diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 504d65e5b..5e4a3dda4 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -9,20 +9,23 @@ default: interruptible: true # download dir publish with tag -download_dir_publish: +download_dir_release: rules: - if: $CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_TAG =~ /^v\d+\.\d+.*$/ extends: - .setup_env - - .sync_download_dir + - .release_download_dir # sdk zip and image publish with tag -release_file_publish: +release_image_publish: rules: - if: $CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_TAG =~ /^v\d+\.\d+.*$/ + parallel: + matrix: + - CONF: [k230_evb_defconfig, k230_canmv_defconfig] extends: - .setup_env - - .sync_release_file + - .sync_release_image # MR merged merge_sync: @@ -110,6 +113,7 @@ build-image: .sync_github_gitee: timeout: 30m + retry: 2 tags: - k230_sdk script: @@ -136,30 +140,47 @@ build-image: - echo "---push to github---" - git push --atomic --tags -u -f github main || git push --atomic --tags -u -f github main || git push --atomic --tags -u -f github main -.sync_download_dir: +.release_download_dir: timeout: 60m + retry: 2 tags: - k230_sdk script: - cd $CI_PROJECT_DIR - ls -alht - - wget -qc https://ai.b-bug.org/k230/test_resources/ci/release/sync_file.sh -O ./sync_file.sh - - chmod +x ./sync_file.sh - - time ./sync_file.sh || time ./sync_file.sh + - wget -qc https://ai.b-bug.org/k230/test_resources/ci/release/release_download_dir.sh -O ./release_download_dir.sh + - chmod +x ./release_download_dir.sh + - time ./release_download_dir.sh || time ./release_download_dir.sh - echo "all file synced" -.sync_release_file: +.sync_release_image: timeout: 60m + retry: 2 tags: - k230_sdk script: - cd $CI_PROJECT_DIR - ls -alht - - wget -qc https://ai.b-bug.org/k230/test_resources/ci/release/sync_release.sh -O ./sync_release.sh - - chmod +x ./sync_release.sh + - wget -qc https://ai.b-bug.org/k230/test_resources/ci/release/release_k230_sdk_image.sh -O ./release_k230_sdk_image.sh + - chmod +x ./release_k230_sdk_image.sh - echo $CI_COMMIT_TAG || exit 1 - echo $CONF || exit 1 - - time ./sync_release.sh $CI_COMMIT_TAG $CONF || time ./sync_release.sh $CI_COMMIT_TAG $CONF + - time ./release_k230_sdk_image.sh $CI_COMMIT_TAG $CONF || time ./release_k230_sdk_image.sh $CI_COMMIT_TAG $CONF + - echo "all release file synced" + +.sync_github_zip: + timeout: 60m + retry: 2 + tags: + - k230_sdk + script: + - cd $CI_PROJECT_DIR + - ls -alht + - wget -qc https://ai.b-bug.org/k230/test_resources/ci/release/release_k230_sdk_github_zip.sh -O ./release_k230_sdk_github_zip.sh + - chmod +x ./release_k230_sdk_github_zip.sh + - echo $CI_COMMIT_TAG || exit 1 + - echo $CONF || exit 1 + - time ./release_k230_sdk_github_zip.sh $CI_COMMIT_TAG || time ./release_k230_sdk_github_zip.sh $CI_COMMIT_TAG - echo "all release file synced" .generate_version: &generate_version diff --git a/Kconfig.board b/Kconfig.board index 1dbcb6a6e..9388c2620 100755 --- a/Kconfig.board +++ b/Kconfig.board @@ -24,10 +24,20 @@ config BOARD_K230_CANMV help "CANMV(K230PI)"; +config BOARD_K230_CANMV_V2 + bool "K230 CANMV(K230PI) V2" + help + "CANMV(K230PI) V2"; + config BOARD_K230D_CANMV bool "K230D CANMV(K230PI zero)" help "CANMV(K230D PI zero)"; + +config BOARD_K230_CANMV_01STUDIO + bool "K230 CANMV(01STUDIO)" + help + "CANMV(01STUDIO)"; endchoice config BOARD_NAME diff --git a/Makefile b/Makefile index a69cb9f61..47906a125 100755 --- a/Makefile +++ b/Makefile @@ -77,7 +77,7 @@ else ifeq ($(CONFIG_SUPPORT_RTSMART),y) all .DEFAULT: check_src prepare_memory mpp rt-smart-apps rt-smart-kernel big-core-opensbi uboot build-image else ifeq ($(CONFIG_SUPPORT_LINUX),y) all .DEFAULT: check_src prepare_memory linux little-core-opensbi buildroot uboot build-image -endif +endif ifeq ($(NATIVE_BUILD),1) .PHONY: download_toolchain @@ -112,8 +112,8 @@ prepare_sourcecode:prepare_toolchain #ai @echo "download nncase sdk" @rm -rf src/big/utils/; rm -rf src/big/ai; - @wget -q --show-progress $(DOWNLOAD_URL)/downloads/kmodel/kmodel_v2.8.0.tgz -O - | tar -xzC src/big/ - @wget -q --show-progress $(DOWNLOAD_URL)/downloads/nncase/nncase_k230_v2.8.0.tgz -O - | tar -xzC src/big/ + @wget -q --show-progress $(DOWNLOAD_URL)/downloads/kmodel/kmodel_v2.8.1.tgz -O - | tar -xzC src/big/ + @wget -q --show-progress $(DOWNLOAD_URL)/downloads/nncase/nncase_k230_v2.8.1.tgz -O - | tar -xzC src/big/ #big utils @echo "download big utils" @@ -142,7 +142,7 @@ prepare_sourcecode:prepare_toolchain #dictionary_pen @if [ "k230_evb_usiplpddr4_dictionary_pen_defconfig" == "$${CONF}" ] ; then \ echo "download dictionary_pen" ; \ - wget -q --show-progress $(DOWNLOAD_URL)/downloads/dictionary_pen/cidianbi_kmodel_v2.8.0.tar.gz -O - | tar -xzC src/reference/business_poc/dictionary_pen_poc/ ; \ + wget -q --show-progress $(DOWNLOAD_URL)/downloads/dictionary_pen/cidianbi_kmodel_v2.8.1.tar.gz -O - | tar -xzC src/reference/business_poc/dictionary_pen_poc/ ; \ cp src/reference/business_poc/dictionary_pen_poc/cidianbi_kmodel/include src/reference/business_poc/dictionary_pen_poc/ -rf ; \ fi; @@ -239,6 +239,22 @@ mpp: mpp-kernel mpp-apps .PHONY: mpp-clean mpp-clean: mpp-kernel-clean mpp-apps-clean +.PHONY: mpp-middleware +mpp-middleware: + @export PATH=$(RTT_EXEC_PATH):$(PATH); \ + export RTSMART_SRC_DIR=$(K230_SDK_ROOT)/$(RT-SMART_SRC_PATH); \ + cd $(MPP_SRC_DIR); \ + make -C middleware || exit $?; \ + cd -; + +.PHONY: mpp-middleware-clean +mpp-middleware-clean: + @export PATH=$(RTT_EXEC_PATH):$(PATH); \ + export RTSMART_SRC_DIR=$(K230_SDK_ROOT)/$(RT-SMART_SRC_PATH); \ + cd $(MPP_SRC_DIR); \ + make clean -C middleware; \ + cd -; + .PHONY: poc poc:check_src @export PATH=$(RTT_EXEC_PATH):$(PATH); \ @@ -247,7 +263,7 @@ poc:check_src mkdir -p build; cd build; cmake ../; \ make && make install; rm ./* -rf; \ cd -; - + @export PATH=$(RTT_EXEC_PATH):$(PATH); \ export RTSMART_SRC_DIR=$(K230_SDK_ROOT)/$(RT-SMART_SRC_PATH); \ cd $(K230_SDK_ROOT)/src/reference/business_poc/doorlock_ov9286/big; \ @@ -255,7 +271,7 @@ poc:check_src make && make install; rm ./* -rf; \ cd -; -.PHONY: peephole +.PHONY: peephole peephole:check_src @export PATH=$(RTT_EXEC_PATH):$(PATH); \ export RTSMART_SRC_DIR=$(K230_SDK_ROOT)/$(RT-SMART_SRC_PATH); \ @@ -264,7 +280,7 @@ peephole:check_src make && make install; rm ./* -rf; \ cd -; -.PHONY: dictionary_pen +.PHONY: dictionary_pen dictionary_pen:check_src @export PATH=$(RTT_EXEC_PATH):$(PATH); \ export RTSMART_SRC_DIR=$(K230_SDK_ROOT)/$(RT-SMART_SRC_PATH); \ @@ -374,6 +390,7 @@ linux-menuconfig: linux-savedefconfig: cd $(LINUX_SRC_PATH); \ make O=$(LINUX_BUILD_DIR) CROSS_COMPILE=$(LINUX_EXEC_PATH)/$(LINUX_CC_PREFIX) ARCH=riscv savedefconfig; \ + cp $(LINUX_BUILD_DIR)/defconfig arch/riscv/configs/$(LINUX_KERNEL_DEFCONFIG);\ cd - .PHONY: linux @@ -397,7 +414,7 @@ big-core-opensbi: rt-smart-kernel export PLATFORM=kendryte/fpgac908; \ make FW_FDT_PATH=hw.dtb FW_PAYLOAD_PATH=rtthread.bin O=$(BIG_OPENSBI_BUILD_DIR) OPENSBI_QUIET=1 || exit $?; \ cd - -rtt_update_romfs: +rtt_update_romfs: @export RTT_CC=$(RTT_CC); \ export RTT_CC_PREFIX=$(RTT_CC_PREFIX); \ export RTT_EXEC_PATH=$(RTT_EXEC_PATH); \ @@ -414,7 +431,7 @@ rtt_update_romfs: export PLATFORM=kendryte/fpgac908; \ $(MAKE) FW_FDT_PATH=hw.dtb FW_PAYLOAD_PATH=rtthread.bin O=$(BIG_OPENSBI_BUILD_DIR) OPENSBI_QUIET=1 || exit $?; \ cd - - + .PHONY: big-core-opensbi-clean big-core-opensbi-clean: rm -rf $(BIG_OPENSBI_BUILD_DIR); \ diff --git a/README.md b/README.md index a57a12173..b130a09e5 100755 --- a/README.md +++ b/README.md @@ -185,9 +185,7 @@ k230_evb_defconfig/images sudo dd if=sysimage-sdcard.img of=/dev/sdx bs=1M oflag=sync ``` -如使用Windows烧录, 建议使用[the balena Etcher](https://etcher.balena.io/)工具(**请在Etcher图标上点击右键,以管理员权限运行,进行烧录**). - -![Etcher](https://github.com/kendryte/k510_docs/raw/v1.5/zh/images/quick_start/balenaetcher.png) +如使用Windows烧录, 建议使用[rufus](http://rufus.ie/downloads/)工具 其它更详细的烧录方法,请参考K230 SDK文档 diff --git a/board/common/env/default.env b/board/common/env/default.env index 1c1ab7c7d..403d8029a 100755 --- a/board/common/env/default.env +++ b/board/common/env/default.env @@ -26,4 +26,5 @@ upspiimg=usb start; dhcp; tftp 0x9000000 10.10.1.94:wjx/sysimage-spinor32m.img; upspiuboot=usb start; dhcp; tftp 0xc100000 10.10.1.94:wjx/u-boot.img && sf probe 0:0;sf erase 0x80000 0x180000; sf update 0x$fileaddr 0x80000 0x$filesize; sf remove; usb_load=usb start; dhcp; tftp $ramdisk_addr jiangxiangbing/rtt_system.bin; k230_boot mem $ramdisk_addr 0x$filesize; tftp $kernel_addr jiangxiangbing/fw_payload.img;tftp $ramdisk_addr jiangxiangbing/rootfs-final.cpio.gz;tftp $dtb_addr jiangxiangbing/k230.dtb vendor=canaan +cdloadadd=0x10000000 quick_boot=false diff --git a/board/common/gen_image_script/gen_image.sh b/board/common/gen_image_script/gen_image.sh index a7b53afd1..316317326 100755 --- a/board/common/gen_image_script/gen_image.sh +++ b/board/common/gen_image_script/gen_image.sh @@ -24,8 +24,8 @@ speckle_data_file="${GENIMAGE_CFG_DIR}/data/speckle.bin" rtapp_data_file="${BUILD_DIR}/images/big-core/fastboot_app.elf" copye_file_to_images; -if [ "${CONFIG_SUPPORT_LINUX}" = "y" ]; then - gen_version; +gen_version; +if [ "${CONFIG_SUPPORT_LINUX}" = "y" ]; then add_dev_firmware; gen_linux_bin; gen_final_ext2; diff --git a/board/common/gen_image_script/gen_image_comm_func.sh b/board/common/gen_image_script/gen_image_comm_func.sh index 5e1fee12d..13979c035 100755 --- a/board/common/gen_image_script/gen_image_comm_func.sh +++ b/board/common/gen_image_script/gen_image_comm_func.sh @@ -87,6 +87,11 @@ gen_version() local ver_file="etc/version/release_version" local post_copy_rootfs_dir="${K230_SDK_ROOT}/board/common/post_copy_rootfs" + local nncase_ver="0.0.0"; + local nncase_ver_file="${K230_SDK_ROOT}/src/big/nncase/riscv64/nncase/include/nncase/version.h" + + cat ${nncase_ver_file} | grep NNCASE_VERSION -w | cut -d\" -f 2 > /dev/null && \ + nncase_ver=$(cat ${nncase_ver_file} | grep NNCASE_VERSION -w | cut -d\" -f 2) cd "${BUILD_DIR}/images/little-core/rootfs" ; @@ -94,7 +99,8 @@ gen_version() set +e; commitid=$(awk -F- '/^[^#]/ { print $6}' ${post_copy_rootfs_dir}/${ver_file});set -e; - set +e; last_tag=$(awk -F- '/^[^#]/ { print $1}' ${post_copy_rootfs_dir}/${ver_file}) ;set -e; + set +e; last_tag=$(awk -F- '/^[^#]/ { print $1}' ${post_copy_rootfs_dir}/${ver_file} | head -1 ) ;set -e; + [ "${commitid}" != "" ] || commitid="unkonwn" @@ -107,6 +113,7 @@ gen_version() ver="${last_tag}-$(date "+%Y%m%d-%H%M%S")-$(whoami)-$(hostname)-${commitid}" echo -e "#############SDK VERSION######################################" >${ver_file} echo -e ${ver} >> ${ver_file} + echo -e "nncase:${nncase_ver}" >> ${ver_file} echo -e "##############################################################" >>${ver_file} echo "build version: ${ver}" diff --git a/board/k230_canmv_dpu_depth_camera/dpu_depth_camera_rcS b/board/k230_canmv_dpu_depth_camera/dpu_depth_camera_rcS new file mode 100755 index 000000000..5f7bf97b6 --- /dev/null +++ b/board/k230_canmv_dpu_depth_camera/dpu_depth_camera_rcS @@ -0,0 +1,52 @@ +#!/bin/sh + + +# Start all init scripts in /etc/init.d +# executing them in numerical order. +# +for i in /etc/init.d/S??* ;do + + # Ignore dangling symlinks (if any). + [ ! -f "$i" ] && continue + + case "$i" in + *.sh) + # Source shell script for speed. + ( + trap - INT QUIT TSTP + set start + . $i + ) + ;; + *) + # No sh extension, so fork subprocess. + $i start + ;; + esac +done +bootddev=$(cat /proc/cmdline | sed -n "s#root=\(\/dev\/mmcblk[0-9]\).*#\1#p" ) +printf "fix\n" | parted ---pretend-input-tty ${bootddev} print >/dev/null 2>&1 + +cat /etc/version/release_version +# if ! `grep mmc /proc/cmdline >/dev/null` ; then +# if `grep mtd5 /proc/mtd >/dev/null`; then +# mount -t jffs2 /dev/mtdblock5 /mnt || (flash_erase /dev/mtd5 0 0; mount -t jffs2 /dev/mtdblock5 /mnt) +# fi; +# fi + +cd /mnt +insmod k_ipcm.ko +mkdir /sharefs -p +if `grep mmcblk0p3 /proc/cmdline >/dev/null` ; then + mount /dev/mmcblk0p4 /sharefs +elif `grep mmcblk1p3 /proc/cmdline >/dev/null` ; then + mount /dev/mmcblk1p4 /sharefs +fi + +./sharefs & +cd - + +cd /mnt +./canaan-camera-dpu.sh start otg0 +./sample_dpu_uvc & +cd - diff --git a/board/k230_canmv_dpu_depth_camera/gen_dpu_depth_camera_device_image_sd.sh b/board/k230_canmv_dpu_depth_camera/gen_dpu_depth_camera_device_image_sd.sh new file mode 100755 index 000000000..5d40d4060 --- /dev/null +++ b/board/k230_canmv_dpu_depth_camera/gen_dpu_depth_camera_device_image_sd.sh @@ -0,0 +1,79 @@ +#!/bin/bash + +source ${K230_SDK_ROOT}/board/common/gen_image_script/gen_image_comm_func.sh + + +env_dir="${K230_SDK_ROOT}/board/common/env" + +GENIMAGE_CFG_DIR="${K230_SDK_ROOT}/board/common/gen_image_cfg" +GENIMAGE_CFG_SD="${GENIMAGE_CFG_DIR}/genimage-sdcard.cfg" +GENIMAGE_CFG_SPI_NOR="${GENIMAGE_CFG_DIR}/genimage-spinor.cfg" +GENIMAGE_CFG_SPI_NAND="${GENIMAGE_CFG_DIR}/genimage-spinand.cfg" +GENIMAGE_CFG_SD_REMOTE="${GENIMAGE_CFG_DIR}/genimage-sdcard_remote.cfg" + +cfg_data_file_path="${GENIMAGE_CFG_DIR}/data" +quick_boot_cfg_data_file="${GENIMAGE_CFG_DIR}/data/quick_boot.bin" +face_database_data_file="${GENIMAGE_CFG_DIR}/data/face_data.bin" +sensor_cfg_data_file="${GENIMAGE_CFG_DIR}/data/sensor_cfg.bin" +ai_mode_data_file="${BUILD_DIR}/images/big-core/ai_mode.bin" #"${GENIMAGE_CFG_DIR}/data/ai_mode.bin" +speckle_data_file="${GENIMAGE_CFG_DIR}/data/speckle.bin" +rtapp_data_file="${BUILD_DIR}/images/big-core/fastboot_app.elf" + + + + +gen_dpu_depth_camera_device_app() +{ + + rm -rf lib/tuning-server; + + cp ${K230_SDK_ROOT}/board/k230_canmv_dpu_depth_camera/dpu_depth_camera_rcS ${BUILD_DIR}/images/little-core/rootfs/etc/init.d/rcS; + + cp ${K230_SDK_ROOT}/src/common/cdk/user/out/big/sample_sys_init.elf ${BUILD_DIR}/images/big-core/root/bin/; + cd ${BUILD_DIR}/images/big-core/root/bin; + echo "cd /bin" > init.sh + echo "sample_sys_init.elf &" >> init.sh + + cd ${RTSMART_SRC_DIR}/userapps/; python3 ../tools/mkromfs.py ${BUILD_DIR}/images/big-core/root/ ${RTSMART_SRC_DIR}/kernel/bsp/maix3/applications/romfs.c; + cd ${K230_SDK_ROOT};make rtt_update_romfs; + + cp ${BUILD_DIR}/big/rt-smart/rtthread.* ${BUILD_DIR}/images/big-core/; +} + +copye_file_to_images; +gen_dpu_depth_camera_device_app; +gen_version; +gen_uboot_bin; +gen_linux_bin; +gen_final_ext2; +gen_rtt_bin; +gen_env_bin; +copy_app; + +if [ "${CONFIG_REMOTE_TEST_PLATFORM}" = "y" ] ; then + gen_image ${GENIMAGE_CFG_SD_REMOTE} sysimage-sdcard.img +else + gen_image ${GENIMAGE_CFG_SD} sysimage-sdcard.img +fi + +if [ "${CONFIG_GEN_SECURITY_IMG}" = "y" ] ; then + gen_image ${GENIMAGE_CFG_SD_AES} sysimage-sdcard_aes.img + gen_image ${GENIMAGE_CFG_SD_SM} sysimage-sdcard_sm.img +fi + +# gen_image_spinor +# gen_image_spinand; + + + +cd ${BUILD_DIR}/images/ +rm -rf sysimage-sdcard_aes.img sysimage-sdcard_sm.img *.vfat + + + + + + + + + diff --git a/configs/k230_canmv_01studio_defconfig b/configs/k230_canmv_01studio_defconfig new file mode 100644 index 000000000..843e146d0 --- /dev/null +++ b/configs/k230_canmv_01studio_defconfig @@ -0,0 +1,63 @@ +# +# Automatically generated file; DO NOT EDIT. +# K230 SDK Configuration +# + +# +# board configuration +# +# CONFIG_BOARD_K230_EVB is not set +# CONFIG_BOARD_K230_FPGA is not set +# CONFIG_BOARD_K230D is not set +# CONFIG_BOARD_K230_CANMV is not set +# CONFIG_BOARD_K230D_CANMV is not set +CONFIG_BOARD_K230_CANMV_01STUDIO=y +CONFIG_BOARD_NAME="k230_evb" +# CONFIG_QUICK_BOOT is not set +# CONFIG_GEN_SECURITY_IMG is not set +CONFIG_UBOOT_DEFCONFIG="k230_canmv_01studio" +CONFIG_LINUX_DEFCONFIG="k230_canmv_01studio" +CONFIG_LINUX_DTB="k230_canmv_01studio" +# CONFIG_REMOTE_TEST_PLATFORM is not set +CONFIG_GEN_IMG_SCRIPT="board/common/gen_image_script/gen_image.sh" +CONFIG_RTT_CONSOLE_ID=3 + +# +# toolchain configurations +# +CONFIG_TOOLCHAIN_PREFIX_RTT="riscv64-unknown-linux-musl-" +CONFIG_TOOLCHAIN_PATH_RTT="/opt/toolchain/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu/bin" +CONFIG_TOOLCHAIN_PREFIX_LINUX="riscv64-unknown-linux-gnu-" +CONFIG_TOOLCHAIN_PATH_LINUX="/opt/toolchain/Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.6.0/bin" + +# +# Memory configuration +# +CONFIG_MEM_TOTAL_SIZE=0x20000000 +CONFIG_MEM_IPCM_BASE=0x00100000 +CONFIG_MEM_IPCM_SIZE=0x00100000 +CONFIG_MEM_RTT_SYS_BASE=0x00200000 +CONFIG_MEM_RTT_SYS_SIZE=0x07E00000 +CONFIG_MEM_MMZ_BASE=0x10000000 +CONFIG_MEM_MMZ_SIZE=0x0FC00000 +CONFIG_MEM_LINUX_SYS_BASE=0x08000000 +CONFIG_MEM_LINUX_SYS_SIZE=0x08000000 +CONFIG_MEM_BOUNDARY_RESERVED_SIZE=0x00001000 + +# +# storage configurations +# +# CONFIG_SPI_NOR is not set +# CONFIG_SPI_NAND is not set +CONFIG_SDCAED=y + +# +# wifi configurations +# +# CONFIG_AP6212A is not set +# CONFIG_AP6256 is not set +CONFIG_SUPPORT_RTSMART=y +CONFIG_SUPPORT_LINUX=y +CONFIG_LINUX_RUN_CORE_ID=0 +# CONFIG_BUILD_DEBUG_VER is not set +CONFIG_BUILD_RELEASE_VER=y diff --git a/configs/k230_canmv_dpu_depth_camera_defconfig b/configs/k230_canmv_dpu_depth_camera_defconfig new file mode 100644 index 000000000..05a5fb8c0 --- /dev/null +++ b/configs/k230_canmv_dpu_depth_camera_defconfig @@ -0,0 +1,61 @@ +# +# Automatically generated file; DO NOT EDIT. +# K230 SDK Configuration +# + +# +# board configuration +# +# CONFIG_BOARD_K230_EVB is not set +# CONFIG_BOARD_K230_FPGA is not set +# CONFIG_BOARD_K230D is not set +CONFIG_BOARD_K230_CANMV=y +CONFIG_BOARD_NAME="k230_evb" +# CONFIG_QUICK_BOOT is not set +# CONFIG_GEN_SECURITY_IMG is not set +CONFIG_UBOOT_DEFCONFIG="k230_canmv" +CONFIG_LINUX_DEFCONFIG="k230_canmv" +CONFIG_LINUX_DTB="k230_canmv" +# CONFIG_REMOTE_TEST_PLATFORM is not set +CONFIG_GEN_IMG_SCRIPT="board/k230_canmv_dpu_depth_camera/gen_dpu_depth_camera_device_image_sd.sh" +CONFIG_RTT_CONSOLE_ID=3 + +# +# toolchain configurations +# +CONFIG_TOOLCHAIN_PREFIX_RTT="riscv64-unknown-linux-musl-" +CONFIG_TOOLCHAIN_PATH_RTT="/opt/toolchain/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu/bin" +CONFIG_TOOLCHAIN_PREFIX_LINUX="riscv64-unknown-linux-gnu-" +CONFIG_TOOLCHAIN_PATH_LINUX="/opt/toolchain/Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.6.0/bin" + +# +# Memory configuration +# +CONFIG_MEM_TOTAL_SIZE=0x20000000 +CONFIG_MEM_IPCM_BASE=0x00100000 +CONFIG_MEM_IPCM_SIZE=0x00100000 +CONFIG_MEM_RTT_SYS_BASE=0x00200000 +CONFIG_MEM_RTT_SYS_SIZE=0x07E00000 +CONFIG_MEM_MMZ_BASE=0x10000000 +CONFIG_MEM_MMZ_SIZE=0x0FC00000 +CONFIG_MEM_LINUX_SYS_BASE=0x08000000 +CONFIG_MEM_LINUX_SYS_SIZE=0x08000000 +CONFIG_MEM_BOUNDARY_RESERVED_SIZE=0x00001000 + +# +# storage configurations +# +# CONFIG_SPI_NOR is not set +# CONFIG_SPI_NAND is not set +CONFIG_SDCAED=y + +# +# wifi configurations +# +CONFIG_AP6212A=y +# CONFIG_AP6256 is not set +CONFIG_SUPPORT_RTSMART=y +CONFIG_SUPPORT_LINUX=y +CONFIG_LINUX_RUN_CORE_ID=0 +# CONFIG_BUILD_DEBUG_VER is not set +CONFIG_BUILD_RELEASE_VER=y diff --git a/configs/k230_canmv_only_rtt_defconfig b/configs/k230_canmv_only_rtt_defconfig old mode 100644 new mode 100755 index f2c3994ec..8962eb2f2 --- a/configs/k230_canmv_only_rtt_defconfig +++ b/configs/k230_canmv_only_rtt_defconfig @@ -28,17 +28,18 @@ CONFIG_TOOLCHAIN_PATH_RTT="/opt/toolchain/riscv64-linux-musleabi_for_x86_64-pc-l CONFIG_TOOLCHAIN_PREFIX_LINUX="riscv64-unknown-linux-gnu-" CONFIG_TOOLCHAIN_PATH_LINUX="/opt/toolchain/Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.6.0/bin" + # # Memory configuration # CONFIG_MEM_TOTAL_SIZE=0x20000000 -CONFIG_MEM_IPCM_BASE=0x00100000 -CONFIG_MEM_IPCM_SIZE=0x00100000 -CONFIG_MEM_RTT_SYS_BASE=0x00200000 -CONFIG_MEM_RTT_SYS_SIZE=0x0fe00000 +CONFIG_MEM_IPCM_BASE=0x0 +CONFIG_MEM_IPCM_SIZE=0x0 +CONFIG_MEM_RTT_SYS_BASE=0x0 +CONFIG_MEM_RTT_SYS_SIZE=0x10000000 CONFIG_MEM_MMZ_BASE=0x10000000 -CONFIG_MEM_MMZ_SIZE=0x0FC00000 -CONFIG_MEM_BOUNDARY_RESERVED_SIZE=0x00001000 +CONFIG_MEM_MMZ_SIZE=0x10000000 +CONFIG_MEM_BOUNDARY_RESERVED_SIZE=0x8 # # storage configurations @@ -48,14 +49,10 @@ CONFIG_MEM_BOUNDARY_RESERVED_SIZE=0x00001000 CONFIG_SDCAED=y # -# spi nor partion config +# wifi configurations # -CONFIG_SPI_NOR_RTTK_BASE=0x840000 -CONFIG_SPI_NOR_RTTK_SIZE=0x1c0000 -CONFIG_SPI_NOR_LK_BASE=0xfc0000 -CONFIG_SPI_NOR_LK_SIZE=0x700000 -CONFIG_SPI_NOR_LR_BASE=0x16c0000 -CONFIG_SPI_NOR_LR_SIZE=0x900000 +# CONFIG_AP6212A is not set +# CONFIG_AP6256 is not set CONFIG_SUPPORT_RTSMART=y # CONFIG_SUPPORT_LINUX is not set CONFIG_BUILD_DEBUG_VER=y diff --git a/configs/k230_canmv_v2_defconfig b/configs/k230_canmv_v2_defconfig new file mode 100644 index 000000000..0c12de6aa --- /dev/null +++ b/configs/k230_canmv_v2_defconfig @@ -0,0 +1,64 @@ +# +# Automatically generated file; DO NOT EDIT. +# K230 SDK Configuration +# + +# +# board configuration +# +# CONFIG_BOARD_K230_EVB is not set +# CONFIG_BOARD_K230_FPGA is not set +# CONFIG_BOARD_K230D is not set +# CONFIG_BOARD_K230_CANMV is not set +CONFIG_BOARD_K230_CANMV_V2=y +# CONFIG_BOARD_K230D_CANMV is not set +# CONFIG_BOARD_K230_CANMV_01STUDIO is not set +CONFIG_BOARD_NAME="k230_evb" +# CONFIG_QUICK_BOOT is not set +# CONFIG_GEN_SECURITY_IMG is not set +CONFIG_UBOOT_DEFCONFIG="k230_canmv_v2" +CONFIG_LINUX_DEFCONFIG="k230_canmv_v2" +CONFIG_LINUX_DTB="k230_canmv_v2" +# CONFIG_REMOTE_TEST_PLATFORM is not set +CONFIG_GEN_IMG_SCRIPT="board/common/gen_image_script/gen_image.sh" +CONFIG_RTT_CONSOLE_ID=3 + +# +# toolchain configurations +# +CONFIG_TOOLCHAIN_PREFIX_RTT="riscv64-unknown-linux-musl-" +CONFIG_TOOLCHAIN_PATH_RTT="/opt/toolchain/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu/bin" +CONFIG_TOOLCHAIN_PREFIX_LINUX="riscv64-unknown-linux-gnu-" +CONFIG_TOOLCHAIN_PATH_LINUX="/opt/toolchain/Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.6.0/bin" + +# +# Memory configuration +# +CONFIG_MEM_TOTAL_SIZE=0x20000000 +CONFIG_MEM_IPCM_BASE=0x00100000 +CONFIG_MEM_IPCM_SIZE=0x00100000 +CONFIG_MEM_RTT_SYS_BASE=0x00200000 +CONFIG_MEM_RTT_SYS_SIZE=0x07E00000 +CONFIG_MEM_MMZ_BASE=0x10000000 +CONFIG_MEM_MMZ_SIZE=0x0FC00000 +CONFIG_MEM_LINUX_SYS_BASE=0x08000000 +CONFIG_MEM_LINUX_SYS_SIZE=0x08000000 +CONFIG_MEM_BOUNDARY_RESERVED_SIZE=0x00001000 + +# +# storage configurations +# +# CONFIG_SPI_NOR is not set +# CONFIG_SPI_NAND is not set +CONFIG_SDCAED=y + +# +# wifi configurations +# +# CONFIG_AP6212A is not set +# CONFIG_AP6256 is not set +CONFIG_SUPPORT_RTSMART=y +CONFIG_SUPPORT_LINUX=y +CONFIG_LINUX_RUN_CORE_ID=0 +# CONFIG_BUILD_DEBUG_VER is not set +CONFIG_BUILD_RELEASE_VER=y diff --git a/configs/k230_canmv_v2_only_rtt_defconfig b/configs/k230_canmv_v2_only_rtt_defconfig new file mode 100755 index 000000000..f33bd0eab --- /dev/null +++ b/configs/k230_canmv_v2_only_rtt_defconfig @@ -0,0 +1,62 @@ +# +# Automatically generated file; DO NOT EDIT. +# K230 SDK Configuration +# + +# +# board configuration +# +# CONFIG_BOARD_K230_EVB is not set +# CONFIG_BOARD_K230_FPGA is not set +# CONFIG_BOARD_K230D is not set +# CONFIG_BOARD_K230_CANMV is not set +CONFIG_BOARD_K230_CANMV_V2=y +# CONFIG_BOARD_K230D_CANMV is not set +# CONFIG_BOARD_K230_CANMV_01STUDIO is not set +CONFIG_BOARD_NAME="k230_evb" +# CONFIG_QUICK_BOOT is not set +# CONFIG_GEN_SECURITY_IMG is not set +CONFIG_UBOOT_DEFCONFIG="k230_canmv_v2" +CONFIG_LINUX_DEFCONFIG="k230_canmv_v2" +CONFIG_LINUX_DTB="k230_canmv_v2" +# CONFIG_REMOTE_TEST_PLATFORM is not set +CONFIG_GEN_IMG_SCRIPT="board/common/gen_image_script/gen_image.sh" +CONFIG_RTT_CONSOLE_ID=0 + +# +# toolchain configurations +# +CONFIG_TOOLCHAIN_PREFIX_RTT="riscv64-unknown-linux-musl-" +CONFIG_TOOLCHAIN_PATH_RTT="/opt/toolchain/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu/bin" +CONFIG_TOOLCHAIN_PREFIX_LINUX="riscv64-unknown-linux-gnu-" +CONFIG_TOOLCHAIN_PATH_LINUX="/opt/toolchain/Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.6.0/bin" + +# +# Memory configuration +# +CONFIG_MEM_TOTAL_SIZE=0x20000000 +CONFIG_MEM_IPCM_BASE=0x0 +CONFIG_MEM_IPCM_SIZE=0x0 +CONFIG_MEM_RTT_SYS_BASE=0x0 +CONFIG_MEM_RTT_SYS_SIZE=0x10000000 +CONFIG_MEM_MMZ_BASE=0x10000000 +CONFIG_MEM_MMZ_SIZE=0x10000000 +CONFIG_MEM_BOUNDARY_RESERVED_SIZE=0x8 + +# +# storage configurations +# +# CONFIG_SPI_NOR is not set +# CONFIG_SPI_NAND is not set +CONFIG_SDCAED=y + +# +# wifi configurations +# +# CONFIG_AP6212A is not set +# CONFIG_AP6256 is not set +CONFIG_SUPPORT_RTSMART=y +# CONFIG_SUPPORT_LINUX is not set +CONFIG_BUILD_DEBUG_VER=y +# CONFIG_BUILD_RELEASE_VER is not set +CONFIG_DBGLV=8 diff --git a/configs/k230d_canmv_only_rtt_defconfig b/configs/k230d_canmv_only_rtt_defconfig new file mode 100755 index 000000000..d569c0f73 --- /dev/null +++ b/configs/k230d_canmv_only_rtt_defconfig @@ -0,0 +1,60 @@ +# +# Automatically generated file; DO NOT EDIT. +# K230 SDK Configuration +# + +# +# board configuration +# +# CONFIG_BOARD_K230_EVB is not set +# CONFIG_BOARD_K230_FPGA is not set +# CONFIG_BOARD_K230D is not set +# CONFIG_BOARD_K230_CANMV is not set +CONFIG_BOARD_K230D_CANMV=y +CONFIG_BOARD_NAME="k230d_canmv" +# CONFIG_QUICK_BOOT is not set +# CONFIG_GEN_SECURITY_IMG is not set +CONFIG_UBOOT_DEFCONFIG="k230d_canmv" +CONFIG_LINUX_DEFCONFIG="k230d_canmv" +CONFIG_LINUX_DTB="k230d_canmv" +# CONFIG_REMOTE_TEST_PLATFORM is not set +CONFIG_GEN_IMG_SCRIPT="board/common/gen_image_script/gen_image.sh" +CONFIG_RTT_CONSOLE_ID=0 + +# +# toolchain configurations +# +CONFIG_TOOLCHAIN_PREFIX_RTT="riscv64-unknown-linux-musl-" +CONFIG_TOOLCHAIN_PATH_RTT="/opt/toolchain/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu/bin" +CONFIG_TOOLCHAIN_PREFIX_LINUX="riscv64-unknown-linux-gnu-" +CONFIG_TOOLCHAIN_PATH_LINUX="/opt/toolchain/Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.6.0/bin" + +# +# Memory configuration +# +CONFIG_MEM_TOTAL_SIZE=0x8000000 +CONFIG_MEM_IPCM_BASE=0x0 +CONFIG_MEM_IPCM_SIZE=0x0 +CONFIG_MEM_RTT_SYS_BASE=0x0 +CONFIG_MEM_RTT_SYS_SIZE=0x3000000 +CONFIG_MEM_MMZ_BASE=0x3000000 +CONFIG_MEM_MMZ_SIZE=0x5000000 +CONFIG_MEM_BOUNDARY_RESERVED_SIZE=0x8 + +# +# storage configurations +# +# CONFIG_SPI_NOR is not set +# CONFIG_SPI_NAND is not set +CONFIG_SDCAED=y + +# +# wifi configurations +# +# CONFIG_AP6212A is not set +# CONFIG_AP6256 is not set +CONFIG_SUPPORT_RTSMART=y +# CONFIG_SUPPORT_LINUX is not set +CONFIG_BUILD_DEBUG_VER=y +# CONFIG_BUILD_RELEASE_VER is not set +CONFIG_DBGLV=8 diff --git a/repo.mak b/repo.mak index 84f4a2f2d..b83925b5e 100755 --- a/repo.mak +++ b/repo.mak @@ -1,11 +1,11 @@ -RT-SMART_VERSION = "1a25d7e49da28ef7f06334f3344c8587768ef1d4" -MPP_VERSION = "7b75e867ab4c940d5ee553a67ee4a4c59c90701a" +RT-SMART_VERSION = "66ebe23e44fbbdf1681b18dfb187af1353d10adb" +MPP_VERSION = "cad767e0d43e2979bb460f7e9a63a02e75ce4b79" UNITTEST_VERSION = "a07caf5e19a6a215605271cfeedce18111790e9d" -OPENSBI_VERSION = "b3a7a73c46a39e3e07209462b5c22d936b0fddca" -BUILDROOT-EXT_VERSION = "a8dc2e9b4c47656db8c97307472c0763d598aba4" -LINUX_VERSION = "fb13e7f92a34deb39b3578be341a5b11c5a4a2fb" -UBOOT_VERSION = "faf1a8311cf4559fa8ffb166ba14099ee47bbae9" -CDK_VERSION = "5ce32d38813e34c6cb97d0966d6999c210881464" +OPENSBI_VERSION = "1f89326f7dc48d701dbed79f828b80fa28e5b34c" +BUILDROOT-EXT_VERSION = "1c97b30a3366f836f83eba20b8db76713055bfd3" +LINUX_VERSION = "e3fb062a4f21db9012b4ac05208d1c7fd15a547f" +CDK_VERSION = "786d3c8ca5bdbcd1ad5a623635f0139e94ff1089" +UBOOT_VERSION = "847dc0b16a8229a55b5c04449f16a48464ef0a5b" RT-SMART_SRC_PATH = src/big/rt-smart MPP_SRC_PATH = src/big/mpp diff --git a/src/big/mpp/include/comm/k_board_config_comm.h b/src/big/mpp/include/comm/k_board_config_comm.h index aa2589f27..fed146647 100755 --- a/src/big/mpp/include/comm/k_board_config_comm.h +++ b/src/big/mpp/include/comm/k_board_config_comm.h @@ -54,6 +54,16 @@ extern "C" { #define VICAP_OV9286_RST_GPIO 35 #define OV5647_IIC "i2c1" #define OV5647_CAM_PIN 20 +#define OV5647_CAM_PIN_CSI2 (24) +#define OV5647_CAM_PIN_CSI1 (23) + +#define OV5647_CSI2_IIC "i2c1" +#define OV5647_CSI1_IIC "i2c0" +#define OV9732_RST_PIN (28) + +#define LT9611_RESET_GPIO 42 +#define LT9611_SLAVE_ADDR 0x3b +#define LT9611_I2C_BUS "i2c4" #elif defined(CONFIG_BOARD_K230_EVB) // usip evb gpio config @@ -68,6 +78,16 @@ extern "C" { #define VICAP_OV9286_RST_GPIO 49 #define OV5647_IIC "i2c1" #define OV5647_CAM_PIN 20 +#define OV5647_CAM_PIN_CSI2 (24) +#define OV5647_CAM_PIN_CSI1 (23) + +#define OV5647_CSI2_IIC "i2c1" +#define OV5647_CSI1_IIC "i2c0" +#define OV9732_RST_PIN (28) + +#define LT9611_RESET_GPIO 42 +#define LT9611_SLAVE_ADDR 0x3b +#define LT9611_I2C_BUS "i2c4" #elif defined(CONFIG_BOARD_K230_CANMV) // usip evb gpio config @@ -79,9 +99,19 @@ extern "C" { #define VICAP_IMX335_RST_GPIO 46 #define VICAP_IMX335_MASTER_GPIO 28 //OV9286 gpio cinfig -#define VICAP_OV9286_RST_GPIO 49 +#define VICAP_OV9286_RST_GPIO 23 #define OV5647_IIC "i2c3" #define OV5647_CAM_PIN 0 +#define OV5647_CAM_PIN_CSI2 (24) +#define OV5647_CAM_PIN_CSI1 (23) + +#define OV5647_CSI2_IIC "i2c1" +#define OV5647_CSI1_IIC "i2c0" +#define OV9732_RST_PIN (24) + +#define LT9611_RESET_GPIO 42 +#define LT9611_SLAVE_ADDR 0x3b +#define LT9611_I2C_BUS "i2c4" #elif defined(CONFIG_BOARD_K230D_CANMV) // usip evb gpio config @@ -96,6 +126,67 @@ extern "C" { #define VICAP_OV9286_RST_GPIO 20 #define OV5647_IIC "i2c4" #define OV5647_CAM_PIN 20 +#define OV5647_CAM_PIN_CSI2 (24) +#define OV5647_CAM_PIN_CSI1 (23) +#define OV9732_RST_PIN (24) + +#define OV5647_CSI2_IIC "i2c1" +#define OV5647_CSI1_IIC "i2c0" + +#define LT9611_RESET_GPIO 42 +#define LT9611_SLAVE_ADDR 0x3b +#define LT9611_I2C_BUS "i2c4" + +#elif defined(CONFIG_BOARD_K230_CANMV_01STUDIO) +// usip evb gpio config +// display gpio +#define DISPLAY_LCD_RST_GPIO 24 +#define DISPLAY_LCD_BACKLIGHT_EN 25 + +// imx335 gpio config +#define VICAP_IMX335_RST_GPIO 46 +#define VICAP_IMX335_MASTER_GPIO 28 +//OV9286 gpio cinfig +#define VICAP_OV9286_RST_GPIO 20 +#define OV5647_CSI2_IIC "i2c4" +#define OV5647_CSI1_IIC "i2c1" +#define OV5647_IIC "i2c0" +#define OV5647_CAM_PIN 45 +#define OV5647_CAM_PIN_CSI2 (62) +#define OV5647_CAM_PIN_CSI1 (10) +#define OV9732_RST_PIN (28) + + +#define LT9611_RESET_GPIO 22 +#define LT9611_SLAVE_ADDR 0x3b +#define LT9611_I2C_BUS "i2c3" + +#elif defined(CONFIG_BOARD_K230_CANMV_V2) +// usip evb gpio config +// display gpio +#define DISPLAY_LCD_RST_GPIO 22 +#define DISPLAY_LCD_BACKLIGHT_EN 25 + +// imx335 gpio config +#define VICAP_IMX335_RST_GPIO 46 +#define VICAP_IMX335_MASTER_GPIO 28 +//OV9286 gpio cinfig +#define VICAP_OV9286_RST_GPIO 20 + +#define OV5647_IIC "i2c0" +#define OV5647_CAM_PIN 61 + +#define OV5647_CSI1_IIC "i2c1" +#define OV5647_CSI2_IIC "i2c4" + +#define OV5647_CAM_PIN_CSI2 (21) +#define OV5647_CAM_PIN_CSI1 (60) + +#define OV9732_RST_PIN (28) + +#define LT9611_RESET_GPIO 24 //42 +#define LT9611_SLAVE_ADDR 0x3b +#define LT9611_I2C_BUS "i2c3"//"i2c4" #else @@ -109,6 +200,16 @@ extern "C" { #define VICAP_OV9286_RST_GPIO 49 #define OV5647_IIC "i2c1" #define OV5647_CAM_PIN 20 +#define OV5647_CSI2_IIC "i2c1" +#define OV5647_CSI1_IIC "i2c0" +#define OV5647_CAM_PIN_CSI2 (24) +#define OV5647_CAM_PIN_CSI1 (23) +#define OV9732_RST_PIN (24) + +#define LT9611_RESET_GPIO 42 +#define LT9611_SLAVE_ADDR 0x3b +#define LT9611_I2C_BUS "i2c4" + #endif #ifdef __cplusplus diff --git a/src/big/mpp/include/comm/k_connector_comm.h b/src/big/mpp/include/comm/k_connector_comm.h index 33164c97b..16d6fa14c 100755 --- a/src/big/mpp/include/comm/k_connector_comm.h +++ b/src/big/mpp/include/comm/k_connector_comm.h @@ -1,111 +1,113 @@ -/** - * @file k_sensor_comm.h - * @author - * @sxp - * @version 1.0 - * @date 2023-03-20 - * - * @copyright - * Copyright (c) 2023, Canaan Bright Sight Co., Ltd - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -#ifndef __K_CONNECTOR_COMM_H__ -#define __K_CONNECTOR_COMM_H__ - -#include "k_type.h" -#include "k_errno.h" -#include "k_module.h" -#include "k_vo_comm.h" - -#ifdef __cplusplus -extern "C" { -#endif /* End of #ifdef __cplusplus */ - -#define CONNECTOR_NUM_MAX 128 - - -#define BACKGROUND_BLACK_COLOR (0x808000) -#define BACKGROUND_PINK_COLOR (0xffffff) - - -typedef enum { - HX8377_V2_MIPI_4LAN_1080X1920_30FPS = 0, - LT9611_MIPI_4LAN_1920X1080_30FPS = 1, - ST7701_V1_MIPI_2LAN_480X800_30FPS = 2, - ST7701_V1_MIPI_2LAN_480X854_30FPS = 3, - LT9611_MIPI_ADAPT_RESOLUTION = 100, - LT9611_MIPI_4LAN_1920X1080_60FPS, - LT9611_MIPI_4LAN_1920X1080_50FPS, - LT9611_MIPI_4LAN_1920X1080_25FPS, - LT9611_MIPI_4LAN_1920X1080_24FPS, - LT9611_MIPI_4LAN_1280X720_60FPS, - LT9611_MIPI_4LAN_1280X720_50FPS, - LT9611_MIPI_4LAN_640X480_60FPS, -} k_connector_type; - -typedef struct -{ - k_u32 n; - k_u32 m; - k_u32 voc; - k_u32 hs_freq; -} k_connectori_phy_attr; - - -typedef struct { - const char *connector_name; - k_u32 screen_test_mode; - k_u32 dsi_test_mode; - k_u32 bg_color; - k_u32 intr_line; - k_u32 pixclk_div; - k_dsi_lan_num lan_num; - k_dsi_work_mode work_mode; - k_vo_dsi_cmd_mode cmd_mode; - k_connectori_phy_attr phy_attr; - k_vo_display_resolution resolution; - k_connector_type type; -} k_connector_info; - -typedef enum -{ - K_CONNECTOR_MIRROR_HOR = 1, - K_CONNECTOR_MIRROR_VER, - K_CONNECTOR_MIRROR_BOTH, -}k_connector_mirror; - - -typedef struct -{ - k_u32 connection_status; - k_u32 negotiated_count; - k_connector_type negotiated_types[256]; -} k_connector_negotiated_data; - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif +/** + * @file k_sensor_comm.h + * @author + * @sxp + * @version 1.0 + * @date 2023-03-20 + * + * @copyright + * Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef __K_CONNECTOR_COMM_H__ +#define __K_CONNECTOR_COMM_H__ + +#include "k_type.h" +#include "k_errno.h" +#include "k_module.h" +#include "k_vo_comm.h" + +#ifdef __cplusplus +extern "C" { +#endif /* End of #ifdef __cplusplus */ + +#define CONNECTOR_NUM_MAX 128 + + +#define BACKGROUND_BLACK_COLOR (0x808000) +#define BACKGROUND_PINK_COLOR (0xffffff) + + +typedef enum { + HX8377_V2_MIPI_4LAN_1080X1920_30FPS = 0, + LT9611_MIPI_4LAN_1920X1080_30FPS = 1, + ST7701_V1_MIPI_2LAN_480X800_30FPS = 2, + ST7701_V1_MIPI_2LAN_480X854_30FPS = 3, + LT9611_MIPI_ADAPT_RESOLUTION = 100, + LT9611_MIPI_4LAN_1920X1080_60FPS, + LT9611_MIPI_4LAN_1920X1080_50FPS, + LT9611_MIPI_4LAN_1920X1080_25FPS, + LT9611_MIPI_4LAN_1920X1080_24FPS, + LT9611_MIPI_4LAN_1280X720_60FPS = 110, + LT9611_MIPI_4LAN_1280X720_50FPS, + LT9611_MIPI_4LAN_1280X720_30FPS, + LT9611_MIPI_4LAN_640X480_60FPS = 120, + OTHER_MIPI_4LAN_320X240_60FPS = 200, +} k_connector_type; + +typedef struct +{ + k_u32 n; + k_u32 m; + k_u32 voc; + k_u32 hs_freq; +} k_connectori_phy_attr; + + +typedef struct { + const char *connector_name; + k_u32 screen_test_mode; + k_u32 dsi_test_mode; + k_u32 bg_color; + k_u32 intr_line; + k_u32 pixclk_div; + k_dsi_lan_num lan_num; + k_dsi_work_mode work_mode; + k_vo_dsi_cmd_mode cmd_mode; + k_connectori_phy_attr phy_attr; + k_vo_display_resolution resolution; + k_connector_type type; +} k_connector_info; + +typedef enum +{ + K_CONNECTOR_MIRROR_HOR = 1, + K_CONNECTOR_MIRROR_VER, + K_CONNECTOR_MIRROR_BOTH, +}k_connector_mirror; + + +typedef struct +{ + k_u32 connection_status; + k_u32 negotiated_count; + k_connector_type negotiated_types[256]; +} k_connector_negotiated_data; + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif diff --git a/src/big/mpp/include/comm/k_sensor_comm.h b/src/big/mpp/include/comm/k_sensor_comm.h index 82bb4949c..bdeee065e 100755 --- a/src/big/mpp/include/comm/k_sensor_comm.h +++ b/src/big/mpp/include/comm/k_sensor_comm.h @@ -41,7 +41,7 @@ extern "C" { #endif /* End of #ifdef __cplusplus */ -#define SENSOR_NUM_MAX 12 +#define SENSOR_NUM_MAX 13 #define REG_NULL 0xFFFF @@ -105,6 +105,16 @@ typedef enum { XS9950_MIPI_CSI2_1280X720_30FPS_YUV422 = 32, XS9950_MIPI_CSI0_1920X1080_30FPS_YUV422 = 33, + OV_OV9286_MIPI_1280X720_30FPS_10BIT_MCLK_25M_LINEAR_SPECKLE_V2 = 34, + OV_OV9286_MIPI_1280X720_30FPS_10BIT_MCLK_25M_LINEAR_IR_V2 = 35, + OV_OV9732_MIPI_1280X720_30FPS_10BIT_MCLK_16M_LINEAR_V2 = 36, + + OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR_V2 = 37, + OV_OV5647_MIPI_CSI1_1920X1080_30FPS_10BIT_LINEAR_V2 = 38, + OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2 = 39, + + GC2053_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR = 40, + SENSOR_TYPE_MAX, } k_vicap_sensor_type; diff --git a/src/big/mpp/kernel/connector/src/lt9611.c b/src/big/mpp/kernel/connector/src/lt9611.c index 1ac4a2bbf..d1487bdd5 100755 --- a/src/big/mpp/kernel/connector/src/lt9611.c +++ b/src/big/mpp/kernel/connector/src/lt9611.c @@ -1,821 +1,807 @@ -/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include - -#include "connector_dev.h" -#include "io.h" -#include "drv_gpio.h" -#include "k_vo_comm.h" -#include "k_connector_comm.h" -#include "k_board_config_comm.h" - -#define LT9611_RESET_GPIO 42 -#define LT9611_SLAVE_ADDR 0x3b -#define LT9611_I2C_BUS "i2c4" - -#ifndef ARRAY_SIZE -#define ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0])) -#endif - -typedef struct { - k_u8 addr; - k_u8 val; -} k_i2c_reg; - -typedef struct { - k_u16 slave_addr; - const char *i2c_name; - struct rt_i2c_bus_device *i2c_bus; -} k_i2c_info; - -struct lt9611_dev { -#define LT9611_PORTA 100600 -#define LT9611_PORTB 100601 - k_u32 input_port; - k_u32 pcr_m; - k_i2c_info i2c_info; -}; - -struct lt9611_resolution { - k_u8 std_timing_high; - k_u8 std_timing_low; - k_u8 cea861_vic; - k_u32 connector_type; -}; - -#define LT9611_RESOLUTION_NUM 2 -struct lt9611_resolution lt9611_resolution[LT9611_RESOLUTION_NUM] = { - {0xd1, 0xc0, 16, LT9611_MIPI_4LAN_1920X1080_60FPS}, - {0x00, 0x00, 34, LT9611_MIPI_4LAN_1920X1080_30FPS}, - //{0x81, 0xc0, 4, LT9611_MIPI_4LAN_1280X720_60FPS}, - //{0x00, 0x00, 19, LT9611_MIPI_4LAN_1280X720_50FPS}, - //{0x00, 0x00, 1, LT9611_MIPI_4LAN_640X480_60FPS}, -}; - -static void connector_set_drvdata(struct connector_driver_dev *dev, void *data) -{ - dev->driver_data = data; -} - -static void *connector_get_drvdata(struct connector_driver_dev *dev) -{ - return dev->driver_data; -} - -k_s32 lt9611_read_reg(k_i2c_info *i2c_info, k_u8 reg_addr, k_u8 *reg_val) -{ - struct rt_i2c_msg msg[2]; - - RT_ASSERT(i2c_info != RT_NULL); - msg[0].addr = i2c_info->slave_addr; - msg[0].flags = RT_I2C_WR; - msg[0].len = 1; - msg[0].buf = ®_addr; - - msg[1].addr = i2c_info->slave_addr; - msg[1].flags = RT_I2C_RD; - msg[1].len = 1; - msg[1].buf = reg_val; - - if (rt_i2c_transfer(i2c_info->i2c_bus, msg, 2) != 2) - { - return RT_ERROR; - } - // i2c debug info - //rt_kprintf("I2C READ slave_addr %02x reg_addr %02x reg_val %02x\n", i2c_info->slave_addr, reg_addr, *reg_val); - - return RT_EOK; -} - -k_s32 lt9611_write_reg(k_i2c_info *i2c_info, k_u8 reg_addr, k_u8 reg_val) -{ - struct rt_i2c_msg msg; - k_u8 buf[2]; - - RT_ASSERT(i2c_info != RT_NULL); - buf[0] = reg_addr; - buf[1] = reg_val; - msg.addr = i2c_info->slave_addr; - msg.flags = RT_I2C_WR; - msg.len = 2; - msg.buf = buf; - - if (rt_i2c_transfer(i2c_info->i2c_bus, &msg, 1) != 1) - { - return RT_ERROR; - } - // i2c debug info - //rt_kprintf("I2C WRITE slave_addr %02x reg_addr %02x reg_val %02x\n", i2c_info->slave_addr, reg_addr, reg_val); - - return RT_EOK; -} - -k_s32 lt9611_write_multi_reg(k_i2c_info *i2c_info, const k_i2c_reg *reg_list, k_u32 reg_num) -{ - k_s32 ret = 0; - k_u32 i; - - for (i = 0; i < reg_num; i++) - { - ret = lt9611_write_reg(i2c_info, reg_list[i].addr, reg_list[i].val); - if (ret) - { - return RT_ERROR; - } - } - - return ret; -} - -static void lt9611_reset(k_u8 lt9611_reset_pin) -{ - kd_pin_mode(lt9611_reset_pin, GPIO_DM_OUTPUT); - kd_pin_write(lt9611_reset_pin, GPIO_PV_LOW); - rt_thread_mdelay(100); - - kd_pin_write(lt9611_reset_pin, GPIO_PV_HIGH); - rt_thread_mdelay(100); -} - -static k_s32 lt9611_set_interface(struct lt9611_dev *lt9611_dev) -{ - lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x80); - lt9611_write_reg(<9611_dev->i2c_info, 0xee, 0x01); - - return 0; -} - -static k_s32 lt9611_init_system(struct lt9611_dev *lt9611_dev) -{ - const k_i2c_reg system_regs[] = { - { 0xff, 0x81 }, - { 0x01, 0x18 }, /* sel xtal clock */ - { 0xff, 0x82 }, - { 0x51, 0x11 }, - - /* timer for frequency meter */ - { 0xff, 0x82 }, - { 0x1b, 0x69 }, /* timer 2 */ - { 0x1c, 0x78 }, - { 0xcb, 0x69 }, /* timer 1 */ - { 0xcc, 0x78 }, - - /* power consumption for work */ - { 0xff, 0x80 }, - { 0x04, 0xf0 }, - { 0x06, 0xf0 }, - { 0x0a, 0x80 }, - { 0x0b, 0x46 }, - { 0x0d, 0xef }, - { 0x11, 0xfa }, - }; - - return lt9611_write_multi_reg(<9611_dev->i2c_info, system_regs, ARRAY_SIZE(system_regs)); -} - -static k_s32 lt9611_mipi_input_analog(struct lt9611_dev *lt9611_dev) -{ - const k_i2c_reg mipi_input_analog_regs[] = { - { 0xff, 0x81 }, - { 0x06, 0x60 }, /* port A rx current */ - { 0x07, 0x3f }, /* port A lane0 and lane1 eq set */ - { 0x08, 0x3f }, /* port A lane2 and lane3 eq set */ - { 0x0a, 0xfe }, /* port A ldo voltage set */ - { 0x0b, 0xbf }, /* enable port A lprx */ - - { 0x11, 0x60 }, /* port B rx current */ - { 0x12, 0x3f }, /* port B lane0 and lane1 eq set */ - { 0x13, 0x3f }, /* port B lane2 and lane3 eq set */ - { 0x15, 0xfe }, /* port B ldo voltage set */ - { 0x16, 0xbf }, /* enable port B lprx */ - - { 0x1c, 0x03 }, /* PortA clk lane no-LP mode */ - { 0x20, 0x03 }, /* PortB clk lane no-LP mode */ - }; - - return lt9611_write_multi_reg(<9611_dev->i2c_info, mipi_input_analog_regs, ARRAY_SIZE(mipi_input_analog_regs)); -} - -static k_s32 lt9611_mipi_input_digital(struct lt9611_dev *lt9611_dev) -{ - if (lt9611_dev->input_port == LT9611_PORTA) - { - lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x82); - lt9611_write_reg(<9611_dev->i2c_info, 0x50, 0x10); - lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x83); - lt9611_write_reg(<9611_dev->i2c_info, 0x03, 0x00); - //rt_kprintf("LT9611_PORTA \n"); - } else if (lt9611_dev->input_port == LT9611_PORTB) - { - lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x82); - lt9611_write_reg(<9611_dev->i2c_info, 0x50, 0x14); - lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x83); - lt9611_write_reg(<9611_dev->i2c_info, 0x00, 0x60); - lt9611_write_reg(<9611_dev->i2c_info, 0x03, 0x4f); - lt9611_write_reg(<9611_dev->i2c_info, 0x04, 0x00); - lt9611_write_reg(<9611_dev->i2c_info, 0x07, 0x40); - //rt_kprintf("LT9611_PORTB \n"); - } - - lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x82); - lt9611_write_reg(<9611_dev->i2c_info, 0x4f, 0x80); - lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x83); - lt9611_write_reg(<9611_dev->i2c_info, 0x02, 0x08); - lt9611_write_reg(<9611_dev->i2c_info, 0x06, 0x08); - lt9611_write_reg(<9611_dev->i2c_info, 0x0a, 0x00); - - return 0; -} - -static k_s32 lt9611_read_video(struct lt9611_dev *lt9611_dev) -{ - k_s32 ret = 0; - k_u8 low, high; - k_u16 vtotal, vactive, htotal_sys; - - lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x82); - lt9611_read_reg(<9611_dev->i2c_info, 0x6c, &high); - lt9611_read_reg(<9611_dev->i2c_info, 0x6d, &low); - vtotal = ((high << 8) | low); - - lt9611_read_reg(<9611_dev->i2c_info, 0x82, &high); - lt9611_read_reg(<9611_dev->i2c_info, 0x83, &low); - vactive = ((high << 8) | low); - - lt9611_read_reg(<9611_dev->i2c_info, 0x86, &high); - lt9611_read_reg(<9611_dev->i2c_info, 0x87, &low); - htotal_sys = ((high << 8) | low); - - rt_kprintf("vtotal %d vactive %d htotal_sys %d\n", vtotal, vactive, htotal_sys); - - return 0; -} - -static k_s32 lt9611_setup_pll(struct lt9611_dev *lt9611_dev, k_u32 pclk) -{ - k_u32 postdiv = 0; - - const k_i2c_reg pll_regs[] = { - { 0xff, 0x81 }, - { 0x23, 0x40 }, - { 0x24, 0x62 }, - { 0x25, 0x80 }, - { 0x26, 0x55 }, - { 0x2c, 0x37 }, - { 0x2f, 0x01 }, - { 0x27, 0x66 }, - { 0x28, 0x88 }, - { 0x2a, 0x20 }, - }; - - lt9611_write_multi_reg(<9611_dev->i2c_info, pll_regs, ARRAY_SIZE(pll_regs)); - - if (pclk > 150000) { - lt9611_write_reg(<9611_dev->i2c_info, 0x2d, 0x88); - postdiv = 1; - } else if (pclk > 80000) { - lt9611_write_reg(<9611_dev->i2c_info, 0x2d, 0x99); - postdiv = 2; - } else { - lt9611_write_reg(<9611_dev->i2c_info, 0x2d, 0xaa); - postdiv = 4; - } - lt9611_dev->pcr_m = ((pclk * 5 * postdiv) / 27000) - 1; - - lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x83); - lt9611_write_reg(<9611_dev->i2c_info, 0x2d, 0x40); - lt9611_write_reg(<9611_dev->i2c_info, 0x31, 0x08); - lt9611_write_reg(<9611_dev->i2c_info, 0x26, 0x80 | lt9611_dev->pcr_m); - - lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x82); - pclk = pclk / 2; - lt9611_write_reg(<9611_dev->i2c_info, 0xe3, pclk / 65536); - pclk = pclk % 65536; - lt9611_write_reg(<9611_dev->i2c_info, 0xe4, pclk / 256); - lt9611_write_reg(<9611_dev->i2c_info, 0xe5, pclk % 256); - - lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x82); - lt9611_write_reg(<9611_dev->i2c_info, 0xde, 0x20); - lt9611_write_reg(<9611_dev->i2c_info, 0xde, 0xe0); - - lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x80); - lt9611_write_reg(<9611_dev->i2c_info, 0x11, 0x5a); - lt9611_write_reg(<9611_dev->i2c_info, 0x11, 0xfa); - lt9611_write_reg(<9611_dev->i2c_info, 0x16, 0xf2); - lt9611_write_reg(<9611_dev->i2c_info, 0x18, 0xdc); - lt9611_write_reg(<9611_dev->i2c_info, 0x18, 0xfc); - lt9611_write_reg(<9611_dev->i2c_info, 0x16, 0xf3); -} - -static k_s32 lt9611_setup_pcr(struct lt9611_dev *lt9611_dev) -{ - const k_i2c_reg pcr_regs[] = { - { 0xff, 0x83 }, - { 0x0b, 0x01 }, - { 0x0c, 0x10 }, - { 0x48, 0x00 }, - { 0x49, 0x81 }, - - /* stage 1 */ - { 0x21, 0x4a }, - { 0x24, 0x71 }, - { 0x25, 0x30 }, - { 0x2a, 0x01 }, - - /* stage 2 */ - { 0x4a, 0x40 }, - - /* MK limit */ - { 0x2d, 0x40 }, - { 0x31, 0x08 }, - }; - lt9611_write_multi_reg(<9611_dev->i2c_info, pcr_regs, ARRAY_SIZE(pcr_regs)); - - lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x83); - lt9611_write_reg(<9611_dev->i2c_info, 0x1d, 0x10); - lt9611_write_reg(<9611_dev->i2c_info, 0x26, lt9611_dev->pcr_m); - - lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x80); - lt9611_write_reg(<9611_dev->i2c_info, 0x11, 0x5a); - lt9611_write_reg(<9611_dev->i2c_info, 0x11, 0xfa); - - return 0; -} - -static k_s32 lt9611_setup_timing(struct lt9611_dev *lt9611_dev, k_vo_display_resolution *resolution) -{ - k_u32 htotal = resolution->htotal; - k_u32 hdisplay = resolution->hdisplay; - k_u32 hsync_len = resolution->hsync_len; - k_u32 hback_porch = resolution->hback_porch; - k_u32 hfront_porch = resolution->hfront_porch; - - k_u32 vtotal = resolution->vtotal; - k_u32 vdisplay = resolution->vdisplay; - k_u32 vsync_len = resolution->vsync_len; - k_u32 vback_porch = resolution->vback_porch; - k_u32 vfront_porch = resolution->vfront_porch; - - lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x83); - lt9611_write_reg(<9611_dev->i2c_info, 0x0d, (k_u8)(vtotal / 256)); - lt9611_write_reg(<9611_dev->i2c_info, 0x0e, (k_u8)(vtotal % 256)); - - lt9611_write_reg(<9611_dev->i2c_info, 0x0f, (k_u8)(vdisplay / 256)); - lt9611_write_reg(<9611_dev->i2c_info, 0x10, (k_u8)(vdisplay % 256)); - - lt9611_write_reg(<9611_dev->i2c_info, 0x11, (k_u8)(htotal / 256)); - lt9611_write_reg(<9611_dev->i2c_info, 0x12, (k_u8)(htotal % 256)); - - lt9611_write_reg(<9611_dev->i2c_info, 0x13, (k_u8)(hdisplay / 256)); - lt9611_write_reg(<9611_dev->i2c_info, 0x14, (k_u8)(hdisplay % 256)); - - lt9611_write_reg(<9611_dev->i2c_info, 0x15, (k_u8)(vsync_len % 256)); - lt9611_write_reg(<9611_dev->i2c_info, 0x16, (k_u8)(hsync_len % 256)); - - lt9611_write_reg(<9611_dev->i2c_info, 0x17, (k_u8)(vfront_porch % 256)); - lt9611_write_reg(<9611_dev->i2c_info, 0x18, (k_u8)((vsync_len + vback_porch) % 256)); - - lt9611_write_reg(<9611_dev->i2c_info, 0x19, (k_u8)(hfront_porch % 256)); - lt9611_write_reg(<9611_dev->i2c_info, 0x1a, (k_u8)(((hfront_porch / 256) << 4) + (hsync_len + hback_porch) / 256)); - lt9611_write_reg(<9611_dev->i2c_info, 0x1b, (k_u8)((hsync_len + hback_porch) % 256)); -} - -static k_s32 lt9611_hdmi_tx_digital(struct lt9611_dev *lt9611_dev) -{ - lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x84); - lt9611_write_reg(<9611_dev->i2c_info, 0x43, 0x21); - lt9611_write_reg(<9611_dev->i2c_info, 0x45, 0x40); - lt9611_write_reg(<9611_dev->i2c_info, 0x47, 0x34); - lt9611_write_reg(<9611_dev->i2c_info, 0x3d, 0x0a); /* UD1 infoframe */ - - lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x82); - lt9611_write_reg(<9611_dev->i2c_info, 0xd6, 0x8e); - lt9611_write_reg(<9611_dev->i2c_info, 0xd7, 0x04); -} - -static k_s32 lt9611_hdmi_tx_phy(struct lt9611_dev *lt9611_dev) -{ - const k_i2c_reg hdmi_tx_phy_regs[] = { - { 0xff, 0x81 }, - { 0x30, 0x6a }, - { 0x31, 0x44 }, /* HDMI DC mode */ - { 0x32, 0x4a }, - { 0x33, 0x0b }, - { 0x34, 0x00 }, - { 0x35, 0x00 }, - { 0x36, 0x00 }, - { 0x37, 0x44 }, - { 0x3f, 0x0f }, - { 0x40, 0x98 }, - { 0x41, 0x98 }, - { 0x42, 0x98 }, - { 0x43, 0x98 }, - { 0x44, 0x0a }, - }; - - return lt9611_write_multi_reg(<9611_dev->i2c_info, hdmi_tx_phy_regs, ARRAY_SIZE(hdmi_tx_phy_regs)); -} - -static k_s32 lt9611_irq_init(struct lt9611_dev *lt9611_dev) -{ - lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x82); - lt9611_write_reg(<9611_dev->i2c_info, 0x58, 0x0a); - lt9611_write_reg(<9611_dev->i2c_info, 0x59, 0x00); - lt9611_write_reg(<9611_dev->i2c_info, 0x9e, 0xf7); - - return 0; -} - -static k_s32 lt9611_enable_hpd_interrupts(struct lt9611_dev *lt9611_dev) -{ - lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x82); - lt9611_write_reg(<9611_dev->i2c_info, 0x07, 0xff); - lt9611_write_reg(<9611_dev->i2c_info, 0x07, 0x3f); - lt9611_write_reg(<9611_dev->i2c_info, 0x03, 0x3f); - - return 0; -} - -static k_s32 lt9611_enable_hdmi_out(struct lt9611_dev *lt9611_dev) -{ - lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x81); - lt9611_write_reg(<9611_dev->i2c_info, 0x23, 0x40); - - lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x82); - lt9611_write_reg(<9611_dev->i2c_info, 0xde, 0x20); - lt9611_write_reg(<9611_dev->i2c_info, 0xde, 0xe0); - - lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x80); - lt9611_write_reg(<9611_dev->i2c_info, 0x18, 0xdc); - lt9611_write_reg(<9611_dev->i2c_info, 0x18, 0xfc); - lt9611_write_reg(<9611_dev->i2c_info, 0x16, 0xf1); - lt9611_write_reg(<9611_dev->i2c_info, 0x16, 0xf3); - lt9611_write_reg(<9611_dev->i2c_info, 0x11, 0x5a); - lt9611_write_reg(<9611_dev->i2c_info, 0x11, 0xfa); - - lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x81); - lt9611_write_reg(<9611_dev->i2c_info, 0x30, 0xea); -} - -static struct lt9611_dev *lt9611_dev_create(k_u32 input_port, k_u16 slave_addr, const char *i2c_name) -{ - struct rt_i2c_bus_device *i2c_bus; - struct lt9611_dev *lt9611_dev; - - lt9611_dev = rt_malloc(sizeof(struct lt9611_dev)); - if (lt9611_dev == RT_NULL) - { - return RT_NULL; - } - - i2c_bus = rt_i2c_bus_device_find(i2c_name); - if (i2c_bus == RT_NULL) { - rt_kprintf("can't find %s deivce \n", i2c_name); - return RT_NULL; - } - - lt9611_dev->input_port = input_port; - lt9611_dev->i2c_info.i2c_bus = i2c_bus; - lt9611_dev->i2c_info.i2c_name = i2c_name; - lt9611_dev->i2c_info.slave_addr = slave_addr; - - return lt9611_dev; -} - -static k_s32 lt9611_power_on(void* ctx, k_s32 on) -{ - k_s32 ret = 0; - struct connector_driver_dev* dev = ctx; - struct lt9611_dev *lt9611_dev; - - k230_display_rst(); - lt9611_reset(LT9611_RESET_GPIO); - lt9611_dev = lt9611_dev_create(LT9611_PORTB, LT9611_SLAVE_ADDR, LT9611_I2C_BUS); - if (lt9611_dev == RT_NULL) - { - rt_kprintf("lt9611_dev_create failed \n"); - return K_FAILED; - } - lt9611_set_interface(lt9611_dev); - - connector_set_drvdata(dev, lt9611_dev); - - return ret; -} - -static k_s32 k230_set_phy_freq(k_connectori_phy_attr *phy_attr) -{ - k_vo_mipi_phy_attr mipi_phy_attr; - - memset(&mipi_phy_attr, 0, sizeof(k_vo_mipi_phy_attr)); - - mipi_phy_attr.m = phy_attr->m; - mipi_phy_attr.n = phy_attr->n; - mipi_phy_attr.hs_freq = phy_attr->hs_freq; - mipi_phy_attr.voc = phy_attr->voc; - mipi_phy_attr.phy_lan_num = K_DSI_4LAN; - connector_set_phy_freq(&mipi_phy_attr); - - return 0; -} - -static k_s32 k230_dsi_resolution_init(k_connector_info *info) -{ - k_vo_dsi_attr attr; - k_vo_display_resolution resolution; - - memset(&attr, 0, sizeof(k_vo_dsi_attr)); - attr.lan_num = info->lan_num; - attr.cmd_mode = info->cmd_mode; - attr.lp_div = 8; - attr.work_mode = info->work_mode; - memcpy(&resolution, &info->resolution, sizeof(k_vo_display_resolution)); - memcpy(&attr.resolution, &resolution, sizeof(k_vo_display_resolution)); - connector_set_dsi_attr(&attr); - connector_set_dsi_enable(1); - - if(info->dsi_test_mode == 1) - connector_set_dsi_test_mode(); - - return 0; -} - -static k_s32 k230_vo_resolution_init(k_connector_type type, k_vo_display_resolution *resolution, k_u32 bg_color, k_u32 intr_line) -{ - k_vo_display_resolution vo_resolution; - k_vo_pub_attr pub_attr; - k_vo_sync_attr sync_attr; - - memset(&pub_attr, 0, sizeof(k_vo_pub_attr)); - pub_attr.bg_color = bg_color; - pub_attr.intf_sync = K_VO_OUT_1080P30; - pub_attr.intf_type = K_VO_INTF_MIPI; - pub_attr.sync_info = resolution; - - - - memset(&sync_attr, 0, sizeof(k_vo_sync_attr)); - if (type == LT9611_MIPI_4LAN_1920X1080_60FPS || type == LT9611_MIPI_4LAN_1920X1080_30FPS) { - sync_attr.hsync_start = 2; - sync_attr.hsync_stop = 2; - - sync_attr.hsync1_start = 1; - sync_attr.hsync1_stop = 2; - sync_attr.hsync2_start = 1; - sync_attr.hsync2_stop = 2; - - sync_attr.vsync1_start = 1; - sync_attr.vsync1_stop = 1; - sync_attr.vsync2_start = 1; - sync_attr.vsync2_stop = 1; - } else { - rt_kprintf("Unsupported connector type %d \n", type); - } - - connector_set_vo_init(); - connector_set_vtth_intr(1, intr_line); - connector_set_vo_attr(&pub_attr, &sync_attr); - connector_set_vo_enable(); - - return 0; -} - -k_s32 lt9611_init(void *ctx, k_connector_info *info) -{ - k_s32 ret = 0; - struct connector_driver_dev* dev = ctx; - struct lt9611_dev *lt9611_dev = connector_get_drvdata(dev); - k_u32 pclk = info->resolution.pclk; - - ret |= lt9611_init_system(lt9611_dev); - ret |= lt9611_mipi_input_analog(lt9611_dev); - ret |= lt9611_mipi_input_digital(lt9611_dev); - rt_thread_mdelay(100); - ret |= lt9611_read_video(lt9611_dev); - ret |= lt9611_setup_pll(lt9611_dev, pclk); - ret |= lt9611_setup_pcr(lt9611_dev); - ret |= lt9611_setup_timing(lt9611_dev, &info->resolution); - ret |= lt9611_hdmi_tx_digital(lt9611_dev); - ret |= lt9611_hdmi_tx_phy(lt9611_dev); - ret |= lt9611_irq_init(lt9611_dev); - ret |= lt9611_enable_hpd_interrupts(lt9611_dev); - rt_thread_mdelay(50); - ret |= lt9611_enable_hdmi_out(lt9611_dev); - - ret |= k230_vo_resolution_init(info->type, &info->resolution, info->bg_color, info->intr_line); - ret |= k230_set_phy_freq(&info->phy_attr); - ret |= k230_dsi_resolution_init(info); - - return ret; -} - -static k_s32 lt9611_get_chip_id(void* ctx, k_u32* chip_id) -{ - k_s32 ret = 0; - struct connector_driver_dev* dev = ctx; - struct lt9611_dev *lt9611_dev = connector_get_drvdata(dev); - k_u8 id_high; - k_u8 id_mid; - - ret |= lt9611_read_reg(<9611_dev->i2c_info, 0x00, &id_high); - ret |= lt9611_read_reg(<9611_dev->i2c_info, 0x01, &id_mid); - - chip_id = (id_high << 8) | id_mid; - //rt_kprintf("lt9611 chip_id %02x\n", chip_id); - - return ret; -} - -#define EDID_BLOCK_COUNT 8 -#define EDID_BLOCK_SIZE 32 -static k_s32 lt9611_read_edid(struct lt9611_dev *lt9611_dev, k_u8 *edid_data, k_s32 len) -{ - k_s32 ret = 0; - k_s32 conn = 0; - k_s32 i, j; - k_u8 hpd_state = 0x00; - k_u8 ddc_state = 0x00; - k_u8 reg_val = 0x00; - - ret |= lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x82); - ret |= lt9611_read_reg(<9611_dev->i2c_info, 0x5e, &hpd_state); - conn = !!(hpd_state & 0x04); - if (conn == 0) { - rt_kprintf("HDMI monitor disconnected \n"); - return 0; - } - - ret |= lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x85); - ret |= lt9611_write_reg(<9611_dev->i2c_info, 0x03, 0xc9); - ret |= lt9611_write_reg(<9611_dev->i2c_info, 0x04, 0xa0); - ret |= lt9611_write_reg(<9611_dev->i2c_info, 0x05, 0x00); - ret |= lt9611_write_reg(<9611_dev->i2c_info, 0x06, EDID_BLOCK_SIZE); - ret |= lt9611_write_reg(<9611_dev->i2c_info, 0x14, 0x7f); - - for (i = 0; i < EDID_BLOCK_COUNT; i++) { - ret |= lt9611_write_reg(<9611_dev->i2c_info, 0x05, i * EDID_BLOCK_SIZE); - ret |= lt9611_write_reg(<9611_dev->i2c_info, 0x07, 0x36); - ret |= lt9611_write_reg(<9611_dev->i2c_info, 0x07, 0x31); - ret |= lt9611_write_reg(<9611_dev->i2c_info, 0x07, 0x37); - rt_thread_mdelay(8); - - ret |= lt9611_read_reg(<9611_dev->i2c_info, 0x40, &ddc_state); - if (ddc_state & 0x02) { - //rt_kprintf("DDC answer success \n"); - for (j = 0; j < EDID_BLOCK_SIZE; j++) { - ret |= lt9611_read_reg(<9611_dev->i2c_info, 0x83, ®_val); - edid_data[i * EDID_BLOCK_SIZE + j] = reg_val; - } - } else if (ddc_state & 0x50) { - rt_kprintf("HDMI read EDID failed: DDC no ack \n"); - lt9611_write_reg(<9611_dev->i2c_info, 0x07, 0x1f); - return -1; - } else { - rt_kprintf("HDMI read EDID failed \n"); - lt9611_write_reg(<9611_dev->i2c_info, 0x07, 0x1f); - return -1; - } - } - - return 256; -} - -#define MATCH_OK 0 -#define MATCH_FAILED 1 -static k_s32 parse_stardard_timing(k_u8 *stardard_timing, k_s32 len, struct lt9611_resolution *lt9611_resolution) -{ - k_s32 i = 0; - - for (i = 0; i < len; i = i + 2) { - if ((stardard_timing[i] == lt9611_resolution->std_timing_high) && - (stardard_timing[i + 1] == lt9611_resolution->std_timing_low)) - return MATCH_OK; - } - - return MATCH_FAILED; -} - -static k_s32 parse_cea861_timing(k_u8 *cea861_timing, k_s32 len, struct lt9611_resolution *lt9611_resolution) -{ - k_s32 i = 0; - - for (i = 0; i < len; i ++) { - if (cea861_timing[i] == lt9611_resolution->cea861_vic) - return MATCH_OK; - } - - return MATCH_FAILED; -} - -static k_s32 lt9611_parse_edid(k_u8 *edid_data, k_s32 len, k_connector_negotiated_data *negotiated_data) -{ - k_u8 stardard_timing[16]; - k_u8 cea861_timing[256]; - k_u8 cea861_len = 0; - k_s32 i = 0; - k_s32 match = 0; - k_s32 negotiated_count = 0; - - memcpy(stardard_timing, edid_data + 0x26, 16); - if (edid_data[0x7E] == 0x01 && edid_data[0x80] == 0x02) { - cea861_len = edid_data[0x84] & 0x1F; - memcpy(cea861_timing, edid_data + 0x85, cea861_len); - } - - for (i = 0; i < LT9611_RESOLUTION_NUM; i ++) { - match = parse_stardard_timing(stardard_timing, 16, <9611_resolution[i]); - if (match == MATCH_OK) { - negotiated_data->negotiated_types[negotiated_count] = lt9611_resolution[i].connector_type; - negotiated_count ++; - continue; - } - - match = parse_cea861_timing(cea861_timing, cea861_len, <9611_resolution[i]); - if (match == MATCH_OK) { - negotiated_data->negotiated_types[negotiated_count] = lt9611_resolution[i].connector_type; - negotiated_count ++; - continue; - } - } - negotiated_data->negotiated_count = negotiated_count; - - return negotiated_count; -} - -static k_s32 lt9611_get_negotiated_data(void* ctx, k_connector_negotiated_data *negotiated_data) -{ - k_s32 ret = 0; - struct connector_driver_dev* dev = ctx; - struct lt9611_dev *lt9611_dev = connector_get_drvdata(dev); - k_u8 edid_data[256]; - - memset(edid_data, 0x00, 256); - ret = lt9611_read_edid(lt9611_dev, edid_data, 256); - if (ret == 0) { - negotiated_data->connection_status = 0; - negotiated_data->negotiated_count = 1; - negotiated_data->negotiated_types[0] = LT9611_MIPI_4LAN_1920X1080_60FPS; - return 1; - } - - ret = lt9611_parse_edid(edid_data, 256, negotiated_data); - if (ret == 0) { - negotiated_data->connection_status = 1; - negotiated_data->negotiated_count = 1; - negotiated_data->negotiated_types[0] = LT9611_MIPI_4LAN_1920X1080_60FPS; - return 1; - } - - return negotiated_data->negotiated_count; -} - -static k_s32 lt9611_conn_check(void* ctx, k_s32* conn) -{ - k_s32 ret = 0; - struct connector_driver_dev* dev = ctx; - struct lt9611_dev *lt9611_dev = connector_get_drvdata(dev); - k_u8 hpd_state = 0; - - ret |= lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x82); - ret |= lt9611_read_reg(<9611_dev->i2c_info, 0x5e, &hpd_state); - - *conn = !!(hpd_state & 0x04); - //rt_kprintf("lt9611 hpd_state %02x\n", (hpd_state & 0x04)); - - return ret; -} - -struct connector_driver_dev lt9611_connector_drv = { - .connector_name = "lt9611", - .connector_func = { - .connector_power = lt9611_power_on, - .connector_init = lt9611_init, - .connector_get_chip_id = lt9611_get_chip_id, - .connector_get_negotiated_data = lt9611_get_negotiated_data, - .connector_conn_check = lt9611_conn_check, - }, -}; - +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include + +#include "connector_dev.h" +#include "io.h" +#include "drv_gpio.h" +#include "k_vo_comm.h" +#include "k_connector_comm.h" +#include "k_board_config_comm.h" + +#define DBG_TAG "lt9611" +#ifdef RT_DEBUG +#define DBG_LVL DBG_LOG +#else +#define DBG_LVL DBG_WARNING +#endif +#define DBG_COLOR +#include + +#ifndef ARRAY_SIZE +#define ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0])) +#endif + +typedef struct { + k_u8 addr; + k_u8 val; +} k_i2c_reg; + +typedef struct { + k_u16 slave_addr; + const char *i2c_name; + struct rt_i2c_bus_device *i2c_bus; +} k_i2c_info; + +struct lt9611_dev { +#define LT9611_PORTA 100600 +#define LT9611_PORTB 100601 + k_u32 input_port; + k_u32 pcr_m; + k_i2c_info i2c_info; +}; + +struct lt9611_resolution { + k_u8 std_timing_high; + k_u8 std_timing_low; + k_u8 cea861_vic; + k_u32 connector_type; +}; + +#define LT9611_RESOLUTION_NUM 5 +struct lt9611_resolution lt9611_resolution[LT9611_RESOLUTION_NUM] = { + {0xd1, 0xc0, 16, LT9611_MIPI_4LAN_1920X1080_60FPS}, + {0x00, 0x00, 34, LT9611_MIPI_4LAN_1920X1080_30FPS}, + {0x81, 0xc0, 4, LT9611_MIPI_4LAN_1280X720_60FPS}, + {0x00, 0x00, 19, LT9611_MIPI_4LAN_1280X720_50FPS}, + {0x00, 0x00, 1, LT9611_MIPI_4LAN_640X480_60FPS}, +}; + +static void connector_set_drvdata(struct connector_driver_dev *dev, void *data) +{ + dev->driver_data = data; +} + +static void *connector_get_drvdata(struct connector_driver_dev *dev) +{ + return dev->driver_data; +} + +k_s32 lt9611_read_reg(k_i2c_info *i2c_info, k_u8 reg_addr, k_u8 *reg_val) +{ + struct rt_i2c_msg msg[2]; + + RT_ASSERT(i2c_info != RT_NULL); + msg[0].addr = i2c_info->slave_addr; + msg[0].flags = RT_I2C_WR; + msg[0].len = 1; + msg[0].buf = ®_addr; + + msg[1].addr = i2c_info->slave_addr; + msg[1].flags = RT_I2C_RD; + msg[1].len = 1; + msg[1].buf = reg_val; + + if (rt_i2c_transfer(i2c_info->i2c_bus, msg, 2) != 2) + return RT_ERROR; + + return RT_EOK; +} + +k_s32 lt9611_write_reg(k_i2c_info *i2c_info, k_u8 reg_addr, k_u8 reg_val) +{ + struct rt_i2c_msg msg; + k_u8 buf[2]; + + RT_ASSERT(i2c_info != RT_NULL); + buf[0] = reg_addr; + buf[1] = reg_val; + msg.addr = i2c_info->slave_addr; + msg.flags = RT_I2C_WR; + msg.len = 2; + msg.buf = buf; + + if (rt_i2c_transfer(i2c_info->i2c_bus, &msg, 1) != 1) + return RT_ERROR; + + return RT_EOK; +} + +k_s32 lt9611_write_multi_reg(k_i2c_info *i2c_info, const k_i2c_reg *reg_list, k_u32 reg_num) +{ + k_s32 ret = 0; + k_u32 i; + + for (i = 0; i < reg_num; i++) { + ret = lt9611_write_reg(i2c_info, reg_list[i].addr, reg_list[i].val); + if (ret) + return RT_ERROR; + } + + return ret; +} + +static void lt9611_reset(k_u8 lt9611_reset_pin) +{ + kd_pin_mode(lt9611_reset_pin, GPIO_DM_OUTPUT); + kd_pin_write(lt9611_reset_pin, GPIO_PV_LOW); + rt_thread_mdelay(100); + + kd_pin_write(lt9611_reset_pin, GPIO_PV_HIGH); + rt_thread_mdelay(100); +} + +static k_s32 lt9611_set_interface(struct lt9611_dev *lt9611_dev) +{ + lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x80); + lt9611_write_reg(<9611_dev->i2c_info, 0xee, 0x01); + + return 0; +} + +static k_s32 lt9611_init_system(struct lt9611_dev *lt9611_dev) +{ + const k_i2c_reg system_regs[] = { + { 0xff, 0x81 }, + { 0x01, 0x18 }, /* sel xtal clock */ + { 0xff, 0x82 }, + { 0x51, 0x11 }, + + /* timer for frequency meter */ + { 0xff, 0x82 }, + { 0x1b, 0x69 }, /* timer 2 */ + { 0x1c, 0x78 }, + { 0xcb, 0x69 }, /* timer 1 */ + { 0xcc, 0x78 }, + + /* power consumption for work */ + { 0xff, 0x80 }, + { 0x04, 0xf0 }, + { 0x06, 0xf0 }, + { 0x0a, 0x80 }, + { 0x0b, 0x46 }, + { 0x0d, 0xef }, + { 0x11, 0xfa }, + }; + + return lt9611_write_multi_reg(<9611_dev->i2c_info, system_regs, ARRAY_SIZE(system_regs)); +} + +static k_s32 lt9611_mipi_input_analog(struct lt9611_dev *lt9611_dev) +{ + const k_i2c_reg mipi_input_analog_regs[] = { + { 0xff, 0x81 }, + { 0x06, 0x60 }, /* port A rx current */ + { 0x07, 0x3f }, /* port A lane0 and lane1 eq set */ + { 0x08, 0x3f }, /* port A lane2 and lane3 eq set */ + { 0x0a, 0xfe }, /* port A ldo voltage set */ + { 0x0b, 0xbf }, /* enable port A lprx */ + + { 0x11, 0x60 }, /* port B rx current */ + { 0x12, 0x3f }, /* port B lane0 and lane1 eq set */ + { 0x13, 0x3f }, /* port B lane2 and lane3 eq set */ + { 0x15, 0xfe }, /* port B ldo voltage set */ + { 0x16, 0xbf }, /* enable port B lprx */ + + { 0x1c, 0x03 }, /* PortA clk lane no-LP mode */ + { 0x20, 0x03 }, /* PortB clk lane no-LP mode */ + }; + + return lt9611_write_multi_reg(<9611_dev->i2c_info, mipi_input_analog_regs, ARRAY_SIZE(mipi_input_analog_regs)); +} + +static k_s32 lt9611_mipi_input_digital(struct lt9611_dev *lt9611_dev) +{ + if (lt9611_dev->input_port == LT9611_PORTA) { + lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x82); + lt9611_write_reg(<9611_dev->i2c_info, 0x50, 0x10); + lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x83); + lt9611_write_reg(<9611_dev->i2c_info, 0x03, 0x00); + } else if (lt9611_dev->input_port == LT9611_PORTB) { + lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x82); + lt9611_write_reg(<9611_dev->i2c_info, 0x50, 0x14); + lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x83); + lt9611_write_reg(<9611_dev->i2c_info, 0x00, 0x60); + lt9611_write_reg(<9611_dev->i2c_info, 0x03, 0x4f); + lt9611_write_reg(<9611_dev->i2c_info, 0x04, 0x00); + lt9611_write_reg(<9611_dev->i2c_info, 0x07, 0x40); + } + + lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x82); + lt9611_write_reg(<9611_dev->i2c_info, 0x4f, 0x80); + lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x83); + lt9611_write_reg(<9611_dev->i2c_info, 0x02, 0x08); + lt9611_write_reg(<9611_dev->i2c_info, 0x06, 0x08); + lt9611_write_reg(<9611_dev->i2c_info, 0x0a, 0x00); + + return 0; +} + +static k_s32 lt9611_read_video(struct lt9611_dev *lt9611_dev) +{ + k_s32 ret = 0; + k_u8 low, high; + k_u16 vtotal, vactive, htotal_sys; + + lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x82); + lt9611_read_reg(<9611_dev->i2c_info, 0x6c, &high); + lt9611_read_reg(<9611_dev->i2c_info, 0x6d, &low); + vtotal = ((high << 8) | low); + + lt9611_read_reg(<9611_dev->i2c_info, 0x82, &high); + lt9611_read_reg(<9611_dev->i2c_info, 0x83, &low); + vactive = ((high << 8) | low); + + lt9611_read_reg(<9611_dev->i2c_info, 0x86, &high); + lt9611_read_reg(<9611_dev->i2c_info, 0x87, &low); + htotal_sys = ((high << 8) | low); + + LOG_D("vtotal %d vactive %d htotal_sys %d\n", vtotal, vactive, htotal_sys); + + return 0; +} + +static k_s32 lt9611_setup_pll(struct lt9611_dev *lt9611_dev, k_u32 pclk) +{ + k_u32 postdiv = 0; + + const k_i2c_reg pll_regs[] = { + { 0xff, 0x81 }, + { 0x23, 0x40 }, + { 0x24, 0x62 }, + { 0x25, 0x80 }, + { 0x26, 0x55 }, + { 0x2c, 0x37 }, + { 0x2f, 0x01 }, + { 0x27, 0x66 }, + { 0x28, 0x88 }, + { 0x2a, 0x20 }, + }; + + lt9611_write_multi_reg(<9611_dev->i2c_info, pll_regs, ARRAY_SIZE(pll_regs)); + + if (pclk > 150000) { + lt9611_write_reg(<9611_dev->i2c_info, 0x2d, 0x88); + postdiv = 1; + } else if (pclk > 80000) { + lt9611_write_reg(<9611_dev->i2c_info, 0x2d, 0x99); + postdiv = 2; + } else { + lt9611_write_reg(<9611_dev->i2c_info, 0x2d, 0xaa); + postdiv = 4; + } + lt9611_dev->pcr_m = ((pclk * 5 * postdiv) / 27000) - 1; + + lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x83); + lt9611_write_reg(<9611_dev->i2c_info, 0x2d, 0x40); + lt9611_write_reg(<9611_dev->i2c_info, 0x31, 0x08); + lt9611_write_reg(<9611_dev->i2c_info, 0x26, 0x80 | lt9611_dev->pcr_m); + + lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x82); + pclk = pclk / 2; + lt9611_write_reg(<9611_dev->i2c_info, 0xe3, pclk / 65536); + pclk = pclk % 65536; + lt9611_write_reg(<9611_dev->i2c_info, 0xe4, pclk / 256); + lt9611_write_reg(<9611_dev->i2c_info, 0xe5, pclk % 256); + + lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x82); + lt9611_write_reg(<9611_dev->i2c_info, 0xde, 0x20); + lt9611_write_reg(<9611_dev->i2c_info, 0xde, 0xe0); + + lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x80); + lt9611_write_reg(<9611_dev->i2c_info, 0x11, 0x5a); + lt9611_write_reg(<9611_dev->i2c_info, 0x11, 0xfa); + lt9611_write_reg(<9611_dev->i2c_info, 0x16, 0xf2); + lt9611_write_reg(<9611_dev->i2c_info, 0x18, 0xdc); + lt9611_write_reg(<9611_dev->i2c_info, 0x18, 0xfc); + lt9611_write_reg(<9611_dev->i2c_info, 0x16, 0xf3); + + return 0; +} + +static k_s32 lt9611_setup_pcr(struct lt9611_dev *lt9611_dev) +{ + const k_i2c_reg pcr_regs[] = { + { 0xff, 0x83 }, + { 0x0b, 0x01 }, + { 0x0c, 0x10 }, + { 0x48, 0x00 }, + { 0x49, 0x81 }, + + /* stage 1 */ + { 0x21, 0x4a }, + { 0x24, 0x71 }, + { 0x25, 0x30 }, + { 0x2a, 0x01 }, + + /* stage 2 */ + { 0x4a, 0x40 }, + + /* MK limit */ + { 0x2d, 0x40 }, + { 0x31, 0x08 }, + }; + lt9611_write_multi_reg(<9611_dev->i2c_info, pcr_regs, ARRAY_SIZE(pcr_regs)); + + lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x83); + lt9611_write_reg(<9611_dev->i2c_info, 0x1d, 0x10); + lt9611_write_reg(<9611_dev->i2c_info, 0x26, lt9611_dev->pcr_m); + + lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x80); + lt9611_write_reg(<9611_dev->i2c_info, 0x11, 0x5a); + lt9611_write_reg(<9611_dev->i2c_info, 0x11, 0xfa); + + return 0; +} + +static k_s32 lt9611_setup_timing(struct lt9611_dev *lt9611_dev, k_vo_display_resolution *resolution) +{ + k_u32 htotal = resolution->htotal; + k_u32 hdisplay = resolution->hdisplay; + k_u32 hsync_len = resolution->hsync_len; + k_u32 hback_porch = resolution->hback_porch; + k_u32 hfront_porch = resolution->hfront_porch; + + k_u32 vtotal = resolution->vtotal; + k_u32 vdisplay = resolution->vdisplay; + k_u32 vsync_len = resolution->vsync_len; + k_u32 vback_porch = resolution->vback_porch; + k_u32 vfront_porch = resolution->vfront_porch; + + lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x83); + lt9611_write_reg(<9611_dev->i2c_info, 0x0d, (k_u8)(vtotal / 256)); + lt9611_write_reg(<9611_dev->i2c_info, 0x0e, (k_u8)(vtotal % 256)); + + lt9611_write_reg(<9611_dev->i2c_info, 0x0f, (k_u8)(vdisplay / 256)); + lt9611_write_reg(<9611_dev->i2c_info, 0x10, (k_u8)(vdisplay % 256)); + + lt9611_write_reg(<9611_dev->i2c_info, 0x11, (k_u8)(htotal / 256)); + lt9611_write_reg(<9611_dev->i2c_info, 0x12, (k_u8)(htotal % 256)); + + lt9611_write_reg(<9611_dev->i2c_info, 0x13, (k_u8)(hdisplay / 256)); + lt9611_write_reg(<9611_dev->i2c_info, 0x14, (k_u8)(hdisplay % 256)); + + lt9611_write_reg(<9611_dev->i2c_info, 0x15, (k_u8)(vsync_len % 256)); + lt9611_write_reg(<9611_dev->i2c_info, 0x16, (k_u8)(hsync_len % 256)); + + lt9611_write_reg(<9611_dev->i2c_info, 0x17, (k_u8)(vfront_porch % 256)); + lt9611_write_reg(<9611_dev->i2c_info, 0x18, (k_u8)((vsync_len + vback_porch) % 256)); + + lt9611_write_reg(<9611_dev->i2c_info, 0x19, (k_u8)(hfront_porch % 256)); + lt9611_write_reg(<9611_dev->i2c_info, 0x1a, (k_u8)(((hfront_porch / 256) << 4) + (hsync_len + hback_porch) / 256)); + lt9611_write_reg(<9611_dev->i2c_info, 0x1b, (k_u8)((hsync_len + hback_porch) % 256)); + + return 0; +} + +static k_s32 lt9611_hdmi_tx_digital(struct lt9611_dev *lt9611_dev) +{ + lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x84); + lt9611_write_reg(<9611_dev->i2c_info, 0x43, 0x21); + lt9611_write_reg(<9611_dev->i2c_info, 0x45, 0x40); + lt9611_write_reg(<9611_dev->i2c_info, 0x47, 0x34); + lt9611_write_reg(<9611_dev->i2c_info, 0x3d, 0x0a); /* UD1 infoframe */ + + lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x82); + lt9611_write_reg(<9611_dev->i2c_info, 0xd6, 0x8e); + lt9611_write_reg(<9611_dev->i2c_info, 0xd7, 0x04); + + return 0; +} + +static k_s32 lt9611_hdmi_tx_phy(struct lt9611_dev *lt9611_dev) +{ + const k_i2c_reg hdmi_tx_phy_regs[] = { + { 0xff, 0x81 }, + { 0x30, 0x6a }, + { 0x31, 0x44 }, /* HDMI DC mode */ + { 0x32, 0x4a }, + { 0x33, 0x0b }, + { 0x34, 0x00 }, + { 0x35, 0x00 }, + { 0x36, 0x00 }, + { 0x37, 0x44 }, + { 0x3f, 0x0f }, + { 0x40, 0x98 }, + { 0x41, 0x98 }, + { 0x42, 0x98 }, + { 0x43, 0x98 }, + { 0x44, 0x0a }, + }; + + return lt9611_write_multi_reg(<9611_dev->i2c_info, hdmi_tx_phy_regs, ARRAY_SIZE(hdmi_tx_phy_regs)); +} + +static k_s32 lt9611_irq_init(struct lt9611_dev *lt9611_dev) +{ + lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x82); + lt9611_write_reg(<9611_dev->i2c_info, 0x58, 0x0a); + lt9611_write_reg(<9611_dev->i2c_info, 0x59, 0x00); + lt9611_write_reg(<9611_dev->i2c_info, 0x9e, 0xf7); + + return 0; +} + +static k_s32 lt9611_enable_hpd_interrupts(struct lt9611_dev *lt9611_dev) +{ + lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x82); + lt9611_write_reg(<9611_dev->i2c_info, 0x07, 0xff); + lt9611_write_reg(<9611_dev->i2c_info, 0x07, 0x3f); + lt9611_write_reg(<9611_dev->i2c_info, 0x03, 0x3f); + + return 0; +} + +static k_s32 lt9611_enable_hdmi_out(struct lt9611_dev *lt9611_dev) +{ + lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x81); + lt9611_write_reg(<9611_dev->i2c_info, 0x23, 0x40); + + lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x82); + lt9611_write_reg(<9611_dev->i2c_info, 0xde, 0x20); + lt9611_write_reg(<9611_dev->i2c_info, 0xde, 0xe0); + + lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x80); + lt9611_write_reg(<9611_dev->i2c_info, 0x18, 0xdc); + lt9611_write_reg(<9611_dev->i2c_info, 0x18, 0xfc); + lt9611_write_reg(<9611_dev->i2c_info, 0x16, 0xf1); + lt9611_write_reg(<9611_dev->i2c_info, 0x16, 0xf3); + lt9611_write_reg(<9611_dev->i2c_info, 0x11, 0x5a); + lt9611_write_reg(<9611_dev->i2c_info, 0x11, 0xfa); + + lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x81); + lt9611_write_reg(<9611_dev->i2c_info, 0x30, 0xea); + + return 0; +} + +static struct lt9611_dev *lt9611_dev_create(k_u32 input_port, k_u16 slave_addr, const char *i2c_name) +{ + struct rt_i2c_bus_device *i2c_bus; + struct lt9611_dev *lt9611_dev; + + lt9611_dev = rt_malloc(sizeof(struct lt9611_dev)); + if (lt9611_dev == RT_NULL) + return RT_NULL; + + i2c_bus = rt_i2c_bus_device_find(i2c_name); + if (i2c_bus == RT_NULL) { + LOG_E("can't find %s deivce \n", i2c_name); + return RT_NULL; + } + + lt9611_dev->input_port = input_port; + lt9611_dev->i2c_info.i2c_bus = i2c_bus; + lt9611_dev->i2c_info.i2c_name = i2c_name; + lt9611_dev->i2c_info.slave_addr = slave_addr; + + return lt9611_dev; +} + +static k_s32 lt9611_power_on(void* ctx, k_s32 on) +{ + k_s32 ret = 0; + struct connector_driver_dev* dev = ctx; + struct lt9611_dev *lt9611_dev; + + k230_display_rst(); + lt9611_reset(LT9611_RESET_GPIO); + lt9611_dev = lt9611_dev_create(LT9611_PORTB, LT9611_SLAVE_ADDR, LT9611_I2C_BUS); + if (lt9611_dev == RT_NULL) { + LOG_E("lt9611_dev_create failed \n"); + return K_FAILED; + } + lt9611_set_interface(lt9611_dev); + + connector_set_drvdata(dev, lt9611_dev); + + return ret; +} + +static k_s32 k230_set_phy_freq(k_connectori_phy_attr *phy_attr) +{ + k_vo_mipi_phy_attr mipi_phy_attr; + + memset(&mipi_phy_attr, 0, sizeof(k_vo_mipi_phy_attr)); + + mipi_phy_attr.m = phy_attr->m; + mipi_phy_attr.n = phy_attr->n; + mipi_phy_attr.hs_freq = phy_attr->hs_freq; + mipi_phy_attr.voc = phy_attr->voc; + mipi_phy_attr.phy_lan_num = K_DSI_4LAN; + connector_set_phy_freq(&mipi_phy_attr); + + return 0; +} + +static k_s32 k230_dsi_resolution_init(k_connector_info *info) +{ + k_vo_dsi_attr attr; + k_vo_display_resolution resolution; + + memset(&attr, 0, sizeof(k_vo_dsi_attr)); + attr.lan_num = info->lan_num; + attr.cmd_mode = info->cmd_mode; + attr.lp_div = 8; + attr.work_mode = info->work_mode; + memcpy(&resolution, &info->resolution, sizeof(k_vo_display_resolution)); + memcpy(&attr.resolution, &resolution, sizeof(k_vo_display_resolution)); + connector_set_dsi_attr(&attr); + connector_set_dsi_enable(1); + + if(info->dsi_test_mode == 1) + connector_set_dsi_test_mode(); + + return 0; +} + +static k_s32 k230_vo_resolution_init(k_connector_type type, k_vo_display_resolution *resolution, k_u32 bg_color, k_u32 intr_line) +{ + k_vo_display_resolution vo_resolution; + k_vo_pub_attr pub_attr; + k_vo_sync_attr sync_attr; + + memset(&pub_attr, 0, sizeof(k_vo_pub_attr)); + pub_attr.bg_color = bg_color; + pub_attr.intf_sync = K_VO_OUT_1080P30; + pub_attr.intf_type = K_VO_INTF_MIPI; + pub_attr.sync_info = resolution; + + memset(&sync_attr, 0, sizeof(k_vo_sync_attr)); + sync_attr.hsync_start = 2; + sync_attr.hsync_stop = 5; + + sync_attr.hsync1_start = 2; + sync_attr.hsync1_stop = 5; + sync_attr.hsync2_start = 2; + sync_attr.hsync2_stop = 5; + + sync_attr.vsync1_start = 0; + sync_attr.vsync1_stop = 0; + sync_attr.vsync2_start = 0; + sync_attr.vsync2_stop = 0; + + connector_set_vo_init(); + connector_set_vtth_intr(1, intr_line); + connector_set_vo_attr(&pub_attr, &sync_attr); + connector_set_vo_enable(); + + return 0; +} + +k_s32 lt9611_init(void *ctx, k_connector_info *info) +{ + k_s32 ret = 0; + struct connector_driver_dev* dev = ctx; + struct lt9611_dev *lt9611_dev = connector_get_drvdata(dev); + k_u32 pclk = info->resolution.pclk; + + ret |= lt9611_init_system(lt9611_dev); + ret |= lt9611_mipi_input_analog(lt9611_dev); + ret |= lt9611_mipi_input_digital(lt9611_dev); + ret |= lt9611_setup_pll(lt9611_dev, pclk); + ret |= lt9611_setup_pcr(lt9611_dev); + ret |= lt9611_setup_timing(lt9611_dev, &info->resolution); + ret |= lt9611_hdmi_tx_digital(lt9611_dev); + ret |= lt9611_hdmi_tx_phy(lt9611_dev); + ret |= lt9611_irq_init(lt9611_dev); + ret |= lt9611_enable_hpd_interrupts(lt9611_dev); + ret |= lt9611_enable_hdmi_out(lt9611_dev); + if(info->pixclk_div != 0) + connector_set_pixclk(info->pixclk_div); + ret |= k230_vo_resolution_init(info->type, &info->resolution, info->bg_color, info->intr_line); + ret |= k230_set_phy_freq(&info->phy_attr); + ret |= k230_dsi_resolution_init(info); + rt_thread_mdelay(50); + ret |= lt9611_read_video(lt9611_dev); + + return ret; +} + +static k_s32 lt9611_get_chip_id(void* ctx, k_u32* chip_id) +{ + k_s32 ret = 0; + struct connector_driver_dev* dev = ctx; + struct lt9611_dev *lt9611_dev = connector_get_drvdata(dev); + k_u8 id_high; + k_u8 id_mid; + + ret |= lt9611_read_reg(<9611_dev->i2c_info, 0x00, &id_high); + ret |= lt9611_read_reg(<9611_dev->i2c_info, 0x01, &id_mid); + + chip_id = (id_high << 8) | id_mid; + LOG_D("lt9611 chip_id %02x\n", chip_id); + + return ret; +} + +#define EDID_BLOCK_COUNT 8 +#define EDID_BLOCK_SIZE 32 +static k_s32 lt9611_read_edid(struct lt9611_dev *lt9611_dev, k_u8 *edid_data, k_s32 len) +{ + k_s32 ret = 0; + k_s32 conn = 0; + k_s32 i, j; + k_u8 hpd_state = 0x00; + k_u8 ddc_state = 0x00; + k_u8 reg_val = 0x00; + + ret |= lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x82); + ret |= lt9611_read_reg(<9611_dev->i2c_info, 0x5e, &hpd_state); + conn = !!(hpd_state & 0x04); + if (conn == 0) { + LOG_W("HDMI monitor disconnected \n"); + return 0; + } + + ret |= lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x85); + ret |= lt9611_write_reg(<9611_dev->i2c_info, 0x03, 0xc9); + ret |= lt9611_write_reg(<9611_dev->i2c_info, 0x04, 0xa0); + ret |= lt9611_write_reg(<9611_dev->i2c_info, 0x05, 0x00); + ret |= lt9611_write_reg(<9611_dev->i2c_info, 0x06, EDID_BLOCK_SIZE); + ret |= lt9611_write_reg(<9611_dev->i2c_info, 0x14, 0x7f); + + for (i = 0; i < EDID_BLOCK_COUNT; i++) { + ret |= lt9611_write_reg(<9611_dev->i2c_info, 0x05, i * EDID_BLOCK_SIZE); + ret |= lt9611_write_reg(<9611_dev->i2c_info, 0x07, 0x36); + ret |= lt9611_write_reg(<9611_dev->i2c_info, 0x07, 0x31); + ret |= lt9611_write_reg(<9611_dev->i2c_info, 0x07, 0x37); + rt_thread_mdelay(8); + + ret |= lt9611_read_reg(<9611_dev->i2c_info, 0x40, &ddc_state); + if (ddc_state & 0x02) { + for (j = 0; j < EDID_BLOCK_SIZE; j++) { + ret |= lt9611_read_reg(<9611_dev->i2c_info, 0x83, ®_val); + edid_data[i * EDID_BLOCK_SIZE + j] = reg_val; + } + } else if (ddc_state & 0x50) { + LOG_W("HDMI read EDID failed: DDC no ack \n"); + lt9611_write_reg(<9611_dev->i2c_info, 0x07, 0x1f); + return -1; + } else { + LOG_W("HDMI read EDID failed \n"); + lt9611_write_reg(<9611_dev->i2c_info, 0x07, 0x1f); + return -1; + } + } + + return 256; +} + +#define MATCH_OK 0 +#define MATCH_FAILED 1 +static k_s32 parse_stardard_timing(k_u8 *stardard_timing, k_s32 len, struct lt9611_resolution *lt9611_resolution) +{ + k_s32 i = 0; + + for (i = 0; i < len; i = i + 2) { + if ((stardard_timing[i] == lt9611_resolution->std_timing_high) && + (stardard_timing[i + 1] == lt9611_resolution->std_timing_low)) + return MATCH_OK; + } + + return MATCH_FAILED; +} + +static k_s32 parse_cea861_timing(k_u8 *cea861_timing, k_s32 len, struct lt9611_resolution *lt9611_resolution) +{ + k_s32 i = 0; + + for (i = 0; i < len; i ++) { + if (cea861_timing[i] == lt9611_resolution->cea861_vic) + return MATCH_OK; + } + + return MATCH_FAILED; +} + +static k_s32 lt9611_parse_edid(k_u8 *edid_data, k_s32 len, k_connector_negotiated_data *negotiated_data) +{ + k_u8 stardard_timing[16]; + k_u8 cea861_timing[256]; + k_u8 cea861_len = 0; + k_s32 i = 0; + k_s32 match = 0; + k_s32 negotiated_count = 0; + + memcpy(stardard_timing, edid_data + 0x26, 16); + if (edid_data[0x7E] == 0x01 && edid_data[0x80] == 0x02) { + cea861_len = edid_data[0x84] & 0x1F; + memcpy(cea861_timing, edid_data + 0x85, cea861_len); + } + + for (i = 0; i < LT9611_RESOLUTION_NUM; i ++) { + match = parse_stardard_timing(stardard_timing, 16, <9611_resolution[i]); + if (match == MATCH_OK) { + negotiated_data->negotiated_types[negotiated_count] = lt9611_resolution[i].connector_type; + negotiated_count ++; + continue; + } + + match = parse_cea861_timing(cea861_timing, cea861_len, <9611_resolution[i]); + if (match == MATCH_OK) { + negotiated_data->negotiated_types[negotiated_count] = lt9611_resolution[i].connector_type; + negotiated_count ++; + continue; + } + } + negotiated_data->negotiated_count = negotiated_count; + + return negotiated_count; +} + +static k_s32 lt9611_get_negotiated_data(void* ctx, k_connector_negotiated_data *negotiated_data) +{ + k_s32 ret = 0; + struct connector_driver_dev* dev = ctx; + struct lt9611_dev *lt9611_dev = connector_get_drvdata(dev); + k_u8 edid_data[256]; + + memset(edid_data, 0x00, 256); + ret = lt9611_read_edid(lt9611_dev, edid_data, 256); + if (ret == 0) { + negotiated_data->connection_status = 0; + negotiated_data->negotiated_count = 1; + negotiated_data->negotiated_types[0] = LT9611_MIPI_4LAN_1920X1080_60FPS; + return 1; + } + + ret = lt9611_parse_edid(edid_data, 256, negotiated_data); + if (ret == 0) { + negotiated_data->connection_status = 1; + negotiated_data->negotiated_count = 1; + negotiated_data->negotiated_types[0] = LT9611_MIPI_4LAN_1920X1080_60FPS; + return 1; + } + + return negotiated_data->negotiated_count; +} + +static k_s32 lt9611_conn_check(void* ctx, k_s32* conn) +{ + k_s32 ret = 0; + struct connector_driver_dev* dev = ctx; + struct lt9611_dev *lt9611_dev = connector_get_drvdata(dev); + k_u8 hpd_state = 0; + + ret |= lt9611_write_reg(<9611_dev->i2c_info, 0xff, 0x82); + ret |= lt9611_read_reg(<9611_dev->i2c_info, 0x5e, &hpd_state); + + *conn = !!(hpd_state & 0x04); + + return ret; +} + +struct connector_driver_dev lt9611_connector_drv = { + .connector_name = "lt9611", + .connector_func = { + .connector_power = lt9611_power_on, + .connector_init = lt9611_init, + .connector_get_chip_id = lt9611_get_chip_id, + .connector_get_negotiated_data = lt9611_get_negotiated_data, + .connector_conn_check = lt9611_conn_check, + }, +}; diff --git a/src/big/mpp/kernel/lib/libaudio.a b/src/big/mpp/kernel/lib/libaudio.a index 04afcad96..2d56d0b7a 100644 Binary files a/src/big/mpp/kernel/lib/libaudio.a and b/src/big/mpp/kernel/lib/libaudio.a differ diff --git a/src/big/mpp/kernel/lib/libcmpi.a b/src/big/mpp/kernel/lib/libcmpi.a index ca8a4a031..71ebf8cdc 100644 Binary files a/src/big/mpp/kernel/lib/libcmpi.a and b/src/big/mpp/kernel/lib/libcmpi.a differ diff --git a/src/big/mpp/kernel/lib/libdma.a b/src/big/mpp/kernel/lib/libdma.a index e6e63a232..7a8b056e0 100644 Binary files a/src/big/mpp/kernel/lib/libdma.a and b/src/big/mpp/kernel/lib/libdma.a differ diff --git a/src/big/mpp/kernel/lib/libdpu.a b/src/big/mpp/kernel/lib/libdpu.a index 699b21b80..0a8090d3f 100644 Binary files a/src/big/mpp/kernel/lib/libdpu.a and b/src/big/mpp/kernel/lib/libdpu.a differ diff --git a/src/big/mpp/kernel/lib/liblog.a b/src/big/mpp/kernel/lib/liblog.a index f1f6e47ff..89fafacf6 100644 Binary files a/src/big/mpp/kernel/lib/liblog.a and b/src/big/mpp/kernel/lib/liblog.a differ diff --git a/src/big/mpp/kernel/lib/libmmz.a b/src/big/mpp/kernel/lib/libmmz.a index cc4ce6ec2..e2d52f50b 100644 Binary files a/src/big/mpp/kernel/lib/libmmz.a and b/src/big/mpp/kernel/lib/libmmz.a differ diff --git a/src/big/mpp/kernel/lib/libsys.a b/src/big/mpp/kernel/lib/libsys.a index 54883df0c..af3e77835 100644 Binary files a/src/big/mpp/kernel/lib/libsys.a and b/src/big/mpp/kernel/lib/libsys.a differ diff --git a/src/big/mpp/kernel/lib/libvb.a b/src/big/mpp/kernel/lib/libvb.a index 7516073eb..450e4e989 100644 Binary files a/src/big/mpp/kernel/lib/libvb.a and b/src/big/mpp/kernel/lib/libvb.a differ diff --git a/src/big/mpp/kernel/lib/libvdss.a b/src/big/mpp/kernel/lib/libvdss.a index 86059d03a..878c33b69 100644 Binary files a/src/big/mpp/kernel/lib/libvdss.a and b/src/big/mpp/kernel/lib/libvdss.a differ diff --git a/src/big/mpp/kernel/lib/libvicap.a b/src/big/mpp/kernel/lib/libvicap.a index af63a88e9..55657be57 100644 Binary files a/src/big/mpp/kernel/lib/libvicap.a and b/src/big/mpp/kernel/lib/libvicap.a differ diff --git a/src/big/mpp/kernel/lib/libvo.a b/src/big/mpp/kernel/lib/libvo.a index 0931a59ca..c712ac4c6 100644 Binary files a/src/big/mpp/kernel/lib/libvo.a and b/src/big/mpp/kernel/lib/libvo.a differ diff --git a/src/big/mpp/kernel/lib/libvpu.a b/src/big/mpp/kernel/lib/libvpu.a index a74109ad4..e019e75a7 100644 Binary files a/src/big/mpp/kernel/lib/libvpu.a and b/src/big/mpp/kernel/lib/libvpu.a differ diff --git a/src/big/mpp/kernel/lib/libvvi.a b/src/big/mpp/kernel/lib/libvvi.a index 3c7db0156..02479779f 100644 Binary files a/src/big/mpp/kernel/lib/libvvi.a and b/src/big/mpp/kernel/lib/libvvi.a differ diff --git a/src/big/mpp/kernel/lib/libvvo.a b/src/big/mpp/kernel/lib/libvvo.a index 9371e915e..2681d1900 100644 Binary files a/src/big/mpp/kernel/lib/libvvo.a and b/src/big/mpp/kernel/lib/libvvo.a differ diff --git a/src/big/mpp/kernel/sensor/src/gc2053.c b/src/big/mpp/kernel/sensor/src/gc2053.c new file mode 100755 index 000000000..f05599b6c --- /dev/null +++ b/src/big/mpp/kernel/sensor/src/gc2053.c @@ -0,0 +1,982 @@ +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "sensor_dev.h" + +//#include +#include "io.h" + +// #include "gpio.h" +#include "drv_gpio.h" + +#include "k_board_config_comm.h" + +#define pr_info(...) //rt_kprintf(__VA_ARGS__) +#define pr_debug(...) //rt_kprintf(__VA_ARGS__) +#define pr_warn(...) //rt_kprintf(__VA_ARGS__) +#define pr_err(...) rt_kprintf(__VA_ARGS__) + +#define GC2053_REG_CHIP_ID_H 0xf0 +#define GC2053_REG_CHIP_ID_L 0xf1 + +#define GC2053_REG_LONG_EXP_TIME_H 0x3501 +#define GC2053_REG_LONG_EXP_TIME_L 0x3502 + +#define GC2053_REG_LONG_AGAIN 0x3509 +//#define GC2053_REG_LONG_AGAIN_H 0x350a +//#define GC2053_REG_LONG_AGAIN_L 0x350b + +#define GC2053_MIN_GAIN_STEP (1.0f/16.0f) + + + +static const k_sensor_reg gc2053_mipi4lane_1080p_30fps_linear[] = { + +#if 0 + {0xfe,0x80}, + {0xfe,0x80}, + {0xfe,0x80}, //pllmp_div = 128 + {0xfe,0x00}, + {0xf2,0x00}, + {0xf3,0x00}, + {0xf4,0x36}, //PLL_ldo_set = 3, spi_clk_div = 6 + {0xf5,0xc0}, + {0xf6,0x44}, //cp_clk_del = 0, cp_clk_div = 4 + {0xf7,0x01}, + {0xf8,0x63}, //pllmp_div = 99 + {0xf9,0x40}, //rpllckl_div = div4 + {0xfc,0x8e}, +/****CISCTL & ANALOG****/ + {0xfe,0x00}, + {0x87,0x18}, + {0xee,0x30}, + {0xd0,0xb7}, + {0x03,0x04}, //ET = 1120 + {0x04,0x60}, + {0x05,0x04}, //Line length = 1100 + {0x06,0x4c}, + {0x07,0x00}, //Vblank = 17 + {0x08,0x11}, + {0x09,0x00}, //Row start = 2 + {0x0a,0x02}, + {0x0b,0x00}, //Col Start = 2 + {0x0c,0x02}, + {0x0d,0x04}, //win_height = 1088, default win_width = 1936 + {0x0e,0x40}, + {0x12,0xe2}, + {0x13,0x16}, + {0x19,0x0a}, + {0x21,0x1c}, + {0x28,0x0a}, + {0x29,0x24}, + {0x2b,0x04}, + {0x32,0xf8}, + {0x37,0x03}, + {0x39,0x15}, + {0x43,0x07}, + {0x44,0x40}, + {0x46,0x0b}, + {0x4b,0x20}, + {0x4e,0x08}, + {0x55,0x20}, + {0x66,0x05}, + {0x67,0x05}, + {0x77,0x01}, + {0x78,0x00}, + {0x7c,0x93}, + {0x8c,0x12}, + {0x8d,0x92}, + {0x90,0x01}, + {0x9d,0x10}, + {0xce,0x7c}, + {0xd2,0x41}, + {0xd3,0xdc}, + {0xe6,0x50}, +/*gain*/ + {0xb6,0xc0}, + {0xb0,0x70}, + {0xb1,0x01}, //gain = 1.0x + {0xb2,0x00}, + {0xb3,0x00}, // + {0xb4,0x00}, + {0xb8,0x01}, //col_gain = 1.0x + {0xb9,0x00}, +/*blk*/ + {0x26,0x30}, + {0xfe,0x01}, + {0x40,0x23}, //black level & offset enable + {0x55,0x07}, + {0x60,0x40}, + {0xfe,0x04}, + {0x14,0x78}, + {0x15,0x78}, + {0x16,0x78}, + {0x17,0x78}, +/*window*/ + {0xfe,0x01}, + {0x92,0x00}, + {0x94,0x03}, + {0x95,0x04}, //out_win_height = 1080 + {0x96,0x38}, + {0x97,0x07}, //out_win_width = 1920 + {0x98,0x80}, +/*ISP*/ + {0xfe,0x01}, + {0x01,0x05}, + {0x02,0x89}, + {0x04,0x01}, + {0x07,0xa6}, + {0x08,0xa9}, + {0x09,0xa8}, + {0x0a,0xa7}, + {0x0b,0xff}, + {0x0c,0xff}, + {0x0f,0x00}, + {0x50,0x1c}, + {0x89,0x03}, + {0xfe,0x04}, + {0x28,0x86}, + {0x29,0x86}, + {0x2a,0x86}, + {0x2b,0x68}, + {0x2c,0x68}, + {0x2d,0x68}, + {0x2e,0x68}, + {0x2f,0x68}, + {0x30,0x4f}, + {0x31,0x68}, + {0x32,0x67}, + {0x33,0x66}, + {0x34,0x66}, + {0x35,0x66}, + {0x36,0x66}, + {0x37,0x66}, + {0x38,0x62}, + {0x39,0x62}, + {0x3a,0x62}, + {0x3b,0x62}, + {0x3c,0x62}, + {0x3d,0x62}, + {0x3e,0x62}, + {0x3f,0x62}, +/****DVP & MIPI****/ + {0xfe,0x01}, + {0x9a,0x06}, + {0xfe,0x00}, + {0x7b,0x2a}, + {0x23,0x2d}, + {0xfe,0x03}, + {0x01,0x27}, + {0x02,0x56}, + {0x03,0xb6}, + {0x12,0x80}, + {0x13,0x07}, + {0x15,0x12}, + {0xfe,0x00}, + {0x3e,0x91}, + +#else +/****system****/ + {0xfe, 0x80}, + {0xfe, 0x80}, + {0xfe, 0x80}, + {0xfe, 0x00}, + {0xf2, 0x00}, + {0xf3, 0x00}, + {0xf4, 0x36}, + {0xf5, 0xc0}, + {0xf6, 0x44}, + {0xf7, 0x01}, + {0xf8, 0x63}, + {0xf9, 0x40}, + {0xfc, 0x8e}, + /****CISCTL & ANALOG****/ + {0xfe, 0x00}, + {0x87, 0x18}, + {0xee, 0x30}, + {0xd0, 0xb7}, + {0x03, 0x04}, + {0x04, 0x60}, + {0x05, 0x04}, + {0x06, 0x4c}, + {0x07, 0x00}, + {0x08, 0x11}, + {0x09, 0x00}, + {0x0a, 0x02}, + {0x0b, 0x00}, + {0x0c, 0x02}, + {0x0d, 0x04}, + {0x0e, 0x40}, + {0x12, 0xe2}, + {0x13, 0x16}, + {0x19, 0x0a}, + {0x21, 0x1c}, + {0x28, 0x0a}, + {0x29, 0x24}, + {0x2b, 0x04}, + {0x32, 0xf8}, + {0x37, 0x03}, + {0x39, 0x15}, + {0x43, 0x07}, + {0x44, 0x40}, + {0x46, 0x0b}, + {0x4b, 0x20}, + {0x4e, 0x08}, + {0x55, 0x20}, + {0x66, 0x05}, + {0x67, 0x05}, + {0x77, 0x01}, + {0x78, 0x00}, + {0x7c, 0x93}, + {0x8c, 0x12}, + {0x8d, 0x92}, + {0x90, 0x01}, + {0x9d, 0x10}, + {0xce, 0x7c}, + {0xd2, 0x41}, + {0xd3, 0xdc}, + {0xe6, 0x50}, + /*gain*/ + {0xb6, 0xc0}, + {0xb0, 0x60}, + {0xb1, 0x01}, + {0xb2, 0x00}, + {0xb3, 0x00}, + {0xb4, 0x00}, + {0xb8, 0x01}, + {0xb9, 0x00}, + /*blk*/ + {0x26, 0x30}, + {0xfe, 0x01}, + {0x40, 0x23}, + {0x55, 0x07}, + {0x60, 0x40}, + {0xfe, 0x04}, + {0x14, 0x78}, + {0x15, 0x78}, + {0x16, 0x78}, + {0x17, 0x78}, + /*window*/ + {0xfe, 0x01}, + {0x92, 0x00}, + {0x94, 0x03}, + {0x95, 0x04},//[10:0]win_out_height-1080 + {0x96, 0x38}, + {0x97, 0x07},//[11:0]win_out_width-1920 + {0x98, 0x80}, + /*ISP*/ + {0xfe, 0x01}, + {0x01, 0x05}, + {0x02, 0x89}, + {0x04, 0x01}, + {0x07, 0xa6}, + {0x08, 0xa9}, + {0x09, 0xa8}, + {0x0a, 0xa7}, + {0x0b, 0xff}, + {0x0c, 0xff}, + {0x0f, 0x00}, + {0x50, 0x1c}, + {0x89, 0x03}, + {0xfe, 0x04}, + {0x28, 0x86}, + {0x29, 0x86}, + {0x2a, 0x86}, + {0x2b, 0x68}, + {0x2c, 0x68}, + {0x2d, 0x68}, + {0x2e, 0x68}, + {0x2f, 0x68}, + {0x30, 0x4f}, + {0x31, 0x68}, + {0x32, 0x67}, + {0x33, 0x66}, + {0x34, 0x66}, + {0x35, 0x66}, + {0x36, 0x66}, + {0x37, 0x66}, + {0x38, 0x62}, + {0x39, 0x62}, + {0x3a, 0x62}, + {0x3b, 0x62}, + {0x3c, 0x62}, + {0x3d, 0x62}, + {0x3e, 0x62}, + {0x3f, 0x62}, + /****DVP & MIPI****/ + {0xfe, 0x01}, + {0x9a, 0x06}, + {0x99, 0x00}, + {0xfe, 0x00}, + {0x7b, 0x2a}, + {0x23, 0x2d}, + {0xfe, 0x03}, + {0x01, 0x27}, + {0x02, 0x56}, + {0x03, 0x8e}, + {0x12, 0x80}, + {0x13, 0x07}, + {0xfe, 0x00}, + {0x3e, 0x81}, + {0x3e, 0x91}, + + {REG_NULL, 0x00}, +#endif +}; + + +static k_sensor_mode gc2053_mode_info[] = { + { + .index = 0, + .sensor_type = GC2053_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR, + .size = { + .bounds_width = 1920, + .bounds_height = 1080, + .top = 0, + .left = 0, + .width = 1920, + .height = 1080, + }, + .fps = 30000, + .hdr_mode = SENSOR_MODE_LINEAR, + .bit_width = 10, + .bayer_pattern = BAYER_PAT_RGGB, + .mipi_info = { + .csi_id = 0, + .mipi_lanes = 2, + .data_type = 0x1e, + }, + .reg_list = gc2053_mipi4lane_1080p_30fps_linear, + .mclk_setting = { + { + .mclk_setting_en = K_TRUE, + .setting.id = SENSOR_MCLK0, + .setting.mclk_sel = SENSOR_PLL1_CLK_DIV4, + .setting.mclk_div = 25, + }, + {K_FALSE}, + {K_FALSE}, + }, + }, +}; + +static k_bool gc2053_init_flag = K_FALSE; +static k_sensor_mode *current_mode = NULL; + +static int gc2053_power_rest(k_s32 on) +{ + #define VICAP_GC2053_RST_GPIO (0) //24// + + kd_pin_mode(VICAP_GC2053_RST_GPIO, GPIO_DM_OUTPUT); + + if (on) { + kd_pin_write(VICAP_GC2053_RST_GPIO, GPIO_PV_HIGH); // GPIO_PV_LOW GPIO_PV_HIGH + rt_thread_mdelay(100); + kd_pin_write(VICAP_GC2053_RST_GPIO, GPIO_PV_LOW); // GPIO_PV_LOW GPIO_PV_HIGH + rt_thread_mdelay(100); + kd_pin_write(VICAP_GC2053_RST_GPIO, GPIO_PV_HIGH); // GPIO_PV_LOW GPIO_PV_HIGH + } else { + kd_pin_write(VICAP_GC2053_RST_GPIO, GPIO_PV_LOW); // GPIO_PV_LOW GPIO_PV_HIGH + } + rt_thread_mdelay(1); + + return 0; +} + +static k_s32 gc2053_sensor_get_chip_id(void *ctx, k_u32 *chip_id) +{ + k_s32 ret = 0; + k_u16 id_high = 0; + k_u16 id_low = 0; + struct sensor_driver_dev *dev = ctx; + pr_info("%s enter\n", __func__); + + ret = sensor_reg_read(&dev->i2c_info, GC2053_REG_CHIP_ID_H, &id_high); + ret |= sensor_reg_read(&dev->i2c_info, GC2053_REG_CHIP_ID_L, &id_low); + if (ret) { + pr_err("%s error\n", __func__); + return -1; + } + + *chip_id = (id_high << 8) | id_low; + rt_kprintf("%s chip_id[0x%08X]\n", __func__, *chip_id); + return ret; +} + + +static int gc2053_i2c_init(k_sensor_i2c_info *i2c_info) +{ + i2c_info->i2c_bus = rt_i2c_bus_device_find(i2c_info->i2c_name); + if (i2c_info->i2c_bus == RT_NULL) + { + pr_err("can't find %s deivce", i2c_info->i2c_name); + return RT_ERROR; + } + + return 0; +} + +static k_s32 gc2053_sensor_power_on(void *ctx, k_s32 on) +{ + k_s32 ret = 0; + struct sensor_driver_dev *dev = ctx; + k_u32 chip_id = 0; + pr_info("%s enter\n", __func__); + if (on) { + // if (!gc2053_init_flag) { + gc2053_power_rest(on); + gc2053_i2c_init(&dev->i2c_info); + // } + gc2053_sensor_get_chip_id(ctx, &chip_id); + } else { + gc2053_init_flag = K_FALSE; + gc2053_power_rest(on); + } + + return ret; +} + +static k_s32 gc2053_sensor_init(void *ctx, k_sensor_mode mode) +{ + k_s32 ret = 0; + k_s32 i = 0; + struct sensor_driver_dev *dev = ctx; + pr_info("%s enter, sensor_type:%d\n", __func__, mode.sensor_type); + + if (current_mode == NULL) { + for (i = 0; i < sizeof(gc2053_mode_info) / sizeof(k_sensor_mode); i++) { + if (gc2053_mode_info[i].sensor_type == mode.sensor_type) { + current_mode = &(gc2053_mode_info[i]); + dev->sensor_mode = &(gc2053_mode_info[i]); + break; + } + } + } + + if (current_mode == NULL) { + pr_err("%s, current mode not exit.\n", __func__); + return -1; + } + + switch (current_mode->index) { + case 0: + case 1: + case 2: + case 3: + case 6: + + ret = sensor_reg_list_write(&dev->i2c_info, current_mode->reg_list); + + + current_mode->ae_info.frame_length = 2200; + current_mode->ae_info.cur_frame_length = current_mode->ae_info.frame_length; + current_mode->ae_info.one_line_exp_time = 0.00001515;//s + current_mode->ae_info.gain_accuracy = 1024; + + current_mode->ae_info.min_gain = 1.0; + current_mode->ae_info.max_gain = 8.0; + + current_mode->ae_info.int_time_delay_frame = 0; + current_mode->ae_info.gain_delay_frame = 0; + //current_mode->ae_info.ae_min_interval_frame =1.0; + current_mode->ae_info.color_type = SENSOR_MONO; //mono sensor + + current_mode->ae_info.integration_time_increment = current_mode->ae_info.one_line_exp_time; + current_mode->ae_info.gain_increment = GC2053_MIN_GAIN_STEP; + + current_mode->ae_info.max_integraion_line = current_mode->ae_info.cur_frame_length - 1; //2.5ms //197; // 3ms + current_mode->ae_info.min_integraion_line = 1; + + current_mode->ae_info.max_vs_integraion_line = current_mode->ae_info.frame_length; + current_mode->ae_info.min_vs_integraion_line = current_mode->ae_info.frame_length - 1; + + current_mode->ae_info.max_integraion_time = \ + current_mode->ae_info.integration_time_increment * \ + current_mode->ae_info.max_integraion_line; + + current_mode->ae_info.min_integraion_time = \ + current_mode->ae_info.integration_time_increment * \ + current_mode->ae_info.min_integraion_line; + + current_mode->ae_info.max_vs_integraion_time = \ + current_mode->ae_info.integration_time_increment * \ + current_mode->ae_info.max_vs_integraion_line; + + current_mode->ae_info.min_vs_integraion_time = \ + current_mode->ae_info.integration_time_increment * \ + current_mode->ae_info.min_vs_integraion_line; + + current_mode->ae_info.cur_integration_time = 0.0; + current_mode->ae_info.cur_vs_integration_time = 0.0; + + + current_mode->ae_info.cur_again = 0.0; + current_mode->ae_info.cur_dgain = 0.0; + + current_mode->ae_info.cur_vs_again = 0.0; + current_mode->ae_info.cur_vs_dgain = 0.0; + + current_mode->ae_info.a_gain.min = 1.0; + current_mode->ae_info.a_gain.max = 15.9375; + current_mode->ae_info.a_gain.step = (1.0f/16.0f); + + current_mode->ae_info.a_vs_gain.min = 1.0; + current_mode->ae_info.a_vs_gain.max = 15.9375; + current_mode->ae_info.a_vs_gain.step = (1.0f/16.0f);// + + current_mode->ae_info.d_gain.max = 1.0; + current_mode->ae_info.d_gain.min = 1.0; + current_mode->ae_info.d_gain.step = (1.0f/1024.0f); + + current_mode->ae_info.d_vs_gain.max = 1.0; + current_mode->ae_info.d_vs_gain.min = 1.0; + current_mode->ae_info.d_vs_gain.step = (1.0f/1024.0f);// + current_mode->ae_info.cur_fps = current_mode->fps; + break; + + + default: + break; + } + + k_u16 again_h; + k_u16 again_l; + k_u16 exp_time_h, exp_time_l; + k_u16 exp_time; + float again = 0, dgain = 0; + + // ret = sensor_reg_read(&dev->i2c_info, GC2053_REG_LONG_AGAIN, &again_h); + //ret = sensor_reg_read(&dev->i2c_info, GC2053_REG_LONG_AGAIN_H, &again_h); + //ret = sensor_reg_read(&dev->i2c_info, GC2053_REG_LONG_AGAIN_L, &again_l); + again = 1.0;// (float)again_h / 16.0f; + + dgain = 1.0; + current_mode->ae_info.cur_gain = again * dgain; + current_mode->ae_info.cur_long_gain = current_mode->ae_info.cur_gain; + current_mode->ae_info.cur_vs_gain = current_mode->ae_info.cur_gain; + + // ret = sensor_reg_read(&dev->i2c_info, GC2053_REG_LONG_EXP_TIME_H, &exp_time_h); + // ret = sensor_reg_read(&dev->i2c_info, GC2053_REG_LONG_EXP_TIME_L, &exp_time_l); + exp_time = (exp_time_h << 4) | ((exp_time_l >> 4) & 0x0F); + + current_mode->ae_info.cur_integration_time = exp_time * current_mode->ae_info.one_line_exp_time; + gc2053_init_flag = K_TRUE; + + return ret; +} + + +k_s32 gc2053_sensor_get_mode(void *ctx, k_sensor_mode *mode) +{ + k_s32 ret = -1; + + pr_info("%s enter, sensor_type(%d)\n", __func__, mode->sensor_type); + + for (k_s32 i = 0; i < sizeof(gc2053_mode_info) / sizeof(k_sensor_mode); i++) { + if (gc2053_mode_info[i].sensor_type == mode->sensor_type) { + memcpy(mode, &gc2053_mode_info[i], sizeof(k_sensor_mode)); + current_mode = &(gc2053_mode_info[i]); + return 0; + } + } + pr_info("%s, the mode not exit.\n", __func__); + + return ret; +} + +k_s32 gc2053_sensor_set_mode(void *ctx, k_sensor_mode mode) +{ + k_s32 ret = 0; + + pr_info("%s enter\n", __func__); + + return ret; +} + +k_s32 gc2053_sensor_enum_mode(void *ctx, k_sensor_enum_mode *enum_mode) +{ + k_s32 ret = 0; + + pr_info("%s enter\n", __func__); + memset(enum_mode, 0, sizeof(k_sensor_enum_mode)); + + return ret; +} + +k_s32 gc2053_sensor_get_caps(void *ctx, k_sensor_caps *caps) +{ + k_s32 ret = 0; + + pr_info("%s enter\n", __func__); + memset(caps, 0, sizeof(k_sensor_caps)); + caps->bit_width = current_mode->bit_width; + caps->bayer_pattern = current_mode->bayer_pattern; + caps->resolution.width = current_mode->size.width; + caps->resolution.height = current_mode->size.height; + + return ret; +} + +k_s32 gc2053_sensor_conn_check(void *ctx, k_s32 *conn) +{ + k_s32 ret = 0; + + pr_info("%s enter\n", __func__); + *conn = 1; + + return ret; +} + +k_s32 gc2053_sensor_set_stream(void *ctx, k_s32 enable) +{ + k_s32 ret = 0; + struct sensor_driver_dev *dev = ctx; + + pr_info("%s enter, enable(%d)\n", __func__, enable); + if (enable) { + // ret = sensor_reg_write(&dev->i2c_info, 0x0100, 0x01); + } else { + // ret = sensor_reg_write(&dev->i2c_info, 0x0100, 0x00); + } + pr_info("%s exit, ret(%d)\n", __func__, ret); + + return ret; +} + +k_s32 gc2053_sensor_get_again(void *ctx, k_sensor_gain *gain) +{ + k_s32 ret = 0; + + pr_info("%s enter\n", __func__); + + if (current_mode->hdr_mode == SENSOR_MODE_LINEAR) { + gain->gain[SENSOR_LINEAR_PARAS] = current_mode->ae_info.cur_again; + } else if (current_mode->hdr_mode == SENSOR_MODE_HDR_STITCH) { + gain->gain[SENSOR_DUAL_EXP_L_PARAS] = current_mode->ae_info.cur_again; + gain->gain[SENSOR_DUAL_EXP_S_PARAS] = current_mode->ae_info.cur_vs_again; + } else { + pr_err("%s, unsupport exposure frame.\n", __func__); + return -1; + } + + return ret; +} + +k_s32 gc2053_sensor_set_again(void *ctx, k_sensor_gain gain) +{ + k_s32 ret = 0; + k_u16 again; + struct sensor_driver_dev *dev = ctx; + + if (current_mode->hdr_mode == SENSOR_MODE_LINEAR) { + again = (k_u16)(gain.gain[SENSOR_LINEAR_PARAS] * 16 + 0.5); + //if(current_mode->sensor_again !=again) + { + // ret = sensor_reg_write(&dev->i2c_info, GC2053_REG_LONG_AGAIN,(again & 0xff)); + current_mode->sensor_again = again; + } + current_mode->ae_info.cur_again = (float)current_mode->sensor_again/16.0f; + } else if (current_mode->hdr_mode == SENSOR_MODE_HDR_STITCH) { + again = (k_u16)(gain.gain[SENSOR_DUAL_EXP_L_PARAS]* 16 + 0.5); + // ret = sensor_reg_write(&dev->i2c_info, GC2053_REG_LONG_AGAIN,(again & 0xff)); + current_mode->ae_info.cur_again = (float)again/16.0f; + + again = (k_u16)(gain.gain[SENSOR_DUAL_EXP_S_PARAS] * 16 + 0.5); + //TODO + current_mode->ae_info.cur_vs_again = (float)again/16.0f; + } else { + pr_err("%s, unsupport exposure frame.\n", __func__); + return -1; + } + pr_debug("%s, hdr_mode(%d), cur_again(%u)\n", __func__, current_mode->hdr_mode, (k_u32)(current_mode->ae_info.cur_again*1000) ); + + return ret; +} + +k_s32 gc2053_sensor_get_dgain(void *ctx, k_sensor_gain *gain) +{ + k_s32 ret = 0; + + pr_info("%s enter\n", __func__); + + if (current_mode->hdr_mode == SENSOR_MODE_LINEAR) { + gain->gain[SENSOR_LINEAR_PARAS] = current_mode->ae_info.cur_dgain; + } else if (current_mode->hdr_mode == SENSOR_MODE_HDR_STITCH) { + gain->gain[SENSOR_DUAL_EXP_L_PARAS] = current_mode->ae_info.cur_dgain; + gain->gain[SENSOR_DUAL_EXP_S_PARAS] = current_mode->ae_info.cur_vs_dgain; + } else { + pr_err("%s, unsupport exposure frame.\n", __func__); + return -1; + } + + return ret; +} + +k_s32 gc2053_sensor_set_dgain(void *ctx, k_sensor_gain gain) +{ + k_s32 ret = 0; + k_u32 dgain; + struct sensor_driver_dev *dev = ctx; + + pr_info("%s enter hdr_mode(%d)\n", __func__, current_mode->hdr_mode); + if (current_mode->hdr_mode == SENSOR_MODE_LINEAR) { + dgain = (k_u32)(gain.gain[SENSOR_LINEAR_PARAS] * 1024); + //ret = sensor_reg_write(&dev->i2c_info, GC2053_REG_LONG_AGAIN_H,(again & 0x0300)>>8); + //ret |= sensor_reg_write(&dev->i2c_info, GC2053_REG_LONG_AGAIN_L,(again & 0xff)); + current_mode->ae_info.cur_dgain = (float)dgain/1024.0f; + + } else if (current_mode->hdr_mode == SENSOR_MODE_HDR_STITCH) { + dgain = (k_u32)(gain.gain[SENSOR_DUAL_EXP_L_PARAS] * 1024); + //ret = sensor_reg_write(&dev->i2c_info, GC2053_REG_LONG_AGAIN_H,(again & 0x0300)>>8); + //ret |= sensor_reg_write(&dev->i2c_info, GC2053_REG_LONG_AGAIN_L,(again & 0xff)); + current_mode->ae_info.cur_dgain = (float)dgain/1024.0f; + + dgain = (k_u32)(gain.gain[SENSOR_DUAL_EXP_S_PARAS] * 1024); + //TODO wirte vs gain register + current_mode->ae_info.cur_vs_dgain = (float)dgain/1024.0f; + } else { + pr_err("%s, unsupport exposure frame.\n", __func__); + return -1; + } + current_mode->ae_info.cur_gain = current_mode->ae_info.cur_again * current_mode->ae_info.cur_dgain; + pr_debug("%s,cur_gain(%d)\n", __func__, (k_u32)(current_mode->ae_info.cur_gain*10000)); + + return ret; +} + +k_s32 gc2053_sensor_get_intg_time(void *ctx, k_sensor_intg_time *time) +{ + k_s32 ret = 0; + + pr_info("%s enter\n", __func__); + + if (current_mode->hdr_mode == SENSOR_MODE_LINEAR) { + time->intg_time[SENSOR_LINEAR_PARAS] = current_mode->ae_info.cur_integration_time; + } else if (current_mode->hdr_mode == SENSOR_MODE_HDR_STITCH) { + time->intg_time[SENSOR_DUAL_EXP_L_PARAS] = current_mode->ae_info.cur_integration_time; + time->intg_time[SENSOR_DUAL_EXP_S_PARAS] = current_mode->ae_info.cur_vs_integration_time; + } else { + pr_err("%s, unsupport exposure frame.\n", __func__); + return -1; + } + + return ret; +} + +k_s32 gc2053_sensor_set_intg_time(void *ctx, k_sensor_intg_time time) +{ + k_s32 ret = 0; + k_u16 exp_line = 0; + k_u16 Strobe_StartPoint = 0; + k_u16 Strobe_Width = 0; + float integraion_time = 0; + struct sensor_driver_dev *dev = ctx; + + if (current_mode->hdr_mode == SENSOR_MODE_LINEAR) { + integraion_time = time.intg_time[SENSOR_LINEAR_PARAS]; + + exp_line = integraion_time / current_mode->ae_info.one_line_exp_time; + exp_line = MIN(current_mode->ae_info.max_integraion_line, MAX(1, exp_line)); + //if (current_mode->et_line != exp_line) + { + // ret |= sensor_reg_write(&dev->i2c_info, GC2053_REG_LONG_EXP_TIME_H, ( exp_line >> 4) & 0xff); + // ret |= sensor_reg_write(&dev->i2c_info, GC2053_REG_LONG_EXP_TIME_L, ( exp_line << 4) & 0xf0); + current_mode->et_line = exp_line; +/* //set strobe + Strobe_Width = (exp_line + 52)/3; + Strobe_StartPoint = Sensor_VTS - Strobe_Width - 7; + //Strobe_StartPoint = Sensor_VTS - Strobe_Width; + + ret |= sensor_reg_write(&dev->i2c_info, 0x3927, ( Strobe_Width >> 8) & 0xff); //strobe width + ret |= sensor_reg_write(&dev->i2c_info, 0x3928, Strobe_Width & 0xff); + ret |= sensor_reg_write(&dev->i2c_info, 0x3929, ( Strobe_StartPoint >> 8) & 0xff); //strobe start point + ret |= sensor_reg_write(&dev->i2c_info, 0x392a, Strobe_StartPoint & 0xff);*/ + } + current_mode->ae_info.cur_integration_time = (float)current_mode->et_line * current_mode->ae_info.one_line_exp_time; + } else if (current_mode->hdr_mode == SENSOR_MODE_HDR_STITCH) { + integraion_time = time.intg_time[SENSOR_DUAL_EXP_L_PARAS]; + exp_line = integraion_time / current_mode->ae_info.one_line_exp_time; + exp_line = MIN(current_mode->ae_info.max_integraion_line, MAX(1, exp_line)); + + current_mode->ae_info.cur_integration_time = (float)exp_line * current_mode->ae_info.one_line_exp_time; + + integraion_time = time.intg_time[SENSOR_DUAL_EXP_S_PARAS]; + exp_line = integraion_time / current_mode->ae_info.one_line_exp_time; + exp_line = MIN(current_mode->ae_info.max_integraion_line, MAX(1, exp_line)); + + current_mode->ae_info.cur_vs_integration_time = (float)exp_line * current_mode->ae_info.one_line_exp_time; + } else { + pr_err("%s, unsupport exposure frame.\n", __func__); + return -1; + } + pr_debug("%s hdr_mode(%d), exp_line(%d), integraion_time(%u)\n",\ + __func__, current_mode->hdr_mode, exp_line, (k_u32)(integraion_time * 1000000000)); + + return ret; +} + +k_s32 gc2053_sensor_get_exp_parm(void *ctx, k_sensor_exposure_param *exp_parm) +{ + k_s32 ret = 0; + + pr_info("%s enter\n", __func__); + memset(exp_parm, 0, sizeof(k_sensor_exposure_param)); + + return ret; +} + +k_s32 gc2053_sensor_set_exp_parm(void *ctx, k_sensor_exposure_param exp_parm) +{ + k_s32 ret = 0; + + pr_info("%s enter\n", __func__); + + return ret; +} + +k_s32 gc2053_sensor_get_fps(void *ctx, k_u32 *fps) +{ + k_s32 ret = 0; + + pr_info("%s enter\n", __func__); + *fps = 30000; + + return ret; +} + +k_s32 gc2053_sensor_set_fps(void *ctx, k_u32 fps) +{ + k_s32 ret = 0; + + pr_info("%s enter\n", __func__); + + return ret; +} + +k_s32 gc2053_sensor_get_isp_status(void *ctx, k_sensor_isp_status *staus) +{ + k_s32 ret = 0; + + pr_info("%s enter\n", __func__); + memset(staus, 0, sizeof(k_sensor_isp_status)); + + return ret; +} + +k_s32 gc2053_sensor_set_blc(void *ctx, k_sensor_blc blc) +{ + k_s32 ret = 0; + + pr_info("%s enter\n", __func__); + + return ret; +} + +k_s32 gc2053_sensor_set_wb(void *ctx, k_sensor_white_balance wb) +{ + k_s32 ret = 0; + + pr_info("%s enter\n", __func__); + + return ret; +} + +k_s32 gc2053_sensor_get_tpg(void *ctx, k_sensor_test_pattern *tpg) +{ + k_s32 ret = 0; + + pr_info("%s enter\n", __func__); + memset(tpg, 0, sizeof(k_sensor_test_pattern)); + + return ret; +} + +k_s32 gc2053_sensor_set_tpg(void *ctx, k_sensor_test_pattern tpg) +{ + k_s32 ret = 0; + + pr_info("%s enter\n", __func__); + + return ret; +} + +k_s32 gc2053_sensor_get_expand_curve(void *ctx, k_sensor_compand_curve *curve) +{ + k_s32 ret = 0; + + pr_info("%s enter\n", __func__); + memset(curve, 0, sizeof(k_sensor_compand_curve)); + + return ret; +} + +k_s32 gc2053_sensor_get_otp_data(void *ctx, void *data) +{ + k_s32 ret = 0; + + pr_info("%s enter\n", __func__); + memset(data, 0, sizeof(void *)); + + return ret; +} + +struct sensor_driver_dev gc2053_sensor_drv = { + .i2c_info = { + .i2c_bus = NULL, + .i2c_name = "i2c3", //"i2c0", //"i2c3", + .slave_addr = 0x37, + .reg_addr_size = SENSOR_REG_VALUE_8BIT, + .reg_val_size = SENSOR_REG_VALUE_8BIT, + }, + .sensor_name = "gc2053", + .sensor_func = { + .sensor_power = gc2053_sensor_power_on, + .sensor_init = gc2053_sensor_init, + .sensor_get_chip_id = gc2053_sensor_get_chip_id, + .sensor_get_mode = gc2053_sensor_get_mode, + .sensor_set_mode = gc2053_sensor_set_mode, + .sensor_enum_mode = gc2053_sensor_enum_mode, + .sensor_get_caps = gc2053_sensor_get_caps, + .sensor_conn_check = gc2053_sensor_conn_check, + .sensor_set_stream = gc2053_sensor_set_stream, + .sensor_get_again = gc2053_sensor_get_again, + .sensor_set_again = gc2053_sensor_set_again, + .sensor_get_dgain = gc2053_sensor_get_dgain, + .sensor_set_dgain = gc2053_sensor_set_dgain, + .sensor_get_intg_time = gc2053_sensor_get_intg_time, + .sensor_set_intg_time = gc2053_sensor_set_intg_time, + .sensor_get_exp_parm = gc2053_sensor_get_exp_parm, + .sensor_set_exp_parm = gc2053_sensor_set_exp_parm, + .sensor_get_fps = gc2053_sensor_get_fps, + .sensor_set_fps = gc2053_sensor_set_fps, + .sensor_get_isp_status = gc2053_sensor_get_isp_status, + .sensor_set_blc = gc2053_sensor_set_blc, + .sensor_set_wb = gc2053_sensor_set_wb, + .sensor_get_tpg = gc2053_sensor_get_tpg, + .sensor_set_tpg = gc2053_sensor_set_tpg, + .sensor_get_expand_curve = gc2053_sensor_get_expand_curve, + .sensor_get_otp_data = gc2053_sensor_get_otp_data, + }, +}; diff --git a/src/big/mpp/kernel/sensor/src/ov5647_csi1_drv.c b/src/big/mpp/kernel/sensor/src/ov5647_csi1_drv.c index 930169f10..de61233a9 100755 --- a/src/big/mpp/kernel/sensor/src/ov5647_csi1_drv.c +++ b/src/big/mpp/kernel/sensor/src/ov5647_csi1_drv.c @@ -369,6 +369,106 @@ static const k_sensor_reg ov5647_640x480_10bpp[] = { {REG_NULL, 0x00}, }; + +static const k_sensor_reg ov5647_mipi2lane_1080p_30fps_flip_linear[] = { + //pixel_rate = 81666700 + {0x0103, 0x01}, + {0x0100, 0x00}, + {0x3034, 0x1a}, + {0x3035, 0x21}, + {0x3036, 0x62}, + {0x303c, 0x11}, + {0x3106, 0xf5}, + {0x3821, 0x00}, + {0x3820, 0x02}, //0x00 + {0x3827, 0xec}, + {0x370c, 0x03}, + {0x3612, 0x5b}, + {0x3618, 0x04}, + {0x5000, 0x06}, + {0x5001, 0x00}, // set awb disble + {0x5002, 0x00},//41 + {0x5003, 0x08}, + {0x5a00, 0x08}, + {0x3000, 0x00}, + {0x3001, 0x00}, + {0x3002, 0x00}, + {0x3016, 0x08}, + {0x3017, 0xe0}, + {0x3018, 0x44}, + {0x301c, 0xf8}, + {0x301d, 0xf0}, + {0x3a18, 0x03},//00 + {0x3a19, 0xff},//f8 + {0x3c01, 0x80}, + {0x3b07, 0x0c}, + {0x380c, 0x08}, // h totle high + {0x380d, 0xdf}, // h totle low + {0x380e, 0x04}, // v totle high + {0x380f, 0xaf}, // v totle low + {0x3814, 0x11}, + {0x3815, 0x11}, + {0x3708, 0x64}, + {0x3709, 0x12}, + {0x3808, 0x07}, + {0x3809, 0x80}, + {0x380a, 0x04}, + {0x380b, 0x38}, + {0x3800, 0x01}, + {0x3801, 0x5c}, + {0x3802, 0x01}, + {0x3803, 0xb2}, + {0x3804, 0x08}, + {0x3805, 0xe3}, + {0x3806, 0x05}, + {0x3807, 0xf1}, + {0x3811, 0x04}, + {0x3813, 0x02}, + {0x3630, 0x2e}, + {0x3632, 0xe2}, + {0x3633, 0x23}, + {0x3634, 0x44}, + {0x3636, 0x06}, + {0x3620, 0x64}, + {0x3621, 0xe0}, + {0x3600, 0x37}, + {0x3704, 0xa0}, + {0x3703, 0x5a}, + {0x3715, 0x78}, + {0x3717, 0x01}, + {0x3731, 0x02}, + {0x370b, 0x60}, + {0x3705, 0x1a}, + {0x3f05, 0x02}, + {0x3f06, 0x10}, + {0x3f01, 0x0a}, + {0x3a00, 0x00}, + {0x3a08, 0x01}, + {0x3a09, 0x4b}, + {0x3a0a, 0x01}, + {0x3a0b, 0x13}, + {0x3a0d, 0x04}, + {0x3a0e, 0x03}, + {0x3a0f, 0x58}, + {0x3a10, 0x50}, + {0x3a1b, 0x58}, + {0x3a1e, 0x50}, + {0x3a11, 0x60}, + {0x3a1f, 0x28}, + {0x4001, 0x02}, + {0x4004, 0x04}, + {0x4000, 0x09}, + {0x4837, 0x19}, + {0x4800, 0x34}, + {0x3501, 0x02}, //ET = 42 lines + {0x3502, 0xa0}, + {0x3503, 0x07}, //0x0f + {0x350b, 0x10}, // gain + // {0x0100, 0x01}, + {REG_NULL, 0x00}, +}; + + static k_sensor_mode ov5647_mode_info[] = { { .index = 0, @@ -439,7 +539,6 @@ static k_sensor_mode ov5647_mode_info[] = { .reg_list = ov5647_640x480_10bpp, .mclk_setting = {{K_FALSE}, {K_FALSE}, {K_FALSE}}, }, - { .index = 3, .sensor_type = OV_OV5647_MIPI_CSI1_1920X1080_30FPS_10BIT_LINEAR, @@ -472,13 +571,37 @@ static k_sensor_mode ov5647_mode_info[] = { {K_FALSE}, }, }, + { + .index = 4, + .sensor_type = OV_OV5647_MIPI_CSI1_1920X1080_30FPS_10BIT_LINEAR_V2, + .size = { + .bounds_width = 1920, + .bounds_height = 1080, + .top = 0, + .left = 0, + .width = 1920, + .height = 1080, + }, + .fps = 30000, + .hdr_mode = SENSOR_MODE_LINEAR, + .bit_width = 10, + .bayer_pattern = BAYER_PAT_GRBG, + .mipi_info = { + .csi_id = 0, + .mipi_lanes = 2, + .data_type = 0x2B, //RAW10 + }, + .reg_list = ov5647_mipi2lane_1080p_30fps_flip_linear, + .mclk_setting = {{K_FALSE}, {K_FALSE}, {K_FALSE}}, + }, + }; static k_sensor_mode *current_mode = NULL; static int ov5647_power_rest(k_s32 on) { - #define OV5647_CAM_PIN_CSI1 (23) + rt_kprintf("ov5647_power_rest OV5647_CAM_PIN_CSI1 is %d \n", OV5647_CAM_PIN_CSI1); // rst @@ -612,19 +735,20 @@ static k_s32 ov5647_sensor_init(void *ctx, k_sensor_mode mode) switch (current_mode->index) { case 0: case 3: + case 4: ret = sensor_reg_list_write(&dev->i2c_info, current_mode->reg_list); // default: // ret = sensor_reg_list_write(&dev->i2c_info, current_mode->reg_list); - current_mode->ae_info.frame_length = 1126; + current_mode->ae_info.frame_length = 1199; current_mode->ae_info.cur_frame_length = current_mode->ae_info.frame_length; - current_mode->ae_info.one_line_exp_time = 0.00002958;//0.00003025 + current_mode->ae_info.one_line_exp_time = 0.000027808;//0.00003025 current_mode->ae_info.gain_accuracy = 1024; current_mode->ae_info.min_gain = 1.0; - current_mode->ae_info.max_gain = 63.9375; + current_mode->ae_info.max_gain = 8.0;//63.9375; current_mode->ae_info.int_time_delay_frame = 2; current_mode->ae_info.gain_delay_frame = 2; @@ -633,14 +757,14 @@ static k_s32 ov5647_sensor_init(void *ctx, k_sensor_mode mode) current_mode->ae_info.integration_time_increment = current_mode->ae_info.one_line_exp_time; current_mode->ae_info.gain_increment = (1.0f/16.0f); - current_mode->ae_info.max_long_integraion_line = current_mode->ae_info.frame_length; - current_mode->ae_info.min_long_integraion_line = current_mode->ae_info.frame_length - 1; + current_mode->ae_info.max_long_integraion_line = current_mode->ae_info.frame_length - 12; + current_mode->ae_info.min_long_integraion_line = 2; - current_mode->ae_info.max_integraion_line = current_mode->ae_info.frame_length; - current_mode->ae_info.min_integraion_line = 1; + current_mode->ae_info.max_integraion_line = current_mode->ae_info.frame_length - 12; + current_mode->ae_info.min_integraion_line = 2; - current_mode->ae_info.max_vs_integraion_line = current_mode->ae_info.frame_length; - current_mode->ae_info.min_vs_integraion_line = current_mode->ae_info.frame_length - 1; + current_mode->ae_info.max_vs_integraion_line = current_mode->ae_info.frame_length - 12; + current_mode->ae_info.min_vs_integraion_line = 2; current_mode->ae_info.max_long_integraion_time = \ current_mode->ae_info.integration_time_increment * \ @@ -680,15 +804,15 @@ static k_s32 ov5647_sensor_init(void *ctx, k_sensor_mode mode) current_mode->ae_info.cur_vs_dgain = 0.0; current_mode->ae_info.a_long_gain.min = 1.0; - current_mode->ae_info.a_long_gain.max = 63.9375; + current_mode->ae_info.a_long_gain.max = 8.0; current_mode->ae_info.a_long_gain.step = (1.0f/16.0f); current_mode->ae_info.a_gain.min = 1.0; - current_mode->ae_info.a_gain.max = 63.9375; + current_mode->ae_info.a_gain.max = 8.0; current_mode->ae_info.a_gain.step = (1.0f/16.0f); current_mode->ae_info.a_vs_gain.min = 1.0; - current_mode->ae_info.a_vs_gain.max = 63.9375; + current_mode->ae_info.a_vs_gain.max = 8.0; current_mode->ae_info.a_vs_gain.step = (1.0f/16.0f); current_mode->ae_info.d_long_gain.max = 1.0; @@ -718,7 +842,7 @@ static k_s32 ov5647_sensor_init(void *ctx, k_sensor_mode mode) current_mode->ae_info.gain_accuracy = 1024; current_mode->ae_info.min_gain = 1.0; - current_mode->ae_info.max_gain = 63.9375; + current_mode->ae_info.max_gain = 8.0;//63.9375; current_mode->ae_info.int_time_delay_frame = 2; current_mode->ae_info.gain_delay_frame = 2; @@ -727,14 +851,14 @@ static k_s32 ov5647_sensor_init(void *ctx, k_sensor_mode mode) current_mode->ae_info.integration_time_increment = current_mode->ae_info.one_line_exp_time; current_mode->ae_info.gain_increment = (1.0f/16.0f); - current_mode->ae_info.max_long_integraion_line = current_mode->ae_info.frame_length; - current_mode->ae_info.min_long_integraion_line = current_mode->ae_info.frame_length - 1; + current_mode->ae_info.max_long_integraion_line = current_mode->ae_info.frame_length - 12; + current_mode->ae_info.min_long_integraion_line = 2; - current_mode->ae_info.max_integraion_line = current_mode->ae_info.frame_length; - current_mode->ae_info.min_integraion_line = 1; + current_mode->ae_info.max_integraion_line = current_mode->ae_info.frame_length - 12; + current_mode->ae_info.min_integraion_line = 2; - current_mode->ae_info.max_vs_integraion_line = current_mode->ae_info.frame_length; - current_mode->ae_info.min_vs_integraion_line = current_mode->ae_info.frame_length - 1; + current_mode->ae_info.max_vs_integraion_line = current_mode->ae_info.frame_length - 12; + current_mode->ae_info.min_vs_integraion_line = 2; current_mode->ae_info.max_long_integraion_time = \ current_mode->ae_info.integration_time_increment * \ @@ -774,15 +898,15 @@ static k_s32 ov5647_sensor_init(void *ctx, k_sensor_mode mode) current_mode->ae_info.cur_vs_dgain = 0.0; current_mode->ae_info.a_long_gain.min = 1.0; - current_mode->ae_info.a_long_gain.max = 63.9375; + current_mode->ae_info.a_long_gain.max = 8.0; current_mode->ae_info.a_long_gain.step = (1.0f/16.0f); current_mode->ae_info.a_gain.min = 1.0; - current_mode->ae_info.a_gain.max = 63.9375; + current_mode->ae_info.a_gain.max = 8.0; current_mode->ae_info.a_gain.step = (1.0f/16.0f); current_mode->ae_info.a_vs_gain.min = 1.0; - current_mode->ae_info.a_vs_gain.max = 63.9375; + current_mode->ae_info.a_vs_gain.max = 8.0; current_mode->ae_info.a_vs_gain.step = (1.0f/16.0f); current_mode->ae_info.d_long_gain.max = 1.0; @@ -913,6 +1037,8 @@ static k_s32 ov5647_sensor_set_stream(void *ctx, k_s32 enable) // sensor_reg_list_write(&dev->i2c_info, sensor_oe_enable_regs); ret = sensor_reg_write(&dev->i2c_info, OV5647_SW_STANDBY, 0x01); + + } else { // val = MIPI_CTRL00_CLOCK_LANE_GATE | MIPI_CTRL00_BUS_IDLE | MIPI_CTRL00_CLOCK_LANE_DISABLE; @@ -921,8 +1047,9 @@ static k_s32 ov5647_sensor_set_stream(void *ctx, k_s32 enable) // ret = sensor_reg_write(&dev->i2c_info, OV5647_REG_FRAME_OFF_NUMBER, 0x0f); // ret = sensor_reg_write(&dev->i2c_info, OV5647_REG_PAD_OUT, 0x01); // // sensor_reg_list_write(&dev->i2c_info, sensor_oe_disable_regs); - + ret = sensor_reg_write(&dev->i2c_info, 0x3018, 0xff); ret = sensor_reg_write(&dev->i2c_info, OV5647_SW_STANDBY, 0x00); + } pr_info("%s exit, ret(%d)\n", __func__, ret); @@ -1064,7 +1191,7 @@ static k_s32 ov5647_sensor_set_intg_time(void *ctx, k_sensor_intg_time time) //printf("int_time = %f, one_line_time = %f \n", integraion_time, current_mode->ae_info.one_line_exp_time); exp_line = integraion_time / current_mode->ae_info.one_line_exp_time; - exp_line = MIN(current_mode->ae_info.max_integraion_line, MAX(1, exp_line)); + exp_line = MIN(current_mode->ae_info.max_integraion_line, MAX(current_mode->ae_info.min_integraion_line, exp_line)); if (current_mode->et_line != exp_line) { ret |= sensor_reg_write(&dev->i2c_info, OV5647_REG_LONG_EXP_TIME_H, ( exp_line >> 4) & 0xff); @@ -1075,13 +1202,13 @@ static k_s32 ov5647_sensor_set_intg_time(void *ctx, k_sensor_intg_time time) } else if (current_mode->hdr_mode == SENSOR_MODE_HDR_STITCH) { integraion_time = time.intg_time[SENSOR_DUAL_EXP_L_PARAS]; exp_line = integraion_time / current_mode->ae_info.one_line_exp_time; - exp_line = MIN(current_mode->ae_info.max_integraion_line, MAX(1, exp_line)); + exp_line = MIN(current_mode->ae_info.max_integraion_line, MAX(current_mode->ae_info.min_integraion_line, exp_line)); current_mode->ae_info.cur_integration_time = (float)exp_line * current_mode->ae_info.one_line_exp_time; integraion_time = time.intg_time[SENSOR_DUAL_EXP_S_PARAS]; exp_line = integraion_time / current_mode->ae_info.one_line_exp_time; - exp_line = MIN(current_mode->ae_info.max_integraion_line, MAX(1, exp_line)); + exp_line = MIN(current_mode->ae_info.max_integraion_line, MAX(current_mode->ae_info.min_integraion_line, exp_line)); current_mode->ae_info.cur_vs_integration_time = (float)exp_line * current_mode->ae_info.one_line_exp_time; } else { @@ -1202,7 +1329,7 @@ static k_s32 ov5647_sensor_get_otp_data(void *ctx, void *data) struct sensor_driver_dev ov5647_sensor_csi1_drv = { .i2c_info = { .i2c_bus = NULL, - .i2c_name = "i2c0", // "i2c3", + .i2c_name = OV5647_CSI1_IIC, // "i2c3", .slave_addr = 0x36, .reg_addr_size = SENSOR_REG_VALUE_16BIT, .reg_val_size = SENSOR_REG_VALUE_8BIT, diff --git a/src/big/mpp/kernel/sensor/src/ov5647_csi2_drv.c b/src/big/mpp/kernel/sensor/src/ov5647_csi2_drv.c index 9638a515b..b6e3fba34 100755 --- a/src/big/mpp/kernel/sensor/src/ov5647_csi2_drv.c +++ b/src/big/mpp/kernel/sensor/src/ov5647_csi2_drv.c @@ -369,6 +369,106 @@ static const k_sensor_reg ov5647_640x480_10bpp[] = { {REG_NULL, 0x00}, }; + +static const k_sensor_reg ov5647_mipi2lane_1080p_30fps_flip_linear[] = { + //pixel_rate = 81666700 + {0x0103, 0x01}, + {0x0100, 0x00}, + {0x3034, 0x1a}, + {0x3035, 0x21}, + {0x3036, 0x62}, + {0x303c, 0x11}, + {0x3106, 0xf5}, + {0x3821, 0x00}, + {0x3820, 0x02}, //0x00 + {0x3827, 0xec}, + {0x370c, 0x03}, + {0x3612, 0x5b}, + {0x3618, 0x04}, + {0x5000, 0x06}, + {0x5001, 0x00}, // set awb disble + {0x5002, 0x00},//41 + {0x5003, 0x08}, + {0x5a00, 0x08}, + {0x3000, 0x00}, + {0x3001, 0x00}, + {0x3002, 0x00}, + {0x3016, 0x08}, + {0x3017, 0xe0}, + {0x3018, 0x44}, + {0x301c, 0xf8}, + {0x301d, 0xf0}, + {0x3a18, 0x03},//00 + {0x3a19, 0xff},//f8 + {0x3c01, 0x80}, + {0x3b07, 0x0c}, + {0x380c, 0x08}, // h totle high + {0x380d, 0xdf}, // h totle low + {0x380e, 0x04}, // v totle high + {0x380f, 0xaf}, // v totle low + {0x3814, 0x11}, + {0x3815, 0x11}, + {0x3708, 0x64}, + {0x3709, 0x12}, + {0x3808, 0x07}, + {0x3809, 0x80}, + {0x380a, 0x04}, + {0x380b, 0x38}, + {0x3800, 0x01}, + {0x3801, 0x5c}, + {0x3802, 0x01}, + {0x3803, 0xb2}, + {0x3804, 0x08}, + {0x3805, 0xe3}, + {0x3806, 0x05}, + {0x3807, 0xf1}, + {0x3811, 0x04}, + {0x3813, 0x02}, + {0x3630, 0x2e}, + {0x3632, 0xe2}, + {0x3633, 0x23}, + {0x3634, 0x44}, + {0x3636, 0x06}, + {0x3620, 0x64}, + {0x3621, 0xe0}, + {0x3600, 0x37}, + {0x3704, 0xa0}, + {0x3703, 0x5a}, + {0x3715, 0x78}, + {0x3717, 0x01}, + {0x3731, 0x02}, + {0x370b, 0x60}, + {0x3705, 0x1a}, + {0x3f05, 0x02}, + {0x3f06, 0x10}, + {0x3f01, 0x0a}, + {0x3a00, 0x00}, + {0x3a08, 0x01}, + {0x3a09, 0x4b}, + {0x3a0a, 0x01}, + {0x3a0b, 0x13}, + {0x3a0d, 0x04}, + {0x3a0e, 0x03}, + {0x3a0f, 0x58}, + {0x3a10, 0x50}, + {0x3a1b, 0x58}, + {0x3a1e, 0x50}, + {0x3a11, 0x60}, + {0x3a1f, 0x28}, + {0x4001, 0x02}, + {0x4004, 0x04}, + {0x4000, 0x09}, + {0x4837, 0x19}, + {0x4800, 0x34}, + {0x3501, 0x02}, //ET = 42 lines + {0x3502, 0xa0}, + {0x3503, 0x07}, //0x0f + {0x350b, 0x10}, // gain + // {0x0100, 0x01}, + {REG_NULL, 0x00}, +}; + + static k_sensor_mode ov5647_mode_info[] = { { .index = 0, @@ -439,7 +539,6 @@ static k_sensor_mode ov5647_mode_info[] = { .reg_list = ov5647_640x480_10bpp, .mclk_setting = {{K_FALSE}, {K_FALSE}, {K_FALSE}}, }, - { .index = 3, .sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR, @@ -462,8 +561,13 @@ static k_sensor_mode ov5647_mode_info[] = { }, .reg_list = ov5647_mipi2lane_1080p_30fps_linear, .mclk_setting = { + { + .mclk_setting_en = K_TRUE, + .setting.id = SENSOR_MCLK0, + .setting.mclk_sel = SENSOR_PLL0_CLK_DIV4, + .setting.mclk_div = 16, + }, {K_FALSE}, - {K_FALSE}, { .mclk_setting_en = K_TRUE, .setting.id = SENSOR_MCLK2, @@ -472,13 +576,52 @@ static k_sensor_mode ov5647_mode_info[] = { }, }, }, + { + .index = 4, + .sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2, + .size = { + .bounds_width = 1920, + .bounds_height = 1080, + .top = 0, + .left = 0, + .width = 1920, + .height = 1080, + }, + .fps = 30000, + .hdr_mode = SENSOR_MODE_LINEAR, + .bit_width = 10, + .bayer_pattern = BAYER_PAT_GRBG, + .mipi_info = { + .csi_id = 0, + .mipi_lanes = 2, + .data_type = 0x2B, //RAW10 + }, + .reg_list = ov5647_mipi2lane_1080p_30fps_flip_linear, + .mclk_setting = { + { + .mclk_setting_en = K_TRUE, + .setting.id = SENSOR_MCLK2, + .setting.mclk_sel = SENSOR_PLL0_CLK_DIV4, + .setting.mclk_div = 16, + }, + { + .mclk_setting_en = K_TRUE, + .setting.id = SENSOR_MCLK0, + .setting.mclk_sel = SENSOR_PLL0_CLK_DIV4, + .setting.mclk_div = 16, + }, + + {K_FALSE}, + }, + }, + }; static k_sensor_mode *current_mode = NULL; static int ov5647_power_rest(k_s32 on) { - #define OV5647_CAM_PIN_CSI2 (24) + // #define OV5647_CAM_PIN_CSI2 (24) rt_kprintf("ov5647_power_rest OV5647_CAM_PIN_CSI2 is %d \n", OV5647_CAM_PIN_CSI2); // rst @@ -543,6 +686,8 @@ static k_s32 ov5647_sensor_power_on(void *ctx, k_s32 on) struct sensor_driver_dev *dev = ctx; k_u32 chip_id = 0; pr_info("%s enter\n", __func__); + + if (on) { ov5647_power_rest(on); ov5647_i2c_init(&dev->i2c_info); @@ -612,19 +757,20 @@ static k_s32 ov5647_sensor_init(void *ctx, k_sensor_mode mode) switch (current_mode->index) { case 0: case 3: + case 4: ret = sensor_reg_list_write(&dev->i2c_info, current_mode->reg_list); // default: // ret = sensor_reg_list_write(&dev->i2c_info, current_mode->reg_list); - current_mode->ae_info.frame_length = 1126; + current_mode->ae_info.frame_length = 1199; current_mode->ae_info.cur_frame_length = current_mode->ae_info.frame_length; - current_mode->ae_info.one_line_exp_time = 0.00002958;//0.00003025 + current_mode->ae_info.one_line_exp_time = 0.000027808;//0.00003025 current_mode->ae_info.gain_accuracy = 1024; current_mode->ae_info.min_gain = 1.0; - current_mode->ae_info.max_gain = 63.9375; + current_mode->ae_info.max_gain = 8.0;//63.9375; current_mode->ae_info.int_time_delay_frame = 2; current_mode->ae_info.gain_delay_frame = 2; @@ -633,14 +779,14 @@ static k_s32 ov5647_sensor_init(void *ctx, k_sensor_mode mode) current_mode->ae_info.integration_time_increment = current_mode->ae_info.one_line_exp_time; current_mode->ae_info.gain_increment = (1.0f/16.0f); - current_mode->ae_info.max_long_integraion_line = current_mode->ae_info.frame_length; - current_mode->ae_info.min_long_integraion_line = current_mode->ae_info.frame_length - 1; + current_mode->ae_info.max_long_integraion_line = current_mode->ae_info.frame_length - 12; + current_mode->ae_info.min_long_integraion_line = 2; - current_mode->ae_info.max_integraion_line = current_mode->ae_info.frame_length; - current_mode->ae_info.min_integraion_line = 1; + current_mode->ae_info.max_integraion_line = current_mode->ae_info.frame_length - 12; + current_mode->ae_info.min_integraion_line = 2; - current_mode->ae_info.max_vs_integraion_line = current_mode->ae_info.frame_length; - current_mode->ae_info.min_vs_integraion_line = current_mode->ae_info.frame_length - 1; + current_mode->ae_info.max_vs_integraion_line = current_mode->ae_info.frame_length - 12; + current_mode->ae_info.min_vs_integraion_line = 2; current_mode->ae_info.max_long_integraion_time = \ current_mode->ae_info.integration_time_increment * \ @@ -680,15 +826,15 @@ static k_s32 ov5647_sensor_init(void *ctx, k_sensor_mode mode) current_mode->ae_info.cur_vs_dgain = 0.0; current_mode->ae_info.a_long_gain.min = 1.0; - current_mode->ae_info.a_long_gain.max = 63.9375; + current_mode->ae_info.a_long_gain.max = 8.0; current_mode->ae_info.a_long_gain.step = (1.0f/16.0f); current_mode->ae_info.a_gain.min = 1.0; - current_mode->ae_info.a_gain.max = 63.9375; + current_mode->ae_info.a_gain.max = 8.0; current_mode->ae_info.a_gain.step = (1.0f/16.0f); current_mode->ae_info.a_vs_gain.min = 1.0; - current_mode->ae_info.a_vs_gain.max = 63.9375; + current_mode->ae_info.a_vs_gain.max = 8.0; current_mode->ae_info.a_vs_gain.step = (1.0f/16.0f); current_mode->ae_info.d_long_gain.max = 1.0; @@ -718,7 +864,7 @@ static k_s32 ov5647_sensor_init(void *ctx, k_sensor_mode mode) current_mode->ae_info.gain_accuracy = 1024; current_mode->ae_info.min_gain = 1.0; - current_mode->ae_info.max_gain = 63.9375; + current_mode->ae_info.max_gain = 8.0;//63.9375; current_mode->ae_info.int_time_delay_frame = 2; current_mode->ae_info.gain_delay_frame = 2; @@ -727,14 +873,14 @@ static k_s32 ov5647_sensor_init(void *ctx, k_sensor_mode mode) current_mode->ae_info.integration_time_increment = current_mode->ae_info.one_line_exp_time; current_mode->ae_info.gain_increment = (1.0f/16.0f); - current_mode->ae_info.max_long_integraion_line = current_mode->ae_info.frame_length; - current_mode->ae_info.min_long_integraion_line = current_mode->ae_info.frame_length - 1; + current_mode->ae_info.max_long_integraion_line = current_mode->ae_info.frame_length - 12; + current_mode->ae_info.min_long_integraion_line = 2; - current_mode->ae_info.max_integraion_line = current_mode->ae_info.frame_length; - current_mode->ae_info.min_integraion_line = 1; + current_mode->ae_info.max_integraion_line = current_mode->ae_info.frame_length - 12; + current_mode->ae_info.min_integraion_line = 2; - current_mode->ae_info.max_vs_integraion_line = current_mode->ae_info.frame_length; - current_mode->ae_info.min_vs_integraion_line = current_mode->ae_info.frame_length - 1; + current_mode->ae_info.max_vs_integraion_line = current_mode->ae_info.frame_length - 12; + current_mode->ae_info.min_vs_integraion_line = 2; current_mode->ae_info.max_long_integraion_time = \ current_mode->ae_info.integration_time_increment * \ @@ -774,15 +920,15 @@ static k_s32 ov5647_sensor_init(void *ctx, k_sensor_mode mode) current_mode->ae_info.cur_vs_dgain = 0.0; current_mode->ae_info.a_long_gain.min = 1.0; - current_mode->ae_info.a_long_gain.max = 63.9375; + current_mode->ae_info.a_long_gain.max = 8.0; current_mode->ae_info.a_long_gain.step = (1.0f/16.0f); current_mode->ae_info.a_gain.min = 1.0; - current_mode->ae_info.a_gain.max = 63.9375; + current_mode->ae_info.a_gain.max = 8.0; current_mode->ae_info.a_gain.step = (1.0f/16.0f); current_mode->ae_info.a_vs_gain.min = 1.0; - current_mode->ae_info.a_vs_gain.max = 63.9375; + current_mode->ae_info.a_vs_gain.max = 8.0; current_mode->ae_info.a_vs_gain.step = (1.0f/16.0f); current_mode->ae_info.d_long_gain.max = 1.0; @@ -914,6 +1060,7 @@ static k_s32 ov5647_sensor_set_stream(void *ctx, k_s32 enable) ret = sensor_reg_write(&dev->i2c_info, OV5647_SW_STANDBY, 0x01); + } else { // val = MIPI_CTRL00_CLOCK_LANE_GATE | MIPI_CTRL00_BUS_IDLE | MIPI_CTRL00_CLOCK_LANE_DISABLE; // ret = sensor_reg_write(&dev->i2c_info, OV5647_REG_MIPI_CTRL00, val); @@ -921,7 +1068,7 @@ static k_s32 ov5647_sensor_set_stream(void *ctx, k_s32 enable) // ret = sensor_reg_write(&dev->i2c_info, OV5647_REG_FRAME_OFF_NUMBER, 0x0f); // ret = sensor_reg_write(&dev->i2c_info, OV5647_REG_PAD_OUT, 0x01); // // sensor_reg_list_write(&dev->i2c_info, sensor_oe_disable_regs); - + ret = sensor_reg_write(&dev->i2c_info, 0x3018, 0xff); ret = sensor_reg_write(&dev->i2c_info, OV5647_SW_STANDBY, 0x00); } pr_info("%s exit, ret(%d)\n", __func__, ret); @@ -1064,7 +1211,7 @@ static k_s32 ov5647_sensor_set_intg_time(void *ctx, k_sensor_intg_time time) //printf("int_time = %f, one_line_time = %f \n", integraion_time, current_mode->ae_info.one_line_exp_time); exp_line = integraion_time / current_mode->ae_info.one_line_exp_time; - exp_line = MIN(current_mode->ae_info.max_integraion_line, MAX(1, exp_line)); + exp_line = MIN(current_mode->ae_info.max_integraion_line, MAX(current_mode->ae_info.min_integraion_line, exp_line)); if (current_mode->et_line != exp_line) { ret |= sensor_reg_write(&dev->i2c_info, OV5647_REG_LONG_EXP_TIME_H, ( exp_line >> 4) & 0xff); @@ -1075,13 +1222,13 @@ static k_s32 ov5647_sensor_set_intg_time(void *ctx, k_sensor_intg_time time) } else if (current_mode->hdr_mode == SENSOR_MODE_HDR_STITCH) { integraion_time = time.intg_time[SENSOR_DUAL_EXP_L_PARAS]; exp_line = integraion_time / current_mode->ae_info.one_line_exp_time; - exp_line = MIN(current_mode->ae_info.max_integraion_line, MAX(1, exp_line)); + exp_line = MIN(current_mode->ae_info.max_integraion_line, MAX(current_mode->ae_info.min_integraion_line, exp_line)); current_mode->ae_info.cur_integration_time = (float)exp_line * current_mode->ae_info.one_line_exp_time; integraion_time = time.intg_time[SENSOR_DUAL_EXP_S_PARAS]; exp_line = integraion_time / current_mode->ae_info.one_line_exp_time; - exp_line = MIN(current_mode->ae_info.max_integraion_line, MAX(1, exp_line)); + exp_line = MIN(current_mode->ae_info.max_integraion_line, MAX(current_mode->ae_info.min_integraion_line, exp_line)); current_mode->ae_info.cur_vs_integration_time = (float)exp_line * current_mode->ae_info.one_line_exp_time; } else { @@ -1202,7 +1349,7 @@ static k_s32 ov5647_sensor_get_otp_data(void *ctx, void *data) struct sensor_driver_dev ov5647_sensor_csi2_drv = { .i2c_info = { .i2c_bus = NULL, - .i2c_name = "i2c1", // "i2c3", + .i2c_name = OV5647_CSI2_IIC ,//"i2c1", // "i2c3", .slave_addr = 0x36, .reg_addr_size = SENSOR_REG_VALUE_16BIT, .reg_val_size = SENSOR_REG_VALUE_8BIT, diff --git a/src/big/mpp/kernel/sensor/src/ov5647_drv.c b/src/big/mpp/kernel/sensor/src/ov5647_drv.c index 53ce14275..b3894c272 100755 --- a/src/big/mpp/kernel/sensor/src/ov5647_drv.c +++ b/src/big/mpp/kernel/sensor/src/ov5647_drv.c @@ -108,10 +108,10 @@ static const k_sensor_reg ov5647_mipi2lane_1080p_30fps_linear[] = { {0x3a19, 0xff},//f8 {0x3c01, 0x80}, {0x3b07, 0x0c}, - {0x380c, 0x09}, // h totle high - {0x380d, 0x70}, // h totle low + {0x380c, 0x08}, // h totle high + {0x380d, 0xdf}, // h totle low {0x380e, 0x04}, // v totle high - {0x380f, 0x66}, // v totle lo 50 0x66 + {0x380f, 0xaf}, // v totle low {0x3814, 0x11}, {0x3815, 0x11}, {0x3708, 0x64}, @@ -166,6 +166,8 @@ static const k_sensor_reg ov5647_mipi2lane_1080p_30fps_linear[] = { {0x4000, 0x09}, {0x4837, 0x19}, {0x4800, 0x34}, + {0x3501, 0x02}, //ET = 42 lines + {0x3502, 0xa0}, {0x3503, 0x07}, //0x0f {0x350b, 0x10}, // gain // {0x0100, 0x01}, @@ -369,6 +371,106 @@ static const k_sensor_reg ov5647_640x480_10bpp[] = { {REG_NULL, 0x00}, }; + +static const k_sensor_reg ov5647_mipi2lane_1080p_30fps_flip_linear[] = { + //pixel_rate = 81666700 + {0x0103, 0x01}, + {0x0100, 0x00}, + {0x3034, 0x1a}, + {0x3035, 0x21}, + {0x3036, 0x62}, + {0x303c, 0x11}, + {0x3106, 0xf5}, + {0x3821, 0x00}, + {0x3820, 0x02}, //0x00 + {0x3827, 0xec}, + {0x370c, 0x03}, + {0x3612, 0x5b}, + {0x3618, 0x04}, + {0x5000, 0x06}, + {0x5001, 0x00}, // set awb disble + {0x5002, 0x00},//41 + {0x5003, 0x08}, + {0x5a00, 0x08}, + {0x3000, 0x00}, + {0x3001, 0x00}, + {0x3002, 0x00}, + {0x3016, 0x08}, + {0x3017, 0xe0}, + {0x3018, 0x44}, + {0x301c, 0xf8}, + {0x301d, 0xf0}, + {0x3a18, 0x03},//00 + {0x3a19, 0xff},//f8 + {0x3c01, 0x80}, + {0x3b07, 0x0c}, + {0x380c, 0x08}, // h totle high + {0x380d, 0xdf}, // h totle low + {0x380e, 0x04}, // v totle high + {0x380f, 0xaf}, // v totle low + {0x3814, 0x11}, + {0x3815, 0x11}, + {0x3708, 0x64}, + {0x3709, 0x12}, + {0x3808, 0x07}, + {0x3809, 0x80}, + {0x380a, 0x04}, + {0x380b, 0x38}, + {0x3800, 0x01}, + {0x3801, 0x5c}, + {0x3802, 0x01}, + {0x3803, 0xb2}, + {0x3804, 0x08}, + {0x3805, 0xe3}, + {0x3806, 0x05}, + {0x3807, 0xf1}, + {0x3811, 0x04}, + {0x3813, 0x02}, + {0x3630, 0x2e}, + {0x3632, 0xe2}, + {0x3633, 0x23}, + {0x3634, 0x44}, + {0x3636, 0x06}, + {0x3620, 0x64}, + {0x3621, 0xe0}, + {0x3600, 0x37}, + {0x3704, 0xa0}, + {0x3703, 0x5a}, + {0x3715, 0x78}, + {0x3717, 0x01}, + {0x3731, 0x02}, + {0x370b, 0x60}, + {0x3705, 0x1a}, + {0x3f05, 0x02}, + {0x3f06, 0x10}, + {0x3f01, 0x0a}, + {0x3a00, 0x00}, + {0x3a08, 0x01}, + {0x3a09, 0x4b}, + {0x3a0a, 0x01}, + {0x3a0b, 0x13}, + {0x3a0d, 0x04}, + {0x3a0e, 0x03}, + {0x3a0f, 0x58}, + {0x3a10, 0x50}, + {0x3a1b, 0x58}, + {0x3a1e, 0x50}, + {0x3a11, 0x60}, + {0x3a1f, 0x28}, + {0x4001, 0x02}, + {0x4004, 0x04}, + {0x4000, 0x09}, + {0x4837, 0x19}, + {0x4800, 0x34}, + {0x3501, 0x02}, //ET = 42 lines + {0x3502, 0xa0}, + {0x3503, 0x07}, //0x0f + {0x350b, 0x10}, // gain + // {0x0100, 0x01}, + {REG_NULL, 0x00}, +}; + + static k_sensor_mode ov5647_mode_info[] = { { .index = 0, @@ -448,7 +550,6 @@ static k_sensor_mode ov5647_mode_info[] = { .reg_list = ov5647_640x480_10bpp, .mclk_setting = {{K_FALSE}, {K_FALSE}, {K_FALSE}}, }, - { .index = 3, .sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR, @@ -481,6 +582,62 @@ static k_sensor_mode ov5647_mode_info[] = { {K_FALSE}, }, }, + { + .index = 4, + .sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR, + .size = { + .bounds_width = 1920, + .bounds_height = 1080, + .top = 0, + .left = 0, + .width = 1920, + .height = 1080, + }, + .fps = 30000, + .hdr_mode = SENSOR_MODE_LINEAR, + .bit_width = 10, + .bayer_pattern = BAYER_PAT_GBRG, + .mipi_info = { + .csi_id = 0, + .mipi_lanes = 2, + .data_type = 0x2B, //RAW10 + }, + .reg_list = ov5647_mipi2lane_1080p_30fps_linear, + .mclk_setting = { + { + .mclk_setting_en = K_TRUE, + .setting.id = SENSOR_MCLK2, + .setting.mclk_sel = SENSOR_PLL0_CLK_DIV4, + .setting.mclk_div = 16, + }, + {K_FALSE}, + {K_FALSE}, + }, + }, + { + .index = 5, + .sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR_V2, + .size = { + .bounds_width = 1920, + .bounds_height = 1080, + .top = 0, + .left = 0, + .width = 1920, + .height = 1080, + }, + .fps = 30000, + .hdr_mode = SENSOR_MODE_LINEAR, + .bit_width = 10, + .bayer_pattern = BAYER_PAT_GRBG, + .mipi_info = { + .csi_id = 0, + .mipi_lanes = 2, + .data_type = 0x2B, //RAW10 + }, + .reg_list = ov5647_mipi2lane_1080p_30fps_flip_linear, + .mclk_setting = {{K_FALSE}, {K_FALSE}, {K_FALSE}}, + }, + }; static k_sensor_mode *current_mode = NULL; @@ -621,19 +778,20 @@ static k_s32 ov5647_sensor_init(void *ctx, k_sensor_mode mode) switch (current_mode->index) { case 0: case 3: - + case 4: + case 5: ret = sensor_reg_list_write(&dev->i2c_info, current_mode->reg_list); // default: // ret = sensor_reg_list_write(&dev->i2c_info, current_mode->reg_list); - current_mode->ae_info.frame_length = 1126; + current_mode->ae_info.frame_length = 1199; current_mode->ae_info.cur_frame_length = current_mode->ae_info.frame_length; - current_mode->ae_info.one_line_exp_time = 0.00002958;//0.00003025 + current_mode->ae_info.one_line_exp_time = 0.000027808;//0.00003025 current_mode->ae_info.gain_accuracy = 1024; current_mode->ae_info.min_gain = 1.0; - current_mode->ae_info.max_gain = 8;//63.9375; + current_mode->ae_info.max_gain = 8.0;//63.9375; current_mode->ae_info.int_time_delay_frame = 2; current_mode->ae_info.gain_delay_frame = 2; @@ -642,14 +800,14 @@ static k_s32 ov5647_sensor_init(void *ctx, k_sensor_mode mode) current_mode->ae_info.integration_time_increment = current_mode->ae_info.one_line_exp_time; current_mode->ae_info.gain_increment = (1.0f/16.0f); - current_mode->ae_info.max_long_integraion_line = current_mode->ae_info.frame_length; - current_mode->ae_info.min_long_integraion_line = current_mode->ae_info.frame_length - 1; + current_mode->ae_info.max_long_integraion_line = current_mode->ae_info.frame_length - 12; + current_mode->ae_info.min_long_integraion_line = 2; - current_mode->ae_info.max_integraion_line = current_mode->ae_info.frame_length; - current_mode->ae_info.min_integraion_line = 1; + current_mode->ae_info.max_integraion_line = current_mode->ae_info.frame_length - 12; + current_mode->ae_info.min_integraion_line = 2; - current_mode->ae_info.max_vs_integraion_line = current_mode->ae_info.frame_length; - current_mode->ae_info.min_vs_integraion_line = current_mode->ae_info.frame_length - 1; + current_mode->ae_info.max_vs_integraion_line = current_mode->ae_info.frame_length - 12; + current_mode->ae_info.min_vs_integraion_line = 2; current_mode->ae_info.max_long_integraion_time = \ current_mode->ae_info.integration_time_increment * \ @@ -689,15 +847,15 @@ static k_s32 ov5647_sensor_init(void *ctx, k_sensor_mode mode) current_mode->ae_info.cur_vs_dgain = 0.0; current_mode->ae_info.a_long_gain.min = 1.0; - current_mode->ae_info.a_long_gain.max = 63.9375; + current_mode->ae_info.a_long_gain.max = 8.0; current_mode->ae_info.a_long_gain.step = (1.0f/16.0f); current_mode->ae_info.a_gain.min = 1.0; - current_mode->ae_info.a_gain.max = 63.9375; + current_mode->ae_info.a_gain.max = 8.0; current_mode->ae_info.a_gain.step = (1.0f/16.0f); current_mode->ae_info.a_vs_gain.min = 1.0; - current_mode->ae_info.a_vs_gain.max = 63.9375; + current_mode->ae_info.a_vs_gain.max = 8.0; current_mode->ae_info.a_vs_gain.step = (1.0f/16.0f); current_mode->ae_info.d_long_gain.max = 1.0; @@ -727,7 +885,7 @@ static k_s32 ov5647_sensor_init(void *ctx, k_sensor_mode mode) current_mode->ae_info.gain_accuracy = 1024; current_mode->ae_info.min_gain = 1.0; - current_mode->ae_info.max_gain = 8;//63.9375; + current_mode->ae_info.max_gain = 8.0;//63.9375; current_mode->ae_info.int_time_delay_frame = 2; current_mode->ae_info.gain_delay_frame = 2; @@ -736,14 +894,14 @@ static k_s32 ov5647_sensor_init(void *ctx, k_sensor_mode mode) current_mode->ae_info.integration_time_increment = current_mode->ae_info.one_line_exp_time; current_mode->ae_info.gain_increment = (1.0f/16.0f); - current_mode->ae_info.max_long_integraion_line = current_mode->ae_info.frame_length; - current_mode->ae_info.min_long_integraion_line = current_mode->ae_info.frame_length - 1; + current_mode->ae_info.max_long_integraion_line = current_mode->ae_info.frame_length - 12; + current_mode->ae_info.min_long_integraion_line = 2; - current_mode->ae_info.max_integraion_line = current_mode->ae_info.frame_length; - current_mode->ae_info.min_integraion_line = 1; + current_mode->ae_info.max_integraion_line = current_mode->ae_info.frame_length - 12; + current_mode->ae_info.min_integraion_line = 2; - current_mode->ae_info.max_vs_integraion_line = current_mode->ae_info.frame_length; - current_mode->ae_info.min_vs_integraion_line = current_mode->ae_info.frame_length - 1; + current_mode->ae_info.max_vs_integraion_line = current_mode->ae_info.frame_length - 12; + current_mode->ae_info.min_vs_integraion_line = 2; current_mode->ae_info.max_long_integraion_time = \ current_mode->ae_info.integration_time_increment * \ @@ -783,15 +941,15 @@ static k_s32 ov5647_sensor_init(void *ctx, k_sensor_mode mode) current_mode->ae_info.cur_vs_dgain = 0.0; current_mode->ae_info.a_long_gain.min = 1.0; - current_mode->ae_info.a_long_gain.max = 63.9375; + current_mode->ae_info.a_long_gain.max = 8.0; current_mode->ae_info.a_long_gain.step = (1.0f/16.0f); current_mode->ae_info.a_gain.min = 1.0; - current_mode->ae_info.a_gain.max = 63.9375; + current_mode->ae_info.a_gain.max = 8.0; current_mode->ae_info.a_gain.step = (1.0f/16.0f); current_mode->ae_info.a_vs_gain.min = 1.0; - current_mode->ae_info.a_vs_gain.max = 63.9375; + current_mode->ae_info.a_vs_gain.max = 8.0; current_mode->ae_info.a_vs_gain.step = (1.0f/16.0f); current_mode->ae_info.d_long_gain.max = 1.0; @@ -930,7 +1088,7 @@ static k_s32 ov5647_sensor_set_stream(void *ctx, k_s32 enable) // ret = sensor_reg_write(&dev->i2c_info, OV5647_REG_FRAME_OFF_NUMBER, 0x0f); // ret = sensor_reg_write(&dev->i2c_info, OV5647_REG_PAD_OUT, 0x01); // // sensor_reg_list_write(&dev->i2c_info, sensor_oe_disable_regs); - + ret = sensor_reg_write(&dev->i2c_info, 0x3018, 0xff); ret = sensor_reg_write(&dev->i2c_info, OV5647_SW_STANDBY, 0x00); } pr_info("%s exit, ret(%d)\n", __func__, ret); @@ -1073,7 +1231,7 @@ static k_s32 ov5647_sensor_set_intg_time(void *ctx, k_sensor_intg_time time) //printf("int_time = %f, one_line_time = %f \n", integraion_time, current_mode->ae_info.one_line_exp_time); exp_line = integraion_time / current_mode->ae_info.one_line_exp_time; - exp_line = MIN(current_mode->ae_info.max_integraion_line, MAX(1, exp_line)); + exp_line = MIN(current_mode->ae_info.max_integraion_line, MAX(current_mode->ae_info.min_integraion_line, exp_line)); if (current_mode->et_line != exp_line) { ret |= sensor_reg_write(&dev->i2c_info, OV5647_REG_LONG_EXP_TIME_H, ( exp_line >> 4) & 0xff); @@ -1084,13 +1242,13 @@ static k_s32 ov5647_sensor_set_intg_time(void *ctx, k_sensor_intg_time time) } else if (current_mode->hdr_mode == SENSOR_MODE_HDR_STITCH) { integraion_time = time.intg_time[SENSOR_DUAL_EXP_L_PARAS]; exp_line = integraion_time / current_mode->ae_info.one_line_exp_time; - exp_line = MIN(current_mode->ae_info.max_integraion_line, MAX(1, exp_line)); + exp_line = MIN(current_mode->ae_info.max_integraion_line, MAX(current_mode->ae_info.min_integraion_line, exp_line)); current_mode->ae_info.cur_integration_time = (float)exp_line * current_mode->ae_info.one_line_exp_time; integraion_time = time.intg_time[SENSOR_DUAL_EXP_S_PARAS]; exp_line = integraion_time / current_mode->ae_info.one_line_exp_time; - exp_line = MIN(current_mode->ae_info.max_integraion_line, MAX(1, exp_line)); + exp_line = MIN(current_mode->ae_info.max_integraion_line, MAX(current_mode->ae_info.min_integraion_line, exp_line)); current_mode->ae_info.cur_vs_integration_time = (float)exp_line * current_mode->ae_info.one_line_exp_time; } else { diff --git a/src/big/mpp/kernel/sensor/src/ov9286_drv.c b/src/big/mpp/kernel/sensor/src/ov9286_drv.c index 76cf575b7..c373b4a1c 100755 --- a/src/big/mpp/kernel/sensor/src/ov9286_drv.c +++ b/src/big/mpp/kernel/sensor/src/ov9286_drv.c @@ -818,6 +818,70 @@ static k_sensor_mode ov9286_mode_info[] = { .reg_list = ov9286_mipi2lane_720p_60fps_linear, .mclk_setting = {{K_FALSE}, {K_FALSE}, {K_FALSE}}, }, + { + .index = 8, + .sensor_type = OV_OV9286_MIPI_1280X720_30FPS_10BIT_MCLK_25M_LINEAR_SPECKLE_V2, + .size = { + .bounds_width = 1280, + .bounds_height = 720, + .top = 0, + .left = 0, + .width = 1280, + .height = 720, + }, + .fps = 30000, + .hdr_mode = SENSOR_MODE_LINEAR, + .bit_width = 10, + .bayer_pattern = BAYER_PAT_BGGR, + .mipi_info = { + .csi_id = 0, + .mipi_lanes = 1, + .data_type = 0x2B, //RAW10 + }, + .reg_list = ov9286_mipi2lane_720p_30fps_mclk_25m_linear, + .mclk_setting = { + { + .mclk_setting_en = K_TRUE, + .setting.id = SENSOR_MCLK2, + .setting.mclk_sel = SENSOR_PLL0_CLK_DIV4, + .setting.mclk_div = 16, //32, + }, + {K_FALSE}, + {K_FALSE}, + }, + }, + { + .index = 9, + .sensor_type = OV_OV9286_MIPI_1280X720_30FPS_10BIT_MCLK_25M_LINEAR_IR_V2, + .size = { + .bounds_width = 1280, + .bounds_height = 720, + .top = 0, + .left = 0, + .width = 1280, + .height = 720, + }, + .fps = 30000, + .hdr_mode = SENSOR_MODE_LINEAR, + .bit_width = 10, + .bayer_pattern = BAYER_PAT_BGGR, + .mipi_info = { + .csi_id = 0, + .mipi_lanes = 1, + .data_type = 0x2B, //RAW10 + }, + .reg_list = ov9286_mipi2lane_720p_30fps_mclk_25m_linear, + .mclk_setting = { + { + .mclk_setting_en = K_TRUE, + .setting.id = SENSOR_MCLK2, + .setting.mclk_sel = SENSOR_PLL0_CLK_DIV4, + .setting.mclk_div = 16, //32, + }, + {K_FALSE}, + {K_FALSE}, + }, + }, }; static k_bool ov9286_init_flag = K_FALSE; @@ -876,6 +940,8 @@ static int ov9286_i2c_init(k_sensor_i2c_info *i2c_info) return 0; } + + static k_s32 ov9286_sensor_power_on(void *ctx, k_s32 on) { k_s32 ret = 0; @@ -924,6 +990,8 @@ static k_s32 ov9286_sensor_init(void *ctx, k_sensor_mode mode) case 2: case 3: case 6: + case 8: + case 9: if (!ov9286_init_flag) { ret = sensor_reg_list_write(&dev->i2c_info, current_mode->reg_list); } diff --git a/src/big/mpp/kernel/sensor/src/ov9732_drv.c b/src/big/mpp/kernel/sensor/src/ov9732_drv.c index 1b0e05227..028f28b11 100755 --- a/src/big/mpp/kernel/sensor/src/ov9732_drv.c +++ b/src/big/mpp/kernel/sensor/src/ov9732_drv.c @@ -29,6 +29,8 @@ #include "io.h" #include "drv_gpio.h" +#include "k_board_config_comm.h" + #define pr_info(...) //rt_kprintf(__VA_ARGS__) #define pr_debug(...) //rt_kprintf(__VA_ARGS__) #define pr_warn(...) //rt_kprintf(__VA_ARGS__) @@ -444,13 +446,45 @@ static k_sensor_mode ov9732_mode_info[] = { {K_FALSE}, }, }, + { + .index = 2, + .sensor_type = OV_OV9732_MIPI_1280X720_30FPS_10BIT_MCLK_16M_LINEAR_V2, + .size = { + .bounds_width = 1280, + .bounds_height = 720, + .top = 0, + .left = 0, + .width = 1280, + .height = 720, + }, + .fps = 30000, + .hdr_mode = SENSOR_MODE_LINEAR, + .bit_width = 10, + .bayer_pattern = BAYER_PAT_BGGR, + .mipi_info = { + .csi_id = 0, + .mipi_lanes = 1, + .data_type = 0x2B, //RAW10 + }, + .reg_list = ov9732_mipi2lane_720p_30fps_mclk_16m_linear, + .mclk_setting = { + { + .mclk_setting_en = K_TRUE, + .setting.id = SENSOR_MCLK1, + .setting.mclk_sel = SENSOR_PLL0_CLK_DIV4, + .setting.mclk_div = 25, + }, + {K_FALSE}, + {K_FALSE}, + }, + }, }; static k_sensor_mode *current_mode = NULL; static int ov9732_power_rest(k_s32 on) { - #define OV9732_RST_PIN (28) + // #define OV9732_RST_PIN (24)// (28) // rst kd_pin_mode(OV9732_RST_PIN, GPIO_DM_OUTPUT); @@ -544,6 +578,7 @@ static k_s32 ov9732_sensor_init(void *ctx, k_sensor_mode mode) switch (current_mode->index) { case 0: case 1: + case 2: ret = sensor_reg_list_write(&dev->i2c_info, current_mode->reg_list); /////////////////// diff --git a/src/big/mpp/kernel/sensor/src/sensor_comm.c b/src/big/mpp/kernel/sensor/src/sensor_comm.c index eaaba2e76..925607cae 100755 --- a/src/big/mpp/kernel/sensor/src/sensor_comm.c +++ b/src/big/mpp/kernel/sensor/src/sensor_comm.c @@ -38,6 +38,7 @@ extern struct sensor_driver_dev ov5647_sensor_csi2_drv; extern struct sensor_driver_dev xs9950_csi0_sensor_drv; extern struct sensor_driver_dev xs9950_csi1_sensor_drv; extern struct sensor_driver_dev xs9950_csi2_sensor_drv; +extern struct sensor_driver_dev gc2053_sensor_drv; struct sensor_driver_dev *sensor_drv_list[SENSOR_NUM_MAX] = { &ov9732_sensor_drv, @@ -51,6 +52,7 @@ struct sensor_driver_dev *sensor_drv_list[SENSOR_NUM_MAX] = { &xs9950_csi0_sensor_drv, &xs9950_csi1_sensor_drv, &xs9950_csi2_sensor_drv, + &gc2053_sensor_drv, }; void sensor_drv_list_init(struct sensor_driver_dev *drv_list[]) diff --git a/src/big/mpp/middleware/Makefile b/src/big/mpp/middleware/Makefile new file mode 100644 index 000000000..9c220ee3b --- /dev/null +++ b/src/big/mpp/middleware/Makefile @@ -0,0 +1,22 @@ +include $(MPP_SRC_DIR)/middleware/mpp.mk +include $(MPP_SRC_DIR)/middleware/rt-smart.mk + +AR = riscv64-unknown-linux-musl-ar +ARFLAGS = -rc + +CURRECT_DIR_NAME=$(shell basename `pwd`) +LOCAL_SRC_DIR = $(shell pwd) + +MIDDLEWARE_SRC= $(LOCAL_SRC_DIR)/src +MIDDLEWARE_SAMPLE= $(LOCAL_SRC_DIR)/sample + +all: + cd $(MIDDLEWARE_SRC) ; make + cd $(MIDDLEWARE_SAMPLE) ; make + +clean: + echo "${PWD}/Makefile clean" + @cd $(MIDDLEWARE_SRC); make clean + @cd $(MIDDLEWARE_SAMPLE); make clean + +.PHONY: all clean diff --git a/src/big/mpp/middleware/mpp.mk b/src/big/mpp/middleware/mpp.mk new file mode 100644 index 000000000..d1cb7ada5 --- /dev/null +++ b/src/big/mpp/middleware/mpp.mk @@ -0,0 +1,8 @@ +MPP_USER_CFLGAS = -I$(MPP_SRC_DIR)/include \ + -I$(MPP_SRC_DIR)/include/comm \ + -I$(MPP_SRC_DIR)/include/ioctl \ + -I$(MPP_SRC_DIR)/userapps/api +MPP_LIB_PATH = $(MPP_SRC_DIR)/userapps/lib + +MPP_LIBS = $(addprefix -l, $(subst lib, ,$(basename $(notdir $(foreach dir, $(MPP_LIB_PATH), $(wildcard $(dir)/*)))))) + diff --git a/src/big/mpp/middleware/rt-smart.mk b/src/big/mpp/middleware/rt-smart.mk new file mode 100644 index 000000000..4d1f8bf57 --- /dev/null +++ b/src/big/mpp/middleware/rt-smart.mk @@ -0,0 +1,4 @@ +CC=riscv64-unknown-linux-musl-gcc +CC_CFLAGS=-mcmodel=medany -march=rv64imafdcv -mabi=lp64d -Werror -Wall -O0 -g -gdwarf-2 -n --static $(KCFLAGS) +CPP=riscv64-unknown-linux-musl-g++ +LINKFLAG=-T $(MPP_SRC_DIR)/userapps/sample/linker_scripts/riscv64/link.lds -lpthread \ No newline at end of file diff --git a/src/big/mpp/middleware/sample/Makefile b/src/big/mpp/middleware/sample/Makefile new file mode 100644 index 000000000..cddb4578e --- /dev/null +++ b/src/big/mpp/middleware/sample/Makefile @@ -0,0 +1,31 @@ +include $(MPP_SRC_DIR)/middleware/mpp.mk +include $(MPP_SRC_DIR)/middleware/rt-smart.mk + +AR = riscv64-unknown-linux-musl-ar +ARFLAGS = -rc + +CURRECT_DIR_NAME=$(shell basename `pwd`) +LOCAL_SRC_DIR = $(shell pwd) + +SAMPLE_RTSP_SERVER = $(LOCAL_SRC_DIR)/sample_rtspserver +SAMPLE_RTSP_CLIENT = $(LOCAL_SRC_DIR)/sample_rtspclient +SAMPLE_DEMUXER= $(LOCAL_SRC_DIR)/sample_demuxer +SAMPLE_MUXER= $(LOCAL_SRC_DIR)/sample_muxer +SAMPLE_PLAYER=$(LOCAL_SRC_DIR)/sample_player + +all: + cd $(SAMPLE_RTSP_SERVER) ; make + cd $(SAMPLE_RTSP_CLIENT) ; make + cd $(SAMPLE_DEMUXER) ; make + cd $(SAMPLE_MUXER) ; make + cd $(SAMPLE_PLAYER) ; make + +clean: + echo "${PWD}/Makefile clean" + @cd $(SAMPLE_RTSP_SERVER); make clean + @cd $(SAMPLE_RTSP_CLIENT); make clean + @cd $(SAMPLE_DEMUXER); make clean + @cd $(SAMPLE_MUXER); make clean + @cd $(SAMPLE_PLAYER); make clean + +.PHONY: all clean diff --git a/src/big/mpp/middleware/sample/sample_demuxer/Makefile b/src/big/mpp/middleware/sample/sample_demuxer/Makefile new file mode 100644 index 000000000..69546acb1 --- /dev/null +++ b/src/big/mpp/middleware/sample/sample_demuxer/Makefile @@ -0,0 +1,53 @@ +include $(MPP_SRC_DIR)/middleware/mpp.mk +include $(MPP_SRC_DIR)/middleware/rt-smart.mk + +CURRECT_DIR_NAME=$(shell basename `pwd`) +LOCAL_SRC_DIR = $(shell pwd) +BIN = $(MPP_SRC_DIR)/userapps/sample/elf/$(CURRECT_DIR_NAME).elf +LIBPATH = $(MPP_LIB_PATH) +LIBS = $(MPP_LIBS) + +CC_CFLAGS_EX=-mcmodel=medany -march=rv64imafdcv -mabi=lp64d -Wall -O0 -g -gdwarf-2 -n --static $(KCFLAGS) + +MP4_FORMAT = $(MPP_SRC_DIR)/middleware/src/mp4_format + +LOCAL_LIBS_PATH = -L$(MP4_FORMAT)/lib +LOCAL_LIBS = -lmp4 + +LOCAL_CFLAGS = -I$(LOCAL_SRC_DIR) -I$(MP4_FORMAT)/include + +WERROR_FLAGS = -Wno-register -Wno-multichar -Wno-pessimizing-move -Wno-deprecated-declarations -Wno-unused-result -Wno-unused-variable -Wno-format -Wno-return-type -Wno-sign-compare -Wno-unused-label + +CXX_FLAGS = $(WERROR_FLAGS) \ + +SRCS = $(wildcard $(LOCAL_SRC_DIR)/*.c) + +OBJS = $(patsubst %.c,%.o,$(SRCS)) + +CPP_SRCS = $(wildcard $(LOCAL_SRC_DIR)/*.cpp) + +CPP_OBJS = $(patsubst %.cpp,%.o,$(CPP_SRCS)) + +all:$(BIN) + @-rm -f *.o + @echo "${PWD}/Makefile all" + +$(OBJS): %.o : %.c + @echo CC $@ + @echo $(LOCAL_CFLAGS) + @$(CC) $(CC_CFLAGS_EX) $(LOCAL_CFLAGS) $(BSP_CFLGAS) $(RTSMART_CFLAGS) $(MPP_USER_CFLGAS) $(LOCAL_LIBS) -c $< -o $@ + +$(CPP_OBJS): %.o : %.cpp + @echo CXX $@ + @echo $(LOCAL_CFLAGS) + @$(CPP) $(CC_CFLAGS_EX) $(CXX_FLAGS) $(LOCAL_CFLAGS) $(BSP_CFLGAS) $(RTSMART_CFLAGS) $(MPP_USER_CFLGAS) $(LOCAL_LIBS) -c $< -o $@ + +$(BIN): $(OBJS) $(CPP_OBJS) + @echo LD $@ + @$(CPP) -o $(BIN) $(LINKFLAG) -Wl,--whole-archive -Wl,--no-whole-archive -n --static $^ -L$(LIBPATH) $(CXX_FLAGS) $(LOCAL_LIBS) $(LOCAL_LIBS_PATH) -Wl,--start-group $(LIBS) -Wl,--end-group + +clean: + echo "${PWD}/Makefile clean" + rm -rf $(BIN) $(OBJS) + +.PHONY: all clean diff --git a/src/big/mpp/middleware/sample/sample_demuxer/sample_demuxer.c b/src/big/mpp/middleware/sample/sample_demuxer/sample_demuxer.c new file mode 100644 index 000000000..2269f9357 --- /dev/null +++ b/src/big/mpp/middleware/sample/sample_demuxer/sample_demuxer.c @@ -0,0 +1,151 @@ +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "k_type.h" +#include "mp4_format.h" + +static k_u8 g_exit = 0; + +static void sig_handler(int sig) { + g_exit = 1; +} + +int main(int argc, char *argv[]) { + + signal(SIGINT, sig_handler); + + printf("mp4 demuxer...\n"); + + // create mp4 instance + KD_HANDLE mp4_demuxer = NULL; + k_mp4_config_s mp4_config; + memset(&mp4_config, 0, sizeof(mp4_config)); + mp4_config.config_type = K_MP4_CONFIG_DEMUXER; + strcpy(mp4_config.demuxer_config.file_name, "/sharefs/test.mp4"); + mp4_config.muxer_config.fmp4_flag = 0; + + k_s32 ret = kd_mp4_create(&mp4_demuxer, &mp4_config); + if (ret < 0) { + printf("mp4 demuxer create failed.\n"); + return -1; + } + + k_mp4_file_info_s file_info; + memset(&file_info, 0, sizeof(file_info)); + ret = kd_mp4_get_file_info(mp4_demuxer, &file_info); + if (ret < 0) { + printf("get file info failed.\n"); + goto destroy_mp4; + } + + printf("file_info: track_num: %d, duration: %lu.\n", file_info.track_num, file_info.duration); + + FILE *video_file_fp = NULL; + FILE *audio_file_fp = NULL; + + for (int i = 0; i < file_info.track_num; i++) { + k_mp4_track_info_s track_info; + memset(&track_info, 0, sizeof(track_info)); + ret = kd_mp4_get_track_by_index(mp4_demuxer, i, &track_info); + if (ret < 0) { + printf("get track: %d info failed.\n", i); + goto destroy_mp4; + } + + printf("track index: %d info:\n", i); + printf(" track_type: %d.\n", track_info.track_type); + printf(" time_scale: %d.\n", track_info.time_scale); + if (track_info.track_type == K_MP4_STREAM_VIDEO) { + printf(" codec_id: %d.\n", track_info.video_info.codec_id); + printf(" track_id: %d.\n", track_info.video_info.track_id); + printf(" width: %d.\n", track_info.video_info.width); + printf(" height: %d.\n", track_info.video_info.height); + if (track_info.video_info.codec_id == K_MP4_CODEC_ID_H264) + video_file_fp = fopen("/sharefs/test.264", "wb"); + else if (track_info.video_info.codec_id == K_MP4_CODEC_ID_H265) + video_file_fp = fopen("/sharefs/test.265", "wb"); + } else if (track_info.track_type == K_MP4_STREAM_AUDIO) { + printf(" codec_id: %d.\n", track_info.audio_info.codec_id); + printf(" track_id: %d.\n", track_info.audio_info.track_id); + printf(" channels: %d.\n", track_info.audio_info.channels); + printf(" sample_rate: %d.\n", track_info.audio_info.sample_rate); + printf(" bit_per_sample: %d.\n", track_info.audio_info.bit_per_sample); + if (track_info.audio_info.codec_id == K_MP4_CODEC_ID_G711A) + audio_file_fp = fopen("/sharefs/test.g711a", "wb"); + else if (track_info.audio_info.codec_id == K_MP4_CODEC_ID_G711U) + audio_file_fp = fopen("/sharefs/test.g711u", "wb"); + } + } + + k_mp4_frame_data_s frame_data; + while (!g_exit) { + memset(&frame_data, 0, sizeof(frame_data)); + ret = kd_mp4_get_frame(mp4_demuxer, &frame_data); + if (ret < 0) { + printf("get frame data failed.\n"); + goto destroy_mp4; + } + + if (frame_data.eof) { + printf("demuxer finished.\n"); + break; + } + + if (frame_data.codec_id == K_MP4_CODEC_ID_H264 || frame_data.codec_id == K_MP4_CODEC_ID_H265) { + fwrite(frame_data.data, 1, frame_data.data_length, video_file_fp); + } else if (frame_data.codec_id == K_MP4_CODEC_ID_G711A || frame_data.codec_id == K_MP4_CODEC_ID_G711U) { + fwrite(frame_data.data, 1, frame_data.data_length, audio_file_fp); + } + } + +destroy_mp4: + ret = kd_mp4_destroy(mp4_demuxer); + if (ret < 0) { + printf("destroy mp4 failed.\n"); + return -1; + } + + if (video_file_fp) { + fclose(video_file_fp); + video_file_fp = NULL; + } + + if (audio_file_fp) { + fclose(audio_file_fp); + audio_file_fp = NULL; + } + + printf("mp4 demuxer end...\n"); + return 0; +} diff --git a/src/big/mpp/middleware/sample/sample_muxer/Makefile b/src/big/mpp/middleware/sample/sample_muxer/Makefile new file mode 100644 index 000000000..ffd51bf29 --- /dev/null +++ b/src/big/mpp/middleware/sample/sample_muxer/Makefile @@ -0,0 +1,54 @@ +include $(MPP_SRC_DIR)/middleware/mpp.mk +include $(MPP_SRC_DIR)/middleware/rt-smart.mk + +CURRECT_DIR_NAME=$(shell basename `pwd`) +LOCAL_SRC_DIR = $(shell pwd) +BIN = $(MPP_SRC_DIR)/userapps/sample/elf/$(CURRECT_DIR_NAME).elf +LIBPATH = $(MPP_LIB_PATH) +LIBS = $(MPP_LIBS) + +CC_CFLAGS_EX=-mcmodel=medany -march=rv64imafdcv -mabi=lp64d -Wall -O0 -g -gdwarf-2 -n --static $(KCFLAGS) + +MP4_FORMAT = $(MPP_SRC_DIR)/middleware/src/mp4_format +KDMEDIA = $(MPP_SRC_DIR)/middleware/src/kdmedia + +LOCAL_LIBS_PATH = -L$(KDMEDIA) -L$(MP4_FORMAT)/lib +LOCAL_LIBS = -lkdmedia -lmp4 + +LOCAL_CFLAGS = -I$(LOCAL_SRC_DIR) -I$(MP4_FORMAT)/include -I$(KDMEDIA)/include + +WERROR_FLAGS = -Wno-register -Wno-multichar -Wno-pessimizing-move -Wno-deprecated-declarations -Wno-unused-result -Wno-unused-variable -Wno-format -Wno-return-type -Wno-sign-compare -Wno-unused-label + +CXX_FLAGS = $(WERROR_FLAGS) \ + +SRCS = $(wildcard $(LOCAL_SRC_DIR)/*.c) + +OBJS = $(patsubst %.c,%.o,$(SRCS)) + +CPP_SRCS = $(wildcard $(LOCAL_SRC_DIR)/*.cpp) + +CPP_OBJS = $(patsubst %.cpp,%.o,$(CPP_SRCS)) + +all:$(BIN) + @-rm -f *.o + @echo "${PWD}/Makefile all" + +$(OBJS): %.o : %.c + @echo CC $@ + @echo $(LOCAL_CFLAGS) + @$(CC) $(CC_CFLAGS_EX) $(LOCAL_CFLAGS) $(BSP_CFLGAS) $(RTSMART_CFLAGS) $(MPP_USER_CFLGAS) $(LOCAL_LIBS) -c $< -o $@ + +$(CPP_OBJS): %.o : %.cpp + @echo CXX $@ + @echo $(LOCAL_CFLAGS) + @$(CPP) $(CC_CFLAGS_EX) $(CXX_FLAGS) $(LOCAL_CFLAGS) $(BSP_CFLGAS) $(RTSMART_CFLAGS) $(MPP_USER_CFLGAS) $(LOCAL_LIBS) -c $< -o $@ + +$(BIN): $(OBJS) $(CPP_OBJS) + @echo LD $@ + @$(CPP) -o $(BIN) $(LINKFLAG) -Wl,--whole-archive -Wl,--no-whole-archive -n --static $^ -L$(LIBPATH) $(CXX_FLAGS) $(LOCAL_LIBS) $(LOCAL_LIBS_PATH) -Wl,--start-group $(LIBS) -Wl,--end-group + +clean: + echo "${PWD}/Makefile clean" + rm -rf $(BIN) $(OBJS) + +.PHONY: all clean diff --git a/src/big/mpp/middleware/sample/sample_muxer/main.cpp b/src/big/mpp/middleware/sample/sample_muxer/main.cpp new file mode 100644 index 000000000..3b26359cc --- /dev/null +++ b/src/big/mpp/middleware/sample/sample_muxer/main.cpp @@ -0,0 +1,335 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "media.h" +#include "mp4_format.h" + +using namespace std::chrono_literals; + +std::atomic g_exit_flag{false}; +static char g_mp4_pathname[256]; + +static void sigHandler(int sig_no) +{ + g_exit_flag.store(true); + printf("exit_flag true\n"); +} + +class MyMp4muxer : public IOnAEncData, public IOnVEncData +{ +public: + MyMp4muxer() {} + + // IOnAEncData + virtual void OnAEncData(k_u32 chn_id, k_u8*pdata,size_t size,k_u64 time_stamp) override + { + std::unique_lock lck(frame_muxer_mutex_); + if (first_frame_time_stamp_ == 0) + { + return ; + } + if (started_) + { + k_mp4_frame_data_s frame_data; + memset(&frame_data, 0, sizeof(frame_data)); + frame_data.codec_id = K_MP4_CODEC_ID_G711U; + frame_data.data = pdata; + frame_data.data_length = size; + frame_data.time_stamp = time_stamp - first_frame_time_stamp_; + if (frame_data.time_stamp < 0) + { + printf("audio frame_data timestamp <0,return\n"); + return ; + } + k_u32 ret = kd_mp4_write_frame(mp4_muxer_, audio_track_handle_, &frame_data); + if (ret < 0) + { + printf("mp4 write audio frame failed.\n"); + return; + } + + } + } + + // IOnVEncData + virtual void OnVEncData(k_u32 chn_id, void *data, size_t size, k_venc_pack_type type, uint64_t first_time_stamp) override + { + std::unique_lock lck(frame_muxer_mutex_); + if (first_frame_time_stamp_ == 0) + { + first_frame_time_stamp_ = first_time_stamp; + } + if (started_) + { + if (video_stream_count_ % 30 == 0) + printf("recv count:%d, chn:%d, len:%d\n", video_stream_count_, 0, size); + + k_mp4_frame_data_s frame_data; + memset(&frame_data, 0, sizeof(frame_data)); + frame_data.codec_id = _get_mp4_codec_type(config_.video_type); + frame_data.data = (uint8_t *)data; + frame_data.data_length = size; + frame_data.time_stamp = first_time_stamp - first_frame_time_stamp_; + + if (!get_idr_) { + memcpy(save_idr_ + save_size_, frame_data.data, frame_data.data_length); + save_size_ += frame_data.data_length; + first_time_stamp_ = first_time_stamp - first_frame_time_stamp_; + } + + video_stream_count_++; + if (video_stream_count_ == 2) { + get_idr_ = 1; + memset(&frame_data, 0, sizeof(frame_data)); + frame_data.codec_id = _get_mp4_codec_type(config_.video_type); + frame_data.data = save_idr_; + frame_data.data_length = save_size_; + frame_data.time_stamp = first_time_stamp_; + } + + if (get_idr_) { + k_u32 ret = kd_mp4_write_frame(mp4_muxer_, video_track_handle_, &frame_data); + if (ret < 0) { + printf("mp4 write video frame failed.\n"); + return ; + } + } + + } + } + + int Init(const KdMediaInputConfig &config) + { + mp4_muxer_init(config); + if (media_.Init(config) < 0) + return -1; + if (media_.CreateAiAEnc(this) < 0) + return -1; + if (media_.CreateADecAo() < 0) + return -1; + if (config.video_valid && media_.CreateVcapVEnc(this) < 0) + return -1; + + return 0; + } + int DeInit() + { + Stop(); + media_.DestroyVcapVEnc(); + media_.DestroyADecAo(); + media_.DestroyAiAEnc(); + media_.Deinit(); + mp4_muxer_deinit(); + return 0; + } + + int Start() + { + if (started_) + return 0; + media_.StartADecAo(); + media_.StartAiAEnc(); + media_.StartVcapVEnc(); + started_ = true; + return 0; + } + int Stop() + { + if (!started_) + return 0; + started_ = false; + media_.StopVcapVEnc(); + media_.StopADecAo(); + media_.StopAiAEnc(); + return 0; + } + +protected: + int mp4_muxer_init(const KdMediaInputConfig &config) + { + printf("mp4 config audio channel:%d,samplerate:%d\n",config.audio_channel_cnt,config.audio_samplerate); + + config_ = config; + k_s32 ret; + k_mp4_config_s mp4_config; + memset(&mp4_config, 0, sizeof(mp4_config)); + mp4_config.config_type = K_MP4_CONFIG_MUXER; + //strcpy(mp4_config.muxer_config.file_name, "/sharefs/test.mp4"); + strcpy(mp4_config.muxer_config.file_name,g_mp4_pathname); + mp4_config.muxer_config.fmp4_flag = 0; + + ret = kd_mp4_create(&mp4_muxer_, &mp4_config); + if (ret < 0) + { + printf("mp4 muxer create failed.\n"); + return -1; + } + + // create video track + k_mp4_track_info_s video_track_info; + memset(&video_track_info, 0, sizeof(video_track_info)); + video_track_info.track_type = K_MP4_STREAM_VIDEO; + video_track_info.time_scale = 1000; + video_track_info.video_info.width = config.venc_width; + video_track_info.video_info.height = config.venc_height; + ret = kd_mp4_create_track(mp4_muxer_, &video_track_handle_, &video_track_info); + if (ret < 0) + { + printf("create video track failed.\n"); + return -1; + } + + // create audio track + k_mp4_track_info_s audio_track_info; + memset(&audio_track_info, 0, sizeof(audio_track_info)); + audio_track_info.track_type = K_MP4_STREAM_AUDIO; + audio_track_info.time_scale = 1000; + audio_track_info.audio_info.channels = config.audio_channel_cnt; + audio_track_info.audio_info.codec_id = K_MP4_CODEC_ID_G711U; + audio_track_info.audio_info.sample_rate = config.audio_samplerate; + audio_track_info.audio_info.bit_per_sample = 16; + ret = kd_mp4_create_track(mp4_muxer_, &audio_track_handle_, &audio_track_info); + if (ret < 0) + { + printf("create video track failed.\n"); + return -1; + } + first_save_idr_frame_ = false; + video_header_len_ = 0; + + return 0; + } + + int mp4_muxer_deinit() + { + k_s32 ret; + ret = kd_mp4_destroy_tracks(mp4_muxer_); + if (ret < 0) + { + printf("destroy mp4 tracks failed.\n"); + return -1; + } + + ret = kd_mp4_destroy(mp4_muxer_); + if (ret < 0) + { + printf("destroy mp4 failed.\n"); + return -1; + } + + return 0; + } + + k_mp4_codec_id_e _get_mp4_codec_type(KdMediaVideoType video_type) + { + if (video_type == KdMediaVideoType::kVideoTypeH265) + { + return K_MP4_CODEC_ID_H265; + } + else if (video_type == KdMediaVideoType::kVideoTypeH264) + { + return K_MP4_CODEC_ID_H264; + } + + return K_MP4_CODEC_ID_H265; + } + +private: + KD_HANDLE mp4_muxer_{NULL}; + KD_HANDLE video_track_handle_{NULL}; + KD_HANDLE audio_track_handle_{NULL}; + KdMedia media_; + std::string stream_url_; + std::atomic started_{false}; + std::atomic first_save_idr_frame_{false}; + KdMediaInputConfig config_; + uint8_t save_idr_[1920 * 1080 * 3 / 2]; + uint32_t video_header_len_{0}; + + uint32_t video_stream_count_{0}; + bool get_idr_{false}; + uint32_t save_size_{0}; + uint64_t first_time_stamp_{0}; + + std::mutex frame_muxer_mutex_; + + std::atomic first_frame_time_stamp_{0}; + uint64_t video_first_time_stamp_{0}; +}; + +static void show_usage(char* pname) +{ + printf("Usage: ./%s -o *.mp4 -s 7\n",pname); + printf("-s: the sensor type: default 7\n"); + printf(" see camera sensor doc.\n"); + printf("-o: save mp4 path file name\n"); +} + +int main(int argc, char *argv[]) +{ + signal(SIGINT, sigHandler); + + KdMediaInputConfig config = { + .video_valid = true, + .sensor_type = IMX335_MIPI_2LANE_RAW12_1920X1080_30FPS_LINEAR, + .sensor_num = 1, + .video_type = KdMediaVideoType::kVideoTypeH265, + .venc_width = 1280, + .venc_height = 720, + .bitrate_kbps = 4000, + + .audio_samplerate = 44100, + .audio_channel_cnt = 2, + .pitch_shift_semitones = 0}; + + if (argc > 1) + { + for (int i = 1; i < argc; i += 2) + { + if (strcmp(argv[i], "-s") == 0) + { + config.sensor_type = (k_vicap_sensor_type)atoi(argv[i + 1]); + } + if (strcmp(argv[i], "-o") == 0) + { + memset(g_mp4_pathname,0,sizeof(g_mp4_pathname)); + strncpy(g_mp4_pathname,argv[i + 1],sizeof(g_mp4_pathname)); + } + else if (strcmp(argv[i], "-h") == 0) + { + show_usage(argv[0]); + return 0; + } + } + } + else + { + show_usage(argv[0]); + return 0; + } + + printf("mp4 muxer...\n"); + + MyMp4muxer *mp4muxer = new MyMp4muxer(); + if (!mp4muxer || mp4muxer->Init(config) < 0) + { + std::cout << "mp4muxer Init failed." << std::endl; + return -1; + } + mp4muxer->Start(); + + while (!g_exit_flag) + { + std::this_thread::sleep_for(100ms); + } + mp4muxer->Stop(); + mp4muxer->DeInit(); + delete mp4muxer; + return 0; +} diff --git a/src/big/mpp/middleware/sample/sample_player/Makefile b/src/big/mpp/middleware/sample/sample_player/Makefile new file mode 100644 index 000000000..55075f785 --- /dev/null +++ b/src/big/mpp/middleware/sample/sample_player/Makefile @@ -0,0 +1,54 @@ +include $(MPP_SRC_DIR)/middleware/mpp.mk +include $(MPP_SRC_DIR)/middleware/rt-smart.mk + +CURRECT_DIR_NAME=$(shell basename `pwd`) +LOCAL_SRC_DIR = $(shell pwd) +BIN = $(MPP_SRC_DIR)/userapps/sample/elf/$(CURRECT_DIR_NAME).elf +LIBPATH = $(MPP_LIB_PATH) +LIBS = $(MPP_LIBS) + +CC_CFLAGS_EX=-mcmodel=medany -march=rv64imafdcv -mabi=lp64d -Wall -O0 -g -gdwarf-2 -n --static $(KCFLAGS) + +MP4_FORMAT = $(MPP_SRC_DIR)/middleware/src/mp4_format +KPLAYER = $(MPP_SRC_DIR)/middleware/src/mp4_player + +LOCAL_LIBS_PATH = -L$(MP4_FORMAT)/lib -L$(KPLAYER) +LOCAL_LIBS = -lmp4_player -lmp4 + +LOCAL_CFLAGS = -I$(LOCAL_SRC_DIR) -I$(MP4_FORMAT)/include -I$(KPLAYER)/include + +WERROR_FLAGS = -Wno-register -Wno-multichar -Wno-pessimizing-move -Wno-deprecated-declarations -Wno-unused-result -Wno-unused-variable -Wno-format -Wno-return-type -Wno-sign-compare -Wno-unused-label + +CXX_FLAGS = $(WERROR_FLAGS) \ + +SRCS = $(wildcard $(LOCAL_SRC_DIR)/*.c) + +OBJS = $(patsubst %.c,%.o,$(SRCS)) + +CPP_SRCS = $(wildcard $(LOCAL_SRC_DIR)/*.cpp) + +CPP_OBJS = $(patsubst %.cpp,%.o,$(CPP_SRCS)) + +all:$(BIN) + @-rm -f *.o + @echo "${PWD}/Makefile all" + +$(OBJS): %.o : %.c + @echo CC $@ + @echo $(LOCAL_CFLAGS) + @$(CC) $(CC_CFLAGS_EX) $(LOCAL_CFLAGS) $(BSP_CFLGAS) $(RTSMART_CFLAGS) $(MPP_USER_CFLGAS) $(LOCAL_LIBS) -c $< -o $@ + +$(CPP_OBJS): %.o : %.cpp + @echo CXX $@ + @echo $(LOCAL_CFLAGS) + @$(CPP) $(CC_CFLAGS_EX) $(CXX_FLAGS) $(LOCAL_CFLAGS) $(BSP_CFLGAS) $(RTSMART_CFLAGS) $(MPP_USER_CFLGAS) $(LOCAL_LIBS) -c $< -o $@ + +$(BIN): $(OBJS) $(CPP_OBJS) + @echo LD $@ + @$(CPP) -o $(BIN) $(LINKFLAG) -Wl,--whole-archive -Wl,--no-whole-archive -n --static $^ -L$(LIBPATH) $(CXX_FLAGS) $(LOCAL_LIBS) $(LOCAL_LIBS_PATH) -Wl,--start-group $(LIBS) -Wl,--end-group + +clean: + echo "${PWD}/Makefile clean" + rm -rf $(BIN) $(OBJS) + +.PHONY: all clean diff --git a/src/big/mpp/middleware/sample/sample_player/sample_player.c b/src/big/mpp/middleware/sample/sample_player/sample_player.c new file mode 100644 index 000000000..db10a8ee1 --- /dev/null +++ b/src/big/mpp/middleware/sample/sample_player/sample_player.c @@ -0,0 +1,95 @@ +#include "kplayer.h" +#include +#include +#include +#include +#include +#include + +static sem_t g_stop_player_sem; + +static void sig_handler(int sig) +{ + printf("receive SIGINT \n"); + kd_player_stop(); +} + +static k_s32 player_event_cb(K_PLAYER_EVENT_E enEvent, void *pData) +{ + if (enEvent == K_PLAYER_EVENT_EOF) + { + sem_post(&g_stop_player_sem); + } + return 0; +} + +#if 0 +static void showpicture(const char* pic_path) +{ + kd_player_init(K_TRUE); + kd_picture_init(); + kd_picture_show(pic_path); + sleep(5); + kd_picture_deinit(); + kd_player_deinit(K_TRUE); +} +#endif + +int main(int argc, char *argv[]) +{ +#if 1 + signal(SIGINT, sig_handler); + + if (argc < 3) { + printf("Usage: ./%s <*.mp4> \n",argv[0]); + return 0; + } + + printf("file pathname:%s\n",argv[1]); + int connect_type = atoi(argv[2]); + printf("connector type:%d\n",connect_type); + + sem_init(&g_stop_player_sem,0,0); + kd_player_init(K_TRUE); + + kd_player_set_connector_type(connect_type); + + kd_player_regcallback(player_event_cb,NULL); + + kd_player_setdatasource(argv[1]); + kd_player_start(); + sem_wait(&g_stop_player_sem); + kd_player_stop(); + kd_player_deinit(K_TRUE); + sem_destroy(&g_stop_player_sem); +#else + if (argc < 2) { + printf("Usage: ./%s <*.mp4> \n",argv[0]); + return 0; + } + + #if 1 + kd_player_init(K_TRUE); + kd_picture_init(); + + printf("==========show next \n"); + kd_picture_show("/clip/snapshot/stay_0.jpg"); + sleep(5); + printf("==========show next \n"); + kd_picture_show("/clip/snapshot/stay_1.jpg"); + sleep(5); + printf("==========show next \n"); + kd_picture_show("/clip/snapshot/stay_2.jpg"); + sleep(5); + //kd_picture_show("/clip/snapshot/1.jpg"); + sleep(1000); + #else + + showpicture("/clip/snapshot/stay_0.jpg"); + showpicture("/clip/snapshot/stay_1.jpg"); + showpicture("/clip/snapshot/stay_2.jpg"); + #endif +#endif + + return 0; +} diff --git a/src/big/mpp/middleware/sample/sample_rtspclient/Makefile b/src/big/mpp/middleware/sample/sample_rtspclient/Makefile new file mode 100644 index 000000000..54548069d --- /dev/null +++ b/src/big/mpp/middleware/sample/sample_rtspclient/Makefile @@ -0,0 +1,62 @@ +include $(MPP_SRC_DIR)/middleware/mpp.mk +include $(MPP_SRC_DIR)/middleware/rt-smart.mk + +CURRECT_DIR_NAME=$(shell basename `pwd`) +LOCAL_SRC_DIR = $(shell pwd) +BIN = $(MPP_SRC_DIR)/userapps/sample/elf/$(CURRECT_DIR_NAME).elf +LIBPATH = $(MPP_LIB_PATH) +LIBS = $(MPP_LIBS) + +LIBS_FOR_CONSOLE_APPLICATION = -lssl -lcrypto +CC_CFLAGS_EX=-mcmodel=medany -march=rv64imafdcv -mabi=lp64d -Wall -O0 -g -gdwarf-2 -n --static $(KCFLAGS) + +LIVE555_USAGEENVIRONMENT= $(MPP_SRC_DIR)/middleware/src/live555/UsageEnvironment +LIVE555_BASICUSAGEENVIRONMENT= $(MPP_SRC_DIR)/middleware/src/live555/BasicUsageEnvironment +LIVE555_GROUPSOCK = $(MPP_SRC_DIR)/middleware/src/live555/groupsock +LIVE555_LIVEMEDIA = $(MPP_SRC_DIR)/middleware/src/live555/liveMedia +LIVE555_RTSPCLIENT = $(MPP_SRC_DIR)/middleware/src/rtsp_client +KDMEDIA = $(MPP_SRC_DIR)/middleware/src/kdmedia + +LOCAL_LIBS_PATH = -L$(KDMEDIA) -L$(LIVE555_RTSPCLIENT) -L$(LIVE555_USAGEENVIRONMENT) -L$(LIVE555_BASICUSAGEENVIRONMENT) -L$(LIVE555_GROUPSOCK) -L$(LIVE555_LIVEMEDIA) +LOCAL_LIBS = -lkdmedia -lrtsp_client -lliveMedia -lgroupsock -lBasicUsageEnvironment -lUsageEnvironment + +LIVE555_COMPILE_OPTS = -DSOCKLEN_T=socklen_t -DNO_SSTREAM=1 -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -DNO_OPENSSL=1 + +LOCAL_CFLAGS = -I$(LOCAL_SRC_DIR) -I$(LIVE555_RTSPCLIENT)/include -I$(KDMEDIA)/include + +WERROR_FLAGS = -Wno-register -Wno-multichar -Wno-pessimizing-move -Wno-deprecated-declarations -Wno-unused-result -Wno-unused-variable -Wno-format -Wno-return-type -Wno-sign-compare -Wno-unused-label + +CXX_FLAGS = $(WERROR_FLAGS) \ + $(LIVE555_COMPILE_OPTS) \ + +SRCS = $(wildcard $(LOCAL_SRC_DIR)/*.c) + +OBJS = $(patsubst %.c,%.o,$(SRCS)) + +CPP_SRCS = $(wildcard $(LOCAL_SRC_DIR)/*.cpp) + +CPP_OBJS = $(patsubst %.cpp,%.o,$(CPP_SRCS)) + +all:$(BIN) + @-rm -f *.o + @echo "${PWD}/Makefile all" + +$(OBJS): %.o : %.c + @echo CC $@ + @echo $(LOCAL_CFLAGS) + @$(CC) $(CC_CFLAGS_EX) $(LOCAL_CFLAGS) $(BSP_CFLGAS) $(RTSMART_CFLAGS) $(MPP_USER_CFLGAS) $(LOCAL_LIBS) -c $< -o $@ + +$(CPP_OBJS): %.o : %.cpp + @echo CXX $@ + @echo $(LOCAL_CFLAGS) + @$(CPP) $(CC_CFLAGS_EX) $(CXX_FLAGS) $(LOCAL_CFLAGS) $(BSP_CFLGAS) $(RTSMART_CFLAGS) $(MPP_USER_CFLGAS) $(LOCAL_LIBS) -c $< -o $@ + +$(BIN): $(OBJS) $(CPP_OBJS) + @echo LD $@ + @$(CPP) -o $(BIN) $(LINKFLAG) -Wl,--whole-archive -Wl,--no-whole-archive -n --static $^ -L$(LIBPATH) $(CXX_FLAGS) $(LOCAL_LIBS) $(LOCAL_LIBS_PATH) -Wl,--start-group $(LIBS) -Wl,--end-group + +clean: + echo "${PWD}/Makefile clean" + rm -rf $(BIN) $(OBJS) + +.PHONY: all clean diff --git a/src/big/mpp/middleware/sample/sample_rtspclient/main.cpp b/src/big/mpp/middleware/sample/sample_rtspclient/main.cpp new file mode 100644 index 000000000..dcb069850 --- /dev/null +++ b/src/big/mpp/middleware/sample/sample_rtspclient/main.cpp @@ -0,0 +1,168 @@ +#include +#include +#include +#include +#include +#include "rtsp_client.h" +#include "media.h" + +using namespace std::chrono_literals; + +std::atomic g_exit_flag{false}; + +static void sigHandler(int sig_no) { + g_exit_flag.store(true); +} + +class MyRtspClient : public IOnBackChannel, public IOnAudioData, public IOnVideoData, public IOnAEncData, public IRtspClientEvent { + public: + MyRtspClient() {} + + // IOnBackChannel + virtual void OnBackChannelStart() override { + std::cout << "OnBackChannelStart called" << std::endl; + media_.StartAiAEnc(); + } + // IOnAEncData + virtual void OnAEncData(k_u32 chn_id, k_u8*pdata,size_t size,k_u64 time_stamp) override { + // std::cout << "OnAEncData -- size = " << stream_data->len << ", timestamp = " << stream_data->time_stamp << std::endl; + if (started_) { + rtsp_client_.SendAudioData((const uint8_t*)pdata, size, time_stamp); + } + } + // IOnAudioData, received from the server + virtual void OnAudioStart() override { + std::cout << "OnAudioStart called" << std::endl; + media_.StartADecAo(); + } + virtual void OnAudioData(const uint8_t *data, size_t size, uint64_t timestamp) override { + if (started_) { + // std::cout << "OnAudioData -- size = " << size << ", timestamp = " << timestamp << std::endl; + + // TODO, to handle jitter and control accumulation + // gather data to get complete frame(40ms). + if (audio_data_size == 0) { + audio_timestamp = timestamp; + } + for (size_t i = 0; i < size ;i++) { + g711_buffer_[audio_data_size++] = data[i]; + if (audio_data_size == 320) { + media_.SendAudioData(g711_buffer_, audio_data_size, audio_timestamp); + audio_data_size = 0; + audio_timestamp = timestamp; + } + } + } + } + // IOnVideoData, received from the server + virtual void OnVideoType(IOnVideoData::VideoType type, uint8_t *extra_data, size_t extra_data_size) { + video_type_ = type; + VdecInitParams params; + if (type == IOnVideoData::VideoTypeH264) { + std::cout << "OnVideoType() called, type H264" << std::endl; + params.type = KdMediaVideoType::kVideoTypeH264; + } + if (type == IOnVideoData::VideoTypeH265) { + std::cout << "OnVideoType() called, type H265" << std::endl; + params.type = KdMediaVideoType::kVideoTypeH265; + } + media_.CreateVdecVo(params); + media_.StartVDecVo(); + first_video_frame_ = true; + } + virtual void OnVideoData(const uint8_t *data, size_t size, uint64_t timestamp, bool keyframe) override { + // TODO, to handle jitter and control accumulation + if (started_) { + if (first_video_frame_ && !keyframe) return; + first_video_frame_ = false; + media_.SendVideoData(data, size, timestamp); + } + } + // IRtspClientEvent + virtual void OnRtspClientEvent(int event) override { + // At the moment, there is only one event : shutdown + printf("OnRtspClientEvent -- shutdown\n"); + g_exit_flag.store(true); + } + + int Init() { + RtspClientInitParam param; + param.on_video_data = this; + param.on_audio_data = this; + param.on_backchannel = this; + param.on_event = this; + if (rtsp_client_.Init(param) < 0) return -1; + if (media_.Init() < 0) return -1; + if (media_.CreateAiAEnc(this) < 0) return -1; + if (media_.CreateADecAo() < 0) return -1; + return 0; + } + int DeInit() { + Stop(); + media_.DestroyAiAEnc(); + media_.DestroyADecAo(); + media_.DestroyVDecVo(); + media_.Deinit(); + rtsp_client_.DeInit(); + return 0; + } + + int Start(const char *url) { + if(started_) return 0; + rtsp_client_.Open(url); + started_ = true; + return 0; + } + int Stop() { + if (!started_) return 0; + started_ = false; + rtsp_client_.Close(); + media_.StopAiAEnc(); + media_.StopADecAo(); + media_.StopVDecVo(); + return 0; + } + + private: + KdRtspClient rtsp_client_; + KdMedia media_; + std::atomic started_{false}; + uint8_t g711_buffer_[320]; + size_t audio_data_size = 0; + uint64_t audio_timestamp; + IOnVideoData::VideoType video_type_{IOnVideoData::VideoTypeInvalid}; + bool first_video_frame_{true}; +}; + +int main(int argc, char *argv[]) { + signal(SIGINT, sigHandler); + signal(SIGPIPE, SIG_IGN); + g_exit_flag.store(false); + + if (argc < 2) { + printf("Usage: ./backchannel_client \n"); + printf(" out_type: vo type, see vo doc, default 0.\n"); + return 0; + } + std::string url = argv[1]; + if (argc > 2) { + k_connector_type connector_type = (k_connector_type)atoi(argv[2]); + KdMedia::set_vo_connector_type(connector_type); + } + + MyRtspClient *client = new MyRtspClient(); + if (!client || client->Init() < 0) { + std::cout << "KdRtspClient Init failed." << std::endl; + return -1; + } + client->Start(url.c_str()); + + while (!g_exit_flag) { + std::this_thread::sleep_for(100ms); + } + + client->Stop(); + client->DeInit(); + delete client; + return 0; +} diff --git a/src/big/mpp/middleware/sample/sample_rtspserver/Makefile b/src/big/mpp/middleware/sample/sample_rtspserver/Makefile new file mode 100644 index 000000000..85dbf42e0 --- /dev/null +++ b/src/big/mpp/middleware/sample/sample_rtspserver/Makefile @@ -0,0 +1,62 @@ +include $(MPP_SRC_DIR)/middleware/mpp.mk +include $(MPP_SRC_DIR)/middleware/rt-smart.mk + +CURRECT_DIR_NAME=$(shell basename `pwd`) +LOCAL_SRC_DIR = $(shell pwd) +BIN = $(MPP_SRC_DIR)/userapps/sample/elf/$(CURRECT_DIR_NAME).elf +LIBPATH = $(MPP_LIB_PATH) +LIBS = $(MPP_LIBS) + +LIBS_FOR_CONSOLE_APPLICATION = -lssl -lcrypto +CC_CFLAGS_EX=-mcmodel=medany -march=rv64imafdcv -mabi=lp64d -Wall -O0 -g -gdwarf-2 -n --static $(KCFLAGS) + +LIVE555_USAGEENVIRONMENT= $(MPP_SRC_DIR)/middleware/src/live555/UsageEnvironment +LIVE555_BASICUSAGEENVIRONMENT= $(MPP_SRC_DIR)/middleware/src/live555/BasicUsageEnvironment +LIVE555_GROUPSOCK = $(MPP_SRC_DIR)/middleware/src/live555/groupsock +LIVE555_LIVEMEDIA = $(MPP_SRC_DIR)/middleware/src/live555/liveMedia +LIVE555_RTSPSERVER = $(MPP_SRC_DIR)/middleware/src/rtsp_server +KDMEDIA = $(MPP_SRC_DIR)/middleware/src/kdmedia + +LOCAL_LIBS_PATH = -L$(KDMEDIA) -L$(LIVE555_RTSPSERVER) -L$(LIVE555_USAGEENVIRONMENT) -L$(LIVE555_BASICUSAGEENVIRONMENT) -L$(LIVE555_GROUPSOCK) -L$(LIVE555_LIVEMEDIA) +LOCAL_LIBS = -lkdmedia -lrtsp_server -lliveMedia -lgroupsock -lBasicUsageEnvironment -lUsageEnvironment + +LIVE555_COMPILE_OPTS = -DSOCKLEN_T=socklen_t -DNO_SSTREAM=1 -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -DNO_OPENSSL=1 + +LOCAL_CFLAGS = -I$(LOCAL_SRC_DIR) -I$(LIVE555_RTSPSERVER)/include -I$(KDMEDIA)/include + +WERROR_FLAGS = -Wno-register -Wno-multichar -Wno-pessimizing-move -Wno-deprecated-declarations -Wno-unused-result -Wno-unused-variable -Wno-format -Wno-return-type -Wno-sign-compare -Wno-unused-label + +CXX_FLAGS = $(WERROR_FLAGS) \ + $(LIVE555_COMPILE_OPTS) \ + +SRCS = $(wildcard $(LOCAL_SRC_DIR)/*.c) + +OBJS = $(patsubst %.c,%.o,$(SRCS)) + +CPP_SRCS = $(wildcard $(LOCAL_SRC_DIR)/*.cpp) + +CPP_OBJS = $(patsubst %.cpp,%.o,$(CPP_SRCS)) + +all:$(BIN) + @-rm -f *.o + @echo "${PWD}/Makefile all" + +$(OBJS): %.o : %.c + @echo CC $@ + @echo $(LOCAL_CFLAGS) + @$(CC) $(CC_CFLAGS_EX) $(LOCAL_CFLAGS) $(BSP_CFLGAS) $(RTSMART_CFLAGS) $(MPP_USER_CFLGAS) $(LOCAL_LIBS) -c $< -o $@ + +$(CPP_OBJS): %.o : %.cpp + @echo CXX $@ + @echo $(LOCAL_CFLAGS) + @$(CPP) $(CC_CFLAGS_EX) $(CXX_FLAGS) $(LOCAL_CFLAGS) $(BSP_CFLGAS) $(RTSMART_CFLAGS) $(MPP_USER_CFLGAS) $(LOCAL_LIBS) -c $< -o $@ + +$(BIN): $(OBJS) $(CPP_OBJS) + @echo LD $@ + @$(CPP) -o $(BIN) $(LINKFLAG) -Wl,--whole-archive -Wl,--no-whole-archive -n --static $^ -L$(LIBPATH) $(CXX_FLAGS) $(LOCAL_LIBS) $(LOCAL_LIBS_PATH) -Wl,--start-group $(LIBS) -Wl,--end-group + +clean: + echo "${PWD}/Makefile clean" + rm -rf $(BIN) $(OBJS) + +.PHONY: all clean diff --git a/src/big/mpp/middleware/sample/sample_rtspserver/main.cpp b/src/big/mpp/middleware/sample/sample_rtspserver/main.cpp new file mode 100644 index 000000000..9a70a6b1c --- /dev/null +++ b/src/big/mpp/middleware/sample/sample_rtspserver/main.cpp @@ -0,0 +1,222 @@ +#include +#include +#include +#include +#include +#include +#include "rtsp_server.h" +#include "media.h" + +using namespace std::chrono_literals; + +std::atomic g_exit_flag{false}; + +static void sigHandler(int sig_no) { + g_exit_flag.store(true); + printf("exit_flag true\n"); +} + +static void Usage() { + std::cout << "Usage: ./rtsp_sever [-v] [-s ] [-t ] [-w ] [-h ] [-b ] [-a ]" << std::endl; + std::cout << "-v: enable video session" << std::endl; + std::cout << "-s: the sensor type, default 7 :" << std::endl; + std::cout << " see camera sensor doc." << std::endl; + std::cout << "-t: the video encoder type: h264/h265, default h265" << std::endl; + std::cout << "-w: the video encoder width, default 1280" << std::endl; + std::cout << "-h: the video encoder height, default 720" << std::endl; + std::cout << "-b: the video encoder bitrate(kbps), default 2000" << std::endl; + std::cout << "-a: pitch shift semitones [-12,12], default 0" << std::endl; + exit(-1); +} + +int parse_config(int argc, char *argv[], KdMediaInputConfig &config) { + int result; + opterr = 0; + while ((result = getopt(argc, argv, "Hvs:n:t:w:h:b:a:")) != -1) { + switch(result) { + case 'H' : { + Usage(); break; + } + case 'v' : { + config.video_valid = true; + break; + } + case 's' : { + int n = atoi(optarg); + if (n < 0 || n > 27) Usage(); + config.sensor_type = (k_vicap_sensor_type)n; + config.video_valid = true; + break; + } + case 't': { + std::string s = optarg; + if (s == "h264") config.video_type = KdMediaVideoType::kVideoTypeH264; + else if (s == "h265") config.video_type = KdMediaVideoType::kVideoTypeH264; + else Usage(); + config.video_valid = true; + break; + } + case 'w': { + int n = atoi(optarg); + if (n < 0) Usage(); + config.venc_width = n; + config.video_valid = true; + break; + } + case 'h': { + int n = atoi(optarg); + if (n < 0) Usage(); + config.venc_height = n; + config.video_valid = true; + break; + } + case 'b': { + int n = atoi(optarg); + if (n < 0) Usage(); + config.bitrate_kbps = n; + config.video_valid = true; + break; + } + case 'a': { + int n = atoi(optarg); + if (n < -12 || n > 12) Usage(); + config.pitch_shift_semitones = n; + break; + } + default: Usage(); break; + } + } + if (config.video_valid) { + // validate the parameters... TODO + std::cout << "Validate the input config, not implemented yet, TODO." << std::endl; + } + return 0; +} + +class MyRtspServer : public IOnBackChannel, public IOnAEncData, public IOnVEncData { + public: + MyRtspServer() {} + + // IOnBackChannel + virtual void OnBackChannelData(std::string &session_name, const uint8_t *data, size_t size, uint64_t timestamp) override { + if (started_) { + // TODO, need to queue data to handle jitter and control accumulation + // gather data to get complete frame(40ms). + if (backchannel_data_size == 0) { + timestamp_backchanel = timestamp; + } + for (size_t i = 0; i < size ;i++) { + g711_buffer_backchannel[backchannel_data_size++] = data[i]; + if (backchannel_data_size == 320) { + media_.SendAudioData(g711_buffer_backchannel, backchannel_data_size, timestamp_backchanel); + backchannel_data_size = 0; + timestamp_backchanel = timestamp; + } + } + } + } + + // IOnAEncData + virtual void OnAEncData(k_u32 chn_id, k_u8*pdata,size_t size,k_u64 time_stamp) override { + if (started_) { + rtsp_server_.SendAudioData(stream_url_, (const uint8_t*)pdata, size, time_stamp); + } + } + + // IOnVEncData + virtual void OnVEncData(k_u32 chn_id, void *data, size_t size, k_venc_pack_type type,uint64_t timestamp) override { + if (started_) { + rtsp_server_.SendVideoData(stream_url_, (const uint8_t*)data, size, timestamp); + } + } + + int Init(const KdMediaInputConfig &config, const std::string &stream_url = "BackChannelTest", int port = 8554) { + if (rtsp_server_.Init(port, this) < 0) { + return -1; + } + // enable audio-track and backchannel-track + SessionAttr session_attr; + session_attr.with_audio = true; + session_attr.with_audio_backchannel = true; + session_attr.with_video = config.video_valid; + if (config.video_valid) { + if (config.video_type == KdMediaVideoType::kVideoTypeH264) session_attr.video_type = VideoType::kVideoTypeH264; + else if (config.video_type == KdMediaVideoType::kVideoTypeH265) session_attr.video_type = VideoType::kVideoTypeH265; + else { + std::cout << "video codec type not supported yet" << std::endl; + return -1; + } + } + if (rtsp_server_.CreateSession(stream_url, session_attr) < 0) return -1; + stream_url_ = stream_url; + + if (media_.Init(config) < 0) return -1; + if (media_.CreateAiAEnc(this) < 0) return -1; + if (media_.CreateADecAo() < 0) return -1; + if (config.video_valid && media_.CreateVcapVEnc(this) < 0) return -1; + return 0; + } + int DeInit() { + Stop(); + media_.DestroyVcapVEnc(); + media_.DestroyADecAo(); + media_.DestroyAiAEnc(); + media_.Deinit(); + rtsp_server_.DeInit(); + return 0; + } + + int Start() { + if(started_) return 0; + media_.StartADecAo(); + rtsp_server_.Start(); + media_.StartAiAEnc(); + media_.StartVcapVEnc(); + started_ = true; + return 0; + } + int Stop() { + if (!started_) return 0; + rtsp_server_.Stop(); + started_ = false; + media_.StopVcapVEnc(); + media_.StopADecAo(); + media_.StopAiAEnc(); + return 0; + } + + private: + KdRtspServer rtsp_server_; + KdMedia media_; + std::string stream_url_; + std::atomic started_{false}; + uint8_t g711_buffer_backchannel[320]; + size_t backchannel_data_size = 0; + uint64_t timestamp_backchanel; +}; + +int main(int argc, char *argv[]) { + std::cout << "./rtsp_server -H to show usage" << std::endl; + signal(SIGINT, sigHandler); + signal(SIGPIPE, SIG_IGN); + g_exit_flag.store(false); + + KdMediaInputConfig config; + parse_config(argc, argv, config); + + MyRtspServer *server = new MyRtspServer(); + if (!server || server->Init(config) < 0) { + std::cout << "KdRtspServer Init failed." << std::endl; + return -1; + } + server->Start(); + + while (!g_exit_flag) { + std::this_thread::sleep_for(100ms); + } + + server->Stop(); + server->DeInit(); + delete server; + return 0; +} diff --git a/src/big/mpp/middleware/sample/sample_rtspserver/main.cpp-bk b/src/big/mpp/middleware/sample/sample_rtspserver/main.cpp-bk new file mode 100644 index 000000000..f0d05d914 --- /dev/null +++ b/src/big/mpp/middleware/sample/sample_rtspserver/main.cpp-bk @@ -0,0 +1,47 @@ +#include +#include +#include +#include +#include +#include +#include +#include "rtsp_server.h" +#include "media.h" + + +int main(int argc, char *argv[]) +{ + KdMedia media; + KdMediaInputConfig meida_input_cfg; + meida_input_cfg.video_valid = true; + media.Init(meida_input_cfg); + + media.CreateAiAEnc(nullptr); + media.StartAiAEnc(); + + media.CreateVcapVEnc(nullptr); + media.StartVcapVEnc(); + + sleep(10); + media.StopAiAEnc(); + media.StopVcapVEnc(); + media.DestroyAiAEnc(); + media.DestroyVcapVEnc(); + + media.Deinit(); + + +#if 0 + printf("=========begin\n"); + KdRtspServer rtsp_server_; + rtsp_server_.Init(8080, nullptr); + + k_audio_dev audio_dev = 0; + kd_mpi_ai_enable(audio_dev); + + printf("=========end\n"); +#endif + getchar(); + + return 0; +} diff --git a/src/big/mpp/middleware/src/Makefile b/src/big/mpp/middleware/src/Makefile new file mode 100644 index 000000000..7b2a7d5c3 --- /dev/null +++ b/src/big/mpp/middleware/src/Makefile @@ -0,0 +1,35 @@ +include $(MPP_SRC_DIR)/middleware/mpp.mk +include $(MPP_SRC_DIR)/middleware/rt-smart.mk + +AR = riscv64-unknown-linux-musl-ar +ARFLAGS = -rc + +CURRECT_DIR_NAME=$(shell basename `pwd`) +LOCAL_SRC_DIR = $(shell pwd) + +LIVE555= $(LOCAL_SRC_DIR)/live555 +RTSP_CLIENT= $(LOCAL_SRC_DIR)/rtsp_client +RTSP_SERVER= $(LOCAL_SRC_DIR)/rtsp_server +MP4_FORMAT = $(LOCAL_SRC_DIR)/mp4_format +MP4_PLAYER = $(LOCAL_SRC_DIR)/mp4_player +KDMEDIA = $(LOCAL_SRC_DIR)/kdmedia + +all: + cd $(LIVE555) ; make + cd $(RTSP_CLIENT) ; make + cd $(RTSP_SERVER) ; make + cd $(MP4_FORMAT) ; make + cd $(MP4_PLAYER) ; make + cd $(KDMEDIA) ; make + + +clean: + echo "${PWD}/Makefile clean" + @cd $(LIVE555); make clean + @cd $(RTSP_CLIENT); make clean + @cd $(RTSP_SERVER); make clean + @cd $(MP4_FORMAT); make clean + @cd $(MP4_PLAYER); make clean + @cd $(KDMEDIA); make clean + +.PHONY: all clean diff --git a/src/big/mpp/middleware/src/kdmedia/Makefile b/src/big/mpp/middleware/src/kdmedia/Makefile new file mode 100644 index 000000000..250042bc2 --- /dev/null +++ b/src/big/mpp/middleware/src/kdmedia/Makefile @@ -0,0 +1,52 @@ +include $(MPP_SRC_DIR)/middleware/mpp.mk +include $(MPP_SRC_DIR)/middleware/rt-smart.mk + +AR = riscv64-unknown-linux-musl-ar +ARFLAGS = -rc + +CURRECT_DIR_NAME=$(shell basename `pwd`) +LOCAL_SRC_DIR = $(shell pwd) +BIN = lib$(CURRECT_DIR_NAME).a +LIBPATH = $(MPP_LIB_PATH) +LIBS = $(MPP_LIBS) + +LIBS_FOR_CONSOLE_APPLICATION = -lssl -lcrypto +CC_CFLAGS_EX=-mcmodel=medany -march=rv64imafdcv -mabi=lp64d -Wall -O0 -g -gdwarf-2 -n --static $(KCFLAGS) + + +LOCAL_CFLAGS = -I$(LOCAL_SRC_DIR) -I$(LOCAL_SRC_DIR)/include + +WERROR_FLAGS = -Wno-register -Wno-multichar -Wno-pessimizing-move -Wno-deprecated-declarations -Wno-unused-result -Wno-unused-variable -Wno-format -Wno-return-type -Wno-sign-compare -Wno-unused-label + +CXX_FLAGS = -std=c++20 \ + $(WERROR_FLAGS) \ + +SRCS = $(wildcard $(LOCAL_SRC_DIR)/*.c) + +OBJS = $(patsubst %.c,%.o,$(SRCS)) + +CPP_SRCS = $(wildcard $(LOCAL_SRC_DIR)/*.cpp) + +CPP_OBJS = $(patsubst %.cpp,%.o,$(CPP_SRCS)) + +all:$(BIN) + @-rm -f *.o + @echo "${PWD}/Makefile all" + +$(OBJS): %.o : %.c + @echo CC $@ + @$(CC) $(CC_CFLAGS_EX) $(LOCAL_CFLAGS) $(BSP_CFLGAS) $(RTSMART_CFLAGS) $(MPP_USER_CFLGAS) -c $< -o $@ + +$(CPP_OBJS): %.o : %.cpp + @echo CXX $@ + @$(CPP) $(CC_CFLAGS_EX) $(CXX_FLAGS) $(LOCAL_CFLAGS) $(BSP_CFLGAS) $(RTSMART_CFLAGS) $(MPP_USER_CFLGAS) -c $< -o $@ + +$(BIN): $(OBJS) $(CPP_OBJS) + @echo LD $@ + #@$(CPP) -o $(BIN) $(LINKFLAG) -Wl,--whole-archive -Wl,--no-whole-archive -n --static $^ -L$(LIBPATH) $(CXX_FLAGS) -Wl,--start-group $(LIBS) -Wl,--end-group + $(AR) $(ARFLAGS) $@ $^ +clean: + echo "${PWD}/Makefile clean" + rm -rf $(BIN) $(OBJS) + +.PHONY: all clean diff --git a/src/big/mpp/middleware/src/kdmedia/include/media.h b/src/big/mpp/middleware/src/kdmedia/include/media.h new file mode 100644 index 000000000..36ba1ea23 --- /dev/null +++ b/src/big/mpp/middleware/src/kdmedia/include/media.h @@ -0,0 +1,101 @@ +#ifndef _KD_MEDIA_H +#define _KD_MEDIA_H +#include +#include +#include +#include "k_vicap_comm.h" +#include "k_venc_comm.h" +#include "k_connector_comm.h" + +enum class KdMediaVideoType { + kVideoTypeH264, + kVideoTypeH265, + kVideoTypeMjpeg, + kVideoTypeButt +}; + +struct KdMediaInputConfig { + bool video_valid = false; + k_vicap_sensor_type sensor_type = IMX335_MIPI_2LANE_RAW12_1920X1080_30FPS_LINEAR; + int sensor_num = 1; + KdMediaVideoType video_type = KdMediaVideoType::kVideoTypeH265; + int venc_width = 1280; + int venc_height = 720; + int bitrate_kbps = 4000; + + int audio_samplerate = 8000; + int audio_channel_cnt = 1; + int pitch_shift_semitones = 0; // [-12, 12] +}; + +struct VdecInitParams { + KdMediaVideoType type = KdMediaVideoType::kVideoTypeH265; + size_t input_buf_size = 1920 * 1088; + int input_buf_num = 4; + int max_width = 1920; + int max_height = 1088; + int output_buf_num = 6; +}; + +class IOnAEncData { + public: + virtual ~IOnAEncData() {} + virtual void OnAEncData(k_u32 chn_id, k_u8*pdata,size_t size,k_u64 time_stamp) = 0; +}; + +class IOnVEncData { + public: + virtual ~IOnVEncData() {} + virtual void OnVEncData(k_u32 chn_id, void *data, size_t size, k_venc_pack_type type,uint64_t timestamp) = 0; +}; + + +// TODO, +// At the moment, KdMedia is for bidirection-speech only. +// +class KdMedia { + public: + KdMedia(); + ~KdMedia(); + int Init(const KdMediaInputConfig &config); + int Init(); + int Deinit(); + + //for audio capture and encoder + int CreateAiAEnc(IOnAEncData *on_aenc_data); + int DestroyAiAEnc(); + int StartAiAEnc(); + int StopAiAEnc(); + + //for audio decoder and audio output + int CreateADecAo(); + int DestroyADecAo(); + int StartADecAo(); + int StopADecAo(); + int SendAudioData(const uint8_t *data, size_t size, uint64_t timestamp_ms); + + // for video capture and encoder + int CreateVcapVEnc(IOnVEncData *on_venc_data); + int DestroyVcapVEnc(); + int StartVcapVEnc(); + int StopVcapVEnc(); + + // for video decoder and render + int CreateVdecVo(const VdecInitParams ¶ms); + int DestroyVDecVo(); + int StartVDecVo(); + int StopVDecVo(); + int SendVideoData(const uint8_t *data, size_t size, uint64_t timestamp_ms); + + static void set_vo_connector_type(k_connector_type &connector_type); + + private: + KdMedia(const KdMedia &) = delete; + KdMedia& operator=(const KdMedia &) = delete; + + private: + class Impl; + std::unique_ptr impl_{nullptr}; +}; + +#endif // _KD_MEDIA_H diff --git a/src/big/mpp/middleware/src/kdmedia/media.cpp b/src/big/mpp/middleware/src/kdmedia/media.cpp new file mode 100644 index 000000000..ec1a4041f --- /dev/null +++ b/src/big/mpp/middleware/src/kdmedia/media.cpp @@ -0,0 +1,1667 @@ +#include "media.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "mpi_sys_api.h" +#include "mpi_ai_api.h" +#include "mpi_aenc_api.h" +#include "mpi_ao_api.h" +#include "mpi_adec_api.h" +#include "mpi_vvi_api.h" +#include "mpi_venc_api.h" +#include "mpi_vicap_api.h" +#include "k_vicap_comm.h" +#include "k_vb_comm.h" +#include "mpi_vb_api.h" +#include "mpi_vdec_api.h" +#include "vo_cfg.h" + +#define AUDIO_PERSEC_DIV_NUM 25 +#define BIND_VO_LAYER 1 +#define VI_ALIGN_UP(addr, size) (((addr) + ((size)-1U)) & (~((size)-1U))) + +static k_s32 g_mmap_fd_tmp = 0; +static std::mutex mmap_mutex_; + +typedef struct +{ + pthread_t output_tid; + k_u32 venc_chn; + k_bool is_start; + k_bool is_end; + k_s32 frame_cnt; + k_u32 pic_width; + k_u32 pic_height; + +} venc_output_pthread; + +static venc_output_pthread venc_output_arr[VENC_MAX_CHN_NUMS]; + +class KdMedia::Impl +{ +public: + Impl() {} + ~Impl() {} + int Init(const KdMediaInputConfig &config); + int Init(); + int Deinit(); + + int CreateAiAEnc(IOnAEncData *on_aenc_data); + int DestroyAiAEnc(); + int StartAiAEnc(); + int StopAiAEnc(); + + int CreateADecAo(); + int DestroyADecAo(); + int StartADecAo(); + int StopADecAo(); + int SendAudioData(const uint8_t *data, size_t size, uint64_t timestamp_ms); + + int CreateVcapVEnc(IOnVEncData *on_venc_data); + int DestroyVcapVEnc(); + int StartVcapVEnc(); + int StopVcapVEnc(); + + // for video decoder and render + int CreateVdecVo(const VdecInitParams ¶ms); + int DestroyVDecVo(); + int StartVDecVo(); + int StopVDecVo(); + int SendVideoData(const uint8_t *data, size_t size, uint64_t timestamp_ms); + +private: // emphasize the following members are private + Impl(const Impl &) = delete; + Impl &operator=(const Impl &) = delete; + +private: + static void *aenc_chn_get_stream_threads(void *arg); + k_s32 kd_sample_aenc_start(k_handle aenc_hdl); + k_s32 kd_sample_aenc_stop(k_handle aenc_hdl); + k_s32 kd_sample_get_venc_stream(k_u32 venc_chn); + k_s32 kd_sample_ao_start(k_u32 dev, k_u32 chn); + k_s32 kd_sample_ao_stop(k_u32 dev, k_u32 chn); + + static void *venc_stream_threads(void *arg); + k_s32 kd_sample_venc_init(k_u32 chn_num, k_venc_chn_attr *pst_venc_attr); + +private: + int CreateVdecVBPool(const VdecInitParams ¶ms); + int DestroyVdecVBPool(); + +private: + k_u32 audio_sample_rate_{8000}; // for G711 + k_handle ai_handle_{0}; + bool ai_initialized{false}; + bool ai_started_{false}; + + k_u32 venc_chn_id_{0}; + pthread_t venc_tid_; + bool start_get_video_stream_{false}; + + k_vicap_dev vi_dev_id_{VICAP_DEV_ID_0}; + k_vicap_chn vi_chn_id_{VICAP_CHN_ID_0}; + + k_u32 ai_dev_{0}; + k_u32 ai_chn_{0}; + k_handle aenc_handle_{0}; + k_audio_stream audio_stream_; + pthread_t get_audio_stream_tid_{0}; + bool start_get_audio_stream_{false}; + + k_u32 ao_dev_{0}; + k_u32 ao_chn_{0}; + bool ao_initialized{false}; + k_handle adec_handle_{0}; + IOnAEncData *on_aenc_data_{nullptr}; + std::mutex ai_aenc_mutex_; + std::mutex adec_ao_mutex_; + // + KdMediaInputConfig config_; + k_vicap_dev_set_info vcap_dev_info_; + IOnVEncData *on_venc_data_{nullptr}; + + // + VdecInitParams vdec_params_; + k_u32 input_pool_id_{VB_INVALID_POOLID}; + k_u32 output_pool_id_{VB_INVALID_POOLID}; + int vdec_chn_id_{0}; + std::mutex vdec_vo_mutex_; + bool vdec_vo_created_{false}; + bool vdec_vo_started_{false}; + bool vdec_data_feed_{false}; + std::atomic vo_cfg_done_{false}; +}; + +static void *_sys_mmap(k_u64 phys_addr, k_u32 size) +{ + void *virt_addr = NULL; + void *mmap_addr = NULL; + k_u32 page_size = sysconf(_SC_PAGESIZE); + k_u64 page_mask = (page_size - 1); + k_u32 mmap_size = ((size) + (phys_addr & page_mask) + page_mask) & ~(page_mask); + + std::unique_lock lck(mmap_mutex_); + if (g_mmap_fd_tmp == 0) + { + g_mmap_fd_tmp = open("/dev/mem", O_RDWR | O_SYNC); + } + + mmap_addr = mmap(NULL, mmap_size, PROT_READ | PROT_WRITE, MAP_SHARED, g_mmap_fd_tmp, phys_addr & ~page_mask); + if (mmap_addr != (void *)(-1)) + virt_addr = (void *)((char *)mmap_addr + (phys_addr & page_mask)); + else + printf("**** sys_mmap failed\n"); + + return virt_addr; +} + +static k_s32 _sys_munmap(k_u64 phys_addr, void *virt_addr, k_u32 size) +{ + std::unique_lock lck(mmap_mutex_); + if (g_mmap_fd_tmp == 0) + { + return -1; + } + k_u32 page_size = sysconf(_SC_PAGESIZE); + k_u64 page_mask = page_size - 1; + k_u32 mmap_size = ((size) + (phys_addr & page_mask) + page_mask) & ~(page_mask); + void *mmap_addr = (void *)((char *)virt_addr - (phys_addr & page_mask)); + if (munmap(mmap_addr, mmap_size) < 0) + { + printf("**** munmap failed\n"); + } + return 0; +} + +static k_vicap_sensor_info sensor_info[VICAP_DEV_ID_MAX]; +static k_s32 kd_sample_vicap_set_dev_attr(k_vicap_dev_set_info dev_info) +{ + k_s32 ret = 0; + + /* dev attr */ + if (dev_info.vicap_dev >= VICAP_DEV_ID_MAX || dev_info.vicap_dev < VICAP_DEV_ID_0) + { + printf("kd_mapi_vicap_set_dev_attr failed, dev_num %d out of range\n", dev_info.vicap_dev); + return K_FAILED; + } + + if (dev_info.sensor_type > SENSOR_TYPE_MAX || dev_info.sensor_type < OV_OV9732_MIPI_1280X720_30FPS_10BIT_LINEAR) + { + printf("kd_mapi_vicap_set_dev_attr failed, sensor_type %d out of range\n", dev_info.sensor_type); + return K_FAILED; + } + + k_vicap_dev_attr dev_attr; + + memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); + memset(&sensor_info[dev_info.vicap_dev], 0, sizeof(k_vicap_sensor_info)); + + sensor_info[dev_info.vicap_dev].sensor_type = dev_info.sensor_type; + ret = kd_mpi_vicap_get_sensor_info(sensor_info[dev_info.vicap_dev].sensor_type, &sensor_info[dev_info.vicap_dev]); + if (ret) + { + printf("kd_mpi_vicap_get_sensor_info failed:0x%x\n", ret); + return K_FAILED; + } + dev_attr.dw_enable = dev_info.dw_en; + + dev_attr.acq_win.h_start = 0; + dev_attr.acq_win.v_start = 0; + dev_attr.acq_win.width = sensor_info[dev_info.vicap_dev].width; + dev_attr.acq_win.height = sensor_info[dev_info.vicap_dev].height; + // vicap work mode process + if ((dev_info.mode == VICAP_WORK_OFFLINE_MODE) || (dev_info.mode == VICAP_WORK_LOAD_IMAGE_MODE) || (dev_info.mode == VICAP_WORK_ONLY_MCM_MODE)) + { + dev_attr.mode = dev_info.mode; + dev_attr.buffer_num = dev_info.buffer_num; + dev_attr.buffer_size = dev_info.buffer_size; + } + + dev_attr.pipe_ctrl.data = dev_info.pipe_ctrl.data; + // af need disable + dev_attr.pipe_ctrl.bits.af_enable = 0; + dev_attr.pipe_ctrl.bits.ahdr_enable = 0; + dev_attr.cpature_frame = 0; + memcpy(&dev_attr.sensor_info, &sensor_info[dev_info.vicap_dev], sizeof(k_vicap_sensor_info)); + ret = kd_mpi_vicap_set_dev_attr(dev_info.vicap_dev, dev_attr); + if (ret) + { + printf("kd_mpi_vicap_set_dev_attr failed:0x%x\n", ret); + return K_FAILED; + } + return K_SUCCESS; +} + +int KdMedia::Impl::Init(const KdMediaInputConfig &config) +{ + k_s32 ret = 0; + k_vb_config vb_config; + memset(&vb_config, 0, sizeof(vb_config)); + vb_config.max_pool_cnt = config.video_valid ? 5 : 2; + vb_config.comm_pool[0].blk_cnt = 150; + vb_config.comm_pool[0].blk_size = config.audio_samplerate * 2 * 4 / AUDIO_PERSEC_DIV_NUM; + vb_config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; + vb_config.comm_pool[1].blk_cnt = 2; + vb_config.comm_pool[1].blk_size = config.audio_samplerate * 2 * 4 / AUDIO_PERSEC_DIV_NUM * 2; + vb_config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; + if (config.video_valid) + { + k_u64 pic_size = config.venc_width * config.venc_height * 2; + k_u64 stream_size = config.venc_width * config.venc_height / 2; + vb_config.comm_pool[2].blk_cnt = 6; + vb_config.comm_pool[2].blk_size = ((pic_size + 0xfff) & ~0xfff); + vb_config.comm_pool[2].mode = VB_REMAP_MODE_NOCACHE; + vb_config.comm_pool[3].blk_cnt = 30; + vb_config.comm_pool[3].blk_size = ((stream_size + 0xfff) & ~0xfff); + vb_config.comm_pool[3].mode = VB_REMAP_MODE_NOCACHE; + + memset(&vcap_dev_info_, 0, sizeof(vcap_dev_info_)); + if (config.sensor_type <= OV_OV9286_MIPI_1280X720_60FPS_10BIT_LINEAR_IR_SPECKLE || config.sensor_type >= SC_SC035HGS_MIPI_1LANE_RAW10_640X480_120FPS_LINEAR) + vcap_dev_info_.dw_en = K_FALSE; + else + vcap_dev_info_.dw_en = K_TRUE; + + if (vcap_dev_info_.dw_en) + { + k_vicap_sensor_info sensor_info; + memset(&sensor_info, 0, sizeof(sensor_info)); + sensor_info.sensor_type = config.sensor_type; + int ret = kd_mpi_vicap_get_sensor_info(config.sensor_type, &sensor_info); + if (ret != K_SUCCESS) + { + std::cout << "KdMedia::Init() kd_mapi_vicap_get_sensor_info failed, ret = " << ret << std::endl; + return ret; + } + vb_config.comm_pool[4].blk_cnt = 6; + vb_config.comm_pool[4].blk_size = VI_ALIGN_UP(sensor_info.width * sensor_info.height * 3 / 2, 0x1000); + vb_config.comm_pool[4].mode = VB_REMAP_MODE_NOCACHE; + } + } + + ret = kd_mpi_vb_set_config(&vb_config); + if (ret) + { + printf("vb_set_config failed ret:%d\n", ret); + return ret; + } + else + { + printf("vb_set_config ok\n"); + } + + ret = kd_mpi_vb_init(); + + if (config.video_valid) + { + vcap_dev_info_.pipe_ctrl.data = 0xFFFFFFFF; + vcap_dev_info_.sensor_type = config.sensor_type; + vcap_dev_info_.vicap_dev = vi_dev_id_; + ret = kd_sample_vicap_set_dev_attr(vcap_dev_info_); + if (ret != K_SUCCESS) + { + std::cout << "KdMedia::Init() kd_mapi_vicap_set_dev_attr failed, ret = " << ret << std::endl; + ret = kd_mpi_vb_exit(); + return ret; + } + } + config_ = config; + return ret; +} + +int KdMedia::Impl::Init() +{ + k_s32 ret = 0; + k_vb_config vb_config; + memset(&vb_config, 0, sizeof(vb_config)); + vb_config.max_pool_cnt = 2 + 2; + vb_config.comm_pool[0].blk_cnt = 150; + vb_config.comm_pool[0].blk_size = 48000 * 2 * 4 / AUDIO_PERSEC_DIV_NUM; + vb_config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; + vb_config.comm_pool[1].blk_cnt = 2; + vb_config.comm_pool[1].blk_size = 48000 * 2 * 4 / AUDIO_PERSEC_DIV_NUM * 2; + vb_config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; + + ret = kd_mpi_vb_set_config(&vb_config); + if (ret) + { + printf("vb_set_config failed ret:%d\n", ret); + return ret; + } + else + { + printf("vb_set_config ok\n"); + } + + ret = kd_mpi_vb_init(); + + return ret; +} + +int KdMedia::Impl::Deinit() +{ + kd_mpi_vb_exit(); + return 0; +} + +int KdMedia::Impl::CreateAiAEnc(IOnAEncData *on_aenc_data) +{ + std::unique_lock lck(ai_aenc_mutex_); + if (ai_initialized) + return 0; + k_aio_dev_attr aio_dev_attr; + memset(&aio_dev_attr, 0, sizeof(aio_dev_attr)); + aio_dev_attr.audio_type = KD_AUDIO_INPUT_TYPE_I2S; + aio_dev_attr.kd_audio_attr.i2s_attr.sample_rate = config_.audio_samplerate; + aio_dev_attr.kd_audio_attr.i2s_attr.bit_width = KD_AUDIO_BIT_WIDTH_16; + aio_dev_attr.kd_audio_attr.i2s_attr.chn_cnt = 2; + aio_dev_attr.kd_audio_attr.i2s_attr.i2s_mode = K_STANDARD_MODE; + aio_dev_attr.kd_audio_attr.i2s_attr.snd_mode = (config_.audio_channel_cnt == 1) ? KD_AUDIO_SOUND_MODE_MONO : KD_AUDIO_SOUND_MODE_STEREO; + aio_dev_attr.kd_audio_attr.i2s_attr.frame_num = AUDIO_PERSEC_DIV_NUM; + aio_dev_attr.kd_audio_attr.i2s_attr.point_num_per_frame = config_.audio_samplerate / aio_dev_attr.kd_audio_attr.i2s_attr.frame_num; + aio_dev_attr.kd_audio_attr.i2s_attr.i2s_type = K_AIO_I2STYPE_INNERCODEC; + if (K_SUCCESS != kd_mpi_ai_set_pub_attr(ai_dev_, &aio_dev_attr)) + { + std::cout << "kd_mapi_ai_init failed." << std::endl; + return -1; + } + + // for debug pitch-shift + k_ai_chn_pitch_shift_param ps_param; + memset(&ps_param, 0, sizeof(ps_param)); + ps_param.semitones = config_.pitch_shift_semitones; + if (K_SUCCESS != kd_mpi_ai_set_pitch_shift_attr(ai_dev_, ai_chn_, &ps_param)) + { + std::cout << "kd_mapi_ai_init kd_mapi_ai_set_pitch_shift_attr." << std::endl; + return -1; + } + + k_aenc_chn_attr aenc_chn_attr; + memset(&aenc_chn_attr, 0, sizeof(aenc_chn_attr)); + aenc_chn_attr.buf_size = AUDIO_PERSEC_DIV_NUM; + aenc_chn_attr.point_num_per_frame = config_.audio_samplerate / aenc_chn_attr.buf_size; + aenc_chn_attr.type = K_PT_G711U; + if (K_SUCCESS != kd_mpi_aenc_create_chn(aenc_handle_, &aenc_chn_attr)) + { + std::cout << "kd_mapi_aenc_init failed." << std::endl; + // kd_mapi_ai_deinit(ai_handle_); + return -1; + } + + this->on_aenc_data_ = on_aenc_data; + ai_initialized = true; + ai_started_ = false; + return 0; +} + +int KdMedia::Impl::DestroyAiAEnc() +{ + k_s32 ret; + std::unique_lock lck(ai_aenc_mutex_); + if (ai_started_) + { + std::cout << "KdMedia::DestroyAiAEnc called, FAILED, stop first!!!" << std::endl; + return -1; + } + if (ai_initialized) + { + on_aenc_data_ = nullptr; + ret = kd_mpi_aenc_destroy_chn(aenc_handle_); + if (ret != K_SUCCESS) + { + printf("kd_mpi_aenc_destroy_chn failed:0x%x\n", ret); + } + return K_FAILED; + ai_initialized = false; + } + return 0; +} + +static k_s32 kd_sample_aenc_bind_ai(k_handle ai_dev, k_handle ai_chn, k_handle aenc_hdl) +{ + k_mpp_chn ai_mpp_chn; + k_mpp_chn aenc_mpp_chn; + + ai_mpp_chn.mod_id = K_ID_AI; + ai_mpp_chn.dev_id = ai_dev; + ai_mpp_chn.chn_id = ai_chn; + aenc_mpp_chn.mod_id = K_ID_AENC; + aenc_mpp_chn.dev_id = 0; + aenc_mpp_chn.chn_id = aenc_hdl; + + return kd_mpi_sys_bind(&ai_mpp_chn, &aenc_mpp_chn); +} + +static k_s32 kd_sample_aenc_unbind_ai(k_handle ai_dev, k_handle ai_chn, k_handle aenc_hdl) +{ + + k_mpp_chn ai_mpp_chn; + k_mpp_chn aenc_mpp_chn; + + ai_mpp_chn.mod_id = K_ID_AI; + ai_mpp_chn.dev_id = ai_dev; + ai_mpp_chn.chn_id = ai_chn; + aenc_mpp_chn.mod_id = K_ID_AENC; + aenc_mpp_chn.dev_id = 0; + aenc_mpp_chn.chn_id = aenc_hdl; + + return kd_mpi_sys_unbind(&ai_mpp_chn, &aenc_mpp_chn); +} + +void *KdMedia::Impl::aenc_chn_get_stream_threads(void *arg) +{ + KdMedia::Impl *pthis = (KdMedia::Impl *)arg; + k_handle aenc_hdl = pthis->aenc_handle_; + k_audio_stream audio_stream; + k_u8 *pData; + + while (pthis->start_get_audio_stream_) + { + if (0 != kd_mpi_aenc_get_stream(aenc_hdl, &audio_stream, 500)) + { + // printf("kd_mpi_aenc_get_stream failed\n"); + continue; + } + else + { + if (pthis->on_aenc_data_) + { + pData = (k_u8 *)kd_mpi_sys_mmap(audio_stream.phys_addr, audio_stream.len); + pthis->on_aenc_data_->OnAEncData(aenc_hdl, pData, audio_stream.len, audio_stream.time_stamp); + kd_mpi_sys_munmap(pData, audio_stream.len); + } + } + kd_mpi_aenc_release_stream(aenc_hdl, &audio_stream); + } + + return NULL; +} + +k_s32 KdMedia::Impl::kd_sample_aenc_start(k_handle aenc_hdl) +{ + if (!start_get_audio_stream_) + { + start_get_audio_stream_ = K_TRUE; + } + else + { + printf("aenc handle:%d already start\n", aenc_hdl); + return K_FAILED; + } + + if (get_audio_stream_tid_ != 0) + { + start_get_audio_stream_ = K_FALSE; + pthread_join(get_audio_stream_tid_, NULL); + get_audio_stream_tid_ = 0; + } + pthread_create(&get_audio_stream_tid_, NULL, aenc_chn_get_stream_threads, this); + + return K_SUCCESS; +} + +int KdMedia::Impl::StartAiAEnc() +{ + k_s32 ret; + std::unique_lock lck(ai_aenc_mutex_); + if (ai_started_) + return 0; + ret = kd_mpi_ai_enable(ai_dev_); + if (ret != K_SUCCESS) + { + printf("kd_mpi_ai_enable failed:0x%x\n", ret); + return K_FAILED; + } + + ret = kd_mpi_ai_enable_chn(ai_dev_, ai_chn_); + kd_sample_aenc_bind_ai(ai_dev_, ai_chn_, aenc_handle_); + + kd_sample_aenc_start(aenc_handle_); + ai_started_ = true; + return 0; +} + +k_s32 KdMedia::Impl::kd_sample_aenc_stop(k_handle aenc_hdl) +{ + if (start_get_audio_stream_) + { + start_get_audio_stream_ = K_FALSE; + } + else + { + printf("aenc handle:%d already stop\n", aenc_hdl); + } + + if (get_audio_stream_tid_ != 0) + { + start_get_audio_stream_ = K_FALSE; + pthread_join(get_audio_stream_tid_, NULL); + get_audio_stream_tid_ = 0; + } + + return K_SUCCESS; +} + +int KdMedia::Impl::StopAiAEnc() +{ + k_s32 ret = 0; + std::unique_lock lck(ai_aenc_mutex_); + if (ai_started_) + { + kd_sample_aenc_unbind_ai(ai_dev_, ai_chn_, aenc_handle_); + ret = kd_mpi_ai_disable_chn(ai_dev_, ai_chn_); + ret = kd_mpi_ai_disable(ai_dev_); + + kd_sample_aenc_stop(aenc_handle_); + ai_started_ = false; + } + return ret; +} + +int KdMedia::Impl::CreateADecAo() +{ + k_s32 ret; + + std::unique_lock lck(adec_ao_mutex_); + k_aio_dev_attr aio_dev_attr; + memset(&aio_dev_attr, 0, sizeof(aio_dev_attr)); + aio_dev_attr.audio_type = KD_AUDIO_OUTPUT_TYPE_I2S; + aio_dev_attr.kd_audio_attr.i2s_attr.sample_rate = config_.audio_samplerate; + aio_dev_attr.kd_audio_attr.i2s_attr.bit_width = KD_AUDIO_BIT_WIDTH_16; + aio_dev_attr.kd_audio_attr.i2s_attr.chn_cnt = 2; + aio_dev_attr.kd_audio_attr.i2s_attr.i2s_mode = K_STANDARD_MODE; + aio_dev_attr.kd_audio_attr.i2s_attr.snd_mode = KD_AUDIO_SOUND_MODE_MONO; + aio_dev_attr.kd_audio_attr.i2s_attr.frame_num = AUDIO_PERSEC_DIV_NUM; + aio_dev_attr.kd_audio_attr.i2s_attr.point_num_per_frame = config_.audio_samplerate / aio_dev_attr.kd_audio_attr.i2s_attr.frame_num; + aio_dev_attr.kd_audio_attr.i2s_attr.i2s_type = K_AIO_I2STYPE_INNERCODEC; + ret = kd_mpi_ao_set_pub_attr(ao_dev_, &aio_dev_attr); + if (ret != K_SUCCESS) + { + printf("_init_ao error: %x\n", ret); + return -1; + } + + k_adec_chn_attr adec_chn_attr; + memset(&adec_chn_attr, 0, sizeof(adec_chn_attr)); + adec_chn_attr.type = K_PT_G711U; + adec_chn_attr.buf_size = AUDIO_PERSEC_DIV_NUM; + adec_chn_attr.point_num_per_frame = config_.audio_samplerate / adec_chn_attr.buf_size; + adec_chn_attr.mode = K_ADEC_MODE_PACK; + ret = kd_mpi_adec_create_chn(adec_handle_, &adec_chn_attr); + if (ret != K_SUCCESS) + { + printf("_init_adec error: %x\n", ret); + return -1; + } + + memset(&audio_stream_, 0, sizeof(audio_stream_)); + return 0; +} + +static k_s32 kd_sample_sys_release_vb_block(k_u64 phys_addr, k_u64 blk_size) +{ + k_s32 ret; + k_vb_blk_handle handle; + + handle = kd_mpi_vb_phyaddr_to_handle(phys_addr); + if (handle == VB_INVALID_HANDLE) + { + printf("kd_mpi_vb_phyaddr_to_handle failed\n"); + return K_FAILED; + } + + ret = kd_mpi_vb_release_block(handle); + if (ret != K_SUCCESS) + { + printf("kd_mpi_vb_release_block failed\n"); + return K_FAILED; + } + + return K_SUCCESS; +} + +int KdMedia::Impl::DestroyADecAo() +{ + k_s32 ret; + std::unique_lock lck(adec_ao_mutex_); + ret = kd_mpi_adec_destroy_chn(adec_handle_); + if (ret != K_SUCCESS) + { + printf("_deinit_adec error: %x\n", ret); + return -1; + } + + if (audio_stream_.len) + { + kd_sample_sys_release_vb_block(audio_stream_.phys_addr, audio_stream_.len); + _sys_munmap(audio_stream_.phys_addr, audio_stream_.stream, audio_stream_.len); + memset(&audio_stream_, 0, sizeof(audio_stream_)); + } + return 0; +} + +k_s32 KdMedia::Impl::kd_sample_ao_start(k_u32 dev, k_u32 chn) +{ + k_s32 ret; + + if (dev != 0) + { + printf("dev value not supported\n"); + return K_FAILED; + } + + if (chn < 0 || chn > 2) + { + printf("chn value not supported\n"); + return K_FAILED; + } + + ret = kd_mpi_ao_enable(dev); + if (ret != K_SUCCESS) + { + printf("kd_mpi_ao_enable failed:0x%x\n", ret); + return K_FAILED; + } + + if (2 == chn) + { + for (int i = 0; i < 2; i++) + { + ret = kd_mpi_ao_enable_chn(dev, i); + if (ret != K_SUCCESS) + { + printf("kd_mpi_ao_enable_chn(%d) failed:0x%x\n", i, ret); + return K_FAILED; + } + } + } + else + { + ret = kd_mpi_ao_enable_chn(dev, chn); + if (ret != K_SUCCESS) + { + printf("kd_mpi_ao_enable_chn failed:0x%x\n", ret); + return K_FAILED; + } + } + + return ret; +} + +static k_s32 kd_sample_adec_bind_ao(k_u32 ao_dev, k_u32 ao_chn, k_handle adec_hdl) +{ + k_mpp_chn ao_mpp_chn; + k_mpp_chn adec_mpp_chn; + + adec_mpp_chn.mod_id = K_ID_ADEC; + adec_mpp_chn.dev_id = 0; + adec_mpp_chn.chn_id = adec_hdl; + ao_mpp_chn.mod_id = K_ID_AO; + ao_mpp_chn.dev_id = ao_dev; + ao_mpp_chn.chn_id = ao_chn; + + return kd_mpi_sys_bind(&adec_mpp_chn, &ao_mpp_chn); +} + +static k_s32 kd_sample_adec_unbind_ao(k_u32 ao_dev, k_u32 ao_chn, k_handle adec_hdl) +{ + k_mpp_chn ao_mpp_chn; + k_mpp_chn adec_mpp_chn; + + adec_mpp_chn.mod_id = K_ID_ADEC; + adec_mpp_chn.dev_id = 0; + adec_mpp_chn.chn_id = adec_hdl; + ao_mpp_chn.mod_id = K_ID_AO; + ao_mpp_chn.dev_id = ao_dev; + ao_mpp_chn.chn_id = ao_chn; + + return kd_mpi_sys_unbind(&adec_mpp_chn, &ao_mpp_chn); +} + +int KdMedia::Impl::StartADecAo() +{ + std::unique_lock lck(adec_ao_mutex_); + k_s32 ret; + ret = kd_sample_ao_start(ao_dev_, ao_chn_); + if (ret != K_SUCCESS) + { + printf("kd_mapi_ao_start failed\n"); + return -1; + } + + ret = kd_sample_adec_bind_ao(ao_dev_, ao_chn_, adec_handle_); + if (ret != K_SUCCESS) + { + printf("kd_mapi_adec_bind_ao error: %x\n", ret); + return -1; + } + return 0; +} + +k_s32 KdMedia::Impl::kd_sample_ao_stop(k_u32 dev, k_u32 chn) +{ + k_s32 ret; + + if (dev != 0) + { + printf("dev value not supported\n"); + return K_FAILED; + } + + if (chn < 0 || chn > 2) + { + printf("chn value not supported\n"); + return K_FAILED; + } + + if (2 == chn) + { + for (int i = 0; i < 2; i++) + { + ret = kd_mpi_ao_disable_chn(dev, i); + if (ret != K_SUCCESS) + { + printf("kd_mpi_ao_disable_chn(%d) failed:0x%x\n", i, ret); + return K_FAILED; + } + } + } + else + { + ret = kd_mpi_ao_disable_chn(dev, chn); + if (ret != K_SUCCESS) + { + printf("kd_mpi_ao_disable_chn failed:0x%x\n", ret); + return K_FAILED; + } + } + + ret = kd_mpi_ao_disable(dev); + if (ret != K_SUCCESS) + { + printf("kd_mpi_ai_disable failed:0x%x\n", ret); + return K_FAILED; + } + + return ret; +} + +int KdMedia::Impl::StopADecAo() +{ + std::unique_lock lck(adec_ao_mutex_); + k_s32 ret = kd_sample_adec_unbind_ao(ao_dev_, ao_chn_, adec_handle_); + if (ret != K_SUCCESS) + { + printf("kd_sample_adec_unbind_ao error: %x\n", ret); + return -1; + } + + kd_sample_ao_stop(ao_dev_, ao_chn_); + return 0; +} + +static k_s32 kd_sample_sys_get_vb_block(k_u32 *pool_id, k_u64 *phys_addr, k_u64 blk_size, const char *mmz_name) +{ + k_vb_blk_handle handle; + k_u64 get_phys_addr; + k_u32 get_pool_id; + + handle = kd_mpi_vb_get_block(VB_INVALID_POOLID, blk_size, mmz_name); + if (handle == VB_INVALID_HANDLE) + { + printf("kd_mpi_vb_get_block get failed\n"); + return K_FAILED; + } + + get_phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); + if (get_phys_addr == 0) + { + printf("kd_mpi_vb_handle_to_phyaddr failed\n"); + return K_FAILED; + } + + get_pool_id = kd_mpi_vb_handle_to_pool_id(handle); + if (get_pool_id == VB_INVALID_POOLID) + { + printf("kd_mpi_vb_handle_to_pool_id failed\n"); + return K_FAILED; + } +#if 0 + get_virt_addr = kd_mpi_sys_mmap(get_phys_addr, blk_size); +#endif + *phys_addr = get_phys_addr; + *pool_id = get_pool_id; + + return K_SUCCESS; +} + +int KdMedia::Impl::SendAudioData(const uint8_t *data, size_t size, uint64_t timestamp_ms) +{ + k_s32 ret = 0; + std::unique_lock lck(adec_ao_mutex_); + if (audio_stream_.len != size) + { + if (audio_stream_.len) + { + kd_sample_sys_release_vb_block(audio_stream_.phys_addr, audio_stream_.len); + _sys_munmap(audio_stream_.phys_addr, audio_stream_.stream, audio_stream_.len); + memset(&audio_stream_, 0, sizeof(audio_stream_)); + } + k_u32 pool_id; + ret = kd_sample_sys_get_vb_block(&pool_id, &audio_stream_.phys_addr, size, NULL); + // check result, TODO + audio_stream_.stream = _sys_mmap(audio_stream_.phys_addr, size); + audio_stream_.len = size; + } + + memcpy(audio_stream_.stream, data, size); + audio_stream_.time_stamp = timestamp_ms; + audio_stream_.seq++; + + kd_mpi_adec_send_stream(adec_handle_, &audio_stream_, K_TRUE); + return ret; +} + +k_s32 KdMedia::Impl::kd_sample_venc_init(k_u32 chn_num, k_venc_chn_attr *pst_venc_attr) +{ + printf("kd_mapi_venc_init start %d\n", chn_num); + memset(&venc_output_arr[chn_num], 0, sizeof(venc_output_pthread)); + + k_s32 ret; + venc_output_arr[chn_num].pic_width = pst_venc_attr->venc_attr.pic_width; + venc_output_arr[chn_num].pic_height = pst_venc_attr->venc_attr.pic_height; + printf("venc[%d] %d*%d size:%d cnt:%d srcfps:%d dstfps:%d rate:%d rc_mode:%d type:%d profile:%d\n", chn_num, + pst_venc_attr->venc_attr.pic_width, + pst_venc_attr->venc_attr.pic_height, + pst_venc_attr->venc_attr.stream_buf_size, + pst_venc_attr->venc_attr.stream_buf_cnt, + pst_venc_attr->rc_attr.cbr.src_frame_rate, + pst_venc_attr->rc_attr.cbr.dst_frame_rate, + pst_venc_attr->rc_attr.cbr.bit_rate, + (int)pst_venc_attr->rc_attr.rc_mode, + (int)pst_venc_attr->venc_attr.type, + (int)pst_venc_attr->venc_attr.profile); + + ret = kd_mpi_venc_create_chn(chn_num, pst_venc_attr); + if (ret != K_SUCCESS) + { + printf("kd_mpi_venc_create_chn failed:0x%x\n", ret); + return K_FAILED; + } + + printf("kd_mapi_venc_init end \n"); + return K_SUCCESS; +} + +int KdMedia::Impl::CreateVdecVBPool(const VdecInitParams ¶ms) +{ + k_vb_pool_config pool_config; + memset(&pool_config, 0, sizeof(pool_config)); + pool_config.blk_cnt = params.input_buf_num; + pool_config.blk_size = params.input_buf_size; + pool_config.mode = VB_REMAP_MODE_NOCACHE; + input_pool_id_ = kd_mpi_vb_create_pool(&pool_config); + if (input_pool_id_ == VB_INVALID_POOLID) + { + return -1; + } + printf("input_pool_id = %llu\n", input_pool_id_); + + memset(&pool_config, 0, sizeof(pool_config)); + pool_config.blk_cnt = params.output_buf_num; + pool_config.blk_size = params.max_width * params.max_height * 2; + pool_config.mode = VB_REMAP_MODE_NOCACHE; + output_pool_id_ = kd_mpi_vb_create_pool(&pool_config); + if (output_pool_id_ == VB_INVALID_POOLID) + { + kd_mpi_vb_destory_pool(input_pool_id_); + return -1; + } + printf("output_pool_id = %llu\n", output_pool_id_); + return 0; +} + +int KdMedia::Impl::DestroyVdecVBPool() +{ + k_s32 ret; + ret = kd_mpi_vb_destory_pool(input_pool_id_); + if (ret != K_SUCCESS) + { + printf("kd_mpi_vb_destory_pool %d failed(input), ret = %d\n", input_pool_id_, ret); + } + ret = kd_mpi_vb_destory_pool(output_pool_id_); + if (ret != K_SUCCESS) + { + printf("kd_mpi_vb_destory_pool %d failed(output), ret = %d\n", output_pool_id_, ret); + } + return 0; +} + +static k_s32 kd_sample_vicap_set_chn_attr(k_vicap_chn_set_info chn_info) +{ + k_s32 ret = 0; + if (chn_info.vicap_dev >= VICAP_DEV_ID_MAX || chn_info.vicap_dev < VICAP_DEV_ID_0) + { + printf("kd_mapi_vicap_set_dev_attr failed, dev_num %d out of range\n", chn_info.vicap_dev); + return K_FAILED; + } + + if (chn_info.vicap_chn >= VICAP_CHN_ID_MAX || chn_info.vicap_chn < VICAP_CHN_ID_0) + { + printf("kd_mapi_vicap_set_attr failed, chn_num %d out of range\n", chn_info.vicap_chn); + return K_FAILED; + } + + k_vicap_chn_attr chn_attr; + memset(&chn_attr, 0, sizeof(k_vicap_chn_attr)); + + /* chn attr */ + if (!chn_info.out_height && chn_info.out_width) + { + printf("kd_mapi_vicap_set_attr, failed, out_width: %d, out_height: %d error\n", chn_info.out_width, chn_info.out_height); + return K_FAILED; + } + + if (chn_info.pixel_format > PIXEL_FORMAT_BUTT || chn_info.pixel_format < PIXEL_FORMAT_RGB_444) + { + printf("kd_mapi_vicap_set_attr, failed, pixel_formatr: %d out of range\n", chn_info.pixel_format); + return K_FAILED; + } + + if (chn_info.pixel_format == PIXEL_FORMAT_RGB_BAYER_10BPP || chn_info.pixel_format == PIXEL_FORMAT_RGB_BAYER_12BPP) + { + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = sensor_info[chn_info.vicap_dev].width; + chn_attr.out_win.height = sensor_info[chn_info.vicap_dev].height; + } + else + { + chn_attr.out_win.width = chn_info.out_width; + chn_attr.out_win.height = chn_info.out_height; + } + + if (chn_info.crop_en) + { + chn_attr.crop_win.h_start = chn_info.crop_h_start; + chn_attr.crop_win.v_start = chn_info.crop_v_start; + chn_attr.crop_win.width = chn_info.out_width; + chn_attr.crop_win.height = chn_info.out_height; + } + else + { + chn_attr.crop_win.h_start = 0; + chn_attr.crop_win.v_start = 0; + chn_attr.crop_win.width = sensor_info[chn_info.vicap_dev].width; + chn_attr.crop_win.height = sensor_info[chn_info.vicap_dev].height; + } + + chn_attr.scale_win.h_start = 0; + chn_attr.scale_win.v_start = 0; + chn_attr.scale_win.width = sensor_info[chn_info.vicap_dev].width; + chn_attr.scale_win.height = sensor_info[chn_info.vicap_dev].height; + + chn_attr.crop_enable = chn_info.crop_en; + chn_attr.scale_enable = chn_info.scale_en; + chn_attr.chn_enable = chn_info.chn_en; + chn_attr.pix_format = chn_info.pixel_format; + chn_attr.buffer_num = chn_info.buffer_num; + chn_attr.buffer_size = chn_info.buf_size; + chn_attr.alignment = chn_info.alignment; + chn_attr.fps = chn_info.fps; + ret = kd_mpi_vicap_set_chn_attr(chn_info.vicap_dev, chn_info.vicap_chn, chn_attr); + if (ret) + { + printf("kd_mpi_vicap_set_chn_attr failed:0x%x\n", ret); + return K_FAILED; + } + return K_SUCCESS; +} + +int KdMedia::Impl::CreateVcapVEnc(IOnVEncData *on_venc_data) +{ + if (!config_.video_valid) + { + return 0; + } + on_venc_data_ = on_venc_data; + + k_venc_chn_attr chn_attr; + memset(&chn_attr, 0, sizeof(chn_attr)); + k_u64 stream_size = config_.venc_width * config_.venc_height / 2; + chn_attr.venc_attr.pic_width = config_.venc_width; + chn_attr.venc_attr.pic_height = config_.venc_height; + chn_attr.venc_attr.stream_buf_size = ((stream_size + 0xfff) & ~0xfff); + chn_attr.venc_attr.stream_buf_cnt = 30; + chn_attr.rc_attr.rc_mode = K_VENC_RC_MODE_CBR; + chn_attr.rc_attr.cbr.src_frame_rate = 30; + chn_attr.rc_attr.cbr.dst_frame_rate = 30; + if (config_.sensor_type == OV_OV9286_MIPI_1280X720_30FPS_10BIT_LINEAR_IR || + config_.sensor_type == OV_OV9286_MIPI_1280X720_30FPS_10BIT_LINEAR_SPECKLE) + { + chn_attr.rc_attr.cbr.src_frame_rate = 15; + chn_attr.rc_attr.cbr.dst_frame_rate = 15; + } + else if (config_.sensor_type == OV_OV9286_MIPI_1280X720_60FPS_10BIT_LINEAR_IR_SPECKLE) + { + chn_attr.rc_attr.cbr.src_frame_rate = 60; + chn_attr.rc_attr.cbr.dst_frame_rate = 60; + } + chn_attr.rc_attr.cbr.bit_rate = config_.bitrate_kbps; + if (config_.video_type == KdMediaVideoType::kVideoTypeH264) + { + chn_attr.venc_attr.type = K_PT_H264; + chn_attr.venc_attr.profile = VENC_PROFILE_H264_HIGH; + } + else if (config_.video_type == KdMediaVideoType::kVideoTypeH265) + { + chn_attr.venc_attr.type = K_PT_H265; + chn_attr.venc_attr.profile = VENC_PROFILE_H265_MAIN; + } + else if (config_.video_type == KdMediaVideoType::kVideoTypeMjpeg) + { + chn_attr.venc_attr.type = K_PT_JPEG; + chn_attr.rc_attr.rc_mode = K_VENC_RC_MODE_MJPEG_FIXQP; + chn_attr.rc_attr.mjpeg_fixqp.src_frame_rate = 30; + chn_attr.rc_attr.mjpeg_fixqp.dst_frame_rate = 30; + chn_attr.rc_attr.mjpeg_fixqp.q_factor = 45; + } + + int ret = kd_sample_venc_init(venc_chn_id_, &chn_attr); + if (ret != K_SUCCESS) + { + std::cout << "kd_sample_venc_init error." << std::endl; + return -1; + } + + if (config_.video_type != KdMediaVideoType::kVideoTypeMjpeg) + { + ret = kd_mpi_venc_enable_idr(venc_chn_id_, K_TRUE); + if (ret != K_SUCCESS) + { + std::cout << "kd_mpi_venc_enable_idr error." << std::endl; + return -1; + } + } + + k_vicap_sensor_info sensor_info; + memset(&sensor_info, 0, sizeof(sensor_info)); + sensor_info.sensor_type = config_.sensor_type; + ret = kd_mpi_vicap_get_sensor_info(sensor_info.sensor_type, &sensor_info); + if (ret != K_SUCCESS) + { + printf("kd_mpi_vicap_get_sensor_info failed, %x.\n", ret); + return -1; + } + + k_vicap_chn_set_info vi_chn_attr_info; + memset(&vi_chn_attr_info, 0, sizeof(vi_chn_attr_info)); + + vi_chn_attr_info.crop_en = K_FALSE; + vi_chn_attr_info.scale_en = K_FALSE; + vi_chn_attr_info.chn_en = K_TRUE; + vi_chn_attr_info.crop_h_start = 0; + vi_chn_attr_info.crop_v_start = 0; + vi_chn_attr_info.out_width = VI_ALIGN_UP(config_.venc_width, 16); + vi_chn_attr_info.out_height = config_.venc_height; + vi_chn_attr_info.pixel_format = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + vi_chn_attr_info.vicap_dev = vi_dev_id_; + vi_chn_attr_info.buffer_num = 6; + vi_chn_attr_info.vicap_chn = (k_vicap_chn)venc_chn_id_; + if (!vcap_dev_info_.dw_en) + vi_chn_attr_info.buf_size = VI_ALIGN_UP(VI_ALIGN_UP(config_.venc_width, 16) * config_.venc_height * 3 / 2, 0x100); + else + vi_chn_attr_info.buf_size = VI_ALIGN_UP(VI_ALIGN_UP(config_.venc_width, 16) * config_.venc_height * 3 / 2, 0x400); + ret = kd_sample_vicap_set_chn_attr(vi_chn_attr_info); + if (ret != K_SUCCESS) + { + printf("vicap chn %d set attr failed, %x.\n", venc_chn_id_, ret); + return -1; + } + + return 0; +} + +int KdMedia::Impl::DestroyVcapVEnc() +{ + if (!config_.video_valid) + { + return 0; + } + kd_mpi_venc_destroy_chn(venc_chn_id_); + return 0; +} + +static k_s32 kd_sample_venc_bind_vi(k_s32 src_dev, k_s32 src_chn, k_s32 chn_num) +{ + if (chn_num >= VENC_MAX_CHN_NUMS) + { + printf("kd_mapi_venc_bind_vi chn_num:%d error\n", chn_num); + return -1; + } + + k_mpp_chn vi_mpp_chn; + k_mpp_chn venc_mpp_chn; + + vi_mpp_chn.mod_id = K_ID_VI; + vi_mpp_chn.dev_id = src_dev; + vi_mpp_chn.chn_id = src_chn; + venc_mpp_chn.mod_id = K_ID_VENC; + venc_mpp_chn.dev_id = 0; + venc_mpp_chn.chn_id = chn_num; + k_s32 ret = kd_mpi_sys_bind(&vi_mpp_chn, &venc_mpp_chn); + + return ret; +} + +static k_s32 kd_sample_vicap_start(k_vicap_dev vicap_dev) +{ + k_s32 ret = 0; + if (vicap_dev > VICAP_DEV_ID_MAX || vicap_dev < VICAP_DEV_ID_0) + { + printf("kd_mapi_vicap_start failed, dev_num %d out of range\n", vicap_dev); + return K_FAILED; + } + ret = kd_mpi_vicap_init(vicap_dev); + if (ret) + { + printf("kd_mpi_vicap_init, vicap dev(%d) init failed.\n", vicap_dev); + kd_mpi_vicap_deinit(vicap_dev); + return K_FAILED; + } + + ret = kd_mpi_vicap_start_stream(vicap_dev); + if (ret) + { + printf("kd_mpi_vicap_start_stream, vicap dev(%d) start stream failed.\n", vicap_dev); + kd_mpi_vicap_deinit(vicap_dev); + kd_mpi_vicap_stop_stream(vicap_dev); + return K_FAILED; + } + return K_SUCCESS; +} + +k_s32 KdMedia::Impl::kd_sample_get_venc_stream(k_u32 venc_chn) +{ + k_s32 ret = 0; + k_venc_stream output; + k_venc_chn_status status; + k_u8 *pData; + while (start_get_video_stream_) + { + ret = kd_mpi_venc_query_status(venc_chn, &status); + + if (status.cur_packs > 0) + output.pack_cnt = status.cur_packs; + else + output.pack_cnt = 1; + + output.pack = (k_venc_pack *)malloc(sizeof(k_venc_pack) * output.pack_cnt); + + ret = kd_mpi_venc_get_stream(venc_chn, &output, -1); + + for (int i = 0; i < output.pack_cnt; i++) + { + pData = (k_u8 *)kd_mpi_sys_mmap(output.pack[i].phys_addr, output.pack[i].len); + + if (on_venc_data_ != nullptr) + { + on_venc_data_->OnVEncData(venc_chn, pData, output.pack[i].len, output.pack[i].type, output.pack[i].pts); + } + // printf("=====vend data size:%d\n",output.pack[i].len); + + kd_mpi_sys_munmap(pData, output.pack[i].len); + } + + ret = kd_mpi_venc_release_stream(venc_chn, &output); + + free(output.pack); + } + return ret; +} + +void *KdMedia::Impl::venc_stream_threads(void *arg) +{ + KdMedia::Impl *pthis = (KdMedia::Impl *)arg; + pthis->kd_sample_get_venc_stream(pthis->venc_chn_id_); + return NULL; +} + +int KdMedia::Impl::StartVcapVEnc() +{ + if (!config_.video_valid) + { + return 0; + } + + kd_mpi_venc_start_chn(venc_chn_id_); + if (!start_get_video_stream_) + { + start_get_video_stream_ = true; + pthread_create(&venc_tid_, NULL, venc_stream_threads, this); + } + kd_sample_venc_bind_vi(vi_dev_id_, vi_chn_id_, venc_chn_id_); + kd_sample_vicap_start(vi_dev_id_); + return 0; +} + +static k_s32 kd_sample_venc_unbind_vi(k_s32 src_dev, k_s32 src_chn, k_s32 chn_num) +{ + k_mpp_chn vi_mpp_chn; + k_mpp_chn venc_mpp_chn; + + vi_mpp_chn.mod_id = K_ID_VI; + vi_mpp_chn.dev_id = src_dev; + vi_mpp_chn.chn_id = src_chn; + + venc_mpp_chn.mod_id = K_ID_VENC; + venc_mpp_chn.dev_id = 0; + venc_mpp_chn.chn_id = chn_num; + k_s32 ret = kd_mpi_sys_unbind(&vi_mpp_chn, &venc_mpp_chn); + + return ret; +} + +static k_s32 kd_sample_vicap_stop(k_vicap_dev vicap_dev) +{ + k_s32 ret = 0; + if (vicap_dev > VICAP_DEV_ID_MAX || vicap_dev < VICAP_DEV_ID_0) + { + printf("kd_mapi_vicap_stop failed, dev_num %d out of range\n", vicap_dev); + return K_FAILED; + } + ret = kd_mpi_vicap_stop_stream(vicap_dev); + if (ret) + { + printf("kd_mpi_vicap_stop_stream failed\n"); + } + ret = kd_mpi_vicap_deinit(vicap_dev); + if (ret) + { + printf("kd_mpi_vicap_deinit failed\n"); + return K_FAILED; + } + return K_SUCCESS; +} + +int KdMedia::Impl::StopVcapVEnc() +{ + if (!config_.video_valid) + { + return 0; + } + + if (start_get_video_stream_) + { + start_get_video_stream_ = false; + pthread_join(venc_tid_, NULL); + } + // unbind all + kd_sample_venc_unbind_vi(vi_dev_id_, vi_chn_id_, venc_chn_id_); + // stop vcap + kd_sample_vicap_stop(vi_dev_id_); + // stop all encoders + kd_mpi_venc_stop_chn(vi_chn_id_); + return 0; +} + +int KdMedia::Impl::CreateVdecVo(const VdecInitParams ¶ms) +{ + std::unique_lock lck(vdec_vo_mutex_); + if (vdec_vo_created_) + return 0; + k_s32 ret; + ret = CreateVdecVBPool(params); + if (ret < 0) + { + return -1; + } + + k_vdec_chn_attr attr; + memset(&attr, 0, sizeof(attr)); + attr.pic_width = params.max_width; + attr.pic_height = params.max_height; + attr.frame_buf_cnt = params.output_buf_num; + attr.frame_buf_size = params.max_width * params.max_height * 2; + attr.stream_buf_size = params.input_buf_size; + attr.frame_buf_pool_id = output_pool_id_; + switch (params.type) + { + case KdMediaVideoType::kVideoTypeH264: + attr.type = K_PT_H264; + break; + case KdMediaVideoType::kVideoTypeH265: + attr.type = K_PT_H265; + break; + default: + goto err_exit; + } + + ret = kd_mpi_vdec_create_chn(vdec_chn_id_, &attr); + if (ret != K_SUCCESS) + { + printf("KdMedia::CreateVdecVo() : kd_mpi_vdec_init failed, ret = %d\n", ret); + goto err_exit; + } + + // FIXME + vo_init(); + vo_enable(); + + vdec_params_ = params; + vdec_vo_created_ = true; + vdec_vo_started_ = false; + return 0; +err_exit: + DestroyVdecVBPool(); + return -1; +} + +int KdMedia::Impl::DestroyVDecVo() +{ + std::unique_lock lck(vdec_vo_mutex_); + if (!vdec_vo_created_) + return 0; + if (vdec_vo_started_) + { + printf("KdMedia::DestroyVDecVo() : stop first!!!\n"); + return -1; + } + kd_mpi_vdec_destroy_chn(vdec_chn_id_); + vo_layer_deinit(); + vo_deinit(); + DestroyVdecVBPool(); + + vdec_vo_created_ = false; + vdec_vo_started_ = false; + return 0; +} + +static k_s32 kd_sample_vdec_bind_vo(k_u32 chn_num, k_u32 vo_dev, k_u32 vo_chn) +{ + k_mpp_chn vdec_mpp_chn; + k_mpp_chn vvo_mpp_chn; + k_s32 ret; + + vdec_mpp_chn.mod_id = K_ID_VDEC; + vdec_mpp_chn.dev_id = 0; + vdec_mpp_chn.chn_id = chn_num; + vvo_mpp_chn.mod_id = K_ID_VO; + vvo_mpp_chn.dev_id = vo_dev; + vvo_mpp_chn.chn_id = vo_chn; + ret = kd_mpi_sys_bind(&vdec_mpp_chn, &vvo_mpp_chn); + if (ret) + { + printf("kd_mpi_sys_bind failed:0x%x\n", ret); + } + return ret; +} + +static k_s32 kd_sample_vdec_unbind_vo(k_u32 chn_num, k_u32 vo_dev, k_u32 vo_chn) +{ + k_mpp_chn vdec_mpp_chn; + k_mpp_chn vvo_mpp_chn; + k_s32 ret; + + vdec_mpp_chn.mod_id = K_ID_VDEC; + vdec_mpp_chn.dev_id = 0; + vdec_mpp_chn.chn_id = chn_num; + vvo_mpp_chn.mod_id = K_ID_VO; + vvo_mpp_chn.dev_id = vo_dev; + vvo_mpp_chn.chn_id = vo_chn; + + ret = kd_mpi_sys_unbind(&vdec_mpp_chn, &vvo_mpp_chn); + return ret; +} + +int KdMedia::Impl::StartVDecVo() +{ + std::unique_lock lck(vdec_vo_mutex_); + if (vdec_vo_started_) + { + return 0; + } + k_s32 ret = kd_mpi_vdec_start_chn(vdec_chn_id_); + if (ret != K_SUCCESS) + { + printf("KdMedia::StartVDecVo() : kd_mpi_vdec_start_chn failed, ret = %d\n", ret); + return -1; + } + kd_sample_vdec_bind_vo(vdec_chn_id_, 0, BIND_VO_LAYER); + vdec_data_feed_ = false; + vdec_vo_started_ = true; + return 0; +} + +int KdMedia::Impl::StopVDecVo() +{ + std::unique_lock lck(vdec_vo_mutex_); + if (!vdec_vo_started_) + { + return 0; + } + + if (vdec_data_feed_) + { + lck.unlock(); + SendVideoData(nullptr, 0, 0); + lck.lock(); + k_vdec_chn_status status; + while (1) + { + k_s32 ret = kd_mpi_vdec_query_status(vdec_chn_id_, &status); + if (ret != K_SUCCESS) + { + printf("KdMedia::StopVDecVo() : kd_mapi_vdec_query_status failed, ret = %d\n", ret); + return -1; + } + if (status.end_of_stream) + { + printf("KdMedia::StopVDecVo() : EOS done\n"); + break; + } + sleep(1); + } + } + kd_sample_vdec_unbind_vo(vdec_chn_id_, 0, BIND_VO_LAYER); + kd_mpi_vdec_stop_chn(vdec_chn_id_); + vdec_vo_started_ = false; + return 0; +} + +static k_s32 kd_sample_sys_get_vb_block_from_pool_id(k_u32 pool_id, k_u64 *phys_addr, k_u64 blk_size, const char *mmz_name) +{ + k_vb_blk_handle handle; + k_u64 get_phys_addr; + k_u32 get_pool_id; + + handle = kd_mpi_vb_get_block(pool_id, blk_size, mmz_name); + if (handle == VB_INVALID_HANDLE) + { + printf("kd_mpi_vb_get_block get failed\n"); + return K_FAILED; + } + + get_phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); + if (get_phys_addr == 0) + { + printf("kd_mpi_vb_handle_to_phyaddr failed\n"); + return K_FAILED; + } + + *phys_addr = get_phys_addr; + + return K_SUCCESS; +} + +int KdMedia::Impl::SendVideoData(const uint8_t *data, size_t size, uint64_t timestamp_ms) +{ + std::unique_lock lck(vdec_vo_mutex_); + if (!vdec_vo_started_) + return 0; + + k_vdec_stream stream; + memset(&stream, 0, sizeof(stream)); + stream.len = size; + stream.pts = timestamp_ms; + stream.end_of_stream = (data && size) ? K_FALSE : K_TRUE; + + int count = 10; + while (1) + { + k_s32 ret = kd_sample_sys_get_vb_block_from_pool_id(input_pool_id_, &stream.phy_addr, vdec_params_.input_buf_size, NULL); + if (ret != K_SUCCESS) + { + if (count < 0) + { + printf("KdMedia::SendVideoData() : FAILED, get vb timeout\n"); + return -1; + } + lck.unlock(); + usleep(30000); + lck.lock(); + continue; + } + break; + } + + void *virt_addr = _sys_mmap(stream.phy_addr, vdec_params_.input_buf_size); + if (!virt_addr) + { + printf("KdMedia::SendVideoData() : _sys_mmap failed\n"); + kd_sample_sys_release_vb_block(stream.phy_addr, vdec_params_.input_buf_size); + return -1; + } + if (data && size) + memcpy(virt_addr, data, size); + + k_s32 ret = kd_mpi_vdec_send_stream(vdec_chn_id_, &stream, -1); + _sys_munmap(stream.phy_addr, virt_addr, vdec_params_.input_buf_size); + kd_sample_sys_release_vb_block(stream.phy_addr, vdec_params_.input_buf_size); + if (ret != K_SUCCESS) + { + printf("KdMedia::SendVideoData() : kd_mapi_vdec_send_stream failed, ret = %d\n", ret); + return -1; + } + if (data && size) + vdec_data_feed_ = true; + + // init vo layer + if (!vo_cfg_done_) + { + k_vdec_chn_status status; + k_s32 ret = kd_mpi_vdec_query_status(vdec_chn_id_, &status); + if (ret == K_SUCCESS && status.width != 0 && status.height != 0) + { + vo_layer_init(status.width, status.height); + vo_cfg_done_.store(true); + } + } + + return 0; +} + +KdMedia::KdMedia() : impl_(std::make_unique()) {} +KdMedia::~KdMedia() {} + +int KdMedia::Init(const KdMediaInputConfig &config) +{ + return impl_->Init(config); +} +int KdMedia::Init() +{ + return impl_->Init(); +} +int KdMedia::Deinit() +{ + return impl_->Deinit(); +} + +int KdMedia::CreateAiAEnc(IOnAEncData *on_aenc_data) +{ + return impl_->CreateAiAEnc(on_aenc_data); +} +int KdMedia::DestroyAiAEnc() +{ + return impl_->DestroyAiAEnc(); +} +int KdMedia::StartAiAEnc() +{ + return impl_->StartAiAEnc(); +} +int KdMedia::StopAiAEnc() +{ + return impl_->StopAiAEnc(); +} + +int KdMedia::CreateADecAo() +{ + return impl_->CreateADecAo(); +} +int KdMedia::DestroyADecAo() +{ + return impl_->DestroyADecAo(); +} +int KdMedia::StartADecAo() +{ + return impl_->StartADecAo(); +} +int KdMedia::StopADecAo() +{ + return impl_->StopADecAo(); +} +int KdMedia::SendAudioData(const uint8_t *data, size_t size, uint64_t timestamp_ms) +{ + return impl_->SendAudioData(data, size, timestamp_ms); +} + +int KdMedia::CreateVcapVEnc(IOnVEncData *on_venc_data) +{ + return impl_->CreateVcapVEnc(on_venc_data); +} +int KdMedia::DestroyVcapVEnc() +{ + return impl_->DestroyVcapVEnc(); +} +int KdMedia::StartVcapVEnc() +{ + return impl_->StartVcapVEnc(); +} +int KdMedia::StopVcapVEnc() +{ + return impl_->StopVcapVEnc(); +} + +// for video decoder and render +int KdMedia::CreateVdecVo(const VdecInitParams ¶ms) +{ + return impl_->CreateVdecVo(params); +} +int KdMedia::DestroyVDecVo() +{ + return impl_->DestroyVDecVo(); +} +int KdMedia::StartVDecVo() +{ + return impl_->StartVDecVo(); +} +int KdMedia::StopVDecVo() +{ + return impl_->StopVDecVo(); +} +int KdMedia::SendVideoData(const uint8_t *data, size_t size, uint64_t timestamp_ms) +{ + return impl_->SendVideoData(data, size, timestamp_ms); +} + +void KdMedia::set_vo_connector_type(k_connector_type &connector_type) +{ + set_connector_type(connector_type); +} \ No newline at end of file diff --git a/src/big/mpp/middleware/src/kdmedia/vo_cfg.cpp b/src/big/mpp/middleware/src/kdmedia/vo_cfg.cpp new file mode 100644 index 000000000..1a068e511 --- /dev/null +++ b/src/big/mpp/middleware/src/kdmedia/vo_cfg.cpp @@ -0,0 +1,244 @@ +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "vo_cfg.h" +#include +#include +#include +#include +#include +#include +#include +#include "mpi_vo_api.h" +#include "mpi_sys_api.h" +#include "k_video_comm.h" + +#define ENABLE_VO_LAYER 1 + +static k_connector_type g_connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; + +typedef struct +{ + k_u64 osd_phy_addr; + void *osd_virt_addr; + k_pixel_format format; + k_vo_point offset; + k_vo_size act_size; + k_u32 size; + k_u32 stride; + k_u8 global_alptha; +} osd_info; + +typedef struct +{ + k_u64 layer_phy_addr; + k_pixel_format format; + k_vo_point offset; + k_vo_size act_size; + k_u32 size; + k_u32 stride; + k_u8 global_alptha; + //only layer0、layer1 + k_u32 func; + // only layer0 + k_vo_scaler_attr attr; +} layer_info; + +int sample_vo_creat_layer(k_vo_layer chn_id, layer_info *info) +{ + k_vo_video_layer_attr attr; + + // check layer + if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) + || ((info->func != 0) && (chn_id == K_VO_LAYER2))) + { + printf("input layer num failed \n"); + return -1 ; + } + + // check scaler + + // set offset + attr.display_rect = info->offset; + // set act + attr.img_size = info->act_size; + // sget size + info->size = info->act_size.height * info->act_size.width * 3 / 2; + //set pixel format + attr.pixel_format = info->format; + if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) + { + printf("input pix format failed \n"); + return -1; + } + // set stride + attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); + // set function + attr.func = info->func; + // set scaler attr + attr.scaler_attr = info->attr; + + // set video layer atrr + kd_mpi_vo_set_video_layer_attr(chn_id, &attr); + // enable layer + kd_mpi_vo_enable_video_layer(chn_id); + + return 0; +} + +k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) +{ + k_vo_video_osd_attr attr; + + // set attr + attr.global_alptha = info->global_alptha; + + if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) + { + info->size = info->act_size.width * info->act_size.height * 4; + info->stride = info->act_size.width * 4 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) + { + info->size = info->act_size.width * info->act_size.height * 3; + info->stride = info->act_size.width * 3 / 8; + } + else if (info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if (info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else + { + printf("set osd pixel format failed \n"); + } + + attr.stride = info->stride; + attr.pixel_format = info->format; + attr.display_rect = info->offset; + attr.img_size = info->act_size; + kd_mpi_vo_set_video_osd_attr(osd, &attr); + + // 打开osd层 + kd_mpi_vo_osd_enable(osd); + + return 0; +} + +static k_s32 sample_connector_init(void) +{ + k_s32 ret = 0; + char dev_name[64] = {0}; + k_s32 connector_fd; + k_connector_type connector_type = g_connector_type; + + k_connector_info connector_info; + memset(&connector_info, 0, sizeof(k_connector_info)); + connector_info.connector_name = (char *)dev_name; + + //connector get sensor info + ret = kd_mpi_get_connector_info(connector_type, &connector_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + // printf("connector_info name is %s \n", connector_info.connector_name); + + connector_fd = kd_mpi_connector_open(connector_info.connector_name); + if (connector_fd < 0) { + printf("%s, connector open failed.\n", __func__); + return K_ERR_VO_NOTREADY; + } + + printf("connector_fd is %d ret is %d \n", connector_fd, ret); + + // set connect power + kd_mpi_connector_power_set(connector_fd, K_TRUE); + // connector init + kd_mpi_connector_init(connector_fd, connector_info); + + return 0; +} + +void vo_init() +{ + sample_connector_init(); +} + +void vo_enable() +{ + kd_mpi_vo_enable(); +} + +void set_connector_type(k_connector_type &connector_type) { + g_connector_type = connector_type; +} + +void vo_deinit() +{ + kd_mpi_vo_disable(); +} + +void vo_layer_init(k_u32 width,k_u32 height) +{ + layer_info info; + k_vo_layer chn_id = (k_vo_layer)ENABLE_VO_LAYER; + + memset(&info, 0, sizeof(info)); + // config layer + if (width > 1080 && g_connector_type == HX8377_V2_MIPI_4LAN_1080X1920_30FPS) + { + info.act_size.width = height; + info.act_size.height = width; + info.func = K_ROTATION_90; + } + else + { + info.act_size.width = width; + info.act_size.height = height; + info.func = 0; + } + + info.format = PIXEL_FORMAT_YVU_PLANAR_420; + + info.global_alptha = 0xff; + info.offset.x = 0; + info.offset.y = 0; + sample_vo_creat_layer(chn_id, &info); +} + +void vo_layer_deinit() +{ + kd_mpi_vo_disable_video_layer((k_vo_layer)ENABLE_VO_LAYER); +} diff --git a/src/reference/fancy_poc/meta_human/src/http/scoped_timing.hpp b/src/big/mpp/middleware/src/kdmedia/vo_cfg.h similarity index 53% rename from src/reference/fancy_poc/meta_human/src/http/scoped_timing.hpp rename to src/big/mpp/middleware/src/kdmedia/vo_cfg.h index 874ff1b17..bd9c3e672 100644 --- a/src/reference/fancy_poc/meta_human/src/http/scoped_timing.hpp +++ b/src/big/mpp/middleware/src/kdmedia/vo_cfg.h @@ -22,49 +22,21 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include -#include -#include -/** - * @brief 计时类 - * 统计在该类实例生命周期内的耗时 - */ -class ScopedTiming -{ -public: - /** - * @brief ScopedTiming构造函数,初始化计时对象名称并开始计时 - * @param info 计时对象名称 - * @param enable_profile 是否开始计时 - * @return None - */ - ScopedTiming(std::string info = "ScopedTiming", int enable_profile = 1) - : m_info(info), enable_profile(enable_profile) - { - if (enable_profile) - { - m_start = std::chrono::steady_clock::now(); - } - } +#ifndef __VO_CFG_H__ +#define __VO_CFG_H__ + +#include "k_type.h" +#include "k_vo_comm.h" +#include "k_connector_comm.h" +#include "mpi_connector_api.h" + +void vo_init(); +void set_connector_type(k_connector_type &connector_type); +void vo_enable(); +void vo_deinit(); - /** - * @brief ScopedTiming析构,结束计时,并打印耗时 - * @return None - */ - ~ScopedTiming() - { - if (enable_profile) - { - m_stop = std::chrono::steady_clock::now(); - double elapsed_ms = std::chrono::duration(m_stop - m_start).count(); - std::cout << m_info << " took " << elapsed_ms << " ms" << std::endl; - } - } +void vo_layer_init(k_u32 width,k_u32 height); +void vo_layer_deinit(); -private: - int enable_profile; // 是否统计时间 - std::string m_info; // 计时对象名称 - std::chrono::steady_clock::time_point m_start; // 计时开始时间 - std::chrono::steady_clock::time_point m_stop; // 计时结束时间 -}; \ No newline at end of file +#endif diff --git a/src/big/mpp/middleware/src/live555/BasicUsageEnvironment/BasicHashTable.cpp b/src/big/mpp/middleware/src/live555/BasicUsageEnvironment/BasicHashTable.cpp new file mode 100644 index 000000000..91537ff68 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/BasicUsageEnvironment/BasicHashTable.cpp @@ -0,0 +1,277 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Basic Hash Table implementation +// Implementation + +#include "BasicHashTable.hh" +#include "strDup.hh" + +#if defined(__WIN32__) || defined(_WIN32) +#else +#include +#endif +#include +#include + +// When there are this many entries per bucket, on average, rebuild +// the table to increase the number of buckets +#define REBUILD_MULTIPLIER 3 + +BasicHashTable::BasicHashTable(int keyType) + : fBuckets(fStaticBuckets), fNumBuckets(SMALL_HASH_TABLE_SIZE), + fNumEntries(0), fRebuildSize(SMALL_HASH_TABLE_SIZE*REBUILD_MULTIPLIER), + fDownShift(28), fMask(0x3), fKeyType(keyType) { + for (unsigned i = 0; i < SMALL_HASH_TABLE_SIZE; ++i) { + fStaticBuckets[i] = NULL; + } +} + +BasicHashTable::~BasicHashTable() { + // Free all the entries in the table: + for (unsigned i = 0; i < fNumBuckets; ++i) { + TableEntry* entry; + while ((entry = fBuckets[i]) != NULL) { + deleteEntry(i, entry); + } + } + + // Also free the bucket array, if it was dynamically allocated: + if (fBuckets != fStaticBuckets) delete[] fBuckets; +} + +void* BasicHashTable::Add(char const* key, void* value) { + void* oldValue; + unsigned index; + TableEntry* entry = lookupKey(key, index); + if (entry != NULL) { + // There's already an item with this key + oldValue = entry->value; + } else { + // There's no existing entry; create a new one: + entry = insertNewEntry(index, key); + oldValue = NULL; + } + entry->value = value; + + // If the table has become too large, rebuild it with more buckets: + if (fNumEntries >= fRebuildSize) rebuild(); + + return oldValue; +} + +Boolean BasicHashTable::Remove(char const* key) { + unsigned index; + TableEntry* entry = lookupKey(key, index); + if (entry == NULL) return False; // no such entry + + deleteEntry(index, entry); + + return True; +} + +void* BasicHashTable::Lookup(char const* key) const { + unsigned index; + TableEntry* entry = lookupKey(key, index); + if (entry == NULL) return NULL; // no such entry + + return entry->value; +} + +unsigned BasicHashTable::numEntries() const { + return fNumEntries; +} + +BasicHashTable::Iterator::Iterator(BasicHashTable const& table) + : fTable(table), fNextIndex(0), fNextEntry(NULL) { +} + +void* BasicHashTable::Iterator::next(char const*& key) { + while (fNextEntry == NULL) { + if (fNextIndex >= fTable.fNumBuckets) return NULL; + + fNextEntry = fTable.fBuckets[fNextIndex++]; + } + + BasicHashTable::TableEntry* entry = fNextEntry; + fNextEntry = entry->fNext; + + key = entry->key; + return entry->value; +} + +////////// Implementation of HashTable creation functions ////////// + +HashTable* HashTable::create(int keyType) { + return new BasicHashTable(keyType); +} + +HashTable::Iterator* HashTable::Iterator::create(HashTable const& hashTable) { + // "hashTable" is assumed to be a BasicHashTable + return new BasicHashTable::Iterator((BasicHashTable const&)hashTable); +} + +////////// Implementation of internal member functions ////////// + +BasicHashTable::TableEntry* BasicHashTable +::lookupKey(char const* key, unsigned& index) const { + TableEntry* entry; + index = hashIndexFromKey(key); + + for (entry = fBuckets[index]; entry != NULL; entry = entry->fNext) { + if (keyMatches(key, entry->key)) break; + } + + return entry; +} + +Boolean BasicHashTable +::keyMatches(char const* key1, char const* key2) const { + // The way we check the keys for a match depends upon their type: + if (fKeyType == STRING_HASH_KEYS) { + return (strcmp(key1, key2) == 0); + } else if (fKeyType == ONE_WORD_HASH_KEYS) { + return (key1 == key2); + } else { + unsigned* k1 = (unsigned*)key1; + unsigned* k2 = (unsigned*)key2; + + for (int i = 0; i < fKeyType; ++i) { + if (k1[i] != k2[i]) return False; // keys differ + } + return True; + } +} + +BasicHashTable::TableEntry* BasicHashTable +::insertNewEntry(unsigned index, char const* key) { + TableEntry* entry = new TableEntry(); + entry->fNext = fBuckets[index]; + fBuckets[index] = entry; + + ++fNumEntries; + assignKey(entry, key); + + return entry; +} + +void BasicHashTable::assignKey(TableEntry* entry, char const* key) { + // The way we assign the key depends upon its type: + if (fKeyType == STRING_HASH_KEYS) { + entry->key = strDup(key); + } else if (fKeyType == ONE_WORD_HASH_KEYS) { + entry->key = key; + } else if (fKeyType > 0) { + unsigned* keyFrom = (unsigned*)key; + unsigned* keyTo = new unsigned[fKeyType]; + for (int i = 0; i < fKeyType; ++i) keyTo[i] = keyFrom[i]; + + entry->key = (char const*)keyTo; + } +} + +void BasicHashTable::deleteEntry(unsigned index, TableEntry* entry) { + TableEntry** ep = &fBuckets[index]; + + Boolean foundIt = False; + while (*ep != NULL) { + if (*ep == entry) { + foundIt = True; + *ep = entry->fNext; + break; + } + ep = &((*ep)->fNext); + } + + if (!foundIt) { // shouldn't happen +#ifdef DEBUG + fprintf(stderr, "BasicHashTable[%p]::deleteEntry(%d,%p): internal error - not found (first entry %p", this, index, entry, fBuckets[index]); + if (fBuckets[index] != NULL) fprintf(stderr, ", next entry %p", fBuckets[index]->fNext); + fprintf(stderr, ")\n"); +#endif + } + + --fNumEntries; + deleteKey(entry); + delete entry; +} + +void BasicHashTable::deleteKey(TableEntry* entry) { + // The way we delete the key depends upon its type: + if (fKeyType == ONE_WORD_HASH_KEYS) { + entry->key = NULL; + } else { + delete[] (char*)entry->key; + entry->key = NULL; + } +} + +void BasicHashTable::rebuild() { + // Remember the existing table size: + unsigned oldSize = fNumBuckets; + TableEntry** oldBuckets = fBuckets; + + // Create the new sized table: + fNumBuckets *= 4; + fBuckets = new TableEntry*[fNumBuckets]; + for (unsigned i = 0; i < fNumBuckets; ++i) { + fBuckets[i] = NULL; + } + fRebuildSize *= 4; + fDownShift -= 2; + fMask = (fMask<<2)|0x3; + + // Rehash the existing entries into the new table: + for (TableEntry** oldChainPtr = oldBuckets; oldSize > 0; + --oldSize, ++oldChainPtr) { + for (TableEntry* hPtr = *oldChainPtr; hPtr != NULL; + hPtr = *oldChainPtr) { + *oldChainPtr = hPtr->fNext; + + unsigned index = hashIndexFromKey(hPtr->key); + + hPtr->fNext = fBuckets[index]; + fBuckets[index] = hPtr; + } + } + + // Free the old bucket array, if it was dynamically allocated: + if (oldBuckets != fStaticBuckets) delete[] oldBuckets; +} + +unsigned BasicHashTable::hashIndexFromKey(char const* key) const { + unsigned result = 0; + + if (fKeyType == STRING_HASH_KEYS) { + while (1) { + char c = *key++; + if (c == 0) break; + result += (result<<3) + (unsigned)c; + } + result &= fMask; + } else if (fKeyType == ONE_WORD_HASH_KEYS) { + result = randomIndex((uintptr_t)key); + } else { + unsigned* k = (unsigned*)key; + uintptr_t sum = 0; + for (int i = 0; i < fKeyType; ++i) { + sum += k[i]; + } + result = randomIndex(sum); + } + + return result; +} diff --git a/src/big/mpp/middleware/src/live555/BasicUsageEnvironment/BasicTaskScheduler.cpp b/src/big/mpp/middleware/src/live555/BasicUsageEnvironment/BasicTaskScheduler.cpp new file mode 100644 index 000000000..97571d66f --- /dev/null +++ b/src/big/mpp/middleware/src/live555/BasicUsageEnvironment/BasicTaskScheduler.cpp @@ -0,0 +1,256 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Basic Usage Environment: for a simple, non-scripted, console application +// Implementation + + +#include "BasicUsageEnvironment.hh" +#include "HandlerSet.hh" +#include +#if defined(_QNX4) +#include +#include +#endif + +////////// BasicTaskScheduler ////////// + +BasicTaskScheduler* BasicTaskScheduler::createNew(unsigned maxSchedulerGranularity) { + return new BasicTaskScheduler(maxSchedulerGranularity); +} + +BasicTaskScheduler::BasicTaskScheduler(unsigned maxSchedulerGranularity) + : fMaxSchedulerGranularity(maxSchedulerGranularity), fMaxNumSockets(0) +#if defined(__WIN32__) || defined(_WIN32) + , fDummySocketNum(-1) +#endif +{ + FD_ZERO(&fReadSet); + FD_ZERO(&fWriteSet); + FD_ZERO(&fExceptionSet); + + if (maxSchedulerGranularity > 0) schedulerTickTask(); // ensures that we handle events frequently +} + +BasicTaskScheduler::~BasicTaskScheduler() { +#if defined(__WIN32__) || defined(_WIN32) + if (fDummySocketNum >= 0) closeSocket(fDummySocketNum); +#endif +} + +void BasicTaskScheduler::schedulerTickTask(void* clientData) { + ((BasicTaskScheduler*)clientData)->schedulerTickTask(); +} + +void BasicTaskScheduler::schedulerTickTask() { + scheduleDelayedTask(fMaxSchedulerGranularity, schedulerTickTask, this); +} + +#ifndef MILLION +#define MILLION 1000000 +#endif + +void BasicTaskScheduler::SingleStep(unsigned maxDelayTime) { + fd_set readSet = fReadSet; // make a copy for this select() call + fd_set writeSet = fWriteSet; // ditto + fd_set exceptionSet = fExceptionSet; // ditto + + DelayInterval const& timeToDelay = fDelayQueue.timeToNextAlarm(); + struct timeval tv_timeToDelay; + tv_timeToDelay.tv_sec = timeToDelay.seconds(); + tv_timeToDelay.tv_usec = timeToDelay.useconds(); + // Very large "tv_sec" values cause select() to fail. + // Don't make it any larger than 1 million seconds (11.5 days) + const long MAX_TV_SEC = MILLION; + if (tv_timeToDelay.tv_sec > MAX_TV_SEC) { + tv_timeToDelay.tv_sec = MAX_TV_SEC; + } + // Also check our "maxDelayTime" parameter (if it's > 0): + if (maxDelayTime > 0 && + (tv_timeToDelay.tv_sec > (long)maxDelayTime/MILLION || + (tv_timeToDelay.tv_sec == (long)maxDelayTime/MILLION && + tv_timeToDelay.tv_usec > (long)maxDelayTime%MILLION))) { + tv_timeToDelay.tv_sec = maxDelayTime/MILLION; + tv_timeToDelay.tv_usec = maxDelayTime%MILLION; + } + + int selectResult = select(fMaxNumSockets, &readSet, &writeSet, &exceptionSet, &tv_timeToDelay); + if (selectResult < 0) { +#if defined(__WIN32__) || defined(_WIN32) + int err = WSAGetLastError(); + // For some unknown reason, select() in Windoze sometimes fails with WSAEINVAL if + // it was called with no entries set in "readSet". If this happens, ignore it: + if (err == WSAEINVAL && readSet.fd_count == 0) { + err = EINTR; + // To stop this from happening again, create a dummy socket: + if (fDummySocketNum >= 0) closeSocket(fDummySocketNum); + fDummySocketNum = socket(AF_INET, SOCK_DGRAM, 0); + FD_SET((unsigned)fDummySocketNum, &fReadSet); + } + if (err != EINTR) { +#else + if (errno != EINTR && errno != EAGAIN) { +#endif + // Unexpected error - treat this as fatal: +#if !defined(_WIN32_WCE) + perror("BasicTaskScheduler::SingleStep(): select() fails"); + // Because this failure is often "Bad file descriptor" - which is caused by an invalid socket number (i.e., a socket number + // that had already been closed) being used in "select()" - we print out the sockets that were being used in "select()", + // to assist in debugging: + fprintf(stderr, "socket numbers used in the select() call:"); + for (int i = 0; i < 10000; ++i) { + if (FD_ISSET(i, &fReadSet) || FD_ISSET(i, &fWriteSet) || FD_ISSET(i, &fExceptionSet)) { + fprintf(stderr, " %d(", i); + if (FD_ISSET(i, &fReadSet)) fprintf(stderr, "r"); + if (FD_ISSET(i, &fWriteSet)) fprintf(stderr, "w"); + if (FD_ISSET(i, &fExceptionSet)) fprintf(stderr, "e"); + fprintf(stderr, ")"); + } + } + fprintf(stderr, "\n"); +#endif + internalError(); + } + } + + // Call the handler function for one readable socket: + HandlerIterator iter(*fHandlers); + HandlerDescriptor* handler; + // To ensure forward progress through the handlers, begin past the last + // socket number that we handled: + if (fLastHandledSocketNum >= 0) { + while ((handler = iter.next()) != NULL) { + if (handler->socketNum == fLastHandledSocketNum) break; + } + if (handler == NULL) { + fLastHandledSocketNum = -1; + iter.reset(); // start from the beginning instead + } + } + while ((handler = iter.next()) != NULL) { + int sock = handler->socketNum; // alias + int resultConditionSet = 0; + if (FD_ISSET(sock, &readSet) && FD_ISSET(sock, &fReadSet)/*sanity check*/) resultConditionSet |= SOCKET_READABLE; + if (FD_ISSET(sock, &writeSet) && FD_ISSET(sock, &fWriteSet)/*sanity check*/) resultConditionSet |= SOCKET_WRITABLE; + if (FD_ISSET(sock, &exceptionSet) && FD_ISSET(sock, &fExceptionSet)/*sanity check*/) resultConditionSet |= SOCKET_EXCEPTION; + if ((resultConditionSet&handler->conditionSet) != 0 && handler->handlerProc != NULL) { + fLastHandledSocketNum = sock; + // Note: we set "fLastHandledSocketNum" before calling the handler, + // in case the handler calls "doEventLoop()" reentrantly. + (*handler->handlerProc)(handler->clientData, resultConditionSet); + break; + } + } + if (handler == NULL && fLastHandledSocketNum >= 0) { + // We didn't call a handler, but we didn't get to check all of them, + // so try again from the beginning: + iter.reset(); + while ((handler = iter.next()) != NULL) { + int sock = handler->socketNum; // alias + int resultConditionSet = 0; + if (FD_ISSET(sock, &readSet) && FD_ISSET(sock, &fReadSet)/*sanity check*/) resultConditionSet |= SOCKET_READABLE; + if (FD_ISSET(sock, &writeSet) && FD_ISSET(sock, &fWriteSet)/*sanity check*/) resultConditionSet |= SOCKET_WRITABLE; + if (FD_ISSET(sock, &exceptionSet) && FD_ISSET(sock, &fExceptionSet)/*sanity check*/) resultConditionSet |= SOCKET_EXCEPTION; + if ((resultConditionSet&handler->conditionSet) != 0 && handler->handlerProc != NULL) { + fLastHandledSocketNum = sock; + // Note: we set "fLastHandledSocketNum" before calling the handler, + // in case the handler calls "doEventLoop()" reentrantly. + (*handler->handlerProc)(handler->clientData, resultConditionSet); + break; + } + } + if (handler == NULL) fLastHandledSocketNum = -1;//because we didn't call a handler + } + + // Also handle any newly-triggered event (Note that we do this *after* calling a socket handler, + // in case the triggered event handler modifies The set of readable sockets.) + if (fTriggersAwaitingHandling != 0) { + if (fTriggersAwaitingHandling == fLastUsedTriggerMask) { + // Common-case optimization for a single event trigger: + fTriggersAwaitingHandling &=~ fLastUsedTriggerMask; + if (fTriggeredEventHandlers[fLastUsedTriggerNum] != NULL) { + (*fTriggeredEventHandlers[fLastUsedTriggerNum])(fTriggeredEventClientDatas[fLastUsedTriggerNum]); + } + } else { + // Look for an event trigger that needs handling (making sure that we make forward progress through all possible triggers): + unsigned i = fLastUsedTriggerNum; + EventTriggerId mask = fLastUsedTriggerMask; + + do { + i = (i+1)%MAX_NUM_EVENT_TRIGGERS; + mask >>= 1; + if (mask == 0) mask = 0x80000000; + + if ((fTriggersAwaitingHandling&mask) != 0) { + fTriggersAwaitingHandling &=~ mask; + if (fTriggeredEventHandlers[i] != NULL) { + (*fTriggeredEventHandlers[i])(fTriggeredEventClientDatas[i]); + } + + fLastUsedTriggerMask = mask; + fLastUsedTriggerNum = i; + break; + } + } while (i != fLastUsedTriggerNum); + } + } + + // Also handle any delayed event that may have come due. + fDelayQueue.handleAlarm(); +} + +void BasicTaskScheduler + ::setBackgroundHandling(int socketNum, int conditionSet, BackgroundHandlerProc* handlerProc, void* clientData) { + if (socketNum < 0) return; +#if !defined(__WIN32__) && !defined(_WIN32) && defined(FD_SETSIZE) + if (socketNum >= (int)(FD_SETSIZE)) return; +#endif + FD_CLR((unsigned)socketNum, &fReadSet); + FD_CLR((unsigned)socketNum, &fWriteSet); + FD_CLR((unsigned)socketNum, &fExceptionSet); + if (conditionSet == 0) { + fHandlers->clearHandler(socketNum); + if (socketNum+1 == fMaxNumSockets) { + --fMaxNumSockets; + } + } else { + fHandlers->assignHandler(socketNum, conditionSet, handlerProc, clientData); + if (socketNum+1 > fMaxNumSockets) { + fMaxNumSockets = socketNum+1; + } + if (conditionSet&SOCKET_READABLE) FD_SET((unsigned)socketNum, &fReadSet); + if (conditionSet&SOCKET_WRITABLE) FD_SET((unsigned)socketNum, &fWriteSet); + if (conditionSet&SOCKET_EXCEPTION) FD_SET((unsigned)socketNum, &fExceptionSet); + } +} + +void BasicTaskScheduler::moveSocketHandling(int oldSocketNum, int newSocketNum) { + if (oldSocketNum < 0 || newSocketNum < 0) return; // sanity check +#if !defined(__WIN32__) && !defined(_WIN32) && defined(FD_SETSIZE) + if (oldSocketNum >= (int)(FD_SETSIZE) || newSocketNum >= (int)(FD_SETSIZE)) return; // sanity check +#endif + if (FD_ISSET(oldSocketNum, &fReadSet)) {FD_CLR((unsigned)oldSocketNum, &fReadSet); FD_SET((unsigned)newSocketNum, &fReadSet);} + if (FD_ISSET(oldSocketNum, &fWriteSet)) {FD_CLR((unsigned)oldSocketNum, &fWriteSet); FD_SET((unsigned)newSocketNum, &fWriteSet);} + if (FD_ISSET(oldSocketNum, &fExceptionSet)) {FD_CLR((unsigned)oldSocketNum, &fExceptionSet); FD_SET((unsigned)newSocketNum, &fExceptionSet);} + fHandlers->moveHandler(oldSocketNum, newSocketNum); + + if (oldSocketNum+1 == fMaxNumSockets) { + --fMaxNumSockets; + } + if (newSocketNum+1 > fMaxNumSockets) { + fMaxNumSockets = newSocketNum+1; + } +} diff --git a/src/big/mpp/middleware/src/live555/BasicUsageEnvironment/BasicTaskScheduler0.cpp b/src/big/mpp/middleware/src/live555/BasicUsageEnvironment/BasicTaskScheduler0.cpp new file mode 100644 index 000000000..aaab28e93 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/BasicUsageEnvironment/BasicTaskScheduler0.cpp @@ -0,0 +1,237 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Basic Usage Environment: for a simple, non-scripted, console application +// Implementation + +#include "BasicUsageEnvironment0.hh" +#include "HandlerSet.hh" + +////////// A subclass of DelayQueueEntry, +////////// used to implement BasicTaskScheduler0::scheduleDelayedTask() + +class AlarmHandler: public DelayQueueEntry { +public: + AlarmHandler(TaskFunc* proc, void* clientData, DelayInterval timeToDelay, intptr_t token) + : DelayQueueEntry(timeToDelay, token), fProc(proc), fClientData(clientData) { + } + +private: // redefined virtual functions + virtual void handleTimeout() { + (*fProc)(fClientData); + DelayQueueEntry::handleTimeout(); + } + +private: + TaskFunc* fProc; + void* fClientData; +}; + + +////////// BasicTaskScheduler0 ////////// + +BasicTaskScheduler0::BasicTaskScheduler0() + : fTokenCounter(0), fLastHandledSocketNum(-1), + fTriggersAwaitingHandling(0), fLastUsedTriggerMask(1), + fLastUsedTriggerNum(MAX_NUM_EVENT_TRIGGERS-1) { + fHandlers = new HandlerSet; + for (unsigned i = 0; i < MAX_NUM_EVENT_TRIGGERS; ++i) { + fTriggeredEventHandlers[i] = NULL; + fTriggeredEventClientDatas[i] = NULL; + } +} + +BasicTaskScheduler0::~BasicTaskScheduler0() { + delete fHandlers; +} + +TaskToken BasicTaskScheduler0::scheduleDelayedTask(int64_t microseconds, + TaskFunc* proc, + void* clientData) { + if (microseconds < 0) microseconds = 0; + DelayInterval timeToDelay((long)(microseconds/1000000), (long)(microseconds%1000000)); + AlarmHandler* alarmHandler = new AlarmHandler(proc, clientData, timeToDelay, ++fTokenCounter); + fDelayQueue.addEntry(alarmHandler); + + return (void*)(alarmHandler->token()); +} + +void BasicTaskScheduler0::unscheduleDelayedTask(TaskToken& prevTask) { + DelayQueueEntry* alarmHandler = fDelayQueue.removeEntry((intptr_t)prevTask); + prevTask = NULL; + delete alarmHandler; +} + +void BasicTaskScheduler0::doEventLoop(char volatile* watchVariable) { + // Repeatedly loop, handling readble sockets and timed events: + while (1) { + if (watchVariable != NULL && *watchVariable != 0) break; + SingleStep(); + } +} + +EventTriggerId BasicTaskScheduler0::createEventTrigger(TaskFunc* eventHandlerProc) { + unsigned i = fLastUsedTriggerNum; + EventTriggerId mask = fLastUsedTriggerMask; + + do { + i = (i+1)%MAX_NUM_EVENT_TRIGGERS; + mask >>= 1; + if (mask == 0) mask = 0x80000000; + + if (fTriggeredEventHandlers[i] == NULL) { + // This trigger number is free; use it: + fTriggeredEventHandlers[i] = eventHandlerProc; + fTriggeredEventClientDatas[i] = NULL; // sanity + + fLastUsedTriggerMask = mask; + fLastUsedTriggerNum = i; + + return mask; + } + } while (i != fLastUsedTriggerNum); + + // All available event triggers are allocated; return 0 instead: + return 0; +} + +void BasicTaskScheduler0::deleteEventTrigger(EventTriggerId eventTriggerId) { + fTriggersAwaitingHandling &=~ eventTriggerId; + + if (eventTriggerId == fLastUsedTriggerMask) { // common-case optimization: + fTriggeredEventHandlers[fLastUsedTriggerNum] = NULL; + fTriggeredEventClientDatas[fLastUsedTriggerNum] = NULL; + } else { + // "eventTriggerId" should have just one bit set. + // However, we do the reasonable thing if the user happened to 'or' together two or more "EventTriggerId"s: + EventTriggerId mask = 0x80000000; + for (unsigned i = 0; i < MAX_NUM_EVENT_TRIGGERS; ++i) { + if ((eventTriggerId&mask) != 0) { + fTriggeredEventHandlers[i] = NULL; + fTriggeredEventClientDatas[i] = NULL; + } + mask >>= 1; + } + } +} + +void BasicTaskScheduler0::triggerEvent(EventTriggerId eventTriggerId, void* clientData) { + // First, record the "clientData". (Note that we allow "eventTriggerId" to be a combination of bits for multiple events.) + EventTriggerId mask = 0x80000000; + for (unsigned i = 0; i < MAX_NUM_EVENT_TRIGGERS; ++i) { + if ((eventTriggerId&mask) != 0) { + fTriggeredEventClientDatas[i] = clientData; + } + mask >>= 1; + } + + // Then, note this event as being ready to be handled. + // (Note that because this function (unlike others in the library) can be called from an external thread, we do this last, to + // reduce the risk of a race condition.) + fTriggersAwaitingHandling |= eventTriggerId; +} + + +////////// HandlerSet (etc.) implementation ////////// + +HandlerDescriptor::HandlerDescriptor(HandlerDescriptor* nextHandler) + : conditionSet(0), handlerProc(NULL) { + // Link this descriptor into a doubly-linked list: + if (nextHandler == this) { // initialization + fNextHandler = fPrevHandler = this; + } else { + fNextHandler = nextHandler; + fPrevHandler = nextHandler->fPrevHandler; + nextHandler->fPrevHandler = this; + fPrevHandler->fNextHandler = this; + } +} + +HandlerDescriptor::~HandlerDescriptor() { + // Unlink this descriptor from a doubly-linked list: + fNextHandler->fPrevHandler = fPrevHandler; + fPrevHandler->fNextHandler = fNextHandler; +} + +HandlerSet::HandlerSet() + : fHandlers(&fHandlers) { + fHandlers.socketNum = -1; // shouldn't ever get looked at, but in case... +} + +HandlerSet::~HandlerSet() { + // Delete each handler descriptor: + while (fHandlers.fNextHandler != &fHandlers) { + delete fHandlers.fNextHandler; // changes fHandlers->fNextHandler + } +} + +void HandlerSet +::assignHandler(int socketNum, int conditionSet, TaskScheduler::BackgroundHandlerProc* handlerProc, void* clientData) { + // First, see if there's already a handler for this socket: + HandlerDescriptor* handler = lookupHandler(socketNum); + if (handler == NULL) { // No existing handler, so create a new descr: + handler = new HandlerDescriptor(fHandlers.fNextHandler); + handler->socketNum = socketNum; + } + + handler->conditionSet = conditionSet; + handler->handlerProc = handlerProc; + handler->clientData = clientData; +} + +void HandlerSet::clearHandler(int socketNum) { + HandlerDescriptor* handler = lookupHandler(socketNum); + delete handler; +} + +void HandlerSet::moveHandler(int oldSocketNum, int newSocketNum) { + HandlerDescriptor* handler = lookupHandler(oldSocketNum); + if (handler != NULL) { + handler->socketNum = newSocketNum; + } +} + +HandlerDescriptor* HandlerSet::lookupHandler(int socketNum) { + HandlerDescriptor* handler; + HandlerIterator iter(*this); + while ((handler = iter.next()) != NULL) { + if (handler->socketNum == socketNum) break; + } + return handler; +} + +HandlerIterator::HandlerIterator(HandlerSet& handlerSet) + : fOurSet(handlerSet) { + reset(); +} + +HandlerIterator::~HandlerIterator() { +} + +void HandlerIterator::reset() { + fNextPtr = fOurSet.fHandlers.fNextHandler; +} + +HandlerDescriptor* HandlerIterator::next() { + HandlerDescriptor* result = fNextPtr; + if (result == &fOurSet.fHandlers) { // no more + result = NULL; + } else { + fNextPtr = fNextPtr->fNextHandler; + } + + return result; +} diff --git a/src/big/mpp/middleware/src/live555/BasicUsageEnvironment/BasicUsageEnvironment.cpp b/src/big/mpp/middleware/src/live555/BasicUsageEnvironment/BasicUsageEnvironment.cpp new file mode 100644 index 000000000..6a80d235f --- /dev/null +++ b/src/big/mpp/middleware/src/live555/BasicUsageEnvironment/BasicUsageEnvironment.cpp @@ -0,0 +1,80 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Basic Usage Environment: for a simple, non-scripted, console application +// Implementation + +#include "BasicUsageEnvironment.hh" +#include + +////////// BasicUsageEnvironment ////////// + +#if defined(__WIN32__) || defined(_WIN32) +extern "C" int initializeWinsockIfNecessary(); +#endif + +BasicUsageEnvironment::BasicUsageEnvironment(TaskScheduler& taskScheduler) +: BasicUsageEnvironment0(taskScheduler) { +#if defined(__WIN32__) || defined(_WIN32) + if (!initializeWinsockIfNecessary()) { + setResultErrMsg("Failed to initialize 'winsock': "); + reportBackgroundError(); + internalError(); + } +#endif +} + +BasicUsageEnvironment::~BasicUsageEnvironment() { +} + +BasicUsageEnvironment* +BasicUsageEnvironment::createNew(TaskScheduler& taskScheduler) { + return new BasicUsageEnvironment(taskScheduler); +} + +int BasicUsageEnvironment::getErrno() const { +#if defined(__WIN32__) || defined(_WIN32) || defined(_WIN32_WCE) + return WSAGetLastError(); +#else + return errno; +#endif +} + +UsageEnvironment& BasicUsageEnvironment::operator<<(char const* str) { + if (str == NULL) str = "(NULL)"; // sanity check + fprintf(stderr, "%s", str); + return *this; +} + +UsageEnvironment& BasicUsageEnvironment::operator<<(int i) { + fprintf(stderr, "%d", i); + return *this; +} + +UsageEnvironment& BasicUsageEnvironment::operator<<(unsigned u) { + fprintf(stderr, "%u", u); + return *this; +} + +UsageEnvironment& BasicUsageEnvironment::operator<<(double d) { + fprintf(stderr, "%f", d); + return *this; +} + +UsageEnvironment& BasicUsageEnvironment::operator<<(void* p) { + fprintf(stderr, "%p", p); + return *this; +} diff --git a/src/big/mpp/middleware/src/live555/BasicUsageEnvironment/BasicUsageEnvironment0.cpp b/src/big/mpp/middleware/src/live555/BasicUsageEnvironment/BasicUsageEnvironment0.cpp new file mode 100644 index 000000000..0e17a9bf5 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/BasicUsageEnvironment/BasicUsageEnvironment0.cpp @@ -0,0 +1,108 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Basic Usage Environment: for a simple, non-scripted, console application +// Implementation + +#include "BasicUsageEnvironment0.hh" +#include +#if defined(__WIN32__) || defined(_WIN32) || defined(_WIN32_WCE) +#define snprintf _snprintf +#endif + + +////////// BasicUsageEnvironment ////////// + +BasicUsageEnvironment0::BasicUsageEnvironment0(TaskScheduler& taskScheduler) + : UsageEnvironment(taskScheduler), + fBufferMaxSize(RESULT_MSG_BUFFER_MAX) { + reset(); +} + +BasicUsageEnvironment0::~BasicUsageEnvironment0() { +} + +void BasicUsageEnvironment0::reset() { + fCurBufferSize = 0; + fResultMsgBuffer[fCurBufferSize] = '\0'; +} + + +// Implementation of virtual functions: + +char const* BasicUsageEnvironment0::getResultMsg() const { + return fResultMsgBuffer; +} + +void BasicUsageEnvironment0::setResultMsg(MsgString msg) { + reset(); + appendToResultMsg(msg); +} + +void BasicUsageEnvironment0::setResultMsg(MsgString msg1, MsgString msg2) { + setResultMsg(msg1); + appendToResultMsg(msg2); +} + +void BasicUsageEnvironment0::setResultMsg(MsgString msg1, MsgString msg2, + MsgString msg3) { + setResultMsg(msg1, msg2); + appendToResultMsg(msg3); +} + +void BasicUsageEnvironment0::setResultErrMsg(MsgString msg, int err) { + setResultMsg(msg); + + if (err == 0) err = getErrno(); +#if defined(__WIN32__) || defined(_WIN32) || defined(_WIN32_WCE) +#ifndef _UNICODE + char errMsg[RESULT_MSG_BUFFER_MAX] = "\0"; + if (0 != FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, err, 0, errMsg, sizeof(errMsg)/sizeof(errMsg[0]), NULL)) { + // Remove all trailing '\r', '\n' and '.' + for (char* p = errMsg + strlen(errMsg); p != errMsg && (*p == '\r' || *p == '\n' || *p == '.' || *p == '\0'); --p) { + *p = '\0'; + } + } else + snprintf(errMsg, sizeof(errMsg)/sizeof(errMsg[0]), "error %d", err); + appendToResultMsg(errMsg); +#endif +#else + appendToResultMsg(strerror(err)); +#endif +} + + + + +void BasicUsageEnvironment0::appendToResultMsg(MsgString msg) { + char* curPtr = &fResultMsgBuffer[fCurBufferSize]; + unsigned spaceAvailable = fBufferMaxSize - fCurBufferSize; + unsigned msgLength = strlen(msg); + + // Copy only enough of "msg" as will fit: + if (msgLength > spaceAvailable-1) { + msgLength = spaceAvailable-1; + } + + memmove(curPtr, (char*)msg, msgLength); + fCurBufferSize += msgLength; + fResultMsgBuffer[fCurBufferSize] = '\0'; +} + +void BasicUsageEnvironment0::reportBackgroundError() { + fputs(getResultMsg(), stderr); +} + diff --git a/src/big/mpp/middleware/src/live555/BasicUsageEnvironment/DelayQueue.cpp b/src/big/mpp/middleware/src/live555/BasicUsageEnvironment/DelayQueue.cpp new file mode 100644 index 000000000..1e5186b6a --- /dev/null +++ b/src/big/mpp/middleware/src/live555/BasicUsageEnvironment/DelayQueue.cpp @@ -0,0 +1,230 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// Copyright (c) 1996-2023, Live Networks, Inc. All rights reserved +// Help by Carlo Bonamico to get working for Windows +// Delay queue +// Implementation + +#include "DelayQueue.hh" +#include "GroupsockHelper.hh" + +static const int MILLION = 1000000; + +///// Timeval ///// + +int Timeval::operator>=(const Timeval& arg2) const { + return seconds() > arg2.seconds() + || (seconds() == arg2.seconds() + && useconds() >= arg2.useconds()); +} + +void Timeval::operator+=(const DelayInterval& arg2) { + secs() += arg2.seconds(); usecs() += arg2.useconds(); + if (useconds() >= MILLION) { + usecs() -= MILLION; + ++secs(); + } +} + +void Timeval::operator-=(const DelayInterval& arg2) { + secs() -= arg2.seconds(); usecs() -= arg2.useconds(); + if ((int)useconds() < 0) { + usecs() += MILLION; + --secs(); + } + if ((int)seconds() < 0) + secs() = usecs() = 0; + +} + +DelayInterval operator-(const Timeval& arg1, const Timeval& arg2) { + time_base_seconds secs = arg1.seconds() - arg2.seconds(); + time_base_seconds usecs = arg1.useconds() - arg2.useconds(); + + if ((int)usecs < 0) { + usecs += MILLION; + --secs; + } + if ((int)secs < 0) + return DELAY_ZERO; + else + return DelayInterval(secs, usecs); +} + + +///// DelayInterval ///// + +DelayInterval operator*(short arg1, const DelayInterval& arg2) { + time_base_seconds result_seconds = arg1*arg2.seconds(); + time_base_seconds result_useconds = arg1*arg2.useconds(); + + time_base_seconds carry = result_useconds/MILLION; + result_useconds -= carry*MILLION; + result_seconds += carry; + + return DelayInterval(result_seconds, result_useconds); +} + +#ifndef INT_MAX +#define INT_MAX 0x7FFFFFFF +#endif +const DelayInterval DELAY_ZERO(0, 0); +const DelayInterval DELAY_SECOND(1, 0); +const DelayInterval DELAY_MINUTE = 60*DELAY_SECOND; +const DelayInterval DELAY_HOUR = 60*DELAY_MINUTE; +const DelayInterval DELAY_DAY = 24*DELAY_HOUR; +const DelayInterval ETERNITY(INT_MAX, MILLION-1); +// used internally to make the implementation work + + +///// DelayQueueEntry ///// + +DelayQueueEntry::DelayQueueEntry(DelayInterval delay, intptr_t token) + : fDeltaTimeRemaining(delay), fToken(token) { + fNext = fPrev = this; +} + +DelayQueueEntry::~DelayQueueEntry() { +} + +void DelayQueueEntry::handleTimeout() { + delete this; +} + + +///// DelayQueue ///// + +DelayQueue::DelayQueue() + : DelayQueueEntry(ETERNITY, 0) { + fLastSyncTime = TimeNow(); +} + +DelayQueue::~DelayQueue() { + while (fNext != this) { + DelayQueueEntry* entryToRemove = fNext; + removeEntry(entryToRemove); + delete entryToRemove; + } +} + +void DelayQueue::addEntry(DelayQueueEntry* newEntry) { + synchronize(); + + DelayQueueEntry* cur = head(); + while (newEntry->fDeltaTimeRemaining >= cur->fDeltaTimeRemaining) { + newEntry->fDeltaTimeRemaining -= cur->fDeltaTimeRemaining; + cur = cur->fNext; + } + + cur->fDeltaTimeRemaining -= newEntry->fDeltaTimeRemaining; + + // Add "newEntry" to the queue, just before "cur": + newEntry->fNext = cur; + newEntry->fPrev = cur->fPrev; + cur->fPrev = newEntry->fPrev->fNext = newEntry; +} + +void DelayQueue::updateEntry(DelayQueueEntry* entry, DelayInterval newDelay) { + if (entry == NULL) return; + + removeEntry(entry); + entry->fDeltaTimeRemaining = newDelay; + addEntry(entry); +} + +void DelayQueue::updateEntry(intptr_t tokenToFind, DelayInterval newDelay) { + DelayQueueEntry* entry = findEntryByToken(tokenToFind); + updateEntry(entry, newDelay); +} + +void DelayQueue::removeEntry(DelayQueueEntry* entry) { + if (entry == NULL || entry->fNext == NULL) return; + + entry->fNext->fDeltaTimeRemaining += entry->fDeltaTimeRemaining; + entry->fPrev->fNext = entry->fNext; + entry->fNext->fPrev = entry->fPrev; + entry->fNext = entry->fPrev = NULL; + // in case we should try to remove it again +} + +DelayQueueEntry* DelayQueue::removeEntry(intptr_t tokenToFind) { + DelayQueueEntry* entry = findEntryByToken(tokenToFind); + removeEntry(entry); + return entry; +} + +DelayInterval const& DelayQueue::timeToNextAlarm() { + if (head()->fDeltaTimeRemaining == DELAY_ZERO) return DELAY_ZERO; // a common case + + synchronize(); + return head()->fDeltaTimeRemaining; +} + +void DelayQueue::handleAlarm() { + if (head()->fDeltaTimeRemaining != DELAY_ZERO) synchronize(); + + if (head()->fDeltaTimeRemaining == DELAY_ZERO) { + // This event is due to be handled: + DelayQueueEntry* toRemove = head(); + removeEntry(toRemove); // do this first, in case handler accesses queue + + toRemove->handleTimeout(); + } +} + +DelayQueueEntry* DelayQueue::findEntryByToken(intptr_t tokenToFind) { + DelayQueueEntry* cur = head(); + while (cur != this) { + if (cur->token() == tokenToFind) return cur; + cur = cur->fNext; + } + + return NULL; +} + +void DelayQueue::synchronize() { + // First, figure out how much time has elapsed since the last sync: + _EventTime timeNow = TimeNow(); + if (timeNow < fLastSyncTime) { + // The system clock has apparently gone back in time; reset our sync time and return: + fLastSyncTime = timeNow; + return; + } + DelayInterval timeSinceLastSync = timeNow - fLastSyncTime; + fLastSyncTime = timeNow; + + // Then, adjust the delay queue for any entries whose time is up: + DelayQueueEntry* curEntry = head(); + while (timeSinceLastSync >= curEntry->fDeltaTimeRemaining) { + timeSinceLastSync -= curEntry->fDeltaTimeRemaining; + curEntry->fDeltaTimeRemaining = DELAY_ZERO; + curEntry = curEntry->fNext; + } + curEntry->fDeltaTimeRemaining -= timeSinceLastSync; +} + + +///// _EventTime ///// + +_EventTime TimeNow() { + struct timeval tvNow; + + gettimeofday(&tvNow, NULL); + + return _EventTime(tvNow.tv_sec, tvNow.tv_usec); +} + +const _EventTime THE_END_OF_TIME(INT_MAX); diff --git a/src/big/mpp/middleware/src/live555/BasicUsageEnvironment/Makefile b/src/big/mpp/middleware/src/live555/BasicUsageEnvironment/Makefile new file mode 100644 index 000000000..d1eb73710 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/BasicUsageEnvironment/Makefile @@ -0,0 +1,49 @@ +include $(MPP_SRC_DIR)/middleware/mpp.mk +include $(MPP_SRC_DIR)/middleware/rt-smart.mk + +CURRECT_DIR_NAME=$(shell basename `pwd`) +LOCAL_SRC_DIR = $(shell pwd) +BIN = lib$(CURRECT_DIR_NAME).a +LIBPATH = $(MPP_LIB_PATH) +LIBS = $(MPP_LIBS) + +CC_CFLAGS_EX=-mcmodel=medany -march=rv64imafdcv -mabi=lp64d -Wall -O0 -g -gdwarf-2 -n --static $(KCFLAGS) + +LIVE555_COMPILE_OPTS = -DSOCKLEN_T=socklen_t -DNO_SSTREAM=1 -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -DNO_OPENSSL=1 + +LOCAL_CFLAGS = -I$(LOCAL_SRC_DIR) -I$(LOCAL_SRC_DIR)/include -I../UsageEnvironment/include -I../groupsock/include + +WERROR_FLAGS = -Wno-register -Wno-multichar -Wno-pessimizing-move -Wno-deprecated-declarations -Wno-unused-result -Wno-unused-variable -Wno-format -Wno-return-type -Wno-sign-compare -Wno-unused-label + +CXX_FLAGS = $(WERROR_FLAGS) \ + $(LIVE555_COMPILE_OPTS) \ + +SRCS = $(wildcard $(LOCAL_SRC_DIR)/*.c) + +OBJS = $(patsubst %.c,%.o,$(SRCS)) + +CPP_SRCS = $(wildcard $(LOCAL_SRC_DIR)/*.cpp) + +CPP_OBJS = $(patsubst %.cpp,%.o,$(CPP_SRCS)) + +all: $(BIN) + @-rm -f *.o + @echo "${PWD}/Makefile all" + +$(OBJS): %.o : %.c + @echo CC $@ + @$(CC) $(CC_CFLAGS_EX) $(LOCAL_CFLAGS) $(BSP_CFLGAS) $(RTSMART_CFLAGS) $(MPP_USER_CFLGAS) -c $< -o $@ + +$(CPP_OBJS): %.o : %.cpp + @echo CXX $@ + @$(CPP) $(CC_CFLAGS_EX) $(CXX_FLAGS) $(LOCAL_CFLAGS) $(BSP_CFLGAS) $(RTSMART_CFLAGS) $(MPP_USER_CFLGAS) -c $< -o $@ + +$(BIN): $(OBJS) $(CPP_OBJS) + @echo LD $@ + $(AR) $(ARFLAGS) $@ $^ + +clean: + echo "${PWD}/Makefile clean" + rm -rf $(BIN) $(OBJS) $(CPP_OBJS) + +.PHONY: all clean diff --git a/src/big/mpp/middleware/src/live555/BasicUsageEnvironment/include/BasicHashTable.hh b/src/big/mpp/middleware/src/live555/BasicUsageEnvironment/include/BasicHashTable.hh new file mode 100644 index 000000000..ad9c30b22 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/BasicUsageEnvironment/include/BasicHashTable.hh @@ -0,0 +1,104 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Basic Hash Table implementation +// C++ header + +#ifndef _BASIC_HASH_TABLE_HH +#define _BASIC_HASH_TABLE_HH + +#ifndef _HASH_TABLE_HH +#include "HashTable.hh" +#endif +#ifndef _NET_COMMON_H +#include // to ensure that "uintptr_t" is defined +#endif + +// A simple hash table implementation, inspired by the hash table +// implementation used in Tcl 7.6: + +#define SMALL_HASH_TABLE_SIZE 4 + +class BasicHashTable: public HashTable { +private: + class TableEntry; // forward + +public: + BasicHashTable(int keyType); + virtual ~BasicHashTable(); + + // Used to iterate through the members of the table: + class Iterator; friend class Iterator; // to make Sun's C++ compiler happy + class Iterator: public HashTable::Iterator { + public: + Iterator(BasicHashTable const& table); + + private: // implementation of inherited pure virtual functions + void* next(char const*& key); // returns 0 if none + + private: + BasicHashTable const& fTable; + unsigned fNextIndex; // index of next bucket to be enumerated after this + TableEntry* fNextEntry; // next entry in the current bucket + }; + +private: // implementation of inherited pure virtual functions + virtual void* Add(char const* key, void* value); + // Returns the old value if different, otherwise 0 + virtual Boolean Remove(char const* key); + virtual void* Lookup(char const* key) const; + // Returns 0 if not found + virtual unsigned numEntries() const; + +private: + class TableEntry { + public: + TableEntry* fNext; + char const* key; + void* value; + }; + + TableEntry* lookupKey(char const* key, unsigned& index) const; + // returns entry matching "key", or NULL if none + Boolean keyMatches(char const* key1, char const* key2) const; + // used to implement "lookupKey()" + + TableEntry* insertNewEntry(unsigned index, char const* key); + // creates a new entry, and inserts it in the table + void assignKey(TableEntry* entry, char const* key); + // used to implement "insertNewEntry()" + + void deleteEntry(unsigned index, TableEntry* entry); + void deleteKey(TableEntry* entry); + // used to implement "deleteEntry()" + + void rebuild(); // rebuilds the table as its size increases + + unsigned hashIndexFromKey(char const* key) const; + // used to implement many of the routines above + + unsigned randomIndex(uintptr_t i) const { + return (unsigned)(((i*1103515245) >> fDownShift) & fMask); + } + +private: + TableEntry** fBuckets; // pointer to bucket array + TableEntry* fStaticBuckets[SMALL_HASH_TABLE_SIZE];// used for small tables + unsigned fNumBuckets, fNumEntries, fRebuildSize, fDownShift, fMask; + int fKeyType; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/BasicUsageEnvironment/include/BasicUsageEnvironment.hh b/src/big/mpp/middleware/src/live555/BasicUsageEnvironment/include/BasicUsageEnvironment.hh new file mode 100644 index 000000000..b928eb8a9 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/BasicUsageEnvironment/include/BasicUsageEnvironment.hh @@ -0,0 +1,86 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Basic Usage Environment: for a simple, non-scripted, console application +// C++ header + +#ifndef _BASIC_USAGE_ENVIRONMENT_HH +#define _BASIC_USAGE_ENVIRONMENT_HH + +#ifndef _BASIC_USAGE_ENVIRONMENT0_HH +#include "BasicUsageEnvironment0.hh" +#endif + +class BasicUsageEnvironment: public BasicUsageEnvironment0 { +public: + static BasicUsageEnvironment* createNew(TaskScheduler& taskScheduler); + + // redefined virtual functions: + virtual int getErrno() const; + + virtual UsageEnvironment& operator<<(char const* str); + virtual UsageEnvironment& operator<<(int i); + virtual UsageEnvironment& operator<<(unsigned u); + virtual UsageEnvironment& operator<<(double d); + virtual UsageEnvironment& operator<<(void* p); + +protected: + BasicUsageEnvironment(TaskScheduler& taskScheduler); + // called only by "createNew()" (or subclass constructors) + virtual ~BasicUsageEnvironment(); +}; + + +class BasicTaskScheduler: public BasicTaskScheduler0 { +public: + static BasicTaskScheduler* createNew(unsigned maxSchedulerGranularity = 10000/*microseconds*/); + // "maxSchedulerGranularity" (default value: 10 ms) specifies the maximum time that we wait (in "select()") before + // returning to the event loop to handle non-socket or non-timer-based events, such as 'triggered events'. + // You can change this is you wish (but only if you know what you're doing!), or set it to 0, to specify no such maximum time. + // (You should set it to 0 only if you know that you will not be using 'event triggers'.) + virtual ~BasicTaskScheduler(); + +protected: + BasicTaskScheduler(unsigned maxSchedulerGranularity); + // called only by "createNew()" + + static void schedulerTickTask(void* clientData); + void schedulerTickTask(); + +protected: + // Redefined virtual functions: + virtual void SingleStep(unsigned maxDelayTime); + + virtual void setBackgroundHandling(int socketNum, int conditionSet, BackgroundHandlerProc* handlerProc, void* clientData); + virtual void moveSocketHandling(int oldSocketNum, int newSocketNum); + +protected: + unsigned fMaxSchedulerGranularity; + + // To implement background operations: + int fMaxNumSockets; + fd_set fReadSet; + fd_set fWriteSet; + fd_set fExceptionSet; + +private: +#if defined(__WIN32__) || defined(_WIN32) + // Hack to work around a bug in Windows' "select()" implementation: + int fDummySocketNum; +#endif +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/BasicUsageEnvironment/include/BasicUsageEnvironment0.hh b/src/big/mpp/middleware/src/live555/BasicUsageEnvironment/include/BasicUsageEnvironment0.hh new file mode 100644 index 000000000..10f874d59 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/BasicUsageEnvironment/include/BasicUsageEnvironment0.hh @@ -0,0 +1,115 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Basic Usage Environment: for a simple, non-scripted, console application +// C++ header + +#ifndef _BASIC_USAGE_ENVIRONMENT0_HH +#define _BASIC_USAGE_ENVIRONMENT0_HH + +#ifndef _BASICUSAGEENVIRONMENT_VERSION_HH +#include "BasicUsageEnvironment_version.hh" +#endif + +#ifndef _USAGE_ENVIRONMENT_HH +#include "UsageEnvironment.hh" +#endif + +#ifndef _DELAY_QUEUE_HH +#include "DelayQueue.hh" +#endif + +#define RESULT_MSG_BUFFER_MAX 1000 + +// An abstract base class, useful for subclassing +// (e.g., to redefine the implementation of "operator<<") +class BasicUsageEnvironment0: public UsageEnvironment { +public: + // redefined virtual functions: + virtual MsgString getResultMsg() const; + + virtual void setResultMsg(MsgString msg); + virtual void setResultMsg(MsgString msg1, + MsgString msg2); + virtual void setResultMsg(MsgString msg1, + MsgString msg2, + MsgString msg3); + virtual void setResultErrMsg(MsgString msg, int err = 0); + + virtual void appendToResultMsg(MsgString msg); + + virtual void reportBackgroundError(); + +protected: + BasicUsageEnvironment0(TaskScheduler& taskScheduler); + virtual ~BasicUsageEnvironment0(); + +private: + void reset(); + + char fResultMsgBuffer[RESULT_MSG_BUFFER_MAX]; + unsigned fCurBufferSize; + unsigned fBufferMaxSize; +}; + +class HandlerSet; // forward + +#define MAX_NUM_EVENT_TRIGGERS 32 + +// An abstract base class, useful for subclassing +// (e.g., to redefine the implementation of socket event handling) +class BasicTaskScheduler0: public TaskScheduler { +public: + virtual ~BasicTaskScheduler0(); + + virtual void SingleStep(unsigned maxDelayTime = 0) = 0; + // "maxDelayTime" is in microseconds. It allows a subclass to impose a limit + // on how long "select()" can delay, in case it wants to also do polling. + // 0 (the default value) means: There's no maximum; just look at the delay queue + +public: + // Redefined virtual functions: + virtual TaskToken scheduleDelayedTask(int64_t microseconds, TaskFunc* proc, + void* clientData); + virtual void unscheduleDelayedTask(TaskToken& prevTask); + + virtual void doEventLoop(char volatile* watchVariable); + + virtual EventTriggerId createEventTrigger(TaskFunc* eventHandlerProc); + virtual void deleteEventTrigger(EventTriggerId eventTriggerId); + virtual void triggerEvent(EventTriggerId eventTriggerId, void* clientData = NULL); + +protected: + BasicTaskScheduler0(); + +protected: + // To implement delayed operations: + intptr_t fTokenCounter; + DelayQueue fDelayQueue; + + // To implement background reads: + HandlerSet* fHandlers; + int fLastHandledSocketNum; + + // To implement event triggers: + EventTriggerId volatile fTriggersAwaitingHandling; // implemented as a 32-bit bitmap + EventTriggerId fLastUsedTriggerMask; // implemented as a 32-bit bitmap + TaskFunc* fTriggeredEventHandlers[MAX_NUM_EVENT_TRIGGERS]; + void* fTriggeredEventClientDatas[MAX_NUM_EVENT_TRIGGERS]; + unsigned fLastUsedTriggerNum; // in the range [0,MAX_NUM_EVENT_TRIGGERS) +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/BasicUsageEnvironment/include/BasicUsageEnvironment_version.hh b/src/big/mpp/middleware/src/live555/BasicUsageEnvironment/include/BasicUsageEnvironment_version.hh new file mode 100644 index 000000000..dffbdcaf9 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/BasicUsageEnvironment/include/BasicUsageEnvironment_version.hh @@ -0,0 +1,25 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// Version information for the "BasicUsageEnvironment" library +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. + +#ifndef _BASICUSAGEENVIRONMENT_VERSION_HH +#define _BASICUSAGEENVIRONMENT_VERSION_HH + +#define BASICUSAGEENVIRONMENT_LIBRARY_VERSION_STRING "2023.01.19" +#define BASICUSAGEENVIRONMENT_LIBRARY_VERSION_INT 1674086400 + +#endif diff --git a/src/big/mpp/middleware/src/live555/BasicUsageEnvironment/include/DelayQueue.hh b/src/big/mpp/middleware/src/live555/BasicUsageEnvironment/include/DelayQueue.hh new file mode 100644 index 000000000..5deab313f --- /dev/null +++ b/src/big/mpp/middleware/src/live555/BasicUsageEnvironment/include/DelayQueue.hh @@ -0,0 +1,181 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ + // Copyright (c) 1996-2023, Live Networks, Inc. All rights reserved +// Delay queue +// C++ header + +#ifndef _DELAY_QUEUE_HH +#define _DELAY_QUEUE_HH + +#ifndef _NET_COMMON_H +#include "NetCommon.h" +#endif + +#ifdef TIME_BASE +typedef TIME_BASE time_base_seconds; +#else +typedef long time_base_seconds; +#endif + +///// A "Timeval" can be either an absolute time, or a time interval ///// + +class Timeval { +public: + time_base_seconds seconds() const { + return fTv.tv_sec; + } + time_base_seconds seconds() { + return fTv.tv_sec; + } + time_base_seconds useconds() const { + return fTv.tv_usec; + } + time_base_seconds useconds() { + return fTv.tv_usec; + } + + int operator>=(Timeval const& arg2) const; + int operator<=(Timeval const& arg2) const { + return arg2 >= *this; + } + int operator<(Timeval const& arg2) const { + return !(*this >= arg2); + } + int operator>(Timeval const& arg2) const { + return arg2 < *this; + } + int operator==(Timeval const& arg2) const { + return *this >= arg2 && arg2 >= *this; + } + int operator!=(Timeval const& arg2) const { + return !(*this == arg2); + } + + void operator+=(class DelayInterval const& arg2); + void operator-=(class DelayInterval const& arg2); + // returns ZERO iff arg2 >= arg1 + +protected: + Timeval(time_base_seconds seconds, time_base_seconds useconds) { + fTv.tv_sec = seconds; fTv.tv_usec = useconds; + } + +private: + time_base_seconds& secs() { + return (time_base_seconds&)fTv.tv_sec; + } + time_base_seconds& usecs() { + return (time_base_seconds&)fTv.tv_usec; + } + + struct timeval fTv; +}; + +#ifndef max +inline Timeval max(Timeval const& arg1, Timeval const& arg2) { + return arg1 >= arg2 ? arg1 : arg2; +} +#endif +#ifndef min +inline Timeval min(Timeval const& arg1, Timeval const& arg2) { + return arg1 <= arg2 ? arg1 : arg2; +} +#endif + +class DelayInterval operator-(Timeval const& arg1, Timeval const& arg2); +// returns ZERO iff arg2 >= arg1 + + +///// DelayInterval ///// + +class DelayInterval: public Timeval { +public: + DelayInterval(time_base_seconds seconds, time_base_seconds useconds) + : Timeval(seconds, useconds) {} +}; + +DelayInterval operator*(short arg1, DelayInterval const& arg2); + +extern DelayInterval const DELAY_ZERO; +extern DelayInterval const DELAY_SECOND; +extern DelayInterval const DELAY_MINUTE; +extern DelayInterval const DELAY_HOUR; +extern DelayInterval const DELAY_DAY; + +///// _EventTime ///// + +class _EventTime: public Timeval { +public: + _EventTime(unsigned secondsSinceEpoch = 0, + unsigned usecondsSinceEpoch = 0) + // We use the Unix standard epoch: January 1, 1970 + : Timeval(secondsSinceEpoch, usecondsSinceEpoch) {} +}; + +_EventTime TimeNow(); + +extern _EventTime const THE_END_OF_TIME; + + +///// DelayQueueEntry ///// + +class DelayQueueEntry { +public: + virtual ~DelayQueueEntry(); + + intptr_t token() { + return fToken; + } + +protected: // abstract base class + DelayQueueEntry(DelayInterval delay, intptr_t token); + + virtual void handleTimeout(); + +private: + friend class DelayQueue; + DelayQueueEntry* fNext; + DelayQueueEntry* fPrev; + DelayInterval fDeltaTimeRemaining; + + intptr_t fToken; +}; + +///// DelayQueue ///// + +class DelayQueue: public DelayQueueEntry { +public: + DelayQueue(); + virtual ~DelayQueue(); + + void addEntry(DelayQueueEntry* newEntry); // returns a token for the entry + void updateEntry(DelayQueueEntry* entry, DelayInterval newDelay); + void updateEntry(intptr_t tokenToFind, DelayInterval newDelay); + void removeEntry(DelayQueueEntry* entry); // but doesn't delete it + DelayQueueEntry* removeEntry(intptr_t tokenToFind); // but doesn't delete it + + DelayInterval const& timeToNextAlarm(); + void handleAlarm(); + +private: + DelayQueueEntry* head() { return fNext; } + DelayQueueEntry* findEntryByToken(intptr_t token); + void synchronize(); // bring the 'time remaining' fields up-to-date + + _EventTime fLastSyncTime; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/BasicUsageEnvironment/include/HandlerSet.hh b/src/big/mpp/middleware/src/live555/BasicUsageEnvironment/include/HandlerSet.hh new file mode 100644 index 000000000..c9e84beba --- /dev/null +++ b/src/big/mpp/middleware/src/live555/BasicUsageEnvironment/include/HandlerSet.hh @@ -0,0 +1,77 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Basic Usage Environment: for a simple, non-scripted, console application +// C++ header + +#ifndef _HANDLER_SET_HH +#define _HANDLER_SET_HH + +#ifndef _BOOLEAN_HH +#include "Boolean.hh" +#endif + +////////// HandlerSet (etc.) definition ////////// + +class HandlerDescriptor { + HandlerDescriptor(HandlerDescriptor* nextHandler); + virtual ~HandlerDescriptor(); + +public: + int socketNum; + int conditionSet; + TaskScheduler::BackgroundHandlerProc* handlerProc; + void* clientData; + +private: + // Descriptors are linked together in a doubly-linked list: + friend class HandlerSet; + friend class HandlerIterator; + HandlerDescriptor* fNextHandler; + HandlerDescriptor* fPrevHandler; +}; + +class HandlerSet { +public: + HandlerSet(); + virtual ~HandlerSet(); + + void assignHandler(int socketNum, int conditionSet, TaskScheduler::BackgroundHandlerProc* handlerProc, void* clientData); + void clearHandler(int socketNum); + void moveHandler(int oldSocketNum, int newSocketNum); + +private: + HandlerDescriptor* lookupHandler(int socketNum); + +private: + friend class HandlerIterator; + HandlerDescriptor fHandlers; +}; + +class HandlerIterator { +public: + HandlerIterator(HandlerSet& handlerSet); + virtual ~HandlerIterator(); + + HandlerDescriptor* next(); // returns NULL if none + void reset(); + +private: + HandlerSet& fOurSet; + HandlerDescriptor* fNextPtr; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/Makefile b/src/big/mpp/middleware/src/live555/Makefile new file mode 100644 index 000000000..7640d887d --- /dev/null +++ b/src/big/mpp/middleware/src/live555/Makefile @@ -0,0 +1,33 @@ +include $(MPP_SRC_DIR)/middleware/mpp.mk +include $(MPP_SRC_DIR)/middleware/rt-smart.mk + +AR = riscv64-unknown-linux-musl-ar +ARFLAGS = -rc + +CURRECT_DIR_NAME=$(shell basename `pwd`) +LOCAL_SRC_DIR = $(shell pwd) + +LIVE555_USAGEENVIRONMENT= $(LOCAL_SRC_DIR)/UsageEnvironment +LIVE555_BASICUSAGEENVIRONMENT= $(LOCAL_SRC_DIR)/BasicUsageEnvironment +LIVE555_GROUPSOCK = $(LOCAL_SRC_DIR)/groupsock +LIVE555_LIVEMEDIA = $(LOCAL_SRC_DIR)/liveMedia +LIVE555_MEDIASERVER = $(LOCAL_SRC_DIR)/mediaServer + +all: + cd $(LIVE555_LIVEMEDIA) ; make + cd $(LIVE555_GROUPSOCK) ; make + cd $(LIVE555_USAGEENVIRONMENT) ; make + cd $(LIVE555_BASICUSAGEENVIRONMENT) ; make + cd $(LIVE555_MEDIASERVER) ; make + + +clean: + echo "${PWD}/Makefile clean" + @cd $(LIVE555_LIVEMEDIA); make clean + @cd $(LIVE555_GROUPSOCK); make clean + @cd $(LIVE555_USAGEENVIRONMENT); make clean + @cd $(LIVE555_BASICUSAGEENVIRONMENT); make clean + @cd $(LIVE555_MEDIASERVER); make clean + + +.PHONY: all clean diff --git a/src/big/mpp/middleware/src/live555/UsageEnvironment/HashTable.cpp b/src/big/mpp/middleware/src/live555/UsageEnvironment/HashTable.cpp new file mode 100644 index 000000000..4a81d0074 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/UsageEnvironment/HashTable.cpp @@ -0,0 +1,50 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Generic Hash Table +// Implementation + +#include "HashTable.hh" + +HashTable::HashTable() { +} + +HashTable::~HashTable() { +} + +HashTable::Iterator::Iterator() { +} + +HashTable::Iterator::~Iterator() {} + +void* HashTable::RemoveNext() { + Iterator* iter = Iterator::create(*this); + char const* key; + void* removedValue = iter->next(key); + if (removedValue != 0) Remove(key); + + delete iter; + return removedValue; +} + +void* HashTable::getFirst() { + Iterator* iter = Iterator::create(*this); + char const* key; + void* firstValue = iter->next(key); + + delete iter; + return firstValue; +} diff --git a/src/big/mpp/middleware/src/live555/UsageEnvironment/Makefile b/src/big/mpp/middleware/src/live555/UsageEnvironment/Makefile new file mode 100644 index 000000000..653279ab4 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/UsageEnvironment/Makefile @@ -0,0 +1,49 @@ +include $(MPP_SRC_DIR)/middleware/mpp.mk +include $(MPP_SRC_DIR)/middleware/rt-smart.mk + +CURRECT_DIR_NAME=$(shell basename `pwd`) +LOCAL_SRC_DIR = $(shell pwd) +BIN = lib$(CURRECT_DIR_NAME).a +LIBPATH = $(MPP_LIB_PATH) +LIBS = $(MPP_LIBS) + +CC_CFLAGS_EX=-mcmodel=medany -march=rv64imafdcv -mabi=lp64d -Wall -O0 -g -gdwarf-2 -n --static $(KCFLAGS) + +LIVE555_COMPILE_OPTS = -DSOCKLEN_T=socklen_t -DNO_SSTREAM=1 -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -DNO_OPENSSL=1 + +LOCAL_CFLAGS = -I$(LOCAL_SRC_DIR) -I$(LOCAL_SRC_DIR)/include -I../groupsock/include + +WERROR_FLAGS = -Wno-register -Wno-multichar -Wno-pessimizing-move -Wno-deprecated-declarations -Wno-unused-result -Wno-unused-variable -Wno-format -Wno-return-type -Wno-sign-compare -Wno-unused-label + +CXX_FLAGS = $(WERROR_FLAGS) \ + $(LIVE555_COMPILE_OPTS) \ + +SRCS = $(wildcard $(LOCAL_SRC_DIR)/*.c) + +OBJS = $(patsubst %.c,%.o,$(SRCS)) + +CPP_SRCS = $(wildcard $(LOCAL_SRC_DIR)/*.cpp) + +CPP_OBJS = $(patsubst %.cpp,%.o,$(CPP_SRCS)) + +all: $(BIN) + @-rm -f *.o + @echo "${PWD}/Makefile all" + +$(OBJS): %.o : %.c + @echo CC $@ + @$(CC) $(CC_CFLAGS_EX) $(LOCAL_CFLAGS) $(BSP_CFLGAS) $(RTSMART_CFLAGS) $(MPP_USER_CFLGAS) -c $< -o $@ + +$(CPP_OBJS): %.o : %.cpp + @echo CXX $@ + @$(CPP) $(CC_CFLAGS_EX) $(CXX_FLAGS) $(LOCAL_CFLAGS) $(BSP_CFLGAS) $(RTSMART_CFLAGS) $(MPP_USER_CFLGAS) -c $< -o $@ + +$(BIN): $(OBJS) $(CPP_OBJS) + @echo LD $@ + $(AR) $(ARFLAGS) $@ $^ + +clean: + echo "${PWD}/Makefile clean" + rm -rf $(BIN) $(OBJS) $(CPP_OBJS) + +.PHONY: all clean diff --git a/src/big/mpp/middleware/src/live555/UsageEnvironment/UsageEnvironment.cpp b/src/big/mpp/middleware/src/live555/UsageEnvironment/UsageEnvironment.cpp new file mode 100644 index 000000000..834795823 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/UsageEnvironment/UsageEnvironment.cpp @@ -0,0 +1,62 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Usage Environment +// Implementation + +#include "UsageEnvironment.hh" + +Boolean UsageEnvironment::reclaim() { + // We delete ourselves only if we have no remainining state: + if (liveMediaPriv == NULL && groupsockPriv == NULL) { + delete this; + return True; + } + + return False; +} + +UsageEnvironment::UsageEnvironment(TaskScheduler& scheduler) + : liveMediaPriv(NULL), groupsockPriv(NULL), fScheduler(scheduler) { +} + +UsageEnvironment::~UsageEnvironment() { +} + +// By default, we handle 'should not occur'-type library errors by calling abort(). Subclasses can redefine this, if desired. +// (If your runtime library doesn't define the "abort()" function, then define your own (e.g., that does nothing).) +void UsageEnvironment::internalError() { + abort(); +} + + +TaskScheduler::TaskScheduler() { +} + +TaskScheduler::~TaskScheduler() { +} + +void TaskScheduler::rescheduleDelayedTask(TaskToken& task, + int64_t microseconds, TaskFunc* proc, + void* clientData) { + unscheduleDelayedTask(task); + task = scheduleDelayedTask(microseconds, proc, clientData); +} + +// By default, we handle 'should not occur'-type library errors by calling abort(). Subclasses can redefine this, if desired. +void TaskScheduler::internalError() { + abort(); +} diff --git a/src/big/mpp/middleware/src/live555/UsageEnvironment/include/Boolean.hh b/src/big/mpp/middleware/src/live555/UsageEnvironment/include/Boolean.hh new file mode 100644 index 000000000..3d8401eb5 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/UsageEnvironment/include/Boolean.hh @@ -0,0 +1,37 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +#ifndef _BOOLEAN_HH +#define _BOOLEAN_HH + +#if defined(__BORLANDC__) || (!defined(USE_LIVE555_BOOLEAN) && defined(_MSC_VER) && _MSC_VER >= 1400) +// Use the "bool" type defined by the Borland compiler, and MSVC++ 8.0, Visual Studio 2005 and higher +typedef bool Boolean; +#define False false +#define True true +#else +typedef unsigned char Boolean; +#ifndef __MSHTML_LIBRARY_DEFINED__ +#ifndef False +const Boolean False = 0; +#endif +#ifndef True +const Boolean True = 1; +#endif + +#endif +#endif + +#endif diff --git a/src/big/mpp/middleware/src/live555/UsageEnvironment/include/HashTable.hh b/src/big/mpp/middleware/src/live555/UsageEnvironment/include/HashTable.hh new file mode 100644 index 000000000..3297dbe91 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/UsageEnvironment/include/HashTable.hh @@ -0,0 +1,76 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Generic Hash Table +// C++ header + +#ifndef _HASH_TABLE_HH +#define _HASH_TABLE_HH + +#ifndef _BOOLEAN_HH +#include "Boolean.hh" +#endif + +class HashTable { +public: + virtual ~HashTable(); + + // The following must be implemented by a particular + // implementation (subclass): + static HashTable* create(int keyType); + + virtual void* Add(char const* key, void* value) = 0; + // Returns the old value if different, otherwise 0 + virtual Boolean Remove(char const* key) = 0; + virtual void* Lookup(char const* key) const = 0; + // Returns 0 if not found + virtual unsigned numEntries() const = 0; + Boolean IsEmpty() const { return numEntries() == 0; } + + // Used to iterate through the members of the table: + class Iterator { + public: + // The following must be implemented by a particular + // implementation (subclass): + static Iterator* create(HashTable const& hashTable); + + virtual ~Iterator(); + + virtual void* next(char const*& key) = 0; // returns 0 if none + + protected: + Iterator(); // abstract base class + }; + + // A shortcut that can be used to successively remove each of + // the entries in the table (e.g., so that their values can be + // deleted, if they happen to be pointers to allocated memory). + void* RemoveNext(); + + // Returns the first entry in the table. + // (This is useful for deleting each entry in the table, if the entry's destructor also removes itself from the table.) + void* getFirst(); + +protected: + HashTable(); // abstract base class +}; + +// Warning: The following are deliberately the same as in +// Tcl's hash table implementation +int const STRING_HASH_KEYS = 0; +int const ONE_WORD_HASH_KEYS = 1; + +#endif diff --git a/src/big/mpp/middleware/src/live555/UsageEnvironment/include/UsageEnvironment.hh b/src/big/mpp/middleware/src/live555/UsageEnvironment/include/UsageEnvironment.hh new file mode 100644 index 000000000..27c880939 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/UsageEnvironment/include/UsageEnvironment.hh @@ -0,0 +1,172 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Usage Environment +// C++ header + +#ifndef _USAGE_ENVIRONMENT_HH +#define _USAGE_ENVIRONMENT_HH + +#ifndef _USAGEENVIRONMENT_VERSION_HH +#include "UsageEnvironment_version.hh" +#endif + +#ifndef _NETCOMMON_H +#include "NetCommon.h" +#endif + +#ifndef _BOOLEAN_HH +#include "Boolean.hh" +#endif + +#ifndef _STRDUP_HH +// "strDup()" is used often, so include this here, so everyone gets it: +#include "strDup.hh" +#endif + +#ifndef NULL +#define NULL 0 +#endif + +#ifdef __BORLANDC__ +#define _setmode setmode +#define _O_BINARY O_BINARY +#endif + +class TaskScheduler; // forward + +// An abstract base class, subclassed for each use of the library + +class UsageEnvironment { +public: + Boolean reclaim(); + // returns True iff we were actually able to delete our object + + // task scheduler: + TaskScheduler& taskScheduler() const {return fScheduler;} + + // result message handling: + typedef char const* MsgString; + virtual MsgString getResultMsg() const = 0; + + virtual void setResultMsg(MsgString msg) = 0; + virtual void setResultMsg(MsgString msg1, MsgString msg2) = 0; + virtual void setResultMsg(MsgString msg1, MsgString msg2, MsgString msg3) = 0; + virtual void setResultErrMsg(MsgString msg, int err = 0) = 0; + // like setResultMsg(), except that an 'errno' message is appended. (If "err == 0", the "getErrno()" code is used instead.) + + virtual void appendToResultMsg(MsgString msg) = 0; + + virtual void reportBackgroundError() = 0; + // used to report a (previously set) error message within + // a background event + + virtual void internalError(); // used to 'handle' a 'should not occur'-type error condition within the library. + + // 'errno' + virtual int getErrno() const = 0; + + // 'console' output: + virtual UsageEnvironment& operator<<(char const* str) = 0; + virtual UsageEnvironment& operator<<(int i) = 0; + virtual UsageEnvironment& operator<<(unsigned u) = 0; + virtual UsageEnvironment& operator<<(double d) = 0; + virtual UsageEnvironment& operator<<(void* p) = 0; + + // a pointer to additional, optional, client-specific state + void* liveMediaPriv; + void* groupsockPriv; + +protected: + UsageEnvironment(TaskScheduler& scheduler); // abstract base class + virtual ~UsageEnvironment(); // we are deleted only by reclaim() + +private: + TaskScheduler& fScheduler; +}; + + +typedef void TaskFunc(void* clientData); +typedef void* TaskToken; +typedef u_int32_t EventTriggerId; + +class TaskScheduler { +public: + virtual ~TaskScheduler(); + + virtual TaskToken scheduleDelayedTask(int64_t microseconds, TaskFunc* proc, + void* clientData) = 0; + // Schedules a task to occur (after a delay) when we next + // reach a scheduling point. + // (Does not delay if "microseconds" <= 0) + // Returns a token that can be used in a subsequent call to + // unscheduleDelayedTask() or rescheduleDelayedTask() + // (but only if the task has not yet occurred). + + virtual void unscheduleDelayedTask(TaskToken& prevTask) = 0; + // (Has no effect if "prevTask" == NULL) + // Sets "prevTask" to NULL afterwards. + // Note: This MUST NOT be called if the scheduled task has already occurred. + + virtual void rescheduleDelayedTask(TaskToken& task, + int64_t microseconds, TaskFunc* proc, + void* clientData); + // Combines "unscheduleDelayedTask()" with "scheduleDelayedTask()" + // (setting "task" to the new task token). + // Note: This MUST NOT be called if the scheduled task has already occurred. + + // For handling socket operations in the background (from the event loop): + typedef void BackgroundHandlerProc(void* clientData, int mask); + // Possible bits to set in "mask". (These are deliberately defined + // the same as those in Tcl, to make a Tcl-based subclass easy.) + #define SOCKET_READABLE (1<<1) + #define SOCKET_WRITABLE (1<<2) + #define SOCKET_EXCEPTION (1<<3) + virtual void setBackgroundHandling(int socketNum, int conditionSet, BackgroundHandlerProc* handlerProc, void* clientData) = 0; + void disableBackgroundHandling(int socketNum) { setBackgroundHandling(socketNum, 0, NULL, NULL); } + virtual void moveSocketHandling(int oldSocketNum, int newSocketNum) = 0; + // Changes any socket handling for "oldSocketNum" so that occurs with "newSocketNum" instead. + + virtual void doEventLoop(char volatile* watchVariable = NULL) = 0; + // Causes further execution to take place within the event loop. + // Delayed tasks, background I/O handling, and other events are handled, sequentially (as a single thread of control). + // (If "watchVariable" is not NULL, then we return from this routine when *watchVariable != 0) + + virtual EventTriggerId createEventTrigger(TaskFunc* eventHandlerProc) = 0; + // Creates a 'trigger' for an event, which - if it occurs - will be handled (from the event loop) using "eventHandlerProc". + // (Returns 0 iff no such trigger can be created (e.g., because of implementation limits on the number of triggers).) + virtual void deleteEventTrigger(EventTriggerId eventTriggerId) = 0; + + virtual void triggerEvent(EventTriggerId eventTriggerId, void* clientData = NULL) = 0; + // Causes the (previously-registered) handler function for the specified event to be handled (from the event loop). + // The handler function is called with "clientData" as parameter. + // Note: This function (unlike other library functions) may be called from an external thread + // - to signal an external event. (However, "triggerEvent()" should not be called with the + // same 'event trigger id' from different threads.) + + // The following two functions are deprecated, and are provided for backwards-compatibility only: + void turnOnBackgroundReadHandling(int socketNum, BackgroundHandlerProc* handlerProc, void* clientData) { + setBackgroundHandling(socketNum, SOCKET_READABLE, handlerProc, clientData); + } + void turnOffBackgroundReadHandling(int socketNum) { disableBackgroundHandling(socketNum); } + + virtual void internalError(); // used to 'handle' a 'should not occur'-type error condition within the library. + +protected: + TaskScheduler(); // abstract base class +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/UsageEnvironment/include/UsageEnvironment_version.hh b/src/big/mpp/middleware/src/live555/UsageEnvironment/include/UsageEnvironment_version.hh new file mode 100644 index 000000000..1b66ac108 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/UsageEnvironment/include/UsageEnvironment_version.hh @@ -0,0 +1,25 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// Version information for the "UsageEnvironment" library +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. + +#ifndef _USAGEENVIRONMENT_VERSION_HH +#define _USAGEENVIRONMENT_VERSION_HH + +#define USAGEENVIRONMENT_LIBRARY_VERSION_STRING "2023.01.19" +#define USAGEENVIRONMENT_LIBRARY_VERSION_INT 1674086400 + +#endif diff --git a/src/big/mpp/middleware/src/live555/UsageEnvironment/include/strDup.hh b/src/big/mpp/middleware/src/live555/UsageEnvironment/include/strDup.hh new file mode 100644 index 000000000..0198a66ed --- /dev/null +++ b/src/big/mpp/middleware/src/live555/UsageEnvironment/include/strDup.hh @@ -0,0 +1,37 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ + +#ifndef _STRDUP_HH +#define _STRDUP_HH + +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A C++ equivalent to the standard C routine "strdup()". +// This generates a char* that can be deleted using "delete[]" +// Header + +#include + +char* strDup(char const* str); +// Note: strDup(NULL) returns NULL + +char* strDupSize(char const* str); +// Like "strDup()", except that it *doesn't* copy the original. +// (Instead, it just allocates a string of the same size as the original.) + +char* strDupSize(char const* str, size_t& resultBufSize); +// An alternative form of "strDupSize()" that also returns the size of the allocated buffer. + +#endif diff --git a/src/big/mpp/middleware/src/live555/UsageEnvironment/strDup.cpp b/src/big/mpp/middleware/src/live555/UsageEnvironment/strDup.cpp new file mode 100644 index 000000000..84e4d8156 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/UsageEnvironment/strDup.cpp @@ -0,0 +1,50 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A C++ equivalent to the standard C routine "strdup()". +// This generates a char* that can be deleted using "delete[]" +// Implementation + +#include "strDup.hh" + +char* strDup(char const* str) { + if (str == NULL) return NULL; + size_t len = strlen(str) + 1; + char* copy = new char[len]; + + if (copy != NULL) { + memcpy(copy, str, len); + } + return copy; +} + +char* strDupSize(char const* str) { + size_t dummy; + + return strDupSize(str, dummy); +} + +char* strDupSize(char const* str, size_t& resultBufSize) { + if (str == NULL) { + resultBufSize = 0; + return NULL; + } + + resultBufSize = strlen(str) + 1; + char* copy = new char[resultBufSize]; + + return copy; +} diff --git a/src/big/mpp/middleware/src/live555/groupsock/GroupEId.cpp b/src/big/mpp/middleware/src/live555/groupsock/GroupEId.cpp new file mode 100644 index 000000000..82fc4e118 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/groupsock/GroupEId.cpp @@ -0,0 +1,54 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// Copyright (c) 1996-2023, Live Networks, Inc. All rights reserved +// "Group Endpoint Id" +// Implementation + +#include "GroupEId.hh" + + +GroupEId::GroupEId(struct sockaddr_storage const& groupAddr, + portNumBits portNum, u_int8_t ttl) { + init(groupAddr, nullAddress(), portNum, ttl); +} + +GroupEId::GroupEId(struct sockaddr_storage const& groupAddr, + struct sockaddr_storage const& sourceFilterAddr, + portNumBits portNum) { + init(groupAddr, sourceFilterAddr, portNum, 255); +} + +GroupEId::GroupEId() { + init(nullAddress(), nullAddress(), 0, 255); +} + +Boolean GroupEId::isSSM() const { + // We're a SSM group if "fSourceFilterAddress" is not a 'null' address: + return !addressIsNull(fSourceFilterAddress); +} + +portNumBits GroupEId::portNum() const { return ::portNum(fGroupAddress); } + +void GroupEId::init(struct sockaddr_storage const& groupAddr, + struct sockaddr_storage const& sourceFilterAddr, + portNumBits portNum, + u_int8_t ttl) { + fGroupAddress = groupAddr; + setPortNum(fGroupAddress, portNum); + fSourceFilterAddress = sourceFilterAddr; + + fTTL = ttl; +} diff --git a/src/big/mpp/middleware/src/live555/groupsock/Groupsock.cpp b/src/big/mpp/middleware/src/live555/groupsock/Groupsock.cpp new file mode 100644 index 000000000..43487b3c8 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/groupsock/Groupsock.cpp @@ -0,0 +1,549 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// 'Group sockets' +// Implementation + +#include "Groupsock.hh" +#include "GroupsockHelper.hh" + +#ifndef NO_SSTREAM +#include +#endif +#include + +///////// OutputSocket ////////// + +OutputSocket::OutputSocket(UsageEnvironment& env, int family) + : Socket(env, 0 /* let kernel choose port */, family), + fSourcePort(0), fLastSentTTL(256/*hack: a deliberately invalid value*/) { +} + +OutputSocket::OutputSocket(UsageEnvironment& env, Port port, int family) + : Socket(env, port, family), + fSourcePort(0), fLastSentTTL(256/*hack: a deliberately invalid value*/) { +} + +OutputSocket::~OutputSocket() { +} + +Boolean OutputSocket::write(struct sockaddr_storage const& addressAndPort, u_int8_t ttl, + unsigned char* buffer, unsigned bufferSize) { + if ((unsigned)ttl == fLastSentTTL) { + // Optimization: Don't do a 'set TTL' system call again + if (!writeSocket(env(), socketNum(), addressAndPort, buffer, bufferSize)) return False; + } else { + if (!writeSocket(env(), socketNum(), addressAndPort, ttl, buffer, bufferSize)) return False; + fLastSentTTL = (unsigned)ttl; + } + + if (sourcePortNum() == 0) { + // Now that we've sent a packet, we can find out what the + // kernel chose as our ephemeral source port number: + if (!getSourcePort(env(), socketNum(), addressAndPort.ss_family, fSourcePort)) { + if (DebugLevel >= 1) + env() << *this + << ": failed to get source port: " + << env().getResultMsg() << "\n"; + return False; + } + } + + return True; +} + +// By default, we don't do reads: +Boolean OutputSocket +::handleRead(unsigned char* /*buffer*/, unsigned /*bufferMaxSize*/, + unsigned& /*bytesRead*/, struct sockaddr_storage& /*fromAddressAndPort*/) { + return True; +} + + +///////// destRecord ////////// + +destRecord +::destRecord(struct sockaddr_storage const& addr, Port const& port, u_int8_t ttl, unsigned sessionId, + destRecord* next) + : fNext(next), fGroupEId(addr, port.num(), ttl), fSessionId(sessionId) { +} + +destRecord::~destRecord() { + delete fNext; +} + + +///////// Groupsock ////////// + +NetInterfaceTrafficStats Groupsock::statsIncoming; +NetInterfaceTrafficStats Groupsock::statsOutgoing; + +// Constructor for a source-independent multicast group +Groupsock::Groupsock(UsageEnvironment& env, struct sockaddr_storage const& groupAddr, + Port port, u_int8_t ttl) + : OutputSocket(env, port, groupAddr.ss_family), + fDests(new destRecord(groupAddr, port, ttl, 0, NULL)), + fIncomingGroupEId(groupAddr, port.num(), ttl) { + if (!socketJoinGroup(env, socketNum(), groupAddr)) { + if (DebugLevel >= 1) { + env << *this << ": failed to join group: " + << env.getResultMsg() << "\n"; + } + } + + // Make sure we can get our source address: + if (!weHaveAnIPAddress(env)) { + if (DebugLevel >= 0) { // this is a fatal error + env << "Unable to determine our source address: " + << env.getResultMsg() << "\n"; + } + } + + if (DebugLevel >= 2) env << *this << ": created\n"; +} + +// Constructor for a source-specific multicast group +Groupsock::Groupsock(UsageEnvironment& env, struct sockaddr_storage const& groupAddr, + struct sockaddr_storage const& sourceFilterAddr, + Port port) + : OutputSocket(env, port, groupAddr.ss_family), + fDests(new destRecord(groupAddr, port, 255, 0, NULL)), + fIncomingGroupEId(groupAddr, sourceFilterAddr, port.num()) { + // First try a SSM join. If that fails, try a regular join: + if (!socketJoinGroupSSM(env, socketNum(), groupAddr, sourceFilterAddr)) { + if (DebugLevel >= 3) { + env << *this << ": SSM join failed: " + << env.getResultMsg(); + env << " - trying regular join instead\n"; + } + if (!socketJoinGroup(env, socketNum(), groupAddr)) { + if (DebugLevel >= 1) { + env << *this << ": failed to join group: " + << env.getResultMsg() << "\n"; + } + } + } + + if (DebugLevel >= 2) env << *this << ": created\n"; +} + +Groupsock::~Groupsock() { + if (isSSM()) { + if (!socketLeaveGroupSSM(env(), socketNum(), groupAddress(), sourceFilterAddress())) { + socketLeaveGroup(env(), socketNum(), groupAddress()); + } + } else { + socketLeaveGroup(env(), socketNum(), groupAddress()); + } + + delete fDests; + + if (DebugLevel >= 2) env() << *this << ": deleting\n"; +} + +destRecord* Groupsock +::createNewDestRecord(struct sockaddr_storage const& addr, Port const& port, u_int8_t ttl, + unsigned sessionId, destRecord* next) { + // Default implementation: + return new destRecord(addr, port, ttl, sessionId, next); +} + +void +Groupsock::changeDestinationParameters(struct sockaddr_storage const& newDestAddr, + Port newDestPort, int newDestTTL, unsigned sessionId) { + destRecord* dest; + for (dest = fDests; dest != NULL && dest->fSessionId != sessionId; dest = dest->fNext) {} + + if (dest == NULL) { // There's no existing 'destRecord' for this "sessionId"; add a new one: + fDests = createNewDestRecord(newDestAddr, newDestPort, newDestTTL, sessionId, fDests); + return; + } + + // "dest" is an existing 'destRecord' for this "sessionId"; change its values to the new ones: + struct sockaddr_storage destAddr = dest->fGroupEId.groupAddress(); + if (!addressIsNull(newDestAddr)) { + // Replace "destAddr" with "newDestAddr" + if (!(newDestAddr == destAddr) && IsMulticastAddress(newDestAddr)) { + // If the new destination is a multicast address, then we assume that + // we want to join it also. (If this is not in fact the case, then + // call "multicastSendOnly()" afterwards.) + socketLeaveGroup(env(), socketNum(), destAddr); + socketJoinGroup(env(), socketNum(), newDestAddr); + } + destAddr = newDestAddr; + } + + portNumBits destPortNum = dest->fGroupEId.portNum(); + if (newDestPort.num() != 0) { + // Replace "destPort" with "newDestPort" + if (newDestPort.num() != destPortNum && IsMulticastAddress(destAddr)) { + // Also bind to the new port number: + changePort(newDestPort); + // And rejoin the multicast group: + socketJoinGroup(env(), socketNum(), destAddr); + } + destPortNum = newDestPort.num(); + } + + u_int8_t destTTL = ttl(); + if (newDestTTL != ~0) { + // Replace "destTTL" with "newDestTTL" + destTTL = (u_int8_t)newDestTTL; + } + + dest->fGroupEId = GroupEId(destAddr, destPortNum, destTTL); + + // Finally, remove any other 'destRecord's that might also have this "sessionId": + removeDestinationFrom(dest->fNext, sessionId); +} + +unsigned Groupsock +::lookupSessionIdFromDestination(struct sockaddr_storage const& destAddrAndPort) const { + destRecord* dest = lookupDestRecordFromDestination(destAddrAndPort); + if (dest == NULL) return 0; + + return dest->fSessionId; +} + +void Groupsock::addDestination(struct sockaddr_storage const& addr, Port const& port, + unsigned sessionId) { + // Default implementation: + // If there's no existing 'destRecord' with the same "addr", "port", and "sessionId", add a new one: + for (destRecord* dest = fDests; dest != NULL; dest = dest->fNext) { + if (dest->fSessionId == sessionId && + dest->fGroupEId.groupAddress() == addr && + dest->fGroupEId.portNum() == port.num()) { + return; + } + } + + fDests = createNewDestRecord(addr, port, 255, sessionId, fDests); +} + +void Groupsock::removeDestination(unsigned sessionId) { + // Default implementation: + removeDestinationFrom(fDests, sessionId); +} + +void Groupsock::removeAllDestinations() { + delete fDests; fDests = NULL; +} + +void Groupsock::multicastSendOnly() { + // We disable this code for now, because - on some systems - leaving the multicast group seems to cause sent packets + // to not be received by other applications (at least, on the same host). +#if 0 + socketLeaveGroup(env(), socketNum(), groupAddress(r); + for (destRecord* dests = fDests; dests != NULL; dests = dests->fNext) { + socketLeaveGroup(env(), socketNum(), dests->fGroupEId.groupAddress(r); + } +#endif +} + +Boolean Groupsock::output(UsageEnvironment& env, unsigned char* buffer, unsigned bufferSize) { + do { + // First, do the datagram send, to each destination: + Boolean writeSuccess = True; + for (destRecord* dests = fDests; dests != NULL; dests = dests->fNext) { + if (!write(dests->fGroupEId.groupAddress(), dests->fGroupEId.ttl(), buffer, bufferSize)) { + writeSuccess = False; + break; + } + } + if (!writeSuccess) break; + statsOutgoing.countPacket(bufferSize); + statsGroupOutgoing.countPacket(bufferSize); + + if (DebugLevel >= 3) { + env << *this << ": wrote " << bufferSize << " bytes, ttl " << (unsigned)ttl() << "\n"; + } + return True; + } while (0); + + if (DebugLevel >= 0) { // this is a fatal error + UsageEnvironment::MsgString msg = strDup(env.getResultMsg()); + env.setResultMsg("Groupsock write failed: ", msg); + delete[] (char*)msg; + } + return False; +} + +Boolean Groupsock::handleRead(unsigned char* buffer, unsigned bufferMaxSize, + unsigned& bytesRead, + struct sockaddr_storage& fromAddressAndPort) { + bytesRead = 0; // initially + + int numBytes = readSocket(env(), socketNum(), + buffer, bufferMaxSize, fromAddressAndPort); + if (numBytes < 0) { + if (DebugLevel >= 0) { // this is a fatal error + UsageEnvironment::MsgString msg = strDup(env().getResultMsg()); + env().setResultMsg("Groupsock read failed: ", msg); + delete[] (char*)msg; + } + return False; + } + + // If we're a SSM group, make sure the source address matches: + if (isSSM() && !(fromAddressAndPort == sourceFilterAddress())) return True; + + // We'll handle this data. + bytesRead = numBytes; + + if (!wasLoopedBackFromUs(env(), fromAddressAndPort)) { + statsIncoming.countPacket(bytesRead); + statsGroupIncoming.countPacket(bytesRead); + } + if (DebugLevel >= 3) { + env() << *this << ": read " << bytesRead << " bytes from " << AddressString(fromAddressAndPort).val() << ", port " << ntohs(portNum(fromAddressAndPort)) << "\n"; + } + + return True; +} + +Boolean Groupsock::wasLoopedBackFromUs(UsageEnvironment& env, + struct sockaddr_storage const& fromAddressAndPort) { + if (fromAddressAndPort.ss_family != AF_INET) return False; // later update for IPv6 + + struct sockaddr_in const& fromAddressAndPort4 = (struct sockaddr_in const&)fromAddressAndPort; + if (fromAddressAndPort4.sin_addr.s_addr == ourIPv4Address(env) || + fromAddressAndPort4.sin_addr.s_addr == 0x7F000001/*127.0.0.1*/) { + if (portNum(fromAddressAndPort) == sourcePortNum()) { +#ifdef DEBUG_LOOPBACK_CHECKING + if (DebugLevel >= 3) { + env() << *this << ": got looped-back packet\n"; + } +#endif + return True; + } + } + + return False; +} + +destRecord* Groupsock +::lookupDestRecordFromDestination(struct sockaddr_storage const& targetAddrAndPort) const { + for (destRecord* dest = fDests; dest != NULL; dest = dest->fNext) { + if (dest->fGroupEId.groupAddress() == targetAddrAndPort && + dest->fGroupEId.portNum() == portNum(targetAddrAndPort)) { + return dest; + } + } + + return NULL; +} + +void Groupsock::removeDestinationFrom(destRecord*& dests, unsigned sessionId) { + destRecord** destsPtr = &dests; + while (*destsPtr != NULL) { + if (sessionId == (*destsPtr)->fSessionId) { + // Remove the record pointed to by *destsPtr : + destRecord* next = (*destsPtr)->fNext; + (*destsPtr)->fNext = NULL; + delete (*destsPtr); + *destsPtr = next; + } else { + destsPtr = &((*destsPtr)->fNext); + } + } +} + +UsageEnvironment& operator<<(UsageEnvironment& s, const Groupsock& g) { + UsageEnvironment& s1 = s << timestampString() << " Groupsock(" + << g.socketNum() << ": " + << AddressString(g.groupAddress()).val() + << ", " << g.port() << ", "; + if (g.isSSM()) { + return s1 << "SSM source: " + << AddressString(g.sourceFilterAddress()).val() << ")"; + } else { + return s1 << (unsigned)(g.ttl()) << ")"; + } +} + + +////////// GroupsockLookupTable ////////// + + +// A hash table used to index Groupsocks by socket number. + +static HashTable*& getSocketTable(UsageEnvironment& env) { + _groupsockPriv* priv = groupsockPriv(env); + if (priv->socketTable == NULL) { // We need to create it + priv->socketTable = HashTable::create(ONE_WORD_HASH_KEYS); + } + return priv->socketTable; +} + +static Boolean unsetGroupsockBySocket(Groupsock const* groupsock) { + do { + if (groupsock == NULL) break; + + int sock = groupsock->socketNum(); + // Make sure "sock" is in bounds: + if (sock < 0) break; + + HashTable*& sockets = getSocketTable(groupsock->env()); + + Groupsock* gs = (Groupsock*)sockets->Lookup((char*)(long)sock); + if (gs == NULL || gs != groupsock) break; + sockets->Remove((char*)(long)sock); + + if (sockets->IsEmpty()) { + // We can also delete the table (to reclaim space): + delete sockets; sockets = NULL; + reclaimGroupsockPriv(gs->env()); + } + + return True; + } while (0); + + return False; +} + +static Boolean setGroupsockBySocket(UsageEnvironment& env, int sock, + Groupsock* groupsock) { + do { + // Make sure the "sock" parameter is in bounds: + if (sock < 0) { + char buf[100]; + sprintf(buf, "trying to use bad socket (%d)", sock); + env.setResultMsg(buf); + break; + } + + HashTable* sockets = getSocketTable(env); + + // Make sure we're not replacing an existing Groupsock (although that shouldn't happen) + Boolean alreadyExists + = (sockets->Lookup((char*)(long)sock) != 0); + if (alreadyExists) { + char buf[100]; + sprintf(buf, "Attempting to replace an existing socket (%d)", sock); + env.setResultMsg(buf); + break; + } + + sockets->Add((char*)(long)sock, groupsock); + return True; + } while (0); + + return False; +} + +static Groupsock* getGroupsockBySocket(UsageEnvironment& env, int sock) { + do { + // Make sure the "sock" parameter is in bounds: + if (sock < 0) break; + + HashTable* sockets = getSocketTable(env); + return (Groupsock*)sockets->Lookup((char*)(long)sock); + } while (0); + + return NULL; +} + +Groupsock* +GroupsockLookupTable::Fetch(UsageEnvironment& env, + struct sockaddr_storage const& groupAddress, + Port port, u_int8_t ttl, + Boolean& isNew) { + isNew = False; + Groupsock* groupsock; + do { + groupsock = (Groupsock*) fTable.Lookup(groupAddress, port); + if (groupsock == NULL) { // we need to create one: + groupsock = AddNew(env, groupAddress, nullAddress(), port, ttl); + if (groupsock == NULL) break; + isNew = True; + } + } while (0); + + return groupsock; +} + +Groupsock* +GroupsockLookupTable::Fetch(UsageEnvironment& env, + struct sockaddr_storage const& groupAddress, + struct sockaddr_storage const& sourceFilterAddr, Port port, + Boolean& isNew) { + isNew = False; + Groupsock* groupsock; + do { + groupsock + = (Groupsock*) fTable.Lookup(groupAddress, sourceFilterAddr, port); + if (groupsock == NULL) { // we need to create one: + groupsock = AddNew(env, groupAddress, sourceFilterAddr, port, 0); + if (groupsock == NULL) break; + isNew = True; + } + } while (0); + + return groupsock; +} + +Groupsock* +GroupsockLookupTable::Lookup(struct sockaddr_storage const& groupAddress, Port port) { + return (Groupsock*) fTable.Lookup(groupAddress, port); +} + +Groupsock* +GroupsockLookupTable::Lookup(struct sockaddr_storage const& groupAddress, + struct sockaddr_storage const& sourceFilterAddr, Port port) { + return (Groupsock*) fTable.Lookup(groupAddress, sourceFilterAddr, port); +} + +Groupsock* GroupsockLookupTable::Lookup(UsageEnvironment& env, int sock) { + return getGroupsockBySocket(env, sock); +} + +Boolean GroupsockLookupTable::Remove(Groupsock const* groupsock) { + unsetGroupsockBySocket(groupsock); + + return fTable.Remove(groupsock->groupAddress(), groupsock->sourceFilterAddress(), groupsock->port()); +} + +Groupsock* GroupsockLookupTable::AddNew(UsageEnvironment& env, + struct sockaddr_storage const& groupAddress, + struct sockaddr_storage const& sourceFilterAddress, + Port port, u_int8_t ttl) { + Groupsock* groupsock; + do { + if (addressIsNull(sourceFilterAddress)) { + // regular, ISM groupsock + groupsock = new Groupsock(env, groupAddress, port, ttl); + } else { + // SSM groupsock + groupsock = new Groupsock(env, groupAddress, sourceFilterAddress, port); + } + + if (groupsock == NULL || groupsock->socketNum() < 0) break; + + if (!setGroupsockBySocket(env, groupsock->socketNum(), groupsock)) break; + + fTable.Add(groupAddress, sourceFilterAddress, port, (void*)groupsock); + } while (0); + + return groupsock; +} + +GroupsockLookupTable::Iterator::Iterator(GroupsockLookupTable& groupsocks) + : fIter(AddressPortLookupTable::Iterator(groupsocks.fTable)) { +} + +Groupsock* GroupsockLookupTable::Iterator::next() { + return (Groupsock*) fIter.next(); +}; diff --git a/src/big/mpp/middleware/src/live555/groupsock/GroupsockHelper.cpp b/src/big/mpp/middleware/src/live555/groupsock/GroupsockHelper.cpp new file mode 100644 index 000000000..743174141 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/groupsock/GroupsockHelper.cpp @@ -0,0 +1,1096 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "groupsock" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Helper routines to implement 'group sockets' +// Implementation + +#include "GroupsockHelper.hh" + +#if (defined(__WIN32__) || defined(_WIN32)) && !defined(__MINGW32__) +#include +extern "C" int initializeWinsockIfNecessary(); +#else +#include +#include +#include +#if !defined(_WIN32) +#include +#ifdef __ANDROID_NDK__ +#include +#define ANDROID_OLD_NDK __NDK_MAJOR__ < 17 +#endif +#endif +#include +#define initializeWinsockIfNecessary() 1 +#endif +#if defined(__WIN32__) || defined(_WIN32) || defined(_QNX4) +#else +#include +#define USE_SIGNALS 1 +#endif +#ifndef NO_GETIFADDRS +#include +#include +#endif +#include + +// By default, use INADDR_ANY for the sending and receiving interfaces (IPv4 only): +ipv4AddressBits SendingInterfaceAddr = INADDR_ANY; +ipv4AddressBits ReceivingInterfaceAddr = INADDR_ANY; +in6_addr ReceivingInterfaceAddr6 = IN6ADDR_ANY_INIT; + +static void socketErr(UsageEnvironment& env, char const* errorMsg) { + env.setResultErrMsg(errorMsg); +} + +NoReuse::NoReuse(UsageEnvironment& env) + : fEnv(env) { + groupsockPriv(fEnv)->reuseFlag = 0; +} + +NoReuse::~NoReuse() { + groupsockPriv(fEnv)->reuseFlag = 1; + reclaimGroupsockPriv(fEnv); +} + + +_groupsockPriv* groupsockPriv(UsageEnvironment& env) { + if (env.groupsockPriv == NULL) { // We need to create it + _groupsockPriv* result = new _groupsockPriv; + result->socketTable = NULL; + result->reuseFlag = 1; // default value => allow reuse of socket numbers + env.groupsockPriv = result; + } + return (_groupsockPriv*)(env.groupsockPriv); +} + +void reclaimGroupsockPriv(UsageEnvironment& env) { + _groupsockPriv* priv = (_groupsockPriv*)(env.groupsockPriv); + if (priv->socketTable == NULL && priv->reuseFlag == 1/*default value*/) { + // We can delete the structure (to save space); it will get created again, if needed: + delete priv; + env.groupsockPriv = NULL; + } +} + +static int createSocket(int domain, int type) { + // Call "socket()" to create a socket of the specified type. + // But also set it to have the 'close on exec' property (if we can) + int sock; + + // In case PF_INET(6) is not defined to be AF_INET(6): + int const domain2 = domain == AF_INET ? PF_INET : domain == AF_INET6 ? PF_INET6 : domain; + +#ifdef SOCK_CLOEXEC + sock = socket(domain2, type|SOCK_CLOEXEC, 0); + if (sock != -1 || errno != EINVAL) return sock; + // An "errno" of EINVAL likely means that the system wasn't happy with the SOCK_CLOEXEC; fall through and try again without it: +#endif + + sock = socket(domain2, type, 0); +#ifdef FD_CLOEXEC + if (sock != -1) fcntl(sock, F_SETFD, FD_CLOEXEC); +#endif + return sock; +} + +int setupDatagramSocket(UsageEnvironment& env, Port port, int domain) { + if (!initializeWinsockIfNecessary()) { + socketErr(env, "Failed to initialize 'winsock': "); + return -1; + } + + int newSocket = createSocket(domain, SOCK_DGRAM); + if (newSocket < 0) { + socketErr(env, "unable to create datagram socket: "); + return newSocket; + } + + int reuseFlag = groupsockPriv(env)->reuseFlag; + reclaimGroupsockPriv(env); + if (setsockopt(newSocket, SOL_SOCKET, SO_REUSEADDR, + (const char*)&reuseFlag, sizeof reuseFlag) < 0) { + socketErr(env, "setsockopt(SO_REUSEADDR) error: "); + closeSocket(newSocket); + return -1; + } + +#if defined(__WIN32__) || defined(_WIN32) + // Windoze doesn't properly handle SO_REUSEPORT or IP_MULTICAST_LOOP +#else +#ifdef SO_REUSEPORT + if (setsockopt(newSocket, SOL_SOCKET, SO_REUSEPORT, + (const char*)&reuseFlag, sizeof reuseFlag) < 0) { + socketErr(env, "setsockopt(SO_REUSEPORT) error: "); + closeSocket(newSocket); + return -1; + } +#endif + +#ifdef IP_MULTICAST_LOOP + const u_int8_t loop = 1; + if (setsockopt(newSocket, + domain == AF_INET ? IPPROTO_IP : IPPROTO_IPV6, + domain == AF_INET ? IP_MULTICAST_LOOP : IPV6_MULTICAST_LOOP, + (const char*)&loop, sizeof loop) < 0) { + if (domain == AF_INET) { // For some unknown reason, this might not work for IPv6 + socketErr(env, "setsockopt(IP_MULTICAST_LOOP) error: "); + closeSocket(newSocket); + return -1; + } + } +#endif +#endif + + if (domain == AF_INET) { + // Note: Windoze requires binding, even if the port number is 0 + ipv4AddressBits addr = INADDR_ANY; +#if defined(__WIN32__) || defined(_WIN32) +#else + if (port.num() != 0 || ReceivingInterfaceAddr != INADDR_ANY) { +#endif + if (port.num() == 0) addr = ReceivingInterfaceAddr; + MAKE_SOCKADDR_IN(name, addr, port.num()); + if (bind(newSocket, (struct sockaddr*)&name, sizeof name) != 0) { + char tmpBuffer[100]; + sprintf(tmpBuffer, "IPv4 bind() error (port number: %d): ", ntohs(port.num())); + socketErr(env, tmpBuffer); + closeSocket(newSocket); + return -1; + } +#if defined(__WIN32__) || defined(_WIN32) +#else + } +#endif + } else { // IPv6 + in6_addr addr = IN6ADDR_ANY_INIT; + if (port.num() != 0) { + // For IPv6 sockets, we need the IPV6_V6ONLY flag set to 1, otherwise we would not + // be able to have an IPv4 socket and an IPv6 socket bound to the same port: + int const one = 1; + (void)setsockopt(newSocket, IPPROTO_IPV6, IPV6_V6ONLY, (const char*)&one, sizeof one); + + MAKE_SOCKADDR_IN6(name, addr, port.num()); + if (bind(newSocket, (struct sockaddr*)&name, sizeof name) != 0) { + char tmpBuffer[100]; + sprintf(tmpBuffer, "IPv6 bind() error (port number: %d): ", ntohs(port.num())); + socketErr(env, tmpBuffer); + closeSocket(newSocket); + return -1; + } + } + } + + // Set the sending interface for multicasts, if it's not the default: + if (SendingInterfaceAddr != INADDR_ANY) { // later, fix for IPv6 + struct in_addr addr; + addr.s_addr = SendingInterfaceAddr; + + if (setsockopt(newSocket, + domain == AF_INET ? IPPROTO_IP : IPPROTO_IPV6, + domain == AF_INET ? IP_MULTICAST_IF : IPV6_MULTICAST_IF, + (const char*)&addr, sizeof addr) < 0) { + socketErr(env, "error setting outgoing multicast interface: "); + closeSocket(newSocket); + return -1; + } + } + + return newSocket; +} + +Boolean makeSocketNonBlocking(int sock) { +#if defined(__WIN32__) || defined(_WIN32) + unsigned long arg = 1; + return ioctlsocket(sock, FIONBIO, &arg) == 0; +#elif defined(VXWORKS) + int arg = 1; + return ioctl(sock, FIONBIO, (int)&arg) == 0; +#else + int curFlags = fcntl(sock, F_GETFL, 0); + return fcntl(sock, F_SETFL, curFlags|O_NONBLOCK) >= 0; +#endif +} + +Boolean makeSocketBlocking(int sock, unsigned writeTimeoutInMilliseconds) { + Boolean result; +#if defined(__WIN32__) || defined(_WIN32) + unsigned long arg = 0; + result = ioctlsocket(sock, FIONBIO, &arg) == 0; +#elif defined(VXWORKS) + int arg = 0; + result = ioctl(sock, FIONBIO, (int)&arg) == 0; +#else + int curFlags = fcntl(sock, F_GETFL, 0); + result = fcntl(sock, F_SETFL, curFlags&(~O_NONBLOCK)) >= 0; +#endif + + if (writeTimeoutInMilliseconds > 0) { +#ifdef SO_SNDTIMEO +#if defined(__WIN32__) || defined(_WIN32) + DWORD msto = (DWORD)writeTimeoutInMilliseconds; + setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char *)&msto, sizeof(msto) ); +#else + struct timeval tv; + tv.tv_sec = writeTimeoutInMilliseconds/1000; + tv.tv_usec = (writeTimeoutInMilliseconds%1000)*1000; + setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, sizeof tv); +#endif +#endif + } + + return result; +} + +Boolean setSocketKeepAlive(int sock) { +#if defined(__WIN32__) || defined(_WIN32) + // How do we do this in Windows? For now, just make this a no-op in Windows: +#else + int const keepalive_enabled = 1; + if (setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (void*)&keepalive_enabled, sizeof keepalive_enabled) < 0) { + return False; + } + +#ifdef TCP_KEEPIDLE + int const keepalive_time = 180; + if (setsockopt(sock, IPPROTO_TCP, TCP_KEEPIDLE, (void*)&keepalive_time, sizeof keepalive_time) < 0) { + return False; + } +#endif + +#ifdef TCP_KEEPCNT + int const keepalive_count = 5; + if (setsockopt(sock, IPPROTO_TCP, TCP_KEEPCNT, (void*)&keepalive_count, sizeof keepalive_count) < 0) { + return False; + } +#endif + +#ifdef TCP_KEEPINTVL + int const keepalive_interval = 20; + if (setsockopt(sock, IPPROTO_TCP, TCP_KEEPINTVL, (void*)&keepalive_interval, sizeof keepalive_interval) < 0) { + return False; + } +#endif +#endif + + return True; +} + +int setupStreamSocket(UsageEnvironment& env, Port port, int domain, + Boolean makeNonBlocking, Boolean setKeepAlive) { + if (!initializeWinsockIfNecessary()) { + socketErr(env, "Failed to initialize 'winsock': "); + return -1; + } + + int newSocket = createSocket(domain, SOCK_STREAM); + if (newSocket < 0) { + socketErr(env, "unable to create stream socket: "); + return newSocket; + } + + int reuseFlag = groupsockPriv(env)->reuseFlag; + reclaimGroupsockPriv(env); + if (setsockopt(newSocket, SOL_SOCKET, SO_REUSEADDR, + (const char*)&reuseFlag, sizeof reuseFlag) < 0) { + socketErr(env, "setsockopt(SO_REUSEADDR) error: "); + closeSocket(newSocket); + return -1; + } + + // SO_REUSEPORT doesn't really make sense for TCP sockets, so we + // normally don't set them. However, if you really want to do this + // #define REUSE_FOR_TCP +#ifdef REUSE_FOR_TCP +#if defined(__WIN32__) || defined(_WIN32) + // Windoze doesn't properly handle SO_REUSEPORT +#else +#ifdef SO_REUSEPORT + if (setsockopt(newSocket, SOL_SOCKET, SO_REUSEPORT, + (const char*)&reuseFlag, sizeof reuseFlag) < 0) { + socketErr(env, "setsockopt(SO_REUSEPORT) error: "); + closeSocket(newSocket); + return -1; + } +#endif +#endif +#endif + + if (domain == AF_INET) { + // Note: Windoze requires binding, even if the port number is 0 +#if defined(__WIN32__) || defined(_WIN32) +#else + if (port.num() != 0 || ReceivingInterfaceAddr != INADDR_ANY) { +#endif + MAKE_SOCKADDR_IN(name, ReceivingInterfaceAddr, port.num()); + if (bind(newSocket, (struct sockaddr*)&name, sizeof name) != 0) { + char tmpBuffer[100]; + sprintf(tmpBuffer, "IPv4 bind() error (port number: %d): ", ntohs(port.num())); + socketErr(env, tmpBuffer); + closeSocket(newSocket); + return -1; + } +#if defined(__WIN32__) || defined(_WIN32) +#else + } +#endif + } else { // IPv6 + if (port.num() != 0) { + // For IPv6 sockets, we need the IPV6_V6ONLY flag set to 1, otherwise we would not + // be able to have an IPv4 socket and an IPv6 socket bound to the same port: + int const one = 1; + (void)setsockopt(newSocket, IPPROTO_IPV6, IPV6_V6ONLY, (const char*)&one, sizeof one); + + MAKE_SOCKADDR_IN6(name, ReceivingInterfaceAddr6, port.num()); + if (bind(newSocket, (struct sockaddr*)&name, sizeof name) != 0) { + char tmpBuffer[100]; + sprintf(tmpBuffer, "IPv6 bind() error (port number: %d): ", ntohs(port.num())); + socketErr(env, tmpBuffer); + closeSocket(newSocket); + return -1; + } + } + } + + if (makeNonBlocking) { + if (!makeSocketNonBlocking(newSocket)) { + socketErr(env, "failed to make non-blocking: "); + closeSocket(newSocket); + return -1; + } + } + + // Set the keep alive mechanism for the TCP socket, to avoid "ghost sockets" + // that remain after an interrupted communication. + if (setKeepAlive) { + if (!setSocketKeepAlive(newSocket)) { + socketErr(env, "failed to set keep alive: "); + closeSocket(newSocket); + return -1; + } + } + + return newSocket; +} + +int readSocket(UsageEnvironment& env, + int socket, unsigned char* buffer, unsigned bufferSize, + struct sockaddr_storage& fromAddress) { + SOCKLEN_T addressSize = sizeof fromAddress; + int bytesRead = recvfrom(socket, (char*)buffer, bufferSize, 0, + (struct sockaddr*)&fromAddress, + (socklen_t *)&addressSize); + if (bytesRead < 0) { + //##### HACK to work around bugs in Linux and Windows: + int err = env.getErrno(); + if (err == 111 /*ECONNREFUSED (Linux)*/ +#if defined(__WIN32__) || defined(_WIN32) + // What a piece of crap Windows is. Sometimes + // recvfrom() returns -1, but with an 'errno' of 0. + // This appears not to be a real error; just treat + // it as if it were a read of zero bytes, and hope + // we don't have to do anything else to 'reset' + // this alleged error: + || err == 0 || err == EWOULDBLOCK +#else + || err == EAGAIN +#endif + || err == 113 /*EHOSTUNREACH (Linux)*/) { // Why does Linux return this for datagram sock? + return 0; + } + //##### END HACK + socketErr(env, "recvfrom() error: "); + } else if (bytesRead == 0) { + // "recvfrom()" on a stream socket can return 0 if the remote end has closed the connection. Treat this as an error: + return -1; + } + + return bytesRead; +} + +Boolean writeSocket(UsageEnvironment& env, + int socket, struct sockaddr_storage const& addressAndPort, + u_int8_t ttlArg, + unsigned char* buffer, unsigned bufferSize) { + // Before sending, set the socket's TTL (IPv4 only): + if (addressAndPort.ss_family == AF_INET) { +#if defined(__WIN32__) || defined(_WIN32) +#define TTL_TYPE int +#else +#define TTL_TYPE u_int8_t +#endif + TTL_TYPE ttl = (TTL_TYPE)ttlArg; + if (setsockopt(socket, IPPROTO_IP, IP_MULTICAST_TTL, + (const char*)&ttl, sizeof ttl) < 0) { + socketErr(env, "setsockopt(IP_MULTICAST_TTL) error: "); + return False; + } + } + + return writeSocket(env, socket, addressAndPort, buffer, bufferSize); +} + +Boolean writeSocket(UsageEnvironment& env, + int socket, struct sockaddr_storage const& addressAndPort, + unsigned char* buffer, unsigned bufferSize) { + do { + SOCKLEN_T dest_len = addressSize(addressAndPort); + int bytesSent = sendto(socket, (char*)buffer, bufferSize, 0, + (struct sockaddr const*)&addressAndPort, dest_len); + if (bytesSent != (int)bufferSize) { + char tmpBuf[100]; + sprintf(tmpBuf, "writeSocket(%d), sendTo() error: wrote %d bytes instead of %u: ", socket, bytesSent, bufferSize); + socketErr(env, tmpBuf); + break; + } + + return True; + } while (0); + + return False; +} + +void ignoreSigPipeOnSocket(int socketNum) { + #ifdef USE_SIGNALS + #ifdef SO_NOSIGPIPE + int set_option = 1; + setsockopt(socketNum, SOL_SOCKET, SO_NOSIGPIPE, &set_option, sizeof set_option); + #else + signal(SIGPIPE, SIG_IGN); + #endif + #endif +} + +static unsigned getBufferSize(UsageEnvironment& env, int bufOptName, + int socket) { + unsigned curSize; + SOCKLEN_T sizeSize = sizeof curSize; + if (getsockopt(socket, SOL_SOCKET, bufOptName, + (char*)&curSize, (socklen_t *)&sizeSize) < 0) { + socketErr(env, "getBufferSize() error: "); + return 0; + } + + return curSize; +} +unsigned getSendBufferSize(UsageEnvironment& env, int socket) { + return getBufferSize(env, SO_SNDBUF, socket); +} +unsigned getReceiveBufferSize(UsageEnvironment& env, int socket) { + return getBufferSize(env, SO_RCVBUF, socket); +} + +static unsigned setBufferTo(UsageEnvironment& env, int bufOptName, + int socket, unsigned requestedSize) { + SOCKLEN_T sizeSize = sizeof requestedSize; + setsockopt(socket, SOL_SOCKET, bufOptName, (char*)&requestedSize, sizeSize); + + // Get and return the actual, resulting buffer size: + return getBufferSize(env, bufOptName, socket); +} +unsigned setSendBufferTo(UsageEnvironment& env, + int socket, unsigned requestedSize) { + return setBufferTo(env, SO_SNDBUF, socket, requestedSize); +} +unsigned setReceiveBufferTo(UsageEnvironment& env, + int socket, unsigned requestedSize) { + return setBufferTo(env, SO_RCVBUF, socket, requestedSize); +} + +static unsigned increaseBufferTo(UsageEnvironment& env, int bufOptName, + int socket, unsigned requestedSize) { + // First, get the current buffer size. If it's already at least + // as big as what we're requesting, do nothing. + unsigned curSize = getBufferSize(env, bufOptName, socket); + + // Next, try to increase the buffer to the requested size, + // or to some smaller size, if that's not possible: + while (requestedSize > curSize) { + SOCKLEN_T sizeSize = sizeof requestedSize; + if (setsockopt(socket, SOL_SOCKET, bufOptName, + (char*)&requestedSize, sizeSize) >= 0) { + // success + return requestedSize; + } + requestedSize = (requestedSize+curSize)/2; + } + + return getBufferSize(env, bufOptName, socket); +} +unsigned increaseSendBufferTo(UsageEnvironment& env, + int socket, unsigned requestedSize) { + return increaseBufferTo(env, SO_SNDBUF, socket, requestedSize); +} +unsigned increaseReceiveBufferTo(UsageEnvironment& env, + int socket, unsigned requestedSize) { + return increaseBufferTo(env, SO_RCVBUF, socket, requestedSize); +} + +static void clearMulticastAllSocketOption(int socket, int domain) { +#ifdef IP_MULTICAST_ALL + // This option is defined in modern versions of Linux to overcome a bug in the Linux kernel's default behavior. + // When set to 0, it ensures that we receive only packets that were sent to the specified IP multicast address, + // even if some other process on the same system has joined a different multicast group with the same port number. + int multicastAll = 0; + (void)setsockopt(socket, + domain == AF_INET ? IPPROTO_IP : IPPROTO_IPV6, + IP_MULTICAST_ALL, // is this the same for IPv6? + (void*)&multicastAll, sizeof multicastAll); + // Ignore the call's result. Should it fail, we'll still receive packets (just perhaps more than intended) +#endif +} + +Boolean socketJoinGroup(UsageEnvironment& env, int socket, + struct sockaddr_storage const& groupAddress){ + if (!IsMulticastAddress(groupAddress)) return True; // ignore this case + + int level, option_name; + void const* option_value; + SOCKLEN_T option_len; + struct ip_mreq imr4; + struct ipv6_mreq imr6; + + switch (groupAddress.ss_family) { + case AF_INET: { + imr4.imr_multiaddr.s_addr = ((struct sockaddr_in&)groupAddress).sin_addr.s_addr; + imr4.imr_interface.s_addr = ReceivingInterfaceAddr; + + level = IPPROTO_IP; + option_name = IP_ADD_MEMBERSHIP; + option_value = &imr4; + option_len = sizeof imr4; + break; + } + case AF_INET6: { + imr6.ipv6mr_multiaddr = ((struct sockaddr_in6&)groupAddress).sin6_addr; + imr6.ipv6mr_interface = 0; // ??? + + level = IPPROTO_IPV6; + option_name = IPV6_JOIN_GROUP; + option_value = &imr6; + option_len = sizeof imr6; + break; + } + default: { + return False; + } + } + if (setsockopt(socket, level, option_name, (const char*)option_value, option_len) < 0) { +#if defined(__WIN32__) || defined(_WIN32) + if (env.getErrno() != 0) { + // That piece-of-shit toy operating system (Windows) sometimes lies + // about setsockopt() failing! +#endif + socketErr(env, "setsockopt(IP_ADD_MEMBERSHIP) error: "); + return False; +#if defined(__WIN32__) || defined(_WIN32) + } +#endif + } + + clearMulticastAllSocketOption(socket, groupAddress.ss_family); + + return True; +} + +Boolean socketLeaveGroup(UsageEnvironment&, int socket, + struct sockaddr_storage const& groupAddress) { + if (!IsMulticastAddress(groupAddress)) return True; // ignore this case + + int level, option_name; + void const* option_value; + SOCKLEN_T option_len; + struct ip_mreq imr4; + struct ipv6_mreq imr6; + + switch (groupAddress.ss_family) { + case AF_INET: { + imr4.imr_multiaddr.s_addr = ((struct sockaddr_in&)groupAddress).sin_addr.s_addr; + imr4.imr_interface.s_addr = ReceivingInterfaceAddr; + + level = IPPROTO_IP; + option_name = IP_DROP_MEMBERSHIP; + option_value = &imr4; + option_len = sizeof imr4; + break; + } + case AF_INET6: { + imr6.ipv6mr_multiaddr = ((struct sockaddr_in6&)groupAddress).sin6_addr; + imr6.ipv6mr_interface = 0; // ??? + + level = IPPROTO_IPV6; + option_name = IPV6_LEAVE_GROUP; + option_value = &imr6; + option_len = sizeof imr6; + break; + } + default: { + return False; + } + } + if (setsockopt(socket, level, option_name, (const char*)option_value, option_len) < 0) { + return False; + } + + return True; +} + +// The source-specific join/leave operations require special setsockopt() +// commands, and a special structure (ip_mreq_source). If the include files +// didn't define these, we do so here: +#if !defined(IP_ADD_SOURCE_MEMBERSHIP) +struct ip_mreq_source { + struct in_addr imr_multiaddr; /* IP multicast address of group */ + struct in_addr imr_sourceaddr; /* IP address of source */ + struct in_addr imr_interface; /* local IP address of interface */ +}; +#endif + +#ifndef IP_ADD_SOURCE_MEMBERSHIP + +#ifdef LINUX +#define IP_ADD_SOURCE_MEMBERSHIP 39 +#define IP_DROP_SOURCE_MEMBERSHIP 40 +#else +#define IP_ADD_SOURCE_MEMBERSHIP 25 +#define IP_DROP_SOURCE_MEMBERSHIP 26 +#endif + +#endif + +Boolean socketJoinGroupSSM(UsageEnvironment& env, int socket, + struct sockaddr_storage const& groupAddress, + struct sockaddr_storage const& sourceFilterAddr) { + if (!IsMulticastAddress(groupAddress)) return True; // ignore this case + if (groupAddress.ss_family != AF_INET) return False; // later, support IPv6 + + struct ip_mreq_source imr; +#if ANDROID_OLD_NDK + imr.imr_multiaddr = ((struct sockaddr_in&)groupAddress).sin_addr.s_addr; + imr.imr_sourceaddr = ((struct sockaddr_in&)sourceFilterAddr).sin_addr.s_addr; + imr.imr_interface = ReceivingInterfaceAddr; +#else + imr.imr_multiaddr.s_addr = ((struct sockaddr_in&)groupAddress).sin_addr.s_addr; + imr.imr_sourceaddr.s_addr = ((struct sockaddr_in&)sourceFilterAddr).sin_addr.s_addr; + imr.imr_interface.s_addr = ReceivingInterfaceAddr; +#endif + if (setsockopt(socket, IPPROTO_IP, IP_ADD_SOURCE_MEMBERSHIP, + (const char*)&imr, sizeof (struct ip_mreq_source)) < 0) { + socketErr(env, "setsockopt(IP_ADD_SOURCE_MEMBERSHIP) error: "); + return False; + } + + clearMulticastAllSocketOption(socket, groupAddress.ss_family); + + return True; +} + +Boolean socketLeaveGroupSSM(UsageEnvironment& /*env*/, int socket, + struct sockaddr_storage const& groupAddress, + struct sockaddr_storage const& sourceFilterAddr) { + if (!IsMulticastAddress(groupAddress)) return True; // ignore this case + if (groupAddress.ss_family != AF_INET) return False; // later, support IPv6 + + struct ip_mreq_source imr; +#if ANDROID_OLD_NDK + imr.imr_multiaddr = ((struct sockaddr_in&)groupAddress).sin_addr.s_addr; + imr.imr_sourceaddr = ((struct sockaddr_in&)sourceFilterAddr).sin_addr.s_addr; + imr.imr_interface = ReceivingInterfaceAddr; +#else + imr.imr_multiaddr.s_addr = ((struct sockaddr_in&)groupAddress).sin_addr.s_addr; + imr.imr_sourceaddr.s_addr = ((struct sockaddr_in&)sourceFilterAddr).sin_addr.s_addr; + imr.imr_interface.s_addr = ReceivingInterfaceAddr; +#endif + if (setsockopt(socket, IPPROTO_IP, IP_DROP_SOURCE_MEMBERSHIP, + (const char*)&imr, sizeof (struct ip_mreq_source)) < 0) { + return False; + } + + return True; +} + +static Boolean getSourcePort0(int socket, portNumBits& resultPortNum/*host order*/) { + sockaddr_storage testAddr; + setPortNum(testAddr, 0); + + SOCKLEN_T len = sizeof testAddr; + if (getsockname(socket, (struct sockaddr*)&testAddr, (socklen_t *)&len) < 0) return False; + + resultPortNum = ntohs(portNum(testAddr)); + return True; +} + +Boolean getSourcePort(UsageEnvironment& env, int socket, int domain, Port& port) { + portNumBits portNum = 0; + if (!getSourcePort0(socket, portNum) || portNum == 0) { + // Hack - call bind(), then try again: + if (domain == AF_INET) { // IPv4 + MAKE_SOCKADDR_IN(name, INADDR_ANY, 0); + bind(socket, (struct sockaddr*)&name, sizeof name); + } else { // IPv6 + MAKE_SOCKADDR_IN6(name,IN6ADDR_ANY_INIT, 0); + bind(socket, (struct sockaddr*)&name, sizeof name); + } + + if (!getSourcePort0(socket, portNum) || portNum == 0) { + socketErr(env, "getsockname() error: "); + return False; + } + } + + port = Port(portNum); + return True; +} + +static Boolean isBadIPv4AddressForUs(ipv4AddressBits addr) { + // Check for some possible erroneous addresses: + ipv4AddressBits nAddr = htonl(addr); + return (nAddr == 0x7F000001 /* 127.0.0.1 */ + || nAddr == 0 + || nAddr == (ipv4AddressBits)(~0)); +} + +static Boolean isBadIPv6AddressForUs(ipv6AddressBits addr) { + // We consider an IPv6 address bad if: + // - the first 10 bits are 0xFE8, indicating a link-local or site-local address, or + // - the first 15 bytes are 0, and the 16th byte is 0 (unspecified) or 1 (loopback) + if (addr[0] == 0xFE) return (addr[1]&0x80) != 0; + + for (unsigned i = 0; i < 15; ++i) { + if (addr[i] != 0) return False; + } + + return addr[15] == 0 || addr[15] == 1; +} + +static Boolean isBadAddressForUs(struct sockaddr const& addr) { + switch (addr.sa_family) { + case AF_INET: { + return isBadIPv4AddressForUs(((sockaddr_in&)addr).sin_addr.s_addr); + } + case AF_INET6: { + return isBadIPv6AddressForUs(((sockaddr_in6&)addr).sin6_addr.s6_addr); + } + default: { + return True; + } + } +} + +static Boolean isBadAddressForUs(NetAddress const& addr) { + if (addr.length() == sizeof (ipv4AddressBits)) { + return isBadIPv4AddressForUs(*(ipv4AddressBits*)(addr.data())); + } else if (addr.length() == sizeof (ipv6AddressBits)) { + return isBadIPv6AddressForUs(*(ipv6AddressBits*)(addr.data())); + } else { + return True; + } +} + +static void getOurIPAddresses(UsageEnvironment& env); // forward + +static ipv4AddressBits _ourIPv4Address = 0; +#define _weHaveAnIPv4Address (_ourIPv4Address != 0) + +ipv4AddressBits ourIPv4Address(UsageEnvironment& env) { + if (ReceivingInterfaceAddr != INADDR_ANY) { + // Hack: If we were told to receive on a specific interface address, then + // define this to be our ip address: + _ourIPv4Address = ReceivingInterfaceAddr; + } + + if (!_weHaveAnIPv4Address) { + getOurIPAddresses(env); + } + + return _ourIPv4Address; +} + +static ipv6AddressBits _ourIPv6Address; +static Boolean _weHaveAnIPv6Address = False; + +ipv6AddressBits const& ourIPv6Address(UsageEnvironment& env) { + if (!_weHaveAnIPv6Address) { + getOurIPAddresses(env); + } + + return _ourIPv6Address; +} + +Boolean weHaveAnIPv4Address(UsageEnvironment& env) { + if (_weHaveAnIPv4Address || _weHaveAnIPv6Address) return _weHaveAnIPv4Address; + + getOurIPAddresses(env); + return _weHaveAnIPv4Address; +} + +Boolean weHaveAnIPv6Address(UsageEnvironment& env) { + if (_weHaveAnIPv4Address || _weHaveAnIPv6Address) return _weHaveAnIPv6Address; + + getOurIPAddresses(env); + return _weHaveAnIPv6Address; +} + +Boolean weHaveAnIPAddress(UsageEnvironment& env) { + if (_weHaveAnIPv4Address || _weHaveAnIPv6Address) return True; + + getOurIPAddresses(env); + return _weHaveAnIPv4Address || _weHaveAnIPv6Address; +} + +static void copyAddress(struct sockaddr_storage& to, struct sockaddr const* from) { + // Copy a "struct sockaddr" to a "struct sockaddr_storage" (assumed to be large enough) + if (from == NULL) return; + + switch (from->sa_family) { + case AF_INET: { +#ifdef HAVE_SOCKADDR_LEN + if (from->sa_len < sizeof (struct sockaddr_in)) return; // sanity check + to.ss_len = sizeof (struct sockaddr_in); +#endif + to.ss_family = AF_INET; + ((sockaddr_in&)to).sin_addr.s_addr = ((sockaddr_in const*)from)->sin_addr.s_addr; + break; + } + case AF_INET6: { +#ifdef HAVE_SOCKADDR_LEN + if (from->sa_len < sizeof (struct sockaddr_in6)) return; // sanity check + to.ss_len = sizeof (struct sockaddr_in6); +#endif + to.ss_family = AF_INET6; + for (unsigned i = 0; i < 16; ++i) { + ((sockaddr_in6&)to).sin6_addr.s6_addr[i] = ((sockaddr_in6 const*)from)->sin6_addr.s6_addr[i]; + } + break; + } + } +} + +void getOurIPAddresses(UsageEnvironment& env) { + // We use two methods to (try to) get our IP addresses. + // First, we use "getifaddrs()". But if that doesn't work + // (or if "getifaddrs()" is not defined), then we use an alternative (more old-fashioned) + // mechanism: First get our host name, then try resolving this host name. + struct sockaddr_storage foundIPv4Address = nullAddress(AF_INET); + struct sockaddr_storage foundIPv6Address = nullAddress(AF_INET6); + + Boolean getifaddrsWorks = False; // until we learn otherwise +#ifndef NO_GETIFADDRS + struct ifaddrs* ifap; + + if (getifaddrs(&ifap) == 0) { + // Look through all interfaces: + for (struct ifaddrs* p = ifap; p != NULL; p = p->ifa_next) { + // Ignore an interface if it's not up, or is a loopback interface: + if ((p->ifa_flags&IFF_UP) == 0 || (p->ifa_flags&IFF_LOOPBACK) != 0) continue; + + // Also ignore the interface if the address is considered 'bad' for us: + if (p->ifa_addr == NULL || isBadAddressForUs(*p->ifa_addr)) continue; + + // We take the first IPv4 and first IPv6 addresses: + if (p->ifa_addr->sa_family == AF_INET && addressIsNull(foundIPv4Address)) { + copyAddress(foundIPv4Address, p->ifa_addr); + getifaddrsWorks = True; + } else if (p->ifa_addr->sa_family == AF_INET6 && addressIsNull(foundIPv6Address)) { + copyAddress(foundIPv6Address, p->ifa_addr); + getifaddrsWorks = True; + } + } + freeifaddrs(ifap); + } +#endif + + if (!getifaddrsWorks) do { + // We couldn't find our address using "getifaddrs()", + // so try instead to look it up directly - by first getting our host name, + // and then resolving this host name + char hostname[100]; + hostname[0] = '\0'; + int result = gethostname(hostname, sizeof hostname); + if (result != 0 || hostname[0] == '\0') { + env.setResultErrMsg("initial gethostname() failed"); + break; + } + + // Try to resolve "hostname" to one or more IP addresses: + NetAddressList addresses(hostname); + NetAddressList::Iterator iter(addresses); + + // Look at each address, rejecting any that are bad. + // We take the first IPv4 and first IPv6 addresses, if any. + NetAddress const* address; + while ((address = iter.nextAddress()) != NULL) { + if (isBadAddressForUs(*address)) continue; + + if (address->length() == sizeof (ipv4AddressBits) && addressIsNull(foundIPv4Address)) { + copyAddress(foundIPv4Address, address); + } else if (address->length() == sizeof (ipv6AddressBits) && addressIsNull(foundIPv6Address)) { + copyAddress(foundIPv6Address, address); + } + } + } while (0); + + // Note the IPv4 and IPv6 addresses that we found: + _ourIPv4Address = ((sockaddr_in&)foundIPv4Address).sin_addr.s_addr; + + for (unsigned i = 0; i < 16; ++i) { + _ourIPv6Address[i] = ((sockaddr_in6&)foundIPv6Address).sin6_addr.s6_addr[i]; + if (_ourIPv6Address[i] != 0) _weHaveAnIPv6Address = True; + } + + if (!_weHaveAnIPv4Address && !_weHaveAnIPv6Address) { + env.setResultMsg("This computer does not have a valid IP (v4 or v6) address!"); + } + + // Use our newly-discovered IP addresses, and the current time, + // to initialize the random number generator's seed: + struct timeval timeNow; + gettimeofday(&timeNow, NULL); + unsigned seed = _ourIPv4Address^timeNow.tv_sec^timeNow.tv_usec; + for (unsigned i = 0; i < 16; i += 4) { + seed ^= (_ourIPv6Address[i]<<24)|(_ourIPv6Address[i+1]<<16)|(_ourIPv6Address[i+2]<<8)|_ourIPv6Address[i+3]; + } + our_srandom(seed); +} + +ipv4AddressBits chooseRandomIPv4SSMAddress(UsageEnvironment& env) { + // First, a hack to ensure that our random number generator is seeded: + (void)ourIPv4Address(env); + + // Choose a random address in the range [232.0.1.0, 232.255.255.255) + // i.e., [0xE8000100, 0xE8FFFFFF) + ipv4AddressBits const first = 0xE8000100, lastPlus1 = 0xE8FFFFFF; + ipv4AddressBits const range = lastPlus1 - first; + + return ntohl(first + ((ipv4AddressBits)our_random())%range); +} + +char const* timestampString() { + struct timeval tvNow; + gettimeofday(&tvNow, NULL); + +#if !defined(_WIN32_WCE) + static char timeString[9]; // holds hh:mm:ss plus trailing '\0' + + time_t tvNow_t = tvNow.tv_sec; + char const* ctimeResult = ctime(&tvNow_t); + if (ctimeResult == NULL) { + sprintf(timeString, "??:??:??"); + } else { + char const* from = &ctimeResult[11]; + int i; + for (i = 0; i < 8; ++i) { + timeString[i] = from[i]; + } + timeString[i] = '\0'; + } +#else + // WinCE apparently doesn't have "ctime()", so instead, construct + // a timestamp string just using the integer and fractional parts + // of "tvNow": + static char timeString[50]; + sprintf(timeString, "%lu.%06ld", tvNow.tv_sec, tvNow.tv_usec); +#endif + + return (char const*)&timeString; +} + +#if (defined(__WIN32__) || defined(_WIN32)) && !defined(__MINGW32__) +// For Windoze, we need to implement our own gettimeofday() + +// used to make sure that static variables in gettimeofday() aren't initialized simultaneously by multiple threads +static LONG initializeLock_gettimeofday = 0; + +#if !defined(_WIN32_WCE) +#include +#endif + +int gettimeofday(struct timeval* tp, int* /*tz*/) { + static LARGE_INTEGER tickFrequency, epochOffset; + + static Boolean isInitialized = False; + + LARGE_INTEGER tickNow; + +#if !defined(_WIN32_WCE) + QueryPerformanceCounter(&tickNow); +#else + tickNow.QuadPart = GetTickCount(); +#endif + + if (!isInitialized) { + if(1 == InterlockedIncrement(&initializeLock_gettimeofday)) { +#if !defined(_WIN32_WCE) + // For our first call, use "ftime()", so that we get a time with a proper epoch. + // For subsequent calls, use "QueryPerformanceCount()", because it's more fine-grain. + struct timeb tb; + ftime(&tb); + tp->tv_sec = tb.time; + tp->tv_usec = 1000*tb.millitm; + + // Also get our counter frequency: + QueryPerformanceFrequency(&tickFrequency); +#else + /* FILETIME of Jan 1 1970 00:00:00. */ + const LONGLONG epoch = 116444736000000000LL; + FILETIME fileTime; + LARGE_INTEGER time; + GetSystemTimeAsFileTime(&fileTime); + + time.HighPart = fileTime.dwHighDateTime; + time.LowPart = fileTime.dwLowDateTime; + + // convert to from 100ns time to unix timestamp in seconds, 1000*1000*10 + tp->tv_sec = (long)((time.QuadPart - epoch) / 10000000L); + + /* + GetSystemTimeAsFileTime has just a seconds resolution, + thats why wince-version of gettimeofday is not 100% accurate, usec accuracy would be calculated like this: + // convert 100 nanoseconds to usec + tp->tv_usec= (long)((time.QuadPart - epoch)%10000000L) / 10L; + */ + tp->tv_usec = 0; + + // resolution of GetTickCounter() is always milliseconds + tickFrequency.QuadPart = 1000; +#endif + // compute an offset to add to subsequent counter times, so we get a proper epoch: + epochOffset.QuadPart + = tp->tv_sec * tickFrequency.QuadPart + (tp->tv_usec * tickFrequency.QuadPart) / 1000000L - tickNow.QuadPart; + + // next caller can use ticks for time calculation + isInitialized = True; + return 0; + } else { + InterlockedDecrement(&initializeLock_gettimeofday); + // wait until first caller has initialized static values + while(!isInitialized){ + Sleep(1); + } + } + } + + // adjust our tick count so that we get a proper epoch: + tickNow.QuadPart += epochOffset.QuadPart; + + tp->tv_sec = (long)(tickNow.QuadPart / tickFrequency.QuadPart); + tp->tv_usec = (long)(((tickNow.QuadPart % tickFrequency.QuadPart) * 1000000L) / tickFrequency.QuadPart); + + return 0; +} +#endif +#undef ANDROID_OLD_NDK diff --git a/src/big/mpp/middleware/src/live555/groupsock/IOHandlers.cpp b/src/big/mpp/middleware/src/live555/groupsock/IOHandlers.cpp new file mode 100644 index 000000000..43eb2ddfc --- /dev/null +++ b/src/big/mpp/middleware/src/live555/groupsock/IOHandlers.cpp @@ -0,0 +1,45 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "groupsock" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// IO event handlers +// Implementation + +#include "IOHandlers.hh" + +//##### TEMP: Use a single buffer. +//##### This assumes that the I/O handlers are non-reentrant +static unsigned const maxPacketLength = 0x10000; // bytes + // This is usually overkill, because UDP packets are usually no larger + // than the typical Ethernet MTU (1500 bytes). However, I've seen + // reports of Windows Media Servers sending UDP packets as large as + // 27 kBytes. These will probably undergo lots of IP-level + // fragmentation, but that occurs below us. We just have to hope that + // fragments don't get lost. +static unsigned const ioBufferSize = maxPacketLength; +static unsigned char ioBuffer[ioBufferSize]; + + +void socketReadHandler(Socket* sock, int /*mask*/) { + unsigned bytesRead; + struct sockaddr_storage dummy; // not used + UsageEnvironment& saveEnv = sock->env(); + // because handleRead(), if it fails, may delete "sock" + + if (!sock->handleRead(ioBuffer, ioBufferSize, bytesRead, dummy)) { + saveEnv.reportBackgroundError(); + } +} diff --git a/src/big/mpp/middleware/src/live555/groupsock/Makefile b/src/big/mpp/middleware/src/live555/groupsock/Makefile new file mode 100644 index 000000000..a69febd34 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/groupsock/Makefile @@ -0,0 +1,49 @@ +include $(MPP_SRC_DIR)/middleware/mpp.mk +include $(MPP_SRC_DIR)/middleware/rt-smart.mk + +CURRECT_DIR_NAME=$(shell basename `pwd`) +LOCAL_SRC_DIR = $(shell pwd) +BIN = lib$(CURRECT_DIR_NAME).a +LIBPATH = $(MPP_LIB_PATH) +LIBS = $(MPP_LIBS) + +CC_CFLAGS_EX=-mcmodel=medany -march=rv64imafdcv -mabi=lp64d -Wall -O0 -g -gdwarf-2 -n --static $(KCFLAGS) + +LIVE555_COMPILE_OPTS = -DSOCKLEN_T=socklen_t -DNO_SSTREAM=1 -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -DNO_OPENSSL=1 + +LOCAL_CFLAGS = -I$(LOCAL_SRC_DIR) -I$(LOCAL_SRC_DIR)/include -I../UsageEnvironment/include + +WERROR_FLAGS = -Wno-register -Wno-multichar -Wno-pessimizing-move -Wno-deprecated-declarations -Wno-unused-result -Wno-unused-variable -Wno-format -Wno-return-type -Wno-sign-compare -Wno-unused-label + +CXX_FLAGS = $(WERROR_FLAGS) \ + $(LIVE555_COMPILE_OPTS) \ + +SRCS = $(wildcard $(LOCAL_SRC_DIR)/*.c) + +OBJS = $(patsubst %.c,%.o,$(SRCS)) + +CPP_SRCS = $(wildcard $(LOCAL_SRC_DIR)/*.cpp) + +CPP_OBJS = $(patsubst %.cpp,%.o,$(CPP_SRCS)) + +all: $(BIN) + @-rm -f *.o + @echo "${PWD}/Makefile all" + +$(OBJS): %.o : %.c + @echo CC $@ + @$(CC) $(CC_CFLAGS_EX) $(LOCAL_CFLAGS) $(BSP_CFLGAS) $(RTSMART_CFLAGS) $(MPP_USER_CFLGAS) -c $< -o $@ + +$(CPP_OBJS): %.o : %.cpp + @echo CXX $@ + @$(CPP) $(CC_CFLAGS_EX) $(CXX_FLAGS) $(LOCAL_CFLAGS) $(BSP_CFLGAS) $(RTSMART_CFLAGS) $(MPP_USER_CFLGAS) -c $< -o $@ + +$(BIN): $(OBJS) $(CPP_OBJS) + @echo LD $@ + $(AR) $(ARFLAGS) $@ $^ + +clean: + echo "${PWD}/Makefile clean" + rm -rf $(BIN) $(OBJS) $(CPP_OBJS) + +.PHONY: all clean diff --git a/src/big/mpp/middleware/src/live555/groupsock/NetAddress.cpp b/src/big/mpp/middleware/src/live555/groupsock/NetAddress.cpp new file mode 100644 index 000000000..5f9bd2f5f --- /dev/null +++ b/src/big/mpp/middleware/src/live555/groupsock/NetAddress.cpp @@ -0,0 +1,523 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "groupsock" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Network Addresses +// Implementation + +#include "NetAddress.hh" +#include "GroupsockHelper.hh" + +#include +#include + +#ifndef INADDR_NONE +#define INADDR_NONE 0xFFFFFFFF +#endif + +////////// NetAddress ////////// + +NetAddress::NetAddress(u_int8_t const* data, unsigned length) { + assign(data, length); +} + +NetAddress::NetAddress(unsigned length) { + fData = new u_int8_t[length]; + if (fData == NULL) { + fLength = 0; + return; + } + + for (unsigned i = 0; i < length; ++i) fData[i] = 0; + fLength = length; +} + +NetAddress::NetAddress(NetAddress const& orig) { + assign(orig.data(), orig.length()); +} + +NetAddress& NetAddress::operator=(NetAddress const& rightSide) { + if (&rightSide != this) { + clean(); + assign(rightSide.data(), rightSide.length()); + } + return *this; +} + +NetAddress::~NetAddress() { + clean(); +} + +void NetAddress::assign(u_int8_t const* data, unsigned length) { + fData = new u_int8_t[length]; + if (fData == NULL) { + fLength = 0; + return; + } + + for (unsigned i = 0; i < length; ++i) fData[i] = data[i]; + fLength = length; +} + +void NetAddress::clean() { + delete[] fData; fData = NULL; + fLength = 0; +} + +static struct sockaddr_storage _nullIPv4Address, _nullIPv6Address; +struct sockaddr_storage const& nullAddress(int addressFamily) { + switch (addressFamily) { + case AF_INET: { + _nullIPv4Address.ss_family = AF_INET; + ((sockaddr_in&)_nullIPv4Address).sin_addr.s_addr = 0; + + return _nullIPv4Address; + } + default: { // assume AF_INET6 + _nullIPv6Address.ss_family = AF_INET6; + for (unsigned i = 0; i < 16; ++i) { + ((sockaddr_in6&)_nullIPv6Address).sin6_addr.s6_addr[i] = 0; + } + + return _nullIPv6Address; + } + } +} + +Boolean addressIsNull(sockaddr_storage const& address) { + switch (address.ss_family) { + case AF_INET: { + return ((sockaddr_in const&)address).sin_addr.s_addr == 0; + } + case AF_INET6: { + for (unsigned i = 0; i < 16; ++i) { + if (((sockaddr_in6 const&)address).sin6_addr.s6_addr[i] != 0) return False; + } + return True; + } + default: { + return False; + } + } +} + +SOCKLEN_T addressSize(sockaddr_storage const& address) { + switch (address.ss_family) { + case AF_INET: { + return sizeof (struct sockaddr_in); + } + case AF_INET6: { + return sizeof (struct sockaddr_in6); + } + default: { + return 0; + } + } +} + +void copyAddress(struct sockaddr_storage& to, NetAddress const* from) { + if (from == NULL) return; + + if (from->length() == sizeof (ipv4AddressBits)) { +#ifdef HAVE_SOCKADDR_LEN + to.ss_len = sizeof (struct sockaddr_in); +#endif + to.ss_family = AF_INET; + ((sockaddr_in&)to).sin_addr.s_addr = *(ipv4AddressBits*)(from->data()); + } else { // IPv6 +#ifdef HAVE_SOCKADDR_LEN + to.ss_len = sizeof (struct sockaddr_in6); +#endif + to.ss_family = AF_INET6; + for (unsigned i = 0; i < 16; ++i) { + ((sockaddr_in6&)to).sin6_addr.s6_addr[i] = (from->data())[i]; + } + ((sockaddr_in6&)to).sin6_scope_id = 0; // instead, somehow look this up from the address? + } +} + +Boolean operator==(struct sockaddr_storage const& left, struct sockaddr_storage const& right) { + if (left.ss_family != right.ss_family) return False; + + switch (left.ss_family) { + case AF_INET: { + return ((struct sockaddr_in const&)left).sin_addr.s_addr == ((struct sockaddr_in const&)right).sin_addr.s_addr; + } + case AF_INET6: { + //return ((struct sockaddr_in6 const&)left).sin6_addr.s6_addr == ((struct sockaddr_in6 const&)right).sin6_addr.s6_addr; + for (unsigned i = 0; i < 16; ++i) + { + if (((struct sockaddr_in6 const&)left).sin6_addr.s6_addr[i] != ((struct sockaddr_in6 const&)right).sin6_addr.s6_addr[i]) + { + return false; + } + } + return true; + } + default: { + return False; + } + } +} + + +////////// NetAddressList ////////// + +NetAddressList::NetAddressList(char const* hostname, int addressFamily) + : fNumAddresses(0), fAddressArray(NULL) { + if (hostname == NULL) return; + + // First, check whether "hostname" is an IP address literal (check IPv4, then IPv6). + // If so, return a 1-element list with this address: + ipv4AddressBits addr4; + if (addressFamily != AF_INET6 && inet_pton(AF_INET, hostname, (u_int8_t*)&addr4) == 1) { + fNumAddresses = 1; + fAddressArray = new NetAddress*[fNumAddresses]; + if (fAddressArray == NULL) return; + + fAddressArray[0] = new NetAddress((u_int8_t*)&addr4, sizeof addr4); + return; + } + + ipv6AddressBits addr6; + if (addressFamily != AF_INET && inet_pton(AF_INET6, hostname, (u_int8_t*)&addr6) == 1) { + fNumAddresses = 1; + fAddressArray = new NetAddress*[fNumAddresses]; + if (fAddressArray == NULL) return; + + fAddressArray[0] = new NetAddress((u_int8_t*)&addr6, sizeof addr6); + return; + } + + // "hostname" is not an IP address string; try resolving it as a real host name instead: +#if defined(USE_GETHOSTBYNAME) || defined(VXWORKS) + struct hostent* host; +#if defined(VXWORKS) + char hostentBuf[512]; + + host = (struct hostent*)resolvGetHostByName((char*)hostname, (char*)&hostentBuf, sizeof hostentBuf); +#else + host = gethostbyname((char*)hostname); +#endif + if (host == NULL || host->h_length != 4 || host->h_addr_list == NULL) return; // no luck + + u_int8_t const** const hAddrPtr = (u_int8_t const**)host->h_addr_list; + // First, count the number of addresses: + u_int8_t const** hAddrPtr1 = hAddrPtr; + while (*hAddrPtr1 != NULL) { + ++fNumAddresses; + ++hAddrPtr1; + } + + // Next, set up the list: + fAddressArray = new NetAddress*[fNumAddresses]; + if (fAddressArray == NULL) return; + + for (unsigned i = 0; i < fNumAddresses; ++i) { + fAddressArray[i] = new NetAddress(hAddrPtr[i], host->h_length); + } +#else + // Use "getaddrinfo()" (rather than the older, deprecated "gethostbyname()"): + struct addrinfo addrinfoHints; + memset(&addrinfoHints, 0, sizeof addrinfoHints); + addrinfoHints.ai_flags = AI_ADDRCONFIG; // We only care about addresses that we can handle + struct addrinfo* addrinfoResultPtr = NULL; + int result = -1; + if (addressFamily != AF_INET6) { + // First, look up an IPv4 address for the name + addrinfoHints.ai_family = AF_INET; // First, look up an IPv4 address for the name + result = getaddrinfo(hostname, NULL, &addrinfoHints, &addrinfoResultPtr); + } + if (addressFamily != AF_INET && (result != 0 || addrinfoResultPtr == NULL)) { + // Try again, looking up an IPv6 address for the name instead: + addrinfoHints.ai_family = AF_INET6; + result = getaddrinfo(hostname, NULL, &addrinfoHints, &addrinfoResultPtr); + } + if (result != 0 || addrinfoResultPtr == NULL) return; // no luck + + // First, count the number of addresses: + const struct addrinfo* p = addrinfoResultPtr; + while (p != NULL) { + if (p->ai_family != AF_INET && p->ai_family != AF_INET6) continue; // unsupported address + if (addressFamily != AF_UNSPEC && p->ai_family != addressFamily) continue; // unwanted + // Sanity check: Also check the address length: + if (p->ai_family == AF_INET && p->ai_addrlen < sizeof (struct sockaddr_in)) continue; + if (p->ai_family == AF_INET6 && p->ai_addrlen < sizeof (struct sockaddr_in6)) continue; + ++fNumAddresses; + p = p->ai_next; + } + + // Next, set up the list: + fAddressArray = new NetAddress*[fNumAddresses]; + if (fAddressArray == NULL) return; + + unsigned i = 0; + p = addrinfoResultPtr; + while (p != NULL) { + // Same sanity checks as before: + if (p->ai_family != AF_INET && p->ai_family != AF_INET6) continue; // unsupported address + if (addressFamily != AF_UNSPEC && p->ai_family != addressFamily) continue; // unwanted + if (p->ai_family == AF_INET && p->ai_addrlen < sizeof (struct sockaddr_in)) continue; + if (p->ai_family == AF_INET6 && p->ai_addrlen < sizeof (struct sockaddr_in6)) continue; + + if (p->ai_family == AF_INET) { // IPv4 + fAddressArray[i++] = new NetAddress((u_int8_t const*)&(((struct sockaddr_in*)p->ai_addr)->sin_addr.s_addr), sizeof (ipv4AddressBits)); + } else { // IPv6 + fAddressArray[i++] = new NetAddress((u_int8_t const*)&(((struct sockaddr_in6*)p->ai_addr)->sin6_addr.s6_addr), sizeof (ipv6AddressBits)); + } + p = p->ai_next; + } + + // Finally, free the data that we had allocated by calling "getaddrinfo()": + freeaddrinfo(addrinfoResultPtr); +#endif +} + +NetAddressList::NetAddressList(NetAddressList const& orig) { + assign(orig.numAddresses(), orig.fAddressArray); +} + +NetAddressList& NetAddressList::operator=(NetAddressList const& rightSide) { + if (&rightSide != this) { + clean(); + assign(rightSide.numAddresses(), rightSide.fAddressArray); + } + return *this; +} + +NetAddressList::~NetAddressList() { + clean(); +} + +void NetAddressList::assign(unsigned numAddresses, NetAddress** addressArray) { + fAddressArray = new NetAddress*[numAddresses]; + if (fAddressArray == NULL) { + fNumAddresses = 0; + return; + } + + for (unsigned i = 0; i < numAddresses; ++i) { + fAddressArray[i] = new NetAddress(*addressArray[i]); + } + fNumAddresses = numAddresses; +} + +void NetAddressList::clean() { + while (fNumAddresses-- > 0) { + delete fAddressArray[fNumAddresses]; + } + delete[] fAddressArray; fAddressArray = NULL; +} + +NetAddress const* NetAddressList::firstAddress() const { + if (fNumAddresses == 0) return NULL; + + return fAddressArray[0]; +} + +////////// NetAddressList::Iterator ////////// +NetAddressList::Iterator::Iterator(NetAddressList const& addressList) + : fAddressList(addressList), fNextIndex(0) {} + +NetAddress const* NetAddressList::Iterator::nextAddress() { + if (fNextIndex >= fAddressList.numAddresses()) return NULL; // no more + return fAddressList.fAddressArray[fNextIndex++]; +} + + +////////// Port ////////// + +Port::Port(portNumBits num /* in host byte order */) { + fPortNum = htons(num); +} + +UsageEnvironment& operator<<(UsageEnvironment& s, const Port& p) { + return s << ntohs(p.num()); +} + + +////////// AddressPortLookupTable ////////// + +#define NUM_RECORDS_IN_KEY_FOR_EACH_ADDRESS (sizeof (struct in6_addr)/sizeof (int)) +#define NUM_RECORDS_IN_KEY_TOTAL (2*NUM_RECORDS_IN_KEY_FOR_EACH_ADDRESS + 1) + +AddressPortLookupTable::AddressPortLookupTable() + : fTable(HashTable::create(NUM_RECORDS_IN_KEY_TOTAL)) { +} + +AddressPortLookupTable::~AddressPortLookupTable() { + delete fTable; +} + +static void setKeyFromAddress(int*& key, struct sockaddr_storage const& address) { + if (address.ss_family == AF_INET) { + // For an IPv4 address, set the upper 3 words of the key to zero, with the address last: + *key++ = 0; + *key++ = 0; + *key++ = 0; + *key++ = ((sockaddr_in const&)address).sin_addr.s_addr; + } else { + // Assume that the address is IPv6; use all 128 bits (4 words) for the key: + struct sockaddr_in6 const& address6 = (struct sockaddr_in6&)address; + u_int8_t const* s6a = address6.sin6_addr.s6_addr; // alias + *key++ = (s6a[0]<<24)|(s6a[1]<<16)|(s6a[2]<<8)|s6a[3]; + *key++ = (s6a[4]<<24)|(s6a[5]<<16)|(s6a[6]<<8)|s6a[7]; + *key++ = (s6a[8]<<24)|(s6a[9]<<16)|(s6a[10]<<8)|s6a[11]; + *key++ = (s6a[12]<<24)|(s6a[13]<<16)|(s6a[14]<<8)|s6a[15]; + } +} + +static void setKey(int* key, + struct sockaddr_storage const& address1, + struct sockaddr_storage const& address2, + Port port) { + setKeyFromAddress(key, address1); + setKeyFromAddress(key, address2); + *key = (int)port.num(); +} + +void* AddressPortLookupTable::Add(struct sockaddr_storage const& address1, + struct sockaddr_storage const& address2, + Port port, void* value) { + int key[NUM_RECORDS_IN_KEY_TOTAL]; + setKey(key, address1, address2, port); + return fTable->Add((char*)key, value); +} + +void* AddressPortLookupTable::Lookup(struct sockaddr_storage const& address1, + struct sockaddr_storage const& address2, + Port port) { + int key[NUM_RECORDS_IN_KEY_TOTAL]; + setKey(key, address1, address2, port); + return fTable->Lookup((char*)key); +} + +Boolean AddressPortLookupTable::Remove(struct sockaddr_storage const& address1, + struct sockaddr_storage const& address2, + Port port) { + int key[NUM_RECORDS_IN_KEY_TOTAL]; + setKey(key, address1, address2, port); + return fTable->Remove((char*)key); +} + +AddressPortLookupTable::Iterator::Iterator(AddressPortLookupTable& table) + : fIter(HashTable::Iterator::create(*(table.fTable))) { +} + +AddressPortLookupTable::Iterator::~Iterator() { + delete fIter; +} + +void* AddressPortLookupTable::Iterator::next() { + char const* key; // dummy + return fIter->next(key); +} + + +////////// IsMulticastAddress() implementation ////////// + +Boolean IsMulticastAddress(struct sockaddr_storage const& address) { + switch (address.ss_family) { + case AF_INET: { + ipv4AddressBits addressInNetworkOrder + = htonl(((sockaddr_in const&)address).sin_addr.s_addr); + // Note: We return False for addresses in the range 224.0.0.0 + // through 224.0.0.255, because these are non-routable + return addressInNetworkOrder > 0xE00000FF && + addressInNetworkOrder <= 0xEFFFFFFF; + } + case AF_INET6: { + // An IPv6 address is multicast if the first byte is 0xFF: + return ((sockaddr_in6 const&)address).sin6_addr.s6_addr[0] == 0xFF; + } + default: { + return False; + } + } +} + + +////////// AddressString implementation ////////// + +AddressString::AddressString(struct sockaddr_in const& addr) { + init(addr.sin_addr.s_addr); +} +AddressString::AddressString(struct in_addr const& addr) { + init(addr.s_addr); +} +AddressString::AddressString(ipv4AddressBits const& addr) { + init(addr); +} + +AddressString::AddressString(struct sockaddr_in6 const& addr) { + init(addr.sin6_addr.s6_addr); +} +AddressString::AddressString(struct in6_addr const& addr) { + init(addr.s6_addr); +} +AddressString::AddressString(ipv6AddressBits const& addr) { + init(addr); +} + +AddressString::AddressString(struct sockaddr_storage const& addr) { + switch (addr.ss_family) { + case AF_INET: { + init(((sockaddr_in&)addr).sin_addr.s_addr); + break; + } + case AF_INET6: { + init(((sockaddr_in6&)addr).sin6_addr.s6_addr); + break; + } + default: { + fVal = new char[200]; // more than enough for this error message + sprintf(fVal, "(unknown address family %d)", addr.ss_family); + break; + } + } +} + +void AddressString::init(ipv4AddressBits const& addr) { + fVal = new char[INET_ADDRSTRLEN]; + inet_ntop(AF_INET, &addr, fVal, INET_ADDRSTRLEN); +} + +void AddressString::init(ipv6AddressBits const& addr) { + fVal = new char[INET6_ADDRSTRLEN]; + inet_ntop(AF_INET6, &addr, fVal, INET6_ADDRSTRLEN); +} + +AddressString::~AddressString() { + delete[] fVal; +} + +portNumBits portNum(struct sockaddr_storage const& address) { + switch (address.ss_family) { + case AF_INET: { + return ((sockaddr_in&)address).sin_port; + } + case AF_INET6: { + return ((sockaddr_in6&)address).sin6_port; + } + default: { + return 0; + } + } +} + +void setPortNum(struct sockaddr_storage& address, portNumBits portNum/*in network order*/) { + ((sockaddr_in&)address).sin_port = portNum; // position will be the same for "sockaddr_in6" +} diff --git a/src/big/mpp/middleware/src/live555/groupsock/NetInterface.cpp b/src/big/mpp/middleware/src/live555/groupsock/NetInterface.cpp new file mode 100644 index 000000000..30bbb65b0 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/groupsock/NetInterface.cpp @@ -0,0 +1,131 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "groupsock" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Network Interfaces +// Implementation + +#include "NetInterface.hh" +#include "GroupsockHelper.hh" + +#ifndef NO_SSTREAM +#include +#endif +#include + +////////// NetInterface ////////// + +UsageEnvironment* NetInterface::DefaultUsageEnvironment = NULL; + +NetInterface::NetInterface() { +} + +NetInterface::~NetInterface() { +} + + +////////// Socket ////////// + +int Socket::DebugLevel = 1; // default value + +Socket::Socket(UsageEnvironment& env, Port port, int family) + : fEnv(DefaultUsageEnvironment != NULL ? *DefaultUsageEnvironment : env), + fPort(port), fFamily(family) { + fSocketNum = setupDatagramSocket(fEnv, port, family); +} + +void Socket::reset() { + if (fSocketNum >= 0) closeSocket(fSocketNum); + fSocketNum = -1; +} + +Socket::~Socket() { + reset(); +} + +Boolean Socket::changePort(Port newPort) { + int oldSocketNum = fSocketNum; + unsigned oldReceiveBufferSize = getReceiveBufferSize(fEnv, fSocketNum); + unsigned oldSendBufferSize = getSendBufferSize(fEnv, fSocketNum); + closeSocket(fSocketNum); + + fSocketNum = setupDatagramSocket(fEnv, newPort, fFamily); + if (fSocketNum < 0) { + fEnv.taskScheduler().turnOffBackgroundReadHandling(oldSocketNum); + return False; + } + + setReceiveBufferTo(fEnv, fSocketNum, oldReceiveBufferSize); + setSendBufferTo(fEnv, fSocketNum, oldSendBufferSize); + if (fSocketNum != oldSocketNum) { // the socket number has changed, so move any event handling for it: + fEnv.taskScheduler().moveSocketHandling(oldSocketNum, fSocketNum); + } + return True; +} + +UsageEnvironment& operator<<(UsageEnvironment& s, const Socket& sock) { + return s << timestampString() << " Socket(" << sock.socketNum() << ")"; +} + +////////// SocketLookupTable ////////// + +SocketLookupTable::SocketLookupTable() + : fTable(HashTable::create(ONE_WORD_HASH_KEYS)) { +} + +SocketLookupTable::~SocketLookupTable() { + delete fTable; +} + +Socket* SocketLookupTable::Fetch(UsageEnvironment& env, Port port, + Boolean& isNew) { + isNew = False; + Socket* sock; + do { + sock = (Socket*) fTable->Lookup((char*)(long)(port.num())); + if (sock == NULL) { // we need to create one: + sock = CreateNew(env, port); + if (sock == NULL || sock->socketNum() < 0) break; + + fTable->Add((char*)(long)(port.num()), (void*)sock); + isNew = True; + } + + return sock; + } while (0); + + delete sock; + return NULL; +} + +Boolean SocketLookupTable::Remove(Socket const* sock) { + return fTable->Remove( (char*)(long)(sock->port().num()) ); +} + +////////// NetInterfaceTrafficStats ////////// + +NetInterfaceTrafficStats::NetInterfaceTrafficStats() { + fTotNumPackets = fTotNumBytes = 0.0; +} + +void NetInterfaceTrafficStats::countPacket(unsigned packetSize) { + fTotNumPackets += 1.0; + fTotNumBytes += packetSize; +} + +Boolean NetInterfaceTrafficStats::haveSeenTraffic() const { + return fTotNumPackets != 0.0; +} diff --git a/src/big/mpp/middleware/src/live555/groupsock/include/GroupEId.hh b/src/big/mpp/middleware/src/live555/groupsock/include/GroupEId.hh new file mode 100644 index 000000000..ced601c7c --- /dev/null +++ b/src/big/mpp/middleware/src/live555/groupsock/include/GroupEId.hh @@ -0,0 +1,64 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "multikit" Multicast Application Shell +// Copyright (c) 1996-2023, Live Networks, Inc. All rights reserved +// "Group Endpoint Id" +// C++ header + +#ifndef _GROUPEID_HH +#define _GROUPEID_HH + +#ifndef _BOOLEAN_HH +#include "Boolean.hh" +#endif + +#ifndef _NET_ADDRESS_HH +#include "NetAddress.hh" +#endif + +class GroupEId { +public: + GroupEId(struct sockaddr_storage const& groupAddr, + portNumBits portNum, u_int8_t ttl); + // used for a 'source-independent multicast' group + GroupEId(struct sockaddr_storage const& groupAddr, + struct sockaddr_storage const& sourceFilterAddr, + portNumBits portNum); + // used for a 'source-specific multicast' group + GroupEId(); // tmp default constructor, until "Groupsock" interface uses "sockaddr_storage" + + struct sockaddr_storage const& groupAddress() const { return fGroupAddress; } + struct sockaddr_storage const& sourceFilterAddress() const { return fSourceFilterAddress; } + + Boolean isSSM() const; + + portNumBits portNum() const; + + u_int8_t ttl() const { return fTTL; } + +private: + void init(struct sockaddr_storage const& groupAddr, + struct sockaddr_storage const& sourceFilterAddr, + portNumBits portNum, + u_int8_t ttl); + +private: + struct sockaddr_storage fGroupAddress; // also includes port number (in network byte order) + struct sockaddr_storage fSourceFilterAddress; + u_int8_t fTTL; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/groupsock/include/Groupsock.hh b/src/big/mpp/middleware/src/live555/groupsock/include/Groupsock.hh new file mode 100644 index 000000000..33c96fbaa --- /dev/null +++ b/src/big/mpp/middleware/src/live555/groupsock/include/Groupsock.hh @@ -0,0 +1,201 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "groupsock" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// 'Group sockets' +// C++ header + +#ifndef _GROUPSOCK_HH +#define _GROUPSOCK_HH + +#ifndef _GROUPSOCK_VERSION_HH +#include "groupsock_version.hh" +#endif + +#ifndef _NET_INTERFACE_HH +#include "NetInterface.hh" +#endif + +#ifndef _GROUPEID_HH +#include "GroupEId.hh" +#endif + +// An "OutputSocket" is (by default) used only to send packets. +// No packets are received on it (unless a subclass arranges this) + +class OutputSocket: public Socket { +public: + OutputSocket(UsageEnvironment& env, int family); + virtual ~OutputSocket(); + + virtual Boolean write(struct sockaddr_storage const& addressAndPort, u_int8_t ttl, + unsigned char* buffer, unsigned bufferSize); + +protected: + OutputSocket(UsageEnvironment& env, Port port, int family); + + portNumBits sourcePortNum() const {return fSourcePort.num();} + +private: // redefined virtual function + virtual Boolean handleRead(unsigned char* buffer, unsigned bufferMaxSize, + unsigned& bytesRead, + struct sockaddr_storage& fromAddressAndPort); + +private: + Port fSourcePort; + unsigned fLastSentTTL; +}; + +class destRecord { +public: + destRecord(struct sockaddr_storage const& addr, Port const& port, u_int8_t ttl, unsigned sessionId, + destRecord* next); + virtual ~destRecord(); + +public: + destRecord* fNext; + GroupEId fGroupEId; + unsigned fSessionId; +}; + +// A "Groupsock" is used to both send and receive packets. +// As the name suggests, it was originally designed to send/receive +// multicast, but it can send/receive unicast as well. + +class Groupsock: public OutputSocket { +public: + Groupsock(UsageEnvironment& env, struct sockaddr_storage const& groupAddr, + Port port, u_int8_t ttl); + // used for a 'source-independent multicast' group + Groupsock(UsageEnvironment& env, struct sockaddr_storage const& groupAddr, + struct sockaddr_storage const& sourceFilterAddr, + Port port); + // used for a 'source-specific multicast' group + + virtual ~Groupsock(); + + virtual destRecord* createNewDestRecord(struct sockaddr_storage const& addr, Port const& port, u_int8_t ttl, unsigned sessionId, destRecord* next); + // Can be redefined by subclasses that also subclass "destRecord" + + void changeDestinationParameters(struct sockaddr_storage const& newDestAddr, + Port newDestPort, int newDestTTL, + unsigned sessionId = 0); + // By default, the destination address, port and ttl for + // outgoing packets are those that were specified in + // the constructor. This works OK for multicast sockets, + // but for unicast we usually want the destination port + // number, at least, to be different from the source port. + // (If a parameter is 0 (or ~0 for ttl), then no change is made to that parameter.) + // (If no existing "destRecord" exists with this "sessionId", then we add a new "destRecord".) + unsigned lookupSessionIdFromDestination(struct sockaddr_storage const& destAddrAndPort) const; + // returns 0 if not found + + // As a special case, we also allow multiple destinations (addresses & ports) + // (This can be used to implement multi-unicast.) + virtual void addDestination(struct sockaddr_storage const& addr, Port const& port, + unsigned sessionId); + virtual void removeDestination(unsigned sessionId); + void removeAllDestinations(); + Boolean hasMultipleDestinations() const { return fDests != NULL && fDests->fNext != NULL; } + + struct sockaddr_storage const& groupAddress() const { + return fIncomingGroupEId.groupAddress(); + } + struct sockaddr_storage const& sourceFilterAddress() const { + return fIncomingGroupEId.sourceFilterAddress(); + } + + Boolean isSSM() const { + return fIncomingGroupEId.isSSM(); + } + + u_int8_t ttl() const { return fIncomingGroupEId.ttl(); } + + void multicastSendOnly(); // send, but don't receive any multicast packets + + virtual Boolean output(UsageEnvironment& env, unsigned char* buffer, unsigned bufferSize); + + static NetInterfaceTrafficStats statsIncoming; + static NetInterfaceTrafficStats statsOutgoing; + NetInterfaceTrafficStats statsGroupIncoming; // *not* static + NetInterfaceTrafficStats statsGroupOutgoing; // *not* static + + Boolean wasLoopedBackFromUs(UsageEnvironment& env, + struct sockaddr_storage const& fromAddressAndPort); + +public: // redefined virtual functions + virtual Boolean handleRead(unsigned char* buffer, unsigned bufferMaxSize, + unsigned& bytesRead, + struct sockaddr_storage& fromAddressAndPort); + +protected: + destRecord* lookupDestRecordFromDestination(struct sockaddr_storage const& targetAddrAndPort) const; + +private: + void removeDestinationFrom(destRecord*& dests, unsigned sessionId); + // used to implement (the public) "removeDestination()", and "changeDestinationParameters()" +protected: + destRecord* fDests; +private: + GroupEId fIncomingGroupEId; +}; + +UsageEnvironment& operator<<(UsageEnvironment& s, const Groupsock& g); + +// A data structure for looking up a 'groupsock' +// by (multicast address, port), or by socket number +class GroupsockLookupTable { +public: + Groupsock* Fetch(UsageEnvironment& env, struct sockaddr_storage const& groupAddress, + Port port, u_int8_t ttl, Boolean& isNew); + // Creates a new Groupsock if none already exists + Groupsock* Fetch(UsageEnvironment& env, struct sockaddr_storage const& groupAddress, + struct sockaddr_storage const& sourceFilterAddr, + Port port, Boolean& isNew); + // Creates a new Groupsock if none already exists + Groupsock* Lookup(struct sockaddr_storage const& groupAddress, Port port); + // Returns NULL if none already exists + Groupsock* Lookup(struct sockaddr_storage const& groupAddress, + struct sockaddr_storage const& sourceFilterAddr, + Port port); + // Returns NULL if none already exists + Groupsock* Lookup(UsageEnvironment& env, int sock); + // Returns NULL if none already exists + Boolean Remove(Groupsock const* groupsock); + + // Used to iterate through the groupsocks in the table + class Iterator { + public: + Iterator(GroupsockLookupTable& groupsocks); + + Groupsock* next(); // NULL iff none + + private: + AddressPortLookupTable::Iterator fIter; + }; + +private: + Groupsock* AddNew(UsageEnvironment& env, + struct sockaddr_storage const& groupAddress, + struct sockaddr_storage const& sourceFilterAddress, + Port port, u_int8_t ttl); + +private: + friend class Iterator; + AddressPortLookupTable fTable; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/groupsock/include/GroupsockHelper.hh b/src/big/mpp/middleware/src/live555/groupsock/include/GroupsockHelper.hh new file mode 100644 index 000000000..26f91fff5 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/groupsock/include/GroupsockHelper.hh @@ -0,0 +1,162 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "groupsock" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Helper routines to implement 'group sockets' +// C++ header + +#ifndef _GROUPSOCK_HELPER_HH +#define _GROUPSOCK_HELPER_HH + +#ifndef _NET_ADDRESS_HH +#include "NetAddress.hh" +#endif + +int setupDatagramSocket(UsageEnvironment& env, Port port, int domain); +int setupStreamSocket(UsageEnvironment& env, Port port, int domain, + Boolean makeNonBlocking = True, Boolean setKeepAlive = False); + +int readSocket(UsageEnvironment& env, + int socket, unsigned char* buffer, unsigned bufferSize, + struct sockaddr_storage& fromAddress /*set only if we're a datagram socket*/); + +Boolean writeSocket(UsageEnvironment& env, + int socket, struct sockaddr_storage const& addressAndPort, + u_int8_t ttlArg, + unsigned char* buffer, unsigned bufferSize); + +Boolean writeSocket(UsageEnvironment& env, + int socket, struct sockaddr_storage const& addressAndPort, + unsigned char* buffer, unsigned bufferSize); + // An optimized version of "writeSocket" that omits the "setsockopt()" call to set the TTL. + +void ignoreSigPipeOnSocket(int socketNum); + +unsigned getSendBufferSize(UsageEnvironment& env, int socket); +unsigned getReceiveBufferSize(UsageEnvironment& env, int socket); +unsigned setSendBufferTo(UsageEnvironment& env, + int socket, unsigned requestedSize); +unsigned setReceiveBufferTo(UsageEnvironment& env, + int socket, unsigned requestedSize); +unsigned increaseSendBufferTo(UsageEnvironment& env, + int socket, unsigned requestedSize); +unsigned increaseReceiveBufferTo(UsageEnvironment& env, + int socket, unsigned requestedSize); + +Boolean makeSocketNonBlocking(int sock); +Boolean makeSocketBlocking(int sock, unsigned writeTimeoutInMilliseconds = 0); + // A "writeTimeoutInMilliseconds" value of 0 means: Don't timeout +Boolean setSocketKeepAlive(int sock); + +Boolean socketJoinGroup(UsageEnvironment& env, int socket, + struct sockaddr_storage const& groupAddress); +Boolean socketLeaveGroup(UsageEnvironment&, int socket, + struct sockaddr_storage const& groupAddress); + +// source-specific multicast join/leave +Boolean socketJoinGroupSSM(UsageEnvironment& env, int socket, + struct sockaddr_storage const& groupAddress, + struct sockaddr_storage const& sourceFilterAddr); +Boolean socketLeaveGroupSSM(UsageEnvironment&, int socket, + struct sockaddr_storage const& groupAddress, + struct sockaddr_storage const& sourceFilterAddr); + +Boolean getSourcePort(UsageEnvironment& env, int socket, int domain, Port& port); + +ipv4AddressBits ourIPv4Address(UsageEnvironment& env); // in network order +ipv6AddressBits const& ourIPv6Address(UsageEnvironment& env); + +Boolean weHaveAnIPv4Address(UsageEnvironment& env); +Boolean weHaveAnIPv6Address(UsageEnvironment& env); +Boolean weHaveAnIPAddress(UsageEnvironment& env); + // returns True if we have either an IPv4 or an IPv6 address + +// IPv4 addresses of our sending and receiving interfaces. (By default, these +// are INADDR_ANY (i.e., 0), specifying the default interface.) +extern ipv4AddressBits SendingInterfaceAddr; +extern ipv4AddressBits ReceivingInterfaceAddr; +extern in6_addr ReceivingInterfaceAddr6; + +// Allocates a randomly-chosen IPv4 SSM (multicast) address: +ipv4AddressBits chooseRandomIPv4SSMAddress(UsageEnvironment& env); + +// Returns a simple "hh:mm:ss" string, for use in debugging output (e.g.) +char const* timestampString(); + + +#ifdef HAVE_SOCKADDR_LEN +#define SET_SOCKADDR_SIN_LEN(var) var.sin_len = sizeof var +#define SET_SOCKADDR_SIN6_LEN(var) var.sin6_len = sizeof var +#else +#define SET_SOCKADDR_SIN_LEN(var) +#define SET_SOCKADDR_SIN6_LEN(var) +#endif + +#define MAKE_SOCKADDR_IN(var,adr,prt) /*adr,prt must be in network order*/\ + struct sockaddr_in var;\ + var.sin_family = AF_INET;\ + var.sin_addr.s_addr = (adr);\ + var.sin_port = (prt);\ + SET_SOCKADDR_SIN_LEN(var); +#define MAKE_SOCKADDR_IN6(var,adr,prt) /*adr,prt must be in network order*/\ + struct sockaddr_in6 var;\ + memset(&var, 0, sizeof var);\ + var.sin6_family = AF_INET6;\ + var.sin6_addr=adr;\ + var.sin6_port = (prt);\ + SET_SOCKADDR_SIN6_LEN(var); + + +// By default, we create sockets with the SO_REUSE_* flag set. +// If, instead, you want to create sockets without the SO_REUSE_* flags, +// Then enclose the creation code with: +// { +// NoReuse dummy; +// ... +// } +class NoReuse { +public: + NoReuse(UsageEnvironment& env); + ~NoReuse(); + +private: + UsageEnvironment& fEnv; +}; + + +// Define the "UsageEnvironment"-specific "groupsockPriv" structure: + +struct _groupsockPriv { // There should be only one of these allocated + HashTable* socketTable; + int reuseFlag; +}; +_groupsockPriv* groupsockPriv(UsageEnvironment& env); // allocates it if necessary +void reclaimGroupsockPriv(UsageEnvironment& env); + + +#if (defined(__WIN32__) || defined(_WIN32)) && !defined(__MINGW32__) +// For Windoze, we need to implement our own gettimeofday() +extern int gettimeofday(struct timeval*, int*); +#else +#include +#endif + +// The following are implemented in inet.c: +extern "C" void our_srandom(int x); +extern "C" long our_random(); +extern "C" u_int32_t our_random32(); // because "our_random()" returns a 31-bit number + +#endif diff --git a/src/big/mpp/middleware/src/live555/groupsock/include/IOHandlers.hh b/src/big/mpp/middleware/src/live555/groupsock/include/IOHandlers.hh new file mode 100644 index 000000000..e44c58f9f --- /dev/null +++ b/src/big/mpp/middleware/src/live555/groupsock/include/IOHandlers.hh @@ -0,0 +1,31 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "groupsock" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// IO event handlers +// C++ header + +#ifndef _IO_HANDLERS_HH +#define _IO_HANDLERS_HH + +#ifndef _NET_INTERFACE_HH +#include "NetInterface.hh" +#endif + +// Handles incoming data on sockets: +void socketReadHandler(Socket* sock, int mask); + +#endif diff --git a/src/big/mpp/middleware/src/live555/groupsock/include/NetAddress.hh b/src/big/mpp/middleware/src/live555/groupsock/include/NetAddress.hh new file mode 100644 index 000000000..6c6e595ab --- /dev/null +++ b/src/big/mpp/middleware/src/live555/groupsock/include/NetAddress.hh @@ -0,0 +1,209 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "groupsock" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Network Addresses +// C++ header + +#ifndef _NET_ADDRESS_HH +#define _NET_ADDRESS_HH + +#ifndef _HASH_TABLE_HH +#include "HashTable.hh" +#endif + +#ifndef _NET_COMMON_H +#include "NetCommon.h" +#endif + +#ifndef _USAGE_ENVIRONMENT_HH +#include "UsageEnvironment.hh" +#endif + +// Definition of a type representing a low-level network address. + // Note that the type "netAddressBits" is no longer defined; use "ipv4AddressBits" instead. +typedef u_int32_t ipv4AddressBits; +typedef u_int8_t ipv6AddressBits[16]; // 128 bits + +class NetAddress { +public: + NetAddress(u_int8_t const* data, + unsigned length = 4 /* default: 32 bits (for IPv4); use 16 (128 bits) for IPv6 */); + NetAddress(unsigned length = 4); // sets address data to all-zeros + NetAddress(NetAddress const& orig); + NetAddress& operator=(NetAddress const& rightSide); + virtual ~NetAddress(); + + unsigned length() const { return fLength; } + u_int8_t const* data() const // always in network byte order + { return fData; } + +private: + void assign(u_int8_t const* data, unsigned length); + void clean(); + + unsigned fLength; + u_int8_t* fData; +}; + +struct sockaddr_storage const& nullAddress(int addressFamily = AF_INET); +Boolean addressIsNull(sockaddr_storage const& address); + +SOCKLEN_T addressSize(sockaddr_storage const& address); + +void copyAddress(struct sockaddr_storage& to, NetAddress const* from); + +Boolean operator==(struct sockaddr_storage const& left, struct sockaddr_storage const& right); + // compares the family and address parts only; not the port number or anything else + +class NetAddressList { +public: + NetAddressList(char const* hostname, int addressFamily = AF_UNSPEC); + NetAddressList(NetAddressList const& orig); + NetAddressList& operator=(NetAddressList const& rightSide); + virtual ~NetAddressList(); + + unsigned numAddresses() const { return fNumAddresses; } + + NetAddress const* firstAddress() const; + + // Used to iterate through the addresses in a list: + class Iterator { + public: + Iterator(NetAddressList const& addressList); + NetAddress const* nextAddress(); // NULL iff none + private: + NetAddressList const& fAddressList; + unsigned fNextIndex; + }; + +private: + void assign(unsigned numAddresses, NetAddress** addressArray); + void clean(); + + friend class Iterator; + unsigned fNumAddresses; + NetAddress** fAddressArray; +}; + +typedef u_int16_t portNumBits; + +class Port { +public: + Port(portNumBits num /* in host byte order */); + + portNumBits num() const { return fPortNum; } // in network byte order + +private: + portNumBits fPortNum; // stored in network byte order +#ifdef IRIX + portNumBits filler; // hack to overcome a bug in IRIX C++ compiler +#endif +}; + +UsageEnvironment& operator<<(UsageEnvironment& s, const Port& p); + + +// A generic table for looking up objects by (address1, address2, port) +class AddressPortLookupTable { +public: + AddressPortLookupTable(); + virtual ~AddressPortLookupTable(); + + void* Add(struct sockaddr_storage const& address1, + struct sockaddr_storage const& address2, + Port port, + void* value); + // Returns the old value if different, otherwise 0 + void* Add(struct sockaddr_storage const& address1, + Port port, + void* value) { + return Add(address1, nullAddress(), port, value); + } + + Boolean Remove(struct sockaddr_storage const& address1, + struct sockaddr_storage const& address2, + Port port); + Boolean Remove(struct sockaddr_storage const& address1, + Port port) { + return Remove(address1, nullAddress(), port); + } + + void* Lookup(struct sockaddr_storage const& address1, + struct sockaddr_storage const& address2, + Port port); + // Returns 0 if not found + void* Lookup(struct sockaddr_storage const& address1, + Port port) { + return Lookup(address1, nullAddress(), port); + } + + void* RemoveNext() { return fTable->RemoveNext(); } + + // Used to iterate through the entries in the table + class Iterator { + public: + Iterator(AddressPortLookupTable& table); + virtual ~Iterator(); + + void* next(); // NULL iff none + + private: + HashTable::Iterator* fIter; + }; + +private: + friend class Iterator; + HashTable* fTable; +}; + + +Boolean IsMulticastAddress(struct sockaddr_storage const& address); + + +// A mechanism for displaying an IP (v4 or v6) address in ASCII. +// (This encapsulates the "inet_ntop()" function.) +class AddressString { +public: + // IPv4 input: + AddressString(struct sockaddr_in const& addr); + AddressString(struct in_addr const& addr); + AddressString(ipv4AddressBits const& addr); // "addr" is assumed to be in network byte order + + // IPv6 input: + AddressString(struct sockaddr_in6 const& addr); + AddressString(struct in6_addr const& addr); + AddressString(ipv6AddressBits const& addr); + + // IPv4 or IPv6 input: + AddressString(struct sockaddr_storage const& addr); + + virtual ~AddressString(); + + char const* val() const { return fVal; } + +private: + void init(ipv4AddressBits const& addr); // used to implement the IPv4 constructors + void init(ipv6AddressBits const& addr); // used to implement the IPv6 constructors + +private: + char* fVal; // The result ASCII string: allocated by the constructor; deleted by the destructor +}; + +portNumBits portNum(struct sockaddr_storage const& address); +void setPortNum(struct sockaddr_storage& address, portNumBits portNum/*in network order*/); + +#endif diff --git a/src/big/mpp/middleware/src/live555/groupsock/include/NetCommon.h b/src/big/mpp/middleware/src/live555/groupsock/include/NetCommon.h new file mode 100644 index 000000000..c7f94e33e --- /dev/null +++ b/src/big/mpp/middleware/src/live555/groupsock/include/NetCommon.h @@ -0,0 +1,126 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +/* "groupsock" interface + * Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. + * Common include files, typically used for networking + */ + +#ifndef _NET_COMMON_H +#define _NET_COMMON_H + +#if defined(__WIN32__) || defined(_WIN32) || defined(_WIN32_WCE) +/* Windows */ +#if defined(WINNT) || defined(_WINNT) || defined(__BORLANDC__) || defined(__MINGW32__) || defined(_WIN32_WCE) || defined (_MSC_VER) +#define _MSWSOCK_ +#include +#include +#endif +#include +#include +#include + +#define closeSocket closesocket +#ifdef EWOULDBLOCK +#undef EWOULDBLOCK +#endif +#ifdef EINPROGRESS +#undef EINPROGRESS +#endif +#ifdef EAGAIN +#undef EAGAIN +#endif +#ifdef EINTR +#undef EINTR +#endif +#define EWOULDBLOCK WSAEWOULDBLOCK +#define EINPROGRESS WSAEWOULDBLOCK +#define EAGAIN WSAEWOULDBLOCK +#define EINTR WSAEINTR + +#if defined(_WIN32_WCE) +#define NO_STRSTREAM 1 +#endif + +/* Definitions of size-specific types: */ +typedef __int64 int64_t; +typedef unsigned __int64 u_int64_t; + +typedef int int32_t; +typedef unsigned u_int32_t; + +typedef short int16_t; +typedef unsigned short u_int16_t; + +typedef unsigned char u_int8_t; + +// For "uintptr_t" and "intptr_t", we assume that if they're not already defined, then this must be +// an old, 32-bit version of Windows: +#if !defined(_MSC_STDINT_H_) && !defined(_UINTPTR_T_DEFINED) && !defined(_UINTPTR_T_DECLARED) && !defined(_UINTPTR_T) +typedef unsigned uintptr_t; +#endif +#if !defined(_MSC_STDINT_H_) && !defined(_INTPTR_T_DEFINED) && !defined(_INTPTR_T_DECLARED) && !defined(_INTPTR_T) +typedef int intptr_t; +#endif + +#elif defined(VXWORKS) +/* VxWorks */ +#include +#include +#include +#include +#include +#include +#include + +typedef unsigned int u_int32_t; +typedef unsigned short u_int16_t; +typedef unsigned char u_int8_t; + +#else +/* Unix */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if defined(_QNX4) +#include +#include +#endif + +#define closeSocket close + +#ifdef SOLARIS +#define u_int64_t uint64_t +#define u_int32_t uint32_t +#define u_int16_t uint16_t +#define u_int8_t uint8_t +#endif +#endif + +#ifndef SOCKLEN_T +#define SOCKLEN_T int +#endif + +#endif diff --git a/src/big/mpp/middleware/src/live555/groupsock/include/NetInterface.hh b/src/big/mpp/middleware/src/live555/groupsock/include/NetInterface.hh new file mode 100644 index 000000000..2eeddc1f0 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/groupsock/include/NetInterface.hh @@ -0,0 +1,109 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "groupsock" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Network Interfaces +// C++ header + +#ifndef _NET_INTERFACE_HH +#define _NET_INTERFACE_HH + +#ifndef _NET_ADDRESS_HH +#include "NetAddress.hh" +#endif + +class NetInterface { +public: + virtual ~NetInterface(); + + static UsageEnvironment* DefaultUsageEnvironment; + // if non-NULL, used for each new interface + +protected: + NetInterface(); // virtual base class +}; + +class Socket: public NetInterface { +public: + virtual ~Socket(); + void reset(); // closes the socket, and sets "fSocketNum" to -1 + + virtual Boolean handleRead(unsigned char* buffer, unsigned bufferMaxSize, + unsigned& bytesRead, + struct sockaddr_storage& fromAddress) = 0; + // Returns False on error; resultData == NULL if data ignored + + int socketNum() const { return fSocketNum; } + + Port port() const { + return fPort; + } + + UsageEnvironment& env() const { return fEnv; } + + static int DebugLevel; + +protected: + Socket(UsageEnvironment& env, Port port, int family); // virtual base class + + Boolean changePort(Port newPort); // will also cause socketNum() to change + +private: + int fSocketNum; + UsageEnvironment& fEnv; + Port fPort; + int fFamily; +}; + +UsageEnvironment& operator<<(UsageEnvironment& s, const Socket& sock); + +// A data structure for looking up a Socket by port: + +class SocketLookupTable { +public: + virtual ~SocketLookupTable(); + + Socket* Fetch(UsageEnvironment& env, Port port, Boolean& isNew); + // Creates a new Socket if none already exists + Boolean Remove(Socket const* sock); + +protected: + SocketLookupTable(); // abstract base class + virtual Socket* CreateNew(UsageEnvironment& env, Port port) = 0; + +private: + HashTable* fTable; +}; + +// A data structure for counting traffic: + +class NetInterfaceTrafficStats { +public: + NetInterfaceTrafficStats(); + + void countPacket(unsigned packetSize); + + float totNumPackets() const {return fTotNumPackets;} + float totNumBytes() const {return fTotNumBytes;} + + Boolean haveSeenTraffic() const; + +private: + float fTotNumPackets; + float fTotNumBytes; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/groupsock/include/groupsock_version.hh b/src/big/mpp/middleware/src/live555/groupsock/include/groupsock_version.hh new file mode 100644 index 000000000..ce4739946 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/groupsock/include/groupsock_version.hh @@ -0,0 +1,25 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// Version information for the "groupsock" library +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. + +#ifndef _GROUPSOCK_VERSION_HH +#define _GROUPSOCK_VERSION_HH + +#define GROUPSOCK_LIBRARY_VERSION_STRING "2023.01.19" +#define GROUPSOCK_LIBRARY_VERSION_INT 1674086400 + +#endif diff --git a/src/big/mpp/middleware/src/live555/groupsock/inet.c b/src/big/mpp/middleware/src/live555/groupsock/inet.c new file mode 100644 index 000000000..c09c27f92 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/groupsock/inet.c @@ -0,0 +1,441 @@ +#ifndef _NET_COMMON_H +#include "NetCommon.h" +#endif + +#include + +#ifdef VXWORKS +#include +#endif + +#if defined(__WIN32__) || defined(_WIN32) +#ifndef IMN_PIM +#define WS_VERSION_CHOICE1 0x202/*MAKEWORD(2,2)*/ +#define WS_VERSION_CHOICE2 0x101/*MAKEWORD(1,1)*/ +int initializeWinsockIfNecessary(void) { + /* We need to call an initialization routine before + * we can do anything with winsock. (How fucking lame!): + */ + static int _haveInitializedWinsock = 0; + WSADATA wsadata; + + if (!_haveInitializedWinsock) { + if ((WSAStartup(WS_VERSION_CHOICE1, &wsadata) != 0) + && ((WSAStartup(WS_VERSION_CHOICE2, &wsadata)) != 0)) { + return 0; /* error in initialization */ + } + if ((wsadata.wVersion != WS_VERSION_CHOICE1) + && (wsadata.wVersion != WS_VERSION_CHOICE2)) { + WSACleanup(); + return 0; /* desired Winsock version was not available */ + } + _haveInitializedWinsock = 1; + } + + return 1; +} +#else +int initializeWinsockIfNecessary(void) { return 1; } +#endif +#else +#define initializeWinsockIfNecessary() 1 +#endif + +#ifndef NULL +#define NULL 0 +#endif + +#ifdef USE_SYSTEM_RANDOM +/* Use the system-supplied "random()" and "srandom()" functions */ +#include +long our_random() { +#if defined(__WIN32__) || defined(_WIN32) + return rand(); +#else + return random(); +#endif +} +void our_srandom(unsigned int x) { +#if defined(__WIN32__) || defined(_WIN32) + srand(x); +#else + srandom(x); +#endif +} + +#else + +/* Use our own implementation of the "random()" and "srandom()" functions */ +/* + * random.c: + * + * An improved random number generation package. In addition to the standard + * rand()/srand() like interface, this package also has a special state info + * interface. The our_initstate() routine is called with a seed, an array of + * bytes, and a count of how many bytes are being passed in; this array is + * then initialized to contain information for random number generation with + * that much state information. Good sizes for the amount of state + * information are 32, 64, 128, and 256 bytes. The state can be switched by + * calling the our_setstate() routine with the same array as was initiallized + * with our_initstate(). By default, the package runs with 128 bytes of state + * information and generates far better random numbers than a linear + * congruential generator. If the amount of state information is less than + * 32 bytes, a simple linear congruential R.N.G. is used. + * + * Internally, the state information is treated as an array of longs; the + * zeroeth element of the array is the type of R.N.G. being used (small + * integer); the remainder of the array is the state information for the + * R.N.G. Thus, 32 bytes of state information will give 7 longs worth of + * state information, which will allow a degree seven polynomial. (Note: + * the zeroeth word of state information also has some other information + * stored in it -- see our_setstate() for details). + * + * The random number generation technique is a linear feedback shift register + * approach, employing trinomials (since there are fewer terms to sum up that + * way). In this approach, the least significant bit of all the numbers in + * the state table will act as a linear feedback shift register, and will + * have period 2^deg - 1 (where deg is the degree of the polynomial being + * used, assuming that the polynomial is irreducible and primitive). The + * higher order bits will have longer periods, since their values are also + * influenced by pseudo-random carries out of the lower bits. The total + * period of the generator is approximately deg*(2**deg - 1); thus doubling + * the amount of state information has a vast influence on the period of the + * generator. Note: the deg*(2**deg - 1) is an approximation only good for + * large deg, when the period of the shift register is the dominant factor. + * With deg equal to seven, the period is actually much longer than the + * 7*(2**7 - 1) predicted by this formula. + */ + +/* + * For each of the currently supported random number generators, we have a + * break value on the amount of state information (you need at least this + * many bytes of state info to support this random number generator), a degree + * for the polynomial (actually a trinomial) that the R.N.G. is based on, and + * the separation between the two lower order coefficients of the trinomial. + */ +#define TYPE_0 0 /* linear congruential */ +#define BREAK_0 8 +#define DEG_0 0 +#define SEP_0 0 + +#define TYPE_1 1 /* x**7 + x**3 + 1 */ +#define BREAK_1 32 +#define DEG_1 7 +#define SEP_1 3 + +#define TYPE_2 2 /* x**15 + x + 1 */ +#define BREAK_2 64 +#define DEG_2 15 +#define SEP_2 1 + +#define TYPE_3 3 /* x**31 + x**3 + 1 */ +#define BREAK_3 128 +#define DEG_3 31 +#define SEP_3 3 + +#define TYPE_4 4 /* x**63 + x + 1 */ +#define BREAK_4 256 +#define DEG_4 63 +#define SEP_4 1 + +/* + * Array versions of the above information to make code run faster -- + * relies on fact that TYPE_i == i. + */ +#define MAX_TYPES 5 /* max number of types above */ + +static int const degrees[MAX_TYPES] = { DEG_0, DEG_1, DEG_2, DEG_3, DEG_4 }; +static int const seps [MAX_TYPES] = { SEP_0, SEP_1, SEP_2, SEP_3, SEP_4 }; + +/* + * Initially, everything is set up as if from: + * + * our_initstate(1, &randtbl, 128); + * + * Note that this initialization takes advantage of the fact that srandom() + * advances the front and rear pointers 10*rand_deg times, and hence the + * rear pointer which starts at 0 will also end up at zero; thus the zeroeth + * element of the state information, which contains info about the current + * position of the rear pointer is just + * + * MAX_TYPES * (rptr - state) + TYPE_3 == TYPE_3. + */ + +static long randtbl[DEG_3 + 1] = { + TYPE_3, + 0x9a319039, 0x32d9c024, 0x9b663182, 0x5da1f342, 0xde3b81e0, 0xdf0a6fb5, + 0xf103bc02, 0x48f340fb, 0x7449e56b, 0xbeb1dbb0, 0xab5c5918, 0x946554fd, + 0x8c2e680f, 0xeb3d799f, 0xb11ee0b7, 0x2d436b86, 0xda672e2a, 0x1588ca88, + 0xe369735d, 0x904f35f7, 0xd7158fd6, 0x6fa6f051, 0x616e6b96, 0xac94efdc, + 0x36413f93, 0xc622c298, 0xf5a42ab8, 0x8a88d77b, 0xf5ad9d0e, 0x8999220b, + 0x27fb47b9, +}; + +/* + * fptr and rptr are two pointers into the state info, a front and a rear + * pointer. These two pointers are always rand_sep places aparts, as they + * cycle cyclically through the state information. (Yes, this does mean we + * could get away with just one pointer, but the code for random() is more + * efficient this way). The pointers are left positioned as they would be + * from the call + * + * our_initstate(1, randtbl, 128); + * + * (The position of the rear pointer, rptr, is really 0 (as explained above + * in the initialization of randtbl) because the state table pointer is set + * to point to randtbl[1] (as explained below). + */ +static long* fptr = &randtbl[SEP_3 + 1]; +static long* rptr = &randtbl[1]; + +/* + * The following things are the pointer to the state information table, the + * type of the current generator, the degree of the current polynomial being + * used, and the separation between the two pointers. Note that for efficiency + * of random(), we remember the first location of the state information, not + * the zeroeth. Hence it is valid to access state[-1], which is used to + * store the type of the R.N.G. Also, we remember the last location, since + * this is more efficient than indexing every time to find the address of + * the last element to see if the front and rear pointers have wrapped. + */ +static long *state = &randtbl[1]; +static int rand_type = TYPE_3; +static int rand_deg = DEG_3; +static int rand_sep = SEP_3; +static long* end_ptr = &randtbl[DEG_3 + 1]; + +/* + * srandom: + * + * Initialize the random number generator based on the given seed. If the + * type is the trivial no-state-information type, just remember the seed. + * Otherwise, initializes state[] based on the given "seed" via a linear + * congruential generator. Then, the pointers are set to known locations + * that are exactly rand_sep places apart. Lastly, it cycles the state + * information a given number of times to get rid of any initial dependencies + * introduced by the L.C.R.N.G. Note that the initialization of randtbl[] + * for default usage relies on values produced by this routine. + */ +long our_random(void); /*forward*/ +void +our_srandom(unsigned int x) +{ + register int i; + + if (rand_type == TYPE_0) + state[0] = x; + else { + state[0] = x; + for (i = 1; i < rand_deg; i++) + state[i] = 1103515245 * state[i - 1] + 12345; + fptr = &state[rand_sep]; + rptr = &state[0]; + for (i = 0; i < 10 * rand_deg; i++) + (void)our_random(); + } +} + +/* + * our_initstate: + * + * Initialize the state information in the given array of n bytes for future + * random number generation. Based on the number of bytes we are given, and + * the break values for the different R.N.G.'s, we choose the best (largest) + * one we can and set things up for it. srandom() is then called to + * initialize the state information. + * + * Note that on return from srandom(), we set state[-1] to be the type + * multiplexed with the current value of the rear pointer; this is so + * successive calls to our_initstate() won't lose this information and will be + * able to restart with our_setstate(). + * + * Note: the first thing we do is save the current state, if any, just like + * our_setstate() so that it doesn't matter when our_initstate is called. + * + * Returns a pointer to the old state. + */ +char * +our_initstate(seed, arg_state, n) + unsigned int seed; /* seed for R.N.G. */ + char *arg_state; /* pointer to state array */ + int n; /* # bytes of state info */ +{ + register char *ostate = (char *)(&state[-1]); + + if (rand_type == TYPE_0) + state[-1] = rand_type; + else + state[-1] = MAX_TYPES * (rptr - state) + rand_type; + if (n < BREAK_0) { +#ifdef DEBUG + (void)fprintf(stderr, + "random: not enough state (%d bytes); ignored.\n", n); +#endif + return(0); + } + if (n < BREAK_1) { + rand_type = TYPE_0; + rand_deg = DEG_0; + rand_sep = SEP_0; + } else if (n < BREAK_2) { + rand_type = TYPE_1; + rand_deg = DEG_1; + rand_sep = SEP_1; + } else if (n < BREAK_3) { + rand_type = TYPE_2; + rand_deg = DEG_2; + rand_sep = SEP_2; + } else if (n < BREAK_4) { + rand_type = TYPE_3; + rand_deg = DEG_3; + rand_sep = SEP_3; + } else { + rand_type = TYPE_4; + rand_deg = DEG_4; + rand_sep = SEP_4; + } + state = &(((long *)arg_state)[1]); /* first location */ + end_ptr = &state[rand_deg]; /* must set end_ptr before srandom */ + our_srandom(seed); + if (rand_type == TYPE_0) + state[-1] = rand_type; + else + state[-1] = MAX_TYPES*(rptr - state) + rand_type; + return(ostate); +} + +/* + * our_setstate: + * + * Restore the state from the given state array. + * + * Note: it is important that we also remember the locations of the pointers + * in the current state information, and restore the locations of the pointers + * from the old state information. This is done by multiplexing the pointer + * location into the zeroeth word of the state information. + * + * Note that due to the order in which things are done, it is OK to call + * our_setstate() with the same state as the current state. + * + * Returns a pointer to the old state information. + */ +char * +our_setstate(arg_state) + char *arg_state; +{ + register long *new_state = (long *)arg_state; + register int type = new_state[0] % MAX_TYPES; + register int rear = new_state[0] / MAX_TYPES; + char *ostate = (char *)(&state[-1]); + + if (rand_type == TYPE_0) + state[-1] = rand_type; + else + state[-1] = MAX_TYPES * (rptr - state) + rand_type; + switch(type) { + case TYPE_0: + case TYPE_1: + case TYPE_2: + case TYPE_3: + case TYPE_4: + rand_type = type; + rand_deg = degrees[type]; + rand_sep = seps[type]; + break; + default: +#ifdef DEBUG + (void)fprintf(stderr, + "random: state info corrupted; not changed.\n"); +#endif + break; + } + state = &new_state[1]; + if (rand_type != TYPE_0) { + rptr = &state[rear]; + fptr = &state[(rear + rand_sep) % rand_deg]; + } + end_ptr = &state[rand_deg]; /* set end_ptr too */ + return(ostate); +} + +/* + * random: + * + * If we are using the trivial TYPE_0 R.N.G., just do the old linear + * congruential bit. Otherwise, we do our fancy trinomial stuff, which is + * the same in all the other cases due to all the global variables that have + * been set up. The basic operation is to add the number at the rear pointer + * into the one at the front pointer. Then both pointers are advanced to + * the next location cyclically in the table. The value returned is the sum + * generated, reduced to 31 bits by throwing away the "least random" low bit. + * + * Note: the code takes advantage of the fact that both the front and + * rear pointers can't wrap on the same call by not testing the rear + * pointer if the front one has wrapped. + * + * Returns a 31-bit random number. + */ +long our_random() { + long i; + + if (rand_type == TYPE_0) { + i = state[0] = (state[0] * 1103515245 + 12345) & 0x7fffffff; + } else { + /* Make copies of "rptr" and "fptr" before working with them, in case we're being called concurrently by multiple threads: */ + long* rp = rptr; + long* fp = fptr; + + /* Make sure "rp" and "fp" are separated by the correct distance (again, allowing for concurrent access): */ + if (!(fp == rp+SEP_3 || fp+DEG_3 == rp+SEP_3)) { + /* A rare case that should occur only if we're being called concurrently by multiple threads. */ + /* Restore the proper separation between the pointers: */ + if (rp <= fp) rp = fp-SEP_3; else rp = fp+DEG_3-SEP_3; + } + + *fp += *rp; + i = (*fp >> 1) & 0x7fffffff; /* chucking least random bit */ + if (++fp >= end_ptr) { + fp = state; + ++rp; + } else if (++rp >= end_ptr) { + rp = state; + } + + /* Restore "rptr" and "fptr" from our working copies: */ + rptr = rp; + fptr = fp; + } + + return i; +} +#endif + +u_int32_t our_random32() { + /* Return a 32-bit random number. + Because "our_random()" returns a 31-bit random number, we call it a second + time, to generate the high bit. + (Actually, to increase the likelihood of randomness, we take the middle 16 bits of two successive calls to "our_random()") + */ + long random_1 = our_random(); + u_int32_t random16_1 = (u_int32_t)(random_1&0x00FFFF00); + + long random_2 = our_random(); + u_int32_t random16_2 = (u_int32_t)(random_2&0x00FFFF00); + + return (random16_1<<8) | (random16_2>>8); +} + +#ifdef USE_OUR_BZERO +#ifndef __bzero +void +__bzero (to, count) + char *to; + int count; +{ + while (count-- > 0) + { + *to++ = 0; + } +} +#endif +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/AC3AudioFileServerMediaSubsession.cpp b/src/big/mpp/middleware/src/live555/liveMedia/AC3AudioFileServerMediaSubsession.cpp new file mode 100644 index 000000000..abbf4c224 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/AC3AudioFileServerMediaSubsession.cpp @@ -0,0 +1,61 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A 'ServerMediaSubsession' object that creates new, unicast, "RTPSink"s +// on demand, from an AC3 audio file. +// Implementation + +#include "AC3AudioFileServerMediaSubsession.hh" +#include "ByteStreamFileSource.hh" +#include "AC3AudioStreamFramer.hh" +#include "AC3AudioRTPSink.hh" + +AC3AudioFileServerMediaSubsession* +AC3AudioFileServerMediaSubsession::createNew(UsageEnvironment& env, + char const* fileName, + Boolean reuseFirstSource) { + return new AC3AudioFileServerMediaSubsession(env, fileName, reuseFirstSource); +} + +AC3AudioFileServerMediaSubsession +::AC3AudioFileServerMediaSubsession(UsageEnvironment& env, + char const* fileName, Boolean reuseFirstSource) + : FileServerMediaSubsession(env, fileName, reuseFirstSource) { +} + +AC3AudioFileServerMediaSubsession::~AC3AudioFileServerMediaSubsession() { +} + +FramedSource* AC3AudioFileServerMediaSubsession +::createNewStreamSource(unsigned /*clientSessionId*/, unsigned& estBitrate) { + estBitrate = 48; // kbps, estimate + + ByteStreamFileSource* fileSource = ByteStreamFileSource::createNew(envir(), fFileName); + if (fileSource == NULL) return NULL; + + return AC3AudioStreamFramer::createNew(envir(), fileSource); +} + +RTPSink* AC3AudioFileServerMediaSubsession +::createNewRTPSink(Groupsock* rtpGroupsock, + unsigned char rtpPayloadTypeIfDynamic, + FramedSource* inputSource) { + AC3AudioStreamFramer* audioSource = (AC3AudioStreamFramer*)inputSource; + return AC3AudioRTPSink::createNew(envir(), rtpGroupsock, + rtpPayloadTypeIfDynamic, + audioSource->samplingRate()); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/AC3AudioRTPSink.cpp b/src/big/mpp/middleware/src/live555/liveMedia/AC3AudioRTPSink.cpp new file mode 100644 index 000000000..f8a750c47 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/AC3AudioRTPSink.cpp @@ -0,0 +1,97 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP sink for AC3 audio +// Implementation + +#include "AC3AudioRTPSink.hh" + +AC3AudioRTPSink::AC3AudioRTPSink(UsageEnvironment& env, Groupsock* RTPgs, + u_int8_t rtpPayloadFormat, + u_int32_t rtpTimestampFrequency) + : AudioRTPSink(env, RTPgs, rtpPayloadFormat, + rtpTimestampFrequency, "AC3"), + fTotNumFragmentsUsed(0) { +} + +AC3AudioRTPSink::~AC3AudioRTPSink() { +} + +AC3AudioRTPSink* +AC3AudioRTPSink::createNew(UsageEnvironment& env, Groupsock* RTPgs, + u_int8_t rtpPayloadFormat, + u_int32_t rtpTimestampFrequency) { + return new AC3AudioRTPSink(env, RTPgs, + rtpPayloadFormat, rtpTimestampFrequency); +} + +Boolean AC3AudioRTPSink +::frameCanAppearAfterPacketStart(unsigned char const* /*frameStart*/, + unsigned /*numBytesInFrame*/) const { + // (For now) allow at most 1 frame in a single packet: + return False; +} + +void AC3AudioRTPSink +::doSpecialFrameHandling(unsigned fragmentationOffset, + unsigned char* frameStart, + unsigned numBytesInFrame, + struct timeval framePresentationTime, + unsigned numRemainingBytes) { + // Set the 2-byte "payload header", as defined in RFC 4184. + unsigned char headers[2]; + + Boolean isFragment = numRemainingBytes > 0 || fragmentationOffset > 0; + if (!isFragment) { + headers[0] = 0; // One or more complete frames + headers[1] = 1; // because we (for now) allow at most 1 frame per packet + } else { + if (fragmentationOffset > 0) { + headers[0] = 3; // Fragment of frame other than initial fragment + } else { + // An initial fragment of the frame + unsigned const totalFrameSize = fragmentationOffset + numBytesInFrame + numRemainingBytes; + unsigned const fiveEighthsPoint = totalFrameSize/2 + totalFrameSize/8; + headers[0] = numBytesInFrame >= fiveEighthsPoint ? 1 : 2; + + // Because this outgoing packet will be full (because it's an initial fragment), we can compute how many total + // fragments (and thus packets) will make up the complete AC-3 frame: + fTotNumFragmentsUsed = (totalFrameSize + (numBytesInFrame-1))/numBytesInFrame; + } + + headers[1] = fTotNumFragmentsUsed; + } + + setSpecialHeaderBytes(headers, sizeof headers); + + if (numRemainingBytes == 0) { + // This packet contains the last (or only) fragment of the frame. + // Set the RTP 'M' ('marker') bit: + setMarkerBit(); + } + + // Important: Also call our base class's doSpecialFrameHandling(), + // to set the packet's timestamp: + MultiFramedRTPSink::doSpecialFrameHandling(fragmentationOffset, + frameStart, numBytesInFrame, + framePresentationTime, + numRemainingBytes); +} + +unsigned AC3AudioRTPSink::specialHeaderSize() const { + return 2; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/AC3AudioRTPSource.cpp b/src/big/mpp/middleware/src/live555/liveMedia/AC3AudioRTPSource.cpp new file mode 100644 index 000000000..d0ccf0456 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/AC3AudioRTPSource.cpp @@ -0,0 +1,66 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// AC3 Audio RTP Sources +// Implementation + +#include "AC3AudioRTPSource.hh" + +AC3AudioRTPSource* +AC3AudioRTPSource::createNew(UsageEnvironment& env, + Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency) { + return new AC3AudioRTPSource(env, RTPgs, rtpPayloadFormat, + rtpTimestampFrequency); +} + +AC3AudioRTPSource::AC3AudioRTPSource(UsageEnvironment& env, + Groupsock* rtpGS, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency) + : MultiFramedRTPSource(env, rtpGS, + rtpPayloadFormat, rtpTimestampFrequency) { +} + +AC3AudioRTPSource::~AC3AudioRTPSource() { +} + +Boolean AC3AudioRTPSource +::processSpecialHeader(BufferedPacket* packet, + unsigned& resultSpecialHeaderSize) { + unsigned char* headerStart = packet->data(); + unsigned packetSize = packet->dataSize(); + + // There's a 2-byte payload header at the beginning: + if (packetSize < 2) return False; + resultSpecialHeaderSize = 2; + + unsigned char FT = headerStart[0]&0x03; + fCurrentPacketBeginsFrame = FT != 3; + + // The RTP "M" (marker) bit indicates the last fragment of a frame. + // In case the sender did not set the "M" bit correctly, we also test for FT == 0: + fCurrentPacketCompletesFrame = packet->rtpMarkerBit() || FT == 0; + + return True; +} + +char const* AC3AudioRTPSource::MIMEtype() const { + return "audio/AC3"; +} + diff --git a/src/big/mpp/middleware/src/live555/liveMedia/AC3AudioStreamFramer.cpp b/src/big/mpp/middleware/src/live555/liveMedia/AC3AudioStreamFramer.cpp new file mode 100644 index 000000000..7366e0ac2 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/AC3AudioStreamFramer.cpp @@ -0,0 +1,341 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A filter that breaks up an AC3 audio elementary stream into frames +// Implementation + +#include "AC3AudioStreamFramer.hh" +#include "StreamParser.hh" +#include + +////////// AC3AudioStreamParser definition ////////// + +class AC3FrameParams { +public: + AC3FrameParams() : samplingFreq(0) {} + // 8-byte header at the start of each frame: + // u_int32_t hdr0, hdr1; + unsigned hdr0, hdr1; + + // parameters derived from the headers + unsigned kbps, samplingFreq, frameSize; + + void setParamsFromHeader(); +}; + +class AC3AudioStreamParser: public StreamParser { +public: + AC3AudioStreamParser(AC3AudioStreamFramer* usingSource, + FramedSource* inputSource); + virtual ~AC3AudioStreamParser(); + +public: + void testStreamCode(unsigned char ourStreamCode, + unsigned char* ptr, unsigned size); + unsigned parseFrame(unsigned& numTruncatedBytes); + // returns the size of the frame that was acquired, or 0 if none was + + void registerReadInterest(unsigned char* to, unsigned maxSize); + + AC3FrameParams const& currentFrame() const { return fCurrentFrame; } + + Boolean haveParsedAFrame() const { return fHaveParsedAFrame; } + void readAndSaveAFrame(); + +private: + static void afterGettingSavedFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + void afterGettingSavedFrame1(unsigned frameSize); + static void onSavedFrameClosure(void* clientData); + void onSavedFrameClosure1(); + +private: + AC3AudioStreamFramer* fUsingSource; + unsigned char* fTo; + unsigned fMaxSize; + + Boolean fHaveParsedAFrame; + unsigned char* fSavedFrame; + unsigned fSavedFrameSize; + char fSavedFrameFlag; + + // Parameters of the most recently read frame: + AC3FrameParams fCurrentFrame; +}; + + +////////// AC3AudioStreamFramer implementation ////////// + +AC3AudioStreamFramer::AC3AudioStreamFramer(UsageEnvironment& env, + FramedSource* inputSource, + unsigned char streamCode) + : FramedFilter(env, inputSource), fOurStreamCode(streamCode) { + // Use the current wallclock time as the initial 'presentation time': + gettimeofday(&fNextFramePresentationTime, NULL); + + fParser = new AC3AudioStreamParser(this, inputSource); +} + +AC3AudioStreamFramer::~AC3AudioStreamFramer() { + delete fParser; +} + +AC3AudioStreamFramer* +AC3AudioStreamFramer::createNew(UsageEnvironment& env, + FramedSource* inputSource, + unsigned char streamCode) { + // Need to add source type checking here??? ##### + return new AC3AudioStreamFramer(env, inputSource, streamCode); +} + +unsigned AC3AudioStreamFramer::samplingRate() { + if (!fParser->haveParsedAFrame()) { + // Because we haven't yet parsed a frame, we don't yet know the input + // stream's sampling rate. So, we first need to read a frame + // (into a special buffer that we keep around for later use). + fParser->readAndSaveAFrame(); + } + + return fParser->currentFrame().samplingFreq; +} + +void AC3AudioStreamFramer::flushInput() { + fParser->flushInput(); +} + +void AC3AudioStreamFramer::doGetNextFrame() { + fParser->registerReadInterest(fTo, fMaxSize); + parseNextFrame(); +} + +#define MILLION 1000000 + +struct timeval AC3AudioStreamFramer::currentFramePlayTime() const { + AC3FrameParams const& fr = fParser->currentFrame(); + unsigned const numSamples = 1536; + unsigned const freq = fr.samplingFreq; + + // result is numSamples/freq + unsigned const uSeconds = (freq == 0) ? 0 + : ((numSamples*2*MILLION)/freq + 1)/2; // rounds to nearest integer + + struct timeval result; + result.tv_sec = uSeconds/MILLION; + result.tv_usec = uSeconds%MILLION; + return result; +} + +void AC3AudioStreamFramer +::handleNewData(void* clientData, unsigned char* ptr, unsigned size, + struct timeval /*presentationTime*/) { + AC3AudioStreamFramer* framer = (AC3AudioStreamFramer*)clientData; + framer->handleNewData(ptr, size); +} + +void AC3AudioStreamFramer +::handleNewData(unsigned char* ptr, unsigned size) { + fParser->testStreamCode(fOurStreamCode, ptr, size); + + parseNextFrame(); +} + +void AC3AudioStreamFramer::parseNextFrame() { + unsigned acquiredFrameSize = fParser->parseFrame(fNumTruncatedBytes); + if (acquiredFrameSize > 0) { + // We were able to acquire a frame from the input. + // It has already been copied to the reader's space. + fFrameSize = acquiredFrameSize; + + // Also set the presentation time, and increment it for next time, + // based on the length of this frame: + fPresentationTime = fNextFramePresentationTime; + + struct timeval framePlayTime = currentFramePlayTime(); + fDurationInMicroseconds = framePlayTime.tv_sec*MILLION + framePlayTime.tv_usec; + fNextFramePresentationTime.tv_usec += framePlayTime.tv_usec; + fNextFramePresentationTime.tv_sec + += framePlayTime.tv_sec + fNextFramePresentationTime.tv_usec/MILLION; + fNextFramePresentationTime.tv_usec %= MILLION; + + // Call our own 'after getting' function. Because we're not a 'leaf' + // source, we can call this directly, without risking infinite recursion. + afterGetting(this); + } else { + // We were unable to parse a complete frame from the input, because: + // - we had to read more data from the source stream, or + // - the source stream has ended. + } +} + + +////////// AC3AudioStreamParser implementation ////////// + +static int const kbpsTable[] = {32, 40, 48, 56, 64, 80, 96, 112, + 128, 160, 192, 224, 256, 320, 384, 448, + 512, 576, 640}; + +void AC3FrameParams::setParamsFromHeader() { + unsigned char byte4 = hdr1 >> 24; + + unsigned char kbpsIndex = (byte4&0x3E) >> 1; + if (kbpsIndex > 18) kbpsIndex = 18; + kbps = kbpsTable[kbpsIndex]; + + unsigned char samplingFreqIndex = (byte4&0xC0) >> 6; + switch (samplingFreqIndex) { + case 0: + samplingFreq = 48000; + frameSize = 4*kbps; + break; + case 1: + samplingFreq = 44100; + frameSize = 2*(320*kbps/147 + (byte4&1)); + break; + case 2: + case 3: // not legal? + samplingFreq = 32000; + frameSize = 6*kbps; + } +} + +AC3AudioStreamParser +::AC3AudioStreamParser(AC3AudioStreamFramer* usingSource, + FramedSource* inputSource) + : StreamParser(inputSource, FramedSource::handleClosure, usingSource, + &AC3AudioStreamFramer::handleNewData, usingSource), + fUsingSource(usingSource), fHaveParsedAFrame(False), + fSavedFrame(NULL), fSavedFrameSize(0) { +} + +AC3AudioStreamParser::~AC3AudioStreamParser() { + delete[] fSavedFrame; +} + +void AC3AudioStreamParser::registerReadInterest(unsigned char* to, + unsigned maxSize) { + fTo = to; + fMaxSize = maxSize; +} + +void AC3AudioStreamParser +::testStreamCode(unsigned char ourStreamCode, + unsigned char* ptr, unsigned size) { + if (ourStreamCode == 0) return; // we assume that there's no stream code at the beginning of the data + + if (size < 4) return; + unsigned char streamCode = *ptr; + + if (streamCode == ourStreamCode) { + // Remove the first 4 bytes from the stream: + memmove(ptr, ptr + 4, size - 4); + totNumValidBytes() = totNumValidBytes() - 4; + } else { + // Discard all of the data that was just read: + totNumValidBytes() = totNumValidBytes() - size; + } +} + +unsigned AC3AudioStreamParser::parseFrame(unsigned& numTruncatedBytes) { + if (fSavedFrameSize > 0) { + // We've already read and parsed a frame. Use it instead: + memmove(fTo, fSavedFrame, fSavedFrameSize); + delete[] fSavedFrame; fSavedFrame = NULL; + unsigned frameSize = fSavedFrameSize; + fSavedFrameSize = 0; + return frameSize; + } + + try { + saveParserState(); + + // We expect an AC3 audio header (first 2 bytes == 0x0B77) at the start: + while (1) { + unsigned next4Bytes = test4Bytes(); + if (next4Bytes>>16 == 0x0B77) break; + skipBytes(1); + saveParserState(); + } + fCurrentFrame.hdr0 = get4Bytes(); + fCurrentFrame.hdr1 = test4Bytes(); + + fCurrentFrame.setParamsFromHeader(); + fHaveParsedAFrame = True; + + // Copy the frame to the requested destination: + unsigned frameSize = fCurrentFrame.frameSize; + if (frameSize > fMaxSize) { + numTruncatedBytes = frameSize - fMaxSize; + frameSize = fMaxSize; + } else { + numTruncatedBytes = 0; + } + + fTo[0] = fCurrentFrame.hdr0 >> 24; + fTo[1] = fCurrentFrame.hdr0 >> 16; + fTo[2] = fCurrentFrame.hdr0 >> 8; + fTo[3] = fCurrentFrame.hdr0; + getBytes(&fTo[4], frameSize-4); + skipBytes(numTruncatedBytes); + + return frameSize; + } catch (int /*e*/) { +#ifdef DEBUG + fUsingSource->envir() << "AC3AudioStreamParser::parseFrame() EXCEPTION (This is normal behavior - *not* an error)\n"; +#endif + return 0; // the parsing got interrupted + } +} + +void AC3AudioStreamParser::readAndSaveAFrame() { + unsigned const maxAC3FrameSize = 4000; + delete[] fSavedFrame; fSavedFrame = new unsigned char[maxAC3FrameSize]; + fSavedFrameSize = 0; + + fSavedFrameFlag = 0; + fUsingSource->getNextFrame(fSavedFrame, maxAC3FrameSize, + afterGettingSavedFrame, this, + onSavedFrameClosure, this); + fUsingSource->envir().taskScheduler().doEventLoop(&fSavedFrameFlag); +} + +void AC3AudioStreamParser +::afterGettingSavedFrame(void* clientData, unsigned frameSize, + unsigned /*numTruncatedBytes*/, + struct timeval /*presentationTime*/, + unsigned /*durationInMicroseconds*/) { + AC3AudioStreamParser* parser = (AC3AudioStreamParser*)clientData; + parser->afterGettingSavedFrame1(frameSize); +} + +void AC3AudioStreamParser +::afterGettingSavedFrame1(unsigned frameSize) { + fSavedFrameSize = frameSize; + fSavedFrameFlag = ~0; +} + +void AC3AudioStreamParser::onSavedFrameClosure(void* clientData) { + AC3AudioStreamParser* parser = (AC3AudioStreamParser*)clientData; + parser->onSavedFrameClosure1(); +} + +void AC3AudioStreamParser::onSavedFrameClosure1() { + delete[] fSavedFrame; fSavedFrame = NULL; + fSavedFrameSize = 0; + fSavedFrameFlag = ~0; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/ADTSAudioFileServerMediaSubsession.cpp b/src/big/mpp/middleware/src/live555/liveMedia/ADTSAudioFileServerMediaSubsession.cpp new file mode 100644 index 000000000..fcdedefac --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/ADTSAudioFileServerMediaSubsession.cpp @@ -0,0 +1,60 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A 'ServerMediaSubsession' object that creates new, unicast, "RTPSink"s +// on demand, from an AAC audio file in ADTS format +// Implementation + +#include "ADTSAudioFileServerMediaSubsession.hh" +#include "ADTSAudioFileSource.hh" +#include "MPEG4GenericRTPSink.hh" + +ADTSAudioFileServerMediaSubsession* +ADTSAudioFileServerMediaSubsession::createNew(UsageEnvironment& env, + char const* fileName, + Boolean reuseFirstSource) { + return new ADTSAudioFileServerMediaSubsession(env, fileName, reuseFirstSource); +} + +ADTSAudioFileServerMediaSubsession +::ADTSAudioFileServerMediaSubsession(UsageEnvironment& env, + char const* fileName, Boolean reuseFirstSource) + : FileServerMediaSubsession(env, fileName, reuseFirstSource) { +} + +ADTSAudioFileServerMediaSubsession +::~ADTSAudioFileServerMediaSubsession() { +} + +FramedSource* ADTSAudioFileServerMediaSubsession +::createNewStreamSource(unsigned /*clientSessionId*/, unsigned& estBitrate) { + estBitrate = 96; // kbps, estimate + + return ADTSAudioFileSource::createNew(envir(), fFileName); +} + +RTPSink* ADTSAudioFileServerMediaSubsession +::createNewRTPSink(Groupsock* rtpGroupsock, + unsigned char rtpPayloadTypeIfDynamic, + FramedSource* inputSource) { + ADTSAudioFileSource* adtsSource = (ADTSAudioFileSource*)inputSource; + return MPEG4GenericRTPSink::createNew(envir(), rtpGroupsock, + rtpPayloadTypeIfDynamic, + adtsSource->samplingFrequency(), + "audio", "AAC-hbr", adtsSource->configStr(), + adtsSource->numChannels()); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/ADTSAudioFileSource.cpp b/src/big/mpp/middleware/src/live555/liveMedia/ADTSAudioFileSource.cpp new file mode 100644 index 000000000..41d58eda6 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/ADTSAudioFileSource.cpp @@ -0,0 +1,171 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A source object for AAC audio files in ADTS format +// Implementation + +#include "ADTSAudioFileSource.hh" +#include "InputFile.hh" +#include + +////////// ADTSAudioFileSource ////////// + +static unsigned const samplingFrequencyTable[16] = { + 96000, 88200, 64000, 48000, + 44100, 32000, 24000, 22050, + 16000, 12000, 11025, 8000, + 7350, 0, 0, 0 +}; + +ADTSAudioFileSource* +ADTSAudioFileSource::createNew(UsageEnvironment& env, char const* fileName) { + FILE* fid = NULL; + do { + fid = OpenInputFile(env, fileName); + if (fid == NULL) break; + + // Now, having opened the input file, read the fixed header of the first frame, + // to get the audio stream's parameters: + unsigned char fixedHeader[4]; // it's actually 3.5 bytes long + if (fread(fixedHeader, 1, sizeof fixedHeader, fid) < sizeof fixedHeader) break; + + // Check the 'syncword': + if (!(fixedHeader[0] == 0xFF && (fixedHeader[1]&0xF0) == 0xF0)) { + env.setResultMsg("Bad 'syncword' at start of ADTS file"); + break; + } + + // Get and check the 'profile': + u_int8_t profile = (fixedHeader[2]&0xC0)>>6; // 2 bits + if (profile == 3) { + env.setResultMsg("Bad (reserved) 'profile': 3 in first frame of ADTS file"); + break; + } + + // Get and check the 'sampling_frequency_index': + u_int8_t sampling_frequency_index = (fixedHeader[2]&0x3C)>>2; // 4 bits + if (samplingFrequencyTable[sampling_frequency_index] == 0) { + env.setResultMsg("Bad 'sampling_frequency_index' in first frame of ADTS file"); + break; + } + + // Get and check the 'channel_configuration': + u_int8_t channel_configuration + = ((fixedHeader[2]&0x01)<<2)|((fixedHeader[3]&0xC0)>>6); // 3 bits + + // If we get here, the frame header was OK. + // Reset the fid to the beginning of the file: +#ifndef _WIN32_WCE + rewind(fid); +#else + SeekFile64(fid, SEEK_SET,0); +#endif +#ifdef DEBUG + fprintf(stderr, "Read first frame: profile %d, " + "sampling_frequency_index %d => samplingFrequency %d, " + "channel_configuration %d\n", + profile, + sampling_frequency_index, samplingFrequencyTable[sampling_frequency_index], + channel_configuration); +#endif + return new ADTSAudioFileSource(env, fid, profile, + sampling_frequency_index, channel_configuration); + } while (0); + + // An error occurred: + CloseInputFile(fid); + return NULL; +} + +ADTSAudioFileSource +::ADTSAudioFileSource(UsageEnvironment& env, FILE* fid, u_int8_t profile, + u_int8_t samplingFrequencyIndex, u_int8_t channelConfiguration) + : FramedFileSource(env, fid) { + fSamplingFrequency = samplingFrequencyTable[samplingFrequencyIndex]; + fNumChannels = channelConfiguration == 0 ? 2 : channelConfiguration; + fuSecsPerFrame + = (1024/*samples-per-frame*/*1000000) / fSamplingFrequency/*samples-per-second*/; + + // Construct the 'AudioSpecificConfig', and from it, the corresponding ASCII string: + unsigned char audioSpecificConfig[2]; + u_int8_t const audioObjectType = profile + 1; + audioSpecificConfig[0] = (audioObjectType<<3) | (samplingFrequencyIndex>>1); + audioSpecificConfig[1] = (samplingFrequencyIndex<<7) | (channelConfiguration<<3); + sprintf(fConfigStr, "%02X%02X", audioSpecificConfig[0], audioSpecificConfig[1]); +} + +ADTSAudioFileSource::~ADTSAudioFileSource() { + CloseInputFile(fFid); +} + +// Note: We should change the following to use asynchronous file reading, ##### +// as we now do with ByteStreamFileSource. ##### +void ADTSAudioFileSource::doGetNextFrame() { + // Begin by reading the 7-byte fixed_variable headers: + unsigned char headers[7]; + if (fread(headers, 1, sizeof headers, fFid) < sizeof headers + || feof(fFid) || ferror(fFid)) { + // The input source has ended: + handleClosure(); + return; + } + + // Extract important fields from the headers: + Boolean protection_absent = headers[1]&0x01; + u_int16_t frame_length + = ((headers[3]&0x03)<<11) | (headers[4]<<3) | ((headers[5]&0xE0)>>5); +#ifdef DEBUG + u_int16_t syncword = (headers[0]<<4) | (headers[1]>>4); + fprintf(stderr, "Read frame: syncword 0x%x, protection_absent %d, frame_length %d\n", syncword, protection_absent, frame_length); + if (syncword != 0xFFF) fprintf(stderr, "WARNING: Bad syncword!\n"); +#endif + unsigned numBytesToRead + = frame_length > sizeof headers ? frame_length - sizeof headers : 0; + + // If there's a 'crc_check' field, skip it: + if (!protection_absent) { + SeekFile64(fFid, 2, SEEK_CUR); + numBytesToRead = numBytesToRead > 2 ? numBytesToRead - 2 : 0; + } + + // Next, read the raw frame data into the buffer provided: + if (numBytesToRead > fMaxSize) { + fNumTruncatedBytes = numBytesToRead - fMaxSize; + numBytesToRead = fMaxSize; + } + int numBytesRead = fread(fTo, 1, numBytesToRead, fFid); + if (numBytesRead < 0) numBytesRead = 0; + fFrameSize = numBytesRead; + fNumTruncatedBytes += numBytesToRead - numBytesRead; + + // Set the 'presentation time': + if (fPresentationTime.tv_sec == 0 && fPresentationTime.tv_usec == 0) { + // This is the first frame, so use the current time: + gettimeofday(&fPresentationTime, NULL); + } else { + // Increment by the play time of the previous frame: + unsigned uSeconds = fPresentationTime.tv_usec + fuSecsPerFrame; + fPresentationTime.tv_sec += uSeconds/1000000; + fPresentationTime.tv_usec = uSeconds%1000000; + } + + fDurationInMicroseconds = fuSecsPerFrame; + + // Switch to another task, and inform the reader that he has data: + nextTask() = envir().taskScheduler().scheduleDelayedTask(0, + (TaskFunc*)FramedSource::afterGetting, this); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/ADTSAudioStreamDiscreteFramer.cpp b/src/big/mpp/middleware/src/live555/liveMedia/ADTSAudioStreamDiscreteFramer.cpp new file mode 100644 index 000000000..3a21b16d2 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/ADTSAudioStreamDiscreteFramer.cpp @@ -0,0 +1,128 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A filter that reads (discrete) AAC audio frames, and outputs each frame with +// a preceding ADTS header. +// Implementation + +#include "ADTSAudioStreamDiscreteFramer.hh" + +static u_int8_t hexToBinary(char c) { + if (c >= '0' && c <= '9') return c - '0'; + if (c >= 'a' && c <= 'f') return 10 + (c - 'a'); + if (c >= 'A' && c <= 'F') return 10 + (c - 'A'); + + return 0; // default if 'c' is not hex +} + +ADTSAudioStreamDiscreteFramer* ADTSAudioStreamDiscreteFramer +::createNew(UsageEnvironment& env, FramedSource* inputSource, char const* configStr) { + u_int16_t configValue = 0; + + if (configStr != NULL && strlen(configStr) >= 4) { + configValue = + (hexToBinary(configStr[0])<<12)| + (hexToBinary(configStr[1])<<8)| + (hexToBinary(configStr[2])<<4)| + hexToBinary(configStr[3]); + } + + // Unpack the 2-byte 'config' value to get "profile", "samplingFrequencyIndex", + // and "channelConfiguration": + u_int8_t audioObjectType = configValue>>11; + u_int8_t profile = audioObjectType == 0 ? 0 : audioObjectType-1; + u_int8_t samplingFrequencyIndex = (configValue&0x0780)>>7; + u_int8_t channelConfiguration = (configValue&0x0078)>>3; + + return new ADTSAudioStreamDiscreteFramer(env, inputSource, + profile, samplingFrequencyIndex, channelConfiguration); +} + +ADTSAudioStreamDiscreteFramer +::ADTSAudioStreamDiscreteFramer(UsageEnvironment& env, FramedSource* inputSource, + u_int8_t profile, u_int8_t samplingFrequencyIndex, u_int8_t channelConfiguration) + : FramedFilter(env, inputSource) { + // Set up the ADTS header that we'll be prepending to each audio frame. + // This will be fixed, except for the frame size. + profile &= 0x03; // use 2 bits only + samplingFrequencyIndex &= 0x0F; // use 4 bits only + channelConfiguration &= 0x07; // use 3 bits only + + fADTSHeader[0] = 0xFF; // first 8 bits of syncword + fADTSHeader[1] = 0xF1; // last 4 bits of syncword; version 0; layer 0; protection absent + fADTSHeader[2] = (profile<<6)|(samplingFrequencyIndex<<2)|(channelConfiguration>>2); + fADTSHeader[3] = channelConfiguration<<6; + fADTSHeader[4] = 0; + fADTSHeader[5] = 0x1F; // set 'buffer fullness' to all-1s + fADTSHeader[6] = 0xFC; // set 'buffer fullness' to all-1s +} + +ADTSAudioStreamDiscreteFramer::~ADTSAudioStreamDiscreteFramer() { +} + +void ADTSAudioStreamDiscreteFramer::doGetNextFrame() { + // Arrange to read data (an AAC audio frame) from our data source, directly into the + // downstream object's buffer, allowing for the ATDS header in front. + // Make sure there's enoughn space: + if (fMaxSize <= ADTS_HEADER_SIZE) { + fNumTruncatedBytes = ADTS_HEADER_SIZE - fMaxSize; + handleClosure(); + return; + } + + fInputSource->getNextFrame(fTo + ADTS_HEADER_SIZE, fMaxSize - ADTS_HEADER_SIZE, + afterGettingFrame, this, + FramedSource::handleClosure, this); +} + +void ADTSAudioStreamDiscreteFramer +::afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds) { + ADTSAudioStreamDiscreteFramer* source = (ADTSAudioStreamDiscreteFramer*)clientData; + source->afterGettingFrame1(frameSize, numTruncatedBytes, presentationTime, durationInMicroseconds); +} + +void ADTSAudioStreamDiscreteFramer +::afterGettingFrame1(unsigned frameSize, unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds) { + frameSize += ADTS_HEADER_SIZE; + + // Fill in the ADTS header with the (updated) frame size: + fFrameSize = frameSize; + frameSize &= 0x1FFF; // use only 13 bits in the ADTS header + fADTSHeader[3] = (fADTSHeader[3]&0xFC)|(frameSize>>11); + fADTSHeader[4] = frameSize>>3; + fADTSHeader[5] = (fADTSHeader[5]&0x1F)|(frameSize<<5); + + // And copy the ADTS header to the destination: + fTo[0] = fADTSHeader[0]; + fTo[1] = fADTSHeader[1]; + fTo[2] = fADTSHeader[2]; + fTo[3] = fADTSHeader[3]; + fTo[4] = fADTSHeader[4]; + fTo[5] = fADTSHeader[5]; + fTo[6] = fADTSHeader[6]; + + // Complete delivery to the downstream object: + fNumTruncatedBytes = numTruncatedBytes; + fPresentationTime = presentationTime; + fDurationInMicroseconds = durationInMicroseconds; + afterGetting(this); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/AMRAudioFileServerMediaSubsession.cpp b/src/big/mpp/middleware/src/live555/liveMedia/AMRAudioFileServerMediaSubsession.cpp new file mode 100644 index 000000000..e87d06b27 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/AMRAudioFileServerMediaSubsession.cpp @@ -0,0 +1,59 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A 'ServerMediaSubsession' object that creates new, unicast, "RTPSink"s +// on demand, from an AMR audio file. +// Implementation + +#include "AMRAudioFileServerMediaSubsession.hh" +#include "AMRAudioRTPSink.hh" +#include "AMRAudioFileSource.hh" + +AMRAudioFileServerMediaSubsession* +AMRAudioFileServerMediaSubsession::createNew(UsageEnvironment& env, + char const* fileName, + Boolean reuseFirstSource) { + return new AMRAudioFileServerMediaSubsession(env, fileName, reuseFirstSource); +} + +AMRAudioFileServerMediaSubsession +::AMRAudioFileServerMediaSubsession(UsageEnvironment& env, + char const* fileName, Boolean reuseFirstSource) + : FileServerMediaSubsession(env, fileName, reuseFirstSource) { +} + +AMRAudioFileServerMediaSubsession +::~AMRAudioFileServerMediaSubsession() { +} + +FramedSource* AMRAudioFileServerMediaSubsession +::createNewStreamSource(unsigned /*clientSessionId*/, unsigned& estBitrate) { + estBitrate = 10; // kbps, estimate + + return AMRAudioFileSource::createNew(envir(), fFileName); +} + +RTPSink* AMRAudioFileServerMediaSubsession +::createNewRTPSink(Groupsock* rtpGroupsock, + unsigned char rtpPayloadTypeIfDynamic, + FramedSource* inputSource) { + AMRAudioFileSource* amrSource = (AMRAudioFileSource*)inputSource; + return AMRAudioRTPSink::createNew(envir(), rtpGroupsock, + rtpPayloadTypeIfDynamic, + amrSource->isWideband(), + amrSource->numChannels()); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/AMRAudioFileSink.cpp b/src/big/mpp/middleware/src/live555/liveMedia/AMRAudioFileSink.cpp new file mode 100644 index 000000000..95f551e94 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/AMRAudioFileSink.cpp @@ -0,0 +1,101 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// AMR Audio File sinks +// Implementation + +#include "AMRAudioFileSink.hh" +#include "AMRAudioSource.hh" +#include "OutputFile.hh" + +////////// AMRAudioFileSink ////////// + +AMRAudioFileSink +::AMRAudioFileSink(UsageEnvironment& env, FILE* fid, unsigned bufferSize, + char const* perFrameFileNamePrefix) + : FileSink(env, fid, bufferSize, perFrameFileNamePrefix), + fHaveWrittenHeader(False) { +} + +AMRAudioFileSink::~AMRAudioFileSink() { +} + +AMRAudioFileSink* +AMRAudioFileSink::createNew(UsageEnvironment& env, char const* fileName, + unsigned bufferSize, Boolean oneFilePerFrame) { + do { + FILE* fid; + char const* perFrameFileNamePrefix; + if (oneFilePerFrame) { + // Create the fid for each frame + fid = NULL; + perFrameFileNamePrefix = fileName; + } else { + // Normal case: create the fid once + fid = OpenOutputFile(env, fileName); + if (fid == NULL) break; + perFrameFileNamePrefix = NULL; + } + + return new AMRAudioFileSink(env, fid, bufferSize, perFrameFileNamePrefix); + } while (0); + + return NULL; +} + +Boolean AMRAudioFileSink::sourceIsCompatibleWithUs(MediaSource& source) { + // The input source must be a AMR Audio source: + return source.isAMRAudioSource(); +} + +void AMRAudioFileSink::afterGettingFrame(unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime) { + AMRAudioSource* source = (AMRAudioSource*)fSource; + if (source == NULL) return; // sanity check + + if (!fHaveWrittenHeader && fPerFrameFileNameBuffer == NULL) { + // Output the appropriate AMR header to the start of the file. + // This header is defined in RFC 4867, section 5. + // (However, we don't do this if we're creating one file per frame.) + char headerBuffer[100]; + sprintf(headerBuffer, "#!AMR%s%s\n", + source->isWideband() ? "-WB" : "", + source->numChannels() > 1 ? "_MC1.0" : ""); + unsigned headerLength = strlen(headerBuffer); + if (source->numChannels() > 1) { + // Also add a 32-bit channel description field: + headerBuffer[headerLength++] = 0; + headerBuffer[headerLength++] = 0; + headerBuffer[headerLength++] = 0; + headerBuffer[headerLength++] = source->numChannels(); + } + + addData((unsigned char*)headerBuffer, headerLength, presentationTime); + } + fHaveWrittenHeader = True; + + // Add the 1-byte header, before writing the file data proper: + // (Again, we don't do this if we're creating one file per frame.) + if (fPerFrameFileNameBuffer == NULL) { + u_int8_t frameHeader = source->lastFrameHeader(); + addData(&frameHeader, 1, presentationTime); + } + + // Call the parent class to complete the normal file write with the input data: + FileSink::afterGettingFrame(frameSize, numTruncatedBytes, presentationTime); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/AMRAudioFileSource.cpp b/src/big/mpp/middleware/src/live555/liveMedia/AMRAudioFileSource.cpp new file mode 100644 index 000000000..65c05a7a3 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/AMRAudioFileSource.cpp @@ -0,0 +1,174 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A source object for AMR audio files (as defined in RFC 4867, section 5) +// Implementation + +#include "AMRAudioFileSource.hh" +#include "InputFile.hh" +#include "GroupsockHelper.hh" + +////////// AMRAudioFileSource ////////// + +AMRAudioFileSource* +AMRAudioFileSource::createNew(UsageEnvironment& env, char const* fileName) { + FILE* fid = NULL; + Boolean magicNumberOK = True; + do { + + fid = OpenInputFile(env, fileName); + if (fid == NULL) break; + + // Now, having opened the input file, read the first few bytes, to + // check the required 'magic number': + magicNumberOK = False; // until we learn otherwise + Boolean isWideband = False; // by default + unsigned numChannels = 1; // by default + char buf[100]; + // Start with the first 6 bytes (the first 5 of which must be "#!AMR"): + if (fread(buf, 1, 6, fid) < 6) break; + if (strncmp(buf, "#!AMR", 5) != 0) break; // bad magic # + unsigned bytesRead = 6; + + // The next bytes must be "\n", "-WB\n", "_MC1.0\n", or "-WB_MC1.0\n" + if (buf[5] == '-') { + // The next bytes must be "WB\n" or "WB_MC1.0\n" + if (fread(&buf[bytesRead], 1, 3, fid) < 3) break; + if (strncmp(&buf[bytesRead], "WB", 2) != 0) break; // bad magic # + isWideband = True; + bytesRead += 3; + } + if (buf[bytesRead-1] == '_') { + // The next bytes must be "MC1.0\n" + if (fread(&buf[bytesRead], 1, 6, fid) < 6) break; + if (strncmp(&buf[bytesRead], "MC1.0\n", 6) != 0) break; // bad magic # + bytesRead += 6; + + // The next 4 bytes contain the number of channels: + char channelDesc[4]; + if (fread(channelDesc, 1, 4, fid) < 4) break; + numChannels = channelDesc[3]&0xF; + } else if (buf[bytesRead-1] != '\n') { + break; // bad magic # + } + + // If we get here, the magic number was OK: + magicNumberOK = True; + +#ifdef DEBUG + fprintf(stderr, "isWideband: %d, numChannels: %d\n", + isWideband, numChannels); +#endif + return new AMRAudioFileSource(env, fid, isWideband, numChannels); + } while (0); + + // An error occurred: + CloseInputFile(fid); + if (!magicNumberOK) { + env.setResultMsg("Bad (or nonexistent) AMR file header"); + } + return NULL; +} + +AMRAudioFileSource +::AMRAudioFileSource(UsageEnvironment& env, FILE* fid, + Boolean isWideband, unsigned numChannels) + : AMRAudioSource(env, isWideband, numChannels), + fFid(fid) { +} + +AMRAudioFileSource::~AMRAudioFileSource() { + CloseInputFile(fFid); +} + +// The mapping from the "FT" field to frame size. +// Values of 65535 are invalid. +#define FT_INVALID 65535 +static unsigned short const frameSize[16] = { + 12, 13, 15, 17, + 19, 20, 26, 31, + 5, FT_INVALID, FT_INVALID, FT_INVALID, + FT_INVALID, FT_INVALID, FT_INVALID, 0 +}; +static unsigned short const frameSizeWideband[16] = { + 17, 23, 32, 36, + 40, 46, 50, 58, + 60, 5, FT_INVALID, FT_INVALID, + FT_INVALID, FT_INVALID, 0, 0 +}; + +// Note: We should change the following to use asynchronous file reading, ##### +// as we now do with ByteStreamFileSource. ##### +void AMRAudioFileSource::doGetNextFrame() { + if (feof(fFid) || ferror(fFid)) { + handleClosure(); + return; + } + + // Begin by reading the 1-byte frame header (and checking it for validity) + while (1) { + if (fread(&fLastFrameHeader, 1, 1, fFid) < 1) { + handleClosure(); + return; + } + if ((fLastFrameHeader&0x83) != 0) { +#ifdef DEBUG + fprintf(stderr, "Invalid frame header 0x%02x (padding bits (0x83) are not zero)\n", fLastFrameHeader); +#endif + } else { + unsigned char ft = (fLastFrameHeader&0x78)>>3; + fFrameSize = fIsWideband ? frameSizeWideband[ft] : frameSize[ft]; + if (fFrameSize == FT_INVALID) { +#ifdef DEBUG + fprintf(stderr, "Invalid FT field %d (from frame header 0x%02x)\n", + ft, fLastFrameHeader); +#endif + } else { + // The frame header is OK +#ifdef DEBUG + fprintf(stderr, "Valid frame header 0x%02x -> ft %d -> frame size %d\n", fLastFrameHeader, ft, fFrameSize); +#endif + break; + } + } + } + + // Next, read the frame-block into the buffer provided: + fFrameSize *= fNumChannels; // because multiple channels make up a frame-block + if (fFrameSize > fMaxSize) { + fNumTruncatedBytes = fFrameSize - fMaxSize; + fFrameSize = fMaxSize; + } + fFrameSize = fread(fTo, 1, fFrameSize, fFid); + + // Set the 'presentation time': + if (fPresentationTime.tv_sec == 0 && fPresentationTime.tv_usec == 0) { + // This is the first frame, so use the current time: + gettimeofday(&fPresentationTime, NULL); + } else { + // Increment by the play time of the previous frame (20 ms) + unsigned uSeconds = fPresentationTime.tv_usec + 20000; + fPresentationTime.tv_sec += uSeconds/1000000; + fPresentationTime.tv_usec = uSeconds%1000000; + } + + fDurationInMicroseconds = 20000; // each frame is 20 ms + + // Switch to another task, and inform the reader that he has data: + nextTask() = envir().taskScheduler().scheduleDelayedTask(0, + (TaskFunc*)FramedSource::afterGetting, this); + } diff --git a/src/big/mpp/middleware/src/live555/liveMedia/AMRAudioRTPSink.cpp b/src/big/mpp/middleware/src/live555/liveMedia/AMRAudioRTPSink.cpp new file mode 100644 index 000000000..d74e1d94e --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/AMRAudioRTPSink.cpp @@ -0,0 +1,134 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP sink for AMR audio (RFC 4867) +// Implementation + +// NOTE: At present, this is just a limited implementation, supporting: +// octet-alignment only; no interleaving; no frame CRC; no robust-sorting. + +#include "AMRAudioRTPSink.hh" +#include "AMRAudioSource.hh" + +AMRAudioRTPSink* +AMRAudioRTPSink::createNew(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + Boolean sourceIsWideband, + unsigned numChannelsInSource) { + return new AMRAudioRTPSink(env, RTPgs, rtpPayloadFormat, + sourceIsWideband, numChannelsInSource); +} + +AMRAudioRTPSink +::AMRAudioRTPSink(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + Boolean sourceIsWideband, unsigned numChannelsInSource) + : AudioRTPSink(env, RTPgs, rtpPayloadFormat, + sourceIsWideband ? 16000 : 8000, + sourceIsWideband ? "AMR-WB": "AMR", + numChannelsInSource), + fSourceIsWideband(sourceIsWideband), fFmtpSDPLine(NULL) { +} + +AMRAudioRTPSink::~AMRAudioRTPSink() { + delete[] fFmtpSDPLine; +} + +Boolean AMRAudioRTPSink::sourceIsCompatibleWithUs(MediaSource& source) { + // Our source must be an AMR audio source: + if (!source.isAMRAudioSource()) return False; + + // Also, the source must be wideband iff we asked for this: + AMRAudioSource& amrSource = (AMRAudioSource&)source; + if ((amrSource.isWideband()^fSourceIsWideband) != 0) return False; + + // Also, the source must have the same number of channels that we + // specified. (It could, in principle, have more, but we don't + // support that.) + if (amrSource.numChannels() != numChannels()) return False; + + // Also, because in our current implementation we output only one + // frame in each RTP packet, this means that for multi-channel audio, + // each 'frame-block' will be split over multiple RTP packets, which + // may violate the spec. Warn about this: + if (amrSource.numChannels() > 1) { + envir() << "AMRAudioRTPSink: Warning: Input source has " << amrSource.numChannels() + << " audio channels. In the current implementation, the multi-frame frame-block will be split over multiple RTP packets\n"; + } + + return True; +} + +void AMRAudioRTPSink::doSpecialFrameHandling(unsigned fragmentationOffset, + unsigned char* frameStart, + unsigned numBytesInFrame, + struct timeval framePresentationTime, + unsigned numRemainingBytes) { + // If this is the 1st frame in the 1st packet, set the RTP 'M' (marker) + // bit (because this is considered the start of a talk spurt): + if (isFirstPacket() && isFirstFrameInPacket()) { + setMarkerBit(); + } + + // If this is the first frame in the packet, set the 1-byte payload + // header (using CMR 15) + if (isFirstFrameInPacket()) { + u_int8_t payloadHeader = 0xF0; + setSpecialHeaderBytes(&payloadHeader, 1, 0); + } + + // Set the TOC field for the current frame, based on the "FT" and "Q" + // values from our source: + AMRAudioSource* amrSource = (AMRAudioSource*)fSource; + if (amrSource == NULL) return; // sanity check + + u_int8_t toc = amrSource->lastFrameHeader(); + // Clear the "F" bit, because we're the last frame in this packet: ##### + toc &=~ 0x80; + setSpecialHeaderBytes(&toc, 1, 1+numFramesUsedSoFar()); + + // Important: Also call our base class's doSpecialFrameHandling(), + // to set the packet's timestamp: + MultiFramedRTPSink::doSpecialFrameHandling(fragmentationOffset, + frameStart, numBytesInFrame, + framePresentationTime, + numRemainingBytes); +} + +Boolean AMRAudioRTPSink +::frameCanAppearAfterPacketStart(unsigned char const* /*frameStart*/, + unsigned /*numBytesInFrame*/) const { + // For now, pack only one AMR frame into each outgoing RTP packet: ##### + return False; +} + +unsigned AMRAudioRTPSink::specialHeaderSize() const { + // For now, because we're packing only one frame per packet, + // there's just a 1-byte payload header, plus a 1-byte TOC ##### + return 2; +} + +char const* AMRAudioRTPSink::auxSDPLine() { + if (fFmtpSDPLine == NULL) { + // Generate a "a=fmtp:" line with "octet-aligned=1" + // (That is the only non-default parameter.) + char buf[100]; + sprintf(buf, "a=fmtp:%d octet-align=1\r\n", rtpPayloadType()); + delete[] fFmtpSDPLine; fFmtpSDPLine = strDup(buf); + } + return fFmtpSDPLine; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/AMRAudioRTPSource.cpp b/src/big/mpp/middleware/src/live555/liveMedia/AMRAudioRTPSource.cpp new file mode 100644 index 000000000..33ed6663e --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/AMRAudioRTPSource.cpp @@ -0,0 +1,749 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// AMR Audio RTP Sources (RFC 4867) +// Implementation + +#include "AMRAudioRTPSource.hh" +#include "MultiFramedRTPSource.hh" +#include "BitVector.hh" +#include +#include + +// This source is implemented internally by two separate sources: +// (i) a RTP source for the raw (and possibly interleaved) AMR frames, and +// (ii) a deinterleaving filter that reads from this. +// Define these two new classes here: + +class RawAMRRTPSource: public MultiFramedRTPSource { +public: + static RawAMRRTPSource* + createNew(UsageEnvironment& env, + Groupsock* RTPgs, unsigned char rtpPayloadFormat, + Boolean isWideband, Boolean isOctetAligned, + Boolean isInterleaved, Boolean CRCsArePresent); + + Boolean isWideband() const { return fIsWideband; } + unsigned char ILL() const { return fILL; } + unsigned char ILP() const { return fILP; } + unsigned TOCSize() const { return fTOCSize; } // total # of frames in the last pkt + unsigned char* TOC() const { return fTOC; } // FT+Q value for each TOC entry + unsigned& frameIndex() { return fFrameIndex; } // index of frame-block within pkt + Boolean& isSynchronized() { return fIsSynchronized; } + +private: + RawAMRRTPSource(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + Boolean isWideband, Boolean isOctetAligned, + Boolean isInterleaved, Boolean CRCsArePresent); + // called only by createNew() + + virtual ~RawAMRRTPSource(); + +private: + // redefined virtual functions: + virtual Boolean hasBeenSynchronizedUsingRTCP(); + + virtual Boolean processSpecialHeader(BufferedPacket* packet, + unsigned& resultSpecialHeaderSize); + virtual char const* MIMEtype() const; + +private: + Boolean fIsWideband, fIsOctetAligned, fIsInterleaved, fCRCsArePresent; + unsigned char fILL, fILP; + unsigned fTOCSize; + unsigned char* fTOC; + unsigned fFrameIndex; + Boolean fIsSynchronized; +}; + +class AMRDeinterleaver: public AMRAudioSource { +public: + static AMRDeinterleaver* + createNew(UsageEnvironment& env, + Boolean isWideband, unsigned numChannels, unsigned maxInterleaveGroupSize, + RawAMRRTPSource* inputSource); + +private: + AMRDeinterleaver(UsageEnvironment& env, + Boolean isWideband, unsigned numChannels, + unsigned maxInterleaveGroupSize, RawAMRRTPSource* inputSource); + // called only by "createNew()" + + virtual ~AMRDeinterleaver(); + + static void afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + void afterGettingFrame1(unsigned frameSize, struct timeval presentationTime); + +private: + // Redefined virtual functions: + void doGetNextFrame(); + virtual void doStopGettingFrames(); + +private: + RawAMRRTPSource* fInputSource; + class AMRDeinterleavingBuffer* fDeinterleavingBuffer; + Boolean fNeedAFrame; +}; + + +////////// AMRAudioRTPSource implementation ////////// + +#define MAX_NUM_CHANNELS 20 // far larger than ever expected... +#define MAX_INTERLEAVING_GROUP_SIZE 1000 // far larger than ever expected... + +AMRAudioSource* +AMRAudioRTPSource::createNew(UsageEnvironment& env, + Groupsock* RTPgs, + RTPSource*& resultRTPSource, + unsigned char rtpPayloadFormat, + Boolean isWideband, + unsigned numChannels, + Boolean isOctetAligned, + unsigned interleaving, + Boolean robustSortingOrder, + Boolean CRCsArePresent) { + // Perform sanity checks on the input parameters: + if (robustSortingOrder) { + env << "AMRAudioRTPSource::createNew(): 'Robust sorting order' was specified, but we don't yet support this!\n"; + return NULL; + } else if (numChannels > MAX_NUM_CHANNELS) { + env << "AMRAudioRTPSource::createNew(): The \"number of channels\" parameter (" + << numChannels << ") is much too large!\n"; + return NULL; + } else if (interleaving > MAX_INTERLEAVING_GROUP_SIZE) { + env << "AMRAudioRTPSource::createNew(): The \"interleaving\" parameter (" + << interleaving << ") is much too large!\n"; + return NULL; + } + + // 'Bandwidth-efficient mode' precludes some other options: + if (!isOctetAligned) { + if (interleaving > 0 || robustSortingOrder || CRCsArePresent) { + env << "AMRAudioRTPSource::createNew(): 'Bandwidth-efficient mode' was specified, along with interleaving, 'robust sorting order', and/or CRCs, so we assume 'octet-aligned mode' instead.\n"; + isOctetAligned = True; + } + } + + Boolean isInterleaved; + unsigned maxInterleaveGroupSize; // in frames (not frame-blocks) + if (interleaving > 0) { + isInterleaved = True; + maxInterleaveGroupSize = interleaving*numChannels; + } else { + isInterleaved = False; + maxInterleaveGroupSize = numChannels; + } + + RawAMRRTPSource* rawRTPSource; + resultRTPSource = rawRTPSource + = RawAMRRTPSource::createNew(env, RTPgs, rtpPayloadFormat, + isWideband, isOctetAligned, + isInterleaved, CRCsArePresent); + if (resultRTPSource == NULL) return NULL; + + AMRDeinterleaver* deinterleaver + = AMRDeinterleaver::createNew(env, isWideband, numChannels, + maxInterleaveGroupSize, rawRTPSource); + if (deinterleaver == NULL) { + Medium::close(resultRTPSource); + resultRTPSource = NULL; + } + + return deinterleaver; +} + + +////////// AMRBufferedPacket and AMRBufferedPacketFactory ////////// + +// A subclass of BufferedPacket, used to separate out AMR frames. + +class AMRBufferedPacket: public BufferedPacket { +public: + AMRBufferedPacket(RawAMRRTPSource& ourSource); + virtual ~AMRBufferedPacket(); + +private: // redefined virtual functions + virtual unsigned nextEnclosedFrameSize(unsigned char*& framePtr, + unsigned dataSize); +private: + RawAMRRTPSource& fOurSource; +}; + +class AMRBufferedPacketFactory: public BufferedPacketFactory { +private: // redefined virtual functions + virtual BufferedPacket* createNewPacket(MultiFramedRTPSource* ourSource); +}; + + +///////// RawAMRRTPSource implementation //////// + +RawAMRRTPSource* +RawAMRRTPSource::createNew(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + Boolean isWideband, Boolean isOctetAligned, + Boolean isInterleaved, Boolean CRCsArePresent) { + return new RawAMRRTPSource(env, RTPgs, rtpPayloadFormat, + isWideband, isOctetAligned, + isInterleaved, CRCsArePresent); +} + +RawAMRRTPSource +::RawAMRRTPSource(UsageEnvironment& env, + Groupsock* RTPgs, unsigned char rtpPayloadFormat, + Boolean isWideband, Boolean isOctetAligned, + Boolean isInterleaved, Boolean CRCsArePresent) + : MultiFramedRTPSource(env, RTPgs, rtpPayloadFormat, + isWideband ? 16000 : 8000, + new AMRBufferedPacketFactory), + fIsWideband(isWideband), fIsOctetAligned(isOctetAligned), + fIsInterleaved(isInterleaved), fCRCsArePresent(CRCsArePresent), + fILL(0), fILP(0), fTOCSize(0), fTOC(NULL), fFrameIndex(0), fIsSynchronized(False) { +} + +RawAMRRTPSource::~RawAMRRTPSource() { + delete[] fTOC; +} + +#define FT_SPEECH_LOST 14 +#define FT_NO_DATA 15 + +static void unpackBandwidthEfficientData(BufferedPacket* packet, + Boolean isWideband); // forward + +Boolean RawAMRRTPSource +::processSpecialHeader(BufferedPacket* packet, + unsigned& resultSpecialHeaderSize) { + // If the data is 'bandwidth-efficient', first unpack it so that it's + // 'octet-aligned': + if (!fIsOctetAligned) unpackBandwidthEfficientData(packet, fIsWideband); + + unsigned char* headerStart = packet->data(); + unsigned packetSize = packet->dataSize(); + + // There's at least a 1-byte header, containing the CMR: + if (packetSize < 1) return False; + resultSpecialHeaderSize = 1; + + if (fIsInterleaved) { + // There's an extra byte, containing the interleave parameters: + if (packetSize < 2) return False; + + // Get the interleaving parameters, and check them for validity: + unsigned char const secondByte = headerStart[1]; + fILL = (secondByte&0xF0)>>4; + fILP = secondByte&0x0F; + if (fILP > fILL) return False; // invalid + ++resultSpecialHeaderSize; + } +#ifdef DEBUG + fprintf(stderr, "packetSize: %d, ILL: %d, ILP: %d\n", packetSize, fILL, fILP); +#endif + fFrameIndex = 0; // initially + + // Next, there's a "Payload Table of Contents" (one byte per entry): + unsigned numFramesPresent = 0, numNonEmptyFramesPresent = 0; + unsigned tocStartIndex = resultSpecialHeaderSize; + Boolean F; + do { + if (resultSpecialHeaderSize >= packetSize) return False; + unsigned char const tocByte = headerStart[resultSpecialHeaderSize++]; + F = (tocByte&0x80) != 0; + unsigned char const FT = (tocByte&0x78) >> 3; +#ifdef DEBUG + unsigned char Q = (tocByte&0x04)>>2; + fprintf(stderr, "\tTOC entry: F %d, FT %d, Q %d\n", F, FT, Q); +#endif + ++numFramesPresent; + if (FT != FT_SPEECH_LOST && FT != FT_NO_DATA) ++numNonEmptyFramesPresent; + } while (F); +#ifdef DEBUG + fprintf(stderr, "TOC contains %d entries (%d non-empty)\n", numFramesPresent, numNonEmptyFramesPresent); +#endif + + // Now that we know the size of the TOC, fill in our copy: + if (numFramesPresent > fTOCSize) { + delete[] fTOC; + fTOC = new unsigned char[numFramesPresent]; + } + fTOCSize = numFramesPresent; + for (unsigned i = 0; i < fTOCSize; ++i) { + unsigned char const tocByte = headerStart[tocStartIndex + i]; + fTOC[i] = tocByte&0x7C; // clear everything except the F and Q fields + } + + if (fCRCsArePresent) { + // 'numNonEmptyFramesPresent' CRC bytes will follow. + // Note: we currently don't check the CRCs for validity ##### + resultSpecialHeaderSize += numNonEmptyFramesPresent; +#ifdef DEBUG + fprintf(stderr, "Ignoring %d following CRC bytes\n", numNonEmptyFramesPresent); +#endif + if (resultSpecialHeaderSize > packetSize) return False; + } +#ifdef DEBUG + fprintf(stderr, "Total special header size: %d\n", resultSpecialHeaderSize); +#endif + + return True; +} + +char const* RawAMRRTPSource::MIMEtype() const { + return fIsWideband ? "audio/AMR-WB" : "audio/AMR"; +} + +Boolean RawAMRRTPSource::hasBeenSynchronizedUsingRTCP() { + return fIsSynchronized; +} + + +///// AMRBufferedPacket and AMRBufferedPacketFactory implementation + +AMRBufferedPacket::AMRBufferedPacket(RawAMRRTPSource& ourSource) + : fOurSource(ourSource) { +} + +AMRBufferedPacket::~AMRBufferedPacket() { +} + +// The mapping from the "FT" field to frame size. +// Values of 65535 are invalid. +#define FT_INVALID 65535 +static unsigned short const frameBytesFromFT[16] = { + 12, 13, 15, 17, + 19, 20, 26, 31, + 5, FT_INVALID, FT_INVALID, FT_INVALID, + FT_INVALID, FT_INVALID, FT_INVALID, 0 +}; +static unsigned short const frameBytesFromFTWideband[16] = { + 17, 23, 32, 36, + 40, 46, 50, 58, + 60, 5, FT_INVALID, FT_INVALID, + FT_INVALID, FT_INVALID, 0, 0 +}; + +unsigned AMRBufferedPacket:: + nextEnclosedFrameSize(unsigned char*& framePtr, unsigned dataSize) { + if (dataSize == 0) return 0; // sanity check + + // The size of the AMR frame is determined by the corresponding 'FT' value + // in the packet's Table of Contents. + unsigned const tocIndex = fOurSource.frameIndex(); + if (tocIndex >= fOurSource.TOCSize()) return 0; // sanity check + + unsigned char const tocByte = fOurSource.TOC()[tocIndex]; + unsigned char const FT = (tocByte&0x78) >> 3; + // ASSERT: FT < 16 + unsigned short frameSize + = fOurSource.isWideband() ? frameBytesFromFTWideband[FT] : frameBytesFromFT[FT]; + if (frameSize == FT_INVALID) { + // Strange TOC entry! + fOurSource.envir() << "AMRBufferedPacket::nextEnclosedFrameSize(): invalid FT: " << FT << "\n"; + frameSize = 0; // This probably messes up the rest of this packet, but... + } +#ifdef DEBUG + fprintf(stderr, "AMRBufferedPacket::nextEnclosedFrameSize(): frame #: %d, FT: %d, isWideband: %d => frameSize: %d (dataSize: %d)\n", tocIndex, FT, fOurSource.isWideband(), frameSize, dataSize); +#endif + ++fOurSource.frameIndex(); + + if (dataSize < frameSize) return 0; + return frameSize; +} + +BufferedPacket* AMRBufferedPacketFactory +::createNewPacket(MultiFramedRTPSource* ourSource) { + return new AMRBufferedPacket((RawAMRRTPSource&)(*ourSource)); +} + +///////// AMRDeinterleavingBuffer ///////// +// (used to implement AMRDeinterleaver) + +#define AMR_MAX_FRAME_SIZE 60 + +class AMRDeinterleavingBuffer { +public: + AMRDeinterleavingBuffer(unsigned numChannels, unsigned maxInterleaveGroupSize); + virtual ~AMRDeinterleavingBuffer(); + + void deliverIncomingFrame(unsigned frameSize, RawAMRRTPSource* source, + struct timeval presentationTime); + Boolean retrieveFrame(unsigned char* to, unsigned maxSize, + unsigned& resultFrameSize, unsigned& resultNumTruncatedBytes, + u_int8_t& resultFrameHeader, + struct timeval& resultPresentationTime, + Boolean& resultIsSynchronized); + + unsigned char* inputBuffer() { return fInputBuffer; } + unsigned inputBufferSize() const { return AMR_MAX_FRAME_SIZE; } + +private: + unsigned char* createNewBuffer(); + + class FrameDescriptor { + public: + FrameDescriptor(); + virtual ~FrameDescriptor(); + + unsigned frameSize; + unsigned char* frameData; + u_int8_t frameHeader; + struct timeval presentationTime; + Boolean fIsSynchronized; + }; + + unsigned fNumChannels, fMaxInterleaveGroupSize; + FrameDescriptor* fFrames[2]; + unsigned char fIncomingBankId; // toggles between 0 and 1 + unsigned char fIncomingBinMax; // in the incoming bank + unsigned char fOutgoingBinMax; // in the outgoing bank + unsigned char fNextOutgoingBin; + Boolean fHaveSeenPackets; + u_int16_t fLastPacketSeqNumForGroup; + unsigned char* fInputBuffer; + struct timeval fLastRetrievedPresentationTime; + unsigned fNumSuccessiveSyncedFrames; + unsigned char fILL; +}; + + +////////// AMRDeinterleaver implementation ///////// + +AMRDeinterleaver* AMRDeinterleaver +::createNew(UsageEnvironment& env, + Boolean isWideband, unsigned numChannels, unsigned maxInterleaveGroupSize, + RawAMRRTPSource* inputSource) { + return new AMRDeinterleaver(env, isWideband, numChannels, maxInterleaveGroupSize, inputSource); +} + +AMRDeinterleaver::AMRDeinterleaver(UsageEnvironment& env, + Boolean isWideband, unsigned numChannels, + unsigned maxInterleaveGroupSize, + RawAMRRTPSource* inputSource) + : AMRAudioSource(env, isWideband, numChannels), + fInputSource(inputSource), fNeedAFrame(False) { + fDeinterleavingBuffer + = new AMRDeinterleavingBuffer(numChannels, maxInterleaveGroupSize); +} + +AMRDeinterleaver::~AMRDeinterleaver() { + delete fDeinterleavingBuffer; + Medium::close(fInputSource); +} + +static unsigned const uSecsPerFrame = 20000; // 20 ms + +void AMRDeinterleaver::doGetNextFrame() { + // First, try getting a frame from the deinterleaving buffer: + if (fDeinterleavingBuffer->retrieveFrame(fTo, fMaxSize, + fFrameSize, fNumTruncatedBytes, + fLastFrameHeader, fPresentationTime, + fInputSource->isSynchronized())) { + + // Success! + fNeedAFrame = False; + + fDurationInMicroseconds = uSecsPerFrame; + + // Call our own 'after getting' function. Because we're not a 'leaf' + // source, we can call this directly, without risking + // infinite recursion + afterGetting(this); + return; + } + + // No luck, so ask our source for help: + fNeedAFrame = True; + if (!fInputSource->isCurrentlyAwaitingData()) { + fInputSource->getNextFrame(fDeinterleavingBuffer->inputBuffer(), + fDeinterleavingBuffer->inputBufferSize(), + afterGettingFrame, this, + FramedSource::handleClosure, this); + } +} + +void AMRDeinterleaver::doStopGettingFrames() { + fNeedAFrame = False; + fInputSource->stopGettingFrames(); +} + +void AMRDeinterleaver +::afterGettingFrame(void* clientData, unsigned frameSize, + unsigned /*numTruncatedBytes*/, + struct timeval presentationTime, + unsigned /*durationInMicroseconds*/) { + AMRDeinterleaver* deinterleaver = (AMRDeinterleaver*)clientData; + deinterleaver->afterGettingFrame1(frameSize, presentationTime); +} + +void AMRDeinterleaver +::afterGettingFrame1(unsigned frameSize, struct timeval presentationTime) { + RawAMRRTPSource* source = (RawAMRRTPSource*)fInputSource; + + // First, put the frame into our deinterleaving buffer: + fDeinterleavingBuffer->deliverIncomingFrame(frameSize, source, presentationTime); + + // Then, try delivering a frame to the client (if he wants one): + if (fNeedAFrame) doGetNextFrame(); +} + + +////////// AMRDeinterleavingBuffer implementation ///////// + +AMRDeinterleavingBuffer +::AMRDeinterleavingBuffer(unsigned numChannels, unsigned maxInterleaveGroupSize) + : fNumChannels(numChannels), fMaxInterleaveGroupSize(maxInterleaveGroupSize), + fIncomingBankId(0), fIncomingBinMax(0), + fOutgoingBinMax(0), fNextOutgoingBin(0), + fHaveSeenPackets(False), fNumSuccessiveSyncedFrames(0), fILL(0) { + // Use two banks of descriptors - one for incoming, one for outgoing + fFrames[0] = new FrameDescriptor[fMaxInterleaveGroupSize]; + fFrames[1] = new FrameDescriptor[fMaxInterleaveGroupSize]; + fInputBuffer = createNewBuffer(); +} + +AMRDeinterleavingBuffer::~AMRDeinterleavingBuffer() { + delete[] fInputBuffer; + delete[] fFrames[0]; delete[] fFrames[1]; +} + +void AMRDeinterleavingBuffer +::deliverIncomingFrame(unsigned frameSize, RawAMRRTPSource* source, + struct timeval presentationTime) { + fILL = source->ILL(); + unsigned char const ILP = source->ILP(); + unsigned frameIndex = source->frameIndex(); + unsigned short packetSeqNum = source->curPacketRTPSeqNum(); + + // First perform a sanity check on the parameters: + // (This is overkill, as the source should have already done this.) + if (ILP > fILL || frameIndex == 0) { +#ifdef DEBUG + fprintf(stderr, "AMRDeinterleavingBuffer::deliverIncomingFrame() param sanity check failed (%d,%d,%d,%d)\n", frameSize, fILL, ILP, frameIndex); +#endif + source->envir().internalError(); + } + + --frameIndex; // because it was incremented by the source when this frame was read + u_int8_t frameHeader; + if (frameIndex >= source->TOCSize()) { // sanity check + frameHeader = FT_NO_DATA<<3; + } else { + frameHeader = source->TOC()[frameIndex]; + } + + unsigned frameBlockIndex = frameIndex/fNumChannels; + unsigned frameWithinFrameBlock = frameIndex%fNumChannels; + + // The input "presentationTime" was that of the first frame-block in this + // packet. Update it for the current frame: + unsigned uSecIncrement = frameBlockIndex*(fILL+1)*uSecsPerFrame; + presentationTime.tv_usec += uSecIncrement; + presentationTime.tv_sec += presentationTime.tv_usec/1000000; + presentationTime.tv_usec = presentationTime.tv_usec%1000000; + + // Next, check whether this packet is part of a new interleave group + if (!fHaveSeenPackets + || seqNumLT(fLastPacketSeqNumForGroup, packetSeqNum + frameBlockIndex)) { + // We've moved to a new interleave group +#ifdef DEBUG + fprintf(stderr, "AMRDeinterleavingBuffer::deliverIncomingFrame(): new interleave group\n"); +#endif + fHaveSeenPackets = True; + fLastPacketSeqNumForGroup = packetSeqNum + fILL - ILP; + + // Switch the incoming and outgoing banks: + fIncomingBankId ^= 1; + unsigned char tmp = fIncomingBinMax; + fIncomingBinMax = fOutgoingBinMax; + fOutgoingBinMax = tmp; + fNextOutgoingBin = 0; + } + + // Now move the incoming frame into the appropriate bin: + unsigned const binNumber + = ((ILP + frameBlockIndex*(fILL+1))*fNumChannels + frameWithinFrameBlock) + % fMaxInterleaveGroupSize; // the % is for sanity +#ifdef DEBUG + fprintf(stderr, "AMRDeinterleavingBuffer::deliverIncomingFrame(): frameIndex %d (%d,%d) put in bank %d, bin %d (%d): size %d, header 0x%02x, presentationTime %lu.%06ld\n", frameIndex, frameBlockIndex, frameWithinFrameBlock, fIncomingBankId, binNumber, fMaxInterleaveGroupSize, frameSize, frameHeader, presentationTime.tv_sec, presentationTime.tv_usec); +#endif + FrameDescriptor& inBin = fFrames[fIncomingBankId][binNumber]; + unsigned char* curBuffer = inBin.frameData; + inBin.frameData = fInputBuffer; + inBin.frameSize = frameSize; + inBin.frameHeader = frameHeader; + inBin.presentationTime = presentationTime; + inBin.fIsSynchronized = ((RTPSource*)source)->RTPSource::hasBeenSynchronizedUsingRTCP(); + + if (curBuffer == NULL) curBuffer = createNewBuffer(); + fInputBuffer = curBuffer; + + if (binNumber >= fIncomingBinMax) { + fIncomingBinMax = binNumber + 1; + } +} + +Boolean AMRDeinterleavingBuffer +::retrieveFrame(unsigned char* to, unsigned maxSize, + unsigned& resultFrameSize, unsigned& resultNumTruncatedBytes, + u_int8_t& resultFrameHeader, + struct timeval& resultPresentationTime, + Boolean& resultIsSynchronized) { + + if (fNextOutgoingBin >= fOutgoingBinMax) return False; // none left + + FrameDescriptor& outBin = fFrames[fIncomingBankId^1][fNextOutgoingBin]; + unsigned char* fromPtr = outBin.frameData; + unsigned char fromSize = outBin.frameSize; + outBin.frameSize = 0; // for the next time this bin is used + resultIsSynchronized = False; // by default; can be changed by: + if (outBin.fIsSynchronized) { + // Don't consider the outgoing frame to be synchronized until we've received at least a complete interleave cycle of + // synchronized frames. This ensures that the receiver will be getting all synchronized frames from now on. + if (++fNumSuccessiveSyncedFrames > fILL) { + resultIsSynchronized = True; + fNumSuccessiveSyncedFrames = fILL+1; // prevents overflow + } + } else { + fNumSuccessiveSyncedFrames = 0; + } + + // Check whether this frame is missing; if so, return a FT_NO_DATA frame: + if (fromSize == 0) { + resultFrameHeader = FT_NO_DATA<<3; + + // Compute this erasure frame's presentation time via extrapolation: + resultPresentationTime = fLastRetrievedPresentationTime; + resultPresentationTime.tv_usec += uSecsPerFrame; + if (resultPresentationTime.tv_usec >= 1000000) { + ++resultPresentationTime.tv_sec; + resultPresentationTime.tv_usec -= 1000000; + } + } else { + // Normal case - a frame exists: + resultFrameHeader = outBin.frameHeader; + resultPresentationTime = outBin.presentationTime; + } + + fLastRetrievedPresentationTime = resultPresentationTime; + + if (fromSize > maxSize) { + resultNumTruncatedBytes = fromSize - maxSize; + resultFrameSize = maxSize; + } else { + resultNumTruncatedBytes = 0; + resultFrameSize = fromSize; + } + memmove(to, fromPtr, resultFrameSize); +#ifdef DEBUG + fprintf(stderr, "AMRDeinterleavingBuffer::retrieveFrame(): from bank %d, bin %d: size %d, header 0x%02x, presentationTime %lu.%06ld\n", fIncomingBankId^1, fNextOutgoingBin, resultFrameSize, resultFrameHeader, resultPresentationTime.tv_sec, resultPresentationTime.tv_usec); +#endif + + ++fNextOutgoingBin; + return True; +} + +unsigned char* AMRDeinterleavingBuffer::createNewBuffer() { + return new unsigned char[inputBufferSize()]; +} + +AMRDeinterleavingBuffer::FrameDescriptor::FrameDescriptor() + : frameSize(0), frameData(NULL) { +} + +AMRDeinterleavingBuffer::FrameDescriptor::~FrameDescriptor() { + delete[] frameData; +} + +// Unpack bandwidth-aligned data to octet-aligned: +static unsigned short const frameBitsFromFT[16] = { + 95, 103, 118, 134, + 148, 159, 204, 244, + 39, 0, 0, 0, + 0, 0, 0, 0 +}; +static unsigned short const frameBitsFromFTWideband[16] = { + 132, 177, 253, 285, + 317, 365, 397, 461, + 477, 40, 0, 0, + 0, 0, 0, 0 +}; + +static void unpackBandwidthEfficientData(BufferedPacket* packet, + Boolean isWideband) { +#ifdef DEBUG + fprintf(stderr, "Unpacking 'bandwidth-efficient' payload (%d bytes):\n", packet->dataSize()); + for (unsigned j = 0; j < packet->dataSize(); ++j) { + fprintf(stderr, "%02x:", (packet->data())[j]); + } + fprintf(stderr, "\n"); +#endif + BitVector fromBV(packet->data(), 0, 8*packet->dataSize()); + + unsigned const toBufferSize = 2*packet->dataSize(); // conservatively large + unsigned char* toBuffer = new unsigned char[toBufferSize]; + unsigned toCount = 0; + + // Begin with the payload header: + unsigned CMR = fromBV.getBits(4); + toBuffer[toCount++] = CMR << 4; + + // Then, run through and unpack the TOC entries: + while (1) { + unsigned toc = fromBV.getBits(6); + toBuffer[toCount++] = toc << 2; + + if ((toc&0x20) == 0) break; // the F bit is 0 + } + + // Then, using the TOC data, unpack each frame payload: + unsigned const tocSize = toCount - 1; + for (unsigned i = 1; i <= tocSize; ++i) { + unsigned char tocByte = toBuffer[i]; + unsigned char const FT = (tocByte&0x78) >> 3; + unsigned short frameSizeBits + = isWideband ? frameBitsFromFTWideband[FT] : frameBitsFromFT[FT]; + unsigned short frameSizeBytes = (frameSizeBits+7)/8; + + if (frameSizeBits > fromBV.numBitsRemaining()) { +#ifdef DEBUG + fprintf(stderr, "\tWarning: Unpacking frame %d of %d: want %d bits, but only %d are available!\n", i, tocSize, frameSizeBits, fromBV.numBitsRemaining()); +#endif + break; + } + + shiftBits(&toBuffer[toCount], 0, // to + packet->data(), fromBV.curBitIndex(), // from + frameSizeBits // num bits + ); + fromBV.skipBits(frameSizeBits); + toCount += frameSizeBytes; + } + +#ifdef DEBUG + if (fromBV.numBitsRemaining() > 7) { + fprintf(stderr, "\tWarning: %d bits remain unused!\n", fromBV.numBitsRemaining()); + } +#endif + + // Finally, replace the current packet data with the unpacked data: + packet->removePadding(packet->dataSize()); // throws away current packet data + packet->appendData(toBuffer, toCount); + delete[] toBuffer; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/AMRAudioSource.cpp b/src/big/mpp/middleware/src/live555/liveMedia/AMRAudioSource.cpp new file mode 100644 index 000000000..0c9c5d048 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/AMRAudioSource.cpp @@ -0,0 +1,38 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A source object for AMR audio sources +// Implementation + +#include "AMRAudioSource.hh" + +AMRAudioSource::AMRAudioSource(UsageEnvironment& env, + Boolean isWideband, unsigned numChannels) + : FramedSource(env), + fIsWideband(isWideband), fNumChannels(numChannels), fLastFrameHeader(0) { +} + +AMRAudioSource::~AMRAudioSource() { +} + +char const* AMRAudioSource::MIMEtype() const { + return "audio/AMR"; +} + +Boolean AMRAudioSource::isAMRAudioSource() const { + return True; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/AVIFileSink.cpp b/src/big/mpp/middleware/src/live555/liveMedia/AVIFileSink.cpp new file mode 100644 index 000000000..0b06e08c3 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/AVIFileSink.cpp @@ -0,0 +1,789 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A sink that generates an AVI file from a composite media session +// Implementation + +#include "AVIFileSink.hh" +#include "InputFile.hh" +#include "OutputFile.hh" +#include "GroupsockHelper.hh" + +#define fourChar(x,y,z,w) ( ((w)<<24)|((z)<<16)|((y)<<8)|(x) )/*little-endian*/ + +#define AVIIF_LIST 0x00000001 +#define AVIIF_KEYFRAME 0x00000010 +#define AVIIF_NO_TIME 0x00000100 +#define AVIIF_COMPRESSOR 0x0FFF0000 + +////////// AVISubsessionIOState /////////// +// A structure used to represent the I/O state of each input 'subsession': + +class SubsessionBuffer { +public: + SubsessionBuffer(unsigned bufferSize) + : fBufferSize(bufferSize) { + reset(); + fData = new unsigned char[bufferSize]; + } + virtual ~SubsessionBuffer() { delete[] fData; } + void reset() { fBytesInUse = 0; } + void addBytes(unsigned numBytes) { fBytesInUse += numBytes; } + + unsigned char* dataStart() { return &fData[0]; } + unsigned char* dataEnd() { return &fData[fBytesInUse]; } + unsigned bytesInUse() const { return fBytesInUse; } + unsigned bytesAvailable() const { return fBufferSize - fBytesInUse; } + + void setPresentationTime(struct timeval const& presentationTime) { + fPresentationTime = presentationTime; + } + struct timeval const& presentationTime() const {return fPresentationTime;} + +private: + unsigned fBufferSize; + struct timeval fPresentationTime; + unsigned char* fData; + unsigned fBytesInUse; +}; + +class AVISubsessionIOState { +public: + AVISubsessionIOState(AVIFileSink& sink, MediaSubsession& subsession); + virtual ~AVISubsessionIOState(); + + void setAVIstate(unsigned subsessionIndex); + void setFinalAVIstate(); + + void afterGettingFrame(unsigned packetDataSize, + struct timeval presentationTime); + void onSourceClosure(); + + UsageEnvironment& envir() const { return fOurSink.envir(); } + +public: + SubsessionBuffer *fBuffer, *fPrevBuffer; + AVIFileSink& fOurSink; + MediaSubsession& fOurSubsession; + + unsigned short fLastPacketRTPSeqNum; + Boolean fOurSourceIsActive; + struct timeval fPrevPresentationTime; + unsigned fMaxBytesPerSecond; + Boolean fIsVideo, fIsAudio, fIsByteSwappedAudio; + unsigned fAVISubsessionTag; + unsigned fAVICodecHandlerType; + unsigned fAVISamplingFrequency; // for audio + u_int16_t fWAVCodecTag; // for audio + unsigned fAVIScale; + unsigned fAVIRate; + unsigned fAVISize; + unsigned fNumFrames; + unsigned fSTRHFrameCountPosition; + +private: + void useFrame(SubsessionBuffer& buffer); +}; + + +///////// AVIIndexRecord definition & implementation ////////// + +class AVIIndexRecord { +public: + AVIIndexRecord(unsigned chunkId, unsigned flags, unsigned offset, unsigned size) + : fNext(NULL), fChunkId(chunkId), fFlags(flags), fOffset(offset), fSize(size) { + } + + AVIIndexRecord*& next() { return fNext; } + unsigned chunkId() const { return fChunkId; } + unsigned flags() const { return fFlags; } + unsigned offset() const { return fOffset; } + unsigned size() const { return fSize; } + +private: + AVIIndexRecord* fNext; + unsigned fChunkId; + unsigned fFlags; + unsigned fOffset; + unsigned fSize; +}; + + +////////// AVIFileSink implementation ////////// + +AVIFileSink::AVIFileSink(UsageEnvironment& env, + MediaSession& inputSession, + char const* outputFileName, + unsigned bufferSize, + unsigned short movieWidth, unsigned short movieHeight, + unsigned movieFPS, Boolean packetLossCompensate) + : Medium(env), fInputSession(inputSession), + fIndexRecordsHead(NULL), fIndexRecordsTail(NULL), fNumIndexRecords(0), + fBufferSize(bufferSize), fPacketLossCompensate(packetLossCompensate), + fAreCurrentlyBeingPlayed(False), fNumSubsessions(0), fNumBytesWritten(0), + fHaveCompletedOutputFile(False), + fMovieWidth(movieWidth), fMovieHeight(movieHeight), fMovieFPS(movieFPS) { + fOutFid = OpenOutputFile(env, outputFileName); + if (fOutFid == NULL) return; + + // Set up I/O state for each input subsession: + MediaSubsessionIterator iter(fInputSession); + MediaSubsession* subsession; + while ((subsession = iter.next()) != NULL) { + // Ignore subsessions without a data source: + FramedSource* subsessionSource = subsession->readSource(); + if (subsessionSource == NULL) continue; + + // If "subsession's" SDP description specified screen dimension + // or frame rate parameters, then use these. + if (subsession->videoWidth() != 0) { + fMovieWidth = subsession->videoWidth(); + } + if (subsession->videoHeight() != 0) { + fMovieHeight = subsession->videoHeight(); + } + if (subsession->videoFPS() != 0) { + fMovieFPS = subsession->videoFPS(); + } + + AVISubsessionIOState* ioState + = new AVISubsessionIOState(*this, *subsession); + subsession->miscPtr = (void*)ioState; + + // Also set a 'BYE' handler for this subsession's RTCP instance: + if (subsession->rtcpInstance() != NULL) { + subsession->rtcpInstance()->setByeHandler(onRTCPBye, ioState); + } + + ++fNumSubsessions; + } + + // Begin by writing an AVI header: + addFileHeader_AVI(); +} + +AVIFileSink::~AVIFileSink() { + completeOutputFile(); + + // Then, stop streaming and delete each active "AVISubsessionIOState": + MediaSubsessionIterator iter(fInputSession); + MediaSubsession* subsession; + while ((subsession = iter.next()) != NULL) { + if (subsession->readSource() != NULL) subsession->readSource()->stopGettingFrames(); + + AVISubsessionIOState* ioState + = (AVISubsessionIOState*)(subsession->miscPtr); + if (ioState == NULL) continue; + + delete ioState; + } + + // Then, delete the index records: + AVIIndexRecord* cur = fIndexRecordsHead; + while (cur != NULL) { + AVIIndexRecord* next = cur->next(); + delete cur; + cur = next; + } + + // Finally, close our output file: + CloseOutputFile(fOutFid); +} + +AVIFileSink* AVIFileSink +::createNew(UsageEnvironment& env, MediaSession& inputSession, + char const* outputFileName, + unsigned bufferSize, + unsigned short movieWidth, unsigned short movieHeight, + unsigned movieFPS, Boolean packetLossCompensate) { + AVIFileSink* newSink = + new AVIFileSink(env, inputSession, outputFileName, bufferSize, + movieWidth, movieHeight, movieFPS, packetLossCompensate); + if (newSink == NULL || newSink->fOutFid == NULL) { + Medium::close(newSink); + return NULL; + } + + return newSink; +} + +Boolean AVIFileSink::startPlaying(afterPlayingFunc* afterFunc, + void* afterClientData) { + // Make sure we're not already being played: + if (fAreCurrentlyBeingPlayed) { + envir().setResultMsg("This sink has already been played"); + return False; + } + + fAreCurrentlyBeingPlayed = True; + fAfterFunc = afterFunc; + fAfterClientData = afterClientData; + + return continuePlaying(); +} + +Boolean AVIFileSink::continuePlaying() { + // Run through each of our input session's 'subsessions', + // asking for a frame from each one: + Boolean haveActiveSubsessions = False; + MediaSubsessionIterator iter(fInputSession); + MediaSubsession* subsession; + while ((subsession = iter.next()) != NULL) { + FramedSource* subsessionSource = subsession->readSource(); + if (subsessionSource == NULL) continue; + + if (subsessionSource->isCurrentlyAwaitingData()) continue; + + AVISubsessionIOState* ioState + = (AVISubsessionIOState*)(subsession->miscPtr); + if (ioState == NULL) continue; + + haveActiveSubsessions = True; + unsigned char* toPtr = ioState->fBuffer->dataEnd(); + unsigned toSize = ioState->fBuffer->bytesAvailable(); + subsessionSource->getNextFrame(toPtr, toSize, + afterGettingFrame, ioState, + onSourceClosure, ioState); + } + if (!haveActiveSubsessions) { + envir().setResultMsg("No subsessions are currently active"); + return False; + } + + return True; +} + +void AVIFileSink +::afterGettingFrame(void* clientData, unsigned packetDataSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned /*durationInMicroseconds*/) { + AVISubsessionIOState* ioState = (AVISubsessionIOState*)clientData; + if (numTruncatedBytes > 0) { + ioState->envir() << "AVIFileSink::afterGettingFrame(): The input frame data was too large for our buffer. " + << numTruncatedBytes + << " bytes of trailing data was dropped! Correct this by increasing the \"bufferSize\" parameter in the \"createNew()\" call.\n"; + } + ioState->afterGettingFrame(packetDataSize, presentationTime); +} + +void AVIFileSink::onSourceClosure(void* clientData) { + AVISubsessionIOState* ioState = (AVISubsessionIOState*)clientData; + ioState->onSourceClosure(); +} + +void AVIFileSink::onSourceClosure1() { + // Check whether *all* of the subsession sources have closed. + // If not, do nothing for now: + MediaSubsessionIterator iter(fInputSession); + MediaSubsession* subsession; + while ((subsession = iter.next()) != NULL) { + AVISubsessionIOState* ioState + = (AVISubsessionIOState*)(subsession->miscPtr); + if (ioState == NULL) continue; + + if (ioState->fOurSourceIsActive) return; // this source hasn't closed + } + + completeOutputFile(); + + // Call our specified 'after' function: + if (fAfterFunc != NULL) { + (*fAfterFunc)(fAfterClientData); + } +} + +void AVIFileSink::onRTCPBye(void* clientData) { + AVISubsessionIOState* ioState = (AVISubsessionIOState*)clientData; + + struct timeval timeNow; + gettimeofday(&timeNow, NULL); + unsigned secsDiff + = timeNow.tv_sec - ioState->fOurSink.fStartTime.tv_sec; + + MediaSubsession& subsession = ioState->fOurSubsession; + ioState->envir() << "Received RTCP \"BYE\" on \"" + << subsession.mediumName() + << "/" << subsession.codecName() + << "\" subsession (after " + << secsDiff << " seconds)\n"; + + // Handle the reception of a RTCP "BYE" as if the source had closed: + ioState->onSourceClosure(); +} + +void AVIFileSink::addIndexRecord(AVIIndexRecord* newIndexRecord) { + if (fIndexRecordsHead == NULL) { + fIndexRecordsHead = newIndexRecord; + } else { + fIndexRecordsTail->next() = newIndexRecord; + } + fIndexRecordsTail = newIndexRecord; + ++fNumIndexRecords; +} + +void AVIFileSink::completeOutputFile() { + if (fHaveCompletedOutputFile || fOutFid == NULL) return; + + // Update various AVI 'size' fields to take account of the codec data that + // we've now written to the file: + unsigned maxBytesPerSecond = 0; + unsigned numVideoFrames = 0; + unsigned numAudioFrames = 0; + + //// Subsession-specific fields: + MediaSubsessionIterator iter(fInputSession); + MediaSubsession* subsession; + while ((subsession = iter.next()) != NULL) { + AVISubsessionIOState* ioState + = (AVISubsessionIOState*)(subsession->miscPtr); + if (ioState == NULL) continue; + + maxBytesPerSecond += ioState->fMaxBytesPerSecond; + + setWord(ioState->fSTRHFrameCountPosition, ioState->fNumFrames); + if (ioState->fIsVideo) numVideoFrames = ioState->fNumFrames; + else if (ioState->fIsAudio) numAudioFrames = ioState->fNumFrames; + } + + //// Global fields: + add4ByteString("idx1"); + addWord(fNumIndexRecords*4*4); // the size of all of the index records, which come next: + for (AVIIndexRecord* indexRecord = fIndexRecordsHead; indexRecord != NULL; indexRecord = indexRecord->next()) { + addWord(indexRecord->chunkId()); + addWord(indexRecord->flags()); + addWord(indexRecord->offset()); + addWord(indexRecord->size()); + } + + fRIFFSizeValue += fNumBytesWritten + fNumIndexRecords*4*4 - 4; + setWord(fRIFFSizePosition, fRIFFSizeValue); + + setWord(fAVIHMaxBytesPerSecondPosition, maxBytesPerSecond); + setWord(fAVIHFrameCountPosition, + numVideoFrames > 0 ? numVideoFrames : numAudioFrames); + + fMoviSizeValue += fNumBytesWritten; + setWord(fMoviSizePosition, fMoviSizeValue); + + // We're done: + fHaveCompletedOutputFile = True; +} + + +////////// AVISubsessionIOState implementation /////////// + +AVISubsessionIOState::AVISubsessionIOState(AVIFileSink& sink, + MediaSubsession& subsession) + : fOurSink(sink), fOurSubsession(subsession), + fMaxBytesPerSecond(0), fIsVideo(False), fIsAudio(False), fIsByteSwappedAudio(False), fNumFrames(0) { + fBuffer = new SubsessionBuffer(fOurSink.fBufferSize); + fPrevBuffer = sink.fPacketLossCompensate + ? new SubsessionBuffer(fOurSink.fBufferSize) : NULL; + + FramedSource* subsessionSource = subsession.readSource(); + fOurSourceIsActive = subsessionSource != NULL; + + fPrevPresentationTime.tv_sec = 0; + fPrevPresentationTime.tv_usec = 0; +} + +AVISubsessionIOState::~AVISubsessionIOState() { + delete fBuffer; delete fPrevBuffer; +} + +void AVISubsessionIOState::setAVIstate(unsigned subsessionIndex) { + fIsVideo = strcmp(fOurSubsession.mediumName(), "video") == 0; + fIsAudio = strcmp(fOurSubsession.mediumName(), "audio") == 0; + + if (fIsVideo) { + fAVISubsessionTag + = fourChar('0'+subsessionIndex/10,'0'+subsessionIndex%10,'d','c'); + if (strcmp(fOurSubsession.codecName(), "JPEG") == 0) { + fAVICodecHandlerType = fourChar('m','j','p','g'); + } else if (strcmp(fOurSubsession.codecName(), "MP4V-ES") == 0) { + fAVICodecHandlerType = fourChar('D','I','V','X'); + } else if (strcmp(fOurSubsession.codecName(), "MPV") == 0) { + fAVICodecHandlerType = fourChar('m','p','g','1'); // what about MPEG-2? + } else if (strcmp(fOurSubsession.codecName(), "H263-1998") == 0 || + strcmp(fOurSubsession.codecName(), "H263-2000") == 0) { + fAVICodecHandlerType = fourChar('H','2','6','3'); + } else if (strcmp(fOurSubsession.codecName(), "H264") == 0) { + fAVICodecHandlerType = fourChar('H','2','6','4'); + } else { + fAVICodecHandlerType = fourChar('?','?','?','?'); + } + fAVIScale = 1; // ??? ##### + fAVIRate = fOurSink.fMovieFPS; // ??? ##### + fAVISize = fOurSink.fMovieWidth*fOurSink.fMovieHeight*3; // ??? ##### + } else if (fIsAudio) { + fIsByteSwappedAudio = False; // by default + fAVISubsessionTag + = fourChar('0'+subsessionIndex/10,'0'+subsessionIndex%10,'w','b'); + fAVICodecHandlerType = 1; // ??? #### + unsigned numChannels = fOurSubsession.numChannels(); + fAVISamplingFrequency = fOurSubsession.rtpTimestampFrequency(); // default + if (strcmp(fOurSubsession.codecName(), "L16") == 0) { + fIsByteSwappedAudio = True; // need to byte-swap data before writing it + fWAVCodecTag = 0x0001; + fAVIScale = fAVISize = 2*numChannels; // 2 bytes/sample + fAVIRate = fAVISize*fAVISamplingFrequency; + } else if (strcmp(fOurSubsession.codecName(), "L8") == 0) { + fWAVCodecTag = 0x0001; + fAVIScale = fAVISize = numChannels; // 1 byte/sample + fAVIRate = fAVISize*fAVISamplingFrequency; + } else if (strcmp(fOurSubsession.codecName(), "PCMA") == 0) { + fWAVCodecTag = 0x0006; + fAVIScale = fAVISize = numChannels; // 1 byte/sample + fAVIRate = fAVISize*fAVISamplingFrequency; + } else if (strcmp(fOurSubsession.codecName(), "PCMU") == 0) { + fWAVCodecTag = 0x0007; + fAVIScale = fAVISize = numChannels; // 1 byte/sample + fAVIRate = fAVISize*fAVISamplingFrequency; + } else if (strcmp(fOurSubsession.codecName(), "MPA") == 0) { + fWAVCodecTag = 0x0050; + fAVIScale = fAVISize = 1; + fAVIRate = 0; // ??? ##### + } else { + fWAVCodecTag = 0x0001; // ??? ##### + fAVIScale = fAVISize = 1; + fAVIRate = 0; // ??? ##### + } + } else { // unknown medium + fAVISubsessionTag + = fourChar('0'+subsessionIndex/10,'0'+subsessionIndex%10,'?','?'); + fAVICodecHandlerType = 0; + fAVIScale = fAVISize = 1; + fAVIRate = 0; // ??? ##### + } +} + +void AVISubsessionIOState::afterGettingFrame(unsigned packetDataSize, + struct timeval presentationTime) { + // Begin by checking whether there was a gap in the RTP stream. + // If so, try to compensate for this (if desired): + unsigned short rtpSeqNum + = fOurSubsession.rtpSource()->curPacketRTPSeqNum(); + if (fOurSink.fPacketLossCompensate && fPrevBuffer->bytesInUse() > 0) { + short seqNumGap = rtpSeqNum - fLastPacketRTPSeqNum; + for (short i = 1; i < seqNumGap; ++i) { + // Insert a copy of the previous frame, to compensate for the loss: + useFrame(*fPrevBuffer); + } + } + fLastPacketRTPSeqNum = rtpSeqNum; + + // Now, continue working with the frame that we just got + if (fBuffer->bytesInUse() == 0) { + fBuffer->setPresentationTime(presentationTime); + } + fBuffer->addBytes(packetDataSize); + + useFrame(*fBuffer); + if (fOurSink.fPacketLossCompensate) { + // Save this frame, in case we need it for recovery: + SubsessionBuffer* tmp = fPrevBuffer; // assert: != NULL + fPrevBuffer = fBuffer; + fBuffer = tmp; + } + fBuffer->reset(); // for the next input + + // Now, try getting more frames: + fOurSink.continuePlaying(); +} + +void AVISubsessionIOState::useFrame(SubsessionBuffer& buffer) { + unsigned char* const frameSource = buffer.dataStart(); + unsigned const frameSize = buffer.bytesInUse(); + struct timeval const& presentationTime = buffer.presentationTime(); + if (fPrevPresentationTime.tv_usec != 0||fPrevPresentationTime.tv_sec != 0) { + int uSecondsDiff + = (presentationTime.tv_sec - fPrevPresentationTime.tv_sec)*1000000 + + (presentationTime.tv_usec - fPrevPresentationTime.tv_usec); + if (uSecondsDiff > 0) { + unsigned bytesPerSecond = (unsigned)((frameSize*1000000.0)/uSecondsDiff); + if (bytesPerSecond > fMaxBytesPerSecond) { + fMaxBytesPerSecond = bytesPerSecond; + } + } + } + fPrevPresentationTime = presentationTime; + + if (fIsByteSwappedAudio) { + // We need to swap the 16-bit audio samples from big-endian + // to little-endian order, before writing them to a file: + for (unsigned i = 0; i < frameSize; i += 2) { + unsigned char tmp = frameSource[i]; + frameSource[i] = frameSource[i+1]; + frameSource[i+1] = tmp; + } + } + + // Add an index record for this frame: + AVIIndexRecord* newIndexRecord + = new AVIIndexRecord(fAVISubsessionTag, // chunk id + AVIIF_KEYFRAME, // flags + 4 + fOurSink.fNumBytesWritten, // offset (note: 4 == 'movi') + frameSize); // size + fOurSink.addIndexRecord(newIndexRecord); + + // Write the data into the file: + fOurSink.fNumBytesWritten += fOurSink.addWord(fAVISubsessionTag); + if (strcmp(fOurSubsession.codecName(), "H264") == 0) { + // Insert a 'start code' (0x00 0x00 0x00 0x01) in front of the frame: + fOurSink.fNumBytesWritten += fOurSink.addWord(4+frameSize); + fOurSink.fNumBytesWritten += fOurSink.addWord(fourChar(0x00, 0x00, 0x00, 0x01));//add start code + } else { + fOurSink.fNumBytesWritten += fOurSink.addWord(frameSize); + } + fwrite(frameSource, 1, frameSize, fOurSink.fOutFid); + fOurSink.fNumBytesWritten += frameSize; + // Pad to an even length: + if (frameSize%2 != 0) fOurSink.fNumBytesWritten += fOurSink.addByte(0); + + ++fNumFrames; +} + +void AVISubsessionIOState::onSourceClosure() { + fOurSourceIsActive = False; + fOurSink.onSourceClosure1(); +} + + +////////// AVI-specific implementation ////////// + +unsigned AVIFileSink::addWord(unsigned word) { + // Add "word" to the file in little-endian order: + addByte(word); addByte(word>>8); + addByte(word>>16); addByte(word>>24); + + return 4; +} + +unsigned AVIFileSink::addHalfWord(unsigned short halfWord) { + // Add "halfWord" to the file in little-endian order: + addByte((unsigned char)halfWord); addByte((unsigned char)(halfWord>>8)); + + return 2; +} + +unsigned AVIFileSink::addZeroWords(unsigned numWords) { + for (unsigned i = 0; i < numWords; ++i) { + addWord(0); + } + + return numWords*4; +} + +unsigned AVIFileSink::add4ByteString(char const* str) { + addByte(str[0]); addByte(str[1]); addByte(str[2]); + addByte(str[3] == '\0' ? ' ' : str[3]); // e.g., for "AVI " + + return 4; +} + +void AVIFileSink::setWord(unsigned filePosn, unsigned size) { + do { + if (SeekFile64(fOutFid, filePosn, SEEK_SET) < 0) break; + addWord(size); + if (SeekFile64(fOutFid, 0, SEEK_END) < 0) break; // go back to where we were + + return; + } while (0); + + // One of the SeekFile64()s failed, probable because we're not a seekable file + envir() << "AVIFileSink::setWord(): SeekFile64 failed (err " + << envir().getErrno() << ")\n"; +} + +// Methods for writing particular file headers. Note the following macros: + +#define addFileHeader(tag,name) \ + unsigned AVIFileSink::addFileHeader_##name() { \ + add4ByteString("" #tag ""); \ + unsigned headerSizePosn = (unsigned)TellFile64(fOutFid); addWord(0); \ + add4ByteString("" #name ""); \ + unsigned ignoredSize = 8;/*don't include size of tag or size fields*/ \ + unsigned size = 12 + +#define addFileHeader1(name) \ + unsigned AVIFileSink::addFileHeader_##name() { \ + add4ByteString("" #name ""); \ + unsigned headerSizePosn = (unsigned)TellFile64(fOutFid); addWord(0); \ + unsigned ignoredSize = 8;/*don't include size of name or size fields*/ \ + unsigned size = 8 + +#define addFileHeaderEnd \ + setWord(headerSizePosn, size-ignoredSize); \ + return size; \ +} + +addFileHeader(RIFF,AVI); + size += addFileHeader_hdrl(); + size += addFileHeader_movi(); + fRIFFSizePosition = headerSizePosn; + fRIFFSizeValue = size-ignoredSize; +addFileHeaderEnd; + +addFileHeader(LIST,hdrl); + size += addFileHeader_avih(); + + // Then, add a "strl" header for each subsession (stream): + // (Make the video subsession (if any) come before the audio subsession.) + unsigned subsessionCount = 0; + MediaSubsessionIterator iter(fInputSession); + MediaSubsession* subsession; + while ((subsession = iter.next()) != NULL) { + fCurrentIOState = (AVISubsessionIOState*)(subsession->miscPtr); + if (fCurrentIOState == NULL) continue; + if (strcmp(subsession->mediumName(), "video") != 0) continue; + + fCurrentIOState->setAVIstate(subsessionCount++); + size += addFileHeader_strl(); + } + iter.reset(); + while ((subsession = iter.next()) != NULL) { + fCurrentIOState = (AVISubsessionIOState*)(subsession->miscPtr); + if (fCurrentIOState == NULL) continue; + if (strcmp(subsession->mediumName(), "video") == 0) continue; + + fCurrentIOState->setAVIstate(subsessionCount++); + size += addFileHeader_strl(); + } + + // Then add another JUNK entry + ++fJunkNumber; + size += addFileHeader_JUNK(); +addFileHeaderEnd; + +#define AVIF_HASINDEX 0x00000010 // Index at end of file? +#define AVIF_MUSTUSEINDEX 0x00000020 +#define AVIF_ISINTERLEAVED 0x00000100 +#define AVIF_TRUSTCKTYPE 0x00000800 // Use CKType to find key frames? +#define AVIF_WASCAPTUREFILE 0x00010000 +#define AVIF_COPYRIGHTED 0x00020000 + +addFileHeader1(avih); + unsigned usecPerFrame = fMovieFPS == 0 ? 0 : 1000000/fMovieFPS; + size += addWord(usecPerFrame); // dwMicroSecPerFrame + fAVIHMaxBytesPerSecondPosition = (unsigned)TellFile64(fOutFid); + size += addWord(0); // dwMaxBytesPerSec (fill in later) + size += addWord(0); // dwPaddingGranularity + size += addWord(AVIF_TRUSTCKTYPE|AVIF_HASINDEX|AVIF_ISINTERLEAVED); // dwFlags + fAVIHFrameCountPosition = (unsigned)TellFile64(fOutFid); + size += addWord(0); // dwTotalFrames (fill in later) + size += addWord(0); // dwInitialFrame + size += addWord(fNumSubsessions); // dwStreams + size += addWord(fBufferSize); // dwSuggestedBufferSize + size += addWord(fMovieWidth); // dwWidth + size += addWord(fMovieHeight); // dwHeight + size += addZeroWords(4); // dwReserved +addFileHeaderEnd; + +addFileHeader(LIST,strl); + size += addFileHeader_strh(); + size += addFileHeader_strf(); + fJunkNumber = 0; + size += addFileHeader_JUNK(); +addFileHeaderEnd; + +addFileHeader1(strh); + size += add4ByteString(fCurrentIOState->fIsVideo ? "vids" : + fCurrentIOState->fIsAudio ? "auds" : + "????"); // fccType + size += addWord(fCurrentIOState->fAVICodecHandlerType); // fccHandler + size += addWord(0); // dwFlags + size += addWord(0); // wPriority + wLanguage + size += addWord(0); // dwInitialFrames + size += addWord(fCurrentIOState->fAVIScale); // dwScale + size += addWord(fCurrentIOState->fAVIRate); // dwRate + size += addWord(0); // dwStart + fCurrentIOState->fSTRHFrameCountPosition = (unsigned)TellFile64(fOutFid); + size += addWord(0); // dwLength (fill in later) + size += addWord(fBufferSize); // dwSuggestedBufferSize + size += addWord((unsigned)-1); // dwQuality + size += addWord(fCurrentIOState->fAVISize); // dwSampleSize + size += addWord(0); // rcFrame (start) + if (fCurrentIOState->fIsVideo) { + size += addHalfWord(fMovieWidth); + size += addHalfWord(fMovieHeight); + } else { + size += addWord(0); + } +addFileHeaderEnd; + +addFileHeader1(strf); + if (fCurrentIOState->fIsVideo) { + // Add a BITMAPINFO header: + unsigned extraDataSize = 0; + size += addWord(10*4 + extraDataSize); // size + size += addWord(fMovieWidth); + size += addWord(fMovieHeight); + size += addHalfWord(1); // planes + size += addHalfWord(24); // bits-per-sample ##### + size += addWord(fCurrentIOState->fAVICodecHandlerType); // compr. type + size += addWord(fCurrentIOState->fAVISize); + size += addZeroWords(4); // ??? ##### + // Later, add extra data here (if any) ##### + } else if (fCurrentIOState->fIsAudio) { + // Add a WAVFORMATEX header: + size += addHalfWord(fCurrentIOState->fWAVCodecTag); + unsigned numChannels = fCurrentIOState->fOurSubsession.numChannels(); + size += addHalfWord(numChannels); + size += addWord(fCurrentIOState->fAVISamplingFrequency); + size += addWord(fCurrentIOState->fAVIRate); // bytes per second + size += addHalfWord(fCurrentIOState->fAVISize); // block alignment + unsigned bitsPerSample = (fCurrentIOState->fAVISize*8)/numChannels; + size += addHalfWord(bitsPerSample); + if (strcmp(fCurrentIOState->fOurSubsession.codecName(), "MPA") == 0) { + // Assume MPEG layer II audio (not MP3): ##### + size += addHalfWord(22); // wav_extra_size + size += addHalfWord(2); // fwHeadLayer + size += addWord(8*fCurrentIOState->fAVIRate); // dwHeadBitrate ##### + size += addHalfWord(numChannels == 2 ? 1: 8); // fwHeadMode + size += addHalfWord(0); // fwHeadModeExt + size += addHalfWord(1); // wHeadEmphasis + size += addHalfWord(16); // fwHeadFlags + size += addWord(0); // dwPTSLow + size += addWord(0); // dwPTSHigh + } + } +addFileHeaderEnd; + +#define AVI_MASTER_INDEX_SIZE 256 + +addFileHeader1(JUNK); + if (fJunkNumber == 0) { + size += addHalfWord(4); // wLongsPerEntry + size += addHalfWord(0); // bIndexSubType + bIndexType + size += addWord(0); // nEntriesInUse ##### + size += addWord(fCurrentIOState->fAVISubsessionTag); // dwChunkId + size += addZeroWords(2); // dwReserved + size += addZeroWords(AVI_MASTER_INDEX_SIZE*4); + } else { + size += add4ByteString("odml"); + size += add4ByteString("dmlh"); + unsigned wtfCount = 248; + size += addWord(wtfCount); // ??? ##### + size += addZeroWords(wtfCount/4); + } +addFileHeaderEnd; + +addFileHeader(LIST,movi); + fMoviSizePosition = headerSizePosn; + fMoviSizeValue = size-ignoredSize; +addFileHeaderEnd; diff --git a/src/big/mpp/middleware/src/live555/liveMedia/AudioInputDevice.cpp b/src/big/mpp/middleware/src/live555/liveMedia/AudioInputDevice.cpp new file mode 100644 index 000000000..694679091 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/AudioInputDevice.cpp @@ -0,0 +1,45 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// Copyright (c) 2001-2003 Live Networks, Inc. All rights reserved. +// Generic audio input device (such as a microphone, or an input sound card) +// Implementation + +#include + +AudioInputDevice +::AudioInputDevice(UsageEnvironment& env, unsigned char bitsPerSample, + unsigned char numChannels, + unsigned samplingFrequency, unsigned granularityInMS) + : FramedSource(env), fBitsPerSample(bitsPerSample), + fNumChannels(numChannels), fSamplingFrequency(samplingFrequency), + fGranularityInMS(granularityInMS) { +} + +AudioInputDevice::~AudioInputDevice() { +} + +char** AudioInputDevice::allowedDeviceNames = NULL; + +////////// AudioPortNames implementation ////////// + +AudioPortNames::AudioPortNames() +: numPorts(0), portName(NULL) { +} + +AudioPortNames::~AudioPortNames() { + for (unsigned i = 0; i < numPorts; ++i) delete portName[i]; + delete portName; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/AudioRTPSink.cpp b/src/big/mpp/middleware/src/live555/liveMedia/AudioRTPSink.cpp new file mode 100644 index 000000000..58a8c6677 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/AudioRTPSink.cpp @@ -0,0 +1,37 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A generic RTP sink for audio codecs (abstract base class) +// Implementation + +#include "AudioRTPSink.hh" + +AudioRTPSink::AudioRTPSink(UsageEnvironment& env, + Groupsock* rtpgs, unsigned char rtpPayloadType, + unsigned rtpTimestampFrequency, + char const* rtpPayloadFormatName, + unsigned numChannels) + : MultiFramedRTPSink(env, rtpgs, rtpPayloadType, rtpTimestampFrequency, + rtpPayloadFormatName, numChannels) { +} + +AudioRTPSink::~AudioRTPSink() { +} + +char const* AudioRTPSink::sdpMediaType() const { + return "audio"; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/Base64.cpp b/src/big/mpp/middleware/src/live555/liveMedia/Base64.cpp new file mode 100644 index 000000000..a1390a866 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/Base64.cpp @@ -0,0 +1,122 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Base64 encoding and decoding +// implementation + +#include "Base64.hh" +#include +#include + +static char base64DecodeTable[256]; + +static void initBase64DecodeTable() { + int i; + for (i = 0; i < 256; ++i) base64DecodeTable[i] = (char)0x80; + // default value: invalid + + for (i = 'A'; i <= 'Z'; ++i) base64DecodeTable[i] = 0 + (i - 'A'); + for (i = 'a'; i <= 'z'; ++i) base64DecodeTable[i] = 26 + (i - 'a'); + for (i = '0'; i <= '9'; ++i) base64DecodeTable[i] = 52 + (i - '0'); + base64DecodeTable[(unsigned char)'+'] = 62; + base64DecodeTable[(unsigned char)'/'] = 63; + base64DecodeTable[(unsigned char)'='] = 0; +} + +unsigned char* base64Decode(char const* in, unsigned& resultSize, + Boolean trimTrailingZeros) { + if (in == NULL) return NULL; // sanity check + return base64Decode(in, strlen(in), resultSize, trimTrailingZeros); +} + +unsigned char* base64Decode(char const* in, unsigned inSize, + unsigned& resultSize, + Boolean trimTrailingZeros) { + static Boolean haveInitializedBase64DecodeTable = False; + if (!haveInitializedBase64DecodeTable) { + initBase64DecodeTable(); + haveInitializedBase64DecodeTable = True; + } + + unsigned char* out = new unsigned char[inSize+1]; // ensures we have enough space + int k = 0; + int paddingCount = 0; + int const jMax = inSize - 3; + // in case "inSize" is not a multiple of 4 (although it should be) + for (int j = 0; j < jMax; j += 4) { + char inTmp[4], outTmp[4]; + for (int i = 0; i < 4; ++i) { + inTmp[i] = in[i+j]; + if (inTmp[i] == '=') ++paddingCount; + outTmp[i] = base64DecodeTable[(unsigned char)inTmp[i]]; + if ((outTmp[i]&0x80) != 0) outTmp[i] = 0; // this happens only if there was an invalid character; pretend that it was 'A' + } + + out[k++] = (outTmp[0]<<2) | (outTmp[1]>>4); + out[k++] = (outTmp[1]<<4) | (outTmp[2]>>2); + out[k++] = (outTmp[2]<<6) | outTmp[3]; + } + + if (trimTrailingZeros) { + while (paddingCount > 0 && k > 0 && out[k-1] == '\0') { --k; --paddingCount; } + } + resultSize = k; + unsigned char* result = new unsigned char[resultSize]; + memmove(result, out, resultSize); + delete[] out; + + return result; +} + +static const char base64Char[] = +"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + +char* base64Encode(char const* origSigned, unsigned origLength) { + unsigned char const* orig = (unsigned char const*)origSigned; // in case any input bytes have the MSB set + if (orig == NULL) return NULL; + + unsigned const numOrig24BitValues = origLength/3; + Boolean havePadding = origLength > numOrig24BitValues*3; + Boolean havePadding2 = origLength == numOrig24BitValues*3 + 2; + unsigned const numResultBytes = 4*(numOrig24BitValues + havePadding); + char* result = new char[numResultBytes+1]; // allow for trailing '\0' + + // Map each full group of 3 input bytes into 4 output base-64 characters: + unsigned i; + for (i = 0; i < numOrig24BitValues; ++i) { + result[4*i+0] = base64Char[(orig[3*i]>>2)&0x3F]; + result[4*i+1] = base64Char[(((orig[3*i]&0x3)<<4) | (orig[3*i+1]>>4))&0x3F]; + result[4*i+2] = base64Char[((orig[3*i+1]<<2) | (orig[3*i+2]>>6))&0x3F]; + result[4*i+3] = base64Char[orig[3*i+2]&0x3F]; + } + + // Now, take padding into account. (Note: i == numOrig24BitValues) + if (havePadding) { + result[4*i+0] = base64Char[(orig[3*i]>>2)&0x3F]; + if (havePadding2) { + result[4*i+1] = base64Char[(((orig[3*i]&0x3)<<4) | (orig[3*i+1]>>4))&0x3F]; + result[4*i+2] = base64Char[(orig[3*i+1]<<2)&0x3F]; + } else { + result[4*i+1] = base64Char[((orig[3*i]&0x3)<<4)&0x3F]; + result[4*i+2] = '='; + } + result[4*i+3] = '='; + } + + result[numResultBytes] = '\0'; + return result; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/BasicUDPSink.cpp b/src/big/mpp/middleware/src/live555/liveMedia/BasicUDPSink.cpp new file mode 100644 index 000000000..4a2953a70 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/BasicUDPSink.cpp @@ -0,0 +1,101 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A simple UDP sink (i.e., without RTP or other headers added); one frame per packet +// Implementation + +#include "BasicUDPSink.hh" +#include + +BasicUDPSink* BasicUDPSink::createNew(UsageEnvironment& env, Groupsock* gs, + unsigned maxPayloadSize) { + return new BasicUDPSink(env, gs, maxPayloadSize); +} + +BasicUDPSink::BasicUDPSink(UsageEnvironment& env, Groupsock* gs, + unsigned maxPayloadSize) + : MediaSink(env), + fGS(gs), fMaxPayloadSize(maxPayloadSize) { + fOutputBuffer = new unsigned char[fMaxPayloadSize]; +} + +BasicUDPSink::~BasicUDPSink() { + delete[] fOutputBuffer; +} + +Boolean BasicUDPSink::continuePlaying() { + // Record the fact that we're starting to play now: + gettimeofday(&fNextSendTime, NULL); + + // Arrange to get and send the first payload. + // (This will also schedule any future sends.) + continuePlaying1(); + return True; +} + +void BasicUDPSink::continuePlaying1() { + nextTask() = NULL; + if (fSource != NULL) { + fSource->getNextFrame(fOutputBuffer, fMaxPayloadSize, + afterGettingFrame, this, + onSourceClosure, this); + } +} + +void BasicUDPSink::afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval /*presentationTime*/, + unsigned durationInMicroseconds) { + BasicUDPSink* sink = (BasicUDPSink*)clientData; + sink->afterGettingFrame1(frameSize, numTruncatedBytes, durationInMicroseconds); +} + +void BasicUDPSink::afterGettingFrame1(unsigned frameSize, unsigned numTruncatedBytes, + unsigned durationInMicroseconds) { + if (numTruncatedBytes > 0) { + envir() << "BasicUDPSink::afterGettingFrame1(): The input frame data was too large for our spcified maximum payload size (" + << fMaxPayloadSize << "). " + << numTruncatedBytes << " bytes of trailing data was dropped!\n"; + } + + // Send the packet: + fGS->output(envir(), fOutputBuffer, frameSize); + + // Figure out the time at which the next packet should be sent, based + // on the duration of the payload that we just read: + fNextSendTime.tv_usec += durationInMicroseconds; + fNextSendTime.tv_sec += fNextSendTime.tv_usec/1000000; + fNextSendTime.tv_usec %= 1000000; + + struct timeval timeNow; + gettimeofday(&timeNow, NULL); + int secsDiff = fNextSendTime.tv_sec - timeNow.tv_sec; + int64_t uSecondsToGo = secsDiff*1000000 + (fNextSendTime.tv_usec - timeNow.tv_usec); + if (uSecondsToGo < 0 || secsDiff < 0) { // sanity check: Make sure that the time-to-delay is non-negative: + uSecondsToGo = 0; + } + + // Delay this amount of time: + nextTask() = envir().taskScheduler().scheduleDelayedTask(uSecondsToGo, + (TaskFunc*)sendNext, this); +} + +// The following is called after each delay between packet sends: +void BasicUDPSink::sendNext(void* firstArg) { + BasicUDPSink* sink = (BasicUDPSink*)firstArg; + sink->continuePlaying1(); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/BasicUDPSource.cpp b/src/big/mpp/middleware/src/live555/liveMedia/BasicUDPSource.cpp new file mode 100644 index 000000000..f1e6ecfd2 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/BasicUDPSource.cpp @@ -0,0 +1,77 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A simple UDP source, where every UDP payload is a complete frame +// Implementation + +#include "BasicUDPSource.hh" +#include + +BasicUDPSource* BasicUDPSource::createNew(UsageEnvironment& env, + Groupsock* inputGS) { + return new BasicUDPSource(env, inputGS); +} + +BasicUDPSource::BasicUDPSource(UsageEnvironment& env, Groupsock* inputGS) + : FramedSource(env), fInputGS(inputGS), fHaveStartedReading(False) { + // Try to use a large receive buffer (in the OS): + increaseReceiveBufferTo(env, inputGS->socketNum(), 50*1024); + + // Make the socket non-blocking, even though it will be read from only asynchronously, when packets arrive. + // The reason for this is that, in some OSs, reads on a blocking socket can (allegedly) sometimes block, + // even if the socket was previously reported (e.g., by "select()") as having data available. + // (This can supposedly happen if the UDP checksum fails, for example.) + makeSocketNonBlocking(fInputGS->socketNum()); +} + +BasicUDPSource::~BasicUDPSource(){ + envir().taskScheduler().turnOffBackgroundReadHandling(fInputGS->socketNum()); +} + +unsigned BasicUDPSource::maxFrameSize() const { + return 0xFFFF; // maximum size of a UDP payload +} + +void BasicUDPSource::doGetNextFrame() { + if (!fHaveStartedReading) { + // Await incoming packets: + envir().taskScheduler().turnOnBackgroundReadHandling(fInputGS->socketNum(), + (TaskScheduler::BackgroundHandlerProc*)&incomingPacketHandler, this); + fHaveStartedReading = True; + } +} + +void BasicUDPSource::doStopGettingFrames() { + envir().taskScheduler().turnOffBackgroundReadHandling(fInputGS->socketNum()); + fHaveStartedReading = False; +} + + +void BasicUDPSource::incomingPacketHandler(BasicUDPSource* source, int /*mask*/){ + source->incomingPacketHandler1(); +} + +void BasicUDPSource::incomingPacketHandler1() { + if (!isCurrentlyAwaitingData()) return; // we're not ready for the data yet + + // Read the packet into our desired destination: + struct sockaddr_storage fromAddress; + if (!fInputGS->handleRead(fTo, fMaxSize, fFrameSize, fromAddress)) return; + + // Tell our client that we have new data: + afterGetting(this); // we're preceded by a net read; no infinite recursion +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/BitVector.cpp b/src/big/mpp/middleware/src/live555/liveMedia/BitVector.cpp new file mode 100644 index 000000000..1ef406786 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/BitVector.cpp @@ -0,0 +1,183 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Bit Vector data structure +// Implementation + +#include "BitVector.hh" + +BitVector::BitVector(unsigned char* baseBytePtr, + unsigned baseBitOffset, + unsigned totNumBits) { + setup(baseBytePtr, baseBitOffset, totNumBits); +} + +void BitVector::setup(unsigned char* baseBytePtr, + unsigned baseBitOffset, + unsigned totNumBits) { + fBaseBytePtr = baseBytePtr; + fBaseBitOffset = baseBitOffset; + fTotNumBits = totNumBits; + fCurBitIndex = 0; +} + +static unsigned char const singleBitMask[8] + = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01}; + +#define MAX_LENGTH 32 + +void BitVector::putBits(unsigned from, unsigned numBits) { + if (numBits == 0) return; + + unsigned char tmpBuf[4]; + unsigned overflowingBits = 0; + + if (numBits > MAX_LENGTH) { + numBits = MAX_LENGTH; + } + + if (numBits > fTotNumBits - fCurBitIndex) { + overflowingBits = numBits - (fTotNumBits - fCurBitIndex); + } + + tmpBuf[0] = (unsigned char)(from>>24); + tmpBuf[1] = (unsigned char)(from>>16); + tmpBuf[2] = (unsigned char)(from>>8); + tmpBuf[3] = (unsigned char)from; + + shiftBits(fBaseBytePtr, fBaseBitOffset + fCurBitIndex, /* to */ + tmpBuf, MAX_LENGTH - numBits, /* from */ + numBits - overflowingBits /* num bits */); + fCurBitIndex += numBits - overflowingBits; +} + +void BitVector::put1Bit(unsigned bit) { + // The following is equivalent to "putBits(..., 1)", except faster: + if (fCurBitIndex >= fTotNumBits) { /* overflow */ + return; + } else { + unsigned totBitOffset = fBaseBitOffset + fCurBitIndex++; + unsigned char mask = singleBitMask[totBitOffset%8]; + if (bit) { + fBaseBytePtr[totBitOffset/8] |= mask; + } else { + fBaseBytePtr[totBitOffset/8] &=~ mask; + } + } +} + +unsigned BitVector::getBits(unsigned numBits) { + if (numBits == 0) return 0; + + unsigned char tmpBuf[4]; + unsigned overflowingBits = 0; + + if (numBits > MAX_LENGTH) { + numBits = MAX_LENGTH; + } + + if (numBits > fTotNumBits - fCurBitIndex) { + overflowingBits = numBits - (fTotNumBits - fCurBitIndex); + } + + shiftBits(tmpBuf, 0, /* to */ + fBaseBytePtr, fBaseBitOffset + fCurBitIndex, /* from */ + numBits - overflowingBits /* num bits */); + fCurBitIndex += numBits - overflowingBits; + + unsigned result + = (tmpBuf[0]<<24) | (tmpBuf[1]<<16) | (tmpBuf[2]<<8) | tmpBuf[3]; + result >>= (MAX_LENGTH - numBits); // move into low-order part of word + result &= (0xFFFFFFFF << overflowingBits); // so any overflow bits are 0 + return result; +} + +unsigned BitVector::get1Bit() { + // The following is equivalent to "getBits(1)", except faster: + + if (fCurBitIndex >= fTotNumBits) { /* overflow */ + return 0; + } else { + unsigned totBitOffset = fBaseBitOffset + fCurBitIndex++; + unsigned char curFromByte = fBaseBytePtr[totBitOffset/8]; + unsigned result = (curFromByte >> (7-(totBitOffset%8))) & 0x01; + return result; + } +} + +void BitVector::skipBits(unsigned numBits) { + if (numBits > fTotNumBits - fCurBitIndex) { /* overflow */ + fCurBitIndex = fTotNumBits; + } else { + fCurBitIndex += numBits; + } +} + +unsigned BitVector::get_expGolomb() { + unsigned numLeadingZeroBits = 0; + unsigned codeStart = 1; + + while (get1Bit() == 0 && fCurBitIndex < fTotNumBits) { + ++numLeadingZeroBits; + codeStart *= 2; + } + + return codeStart - 1 + getBits(numLeadingZeroBits); +} + +int BitVector::get_expGolombSigned() { + unsigned codeNum = get_expGolomb(); + + if ((codeNum&1) == 0) { // even + return -(int)(codeNum/2); + } else { // odd + return (codeNum+1)/2; + } +} + +void shiftBits(unsigned char* toBasePtr, unsigned toBitOffset, + unsigned char const* fromBasePtr, unsigned fromBitOffset, + unsigned numBits) { + if (numBits == 0) return; + + /* Note that from and to may overlap, if from>to */ + unsigned char const* fromBytePtr = fromBasePtr + fromBitOffset/8; + unsigned fromBitRem = fromBitOffset%8; + unsigned char* toBytePtr = toBasePtr + toBitOffset/8; + unsigned toBitRem = toBitOffset%8; + + while (numBits-- > 0) { + unsigned char fromBitMask = singleBitMask[fromBitRem]; + unsigned char fromBit = (*fromBytePtr)&fromBitMask; + unsigned char toBitMask = singleBitMask[toBitRem]; + + if (fromBit != 0) { + *toBytePtr |= toBitMask; + } else { + *toBytePtr &=~ toBitMask; + } + + if (++fromBitRem == 8) { + ++fromBytePtr; + fromBitRem = 0; + } + if (++toBitRem == 8) { + ++toBytePtr; + toBitRem = 0; + } + } +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/ByteStreamFileSource.cpp b/src/big/mpp/middleware/src/live555/liveMedia/ByteStreamFileSource.cpp new file mode 100644 index 000000000..813eed3fe --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/ByteStreamFileSource.cpp @@ -0,0 +1,184 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A file source that is a plain byte stream (rather than frames) +// Implementation + +#include "ByteStreamFileSource.hh" +#include "InputFile.hh" +#include "GroupsockHelper.hh" + +////////// ByteStreamFileSource ////////// + +ByteStreamFileSource* +ByteStreamFileSource::createNew(UsageEnvironment& env, char const* fileName, + unsigned preferredFrameSize, + unsigned playTimePerFrame) { + FILE* fid = OpenInputFile(env, fileName); + if (fid == NULL) return NULL; + + ByteStreamFileSource* newSource + = new ByteStreamFileSource(env, fid, preferredFrameSize, playTimePerFrame); + newSource->fFileSize = GetFileSize(fileName, fid); + + return newSource; +} + +ByteStreamFileSource* +ByteStreamFileSource::createNew(UsageEnvironment& env, FILE* fid, + unsigned preferredFrameSize, + unsigned playTimePerFrame) { + if (fid == NULL) return NULL; + + ByteStreamFileSource* newSource = new ByteStreamFileSource(env, fid, preferredFrameSize, playTimePerFrame); + newSource->fFileSize = GetFileSize(NULL, fid); + + return newSource; +} + +void ByteStreamFileSource::seekToByteAbsolute(u_int64_t byteNumber, u_int64_t numBytesToStream) { + SeekFile64(fFid, (int64_t)byteNumber, SEEK_SET); + + fNumBytesToStream = numBytesToStream; + fLimitNumBytesToStream = fNumBytesToStream > 0; +} + +void ByteStreamFileSource::seekToByteRelative(int64_t offset, u_int64_t numBytesToStream) { + SeekFile64(fFid, offset, SEEK_CUR); + + fNumBytesToStream = numBytesToStream; + fLimitNumBytesToStream = fNumBytesToStream > 0; +} + +void ByteStreamFileSource::seekToEnd() { + SeekFile64(fFid, 0, SEEK_END); +} + +ByteStreamFileSource::ByteStreamFileSource(UsageEnvironment& env, FILE* fid, + unsigned preferredFrameSize, + unsigned playTimePerFrame) + : FramedFileSource(env, fid), fFileSize(0), fPreferredFrameSize(preferredFrameSize), + fPlayTimePerFrame(playTimePerFrame), fLastPlayTime(0), + fHaveStartedReading(False), fLimitNumBytesToStream(False), fNumBytesToStream(0) { +#ifndef READ_FROM_FILES_SYNCHRONOUSLY + makeSocketNonBlocking(fileno(fFid)); +#endif + + // Test whether the file is seekable + fFidIsSeekable = FileIsSeekable(fFid); +} + +ByteStreamFileSource::~ByteStreamFileSource() { + if (fFid == NULL) return; + +#ifndef READ_FROM_FILES_SYNCHRONOUSLY + envir().taskScheduler().turnOffBackgroundReadHandling(fileno(fFid)); +#endif + + CloseInputFile(fFid); +} + +void ByteStreamFileSource::doGetNextFrame() { + if (feof(fFid) || ferror(fFid) || (fLimitNumBytesToStream && fNumBytesToStream == 0)) { + handleClosure(); + return; + } + +#ifdef READ_FROM_FILES_SYNCHRONOUSLY + doReadFromFile(); +#else + if (!fHaveStartedReading) { + // Await readable data from the file: + envir().taskScheduler().turnOnBackgroundReadHandling(fileno(fFid), + (TaskScheduler::BackgroundHandlerProc*)&fileReadableHandler, this); + fHaveStartedReading = True; + } +#endif +} + +void ByteStreamFileSource::doStopGettingFrames() { + envir().taskScheduler().unscheduleDelayedTask(nextTask()); +#ifndef READ_FROM_FILES_SYNCHRONOUSLY + envir().taskScheduler().turnOffBackgroundReadHandling(fileno(fFid)); + fHaveStartedReading = False; +#endif +} + +void ByteStreamFileSource::fileReadableHandler(ByteStreamFileSource* source, int /*mask*/) { + if (!source->isCurrentlyAwaitingData()) { + source->doStopGettingFrames(); // we're not ready for the data yet + return; + } + source->doReadFromFile(); +} + +void ByteStreamFileSource::doReadFromFile() { + // Try to read as many bytes as will fit in the buffer provided (or "fPreferredFrameSize" if less) + if (fLimitNumBytesToStream && fNumBytesToStream < (u_int64_t)fMaxSize) { + fMaxSize = (unsigned)fNumBytesToStream; + } + if (fPreferredFrameSize > 0 && fPreferredFrameSize < fMaxSize) { + fMaxSize = fPreferredFrameSize; + } +#ifdef READ_FROM_FILES_SYNCHRONOUSLY + fFrameSize = fread(fTo, 1, fMaxSize, fFid); +#else + if (fFidIsSeekable) { + fFrameSize = fread(fTo, 1, fMaxSize, fFid); + } else { + // For non-seekable files (e.g., pipes), call "read()" rather than "fread()", to ensure that the read doesn't block: + fFrameSize = read(fileno(fFid), fTo, fMaxSize); + } +#endif + if (fFrameSize == 0) { + handleClosure(); + return; + } + fNumBytesToStream -= fFrameSize; + + // Set the 'presentation time': + if (fPlayTimePerFrame > 0 && fPreferredFrameSize > 0) { + if (fPresentationTime.tv_sec == 0 && fPresentationTime.tv_usec == 0) { + // This is the first frame, so use the current time: + gettimeofday(&fPresentationTime, NULL); + } else { + // Increment by the play time of the previous data: + unsigned uSeconds = fPresentationTime.tv_usec + fLastPlayTime; + fPresentationTime.tv_sec += uSeconds/1000000; + fPresentationTime.tv_usec = uSeconds%1000000; + } + + // Remember the play time of this data: + fLastPlayTime = (fPlayTimePerFrame*fFrameSize)/fPreferredFrameSize; + fDurationInMicroseconds = fLastPlayTime; + } else { + // We don't know a specific play time duration for this data, + // so just record the current time as being the 'presentation time': + gettimeofday(&fPresentationTime, NULL); + } + + // Inform the reader that he has data: +#ifdef READ_FROM_FILES_SYNCHRONOUSLY + // To avoid possible infinite recursion, we need to return to the event loop to do this: + nextTask() = envir().taskScheduler().scheduleDelayedTask(0, + (TaskFunc*)FramedSource::afterGetting, this); +#else + // Because the file read was done from the event loop, we can call the + // 'after getting' function directly, without risk of infinite recursion: + FramedSource::afterGetting(this); +#endif +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/ByteStreamMemoryBufferSource.cpp b/src/big/mpp/middleware/src/live555/liveMedia/ByteStreamMemoryBufferSource.cpp new file mode 100644 index 000000000..9e0df4321 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/ByteStreamMemoryBufferSource.cpp @@ -0,0 +1,118 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A class for streaming data from a (static) memory buffer, as if it were a file. +// Implementation + +#include "ByteStreamMemoryBufferSource.hh" +#include "GroupsockHelper.hh" + +////////// ByteStreamMemoryBufferSource ////////// + +ByteStreamMemoryBufferSource* +ByteStreamMemoryBufferSource::createNew(UsageEnvironment& env, + u_int8_t* buffer, u_int64_t bufferSize, + Boolean deleteBufferOnClose, + unsigned preferredFrameSize, + unsigned playTimePerFrame) { + if (buffer == NULL) return NULL; + + return new ByteStreamMemoryBufferSource(env, buffer, bufferSize, deleteBufferOnClose, preferredFrameSize, playTimePerFrame); +} + +ByteStreamMemoryBufferSource::ByteStreamMemoryBufferSource(UsageEnvironment& env, + u_int8_t* buffer, u_int64_t bufferSize, + Boolean deleteBufferOnClose, + unsigned preferredFrameSize, + unsigned playTimePerFrame) + : FramedSource(env), fBuffer(buffer), fBufferSize(bufferSize), fCurIndex(0), fDeleteBufferOnClose(deleteBufferOnClose), + fPreferredFrameSize(preferredFrameSize), fPlayTimePerFrame(playTimePerFrame), fLastPlayTime(0), + fLimitNumBytesToStream(False), fNumBytesToStream(0) { +} + +ByteStreamMemoryBufferSource::~ByteStreamMemoryBufferSource() { + if (fDeleteBufferOnClose) delete[] fBuffer; +} + +void ByteStreamMemoryBufferSource::seekToByteAbsolute(u_int64_t byteNumber, u_int64_t numBytesToStream) { + fCurIndex = byteNumber; + if (fCurIndex > fBufferSize) fCurIndex = fBufferSize; + + fNumBytesToStream = numBytesToStream; + fLimitNumBytesToStream = fNumBytesToStream > 0; +} + +void ByteStreamMemoryBufferSource::seekToByteRelative(int64_t offset, u_int64_t numBytesToStream) { + int64_t newIndex = fCurIndex + offset; + if (newIndex < 0) { + fCurIndex = 0; + } else { + fCurIndex = (u_int64_t)offset; + if (fCurIndex > fBufferSize) fCurIndex = fBufferSize; + } + + fNumBytesToStream = numBytesToStream; + fLimitNumBytesToStream = fNumBytesToStream > 0; +} + +void ByteStreamMemoryBufferSource::doGetNextFrame() { + if (fCurIndex >= fBufferSize || (fLimitNumBytesToStream && fNumBytesToStream == 0)) { + handleClosure(); + return; + } + + // Try to read as many bytes as will fit in the buffer provided (or "fPreferredFrameSize" if less) + fFrameSize = fMaxSize; + if (fLimitNumBytesToStream && fNumBytesToStream < (u_int64_t)fFrameSize) { + fFrameSize = (unsigned)fNumBytesToStream; + } + if (fPreferredFrameSize > 0 && fPreferredFrameSize < fFrameSize) { + fFrameSize = fPreferredFrameSize; + } + + if (fCurIndex + fFrameSize > fBufferSize) { + fFrameSize = (unsigned)(fBufferSize - fCurIndex); + } + + memmove(fTo, &fBuffer[fCurIndex], fFrameSize); + fCurIndex += fFrameSize; + fNumBytesToStream -= fFrameSize; + + // Set the 'presentation time': + if (fPlayTimePerFrame > 0 && fPreferredFrameSize > 0) { + if (fPresentationTime.tv_sec == 0 && fPresentationTime.tv_usec == 0) { + // This is the first frame, so use the current time: + gettimeofday(&fPresentationTime, NULL); + } else { + // Increment by the play time of the previous data: + unsigned uSeconds = fPresentationTime.tv_usec + fLastPlayTime; + fPresentationTime.tv_sec += uSeconds/1000000; + fPresentationTime.tv_usec = uSeconds%1000000; + } + + // Remember the play time of this data: + fLastPlayTime = (fPlayTimePerFrame*fFrameSize)/fPreferredFrameSize; + fDurationInMicroseconds = fLastPlayTime; + } else { + // We don't know a specific play time duration for this data, + // so just record the current time as being the 'presentation time': + gettimeofday(&fPresentationTime, NULL); + } + + // Inform the downstream object that it has data: + FramedSource::afterGetting(this); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/ByteStreamMultiFileSource.cpp b/src/big/mpp/middleware/src/live555/liveMedia/ByteStreamMultiFileSource.cpp new file mode 100644 index 000000000..590c2ec7d --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/ByteStreamMultiFileSource.cpp @@ -0,0 +1,134 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A source that consists of multiple byte-stream files, read sequentially. +// (The input is an array of file names, with a terminating 'file name' of NULL.) +// Implementation + +#include "ByteStreamMultiFileSource.hh" + +ByteStreamMultiFileSource +::ByteStreamMultiFileSource(UsageEnvironment& env, char const** fileNameArray, + unsigned preferredFrameSize, unsigned playTimePerFrame) + : FramedSource(env), + fPreferredFrameSize(preferredFrameSize), fPlayTimePerFrame(playTimePerFrame), + fCurrentlyReadSourceNumber(0), fHaveStartedNewFile(False) { + // Begin by counting the number of sources (by looking for a terminating 'file name' of NULL): + for (fNumSources = 0; ; ++fNumSources) { + if (fileNameArray[fNumSources] == NULL) break; + } + + // Next, copy the source file names into our own array: + fFileNameArray = new char const*[fNumSources]; + if (fFileNameArray == NULL) return; + unsigned i; + for (i = 0; i < fNumSources; ++i) { + fFileNameArray[i] = strDup(fileNameArray[i]); + } + + // Next, set up our array of component ByteStreamFileSources + // Don't actually create these yet; instead, do this on demand + fSourceArray = new ByteStreamFileSource*[fNumSources]; + if (fSourceArray == NULL) return; + for (i = 0; i < fNumSources; ++i) { + fSourceArray[i] = NULL; + } +} + +ByteStreamMultiFileSource::~ByteStreamMultiFileSource() { + unsigned i; + for (i = 0; i < fNumSources; ++i) { + Medium::close(fSourceArray[i]); + } + delete[] fSourceArray; + + for (i = 0; i < fNumSources; ++i) { + delete[] (char*)(fFileNameArray[i]); + } + delete[] fFileNameArray; +} + +ByteStreamMultiFileSource* ByteStreamMultiFileSource +::createNew(UsageEnvironment& env, char const** fileNameArray, + unsigned preferredFrameSize, unsigned playTimePerFrame) { + ByteStreamMultiFileSource* newSource + = new ByteStreamMultiFileSource(env, fileNameArray, + preferredFrameSize, playTimePerFrame); + + return newSource; +} + +void ByteStreamMultiFileSource::doGetNextFrame() { + do { + // First, check whether we've run out of sources: + if (fCurrentlyReadSourceNumber >= fNumSources) break; + + fHaveStartedNewFile = False; + ByteStreamFileSource*& source + = fSourceArray[fCurrentlyReadSourceNumber]; + if (source == NULL) { + // The current source hasn't been created yet. Do this now: + source = ByteStreamFileSource::createNew(envir(), + fFileNameArray[fCurrentlyReadSourceNumber], + fPreferredFrameSize, fPlayTimePerFrame); + if (source == NULL) break; + fHaveStartedNewFile = True; + } + + // (Attempt to) read from the current source. + source->getNextFrame(fTo, fMaxSize, + afterGettingFrame, this, + onSourceClosure, this); + return; + } while (0); + + // An error occurred; consider ourselves closed: + handleClosure(); +} + +void ByteStreamMultiFileSource + ::afterGettingFrame(void* clientData, + unsigned frameSize, unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds) { + ByteStreamMultiFileSource* source + = (ByteStreamMultiFileSource*)clientData; + source->fFrameSize = frameSize; + source->fNumTruncatedBytes = numTruncatedBytes; + source->fPresentationTime = presentationTime; + source->fDurationInMicroseconds = durationInMicroseconds; + FramedSource::afterGetting(source); +} + +void ByteStreamMultiFileSource::onSourceClosure(void* clientData) { + ByteStreamMultiFileSource* source + = (ByteStreamMultiFileSource*)clientData; + source->onSourceClosure1(); +} + +void ByteStreamMultiFileSource::onSourceClosure1() { + // This routine was called because the currently-read source was closed + // (probably due to EOF). Close this source down, and move to the + // next one: + ByteStreamFileSource*& source + = fSourceArray[fCurrentlyReadSourceNumber++]; + Medium::close(source); + source = NULL; + + // Try reading again: + doGetNextFrame(); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/DVVideoFileServerMediaSubsession.cpp b/src/big/mpp/middleware/src/live555/liveMedia/DVVideoFileServerMediaSubsession.cpp new file mode 100644 index 000000000..828dc2173 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/DVVideoFileServerMediaSubsession.cpp @@ -0,0 +1,103 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A 'ServerMediaSubsession' object that creates new, unicast, "RTPSink"s +// on demand, from a DV video file. +// Implementation + +#include "DVVideoFileServerMediaSubsession.hh" +#include "DVVideoRTPSink.hh" +#include "ByteStreamFileSource.hh" +#include "DVVideoStreamFramer.hh" + +DVVideoFileServerMediaSubsession* +DVVideoFileServerMediaSubsession::createNew(UsageEnvironment& env, char const* fileName, Boolean reuseFirstSource) { + return new DVVideoFileServerMediaSubsession(env, fileName, reuseFirstSource); +} + +DVVideoFileServerMediaSubsession +::DVVideoFileServerMediaSubsession(UsageEnvironment& env, char const* fileName, Boolean reuseFirstSource) + : FileServerMediaSubsession(env, fileName, reuseFirstSource), + fFileDuration(0.0) { +} + +DVVideoFileServerMediaSubsession::~DVVideoFileServerMediaSubsession() { +} + +FramedSource* DVVideoFileServerMediaSubsession +::createNewStreamSource(unsigned /*clientSessionId*/, unsigned& estBitrate) { + // Create the video source: + ByteStreamFileSource* fileSource = ByteStreamFileSource::createNew(envir(), fFileName); + if (fileSource == NULL) return NULL; + fFileSize = fileSource->fileSize(); + + // Create a framer for the Video Elementary Stream: + DVVideoStreamFramer* framer = DVVideoStreamFramer::createNew(envir(), fileSource, True/*the file source is seekable*/); + + // Use the framer to figure out the file's duration: + unsigned frameSize; + double frameDuration; + if (framer->getFrameParameters(frameSize, frameDuration)) { + fFileDuration = (float)(((int64_t)fFileSize*frameDuration)/(frameSize*1000000.0)); + estBitrate = (unsigned)((8000.0*frameSize)/frameDuration); // in kbps + } else { + estBitrate = 50000; // kbps, estimate + } + + return framer; +} + +RTPSink* DVVideoFileServerMediaSubsession::createNewRTPSink(Groupsock* rtpGroupsock, + unsigned char rtpPayloadTypeIfDynamic, + FramedSource* /*inputSource*/) { + return DVVideoRTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic); +} + +char const* DVVideoFileServerMediaSubsession::getAuxSDPLine(RTPSink* rtpSink, FramedSource* inputSource) { + return ((DVVideoRTPSink*)rtpSink)->auxSDPLineFromFramer((DVVideoStreamFramer*)inputSource); +} + +float DVVideoFileServerMediaSubsession::duration() const { + return fFileDuration; +} + +void DVVideoFileServerMediaSubsession +::seekStreamSource(FramedSource* inputSource, double& seekNPT, double streamDuration, u_int64_t& numBytes) { + // First, get the file source from "inputSource" (a framer): + DVVideoStreamFramer* framer = (DVVideoStreamFramer*)inputSource; + ByteStreamFileSource* fileSource = (ByteStreamFileSource*)(framer->inputSource()); + + // Then figure out where to seek to within the file: + if (fFileDuration > 0.0) { + u_int64_t seekByteNumber = (u_int64_t)(((int64_t)fFileSize*seekNPT)/fFileDuration); + numBytes = (u_int64_t)(((int64_t)fFileSize*streamDuration)/fFileDuration); + fileSource->seekToByteAbsolute(seekByteNumber, numBytes); + } +} + +void DVVideoFileServerMediaSubsession +::setStreamSourceDuration(FramedSource* inputSource, double streamDuration, u_int64_t& numBytes) { + // First, get the file source from "inputSource" (a framer): + DVVideoStreamFramer* framer = (DVVideoStreamFramer*)inputSource; + ByteStreamFileSource* fileSource = (ByteStreamFileSource*)(framer->inputSource()); + + // Then figure out how many bytes to limit the streaming to: + if (fFileDuration > 0.0) { + numBytes = (u_int64_t)(((int64_t)fFileSize*streamDuration)/fFileDuration); + fileSource->seekToByteRelative(0, numBytes); + } +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/DVVideoRTPSink.cpp b/src/big/mpp/middleware/src/live555/liveMedia/DVVideoRTPSink.cpp new file mode 100644 index 000000000..663e18155 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/DVVideoRTPSink.cpp @@ -0,0 +1,95 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP sink for DV video (RFC 3189) +// (Thanks to Ben Hutchings for prototyping this.) +// Implementation + +#include "DVVideoRTPSink.hh" + +////////// DVVideoRTPSink implementation ////////// + +DVVideoRTPSink +::DVVideoRTPSink(UsageEnvironment& env, Groupsock* RTPgs, unsigned char rtpPayloadFormat) + : VideoRTPSink(env, RTPgs, rtpPayloadFormat, 90000, "DV"), + fFmtpSDPLine(NULL) { +} + +DVVideoRTPSink::~DVVideoRTPSink() { + delete[] fFmtpSDPLine; +} + +DVVideoRTPSink* +DVVideoRTPSink::createNew(UsageEnvironment& env, Groupsock* RTPgs, unsigned char rtpPayloadFormat) { + return new DVVideoRTPSink(env, RTPgs, rtpPayloadFormat); +} + +Boolean DVVideoRTPSink::sourceIsCompatibleWithUs(MediaSource& source) { + // Our source must be an appropriate framer: + return source.isDVVideoStreamFramer(); +} + +void DVVideoRTPSink::doSpecialFrameHandling(unsigned fragmentationOffset, + unsigned char* /*frameStart*/, + unsigned /*numBytesInFrame*/, + struct timeval framePresentationTime, + unsigned numRemainingBytes) { + if (numRemainingBytes == 0) { + // This packet contains the last (or only) fragment of the frame. + // Set the RTP 'M' ('marker') bit: + setMarkerBit(); + } + + // Also set the RTP timestamp: + setTimestamp(framePresentationTime); +} + +unsigned DVVideoRTPSink::computeOverflowForNewFrame(unsigned newFrameSize) const { + unsigned initialOverflow = MultiFramedRTPSink::computeOverflowForNewFrame(newFrameSize); + + // Adjust (increase) this overflow, if necessary, so that the amount of frame data that we use is an integral number + // of DIF blocks: + unsigned numFrameBytesUsed = newFrameSize - initialOverflow; + initialOverflow += numFrameBytesUsed%DV_DIF_BLOCK_SIZE; + + return initialOverflow; +} + +char const* DVVideoRTPSink::auxSDPLine() { + // Generate a new "a=fmtp:" line each time, using parameters from + // our framer source (in case they've changed since the last time that + // we were called): + DVVideoStreamFramer* framerSource = (DVVideoStreamFramer*)fSource; + if (framerSource == NULL) return NULL; // we don't yet have a source + + return auxSDPLineFromFramer(framerSource); +} + +char const* DVVideoRTPSink::auxSDPLineFromFramer(DVVideoStreamFramer* framerSource) { + char const* const profileName = framerSource->profileName(); + if (profileName == NULL) return NULL; + + char const* const fmtpSDPFmt = "a=fmtp:%d encode=%s;audio=bundled\r\n"; + unsigned fmtpSDPFmtSize = strlen(fmtpSDPFmt) + + 3 // max payload format code length + + strlen(profileName); + delete[] fFmtpSDPLine; // if it already exists + fFmtpSDPLine = new char[fmtpSDPFmtSize]; + sprintf(fFmtpSDPLine, fmtpSDPFmt, rtpPayloadType(), profileName); + + return fFmtpSDPLine; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/DVVideoRTPSource.cpp b/src/big/mpp/middleware/src/live555/liveMedia/DVVideoRTPSource.cpp new file mode 100644 index 000000000..ee6dc2955 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/DVVideoRTPSource.cpp @@ -0,0 +1,65 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// DV Video RTP Sources +// Implementation + +#include "DVVideoRTPSource.hh" + +DVVideoRTPSource* +DVVideoRTPSource::createNew(UsageEnvironment& env, + Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency) { + return new DVVideoRTPSource(env, RTPgs, rtpPayloadFormat, rtpTimestampFrequency); +} + +DVVideoRTPSource::DVVideoRTPSource(UsageEnvironment& env, + Groupsock* rtpGS, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency) + : MultiFramedRTPSource(env, rtpGS, + rtpPayloadFormat, rtpTimestampFrequency) { +} + +DVVideoRTPSource::~DVVideoRTPSource() { +} + +#define DV_DIF_BLOCK_SIZE 80 +#define DV_SECTION_HEADER 0x1F + +Boolean DVVideoRTPSource +::processSpecialHeader(BufferedPacket* packet, + unsigned& resultSpecialHeaderSize) { + unsigned const packetSize = packet->dataSize(); + if (packetSize < DV_DIF_BLOCK_SIZE) return False; // TARFU! + + u_int8_t const* data = packet->data(); + fCurrentPacketBeginsFrame = data[0] == DV_SECTION_HEADER && (data[1]&0xf8) == 0 && data[2] == 0; // thanks to Ben Hutchings + + // The RTP "M" (marker) bit indicates the last fragment of a frame: + fCurrentPacketCompletesFrame = packet->rtpMarkerBit(); + + // There is no special header + resultSpecialHeaderSize = 0; + return True; +} + +char const* DVVideoRTPSource::MIMEtype() const { + return "video/DV"; +} + diff --git a/src/big/mpp/middleware/src/live555/liveMedia/DVVideoStreamFramer.cpp b/src/big/mpp/middleware/src/live555/liveMedia/DVVideoStreamFramer.cpp new file mode 100644 index 000000000..8ec3d7ed7 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/DVVideoStreamFramer.cpp @@ -0,0 +1,220 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A filter that parses a DV input stream into DV frames to deliver to the downstream object +// Implementation +// (Thanks to Ben Hutchings for his help, including a prototype implementation.) + +#include "DVVideoStreamFramer.hh" +#include "GroupsockHelper.hh" + +////////// DVVideoStreamFramer implementation ////////// + +DVVideoStreamFramer::DVVideoStreamFramer(UsageEnvironment& env, FramedSource* inputSource, + Boolean sourceIsSeekable, Boolean leavePresentationTimesUnmodified) + : FramedFilter(env, inputSource), + fLeavePresentationTimesUnmodified(leavePresentationTimesUnmodified), + fOurProfile(NULL), fInitialBlocksPresent(False), fSourceIsSeekable(sourceIsSeekable) { + fTo = NULL; // hack used when reading "fSavedInitialBlocks" + // Use the current wallclock time as the initial 'presentation time': + gettimeofday(&fNextFramePresentationTime, NULL); +} + +DVVideoStreamFramer::~DVVideoStreamFramer() { +} + +DVVideoStreamFramer* +DVVideoStreamFramer::createNew(UsageEnvironment& env, FramedSource* inputSource, + Boolean sourceIsSeekable, Boolean leavePresentationTimesUnmodified) { + return new DVVideoStreamFramer(env, inputSource, sourceIsSeekable, leavePresentationTimesUnmodified); +} + +// Define the parameters for the profiles that we understand: +struct DVVideoProfile { + char const* name; + unsigned apt; + unsigned sType; + unsigned sequenceCount; + unsigned channelCount; + unsigned dvFrameSize; // in bytes (== sequenceCount*channelCount*(DV_NUM_BLOCKS_PER_SEQUENCE*DV_DIF_BLOCK_SIZE i.e. 12000)) + double frameDuration; // duration of the above, in microseconds. (1000000/this == frame rate) +}; + +static DVVideoProfile const profiles[] = { + { "SD-VCR/525-60", 0, 0x00, 10, 1, 120000, (1000000*1001)/30000.0 }, + { "SD-VCR/625-50", 0, 0x00, 12, 1, 144000, 1000000/25.0 }, + { "314M-25/525-60", 1, 0x00, 10, 1, 120000, (1000000*1001)/30000.0 }, + { "314M-25/625-50", 1, 0x00, 12, 1, 144000, 1000000/25.0 }, + { "314M-50/525-60", 1, 0x04, 10, 2, 240000, (1000000*1001)/30000.0 }, + { "314M-50/625-50", 1, 0x04, 12, 2, 288000, 1000000/25.0 }, + { "370M/1080-60i", 1, 0x14, 10, 4, 480000, (1000000*1001)/30000.0 }, + { "370M/1080-50i", 1, 0x14, 12, 4, 576000, 1000000/25.0 }, + { "370M/720-60p", 1, 0x18, 10, 2, 240000, (1000000*1001)/60000.0 }, + { "370M/720-50p", 1, 0x18, 12, 2, 288000, 1000000/50.0 }, + { NULL, 0, 0, 0, 0, 0, 0.0 } + }; + + +char const* DVVideoStreamFramer::profileName() { + if (fOurProfile == NULL) getProfile(); + + return fOurProfile != NULL ? ((DVVideoProfile const*)fOurProfile)->name : NULL; +} + +Boolean DVVideoStreamFramer::getFrameParameters(unsigned& frameSize, double& frameDuration) { + if (fOurProfile == NULL) getProfile(); + if (fOurProfile == NULL) return False; + + frameSize = ((DVVideoProfile const*)fOurProfile)->dvFrameSize; + frameDuration = ((DVVideoProfile const*)fOurProfile)->frameDuration; + return True; +} + +void DVVideoStreamFramer::getProfile() { + // To determine the stream's profile, we need to first read a chunk of data that we can parse: + fInputSource->getNextFrame(fSavedInitialBlocks, DV_SAVED_INITIAL_BLOCKS_SIZE, + afterGettingFrame, this, FramedSource::handleClosure, this); + + // Handle events until the requested data arrives: + envir().taskScheduler().doEventLoop(&fInitialBlocksPresent); +} + +Boolean DVVideoStreamFramer::isDVVideoStreamFramer() const { + return True; +} + +void DVVideoStreamFramer::doGetNextFrame() { + fFrameSize = 0; // initially, until we deliver data + + // If we have saved initial blocks (and won't be seeking back to re-read this data), so use this data first. + if (fInitialBlocksPresent && !fSourceIsSeekable) { + // For simplicity, we require the downstream object's buffer to be >= this data's size: + if (fMaxSize < DV_SAVED_INITIAL_BLOCKS_SIZE) { + fNumTruncatedBytes = fMaxSize; + afterGetting(this); + return; + } + + memmove(fTo, fSavedInitialBlocks, DV_SAVED_INITIAL_BLOCKS_SIZE); + fFrameSize = DV_SAVED_INITIAL_BLOCKS_SIZE; + fTo += DV_SAVED_INITIAL_BLOCKS_SIZE; + fInitialBlocksPresent = False; // for the future + } + + // Arrange to read the (rest of the) requested data. + // (But first, make sure that we read an integral multiple of the DV block size.) + fMaxSize -= fMaxSize%DV_DIF_BLOCK_SIZE; + getAndDeliverData(); +} + +#define DV_SMALLEST_POSSIBLE_FRAME_SIZE 120000 + +void DVVideoStreamFramer::getAndDeliverData() { + unsigned const totFrameSize + = fOurProfile != NULL ? ((DVVideoProfile const*)fOurProfile)->dvFrameSize : DV_SMALLEST_POSSIBLE_FRAME_SIZE; + unsigned totBytesToDeliver = totFrameSize < fMaxSize ? totFrameSize : fMaxSize; + unsigned numBytesToRead = totBytesToDeliver - fFrameSize; + + fInputSource->getNextFrame(fTo, numBytesToRead, afterGettingFrame, this, FramedSource::handleClosure, this); +} + +void DVVideoStreamFramer::afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, unsigned /*durationInMicroseconds*/) { + DVVideoStreamFramer* source = (DVVideoStreamFramer*)clientData; + source->afterGettingFrame(frameSize, numTruncatedBytes, presentationTime); +} + +#define DVSectionId(n) ptr[(n)*DV_DIF_BLOCK_SIZE + 0] +#define DVData(n,i) ptr[(n)*DV_DIF_BLOCK_SIZE + 3+(i)] + +#define DV_SECTION_HEADER 0x1F +#define DV_PACK_HEADER_10 0x3F +#define DV_PACK_HEADER_12 0xBF +#define DV_SECTION_VAUX_MIN 0x50 +#define DV_SECTION_VAUX_MAX 0x5F +#define DV_PACK_VIDEO_SOURCE 60 +#ifndef MILLION +#define MILLION 1000000 +#endif + +void DVVideoStreamFramer::afterGettingFrame(unsigned frameSize, unsigned numTruncatedBytes, struct timeval presentationTime) { + if (fOurProfile == NULL && frameSize >= DV_SAVED_INITIAL_BLOCKS_SIZE) { + // (Try to) parse this data enough to figure out its profile. + // We assume that the data begins on a (80-byte) block boundary, but not necessarily on a (150-block) sequence boundary. + // We therefore scan each 80-byte block, until we find the 6-block header that begins a sequence: + u_int8_t const* data = (fTo == NULL) ? fSavedInitialBlocks : fTo; + for (u_int8_t const* ptr = data; ptr + 6*DV_DIF_BLOCK_SIZE <= &data[DV_SAVED_INITIAL_BLOCKS_SIZE]; ptr += DV_DIF_BLOCK_SIZE) { + // Check whether "ptr" points to an appropriate header: + u_int8_t const sectionHeader = DVSectionId(0); + u_int8_t const sectionVAUX = DVSectionId(5); + u_int8_t const packHeaderNum = DVData(0,0); + + if (sectionHeader == DV_SECTION_HEADER + && (packHeaderNum == DV_PACK_HEADER_10 || packHeaderNum == DV_PACK_HEADER_12) + && (sectionVAUX >= DV_SECTION_VAUX_MIN && sectionVAUX <= DV_SECTION_VAUX_MAX)) { + // This data begins a sequence; look up the DV profile from this: + u_int8_t const apt = DVData(0,1)&0x07; + u_int8_t const sType = DVData(5,48)&0x1F; + u_int8_t const sequenceCount = (packHeaderNum == DV_PACK_HEADER_10) ? 10 : 12; + + // Use these three parameters (apt, sType, sequenceCount) to look up the DV profile: + for (DVVideoProfile const* profile = profiles; profile->name != NULL; ++profile) { + if (profile->apt == apt && profile->sType == sType && profile->sequenceCount == sequenceCount) { + fOurProfile = profile; + break; + } + } + break; // because we found a correct sequence header (even if we don't happen to define a profile for it) + } + } + } + + if (fTo != NULL) { // There is a downstream object; complete delivery to it (or read more data, if necessary) + unsigned const totFrameSize + = fOurProfile != NULL ? ((DVVideoProfile const*)fOurProfile)->dvFrameSize : DV_SMALLEST_POSSIBLE_FRAME_SIZE; + fFrameSize += frameSize; + fTo += frameSize; + fPresentationTime = presentationTime; // by default; may get changed below + + if (fFrameSize < totFrameSize && fFrameSize < fMaxSize && numTruncatedBytes == 0) { + // We have more data to deliver; get it now: + getAndDeliverData(); + } else { + // We're done delivering this DV frame (but check for truncation): + fNumTruncatedBytes = totFrameSize - fFrameSize; + + if (fOurProfile != NULL) { + // Also set the presentation time, and increment it for next time, + // based on the length of this frame: + if (!fLeavePresentationTimesUnmodified) fPresentationTime = fNextFramePresentationTime; + + DVVideoProfile const* ourProfile =(DVVideoProfile const*)fOurProfile; + double durationInMicroseconds = (fFrameSize*ourProfile->frameDuration)/ourProfile->dvFrameSize; + fDurationInMicroseconds = (unsigned)durationInMicroseconds; + fNextFramePresentationTime.tv_usec += fDurationInMicroseconds; + fNextFramePresentationTime.tv_sec += fNextFramePresentationTime.tv_usec/MILLION; + fNextFramePresentationTime.tv_usec %= MILLION; + } + + afterGetting(this); + } + } else { + // We read data into our special buffer; signal that it has arrived: + fInitialBlocksPresent = True; + } +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/DeviceSource.cpp b/src/big/mpp/middleware/src/live555/liveMedia/DeviceSource.cpp new file mode 100644 index 000000000..f55497b3e --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/DeviceSource.cpp @@ -0,0 +1,156 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A template for a MediaSource encapsulating an audio/video input device +// +// NOTE: Sections of this code labeled "%%% TO BE WRITTEN %%%" are incomplete, and need to be written by the programmer +// (depending on the features of the particular device). +// Implementation + +#include "DeviceSource.hh" +#include // for "gettimeofday()" + +DeviceSource* +DeviceSource::createNew(UsageEnvironment& env, + DeviceParameters params) { + return new DeviceSource(env, params); +} + +EventTriggerId DeviceSource::eventTriggerId = 0; + +unsigned DeviceSource::referenceCount = 0; + +DeviceSource::DeviceSource(UsageEnvironment& env, + DeviceParameters params) + : FramedSource(env), fParams(params) { + if (referenceCount == 0) { + // Any global initialization of the device would be done here: + //%%% TO BE WRITTEN %%% + } + ++referenceCount; + + // Any instance-specific initialization of the device would be done here: + //%%% TO BE WRITTEN %%% + + // We arrange here for our "deliverFrame" member function to be called + // whenever the next frame of data becomes available from the device. + // + // If the device can be accessed as a readable socket, then one easy way to do this is using a call to + // envir().taskScheduler().turnOnBackgroundReadHandling( ... ) + // (See examples of this call in the "liveMedia" directory.) + // + // If, however, the device *cannot* be accessed as a readable socket, then instead we can implement it using 'event triggers': + // Create an 'event trigger' for this device (if it hasn't already been done): + if (eventTriggerId == 0) { + eventTriggerId = envir().taskScheduler().createEventTrigger(deliverFrame0); + } +} + +DeviceSource::~DeviceSource() { + // Any instance-specific 'destruction' (i.e., resetting) of the device would be done here: + //%%% TO BE WRITTEN %%% + + --referenceCount; + if (referenceCount == 0) { + // Any global 'destruction' (i.e., resetting) of the device would be done here: + //%%% TO BE WRITTEN %%% + + // Reclaim our 'event trigger' + envir().taskScheduler().deleteEventTrigger(eventTriggerId); + eventTriggerId = 0; + } +} + +void DeviceSource::doGetNextFrame() { + // This function is called (by our 'downstream' object) when it asks for new data. + + // Note: If, for some reason, the source device stops being readable (e.g., it gets closed), then you do the following: + if (0 /* the source stops being readable */ /*%%% TO BE WRITTEN %%%*/) { + handleClosure(); + return; + } + + // If a new frame of data is immediately available to be delivered, then do this now: + if (0 /* a new frame of data is immediately available to be delivered*/ /*%%% TO BE WRITTEN %%%*/) { + deliverFrame(); + } + + // No new data is immediately available to be delivered. We don't do anything more here. + // Instead, our event trigger must be called (e.g., from a separate thread) when new data becomes available. +} + +void DeviceSource::deliverFrame0(void* clientData) { + ((DeviceSource*)clientData)->deliverFrame(); +} + +void DeviceSource::deliverFrame() { + // This function is called when new frame data is available from the device. + // We deliver this data by copying it to the 'downstream' object, using the following parameters (class members): + // 'in' parameters (these should *not* be modified by this function): + // fTo: The frame data is copied to this address. + // (Note that the variable "fTo" is *not* modified. Instead, + // the frame data is copied to the address pointed to by "fTo".) + // fMaxSize: This is the maximum number of bytes that can be copied + // (If the actual frame is larger than this, then it should + // be truncated, and "fNumTruncatedBytes" set accordingly.) + // 'out' parameters (these are modified by this function): + // fFrameSize: Should be set to the delivered frame size (<= fMaxSize). + // fNumTruncatedBytes: Should be set iff the delivered frame would have been + // bigger than "fMaxSize", in which case it's set to the number of bytes + // that have been omitted. + // fPresentationTime: Should be set to the frame's presentation time + // (seconds, microseconds). This time must be aligned with 'wall-clock time' - i.e., the time that you would get + // by calling "gettimeofday()". + // fDurationInMicroseconds: Should be set to the frame's duration, if known. + // If, however, the device is a 'live source' (e.g., encoded from a camera or microphone), then we probably don't need + // to set this variable, because - in this case - data will never arrive 'early'. + // Note the code below. + + if (!isCurrentlyAwaitingData()) return; // we're not ready for the data yet + + u_int8_t* newFrameDataStart = (u_int8_t*)0xDEADBEEF; //%%% TO BE WRITTEN %%% + unsigned newFrameSize = 0; //%%% TO BE WRITTEN %%% + + // Deliver the data here: + if (newFrameSize > fMaxSize) { + fFrameSize = fMaxSize; + fNumTruncatedBytes = newFrameSize - fMaxSize; + } else { + fFrameSize = newFrameSize; + } + gettimeofday(&fPresentationTime, NULL); // If you have a more accurate time - e.g., from an encoder - then use that instead. + // If the device is *not* a 'live source' (e.g., it comes instead from a file or buffer), then set "fDurationInMicroseconds" here. + memmove(fTo, newFrameDataStart, fFrameSize); + + // After delivering the data, inform the reader that it is now available: + FramedSource::afterGetting(this); +} + + +// The following code would be called to signal that a new frame of data has become available. +// This (unlike other "LIVE555 Streaming Media" library code) may be called from a separate thread. +// (Note, however, that "triggerEvent()" cannot be called with the same 'event trigger id' from different threads. +// Also, if you want to have multiple device threads, each one using a different 'event trigger id', then you will need +// to make "eventTriggerId" a non-static member variable of "DeviceSource".) +void signalNewFrameData() { + TaskScheduler* ourScheduler = NULL; //%%% TO BE WRITTEN %%% + DeviceSource* ourDevice = NULL; //%%% TO BE WRITTEN %%% + + if (ourScheduler != NULL) { // sanity check + ourScheduler->triggerEvent(DeviceSource::eventTriggerId, ourDevice); + } +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/DigestAuthentication.cpp b/src/big/mpp/middleware/src/live555/liveMedia/DigestAuthentication.cpp new file mode 100644 index 000000000..6734c05af --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/DigestAuthentication.cpp @@ -0,0 +1,173 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A class used for digest authentication. +// Implementation + +#include "DigestAuthentication.hh" +#include "ourMD5.hh" +#include +#include // for gettimeofday() +#include +#include +#include + +Authenticator::Authenticator() { + assign(NULL, NULL, NULL, NULL, False); +} + +Authenticator::Authenticator(char const* username, char const* password, Boolean passwordIsMD5) { + assign(NULL, NULL, username, password, passwordIsMD5); +} + +Authenticator::Authenticator(const Authenticator& orig) { + assign(orig.realm(), orig.nonce(), orig.username(), orig.password(), orig.fPasswordIsMD5); +} + +Authenticator& Authenticator::operator=(const Authenticator& rightSide) { + if (&rightSide != this) { + reset(); + assign(rightSide.realm(), rightSide.nonce(), + rightSide.username(), rightSide.password(), rightSide.fPasswordIsMD5); + } + + return *this; +} + +Boolean Authenticator::operator<(const Authenticator* rightSide) { + // Returns True if "rightSide" is 'newer' than us: + if (rightSide != NULL && rightSide != this && + (rightSide->realm() != NULL || rightSide->nonce() != NULL || + username() == NULL || password() == NULL || + strcmp(rightSide->username(), username()) != 0 || + strcmp(rightSide->password(), password()) != 0)) { + return True; + } + + return False; +} + +Authenticator::~Authenticator() { + reset(); +} + +void Authenticator::reset() { + resetRealmAndNonce(); + resetUsernameAndPassword(); +} + +void Authenticator::setRealmAndNonce(char const* realm, char const* nonce) { + resetRealmAndNonce(); + assignRealmAndNonce(realm, nonce); +} + +void Authenticator::setRealmAndRandomNonce(char const* realm) { + resetRealmAndNonce(); + + // Construct data to seed the random nonce: + struct { + struct timeval timestamp; + unsigned counter; + } seedData; + gettimeofday(&seedData.timestamp, NULL); + static unsigned counter = 0; + seedData.counter = ++counter; + + // Use MD5 to compute a 'random' nonce from this seed data: + char nonceBuf[33]; + our_MD5Data((unsigned char*)(&seedData), sizeof seedData, nonceBuf); + + assignRealmAndNonce(realm, nonceBuf); +} + +void Authenticator::setUsernameAndPassword(char const* username, + char const* password, + Boolean passwordIsMD5) { + resetUsernameAndPassword(); + assignUsernameAndPassword(username, password, passwordIsMD5); +} + +char const* Authenticator::computeDigestResponse(char const* cmd, + char const* url) const { + // The "response" field is computed as: + // md5(md5(::)::md5(:)) + // or, if "fPasswordIsMD5" is True: + // md5(::md5(:)) + char ha1Buf[33]; + if (fPasswordIsMD5) { + strncpy(ha1Buf, password(), 32); + ha1Buf[32] = '\0'; // just in case + } else { + unsigned const ha1DataLen = strlen(username()) + 1 + + strlen(realm()) + 1 + strlen(password()); + unsigned char* ha1Data = new unsigned char[ha1DataLen+1]; + sprintf((char*)ha1Data, "%s:%s:%s", username(), realm(), password()); + our_MD5Data(ha1Data, ha1DataLen, ha1Buf); + delete[] ha1Data; + } + + unsigned const ha2DataLen = strlen(cmd) + 1 + strlen(url); + unsigned char* ha2Data = new unsigned char[ha2DataLen+1]; + sprintf((char*)ha2Data, "%s:%s", cmd, url); + char ha2Buf[33]; + our_MD5Data(ha2Data, ha2DataLen, ha2Buf); + delete[] ha2Data; + + unsigned const digestDataLen + = 32 + 1 + strlen(nonce()) + 1 + 32; + unsigned char* digestData = new unsigned char[digestDataLen+1]; + sprintf((char*)digestData, "%s:%s:%s", + ha1Buf, nonce(), ha2Buf); + char const* result = our_MD5Data(digestData, digestDataLen, NULL); + delete[] digestData; + return result; +} + +void Authenticator::reclaimDigestResponse(char const* responseStr) const { + delete[](char*)responseStr; +} + +void Authenticator::resetRealmAndNonce() { + delete[] fRealm; fRealm = NULL; + delete[] fNonce; fNonce = NULL; +} + +void Authenticator::resetUsernameAndPassword() { + delete[] fUsername; fUsername = NULL; + delete[] fPassword; fPassword = NULL; + fPasswordIsMD5 = False; +} + +void Authenticator::assignRealmAndNonce(char const* realm, char const* nonce) { + fRealm = strDup(realm); + fNonce = strDup(nonce); +} + +void Authenticator::assignUsernameAndPassword(char const* username, char const* password, Boolean passwordIsMD5) { + if (username == NULL) username = ""; + if (password == NULL) password = ""; + + fUsername = strDup(username); + fPassword = strDup(password); + fPasswordIsMD5 = passwordIsMD5; +} + +void Authenticator::assign(char const* realm, char const* nonce, + char const* username, char const* password, Boolean passwordIsMD5) { + assignRealmAndNonce(realm, nonce); + assignUsernameAndPassword(username, password, passwordIsMD5); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/EBMLNumber.cpp b/src/big/mpp/middleware/src/live555/liveMedia/EBMLNumber.cpp new file mode 100644 index 000000000..ff24ffe11 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/EBMLNumber.cpp @@ -0,0 +1,150 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// EBML numbers (ids and sizes) +// Implementation + +#include "EBMLNumber.hh" + +EBMLNumber::EBMLNumber(Boolean stripLeading1) + : stripLeading1(stripLeading1), len(0) { +} + +EBMLNumber::~EBMLNumber() { +} + +char* EBMLNumber::hexString() const { + static char printBuf[2*EBML_NUMBER_MAX_LEN + 1]; + + char* to = printBuf; + for (unsigned i = 0; i < len; ++i) { + sprintf(to, "%02X", data[i]); + to += 2; + } + + return printBuf; +} + +u_int64_t EBMLNumber::val() const { + u_int64_t result = 0; + + for (unsigned i = 0; i < len; ++i) { + result = result*256 + data[i]; + } + + return result; +} + +EBMLId::EBMLId() + : EBMLNumber(False) { +} + +EBMLId::~EBMLId() { +} + +char const* EBMLId::stringName() const { + switch (val()) { + case MATROSKA_ID_EBML: { return "EBML"; } + case MATROSKA_ID_VOID: { return "Void"; } + case MATROSKA_ID_CRC_32: { return "CRC-32"; } + case MATROSKA_ID_SEGMENT: { return "Segment"; } + case MATROSKA_ID_SEEK_HEAD: { return "Seek Head"; } + case MATROSKA_ID_SEEK: { return "Seek"; } + case MATROSKA_ID_SEEK_ID: { return "Seek ID"; } + case MATROSKA_ID_SEEK_POSITION: { return "Seek Position"; } + case MATROSKA_ID_INFO: { return "Segment Info"; } + case MATROSKA_ID_SEGMENT_UID: { return "Segment UID"; } + case MATROSKA_ID_DURATION: { return "Segment Duration"; } + case MATROSKA_ID_TIMECODE_SCALE: { return "Timecode Scale"; } + case MATROSKA_ID_DATE_UTC: { return "Date (UTC)"; } + case MATROSKA_ID_TITLE: { return "Title"; } + case MATROSKA_ID_MUXING_APP: { return "Muxing App"; } + case MATROSKA_ID_WRITING_APP: { return "Writing App"; } + case MATROSKA_ID_CLUSTER: { return "Cluster"; } + case MATROSKA_ID_TIMECODE: { return "TimeCode"; } + case MATROSKA_ID_POSITION: { return "Position"; } + case MATROSKA_ID_PREV_SIZE: { return "Prev. Size"; } + case MATROSKA_ID_SIMPLEBLOCK: { return "SimpleBlock"; } + case MATROSKA_ID_BLOCK_GROUP: { return "Block Group"; } + case MATROSKA_ID_BLOCK: { return "Block"; } + case MATROSKA_ID_BLOCK_DURATION: { return "Block Duration"; } + case MATROSKA_ID_REFERENCE_BLOCK: { return "Reference Block"; } + case MATROSKA_ID_TRACKS: { return "Tracks"; } + case MATROSKA_ID_TRACK_ENTRY: { return "Track Entry"; } + case MATROSKA_ID_TRACK_NUMBER: { return "Track Number"; } + case MATROSKA_ID_TRACK_UID: { return "Track UID"; } + case MATROSKA_ID_TRACK_TYPE: { return "Track Type"; } + case MATROSKA_ID_FLAG_ENABLED: { return "Flag Enabled"; } + case MATROSKA_ID_FLAG_DEFAULT: { return "Flag Default"; } + case MATROSKA_ID_FLAG_FORCED: { return "Flag Forced"; } + case MATROSKA_ID_FLAG_LACING: { return "Flag Lacing"; } + case MATROSKA_ID_MIN_CACHE: { return "Min Cache"; } + case MATROSKA_ID_DEFAULT_DURATION: { return "Default Duration"; } + case MATROSKA_ID_TRACK_TIMECODE_SCALE: { return "Track Timecode Scale"; } + case MATROSKA_ID_MAX_BLOCK_ADDITION_ID: { return "Max Block Addition ID"; } + case MATROSKA_ID_NAME: { return "Name"; } + case MATROSKA_ID_LANGUAGE: { return "Language"; } + case MATROSKA_ID_CODEC: { return "Codec ID"; } + case MATROSKA_ID_CODEC_PRIVATE: { return "Codec Private"; } + case MATROSKA_ID_CODEC_NAME: { return "Codec Name"; } + case MATROSKA_ID_CODEC_DECODE_ALL: { return "Codec Decode All"; } + case MATROSKA_ID_VIDEO: { return "Video Settings"; } + case MATROSKA_ID_FLAG_INTERLACED: { return "Flag Interlaced"; } + case MATROSKA_ID_PIXEL_WIDTH: { return "Pixel Width"; } + case MATROSKA_ID_PIXEL_HEIGHT: { return "Pixel Height"; } + case MATROSKA_ID_DISPLAY_WIDTH: { return "Display Width"; } + case MATROSKA_ID_DISPLAY_HEIGHT: { return "Display Height"; } + case MATROSKA_ID_DISPLAY_UNIT: { return "Display Unit"; } + case MATROSKA_ID_AUDIO: { return "Audio Settings"; } + case MATROSKA_ID_SAMPLING_FREQUENCY: { return "Sampling Frequency"; } + case MATROSKA_ID_OUTPUT_SAMPLING_FREQUENCY: { return "Output Sampling Frequency"; } + case MATROSKA_ID_CHANNELS: { return "Channels"; } + case MATROSKA_ID_BIT_DEPTH: { return "Bit Depth"; } + case MATROSKA_ID_CONTENT_ENCODINGS: { return "Content Encodings"; } + case MATROSKA_ID_CONTENT_ENCODING: { return "Content Encoding"; } + case MATROSKA_ID_CONTENT_COMPRESSION: { return "Content Compression"; } + case MATROSKA_ID_CONTENT_COMP_ALGO: { return "Content Compression Algorithm"; } + case MATROSKA_ID_CONTENT_COMP_SETTINGS: { return "Content Compression Settings"; } + case MATROSKA_ID_CONTENT_ENCRYPTION: { return "Content Encryption"; } + case MATROSKA_ID_ATTACHMENTS: { return "Attachments"; } + case MATROSKA_ID_ATTACHED_FILE: { return "Attached File"; } + case MATROSKA_ID_FILE_DESCRIPTION: { return "File Description"; } + case MATROSKA_ID_FILE_NAME: { return "File Name"; } + case MATROSKA_ID_FILE_MIME_TYPE: { return "File MIME Type"; } + case MATROSKA_ID_FILE_DATA: { return "File Data"; } + case MATROSKA_ID_FILE_UID: { return "File UID"; } + case MATROSKA_ID_CUES: { return "Cues"; } + case MATROSKA_ID_CUE_POINT: { return "Cue Point"; } + case MATROSKA_ID_CUE_TIME: { return "Cue Time"; } + case MATROSKA_ID_CUE_TRACK_POSITIONS: { return "Cue Track Positions"; } + case MATROSKA_ID_CUE_TRACK: { return "Cue Track"; } + case MATROSKA_ID_CUE_CLUSTER_POSITION: { return "Cue Cluster Position"; } + case MATROSKA_ID_CUE_BLOCK_NUMBER: { return "Cue Block Number"; } + case MATROSKA_ID_TAGS: { return "Tags"; } + case MATROSKA_ID_SEEK_PRE_ROLL: { return "SeekPreRoll"; } + case MATROSKA_ID_CODEC_DELAY: { return "CodecDelay"; } + case MATROSKA_ID_DISCARD_PADDING: { return "DiscardPadding"; } + default: { return "*****unknown*****"; } + } +} + +EBMLDataSize::EBMLDataSize() + : EBMLNumber(True) { +} + +EBMLDataSize::~EBMLDataSize() { +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/EBMLNumber.hh b/src/big/mpp/middleware/src/live555/liveMedia/EBMLNumber.hh new file mode 100644 index 000000000..7c4962e57 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/EBMLNumber.hh @@ -0,0 +1,144 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// EBML numbers (ids and sizes) +// C++ header + +#ifndef _EBML_NUMBER_HH +#define _EBML_NUMBER_HH + +#include "NetCommon.h" +#include "Boolean.hh" +#include + +#define EBML_NUMBER_MAX_LEN 8 + +class EBMLNumber { +public: + EBMLNumber(Boolean stripLeading1 = True); + virtual ~EBMLNumber(); + + u_int64_t val() const; + char* hexString() const; // used for debugging + Boolean operator==(u_int64_t arg2) const { return val() == arg2; } + Boolean operator!=(u_int64_t arg2) const { return !(*this == arg2); } + +public: + Boolean stripLeading1; + unsigned len; + u_int8_t data[EBML_NUMBER_MAX_LEN]; +}; + +// Definitions of some Matroska/EBML IDs (including the ones that we check for): +#define MATROSKA_ID_EBML 0x1A45DFA3 +#define MATROSKA_ID_VOID 0xEC +#define MATROSKA_ID_CRC_32 0xBF +#define MATROSKA_ID_SEGMENT 0x18538067 +#define MATROSKA_ID_SEEK_HEAD 0x114D9B74 +#define MATROSKA_ID_SEEK 0x4DBB +#define MATROSKA_ID_SEEK_ID 0x53AB +#define MATROSKA_ID_SEEK_POSITION 0x53AC +#define MATROSKA_ID_INFO 0x1549A966 +#define MATROSKA_ID_SEGMENT_UID 0x73A4 +#define MATROSKA_ID_TIMECODE_SCALE 0x2AD7B1 +#define MATROSKA_ID_DURATION 0x4489 +#define MATROSKA_ID_DATE_UTC 0x4461 +#define MATROSKA_ID_TITLE 0x7BA9 +#define MATROSKA_ID_MUXING_APP 0x4D80 +#define MATROSKA_ID_WRITING_APP 0x5741 +#define MATROSKA_ID_CLUSTER 0x1F43B675 +#define MATROSKA_ID_TIMECODE 0xE7 +#define MATROSKA_ID_POSITION 0xA7 +#define MATROSKA_ID_PREV_SIZE 0xAB +#define MATROSKA_ID_SIMPLEBLOCK 0xA3 +#define MATROSKA_ID_BLOCK_GROUP 0xA0 +#define MATROSKA_ID_BLOCK 0xA1 +#define MATROSKA_ID_BLOCK_DURATION 0x9B +#define MATROSKA_ID_REFERENCE_BLOCK 0xFB +#define MATROSKA_ID_TRACKS 0x1654AE6B +#define MATROSKA_ID_TRACK_ENTRY 0xAE +#define MATROSKA_ID_TRACK_NUMBER 0xD7 +#define MATROSKA_ID_TRACK_UID 0x73C5 +#define MATROSKA_ID_TRACK_TYPE 0x83 +#define MATROSKA_ID_FLAG_ENABLED 0xB9 +#define MATROSKA_ID_FLAG_DEFAULT 0x88 +#define MATROSKA_ID_FLAG_FORCED 0x55AA +#define MATROSKA_ID_FLAG_LACING 0x9C +#define MATROSKA_ID_MIN_CACHE 0x6DE7 +#define MATROSKA_ID_DEFAULT_DURATION 0x23E383 +#define MATROSKA_ID_TRACK_TIMECODE_SCALE 0x23314F +#define MATROSKA_ID_MAX_BLOCK_ADDITION_ID 0x55EE +#define MATROSKA_ID_NAME 0x536E +#define MATROSKA_ID_LANGUAGE 0x22B59C +#define MATROSKA_ID_CODEC 0x86 +#define MATROSKA_ID_CODEC_PRIVATE 0x63A2 +#define MATROSKA_ID_CODEC_NAME 0x258688 +#define MATROSKA_ID_CODEC_DECODE_ALL 0xAA +#define MATROSKA_ID_VIDEO 0xE0 +#define MATROSKA_ID_FLAG_INTERLACED 0x9A +#define MATROSKA_ID_PIXEL_WIDTH 0xB0 +#define MATROSKA_ID_PIXEL_HEIGHT 0xBA +#define MATROSKA_ID_DISPLAY_WIDTH 0x54B0 +#define MATROSKA_ID_DISPLAY_HEIGHT 0x54BA +#define MATROSKA_ID_DISPLAY_UNIT 0x54B2 +#define MATROSKA_ID_AUDIO 0xE1 +#define MATROSKA_ID_SAMPLING_FREQUENCY 0xB5 +#define MATROSKA_ID_OUTPUT_SAMPLING_FREQUENCY 0x78B5 +#define MATROSKA_ID_CHANNELS 0x9F +#define MATROSKA_ID_BIT_DEPTH 0x6264 +#define MATROSKA_ID_CONTENT_ENCODINGS 0x6D80 +#define MATROSKA_ID_CONTENT_ENCODING 0x6240 +#define MATROSKA_ID_CONTENT_COMPRESSION 0x5034 +#define MATROSKA_ID_CONTENT_COMP_ALGO 0x4254 +#define MATROSKA_ID_CONTENT_COMP_SETTINGS 0x4255 +#define MATROSKA_ID_CONTENT_ENCRYPTION 0x5035 +#define MATROSKA_ID_ATTACHMENTS 0x1941A469 +#define MATROSKA_ID_ATTACHED_FILE 0x61A7 +#define MATROSKA_ID_FILE_DESCRIPTION 0x467E +#define MATROSKA_ID_FILE_NAME 0x466E +#define MATROSKA_ID_FILE_MIME_TYPE 0x4660 +#define MATROSKA_ID_FILE_DATA 0x465C +#define MATROSKA_ID_FILE_UID 0x46AE +#define MATROSKA_ID_CUES 0x1C53BB6B +#define MATROSKA_ID_CUE_POINT 0xBB +#define MATROSKA_ID_CUE_TIME 0xB3 +#define MATROSKA_ID_CUE_TRACK_POSITIONS 0xB7 +#define MATROSKA_ID_CUE_TRACK 0xF7 +#define MATROSKA_ID_CUE_CLUSTER_POSITION 0xF1 +#define MATROSKA_ID_CUE_BLOCK_NUMBER 0x5378 +#define MATROSKA_ID_TAGS 0x1254C367 +#define MATROSKA_ID_SEEK_PRE_ROLL 0x56BB +#define MATROSKA_ID_CODEC_DELAY 0x56AA +#define MATROSKA_ID_DISCARD_PADDING 0x75A2 +#define MATROSKA_ID_COLOR_SPACE 0x2EB524 +#define MATROSKA_ID_PRIMARIES 0x55BB + +class EBMLId: public EBMLNumber { +public: + EBMLId(); + virtual ~EBMLId(); + + char const* stringName() const; // used for debugging +}; + +class EBMLDataSize: public EBMLNumber { +public: + EBMLDataSize(); + virtual ~EBMLDataSize(); +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/FileServerMediaSubsession.cpp b/src/big/mpp/middleware/src/live555/liveMedia/FileServerMediaSubsession.cpp new file mode 100644 index 000000000..a547b7812 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/FileServerMediaSubsession.cpp @@ -0,0 +1,34 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A 'ServerMediaSubsession' object that creates new, unicast, "RTPSink"s +// on demand, from a file. +// Implementation + +#include "FileServerMediaSubsession.hh" + +FileServerMediaSubsession +::FileServerMediaSubsession(UsageEnvironment& env, char const* fileName, + Boolean reuseFirstSource) + : OnDemandServerMediaSubsession(env, reuseFirstSource), + fFileSize(0) { + fFileName = strDup(fileName); +} + +FileServerMediaSubsession::~FileServerMediaSubsession() { + delete[] (char*)fFileName; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/FileSink.cpp b/src/big/mpp/middleware/src/live555/liveMedia/FileSink.cpp new file mode 100644 index 000000000..18eeda21b --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/FileSink.cpp @@ -0,0 +1,151 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// File sinks +// Implementation + +#if (defined(__WIN32__) || defined(_WIN32)) && !defined(_WIN32_WCE) +#include +#include +#endif +#include "FileSink.hh" +#include "GroupsockHelper.hh" +#include "OutputFile.hh" + +////////// FileSink ////////// + +FileSink::FileSink(UsageEnvironment& env, FILE* fid, unsigned bufferSize, + char const* perFrameFileNamePrefix) + : MediaSink(env), fOutFid(fid), fBufferSize(bufferSize), fSamePresentationTimeCounter(0) { + fBuffer = new unsigned char[bufferSize]; + if (perFrameFileNamePrefix != NULL) { + fPerFrameFileNamePrefix = strDup(perFrameFileNamePrefix); + fPerFrameFileNameBuffer = new char[strlen(perFrameFileNamePrefix) + 100]; + } else { + fPerFrameFileNamePrefix = NULL; + fPerFrameFileNameBuffer = NULL; + } + fPrevPresentationTime.tv_sec = ~0; fPrevPresentationTime.tv_usec = 0; +} + +FileSink::~FileSink() { + delete[] fPerFrameFileNameBuffer; + delete[] fPerFrameFileNamePrefix; + delete[] fBuffer; + if (fOutFid != NULL) fclose(fOutFid); +} + +FileSink* FileSink::createNew(UsageEnvironment& env, char const* fileName, + unsigned bufferSize, Boolean oneFilePerFrame) { + do { + FILE* fid; + char const* perFrameFileNamePrefix; + if (oneFilePerFrame) { + // Create the fid for each frame + fid = NULL; + perFrameFileNamePrefix = fileName; + } else { + // Normal case: create the fid once + fid = OpenOutputFile(env, fileName); + if (fid == NULL) break; + perFrameFileNamePrefix = NULL; + } + + return new FileSink(env, fid, bufferSize, perFrameFileNamePrefix); + } while (0); + + return NULL; +} + +Boolean FileSink::continuePlaying() { + if (fSource == NULL) return False; + + fSource->getNextFrame(fBuffer, fBufferSize, + afterGettingFrame, this, + onSourceClosure, this); + + return True; +} + +void FileSink::afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned /*durationInMicroseconds*/) { + FileSink* sink = (FileSink*)clientData; + sink->afterGettingFrame(frameSize, numTruncatedBytes, presentationTime); +} + +void FileSink::addData(unsigned char const* data, unsigned dataSize, + struct timeval presentationTime) { + if (fPerFrameFileNameBuffer != NULL && fOutFid == NULL) { + // Special case: Open a new file on-the-fly for this frame + if (presentationTime.tv_usec == fPrevPresentationTime.tv_usec && + presentationTime.tv_sec == fPrevPresentationTime.tv_sec) { + // The presentation time is unchanged from the previous frame, so we add a 'counter' + // suffix to the file name, to distinguish them: + sprintf(fPerFrameFileNameBuffer, "%s-%lu.%06lu-%u", fPerFrameFileNamePrefix, + presentationTime.tv_sec, presentationTime.tv_usec, ++fSamePresentationTimeCounter); + } else { + sprintf(fPerFrameFileNameBuffer, "%s-%lu.%06lu", fPerFrameFileNamePrefix, + presentationTime.tv_sec, presentationTime.tv_usec); + fPrevPresentationTime = presentationTime; // for next time + fSamePresentationTimeCounter = 0; // for next time + } + fOutFid = OpenOutputFile(envir(), fPerFrameFileNameBuffer); + } + + // Write to our file: +#ifdef TEST_LOSS + static unsigned const framesPerPacket = 10; + static unsigned const frameCount = 0; + static Boolean const packetIsLost; + if ((frameCount++)%framesPerPacket == 0) { + packetIsLost = (our_random()%10 == 0); // simulate 10% packet loss ##### + } + + if (!packetIsLost) +#endif + if (fOutFid != NULL && data != NULL) { + fwrite(data, 1, dataSize, fOutFid); + } +} + +void FileSink::afterGettingFrame(unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime) { + if (numTruncatedBytes > 0) { + envir() << "FileSink::afterGettingFrame(): The input frame data was too large for our buffer size (" + << fBufferSize << "). " + << numTruncatedBytes << " bytes of trailing data was dropped! Correct this by increasing the \"bufferSize\" parameter in the \"createNew()\" call to at least " + << fBufferSize + numTruncatedBytes << "\n"; + } + addData(fBuffer, frameSize, presentationTime); + + if (fOutFid == NULL || fflush(fOutFid) == EOF) { + // The output file has closed. Handle this the same way as if the input source had closed: + if (fSource != NULL) fSource->stopGettingFrames(); + onSourceClosure(); + return; + } + + if (fPerFrameFileNameBuffer != NULL) { + if (fOutFid != NULL) { fclose(fOutFid); fOutFid = NULL; } + } + + // Then try getting the next frame: + continuePlaying(); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/FramedFileSource.cpp b/src/big/mpp/middleware/src/live555/liveMedia/FramedFileSource.cpp new file mode 100644 index 000000000..a051d5723 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/FramedFileSource.cpp @@ -0,0 +1,30 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Framed File Sources +// Implementation + +#include "FramedFileSource.hh" + +////////// FramedFileSource ////////// + +FramedFileSource::FramedFileSource(UsageEnvironment& env, FILE* fid) + : FramedSource(env), fFid(fid) { +} + +FramedFileSource::~FramedFileSource() { +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/FramedFilter.cpp b/src/big/mpp/middleware/src/live555/liveMedia/FramedFilter.cpp new file mode 100644 index 000000000..9871a57f1 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/FramedFilter.cpp @@ -0,0 +1,59 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Framed Filters +// Implementation + +#include "FramedFilter.hh" + +////////// FramedFilter ////////// +#include + +void FramedFilter::detachInputSource() { + if (fInputSource != NULL) { + fInputSource->stopGettingFrames(); + reassignInputSource(NULL); + } +} + +FramedFilter::FramedFilter(UsageEnvironment& env, + FramedSource* inputSource) + : FramedSource(env), + fInputSource(inputSource) { +} + +FramedFilter::~FramedFilter() { + Medium::close(fInputSource); +} + +// Default implementations of needed virtual functions. These merely +// call the same function in the input source - i.e., act like a 'null filter + +char const* FramedFilter::MIMEtype() const { + if (fInputSource == NULL) return ""; + + return fInputSource->MIMEtype(); +} + +void FramedFilter::getAttributes() const { + if (fInputSource != NULL) fInputSource->getAttributes(); +} + +void FramedFilter::doStopGettingFrames() { + FramedSource::doStopGettingFrames(); + if (fInputSource != NULL) fInputSource->stopGettingFrames(); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/FramedSource.cpp b/src/big/mpp/middleware/src/live555/liveMedia/FramedSource.cpp new file mode 100644 index 000000000..1b9da5679 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/FramedSource.cpp @@ -0,0 +1,126 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Framed Sources +// Implementation + +#include "FramedSource.hh" +#include + +////////// FramedSource ////////// + +FramedSource::FramedSource(UsageEnvironment& env) + : MediaSource(env), + fAfterGettingFunc(NULL), fAfterGettingClientData(NULL), + fOnCloseFunc(NULL), fOnCloseClientData(NULL), + fIsCurrentlyAwaitingData(False) { + fPresentationTime.tv_sec = fPresentationTime.tv_usec = 0; // initially +} + +FramedSource::~FramedSource() { +} + +Boolean FramedSource::isFramedSource() const { + return True; +} + +Boolean FramedSource::lookupByName(UsageEnvironment& env, char const* sourceName, + FramedSource*& resultSource) { + resultSource = NULL; // unless we succeed + + MediaSource* source; + if (!MediaSource::lookupByName(env, sourceName, source)) return False; + + if (!source->isFramedSource()) { + env.setResultMsg(sourceName, " is not a framed source"); + return False; + } + + resultSource = (FramedSource*)source; + return True; +} + +void FramedSource::getNextFrame(unsigned char* to, unsigned maxSize, + afterGettingFunc* afterGettingFunc, + void* afterGettingClientData, + onCloseFunc* onCloseFunc, + void* onCloseClientData) { + // Make sure we're not already being read: + if (fIsCurrentlyAwaitingData) { + envir() << "FramedSource[" << this << "]::getNextFrame(): attempting to read more than once at the same time!\n"; + envir().internalError(); + } + + fTo = to; + fMaxSize = maxSize; + fNumTruncatedBytes = 0; // by default; could be changed by doGetNextFrame() + fDurationInMicroseconds = 0; // by default; could be changed by doGetNextFrame() + fAfterGettingFunc = afterGettingFunc; + fAfterGettingClientData = afterGettingClientData; + fOnCloseFunc = onCloseFunc; + fOnCloseClientData = onCloseClientData; + fIsCurrentlyAwaitingData = True; + + doGetNextFrame(); +} + +void FramedSource::afterGetting(FramedSource* source) { + source->nextTask() = NULL; + source->fIsCurrentlyAwaitingData = False; + // indicates that we can be read again + // Note that this needs to be done here, in case the "fAfterFunc" + // called below tries to read another frame (which it usually will) + + if (source->fAfterGettingFunc != NULL) { + (*(source->fAfterGettingFunc))(source->fAfterGettingClientData, + source->fFrameSize, source->fNumTruncatedBytes, + source->fPresentationTime, + source->fDurationInMicroseconds); + } +} + +void FramedSource::handleClosure(void* clientData) { + FramedSource* source = (FramedSource*)clientData; + source->handleClosure(); +} + +void FramedSource::handleClosure() { + fIsCurrentlyAwaitingData = False; // because we got a close instead + if (fOnCloseFunc != NULL) { + (*fOnCloseFunc)(fOnCloseClientData); + } +} + +void FramedSource::stopGettingFrames() { + fIsCurrentlyAwaitingData = False; // indicates that we can be read again + fAfterGettingFunc = NULL; + fOnCloseFunc = NULL; + + // Perform any specialized action now: + doStopGettingFrames(); +} + +void FramedSource::doStopGettingFrames() { + // Default implementation: Do nothing except cancel any pending 'delivery' task: + envir().taskScheduler().unscheduleDelayedTask(nextTask()); + // Subclasses may wish to redefine this function. +} + +unsigned FramedSource::maxFrameSize() const { + // By default, this source has no maximum frame size. + return 0; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/GSMAudioRTPSink.cpp b/src/big/mpp/middleware/src/live555/liveMedia/GSMAudioRTPSink.cpp new file mode 100644 index 000000000..26aed88d7 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/GSMAudioRTPSink.cpp @@ -0,0 +1,40 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP sink for GSM audio +// Implementation + +#include "GSMAudioRTPSink.hh" + +GSMAudioRTPSink::GSMAudioRTPSink(UsageEnvironment& env, Groupsock* RTPgs) + : AudioRTPSink(env, RTPgs, 3, 8000, "GSM") { +} + +GSMAudioRTPSink::~GSMAudioRTPSink() { +} + +GSMAudioRTPSink* +GSMAudioRTPSink::createNew(UsageEnvironment& env, Groupsock* RTPgs) { + return new GSMAudioRTPSink(env, RTPgs); +} + +Boolean GSMAudioRTPSink +::frameCanAppearAfterPacketStart(unsigned char const* /*frameStart*/, + unsigned /*numBytesInFrame*/) const { + // Allow at most 5 frames in a single packet: + return numFramesUsedSoFar() < 5; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/GenericMediaServer.cpp b/src/big/mpp/middleware/src/live555/liveMedia/GenericMediaServer.cpp new file mode 100644 index 000000000..03256b774 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/GenericMediaServer.cpp @@ -0,0 +1,499 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A generic media server class, used to implement a RTSP server, and any other server that uses +// "ServerMediaSession" objects to describe media to be served. +// Implementation + +#include "GenericMediaServer.hh" +#include +#if defined(__WIN32__) || defined(_WIN32) || defined(_QNX4) +#define snprintf _snprintf +#endif + +////////// GenericMediaServer implementation ////////// + +void GenericMediaServer::addServerMediaSession(ServerMediaSession* serverMediaSession) { + if (serverMediaSession == NULL) return; + + char const* sessionName = serverMediaSession->streamName(); + if (sessionName == NULL) sessionName = ""; + removeServerMediaSession(sessionName); + // in case an existing "ServerMediaSession" with this name already exists + + fServerMediaSessions->Add(sessionName, (void*)serverMediaSession); +} + +void GenericMediaServer +::lookupServerMediaSession(char const* streamName, + lookupServerMediaSessionCompletionFunc* completionFunc, + void* completionClientData, + Boolean /*isFirstLookupInSession*/) { + // Default implementation: Do a synchronous lookup, and call the completion function: + if (completionFunc != NULL) { + (*completionFunc)(completionClientData, getServerMediaSession(streamName)); + } +} + +struct lsmsMemberFunctionRecord { + GenericMediaServer* fServer; + void (GenericMediaServer::*fMemberFunc)(ServerMediaSession*); +}; + +static void lsmsMemberFunctionCompletionFunc(void* clientData, ServerMediaSession* sessionLookedUp) { + lsmsMemberFunctionRecord* memberFunctionRecord = (lsmsMemberFunctionRecord*)clientData; + (memberFunctionRecord->fServer->*(memberFunctionRecord->fMemberFunc))(sessionLookedUp); + delete memberFunctionRecord; +} + +void GenericMediaServer +::lookupServerMediaSession(char const* streamName, + void (GenericMediaServer::*memberFunc)(ServerMediaSession*)) { + struct lsmsMemberFunctionRecord* memberFunctionRecord = new struct lsmsMemberFunctionRecord; + memberFunctionRecord->fServer = this; + memberFunctionRecord->fMemberFunc = memberFunc; + + GenericMediaServer + ::lookupServerMediaSession(streamName, + lsmsMemberFunctionCompletionFunc, memberFunctionRecord); +} + +void GenericMediaServer::removeServerMediaSession(ServerMediaSession* serverMediaSession) { + if (serverMediaSession == NULL) return; + + fServerMediaSessions->Remove(serverMediaSession->streamName()); + if (serverMediaSession->referenceCount() == 0) { + Medium::close(serverMediaSession); + } else { + serverMediaSession->deleteWhenUnreferenced() = True; + } +} + +void GenericMediaServer::removeServerMediaSession(char const* streamName) { + lookupServerMediaSession(streamName, &GenericMediaServer::removeServerMediaSession); +} + +void GenericMediaServer::closeAllClientSessionsForServerMediaSession(ServerMediaSession* serverMediaSession) { + if (serverMediaSession == NULL) return; + + HashTable::Iterator* iter = HashTable::Iterator::create(*fClientSessions); + GenericMediaServer::ClientSession* clientSession; + char const* key; // dummy + while ((clientSession = (GenericMediaServer::ClientSession*)(iter->next(key))) != NULL) { + if (clientSession->fOurServerMediaSession == serverMediaSession) { + delete clientSession; + } + } + delete iter; +} + +void GenericMediaServer::closeAllClientSessionsForServerMediaSession(char const* streamName) { + lookupServerMediaSession(streamName, + &GenericMediaServer::closeAllClientSessionsForServerMediaSession); +} + +void GenericMediaServer::deleteServerMediaSession(ServerMediaSession* serverMediaSession) { + if (serverMediaSession == NULL) return; + + closeAllClientSessionsForServerMediaSession(serverMediaSession); + removeServerMediaSession(serverMediaSession); +} + +void GenericMediaServer::deleteServerMediaSession(char const* streamName) { + lookupServerMediaSession(streamName, &GenericMediaServer::deleteServerMediaSession); +} + +GenericMediaServer +::GenericMediaServer(UsageEnvironment& env, int ourSocketIPv4, int ourSocketIPv6, Port ourPort, + unsigned reclamationSeconds) + : Medium(env), + fServerSocketIPv4(ourSocketIPv4), fServerSocketIPv6(ourSocketIPv6), + fServerPort(ourPort), fReclamationSeconds(reclamationSeconds), + fServerMediaSessions(HashTable::create(STRING_HASH_KEYS)), + fClientConnections(HashTable::create(ONE_WORD_HASH_KEYS)), + fClientSessions(HashTable::create(STRING_HASH_KEYS)), + fPreviousClientSessionId(0), + fTLSCertificateFileName(NULL), fTLSPrivateKeyFileName(NULL) { + ignoreSigPipeOnSocket(fServerSocketIPv4); // so that clients on the same host that are killed don't also kill us + ignoreSigPipeOnSocket(fServerSocketIPv6); // ditto + + // Arrange to handle connections from others: + env.taskScheduler().turnOnBackgroundReadHandling(fServerSocketIPv4, incomingConnectionHandlerIPv4, this); + env.taskScheduler().turnOnBackgroundReadHandling(fServerSocketIPv6, incomingConnectionHandlerIPv6, this); +} + +GenericMediaServer::~GenericMediaServer() { + // Turn off background read handling: + envir().taskScheduler().turnOffBackgroundReadHandling(fServerSocketIPv4); + ::closeSocket(fServerSocketIPv4); + envir().taskScheduler().turnOffBackgroundReadHandling(fServerSocketIPv6); + ::closeSocket(fServerSocketIPv6); + + delete[] fTLSCertificateFileName; delete[] fTLSPrivateKeyFileName; +} + +void GenericMediaServer::cleanup() { + // This member function must be called in the destructor of any subclass of + // "GenericMediaServer". (We don't call this in the destructor of "GenericMediaServer" itself, + // because by that time, the subclass destructor will already have been called, and this may + // affect (break) the destruction of the "ClientSession" and "ClientConnection" objects, which + // themselves will have been subclassed.) + + // Close all client session objects: + GenericMediaServer::ClientSession* clientSession; + while ((clientSession = (GenericMediaServer::ClientSession*)fClientSessions->getFirst()) != NULL) { + delete clientSession; + } + delete fClientSessions; + + // Close all client connection objects: + GenericMediaServer::ClientConnection* connection; + while ((connection = (GenericMediaServer::ClientConnection*)fClientConnections->getFirst()) != NULL) { + delete connection; + } + delete fClientConnections; + + // Delete all server media sessions + ServerMediaSession* serverMediaSession; + while ((serverMediaSession = (ServerMediaSession*)fServerMediaSessions->getFirst()) != NULL) { + removeServerMediaSession(serverMediaSession); // will delete it, because it no longer has any 'client session' objects using it + } + delete fServerMediaSessions; +} + +#define LISTEN_BACKLOG_SIZE 20 + +int GenericMediaServer::setUpOurSocket(UsageEnvironment& env, Port& ourPort, int domain) { + int ourSocket = -1; + + do { + // The following statement is enabled by default. + // Don't disable it (by defining ALLOW_SERVER_PORT_REUSE) unless you know what you're doing. +#if !defined(ALLOW_SERVER_PORT_REUSE) && !defined(ALLOW_RTSP_SERVER_PORT_REUSE) + // ALLOW_RTSP_SERVER_PORT_REUSE is for backwards-compatibility ##### + NoReuse dummy(env); // Don't use this socket if there's already a local server using it +#endif + + ourSocket = setupStreamSocket(env, ourPort, domain, True, True); + // later fix to support IPv6 + if (ourSocket < 0) break; + + // Make sure we have a big send buffer: + if (!increaseSendBufferTo(env, ourSocket, 50*1024)) break; + + // Allow multiple simultaneous connections: + if (listen(ourSocket, LISTEN_BACKLOG_SIZE) < 0) { + env.setResultErrMsg("listen() failed: "); + break; + } + + if (ourPort.num() == 0) { + // bind() will have chosen a port for us; return it also: + if (!getSourcePort(env, ourSocket, domain, ourPort)) break; + } + + return ourSocket; + } while (0); + + if (ourSocket != -1) ::closeSocket(ourSocket); + return -1; +} + +void GenericMediaServer::incomingConnectionHandlerIPv4(void* instance, int /*mask*/) { + GenericMediaServer* server = (GenericMediaServer*)instance; + server->incomingConnectionHandlerIPv4(); +} +void GenericMediaServer::incomingConnectionHandlerIPv6(void* instance, int /*mask*/) { + GenericMediaServer* server = (GenericMediaServer*)instance; + server->incomingConnectionHandlerIPv6(); +} +void GenericMediaServer::incomingConnectionHandlerIPv4() { + incomingConnectionHandlerOnSocket(fServerSocketIPv4); +} +void GenericMediaServer::incomingConnectionHandlerIPv6() { + incomingConnectionHandlerOnSocket(fServerSocketIPv6); +} + +static int setNoTimeWait(UsageEnvironment& env,int socket) +{ + struct linger so_linger; + so_linger.l_onoff = 1; + so_linger.l_linger = 0; + if (setsockopt(socket,SOL_SOCKET,SO_LINGER,&so_linger,sizeof(so_linger)) <0) + { + //envir().setResultErrMsg("failed to set SO_LINGER: "); + return -1; + } + return 0; +} + +void GenericMediaServer::incomingConnectionHandlerOnSocket(int serverSocket) { + struct sockaddr_storage clientAddr; + SOCKLEN_T clientAddrLen = sizeof clientAddr; + int clientSocket = accept(serverSocket, (struct sockaddr*)&clientAddr, (socklen_t *)&clientAddrLen); + if (clientSocket < 0) { + int err = envir().getErrno(); + if (err != EWOULDBLOCK) { + envir().setResultErrMsg("accept() failed: "); + } + return; + } + ignoreSigPipeOnSocket(clientSocket); // so that clients on the same host that are killed don't also kill us + makeSocketNonBlocking(clientSocket); + increaseSendBufferTo(envir(), clientSocket, 50*1024); + setNoTimeWait(envir(),clientSocket); + +#ifdef DEBUG + envir() << "accept()ed connection from " << AddressString(clientAddr).val() << "\n"; +#endif + + // Create a new object for handling this connection: + (void)createNewClientConnection(clientSocket, clientAddr); +} + +void GenericMediaServer +::setTLSFileNames(char const* certFileName, char const* privKeyFileName) { + delete[] fTLSCertificateFileName; fTLSCertificateFileName = strDup(certFileName); + delete[] fTLSPrivateKeyFileName; fTLSPrivateKeyFileName = strDup(privKeyFileName); +} + + +////////// GenericMediaServer::ClientConnection implementation ////////// + +GenericMediaServer::ClientConnection +::ClientConnection(GenericMediaServer& ourServer, + int clientSocket, struct sockaddr_storage const& clientAddr, + Boolean useTLS) + : fOurServer(ourServer), fOurSocket(clientSocket), fClientAddr(clientAddr), fTLS(envir()) { + fInputTLS = fOutputTLS = &fTLS; + + // Add ourself to our 'client connections' table: + fOurServer.fClientConnections->Add((char const*)this, this); + + if (useTLS) { + // Perform extra processing to handle a TLS connection: + fTLS.setCertificateAndPrivateKeyFileNames(ourServer.fTLSCertificateFileName, + ourServer.fTLSPrivateKeyFileName); + fTLS.isNeeded = True; + + fTLS.tlsAcceptIsNeeded = True; // call fTLS.accept() the next time the socket is readable + } + + // Arrange to handle incoming requests: + resetRequestBuffer(); + envir().taskScheduler() + .setBackgroundHandling(fOurSocket, SOCKET_READABLE|SOCKET_EXCEPTION, incomingRequestHandler, this); +} + +GenericMediaServer::ClientConnection::~ClientConnection() { + // Remove ourself from the server's 'client connections' hash table before we go: + fOurServer.fClientConnections->Remove((char const*)this); + + closeSockets(); +} + +void GenericMediaServer::ClientConnection::closeSockets() { + // Turn off background handling on our socket: + envir().taskScheduler().disableBackgroundHandling(fOurSocket); + if (fOurSocket>= 0) ::closeSocket(fOurSocket); + + fOurSocket = -1; +} + +void GenericMediaServer::ClientConnection::incomingRequestHandler(void* instance, int /*mask*/) { + ClientConnection* connection = (ClientConnection*)instance; + connection->incomingRequestHandler(); +} + +void GenericMediaServer::ClientConnection::incomingRequestHandler() { + if (fInputTLS->tlsAcceptIsNeeded) { // we need to successfully call fInputTLS->accept() first: + if (fInputTLS->accept(fOurSocket) <= 0) return; // either an error, or we need to try again later + + fInputTLS->tlsAcceptIsNeeded = False; + // We can now read data, as usual: + } + + int bytesRead; + if (fInputTLS->isNeeded) { + bytesRead = fInputTLS->read(&fRequestBuffer[fRequestBytesAlreadySeen], fRequestBufferBytesLeft); + } else { + struct sockaddr_storage dummy; // 'from' address, meaningless in this case + + bytesRead = readSocket(envir(), fOurSocket, &fRequestBuffer[fRequestBytesAlreadySeen], fRequestBufferBytesLeft, dummy); + } + handleRequestBytes(bytesRead); +} + +void GenericMediaServer::ClientConnection::resetRequestBuffer() { + fRequestBytesAlreadySeen = 0; + fRequestBufferBytesLeft = sizeof fRequestBuffer; +} + + +////////// GenericMediaServer::ClientSession implementation ////////// + +GenericMediaServer::ClientSession +::ClientSession(GenericMediaServer& ourServer, u_int32_t sessionId) + : fOurServer(ourServer), fOurSessionId(sessionId), fOurServerMediaSession(NULL), + fLivenessCheckTask(NULL) { + noteLiveness(); +} + +GenericMediaServer::ClientSession::~ClientSession() { + // Turn off any liveness checking: + envir().taskScheduler().unscheduleDelayedTask(fLivenessCheckTask); + + // Remove ourself from the server's 'client sessions' hash table before we go: + char sessionIdStr[8+1]; + sprintf(sessionIdStr, "%08X", fOurSessionId); + fOurServer.fClientSessions->Remove(sessionIdStr); + + if (fOurServerMediaSession != NULL) { + fOurServerMediaSession->decrementReferenceCount(); + if (fOurServerMediaSession->referenceCount() == 0 + && fOurServerMediaSession->deleteWhenUnreferenced()) { + fOurServer.removeServerMediaSession(fOurServerMediaSession); + fOurServerMediaSession = NULL; + } + } +} + +void GenericMediaServer::ClientSession::noteLiveness() { +#ifdef DEBUG + char const* streamName + = (fOurServerMediaSession == NULL) ? "???" : fOurServerMediaSession->streamName(); + fprintf(stderr, "Client session (id \"%08X\", stream name \"%s\"): Liveness indication\n", + fOurSessionId, streamName); +#endif + if (fOurServerMediaSession != NULL) fOurServerMediaSession->noteLiveness(); + + if (fOurServer.fReclamationSeconds > 0) { + envir().taskScheduler().rescheduleDelayedTask(fLivenessCheckTask, + fOurServer.fReclamationSeconds*1000000, + (TaskFunc*)livenessTimeoutTask, this); + } +} + +void GenericMediaServer::ClientSession::noteClientLiveness(ClientSession* clientSession) { + clientSession->noteLiveness(); +} + +void GenericMediaServer::ClientSession::livenessTimeoutTask(ClientSession* clientSession) { + // If this gets called, the client session is assumed to have timed out, so delete it: +#ifdef DEBUG + char const* streamName + = (clientSession->fOurServerMediaSession == NULL) ? "???" : clientSession->fOurServerMediaSession->streamName(); + fprintf(stderr, "Client session (id \"%08X\", stream name \"%s\") has timed out (due to inactivity)\n", + clientSession->fOurSessionId, streamName); +#endif + clientSession->fLivenessCheckTask = NULL; + delete clientSession; +} + +GenericMediaServer::ClientSession* GenericMediaServer::createNewClientSessionWithId() { + u_int32_t sessionId; + char sessionIdStr[8+1]; + + // Choose a random (unused) 32-bit integer for the session id + // (it will be encoded as a 8-digit hex number). (We avoid choosing session id 0, + // because that has a special use by some servers. Similarly, we avoid choosing the same + // session id twice in a row.) + do { + sessionId = (u_int32_t)our_random32(); + snprintf(sessionIdStr, sizeof sessionIdStr, "%08X", sessionId); + } while (sessionId == 0 || sessionId == fPreviousClientSessionId + || lookupClientSession(sessionIdStr) != NULL); + fPreviousClientSessionId = sessionId; + + ClientSession* clientSession = createNewClientSession(sessionId); + if (clientSession != NULL) fClientSessions->Add(sessionIdStr, clientSession); + + return clientSession; +} + +GenericMediaServer::ClientSession* +GenericMediaServer::lookupClientSession(u_int32_t sessionId) { + char sessionIdStr[8+1]; + snprintf(sessionIdStr, sizeof sessionIdStr, "%08X", sessionId); + return lookupClientSession(sessionIdStr); +} + +GenericMediaServer::ClientSession* +GenericMediaServer::lookupClientSession(char const* sessionIdStr) { + return (GenericMediaServer::ClientSession*)fClientSessions->Lookup(sessionIdStr); +} + +ServerMediaSession* GenericMediaServer::getServerMediaSession(char const* streamName) { + return (ServerMediaSession*)(fServerMediaSessions->Lookup(streamName)); +} + + +////////// ServerMediaSessionIterator implementation ////////// + +GenericMediaServer::ServerMediaSessionIterator +::ServerMediaSessionIterator(GenericMediaServer& server) + : fOurIterator((server.fServerMediaSessions == NULL) + ? NULL : HashTable::Iterator::create(*server.fServerMediaSessions)) { +} + +GenericMediaServer::ServerMediaSessionIterator::~ServerMediaSessionIterator() { + delete fOurIterator; +} + +ServerMediaSession* GenericMediaServer::ServerMediaSessionIterator::next() { + if (fOurIterator == NULL) return NULL; + + char const* key; // dummy + return (ServerMediaSession*)(fOurIterator->next(key)); +} + + +////////// UserAuthenticationDatabase implementation ////////// + +UserAuthenticationDatabase::UserAuthenticationDatabase(char const* realm, + Boolean passwordsAreMD5) + : fTable(HashTable::create(STRING_HASH_KEYS)), + fRealm(strDup(realm == NULL ? "LIVE555 Streaming Media" : realm)), + fPasswordsAreMD5(passwordsAreMD5) { +} + +UserAuthenticationDatabase::~UserAuthenticationDatabase() { + delete[] fRealm; + + // Delete the allocated 'password' strings that we stored in the table, and then the table itself: + char* password; + while ((password = (char*)fTable->RemoveNext()) != NULL) { + delete[] password; + } + delete fTable; +} + +void UserAuthenticationDatabase::addUserRecord(char const* username, + char const* password) { + char* oldPassword = (char*)fTable->Add(username, (void*)(strDup(password))); + delete[] oldPassword; // if any +} + +void UserAuthenticationDatabase::removeUserRecord(char const* username) { + char* password = (char*)(fTable->Lookup(username)); + fTable->Remove(username); + delete[] password; +} + +char const* UserAuthenticationDatabase::lookupPassword(char const* username) { + return (char const*)(fTable->Lookup(username)); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/H261VideoRTPSource.cpp b/src/big/mpp/middleware/src/live555/liveMedia/H261VideoRTPSource.cpp new file mode 100644 index 000000000..01b94a050 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/H261VideoRTPSource.cpp @@ -0,0 +1,67 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// H.261 Video RTP Sources +// Implementation + +#include "H261VideoRTPSource.hh" + +H261VideoRTPSource* +H261VideoRTPSource::createNew(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency) { + return new H261VideoRTPSource(env, RTPgs, rtpPayloadFormat, + rtpTimestampFrequency); +} + +H261VideoRTPSource +::H261VideoRTPSource(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency) + : MultiFramedRTPSource(env, RTPgs, + rtpPayloadFormat, rtpTimestampFrequency), + fLastSpecialHeader(0) { +} + +H261VideoRTPSource::~H261VideoRTPSource() { +} + +Boolean H261VideoRTPSource +::processSpecialHeader(BufferedPacket* packet, + unsigned& resultSpecialHeaderSize) { + // There's a 4-byte video-specific header + if (packet->dataSize() < 4) return False; + + unsigned char* headerStart = packet->data(); + fLastSpecialHeader + = (headerStart[0]<<24)|(headerStart[1]<<16)|(headerStart[2]<<8)|headerStart[3]; + +#ifdef DELIVER_COMPLETE_FRAMES + fCurrentPacketBeginsFrame = fCurrentPacketCompletesFrame; + // whether the *previous* packet ended a frame + + // The RTP "M" (marker) bit indicates the last fragment of a frame: + fCurrentPacketCompletesFrame = packet->rtpMarkerBit(); +#endif + + resultSpecialHeaderSize = 4; + return True; +} + +char const* H261VideoRTPSource::MIMEtype() const { + return "video/H261"; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/H263plusVideoFileServerMediaSubsession.cpp b/src/big/mpp/middleware/src/live555/liveMedia/H263plusVideoFileServerMediaSubsession.cpp new file mode 100644 index 000000000..797a56271 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/H263plusVideoFileServerMediaSubsession.cpp @@ -0,0 +1,64 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A 'ServerMediaSubsession' object that creates new, unicast, "RTPSink"s +// on demand, from a H263 video file. +// Implementation + +// Author: Bernhard Feiten. // Based on MPEG4VideoFileServerMediaSubsession +// Updated by Ross FInlayson (December 2007) + +#include "H263plusVideoFileServerMediaSubsession.hh" +#include "H263plusVideoRTPSink.hh" +#include "ByteStreamFileSource.hh" +#include "H263plusVideoStreamFramer.hh" + +H263plusVideoFileServerMediaSubsession* +H263plusVideoFileServerMediaSubsession::createNew(UsageEnvironment& env, + char const* fileName, + Boolean reuseFirstSource) { + return new H263plusVideoFileServerMediaSubsession(env, fileName, reuseFirstSource); +} + +H263plusVideoFileServerMediaSubsession +::H263plusVideoFileServerMediaSubsession(UsageEnvironment& env, + char const* fileName, + Boolean reuseFirstSource) + : FileServerMediaSubsession(env, fileName, reuseFirstSource) { +} + +H263plusVideoFileServerMediaSubsession::~H263plusVideoFileServerMediaSubsession() { +} + +FramedSource* H263plusVideoFileServerMediaSubsession +::createNewStreamSource(unsigned /*clientSessionId*/, unsigned& estBitrate) { + estBitrate = 500; // kbps, estimate ?? + + // Create the video source: + ByteStreamFileSource* fileSource = ByteStreamFileSource::createNew(envir(), fFileName); + if (fileSource == NULL) return NULL; + fFileSize = fileSource->fileSize(); + + // Create a framer for the Video Elementary Stream: + return H263plusVideoStreamFramer::createNew(envir(), fileSource); +} + +RTPSink* H263plusVideoFileServerMediaSubsession::createNewRTPSink(Groupsock* rtpGroupsock, + unsigned char rtpPayloadTypeIfDynamic, + FramedSource* /*inputSource*/) { + return H263plusVideoRTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/H263plusVideoRTPSink.cpp b/src/big/mpp/middleware/src/live555/liveMedia/H263plusVideoRTPSink.cpp new file mode 100644 index 000000000..263a567be --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/H263plusVideoRTPSink.cpp @@ -0,0 +1,91 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP sink for H.263+ video (RFC 4629) +// Implementation + +#include "H263plusVideoRTPSink.hh" + +H263plusVideoRTPSink +::H263plusVideoRTPSink(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + u_int32_t rtpTimestampFrequency) + : VideoRTPSink(env, RTPgs, rtpPayloadFormat, rtpTimestampFrequency, "H263-1998") { +} + +H263plusVideoRTPSink::~H263plusVideoRTPSink() { +} + +H263plusVideoRTPSink* +H263plusVideoRTPSink::createNew(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + u_int32_t rtpTimestampFrequency) { + return new H263plusVideoRTPSink(env, RTPgs, rtpPayloadFormat, rtpTimestampFrequency); +} + +Boolean H263plusVideoRTPSink +::frameCanAppearAfterPacketStart(unsigned char const* /*frameStart*/, + unsigned /*numBytesInFrame*/) const { + // A packet can contain only one frame + return False; +} + +void H263plusVideoRTPSink +::doSpecialFrameHandling(unsigned fragmentationOffset, + unsigned char* frameStart, + unsigned numBytesInFrame, + struct timeval framePresentationTime, + unsigned numRemainingBytes) { + if (fragmentationOffset == 0) { + // This packet contains the first (or only) fragment of the frame. + // Set the 'P' bit in the special header: + unsigned short specialHeader = 0x0400; + + // Also, reuse the first two bytes of the payload for this special + // header. (They should both have been zero.) + if (numBytesInFrame < 2) { + envir() << "H263plusVideoRTPSink::doSpecialFrameHandling(): bad frame size " + << numBytesInFrame << "\n"; + return; + } + if (frameStart[0] != 0 || frameStart[1] != 0) { + envir() << "H263plusVideoRTPSink::doSpecialFrameHandling(): unexpected non-zero first two bytes!\n"; + } + frameStart[0] = specialHeader>>8; + frameStart[1] = (unsigned char)specialHeader; + } else { + unsigned short specialHeader = 0; + setSpecialHeaderBytes((unsigned char*)&specialHeader, 2); + } + + if (numRemainingBytes == 0) { + // This packet contains the last (or only) fragment of the frame. + // Set the RTP 'M' ('marker') bit: + setMarkerBit(); + } + + // Also set the RTP timestamp: + setTimestamp(framePresentationTime); +} + + +unsigned H263plusVideoRTPSink::specialHeaderSize() const { + // There's a 2-byte special video header. However, if we're the first + // (or only) fragment of a frame, then we reuse the first 2 bytes of + // the payload instead. + return (curFragmentationOffset() == 0) ? 0 : 2; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/H263plusVideoRTPSource.cpp b/src/big/mpp/middleware/src/live555/liveMedia/H263plusVideoRTPSource.cpp new file mode 100644 index 000000000..793d20cd5 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/H263plusVideoRTPSource.cpp @@ -0,0 +1,106 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// H.263+ Video RTP Sources +// Implementation + +#include "H263plusVideoRTPSource.hh" + +H263plusVideoRTPSource* +H263plusVideoRTPSource::createNew(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency) { + return new H263plusVideoRTPSource(env, RTPgs, rtpPayloadFormat, + rtpTimestampFrequency); +} + +H263plusVideoRTPSource +::H263plusVideoRTPSource(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency) + : MultiFramedRTPSource(env, RTPgs, + rtpPayloadFormat, rtpTimestampFrequency), + fNumSpecialHeaders(0), fSpecialHeaderBytesLength(0) { +} + +H263plusVideoRTPSource::~H263plusVideoRTPSource() { +} + +Boolean H263plusVideoRTPSource +::processSpecialHeader(BufferedPacket* packet, + unsigned& resultSpecialHeaderSize) { + unsigned char* headerStart = packet->data(); + unsigned packetSize = packet->dataSize(); + + // The H.263+ payload header is at least 2 bytes in size. + // Extract the known fields from the first 2 bytes: + unsigned expectedHeaderSize = 2; + if (packetSize < expectedHeaderSize) return False; + + //unsigned char RR = headerStart[0]>>3; + Boolean P = (headerStart[0]&0x4) != 0; + Boolean V = (headerStart[0]&0x2) != 0; + unsigned char PLEN = ((headerStart[0]&0x1)<<5)|(headerStart[1]>>3); + //unsigned char PEBIT = headerStart[1]&0x7; + + if (V) { + // There's an extra VRC byte at the end of the header: + ++expectedHeaderSize; + if (packetSize < expectedHeaderSize) return False; + } + + if (PLEN > 0) { + // There's an extra picture header at the end: + expectedHeaderSize += PLEN; + if (packetSize < expectedHeaderSize) return False; + } + + fCurrentPacketBeginsFrame = P; + if (fCurrentPacketBeginsFrame) { + fNumSpecialHeaders = fSpecialHeaderBytesLength = 0; + } + + // Make a copy of the special header bytes, in case a reader + // can use them: + unsigned bytesAvailable + = SPECIAL_HEADER_BUFFER_SIZE - fSpecialHeaderBytesLength - 1; + if (expectedHeaderSize <= bytesAvailable) { + fSpecialHeaderBytes[fSpecialHeaderBytesLength++] = expectedHeaderSize; + for (unsigned i = 0; i < expectedHeaderSize; ++i) { + fSpecialHeaderBytes[fSpecialHeaderBytesLength++] = headerStart[i]; + } + fPacketSizes[fNumSpecialHeaders++] = packetSize; + } + + if (P) { + // Prepend two zero bytes to the start of the payload proper. + // Hack: Do this by shrinking this special header by 2 bytes: + expectedHeaderSize -= 2; + headerStart[expectedHeaderSize] = 0; + headerStart[expectedHeaderSize+1] = 0; + } + + // The RTP "M" (marker) bit indicates the last fragment of a frame: + fCurrentPacketCompletesFrame = packet->rtpMarkerBit(); + + resultSpecialHeaderSize = expectedHeaderSize; + return True; +} + +char const* H263plusVideoRTPSource::MIMEtype() const { + return "video/H263-1998"; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/H263plusVideoStreamFramer.cpp b/src/big/mpp/middleware/src/live555/liveMedia/H263plusVideoStreamFramer.cpp new file mode 100644 index 000000000..b82eae191 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/H263plusVideoStreamFramer.cpp @@ -0,0 +1,129 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Author Bernhard Feiten +// A filter that breaks up an H.263plus video stream into frames. +// + +#include "H263plusVideoStreamFramer.hh" +#include "H263plusVideoStreamParser.hh" + +#include +#include + + +/////////////////////////////////////////////////////////////////////////////// +////////// H263plusVideoStreamFramer implementation ////////// +//public/////////////////////////////////////////////////////////////////////// +H263plusVideoStreamFramer* H263plusVideoStreamFramer::createNew( + UsageEnvironment& env, + FramedSource* inputSource) +{ + // Need to add source type checking here??? ##### + H263plusVideoStreamFramer* fr; + fr = new H263plusVideoStreamFramer(env, inputSource); + return fr; +} + + +/////////////////////////////////////////////////////////////////////////////// +H263plusVideoStreamFramer::H263plusVideoStreamFramer( + UsageEnvironment& env, + FramedSource* inputSource, + Boolean createParser) + : FramedFilter(env, inputSource), + fFrameRate(0.0), // until we learn otherwise + fPictureEndMarker(False) +{ + // Use the current wallclock time as the base 'presentation time': + gettimeofday(&fPresentationTimeBase, NULL); + fParser = createParser ? new H263plusVideoStreamParser(this, inputSource) : NULL; +} + +/////////////////////////////////////////////////////////////////////////////// +H263plusVideoStreamFramer::~H263plusVideoStreamFramer() +{ + delete fParser; +} + + +/////////////////////////////////////////////////////////////////////////////// +void H263plusVideoStreamFramer::doGetNextFrame() +{ + fParser->registerReadInterest(fTo, fMaxSize); + continueReadProcessing(); +} + + +/////////////////////////////////////////////////////////////////////////////// +Boolean H263plusVideoStreamFramer::isH263plusVideoStreamFramer() const +{ + return True; +} + +/////////////////////////////////////////////////////////////////////////////// +void H263plusVideoStreamFramer::continueReadProcessing( + void* clientData, + unsigned char* /*ptr*/, unsigned /*size*/, + struct timeval /*presentationTime*/) +{ + H263plusVideoStreamFramer* framer = (H263plusVideoStreamFramer*)clientData; + framer->continueReadProcessing(); +} + +/////////////////////////////////////////////////////////////////////////////// +void H263plusVideoStreamFramer::continueReadProcessing() +{ + unsigned acquiredFrameSize; + + u_int64_t frameDuration; // in ms + + acquiredFrameSize = fParser->parse(frameDuration); +// Calculate some average bitrate information (to be adapted) +// avgBitrate = (totalBytes * 8 * H263_TIMESCALE) / totalDuration; + + if (acquiredFrameSize > 0) { + // We were able to acquire a frame from the input. + // It has already been copied to the reader's space. + fFrameSize = acquiredFrameSize; +// fNumTruncatedBytes = fParser->numTruncatedBytes(); // not needed so far + + fFrameRate = frameDuration == 0 ? 0.0 : 1000./(long)frameDuration; + + // Compute "fPresentationTime" + if (acquiredFrameSize == 5) // first frame + fPresentationTime = fPresentationTimeBase; + else + fPresentationTime.tv_usec += (long) frameDuration*1000; + + while (fPresentationTime.tv_usec >= 1000000) { + fPresentationTime.tv_usec -= 1000000; + ++fPresentationTime.tv_sec; + } + + // Compute "fDurationInMicroseconds" + fDurationInMicroseconds = (unsigned int) frameDuration*1000;; + + // Call our own 'after getting' function. Because we're not a 'leaf' + // source, we can call this directly, without risking infinite recursion. + afterGetting(this); + } else { + // We were unable to parse a complete frame from the input, because: + // - we had to read more data from the source stream, or + // - the source stream has ended. + } +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/H263plusVideoStreamParser.cpp b/src/big/mpp/middleware/src/live555/liveMedia/H263plusVideoStreamParser.cpp new file mode 100644 index 000000000..b1a58c85d --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/H263plusVideoStreamParser.cpp @@ -0,0 +1,859 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Author Bernhard Feiten +// A filter that breaks up an H.263plus video stream into frames. +// Based on MPEG4IP/mp4creator/h263.c + +#include "H263plusVideoStreamParser.hh" +#include "H263plusVideoStreamFramer.hh" +//#include +//#include "GroupsockHelper.hh" + + +H263plusVideoStreamParser::H263plusVideoStreamParser( + H263plusVideoStreamFramer* usingSource, + FramedSource* inputSource) + : StreamParser(inputSource, + FramedSource::handleClosure, + usingSource, + &H263plusVideoStreamFramer::continueReadProcessing, + usingSource), + fUsingSource(usingSource), + fnextTR(0), + fcurrentPT(0) +{ + memset(fStates, 0, sizeof(fStates)); + memset(&fNextInfo, 0, sizeof(fNextInfo)); + memset(&fCurrentInfo, 0, sizeof(fCurrentInfo)); + memset(&fMaxBitrateCtx, 0, sizeof(fMaxBitrateCtx)); + memset(fNextHeader,0, H263_REQUIRE_HEADER_SIZE_BYTES); +} + +/////////////////////////////////////////////////////////////////////////////// +H263plusVideoStreamParser::~H263plusVideoStreamParser() +{ +} + +/////////////////////////////////////////////////////////////////////////////// +void H263plusVideoStreamParser::restoreSavedParserState() +{ + StreamParser::restoreSavedParserState(); + fTo = fSavedTo; + fNumTruncatedBytes = fSavedNumTruncatedBytes; +} + +/////////////////////////////////////////////////////////////////////////////// +void H263plusVideoStreamParser::setParseState() +{ + fSavedTo = fTo; + fSavedNumTruncatedBytes = fNumTruncatedBytes; + saveParserState(); // Needed for the parsing process in StreamParser +} + + +/////////////////////////////////////////////////////////////////////////////// +void H263plusVideoStreamParser::registerReadInterest( + unsigned char* to, + unsigned maxSize) +{ + fStartOfFrame = fTo = fSavedTo = to; + fLimit = to + maxSize; + fMaxSize = maxSize; + fNumTruncatedBytes = fSavedNumTruncatedBytes = 0; +} + +/////////////////////////////////////////////////////////////////////////////// +// parse() , derived from H263Creator of MPEG4IP, h263.c +unsigned H263plusVideoStreamParser::parse(u_int64_t & currentDuration) +{ + +// u_int8_t frameBuffer[H263_BUFFER_SIZE]; // The input buffer + // Pointer which tells LoadNextH263Object where to read data to +// u_int8_t* pFrameBuffer = fTo + H263_REQUIRE_HEADER_SIZE_BYTES; + u_int32_t frameSize; // The current frame size + // Pointer to receive address of the header data +// u_int8_t* pCurrentHeader;// = pFrameBuffer; +// u_int64_t currentDuration; // The current frame's duration + u_int8_t trDifference; // The current TR difference + // The previous TR difference +// u_int8_t prevTrDifference = H263_BASIC_FRAME_RATE; +// u_int64_t totalDuration = 0;// Duration accumulator +// u_int64_t avgBitrate; // Average bitrate +// u_int64_t totalBytes = 0; // Size accumulator + + + try // The get data routines of the class FramedFilter returns an error when + { // the buffer is empty. This occurs at the beginning and at the end of the file. + fCurrentInfo = fNextInfo; + + // Parse 1 frame + // For the first time, only the first frame's header is returned. + // The second time the full first frame is returned + frameSize = parseH263Frame(); + + currentDuration = 0; + if ((frameSize > 0)){ + // We were able to acquire a frame from the input. + + // Parse the returned frame header (if any) + if (!ParseShortHeader(fTo, &fNextInfo)) { +#ifdef DEBUG + fprintf(stderr,"H263plusVideoStreamParser: Fatal error\n"); +#endif + } + + trDifference = GetTRDifference(fNextInfo.tr, fCurrentInfo.tr); + + // calculate the current frame duration + currentDuration = CalculateDuration(trDifference); + + // Accumulate the frame's size and duration for avgBitrate calculation + //totalDuration += currentDuration; + //totalBytes += frameSize; + // If needed, recalculate bitrate information + // if (h263Bitrates) + //GetMaxBitrate(&fMaxBitrateCtx, frameSize, prevTrDifference); + //prevTrDifference = trDifference; + + setParseState(); // Needed for the parsing process in StreamParser + } + } catch (int /*e*/) { +#ifdef DEBUG + fprintf(stderr, "H263plusVideoStreamParser::parse() EXCEPTION (This is normal behavior - *not* an error)\n"); +#endif + frameSize=0; + } + + return frameSize; +} + + +/////////////////////////////////////////////////////////////////////////////// +// parseH263Frame derived from LoadNextH263Object of MPEG4IP +// - service routine that reads a single frame from the input file. +// It shall fill the input buffer with data up until - and including - the +// next start code and shall report back both the number of bytes read and a +// pointer to the next start code. The first call to this function shall only +// yield a pointer with 0 data bytes and the last call to this function shall +// only yield data bytes with a NULL pointer as the next header. +// +// TODO: This function only supports valid bit streams. Upon error, it fails +// without the possibility to recover. A Better idea would be to skip frames +// until a parsable frame is read from the file. +// +// Parameters: +// ppNextHeader - output parameter that upon return points to the location +// of the next frame's head in the buffer. +// This pointer shall be NULL for the last frame read. +// Returns the total number of bytes read. +// Uses FrameFileSource intantiated by constructor. +/////////////////////////////////////////////////////////////////////////////// +int H263plusVideoStreamParser::parseH263Frame( ) +{ + char row = 0; + u_int8_t * bufferIndex = fTo; + // The buffer end which will allow the loop to leave place for + // the additionalBytesNeeded + u_int8_t * bufferEnd = fTo + fMaxSize - ADDITIONAL_BYTES_NEEDED - 1; + + memcpy(fTo, fNextHeader, H263_REQUIRE_HEADER_SIZE_BYTES); + bufferIndex += H263_REQUIRE_HEADER_SIZE_BYTES; + + + // The state table and the following loop implements a state machine enabling + // us to read bytes from the file until (and inclusing) the requested + // start code (00 00 8X) is found + + // Initialize the states array, if it hasn't been initialized yet... + if (!fStates[0][0]) { + // One 00 was read + fStates[0][0] = 1; + // Two sequential 0x00 ware read + fStates[1][0] = fStates[2][0] = 2; + // A full start code was read + fStates[2][128] = fStates[2][129] = fStates[2][130] = fStates[2][131] = -1; + } + + // Read data from file into the output buffer until either a start code + // is found, or the end of file has been reached. + do { + *bufferIndex = get1Byte(); + } while ((bufferIndex < bufferEnd) && // We have place in the buffer + ((row = fStates[(unsigned char)row][*(bufferIndex++)]) != -1)); // Start code was not found + + if (row != -1) { + fprintf(stderr, "%s: Buffer too small (%u)\n", + "h263reader:", bufferEnd - fTo + ADDITIONAL_BYTES_NEEDED); + return 0; + } + + // Cool ... now we have a start code + // Now we just have to read the additionalBytesNeeded + getBytes(bufferIndex, ADDITIONAL_BYTES_NEEDED); + memcpy(fNextHeader, bufferIndex - H263_STARTCODE_SIZE_BYTES, H263_REQUIRE_HEADER_SIZE_BYTES); + + int sz = bufferIndex - fTo - H263_STARTCODE_SIZE_BYTES; + + if (sz == 5) // first frame + memcpy(fTo, fTo+H263_REQUIRE_HEADER_SIZE_BYTES, H263_REQUIRE_HEADER_SIZE_BYTES); + + return sz; +} + + +//////////////////////////////////////////////////////////////////////////////// +// ParseShortHeader - service routine that accepts a buffer containing a frame +// header and extracts relevant codec information from it. +// +// NOTE: the first bit in the following commnets is 0 (zero). +// +// 0 1 2 3 +// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | PSC (Picture Start Code=22 bits) | (TR=8 bits) | > +// |0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0| |1 0> +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// < (PTYPE=13 bits) | +// <. . .|(FMT)|Z|. . . .| +// +-+-+-+-+-+-+-+-+-+-+-+ +// -> PTYPE.FMT contains a width/height identification +// -> PTYPE.Z is 1 for P-Frames, 0 for I-Frames +// Note: When FMT is 111, there is an extended PTYPE... +// +// Inputs: +// headerBuffer - pointer to the current header buffer +// outputInfoStruct - pointer to the structure receiving the data +// Outputs: +// This function returns a structure of important codec-specific +// information (The Temporal Reference bits, width & height of the current +// frame and the sync - or "frame type" - bit. It reports success or +// failure to the calling function. +//////////////////////////////////////////////////////////////////////////////// +bool H263plusVideoStreamParser::ParseShortHeader( + u_int8_t *headerBuffer, + H263INFO *outputInfoStruct) +{ + u_int8_t fmt = 0; + // Extract temporal reference (TR) from the buffer (bits 22-29 inclusive) + outputInfoStruct->tr = (headerBuffer[2] << 6) & 0xC0; // 2 LS bits out of the 3rd byte + outputInfoStruct->tr |= (headerBuffer[3] >> 2) & 0x3F; // 6 MS bits out of the 4th byte + // Extract the FMT part of PTYPE from the buffer (bits 35-37 inclusive) + fmt = (headerBuffer[4] >> 2) & 0x07; // bits 3-5 ouf of the 5th byte + // If PTYPE is not supported, return a failure notice to the calling function + // FIXME: PLUSPTYPE is not supported + if (fmt == 0x07) { + return false; + } + // If PTYPE is supported, calculate the current width and height according to + // a predefined table + if (!GetWidthAndHeight(fmt, &(outputInfoStruct->width), + &(outputInfoStruct->height))) { + return false; + } + // Extract the frame-type bit, which is the 9th bit of PTYPE (bit 38) + outputInfoStruct->isSyncFrame = !(headerBuffer[4] & 0x02); + + return true; +} + +//////////////////////////////////////////////////////////////////////////////// +// GetMaxBitrate- service routine that accepts frame information and +// derives bitrate information from it. This function uses a sliding window +// technique to calculate the maximum bitrates in any window of 1 second +// inside the file. +// The sliding window is implemented with a table of bitrates for the last +// second (30 entries - one entry per TR unit). +// +// Inputs: +// ctx - context for this function +// frameSize - the size of the current frame in bytes +// frameTRDiff - the "duration" of the frame in TR units +// Outputs: +// This function returns the up-to-date maximum bitrate +//////////////////////////////////////////////////////////////////////////////// +void H263plusVideoStreamParser::GetMaxBitrate( MaxBitrate_CTX *ctx, + u_int32_t frameSize, + u_int8_t frameTRDiff) +{ + if (frameTRDiff == 0) + return; + + // Calculate the current frame's bitrate as bits per TR unit (round the result + // upwards) + u_int32_t frameBitrate = frameSize * 8 / frameTRDiff + 1; + + // for each TRdiff received, + while (frameTRDiff--) { + // Subtract the oldest bitrate entry from the current bitrate + ctx->windowBitrate -= ctx->bitrateTable[ctx->tableIndex]; + // Update the oldest bitrate entry with the current frame's bitrate + ctx->bitrateTable[ctx->tableIndex] = frameBitrate; + // Add the current frame's bitrate to the current bitrate + ctx->windowBitrate += frameBitrate; + // Check if we have a new maximum bitrate + if (ctx->windowBitrate > ctx->maxBitrate) { + ctx->maxBitrate = ctx->windowBitrate; + } + // Advance the table index + // Wrapping around the bitrateTable size + ctx->tableIndex = (ctx->tableIndex + 1) % + ( sizeof(ctx->bitrateTable) / sizeof(ctx->bitrateTable[0]) ); + } +} + +//////////////////////////////////////////////////////////////////////////////// +// CalculateDuration - service routine that calculates the current frame's +// duration in milli-seconds using it's duration in TR units. +// - In order not to accumulate the calculation error, we are using the TR +// duration to calculate the current and the next frame's presentation time in +// milli-seconds. +// +// Inputs: trDiff - The current frame's duration in TR units +// Return: The current frame's duration in milli-seconds +//////////////////////////////////////////////////////////////////////////////// +u_int64_t H263plusVideoStreamParser::CalculateDuration(u_int8_t trDiff) +{ + u_int64_t nextPT; // The next frame's presentation time in milli-seconds + u_int64_t duration; // The current frame's duration in milli-seconds + + fnextTR += trDiff; + // Calculate the next frame's presentation time, in milli-seconds + nextPT = (fnextTR * 1001) / H263_BASIC_FRAME_RATE; + // The frame's duration is the difference between the next presentation + // time and the current presentation time. + duration = nextPT - fcurrentPT; + // "Remember" the next presentation time for the next time this function is called + fcurrentPT = nextPT; + + return duration; +} + +//////////////////////////////////////////////////////////////////////////////// +bool H263plusVideoStreamParser::GetWidthAndHeight( u_int8_t fmt, + u_int16_t *width, + u_int16_t *height) +{ + // The 'fmt' corresponds to bits 5-7 of the PTYPE + static struct { + u_int16_t width; + u_int16_t height; + } const dimensionsTable[8] = { + { 0, 0 }, // 000 - 0 - forbidden, generates an error + { 128, 96 }, // 001 - 1 - Sub QCIF + { 176, 144 }, // 010 - 2 - QCIF + { 352, 288 }, // 011 - 3 - CIF + { 704, 576 }, // 100 - 4 - 4CIF + { 1409, 1152 }, // 101 - 5 - 16CIF + { 0, 0 }, // 110 - 6 - reserved, generates an error + { 0, 0 } // 111 - 7 - extended, not supported by profile 0 + }; + + if (fmt > 7) + return false; + + *width = dimensionsTable[fmt].width; + *height = dimensionsTable[fmt].height; + + if (*width == 0) + return false; + + return true; +} + +//////////////////////////////////////////////////////////////////////////////// +u_int8_t H263plusVideoStreamParser::GetTRDifference( + u_int8_t nextTR, + u_int8_t currentTR) +{ + if (currentTR > nextTR) { + // Wrap around 255... + return nextTR + (256 - currentTR); + } else { + return nextTR - currentTR; + } +} + + + + + + + +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +// this is the h263.c file of MPEG4IP mp4creator +/* +#include "mp4creator.h" + +// Default timescale for H.263 (1000ms) +#define H263_TIMESCALE 1000 +// Default H263 frame rate (30fps) +#define H263_BASIC_FRAME_RATE 30 + +// Minimum number of bytes needed to parse an H263 header +#define H263_REQUIRE_HEADER_SIZE_BYTES 5 +// Number of bytes the start code requries +#define H263_STARTCODE_SIZE_BYTES 3 +// This is the input buffer's size. It should contain +// 1 frame with the following start code +#define H263_BUFFER_SIZE 256 * 1024 +// The default max different (in %) betwqeen max and average bitrates +#define H263_DEFAULT_CBR_TOLERANCE 10 + +// The following structure holds information extracted from each frame's header: +typedef struct _H263INFO { + u_int8_t tr; // Temporal Reference, used in duration calculation + u_int16_t width; // Width of the picture + u_int16_t height; // Height of the picture + bool isSyncFrame; // Frame type (true = I frame = "sync" frame) +} H263INFO; + +// Context for the GetMaxBitrate function +typedef struct _MaxBitrate_CTX { + u_int32_t bitrateTable[H263_BASIC_FRAME_RATE];// Window of 1 second + u_int32_t windowBitrate; // The bitrate of the current window + u_int32_t maxBitrate; // The up-to-date maximum bitrate + u_int32_t tableIndex; // The next TR unit to update +} MaxBitrate_CTX; + +// Forward declarations: +static int LoadNextH263Object( FILE *inputFileHandle, + u_int8_t *frameBuffer, + u_int32_t *frameBufferSize, + u_int32_t additionalBytesNeeded, + u_int8_t **ppNextHeader); + +static bool ParseShortHeader( u_int8_t *headerBuffer, + H263INFO *outputInfoStruct); + +static u_int8_t GetTRDifference(u_int8_t nextTR, + u_int8_t currentTR); + +static void GetMaxBitrate( MaxBitrate_CTX *ctx, + u_int32_t frameSize, + u_int8_t frameTRDiff); + +static MP4Duration CalculateDuration(u_int8_t trDiff); + +static bool GetWidthAndHeight( u_int8_t fmt, + u_int16_t *width, + u_int16_t *height); + +static char states[3][256]; +/ * + * H263Creator - Main function + * Inputs: + * outputFileHandle - The handle of the output file + * inputFileHandle - The handle of the input file + * Codec-specific parameters: + * H263Level - H.263 Level used for this track + * H263Profile - H.263 Profile used for this track + * H263Bitrates - A Parameter indicating whether the function + * should calculate H263 bitrates or not. + * cbrTolerance - CBR tolerance indicates when to set the + * average bitrate. + * Outputs: + * This function returns either the track ID of the newly added track upon + * success or a predefined value representing an erroneous state. + * / +MP4TrackId H263Creator(MP4FileHandle outputFileHandle, + FILE* inputFileHandle, + u_int8_t h263Profile, + u_int8_t h263Level, + bool h263Bitrates, + u_int8_t cbrTolerance) +{ + H263INFO nextInfo; // Holds information about the next frame + H263INFO currentInfo;// Holds information about the current frame + MaxBitrate_CTX maxBitrateCtx;// Context for the GetMaxBitrate function + memset(&nextInfo, 0, sizeof(nextInfo)); + memset(¤tInfo, 0, sizeof(currentInfo)); + memset(&maxBitrateCtx, 0, sizeof(maxBitrateCtx)); + memset(states, 0, sizeof(states)); + u_int8_t frameBuffer[H263_BUFFER_SIZE]; // The input buffer + // Pointer which tells LoadNextH263Object where to read data to + u_int8_t* pFrameBuffer = frameBuffer + H263_REQUIRE_HEADER_SIZE_BYTES; + u_int32_t frameSize; // The current frame size + // Pointer to receive address of the header data + u_int8_t* pCurrentHeader = pFrameBuffer; + MP4Duration currentDuration; // The current frame's duration + u_int8_t trDifference; // The current TR difference + // The previous TR difference + u_int8_t prevTrDifference = H263_BASIC_FRAME_RATE; + MP4Duration totalDuration = 0;// Duration accumulator + MP4Duration avgBitrate; // Average bitrate + u_int64_t totalBytes = 0; // Size accumulator + MP4TrackId trackId = MP4_INVALID_TRACK_ID; // Our MP4 track + bool stay = true; // loop flag + + while (stay) { + currentInfo = nextInfo; + memmove(frameBuffer, pCurrentHeader, H263_REQUIRE_HEADER_SIZE_BYTES); + frameSize = H263_BUFFER_SIZE - H263_REQUIRE_HEADER_SIZE_BYTES; + // Read 1 frame and the next frame's header from the file. + // For the first frame, only the first frame's header is returned. + // For the last frame, only the last frame's data is returned. + if (! LoadNextH263Object(inputFileHandle, pFrameBuffer, &frameSize, + H263_REQUIRE_HEADER_SIZE_BYTES - H263_STARTCODE_SIZE_BYTES, + &pCurrentHeader)) + break; // Fatal error ... + + if (pCurrentHeader) { + // Parse the returned frame header (if any) + if (!ParseShortHeader(pCurrentHeader, &nextInfo)) + break; // Fatal error + trDifference = GetTRDifference(nextInfo.tr, currentInfo.tr); + } else { + // This is the last frame ... we have to fake the trDifference ... + trDifference = 1; + // No header data has been read at this iteration, so we have to manually + // add the frame's header we read at the previous iteration. + // Note that LoadNextH263Object returns the number of bytes read, which + // are the current frame's data and the next frame's header + frameSize += H263_REQUIRE_HEADER_SIZE_BYTES; + // There is no need for the next iteration ... + stay = false; + } + + // If this is the first iteration ... + if (currentInfo.width == 0) { + // If we have more data than just the header + if ((frameSize > H263_REQUIRE_HEADER_SIZE_BYTES) || + !pCurrentHeader) // Or no header at all + break; // Fatal error + else + continue; // We have only the first frame's header ... + } + + if (trackId == MP4_INVALID_TRACK_ID) { + // If a track has not been added yet, add the track to the file. + trackId = MP4AddH263VideoTrack(outputFileHandle, H263_TIMESCALE, + 0, currentInfo.width, currentInfo.height, + h263Level, h263Profile, 0, 0); + if (trackId == MP4_INVALID_TRACK_ID) + break; // Fatal error + } + + // calculate the current frame duration + currentDuration = CalculateDuration(trDifference); + // Write the current frame to the file. + if (!MP4WriteSample(outputFileHandle, trackId, frameBuffer, frameSize, + currentDuration, 0, currentInfo.isSyncFrame)) + break; // Fatal error + + // Accumulate the frame's size and duration for avgBitrate calculation + totalDuration += currentDuration; + totalBytes += frameSize; + // If needed, recalculate bitrate information + if (h263Bitrates) + GetMaxBitrate(&maxBitrateCtx, frameSize, prevTrDifference); + prevTrDifference = trDifference; + } // while (stay) + + // If this is the last frame, + if (!stay) { + // If needed and possible, update bitrate information in the file + if (h263Bitrates && totalDuration) { + avgBitrate = (totalBytes * 8 * H263_TIMESCALE) / totalDuration; + if (cbrTolerance == 0) + cbrTolerance = H263_DEFAULT_CBR_TOLERANCE; + // Same as: if (maxBitrate / avgBitrate > (cbrTolerance + 100) / 100.0) + if (maxBitrateCtx.maxBitrate * 100 > (cbrTolerance + 100) * avgBitrate) + avgBitrate = 0; + MP4SetH263Bitrates(outputFileHandle, trackId, + avgBitrate, maxBitrateCtx.maxBitrate); + } + // Return the newly added track ID + return trackId; + } + + // If we got to here... something went wrong ... + fprintf(stderr, + "%s: Could not parse input file, invalid video stream?\n", ProgName); + // Upon failure, delete the newly added track if it has been added + if (trackId != MP4_INVALID_TRACK_ID) { + MP4DeleteTrack(outputFileHandle, trackId); + } + return MP4_INVALID_TRACK_ID; +} + +/ * + * LoadNextH263Object - service routine that reads a single frame from the input + * file. It shall fill the input buffer with data up until - and including - the + * next start code and shall report back both the number of bytes read and a + * pointer to the next start code. The first call to this function shall only + * yield a pointer with 0 data bytes and the last call to this function shall + * only yield data bytes with a NULL pointer as the next header. + * + * TODO: This function only supports valid bit streams. Upon error, it fails + * without the possibility to recover. A Better idea would be to skip frames + * until a parsable frame is read from the file. + * + * Parameters: + * inputFileHandle - The handle of the input file + * frameBuffer - buffer where to place read data + * frameBufferSize - in/out parameter indicating the size of the buffer on + * entry and the number of bytes copied to the buffer upon + * return + * additionalBytesNeeded - indicates how many additional bytes are to be read + * from the next frame's header (over the 3 bytes that + * are already read). + * NOTE: This number MUST be > 0 + * ppNextHeader - output parameter that upon return points to the location + * of the next frame's head in the buffer + * Outputs: + * This function returns two pieces of information: + * 1. The total number of bytes read. + * 2. A Pointer to the header of the next frame. This pointer shall be NULL + * for the last frame read. + * / +static int LoadNextH263Object( FILE *inputFileHandle, + u_int8_t *frameBuffer, + u_int32_t *frameBufferSize, + u_int32_t additionalBytesNeeded, + u_int8_t **ppNextHeader) +{ + // This table and the following loop implements a state machine enabling + // us to read bytes from the file untill (and inclusing) the requested + // start code (00 00 8X) is found + char row = 0; + u_int8_t *bufferStart = frameBuffer; + // The buffer end which will allow the loop to leave place for + // the additionalBytesNeeded + u_int8_t *bufferEnd = frameBuffer + *frameBufferSize - + additionalBytesNeeded - 1; + + // Initialize the states array, if it hasn't been initialized yet... + if (!states[0][0]) { + // One 00 was read + states[0][0] = 1; + // Two sequential 0x00 ware read + states[1][0] = states[2][0] = 2; + // A full start code was read + states[2][128] = states[2][129] = states[2][130] = states[2][131] = -1; + } + + // Read data from file into the output buffer until either a start code + // is found, or the end of file has been reached. + do { + if (fread(frameBuffer, 1, 1, inputFileHandle) != 1){ + // EOF or other error before we got a start code + *ppNextHeader = NULL; + *frameBufferSize = frameBuffer - bufferStart; + return 1; + } + } while ((frameBuffer < bufferEnd) && // We have place in the buffer + ((row = states[row][*(frameBuffer++)]) != -1)); // Start code was not found + if (row != -1) { + fprintf(stderr, "%s: Buffer too small (%u)\n", + ProgName, bufferEnd - bufferStart + additionalBytesNeeded); + return 0; + } + + // Cool ... now we have a start code + *ppNextHeader = frameBuffer - H263_STARTCODE_SIZE_BYTES; + *frameBufferSize = frameBuffer - bufferStart + additionalBytesNeeded; + + // Now we just have to read the additionalBytesNeeded + if(fread(frameBuffer, additionalBytesNeeded, 1, inputFileHandle) != 1) { + /// We got a start code but can't read additionalBytesNeeded ... that's a fatal error + fprintf(stderr, "%s: Invalid H263 bitstream\n", ProgName); + return 0; + } + + return 1; +} + + +/ * + * ParseShortHeader - service routine that accepts a buffer containing a frame + * header and extracts relevant codec information from it. + * + * NOTE: the first bit in the following commnets is 0 (zero). + * + * + * 0 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | PSC (Picture Start Code=22 bits) | (TR=8 bits) | > + * |0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0| |1 0> + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * < (PTYPE=13 bits) | + * <. . .|(FMT)|Z|. . . .| + * +-+-+-+-+-+-+-+-+-+-+-+ + * -> PTYPE.FMT contains a width/height identification + * -> PTYPE.Z is 1 for P-Frames, 0 for I-Frames + * Note: When FMT is 111, there is an extended PTYPE... + * + * Inputs: + * headerBuffer - pointer to the current header buffer + * outputInfoStruct - pointer to the structure receiving the data + * Outputs: + * This function returns a structure of important codec-specific + * information (The Temporal Reference bits, width & height of the current + * frame and the sync - or "frame type" - bit. It reports success or + * failure to the calling function. + * / +static bool ParseShortHeader( u_int8_t *headerBuffer, + H263INFO *outputInfoStruct) +{ + u_int8_t fmt = 0; + // Extract temporal reference (TR) from the buffer (bits 22-29 inclusive) + outputInfoStruct->tr = (headerBuffer[2] << 6) & 0xC0; // 2 LS bits out of the 3rd byte + outputInfoStruct->tr |= (headerBuffer[3] >> 2) & 0x3F; // 6 MS bits out of the 4th byte + // Extract the FMT part of PTYPE from the buffer (bits 35-37 inclusive) + fmt = (headerBuffer[4] >> 2) & 0x07; // bits 3-5 ouf of the 5th byte + // If PTYPE is not supported, return a failure notice to the calling function + // FIXME: PLUSPTYPE is not supported + if (fmt == 0x07) { + return false; + } + // If PTYPE is supported, calculate the current width and height according to + // a predefined table + if (!GetWidthAndHeight(fmt, &(outputInfoStruct->width), + &(outputInfoStruct->height))) { + return false; + } + // Extract the frame-type bit, which is the 9th bit of PTYPE (bit 38) + outputInfoStruct->isSyncFrame = !(headerBuffer[4] & 0x02); + + return true; +} + +/ * + * GetMaxBitrate- service routine that accepts frame information and + * derives bitrate information from it. This function uses a sliding window + * technique to calculate the maximum bitrates in any window of 1 second + * inside the file. + * The sliding window is implemented with a table of bitrates for the last + * second (30 entries - one entry per TR unit). + * + * Inputs: + * ctx - context for this function + * frameSize - the size of the current frame in bytes + * frameTRDiff - the "duration" of the frame in TR units + * Outputs: + * This function returns the up-to-date maximum bitrate + * / +static void GetMaxBitrate( MaxBitrate_CTX *ctx, + u_int32_t frameSize, + u_int8_t frameTRDiff) +{ + if (frameTRDiff == 0) + return; + + // Calculate the current frame's bitrate as bits per TR unit (round the result + // upwards) + u_int32_t frameBitrate = frameSize * 8 / frameTRDiff + 1; + + // for each TRdiff received, + while (frameTRDiff--) { + // Subtract the oldest bitrate entry from the current bitrate + ctx->windowBitrate -= ctx->bitrateTable[ctx->tableIndex]; + // Update the oldest bitrate entry with the current frame's bitrate + ctx->bitrateTable[ctx->tableIndex] = frameBitrate; + // Add the current frame's bitrate to the current bitrate + ctx->windowBitrate += frameBitrate; + // Check if we have a new maximum bitrate + if (ctx->windowBitrate > ctx->maxBitrate) { + ctx->maxBitrate = ctx->windowBitrate; + } + // Advance the table index + ctx->tableIndex = (ctx->tableIndex + 1) % + // Wrapping around the bitrateTable size + ( sizeof(ctx->bitrateTable) / sizeof(ctx->bitrateTable[0]) ); + } +} + +/ * + * CalculateDuration - service routine that calculates the current frame's + * duration in milli-seconds using it's duration in TR units. + * - In order not to accumulate the calculation error, we are using the TR + * duration to calculate the current and the next frame's presentation time in + * milli-seconds. + * + * Inputs: + * trDiff - The current frame's duration in TR units + * Outputs: + * The current frame's duration in milli-seconds + * / +static MP4Duration CalculateDuration(u_int8_t trDiff) +{ + static u_int32_t const nextTR = 0; // The next frame's presentation time in TR units + static MP4Duration const currentPT = 0; // The current frame's presentation time in milli-seconds + MP4Duration nextPT; // The next frame's presentation time in milli-seconds + MP4Duration duration; // The current frame's duration in milli-seconds + + nextTR += trDiff; + // Calculate the next frame's presentation time, in milli-seconds + nextPT = (nextTR * 1001) / H263_BASIC_FRAME_RATE; + // The frame's duration is the difference between the next presentation + // time and the current presentation time. + duration = nextPT - currentPT; + // "Remember" the next presentation time for the next time this function is + // called + currentPT = nextPT; + + return duration; +} + +static bool GetWidthAndHeight( u_int8_t fmt, + u_int16_t *width, + u_int16_t *height) +{ + // The 'fmt' corresponds to bits 5-7 of the PTYPE + static struct { + u_int16_t width; + u_int16_t height; + } const dimensionsTable[8] = { + { 0, 0 }, // 000 - 0 - forbidden, generates an error + { 128, 96 }, // 001 - 1 - Sub QCIF + { 176, 144 }, // 010 - 2 - QCIF + { 352, 288 }, // 011 - 3 - CIF + { 704, 576 }, // 100 - 4 - 4CIF + { 1409, 1152 }, // 101 - 5 - 16CIF + { 0, 0 }, // 110 - 6 - reserved, generates an error + { 0, 0 } // 111 - 7 - extended, not supported by profile 0 + }; + + if (fmt > 7) + return false; + + *width = dimensionsTable[fmt].width; + *height = dimensionsTable[fmt].height; + + if (*width == 0) + return false; + + return true; +} + +static u_int8_t GetTRDifference(u_int8_t nextTR, + u_int8_t currentTR) +{ + if (currentTR > nextTR) { + // Wrap around 255... + return nextTR + (256 - currentTR); + } else { + return nextTR - currentTR; + } +} + +*/ + diff --git a/src/big/mpp/middleware/src/live555/liveMedia/H263plusVideoStreamParser.hh b/src/big/mpp/middleware/src/live555/liveMedia/H263plusVideoStreamParser.hh new file mode 100644 index 000000000..d12959ed7 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/H263plusVideoStreamParser.hh @@ -0,0 +1,127 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A filter that breaks up an H263 video stream into frames. +// derived from MPEG4IP h263.c +// Author Benhard Feiten + +#ifndef _H263PLUS_VIDEO_STREAM_PARSER_HH +#define _H263PLUS_VIDEO_STREAM_PARSER_HH + +#ifndef _STREAM_PARSER_HH +#include "StreamParser.hh" +#endif + + +// Default timescale for H.263 (1000ms) +#define H263_TIMESCALE 1000 + +// Default H263 frame rate (30fps) +#define H263_BASIC_FRAME_RATE 30 + +// Minimum number of bytes needed to parse an H263 header +#define H263_REQUIRE_HEADER_SIZE_BYTES 5 + +// Number of bytes the start code requries +#define H263_STARTCODE_SIZE_BYTES 3 + +// This is the input buffer's size. It should contain +// 1 frame with the following start code +#define H263_BUFFER_SIZE 256 * 1024 + +// additionalBytesNeeded - indicates how many additional bytes are to be read +// from the next frame's header (over the 3 bytes that are already read). +#define ADDITIONAL_BYTES_NEEDED H263_REQUIRE_HEADER_SIZE_BYTES - H263_STARTCODE_SIZE_BYTES + +// The default max different (in %) betwqeen max and average bitrates +#define H263_DEFAULT_CBR_TOLERANCE 10 + + + +// The following structure holds information extracted from each frame's header: +typedef struct _H263INFO { + u_int8_t tr; // Temporal Reference, used in duration calculation + u_int16_t width; // Width of the picture + u_int16_t height; // Height of the picture + bool isSyncFrame; // Frame type (true = I frame = "sync" frame) +} H263INFO; + +typedef struct _MaxBitrate_CTX { + u_int32_t bitrateTable[H263_BASIC_FRAME_RATE];// Window of 1 second + u_int32_t windowBitrate; // The bitrate of the current window + u_int32_t maxBitrate; // The up-to-date maximum bitrate + u_int32_t tableIndex; // The next TR unit to update +} MaxBitrate_CTX; + + +class H263plusVideoStreamParser : public StreamParser { + +public: + H263plusVideoStreamParser( class H263plusVideoStreamFramer* usingSource, + FramedSource* inputSource); + + virtual ~H263plusVideoStreamParser(); + + void registerReadInterest(unsigned char* to, unsigned maxSize); + + unsigned parse(u_int64_t & currentDuration); // returns the size of the frame that was acquired, or 0 if none + unsigned numTruncatedBytes() const { return fNumTruncatedBytes; } // The number of truncated bytes (if any) + + +protected: +// H263plusVideoStreamFramer* usingSource() { +// return (H263plusVideoStreamFramer*)fUsingSource; +// } + void setParseState(); + +// void setParseState(H263plusParseState parseState); + + +private: + int parseH263Frame( ); + bool ParseShortHeader(u_int8_t *headerBuffer, H263INFO *outputInfoStruct); + void GetMaxBitrate( MaxBitrate_CTX *ctx, u_int32_t frameSize, u_int8_t frameTRDiff); + u_int64_t CalculateDuration(u_int8_t trDiff); + bool GetWidthAndHeight( u_int8_t fmt, u_int16_t *width, u_int16_t *height); + u_int8_t GetTRDifference( u_int8_t nextTR, u_int8_t currentTR); + + virtual void restoreSavedParserState(); + +protected: + class H263plusVideoStreamFramer* fUsingSource; + + unsigned char* fTo; + unsigned fMaxSize; + unsigned char* fStartOfFrame; + unsigned char* fSavedTo; + unsigned char* fLimit; + unsigned fNumTruncatedBytes; + unsigned fSavedNumTruncatedBytes; + +private: + H263INFO fNextInfo; // Holds information about the next frame + H263INFO fCurrentInfo; // Holds information about the current frame + MaxBitrate_CTX fMaxBitrateCtx; // Context for the GetMaxBitrate function + char fStates[3][256]; + u_int8_t fNextHeader[H263_REQUIRE_HEADER_SIZE_BYTES]; + + u_int32_t fnextTR; // The next frame's presentation time in TR units + u_int64_t fcurrentPT; // The current frame's presentation time in milli-seconds + +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/H264VideoFileServerMediaSubsession.cpp b/src/big/mpp/middleware/src/live555/liveMedia/H264VideoFileServerMediaSubsession.cpp new file mode 100644 index 000000000..dff801648 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/H264VideoFileServerMediaSubsession.cpp @@ -0,0 +1,120 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A 'ServerMediaSubsession' object that creates new, unicast, "RTPSink"s +// on demand, from a H264 video file. +// Implementation + +#include "H264VideoFileServerMediaSubsession.hh" +#include "H264VideoRTPSink.hh" +#include "ByteStreamFileSource.hh" +#include "H264VideoStreamFramer.hh" + +H264VideoFileServerMediaSubsession* +H264VideoFileServerMediaSubsession::createNew(UsageEnvironment& env, + char const* fileName, + Boolean reuseFirstSource) { + return new H264VideoFileServerMediaSubsession(env, fileName, reuseFirstSource); +} + +H264VideoFileServerMediaSubsession::H264VideoFileServerMediaSubsession(UsageEnvironment& env, + char const* fileName, Boolean reuseFirstSource) + : FileServerMediaSubsession(env, fileName, reuseFirstSource), + fAuxSDPLine(NULL), fDoneFlag(0), fDummyRTPSink(NULL) { +} + +H264VideoFileServerMediaSubsession::~H264VideoFileServerMediaSubsession() { + delete[] fAuxSDPLine; +} + +static void afterPlayingDummy(void* clientData) { + H264VideoFileServerMediaSubsession* subsess = (H264VideoFileServerMediaSubsession*)clientData; + subsess->afterPlayingDummy1(); +} + +void H264VideoFileServerMediaSubsession::afterPlayingDummy1() { + // Unschedule any pending 'checking' task: + envir().taskScheduler().unscheduleDelayedTask(nextTask()); + // Signal the event loop that we're done: + setDoneFlag(); +} + +static void checkForAuxSDPLine(void* clientData) { + H264VideoFileServerMediaSubsession* subsess = (H264VideoFileServerMediaSubsession*)clientData; + subsess->checkForAuxSDPLine1(); +} + +void H264VideoFileServerMediaSubsession::checkForAuxSDPLine1() { + nextTask() = NULL; + + char const* dasl; + if (fAuxSDPLine != NULL) { + // Signal the event loop that we're done: + setDoneFlag(); + } else if (fDummyRTPSink != NULL && (dasl = fDummyRTPSink->auxSDPLine()) != NULL) { + fAuxSDPLine = strDup(dasl); + fDummyRTPSink = NULL; + + // Signal the event loop that we're done: + setDoneFlag(); + } else if (!fDoneFlag) { + // try again after a brief delay: + int uSecsToDelay = 100000; // 100 ms + nextTask() = envir().taskScheduler().scheduleDelayedTask(uSecsToDelay, + (TaskFunc*)checkForAuxSDPLine, this); + } +} + +char const* H264VideoFileServerMediaSubsession::getAuxSDPLine(RTPSink* rtpSink, FramedSource* inputSource) { + if (fAuxSDPLine != NULL) return fAuxSDPLine; // it's already been set up (for a previous client) + + if (fDummyRTPSink == NULL) { // we're not already setting it up for another, concurrent stream + // Note: For H264 video files, the 'config' information ("profile-level-id" and "sprop-parameter-sets") isn't known + // until we start reading the file. This means that "rtpSink"s "auxSDPLine()" will be NULL initially, + // and we need to start reading data from our file until this changes. + fDummyRTPSink = rtpSink; + + // Start reading the file: + fDummyRTPSink->startPlaying(*inputSource, afterPlayingDummy, this); + + // Check whether the sink's 'auxSDPLine()' is ready: + checkForAuxSDPLine(this); + } + + envir().taskScheduler().doEventLoop(&fDoneFlag); + + return fAuxSDPLine; +} + +FramedSource* H264VideoFileServerMediaSubsession::createNewStreamSource(unsigned /*clientSessionId*/, unsigned& estBitrate) { + estBitrate = 500; // kbps, estimate + + // Create the video source: + ByteStreamFileSource* fileSource = ByteStreamFileSource::createNew(envir(), fFileName); + if (fileSource == NULL) return NULL; + fFileSize = fileSource->fileSize(); + + // Create a framer for the Video Elementary Stream: + return H264VideoStreamFramer::createNew(envir(), fileSource); +} + +RTPSink* H264VideoFileServerMediaSubsession +::createNewRTPSink(Groupsock* rtpGroupsock, + unsigned char rtpPayloadTypeIfDynamic, + FramedSource* /*inputSource*/) { + return H264VideoRTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/H264VideoFileSink.cpp b/src/big/mpp/middleware/src/live555/liveMedia/H264VideoFileSink.cpp new file mode 100644 index 000000000..100da6f4f --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/H264VideoFileSink.cpp @@ -0,0 +1,59 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// H.264 Video File sinks +// Implementation + +#include "H264VideoFileSink.hh" +#include "OutputFile.hh" + +////////// H264VideoFileSink ////////// + +H264VideoFileSink +::H264VideoFileSink(UsageEnvironment& env, FILE* fid, + char const* sPropParameterSetsStr, + unsigned bufferSize, char const* perFrameFileNamePrefix) + : H264or5VideoFileSink(env, fid, bufferSize, perFrameFileNamePrefix, + sPropParameterSetsStr, NULL, NULL) { +} + +H264VideoFileSink::~H264VideoFileSink() { +} + +H264VideoFileSink* +H264VideoFileSink::createNew(UsageEnvironment& env, char const* fileName, + char const* sPropParameterSetsStr, + unsigned bufferSize, Boolean oneFilePerFrame) { + do { + FILE* fid; + char const* perFrameFileNamePrefix; + if (oneFilePerFrame) { + // Create the fid for each frame + fid = NULL; + perFrameFileNamePrefix = fileName; + } else { + // Normal case: create the fid once + fid = OpenOutputFile(env, fileName); + if (fid == NULL) break; + perFrameFileNamePrefix = NULL; + } + + return new H264VideoFileSink(env, fid, sPropParameterSetsStr, bufferSize, perFrameFileNamePrefix); + } while (0); + + return NULL; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/H264VideoRTPSink.cpp b/src/big/mpp/middleware/src/live555/liveMedia/H264VideoRTPSink.cpp new file mode 100644 index 000000000..b92c39d74 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/H264VideoRTPSink.cpp @@ -0,0 +1,131 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP sink for H.264 video (RFC 3984) +// Implementation + +#include "H264VideoRTPSink.hh" +#include "H264VideoStreamFramer.hh" +#include "Base64.hh" +#include "H264VideoRTPSource.hh" // for "parseSPropParameterSets()" + +////////// H264VideoRTPSink implementation ////////// + +H264VideoRTPSink +::H264VideoRTPSink(UsageEnvironment& env, Groupsock* RTPgs, unsigned char rtpPayloadFormat, + u_int8_t const* sps, unsigned spsSize, u_int8_t const* pps, unsigned ppsSize) + : H264or5VideoRTPSink(264, env, RTPgs, rtpPayloadFormat, + NULL, 0, sps, spsSize, pps, ppsSize) { +} + +H264VideoRTPSink::~H264VideoRTPSink() { +} + +H264VideoRTPSink* H264VideoRTPSink +::createNew(UsageEnvironment& env, Groupsock* RTPgs, unsigned char rtpPayloadFormat) { + return new H264VideoRTPSink(env, RTPgs, rtpPayloadFormat); +} + +H264VideoRTPSink* H264VideoRTPSink +::createNew(UsageEnvironment& env, Groupsock* RTPgs, unsigned char rtpPayloadFormat, + u_int8_t const* sps, unsigned spsSize, u_int8_t const* pps, unsigned ppsSize) { + return new H264VideoRTPSink(env, RTPgs, rtpPayloadFormat, sps, spsSize, pps, ppsSize); +} + +H264VideoRTPSink* H264VideoRTPSink +::createNew(UsageEnvironment& env, Groupsock* RTPgs, unsigned char rtpPayloadFormat, + char const* sPropParameterSetsStr) { + u_int8_t* sps = NULL; unsigned spsSize = 0; + u_int8_t* pps = NULL; unsigned ppsSize = 0; + + unsigned numSPropRecords; + SPropRecord* sPropRecords = parseSPropParameterSets(sPropParameterSetsStr, numSPropRecords); + for (unsigned i = 0; i < numSPropRecords; ++i) { + if (sPropRecords[i].sPropLength == 0) continue; // bad data + u_int8_t nal_unit_type = (sPropRecords[i].sPropBytes[0])&0x1F; + if (nal_unit_type == 7/*SPS*/) { + sps = sPropRecords[i].sPropBytes; + spsSize = sPropRecords[i].sPropLength; + } else if (nal_unit_type == 8/*PPS*/) { + pps = sPropRecords[i].sPropBytes; + ppsSize = sPropRecords[i].sPropLength; + } + } + + H264VideoRTPSink* result + = new H264VideoRTPSink(env, RTPgs, rtpPayloadFormat, sps, spsSize, pps, ppsSize); + delete[] sPropRecords; + + return result; +} + +Boolean H264VideoRTPSink::sourceIsCompatibleWithUs(MediaSource& source) { + // Our source must be an appropriate framer: + return source.isH264VideoStreamFramer(); +} + +char const* H264VideoRTPSink::auxSDPLine() { + // Generate a new "a=fmtp:" line each time, using our SPS and PPS (if we have them), + // otherwise parameters from our framer source (in case they've changed since the last time that + // we were called): + H264or5VideoStreamFramer* framerSource = NULL; + u_int8_t* vpsDummy = NULL; unsigned vpsDummySize = 0; + u_int8_t* sps = fSPS; unsigned spsSize = fSPSSize; + u_int8_t* pps = fPPS; unsigned ppsSize = fPPSSize; + if (sps == NULL || pps == NULL) { + // We need to get SPS and PPS from our framer source: + if (fOurFragmenter == NULL) return NULL; // we don't yet have a fragmenter (and therefore not a source) + framerSource = (H264or5VideoStreamFramer*)(fOurFragmenter->inputSource()); + if (framerSource == NULL) return NULL; // we don't yet have a source + + framerSource->getVPSandSPSandPPS(vpsDummy, vpsDummySize, sps, spsSize, pps, ppsSize); + if (sps == NULL || pps == NULL) return NULL; // our source isn't ready + } + + // Set up the "a=fmtp:" SDP line for this stream: + u_int8_t* spsWEB = new u_int8_t[spsSize]; // "WEB" means "Without Emulation Bytes" + unsigned spsWEBSize = removeH264or5EmulationBytes(spsWEB, spsSize, sps, spsSize); + if (spsWEBSize < 4) { // Bad SPS size => assume our source isn't ready + delete[] spsWEB; + return NULL; + } + u_int32_t profileLevelId = (spsWEB[1]<<16) | (spsWEB[2]<<8) | spsWEB[3]; + delete[] spsWEB; + + char* sps_base64 = base64Encode((char*)sps, spsSize); + char* pps_base64 = base64Encode((char*)pps, ppsSize); + + char const* fmtpFmt = + "a=fmtp:%d packetization-mode=1" + ";profile-level-id=%06X" + ";sprop-parameter-sets=%s,%s\r\n"; + unsigned fmtpFmtSize = strlen(fmtpFmt) + + 3 /* max char len */ + + 6 /* 3 bytes in hex */ + + strlen(sps_base64) + strlen(pps_base64); + char* fmtp = new char[fmtpFmtSize]; + sprintf(fmtp, fmtpFmt, + rtpPayloadType(), + profileLevelId, + sps_base64, pps_base64); + + delete[] sps_base64; + delete[] pps_base64; + + delete[] fFmtpSDPLine; fFmtpSDPLine = fmtp; + return fFmtpSDPLine; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/H264VideoRTPSource.cpp b/src/big/mpp/middleware/src/live555/liveMedia/H264VideoRTPSource.cpp new file mode 100644 index 000000000..1558aaf44 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/H264VideoRTPSource.cpp @@ -0,0 +1,199 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// H.264 Video RTP Sources +// Implementation + +#include "H264VideoRTPSource.hh" +#include "Base64.hh" + +////////// H264BufferedPacket and H264BufferedPacketFactory ////////// + +class H264BufferedPacket: public BufferedPacket { +public: + H264BufferedPacket(H264VideoRTPSource& ourSource); + virtual ~H264BufferedPacket(); + +private: // redefined virtual functions + virtual unsigned nextEnclosedFrameSize(unsigned char*& framePtr, + unsigned dataSize); +private: + H264VideoRTPSource& fOurSource; +}; + +class H264BufferedPacketFactory: public BufferedPacketFactory { +private: // redefined virtual functions + virtual BufferedPacket* createNewPacket(MultiFramedRTPSource* ourSource); +}; + + +///////// H264VideoRTPSource implementation //////// + +H264VideoRTPSource* +H264VideoRTPSource::createNew(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency) { + return new H264VideoRTPSource(env, RTPgs, rtpPayloadFormat, + rtpTimestampFrequency); +} + +H264VideoRTPSource +::H264VideoRTPSource(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency) + : MultiFramedRTPSource(env, RTPgs, rtpPayloadFormat, rtpTimestampFrequency, + new H264BufferedPacketFactory) { +} + +H264VideoRTPSource::~H264VideoRTPSource() { +} + +Boolean H264VideoRTPSource +::processSpecialHeader(BufferedPacket* packet, + unsigned& resultSpecialHeaderSize) { + unsigned char* headerStart = packet->data(); + unsigned packetSize = packet->dataSize(); + unsigned numBytesToSkip; + + // Check the 'nal_unit_type' for special 'aggregation' or 'fragmentation' packets: + if (packetSize < 1) return False; + fCurPacketNALUnitType = (headerStart[0]&0x1F); + switch (fCurPacketNALUnitType) { + case 24: { // STAP-A + numBytesToSkip = 1; // discard the type byte + break; + } + case 25: case 26: case 27: { // STAP-B, MTAP16, or MTAP24 + numBytesToSkip = 3; // discard the type byte, and the initial DON + break; + } + case 28: case 29: { // // FU-A or FU-B + // For these NALUs, the first two bytes are the FU indicator and the FU header. + // If the start bit is set, we reconstruct the original NAL header into byte 1: + if (packetSize < 2) return False; + unsigned char startBit = headerStart[1]&0x80; + unsigned char endBit = headerStart[1]&0x40; + if (startBit) { + fCurrentPacketBeginsFrame = True; + + headerStart[1] = (headerStart[0]&0xE0)|(headerStart[1]&0x1F); + numBytesToSkip = 1; + } else { + // The start bit is not set, so we skip both the FU indicator and header: + fCurrentPacketBeginsFrame = False; + numBytesToSkip = 2; + } + fCurrentPacketCompletesFrame = (endBit != 0); + break; + } + default: { + // This packet contains one complete NAL unit: + fCurrentPacketBeginsFrame = fCurrentPacketCompletesFrame = True; + numBytesToSkip = 0; + break; + } + } + + resultSpecialHeaderSize = numBytesToSkip; + return True; +} + +char const* H264VideoRTPSource::MIMEtype() const { + return "video/H264"; +} + +SPropRecord* parseSPropParameterSets(char const* sPropParameterSetsStr, + // result parameter: + unsigned& numSPropRecords) { + // Make a copy of the input string, so we can replace the commas with '\0's: + char* inStr = strDup(sPropParameterSetsStr); + if (inStr == NULL) { + numSPropRecords = 0; + return NULL; + } + + // Count the number of commas (and thus the number of parameter sets): + numSPropRecords = 1; + char* s; + for (s = inStr; *s != '\0'; ++s) { + if (*s == ',') { + ++numSPropRecords; + *s = '\0'; + } + } + + // Allocate and fill in the result array: + SPropRecord* resultArray = new SPropRecord[numSPropRecords]; + s = inStr; + for (unsigned i = 0; i < numSPropRecords; ++i) { + resultArray[i].sPropBytes = base64Decode(s, resultArray[i].sPropLength); + s += strlen(s) + 1; + } + + delete[] inStr; + return resultArray; +} + + +////////// H264BufferedPacket and H264BufferedPacketFactory implementation ////////// + +H264BufferedPacket::H264BufferedPacket(H264VideoRTPSource& ourSource) + : fOurSource(ourSource) { +} + +H264BufferedPacket::~H264BufferedPacket() { +} + +unsigned H264BufferedPacket +::nextEnclosedFrameSize(unsigned char*& framePtr, unsigned dataSize) { + unsigned resultNALUSize = 0; // if an error occurs + + switch (fOurSource.fCurPacketNALUnitType) { + case 24: case 25: { // STAP-A or STAP-B + // The first two bytes are NALU size: + if (dataSize < 2) break; + resultNALUSize = (framePtr[0]<<8)|framePtr[1]; + framePtr += 2; + break; + } + case 26: { // MTAP16 + // The first two bytes are NALU size. The next three are the DOND and TS offset: + if (dataSize < 5) break; + resultNALUSize = (framePtr[0]<<8)|framePtr[1]; + framePtr += 5; + break; + } + case 27: { // MTAP24 + // The first two bytes are NALU size. The next four are the DOND and TS offset: + if (dataSize < 6) break; + resultNALUSize = (framePtr[0]<<8)|framePtr[1]; + framePtr += 6; + break; + } + default: { + // Common case: We use the entire packet data: + return dataSize; + } + } + + return (resultNALUSize <= dataSize) ? resultNALUSize : dataSize; +} + +BufferedPacket* H264BufferedPacketFactory +::createNewPacket(MultiFramedRTPSource* ourSource) { + return new H264BufferedPacket((H264VideoRTPSource&)(*ourSource)); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/H264VideoStreamDiscreteFramer.cpp b/src/big/mpp/middleware/src/live555/liveMedia/H264VideoStreamDiscreteFramer.cpp new file mode 100644 index 000000000..501c1dcab --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/H264VideoStreamDiscreteFramer.cpp @@ -0,0 +1,46 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A simplified version of "H264VideoStreamFramer" that takes only complete, +// discrete frames (rather than an arbitrary byte stream) as input. +// This avoids the parsing and data copying overhead of the full +// "H264VideoStreamFramer". +// Implementation + +#include "H264VideoStreamDiscreteFramer.hh" + +H264VideoStreamDiscreteFramer* +H264VideoStreamDiscreteFramer +::createNew(UsageEnvironment& env, FramedSource* inputSource, + Boolean includeStartCodeInOutput, Boolean insertAccessUnitDelimiters) { + return new H264VideoStreamDiscreteFramer(env, inputSource, + includeStartCodeInOutput, insertAccessUnitDelimiters); +} + +H264VideoStreamDiscreteFramer +::H264VideoStreamDiscreteFramer(UsageEnvironment& env, FramedSource* inputSource, + Boolean includeStartCodeInOutput, Boolean insertAccessUnitDelimiters) + : H264or5VideoStreamDiscreteFramer(264, env, inputSource, + includeStartCodeInOutput, insertAccessUnitDelimiters) { +} + +H264VideoStreamDiscreteFramer::~H264VideoStreamDiscreteFramer() { +} + +Boolean H264VideoStreamDiscreteFramer::isH264VideoStreamFramer() const { + return True; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/H264VideoStreamFramer.cpp b/src/big/mpp/middleware/src/live555/liveMedia/H264VideoStreamFramer.cpp new file mode 100644 index 000000000..9c8e2a819 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/H264VideoStreamFramer.cpp @@ -0,0 +1,42 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A filter that breaks up a H.264 Video Elementary Stream into NAL units. +// Implementation + +#include "H264VideoStreamFramer.hh" + +H264VideoStreamFramer* H264VideoStreamFramer +::createNew(UsageEnvironment& env, FramedSource* inputSource, + Boolean includeStartCodeInOutput, Boolean insertAccessUnitDelimiters) { + return new H264VideoStreamFramer(env, inputSource, True, + includeStartCodeInOutput, insertAccessUnitDelimiters); +} + +H264VideoStreamFramer +::H264VideoStreamFramer(UsageEnvironment& env, FramedSource* inputSource, Boolean createParser, + Boolean includeStartCodeInOutput, Boolean insertAccessUnitDelimiters) + : H264or5VideoStreamFramer(264, env, inputSource, createParser, + includeStartCodeInOutput, insertAccessUnitDelimiters) { +} + +H264VideoStreamFramer::~H264VideoStreamFramer() { +} + +Boolean H264VideoStreamFramer::isH264VideoStreamFramer() const { + return True; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/H264or5VideoFileSink.cpp b/src/big/mpp/middleware/src/live555/liveMedia/H264or5VideoFileSink.cpp new file mode 100644 index 000000000..20ddde775 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/H264or5VideoFileSink.cpp @@ -0,0 +1,66 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// H.264 or H.265 Video File sinks +// Implementation + +#include "H264or5VideoFileSink.hh" +#include "H264VideoRTPSource.hh" // for "parseSPropParameterSets()" + +////////// H264or5VideoFileSink ////////// + +H264or5VideoFileSink +::H264or5VideoFileSink(UsageEnvironment& env, FILE* fid, + unsigned bufferSize, char const* perFrameFileNamePrefix, + char const* sPropParameterSetsStr1, + char const* sPropParameterSetsStr2, + char const* sPropParameterSetsStr3) + : FileSink(env, fid, bufferSize, perFrameFileNamePrefix), + fHaveWrittenFirstFrame(False) { + fSPropParameterSetsStr[0] = strDup(sPropParameterSetsStr1); + fSPropParameterSetsStr[1] = strDup(sPropParameterSetsStr2); + fSPropParameterSetsStr[2] = strDup(sPropParameterSetsStr3); +} + +H264or5VideoFileSink::~H264or5VideoFileSink() { + for (unsigned j = 0; j < 3; ++j) delete[] (char*)fSPropParameterSetsStr[j]; +} + +void H264or5VideoFileSink::afterGettingFrame(unsigned frameSize, unsigned numTruncatedBytes, struct timeval presentationTime) { + unsigned char const start_code[4] = {0x00, 0x00, 0x00, 0x01}; + + if (!fHaveWrittenFirstFrame) { + // If we have NAL units encoded in "sprop parameter strings", prepend these to the file: + for (unsigned j = 0; j < 3; ++j) { + unsigned numSPropRecords; + SPropRecord* sPropRecords + = parseSPropParameterSets(fSPropParameterSetsStr[j], numSPropRecords); + for (unsigned i = 0; i < numSPropRecords; ++i) { + if (sPropRecords[i].sPropLength > 0) addData(start_code, 4, presentationTime); + addData(sPropRecords[i].sPropBytes, sPropRecords[i].sPropLength, presentationTime); + } + delete[] sPropRecords; + } + fHaveWrittenFirstFrame = True; // for next time + } + + // Write the input data to the file, with the start code in front: + addData(start_code, 4, presentationTime); + + // Call the parent class to complete the normal file write with the input data: + FileSink::afterGettingFrame(frameSize, numTruncatedBytes, presentationTime); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/H264or5VideoRTPSink.cpp b/src/big/mpp/middleware/src/live555/liveMedia/H264or5VideoRTPSink.cpp new file mode 100644 index 000000000..d8367b2d0 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/H264or5VideoRTPSink.cpp @@ -0,0 +1,299 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP sink for H.264 or H.265 video +// Implementation + +#include "H264or5VideoRTPSink.hh" +#include "H264or5VideoStreamFramer.hh" + +////////// H264or5Fragmenter definition ////////// + +// Because of the ideosyncracies of the H.264 RTP payload format, we implement +// "H264or5VideoRTPSink" using a separate "H264or5Fragmenter" class that delivers, +// to the "H264or5VideoRTPSink", only fragments that will fit within an outgoing +// RTP packet. I.e., we implement fragmentation in this separate "H264or5Fragmenter" +// class, rather than in "H264or5VideoRTPSink". +// (Note: This class should be used only by "H264or5VideoRTPSink", or a subclass.) + +class H264or5Fragmenter: public FramedFilter { +public: + H264or5Fragmenter(int hNumber, UsageEnvironment& env, FramedSource* inputSource, + unsigned inputBufferMax, unsigned maxOutputPacketSize); + virtual ~H264or5Fragmenter(); + + Boolean lastFragmentCompletedNALUnit() const { return fLastFragmentCompletedNALUnit; } + +private: // redefined virtual functions: + virtual void doGetNextFrame(); + virtual void doStopGettingFrames(); + +private: + static void afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + void afterGettingFrame1(unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + void reset(); + +private: + int fHNumber; + unsigned fInputBufferSize; + unsigned fMaxOutputPacketSize; + unsigned char* fInputBuffer; + unsigned fNumValidDataBytes; + unsigned fCurDataOffset; + unsigned fSaveNumTruncatedBytes; + Boolean fLastFragmentCompletedNALUnit; +}; + + +////////// H264or5VideoRTPSink implementation ////////// + +H264or5VideoRTPSink +::H264or5VideoRTPSink(int hNumber, + UsageEnvironment& env, Groupsock* RTPgs, unsigned char rtpPayloadFormat, + u_int8_t const* vps, unsigned vpsSize, + u_int8_t const* sps, unsigned spsSize, + u_int8_t const* pps, unsigned ppsSize) + : VideoRTPSink(env, RTPgs, rtpPayloadFormat, 90000, hNumber == 264 ? "H264" : "H265"), + fHNumber(hNumber), fOurFragmenter(NULL), fFmtpSDPLine(NULL) { + if (vps != NULL) { + fVPSSize = vpsSize; + fVPS = new u_int8_t[fVPSSize]; + memmove(fVPS, vps, fVPSSize); + } else { + fVPSSize = 0; + fVPS = NULL; + } + if (sps != NULL) { + fSPSSize = spsSize; + fSPS = new u_int8_t[fSPSSize]; + memmove(fSPS, sps, fSPSSize); + } else { + fSPSSize = 0; + fSPS = NULL; + } + if (pps != NULL) { + fPPSSize = ppsSize; + fPPS = new u_int8_t[fPPSSize]; + memmove(fPPS, pps, fPPSSize); + } else { + fPPSSize = 0; + fPPS = NULL; + } +} + +H264or5VideoRTPSink::~H264or5VideoRTPSink() { + fSource = fOurFragmenter; // hack: in case "fSource" had gotten set to NULL before we were called + delete[] fFmtpSDPLine; + delete[] fVPS; delete[] fSPS; delete[] fPPS; + stopPlaying(); // call this now, because we won't have our 'fragmenter' when the base class destructor calls it later. + + // Close our 'fragmenter' as well: + Medium::close(fOurFragmenter); + fSource = NULL; // for the base class destructor, which gets called next +} + +Boolean H264or5VideoRTPSink::continuePlaying() { + // First, check whether we have a 'fragmenter' class set up yet. + // If not, create it now: + if (fOurFragmenter == NULL) { + fOurFragmenter = new H264or5Fragmenter(fHNumber, envir(), fSource, OutPacketBuffer::maxSize, + ourMaxPacketSize() - 12/*RTP hdr size*/); + } else { + fOurFragmenter->reassignInputSource(fSource); + } + fSource = fOurFragmenter; + + // Then call the parent class's implementation: + return MultiFramedRTPSink::continuePlaying(); +} + +void H264or5VideoRTPSink::doSpecialFrameHandling(unsigned /*fragmentationOffset*/, + unsigned char* /*frameStart*/, + unsigned /*numBytesInFrame*/, + struct timeval framePresentationTime, + unsigned /*numRemainingBytes*/) { + // Set the RTP 'M' (marker) bit iff + // 1/ The most recently delivered fragment was the end of (or the only fragment of) an NAL unit, and + // 2/ This NAL unit was the last NAL unit of an 'access unit' (i.e. video frame). + if (fOurFragmenter != NULL) { + H264or5VideoStreamFramer* framerSource + = (H264or5VideoStreamFramer*)(fOurFragmenter->inputSource()); + // This relies on our fragmenter's source being a "H264or5VideoStreamFramer". + if (((H264or5Fragmenter*)fOurFragmenter)->lastFragmentCompletedNALUnit() + && framerSource != NULL && framerSource->pictureEndMarker()) { + setMarkerBit(); + framerSource->pictureEndMarker() = False; + } + } + + setTimestamp(framePresentationTime); +} + +Boolean H264or5VideoRTPSink +::frameCanAppearAfterPacketStart(unsigned char const* /*frameStart*/, + unsigned /*numBytesInFrame*/) const { + return False; +} + + +////////// H264or5Fragmenter implementation ////////// + +H264or5Fragmenter::H264or5Fragmenter(int hNumber, + UsageEnvironment& env, FramedSource* inputSource, + unsigned inputBufferMax, unsigned maxOutputPacketSize) + : FramedFilter(env, inputSource), + fHNumber(hNumber), + fInputBufferSize(inputBufferMax+1), fMaxOutputPacketSize(maxOutputPacketSize) { + fInputBuffer = new unsigned char[fInputBufferSize]; + reset(); +} + +H264or5Fragmenter::~H264or5Fragmenter() { + delete[] fInputBuffer; + detachInputSource(); // so that the subsequent ~FramedFilter() doesn't delete it +} + +void H264or5Fragmenter::doGetNextFrame() { + if (fNumValidDataBytes == 1) { + // We have no NAL unit data currently in the buffer. Read a new one: + fInputSource->getNextFrame(&fInputBuffer[1], fInputBufferSize - 1, + afterGettingFrame, this, + FramedSource::handleClosure, this); + } else { + // We have NAL unit data in the buffer. There are three cases to consider: + // 1. There is a new NAL unit in the buffer, and it's small enough to deliver + // to the RTP sink (as is). + // 2. There is a new NAL unit in the buffer, but it's too large to deliver to + // the RTP sink in its entirety. Deliver the first fragment of this data, + // as a FU packet, with one extra preceding header byte (for the "FU header"). + // 3. There is a NAL unit in the buffer, and we've already delivered some + // fragment(s) of this. Deliver the next fragment of this data, + // as a FU packet, with two (H.264) or three (H.265) extra preceding header bytes + // (for the "NAL header" and the "FU header"). + + if (fMaxSize < fMaxOutputPacketSize) { // shouldn't happen + envir() << "H264or5Fragmenter::doGetNextFrame(): fMaxSize (" + << fMaxSize << ") is smaller than expected\n"; + } else { + fMaxSize = fMaxOutputPacketSize; + } + + fLastFragmentCompletedNALUnit = True; // by default + if (fCurDataOffset == 1) { // case 1 or 2 + if (fNumValidDataBytes - 1 <= fMaxSize) { // case 1 + memmove(fTo, &fInputBuffer[1], fNumValidDataBytes - 1); + fFrameSize = fNumValidDataBytes - 1; + fCurDataOffset = fNumValidDataBytes; + } else { // case 2 + // We need to send the NAL unit data as FU packets. Deliver the first + // packet now. Note that we add "NAL header" and "FU header" bytes to the front + // of the packet (overwriting the existing "NAL header"). + if (fHNumber == 264) { + fInputBuffer[0] = (fInputBuffer[1] & 0xE0) | 28; // FU indicator + fInputBuffer[1] = 0x80 | (fInputBuffer[1] & 0x1F); // FU header (with S bit) + } else { // 265 + u_int8_t nal_unit_type = (fInputBuffer[1]&0x7E)>>1; + fInputBuffer[0] = (fInputBuffer[1] & 0x81) | (49<<1); // Payload header (1st byte) + fInputBuffer[1] = fInputBuffer[2]; // Payload header (2nd byte) + fInputBuffer[2] = 0x80 | nal_unit_type; // FU header (with S bit) + } + memmove(fTo, fInputBuffer, fMaxSize); + fFrameSize = fMaxSize; + fCurDataOffset += fMaxSize - 1; + fLastFragmentCompletedNALUnit = False; + } + } else { // case 3 + // We are sending this NAL unit data as FU packets. We've already sent the + // first packet (fragment). Now, send the next fragment. Note that we add + // "NAL header" and "FU header" bytes to the front. (We reuse these bytes that + // we already sent for the first fragment, but clear the S bit, and add the E + // bit if this is the last fragment.) + unsigned numExtraHeaderBytes; + if (fHNumber == 264) { + fInputBuffer[fCurDataOffset-2] = fInputBuffer[0]; // FU indicator + fInputBuffer[fCurDataOffset-1] = fInputBuffer[1]&~0x80; // FU header (no S bit) + numExtraHeaderBytes = 2; + } else { // 265 + fInputBuffer[fCurDataOffset-3] = fInputBuffer[0]; // Payload header (1st byte) + fInputBuffer[fCurDataOffset-2] = fInputBuffer[1]; // Payload header (2nd byte) + fInputBuffer[fCurDataOffset-1] = fInputBuffer[2]&~0x80; // FU header (no S bit) + numExtraHeaderBytes = 3; + } + unsigned numBytesToSend = numExtraHeaderBytes + (fNumValidDataBytes - fCurDataOffset); + if (numBytesToSend > fMaxSize) { + // We can't send all of the remaining data this time: + numBytesToSend = fMaxSize; + fLastFragmentCompletedNALUnit = False; + } else { + // This is the last fragment: + fInputBuffer[fCurDataOffset-1] |= 0x40; // set the E bit in the FU header + fNumTruncatedBytes = fSaveNumTruncatedBytes; + } + memmove(fTo, &fInputBuffer[fCurDataOffset-numExtraHeaderBytes], numBytesToSend); + fFrameSize = numBytesToSend; + fCurDataOffset += numBytesToSend - numExtraHeaderBytes; + } + + if (fCurDataOffset >= fNumValidDataBytes) { + // We're done with this data. Reset the pointers for receiving new data: + fNumValidDataBytes = fCurDataOffset = 1; + } + + // Complete delivery to the client: + FramedSource::afterGetting(this); + } +} + +void H264or5Fragmenter::doStopGettingFrames() { + // Make sure that we don't have any stale data fragments lying around, should we later resume: + reset(); + FramedFilter::doStopGettingFrames(); +} + +void H264or5Fragmenter::afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds) { + H264or5Fragmenter* fragmenter = (H264or5Fragmenter*)clientData; + fragmenter->afterGettingFrame1(frameSize, numTruncatedBytes, presentationTime, + durationInMicroseconds); +} + +void H264or5Fragmenter::afterGettingFrame1(unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds) { + fNumValidDataBytes += frameSize; + fSaveNumTruncatedBytes = numTruncatedBytes; + fPresentationTime = presentationTime; + fDurationInMicroseconds = durationInMicroseconds; + + // Deliver data to the client: + doGetNextFrame(); +} + +void H264or5Fragmenter::reset() { + fNumValidDataBytes = fCurDataOffset = 1; + fSaveNumTruncatedBytes = 0; + fLastFragmentCompletedNALUnit = True; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/H264or5VideoStreamDiscreteFramer.cpp b/src/big/mpp/middleware/src/live555/liveMedia/H264or5VideoStreamDiscreteFramer.cpp new file mode 100644 index 000000000..a3e75478d --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/H264or5VideoStreamDiscreteFramer.cpp @@ -0,0 +1,165 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A simplified version of "H264or5VideoStreamFramer" that takes only complete, +// discrete frames (rather than an arbitrary byte stream) as input. +// This avoids the parsing and data copying overhead of the full +// "H264or5VideoStreamFramer". +// Implementation + +#include "H264or5VideoStreamDiscreteFramer.hh" + +H264or5VideoStreamDiscreteFramer +::H264or5VideoStreamDiscreteFramer(int hNumber, UsageEnvironment& env, FramedSource* inputSource, + Boolean includeStartCodeInOutput, + Boolean insertAccessUnitDelimiters) + : H264or5VideoStreamFramer(hNumber, env, inputSource, False/*don't create a parser*/, + includeStartCodeInOutput, insertAccessUnitDelimiters) { +} + +H264or5VideoStreamDiscreteFramer::~H264or5VideoStreamDiscreteFramer() { +} + +void H264or5VideoStreamDiscreteFramer::doGetNextFrame() { + if (fIncludeStartCodeInOutput) { + // Prepend a 4-byte 'start code' (0x00000001) to the output: + if (fMaxSize < 4) { // there's no space + fNumTruncatedBytes = 4 - fMaxSize; + handleClosure(); + return; + } + *fTo++ = 0x00; *fTo++ = 0x00; *fTo++ = 0x00; *fTo++ = 0x01; + fMaxSize -= 4; + } + + if (fInsertAccessUnitDelimiters && pictureEndMarker()) { + // Deliver an "access_unit_delimiter" NAL unit instead: + unsigned const audNALSize = fHNumber == 264 ? 2 : 3; + + // If we have VPS,SPS,PPS NAL units, then append those as well: + unsigned nalDataSize + = audNALSize + fLastSeenVPSSize + fLastSeenSPSSize + fLastSeenPPSSize; + if (fIncludeStartCodeInOutput) { + // Add the size of the 4-byte start codes: + if (fLastSeenVPSSize > 0) nalDataSize += 4; + if (fLastSeenSPSSize > 0) nalDataSize += 4; + if (fLastSeenPPSSize > 0) nalDataSize += 4; + } + + if (nalDataSize > fMaxSize) { // there's no space + fNumTruncatedBytes = nalDataSize - fMaxSize; + handleClosure(); + return; + } + + if (fHNumber == 264) { + *fTo++ = 9; // "Access unit delimiter" nal_unit_type + *fTo++ = 0xF0; // "primary_pic_type" (7); "rbsp_trailing_bits()" + } else { // H.265 + *fTo++ = 35<<1; // "Access unit delimiter" nal_unit_type + *fTo++ = 0; // "nuh_layer_id" (0); "nuh_temporal_id_plus1" (0) (Is this correct??) + *fTo++ = 0x50; // "pic_type" (2); "rbsp_trailing_bits()" (Is this correct??) + } + + if (fLastSeenVPSSize > 0) { + if (fIncludeStartCodeInOutput) { *fTo++ = 0x00; *fTo++ = 0x00; *fTo++ = 0x00; *fTo++ = 0x01; } + memmove(fTo, fLastSeenVPS, fLastSeenVPSSize); fTo += fLastSeenVPSSize; + } + if (fLastSeenSPSSize > 0) { + if (fIncludeStartCodeInOutput) { *fTo++ = 0x00; *fTo++ = 0x00; *fTo++ = 0x00; *fTo++ = 0x01; } + memmove(fTo, fLastSeenSPS, fLastSeenSPSSize); fTo += fLastSeenSPSSize; + } + if (fLastSeenPPSSize > 0) { + if (fIncludeStartCodeInOutput) { *fTo++ = 0x00; *fTo++ = 0x00; *fTo++ = 0x00; *fTo++ = 0x01; } + memmove(fTo, fLastSeenPPS, fLastSeenPPSSize); fTo += fLastSeenPPSSize; + } + + fFrameSize = (fIncludeStartCodeInOutput ? 4: 0) + nalDataSize; + + pictureEndMarker() = False; // for next time + afterGetting(this); // complete delivery to the downstream object + } else { + // Normal case: + // Arrange to read data (which should be a complete H.264 or H.265 NAL unit) + // from our data source, directly into the client's input buffer. + // After reading this, we'll do some parsing on the frame. + fInputSource->getNextFrame(fTo, fMaxSize, + afterGettingFrame, this, + FramedSource::handleClosure, this); + } +} + +void H264or5VideoStreamDiscreteFramer +::afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds) { + H264or5VideoStreamDiscreteFramer* source = (H264or5VideoStreamDiscreteFramer*)clientData; + source->afterGettingFrame1(frameSize, numTruncatedBytes, presentationTime, durationInMicroseconds); +} + +void H264or5VideoStreamDiscreteFramer +::afterGettingFrame1(unsigned frameSize, unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds) { + // Get the "nal_unit_type", to see if this NAL unit is one that we want to save a copy of: + u_int8_t nal_unit_type; + if (fHNumber == 264 && frameSize >= 1) { + nal_unit_type = fTo[0]&0x1F; + } else if (fHNumber == 265 && frameSize >= 2) { + nal_unit_type = (fTo[0]&0x7E)>>1; + } else { + // This is too short to be a valid NAL unit, so just assume a bogus nal_unit_type + nal_unit_type = 0xFF; + } + + // Begin by checking for a (likely) common error: NAL units that (erroneously) begin with a + // 0x00000001 or 0x000001 'start code'. (Those start codes should only be in byte-stream data; + // *not* data that consists of discrete NAL units.) + // Once again, to be clear: The NAL units that you feed to a "H264or5VideoStreamDiscreteFramer" + // MUST NOT include start codes. + if (frameSize >= 4 && fTo[0] == 0 && fTo[1] == 0 && ((fTo[2] == 0 && fTo[3] == 1) || fTo[2] == 1)) { + envir() << "H264or5VideoStreamDiscreteFramer error: MPEG 'start code' seen in the input\n"; + } else if (isVPS(nal_unit_type)) { // Video parameter set (VPS) + saveCopyOfVPS(fTo, frameSize); + } else if (isSPS(nal_unit_type)) { // Sequence parameter set (SPS) + saveCopyOfSPS(fTo, frameSize); + } else if (isPPS(nal_unit_type)) { // Picture parameter set (PPS) + saveCopyOfPPS(fTo, frameSize); + } + + fPictureEndMarker = nalUnitEndsAccessUnit(nal_unit_type); + + // Finally, complete delivery to the client: + fFrameSize = fIncludeStartCodeInOutput ? (4+frameSize) : frameSize; + fNumTruncatedBytes = numTruncatedBytes; + fPresentationTime = presentationTime; + fDurationInMicroseconds = durationInMicroseconds; + afterGetting(this); +} + +Boolean H264or5VideoStreamDiscreteFramer::nalUnitEndsAccessUnit(u_int8_t nal_unit_type) { + // Check whether this NAL unit ends the current 'access unit' (basically, a video frame). + // Unfortunately, we can't do this reliably, because we don't yet know anything about the + // *next* NAL unit that we'll see. So, we guess this as best as we can, by assuming that + // if this NAL unit is a VCL NAL unit, then it ends the current 'access unit'. + // + // This will be wrong if you are streaming multiple 'slices' per picture. In that case, + // you can define a subclass that reimplements this virtual function to do the right thing. + + return isVCL(nal_unit_type); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/H264or5VideoStreamFramer.cpp b/src/big/mpp/middleware/src/live555/liveMedia/H264or5VideoStreamFramer.cpp new file mode 100644 index 000000000..072eb60e6 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/H264or5VideoStreamFramer.cpp @@ -0,0 +1,1229 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A filter that breaks up a H.264 or H.265 Video Elementary Stream into NAL units. +// Implementation + +#include "H264or5VideoStreamFramer.hh" +#include "MPEGVideoStreamParser.hh" +#include "BitVector.hh" +#include // for "gettimeofday()" + +////////// H264or5VideoStreamParser definition ////////// + +class H264or5VideoStreamParser: public MPEGVideoStreamParser { +public: + H264or5VideoStreamParser(int hNumber, H264or5VideoStreamFramer* usingSource, + FramedSource* inputSource, Boolean includeStartCodeInOutput); + virtual ~H264or5VideoStreamParser(); + +private: // redefined virtual functions: + virtual void flushInput(); + virtual unsigned parse(); + +private: + H264or5VideoStreamFramer* usingSource() { + return (H264or5VideoStreamFramer*)fUsingSource; + } + + Boolean isVPS(u_int8_t nal_unit_type) { return usingSource()->isVPS(nal_unit_type); } + Boolean isSPS(u_int8_t nal_unit_type) { return usingSource()->isSPS(nal_unit_type); } + Boolean isPPS(u_int8_t nal_unit_type) { return usingSource()->isPPS(nal_unit_type); } + Boolean isVCL(u_int8_t nal_unit_type) { return usingSource()->isVCL(nal_unit_type); } + Boolean isSEI(u_int8_t nal_unit_type); + Boolean isEOF(u_int8_t nal_unit_type); + Boolean usuallyBeginsAccessUnit(u_int8_t nal_unit_type); + + void removeEmulationBytes(u_int8_t* nalUnitCopy, unsigned maxSize, unsigned& nalUnitCopySize); + + void analyze_video_parameter_set_data(unsigned& num_units_in_tick, unsigned& time_scale); + void analyze_seq_parameter_set_data(unsigned& num_units_in_tick, unsigned& time_scale); + void profile_tier_level(BitVector& bv, unsigned max_sub_layers_minus1); + void analyze_vui_parameters(BitVector& bv, unsigned& num_units_in_tick, unsigned& time_scale); + void analyze_hrd_parameters(BitVector& bv); + void analyze_sei_data(u_int8_t nal_unit_type); + void analyze_sei_payload(unsigned payloadType, unsigned payloadSize, u_int8_t* payload); + +private: + int fHNumber; // 264 or 265 + unsigned fOutputStartCodeSize; + Boolean fHaveSeenFirstStartCode, fHaveSeenFirstByteOfNALUnit; + u_int8_t fFirstByteOfNALUnit; + double fParsedFrameRate; + // variables set & used in the specification: + unsigned cpb_removal_delay_length_minus1, dpb_output_delay_length_minus1; + Boolean CpbDpbDelaysPresentFlag, pic_struct_present_flag; + double DeltaTfiDivisor; +}; + + +////////// H264or5VideoStreamFramer implementation ////////// + +H264or5VideoStreamFramer +::H264or5VideoStreamFramer(int hNumber, UsageEnvironment& env, FramedSource* inputSource, + Boolean createParser, + Boolean includeStartCodeInOutput, Boolean insertAccessUnitDelimiters) + : MPEGVideoStreamFramer(env, inputSource), + fHNumber(hNumber), fIncludeStartCodeInOutput(includeStartCodeInOutput), + fInsertAccessUnitDelimiters(insertAccessUnitDelimiters), + fLastSeenVPS(NULL), fLastSeenVPSSize(0), + fLastSeenSPS(NULL), fLastSeenSPSSize(0), + fLastSeenPPS(NULL), fLastSeenPPSSize(0) { + fParser = createParser + ? new H264or5VideoStreamParser(hNumber, this, inputSource, includeStartCodeInOutput) + : NULL; + fFrameRate = 30.0; // We assume a frame rate of 30 fps, unless we learn otherwise (from parsing a VPS or SPS NAL unit) +} + +H264or5VideoStreamFramer::~H264or5VideoStreamFramer() { + delete[] fLastSeenPPS; + delete[] fLastSeenSPS; + delete[] fLastSeenVPS; +} + +#define VPS_MAX_SIZE 1000 // larger than the largest possible VPS (Video Parameter Set) NAL unit + +void H264or5VideoStreamFramer::saveCopyOfVPS(u_int8_t* from, unsigned size) { + if (from == NULL) return; + delete[] fLastSeenVPS; + fLastSeenVPS = new u_int8_t[size]; + memmove(fLastSeenVPS, from, size); + + fLastSeenVPSSize = size; +} + +#define SPS_MAX_SIZE 1000 // larger than the largest possible SPS (Sequence Parameter Set) NAL unit + +void H264or5VideoStreamFramer::saveCopyOfSPS(u_int8_t* from, unsigned size) { + if (from == NULL) return; + delete[] fLastSeenSPS; + fLastSeenSPS = new u_int8_t[size]; + memmove(fLastSeenSPS, from, size); + + fLastSeenSPSSize = size; +} + +void H264or5VideoStreamFramer::saveCopyOfPPS(u_int8_t* from, unsigned size) { + if (from == NULL) return; + delete[] fLastSeenPPS; + fLastSeenPPS = new u_int8_t[size]; + memmove(fLastSeenPPS, from, size); + + fLastSeenPPSSize = size; +} + +void H264or5VideoStreamFramer::setPresentationTime() { + if (fPresentationTimeBase.tv_sec == 0 && fPresentationTimeBase.tv_usec == 0) { + // Set to the current time: + gettimeofday(&fPresentationTimeBase, NULL); + fNextPresentationTime = fPresentationTimeBase; + } + fPresentationTime = fNextPresentationTime; +} + +Boolean H264or5VideoStreamFramer::isVPS(u_int8_t nal_unit_type) { + // VPS NAL units occur in H.265 only: + return fHNumber == 265 && nal_unit_type == 32; +} + +Boolean H264or5VideoStreamFramer::isSPS(u_int8_t nal_unit_type) { + return fHNumber == 264 ? nal_unit_type == 7 : nal_unit_type == 33; +} + +Boolean H264or5VideoStreamFramer::isPPS(u_int8_t nal_unit_type) { + return fHNumber == 264 ? nal_unit_type == 8 : nal_unit_type == 34; +} + +Boolean H264or5VideoStreamFramer::isVCL(u_int8_t nal_unit_type) { + return fHNumber == 264 + ? (nal_unit_type <= 5 && nal_unit_type > 0) + : (nal_unit_type <= 31); +} + +void H264or5VideoStreamFramer::doGetNextFrame() { + if (fInsertAccessUnitDelimiters && pictureEndMarker()) { + // Deliver an "access_unit_delimiter" NAL unit instead: + unsigned const startCodeSize = fIncludeStartCodeInOutput ? 4: 0; + unsigned const audNALSize = fHNumber == 264 ? 2 : 3; + + fFrameSize = startCodeSize + audNALSize; + if (fFrameSize > fMaxSize) { // there's no space + fNumTruncatedBytes = fFrameSize - fMaxSize; + fFrameSize = fMaxSize; + handleClosure(); + return; + } + + if (fIncludeStartCodeInOutput) { + *fTo++ = 0x00; *fTo++ = 0x00; *fTo++ = 0x00; *fTo++ = 0x01; + } + if (fHNumber == 264) { + *fTo++ = 9; // "Access unit delimiter" nal_unit_type + *fTo++ = 0xF0; // "primary_pic_type" (7); "rbsp_trailing_bits()" + } else { // H.265 + *fTo++ = 35<<1; // "Access unit delimiter" nal_unit_type + *fTo++ = 0; // "nuh_layer_id" (0); "nuh_temporal_id_plus1" (0) (Is this correct??) + *fTo++ = 0x50; // "pic_type" (2); "rbsp_trailing_bits()" (Is this correct??) + } + + pictureEndMarker() = False; // for next time + afterGetting(this); + } else { + // Do the normal delivery of a NAL unit from the parser: + MPEGVideoStreamFramer::doGetNextFrame(); + } +} + + +////////// H264or5VideoStreamParser implementation ////////// + +H264or5VideoStreamParser +::H264or5VideoStreamParser(int hNumber, H264or5VideoStreamFramer* usingSource, + FramedSource* inputSource, Boolean includeStartCodeInOutput) + : MPEGVideoStreamParser(usingSource, inputSource), + fHNumber(hNumber), fOutputStartCodeSize(includeStartCodeInOutput ? 4 : 0), fHaveSeenFirstStartCode(False), fHaveSeenFirstByteOfNALUnit(False), fParsedFrameRate(0.0), + cpb_removal_delay_length_minus1(23), dpb_output_delay_length_minus1(23), + CpbDpbDelaysPresentFlag(0), pic_struct_present_flag(0), + DeltaTfiDivisor(hNumber == 264 ? 2.0 : 1.0) { +} + +H264or5VideoStreamParser::~H264or5VideoStreamParser() { +} + +#define PREFIX_SEI_NUT 39 // for H.265 +#define SUFFIX_SEI_NUT 40 // for H.265 +Boolean H264or5VideoStreamParser::isSEI(u_int8_t nal_unit_type) { + return fHNumber == 264 + ? nal_unit_type == 6 + : (nal_unit_type == PREFIX_SEI_NUT || nal_unit_type == SUFFIX_SEI_NUT); +} + +Boolean H264or5VideoStreamParser::isEOF(u_int8_t nal_unit_type) { + // "end of sequence" or "end of (bit)stream" + return fHNumber == 264 + ? (nal_unit_type == 10 || nal_unit_type == 11) + : (nal_unit_type == 36 || nal_unit_type == 37); +} + +Boolean H264or5VideoStreamParser::usuallyBeginsAccessUnit(u_int8_t nal_unit_type) { + return fHNumber == 264 + ? (nal_unit_type >= 6 && nal_unit_type <= 9) || (nal_unit_type >= 14 && nal_unit_type <= 18) + : (nal_unit_type >= 32 && nal_unit_type <= 35) || (nal_unit_type == 39) + || (nal_unit_type >= 41 && nal_unit_type <= 44) + || (nal_unit_type >= 48 && nal_unit_type <= 55); +} + +void H264or5VideoStreamParser +::removeEmulationBytes(u_int8_t* nalUnitCopy, unsigned maxSize, unsigned& nalUnitCopySize) { + u_int8_t const* nalUnitOrig = fStartOfFrame + fOutputStartCodeSize; + unsigned const numBytesInNALunit = fTo - nalUnitOrig; + nalUnitCopySize + = removeH264or5EmulationBytes(nalUnitCopy, maxSize, nalUnitOrig, numBytesInNALunit); +} + +#ifdef DEBUG +char const* nal_unit_type_description_h264[32] = { + "Unspecified", //0 + "Coded slice of a non-IDR picture", //1 + "Coded slice data partition A", //2 + "Coded slice data partition B", //3 + "Coded slice data partition C", //4 + "Coded slice of an IDR picture", //5 + "Supplemental enhancement information (SEI)", //6 + "Sequence parameter set", //7 + "Picture parameter set", //8 + "Access unit delimiter", //9 + "End of sequence", //10 + "End of stream", //11 + "Filler data", //12 + "Sequence parameter set extension", //13 + "Prefix NAL unit", //14 + "Subset sequence parameter set", //15 + "Reserved", //16 + "Reserved", //17 + "Reserved", //18 + "Coded slice of an auxiliary coded picture without partitioning", //19 + "Coded slice extension", //20 + "Reserved", //21 + "Reserved", //22 + "Reserved", //23 + "Unspecified", //24 + "Unspecified", //25 + "Unspecified", //26 + "Unspecified", //27 + "Unspecified", //28 + "Unspecified", //29 + "Unspecified", //30 + "Unspecified" //31 +}; +char const* nal_unit_type_description_h265[64] = { + "Coded slice segment of a non-TSA, non-STSA trailing picture", //0 + "Coded slice segment of a non-TSA, non-STSA trailing picture", //1 + "Coded slice segment of a TSA picture", //2 + "Coded slice segment of a TSA picture", //3 + "Coded slice segment of a STSA picture", //4 + "Coded slice segment of a STSA picture", //5 + "Coded slice segment of a RADL picture", //6 + "Coded slice segment of a RADL picture", //7 + "Coded slice segment of a RASL picture", //8 + "Coded slice segment of a RASL picture", //9 + "Reserved", //10 + "Reserved", //11 + "Reserved", //12 + "Reserved", //13 + "Reserved", //14 + "Reserved", //15 + "Coded slice segment of a BLA picture", //16 + "Coded slice segment of a BLA picture", //17 + "Coded slice segment of a BLA picture", //18 + "Coded slice segment of an IDR picture", //19 + "Coded slice segment of an IDR picture", //20 + "Coded slice segment of a CRA picture", //21 + "Reserved", //22 + "Reserved", //23 + "Reserved", //24 + "Reserved", //25 + "Reserved", //26 + "Reserved", //27 + "Reserved", //28 + "Reserved", //29 + "Reserved", //30 + "Reserved", //31 + "Video parameter set", //32 + "Sequence parameter set", //33 + "Picture parameter set", //34 + "Access unit delimiter", //35 + "End of sequence", //36 + "End of bitstream", //37 + "Filler data", //38 + "Supplemental enhancement information (SEI)", //39 + "Supplemental enhancement information (SEI)", //40 + "Reserved", //41 + "Reserved", //42 + "Reserved", //43 + "Reserved", //44 + "Reserved", //45 + "Reserved", //46 + "Reserved", //47 + "Unspecified", //48 + "Unspecified", //49 + "Unspecified", //50 + "Unspecified", //51 + "Unspecified", //52 + "Unspecified", //53 + "Unspecified", //54 + "Unspecified", //55 + "Unspecified", //56 + "Unspecified", //57 + "Unspecified", //58 + "Unspecified", //59 + "Unspecified", //60 + "Unspecified", //61 + "Unspecified", //62 + "Unspecified", //63 +}; +#endif + +#ifdef DEBUG +static unsigned numDebugTabs = 1; +#define DEBUG_PRINT_TABS for (unsigned _i = 0; _i < numDebugTabs; ++_i) fprintf(stderr, "\t") +#define DEBUG_PRINT(x) do { DEBUG_PRINT_TABS; fprintf(stderr, "%s: %d\n", #x, x); } while (0) +#define DEBUG_STR(x) do { DEBUG_PRINT_TABS; fprintf(stderr, "%s\n", x); } while (0) +class DebugTab { +public: + DebugTab() {++numDebugTabs;} + ~DebugTab() {--numDebugTabs;} +}; +#define DEBUG_TAB DebugTab dummy +#else +#define DEBUG_PRINT(x) do {x = x;} while (0) + // Note: the "x=x;" statement is intended to eliminate "unused variable" compiler warning messages +#define DEBUG_STR(x) do {} while (0) +#define DEBUG_TAB do {} while (0) +#endif + +void H264or5VideoStreamParser::profile_tier_level(BitVector& bv, unsigned max_sub_layers_minus1) { + bv.skipBits(96); + + unsigned i; + Boolean sub_layer_profile_present_flag[7], sub_layer_level_present_flag[7]; + for (i = 0; i < max_sub_layers_minus1; ++i) { + sub_layer_profile_present_flag[i] = bv.get1BitBoolean(); + sub_layer_level_present_flag[i] = bv.get1BitBoolean(); + } + if (max_sub_layers_minus1 > 0) { + bv.skipBits(2*(8-max_sub_layers_minus1)); // reserved_zero_2bits + } + for (i = 0; i < max_sub_layers_minus1; ++i) { + if (sub_layer_profile_present_flag[i]) { + bv.skipBits(88); + } + if (sub_layer_level_present_flag[i]) { + bv.skipBits(8); // sub_layer_level_idc[i] + } + } +} + +void H264or5VideoStreamParser +::analyze_vui_parameters(BitVector& bv, + unsigned& num_units_in_tick, unsigned& time_scale) { + Boolean aspect_ratio_info_present_flag = bv.get1BitBoolean(); + DEBUG_PRINT(aspect_ratio_info_present_flag); + if (aspect_ratio_info_present_flag) { + DEBUG_TAB; + unsigned aspect_ratio_idc = bv.getBits(8); + DEBUG_PRINT(aspect_ratio_idc); + if (aspect_ratio_idc == 255/*Extended_SAR*/) { + bv.skipBits(32); // sar_width; sar_height + } + } + Boolean overscan_info_present_flag = bv.get1BitBoolean(); + DEBUG_PRINT(overscan_info_present_flag); + if (overscan_info_present_flag) { + bv.skipBits(1); // overscan_appropriate_flag + } + Boolean video_signal_type_present_flag = bv.get1BitBoolean(); + DEBUG_PRINT(video_signal_type_present_flag); + if (video_signal_type_present_flag) { + DEBUG_TAB; + bv.skipBits(4); // video_format; video_full_range_flag + Boolean colour_description_present_flag = bv.get1BitBoolean(); + DEBUG_PRINT(colour_description_present_flag); + if (colour_description_present_flag) { + bv.skipBits(24); // colour_primaries; transfer_characteristics; matrix_coefficients + } + } + Boolean chroma_loc_info_present_flag = bv.get1BitBoolean(); + DEBUG_PRINT(chroma_loc_info_present_flag); + if (chroma_loc_info_present_flag) { + (void)bv.get_expGolomb(); // chroma_sample_loc_type_top_field + (void)bv.get_expGolomb(); // chroma_sample_loc_type_bottom_field + } + if (fHNumber == 265) { + bv.skipBits(2); // neutral_chroma_indication_flag, field_seq_flag + Boolean frame_field_info_present_flag = bv.get1BitBoolean(); + DEBUG_PRINT(frame_field_info_present_flag); + pic_struct_present_flag = frame_field_info_present_flag; // hack to make H.265 like H.264 + Boolean default_display_window_flag = bv.get1BitBoolean(); + DEBUG_PRINT(default_display_window_flag); + if (default_display_window_flag) { + (void)bv.get_expGolomb(); // def_disp_win_left_offset + (void)bv.get_expGolomb(); // def_disp_win_right_offset + (void)bv.get_expGolomb(); // def_disp_win_top_offset + (void)bv.get_expGolomb(); // def_disp_win_bottom_offset + } + } + Boolean timing_info_present_flag = bv.get1BitBoolean(); + DEBUG_PRINT(timing_info_present_flag); + if (timing_info_present_flag) { + DEBUG_TAB; + num_units_in_tick = bv.getBits(32); + DEBUG_PRINT(num_units_in_tick); + time_scale = bv.getBits(32); + DEBUG_PRINT(time_scale); + if (fHNumber == 264) { + Boolean fixed_frame_rate_flag = bv.get1BitBoolean(); + DEBUG_PRINT(fixed_frame_rate_flag); + } else { // 265 + Boolean vui_poc_proportional_to_timing_flag = bv.get1BitBoolean(); + DEBUG_PRINT(vui_poc_proportional_to_timing_flag); + if (vui_poc_proportional_to_timing_flag) { + unsigned vui_num_ticks_poc_diff_one_minus1 = bv.get_expGolomb(); + DEBUG_PRINT(vui_num_ticks_poc_diff_one_minus1); + } + return; // For H.265, don't bother parsing any more of this ##### + } + } + // The following is H.264 only: ##### + Boolean nal_hrd_parameters_present_flag = bv.get1BitBoolean(); + DEBUG_PRINT(nal_hrd_parameters_present_flag); + if (nal_hrd_parameters_present_flag) analyze_hrd_parameters(bv); + Boolean vcl_hrd_parameters_present_flag = bv.get1BitBoolean(); + DEBUG_PRINT(vcl_hrd_parameters_present_flag); + if (vcl_hrd_parameters_present_flag) analyze_hrd_parameters(bv); + CpbDpbDelaysPresentFlag = nal_hrd_parameters_present_flag || vcl_hrd_parameters_present_flag; + if (CpbDpbDelaysPresentFlag) { + bv.skipBits(1); // low_delay_hrd_flag + } + pic_struct_present_flag = bv.get1BitBoolean(); + DEBUG_PRINT(pic_struct_present_flag); +} + +void H264or5VideoStreamParser::analyze_hrd_parameters(BitVector& bv) { + DEBUG_TAB; + unsigned cpb_cnt_minus1 = bv.get_expGolomb(); + DEBUG_PRINT(cpb_cnt_minus1); + unsigned bit_rate_scale = bv.getBits(4); + DEBUG_PRINT(bit_rate_scale); + unsigned cpb_size_scale = bv.getBits(4); + DEBUG_PRINT(cpb_size_scale); + for (unsigned SchedSelIdx = 0; SchedSelIdx <= cpb_cnt_minus1; ++SchedSelIdx) { + DEBUG_TAB; + DEBUG_PRINT(SchedSelIdx); + unsigned bit_rate_value_minus1 = bv.get_expGolomb(); + DEBUG_PRINT(bit_rate_value_minus1); + unsigned cpb_size_value_minus1 = bv.get_expGolomb(); + DEBUG_PRINT(cpb_size_value_minus1); + Boolean cbr_flag = bv.get1BitBoolean(); + DEBUG_PRINT(cbr_flag); + } + unsigned initial_cpb_removal_delay_length_minus1 = bv.getBits(5); + DEBUG_PRINT(initial_cpb_removal_delay_length_minus1); + cpb_removal_delay_length_minus1 = bv.getBits(5); + DEBUG_PRINT(cpb_removal_delay_length_minus1); + dpb_output_delay_length_minus1 = bv.getBits(5); + DEBUG_PRINT(dpb_output_delay_length_minus1); + unsigned time_offset_length = bv.getBits(5); + DEBUG_PRINT(time_offset_length); +} + +void H264or5VideoStreamParser +::analyze_video_parameter_set_data(unsigned& num_units_in_tick, unsigned& time_scale) { + num_units_in_tick = time_scale = 0; // default values + + // Begin by making a copy of the NAL unit data, removing any 'emulation prevention' bytes: + u_int8_t vps[VPS_MAX_SIZE]; + unsigned vpsSize; + removeEmulationBytes(vps, sizeof vps, vpsSize); + + BitVector bv(vps, 0, 8*vpsSize); + + // Assert: fHNumber == 265 (because this function is called only when parsing H.265) + unsigned i; + + bv.skipBits(28); // nal_unit_header, vps_video_parameter_set_id, vps_reserved_three_2bits, vps_max_layers_minus1 + unsigned vps_max_sub_layers_minus1 = bv.getBits(3); + DEBUG_PRINT(vps_max_sub_layers_minus1); + bv.skipBits(17); // vps_temporal_id_nesting_flag, vps_reserved_0xffff_16bits + profile_tier_level(bv, vps_max_sub_layers_minus1); + Boolean vps_sub_layer_ordering_info_present_flag = bv.get1BitBoolean(); + DEBUG_PRINT(vps_sub_layer_ordering_info_present_flag); + for (i = vps_sub_layer_ordering_info_present_flag ? 0 : vps_max_sub_layers_minus1; + i <= vps_max_sub_layers_minus1; ++i) { + (void)bv.get_expGolomb(); // vps_max_dec_pic_buffering_minus1[i] + (void)bv.get_expGolomb(); // vps_max_num_reorder_pics[i] + (void)bv.get_expGolomb(); // vps_max_latency_increase_plus1[i] + } + unsigned vps_max_layer_id = bv.getBits(6); + DEBUG_PRINT(vps_max_layer_id); + unsigned vps_num_layer_sets_minus1 = bv.get_expGolomb(); + DEBUG_PRINT(vps_num_layer_sets_minus1); + for (i = 1; i <= vps_num_layer_sets_minus1; ++i) { + bv.skipBits(vps_max_layer_id+1); // layer_id_included_flag[i][0..vps_max_layer_id] + } + Boolean vps_timing_info_present_flag = bv.get1BitBoolean(); + DEBUG_PRINT(vps_timing_info_present_flag); + if (vps_timing_info_present_flag) { + DEBUG_TAB; + num_units_in_tick = bv.getBits(32); + DEBUG_PRINT(num_units_in_tick); + time_scale = bv.getBits(32); + DEBUG_PRINT(time_scale); + Boolean vps_poc_proportional_to_timing_flag = bv.get1BitBoolean(); + DEBUG_PRINT(vps_poc_proportional_to_timing_flag); + if (vps_poc_proportional_to_timing_flag) { + unsigned vps_num_ticks_poc_diff_one_minus1 = bv.get_expGolomb(); + DEBUG_PRINT(vps_num_ticks_poc_diff_one_minus1); + } + } + Boolean vps_extension_flag = bv.get1BitBoolean(); + DEBUG_PRINT(vps_extension_flag); +} + +void H264or5VideoStreamParser +::analyze_seq_parameter_set_data(unsigned& num_units_in_tick, unsigned& time_scale) { + num_units_in_tick = time_scale = 0; // default values + + // Begin by making a copy of the NAL unit data, removing any 'emulation prevention' bytes: + u_int8_t sps[SPS_MAX_SIZE]; + unsigned spsSize; + removeEmulationBytes(sps, sizeof sps, spsSize); + + BitVector bv(sps, 0, 8*spsSize); + + if (fHNumber == 264) { + bv.skipBits(8); // forbidden_zero_bit; nal_ref_idc; nal_unit_type + unsigned profile_idc = bv.getBits(8); + DEBUG_PRINT(profile_idc); + unsigned constraint_setN_flag = bv.getBits(8); // also "reserved_zero_2bits" at end + DEBUG_PRINT(constraint_setN_flag); + unsigned level_idc = bv.getBits(8); + DEBUG_PRINT(level_idc); + unsigned seq_parameter_set_id = bv.get_expGolomb(); + DEBUG_PRINT(seq_parameter_set_id); + if (profile_idc == 100 || profile_idc == 110 || profile_idc == 122 || profile_idc == 244 || profile_idc == 44 || profile_idc == 83 || profile_idc == 86 || profile_idc == 118 || profile_idc == 128 ) { + DEBUG_TAB; + unsigned chroma_format_idc = bv.get_expGolomb(); + DEBUG_PRINT(chroma_format_idc); + if (chroma_format_idc == 3) { + DEBUG_TAB; + Boolean separate_colour_plane_flag = bv.get1BitBoolean(); + DEBUG_PRINT(separate_colour_plane_flag); + } + (void)bv.get_expGolomb(); // bit_depth_luma_minus8 + (void)bv.get_expGolomb(); // bit_depth_chroma_minus8 + bv.skipBits(1); // qpprime_y_zero_transform_bypass_flag + Boolean seq_scaling_matrix_present_flag = bv.get1BitBoolean(); + DEBUG_PRINT(seq_scaling_matrix_present_flag); + if (seq_scaling_matrix_present_flag) { + for (int i = 0; i < ((chroma_format_idc != 3) ? 8 : 12); ++i) { + DEBUG_TAB; + DEBUG_PRINT(i); + Boolean seq_scaling_list_present_flag = bv.get1BitBoolean(); + DEBUG_PRINT(seq_scaling_list_present_flag); + if (seq_scaling_list_present_flag) { + DEBUG_TAB; + unsigned sizeOfScalingList = i < 6 ? 16 : 64; + unsigned lastScale = 8; + unsigned nextScale = 8; + for (unsigned j = 0; j < sizeOfScalingList; ++j) { + DEBUG_TAB; + DEBUG_PRINT(j); + DEBUG_PRINT(nextScale); + if (nextScale != 0) { + DEBUG_TAB; + int delta_scale = bv.get_expGolombSigned(); + DEBUG_PRINT(delta_scale); + nextScale = (lastScale + delta_scale + 256) % 256; + } + lastScale = (nextScale == 0) ? lastScale : nextScale; + DEBUG_PRINT(lastScale); + } + } + } + } + } + unsigned log2_max_frame_num_minus4 = bv.get_expGolomb(); + DEBUG_PRINT(log2_max_frame_num_minus4); + unsigned pic_order_cnt_type = bv.get_expGolomb(); + DEBUG_PRINT(pic_order_cnt_type); + if (pic_order_cnt_type == 0) { + DEBUG_TAB; + unsigned log2_max_pic_order_cnt_lsb_minus4 = bv.get_expGolomb(); + DEBUG_PRINT(log2_max_pic_order_cnt_lsb_minus4); + } else if (pic_order_cnt_type == 1) { + DEBUG_TAB; + bv.skipBits(1); // delta_pic_order_always_zero_flag + (void)bv.get_expGolombSigned(); // offset_for_non_ref_pic + (void)bv.get_expGolombSigned(); // offset_for_top_to_bottom_field + unsigned num_ref_frames_in_pic_order_cnt_cycle = bv.get_expGolomb(); + DEBUG_PRINT(num_ref_frames_in_pic_order_cnt_cycle); + for (unsigned i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; ++i) { + (void)bv.get_expGolombSigned(); // offset_for_ref_frame[i] + } + } + unsigned max_num_ref_frames = bv.get_expGolomb(); + DEBUG_PRINT(max_num_ref_frames); + Boolean gaps_in_frame_num_value_allowed_flag = bv.get1BitBoolean(); + DEBUG_PRINT(gaps_in_frame_num_value_allowed_flag); + unsigned pic_width_in_mbs_minus1 = bv.get_expGolomb(); + DEBUG_PRINT(pic_width_in_mbs_minus1); + unsigned pic_height_in_map_units_minus1 = bv.get_expGolomb(); + DEBUG_PRINT(pic_height_in_map_units_minus1); + Boolean frame_mbs_only_flag = bv.get1BitBoolean(); + DEBUG_PRINT(frame_mbs_only_flag); + if (!frame_mbs_only_flag) { + bv.skipBits(1); // mb_adaptive_frame_field_flag + } + bv.skipBits(1); // direct_8x8_inference_flag + Boolean frame_cropping_flag = bv.get1BitBoolean(); + DEBUG_PRINT(frame_cropping_flag); + if (frame_cropping_flag) { + (void)bv.get_expGolomb(); // frame_crop_left_offset + (void)bv.get_expGolomb(); // frame_crop_right_offset + (void)bv.get_expGolomb(); // frame_crop_top_offset + (void)bv.get_expGolomb(); // frame_crop_bottom_offset + } + Boolean vui_parameters_present_flag = bv.get1BitBoolean(); + DEBUG_PRINT(vui_parameters_present_flag); + if (vui_parameters_present_flag) { + DEBUG_TAB; + analyze_vui_parameters(bv, num_units_in_tick, time_scale); + } + } else { // 265 + unsigned i; + + bv.skipBits(16); // nal_unit_header + bv.skipBits(4); // sps_video_parameter_set_id + unsigned sps_max_sub_layers_minus1 = bv.getBits(3); + DEBUG_PRINT(sps_max_sub_layers_minus1); + bv.skipBits(1); // sps_temporal_id_nesting_flag + profile_tier_level(bv, sps_max_sub_layers_minus1); + (void)bv.get_expGolomb(); // sps_seq_parameter_set_id + unsigned chroma_format_idc = bv.get_expGolomb(); + DEBUG_PRINT(chroma_format_idc); + if (chroma_format_idc == 3) bv.skipBits(1); // separate_colour_plane_flag + unsigned pic_width_in_luma_samples = bv.get_expGolomb(); + DEBUG_PRINT(pic_width_in_luma_samples); + unsigned pic_height_in_luma_samples = bv.get_expGolomb(); + DEBUG_PRINT(pic_height_in_luma_samples); + Boolean conformance_window_flag = bv.get1BitBoolean(); + DEBUG_PRINT(conformance_window_flag); + if (conformance_window_flag) { + DEBUG_TAB; + unsigned conf_win_left_offset = bv.get_expGolomb(); + DEBUG_PRINT(conf_win_left_offset); + unsigned conf_win_right_offset = bv.get_expGolomb(); + DEBUG_PRINT(conf_win_right_offset); + unsigned conf_win_top_offset = bv.get_expGolomb(); + DEBUG_PRINT(conf_win_top_offset); + unsigned conf_win_bottom_offset = bv.get_expGolomb(); + DEBUG_PRINT(conf_win_bottom_offset); + } + (void)bv.get_expGolomb(); // bit_depth_luma_minus8 + (void)bv.get_expGolomb(); // bit_depth_chroma_minus8 + unsigned log2_max_pic_order_cnt_lsb_minus4 = bv.get_expGolomb(); + Boolean sps_sub_layer_ordering_info_present_flag = bv.get1BitBoolean(); + DEBUG_PRINT(sps_sub_layer_ordering_info_present_flag); + for (i = (sps_sub_layer_ordering_info_present_flag ? 0 : sps_max_sub_layers_minus1); + i <= sps_max_sub_layers_minus1; ++i) { + (void)bv.get_expGolomb(); // sps_max_dec_pic_buffering_minus1[i] + (void)bv.get_expGolomb(); // sps_max_num_reorder_pics[i] + (void)bv.get_expGolomb(); // sps_max_latency_increase[i] + } + (void)bv.get_expGolomb(); // log2_min_luma_coding_block_size_minus3 + (void)bv.get_expGolomb(); // log2_diff_max_min_luma_coding_block_size + (void)bv.get_expGolomb(); // log2_min_transform_block_size_minus2 + (void)bv.get_expGolomb(); // log2_diff_max_min_transform_block_size + (void)bv.get_expGolomb(); // max_transform_hierarchy_depth_inter + (void)bv.get_expGolomb(); // max_transform_hierarchy_depth_intra + Boolean scaling_list_enabled_flag = bv.get1BitBoolean(); + DEBUG_PRINT(scaling_list_enabled_flag); + if (scaling_list_enabled_flag) { + DEBUG_TAB; + Boolean sps_scaling_list_data_present_flag = bv.get1BitBoolean(); + DEBUG_PRINT(sps_scaling_list_data_present_flag); + if (sps_scaling_list_data_present_flag) { + // scaling_list_data() + DEBUG_TAB; + for (unsigned sizeId = 0; sizeId < 4; ++sizeId) { + DEBUG_PRINT(sizeId); + for (unsigned matrixId = 0; matrixId < (sizeId == 3 ? 2 : 6); ++matrixId) { + DEBUG_TAB; + DEBUG_PRINT(matrixId); + Boolean scaling_list_pred_mode_flag = bv.get1BitBoolean(); + DEBUG_PRINT(scaling_list_pred_mode_flag); + if (!scaling_list_pred_mode_flag) { + (void)bv.get_expGolomb(); // scaling_list_pred_matrix_id_delta[sizeId][matrixId] + } else { + unsigned const c = 1 << (4+(sizeId<<1)); + unsigned coefNum = c < 64 ? c : 64; + if (sizeId > 1) { + (void)bv.get_expGolomb(); // scaling_list_dc_coef_minus8[sizeId][matrixId] + } + for (i = 0; i < coefNum; ++i) { + (void)bv.get_expGolomb(); // scaling_list_delta_coef + } + } + } + } + } + } + bv.skipBits(2); // amp_enabled_flag, sample_adaptive_offset_enabled_flag + Boolean pcm_enabled_flag = bv.get1BitBoolean(); + DEBUG_PRINT(pcm_enabled_flag); + if (pcm_enabled_flag) { + bv.skipBits(8); // pcm_sample_bit_depth_luma_minus1, pcm_sample_bit_depth_chroma_minus1 + (void)bv.get_expGolomb(); // log2_min_pcm_luma_coding_block_size_minus3 + (void)bv.get_expGolomb(); // log2_diff_max_min_pcm_luma_coding_block_size + bv.skipBits(1); // pcm_loop_filter_disabled_flag + } + unsigned num_short_term_ref_pic_sets = bv.get_expGolomb(); + DEBUG_PRINT(num_short_term_ref_pic_sets); + unsigned num_negative_pics = 0, prev_num_negative_pics = 0; + unsigned num_positive_pics = 0, prev_num_positive_pics = 0; + for (i = 0; i < num_short_term_ref_pic_sets; ++i) { + // short_term_ref_pic_set(i): + DEBUG_TAB; + DEBUG_PRINT(i); + Boolean inter_ref_pic_set_prediction_flag = False; + if (i != 0) { + inter_ref_pic_set_prediction_flag = bv.get1BitBoolean(); + } + DEBUG_PRINT(inter_ref_pic_set_prediction_flag); + if (inter_ref_pic_set_prediction_flag) { + DEBUG_TAB; + if (i == num_short_term_ref_pic_sets) { + // This can't happen here, but it's in the spec, so we include it for completeness + (void)bv.get_expGolomb(); // delta_idx_minus1 + } + bv.skipBits(1); // delta_rps_sign + (void)bv.get_expGolomb(); // abs_delta_rps_minus1 + unsigned NumDeltaPocs = prev_num_negative_pics + prev_num_positive_pics; // correct??? + for (unsigned j = 0; j < NumDeltaPocs; ++j) { + DEBUG_PRINT(j); + Boolean used_by_curr_pic_flag = bv.get1BitBoolean(); + DEBUG_PRINT(used_by_curr_pic_flag); + if (!used_by_curr_pic_flag) bv.skipBits(1); // use_delta_flag[j] + } + } else { + prev_num_negative_pics = num_negative_pics; + num_negative_pics = bv.get_expGolomb(); + DEBUG_PRINT(num_negative_pics); + prev_num_positive_pics = num_positive_pics; + num_positive_pics = bv.get_expGolomb(); + DEBUG_PRINT(num_positive_pics); + unsigned k; + for (k = 0; k < num_negative_pics; ++k) { + (void)bv.get_expGolomb(); // delta_poc_s0_minus1[k] + bv.skipBits(1); // used_by_curr_pic_s0_flag[k] + } + for (k = 0; k < num_positive_pics; ++k) { + (void)bv.get_expGolomb(); // delta_poc_s1_minus1[k] + bv.skipBits(1); // used_by_curr_pic_s1_flag[k] + } + } + } + Boolean long_term_ref_pics_present_flag = bv.get1BitBoolean(); + DEBUG_PRINT(long_term_ref_pics_present_flag); + if (long_term_ref_pics_present_flag) { + DEBUG_TAB; + unsigned num_long_term_ref_pics_sps = bv.get_expGolomb(); + DEBUG_PRINT(num_long_term_ref_pics_sps); + for (i = 0; i < num_long_term_ref_pics_sps; ++i) { + bv.skipBits(log2_max_pic_order_cnt_lsb_minus4); // lt_ref_pic_poc_lsb_sps[i] + bv.skipBits(1); // used_by_curr_pic_lt_sps_flag[1] + } + } + bv.skipBits(2); // sps_temporal_mvp_enabled_flag, strong_intra_smoothing_enabled_flag + Boolean vui_parameters_present_flag = bv.get1BitBoolean(); + DEBUG_PRINT(vui_parameters_present_flag); + if (vui_parameters_present_flag) { + DEBUG_TAB; + analyze_vui_parameters(bv, num_units_in_tick, time_scale); + } + Boolean sps_extension_flag = bv.get1BitBoolean(); + DEBUG_PRINT(sps_extension_flag); + } +} + +#define SEI_MAX_SIZE 5000 // larger than the largest possible SEI NAL unit + +#ifdef DEBUG +#define MAX_SEI_PAYLOAD_TYPE_DESCRIPTION_H264 46 +char const* sei_payloadType_description_h264[MAX_SEI_PAYLOAD_TYPE_DESCRIPTION_H264+1] = { + "buffering_period", //0 + "pic_timing", //1 + "pan_scan_rect", //2 + "filler_payload", //3 + "user_data_registered_itu_t_t35", //4 + "user_data_unregistered", //5 + "recovery_point", //6 + "dec_ref_pic_marking_repetition", //7 + "spare_pic", //8 + "scene_info", //9 + "sub_seq_info", //10 + "sub_seq_layer_characteristics", //11 + "sub_seq_characteristics", //12 + "full_frame_freeze", //13 + "full_frame_freeze_release", //14 + "full_frame_snapshot", //15 + "progressive_refinement_segment_start", //16 + "progressive_refinement_segment_end", //17 + "motion_constrained_slice_group_set", //18 + "film_grain_characteristics", //19 + "deblocking_filter_display_preference", //20 + "stereo_video_info", //21 + "post_filter_hint", //22 + "tone_mapping_info", //23 + "scalability_info", //24 + "sub_pic_scalable_layer", //25 + "non_required_layer_rep", //26 + "priority_layer_info", //27 + "layers_not_present", //28 + "layer_dependency_change", //29 + "scalable_nesting", //30 + "base_layer_temporal_hrd", //31 + "quality_layer_integrity_check", //32 + "redundant_pic_property", //33 + "tl0_dep_rep_index", //34 + "tl_switching_point", //35 + "parallel_decoding_info", //36 + "mvc_scalable_nesting", //37 + "view_scalability_info", //38 + "multiview_scene_info", //39 + "multiview_acquisition_info", //40 + "non_required_view_component", //41 + "view_dependency_change", //42 + "operation_points_not_present", //43 + "base_view_temporal_hrd", //44 + "frame_packing_arrangement", //45 + "reserved_sei_message" // 46 or higher +}; +#endif + +void H264or5VideoStreamParser::analyze_sei_data(u_int8_t nal_unit_type) { + // Begin by making a copy of the NAL unit data, removing any 'emulation prevention' bytes: + u_int8_t sei[SEI_MAX_SIZE]; + unsigned seiSize; + removeEmulationBytes(sei, sizeof sei, seiSize); + + unsigned j = 1; // skip the initial byte (forbidden_zero_bit; nal_ref_idc; nal_unit_type); we've already seen it + while (j < seiSize) { + unsigned payloadType = 0; + do { + payloadType += sei[j]; + } while (sei[j++] == 255 && j < seiSize); + if (j >= seiSize) break; + + unsigned payloadSize = 0; + do { + payloadSize += sei[j]; + } while (sei[j++] == 255 && j < seiSize); + if (j >= seiSize) break; + +#ifdef DEBUG + char const* description; + if (fHNumber == 264) { + unsigned descriptionNum = payloadType <= MAX_SEI_PAYLOAD_TYPE_DESCRIPTION_H264 + ? payloadType : MAX_SEI_PAYLOAD_TYPE_DESCRIPTION_H264; + description = sei_payloadType_description_h264[descriptionNum]; + } else { // 265 + description = + payloadType == 3 ? "filler_payload" : + payloadType == 4 ? "user_data_registered_itu_t_t35" : + payloadType == 5 ? "user_data_unregistered" : + payloadType == 17 ? "progressive_refinement_segment_end" : + payloadType == 22 ? "post_filter_hint" : + (payloadType == 132 && nal_unit_type == SUFFIX_SEI_NUT) ? "decoded_picture_hash" : + nal_unit_type == SUFFIX_SEI_NUT ? "reserved_sei_message" : + payloadType == 0 ? "buffering_period" : + payloadType == 1 ? "pic_timing" : + payloadType == 2 ? "pan_scan_rect" : + payloadType == 6 ? "recovery_point" : + payloadType == 9 ? "scene_info" : + payloadType == 15 ? "picture_snapshot" : + payloadType == 16 ? "progressive_refinement_segment_start" : + payloadType == 19 ? "film_grain_characteristics" : + payloadType == 23 ? "tone_mapping_info" : + payloadType == 45 ? "frame_packing_arrangement" : + payloadType == 47 ? "display_orientation" : + payloadType == 128 ? "structure_of_pictures_info" : + payloadType == 129 ? "active_parameter_sets" : + payloadType == 130 ? "decoding_unit_info" : + payloadType == 131 ? "temporal_sub_layer_zero_index" : + payloadType == 133 ? "scalable_nesting" : + payloadType == 134 ? "region_refresh_info" : "reserved_sei_message"; + } + fprintf(stderr, "\tpayloadType %d (\"%s\"); payloadSize %d\n", payloadType, description, payloadSize); +#endif + + analyze_sei_payload(payloadType, payloadSize, &sei[j]); + j += payloadSize; + } +} + +void H264or5VideoStreamParser +::analyze_sei_payload(unsigned payloadType, unsigned payloadSize, u_int8_t* payload) { + if (payloadType == 1/* pic_timing, for both H.264 and H.265 */) { + BitVector bv(payload, 0, 8*payloadSize); + + DEBUG_TAB; + if (CpbDpbDelaysPresentFlag) { + unsigned cpb_removal_delay = bv.getBits(cpb_removal_delay_length_minus1 + 1); + DEBUG_PRINT(cpb_removal_delay); + unsigned dpb_output_delay = bv.getBits(dpb_output_delay_length_minus1 + 1); + DEBUG_PRINT(dpb_output_delay); + } + double prevDeltaTfiDivisor = DeltaTfiDivisor; + if (pic_struct_present_flag) { + unsigned pic_struct = bv.getBits(4); + DEBUG_PRINT(pic_struct); + // Use this to set "DeltaTfiDivisor" (which is used to compute the frame rate): + if (fHNumber == 264) { + DeltaTfiDivisor = + pic_struct == 0 ? 2.0 : + pic_struct <= 2 ? 1.0 : + pic_struct <= 4 ? 2.0 : + pic_struct <= 6 ? 3.0 : + pic_struct == 7 ? 4.0 : + pic_struct == 8 ? 6.0 : + 2.0; + } else { // H.265 + DeltaTfiDivisor = + pic_struct == 0 ? 2.0 : + pic_struct <= 2 ? 1.0 : + pic_struct <= 4 ? 2.0 : + pic_struct <= 6 ? 3.0 : + pic_struct == 7 ? 2.0 : + pic_struct == 8 ? 3.0 : + pic_struct <= 12 ? 1.0 : + 2.0; + } + } else { + if (fHNumber == 264) { + // Need to get field_pic_flag from slice_header to set this properly! ##### + } else { // H.265 + DeltaTfiDivisor = 1.0; + } + } + // If "DeltaTfiDivisor" has changed, and we've already computed the frame rate, then + // adjust it, based on the new value of "DeltaTfiDivisor": + if (DeltaTfiDivisor != prevDeltaTfiDivisor && fParsedFrameRate != 0.0) { + usingSource()->fFrameRate = fParsedFrameRate + = fParsedFrameRate*(prevDeltaTfiDivisor/DeltaTfiDivisor); +#ifdef DEBUG + fprintf(stderr, "Changed frame rate to %f fps\n", usingSource()->fFrameRate); +#endif + } + // Ignore the rest of the payload (timestamps) for now... ##### + } +} + +void H264or5VideoStreamParser::flushInput() { + fHaveSeenFirstStartCode = False; + fHaveSeenFirstByteOfNALUnit = False; + + StreamParser::flushInput(); +} + +unsigned H264or5VideoStreamParser::parse() { + try { + // The stream must start with a 0x00000001: + if (!fHaveSeenFirstStartCode) { + // Skip over any input bytes that precede the first 0x00000001: + u_int32_t first4Bytes; + while ((first4Bytes = test4Bytes()) != 0x00000001) { + get1Byte(); setParseState(); // ensures that we progress over bad data + } + skipBytes(4); // skip this initial code + + setParseState(); + fHaveSeenFirstStartCode = True; // from now on + } + + if (fOutputStartCodeSize > 0 && curFrameSize() == 0 && !haveSeenEOF()) { + // Include a start code in the output: + save4Bytes(0x00000001); + } + + // Then save everything up until the next 0x00000001 (4 bytes) or 0x000001 (3 bytes), or we hit EOF. + // Also make note of the first byte, because it contains the "nal_unit_type": + if (haveSeenEOF()) { + // We hit EOF the last time that we tried to parse this data, so we know that any remaining unparsed data + // forms a complete NAL unit, and that there's no 'start code' at the end: + unsigned remainingDataSize = totNumValidBytes() - curOffset(); +#ifdef DEBUG + unsigned const trailingNALUnitSize = remainingDataSize; +#endif + while (remainingDataSize > 0) { + u_int8_t nextByte = get1Byte(); + if (!fHaveSeenFirstByteOfNALUnit) { + fFirstByteOfNALUnit = nextByte; + fHaveSeenFirstByteOfNALUnit = True; + } + saveByte(nextByte); + --remainingDataSize; + } + +#ifdef DEBUG + if (fHNumber == 264) { + u_int8_t nal_ref_idc = (fFirstByteOfNALUnit&0x60)>>5; + u_int8_t nal_unit_type = fFirstByteOfNALUnit&0x1F; + fprintf(stderr, "Parsed trailing %d-byte NAL-unit (nal_ref_idc: %d, nal_unit_type: %d (\"%s\"))\n", + trailingNALUnitSize, nal_ref_idc, nal_unit_type, nal_unit_type_description_h264[nal_unit_type]); + } else { // 265 + u_int8_t nal_unit_type = (fFirstByteOfNALUnit&0x7E)>>1; + fprintf(stderr, "Parsed trailing %d-byte NAL-unit (nal_unit_type: %d (\"%s\"))\n", + trailingNALUnitSize, nal_unit_type, nal_unit_type_description_h265[nal_unit_type]); + } +#endif + + (void)get1Byte(); // forces another read, which will cause EOF to get handled for real this time + return 0; + } else { + u_int32_t next4Bytes = test4Bytes(); + if (!fHaveSeenFirstByteOfNALUnit) { + fFirstByteOfNALUnit = next4Bytes>>24; + fHaveSeenFirstByteOfNALUnit = True; + } + while (next4Bytes != 0x00000001 && (next4Bytes&0xFFFFFF00) != 0x00000100) { + // We save at least some of "next4Bytes". + if ((unsigned)(next4Bytes&0xFF) > 1) { + // Common case: 0x00000001 or 0x000001 definitely doesn't begin anywhere in "next4Bytes", so we save all of it: + save4Bytes(next4Bytes); + skipBytes(4); + } else { + // Save the first byte, and continue testing the rest: + saveByte(next4Bytes>>24); + skipBytes(1); + } + setParseState(); // ensures forward progress + next4Bytes = test4Bytes(); + } + // Assert: next4Bytes starts with 0x00000001 or 0x000001, and we've saved all previous bytes (forming a complete NAL unit). + // Skip over these remaining bytes, up until the start of the next NAL unit: + if (next4Bytes == 0x00000001) { + skipBytes(4); + } else { + skipBytes(3); + } + } + + fHaveSeenFirstByteOfNALUnit = False; // for the next NAL unit that we'll parse + u_int8_t nal_unit_type; + if (fHNumber == 264) { + nal_unit_type = fFirstByteOfNALUnit&0x1F; +#ifdef DEBUG + u_int8_t nal_ref_idc = (fFirstByteOfNALUnit&0x60)>>5; + fprintf(stderr, "Parsed %d-byte NAL-unit (nal_ref_idc: %d, nal_unit_type: %d (\"%s\"))\n", + curFrameSize()-fOutputStartCodeSize, nal_ref_idc, nal_unit_type, nal_unit_type_description_h264[nal_unit_type]); +#endif + } else { // 265 + nal_unit_type = (fFirstByteOfNALUnit&0x7E)>>1; +#ifdef DEBUG + fprintf(stderr, "Parsed %d-byte NAL-unit (nal_unit_type: %d (\"%s\"))\n", + curFrameSize()-fOutputStartCodeSize, nal_unit_type, nal_unit_type_description_h265[nal_unit_type]); +#endif + } + + // Now that we have found (& copied) a NAL unit, process it if it's of special interest to us: + if (isVPS(nal_unit_type)) { // Video parameter set + // First, save a copy of this NAL unit, in case the downstream object wants to see it: + usingSource()->saveCopyOfVPS(fStartOfFrame + fOutputStartCodeSize, curFrameSize() - fOutputStartCodeSize); + + if (fParsedFrameRate == 0.0) { + // We haven't yet parsed a frame rate from the stream. + // So parse this NAL unit to check whether frame rate information is present: + unsigned num_units_in_tick, time_scale; + analyze_video_parameter_set_data(num_units_in_tick, time_scale); + if (time_scale > 0 && num_units_in_tick > 0) { + usingSource()->fFrameRate = fParsedFrameRate + = time_scale/(DeltaTfiDivisor*num_units_in_tick); +#ifdef DEBUG + fprintf(stderr, "Set frame rate to %f fps\n", usingSource()->fFrameRate); +#endif + } else { +#ifdef DEBUG + fprintf(stderr, "\tThis \"Video Parameter Set\" NAL unit contained no frame rate information, so we use a default frame rate of %f fps\n", usingSource()->fFrameRate); +#endif + } + } + } else if (isSPS(nal_unit_type)) { // Sequence parameter set + // First, save a copy of this NAL unit, in case the downstream object wants to see it: + usingSource()->saveCopyOfSPS(fStartOfFrame + fOutputStartCodeSize, curFrameSize() - fOutputStartCodeSize); + + if (fParsedFrameRate == 0.0) { + // We haven't yet parsed a frame rate from the stream. + // So parse this NAL unit to check whether frame rate information is present: + unsigned num_units_in_tick, time_scale; + analyze_seq_parameter_set_data(num_units_in_tick, time_scale); + if (time_scale > 0 && num_units_in_tick > 0) { + usingSource()->fFrameRate = fParsedFrameRate + = time_scale/(DeltaTfiDivisor*num_units_in_tick); +#ifdef DEBUG + fprintf(stderr, "Set frame rate to %f fps\n", usingSource()->fFrameRate); +#endif + } else { +#ifdef DEBUG + fprintf(stderr, "\tThis \"Sequence Parameter Set\" NAL unit contained no frame rate information, so we use a default frame rate of %f fps\n", usingSource()->fFrameRate); +#endif + } + } + } else if (isPPS(nal_unit_type)) { // Picture parameter set + // Save a copy of this NAL unit, in case the downstream object wants to see it: + usingSource()->saveCopyOfPPS(fStartOfFrame + fOutputStartCodeSize, curFrameSize() - fOutputStartCodeSize); + } else if (isSEI(nal_unit_type)) { // Supplemental enhancement information (SEI) + analyze_sei_data(nal_unit_type); + // Later, perhaps adjust "fPresentationTime" if we saw a "pic_timing" SEI payload??? ##### + } + + usingSource()->setPresentationTime(); +#ifdef DEBUG + unsigned long secs = (unsigned long)usingSource()->fPresentationTime.tv_sec; + unsigned uSecs = (unsigned)usingSource()->fPresentationTime.tv_usec; + fprintf(stderr, "\tPresentation time: %lu.%06u\n", secs, uSecs); +#endif + + // Now, check whether this NAL unit ends an 'access unit'. + // (RTP streamers need to know this in order to figure out whether or not to set the "M" bit.) + Boolean thisNALUnitEndsAccessUnit; + if (haveSeenEOF() || isEOF(nal_unit_type)) { + // There is no next NAL unit, so we assume that this one ends the current 'access unit': + thisNALUnitEndsAccessUnit = True; + } else if (usuallyBeginsAccessUnit(nal_unit_type)) { + // These NAL units usually *begin* an access unit, so assume that they don't end one here: + thisNALUnitEndsAccessUnit = False; + } else { + // We need to check the *next* NAL unit to figure out whether + // the current NAL unit ends an 'access unit': + u_int8_t firstBytesOfNextNALUnit[3]; + testBytes(firstBytesOfNextNALUnit, 3); + + u_int8_t const& next_nal_unit_type = fHNumber == 264 + ? (firstBytesOfNextNALUnit[0]&0x1F) : ((firstBytesOfNextNALUnit[0]&0x7E)>>1); + if (isVCL(next_nal_unit_type)) { + // The high-order bit of the byte after the "nal_unit_header" tells us whether it's + // the start of a new 'access unit' (and thus the current NAL unit ends an 'access unit'): + u_int8_t const byteAfter_nal_unit_header + = fHNumber == 264 ? firstBytesOfNextNALUnit[1] : firstBytesOfNextNALUnit[2]; + thisNALUnitEndsAccessUnit = (byteAfter_nal_unit_header&0x80) != 0; + } else if (usuallyBeginsAccessUnit(next_nal_unit_type)) { + // The next NAL unit's type is one that usually appears at the start of an 'access unit', + // so we assume that the current NAL unit ends an 'access unit': + thisNALUnitEndsAccessUnit = True; + } else { + // The next NAL unit definitely doesn't start a new 'access unit', + // which means that the current NAL unit doesn't end one: + thisNALUnitEndsAccessUnit = False; + } + } + + if (thisNALUnitEndsAccessUnit) { +#ifdef DEBUG + fprintf(stderr, "*****This NAL unit ends the current access unit*****\n"); +#endif + usingSource()->fPictureEndMarker = True; + ++usingSource()->fPictureCount; + + // Note that the presentation time for the next NAL unit will be different: + struct timeval& nextPT = usingSource()->fNextPresentationTime; // alias + nextPT = usingSource()->fPresentationTime; + double nextFraction = nextPT.tv_usec/1000000.0 + 1/usingSource()->fFrameRate; + unsigned nextSecsIncrement = (long)nextFraction; + nextPT.tv_sec += (long)nextSecsIncrement; + nextPT.tv_usec = (long)((nextFraction - nextSecsIncrement)*1000000); + } + setParseState(); + + return curFrameSize(); + } catch (int /*e*/) { +#ifdef DEBUG + fprintf(stderr, "H264or5VideoStreamParser::parse() EXCEPTION (This is normal behavior - *not* an error)\n"); +#endif + return 0; // the parsing got interrupted + } +} + +unsigned removeH264or5EmulationBytes(u_int8_t* to, unsigned toMaxSize, + u_int8_t const* from, unsigned fromSize) { + unsigned toSize = 0; + unsigned i = 0; + while (i < fromSize && toSize+1 < toMaxSize) { + if (i+2 < fromSize && from[i] == 0 && from[i+1] == 0 && from[i+2] == 3) { + to[toSize] = to[toSize+1] = 0; + toSize += 2; + i += 3; + } else { + to[toSize] = from[i]; + toSize += 1; + i += 1; + } + } + + return toSize; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/H265VideoFileServerMediaSubsession.cpp b/src/big/mpp/middleware/src/live555/liveMedia/H265VideoFileServerMediaSubsession.cpp new file mode 100644 index 000000000..ea37ca798 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/H265VideoFileServerMediaSubsession.cpp @@ -0,0 +1,121 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A 'ServerMediaSubsession' object that creates new, unicast, "RTPSink"s +// on demand, from a H265 video file. +// Implementation + +#include "H265VideoFileServerMediaSubsession.hh" +#include "H265VideoRTPSink.hh" +#include "ByteStreamFileSource.hh" +#include "H265VideoStreamFramer.hh" + +H265VideoFileServerMediaSubsession* +H265VideoFileServerMediaSubsession::createNew(UsageEnvironment& env, + char const* fileName, + Boolean reuseFirstSource) { + return new H265VideoFileServerMediaSubsession(env, fileName, reuseFirstSource); +} + +H265VideoFileServerMediaSubsession::H265VideoFileServerMediaSubsession(UsageEnvironment& env, + char const* fileName, Boolean reuseFirstSource) + : FileServerMediaSubsession(env, fileName, reuseFirstSource), + fAuxSDPLine(NULL), fDoneFlag(0), fDummyRTPSink(NULL) { +} + +H265VideoFileServerMediaSubsession::~H265VideoFileServerMediaSubsession() { + delete[] fAuxSDPLine; +} + +static void afterPlayingDummy(void* clientData) { + H265VideoFileServerMediaSubsession* subsess = (H265VideoFileServerMediaSubsession*)clientData; + subsess->afterPlayingDummy1(); +} + +void H265VideoFileServerMediaSubsession::afterPlayingDummy1() { + // Unschedule any pending 'checking' task: + envir().taskScheduler().unscheduleDelayedTask(nextTask()); + // Signal the event loop that we're done: + setDoneFlag(); +} + +static void checkForAuxSDPLine(void* clientData) { + H265VideoFileServerMediaSubsession* subsess = (H265VideoFileServerMediaSubsession*)clientData; + subsess->checkForAuxSDPLine1(); +} + +void H265VideoFileServerMediaSubsession::checkForAuxSDPLine1() { + nextTask() = NULL; + + char const* dasl; + if (fAuxSDPLine != NULL) { + // Signal the event loop that we're done: + setDoneFlag(); + } else if (fDummyRTPSink != NULL && (dasl = fDummyRTPSink->auxSDPLine()) != NULL) { + fAuxSDPLine = strDup(dasl); + fDummyRTPSink = NULL; + + // Signal the event loop that we're done: + setDoneFlag(); + } else if (!fDoneFlag) { + // try again after a brief delay: + int uSecsToDelay = 100000; // 100 ms + nextTask() = envir().taskScheduler().scheduleDelayedTask(uSecsToDelay, + (TaskFunc*)checkForAuxSDPLine, this); + } +} + +char const* H265VideoFileServerMediaSubsession::getAuxSDPLine(RTPSink* rtpSink, FramedSource* inputSource) { + if (fAuxSDPLine != NULL) return fAuxSDPLine; // it's already been set up (for a previous client) + + if (fDummyRTPSink == NULL) { // we're not already setting it up for another, concurrent stream + // Note: For H265 video files, the 'config' information (used for several payload-format + // specific parameters in the SDP description) isn't known until we start reading the file. + // This means that "rtpSink"s "auxSDPLine()" will be NULL initially, + // and we need to start reading data from our file until this changes. + fDummyRTPSink = rtpSink; + + // Start reading the file: + fDummyRTPSink->startPlaying(*inputSource, afterPlayingDummy, this); + + // Check whether the sink's 'auxSDPLine()' is ready: + checkForAuxSDPLine(this); + } + + envir().taskScheduler().doEventLoop(&fDoneFlag); + + return fAuxSDPLine; +} + +FramedSource* H265VideoFileServerMediaSubsession::createNewStreamSource(unsigned /*clientSessionId*/, unsigned& estBitrate) { + estBitrate = 500; // kbps, estimate + + // Create the video source: + ByteStreamFileSource* fileSource = ByteStreamFileSource::createNew(envir(), fFileName); + if (fileSource == NULL) return NULL; + fFileSize = fileSource->fileSize(); + + // Create a framer for the Video Elementary Stream: + return H265VideoStreamFramer::createNew(envir(), fileSource); +} + +RTPSink* H265VideoFileServerMediaSubsession +::createNewRTPSink(Groupsock* rtpGroupsock, + unsigned char rtpPayloadTypeIfDynamic, + FramedSource* /*inputSource*/) { + return H265VideoRTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/H265VideoFileSink.cpp b/src/big/mpp/middleware/src/live555/liveMedia/H265VideoFileSink.cpp new file mode 100644 index 000000000..bf078bfd7 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/H265VideoFileSink.cpp @@ -0,0 +1,63 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// H.265 Video File sinks +// Implementation + +#include "H265VideoFileSink.hh" +#include "OutputFile.hh" + +////////// H265VideoFileSink ////////// + +H265VideoFileSink +::H265VideoFileSink(UsageEnvironment& env, FILE* fid, + char const* sPropVPSStr, + char const* sPropSPSStr, + char const* sPropPPSStr, + unsigned bufferSize, char const* perFrameFileNamePrefix) + : H264or5VideoFileSink(env, fid, bufferSize, perFrameFileNamePrefix, + sPropVPSStr, sPropSPSStr, sPropPPSStr) { +} + +H265VideoFileSink::~H265VideoFileSink() { +} + +H265VideoFileSink* +H265VideoFileSink::createNew(UsageEnvironment& env, char const* fileName, + char const* sPropVPSStr, + char const* sPropSPSStr, + char const* sPropPPSStr, + unsigned bufferSize, Boolean oneFilePerFrame) { + do { + FILE* fid; + char const* perFrameFileNamePrefix; + if (oneFilePerFrame) { + // Create the fid for each frame + fid = NULL; + perFrameFileNamePrefix = fileName; + } else { + // Normal case: create the fid once + fid = OpenOutputFile(env, fileName); + if (fid == NULL) break; + perFrameFileNamePrefix = NULL; + } + + return new H265VideoFileSink(env, fid, sPropVPSStr, sPropSPSStr, sPropPPSStr, bufferSize, perFrameFileNamePrefix); + } while (0); + + return NULL; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/H265VideoRTPSink.cpp b/src/big/mpp/middleware/src/live555/liveMedia/H265VideoRTPSink.cpp new file mode 100644 index 000000000..bc5f8a680 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/H265VideoRTPSink.cpp @@ -0,0 +1,182 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP sink for H.265 video +// Implementation + +#include "H265VideoRTPSink.hh" +#include "H265VideoStreamFramer.hh" +#include "Base64.hh" +#include "BitVector.hh" +#include "H264VideoRTPSource.hh" // for "parseSPropParameterSets()" + +////////// H265VideoRTPSink implementation ////////// + +H265VideoRTPSink +::H265VideoRTPSink(UsageEnvironment& env, Groupsock* RTPgs, unsigned char rtpPayloadFormat, + u_int8_t const* vps, unsigned vpsSize, + u_int8_t const* sps, unsigned spsSize, + u_int8_t const* pps, unsigned ppsSize) + : H264or5VideoRTPSink(265, env, RTPgs, rtpPayloadFormat, + vps, vpsSize, sps, spsSize, pps, ppsSize) { +} + +H265VideoRTPSink::~H265VideoRTPSink() { +} + +H265VideoRTPSink* H265VideoRTPSink +::createNew(UsageEnvironment& env, Groupsock* RTPgs, unsigned char rtpPayloadFormat) { + return new H265VideoRTPSink(env, RTPgs, rtpPayloadFormat); +} + +H265VideoRTPSink* H265VideoRTPSink +::createNew(UsageEnvironment& env, Groupsock* RTPgs, unsigned char rtpPayloadFormat, + u_int8_t const* vps, unsigned vpsSize, + u_int8_t const* sps, unsigned spsSize, + u_int8_t const* pps, unsigned ppsSize) { + return new H265VideoRTPSink(env, RTPgs, rtpPayloadFormat, + vps, vpsSize, sps, spsSize, pps, ppsSize); +} + +H265VideoRTPSink* H265VideoRTPSink +::createNew(UsageEnvironment& env, Groupsock* RTPgs, unsigned char rtpPayloadFormat, + char const* sPropVPSStr, char const* sPropSPSStr, char const* sPropPPSStr) { + u_int8_t* vps = NULL; unsigned vpsSize = 0; + u_int8_t* sps = NULL; unsigned spsSize = 0; + u_int8_t* pps = NULL; unsigned ppsSize = 0; + + // Parse each 'sProp' string, extracting and then classifying the NAL unit(s) from each one. + // We're 'liberal in what we accept'; it's OK if the strings don't contain the NAL unit type + // implied by their names (or if one or more of the strings encode multiple NAL units). + SPropRecord* sPropRecords[3]; + unsigned numSPropRecords[3]; + sPropRecords[0] = parseSPropParameterSets(sPropVPSStr, numSPropRecords[0]); + sPropRecords[1] = parseSPropParameterSets(sPropSPSStr, numSPropRecords[1]); + sPropRecords[2] = parseSPropParameterSets(sPropPPSStr, numSPropRecords[2]); + + for (unsigned j = 0; j < 3; ++j) { + SPropRecord* records = sPropRecords[j]; + unsigned numRecords = numSPropRecords[j]; + + for (unsigned i = 0; i < numRecords; ++i) { + if (records[i].sPropLength == 0) continue; // bad data + u_int8_t nal_unit_type = ((records[i].sPropBytes[0])&0x7E)>>1; + if (nal_unit_type == 32/*VPS*/) { + vps = records[i].sPropBytes; + vpsSize = records[i].sPropLength; + } else if (nal_unit_type == 33/*SPS*/) { + sps = records[i].sPropBytes; + spsSize = records[i].sPropLength; + } else if (nal_unit_type == 34/*PPS*/) { + pps = records[i].sPropBytes; + ppsSize = records[i].sPropLength; + } + } + } + + H265VideoRTPSink* result = new H265VideoRTPSink(env, RTPgs, rtpPayloadFormat, + vps, vpsSize, sps, spsSize, pps, ppsSize); + delete[] sPropRecords[0]; delete[] sPropRecords[1]; delete[] sPropRecords[2]; + + return result; +} + +Boolean H265VideoRTPSink::sourceIsCompatibleWithUs(MediaSource& source) { + // Our source must be an appropriate framer: + return source.isH265VideoStreamFramer(); +} + +char const* H265VideoRTPSink::auxSDPLine() { + // Generate a new "a=fmtp:" line each time, using our VPS, SPS and PPS (if we have them), + // otherwise parameters from our framer source (in case they've changed since the last time that + // we were called): + H264or5VideoStreamFramer* framerSource = NULL; + u_int8_t* vps = fVPS; unsigned vpsSize = fVPSSize; + u_int8_t* sps = fSPS; unsigned spsSize = fSPSSize; + u_int8_t* pps = fPPS; unsigned ppsSize = fPPSSize; + if (vps == NULL || sps == NULL || pps == NULL) { + // We need to get VPS, SPS and PPS from our framer source: + if (fOurFragmenter == NULL) return NULL; // we don't yet have a fragmenter (and therefore not a source) + framerSource = (H264or5VideoStreamFramer*)(fOurFragmenter->inputSource()); + if (framerSource == NULL) return NULL; // we don't yet have a source + + framerSource->getVPSandSPSandPPS(vps, vpsSize, sps, spsSize, pps, ppsSize); + if (vps == NULL || sps == NULL || pps == NULL) { + return NULL; // our source isn't ready + } + } + + // Set up the "a=fmtp:" SDP line for this stream. + u_int8_t* vpsWEB = new u_int8_t[vpsSize]; // "WEB" means "Without Emulation Bytes" + unsigned vpsWEBSize = removeH264or5EmulationBytes(vpsWEB, vpsSize, vps, vpsSize); + if (vpsWEBSize < 6/*'profile_tier_level' offset*/ + 12/*num 'profile_tier_level' bytes*/) { + // Bad VPS size => assume our source isn't ready + delete[] vpsWEB; + return NULL; + } + u_int8_t const* profileTierLevelHeaderBytes = &vpsWEB[6]; + unsigned profileSpace = profileTierLevelHeaderBytes[0]>>6; // general_profile_space + unsigned profileId = profileTierLevelHeaderBytes[0]&0x1F; // general_profile_idc + unsigned tierFlag = (profileTierLevelHeaderBytes[0]>>5)&0x1; // general_tier_flag + unsigned levelId = profileTierLevelHeaderBytes[11]; // general_level_idc + u_int8_t const* interop_constraints = &profileTierLevelHeaderBytes[5]; + char interopConstraintsStr[100]; + sprintf(interopConstraintsStr, "%02X%02X%02X%02X%02X%02X", + interop_constraints[0], interop_constraints[1], interop_constraints[2], + interop_constraints[3], interop_constraints[4], interop_constraints[5]); + delete[] vpsWEB; + + char* sprop_vps = base64Encode((char*)vps, vpsSize); + char* sprop_sps = base64Encode((char*)sps, spsSize); + char* sprop_pps = base64Encode((char*)pps, ppsSize); + + char const* fmtpFmt = + "a=fmtp:%d profile-space=%u" + ";profile-id=%u" + ";tier-flag=%u" + ";level-id=%u" + ";interop-constraints=%s" + ";sprop-vps=%s" + ";sprop-sps=%s" + ";sprop-pps=%s\r\n"; + unsigned fmtpFmtSize = strlen(fmtpFmt) + + 3 /* max num chars: rtpPayloadType */ + 20 /* max num chars: profile_space */ + + 20 /* max num chars: profile_id */ + + 20 /* max num chars: tier_flag */ + + 20 /* max num chars: level_id */ + + strlen(interopConstraintsStr) + + strlen(sprop_vps) + + strlen(sprop_sps) + + strlen(sprop_pps); + char* fmtp = new char[fmtpFmtSize]; + sprintf(fmtp, fmtpFmt, + rtpPayloadType(), profileSpace, + profileId, + tierFlag, + levelId, + interopConstraintsStr, + sprop_vps, + sprop_sps, + sprop_pps); + + delete[] sprop_vps; + delete[] sprop_sps; + delete[] sprop_pps; + + delete[] fFmtpSDPLine; fFmtpSDPLine = fmtp; + return fFmtpSDPLine; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/H265VideoRTPSource.cpp b/src/big/mpp/middleware/src/live555/liveMedia/H265VideoRTPSource.cpp new file mode 100644 index 000000000..745c256c7 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/H265VideoRTPSource.cpp @@ -0,0 +1,218 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// H.265 Video RTP Sources +// Implementation + +#include "H265VideoRTPSource.hh" + +////////// H265BufferedPacket and H265BufferedPacketFactory ////////// + +class H265BufferedPacket: public BufferedPacket { +public: + H265BufferedPacket(H265VideoRTPSource& ourSource); + virtual ~H265BufferedPacket(); + +private: // redefined virtual functions + virtual unsigned nextEnclosedFrameSize(unsigned char*& framePtr, + unsigned dataSize); +private: + H265VideoRTPSource& fOurSource; +}; + +class H265BufferedPacketFactory: public BufferedPacketFactory { +private: // redefined virtual functions + virtual BufferedPacket* createNewPacket(MultiFramedRTPSource* ourSource); +}; + + +///////// H265VideoRTPSource implementation //////// + +H265VideoRTPSource* +H265VideoRTPSource::createNew(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + Boolean expectDONFields, + unsigned rtpTimestampFrequency) { + return new H265VideoRTPSource(env, RTPgs, rtpPayloadFormat, + expectDONFields, rtpTimestampFrequency); +} + +H265VideoRTPSource +::H265VideoRTPSource(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + Boolean expectDONFields, + unsigned rtpTimestampFrequency) + : MultiFramedRTPSource(env, RTPgs, rtpPayloadFormat, rtpTimestampFrequency, + new H265BufferedPacketFactory), + fExpectDONFields(expectDONFields), + fPreviousNALUnitDON(0), fCurrentNALUnitAbsDon((u_int64_t)(~0)) { +} + +H265VideoRTPSource::~H265VideoRTPSource() { +} + +Boolean H265VideoRTPSource +::processSpecialHeader(BufferedPacket* packet, + unsigned& resultSpecialHeaderSize) { + unsigned char* headerStart = packet->data(); + unsigned packetSize = packet->dataSize(); + u_int16_t DONL = 0; + unsigned numBytesToSkip; + + // Check the Payload Header's 'nal_unit_type' for special aggregation or fragmentation packets: + if (packetSize < 2) return False; + fCurPacketNALUnitType = (headerStart[0]&0x7E)>>1; + switch (fCurPacketNALUnitType) { + case 48: { // Aggregation Packet (AP) + // We skip over the 2-byte Payload Header, and the DONL header (if any). + if (fExpectDONFields) { + if (packetSize < 4) return False; + DONL = (headerStart[2]<<8)|headerStart[3]; + numBytesToSkip = 4; + } else { + numBytesToSkip = 2; + } + break; + } + case 49: { // Fragmentation Unit (FU) + // This NALU begins with the 2-byte Payload Header, the 1-byte FU header, and (optionally) + // the 2-byte DONL header. + // If the start bit is set, we reconstruct the original NAL header at the end of these + // 3 (or 5) bytes, and skip over the first 1 (or 3) bytes. + if (packetSize < 3) return False; + u_int8_t startBit = headerStart[2]&0x80; // from the FU header + u_int8_t endBit = headerStart[2]&0x40; // from the FU header + if (startBit) { + fCurrentPacketBeginsFrame = True; + + u_int8_t nal_unit_type = headerStart[2]&0x3F; // the last 6 bits of the FU header + u_int8_t newNALHeader[2]; + newNALHeader[0] = (headerStart[0]&0x81)|(nal_unit_type<<1); + newNALHeader[1] = headerStart[1]; + + if (fExpectDONFields) { + if (packetSize < 5) return False; + DONL = (headerStart[3]<<8)|headerStart[4]; + headerStart[3] = newNALHeader[0]; + headerStart[4] = newNALHeader[1]; + numBytesToSkip = 3; + } else { + headerStart[1] = newNALHeader[0]; + headerStart[2] = newNALHeader[1]; + numBytesToSkip = 1; + } + } else { + // The start bit is not set, so we skip over all headers: + fCurrentPacketBeginsFrame = False; + if (fExpectDONFields) { + if (packetSize < 5) return False; + DONL = (headerStart[3]<<8)|headerStart[4]; + numBytesToSkip = 5; + } else { + numBytesToSkip = 3; + } + } + fCurrentPacketCompletesFrame = (endBit != 0); + break; + } + default: { + // This packet contains one complete NAL unit: + fCurrentPacketBeginsFrame = fCurrentPacketCompletesFrame = True; + numBytesToSkip = 0; + break; + } + } + + computeAbsDonFromDON(DONL); + resultSpecialHeaderSize = numBytesToSkip; + return True; +} + +char const* H265VideoRTPSource::MIMEtype() const { + return "video/H265"; +} + +void H265VideoRTPSource::computeAbsDonFromDON(u_int16_t DON) { + if (!fExpectDONFields) { + // Without DON fields in the input stream, we just increment our "AbsDon" count each time: + ++fCurrentNALUnitAbsDon; + } else { + if (fCurrentNALUnitAbsDon == (u_int64_t)(~0)) { + // This is the very first NAL unit, so "AbsDon" is just "DON": + fCurrentNALUnitAbsDon = (u_int64_t)DON; + } else { + // Use the previous NAL unit's DON and the current DON to compute "AbsDon": + // AbsDon[n] = AbsDon[n-1] + (DON[n] - DON[n-1]) mod 2^16 + short signedDiff16 = (short)(DON - fPreviousNALUnitDON); + int64_t signedDiff64 = (int64_t)signedDiff16; + fCurrentNALUnitAbsDon += signedDiff64; + } + + fPreviousNALUnitDON = DON; // for next time + } +} + + +////////// H265BufferedPacket and H265BufferedPacketFactory implementation ////////// + +H265BufferedPacket::H265BufferedPacket(H265VideoRTPSource& ourSource) + : fOurSource(ourSource) { +} + +H265BufferedPacket::~H265BufferedPacket() { +} + +unsigned H265BufferedPacket +::nextEnclosedFrameSize(unsigned char*& framePtr, unsigned dataSize) { + unsigned resultNALUSize = 0; // if an error occurs + + switch (fOurSource.fCurPacketNALUnitType) { + case 48: { // Aggregation Packet (AP) + if (useCount() > 0) { + // We're other than the first NAL unit inside this Aggregation Packet. + // Update our 'decoding order number': + u_int16_t DONL = 0; + if (fOurSource.fExpectDONFields) { + // There's a 1-byte DOND field next: + if (dataSize < 1) break; + u_int8_t DOND = framePtr[0]; + DONL = fOurSource.fPreviousNALUnitDON + (u_int16_t)(DOND + 1); + ++framePtr; + --dataSize; + } + fOurSource.computeAbsDonFromDON(DONL); + } + + // The next 2 bytes are the NAL unit size: + if (dataSize < 2) break; + resultNALUSize = (framePtr[0]<<8)|framePtr[1]; + framePtr += 2; + break; + } + default: { + // Common case: We use the entire packet data: + return dataSize; + } + } + + return (resultNALUSize <= dataSize) ? resultNALUSize : dataSize; +} + +BufferedPacket* H265BufferedPacketFactory +::createNewPacket(MultiFramedRTPSource* ourSource) { + return new H265BufferedPacket((H265VideoRTPSource&)(*ourSource)); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/H265VideoStreamDiscreteFramer.cpp b/src/big/mpp/middleware/src/live555/liveMedia/H265VideoStreamDiscreteFramer.cpp new file mode 100644 index 000000000..de89b3711 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/H265VideoStreamDiscreteFramer.cpp @@ -0,0 +1,46 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A simplified version of "H265VideoStreamFramer" that takes only complete, +// discrete frames (rather than an arbitrary byte stream) as input. +// This avoids the parsing and data copying overhead of the full +// "H265VideoStreamFramer". +// Implementation + +#include "H265VideoStreamDiscreteFramer.hh" + +H265VideoStreamDiscreteFramer* +H265VideoStreamDiscreteFramer +::createNew(UsageEnvironment& env, FramedSource* inputSource, + Boolean includeStartCodeInOutput, Boolean insertAccessUnitDelimiters) { + return new H265VideoStreamDiscreteFramer(env, inputSource, + includeStartCodeInOutput, insertAccessUnitDelimiters); +} + +H265VideoStreamDiscreteFramer +::H265VideoStreamDiscreteFramer(UsageEnvironment& env, FramedSource* inputSource, + Boolean includeStartCodeInOutput, Boolean insertAccessUnitDelimiters) + : H264or5VideoStreamDiscreteFramer(265, env, inputSource, + includeStartCodeInOutput, insertAccessUnitDelimiters) { +} + +H265VideoStreamDiscreteFramer::~H265VideoStreamDiscreteFramer() { +} + +Boolean H265VideoStreamDiscreteFramer::isH265VideoStreamFramer() const { + return True; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/H265VideoStreamFramer.cpp b/src/big/mpp/middleware/src/live555/liveMedia/H265VideoStreamFramer.cpp new file mode 100644 index 000000000..39b377643 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/H265VideoStreamFramer.cpp @@ -0,0 +1,42 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A filter that breaks up a H.265 Video Elementary Stream into NAL units. +// Implementation + +#include "H265VideoStreamFramer.hh" + +H265VideoStreamFramer* H265VideoStreamFramer +::createNew(UsageEnvironment& env, FramedSource* inputSource, + Boolean includeStartCodeInOutput, Boolean insertAccessUnitDelimiters) { + return new H265VideoStreamFramer(env, inputSource, True, + includeStartCodeInOutput, insertAccessUnitDelimiters); +} + +H265VideoStreamFramer +::H265VideoStreamFramer(UsageEnvironment& env, FramedSource* inputSource, Boolean createParser, + Boolean includeStartCodeInOutput, Boolean insertAccessUnitDelimiters) + : H264or5VideoStreamFramer(265, env, inputSource, createParser, + includeStartCodeInOutput, insertAccessUnitDelimiters) { +} + +H265VideoStreamFramer::~H265VideoStreamFramer() { +} + +Boolean H265VideoStreamFramer::isH265VideoStreamFramer() const { + return True; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/HLSSegmenter.cpp b/src/big/mpp/middleware/src/live555/liveMedia/HLSSegmenter.cpp new file mode 100644 index 000000000..c0e895665 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/HLSSegmenter.cpp @@ -0,0 +1,141 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A media sink that takes - as input - a MPEG Transport Stream, and outputs a series +// of MPEG Transport Stream files, each representing a segment of the input stream, +// suitable for HLS (Apple's "HTTP Live Streaming"). +// Implementation + +#include "HLSSegmenter.hh" +#include "OutputFile.hh" +#include "MPEG2TransportStreamMultiplexor.hh" + +#define TRANSPORT_PACKET_SIZE 188 +#define OUTPUT_FILE_BUFFER_SIZE (TRANSPORT_PACKET_SIZE*100) + +HLSSegmenter* HLSSegmenter +::createNew(UsageEnvironment& env, + unsigned segmentationDuration, char const* fileNamePrefix, + onEndOfSegmentFunc* onEndOfSegmentFunc, void* onEndOfSegmentClientData) { + return new HLSSegmenter(env, segmentationDuration, fileNamePrefix, + onEndOfSegmentFunc, onEndOfSegmentClientData); +} + +HLSSegmenter::HLSSegmenter(UsageEnvironment& env, + unsigned segmentationDuration, char const* fileNamePrefix, + onEndOfSegmentFunc* onEndOfSegmentFunc, void* onEndOfSegmentClientData) + : MediaSink(env), + fSegmentationDuration(segmentationDuration), fFileNamePrefix(fileNamePrefix), + fOnEndOfSegmentFunc(onEndOfSegmentFunc), fOnEndOfSegmentClientData(onEndOfSegmentClientData), + fHaveConfiguredUpstreamSource(False), fCurrentSegmentCounter(1), fOutFid(NULL) { + // Allocate enough space for the segment file name: + fOutputSegmentFileName = new char[strlen(fileNamePrefix) + 20/*more than enough*/]; + + // Allocate the output file buffer size: + fOutputFileBuffer = new unsigned char[OUTPUT_FILE_BUFFER_SIZE]; +} +HLSSegmenter::~HLSSegmenter() { + delete[] fOutputFileBuffer; + delete[] fOutputSegmentFileName; +} + +void HLSSegmenter::ourEndOfSegmentHandler(void* clientData, double segmentDuration) { + ((HLSSegmenter*)clientData)->ourEndOfSegmentHandler(segmentDuration); +} + +void HLSSegmenter::ourEndOfSegmentHandler(double segmentDuration) { + // Note the end of the current segment: + if (fOnEndOfSegmentFunc != NULL) { + (*fOnEndOfSegmentFunc)(fOnEndOfSegmentClientData, fOutputSegmentFileName, segmentDuration); + } + + // Begin the next segment: + ++fCurrentSegmentCounter; + openNextOutputSegment(); +} + +Boolean HLSSegmenter::openNextOutputSegment() { + CloseOutputFile(fOutFid); + + sprintf(fOutputSegmentFileName, "%s%03u.ts", fFileNamePrefix, fCurrentSegmentCounter); + fOutFid = OpenOutputFile(envir(), fOutputSegmentFileName); + + return fOutFid != NULL; +} + +void HLSSegmenter::afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval /*presentationTime*/, + unsigned /*durationInMicroseconds*/) { + ((HLSSegmenter*)clientData)->afterGettingFrame(frameSize, numTruncatedBytes); +} + +void HLSSegmenter::afterGettingFrame(unsigned frameSize, unsigned numTruncatedBytes) { + if (numTruncatedBytes > 0) { // Shouldn't happen + fprintf(stderr, "HLSSegmenter::afterGettingFrame(frameSize %d, numTruncatedBytes %d)\n", frameSize, numTruncatedBytes); + } + + // Write the data to our output segment file: + fwrite(fOutputFileBuffer, 1, frameSize, fOutFid); + + // Then try getting the next frame: + continuePlaying(); +} + +void HLSSegmenter::ourOnSourceClosure(void* clientData) { + ((HLSSegmenter*)clientData)->ourOnSourceClosure(); +} + +void HLSSegmenter::ourOnSourceClosure() { + // Note the end of the final segment (currently being written): + if (fOnEndOfSegmentFunc != NULL) { + // We know that the source is a "MPEG2TransportStreamMultiplexor": + MPEG2TransportStreamMultiplexor* multiplexorSource = (MPEG2TransportStreamMultiplexor*)fSource; + double segmentDuration = multiplexorSource->currentSegmentDuration(); + + (*fOnEndOfSegmentFunc)(fOnEndOfSegmentClientData, fOutputSegmentFileName, segmentDuration); + } + + // Handle the closure for real: + onSourceClosure(); +} + +Boolean HLSSegmenter::sourceIsCompatibleWithUs(MediaSource& source) { + // Our source must be a Transport Stream Multiplexor: + return source.isMPEG2TransportStreamMultiplexor(); +} + +Boolean HLSSegmenter::continuePlaying() { + if (fSource == NULL) return False; + if (!fHaveConfiguredUpstreamSource) { + // We know that the source is a "MPEG2TransportStreamMultiplexor": + MPEG2TransportStreamMultiplexor* multiplexorSource = (MPEG2TransportStreamMultiplexor*)fSource; + + // Tell our upstream multiplexor to call our 'end of segment handler' at the end of + // each timed segment: + multiplexorSource->setTimedSegmentation(fSegmentationDuration, ourEndOfSegmentHandler, this); + + fHaveConfiguredUpstreamSource = True; // from now on + } + if (fOutFid == NULL && !openNextOutputSegment()) return False; + + fSource->getNextFrame(fOutputFileBuffer, OUTPUT_FILE_BUFFER_SIZE, + afterGettingFrame, this, + ourOnSourceClosure, this); + + return True; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/HMAC_SHA1.cpp b/src/big/mpp/middleware/src/live555/liveMedia/HMAC_SHA1.cpp new file mode 100644 index 000000000..4cb378ea7 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/HMAC_SHA1.cpp @@ -0,0 +1,80 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023, Live Networks, Inc. All rights reserved +// +// A function for computing the HMAC_SHA1 digest +// Implementation + +#include "HMAC_SHA1.hh" + +#ifndef NO_OPENSSL +#if defined(__APPLE__) +#define COMMON_DIGEST_FOR_OPENSSL +#include +#endif +#include + +////////// HMAC_SHA1 implementation ////////// + +static void sha1(u_int8_t* resultDigest/*must be SHA1_DIGEST_LEN bytes in size*/, + u_int8_t const* data1, unsigned data1Length, + u_int8_t const* data2 = NULL, unsigned data2Length = 0) { + EVP_MD_CTX* ctx = EVP_MD_CTX_create(); + EVP_DigestInit(ctx, EVP_sha1()); + EVP_DigestUpdate(ctx, data1, data1Length); + if (data2 != NULL) { + EVP_DigestUpdate(ctx, data2, data2Length); + } + EVP_DigestFinal(ctx, resultDigest, NULL); + EVP_MD_CTX_destroy(ctx); +} + +void HMAC_SHA1(u_int8_t const* key, unsigned keyLength, u_int8_t const* text, unsigned textLength, + u_int8_t* resultDigest/*must be SHA1_DIGEST_LEN bytes in size*/) { + if (key == NULL || keyLength == 0 || text == NULL || textLength == 0 || resultDigest == NULL) { + return; // sanity check + } + + // If the key is longer than the block size, hash it to make it smaller: + u_int8_t tmpDigest[SHA1_DIGEST_LEN]; + if (keyLength > HMAC_BLOCK_SIZE) { + sha1(tmpDigest, key, keyLength); + key = tmpDigest; + keyLength = SHA1_DIGEST_LEN; + } + // Assert: keyLength <= HMAC_BLOCK_SIZE + + // Initialize the inner and outer pads with the key: + u_int8_t ipad[HMAC_BLOCK_SIZE]; + u_int8_t opad[HMAC_BLOCK_SIZE]; + unsigned i; + for (i = 0; i < keyLength; ++i) { + ipad[i] = key[i]^0x36; + opad[i] = key[i]^0x5c; + } + for (; i < HMAC_BLOCK_SIZE; ++i) { + ipad[i] = 0x36; + opad[i] = 0x5c; + } + + // Perform the inner hash: + sha1(tmpDigest, ipad, HMAC_BLOCK_SIZE, text, textLength); + + // Perform the outer hash: + sha1(resultDigest, opad, HMAC_BLOCK_SIZE, tmpDigest, SHA1_DIGEST_LEN); +} +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/InputFile.cpp b/src/big/mpp/middleware/src/live555/liveMedia/InputFile.cpp new file mode 100644 index 000000000..080dfcfd4 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/InputFile.cpp @@ -0,0 +1,112 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Common routines for opening/closing named input files +// Implementation + +#include "InputFile.hh" +#include + +FILE* OpenInputFile(UsageEnvironment& env, char const* fileName) { + FILE* fid; + + // Check for a special case file name: "stdin" + if (strcmp(fileName, "stdin") == 0) { + fid = stdin; +#if (defined(__WIN32__) || defined(_WIN32)) && !defined(_WIN32_WCE) + _setmode(_fileno(stdin), _O_BINARY); // convert to binary mode +#endif + } else { + fid = fopen(fileName, "rb"); + if (fid == NULL) { + env.setResultMsg("unable to open file \"",fileName, "\""); + } + } + + return fid; +} + +void CloseInputFile(FILE* fid) { + // Don't close 'stdin', in case we want to use it again later. + if (fid != NULL && fid != stdin) fclose(fid); +} + +u_int64_t GetFileSize(char const* fileName, FILE* fid) { + u_int64_t fileSize = 0; // by default + + if (fid != stdin) { +#if !defined(_WIN32_WCE) + if (fileName == NULL) { +#endif + if (fid != NULL && SeekFile64(fid, 0, SEEK_END) >= 0) { + fileSize = (u_int64_t)TellFile64(fid); + if (fileSize == (u_int64_t)-1) fileSize = 0; // TellFile64() failed + SeekFile64(fid, 0, SEEK_SET); + } +#if !defined(_WIN32_WCE) + } else { + struct stat sb; + if (stat(fileName, &sb) == 0) { + fileSize = sb.st_size; + } + } +#endif + } + + return fileSize; +} + +int64_t SeekFile64(FILE *fid, int64_t offset, int whence) { + if (fid == NULL) return -1; + + clearerr(fid); + fflush(fid); +#if (defined(__WIN32__) || defined(_WIN32)) && !defined(_WIN32_WCE) + return _lseeki64(_fileno(fid), offset, whence) == (int64_t)-1 ? -1 : 0; +#else +#if defined(_WIN32_WCE) + return fseek(fid, (long)(offset), whence); +#else + return fseeko(fid, (off_t)(offset), whence); +#endif +#endif +} + +int64_t TellFile64(FILE *fid) { + if (fid == NULL) return -1; + + clearerr(fid); + fflush(fid); +#if (defined(__WIN32__) || defined(_WIN32)) && !defined(_WIN32_WCE) + return _telli64(_fileno(fid)); +#else +#if defined(_WIN32_WCE) + return ftell(fid); +#else + return ftello(fid); +#endif +#endif +} + +Boolean FileIsSeekable(FILE *fid) { + if (SeekFile64(fid, 1, SEEK_CUR) < 0) { + return False; + } + + SeekFile64(fid, -1, SEEK_CUR); // seek back to where we were + return True; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/JPEG2000VideoRTPSink.cpp b/src/big/mpp/middleware/src/live555/liveMedia/JPEG2000VideoRTPSink.cpp new file mode 100644 index 000000000..a56253be5 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/JPEG2000VideoRTPSink.cpp @@ -0,0 +1,78 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. + +#include "JPEG2000VideoRTPSink.hh" + +JPEG2000VideoRTPSink::JPEG2000VideoRTPSink(UsageEnvironment& env, Groupsock* RTPgs) + : VideoRTPSink(env, RTPgs, 98, 90000, "jpeg2000") {} + +JPEG2000VideoRTPSink::~JPEG2000VideoRTPSink() {} + +JPEG2000VideoRTPSink* +JPEG2000VideoRTPSink::createNew(UsageEnvironment& env, Groupsock* RTPgs) { + return new JPEG2000VideoRTPSink(env, RTPgs); +} + +#define JPEG2000_PAYLOAD_HEADER_SIZE 8 + +void JPEG2000VideoRTPSink +::doSpecialFrameHandling(unsigned fragmentationOffset, + unsigned char* frameStart, + unsigned numBytesInFrame, + struct timeval framePresentationTime, + unsigned numRemainingBytes) { + // Fill in the Payload Header: + u_int8_t payloadHeader[JPEG2000_PAYLOAD_HEADER_SIZE]; + + // For "tp", assume for now that the payload is progressively scanned (i.e., tp = 0) + // For "MHF", assume that a whole main header is present (i.e., MHF = 3), *unless* we're + // the second or later packet of a fragment, in which case we assume that it's not (i.e. MHF = 0) + // For "mh_id", set this to 0 (as specified in RFC 5371). + // For "T" (Tile field invalidation flag), set this to 0 (we don't set the "tile number" field). + payloadHeader[0] = fragmentationOffset > 0 ? 0x00 : 0x30; + + // Set the "priority" field to 255, as specified in RFC 5371: + payloadHeader[1] = 255; + + // Set the "tile number" field to 0: + payloadHeader[2] = payloadHeader[3] = 0; + + // Set the "reserved" field to 0, as specified in RFC 5371: + payloadHeader[4] = 0; + + // Set the "fragmentation offset" field to the value of our "fragmentationOffset" parameter: + payloadHeader[5] = (u_int8_t)(fragmentationOffset>>16); + payloadHeader[6] = (u_int8_t)(fragmentationOffset>>8); + payloadHeader[7] = (u_int8_t)(fragmentationOffset); + + // Write the payload header to the outgoing packet: + setSpecialHeaderBytes(payloadHeader, sizeof payloadHeader); + + if (numRemainingBytes == 0) { + // This packet contains the last (or only) fragment of the frame. + // Set the RTP 'M' ('marker') bit + setMarkerBit(); + } + + // Also set the RTP timestamp: + setTimestamp(framePresentationTime); +} + +unsigned JPEG2000VideoRTPSink::specialHeaderSize() const { + return JPEG2000_PAYLOAD_HEADER_SIZE; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/JPEG2000VideoRTPSource.cpp b/src/big/mpp/middleware/src/live555/liveMedia/JPEG2000VideoRTPSource.cpp new file mode 100644 index 000000000..61d75b253 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/JPEG2000VideoRTPSource.cpp @@ -0,0 +1,64 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. + + +#include "JPEG2000VideoRTPSource.hh" + +JPEG2000VideoRTPSource* +JPEG2000VideoRTPSource::createNew(UsageEnvironment& env, + Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency, + char const* sampling) { + return new JPEG2000VideoRTPSource(env, RTPgs, rtpPayloadFormat, rtpTimestampFrequency, sampling); +} + +JPEG2000VideoRTPSource +::JPEG2000VideoRTPSource(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, unsigned rtpTimestampFrequency, + char const* sampling) + : MultiFramedRTPSource(env, RTPgs, rtpPayloadFormat, rtpTimestampFrequency) { + fSampling = strDup(sampling); +} + +JPEG2000VideoRTPSource::~JPEG2000VideoRTPSource() { + delete[] fSampling; +} + +#define JPEG2000_PAYLOAD_HEADER_SIZE 8 + +Boolean JPEG2000VideoRTPSource +::processSpecialHeader(BufferedPacket* packet, + unsigned& resultSpecialHeaderSize) { + unsigned char* headerStart = packet->data(); + unsigned packetSize = packet->dataSize(); + + // There should be enough space for a payload header: + if (packetSize < JPEG2000_PAYLOAD_HEADER_SIZE) return False; + + u_int32_t fragmentOffset = (headerStart[5]<<16)|(headerStart[6]<<8)|(headerStart[7]); + fCurrentPacketBeginsFrame = fragmentOffset == 0; + fCurrentPacketCompletesFrame = packet->rtpMarkerBit(); + + resultSpecialHeaderSize = JPEG2000_PAYLOAD_HEADER_SIZE; + return True; +} + +char const* JPEG2000VideoRTPSource::MIMEtype() const { + return "video/JPEG2000"; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/JPEGVideoRTPSink.cpp b/src/big/mpp/middleware/src/live555/liveMedia/JPEGVideoRTPSink.cpp new file mode 100644 index 000000000..ac49ba0f5 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/JPEGVideoRTPSink.cpp @@ -0,0 +1,145 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP sink for JPEG video (RFC 2435) +// Implementation + +#include "JPEGVideoRTPSink.hh" +#include "JPEGVideoSource.hh" + +JPEGVideoRTPSink +::JPEGVideoRTPSink(UsageEnvironment& env, Groupsock* RTPgs) + : VideoRTPSink(env, RTPgs, 26, 90000, "JPEG") { +} + +JPEGVideoRTPSink::~JPEGVideoRTPSink() { +} + +JPEGVideoRTPSink* +JPEGVideoRTPSink::createNew(UsageEnvironment& env, Groupsock* RTPgs) { + return new JPEGVideoRTPSink(env, RTPgs); +} + +Boolean JPEGVideoRTPSink::sourceIsCompatibleWithUs(MediaSource& source) { + return source.isJPEGVideoSource(); +} + +Boolean JPEGVideoRTPSink +::frameCanAppearAfterPacketStart(unsigned char const* /*frameStart*/, + unsigned /*numBytesInFrame*/) const { + // A packet can contain only one frame + return False; +} + +void JPEGVideoRTPSink +::doSpecialFrameHandling(unsigned fragmentationOffset, + unsigned char* /*frameStart*/, + unsigned /*numBytesInFrame*/, + struct timeval framePresentationTime, + unsigned numRemainingBytes) { + // Our source is known to be a JPEGVideoSource + JPEGVideoSource* source = (JPEGVideoSource*)fSource; + if (source == NULL) return; // sanity check + + u_int8_t mainJPEGHeader[8]; // the special header + u_int8_t const type = source->type(); + + mainJPEGHeader[0] = 0; // Type-specific + mainJPEGHeader[1] = fragmentationOffset >> 16; + mainJPEGHeader[2] = fragmentationOffset >> 8; + mainJPEGHeader[3] = fragmentationOffset; + mainJPEGHeader[4] = type; + mainJPEGHeader[5] = source->qFactor(); + mainJPEGHeader[6] = source->width(); + mainJPEGHeader[7] = source->height(); + setSpecialHeaderBytes(mainJPEGHeader, sizeof mainJPEGHeader); + + unsigned restartMarkerHeaderSize = 0; // by default + if (type >= 64 && type <= 127) { + // There is also a Restart Marker Header: + restartMarkerHeaderSize = 4; + u_int16_t const restartInterval = source->restartInterval(); // should be non-zero + + u_int8_t restartMarkerHeader[4]; + restartMarkerHeader[0] = restartInterval>>8; + restartMarkerHeader[1] = restartInterval&0xFF; + restartMarkerHeader[2] = restartMarkerHeader[3] = 0xFF; // F=L=1; Restart Count = 0x3FFF + + setSpecialHeaderBytes(restartMarkerHeader, restartMarkerHeaderSize, + sizeof mainJPEGHeader/* start position */); + } + + if (fragmentationOffset == 0 && source->qFactor() >= 128) { + // There is also a Quantization Header: + u_int8_t precision; + u_int16_t length; + u_int8_t const* quantizationTables + = source->quantizationTables(precision, length); + + unsigned const quantizationHeaderSize = 4 + length; + u_int8_t* quantizationHeader = new u_int8_t[quantizationHeaderSize]; + + quantizationHeader[0] = 0; // MBZ + quantizationHeader[1] = precision; + quantizationHeader[2] = length >> 8; + quantizationHeader[3] = length&0xFF; + if (quantizationTables != NULL) { // sanity check + for (u_int16_t i = 0; i < length; ++i) { + quantizationHeader[4+i] = quantizationTables[i]; + } + } + + setSpecialHeaderBytes(quantizationHeader, quantizationHeaderSize, + sizeof mainJPEGHeader + restartMarkerHeaderSize/* start position */); + delete[] quantizationHeader; + } + + if (numRemainingBytes == 0) { + // This packet contains the last (or only) fragment of the frame. + // Set the RTP 'M' ('marker') bit: + setMarkerBit(); + } + + // Also set the RTP timestamp: + setTimestamp(framePresentationTime); +} + + +unsigned JPEGVideoRTPSink::specialHeaderSize() const { + // Our source is known to be a JPEGVideoSource + JPEGVideoSource* source = (JPEGVideoSource*)fSource; + if (source == NULL) return 0; // sanity check + + unsigned headerSize = 8; // by default + + u_int8_t const type = source->type(); + if (type >= 64 && type <= 127) { + // There is also a Restart Marker Header: + headerSize += 4; + } + + if (curFragmentationOffset() == 0 && source->qFactor() >= 128) { + // There is also a Quantization Header: + u_int8_t dummy; + u_int16_t quantizationTablesSize; + (void)(source->quantizationTables(dummy, quantizationTablesSize)); + + headerSize += 4 + quantizationTablesSize; + } + + return headerSize; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/JPEGVideoRTPSource.cpp b/src/big/mpp/middleware/src/live555/liveMedia/JPEGVideoRTPSource.cpp new file mode 100644 index 000000000..6185e941d --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/JPEGVideoRTPSource.cpp @@ -0,0 +1,465 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// JPEG Video (RFC 2435) RTP Sources +// Implementation + +#include "JPEGVideoRTPSource.hh" + +////////// JPEGBufferedPacket and JPEGBufferedPacketFactory ////////// + +class JPEGBufferedPacket: public BufferedPacket { +public: + Boolean completesFrame; + +private: + // Redefined virtual functions: + virtual void reset(); + virtual unsigned nextEnclosedFrameSize(unsigned char*& framePtr, + unsigned dataSize); +}; + +class JPEGBufferedPacketFactory: public BufferedPacketFactory { +private: // redefined virtual functions + virtual BufferedPacket* createNewPacket(MultiFramedRTPSource* ourSource); +}; + + +////////// JPEGVideoRTPSource implementation ////////// + +#define BYTE unsigned char +#define WORD unsigned +#define DWORD unsigned long + +JPEGVideoRTPSource* +JPEGVideoRTPSource::createNew(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency, + unsigned defaultWidth, unsigned defaultHeight) { + return new JPEGVideoRTPSource(env, RTPgs, rtpPayloadFormat, + rtpTimestampFrequency, defaultWidth, defaultHeight); +} + +JPEGVideoRTPSource::JPEGVideoRTPSource(UsageEnvironment& env, + Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency, + unsigned defaultWidth, unsigned defaultHeight) + : MultiFramedRTPSource(env, RTPgs, + rtpPayloadFormat, rtpTimestampFrequency, + new JPEGBufferedPacketFactory), + fDefaultWidth(defaultWidth), fDefaultHeight(defaultHeight) { +} + +JPEGVideoRTPSource::~JPEGVideoRTPSource() { +} + +enum { + MARKER_SOF0 = 0xc0, // start-of-frame, baseline scan + MARKER_SOI = 0xd8, // start of image + MARKER_EOI = 0xd9, // end of image + MARKER_SOS = 0xda, // start of scan + MARKER_DRI = 0xdd, // restart interval + MARKER_DQT = 0xdb, // define quantization tables + MARKER_DHT = 0xc4, // huffman tables + MARKER_APP_FIRST = 0xe0, + MARKER_APP_LAST = 0xef, + MARKER_COMMENT = 0xfe, +}; + +static unsigned char const lum_dc_codelens[] = { + 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, +}; + +static unsigned char const lum_dc_symbols[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, +}; + +static unsigned char const lum_ac_codelens[] = { + 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d, +}; + +static unsigned char const lum_ac_symbols[] = { + 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, + 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, + 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08, + 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0, + 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16, + 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28, + 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, + 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, + 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, + 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, + 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, + 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, + 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, + 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, + 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, + 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, + 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2, + 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, + 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, + 0xf9, 0xfa, +}; + +static unsigned char const chm_dc_codelens[] = { + 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, +}; + +static unsigned char const chm_dc_symbols[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, +}; + +static unsigned char const chm_ac_codelens[] = { + 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77, +}; + +static unsigned char const chm_ac_symbols[] = { + 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, + 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, + 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, + 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, + 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34, + 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26, + 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38, + 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, + 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, + 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, + 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, + 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, + 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, + 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, + 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, + 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, + 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, + 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, + 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, + 0xf9, 0xfa, +}; + +static void createHuffmanHeader(unsigned char*& p, + unsigned char const* codelens, + int ncodes, + unsigned char const* symbols, + int nsymbols, + int tableNo, int tableClass) { + *p++ = 0xff; *p++ = MARKER_DHT; + *p++ = 0; /* length msb */ + *p++ = 3 + ncodes + nsymbols; /* length lsb */ + *p++ = (tableClass << 4) | tableNo; + memcpy(p, codelens, ncodes); + p += ncodes; + memcpy(p, symbols, nsymbols); + p += nsymbols; +} + +static unsigned computeJPEGHeaderSize(unsigned qtlen, unsigned dri) { + unsigned qtlen_half = qtlen/2; // in case qtlen is odd; shouldn't happen + qtlen = qtlen_half*2; + + unsigned numQtables = qtlen > 64 ? 2 : 1; + return 485 + numQtables*5 + qtlen + (dri > 0 ? 6 : 0); +} + +static void createJPEGHeader(unsigned char* buf, unsigned type, + unsigned w, unsigned h, + unsigned char const* qtables, unsigned qtlen, + unsigned dri) { + unsigned char *ptr = buf; + unsigned numQtables = qtlen > 64 ? 2 : 1; + + // MARKER_SOI: + *ptr++ = 0xFF; *ptr++ = MARKER_SOI; + + // MARKER_APP_FIRST: + *ptr++ = 0xFF; *ptr++ = MARKER_APP_FIRST; + *ptr++ = 0x00; *ptr++ = 0x10; // size of chunk + *ptr++ = 'J'; *ptr++ = 'F'; *ptr++ = 'I'; *ptr++ = 'F'; *ptr++ = 0x00; + *ptr++ = 0x01; *ptr++ = 0x01; // JFIF format version (1.1) + *ptr++ = 0x00; // no units + *ptr++ = 0x00; *ptr++ = 0x01; // Horizontal pixel aspect ratio + *ptr++ = 0x00; *ptr++ = 0x01; // Vertical pixel aspect ratio + *ptr++ = 0x00; *ptr++ = 0x00; // no thumbnail + + // MARKER_DRI: + if (dri > 0) { + *ptr++ = 0xFF; *ptr++ = MARKER_DRI; + *ptr++ = 0x00; *ptr++ = 0x04; // size of chunk + *ptr++ = (BYTE)(dri >> 8); *ptr++ = (BYTE)(dri); // restart interval + } + + // MARKER_DQT (luma): + unsigned tableSize = numQtables == 1 ? qtlen : qtlen/2; + *ptr++ = 0xFF; *ptr++ = MARKER_DQT; + *ptr++ = 0x00; *ptr++ = tableSize + 3; // size of chunk + *ptr++ = 0x00; // precision(0), table id(0) + memcpy(ptr, qtables, tableSize); + qtables += tableSize; + ptr += tableSize; + + if (numQtables > 1) { + unsigned tableSize = qtlen - qtlen/2; + // MARKER_DQT (chroma): + *ptr++ = 0xFF; *ptr++ = MARKER_DQT; + *ptr++ = 0x00; *ptr++ = tableSize + 3; // size of chunk + *ptr++ = 0x01; // precision(0), table id(1) + memcpy(ptr, qtables, tableSize); + qtables += tableSize; + ptr += tableSize; + } + + // MARKER_SOF0: + *ptr++ = 0xFF; *ptr++ = MARKER_SOF0; + *ptr++ = 0x00; *ptr++ = 0x11; // size of chunk + *ptr++ = 0x08; // sample precision + *ptr++ = (BYTE)(h >> 8); + *ptr++ = (BYTE)(h); // number of lines (must be a multiple of 8) + *ptr++ = (BYTE)(w >> 8); + *ptr++ = (BYTE)(w); // number of columns (must be a multiple of 8) + *ptr++ = 0x03; // number of components + *ptr++ = 0x01; // id of component + *ptr++ = type ? 0x22 : 0x21; // sampling ratio (h,v) + *ptr++ = 0x00; // quant table id + *ptr++ = 0x02; // id of component + *ptr++ = 0x11; // sampling ratio (h,v) + *ptr++ = numQtables == 1 ? 0x00 : 0x01; // quant table id + *ptr++ = 0x03; // id of component + *ptr++ = 0x11; // sampling ratio (h,v) + *ptr++ = numQtables == 1 ? 0x00 : 0x01; // quant table id + + createHuffmanHeader(ptr, lum_dc_codelens, sizeof lum_dc_codelens, + lum_dc_symbols, sizeof lum_dc_symbols, 0, 0); + createHuffmanHeader(ptr, lum_ac_codelens, sizeof lum_ac_codelens, + lum_ac_symbols, sizeof lum_ac_symbols, 0, 1); + createHuffmanHeader(ptr, chm_dc_codelens, sizeof chm_dc_codelens, + chm_dc_symbols, sizeof chm_dc_symbols, 1, 0); + createHuffmanHeader(ptr, chm_ac_codelens, sizeof chm_ac_codelens, + chm_ac_symbols, sizeof chm_ac_symbols, 1, 1); + + // MARKER_SOS: + *ptr++ = 0xFF; *ptr++ = MARKER_SOS; + *ptr++ = 0x00; *ptr++ = 0x0C; // size of chunk + *ptr++ = 0x03; // number of components + *ptr++ = 0x01; // id of component + *ptr++ = 0x00; // huffman table id (DC, AC) + *ptr++ = 0x02; // id of component + *ptr++ = 0x11; // huffman table id (DC, AC) + *ptr++ = 0x03; // id of component + *ptr++ = 0x11; // huffman table id (DC, AC) + *ptr++ = 0x00; // start of spectral + *ptr++ = 0x3F; // end of spectral + *ptr++ = 0x00; // successive approximation bit position (high, low) +} + +// The default 'luma' and 'chroma' quantizer tables, in zigzag order: +static unsigned char const defaultQuantizers[128] = { + // luma table: + 16, 11, 12, 14, 12, 10, 16, 14, + 13, 14, 18, 17, 16, 19, 24, 40, + 26, 24, 22, 22, 24, 49, 35, 37, + 29, 40, 58, 51, 61, 60, 57, 51, + 56, 55, 64, 72, 92, 78, 64, 68, + 87, 69, 55, 56, 80, 109, 81, 87, + 95, 98, 103, 104, 103, 62, 77, 113, + 121, 112, 100, 120, 92, 101, 103, 99, + // chroma table: + 17, 18, 18, 24, 21, 24, 47, 26, + 26, 47, 99, 66, 56, 66, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99 +}; + +static void makeDefaultQtables(unsigned char* resultTables, unsigned Q) { + int factor = Q; + int q; + + if (Q < 1) factor = 1; + else if (Q > 99) factor = 99; + + if (Q < 50) { + q = 5000 / factor; + } else { + q = 200 - factor*2; + } + + for (int i = 0; i < 128; ++i) { + int newVal = (defaultQuantizers[i]*q + 50)/100; + if (newVal < 1) newVal = 1; + else if (newVal > 255) newVal = 255; + resultTables[i] = newVal; + } +} + +Boolean JPEGVideoRTPSource +::processSpecialHeader(BufferedPacket* packet, + unsigned& resultSpecialHeaderSize) { + unsigned char* headerStart = packet->data(); + unsigned packetSize = packet->dataSize(); + + unsigned char* qtables = NULL; + unsigned qtlen = 0; + unsigned dri = 0; + + // There's at least 8-byte video-specific header + /* +0 1 2 3 +0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| Type-specific | Fragment Offset | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| Type | Q | Width | Height | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ + if (packetSize < 8) return False; + + resultSpecialHeaderSize = 8; + + unsigned Offset = (unsigned)((DWORD)headerStart[1] << 16 | (DWORD)headerStart[2] << 8 | (DWORD)headerStart[3]); + unsigned Type = (unsigned)headerStart[4]; + unsigned type = Type & 1; + unsigned Q = (unsigned)headerStart[5]; + unsigned width = (unsigned)headerStart[6] * 8; + unsigned height = (unsigned)headerStart[7] * 8; + if ((width == 0 || height == 0) && fDefaultWidth != 0 && fDefaultHeight != 0) { + // Use the default width and height parameters instead: + width = fDefaultWidth; + height = fDefaultHeight; + } + if (width == 0) width = 256*8; // special case + if (height == 0) height = 256*8; // special case + + if (Type > 63) { + // Restart Marker header present + /* +0 1 2 3 +0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| Restart Interval |F|L| Restart Count | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + */ + if (packetSize < resultSpecialHeaderSize + 4) return False; + + unsigned RestartInterval = (unsigned)((WORD)headerStart[resultSpecialHeaderSize] << 8 | (WORD)headerStart[resultSpecialHeaderSize + 1]); + dri = RestartInterval; + resultSpecialHeaderSize += 4; + } + + if (Offset == 0) { + if (Q > 127) { + // Quantization Table header present +/* +0 1 2 3 +0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| MBZ | Precision | Length | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| Quantization Table Data | +| ... | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +*/ + if (packetSize < resultSpecialHeaderSize + 4) return False; + + unsigned MBZ = (unsigned)headerStart[resultSpecialHeaderSize]; + if (MBZ == 0) { + // unsigned Precision = (unsigned)headerStart[resultSpecialHeaderSize + 1]; + unsigned Length = (unsigned)((WORD)headerStart[resultSpecialHeaderSize + 2] << 8 | (WORD)headerStart[resultSpecialHeaderSize + 3]); + + //ASSERT(Length == 128); + + resultSpecialHeaderSize += 4; + + if (packetSize < resultSpecialHeaderSize + Length) return False; + + qtlen = Length; + qtables = &headerStart[resultSpecialHeaderSize]; + + resultSpecialHeaderSize += Length; + } + } + } + + // If this is the first (or only) fragment of a JPEG frame, then we need + // to synthesize a JPEG header, and prepend it to the incoming data. + // Hack: We can do this because we allowed space for it in + // our special "JPEGBufferedPacket" subclass. We also adjust + // "resultSpecialHeaderSize" to compensate for this, by subtracting + // the size of the synthesized header. Note that this will cause + // "resultSpecialHeaderSize" to become negative, but the code that called + // us (in "MultiFramedRTPSource") will handle this properly. + if (Offset == 0) { + unsigned char newQtables[128]; + if (qtlen == 0) { + // A quantization table was not present in the RTP JPEG header, + // so use the default tables, scaled according to the "Q" factor: + makeDefaultQtables(newQtables, Q); + qtables = newQtables; + qtlen = sizeof newQtables; + } + + unsigned hdrlen = computeJPEGHeaderSize(qtlen, dri); + resultSpecialHeaderSize -= hdrlen; // goes negative + headerStart += (int)resultSpecialHeaderSize; // goes backward + createJPEGHeader(headerStart, type, width, height, qtables, qtlen, dri); + } + + fCurrentPacketBeginsFrame = (Offset == 0); + + // The RTP "M" (marker) bit indicates the last fragment of a frame: + ((JPEGBufferedPacket*)packet)->completesFrame + = fCurrentPacketCompletesFrame = packet->rtpMarkerBit(); + + return True; +} + +char const* JPEGVideoRTPSource::MIMEtype() const { + return "video/JPEG"; +} + +////////// JPEGBufferedPacket and JPEGBufferedPacketFactory implementation + +void JPEGBufferedPacket::reset() { + BufferedPacket::reset(); + + // Move our "fHead" and "fTail" forward, to allow space for a synthesized + // JPEG header to precede the RTP data that comes in over the network. + unsigned offset = MAX_JPEG_HEADER_SIZE; + if (offset > fPacketSize) offset = fPacketSize; // shouldn't happen + fHead = fTail = offset; +} + +unsigned JPEGBufferedPacket +::nextEnclosedFrameSize(unsigned char*& framePtr, unsigned dataSize) { + // Normally, the enclosed frame size is just "dataSize". If, however, + // the frame does not end with the "EOI" marker, then add this now: + if (completesFrame && dataSize >= 2 && + !(framePtr[dataSize-2] == 0xFF && framePtr[dataSize-1] == MARKER_EOI)) { + framePtr[dataSize++] = 0xFF; + framePtr[dataSize++] = MARKER_EOI; + } + return dataSize; +} + +BufferedPacket* JPEGBufferedPacketFactory +::createNewPacket(MultiFramedRTPSource* /*ourSource*/) { + return new JPEGBufferedPacket; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/JPEGVideoSource.cpp b/src/big/mpp/middleware/src/live555/liveMedia/JPEGVideoSource.cpp new file mode 100644 index 000000000..bf7149e39 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/JPEGVideoSource.cpp @@ -0,0 +1,45 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// JPEG video sources +// Implementation + +#include "JPEGVideoSource.hh" + +JPEGVideoSource::JPEGVideoSource(UsageEnvironment& env) + : FramedSource(env) { +} + +JPEGVideoSource::~JPEGVideoSource() { +} + +u_int8_t const* JPEGVideoSource::quantizationTables(u_int8_t& precision, + u_int16_t& length) { + // Default implementation + precision = 0; + length = 0; + return NULL; +} + +u_int16_t JPEGVideoSource::restartInterval() { + // Default implementation + return 0; +} + +Boolean JPEGVideoSource::isJPEGVideoSource() const { + return True; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/Locale.cpp b/src/big/mpp/middleware/src/live555/liveMedia/Locale.cpp new file mode 100644 index 000000000..d6d80098e --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/Locale.cpp @@ -0,0 +1,60 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Support for temporarily setting the locale (e.g., to "C" or "POSIX") for (e.g.) parsing or printing +// floating-point numbers in protocol headers, or calling toupper()/tolower() on human-input strings. +// Implementation + +#include "Locale.hh" +#include + +Locale::Locale(char const* newLocale, LocaleCategory category) { +#ifndef LOCALE_NOT_USED +#ifndef NEWLOCALE_NOT_USED + int categoryMask; + switch (category) { + case All: { categoryMask = LC_ALL_MASK; break; } + case Numeric: { categoryMask = LC_NUMERIC_MASK; break; } + } + fLocale = newlocale(categoryMask, newLocale, NULL); + fPrevLocale = uselocale(fLocale); +#else + switch (category) { + case All: { fCategoryNum = LC_ALL; break; } + case Numeric: { fCategoryNum = LC_NUMERIC; break; } + } + fPrevLocale = strDup(setlocale(fCategoryNum, NULL)); + setlocale(fCategoryNum, newLocale); +#endif +#endif +} + +Locale::~Locale() { +#ifndef LOCALE_NOT_USED +#ifndef NEWLOCALE_NOT_USED + if (fLocale != (locale_t)0) { + uselocale(fPrevLocale); + freelocale(fLocale); + } +#else + if (fPrevLocale != NULL) { + setlocale(fCategoryNum, fPrevLocale); + delete[] fPrevLocale; + } +#endif +#endif +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MIKEY.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MIKEY.cpp new file mode 100644 index 000000000..600a585cc --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MIKEY.cpp @@ -0,0 +1,598 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A data structure that implements a MIKEY message (RFC 3830) +// Implementation + +#include "MIKEY.hh" +#include // for our_random32() + +////////// MIKEYPayload definition ///////// + +class MIKEYPayload { +public: + MIKEYPayload(MIKEYState& ourMIKEYState, u_int8_t payloadType); + // create with default values + MIKEYPayload(MIKEYState& ourMIKEYState, u_int8_t payloadType, + u_int8_t const* data, unsigned dataSize); + // create as a copy of existing values + + virtual ~MIKEYPayload(); + + u_int8_t const* data() const { return fData; } + unsigned dataSize() const { return fDataSize; } + + MIKEYPayload* next() const { return fNext; } + void setNextPayload(MIKEYPayload* nextPayload); + +private: + MIKEYState& fOurMIKEYState; + u_int8_t fPayloadType; + u_int8_t* fData; + unsigned fDataSize; + MIKEYPayload* fNext; +}; + + +////////// MIKEYState implementation ////////// + +enum MIKEYPayloadType { + KEMAC = 1, + PKE = 2, + DH = 3, + SIGN = 4, + T = 5, + ID = 6, + CERT = 7, + CHASH = 8, + V = 9, + SP = 10, + RAND = 11, + ERR = 12, + KEY_DATA = 13, + HDR = 255 +}; + +MIKEYState::MIKEYState(Boolean useEncryption) + : // Set default encryption/authentication parameters: + fEncryptSRTP(useEncryption), + fEncryptSRTCP(useEncryption), + fMKI(our_random32()), + fUseAuthentication(True), + + fHeaderPayload(NULL), fTailPayload(NULL), fTotalPayloadByteCount(0) { + // Fill in our 'key data' (30 bytes) with (pseudo-)random bits: + u_int8_t* p = &fKeyData[0]; + u_int32_t random32; + random32 = our_random32(); + *p++ = (random32>>24); *p++ = (random32>>16); *p++ = (random32>>8); *p++ = random32; // 0-3 + random32 = our_random32(); + *p++ = (random32>>24); *p++ = (random32>>16); *p++ = (random32>>8); *p++ = random32; // 4-7 + random32 = our_random32(); + *p++ = (random32>>24); *p++ = (random32>>16); *p++ = (random32>>8); *p++ = random32; // 8-11 + random32 = our_random32(); + *p++ = (random32>>24); *p++ = (random32>>16); *p++ = (random32>>8); *p++ = random32; // 12-15 + random32 = our_random32(); + *p++ = (random32>>24); *p++ = (random32>>16); *p++ = (random32>>8); *p++ = random32; // 16-19 + random32 = our_random32(); + *p++ = (random32>>24); *p++ = (random32>>16); *p++ = (random32>>8); *p++ = random32; // 20-23 + random32 = our_random32(); + *p++ = (random32>>24); *p++ = (random32>>16); *p++ = (random32>>8); *p++ = random32; // 24-27 + random32 = our_random32(); + *p++ = (random32>>24); *p++ = (random32>>16); // 28-29 + + addNewPayload(new MIKEYPayload(*this, HDR)); + addNewPayload(new MIKEYPayload(*this, T)); + addNewPayload(new MIKEYPayload(*this, RAND)); + addNewPayload(new MIKEYPayload(*this, SP)); + addNewPayload(new MIKEYPayload(*this, KEMAC)); +} + +MIKEYState::~MIKEYState() { + delete fHeaderPayload; // which will delete all the other payloads as well +} + +MIKEYState* MIKEYState::createNew(u_int8_t const* messageToParse, unsigned messageSize) { + Boolean parsedOK; + MIKEYState* newMIKEYState = new MIKEYState(messageToParse, messageSize, parsedOK); + + if (!parsedOK) { + delete newMIKEYState; + newMIKEYState = NULL; + } + + return newMIKEYState; +} + +u_int8_t* MIKEYState::generateMessage(unsigned& messageSize) const { + if (fTotalPayloadByteCount == 0) return NULL; + + // ASSERT: fTotalPayloadByteCount == the sum of all of the payloads' "fDataSize"s + messageSize = fTotalPayloadByteCount; + u_int8_t* resultMessage = new u_int8_t[messageSize]; + u_int8_t* p = resultMessage; + + for (MIKEYPayload* payload = fHeaderPayload; payload != NULL; payload = payload->next()) { + if (payload->data() == NULL) continue; + + memcpy(p, payload->data(), payload->dataSize()); + p += payload->dataSize(); + } + + return resultMessage; +} + +MIKEYState::MIKEYState(u_int8_t const* messageToParse, unsigned messageSize, Boolean& parsedOK) + : // Set encryption/authentication parameters to default values (that may be overwritten + // later as we parse the message): + fEncryptSRTP(False), + fEncryptSRTCP(False), + fUseAuthentication(False), + + fHeaderPayload(NULL), fTailPayload(NULL), fTotalPayloadByteCount(0) { + parsedOK = False; // unless we learn otherwise + + // Begin by parsing a HDR payload: + u_int8_t const* ptr = messageToParse; + u_int8_t const* const endPtr = messageToParse + messageSize; + u_int8_t nextPayloadType; + + if (!parseHDRPayload(ptr, endPtr, nextPayloadType)) return; + + // Then parse each subsequent payload that we see: + while (nextPayloadType != 0) { + if (!parseNonHDRPayload(ptr, endPtr, nextPayloadType)) return; + } + + // We succeeded in parsing all the data: + parsedOK = True; +} + +void MIKEYState::addNewPayload(MIKEYPayload* newPayload) { + if (fTailPayload == NULL) { + fHeaderPayload = newPayload; + } else { + fTailPayload->setNextPayload(newPayload); + } + fTailPayload = newPayload; + + fTotalPayloadByteCount += newPayload->dataSize(); +} + +#define testSize(n) if (ptr + (n) > endPtr) break + +Boolean MIKEYState +::parseHDRPayload(u_int8_t const*& ptr, u_int8_t const* endPtr, u_int8_t& nextPayloadType) { + do { + testSize(10); + nextPayloadType = ptr[2]; + u_int8_t numCryptoSessions = ptr[8]; + + unsigned payloadSize = 10 + numCryptoSessions*(1+4+4); + testSize(payloadSize); + + addNewPayload(new MIKEYPayload(*this, HDR, ptr, payloadSize)); + ptr += payloadSize; + + return True; + } while (0); + + // An error occurred: + return False; +} + +static u_int32_t get4Bytes(u_int8_t const*& ptr) { + u_int32_t result = (ptr[0]<<24)|(ptr[1]<<16)|(ptr[2]<<8)|ptr[3]; + ptr += 4; + return result; +} + +static u_int16_t get2Bytes(u_int8_t const*& ptr) { + u_int16_t result = (ptr[0]<<8)|ptr[1]; + ptr += 2; + return result; +} + +Boolean MIKEYState +::parseNonHDRPayload(u_int8_t const*& ptr, u_int8_t const* endPtr, u_int8_t& nextPayloadType) { + do { + Boolean parseSucceeded = False; // initially + u_int8_t const* payloadStart = ptr; + unsigned payloadSize = 0; + + testSize(1); + u_int8_t ourPayloadType = nextPayloadType; + nextPayloadType = *ptr++; + + // The parsing depends on "ourPayloadType": + switch (ourPayloadType) { + case T: { // RFC 3830, section 6.6 + testSize(1); + u_int8_t TS_type = *ptr++; + unsigned TS_value_len = 0; + switch (TS_type) { + case 0: // NTP-UTC + case 1: { // NTP + TS_value_len = 8; + break; + } + case 2: { // COUNTER + TS_value_len = 4; + break; + } + } + if (TS_value_len == 0) break; // unknown TS_type + + testSize(TS_value_len); + payloadSize = 2 + TS_value_len; + parseSucceeded = True; + break; + } + case RAND: { // RFC 3830, section 6.11 + testSize(1); + u_int8_t RAND_len = *ptr++; + + testSize(RAND_len); + payloadSize = 2 + RAND_len; + parseSucceeded = True; + break; + } + case SP: { // RFC 3830, section 6.10 + testSize(4); + ++ptr; // skip over "Policy no" + u_int8_t protType = *ptr++; + if (protType != 0/*SRTP*/) break; // unsupported protocol type + + u_int16_t policyParam_len = get2Bytes(ptr); + + testSize(policyParam_len); + payloadSize = 5 + policyParam_len; + u_int8_t const* payloadEndPtr = payloadStart + payloadSize; + // Look through the "Policy param" section, making sure that: + // - each of the "length" fields make sense + // - for "type"s that we understand, the values make sense + Boolean parsedPolicyParamSection = False; + while (1) { + testSize(2); + u_int8_t ppType = *ptr++; + u_int8_t ppLength = *ptr++; + + testSize(ppLength); + if (ptr+ppLength > payloadEndPtr) break; // bad "length"s - too big for the payload + + // Check types that we understand: + Boolean policyIsOK = False; // until we learn otherwise + switch (ppType) { + case 0: { // Encryption algorithm: we handle only NULL and AES-CM + if (ppLength != 1) break; + u_int8_t value = ptr[0]; + if (value > 1) break; // unsupported algorithm + if (value > 0) fEncryptSRTP = fEncryptSRTCP = True; + // Note: these might get changed by a subsequent "off/on" entry + policyIsOK = True; + break; + } + case 1: { // Session Encr. key length + if (ppLength != 1) break; + u_int8_t value = ptr[0]; + if (value != 16) break; // bad/unsupported value + policyIsOK = True; + break; + } + case 2: { // Authentication algorithm: we handle only NULL and HMAC-SHA-1 + if (ppLength != 1) break; + u_int8_t value = ptr[0]; + if (value > 1) break; // unsupported algorithm + if (value > 0) fUseAuthentication = True; + // Note: this might get changed by a subsequent "off/on" entry + policyIsOK = True; + break; + } + case 3: { // Session Auth. key length + if (ppLength != 1) break; + u_int8_t value = ptr[0]; + if (value != 20) break; // bad/unsupported value + policyIsOK = True; + break; + } + case 4: { // Session Salt key length + if (ppLength != 1) break; + u_int8_t value = ptr[0]; + if (value != 14) break; // bad/unsupported value + policyIsOK = True; + break; + } + case 7: { // SRTP encryption off/on + if (ppLength != 1) break; + u_int8_t value = ptr[0]; + if (value > 1) break; // bad/unsupported value + fEncryptSRTP = value; + policyIsOK = True; + break; + } + case 8: { // SRTCP encryption off/on + if (ppLength != 1) break; + u_int8_t value = ptr[0]; + if (value > 1) break; // bad/unsupported value + fEncryptSRTCP = value; + policyIsOK = True; + break; + } + case 10: { // SRTP authentication off/on + if (ppLength != 1) break; + u_int8_t value = ptr[0]; + if (value > 1) break; // bad/unsupported value + fUseAuthentication = value; + policyIsOK = True; + break; + } + case 11: { // Authentication tag length + if (ppLength != 1) break; + u_int8_t value = ptr[0]; + if (value != 10) break; // bad/unsupported value + policyIsOK = True; + break; + } + default: { // a policy type that we don't handle; still OK + policyIsOK = True; + break; + } + } + if (!policyIsOK) break; + + ptr += ppLength; + if (ptr == payloadEndPtr) { + // We've successfully checked all of the "Policy param"s + parsedPolicyParamSection = True; + break; + } + } + if (!parsedPolicyParamSection) break; + parseSucceeded = True; + break; + } + case KEMAC: { // RFC 3830, section 6.2 + testSize(3); + u_int8_t encrAlg = *ptr++; + // We currently support only 'NULL' encryption on the key data: + if (encrAlg != 0/*NULL*/) break; // unknown or unsupported key encryption + + u_int16_t encrDataLen = get2Bytes(ptr); + + testSize(encrDataLen); + // Parse the 'key data sub-payload': + { + u_int8_t const* subPtr = ptr; + if (encrDataLen < 4) break; // not enough space + ++subPtr; // skip over the "Next payload" field + + // Check the "Type" and "KV" fields; we support only TEK and SPI/MKI + // Note: This means that we'll reject the "a=key-mgmt" SDP MIKEY data from + // an Axis camera, because that doesn't specify SPI/MKI. But that's what + // we want, because the Axis camera's "a=key-mgmt" SDP MIKEY data is meant + // to be ignored by clients. + if (*subPtr++ != ((2<<4)|1)) break; // Type 2 (TEK) | KV 1 (SPI/MKI) + u_int16_t keyDataLen = get2Bytes(subPtr); + // The key data length must be 30 (encryption key length (16) + salt length (14)): + if (keyDataLen != 30) break; + + // Make sure we have enough space for the key data and the "SPI Length" field: + if (4+keyDataLen+1 > encrDataLen) break; + // Record the key data: + memmove(fKeyData, subPtr, keyDataLen); + subPtr += keyDataLen; + + // Check the "SPI Length"; we support only length 4: + u_int8_t SPILength = *subPtr++; + if (SPILength != 4) break; + + // Make a note of the MKI (the next 4 bytes): + if (4+keyDataLen+1+SPILength > encrDataLen) break; + fMKI = get4Bytes(subPtr); + } + ptr += encrDataLen; + + testSize(1); + u_int8_t macAlg = *ptr++; + unsigned macLen; + // We currently support only a 'NULL' MAC on the key data: + if (macAlg == 0/*NULL*/) macLen = 0; + else break; // unknown or unsupported MAC algorithm => parse fails + + testSize(macLen); + payloadSize = 4 + encrDataLen + 1 + macLen; + parseSucceeded = True; + break; + } + default: { + // Unknown payload type. The parsing fails. + break; + } + } + if (!parseSucceeded) break; + + addNewPayload(new MIKEYPayload(*this, ourPayloadType, payloadStart, payloadSize)); + ptr = payloadStart + payloadSize; + + return True; + } while (0); + + // An error occurred: + return False; +} + + +////////// MIKEYPayload implementation ////////// + +static void addWord(u_int8_t*& p, u_int32_t word) { + *p++ = word>>24; *p++ = word>>16; *p++ = word>>8; *p++ = word; +} + +static void addHalfWord(u_int8_t*& p, u_int16_t halfWord) { + *p++ = halfWord>>8; *p++ = halfWord; +} + +static void add1BytePolicyParam(u_int8_t*& p, u_int8_t type, u_int8_t value) { + *p++ = type; + *p++ = 1; // length + *p++ = value; +} + +MIKEYPayload::MIKEYPayload(MIKEYState& ourMIKEYState, u_int8_t payloadType) + : fOurMIKEYState(ourMIKEYState), fPayloadType(payloadType), fNext(NULL) { + switch (payloadType) { + case HDR: { // RFC 3830, section 6.1 + fDataSize = 19; + fData = new u_int8_t[fDataSize]; + u_int8_t* p = fData; + *p++ = 1; // version + *p++ = 0; // Initiator's pre-shared key message + *p++ = 0; // no next payload (initially) + *p++ = 0; // V=0; PRF func: MIKEY-1 + u_int32_t const CSB_ID = our_random32(); + addWord(p, CSB_ID); + *p++ = 1; // #CS: 1 + *p++ = 0; // CS ID map type: SRTP-ID + *p++ = 0; // Policy_no_1 + addWord(p, our_random32()); // SSRC_1 + addWord(p, 0x00000000); // ROC_1 + break; + } + case T: { // RFC 3830, section 6.6 + fDataSize = 10; + fData = new u_int8_t[fDataSize]; + u_int8_t* p = fData; + *p++ = 0; // no next payload (initially) + *p++ = 0; // TS type: NTP-UTC + + // Get the current time, and convert it to a NTP-UTC time: + struct timeval timeNow; + gettimeofday(&timeNow, NULL); + u_int32_t ntpSeconds = timeNow.tv_sec + 0x83AA7E80; // 1970 epoch -> 1900 epoch + addWord(p, ntpSeconds); + double fractionalPart = (timeNow.tv_usec/15625.0)*0x04000000; // 2^32/10^6 + u_int32_t ntpFractionOfSecond = (u_int32_t)(fractionalPart+0.5); // round + addWord(p, ntpFractionOfSecond); + break; + } + case RAND: { // RFC 3830, section 6.11 + fDataSize = 18; + fData = new u_int8_t[fDataSize]; + u_int8_t* p = fData; + *p++ = 0; // no next payload (initially) + unsigned const numRandomWords = 4; // number of 32-bit words making up the RAND value + *p++ = 4*numRandomWords; // RAND len (in bytes) + for (unsigned i = 0; i < numRandomWords; ++i) { + u_int32_t randomNumber = our_random32(); + addWord(p, randomNumber); + } + break; + } + case SP: { // RFC 3830, section 6.10 + fDataSize = 32; + fData = new u_int8_t[fDataSize]; + u_int8_t* p = fData; + *p++ = 0; // no next payload (initially) + *p++ = 0; // Policy number + *p++ = 0; // Protocol type: SRTP + u_int16_t policyParamLen = 27; + addHalfWord(p, policyParamLen); + // Now add the SRTP policy parameters: + add1BytePolicyParam(p, 0/*Encryption algorithm*/, + (fOurMIKEYState.encryptSRTP()||fOurMIKEYState.encryptSRTCP()) + ? 1/*AES-CM*/ : 0/*NULL*/); + add1BytePolicyParam(p, 1/*Session Encryption key length*/, 16); + add1BytePolicyParam(p, 2/*Authentication algorithm*/, + fOurMIKEYState.useAuthentication() + ? 1/*HMAC-SHA-1*/ : 0/*NULL*/); + add1BytePolicyParam(p, 3/*Session Authentication key length*/, 20); + add1BytePolicyParam(p, 4/*Session Salt key length*/, 14); + add1BytePolicyParam(p, 7/*SRTP encryption off/on*/, fOurMIKEYState.encryptSRTP()); + add1BytePolicyParam(p, 8/*SRTCP encryption off/on*/, fOurMIKEYState.encryptSRTCP()); + add1BytePolicyParam(p, 10/*SRTP authentication off/on*/, fOurMIKEYState.useAuthentication()); + add1BytePolicyParam(p, 11/*Authentication tag length*/, 10); + break; + } + case KEMAC: { // RFC 3830, section 6.2 + fDataSize = 44; + fData = new u_int8_t[fDataSize]; + u_int8_t* p = fData; + *p++ = 0; // no next payload + *p++ = 0; // Encr alg (NULL) + u_int16_t encrDataLen = 39; + addHalfWord(p, encrDataLen); + { // Key data sub-payload (RFC 3830, section 6.13): + *p++ = 0; // no next payload + *p++ = (2<<4)|1; // Type 2 (TEK) | KV 1 (SPI/MKI) + + // Key data len: + u_int16_t const keyDataLen = 30; + addHalfWord(p, keyDataLen); + + // Key data: + memcpy(p, fOurMIKEYState.keyData(), keyDataLen); + p += keyDataLen; + + { // KV data (for SPI/MKI) (RFC 3830, section 6.14): + *p++ = 4; // SPI/MKI Length + addWord(p, fOurMIKEYState.MKI()); + } + } + *p++ = 0; // MAC alg (NULL) + break; + } + default: { + // Unused payload type. Just in case, allocate 1 byte, for the + // presumed 'next payload type' field. + fDataSize = 1; + fData = new u_int8_t[fDataSize]; + fData[0] = 0; + break; + } + } +} + +MIKEYPayload::MIKEYPayload(MIKEYState& ourMIKEYState, u_int8_t payloadType, + u_int8_t const* data, unsigned dataSize) + : fOurMIKEYState(ourMIKEYState), fPayloadType(payloadType), + fDataSize(dataSize), fNext(NULL) { + fData = new u_int8_t[fDataSize]; + memcpy(fData, data, fDataSize); +} + +MIKEYPayload::~MIKEYPayload() { + delete[] fData; + delete fNext; +} + +void MIKEYPayload::setNextPayload(MIKEYPayload* nextPayload) { + fNext = nextPayload; + + // We also need to set the 'next payload type' field in our data: + u_int8_t nextPayloadType = nextPayload->fPayloadType; + + switch (fPayloadType) { + case HDR: { + fData[2] = nextPayloadType; + break; + } + default: { + if (fData != NULL) fData[0] = nextPayloadType; + break; + } + } +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MP3ADU.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MP3ADU.cpp new file mode 100644 index 000000000..9e8fe1e2a --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MP3ADU.cpp @@ -0,0 +1,634 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// 'ADU' MP3 streams (for improved loss-tolerance) +// Implementation + +#include "MP3ADU.hh" +#include "MP3ADUdescriptor.hh" +#include "MP3Internals.hh" +#include + +#ifdef TEST_LOSS +#include "GroupsockHelper.hh" +#endif + +// Segment data structures, used in the implementation below: + +#define SegmentBufSize 2000 /* conservatively high */ + +class Segment { +public: + unsigned char buf[SegmentBufSize]; + unsigned char* dataStart() { return &buf[descriptorSize]; } + unsigned frameSize; // if it's a non-ADU frame + unsigned dataHere(); // if it's a non-ADU frame + + unsigned descriptorSize; + static unsigned const headerSize; + unsigned sideInfoSize, aduSize; + unsigned backpointer; + + struct timeval presentationTime; + unsigned durationInMicroseconds; +}; + +unsigned const Segment::headerSize = 4; + +#define SegmentQueueSize 20 + +class SegmentQueue { +public: + SegmentQueue(Boolean directionIsToADU, Boolean includeADUdescriptors) + : fDirectionIsToADU(directionIsToADU), + fIncludeADUdescriptors(includeADUdescriptors) { + reset(); + } + + Segment s[SegmentQueueSize]; + + unsigned headIndex() {return fHeadIndex;} + Segment& headSegment() {return s[fHeadIndex];} + + unsigned nextFreeIndex() {return fNextFreeIndex;} + Segment& nextFreeSegment() {return s[fNextFreeIndex];} + Boolean isEmpty() {return isEmptyOrFull() && totalDataSize() == 0;} + Boolean isFull() {return isEmptyOrFull() && totalDataSize() > 0;} + + static unsigned nextIndex(unsigned ix) {return (ix+1)%SegmentQueueSize;} + static unsigned prevIndex(unsigned ix) {return (ix+SegmentQueueSize-1)%SegmentQueueSize;} + + unsigned totalDataSize() {return fTotalDataSize;} + + void enqueueNewSegment(FramedSource* inputSource, FramedSource* usingSource); + + Boolean dequeue(); + + Boolean insertDummyBeforeTail(unsigned backpointer); + + void reset() { fHeadIndex = fNextFreeIndex = fTotalDataSize = 0; } + +private: + static void sqAfterGettingSegment(void* clientData, + unsigned numBytesRead, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + + Boolean sqAfterGettingCommon(Segment& seg, unsigned numBytesRead); + Boolean isEmptyOrFull() {return headIndex() == nextFreeIndex();} + + unsigned fHeadIndex, fNextFreeIndex, fTotalDataSize; + + // The following is used for asynchronous reads: + FramedSource* fUsingSource; + + // This tells us whether the direction in which we're being used + // is MP3->ADU, or vice-versa. (This flag is used for debugging output.) + Boolean fDirectionIsToADU; + + // The following is true iff we're used to enqueue incoming + // ADU frames, and these have an ADU descriptor in front + Boolean fIncludeADUdescriptors; +}; + +////////// ADUFromMP3Source ////////// + +ADUFromMP3Source::ADUFromMP3Source(UsageEnvironment& env, + FramedSource* inputSource, + Boolean includeADUdescriptors) + : FramedFilter(env, inputSource), + fAreEnqueueingMP3Frame(False), + fSegments(new SegmentQueue(True /* because we're MP3->ADU */, + False /*no descriptors in incoming frames*/)), + fIncludeADUdescriptors(includeADUdescriptors), + fTotalDataSizeBeforePreviousRead(0), fScale(1), fFrameCounter(0) { +} + +ADUFromMP3Source::~ADUFromMP3Source() { + delete fSegments; +} + + +char const* ADUFromMP3Source::MIMEtype() const { + return "audio/MPA-ROBUST"; +} + +ADUFromMP3Source* ADUFromMP3Source::createNew(UsageEnvironment& env, + FramedSource* inputSource, + Boolean includeADUdescriptors) { + // The source must be a MPEG audio source: + if (strcmp(inputSource->MIMEtype(), "audio/MPEG") != 0) { + env.setResultMsg(inputSource->name(), " is not an MPEG audio source"); + return NULL; + } + + return new ADUFromMP3Source(env, inputSource, includeADUdescriptors); +} + +void ADUFromMP3Source::resetInput() { + fSegments->reset(); +} + +Boolean ADUFromMP3Source::setScaleFactor(int scale) { + if (scale < 1) return False; + fScale = scale; + return True; +} + +void ADUFromMP3Source::doGetNextFrame() { + if (!fAreEnqueueingMP3Frame) { + // Arrange to enqueue a new MP3 frame: + fTotalDataSizeBeforePreviousRead = fSegments->totalDataSize(); + fAreEnqueueingMP3Frame = True; + fSegments->enqueueNewSegment(fInputSource, this); + } else { + // Deliver an ADU from a previously-read MP3 frame: + fAreEnqueueingMP3Frame = False; + + if (!doGetNextFrame1()) { + // An internal error occurred; act as if our source went away: + handleClosure(); + } + } +} + +Boolean ADUFromMP3Source::doGetNextFrame1() { + // First, check whether we have enough previously-read data to output an + // ADU for the last-read MP3 frame: + unsigned tailIndex; + Segment* tailSeg; + Boolean needMoreData; + + if (fSegments->isEmpty()) { + needMoreData = True; + tailSeg = NULL; tailIndex = 0; // unneeded, but stops compiler warnings + } else { + tailIndex = SegmentQueue::prevIndex(fSegments->nextFreeIndex()); + tailSeg = &(fSegments->s[tailIndex]); + + needMoreData + = fTotalDataSizeBeforePreviousRead < tailSeg->backpointer // bp points back too far + || tailSeg->backpointer + tailSeg->dataHere() < tailSeg->aduSize; // not enough data + } + + if (needMoreData) { + // We don't have enough data to output an ADU from the last-read MP3 + // frame, so need to read another one and try again: + doGetNextFrame(); + return True; + } + + // Output an ADU from the tail segment: + fFrameSize = tailSeg->headerSize+tailSeg->sideInfoSize+tailSeg->aduSize; + fPresentationTime = tailSeg->presentationTime; + fDurationInMicroseconds = tailSeg->durationInMicroseconds; + unsigned descriptorSize + = fIncludeADUdescriptors ? ADUdescriptor::computeSize(fFrameSize) : 0; +#ifdef DEBUG + fprintf(stderr, "m->a:outputting ADU %d<-%d, nbr:%d, sis:%d, dh:%d, (descriptor size: %d)\n", tailSeg->aduSize, tailSeg->backpointer, fFrameSize, tailSeg->sideInfoSize, tailSeg->dataHere(), descriptorSize); +#endif + if (descriptorSize + fFrameSize > fMaxSize) { + envir() << "ADUFromMP3Source::doGetNextFrame1(): not enough room (" + << descriptorSize + fFrameSize << ">" + << fMaxSize << ")\n"; + fFrameSize = 0; + return False; + } + + unsigned char* toPtr = fTo; + // output the ADU descriptor: + if (fIncludeADUdescriptors) { + fFrameSize += ADUdescriptor::generateDescriptor(toPtr, fFrameSize); + } + + // output header and side info: + memmove(toPtr, tailSeg->dataStart(), + tailSeg->headerSize + tailSeg->sideInfoSize); + toPtr += tailSeg->headerSize + tailSeg->sideInfoSize; + + // go back to the frame that contains the start of our data: + unsigned offset = 0; + unsigned i = tailIndex; + unsigned prevBytes = tailSeg->backpointer; + while (prevBytes > 0) { + i = SegmentQueue::prevIndex(i); + unsigned dataHere = fSegments->s[i].dataHere(); + if (dataHere < prevBytes) { + prevBytes -= dataHere; + } else { + offset = dataHere - prevBytes; + break; + } + } + + // dequeue any segments that we no longer need: + while (fSegments->headIndex() != i) { + fSegments->dequeue(); // we're done with it + } + + unsigned bytesToUse = tailSeg->aduSize; + while (bytesToUse > 0) { + Segment& seg = fSegments->s[i]; + unsigned char* fromPtr + = &seg.dataStart()[seg.headerSize + seg.sideInfoSize + offset]; + unsigned dataHere = seg.dataHere() - offset; + unsigned bytesUsedHere = dataHere < bytesToUse ? dataHere : bytesToUse; + memmove(toPtr, fromPtr, bytesUsedHere); + bytesToUse -= bytesUsedHere; + toPtr += bytesUsedHere; + offset = 0; + i = SegmentQueue::nextIndex(i); + } + + + if (fFrameCounter++%fScale == 0) { + // Call our own 'after getting' function. Because we're not a 'leaf' + // source, we can call this directly, without risking infinite recursion. + afterGetting(this); + } else { + // Don't use this frame; get another one: + doGetNextFrame(); + } + + return True; +} + + +////////// MP3FromADUSource ////////// + +MP3FromADUSource::MP3FromADUSource(UsageEnvironment& env, + FramedSource* inputSource, + Boolean includeADUdescriptors) + : FramedFilter(env, inputSource), + fAreEnqueueingADU(False), + fSegments(new SegmentQueue(False /* because we're ADU->MP3 */, + includeADUdescriptors)) { +} + +MP3FromADUSource::~MP3FromADUSource() { + delete fSegments; +} + +char const* MP3FromADUSource::MIMEtype() const { + return "audio/MPEG"; +} + +MP3FromADUSource* MP3FromADUSource::createNew(UsageEnvironment& env, + FramedSource* inputSource, + Boolean includeADUdescriptors) { + // The source must be an MP3 ADU source: + if (strcmp(inputSource->MIMEtype(), "audio/MPA-ROBUST") != 0) { + env.setResultMsg(inputSource->name(), " is not an MP3 ADU source"); + return NULL; + } + + return new MP3FromADUSource(env, inputSource, includeADUdescriptors); +} + + +void MP3FromADUSource::doGetNextFrame() { + if (fAreEnqueueingADU) insertDummyADUsIfNecessary(); + fAreEnqueueingADU = False; + + if (needToGetAnADU()) { + // Before returning a frame, we must enqueue at least one ADU: +#ifdef TEST_LOSS + NOTE: This code no longer works, because it uses synchronous reads, + which are no longer supported. + static unsigned const framesPerPacket = 10; + static unsigned const frameCount = 0; + static Boolean packetIsLost; + while (1) { + if ((frameCount++)%framesPerPacket == 0) { + packetIsLost = (our_random()%10 == 0); // simulate 10% packet loss ##### + } + + if (packetIsLost) { + // Read and discard the next input frame (that would be part of + // a lost packet): + Segment dummySegment; + unsigned numBytesRead; + struct timeval presentationTime; + // (this works only if the source can be read synchronously) + fInputSource->syncGetNextFrame(dummySegment.buf, + sizeof dummySegment.buf, numBytesRead, + presentationTime); + } else { + break; // from while (1) + } + } +#endif + + fAreEnqueueingADU = True; + fSegments->enqueueNewSegment(fInputSource, this); + } else { + // Return a frame now: + generateFrameFromHeadADU(); + // sets fFrameSize, fPresentationTime, and fDurationInMicroseconds + + // Call our own 'after getting' function. Because we're not a 'leaf' + // source, we can call this directly, without risking infinite recursion. + afterGetting(this); + } +} + +Boolean MP3FromADUSource::needToGetAnADU() { + // Check whether we need to first enqueue a new ADU before we + // can generate a frame for our head ADU. + Boolean needToEnqueue = True; + + if (!fSegments->isEmpty()) { + unsigned index = fSegments->headIndex(); + Segment* seg = &(fSegments->headSegment()); + int const endOfHeadFrame = (int) seg->dataHere(); + unsigned frameOffset = 0; + + while (1) { + int endOfData = frameOffset - seg->backpointer + seg->aduSize; + if (endOfData >= endOfHeadFrame) { + // We already have enough data to generate a frame + needToEnqueue = False; + break; + } + + frameOffset += seg->dataHere(); + index = SegmentQueue::nextIndex(index); + if (index == fSegments->nextFreeIndex()) break; + seg = &(fSegments->s[index]); + } + } + + return needToEnqueue; +} + +void MP3FromADUSource::insertDummyADUsIfNecessary() { + if (fSegments->isEmpty()) return; // shouldn't happen + + // The tail segment (ADU) is assumed to have been recently + // enqueued. If its backpointer would overlap the data + // of the previous ADU, then we need to insert one or more + // empty, 'dummy' ADUs ahead of it. (This situation should occur + // only if an intermediate ADU was lost.) + + unsigned tailIndex + = SegmentQueue::prevIndex(fSegments->nextFreeIndex()); + Segment* tailSeg = &(fSegments->s[tailIndex]); + + while (1) { + unsigned prevADUend; // relative to the start of the new ADU + if (fSegments->headIndex() != tailIndex) { + // there is a previous segment + unsigned prevIndex = SegmentQueue::prevIndex(tailIndex); + Segment& prevSegment = fSegments->s[prevIndex]; + prevADUend = prevSegment.dataHere() + prevSegment.backpointer; + if (prevSegment.aduSize > prevADUend) { + // shouldn't happen if the previous ADU was well-formed + prevADUend = 0; + } else { + prevADUend -= prevSegment.aduSize; + } + } else { + prevADUend = 0; + } + + if (tailSeg->backpointer > prevADUend) { + // We need to insert a dummy ADU in front of the tail +#ifdef DEBUG + fprintf(stderr, "a->m:need to insert a dummy ADU (%d, %d, %d) [%d, %d]\n", tailSeg->backpointer, prevADUend, tailSeg->dataHere(), fSegments->headIndex(), fSegments->nextFreeIndex()); +#endif + tailIndex = fSegments->nextFreeIndex(); + if (!fSegments->insertDummyBeforeTail(prevADUend)) return; + tailSeg = &(fSegments->s[tailIndex]); + } else { + break; // no more dummy ADUs need to be inserted + } + } +} + +Boolean MP3FromADUSource::generateFrameFromHeadADU() { + // Output a frame for the head ADU: + if (fSegments->isEmpty()) return False; + unsigned index = fSegments->headIndex(); + Segment* seg = &(fSegments->headSegment()); +#ifdef DEBUG + fprintf(stderr, "a->m:outputting frame for %d<-%d (fs %d, dh %d), (descriptorSize: %d)\n", seg->aduSize, seg->backpointer, seg->frameSize, seg->dataHere(), seg->descriptorSize); +#endif + unsigned char* toPtr = fTo; + + // output header and side info: + fFrameSize = seg->frameSize; + fPresentationTime = seg->presentationTime; + fDurationInMicroseconds = seg->durationInMicroseconds; + memmove(toPtr, seg->dataStart(), seg->headerSize + seg->sideInfoSize); + toPtr += seg->headerSize + seg->sideInfoSize; + + // zero out the rest of the frame, in case ADU data doesn't fill it all in + unsigned bytesToZero = seg->dataHere(); + for (unsigned i = 0; i < bytesToZero; ++i) { + toPtr[i] = '\0'; + } + + // Fill in the frame with appropriate ADU data from this and + // subsequent ADUs: + unsigned frameOffset = 0; + unsigned toOffset = 0; + unsigned const endOfHeadFrame = seg->dataHere(); + + while (toOffset < endOfHeadFrame) { + int startOfData = frameOffset - seg->backpointer; + if (startOfData > (int)endOfHeadFrame) break; // no more ADUs needed + + int endOfData = startOfData + seg->aduSize; + if (endOfData > (int)endOfHeadFrame) { + endOfData = endOfHeadFrame; + } + + unsigned fromOffset; + if (startOfData <= (int)toOffset) { + fromOffset = toOffset - startOfData; + startOfData = toOffset; + if (endOfData < startOfData) endOfData = startOfData; + } else { + fromOffset = 0; + + // we may need some padding bytes beforehand + unsigned bytesToZero = startOfData - toOffset; +#ifdef DEBUG + if (bytesToZero > 0) fprintf(stderr, "a->m:outputting %d zero bytes (%d, %d, %d, %d)\n", bytesToZero, startOfData, toOffset, frameOffset, seg->backpointer); +#endif + toOffset += bytesToZero; + } + + unsigned char* fromPtr + = &seg->dataStart()[seg->headerSize + seg->sideInfoSize + fromOffset]; + unsigned bytesUsedHere = endOfData - startOfData; +#ifdef DEBUG + if (bytesUsedHere > 0) fprintf(stderr, "a->m:outputting %d bytes from %d<-%d\n", bytesUsedHere, seg->aduSize, seg->backpointer); +#endif + memmove(toPtr + toOffset, fromPtr, bytesUsedHere); + toOffset += bytesUsedHere; + + frameOffset += seg->dataHere(); + index = SegmentQueue::nextIndex(index); + if (index == fSegments->nextFreeIndex()) break; + seg = &(fSegments->s[index]); + } + + fSegments->dequeue(); + + return True; +} + + +////////// Segment ////////// + +unsigned Segment::dataHere() { + int result = frameSize - (headerSize + sideInfoSize); + if (result < 0) { + return 0; + } + + return (unsigned)result; +} + +////////// SegmentQueue ////////// + +void SegmentQueue::enqueueNewSegment(FramedSource* inputSource, + FramedSource* usingSource) { + if (isFull()) { + usingSource->envir() << "SegmentQueue::enqueueNewSegment() overflow\n"; + usingSource->handleClosure(); + return; + } + + fUsingSource = usingSource; + + Segment& seg = nextFreeSegment(); + inputSource->getNextFrame(seg.buf, sizeof seg.buf, + sqAfterGettingSegment, this, + FramedSource::handleClosure, usingSource); +} + +void SegmentQueue::sqAfterGettingSegment(void* clientData, + unsigned numBytesRead, + unsigned /*numTruncatedBytes*/, + struct timeval presentationTime, + unsigned durationInMicroseconds) { + SegmentQueue* segQueue = (SegmentQueue*)clientData; + Segment& seg = segQueue->nextFreeSegment(); + + seg.presentationTime = presentationTime; + seg.durationInMicroseconds = durationInMicroseconds; + + if (segQueue->sqAfterGettingCommon(seg, numBytesRead)) { +#ifdef DEBUG + char const* direction = segQueue->fDirectionIsToADU ? "m->a" : "a->m"; + fprintf(stderr, "%s:read frame %d<-%d, fs:%d, sis:%d, dh:%d, (descriptor size: %d)\n", direction, seg.aduSize, seg.backpointer, seg.frameSize, seg.sideInfoSize, seg.dataHere(), seg.descriptorSize); +#endif + } + + // Continue our original calling source where it left off: + segQueue->fUsingSource->doGetNextFrame(); +} + +// Common code called after a new segment is enqueued +Boolean SegmentQueue::sqAfterGettingCommon(Segment& seg, + unsigned numBytesRead) { + unsigned char* fromPtr = seg.buf; + + if (fIncludeADUdescriptors) { + // The newly-read data is assumed to be an ADU with a descriptor + // in front + (void)ADUdescriptor::getRemainingFrameSize(fromPtr); + seg.descriptorSize = (unsigned)(fromPtr-seg.buf); + } else { + seg.descriptorSize = 0; + } + + // parse the MP3-specific info in the frame to get the ADU params + unsigned hdr; + MP3SideInfo sideInfo; + if (!GetADUInfoFromMP3Frame(fromPtr, numBytesRead, + hdr, seg.frameSize, + sideInfo, seg.sideInfoSize, + seg.backpointer, seg.aduSize)) { + return False; + } + + // If we've just read an ADU (rather than a regular MP3 frame), then use the + // entire "numBytesRead" data for the 'aduSize', so that we include any + // 'ancillary data' that may be present at the end of the ADU: + if (!fDirectionIsToADU) { + unsigned newADUSize + = numBytesRead - seg.descriptorSize - 4/*header size*/ - seg.sideInfoSize; + if (newADUSize > seg.aduSize) seg.aduSize = newADUSize; + } + fTotalDataSize += seg.dataHere(); + fNextFreeIndex = nextIndex(fNextFreeIndex); + + return True; +} + +Boolean SegmentQueue::dequeue() { + if (isEmpty()) { + fUsingSource->envir() << "SegmentQueue::dequeue(): underflow!\n"; + return False; + } + + Segment& seg = s[headIndex()]; + fTotalDataSize -= seg.dataHere(); + fHeadIndex = nextIndex(fHeadIndex); + return True; +} + +Boolean SegmentQueue::insertDummyBeforeTail(unsigned backpointer) { + if (isEmptyOrFull()) return False; + + // Copy the current tail segment to its new position, then modify the + // old tail segment to be a 'dummy' ADU + + unsigned newTailIndex = nextFreeIndex(); + Segment& newTailSeg = s[newTailIndex]; + + unsigned oldTailIndex = prevIndex(newTailIndex); + Segment& oldTailSeg = s[oldTailIndex]; + + newTailSeg = oldTailSeg; // structure copy + + // Begin by setting (replacing) the ADU descriptor of the dummy ADU: + unsigned char* ptr = oldTailSeg.buf; + if (fIncludeADUdescriptors) { + unsigned remainingFrameSize + = oldTailSeg.headerSize + oldTailSeg.sideInfoSize + 0 /* 0-size ADU */; + unsigned currentDescriptorSize = oldTailSeg.descriptorSize; + + if (currentDescriptorSize == 2) { + ADUdescriptor::generateTwoByteDescriptor(ptr, remainingFrameSize); + } else { + (void)ADUdescriptor::generateDescriptor(ptr, remainingFrameSize); + } + } + + // Then zero out the side info of the dummy frame: + if (!ZeroOutMP3SideInfo(ptr, oldTailSeg.frameSize, + backpointer)) return False; + + unsigned dummyNumBytesRead + = oldTailSeg.descriptorSize + 4/*header size*/ + oldTailSeg.sideInfoSize; + return sqAfterGettingCommon(oldTailSeg, dummyNumBytesRead); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MP3ADURTPSink.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MP3ADURTPSink.cpp new file mode 100644 index 000000000..ea6aff44d --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MP3ADURTPSink.cpp @@ -0,0 +1,119 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP sink for 'ADUized' MP3 frames ("mpa-robust") +// Implementation + +#include "MP3ADURTPSink.hh" + +MP3ADURTPSink::MP3ADURTPSink(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char RTPPayloadType) + : AudioRTPSink(env, RTPgs, RTPPayloadType, 90000, "MPA-ROBUST") { +} + +MP3ADURTPSink::~MP3ADURTPSink() { +} + +MP3ADURTPSink* +MP3ADURTPSink::createNew(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char RTPPayloadType) { + return new MP3ADURTPSink(env, RTPgs, RTPPayloadType); +} + +static void badDataSize(UsageEnvironment& env, unsigned numBytesInFrame) { + env << "MP3ADURTPSink::doSpecialFrameHandling(): invalid size (" + << numBytesInFrame << ") of non-fragmented input ADU!\n"; +} + +void MP3ADURTPSink::doSpecialFrameHandling(unsigned fragmentationOffset, + unsigned char* frameStart, + unsigned numBytesInFrame, + struct timeval framePresentationTime, + unsigned numRemainingBytes) { + // If this is the first (or only) fragment of an ADU, then + // check the "ADU descriptor" (that should be at the front) for validity: + if (fragmentationOffset == 0) { + unsigned aduDescriptorSize; + + if (numBytesInFrame < 1) { + badDataSize(envir(), numBytesInFrame); + return; + } + if (frameStart[0]&0x40) { + // We have a 2-byte ADU descriptor + aduDescriptorSize = 2; + if (numBytesInFrame < 2) { + badDataSize(envir(), numBytesInFrame); + return; + } + fCurADUSize = ((frameStart[0]&~0xC0)<<8) | frameStart[1]; + } else { + // We have a 1-byte ADU descriptor + aduDescriptorSize = 1; + fCurADUSize = frameStart[0]&~0x80; + } + + if (frameStart[0]&0x80) { + envir() << "Unexpected \"C\" bit seen on non-fragment input ADU!\n"; + return; + } + + // Now, check whether the ADU size in the ADU descriptor is consistent + // with the total data size of (all fragments of) the input frame: + unsigned expectedADUSize = + fragmentationOffset + numBytesInFrame + numRemainingBytes + - aduDescriptorSize; + if (fCurADUSize != expectedADUSize) { + envir() << "MP3ADURTPSink::doSpecialFrameHandling(): Warning: Input ADU size " + << expectedADUSize << " (=" << fragmentationOffset + << "+" << numBytesInFrame << "+" << numRemainingBytes + << "-" << aduDescriptorSize + << ") did not match the value (" << fCurADUSize + << ") in the ADU descriptor!\n"; + fCurADUSize = expectedADUSize; + } + } else { + // This is the second (or subsequent) fragment. + // Insert a new ADU descriptor: + unsigned char aduDescriptor[2]; + aduDescriptor[0] = 0xC0|(fCurADUSize>>8); + aduDescriptor[1] = fCurADUSize&0xFF; + setSpecialHeaderBytes(aduDescriptor, 2); + } + + // Important: Also call our base class's doSpecialFrameHandling(), + // to set the packet's timestamp: + MultiFramedRTPSink::doSpecialFrameHandling(fragmentationOffset, + frameStart, numBytesInFrame, + framePresentationTime, + numRemainingBytes); +} + +unsigned MP3ADURTPSink::specialHeaderSize() const { + // Normally there's no special header. + // (The "ADU descriptor" is already present in the data.) + unsigned specialHeaderSize = 0; + + // However, if we're about to output the second (or subsequent) fragment + // of a fragmented ADU, then we need to insert a new ADU descriptor at + // the front of the packet: + if (curFragmentationOffset() > 0) { + specialHeaderSize = 2; + } + + return specialHeaderSize; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MP3ADURTPSource.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MP3ADURTPSource.cpp new file mode 100644 index 000000000..cfac528af --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MP3ADURTPSource.cpp @@ -0,0 +1,80 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP source for 'ADUized' MP3 frames ("mpa-robust") +// Implementation + +#include "MP3ADURTPSource.hh" +#include "MP3ADUdescriptor.hh" + +////////// ADUBufferedPacket and ADUBufferedPacketFactory ////////// + +class ADUBufferedPacket: public BufferedPacket { +private: // redefined virtual functions + virtual unsigned nextEnclosedFrameSize(unsigned char*& framePtr, + unsigned dataSize); +}; + +class ADUBufferedPacketFactory: public BufferedPacketFactory { +private: // redefined virtual functions + virtual BufferedPacket* createNewPacket(MultiFramedRTPSource* ourSource); +}; + +///////// MP3ADURTPSource implementation //////// + +MP3ADURTPSource* +MP3ADURTPSource::createNew(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency) { + return new MP3ADURTPSource(env, RTPgs, rtpPayloadFormat, + rtpTimestampFrequency); +} + +MP3ADURTPSource::MP3ADURTPSource(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency) + : MultiFramedRTPSource(env, RTPgs, + rtpPayloadFormat, rtpTimestampFrequency, + new ADUBufferedPacketFactory) { +} + +MP3ADURTPSource::~MP3ADURTPSource() { +} + +char const* MP3ADURTPSource::MIMEtype() const { + return "audio/MPA-ROBUST"; +} + +////////// ADUBufferedPacket and ADUBufferredPacketFactory implementation + +unsigned ADUBufferedPacket +::nextEnclosedFrameSize(unsigned char*& framePtr, unsigned dataSize) { + // Return the size of the next MP3 'ADU', on the assumption that + // the input data is ADU-encoded MP3 frames. + unsigned char* frameDataPtr = framePtr; + unsigned remainingFrameSize + = ADUdescriptor::getRemainingFrameSize(frameDataPtr); + unsigned descriptorSize = (unsigned)(frameDataPtr - framePtr); + unsigned fullADUSize = descriptorSize + remainingFrameSize; + + return (fullADUSize <= dataSize) ? fullADUSize : dataSize; +} + +BufferedPacket* ADUBufferedPacketFactory +::createNewPacket(MultiFramedRTPSource* /*ourSource*/) { + return new ADUBufferedPacket; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MP3ADUTranscoder.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MP3ADUTranscoder.cpp new file mode 100644 index 000000000..4a922f6d7 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MP3ADUTranscoder.cpp @@ -0,0 +1,92 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Transcoder for ADUized MP3 frames +// Implementation + +#include "MP3ADUTranscoder.hh" +#include "MP3Internals.hh" +#include + +MP3ADUTranscoder::MP3ADUTranscoder(UsageEnvironment& env, + unsigned outBitrate /* in kbps */, + FramedSource* inputSource) + : FramedFilter(env, inputSource), + fOutBitrate(outBitrate), + fAvailableBytesForBackpointer(0), + fOrigADU(new unsigned char[MAX_MP3_FRAME_SIZE]) { +} + +MP3ADUTranscoder::~MP3ADUTranscoder() { + delete[] fOrigADU; +} + +MP3ADUTranscoder* MP3ADUTranscoder::createNew(UsageEnvironment& env, + unsigned outBitrate /* in kbps */, + FramedSource* inputSource) { + // The source must be an MP3 ADU source: + if (strcmp(inputSource->MIMEtype(), "audio/MPA-ROBUST") != 0) { + env.setResultMsg(inputSource->name(), " is not an MP3 ADU source"); + return NULL; + } + + return new MP3ADUTranscoder(env, outBitrate, inputSource); +} + +void MP3ADUTranscoder::getAttributes() const { + // Begin by getting the attributes from our input source: + fInputSource->getAttributes(); + + // Then modify them by appending the corrected bandwidth + char buffer[30]; + sprintf(buffer, " bandwidth %d", outBitrate()); + envir().appendToResultMsg(buffer); +} + +void MP3ADUTranscoder::doGetNextFrame() { + fInputSource->getNextFrame(fOrigADU, MAX_MP3_FRAME_SIZE, + afterGettingFrame, this, handleClosure, this); +} + +void MP3ADUTranscoder::afterGettingFrame(void* clientData, + unsigned numBytesRead, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds) { + MP3ADUTranscoder* transcoder = (MP3ADUTranscoder*)clientData; + transcoder->afterGettingFrame1(numBytesRead, numTruncatedBytes, + presentationTime, durationInMicroseconds); +} + +void MP3ADUTranscoder::afterGettingFrame1(unsigned numBytesRead, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds) { + fNumTruncatedBytes = numTruncatedBytes; // but can we handle this being >0? ##### + fPresentationTime = presentationTime; + fDurationInMicroseconds = durationInMicroseconds; + fFrameSize = TranscodeMP3ADU(fOrigADU, numBytesRead, fOutBitrate, + fTo, fMaxSize, fAvailableBytesForBackpointer); + if (fFrameSize == 0) { // internal error - bad ADU data? + handleClosure(); + return; + } + + // Call our own 'after getting' function. Because we're not a 'leaf' + // source, we can call this directly, without risking infinite recursion. + afterGetting(this); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MP3ADUdescriptor.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MP3ADUdescriptor.cpp new file mode 100644 index 000000000..e5225e45a --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MP3ADUdescriptor.cpp @@ -0,0 +1,65 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Descriptor preceding frames of 'ADU' MP3 streams (for improved loss-tolerance) +// Implementation + +#include "MP3ADUdescriptor.hh" + +////////// ADUdescriptor ////////// + +//##### NOTE: For now, ignore fragmentation. Fix this later! ##### + +#define TWO_BYTE_DESCR_FLAG 0x40 + +unsigned ADUdescriptor::generateDescriptor(unsigned char*& toPtr, + unsigned remainingFrameSize) { + unsigned descriptorSize = ADUdescriptor::computeSize(remainingFrameSize); + switch (descriptorSize) { + case 1: { + *toPtr++ = (unsigned char)remainingFrameSize; + break; + } + case 2: { + generateTwoByteDescriptor(toPtr, remainingFrameSize); + break; + } + } + + return descriptorSize; +} + +void ADUdescriptor::generateTwoByteDescriptor(unsigned char*& toPtr, + unsigned remainingFrameSize) { + *toPtr++ = (TWO_BYTE_DESCR_FLAG|(unsigned char)(remainingFrameSize>>8)); + *toPtr++ = (unsigned char)(remainingFrameSize&0xFF); +} + +unsigned ADUdescriptor::getRemainingFrameSize(unsigned char*& fromPtr) { + unsigned char firstByte = *fromPtr++; + + if (firstByte&TWO_BYTE_DESCR_FLAG) { + // This is a 2-byte descriptor + unsigned char secondByte = *fromPtr++; + + return ((firstByte&0x3F)<<8) | secondByte; + } else { + // This is a 1-byte descriptor + return (firstByte&0x3F); + } +} + diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MP3ADUdescriptor.hh b/src/big/mpp/middleware/src/live555/liveMedia/MP3ADUdescriptor.hh new file mode 100644 index 000000000..b1d96a41f --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MP3ADUdescriptor.hh @@ -0,0 +1,43 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Descriptor preceding frames of 'ADU' MP3 streams (for improved loss-tolerance) +// C++ header + +#ifndef _MP3_ADU_DESCRIPTOR_HH +#define _MP3_ADU_DESCRIPTOR_HH + +// A class for handling the descriptor that begins each ADU frame: +// (Note: We don't yet implement fragmentation) +class ADUdescriptor { +public: + // Operations for generating a new descriptor + static unsigned computeSize(unsigned remainingFrameSize) { + return remainingFrameSize >= 64 ? 2 : 1; + } + static unsigned generateDescriptor(unsigned char*& toPtr, unsigned remainingFrameSize); + // returns descriptor size; increments "toPtr" afterwards + static void generateTwoByteDescriptor(unsigned char*& toPtr, unsigned remainingFrameSize); + // always generates a 2-byte descriptor, even if "remainingFrameSize" is + // small enough for a 1-byte descriptor + + // Operations for reading a descriptor + static unsigned getRemainingFrameSize(unsigned char*& fromPtr); + // increments "fromPtr" afterwards +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MP3ADUinterleaving.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MP3ADUinterleaving.cpp new file mode 100644 index 000000000..94f048c1f --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MP3ADUinterleaving.cpp @@ -0,0 +1,517 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Interleaving of MP3 ADUs +// Implementation + +#include "MP3ADUinterleaving.hh" +#include "MP3ADUdescriptor.hh" + +#include + +#ifdef TEST_LOSS +#include "GroupsockHelper.hh" +#endif + +////////// Interleaving ////////// + +Interleaving::Interleaving(unsigned cycleSize, + unsigned char const* cycleArray) + : fCycleSize(cycleSize) { + for (unsigned i = 0; i < fCycleSize; ++i) { + fInverseCycle[cycleArray[i]] = i; + } +} + +Interleaving::~Interleaving() { +} + +////////// MP3ADUinterleaverBase ////////// + +MP3ADUinterleaverBase::MP3ADUinterleaverBase(UsageEnvironment& env, + FramedSource* inputSource) + : FramedFilter(env, inputSource) { +} +MP3ADUinterleaverBase::~MP3ADUinterleaverBase() { +} + +FramedSource* MP3ADUinterleaverBase::getInputSource(UsageEnvironment& env, + char const* inputSourceName) { + FramedSource* inputSource; + if (!FramedSource::lookupByName(env, inputSourceName, inputSource)) + return NULL; + + if (strcmp(inputSource->MIMEtype(), "audio/MPA-ROBUST") != 0) { + env.setResultMsg(inputSourceName, " is not an MP3 ADU source"); + return NULL; + } + + return inputSource; +} + +void MP3ADUinterleaverBase::afterGettingFrame(void* clientData, + unsigned numBytesRead, + unsigned /*numTruncatedBytes*/, + struct timeval presentationTime, + unsigned durationInMicroseconds) { + MP3ADUinterleaverBase* interleaverBase = (MP3ADUinterleaverBase*)clientData; + // Finish up after reading: + interleaverBase->afterGettingFrame(numBytesRead, + presentationTime, durationInMicroseconds); + + // Then, continue to deliver an outgoing frame: + interleaverBase->doGetNextFrame(); +} + + +////////// InterleavingFrames (definition) ////////// + +class InterleavingFrames { +public: + InterleavingFrames(unsigned maxCycleSize); + virtual ~InterleavingFrames(); + + Boolean haveReleaseableFrame(); + void getIncomingFrameParams(unsigned char index, + unsigned char*& dataPtr, + unsigned& bytesAvailable); + void getReleasingFrameParams(unsigned char index, + unsigned char*& dataPtr, + unsigned& bytesInUse, + struct timeval& presentationTime, + unsigned& durationInMicroseconds); + void setFrameParams(unsigned char index, + unsigned char icc, unsigned char ii, + unsigned frameSize, struct timeval presentationTime, + unsigned durationInMicroseconds); + unsigned nextIndexToRelease() {return fNextIndexToRelease;} + void releaseNext(); + +private: + unsigned fMaxCycleSize; + unsigned fNextIndexToRelease; + class InterleavingFrameDescriptor* fDescriptors; +}; + +////////// MP3ADUinterleaver ////////// + + +MP3ADUinterleaver::MP3ADUinterleaver(UsageEnvironment& env, + Interleaving const& interleaving, + FramedSource* inputSource) + : MP3ADUinterleaverBase(env, inputSource), + fInterleaving(interleaving), + fFrames(new InterleavingFrames(interleaving.cycleSize())), + fII(0), fICC(0) { +} + +MP3ADUinterleaver::~MP3ADUinterleaver() { + delete fFrames; +} + +MP3ADUinterleaver* MP3ADUinterleaver::createNew(UsageEnvironment& env, + Interleaving const& interleaving, + FramedSource* inputSource) { + return new MP3ADUinterleaver(env, interleaving, inputSource); +} + +void MP3ADUinterleaver::doGetNextFrame() { + // If there's a frame immediately available, deliver it, otherwise get new + // frames from the source until one's available: + if (fFrames->haveReleaseableFrame()) { + releaseOutgoingFrame(); + + // Call our own 'after getting' function. Because we're not a 'leaf' + // source, we can call this directly, without risking infinite recursion. + afterGetting(this); + } else { + fPositionOfNextIncomingFrame = fInterleaving.lookupInverseCycle(fII); + unsigned char* dataPtr; + unsigned bytesAvailable; + fFrames->getIncomingFrameParams(fPositionOfNextIncomingFrame, + dataPtr, bytesAvailable); + + // Read the next incoming frame (asynchronously) + fInputSource->getNextFrame(dataPtr, bytesAvailable, + &MP3ADUinterleaverBase::afterGettingFrame, this, + handleClosure, this); + } +} + +void MP3ADUinterleaver::releaseOutgoingFrame() { + unsigned char* fromPtr; + fFrames->getReleasingFrameParams(fFrames->nextIndexToRelease(), + fromPtr, fFrameSize, + fPresentationTime, fDurationInMicroseconds); + + if (fFrameSize > fMaxSize) { + fNumTruncatedBytes = fFrameSize - fMaxSize; + fFrameSize = fMaxSize; + } + memmove(fTo, fromPtr, fFrameSize); + + fFrames->releaseNext(); +} + +void MP3ADUinterleaver::afterGettingFrame(unsigned numBytesRead, + struct timeval presentationTime, + unsigned durationInMicroseconds) { + // Set the (icc,ii) and frame size of the newly-read frame: + fFrames->setFrameParams(fPositionOfNextIncomingFrame, + fICC, fII, numBytesRead, + presentationTime, durationInMicroseconds); + + // Prepare our counters for the next frame: + if (++fII == fInterleaving.cycleSize()) { + fII = 0; + fICC = (fICC+1)%8; + } +} + +////////// DeinterleavingFrames (definition) ////////// + +class DeinterleavingFrames { +public: + DeinterleavingFrames(); + virtual ~DeinterleavingFrames(); + + Boolean haveReleaseableFrame(); + void getIncomingFrameParams(unsigned char*& dataPtr, + unsigned& bytesAvailable); + void getIncomingFrameParamsAfter(unsigned frameSize, + struct timeval presentationTime, + unsigned durationInMicroseconds, + unsigned char& icc, unsigned char& ii); + void getReleasingFrameParams(unsigned char*& dataPtr, + unsigned& bytesInUse, + struct timeval& presentationTime, + unsigned& durationInMicroseconds); + void moveIncomingFrameIntoPlace(); + void releaseNext(); + void startNewCycle(); + +private: + unsigned fNextIndexToRelease; + Boolean fHaveEndedCycle; + unsigned fIIlastSeen; + unsigned fMinIndexSeen, fMaxIndexSeen; // actually, max+1 + class DeinterleavingFrameDescriptor* fDescriptors; +}; + +////////// MP3ADUdeinterleaver ////////// + +MP3ADUdeinterleaver::MP3ADUdeinterleaver(UsageEnvironment& env, + FramedSource* inputSource) + : MP3ADUinterleaverBase(env, inputSource), + fFrames(new DeinterleavingFrames), + fIIlastSeen(~0), fICClastSeen(~0) { +} + +MP3ADUdeinterleaver::~MP3ADUdeinterleaver() { + delete fFrames; +} + +MP3ADUdeinterleaver* MP3ADUdeinterleaver::createNew(UsageEnvironment& env, + FramedSource* inputSource) { + return new MP3ADUdeinterleaver(env, inputSource); +} + +void MP3ADUdeinterleaver::doGetNextFrame() { + // If there's a frame immediately available, deliver it, otherwise get new + // frames from the source until one's available: + if (fFrames->haveReleaseableFrame()) { + releaseOutgoingFrame(); + + // Call our own 'after getting' function. Because we're not a 'leaf' + // source, we can call this directly, without risking infinite recursion. + afterGetting(this); + } else { +#ifdef TEST_LOSS + NOTE: This code no longer works, because it uses synchronous reads, + which are no longer supported. + static unsigned const framesPerPacket = 3; + static unsigned const frameCount = 0; + static Boolean packetIsLost; + while (1) { + unsigned packetCount = frameCount/framesPerPacket; + if ((frameCount++)%framesPerPacket == 0) { + packetIsLost = (our_random()%10 == 0); // simulate 10% packet loss ##### + } + + if (packetIsLost) { + // Read and discard the next input frame (that would be part of + // a lost packet): + unsigned char dummyBuf[2000]; + unsigned numBytesRead; + struct timeval presentationTime; + // (this works only if the source can be read synchronously) + fInputSource->syncGetNextFrame(dummyBuf, sizeof dummyBuf, + numBytesRead, presentationTime); + } else { + break; // from while (1) + } + } +#endif + unsigned char* dataPtr; + unsigned bytesAvailable; + fFrames->getIncomingFrameParams(dataPtr, bytesAvailable); + + // Read the next incoming frame (asynchronously) + fInputSource->getNextFrame(dataPtr, bytesAvailable, + &MP3ADUinterleaverBase::afterGettingFrame, this, + handleClosure, this); + } +} + +void MP3ADUdeinterleaver::afterGettingFrame(unsigned numBytesRead, + struct timeval presentationTime, + unsigned durationInMicroseconds) { + // Get the (icc,ii) and set the frame size of the newly-read frame: + unsigned char icc, ii; + fFrames->getIncomingFrameParamsAfter(numBytesRead, + presentationTime, durationInMicroseconds, + icc, ii); + + // Compare these to the values we saw last: + if (icc != fICClastSeen || ii == fIIlastSeen) { + // We've started a new interleave cycle + // (or interleaving was not used). Release all + // pending ADU frames to the ADU->MP3 conversion step: + fFrames->startNewCycle(); + } else { + // We're still in the same cycle as before. + // Move the newly-read frame into place, so it can be used: + fFrames->moveIncomingFrameIntoPlace(); + } + + fICClastSeen = icc; + fIIlastSeen = ii; +} + +void MP3ADUdeinterleaver::releaseOutgoingFrame() { + unsigned char* fromPtr; + fFrames->getReleasingFrameParams(fromPtr, fFrameSize, + fPresentationTime, fDurationInMicroseconds); + + if (fFrameSize > fMaxSize) { + fNumTruncatedBytes = fFrameSize - fMaxSize; + fFrameSize = fMaxSize; + } + memmove(fTo, fromPtr, fFrameSize); + + fFrames->releaseNext(); +} + +////////// InterleavingFrames (implementation) ////////// + +#define MAX_FRAME_SIZE 2000 /* conservatively high */ + +class InterleavingFrameDescriptor { +public: + InterleavingFrameDescriptor() {frameDataSize = 0;} + + unsigned frameDataSize; // includes ADU descriptor and (modified) MPEG hdr + struct timeval presentationTime; + unsigned durationInMicroseconds; + unsigned char frameData[MAX_FRAME_SIZE]; // ditto +}; + +InterleavingFrames::InterleavingFrames(unsigned maxCycleSize) + : fMaxCycleSize(maxCycleSize), fNextIndexToRelease(0), + fDescriptors(new InterleavingFrameDescriptor[maxCycleSize]) { +} +InterleavingFrames::~InterleavingFrames() { + delete[] fDescriptors; +} + +Boolean InterleavingFrames::haveReleaseableFrame() { + return fDescriptors[fNextIndexToRelease].frameDataSize > 0; +} + +void InterleavingFrames::getIncomingFrameParams(unsigned char index, + unsigned char*& dataPtr, + unsigned& bytesAvailable) { + InterleavingFrameDescriptor& desc = fDescriptors[index]; + dataPtr = &desc.frameData[0]; + bytesAvailable = MAX_FRAME_SIZE; +} + +void InterleavingFrames::getReleasingFrameParams(unsigned char index, + unsigned char*& dataPtr, + unsigned& bytesInUse, + struct timeval& presentationTime, + unsigned& durationInMicroseconds) { + InterleavingFrameDescriptor& desc = fDescriptors[index]; + dataPtr = &desc.frameData[0]; + bytesInUse = desc.frameDataSize; + presentationTime = desc.presentationTime; + durationInMicroseconds = desc.durationInMicroseconds; +} + +void InterleavingFrames::setFrameParams(unsigned char index, + unsigned char icc, + unsigned char ii, + unsigned frameSize, + struct timeval presentationTime, + unsigned durationInMicroseconds) { + InterleavingFrameDescriptor& desc = fDescriptors[index]; + desc.frameDataSize = frameSize; + desc.presentationTime = presentationTime; + desc.durationInMicroseconds = durationInMicroseconds; + + // Advance over the ADU descriptor, to get to the MPEG 'syncword': + unsigned char* ptr = &desc.frameData[0]; + (void)ADUdescriptor::getRemainingFrameSize(ptr); + + // Replace the next 11 bits with (ii,icc): + *ptr++ = ii; + *ptr &=~ 0xE0; + *ptr |= (icc<<5); +} + +void InterleavingFrames::releaseNext() { + fDescriptors[fNextIndexToRelease].frameDataSize = 0; + fNextIndexToRelease = (fNextIndexToRelease+1)%fMaxCycleSize; +} + +////////// DeinterleavingFrames (implementation) ////////// + +class DeinterleavingFrameDescriptor { +public: + DeinterleavingFrameDescriptor() {frameDataSize = 0; frameData = NULL;} + virtual ~DeinterleavingFrameDescriptor() {delete[] frameData;} + + unsigned frameDataSize; // includes ADU descriptor and (modified) MPEG hdr + struct timeval presentationTime; + unsigned durationInMicroseconds; + unsigned char* frameData; +}; + +DeinterleavingFrames::DeinterleavingFrames() + : fNextIndexToRelease(0), fHaveEndedCycle(False), + fMinIndexSeen(MAX_CYCLE_SIZE), fMaxIndexSeen(0), + fDescriptors(new DeinterleavingFrameDescriptor[MAX_CYCLE_SIZE+1]) { +} +DeinterleavingFrames::~DeinterleavingFrames() { + delete[] fDescriptors; +} + +Boolean DeinterleavingFrames::haveReleaseableFrame() { + if (!fHaveEndedCycle) { + // Check just the next frame in the sequence + return fDescriptors[fNextIndexToRelease].frameDataSize > 0; + } else { + // We've just ended a cycle, so we can skip over frames that didn't + // get filled in (due to packet loss): + if (fNextIndexToRelease < fMinIndexSeen) { + fNextIndexToRelease = fMinIndexSeen; + } + while (fNextIndexToRelease < fMaxIndexSeen + && fDescriptors[fNextIndexToRelease].frameDataSize == 0) { + ++fNextIndexToRelease; + } + if (fNextIndexToRelease >= fMaxIndexSeen) { + // No more frames are available from the cycle that we just ended, so + // clear out all previously stored frames, then make available + // the last-read frame, and return false for now: + for (unsigned i = fMinIndexSeen; i < fMaxIndexSeen; ++i) { + fDescriptors[i].frameDataSize = 0; + } + + fMinIndexSeen = MAX_CYCLE_SIZE; fMaxIndexSeen = 0; + moveIncomingFrameIntoPlace(); + + fHaveEndedCycle = False; + fNextIndexToRelease = 0; + return False; + } + + return True; + } +} + +void DeinterleavingFrames::getIncomingFrameParams(unsigned char*& dataPtr, + unsigned& bytesAvailable) { + // Use fDescriptors[MAX_CYCLE_SIZE] to store the incoming frame, + // prior to figuring out its real position: + DeinterleavingFrameDescriptor& desc = fDescriptors[MAX_CYCLE_SIZE]; + if (desc.frameData == NULL) { + // There's no buffer yet, so allocate a new one: + desc.frameData = new unsigned char[MAX_FRAME_SIZE]; + } + dataPtr = desc.frameData; + bytesAvailable = MAX_FRAME_SIZE; +} + +void DeinterleavingFrames +::getIncomingFrameParamsAfter(unsigned frameSize, + struct timeval presentationTime, + unsigned durationInMicroseconds, + unsigned char& icc, unsigned char& ii) { + DeinterleavingFrameDescriptor& desc = fDescriptors[MAX_CYCLE_SIZE]; + desc.frameDataSize = frameSize; + desc.presentationTime = presentationTime; + desc.durationInMicroseconds = durationInMicroseconds; + + // Advance over the ADU descriptor, to get to the MPEG 'syncword': + unsigned char* ptr = desc.frameData; + (void)ADUdescriptor::getRemainingFrameSize(ptr); + + // Read the next 11 bits into (ii,icc), and replace them with all-1s: + fIIlastSeen = ii = *ptr; *ptr++ = 0xFF; + icc = (*ptr&0xE0)>>5; *ptr |= 0xE0; +} + +void DeinterleavingFrames::getReleasingFrameParams(unsigned char*& dataPtr, + unsigned& bytesInUse, + struct timeval& presentationTime, + unsigned& durationInMicroseconds) { + DeinterleavingFrameDescriptor& desc = fDescriptors[fNextIndexToRelease]; + dataPtr = desc.frameData; + bytesInUse = desc.frameDataSize; + presentationTime = desc.presentationTime; + durationInMicroseconds = desc.durationInMicroseconds; +} + +void DeinterleavingFrames::moveIncomingFrameIntoPlace() { + DeinterleavingFrameDescriptor& fromDesc = fDescriptors[MAX_CYCLE_SIZE]; + DeinterleavingFrameDescriptor& toDesc = fDescriptors[fIIlastSeen]; + + toDesc.frameDataSize = fromDesc.frameDataSize; + toDesc.presentationTime = fromDesc.presentationTime; + + // Move the data pointer into place by swapping the data pointers: + unsigned char* tmp = toDesc.frameData; + toDesc.frameData = fromDesc.frameData; + fromDesc.frameData = tmp; + + if (fIIlastSeen < fMinIndexSeen) { + fMinIndexSeen = fIIlastSeen; + } + if (fIIlastSeen + 1 > fMaxIndexSeen) { + fMaxIndexSeen = fIIlastSeen + 1; + } +} + +void DeinterleavingFrames::releaseNext() { + fDescriptors[fNextIndexToRelease].frameDataSize = 0; + fNextIndexToRelease = (fNextIndexToRelease+1)%MAX_CYCLE_SIZE; +} + +void DeinterleavingFrames::startNewCycle() { + fHaveEndedCycle = True; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MP3AudioFileServerMediaSubsession.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MP3AudioFileServerMediaSubsession.cpp new file mode 100644 index 000000000..81ad60b11 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MP3AudioFileServerMediaSubsession.cpp @@ -0,0 +1,180 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A 'ServerMediaSubsession' object that creates new, unicast, "RTPSink"s +// on demand, from a MP3 audio file. +// (Actually, any MPEG-1 or MPEG-2 audio file should work.) +// Implementation + +#include "MP3AudioFileServerMediaSubsession.hh" +#include "MPEG1or2AudioRTPSink.hh" +#include "MP3ADURTPSink.hh" +#include "MP3FileSource.hh" +#include "MP3ADU.hh" + +MP3AudioFileServerMediaSubsession* MP3AudioFileServerMediaSubsession +::createNew(UsageEnvironment& env, char const* fileName, Boolean reuseFirstSource, + Boolean generateADUs, Interleaving* interleaving) { + return new MP3AudioFileServerMediaSubsession(env, fileName, reuseFirstSource, + generateADUs, interleaving); +} + +MP3AudioFileServerMediaSubsession +::MP3AudioFileServerMediaSubsession(UsageEnvironment& env, + char const* fileName, Boolean reuseFirstSource, + Boolean generateADUs, + Interleaving* interleaving) + : FileServerMediaSubsession(env, fileName, reuseFirstSource), + fGenerateADUs(generateADUs), fInterleaving(interleaving), fFileDuration(0.0) { +} + +MP3AudioFileServerMediaSubsession +::~MP3AudioFileServerMediaSubsession() { + delete fInterleaving; +} + +FramedSource* MP3AudioFileServerMediaSubsession +::createNewStreamSourceCommon(FramedSource* baseMP3Source, unsigned mp3NumBytes, unsigned& estBitrate) { + FramedSource* streamSource; + do { + streamSource = baseMP3Source; // by default + if (streamSource == NULL) break; + + // Use the MP3 file size, plus the duration, to estimate the stream's bitrate: + if (mp3NumBytes > 0 && fFileDuration > 0.0) { + estBitrate = (unsigned)(mp3NumBytes/(125*fFileDuration) + 0.5); // kbps, rounded + if (estBitrate == 0) estBitrate = 128; // kbps, estimate + } else { + estBitrate = 128; // kbps, estimate + } + + if (fGenerateADUs) { + // Add a filter that converts the source MP3s to ADUs: + streamSource = ADUFromMP3Source::createNew(envir(), streamSource); + if (streamSource == NULL) break; + + if (fInterleaving != NULL) { + // Add another filter that interleaves the ADUs before packetizing: + streamSource = MP3ADUinterleaver::createNew(envir(), *fInterleaving, + streamSource); + if (streamSource == NULL) break; + } + } else if (fFileDuration > 0.0) { + // Because this is a seekable file, insert a pair of filters: one that + // converts the input MP3 stream to ADUs; another that converts these + // ADUs back to MP3. This allows us to seek within the input stream without + // tripping over the MP3 'bit reservoir': + streamSource = ADUFromMP3Source::createNew(envir(), streamSource); + if (streamSource == NULL) break; + + streamSource = MP3FromADUSource::createNew(envir(), streamSource); + if (streamSource == NULL) break; + } + } while (0); + + return streamSource; +} + +void MP3AudioFileServerMediaSubsession::getBaseStreams(FramedSource* frontStream, + FramedSource*& sourceMP3Stream, ADUFromMP3Source*& aduStream/*if any*/) { + if (fGenerateADUs) { + // There's an ADU stream. + if (fInterleaving != NULL) { + // There's an interleaving filter in front of the ADU stream. So go back one, to reach the ADU stream: + aduStream = (ADUFromMP3Source*)(((FramedFilter*)frontStream)->inputSource()); + } else { + aduStream = (ADUFromMP3Source*)frontStream; + } + + // Then, go back one more, to reach the MP3 source: + sourceMP3Stream = (MP3FileSource*)(aduStream->inputSource()); + } else if (fFileDuration > 0.0) { + // There are a pair of filters - MP3->ADU and ADU->MP3 - in front of the + // original MP3 source. So, go back one, to reach the ADU source: + aduStream = (ADUFromMP3Source*)(((FramedFilter*)frontStream)->inputSource()); + + // Then, go back one more, to reach the MP3 source: + sourceMP3Stream = (MP3FileSource*)(aduStream->inputSource()); + } else { + // There's no filter in front of the source MP3 stream (and there's no ADU stream): + aduStream = NULL; + sourceMP3Stream = frontStream; + } +} + + +void MP3AudioFileServerMediaSubsession +::seekStreamSource(FramedSource* inputSource, double& seekNPT, double streamDuration, u_int64_t& /*numBytes*/) { + FramedSource* sourceMP3Stream; + ADUFromMP3Source* aduStream; + getBaseStreams(inputSource, sourceMP3Stream, aduStream); + + if (aduStream != NULL) aduStream->resetInput(); // because we're about to seek within its source + ((MP3FileSource*)sourceMP3Stream)->seekWithinFile(seekNPT, streamDuration); +} + +void MP3AudioFileServerMediaSubsession +::setStreamSourceScale(FramedSource* inputSource, float scale) { + + FramedSource* sourceMP3Stream; + ADUFromMP3Source* aduStream; + getBaseStreams(inputSource, sourceMP3Stream, aduStream); + + if (aduStream == NULL) return; // because, in this case, the stream's not scalable + + int iScale = (int)scale; + aduStream->setScaleFactor(iScale); + ((MP3FileSource*)sourceMP3Stream)->setPresentationTimeScale(iScale); +} + +FramedSource* MP3AudioFileServerMediaSubsession +::createNewStreamSource(unsigned /*clientSessionId*/, unsigned& estBitrate) { + MP3FileSource* mp3Source = MP3FileSource::createNew(envir(), fFileName); + if (mp3Source == NULL) return NULL; + fFileDuration = mp3Source->filePlayTime(); + + return createNewStreamSourceCommon(mp3Source, mp3Source->fileSize(), estBitrate); +} + +RTPSink* MP3AudioFileServerMediaSubsession +::createNewRTPSink(Groupsock* rtpGroupsock, + unsigned char rtpPayloadTypeIfDynamic, + FramedSource* /*inputSource*/) { + if (fGenerateADUs) { + return MP3ADURTPSink::createNew(envir(), rtpGroupsock, + rtpPayloadTypeIfDynamic); + } else { + return MPEG1or2AudioRTPSink::createNew(envir(), rtpGroupsock); + } +} + +void MP3AudioFileServerMediaSubsession::testScaleFactor(float& scale) { + if (fFileDuration <= 0.0) { + // The file is non-seekable, so is probably a live input source. + // We don't support scale factors other than 1 + scale = 1; + } else { + // We support any integral scale >= 1 + int iScale = (int)(scale + 0.5); // round + if (iScale < 1) iScale = 1; + scale = (float)iScale; + } +} + +float MP3AudioFileServerMediaSubsession::duration() const { + return fFileDuration; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MP3AudioMatroskaFileServerMediaSubsession.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MP3AudioMatroskaFileServerMediaSubsession.cpp new file mode 100644 index 000000000..53440542b --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MP3AudioMatroskaFileServerMediaSubsession.cpp @@ -0,0 +1,58 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A 'ServerMediaSubsession' object that creates new, unicast, "RTPSink"s +// on demand, from an MP3 audio track within a Matroska file. +// (Actually, MPEG-1 or MPEG-2 audio file should also work.) +// Implementation + +#include "FileServerMediaSubsession.hh" +#include "MP3AudioMatroskaFileServerMediaSubsession.hh" +#include "MatroskaDemuxedTrack.hh" + +MP3AudioMatroskaFileServerMediaSubsession* MP3AudioMatroskaFileServerMediaSubsession +::createNew(MatroskaFileServerDemux& demux, MatroskaTrack* track, + Boolean generateADUs, Interleaving* interleaving) { + return new MP3AudioMatroskaFileServerMediaSubsession(demux, track, generateADUs, interleaving); +} + +MP3AudioMatroskaFileServerMediaSubsession +::MP3AudioMatroskaFileServerMediaSubsession(MatroskaFileServerDemux& demux, MatroskaTrack* track, + Boolean generateADUs, Interleaving* interleaving) + : MP3AudioFileServerMediaSubsession(demux.envir(), demux.fileName(), False, generateADUs, interleaving), + fOurDemux(demux), fTrackNumber(track->trackNumber) { + fFileDuration = fOurDemux.fileDuration(); +} + +MP3AudioMatroskaFileServerMediaSubsession::~MP3AudioMatroskaFileServerMediaSubsession() { +} + +void MP3AudioMatroskaFileServerMediaSubsession +::seekStreamSource(FramedSource* inputSource, double& seekNPT, double /*streamDuration*/, u_int64_t& /*numBytes*/) { + FramedSource* sourceMP3Stream; + ADUFromMP3Source* aduStream; + getBaseStreams(inputSource, sourceMP3Stream, aduStream); + + if (aduStream != NULL) aduStream->resetInput(); // because we're about to seek within its source + ((MatroskaDemuxedTrack*)sourceMP3Stream)->seekToTime(seekNPT); +} + +FramedSource* MP3AudioMatroskaFileServerMediaSubsession +::createNewStreamSource(unsigned clientSessionId, unsigned& estBitrate) { + FramedSource* baseMP3Source = fOurDemux.newDemuxedTrack(clientSessionId, fTrackNumber); + return createNewStreamSourceCommon(baseMP3Source, 0, estBitrate); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MP3AudioMatroskaFileServerMediaSubsession.hh b/src/big/mpp/middleware/src/live555/liveMedia/MP3AudioMatroskaFileServerMediaSubsession.hh new file mode 100644 index 000000000..c00cc1398 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MP3AudioMatroskaFileServerMediaSubsession.hh @@ -0,0 +1,57 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A 'ServerMediaSubsession' object that creates new, unicast, "RTPSink"s +// on demand, from an MP3 audio track within a Matroska file. +// (Actually, MPEG-1 or MPEG-2 audio should also work.) +// C++ header + +#ifndef _MP3_AUDIO_MATROSKA_FILE_SERVER_MEDIA_SUBSESSION_HH +#define _MP3_AUDIO_MATROSKA_FILE_SERVER_MEDIA_SUBSESSION_HH + +#ifndef _MP3_AUDIO_FILE_SERVER_MEDIA_SUBSESSION_HH +#include "MP3AudioFileServerMediaSubsession.hh" +#endif +#ifndef _MATROSKA_FILE_SERVER_DEMUX_HH +#include "MatroskaFileServerDemux.hh" +#endif + +class MP3AudioMatroskaFileServerMediaSubsession: public MP3AudioFileServerMediaSubsession { +public: + static MP3AudioMatroskaFileServerMediaSubsession* + createNew(MatroskaFileServerDemux& demux, MatroskaTrack* track, + Boolean generateADUs = False, Interleaving* interleaving = NULL); + // Note: "interleaving" is used only if "generateADUs" is True, + // (and a value of NULL means 'no interleaving') + +private: + MP3AudioMatroskaFileServerMediaSubsession(MatroskaFileServerDemux& demux, MatroskaTrack* track, + Boolean generateADUs, Interleaving* interleaving); + // called only by createNew(); + virtual ~MP3AudioMatroskaFileServerMediaSubsession(); + +private: // redefined virtual functions + virtual void seekStreamSource(FramedSource* inputSource, double& seekNPT, double streamDuration, u_int64_t& numBytes); + virtual FramedSource* createNewStreamSource(unsigned clientSessionId, + unsigned& estBitrate); + +private: + MatroskaFileServerDemux& fOurDemux; + unsigned fTrackNumber; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MP3FileSource.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MP3FileSource.cpp new file mode 100644 index 000000000..e42d03e3c --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MP3FileSource.cpp @@ -0,0 +1,195 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// MP3 File Sources +// Implementation + +#include "MP3FileSource.hh" +#include "MP3StreamState.hh" +#include "InputFile.hh" + +////////// MP3FileSource ////////// + +MP3FileSource* MP3FileSource::createNew(UsageEnvironment& env, char const* fileName) { + MP3FileSource* newSource = NULL; + + do { + FILE* fid; + + fid = OpenInputFile(env, fileName); + if (fid == NULL) break; + + newSource = new MP3FileSource(env, fid); + if (newSource == NULL) break; + + unsigned fileSize = (unsigned)GetFileSize(fileName, fid); + newSource->assignStream(fid, fileSize); + + return newSource; + } while (0); + + Medium::close(newSource); + return NULL; +} + +MP3FileSource::MP3FileSource(UsageEnvironment& env, FILE* fid) + : FramedFileSource(env, fid), + fStreamState(new MP3StreamState), + fHaveStartedReading(False), fHaveBeenInitialized(False), + fLimitNumBytesToStream(False), fNumBytesToStream(0) { + //###### We can't make the socket non-blocking yet, because we still do synchronous reads + //###### on it (to find MP3 headers). Later, fix this. + //makeSocketNonBlocking(fileno(fFid)); + + // Test whether the file is seekable + fFidIsSeekable = FileIsSeekable(fFid); +} + +MP3FileSource::~MP3FileSource() { + if (fFid != NULL) envir().taskScheduler().turnOffBackgroundReadHandling(fileno(fFid)); + + delete fStreamState; // closes the input file +} + +char const* MP3FileSource::MIMEtype() const { + return "audio/MPEG"; +} + +float MP3FileSource::filePlayTime() const { + return fStreamState->filePlayTime(); +} + +unsigned MP3FileSource::fileSize() const { + return fStreamState->fileSize(); +} + +void MP3FileSource::setPresentationTimeScale(unsigned scale) { + fStreamState->setPresentationTimeScale(scale); +} + +void MP3FileSource::seekWithinFile(double seekNPT, double streamDuration) { + float fileDuration = filePlayTime(); + + // First, make sure that 0.0 <= seekNPT <= seekNPT + streamDuration <= fileDuration + if (seekNPT < 0.0) { + seekNPT = 0.0; + } else if (seekNPT > fileDuration) { + seekNPT = fileDuration; + } + if (streamDuration < 0.0) { + streamDuration = 0.0; + } else if (seekNPT + streamDuration > fileDuration) { + streamDuration = fileDuration - seekNPT; + } + + float seekFraction = (float)seekNPT/fileDuration; + unsigned seekByteNumber = fStreamState->getByteNumberFromPositionFraction(seekFraction); + fStreamState->seekWithinFile(seekByteNumber); + + fLimitNumBytesToStream = False; // by default + if (streamDuration > 0.0) { + float endFraction = (float)(seekNPT + streamDuration)/fileDuration; + unsigned endByteNumber = fStreamState->getByteNumberFromPositionFraction(endFraction); + if (endByteNumber > seekByteNumber) { // sanity check + fNumBytesToStream = endByteNumber - seekByteNumber; + fLimitNumBytesToStream = True; + } + } +} + +void MP3FileSource::getAttributes() const { + char buffer[200]; + fStreamState->getAttributes(buffer, sizeof buffer); + envir().setResultMsg(buffer); +} + +void MP3FileSource::doGetNextFrame() { + if (feof(fFid) || ferror(fFid) || (fLimitNumBytesToStream && fNumBytesToStream == 0)) { + handleClosure(); + return; + } + + if (!fHaveStartedReading) { + // Await readable data from the file: + envir().taskScheduler().turnOnBackgroundReadHandling(fileno(fFid), + (TaskScheduler::BackgroundHandlerProc*)&fileReadableHandler, this); + fHaveStartedReading = True; + return; + } + + if (!fHaveBeenInitialized) { + if (!initializeStream()) return; + + fPresentationTime = fFirstFramePresentationTime; + fHaveBeenInitialized = True; + } else { + if (fStreamState->findNextHeader(fPresentationTime) == 0) return; + } + + if (fLimitNumBytesToStream && fNumBytesToStream < (u_int64_t)fMaxSize) { + fMaxSize = (unsigned)fNumBytesToStream; + } + if (!fStreamState->readFrame(fTo, fMaxSize, fFrameSize, fDurationInMicroseconds)) { + char tmp[200]; + sprintf(tmp, + "Insufficient buffer size %d for reading MPEG audio frame (needed %d)\n", + fMaxSize, fFrameSize); + envir().setResultMsg(tmp); + handleClosure(); + return; + } + fNumBytesToStream -= fFrameSize; + + // Inform the reader that he has data: + // Because the file read was done from the event loop, we can call the + // 'after getting' function directly, without risk of infinite recursion: + FramedSource::afterGetting(this); +} + +void MP3FileSource::fileReadableHandler(MP3FileSource* source, int /*mask*/) { + if (!source->isCurrentlyAwaitingData()) { + source->doStopGettingFrames(); // we're not ready for the data yet + return; + } + source->doGetNextFrame(); +} + +void MP3FileSource::assignStream(FILE* fid, unsigned fileSize) { + fStreamState->assignStream(fid, fileSize); + + if (!fHaveBeenInitialized) { + if (!initializeStream()) return; + + fPresentationTime = fFirstFramePresentationTime; + fHaveBeenInitialized = True; + } +} + +Boolean MP3FileSource::initializeStream() { + // Make sure the file has an appropriate header near the start: + if (fStreamState->findNextHeader(fFirstFramePresentationTime) == 0) { + envir().setResultMsg("not an MPEG audio file"); + return False; + } + + fStreamState->checkForXingHeader(); // in case this is a VBR file + + // Hack: It's possible that our environment's 'result message' has been + // reset within this function, so set it again to our name now: + envir().setResultMsg(name()); + return True; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MP3Internals.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MP3Internals.cpp new file mode 100644 index 000000000..3b9ec9a33 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MP3Internals.cpp @@ -0,0 +1,809 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// MP3 internal implementation details +// Implementation + +#include "MP3InternalsHuffman.hh" + +#include +#include +#include +#include + +// This is crufty old code that needs to be cleaned up ##### + +static unsigned const live_tabsel[2][3][16] = { + { {32,32,64,96,128,160,192,224,256,288,320,352,384,416,448,448}, + {32,32,48,56, 64, 80, 96,112,128,160,192,224,256,320,384,384}, + {32,32,40,48, 56, 64, 80, 96,112,128,160,192,224,256,320,320} }, + + { {32,32,48,56,64,80,96,112,128,144,160,176,192,224,256,256}, + {8,8,16,24,32,40,48,56,64,80,96,112,128,144,160,160}, + {8,8,16,24,32,40,48,56,64,80,96,112,128,144,160,160} } +}; +/* Note: live_tabsel[*][*][0 or 15] shouldn't occur; use dummy values there */ + +static long const live_freqs[] += { 44100, 48000, 32000, 22050, 24000, 16000, 11025, 12000, 8000, 0 }; + +struct bandInfoStruct { + int longIdx[23]; + int longDiff[22]; + int shortIdx[14]; + int shortDiff[13]; +}; + +static struct bandInfoStruct const bandInfo[7] = { +/* MPEG 1.0 */ + { {0,4,8,12,16,20,24,30,36,44,52,62,74, 90,110,134,162,196,238,288,342,418,576}, + {4,4,4,4,4,4,6,6,8, 8,10,12,16,20,24,28,34,42,50,54, 76,158}, + {0,4*3,8*3,12*3,16*3,22*3,30*3,40*3,52*3,66*3, 84*3,106*3,136*3,192*3}, + {4,4,4,4,6,8,10,12,14,18,22,30,56} } , + + { {0,4,8,12,16,20,24,30,36,42,50,60,72, 88,106,128,156,190,230,276,330,384,576}, + {4,4,4,4,4,4,6,6,6, 8,10,12,16,18,22,28,34,40,46,54, 54,192}, + {0,4*3,8*3,12*3,16*3,22*3,28*3,38*3,50*3,64*3, 80*3,100*3,126*3,192*3}, + {4,4,4,4,6,6,10,12,14,16,20,26,66} } , + + { {0,4,8,12,16,20,24,30,36,44,54,66,82,102,126,156,194,240,296,364,448,550,576} , + {4,4,4,4,4,4,6,6,8,10,12,16,20,24,30,38,46,56,68,84,102, 26} , + {0,4*3,8*3,12*3,16*3,22*3,30*3,42*3,58*3,78*3,104*3,138*3,180*3,192*3} , + {4,4,4,4,6,8,12,16,20,26,34,42,12} } , + +/* MPEG 2.0 */ + { {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576}, + {6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54 } , + {0,4*3,8*3,12*3,18*3,24*3,32*3,42*3,56*3,74*3,100*3,132*3,174*3,192*3} , + {4,4,4,6,6,8,10,14,18,26,32,42,18 } } , + + { {0,6,12,18,24,30,36,44,54,66,80,96,114,136,162,194,232,278,330,394,464,540,576}, + {6,6,6,6,6,6,8,10,12,14,16,18,22,26,32,38,46,52,64,70,76,36 } , + {0,4*3,8*3,12*3,18*3,26*3,36*3,48*3,62*3,80*3,104*3,136*3,180*3,192*3} , + {4,4,4,6,8,10,12,14,18,24,32,44,12 } } , + + { {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576}, + {6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54 }, + {0,4*3,8*3,12*3,18*3,26*3,36*3,48*3,62*3,80*3,104*3,134*3,174*3,192*3}, + {4,4,4,6,8,10,12,14,18,24,30,40,18 } } , + +/* MPEG 2.5, wrong! table (it's just a copy of MPEG 2.0/44.1kHz) */ + { {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576}, + {6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54 } , + {0,4*3,8*3,12*3,18*3,24*3,32*3,42*3,56*3,74*3,100*3,132*3,174*3,192*3} , + {4,4,4,6,6,8,10,14,18,26,32,42,18 } } , +}; + +unsigned int n_slen2[512]; /* MPEG 2.0 slen for 'normal' mode */ +unsigned int i_slen2[256]; /* MPEG 2.0 slen for intensity stereo */ + +#define MPG_MD_MONO 3 + + +////////// MP3FrameParams ////////// + +MP3FrameParams::MP3FrameParams() + : isMPEG2(0), samplingFreq(44100), frameSize(413), // init params, in case we're used early + bv(frameBytes, 0, sizeof frameBytes) /* by default */ { + oldHdr = firstHdr = 0; + + static Boolean doneInit = False; + if (doneInit) return; + + int i,j,k,l; + + for (i=0;i<5;i++) { + for (j=0;j<6;j++) { + for (k=0;k<6;k++) { + int n = k + j * 6 + i * 36; + i_slen2[n] = i|(j<<3)|(k<<6)|(3<<12); + } + } + } + for (i=0;i<4;i++) { + for (j=0;j<4;j++) { + for (k=0;k<4;k++) { + int n = k + j * 4 + i * 16; + i_slen2[n+180] = i|(j<<3)|(k<<6)|(4<<12); + } + } + } + for (i=0;i<4;i++) { + for (j=0;j<3;j++) { + int n = j + i * 3; + i_slen2[n+244] = i|(j<<3) | (5<<12); + n_slen2[n+500] = i|(j<<3) | (2<<12) | (1<<15); + } + } + + for (i=0;i<5;i++) { + for (j=0;j<5;j++) { + for (k=0;k<4;k++) { + for (l=0;l<4;l++) { + int n = l + k * 4 + j * 16 + i * 80; + n_slen2[n] = i|(j<<3)|(k<<6)|(l<<9)|(0<<12); + } + } + } + } + for (i=0;i<5;i++) { + for (j=0;j<5;j++) { + for (k=0;k<4;k++) { + int n = k + j * 4 + i * 20; + n_slen2[n+400] = i|(j<<3)|(k<<6)|(1<<12); + } + } + } + doneInit = True; +} + +MP3FrameParams::~MP3FrameParams() { +} + +void MP3FrameParams::setParamsFromHeader() { + if (hdr & (1<<20)) { + isMPEG2 = (hdr & (1<<19)) ? 0x0 : 0x1; + isMPEG2_5 = 0; + } + else { + isMPEG2 = 1; + isMPEG2_5 = 1; + } + + layer = 4-((hdr>>17)&3); + if (layer == 4) layer = 3; // layer==4 is not allowed + bitrateIndex = ((hdr>>12)&0xf); + + if (isMPEG2_5) { + samplingFreqIndex = ((hdr>>10)&0x3) + 6; + } else { + samplingFreqIndex = ((hdr>>10)&0x3) + (isMPEG2*3); + } + + hasCRC = (hdr & 0x10000) == 0; + + padding = ((hdr>>9)&0x1); + extension = ((hdr>>8)&0x1); + mode = ((hdr>>6)&0x3); + mode_ext = ((hdr>>4)&0x3); + copyright = ((hdr>>3)&0x1); + original = ((hdr>>2)&0x1); + emphasis = hdr & 0x3; + + stereo = (mode == MPG_MD_MONO) ? 1 : 2; + + if (((hdr>>10)&0x3) == 0x3) { +#ifdef DEBUG_ERRORS + fprintf(stderr,"Stream error - hdr: 0x%08x\n", hdr); +#endif + } + + bitrate = live_tabsel[isMPEG2][layer-1][bitrateIndex]; + samplingFreq = live_freqs[samplingFreqIndex]; + isStereo = (stereo > 1); + isFreeFormat = (bitrateIndex == 0); + frameSize + = ComputeFrameSize(bitrate, samplingFreq, padding, isMPEG2, layer); + sideInfoSize = computeSideInfoSize(); + } + +unsigned MP3FrameParams::computeSideInfoSize() { + unsigned size; + + if (isMPEG2) { + size = isStereo ? 17 : 9; + } else { + size = isStereo ? 32 : 17; + } + + if (hasCRC) { + size += 2; + } + + return size; +} + +unsigned ComputeFrameSize(unsigned bitrate, unsigned samplingFreq, + Boolean usePadding, Boolean isMPEG2, + unsigned char layer) { + if (samplingFreq == 0) return 0; + unsigned const bitrateMultiplier = (layer == 1) ? 12000*4 : 144000; + unsigned framesize; + + framesize = bitrate*bitrateMultiplier; + framesize /= samplingFreq<<(isMPEG2 ? 1 : 0); + framesize = framesize + usePadding - 4; + + return framesize; +} + +#define TRUNC_FAIRLY +static unsigned updateSideInfoSizes(MP3SideInfo& sideInfo, Boolean isMPEG2, + unsigned char const* mainDataPtr, + unsigned allowedNumBits, + unsigned& part23Length0a, + unsigned& part23Length0aTruncation, + unsigned& part23Length0b, + unsigned& part23Length0bTruncation, + unsigned& part23Length1a, + unsigned& part23Length1aTruncation, + unsigned& part23Length1b, + unsigned& part23Length1bTruncation) { + unsigned p23L0, p23L1 = 0, p23L0Trunc = 0, p23L1Trunc = 0; + + p23L0 = sideInfo.ch[0].gr[0].part2_3_length; + p23L1 = isMPEG2 ? 0 : sideInfo.ch[0].gr[1].part2_3_length; +#ifdef TRUNC_ONLY0 + if (p23L0 < allowedNumBits) + allowedNumBits = p23L0; +#endif +#ifdef TRUNC_ONLY1 + if (p23L1 < allowedNumBits) + allowedNumBits = p23L1; +#endif + if (p23L0 + p23L1 > allowedNumBits) { + /* We need to shorten one or both fields */ + unsigned truncation = p23L0 + p23L1 - allowedNumBits; +#ifdef TRUNC_FAIRLY + p23L0Trunc = (truncation*p23L0)/(p23L0 + p23L1); + p23L1Trunc = truncation - p23L0Trunc; +#endif +#if defined(TRUNC_FAVOR0) || defined(TRUNC_ONLY0) + p23L1Trunc = (truncation>p23L1) ? p23L1 : truncation; + p23L0Trunc = truncation - p23L1Trunc; +#endif +#if defined(TRUNC_FAVOR1) || defined(TRUNC_ONLY1) + p23L0Trunc = (truncation>p23L0) ? p23L0 : truncation; + p23L1Trunc = truncation - p23L0Trunc; +#endif + } + + /* ASSERT: (p23L0Trunc <= p23L0) && (p23l1Trunc <= p23L1) */ + p23L0 -= p23L0Trunc; p23L1 -= p23L1Trunc; +#ifdef DEBUG + fprintf(stderr, "updateSideInfoSizes (allowed: %d): %d->%d, %d->%d\n", allowedNumBits, p23L0+p23L0Trunc, p23L0, p23L1+p23L1Trunc, p23L1); +#endif + + // The truncations computed above are still estimates. We need to + // adjust them so that the new fields will continue to end on + // Huffman-encoded sample boundaries: + updateSideInfoForHuffman(sideInfo, isMPEG2, mainDataPtr, + p23L0, p23L1, + part23Length0a, part23Length0aTruncation, + part23Length0b, part23Length0bTruncation, + part23Length1a, part23Length1aTruncation, + part23Length1b, part23Length1bTruncation); + p23L0 = part23Length0a + part23Length0b; + p23L1 = part23Length1a + part23Length1b; + + sideInfo.ch[0].gr[0].part2_3_length = p23L0; + sideInfo.ch[0].gr[1].part2_3_length = p23L1; + part23Length0bTruncation + += sideInfo.ch[1].gr[0].part2_3_length; /* allow for stereo */ + sideInfo.ch[1].gr[0].part2_3_length = 0; /* output mono */ + sideInfo.ch[1].gr[1].part2_3_length = 0; /* output mono */ + + return p23L0 + p23L1; +} + + +Boolean GetADUInfoFromMP3Frame(unsigned char const* framePtr, + unsigned totFrameSize, + unsigned& hdr, unsigned& frameSize, + MP3SideInfo& sideInfo, unsigned& sideInfoSize, + unsigned& backpointer, unsigned& aduSize) { + if (totFrameSize < 4) return False; // there's not enough data + + MP3FrameParams fr; + fr.hdr = ((unsigned)framePtr[0] << 24) | ((unsigned)framePtr[1] << 16) + | ((unsigned)framePtr[2] << 8) | (unsigned)framePtr[3]; + fr.setParamsFromHeader(); + fr.setBytePointer(framePtr + 4, totFrameSize - 4); // skip hdr + + frameSize = 4 + fr.frameSize; + + if (fr.layer != 3) { + // Special case for non-layer III frames + backpointer = 0; + sideInfoSize = 0; + aduSize = fr.frameSize; + return True; + } + + sideInfoSize = fr.sideInfoSize; + if (totFrameSize < 4 + sideInfoSize) return False; // not enough data + + fr.getSideInfo(sideInfo); + + hdr = fr.hdr; + backpointer = sideInfo.main_data_begin; + unsigned numBits = sideInfo.ch[0].gr[0].part2_3_length; + numBits += sideInfo.ch[0].gr[1].part2_3_length; + numBits += sideInfo.ch[1].gr[0].part2_3_length; + numBits += sideInfo.ch[1].gr[1].part2_3_length; + aduSize = (numBits+7)/8; +#ifdef DEBUG + fprintf(stderr, "mp3GetADUInfoFromFrame: hdr: %08x, frameSize: %d, part2_3_lengths: %d,%d,%d,%d, aduSize: %d, backpointer: %d\n", hdr, frameSize, sideInfo.ch[0].gr[0].part2_3_length, sideInfo.ch[0].gr[1].part2_3_length, sideInfo.ch[1].gr[0].part2_3_length, sideInfo.ch[1].gr[1].part2_3_length, aduSize, backpointer); +#endif + + return True; +} + + +static void getSideInfo1(MP3FrameParams& fr, MP3SideInfo& si, + int stereo, int ms_stereo, long sfreq, + int /*single*/) { + int ch, gr; +#if 0 + int powdiff = (single == 3) ? 4 : 0; +#endif + + /* initialize all four "part2_3_length" fields to zero: */ + si.ch[0].gr[0].part2_3_length = 0; si.ch[1].gr[0].part2_3_length = 0; + si.ch[0].gr[1].part2_3_length = 0; si.ch[1].gr[1].part2_3_length = 0; + + si.main_data_begin = fr.getBits(9); + if (stereo == 1) + si.private_bits = fr.getBits(5); + else + si.private_bits = fr.getBits(3); + + for (ch=0; ch win-sw-flag = 0 */ + gr_info.window_switching_flag = fr.get1Bit(); + if (gr_info.window_switching_flag) { + int i; + gr_info.block_type = fr.getBits(2); + gr_info.mixed_block_flag = fr.get1Bit(); + gr_info.table_select[0] = fr.getBits(5); + gr_info.table_select[1] = fr.getBits(5); + /* + * table_select[2] not needed, because there is no region2, + * but to satisfy some verifications tools we set it either. + */ + gr_info.table_select[2] = 0; + for (i=0;i<3;i++) { + gr_info.subblock_gain[i] = fr.getBits(3); + gr_info.full_gain[i] + = gr_info.pow2gain + ((gr_info.subblock_gain[i])<<3); + } + +#ifdef DEBUG_ERRORS + if (gr_info.block_type == 0) { + fprintf(stderr,"Blocktype == 0 and window-switching == 1 not allowed.\n"); + } +#endif + /* region_count/start parameters are implicit in this case. */ + gr_info.region1start = 36>>1; + gr_info.region2start = 576>>1; + } + else + { + int i,r0c,r1c; + for (i=0; i<3; i++) { + gr_info.table_select[i] = fr.getBits(5); + } + r0c = gr_info.region0_count = fr.getBits(4); + r1c = gr_info.region1_count = fr.getBits(3); + gr_info.region1start = bandInfo[sfreq].longIdx[r0c+1] >> 1 ; + gr_info.region2start = bandInfo[sfreq].longIdx[r0c+1+r1c+1] >> 1; + gr_info.block_type = 0; + gr_info.mixed_block_flag = 0; + } + gr_info.preflag = fr.get1Bit(); + gr_info.scalefac_scale = fr.get1Bit(); + gr_info.count1table_select = fr.get1Bit(); + } + } +} + +static void getSideInfo2(MP3FrameParams& fr, MP3SideInfo& si, + int stereo, int ms_stereo, long sfreq, + int /*single*/) { + int ch; +#if 0 + int powdiff = (single == 3) ? 4 : 0; +#endif + + /* initialize all four "part2_3_length" fields to zero: */ + si.ch[0].gr[0].part2_3_length = 0; si.ch[1].gr[0].part2_3_length = 0; + si.ch[0].gr[1].part2_3_length = 0; si.ch[1].gr[1].part2_3_length = 0; + + si.main_data_begin = fr.getBits(8); + if (stereo == 1) + si.private_bits = fr.get1Bit(); + else + si.private_bits = fr.getBits(2); + + for (ch=0; ch win-sw-flag = 0 */ + gr_info.window_switching_flag = fr.get1Bit(); + if (gr_info.window_switching_flag) { + int i; + gr_info.block_type = fr.getBits(2); + gr_info.mixed_block_flag = fr.get1Bit(); + gr_info.table_select[0] = fr.getBits(5); + gr_info.table_select[1] = fr.getBits(5); + /* + * table_select[2] not needed, because there is no region2, + * but to satisfy some verifications tools we set it either. + */ + gr_info.table_select[2] = 0; + for (i=0;i<3;i++) { + gr_info.subblock_gain[i] = fr.getBits(3); + gr_info.full_gain[i] + = gr_info.pow2gain + ((gr_info.subblock_gain[i])<<3); + } + +#ifdef DEBUG_ERRORS + if (gr_info.block_type == 0) { + fprintf(stderr,"Blocktype == 0 and window-switching == 1 not allowed.\n"); + } +#endif + /* region_count/start parameters are implicit in this case. */ +/* check this again! */ + if (gr_info.block_type == 2) + gr_info.region1start = 36>>1; + else { + gr_info.region1start = 54>>1; + } + gr_info.region2start = 576>>1; + } + else + { + int i,r0c,r1c; + for (i=0; i<3; i++) { + gr_info.table_select[i] = fr.getBits(5); + } + r0c = gr_info.region0_count = fr.getBits(4); + r1c = gr_info.region1_count = fr.getBits(3); + gr_info.region1start = bandInfo[sfreq].longIdx[r0c+1] >> 1 ; + gr_info.region2start = bandInfo[sfreq].longIdx[r0c+1+r1c+1] >> 1; + gr_info.block_type = 0; + gr_info.mixed_block_flag = 0; + } + gr_info.scalefac_scale = fr.get1Bit(); + gr_info.count1table_select = fr.get1Bit(); + } +} + + +#define MPG_MD_JOINT_STEREO 1 + +void MP3FrameParams::getSideInfo(MP3SideInfo& si) { + // First skip over the CRC if present: + if (hasCRC) getBits(16); + + int single = -1; + int ms_stereo; + int sfreq = samplingFreqIndex; + + if (stereo == 1) { + single = 0; + } + + ms_stereo = (mode == MPG_MD_JOINT_STEREO) && (mode_ext & 0x2); + + if (isMPEG2) { + getSideInfo2(*this, si, stereo, ms_stereo, sfreq, single); + } else { + getSideInfo1(*this, si, stereo, ms_stereo, sfreq, single); + } +} + +static void putSideInfo1(BitVector& bv, + MP3SideInfo const& si, Boolean isStereo) { + int ch, gr, i; + int stereo = isStereo ? 2 : 1; + + bv.putBits(si.main_data_begin,9); + if (stereo == 1) + bv.putBits(si.private_bits, 5); + else + bv.putBits(si.private_bits, 3); + + for (ch=0; ch= bitrate) + return i; + } + + // "bitrate" was larger than any possible, so return the largest possible: + return 14; +} + +static void outputHeader(unsigned char* toPtr, unsigned hdr) { + toPtr[0] = (unsigned char)(hdr>>24); + toPtr[1] = (unsigned char)(hdr>>16); + toPtr[2] = (unsigned char)(hdr>>8); + toPtr[3] = (unsigned char)(hdr); +} + +static void assignADUBackpointer(MP3FrameParams const& fr, + unsigned aduSize, + MP3SideInfo& sideInfo, + unsigned& availableBytesForBackpointer) { + // Give the ADU as large a backpointer as possible: + unsigned maxBackpointerSize = fr.isMPEG2 ? 255 : 511; + + unsigned backpointerSize = availableBytesForBackpointer; + if (backpointerSize > maxBackpointerSize) { + backpointerSize = maxBackpointerSize; + } + + // Store the new backpointer now: + sideInfo.main_data_begin = backpointerSize; + + // Figure out how many bytes are available for the *next* ADU's backpointer: + availableBytesForBackpointer + = backpointerSize + fr.frameSize - fr.sideInfoSize ; + if (availableBytesForBackpointer < aduSize) { + availableBytesForBackpointer = 0; + } else { + availableBytesForBackpointer -= aduSize; + } +} + +unsigned TranscodeMP3ADU(unsigned char const* fromPtr, unsigned fromSize, + unsigned toBitrate, + unsigned char* toPtr, unsigned toMaxSize, + unsigned& availableBytesForBackpointer) { + // Begin by parsing the input ADU's parameters: + unsigned hdr, inFrameSize, inSideInfoSize, backpointer, inAduSize; + MP3SideInfo sideInfo; + if (!GetADUInfoFromMP3Frame(fromPtr, fromSize, + hdr, inFrameSize, sideInfo, inSideInfoSize, + backpointer, inAduSize)) { + return 0; + } + fromPtr += (4+inSideInfoSize); // skip to 'main data' + + // Alter the 4-byte MPEG header to reflect the output ADU: + // (different bitrate; mono; no CRC) + Boolean isMPEG2 = ((hdr&0x00080000) == 0); + unsigned toBitrateIndex = MP3BitrateToBitrateIndex(toBitrate, isMPEG2); + hdr &=~ 0xF000; hdr |= (toBitrateIndex<<12); // set bitrate index + hdr |= 0x10200; // turn on !error-prot and padding bits + hdr &=~ 0xC0; hdr |= 0xC0; // set mode to 3 (mono) + + // Set up the rest of the parameters of the new ADU: + MP3FrameParams outFr; + outFr.hdr = hdr; + outFr.setParamsFromHeader(); + + // Figure out how big to make the output ADU: + unsigned inAveAduSize = inFrameSize - inSideInfoSize; + unsigned outAveAduSize = outFr.frameSize - outFr.sideInfoSize; + unsigned desiredOutAduSize /*=inAduSize*outAveAduSize/inAveAduSize*/ + = (2*inAduSize*outAveAduSize + inAveAduSize)/(2*inAveAduSize); + // this rounds to the nearest integer + + if (toMaxSize < (4 + outFr.sideInfoSize)) return 0; + unsigned maxOutAduSize = toMaxSize - (4 + outFr.sideInfoSize); + if (desiredOutAduSize > maxOutAduSize) { + desiredOutAduSize = maxOutAduSize; + } + + // Figure out the new sizes of the various 'part23 lengths', + // and how much they are truncated: + unsigned part23Length0a, part23Length0aTruncation; + unsigned part23Length0b, part23Length0bTruncation; + unsigned part23Length1a, part23Length1aTruncation; + unsigned part23Length1b, part23Length1bTruncation; + unsigned numAduBits + = updateSideInfoSizes(sideInfo, outFr.isMPEG2, + fromPtr, 8*desiredOutAduSize, + part23Length0a, part23Length0aTruncation, + part23Length0b, part23Length0bTruncation, + part23Length1a, part23Length1aTruncation, + part23Length1b, part23Length1bTruncation); +#ifdef DEBUG +fprintf(stderr, "shrinkage %d->%d [(%d,%d),(%d,%d)] (trunc: [(%d,%d),(%d,%d)]) {%d}\n", inAduSize, (numAduBits+7)/8, + part23Length0a, part23Length0b, part23Length1a, part23Length1b, + part23Length0aTruncation, part23Length0bTruncation, + part23Length1aTruncation, part23Length1bTruncation, + maxOutAduSize); +#endif + unsigned actualOutAduSize = (numAduBits+7)/8; + + // Give the new ADU an appropriate 'backpointer': + assignADUBackpointer(outFr, actualOutAduSize, sideInfo, availableBytesForBackpointer); + + ///// Now output the new ADU: + + // 4-byte header + outputHeader(toPtr, hdr); toPtr += 4; + + // side info + PutMP3SideInfoIntoFrame(sideInfo, outFr, toPtr); toPtr += outFr.sideInfoSize; + + // 'main data', using the new lengths + unsigned toBitOffset = 0; + unsigned fromBitOffset = 0; + + /* rebuild portion 0a: */ + memmove(toPtr, fromPtr, (part23Length0a+7)/8); + toBitOffset += part23Length0a; + fromBitOffset += part23Length0a + part23Length0aTruncation; + + /* rebuild portion 0b: */ + shiftBits(toPtr, toBitOffset, fromPtr, fromBitOffset, part23Length0b); + toBitOffset += part23Length0b; + fromBitOffset += part23Length0b + part23Length0bTruncation; + + /* rebuild portion 1a: */ + shiftBits(toPtr, toBitOffset, fromPtr, fromBitOffset, part23Length1a); + toBitOffset += part23Length1a; + fromBitOffset += part23Length1a + part23Length1aTruncation; + + /* rebuild portion 1b: */ + shiftBits(toPtr, toBitOffset, fromPtr, fromBitOffset, part23Length1b); + toBitOffset += part23Length1b; + + /* zero out any remaining bits (probably unnecessary, but...) */ + unsigned char const zero = '\0'; + shiftBits(toPtr, toBitOffset, &zero, 0, + actualOutAduSize*8 - numAduBits); + + return 4 + outFr.sideInfoSize + actualOutAduSize; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MP3Internals.hh b/src/big/mpp/middleware/src/live555/liveMedia/MP3Internals.hh new file mode 100644 index 000000000..8e886190b --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MP3Internals.hh @@ -0,0 +1,143 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// MP3 internal implementation details +// C++ header + +#ifndef _MP3_INTERNALS_HH +#define _MP3_INTERNALS_HH + +#ifndef _BOOLEAN_HH +#include "Boolean.hh" +#endif +#ifndef _BIT_VECTOR_HH +#include "BitVector.hh" +#endif + +typedef struct MP3SideInfo { + unsigned main_data_begin; + unsigned private_bits; + typedef struct gr_info_s { + int scfsi; + unsigned part2_3_length; + unsigned big_values; + unsigned global_gain; + unsigned scalefac_compress; + unsigned window_switching_flag; + unsigned block_type; + unsigned mixed_block_flag; + unsigned table_select[3]; + unsigned region0_count; + unsigned region1_count; + unsigned subblock_gain[3]; + unsigned maxband[3]; + unsigned maxbandl; + unsigned maxb; + unsigned region1start; + unsigned region2start; + unsigned preflag; + unsigned scalefac_scale; + unsigned count1table_select; + double *full_gain[3]; + double *pow2gain; + } gr_info_s_t; + struct { + gr_info_s_t gr[2]; + } ch[2]; +} MP3SideInfo_t; + +#define SBLIMIT 32 +#define MAX_MP3_FRAME_SIZE 2500 /* also big enough for an 'ADU'ized frame */ + +class MP3FrameParams { +public: + MP3FrameParams(); + ~MP3FrameParams(); + + // 4-byte MPEG header: + unsigned hdr; + + // a buffer that can be used to hold the rest of the frame: + unsigned char frameBytes[MAX_MP3_FRAME_SIZE]; + + // public parameters derived from the header + void setParamsFromHeader(); // this sets them + Boolean isMPEG2; + unsigned layer; // currently only 3 is supported + unsigned bitrate; // in kbps + unsigned samplingFreq; + Boolean isStereo; + Boolean isFreeFormat; + unsigned frameSize; // doesn't include the initial 4-byte header + unsigned sideInfoSize; + Boolean hasCRC; + + void setBytePointer(unsigned char const* restOfFrame, + unsigned totNumBytes) {// called during setup + bv.setup((unsigned char*)restOfFrame, 0, 8*totNumBytes); + } + + // other, public parameters used when parsing input (perhaps get rid of) + unsigned oldHdr, firstHdr; + + // Extract (unpack) the side info from the frame into a struct: + void getSideInfo(MP3SideInfo& si); + + // The bit pointer used for reading data from frame data + unsigned getBits(unsigned numBits) { return bv.getBits(numBits); } + unsigned get1Bit() { return bv.get1Bit(); } + +private: + BitVector bv; + + // other, private parameters derived from the header + unsigned bitrateIndex; + unsigned samplingFreqIndex; + Boolean isMPEG2_5; + Boolean padding; + Boolean extension; + unsigned mode; + unsigned mode_ext; + Boolean copyright; + Boolean original; + unsigned emphasis; + unsigned stereo; + +private: + unsigned computeSideInfoSize(); +}; + +unsigned ComputeFrameSize(unsigned bitrate, unsigned samplingFreq, + Boolean usePadding, Boolean isMPEG2, + unsigned char layer); + +Boolean GetADUInfoFromMP3Frame(unsigned char const* framePtr, + unsigned totFrameSize, + unsigned& hdr, unsigned& frameSize, + MP3SideInfo& sideInfo, unsigned& sideInfoSize, + unsigned& backpointer, unsigned& aduSize); + +Boolean ZeroOutMP3SideInfo(unsigned char* framePtr, unsigned totFrameSize, + unsigned newBackpointer); + +unsigned TranscodeMP3ADU(unsigned char const* fromPtr, unsigned fromSize, + unsigned toBitrate, + unsigned char* toPtr, unsigned toMaxSize, + unsigned& availableBytesForBackpointer); + // returns the size of the resulting ADU (0 on failure) + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MP3InternalsHuffman.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MP3InternalsHuffman.cpp new file mode 100644 index 000000000..2b6f85e50 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MP3InternalsHuffman.cpp @@ -0,0 +1,976 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// MP3 internal implementation details (Huffman encoding) +// Implementation + +#include "MP3InternalsHuffman.hh" +#include +#include +#include + +MP3HuffmanEncodingInfo +::MP3HuffmanEncodingInfo(Boolean includeDecodedValues) { + if (includeDecodedValues) { + decodedValues = new unsigned[(SBLIMIT*SSLIMIT + 1)*4]; + } else { + decodedValues = NULL; + } +} + +MP3HuffmanEncodingInfo::~MP3HuffmanEncodingInfo() { + delete[] decodedValues; +} + +// This is crufty old code that needs to be cleaned up ##### + +static unsigned debugCount = 0; /* for debugging */ + +#define TRUNC_FAVORa + +void updateSideInfoForHuffman(MP3SideInfo& sideInfo, Boolean isMPEG2, + unsigned char const* mainDataPtr, + unsigned p23L0, unsigned p23L1, + unsigned& part23Length0a, + unsigned& part23Length0aTruncation, + unsigned& part23Length0b, + unsigned& part23Length0bTruncation, + unsigned& part23Length1a, + unsigned& part23Length1aTruncation, + unsigned& part23Length1b, + unsigned& part23Length1bTruncation) { + int i, j; + unsigned sfLength, origTotABsize, adjustment; + MP3SideInfo::gr_info_s_t* gr; + + /* First, Huffman-decode each part of the segment's main data, + to see at which bit-boundaries the samples appear: + */ + MP3HuffmanEncodingInfo hei; + + ++debugCount; +#ifdef DEBUG + fprintf(stderr, "usifh-start: p23L0: %d, p23L1: %d\n", p23L0, p23L1); +#endif + + /* Process granule 0 */ + { + gr = &(sideInfo.ch[0].gr[0]); + origTotABsize = gr->part2_3_length; + + MP3HuffmanDecode(gr, isMPEG2, mainDataPtr, 0, origTotABsize, sfLength, hei); + + /* Begin by computing new sizes for parts a & b (& their truncations) */ +#ifdef DEBUG + fprintf(stderr, "usifh-0: %d, %d:%d, %d:%d, %d:%d, %d:%d, %d:%d\n", + hei.numSamples, + sfLength/8, sfLength%8, + hei.reg1Start/8, hei.reg1Start%8, + hei.reg2Start/8, hei.reg2Start%8, + hei.bigvalStart/8, hei.bigvalStart%8, + origTotABsize/8, origTotABsize%8); +#endif + if (p23L0 < sfLength) { + /* We can't use this, so give it all to the next granule: */ + p23L1 += p23L0; + p23L0 = 0; + } + + part23Length0a = hei.bigvalStart; + part23Length0b = origTotABsize - hei.bigvalStart; + part23Length0aTruncation = part23Length0bTruncation = 0; + if (origTotABsize > p23L0) { + /* We need to shorten one or both of fields a & b */ + unsigned truncation = origTotABsize - p23L0; +#ifdef TRUNC_FAIRLY + part23Length0aTruncation = (truncation*(part23Length0a-sfLength)) + /(origTotABsize-sfLength); + part23Length0bTruncation = truncation - part23Length0aTruncation; +#endif +#ifdef TRUNC_FAVORa + part23Length0bTruncation + = (truncation > part23Length0b) ? part23Length0b : truncation; + part23Length0aTruncation = truncation - part23Length0bTruncation; +#endif +#ifdef TRUNC_FAVORb + part23Length0aTruncation = (truncation > part23Length0a-sfLength) + ? (part23Length0a-sfLength) : truncation; + part23Length0bTruncation = truncation - part23Length0aTruncation; +#endif + } + /* ASSERT: part23Length0xTruncation <= part23Length0x */ + part23Length0a -= part23Length0aTruncation; + part23Length0b -= part23Length0bTruncation; +#ifdef DEBUG + fprintf(stderr, "usifh-0: interim sizes: %d (%d), %d (%d)\n", + part23Length0a, part23Length0aTruncation, + part23Length0b, part23Length0bTruncation); +#endif + + /* Adjust these new lengths so they end on sample bit boundaries: */ + for (i = 0; i < (int)hei.numSamples; ++i) { + if (hei.allBitOffsets[i] == part23Length0a) break; + else if (hei.allBitOffsets[i] > part23Length0a) {--i; break;} + } + if (i < 0) { /* should happen only if we couldn't fit sfLength */ + i = 0; adjustment = 0; + } else { + adjustment = part23Length0a - hei.allBitOffsets[i]; + } +#ifdef DEBUG + fprintf(stderr, "%d usifh-0: adjustment 1: %d\n", debugCount, adjustment); +#endif + part23Length0a -= adjustment; + part23Length0aTruncation += adjustment; + /* Assign the bits we just shaved to field b and granule 1: */ + if (part23Length0bTruncation < adjustment) { + p23L1 += (adjustment - part23Length0bTruncation); + adjustment = part23Length0bTruncation; + } + part23Length0b += adjustment; + part23Length0bTruncation -= adjustment; + for (j = i; j < (int)hei.numSamples; ++j) { + if (hei.allBitOffsets[j] + == part23Length0a + part23Length0aTruncation + part23Length0b) + break; + else if (hei.allBitOffsets[j] + > part23Length0a + part23Length0aTruncation + part23Length0b) + {--j; break;} + } + if (j < 0) { /* should happen only if we couldn't fit sfLength */ + j = 0; adjustment = 0; + } else { + adjustment = part23Length0a+part23Length0aTruncation+part23Length0b + - hei.allBitOffsets[j]; + } +#ifdef DEBUG + fprintf(stderr, "%d usifh-0: adjustment 2: %d\n", debugCount, adjustment); +#endif + if (adjustment > part23Length0b) adjustment = part23Length0b; /*sanity*/ + part23Length0b -= adjustment; + part23Length0bTruncation += adjustment; + /* Assign the bits we just shaved to granule 1 */ + p23L1 += adjustment; + + if (part23Length0aTruncation > 0) { + /* Change the granule's 'big_values' field to reflect the truncation */ + gr->big_values = i; + } + } + + /* Process granule 1 (MPEG-1 only) */ + + if (isMPEG2) { + part23Length1a = part23Length1b = 0; + part23Length1aTruncation = part23Length1bTruncation = 0; + } else { + unsigned granule1Offset + = origTotABsize + sideInfo.ch[1].gr[0].part2_3_length; + + gr = &(sideInfo.ch[0].gr[1]); + origTotABsize = gr->part2_3_length; + + MP3HuffmanDecode(gr, isMPEG2, mainDataPtr, granule1Offset, + origTotABsize, sfLength, hei); + + /* Begin by computing new sizes for parts a & b (& their truncations) */ +#ifdef DEBUG + fprintf(stderr, "usifh-1: %d, %d:%d, %d:%d, %d:%d, %d:%d, %d:%d\n", + hei.numSamples, + sfLength/8, sfLength%8, + hei.reg1Start/8, hei.reg1Start%8, + hei.reg2Start/8, hei.reg2Start%8, + hei.bigvalStart/8, hei.bigvalStart%8, + origTotABsize/8, origTotABsize%8); +#endif + if (p23L1 < sfLength) { + /* We can't use this, so give up on this granule: */ + p23L1 = 0; + } + + part23Length1a = hei.bigvalStart; + part23Length1b = origTotABsize - hei.bigvalStart; + part23Length1aTruncation = part23Length1bTruncation = 0; + if (origTotABsize > p23L1) { + /* We need to shorten one or both of fields a & b */ + unsigned truncation = origTotABsize - p23L1; +#ifdef TRUNC_FAIRLY + part23Length1aTruncation = (truncation*(part23Length1a-sfLength)) + /(origTotABsize-sfLength); + part23Length1bTruncation = truncation - part23Length1aTruncation; +#endif +#ifdef TRUNC_FAVORa + part23Length1bTruncation + = (truncation > part23Length1b) ? part23Length1b : truncation; + part23Length1aTruncation = truncation - part23Length1bTruncation; +#endif +#ifdef TRUNC_FAVORb + part23Length1aTruncation = (truncation > part23Length1a-sfLength) + ? (part23Length1a-sfLength) : truncation; + part23Length1bTruncation = truncation - part23Length1aTruncation; +#endif + } + /* ASSERT: part23Length1xTruncation <= part23Length1x */ + part23Length1a -= part23Length1aTruncation; + part23Length1b -= part23Length1bTruncation; +#ifdef DEBUG + fprintf(stderr, "usifh-1: interim sizes: %d (%d), %d (%d)\n", + part23Length1a, part23Length1aTruncation, + part23Length1b, part23Length1bTruncation); +#endif + + /* Adjust these new lengths so they end on sample bit boundaries: */ + for (i = 0; i < (int)hei.numSamples; ++i) { + if (hei.allBitOffsets[i] == part23Length1a) break; + else if (hei.allBitOffsets[i] > part23Length1a) {--i; break;} + } + if (i < 0) { /* should happen only if we couldn't fit sfLength */ + i = 0; adjustment = 0; + } else { + adjustment = part23Length1a - hei.allBitOffsets[i]; + } +#ifdef DEBUG + fprintf(stderr, "%d usifh-1: adjustment 0: %d\n", debugCount, adjustment); +#endif + part23Length1a -= adjustment; + part23Length1aTruncation += adjustment; + /* Assign the bits we just shaved to field b: */ + if (part23Length1bTruncation < adjustment) { + adjustment = part23Length1bTruncation; + } + part23Length1b += adjustment; + part23Length1bTruncation -= adjustment; + for (j = i; j < (int)hei.numSamples; ++j) { + if (hei.allBitOffsets[j] + == part23Length1a + part23Length1aTruncation + part23Length1b) + break; + else if (hei.allBitOffsets[j] + > part23Length1a + part23Length1aTruncation + part23Length1b) + {--j; break;} + } + if (j < 0) { /* should happen only if we couldn't fit sfLength */ + j = 0; adjustment = 0; + } else { + adjustment = part23Length1a+part23Length1aTruncation+part23Length1b + - hei.allBitOffsets[j]; + } +#ifdef DEBUG + fprintf(stderr, "%d usifh-1: adjustment 1: %d\n", debugCount, adjustment); +#endif + if (adjustment > part23Length1b) adjustment = part23Length1b; /*sanity*/ + part23Length1b -= adjustment; + part23Length1bTruncation += adjustment; + + if (part23Length1aTruncation > 0) { + /* Change the granule's 'big_values' field to reflect the truncation */ + gr->big_values = i; + } + } +#ifdef DEBUG + fprintf(stderr, "usifh-end, new vals: %d (%d), %d (%d), %d (%d), %d (%d)\n", + part23Length0a, part23Length0aTruncation, + part23Length0b, part23Length0bTruncation, + part23Length1a, part23Length1aTruncation, + part23Length1b, part23Length1bTruncation); +#endif +} + +static void rsf_getline(char* line, unsigned max, unsigned char**fi) { + unsigned i; + for (i = 0; i < max; ++i) { + line[i] = *(*fi)++; + if (line[i] == '\n') { + line[i++] = '\0'; + return; + } + } + line[i] = '\0'; +} + +static void rsfscanf(unsigned char **fi, unsigned int* v) { + while (sscanf((char*)*fi, "%x", v) == 0) { + /* skip past the next '\0' */ + while (*(*fi)++ != '\0') {} + } + + /* skip past any white-space before the value: */ + while (*(*fi) <= ' ') ++(*fi); + + /* skip past the value: */ + while (*(*fi) > ' ') ++(*fi); +} + +#define HUFFBITS unsigned long int +#define SIZEOF_HUFFBITS 4 +#define HTN 34 +#define MXOFF 250 + +struct huffcodetab { + char tablename[3]; /*string, containing table_description */ + unsigned int xlen; /*max. x-index+ */ + unsigned int ylen; /*max. y-index+ */ + unsigned int linbits; /*number of linbits */ + unsigned int linmax; /*max number to be stored in linbits */ + int ref; /*a positive value indicates a reference*/ + HUFFBITS *table; /*pointer to array[xlen][ylen] */ + unsigned char *hlen; /*pointer to array[xlen][ylen] */ + unsigned char(*val)[2];/*decoder tree */ + unsigned int treelen; /*length of decoder tree */ +}; + +static struct huffcodetab rsf_ht[HTN]; // array of all huffcodetable headers + /* 0..31 Huffman code table 0..31 */ + /* 32,33 count1-tables */ + +/* read the huffman decoder table */ +static int read_decoder_table(unsigned char* fi) { + int n,i,nn,t; + unsigned int v0,v1; + char command[100],line[100]; + for (n=0;nscalefac_compress]; + int num1 = slen[1][gr_info->scalefac_compress]; + + if (gr_info->block_type == 2) + { + numbits = (num0 + num1) * 18; + + if (gr_info->mixed_block_flag) { + numbits -= num0; /* num0 * 17 + num1 * 18 */ + } + } + else + { + int scfsi = gr_info->scfsi; + + if(scfsi < 0) { /* scfsi < 0 => granule == 0 */ + numbits = (num0 + num1) * 10 + num0; + } + else { + numbits = 0; + if(!(scfsi & 0x8)) { + numbits += num0 * 6; + } + else { + } + + if(!(scfsi & 0x4)) { + numbits += num0 * 5; + } + else { + } + + if(!(scfsi & 0x2)) { + numbits += num1 * 5; + } + else { + } + + if(!(scfsi & 0x1)) { + numbits += num1 * 5; + } + else { + } + } + } + + return numbits; +} + +extern unsigned n_slen2[]; +extern unsigned i_slen2[]; + +static unsigned rsf_get_scale_factors_2(MP3SideInfo::gr_info_s_t *gr_info) { + unsigned char const* pnt; + int i; + unsigned int slen; + int n = 0; + int numbits = 0; + + slen = n_slen2[gr_info->scalefac_compress]; + + gr_info->preflag = (slen>>15) & 0x1; + + n = 0; + if( gr_info->block_type == 2 ) { + n++; + if(gr_info->mixed_block_flag) + n++; + } + + pnt = stab[n][(slen>>12)&0x7]; + + for(i=0;i<4;i++) { + int num = slen & 0x7; + slen >>= 3; + numbits += pnt[i] * num; + } + + return numbits; +} + +static unsigned getScaleFactorsLength(MP3SideInfo::gr_info_s_t* gr, + Boolean isMPEG2) { + return isMPEG2 ? rsf_get_scale_factors_2(gr) + : rsf_get_scale_factors_1(gr); +} + +static int rsf_huffman_decoder(BitVector& bv, + struct huffcodetab const* h, + int* x, int* y, int* v, int* w); // forward + +void MP3HuffmanDecode(MP3SideInfo::gr_info_s_t* gr, Boolean isMPEG2, + unsigned char const* fromBasePtr, + unsigned fromBitOffset, unsigned fromLength, + unsigned& scaleFactorsLength, + MP3HuffmanEncodingInfo& hei) { + unsigned i; + int x, y, v, w; + struct huffcodetab *h; + BitVector bv((unsigned char*)fromBasePtr, fromBitOffset, fromLength); + + /* Compute the size of the scale factors (& also advance bv): */ + scaleFactorsLength = getScaleFactorsLength(gr, isMPEG2); + bv.skipBits(scaleFactorsLength); + + initialize_huffman(); + + hei.reg1Start = hei.reg2Start = hei.numSamples = 0; + + /* Read bigvalues area. */ + if (gr->big_values < gr->region1start + gr->region2start) { + gr->big_values = gr->region1start + gr->region2start; /* sanity check */ + } + for (i = 0; i < gr->big_values; ++i) { + if (i < gr->region1start) { + /* in region 0 */ + h = &rsf_ht[gr->table_select[0]]; + } else if (i < gr->region2start) { + /* in region 1 */ + h = &rsf_ht[gr->table_select[1]]; + if (hei.reg1Start == 0) { + hei.reg1Start = bv.curBitIndex(); + } + } else { + /* in region 2 */ + h = &rsf_ht[gr->table_select[2]]; + if (hei.reg2Start == 0) { + hei.reg2Start = bv.curBitIndex(); + } + } + + hei.allBitOffsets[i] = bv.curBitIndex(); + rsf_huffman_decoder(bv, h, &x, &y, &v, &w); + if (hei.decodedValues != NULL) { + // Record the decoded values: + unsigned* ptr = &hei.decodedValues[4*i]; + ptr[0] = x; ptr[1] = y; ptr[2] = v; ptr[3] = w; + } + } + hei.bigvalStart = bv.curBitIndex(); + + /* Read count1 area. */ + h = &rsf_ht[gr->count1table_select+32]; + while (bv.curBitIndex() < bv.totNumBits() && i < SSLIMIT*SBLIMIT) { + hei.allBitOffsets[i] = bv.curBitIndex(); + rsf_huffman_decoder(bv, h, &x, &y, &v, &w); + if (hei.decodedValues != NULL) { + // Record the decoded values: + unsigned* ptr = &hei.decodedValues[4*i]; + ptr[0] = x; ptr[1] = y; ptr[2] = v; ptr[3] = w; + } + ++i; + } + + hei.allBitOffsets[i] = bv.curBitIndex(); + hei.numSamples = i; +} + +HUFFBITS dmask = 1 << (SIZEOF_HUFFBITS*8-1); +unsigned int hs = SIZEOF_HUFFBITS*8; + +/* do the huffman-decoding */ +static int rsf_huffman_decoder(BitVector& bv, + struct huffcodetab const* h, // ptr to huffman code record + /* unsigned */ int *x, // returns decoded x value + /* unsigned */ int *y, // returns decoded y value + int* v, int* w) { + HUFFBITS level; + unsigned point = 0; + int error = 1; + level = dmask; + *x = *y = *v = *w = 0; + if (h->val == NULL) return 2; + + /* table 0 needs no bits */ + if (h->treelen == 0) return 0; + + /* Lookup in Huffman table. */ + + do { + if (h->val[point][0]==0) { /*end of tree*/ + *x = h->val[point][1] >> 4; + *y = h->val[point][1] & 0xf; + + error = 0; + break; + } + if (bv.get1Bit()) { + while (h->val[point][1] >= MXOFF) point += h->val[point][1]; + point += h->val[point][1]; + } + else { + while (h->val[point][0] >= MXOFF) point += h->val[point][0]; + point += h->val[point][0]; + } + level >>= 1; + } while (level || (point < h->treelen) ); +///// } while (level || (point < rsf_ht->treelen) ); + + /* Check for error. */ + + if (error) { /* set x and y to a medium value as a simple concealment */ + printf("Illegal Huffman code in data.\n"); + *x = ((h->xlen-1) << 1); + *y = ((h->ylen-1) << 1); + } + + /* Process sign encodings for quadruples tables. */ + + if (h->tablename[0] == '3' + && (h->tablename[1] == '2' || h->tablename[1] == '3')) { + *v = (*y>>3) & 1; + *w = (*y>>2) & 1; + *x = (*y>>1) & 1; + *y = *y & 1; + + if (*v) + if (bv.get1Bit() == 1) *v = -*v; + if (*w) + if (bv.get1Bit() == 1) *w = -*w; + if (*x) + if (bv.get1Bit() == 1) *x = -*x; + if (*y) + if (bv.get1Bit() == 1) *y = -*y; + } + + /* Process sign and escape encodings for dual tables. */ + + else { + if (h->linbits) + if ((h->xlen-1) == (unsigned)*x) + *x += bv.getBits(h->linbits); + if (*x) + if (bv.get1Bit() == 1) *x = -*x; + if (h->linbits) + if ((h->ylen-1) == (unsigned)*y) + *y += bv.getBits(h->linbits); + if (*y) + if (bv.get1Bit() == 1) *y = -*y; + } + + return error; +} + +#ifdef DO_HUFFMAN_ENCODING +inline int getNextSample(unsigned char const*& fromPtr) { + int sample +#ifdef FOUR_BYTE_SAMPLES + = (fromPtr[0]<<24) | (fromPtr[1]<<16) | (fromPtr[2]<<8) | fromPtr[3]; +#else +#ifdef TWO_BYTE_SAMPLES + = (fromPtr[0]<<8) | fromPtr[1]; +#else + // ONE_BYTE_SAMPLES + = fromPtr[0]; +#endif +#endif + fromPtr += BYTES_PER_SAMPLE_VALUE; + return sample; +} + +static void rsf_huffman_encoder(BitVector& bv, + struct huffcodetab* h, + int x, int y, int v, int w); // forward + +unsigned MP3HuffmanEncode(MP3SideInfo::gr_info_s_t const* gr, + unsigned char const* fromPtr, + unsigned char* toPtr, unsigned toBitOffset, + unsigned numHuffBits) { + unsigned i; + struct huffcodetab *h; + int x, y, v, w; + BitVector bv(toPtr, toBitOffset, numHuffBits); + + initialize_huffman(); + + // Encode big_values area: + unsigned big_values = gr->big_values; + if (big_values < gr->region1start + gr->region2start) { + big_values = gr->region1start + gr->region2start; /* sanity check */ + } + for (i = 0; i < big_values; ++i) { + if (i < gr->region1start) { + /* in region 0 */ + h = &rsf_ht[gr->table_select[0]]; + } else if (i < gr->region2start) { + /* in region 1 */ + h = &rsf_ht[gr->table_select[1]]; + } else { + /* in region 2 */ + h = &rsf_ht[gr->table_select[2]]; + } + + x = getNextSample(fromPtr); + y = getNextSample(fromPtr); + v = getNextSample(fromPtr); + w = getNextSample(fromPtr); + rsf_huffman_encoder(bv, h, x, y, v, w); + } + + // Encode count1 area: + h = &rsf_ht[gr->count1table_select+32]; + while (bv.curBitIndex() < bv.totNumBits() && i < SSLIMIT*SBLIMIT) { + x = getNextSample(fromPtr); + y = getNextSample(fromPtr); + v = getNextSample(fromPtr); + w = getNextSample(fromPtr); + rsf_huffman_encoder(bv, h, x, y, v, w); + ++i; + } + + return i; +} + +static Boolean lookupHuffmanTableEntry(struct huffcodetab const* h, + HUFFBITS bits, unsigned bitsLength, + unsigned char& xy) { + unsigned point = 0; + unsigned mask = 1; + unsigned numBitsTestedSoFar = 0; + do { + if (h->val[point][0]==0) { // end of tree + xy = h->val[point][1]; + if (h->hlen[xy] == 0) { // this entry hasn't already been used + h->table[xy] = bits; + h->hlen[xy] = bitsLength; + return True; + } else { // this entry has already been seen + return False; + } + } + + if (numBitsTestedSoFar++ == bitsLength) { + // We don't yet have enough bits for this prefix + return False; + } + if (bits&mask) { + while (h->val[point][1] >= MXOFF) point += h->val[point][1]; + point += h->val[point][1]; + } else { + while (h->val[point][0] >= MXOFF) point += h->val[point][0]; + point += h->val[point][0]; + } + mask <<= 1; + } while (mask || (point < h->treelen)); + + return False; +} + +static void buildHuffmanEncodingTable(struct huffcodetab* h) { + h->table = new unsigned long[256]; + h->hlen = new unsigned char[256]; + if (h->table == NULL || h->hlen == NULL) { h->table = NULL; return; } + for (unsigned i = 0; i < 256; ++i) { + h->table[i] = 0; h->hlen[i] = 0; + } + + // Look up entries for each possible bit sequence length: + unsigned maxNumEntries = h->xlen * h->ylen; + unsigned numEntries = 0; + unsigned powerOf2 = 1; + for (unsigned bitsLength = 1; + bitsLength <= 8*SIZEOF_HUFFBITS; ++bitsLength) { + powerOf2 *= 2; + for (HUFFBITS bits = 0; bits < powerOf2; ++bits) { + // Find the table value - if any - for 'bits' (length 'bitsLength'): + unsigned char xy; + if (lookupHuffmanTableEntry(h, bits, bitsLength, xy)) { + ++numEntries; + if (numEntries == maxNumEntries) return; // we're done + } + } + } +#ifdef DEBUG + fprintf(stderr, "Didn't find enough entries!\n"); // shouldn't happen +#endif +} + +static void lookupXYandPutBits(BitVector& bv, struct huffcodetab const* h, + unsigned char xy) { + HUFFBITS bits = h->table[xy]; + unsigned bitsLength = h->hlen[xy]; + + // Note that "bits" is in reverse order, so read them from right-to-left: + while (bitsLength-- > 0) { + bv.put1Bit(bits&0x00000001); + bits >>= 1; + } +} + +static void putLinbits(BitVector& bv, struct huffcodetab const* h, + HUFFBITS bits) { + bv.putBits(bits, h->linbits); +} + +static void rsf_huffman_encoder(BitVector& bv, + struct huffcodetab* h, + int x, int y, int v, int w) { + if (h->val == NULL) return; + + /* table 0 produces no bits */ + if (h->treelen == 0) return; + + if (h->table == NULL) { + // We haven't yet built the encoding array for this table; do it now: + buildHuffmanEncodingTable(h); + if (h->table == NULL) return; + } + + Boolean xIsNeg = False, yIsNeg = False, vIsNeg = False, wIsNeg = False; + unsigned char xy; + +#ifdef FOUR_BYTE_SAMPLES +#else +#ifdef TWO_BYTE_SAMPLES + // Convert 2-byte negative numbers to their 4-byte equivalents: + if (x&0x8000) x |= 0xFFFF0000; + if (y&0x8000) y |= 0xFFFF0000; + if (v&0x8000) v |= 0xFFFF0000; + if (w&0x8000) w |= 0xFFFF0000; +#else + // ONE_BYTE_SAMPLES + // Convert 1-byte negative numbers to their 4-byte equivalents: + if (x&0x80) x |= 0xFFFFFF00; + if (y&0x80) y |= 0xFFFFFF00; + if (v&0x80) v |= 0xFFFFFF00; + if (w&0x80) w |= 0xFFFFFF00; +#endif +#endif + + if (h->tablename[0] == '3' + && (h->tablename[1] == '2' || h->tablename[1] == '3')) {// quad tables + if (x < 0) { xIsNeg = True; x = -x; } + if (y < 0) { yIsNeg = True; y = -y; } + if (v < 0) { vIsNeg = True; v = -v; } + if (w < 0) { wIsNeg = True; w = -w; } + + // Sanity check: x,y,v,w must all be 0 or 1: + if (x>1 || y>1 || v>1 || w>1) { +#ifdef DEBUG + fprintf(stderr, "rsf_huffman_encoder quad sanity check fails: %x,%x,%x,%x\n", x, y, v, w); +#endif + } + + xy = (v<<3)|(w<<2)|(x<<1)|y; + lookupXYandPutBits(bv, h, xy); + + if (v) bv.put1Bit(vIsNeg); + if (w) bv.put1Bit(wIsNeg); + if (x) bv.put1Bit(xIsNeg); + if (y) bv.put1Bit(yIsNeg); + } else { // dual tables + // Sanity check: v and w must be 0: + if (v != 0 || w != 0) { +#ifdef DEBUG + fprintf(stderr, "rsf_huffman_encoder dual sanity check 1 fails: %x,%x,%x,%x\n", x, y, v, w); +#endif + } + + if (x < 0) { xIsNeg = True; x = -x; } + if (y < 0) { yIsNeg = True; y = -y; } + + // Sanity check: x and y must be <= 255: + if (x > 255 || y > 255) { +#ifdef DEBUG + fprintf(stderr, "rsf_huffman_encoder dual sanity check 2 fails: %x,%x,%x,%x\n", x, y, v, w); +#endif + } + + int xl1 = h->xlen-1; + int yl1 = h->ylen-1; + unsigned linbitsX = 0; unsigned linbitsY = 0; + + if (((x < xl1) || (xl1 == 0)) && (y < yl1)) { + // normal case + xy = (x<<4)|y; + lookupXYandPutBits(bv, h, xy); + if (x) bv.put1Bit(xIsNeg); + if (y) bv.put1Bit(yIsNeg); + } else if (x >= xl1) { + linbitsX = (unsigned)(x - xl1); + if (linbitsX > h->linmax) { +#ifdef DEBUG + fprintf(stderr,"warning: Huffman X table overflow\n"); +#endif + linbitsX = h->linmax; + }; + + if (y >= yl1) { + xy = (xl1<<4)|yl1; + lookupXYandPutBits(bv, h, xy); + linbitsY = (unsigned)(y - yl1); + if (linbitsY > h->linmax) { +#ifdef DEBUG + fprintf(stderr,"warning: Huffman Y table overflow\n"); +#endif + linbitsY = h->linmax; + }; + + if (h->linbits) putLinbits(bv, h, linbitsX); + if (x) bv.put1Bit(xIsNeg); + if (h->linbits) putLinbits(bv, h, linbitsY); + if (y) bv.put1Bit(yIsNeg); + } else { /* x >= h->xlen, y < h->ylen */ + xy = (xl1<<4)|y; + lookupXYandPutBits(bv, h, xy); + if (h->linbits) putLinbits(bv, h, linbitsX); + if (x) bv.put1Bit(xIsNeg); + if (y) bv.put1Bit(yIsNeg); + } + } else { /* ((x < h->xlen) && (y >= h->ylen)) */ + xy = (x<<4)|yl1; + lookupXYandPutBits(bv, h, xy); + linbitsY = y-yl1; + if (linbitsY > h->linmax) { +#ifdef DEBUG + fprintf(stderr,"warning: Huffman Y table overflow\n"); +#endif + linbitsY = h->linmax; + }; + if (x) bv.put1Bit(xIsNeg); + if (h->linbits) putLinbits(bv, h, linbitsY); + if (y) bv.put1Bit(yIsNeg); + } + } +} +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MP3InternalsHuffman.hh b/src/big/mpp/middleware/src/live555/liveMedia/MP3InternalsHuffman.hh new file mode 100644 index 000000000..85c7924f8 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MP3InternalsHuffman.hh @@ -0,0 +1,82 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// MP3 internal implementation details (Huffman encoding) +// C++ header + +#ifndef _MP3_INTERNALS_HUFFMAN_HH +#define _MP3_INTERNALS_HUFFMAN_HH + +#ifndef _MP3_INTERNALS_HH +#include "MP3Internals.hh" +#endif + +void updateSideInfoForHuffman(MP3SideInfo& sideInfo, Boolean isMPEG2, + unsigned char const* mainDataPtr, + unsigned p23L0, unsigned p23L1, + unsigned& part23Length0a, + unsigned& part23Length0aTruncation, + unsigned& part23Length0b, + unsigned& part23Length0bTruncation, + unsigned& part23Length1a, + unsigned& part23Length1aTruncation, + unsigned& part23Length1b, + unsigned& part23Length1bTruncation); + +#define SSLIMIT 18 + +class MP3HuffmanEncodingInfo { +public: + MP3HuffmanEncodingInfo(Boolean includeDecodedValues = False); + ~MP3HuffmanEncodingInfo(); + +public: + unsigned numSamples; + unsigned allBitOffsets[SBLIMIT*SSLIMIT + 1]; + unsigned reg1Start, reg2Start, bigvalStart; /* special bit offsets */ + unsigned* decodedValues; +}; + +/* forward */ +void MP3HuffmanDecode(MP3SideInfo::gr_info_s_t* gr, Boolean isMPEG2, + unsigned char const* fromBasePtr, + unsigned fromBitOffset, unsigned fromLength, + unsigned& scaleFactorsLength, + MP3HuffmanEncodingInfo& hei); + +extern unsigned char huffdec[]; // huffman table data + +// The following are used if we process Huffman-decoded values +#ifdef FOUR_BYTE_SAMPLES +#define BYTES_PER_SAMPLE_VALUE 4 +#else +#ifdef TWO_BYTE_SAMPLES +#define BYTES_PER_SAMPLE_VALUE 2 +#else +// ONE_BYTE_SAMPLES +#define BYTES_PER_SAMPLE_VALUE 1 +#endif +#endif + +#ifdef DO_HUFFMAN_ENCODING +unsigned MP3HuffmanEncode(MP3SideInfo::gr_info_s_t const* gr, + unsigned char const* fromPtr, + unsigned char* toPtr, unsigned toBitOffset, + unsigned numHuffBits); +#endif + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MP3InternalsHuffmanTable.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MP3InternalsHuffmanTable.cpp new file mode 100644 index 000000000..f7c16f4ab --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MP3InternalsHuffmanTable.cpp @@ -0,0 +1,1548 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// MP3 internal implementation details (Huffman encoding) +// Table + +#include "MP3InternalsHuffman.hh" + +unsigned char huffdec[] = { +0x0a, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x20, 0x30, 0x20, 0x20, +0x20, 0x30, 0x20, 0x20, 0x30, 0x20, 0x20, 0x30, 0x20, 0x20, 0x30, 0x0a, +0x2e, 0x74, 0x72, 0x65, 0x65, 0x64, 0x61, 0x74, 0x61, 0x0a, 0x0a, 0x2e, +0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x20, 0x31, 0x20, 0x20, 0x20, 0x37, +0x20, 0x20, 0x32, 0x20, 0x20, 0x32, 0x20, 0x20, 0x30, 0x0a, 0x2e, 0x74, +0x72, 0x65, 0x65, 0x64, 0x61, 0x74, 0x61, 0x0a, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x20, 0x30, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x31, 0x30, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x31, +0x31, 0x20, 0x0a, 0x0a, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x37, 0x20, 0x20, 0x33, 0x20, 0x20, 0x33, 0x20, +0x20, 0x30, 0x0a, 0x2e, 0x74, 0x72, 0x65, 0x65, 0x64, 0x61, 0x74, 0x61, +0x0a, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x20, 0x30, +0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x31, 0x30, 0x20, 0x20, 0x30, 0x20, 0x20, 0x31, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x31, 0x31, +0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x32, 0x30, 0x20, 0x20, 0x30, 0x20, 0x32, 0x31, +0x20, 0x0a, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x31, +0x32, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x20, +0x32, 0x20, 0x20, 0x30, 0x20, 0x32, 0x32, 0x20, 0x0a, 0x0a, 0x2e, 0x74, +0x61, 0x62, 0x6c, 0x65, 0x20, 0x20, 0x33, 0x20, 0x20, 0x31, 0x37, 0x20, +0x20, 0x33, 0x20, 0x20, 0x33, 0x20, 0x20, 0x30, 0x0a, 0x2e, 0x74, 0x72, +0x65, 0x65, 0x64, 0x61, 0x74, 0x61, 0x0a, 0x20, 0x34, 0x20, 0x20, 0x31, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x20, 0x30, +0x20, 0x20, 0x30, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x31, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x31, 0x30, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x32, 0x30, +0x20, 0x20, 0x30, 0x20, 0x32, 0x31, 0x20, 0x0a, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x31, 0x32, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x20, 0x32, 0x20, 0x20, 0x30, 0x20, 0x32, +0x32, 0x20, 0x0a, 0x0a, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x20, +0x34, 0x20, 0x20, 0x20, 0x30, 0x20, 0x20, 0x30, 0x20, 0x20, 0x30, 0x20, +0x20, 0x30, 0x0a, 0x2e, 0x74, 0x72, 0x65, 0x65, 0x64, 0x61, 0x74, 0x61, +0x0a, 0x0a, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x20, 0x35, 0x20, +0x20, 0x33, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x34, 0x20, 0x20, 0x30, +0x0a, 0x2e, 0x74, 0x72, 0x65, 0x65, 0x64, 0x61, 0x74, 0x61, 0x0a, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x20, 0x30, 0x20, 0x20, +0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x31, 0x30, 0x20, 0x20, 0x30, 0x20, 0x20, 0x31, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x31, 0x31, 0x20, 0x20, +0x38, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x32, 0x30, 0x20, 0x0a, +0x20, 0x30, 0x20, 0x20, 0x32, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x30, 0x20, 0x32, 0x31, 0x20, 0x20, 0x30, 0x20, 0x31, 0x32, 0x20, +0x20, 0x38, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x32, 0x32, 0x20, +0x20, 0x30, 0x20, 0x33, 0x30, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x30, 0x20, 0x20, 0x33, 0x20, 0x20, 0x30, 0x20, 0x31, 0x33, 0x20, +0x0a, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x33, 0x31, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x33, 0x32, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x32, 0x33, +0x20, 0x20, 0x30, 0x20, 0x33, 0x33, 0x20, 0x0a, 0x0a, 0x2e, 0x74, 0x61, +0x62, 0x6c, 0x65, 0x20, 0x20, 0x36, 0x20, 0x20, 0x33, 0x31, 0x20, 0x20, +0x34, 0x20, 0x20, 0x34, 0x20, 0x20, 0x30, 0x0a, 0x2e, 0x74, 0x72, 0x65, +0x65, 0x64, 0x61, 0x74, 0x61, 0x0a, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, +0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x30, 0x20, 0x20, 0x30, 0x20, 0x20, 0x30, 0x20, 0x31, 0x30, 0x20, +0x20, 0x30, 0x20, 0x31, 0x31, 0x20, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x20, 0x31, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x32, 0x30, 0x20, +0x20, 0x30, 0x20, 0x32, 0x31, 0x20, 0x0a, 0x20, 0x36, 0x20, 0x20, 0x31, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x31, 0x32, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x20, 0x32, +0x20, 0x20, 0x30, 0x20, 0x32, 0x32, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x33, 0x31, +0x20, 0x20, 0x30, 0x20, 0x31, 0x33, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x33, +0x30, 0x20, 0x20, 0x30, 0x20, 0x33, 0x32, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x32, 0x33, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x20, 0x33, 0x20, 0x20, 0x30, 0x20, 0x33, +0x33, 0x20, 0x0a, 0x0a, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x20, +0x37, 0x20, 0x20, 0x37, 0x31, 0x20, 0x20, 0x36, 0x20, 0x20, 0x36, 0x20, +0x20, 0x30, 0x0a, 0x2e, 0x74, 0x72, 0x65, 0x65, 0x64, 0x61, 0x74, 0x61, +0x0a, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x20, 0x30, +0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x31, 0x30, 0x20, 0x20, 0x30, 0x20, 0x20, 0x31, +0x20, 0x20, 0x38, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x31, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x32, 0x30, +0x20, 0x0a, 0x20, 0x30, 0x20, 0x20, 0x32, 0x20, 0x20, 0x30, 0x20, 0x32, +0x31, 0x20, 0x31, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x36, 0x20, 0x20, +0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x31, +0x32, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x32, +0x32, 0x20, 0x20, 0x30, 0x20, 0x33, 0x30, 0x20, 0x20, 0x34, 0x20, 0x20, +0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x33, +0x31, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x31, 0x33, 0x20, 0x20, 0x34, 0x20, +0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x20, 0x33, 0x20, 0x20, 0x30, 0x20, 0x33, 0x32, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x32, 0x33, 0x20, 0x20, 0x30, 0x20, +0x20, 0x34, 0x20, 0x20, 0x61, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, +0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x34, 0x30, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x34, 0x31, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x31, 0x34, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x34, 0x32, 0x20, 0x20, 0x30, +0x20, 0x32, 0x34, 0x20, 0x20, 0x63, 0x20, 0x20, 0x31, 0x20, 0x20, 0x36, +0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x33, 0x33, 0x20, 0x20, 0x30, +0x20, 0x34, 0x33, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x35, 0x30, 0x20, 0x20, +0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x33, 0x34, 0x20, 0x20, 0x30, 0x20, 0x20, 0x35, 0x20, 0x20, +0x30, 0x20, 0x35, 0x31, 0x20, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x31, 0x35, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x35, 0x32, 0x20, 0x20, +0x30, 0x20, 0x32, 0x35, 0x20, 0x0a, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x34, 0x34, 0x20, +0x20, 0x30, 0x20, 0x33, 0x35, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x35, 0x33, 0x20, +0x20, 0x30, 0x20, 0x35, 0x34, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x30, 0x20, 0x34, 0x35, 0x20, 0x20, 0x30, 0x20, 0x35, 0x35, 0x20, +0x0a, 0x0a, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x20, 0x38, 0x20, +0x20, 0x37, 0x31, 0x20, 0x20, 0x36, 0x20, 0x20, 0x36, 0x20, 0x20, 0x30, +0x0a, 0x2e, 0x74, 0x72, 0x65, 0x65, 0x64, 0x61, 0x74, 0x61, 0x0a, 0x20, +0x36, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x20, 0x30, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x31, 0x30, 0x20, 0x20, 0x30, 0x20, 0x20, 0x31, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x31, 0x31, 0x20, 0x20, +0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x32, 0x31, 0x20, 0x20, 0x30, 0x20, 0x31, 0x32, 0x20, 0x0a, +0x20, 0x65, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x32, 0x30, 0x20, +0x20, 0x30, 0x20, 0x20, 0x32, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x30, 0x20, 0x32, 0x32, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x33, 0x30, 0x20, +0x20, 0x30, 0x20, 0x20, 0x33, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x0a, 0x20, 0x30, 0x20, 0x33, 0x31, 0x20, 0x20, 0x30, 0x20, 0x31, 0x33, +0x20, 0x20, 0x65, 0x20, 0x20, 0x31, 0x20, 0x20, 0x38, 0x20, 0x20, 0x31, +0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x33, 0x32, 0x20, 0x20, 0x30, 0x20, 0x32, 0x33, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x34, 0x30, +0x20, 0x20, 0x30, 0x20, 0x20, 0x34, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x0a, 0x20, 0x30, 0x20, 0x34, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x31, 0x34, 0x20, 0x20, 0x30, 0x20, 0x34, +0x32, 0x20, 0x20, 0x63, 0x20, 0x20, 0x31, 0x20, 0x20, 0x36, 0x20, 0x20, +0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x32, +0x34, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x33, +0x33, 0x20, 0x20, 0x30, 0x20, 0x35, 0x30, 0x20, 0x20, 0x34, 0x20, 0x20, +0x31, 0x20, 0x0a, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x34, 0x33, 0x20, 0x20, 0x30, 0x20, 0x33, 0x34, 0x20, 0x20, 0x30, 0x20, +0x35, 0x31, 0x20, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x31, 0x35, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x20, 0x35, 0x20, 0x20, 0x30, 0x20, +0x35, 0x32, 0x20, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x32, 0x35, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x34, 0x34, 0x20, 0x20, 0x30, +0x20, 0x33, 0x35, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x35, 0x33, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x34, 0x35, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x35, 0x34, 0x20, 0x20, 0x30, 0x20, 0x35, 0x35, 0x20, 0x0a, 0x0a, +0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x20, 0x39, 0x20, 0x20, 0x37, +0x31, 0x20, 0x20, 0x36, 0x20, 0x20, 0x36, 0x20, 0x20, 0x30, 0x0a, 0x2e, +0x74, 0x72, 0x65, 0x65, 0x64, 0x61, 0x74, 0x61, 0x0a, 0x20, 0x38, 0x20, +0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x20, 0x30, 0x20, 0x20, 0x30, 0x20, +0x31, 0x30, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x31, 0x31, 0x20, 0x20, 0x61, 0x20, +0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x32, 0x30, 0x20, 0x0a, 0x20, 0x30, +0x20, 0x32, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x31, 0x32, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x20, 0x32, 0x20, 0x20, 0x30, 0x20, 0x32, 0x32, 0x20, 0x20, 0x63, +0x20, 0x20, 0x31, 0x20, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, +0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x33, 0x30, 0x20, 0x20, 0x30, 0x20, 0x20, 0x33, 0x20, 0x0a, 0x20, +0x30, 0x20, 0x33, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x31, 0x33, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x33, 0x32, 0x20, 0x20, 0x30, 0x20, 0x32, 0x33, 0x20, 0x20, +0x63, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x34, 0x31, 0x20, 0x20, +0x30, 0x20, 0x31, 0x34, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x0a, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x34, 0x30, 0x20, +0x20, 0x30, 0x20, 0x33, 0x33, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x30, 0x20, 0x34, 0x32, 0x20, 0x20, 0x30, 0x20, 0x32, 0x34, 0x20, +0x20, 0x61, 0x20, 0x20, 0x31, 0x20, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, +0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x30, 0x20, 0x20, 0x34, 0x20, 0x20, 0x30, 0x20, 0x35, 0x30, 0x20, +0x0a, 0x20, 0x30, 0x20, 0x34, 0x33, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x33, 0x34, 0x20, 0x20, 0x30, 0x20, 0x35, 0x31, +0x20, 0x20, 0x38, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x31, 0x35, +0x20, 0x20, 0x30, 0x20, 0x35, 0x32, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x32, 0x35, 0x20, 0x20, 0x30, 0x20, 0x34, 0x34, +0x20, 0x0a, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, +0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x20, +0x35, 0x20, 0x20, 0x30, 0x20, 0x35, 0x34, 0x20, 0x20, 0x30, 0x20, 0x35, +0x33, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x33, +0x35, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x34, +0x35, 0x20, 0x20, 0x30, 0x20, 0x35, 0x35, 0x20, 0x0a, 0x0a, 0x2e, 0x74, +0x61, 0x62, 0x6c, 0x65, 0x20, 0x31, 0x30, 0x20, 0x31, 0x32, 0x37, 0x20, +0x20, 0x38, 0x20, 0x20, 0x38, 0x20, 0x20, 0x30, 0x0a, 0x2e, 0x74, 0x72, +0x65, 0x65, 0x64, 0x61, 0x74, 0x61, 0x0a, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x20, 0x30, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x31, 0x30, +0x20, 0x20, 0x30, 0x20, 0x20, 0x31, 0x20, 0x20, 0x61, 0x20, 0x20, 0x31, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x31, 0x31, +0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x32, 0x30, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x20, +0x32, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x32, +0x31, 0x20, 0x20, 0x30, 0x20, 0x31, 0x32, 0x20, 0x31, 0x63, 0x20, 0x20, +0x31, 0x20, 0x20, 0x38, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, +0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x32, +0x32, 0x20, 0x20, 0x30, 0x20, 0x33, 0x30, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x33, 0x31, 0x20, 0x0a, 0x20, 0x30, 0x20, +0x31, 0x33, 0x20, 0x20, 0x38, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, +0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x20, 0x33, 0x20, 0x20, 0x30, 0x20, 0x33, 0x32, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x32, 0x33, 0x20, 0x20, 0x30, 0x20, +0x34, 0x30, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x34, 0x31, 0x20, 0x0a, 0x20, 0x30, +0x20, 0x31, 0x34, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x20, 0x34, 0x20, 0x20, 0x30, +0x20, 0x33, 0x33, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x34, 0x32, 0x20, 0x20, 0x30, 0x20, 0x32, 0x34, 0x20, 0x31, 0x63, +0x20, 0x20, 0x31, 0x20, 0x20, 0x61, 0x20, 0x20, 0x31, 0x20, 0x20, 0x36, +0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x35, 0x30, 0x20, 0x20, +0x30, 0x20, 0x20, 0x35, 0x20, 0x20, 0x30, 0x20, 0x36, 0x30, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x36, 0x31, 0x20, 0x20, +0x30, 0x20, 0x31, 0x36, 0x20, 0x20, 0x63, 0x20, 0x20, 0x31, 0x20, 0x20, +0x36, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x34, 0x33, 0x20, 0x0a, +0x20, 0x30, 0x20, 0x33, 0x34, 0x20, 0x20, 0x30, 0x20, 0x35, 0x31, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x31, 0x35, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x35, 0x32, 0x20, +0x20, 0x30, 0x20, 0x32, 0x35, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x32, 0x36, 0x20, +0x20, 0x30, 0x20, 0x33, 0x36, 0x20, 0x20, 0x30, 0x20, 0x37, 0x31, 0x20, +0x0a, 0x31, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x38, 0x20, 0x20, 0x31, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x31, 0x37, +0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x34, 0x34, 0x20, 0x20, 0x30, 0x20, 0x35, 0x33, +0x20, 0x20, 0x30, 0x20, 0x20, 0x36, 0x20, 0x20, 0x36, 0x20, 0x20, 0x31, +0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x0a, 0x20, 0x30, 0x20, 0x33, 0x35, 0x20, 0x20, 0x30, 0x20, 0x34, +0x35, 0x20, 0x20, 0x30, 0x20, 0x36, 0x32, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x37, 0x30, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x20, 0x37, 0x20, 0x20, 0x30, 0x20, 0x36, +0x34, 0x20, 0x20, 0x65, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, +0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x37, +0x32, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x32, 0x37, 0x20, 0x20, 0x36, 0x20, +0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x36, 0x33, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x35, 0x34, 0x20, 0x20, 0x30, 0x20, 0x35, 0x35, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x34, 0x36, 0x20, 0x20, 0x30, 0x20, +0x37, 0x33, 0x20, 0x20, 0x38, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, +0x20, 0x31, 0x20, 0x0a, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x33, 0x37, 0x20, 0x20, 0x30, 0x20, 0x36, 0x35, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x35, 0x36, 0x20, 0x20, 0x30, +0x20, 0x37, 0x34, 0x20, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x34, 0x37, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x36, 0x36, 0x20, 0x20, 0x30, +0x20, 0x37, 0x35, 0x20, 0x0a, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x35, 0x37, 0x20, 0x20, +0x30, 0x20, 0x37, 0x36, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x36, 0x37, 0x20, 0x20, 0x30, 0x20, 0x37, 0x37, 0x20, 0x0a, +0x0a, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x31, 0x31, 0x20, 0x31, +0x32, 0x37, 0x20, 0x20, 0x38, 0x20, 0x20, 0x38, 0x20, 0x20, 0x30, 0x0a, +0x2e, 0x74, 0x72, 0x65, 0x65, 0x64, 0x61, 0x74, 0x61, 0x0a, 0x20, 0x36, +0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x20, 0x30, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x31, 0x30, 0x20, 0x20, 0x30, 0x20, 0x20, 0x31, 0x20, 0x20, 0x38, +0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x31, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x32, 0x30, 0x20, 0x0a, 0x20, +0x30, 0x20, 0x20, 0x32, 0x20, 0x20, 0x30, 0x20, 0x31, 0x32, 0x20, 0x31, +0x38, 0x20, 0x20, 0x31, 0x20, 0x20, 0x38, 0x20, 0x20, 0x31, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x32, 0x31, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x32, 0x32, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x33, 0x30, 0x20, 0x20, +0x30, 0x20, 0x20, 0x33, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x0a, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x33, 0x31, 0x20, +0x20, 0x30, 0x20, 0x31, 0x33, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x33, 0x32, 0x20, +0x20, 0x30, 0x20, 0x32, 0x33, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x34, 0x30, 0x20, +0x20, 0x30, 0x20, 0x20, 0x34, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x0a, 0x20, 0x30, 0x20, 0x34, 0x31, 0x20, 0x20, 0x30, 0x20, 0x31, 0x34, +0x20, 0x31, 0x65, 0x20, 0x20, 0x31, 0x20, 0x31, 0x30, 0x20, 0x20, 0x31, +0x20, 0x20, 0x61, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x34, 0x32, +0x20, 0x20, 0x30, 0x20, 0x32, 0x34, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x33, 0x33, +0x20, 0x0a, 0x20, 0x30, 0x20, 0x34, 0x33, 0x20, 0x20, 0x30, 0x20, 0x35, +0x30, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x33, 0x34, 0x20, 0x20, 0x30, 0x20, 0x35, +0x31, 0x20, 0x20, 0x30, 0x20, 0x36, 0x31, 0x20, 0x20, 0x36, 0x20, 0x20, +0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x31, +0x36, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x20, +0x36, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x32, 0x36, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x36, 0x32, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x31, 0x35, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x20, 0x35, 0x20, 0x20, 0x30, 0x20, +0x35, 0x32, 0x20, 0x31, 0x30, 0x20, 0x20, 0x31, 0x20, 0x20, 0x61, 0x20, +0x20, 0x31, 0x20, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, +0x20, 0x31, 0x20, 0x0a, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x32, 0x35, 0x20, 0x20, 0x30, 0x20, 0x34, 0x34, 0x20, 0x20, 0x30, +0x20, 0x36, 0x30, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x36, 0x33, 0x20, 0x20, 0x30, 0x20, 0x33, 0x36, 0x20, 0x20, 0x34, +0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x37, 0x30, 0x20, 0x20, 0x30, 0x20, 0x31, 0x37, 0x20, 0x20, 0x30, +0x20, 0x37, 0x31, 0x20, 0x0a, 0x31, 0x30, 0x20, 0x20, 0x31, 0x20, 0x20, +0x36, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x20, 0x37, 0x20, 0x20, +0x30, 0x20, 0x36, 0x34, 0x20, 0x20, 0x30, 0x20, 0x37, 0x32, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x32, 0x37, 0x20, 0x20, +0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x35, 0x33, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x33, 0x35, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x35, 0x34, 0x20, +0x20, 0x30, 0x20, 0x34, 0x35, 0x20, 0x20, 0x61, 0x20, 0x20, 0x31, 0x20, +0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x30, 0x20, 0x34, 0x36, 0x20, 0x20, 0x30, 0x20, 0x37, 0x33, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x33, 0x37, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x36, 0x35, +0x20, 0x20, 0x30, 0x20, 0x35, 0x36, 0x20, 0x20, 0x61, 0x20, 0x20, 0x31, +0x20, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x35, 0x35, +0x20, 0x20, 0x30, 0x20, 0x35, 0x37, 0x20, 0x20, 0x30, 0x20, 0x37, 0x34, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x34, 0x37, +0x20, 0x20, 0x30, 0x20, 0x36, 0x36, 0x20, 0x0a, 0x20, 0x34, 0x20, 0x20, +0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x37, +0x35, 0x20, 0x20, 0x30, 0x20, 0x37, 0x36, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x36, 0x37, 0x20, 0x20, 0x30, 0x20, 0x37, +0x37, 0x20, 0x0a, 0x0a, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x31, +0x32, 0x20, 0x31, 0x32, 0x37, 0x20, 0x20, 0x38, 0x20, 0x20, 0x38, 0x20, +0x20, 0x30, 0x0a, 0x2e, 0x74, 0x72, 0x65, 0x65, 0x64, 0x61, 0x74, 0x61, +0x0a, 0x20, 0x63, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x31, 0x30, +0x20, 0x20, 0x30, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x31, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x20, 0x30, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x32, 0x30, 0x20, 0x20, 0x30, 0x20, 0x20, 0x32, +0x20, 0x0a, 0x31, 0x30, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, +0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x32, +0x31, 0x20, 0x20, 0x30, 0x20, 0x31, 0x32, 0x20, 0x20, 0x34, 0x20, 0x20, +0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x32, +0x32, 0x20, 0x20, 0x30, 0x20, 0x33, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x31, 0x33, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x33, 0x30, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x20, 0x33, 0x20, 0x20, 0x30, 0x20, +0x34, 0x30, 0x20, 0x31, 0x61, 0x20, 0x20, 0x31, 0x20, 0x20, 0x38, 0x20, +0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x33, 0x32, 0x20, 0x20, 0x30, 0x20, +0x32, 0x33, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x34, 0x31, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x33, 0x33, 0x20, 0x20, 0x61, +0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x31, 0x34, 0x20, 0x20, 0x30, +0x20, 0x34, 0x32, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x32, 0x34, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x20, 0x34, 0x20, 0x20, 0x30, 0x20, 0x35, 0x30, 0x20, 0x20, 0x34, +0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x34, 0x33, 0x20, 0x20, 0x30, 0x20, 0x33, 0x34, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x35, 0x31, 0x20, 0x20, +0x30, 0x20, 0x31, 0x35, 0x20, 0x31, 0x63, 0x20, 0x20, 0x31, 0x20, 0x20, +0x65, 0x20, 0x20, 0x31, 0x20, 0x20, 0x38, 0x20, 0x20, 0x31, 0x20, 0x20, +0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x35, 0x32, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x32, 0x35, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x35, 0x33, 0x20, +0x20, 0x30, 0x20, 0x33, 0x35, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x36, 0x30, 0x20, +0x20, 0x30, 0x20, 0x31, 0x36, 0x20, 0x20, 0x30, 0x20, 0x36, 0x31, 0x20, +0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x30, 0x20, 0x36, 0x32, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x32, 0x36, +0x20, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x20, 0x35, +0x20, 0x20, 0x30, 0x20, 0x20, 0x36, 0x20, 0x20, 0x30, 0x20, 0x34, 0x34, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x35, 0x34, +0x20, 0x20, 0x30, 0x20, 0x34, 0x35, 0x20, 0x31, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x61, 0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, 0x34, 0x20, 0x20, +0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x36, +0x33, 0x20, 0x20, 0x30, 0x20, 0x33, 0x36, 0x20, 0x20, 0x34, 0x20, 0x20, +0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x37, +0x30, 0x20, 0x20, 0x30, 0x20, 0x20, 0x37, 0x20, 0x20, 0x30, 0x20, 0x37, +0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x31, 0x37, 0x20, 0x0a, 0x20, 0x30, 0x20, +0x36, 0x34, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x34, 0x36, 0x20, 0x20, 0x30, 0x20, 0x37, 0x32, 0x20, 0x20, 0x61, 0x20, +0x20, 0x31, 0x20, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x32, 0x37, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x35, 0x35, 0x20, 0x20, 0x30, 0x20, +0x37, 0x33, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, 0x30, +0x20, 0x33, 0x37, 0x20, 0x20, 0x30, 0x20, 0x35, 0x36, 0x20, 0x20, 0x38, +0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x36, 0x35, 0x20, 0x20, 0x30, +0x20, 0x37, 0x34, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x34, 0x37, 0x20, 0x20, 0x30, 0x20, 0x36, 0x36, 0x20, 0x20, 0x34, +0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, +0x30, 0x20, 0x37, 0x35, 0x20, 0x20, 0x30, 0x20, 0x35, 0x37, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x37, 0x36, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x36, 0x37, 0x20, 0x20, +0x30, 0x20, 0x37, 0x37, 0x20, 0x0a, 0x0a, 0x2e, 0x74, 0x61, 0x62, 0x6c, +0x65, 0x20, 0x31, 0x33, 0x20, 0x35, 0x31, 0x31, 0x20, 0x31, 0x36, 0x20, +0x31, 0x36, 0x20, 0x20, 0x30, 0x0a, 0x2e, 0x74, 0x72, 0x65, 0x65, 0x64, +0x61, 0x74, 0x61, 0x0a, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x20, 0x30, 0x20, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x31, 0x30, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x31, 0x31, 0x20, 0x31, 0x63, 0x20, 0x20, 0x31, 0x20, 0x20, 0x38, +0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x32, 0x30, 0x20, 0x20, +0x30, 0x20, 0x20, 0x32, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x32, 0x31, 0x20, 0x20, 0x30, 0x20, 0x31, 0x32, 0x20, 0x20, +0x38, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x32, 0x32, 0x20, 0x20, +0x30, 0x20, 0x33, 0x30, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x20, 0x33, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x33, 0x31, 0x20, +0x20, 0x36, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x30, 0x20, 0x31, 0x33, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x30, 0x20, 0x33, 0x32, 0x20, 0x20, 0x30, 0x20, 0x32, 0x33, 0x20, +0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x30, 0x20, 0x34, 0x30, 0x20, 0x20, 0x30, 0x20, 0x20, 0x34, 0x20, +0x20, 0x30, 0x20, 0x34, 0x31, 0x20, 0x0a, 0x34, 0x36, 0x20, 0x20, 0x31, +0x20, 0x31, 0x63, 0x20, 0x20, 0x31, 0x20, 0x20, 0x65, 0x20, 0x20, 0x31, +0x20, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x31, 0x34, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x33, 0x33, 0x20, 0x20, 0x30, 0x20, 0x34, 0x32, +0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x32, 0x34, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x35, +0x30, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x34, +0x33, 0x20, 0x20, 0x30, 0x20, 0x33, 0x34, 0x20, 0x20, 0x34, 0x20, 0x20, +0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x35, +0x31, 0x20, 0x20, 0x30, 0x20, 0x31, 0x35, 0x20, 0x20, 0x34, 0x20, 0x20, +0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x20, +0x35, 0x20, 0x20, 0x30, 0x20, 0x35, 0x32, 0x20, 0x0a, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x32, 0x35, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x34, 0x34, 0x20, 0x20, 0x30, 0x20, +0x35, 0x33, 0x20, 0x20, 0x65, 0x20, 0x20, 0x31, 0x20, 0x20, 0x38, 0x20, +0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x36, 0x30, 0x20, 0x20, 0x30, 0x20, +0x20, 0x36, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, 0x30, +0x20, 0x36, 0x31, 0x20, 0x20, 0x30, 0x20, 0x31, 0x36, 0x20, 0x20, 0x34, +0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x38, 0x30, 0x20, 0x20, 0x30, 0x20, 0x20, 0x38, 0x20, 0x20, 0x30, +0x20, 0x38, 0x31, 0x20, 0x31, 0x30, 0x20, 0x20, 0x31, 0x20, 0x20, 0x38, +0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x33, 0x35, 0x20, 0x0a, 0x20, +0x30, 0x20, 0x36, 0x32, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x32, 0x36, 0x20, 0x20, 0x30, 0x20, 0x35, 0x34, 0x20, 0x20, +0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x34, 0x35, 0x20, 0x20, 0x30, 0x20, 0x36, 0x33, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x33, 0x36, 0x20, 0x20, +0x30, 0x20, 0x37, 0x30, 0x20, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, 0x0a, +0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x30, 0x20, 0x20, 0x37, 0x20, 0x20, 0x30, 0x20, 0x35, 0x35, 0x20, +0x20, 0x30, 0x20, 0x37, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x30, 0x20, 0x31, 0x37, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x30, 0x20, 0x32, 0x37, 0x20, 0x20, 0x30, 0x20, 0x33, 0x37, 0x20, +0x34, 0x38, 0x20, 0x20, 0x31, 0x20, 0x31, 0x38, 0x20, 0x20, 0x31, 0x20, +0x0a, 0x20, 0x63, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x31, 0x38, +0x20, 0x20, 0x30, 0x20, 0x38, 0x32, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x32, 0x38, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x36, 0x34, +0x20, 0x20, 0x30, 0x20, 0x34, 0x36, 0x20, 0x20, 0x30, 0x20, 0x37, 0x32, +0x20, 0x0a, 0x20, 0x38, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, +0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x38, +0x34, 0x20, 0x20, 0x30, 0x20, 0x34, 0x38, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x39, 0x30, 0x20, 0x20, 0x30, 0x20, 0x20, +0x39, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x39, +0x31, 0x20, 0x20, 0x30, 0x20, 0x31, 0x39, 0x20, 0x31, 0x38, 0x20, 0x20, +0x31, 0x20, 0x0a, 0x20, 0x65, 0x20, 0x20, 0x31, 0x20, 0x20, 0x38, 0x20, +0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x37, 0x33, 0x20, 0x20, 0x30, 0x20, +0x36, 0x35, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x35, 0x36, 0x20, 0x20, 0x30, 0x20, 0x37, 0x34, 0x20, 0x20, 0x34, 0x20, +0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x34, 0x37, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x36, 0x36, 0x20, 0x20, 0x30, +0x20, 0x38, 0x33, 0x20, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x33, 0x38, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x37, 0x35, 0x20, 0x20, 0x30, +0x20, 0x35, 0x37, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x39, 0x32, 0x20, 0x20, 0x30, 0x20, 0x32, 0x39, 0x20, 0x20, 0x65, +0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, 0x38, 0x20, 0x20, 0x31, 0x20, 0x20, +0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x36, 0x37, 0x20, 0x20, 0x30, 0x20, 0x38, 0x35, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x35, 0x38, 0x20, 0x20, +0x30, 0x20, 0x33, 0x39, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x39, 0x33, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x34, 0x39, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x38, 0x36, 0x20, +0x20, 0x36, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x30, 0x20, 0x61, 0x30, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x30, 0x20, 0x36, 0x38, 0x20, 0x20, 0x30, 0x20, 0x20, 0x61, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x61, 0x31, 0x20, +0x20, 0x30, 0x20, 0x31, 0x61, 0x20, 0x34, 0x34, 0x20, 0x20, 0x31, 0x20, +0x31, 0x38, 0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, 0x63, 0x20, 0x20, 0x31, +0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x61, 0x32, 0x20, 0x20, 0x30, 0x20, 0x32, 0x61, +0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x39, 0x35, 0x20, 0x20, 0x30, 0x20, 0x35, 0x39, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x61, 0x33, +0x20, 0x20, 0x30, 0x20, 0x33, 0x61, 0x20, 0x0a, 0x20, 0x38, 0x20, 0x20, +0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x34, 0x61, 0x20, 0x20, 0x30, 0x20, 0x39, +0x36, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x62, +0x30, 0x20, 0x20, 0x30, 0x20, 0x20, 0x62, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x62, 0x31, 0x20, 0x20, 0x30, 0x20, 0x31, +0x62, 0x20, 0x31, 0x34, 0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, 0x38, 0x20, +0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x62, 0x32, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x37, 0x36, 0x20, 0x20, 0x30, 0x20, +0x37, 0x37, 0x20, 0x20, 0x30, 0x20, 0x39, 0x34, 0x20, 0x20, 0x36, 0x20, +0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x38, 0x37, 0x20, 0x0a, 0x20, 0x30, +0x20, 0x37, 0x38, 0x20, 0x20, 0x30, 0x20, 0x61, 0x34, 0x20, 0x20, 0x34, +0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x36, 0x39, 0x20, 0x20, 0x30, 0x20, 0x61, 0x35, 0x20, 0x20, 0x30, +0x20, 0x32, 0x62, 0x20, 0x20, 0x63, 0x20, 0x20, 0x31, 0x20, 0x20, 0x36, +0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x35, 0x61, 0x20, 0x0a, 0x20, +0x30, 0x20, 0x38, 0x38, 0x20, 0x20, 0x30, 0x20, 0x62, 0x33, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x33, 0x62, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x37, 0x39, 0x20, 0x20, +0x30, 0x20, 0x61, 0x36, 0x20, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, 0x20, +0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x36, 0x61, 0x20, 0x20, 0x30, 0x20, 0x62, 0x34, 0x20, 0x0a, +0x20, 0x30, 0x20, 0x63, 0x30, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x20, 0x63, 0x20, +0x20, 0x30, 0x20, 0x39, 0x38, 0x20, 0x20, 0x30, 0x20, 0x63, 0x31, 0x20, +0x33, 0x63, 0x20, 0x20, 0x31, 0x20, 0x31, 0x36, 0x20, 0x20, 0x31, 0x20, +0x20, 0x61, 0x20, 0x20, 0x31, 0x20, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x31, 0x63, 0x20, +0x0a, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x38, 0x39, +0x20, 0x20, 0x30, 0x20, 0x62, 0x35, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x35, 0x62, 0x20, 0x20, 0x30, 0x20, 0x63, 0x32, +0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x32, 0x63, 0x20, 0x20, 0x30, 0x20, 0x33, 0x63, +0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x0a, 0x20, 0x30, 0x20, 0x62, 0x36, 0x20, 0x20, 0x30, 0x20, 0x36, +0x62, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x63, +0x34, 0x20, 0x20, 0x30, 0x20, 0x34, 0x63, 0x20, 0x31, 0x30, 0x20, 0x20, +0x31, 0x20, 0x20, 0x38, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, +0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x61, +0x38, 0x20, 0x20, 0x30, 0x20, 0x38, 0x61, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x64, 0x30, 0x20, 0x20, 0x30, 0x20, +0x20, 0x64, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x64, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x34, 0x62, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x39, 0x37, 0x20, 0x20, 0x30, 0x20, 0x61, 0x37, 0x20, 0x20, 0x63, 0x20, +0x20, 0x31, 0x20, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x63, 0x33, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x37, 0x61, 0x20, 0x20, 0x30, +0x20, 0x39, 0x39, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x63, 0x35, 0x20, 0x20, 0x30, +0x20, 0x35, 0x63, 0x20, 0x20, 0x30, 0x20, 0x62, 0x37, 0x20, 0x20, 0x34, +0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x31, 0x64, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x64, 0x32, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x32, 0x64, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x37, 0x62, 0x20, 0x20, +0x30, 0x20, 0x64, 0x33, 0x20, 0x33, 0x34, 0x20, 0x20, 0x31, 0x20, 0x31, +0x63, 0x20, 0x20, 0x31, 0x20, 0x20, 0x63, 0x20, 0x20, 0x31, 0x20, 0x20, +0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x33, 0x64, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x63, 0x36, 0x20, +0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x30, 0x20, 0x36, 0x63, 0x20, 0x20, 0x30, 0x20, 0x61, 0x39, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x39, 0x61, 0x20, +0x20, 0x30, 0x20, 0x64, 0x34, 0x20, 0x20, 0x38, 0x20, 0x20, 0x31, 0x20, +0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x30, 0x20, 0x62, 0x38, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x38, 0x62, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x34, 0x64, +0x20, 0x20, 0x30, 0x20, 0x63, 0x37, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x37, 0x63, +0x20, 0x20, 0x30, 0x20, 0x64, 0x35, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x35, 0x64, 0x20, 0x20, 0x30, 0x20, 0x65, 0x30, +0x20, 0x20, 0x61, 0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, 0x34, 0x20, 0x20, +0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x65, +0x31, 0x20, 0x20, 0x30, 0x20, 0x31, 0x65, 0x20, 0x20, 0x34, 0x20, 0x20, +0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x20, +0x65, 0x20, 0x20, 0x30, 0x20, 0x32, 0x65, 0x20, 0x20, 0x30, 0x20, 0x65, +0x32, 0x20, 0x20, 0x38, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, +0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, 0x30, 0x20, +0x65, 0x33, 0x20, 0x20, 0x30, 0x20, 0x36, 0x64, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x38, 0x63, 0x20, 0x20, 0x30, 0x20, +0x65, 0x34, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x65, 0x35, 0x20, 0x20, 0x30, 0x20, +0x62, 0x61, 0x20, 0x20, 0x30, 0x20, 0x66, 0x30, 0x20, 0x32, 0x36, 0x20, +0x20, 0x31, 0x20, 0x31, 0x30, 0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, 0x34, +0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x66, 0x31, 0x20, 0x20, 0x30, 0x20, 0x31, 0x66, 0x20, 0x20, 0x36, +0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x61, 0x61, 0x20, 0x20, 0x30, +0x20, 0x39, 0x62, 0x20, 0x20, 0x30, 0x20, 0x62, 0x39, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x33, 0x65, 0x20, 0x0a, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x64, 0x36, 0x20, 0x20, +0x30, 0x20, 0x63, 0x38, 0x20, 0x20, 0x63, 0x20, 0x20, 0x31, 0x20, 0x20, +0x36, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x34, 0x65, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x64, 0x37, 0x20, 0x20, 0x30, 0x20, 0x37, 0x64, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x61, 0x62, 0x20, 0x0a, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x35, 0x65, 0x20, +0x20, 0x30, 0x20, 0x63, 0x39, 0x20, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x20, 0x66, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x39, 0x63, 0x20, +0x20, 0x30, 0x20, 0x36, 0x65, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x30, 0x20, 0x66, 0x32, 0x20, 0x20, 0x30, 0x20, 0x32, 0x66, 0x20, +0x0a, 0x32, 0x30, 0x20, 0x20, 0x31, 0x20, 0x31, 0x30, 0x20, 0x20, 0x31, +0x20, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x64, 0x38, +0x20, 0x20, 0x30, 0x20, 0x38, 0x64, 0x20, 0x20, 0x30, 0x20, 0x33, 0x66, +0x20, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x66, 0x33, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x0a, 0x20, 0x30, 0x20, 0x65, 0x36, 0x20, 0x20, 0x30, 0x20, 0x63, +0x61, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x66, +0x34, 0x20, 0x20, 0x30, 0x20, 0x34, 0x66, 0x20, 0x20, 0x38, 0x20, 0x20, +0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x62, 0x62, 0x20, 0x20, 0x30, 0x20, 0x61, +0x63, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x65, +0x37, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x66, 0x35, 0x20, 0x20, 0x34, 0x20, +0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x64, 0x39, 0x20, 0x20, 0x30, 0x20, 0x39, 0x64, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x35, 0x66, 0x20, 0x20, 0x30, 0x20, +0x65, 0x38, 0x20, 0x31, 0x65, 0x20, 0x20, 0x31, 0x20, 0x20, 0x63, 0x20, +0x20, 0x31, 0x20, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x36, 0x66, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x66, 0x36, 0x20, 0x20, 0x30, +0x20, 0x63, 0x62, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x62, 0x63, 0x20, 0x20, 0x30, +0x20, 0x61, 0x64, 0x20, 0x20, 0x30, 0x20, 0x64, 0x61, 0x20, 0x20, 0x38, +0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x66, 0x37, 0x20, 0x0a, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x37, 0x65, 0x20, 0x20, +0x30, 0x20, 0x37, 0x66, 0x20, 0x20, 0x30, 0x20, 0x38, 0x65, 0x20, 0x20, +0x36, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x39, 0x65, 0x20, 0x20, +0x30, 0x20, 0x61, 0x65, 0x20, 0x20, 0x30, 0x20, 0x63, 0x63, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x66, 0x38, 0x20, +0x20, 0x30, 0x20, 0x38, 0x66, 0x20, 0x31, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x38, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x64, 0x62, 0x20, +0x20, 0x30, 0x20, 0x62, 0x64, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x30, 0x20, 0x65, 0x61, 0x20, 0x20, 0x30, 0x20, 0x66, 0x39, 0x20, +0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x39, 0x66, 0x20, 0x20, 0x30, 0x20, 0x65, 0x62, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x62, 0x65, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x63, 0x64, +0x20, 0x20, 0x30, 0x20, 0x66, 0x61, 0x20, 0x20, 0x65, 0x20, 0x20, 0x31, +0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x64, 0x64, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x65, +0x63, 0x20, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, +0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x65, +0x39, 0x20, 0x20, 0x30, 0x20, 0x61, 0x66, 0x20, 0x20, 0x30, 0x20, 0x64, +0x63, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x63, +0x65, 0x20, 0x20, 0x30, 0x20, 0x66, 0x62, 0x20, 0x20, 0x38, 0x20, 0x20, +0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x62, 0x66, 0x20, 0x20, 0x30, 0x20, +0x64, 0x65, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x63, 0x66, 0x20, 0x20, 0x30, 0x20, 0x65, 0x65, 0x20, 0x20, 0x34, 0x20, +0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x64, 0x66, 0x20, 0x20, 0x30, 0x20, 0x65, 0x66, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x66, 0x66, 0x20, 0x0a, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x65, 0x64, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x66, 0x64, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x66, 0x63, 0x20, 0x20, 0x30, +0x20, 0x66, 0x65, 0x20, 0x0a, 0x0a, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, +0x20, 0x31, 0x34, 0x20, 0x20, 0x20, 0x30, 0x20, 0x20, 0x30, 0x20, 0x20, +0x30, 0x20, 0x20, 0x30, 0x0a, 0x2e, 0x74, 0x72, 0x65, 0x65, 0x64, 0x61, +0x74, 0x61, 0x0a, 0x0a, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x31, +0x35, 0x20, 0x35, 0x31, 0x31, 0x20, 0x31, 0x36, 0x20, 0x31, 0x36, 0x20, +0x20, 0x30, 0x0a, 0x2e, 0x74, 0x72, 0x65, 0x65, 0x64, 0x61, 0x74, 0x61, +0x0a, 0x31, 0x30, 0x20, 0x20, 0x31, 0x20, 0x20, 0x36, 0x20, 0x20, 0x31, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x20, 0x30, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x31, 0x30, +0x20, 0x20, 0x30, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x31, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x32, 0x30, +0x20, 0x0a, 0x20, 0x30, 0x20, 0x20, 0x32, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x32, 0x31, 0x20, 0x20, 0x30, 0x20, 0x31, +0x32, 0x20, 0x33, 0x32, 0x20, 0x20, 0x31, 0x20, 0x31, 0x30, 0x20, 0x20, +0x31, 0x20, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x32, 0x32, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x33, 0x30, 0x20, 0x20, 0x30, 0x20, 0x33, +0x31, 0x20, 0x0a, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x31, 0x33, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x20, 0x33, 0x20, 0x20, 0x30, 0x20, +0x34, 0x30, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x33, 0x32, 0x20, 0x20, 0x30, 0x20, 0x32, 0x33, 0x20, 0x20, 0x65, 0x20, +0x20, 0x31, 0x20, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, +0x20, 0x31, 0x20, 0x0a, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x20, 0x34, 0x20, 0x20, 0x30, 0x20, 0x31, 0x34, 0x20, 0x20, 0x30, +0x20, 0x34, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x33, 0x33, 0x20, 0x20, 0x30, +0x20, 0x34, 0x32, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x32, 0x34, 0x20, 0x20, 0x30, 0x20, 0x34, 0x33, 0x20, 0x20, 0x61, +0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x33, 0x34, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x35, 0x30, 0x20, 0x20, +0x30, 0x20, 0x20, 0x35, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x35, 0x31, 0x20, 0x20, 0x30, 0x20, 0x31, 0x35, 0x20, 0x20, +0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x35, 0x32, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x32, 0x35, 0x20, +0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x30, 0x20, 0x34, 0x34, 0x20, 0x20, 0x30, 0x20, 0x35, 0x33, 0x20, +0x20, 0x30, 0x20, 0x36, 0x31, 0x20, 0x35, 0x61, 0x20, 0x20, 0x31, 0x20, +0x32, 0x34, 0x20, 0x20, 0x31, 0x20, 0x31, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x61, 0x20, 0x20, 0x31, 0x20, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x33, 0x35, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x36, 0x30, +0x20, 0x20, 0x30, 0x20, 0x20, 0x36, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x31, 0x36, 0x20, 0x20, 0x30, 0x20, 0x36, 0x32, +0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x32, 0x36, 0x20, 0x20, 0x30, 0x20, 0x35, 0x34, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x34, +0x35, 0x20, 0x20, 0x30, 0x20, 0x36, 0x33, 0x20, 0x20, 0x61, 0x20, 0x20, +0x31, 0x20, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x33, 0x36, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x37, 0x30, 0x20, 0x20, 0x30, 0x20, 0x20, +0x37, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x37, +0x31, 0x20, 0x20, 0x30, 0x20, 0x35, 0x35, 0x20, 0x0a, 0x20, 0x34, 0x20, +0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x31, 0x37, 0x20, 0x20, 0x30, 0x20, 0x36, 0x34, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x37, 0x32, 0x20, 0x20, 0x30, 0x20, +0x32, 0x37, 0x20, 0x31, 0x38, 0x20, 0x20, 0x31, 0x20, 0x31, 0x30, 0x20, +0x20, 0x31, 0x20, 0x20, 0x38, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, +0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, 0x30, +0x20, 0x34, 0x36, 0x20, 0x20, 0x30, 0x20, 0x37, 0x33, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x33, 0x37, 0x20, 0x20, 0x30, +0x20, 0x36, 0x35, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x35, 0x36, 0x20, 0x20, 0x30, +0x20, 0x38, 0x30, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x20, 0x38, 0x20, 0x20, 0x30, 0x20, 0x37, 0x34, 0x20, 0x0a, 0x20, +0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x38, 0x31, 0x20, 0x20, 0x30, 0x20, 0x31, 0x38, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x38, 0x32, 0x20, 0x20, +0x30, 0x20, 0x32, 0x38, 0x20, 0x31, 0x30, 0x20, 0x20, 0x31, 0x20, 0x20, +0x38, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x34, 0x37, 0x20, 0x0a, +0x20, 0x30, 0x20, 0x36, 0x36, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x30, 0x20, 0x38, 0x33, 0x20, 0x20, 0x30, 0x20, 0x33, 0x38, 0x20, +0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x30, 0x20, 0x37, 0x35, 0x20, 0x20, 0x30, 0x20, 0x35, 0x37, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x38, 0x34, 0x20, +0x20, 0x30, 0x20, 0x34, 0x38, 0x20, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, +0x0a, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x39, 0x30, 0x20, 0x20, 0x30, 0x20, 0x31, 0x39, +0x20, 0x20, 0x30, 0x20, 0x39, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x39, 0x32, +0x20, 0x20, 0x30, 0x20, 0x37, 0x36, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x36, 0x37, 0x20, 0x20, 0x30, 0x20, 0x32, 0x39, +0x20, 0x0a, 0x35, 0x63, 0x20, 0x20, 0x31, 0x20, 0x32, 0x34, 0x20, 0x20, +0x31, 0x20, 0x31, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x61, 0x20, 0x20, +0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x38, 0x35, 0x20, 0x20, 0x30, 0x20, 0x35, +0x38, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x20, 0x39, 0x20, 0x20, 0x30, 0x20, 0x37, +0x37, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x39, 0x33, 0x20, 0x20, 0x34, 0x20, +0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x33, 0x39, 0x20, 0x20, 0x30, 0x20, 0x39, 0x34, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x34, 0x39, 0x20, 0x20, 0x30, 0x20, +0x38, 0x36, 0x20, 0x20, 0x61, 0x20, 0x20, 0x31, 0x20, 0x20, 0x36, 0x20, +0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x36, 0x38, 0x20, 0x0a, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x61, 0x30, 0x20, 0x20, 0x30, 0x20, 0x20, 0x61, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x61, 0x31, 0x20, 0x20, 0x30, +0x20, 0x31, 0x61, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x61, 0x32, 0x20, 0x20, 0x30, +0x20, 0x32, 0x61, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x39, 0x35, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x35, 0x39, 0x20, 0x31, +0x61, 0x20, 0x20, 0x31, 0x20, 0x20, 0x65, 0x20, 0x20, 0x31, 0x20, 0x20, +0x36, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x61, 0x33, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x33, 0x61, 0x20, 0x20, 0x30, 0x20, 0x38, 0x37, 0x20, 0x20, +0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x37, 0x38, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x61, 0x34, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x34, 0x61, 0x20, +0x20, 0x30, 0x20, 0x39, 0x36, 0x20, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, +0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x30, 0x20, 0x36, 0x39, 0x20, 0x20, 0x30, 0x20, 0x62, 0x30, 0x20, +0x20, 0x30, 0x20, 0x62, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x31, 0x62, +0x20, 0x20, 0x30, 0x20, 0x61, 0x35, 0x20, 0x20, 0x30, 0x20, 0x62, 0x32, +0x20, 0x20, 0x65, 0x20, 0x20, 0x31, 0x20, 0x20, 0x38, 0x20, 0x20, 0x31, +0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x35, 0x61, 0x20, 0x20, 0x30, 0x20, 0x32, 0x62, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x38, 0x38, +0x20, 0x20, 0x30, 0x20, 0x39, 0x37, 0x20, 0x0a, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x62, 0x33, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x37, 0x39, 0x20, 0x20, 0x30, 0x20, 0x33, +0x62, 0x20, 0x20, 0x38, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, +0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x36, +0x61, 0x20, 0x20, 0x30, 0x20, 0x62, 0x34, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x34, 0x62, 0x20, 0x0a, 0x20, 0x30, 0x20, +0x63, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x39, 0x38, 0x20, 0x20, 0x30, 0x20, +0x38, 0x39, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x31, 0x63, 0x20, 0x20, 0x30, 0x20, 0x62, 0x35, 0x20, 0x35, 0x30, 0x20, +0x20, 0x31, 0x20, 0x32, 0x32, 0x20, 0x20, 0x31, 0x20, 0x31, 0x30, 0x20, +0x20, 0x31, 0x20, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, 0x34, +0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x35, 0x62, 0x20, 0x20, 0x30, 0x20, 0x32, 0x63, 0x20, 0x20, 0x30, +0x20, 0x63, 0x32, 0x20, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, +0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x20, 0x62, 0x20, 0x20, 0x30, 0x20, 0x63, 0x30, 0x20, 0x20, 0x30, +0x20, 0x61, 0x36, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, +0x30, 0x20, 0x61, 0x37, 0x20, 0x20, 0x30, 0x20, 0x37, 0x61, 0x20, 0x20, +0x61, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x63, 0x33, 0x20, 0x20, +0x30, 0x20, 0x33, 0x63, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x20, 0x63, 0x20, 0x20, +0x30, 0x20, 0x39, 0x39, 0x20, 0x20, 0x30, 0x20, 0x62, 0x36, 0x20, 0x0a, +0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x30, 0x20, 0x36, 0x62, 0x20, 0x20, 0x30, 0x20, 0x63, 0x34, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x34, 0x63, 0x20, +0x20, 0x30, 0x20, 0x61, 0x38, 0x20, 0x31, 0x34, 0x20, 0x20, 0x31, 0x20, +0x20, 0x61, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x38, 0x61, 0x20, +0x0a, 0x20, 0x30, 0x20, 0x63, 0x35, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x64, 0x30, +0x20, 0x20, 0x30, 0x20, 0x35, 0x63, 0x20, 0x20, 0x30, 0x20, 0x64, 0x31, +0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x62, 0x37, 0x20, 0x20, 0x30, 0x20, 0x37, 0x62, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x31, 0x64, +0x20, 0x0a, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x20, +0x64, 0x20, 0x20, 0x30, 0x20, 0x32, 0x64, 0x20, 0x20, 0x63, 0x20, 0x20, +0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x64, 0x32, 0x20, 0x20, 0x30, 0x20, 0x64, +0x33, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x33, 0x64, 0x20, 0x20, 0x30, 0x20, 0x63, +0x36, 0x20, 0x0a, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x36, 0x63, 0x20, 0x20, 0x30, 0x20, 0x61, 0x39, 0x20, 0x20, 0x36, 0x20, +0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x39, 0x61, 0x20, 0x20, 0x30, 0x20, +0x62, 0x38, 0x20, 0x20, 0x30, 0x20, 0x64, 0x34, 0x20, 0x20, 0x34, 0x20, +0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x38, 0x62, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x34, 0x64, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x63, 0x37, 0x20, 0x20, 0x30, +0x20, 0x37, 0x63, 0x20, 0x34, 0x34, 0x20, 0x20, 0x31, 0x20, 0x32, 0x32, +0x20, 0x20, 0x31, 0x20, 0x31, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x61, +0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x64, 0x35, 0x20, 0x20, 0x30, +0x20, 0x35, 0x64, 0x20, 0x0a, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x65, 0x30, 0x20, 0x20, +0x30, 0x20, 0x20, 0x65, 0x20, 0x20, 0x30, 0x20, 0x65, 0x31, 0x20, 0x20, +0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x31, 0x65, 0x20, 0x20, 0x30, 0x20, 0x65, 0x32, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x61, 0x61, 0x20, 0x20, +0x30, 0x20, 0x32, 0x65, 0x20, 0x0a, 0x20, 0x38, 0x20, 0x20, 0x31, 0x20, +0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x30, 0x20, 0x62, 0x39, 0x20, 0x20, 0x30, 0x20, 0x39, 0x62, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x65, 0x33, 0x20, +0x20, 0x30, 0x20, 0x64, 0x36, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x36, 0x64, 0x20, +0x20, 0x30, 0x20, 0x33, 0x65, 0x20, 0x0a, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x63, 0x38, 0x20, 0x20, 0x30, 0x20, 0x38, 0x63, +0x20, 0x31, 0x30, 0x20, 0x20, 0x31, 0x20, 0x20, 0x38, 0x20, 0x20, 0x31, +0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x65, 0x34, 0x20, 0x20, 0x30, 0x20, 0x34, 0x65, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x64, 0x37, +0x20, 0x20, 0x30, 0x20, 0x37, 0x64, 0x20, 0x0a, 0x20, 0x34, 0x20, 0x20, +0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x65, +0x35, 0x20, 0x20, 0x30, 0x20, 0x62, 0x61, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x61, 0x62, 0x20, 0x20, 0x30, 0x20, 0x35, +0x65, 0x20, 0x20, 0x38, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, +0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x63, +0x39, 0x20, 0x20, 0x30, 0x20, 0x39, 0x63, 0x20, 0x0a, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x66, 0x31, 0x20, 0x20, 0x30, 0x20, +0x31, 0x66, 0x20, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, +0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x66, 0x30, 0x20, 0x20, 0x30, 0x20, 0x36, 0x65, 0x20, 0x20, 0x30, 0x20, +0x66, 0x32, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x32, 0x66, 0x20, 0x20, 0x30, 0x20, 0x65, 0x36, 0x20, 0x0a, 0x32, 0x36, +0x20, 0x20, 0x31, 0x20, 0x31, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x38, +0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x64, 0x38, 0x20, 0x20, 0x30, +0x20, 0x66, 0x33, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x33, 0x66, 0x20, 0x20, 0x30, 0x20, 0x66, 0x34, 0x20, 0x20, 0x36, +0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, +0x30, 0x20, 0x34, 0x66, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x38, 0x64, 0x20, 0x20, 0x30, 0x20, 0x64, 0x39, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x62, 0x62, 0x20, 0x20, +0x30, 0x20, 0x63, 0x61, 0x20, 0x20, 0x38, 0x20, 0x20, 0x31, 0x20, 0x20, +0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x61, 0x63, 0x20, 0x20, 0x30, 0x20, 0x65, 0x37, 0x20, 0x0a, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x37, 0x65, 0x20, +0x20, 0x30, 0x20, 0x66, 0x35, 0x20, 0x20, 0x38, 0x20, 0x20, 0x31, 0x20, +0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x30, 0x20, 0x39, 0x64, 0x20, 0x20, 0x30, 0x20, 0x35, 0x66, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x65, 0x38, 0x20, +0x20, 0x30, 0x20, 0x38, 0x65, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x0a, 0x20, 0x30, 0x20, 0x66, 0x36, 0x20, 0x20, 0x30, 0x20, 0x63, 0x62, +0x20, 0x32, 0x32, 0x20, 0x20, 0x31, 0x20, 0x31, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x61, 0x20, 0x20, 0x31, 0x20, 0x20, 0x36, 0x20, 0x20, 0x31, +0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x20, 0x66, 0x20, 0x20, 0x30, 0x20, 0x61, 0x65, +0x20, 0x20, 0x30, 0x20, 0x36, 0x66, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x0a, 0x20, 0x30, 0x20, 0x62, 0x63, 0x20, 0x20, 0x30, 0x20, 0x64, +0x61, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x61, 0x64, 0x20, 0x20, 0x30, 0x20, 0x66, +0x37, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x37, +0x66, 0x20, 0x20, 0x30, 0x20, 0x65, 0x39, 0x20, 0x20, 0x38, 0x20, 0x20, +0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x39, 0x65, 0x20, 0x20, 0x30, 0x20, +0x63, 0x63, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x66, 0x38, 0x20, 0x20, 0x30, 0x20, 0x38, 0x66, 0x20, 0x20, 0x34, 0x20, +0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x64, 0x62, 0x20, 0x20, 0x30, 0x20, 0x62, 0x64, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x65, 0x61, 0x20, 0x20, 0x30, 0x20, +0x66, 0x39, 0x20, 0x0a, 0x31, 0x30, 0x20, 0x20, 0x31, 0x20, 0x20, 0x38, +0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x39, 0x66, 0x20, 0x20, 0x30, +0x20, 0x64, 0x63, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x63, 0x64, 0x20, 0x20, 0x30, 0x20, 0x65, 0x62, 0x20, 0x20, 0x34, +0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x62, 0x65, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x66, 0x61, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x61, 0x66, 0x20, 0x20, +0x30, 0x20, 0x64, 0x64, 0x20, 0x20, 0x65, 0x20, 0x20, 0x31, 0x20, 0x20, +0x36, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x65, 0x63, 0x20, 0x20, +0x30, 0x20, 0x63, 0x65, 0x20, 0x20, 0x30, 0x20, 0x66, 0x62, 0x20, 0x20, +0x34, 0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x30, 0x20, 0x62, 0x66, 0x20, 0x20, 0x30, 0x20, 0x65, 0x64, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x64, 0x65, 0x20, +0x20, 0x30, 0x20, 0x66, 0x63, 0x20, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, +0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x30, 0x20, 0x63, 0x66, 0x20, 0x20, 0x30, 0x20, 0x66, 0x64, 0x20, +0x20, 0x30, 0x20, 0x65, 0x65, 0x20, 0x0a, 0x20, 0x34, 0x20, 0x20, 0x31, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x64, 0x66, +0x20, 0x20, 0x30, 0x20, 0x66, 0x65, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x65, 0x66, 0x20, 0x20, 0x30, 0x20, 0x66, 0x66, +0x20, 0x0a, 0x0a, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x31, 0x36, +0x20, 0x35, 0x31, 0x31, 0x20, 0x31, 0x36, 0x20, 0x31, 0x36, 0x20, 0x20, +0x31, 0x0a, 0x2e, 0x74, 0x72, 0x65, 0x65, 0x64, 0x61, 0x74, 0x61, 0x0a, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x20, 0x30, 0x20, +0x20, 0x36, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x30, 0x20, 0x31, 0x30, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x30, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x31, 0x31, 0x20, +0x32, 0x61, 0x20, 0x20, 0x31, 0x20, 0x20, 0x38, 0x20, 0x20, 0x31, 0x20, +0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x0a, 0x20, 0x30, 0x20, 0x32, 0x30, 0x20, 0x20, 0x30, 0x20, 0x20, 0x32, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x32, 0x31, +0x20, 0x20, 0x30, 0x20, 0x31, 0x32, 0x20, 0x20, 0x61, 0x20, 0x20, 0x31, +0x20, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x32, 0x32, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x33, 0x30, 0x20, 0x20, 0x30, 0x20, 0x20, 0x33, +0x20, 0x0a, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x33, +0x31, 0x20, 0x20, 0x30, 0x20, 0x31, 0x33, 0x20, 0x20, 0x61, 0x20, 0x20, +0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x33, 0x32, 0x20, 0x20, 0x30, 0x20, 0x32, +0x33, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x34, 0x30, 0x20, 0x20, 0x30, 0x20, 0x20, +0x34, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x34, 0x31, 0x20, 0x20, 0x36, 0x20, +0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x31, 0x34, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x33, 0x33, 0x20, 0x20, 0x30, 0x20, 0x34, 0x32, 0x20, 0x20, 0x34, 0x20, +0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x32, 0x34, 0x20, 0x20, 0x30, 0x20, 0x35, 0x30, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x34, 0x33, 0x20, 0x20, 0x30, +0x20, 0x33, 0x34, 0x20, 0x38, 0x61, 0x20, 0x20, 0x31, 0x20, 0x32, 0x38, +0x20, 0x20, 0x31, 0x20, 0x31, 0x30, 0x20, 0x20, 0x31, 0x20, 0x20, 0x36, +0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x20, 0x35, 0x20, 0x20, 0x30, +0x20, 0x31, 0x35, 0x20, 0x20, 0x30, 0x20, 0x35, 0x31, 0x20, 0x20, 0x34, +0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x35, 0x32, 0x20, 0x20, 0x30, 0x20, 0x32, 0x35, 0x20, 0x20, +0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x34, 0x34, 0x20, 0x20, 0x30, 0x20, 0x33, 0x35, 0x20, 0x20, +0x30, 0x20, 0x35, 0x33, 0x20, 0x20, 0x61, 0x20, 0x20, 0x31, 0x20, 0x20, +0x36, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x36, 0x30, 0x20, +0x20, 0x30, 0x20, 0x20, 0x36, 0x20, 0x20, 0x30, 0x20, 0x36, 0x31, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x31, 0x36, 0x20, +0x20, 0x30, 0x20, 0x36, 0x32, 0x20, 0x20, 0x38, 0x20, 0x20, 0x31, 0x20, +0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x30, 0x20, 0x32, 0x36, 0x20, 0x20, 0x30, 0x20, 0x35, 0x34, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x34, 0x35, +0x20, 0x20, 0x30, 0x20, 0x36, 0x33, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x33, 0x36, +0x20, 0x20, 0x30, 0x20, 0x37, 0x30, 0x20, 0x20, 0x30, 0x20, 0x37, 0x31, +0x20, 0x32, 0x38, 0x20, 0x20, 0x31, 0x20, 0x31, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x38, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x31, 0x37, 0x20, 0x0a, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x20, 0x37, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x35, 0x35, 0x20, 0x20, 0x30, 0x20, 0x36, +0x34, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x37, 0x32, 0x20, 0x20, 0x30, 0x20, 0x32, +0x37, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x34, 0x36, 0x20, 0x0a, 0x20, 0x30, 0x20, +0x36, 0x35, 0x20, 0x20, 0x30, 0x20, 0x37, 0x33, 0x20, 0x20, 0x61, 0x20, +0x20, 0x31, 0x20, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x33, 0x37, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x35, 0x36, 0x20, 0x20, 0x30, 0x20, +0x20, 0x38, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x38, 0x30, 0x20, 0x20, 0x30, 0x20, 0x38, 0x31, 0x20, 0x0a, 0x20, 0x36, +0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x31, 0x38, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x37, 0x34, 0x20, 0x20, 0x30, 0x20, 0x34, 0x37, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x38, 0x32, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x32, 0x38, 0x20, 0x20, 0x30, +0x20, 0x36, 0x36, 0x20, 0x31, 0x38, 0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, +0x65, 0x20, 0x20, 0x31, 0x20, 0x20, 0x38, 0x20, 0x20, 0x31, 0x20, 0x20, +0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x38, 0x33, 0x20, 0x20, 0x30, 0x20, 0x33, 0x38, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x37, 0x35, 0x20, 0x20, +0x30, 0x20, 0x38, 0x34, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x34, 0x38, 0x20, 0x0a, +0x20, 0x30, 0x20, 0x39, 0x30, 0x20, 0x20, 0x30, 0x20, 0x39, 0x31, 0x20, +0x20, 0x36, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x30, 0x20, 0x31, 0x39, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x30, 0x20, 0x20, 0x39, 0x20, 0x20, 0x30, 0x20, 0x37, 0x36, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x39, 0x32, 0x20, +0x20, 0x30, 0x20, 0x32, 0x39, 0x20, 0x20, 0x65, 0x20, 0x20, 0x31, 0x20, +0x0a, 0x20, 0x38, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x38, 0x35, +0x20, 0x20, 0x30, 0x20, 0x35, 0x38, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x39, 0x33, 0x20, 0x20, 0x30, 0x20, 0x33, 0x39, +0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x61, 0x30, 0x20, 0x20, 0x30, 0x20, 0x20, 0x61, +0x20, 0x0a, 0x20, 0x30, 0x20, 0x31, 0x61, 0x20, 0x20, 0x38, 0x20, 0x20, +0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x61, +0x32, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x36, +0x37, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x35, +0x37, 0x20, 0x20, 0x30, 0x20, 0x34, 0x39, 0x20, 0x20, 0x36, 0x20, 0x20, +0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x39, +0x34, 0x20, 0x0a, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x37, 0x37, 0x20, 0x20, 0x30, 0x20, 0x38, 0x36, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x61, 0x31, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x36, 0x38, 0x20, 0x20, 0x30, 0x20, +0x39, 0x35, 0x20, 0x64, 0x63, 0x20, 0x20, 0x31, 0x20, 0x37, 0x65, 0x20, +0x20, 0x31, 0x20, 0x33, 0x32, 0x20, 0x20, 0x31, 0x20, 0x31, 0x61, 0x20, +0x20, 0x31, 0x20, 0x0a, 0x20, 0x63, 0x20, 0x20, 0x31, 0x20, 0x20, 0x36, +0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x32, 0x61, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x35, 0x39, 0x20, 0x20, 0x30, 0x20, 0x33, 0x61, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x61, 0x33, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x38, 0x37, 0x20, 0x20, 0x30, +0x20, 0x37, 0x38, 0x20, 0x0a, 0x20, 0x38, 0x20, 0x20, 0x31, 0x20, 0x20, +0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x61, 0x34, 0x20, 0x20, 0x30, 0x20, 0x34, 0x61, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x39, 0x36, 0x20, 0x20, +0x30, 0x20, 0x36, 0x39, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x62, 0x30, 0x20, 0x20, +0x30, 0x20, 0x20, 0x62, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x62, 0x31, 0x20, +0x20, 0x61, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x31, 0x62, 0x20, +0x20, 0x30, 0x20, 0x62, 0x32, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x30, 0x20, 0x32, 0x62, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x30, 0x20, 0x61, 0x35, 0x20, 0x20, 0x30, 0x20, 0x35, 0x61, 0x20, +0x20, 0x36, 0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x62, 0x33, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x61, 0x36, 0x20, 0x20, 0x30, 0x20, 0x36, 0x61, +0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x62, 0x34, 0x20, 0x20, 0x30, 0x20, 0x34, 0x62, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x20, 0x63, +0x20, 0x20, 0x30, 0x20, 0x63, 0x31, 0x20, 0x0a, 0x31, 0x65, 0x20, 0x20, +0x31, 0x20, 0x20, 0x65, 0x20, 0x20, 0x31, 0x20, 0x20, 0x36, 0x20, 0x20, +0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x62, 0x35, 0x20, 0x20, 0x30, 0x20, 0x63, +0x32, 0x20, 0x20, 0x30, 0x20, 0x32, 0x63, 0x20, 0x20, 0x34, 0x20, 0x20, +0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x61, +0x37, 0x20, 0x20, 0x30, 0x20, 0x63, 0x33, 0x20, 0x0a, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x36, 0x62, 0x20, 0x20, 0x30, 0x20, +0x63, 0x34, 0x20, 0x20, 0x38, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x31, 0x64, 0x20, 0x20, 0x34, 0x20, +0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x38, 0x38, 0x20, 0x20, 0x30, 0x20, 0x39, 0x37, 0x20, 0x20, 0x30, 0x20, +0x33, 0x62, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x64, 0x31, 0x20, 0x20, 0x30, +0x20, 0x64, 0x32, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x32, 0x64, 0x20, 0x20, 0x30, 0x20, 0x64, 0x33, 0x20, 0x31, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, +0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x31, 0x65, 0x20, 0x20, 0x30, 0x20, 0x32, 0x65, 0x20, 0x0a, 0x20, +0x30, 0x20, 0x65, 0x32, 0x20, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, 0x20, +0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x37, 0x39, 0x20, 0x20, 0x30, 0x20, 0x39, 0x38, 0x20, 0x20, +0x30, 0x20, 0x63, 0x30, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x31, 0x63, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x38, 0x39, 0x20, 0x20, 0x30, 0x20, 0x35, 0x62, 0x20, 0x0a, +0x20, 0x65, 0x20, 0x20, 0x31, 0x20, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x33, 0x63, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x37, 0x61, 0x20, +0x20, 0x30, 0x20, 0x62, 0x36, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x34, 0x63, 0x20, +0x20, 0x30, 0x20, 0x39, 0x39, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x0a, 0x20, 0x30, 0x20, 0x61, 0x38, 0x20, 0x20, 0x30, 0x20, 0x38, 0x61, +0x20, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x20, 0x64, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x63, 0x35, 0x20, 0x20, 0x30, 0x20, 0x35, 0x63, +0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x33, 0x64, 0x20, 0x20, 0x30, 0x20, 0x63, 0x36, +0x20, 0x0a, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x36, +0x63, 0x20, 0x20, 0x30, 0x20, 0x39, 0x61, 0x20, 0x35, 0x38, 0x20, 0x20, +0x31, 0x20, 0x35, 0x36, 0x20, 0x20, 0x31, 0x20, 0x32, 0x34, 0x20, 0x20, +0x31, 0x20, 0x31, 0x30, 0x20, 0x20, 0x31, 0x20, 0x20, 0x38, 0x20, 0x20, +0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x38, 0x62, 0x20, 0x20, 0x30, 0x20, 0x34, +0x64, 0x20, 0x0a, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x63, 0x37, 0x20, 0x20, 0x30, 0x20, 0x37, 0x63, 0x20, 0x20, 0x34, 0x20, +0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x64, 0x35, 0x20, 0x20, 0x30, 0x20, 0x35, 0x64, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x65, 0x30, 0x20, 0x20, 0x30, 0x20, +0x20, 0x65, 0x20, 0x20, 0x38, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x65, 0x33, 0x20, 0x20, 0x34, +0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x64, 0x30, 0x20, 0x20, 0x30, 0x20, 0x62, 0x37, 0x20, 0x20, 0x30, +0x20, 0x37, 0x62, 0x20, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, +0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x61, 0x39, 0x20, 0x20, 0x30, 0x20, 0x62, 0x38, 0x20, 0x20, 0x30, +0x20, 0x64, 0x34, 0x20, 0x0a, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x65, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x61, 0x61, 0x20, 0x20, 0x30, 0x20, 0x62, 0x39, 0x20, 0x31, +0x38, 0x20, 0x20, 0x31, 0x20, 0x20, 0x61, 0x20, 0x20, 0x31, 0x20, 0x20, +0x36, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x39, 0x62, 0x20, 0x20, +0x30, 0x20, 0x64, 0x36, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x36, 0x64, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x33, 0x65, 0x20, +0x20, 0x30, 0x20, 0x63, 0x38, 0x20, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, +0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x30, 0x20, 0x38, 0x63, 0x20, 0x20, 0x30, 0x20, 0x65, 0x34, 0x20, +0x20, 0x30, 0x20, 0x34, 0x65, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x64, 0x37, +0x20, 0x20, 0x30, 0x20, 0x65, 0x35, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x62, 0x61, 0x20, 0x20, 0x30, 0x20, 0x61, 0x62, +0x20, 0x20, 0x63, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x39, 0x63, +0x20, 0x20, 0x30, 0x20, 0x65, 0x36, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x36, +0x65, 0x20, 0x20, 0x30, 0x20, 0x64, 0x38, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x38, 0x64, 0x20, 0x20, 0x30, 0x20, 0x62, +0x62, 0x20, 0x20, 0x38, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, +0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x65, +0x37, 0x20, 0x20, 0x30, 0x20, 0x39, 0x64, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x65, 0x38, 0x20, 0x0a, 0x20, 0x30, 0x20, +0x38, 0x65, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x63, 0x62, 0x20, 0x20, 0x30, 0x20, +0x62, 0x63, 0x20, 0x20, 0x30, 0x20, 0x39, 0x65, 0x20, 0x20, 0x30, 0x20, +0x66, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x31, 0x66, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x20, 0x66, 0x20, 0x20, 0x30, 0x20, 0x32, 0x66, 0x20, 0x0a, 0x34, 0x32, +0x20, 0x20, 0x31, 0x20, 0x33, 0x38, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x66, 0x32, 0x20, 0x33, 0x34, +0x20, 0x20, 0x31, 0x20, 0x33, 0x32, 0x20, 0x20, 0x31, 0x20, 0x31, 0x34, +0x20, 0x20, 0x31, 0x20, 0x20, 0x38, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x62, 0x64, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x35, 0x65, 0x20, 0x0a, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x37, 0x64, 0x20, 0x20, +0x30, 0x20, 0x63, 0x39, 0x20, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x63, 0x61, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x61, 0x63, 0x20, 0x20, +0x30, 0x20, 0x37, 0x65, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x64, 0x61, 0x20, 0x0a, +0x20, 0x30, 0x20, 0x61, 0x64, 0x20, 0x20, 0x30, 0x20, 0x63, 0x63, 0x20, +0x20, 0x61, 0x20, 0x20, 0x31, 0x20, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x61, 0x65, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x64, 0x62, 0x20, +0x20, 0x30, 0x20, 0x64, 0x63, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x30, 0x20, 0x63, 0x64, 0x20, 0x20, 0x30, 0x20, 0x62, 0x65, 0x20, +0x0a, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x65, 0x62, +0x20, 0x20, 0x30, 0x20, 0x65, 0x64, 0x20, 0x20, 0x30, 0x20, 0x65, 0x65, +0x20, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x64, 0x39, +0x20, 0x20, 0x30, 0x20, 0x65, 0x61, 0x20, 0x20, 0x30, 0x20, 0x65, 0x39, +0x20, 0x0a, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x64, +0x65, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x64, 0x64, 0x20, 0x20, 0x30, 0x20, 0x65, +0x63, 0x20, 0x20, 0x30, 0x20, 0x63, 0x65, 0x20, 0x20, 0x30, 0x20, 0x33, +0x66, 0x20, 0x20, 0x30, 0x20, 0x66, 0x30, 0x20, 0x20, 0x34, 0x20, 0x20, +0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x66, +0x33, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x66, 0x34, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x34, 0x66, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x66, 0x35, 0x20, 0x20, 0x30, 0x20, +0x35, 0x66, 0x20, 0x20, 0x61, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x66, 0x66, 0x20, 0x20, 0x34, 0x20, +0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x66, 0x36, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x36, 0x66, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x66, 0x37, 0x20, 0x20, 0x30, +0x20, 0x37, 0x66, 0x20, 0x20, 0x63, 0x20, 0x20, 0x31, 0x20, 0x20, 0x36, +0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x38, 0x66, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x66, 0x38, 0x20, 0x20, 0x30, 0x20, 0x66, 0x39, 0x20, 0x20, 0x34, +0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x39, 0x66, 0x20, 0x20, 0x30, 0x20, 0x66, 0x61, 0x20, 0x20, +0x30, 0x20, 0x61, 0x66, 0x20, 0x20, 0x38, 0x20, 0x20, 0x31, 0x20, 0x20, +0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x66, 0x62, 0x20, 0x20, 0x30, 0x20, 0x62, 0x66, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x66, 0x63, 0x20, 0x20, +0x30, 0x20, 0x63, 0x66, 0x20, 0x0a, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x66, 0x64, 0x20, +0x20, 0x30, 0x20, 0x64, 0x66, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x30, 0x20, 0x66, 0x65, 0x20, 0x20, 0x30, 0x20, 0x65, 0x66, 0x20, +0x0a, 0x0a, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x31, 0x37, 0x20, +0x35, 0x31, 0x31, 0x20, 0x31, 0x36, 0x20, 0x31, 0x36, 0x20, 0x20, 0x32, +0x0a, 0x2e, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, +0x31, 0x36, 0x0a, 0x0a, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x31, +0x38, 0x20, 0x35, 0x31, 0x31, 0x20, 0x31, 0x36, 0x20, 0x31, 0x36, 0x20, +0x20, 0x33, 0x0a, 0x2e, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, +0x65, 0x20, 0x31, 0x36, 0x0a, 0x0a, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, +0x20, 0x31, 0x39, 0x20, 0x35, 0x31, 0x31, 0x20, 0x31, 0x36, 0x20, 0x31, +0x36, 0x20, 0x20, 0x34, 0x0a, 0x2e, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, +0x6e, 0x63, 0x65, 0x20, 0x31, 0x36, 0x0a, 0x0a, 0x2e, 0x74, 0x61, 0x62, +0x6c, 0x65, 0x20, 0x32, 0x30, 0x20, 0x35, 0x31, 0x31, 0x20, 0x31, 0x36, +0x20, 0x31, 0x36, 0x20, 0x20, 0x36, 0x0a, 0x2e, 0x72, 0x65, 0x66, 0x65, +0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x31, 0x36, 0x0a, 0x0a, 0x2e, 0x74, +0x61, 0x62, 0x6c, 0x65, 0x20, 0x32, 0x31, 0x20, 0x35, 0x31, 0x31, 0x20, +0x31, 0x36, 0x20, 0x31, 0x36, 0x20, 0x20, 0x38, 0x0a, 0x2e, 0x72, 0x65, +0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x31, 0x36, 0x0a, 0x0a, +0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x32, 0x32, 0x20, 0x35, 0x31, +0x31, 0x20, 0x31, 0x36, 0x20, 0x31, 0x36, 0x20, 0x31, 0x30, 0x0a, 0x2e, +0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x31, 0x36, +0x0a, 0x0a, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x32, 0x33, 0x20, +0x35, 0x31, 0x31, 0x20, 0x31, 0x36, 0x20, 0x31, 0x36, 0x20, 0x31, 0x33, +0x0a, 0x2e, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, +0x31, 0x36, 0x0a, 0x0a, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x32, +0x34, 0x20, 0x35, 0x31, 0x32, 0x20, 0x31, 0x36, 0x20, 0x31, 0x36, 0x20, +0x20, 0x34, 0x0a, 0x2e, 0x74, 0x72, 0x65, 0x65, 0x64, 0x61, 0x74, 0x61, +0x0a, 0x33, 0x63, 0x20, 0x20, 0x31, 0x20, 0x20, 0x38, 0x20, 0x20, 0x31, +0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x20, 0x30, 0x20, 0x20, 0x30, 0x20, 0x31, 0x30, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x31, 0x31, 0x20, 0x20, 0x65, 0x20, 0x20, 0x31, +0x20, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, +0x20, 0x0a, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x32, +0x30, 0x20, 0x20, 0x30, 0x20, 0x20, 0x32, 0x20, 0x20, 0x30, 0x20, 0x32, +0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x31, +0x32, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x32, +0x32, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x33, +0x30, 0x20, 0x20, 0x30, 0x20, 0x20, 0x33, 0x20, 0x20, 0x65, 0x20, 0x20, +0x31, 0x20, 0x0a, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x33, 0x31, 0x20, 0x20, 0x30, 0x20, +0x31, 0x33, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x33, 0x32, 0x20, 0x20, 0x30, 0x20, +0x32, 0x33, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x34, 0x30, 0x20, 0x20, 0x30, 0x20, +0x20, 0x34, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x34, 0x31, 0x20, 0x20, 0x38, +0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x31, 0x34, 0x20, 0x20, 0x30, +0x20, 0x33, 0x33, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x34, 0x32, 0x20, 0x20, 0x30, 0x20, 0x32, 0x34, 0x20, 0x20, 0x36, +0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x34, 0x33, 0x20, 0x20, +0x30, 0x20, 0x33, 0x34, 0x20, 0x20, 0x30, 0x20, 0x35, 0x31, 0x20, 0x20, +0x36, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x35, 0x30, 0x20, 0x20, +0x30, 0x20, 0x20, 0x35, 0x20, 0x20, 0x30, 0x20, 0x31, 0x35, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x35, 0x32, 0x20, 0x20, +0x30, 0x20, 0x32, 0x35, 0x20, 0x0a, 0x66, 0x61, 0x20, 0x20, 0x31, 0x20, +0x36, 0x32, 0x20, 0x20, 0x31, 0x20, 0x32, 0x32, 0x20, 0x20, 0x31, 0x20, +0x31, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x61, 0x20, 0x20, 0x31, 0x20, +0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x30, 0x20, 0x34, 0x34, 0x20, 0x20, 0x30, 0x20, 0x35, 0x33, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x33, 0x35, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x36, 0x30, +0x20, 0x20, 0x30, 0x20, 0x20, 0x36, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x36, 0x31, +0x20, 0x20, 0x30, 0x20, 0x31, 0x36, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x36, 0x32, 0x20, 0x20, 0x30, 0x20, 0x32, 0x36, +0x20, 0x20, 0x38, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x35, +0x34, 0x20, 0x20, 0x30, 0x20, 0x34, 0x35, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x36, 0x33, 0x20, 0x20, 0x30, 0x20, 0x33, +0x36, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x37, 0x31, 0x20, 0x20, 0x30, 0x20, 0x35, +0x35, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x36, +0x34, 0x20, 0x20, 0x30, 0x20, 0x34, 0x36, 0x20, 0x0a, 0x32, 0x30, 0x20, +0x20, 0x31, 0x20, 0x20, 0x65, 0x20, 0x20, 0x31, 0x20, 0x20, 0x36, 0x20, +0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x37, 0x32, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x32, 0x37, 0x20, 0x20, 0x30, 0x20, 0x33, 0x37, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x37, 0x33, 0x20, 0x20, 0x34, 0x20, +0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, 0x30, +0x20, 0x37, 0x30, 0x20, 0x20, 0x30, 0x20, 0x20, 0x37, 0x20, 0x20, 0x30, +0x20, 0x31, 0x37, 0x20, 0x20, 0x61, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, +0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x36, 0x35, 0x20, 0x20, 0x30, 0x20, 0x35, 0x36, 0x20, 0x20, 0x34, +0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x38, 0x30, 0x20, 0x20, 0x30, 0x20, 0x20, 0x38, 0x20, 0x0a, 0x20, +0x30, 0x20, 0x38, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x37, 0x34, 0x20, 0x20, +0x30, 0x20, 0x34, 0x37, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x31, 0x38, 0x20, 0x20, 0x30, 0x20, 0x38, 0x32, 0x20, 0x31, +0x30, 0x20, 0x20, 0x31, 0x20, 0x20, 0x38, 0x20, 0x20, 0x31, 0x20, 0x20, +0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x0a, +0x20, 0x30, 0x20, 0x32, 0x38, 0x20, 0x20, 0x30, 0x20, 0x36, 0x36, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x38, 0x33, 0x20, +0x20, 0x30, 0x20, 0x33, 0x38, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x37, 0x35, 0x20, +0x20, 0x30, 0x20, 0x35, 0x37, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x30, 0x20, 0x38, 0x34, 0x20, 0x20, 0x30, 0x20, 0x34, 0x38, 0x20, +0x0a, 0x20, 0x38, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x39, 0x31, +0x20, 0x20, 0x30, 0x20, 0x31, 0x39, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x39, 0x32, 0x20, 0x20, 0x30, 0x20, 0x37, 0x36, +0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x36, 0x37, 0x20, 0x20, 0x30, 0x20, 0x32, 0x39, +0x20, 0x0a, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x38, +0x35, 0x20, 0x20, 0x30, 0x20, 0x35, 0x38, 0x20, 0x35, 0x63, 0x20, 0x20, +0x31, 0x20, 0x32, 0x32, 0x20, 0x20, 0x31, 0x20, 0x31, 0x30, 0x20, 0x20, +0x31, 0x20, 0x20, 0x38, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, +0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x39, +0x33, 0x20, 0x20, 0x30, 0x20, 0x33, 0x39, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x39, 0x34, 0x20, 0x20, 0x30, 0x20, +0x34, 0x39, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x37, 0x37, 0x20, 0x20, 0x30, 0x20, +0x38, 0x36, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x36, 0x38, 0x20, 0x20, 0x30, 0x20, 0x61, 0x31, 0x20, 0x20, 0x38, 0x20, +0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x61, 0x32, 0x20, 0x20, 0x30, +0x20, 0x32, 0x61, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x39, 0x35, 0x20, 0x20, 0x30, 0x20, 0x35, 0x39, 0x20, 0x20, 0x34, +0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x61, 0x33, 0x20, 0x20, 0x30, 0x20, 0x33, 0x61, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x38, 0x37, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x37, 0x38, 0x20, 0x20, +0x30, 0x20, 0x34, 0x61, 0x20, 0x31, 0x36, 0x20, 0x20, 0x31, 0x20, 0x20, +0x63, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x61, 0x34, 0x20, 0x20, +0x30, 0x20, 0x39, 0x36, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x36, 0x39, 0x20, 0x20, +0x30, 0x20, 0x62, 0x31, 0x20, 0x0a, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x30, 0x20, 0x31, 0x62, 0x20, 0x20, 0x30, 0x20, 0x61, 0x35, 0x20, +0x20, 0x36, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x30, 0x20, 0x62, 0x32, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x30, 0x20, 0x35, 0x61, 0x20, 0x20, 0x30, 0x20, 0x32, 0x62, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x38, 0x38, 0x20, +0x20, 0x30, 0x20, 0x62, 0x33, 0x20, 0x0a, 0x31, 0x30, 0x20, 0x20, 0x31, +0x20, 0x20, 0x61, 0x20, 0x20, 0x31, 0x20, 0x20, 0x36, 0x20, 0x20, 0x31, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x39, 0x30, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x20, 0x39, +0x20, 0x20, 0x30, 0x20, 0x61, 0x30, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x39, 0x37, 0x20, 0x20, 0x30, 0x20, 0x37, 0x39, +0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x61, 0x36, 0x20, 0x20, 0x30, 0x20, 0x36, +0x61, 0x20, 0x20, 0x30, 0x20, 0x62, 0x34, 0x20, 0x20, 0x63, 0x20, 0x20, +0x31, 0x20, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x31, 0x61, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x20, 0x61, 0x20, 0x20, 0x30, 0x20, 0x62, +0x30, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, 0x30, 0x20, +0x33, 0x62, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x20, 0x62, 0x20, 0x20, 0x30, 0x20, 0x63, 0x30, 0x20, 0x20, 0x34, 0x20, +0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x34, 0x62, 0x20, 0x20, 0x30, 0x20, 0x63, 0x31, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x39, 0x38, 0x20, 0x20, 0x30, 0x20, +0x38, 0x39, 0x20, 0x34, 0x33, 0x20, 0x20, 0x31, 0x20, 0x0a, 0x32, 0x32, +0x20, 0x20, 0x31, 0x20, 0x31, 0x30, 0x20, 0x20, 0x31, 0x20, 0x20, 0x38, +0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x31, 0x63, 0x20, 0x20, 0x30, +0x20, 0x62, 0x35, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x35, 0x62, 0x20, 0x20, 0x30, 0x20, 0x63, 0x32, 0x20, 0x20, 0x34, +0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, +0x30, 0x20, 0x32, 0x63, 0x20, 0x20, 0x30, 0x20, 0x61, 0x37, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x37, 0x61, 0x20, 0x20, +0x30, 0x20, 0x63, 0x33, 0x20, 0x20, 0x61, 0x20, 0x20, 0x31, 0x20, 0x20, +0x36, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x33, 0x63, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x20, 0x63, 0x20, 0x20, 0x30, 0x20, 0x64, 0x30, 0x20, 0x0a, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x62, 0x36, 0x20, +0x20, 0x30, 0x20, 0x36, 0x62, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x63, 0x34, 0x20, +0x20, 0x30, 0x20, 0x34, 0x63, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x30, 0x20, 0x39, 0x39, 0x20, 0x20, 0x30, 0x20, 0x61, 0x38, 0x20, +0x31, 0x30, 0x20, 0x20, 0x31, 0x20, 0x20, 0x38, 0x20, 0x20, 0x31, 0x20, +0x0a, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x38, 0x61, 0x20, 0x20, 0x30, 0x20, 0x63, 0x35, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x35, 0x63, +0x20, 0x20, 0x30, 0x20, 0x64, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x62, 0x37, +0x20, 0x20, 0x30, 0x20, 0x37, 0x62, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x0a, 0x20, 0x30, 0x20, 0x31, 0x64, 0x20, 0x20, 0x30, 0x20, 0x64, +0x32, 0x20, 0x20, 0x39, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, +0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x32, +0x64, 0x20, 0x20, 0x30, 0x20, 0x64, 0x33, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x33, 0x64, 0x20, 0x20, 0x30, 0x20, 0x63, +0x36, 0x20, 0x35, 0x35, 0x20, 0x66, 0x61, 0x20, 0x20, 0x34, 0x20, 0x20, +0x31, 0x20, 0x0a, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x36, 0x63, 0x20, 0x20, 0x30, 0x20, 0x61, 0x39, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x39, 0x61, 0x20, 0x20, 0x30, 0x20, +0x64, 0x34, 0x20, 0x32, 0x30, 0x20, 0x20, 0x31, 0x20, 0x31, 0x30, 0x20, +0x20, 0x31, 0x20, 0x20, 0x38, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, +0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x62, 0x38, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x38, 0x62, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x34, 0x64, 0x20, 0x20, 0x30, +0x20, 0x63, 0x37, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x37, 0x63, 0x20, 0x20, 0x30, +0x20, 0x64, 0x35, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x35, 0x64, 0x20, 0x20, 0x30, 0x20, 0x65, 0x31, 0x20, 0x20, 0x38, +0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x31, 0x65, 0x20, 0x20, +0x30, 0x20, 0x65, 0x32, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x61, 0x61, 0x20, 0x20, 0x30, 0x20, 0x62, 0x39, 0x20, 0x20, +0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x39, 0x62, 0x20, 0x20, 0x30, 0x20, 0x65, 0x33, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x64, 0x36, 0x20, +0x20, 0x30, 0x20, 0x36, 0x64, 0x20, 0x31, 0x34, 0x20, 0x20, 0x31, 0x20, +0x20, 0x61, 0x20, 0x20, 0x31, 0x20, 0x20, 0x36, 0x20, 0x20, 0x31, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x33, 0x65, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x32, 0x65, 0x20, +0x20, 0x30, 0x20, 0x34, 0x65, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x30, 0x20, 0x63, 0x38, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x38, 0x63, +0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x65, 0x34, 0x20, 0x20, 0x30, 0x20, 0x64, 0x37, +0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x37, 0x64, 0x20, 0x20, 0x30, 0x20, 0x61, 0x62, +0x20, 0x20, 0x30, 0x20, 0x65, 0x35, 0x20, 0x20, 0x61, 0x20, 0x20, 0x31, +0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x62, 0x61, 0x20, 0x20, 0x30, 0x20, 0x35, +0x65, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x63, +0x39, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x39, +0x63, 0x20, 0x20, 0x30, 0x20, 0x36, 0x65, 0x20, 0x20, 0x38, 0x20, 0x20, +0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x65, +0x36, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, 0x30, 0x20, +0x20, 0x64, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x65, 0x30, 0x20, 0x20, 0x30, 0x20, 0x20, 0x65, 0x20, 0x20, 0x34, 0x20, +0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x64, 0x38, 0x20, 0x20, 0x30, 0x20, 0x38, 0x64, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x62, 0x62, 0x20, 0x20, 0x30, 0x20, +0x63, 0x61, 0x20, 0x34, 0x61, 0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x66, 0x66, 0x20, 0x34, 0x30, +0x20, 0x20, 0x31, 0x20, 0x33, 0x61, 0x20, 0x20, 0x31, 0x20, 0x32, 0x30, +0x20, 0x20, 0x31, 0x20, 0x31, 0x30, 0x20, 0x20, 0x31, 0x20, 0x20, 0x38, +0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x61, 0x63, 0x20, 0x20, 0x30, +0x20, 0x65, 0x37, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, +0x30, 0x20, 0x37, 0x65, 0x20, 0x20, 0x30, 0x20, 0x64, 0x39, 0x20, 0x20, +0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x39, 0x64, 0x20, 0x20, 0x30, 0x20, 0x65, 0x38, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x38, 0x65, 0x20, 0x20, +0x30, 0x20, 0x63, 0x62, 0x20, 0x20, 0x38, 0x20, 0x20, 0x31, 0x20, 0x20, +0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x0a, +0x20, 0x30, 0x20, 0x62, 0x63, 0x20, 0x20, 0x30, 0x20, 0x64, 0x61, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x61, 0x64, 0x20, +0x20, 0x30, 0x20, 0x65, 0x39, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x39, 0x65, 0x20, +0x20, 0x30, 0x20, 0x63, 0x63, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x30, 0x20, 0x64, 0x62, 0x20, 0x20, 0x30, 0x20, 0x62, 0x64, 0x20, +0x0a, 0x31, 0x30, 0x20, 0x20, 0x31, 0x20, 0x20, 0x38, 0x20, 0x20, 0x31, +0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x65, 0x61, 0x20, 0x20, 0x30, 0x20, 0x61, 0x65, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x64, 0x63, +0x20, 0x20, 0x30, 0x20, 0x63, 0x64, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x65, 0x62, +0x20, 0x0a, 0x20, 0x30, 0x20, 0x62, 0x65, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x64, 0x64, 0x20, 0x20, 0x30, 0x20, 0x65, +0x63, 0x20, 0x20, 0x38, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, +0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x63, +0x65, 0x20, 0x20, 0x30, 0x20, 0x65, 0x64, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x64, 0x65, 0x20, 0x20, 0x30, 0x20, 0x65, +0x65, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x20, 0x66, 0x20, 0x20, 0x34, 0x20, +0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x66, 0x30, 0x20, 0x20, 0x30, 0x20, 0x31, 0x66, 0x20, 0x20, 0x30, 0x20, +0x66, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x66, 0x32, 0x20, 0x20, 0x30, 0x20, +0x32, 0x66, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x66, 0x33, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x33, 0x66, 0x20, 0x31, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x38, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, +0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x66, 0x34, 0x20, 0x20, 0x30, 0x20, 0x34, 0x66, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x66, 0x35, 0x20, 0x20, 0x30, +0x20, 0x35, 0x66, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x66, 0x36, 0x20, 0x20, +0x30, 0x20, 0x36, 0x66, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x66, 0x37, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x37, 0x66, 0x20, 0x20, 0x30, 0x20, 0x38, 0x66, 0x20, 0x20, +0x61, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x66, 0x38, 0x20, 0x20, +0x30, 0x20, 0x66, 0x39, 0x20, 0x0a, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x39, 0x66, 0x20, +0x20, 0x30, 0x20, 0x61, 0x66, 0x20, 0x20, 0x30, 0x20, 0x66, 0x61, 0x20, +0x20, 0x38, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, +0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x66, 0x62, 0x20, +0x20, 0x30, 0x20, 0x62, 0x66, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, +0x20, 0x30, 0x20, 0x66, 0x63, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x63, 0x66, +0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, +0x20, 0x20, 0x30, 0x20, 0x66, 0x64, 0x20, 0x20, 0x30, 0x20, 0x64, 0x66, +0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x66, 0x65, +0x20, 0x20, 0x30, 0x20, 0x65, 0x66, 0x20, 0x0a, 0x0a, 0x2e, 0x74, 0x61, +0x62, 0x6c, 0x65, 0x20, 0x32, 0x35, 0x20, 0x35, 0x31, 0x32, 0x20, 0x31, +0x36, 0x20, 0x31, 0x36, 0x20, 0x20, 0x35, 0x0a, 0x2e, 0x72, 0x65, 0x66, +0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x32, 0x34, 0x0a, 0x0a, 0x2e, +0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x32, 0x36, 0x20, 0x35, 0x31, 0x32, +0x20, 0x31, 0x36, 0x20, 0x31, 0x36, 0x20, 0x20, 0x36, 0x0a, 0x2e, 0x72, +0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x32, 0x34, 0x0a, +0x0a, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x32, 0x37, 0x20, 0x35, +0x31, 0x32, 0x20, 0x31, 0x36, 0x20, 0x31, 0x36, 0x20, 0x20, 0x37, 0x0a, +0x2e, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x32, +0x34, 0x0a, 0x0a, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x32, 0x38, +0x20, 0x35, 0x31, 0x32, 0x20, 0x31, 0x36, 0x20, 0x31, 0x36, 0x20, 0x20, +0x38, 0x0a, 0x2e, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, +0x20, 0x32, 0x34, 0x0a, 0x0a, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, +0x32, 0x39, 0x20, 0x35, 0x31, 0x32, 0x20, 0x31, 0x36, 0x20, 0x31, 0x36, +0x20, 0x20, 0x39, 0x0a, 0x2e, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, +0x63, 0x65, 0x20, 0x32, 0x34, 0x0a, 0x0a, 0x2e, 0x74, 0x61, 0x62, 0x6c, +0x65, 0x20, 0x33, 0x30, 0x20, 0x35, 0x31, 0x32, 0x20, 0x31, 0x36, 0x20, +0x31, 0x36, 0x20, 0x31, 0x31, 0x0a, 0x2e, 0x72, 0x65, 0x66, 0x65, 0x72, +0x65, 0x6e, 0x63, 0x65, 0x20, 0x32, 0x34, 0x0a, 0x0a, 0x2e, 0x74, 0x61, +0x62, 0x6c, 0x65, 0x20, 0x33, 0x31, 0x20, 0x35, 0x31, 0x32, 0x20, 0x31, +0x36, 0x20, 0x31, 0x36, 0x20, 0x31, 0x33, 0x0a, 0x2e, 0x72, 0x65, 0x66, +0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x32, 0x34, 0x0a, 0x0a, 0x2e, +0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x33, 0x32, 0x20, 0x20, 0x33, 0x31, +0x20, 0x20, 0x31, 0x20, 0x31, 0x36, 0x20, 0x20, 0x30, 0x0a, 0x2e, 0x74, +0x72, 0x65, 0x65, 0x64, 0x61, 0x74, 0x61, 0x0a, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x20, 0x30, 0x20, 0x20, 0x38, 0x20, 0x20, +0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x20, 0x38, 0x20, 0x20, 0x30, 0x20, 0x20, +0x34, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x20, +0x31, 0x20, 0x20, 0x30, 0x20, 0x20, 0x32, 0x20, 0x20, 0x38, 0x20, 0x20, +0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x20, 0x63, 0x20, 0x20, 0x30, 0x20, +0x20, 0x61, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x20, 0x33, 0x20, 0x20, 0x30, 0x20, 0x20, 0x36, 0x20, 0x20, 0x36, 0x20, +0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x20, 0x39, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x20, 0x35, 0x20, 0x20, 0x30, 0x20, 0x20, 0x37, 0x20, 0x0a, 0x20, 0x34, +0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x20, 0x65, 0x20, 0x20, 0x30, 0x20, 0x20, 0x64, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x20, 0x66, 0x20, 0x20, 0x30, +0x20, 0x20, 0x62, 0x20, 0x0a, 0x0a, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, +0x20, 0x33, 0x33, 0x20, 0x20, 0x33, 0x31, 0x20, 0x20, 0x31, 0x20, 0x31, +0x36, 0x20, 0x20, 0x30, 0x0a, 0x2e, 0x74, 0x72, 0x65, 0x65, 0x64, 0x61, +0x74, 0x61, 0x0a, 0x31, 0x30, 0x20, 0x20, 0x31, 0x20, 0x20, 0x38, 0x20, +0x20, 0x31, 0x20, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, +0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x20, 0x30, 0x20, 0x20, 0x30, 0x20, +0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x20, 0x32, 0x20, 0x20, 0x30, 0x20, 0x20, 0x33, 0x20, 0x20, 0x34, 0x20, +0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, +0x20, 0x34, 0x20, 0x0a, 0x20, 0x30, 0x20, 0x20, 0x35, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x20, 0x36, 0x20, 0x20, 0x30, +0x20, 0x20, 0x37, 0x20, 0x20, 0x38, 0x20, 0x20, 0x31, 0x20, 0x20, 0x34, +0x20, 0x20, 0x31, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, +0x20, 0x20, 0x38, 0x20, 0x20, 0x30, 0x20, 0x20, 0x39, 0x20, 0x20, 0x32, +0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x20, 0x61, 0x20, 0x20, 0x30, +0x20, 0x20, 0x62, 0x20, 0x0a, 0x20, 0x34, 0x20, 0x20, 0x31, 0x20, 0x20, +0x32, 0x20, 0x20, 0x31, 0x20, 0x20, 0x30, 0x20, 0x20, 0x63, 0x20, 0x20, +0x30, 0x20, 0x20, 0x64, 0x20, 0x20, 0x32, 0x20, 0x20, 0x31, 0x20, 0x20, +0x30, 0x20, 0x20, 0x65, 0x20, 0x20, 0x30, 0x20, 0x20, 0x66, 0x20, 0x0a, +0x0a, 0x2e, 0x65, 0x6e, 0x64, 0x0a +}; diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MP3StreamState.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MP3StreamState.cpp new file mode 100644 index 000000000..efbb72cfc --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MP3StreamState.cpp @@ -0,0 +1,388 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A class encapsulating the state of a MP3 stream +// Implementation + +#include "MP3StreamState.hh" +#include "InputFile.hh" +#include "GroupsockHelper.hh" + +#if defined(__WIN32__) || defined(_WIN32) +#define snprintf _snprintf +#if _MSC_VER >= 1400 // 1400 == vs2005 +#define fileno _fileno +#endif +#endif + +#define MILLION 1000000 + +MP3StreamState::MP3StreamState() + : fFid(NULL), fPresentationTimeScale(1) { +} + +MP3StreamState::~MP3StreamState() { + // Close our open file or socket: + if (fFid != NULL && fFid != stdin) { + if (fFidIsReallyASocket) { + intptr_t fid_long = (intptr_t)fFid; + closeSocket((int)fid_long); + } else { + CloseInputFile(fFid); + } + } +} + +void MP3StreamState::assignStream(FILE* fid, unsigned fileSize) { + fFid = fid; + + if (fileSize == (unsigned)(-1)) { /*HACK#####*/ + fFidIsReallyASocket = 1; + fFileSize = 0; + } else { + fFidIsReallyASocket = 0; + fFileSize = fileSize; + } + fNumFramesInFile = 0; // until we know otherwise + fIsVBR = fHasXingTOC = False; // ditto + + // Set the first frame's 'presentation time' to the current wall time: + gettimeofday(&fNextFramePresentationTime, NULL); +} + +struct timeval MP3StreamState::currentFramePlayTime() const { + unsigned const numSamples = 1152; + unsigned const freq = fr().samplingFreq*(1 + fr().isMPEG2); + + // result is numSamples/freq + unsigned const uSeconds + = ((numSamples*2*MILLION)/freq + 1)/2; // rounds to nearest integer + + struct timeval result; + result.tv_sec = uSeconds/MILLION; + result.tv_usec = uSeconds%MILLION; + return result; +} + +float MP3StreamState::filePlayTime() const { + unsigned numFramesInFile = fNumFramesInFile; + if (numFramesInFile == 0) { + // Estimate the number of frames from the file size, and the + // size of the current frame: + numFramesInFile = fFileSize/(4 + fCurrentFrame.frameSize); + } + + struct timeval const pt = currentFramePlayTime(); + return numFramesInFile*(pt.tv_sec + pt.tv_usec/(float)MILLION); +} + +unsigned MP3StreamState::getByteNumberFromPositionFraction(float fraction) { + if (fHasXingTOC) { + // The file is VBR, with a Xing TOC; use it to determine which byte to seek to: + float percent = fraction*100.0f; + unsigned a = (unsigned)percent; + if (a > 99) a = 99; + + unsigned fa = fXingTOC[a]; + unsigned fb; + if (a < 99) { + fb = fXingTOC[a+1]; + } else { + fb = 256; + } + fraction = (fa + (fb-fa)*(percent-a))/256.0f; + } + + return (unsigned)(fraction*fFileSize); +} + +void MP3StreamState::seekWithinFile(unsigned seekByteNumber) { + if (fFidIsReallyASocket) return; // it's not seekable + + SeekFile64(fFid, seekByteNumber, SEEK_SET); +} + +unsigned MP3StreamState::findNextHeader(struct timeval& presentationTime) { + presentationTime = fNextFramePresentationTime; + + if (!findNextFrame()) return 0; + + // From this frame, figure out the *next* frame's presentation time: + struct timeval framePlayTime = currentFramePlayTime(); + if (fPresentationTimeScale > 1) { + // Scale this value + unsigned secondsRem = framePlayTime.tv_sec % fPresentationTimeScale; + framePlayTime.tv_sec -= secondsRem; + framePlayTime.tv_usec += secondsRem*MILLION; + framePlayTime.tv_sec /= fPresentationTimeScale; + framePlayTime.tv_usec /= fPresentationTimeScale; + } + fNextFramePresentationTime.tv_usec += framePlayTime.tv_usec; + fNextFramePresentationTime.tv_sec + += framePlayTime.tv_sec + fNextFramePresentationTime.tv_usec/MILLION; + fNextFramePresentationTime.tv_usec %= MILLION; + + return fr().hdr; +} + +Boolean MP3StreamState::readFrame(unsigned char* outBuf, unsigned outBufSize, + unsigned& resultFrameSize, + unsigned& resultDurationInMicroseconds) { + /* We assume that "findNextHeader()" has already been called */ + + resultFrameSize = 4 + fr().frameSize; + + if (outBufSize < resultFrameSize) { +#ifdef DEBUG_ERRORS + fprintf(stderr, "Insufficient buffer size for reading input frame (%d, need %d)\n", + outBufSize, resultFrameSize); +#endif + if (outBufSize < 4) outBufSize = 0; + resultFrameSize = outBufSize; + + return False; + } + + if (resultFrameSize >= 4) { + unsigned& hdr = fr().hdr; + *outBuf++ = (unsigned char)(hdr>>24); + *outBuf++ = (unsigned char)(hdr>>16); + *outBuf++ = (unsigned char)(hdr>>8); + *outBuf++ = (unsigned char)(hdr); + + memmove(outBuf, fr().frameBytes, resultFrameSize-4); + } + + struct timeval const pt = currentFramePlayTime(); + resultDurationInMicroseconds = pt.tv_sec*MILLION + pt.tv_usec; + + return True; +} + +void MP3StreamState::getAttributes(char* buffer, unsigned bufferSize) const { + char const* formatStr + = "bandwidth %d MPEGnumber %d MPEGlayer %d samplingFrequency %d isStereo %d playTime %d isVBR %d"; + unsigned fpt = (unsigned)(filePlayTime() + 0.5); // rounds to nearest integer +#if defined(IRIX) || defined(ALPHA) || defined(_QNX4) || defined(IMN_PIM) || defined(CRIS) + /* snprintf() isn't defined, so just use sprintf() - ugh! */ + sprintf(buffer, formatStr, + fr().bitrate, fr().isMPEG2 ? 2 : 1, fr().layer, fr().samplingFreq, fr().isStereo, + fpt, fIsVBR); +#else + snprintf(buffer, bufferSize, formatStr, + fr().bitrate, fr().isMPEG2 ? 2 : 1, fr().layer, fr().samplingFreq, fr().isStereo, + fpt, fIsVBR); +#endif +} + +// This is crufty old code that needs to be cleaned up ##### +#define HDRCMPMASK 0xfffffd00 + +Boolean MP3StreamState::findNextFrame() { + unsigned char hbuf[8]; + unsigned l; int i; + int attempt = 0; + + read_again: + if (readFromStream(hbuf, 4) != 4) return False; + + fr().hdr = ((unsigned long) hbuf[0] << 24) + | ((unsigned long) hbuf[1] << 16) + | ((unsigned long) hbuf[2] << 8) + | (unsigned long) hbuf[3]; + +#ifdef DEBUG_PARSE + fprintf(stderr, "fr().hdr: 0x%08x\n", fr().hdr); +#endif + if (fr().oldHdr != fr().hdr || !fr().oldHdr) { + i = 0; + init_resync: +#ifdef DEBUG_PARSE + fprintf(stderr, "init_resync: fr().hdr: 0x%08x\n", fr().hdr); +#endif + if ( (fr().hdr & 0xffe00000) != 0xffe00000 + || (fr().hdr & 0x00060000) == 0 // undefined 'layer' field + || (fr().hdr & 0x0000F000) == 0 // 'free format' bitrate index + || (fr().hdr & 0x0000F000) == 0x0000F000 // undefined bitrate index + || (fr().hdr & 0x00000C00) == 0x00000C00 // undefined frequency index + || (fr().hdr & 0x00000003) != 0x00000000 // 'emphasis' field unexpectedly set + ) { + /* RSF: Do the following test even if we're not at the + start of the file, in case we have two or more + separate MP3 files cat'ed together: + */ + /* Check for RIFF hdr */ + if (fr().hdr == ('R'<<24)+('I'<<16)+('F'<<8)+'F') { + unsigned char buf[70 /*was: 40*/]; +#ifdef DEBUG_ERRORS + fprintf(stderr,"Skipped RIFF header\n"); +#endif + readFromStream(buf, 66); /* already read 4 */ + goto read_again; + } + /* Check for ID3 hdr */ + if ((fr().hdr&0xFFFFFF00) == ('I'<<24)+('D'<<16)+('3'<<8)) { + unsigned tagSize, bytesToSkip; + unsigned char buf[1000]; + readFromStream(buf, 6); /* already read 4 */ + tagSize = ((buf[2]&0x7F)<<21) + ((buf[3]&0x7F)<<14) + ((buf[4]&0x7F)<<7) + (buf[5]&0x7F); + bytesToSkip = tagSize; + while (bytesToSkip > 0) { + unsigned bytesToRead = sizeof buf; + if (bytesToRead > bytesToSkip) { + bytesToRead = bytesToSkip; + } + readFromStream(buf, bytesToRead); + bytesToSkip -= bytesToRead; + } +#ifdef DEBUG_ERRORS + fprintf(stderr,"Skipped %d-byte ID3 header\n", tagSize); +#endif + goto read_again; + } + /* give up after 20,000 bytes */ + if (i++ < 20000/*4096*//*1024*/) { + memmove (&hbuf[0], &hbuf[1], 3); + if (readFromStream(hbuf+3,1) != 1) { + return False; + } + fr().hdr <<= 8; + fr().hdr |= hbuf[3]; + fr().hdr &= 0xffffffff; +#ifdef DEBUG_PARSE + fprintf(stderr, "calling init_resync %d\n", i); +#endif + goto init_resync; + } +#ifdef DEBUG_ERRORS + fprintf(stderr,"Giving up searching valid MPEG header\n"); +#endif + return False; + +#ifdef DEBUG_ERRORS + fprintf(stderr,"Illegal Audio-MPEG-Header 0x%08lx at offset 0x%lx.\n", + fr().hdr,tell_stream(str)-4); +#endif + /* Read more bytes until we find something that looks + reasonably like a valid header. This is not a + perfect strategy, but it should get us back on the + track within a short time (and hopefully without + too much distortion in the audio output). */ + do { + attempt++; + memmove (&hbuf[0], &hbuf[1], 7); + if (readFromStream(&hbuf[3],1) != 1) { + return False; + } + + /* This is faster than combining fr().hdr from scratch */ + fr().hdr = ((fr().hdr << 8) | hbuf[3]) & 0xffffffff; + + if (!fr().oldHdr) + goto init_resync; /* "considered harmful", eh? */ + + } while ((fr().hdr & HDRCMPMASK) != (fr().oldHdr & HDRCMPMASK) + && (fr().hdr & HDRCMPMASK) != (fr().firstHdr & HDRCMPMASK)); +#ifdef DEBUG_ERRORS + fprintf (stderr, "Skipped %d bytes in input.\n", attempt); +#endif + } + if (!fr().firstHdr) { + fr().firstHdr = fr().hdr; + } + + fr().setParamsFromHeader(); + fr().setBytePointer(fr().frameBytes, fr().frameSize); + + fr().oldHdr = fr().hdr; + + if (fr().isFreeFormat) { +#ifdef DEBUG_ERRORS + fprintf(stderr,"Free format not supported.\n"); +#endif + return False; + } + +#ifdef MP3_ONLY + if (fr().layer != 3) { +#ifdef DEBUG_ERRORS + fprintf(stderr, "MPEG layer %d is not supported!\n", fr().layer); +#endif + return False; + } +#endif + } + + if ((l = readFromStream(fr().frameBytes, fr().frameSize)) + != fr().frameSize) { + if (l == 0) return False; + memset(fr().frameBytes+1, 0, fr().frameSize-1); + } + + return True; +} + +unsigned MP3StreamState::readFromStream(unsigned char* buf, + unsigned numChars) { + return fread(buf, 1, numChars, fFid); +} + +#define XING_FRAMES_FLAG 0x0001 +#define XING_BYTES_FLAG 0x0002 +#define XING_TOC_FLAG 0x0004 +#define XING_VBR_SCALE_FLAG 0x0008 + +void MP3StreamState::checkForXingHeader() { + // Look for 'Xing' in the first 4 bytes after the 'side info': + if (fr().frameSize < fr().sideInfoSize) return; + unsigned bytesAvailable = fr().frameSize - fr().sideInfoSize; + unsigned char* p = &(fr().frameBytes[fr().sideInfoSize]); + + if (bytesAvailable < 8) return; + if (p[0] != 'X' || p[1] != 'i' || p[2] != 'n' || p[3] != 'g') return; + + // We found it. + fIsVBR = True; + + u_int32_t flags = (p[4]<<24) | (p[5]<<16) | (p[6]<<8) | p[7]; + unsigned i = 8; + bytesAvailable -= 8; + + if (flags&XING_FRAMES_FLAG) { + // The next 4 bytes are the number of frames: + if (bytesAvailable < 4) return; + fNumFramesInFile = (p[i]<<24)|(p[i+1]<<16)|(p[i+2]<<8)|(p[i+3]); + i += 4; bytesAvailable -= 4; + } + + if (flags&XING_BYTES_FLAG) { + // The next 4 bytes is the file size: + if (bytesAvailable < 4) return; + fFileSize = (p[i]<<24)|(p[i+1]<<16)|(p[i+2]<<8)|(p[i+3]); + i += 4; bytesAvailable -= 4; + } + + if (flags&XING_TOC_FLAG) { + // Fill in the Xing 'table of contents': + if (bytesAvailable < XING_TOC_LENGTH) return; + fHasXingTOC = True; + for (unsigned j = 0; j < XING_TOC_LENGTH; ++j) { + fXingTOC[j] = p[i+j]; + } + i += XING_TOC_FLAG; bytesAvailable -= XING_TOC_FLAG; + } +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MP3StreamState.hh b/src/big/mpp/middleware/src/live555/liveMedia/MP3StreamState.hh new file mode 100644 index 000000000..36e155cbf --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MP3StreamState.hh @@ -0,0 +1,89 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A class encapsulating the state of a MP3 stream +// C++ header + +#ifndef _MP3_STREAM_STATE_HH +#define _MP3_STREAM_STATE_HH + +#ifndef _USAGE_ENVIRONMENT_HH +#include "UsageEnvironment.hh" +#endif +#ifndef _BOOLEAN_HH +#include "Boolean.hh" +#endif +#ifndef _MP3_INTERNALS_HH +#include "MP3Internals.hh" +#endif +#ifndef _NET_COMMON_H +#include "NetCommon.h" +#endif + +#include + +#define XING_TOC_LENGTH 100 + +class MP3StreamState { +public: + MP3StreamState(); + virtual ~MP3StreamState(); + + void assignStream(FILE* fid, unsigned fileSize); + + unsigned findNextHeader(struct timeval& presentationTime); + Boolean readFrame(unsigned char* outBuf, unsigned outBufSize, + unsigned& resultFrameSize, + unsigned& resultDurationInMicroseconds); + // called after findNextHeader() + + void getAttributes(char* buffer, unsigned bufferSize) const; + + float filePlayTime() const; // in seconds + unsigned fileSize() const { return fFileSize; } + void setPresentationTimeScale(unsigned scale) { fPresentationTimeScale = scale; } + unsigned getByteNumberFromPositionFraction(float fraction); // 0.0 <= fraction <= 1.0 + void seekWithinFile(unsigned seekByteNumber); + + void checkForXingHeader(); // hack for Xing VBR files + +protected: // private->protected requested by Pierre l'Hussiez + unsigned readFromStream(unsigned char* buf, unsigned numChars); + +private: + MP3FrameParams& fr() {return fCurrentFrame;} + MP3FrameParams const& fr() const {return fCurrentFrame;} + + struct timeval currentFramePlayTime() const; + + Boolean findNextFrame(); + +private: + FILE* fFid; + Boolean fFidIsReallyASocket; + unsigned fFileSize; + unsigned fNumFramesInFile; + unsigned fPresentationTimeScale; + // used if we're streaming at other than the normal rate + Boolean fIsVBR, fHasXingTOC; + u_int8_t fXingTOC[XING_TOC_LENGTH]; // set iff "fHasXingTOC" is True + + MP3FrameParams fCurrentFrame; + struct timeval fNextFramePresentationTime; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MP3Transcoder.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MP3Transcoder.cpp new file mode 100644 index 000000000..abadad7d0 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MP3Transcoder.cpp @@ -0,0 +1,52 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// MP3 Transcoder +// Implementation + +#include "MP3Transcoder.hh" + +MP3Transcoder::MP3Transcoder(UsageEnvironment& env, + MP3ADUTranscoder* aduTranscoder) + : MP3FromADUSource(env, aduTranscoder, False) { +} + +MP3Transcoder::~MP3Transcoder() { +} + +MP3Transcoder* MP3Transcoder::createNew(UsageEnvironment& env, + unsigned outBitrate /* in kbps */, + FramedSource* inputSource) { + MP3Transcoder* newSource = NULL; + + do { + // Create the intermediate filters that help implement the transcoder: + ADUFromMP3Source* aduFromMP3 + = ADUFromMP3Source::createNew(env, inputSource, False); + // Note: This also checks that "inputSource" is an MP3 source + if (aduFromMP3 == NULL) break; + + MP3ADUTranscoder* aduTranscoder + = MP3ADUTranscoder::createNew(env, outBitrate, aduFromMP3); + if (aduTranscoder == NULL) break; + + // Then create the transcoder itself: + newSource = new MP3Transcoder(env, aduTranscoder); + } while (0); + + return newSource; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MPEG1or2AudioRTPSink.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MPEG1or2AudioRTPSink.cpp new file mode 100644 index 000000000..457af05dc --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MPEG1or2AudioRTPSink.cpp @@ -0,0 +1,63 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP sink for MPEG audio (RFC 2250) +// Implementation + +#include "MPEG1or2AudioRTPSink.hh" + +MPEG1or2AudioRTPSink::MPEG1or2AudioRTPSink(UsageEnvironment& env, Groupsock* RTPgs) + : AudioRTPSink(env, RTPgs, 14, 90000, "MPA") { +} + +MPEG1or2AudioRTPSink::~MPEG1or2AudioRTPSink() { +} + +MPEG1or2AudioRTPSink* +MPEG1or2AudioRTPSink::createNew(UsageEnvironment& env, Groupsock* RTPgs) { + return new MPEG1or2AudioRTPSink(env, RTPgs); +} + +void MPEG1or2AudioRTPSink::doSpecialFrameHandling(unsigned fragmentationOffset, + unsigned char* frameStart, + unsigned numBytesInFrame, + struct timeval framePresentationTime, + unsigned numRemainingBytes) { + // If this is the 1st frame in the 1st packet, set the RTP 'M' (marker) + // bit (because this is considered the start of a talk spurt): + if (isFirstPacket() && isFirstFrameInPacket()) { + setMarkerBit(); + } + + // If this is the first frame in the packet, set the lower half of the + // audio-specific header (to the "fragmentationOffset"): + if (isFirstFrameInPacket()) { + setSpecialHeaderWord(fragmentationOffset&0xFFFF); + } + + // Important: Also call our base class's doSpecialFrameHandling(), + // to set the packet's timestamp: + MultiFramedRTPSink::doSpecialFrameHandling(fragmentationOffset, + frameStart, numBytesInFrame, + framePresentationTime, + numRemainingBytes); +} + +unsigned MPEG1or2AudioRTPSink::specialHeaderSize() const { + // There's a 4 byte special audio header: + return 4; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MPEG1or2AudioRTPSource.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MPEG1or2AudioRTPSource.cpp new file mode 100644 index 000000000..60f1d46ab --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MPEG1or2AudioRTPSource.cpp @@ -0,0 +1,62 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// MPEG-1 or MPEG-2 Audio RTP Sources +// Implementation + +#include "MPEG1or2AudioRTPSource.hh" + +MPEG1or2AudioRTPSource* +MPEG1or2AudioRTPSource::createNew(UsageEnvironment& env, + Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency) { + return new MPEG1or2AudioRTPSource(env, RTPgs, rtpPayloadFormat, + rtpTimestampFrequency); +} + +MPEG1or2AudioRTPSource::MPEG1or2AudioRTPSource(UsageEnvironment& env, + Groupsock* rtpGS, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency) + : MultiFramedRTPSource(env, rtpGS, + rtpPayloadFormat, rtpTimestampFrequency) { +} + +MPEG1or2AudioRTPSource::~MPEG1or2AudioRTPSource() { +} + +Boolean MPEG1or2AudioRTPSource +::processSpecialHeader(BufferedPacket* packet, + unsigned& resultSpecialHeaderSize) { + // There's a 4-byte header indicating fragmentation. + if (packet->dataSize() < 4) return False; + + // Note: This fragmentation header is actually useless to us, because + // it doesn't tell us whether or not this RTP packet *ends* a + // fragmented frame. Thus, we can't use it to properly set + // "fCurrentPacketCompletesFrame". Instead, we assume that even + // a partial audio frame will be usable to clients. + + resultSpecialHeaderSize = 4; + return True; +} + +char const* MPEG1or2AudioRTPSource::MIMEtype() const { + return "audio/MPEG"; +} + diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MPEG1or2AudioStreamFramer.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MPEG1or2AudioStreamFramer.cpp new file mode 100644 index 000000000..7160582a9 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MPEG1or2AudioStreamFramer.cpp @@ -0,0 +1,210 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A filter that breaks up an MPEG (1,2) audio elementary stream into frames +// Implementation + +#include "MPEG1or2AudioStreamFramer.hh" +#include "StreamParser.hh" +#include "MP3Internals.hh" +#include + +////////// MPEG1or2AudioStreamParser definition ////////// + +class MPEG1or2AudioStreamParser: public StreamParser { +public: + MPEG1or2AudioStreamParser(MPEG1or2AudioStreamFramer* usingSource, + FramedSource* inputSource); + virtual ~MPEG1or2AudioStreamParser(); + +public: + unsigned parse(unsigned& numTruncatedBytes); + // returns the size of the frame that was acquired, or 0 if none was + + void registerReadInterest(unsigned char* to, unsigned maxSize); + + MP3FrameParams const& currentFrame() const { return fCurrentFrame; } + +private: + unsigned char* fTo; + unsigned fMaxSize; + + // Parameters of the most recently read frame: + MP3FrameParams fCurrentFrame; // also works for layer I or II +}; + + +////////// MPEG1or2AudioStreamFramer implementation ////////// + +MPEG1or2AudioStreamFramer +::MPEG1or2AudioStreamFramer(UsageEnvironment& env, FramedSource* inputSource, + Boolean syncWithInputSource) + : FramedFilter(env, inputSource), + fSyncWithInputSource(syncWithInputSource) { + reset(); + + fParser = new MPEG1or2AudioStreamParser(this, inputSource); +} + +MPEG1or2AudioStreamFramer::~MPEG1or2AudioStreamFramer() { + delete fParser; +} + +MPEG1or2AudioStreamFramer* +MPEG1or2AudioStreamFramer::createNew(UsageEnvironment& env, + FramedSource* inputSource, + Boolean syncWithInputSource) { + // Need to add source type checking here??? ##### + return new MPEG1or2AudioStreamFramer(env, inputSource, syncWithInputSource); +} + +void MPEG1or2AudioStreamFramer::flushInput() { + reset(); + fParser->flushInput(); +} + +void MPEG1or2AudioStreamFramer::reset() { + // Use the current wallclock time as the initial 'presentation time': + struct timeval timeNow; + gettimeofday(&timeNow, NULL); + resetPresentationTime(timeNow); +} + +void MPEG1or2AudioStreamFramer +::resetPresentationTime(struct timeval newPresentationTime) { + fNextFramePresentationTime = newPresentationTime; +} + +void MPEG1or2AudioStreamFramer::doGetNextFrame() { + fParser->registerReadInterest(fTo, fMaxSize); + continueReadProcessing(); +} + +#define MILLION 1000000 + +static unsigned const numSamplesByLayer[4] = {0, 384, 1152, 1152}; + +struct timeval MPEG1or2AudioStreamFramer::currentFramePlayTime() const { + MP3FrameParams const& fr = fParser->currentFrame(); + unsigned const numSamples = numSamplesByLayer[fr.layer]; + + struct timeval result; + unsigned const freq = fr.samplingFreq*(1 + fr.isMPEG2); + if (freq == 0) { + result.tv_sec = 0; + result.tv_usec = 0; + return result; + } + + // result is numSamples/freq + unsigned const uSeconds + = ((numSamples*2*MILLION)/freq + 1)/2; // rounds to nearest integer + + result.tv_sec = uSeconds/MILLION; + result.tv_usec = uSeconds%MILLION; + return result; +} + +void MPEG1or2AudioStreamFramer +::continueReadProcessing(void* clientData, + unsigned char* /*ptr*/, unsigned /*size*/, + struct timeval presentationTime) { + MPEG1or2AudioStreamFramer* framer = (MPEG1or2AudioStreamFramer*)clientData; + if (framer->fSyncWithInputSource) { + framer->resetPresentationTime(presentationTime); + } + framer->continueReadProcessing(); +} + +void MPEG1or2AudioStreamFramer::continueReadProcessing() { + unsigned acquiredFrameSize = fParser->parse(fNumTruncatedBytes); + if (acquiredFrameSize > 0) { + // We were able to acquire a frame from the input. + // It has already been copied to the reader's space. + fFrameSize = acquiredFrameSize; + + // Also set the presentation time, and increment it for next time, + // based on the length of this frame: + fPresentationTime = fNextFramePresentationTime; + struct timeval framePlayTime = currentFramePlayTime(); + fDurationInMicroseconds = framePlayTime.tv_sec*MILLION + framePlayTime.tv_usec; + fNextFramePresentationTime.tv_usec += framePlayTime.tv_usec; + fNextFramePresentationTime.tv_sec + += framePlayTime.tv_sec + fNextFramePresentationTime.tv_usec/MILLION; + fNextFramePresentationTime.tv_usec %= MILLION; + + // Call our own 'after getting' function. Because we're not a 'leaf' + // source, we can call this directly, without risking infinite recursion. + afterGetting(this); + } else { + // We were unable to parse a complete frame from the input, because: + // - we had to read more data from the source stream, or + // - the source stream has ended. + } +} + + +////////// MPEG1or2AudioStreamParser implementation ////////// + +MPEG1or2AudioStreamParser +::MPEG1or2AudioStreamParser(MPEG1or2AudioStreamFramer* usingSource, + FramedSource* inputSource) + : StreamParser(inputSource, FramedSource::handleClosure, usingSource, + &MPEG1or2AudioStreamFramer::continueReadProcessing, usingSource) { +} + +MPEG1or2AudioStreamParser::~MPEG1or2AudioStreamParser() { +} + +void MPEG1or2AudioStreamParser::registerReadInterest(unsigned char* to, + unsigned maxSize) { + fTo = to; + fMaxSize = maxSize; +} + +unsigned MPEG1or2AudioStreamParser::parse(unsigned& numTruncatedBytes) { + try { + saveParserState(); + + // We expect a MPEG audio header (first 11 bits set to 1) at the start: + while (((fCurrentFrame.hdr = test4Bytes())&0xFFE00000) != 0xFFE00000) { + skipBytes(1); + saveParserState(); + } + + fCurrentFrame.setParamsFromHeader(); + + // Copy the frame to the requested destination: + unsigned frameSize = fCurrentFrame.frameSize + 4; // include header + if (frameSize > fMaxSize) { + numTruncatedBytes = frameSize - fMaxSize; + frameSize = fMaxSize; + } else { + numTruncatedBytes = 0; + } + + getBytes(fTo, frameSize); + skipBytes(numTruncatedBytes); + + return frameSize; + } catch (int /*e*/) { +#ifdef DEBUG + fprintf(stderr, "MPEG1or2AudioStreamParser::parse() EXCEPTION (This is normal behavior - *not* an error)\n"); +#endif + return 0; // the parsing got interrupted + } +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MPEG1or2Demux.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MPEG1or2Demux.cpp new file mode 100644 index 000000000..d82ea5e4d --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MPEG1or2Demux.cpp @@ -0,0 +1,768 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Demultiplexer for a MPEG 1 or 2 Program Stream +// Implementation + +#include "MPEG1or2Demux.hh" +#include "MPEG1or2DemuxedElementaryStream.hh" +#include "StreamParser.hh" +#include + +////////// MPEGProgramStreamParser definition ////////// + +// An enum representing the current state of the parser: +enum MPEGParseState { + PARSING_PACK_HEADER, + PARSING_SYSTEM_HEADER, + PARSING_PES_PACKET +}; + +class MPEGProgramStreamParser: public StreamParser { +public: + MPEGProgramStreamParser(MPEG1or2Demux* usingDemux, FramedSource* inputSource); + virtual ~MPEGProgramStreamParser(); + +public: + unsigned char parse(); + // returns the stream id of a stream for which a frame was acquired, + // or 0 if no such frame was acquired. + +private: + void setParseState(MPEGParseState parseState); + + void parsePackHeader(); + void parseSystemHeader(); + unsigned char parsePESPacket(); // returns as does parse() + + Boolean isSpecialStreamId(unsigned char stream_id) const; + // for PES packet header parsing + +private: + MPEG1or2Demux* fUsingDemux; + MPEGParseState fCurrentParseState; +}; + + +////////// MPEG1or2Demux::OutputDescriptor::SavedData definition/implementation ////////// + +class MPEG1or2Demux::OutputDescriptor::SavedData { +public: + SavedData(unsigned char* buf, unsigned size) + : next(NULL), data(buf), dataSize(size), numBytesUsed(0) { + } + virtual ~SavedData() { + delete[] data; + delete next; + } + + SavedData* next; + unsigned char* data; + unsigned dataSize, numBytesUsed; +}; + + +////////// MPEG1or2Demux implementation ////////// + +MPEG1or2Demux +::MPEG1or2Demux(UsageEnvironment& env, + FramedSource* inputSource, Boolean reclaimWhenLastESDies, + MPEG1or2DemuxOnDeletionFunc* onDeletionFunc, void* objectToNotify) + : Medium(env), + fInputSource(inputSource), fMPEGversion(0), + fNextAudioStreamNumber(0), fNextVideoStreamNumber(0), + fReclaimWhenLastESDies(reclaimWhenLastESDies), fNumOutstandingESs(0), + fNumPendingReads(0), fHaveUndeliveredData(False), + fOnDeletionFunc(onDeletionFunc), fOnDeletionObjectToNotify(objectToNotify) { + fParser = new MPEGProgramStreamParser(this, inputSource); + for (unsigned i = 0; i < 256; ++i) { + fOutput[i].savedDataHead = fOutput[i].savedDataTail = NULL; + fOutput[i].isPotentiallyReadable = False; + fOutput[i].isCurrentlyActive = False; + fOutput[i].isCurrentlyAwaitingData = False; + } +} + +MPEG1or2Demux::~MPEG1or2Demux() { + if (fOnDeletionFunc != NULL) { + (*fOnDeletionFunc)(fOnDeletionObjectToNotify, this); + } + + delete fParser; + for (unsigned i = 0; i < 256; ++i) delete fOutput[i].savedDataHead; + Medium::close(fInputSource); +} + +MPEG1or2Demux* MPEG1or2Demux +::createNew(UsageEnvironment& env, + FramedSource* inputSource, Boolean reclaimWhenLastESDies, + MPEG1or2DemuxOnDeletionFunc* onDeletionFunc, + void* objectToNotify) { + // Need to add source type checking here??? ##### + + return new MPEG1or2Demux(env, inputSource, reclaimWhenLastESDies, + onDeletionFunc, objectToNotify); +} + +MPEG1or2Demux::SCR::SCR() + : highBit(0), remainingBits(0), extension(0), isValid(False) { +} + +void MPEG1or2Demux +::noteElementaryStreamDeletion(MPEG1or2DemuxedElementaryStream* /*es*/) { + if (--fNumOutstandingESs == 0 && fReclaimWhenLastESDies) { + Medium::close(this); + } +} + +void MPEG1or2Demux::flushInput() { + fParser->flushInput(); +} + +MPEG1or2DemuxedElementaryStream* +MPEG1or2Demux::newElementaryStream(u_int8_t streamIdTag) { + ++fNumOutstandingESs; + fOutput[streamIdTag].isPotentiallyReadable = True; + return new MPEG1or2DemuxedElementaryStream(envir(), streamIdTag, *this); +} + +MPEG1or2DemuxedElementaryStream* MPEG1or2Demux::newAudioStream() { + unsigned char newAudioStreamTag = 0xC0 | (fNextAudioStreamNumber++&~0xE0); + // MPEG audio stream tags are 110x xxxx (binary) + return newElementaryStream(newAudioStreamTag); +} + +MPEG1or2DemuxedElementaryStream* MPEG1or2Demux::newVideoStream() { + unsigned char newVideoStreamTag = 0xE0 | (fNextVideoStreamNumber++&~0xF0); + // MPEG video stream tags are 1110 xxxx (binary) + return newElementaryStream(newVideoStreamTag); +} + +// Appropriate one of the reserved stream id tags to mean: return raw PES packets: +#define RAW_PES 0xFC + +MPEG1or2DemuxedElementaryStream* MPEG1or2Demux::newRawPESStream() { + return newElementaryStream(RAW_PES); +} + +void MPEG1or2Demux::registerReadInterest(u_int8_t streamIdTag, + unsigned char* to, unsigned maxSize, + FramedSource::afterGettingFunc* afterGettingFunc, + void* afterGettingClientData, + FramedSource::onCloseFunc* onCloseFunc, + void* onCloseClientData) { + struct OutputDescriptor& out = fOutput[streamIdTag]; + + // Make sure this stream is not already being read: + if (out.isCurrentlyAwaitingData) { + envir() << "MPEG1or2Demux::registerReadInterest(): attempt to read stream more than once!\n"; + envir().internalError(); + } + + out.to = to; out.maxSize = maxSize; + out.fAfterGettingFunc = afterGettingFunc; + out.afterGettingClientData = afterGettingClientData; + out.fOnCloseFunc = onCloseFunc; + out.onCloseClientData = onCloseClientData; + out.isCurrentlyActive = True; + out.isCurrentlyAwaitingData = True; + // out.frameSize and out.presentationTime will be set when a frame's read + + ++fNumPendingReads; +} + +Boolean MPEG1or2Demux::useSavedData(u_int8_t streamIdTag, + unsigned char* to, unsigned maxSize, + FramedSource::afterGettingFunc* afterGettingFunc, + void* afterGettingClientData) { + struct OutputDescriptor& out = fOutput[streamIdTag]; + if (out.savedDataHead == NULL) return False; // common case + + unsigned totNumBytesCopied = 0; + while (maxSize > 0 && out.savedDataHead != NULL) { + OutputDescriptor::SavedData& savedData = *(out.savedDataHead); + unsigned char* from = &savedData.data[savedData.numBytesUsed]; + unsigned numBytesToCopy = savedData.dataSize - savedData.numBytesUsed; + if (numBytesToCopy > maxSize) numBytesToCopy = maxSize; + memmove(to, from, numBytesToCopy); + to += numBytesToCopy; + maxSize -= numBytesToCopy; + out.savedDataTotalSize -= numBytesToCopy; + totNumBytesCopied += numBytesToCopy; + savedData.numBytesUsed += numBytesToCopy; + if (savedData.numBytesUsed == savedData.dataSize) { + out.savedDataHead = savedData.next; + if (out.savedDataHead == NULL) out.savedDataTail = NULL; + savedData.next = NULL; + delete &savedData; + } + } + + out.isCurrentlyActive = True; + if (afterGettingFunc != NULL) { + struct timeval presentationTime; + presentationTime.tv_sec = 0; presentationTime.tv_usec = 0; // should fix ##### + (*afterGettingFunc)(afterGettingClientData, totNumBytesCopied, + 0 /* numTruncatedBytes */, presentationTime, + 0 /* durationInMicroseconds ?????#####*/); + } + return True; +} + +void MPEG1or2Demux +::continueReadProcessing(void* clientData, + unsigned char* /*ptr*/, unsigned /*size*/, + struct timeval /*presentationTime*/) { + MPEG1or2Demux* demux = (MPEG1or2Demux*)clientData; + demux->continueReadProcessing(); +} + +void MPEG1or2Demux::continueReadProcessing() { + while (fNumPendingReads > 0) { + unsigned char acquiredStreamIdTag = fParser->parse(); + + if (acquiredStreamIdTag != 0) { + // We were able to acquire a frame from the input. + struct OutputDescriptor& newOut = fOutput[acquiredStreamIdTag]; + newOut.isCurrentlyAwaitingData = False; + // indicates that we can be read again + // (This needs to be set before the 'after getting' call below, + // in case it tries to read another frame) + + // Call our own 'after getting' function. Because we're not a 'leaf' + // source, we can call this directly, without risking infinite recursion. + if (newOut.fAfterGettingFunc != NULL) { + (*newOut.fAfterGettingFunc)(newOut.afterGettingClientData, + newOut.frameSize, 0 /* numTruncatedBytes */, + newOut.presentationTime, + 0 /* durationInMicroseconds ?????#####*/); + --fNumPendingReads; + } + } else { + // We were unable to parse a complete frame from the input, because: + // - we had to read more data from the source stream, or + // - we found a frame for a stream that was being read, but whose + // reader is not ready to get the frame right now, or + // - the source stream has ended. + break; + } + } +} + +void MPEG1or2Demux::getNextFrame(u_int8_t streamIdTag, + unsigned char* to, unsigned maxSize, + FramedSource::afterGettingFunc* afterGettingFunc, + void* afterGettingClientData, + FramedSource::onCloseFunc* onCloseFunc, + void* onCloseClientData) { + // First, check whether we have saved data for this stream id: + if (useSavedData(streamIdTag, to, maxSize, + afterGettingFunc, afterGettingClientData)) { + return; + } + + // Then save the parameters of the specified stream id: + registerReadInterest(streamIdTag, to, maxSize, + afterGettingFunc, afterGettingClientData, + onCloseFunc, onCloseClientData); + + // Next, if we're the only currently pending read, continue looking for data: + if (fNumPendingReads == 1 || fHaveUndeliveredData) { + fHaveUndeliveredData = 0; + continueReadProcessing(); + } // otherwise the continued read processing has already been taken care of +} + +void MPEG1or2Demux::stopGettingFrames(u_int8_t streamIdTag) { + struct OutputDescriptor& out = fOutput[streamIdTag]; + + if (out.isCurrentlyAwaitingData && fNumPendingReads > 0) { + --fNumPendingReads; + if (fNumPendingReads == 0 && fInputSource != NULL) fInputSource->stopGettingFrames(); + } + + out.isCurrentlyActive = out.isCurrentlyAwaitingData = False; +} + +void MPEG1or2Demux::handleClosure(void* clientData) { + MPEG1or2Demux* demux = (MPEG1or2Demux*)clientData; + + demux->fNumPendingReads = 0; + + // Tell all pending readers that our source has closed. + // Note that we need to make a copy of our readers' close functions + // (etc.) before we start calling any of them, in case one of them + // ends up deleting this. + struct { + FramedSource::onCloseFunc* fOnCloseFunc; + void* onCloseClientData; + } savedPending[256]; + unsigned i, numPending = 0; + for (i = 0; i < 256; ++i) { + struct OutputDescriptor& out = demux->fOutput[i]; + if (out.isCurrentlyAwaitingData) { + if (out.fOnCloseFunc != NULL) { + savedPending[numPending].fOnCloseFunc = out.fOnCloseFunc; + savedPending[numPending].onCloseClientData = out.onCloseClientData; + ++numPending; + } + } + delete out.savedDataHead; out.savedDataHead = out.savedDataTail = NULL; + out.savedDataTotalSize = 0; + out.isPotentiallyReadable = out.isCurrentlyActive = out.isCurrentlyAwaitingData + = False; + } + for (i = 0; i < numPending; ++i) { + (*savedPending[i].fOnCloseFunc)(savedPending[i].onCloseClientData); + } +} + + +////////// MPEGProgramStreamParser implementation ////////// + +#include + +MPEGProgramStreamParser::MPEGProgramStreamParser(MPEG1or2Demux* usingDemux, + FramedSource* inputSource) + : StreamParser(inputSource, MPEG1or2Demux::handleClosure, usingDemux, + &MPEG1or2Demux::continueReadProcessing, usingDemux), + fUsingDemux(usingDemux), fCurrentParseState(PARSING_PACK_HEADER) { +} + +MPEGProgramStreamParser::~MPEGProgramStreamParser() { +} + +void MPEGProgramStreamParser::setParseState(MPEGParseState parseState) { + fCurrentParseState = parseState; + saveParserState(); +} + +unsigned char MPEGProgramStreamParser::parse() { + unsigned char acquiredStreamTagId = 0; + + try { + do { + switch (fCurrentParseState) { + case PARSING_PACK_HEADER: { + parsePackHeader(); + break; + } + case PARSING_SYSTEM_HEADER: { + parseSystemHeader(); + break; + } + case PARSING_PES_PACKET: { + acquiredStreamTagId = parsePESPacket(); + break; + } + } + } while(acquiredStreamTagId == 0); + + return acquiredStreamTagId; + } catch (int /*e*/) { +#ifdef DEBUG + fprintf(stderr, "MPEGProgramStreamParser::parse() EXCEPTION (This is normal behavior - *not* an error)\n"); + fflush(stderr); +#endif + return 0; // the parsing got interrupted + } +} + +#define PACK_START_CODE 0x000001BA +#define SYSTEM_HEADER_START_CODE 0x000001BB +#define PACKET_START_CODE_PREFIX 0x00000100 + +static inline Boolean isPacketStartCode(unsigned code) { + return (code&0xFFFFFF00) == PACKET_START_CODE_PREFIX + && code > SYSTEM_HEADER_START_CODE; +} + +void MPEGProgramStreamParser::parsePackHeader() { +#ifdef DEBUG + fprintf(stderr, "parsing pack header\n"); fflush(stderr); +#endif + unsigned first4Bytes; + while (1) { + first4Bytes = test4Bytes(); + + // We're supposed to have a pack header here, but check also for + // a system header or a PES packet, just in case: + if (first4Bytes == PACK_START_CODE) { + skipBytes(4); + break; + } else if (first4Bytes == SYSTEM_HEADER_START_CODE) { +#ifdef DEBUG + fprintf(stderr, "found system header instead of pack header\n"); +#endif + setParseState(PARSING_SYSTEM_HEADER); + return; + } else if (isPacketStartCode(first4Bytes)) { +#ifdef DEBUG + fprintf(stderr, "found packet start code 0x%02x instead of pack header\n", first4Bytes); +#endif + setParseState(PARSING_PES_PACKET); + return; + } + + setParseState(PARSING_PACK_HEADER); // ensures we progress over bad data + if ((first4Bytes&0xFF) > 1) { // a system code definitely doesn't start here + skipBytes(4); + } else { + skipBytes(1); + } + } + + // The size of the pack header differs depending on whether it's + // MPEG-1 or MPEG-2. The next byte tells us this: + unsigned char nextByte = get1Byte(); + MPEG1or2Demux::SCR& scr = fUsingDemux->fLastSeenSCR; // alias + if ((nextByte&0xF0) == 0x20) { // MPEG-1 + fUsingDemux->fMPEGversion = 1; + scr.highBit = (nextByte&0x08)>>3; + scr.remainingBits = (nextByte&0x06)<<29; + unsigned next4Bytes = get4Bytes(); + scr.remainingBits |= (next4Bytes&0xFFFE0000)>>2; + scr.remainingBits |= (next4Bytes&0x0000FFFE)>>1; + scr.extension = 0; + scr.isValid = True; + skipBits(24); + +#if defined(DEBUG_TIMESTAMPS) || defined(DEBUG_SCR_TIMESTAMPS) + fprintf(stderr, "pack hdr system_clock_reference_base: 0x%x", + scr.highBit); + fprintf(stderr, "%08x\n", scr.remainingBits); +#endif + } else if ((nextByte&0xC0) == 0x40) { // MPEG-2 + fUsingDemux->fMPEGversion = 2; + scr.highBit = (nextByte&0x20)>>5; + scr.remainingBits = (nextByte&0x18)<<27; + scr.remainingBits |= (nextByte&0x03)<<28; + unsigned next4Bytes = get4Bytes(); + scr.remainingBits |= (next4Bytes&0xFFF80000)>>4; + scr.remainingBits |= (next4Bytes&0x0003FFF8)>>3; + scr.extension = (next4Bytes&0x00000003)<<7; + next4Bytes = get4Bytes(); + scr.extension |= (next4Bytes&0xFE000000)>>25; + scr.isValid = True; + skipBits(5); + +#if defined(DEBUG_TIMESTAMPS) || defined(DEBUG_SCR_TIMESTAMPS) + fprintf(stderr, "pack hdr system_clock_reference_base: 0x%x", + scr.highBit); + fprintf(stderr, "%08x\n", scr.remainingBits); + fprintf(stderr, "pack hdr system_clock_reference_extension: 0x%03x\n", + scr.extension); +#endif + unsigned char pack_stuffing_length = getBits(3); + skipBytes(pack_stuffing_length); + } else { // unknown + fUsingDemux->envir() << "StreamParser::parsePack() saw strange byte following pack_start_code\n"; + } + + // Check for a System Header next: + setParseState(PARSING_SYSTEM_HEADER); +} + +void MPEGProgramStreamParser::parseSystemHeader() { +#ifdef DEBUG + fprintf(stderr, "parsing system header\n"); fflush(stderr); +#endif + unsigned next4Bytes = test4Bytes(); + if (next4Bytes != SYSTEM_HEADER_START_CODE) { + // The system header was optional. Look for a PES Packet instead: + setParseState(PARSING_PES_PACKET); + return; + } + +#ifdef DEBUG + fprintf(stderr, "saw system_header_start_code\n"); fflush(stderr); +#endif + skipBytes(4); // we've already seen the system_header_start_code + + unsigned short remaining_header_length = get2Bytes(); + + // According to the MPEG-1 and MPEG-2 specs, "remaining_header_length" should be + // at least 6 bytes. Check this now: + if (remaining_header_length < 6) { + fUsingDemux->envir() << "StreamParser::parseSystemHeader(): saw strange header_length: " + << remaining_header_length << " < 6\n"; + } + skipBytes(remaining_header_length); + + // Check for a PES Packet next: + setParseState(PARSING_PES_PACKET); +} + +#define private_stream_1 0xBD +#define private_stream_2 0xBF + +// A test for stream ids that are exempt from normal PES packet header parsing +Boolean MPEGProgramStreamParser +::isSpecialStreamId(unsigned char stream_id) const { + if (stream_id == RAW_PES) return True; // hack + + if (fUsingDemux->fMPEGversion == 1) { + return stream_id == private_stream_2; + } else { // assume MPEG-2 + if (stream_id <= private_stream_2) { + return stream_id != private_stream_1; + } else if ((stream_id&0xF0) == 0xF0) { + unsigned char lower4Bits = stream_id&0x0F; + return lower4Bits <= 2 || lower4Bits == 0x8 || lower4Bits == 0xF; + } else { + return False; + } + } +} + +#define READER_NOT_READY 2 + +unsigned char MPEGProgramStreamParser::parsePESPacket() { +#ifdef DEBUG + fprintf(stderr, "parsing PES packet\n"); fflush(stderr); +#endif + unsigned next4Bytes = test4Bytes(); + if (!isPacketStartCode(next4Bytes)) { + // The PES Packet was optional. Look for a Pack Header instead: + setParseState(PARSING_PACK_HEADER); + return 0; + } + +#ifdef DEBUG + fprintf(stderr, "saw packet_start_code_prefix\n"); fflush(stderr); +#endif + skipBytes(3); // we've already seen the packet_start_code_prefix + + unsigned char stream_id = get1Byte(); +#if defined(DEBUG) || defined(DEBUG_TIMESTAMPS) + unsigned char streamNum = stream_id; + char const* streamTypeStr; + if ((stream_id&0xE0) == 0xC0) { + streamTypeStr = "audio"; + streamNum = stream_id&~0xE0; + } else if ((stream_id&0xF0) == 0xE0) { + streamTypeStr = "video"; + streamNum = stream_id&~0xF0; + } else if (stream_id == 0xbc) { + streamTypeStr = "reserved"; + } else if (stream_id == 0xbd) { + streamTypeStr = "private_1"; + } else if (stream_id == 0xbe) { + streamTypeStr = "padding"; + } else if (stream_id == 0xbf) { + streamTypeStr = "private_2"; + } else { + streamTypeStr = "unknown"; + } +#endif +#ifdef DEBUG + static unsigned frameCount = 1; + fprintf(stderr, "%d, saw %s stream: 0x%02x\n", frameCount, streamTypeStr, streamNum); fflush(stderr); +#endif + + unsigned short PES_packet_length = get2Bytes(); +#ifdef DEBUG + fprintf(stderr, "PES_packet_length: %d\n", PES_packet_length); fflush(stderr); +#endif + + // Parse over the rest of the header, until we get to the packet data itself. + // This varies depending upon the MPEG version: + if (fUsingDemux->fOutput[RAW_PES].isPotentiallyReadable) { + // Hack: We've been asked to return raw PES packets, for every stream: + stream_id = RAW_PES; + } + unsigned savedParserOffset = curOffset(); +#ifdef DEBUG_TIMESTAMPS + unsigned char pts_highBit = 0; + unsigned pts_remainingBits = 0; + unsigned char dts_highBit = 0; + unsigned dts_remainingBits = 0; +#endif + if (fUsingDemux->fMPEGversion == 1) { + if (!isSpecialStreamId(stream_id)) { + unsigned char nextByte; + while ((nextByte = get1Byte()) == 0xFF) { // stuffing_byte + } + if ((nextByte&0xC0) == 0x40) { // '01' + skipBytes(1); + nextByte = get1Byte(); + } + if ((nextByte&0xF0) == 0x20) { // '0010' +#ifdef DEBUG_TIMESTAMPS + pts_highBit = (nextByte&0x08)>>3; + pts_remainingBits = (nextByte&0x06)<<29; + unsigned next4Bytes = get4Bytes(); + pts_remainingBits |= (next4Bytes&0xFFFE0000)>>2; + pts_remainingBits |= (next4Bytes&0x0000FFFE)>>1; +#else + skipBytes(4); +#endif + } else if ((nextByte&0xF0) == 0x30) { // '0011' +#ifdef DEBUG_TIMESTAMPS + pts_highBit = (nextByte&0x08)>>3; + pts_remainingBits = (nextByte&0x06)<<29; + unsigned next4Bytes = get4Bytes(); + pts_remainingBits |= (next4Bytes&0xFFFE0000)>>2; + pts_remainingBits |= (next4Bytes&0x0000FFFE)>>1; + + nextByte = get1Byte(); + dts_highBit = (nextByte&0x08)>>3; + dts_remainingBits = (nextByte&0x06)<<29; + next4Bytes = get4Bytes(); + dts_remainingBits |= (next4Bytes&0xFFFE0000)>>2; + dts_remainingBits |= (next4Bytes&0x0000FFFE)>>1; +#else + skipBytes(9); +#endif + } + } + } else { // assume MPEG-2 + if (!isSpecialStreamId(stream_id)) { + // Fields in the next 3 bytes determine the size of the rest: + unsigned next3Bytes = getBits(24); +#ifdef DEBUG_TIMESTAMPS + unsigned char PTS_DTS_flags = (next3Bytes&0x00C000)>>14; +#endif +#ifdef undef + unsigned char ESCR_flag = (next3Bytes&0x002000)>>13; + unsigned char ES_rate_flag = (next3Bytes&0x001000)>>12; + unsigned char DSM_trick_mode_flag = (next3Bytes&0x000800)>>11; +#endif + unsigned char PES_header_data_length = (next3Bytes&0x0000FF); +#ifdef DEBUG + fprintf(stderr, "PES_header_data_length: 0x%02x\n", PES_header_data_length); fflush(stderr); +#endif +#ifdef DEBUG_TIMESTAMPS + if (PTS_DTS_flags == 0x2 && PES_header_data_length >= 5) { + unsigned char nextByte = get1Byte(); + pts_highBit = (nextByte&0x08)>>3; + pts_remainingBits = (nextByte&0x06)<<29; + unsigned next4Bytes = get4Bytes(); + pts_remainingBits |= (next4Bytes&0xFFFE0000)>>2; + pts_remainingBits |= (next4Bytes&0x0000FFFE)>>1; + + skipBytes(PES_header_data_length-5); + } else if (PTS_DTS_flags == 0x3 && PES_header_data_length >= 10) { + unsigned char nextByte = get1Byte(); + pts_highBit = (nextByte&0x08)>>3; + pts_remainingBits = (nextByte&0x06)<<29; + unsigned next4Bytes = get4Bytes(); + pts_remainingBits |= (next4Bytes&0xFFFE0000)>>2; + pts_remainingBits |= (next4Bytes&0x0000FFFE)>>1; + + nextByte = get1Byte(); + dts_highBit = (nextByte&0x08)>>3; + dts_remainingBits = (nextByte&0x06)<<29; + next4Bytes = get4Bytes(); + dts_remainingBits |= (next4Bytes&0xFFFE0000)>>2; + dts_remainingBits |= (next4Bytes&0x0000FFFE)>>1; + + skipBytes(PES_header_data_length-10); + } +#else + skipBytes(PES_header_data_length); +#endif + } + } +#ifdef DEBUG_TIMESTAMPS + fprintf(stderr, "%s stream, ", streamTypeStr); + fprintf(stderr, "packet presentation_time_stamp: 0x%x", pts_highBit); + fprintf(stderr, "%08x\n", pts_remainingBits); + fprintf(stderr, "\t\tpacket decoding_time_stamp: 0x%x", dts_highBit); + fprintf(stderr, "%08x\n", dts_remainingBits); +#endif + + // The rest of the packet will be the "PES_packet_data_byte"s + // Make sure that "PES_packet_length" was consistent with where we are now: + unsigned char acquiredStreamIdTag = 0; + unsigned currentParserOffset = curOffset(); + unsigned bytesSkipped = currentParserOffset - savedParserOffset; + if (stream_id == RAW_PES) { + restoreSavedParserState(); // so we deliver from the beginning of the PES packet + PES_packet_length += 6; // to include the whole of the PES packet + bytesSkipped = 0; + } + if (PES_packet_length < bytesSkipped) { + fUsingDemux->envir() << "StreamParser::parsePESPacket(): saw inconsistent PES_packet_length " + << PES_packet_length << " < " + << bytesSkipped << "\n"; + } else { + PES_packet_length -= bytesSkipped; +#ifdef DEBUG + unsigned next4Bytes = test4Bytes(); +#endif + + // Check whether our using source is interested in this stream type. + // If so, deliver the frame to him: + MPEG1or2Demux::OutputDescriptor_t& out = fUsingDemux->fOutput[stream_id]; + if (out.isCurrentlyAwaitingData) { + unsigned numBytesToCopy; + if (PES_packet_length > out.maxSize) { + fUsingDemux->envir() << "MPEGProgramStreamParser::parsePESPacket() error: PES_packet_length (" + << PES_packet_length + << ") exceeds max frame size asked for (" + << out.maxSize << ")\n"; + numBytesToCopy = out.maxSize; + } else { + numBytesToCopy = PES_packet_length; + } + + getBytes(out.to, numBytesToCopy); + out.frameSize = numBytesToCopy; +#ifdef DEBUG + fprintf(stderr, "%d, %d bytes of PES_packet_data (out.maxSize: %d); first 4 bytes: 0x%08x\n", frameCount, numBytesToCopy, out.maxSize, next4Bytes); fflush(stderr); +#endif + // set out.presentationTime later ##### + acquiredStreamIdTag = stream_id; + PES_packet_length -= numBytesToCopy; + } else if (out.isCurrentlyActive) { + // Someone has been reading this stream, but isn't right now. + // We can't deliver this frame until he asks for it, so punt for now. + // The next time he asks for a frame, he'll get it. +#ifdef DEBUG + fprintf(stderr, "%d, currently undeliverable PES data; first 4 bytes: 0x%08x - currently undeliverable!\n", frameCount, next4Bytes); fflush(stderr); +#endif + restoreSavedParserState(); // so we read from the beginning next time + fUsingDemux->fHaveUndeliveredData = True; + throw READER_NOT_READY; + } else if (out.isPotentiallyReadable && + out.savedDataTotalSize + PES_packet_length < 1000000 /*limit*/) { + // Someone is interested in this stream, but hasn't begun reading it yet. + // Save this data, so that the reader will get it when he later asks for it. + unsigned char* buf = new unsigned char[PES_packet_length]; + getBytes(buf, PES_packet_length); + MPEG1or2Demux::OutputDescriptor::SavedData* savedData + = new MPEG1or2Demux::OutputDescriptor::SavedData(buf, PES_packet_length); + if (out.savedDataHead == NULL) { + out.savedDataHead = out.savedDataTail = savedData; + } else { + out.savedDataTail->next = savedData; + out.savedDataTail = savedData; + } + out.savedDataTotalSize += PES_packet_length; + PES_packet_length = 0; + } + skipBytes(PES_packet_length); + } + + // Check for another PES Packet next: + setParseState(PARSING_PES_PACKET); +#ifdef DEBUG + ++frameCount; +#endif + return acquiredStreamIdTag; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MPEG1or2DemuxedElementaryStream.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MPEG1or2DemuxedElementaryStream.cpp new file mode 100644 index 000000000..b046ecab0 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MPEG1or2DemuxedElementaryStream.cpp @@ -0,0 +1,88 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A MPEG 1 or 2 Elementary Stream, demultiplexed from a Program Stream +// Implementation + +#include "MPEG1or2DemuxedElementaryStream.hh" + +////////// MPEG1or2DemuxedElementaryStream ////////// + +MPEG1or2DemuxedElementaryStream:: +MPEG1or2DemuxedElementaryStream(UsageEnvironment& env, u_int8_t streamIdTag, + MPEG1or2Demux& sourceDemux) + : FramedSource(env), + fOurStreamIdTag(streamIdTag), fOurSourceDemux(sourceDemux), fMPEGversion(0) { + // Set our MIME type string for known media types: + if ((streamIdTag&0xE0) == 0xC0) { + fMIMEtype = "audio/MPEG"; + } else if ((streamIdTag&0xF0) == 0xE0) { + fMIMEtype = "video/MPEG"; + } else { + fMIMEtype = MediaSource::MIMEtype(); + } +} + +MPEG1or2DemuxedElementaryStream::~MPEG1or2DemuxedElementaryStream() { + fOurSourceDemux.noteElementaryStreamDeletion(this); +} + +void MPEG1or2DemuxedElementaryStream::doGetNextFrame() { + fOurSourceDemux.getNextFrame(fOurStreamIdTag, fTo, fMaxSize, + afterGettingFrame, this, + handleClosure, this); +} + +void MPEG1or2DemuxedElementaryStream::doStopGettingFrames() { + fOurSourceDemux.stopGettingFrames(fOurStreamIdTag); +} + +char const* MPEG1or2DemuxedElementaryStream::MIMEtype() const { + return fMIMEtype; +} + +unsigned MPEG1or2DemuxedElementaryStream::maxFrameSize() const { + return 6+65535; + // because the MPEG spec allows for PES packets as large as + // (6 + 65535) bytes (header + data) +} + +void MPEG1or2DemuxedElementaryStream +::afterGettingFrame(void* clientData, + unsigned frameSize, unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds) { + MPEG1or2DemuxedElementaryStream* stream + = (MPEG1or2DemuxedElementaryStream*)clientData; + stream->afterGettingFrame1(frameSize, numTruncatedBytes, + presentationTime, durationInMicroseconds); +} + +void MPEG1or2DemuxedElementaryStream +::afterGettingFrame1(unsigned frameSize, unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds) { + fFrameSize = frameSize; + fNumTruncatedBytes = numTruncatedBytes; + fPresentationTime = presentationTime; + fDurationInMicroseconds = durationInMicroseconds; + + fLastSeenSCR = fOurSourceDemux.lastSeenSCR(); + fMPEGversion = fOurSourceDemux.mpegVersion(); + + FramedSource::afterGetting(this); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MPEG1or2DemuxedServerMediaSubsession.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MPEG1or2DemuxedServerMediaSubsession.cpp new file mode 100644 index 000000000..8a606184d --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MPEG1or2DemuxedServerMediaSubsession.cpp @@ -0,0 +1,134 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A 'ServerMediaSubsession' object that creates new, unicast, "RTPSink"s +// on demand, from a MPEG-1 or 2 demuxer. +// Implementation + +#include "MPEG1or2DemuxedServerMediaSubsession.hh" +#include "MPEG1or2AudioStreamFramer.hh" +#include "MPEG1or2AudioRTPSink.hh" +#include "MPEG1or2VideoStreamFramer.hh" +#include "MPEG1or2VideoRTPSink.hh" +#include "AC3AudioStreamFramer.hh" +#include "AC3AudioRTPSink.hh" +#include "ByteStreamFileSource.hh" + +MPEG1or2DemuxedServerMediaSubsession* MPEG1or2DemuxedServerMediaSubsession +::createNew(MPEG1or2FileServerDemux& demux, u_int8_t streamIdTag, + Boolean reuseFirstSource, Boolean iFramesOnly, double vshPeriod) { + return new MPEG1or2DemuxedServerMediaSubsession(demux, streamIdTag, + reuseFirstSource, + iFramesOnly, vshPeriod); +} + +MPEG1or2DemuxedServerMediaSubsession +::MPEG1or2DemuxedServerMediaSubsession(MPEG1or2FileServerDemux& demux, + u_int8_t streamIdTag, Boolean reuseFirstSource, + Boolean iFramesOnly, double vshPeriod) + : OnDemandServerMediaSubsession(demux.envir(), reuseFirstSource), + fOurDemux(demux), fStreamIdTag(streamIdTag), + fIFramesOnly(iFramesOnly), fVSHPeriod(vshPeriod) { +} + +MPEG1or2DemuxedServerMediaSubsession::~MPEG1or2DemuxedServerMediaSubsession() { +} + +FramedSource* MPEG1or2DemuxedServerMediaSubsession +::createNewStreamSource(unsigned clientSessionId, unsigned& estBitrate) { + FramedSource* es = NULL; + do { + es = fOurDemux.newElementaryStream(clientSessionId, fStreamIdTag); + if (es == NULL) break; + + if ((fStreamIdTag&0xF0) == 0xC0 /*MPEG audio*/) { + estBitrate = 128; // kbps, estimate + return MPEG1or2AudioStreamFramer::createNew(envir(), es); + } else if ((fStreamIdTag&0xF0) == 0xE0 /*video*/) { + estBitrate = 500; // kbps, estimate + return MPEG1or2VideoStreamFramer::createNew(envir(), es, + fIFramesOnly, fVSHPeriod); + } else if (fStreamIdTag == 0xBD /*AC-3 audio*/) { + estBitrate = 192; // kbps, estimate + return AC3AudioStreamFramer::createNew(envir(), es, 0x80); + } else { // unknown stream type + break; + } + } while (0); + + // An error occurred: + Medium::close(es); + return NULL; +} + +RTPSink* MPEG1or2DemuxedServerMediaSubsession +::createNewRTPSink(Groupsock* rtpGroupsock, unsigned char rtpPayloadTypeIfDynamic, + FramedSource* inputSource) { + if ((fStreamIdTag&0xF0) == 0xC0 /*MPEG audio*/) { + return MPEG1or2AudioRTPSink::createNew(envir(), rtpGroupsock); + } else if ((fStreamIdTag&0xF0) == 0xE0 /*video*/) { + return MPEG1or2VideoRTPSink::createNew(envir(), rtpGroupsock); + } else if (fStreamIdTag == 0xBD /*AC-3 audio*/) { + // Get the sampling frequency from the audio source; use it for the RTP frequency: + AC3AudioStreamFramer* audioSource + = (AC3AudioStreamFramer*)inputSource; + return AC3AudioRTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic, + audioSource->samplingRate()); + } else { + return NULL; + } +} + +void MPEG1or2DemuxedServerMediaSubsession +::seekStreamSource(FramedSource* inputSource, double& seekNPT, double /*streamDuration*/, u_int64_t& /*numBytes*/) { + float const dur = duration(); + unsigned const size = fOurDemux.fileSize(); + unsigned absBytePosition = dur == 0.0 ? 0 : (unsigned)((seekNPT/dur)*size); + + // "inputSource" is a 'framer' + // Flush its data, to account for the seek that we're about to do: + if ((fStreamIdTag&0xF0) == 0xC0 /*MPEG audio*/) { + MPEG1or2AudioStreamFramer* framer = (MPEG1or2AudioStreamFramer*)inputSource; + framer->flushInput(); + } else if ((fStreamIdTag&0xF0) == 0xE0 /*video*/) { + MPEG1or2VideoStreamFramer* framer = (MPEG1or2VideoStreamFramer*)inputSource; + framer->flushInput(); + } + + // "inputSource" is a filter; its input source is the original elem stream source: + MPEG1or2DemuxedElementaryStream* elemStreamSource + = (MPEG1or2DemuxedElementaryStream*)(((FramedFilter*)inputSource)->inputSource()); + + // Next, get the original source demux: + MPEG1or2Demux& sourceDemux = elemStreamSource->sourceDemux(); + + // and flush its input buffers: + sourceDemux.flushInput(); + + // Then, get the original input file stream from the source demux: + ByteStreamFileSource* inputFileSource + = (ByteStreamFileSource*)(sourceDemux.inputSource()); + // Note: We can make that cast, because we know that the demux was originally + // created from a "ByteStreamFileSource". + + // Do the appropriate seek within the input file stream: + inputFileSource->seekToByteAbsolute(absBytePosition); +} + +float MPEG1or2DemuxedServerMediaSubsession::duration() const { + return fOurDemux.fileDuration(); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MPEG1or2FileServerDemux.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MPEG1or2FileServerDemux.cpp new file mode 100644 index 000000000..55874ea62 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MPEG1or2FileServerDemux.cpp @@ -0,0 +1,273 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A server demultiplexer for a MPEG 1 or 2 Program Stream +// Implementation + +#include "MPEG1or2FileServerDemux.hh" +#include "MPEG1or2DemuxedServerMediaSubsession.hh" +#include "ByteStreamFileSource.hh" + +MPEG1or2FileServerDemux* +MPEG1or2FileServerDemux::createNew(UsageEnvironment& env, char const* fileName, + Boolean reuseFirstSource) { + return new MPEG1or2FileServerDemux(env, fileName, reuseFirstSource); +} + +static float MPEG1or2ProgramStreamFileDuration(UsageEnvironment& env, + char const* fileName, + unsigned& fileSize); // forward +MPEG1or2FileServerDemux +::MPEG1or2FileServerDemux(UsageEnvironment& env, char const* fileName, + Boolean reuseFirstSource) + : Medium(env), + fReuseFirstSource(reuseFirstSource), + fSession0Demux(NULL), fLastCreatedDemux(NULL), fLastClientSessionId(~0) { + fFileName = strDup(fileName); + fFileDuration = MPEG1or2ProgramStreamFileDuration(env, fileName, fFileSize); +} + +MPEG1or2FileServerDemux::~MPEG1or2FileServerDemux() { + Medium::close(fSession0Demux); + delete[] (char*)fFileName; +} + +ServerMediaSubsession* +MPEG1or2FileServerDemux::newAudioServerMediaSubsession() { + return MPEG1or2DemuxedServerMediaSubsession::createNew(*this, 0xC0, fReuseFirstSource); +} + +ServerMediaSubsession* +MPEG1or2FileServerDemux::newVideoServerMediaSubsession(Boolean iFramesOnly, + double vshPeriod) { + return MPEG1or2DemuxedServerMediaSubsession::createNew(*this, 0xE0, fReuseFirstSource, + iFramesOnly, vshPeriod); +} + +ServerMediaSubsession* +MPEG1or2FileServerDemux::newAC3AudioServerMediaSubsession() { + return MPEG1or2DemuxedServerMediaSubsession::createNew(*this, 0xBD, fReuseFirstSource); + // because, in a VOB file, the AC3 audio has stream id 0xBD +} + +MPEG1or2DemuxedElementaryStream* +MPEG1or2FileServerDemux::newElementaryStream(unsigned clientSessionId, + u_int8_t streamIdTag) { + MPEG1or2Demux* demuxToUse = NULL; + + if (clientSessionId == 0) { + // 'Session 0' is treated especially, because its audio & video streams + // are created and destroyed one-at-a-time, rather than both streams being + // created, and then (later) both streams being destroyed (as is the case + // for other ('real') session ids). Because of this, a separate demux is + // used for session 0, and its deletion is managed by us, rather than + // happening automatically. + if (fSession0Demux == NULL) { + // Open our input file as a 'byte-stream file source': + ByteStreamFileSource* fileSource + = ByteStreamFileSource::createNew(envir(), fFileName); + if (fileSource == NULL) return NULL; + fSession0Demux = MPEG1or2Demux::createNew(envir(), fileSource, False/*note!*/); + } + demuxToUse = fSession0Demux; + } else { + // First, check whether this is a new client session. If so, create a new + // demux for it: + if (clientSessionId == fLastClientSessionId) { + demuxToUse = fLastCreatedDemux; // use the same demultiplexor as before + } + + if (demuxToUse == NULL) { + // Open our input file as a 'byte-stream file source': + ByteStreamFileSource* fileSource + = ByteStreamFileSource::createNew(envir(), fFileName); + if (fileSource == NULL) return NULL; + + demuxToUse = MPEG1or2Demux::createNew(envir(), fileSource, True, onDemuxDeletion, this); + // Note: We tell the demux to delete itself when its last + // elementary stream is deleted. + } + + fLastClientSessionId = clientSessionId; + fLastCreatedDemux = demuxToUse; + } + + return demuxToUse->newElementaryStream(streamIdTag); +} + +void MPEG1or2FileServerDemux::onDemuxDeletion(void* clientData, MPEG1or2Demux* demuxBeingDeleted) { + ((MPEG1or2FileServerDemux*)clientData)->onDemuxDeletion(demuxBeingDeleted); +} + +void MPEG1or2FileServerDemux::onDemuxDeletion(MPEG1or2Demux* demuxBeingDeleted) { + if (fLastCreatedDemux == demuxBeingDeleted) fLastCreatedDemux = NULL; +} + + +static Boolean getMPEG1or2TimeCode(FramedSource* dataSource, + MPEG1or2Demux& parentDemux, + Boolean returnFirstSeenCode, + float& timeCode); // forward + +static float MPEG1or2ProgramStreamFileDuration(UsageEnvironment& env, + char const* fileName, + unsigned& fileSize) { + FramedSource* dataSource = NULL; + float duration = 0.0; // until we learn otherwise + fileSize = 0; // ditto + + do { + // Open the input file as a 'byte-stream file source': + ByteStreamFileSource* fileSource = ByteStreamFileSource::createNew(env, fileName); + if (fileSource == NULL) break; + dataSource = fileSource; + + fileSize = (unsigned)(fileSource->fileSize()); + if (fileSize == 0) break; + + // Create a MPEG demultiplexor that reads from that source. + MPEG1or2Demux* baseDemux = MPEG1or2Demux::createNew(env, dataSource, True); + if (baseDemux == NULL) break; + + // Create, from this, a source that returns raw PES packets: + dataSource = baseDemux->newRawPESStream(); + + // Read the first time code from the file: + float firstTimeCode; + if (!getMPEG1or2TimeCode(dataSource, *baseDemux, True, firstTimeCode)) break; + + // Then, read the last time code from the file. + // (Before doing this, flush the demux's input buffers, + // and seek towards the end of the file, for efficiency.) + baseDemux->flushInput(); + unsigned const startByteFromEnd = 100000; + unsigned newFilePosition + = fileSize < startByteFromEnd ? 0 : fileSize - startByteFromEnd; + if (newFilePosition > 0) fileSource->seekToByteAbsolute(newFilePosition); + + float lastTimeCode; + if (!getMPEG1or2TimeCode(dataSource, *baseDemux, False, lastTimeCode)) break; + + // Take the difference between these time codes as being the file duration: + float timeCodeDiff = lastTimeCode - firstTimeCode; + if (timeCodeDiff < 0) break; + duration = timeCodeDiff; + } while (0); + + Medium::close(dataSource); + return duration; +} + +#define MFSD_DUMMY_SINK_BUFFER_SIZE (6+65535) /* large enough for a PES packet */ + +class MFSD_DummySink: public MediaSink { +public: + MFSD_DummySink(MPEG1or2Demux& demux, Boolean returnFirstSeenCode); + virtual ~MFSD_DummySink(); + + char watchVariable; + +private: + // redefined virtual function: + virtual Boolean continuePlaying(); + +private: + static void afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + void afterGettingFrame1(); + +private: + MPEG1or2Demux& fOurDemux; + Boolean fReturnFirstSeenCode; + unsigned char fBuf[MFSD_DUMMY_SINK_BUFFER_SIZE]; +}; + +static void afterPlayingMFSD_DummySink(MFSD_DummySink* sink); // forward +static float computeSCRTimeCode(MPEG1or2Demux::SCR const& scr); // forward + +static Boolean getMPEG1or2TimeCode(FramedSource* dataSource, + MPEG1or2Demux& parentDemux, + Boolean returnFirstSeenCode, + float& timeCode) { + // Start reading through "dataSource", until we see a SCR time code: + parentDemux.lastSeenSCR().isValid = False; + UsageEnvironment& env = dataSource->envir(); // alias + MFSD_DummySink sink(parentDemux, returnFirstSeenCode); + sink.startPlaying(*dataSource, + (MediaSink::afterPlayingFunc*)afterPlayingMFSD_DummySink, &sink); + env.taskScheduler().doEventLoop(&sink.watchVariable); + + timeCode = computeSCRTimeCode(parentDemux.lastSeenSCR()); + return parentDemux.lastSeenSCR().isValid; +} + + +////////// MFSD_DummySink implementation ////////// + +MFSD_DummySink::MFSD_DummySink(MPEG1or2Demux& demux, Boolean returnFirstSeenCode) + : MediaSink(demux.envir()), + watchVariable(0), fOurDemux(demux), fReturnFirstSeenCode(returnFirstSeenCode) { +} + +MFSD_DummySink::~MFSD_DummySink() { +} + +Boolean MFSD_DummySink::continuePlaying() { + if (fSource == NULL) return False; // sanity check + + fSource->getNextFrame(fBuf, sizeof fBuf, + afterGettingFrame, this, + onSourceClosure, this); + return True; +} + +void MFSD_DummySink::afterGettingFrame(void* clientData, unsigned /*frameSize*/, + unsigned /*numTruncatedBytes*/, + struct timeval /*presentationTime*/, + unsigned /*durationInMicroseconds*/) { + MFSD_DummySink* sink = (MFSD_DummySink*)clientData; + sink->afterGettingFrame1(); +} + +void MFSD_DummySink::afterGettingFrame1() { + if (fReturnFirstSeenCode && fOurDemux.lastSeenSCR().isValid) { + // We were asked to return the first SCR that we saw, and we've seen one, + // so we're done. (Handle this as if the input source had closed.) + onSourceClosure(); + return; + } + + continuePlaying(); +} + +static void afterPlayingMFSD_DummySink(MFSD_DummySink* sink) { + // Return from the "doEventLoop()" call: + sink->watchVariable = ~0; +} + +static float computeSCRTimeCode(MPEG1or2Demux::SCR const& scr) { + double result = scr.remainingBits/90000.0 + scr.extension/300.0; + if (scr.highBit) { + // Add (2^32)/90000 == (2^28)/5625 + double const highBitValue = (256*1024*1024)/5625.0; + result += highBitValue; + } + + return (float)result; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MPEG1or2VideoFileServerMediaSubsession.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MPEG1or2VideoFileServerMediaSubsession.cpp new file mode 100644 index 000000000..617f46239 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MPEG1or2VideoFileServerMediaSubsession.cpp @@ -0,0 +1,69 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A 'ServerMediaSubsession' object that creates new, unicast, "RTPSink"s +// on demand, from a MPEG-1 or 2 Elementary Stream video file. +// Implementation + +#include "MPEG1or2VideoFileServerMediaSubsession.hh" +#include "MPEG1or2VideoRTPSink.hh" +#include "ByteStreamFileSource.hh" +#include "MPEG1or2VideoStreamFramer.hh" + +MPEG1or2VideoFileServerMediaSubsession* +MPEG1or2VideoFileServerMediaSubsession::createNew(UsageEnvironment& env, + char const* fileName, + Boolean reuseFirstSource, + Boolean iFramesOnly, + double vshPeriod) { + return new MPEG1or2VideoFileServerMediaSubsession(env, fileName, reuseFirstSource, + iFramesOnly, vshPeriod); +} + +MPEG1or2VideoFileServerMediaSubsession +::MPEG1or2VideoFileServerMediaSubsession(UsageEnvironment& env, + char const* fileName, + Boolean reuseFirstSource, + Boolean iFramesOnly, + double vshPeriod) + : FileServerMediaSubsession(env, fileName, reuseFirstSource), + fIFramesOnly(iFramesOnly), fVSHPeriod(vshPeriod) { +} + +MPEG1or2VideoFileServerMediaSubsession +::~MPEG1or2VideoFileServerMediaSubsession() { +} + +FramedSource* MPEG1or2VideoFileServerMediaSubsession +::createNewStreamSource(unsigned /*clientSessionId*/, unsigned& estBitrate) { + estBitrate = 500; // kbps, estimate + + ByteStreamFileSource* fileSource + = ByteStreamFileSource::createNew(envir(), fFileName); + if (fileSource == NULL) return NULL; + fFileSize = fileSource->fileSize(); + + return MPEG1or2VideoStreamFramer + ::createNew(envir(), fileSource, fIFramesOnly, fVSHPeriod); +} + +RTPSink* MPEG1or2VideoFileServerMediaSubsession +::createNewRTPSink(Groupsock* rtpGroupsock, + unsigned char /*rtpPayloadTypeIfDynamic*/, + FramedSource* /*inputSource*/) { + return MPEG1or2VideoRTPSink::createNew(envir(), rtpGroupsock); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MPEG1or2VideoRTPSink.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MPEG1or2VideoRTPSink.cpp new file mode 100644 index 000000000..4873d7b0b --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MPEG1or2VideoRTPSink.cpp @@ -0,0 +1,175 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP sink for MPEG video (RFC 2250) +// Implementation + +#include "MPEG1or2VideoRTPSink.hh" +#include "MPEG1or2VideoStreamFramer.hh" + +MPEG1or2VideoRTPSink::MPEG1or2VideoRTPSink(UsageEnvironment& env, Groupsock* RTPgs) + : VideoRTPSink(env, RTPgs, 32, 90000, "MPV") { + fPictureState.temporal_reference = 0; + fPictureState.picture_coding_type = fPictureState.vector_code_bits = 0; +} + +MPEG1or2VideoRTPSink::~MPEG1or2VideoRTPSink() { +} + +MPEG1or2VideoRTPSink* +MPEG1or2VideoRTPSink::createNew(UsageEnvironment& env, Groupsock* RTPgs) { + return new MPEG1or2VideoRTPSink(env, RTPgs); +} + +Boolean MPEG1or2VideoRTPSink::sourceIsCompatibleWithUs(MediaSource& source) { + // Our source must be an appropriate framer: + return source.isMPEG1or2VideoStreamFramer(); +} + +Boolean MPEG1or2VideoRTPSink::allowFragmentationAfterStart() const { + return True; +} + +Boolean MPEG1or2VideoRTPSink +::frameCanAppearAfterPacketStart(unsigned char const* frameStart, + unsigned numBytesInFrame) const { + // A 'frame' (which in this context can mean a header or a slice as well as a + // complete picture) can appear at other than the first position in a packet + // in all situations, EXCEPT when it follows the end of (i.e., the last slice + // of) a picture. I.e., the headers at the beginning of a picture must + // appear at the start of a RTP packet. + if (!fPreviousFrameWasSlice) return True; + + // A slice is already packed into this packet. We allow this new 'frame' + // to be packed after it, provided that it is also a slice: + return numBytesInFrame >= 4 + && frameStart[0] == 0 && frameStart[1] == 0 && frameStart[2] == 1 + && frameStart[3] >= 1 && frameStart[3] <= 0xAF; +} + +#define VIDEO_SEQUENCE_HEADER_START_CODE 0x000001B3 +#define PICTURE_START_CODE 0x00000100 + +void MPEG1or2VideoRTPSink +::doSpecialFrameHandling(unsigned fragmentationOffset, + unsigned char* frameStart, + unsigned numBytesInFrame, + struct timeval framePresentationTime, + unsigned numRemainingBytes) { + Boolean thisFrameIsASlice = False; // until we learn otherwise + if (isFirstFrameInPacket()) { + fSequenceHeaderPresent = fPacketBeginsSlice = fPacketEndsSlice = False; + } + + if (fragmentationOffset == 0) { + // Begin by inspecting the 4-byte code at the start of the frame: + if (numBytesInFrame < 4) return; // shouldn't happen + unsigned startCode = (frameStart[0]<<24) | (frameStart[1]<<16) + | (frameStart[2]<<8) | frameStart[3]; + + if (startCode == VIDEO_SEQUENCE_HEADER_START_CODE) { + // This is a video sequence header + fSequenceHeaderPresent = True; + } else if (startCode == PICTURE_START_CODE) { + // This is a picture header + + // Record the parameters of this picture: + if (numBytesInFrame < 8) return; // shouldn't happen + unsigned next4Bytes = (frameStart[4]<<24) | (frameStart[5]<<16) + | (frameStart[6]<<8) | frameStart[7]; + unsigned char byte8 = numBytesInFrame == 8 ? 0 : frameStart[8]; + + fPictureState.temporal_reference = (next4Bytes&0xFFC00000)>>(32-10); + fPictureState.picture_coding_type = (next4Bytes&0x00380000)>>(32-(10+3)); + + unsigned char FBV, BFC, FFV, FFC; + FBV = BFC = FFV = FFC = 0; + switch (fPictureState.picture_coding_type) { + case 3: + FBV = (byte8&0x40)>>6; + BFC = (byte8&0x38)>>3; + // fall through to: + case 2: + FFV = (next4Bytes&0x00000004)>>2; + FFC = ((next4Bytes&0x00000003)<<1) | ((byte8&0x80)>>7); + } + + fPictureState.vector_code_bits = (FBV<<7) | (BFC<<4) | (FFV<<3) | FFC; + } else if ((startCode&0xFFFFFF00) == 0x00000100) { + unsigned char lastCodeByte = startCode&0xFF; + + if (lastCodeByte <= 0xAF) { + // This is (the start of) a slice + thisFrameIsASlice = True; + } else { + // This is probably a GOP header; we don't do anything with this + } + } else { + // The first 4 bytes aren't a code that we recognize. + envir() << "Warning: MPEG1or2VideoRTPSink::doSpecialFrameHandling saw strange first 4 bytes " + << (void*)startCode << ", but we're not a fragment\n"; + } + } else { + // We're a fragment (other than the first) of a slice. + thisFrameIsASlice = True; + } + + if (thisFrameIsASlice) { + // This packet begins a slice iff there's no fragmentation offset: + fPacketBeginsSlice = (fragmentationOffset == 0); + + // This packet also ends a slice iff there are no fragments remaining: + fPacketEndsSlice = (numRemainingBytes == 0); + } + + // Set the video-specific header based on the parameters that we've seen. + // Note that this may get done more than once, if several frames appear + // in the packet. That's OK, because this situation happens infrequently, + // and we want the video-specific header to reflect the most up-to-date + // information (in particular, from a Picture Header) anyway. + unsigned videoSpecificHeader = + // T == 0 + (fPictureState.temporal_reference<<16) | + // AN == N == 0 + (fSequenceHeaderPresent<<13) | + (fPacketBeginsSlice<<12) | + (fPacketEndsSlice<<11) | + (fPictureState.picture_coding_type<<8) | + fPictureState.vector_code_bits; + setSpecialHeaderWord(videoSpecificHeader); + + // Also set the RTP timestamp. (As above, we do this for each frame + // in the packet.) + setTimestamp(framePresentationTime); + + // Set the RTP 'M' (marker) bit iff this frame ends (i.e., is the last + // slice of) a picture (and there are no fragments remaining). + // This relies on the source being a "MPEG1or2VideoStreamFramer". + MPEG1or2VideoStreamFramer* framerSource = (MPEG1or2VideoStreamFramer*)fSource; + if (framerSource != NULL && framerSource->pictureEndMarker() + && numRemainingBytes == 0) { + setMarkerBit(); + framerSource->pictureEndMarker() = False; + } + + fPreviousFrameWasSlice = thisFrameIsASlice; +} + +unsigned MPEG1or2VideoRTPSink::specialHeaderSize() const { + // There's a 4 byte special video header: + return 4; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MPEG1or2VideoRTPSource.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MPEG1or2VideoRTPSource.cpp new file mode 100644 index 000000000..2fc29672c --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MPEG1or2VideoRTPSource.cpp @@ -0,0 +1,82 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// MPEG-1 or MPEG-2 Video RTP Sources +// Implementation + +#include "MPEG1or2VideoRTPSource.hh" + +MPEG1or2VideoRTPSource* +MPEG1or2VideoRTPSource::createNew(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency) { + return new MPEG1or2VideoRTPSource(env, RTPgs, rtpPayloadFormat, + rtpTimestampFrequency); +} + +MPEG1or2VideoRTPSource::MPEG1or2VideoRTPSource(UsageEnvironment& env, + Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency) + : MultiFramedRTPSource(env, RTPgs, + rtpPayloadFormat, rtpTimestampFrequency){ +} + +MPEG1or2VideoRTPSource::~MPEG1or2VideoRTPSource() { +} + +Boolean MPEG1or2VideoRTPSource +::processSpecialHeader(BufferedPacket* packet, + unsigned& resultSpecialHeaderSize) { + // There's a 4-byte video-specific header + if (packet->dataSize() < 4) return False; + + u_int32_t header = ntohl(*(u_int32_t*)(packet->data())); + + u_int32_t sBit = header&0x00002000; // sequence-header-present + u_int32_t bBit = header&0x00001000; // beginning-of-slice + u_int32_t eBit = header&0x00000800; // end-of-slice + + fCurrentPacketBeginsFrame = (sBit|bBit) != 0; + fCurrentPacketCompletesFrame = ((sBit != 0) && (bBit == 0)) || (eBit != 0); + + resultSpecialHeaderSize = 4; + return True; +} + +Boolean MPEG1or2VideoRTPSource +::packetIsUsableInJitterCalculation(unsigned char* packet, + unsigned packetSize) { + // There's a 4-byte video-specific header + if (packetSize < 4) return False; + + // Extract the "Picture-Type" field from this, to determine whether + // this packet can be used in jitter calculations: + unsigned header = ntohl(*(u_int32_t*)packet); + + unsigned short pictureType = (header>>8)&0x7; + if (pictureType == 1) { // an I frame + return True; + } else { // a P, B, D, or other unknown frame type + return False; + } +} + +char const* MPEG1or2VideoRTPSource::MIMEtype() const { + return "video/MPEG"; +} + diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MPEG1or2VideoStreamDiscreteFramer.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MPEG1or2VideoStreamDiscreteFramer.cpp new file mode 100644 index 000000000..487756125 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MPEG1or2VideoStreamDiscreteFramer.cpp @@ -0,0 +1,203 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A simplified version of "MPEG1or2VideoStreamFramer" that takes only +// complete, discrete frames (rather than an arbitrary byte stream) as input. +// This avoids the parsing and data copying overhead of the full +// "MPEG1or2VideoStreamFramer". +// Implementation + +#include "MPEG1or2VideoStreamDiscreteFramer.hh" + +MPEG1or2VideoStreamDiscreteFramer* +MPEG1or2VideoStreamDiscreteFramer::createNew(UsageEnvironment& env, + FramedSource* inputSource, + Boolean iFramesOnly, + double vshPeriod, + Boolean leavePresentationTimesUnmodified) { + // Need to add source type checking here??? ##### + return new MPEG1or2VideoStreamDiscreteFramer(env, inputSource, + iFramesOnly, vshPeriod, leavePresentationTimesUnmodified); +} + +MPEG1or2VideoStreamDiscreteFramer +::MPEG1or2VideoStreamDiscreteFramer(UsageEnvironment& env, + FramedSource* inputSource, + Boolean iFramesOnly, double vshPeriod, Boolean leavePresentationTimesUnmodified) + : MPEG1or2VideoStreamFramer(env, inputSource, iFramesOnly, vshPeriod, + False/*don't create a parser*/), + fLeavePresentationTimesUnmodified(leavePresentationTimesUnmodified), + fLastNonBFrameTemporal_reference(0), + fSavedVSHSize(0), fSavedVSHTimestamp(0.0), + fIFramesOnly(iFramesOnly), fVSHPeriod(vshPeriod) { + fLastNonBFramePresentationTime.tv_sec = 0; + fLastNonBFramePresentationTime.tv_usec = 0; +} + +MPEG1or2VideoStreamDiscreteFramer::~MPEG1or2VideoStreamDiscreteFramer() { +} + +void MPEG1or2VideoStreamDiscreteFramer::doGetNextFrame() { + // Arrange to read data (which should be a complete MPEG-1 or 2 video frame) + // from our data source, directly into the client's input buffer. + // After reading this, we'll do some parsing on the frame. + fInputSource->getNextFrame(fTo, fMaxSize, + afterGettingFrame, this, + FramedSource::handleClosure, this); +} + +void MPEG1or2VideoStreamDiscreteFramer +::afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds) { + MPEG1or2VideoStreamDiscreteFramer* source + = (MPEG1or2VideoStreamDiscreteFramer*)clientData; + source->afterGettingFrame1(frameSize, numTruncatedBytes, + presentationTime, durationInMicroseconds); +} + +static double const frameRateFromCode[] = { + 0.0, // forbidden + 24000/1001.0, // approx 23.976 + 24.0, + 25.0, + 30000/1001.0, // approx 29.97 + 30.0, + 50.0, + 60000/1001.0, // approx 59.94 + 60.0, + 0.0, // reserved + 0.0, // reserved + 0.0, // reserved + 0.0, // reserved + 0.0, // reserved + 0.0, // reserved + 0.0 // reserved +}; + +#define MILLION 1000000 + +void MPEG1or2VideoStreamDiscreteFramer +::afterGettingFrame1(unsigned frameSize, unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds) { + // Check that the first 4 bytes are a system code: + if (frameSize >= 4 && fTo[0] == 0 && fTo[1] == 0 && fTo[2] == 1) { + fPictureEndMarker = True; // Assume that we have a complete 'picture' here + + u_int8_t nextCode = fTo[3]; + if (nextCode == 0xB3) { // VIDEO_SEQUENCE_HEADER_START_CODE + // Note the following 'frame rate' code: + if (frameSize >= 8) { + u_int8_t frame_rate_code = fTo[7]&0x0F; + fFrameRate = frameRateFromCode[frame_rate_code]; + } + + // Also, save away this Video Sequence Header, in case we need it later: + // First, figure out how big it is: + unsigned vshSize; + for (vshSize = 4; vshSize < frameSize-3; ++vshSize) { + if (fTo[vshSize] == 0 && fTo[vshSize+1] == 0 && fTo[vshSize+2] == 1 && + (fTo[vshSize+3] == 0xB8 || fTo[vshSize+3] == 0x00)) break; + } + if (vshSize == frameSize-3) vshSize = frameSize; // There was nothing else following it + if (vshSize <= sizeof fSavedVSHBuffer) { + memmove(fSavedVSHBuffer, fTo, vshSize); + fSavedVSHSize = vshSize; + fSavedVSHTimestamp + = presentationTime.tv_sec + presentationTime.tv_usec/(double)MILLION; + } + } else if (nextCode == 0xB8) { // GROUP_START_CODE + // If necessary, insert a saved Video Sequence Header in front of this: + double pts = presentationTime.tv_sec + presentationTime.tv_usec/(double)MILLION; + if (pts > fSavedVSHTimestamp + fVSHPeriod && + fSavedVSHSize + frameSize <= fMaxSize) { + memmove(&fTo[fSavedVSHSize], &fTo[0], frameSize); // make room for the header + memmove(&fTo[0], fSavedVSHBuffer, fSavedVSHSize); // insert it + frameSize += fSavedVSHSize; + fSavedVSHTimestamp = pts; + } + } + + unsigned i = 3; + if (nextCode == 0xB3 /*VIDEO_SEQUENCE_HEADER_START_CODE*/ || + nextCode == 0xB8 /*GROUP_START_CODE*/) { + // Skip to the following PICTURE_START_CODE (if any): + for (i += 4; i < frameSize; ++i) { + if (fTo[i] == 0x00 /*PICTURE_START_CODE*/ + && fTo[i-1] == 1 && fTo[i-2] == 0 && fTo[i-3] == 0) { + nextCode = fTo[i]; + break; + } + } + } + + if (nextCode == 0x00 /*PICTURE_START_CODE*/ && i+2 < frameSize) { + // Get the 'temporal_reference' and 'picture_coding_type' from the + // following 2 bytes: + ++i; + unsigned short temporal_reference = (fTo[i]<<2)|(fTo[i+1]>>6); + unsigned char picture_coding_type = (fTo[i+1]&0x38)>>3; + + // If this is not an "I" frame, but we were asked for "I" frames only, then try again: + if (fIFramesOnly && picture_coding_type != 1) { + doGetNextFrame(); + return; + } + + // If this is a "B" frame, then we have to tweak "presentationTime": + if (!fLeavePresentationTimesUnmodified && picture_coding_type == 3/*B*/ + && (fLastNonBFramePresentationTime.tv_usec > 0 || + fLastNonBFramePresentationTime.tv_sec > 0)) { + int trIncrement + = fLastNonBFrameTemporal_reference - temporal_reference; + if (trIncrement < 0) trIncrement += 1024; // field is 10 bits in size + + unsigned usIncrement = fFrameRate == 0.0 ? 0 + : (unsigned)((trIncrement*MILLION)/fFrameRate); + unsigned secondsToSubtract = usIncrement/MILLION; + unsigned uSecondsToSubtract = usIncrement%MILLION; + + presentationTime = fLastNonBFramePresentationTime; + if ((unsigned)presentationTime.tv_usec < uSecondsToSubtract) { + presentationTime.tv_usec += MILLION; + if (presentationTime.tv_sec > 0) --presentationTime.tv_sec; + } + presentationTime.tv_usec -= uSecondsToSubtract; + if ((unsigned)presentationTime.tv_sec > secondsToSubtract) { + presentationTime.tv_sec -= secondsToSubtract; + } else { + presentationTime.tv_sec = presentationTime.tv_usec = 0; + } + } else { + fLastNonBFramePresentationTime = presentationTime; + fLastNonBFrameTemporal_reference = temporal_reference; + } + } + } + + // ##### Later: + // - do "iFramesOnly" if requested + + // Complete delivery to the client: + fFrameSize = frameSize; + fNumTruncatedBytes = numTruncatedBytes; + fPresentationTime = presentationTime; + fDurationInMicroseconds = durationInMicroseconds; + afterGetting(this); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MPEG1or2VideoStreamFramer.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MPEG1or2VideoStreamFramer.cpp new file mode 100644 index 000000000..6b2b96b2c --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MPEG1or2VideoStreamFramer.cpp @@ -0,0 +1,478 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A filter that breaks up an MPEG 1 or 2 video elementary stream into +// frames for: Video_Sequence_Header, GOP_Header, Picture_Header +// Implementation + +#include "MPEG1or2VideoStreamFramer.hh" +#include "MPEGVideoStreamParser.hh" +#include + +////////// MPEG1or2VideoStreamParser definition ////////// + +// An enum representing the current state of the parser: +enum MPEGParseState { + PARSING_VIDEO_SEQUENCE_HEADER, + PARSING_VIDEO_SEQUENCE_HEADER_SEEN_CODE, + PARSING_GOP_HEADER, + PARSING_GOP_HEADER_SEEN_CODE, + PARSING_PICTURE_HEADER, + PARSING_SLICE +}; + +#define VSH_MAX_SIZE 1000 + +class MPEG1or2VideoStreamParser: public MPEGVideoStreamParser { +public: + MPEG1or2VideoStreamParser(MPEG1or2VideoStreamFramer* usingSource, + FramedSource* inputSource, + Boolean iFramesOnly, double vshPeriod); + virtual ~MPEG1or2VideoStreamParser(); + +private: // redefined virtual functions: + virtual void flushInput(); + virtual unsigned parse(); + +private: + void reset(); + + MPEG1or2VideoStreamFramer* usingSource() { + return (MPEG1or2VideoStreamFramer*)fUsingSource; + } + void setParseState(MPEGParseState parseState); + + unsigned parseVideoSequenceHeader(Boolean haveSeenStartCode); + unsigned parseGOPHeader(Boolean haveSeenStartCode); + unsigned parsePictureHeader(); + unsigned parseSlice(); + +private: + MPEGParseState fCurrentParseState; + unsigned fPicturesSinceLastGOP; + // can be used to compute timestamp for a video_sequence_header + unsigned short fCurPicTemporalReference; + // used to compute slice timestamp + unsigned char fCurrentSliceNumber; // set when parsing a slice + + // A saved copy of the most recently seen 'video_sequence_header', + // in case we need to insert it into the stream periodically: + unsigned char fSavedVSHBuffer[VSH_MAX_SIZE]; + unsigned fSavedVSHSize; + double fSavedVSHTimestamp; + double fVSHPeriod; + Boolean fIFramesOnly, fSkippingCurrentPicture; + + void saveCurrentVSH(); + Boolean needToUseSavedVSH(); + unsigned useSavedVSH(); // returns the size of the saved VSH +}; + + +////////// MPEG1or2VideoStreamFramer implementation ////////// + +MPEG1or2VideoStreamFramer::MPEG1or2VideoStreamFramer(UsageEnvironment& env, + FramedSource* inputSource, + Boolean iFramesOnly, + double vshPeriod, + Boolean createParser) + : MPEGVideoStreamFramer(env, inputSource) { + fParser = createParser + ? new MPEG1or2VideoStreamParser(this, inputSource, + iFramesOnly, vshPeriod) + : NULL; +} + +MPEG1or2VideoStreamFramer::~MPEG1or2VideoStreamFramer() { +} + +MPEG1or2VideoStreamFramer* +MPEG1or2VideoStreamFramer::createNew(UsageEnvironment& env, + FramedSource* inputSource, + Boolean iFramesOnly, + double vshPeriod) { + // Need to add source type checking here??? ##### + return new MPEG1or2VideoStreamFramer(env, inputSource, iFramesOnly, vshPeriod); +} + +double MPEG1or2VideoStreamFramer::getCurrentPTS() const { + return fPresentationTime.tv_sec + fPresentationTime.tv_usec/1000000.0; +} + +Boolean MPEG1or2VideoStreamFramer::isMPEG1or2VideoStreamFramer() const { + return True; +} + +////////// MPEG1or2VideoStreamParser implementation ////////// + +MPEG1or2VideoStreamParser +::MPEG1or2VideoStreamParser(MPEG1or2VideoStreamFramer* usingSource, + FramedSource* inputSource, + Boolean iFramesOnly, double vshPeriod) + : MPEGVideoStreamParser(usingSource, inputSource), + fCurrentParseState(PARSING_VIDEO_SEQUENCE_HEADER), + fVSHPeriod(vshPeriod), fIFramesOnly(iFramesOnly) { + reset(); +} + +MPEG1or2VideoStreamParser::~MPEG1or2VideoStreamParser() { +} + +void MPEG1or2VideoStreamParser::setParseState(MPEGParseState parseState) { + fCurrentParseState = parseState; + MPEGVideoStreamParser::setParseState(); +} + +void MPEG1or2VideoStreamParser::reset() { + fPicturesSinceLastGOP = 0; + fCurPicTemporalReference = 0; + fCurrentSliceNumber = 0; + fSavedVSHSize = 0; + fSkippingCurrentPicture = False; +} + +void MPEG1or2VideoStreamParser::flushInput() { + reset(); + StreamParser::flushInput(); + if (fCurrentParseState != PARSING_VIDEO_SEQUENCE_HEADER) { + setParseState(PARSING_GOP_HEADER); // start from the next GOP + } +} + +unsigned MPEG1or2VideoStreamParser::parse() { + try { + switch (fCurrentParseState) { + case PARSING_VIDEO_SEQUENCE_HEADER: { + return parseVideoSequenceHeader(False); + } + case PARSING_VIDEO_SEQUENCE_HEADER_SEEN_CODE: { + return parseVideoSequenceHeader(True); + } + case PARSING_GOP_HEADER: { + return parseGOPHeader(False); + } + case PARSING_GOP_HEADER_SEEN_CODE: { + return parseGOPHeader(True); + } + case PARSING_PICTURE_HEADER: { + return parsePictureHeader(); + } + case PARSING_SLICE: { + return parseSlice(); + } + default: { + return 0; // shouldn't happen + } + } + } catch (int /*e*/) { +#ifdef DEBUG + fprintf(stderr, "MPEG1or2VideoStreamParser::parse() EXCEPTION (This is normal behavior - *not* an error)\n"); +#endif + return 0; // the parsing got interrupted + } +} + +void MPEG1or2VideoStreamParser::saveCurrentVSH() { + unsigned frameSize = curFrameSize(); + if (frameSize > sizeof fSavedVSHBuffer) return; // too big to save + + memmove(fSavedVSHBuffer, fStartOfFrame, frameSize); + fSavedVSHSize = frameSize; + fSavedVSHTimestamp = usingSource()->getCurrentPTS(); +} + +Boolean MPEG1or2VideoStreamParser::needToUseSavedVSH() { + return usingSource()->getCurrentPTS() > fSavedVSHTimestamp+fVSHPeriod + && fSavedVSHSize > 0; +} + +unsigned MPEG1or2VideoStreamParser::useSavedVSH() { + unsigned bytesToUse = fSavedVSHSize; + unsigned maxBytesToUse = fLimit - fStartOfFrame; + if (bytesToUse > maxBytesToUse) bytesToUse = maxBytesToUse; + + memmove(fStartOfFrame, fSavedVSHBuffer, bytesToUse); + + // Also reset the saved timestamp: + fSavedVSHTimestamp = usingSource()->getCurrentPTS(); + +#ifdef DEBUG + fprintf(stderr, "used saved video_sequence_header (%d bytes)\n", bytesToUse); +#endif + return bytesToUse; +} + +#define VIDEO_SEQUENCE_HEADER_START_CODE 0x000001B3 +#define GROUP_START_CODE 0x000001B8 +#define PICTURE_START_CODE 0x00000100 +#define SEQUENCE_END_CODE 0x000001B7 + +static double const frameRateFromCode[] = { + 0.0, // forbidden + 24000/1001.0, // approx 23.976 + 24.0, + 25.0, + 30000/1001.0, // approx 29.97 + 30.0, + 50.0, + 60000/1001.0, // approx 59.94 + 60.0, + 0.0, // reserved + 0.0, // reserved + 0.0, // reserved + 0.0, // reserved + 0.0, // reserved + 0.0, // reserved + 0.0 // reserved +}; + +unsigned MPEG1or2VideoStreamParser +::parseVideoSequenceHeader(Boolean haveSeenStartCode) { +#ifdef DEBUG + fprintf(stderr, "parsing video sequence header\n"); +#endif + unsigned first4Bytes; + if (!haveSeenStartCode) { + while ((first4Bytes = test4Bytes()) != VIDEO_SEQUENCE_HEADER_START_CODE) { +#ifdef DEBUG + fprintf(stderr, "ignoring non video sequence header: 0x%08x\n", first4Bytes); +#endif + get1Byte(); setParseState(PARSING_VIDEO_SEQUENCE_HEADER); + // ensures we progress over bad data + } + first4Bytes = get4Bytes(); + } else { + // We've already seen the start code + first4Bytes = VIDEO_SEQUENCE_HEADER_START_CODE; + } + save4Bytes(first4Bytes); + + // Next, extract the size and rate parameters from the next 8 bytes + unsigned paramWord1 = get4Bytes(); + save4Bytes(paramWord1); + unsigned next4Bytes = get4Bytes(); +#ifdef DEBUG + unsigned short horizontal_size_value = (paramWord1&0xFFF00000)>>(32-12); + unsigned short vertical_size_value = (paramWord1&0x000FFF00)>>8; + unsigned char aspect_ratio_information = (paramWord1&0x000000F0)>>4; +#endif + unsigned char frame_rate_code = (paramWord1&0x0000000F); + usingSource()->fFrameRate = frameRateFromCode[frame_rate_code]; +#ifdef DEBUG + unsigned bit_rate_value = (next4Bytes&0xFFFFC000)>>(32-18); + unsigned vbv_buffer_size_value = (next4Bytes&0x00001FF8)>>3; + fprintf(stderr, "horizontal_size_value: %d, vertical_size_value: %d, aspect_ratio_information: %d, frame_rate_code: %d (=>%f fps), bit_rate_value: %d (=>%d bps), vbv_buffer_size_value: %d\n", horizontal_size_value, vertical_size_value, aspect_ratio_information, frame_rate_code, usingSource()->fFrameRate, bit_rate_value, bit_rate_value*400, vbv_buffer_size_value); +#endif + + // Now, copy all bytes that we see, up until we reach a GROUP_START_CODE + // or a PICTURE_START_CODE: + do { + saveToNextCode(next4Bytes); + } while (next4Bytes != GROUP_START_CODE && next4Bytes != PICTURE_START_CODE); + + setParseState((next4Bytes == GROUP_START_CODE) + ? PARSING_GOP_HEADER_SEEN_CODE : PARSING_PICTURE_HEADER); + + // Compute this frame's timestamp by noting how many pictures we've seen + // since the last GOP header: + usingSource()->computePresentationTime(fPicturesSinceLastGOP); + + // Save this video_sequence_header, in case we need to insert a copy + // into the stream later: + saveCurrentVSH(); + + return curFrameSize(); +} + +unsigned MPEG1or2VideoStreamParser::parseGOPHeader(Boolean haveSeenStartCode) { + // First check whether we should insert a previously-saved + // 'video_sequence_header' here: + if (needToUseSavedVSH()) return useSavedVSH(); + +#ifdef DEBUG + fprintf(stderr, "parsing GOP header\n"); +#endif + unsigned first4Bytes; + if (!haveSeenStartCode) { + while ((first4Bytes = test4Bytes()) != GROUP_START_CODE) { +#ifdef DEBUG + fprintf(stderr, "ignoring non GOP start code: 0x%08x\n", first4Bytes); +#endif + get1Byte(); setParseState(PARSING_GOP_HEADER); + // ensures we progress over bad data + } + first4Bytes = get4Bytes(); + } else { + // We've already seen the GROUP_START_CODE + first4Bytes = GROUP_START_CODE; + } + save4Bytes(first4Bytes); + + // Next, extract the (25-bit) time code from the next 4 bytes: + unsigned next4Bytes = get4Bytes(); + unsigned time_code = (next4Bytes&0xFFFFFF80)>>(32-25); +#if defined(DEBUG) || defined(DEBUG_TIMESTAMPS) + Boolean drop_frame_flag = (time_code&0x01000000) != 0; +#endif + unsigned time_code_hours = (time_code&0x00F80000)>>19; + unsigned time_code_minutes = (time_code&0x0007E000)>>13; + unsigned time_code_seconds = (time_code&0x00000FC0)>>6; + unsigned time_code_pictures = (time_code&0x0000003F); +#if defined(DEBUG) || defined(DEBUG_TIMESTAMPS) + fprintf(stderr, "time_code: 0x%07x, drop_frame %d, hours %d, minutes %d, seconds %d, pictures %d\n", time_code, drop_frame_flag, time_code_hours, time_code_minutes, time_code_seconds, time_code_pictures); +#endif +#ifdef DEBUG + Boolean closed_gop = (next4Bytes&0x00000040) != 0; + Boolean broken_link = (next4Bytes&0x00000020) != 0; + fprintf(stderr, "closed_gop: %d, broken_link: %d\n", closed_gop, broken_link); +#endif + + // Now, copy all bytes that we see, up until we reach a PICTURE_START_CODE: + do { + saveToNextCode(next4Bytes); + } while (next4Bytes != PICTURE_START_CODE); + + // Record the time code: + usingSource()->setTimeCode(time_code_hours, time_code_minutes, + time_code_seconds, time_code_pictures, + fPicturesSinceLastGOP); + + fPicturesSinceLastGOP = 0; + + // Compute this frame's timestamp: + usingSource()->computePresentationTime(0); + + setParseState(PARSING_PICTURE_HEADER); + + return curFrameSize(); +} + +inline Boolean isSliceStartCode(unsigned fourBytes) { + if ((fourBytes&0xFFFFFF00) != 0x00000100) return False; + + unsigned char lastByte = fourBytes&0xFF; + return lastByte <= 0xAF && lastByte >= 1; +} + +unsigned MPEG1or2VideoStreamParser::parsePictureHeader() { +#ifdef DEBUG + fprintf(stderr, "parsing picture header\n"); +#endif + // Note that we've already read the PICTURE_START_CODE + // Next, extract the temporal reference from the next 4 bytes: + unsigned next4Bytes = get4Bytes(); + unsigned short temporal_reference = (next4Bytes&0xFFC00000)>>(32-10); + unsigned char picture_coding_type = (next4Bytes&0x00380000)>>19; +#ifdef DEBUG + unsigned short vbv_delay = (next4Bytes&0x0007FFF8)>>3; + fprintf(stderr, "temporal_reference: %d, picture_coding_type: %d, vbv_delay: %d\n", temporal_reference, picture_coding_type, vbv_delay); +#endif + + fSkippingCurrentPicture = fIFramesOnly && picture_coding_type != 1; + if (fSkippingCurrentPicture) { + // Skip all bytes that we see, up until we reach a slice_start_code: + do { + skipToNextCode(next4Bytes); + } while (!isSliceStartCode(next4Bytes)); + } else { + // Save the PICTURE_START_CODE that we've already read: + save4Bytes(PICTURE_START_CODE); + + // Copy all bytes that we see, up until we reach a slice_start_code: + do { + saveToNextCode(next4Bytes); + } while (!isSliceStartCode(next4Bytes)); + } + + setParseState(PARSING_SLICE); + + fCurrentSliceNumber = next4Bytes&0xFF; + + // Record the temporal reference: + fCurPicTemporalReference = temporal_reference; + + // Compute this frame's timestamp: + usingSource()->computePresentationTime(fCurPicTemporalReference); + + if (fSkippingCurrentPicture) { + return parse(); // try again, until we get a non-skipped frame + } else { + return curFrameSize(); + } +} + +unsigned MPEG1or2VideoStreamParser::parseSlice() { + // Note that we've already read the slice_start_code: + unsigned next4Bytes = PICTURE_START_CODE|fCurrentSliceNumber; +#ifdef DEBUG_SLICE + fprintf(stderr, "parsing slice: 0x%08x\n", next4Bytes); +#endif + + if (fSkippingCurrentPicture) { + // Skip all bytes that we see, up until we reach a code of some sort: + skipToNextCode(next4Bytes); + } else { + // Copy all bytes that we see, up until we reach a code of some sort: + saveToNextCode(next4Bytes); + } + + // The next thing to parse depends on the code that we just saw: + if (isSliceStartCode(next4Bytes)) { // common case + setParseState(PARSING_SLICE); + fCurrentSliceNumber = next4Bytes&0xFF; + } else { + // Because we don't see any more slices, we are assumed to have ended + // the current picture: + ++fPicturesSinceLastGOP; + ++usingSource()->fPictureCount; + usingSource()->fPictureEndMarker = True; // HACK ##### + + switch (next4Bytes) { + case SEQUENCE_END_CODE: { + setParseState(PARSING_VIDEO_SEQUENCE_HEADER); + break; + } + case VIDEO_SEQUENCE_HEADER_START_CODE: { + setParseState(PARSING_VIDEO_SEQUENCE_HEADER_SEEN_CODE); + break; + } + case GROUP_START_CODE: { + setParseState(PARSING_GOP_HEADER_SEEN_CODE); + break; + } + case PICTURE_START_CODE: { + setParseState(PARSING_PICTURE_HEADER); + break; + } + default: { + usingSource()->envir() << "MPEG1or2VideoStreamParser::parseSlice(): Saw unexpected code " + << (void*)next4Bytes << "\n"; + setParseState(PARSING_SLICE); // the safest way to recover... + break; + } + } + } + + // Compute this frame's timestamp: + usingSource()->computePresentationTime(fCurPicTemporalReference); + + if (fSkippingCurrentPicture) { + return parse(); // try again, until we get a non-skipped frame + } else { + return curFrameSize(); + } +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MPEG2IndexFromTransportStream.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MPEG2IndexFromTransportStream.cpp new file mode 100644 index 000000000..2476ab3dd --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MPEG2IndexFromTransportStream.cpp @@ -0,0 +1,683 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A filter that produces a sequence of I-frame indices from a MPEG-2 Transport Stream +// Implementation + +#include "MPEG2IndexFromTransportStream.hh" + +////////// IndexRecord definition ////////// + +enum RecordType { + RECORD_UNPARSED = 0, + RECORD_VSH = 1, // a MPEG Video Sequence Header + RECORD_GOP = 2, + RECORD_PIC_NON_IFRAME = 3, // includes slices + RECORD_PIC_IFRAME = 4, // includes slices + RECORD_NAL_H264_SPS = 5, // H.264 + RECORD_NAL_H264_PPS = 6, // H.264 + RECORD_NAL_H264_SEI = 7, // H.264 + RECORD_NAL_H264_NON_IFRAME = 8, // H.264 + RECORD_NAL_H264_IFRAME = 9, // H.264 + RECORD_NAL_H264_OTHER = 10, // H.264 + RECORD_NAL_H265_VPS = 11, // H.265 + RECORD_NAL_H265_SPS = 12, // H.265 + RECORD_NAL_H265_PPS = 13, // H.265 + RECORD_NAL_H265_NON_IFRAME = 14, // H.265 + RECORD_NAL_H265_IFRAME = 15, // H.265 + RECORD_NAL_H265_OTHER = 16, // H.265 + RECORD_JUNK +}; + +class IndexRecord { +public: + IndexRecord(u_int8_t startOffset, u_int8_t size, + unsigned long transportPacketNumber, float pcr); + virtual ~IndexRecord(); + + RecordType& recordType() { return fRecordType; } + void setFirstFlag() { fRecordType = (RecordType)(((u_int8_t)fRecordType) | 0x80); } + u_int8_t startOffset() const { return fStartOffset; } + u_int8_t& size() { return fSize; } + float pcr() const { return fPCR; } + unsigned long transportPacketNumber() const { return fTransportPacketNumber; } + + IndexRecord* next() const { return fNext; } + void addAfter(IndexRecord* prev); + void unlink(); + +private: + // Index records are maintained in a doubly-linked list: + IndexRecord* fNext; + IndexRecord* fPrev; + + RecordType fRecordType; + u_int8_t fStartOffset; // within the Transport Stream packet + u_int8_t fSize; // in bytes, following "fStartOffset". + // Note: fStartOffset + fSize <= TRANSPORT_PACKET_SIZE + float fPCR; + unsigned long fTransportPacketNumber; +}; + +#ifdef DEBUG +static char const* recordTypeStr[] = { + "UNPARSED", + "VSH", + "GOP", + "PIC(non-I-frame)", + "PIC(I-frame)", + "SPS (H.264)", + "PPS (H.264)", + "SEI (H.264)", + "H.264 non-I-frame", + "H.264 I-frame", + "other NAL unit (H.264)", + "VPS (H.265)", + "SPS (H.265)", + "PPS (H.265)", + "H.265 non-I-frame", + "H.265 I-frame", + "other NAL unit (H.265)", + "JUNK" +}; + +UsageEnvironment& operator<<(UsageEnvironment& env, IndexRecord& r) { + return env << "[" << ((r.recordType()&0x80) != 0 ? "1" : "") + << recordTypeStr[r.recordType()&0x7F] << ":" + << (unsigned)r.transportPacketNumber() << ":" << r.startOffset() + << "(" << r.size() << ")@" << r.pcr() << "]"; +} +#endif + + +////////// MPEG2IFrameIndexFromTransportStream implementation ////////// + +MPEG2IFrameIndexFromTransportStream* +MPEG2IFrameIndexFromTransportStream::createNew(UsageEnvironment& env, + FramedSource* inputSource) { + return new MPEG2IFrameIndexFromTransportStream(env, inputSource); +} + +// The largest expected frame size (in bytes): +#define MAX_FRAME_SIZE 400000 + +// Make our parse buffer twice as large as this, to ensure that at least one +// complete frame will fit inside it: +#define PARSE_BUFFER_SIZE (2*MAX_FRAME_SIZE) + +// The PID used for the PAT (as defined in the MPEG Transport Stream standard): +#define PAT_PID 0 + +MPEG2IFrameIndexFromTransportStream +::MPEG2IFrameIndexFromTransportStream(UsageEnvironment& env, + FramedSource* inputSource) + : FramedFilter(env, inputSource), + fIsH264(False), fIsH265(False), + fInputTransportPacketCounter((unsigned)-1), fClosureNumber(0), fLastContinuityCounter(~0), + fFirstPCR(0.0), fLastPCR(0.0), fHaveSeenFirstPCR(False), + fPMT_PID(0x10), fVideo_PID(0xE0), // default values + fParseBufferSize(PARSE_BUFFER_SIZE), + fParseBufferFrameStart(0), fParseBufferParseEnd(4), fParseBufferDataEnd(0), + fHeadIndexRecord(NULL), fTailIndexRecord(NULL) { + fParseBuffer = new unsigned char[fParseBufferSize]; +} + +MPEG2IFrameIndexFromTransportStream::~MPEG2IFrameIndexFromTransportStream() { + delete fHeadIndexRecord; + delete[] fParseBuffer; +} + +void MPEG2IFrameIndexFromTransportStream::doGetNextFrame() { + // Begin by trying to deliver an index record (for an already-parsed frame) + // to the client: + if (deliverIndexRecord()) return; + + // No more index records are left to deliver, so try to parse a new frame: + if (parseFrame()) { // success - try again + doGetNextFrame(); + return; + } + + // We need to read some more Transport Stream packets. Check whether we have room: + if (fParseBufferSize - fParseBufferDataEnd < TRANSPORT_PACKET_SIZE) { + // There's no room left. Compact the buffer, and check again: + compactParseBuffer(); + if (fParseBufferSize - fParseBufferDataEnd < TRANSPORT_PACKET_SIZE) { + envir() << "ERROR: parse buffer full; increase MAX_FRAME_SIZE\n"; + // Treat this as if the input source ended: + handleInputClosure1(); + return; + } + } + + // Arrange to read a new Transport Stream packet: + fInputSource->getNextFrame(fInputBuffer, sizeof fInputBuffer, + afterGettingFrame, this, + handleInputClosure, this); +} + +void MPEG2IFrameIndexFromTransportStream +::afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds) { + MPEG2IFrameIndexFromTransportStream* source + = (MPEG2IFrameIndexFromTransportStream*)clientData; + source->afterGettingFrame1(frameSize, numTruncatedBytes, + presentationTime, durationInMicroseconds); +} + +#define TRANSPORT_SYNC_BYTE 0x47 + +void MPEG2IFrameIndexFromTransportStream +::afterGettingFrame1(unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds) { + if (frameSize < TRANSPORT_PACKET_SIZE || fInputBuffer[0] != TRANSPORT_SYNC_BYTE) { + if (fInputBuffer[0] != TRANSPORT_SYNC_BYTE) { + envir() << "Bad TS sync byte: 0x" << fInputBuffer[0] << "\n"; + } + // Handle this as if the source ended: + handleInputClosure1(); + return; + } + + ++fInputTransportPacketCounter; + + // Figure out how much of this Transport Packet contains PES data: + u_int8_t adaptation_field_control = (fInputBuffer[3]&0x30)>>4; + u_int8_t totalHeaderSize + = adaptation_field_control <= 1 ? 4 : 5 + fInputBuffer[4]; + if ((adaptation_field_control == 2 && totalHeaderSize != TRANSPORT_PACKET_SIZE) || + (adaptation_field_control == 3 && totalHeaderSize >= TRANSPORT_PACKET_SIZE)) { + envir() << "Bad \"adaptation_field_length\": " << fInputBuffer[4] << "\n"; + doGetNextFrame(); + return; + } + + // Check for a PCR: + if (totalHeaderSize > 5 && (fInputBuffer[5]&0x10) != 0) { + // There's a PCR: + u_int32_t pcrBaseHigh + = (fInputBuffer[6]<<24)|(fInputBuffer[7]<<16) + |(fInputBuffer[8]<<8)|fInputBuffer[9]; + float pcr = pcrBaseHigh/45000.0f; + if ((fInputBuffer[10]&0x80) != 0) pcr += 1/90000.0f; // add in low-bit (if set) + unsigned short pcrExt = ((fInputBuffer[10]&0x01)<<8) | fInputBuffer[11]; + pcr += pcrExt/27000000.0f; + + if (!fHaveSeenFirstPCR) { + fFirstPCR = pcr; + fHaveSeenFirstPCR = True; + } else if (pcr < fLastPCR) { + // The PCR timestamp has gone backwards. Display a warning about this + // (because it indicates buggy Transport Stream data), and compensate for it. + envir() << "\nWarning: At about " << fLastPCR-fFirstPCR + << " seconds into the file, the PCR timestamp decreased - from " + << fLastPCR << " to " << pcr << "\n"; + fFirstPCR -= (fLastPCR - pcr); + } + fLastPCR = pcr; + } + + // Get the PID from the packet, and check for special tables: the PAT and PMT: + u_int16_t PID = ((fInputBuffer[1]&0x1F)<<8) | fInputBuffer[2]; + if (PID == PAT_PID) { + analyzePAT(&fInputBuffer[totalHeaderSize], TRANSPORT_PACKET_SIZE-totalHeaderSize); + } else if (PID == fPMT_PID) { + analyzePMT(&fInputBuffer[totalHeaderSize], TRANSPORT_PACKET_SIZE-totalHeaderSize); + } + + // Ignore transport packets for non-video programs, + // or packets with no data, or packets that duplicate the previous packet: + u_int8_t continuity_counter = fInputBuffer[3]&0x0F; + if ((PID != fVideo_PID) || + !(adaptation_field_control == 1 || adaptation_field_control == 3) || + continuity_counter == fLastContinuityCounter) { + doGetNextFrame(); + return; + } + fLastContinuityCounter = continuity_counter; + + // Also, if this is the start of a PES packet, then skip over the PES header: + Boolean payload_unit_start_indicator = (fInputBuffer[1]&0x40) != 0; + if (payload_unit_start_indicator && totalHeaderSize < TRANSPORT_PACKET_SIZE - 8 + && fInputBuffer[totalHeaderSize] == 0x00 && fInputBuffer[totalHeaderSize+1] == 0x00 + && fInputBuffer[totalHeaderSize+2] == 0x01) { + u_int8_t PES_header_data_length = fInputBuffer[totalHeaderSize+8]; + totalHeaderSize += 9 + PES_header_data_length; + if (totalHeaderSize >= TRANSPORT_PACKET_SIZE) { + envir() << "Unexpectedly large PES header size: " << PES_header_data_length << "\n"; + // Handle this as if the source ended: + handleInputClosure1(); + return; + } + } + + // The remaining data is Video Elementary Stream data. Add it to our parse buffer: + unsigned vesSize = TRANSPORT_PACKET_SIZE - totalHeaderSize; + memmove(&fParseBuffer[fParseBufferDataEnd], &fInputBuffer[totalHeaderSize], vesSize); + fParseBufferDataEnd += vesSize; + + // And add a new index record noting where it came from: + addToTail(new IndexRecord(totalHeaderSize, vesSize, fInputTransportPacketCounter, + fLastPCR - fFirstPCR)); + + // Try again: + doGetNextFrame(); +} + +void MPEG2IFrameIndexFromTransportStream::handleInputClosure(void* clientData) { + MPEG2IFrameIndexFromTransportStream* source + = (MPEG2IFrameIndexFromTransportStream*)clientData; + source->handleInputClosure1(); +} + +#define VIDEO_SEQUENCE_START_CODE 0xB3 // MPEG-1 or 2 +#define VISUAL_OBJECT_SEQUENCE_START_CODE 0xB0 // MPEG-4 +#define GROUP_START_CODE 0xB8 // MPEG-1 or 2 +#define GROUP_VOP_START_CODE 0xB3 // MPEG-4 +#define PICTURE_START_CODE 0x00 // MPEG-1 or 2 +#define VOP_START_CODE 0xB6 // MPEG-4 + +void MPEG2IFrameIndexFromTransportStream::handleInputClosure1() { + if (++fClosureNumber == 1 && fParseBufferDataEnd > fParseBufferFrameStart + && fParseBufferDataEnd <= fParseBufferSize - 4) { + // This is the first time we saw EOF, and there's still data remaining to be + // parsed. Hack: Append a Picture Header code to the end of the unparsed + // data, and try again. This should use up all of the unparsed data. + fParseBuffer[fParseBufferDataEnd++] = 0; + fParseBuffer[fParseBufferDataEnd++] = 0; + fParseBuffer[fParseBufferDataEnd++] = 1; + fParseBuffer[fParseBufferDataEnd++] = PICTURE_START_CODE; + + // Try again: + doGetNextFrame(); + } else { + // Handle closure in the regular way: + handleClosure(); + } +} + +void MPEG2IFrameIndexFromTransportStream +::analyzePAT(unsigned char* pkt, unsigned size) { + // Get the PMT_PID: + while (size >= 17) { // The table is large enough + u_int16_t program_number = (pkt[9]<<8) | pkt[10]; + if (program_number != 0) { + fPMT_PID = ((pkt[11]&0x1F)<<8) | pkt[12]; + return; + } + + pkt += 4; size -= 4; + } +} + +void MPEG2IFrameIndexFromTransportStream +::analyzePMT(unsigned char* pkt, unsigned size) { + // Scan the "elementary_PID"s in the map, until we see the first video stream. + + // First, get the "section_length", to get the table's size: + u_int16_t section_length = ((pkt[2]&0x0F)<<8) | pkt[3]; + if ((unsigned)(4+section_length) < size) size = (4+section_length); + + // Then, skip any descriptors following the "program_info_length": + if (size < 22) return; // not enough data + unsigned program_info_length = ((pkt[11]&0x0F)<<8) | pkt[12]; + pkt += 13; size -= 13; + if (size < program_info_length) return; // not enough data + pkt += program_info_length; size -= program_info_length; + + // Look at each ("stream_type","elementary_PID") pair, looking for a video stream: + while (size >= 9) { + u_int8_t stream_type = pkt[0]; + u_int16_t elementary_PID = ((pkt[1]&0x1F)<<8) | pkt[2]; + if (stream_type == 1 || stream_type == 2 || + stream_type == 0x1B/*H.264 video*/ || stream_type == 0x24/*H.265 video*/) { + if (stream_type == 0x1B) fIsH264 = True; + else if (stream_type == 0x24) fIsH265 = True; + fVideo_PID = elementary_PID; + return; + } + + u_int16_t ES_info_length = ((pkt[3]&0x0F)<<8) | pkt[4]; + pkt += 5; size -= 5; + if (size < ES_info_length) return; // not enough data + pkt += ES_info_length; size -= ES_info_length; + } +} + +Boolean MPEG2IFrameIndexFromTransportStream::deliverIndexRecord() { + IndexRecord* head = fHeadIndexRecord; + if (head == NULL) return False; + + // Check whether the head record has been parsed yet: + if (head->recordType() == RECORD_UNPARSED) return False; + + // Remove the head record (the one whose data we'll be delivering): + IndexRecord* next = head->next(); + head->unlink(); + if (next == head) { + fHeadIndexRecord = fTailIndexRecord = NULL; + } else { + fHeadIndexRecord = next; + } + + if (head->recordType() == RECORD_JUNK) { + // Don't actually deliver the data to the client: + delete head; + // Try to deliver the next record instead: + return deliverIndexRecord(); + } + + // Deliver data from the head record: +#ifdef DEBUG + envir() << "delivering: " << *head << "\n"; +#endif + if (fMaxSize < 11) { + fFrameSize = 0; + } else { + fTo[0] = (u_int8_t)(head->recordType()); + fTo[1] = head->startOffset(); + fTo[2] = head->size(); + // Deliver the PCR, as 24 bits (integer part; little endian) + 8 bits (fractional part) + float pcr = head->pcr(); + unsigned pcr_int = (unsigned)pcr; + u_int8_t pcr_frac = (u_int8_t)(256*(pcr-pcr_int)); + fTo[3] = (unsigned char)(pcr_int); + fTo[4] = (unsigned char)(pcr_int>>8); + fTo[5] = (unsigned char)(pcr_int>>16); + fTo[6] = (unsigned char)(pcr_frac); + // Deliver the transport packet number (in little-endian order): + unsigned long tpn = head->transportPacketNumber(); + fTo[7] = (unsigned char)(tpn); + fTo[8] = (unsigned char)(tpn>>8); + fTo[9] = (unsigned char)(tpn>>16); + fTo[10] = (unsigned char)(tpn>>24); + fFrameSize = 11; + } + + // Free the (former) head record (as we're now done with it): + delete head; + + // Complete delivery to the client: + afterGetting(this); + return True; +} + +Boolean MPEG2IFrameIndexFromTransportStream::parseFrame() { + // At this point, we have a queue of >=0 (unparsed) index records, representing + // the data in the parse buffer from "fParseBufferFrameStart" + // to "fParseBufferDataEnd". We now parse through this data, looking for + // a complete 'frame', where a 'frame', in this case, means: + // for MPEG video: a Video Sequence Header, GOP Header, Picture Header, or Slice + // for H.264 or H.265 video: a NAL unit + + // Inspect the frame's initial 4-byte code, to make sure it starts with a system code: + if (fParseBufferDataEnd-fParseBufferFrameStart < 4) return False; // not enough data + unsigned numInitialBadBytes = 0; + unsigned char const* p = &fParseBuffer[fParseBufferFrameStart]; + if (!(p[0] == 0 && p[1] == 0 && p[2] == 1)) { + // There's no system code at the beginning. Parse until we find one: + if (fParseBufferParseEnd == fParseBufferFrameStart + 4) { + // Start parsing from the beginning of the frame data: + fParseBufferParseEnd = fParseBufferFrameStart; + } + unsigned char nextCode; + if (!parseToNextCode(nextCode)) return False; + + numInitialBadBytes = fParseBufferParseEnd - fParseBufferFrameStart; + fParseBufferFrameStart = fParseBufferParseEnd; + fParseBufferParseEnd += 4; // skip over the code that we just saw + p = &fParseBuffer[fParseBufferFrameStart]; + } + + unsigned char curCode = p[3]; + if (fIsH264) curCode &= 0x1F; // nal_unit_type + else if (fIsH265) curCode = (curCode&0x7E)>>1; + + RecordType curRecordType; + unsigned char nextCode; + if (fIsH264) { + switch (curCode) { + case 1: // Coded slice of a non-IDR picture + curRecordType = RECORD_NAL_H264_NON_IFRAME; + if (!parseToNextCode(nextCode)) return False; + break; + case 5: // Coded slice of an IDR picture + curRecordType = RECORD_NAL_H264_IFRAME; + if (!parseToNextCode(nextCode)) return False; + break; + case 6: // Supplemental enhancement information (SEI) + curRecordType = RECORD_NAL_H264_SEI; + if (!parseToNextCode(nextCode)) return False; + break; + case 7: // Sequence parameter set (SPS) + curRecordType = RECORD_NAL_H264_SPS; + if (!parseToNextCode(nextCode)) return False; + break; + case 8: // Picture parameter set (PPS) + curRecordType = RECORD_NAL_H264_PPS; + if (!parseToNextCode(nextCode)) return False; + break; + default: + curRecordType = RECORD_NAL_H264_OTHER; + if (!parseToNextCode(nextCode)) return False; + break; + } + } else if (fIsH265) { + switch (curCode) { + case 19: // Coded slice segment of an IDR picture + case 20: // Coded slice segment of an IDR picture + curRecordType = RECORD_NAL_H265_IFRAME; + if (!parseToNextCode(nextCode)) return False; + break; + case 32: // Video parameter set (VPS) + curRecordType = RECORD_NAL_H265_VPS; + if (!parseToNextCode(nextCode)) return False; + break; + case 33: // Sequence parameter set (SPS) + curRecordType = RECORD_NAL_H265_SPS; + if (!parseToNextCode(nextCode)) return False; + break; + case 34: // Picture parameter set (PPS) + curRecordType = RECORD_NAL_H265_PPS; + if (!parseToNextCode(nextCode)) return False; + break; + default: + curRecordType = (curCode <= 31) ? RECORD_NAL_H265_NON_IFRAME : RECORD_NAL_H265_OTHER; + if (!parseToNextCode(nextCode)) return False; + break; + } + } else { // MPEG-1, 2, or 4 + switch (curCode) { + case VIDEO_SEQUENCE_START_CODE: + case VISUAL_OBJECT_SEQUENCE_START_CODE: + curRecordType = RECORD_VSH; + while (1) { + if (!parseToNextCode(nextCode)) return False; + if (nextCode == GROUP_START_CODE || + nextCode == PICTURE_START_CODE || nextCode == VOP_START_CODE) break; + fParseBufferParseEnd += 4; // skip over the code that we just saw + } + break; + case GROUP_START_CODE: + curRecordType = RECORD_GOP; + while (1) { + if (!parseToNextCode(nextCode)) return False; + if (nextCode == PICTURE_START_CODE || nextCode == VOP_START_CODE) break; + fParseBufferParseEnd += 4; // skip over the code that we just saw + } + break; + default: // picture + curRecordType = RECORD_PIC_NON_IFRAME; // may get changed to IFRAME later + while (1) { + if (!parseToNextCode(nextCode)) return False; + if (nextCode == VIDEO_SEQUENCE_START_CODE || + nextCode == VISUAL_OBJECT_SEQUENCE_START_CODE || + nextCode == GROUP_START_CODE || nextCode == GROUP_VOP_START_CODE || + nextCode == PICTURE_START_CODE || nextCode == VOP_START_CODE) break; + fParseBufferParseEnd += 4; // skip over the code that we just saw + } + break; + } + } + + if (curRecordType == RECORD_PIC_NON_IFRAME) { + if (curCode == VOP_START_CODE) { // MPEG-4 + if ((fParseBuffer[fParseBufferFrameStart+4]&0xC0) == 0) { + // This is actually an I-frame. Note it as such: + curRecordType = RECORD_PIC_IFRAME; + } + } else { // MPEG-1 or 2 + if ((fParseBuffer[fParseBufferFrameStart+5]&0x38) == 0x08) { + // This is actually an I-frame. Note it as such: + curRecordType = RECORD_PIC_IFRAME; + } + } + } + + // There is now a parsed 'frame', from "fParseBufferFrameStart" + // to "fParseBufferParseEnd". Tag the corresponding index records to note this: + unsigned frameSize = fParseBufferParseEnd - fParseBufferFrameStart + numInitialBadBytes; +#ifdef DEBUG + envir() << "parsed " << recordTypeStr[curRecordType] << "; length " + << frameSize << "\n"; +#endif + for (IndexRecord* r = fHeadIndexRecord; ; r = r->next()) { + if (numInitialBadBytes >= r->size()) { + r->recordType() = RECORD_JUNK; + numInitialBadBytes -= r->size(); + } else { + r->recordType() = curRecordType; + } + if (r == fHeadIndexRecord) r->setFirstFlag(); + // indicates that this is the first record for this frame + + if (r->size() > frameSize) { + // This record contains extra data that's not part of the frame. + // Shorten this record, and move the extra data to a new record + // that comes afterwards: + u_int8_t newOffset = r->startOffset() + frameSize; + u_int8_t newSize = r->size() - frameSize; + r->size() = frameSize; +#ifdef DEBUG + envir() << "tagged record (modified): " << *r << "\n"; +#endif + + IndexRecord* newRecord + = new IndexRecord(newOffset, newSize, r->transportPacketNumber(), r->pcr()); + newRecord->addAfter(r); + if (fTailIndexRecord == r) fTailIndexRecord = newRecord; +#ifdef DEBUG + envir() << "added extra record: " << *newRecord << "\n"; +#endif + } else { +#ifdef DEBUG + envir() << "tagged record: " << *r << "\n"; +#endif + } + frameSize -= r->size(); + if (frameSize == 0) break; + if (r == fTailIndexRecord) { // this shouldn't happen + envir() << "!!!!!Internal consistency error!!!!!\n"; + return False; + } + } + + // Finally, update our parse state (to skip over the now-parsed data): + fParseBufferFrameStart = fParseBufferParseEnd; + fParseBufferParseEnd += 4; // to skip over the next code (that we found) + + return True; +} + +Boolean MPEG2IFrameIndexFromTransportStream +::parseToNextCode(unsigned char& nextCode) { + unsigned char const* p = &fParseBuffer[fParseBufferParseEnd]; + unsigned char const* end = &fParseBuffer[fParseBufferDataEnd]; + while (p <= end-4) { + if (p[2] > 1) p += 3; // common case (optimized) + else if (p[2] == 0) ++p; + else if (p[0] == 0 && p[1] == 0) { // && p[2] == 1 + // We found a code here: + nextCode = p[3]; + fParseBufferParseEnd = p - &fParseBuffer[0]; // where we've gotten to + return True; + } else p += 3; + } + + fParseBufferParseEnd = p - &fParseBuffer[0]; // where we've gotten to + return False; // no luck this time +} + +void MPEG2IFrameIndexFromTransportStream::compactParseBuffer() { +#ifdef DEBUG + envir() << "Compacting parse buffer: [" << fParseBufferFrameStart + << "," << fParseBufferParseEnd << "," << fParseBufferDataEnd << "]"; +#endif + memmove(&fParseBuffer[0], &fParseBuffer[fParseBufferFrameStart], + fParseBufferDataEnd - fParseBufferFrameStart); + fParseBufferDataEnd -= fParseBufferFrameStart; + fParseBufferParseEnd -= fParseBufferFrameStart; + fParseBufferFrameStart = 0; +#ifdef DEBUG + envir() << "-> [" << fParseBufferFrameStart + << "," << fParseBufferParseEnd << "," << fParseBufferDataEnd << "]\n"; +#endif +} + +void MPEG2IFrameIndexFromTransportStream::addToTail(IndexRecord* newIndexRecord) { +#ifdef DEBUG + envir() << "adding new: " << *newIndexRecord << "\n"; +#endif + if (fTailIndexRecord == NULL) { + fHeadIndexRecord = fTailIndexRecord = newIndexRecord; + } else { + newIndexRecord->addAfter(fTailIndexRecord); + fTailIndexRecord = newIndexRecord; + } +} + +////////// IndexRecord implementation ////////// + +IndexRecord::IndexRecord(u_int8_t startOffset, u_int8_t size, + unsigned long transportPacketNumber, float pcr) + : fNext(this), fPrev(this), fRecordType(RECORD_UNPARSED), + fStartOffset(startOffset), fSize(size), + fPCR(pcr), fTransportPacketNumber(transportPacketNumber) { +} + +IndexRecord::~IndexRecord() { + IndexRecord* nextRecord = next(); + unlink(); + if (nextRecord != this) delete nextRecord; +} + +void IndexRecord::addAfter(IndexRecord* prev) { + fNext = prev->fNext; + fPrev = prev; + prev->fNext->fPrev = this; + prev->fNext = this; +} + +void IndexRecord::unlink() { + fNext->fPrev = fPrev; + fPrev->fNext = fNext; + fNext = fPrev = this; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportFileServerMediaSubsession.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportFileServerMediaSubsession.cpp new file mode 100644 index 000000000..ed9eb5c8a --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportFileServerMediaSubsession.cpp @@ -0,0 +1,352 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A 'ServerMediaSubsession' object that creates new, unicast, "RTPSink"s +// on demand, from a MPEG-2 Transport Stream file. +// Implementation + +#include "MPEG2TransportFileServerMediaSubsession.hh" +#include "SimpleRTPSink.hh" + +MPEG2TransportFileServerMediaSubsession* +MPEG2TransportFileServerMediaSubsession::createNew(UsageEnvironment& env, + char const* fileName, + char const* indexFileName, + Boolean reuseFirstSource) { + MPEG2TransportStreamIndexFile* indexFile; + if (indexFileName != NULL && reuseFirstSource) { + // It makes no sense to support trick play if all clients use the same source. Fix this: + env << "MPEG2TransportFileServerMediaSubsession::createNew(): ignoring the index file name, because \"reuseFirstSource\" is set\n"; + indexFile = NULL; + } else { + indexFile = MPEG2TransportStreamIndexFile::createNew(env, indexFileName); + } + return new MPEG2TransportFileServerMediaSubsession(env, fileName, indexFile, + reuseFirstSource); +} + +MPEG2TransportFileServerMediaSubsession +::MPEG2TransportFileServerMediaSubsession(UsageEnvironment& env, + char const* fileName, + MPEG2TransportStreamIndexFile* indexFile, + Boolean reuseFirstSource) + : FileServerMediaSubsession(env, fileName, reuseFirstSource), + fIndexFile(indexFile), fDuration(0.0), fClientSessionHashTable(NULL) { + if (fIndexFile != NULL) { // we support 'trick play' + fDuration = fIndexFile->getPlayingDuration(); + fClientSessionHashTable = HashTable::create(ONE_WORD_HASH_KEYS); + } +} + +MPEG2TransportFileServerMediaSubsession +::~MPEG2TransportFileServerMediaSubsession() { + if (fIndexFile != NULL) { // we support 'trick play' + Medium::close(fIndexFile); + + // Clean out the client session hash table: + while (1) { + ClientTrickPlayState* client + = (ClientTrickPlayState*)(fClientSessionHashTable->RemoveNext()); + if (client == NULL) break; + delete client; + } + delete fClientSessionHashTable; + } +} + +#define TRANSPORT_PACKET_SIZE 188 +#define TRANSPORT_PACKETS_PER_NETWORK_PACKET 7 +// The product of these two numbers must be enough to fit within a network packet + +void MPEG2TransportFileServerMediaSubsession +::startStream(unsigned clientSessionId, void* streamToken, TaskFunc* rtcpRRHandler, + void* rtcpRRHandlerClientData, unsigned short& rtpSeqNum, + unsigned& rtpTimestamp, + ServerRequestAlternativeByteHandler* serverRequestAlternativeByteHandler, + void* serverRequestAlternativeByteHandlerClientData) { + if (fIndexFile != NULL) { // we support 'trick play' + ClientTrickPlayState* client = lookupClient(clientSessionId); + if (client != NULL && client->areChangingScale()) { + // First, handle this like a "PAUSE", except that we back up to the previous VSH + client->updateStateOnPlayChange(True); + OnDemandServerMediaSubsession::pauseStream(clientSessionId, streamToken); + + // Then, adjust for the change of scale: + client->updateStateOnScaleChange(); + } + } + + // Call the original, default version of this routine: + OnDemandServerMediaSubsession::startStream(clientSessionId, streamToken, + rtcpRRHandler, rtcpRRHandlerClientData, + rtpSeqNum, rtpTimestamp, + serverRequestAlternativeByteHandler, serverRequestAlternativeByteHandlerClientData); +} + +void MPEG2TransportFileServerMediaSubsession +::pauseStream(unsigned clientSessionId, void* streamToken) { + if (fIndexFile != NULL) { // we support 'trick play' + ClientTrickPlayState* client = lookupClient(clientSessionId); + if (client != NULL) { + client->updateStateOnPlayChange(False); + } + } + + // Call the original, default version of this routine: + OnDemandServerMediaSubsession::pauseStream(clientSessionId, streamToken); +} + +void MPEG2TransportFileServerMediaSubsession +::seekStream(unsigned clientSessionId, void* streamToken, double& seekNPT, double streamDuration, u_int64_t& numBytes) { + // Begin by calling the original, default version of this routine: + OnDemandServerMediaSubsession::seekStream(clientSessionId, streamToken, seekNPT, streamDuration, numBytes); + + // Then, special handling specific to indexed Transport Stream files: + if (fIndexFile != NULL) { // we support 'trick play' + ClientTrickPlayState* client = lookupClient(clientSessionId); + if (client != NULL) { + unsigned long numTSPacketsToStream = client->updateStateFromNPT(seekNPT, streamDuration); + numBytes = numTSPacketsToStream*TRANSPORT_PACKET_SIZE; + } + } +} + +void MPEG2TransportFileServerMediaSubsession +::setStreamScale(unsigned clientSessionId, void* streamToken, float scale) { + if (fIndexFile != NULL) { // we support 'trick play' + ClientTrickPlayState* client = lookupClient(clientSessionId); + if (client != NULL) { + client->setNextScale(scale); // scale won't take effect until the next "PLAY" + } + } + + // Call the original, default version of this routine: + OnDemandServerMediaSubsession::setStreamScale(clientSessionId, streamToken, scale); +} + +void MPEG2TransportFileServerMediaSubsession +::deleteStream(unsigned clientSessionId, void*& streamToken) { + if (fIndexFile != NULL) { // we support 'trick play' + ClientTrickPlayState* client = lookupClient(clientSessionId); + if (client != NULL) { + client->updateStateOnPlayChange(False); + } + } + + // Call the original, default version of this routine: + OnDemandServerMediaSubsession::deleteStream(clientSessionId, streamToken); +} + +ClientTrickPlayState* MPEG2TransportFileServerMediaSubsession::newClientTrickPlayState() { + return new ClientTrickPlayState(fIndexFile); +} + +FramedSource* MPEG2TransportFileServerMediaSubsession +::createNewStreamSource(unsigned clientSessionId, unsigned& estBitrate) { + // Create the video source: + unsigned const inputDataChunkSize + = TRANSPORT_PACKETS_PER_NETWORK_PACKET*TRANSPORT_PACKET_SIZE; + ByteStreamFileSource* fileSource + = ByteStreamFileSource::createNew(envir(), fFileName, inputDataChunkSize); + if (fileSource == NULL) return NULL; + fFileSize = fileSource->fileSize(); + + // Use the file size and the duration to estimate the stream's bitrate: + if (fFileSize > 0 && fDuration > 0.0) { + estBitrate = (unsigned)((int64_t)fFileSize/(125*fDuration) + 0.5); // kbps, rounded + } else { + estBitrate = 5000; // kbps, estimate + } + + + // Create a framer for the Transport Stream: + MPEG2TransportStreamFramer* framer + = MPEG2TransportStreamFramer::createNew(envir(), fileSource); + + if (fIndexFile != NULL) { // we support 'trick play' + // Keep state for this client (if we don't already have it): + ClientTrickPlayState* client = lookupClient(clientSessionId); + if (client == NULL) { + client = newClientTrickPlayState(); + fClientSessionHashTable->Add((char const*)clientSessionId, client); + } + client->setSource(framer); + } + + return framer; +} + +RTPSink* MPEG2TransportFileServerMediaSubsession +::createNewRTPSink(Groupsock* rtpGroupsock, + unsigned char /*rtpPayloadTypeIfDynamic*/, + FramedSource* /*inputSource*/) { + return SimpleRTPSink::createNew(envir(), rtpGroupsock, + 33, 90000, "video", "MP2T", + 1, True, False /*no 'M' bit*/); +} + +void MPEG2TransportFileServerMediaSubsession::testScaleFactor(float& scale) { + if (fIndexFile != NULL && fDuration > 0.0) { + // We support any integral scale, other than 0 + int iScale = scale < 0.0 ? (int)(scale - 0.5f) : (int)(scale + 0.5f); // round + if (iScale == 0) iScale = 1; + scale = (float)iScale; + } else { + scale = 1.0f; + } +} + +float MPEG2TransportFileServerMediaSubsession::duration() const { + return fDuration; +} + +ClientTrickPlayState* MPEG2TransportFileServerMediaSubsession +::lookupClient(unsigned clientSessionId) { + return (ClientTrickPlayState*)(fClientSessionHashTable->Lookup((char const*)clientSessionId)); +} + + +////////// ClientTrickPlayState implementation ////////// + +ClientTrickPlayState::ClientTrickPlayState(MPEG2TransportStreamIndexFile* indexFile) + : fIndexFile(indexFile), + fOriginalTransportStreamSource(NULL), + fTrickModeFilter(NULL), fTrickPlaySource(NULL), + fFramer(NULL), + fScale(1.0f), fNextScale(1.0f), fNPT(0.0f), + fTSRecordNum(0), fIxRecordNum(0) { +} + +unsigned long ClientTrickPlayState::updateStateFromNPT(double npt, double streamDuration) { + fNPT = (float)npt; + // Map "fNPT" to the corresponding Transport Stream and Index record numbers: + unsigned long tsRecordNum, ixRecordNum; + fIndexFile->lookupTSPacketNumFromNPT(fNPT, tsRecordNum, ixRecordNum); + + updateTSRecordNum(); + if (tsRecordNum != fTSRecordNum) { + fTSRecordNum = tsRecordNum; + fIxRecordNum = ixRecordNum; + + // Seek the source to the new record number: + reseekOriginalTransportStreamSource(); + // Note: We assume that we're asked to seek only in normal + // (i.e., non trick play) mode, so we don't seek within the trick + // play source (if any). + + fFramer->clearPIDStatusTable(); + } + + unsigned long numTSRecordsToStream = 0; + float pcrLimit = 0.0; + if (streamDuration > 0.0) { + // fNPT might have changed when we looked it up in the index file. Adjust "streamDuration" accordingly: + streamDuration += npt - (double)fNPT; + + if (streamDuration > 0.0) { + // Specify that we want to stream no more data than this. + + if (fNextScale == 1.0f) { + // We'll be streaming from the original file. + // Use the index file to figure out how many Transport Packets we get to stream: + unsigned long toTSRecordNum, toIxRecordNum; + float toNPT = (float)(fNPT + streamDuration); + fIndexFile->lookupTSPacketNumFromNPT(toNPT, toTSRecordNum, toIxRecordNum); + if (toTSRecordNum > tsRecordNum) { // sanity check + numTSRecordsToStream = toTSRecordNum - tsRecordNum; + } + } else { + // We'll be streaming from the trick play stream. + // It'd be difficult to figure out how many Transport Packets we need to stream, so instead set a PCR + // limit in the trick play stream. (We rely upon the fact that PCRs in the trick play stream start at 0.0) + int direction = fNextScale < 0.0 ? -1 : 1; + pcrLimit = (float)(streamDuration/(fNextScale*direction)); + } + } + } + fFramer->setNumTSPacketsToStream(numTSRecordsToStream); + fFramer->setPCRLimit(pcrLimit); + + return numTSRecordsToStream; +} + +void ClientTrickPlayState::updateStateOnScaleChange() { + fScale = fNextScale; + + // Change our source objects to reflect the change in scale: + // First, close the existing trick play source (if any): + if (fTrickPlaySource != NULL) { + fTrickModeFilter->forgetInputSource(); + // so that the underlying Transport Stream source doesn't get deleted by: + Medium::close(fTrickPlaySource); + fTrickPlaySource = NULL; + fTrickModeFilter = NULL; + } + if (fNextScale != 1.0f) { + // Create a new trick play filter from the original Transport Stream source: + UsageEnvironment& env = fIndexFile->envir(); // alias + fTrickModeFilter = MPEG2TransportStreamTrickModeFilter + ::createNew(env, fOriginalTransportStreamSource, fIndexFile, int(fNextScale)); + fTrickModeFilter->seekTo(fTSRecordNum, fIxRecordNum); + + // And generate a Transport Stream from this: + fTrickPlaySource = MPEG2TransportStreamFromESSource::createNew(env); + fTrickPlaySource->addNewVideoSource(fTrickModeFilter, fIndexFile->mpegVersion()); + + fFramer->changeInputSource(fTrickPlaySource); + } else { + // Switch back to the original Transport Stream source: + reseekOriginalTransportStreamSource(); + fFramer->changeInputSource(fOriginalTransportStreamSource); + } +} + +void ClientTrickPlayState::updateStateOnPlayChange(Boolean reverseToPreviousVSH) { + updateTSRecordNum(); + if (fTrickPlaySource == NULL) { + // We were in regular (1x) play. Use the index file to look up the + // index record number and npt from the current transport number: + fIndexFile->lookupPCRFromTSPacketNum(fTSRecordNum, reverseToPreviousVSH, fNPT, fIxRecordNum); + } else { + // We were in trick mode, and so already have the index record number. + // Get the transport record number and npt from this: + fIxRecordNum = fTrickModeFilter->nextIndexRecordNum(); + if ((long)fIxRecordNum < 0) fIxRecordNum = 0; // we were at the start of the file + unsigned long transportRecordNum; + float pcr; + u_int8_t offset, size, recordType; // all dummy + if (fIndexFile->readIndexRecordValues(fIxRecordNum, transportRecordNum, + offset, size, pcr, recordType)) { + fTSRecordNum = transportRecordNum; + fNPT = pcr; + } + } +} + +void ClientTrickPlayState::setSource(MPEG2TransportStreamFramer* framer) { + fFramer = framer; + fOriginalTransportStreamSource = (ByteStreamFileSource*)(framer->inputSource()); +} + +void ClientTrickPlayState::updateTSRecordNum(){ + if (fFramer != NULL) fTSRecordNum += (unsigned long)(fFramer->tsPacketCount()); +} + +void ClientTrickPlayState::reseekOriginalTransportStreamSource() { + u_int64_t tsRecordNum64 = (u_int64_t)fTSRecordNum; + fOriginalTransportStreamSource->seekToByteAbsolute(tsRecordNum64*TRANSPORT_PACKET_SIZE); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportStreamAccumulator.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportStreamAccumulator.cpp new file mode 100644 index 000000000..f6903f7ce --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportStreamAccumulator.cpp @@ -0,0 +1,85 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Collects a stream of incoming MPEG Transport Stream packets into +// a chunk sufficiently large to send in a single outgoing (RTP or UDP) packet. +// Implementation + +#include "MPEG2TransportStreamAccumulator.hh" + +MPEG2TransportStreamAccumulator* +MPEG2TransportStreamAccumulator::createNew(UsageEnvironment& env, + FramedSource* inputSource, unsigned maxPacketSize) { + return new MPEG2TransportStreamAccumulator(env, inputSource, maxPacketSize); +} + +#ifndef TRANSPORT_PACKET_SIZE +#define TRANSPORT_PACKET_SIZE 188 +#endif + +MPEG2TransportStreamAccumulator +::MPEG2TransportStreamAccumulator(UsageEnvironment& env, + FramedSource* inputSource, unsigned maxPacketSize) + : FramedFilter(env, inputSource), + fDesiredPacketSize(maxPacketSize < TRANSPORT_PACKET_SIZE ? TRANSPORT_PACKET_SIZE : (maxPacketSize/TRANSPORT_PACKET_SIZE)), + fNumBytesGathered(0) { +} + +MPEG2TransportStreamAccumulator::~MPEG2TransportStreamAccumulator() { +} + +void MPEG2TransportStreamAccumulator::doGetNextFrame() { + if (fNumBytesGathered >= fDesiredPacketSize) { + // Complete the delivery to the client: + fFrameSize = fNumBytesGathered; + fNumBytesGathered = 0; + afterGetting(this); + } else { + // Ask for more data (delivered directly to the client's buffer); + fInputSource->getNextFrame(fTo, fMaxSize, afterGettingFrame, this, + FramedSource::handleClosure, this); + } +} + +void MPEG2TransportStreamAccumulator +::afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds) { + MPEG2TransportStreamAccumulator* accumulator + = (MPEG2TransportStreamAccumulator*)clientData; + accumulator->afterGettingFrame1(frameSize, numTruncatedBytes, + presentationTime, durationInMicroseconds); +} + +void MPEG2TransportStreamAccumulator +::afterGettingFrame1(unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds) { + if (fNumBytesGathered == 0) { // this is the first frame of the new chunk + fPresentationTime = presentationTime; + fDurationInMicroseconds = 0; + } + fNumBytesGathered += frameSize; + fTo += frameSize; + fMaxSize -= frameSize; + fDurationInMicroseconds += durationInMicroseconds; + + // Try again to complete delivery: + doGetNextFrame(); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportStreamDemux.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportStreamDemux.cpp new file mode 100644 index 000000000..c89b6d60d --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportStreamDemux.cpp @@ -0,0 +1,49 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Demultiplexer for a MPEG Transport Stream +// Implementation + +#include "MPEG2TransportStreamDemux.hh" +#include "MPEG2TransportStreamParser.hh" + +MPEG2TransportStreamDemux* MPEG2TransportStreamDemux +::createNew(UsageEnvironment& env, FramedSource* inputSource, + FramedSource::onCloseFunc* onCloseFunc, void* onCloseClientData) { + return new MPEG2TransportStreamDemux(env, inputSource, onCloseFunc, onCloseClientData); +} + +MPEG2TransportStreamDemux +::MPEG2TransportStreamDemux(UsageEnvironment& env, FramedSource* inputSource, + FramedSource::onCloseFunc* onCloseFunc, void* onCloseClientData) + : Medium(env), + fOnCloseFunc(onCloseFunc), fOnCloseClientData(onCloseClientData) { + fParser = new MPEG2TransportStreamParser(inputSource, handleEndOfFile, this); +} + +MPEG2TransportStreamDemux::~MPEG2TransportStreamDemux() { + delete fParser; +} + +void MPEG2TransportStreamDemux::handleEndOfFile(void* clientData) { + ((MPEG2TransportStreamDemux*)clientData)->handleEndOfFile(); +} + +void MPEG2TransportStreamDemux::handleEndOfFile() { + if (fOnCloseFunc != NULL) (*fOnCloseFunc)(fOnCloseClientData); + delete this; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportStreamDemuxedTrack.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportStreamDemuxedTrack.cpp new file mode 100644 index 000000000..47aa358b8 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportStreamDemuxedTrack.cpp @@ -0,0 +1,34 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A media track, demultiplexed from a MPEG Transport Stream file +// Implementation + +#include "MPEG2TransportStreamParser.hh" + +MPEG2TransportStreamDemuxedTrack +::MPEG2TransportStreamDemuxedTrack(MPEG2TransportStreamParser& ourParser, u_int16_t pid) + : FramedSource(ourParser.envir()), + fOurParser(ourParser), fPID(pid) { +} + +MPEG2TransportStreamDemuxedTrack::~MPEG2TransportStreamDemuxedTrack() { +} + +void MPEG2TransportStreamDemuxedTrack::doGetNextFrame() { + fOurParser.continueParsing(); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportStreamDemuxedTrack.hh b/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportStreamDemuxedTrack.hh new file mode 100644 index 000000000..59c493ae0 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportStreamDemuxedTrack.hh @@ -0,0 +1,50 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A media track, demultiplexed from a MPEG Transport Stream file +// C++ header + +#ifndef _MPEG2_TRANSPORT_STREAM_DEMUXED_TRACK_HH +#define _MPEG2_TRANSPORT_STREAM_DEMUXED_TRACK_HH + +#ifndef _MPEG2_TRANSPORT_STREAM_DEMUX_HH +#include "MPEG2TransportStreamDemux.hh" +#endif + +class MPEG2TransportStreamDemuxedTrack: public FramedSource { +public: + MPEG2TransportStreamDemuxedTrack(class MPEG2TransportStreamParser& ourParser, u_int16_t pid); + virtual ~MPEG2TransportStreamDemuxedTrack(); + +private: + // redefined virtual functions: + virtual void doGetNextFrame(); + +private: // We are accessed only by "MPEG2TransportStreamParser" (a friend) + friend class MPEG2TransportStreamParser; + unsigned char* to() { return fTo; } + unsigned maxSize() { return fMaxSize; } + unsigned& frameSize() { return fFrameSize; } + unsigned& numTruncatedBytes() { return fNumTruncatedBytes; } + struct timeval& presentationTime() { return fPresentationTime; } + +private: + class MPEG2TransportStreamParser& fOurParser; + u_int16_t fPID; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportStreamFramer.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportStreamFramer.cpp new file mode 100644 index 000000000..5577acc85 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportStreamFramer.cpp @@ -0,0 +1,290 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A filter that passes through (unchanged) chunks that contain an integral number +// of MPEG-2 Transport Stream packets, but returning (in "fDurationInMicroseconds") +// an updated estimate of the time gap between chunks. +// Implementation + +#include "MPEG2TransportStreamFramer.hh" +#include // for "gettimeofday()" + +#define TRANSPORT_PACKET_SIZE 188 + +////////// Definitions of constants that control the behavior of this code ///////// + +#if !defined(NEW_DURATION_WEIGHT) +#define NEW_DURATION_WEIGHT 0.5 + // How much weight to give to the latest duration measurement (must be <= 1) +#endif + +#if !defined(TIME_ADJUSTMENT_FACTOR) +#define TIME_ADJUSTMENT_FACTOR 0.8 + // A factor by which to adjust the duration estimate to ensure that the overall + // packet transmission times remains matched with the PCR times (which will be the + // times that we expect receivers to play the incoming packets). + // (must be <= 1) +#endif + +#if !defined(MAX_PLAYOUT_BUFFER_DURATION) +#define MAX_PLAYOUT_BUFFER_DURATION 0.1 // (seconds) +#endif + +#if !defined(PCR_PERIOD_VARIATION_RATIO) +#define PCR_PERIOD_VARIATION_RATIO 0.5 +#endif + +////////// PIDStatus ////////// + +class PIDStatus { +public: + PIDStatus(double _firstClock, double _firstRealTime) + : firstClock(_firstClock), lastClock(_firstClock), + firstRealTime(_firstRealTime), lastRealTime(_firstRealTime), + lastPacketNum(0) { + } + + double firstClock, lastClock, firstRealTime, lastRealTime; + u_int64_t lastPacketNum; +}; + + +////////// MPEG2TransportStreamFramer ////////// + +MPEG2TransportStreamFramer* MPEG2TransportStreamFramer +::createNew(UsageEnvironment& env, FramedSource* inputSource) { + return new MPEG2TransportStreamFramer(env, inputSource); +} + +MPEG2TransportStreamFramer +::MPEG2TransportStreamFramer(UsageEnvironment& env, FramedSource* inputSource) + : FramedFilter(env, inputSource), + fTSPacketCount(0), fTSPacketDurationEstimate(0.0), fTSPCRCount(0), + fLimitNumTSPacketsToStream(False), fNumTSPacketsToStream(0), + fLimitTSPacketsToStreamByPCR(False), fPCRLimit(0.0) { + fPIDStatusTable = HashTable::create(ONE_WORD_HASH_KEYS); +} + +MPEG2TransportStreamFramer::~MPEG2TransportStreamFramer() { + clearPIDStatusTable(); + delete fPIDStatusTable; +} + +void MPEG2TransportStreamFramer::clearPIDStatusTable() { + PIDStatus* pidStatus; + while ((pidStatus = (PIDStatus*)fPIDStatusTable->RemoveNext()) != NULL) { + delete pidStatus; + } +} + +void MPEG2TransportStreamFramer::setNumTSPacketsToStream(unsigned long numTSRecordsToStream) { + fNumTSPacketsToStream = numTSRecordsToStream; + fLimitNumTSPacketsToStream = numTSRecordsToStream > 0; +} + +void MPEG2TransportStreamFramer::setPCRLimit(float pcrLimit) { + fPCRLimit = pcrLimit; + fLimitTSPacketsToStreamByPCR = pcrLimit != 0.0; +} + +void MPEG2TransportStreamFramer::doGetNextFrame() { + if (fLimitNumTSPacketsToStream) { + if (fNumTSPacketsToStream == 0) { + handleClosure(); + return; + } + if (fNumTSPacketsToStream*TRANSPORT_PACKET_SIZE < fMaxSize) { + fMaxSize = fNumTSPacketsToStream*TRANSPORT_PACKET_SIZE; + } + } + + // Read directly from our input source into our client's buffer: + fFrameSize = 0; + fInputSource->getNextFrame(fTo, fMaxSize, + afterGettingFrame, this, + FramedSource::handleClosure, this); +} + +void MPEG2TransportStreamFramer::doStopGettingFrames() { + FramedFilter::doStopGettingFrames(); + fTSPacketCount = 0; + fTSPCRCount = 0; + + clearPIDStatusTable(); +} + +void MPEG2TransportStreamFramer +::afterGettingFrame(void* clientData, unsigned frameSize, + unsigned /*numTruncatedBytes*/, + struct timeval presentationTime, + unsigned /*durationInMicroseconds*/) { + MPEG2TransportStreamFramer* framer = (MPEG2TransportStreamFramer*)clientData; + framer->afterGettingFrame1(frameSize, presentationTime); +} + +#define TRANSPORT_SYNC_BYTE 0x47 + +void MPEG2TransportStreamFramer::afterGettingFrame1(unsigned frameSize, + struct timeval presentationTime) { + fFrameSize += frameSize; + unsigned const numTSPackets = fFrameSize/TRANSPORT_PACKET_SIZE; + fNumTSPacketsToStream -= numTSPackets; + fFrameSize = numTSPackets*TRANSPORT_PACKET_SIZE; // an integral # of TS packets + if (fFrameSize == 0) { + // We didn't read a complete TS packet; assume that the input source has closed. + handleClosure(); + return; + } + + // Make sure the data begins with a sync byte: + unsigned syncBytePosition; + for (syncBytePosition = 0; syncBytePosition < fFrameSize; ++syncBytePosition) { + if (fTo[syncBytePosition] == TRANSPORT_SYNC_BYTE) break; + } + if (syncBytePosition == fFrameSize) { + envir() << "No Transport Stream sync byte in data."; + handleClosure(); + return; + } else if (syncBytePosition > 0) { + // There's a sync byte, but not at the start of the data. Move the good data + // to the start of the buffer, then read more to fill it up again: + memmove(fTo, &fTo[syncBytePosition], fFrameSize - syncBytePosition); + fFrameSize -= syncBytePosition; + fInputSource->getNextFrame(&fTo[fFrameSize], syncBytePosition, + afterGettingFrame, this, + FramedSource::handleClosure, this); + return; + } // else normal case: the data begins with a sync byte + + fPresentationTime = presentationTime; + + // Scan through the TS packets that we read, and update our estimate of + // the duration of each packet: + struct timeval tvNow; + gettimeofday(&tvNow, NULL); + double timeNow = tvNow.tv_sec + tvNow.tv_usec/1000000.0; + for (unsigned i = 0; i < numTSPackets; ++i) { + if (!updateTSPacketDurationEstimate(&fTo[i*TRANSPORT_PACKET_SIZE], timeNow)) { + // We hit a preset limit (based on PCR) within the stream. Handle this as if the input source has closed: + handleClosure(); + return; + } + } + + fDurationInMicroseconds + = numTSPackets * (unsigned)(fTSPacketDurationEstimate*1000000); + + // Complete the delivery to our client: + afterGetting(this); +} + +Boolean MPEG2TransportStreamFramer::updateTSPacketDurationEstimate(unsigned char* pkt, double timeNow) { + // Sanity check: Make sure we start with the sync byte: + if (pkt[0] != TRANSPORT_SYNC_BYTE) { + envir() << "Missing sync byte!\n"; + return True; + } + + ++fTSPacketCount; + + // If this packet doesn't contain a PCR, then we're not interested in it: + u_int8_t const adaptation_field_control = (pkt[3]&0x30)>>4; + if (adaptation_field_control != 2 && adaptation_field_control != 3) return True; + // there's no adaptation_field + + u_int8_t const adaptation_field_length = pkt[4]; + if (adaptation_field_length == 0) return True; + + u_int8_t const discontinuity_indicator = pkt[5]&0x80; + u_int8_t const pcrFlag = pkt[5]&0x10; + if (pcrFlag == 0) return True; // no PCR + + // There's a PCR. Get it, and the PID: + ++fTSPCRCount; + u_int32_t pcrBaseHigh = (pkt[6]<<24)|(pkt[7]<<16)|(pkt[8]<<8)|pkt[9]; + double clock = pcrBaseHigh/45000.0; + if ((pkt[10]&0x80) != 0) clock += 1/90000.0; // add in low-bit (if set) + unsigned short pcrExt = ((pkt[10]&0x01)<<8) | pkt[11]; + clock += pcrExt/27000000.0; + if (fLimitTSPacketsToStreamByPCR) { + if (clock > fPCRLimit) { + // We've hit a preset limit within the stream: + return False; + } + } + + unsigned pid = ((pkt[1]&0x1F)<<8) | pkt[2]; + + // Check whether we already have a record of a PCR for this PID: + PIDStatus* pidStatus = (PIDStatus*)(fPIDStatusTable->Lookup((char*)pid)); + + if (pidStatus == NULL) { + // We're seeing this PID's PCR for the first time: + pidStatus = new PIDStatus(clock, timeNow); + fPIDStatusTable->Add((char*)pid, pidStatus); +#ifdef DEBUG_PCR + fprintf(stderr, "PID 0x%x, FIRST PCR 0x%08x+%d:%03x == %f @ %f, pkt #%lu\n", pid, pcrBaseHigh, pkt[10]>>7, pcrExt, clock, timeNow, fTSPacketCount); +#endif + } else { + // We've seen this PID's PCR before; update our per-packet duration estimate: + int64_t packetsSinceLast = (int64_t)(fTSPacketCount - pidStatus->lastPacketNum); + // it's "int64_t" because some compilers can't convert "u_int64_t" -> "double" + double durationPerPacket = (clock - pidStatus->lastClock)/packetsSinceLast; + + // Hack (suggested by "Romain"): Don't update our estimate if this PCR appeared unusually quickly. + // (This can produce more accurate estimates for wildly VBR streams.) + double meanPCRPeriod = 0.0; + if (fTSPCRCount > 0) { + double tsPacketCount = (double)(int64_t)fTSPacketCount; + double tsPCRCount = (double)(int64_t)fTSPCRCount; + meanPCRPeriod = tsPacketCount/tsPCRCount; + if (packetsSinceLast < meanPCRPeriod*PCR_PERIOD_VARIATION_RATIO) return True; + } + + if (fTSPacketDurationEstimate == 0.0) { // we've just started + fTSPacketDurationEstimate = durationPerPacket; + } else if (discontinuity_indicator == 0 && durationPerPacket >= 0.0) { + fTSPacketDurationEstimate + = durationPerPacket*NEW_DURATION_WEIGHT + + fTSPacketDurationEstimate*(1-NEW_DURATION_WEIGHT); + + // Also adjust the duration estimate to try to ensure that the transmission + // rate matches the playout rate: + double transmitDuration = timeNow - pidStatus->firstRealTime; + double playoutDuration = clock - pidStatus->firstClock; + if (transmitDuration > playoutDuration) { + fTSPacketDurationEstimate *= TIME_ADJUSTMENT_FACTOR; // reduce estimate + } else if (transmitDuration + MAX_PLAYOUT_BUFFER_DURATION < playoutDuration) { + fTSPacketDurationEstimate /= TIME_ADJUSTMENT_FACTOR; // increase estimate + } + } else { + // the PCR has a discontinuity from its previous value; don't use it now, + // but reset our PCR and real-time values to compensate: + pidStatus->firstClock = clock; + pidStatus->firstRealTime = timeNow; + } +#ifdef DEBUG_PCR + fprintf(stderr, "PID 0x%x, PCR 0x%08x+%d:%03x == %f @ %f (diffs %f @ %f), pkt #%lu, discon %d => this duration %f, new estimate %f, mean PCR period=%f\n", pid, pcrBaseHigh, pkt[10]>>7, pcrExt, clock, timeNow, clock - pidStatus->firstClock, timeNow - pidStatus->firstRealTime, fTSPacketCount, discontinuity_indicator != 0, durationPerPacket, fTSPacketDurationEstimate, meanPCRPeriod ); +#endif + } + + pidStatus->lastClock = clock; + pidStatus->lastRealTime = timeNow; + pidStatus->lastPacketNum = fTSPacketCount; + + return True; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportStreamFromESSource.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportStreamFromESSource.cpp new file mode 100644 index 000000000..da1857cb7 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportStreamFromESSource.cpp @@ -0,0 +1,268 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A filter for converting one or more MPEG Elementary Streams +// to a MPEG-2 Transport Stream +// Implementation + +#include "MPEG2TransportStreamFromESSource.hh" + +#define SIMPLE_PES_HEADER_SIZE 14 +#define INPUT_BUFFER_SIZE (SIMPLE_PES_HEADER_SIZE + 2*MPEG2TransportStreamFromESSource::maxInputESFrameSize) +#ifndef TS_FROM_ES_LOW_WATER_MARK +#define TS_FROM_ES_LOW_WATER_MARK 1000 // <= MPEG2TransportStreamFromESSource::maxInputESFrameSize +#endif + +////////// InputESSourceRecord definition ////////// + +class InputESSourceRecord { +public: + InputESSourceRecord(MPEG2TransportStreamFromESSource& parent, + FramedSource* inputSource, + u_int8_t streamId, int mpegVersion, + InputESSourceRecord* next, int16_t PID = -1); + virtual ~InputESSourceRecord(); + + InputESSourceRecord* next() const { return fNext; } + FramedSource* inputSource() const { return fInputSource; } + + void askForNewData(); + Boolean deliverBufferToClient(); + + unsigned char* buffer() const { return fInputBuffer; } + void reset() { + // Reset the buffer for future use: + fInputBufferBytesAvailable = 0; + fInputBufferInUse = False; + } + +private: + static void afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + void afterGettingFrame1(unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime); + +private: + InputESSourceRecord* fNext; + MPEG2TransportStreamFromESSource& fParent; + FramedSource* fInputSource; + u_int8_t fStreamId; + int fMPEGVersion; + unsigned char* fInputBuffer; + unsigned fInputBufferBytesAvailable; + Boolean fInputBufferInUse; + MPEG1or2Demux::SCR fSCR; + int16_t fPID; +}; + + +////////// MPEG2TransportStreamFromESSource implementation ////////// + +unsigned MPEG2TransportStreamFromESSource::maxInputESFrameSize = 100000; // bytes + +MPEG2TransportStreamFromESSource* MPEG2TransportStreamFromESSource +::createNew(UsageEnvironment& env) { + return new MPEG2TransportStreamFromESSource(env); +} + +void MPEG2TransportStreamFromESSource +::addNewVideoSource(FramedSource* inputSource, int mpegVersion, int16_t PID) { + u_int8_t streamId = 0xE0 | (fVideoSourceCounter++&0x0F); + addNewInputSource(inputSource, streamId, mpegVersion, PID); + fHaveVideoStreams = True; +} + +void MPEG2TransportStreamFromESSource +::addNewAudioSource(FramedSource* inputSource, int mpegVersion, int16_t PID) { + u_int8_t streamId = 0xC0 | (fAudioSourceCounter++&0x0F); + addNewInputSource(inputSource, streamId, mpegVersion, PID); +} + +MPEG2TransportStreamFromESSource +::MPEG2TransportStreamFromESSource(UsageEnvironment& env) + : MPEG2TransportStreamMultiplexor(env), + fInputSources(NULL), fVideoSourceCounter(0), fAudioSourceCounter(0), + fAwaitingBackgroundDelivery(False) { + fHaveVideoStreams = False; // unless we add a video source +} + +MPEG2TransportStreamFromESSource::~MPEG2TransportStreamFromESSource() { + doStopGettingFrames(); + delete fInputSources; +} + +void MPEG2TransportStreamFromESSource::doStopGettingFrames() { + // Stop each input source: + for (InputESSourceRecord* sourceRec = fInputSources; sourceRec != NULL; + sourceRec = sourceRec->next()) { + sourceRec->inputSource()->stopGettingFrames(); + } +} + +void MPEG2TransportStreamFromESSource +::awaitNewBuffer(unsigned char* oldBuffer) { + InputESSourceRecord* sourceRec; + // Begin by resetting the old buffer: + if (oldBuffer != NULL) { + for (sourceRec = fInputSources; sourceRec != NULL; + sourceRec = sourceRec->next()) { + if (sourceRec->buffer() == oldBuffer) { + sourceRec->reset(); + break; + } + } + fAwaitingBackgroundDelivery = False; + } + + if (isCurrentlyAwaitingData()) { + // Try to deliver one filled-in buffer to the client: + for (sourceRec = fInputSources; sourceRec != NULL; + sourceRec = sourceRec->next()) { + if (sourceRec->deliverBufferToClient()) return; + } + fAwaitingBackgroundDelivery = True; + } + + // No filled-in buffers are available. Ask each of our inputs for data: + for (sourceRec = fInputSources; sourceRec != NULL; + sourceRec = sourceRec->next()) { + sourceRec->askForNewData(); + } +} + +void MPEG2TransportStreamFromESSource +::addNewInputSource(FramedSource* inputSource, + u_int8_t streamId, int mpegVersion, int16_t PID) { + if (inputSource == NULL) return; + fInputSources = new InputESSourceRecord(*this, inputSource, streamId, + mpegVersion, fInputSources, PID); +} + + +////////// InputESSourceRecord implementation ////////// + +InputESSourceRecord +::InputESSourceRecord(MPEG2TransportStreamFromESSource& parent, + FramedSource* inputSource, + u_int8_t streamId, int mpegVersion, + InputESSourceRecord* next, int16_t PID) + : fNext(next), fParent(parent), fInputSource(inputSource), + fStreamId(streamId), fMPEGVersion(mpegVersion), fPID(PID) { + fInputBuffer = new unsigned char[INPUT_BUFFER_SIZE]; + reset(); +} + +InputESSourceRecord::~InputESSourceRecord() { + Medium::close(fInputSource); + delete[] fInputBuffer; + delete fNext; +} + +void InputESSourceRecord::askForNewData() { + if (fInputBufferInUse) return; + + if (fInputBufferBytesAvailable == 0) { + // Reset our buffer, by adding a simple PES header at the start: + fInputBuffer[0] = 0; fInputBuffer[1] = 0; fInputBuffer[2] = 1; + fInputBuffer[3] = fStreamId; + fInputBuffer[4] = 0; fInputBuffer[5] = 0; // fill in later with the length + fInputBuffer[6] = 0x80; + fInputBuffer[7] = 0x80; // include a PTS + fInputBuffer[8] = 5; // PES_header_data_length (enough for a PTS) + // fInputBuffer[9..13] will be the PTS; fill this in later + fInputBufferBytesAvailable = SIMPLE_PES_HEADER_SIZE; + } + if (fInputBufferBytesAvailable < TS_FROM_ES_LOW_WATER_MARK && + !fInputSource->isCurrentlyAwaitingData()) { + // We don't yet have enough data in our buffer. Arrange to read more: + fInputSource->getNextFrame(&fInputBuffer[fInputBufferBytesAvailable], + INPUT_BUFFER_SIZE-fInputBufferBytesAvailable, + afterGettingFrame, this, + FramedSource::handleClosure, &fParent); + } +} + +Boolean InputESSourceRecord::deliverBufferToClient() { + if (fInputBufferInUse || fInputBufferBytesAvailable < TS_FROM_ES_LOW_WATER_MARK) return False; + + // Fill in the PES_packet_length field that we left unset before: + unsigned PES_packet_length = fInputBufferBytesAvailable - 6; + if (PES_packet_length > 0xFFFF) { + // Set the PES_packet_length field to 0. This indicates an unbounded length (see ISO 13818-1, 2.4.3.7) + PES_packet_length = 0; + } + fInputBuffer[4] = PES_packet_length>>8; + fInputBuffer[5] = PES_packet_length; + + // Fill in the PES PTS (from our SCR): + fInputBuffer[9] = 0x20|(fSCR.highBit<<3)|(fSCR.remainingBits>>29)|0x01; + fInputBuffer[10] = fSCR.remainingBits>>22; + fInputBuffer[11] = (fSCR.remainingBits>>14)|0x01; + fInputBuffer[12] = fSCR.remainingBits>>7; + fInputBuffer[13] = (fSCR.remainingBits<<1)|0x01; + + fInputBufferInUse = True; + + // Do the delivery: + fParent.handleNewBuffer(fInputBuffer, fInputBufferBytesAvailable, + fMPEGVersion, fSCR, fPID); + + return True; +} + +void InputESSourceRecord +::afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned /*durationInMicroseconds*/) { + InputESSourceRecord* source = (InputESSourceRecord*)clientData; + source->afterGettingFrame1(frameSize, numTruncatedBytes, presentationTime); +} +void InputESSourceRecord +::afterGettingFrame1(unsigned frameSize, unsigned numTruncatedBytes, + struct timeval presentationTime) { + if (numTruncatedBytes > 0) { + fParent.envir() << "MPEG2TransportStreamFromESSource: input buffer too small; increase \"MPEG2TransportStreamFromESSource::maxInputESFrameSize\" by at least " + << numTruncatedBytes << " bytes!\n"; + } + + if (fInputBufferBytesAvailable == SIMPLE_PES_HEADER_SIZE) { + // Use this presentationTime for our SCR: + fSCR.highBit + = ((presentationTime.tv_sec*45000 + (presentationTime.tv_usec*9)/200)& + 0x80000000) != 0; + fSCR.remainingBits + = presentationTime.tv_sec*90000 + (presentationTime.tv_usec*9)/100; + fSCR.extension = (presentationTime.tv_usec*9)%100; +#ifdef DEBUG_SCR + fprintf(stderr, "PES header: stream_id 0x%02x, pts: %u.%06u => SCR 0x%x%08x:%03x\n", fStreamId, (unsigned)presentationTime.tv_sec, (unsigned)presentationTime.tv_usec, fSCR.highBit, fSCR.remainingBits, fSCR.extension); +#endif + } + + fInputBufferBytesAvailable += frameSize; + + fParent.fPresentationTime = presentationTime; + + // Now that we have new input data, check if we can deliver to the client: + if (fParent.fAwaitingBackgroundDelivery) { + fParent.fAwaitingBackgroundDelivery = False; + fParent.awaitNewBuffer(NULL); + } +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportStreamFromPESSource.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportStreamFromPESSource.cpp new file mode 100644 index 000000000..79c31794e --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportStreamFromPESSource.cpp @@ -0,0 +1,74 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A filter for converting a stream of MPEG PES packets to a MPEG-2 Transport Stream +// Implementation + +#include "MPEG2TransportStreamFromPESSource.hh" + +#define MAX_PES_PACKET_SIZE (6+65535) + +MPEG2TransportStreamFromPESSource* MPEG2TransportStreamFromPESSource +::createNew(UsageEnvironment& env, MPEG1or2DemuxedElementaryStream* inputSource) { + return new MPEG2TransportStreamFromPESSource(env, inputSource); +} + +MPEG2TransportStreamFromPESSource +::MPEG2TransportStreamFromPESSource(UsageEnvironment& env, + MPEG1or2DemuxedElementaryStream* inputSource) + : MPEG2TransportStreamMultiplexor(env), + fInputSource(inputSource) { + fInputBuffer = new unsigned char[MAX_PES_PACKET_SIZE]; +} + +MPEG2TransportStreamFromPESSource::~MPEG2TransportStreamFromPESSource() { + Medium::close(fInputSource); + delete[] fInputBuffer; +} + +void MPEG2TransportStreamFromPESSource::doStopGettingFrames() { + fInputSource->stopGettingFrames(); +} + +void MPEG2TransportStreamFromPESSource +::awaitNewBuffer(unsigned char* /*oldBuffer*/) { + fInputSource->getNextFrame(fInputBuffer, MAX_PES_PACKET_SIZE, + afterGettingFrame, this, + FramedSource::handleClosure, this); +} + +void MPEG2TransportStreamFromPESSource +::afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds) { + MPEG2TransportStreamFromPESSource* source + = (MPEG2TransportStreamFromPESSource*)clientData; + source->afterGettingFrame1(frameSize, numTruncatedBytes, + presentationTime, durationInMicroseconds); +} + +void MPEG2TransportStreamFromPESSource +::afterGettingFrame1(unsigned frameSize, + unsigned /*numTruncatedBytes*/, + struct timeval /*presentationTime*/, + unsigned /*durationInMicroseconds*/) { + if (frameSize < 4) return; + + handleNewBuffer(fInputBuffer, frameSize, + fInputSource->mpegVersion(), fInputSource->lastSeenSCR()); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportStreamIndexFile.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportStreamIndexFile.cpp new file mode 100644 index 000000000..9514118dc --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportStreamIndexFile.cpp @@ -0,0 +1,349 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A class that encapsulates MPEG-2 Transport Stream 'index files'/ +// These index files are used to implement 'trick play' operations +// (seek-by-time, fast forward, reverse play) on Transport Stream files. +// +// Implementation + +#include "MPEG2TransportStreamIndexFile.hh" +#include "InputFile.hh" + +MPEG2TransportStreamIndexFile +::MPEG2TransportStreamIndexFile(UsageEnvironment& env, char const* indexFileName) + : Medium(env), + fFileName(strDup(indexFileName)), fFid(NULL), fMPEGVersion(0), fCurrentIndexRecordNum(0), + fCachedPCR(0.0f), fCachedTSPacketNumber(0), fNumIndexRecords(0) { + // Get the file size, to determine how many index records it contains: + u_int64_t indexFileSize = GetFileSize(indexFileName, NULL); + if (indexFileSize % INDEX_RECORD_SIZE != 0) { + env << "Warning: Size of the index file \"" << indexFileName + << "\" (" << (unsigned)indexFileSize + << ") is not a multiple of the index record size (" + << INDEX_RECORD_SIZE << ")\n"; + } + fNumIndexRecords = (unsigned long)(indexFileSize/INDEX_RECORD_SIZE); +} + +MPEG2TransportStreamIndexFile* MPEG2TransportStreamIndexFile +::createNew(UsageEnvironment& env, char const* indexFileName) { + if (indexFileName == NULL) return NULL; + MPEG2TransportStreamIndexFile* indexFile + = new MPEG2TransportStreamIndexFile(env, indexFileName); + + // Reject empty or non-existent index files: + if (indexFile->getPlayingDuration() == 0.0f) { + delete indexFile; + indexFile = NULL; + } + + return indexFile; +} + +MPEG2TransportStreamIndexFile::~MPEG2TransportStreamIndexFile() { + closeFid(); + delete[] fFileName; +} + +void MPEG2TransportStreamIndexFile +::lookupTSPacketNumFromNPT(float& npt, unsigned long& tsPacketNumber, + unsigned long& indexRecordNumber) { + if (npt <= 0.0 || fNumIndexRecords == 0) { // Fast-track a common case: + npt = 0.0f; + tsPacketNumber = indexRecordNumber = 0; + return; + } + + // If "npt" is the same as the one that we last looked up, return its cached result: + if (npt == fCachedPCR) { + tsPacketNumber = fCachedTSPacketNumber; + indexRecordNumber = fCachedIndexRecordNumber; + return; + } + + // Search for the pair of neighboring index records whose PCR values span "npt". + // Use the 'regula-falsi' method. + Boolean success = False; + unsigned long ixFound = 0; + do { + unsigned long ixLeft = 0, ixRight = fNumIndexRecords-1; + float pcrLeft = 0.0f, pcrRight; + if (!readIndexRecord(ixRight)) break; + pcrRight = pcrFromBuf(); + if (npt > pcrRight) npt = pcrRight; + // handle "npt" too large by seeking to the last frame of the file + + while (ixRight-ixLeft > 1 && pcrLeft < npt && npt <= pcrRight) { + unsigned long ixNew = ixLeft + + (unsigned long)(((npt-pcrLeft)/(pcrRight-pcrLeft))*(ixRight-ixLeft)); + if (ixNew == ixLeft || ixNew == ixRight) { + // use bisection instead: + ixNew = (ixLeft+ixRight)/2; + } + if (!readIndexRecord(ixNew)) break; + float pcrNew = pcrFromBuf(); + if (pcrNew < npt) { + pcrLeft = pcrNew; + ixLeft = ixNew; + } else { + pcrRight = pcrNew; + ixRight = ixNew; + } + } + if (ixRight-ixLeft > 1 || npt <= pcrLeft || npt > pcrRight) break; // bad PCR values in index file? + + ixFound = ixRight; + // "Rewind' until we reach the start of a Video Sequence or GOP header: + success = rewindToCleanPoint(ixFound); + } while (0); + + if (success && readIndexRecord(ixFound)) { + // Return (and cache) information from record "ixFound": + npt = fCachedPCR = pcrFromBuf(); + tsPacketNumber = fCachedTSPacketNumber = tsPacketNumFromBuf(); + indexRecordNumber = fCachedIndexRecordNumber = ixFound; + } else { + // An error occurred: Return the default values, for npt == 0: + npt = 0.0f; + tsPacketNumber = indexRecordNumber = 0; + } + closeFid(); +} + +void MPEG2TransportStreamIndexFile +::lookupPCRFromTSPacketNum(unsigned long& tsPacketNumber, Boolean reverseToPreviousCleanPoint, + float& pcr, unsigned long& indexRecordNumber) { + if (tsPacketNumber == 0 || fNumIndexRecords == 0) { // Fast-track a common case: + pcr = 0.0f; + indexRecordNumber = 0; + return; + } + + // If "tsPacketNumber" is the same as the one that we last looked up, return its cached result: + if (tsPacketNumber == fCachedTSPacketNumber) { + pcr = fCachedPCR; + indexRecordNumber = fCachedIndexRecordNumber; + return; + } + + // Search for the pair of neighboring index records whose TS packet #s span "tsPacketNumber". + // Use the 'regula-falsi' method. + Boolean success = False; + unsigned long ixFound = 0; + do { + unsigned long ixLeft = 0, ixRight = fNumIndexRecords-1; + unsigned long tsLeft = 0, tsRight; + if (!readIndexRecord(ixRight)) break; + tsRight = tsPacketNumFromBuf(); + if (tsPacketNumber > tsRight) tsPacketNumber = tsRight; + // handle "tsPacketNumber" too large by seeking to the last frame of the file + + while (ixRight-ixLeft > 1 && tsLeft < tsPacketNumber && tsPacketNumber <= tsRight) { + unsigned long ixNew = ixLeft + + (unsigned long)(((tsPacketNumber-tsLeft)/(tsRight-tsLeft))*(ixRight-ixLeft)); + if (ixNew == ixLeft || ixNew == ixRight) { + // Use bisection instead: + ixNew = (ixLeft+ixRight)/2; + } + if (!readIndexRecord(ixNew)) break; + unsigned long tsNew = tsPacketNumFromBuf(); + if (tsNew < tsPacketNumber) { + tsLeft = tsNew; + ixLeft = ixNew; + } else { + tsRight = tsNew; + ixRight = ixNew; + } + } + if (ixRight-ixLeft > 1 || tsPacketNumber <= tsLeft || tsPacketNumber > tsRight) break; // bad PCR values in index file? + + ixFound = ixRight; + if (reverseToPreviousCleanPoint) { + // "Rewind' until we reach the start of a Video Sequence or GOP header: + success = rewindToCleanPoint(ixFound); + } else { + success = True; + } + } while (0); + + if (success && readIndexRecord(ixFound)) { + // Return (and cache) information from record "ixFound": + pcr = fCachedPCR = pcrFromBuf(); + fCachedTSPacketNumber = tsPacketNumFromBuf(); + if (reverseToPreviousCleanPoint) tsPacketNumber = fCachedTSPacketNumber; + indexRecordNumber = fCachedIndexRecordNumber = ixFound; + } else { + // An error occurred: Return the default values, for tsPacketNumber == 0: + pcr = 0.0f; + indexRecordNumber = 0; + } + closeFid(); +} + +Boolean MPEG2TransportStreamIndexFile +::readIndexRecordValues(unsigned long indexRecordNum, + unsigned long& transportPacketNum, u_int8_t& offset, + u_int8_t& size, float& pcr, u_int8_t& recordType) { + if (!readIndexRecord(indexRecordNum)) return False; + + transportPacketNum = tsPacketNumFromBuf(); + offset = offsetFromBuf(); + size = sizeFromBuf(); + pcr = pcrFromBuf(); + recordType = recordTypeFromBuf(); + return True; +} + +float MPEG2TransportStreamIndexFile::getPlayingDuration() { + if (fNumIndexRecords == 0 || !readOneIndexRecord(fNumIndexRecords-1)) return 0.0f; + + return pcrFromBuf(); +} + +int MPEG2TransportStreamIndexFile::mpegVersion() { + if (fMPEGVersion != 0) return fMPEGVersion; // we already know it + + // Read the first index record, and figure out the MPEG version from its type: + if (!readOneIndexRecord(0)) return 0; // unknown; perhaps the indecx file is empty? + + setMPEGVersionFromRecordType(recordTypeFromBuf()); + return fMPEGVersion; +} + +Boolean MPEG2TransportStreamIndexFile::openFid() { + if (fFid == NULL && fFileName != NULL) { + if ((fFid = OpenInputFile(envir(), fFileName)) != NULL) { + fCurrentIndexRecordNum = 0; + } + } + + return fFid != NULL; +} + +Boolean MPEG2TransportStreamIndexFile::seekToIndexRecord(unsigned long indexRecordNumber) { + if (!openFid()) return False; + + if (indexRecordNumber == fCurrentIndexRecordNum) return True; // we're already there + + if (SeekFile64(fFid, (int64_t)(indexRecordNumber*INDEX_RECORD_SIZE), SEEK_SET) != 0) return False; + fCurrentIndexRecordNum = indexRecordNumber; + return True; +} + +Boolean MPEG2TransportStreamIndexFile::readIndexRecord(unsigned long indexRecordNum) { + do { + if (!seekToIndexRecord(indexRecordNum)) break; + if (fread(fBuf, INDEX_RECORD_SIZE, 1, fFid) != 1) break; + ++fCurrentIndexRecordNum; + + return True; + } while (0); + + return False; // an error occurred +} + +Boolean MPEG2TransportStreamIndexFile::readOneIndexRecord(unsigned long indexRecordNum) { + Boolean result = readIndexRecord(indexRecordNum); + closeFid(); + + return result; +} + +void MPEG2TransportStreamIndexFile::closeFid() { + if (fFid != NULL) { + CloseInputFile(fFid); + fFid = NULL; + } +} + +float MPEG2TransportStreamIndexFile::pcrFromBuf() { + unsigned pcr_int = (fBuf[5]<<16) | (fBuf[4]<<8) | fBuf[3]; + u_int8_t pcr_frac = fBuf[6]; + return pcr_int + pcr_frac/256.0f; +} + +unsigned long MPEG2TransportStreamIndexFile::tsPacketNumFromBuf() { + return (fBuf[10]<<24) | (fBuf[9]<<16) | (fBuf[8]<<8) | fBuf[7]; +} + +void MPEG2TransportStreamIndexFile::setMPEGVersionFromRecordType(u_int8_t recordType) { + if (fMPEGVersion != 0) return; // we already know it + + u_int8_t const recordTypeWithoutStartBit = recordType&~0x80; + if (recordTypeWithoutStartBit >= 1 && recordTypeWithoutStartBit <= 4) fMPEGVersion = 2; + else if (recordTypeWithoutStartBit >= 5 && recordTypeWithoutStartBit <= 10) fMPEGVersion = 5; + // represents H.264 + else if (recordTypeWithoutStartBit >= 11 && recordTypeWithoutStartBit <= 16) fMPEGVersion = 6; + // represents H.265 +} + +Boolean MPEG2TransportStreamIndexFile::rewindToCleanPoint(unsigned long&ixFound) { + Boolean success = False; // until we learn otherwise + + while (ixFound > 0) { + if (!readIndexRecord(ixFound)) break; + + u_int8_t recordType = recordTypeFromBuf(); + setMPEGVersionFromRecordType(recordType); + + // A 'clean point' is the start of a 'frame' from which a decoder can cleanly resume + // handling the stream. For H.264, this is a SPS. For H.265, this is a VPS. + // For MPEG-2, this is a Video Sequence Header, or a GOP. + + if ((recordType&0x80) != 0) { // This is the start of a 'frame' + recordType &=~ 0x80; // remove the 'start of frame' bit + if (fMPEGVersion == 5) { // H.264 + if (recordType == 5/*SPS*/) { + success = True; + break; + } + } else if (fMPEGVersion == 6) { // H.265 + if (recordType == 11/*VPS*/) { + success = True; + break; + } + } else { // MPEG-1, 2, or 4 + if (recordType == 1/*VSH*/) { + success = True; + break; + } else if (recordType == 2/*GOP*/) { + // Hack: If the preceding record is for a Video Sequence Header, then use it instead: + unsigned long newIxFound = ixFound; + + while (--newIxFound > 0) { + if (!readIndexRecord(newIxFound)) break; + recordType = recordTypeFromBuf(); + if ((recordType&0x7F) != 1) break; // not a Video Sequence Header + if ((recordType&0x80) != 0) { // this is the start of the VSH; use it + ixFound = newIxFound; + break; + } + } + } + success = True; + break; + } + } + + // Keep checking, from the previous record: + --ixFound; + } + if (ixFound == 0) success = True; // use record 0 anyway + + return success; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportStreamMultiplexor.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportStreamMultiplexor.cpp new file mode 100644 index 000000000..25ccf0660 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportStreamMultiplexor.cpp @@ -0,0 +1,485 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A class for generating MPEG-2 Transport Stream from one or more input +// Elementary Stream data sources +// Implementation + +#include "MPEG2TransportStreamMultiplexor.hh" + +#define TRANSPORT_PACKET_SIZE 188 + +#define PAT_PERIOD_IF_UNTIMED 100 // # of packets between Program Association Tables (if not timed) +#define PMT_PERIOD_IF_UNTIMED 500 // # of packets between Program Map Tables (if not timed) + +void MPEG2TransportStreamMultiplexor +::setTimedSegmentation(unsigned segmentationDuration, + onEndOfSegmentFunc* onEndOfSegmentFunc, + void* onEndOfSegmentClientData) { + fSegmentationDuration = segmentationDuration; + fOnEndOfSegmentFunc = onEndOfSegmentFunc; + fOnEndOfSegmentClientData = onEndOfSegmentClientData; +} + +MPEG2TransportStreamMultiplexor +::MPEG2TransportStreamMultiplexor(UsageEnvironment& env) + : FramedSource(env), + fHaveVideoStreams(True/*by default*/), + fOutgoingPacketCounter(0), fProgramMapVersion(0xFF), + fPreviousInputProgramMapVersion(0xFF), fCurrentInputProgramMapVersion(0), + fPCR_PID(0), fCurrentPID(0), + fInputBuffer(NULL), fInputBufferSize(0), fInputBufferBytesUsed(0), + fIsFirstAdaptationField(True), fSegmentationDuration(0), fSegmentationIndication(1), + fCurrentSegmentDuration(0.0), fPreviousPTS(0.0), + fOnEndOfSegmentFunc(NULL), fOnEndOfSegmentClientData(NULL) { + for (unsigned i = 0; i < PID_TABLE_SIZE; ++i) { + fPIDState[i].counter = 0; + fPIDState[i].streamType = 0; + } +} + +MPEG2TransportStreamMultiplexor::~MPEG2TransportStreamMultiplexor() { +} + +Boolean MPEG2TransportStreamMultiplexor::isMPEG2TransportStreamMultiplexor() const { + return True; +} + +void MPEG2TransportStreamMultiplexor::doGetNextFrame() { + if (fInputBufferBytesUsed >= fInputBufferSize) { + // No more bytes are available from the current buffer. + // Arrange to read a new one. + awaitNewBuffer(fInputBuffer); + return; + } + + do { + // Periodically return a Program Association Table packet instead: + if ((segmentationIsTimed() && fSegmentationIndication == 1) + || (!segmentationIsTimed() && fOutgoingPacketCounter % PAT_PERIOD_IF_UNTIMED == 0)) { + ++fOutgoingPacketCounter; + deliverPATPacket(); + fSegmentationIndication = 2; // for next time + break; + } + ++fOutgoingPacketCounter; + + // Periodically (or when we see a new PID) return a Program Map Table instead: + Boolean programMapHasChanged = fCurrentInputProgramMapVersion != fPreviousInputProgramMapVersion; + if (programMapHasChanged + || (segmentationIsTimed() && fSegmentationIndication == 2) + || (!segmentationIsTimed() && fOutgoingPacketCounter % PMT_PERIOD_IF_UNTIMED == 0)) { + if (programMapHasChanged) { // reset values for next time: + fPreviousInputProgramMapVersion = fCurrentInputProgramMapVersion; + } + deliverPMTPacket(programMapHasChanged); + fSegmentationIndication = 0; // for next time + break; + } + + // Normal case: Deliver (or continue delivering) the recently-read data: + deliverDataToClient(fCurrentPID, fInputBuffer, fInputBufferSize, + fInputBufferBytesUsed); + } while (0); + + // NEED TO SET fPresentationTime, durationInMicroseconds ##### + // Complete the delivery to the client: + if ((fOutgoingPacketCounter%10) == 0) { + // To avoid excessive recursion (and stack overflow) caused by excessively large input frames, + // occasionally return to the event loop to do this: + nextTask() = envir().taskScheduler().scheduleDelayedTask(0, (TaskFunc*)FramedSource::afterGetting, this); + } else { + afterGetting(this); + } +} + +void MPEG2TransportStreamMultiplexor +::handleNewBuffer(unsigned char* buffer, unsigned bufferSize, + int mpegVersion, MPEG1or2Demux::SCR scr, int16_t PID) { + if (bufferSize < 4) return; + fInputBuffer = buffer; + fInputBufferSize = bufferSize; + fInputBufferBytesUsed = 0; + + u_int8_t stream_id = fInputBuffer[3]; + // Use "stream_id" directly as our PID. + // Also, figure out the Program Map 'stream type' from this. + if (stream_id == 0xBE) { // padding_stream; ignore + fInputBufferSize = 0; + } else if (stream_id == 0xBC) { // program_stream_map + setProgramStreamMap(fInputBufferSize); + fInputBufferSize = 0; // then, ignore the buffer + } else { + if (PID == -1) + fCurrentPID = stream_id; + else + fCurrentPID = PID; + + // Set the stream's type: + u_int8_t& streamType = fPIDState[fCurrentPID].streamType; // alias + + if (streamType == 0) { + // Instead, set the stream's type to default values, based on whether + // the stream is audio or video, and whether it's MPEG-1 or MPEG-2: + if ((stream_id&0xF0) == 0xE0) { // video + streamType = mpegVersion == 1 ? 1 : mpegVersion == 2 ? 2 : mpegVersion == 4 ? 0x10 : + mpegVersion == 5/*H.264*/ ? 0x1B : 0x24/*assume H.265*/; + } else if ((stream_id&0xE0) == 0xC0) { // audio + streamType = mpegVersion == 1 ? 3 : mpegVersion == 2 ? 4 : mpegVersion == 3 ? 6 : 0xF; + } else if (stream_id == 0xBD) { // private_stream1 (usually AC-3 or Opus) + streamType = 0x06; // for DVB or Opus; for ATSC, use 0x81 + } else { // something else + streamType = 0x81; // private + } + } + + if (fPCR_PID == 0) { // set it to this stream, if it's appropriate: + if ((!fHaveVideoStreams && (streamType == 3 || streamType == 4 || streamType == 6 || streamType == 0xF))/* audio stream */ || + (streamType == 1 || streamType == 2 || streamType == 0x10 || streamType == 0x1B || streamType == 0x24)/* video stream */) { + fPCR_PID = fCurrentPID; // use this stream's SCR for PCR + } + } + if (fCurrentPID == fPCR_PID) { + // Record the input's current SCR timestamp, for use as our PCR: + fPCR = scr; + } + } + + // Now that we have new input data, retry the last delivery to the client: + doGetNextFrame(); +} + +void MPEG2TransportStreamMultiplexor +::deliverDataToClient(u_int16_t pid, unsigned char* buffer, unsigned bufferSize, + unsigned& startPositionInBuffer) { + // Construct a new Transport packet, and deliver it to the client: + if (fMaxSize < TRANSPORT_PACKET_SIZE) { + fFrameSize = 0; // the client hasn't given us enough space; deliver nothing + fNumTruncatedBytes = TRANSPORT_PACKET_SIZE; + } else { + fFrameSize = TRANSPORT_PACKET_SIZE; + Boolean willAddPCR = pid == fPCR_PID && startPositionInBuffer == 0 + && !(fPCR.highBit == 0 && fPCR.remainingBits == 0 && fPCR.extension == 0); + unsigned const numBytesAvailable = bufferSize - startPositionInBuffer; + unsigned numHeaderBytes = 4; // by default + unsigned numPCRBytes = 0; // by default + unsigned numPaddingBytes = 0; // by default + unsigned numDataBytes; + u_int8_t adaptation_field_control; + if (willAddPCR) { + adaptation_field_control = 0x30; + numHeaderBytes += 2; // for the "adaptation_field_length" and flags + numPCRBytes = 6; + if (numBytesAvailable >= TRANSPORT_PACKET_SIZE - numHeaderBytes - numPCRBytes) { + numDataBytes = TRANSPORT_PACKET_SIZE - numHeaderBytes - numPCRBytes; + } else { + numDataBytes = numBytesAvailable; + numPaddingBytes + = TRANSPORT_PACKET_SIZE - numHeaderBytes - numPCRBytes - numDataBytes; + } + } else if (numBytesAvailable >= TRANSPORT_PACKET_SIZE - numHeaderBytes) { + // This is the common case + adaptation_field_control = 0x10; + numDataBytes = TRANSPORT_PACKET_SIZE - numHeaderBytes; + } else { + adaptation_field_control = 0x30; + ++numHeaderBytes; // for the "adaptation_field_length" + // ASSERT: numBytesAvailable <= TRANSPORT_PACKET_SIZE - numHeaderBytes + numDataBytes = numBytesAvailable; + if (numDataBytes < TRANSPORT_PACKET_SIZE - numHeaderBytes) { + ++numHeaderBytes; // for the adaptation field flags + numPaddingBytes = TRANSPORT_PACKET_SIZE - numHeaderBytes - numDataBytes; + } + } + // ASSERT: numHeaderBytes+numPCRBytes+numPaddingBytes+numDataBytes + // == TRANSPORT_PACKET_SIZE + + // Fill in the header of the Transport Stream packet: + unsigned char* header = fTo; + *header++ = 0x47; // sync_byte + *header++ = ((startPositionInBuffer == 0) ? 0x40 : 0x00)|(pid>>8); + // transport_error_indicator, payload_unit_start_indicator, transport_priority, + // first 5 bits of PID + *header++ = pid; + // last 8 bits of PID + unsigned& continuity_counter = fPIDState[pid].counter; // alias + *header++ = adaptation_field_control|(continuity_counter&0x0F); + // transport_scrambling_control, adaptation_field_control, continuity_counter + ++continuity_counter; + if (adaptation_field_control == 0x30) { + // Add an adaptation field: + u_int8_t adaptation_field_length + = (numHeaderBytes == 5) ? 0 : 1 + numPCRBytes + numPaddingBytes; + *header++ = adaptation_field_length; + if (numHeaderBytes > 5) { + u_int8_t flags = willAddPCR ? 0x10 : 0x00; + if (fIsFirstAdaptationField) { + flags |= 0x80; // discontinuity_indicator + fIsFirstAdaptationField = False; + } + *header++ = flags; + if (willAddPCR) { + u_int32_t pcrHigh32Bits = (fPCR.highBit<<31) | (fPCR.remainingBits>>1); + u_int8_t pcrLowBit = fPCR.remainingBits&1; + u_int8_t extHighBit = (fPCR.extension&0x100)>>8; + *header++ = pcrHigh32Bits>>24; + *header++ = pcrHigh32Bits>>16; + *header++ = pcrHigh32Bits>>8; + *header++ = pcrHigh32Bits; + *header++ = (pcrLowBit<<7)|0x7E|extHighBit; + *header++ = (u_int8_t)fPCR.extension; // low 8 bits of extension + + if (fSegmentationDuration > 0) { + // Use the PCR to compute the duration of the segment so far, to check whether + // segmentation needs to occur now: + double pts = fPCR.highBit ? 0x80000000/45000.0 : 0.0; + pts += fPCR.remainingBits/90000.0; + pts += fPCR.extension/27000000.0; + + double lastSubSegmentDuration + = (fPreviousPTS == 0.0) || (pts < fPreviousPTS) ? 0.0 : pts - fPreviousPTS; + fCurrentSegmentDuration += lastSubSegmentDuration; + + // Check whether we need to segment the stream now: + if (fCurrentSegmentDuration > (double)fSegmentationDuration + || fCurrentSegmentDuration + lastSubSegmentDuration > (double)fSegmentationDuration) { + // It's time to segment the stream. + if (fOnEndOfSegmentFunc != NULL) { + (*fOnEndOfSegmentFunc)(fOnEndOfSegmentClientData, fCurrentSegmentDuration); + } + + fCurrentSegmentDuration = 0.0; // for next time + fSegmentationIndication = 1; // output a PAT next + } + + fPreviousPTS = pts; // for next time + } + } + } + } + + // Add any padding bytes: + for (unsigned i = 0; i < numPaddingBytes; ++i) *header++ = 0xFF; + + // Finally, add the data bytes: + memmove(header, &buffer[startPositionInBuffer], numDataBytes); + startPositionInBuffer += numDataBytes; + } +} + +#define PAT_PID 0 +#ifndef OUR_PROGRAM_NUMBER +#define OUR_PROGRAM_NUMBER 1 +#endif +#define OUR_PROGRAM_MAP_PID 0x1000 + +void MPEG2TransportStreamMultiplexor::deliverPATPacket() { + // First, create a new buffer for the PAT packet: + unsigned const patSize = TRANSPORT_PACKET_SIZE - 4; // allow for the 4-byte header + unsigned char* patBuffer = new unsigned char[patSize]; + + // and fill it in: + unsigned char* pat = patBuffer; + *pat++ = 0; // pointer_field + *pat++ = 0; // table_id + *pat++ = 0xB0; // section_syntax_indicator; 0; reserved, section_length (high) + *pat++ = 13; // section_length (low) + *pat++ = 0; *pat++ = 1; // transport_stream_id + *pat++ = 0xC1; // reserved; version_number; current_next_indicator + *pat++ = 0; // section_number + *pat++ = 0; // last_section_number + *pat++ = OUR_PROGRAM_NUMBER>>8; *pat++ = OUR_PROGRAM_NUMBER; // program_number + *pat++ = 0xE0|(OUR_PROGRAM_MAP_PID>>8); // reserved; program_map_PID (high) + *pat++ = OUR_PROGRAM_MAP_PID&0xFF; // program_map_PID (low) + + // Compute the CRC from the bytes we currently have (not including "pointer_field"): + u_int32_t crc = calculateCRC(patBuffer+1, pat - (patBuffer+1)); + *pat++ = crc>>24; *pat++ = crc>>16; *pat++ = crc>>8; *pat++ = crc; + + // Fill in the rest of the packet with padding bytes: + while (pat < &patBuffer[patSize]) *pat++ = 0xFF; + + // Deliver the packet: + unsigned startPosition = 0; + deliverDataToClient(PAT_PID, patBuffer, patSize, startPosition); + + // Finally, remove the new buffer: + delete[] patBuffer; +} + +void MPEG2TransportStreamMultiplexor::deliverPMTPacket(Boolean hasChanged) { + if (hasChanged) ++fProgramMapVersion; + + // First, create a new buffer for the PMT packet: + unsigned const pmtSize = TRANSPORT_PACKET_SIZE - 4; // allow for the 4-byte header + unsigned char* pmtBuffer = new unsigned char[pmtSize]; + + // and fill it in: + unsigned char* pmt = pmtBuffer; + *pmt++ = 0; // pointer_field + *pmt++ = 2; // table_id + *pmt++ = 0xB0; // section_syntax_indicator; 0; reserved, section_length (high) + unsigned char* section_lengthPtr = pmt; // save for later + *pmt++ = 0; // section_length (low) (fill in later) + *pmt++ = OUR_PROGRAM_NUMBER>>8; *pmt++ = OUR_PROGRAM_NUMBER; // program_number + *pmt++ = 0xC1|((fProgramMapVersion&0x1F)<<1); // reserved; version_number; current_next_indicator + *pmt++ = 0; // section_number + *pmt++ = 0; // last_section_number + *pmt++ = 0xE0|(fPCR_PID>>8); // reserved; PCR_PID (high) + *pmt++ = fPCR_PID; // PCR_PID (low) + *pmt++ = 0xF0; // reserved; program_info_length (high) + *pmt++ = 0; // program_info_length (low) + for (int pid = 0; pid < PID_TABLE_SIZE; ++pid) { + if (fPIDState[pid].streamType != 0) { + // This PID gets recorded in the table + *pmt++ = fPIDState[pid].streamType; + *pmt++ = 0xE0|(pid>>8); // reserved; elementary_pid (high) + *pmt++ = pid; // elementary_pid (low) + *pmt++ = 0xF0; // reserved; ES_info_length (high) + *pmt++ = 0; // ES_info_length (low) + } + } + unsigned section_length = pmt - (section_lengthPtr+1) + 4 /*for CRC*/; + *section_lengthPtr = section_length; + + // Compute the CRC from the bytes we currently have (not including "pointer_field"): + u_int32_t crc = calculateCRC(pmtBuffer+1, pmt - (pmtBuffer+1)); + *pmt++ = crc>>24; *pmt++ = crc>>16; *pmt++ = crc>>8; *pmt++ = crc; + + // Fill in the rest of the packet with padding bytes: + while (pmt < &pmtBuffer[pmtSize]) *pmt++ = 0xFF; + + // Deliver the packet: + unsigned startPosition = 0; + deliverDataToClient(OUR_PROGRAM_MAP_PID, pmtBuffer, pmtSize, startPosition); + + // Finally, remove the new buffer: + delete[] pmtBuffer; +} + +void MPEG2TransportStreamMultiplexor::setProgramStreamMap(unsigned frameSize) { + if (frameSize <= 16) return; // program_stream_map is too small to be useful + if (frameSize > 0xFF) return; // program_stream_map is too large + + u_int16_t program_stream_map_length = (fInputBuffer[4]<<8) | fInputBuffer[5]; + if ((u_int16_t)frameSize > 6+program_stream_map_length) { + frameSize = 6+program_stream_map_length; + } + + u_int8_t versionByte = fInputBuffer[6]; + if ((versionByte&0x80) == 0) return; // "current_next_indicator" is not set + fCurrentInputProgramMapVersion = versionByte&0x1F; + + u_int16_t program_stream_info_length = (fInputBuffer[8]<<8) | fInputBuffer[9]; + unsigned offset = 10 + program_stream_info_length; // skip over 'descriptors' + + u_int16_t elementary_stream_map_length + = (fInputBuffer[offset]<<8) | fInputBuffer[offset+1]; + offset += 2; + frameSize -= 4; // sizeof CRC_32 + if (frameSize > offset + elementary_stream_map_length) { + frameSize = offset + elementary_stream_map_length; + } + + while (offset + 4 <= frameSize) { + u_int8_t stream_type = fInputBuffer[offset]; + u_int8_t elementary_stream_id = fInputBuffer[offset+1]; + + fPIDState[elementary_stream_id].streamType = stream_type; + + u_int16_t elementary_stream_info_length + = (fInputBuffer[offset+2]<<8) | fInputBuffer[offset+3]; + offset += 4 + elementary_stream_info_length; + } +} + +static u_int32_t const CRC32[256] = { + 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, + 0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005, + 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61, + 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, + 0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9, + 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75, + 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, + 0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd, + 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039, + 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, + 0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81, + 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d, + 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, + 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95, + 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, + 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, + 0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae, + 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072, + 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, + 0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca, + 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde, + 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, + 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066, + 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba, + 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, + 0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692, + 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6, + 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, + 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e, + 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2, + 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, + 0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a, + 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637, + 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, + 0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f, + 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53, + 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, + 0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b, + 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff, + 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, + 0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7, + 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b, + 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, + 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3, + 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, + 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, + 0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f, + 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3, + 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, + 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c, + 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8, + 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, + 0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30, + 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec, + 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, + 0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654, + 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0, + 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, + 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18, + 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4, + 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, + 0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c, + 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668, + 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4 +}; + +u_int32_t calculateCRC(u_int8_t const* data, unsigned dataLength, u_int32_t initialValue) { + u_int32_t crc = initialValue; + + while (dataLength-- > 0) { + crc = (crc<<8) ^ CRC32[(crc>>24) ^ (u_int32_t)(*data++)]; + } + + return crc; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportStreamParser.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportStreamParser.cpp new file mode 100644 index 000000000..fff7a1fdb --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportStreamParser.cpp @@ -0,0 +1,328 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A parser for a MPEG Transport Stream +// Implementation + +#include "MPEG2TransportStreamParser.hh" + +#define NUM_PIDS 0x10000 + +StreamType StreamTypes[0x100]; + +MPEG2TransportStreamParser +::MPEG2TransportStreamParser(FramedSource* inputSource, + FramedSource::onCloseFunc* onEndFunc, void* onEndClientData) + : StreamParser(inputSource, onEndFunc, onEndClientData, continueParsing, this), + fInputSource(inputSource), fAmCurrentlyParsing(False), + fOnEndFunc(onEndFunc), fOnEndClientData(onEndClientData), + fLastSeenPCR(0.0) { + if (StreamTypes[0x01].dataType == StreamType::UNKNOWN) { // initialize array with known values + StreamTypes[0x01] = StreamType("MPEG-1 video", StreamType::VIDEO, ".mpv"); + StreamTypes[0x02] = StreamType("MPEG-2 video", StreamType::VIDEO, ".mpv"); + StreamTypes[0x03] = StreamType("MPEG-1 audio", StreamType::AUDIO, ".mpa"); + StreamTypes[0x04] = StreamType("MPEG-2 audio", StreamType::AUDIO, ".mpa"); + StreamTypes[0x05] = StreamType("privately-defined data", StreamType::DATA); + StreamTypes[0x06] = StreamType("privately-defined data", StreamType::DATA); + StreamTypes[0x0F] = StreamType("AAC audio", StreamType::AUDIO, ".aac"); + StreamTypes[0x10] = StreamType("MPEG-4 H.263 based video", StreamType::VIDEO, ".mpv"); + StreamTypes[0x1B] = StreamType("H.264 video", StreamType::VIDEO, ".h264"); + StreamTypes[0x1C] = StreamType("MPEG-4 raw audio", StreamType::AUDIO, ".mpa"); + StreamTypes[0x1D] = StreamType("MPEG-4 text", StreamType::TEXT, ".txt"); + StreamTypes[0x21] = StreamType("JPEG 2000 video", StreamType::VIDEO, ".mjpg"); + StreamTypes[0x24] = StreamType("H.265 video", StreamType::VIDEO, ".h265"); + StreamTypes[0x81] = StreamType("AC-3 audio", StreamType::AUDIO, ".ac3"); + } + + // Create our 'PID state' array: + fPIDState = new PIDState*[NUM_PIDS]; + for (unsigned i = 0; i < NUM_PIDS; ++i) fPIDState[i] = NULL; + + // Initially, the only PID we know is 0x0000: a Program Association Table: + fPIDState[0x0000] = new PIDState_PAT(*this, 0x0000); + + // Begin parsing: + continueParsing(); +} + +MPEG2TransportStreamParser::~MPEG2TransportStreamParser() { + for (unsigned i = 0; i < NUM_PIDS; ++i) delete fPIDState[i]; + delete[] fPIDState; +} + +UsageEnvironment& MPEG2TransportStreamParser::envir() { + return fInputSource->envir(); +} + +void MPEG2TransportStreamParser +::continueParsing(void* clientData, unsigned char* ptr, unsigned size, struct timeval presentationTime) { + ((MPEG2TransportStreamParser*)clientData)->continueParsing(); +} + +void MPEG2TransportStreamParser::continueParsing() { + if (fAmCurrentlyParsing) return; // don't allow recursive calls to parse() + + if (fInputSource != NULL) { + fAmCurrentlyParsing = True; + Boolean parseSucceeded = parse(); + fAmCurrentlyParsing = False; + + if (!parseSucceeded) { + // We didn't complete the parsing, because we had to read more data from the source, + // or because we're waiting for another read from downstream. + // Once that happens, we'll get called again. + return; + } + } + + // We successfully parsed the file. Call our 'done' function now: + if (fOnEndFunc != NULL) (*fOnEndFunc)(fOnEndClientData); +} + +#define TRANSPORT_SYNC_BYTE 0x47 +#define TRANSPORT_PACKET_SIZE 188 + +Boolean MPEG2TransportStreamParser::parse() { + if (fInputSource->isCurrentlyAwaitingData()) return False; + // Our input source is currently being read. Wait until that read completes + + try { + while (1) { + // Make sure we start with a 'sync byte': + do { + saveParserState(); + } while (get1Byte() != TRANSPORT_SYNC_BYTE); + + // Parse and process each (remaining 187 bytes of a) 'Transport Stream Packet' at a time. + // (Because these are a lot smaller than the "StreamParser" BANK_SIZE, we don't save + // parser state in the middle of processing each such 'Transport Stream Packet'. + // Therefore, processing of each 'Transport Stream Packet' needs to be idempotent.) + + u_int16_t flagsPlusPID = get2Bytes(); + // Check the "transport_error_indicator" flag; reject the packet if it's set: + if ((flagsPlusPID&0x8000) != 0) { +#ifdef DEBUG_ERRORS + fprintf(stderr, "MPEG2TransportStreamParser::parse() Rejected packet with \"transport_error_indicator\" flag set!\n"); +#endif + continue; + } + Boolean pusi = (flagsPlusPID&0x4000) != 0; // payload_unit_start_indicator + // Ignore "transport_priority" + u_int16_t PID = flagsPlusPID&0x1FFF; +#ifdef DEBUG_CONTENTS + fprintf(stderr, "\nTransport Packet: payload_unit_start_indicator: %d; PID: 0x%04x\n", + pusi, PID); +#endif + + u_int8_t controlPlusContinuity_counter = get1Byte(); + // Reject any packets where the "transport_scrambling_control" field is not zero: + if ((controlPlusContinuity_counter&0xC0) != 0) { +#ifdef DEBUG_ERRORS + fprintf(stderr, "MPEG2TransportStreamParser::parse() Rejected packet with \"transport_scrambling_control\" set to non-zero value %d!\n", (controlPlusContinuity_counter&0xC0)>>6); +#endif + continue; + } + u_int8_t adaptation_field_control = (controlPlusContinuity_counter&0x30)>>4; // 2 bits +#ifdef DEBUG_CONTENTS + u_int8_t continuity_counter = (controlPlusContinuity_counter&0x0F); // 4 bits + fprintf(stderr, "adaptation_field_control: %d; continuity_counter: 0x%X\n", adaptation_field_control, continuity_counter); +#endif + + u_int8_t totalAdaptationFieldSize = adaptation_field_control < 2 ? 0 : parseAdaptationField(); +#ifdef DEBUG_ERRORS + if (adaptation_field_control == 2 && totalAdaptationFieldSize != 1+183) { + fprintf(stderr, "MPEG2TransportStreamParser::parse() Warning: Got an inconsistent \"totalAdaptationFieldSize\" %d for adaptation_field_control == 2\n", totalAdaptationFieldSize); + } +#endif + + int numDataBytes = TRANSPORT_PACKET_SIZE-4-totalAdaptationFieldSize; + if (numDataBytes > 0) { +#ifdef DEBUG_CONTENTS + fprintf(stderr, "+%d data bytes:\n", numDataBytes); +#endif + if (!processDataBytes(PID, pusi, numDataBytes)) { + // The parsing got deferred (to be resumed later when a pending read happens) + restoreSavedParserState(); // so that we later resume parsing at the start of the packet + return False; + } + } + } + } catch (int /*e*/) { +#ifdef DEBUG_CONTENTS + fprintf(stderr, "MPEG2TransportStreamParser::parse() EXCEPTION (This is normal behavior - *not* an error)\n"); +#endif + return False; // the parsing got interrupted + } +} + +u_int8_t MPEG2TransportStreamParser::parseAdaptationField() { + unsigned startPos = curOffset(); +#ifdef DEBUG_CONTENTS + fprintf(stderr, "\tAdaptation Field:\n"); +#endif + u_int8_t adaptation_field_length = get1Byte(); +#ifdef DEBUG_CONTENTS + fprintf(stderr, "\t\tadaptation_field_length: %d\n", adaptation_field_length); +#endif + if (adaptation_field_length > 0) { + u_int8_t flags = get1Byte(); +#ifdef DEBUG_CONTENTS + fprintf(stderr, "\t\tadaptation field flags: 0x%02x\n", flags); +#endif + if ((flags&0x10) != 0) { // PCR_flag + u_int32_t first32PCRBits = get4Bytes(); + u_int16_t last16PCRBits = get2Bytes(); + // program_clock_reference_base = "first32PCRBits" and high bit of "last16PCRBits" (33 bits) + // program_clock_reference_extension = last 9 bits of "last16PCRBits" (9 bits) + double PCR = first32PCRBits/45000.0; + if ((last16PCRBits&0x8000) != 0) PCR += 1/90000.0; // add in low-bit (if set) + PCR += (last16PCRBits&0x01FF)/27000000.0; // add in extension +#ifdef DEBUG_CONTENTS + fprintf(stderr, "\t\tPCR: %.10f\n", PCR); +#endif + } + if ((flags&0x08) != 0) { // OPCR_flag + u_int32_t first32OPCRBits = get4Bytes(); + u_int16_t last16OPCRBits = get2Bytes(); + // original_program_clock_reference_base = "first32OPCRBits" and high bit of "last16OPCRBits" (33 bits) + // original_program_clock_reference_extension = last 9 bits of "last16OPCRBits" (9 bits) + double OPCR = first32OPCRBits/45000.0; + if ((last16OPCRBits&0x8000) != 0) OPCR += 1/90000.0; // add in low-bit (if set) + OPCR += (last16OPCRBits&0x01FF)/27000000.0; // add in extension +#ifdef DEBUG_CONTENTS + fprintf(stderr, "\t\tOPCR: %.10f\n", OPCR); +#endif + } + if ((flags&0x04) != 0) { // splicing_point_flag + skipBytes(1); // splice_countdown + } + if ((flags&0x02) != 0) { // transport_private_data_flag + u_int8_t transport_private_data_length = get1Byte(); +#ifdef DEBUG_CONTENTS + fprintf(stderr, "\t\ttransport_private_data_length: %d\n", transport_private_data_length); +#endif + skipBytes(transport_private_data_length); // "private_data_byte"s + } + if ((flags&0x01) != 0) { // adaptation_field_extension_flag +#ifdef DEBUG_CONTENTS + u_int8_t adaptation_field_extension_length = get1Byte(); + fprintf(stderr, "\t\tadaptation_field_extension_length: %d\n", adaptation_field_extension_length); +#else + skipBytes(1); // adaptation_field_extension_length +#endif + u_int8_t flagsPlusReserved = get1Byte(); +#ifdef DEBUG_CONTENTS + fprintf(stderr, "\t\t\tflagsPlusReserved: 0x%02x\n", flagsPlusReserved); +#endif + if ((flagsPlusReserved&0x80) != 0) { // ltw_flag + skipBytes(2); // "ltw_valid_flag" + "ltw_offset" + } + if ((flagsPlusReserved&0x40) != 0) { // piecewise_rate_flag + skipBytes(3); // reserved + "piecewise_rate" + } + if ((flagsPlusReserved&0x20) != 0) { // seamless_splice_flag + skipBytes(5); // DTS_next_... + } + // Skip reserved bytes to the end of the adaptation_field: + int numBytesLeft = (1 + adaptation_field_length) - (curOffset() - startPos); + if (numBytesLeft > 0) { +#ifdef DEBUG_CONTENTS + fprintf(stderr, "\t\t+%d reserved bytes\n", numBytesLeft); +#endif + skipBytes(numBytesLeft); + } + } + // Skip "stuffing_byte"s to the end of the adaptation_field: + int numBytesLeft = (1 + adaptation_field_length) - (curOffset() - startPos); + if (numBytesLeft > 0) { +#ifdef DEBUG_CONTENTS + fprintf(stderr, "\t\t+%d stuffing bytes\n", numBytesLeft); +#endif +#ifdef DEBUG_ERRORS + for (int i = 0; i < numBytesLeft; ++i) { + if (get1Byte() != 0xFF) { + fprintf(stderr, "WARNING: non-stuffing byte in adaptation_field\n"); + } + } +#else + skipBytes(numBytesLeft); +#endif + } + } + + // Finally, figure out how many bytes we parsed, and compare it to what we expected: + unsigned totalAdaptationFieldSize = curOffset() - startPos; +#ifdef DEBUG_ERRORS + if (totalAdaptationFieldSize != 1 + adaptation_field_length) { + fprintf(stderr, "MPEG2TransportStreamParser::parseAdaptationField() Warning: Got an inconsistent \"totalAdaptationFieldSize\" %d; expected %d\n", totalAdaptationFieldSize, 1 + adaptation_field_length); + } +#endif + return totalAdaptationFieldSize; +} + +Boolean MPEG2TransportStreamParser +::processDataBytes(u_int16_t PID, Boolean pusi, unsigned numDataBytes) { + PIDState* pidState = fPIDState[PID]; + + if (pidState == NULL) { // unknown PID +#ifdef DEBUG_CONTENTS + fprintf(stderr, "\tUnknown PID\n"); +#endif + skipBytes(numDataBytes); + return True; + } + + switch (pidState->type) { + case PAT: { + parsePAT(pusi, numDataBytes); + return True; + } + case PMT: { + parsePMT((PIDState_PMT*)pidState, pusi, numDataBytes); + return True; + } + case STREAM: { + return processStreamPacket((PIDState_STREAM*)pidState, pusi, numDataBytes); + } + default: { // Never reached, but eliminates a possible error with dumb compilers + return False; + } + } +} + +void MPEG2TransportStreamParser::restoreSavedParserState() { + StreamParser::restoreSavedParserState(); + fAmCurrentlyParsing = False; +} + + +//########## PIDState implementation ########## + +PIDState::PIDState(MPEG2TransportStreamParser& parser, u_int16_t pid, PIDType pidType) + : ourParser(parser), PID(pid), type(pidType) { +} + +PIDState::~PIDState() { +} + + +//######### StreamType implementation ######## + +StreamType +::StreamType(char const* description, enum dataType dataType, char const* filenameSuffix) + : description(description), dataType(dataType), filenameSuffix(filenameSuffix) { +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportStreamParser.hh b/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportStreamParser.hh new file mode 100644 index 000000000..885e13c6b --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportStreamParser.hh @@ -0,0 +1,132 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A parser for a MPEG Transport Stream +// C++ header + +#ifndef _MPEG2_TRANSPORT_STREAM_PARSER_HH + +#ifndef _STREAM_PARSER_HH +#include "StreamParser.hh" +#endif +#ifndef _MPEG2_TRANSPORT_STREAM_DEMUXED_TRACK_HH +#include "MPEG2TransportStreamDemuxedTrack.hh" +#endif +#ifndef _MEDIA_SINK_HH +#include "MediaSink.hh" +#endif + +// A descriptor that describes the state of each known PID: +enum PIDType { PAT, PMT, STREAM }; + +class PIDState { +protected: // we're a virtual base class + PIDState(MPEG2TransportStreamParser& parser, u_int16_t pid, PIDType pidType); +public: + virtual ~PIDState(); + +public: + MPEG2TransportStreamParser& ourParser; + u_int16_t PID; + PIDType type; +}; + +class PIDState_PAT : public PIDState { +public: + PIDState_PAT(MPEG2TransportStreamParser& parser, u_int16_t pid); +protected: + virtual ~PIDState_PAT(); +}; + +class PIDState_PMT : public PIDState { +public: + PIDState_PMT(MPEG2TransportStreamParser& parser, u_int16_t pid, u_int16_t programNumber); +protected: + virtual ~PIDState_PMT(); + +public: + u_int16_t program_number; +}; + +class PIDState_STREAM : public PIDState { +public: + PIDState_STREAM(MPEG2TransportStreamParser& parser, u_int16_t pid, u_int16_t programNumber, u_int8_t streamType); +protected: + virtual ~PIDState_STREAM(); + +public: + u_int16_t program_number; + u_int8_t stream_type; + double lastSeenPTS; + MPEG2TransportStreamDemuxedTrack* streamSource; + MediaSink* streamSink; +}; + + +// Descriptions of known "stream_type"s: +class StreamType { +public: + char const* description; + enum dataType { AUDIO, VIDEO, DATA, TEXT, UNKNOWN } dataType; + char const* filenameSuffix; + +public: + StreamType(char const* description = "unknown", enum dataType dataType = UNKNOWN, + char const* filenameSuffix = ""); +}; + + +class MPEG2TransportStreamParser: public StreamParser { +public: + MPEG2TransportStreamParser(FramedSource* inputSource, + FramedSource::onCloseFunc* onEndFunc, void* onEndClientData); + virtual ~MPEG2TransportStreamParser(); + + UsageEnvironment& envir(); + + // StreamParser 'client continue' function: + static void continueParsing(void* clientData, unsigned char* ptr, unsigned size, struct timeval presentationTime); + void continueParsing(); + +private: + // Parsing functions: + friend class MPEG2TransportStreamDemuxedTrack; + Boolean parse(); // returns True iff we have finished parsing all BOS pages (on initialization) + + u_int8_t parseAdaptationField(); + Boolean processDataBytes(u_int16_t PID, Boolean pusi, unsigned numDataBytes); + + void parsePAT(Boolean pusi, unsigned numDataBytes); + void parsePMT(PIDState_PMT* pidState, Boolean pusi, unsigned numDataBytes); + void parseStreamDescriptors(unsigned numDescriptorBytes); + Boolean processStreamPacket(PIDState_STREAM* pidState, Boolean pusi, unsigned numDataBytes); + unsigned parsePESHeader(PIDState_STREAM* pidState, unsigned numDataBytes); + +private: // redefined virtual functions + virtual void restoreSavedParserState(); + +private: + // General state for parsing: + FramedSource* fInputSource; + Boolean fAmCurrentlyParsing; + FramedSource::onCloseFunc* fOnEndFunc; + void* fOnEndClientData; + PIDState** fPIDState; + double fLastSeenPCR; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportStreamParser_PAT.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportStreamParser_PAT.cpp new file mode 100644 index 000000000..aab2e298a --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportStreamParser_PAT.cpp @@ -0,0 +1,111 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A parser for a MPEG Transport Stream +// Implementation + +#include "MPEG2TransportStreamParser.hh" + +void MPEG2TransportStreamParser::parsePAT(Boolean pusi, unsigned numDataBytes) { +#ifdef DEBUG_CONTENTS + fprintf(stderr, "\tProgram Association Table\n"); +#endif + unsigned startPos = curOffset(); + + do { + if (pusi) { + u_int8_t pointer_field = get1Byte(); + skipBytes(pointer_field); // usually 0 + } + + u_int8_t table_id = get1Byte(); + if (table_id != 0x00) { +#ifdef DEBUG_ERRORS + fprintf(stderr, "MPEG2TransportStreamParser::parsePAT(%d, %d): bad table_id: 0x%02x\n", + pusi, numDataBytes, table_id); +#endif + break; + } + + u_int16_t flagsPlusSection_length = get2Bytes(); + u_int16_t section_length = flagsPlusSection_length&0x0FFF; +#ifdef DEBUG_CONTENTS + fprintf(stderr, "\t\tsection_length: %d\n", section_length); +#endif + if (section_length < 9/*too small for remaining fields + CRC*/ || + section_length > 1021/*as per specification*/) { +#ifdef DEBUG_ERRORS + fprintf(stderr, "MPEG2TransportStreamParser::parsePAT(%d, %d): Bad section_length: %d\n", + pusi, numDataBytes, section_length); +#endif + break; + } + + unsigned endPos = curOffset() + section_length; + if (endPos - startPos > numDataBytes) { +#ifdef DEBUG_ERRORS + fprintf(stderr, "MPEG2TransportStreamParser::parsePAT(%d, %d): section_length %d gives us a total size %d that's too large!\n", + pusi, numDataBytes, section_length, endPos - startPos); +#endif + break; + } + +#ifdef DEBUG_CONTENTS + u_int16_t transport_stream_id = get2Bytes(); + fprintf(stderr, "\t\ttransport_stream_id: 0x%04x\n", transport_stream_id); + u_int8_t version_number_byte = get1Byte(); + u_int8_t version_number = (version_number_byte&0x1E)>>1; + u_int8_t section_number = get1Byte(); + u_int8_t last_section_number = get1Byte(); + fprintf(stderr, "\t\tversion_number: %d; section_number: %d; last_section_number: %d\n", + version_number, section_number, last_section_number); +#else + skipBytes(5); +#endif + + while (curOffset() <= endPos - 4/*for CRC*/ - 4/*for a program_number+PID*/) { + u_int16_t program_number = get2Bytes(); + u_int16_t pid = get2Bytes()&0x1FFF; + +#ifdef DEBUG_CONTENTS + fprintf(stderr, "\t\tprogram_number: %d; PID: 0x%04x\n", program_number, pid); +#endif + if (program_number != 0x0000) { + if (fPIDState[pid] == NULL) fPIDState[pid] = new PIDState_PMT(*this, pid, program_number); + } + } + } while (0); + + // Skip (ignore) all remaining bytes in this packet (including the CRC): + int numBytesLeft = numDataBytes - (curOffset() - startPos); + if (numBytesLeft > 0) { +#ifdef DEBUG_CONTENTS + fprintf(stderr, "\t\t+%d CRC and stuffing bytes\n", numBytesLeft); +#endif + skipBytes(numBytesLeft); + } +} + + +//########## PIDState_PAT implementation ########## + +PIDState_PAT::PIDState_PAT(MPEG2TransportStreamParser& parser, u_int16_t pid) + : PIDState(parser, pid, PAT) { +} + +PIDState_PAT::~PIDState_PAT() { +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportStreamParser_PMT.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportStreamParser_PMT.cpp new file mode 100644 index 000000000..e7d547db6 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportStreamParser_PMT.cpp @@ -0,0 +1,471 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A parser for a MPEG Transport Stream +// Implementation + +#include "MPEG2TransportStreamParser.hh" + +void MPEG2TransportStreamParser +::parsePMT(PIDState_PMT* pidState, Boolean pusi, unsigned numDataBytes) { +#ifdef DEBUG_CONTENTS + fprintf(stderr, "\tProgram Map Table\n"); +#endif + unsigned startPos = curOffset(); + + do { + if (pusi) { + u_int8_t pointer_field = get1Byte(); + skipBytes(pointer_field); // usually 0 + } + + u_int8_t table_id = get1Byte(); + if (table_id != 0x02) { +#ifdef DEBUG_ERRORS + fprintf(stderr, "MPEG2TransportStreamParser::parsePMT(0x%04x, %d, %d): bad table_id: 0x%02x\n", + pidState->PID, pusi, numDataBytes, table_id); +#endif + break; + } + + u_int16_t flagsPlusSection_length = get2Bytes(); + u_int16_t section_length = flagsPlusSection_length&0x0FFF; +#ifdef DEBUG_CONTENTS + fprintf(stderr, "\t\tsection_length: %d\n", section_length); +#endif + if (section_length < 13/*too small for remaining fields + CRC*/ || + section_length > 1021/*as per specification*/) { +#ifdef DEBUG_ERRORS + fprintf(stderr, "MPEG2TransportStreamParser::parsePMT(0x%04x, %d, %d): Bad section_length: %d\n", + pidState->PID, pusi, numDataBytes, section_length); +#endif + break; + } + unsigned endPos = curOffset() + section_length; + if (endPos - startPos > numDataBytes) { +#ifdef DEBUG_ERRORS + fprintf(stderr, "MPEG2TransportStreamParser::parsePMT(0x%04x, %d, %d): section_length %d gives us a total size %d that's too large!\n", + pidState->PID, pusi, numDataBytes, section_length, endPos - startPos); +#endif + break; + } + + u_int16_t program_number = get2Bytes(); + if (program_number != pidState->program_number) { +#ifdef DEBUG_ERRORS + fprintf(stderr, "MPEG2TransportStreamParser::parsePMT(0x%04x, %d, %d): program_number %d does not match the value %d that was given to us in the PAT!\n", + pidState->PID, pusi, numDataBytes, program_number, pidState->program_number); +#endif + break; + } +#ifdef DEBUG_CONTENTS + fprintf(stderr, "\t\tprogram_number: %d\n", program_number); + + u_int8_t version_number_byte = get1Byte(); + u_int8_t version_number = (version_number_byte&0x1E)>>1; + u_int8_t section_number = get1Byte(); + u_int8_t last_section_number = get1Byte(); + fprintf(stderr, "\t\tversion_number: %d; section_number: %d; last_section_number: %d\n", + version_number, section_number, last_section_number); + u_int16_t PCR_PID = get2Bytes(); PCR_PID &= 0x1FFF; + fprintf(stderr, "\t\tPCR_PID: 0x%04x\n", PCR_PID); +#else + skipBytes(5); +#endif + + u_int16_t program_info_length = get2Bytes(); program_info_length &= 0x0FFF; +#ifdef DEBUG_CONTENTS + fprintf(stderr, "\t\tprogram_info_length: %d\n", program_info_length); +#endif + unsigned endOfDescriptors = curOffset() + program_info_length; + if (endOfDescriptors + 4/*CRC*/ - startPos > numDataBytes) { +#ifdef DEBUG_ERRORS + fprintf(stderr, "MPEG2TransportStreamParser::parsePMT(0x%04x, %d, %d): program_info_length %d gives us a total size %d that's too large!\n", + pidState->PID, pusi, numDataBytes, program_info_length, endOfDescriptors + 4 - startPos); +#endif + break; + } + parseStreamDescriptors(program_info_length); + + while (curOffset() <= endPos - 4/*for CRC*/ - 5/*for mapping fields*/) { + u_int8_t stream_type = get1Byte(); + u_int16_t elementary_PID = get2Bytes(); elementary_PID &= 0x1FFF; + u_int16_t ES_info_length = get2Bytes(); ES_info_length &= 0x0FFF; +#ifdef DEBUG_CONTENTS + extern StreamType StreamTypes[]; + char const* const streamTypeDesc = StreamTypes[stream_type].description; + fprintf(stderr, "\t\tstream_type: 0x%02x (%s); elementary_PID: 0x%04x; ES_info_length: %d\n", + stream_type, streamTypeDesc == NULL ? "???" : streamTypeDesc, elementary_PID, ES_info_length); +#endif + endOfDescriptors = curOffset() + ES_info_length; + if (endOfDescriptors + 4/*CRC*/ - startPos > numDataBytes) { +#ifdef DEBUG_ERRORS + fprintf(stderr, "MPEG2TransportStreamParser::parsePMT(0x%04x, %d, %d): ES_info_length %d gives us a total size %d that's too large!\n", + pidState->PID, pusi, numDataBytes, ES_info_length, endOfDescriptors + 4 - startPos); +#endif + break; + } + parseStreamDescriptors(ES_info_length); + + if (fPIDState[elementary_PID] == NULL) { + fPIDState[elementary_PID] + = new PIDState_STREAM(*this, elementary_PID, program_number, stream_type); + } + } + } while (0); + + // Skip (ignore) all remaining bytes in this packet (including the CRC): + int numBytesLeft = numDataBytes - (curOffset() - startPos); + if (numBytesLeft > 0) { +#ifdef DEBUG_CONTENTS + fprintf(stderr, "\t\t+%d CRC and stuffing bytes\n", numBytesLeft); +#endif + skipBytes(numBytesLeft); + } +} + +#ifdef DEBUG_CONTENTS +#define pDesc(str) do { fprintf(stderr, "\t\t\tdescriptor_tag: 0x%02x (%s); descriptor_length: %d\n",descriptor_tag, (str), descriptor_length); } while (0) +#else +#define pDesc(str) +#endif + +void MPEG2TransportStreamParser::parseStreamDescriptors(unsigned numDescriptorBytes) { + while (numDescriptorBytes >= 2/* enough for "descriptor_tag" and "descriptor_length" */) { + u_int8_t descriptor_tag = get1Byte(); + u_int8_t descriptor_length = get1Byte(); + numDescriptorBytes -= 2; + + if (descriptor_length > numDescriptorBytes) { +#ifdef DEBUG_ERRORS + fprintf(stderr, "MPEG2TransportStreamParser::parseStreamDescriptors() error: Saw descriptor_length %d > remaining bytes %d\n", + descriptor_length, numDescriptorBytes); +#endif + skipBytes(numDescriptorBytes); numDescriptorBytes = 0; + break; + } + + Boolean parsedDescriptor = False; + switch (descriptor_tag) { + // Note: These are the tags that we've seen to date. Add more when we see more. + case 0x02: { + pDesc("video"); + if (descriptor_length < 1) break; + u_int8_t flags = get1Byte(); + Boolean MPEG_1_only_flag = (flags&0x04) != 0; +#ifdef DEBUG_CONTENTS + fprintf(stderr, "\t\t\t\tflags: 0x%02x (frame_rate_code 0x%1x; MPEG_1_only_flag %d)\n", + flags, (flags&0x78)>>3, MPEG_1_only_flag); +#endif + if (MPEG_1_only_flag == 0) { + if (descriptor_length < 3) break; +#ifdef DEBUG_CONTENTS + u_int8_t profile_and_level_indication = get1Byte(); + flags = get1Byte(); + fprintf(stderr, "\t\t\t\tprofile_and_level_indication 0x%02x; flags 0x%02x (chroma_format 0x%1x)\n", + profile_and_level_indication, flags, (flags&0xC0)>>6); +#else + skipBytes(2); +#endif + } + numDescriptorBytes -= descriptor_length; parsedDescriptor = True; + break; + } + case 0x03: { + pDesc("audio"); + if (descriptor_length < 1) break; +#ifdef DEBUG_CONTENTS + u_int8_t flags = get1Byte(); + fprintf(stderr, "\t\t\t\tflags: 0x%02x (layer %d)\n", flags, (flags&0x30)>>4); +#else + skipBytes(1); +#endif + numDescriptorBytes -= descriptor_length; parsedDescriptor = True; + break; + } + case 0x05: { + pDesc("registration"); + if (descriptor_length < 4) break; +#ifdef DEBUG_CONTENTS + u_int32_t format_identifier = get4Bytes(); + fprintf(stderr, "\t\t\t\tformat_identifier: 0x%08x (%c%c%c%c)\n", + format_identifier, + format_identifier>>24, format_identifier>>16, format_identifier>>8, format_identifier); + if (descriptor_length > 4) { + fprintf(stderr, "\t\t\t\tadditional_identification_info: "); + for (unsigned i = 4; i < descriptor_length; ++i) fprintf(stderr, "%02x:", get1Byte()); + fprintf(stderr, "\n"); + } +#else + skipBytes(descriptor_length); +#endif + numDescriptorBytes -= descriptor_length; parsedDescriptor = True; + break; + } + case 0x06: { + pDesc("data stream alignment"); + if (descriptor_length < 1) break; +#ifdef DEBUG_CONTENTS + u_int8_t alignment_type = get1Byte(); + fprintf(stderr, "\t\t\t\talignment_type: 0x%02x\n", alignment_type); +#else + skipBytes(1); +#endif + numDescriptorBytes -= descriptor_length; parsedDescriptor = True; + break; + } + case 0x0a: { + pDesc("ISO 639 language descriptor"); + for (unsigned i = 0; i < descriptor_length/4; ++i) { +#ifdef DEBUG_CONTENTS + fprintf(stderr, "\t\t\t\tISO_639_language_code: %c%c%c; audio_type: 0x%02x\n", + get1Byte(), get1Byte(), get1Byte(), get1Byte()); +#else + skipBytes(4); +#endif + } + numDescriptorBytes -= descriptor_length; parsedDescriptor = True; + break; + } + case 0x0b: { + pDesc("system clock"); + if (descriptor_length < 2) break; +#ifdef DEBUG_CONTENTS + u_int8_t flags = get1Byte(); + Boolean external_clock_ref = (flags&0x80) != 0; + u_int8_t clock_accuracy_integer = flags&0x3F; + + u_int8_t clock_accuracy_exponent = get1Byte(); clock_accuracy_exponent >>= 5; + float ppm = clock_accuracy_integer*1.0; + for (unsigned i = 0; i < clock_accuracy_exponent; ++i) ppm /= 10.0; + fprintf(stderr, "\t\t\t\texternal_clock: %d; clock_accuracy int: %d, exp: %d -> %f ppm\n", + external_clock_ref, clock_accuracy_integer, clock_accuracy_exponent, ppm); +#else + skipBytes(2); +#endif + numDescriptorBytes -= descriptor_length; parsedDescriptor = True; + break; + } + case 0x0e: { + pDesc("maximum bitrate"); + if (descriptor_length < 3) break; +#ifdef DEBUG_CONTENTS + u_int32_t maximum_bitrate = ((get1Byte()&0x3F)<<16)|get2Bytes(); // 22 bits + fprintf(stderr, "\t\t\t\tmaximum_bitrate: %d => %f Mbps\n", + maximum_bitrate, (maximum_bitrate*50*8)/1000000.0); +#else + skipBytes(3); +#endif + numDescriptorBytes -= descriptor_length; parsedDescriptor = True; + break; + } + case 0x10: { + pDesc("smoothing buffer"); + if (descriptor_length < 6) break; +#ifdef DEBUG_CONTENTS + u_int32_t sb_leak_rate = ((get1Byte()&0x3F)<<16)|get2Bytes(); // 22 bits + u_int32_t sb_size = ((get1Byte()&0x3F)<<16)|get2Bytes(); // 22 bits + fprintf(stderr, "\t\t\t\tsb_leak_rate: %d => %f Mbps; sb_size: %d bytes\n", + sb_leak_rate, (sb_leak_rate*400)/1000000.0, sb_size); +#else + skipBytes(6); +#endif + numDescriptorBytes -= descriptor_length; parsedDescriptor = True; + break; + } + case 0x1d: { + pDesc("IOD parameters for ISO/IEC 14496-1"); + // Note: We don't know how to parse this. (Where's a document that describes this?) + skipBytes(descriptor_length); numDescriptorBytes -= descriptor_length; + parsedDescriptor = True; + break; + } + case 0x28: { + pDesc("H.264 video parameters"); + if (descriptor_length < 4) break; +#ifdef DEBUG_CONTENTS + u_int8_t profile_idc = get1Byte(); + u_int8_t flags1 = get1Byte(); + u_int8_t level_idc = get1Byte(); + u_int8_t flags2 = get1Byte(); + fprintf(stderr, "\t\t\t\tprofile_idc: 0x%02x, flags1: 0x%02x, level_idc: 0x%02x, flags2: 0x%02x\n", + profile_idc, flags1, level_idc, flags2); +#else + skipBytes(4); +#endif + numDescriptorBytes -= descriptor_length; parsedDescriptor = True; + break; + } + case 0x52: { + pDesc("stream identifier"); + if (descriptor_length < 1) break; +#ifdef DEBUG_CONTENTS + u_int8_t component_tag = get1Byte(); + fprintf(stderr, "\t\t\t\tcomponent_tag: %d\n", component_tag); +#else + skipBytes(1); +#endif + numDescriptorBytes -= descriptor_length; parsedDescriptor = True; + break; + } + case 0x56: { + pDesc("teletext"); + for (unsigned i = 0; i < descriptor_length/5; ++i) { +#ifdef DEBUG_CONTENTS + fprintf(stderr, "\t\t\t\tISO_639_language_code: %c%c%c", + get1Byte(), get1Byte(), get1Byte()); + u_int8_t typePlusMagazine = get1Byte(); + fprintf(stderr, "; type: 0x%02x; magazine: %d; page: %d\n", + typePlusMagazine>>3, typePlusMagazine&0x07, get1Byte()); +#else + skipBytes(5); +#endif + } + numDescriptorBytes -= descriptor_length; parsedDescriptor = True; + break; + } + case 0x59: { + pDesc("subtitling"); + for (unsigned i = 0; i < descriptor_length/8; ++i) { +#ifdef DEBUG_CONTENTS + fprintf(stderr, "\t\t\t\tISO_639_language_code: %c%c%c", + get1Byte(), get1Byte(), get1Byte()); + fprintf(stderr, "; subtitling_type: 0x%02x; composition_page_id: 0x%04x; ancillary_page_id: 0x%04x\n", + get1Byte(), get2Bytes(), get2Bytes()); +#else + skipBytes(8); +#endif + } + numDescriptorBytes -= descriptor_length; parsedDescriptor = True; + break; + } + case 0x6f: { + pDesc("application signalling"); + for (unsigned i = 0; i < descriptor_length/3; ++i) { +#ifdef DEBUG_CONTENTS + fprintf(stderr, "\t\t\t\tapplication_type: 0x%04x; AIT_version_number: %d\n", + get2Bytes()&0x7FFF, get1Byte()&0x1F); +#else + skipBytes(3); +#endif + } + numDescriptorBytes -= descriptor_length; parsedDescriptor = True; + break; + } + case 0x7a: { + pDesc("enhanced AC-3"); + if (descriptor_length < 1) break; +#ifdef DEBUG_CONTENTS + u_int8_t flags = get1Byte(); + fprintf(stderr, "\t\t\t\tflags: 0x%02x", flags); + if (descriptor_length > 1) { + fprintf(stderr, "; extra bytes: "); + for (unsigned i = 1; i < descriptor_length; ++i) fprintf(stderr, "0x%02x ", get1Byte()); + } + fprintf(stderr, "\n"); +#else + skipBytes(descriptor_length); +#endif + numDescriptorBytes -= descriptor_length; parsedDescriptor = True; + break; + } + case 0x81: { + pDesc("AC-3 audio"); + if (descriptor_length < 3) break; +#ifdef DEBUG_CONTENTS + u_int8_t flags = get1Byte(); + fprintf(stderr, "\t\t\t\tsample_rate_code: %d; bsid: 0x%02x", + flags>>5, flags&0x1F); + flags = get1Byte(); + fprintf(stderr, "; bit_rate_code: %d; surround_mode: %d", + flags>>2, flags&0x03); + flags = get1Byte(); + fprintf(stderr, "; bsmod: %d; num_channels: %d; full_svc: %d", + flags>>5, (flags&0x1E)>>1, (flags&0x01)); + if (descriptor_length > 3) { + fprintf(stderr, "; extra bytes: "); + for (unsigned i = 3; i < descriptor_length; ++i) fprintf(stderr, "0x%02x ", get1Byte()); + } + fprintf(stderr, "\n"); +#else + skipBytes(descriptor_length); +#endif + numDescriptorBytes -= descriptor_length; parsedDescriptor = True; + break; + } + case 0x86: { + pDesc("caption service"); + if (descriptor_length < 1) break; + u_int8_t number_of_services = get1Byte()&0x1F; +#ifdef DEBUG_CONTENTS + fprintf(stderr, "\t\t\t\tnumber_of_services: %d\n", number_of_services); +#endif + if (descriptor_length < number_of_services*6) break; +#ifdef DEBUG_CONTENTS + for (unsigned i = 0; i < number_of_services; ++i) { + fprintf(stderr, "\t\t\t\t\tlanguage: %c%c%c", get1Byte(), get1Byte(), get1Byte()); + + u_int8_t flags = get1Byte(); + Boolean digital_cc = (flags&0x80) != 0; + fprintf(stderr, "; digital_cc %d", digital_cc); + if (digital_cc == 0) { + fprintf(stderr, "; line21_field: %d", flags&0x01); + } else { + fprintf(stderr, "; caption_service_number: %d", flags&0x3F); + } + + u_int16_t flags2 = get2Bytes(); + fprintf(stderr, "; easy_reader: %d; wide_aspect_ratio: %d\n", + (flags2&0x8000) != 0, (flags2&0x4000) != 0); + } +#else + skipBytes(number_of_services*6); +#endif + numDescriptorBytes -= descriptor_length; parsedDescriptor = True; + break; + } + default: { + pDesc("???"); + skipBytes(descriptor_length); + numDescriptorBytes -= descriptor_length; parsedDescriptor = True; + break; + } + } + if (!parsedDescriptor) break; // an error occurred + } + + // Skip over any remaining descriptor bytes (as a result of a parsing error): + if (numDescriptorBytes > 0) { +#ifdef DEBUG_ERRORS + fprintf(stderr, "MPEG2TransportStreamParser::parseStreamDescriptors() Parsing error left %d bytes unparsed\n", + numDescriptorBytes); +#endif + skipBytes(numDescriptorBytes); + } +} + + +//########## PIDState_PMT implementation ########## + +PIDState_PMT +::PIDState_PMT(MPEG2TransportStreamParser& parser, u_int16_t pid, u_int16_t programNumber) + : PIDState(parser, pid, PMT), + program_number(programNumber) { +} + +PIDState_PMT::~PIDState_PMT() { +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportStreamParser_STREAM.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportStreamParser_STREAM.cpp new file mode 100644 index 000000000..880e00eab --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportStreamParser_STREAM.cpp @@ -0,0 +1,310 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A parser for a MPEG Transport Stream +// Implementation + +#include "MPEG2TransportStreamParser.hh" +#include "FileSink.hh" +#include // for time_t + +Boolean MPEG2TransportStreamParser +::processStreamPacket(PIDState_STREAM* pidState, Boolean pusi, unsigned numDataBytes) { +#ifdef DEBUG_CONTENTS + extern StreamType StreamTypes[]; + fprintf(stderr, "\t%s stream (stream_type 0x%02x)\n", + StreamTypes[pidState->stream_type].description, pidState->stream_type); +#endif + do { + MPEG2TransportStreamDemuxedTrack* streamSource = pidState->streamSource; + if (streamSource == NULL) { + // There's no source for this track; just skip the data: + skipBytes(numDataBytes); + break; + } + + if (!streamSource->isCurrentlyAwaitingData()) { + // Wait until the source next gets read from. (The parsing will continue then.) + return False; + } + + // If the data begins with a PES header, parse it first + unsigned pesHeaderSize = 0; + if (pusi && pidState->stream_type != 0x05/*these special private streams don't have PES hdrs*/) { + pesHeaderSize = parsePESHeader(pidState, numDataBytes); + if (pesHeaderSize == 0) break; // PES header parsing failed + } + + // Deliver the data: + unsigned numBytesToDeliver = numDataBytes - pesHeaderSize; + if (numBytesToDeliver > streamSource->maxSize()) { + streamSource->frameSize() = streamSource->maxSize(); + streamSource->numTruncatedBytes() = numBytesToDeliver - streamSource->maxSize(); + } else { + streamSource->frameSize() = numBytesToDeliver; + streamSource->numTruncatedBytes() = 0; + } + getBytes(streamSource->to(), streamSource->frameSize()); + skipBytes(streamSource->numTruncatedBytes()); + + double pts = pidState->lastSeenPTS == 0.0 ? fLastSeenPCR : pidState->lastSeenPTS; + streamSource->presentationTime().tv_sec = (time_t)pts; + streamSource->presentationTime().tv_usec = int(pts*1000000.0)%1000000; + + FramedSource::afterGetting(streamSource); // completes delivery + } while (0); + + return True; +} + +static Boolean isSpecialStreamId[0x100]; + +unsigned MPEG2TransportStreamParser +::parsePESHeader(PIDState_STREAM* pidState, unsigned numDataBytes) { + static Boolean haveInitializedIsSpecialStreamId = False; + if (!haveInitializedIsSpecialStreamId) { + for (unsigned i = 0; i < 0x100; ++i) isSpecialStreamId[i] = False; + isSpecialStreamId[0xBC] = True; // program_stream_map + isSpecialStreamId[0xBE] = True; // padding_stream + isSpecialStreamId[0xBF] = True; // private_stream_2 + isSpecialStreamId[0xF0] = True; // ECM_stream + isSpecialStreamId[0xF1] = True; // EMM_stream + isSpecialStreamId[0xF2] = True; // DSMCC_stream + isSpecialStreamId[0xF8] = True; // ITU-T Rec. H.222.1 type E + isSpecialStreamId[0xFF] = True; // program_stream_directory + + haveInitializedIsSpecialStreamId = True; // from now on + } + +#ifdef DEBUG_CONTENTS + fprintf(stderr, "\t\tPES Header:\n"); +#endif + unsigned startPos = curOffset(); + + do { + u_int32_t startCodePlusStreamId = get4Bytes(); + if ((startCodePlusStreamId&0xFFFFFF00) != 0x00000100) { +#ifdef DEBUG_ERRORS + fprintf(stderr, "MPEG2TransportStreamParser::parsePESHeader(0x%02x, %d): Bad start code: 0x%06x\n", + pidState->PID, numDataBytes, startCodePlusStreamId>>8); +#endif + break; + } + u_int8_t stream_id = startCodePlusStreamId&0xFF; + +#ifdef DEBUG_CONTENTS + fprintf(stderr, "\t\t\tstream_id: 0x%02x; PES_packet_length: %d\n", + stream_id, get2Bytes()); +#else + skipBytes(2); +#endif + + if (!isSpecialStreamId[stream_id]) { + u_int16_t flags = get2Bytes(); + if ((flags&0xC000) != 0x8000) { +#ifdef DEBUG_ERRORS + fprintf(stderr, "MPEG2TransportStreamParser::parsePESHeader(0x%02x, %d): Bad flags: 0x%04x\n", + pidState->PID, numDataBytes, flags); +#endif + break; + } + u_int8_t PTS_DTS_flags = (flags&0x00C0)>>6; + Boolean ESCR_flag = (flags&0x0020) != 0; + Boolean ES_rate_flag = (flags&0x0010) != 0; + Boolean DSM_trick_mode_flag = (flags&0x0008) != 0; + Boolean additional_copy_info_flag = (flags&0x0004) != 0; + Boolean PES_CRC_flag = (flags&0x0002) != 0; + Boolean PES_extension_flag = (flags&0x0001) != 0; +#ifdef DEBUG_CONTENTS + fprintf(stderr, "\t\t\tflags: 0x%04x (PTS_DTS:%d; ESCR:%d; ES_rate:%d; DSM_trick_mode:%d; additional_copy_info:%d; PES_CRC:%d; PES_extension:%d)\n", + flags, PTS_DTS_flags, ESCR_flag, ES_rate_flag, DSM_trick_mode_flag, additional_copy_info_flag, PES_CRC_flag, PES_extension_flag); +#endif + + u_int8_t PES_header_data_length = get1Byte(); +#ifdef DEBUG_CONTENTS + fprintf(stderr, "\t\t\tPES_header_data_length: %d\n", PES_header_data_length); +#endif + + if (PTS_DTS_flags == 2 || PTS_DTS_flags == 3) { + // Begin with a PTS: + u_int8_t first8PTSBits = get1Byte(); + u_int32_t last32PTSBits = get4Bytes(); + if ((first8PTSBits&0xF1) != ((PTS_DTS_flags<<4)|0x01) || + (last32PTSBits&0x00010001) != 0x00010001) { +#ifdef DEBUG_ERRORS + fprintf(stderr, "MPEG2TransportStreamParser::parsePESHeader(0x%02x, %d): Bad PTS bits: 0x%02x,0x%08x\n", + pidState->PID, numDataBytes, first8PTSBits, last32PTSBits); +#endif + break; + } + u_int32_t ptsUpper32 = ((first8PTSBits&0x0E)<<28) | ((last32PTSBits&0xFFFE0000)>>3) | ((last32PTSBits&0x0000FFFC)>>2); + u_int8_t ptsLowBit = (last32PTSBits&0x00000002)>>1; + double PTS = ptsUpper32/45000.0; + if (ptsLowBit) PTS += 1/90000.0; +#ifdef DEBUG_CONTENTS + fprintf(stderr, "\t\t\tPTS: 0x%02x%08x => 0x%08x+%d => %.10f\n", + first8PTSBits, last32PTSBits, ptsUpper32, ptsLowBit, PTS); +#endif + // Record this PTS: + pidState->lastSeenPTS = PTS; + } + + if (PTS_DTS_flags == 3) { + // Continue with a DTS: + u_int8_t first8DTSBits = get1Byte(); + u_int32_t last32DTSBits = get4Bytes(); + if ((first8DTSBits&0x11) != 0x11 || + (last32DTSBits&0x00010001) != 0x00010001) { +#ifdef DEBUG_ERRORS + fprintf(stderr, "MPEG2TransportStreamParser::parsePESHeader(0x%02x, %d): Bad DTS bits: 0x%02x,0x%08x\n", + pidState->PID, numDataBytes, first8DTSBits, last32DTSBits); +#endif + break; + } + u_int32_t dtsUpper32 = ((first8DTSBits&0x0E)<<28) | ((last32DTSBits&0xFFFE0000)>>3) | ((last32DTSBits&0x0000FFFC)>>2); + u_int8_t dtsLowBit = (last32DTSBits&0x00000002)>>1; + double DTS = dtsUpper32/45000.0; + if (dtsLowBit) DTS += 1/90000.0; +#ifdef DEBUG_CONTENTS + fprintf(stderr, "\t\t\tDTS: 0x%02x%08x => 0x%08x+%d => %.10f\n", + first8DTSBits, last32DTSBits, dtsUpper32, dtsLowBit, DTS); +#endif + } + + if (ESCR_flag) { + // Skip over the ESCR + skipBytes(6); + } + + if (ES_rate_flag) { + // Skip over the ES_rate + skipBytes(6); + } + + if (DSM_trick_mode_flag) { + // Skip over this + skipBytes(1); + } + + if (additional_copy_info_flag) { + // Skip over this + skipBytes(1); + } + + if (PES_CRC_flag) { + // Skip over this + skipBytes(2); + } + + if (PES_extension_flag) { + u_int8_t flags = get1Byte(); + Boolean PES_private_data_flag = (flags&0x80) != 0; + Boolean pack_header_field_flag = (flags&0x40) != 0; + Boolean program_packet_sequence_counter_flag = (flags&0x20) != 0; + Boolean P_STD_buffer_flag = (flags&0x10) != 0; + Boolean PES_extension_flag_2 = (flags&0x01) != 0; +#ifdef DEBUG_CONTENTS + fprintf(stderr, "\t\t\tPES_extension: flags: 0x%02x (PES_private_data:%d; pack_header_field:%d; program_packet_sequence_counter:%d; P_STD_buffer:%d; PES_extension_2:%d\n", + flags, PES_private_data_flag, pack_header_field_flag, program_packet_sequence_counter_flag, P_STD_buffer_flag, PES_extension_flag_2); +#endif + if (PES_private_data_flag) { + // Skip over this + skipBytes(16); + } + if (pack_header_field_flag) { + // Skip over this + skipBytes(1 + 12); // "pack_header()" is 12 bytes in size + } + if (program_packet_sequence_counter_flag) { + // Skip over this + skipBytes(2); + } + if (P_STD_buffer_flag) { + // Skip over this + skipBytes(2); + } + if (PES_extension_flag_2) { + u_int8_t PES_extension_field_length = get1Byte()&0x7F; +#ifdef DEBUG_CONTENTS + fprintf(stderr, "\t\t\t\tPES_extension_field_length: %d\n", PES_extension_field_length); +#endif + skipBytes(PES_extension_field_length); + } + } + + // Make sure that the number of header bytes parsed is consistent with "PES_header_data_length" + // (and skip over any remasining 'stuffing' bytes): + if (curOffset() - startPos > 9 + PES_header_data_length) { +#ifdef DEBUG_ERRORS + fprintf(stderr, "MPEG2TransportStreamParser::parsePESHeader(0x%02x, %d): Error: Parsed %d PES header bytes; expected %d (based on \"PES_header_data_length\": %d)\n", + pidState->PID, numDataBytes, curOffset() - startPos, 9 + PES_header_data_length, + PES_header_data_length); +#endif + break; + } + skipBytes(9 + PES_header_data_length - (curOffset() - startPos)); // >= 0 + } + + unsigned PESHeaderSize = curOffset() - startPos; +#ifdef DEBUG_CONTENTS + fprintf(stderr, "\t\t\t=> PES header size: %d\n", PESHeaderSize); +#endif + if (PESHeaderSize > numDataBytes) { +#ifdef DEBUG_ERRORS + fprintf(stderr, "MPEG2TransportStreamParser::parsePESHeader(0x%02x, %d): Error: PES header size %d is larger than the number of bytes available (%d)\n", + pidState->PID, numDataBytes, PESHeaderSize, numDataBytes); +#endif + break; + } + return PESHeaderSize; + } while (0); + + // An error occurred. Skip over any remaining bytes in the packet: + int numBytesLeft = numDataBytes - (curOffset() - startPos); + if (numBytesLeft > 0) skipBytes((unsigned)numBytesLeft); + return 0; +} + + +//########## PIDState_STREAM implementation ########## + +PIDState_STREAM::PIDState_STREAM(MPEG2TransportStreamParser& parser, + u_int16_t pid, u_int16_t programNumber, u_int8_t streamType) + : PIDState(parser, pid, STREAM), + program_number(programNumber), stream_type(streamType), lastSeenPTS(0.0) { + // Create the 'source' and 'sink' objects for this track, and 'start playing' them: + streamSource = new MPEG2TransportStreamDemuxedTrack(parser, pid); + + char fileName[100]; + extern StreamType StreamTypes[]; + StreamType& st = StreamTypes[streamType]; // alias + sprintf(fileName, "%s-0x%04x-0x%04x%s", + st.dataType == StreamType::AUDIO ? "AUDIO" : + st.dataType == StreamType::VIDEO ? "VIDEO" : + st.dataType == StreamType::DATA ? "DATA" : + st.dataType == StreamType::TEXT ? "TEXT" : + "UNKNOWN", + program_number, pid, st.filenameSuffix); + fprintf(stderr, "Creating new output file \"%s\"\n", fileName); + streamSink = FileSink::createNew(parser.envir(), fileName); + streamSink->startPlaying(*streamSource, NULL, NULL); +} + +PIDState_STREAM::~PIDState_STREAM() { + Medium::close(streamSink); + Medium::close(streamSource); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportStreamTrickModeFilter.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportStreamTrickModeFilter.cpp new file mode 100644 index 000000000..51638e657 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportStreamTrickModeFilter.cpp @@ -0,0 +1,266 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A filter that converts a MPEG Transport Stream file - with corresponding index file +// - to a corresponding Video Elementary Stream. It also uses a "scale" parameter +// to implement 'trick mode' (fast forward or reverse play, using I-frames) on +// the video stream. +// Implementation + +#include "MPEG2TransportStreamTrickModeFilter.hh" +#include + +// Define the following to be True if we want the output file to have the same frame rate as the original file. +// (Because the output file contains I-frames only, this means that each I-frame will appear in the output file +// several times, and therefore the output file's bitrate will be significantly higher than that of the original.) +// Define the following to be False if we want the output file to include each I-frame no more than once. +// (This means that - except for high 'scale' values - both the output frame rate and the output bit rate +// will be less than that of the original.) +#define KEEP_ORIGINAL_FRAME_RATE False + +MPEG2TransportStreamTrickModeFilter* MPEG2TransportStreamTrickModeFilter +::createNew(UsageEnvironment& env, FramedSource* inputSource, + MPEG2TransportStreamIndexFile* indexFile, int scale) { + return new MPEG2TransportStreamTrickModeFilter(env, inputSource, indexFile, scale); +} + +MPEG2TransportStreamTrickModeFilter +::MPEG2TransportStreamTrickModeFilter(UsageEnvironment& env, FramedSource* inputSource, + MPEG2TransportStreamIndexFile* indexFile, int scale) + : FramedFilter(env, inputSource), + fHaveStarted(False), fIndexFile(indexFile), fScale(scale), fDirection(1), + fState(SKIPPING_FRAME), fFrameCount(0), + fNextIndexRecordNum(0), fNextTSPacketNum(0), + fCurrentTSPacketNum((unsigned long)(-1)), fUseSavedFrameNextTime(False) { + if (fScale < 0) { // reverse play + fScale = -fScale; + fDirection = -1; + } +} + +MPEG2TransportStreamTrickModeFilter::~MPEG2TransportStreamTrickModeFilter() { +} + +Boolean MPEG2TransportStreamTrickModeFilter::seekTo(unsigned long tsPacketNumber, + unsigned long indexRecordNumber) { + seekToTransportPacket(tsPacketNumber); + fNextIndexRecordNum = indexRecordNumber; + return True; +} + +#define isIFrameStart(type) ((type) == 0x81/*actually, a VSH*/ || (type) == 0x85/*actually, a SPS, for H.264*/ || (type) == 0x8B/*actually, a VPS, for H.265*/) + // This relies upon I-frames always being preceded by a VSH+GOP (for MPEG-2 data), + // by a SPS (for H.264 data), or by a VPS (for H.265 data) +#define isNonIFrameStart(type) ((type) == 0x83 || (type) == 0x88/*for H.264*/ || (type) == 0x8E/*for H.265*/) + +void MPEG2TransportStreamTrickModeFilter::doGetNextFrame() { + // fprintf(stderr, "#####DGNF1\n"); + // If our client's buffer size is too small, then deliver + // a 0-byte 'frame', to tell it to process all of the data that it has + // already read, before asking for more data from us: + if (fMaxSize < TRANSPORT_PACKET_SIZE) { + fFrameSize = 0; + afterGetting(this); + return; + } + + while (1) { + // Get the next record from our index file. + // This tells us the type of frame this data is, which Transport Stream packet + // (from the input source) the data comes from, and where in the Transport Stream + // packet it comes from: + u_int8_t recordType; + float recordPCR; + Boolean endOfIndexFile = False; + if (!fIndexFile->readIndexRecordValues(fNextIndexRecordNum, + fDesiredTSPacketNum, fDesiredDataOffset, + fDesiredDataSize, recordPCR, + recordType)) { + // We ran off the end of the index file. If we're not delivering a + // pre-saved frame, then handle this the same way as if the + // input Transport Stream source ended. + if (fState != DELIVERING_SAVED_FRAME) { + onSourceClosure1(); + return; + } + endOfIndexFile = True; + } else if (!fHaveStarted) { + fFirstPCR = recordPCR; + fHaveStarted = True; + } + // fprintf(stderr, "#####read index record %ld: ts %ld: %c, PCR %f\n", fNextIndexRecordNum, fDesiredTSPacketNum, isIFrameStart(recordType) ? 'I' : isNonIFrameStart(recordType) ? 'j' : 'x', recordPCR); + fNextIndexRecordNum + += (fState == DELIVERING_SAVED_FRAME) ? 1 : fDirection; + + // Handle this index record, depending on the record type and our current state: + switch (fState) { + case SKIPPING_FRAME: + case SAVING_AND_DELIVERING_FRAME: { + // if (fState == SKIPPING_FRAME) fprintf(stderr, "\tSKIPPING_FRAME\n"); else fprintf(stderr, "\tSAVING_AND_DELIVERING_FRAME\n");//##### + if (isIFrameStart(recordType)) { + // Save a record of this frame: + fSavedFrameIndexRecordStart = fNextIndexRecordNum - fDirection; + fUseSavedFrameNextTime = True; + // fprintf(stderr, "\trecording\n");//##### + if ((fFrameCount++)%fScale == 0 && fUseSavedFrameNextTime) { + // A frame is due now. + fFrameCount = 1; // reset to avoid overflow + if (fDirection > 0) { + // Begin delivering this frame, as we're scanning it: + fState = SAVING_AND_DELIVERING_FRAME; + // fprintf(stderr, "\tdelivering\n");//##### + fDesiredDataPCR = recordPCR; // use this frame's PCR + attemptDeliveryToClient(); + return; + } else { + // Deliver this frame, then resume normal scanning: + // (This relies on the index records having begun with an I-frame.) + fState = DELIVERING_SAVED_FRAME; + fSavedSequentialIndexRecordNum = fNextIndexRecordNum; + fDesiredDataPCR = recordPCR; + // use this frame's (not the saved frame's) PCR + fNextIndexRecordNum = fSavedFrameIndexRecordStart; + // fprintf(stderr, "\tbeginning delivery of saved frame\n");//##### + } + } else { + // No frame is needed now: + fState = SKIPPING_FRAME; + } + } else if (isNonIFrameStart(recordType)) { + if ((fFrameCount++)%fScale == 0 && fUseSavedFrameNextTime) { + // A frame is due now, so begin delivering the one that we had saved: + // (This relies on the index records having begun with an I-frame.) + fFrameCount = 1; // reset to avoid overflow + fState = DELIVERING_SAVED_FRAME; + fSavedSequentialIndexRecordNum = fNextIndexRecordNum; + fDesiredDataPCR = recordPCR; + // use this frame's (not the saved frame's) PCR + fNextIndexRecordNum = fSavedFrameIndexRecordStart; + // fprintf(stderr, "\tbeginning delivery of saved frame\n");//##### + } else { + // No frame is needed now: + fState = SKIPPING_FRAME; + } + } else { + // Not the start of a frame, but deliver it, if it's needed: + if (fState == SAVING_AND_DELIVERING_FRAME) { + // fprintf(stderr, "\tdelivering\n");//##### + fDesiredDataPCR = recordPCR; // use this frame's PCR + attemptDeliveryToClient(); + return; + } + } + break; + } + case DELIVERING_SAVED_FRAME: { + // fprintf(stderr, "\tDELIVERING_SAVED_FRAME\n");//##### + if (endOfIndexFile + || (isIFrameStart(recordType) + && fNextIndexRecordNum-1 != fSavedFrameIndexRecordStart) + || isNonIFrameStart(recordType)) { + // fprintf(stderr, "\tended delivery of saved frame\n");//##### + // We've reached the end of the saved frame, so revert to the + // original sequence of index records: + fNextIndexRecordNum = fSavedSequentialIndexRecordNum; + fUseSavedFrameNextTime = KEEP_ORIGINAL_FRAME_RATE; + fState = SKIPPING_FRAME; + } else { + // Continue delivering: + // fprintf(stderr, "\tdelivering\n");//##### + attemptDeliveryToClient(); + return; + } + break; + } + } + } +} + +void MPEG2TransportStreamTrickModeFilter::doStopGettingFrames() { + FramedFilter::doStopGettingFrames(); + fIndexFile->stopReading(); +} + +void MPEG2TransportStreamTrickModeFilter::attemptDeliveryToClient() { + if (fCurrentTSPacketNum == fDesiredTSPacketNum) { + // fprintf(stderr, "\t\tdelivering ts %d:%d, %d bytes, PCR %f\n", fCurrentTSPacketNum, fDesiredDataOffset, fDesiredDataSize, fDesiredDataPCR);//##### + // We already have the Transport Packet that we want. Deliver its data: + memmove(fTo, &fInputBuffer[fDesiredDataOffset], fDesiredDataSize); + fFrameSize = fDesiredDataSize; + float deliveryPCR = fDirection*(fDesiredDataPCR - fFirstPCR)/fScale; + if (deliveryPCR < 0.0) deliveryPCR = 0.0; + fPresentationTime.tv_sec = (unsigned long)deliveryPCR; + fPresentationTime.tv_usec + = (unsigned long)((deliveryPCR - fPresentationTime.tv_sec)*1000000.0f); + // fprintf(stderr, "#####DGNF9\n"); + + afterGetting(this); + } else { + // Arrange to read the Transport Packet that we want: + readTransportPacket(fDesiredTSPacketNum); + } +} + +void MPEG2TransportStreamTrickModeFilter::seekToTransportPacket(unsigned long tsPacketNum) { + if (tsPacketNum == fNextTSPacketNum) return; // we're already there + + ByteStreamFileSource* tsFile = (ByteStreamFileSource*)fInputSource; + u_int64_t tsPacketNum64 = (u_int64_t)tsPacketNum; + tsFile->seekToByteAbsolute(tsPacketNum64*TRANSPORT_PACKET_SIZE); + + fNextTSPacketNum = tsPacketNum; +} + +void MPEG2TransportStreamTrickModeFilter::readTransportPacket(unsigned long tsPacketNum) { + seekToTransportPacket(tsPacketNum); + fInputSource->getNextFrame(fInputBuffer, TRANSPORT_PACKET_SIZE, + afterGettingFrame, this, + onSourceClosure, this); +} + +void MPEG2TransportStreamTrickModeFilter +::afterGettingFrame(void* clientData, unsigned frameSize, + unsigned /*numTruncatedBytes*/, + struct timeval presentationTime, + unsigned /*durationInMicroseconds*/) { + MPEG2TransportStreamTrickModeFilter* filter = (MPEG2TransportStreamTrickModeFilter*)clientData; + filter->afterGettingFrame1(frameSize); +} + +void MPEG2TransportStreamTrickModeFilter::afterGettingFrame1(unsigned frameSize) { + if (frameSize != TRANSPORT_PACKET_SIZE) { + // Treat this as if the input source ended: + onSourceClosure1(); + return; + } + + fCurrentTSPacketNum = fNextTSPacketNum; // i.e., the one that we just read + ++fNextTSPacketNum; + + // Attempt deliver again: + attemptDeliveryToClient(); +} + +void MPEG2TransportStreamTrickModeFilter::onSourceClosure(void* clientData) { + MPEG2TransportStreamTrickModeFilter* filter = (MPEG2TransportStreamTrickModeFilter*)clientData; + filter->onSourceClosure1(); +} + +void MPEG2TransportStreamTrickModeFilter::onSourceClosure1() { + fIndexFile->stopReading(); + handleClosure(); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportUDPServerMediaSubsession.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportUDPServerMediaSubsession.cpp new file mode 100644 index 000000000..ea852ae86 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MPEG2TransportUDPServerMediaSubsession.cpp @@ -0,0 +1,81 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A 'ServerMediaSubsession' object that creates new, unicast, "RTPSink"s +// on demand, from an incoming UDP (or RTP/UDP) MPEG-2 Transport Stream +// Implementation + +#include "MPEG2TransportUDPServerMediaSubsession.hh" +#include "BasicUDPSource.hh" +#include "SimpleRTPSource.hh" +#include "MPEG2TransportStreamFramer.hh" +#include "SimpleRTPSink.hh" +#include "GroupsockHelper.hh" + + +MPEG2TransportUDPServerMediaSubsession* +MPEG2TransportUDPServerMediaSubsession::createNew(UsageEnvironment& env, + char const* inputAddressStr, Port const& inputPort, Boolean inputStreamIsRawUDP) { + return new MPEG2TransportUDPServerMediaSubsession(env, inputAddressStr, inputPort, inputStreamIsRawUDP); +} + +MPEG2TransportUDPServerMediaSubsession +::MPEG2TransportUDPServerMediaSubsession(UsageEnvironment& env, + char const* inputAddressStr, Port const& inputPort, Boolean inputStreamIsRawUDP) + : OnDemandServerMediaSubsession(env, True/*reuseFirstSource*/), + fInputPort(inputPort), fInputGroupsock(NULL), fInputStreamIsRawUDP(inputStreamIsRawUDP) { + fInputAddressStr = strDup(inputAddressStr); +} + +MPEG2TransportUDPServerMediaSubsession:: +~MPEG2TransportUDPServerMediaSubsession() { + delete fInputGroupsock; + delete[] (char*)fInputAddressStr; +} + +FramedSource* MPEG2TransportUDPServerMediaSubsession +::createNewStreamSource(unsigned/* clientSessionId*/, unsigned& estBitrate) { + estBitrate = 5000; // kbps, estimate + + if (fInputGroupsock == NULL) { + // Create a 'groupsock' object for receiving the input stream: + struct sockaddr_storage inputAddress; + if (fInputAddressStr == NULL) { + inputAddress = nullAddress(); + } else { + NetAddressList inputAddresses(fInputAddressStr); + if (inputAddresses.numAddresses() == 0) return NULL; + copyAddress(inputAddress, inputAddresses.firstAddress()); + } + fInputGroupsock = new Groupsock(envir(), inputAddress, fInputPort, 255); + } + + FramedSource* transportStreamSource; + if (fInputStreamIsRawUDP) { + transportStreamSource = BasicUDPSource::createNew(envir(), fInputGroupsock); + } else { + transportStreamSource = SimpleRTPSource::createNew(envir(), fInputGroupsock, 33, 90000, "video/MP2T", 0, False /*no 'M' bit*/); + } + return MPEG2TransportStreamFramer::createNew(envir(), transportStreamSource); +} + +RTPSink* MPEG2TransportUDPServerMediaSubsession +::createNewRTPSink(Groupsock* rtpGroupsock, unsigned char /*rtpPayloadTypeIfDynamic*/, FramedSource* /*inputSource*/) { + return SimpleRTPSink::createNew(envir(), rtpGroupsock, + 33, 90000, "video", "MP2T", + 1, True, False /*no 'M' bit*/); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MPEG4ESVideoRTPSink.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MPEG4ESVideoRTPSink.cpp new file mode 100644 index 000000000..731df2314 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MPEG4ESVideoRTPSink.cpp @@ -0,0 +1,142 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP sink for MPEG-4 Elementary Stream video (RFC 3016) +// Implementation + +#include "MPEG4ESVideoRTPSink.hh" +#include "MPEG4VideoStreamFramer.hh" +#include "MPEG4LATMAudioRTPSource.hh" // for "parseGeneralConfigStr()" + +MPEG4ESVideoRTPSink +::MPEG4ESVideoRTPSink(UsageEnvironment& env, Groupsock* RTPgs, unsigned char rtpPayloadFormat, u_int32_t rtpTimestampFrequency, + u_int8_t profileAndLevelIndication, char const* configStr) + : VideoRTPSink(env, RTPgs, rtpPayloadFormat, rtpTimestampFrequency, "MP4V-ES"), + fVOPIsPresent(False), fProfileAndLevelIndication(profileAndLevelIndication), fFmtpSDPLine(NULL) { + fConfigBytes = parseGeneralConfigStr(configStr, fNumConfigBytes); +} + +MPEG4ESVideoRTPSink::~MPEG4ESVideoRTPSink() { + delete[] fFmtpSDPLine; + delete[] fConfigBytes; +} + +MPEG4ESVideoRTPSink* +MPEG4ESVideoRTPSink::createNew(UsageEnvironment& env, + Groupsock* RTPgs, unsigned char rtpPayloadFormat, + u_int32_t rtpTimestampFrequency) { + return new MPEG4ESVideoRTPSink(env, RTPgs, rtpPayloadFormat, rtpTimestampFrequency); +} + +MPEG4ESVideoRTPSink* +MPEG4ESVideoRTPSink::createNew(UsageEnvironment& env, + Groupsock* RTPgs, unsigned char rtpPayloadFormat, u_int32_t rtpTimestampFrequency, + u_int8_t profileAndLevelIndication, char const* configStr) { + return new MPEG4ESVideoRTPSink(env, RTPgs, rtpPayloadFormat, rtpTimestampFrequency, profileAndLevelIndication, configStr); +} + +Boolean MPEG4ESVideoRTPSink::sourceIsCompatibleWithUs(MediaSource& source) { + // Our source must be an appropriate framer: + return source.isMPEG4VideoStreamFramer(); +} + +#define VOP_START_CODE 0x000001B6 + +void MPEG4ESVideoRTPSink +::doSpecialFrameHandling(unsigned fragmentationOffset, + unsigned char* frameStart, + unsigned numBytesInFrame, + struct timeval framePresentationTime, + unsigned numRemainingBytes) { + if (fragmentationOffset == 0) { + // Begin by inspecting the 4-byte code at the start of the frame: + if (numBytesInFrame < 4) return; // shouldn't happen + u_int32_t startCode + = (frameStart[0]<<24) | (frameStart[1]<<16) | (frameStart[2]<<8) | frameStart[3]; + + fVOPIsPresent = startCode == VOP_START_CODE; + } + + // Set the RTP 'M' (marker) bit iff this frame ends a VOP + // (and there are no fragments remaining). + // This relies on the source being a "MPEG4VideoStreamFramer". + MPEG4VideoStreamFramer* framerSource = (MPEG4VideoStreamFramer*)fSource; + if (framerSource != NULL && framerSource->pictureEndMarker() + && numRemainingBytes == 0) { + setMarkerBit(); + framerSource->pictureEndMarker() = False; + } + + // Also set the RTP timestamp. (We do this for each frame + // in the packet, to ensure that the timestamp of the VOP (if present) + // gets used.) + setTimestamp(framePresentationTime); +} + +Boolean MPEG4ESVideoRTPSink::allowFragmentationAfterStart() const { + return True; +} + +Boolean MPEG4ESVideoRTPSink +::frameCanAppearAfterPacketStart(unsigned char const* /*frameStart*/, + unsigned /*numBytesInFrame*/) const { + // Once we've packed a VOP into the packet, then no other + // frame can be packed into it: + return !fVOPIsPresent; +} + +char const* MPEG4ESVideoRTPSink::auxSDPLine() { + // Generate a new "a=fmtp:" line each time, using our own 'configuration' information (if we have it), + // otherwise parameters from our framer source (in case they've changed since the last time that + // we were called): + unsigned configLength = fNumConfigBytes; + unsigned char* config = fConfigBytes; + if (fProfileAndLevelIndication == 0 || config == NULL) { + // We need to get this information from our framer source: + MPEG4VideoStreamFramer* framerSource = (MPEG4VideoStreamFramer*)fSource; + if (framerSource == NULL) return NULL; // we don't yet have a source + + fProfileAndLevelIndication = framerSource->profile_and_level_indication(); + if (fProfileAndLevelIndication == 0) return NULL; // our source isn't ready + + config = framerSource->getConfigBytes(configLength); + if (config == NULL) return NULL; // our source isn't ready + } + + char const* fmtpFmt = + "a=fmtp:%d " + "profile-level-id=%d;" + "config="; + unsigned fmtpFmtSize = strlen(fmtpFmt) + + 3 /* max char len */ + + 3 /* max char len */ + + 2*configLength /* 2*, because each byte prints as 2 chars */ + + 2 /* trailing \r\n */; + char* fmtp = new char[fmtpFmtSize]; + sprintf(fmtp, fmtpFmt, rtpPayloadType(), fProfileAndLevelIndication); + char* endPtr = &fmtp[strlen(fmtp)]; + for (unsigned i = 0; i < configLength; ++i) { + sprintf(endPtr, "%02X", config[i]); + endPtr += 2; + } + sprintf(endPtr, "\r\n"); + + delete[] fFmtpSDPLine; + fFmtpSDPLine = strDup(fmtp); + delete[] fmtp; + return fFmtpSDPLine; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MPEG4ESVideoRTPSource.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MPEG4ESVideoRTPSource.cpp new file mode 100644 index 000000000..a4474ff11 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MPEG4ESVideoRTPSource.cpp @@ -0,0 +1,65 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// MP4V-ES video RTP stream sources +// Implementation + +#include "MPEG4ESVideoRTPSource.hh" + +///////// MPEG4ESVideoRTPSource implementation //////// + +//##### NOTE: INCOMPLETE!!! ##### + +MPEG4ESVideoRTPSource* +MPEG4ESVideoRTPSource::createNew(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency) { + return new MPEG4ESVideoRTPSource(env, RTPgs, rtpPayloadFormat, + rtpTimestampFrequency); +} + +MPEG4ESVideoRTPSource +::MPEG4ESVideoRTPSource(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency) + : MultiFramedRTPSource(env, RTPgs, + rtpPayloadFormat, rtpTimestampFrequency) { +} + +MPEG4ESVideoRTPSource::~MPEG4ESVideoRTPSource() { +} + +Boolean MPEG4ESVideoRTPSource +::processSpecialHeader(BufferedPacket* packet, + unsigned& resultSpecialHeaderSize) { + // The packet begins a frame iff its data begins with a system code + // (i.e., 0x000001??) + fCurrentPacketBeginsFrame + = packet->dataSize() >= 4 && (packet->data())[0] == 0 + && (packet->data())[1] == 0 && (packet->data())[2] == 1; + + // The RTP "M" (marker) bit indicates the last fragment of a frame: + fCurrentPacketCompletesFrame = packet->rtpMarkerBit(); + + // There is no special header + resultSpecialHeaderSize = 0; + return True; +} + +char const* MPEG4ESVideoRTPSource::MIMEtype() const { + return "video/MP4V-ES"; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MPEG4GenericRTPSink.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MPEG4GenericRTPSink.cpp new file mode 100644 index 000000000..ce147ddb3 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MPEG4GenericRTPSink.cpp @@ -0,0 +1,142 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// MPEG4-GENERIC ("audio", "video", or "application") RTP stream sinks +// Implementation + +#include "MPEG4GenericRTPSink.hh" +#include "Locale.hh" +#include // needed on some systems to define "tolower()" + +MPEG4GenericRTPSink +::MPEG4GenericRTPSink(UsageEnvironment& env, Groupsock* RTPgs, + u_int8_t rtpPayloadFormat, + u_int32_t rtpTimestampFrequency, + char const* sdpMediaTypeString, + char const* mpeg4Mode, char const* configString, + unsigned numChannels) + : MultiFramedRTPSink(env, RTPgs, rtpPayloadFormat, + rtpTimestampFrequency, "MPEG4-GENERIC", numChannels), + fSDPMediaTypeString(strDup(sdpMediaTypeString)), + fMPEG4Mode(strDup(mpeg4Mode)), fConfigString(strDup(configString)) { + // Check whether "mpeg4Mode" is one that we handle: + if (mpeg4Mode == NULL) { + env << "MPEG4GenericRTPSink error: NULL \"mpeg4Mode\" parameter\n"; + } else { + // To ease comparison, convert "mpeg4Mode" to lower case: + size_t const len = strlen(mpeg4Mode) + 1; + char* m = new char[len]; + + Locale l("POSIX"); + for (size_t i = 0; i < len; ++i) m[i] = tolower(mpeg4Mode[i]); + + if (strcmp(m, "aac-hbr") != 0) { + env << "MPEG4GenericRTPSink error: Unknown \"mpeg4Mode\" parameter: \"" << mpeg4Mode << "\"\n"; + } + delete[] m; + } + + // Set up the "a=fmtp:" SDP line for this stream: + char const* fmtpFmt = + "a=fmtp:%d " + "streamtype=%d;profile-level-id=1;" + "mode=%s;sizelength=13;indexlength=3;indexdeltalength=3;" + "config=%s\r\n"; + unsigned fmtpFmtSize = strlen(fmtpFmt) + + 3 /* max char len */ + + 3 /* max char len */ + + strlen(fMPEG4Mode) + + strlen(fConfigString); + char* fmtp = new char[fmtpFmtSize]; + sprintf(fmtp, fmtpFmt, + rtpPayloadType(), + strcmp(fSDPMediaTypeString, "video") == 0 ? 4 : 5, + fMPEG4Mode, + fConfigString); + fFmtpSDPLine = strDup(fmtp); + delete[] fmtp; +} + +MPEG4GenericRTPSink::~MPEG4GenericRTPSink() { + delete[] fFmtpSDPLine; + delete[] (char*)fConfigString; + delete[] (char*)fMPEG4Mode; + delete[] (char*)fSDPMediaTypeString; +} + +MPEG4GenericRTPSink* +MPEG4GenericRTPSink::createNew(UsageEnvironment& env, Groupsock* RTPgs, + u_int8_t rtpPayloadFormat, + u_int32_t rtpTimestampFrequency, + char const* sdpMediaTypeString, + char const* mpeg4Mode, + char const* configString, unsigned numChannels) { + return new MPEG4GenericRTPSink(env, RTPgs, rtpPayloadFormat, + rtpTimestampFrequency, + sdpMediaTypeString, mpeg4Mode, + configString, numChannels); +} + +Boolean MPEG4GenericRTPSink +::frameCanAppearAfterPacketStart(unsigned char const* /*frameStart*/, + unsigned /*numBytesInFrame*/) const { + // (For now) allow at most 1 frame in a single packet: + return False; +} + +void MPEG4GenericRTPSink +::doSpecialFrameHandling(unsigned fragmentationOffset, + unsigned char* frameStart, + unsigned numBytesInFrame, + struct timeval framePresentationTime, + unsigned numRemainingBytes) { + // Set the "AU Header Section". This is 4 bytes: 2 bytes for the + // initial "AU-headers-length" field, and 2 bytes for the first + // (and only) "AU Header": + unsigned fullFrameSize + = fragmentationOffset + numBytesInFrame + numRemainingBytes; + unsigned char headers[4]; + headers[0] = 0; headers[1] = 16 /* bits */; // AU-headers-length + headers[2] = fullFrameSize >> 5; headers[3] = (fullFrameSize&0x1F)<<3; + + setSpecialHeaderBytes(headers, sizeof headers); + + if (numRemainingBytes == 0) { + // This packet contains the last (or only) fragment of the frame. + // Set the RTP 'M' ('marker') bit: + setMarkerBit(); + } + + // Important: Also call our base class's doSpecialFrameHandling(), + // to set the packet's timestamp: + MultiFramedRTPSink::doSpecialFrameHandling(fragmentationOffset, + frameStart, numBytesInFrame, + framePresentationTime, + numRemainingBytes); +} + +unsigned MPEG4GenericRTPSink::specialHeaderSize() const { + return 2 + 2; +} + +char const* MPEG4GenericRTPSink::sdpMediaType() const { + return fSDPMediaTypeString; +} + +char const* MPEG4GenericRTPSink::auxSDPLine() { + return fFmtpSDPLine; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MPEG4GenericRTPSource.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MPEG4GenericRTPSource.cpp new file mode 100644 index 000000000..a803d3f83 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MPEG4GenericRTPSource.cpp @@ -0,0 +1,234 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// MPEG4-GENERIC ("audio", "video", or "application") RTP stream sources +// Implementation + +#include "MPEG4GenericRTPSource.hh" +#include "BitVector.hh" +#include "MPEG4LATMAudioRTPSource.hh" // for parseGeneralConfigStr() + +////////// MPEG4GenericBufferedPacket and MPEG4GenericBufferedPacketFactory + +class MPEG4GenericBufferedPacket: public BufferedPacket { +public: + MPEG4GenericBufferedPacket(MPEG4GenericRTPSource* ourSource); + virtual ~MPEG4GenericBufferedPacket(); + +private: // redefined virtual functions + virtual unsigned nextEnclosedFrameSize(unsigned char*& framePtr, + unsigned dataSize); +private: + MPEG4GenericRTPSource* fOurSource; +}; + +class MPEG4GenericBufferedPacketFactory: public BufferedPacketFactory { +private: // redefined virtual functions + virtual BufferedPacket* createNewPacket(MultiFramedRTPSource* ourSource); +}; + + +////////// AUHeader ////////// +struct AUHeader { + unsigned size; + unsigned index; // indexDelta for the 2nd & subsequent headers +}; + + +///////// MPEG4GenericRTPSource implementation //////// + +//##### NOTE: INCOMPLETE!!! Support more modes, and interleaving ##### + +MPEG4GenericRTPSource* +MPEG4GenericRTPSource::createNew(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency, + char const* mediumName, + char const* mode, + unsigned sizeLength, unsigned indexLength, + unsigned indexDeltaLength + ) { + return new MPEG4GenericRTPSource(env, RTPgs, rtpPayloadFormat, + rtpTimestampFrequency, mediumName, + mode, sizeLength, indexLength, + indexDeltaLength + ); +} + +MPEG4GenericRTPSource +::MPEG4GenericRTPSource(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency, + char const* mediumName, + char const* mode, + unsigned sizeLength, unsigned indexLength, + unsigned indexDeltaLength + ) + : MultiFramedRTPSource(env, RTPgs, + rtpPayloadFormat, rtpTimestampFrequency, + new MPEG4GenericBufferedPacketFactory), + fSizeLength(sizeLength), fIndexLength(indexLength), + fIndexDeltaLength(indexDeltaLength), + fNumAUHeaders(0), fNextAUHeader(0), fAUHeaders(NULL) { + unsigned mimeTypeLength = + strlen(mediumName) + 14 /* strlen("/MPEG4-GENERIC") */ + 1; + fMIMEType = new char[mimeTypeLength]; + if (fMIMEType != NULL) { + sprintf(fMIMEType, "%s/MPEG4-GENERIC", mediumName); + } + + fMode = strDup(mode); + // Check for a "mode" that we don't yet support: //##### + if (mode == NULL || + (strcmp(mode, "aac-hbr") != 0 && strcmp(mode, "generic") != 0)) { + envir() << "MPEG4GenericRTPSource Warning: Unknown or unsupported \"mode\": " + << mode << "\n"; + } +} + +MPEG4GenericRTPSource::~MPEG4GenericRTPSource() { + delete[] fAUHeaders; + delete[] fMode; + delete[] fMIMEType; +} + +Boolean MPEG4GenericRTPSource +::processSpecialHeader(BufferedPacket* packet, + unsigned& resultSpecialHeaderSize) { + unsigned char* headerStart = packet->data(); + unsigned packetSize = packet->dataSize(); + + fCurrentPacketBeginsFrame = fCurrentPacketCompletesFrame; + // whether the *previous* packet ended a frame + + // The RTP "M" (marker) bit indicates the last fragment of a frame: + fCurrentPacketCompletesFrame = packet->rtpMarkerBit(); + + // default values: + resultSpecialHeaderSize = 0; + fNumAUHeaders = 0; + fNextAUHeader = 0; + delete[] fAUHeaders; fAUHeaders = NULL; + + if (fSizeLength > 0) { + // The packet begins with a "AU Header Section". Parse it, to + // determine the "AU-header"s for each frame present in this packet: + resultSpecialHeaderSize += 2; + if (packetSize < resultSpecialHeaderSize) return False; + + unsigned AU_headers_length = (headerStart[0]<<8)|headerStart[1]; + unsigned AU_headers_length_bytes = (AU_headers_length+7)/8; + if (packetSize + < resultSpecialHeaderSize + AU_headers_length_bytes) return False; + resultSpecialHeaderSize += AU_headers_length_bytes; + + // Figure out how many AU-headers are present in the packet: + int bitsAvail = AU_headers_length - (fSizeLength + fIndexLength); + if (bitsAvail >= 0 && (fSizeLength + fIndexDeltaLength) > 0) { + fNumAUHeaders = 1 + bitsAvail/(fSizeLength + fIndexDeltaLength); + } + if (fNumAUHeaders > 0) { + fAUHeaders = new AUHeader[fNumAUHeaders]; + // Fill in each header: + BitVector bv(&headerStart[2], 0, AU_headers_length); + fAUHeaders[0].size = bv.getBits(fSizeLength); + fAUHeaders[0].index = bv.getBits(fIndexLength); + + for (unsigned i = 1; i < fNumAUHeaders; ++i) { + fAUHeaders[i].size = bv.getBits(fSizeLength); + fAUHeaders[i].index = bv.getBits(fIndexDeltaLength); + } + } + + } + + return True; +} + +char const* MPEG4GenericRTPSource::MIMEtype() const { + return fMIMEType; +} + + +////////// MPEG4GenericBufferedPacket +////////// and MPEG4GenericBufferedPacketFactory implementation + +MPEG4GenericBufferedPacket +::MPEG4GenericBufferedPacket(MPEG4GenericRTPSource* ourSource) + : fOurSource(ourSource) { +} + +MPEG4GenericBufferedPacket::~MPEG4GenericBufferedPacket() { +} + +unsigned MPEG4GenericBufferedPacket +::nextEnclosedFrameSize(unsigned char*& /*framePtr*/, unsigned dataSize) { + // WE CURRENTLY DON'T IMPLEMENT INTERLEAVING. FIX THIS! ##### + AUHeader* auHeader = fOurSource->fAUHeaders; + if (auHeader == NULL) return dataSize; + unsigned numAUHeaders = fOurSource->fNumAUHeaders; + + if (fOurSource->fNextAUHeader >= numAUHeaders) { + fOurSource->envir() << "MPEG4GenericBufferedPacket::nextEnclosedFrameSize(" + << dataSize << "): data error (" + << auHeader << "," << fOurSource->fNextAUHeader + << "," << numAUHeaders << ")!\n"; + return dataSize; + } + + auHeader = &auHeader[fOurSource->fNextAUHeader++]; + return auHeader->size <= dataSize ? auHeader->size : dataSize; +} + +BufferedPacket* MPEG4GenericBufferedPacketFactory +::createNewPacket(MultiFramedRTPSource* ourSource) { + return new MPEG4GenericBufferedPacket((MPEG4GenericRTPSource*)ourSource); +} + + +////////// samplingFrequencyFromAudioSpecificConfig() implementation ////////// + +static unsigned const samplingFrequencyFromIndex[16] = { + 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, + 16000, 12000, 11025, 8000, 7350, 0, 0, 0 +}; + +unsigned samplingFrequencyFromAudioSpecificConfig(char const* configStr) { + unsigned char* config = NULL; + unsigned result = 0; // if returned, indicates an error + + do { + // Begin by parsing the config string: + unsigned configSize; + config = parseGeneralConfigStr(configStr, configSize); + if (config == NULL) break; + + if (configSize < 2) break; + unsigned char samplingFrequencyIndex = ((config[0]&0x07)<<1) | (config[1]>>7); + if (samplingFrequencyIndex < 15) { + result = samplingFrequencyFromIndex[samplingFrequencyIndex]; + break; + } + + // Index == 15 means that the actual frequency is next (24 bits): + if (configSize < 5) break; + result = ((config[1]&0x7F)<<17) | (config[2]<<9) | (config[3]<<1) | (config[4]>>7); + } while (0); + + delete[] config; + return result; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MPEG4LATMAudioRTPSink.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MPEG4LATMAudioRTPSink.cpp new file mode 100644 index 000000000..d445b6ce2 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MPEG4LATMAudioRTPSink.cpp @@ -0,0 +1,95 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP sink for MPEG-4 audio, using LATM multiplexing (RFC 3016) +// Implementation + +#include "MPEG4LATMAudioRTPSink.hh" + +MPEG4LATMAudioRTPSink +::MPEG4LATMAudioRTPSink(UsageEnvironment& env, Groupsock* RTPgs, + u_int8_t rtpPayloadFormat, + u_int32_t rtpTimestampFrequency, + char const* streamMuxConfigString, + unsigned numChannels, + Boolean allowMultipleFramesPerPacket) + : AudioRTPSink(env, RTPgs, rtpPayloadFormat, + rtpTimestampFrequency, "MP4A-LATM", numChannels), + fStreamMuxConfigString(strDup(streamMuxConfigString)), + fAllowMultipleFramesPerPacket(allowMultipleFramesPerPacket) { + // Set up the "a=fmtp:" SDP line for this stream: + char const* fmtpFmt = + "a=fmtp:%d " + "cpresent=0;config=%s\r\n"; + unsigned fmtpFmtSize = strlen(fmtpFmt) + + 3 /* max char len */ + + strlen(fStreamMuxConfigString); + char* fmtp = new char[fmtpFmtSize]; + sprintf(fmtp, fmtpFmt, + rtpPayloadType(), + fStreamMuxConfigString); + fFmtpSDPLine = strDup(fmtp); + delete[] fmtp; +} + +MPEG4LATMAudioRTPSink::~MPEG4LATMAudioRTPSink() { + delete[] fFmtpSDPLine; + delete[] (char*)fStreamMuxConfigString; +} + +MPEG4LATMAudioRTPSink* +MPEG4LATMAudioRTPSink::createNew(UsageEnvironment& env, Groupsock* RTPgs, + u_int8_t rtpPayloadFormat, + u_int32_t rtpTimestampFrequency, + char const* streamMuxConfigString, + unsigned numChannels, + Boolean allowMultipleFramesPerPacket) { + return new MPEG4LATMAudioRTPSink(env, RTPgs, rtpPayloadFormat, + rtpTimestampFrequency, streamMuxConfigString, + numChannels, + allowMultipleFramesPerPacket); +} + +Boolean MPEG4LATMAudioRTPSink +::frameCanAppearAfterPacketStart(unsigned char const* /*frameStart*/, + unsigned /*numBytesInFrame*/) const { + return fAllowMultipleFramesPerPacket; +} + +void MPEG4LATMAudioRTPSink +::doSpecialFrameHandling(unsigned fragmentationOffset, + unsigned char* frameStart, + unsigned numBytesInFrame, + struct timeval framePresentationTime, + unsigned numRemainingBytes) { + if (numRemainingBytes == 0) { + // This packet contains the last (or only) fragment of the frame. + // Set the RTP 'M' ('marker') bit: + setMarkerBit(); + } + + // Important: Also call our base class's doSpecialFrameHandling(), + // to set the packet's timestamp: + MultiFramedRTPSink::doSpecialFrameHandling(fragmentationOffset, + frameStart, numBytesInFrame, + framePresentationTime, + numRemainingBytes); +} + +char const* MPEG4LATMAudioRTPSink::auxSDPLine() { + return fFmtpSDPLine; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MPEG4LATMAudioRTPSource.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MPEG4LATMAudioRTPSource.cpp new file mode 100644 index 000000000..0d7f2f567 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MPEG4LATMAudioRTPSource.cpp @@ -0,0 +1,264 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// MPEG-4 audio, using LATM multiplexing +// Implementation + +#include "MPEG4LATMAudioRTPSource.hh" + +////////// LATMBufferedPacket and LATMBufferedPacketFactory ////////// + +class LATMBufferedPacket: public BufferedPacket { +public: + LATMBufferedPacket(Boolean includeLATMDataLengthField); + virtual ~LATMBufferedPacket(); + +private: // redefined virtual functions + virtual unsigned nextEnclosedFrameSize(unsigned char*& framePtr, + unsigned dataSize); + +private: + Boolean fIncludeLATMDataLengthField; +}; + +class LATMBufferedPacketFactory: public BufferedPacketFactory { +private: // redefined virtual functions + virtual BufferedPacket* createNewPacket(MultiFramedRTPSource* ourSource); +}; + +///////// MPEG4LATMAudioRTPSource implementation //////// + +MPEG4LATMAudioRTPSource* +MPEG4LATMAudioRTPSource::createNew(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency) { + return new MPEG4LATMAudioRTPSource(env, RTPgs, rtpPayloadFormat, + rtpTimestampFrequency); +} + +MPEG4LATMAudioRTPSource +::MPEG4LATMAudioRTPSource(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency) + : MultiFramedRTPSource(env, RTPgs, + rtpPayloadFormat, rtpTimestampFrequency, + new LATMBufferedPacketFactory), + fIncludeLATMDataLengthField(True) { +} + +MPEG4LATMAudioRTPSource::~MPEG4LATMAudioRTPSource() { +} + +void MPEG4LATMAudioRTPSource::omitLATMDataLengthField() { + fIncludeLATMDataLengthField = False; +} + +Boolean MPEG4LATMAudioRTPSource +::processSpecialHeader(BufferedPacket* packet, + unsigned& resultSpecialHeaderSize) { + fCurrentPacketBeginsFrame = fCurrentPacketCompletesFrame; + // whether the *previous* packet ended a frame + + // The RTP "M" (marker) bit indicates the last fragment of a frame: + fCurrentPacketCompletesFrame = packet->rtpMarkerBit(); + + // There is no special header + resultSpecialHeaderSize = 0; + return True; +} + +char const* MPEG4LATMAudioRTPSource::MIMEtype() const { + return "audio/MP4A-LATM"; +} + + +////////// LATMBufferedPacket and LATMBufferedPacketFactory implementation + +LATMBufferedPacket::LATMBufferedPacket(Boolean includeLATMDataLengthField) + : fIncludeLATMDataLengthField(includeLATMDataLengthField) { +} + +LATMBufferedPacket::~LATMBufferedPacket() { +} + +unsigned LATMBufferedPacket +::nextEnclosedFrameSize(unsigned char*& framePtr, unsigned dataSize) { + // Look at the LATM data length byte(s), to determine the size + // of the LATM payload. + unsigned resultFrameSize = 0; + unsigned i; + for (i = 0; i < dataSize; ++i) { + resultFrameSize += framePtr[i]; + if (framePtr[i] != 0xFF) break; + } + ++i; + if (fIncludeLATMDataLengthField) { + resultFrameSize += i; + } else { + framePtr += i; + dataSize -= i; + } + + return (resultFrameSize <= dataSize) ? resultFrameSize : dataSize; +} + +BufferedPacket* LATMBufferedPacketFactory +::createNewPacket(MultiFramedRTPSource* ourSource) { + MPEG4LATMAudioRTPSource* source = (MPEG4LATMAudioRTPSource*)ourSource; + return new LATMBufferedPacket(source->returnedFrameIncludesLATMDataLengthField()); +} + + +////////// parseStreamMuxConfigStr() implementation ////////// + +static Boolean getNibble(char const*& configStr, + unsigned char& resultNibble) { + char c = configStr[0]; + if (c == '\0') return False; // we've reached the end + + if (c >= '0' && c <= '9') { + resultNibble = c - '0'; + } else if (c >= 'A' && c <= 'F') { + resultNibble = 10 + c - 'A'; + } else if (c >= 'a' && c <= 'f') { + resultNibble = 10 + c - 'a'; + } else { + return False; + } + + ++configStr; // move to the next nibble + return True; +} + +static Boolean getByte(char const*& configStr, unsigned char& resultByte) { + resultByte = 0; // by default, in case parsing fails + + unsigned char firstNibble; + if (!getNibble(configStr, firstNibble)) return False; + resultByte = firstNibble<<4; + + unsigned char secondNibble = 0; + if (!getNibble(configStr, secondNibble) && configStr[0] != '\0') { + // There's a second nibble, but it's malformed + return False; + } + resultByte |= secondNibble; + + return True; +} + +Boolean +parseStreamMuxConfigStr(char const* configStr, + // result parameters: + Boolean& audioMuxVersion, + Boolean& allStreamsSameTimeFraming, + unsigned char& numSubFrames, + unsigned char& numProgram, + unsigned char& numLayer, + unsigned char*& audioSpecificConfig, + unsigned& audioSpecificConfigSize) { + // Set default versions of the result parameters: + audioMuxVersion = False; + allStreamsSameTimeFraming = True; + numSubFrames = numProgram = numLayer = 0; + audioSpecificConfig = NULL; + audioSpecificConfigSize = 0; + + do { + if (configStr == NULL) break; + + unsigned char nextByte; + + if (!getByte(configStr, nextByte)) break; + audioMuxVersion = (nextByte&0x80) != 0; + if (audioMuxVersion) break; + + allStreamsSameTimeFraming = ((nextByte&0x40)>>6) != 0; + numSubFrames = (nextByte&0x3F); + + if (!getByte(configStr, nextByte)) break; + numProgram = (nextByte&0xF0)>>4; + + numLayer = (nextByte&0x0E)>>1; + + // The one remaining bit, and the rest of the string, + // are used for "audioSpecificConfig": + unsigned char remainingBit = nextByte&1; + + unsigned ascSize = (strlen(configStr)+1)/2 + 1; + audioSpecificConfig = new unsigned char[ascSize]; + + Boolean parseSuccess; + unsigned i = 0; + do { + nextByte = 0; + parseSuccess = getByte(configStr, nextByte); + audioSpecificConfig[i++] = (remainingBit<<7)|((nextByte&0xFE)>>1); + remainingBit = nextByte&1; + } while (parseSuccess); + if (i != ascSize) break; // part of the remaining string was bad + + audioSpecificConfigSize = ascSize; + return True; // parsing succeeded + } while (0); + + delete[] audioSpecificConfig; + return False; // parsing failed +} + +unsigned char* parseStreamMuxConfigStr(char const* configStr, + // result parameter: + unsigned& audioSpecificConfigSize) { + Boolean audioMuxVersion, allStreamsSameTimeFraming; + unsigned char numSubFrames, numProgram, numLayer; + unsigned char* audioSpecificConfig; + + if (!parseStreamMuxConfigStr(configStr, + audioMuxVersion, allStreamsSameTimeFraming, + numSubFrames, numProgram, numLayer, + audioSpecificConfig, audioSpecificConfigSize)) { + audioSpecificConfigSize = 0; + return NULL; + } + + return audioSpecificConfig; +} + +unsigned char* parseGeneralConfigStr(char const* configStr, + // result parameter: + unsigned& configSize) { + unsigned char* config = NULL; + do { + if (configStr == NULL) break; + configSize = (strlen(configStr)+1)/2; + + config = new unsigned char[configSize]; + if (config == NULL) break; + + unsigned i; + for (i = 0; i < configSize; ++i) { + if (!getByte(configStr, config[i])) break; + } + if (i != configSize) break; // part of the string was bad + + return config; + } while (0); + + configSize = 0; + delete[] config; + return NULL; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MPEG4VideoFileServerMediaSubsession.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MPEG4VideoFileServerMediaSubsession.cpp new file mode 100644 index 000000000..a7401ac9b --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MPEG4VideoFileServerMediaSubsession.cpp @@ -0,0 +1,126 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A 'ServerMediaSubsession' object that creates new, unicast, "RTPSink"s +// on demand, from a MPEG-4 video file. +// Implementation + +#include "MPEG4VideoFileServerMediaSubsession.hh" +#include "MPEG4ESVideoRTPSink.hh" +#include "ByteStreamFileSource.hh" +#include "MPEG4VideoStreamFramer.hh" + +MPEG4VideoFileServerMediaSubsession* +MPEG4VideoFileServerMediaSubsession::createNew(UsageEnvironment& env, + char const* fileName, + Boolean reuseFirstSource) { + return new MPEG4VideoFileServerMediaSubsession(env, fileName, reuseFirstSource); +} + +MPEG4VideoFileServerMediaSubsession +::MPEG4VideoFileServerMediaSubsession(UsageEnvironment& env, + char const* fileName, Boolean reuseFirstSource) + : FileServerMediaSubsession(env, fileName, reuseFirstSource), + fAuxSDPLine(NULL), fDoneFlag(0), fDummyRTPSink(NULL) { +} + +MPEG4VideoFileServerMediaSubsession::~MPEG4VideoFileServerMediaSubsession() { + delete[] fAuxSDPLine; +} + +static void afterPlayingDummy(void* clientData) { + MPEG4VideoFileServerMediaSubsession* subsess + = (MPEG4VideoFileServerMediaSubsession*)clientData; + subsess->afterPlayingDummy1(); +} + +void MPEG4VideoFileServerMediaSubsession::afterPlayingDummy1() { + // Unschedule any pending 'checking' task: + envir().taskScheduler().unscheduleDelayedTask(nextTask()); + // Signal the event loop that we're done: + setDoneFlag(); +} + +static void checkForAuxSDPLine(void* clientData) { + MPEG4VideoFileServerMediaSubsession* subsess + = (MPEG4VideoFileServerMediaSubsession*)clientData; + subsess->checkForAuxSDPLine1(); +} + +void MPEG4VideoFileServerMediaSubsession::checkForAuxSDPLine1() { + nextTask() = NULL; + + char const* dasl; + if (fAuxSDPLine != NULL) { + // Signal the event loop that we're done: + setDoneFlag(); + } else if (fDummyRTPSink != NULL && (dasl = fDummyRTPSink->auxSDPLine()) != NULL) { + fAuxSDPLine= strDup(dasl); + fDummyRTPSink = NULL; + + // Signal the event loop that we're done: + setDoneFlag(); + } else if (!fDoneFlag) { + // try again after a brief delay: + int uSecsToDelay = 100000; // 100 ms + nextTask() = envir().taskScheduler().scheduleDelayedTask(uSecsToDelay, + (TaskFunc*)checkForAuxSDPLine, this); + } +} + +char const* MPEG4VideoFileServerMediaSubsession::getAuxSDPLine(RTPSink* rtpSink, FramedSource* inputSource) { + if (fAuxSDPLine != NULL) return fAuxSDPLine; // it's already been set up (for a previous client) + + if (fDummyRTPSink == NULL) { // we're not already setting it up for another, concurrent stream + // Note: For MPEG-4 video files, the 'config' information isn't known + // until we start reading the file. This means that "rtpSink"s + // "auxSDPLine()" will be NULL initially, and we need to start reading data from our file until this changes. + fDummyRTPSink = rtpSink; + + // Start reading the file: + fDummyRTPSink->startPlaying(*inputSource, afterPlayingDummy, this); + + // Check whether the sink's 'auxSDPLine()' is ready: + checkForAuxSDPLine(this); + } + + envir().taskScheduler().doEventLoop(&fDoneFlag); + + return fAuxSDPLine; +} + +FramedSource* MPEG4VideoFileServerMediaSubsession +::createNewStreamSource(unsigned /*clientSessionId*/, unsigned& estBitrate) { + estBitrate = 500; // kbps, estimate + + // Create the video source: + ByteStreamFileSource* fileSource + = ByteStreamFileSource::createNew(envir(), fFileName); + if (fileSource == NULL) return NULL; + fFileSize = fileSource->fileSize(); + + // Create a framer for the Video Elementary Stream: + return MPEG4VideoStreamFramer::createNew(envir(), fileSource); +} + +RTPSink* MPEG4VideoFileServerMediaSubsession +::createNewRTPSink(Groupsock* rtpGroupsock, + unsigned char rtpPayloadTypeIfDynamic, + FramedSource* /*inputSource*/) { + return MPEG4ESVideoRTPSink::createNew(envir(), rtpGroupsock, + rtpPayloadTypeIfDynamic); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MPEG4VideoStreamDiscreteFramer.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MPEG4VideoStreamDiscreteFramer.cpp new file mode 100644 index 000000000..d8200a904 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MPEG4VideoStreamDiscreteFramer.cpp @@ -0,0 +1,252 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A simplified version of "MPEG4VideoStreamFramer" that takes only complete, +// discrete frames (rather than an arbitrary byte stream) as input. +// This avoids the parsing and data copying overhead of the full +// "MPEG4VideoStreamFramer". +// Implementation + +#include "MPEG4VideoStreamDiscreteFramer.hh" + +MPEG4VideoStreamDiscreteFramer* +MPEG4VideoStreamDiscreteFramer::createNew(UsageEnvironment& env, + FramedSource* inputSource, Boolean leavePresentationTimesUnmodified) { + // Need to add source type checking here??? ##### + return new MPEG4VideoStreamDiscreteFramer(env, inputSource, leavePresentationTimesUnmodified); +} + +MPEG4VideoStreamDiscreteFramer +::MPEG4VideoStreamDiscreteFramer(UsageEnvironment& env, + FramedSource* inputSource, Boolean leavePresentationTimesUnmodified) + : MPEG4VideoStreamFramer(env, inputSource, False/*don't create a parser*/), + fLeavePresentationTimesUnmodified(leavePresentationTimesUnmodified), vop_time_increment_resolution(0), fNumVTIRBits(0), + fLastNonBFrameVop_time_increment(0) { + fLastNonBFramePresentationTime.tv_sec = 0; + fLastNonBFramePresentationTime.tv_usec = 0; +} + +MPEG4VideoStreamDiscreteFramer::~MPEG4VideoStreamDiscreteFramer() { +} + +void MPEG4VideoStreamDiscreteFramer::doGetNextFrame() { + // Arrange to read data (which should be a complete MPEG-4 video frame) + // from our data source, directly into the client's input buffer. + // After reading this, we'll do some parsing on the frame. + fInputSource->getNextFrame(fTo, fMaxSize, + afterGettingFrame, this, + FramedSource::handleClosure, this); +} + +void MPEG4VideoStreamDiscreteFramer +::afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds) { + MPEG4VideoStreamDiscreteFramer* source = (MPEG4VideoStreamDiscreteFramer*)clientData; + source->afterGettingFrame1(frameSize, numTruncatedBytes, + presentationTime, durationInMicroseconds); +} + +void MPEG4VideoStreamDiscreteFramer +::afterGettingFrame1(unsigned frameSize, unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds) { + // Check that the first 4 bytes are a system code: + if (frameSize >= 4 && fTo[0] == 0 && fTo[1] == 0 && fTo[2] == 1) { + fPictureEndMarker = True; // Assume that we have a complete 'picture' here + unsigned i = 3; + if (fTo[i] == 0xB0) { // VISUAL_OBJECT_SEQUENCE_START_CODE + // The next byte is the "profile_and_level_indication": + if (frameSize >= 5) fProfileAndLevelIndication = fTo[4]; + + // The start of this frame - up to the first GROUP_VOP_START_CODE + // or VOP_START_CODE - is stream configuration information. Save this: + for (i = 7; i < frameSize; ++i) { + if ((fTo[i] == 0xB3 /*GROUP_VOP_START_CODE*/ || + fTo[i] == 0xB6 /*VOP_START_CODE*/) + && fTo[i-1] == 1 && fTo[i-2] == 0 && fTo[i-3] == 0) { + break; // The configuration information ends here + } + } + fNumConfigBytes = i < frameSize ? i-3 : frameSize; + delete[] fConfigBytes; fConfigBytes = new unsigned char[fNumConfigBytes]; + for (unsigned j = 0; j < fNumConfigBytes; ++j) fConfigBytes[j] = fTo[j]; + + // This information (should) also contain a VOL header, which we need + // to analyze, to get "vop_time_increment_resolution" (which we need + // - along with "vop_time_increment" - in order to generate accurate + // presentation times for "B" frames). + analyzeVOLHeader(); + } + + if (i < frameSize) { + u_int8_t nextCode = fTo[i]; + + if (nextCode == 0xB3 /*GROUP_VOP_START_CODE*/) { + // Skip to the following VOP_START_CODE (if any): + for (i += 4; i < frameSize; ++i) { + if (fTo[i] == 0xB6 /*VOP_START_CODE*/ + && fTo[i-1] == 1 && fTo[i-2] == 0 && fTo[i-3] == 0) { + nextCode = fTo[i]; + break; + } + } + } + + if (nextCode == 0xB6 /*VOP_START_CODE*/ && i+5 < frameSize) { + ++i; + + // Get the "vop_coding_type" from the next byte: + u_int8_t nextByte = fTo[i++]; + u_int8_t vop_coding_type = nextByte>>6; + + // Next, get the "modulo_time_base" by counting the '1' bits that + // follow. We look at the next 32-bits only. + // This should be enough in most cases. + u_int32_t next4Bytes + = (fTo[i]<<24)|(fTo[i+1]<<16)|(fTo[i+2]<<8)|fTo[i+3]; + i += 4; + u_int32_t timeInfo = (nextByte<<(32-6))|(next4Bytes>>6); + unsigned modulo_time_base = 0; + u_int32_t mask = 0x80000000; + while ((timeInfo&mask) != 0) { + ++modulo_time_base; + mask >>= 1; + } + mask >>= 2; + + // Then, get the "vop_time_increment". + unsigned vop_time_increment = 0; + // First, make sure we have enough bits left for this: + if ((mask>>(fNumVTIRBits-1)) != 0) { + for (unsigned i = 0; i < fNumVTIRBits; ++i) { + vop_time_increment |= timeInfo&mask; + mask >>= 1; + } + while (mask != 0) { + vop_time_increment >>= 1; + mask >>= 1; + } + } + + // If this is a "B" frame, then we have to tweak "presentationTime": + if (!fLeavePresentationTimesUnmodified && vop_coding_type == 2/*B*/ + && (fLastNonBFramePresentationTime.tv_usec > 0 || + fLastNonBFramePresentationTime.tv_sec > 0)) { + int timeIncrement + = fLastNonBFrameVop_time_increment - vop_time_increment; + if (timeIncrement<0) timeIncrement += vop_time_increment_resolution; + unsigned const MILLION = 1000000; + double usIncrement = vop_time_increment_resolution == 0 ? 0.0 + : ((double)timeIncrement*MILLION)/vop_time_increment_resolution; + unsigned secondsToSubtract = (unsigned)(usIncrement/MILLION); + unsigned uSecondsToSubtract = ((unsigned)usIncrement)%MILLION; + + presentationTime = fLastNonBFramePresentationTime; + if ((unsigned)presentationTime.tv_usec < uSecondsToSubtract) { + presentationTime.tv_usec += MILLION; + if (presentationTime.tv_sec > 0) --presentationTime.tv_sec; + } + presentationTime.tv_usec -= uSecondsToSubtract; + if ((unsigned)presentationTime.tv_sec > secondsToSubtract) { + presentationTime.tv_sec -= secondsToSubtract; + } else { + presentationTime.tv_sec = presentationTime.tv_usec = 0; + } + } else { + fLastNonBFramePresentationTime = presentationTime; + fLastNonBFrameVop_time_increment = vop_time_increment; + } + } + } + } + + // Complete delivery to the client: + fFrameSize = frameSize; + fNumTruncatedBytes = numTruncatedBytes; + fPresentationTime = presentationTime; + fDurationInMicroseconds = durationInMicroseconds; + afterGetting(this); +} + +Boolean MPEG4VideoStreamDiscreteFramer::getNextFrameBit(u_int8_t& result) { + if (fNumBitsSeenSoFar/8 >= fNumConfigBytes) return False; + + u_int8_t nextByte = fConfigBytes[fNumBitsSeenSoFar/8]; + result = (nextByte>>(7-fNumBitsSeenSoFar%8))&1; + ++fNumBitsSeenSoFar; + return True; +} + +Boolean MPEG4VideoStreamDiscreteFramer::getNextFrameBits(unsigned numBits, + u_int32_t& result) { + result = 0; + for (unsigned i = 0; i < numBits; ++i) { + u_int8_t nextBit; + if (!getNextFrameBit(nextBit)) return False; + result = (result<<1)|nextBit; + } + return True; +} + +void MPEG4VideoStreamDiscreteFramer::analyzeVOLHeader() { + // Begin by moving to the VOL header: + unsigned i; + for (i = 3; i < fNumConfigBytes; ++i) { + if (fConfigBytes[i] >= 0x20 && fConfigBytes[i] <= 0x2F + && fConfigBytes[i-1] == 1 + && fConfigBytes[i-2] == 0 && fConfigBytes[i-3] == 0) { + ++i; + break; + } + } + + fNumBitsSeenSoFar = 8*i + 9; + do { + u_int8_t is_object_layer_identifier; + if (!getNextFrameBit(is_object_layer_identifier)) break; + if (is_object_layer_identifier) fNumBitsSeenSoFar += 7; + + u_int32_t aspect_ratio_info; + if (!getNextFrameBits(4, aspect_ratio_info)) break; + if (aspect_ratio_info == 15 /*extended_PAR*/) fNumBitsSeenSoFar += 16; + + u_int8_t vol_control_parameters; + if (!getNextFrameBit(vol_control_parameters)) break; + if (vol_control_parameters) { + fNumBitsSeenSoFar += 3; // chroma_format; low_delay + u_int8_t vbw_parameters; + if (!getNextFrameBit(vbw_parameters)) break; + if (vbw_parameters) fNumBitsSeenSoFar += 79; + } + + fNumBitsSeenSoFar += 2; // video_object_layer_shape + u_int8_t marker_bit; + if (!getNextFrameBit(marker_bit)) break; + if (marker_bit != 1) break; // sanity check + + if (!getNextFrameBits(16, vop_time_increment_resolution)) break; + if (vop_time_increment_resolution == 0) break; // shouldn't happen + + // Compute how many bits are necessary to represent this: + fNumVTIRBits = 0; + for (unsigned test = vop_time_increment_resolution; test>0; test /= 2) { + ++fNumVTIRBits; + } + } while (0); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MPEG4VideoStreamFramer.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MPEG4VideoStreamFramer.cpp new file mode 100644 index 000000000..cef915993 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MPEG4VideoStreamFramer.cpp @@ -0,0 +1,681 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A filter that breaks up an MPEG-4 video elementary stream into +// frames for: +// - Visual Object Sequence (VS) Header + Visual Object (VO) Header +// + Video Object Layer (VOL) Header +// - Group of VOP (GOV) Header +// - VOP frame +// Implementation + +#include "MPEG4VideoStreamFramer.hh" +#include "MPEGVideoStreamParser.hh" +#include "MPEG4LATMAudioRTPSource.hh" // for "parseGeneralConfigStr()" +#include + +////////// MPEG4VideoStreamParser definition ////////// + +// An enum representing the current state of the parser: +enum MPEGParseState { + PARSING_VISUAL_OBJECT_SEQUENCE, + PARSING_VISUAL_OBJECT_SEQUENCE_SEEN_CODE, + PARSING_VISUAL_OBJECT, + PARSING_VIDEO_OBJECT_LAYER, + PARSING_GROUP_OF_VIDEO_OBJECT_PLANE, + PARSING_VIDEO_OBJECT_PLANE, + PARSING_VISUAL_OBJECT_SEQUENCE_END_CODE +}; + +class MPEG4VideoStreamParser: public MPEGVideoStreamParser { +public: + MPEG4VideoStreamParser(MPEG4VideoStreamFramer* usingSource, + FramedSource* inputSource); + virtual ~MPEG4VideoStreamParser(); + +private: // redefined virtual functions: + virtual void flushInput(); + virtual unsigned parse(); + +private: + MPEG4VideoStreamFramer* usingSource() { + return (MPEG4VideoStreamFramer*)fUsingSource; + } + void setParseState(MPEGParseState parseState); + + unsigned parseVisualObjectSequence(Boolean haveSeenStartCode = False); + unsigned parseVisualObject(); + unsigned parseVideoObjectLayer(); + unsigned parseGroupOfVideoObjectPlane(); + unsigned parseVideoObjectPlane(); + unsigned parseVisualObjectSequenceEndCode(); + + // These are used for parsing within an already-read frame: + Boolean getNextFrameBit(u_int8_t& result); + Boolean getNextFrameBits(unsigned numBits, u_int32_t& result); + + // Which are used by: + void analyzeVOLHeader(); + +private: + MPEGParseState fCurrentParseState; + unsigned fNumBitsSeenSoFar; // used by the getNextFrameBit*() routines + u_int32_t vop_time_increment_resolution; + unsigned fNumVTIRBits; + // # of bits needed to count to "vop_time_increment_resolution" + u_int8_t fixed_vop_rate; + unsigned fixed_vop_time_increment; // used if 'fixed_vop_rate' is set + unsigned fSecondsSinceLastTimeCode, fTotalTicksSinceLastTimeCode, fPrevNewTotalTicks; + unsigned fPrevPictureCountDelta; + Boolean fJustSawTimeCode; +}; + + +////////// MPEG4VideoStreamFramer implementation ////////// + +MPEG4VideoStreamFramer* +MPEG4VideoStreamFramer::createNew(UsageEnvironment& env, + FramedSource* inputSource) { + // Need to add source type checking here??? ##### + return new MPEG4VideoStreamFramer(env, inputSource); +} + +unsigned char* MPEG4VideoStreamFramer +::getConfigBytes(unsigned& numBytes) const { + numBytes = fNumConfigBytes; + return fConfigBytes; +} + +void MPEG4VideoStreamFramer +::setConfigInfo(u_int8_t profileAndLevelIndication, char const* configStr) { + fProfileAndLevelIndication = profileAndLevelIndication; + + delete[] fConfigBytes; + fConfigBytes = parseGeneralConfigStr(configStr, fNumConfigBytes); +} + +MPEG4VideoStreamFramer::MPEG4VideoStreamFramer(UsageEnvironment& env, + FramedSource* inputSource, + Boolean createParser) + : MPEGVideoStreamFramer(env, inputSource), + fProfileAndLevelIndication(0), + fConfigBytes(NULL), fNumConfigBytes(0), + fNewConfigBytes(NULL), fNumNewConfigBytes(0) { + fParser = createParser + ? new MPEG4VideoStreamParser(this, inputSource) + : NULL; +} + +MPEG4VideoStreamFramer::~MPEG4VideoStreamFramer() { + delete[] fConfigBytes; delete[] fNewConfigBytes; +} + +void MPEG4VideoStreamFramer::startNewConfig() { + delete[] fNewConfigBytes; fNewConfigBytes = NULL; + fNumNewConfigBytes = 0; +} + +void MPEG4VideoStreamFramer +::appendToNewConfig(unsigned char* newConfigBytes, unsigned numNewBytes) { + // Allocate a new block of memory for the new config bytes: + unsigned char* configNew + = new unsigned char[fNumNewConfigBytes + numNewBytes]; + + // Copy the old, then the new, config bytes there: + memmove(configNew, fNewConfigBytes, fNumNewConfigBytes); + memmove(&configNew[fNumNewConfigBytes], newConfigBytes, numNewBytes); + + delete[] fNewConfigBytes; fNewConfigBytes = configNew; + fNumNewConfigBytes += numNewBytes; +} + +void MPEG4VideoStreamFramer::completeNewConfig() { + delete[] fConfigBytes; fConfigBytes = fNewConfigBytes; + fNewConfigBytes = NULL; + fNumConfigBytes = fNumNewConfigBytes; + fNumNewConfigBytes = 0; +} + +Boolean MPEG4VideoStreamFramer::isMPEG4VideoStreamFramer() const { + return True; +} + +////////// MPEG4VideoStreamParser implementation ////////// + +MPEG4VideoStreamParser +::MPEG4VideoStreamParser(MPEG4VideoStreamFramer* usingSource, + FramedSource* inputSource) + : MPEGVideoStreamParser(usingSource, inputSource), + fCurrentParseState(PARSING_VISUAL_OBJECT_SEQUENCE), + vop_time_increment_resolution(0), fNumVTIRBits(0), + fixed_vop_rate(0), fixed_vop_time_increment(0), + fSecondsSinceLastTimeCode(0), fTotalTicksSinceLastTimeCode(0), + fPrevNewTotalTicks(0), fPrevPictureCountDelta(1), fJustSawTimeCode(False) { +} + +MPEG4VideoStreamParser::~MPEG4VideoStreamParser() { +} + +void MPEG4VideoStreamParser::setParseState(MPEGParseState parseState) { + fCurrentParseState = parseState; + MPEGVideoStreamParser::setParseState(); +} + +void MPEG4VideoStreamParser::flushInput() { + fSecondsSinceLastTimeCode = 0; + fTotalTicksSinceLastTimeCode = 0; + fPrevNewTotalTicks = 0; + fPrevPictureCountDelta = 1; + + StreamParser::flushInput(); + if (fCurrentParseState != PARSING_VISUAL_OBJECT_SEQUENCE) { + setParseState(PARSING_VISUAL_OBJECT_SEQUENCE); // later, change to GOV or VOP? ##### + } +} + + +unsigned MPEG4VideoStreamParser::parse() { + try { + switch (fCurrentParseState) { + case PARSING_VISUAL_OBJECT_SEQUENCE: { + return parseVisualObjectSequence(); + } + case PARSING_VISUAL_OBJECT_SEQUENCE_SEEN_CODE: { + return parseVisualObjectSequence(True); + } + case PARSING_VISUAL_OBJECT: { + return parseVisualObject(); + } + case PARSING_VIDEO_OBJECT_LAYER: { + return parseVideoObjectLayer(); + } + case PARSING_GROUP_OF_VIDEO_OBJECT_PLANE: { + return parseGroupOfVideoObjectPlane(); + } + case PARSING_VIDEO_OBJECT_PLANE: { + return parseVideoObjectPlane(); + } + case PARSING_VISUAL_OBJECT_SEQUENCE_END_CODE: { + return parseVisualObjectSequenceEndCode(); + } + default: { + return 0; // shouldn't happen + } + } + } catch (int /*e*/) { +#ifdef DEBUG + fprintf(stderr, "MPEG4VideoStreamParser::parse() EXCEPTION (This is normal behavior - *not* an error)\n"); +#endif + return 0; // the parsing got interrupted + } +} + +#define VISUAL_OBJECT_SEQUENCE_START_CODE 0x000001B0 +#define VISUAL_OBJECT_SEQUENCE_END_CODE 0x000001B1 +#define GROUP_VOP_START_CODE 0x000001B3 +#define VISUAL_OBJECT_START_CODE 0x000001B5 +#define VOP_START_CODE 0x000001B6 + +unsigned MPEG4VideoStreamParser +::parseVisualObjectSequence(Boolean haveSeenStartCode) { +#ifdef DEBUG + fprintf(stderr, "parsing VisualObjectSequence\n"); +#endif + usingSource()->startNewConfig(); + u_int32_t first4Bytes; + if (!haveSeenStartCode) { + while ((first4Bytes = test4Bytes()) != VISUAL_OBJECT_SEQUENCE_START_CODE) { +#ifdef DEBUG + fprintf(stderr, "ignoring non VS header: 0x%08x\n", first4Bytes); +#endif + get1Byte(); setParseState(PARSING_VISUAL_OBJECT_SEQUENCE); + // ensures we progress over bad data + } + first4Bytes = get4Bytes(); + } else { + // We've already seen the start code + first4Bytes = VISUAL_OBJECT_SEQUENCE_START_CODE; + } + save4Bytes(first4Bytes); + + // The next byte is the "profile_and_level_indication": + u_int8_t pali = get1Byte(); +#ifdef DEBUG + fprintf(stderr, "profile_and_level_indication: %02x\n", pali); +#endif + saveByte(pali); + usingSource()->fProfileAndLevelIndication = pali; + + // Now, copy all bytes that we see, up until we reach + // a VISUAL_OBJECT_START_CODE: + u_int32_t next4Bytes = get4Bytes(); + while (next4Bytes != VISUAL_OBJECT_START_CODE) { + saveToNextCode(next4Bytes); + } + + setParseState(PARSING_VISUAL_OBJECT); + + // Compute this frame's presentation time: + usingSource()->computePresentationTime(fTotalTicksSinceLastTimeCode); + + // This header forms part of the 'configuration' information: + usingSource()->appendToNewConfig(fStartOfFrame, curFrameSize()); + + return curFrameSize(); +} + +static inline Boolean isVideoObjectStartCode(u_int32_t code) { + return code >= 0x00000100 && code <= 0x0000011F; +} + +unsigned MPEG4VideoStreamParser::parseVisualObject() { +#ifdef DEBUG + fprintf(stderr, "parsing VisualObject\n"); +#endif + // Note that we've already read the VISUAL_OBJECT_START_CODE + save4Bytes(VISUAL_OBJECT_START_CODE); + + // Next, extract the "visual_object_type" from the next 1 or 2 bytes: + u_int8_t nextByte = get1Byte(); saveByte(nextByte); + Boolean is_visual_object_identifier = (nextByte&0x80) != 0; + u_int8_t visual_object_type; + if (is_visual_object_identifier) { +#ifdef DEBUG + fprintf(stderr, "visual_object_verid: 0x%x; visual_object_priority: 0x%x\n", (nextByte&0x78)>>3, (nextByte&0x07)); +#endif + nextByte = get1Byte(); saveByte(nextByte); + visual_object_type = (nextByte&0xF0)>>4; + } else { + visual_object_type = (nextByte&0x78)>>3; + } +#ifdef DEBUG + fprintf(stderr, "visual_object_type: 0x%x\n", visual_object_type); +#endif + // At present, we support only the "Video ID" "visual_object_type" (1) + if (visual_object_type != 1) { + usingSource()->envir() << "MPEG4VideoStreamParser::parseVisualObject(): Warning: We don't handle visual_object_type " << visual_object_type << "\n"; + } + + // Now, copy all bytes that we see, up until we reach + // a video_object_start_code + u_int32_t next4Bytes = get4Bytes(); + while (!isVideoObjectStartCode(next4Bytes)) { + saveToNextCode(next4Bytes); + } + save4Bytes(next4Bytes); +#ifdef DEBUG + fprintf(stderr, "saw a video_object_start_code: 0x%08x\n", next4Bytes); +#endif + + setParseState(PARSING_VIDEO_OBJECT_LAYER); + + // Compute this frame's presentation time: + usingSource()->computePresentationTime(fTotalTicksSinceLastTimeCode); + + // This header forms part of the 'configuration' information: + usingSource()->appendToNewConfig(fStartOfFrame, curFrameSize()); + + return curFrameSize(); +} + +static inline Boolean isVideoObjectLayerStartCode(u_int32_t code) { + return code >= 0x00000120 && code <= 0x0000012F; +} + +Boolean MPEG4VideoStreamParser::getNextFrameBit(u_int8_t& result) { + if (fNumBitsSeenSoFar/8 >= curFrameSize()) return False; + + u_int8_t nextByte = fStartOfFrame[fNumBitsSeenSoFar/8]; + result = (nextByte>>(7-fNumBitsSeenSoFar%8))&1; + ++fNumBitsSeenSoFar; + return True; +} + +Boolean MPEG4VideoStreamParser::getNextFrameBits(unsigned numBits, + u_int32_t& result) { + result = 0; + for (unsigned i = 0; i < numBits; ++i) { + u_int8_t nextBit; + if (!getNextFrameBit(nextBit)) return False; + result = (result<<1)|nextBit; + } + return True; +} + +void MPEG4VideoStreamParser::analyzeVOLHeader() { + // Extract timing information (in particular, + // "vop_time_increment_resolution") from the VOL Header: + fNumBitsSeenSoFar = 41; + do { + u_int8_t is_object_layer_identifier; + if (!getNextFrameBit(is_object_layer_identifier)) break; + if (is_object_layer_identifier) fNumBitsSeenSoFar += 7; + + u_int32_t aspect_ratio_info; + if (!getNextFrameBits(4, aspect_ratio_info)) break; + if (aspect_ratio_info == 15 /*extended_PAR*/) fNumBitsSeenSoFar += 16; + + u_int8_t vol_control_parameters; + if (!getNextFrameBit(vol_control_parameters)) break; + if (vol_control_parameters) { + fNumBitsSeenSoFar += 3; // chroma_format; low_delay + u_int8_t vbw_parameters; + if (!getNextFrameBit(vbw_parameters)) break; + if (vbw_parameters) fNumBitsSeenSoFar += 79; + } + + fNumBitsSeenSoFar += 2; // video_object_layer_shape + u_int8_t marker_bit; + if (!getNextFrameBit(marker_bit)) break; + if (marker_bit != 1) { // sanity check + usingSource()->envir() << "MPEG4VideoStreamParser::analyzeVOLHeader(): marker_bit 1 not set!\n"; + break; + } + + if (!getNextFrameBits(16, vop_time_increment_resolution)) break; +#ifdef DEBUG + fprintf(stderr, "vop_time_increment_resolution: %d\n", vop_time_increment_resolution); +#endif + if (vop_time_increment_resolution == 0) { + usingSource()->envir() << "MPEG4VideoStreamParser::analyzeVOLHeader(): vop_time_increment_resolution is zero!\n"; + break; + } + // Compute how many bits are necessary to represent this: + fNumVTIRBits = 0; + for (unsigned test = vop_time_increment_resolution; test>0; test /= 2) { + ++fNumVTIRBits; + } + + if (!getNextFrameBit(marker_bit)) break; + if (marker_bit != 1) { // sanity check + usingSource()->envir() << "MPEG4VideoStreamParser::analyzeVOLHeader(): marker_bit 2 not set!\n"; + break; + } + + if (!getNextFrameBit(fixed_vop_rate)) break; + if (fixed_vop_rate) { + // Get the following "fixed_vop_time_increment": + if (!getNextFrameBits(fNumVTIRBits, fixed_vop_time_increment)) break; +#ifdef DEBUG + fprintf(stderr, "fixed_vop_time_increment: %d\n", fixed_vop_time_increment); + if (fixed_vop_time_increment == 0) { + usingSource()->envir() << "MPEG4VideoStreamParser::analyzeVOLHeader(): fixed_vop_time_increment is zero!\n"; + } +#endif + } + // Use "vop_time_increment_resolution" as the 'frame rate' + // (really, 'tick rate'): + usingSource()->fFrameRate = (double)vop_time_increment_resolution; +#ifdef DEBUG + fprintf(stderr, "fixed_vop_rate: %d; 'frame' (really tick) rate: %f\n", fixed_vop_rate, usingSource()->fFrameRate); +#endif + + return; + } while (0); + + if (fNumBitsSeenSoFar/8 >= curFrameSize()) { + char errMsg[200]; + sprintf(errMsg, "Not enough bits in VOL header: %d/8 >= %d\n", fNumBitsSeenSoFar, curFrameSize()); + usingSource()->envir() << errMsg; + } +} + +unsigned MPEG4VideoStreamParser::parseVideoObjectLayer() { +#ifdef DEBUG + fprintf(stderr, "parsing VideoObjectLayer\n"); +#endif + // The first 4 bytes must be a "video_object_layer_start_code". + // If not, this is a 'short video header', which we currently + // don't support: + u_int32_t next4Bytes = get4Bytes(); + if (!isVideoObjectLayerStartCode(next4Bytes)) { + usingSource()->envir() << "MPEG4VideoStreamParser::parseVideoObjectLayer(): This appears to be a 'short video header', which we currently don't support\n"; + } + + // Now, copy all bytes that we see, up until we reach + // a GROUP_VOP_START_CODE or a VOP_START_CODE: + do { + saveToNextCode(next4Bytes); + } while (next4Bytes != GROUP_VOP_START_CODE + && next4Bytes != VOP_START_CODE); + + analyzeVOLHeader(); + + setParseState((next4Bytes == GROUP_VOP_START_CODE) + ? PARSING_GROUP_OF_VIDEO_OBJECT_PLANE + : PARSING_VIDEO_OBJECT_PLANE); + + // Compute this frame's presentation time: + usingSource()->computePresentationTime(fTotalTicksSinceLastTimeCode); + + // This header ends the 'configuration' information: + usingSource()->appendToNewConfig(fStartOfFrame, curFrameSize()); + usingSource()->completeNewConfig(); + + return curFrameSize(); +} + +unsigned MPEG4VideoStreamParser::parseGroupOfVideoObjectPlane() { +#ifdef DEBUG + fprintf(stderr, "parsing GroupOfVideoObjectPlane\n"); +#endif + // Note that we've already read the GROUP_VOP_START_CODE + save4Bytes(GROUP_VOP_START_CODE); + + // Next, extract the (18-bit) time code from the next 3 bytes: + u_int8_t next3Bytes[3]; + getBytes(next3Bytes, 3); + saveByte(next3Bytes[0]);saveByte(next3Bytes[1]);saveByte(next3Bytes[2]); + unsigned time_code + = (next3Bytes[0]<<10)|(next3Bytes[1]<<2)|(next3Bytes[2]>>6); + unsigned time_code_hours = (time_code&0x0003E000)>>13; + unsigned time_code_minutes = (time_code&0x00001F80)>>7; +#if defined(DEBUG) || defined(DEBUG_TIMESTAMPS) + Boolean marker_bit = (time_code&0x00000040) != 0; +#endif + unsigned time_code_seconds = (time_code&0x0000003F); +#if defined(DEBUG) || defined(DEBUG_TIMESTAMPS) + fprintf(stderr, "time_code: 0x%05x, hours %d, minutes %d, marker_bit %d, seconds %d\n", time_code, time_code_hours, time_code_minutes, marker_bit, time_code_seconds); +#endif + fJustSawTimeCode = True; + + // Now, copy all bytes that we see, up until we reach a VOP_START_CODE: + u_int32_t next4Bytes = get4Bytes(); + while (next4Bytes != VOP_START_CODE) { + saveToNextCode(next4Bytes); + } + + // Compute this frame's presentation time: + usingSource()->computePresentationTime(fTotalTicksSinceLastTimeCode); + + // Record the time code: + usingSource()->setTimeCode(time_code_hours, time_code_minutes, + time_code_seconds, 0, 0); + // Note: Because the GOV header can appear anywhere (not just at a 1s point), we + // don't pass "fTotalTicksSinceLastTimeCode" as the "picturesSinceLastGOP" parameter. + fSecondsSinceLastTimeCode = 0; + if (fixed_vop_rate) fTotalTicksSinceLastTimeCode = 0; + + setParseState(PARSING_VIDEO_OBJECT_PLANE); + + return curFrameSize(); +} + +unsigned MPEG4VideoStreamParser::parseVideoObjectPlane() { +#ifdef DEBUG + fprintf(stderr, "#parsing VideoObjectPlane\n"); +#endif + // Note that we've already read the VOP_START_CODE + save4Bytes(VOP_START_CODE); + + // Get the "vop_coding_type" from the next byte: + u_int8_t nextByte = get1Byte(); saveByte(nextByte); + u_int8_t vop_coding_type = nextByte>>6; + + // Next, get the "modulo_time_base" by counting the '1' bits that follow. + // We look at the next 32-bits only. This should be enough in most cases. + u_int32_t next4Bytes = get4Bytes(); + u_int32_t timeInfo = (nextByte<<(32-6))|(next4Bytes>>6); + unsigned modulo_time_base = 0; + u_int32_t mask = 0x80000000; + while ((timeInfo&mask) != 0) { + ++modulo_time_base; + mask >>= 1; + } + mask >>= 1; + + // Check the following marker bit: + if ((timeInfo&mask) == 0) { + usingSource()->envir() << "MPEG4VideoStreamParser::parseVideoObjectPlane(): marker bit not set!\n"; + } + mask >>= 1; + + // Then, get the "vop_time_increment". + // First, make sure we have enough bits left for this: + if ((mask>>(fNumVTIRBits-1)) == 0) { + usingSource()->envir() << "MPEG4VideoStreamParser::parseVideoObjectPlane(): 32-bits are not enough to get \"vop_time_increment\"!\n"; + } + unsigned vop_time_increment = 0; + for (unsigned i = 0; i < fNumVTIRBits; ++i) { + vop_time_increment |= timeInfo&mask; + mask >>= 1; + } + while (mask != 0) { + vop_time_increment >>= 1; + mask >>= 1; + } +#ifdef DEBUG + fprintf(stderr, "vop_coding_type: %d(%c), modulo_time_base: %d, vop_time_increment: %d\n", vop_coding_type, "IPBS"[vop_coding_type], modulo_time_base, vop_time_increment); +#endif + + // Now, copy all bytes that we see, up until we reach a code of some sort: + saveToNextCode(next4Bytes); + + // Update our counters based on the frame timing information that we saw: + if (fixed_vop_time_increment > 0) { + // This is a 'fixed_vop_rate' stream. Use 'fixed_vop_time_increment': + usingSource()->fPictureCount += fixed_vop_time_increment; + if (vop_time_increment > 0 || modulo_time_base > 0) { + fTotalTicksSinceLastTimeCode += fixed_vop_time_increment; + // Note: "fSecondsSinceLastTimeCode" and "fPrevNewTotalTicks" are not used. + } + } else { + // Use 'vop_time_increment': + unsigned newTotalTicks + = (fSecondsSinceLastTimeCode + modulo_time_base)*vop_time_increment_resolution + + vop_time_increment; + if (newTotalTicks == fPrevNewTotalTicks && fPrevNewTotalTicks > 0) { + // This is apparently a buggy MPEG-4 video stream, because + // "vop_time_increment" did not change. Overcome this error, + // by pretending that it did change. +#ifdef DEBUG + fprintf(stderr, "Buggy MPEG-4 video stream: \"vop_time_increment\" did not change!\n"); +#endif + // The following assumes that we don't have 'B' frames. If we do, then TARFU! + usingSource()->fPictureCount += vop_time_increment; + fTotalTicksSinceLastTimeCode += vop_time_increment; + fSecondsSinceLastTimeCode += modulo_time_base; + } else { + if (newTotalTicks < fPrevNewTotalTicks && vop_coding_type != 2/*B*/ + && modulo_time_base == 0 && vop_time_increment == 0 && !fJustSawTimeCode) { + // This is another kind of buggy MPEG-4 video stream, in which + // "vop_time_increment" wraps around, but without + // "modulo_time_base" changing (or just having had a new time code). + // Overcome this by pretending that "vop_time_increment" *did* wrap around: +#ifdef DEBUG + fprintf(stderr, "Buggy MPEG-4 video stream: \"vop_time_increment\" wrapped around, but without \"modulo_time_base\" changing!\n"); +#endif + ++fSecondsSinceLastTimeCode; + newTotalTicks += vop_time_increment_resolution; + } + fPrevNewTotalTicks = newTotalTicks; + if (vop_coding_type != 2/*B*/) { + int pictureCountDelta = newTotalTicks - fTotalTicksSinceLastTimeCode; + if (pictureCountDelta <= 0) pictureCountDelta = fPrevPictureCountDelta; + // ensures that the picture count is always increasing + usingSource()->fPictureCount += pictureCountDelta; + fPrevPictureCountDelta = pictureCountDelta; + fTotalTicksSinceLastTimeCode = newTotalTicks; + fSecondsSinceLastTimeCode += modulo_time_base; + } + } + } + fJustSawTimeCode = False; // for next time + + // The next thing to parse depends on the code that we just saw, + // but we are assumed to have ended the current picture: + usingSource()->fPictureEndMarker = True; // HACK ##### + switch (next4Bytes) { + case VISUAL_OBJECT_SEQUENCE_END_CODE: { + setParseState(PARSING_VISUAL_OBJECT_SEQUENCE_END_CODE); + break; + } + case VISUAL_OBJECT_SEQUENCE_START_CODE: { + setParseState(PARSING_VISUAL_OBJECT_SEQUENCE_SEEN_CODE); + break; + } + case VISUAL_OBJECT_START_CODE: { + setParseState(PARSING_VISUAL_OBJECT); + break; + } + case GROUP_VOP_START_CODE: { + setParseState(PARSING_GROUP_OF_VIDEO_OBJECT_PLANE); + break; + } + case VOP_START_CODE: { + setParseState(PARSING_VIDEO_OBJECT_PLANE); + break; + } + default: { + if (isVideoObjectStartCode(next4Bytes)) { + setParseState(PARSING_VIDEO_OBJECT_LAYER); + } else if (isVideoObjectLayerStartCode(next4Bytes)){ + // copy all bytes that we see, up until we reach a VOP_START_CODE: + u_int32_t next4Bytes = get4Bytes(); + while (next4Bytes != VOP_START_CODE) { + saveToNextCode(next4Bytes); + } + setParseState(PARSING_VIDEO_OBJECT_PLANE); + } else { + usingSource()->envir() << "MPEG4VideoStreamParser::parseVideoObjectPlane(): Saw unexpected code " + << (void*)next4Bytes << "\n"; + setParseState(PARSING_VIDEO_OBJECT_PLANE); // the safest way to recover... + } + break; + } + } + + // Compute this frame's presentation time: + usingSource()->computePresentationTime(fTotalTicksSinceLastTimeCode); + + return curFrameSize(); +} + +unsigned MPEG4VideoStreamParser::parseVisualObjectSequenceEndCode() { +#ifdef DEBUG + fprintf(stderr, "parsing VISUAL_OBJECT_SEQUENCE_END_CODE\n"); +#endif + // Note that we've already read the VISUAL_OBJECT_SEQUENCE_END_CODE + save4Bytes(VISUAL_OBJECT_SEQUENCE_END_CODE); + + setParseState(PARSING_VISUAL_OBJECT_SEQUENCE); + + // Treat this as if we had ended a picture: + usingSource()->fPictureEndMarker = True; // HACK ##### + + return curFrameSize(); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MPEGVideoStreamFramer.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MPEGVideoStreamFramer.cpp new file mode 100644 index 000000000..59c4656b3 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MPEGVideoStreamFramer.cpp @@ -0,0 +1,187 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A filter that breaks up an MPEG video elementary stream into +// headers and frames +// Implementation + +#include "MPEGVideoStreamParser.hh" +#include + +////////// TimeCode implementation ////////// + +TimeCode::TimeCode() + : days(0), hours(0), minutes(0), seconds(0), pictures(0) { +} + +TimeCode::~TimeCode() { +} + +int TimeCode::operator==(TimeCode const& arg2) { + return pictures == arg2.pictures && seconds == arg2.seconds + && minutes == arg2.minutes && hours == arg2.hours && days == arg2.days; +} + +////////// MPEGVideoStreamFramer implementation ////////// + +MPEGVideoStreamFramer::MPEGVideoStreamFramer(UsageEnvironment& env, + FramedSource* inputSource) + : FramedFilter(env, inputSource), + fFrameRate(0.0) /* until we learn otherwise */, + fParser(NULL) { + reset(); +} + +MPEGVideoStreamFramer::~MPEGVideoStreamFramer() { + delete fParser; +} + +void MPEGVideoStreamFramer::flushInput() { + reset(); + if (fParser != NULL) fParser->flushInput(); +} + +void MPEGVideoStreamFramer::reset() { + fPictureCount = 0; + fPictureEndMarker = True; // So that we start looking as if we'd just ended an 'access unit' + fPicturesAdjustment = 0; + fPictureTimeBase = 0.0; + fTcSecsBase = 0; + fHaveSeenFirstTimeCode = False; + + // Clear the 'presentation time base', as a signal for subclasses + // to reset it (to our current time) when we start (or resume) streaming: + fPresentationTimeBase.tv_sec = 0; + fPresentationTimeBase.tv_usec = 0; +} + +#ifdef DEBUG +static struct timeval firstPT; +#endif +void MPEGVideoStreamFramer +::computePresentationTime(unsigned numAdditionalPictures) { + // Computes "fPresentationTime" from the most recent GOP's + // time_code, along with the "numAdditionalPictures" parameter: + TimeCode& tc = fCurGOPTimeCode; + + unsigned tcSecs + = (((tc.days*24)+tc.hours)*60+tc.minutes)*60+tc.seconds - fTcSecsBase; + double pictureTime = fFrameRate == 0.0 ? 0.0 + : (tc.pictures + fPicturesAdjustment + numAdditionalPictures)/fFrameRate; + while (pictureTime < fPictureTimeBase) { // "if" should be enough, but just in case + if (tcSecs > 0) tcSecs -= 1; + pictureTime += 1.0; + } + pictureTime -= fPictureTimeBase; + if (pictureTime < 0.0) pictureTime = 0.0; // sanity check + unsigned pictureSeconds = (unsigned)pictureTime; + double pictureFractionOfSecond = pictureTime - (double)pictureSeconds; + + fPresentationTime = fPresentationTimeBase; + fPresentationTime.tv_sec += tcSecs + pictureSeconds; + fPresentationTime.tv_usec += (long)(pictureFractionOfSecond*1000000.0); + if (fPresentationTime.tv_usec >= 1000000) { + fPresentationTime.tv_usec -= 1000000; + ++fPresentationTime.tv_sec; + } +#ifdef DEBUG + if (firstPT.tv_sec == 0 && firstPT.tv_usec == 0) firstPT = fPresentationTime; + struct timeval diffPT; + diffPT.tv_sec = fPresentationTime.tv_sec - firstPT.tv_sec; + diffPT.tv_usec = fPresentationTime.tv_usec - firstPT.tv_usec; + if (fPresentationTime.tv_usec < firstPT.tv_usec) { + --diffPT.tv_sec; + diffPT.tv_usec += 1000000; + } + fprintf(stderr, "MPEGVideoStreamFramer::computePresentationTime(%d) -> %lu.%06ld [%lu.%06ld]\n", numAdditionalPictures, fPresentationTime.tv_sec, fPresentationTime.tv_usec, diffPT.tv_sec, diffPT.tv_usec); +#endif +} + +void MPEGVideoStreamFramer +::setTimeCode(unsigned hours, unsigned minutes, unsigned seconds, + unsigned pictures, unsigned picturesSinceLastGOP) { + TimeCode& tc = fCurGOPTimeCode; // abbrev + unsigned days = tc.days; + if (hours < tc.hours) { + // Assume that the 'day' has wrapped around: + ++days; + } + tc.days = days; + tc.hours = hours; + tc.minutes = minutes; + tc.seconds = seconds; + tc.pictures = pictures; + if (!fHaveSeenFirstTimeCode) { + fPictureTimeBase = fFrameRate == 0.0 ? 0.0 : tc.pictures/fFrameRate; + fTcSecsBase = (((tc.days*24)+tc.hours)*60+tc.minutes)*60+tc.seconds; + fHaveSeenFirstTimeCode = True; + } else if (fCurGOPTimeCode == fPrevGOPTimeCode) { + // The time code has not changed since last time. Adjust for this: + fPicturesAdjustment += picturesSinceLastGOP; + } else { + // Normal case: The time code changed since last time. + fPrevGOPTimeCode = tc; + fPicturesAdjustment = 0; + } +} + +void MPEGVideoStreamFramer::doGetNextFrame() { + fParser->registerReadInterest(fTo, fMaxSize); + continueReadProcessing(); +} + +void MPEGVideoStreamFramer::doStopGettingFrames() { + flushInput(); + FramedFilter::doStopGettingFrames(); +} + +void MPEGVideoStreamFramer +::continueReadProcessing(void* clientData, + unsigned char* /*ptr*/, unsigned /*size*/, + struct timeval /*presentationTime*/) { + MPEGVideoStreamFramer* framer = (MPEGVideoStreamFramer*)clientData; + framer->continueReadProcessing(); +} + +void MPEGVideoStreamFramer::continueReadProcessing() { + unsigned acquiredFrameSize = fParser->parse(); + if (acquiredFrameSize > 0) { + // We were able to acquire a frame from the input. + // It has already been copied to the reader's space. + fFrameSize = acquiredFrameSize; + fNumTruncatedBytes = fParser->numTruncatedBytes(); + + // "fPresentationTime" should have already been computed. + + // Compute "fDurationInMicroseconds" now: + fDurationInMicroseconds + = (fFrameRate == 0.0 || ((int)fPictureCount) < 0) ? 0 + : (unsigned)((fPictureCount*1000000)/fFrameRate); +#ifdef DEBUG + fprintf(stderr, "%d bytes @%u.%06d, fDurationInMicroseconds: %d ((%d*1000000)/%f)\n", acquiredFrameSize, fPresentationTime.tv_sec, fPresentationTime.tv_usec, fDurationInMicroseconds, fPictureCount, fFrameRate); +#endif + fPictureCount = 0; + + // Call our own 'after getting' function. Because we're not a 'leaf' + // source, we can call this directly, without risking infinite recursion. + afterGetting(this); + } else { + // We were unable to parse a complete frame from the input, because: + // - we had to read more data from the source stream, or + // - the source stream has ended. + } +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MPEGVideoStreamParser.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MPEGVideoStreamParser.cpp new file mode 100644 index 000000000..bfd631dcc --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MPEGVideoStreamParser.cpp @@ -0,0 +1,45 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// An abstract parser for MPEG video streams +// Implementation + +#include "MPEGVideoStreamParser.hh" + +MPEGVideoStreamParser +::MPEGVideoStreamParser(MPEGVideoStreamFramer* usingSource, + FramedSource* inputSource) + : StreamParser(inputSource, FramedSource::handleClosure, usingSource, + &MPEGVideoStreamFramer::continueReadProcessing, usingSource), + fUsingSource(usingSource) { +} + +MPEGVideoStreamParser::~MPEGVideoStreamParser() { +} + +void MPEGVideoStreamParser::restoreSavedParserState() { + StreamParser::restoreSavedParserState(); + fTo = fSavedTo; + fNumTruncatedBytes = fSavedNumTruncatedBytes; +} + +void MPEGVideoStreamParser::registerReadInterest(unsigned char* to, + unsigned maxSize) { + fStartOfFrame = fTo = fSavedTo = to; + fLimit = to + maxSize; + fNumTruncatedBytes = fSavedNumTruncatedBytes = 0; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MPEGVideoStreamParser.hh b/src/big/mpp/middleware/src/live555/liveMedia/MPEGVideoStreamParser.hh new file mode 100644 index 000000000..eca54f0f2 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MPEGVideoStreamParser.hh @@ -0,0 +1,122 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// An abstract parser for MPEG video streams +// C++ header + +#ifndef _MPEG_VIDEO_STREAM_PARSER_HH +#define _MPEG_VIDEO_STREAM_PARSER_HH + +#ifndef _STREAM_PARSER_HH +#include "StreamParser.hh" +#endif +#ifndef _MPEG_VIDEO_STREAM_FRAMER_HH +#include "MPEGVideoStreamFramer.hh" +#endif + +////////// MPEGVideoStreamParser definition ////////// + +class MPEGVideoStreamParser: public StreamParser { +public: + MPEGVideoStreamParser(MPEGVideoStreamFramer* usingSource, + FramedSource* inputSource); + virtual ~MPEGVideoStreamParser(); + +public: + void registerReadInterest(unsigned char* to, unsigned maxSize); + + virtual unsigned parse() = 0; + // returns the size of the frame that was acquired, or 0 if none was + // The number of truncated bytes (if any) is given by: + unsigned numTruncatedBytes() const { return fNumTruncatedBytes; } + +protected: + void setParseState() { + fSavedTo = fTo; + fSavedNumTruncatedBytes = fNumTruncatedBytes; + saveParserState(); + } + + // Record "byte" in the current output frame: + void saveByte(u_int8_t byte) { + if (fTo >= fLimit) { // there's no space left + ++fNumTruncatedBytes; + return; + } + + *fTo++ = byte; + } + + void save4Bytes(u_int32_t word) { + if (fTo+4 > fLimit) { // there's no space left + fNumTruncatedBytes += 4; + return; + } + + *fTo++ = word>>24; *fTo++ = word>>16; *fTo++ = word>>8; *fTo++ = word; + } + + // Save data until we see a sync word (0x000001xx): + void saveToNextCode(u_int32_t& curWord) { + saveByte(curWord>>24); + curWord = (curWord<<8)|get1Byte(); + while ((curWord&0xFFFFFF00) != 0x00000100) { + if ((unsigned)(curWord&0xFF) > 1) { + // a sync word definitely doesn't begin anywhere in "curWord" + save4Bytes(curWord); + curWord = get4Bytes(); + } else { + // a sync word might begin in "curWord", although not at its start + saveByte(curWord>>24); + unsigned char newByte = get1Byte(); + curWord = (curWord<<8)|newByte; + } + } + } + + // Skip data until we see a sync word (0x000001xx): + void skipToNextCode(u_int32_t& curWord) { + curWord = (curWord<<8)|get1Byte(); + while ((curWord&0xFFFFFF00) != 0x00000100) { + if ((unsigned)(curWord&0xFF) > 1) { + // a sync word definitely doesn't begin anywhere in "curWord" + curWord = get4Bytes(); + } else { + // a sync word might begin in "curWord", although not at its start + unsigned char newByte = get1Byte(); + curWord = (curWord<<8)|newByte; + } + } + } + +protected: + MPEGVideoStreamFramer* fUsingSource; + + // state of the frame that's currently being read: + unsigned char* fStartOfFrame; + unsigned char* fTo; + unsigned char* fLimit; + unsigned fNumTruncatedBytes; + unsigned curFrameSize() { return fTo - fStartOfFrame; } + unsigned char* fSavedTo; + unsigned fSavedNumTruncatedBytes; + +private: // redefined virtual functions + virtual void restoreSavedParserState(); +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/Makefile b/src/big/mpp/middleware/src/live555/liveMedia/Makefile new file mode 100644 index 000000000..d1eb73710 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/Makefile @@ -0,0 +1,49 @@ +include $(MPP_SRC_DIR)/middleware/mpp.mk +include $(MPP_SRC_DIR)/middleware/rt-smart.mk + +CURRECT_DIR_NAME=$(shell basename `pwd`) +LOCAL_SRC_DIR = $(shell pwd) +BIN = lib$(CURRECT_DIR_NAME).a +LIBPATH = $(MPP_LIB_PATH) +LIBS = $(MPP_LIBS) + +CC_CFLAGS_EX=-mcmodel=medany -march=rv64imafdcv -mabi=lp64d -Wall -O0 -g -gdwarf-2 -n --static $(KCFLAGS) + +LIVE555_COMPILE_OPTS = -DSOCKLEN_T=socklen_t -DNO_SSTREAM=1 -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -DNO_OPENSSL=1 + +LOCAL_CFLAGS = -I$(LOCAL_SRC_DIR) -I$(LOCAL_SRC_DIR)/include -I../UsageEnvironment/include -I../groupsock/include + +WERROR_FLAGS = -Wno-register -Wno-multichar -Wno-pessimizing-move -Wno-deprecated-declarations -Wno-unused-result -Wno-unused-variable -Wno-format -Wno-return-type -Wno-sign-compare -Wno-unused-label + +CXX_FLAGS = $(WERROR_FLAGS) \ + $(LIVE555_COMPILE_OPTS) \ + +SRCS = $(wildcard $(LOCAL_SRC_DIR)/*.c) + +OBJS = $(patsubst %.c,%.o,$(SRCS)) + +CPP_SRCS = $(wildcard $(LOCAL_SRC_DIR)/*.cpp) + +CPP_OBJS = $(patsubst %.cpp,%.o,$(CPP_SRCS)) + +all: $(BIN) + @-rm -f *.o + @echo "${PWD}/Makefile all" + +$(OBJS): %.o : %.c + @echo CC $@ + @$(CC) $(CC_CFLAGS_EX) $(LOCAL_CFLAGS) $(BSP_CFLGAS) $(RTSMART_CFLAGS) $(MPP_USER_CFLGAS) -c $< -o $@ + +$(CPP_OBJS): %.o : %.cpp + @echo CXX $@ + @$(CPP) $(CC_CFLAGS_EX) $(CXX_FLAGS) $(LOCAL_CFLAGS) $(BSP_CFLGAS) $(RTSMART_CFLAGS) $(MPP_USER_CFLGAS) -c $< -o $@ + +$(BIN): $(OBJS) $(CPP_OBJS) + @echo LD $@ + $(AR) $(ARFLAGS) $@ $^ + +clean: + echo "${PWD}/Makefile clean" + rm -rf $(BIN) $(OBJS) $(CPP_OBJS) + +.PHONY: all clean diff --git a/src/big/mpp/middleware/src/live555/liveMedia/Makefile.head b/src/big/mpp/middleware/src/live555/liveMedia/Makefile.head new file mode 100644 index 000000000..f4e4414cc --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/Makefile.head @@ -0,0 +1,4 @@ +INCLUDES = -Iinclude -I../UsageEnvironment/include -I../groupsock/include +PREFIX = /usr/local +LIBDIR = $(PREFIX)/lib +##### Change the following for your environment: diff --git a/src/big/mpp/middleware/src/live555/liveMedia/Makefile.tail b/src/big/mpp/middleware/src/live555/liveMedia/Makefile.tail new file mode 100644 index 000000000..1be45f65f --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/Makefile.tail @@ -0,0 +1,445 @@ +##### End of variables to change + +NAME = libliveMedia +LIVEMEDIA_LIB = $(NAME).$(LIB_SUFFIX) +ALL = $(LIVEMEDIA_LIB) +all: $(ALL) + +.$(C).$(OBJ): + $(C_COMPILER) -c $(C_FLAGS) $< +.$(CPP).$(OBJ): + $(CPLUSPLUS_COMPILER) -c $(CPLUSPLUS_FLAGS) $< + +MP3_SOURCE_OBJS = MP3FileSource.$(OBJ) MP3Transcoder.$(OBJ) MP3ADU.$(OBJ) MP3ADUdescriptor.$(OBJ) MP3ADUinterleaving.$(OBJ) MP3ADUTranscoder.$(OBJ) MP3StreamState.$(OBJ) MP3Internals.$(OBJ) MP3InternalsHuffman.$(OBJ) MP3InternalsHuffmanTable.$(OBJ) MP3ADURTPSource.$(OBJ) +MPEG_SOURCE_OBJS = MPEG1or2Demux.$(OBJ) MPEG1or2DemuxedElementaryStream.$(OBJ) MPEGVideoStreamFramer.$(OBJ) MPEG1or2VideoStreamFramer.$(OBJ) MPEG1or2VideoStreamDiscreteFramer.$(OBJ) MPEG4VideoStreamFramer.$(OBJ) MPEG4VideoStreamDiscreteFramer.$(OBJ) H264or5VideoStreamFramer.$(OBJ) H264or5VideoStreamDiscreteFramer.$(OBJ) H264VideoStreamFramer.$(OBJ) H264VideoStreamDiscreteFramer.$(OBJ) H265VideoStreamFramer.$(OBJ) H265VideoStreamDiscreteFramer.$(OBJ) MPEGVideoStreamParser.$(OBJ) MPEG1or2AudioStreamFramer.$(OBJ) MPEG1or2AudioRTPSource.$(OBJ) MPEG4LATMAudioRTPSource.$(OBJ) MPEG4ESVideoRTPSource.$(OBJ) MPEG4GenericRTPSource.$(OBJ) $(MP3_SOURCE_OBJS) MPEG1or2VideoRTPSource.$(OBJ) MPEG2TransportStreamMultiplexor.$(OBJ) MPEG2TransportStreamFromPESSource.$(OBJ) MPEG2TransportStreamFromESSource.$(OBJ) MPEG2TransportStreamFramer.$(OBJ) MPEG2TransportStreamAccumulator.$(OBJ) ADTSAudioFileSource.$(OBJ) ADTSAudioStreamDiscreteFramer.$(OBJ) +#JPEG_SOURCE_OBJS = JPEGVideoSource.$(OBJ) JPEGVideoRTPSource.$(OBJ) JPEG2000VideoStreamFramer.$(OBJ) JPEG2000VideoStreamParser.$(OBJ) JPEG2000VideoRTPSource.$(OBJ) +JPEG_SOURCE_OBJS = JPEGVideoSource.$(OBJ) JPEGVideoRTPSource.$(OBJ) JPEG2000VideoRTPSource.$(OBJ) +H263_SOURCE_OBJS = H263plusVideoRTPSource.$(OBJ) H263plusVideoStreamFramer.$(OBJ) H263plusVideoStreamParser.$(OBJ) +AC3_SOURCE_OBJS = AC3AudioStreamFramer.$(OBJ) AC3AudioRTPSource.$(OBJ) +DV_SOURCE_OBJS = DVVideoStreamFramer.$(OBJ) DVVideoRTPSource.$(OBJ) +MP3_SINK_OBJS = MP3ADURTPSink.$(OBJ) +MPEG_SINK_OBJS = MPEG1or2AudioRTPSink.$(OBJ) $(MP3_SINK_OBJS) MPEG1or2VideoRTPSink.$(OBJ) MPEG4LATMAudioRTPSink.$(OBJ) MPEG4GenericRTPSink.$(OBJ) MPEG4ESVideoRTPSink.$(OBJ) +JPEG_SINK_OBJS = JPEGVideoRTPSink.$(OBJ) JPEG2000VideoRTPSink.$(OBJ) +H263_SINK_OBJS = H263plusVideoRTPSink.$(OBJ) +H264_OR_5_SINK_OBJS = H264or5VideoRTPSink.$(OBJ) H264VideoRTPSink.$(OBJ) H265VideoRTPSink.$(OBJ) +DV_SINK_OBJS = DVVideoRTPSink.$(OBJ) +AC3_SINK_OBJS = AC3AudioRTPSink.$(OBJ) + +MISC_SOURCE_OBJS = MediaSource.$(OBJ) FramedSource.$(OBJ) FramedFileSource.$(OBJ) FramedFilter.$(OBJ) ByteStreamFileSource.$(OBJ) ByteStreamMultiFileSource.$(OBJ) ByteStreamMemoryBufferSource.$(OBJ) BasicUDPSource.$(OBJ) DeviceSource.$(OBJ) AudioInputDevice.$(OBJ) WAVAudioFileSource.$(OBJ) $(MPEG_SOURCE_OBJS) $(JPEG_SOURCE_OBJS) $(H263_SOURCE_OBJS) $(AC3_SOURCE_OBJS) $(DV_SOURCE_OBJS) AMRAudioSource.$(OBJ) AMRAudioFileSource.$(OBJ) InputFile.$(OBJ) StreamReplicator.$(OBJ) +MISC_SINK_OBJS = MediaSink.$(OBJ) FileSink.$(OBJ) BasicUDPSink.$(OBJ) AMRAudioFileSink.$(OBJ) H264or5VideoFileSink.$(OBJ) H264VideoFileSink.$(OBJ) H265VideoFileSink.$(OBJ) OggFileSink.$(OBJ) $(MPEG_SINK_OBJS) $(JPEG_SINK_OBJS) $(H263_SINK_OBJS) $(H264_OR_5_SINK_OBJS) $(DV_SINK_OBJS) $(AC3_SINK_OBJS) VorbisAudioRTPSink.$(OBJ) TheoraVideoRTPSink.$(OBJ) VP8VideoRTPSink.$(OBJ) VP9VideoRTPSink.$(OBJ) GSMAudioRTPSink.$(OBJ) SimpleRTPSink.$(OBJ) AMRAudioRTPSink.$(OBJ) T140TextRTPSink.$(OBJ) OutputFile.$(OBJ) RawVideoRTPSink.$(OBJ) +MISC_FILTER_OBJS = uLawAudioFilter.$(OBJ) +TRANSPORT_STREAM_TRICK_PLAY_OBJS = MPEG2IndexFromTransportStream.$(OBJ) MPEG2TransportStreamIndexFile.$(OBJ) MPEG2TransportStreamTrickModeFilter.$(OBJ) + +RTP_SOURCE_OBJS = RTPSource.$(OBJ) MultiFramedRTPSource.$(OBJ) SimpleRTPSource.$(OBJ) H261VideoRTPSource.$(OBJ) H264VideoRTPSource.$(OBJ) H265VideoRTPSource.$(OBJ) QCELPAudioRTPSource.$(OBJ) AMRAudioRTPSource.$(OBJ) VorbisAudioRTPSource.$(OBJ) TheoraVideoRTPSource.$(OBJ) VP8VideoRTPSource.$(OBJ) VP9VideoRTPSource.$(OBJ) RawVideoRTPSource.$(OBJ) +RTP_SINK_OBJS = RTPSink.$(OBJ) MultiFramedRTPSink.$(OBJ) AudioRTPSink.$(OBJ) VideoRTPSink.$(OBJ) TextRTPSink.$(OBJ) +RTP_INTERFACE_OBJS = RTPInterface.$(OBJ) +RTP_OBJS = $(RTP_SOURCE_OBJS) $(RTP_SINK_OBJS) $(RTP_INTERFACE_OBJS) + +RTCP_OBJS = RTCP.$(OBJ) rtcp_from_spec.$(OBJ) +GENERIC_MEDIA_SERVER_OBJS = GenericMediaServer.$(OBJ) +RTSP_OBJS = RTSPServer.$(OBJ) RTSPServerRegister.$(OBJ) RTSPClient.$(OBJ) RTSPCommon.$(OBJ) RTSPRegisterSender.$(OBJ) +SIP_OBJS = SIPClient.$(OBJ) + +SESSION_OBJS = MediaSession.$(OBJ) ServerMediaSession.$(OBJ) PassiveServerMediaSubsession.$(OBJ) OnDemandServerMediaSubsession.$(OBJ) FileServerMediaSubsession.$(OBJ) MPEG4VideoFileServerMediaSubsession.$(OBJ) H264VideoFileServerMediaSubsession.$(OBJ) H265VideoFileServerMediaSubsession.$(OBJ) H263plusVideoFileServerMediaSubsession.$(OBJ) WAVAudioFileServerMediaSubsession.$(OBJ) AMRAudioFileServerMediaSubsession.$(OBJ) MP3AudioFileServerMediaSubsession.$(OBJ) MPEG1or2VideoFileServerMediaSubsession.$(OBJ) MPEG1or2FileServerDemux.$(OBJ) MPEG1or2DemuxedServerMediaSubsession.$(OBJ) MPEG2TransportFileServerMediaSubsession.$(OBJ) ADTSAudioFileServerMediaSubsession.$(OBJ) DVVideoFileServerMediaSubsession.$(OBJ) AC3AudioFileServerMediaSubsession.$(OBJ) MPEG2TransportUDPServerMediaSubsession.$(OBJ) ProxyServerMediaSession.$(OBJ) + +QUICKTIME_OBJS = QuickTimeFileSink.$(OBJ) QuickTimeGenericRTPSource.$(OBJ) +AVI_OBJS = AVIFileSink.$(OBJ) + +MATROSKA_FILE_OBJS = MatroskaFile.$(OBJ) MatroskaFileParser.$(OBJ) EBMLNumber.$(OBJ) MatroskaDemuxedTrack.$(OBJ) +MATROSKA_SERVER_MEDIA_SUBSESSION_OBJS = MatroskaFileServerMediaSubsession.$(OBJ) MP3AudioMatroskaFileServerMediaSubsession.$(OBJ) +MATROSKA_RTSP_SERVER_OBJS = MatroskaFileServerDemux.$(OBJ) $(MATROSKA_SERVER_MEDIA_SUBSESSION_OBJS) +MATROSKA_OBJS = $(MATROSKA_FILE_OBJS) $(MATROSKA_RTSP_SERVER_OBJS) + +OGG_FILE_OBJS = OggFile.$(OBJ) OggFileParser.$(OBJ) OggDemuxedTrack.$(OBJ) +OGG_SERVER_MEDIA_SUBSESSION_OBJS = OggFileServerMediaSubsession.$(OBJ) +OGG_RTSP_SERVER_OBJS = OggFileServerDemux.$(OBJ) $(OGG_SERVER_MEDIA_SUBSESSION_OBJS) +OGG_OBJS = $(OGG_FILE_OBJS) $(OGG_RTSP_SERVER_OBJS) + +TRANSPORT_STREAM_DEMUX_OBJS = MPEG2TransportStreamDemux.$(OBJ) MPEG2TransportStreamDemuxedTrack.$(OBJ) MPEG2TransportStreamParser.$(OBJ) MPEG2TransportStreamParser_PAT.$(OBJ) MPEG2TransportStreamParser_PMT.$(OBJ) MPEG2TransportStreamParser_STREAM.$(OBJ) + +HLS_OBJS = HLSSegmenter.$(OBJ) + +SECURITY_OBJS = TLSState.$(OBJ) MIKEY.$(OBJ) SRTPCryptographicContext.$(OBJ) HMAC_SHA1.$(OBJ) + +MISC_OBJS = BitVector.$(OBJ) StreamParser.$(OBJ) DigestAuthentication.$(OBJ) ourMD5.$(OBJ) Base64.$(OBJ) Locale.$(OBJ) + +LIVEMEDIA_LIB_OBJS = Media.$(OBJ) $(MISC_SOURCE_OBJS) $(MISC_SINK_OBJS) $(MISC_FILTER_OBJS) $(RTP_OBJS) $(RTCP_OBJS) $(GENERIC_MEDIA_SERVER_OBJS) $(RTSP_OBJS) $(SIP_OBJS) $(SESSION_OBJS) $(QUICKTIME_OBJS) $(AVI_OBJS) $(TRANSPORT_STREAM_TRICK_PLAY_OBJS) $(MATROSKA_OBJS) $(OGG_OBJS) $(TRANSPORT_STREAM_DEMUX_OBJS) $(HLS_OBJS) $(SECURITY_OBJS) $(MISC_OBJS) + +$(LIVEMEDIA_LIB): $(LIVEMEDIA_LIB_OBJS) \ + $(PLATFORM_SPECIFIC_LIB_OBJS) + $(LIBRARY_LINK)$@ $(LIBRARY_LINK_OPTS) \ + $(LIVEMEDIA_LIB_OBJS) $(LIBS_FOR_LIVEMEDIA_LIB) + +Media.$(CPP): include/Media.hh +include/Media.hh: include/liveMedia_version.hh +MediaSource.$(CPP): include/MediaSource.hh +include/MediaSource.hh: include/Media.hh +FramedSource.$(CPP): include/FramedSource.hh +include/FramedSource.hh: include/MediaSource.hh +FramedFileSource.$(CPP): include/FramedFileSource.hh +include/FramedFileSource.hh: include/FramedSource.hh +FramedFilter.$(CPP): include/FramedFilter.hh +include/FramedFilter.hh: include/FramedSource.hh +RTPSource.$(CPP): include/RTPSource.hh +include/RTPSource.hh: include/FramedSource.hh include/RTPInterface.hh include/SRTPCryptographicContext.hh +include/RTPInterface.hh: include/Media.hh include/TLSState.hh +MultiFramedRTPSource.$(CPP): include/MultiFramedRTPSource.hh include/RTCP.hh +include/MultiFramedRTPSource.hh: include/RTPSource.hh +SimpleRTPSource.$(CPP): include/SimpleRTPSource.hh +include/SimpleRTPSource.hh: include/MultiFramedRTPSource.hh +H261VideoRTPSource.$(CPP): include/H261VideoRTPSource.hh +include/H261VideoRTPSource.hh: include/MultiFramedRTPSource.hh +H264VideoRTPSource.$(CPP): include/H264VideoRTPSource.hh include/Base64.hh +include/H264VideoRTPSource.hh: include/MultiFramedRTPSource.hh +H265VideoRTPSource.$(CPP): include/H265VideoRTPSource.hh +include/H265VideoRTPSource.hh: include/MultiFramedRTPSource.hh +QCELPAudioRTPSource.$(CPP): include/QCELPAudioRTPSource.hh include/MultiFramedRTPSource.hh include/FramedFilter.hh +include/QCELPAudioRTPSource.hh: include/RTPSource.hh +AMRAudioRTPSource.$(CPP): include/AMRAudioRTPSource.hh include/MultiFramedRTPSource.hh +include/AMRAudioRTPSource.hh: include/RTPSource.hh include/AMRAudioSource.hh +VorbisAudioRTPSource.$(CPP): include/VorbisAudioRTPSource.hh include/Base64.hh +include/VorbisAudioRTPSource.hh: include/MultiFramedRTPSource.hh +TheoraVideoRTPSource.$(CPP): include/TheoraVideoRTPSource.hh +include/TheoraVideoRTPSource.hh: include/MultiFramedRTPSource.hh +VP8VideoRTPSource.$(CPP): include/VP8VideoRTPSource.hh +include/VP8VideoRTPSource.hh: include/MultiFramedRTPSource.hh +VP9VideoRTPSource.$(CPP): include/VP9VideoRTPSource.hh +include/VP9VideoRTPSource.hh: include/MultiFramedRTPSource.hh +RawVideoRTPSource.$(CPP): include/RawVideoRTPSource.hh +include/RawVideoRTPSource.hh: include/MultiFramedRTPSource.hh +ByteStreamFileSource.$(CPP): include/ByteStreamFileSource.hh include/InputFile.hh +include/ByteStreamFileSource.hh: include/FramedFileSource.hh +ByteStreamMultiFileSource.$(CPP): include/ByteStreamMultiFileSource.hh +include/ByteStreamMultiFileSource.hh: include/ByteStreamFileSource.hh +ByteStreamMemoryBufferSource.$(CPP): include/ByteStreamMemoryBufferSource.hh +include/ByteStreamMemoryBufferSource.hh: include/FramedSource.hh +BasicUDPSource.$(CPP): include/BasicUDPSource.hh +include/BasicUDPSource.hh: include/FramedSource.hh +DeviceSource.$(CPP): include/DeviceSource.hh +include/DeviceSource.hh: include/FramedSource.hh +AudioInputDevice.$(CPP): include/AudioInputDevice.hh +include/AudioInputDevice.hh: include/FramedSource.hh +WAVAudioFileSource.$(CPP): include/WAVAudioFileSource.hh include/InputFile.hh +include/WAVAudioFileSource.hh: include/AudioInputDevice.hh +MPEG1or2Demux.$(CPP): include/MPEG1or2Demux.hh include/MPEG1or2DemuxedElementaryStream.hh StreamParser.hh +include/MPEG1or2Demux.hh: include/FramedSource.hh +include/MPEG1or2DemuxedElementaryStream.hh: include/MPEG1or2Demux.hh +StreamParser.hh: include/FramedSource.hh +MPEG1or2DemuxedElementaryStream.$(CPP): include/MPEG1or2DemuxedElementaryStream.hh +MPEGVideoStreamFramer.$(CPP): MPEGVideoStreamParser.hh +MPEGVideoStreamParser.hh: StreamParser.hh include/MPEGVideoStreamFramer.hh +include/MPEGVideoStreamFramer.hh: include/FramedFilter.hh +MPEG1or2VideoStreamFramer.$(CPP): include/MPEG1or2VideoStreamFramer.hh MPEGVideoStreamParser.hh +include/MPEG1or2VideoStreamFramer.hh: include/MPEGVideoStreamFramer.hh +MPEG1or2VideoStreamDiscreteFramer.$(CPP): include/MPEG1or2VideoStreamDiscreteFramer.hh +include/MPEG1or2VideoStreamDiscreteFramer.hh: include/MPEG1or2VideoStreamFramer.hh +MPEG4VideoStreamFramer.$(CPP): include/MPEG4VideoStreamFramer.hh MPEGVideoStreamParser.hh include/MPEG4LATMAudioRTPSource.hh +include/MPEG4VideoStreamFramer.hh: include/MPEGVideoStreamFramer.hh +MPEG4VideoStreamDiscreteFramer.$(CPP): include/MPEG4VideoStreamDiscreteFramer.hh +include/MPEG4VideoStreamDiscreteFramer.hh: include/MPEG4VideoStreamFramer.hh +H264or5VideoStreamFramer.$(CPP): include/H264or5VideoStreamFramer.hh MPEGVideoStreamParser.hh include/BitVector.hh +include/H264or5VideoStreamFramer.hh: include/MPEGVideoStreamFramer.hh +H264or5VideoStreamDiscreteFramer.$(CPP): include/H264or5VideoStreamDiscreteFramer.hh +include/H264or5VideoStreamDiscreteFramer.hh: include/H264or5VideoStreamFramer.hh +H264VideoStreamFramer.$(CPP): include/H264VideoStreamFramer.hh +include/H264VideoStreamFramer.hh: include/H264or5VideoStreamFramer.hh +H264VideoStreamDiscreteFramer.$(CPP): include/H264VideoStreamDiscreteFramer.hh +include/H264VideoStreamDiscreteFramer.hh: include/H264VideoStreamFramer.hh +H265VideoStreamFramer.$(CPP): include/H265VideoStreamFramer.hh +include/H265VideoStreamFramer.hh: include/H264or5VideoStreamFramer.hh +H265VideoStreamDiscreteFramer.$(CPP): include/H265VideoStreamDiscreteFramer.hh +include/H265VideoStreamDiscreteFramer.hh: include/H265VideoStreamFramer.hh +MPEGVideoStreamParser.$(CPP): MPEGVideoStreamParser.hh +MPEG1or2AudioStreamFramer.$(CPP): include/MPEG1or2AudioStreamFramer.hh StreamParser.hh MP3Internals.hh +include/MPEG1or2AudioStreamFramer.hh: include/FramedFilter.hh +MPEG1or2AudioRTPSource.$(CPP): include/MPEG1or2AudioRTPSource.hh +include/MPEG1or2AudioRTPSource.hh: include/MultiFramedRTPSource.hh +MPEG4LATMAudioRTPSource.$(CPP): include/MPEG4LATMAudioRTPSource.hh +include/MPEG4LATMAudioRTPSource.hh: include/MultiFramedRTPSource.hh +MPEG4ESVideoRTPSource.$(CPP): include/MPEG4ESVideoRTPSource.hh +include/MPEG4ESVideoRTPSource.hh: include/MultiFramedRTPSource.hh +MPEG4GenericRTPSource.$(CPP): include/MPEG4GenericRTPSource.hh include/BitVector.hh include/MPEG4LATMAudioRTPSource.hh +include/MPEG4GenericRTPSource.hh: include/MultiFramedRTPSource.hh +MP3FileSource.$(CPP): include/MP3FileSource.hh MP3StreamState.hh include/InputFile.hh +include/MP3FileSource.hh: include/FramedFileSource.hh +MP3StreamState.hh: MP3Internals.hh +MP3Internals.hh: include/BitVector.hh +MP3Transcoder.$(CPP): include/MP3ADU.hh include/MP3Transcoder.hh +include/MP3ADU.hh: include/FramedFilter.hh +include/MP3Transcoder.hh: include/MP3ADU.hh include/MP3ADUTranscoder.hh +include/MP3ADUTranscoder.hh: include/FramedFilter.hh +MP3ADU.$(CPP): include/MP3ADU.hh MP3ADUdescriptor.hh MP3Internals.hh +MP3ADUdescriptor.$(CPP): MP3ADUdescriptor.hh +MP3ADUinterleaving.$(CPP): include/MP3ADUinterleaving.hh MP3ADUdescriptor.hh +include/MP3ADUinterleaving.hh: include/FramedFilter.hh +MP3ADUTranscoder.$(CPP): include/MP3ADUTranscoder.hh MP3Internals.hh +MP3StreamState.$(CPP): MP3StreamState.hh include/InputFile.hh +MP3Internals.$(CPP): MP3InternalsHuffman.hh +MP3InternalsHuffman.hh: MP3Internals.hh +MP3InternalsHuffman.$(CPP): MP3InternalsHuffman.hh +MP3InternalsHuffmanTable.$(CPP): MP3InternalsHuffman.hh +MP3ADURTPSource.$(CPP): include/MP3ADURTPSource.hh MP3ADUdescriptor.hh +include/MP3ADURTPSource.hh: include/MultiFramedRTPSource.hh +MPEG1or2VideoRTPSource.$(CPP): include/MPEG1or2VideoRTPSource.hh +include/MPEG1or2VideoRTPSource.hh: include/MultiFramedRTPSource.hh +MPEG2TransportStreamMultiplexor.$(CPP): include/MPEG2TransportStreamMultiplexor.hh +include/MPEG2TransportStreamMultiplexor.hh: include/FramedSource.hh include/MPEG1or2Demux.hh +MPEG2TransportStreamFromPESSource.$(CPP): include/MPEG2TransportStreamFromPESSource.hh +include/MPEG2TransportStreamFromPESSource.hh: include/MPEG2TransportStreamMultiplexor.hh include/MPEG1or2DemuxedElementaryStream.hh +MPEG2TransportStreamFromESSource.$(CPP): include/MPEG2TransportStreamFromESSource.hh +include/MPEG2TransportStreamFromESSource.hh: include/MPEG2TransportStreamMultiplexor.hh +MPEG2TransportStreamFramer.$(CPP): include/MPEG2TransportStreamFramer.hh +include/MPEG2TransportStreamFramer.hh: include/FramedFilter.hh include/MPEG2TransportStreamIndexFile.hh +MPEG2TransportStreamAccumulator.$(CPP): include/MPEG2TransportStreamAccumulator.hh +include/MPEG2TransportStreamAccumulator.hh: include/FramedFilter.hh +ADTSAudioFileSource.$(CPP): include/ADTSAudioFileSource.hh include/InputFile.hh +ADTSAudioStreamDiscreteFramer.$(CPP): include/ADTSAudioStreamDiscreteFramer.hh +include/ADTSAudioStreamDiscreteFramer.hh: include/FramedFilter.hh +JPEGVideoSource.$(CPP): include/JPEGVideoSource.hh +include/JPEGVideoSource.hh: include/FramedSource.hh +JPEGVideoRTPSource.$(CPP): include/JPEGVideoRTPSource.hh +include/JPEGVideoRTPSource.hh: include/MultiFramedRTPSource.hh +#JPEG2000VideoStreamFramer.$(CPP): include/JPEG2000VideoStreamFramer.hh JPEG2000VideoStreamParser.hh +#include/JPEG2000VideoStreamFramer.hh: include/MPEGVideoStreamFramer.hh +#JPEG2000VideoStreamParser.hh: StreamParser.hh include/MPEGVideoStreamFramer.hh +#JPEG2000VideoStreamParser.$(CPP): JPEG2000VideoStreamParser.hh +JPEG2000VideoRTPSource.$(CPP): include/JPEG2000VideoRTPSource.hh +include/JPEG2000VideoRTPSource.hh: include/MultiFramedRTPSource.hh +include/ADTSAudioFileSource.hh: include/FramedFileSource.hh +H263plusVideoRTPSource.$(CPP): include/H263plusVideoRTPSource.hh +include/H263plusVideoRTPSource.hh: include/MultiFramedRTPSource.hh +H263plusVideoStreamFramer.$(CPP): include/H263plusVideoStreamFramer.hh H263plusVideoStreamParser.hh +include/H263plusVideoStreamFramer.hh: include/FramedFilter.hh +H263plusVideoStreamParser.hh: StreamParser.hh +H263plusVideoStreamParser.$(CPP): H263plusVideoStreamParser.hh include/H263plusVideoStreamFramer.hh +AC3AudioStreamFramer.$(CPP): include/AC3AudioStreamFramer.hh StreamParser.hh +include/AC3AudioStreamFramer.hh: include/FramedFilter.hh +AC3AudioRTPSource.$(CPP): include/AC3AudioRTPSource.hh +include/AC3AudioRTPSource.hh: include/MultiFramedRTPSource.hh +DVVideoRTPSource.$(CPP): include/DVVideoRTPSource.hh +include/DVVideoRTPSource.hh: include/MultiFramedRTPSource.hh +AMRAudioSource.$(CPP): include/AMRAudioSource.hh +include/AMRAudioSource.hh: include/FramedSource.hh +AMRAudioFileSource.$(CPP): include/AMRAudioFileSource.hh include/InputFile.hh +include/AMRAudioFileSource.hh: include/AMRAudioSource.hh +InputFile.$(CPP): include/InputFile.hh +StreamReplicator.$(CPP): include/StreamReplicator.hh +include/StreamReplicator.hh: include/FramedSource.hh +MediaSink.$(CPP): include/MediaSink.hh +include/MediaSink.hh: include/FramedSource.hh +FileSink.$(CPP): include/FileSink.hh include/OutputFile.hh +include/FileSink.hh: include/MediaSink.hh +BasicUDPSink.$(CPP): include/BasicUDPSink.hh +include/BasicUDPSink.hh: include/MediaSink.hh +AMRAudioFileSink.$(CPP): include/AMRAudioFileSink.hh include/AMRAudioSource.hh include/OutputFile.hh +include/AMRAudioFileSink.hh: include/FileSink.hh +H264or5VideoFileSink.$(CPP): include/H264or5VideoFileSink.hh include/H264VideoRTPSource.hh +include/H264or5VideoFileSink.hh: include/FileSink.hh +H264VideoFileSink.$(CPP): include/H264VideoFileSink.hh include/OutputFile.hh +include/H264VideoFileSink.hh: include/H264or5VideoFileSink.hh +H265VideoFileSink.$(CPP): include/H265VideoFileSink.hh include/OutputFile.hh +include/H265VideoFileSink.hh: include/H264or5VideoFileSink.hh +OggFileSink.$(CPP): include/OggFileSink.hh include/OutputFile.hh include/VorbisAudioRTPSource.hh include/MPEG2TransportStreamMultiplexor.hh include/FramedSource.hh +include/OggFileSink.hh: include/FileSink.hh +RTPSink.$(CPP): include/RTPSink.hh include/Base64.hh +include/RTPSink.hh: include/MediaSink.hh include/RTPInterface.hh include/SRTPCryptographicContext.hh +MultiFramedRTPSink.$(CPP): include/MultiFramedRTPSink.hh +include/MultiFramedRTPSink.hh: include/RTPSink.hh +AudioRTPSink.$(CPP): include/AudioRTPSink.hh +include/AudioRTPSink.hh: include/MultiFramedRTPSink.hh +VideoRTPSink.$(CPP): include/VideoRTPSink.hh +include/VideoRTPSink.hh: include/MultiFramedRTPSink.hh +TextRTPSink.$(CPP): include/TextRTPSink.hh +include/TextRTPSink.hh: include/MultiFramedRTPSink.hh +RTPInterface.$(CPP): include/RTPInterface.hh +MPEG1or2AudioRTPSink.$(CPP): include/MPEG1or2AudioRTPSink.hh +include/MPEG1or2AudioRTPSink.hh: include/AudioRTPSink.hh +MP3ADURTPSink.$(CPP): include/MP3ADURTPSink.hh +include/MP3ADURTPSink.hh: include/AudioRTPSink.hh +MPEG1or2VideoRTPSink.$(CPP): include/MPEG1or2VideoRTPSink.hh include/MPEG1or2VideoStreamFramer.hh +include/MPEG1or2VideoRTPSink.hh: include/VideoRTPSink.hh +MPEG4LATMAudioRTPSink.$(CPP): include/MPEG4LATMAudioRTPSink.hh +include/MPEG4LATMAudioRTPSink.hh: include/AudioRTPSink.hh +MPEG4GenericRTPSink.$(CPP): include/MPEG4GenericRTPSink.hh include/Locale.hh +include/MPEG4GenericRTPSink.hh: include/MultiFramedRTPSink.hh +MPEG4ESVideoRTPSink.$(CPP): include/MPEG4ESVideoRTPSink.hh include/MPEG4VideoStreamFramer.hh include/MPEG4LATMAudioRTPSource.hh +include/MPEG4ESVideoRTPSink.hh: include/VideoRTPSink.hh +JPEGVideoRTPSink.$(CPP): include/JPEGVideoRTPSink.hh include/JPEGVideoSource.hh +include/JPEGVideoRTPSink.hh: include/VideoRTPSink.hh +JPEG2000VideoRTPSink.$(CPP): include/JPEG2000VideoRTPSink.hh +include/JPEG2000VideoRTPSink.hh: include/VideoRTPSink.hh +H263plusVideoRTPSink.$(CPP): include/H263plusVideoRTPSink.hh +include/H263plusVideoRTPSink.hh: include/VideoRTPSink.hh +H264or5VideoRTPSink.$(CPP): include/H264or5VideoRTPSink.hh include/H264or5VideoStreamFramer.hh +include/H264or5VideoRTPSink.hh: include/VideoRTPSink.hh include/FramedFilter.hh +H264VideoRTPSink.$(CPP): include/H264VideoRTPSink.hh include/H264VideoStreamFramer.hh include/Base64.hh include/H264VideoRTPSource.hh +include/H264VideoRTPSink.hh: include/H264or5VideoRTPSink.hh +H265VideoRTPSink.$(CPP): include/H265VideoRTPSink.hh include/H265VideoStreamFramer.hh include/Base64.hh include/BitVector.hh include/H264VideoRTPSource.hh +include/H265VideoRTPSink.hh: include/H264or5VideoRTPSink.hh +DVVideoRTPSink.$(CPP): include/DVVideoRTPSink.hh +include/DVVideoRTPSink.hh: include/VideoRTPSink.hh include/DVVideoStreamFramer.hh +include/DVVideoStreamFramer.hh: include/FramedFilter.hh +AC3AudioRTPSink.$(CPP): include/AC3AudioRTPSink.hh +include/AC3AudioRTPSink.hh: include/AudioRTPSink.hh +VorbisAudioRTPSink.$(CPP): include/VorbisAudioRTPSink.hh include/Base64.hh include/VorbisAudioRTPSource.hh +include/VorbisAudioRTPSink.hh: include/AudioRTPSink.hh +TheoraVideoRTPSink.$(CPP): include/TheoraVideoRTPSink.hh include/Base64.hh include/VorbisAudioRTPSource.hh include/VorbisAudioRTPSink.hh +include/TheoraVideoRTPSink.hh: include/VideoRTPSink.hh +RawVideoRTPSink.$(CPP): include/RawVideoRTPSink.hh +include/RawVideoRTPSink.hh: include/VideoRTPSink.hh include/RawVideoFrameParameters.hh +VP8VideoRTPSink.$(CPP): include/VP8VideoRTPSink.hh +include/VP8VideoRTPSink.hh: include/VideoRTPSink.hh +VP9VideoRTPSink.$(CPP): include/VP9VideoRTPSink.hh +include/VP9VideoRTPSink.hh: include/VideoRTPSink.hh +GSMAudioRTPSink.$(CPP): include/GSMAudioRTPSink.hh +include/GSMAudioRTPSink.hh: include/AudioRTPSink.hh +SimpleRTPSink.$(CPP): include/SimpleRTPSink.hh +include/SimpleRTPSink.hh: include/MultiFramedRTPSink.hh +AMRAudioRTPSink.$(CPP): include/AMRAudioRTPSink.hh include/AMRAudioSource.hh +include/AMRAudioRTPSink.hh: include/AudioRTPSink.hh +T140TextRTPSink.$(CPP): include/T140TextRTPSink.hh +include/T140TextRTPSink.hh: include/TextRTPSink.hh include/FramedFilter.hh +OutputFile.$(CPP): include/OutputFile.hh +uLawAudioFilter.$(CPP): include/uLawAudioFilter.hh +include/uLawAudioFilter.hh: include/FramedFilter.hh +MPEG2IndexFromTransportStream.$(CPP): include/MPEG2IndexFromTransportStream.hh +include/MPEG2IndexFromTransportStream.hh: include/FramedFilter.hh +MPEG2TransportStreamIndexFile.$(CPP): include/MPEG2TransportStreamIndexFile.hh include/InputFile.hh +include/MPEG2TransportStreamIndexFile.hh: include/Media.hh +MPEG2TransportStreamTrickModeFilter.$(CPP): include/MPEG2TransportStreamTrickModeFilter.hh include/ByteStreamFileSource.hh +include/MPEG2TransportStreamTrickModeFilter.hh: include/FramedFilter.hh include/MPEG2TransportStreamIndexFile.hh +RTCP.$(CPP): include/RTCP.hh rtcp_from_spec.h +include/RTCP.hh: include/RTPSink.hh include/RTPSource.hh include/SRTPCryptographicContext.hh +rtcp_from_spec.$(C): rtcp_from_spec.h +GenericMediaServer.$(CPP): include/GenericMediaServer.hh +include/GenericMediaServer.hh: include/ServerMediaSession.hh +RTSPServer.$(CPP): include/RTSPServer.hh include/RTSPCommon.hh include/RTSPRegisterSender.hh include/ProxyServerMediaSession.hh include/Base64.hh +include/RTSPServer.hh: include/GenericMediaServer.hh include/DigestAuthentication.hh +RTSPServerRegister.$(CPP): include/RTSPServer.hh +include/ServerMediaSession.hh: include/RTCP.hh +RTSPClient.$(CPP): include/RTSPClient.hh include/RTSPCommon.hh include/Base64.hh include/Locale.hh include/ourMD5.hh +include/RTSPClient.hh: include/MediaSession.hh include/DigestAuthentication.hh +RTSPCommon.$(CPP): include/RTSPCommon.hh include/Locale.hh +RTSPRegisterSender.$(CPP): include/RTSPRegisterSender.hh +include/RTSPRegisterSender.hh: include/RTSPClient.hh +SIPClient.$(CPP): include/SIPClient.hh +include/SIPClient.hh: include/MediaSession.hh include/DigestAuthentication.hh +MediaSession.$(CPP): include/liveMedia.hh include/Locale.hh include/Base64.hh +include/MediaSession.hh: include/RTCP.hh include/FramedFilter.hh include/SRTPCryptographicContext.hh +ServerMediaSession.$(CPP): include/ServerMediaSession.hh +PassiveServerMediaSubsession.$(CPP): include/PassiveServerMediaSubsession.hh +include/PassiveServerMediaSubsession.hh: include/ServerMediaSession.hh include/RTPSink.hh include/RTCP.hh +OnDemandServerMediaSubsession.$(CPP): include/OnDemandServerMediaSubsession.hh +include/OnDemandServerMediaSubsession.hh: include/ServerMediaSession.hh include/RTPSink.hh include/BasicUDPSink.hh include/RTCP.hh +FileServerMediaSubsession.$(CPP): include/FileServerMediaSubsession.hh +include/FileServerMediaSubsession.hh: include/OnDemandServerMediaSubsession.hh +MPEG4VideoFileServerMediaSubsession.$(CPP): include/MPEG4VideoFileServerMediaSubsession.hh include/MPEG4ESVideoRTPSink.hh include/ByteStreamFileSource.hh include/MPEG4VideoStreamFramer.hh +include/MPEG4VideoFileServerMediaSubsession.hh: include/FileServerMediaSubsession.hh +H264VideoFileServerMediaSubsession.$(CPP): include/H264VideoFileServerMediaSubsession.hh include/H264VideoRTPSink.hh include/ByteStreamFileSource.hh include/H264VideoStreamFramer.hh +include/H264VideoFileServerMediaSubsession.hh: include/FileServerMediaSubsession.hh +H265VideoFileServerMediaSubsession.$(CPP): include/H265VideoFileServerMediaSubsession.hh include/H265VideoRTPSink.hh include/ByteStreamFileSource.hh include/H265VideoStreamFramer.hh +include/H265VideoFileServerMediaSubsession.hh: include/FileServerMediaSubsession.hh +H263plusVideoFileServerMediaSubsession.$(CPP): include/H263plusVideoFileServerMediaSubsession.hh include/H263plusVideoRTPSink.hh include/ByteStreamFileSource.hh include/H263plusVideoStreamFramer.hh +include/H263plusVideoFileServerMediaSubsession.hh: include/FileServerMediaSubsession.hh +WAVAudioFileServerMediaSubsession.$(CPP): include/WAVAudioFileServerMediaSubsession.hh include/WAVAudioFileSource.hh include/uLawAudioFilter.hh include/SimpleRTPSink.hh +include/WAVAudioFileServerMediaSubsession.hh: include/FileServerMediaSubsession.hh +AMRAudioFileServerMediaSubsession.$(CPP): include/AMRAudioFileServerMediaSubsession.hh include/AMRAudioRTPSink.hh include/AMRAudioFileSource.hh +include/AMRAudioFileServerMediaSubsession.hh: include/FileServerMediaSubsession.hh +MP3AudioFileServerMediaSubsession.$(CPP): include/MP3AudioFileServerMediaSubsession.hh include/MPEG1or2AudioRTPSink.hh include/MP3ADURTPSink.hh include/MP3FileSource.hh include/MP3ADU.hh +include/MP3AudioFileServerMediaSubsession.hh: include/FileServerMediaSubsession.hh include/MP3ADUinterleaving.hh +MPEG1or2VideoFileServerMediaSubsession.$(CPP): include/MPEG1or2VideoFileServerMediaSubsession.hh include/MPEG1or2VideoRTPSink.hh include/ByteStreamFileSource.hh include/MPEG1or2VideoStreamFramer.hh +include/MPEG1or2VideoFileServerMediaSubsession.hh: include/FileServerMediaSubsession.hh +MPEG1or2FileServerDemux.$(CPP): include/MPEG1or2FileServerDemux.hh include/MPEG1or2DemuxedServerMediaSubsession.hh include/ByteStreamFileSource.hh +include/MPEG1or2FileServerDemux.hh: include/ServerMediaSession.hh include/MPEG1or2DemuxedElementaryStream.hh +MPEG1or2DemuxedServerMediaSubsession.$(CPP): include/MPEG1or2DemuxedServerMediaSubsession.hh include/MPEG1or2AudioStreamFramer.hh include/MPEG1or2AudioRTPSink.hh include/MPEG1or2VideoStreamFramer.hh include/MPEG1or2VideoRTPSink.hh include/AC3AudioStreamFramer.hh include/AC3AudioRTPSink.hh include/ByteStreamFileSource.hh +include/MPEG1or2DemuxedServerMediaSubsession.hh: include/OnDemandServerMediaSubsession.hh include/MPEG1or2FileServerDemux.hh +MPEG2TransportFileServerMediaSubsession.$(CPP): include/MPEG2TransportFileServerMediaSubsession.hh include/SimpleRTPSink.hh +include/MPEG2TransportFileServerMediaSubsession.hh: include/FileServerMediaSubsession.hh include/MPEG2TransportStreamFramer.hh include/ByteStreamFileSource.hh include/MPEG2TransportStreamTrickModeFilter.hh include/MPEG2TransportStreamFromESSource.hh +ADTSAudioFileServerMediaSubsession.$(CPP): include/ADTSAudioFileServerMediaSubsession.hh include/ADTSAudioFileSource.hh include/MPEG4GenericRTPSink.hh +include/ADTSAudioFileServerMediaSubsession.hh: include/FileServerMediaSubsession.hh +DVVideoFileServerMediaSubsession.$(CPP): include/DVVideoFileServerMediaSubsession.hh include/DVVideoRTPSink.hh include/ByteStreamFileSource.hh include/DVVideoStreamFramer.hh +include/DVVideoFileServerMediaSubsession.hh: include/FileServerMediaSubsession.hh +AC3AudioFileServerMediaSubsession.$(CPP): include/AC3AudioFileServerMediaSubsession.hh include/AC3AudioRTPSink.hh include/ByteStreamFileSource.hh include/AC3AudioStreamFramer.hh +include/AC3AudioFileServerMediaSubsession.hh: include/FileServerMediaSubsession.hh +#JPEG2000VideoFileServerMediaSubsession.$(CPP): include/JPEG2000VideoFileServerMediaSubsession.hh +#include/JPEG2000VideoFileServerMediaSubsession.hh: include/FileServerMediaSubsession.hh +MPEG2TransportUDPServerMediaSubsession.$(CPP): include/MPEG2TransportUDPServerMediaSubsession.hh include/BasicUDPSource.hh include/SimpleRTPSource.hh include/MPEG2TransportStreamFramer.hh include/SimpleRTPSink.hh +include/MPEG2TransportUDPServerMediaSubsession.hh: include/OnDemandServerMediaSubsession.hh +ProxyServerMediaSession.$(CPP): include/liveMedia.hh include/RTSPCommon.hh +include/ProxyServerMediaSession.hh: include/ServerMediaSession.hh include/MediaSession.hh include/RTSPClient.hh include/MediaTranscodingTable.hh +include/MediaTranscodingTable.hh: include/FramedFilter.hh include/MediaSession.hh +QuickTimeFileSink.$(CPP): include/QuickTimeFileSink.hh include/InputFile.hh include/OutputFile.hh include/QuickTimeGenericRTPSource.hh include/H263plusVideoRTPSource.hh include/MPEG4GenericRTPSource.hh include/MPEG4LATMAudioRTPSource.hh +include/QuickTimeFileSink.hh: include/MediaSession.hh +QuickTimeGenericRTPSource.$(CPP): include/QuickTimeGenericRTPSource.hh +include/QuickTimeGenericRTPSource.hh: include/MultiFramedRTPSource.hh +AVIFileSink.$(CPP): include/AVIFileSink.hh include/InputFile.hh include/OutputFile.hh +include/AVIFileSink.hh: include/MediaSession.hh +MatroskaFile.$(CPP): MatroskaFileParser.hh MatroskaDemuxedTrack.hh include/ByteStreamFileSource.hh include/H264VideoStreamDiscreteFramer.hh include/H265VideoStreamDiscreteFramer.hh include/MPEG1or2AudioRTPSink.hh include/MPEG4GenericRTPSink.hh include/AC3AudioRTPSink.hh include/SimpleRTPSink.hh include/VorbisAudioRTPSink.hh include/H264VideoRTPSink.hh include/H265VideoRTPSink.hh include/VP8VideoRTPSink.hh include/VP9VideoRTPSink.hh include/T140TextRTPSink.hh include/Base64.hh include/H264VideoFileSink.hh include/H265VideoFileSink.hh include/AMRAudioFileSink.hh include/OggFileSink.hh +MatroskaFileParser.hh: StreamParser.hh include/MatroskaFile.hh EBMLNumber.hh +include/MatroskaFile.hh: include/RTPSink.hh include/FileSink.hh +MatroskaDemuxedTrack.hh: include/FramedSource.hh +MatroskaFileParser.$(CPP): MatroskaFileParser.hh MatroskaDemuxedTrack.hh include/ByteStreamFileSource.hh +EBMLNumber.$(CPP): EBMLNumber.hh +MatroskaDemuxedTrack.$(CPP): MatroskaDemuxedTrack.hh include/MatroskaFile.hh +MatroskaFileServerMediaSubsession.$(CPP): MatroskaFileServerMediaSubsession.hh MatroskaDemuxedTrack.hh include/FramedFilter.hh +MatroskaFileServerMediaSubsession.hh: include/FileServerMediaSubsession.hh include/MatroskaFileServerDemux.hh +MP3AudioMatroskaFileServerMediaSubsession.$(CPP): MP3AudioMatroskaFileServerMediaSubsession.hh MatroskaDemuxedTrack.hh +MP3AudioMatroskaFileServerMediaSubsession.hh: include/MP3AudioFileServerMediaSubsession.hh include/MatroskaFileServerDemux.hh +MatroskaFileServerDemux.$(CPP): include/MatroskaFileServerDemux.hh MP3AudioMatroskaFileServerMediaSubsession.hh MatroskaFileServerMediaSubsession.hh +include/MatroskaFileServerDemux.hh: include/ServerMediaSession.hh include/MatroskaFile.hh +OggFile.$(CPP): OggFileParser.hh OggDemuxedTrack.hh include/ByteStreamFileSource.hh include/VorbisAudioRTPSink.hh include/SimpleRTPSink.hh include/TheoraVideoRTPSink.hh +OggFileParser.hh: StreamParser.hh include/OggFile.hh +include/OggFile.hh: include/RTPSink.hh +OggDemuxedTrack.hh: include/FramedSource.hh +OggFileParser.$(CPP): OggFileParser.hh OggDemuxedTrack.hh +OggDemuxedTrack.$(CPP): OggDemuxedTrack.hh include/OggFile.hh +OggFileServerMediaSubsession.$(CPP): OggFileServerMediaSubsession.hh OggDemuxedTrack.hh include/FramedFilter.hh +OggFileServerMediaSubsession.hh: include/FileServerMediaSubsession.hh include/OggFileServerDemux.hh +OggFileServerDemux.$(CPP): include/OggFileServerDemux.hh OggFileServerMediaSubsession.hh +include/OggFileServerDemux.hh: include/ServerMediaSession.hh include/OggFile.hh +MPEG2TransportStreamDemux.$(CPP): include/MPEG2TransportStreamDemux.hh MPEG2TransportStreamParser.hh +include/MPEG2TransportStreamDemux.hh: include/FramedSource.hh +MPEG2TransportStreamParser.hh: StreamParser.hh MPEG2TransportStreamDemuxedTrack.hh include/MediaSink.hh +MPEG2TransportStreamDemuxedTrack.hh: include/MPEG2TransportStreamDemux.hh +MPEG2TransportStreamDemuxedTrack.$(CPP): MPEG2TransportStreamParser.hh +MPEG2TransportStreamParser.$(CPP): MPEG2TransportStreamParser.hh +MPEG2TransportStreamParser_PAT.$(CPP): MPEG2TransportStreamParser.hh +MPEG2TransportStreamParser_PMT.$(CPP): MPEG2TransportStreamParser.hh +MPEG2TransportStreamParser_STREAM.$(CPP): MPEG2TransportStreamParser.hh include/FileSink.hh +HLSSegmenter.$(CPP): include/HLSSegmenter.hh include/OutputFile.hh include/MPEG2TransportStreamMultiplexor.hh +include/HLSSegmenter.hh: include/MediaSink.hh +TLSState.$(CPP): include/TLSState.hh include/RTSPClient.hh +MIKEY.$(CPP): include/MIKEY.hh +HMAC_SHA1.$(CPP): include/HMAC_SHA1.hh +include/SRTPCryptographicContext.hh: include/MIKEY.hh +SRTPCryptographicContext.$(CPP): include/SRTPCryptographicContext.hh include/HMAC_SHA1.hh +include/HMAC_SHA1.hh: include/HMAC_hash.hh +BitVector.$(CPP): include/BitVector.hh +StreamParser.$(CPP): StreamParser.hh +DigestAuthentication.$(CPP): include/DigestAuthentication.hh include/ourMD5.hh +ourMD5.$(CPP): include/ourMD5.hh +Base64.$(CPP): include/Base64.hh +Locale.$(CPP): include/Locale.hh + +include/liveMedia.hh:: include/JPEG2000VideoRTPSource.hh include/JPEG2000VideoRTPSink.hh +#include/liveMedia.hh:: include/JPEG2000VideoStreamFramer.hh include/JPEG2000VideoFileServerMediaSubsession.hh + +include/liveMedia.hh:: include/MPEG1or2AudioRTPSink.hh include/MP3ADURTPSink.hh include/MPEG1or2VideoRTPSink.hh include/MPEG4ESVideoRTPSink.hh include/BasicUDPSink.hh include/AMRAudioFileSink.hh include/H264VideoFileSink.hh include/H265VideoFileSink.hh include/OggFileSink.hh include/GSMAudioRTPSink.hh include/H263plusVideoRTPSink.hh include/H264VideoRTPSink.hh include/H265VideoRTPSink.hh include/DVVideoRTPSource.hh include/DVVideoRTPSink.hh include/DVVideoStreamFramer.hh include/H264VideoStreamFramer.hh include/H265VideoStreamFramer.hh include/H264VideoStreamDiscreteFramer.hh include/H265VideoStreamDiscreteFramer.hh include/JPEGVideoRTPSink.hh include/SimpleRTPSink.hh include/uLawAudioFilter.hh include/MPEG2IndexFromTransportStream.hh include/MPEG2TransportStreamTrickModeFilter.hh include/ByteStreamMultiFileSource.hh include/ByteStreamMemoryBufferSource.hh include/BasicUDPSource.hh include/SimpleRTPSource.hh include/MPEG1or2AudioRTPSource.hh include/MPEG4LATMAudioRTPSource.hh include/MPEG4LATMAudioRTPSink.hh include/MPEG4ESVideoRTPSource.hh include/MPEG4GenericRTPSource.hh include/MP3ADURTPSource.hh include/QCELPAudioRTPSource.hh include/AMRAudioRTPSource.hh include/JPEGVideoRTPSource.hh include/JPEGVideoSource.hh include/MPEG1or2VideoRTPSource.hh include/VorbisAudioRTPSource.hh include/TheoraVideoRTPSource.hh include/VP8VideoRTPSource.hh include/VP9VideoRTPSource.hh include/RawVideoRTPSource.hh + +include/liveMedia.hh:: include/MPEG2TransportStreamFromPESSource.hh include/MPEG2TransportStreamFromESSource.hh include/MPEG2TransportStreamFramer.hh include/ADTSAudioFileSource.hh include/ADTSAudioStreamDiscreteFramer.hh include/H261VideoRTPSource.hh include/H263plusVideoRTPSource.hh include/H264VideoRTPSource.hh include/H265VideoRTPSource.hh include/MP3FileSource.hh include/MP3ADU.hh include/MP3ADUinterleaving.hh include/MP3Transcoder.hh include/MPEG1or2DemuxedElementaryStream.hh include/MPEG1or2AudioStreamFramer.hh include/MPEG1or2VideoStreamDiscreteFramer.hh include/MPEG4VideoStreamDiscreteFramer.hh include/H263plusVideoStreamFramer.hh include/AC3AudioStreamFramer.hh include/AC3AudioRTPSource.hh include/AC3AudioRTPSink.hh include/VorbisAudioRTPSink.hh include/TheoraVideoRTPSink.hh include/VP8VideoRTPSink.hh include/VP9VideoRTPSink.hh include/MPEG4GenericRTPSink.hh include/DeviceSource.hh include/AudioInputDevice.hh include/WAVAudioFileSource.hh include/StreamReplicator.hh include/RTSPRegisterSender.hh + +include/liveMedia.hh:: include/RTSPClient.hh include/SIPClient.hh include/QuickTimeFileSink.hh include/QuickTimeGenericRTPSource.hh include/AVIFileSink.hh include/PassiveServerMediaSubsession.hh include/MPEG4VideoFileServerMediaSubsession.hh include/H264VideoFileServerMediaSubsession.hh include/H265VideoFileServerMediaSubsession.hh include/WAVAudioFileServerMediaSubsession.hh include/AMRAudioFileServerMediaSubsession.hh include/AMRAudioFileSource.hh include/AMRAudioRTPSink.hh include/T140TextRTPSink.hh include/MP3AudioFileServerMediaSubsession.hh include/MPEG1or2VideoFileServerMediaSubsession.hh include/MPEG1or2FileServerDemux.hh include/MPEG2TransportFileServerMediaSubsession.hh include/H263plusVideoFileServerMediaSubsession.hh include/ADTSAudioFileServerMediaSubsession.hh include/DVVideoFileServerMediaSubsession.hh include/AC3AudioFileServerMediaSubsession.hh include/MPEG2TransportUDPServerMediaSubsession.hh include/MatroskaFileServerDemux.hh include/OggFileServerDemux.hh include/ProxyServerMediaSession.hh include/HLSSegmenter.hh include/MPEG2TransportStreamAccumulator.hh + +clean: + -rm -rf *.$(OBJ) $(ALL) core *.core *~ include/*~ + +install: install1 $(INSTALL2) +install1: $(LIVEMEDIA_LIB) + install -d $(DESTDIR)$(PREFIX)/include/liveMedia $(DESTDIR)$(LIBDIR) + install -m 644 include/*.hh $(DESTDIR)$(PREFIX)/include/liveMedia + install -m 644 $(LIVEMEDIA_LIB) $(DESTDIR)$(LIBDIR) +install_shared_libraries: $(LIVEMEDIA_LIB) + ln -fs $(NAME).$(LIB_SUFFIX) $(DESTDIR)$(LIBDIR)/$(NAME).$(SHORT_LIB_SUFFIX) + ln -fs $(NAME).$(LIB_SUFFIX) $(DESTDIR)$(LIBDIR)/$(NAME).so + +##### Any additional, platform-specific rules come here: diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MatroskaDemuxedTrack.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MatroskaDemuxedTrack.cpp new file mode 100644 index 000000000..117d8ad47 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MatroskaDemuxedTrack.cpp @@ -0,0 +1,56 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A media track, demultiplexed from a Matroska file +// Implementation + +#include "MatroskaDemuxedTrack.hh" +#include "MatroskaFile.hh" + +void MatroskaDemuxedTrack::seekToTime(double& seekNPT) { + fOurSourceDemux.seekToTime(seekNPT); +} + +MatroskaDemuxedTrack::MatroskaDemuxedTrack(UsageEnvironment& env, unsigned trackNumber, MatroskaDemux& sourceDemux) + : FramedSource(env), + fOurTrackNumber(trackNumber), fOurSourceDemux(sourceDemux), + fOpusFrameNumber(0) { + reset(); +} + +MatroskaDemuxedTrack::~MatroskaDemuxedTrack() { + fOurSourceDemux.removeTrack(fOurTrackNumber); +} + +void MatroskaDemuxedTrack::doGetNextFrame() { + fOurSourceDemux.continueReading(); +} + +void MatroskaDemuxedTrack::doStopGettingFrames() { + fOurSourceDemux.pause(); +} + +char const* MatroskaDemuxedTrack::MIMEtype() const { + MatroskaTrack* track = fOurSourceDemux.fOurFile.lookup(fOurTrackNumber); + if (track == NULL) return "(unknown)"; // shouldn't happen + return track->mimeType; +} + +void MatroskaDemuxedTrack::reset() { + fPrevPresentationTime.tv_sec = 0; fPrevPresentationTime.tv_usec = 0; + fDurationImbalance = 0; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MatroskaDemuxedTrack.hh b/src/big/mpp/middleware/src/live555/liveMedia/MatroskaDemuxedTrack.hh new file mode 100644 index 000000000..7ab4dba77 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MatroskaDemuxedTrack.hh @@ -0,0 +1,66 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A media track, demultiplexed from a Matroska file +// C++ header + +#ifndef _MATROSKA_DEMUXED_TRACK_HH +#define _MATROSKA_DEMUXED_TRACK_HH + +#ifndef _FRAMED_SOURCE_HH +#include "FramedSource.hh" +#endif + +class MatroskaDemux; // forward + +class MatroskaDemuxedTrack: public FramedSource { +public: + void seekToTime(double& seekNPT); + +private: // We are created only by a MatroskaDemux (a friend) + friend class MatroskaDemux; + MatroskaDemuxedTrack(UsageEnvironment& env, unsigned trackNumber, MatroskaDemux& sourceDemux); + virtual ~MatroskaDemuxedTrack(); + +private: + // redefined virtual functions: + virtual void doGetNextFrame(); + virtual void doStopGettingFrames(); + virtual char const* MIMEtype() const; + +private: // We are accessed only by MatroskaDemux and by MatroskaFileParser (a friend) + friend class MatroskaFileParser; + unsigned char* to() { return fTo; } + unsigned maxSize() { return fMaxSize; } + unsigned& frameSize() { return fFrameSize; } + unsigned& numTruncatedBytes() { return fNumTruncatedBytes; } + struct timeval& presentationTime() { return fPresentationTime; } + unsigned& durationInMicroseconds() { return fDurationInMicroseconds; } + + struct timeval& prevPresentationTime() { return fPrevPresentationTime; } + int& durationImbalance() { return fDurationImbalance; } + void reset(); + +private: + unsigned fOurTrackNumber; + MatroskaDemux& fOurSourceDemux; + struct timeval fPrevPresentationTime; + int fDurationImbalance; + unsigned fOpusFrameNumber; // hack for Opus audio +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MatroskaFile.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MatroskaFile.cpp new file mode 100644 index 000000000..69dda4258 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MatroskaFile.cpp @@ -0,0 +1,1083 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A class that encapsulates a Matroska file. +// Implementation + +#include "MatroskaFileParser.hh" +#include "MatroskaDemuxedTrack.hh" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +////////// CuePoint definition ////////// + +class CuePoint { +public: + CuePoint(double cueTime, u_int64_t clusterOffsetInFile, unsigned blockNumWithinCluster/* 1-based */); + virtual ~CuePoint(); + + static void addCuePoint(CuePoint*& root, double cueTime, u_int64_t clusterOffsetInFile, unsigned blockNumWithinCluster/* 1-based */, + Boolean& needToReviseBalanceOfParent); + // If "cueTime" == "root.fCueTime", replace the existing data, otherwise add to the left or right subtree. + // (Note that this is a static member function because - as a result of tree rotation - "root" might change.) + + Boolean lookup(double& cueTime, u_int64_t& resultClusterOffsetInFile, unsigned& resultBlockNumWithinCluster); + + static void fprintf(FILE* fid, CuePoint* cuePoint); // used for debugging; it's static to allow for "cuePoint == NULL" + +private: + // The "CuePoint" tree is implemented as an AVL Tree, to keep it balanced (for efficient lookup). + CuePoint* fSubTree[2]; // 0 => left; 1 => right + CuePoint* left() const { return fSubTree[0]; } + CuePoint* right() const { return fSubTree[1]; } + char fBalance; // height of right subtree - height of left subtree + + static void rotate(unsigned direction/*0 => left; 1 => right*/, CuePoint*& root); // used to keep the tree in balance + + double fCueTime; + u_int64_t fClusterOffsetInFile; + unsigned fBlockNumWithinCluster; // 0-based +}; + +UsageEnvironment& operator<<(UsageEnvironment& env, const CuePoint* cuePoint); // used for debugging + + +////////// MatroskaTrackTable definition ///////// + +// For looking up and iterating over the file's tracks: +class MatroskaTrackTable { +public: + MatroskaTrackTable(); + virtual ~MatroskaTrackTable(); + + void add(MatroskaTrack* newTrack, unsigned trackNumber); + MatroskaTrack* lookup(unsigned trackNumber); + + unsigned numTracks() const; + + class Iterator { + public: + Iterator(MatroskaTrackTable& ourTable); + virtual ~Iterator(); + MatroskaTrack* next(); + private: + HashTable::Iterator* fIter; + }; + +private: + friend class Iterator; + HashTable* fTable; +}; + + + +////////// MatroskaFile implementation ////////// + +void MatroskaFile +::createNew(UsageEnvironment& env, char const* fileName, onCreationFunc* onCreation, void* onCreationClientData, + char const* preferredLanguage) { + new MatroskaFile(env, fileName, onCreation, onCreationClientData, preferredLanguage); +} + +MatroskaFile::MatroskaFile(UsageEnvironment& env, char const* fileName, onCreationFunc* onCreation, void* onCreationClientData, + char const* preferredLanguage) + : Medium(env), + fFileName(strDup(fileName)), fOnCreation(onCreation), fOnCreationClientData(onCreationClientData), + fPreferredLanguage(strDup(preferredLanguage)), + fTimecodeScale(1000000), fSegmentDuration(0.0), fSegmentDataOffset(0), fClusterOffset(0), fCuesOffset(0), fCuePoints(NULL), + fChosenVideoTrackNumber(0), fChosenAudioTrackNumber(0), fChosenSubtitleTrackNumber(0) { + fTrackTable = new MatroskaTrackTable; + fDemuxesTable = HashTable::create(ONE_WORD_HASH_KEYS); + + FramedSource* inputSource = ByteStreamFileSource::createNew(envir(), fileName); + if (inputSource == NULL) { + // The specified input file does not exist! + fParserForInitialization = NULL; + handleEndOfTrackHeaderParsing(); // we have no file, and thus no tracks, but we still need to signal this + } else { + // Initialize ourselves by parsing the file's 'Track' headers: + fParserForInitialization = new MatroskaFileParser(*this, inputSource, handleEndOfTrackHeaderParsing, this, NULL); + } +} + +struct DemuxRecord { + MatroskaDemux* demux; + MatroskaDemuxOnDeletionFunc* onDeletionFunc; + void* objectToNotify; +}; + +MatroskaFile::~MatroskaFile() { + delete fParserForInitialization; + delete fCuePoints; + + // Delete any outstanding "MatroskaDemux"s, and the table for them: + DemuxRecord* demuxRecord; + while ((demuxRecord = (DemuxRecord*)fDemuxesTable->RemoveNext()) != NULL) { + delete demuxRecord->demux; + delete demuxRecord; + } + delete fDemuxesTable; + delete fTrackTable; + + delete[] (char*)fPreferredLanguage; + delete[] (char*)fFileName; +} + +void MatroskaFile::handleEndOfTrackHeaderParsing(void* clientData) { + ((MatroskaFile*)clientData)->handleEndOfTrackHeaderParsing(); +} + +class TrackChoiceRecord { +public: + unsigned trackNumber; + u_int8_t trackType; + unsigned choiceFlags; +}; + +void MatroskaFile::handleEndOfTrackHeaderParsing() { + // Having parsed all of our track headers, iterate through the tracks to figure out which ones should be played. + // The Matroska 'specification' is rather imprecise about this (as usual). However, we use the following algorithm: + // - Use one (but no more) enabled track of each type (video, audio, subtitle). (Ignore all tracks that are not 'enabled'.) + // - For each track type, choose the one that's 'forced'. + // - If more than one is 'forced', choose the first one that matches our preferred language, or the first if none matches. + // - If none is 'forced', choose the one that's 'default'. + // - If more than one is 'default', choose the first one that matches our preferred language, or the first if none matches. + // - If none is 'default', choose the first one that matches our preferred language, or the first if none matches. + unsigned numTracks = fTrackTable->numTracks(); + if (numTracks > 0) { + TrackChoiceRecord* trackChoice = new TrackChoiceRecord[numTracks]; + unsigned numEnabledTracks = 0; + MatroskaTrackTable::Iterator iter(*fTrackTable); + MatroskaTrack* track; + while ((track = iter.next()) != NULL) { + if (!track->isEnabled || track->trackType == 0 || track->mimeType[0] == '\0') continue; // track not enabled, or not fully-defined + + trackChoice[numEnabledTracks].trackNumber = track->trackNumber; + trackChoice[numEnabledTracks].trackType = track->trackType; + + // Assign flags for this track so that, when sorted, the largest value becomes our choice: + unsigned choiceFlags = 0; + if (fPreferredLanguage != NULL && track->language != NULL && strcmp(fPreferredLanguage, track->language) == 0) { + // This track matches our preferred language: + choiceFlags |= 1; + } + if (track->isForced) { + choiceFlags |= 4; + } else if (track->isDefault) { + choiceFlags |= 2; + } + trackChoice[numEnabledTracks].choiceFlags = choiceFlags; + + ++numEnabledTracks; + } + + // Choose the desired track for each track type: + for (u_int8_t trackType = 0x01; trackType != MATROSKA_TRACK_TYPE_OTHER; trackType <<= 1) { + int bestNum = -1; + int bestChoiceFlags = -1; + for (unsigned i = 0; i < numEnabledTracks; ++i) { + if (trackChoice[i].trackType == trackType && (int)trackChoice[i].choiceFlags > bestChoiceFlags) { + bestNum = i; + bestChoiceFlags = (int)trackChoice[i].choiceFlags; + } + } + if (bestChoiceFlags >= 0) { // There is a track for this track type + if (trackType == MATROSKA_TRACK_TYPE_VIDEO) fChosenVideoTrackNumber = trackChoice[bestNum].trackNumber; + else if (trackType == MATROSKA_TRACK_TYPE_AUDIO) fChosenAudioTrackNumber = trackChoice[bestNum].trackNumber; + else fChosenSubtitleTrackNumber = trackChoice[bestNum].trackNumber; + } + } + + delete[] trackChoice; + } + +#ifdef DEBUG + if (fChosenVideoTrackNumber > 0) fprintf(stderr, "Chosen video track: #%d\n", fChosenVideoTrackNumber); else fprintf(stderr, "No chosen video track\n"); + if (fChosenAudioTrackNumber > 0) fprintf(stderr, "Chosen audio track: #%d\n", fChosenAudioTrackNumber); else fprintf(stderr, "No chosen audio track\n"); + if (fChosenSubtitleTrackNumber > 0) fprintf(stderr, "Chosen subtitle track: #%d\n", fChosenSubtitleTrackNumber); else fprintf(stderr, "No chosen subtitle track\n"); +#endif + + // Delete our parser, because it's done its job now: + delete fParserForInitialization; fParserForInitialization = NULL; + + // Finally, signal our caller that we've been created and initialized: + if (fOnCreation != NULL) (*fOnCreation)(this, fOnCreationClientData); +} + +MatroskaTrack* MatroskaFile::lookup(unsigned trackNumber) const { + return fTrackTable->lookup(trackNumber); +} + +MatroskaDemux* MatroskaFile +::newDemux(MatroskaDemuxOnDeletionFunc* onDeletionFunc, void* objectToNotify) { + MatroskaDemux* demux = new MatroskaDemux(*this); + + DemuxRecord* demuxRecord = new DemuxRecord(); + demuxRecord->demux = demux; + demuxRecord->onDeletionFunc = onDeletionFunc; + demuxRecord->objectToNotify = objectToNotify; + + fDemuxesTable->Add((char const*)demux, demuxRecord); + + return demux; +} + +void MatroskaFile::removeDemux(MatroskaDemux* demux) { + DemuxRecord* demuxRecord = (DemuxRecord*)(fDemuxesTable->Lookup((char const*)demux)); + if (demuxRecord != NULL) { + fDemuxesTable->Remove((char const*)demux); + + if (demuxRecord->onDeletionFunc != NULL) { + (*demuxRecord->onDeletionFunc)(demuxRecord->objectToNotify, demux); + } + delete demuxRecord; + } +} + +#define getPrivByte(b) if (n == 0) break; else do {b = *p++; --n;} while (0) /* Vorbis/Theora configuration header parsing */ +#define CHECK_PTR if (ptr >= limit) break /* H.264/H.265 parsing */ +#define NUM_BYTES_REMAINING (unsigned)(limit - ptr) /* H.264/H.265 parsing */ + +void MatroskaFile::getH264ConfigData(MatroskaTrack const* track, + u_int8_t*& sps, unsigned& spsSize, + u_int8_t*& pps, unsigned& ppsSize) { + sps = pps = NULL; + spsSize = ppsSize = 0; + + do { + if (track == NULL) break; + + // Use our track's 'Codec Private' data: Bytes 5 and beyond contain SPS and PPSs: + if (track->codecPrivateSize < 6) break; + u_int8_t* SPSandPPSBytes = &track->codecPrivate[5]; + unsigned numSPSandPPSBytes = track->codecPrivateSize - 5; + + // Extract, from "SPSandPPSBytes", one SPS NAL unit, and one PPS NAL unit. + // (I hope one is all we need of each.) + unsigned i; + u_int8_t* ptr = SPSandPPSBytes; + u_int8_t* limit = &SPSandPPSBytes[numSPSandPPSBytes]; + + unsigned numSPSs = (*ptr++)&0x1F; CHECK_PTR; + for (i = 0; i < numSPSs; ++i) { + unsigned spsSize1 = (*ptr++)<<8; CHECK_PTR; + spsSize1 |= *ptr++; CHECK_PTR; + + if (spsSize1 > NUM_BYTES_REMAINING) break; + u_int8_t nal_unit_type = ptr[0]&0x1F; + if (sps == NULL && nal_unit_type == 7/*sanity check*/) { // save the first one + spsSize = spsSize1; + sps = new u_int8_t[spsSize]; + memmove(sps, ptr, spsSize); + } + ptr += spsSize1; + } + + unsigned numPPSs = (*ptr++)&0x1F; CHECK_PTR; + for (i = 0; i < numPPSs; ++i) { + unsigned ppsSize1 = (*ptr++)<<8; CHECK_PTR; + ppsSize1 |= *ptr++; CHECK_PTR; + + if (ppsSize1 > NUM_BYTES_REMAINING) break; + u_int8_t nal_unit_type = ptr[0]&0x1F; + if (pps == NULL && nal_unit_type == 8/*sanity check*/) { // save the first one + ppsSize = ppsSize1; + pps = new u_int8_t[ppsSize]; + memmove(pps, ptr, ppsSize); + } + ptr += ppsSize1; + } + + return; + } while (0); + + // An error occurred: + delete[] sps; sps = NULL; spsSize = 0; + delete[] pps; pps = NULL; ppsSize = 0; +} + +void MatroskaFile::getH265ConfigData(MatroskaTrack const* track, + u_int8_t*& vps, unsigned& vpsSize, + u_int8_t*& sps, unsigned& spsSize, + u_int8_t*& pps, unsigned& ppsSize) { + vps = sps = pps = NULL; + vpsSize = spsSize = ppsSize = 0; + + do { + if (track == NULL) break; + + u_int8_t* VPS_SPS_PPSBytes = NULL; unsigned numVPS_SPS_PPSBytes = 0; + unsigned i; + + if (track->codecPrivateUsesH264FormatForH265) { + // The data uses the H.264-style format (but including VPS NAL unit(s)). + // The VPS,SPS,PPS NAL unit information starts at byte #5: + if (track->codecPrivateSize >= 6) { + numVPS_SPS_PPSBytes = track->codecPrivateSize - 5; + VPS_SPS_PPSBytes = &track->codecPrivate[5]; + } + } else { + // The data uses the proper H.265-style format. + // The VPS,SPS,PPS NAL unit information starts at byte #22: + if (track->codecPrivateSize >= 23) { + numVPS_SPS_PPSBytes = track->codecPrivateSize - 22; + VPS_SPS_PPSBytes = &track->codecPrivate[22]; + } + } + if (VPS_SPS_PPSBytes == NULL) break; // no VPS,SPS,PPS NAL unit information was present + + // Extract, from "VPS_SPS_PPSBytes", one VPS NAL unit, one SPS NAL unit, and one PPS NAL unit. + // (I hope one is all we need of each.) + u_int8_t* ptr = VPS_SPS_PPSBytes; + u_int8_t* limit = &VPS_SPS_PPSBytes[numVPS_SPS_PPSBytes]; + + if (track->codecPrivateUsesH264FormatForH265) { + // The data uses the H.264-style format (but including VPS NAL unit(s)). + while (NUM_BYTES_REMAINING > 0) { + unsigned numNALUnits = (*ptr++)&0x1F; CHECK_PTR; + for (i = 0; i < numNALUnits; ++i) { + unsigned nalUnitLength = (*ptr++)<<8; CHECK_PTR; + nalUnitLength |= *ptr++; CHECK_PTR; + + if (nalUnitLength > NUM_BYTES_REMAINING) break; + u_int8_t nal_unit_type = (ptr[0]&0x7E)>>1; + if (nal_unit_type == 32) { // VPS + vpsSize = nalUnitLength; + delete[] vps; vps = new u_int8_t[nalUnitLength]; + memmove(vps, ptr, nalUnitLength); + } else if (nal_unit_type == 33) { // SPS + spsSize = nalUnitLength; + delete[] sps; sps = new u_int8_t[nalUnitLength]; + memmove(sps, ptr, nalUnitLength); + } else if (nal_unit_type == 34) { // PPS + ppsSize = nalUnitLength; + delete[] pps; pps = new u_int8_t[nalUnitLength]; + memmove(pps, ptr, nalUnitLength); + } + ptr += nalUnitLength; + } + } + } else { + // The data uses the proper H.265-style format. + unsigned numOfArrays = *ptr++; CHECK_PTR; + for (unsigned j = 0; j < numOfArrays; ++j) { + ++ptr; CHECK_PTR; // skip the 'array_completeness'|'reserved'|'NAL_unit_type' byte + + unsigned numNalus = (*ptr++)<<8; CHECK_PTR; + numNalus |= *ptr++; CHECK_PTR; + + for (i = 0; i < numNalus; ++i) { + unsigned nalUnitLength = (*ptr++)<<8; CHECK_PTR; + nalUnitLength |= *ptr++; CHECK_PTR; + + if (nalUnitLength > NUM_BYTES_REMAINING) break; + u_int8_t nal_unit_type = (ptr[0]&0x7E)>>1; + if (nal_unit_type == 32) { // VPS + vpsSize = nalUnitLength; + delete[] vps; vps = new u_int8_t[nalUnitLength]; + memmove(vps, ptr, nalUnitLength); + } else if (nal_unit_type == 33) { // SPS + spsSize = nalUnitLength; + delete[] sps; sps = new u_int8_t[nalUnitLength]; + memmove(sps, ptr, nalUnitLength); + } else if (nal_unit_type == 34) { // PPS + ppsSize = nalUnitLength; + delete[] pps; pps = new u_int8_t[nalUnitLength]; + memmove(pps, ptr, nalUnitLength); + } + ptr += nalUnitLength; + } + } + } + + return; + } while (0); + + // An error occurred: + delete[] vps; vps = NULL; vpsSize = 0; + delete[] sps; sps = NULL; spsSize = 0; + delete[] pps; pps = NULL; ppsSize = 0; +} + +void MatroskaFile +::getVorbisOrTheoraConfigData(MatroskaTrack const* track, + u_int8_t*& identificationHeader, unsigned& identificationHeaderSize, + u_int8_t*& commentHeader, unsigned& commentHeaderSize, + u_int8_t*& setupHeader, unsigned& setupHeaderSize) { + identificationHeader = commentHeader = setupHeader = NULL; + identificationHeaderSize = commentHeaderSize = setupHeaderSize = 0; + + do { + if (track == NULL) break; + + // The Matroska file's 'Codec Private' data is assumed to be the codec configuration + // information, containing the "Identification", "Comment", and "Setup" headers. + // Extract these headers now: + Boolean isTheora = strcmp(track->mimeType, "video/THEORA") == 0; // otherwise, Vorbis + u_int8_t* p = track->codecPrivate; + unsigned n = track->codecPrivateSize; + if (n == 0 || p == NULL) break; // we have no 'Codec Private' data + + u_int8_t numHeaders; + getPrivByte(numHeaders); + unsigned headerSize[3]; // we don't handle any more than 2+1 headers + + // Extract the sizes of each of these headers: + unsigned sizesSum = 0; + Boolean success = True; + unsigned i; + for (i = 0; i < numHeaders && i < 3; ++i) { + unsigned len = 0; + u_int8_t c; + + do { + success = False; + getPrivByte(c); + success = True; + + len += c; + } while (c == 255); + if (!success || len == 0) break; + + headerSize[i] = len; + sizesSum += len; + } + if (!success) break; + + // Compute the implicit size of the final header: + if (numHeaders < 3) { + int finalHeaderSize = n - sizesSum; + if (finalHeaderSize <= 0) break; // error in data; give up + + headerSize[numHeaders] = (unsigned)finalHeaderSize; + ++numHeaders; // include the final header now + } else { + numHeaders = 3; // The maximum number of headers that we handle + } + + // Then, extract and classify each header: + for (i = 0; i < numHeaders; ++i) { + success = False; + unsigned newHeaderSize = headerSize[i]; + u_int8_t* newHeader = new u_int8_t[newHeaderSize]; + if (newHeader == NULL) break; + + u_int8_t* hdr = newHeader; + while (newHeaderSize-- > 0) { + success = False; + getPrivByte(*hdr++); + success = True; + } + if (!success) { + delete[] newHeader; + break; + } + + u_int8_t headerType = newHeader[0]; + if (headerType == 1 || (isTheora && headerType == 0x80)) { // "identification" header + delete[] identificationHeader; identificationHeader = newHeader; + identificationHeaderSize = headerSize[i]; + } else if (headerType == 3 || (isTheora && headerType == 0x81)) { // "comment" header + delete[] commentHeader; commentHeader = newHeader; + commentHeaderSize = headerSize[i]; + } else if (headerType == 5 || (isTheora && headerType == 0x82)) { // "setup" header + delete[] setupHeader; setupHeader = newHeader; + setupHeaderSize = headerSize[i]; + } else { + delete[] newHeader; // because it was a header type that we don't understand + } + } + if (!success) break; + + return; + } while (0); + + // An error occurred: + delete[] identificationHeader; identificationHeader = NULL; identificationHeaderSize = 0; + delete[] commentHeader; commentHeader = NULL; commentHeaderSize = 0; + delete[] setupHeader; setupHeader = NULL; setupHeaderSize = 0; +} + +float MatroskaFile::fileDuration() { + if (fCuePoints == NULL) return 0.0; // Hack, because the RTSP server code assumes that duration > 0 => seekable. (fix this) ##### + + return segmentDuration()*(timecodeScale()/1000000000.0f); +} + +// The size of the largest key frame that we expect. This determines our buffer sizes: +#define MAX_KEY_FRAME_SIZE 300000 + +FramedSource* MatroskaFile +::createSourceForStreaming(FramedSource* baseSource, unsigned trackNumber, + unsigned& estBitrate, unsigned& numFiltersInFrontOfTrack) { + if (baseSource == NULL) return NULL; + + FramedSource* result = baseSource; // by default + estBitrate = 100; // by default + numFiltersInFrontOfTrack = 0; // by default + + // Look at the track's MIME type to set its estimated bitrate (for use by RTCP). + // (Later, try to be smarter about figuring out the bitrate.) ##### + // Some MIME types also require adding a special 'framer' in front of the source. + MatroskaTrack* track = lookup(trackNumber); + if (track != NULL) { // should always be true + if (strcmp(track->mimeType, "audio/MPEG") == 0) { + estBitrate = 128; + } else if (strcmp(track->mimeType, "audio/AAC") == 0) { + estBitrate = 96; + } else if (strcmp(track->mimeType, "audio/AC3") == 0) { + estBitrate = 48; + } else if (strcmp(track->mimeType, "audio/VORBIS") == 0) { + estBitrate = 96; + } else if (strcmp(track->mimeType, "video/H264") == 0) { + estBitrate = 500; + // Allow for the possibility of very large NAL units being fed to the sink object: + OutPacketBuffer::increaseMaxSizeTo(MAX_KEY_FRAME_SIZE); // bytes + + // Add a framer in front of the source: + result = H264VideoStreamDiscreteFramer::createNew(envir(), result); + ++numFiltersInFrontOfTrack; + } else if (strcmp(track->mimeType, "video/H265") == 0) { + estBitrate = 500; + // Allow for the possibility of very large NAL units being fed to the sink object: + OutPacketBuffer::increaseMaxSizeTo(MAX_KEY_FRAME_SIZE); // bytes + + // Add a framer in front of the source: + result = H265VideoStreamDiscreteFramer::createNew(envir(), result); + ++numFiltersInFrontOfTrack; + } else if (strcmp(track->mimeType, "video/VP8") == 0) { + estBitrate = 500; + } else if (strcmp(track->mimeType, "video/VP9") == 0) { + estBitrate = 500; + } else if (strcmp(track->mimeType, "video/THEORA") == 0) { + estBitrate = 500; + } else if (strcmp(track->mimeType, "text/T140") == 0) { + estBitrate = 48; + } + } + + return result; +} + +char const* MatroskaFile::trackMIMEType(unsigned trackNumber) const { + MatroskaTrack* track = lookup(trackNumber); + if (track == NULL) return NULL; + + return track->mimeType; +} + +RTPSink* MatroskaFile +::createRTPSinkForTrackNumber(unsigned trackNumber, Groupsock* rtpGroupsock, + unsigned char rtpPayloadTypeIfDynamic) { + RTPSink* result = NULL; // default value, if an error occurs + + do { + MatroskaTrack* track = lookup(trackNumber); + if (track == NULL) break; + + if (strcmp(track->mimeType, "audio/L16") == 0) { + result = SimpleRTPSink::createNew(envir(), rtpGroupsock,rtpPayloadTypeIfDynamic, track->samplingFrequency, "audio", "L16", track->numChannels); + } else if (strcmp(track->mimeType, "audio/MPEG") == 0) { + result = MPEG1or2AudioRTPSink::createNew(envir(), rtpGroupsock); + } else if (strcmp(track->mimeType, "audio/AAC") == 0) { + // The Matroska file's 'Codec Private' data is assumed to be the AAC configuration + // information. Use this to generate a hexadecimal 'config' string for the new RTP sink: + char* configStr = new char[2*track->codecPrivateSize + 1]; if (configStr == NULL) break; + // 2 hex digits per byte, plus the trailing '\0' + for (unsigned i = 0; i < track->codecPrivateSize; ++i) { + sprintf(&configStr[2*i], "%02X", track->codecPrivate[i]); + } + + result = MPEG4GenericRTPSink::createNew(envir(), rtpGroupsock, + rtpPayloadTypeIfDynamic, + track->samplingFrequency, + "audio", "AAC-hbr", configStr, + track->numChannels); + delete[] configStr; + } else if (strcmp(track->mimeType, "audio/AC3") == 0) { + result = AC3AudioRTPSink + ::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic, track->samplingFrequency); + } else if (strcmp(track->mimeType, "audio/OPUS") == 0) { + result = SimpleRTPSink + ::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic, + 48000, "audio", "OPUS", 2, False/*only 1 Opus 'packet' in each RTP packet*/); + } else if (strcmp(track->mimeType, "audio/VORBIS") == 0 || strcmp(track->mimeType, "video/THEORA") == 0) { + u_int8_t* identificationHeader; unsigned identificationHeaderSize; + u_int8_t* commentHeader; unsigned commentHeaderSize; + u_int8_t* setupHeader; unsigned setupHeaderSize; + getVorbisOrTheoraConfigData(track, + identificationHeader, identificationHeaderSize, + commentHeader, commentHeaderSize, + setupHeader, setupHeaderSize); + + if (strcmp(track->mimeType, "video/THEORA") == 0) { + result = TheoraVideoRTPSink + ::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic, + identificationHeader, identificationHeaderSize, + commentHeader, commentHeaderSize, + setupHeader, setupHeaderSize); + } else { // Vorbis + result = VorbisAudioRTPSink + ::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic, + track->samplingFrequency, track->numChannels, + identificationHeader, identificationHeaderSize, + commentHeader, commentHeaderSize, + setupHeader, setupHeaderSize); + } + delete[] identificationHeader; delete[] commentHeader; delete[] setupHeader; + } else if (strcmp(track->mimeType, "video/RAW") == 0) { + result = RawVideoRTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic, + track->pixelWidth, track->pixelHeight, track->bitDepth, track->colorSampling, track->colorimetry); + } else if (strcmp(track->mimeType, "video/H264") == 0) { + u_int8_t* sps; unsigned spsSize; + u_int8_t* pps; unsigned ppsSize; + + getH264ConfigData(track, sps, spsSize, pps, ppsSize); + result = H264VideoRTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic, + sps, spsSize, pps, ppsSize); + delete[] sps; delete[] pps; + } else if (strcmp(track->mimeType, "video/H265") == 0) { + u_int8_t* vps; unsigned vpsSize; + u_int8_t* sps; unsigned spsSize; + u_int8_t* pps; unsigned ppsSize; + + getH265ConfigData(track, vps, vpsSize, sps, spsSize, pps, ppsSize); + result = H265VideoRTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic, + vps, vpsSize, sps, spsSize, pps, ppsSize); + delete[] vps; delete[] sps; delete[] pps; + } else if (strcmp(track->mimeType, "video/VP8") == 0) { + result = VP8VideoRTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic); + } else if (strcmp(track->mimeType, "video/VP9") == 0) { + result = VP9VideoRTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic); + } else if (strcmp(track->mimeType, "text/T140") == 0) { + result = T140TextRTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic); + } + } while (0); + + return result; +} + +FileSink* MatroskaFile::createFileSinkForTrackNumber(unsigned trackNumber, char const* fileName) { + FileSink* result = NULL; // default value, if an error occurs + Boolean createOggFileSink = False; // by default + + do { + MatroskaTrack* track = lookup(trackNumber); + if (track == NULL) break; + + if (strcmp(track->mimeType, "video/H264") == 0) { + u_int8_t* sps; unsigned spsSize; + u_int8_t* pps; unsigned ppsSize; + + getH264ConfigData(track, sps, spsSize, pps, ppsSize); + + char* sps_base64 = base64Encode((char*)sps, spsSize); + char* pps_base64 = base64Encode((char*)pps, ppsSize); + delete[] sps; delete[] pps; + + char* sPropParameterSetsStr + = new char[(sps_base64 == NULL ? 0 : strlen(sps_base64)) + + (pps_base64 == NULL ? 0 : strlen(pps_base64)) + + 10 /*more than enough space*/]; + sprintf(sPropParameterSetsStr, "%s,%s", sps_base64, pps_base64); + delete[] sps_base64; delete[] pps_base64; + + result = H264VideoFileSink::createNew(envir(), fileName, + sPropParameterSetsStr, + MAX_KEY_FRAME_SIZE); // extra large buffer size for large key frames + delete[] sPropParameterSetsStr; + } else if (strcmp(track->mimeType, "video/H265") == 0) { + u_int8_t* vps; unsigned vpsSize; + u_int8_t* sps; unsigned spsSize; + u_int8_t* pps; unsigned ppsSize; + + getH265ConfigData(track, vps, vpsSize, sps, spsSize, pps, ppsSize); + + char* vps_base64 = base64Encode((char*)vps, vpsSize); + char* sps_base64 = base64Encode((char*)sps, spsSize); + char* pps_base64 = base64Encode((char*)pps, ppsSize); + delete[] vps; delete[] sps; delete[] pps; + + result = H265VideoFileSink::createNew(envir(), fileName, + vps_base64, sps_base64, pps_base64, + MAX_KEY_FRAME_SIZE); // extra large buffer size for large key frames + delete[] vps_base64; delete[] sps_base64; delete[] pps_base64; + } else if (strcmp(track->mimeType, "video/THEORA") == 0) { + createOggFileSink = True; + } else if (strcmp(track->mimeType, "audio/AMR") == 0 || + strcmp(track->mimeType, "audio/AMR-WB") == 0) { + // For AMR audio streams, we use a special sink that inserts AMR frame hdrs: + result = AMRAudioFileSink::createNew(envir(), fileName); + } else if (strcmp(track->mimeType, "audio/VORBIS") == 0 || + strcmp(track->mimeType, "audio/OPUS") == 0) { + createOggFileSink = True; + } + + if (createOggFileSink) { + char* configStr = NULL; // by default + + if (strcmp(track->mimeType, "audio/VORBIS") == 0 || strcmp(track->mimeType, "video/THEORA") == 0) { + u_int8_t* identificationHeader; unsigned identificationHeaderSize; + u_int8_t* commentHeader; unsigned commentHeaderSize; + u_int8_t* setupHeader; unsigned setupHeaderSize; + getVorbisOrTheoraConfigData(track, + identificationHeader, identificationHeaderSize, + commentHeader, commentHeaderSize, + setupHeader, setupHeaderSize); + u_int32_t identField = 0xFACADE; // Can we get a real value from the file somehow? + configStr = generateVorbisOrTheoraConfigStr(identificationHeader, identificationHeaderSize, + commentHeader, commentHeaderSize, + setupHeader, setupHeaderSize, + identField); + delete[] identificationHeader; delete[] commentHeader; delete[] setupHeader; + } + + result = OggFileSink::createNew(envir(), fileName, track->samplingFrequency, configStr, MAX_KEY_FRAME_SIZE); + delete[] configStr; + } else if (result == NULL) { + // By default, just create a regular "FileSink": + result = FileSink::createNew(envir(), fileName, MAX_KEY_FRAME_SIZE); + } + } while (0); + + return result; +} + +void MatroskaFile::addTrack(MatroskaTrack* newTrack, unsigned trackNumber) { + fTrackTable->add(newTrack, trackNumber); +} + +void MatroskaFile::addCuePoint(double cueTime, u_int64_t clusterOffsetInFile, unsigned blockNumWithinCluster) { + Boolean dummy = False; // not used + CuePoint::addCuePoint(fCuePoints, cueTime, clusterOffsetInFile, blockNumWithinCluster, dummy); +} + +Boolean MatroskaFile::lookupCuePoint(double& cueTime, u_int64_t& resultClusterOffsetInFile, unsigned& resultBlockNumWithinCluster) { + if (fCuePoints == NULL) return False; + + (void)fCuePoints->lookup(cueTime, resultClusterOffsetInFile, resultBlockNumWithinCluster); + return True; +} + +void MatroskaFile::printCuePoints(FILE* fid) { + CuePoint::fprintf(fid, fCuePoints); +} + + +////////// MatroskaTrackTable implementation ////////// + +MatroskaTrackTable::MatroskaTrackTable() + : fTable(HashTable::create(ONE_WORD_HASH_KEYS)) { +} + +MatroskaTrackTable::~MatroskaTrackTable() { + // Remove and delete all of our "MatroskaTrack" descriptors, and the hash table itself: + MatroskaTrack* track; + while ((track = (MatroskaTrack*)fTable->RemoveNext()) != NULL) { + delete track; + } + delete fTable; +} + +void MatroskaTrackTable::add(MatroskaTrack* newTrack, unsigned trackNumber) { + if (newTrack != NULL && newTrack->trackNumber != 0) fTable->Remove((char const*)newTrack->trackNumber); + MatroskaTrack* existingTrack = (MatroskaTrack*)fTable->Add((char const*)trackNumber, newTrack); + delete existingTrack; // in case it wasn't NULL +} + +MatroskaTrack* MatroskaTrackTable::lookup(unsigned trackNumber) { + return (MatroskaTrack*)fTable->Lookup((char const*)trackNumber); +} + +unsigned MatroskaTrackTable::numTracks() const { return fTable->numEntries(); } + +MatroskaTrackTable::Iterator::Iterator(MatroskaTrackTable& ourTable) { + fIter = HashTable::Iterator::create(*(ourTable.fTable)); +} + +MatroskaTrackTable::Iterator::~Iterator() { + delete fIter; +} + +MatroskaTrack* MatroskaTrackTable::Iterator::next() { + char const* key; + return (MatroskaTrack*)fIter->next(key); +} + + +////////// MatroskaTrack implementation ////////// + +MatroskaTrack::MatroskaTrack() + : trackNumber(0/*not set*/), trackType(0/*unknown*/), + isEnabled(True), isDefault(True), isForced(False), + defaultDuration(0), + name(NULL), language(NULL), codecID(NULL), + samplingFrequency(0), numChannels(2), mimeType(""), + codecPrivateSize(0), codecPrivate(NULL), + codecPrivateUsesH264FormatForH265(False), codecIsOpus(False), + headerStrippedBytesSize(0), headerStrippedBytes(NULL), + colorSampling(""), colorimetry("BT709-2") /*Matroska default value for Primaries */, + pixelWidth(0), pixelHeight(0), bitDepth(8), subframeSizeSize(0) { +} + +MatroskaTrack::~MatroskaTrack() { + delete[] name; delete[] language; delete[] codecID; + delete[] codecPrivate; + delete[] headerStrippedBytes; +} + + +////////// MatroskaDemux implementation ////////// + +MatroskaDemux::MatroskaDemux(MatroskaFile& ourFile) + : Medium(ourFile.envir()), + fOurFile(ourFile), fDemuxedTracksTable(HashTable::create(ONE_WORD_HASH_KEYS)), + fNextTrackTypeToCheck(0x1) { + fOurParser = new MatroskaFileParser(ourFile, ByteStreamFileSource::createNew(envir(), ourFile.fileName()), + handleEndOfFile, this, this); +} + +MatroskaDemux::~MatroskaDemux() { + // Begin by acting as if we've reached the end of the source file. This should cause all of our demuxed tracks to get closed. + handleEndOfFile(); + + // Then delete our table of "MatroskaDemuxedTrack"s + // - but not the "MatroskaDemuxedTrack"s themselves; that should have already happened: + delete fDemuxedTracksTable; + + delete fOurParser; + fOurFile.removeDemux(this); +} + +FramedSource* MatroskaDemux::newDemuxedTrack() { + unsigned dummyResultTrackNumber; + return newDemuxedTrack(dummyResultTrackNumber); +} + +FramedSource* MatroskaDemux::newDemuxedTrack(unsigned& resultTrackNumber) { + FramedSource* result; + resultTrackNumber = 0; + + for (result = NULL; result == NULL && fNextTrackTypeToCheck != MATROSKA_TRACK_TYPE_OTHER; + fNextTrackTypeToCheck <<= 1) { + if (fNextTrackTypeToCheck == MATROSKA_TRACK_TYPE_VIDEO) resultTrackNumber = fOurFile.chosenVideoTrackNumber(); + else if (fNextTrackTypeToCheck == MATROSKA_TRACK_TYPE_AUDIO) resultTrackNumber = fOurFile.chosenAudioTrackNumber(); + else if (fNextTrackTypeToCheck == MATROSKA_TRACK_TYPE_SUBTITLE) resultTrackNumber = fOurFile.chosenSubtitleTrackNumber(); + + result = newDemuxedTrackByTrackNumber(resultTrackNumber); + } + + return result; +} + +FramedSource* MatroskaDemux::newDemuxedTrackByTrackNumber(unsigned trackNumber) { + if (trackNumber == 0) return NULL; + + FramedSource* trackSource = new MatroskaDemuxedTrack(envir(), trackNumber, *this); + fDemuxedTracksTable->Add((char const*)trackNumber, trackSource); + return trackSource; +} + +MatroskaDemuxedTrack* MatroskaDemux::lookupDemuxedTrack(unsigned trackNumber) { + return (MatroskaDemuxedTrack*)fDemuxedTracksTable->Lookup((char const*)trackNumber); +} + +void MatroskaDemux::removeTrack(unsigned trackNumber) { + fDemuxedTracksTable->Remove((char const*)trackNumber); + if (fDemuxedTracksTable->numEntries() == 0) { + // We no longer have any demuxed tracks, so delete ourselves now: + Medium::close(this); + } +} + +void MatroskaDemux::continueReading() { + fOurParser->continueParsing(); +} + +void MatroskaDemux::seekToTime(double& seekNPT) { + if (fOurParser != NULL) fOurParser->seekToTime(seekNPT); +} + +void MatroskaDemux::pause() { + if (fOurParser != NULL) fOurParser->pause(); +} + +void MatroskaDemux::handleEndOfFile(void* clientData) { + ((MatroskaDemux*)clientData)->handleEndOfFile(); +} + +void MatroskaDemux::handleEndOfFile() { + // Iterate through all of our 'demuxed tracks', handling 'end of input' on each one. + // Hack: Because this can cause the hash table to get modified underneath us, we don't call the handlers until after we've + // first iterated through all of the tracks. + unsigned numTracks = fDemuxedTracksTable->numEntries(); + if (numTracks == 0) return; + MatroskaDemuxedTrack** tracks = new MatroskaDemuxedTrack*[numTracks]; + + HashTable::Iterator* iter = HashTable::Iterator::create(*fDemuxedTracksTable); + unsigned i; + char const* trackNumber; + + for (i = 0; i < numTracks; ++i) { + tracks[i] = (MatroskaDemuxedTrack*)iter->next(trackNumber); + } + delete iter; + + for (i = 0; i < numTracks; ++i) { + if (tracks[i] == NULL) continue; // sanity check; shouldn't happen + tracks[i]->handleClosure(); + } + + delete[] tracks; +} + +void MatroskaDemux::resetState() { + // Iterate through all of our 'demuxed tracks', calling 'reset()' on each one. + HashTable::Iterator* iter = HashTable::Iterator::create(*fDemuxedTracksTable); + MatroskaDemuxedTrack* demuxedTrack; + char const* trackNumber; + + while ((demuxedTrack = (MatroskaDemuxedTrack*)iter->next(trackNumber)) != NULL) { + demuxedTrack->reset(); + } + delete iter; +} + + +////////// CuePoint implementation ////////// + +CuePoint::CuePoint(double cueTime, u_int64_t clusterOffsetInFile, unsigned blockNumWithinCluster) + : fBalance(0), + fCueTime(cueTime), fClusterOffsetInFile(clusterOffsetInFile), fBlockNumWithinCluster(blockNumWithinCluster - 1) { + fSubTree[0] = fSubTree[1] = NULL; +} + +CuePoint::~CuePoint() { + delete fSubTree[0]; delete fSubTree[1]; +} + +void CuePoint::addCuePoint(CuePoint*& root, double cueTime, u_int64_t clusterOffsetInFile, unsigned blockNumWithinCluster, + Boolean& needToReviseBalanceOfParent) { + needToReviseBalanceOfParent = False; // by default; may get changed below + + if (root == NULL) { + root = new CuePoint(cueTime, clusterOffsetInFile, blockNumWithinCluster); + needToReviseBalanceOfParent = True; + } else if (cueTime == root->fCueTime) { + // Replace existing data: + root->fClusterOffsetInFile = clusterOffsetInFile; + root->fBlockNumWithinCluster = blockNumWithinCluster - 1; + } else { + // Add to our left or right subtree: + int direction = cueTime > root->fCueTime; // 0 (left) or 1 (right) + Boolean needToReviseOurBalance = False; + addCuePoint(root->fSubTree[direction], cueTime, clusterOffsetInFile, blockNumWithinCluster, needToReviseOurBalance); + + if (needToReviseOurBalance) { + // We need to change our 'balance' number, perhaps while also performing a rotation to bring ourself back into balance: + if (root->fBalance == 0) { + // We were balanced before, but now we're unbalanced (by 1) on the "direction" side: + root->fBalance = -1 + 2*direction; // -1 for "direction" 0; 1 for "direction" 1 + needToReviseBalanceOfParent = True; + } else if (root->fBalance == 1 - 2*direction) { // 1 for "direction" 0; -1 for "direction" 1 + // We were unbalanced (by 1) on the side opposite to where we added an entry, so now we're balanced: + root->fBalance = 0; + } else { + // We were unbalanced (by 1) on the side where we added an entry, so now we're unbalanced by 2, and have to rebalance: + if (root->fSubTree[direction]->fBalance == -1 + 2*direction) { // -1 for "direction" 0; 1 for "direction" 1 + // We're 'doubly-unbalanced' on this side, so perform a single rotation in the opposite direction: + root->fBalance = root->fSubTree[direction]->fBalance = 0; + rotate(1-direction, root); + } else { + // This is the Left-Right case (for "direction" 0) or the Right-Left case (for "direction" 1); perform two rotations: + char newParentCurBalance = root->fSubTree[direction]->fSubTree[1-direction]->fBalance; + if (newParentCurBalance == 1 - 2*direction) { // 1 for "direction" 0; -1 for "direction" 1 + root->fBalance = 0; + root->fSubTree[direction]->fBalance = -1 + 2*direction; // -1 for "direction" 0; 1 for "direction" 1 + } else if (newParentCurBalance == 0) { + root->fBalance = 0; + root->fSubTree[direction]->fBalance = 0; + } else { + root->fBalance = 1 - 2*direction; // 1 for "direction" 0; -1 for "direction" 1 + root->fSubTree[direction]->fBalance = 0; + } + rotate(direction, root->fSubTree[direction]); + + root->fSubTree[direction]->fBalance = 0; // the new root will be balanced + rotate(1-direction, root); + } + } + } + } +} + +Boolean CuePoint::lookup(double& cueTime, u_int64_t& resultClusterOffsetInFile, unsigned& resultBlockNumWithinCluster) { + if (cueTime < fCueTime) { + if (left() == NULL) { + resultClusterOffsetInFile = 0; + resultBlockNumWithinCluster = 0; + return False; + } else { + return left()->lookup(cueTime, resultClusterOffsetInFile, resultBlockNumWithinCluster); + } + } else { + if (right() == NULL || !right()->lookup(cueTime, resultClusterOffsetInFile, resultBlockNumWithinCluster)) { + // Use this record: + cueTime = fCueTime; + resultClusterOffsetInFile = fClusterOffsetInFile; + resultBlockNumWithinCluster = fBlockNumWithinCluster; + } + return True; + } +} + +void CuePoint::fprintf(FILE* fid, CuePoint* cuePoint) { + if (cuePoint != NULL) { + ::fprintf(fid, "["); + fprintf(fid, cuePoint->left()); + + ::fprintf(fid, ",%.1f{%d},", cuePoint->fCueTime, cuePoint->fBalance); + + fprintf(fid, cuePoint->right()); + ::fprintf(fid, "]"); + } +} + +void CuePoint::rotate(unsigned direction/*0 => left; 1 => right*/, CuePoint*& root) { + CuePoint* pivot = root->fSubTree[1-direction]; // ASSERT: pivot != NULL + root->fSubTree[1-direction] = pivot->fSubTree[direction]; + pivot->fSubTree[direction] = root; + root = pivot; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MatroskaFileParser.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MatroskaFileParser.cpp new file mode 100644 index 000000000..fa75870fe --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MatroskaFileParser.cpp @@ -0,0 +1,1528 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A parser for a Matroska file. +// Implementation + +#include "MatroskaFileParser.hh" +#include "MatroskaDemuxedTrack.hh" +#include +#include // for "gettimeofday() + +MatroskaFileParser::MatroskaFileParser(MatroskaFile& ourFile, FramedSource* inputSource, + FramedSource::onCloseFunc* onEndFunc, void* onEndClientData, + MatroskaDemux* ourDemux) + : StreamParser(inputSource, onEndFunc, onEndClientData, continueParsing, this), + fOurFile(ourFile), fInputSource(inputSource), + fOnEndFunc(onEndFunc), fOnEndClientData(onEndClientData), + fOurDemux(ourDemux), + fCurOffsetInFile(0), fSavedCurOffsetInFile(0), fLimitOffsetInFile(0), + fNumHeaderBytesToSkip(0), fClusterTimecode(0), fBlockTimecode(0), + fFrameSizesWithinBlock(NULL), + fPresentationTimeOffset(0.0) { + if (ourDemux == NULL) { + // Initialization + fCurrentParseState = PARSING_START_OF_FILE; + + continueParsing(); + } else { + fCurrentParseState = LOOKING_FOR_CLUSTER; + // In this case, parsing (of track data) doesn't start until a client starts reading from a track. + } +} + +MatroskaFileParser::~MatroskaFileParser() { + delete[] fFrameSizesWithinBlock; + Medium::close(fInputSource); +} + +void MatroskaFileParser::seekToTime(double& seekNPT) { +#ifdef DEBUG + fprintf(stderr, "seekToTime(%f)\n", seekNPT); +#endif + if (seekNPT <= 0.0) { +#ifdef DEBUG + fprintf(stderr, "\t=> start of file\n"); +#endif + seekNPT = 0.0; + seekToFilePosition(0); + } else if (seekNPT >= fOurFile.fileDuration()) { +#ifdef DEBUG + fprintf(stderr, "\t=> end of file\n"); +#endif + seekNPT = fOurFile.fileDuration(); + seekToEndOfFile(); + } else { + u_int64_t clusterOffsetInFile; + unsigned blockNumWithinCluster; + if (!fOurFile.lookupCuePoint(seekNPT, clusterOffsetInFile, blockNumWithinCluster)) { +#ifdef DEBUG + fprintf(stderr, "\t=> not supported\n"); +#endif + return; // seeking not supported + } + +#ifdef DEBUG + fprintf(stderr, "\t=> seek time %f, file position %llu, block number within cluster %d\n", seekNPT, clusterOffsetInFile, blockNumWithinCluster); +#endif + seekToFilePosition(clusterOffsetInFile); + fCurrentParseState = LOOKING_FOR_BLOCK; + // LATER handle "blockNumWithinCluster"; for now, we assume that it's 0 ##### + } +} + +void MatroskaFileParser::pause() { + resetPresentationTimes(); + // to ensure that we presentation times continue from 'wall clock' time after we resume +} + +void MatroskaFileParser +::continueParsing(void* clientData, unsigned char* /*ptr*/, unsigned /*size*/, struct timeval /*presentationTime*/) { + ((MatroskaFileParser*)clientData)->continueParsing(); +} + +void MatroskaFileParser::continueParsing() { + if (fInputSource != NULL) { + if (!parse()) { + // We didn't complete the parsing, because we had to read more data from the source, or because we're waiting for + // another read from downstream. Once that happens, we'll get called again. + return; + } + } + + // We successfully parsed the file. Call our 'done' function now: + if (fOnEndFunc != NULL) (*fOnEndFunc)(fOnEndClientData); +} + +Boolean MatroskaFileParser::parse() { + Boolean areDone = False; + + if (fInputSource->isCurrentlyAwaitingData()) return False; + // Our input source is currently being read. Wait until that read completes + try { + skipRemainingHeaderBytes(True); // if any + do { + if (fInputSource->isCurrentlyAwaitingData()) return False; + // Our input source is currently being read. Wait until that read completes + + switch (fCurrentParseState) { + case PARSING_START_OF_FILE: { + areDone = parseStartOfFile(); + break; + } + case LOOKING_FOR_TRACKS: { + lookForNextTrack(); + break; + } + case PARSING_TRACK: { + areDone = parseTrack(); + if (areDone && fOurFile.fCuesOffset > 0) { + // We've finished parsing the 'Track' information. There are also 'Cues' in the file, so parse those before finishing: + // Seek to the specified position in the file. We were already told that the 'Cues' begins there: +#ifdef DEBUG + fprintf(stderr, "Seeking to file position %llu (the previously-reported location of 'Cues')\n", fOurFile.fCuesOffset); +#endif + seekToFilePosition(fOurFile.fCuesOffset); + fCurrentParseState = PARSING_CUES; + areDone = False; + } + break; + } + case PARSING_CUES: { + areDone = parseCues(); + break; + } + case LOOKING_FOR_CLUSTER: { + if (fOurFile.fClusterOffset > 0) { + // Optimization: Seek to the specified position in the file. We were already told that the 'Cluster' begins there: +#ifdef DEBUG + fprintf(stderr, "Optimization: Seeking to file position %llu (the previously-reported location of a 'Cluster')\n", fOurFile.fClusterOffset); +#endif + seekToFilePosition(fOurFile.fClusterOffset); + } + fCurrentParseState = LOOKING_FOR_BLOCK; + break; + } + case LOOKING_FOR_BLOCK: { + lookForNextBlock(); + break; + } + case PARSING_BLOCK: { + parseBlock(); + break; + } + case DELIVERING_FRAME_WITHIN_BLOCK: { + if (!deliverFrameWithinBlock()) return False; + break; + } + case DELIVERING_FRAME_BYTES: { + deliverFrameBytes(); + return False; // Halt parsing for now. A new 'read' from downstream will cause parsing to resume. + break; + } + } + } while (!areDone); + + return True; + } catch (int /*e*/) { +#ifdef DEBUG + fprintf(stderr, "MatroskaFileParser::parse() EXCEPTION (This is normal behavior - *not* an error)\n"); +#endif + return False; // the parsing got interrupted + } +} + +Boolean MatroskaFileParser::parseStartOfFile() { +#ifdef DEBUG + fprintf(stderr, "parsing start of file\n"); +#endif + EBMLId id; + EBMLDataSize size; + + // The file must begin with the standard EBML header (which we skip): + if (!parseEBMLIdAndSize(id, size) || id != MATROSKA_ID_EBML) { + fOurFile.envir() << "ERROR: File does not begin with an EBML header\n"; + return True; // We're done with the file, because it's not valid + } +#ifdef DEBUG + fprintf(stderr, "MatroskaFileParser::parseStartOfFile(): Parsed id 0x%s (%s), size: %lld\n", id.hexString(), id.stringName(), size.val()); +#endif + + fCurrentParseState = LOOKING_FOR_TRACKS; + skipHeader(size); + + return False; // because we have more parsing to do - inside the 'Track' header +} + +void MatroskaFileParser::lookForNextTrack() { +#ifdef DEBUG + fprintf(stderr, "looking for Track\n"); +#endif + EBMLId id; + EBMLDataSize size; + + // Read and skip over (or enter) each Matroska header, until we get to a 'Track'. + while (fCurrentParseState == LOOKING_FOR_TRACKS) { + while (!parseEBMLIdAndSize(id, size)) {} +#ifdef DEBUG + fprintf(stderr, "MatroskaFileParser::lookForNextTrack(): Parsed id 0x%s (%s), size: %lld\n", id.hexString(), id.stringName(), size.val()); +#endif + switch (id.val()) { + case MATROSKA_ID_SEGMENT: { // 'Segment' header: enter this + // Remember the position, within the file, of the start of Segment data, because Seek Positions are relative to this: + fOurFile.fSegmentDataOffset = fCurOffsetInFile; + break; + } + case MATROSKA_ID_SEEK_HEAD: { // 'Seek Head' header: enter this + break; + } + case MATROSKA_ID_SEEK: { // 'Seek' header: enter this + break; + } + case MATROSKA_ID_SEEK_ID: { // 'Seek ID' header: get this value + if (parseEBMLNumber(fLastSeekId)) { +#ifdef DEBUG + fprintf(stderr, "\tSeek ID 0x%s:\t%s\n", fLastSeekId.hexString(), fLastSeekId.stringName()); +#endif + } + break; + } + case MATROSKA_ID_SEEK_POSITION: { // 'Seek Position' header: get this value + u_int64_t seekPosition; + if (parseEBMLVal_unsigned64(size, seekPosition)) { + u_int64_t offsetInFile = fOurFile.fSegmentDataOffset + seekPosition; +#ifdef DEBUG + fprintf(stderr, "\tSeek Position %llu (=> offset within the file: %llu (0x%llx))\n", seekPosition, offsetInFile, offsetInFile); +#endif + // The only 'Seek Position's that we care about are for 'Cluster' and 'Cues': + if (fLastSeekId == MATROSKA_ID_CLUSTER) { + fOurFile.fClusterOffset = offsetInFile; + } else if (fLastSeekId == MATROSKA_ID_CUES) { + fOurFile.fCuesOffset = offsetInFile; + } + } + break; + } + case MATROSKA_ID_INFO: { // 'Segment Info' header: enter this + break; + } + case MATROSKA_ID_TIMECODE_SCALE: { // 'Timecode Scale' header: get this value + unsigned timecodeScale; + if (parseEBMLVal_unsigned(size, timecodeScale) && timecodeScale > 0) { + fOurFile.fTimecodeScale = timecodeScale; +#ifdef DEBUG + fprintf(stderr, "\tTimecode Scale %u ns (=> Segment Duration == %f seconds)\n", + fOurFile.timecodeScale(), fOurFile.segmentDuration()*(fOurFile.fTimecodeScale/1000000000.0f)); +#endif + } + break; + } + case MATROSKA_ID_DURATION: { // 'Segment Duration' header: get this value + if (parseEBMLVal_float(size, fOurFile.fSegmentDuration)) { +#ifdef DEBUG + fprintf(stderr, "\tSegment Duration %f (== %f seconds)\n", + fOurFile.segmentDuration(), fOurFile.segmentDuration()*(fOurFile.fTimecodeScale/1000000000.0f)); +#endif + } + break; + } +#ifdef DEBUG + case MATROSKA_ID_TITLE: { // 'Segment Title': display this value + char* title; + if (parseEBMLVal_string(size, title)) { +#ifdef DEBUG + fprintf(stderr, "\tTitle: %s\n", title); +#endif + delete[] title; + } + break; + } +#endif + case MATROSKA_ID_TRACKS: { // enter this, and move on to parsing 'Tracks' + fLimitOffsetInFile = fCurOffsetInFile + size.val(); // Make sure we don't read past the end of this header + fCurrentParseState = PARSING_TRACK; + break; + } + default: { // skip over this header + skipHeader(size); + break; + } + } + setParseState(); + } +} + +Boolean MatroskaFileParser::parseTrack() { +#ifdef DEBUG + fprintf(stderr, "parsing Track\n"); +#endif + // Read and process each Matroska header, until we get to the end of the Track: + MatroskaTrack* track = NULL; + EBMLId id; + EBMLDataSize size; + while (fCurOffsetInFile < fLimitOffsetInFile) { + while (!parseEBMLIdAndSize(id, size)) {} +#ifdef DEBUG + if (id == MATROSKA_ID_TRACK_ENTRY) fprintf(stderr, "\n"); // makes debugging output easier to read + fprintf(stderr, "MatroskaFileParser::parseTrack(): Parsed id 0x%s (%s), size: %lld\n", id.hexString(), id.stringName(), size.val()); +#endif + switch (id.val()) { + case MATROSKA_ID_TRACK_ENTRY: { // 'Track Entry' header: enter this + // Create a new "MatroskaTrack" object for this entry: + if (track != NULL && track->trackNumber == 0) delete track; // We had a previous "MatroskaTrack" object that was never used + track = new MatroskaTrack; + break; + } + case MATROSKA_ID_TRACK_NUMBER: { + unsigned trackNumber; + if (parseEBMLVal_unsigned(size, trackNumber)) { +#ifdef DEBUG + fprintf(stderr, "\tTrack Number %d\n", trackNumber); +#endif + if (track != NULL && trackNumber != 0) { + track->trackNumber = trackNumber; + fOurFile.addTrack(track, trackNumber); + } + } + break; + } + case MATROSKA_ID_TRACK_TYPE: { + unsigned trackType; + if (parseEBMLVal_unsigned(size, trackType) && track != NULL) { + // We convert the Matroska 'track type' code into our own code (which we can use as a bitmap): + track->trackType + = trackType == 1 ? MATROSKA_TRACK_TYPE_VIDEO : trackType == 2 ? MATROSKA_TRACK_TYPE_AUDIO + : trackType == 0x11 ? MATROSKA_TRACK_TYPE_SUBTITLE : MATROSKA_TRACK_TYPE_OTHER; +#ifdef DEBUG + fprintf(stderr, "\tTrack Type 0x%02x (%s)\n", trackType, + track->trackType == MATROSKA_TRACK_TYPE_VIDEO ? "video" : + track->trackType == MATROSKA_TRACK_TYPE_AUDIO ? "audio" : + track->trackType == MATROSKA_TRACK_TYPE_SUBTITLE ? "subtitle" : + ""); +#endif + } + break; + } + case MATROSKA_ID_FLAG_ENABLED: { + unsigned flagEnabled; + if (parseEBMLVal_unsigned(size, flagEnabled)) { +#ifdef DEBUG + fprintf(stderr, "\tTrack is Enabled: %d\n", flagEnabled); +#endif + if (track != NULL) track->isEnabled = flagEnabled != 0; + } + break; + } + case MATROSKA_ID_FLAG_DEFAULT: { + unsigned flagDefault; + if (parseEBMLVal_unsigned(size, flagDefault)) { +#ifdef DEBUG + fprintf(stderr, "\tTrack is Default: %d\n", flagDefault); +#endif + if (track != NULL) track->isDefault = flagDefault != 0; + } + break; + } + case MATROSKA_ID_FLAG_FORCED: { + unsigned flagForced; + if (parseEBMLVal_unsigned(size, flagForced)) { +#ifdef DEBUG + fprintf(stderr, "\tTrack is Forced: %d\n", flagForced); +#endif + if (track != NULL) track->isForced = flagForced != 0; + } + break; + } + case MATROSKA_ID_DEFAULT_DURATION: { + unsigned defaultDuration; + if (parseEBMLVal_unsigned(size, defaultDuration)) { +#ifdef DEBUG + fprintf(stderr, "\tDefault duration %f ms\n", defaultDuration/1000000.0); +#endif + if (track != NULL) track->defaultDuration = defaultDuration; + } + break; + } + case MATROSKA_ID_MAX_BLOCK_ADDITION_ID: { + unsigned maxBlockAdditionID; + if (parseEBMLVal_unsigned(size, maxBlockAdditionID)) { +#ifdef DEBUG + fprintf(stderr, "\tMax Block Addition ID: %u\n", maxBlockAdditionID); +#endif + } + break; + } + case MATROSKA_ID_NAME: { + char* name; + if (parseEBMLVal_string(size, name)) { +#ifdef DEBUG + fprintf(stderr, "\tName: %s\n", name); +#endif + if (track != NULL) { + delete[] track->name; track->name = name; + } else { + delete[] name; + } + } + break; + } + case MATROSKA_ID_LANGUAGE: { + char* language; + if (parseEBMLVal_string(size, language)) { +#ifdef DEBUG + fprintf(stderr, "\tLanguage: %s\n", language); +#endif + if (track != NULL) { + delete[] track->language; track->language = language; + } else { + delete[] language; + } + } + break; + } + case MATROSKA_ID_CODEC: { + char* codecID; + if (parseEBMLVal_string(size, codecID)) { +#ifdef DEBUG + fprintf(stderr, "\tCodec ID: %s\n", codecID); +#endif + if (track != NULL) { + delete[] track->codecID; track->codecID = codecID; + + // Also set the track's "mimeType" field, if we can deduce it from the "codecID": + if (strcmp(codecID, "A_PCM/INT/BIG") == 0) { + track->mimeType = "audio/L16"; + } else if (strncmp(codecID, "A_MPEG", 6) == 0) { + track->mimeType = "audio/MPEG"; + } else if (strncmp(codecID, "A_AAC", 5) == 0) { + track->mimeType = "audio/AAC"; + } else if (strncmp(codecID, "A_AC3", 5) == 0) { + track->mimeType = "audio/AC3"; + } else if (strncmp(codecID, "A_VORBIS", 8) == 0) { + track->mimeType = "audio/VORBIS"; + } else if (strcmp(codecID, "A_OPUS") == 0) { + track->mimeType = "audio/OPUS"; + track->codecIsOpus = True; + } else if (strcmp(codecID, "V_MPEG4/ISO/AVC") == 0) { + track->mimeType = "video/H264"; + } else if (strcmp(codecID, "V_MPEGH/ISO/HEVC") == 0) { + track->mimeType = "video/H265"; + } else if (strncmp(codecID, "V_VP8", 5) == 0) { + track->mimeType = "video/VP8"; + } else if (strncmp(codecID, "V_VP9", 5) == 0) { + track->mimeType = "video/VP9"; + } else if (strncmp(codecID, "V_THEORA", 8) == 0) { + track->mimeType = "video/THEORA"; + } else if (strncmp(codecID, "S_TEXT", 6) == 0) { + track->mimeType = "text/T140"; + } else if (strncmp(codecID, "V_MJPEG", 7) == 0) { + track->mimeType = "video/JPEG"; + } else if (strncmp(codecID, "V_UNCOMPRESSED", 14) == 0) { + track->mimeType = "video/RAW"; + } + } else { + delete[] codecID; + } + } + break; + } + case MATROSKA_ID_CODEC_PRIVATE: { + u_int8_t* codecPrivate; + unsigned codecPrivateSize; + if (parseEBMLVal_binary(size, codecPrivate)) { + codecPrivateSize = (unsigned)size.val(); +#ifdef DEBUG + fprintf(stderr, "\tCodec Private: "); + for (unsigned i = 0; i < codecPrivateSize; ++i) fprintf(stderr, "%02x:", codecPrivate[i]); + fprintf(stderr, "\n"); +#endif + if (track != NULL) { + delete[] track->codecPrivate; track->codecPrivate = codecPrivate; + track->codecPrivateSize = codecPrivateSize; + + // Hack for H.264 and H.265: The 'codec private' data contains + // the size of NAL unit lengths: + if (track->codecID != NULL) { + if (strcmp(track->codecID, "V_MPEG4/ISO/AVC") == 0) { // H.264 + // Byte 4 of the 'codec private' data contains 'lengthSizeMinusOne': + if (codecPrivateSize >= 5) track->subframeSizeSize = (codecPrivate[4]&0x3) + 1; + } else if (strcmp(track->codecID, "V_MPEGH/ISO/HEVC") == 0) { // H.265 + // H.265 'codec private' data is *supposed* to use the format that's described in + // http://lists.matroska.org/pipermail/matroska-devel/2013-September/004567.html + // However, some Matroska files use the same format that was used for H.264. + // We check for this here, by checking various fields that are supposed to be + // 'all-1' in the 'correct' format: + if (codecPrivateSize < 23 || (codecPrivate[13]&0xF0) != 0xF0 || + (codecPrivate[15]&0xFC) != 0xFC || (codecPrivate[16]&0xFC) != 0xFC || + (codecPrivate[17]&0xF8) != 0xF8 || (codecPrivate[18]&0xF8) != 0xF8) { + // The 'correct' format isn't being used, so assume the H.264 format instead: + track->codecPrivateUsesH264FormatForH265 = True; + + // Byte 4 of the 'codec private' data contains 'lengthSizeMinusOne': + if (codecPrivateSize >= 5) track->subframeSizeSize = (codecPrivate[4]&0x3) + 1; + } else { + // This looks like the 'correct' format: + track->codecPrivateUsesH264FormatForH265 = False; + + // Byte 21 of the 'codec private' data contains 'lengthSizeMinusOne': + track->subframeSizeSize = (codecPrivate[21]&0x3) + 1; + } + } + } + } else { + delete[] codecPrivate; + } + } + break; + } + case MATROSKA_ID_VIDEO: { // 'Video settings' header: enter this + break; + } + case MATROSKA_ID_PIXEL_WIDTH: { + unsigned pixelWidth; + if (parseEBMLVal_unsigned(size, pixelWidth)) { +#ifdef DEBUG + fprintf(stderr, "\tPixel Width %d\n", pixelWidth); +#endif + if (track != NULL) track->pixelWidth = pixelWidth; + } + break; + } + case MATROSKA_ID_PIXEL_HEIGHT: { + unsigned pixelHeight; + if (parseEBMLVal_unsigned(size, pixelHeight)) { +#ifdef DEBUG + fprintf(stderr, "\tPixel Height %d\n", pixelHeight); +#endif + if (track != NULL) track->pixelHeight = pixelHeight; + } + break; + } + case MATROSKA_ID_DISPLAY_WIDTH: { + unsigned displayWidth; + if (parseEBMLVal_unsigned(size, displayWidth)) { +#ifdef DEBUG + fprintf(stderr, "\tDisplay Width %d\n", displayWidth); +#endif + } + break; + } + case MATROSKA_ID_DISPLAY_HEIGHT: { + unsigned displayHeight; + if (parseEBMLVal_unsigned(size, displayHeight)) { +#ifdef DEBUG + fprintf(stderr, "\tDisplay Height %d\n", displayHeight); +#endif + } + break; + } + case MATROSKA_ID_DISPLAY_UNIT: { + unsigned displayUnit; + if (parseEBMLVal_unsigned(size, displayUnit)) { +#ifdef DEBUG + fprintf(stderr, "\tDisplay Unit %d\n", displayUnit); +#endif + } + break; + } + case MATROSKA_ID_AUDIO: { // 'Audio settings' header: enter this + break; + } + case MATROSKA_ID_SAMPLING_FREQUENCY: { + float samplingFrequency; + if (parseEBMLVal_float(size, samplingFrequency)) { + if (track != NULL) { + track->samplingFrequency = (unsigned)samplingFrequency; +#ifdef DEBUG + fprintf(stderr, "\tSampling frequency %f (->%d)\n", samplingFrequency, track->samplingFrequency); +#endif + } + } + break; + } + case MATROSKA_ID_OUTPUT_SAMPLING_FREQUENCY: { + float outputSamplingFrequency; + if (parseEBMLVal_float(size, outputSamplingFrequency)) { +#ifdef DEBUG + fprintf(stderr, "\tOutput sampling frequency %f\n", outputSamplingFrequency); +#endif + } + break; + } + case MATROSKA_ID_CHANNELS: { + unsigned numChannels; + if (parseEBMLVal_unsigned(size, numChannels)) { +#ifdef DEBUG + fprintf(stderr, "\tChannels %d\n", numChannels); +#endif + if (track != NULL) track->numChannels = numChannels; + } + break; + } + case MATROSKA_ID_BIT_DEPTH: { + unsigned bitDepth; + if (parseEBMLVal_unsigned(size, bitDepth)) { +#ifdef DEBUG + fprintf(stderr, "\tBit Depth %d\n", bitDepth); +#endif + if (track != NULL) track->bitDepth = bitDepth; + } + break; + } + case MATROSKA_ID_CONTENT_ENCODINGS: + case MATROSKA_ID_CONTENT_ENCODING: { // 'Content Encodings' or 'Content Encoding' header: enter this + break; + } + case MATROSKA_ID_CONTENT_COMPRESSION: { // 'Content Compression' header: enter this + // Note: We currently support only 'Header Stripping' compression, not 'zlib' compression (the default algorithm). + // Therefore, we disable this track, unless/until we later see that 'Header Stripping' is supported: + if (track != NULL) track->isEnabled = False; + break; + } + case MATROSKA_ID_CONTENT_COMP_ALGO: { + unsigned contentCompAlgo; + if (parseEBMLVal_unsigned(size, contentCompAlgo)) { +#ifdef DEBUG + fprintf(stderr, "\tContent Compression Algorithm %d (%s)\n", contentCompAlgo, + contentCompAlgo == 0 ? "zlib" : contentCompAlgo == 3 ? "Header Stripping" : ""); +#endif + // The only compression algorithm that we support is #3: Header Stripping; disable the track otherwise + if (track != NULL) track->isEnabled = contentCompAlgo == 3; + } + break; + } + case MATROSKA_ID_CONTENT_COMP_SETTINGS: { + u_int8_t* headerStrippedBytes; + unsigned headerStrippedBytesSize; + if (parseEBMLVal_binary(size, headerStrippedBytes)) { + headerStrippedBytesSize = (unsigned)size.val(); +#ifdef DEBUG + fprintf(stderr, "\tHeader Stripped Bytes: "); + for (unsigned i = 0; i < headerStrippedBytesSize; ++i) fprintf(stderr, "%02x:", headerStrippedBytes[i]); + fprintf(stderr, "\n"); +#endif + if (track != NULL) { + delete[] track->headerStrippedBytes; track->headerStrippedBytes = headerStrippedBytes; + track->headerStrippedBytesSize = headerStrippedBytesSize; + } else { + delete[] headerStrippedBytes; + } + } + break; + } + case MATROSKA_ID_CONTENT_ENCRYPTION: { // 'Content Encrpytion' header: skip this + // Note: We don't currently support encryption at all. Therefore, we disable this track: + if (track != NULL) track->isEnabled = False; + // Fall through to... + } + case MATROSKA_ID_COLOR_SPACE: { + u_int8_t* colourSpace; + unsigned colourSpaceSize; + if (parseEBMLVal_binary(size, colourSpace)) { + colourSpaceSize = (unsigned)size.val(); +#ifdef DEBUG + fprintf(stderr, "\tColor space : %02x %02x %02x %02x\n", colourSpace[0], colourSpace[1], colourSpace[2], colourSpace[3]); +#endif + if ((track != NULL) && (colourSpaceSize == 4)) { + //convert to sampling value (rfc 4175) + if ((strncmp((const char*)colourSpace, "I420", 4) == 0) || (strncmp((const char*)colourSpace, "IYUV", 4) == 0)){ + track->colorSampling = "YCbCr-4:2:0"; + } + else if ((strncmp((const char*)colourSpace, "YUY2", 4) == 0) || (strncmp((const char*)colourSpace, "UYVY", 4) == 0)){ + track->colorSampling = "YCbCr-4:2:2"; + } + else if (strncmp((const char*)colourSpace, "AYUV", 4) == 0) { + track->colorSampling = "YCbCr-4:4:4"; + } + else if ((strncmp((const char*)colourSpace, "Y41P", 4) == 0) || (strncmp((const char*)colourSpace, "Y41T", 4) == 0)) { + track->colorSampling = "YCbCr-4:1:1"; + } + else if (strncmp((const char*)colourSpace, "RGBA", 4) == 0) { + track->colorSampling = "RGBA"; + } + else if (strncmp((const char*)colourSpace, "BGRA", 4) == 0) { + track->colorSampling = "BGRA"; + } + } else { + delete[] colourSpace; + } + } + break; + } + case MATROSKA_ID_PRIMARIES: { + unsigned primaries; + if (parseEBMLVal_unsigned(size, primaries)) { +#ifdef DEBUG + fprintf(stderr, "\tPrimaries %u\n", primaries); +#endif + if (track != NULL) { + switch (primaries) { + case 1: //ITU-R BT.709 + track->colorimetry = "BT709-2"; + break; + case 7: //SMPTE 240M + track->colorimetry = "SMPTE240M"; + break; + case 2: //Unspecified + case 3: //Reserved + case 4: //ITU-R BT.470M + case 5: //ITU-R BT.470BG + case 6: //SMPTE 170M + case 8: //FILM + case 9: //ITU-R BT.2020 + default: +#ifdef DEBUG + fprintf(stderr, "\tUnsupported color primaries %u\n", primaries); +#endif + break; + } + } + } + } + default: { // We don't process this header, so just skip over it: + skipHeader(size); + break; + } + } + setParseState(); + } + + fLimitOffsetInFile = 0; // reset + if (track != NULL && track->trackNumber == 0) delete track; // We had a previous "MatroskaTrack" object that was never used + return True; // we're done parsing track entries +} + +void MatroskaFileParser::lookForNextBlock() { +#ifdef DEBUG + fprintf(stderr, "looking for Block\n"); +#endif + // Read and skip over each Matroska header, until we get to a 'Cluster': + EBMLId id; + EBMLDataSize size; + while (fCurrentParseState == LOOKING_FOR_BLOCK) { + while (!parseEBMLIdAndSize(id, size)) {} +#ifdef DEBUG + fprintf(stderr, "MatroskaFileParser::lookForNextBlock(): Parsed id 0x%s (%s), size: %lld\n", id.hexString(), id.stringName(), size.val()); +#endif + switch (id.val()) { + case MATROSKA_ID_SEGMENT: { // 'Segment' header: enter this + break; + } + case MATROSKA_ID_CLUSTER: { // 'Cluster' header: enter this + break; + } + case MATROSKA_ID_TIMECODE: { // 'Timecode' header: get this value + unsigned timecode; + if (parseEBMLVal_unsigned(size, timecode)) { + fClusterTimecode = timecode; +#ifdef DEBUG + fprintf(stderr, "\tCluster timecode: %d (== %f seconds)\n", fClusterTimecode, fClusterTimecode*(fOurFile.fTimecodeScale/1000000000.0)); +#endif + } + break; + } + case MATROSKA_ID_BLOCK_GROUP: { // 'Block Group' header: enter this + break; + } + case MATROSKA_ID_SIMPLEBLOCK: + case MATROSKA_ID_BLOCK: { // 'SimpleBlock' or 'Block' header: enter this (and we're done) + fBlockSize = (unsigned)size.val(); + fCurrentParseState = PARSING_BLOCK; + break; + } + case MATROSKA_ID_BLOCK_DURATION: { // 'Block Duration' header: get this value (but we currently don't do anything with it) + unsigned blockDuration; + if (parseEBMLVal_unsigned(size, blockDuration)) { +#ifdef DEBUG + fprintf(stderr, "\tblock duration: %d (== %f ms)\n", blockDuration, (float)(blockDuration*fOurFile.fTimecodeScale/1000000.0)); +#endif + } + break; + } + // Attachments are parsed only if we're in DEBUG mode (otherwise we just skip over them): +#ifdef DEBUG + case MATROSKA_ID_ATTACHMENTS: { // 'Attachments': enter this + break; + } + case MATROSKA_ID_ATTACHED_FILE: { // 'Attached File': enter this + break; + } + case MATROSKA_ID_FILE_DESCRIPTION: { // 'File Description': get this value + char* fileDescription; + if (parseEBMLVal_string(size, fileDescription)) { +#ifdef DEBUG + fprintf(stderr, "\tFile Description: %s\n", fileDescription); +#endif + delete[] fileDescription; + } + break; + } + case MATROSKA_ID_FILE_NAME: { // 'File Name': get this value + char* fileName; + if (parseEBMLVal_string(size, fileName)) { +#ifdef DEBUG + fprintf(stderr, "\tFile Name: %s\n", fileName); +#endif + delete[] fileName; + } + break; + } + case MATROSKA_ID_FILE_MIME_TYPE: { // 'File MIME Type': get this value + char* fileMIMEType; + if (parseEBMLVal_string(size, fileMIMEType)) { +#ifdef DEBUG + fprintf(stderr, "\tFile MIME Type: %s\n", fileMIMEType); +#endif + delete[] fileMIMEType; + } + break; + } + case MATROSKA_ID_FILE_UID: { // 'File UID': get this value + unsigned fileUID; + if (parseEBMLVal_unsigned(size, fileUID)) { +#ifdef DEBUG + fprintf(stderr, "\tFile UID: 0x%x\n", fileUID); +#endif + } + break; + } +#endif + default: { // skip over this header + skipHeader(size); + break; + } + } + setParseState(); + } +} + +Boolean MatroskaFileParser::parseCues() { +#if defined(DEBUG) || defined(DEBUG_CUES) + fprintf(stderr, "parsing Cues\n"); +#endif + EBMLId id; + EBMLDataSize size; + + // Read the next header, which should be MATROSKA_ID_CUES: + if (!parseEBMLIdAndSize(id, size) || id != MATROSKA_ID_CUES) return True; // The header wasn't what we expected, so we're done + fLimitOffsetInFile = fCurOffsetInFile + size.val(); // Make sure we don't read past the end of this header + + double currentCueTime = 0.0; + u_int64_t currentClusterOffsetInFile = 0; + + while (fCurOffsetInFile < fLimitOffsetInFile) { + while (!parseEBMLIdAndSize(id, size)) {} +#ifdef DEBUG_CUES + if (id == MATROSKA_ID_CUE_POINT) fprintf(stderr, "\n"); // makes debugging output easier to read + fprintf(stderr, "MatroskaFileParser::parseCues(): Parsed id 0x%s (%s), size: %lld\n", id.hexString(), id.stringName(), size.val()); +#endif + switch (id.val()) { + case MATROSKA_ID_CUE_POINT: { // 'Cue Point' header: enter this + break; + } + case MATROSKA_ID_CUE_TIME: { // 'Cue Time' header: get this value + unsigned cueTime; + if (parseEBMLVal_unsigned(size, cueTime)) { + currentCueTime = cueTime*(fOurFile.fTimecodeScale/1000000000.0); +#ifdef DEBUG_CUES + fprintf(stderr, "\tCue Time %d (== %f seconds)\n", cueTime, currentCueTime); +#endif + } + break; + } + case MATROSKA_ID_CUE_TRACK_POSITIONS: { // 'Cue Track Positions' header: enter this + break; + } + case MATROSKA_ID_CUE_TRACK: { // 'Cue Track' header: get this value (but only for debugging; we don't do anything with it) + unsigned cueTrack; + if (parseEBMLVal_unsigned(size, cueTrack)) { +#ifdef DEBUG_CUES + fprintf(stderr, "\tCue Track %d\n", cueTrack); +#endif + } + break; + } + case MATROSKA_ID_CUE_CLUSTER_POSITION: { // 'Cue Cluster Position' header: get this value + u_int64_t cueClusterPosition; + if (parseEBMLVal_unsigned64(size, cueClusterPosition)) { + currentClusterOffsetInFile = fOurFile.fSegmentDataOffset + cueClusterPosition; +#ifdef DEBUG_CUES + fprintf(stderr, "\tCue Cluster Position %llu (=> offset within the file: %llu (0x%llx))\n", cueClusterPosition, currentClusterOffsetInFile, currentClusterOffsetInFile); +#endif + // Record this cue point: + fOurFile.addCuePoint(currentCueTime, currentClusterOffsetInFile, 1/*default block number within cluster*/); + } + break; + } + case MATROSKA_ID_CUE_BLOCK_NUMBER: { // 'Cue Block Number' header: get this value + unsigned cueBlockNumber; + if (parseEBMLVal_unsigned(size, cueBlockNumber) && cueBlockNumber != 0) { +#ifdef DEBUG_CUES + fprintf(stderr, "\tCue Block Number %d\n", cueBlockNumber); +#endif + // Record this cue point (overwriting any existing entry for this cue time): + fOurFile.addCuePoint(currentCueTime, currentClusterOffsetInFile, cueBlockNumber); + } + break; + } + default: { // We don't process this header, so just skip over it: + skipHeader(size); + break; + } + } + setParseState(); + } + + fLimitOffsetInFile = 0; // reset +#if defined(DEBUG) || defined(DEBUG_CUES) + fprintf(stderr, "done parsing Cues\n"); +#endif +#ifdef DEBUG_CUES + fprintf(stderr, "Cue Point tree: "); + fOurFile.printCuePoints(stderr); + fprintf(stderr, "\n"); +#endif + return True; // we're done parsing Cues +} + +typedef enum { NoLacing, XiphLacing, FixedSizeLacing, EBMLLacing } MatroskaLacingType; + +void MatroskaFileParser::parseBlock() { +#ifdef DEBUG + fprintf(stderr, "parsing SimpleBlock or Block\n"); +#endif + do { + unsigned blockStartPos = curOffset(); + + // The block begins with the track number: + EBMLNumber trackNumber; + if (!parseEBMLNumber(trackNumber)) break; + fBlockTrackNumber = (unsigned)trackNumber.val(); + + // If this track is not being read, then skip the rest of this block, and look for another one: + if (fOurDemux->lookupDemuxedTrack(fBlockTrackNumber) == NULL) { + unsigned headerBytesSeen = curOffset() - blockStartPos; + if (headerBytesSeen < fBlockSize) { + skipBytes(fBlockSize - headerBytesSeen); + } +#ifdef DEBUG + fprintf(stderr, "\tSkipped block for unused track number %d\n", fBlockTrackNumber); +#endif + fCurrentParseState = LOOKING_FOR_BLOCK; + setParseState(); + return; + } + + MatroskaTrack* track = fOurFile.lookup(fBlockTrackNumber); + if (track == NULL) break; // shouldn't happen + + // The next two bytes are the block's timecode (relative to the cluster timecode) + fBlockTimecode = (get1Byte()<<8)|get1Byte(); + + // The next byte indicates the type of 'lacing' used: + u_int8_t c = get1Byte(); + c &= 0x6; // we're interested in bits 5-6 only + MatroskaLacingType lacingType = (c==0x0)?NoLacing : (c==0x02)?XiphLacing : (c==0x04)?FixedSizeLacing : EBMLLacing; +#ifdef DEBUG + fprintf(stderr, "\ttrack number %d, timecode %d (=> %f seconds), %s lacing\n", fBlockTrackNumber, fBlockTimecode, (fClusterTimecode+fBlockTimecode)*(fOurFile.fTimecodeScale/1000000000.0), (lacingType==NoLacing)?"no" : (lacingType==XiphLacing)?"Xiph" : (lacingType==FixedSizeLacing)?"fixed-size" : "EBML"); +#endif + + if (lacingType == NoLacing) { + fNumFramesInBlock = 1; + } else { + // The next byte tells us how many frames are present in this block + fNumFramesInBlock = get1Byte() + 1; + } + delete[] fFrameSizesWithinBlock; fFrameSizesWithinBlock = new unsigned[fNumFramesInBlock]; + if (fFrameSizesWithinBlock == NULL) break; + + if (lacingType == NoLacing) { + unsigned headerBytesSeen = curOffset() - blockStartPos; + if (headerBytesSeen > fBlockSize) break; + + fFrameSizesWithinBlock[0] = fBlockSize - headerBytesSeen; + } else if (lacingType == FixedSizeLacing) { + unsigned headerBytesSeen = curOffset() - blockStartPos; + if (headerBytesSeen > fBlockSize) break; + + unsigned frameBytesAvailable = fBlockSize - headerBytesSeen; + unsigned constantFrameSize = frameBytesAvailable/fNumFramesInBlock; + + for (unsigned i = 0; i < fNumFramesInBlock; ++i) { + fFrameSizesWithinBlock[i] = constantFrameSize; + } + // If there are any bytes left over, assign them to the last frame: + fFrameSizesWithinBlock[fNumFramesInBlock-1] += frameBytesAvailable%fNumFramesInBlock; + } else { // EBML or Xiph lacing + unsigned curFrameSize = 0; + unsigned frameSizesTotal = 0; + unsigned i; + + for (i = 0; i < fNumFramesInBlock-1; ++i) { + if (lacingType == EBMLLacing) { + EBMLNumber frameSize; + if (!parseEBMLNumber(frameSize)) break; + unsigned fsv = (unsigned)frameSize.val(); + + if (i == 0) { + curFrameSize = fsv; + } else { + // The value we read is a signed value, that's added to the previous frame size, to get the current frame size: + unsigned toSubtract = (fsv>0xFFFFFF)?0x07FFFFFF : (fsv>0xFFFF)?0x0FFFFF : (fsv>0xFF)?0x1FFF : 0x3F; + int fsv_signed = fsv - toSubtract; + curFrameSize += fsv_signed; + if ((int)curFrameSize < 0) break; + } + } else { // Xiph lacing + curFrameSize = 0; + u_int8_t c; + do { + c = get1Byte(); + curFrameSize += c; + } while (c == 0xFF); + } + fFrameSizesWithinBlock[i] = curFrameSize; + frameSizesTotal += curFrameSize; + } + if (i != fNumFramesInBlock-1) break; // an error occurred within the "for" loop + + // Compute the size of the final frame within the block (from the block's size, and the frame sizes already computed):) + unsigned headerBytesSeen = curOffset() - blockStartPos; + if (headerBytesSeen + frameSizesTotal > fBlockSize) break; + fFrameSizesWithinBlock[i] = fBlockSize - (headerBytesSeen + frameSizesTotal); + } + + // We're done parsing headers within the block, and (as a result) we now know the sizes of all frames within the block. + // If we have 'stripped bytes' that are common to (the front of) all frames, then count them now: + if (track->headerStrippedBytesSize != 0) { + for (unsigned i = 0; i < fNumFramesInBlock; ++i) fFrameSizesWithinBlock[i] += track->headerStrippedBytesSize; + } +#ifdef DEBUG + fprintf(stderr, "\tThis block contains %d frame(s); size(s):", fNumFramesInBlock); + unsigned frameSizesTotal = 0; + for (unsigned i = 0; i < fNumFramesInBlock; ++i) { + fprintf(stderr, " %d", fFrameSizesWithinBlock[i]); + frameSizesTotal += fFrameSizesWithinBlock[i]; + } + if (fNumFramesInBlock > 1) fprintf(stderr, " (total: %u)", frameSizesTotal); + fprintf(stderr, " bytes\n"); +#endif + // Next, start delivering these frames: + fCurrentParseState = DELIVERING_FRAME_WITHIN_BLOCK; + fCurOffsetWithinFrame = fNextFrameNumberToDeliver = 0; + setParseState(); + return; + } while (0); + + // An error occurred. Try to recover: +#ifdef DEBUG + fprintf(stderr, "parseBlock(): Error parsing data; trying to recover...\n"); +#endif + fCurrentParseState = LOOKING_FOR_BLOCK; +} + +Boolean MatroskaFileParser::deliverFrameWithinBlock() { +#ifdef DEBUG + fprintf(stderr, "delivering frame within SimpleBlock or Block\n"); +#endif + do { + MatroskaTrack* track = fOurFile.lookup(fBlockTrackNumber); + if (track == NULL) break; // shouldn't happen + + MatroskaDemuxedTrack* demuxedTrack = fOurDemux->lookupDemuxedTrack(fBlockTrackNumber); + if (demuxedTrack == NULL) break; // shouldn't happen + if (!demuxedTrack->isCurrentlyAwaitingData()) { + // Someone has been reading this stream, but isn't right now. + // We can't deliver this frame until he asks for it, so punt for now. + // The next time he asks for a frame, he'll get it. +#ifdef DEBUG + fprintf(stderr, "\tdeferring delivery of frame #%d (%d bytes)", fNextFrameNumberToDeliver, fFrameSizesWithinBlock[fNextFrameNumberToDeliver]); + if (track->haveSubframes()) fprintf(stderr, "[offset %d]", fCurOffsetWithinFrame); + fprintf(stderr, "\n"); +#endif + restoreSavedParserState(); // so we read from the beginning next time + return False; + } + + unsigned frameSize; + u_int8_t const* specialFrameSource = NULL; + u_int8_t const opusCommentHeader[16] + = {'O','p','u','s','T','a','g','s', 0, 0, 0, 0, 0, 0, 0, 0}; + if (track->codecIsOpus && demuxedTrack->fOpusFrameNumber < 2) { + // Special case for Opus audio. The first frame (the 'configuration' header) comes from + // the 'private data'. The second frame (the 'comment' header) comes is synthesized by + // us here: + if (demuxedTrack->fOpusFrameNumber == 0) { + specialFrameSource = track->codecPrivate; + frameSize = track->codecPrivateSize; + } else { // demuxedTrack->fOpusFrameNumber == 1 + specialFrameSource = opusCommentHeader; + frameSize = sizeof opusCommentHeader; + } + ++demuxedTrack->fOpusFrameNumber; + } else { + frameSize = fFrameSizesWithinBlock[fNextFrameNumberToDeliver]; + if (track->haveSubframes()) { + // The next "track->subframeSizeSize" bytes contain the length of a 'subframe': + if (fCurOffsetWithinFrame + track->subframeSizeSize > frameSize) break; // sanity check + unsigned subframeSize = 0; + for (unsigned i = 0; i < track->subframeSizeSize; ++i) { + u_int8_t c; + getCommonFrameBytes(track, &c, 1, 0); + if (fCurFrameNumBytesToGet > 0) { // it'll be 1 + c = get1Byte(); + ++fCurOffsetWithinFrame; + } + subframeSize = subframeSize*256 + c; + } + if (subframeSize == 0 || fCurOffsetWithinFrame + subframeSize > frameSize) break; // sanity check + frameSize = subframeSize; + } + } + + // Compute the presentation time of this frame (from the cluster timecode, the block timecode, and the default duration): + double pt = (fClusterTimecode+fBlockTimecode)*(fOurFile.fTimecodeScale/1000000000.0) + + fNextFrameNumberToDeliver*(track->defaultDuration/1000000000.0); + if (fPresentationTimeOffset == 0.0) { + // This is the first time we've computed a presentation time. + // Compute an offset to make the presentation times aligned with 'wall clock' time: + struct timeval timeNow; + gettimeofday(&timeNow, NULL); + double ptNow = timeNow.tv_sec + timeNow.tv_usec/1000000.0; + fPresentationTimeOffset = ptNow - pt; + } + pt += fPresentationTimeOffset; + struct timeval presentationTime; + presentationTime.tv_sec = (unsigned)pt; + presentationTime.tv_usec = (unsigned)((pt - presentationTime.tv_sec)*1000000); + unsigned durationInMicroseconds; + if (specialFrameSource != NULL) { + durationInMicroseconds = 0; + } else { // normal case + durationInMicroseconds = track->defaultDuration/1000; + if (track->haveSubframes()) { + // If this is a 'subframe', use a duration of 0 instead (unless it's the last 'subframe'): + if (fCurOffsetWithinFrame + frameSize + track->subframeSizeSize < fFrameSizesWithinBlock[fNextFrameNumberToDeliver]) { + // There's room for at least one more subframe after this, so give this subframe a duration of 0 + durationInMicroseconds = 0; + } + } + } + + if (track->defaultDuration == 0) { + // Adjust the frame duration to keep the sum of frame durations aligned with presentation times. + if (demuxedTrack->prevPresentationTime().tv_sec != 0) { // not the first time for this track + demuxedTrack->durationImbalance() + += (presentationTime.tv_sec - demuxedTrack->prevPresentationTime().tv_sec)*1000000 + + (presentationTime.tv_usec - demuxedTrack->prevPresentationTime().tv_usec); + } + int adjustment = 0; + if (demuxedTrack->durationImbalance() > 0) { + // The duration needs to be increased. + int const adjustmentThreshold = 100000; // don't increase the duration by more than this amount (in case there's a mistake) + adjustment = demuxedTrack->durationImbalance() > adjustmentThreshold + ? adjustmentThreshold : demuxedTrack->durationImbalance(); + } else if (demuxedTrack->durationImbalance() < 0) { + // The duration needs to be decreased. + adjustment = (unsigned)(-demuxedTrack->durationImbalance()) < durationInMicroseconds + ? demuxedTrack->durationImbalance() : -(int)durationInMicroseconds; + } + durationInMicroseconds += adjustment; + demuxedTrack->durationImbalance() -= durationInMicroseconds; // for next time + demuxedTrack->prevPresentationTime() = presentationTime; // for next time + } + + demuxedTrack->presentationTime() = presentationTime; + demuxedTrack->durationInMicroseconds() = durationInMicroseconds; + + // Deliver the next block now: + if (frameSize > demuxedTrack->maxSize()) { + demuxedTrack->numTruncatedBytes() = frameSize - demuxedTrack->maxSize(); + demuxedTrack->frameSize() = demuxedTrack->maxSize(); + } else { // normal case + demuxedTrack->numTruncatedBytes() = 0; + demuxedTrack->frameSize() = frameSize; + } + getCommonFrameBytes(track, demuxedTrack->to(), demuxedTrack->frameSize(), demuxedTrack->numTruncatedBytes()); + + // Next, deliver (and/or skip) bytes from the input file: + if (specialFrameSource != NULL) { + memmove(demuxedTrack->to(), specialFrameSource, demuxedTrack->frameSize()); +#ifdef DEBUG + fprintf(stderr, "\tdelivered special frame: %d bytes", demuxedTrack->frameSize()); + if (demuxedTrack->numTruncatedBytes() > 0) fprintf(stderr, " (%d bytes truncated)", demuxedTrack->numTruncatedBytes()); + fprintf(stderr, " @%u.%06u (%.06f from start); duration %u us\n", demuxedTrack->presentationTime().tv_sec, demuxedTrack->presentationTime().tv_usec, demuxedTrack->presentationTime().tv_sec+demuxedTrack->presentationTime().tv_usec/1000000.0-fPresentationTimeOffset, demuxedTrack->durationInMicroseconds()); +#endif + setParseState(); + FramedSource::afterGetting(demuxedTrack); // completes delivery + } else { // normal case + fCurrentParseState = DELIVERING_FRAME_BYTES; + setParseState(); + } + return True; + } while (0); + + // An error occurred. Try to recover: +#ifdef DEBUG + fprintf(stderr, "deliverFrameWithinBlock(): Error parsing data; trying to recover...\n"); +#endif + fCurrentParseState = LOOKING_FOR_BLOCK; + return True; +} + +void MatroskaFileParser::deliverFrameBytes() { + do { + MatroskaTrack* track = fOurFile.lookup(fBlockTrackNumber); + if (track == NULL) break; // shouldn't happen + + MatroskaDemuxedTrack* demuxedTrack = fOurDemux->lookupDemuxedTrack(fBlockTrackNumber); + if (demuxedTrack == NULL) break; // shouldn't happen + if (!demuxedTrack->isCurrentlyAwaitingData()) return; // wait until we're asked for data + + unsigned const BANK_SIZE = bankSize(); + while (fCurFrameNumBytesToGet > 0) { + // Hack: We can get no more than BANK_SIZE bytes at a time: + unsigned numBytesToGet = fCurFrameNumBytesToGet > BANK_SIZE ? BANK_SIZE : fCurFrameNumBytesToGet; + getBytes(fCurFrameTo, numBytesToGet); + fCurFrameTo += numBytesToGet; + fCurFrameNumBytesToGet -= numBytesToGet; + fCurOffsetWithinFrame += numBytesToGet; + setParseState(); + } + while (fCurFrameNumBytesToSkip > 0) { + // Hack: We can skip no more than BANK_SIZE bytes at a time: + unsigned numBytesToSkip = fCurFrameNumBytesToSkip > BANK_SIZE ? BANK_SIZE : fCurFrameNumBytesToSkip; + skipBytes(numBytesToSkip); + fCurFrameNumBytesToSkip -= numBytesToSkip; + fCurOffsetWithinFrame += numBytesToSkip; + setParseState(); + } +#ifdef DEBUG + fprintf(stderr, "\tdelivered frame #%d: %d bytes", fNextFrameNumberToDeliver, demuxedTrack->frameSize()); + if (track->haveSubframes()) fprintf(stderr, "[offset %d]", fCurOffsetWithinFrame - track->subframeSizeSize - demuxedTrack->frameSize() - demuxedTrack->numTruncatedBytes()); + if (demuxedTrack->numTruncatedBytes() > 0) fprintf(stderr, " (%d bytes truncated)", demuxedTrack->numTruncatedBytes()); + fprintf(stderr, " @%u.%06u (%.06f from start); duration %u us\n", demuxedTrack->presentationTime().tv_sec, demuxedTrack->presentationTime().tv_usec, demuxedTrack->presentationTime().tv_sec+demuxedTrack->presentationTime().tv_usec/1000000.0-fPresentationTimeOffset, demuxedTrack->durationInMicroseconds()); +#endif + + if (!track->haveSubframes() + || fCurOffsetWithinFrame + track->subframeSizeSize >= fFrameSizesWithinBlock[fNextFrameNumberToDeliver]) { + // Either we don't have subframes, or there's no more room for another subframe => We're completely done with this frame now: + ++fNextFrameNumberToDeliver; + fCurOffsetWithinFrame = 0; + } + if (fNextFrameNumberToDeliver == fNumFramesInBlock) { + // We've delivered all of the frames from this block. Look for another block next: + fCurrentParseState = LOOKING_FOR_BLOCK; + } else { + fCurrentParseState = DELIVERING_FRAME_WITHIN_BLOCK; + } + + setParseState(); + FramedSource::afterGetting(demuxedTrack); // completes delivery + return; + } while (0); + + // An error occurred. Try to recover: +#ifdef DEBUG + fprintf(stderr, "deliverFrameBytes(): Error parsing data; trying to recover...\n"); +#endif + fCurrentParseState = LOOKING_FOR_BLOCK; +} + +void MatroskaFileParser +::getCommonFrameBytes(MatroskaTrack* track, u_int8_t* to, unsigned numBytesToGet, unsigned numBytesToSkip) { + if (track->headerStrippedBytesSize > fCurOffsetWithinFrame) { + // We have some common 'header stripped' bytes that remain to be prepended to the frame. Use these first: + unsigned numRemainingHeaderStrippedBytes = track->headerStrippedBytesSize - fCurOffsetWithinFrame; + unsigned numHeaderStrippedBytesToGet; + if (numBytesToGet <= numRemainingHeaderStrippedBytes) { + numHeaderStrippedBytesToGet = numBytesToGet; + numBytesToGet = 0; + if (numBytesToGet + numBytesToSkip <= numRemainingHeaderStrippedBytes) { + numBytesToSkip = 0; + } else { + numBytesToSkip = numBytesToGet + numBytesToSkip - numRemainingHeaderStrippedBytes; + } + } else { + numHeaderStrippedBytesToGet = numRemainingHeaderStrippedBytes; + numBytesToGet = numBytesToGet - numRemainingHeaderStrippedBytes; + } + + if (numHeaderStrippedBytesToGet > 0) { + memmove(to, &track->headerStrippedBytes[fCurOffsetWithinFrame], numHeaderStrippedBytesToGet); + to += numHeaderStrippedBytesToGet; + fCurOffsetWithinFrame += numHeaderStrippedBytesToGet; + } + } + + fCurFrameTo = to; + fCurFrameNumBytesToGet = numBytesToGet; + fCurFrameNumBytesToSkip = numBytesToSkip; +} + +Boolean MatroskaFileParser::parseEBMLNumber(EBMLNumber& num) { + unsigned i; + u_int8_t bitmask = 0x80; + for (i = 0; i < EBML_NUMBER_MAX_LEN; ++i) { + while (1) { + if (fLimitOffsetInFile > 0 && fCurOffsetInFile > fLimitOffsetInFile) return False; // We've hit our pre-set limit + num.data[i] = get1Byte(); + ++fCurOffsetInFile; + + // If we're looking for an id, skip any leading bytes that don't contain a '1' in the first 4 bits: + if (i == 0/*we're a leading byte*/ && !num.stripLeading1/*we're looking for an id*/ && (num.data[i]&0xF0) == 0) { + setParseState(); // ensures that we make forward progress if the parsing gets interrupted + continue; + } + break; + } + if ((num.data[0]&bitmask) != 0) { + // num[i] is the last byte of the id + if (num.stripLeading1) num.data[0] &=~ bitmask; + break; + } + bitmask >>= 1; + } + if (i == EBML_NUMBER_MAX_LEN) return False; + + num.len = i+1; + return True; +} + +Boolean MatroskaFileParser::parseEBMLIdAndSize(EBMLId& id, EBMLDataSize& size) { + return parseEBMLNumber(id) && parseEBMLNumber(size); +} + +Boolean MatroskaFileParser::parseEBMLVal_unsigned64(EBMLDataSize& size, u_int64_t& result) { + u_int64_t sv = size.val(); + if (sv > 8) return False; // size too large + + result = 0; // initially + for (unsigned i = (unsigned)sv; i > 0; --i) { + if (fLimitOffsetInFile > 0 && fCurOffsetInFile > fLimitOffsetInFile) return False; // We've hit our pre-set limit + + u_int8_t c = get1Byte(); + ++fCurOffsetInFile; + + result = result*256 + c; + } + + return True; +} + +Boolean MatroskaFileParser::parseEBMLVal_unsigned(EBMLDataSize& size, unsigned& result) { + if (size.val() > 4) return False; // size too large + + u_int64_t result64; + if (!parseEBMLVal_unsigned64(size, result64)) return False; + + result = (unsigned)result64; + + return True; +} + +Boolean MatroskaFileParser::parseEBMLVal_float(EBMLDataSize& size, float& result) { + if (size.val() == 4) { + // Normal case. Read the value as if it were a 4-byte integer, then copy it to the 'float' result: + unsigned resultAsUnsigned; + if (!parseEBMLVal_unsigned(size, resultAsUnsigned)) return False; + + if (sizeof result != sizeof resultAsUnsigned) return False; + memcpy(&result, &resultAsUnsigned, sizeof result); + return True; + } else if (size.val() == 8) { + // Read the value as if it were an 8-byte integer, then copy it to a 'double', the convert that to the 'float' result: + u_int64_t resultAsUnsigned64; + if (!parseEBMLVal_unsigned64(size, resultAsUnsigned64)) return False; + + double resultDouble; + if (sizeof resultDouble != sizeof resultAsUnsigned64) return False; + memcpy(&resultDouble, &resultAsUnsigned64, sizeof resultDouble); + + result = (float)resultDouble; + return True; + } else { + // Unworkable size + return False; + } +} + +Boolean MatroskaFileParser::parseEBMLVal_string(EBMLDataSize& size, char*& result) { + unsigned resultLength = (unsigned)size.val(); + result = new char[resultLength + 1]; // allow for the trailing '\0' + if (result == NULL) return False; + + char* p = result; + unsigned i; + for (i = 0; i < resultLength; ++i) { + if (fLimitOffsetInFile > 0 && fCurOffsetInFile > fLimitOffsetInFile) break; // We've hit our pre-set limit + + u_int8_t c = get1Byte(); + ++fCurOffsetInFile; + + *p++ = c; + } + if (i < resultLength) { // an error occurred + delete[] result; + result = NULL; + return False; + } + *p = '\0'; + + return True; +} + +Boolean MatroskaFileParser::parseEBMLVal_binary(EBMLDataSize& size, u_int8_t*& result) { + unsigned resultLength = (unsigned)size.val(); + result = new u_int8_t[resultLength]; + if (result == NULL) return False; + + u_int8_t* p = result; + unsigned i; + for (i = 0; i < resultLength; ++i) { + if (fLimitOffsetInFile > 0 && fCurOffsetInFile > fLimitOffsetInFile) break; // We've hit our pre-set limit + + u_int8_t c = get1Byte(); + ++fCurOffsetInFile; + + *p++ = c; + } + if (i < resultLength) { // an error occurred + delete[] result; + result = NULL; + return False; + } + + return True; +} + +void MatroskaFileParser::skipHeader(EBMLDataSize const& size) { + u_int64_t sv = (unsigned)size.val(); +#ifdef DEBUG + fprintf(stderr, "\tskipping %llu bytes\n", sv); +#endif + + fNumHeaderBytesToSkip = sv; + skipRemainingHeaderBytes(False); +} + +void MatroskaFileParser::skipRemainingHeaderBytes(Boolean isContinuation) { + if (fNumHeaderBytesToSkip == 0) return; // common case + + // Hack: To avoid tripping into a parser 'internal error' if we try to skip an excessively large + // distance, break up the skipping into manageable chunks, to ensure forward progress: + unsigned const maxBytesToSkip = bankSize(); + while (fNumHeaderBytesToSkip > 0) { + unsigned numBytesToSkipNow + = fNumHeaderBytesToSkip < maxBytesToSkip ? (unsigned)fNumHeaderBytesToSkip : maxBytesToSkip; + setParseState(); + skipBytes(numBytesToSkipNow); +#ifdef DEBUG + if (isContinuation || numBytesToSkipNow < fNumHeaderBytesToSkip) { + fprintf(stderr, "\t\t(skipped %u bytes; %llu bytes remaining)\n", + numBytesToSkipNow, fNumHeaderBytesToSkip - numBytesToSkipNow); + } +#endif + fCurOffsetInFile += numBytesToSkipNow; + fNumHeaderBytesToSkip -= numBytesToSkipNow; + } +} + +void MatroskaFileParser::setParseState() { + fSavedCurOffsetInFile = fCurOffsetInFile; + fSavedCurOffsetWithinFrame = fCurOffsetWithinFrame; + saveParserState(); +} + +void MatroskaFileParser::restoreSavedParserState() { + StreamParser::restoreSavedParserState(); + fCurOffsetInFile = fSavedCurOffsetInFile; + fCurOffsetWithinFrame = fSavedCurOffsetWithinFrame; +} + +void MatroskaFileParser::seekToFilePosition(u_int64_t offsetInFile) { + ByteStreamFileSource* fileSource = (ByteStreamFileSource*)fInputSource; // we know it's a "ByteStreamFileSource" + if (fileSource != NULL) { + fileSource->seekToByteAbsolute(offsetInFile); + resetStateAfterSeeking(); + } +} + +void MatroskaFileParser::seekToEndOfFile() { + ByteStreamFileSource* fileSource = (ByteStreamFileSource*)fInputSource; // we know it's a "ByteStreamFileSource" + if (fileSource != NULL) { + fileSource->seekToEnd(); + resetStateAfterSeeking(); + } +} + +void MatroskaFileParser::resetStateAfterSeeking() { + // Presentation times aren't affected by the seek; they continue advancing as normal. + // Therefore, ensure that they continue to be aligned with 'wall clock' time: + resetPresentationTimes(); + + // Because we're resuming parsing after seeking to a new position in the file, reset the parser state: + fCurOffsetInFile = fSavedCurOffsetInFile = 0; + fCurOffsetWithinFrame = fSavedCurOffsetWithinFrame = 0; + flushInput(); +} + +void MatroskaFileParser::resetPresentationTimes() { + if (fOurDemux != NULL) fOurDemux->resetState(); + + fPresentationTimeOffset = 0.0; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MatroskaFileParser.hh b/src/big/mpp/middleware/src/live555/liveMedia/MatroskaFileParser.hh new file mode 100644 index 000000000..f29425318 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MatroskaFileParser.hh @@ -0,0 +1,139 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A parser for a Matroska file. +// C++ header + +#ifndef _MATROSKA_FILE_PARSER_HH + +#ifndef _STREAM_PARSER_HH +#include "StreamParser.hh" +#endif +#ifndef _MATROSKA_FILE_HH +#include "MatroskaFile.hh" +#endif +#ifndef _EBML_NUMBER_HH +#include "EBMLNumber.hh" +#endif + +// An enum representing the current state of the parser: +enum MatroskaParseState { + PARSING_START_OF_FILE, + LOOKING_FOR_TRACKS, + PARSING_TRACK, + PARSING_CUES, + LOOKING_FOR_CLUSTER, + LOOKING_FOR_BLOCK, + PARSING_BLOCK, + DELIVERING_FRAME_WITHIN_BLOCK, + DELIVERING_FRAME_BYTES +}; + +class MatroskaFileParser: public StreamParser { +public: + MatroskaFileParser(MatroskaFile& ourFile, FramedSource* inputSource, + FramedSource::onCloseFunc* onEndFunc, void* onEndClientData, + MatroskaDemux* ourDemux = NULL); + virtual ~MatroskaFileParser(); + + void seekToTime(double& seekNPT); + void pause(); + + // StreamParser 'client continue' function: + static void continueParsing(void* clientData, unsigned char* ptr, unsigned size, struct timeval presentationTime); + void continueParsing(); + +private: + // Parsing functions: + Boolean parse(); + // returns True iff we have finished parsing to the end of all 'Track' headers (on initialization) + + Boolean parseStartOfFile(); + void lookForNextTrack(); + Boolean parseTrack(); + Boolean parseCues(); + + void lookForNextBlock(); + void parseBlock(); + Boolean deliverFrameWithinBlock(); + void deliverFrameBytes(); + + void getCommonFrameBytes(MatroskaTrack* track, u_int8_t* to, unsigned numBytesToGet, unsigned numBytesToSkip); + + Boolean parseEBMLNumber(EBMLNumber& num); + Boolean parseEBMLIdAndSize(EBMLId& id, EBMLDataSize& size); + Boolean parseEBMLVal_unsigned64(EBMLDataSize& size, u_int64_t& result); + Boolean parseEBMLVal_unsigned(EBMLDataSize& size, unsigned& result); + Boolean parseEBMLVal_float(EBMLDataSize& size, float& result); + Boolean parseEBMLVal_string(EBMLDataSize& size, char*& result); + // Note: "result" is dynamically allocated; the caller must delete[] it later + Boolean parseEBMLVal_binary(EBMLDataSize& size, u_int8_t*& result); + // Note: "result" is dynamically allocated; the caller must delete[] it later + void skipHeader(EBMLDataSize const& size); + void skipRemainingHeaderBytes(Boolean isContinuation); + + void setParseState(); + + void seekToFilePosition(u_int64_t offsetInFile); + void seekToEndOfFile(); + void resetStateAfterSeeking(); // common code, called by both of the above + + void resetPresentationTimes(); + // called after a seek or pause to ensure that presentation times continue to be + // aligned with 'wall clock' time + +private: // redefined virtual functions + virtual void restoreSavedParserState(); + +private: + // General state for parsing: + MatroskaFile& fOurFile; + FramedSource* fInputSource; + FramedSource::onCloseFunc* fOnEndFunc; + void* fOnEndClientData; + MatroskaDemux* fOurDemux; + MatroskaParseState fCurrentParseState; + u_int64_t fCurOffsetInFile, fSavedCurOffsetInFile, fLimitOffsetInFile; + + // For skipping over (possibly large) headers: + u_int64_t fNumHeaderBytesToSkip; + + // For parsing 'Seek ID's: + EBMLId fLastSeekId; + + // Parameters of the most recently-parsed 'Cluster': + unsigned fClusterTimecode; + + // Parameters of the most recently-parsed 'Block': + unsigned fBlockSize; + unsigned fBlockTrackNumber; + short fBlockTimecode; + unsigned fNumFramesInBlock; + unsigned* fFrameSizesWithinBlock; + + // Parameters of the most recently-parsed frame within a 'Block': + double fPresentationTimeOffset; + unsigned fNextFrameNumberToDeliver; + unsigned fCurOffsetWithinFrame, fSavedCurOffsetWithinFrame; // used if track->haveSubframes() + + // Parameters of the (sub)frame that's currently being delivered: + u_int8_t* fCurFrameTo; + unsigned fCurFrameNumBytesToGet; + unsigned fCurFrameNumBytesToSkip; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MatroskaFileServerDemux.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MatroskaFileServerDemux.cpp new file mode 100644 index 000000000..9f9ad232f --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MatroskaFileServerDemux.cpp @@ -0,0 +1,130 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A server demultiplexor for a Matroska file +// Implementation + +#include "MatroskaFileServerDemux.hh" +#include "MP3AudioMatroskaFileServerMediaSubsession.hh" +#include "MatroskaFileServerMediaSubsession.hh" + +void MatroskaFileServerDemux +::createNew(UsageEnvironment& env, char const* fileName, + onCreationFunc* onCreation, void* onCreationClientData, + char const* preferredLanguage) { + (void)new MatroskaFileServerDemux(env, fileName, + onCreation, onCreationClientData, + preferredLanguage); +} + +ServerMediaSubsession* MatroskaFileServerDemux::newServerMediaSubsession() { + unsigned dummyResultTrackNumber; + return newServerMediaSubsession(dummyResultTrackNumber); +} + +ServerMediaSubsession* MatroskaFileServerDemux +::newServerMediaSubsession(unsigned& resultTrackNumber) { + ServerMediaSubsession* result; + resultTrackNumber = 0; + + for (result = NULL; result == NULL && fNextTrackTypeToCheck != MATROSKA_TRACK_TYPE_OTHER; fNextTrackTypeToCheck <<= 1) { + if (fNextTrackTypeToCheck == MATROSKA_TRACK_TYPE_VIDEO) resultTrackNumber = fOurMatroskaFile->chosenVideoTrackNumber(); + else if (fNextTrackTypeToCheck == MATROSKA_TRACK_TYPE_AUDIO) resultTrackNumber = fOurMatroskaFile->chosenAudioTrackNumber(); + else if (fNextTrackTypeToCheck == MATROSKA_TRACK_TYPE_SUBTITLE) resultTrackNumber = fOurMatroskaFile->chosenSubtitleTrackNumber(); + + result = newServerMediaSubsessionByTrackNumber(resultTrackNumber); + } + + return result; +} + +ServerMediaSubsession* MatroskaFileServerDemux +::newServerMediaSubsessionByTrackNumber(unsigned trackNumber) { + MatroskaTrack* track = fOurMatroskaFile->lookup(trackNumber); + if (track == NULL) return NULL; + + // Use the track's "codecID" string to figure out which "ServerMediaSubsession" subclass to use: + ServerMediaSubsession* result = NULL; + if (strcmp(track->mimeType, "audio/MPEG") == 0) { + result = MP3AudioMatroskaFileServerMediaSubsession::createNew(*this, track); + } else { + result = MatroskaFileServerMediaSubsession::createNew(*this, track); + } + + if (result != NULL) { +#ifdef DEBUG + fprintf(stderr, "Created 'ServerMediaSubsession' object for track #%d: %s (%s)\n", track->trackNumber, track->codecID, track->mimeType); +#endif + } + + return result; +} + +FramedSource* MatroskaFileServerDemux::newDemuxedTrack(unsigned clientSessionId, unsigned trackNumber) { + MatroskaDemux* demuxToUse = NULL; + + if (clientSessionId != 0 && clientSessionId == fLastClientSessionId) { + demuxToUse = fLastCreatedDemux; // use the same demultiplexor as before + // Note: This code relies upon the fact that the creation of streams for different + // client sessions do not overlap - so all demuxed tracks are created for one "MatroskaDemux" at a time. + // Also, the "clientSessionId != 0" test is a hack, because 'session 0' is special; its audio and video streams + // are created and destroyed one-at-a-time, rather than both streams being + // created, and then (later) both streams being destroyed (as is the case + // for other ('real') session ids). Because of this, a separate demultiplexor is used for each 'session 0' track. + } + + if (demuxToUse == NULL) demuxToUse = fOurMatroskaFile->newDemux(onDemuxDeletion, this); + + fLastClientSessionId = clientSessionId; + fLastCreatedDemux = demuxToUse; + + return demuxToUse->newDemuxedTrackByTrackNumber(trackNumber); +} + +MatroskaFileServerDemux +::MatroskaFileServerDemux(UsageEnvironment& env, char const* fileName, + onCreationFunc* onCreation, void* onCreationClientData, + char const* preferredLanguage) + : Medium(env), + fFileName(fileName), fOnCreation(onCreation), fOnCreationClientData(onCreationClientData), + fNextTrackTypeToCheck(0x1), fLastClientSessionId(0), fLastCreatedDemux(NULL) { + MatroskaFile::createNew(env, fileName, onMatroskaFileCreation, this, preferredLanguage); +} + +MatroskaFileServerDemux::~MatroskaFileServerDemux() { + Medium::close(fOurMatroskaFile); +} + +void MatroskaFileServerDemux::onMatroskaFileCreation(MatroskaFile* newFile, void* clientData) { + ((MatroskaFileServerDemux*)clientData)->onMatroskaFileCreation(newFile); +} + +void MatroskaFileServerDemux::onMatroskaFileCreation(MatroskaFile* newFile) { + fOurMatroskaFile = newFile; + + // Now, call our own creation notification function: + if (fOnCreation != NULL) (*fOnCreation)(this, fOnCreationClientData); +} + +void MatroskaFileServerDemux +::onDemuxDeletion(void* clientData, MatroskaDemux* demuxBeingDeleted) { + ((MatroskaFileServerDemux*)clientData)->onDemuxDeletion(demuxBeingDeleted); +} + +void MatroskaFileServerDemux::onDemuxDeletion(MatroskaDemux* demuxBeingDeleted) { + if (fLastCreatedDemux == demuxBeingDeleted) fLastCreatedDemux = NULL; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MatroskaFileServerMediaSubsession.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MatroskaFileServerMediaSubsession.cpp new file mode 100644 index 000000000..8313b7c70 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MatroskaFileServerMediaSubsession.cpp @@ -0,0 +1,65 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A 'ServerMediaSubsession' object that creates new, unicast, "RTPSink"s +// on demand, from a track within a Matroska file. +// Implementation + +#include "MatroskaFileServerMediaSubsession.hh" +#include "MatroskaDemuxedTrack.hh" +#include "FramedFilter.hh" + +MatroskaFileServerMediaSubsession* MatroskaFileServerMediaSubsession +::createNew(MatroskaFileServerDemux& demux, MatroskaTrack* track) { + return new MatroskaFileServerMediaSubsession(demux, track); +} + +MatroskaFileServerMediaSubsession +::MatroskaFileServerMediaSubsession(MatroskaFileServerDemux& demux, MatroskaTrack* track) + : FileServerMediaSubsession(demux.envir(), demux.fileName(), False), + fOurDemux(demux), fTrack(track), fNumFiltersInFrontOfTrack(0) { +} + +MatroskaFileServerMediaSubsession::~MatroskaFileServerMediaSubsession() { +} + +float MatroskaFileServerMediaSubsession::duration() const { return fOurDemux.fileDuration(); } + +void MatroskaFileServerMediaSubsession +::seekStreamSource(FramedSource* inputSource, double& seekNPT, double /*streamDuration*/, u_int64_t& /*numBytes*/) { + for (unsigned i = 0; i < fNumFiltersInFrontOfTrack; ++i) { + // "inputSource" is a filter. Go back to *its* source: + inputSource = ((FramedFilter*)inputSource)->inputSource(); + } + ((MatroskaDemuxedTrack*)inputSource)->seekToTime(seekNPT); +} + +FramedSource* MatroskaFileServerMediaSubsession +::createNewStreamSource(unsigned clientSessionId, unsigned& estBitrate) { + FramedSource* baseSource = fOurDemux.newDemuxedTrack(clientSessionId, fTrack->trackNumber); + if (baseSource == NULL) return NULL; + + return fOurDemux.ourMatroskaFile() + ->createSourceForStreaming(baseSource, fTrack->trackNumber, + estBitrate, fNumFiltersInFrontOfTrack); +} + +RTPSink* MatroskaFileServerMediaSubsession +::createNewRTPSink(Groupsock* rtpGroupsock, unsigned char rtpPayloadTypeIfDynamic, FramedSource* /*inputSource*/) { + return fOurDemux.ourMatroskaFile() + ->createRTPSinkForTrackNumber(fTrack->trackNumber, rtpGroupsock, rtpPayloadTypeIfDynamic); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MatroskaFileServerMediaSubsession.hh b/src/big/mpp/middleware/src/live555/liveMedia/MatroskaFileServerMediaSubsession.hh new file mode 100644 index 000000000..9108c9284 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MatroskaFileServerMediaSubsession.hh @@ -0,0 +1,55 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A 'ServerMediaSubsession' object that creates new, unicast, "RTPSink"s +// on demand, from a track within a Matroska file. +// C++ header + +#ifndef _MATROSKA_FILE_SERVER_MEDIA_SUBSESSION_HH +#define _MATROSKA_FILE_SERVER_MEDIA_SUBSESSION_HH + +#ifndef _FILE_SERVER_MEDIA_SUBSESSION_HH +#include "FileServerMediaSubsession.hh" +#endif +#ifndef _MATROSKA_FILE_SERVER_DEMUX_HH +#include "MatroskaFileServerDemux.hh" +#endif + +class MatroskaFileServerMediaSubsession: public FileServerMediaSubsession { +public: + static MatroskaFileServerMediaSubsession* + createNew(MatroskaFileServerDemux& demux, MatroskaTrack* track); + +protected: + MatroskaFileServerMediaSubsession(MatroskaFileServerDemux& demux, MatroskaTrack* track); + // called only by createNew(), or by subclass constructors + virtual ~MatroskaFileServerMediaSubsession(); + +protected: // redefined virtual functions + virtual float duration() const; + virtual void seekStreamSource(FramedSource* inputSource, double& seekNPT, double streamDuration, u_int64_t& numBytes); + virtual FramedSource* createNewStreamSource(unsigned clientSessionId, + unsigned& estBitrate); + virtual RTPSink* createNewRTPSink(Groupsock* rtpGroupsock, unsigned char rtpPayloadTypeIfDynamic, FramedSource* inputSource); + +protected: + MatroskaFileServerDemux& fOurDemux; + MatroskaTrack* fTrack; + unsigned fNumFiltersInFrontOfTrack; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/Media.cpp b/src/big/mpp/middleware/src/live555/liveMedia/Media.cpp new file mode 100644 index 000000000..da9a1d2a3 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/Media.cpp @@ -0,0 +1,163 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Media +// Implementation + +#include "Media.hh" +#include "HashTable.hh" + +////////// Medium ////////// + +Medium::Medium(UsageEnvironment& env) + : fEnviron(env), fNextTask(NULL) { + // First generate a name for the new medium: + MediaLookupTable::ourMedia(env)->generateNewName(fMediumName, mediumNameMaxLen); + env.setResultMsg(fMediumName); + + // Then add it to our table: + MediaLookupTable::ourMedia(env)->addNew(this, fMediumName); +} + +Medium::~Medium() { + // Remove any tasks that might be pending for us: + fEnviron.taskScheduler().unscheduleDelayedTask(fNextTask); +} + +Boolean Medium::lookupByName(UsageEnvironment& env, char const* mediumName, + Medium*& resultMedium) { + resultMedium = MediaLookupTable::ourMedia(env)->lookup(mediumName); + if (resultMedium == NULL) { + env.setResultMsg("Medium ", mediumName, " does not exist"); + return False; + } + + return True; +} + +void Medium::close(UsageEnvironment& env, char const* name) { + MediaLookupTable::ourMedia(env)->remove(name); +} + +void Medium::close(Medium* medium) { + if (medium == NULL) return; + + close(medium->envir(), medium->name()); +} + +Boolean Medium::isSource() const { + return False; // default implementation +} + +Boolean Medium::isSink() const { + return False; // default implementation +} + +Boolean Medium::isRTCPInstance() const { + return False; // default implementation +} + +Boolean Medium::isRTSPClient() const { + return False; // default implementation +} + +Boolean Medium::isRTSPServer() const { + return False; // default implementation +} + +Boolean Medium::isMediaSession() const { + return False; // default implementation +} + +Boolean Medium::isServerMediaSession() const { + return False; // default implementation +} + + +////////// _Tables implementation ////////// + +_Tables* _Tables::getOurTables(UsageEnvironment& env, Boolean createIfNotPresent) { + if (env.liveMediaPriv == NULL && createIfNotPresent) { + env.liveMediaPriv = new _Tables(env); + } + return (_Tables*)(env.liveMediaPriv); +} + +void _Tables::reclaimIfPossible() { + if (mediaTable == NULL && socketTable == NULL) { + fEnv.liveMediaPriv = NULL; + delete this; + } +} + +_Tables::_Tables(UsageEnvironment& env) + : mediaTable(NULL), socketTable(NULL), fEnv(env) { +} + +_Tables::~_Tables() { +} + + +////////// MediaLookupTable implementation ////////// + +MediaLookupTable* MediaLookupTable::ourMedia(UsageEnvironment& env) { + _Tables* ourTables = _Tables::getOurTables(env); + if (ourTables->mediaTable == NULL) { + // Create a new table to record the media that are to be created in + // this environment: + ourTables->mediaTable = new MediaLookupTable(env); + } + return ourTables->mediaTable; +} + +Medium* MediaLookupTable::lookup(char const* name) const { + return (Medium*)(fTable->Lookup(name)); +} + +void MediaLookupTable::addNew(Medium* medium, char* mediumName) { + fTable->Add(mediumName, (void*)medium); +} + +void MediaLookupTable::remove(char const* name) { + Medium* medium = lookup(name); + if (medium != NULL) { + fTable->Remove(name); + if (fTable->IsEmpty()) { + // We can also delete ourselves (to reclaim space): + _Tables* ourTables = _Tables::getOurTables(fEnv); + delete this; + ourTables->mediaTable = NULL; + ourTables->reclaimIfPossible(); + } + + delete medium; + } +} + +void MediaLookupTable::generateNewName(char* mediumName, + unsigned /*maxLen*/) { + // We should really use snprintf() here, but not all systems have it + sprintf(mediumName, "liveMedia%d", fNameGenerator++); +} + +MediaLookupTable::MediaLookupTable(UsageEnvironment& env) + : fEnv(env), fTable(HashTable::create(STRING_HASH_KEYS)), fNameGenerator(0) { +} + +MediaLookupTable::~MediaLookupTable() { + delete fTable; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MediaSession.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MediaSession.cpp new file mode 100644 index 000000000..bfb76c62b --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MediaSession.cpp @@ -0,0 +1,1575 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A data structure that represents a session that consists of +// potentially multiple (audio and/or video) sub-sessions +// Implementation + +#include "liveMedia.hh" +#include "Locale.hh" +#include "Base64.hh" +#include "GroupsockHelper.hh" +#include + +////////// MediaSession ////////// + +MediaSession* MediaSession::createNew(UsageEnvironment& env, + char const* sdpDescription) { + MediaSession* newSession = new MediaSession(env); + if (newSession != NULL) { + if (!newSession->initializeWithSDP(sdpDescription)) { + delete newSession; + return NULL; + } + } + + return newSession; +} + +Boolean MediaSession::lookupByName(UsageEnvironment& env, + char const* instanceName, + MediaSession*& resultSession) { + resultSession = NULL; // unless we succeed + + Medium* medium; + if (!Medium::lookupByName(env, instanceName, medium)) return False; + + if (!medium->isMediaSession()) { + env.setResultMsg(instanceName, " is not a 'MediaSession' object"); + return False; + } + + resultSession = (MediaSession*)medium; + return True; +} + +MediaSession::MediaSession(UsageEnvironment& env) + : Medium(env), + fSubsessionsHead(NULL), fSubsessionsTail(NULL), + fConnectionEndpointName(NULL), fConnectionEndpointNameAddressFamily(AF_UNSPEC), + fMaxPlayStartTime(0.0f), fMaxPlayEndTime(0.0f), fAbsStartTime(NULL), fAbsEndTime(NULL), + fScale(1.0f), fSpeed(1.0f), + fMediaSessionType(NULL), fSessionName(NULL), fSessionDescription(NULL), fControlPath(NULL), + fMIKEYState(NULL), fCrypto(NULL) { + fSourceFilterAddr = nullAddress(); + + // Get our host name, and use this for the RTCP CNAME: + const unsigned maxCNAMElen = 100; + char CNAME[maxCNAMElen+1]; +#ifndef CRIS + gethostname((char*)CNAME, maxCNAMElen); +#else + // "gethostname()" isn't defined for this platform + sprintf(CNAME, "unknown host %d", (unsigned)(our_random()*0x7FFFFFFF)); +#endif + CNAME[maxCNAMElen] = '\0'; // just in case + fCNAME = strDup(CNAME); +} + +MediaSession::~MediaSession() { + delete fSubsessionsHead; + delete[] fCNAME; + delete[] fConnectionEndpointName; + delete[] fAbsStartTime; delete[] fAbsEndTime; + delete[] fMediaSessionType; + delete[] fSessionName; + delete[] fSessionDescription; + delete[] fControlPath; + delete fCrypto; delete fMIKEYState; +} + +Boolean MediaSession::isMediaSession() const { + return True; +} + +MediaSubsession* MediaSession::createNewMediaSubsession() { + // default implementation: + return new MediaSubsession(*this); +} + +Boolean MediaSession::initializeWithSDP(char const* sdpDescription) { + if (sdpDescription == NULL) return False; + + // Begin by processing all SDP lines until we see the first "m=" + char const* sdpLine = sdpDescription; + char const* nextSDPLine; + while (1) { + if (!parseSDPLine(sdpLine, nextSDPLine)) return False; + //##### We should really check for the correct SDP version (v=0) + if (sdpLine[0] == 'm') break; + sdpLine = nextSDPLine; + if (sdpLine == NULL) break; // there are no m= lines at all + + // Check for various special SDP lines that we understand: + if (parseSDPLine_s(sdpLine)) continue; + if (parseSDPLine_i(sdpLine)) continue; + if (parseSDPLine_c(sdpLine)) continue; + if (parseSDPAttribute_control(sdpLine)) continue; + if (parseSDPAttribute_range(sdpLine)) continue; + if (parseSDPAttribute_type(sdpLine)) continue; + if (parseSDPAttribute_source_filter(sdpLine)) continue; + if (parseSDPAttribute_key_mgmt(sdpLine)) continue; + } + + while (sdpLine != NULL) { + // We have a "m=" line, representing a new sub-session: + MediaSubsession* subsession = createNewMediaSubsession(); + if (subsession == NULL) { + envir().setResultMsg("Unable to create new MediaSubsession"); + return False; + } + + // Parse the line as "m= " + // or "m= / " + // (Should we be checking for >1 payload format number here?)##### + char* mediumName = strDupSize(sdpLine); // ensures we have enough space + char const* protocolName = NULL; + unsigned payloadFormat; + if ((sscanf(sdpLine, "m=%s %hu RTP/AVP %u", + mediumName, &subsession->fClientPortNum, &payloadFormat) == 3 || + sscanf(sdpLine, "m=%s %hu/%*u RTP/AVP %u", + mediumName, &subsession->fClientPortNum, &payloadFormat) == 3) + && payloadFormat <= 127) { + protocolName = "RTP"; + } else if ((sscanf(sdpLine, "m=%s %hu RTP/SAVP %u", + mediumName, &subsession->fClientPortNum, &payloadFormat) == 3 || + sscanf(sdpLine, "m=%s %hu/%*u RTP/SAVP %u", + mediumName, &subsession->fClientPortNum, &payloadFormat) == 3) + && payloadFormat <= 127) { + protocolName = "SRTP"; + } else if ((sscanf(sdpLine, "m=%s %hu UDP %u", + mediumName, &subsession->fClientPortNum, &payloadFormat) == 3 || + sscanf(sdpLine, "m=%s %hu udp %u", + mediumName, &subsession->fClientPortNum, &payloadFormat) == 3 || + sscanf(sdpLine, "m=%s %hu RAW/RAW/UDP %u", + mediumName, &subsession->fClientPortNum, &payloadFormat) == 3) + && payloadFormat <= 127) { + // This is a RAW UDP source + protocolName = "UDP"; + } else { + // This "m=" line is bad; output an error message saying so: + char* sdpLineStr; + if (nextSDPLine == NULL) { + sdpLineStr = (char*)sdpLine; + } else { + sdpLineStr = strDup(sdpLine); + sdpLineStr[nextSDPLine-sdpLine] = '\0'; + } + envir() << "Bad SDP \"m=\" line: " << sdpLineStr << "\n"; + if (sdpLineStr != (char*)sdpLine) delete[] sdpLineStr; + + delete[] mediumName; + delete subsession; + + // Skip the following SDP lines, up until the next "m=": + while (1) { + sdpLine = nextSDPLine; + if (sdpLine == NULL) break; // we've reached the end + if (!parseSDPLine(sdpLine, nextSDPLine)) return False; + + if (sdpLine[0] == 'm') break; // we've reached the next subsession + } + continue; + } + + // Insert this subsession at the end of the list: + if (fSubsessionsTail == NULL) { + fSubsessionsHead = fSubsessionsTail = subsession; + } else { + fSubsessionsTail->setNext(subsession); + fSubsessionsTail = subsession; + } + + subsession->serverPortNum = subsession->fClientPortNum; // by default + + char const* mStart = sdpLine; + subsession->fSavedSDPLines = strDup(mStart); + + subsession->fMediumName = strDup(mediumName); + delete[] mediumName; + subsession->fProtocolName = strDup(protocolName); + subsession->fRTPPayloadFormat = payloadFormat; + + // Process the following SDP lines, up until the next "m=": + while (1) { + sdpLine = nextSDPLine; + if (sdpLine == NULL) break; // we've reached the end + if (!parseSDPLine(sdpLine, nextSDPLine)) return False; + + if (sdpLine[0] == 'm') break; // we've reached the next subsession + + // Check for various special SDP lines that we understand: + if (subsession->parseSDPLine_c(sdpLine)) continue; + if (subsession->parseSDPLine_b(sdpLine)) continue; + if (subsession->parseSDPAttribute_rtpmap(sdpLine)) continue; + if (subsession->parseSDPAttribute_rtcpmux(sdpLine)) continue; + if (subsession->parseSDPAttribute_control(sdpLine)) continue; + if (subsession->parseSDPAttribute_range(sdpLine)) continue; + if (subsession->parseSDPAttribute_fmtp(sdpLine)) continue; + if (subsession->parseSDPAttribute_source_filter(sdpLine)) continue; + if (subsession->parseSDPAttribute_x_dimensions(sdpLine)) continue; + if (subsession->parseSDPAttribute_framerate(sdpLine)) continue; + if (subsession->parseSDPAttribute_key_mgmt(sdpLine)) continue; + + // (Later, check for malformed lines, and other valid SDP lines#####) + + // added for audio back channel + if (subsession->parseSDPAttribute_flag(sdpLine)) continue; + } + if (sdpLine != NULL) subsession->fSavedSDPLines[sdpLine-mStart] = '\0'; + + // If we don't yet know the codec name, try looking it up from the + // list of static payload types: + if (subsession->fCodecName == NULL) { + subsession->fCodecName + = lookupPayloadFormat(subsession->fRTPPayloadFormat, + subsession->fRTPTimestampFrequency, + subsession->fNumChannels); + if (subsession->fCodecName == NULL) { + char typeStr[20]; + sprintf(typeStr, "%d", subsession->fRTPPayloadFormat); + envir().setResultMsg("Unknown codec name for RTP payload type ", + typeStr); + return False; + } + } + + // If we don't yet know this subsession's RTP timestamp frequency + // (because it uses a dynamic payload type and the corresponding + // SDP "rtpmap" attribute erroneously didn't specify it), + // then guess it now: + if (subsession->fRTPTimestampFrequency == 0) { + subsession->fRTPTimestampFrequency + = guessRTPTimestampFrequency(subsession->fMediumName, + subsession->fCodecName); + } + } + + return True; +} + +Boolean MediaSession::parseSDPLine(char const* inputLine, + char const*& nextLine){ + // Begin by finding the start of the next line (if any): + nextLine = NULL; + for (char const* ptr = inputLine; *ptr != '\0'; ++ptr) { + if (*ptr == '\r' || *ptr == '\n') { + // We found the end of the line + ++ptr; + while (*ptr == '\r' || *ptr == '\n') ++ptr; + nextLine = ptr; + if (nextLine[0] == '\0') nextLine = NULL; // special case for end + break; + } + } + + // Then, check that this line is a SDP line of the form = + // (However, we also accept blank lines in the input.) + if (inputLine[0] == '\r' || inputLine[0] == '\n') return True; + if (strlen(inputLine) < 2 || inputLine[1] != '=' + || inputLine[0] < 'a' || inputLine[0] > 'z') { + envir().setResultMsg("Invalid SDP line: ", inputLine); + return False; + } + + return True; +} + +// Common code used to parse many string values within SDP lines: +static Boolean parseStringValue(char const* sdpLine, char const* searchFormat, char*& result) { + Boolean parseSuccess = False; + char* buffer = strDupSize(sdpLine); + + if (sscanf(sdpLine, searchFormat, buffer) == 1) { + delete[] result; result = strDup(buffer); + parseSuccess = True; + } + delete[] buffer; + + return parseSuccess; +} + +static Boolean parseTwoStringValues(char const* sdpLine, char const* searchFormat, + char*& result1, char*& result2) { + Boolean parseSuccess = False; + size_t sdpLineSize = strlen(sdpLine) + 1; + char* buffer1 = new char[sdpLineSize]; + char* buffer2 = new char[sdpLineSize]; + + if (sscanf(sdpLine, searchFormat, buffer1, buffer2) == 2) { + delete[] result1; result1 = strDup(buffer1); + delete[] result2; result2 = strDup(buffer2); + parseSuccess = True; + } + delete[] buffer1; + delete[] buffer2; + + return parseSuccess; +} + +static MIKEYState* parseSDPAttribute_key_mgmtToMIKEY(char const* sdpLine) { + char* keyMgmtPrtclId = NULL; + char* keyMgmtData = NULL; + MIKEYState* resultMIKEYState = NULL; + + do { + // Check for a "a=key-mgmt: " line: + if (!parseTwoStringValues(sdpLine, "a=key-mgmt:%s %s", keyMgmtPrtclId, keyMgmtData)) break; + + // We understand only the 'protocol id' "mikey": + if (strcmp(keyMgmtPrtclId, "mikey") != 0) break; + + // Base64-decode the "keyMgmtData" string: + unsigned keyMgmtData_decodedSize; + u_int8_t* keyMgmtData_decoded = base64Decode(keyMgmtData, keyMgmtData_decodedSize); + if (keyMgmtData_decoded == NULL) break; + + resultMIKEYState = MIKEYState::createNew(keyMgmtData_decoded, keyMgmtData_decodedSize); + delete[] keyMgmtData_decoded; + } while (0); + + delete[] keyMgmtPrtclId; + delete[] keyMgmtData; + return resultMIKEYState; +} + +Boolean MediaSession::parseSDPLine_s(char const* sdpLine) { + // Check for "s=" line + return parseStringValue(sdpLine, "s=%[^\r\n]", fSessionName); +} + +Boolean MediaSession::parseSDPLine_i(char const* sdpLine) { + // Check for "i=" line + return parseStringValue(sdpLine, "i=%[^\r\n]", fSessionDescription); +} + +Boolean MediaSession::parseSDPLine_c(char const* sdpLine) { + // Check for "c=IN IP4 " + // or "c=IN IP4 /" + // (ditto for "c=IN IP6 ...") + // (Later, do something with also #####) + if (parseStringValue(sdpLine, "c=IN IP4 %[^/\r\n]", fConnectionEndpointName)) { + fConnectionEndpointNameAddressFamily = AF_INET; + return True; + } else if (parseStringValue(sdpLine, "c=IN IP6 %[^/\r\n]", fConnectionEndpointName)) { + fConnectionEndpointNameAddressFamily = AF_INET6; + return True; + } + + return False; +} + +Boolean MediaSession::parseSDPAttribute_type(char const* sdpLine) { + // Check for a "a=type:broadcast|meeting|moderated|test|H.332|recvonly" line: + return parseStringValue(sdpLine, "a=type: %[^ ]", fMediaSessionType); +} + +Boolean MediaSession::parseSDPAttribute_control(char const* sdpLine) { + // Check for a "a=control:" line: + return parseStringValue(sdpLine, "a=control: %s", fControlPath); +} + +static Boolean parseRangeAttribute(char const* sdpLine, double& startTime, double& endTime) { + return sscanf(sdpLine, "a=range: npt = %lg - %lg", &startTime, &endTime) == 2; +} + +static Boolean parseRangeAttribute(char const* sdpLine, char*& absStartTime, char*& absEndTime) { + size_t len = strlen(sdpLine) + 1; + char* as = new char[len]; + char* ae = new char[len]; + int sscanfResult = sscanf(sdpLine, "a=range: clock = %[^-\r\n]-%[^\r\n]", as, ae); + if (sscanfResult == 2) { + absStartTime = as; + absEndTime = ae; + } else if (sscanfResult == 1) { + absStartTime = as; + delete[] ae; + } else { + delete[] as; delete[] ae; + return False; + } + + return True; +} + +Boolean MediaSession::parseSDPAttribute_range(char const* sdpLine) { + // Check for a "a=range:npt=-" line: + // (Later handle other kinds of "a=range" attributes also???#####) + Boolean parseSuccess = False; + + double playStartTime; + double playEndTime; + if (parseRangeAttribute(sdpLine, playStartTime, playEndTime)) { + parseSuccess = True; + if (playStartTime > fMaxPlayStartTime) { + fMaxPlayStartTime = playStartTime; + } + if (playEndTime > fMaxPlayEndTime) { + fMaxPlayEndTime = playEndTime; + } + } else if (parseRangeAttribute(sdpLine, _absStartTime(), _absEndTime())) { + parseSuccess = True; + } + + return parseSuccess; +} + +static Boolean parseSourceFilterAttribute(char const* sdpLine, + struct sockaddr_storage& sourceFilterAddr) { + // Check for a "a=source-filter:incl IN IP4 " line (or "IN IP6"). + // Note: At present, we don't check that really matches + // one of our multicast addresses. We also don't support more than + // one ##### + Boolean result = False; // until we succeed + char* sourceName = NULL; + do { + int addressFamily; + if (parseStringValue(sdpLine, "a=source-filter: incl IN IP4 %*s %s", sourceName)) { + addressFamily = AF_INET; + } else if (parseStringValue(sdpLine, "a=source-filter: incl IN IP6 %*s %s", sourceName)) { + addressFamily = AF_INET6; + } else break; + + // Now, convert this name to an address, if we can: + NetAddressList addresses(sourceName, addressFamily); + if (addresses.numAddresses() == 0) break; + + copyAddress(sourceFilterAddr, addresses.firstAddress()); + result = True; + } while (0); + + delete[] sourceName; + return result; +} + +Boolean MediaSession +::parseSDPAttribute_source_filter(char const* sdpLine) { + return parseSourceFilterAttribute(sdpLine, fSourceFilterAddr); +} + +Boolean MediaSession::parseSDPAttribute_key_mgmt(char const* sdpLine) { + MIKEYState* newMIKEYState = parseSDPAttribute_key_mgmtToMIKEY(sdpLine); + if (newMIKEYState == NULL) return False; + + delete fCrypto; delete fMIKEYState; + fMIKEYState = newMIKEYState; + fCrypto = new SRTPCryptographicContext(*fMIKEYState); + + return True; +} + +char* MediaSession::lookupPayloadFormat(unsigned char rtpPayloadType, + unsigned& freq, unsigned& nCh) { + // Look up the codec name and timestamp frequency for known (static) + // RTP payload formats. + char const* temp = NULL; + switch (rtpPayloadType) { + case 0: {temp = "PCMU"; freq = 8000; nCh = 1; break;} + case 2: {temp = "G726-32"; freq = 8000; nCh = 1; break;} + case 3: {temp = "GSM"; freq = 8000; nCh = 1; break;} + case 4: {temp = "G723"; freq = 8000; nCh = 1; break;} + case 5: {temp = "DVI4"; freq = 8000; nCh = 1; break;} + case 6: {temp = "DVI4"; freq = 16000; nCh = 1; break;} + case 7: {temp = "LPC"; freq = 8000; nCh = 1; break;} + case 8: {temp = "PCMA"; freq = 8000; nCh = 1; break;} + case 9: {temp = "G722"; freq = 8000; nCh = 1; break;} + case 10: {temp = "L16"; freq = 44100; nCh = 2; break;} + case 11: {temp = "L16"; freq = 44100; nCh = 1; break;} + case 12: {temp = "QCELP"; freq = 8000; nCh = 1; break;} + case 14: {temp = "MPA"; freq = 90000; nCh = 1; break;} + // 'number of channels' is actually encoded in the media stream + case 15: {temp = "G728"; freq = 8000; nCh = 1; break;} + case 16: {temp = "DVI4"; freq = 11025; nCh = 1; break;} + case 17: {temp = "DVI4"; freq = 22050; nCh = 1; break;} + case 18: {temp = "G729"; freq = 8000; nCh = 1; break;} + case 25: {temp = "CELB"; freq = 90000; nCh = 1; break;} + case 26: {temp = "JPEG"; freq = 90000; nCh = 1; break;} + case 28: {temp = "NV"; freq = 90000; nCh = 1; break;} + case 31: {temp = "H261"; freq = 90000; nCh = 1; break;} + case 32: {temp = "MPV"; freq = 90000; nCh = 1; break;} + case 33: {temp = "MP2T"; freq = 90000; nCh = 1; break;} + case 34: {temp = "H263"; freq = 90000; nCh = 1; break;} + }; + + return strDup(temp); +} + +unsigned MediaSession::guessRTPTimestampFrequency(char const* mediumName, + char const* codecName) { + // By default, we assume that audio sessions use a frequency of 8000, + // video sessions use a frequency of 90000, + // and text sessions use a frequency of 1000. + // Begin by checking for known exceptions to this rule + // (where the frequency is known unambiguously (e.g., not like "DVI4")) + if (strcmp(codecName, "L16") == 0) return 44100; + if (strcmp(codecName, "MPA") == 0 + || strcmp(codecName, "MPA-ROBUST") == 0 + || strcmp(codecName, "X-MP3-DRAFT-00") == 0) return 90000; + + // Now, guess default values: + if (strcmp(mediumName, "video") == 0) return 90000; + else if (strcmp(mediumName, "text") == 0) return 1000; + return 8000; // for "audio", and any other medium +} + +char* MediaSession::absStartTime() const { + if (fAbsStartTime != NULL) return fAbsStartTime; + + // If a subsession has an 'absolute' start time, then use that: + MediaSubsessionIterator iter(*this); + MediaSubsession* subsession; + while ((subsession = iter.next()) != NULL) { + if (subsession->_absStartTime() != NULL) return subsession->_absStartTime(); + } + return NULL; +} + +char* MediaSession::absEndTime() const { + if (fAbsEndTime != NULL) return fAbsEndTime; + + // If a subsession has an 'absolute' end time, then use that: + MediaSubsessionIterator iter(*this); + MediaSubsession* subsession; + while ((subsession = iter.next()) != NULL) { + if (subsession->_absEndTime() != NULL) return subsession->_absEndTime(); + } + return NULL; +} + +Boolean MediaSession +::initiateByMediaType(char const* mimeType, + MediaSubsession*& resultSubsession, + int useSpecialRTPoffset) { + // Look through this session's subsessions for media that match "mimeType" + resultSubsession = NULL; + MediaSubsessionIterator iter(*this); + MediaSubsession* subsession; + while ((subsession = iter.next()) != NULL) { + Boolean wasAlreadyInitiated = subsession->readSource() != NULL; + if (!wasAlreadyInitiated) { + // Try to create a source for this subsession: + if (!subsession->initiate(useSpecialRTPoffset)) return False; + } + + // Make sure the source's MIME type is one that we handle: + if (strcmp(subsession->readSource()->MIMEtype(), mimeType) != 0) { + if (!wasAlreadyInitiated) subsession->deInitiate(); + continue; + } + + resultSubsession = subsession; + break; // use this + } + + if (resultSubsession == NULL) { + envir().setResultMsg("Session has no usable media subsession"); + return False; + } + + return True; +} + + +////////// MediaSubsessionIterator ////////// + +MediaSubsessionIterator::MediaSubsessionIterator(MediaSession const& session) + : fOurSession(session) { + reset(); +} + +MediaSubsessionIterator::~MediaSubsessionIterator() { +} + +MediaSubsession* MediaSubsessionIterator::next() { + MediaSubsession* result = fNextPtr; + + if (fNextPtr != NULL) fNextPtr = fNextPtr->fNext; + + return result; +} + +void MediaSubsessionIterator::reset() { + fNextPtr = fOurSession.fSubsessionsHead; +} + + +////////// SDPAttribute definition ////////// + +class SDPAttribute { +public: + SDPAttribute(char const* strValue, Boolean valueIsHexadecimal); + virtual ~SDPAttribute(); + + char const* strValue() const { return fStrValue; } + char const* strValueToLower() const { return fStrValueToLower; } + int intValue() const { return fIntValue; } + Boolean valueIsHexadecimal() const { return fValueIsHexadecimal; } + +private: + char* fStrValue; + char* fStrValueToLower; + int fIntValue; + Boolean fValueIsHexadecimal; +}; + + +////////// MediaSubsession ////////// + +MediaSubsession::MediaSubsession(MediaSession& parent) + : serverPortNum(0), sink(NULL), miscPtr(NULL), + fParent(parent), fNext(NULL), + fConnectionEndpointName(NULL), fConnectionEndpointNameAddressFamily(AF_UNSPEC), + fClientPortNum(0), fRTPPayloadFormat(0xFF), + fSavedSDPLines(NULL), fMediumName(NULL), fCodecName(NULL), fProtocolName(NULL), + fRTPTimestampFrequency(0), fMultiplexRTCPWithRTP(False), fControlPath(NULL), + fMIKEYState(NULL), fCrypto(NULL), + fSourceFilterAddr(parent.sourceFilterAddr()), fBandwidth(0), + fPlayStartTime(0.0), fPlayEndTime(0.0), fAbsStartTime(NULL), fAbsEndTime(NULL), + fVideoWidth(0), fVideoHeight(0), fVideoFPS(0), fNumChannels(1), fScale(1.0f), fNPT_PTS_Offset(0.0f), + fAttributeTable(HashTable::create(STRING_HASH_KEYS)), + fRTPSocket(NULL), fRTCPSocket(NULL), + fRTPSource(NULL), fRTCPInstance(NULL), fReadSource(NULL), + fReceiveRawMP3ADUs(False), fReceiveRawJPEGFrames(False), + fSessionId(NULL) { + rtpInfo.seqNum = 0; rtpInfo.timestamp = 0; rtpInfo.infoIsNew = False; + + // A few attributes have unusual default values. Set these now: + setAttribute("profile-level-id", "0", True/*value is hexadecimal*/); // used with "video/H264" + // This won't work for MPEG-4 (unless the value is <10), because for MPEG-4, the value + // is assumed to be a decimal string, not a hexadecimal string. NEED TO FIX ##### + setAttribute("profile-id", "1"); // used with "video/H265" + setAttribute("level-id", "93"); // used with "video/H265" + setAttribute("interop-constraints", "B00000000000"); // used with "video/H265" + setAttribute("sampling", "RGB"); // used with "video/JPEG2000" + + // added for audio back channel + fFlag = FLAG_RECVONLY; + fRTPSink = NULL; +} + +MediaSubsession::~MediaSubsession() { + deInitiate(); + + delete[] fConnectionEndpointName; delete[] fSavedSDPLines; + delete[] fMediumName; delete[] fCodecName; delete[] fProtocolName; + delete[] fControlPath; + delete fCrypto; delete fMIKEYState; + delete[] fAbsStartTime; delete[] fAbsEndTime; + delete[] fSessionId; + + // Empty and delete our 'attributes table': + SDPAttribute* attr; + while ((attr = (SDPAttribute*)fAttributeTable->RemoveNext()) != NULL) { + delete attr; + } + delete fAttributeTable; + + delete fNext; +} + +void MediaSubsession::addFilter(FramedFilter* filter){ + fReadSource = filter; +} + +double MediaSubsession::playStartTime() const { + if (fPlayStartTime > 0) return fPlayStartTime; + + return fParent.playStartTime(); +} + +double MediaSubsession::playEndTime() const { + if (fPlayEndTime > 0) return fPlayEndTime; + + return fParent.playEndTime(); +} + +char* MediaSubsession::absStartTime() const { + if (fAbsStartTime != NULL) return fAbsStartTime; + + return fParent.absStartTime(); +} + +char* MediaSubsession::absEndTime() const { + if (fAbsEndTime != NULL) return fAbsEndTime; + + return fParent.absEndTime(); +} + +static Boolean const honorSDPPortChoice +#ifdef IGNORE_UNICAST_SDP_PORTS += False; +#else += True; +#endif + +Boolean MediaSubsession::initiate(int useSpecialRTPoffset) { + if (fReadSource != NULL) return True; // has already been initiated + + do { + if (fCodecName == NULL) { + env().setResultMsg("Codec is unspecified"); + break; + } + + // Create RTP and RTCP 'Groupsocks' on which to receive incoming data. + // (Groupsocks will work even for unicast addresses) + struct sockaddr_storage tempAddr; + getConnectionEndpointAddress(tempAddr); + // This could get changed later, as a result of a RTSP "SETUP" + + Boolean const useSRTP = strcmp(fProtocolName, "SRTP") == 0; + Boolean const protocolIsRTP = useSRTP || strcmp(fProtocolName, "RTP") == 0; + + if (fClientPortNum != 0 && (honorSDPPortChoice || IsMulticastAddress(tempAddr))) { + // The sockets' port numbers were specified for us. Use these: + if (protocolIsRTP && !fMultiplexRTCPWithRTP) { + fClientPortNum = fClientPortNum&~1; + // use an even-numbered port for RTP, and the next (odd-numbered) port for RTCP + } + if (isSSM()) { + fRTPSocket = new Groupsock(env(), tempAddr, fSourceFilterAddr, fClientPortNum); + } else { + fRTPSocket = new Groupsock(env(), tempAddr, fClientPortNum, 255); + } + if (fRTPSocket == NULL) { + env().setResultMsg("Failed to create RTP socket"); + break; + } + + if (protocolIsRTP) { + if (fMultiplexRTCPWithRTP) { + // Use the RTP 'groupsock' object for RTCP as well: + fRTCPSocket = fRTPSocket; + } else { + // Set our RTCP port to be the RTP port + 1: + portNumBits const rtcpPortNum = fClientPortNum|1; + if (isSSM()) { + fRTCPSocket = new Groupsock(env(), tempAddr, fSourceFilterAddr, rtcpPortNum); + } else { + fRTCPSocket = new Groupsock(env(), tempAddr, rtcpPortNum, 255); + } + } + } + } else { + // Port numbers were not specified in advance, so we use ephemeral port numbers. + // Create sockets until we get a port-number pair (even: RTP; even+1: RTCP). + // (However, if we're multiplexing RTCP with RTP, then we create only one socket, + // and the port number can be even or odd.) + // We need to make sure that we don't keep trying to use the same bad port numbers over + // and over again, so we store bad sockets in a table, and delete them all when we're done. + HashTable* socketHashTable = HashTable::create(ONE_WORD_HASH_KEYS); + if (socketHashTable == NULL) break; + Boolean success = False; + NoReuse dummy(env()); + // ensures that our new ephemeral port number won't be one that's already in use + + while (1) { + // Create a new socket: + if (isSSM()) { + fRTPSocket = new Groupsock(env(), tempAddr, fSourceFilterAddr, 0); + } else { + fRTPSocket = new Groupsock(env(), tempAddr, 0, 255); + } + if (fRTPSocket == NULL) { + env().setResultMsg("MediaSession::initiate(): unable to create RTP and RTCP sockets"); + break; + } + + // Get the client port number: + Port clientPort(0); + if (!getSourcePort(env(), fRTPSocket->socketNum(), tempAddr.ss_family, clientPort)) { + break; + } + fClientPortNum = ntohs(clientPort.num()); + + if (fMultiplexRTCPWithRTP) { + // Use this RTP 'groupsock' object for RTCP as well: + fRTCPSocket = fRTPSocket; + success = True; + break; + } + + // To be usable for RTP, the client port number must be even: + if ((fClientPortNum&1) != 0) { // it's odd + // Record this socket in our table, and keep trying: + unsigned key = (unsigned)fClientPortNum; + Groupsock* existing = (Groupsock*)socketHashTable->Add((char const*)key, fRTPSocket); + delete existing; // in case it wasn't NULL + continue; + } + + // Make sure we can use the next (i.e., odd) port number, for RTCP: + portNumBits rtcpPortNum = fClientPortNum|1; + if (isSSM()) { + fRTCPSocket = new Groupsock(env(), tempAddr, fSourceFilterAddr, rtcpPortNum); + } else { + fRTCPSocket = new Groupsock(env(), tempAddr, rtcpPortNum, 255); + } + if (fRTCPSocket != NULL && fRTCPSocket->socketNum() >= 0) { + // Success! Use these two sockets. + success = True; + break; + } else { + // We couldn't create the RTCP socket (perhaps that port number's already in use elsewhere?). + delete fRTCPSocket; fRTCPSocket = NULL; + + // Record the first socket in our table, and keep trying: + unsigned key = (unsigned)fClientPortNum; + Groupsock* existing = (Groupsock*)socketHashTable->Add((char const*)key, fRTPSocket); + delete existing; // in case it wasn't NULL + continue; + } + } + + // Clean up the socket hash table (and contents): + Groupsock* oldGS; + while ((oldGS = (Groupsock*)socketHashTable->RemoveNext()) != NULL) { + delete oldGS; + } + delete socketHashTable; + + if (!success) break; // a fatal error occurred trying to create the RTP and RTCP sockets; we can't continue + } + + // Try to use a big receive buffer for RTP - at least 0.1 second of + // specified bandwidth and at least 50 KB + unsigned rtpBufSize = fBandwidth * 25 / 2; // 1 kbps * 0.1 s = 12.5 bytes + if (rtpBufSize < 50 * 1024) + rtpBufSize = 50 * 1024; + increaseReceiveBufferTo(env(), fRTPSocket->socketNum(), rtpBufSize); + + if (isSSM() && fRTCPSocket != NULL) { + // Special case for RTCP SSM: Send RTCP packets back to the source via unicast: + fRTCPSocket->changeDestinationParameters(fSourceFilterAddr, 0, ~0); + } + + +// added for audio back channel +if(fFlag == FLAG_RECVONLY) { + printf("MediaSubsession::initiate() FLAG_RECVONLY\n"); + // Create "fRTPSource" and "fReadSource": + if (!createSourceObjects(useSpecialRTPoffset)) break; + + if (fReadSource == NULL) { + env().setResultMsg("Failed to create read source"); + break; + } + + SRTPCryptographicContext* ourCrypto = NULL; + if (useSRTP) { + // For SRTP, we need key management. If MIKEY (key management) state wasn't given + // to us in the SDP description, then create it now: + ourCrypto = getCrypto(); + if (ourCrypto == NULL) { // then fMIKEYState is also NULL; create both + fMIKEYState = new MIKEYState(); + ourCrypto = fCrypto = new SRTPCryptographicContext(*fMIKEYState); + } + + if (fRTPSource != NULL) fRTPSource->setCrypto(ourCrypto); + } + + // Finally, create our RTCP instance. (It starts running automatically) + if (fRTPSource != NULL && fRTCPSocket != NULL) { + // If bandwidth is specified, use it and add 5% for RTCP overhead. + // Otherwise make a guess at 500 kbps. + unsigned totSessionBandwidth + = fBandwidth ? fBandwidth + fBandwidth / 20 : 500; + fRTCPInstance = RTCPInstance::createNew(env(), fRTCPSocket, + totSessionBandwidth, + (unsigned char const*) + fParent.CNAME(), + NULL /* we're a client */, + fRTPSource, + False /* we're not a data transmitter */, + ourCrypto); + if (fRTCPInstance == NULL) { + env().setResultMsg("Failed to create RTCP instance"); + break; + } + } +} else if ( fFlag == FLAG_SENDONLY) { + printf("MediaSubsession::initiate() FLAG_SENDONLY\n"); + // Create "fRTPSink" and "fReadSource": + if (!createBackChannelObjects(useSpecialRTPoffset)) break; + if (fRTPSink == NULL) { + env().setResultMsg("Failed to create rtp sink"); + break; + } + // Finally, create our RTCP instance. (It starts running automatically) + if (fRTPSink != NULL && fRTCPSocket != NULL) { + // If bandwidth is specified, use it and add 5% for RTCP overhead. + // Otherwise make a guess at 500 kbps. + unsigned totSessionBandwidth + = fBandwidth ? fBandwidth + fBandwidth / 20 : 500; + fRTCPInstance = RTCPInstance::createNew(env(), fRTCPSocket, + totSessionBandwidth, + (unsigned char const*) + fParent.CNAME(), + NULL /* we're a client */, + fRTPSource); + if (fRTCPInstance == NULL) { + env().setResultMsg("Failed to create RTCP instance"); + break; + } + } + sink = fRTPSink; +} else { + printf("MediaSubsession::initiate() FLAG NOT EXPECTED\n"); + break; +} + + return True; + } while (0); + + deInitiate(); + fClientPortNum = 0; + return False; +} + +void MediaSubsession::deInitiate() { + Medium::close(fRTCPInstance); fRTCPInstance = NULL; + + Medium::close(fReadSource); // this is assumed to also close fRTPSource + fReadSource = NULL; fRTPSource = NULL; + + Medium::close(fRTPSink); + fRTPSink = NULL; + + delete fRTPSocket; + if (fRTCPSocket != fRTPSocket) delete fRTCPSocket; + fRTPSocket = NULL; fRTCPSocket = NULL; +} + +Boolean MediaSubsession::setClientPortNum(unsigned short portNum) { + if (fReadSource != NULL) { + env().setResultMsg("A read source has already been created"); + return False; + } + + fClientPortNum = portNum; + return True; +} + +char const* MediaSubsession::attrVal_str(char const* attrName) const { + SDPAttribute* attr = (SDPAttribute*)(fAttributeTable->Lookup(attrName)); + if (attr == NULL) return ""; + + return attr->strValue(); +} + +char const* MediaSubsession::attrVal_strToLower(char const* attrName) const { + SDPAttribute* attr = (SDPAttribute*)(fAttributeTable->Lookup(attrName)); + if (attr == NULL) return ""; + + return attr->strValueToLower(); +} + +unsigned MediaSubsession::attrVal_int(char const* attrName) const { + SDPAttribute* attr = (SDPAttribute*)(fAttributeTable->Lookup(attrName)); + if (attr == NULL) return 0; + + return attr->intValue(); +} + +char const* MediaSubsession::fmtp_config() const { + char const* result = attrVal_str("config"); + if (result[0] == '\0') result = attrVal_str("configuration"); + + return result; +} + +void MediaSubsession::getConnectionEndpointAddress(struct sockaddr_storage& addr) const { + do { + // Get the endpoint name from us, or from our parent session: + char const* endpointString = connectionEndpointName(); + if (endpointString == NULL) { + endpointString = parentSession().connectionEndpointName(); + } + if (endpointString == NULL) break; + + // Now, convert this name to an address, if we can: + NetAddressList addresses(endpointString, connectionEndpointNameAddressFamily()); + if (addresses.numAddresses() == 0) break; + + copyAddress(addr, addresses.firstAddress()); + return; + } while (0); + + // Address unknown; set it to a 'null' value: + addr = nullAddress(); +} + +void MediaSubsession::setDestinations(struct sockaddr_storage const& defaultDestAddress) { + // Get the destination address from the connection endpoint name + // (This will be 0 if it's not known, in which case we use the default instead) + struct sockaddr_storage destAddress; + getConnectionEndpointAddress(destAddress); + if (addressIsNull(destAddress)) destAddress = defaultDestAddress; + + // The destination TTL remains unchanged: + int destTTL = ~0; // means: don't change + + if (fRTPSocket != NULL) { + Port destPort(serverPortNum); + fRTPSocket->changeDestinationParameters(destAddress, destPort, destTTL); + } + if (fRTCPSocket != NULL && !isSSM() && !fMultiplexRTCPWithRTP) { + // Note: For SSM sessions, the dest address for RTCP was already set. + Port destPort(serverPortNum+1); + fRTCPSocket->changeDestinationParameters(destAddress, destPort, destTTL); + } +} + +void MediaSubsession::setSessionId(char const* sessionId) { + delete[] fSessionId; + fSessionId = strDup(sessionId); +} + +double MediaSubsession::getNormalPlayTime(struct timeval const& presentationTime) { + if (rtpSource() == NULL || rtpSource()->timestampFrequency() == 0) return 0.0; // no RTP source, or bad freq! + + // First, check whether our "RTPSource" object has already been synchronized using RTCP. + // If it hasn't, then - as a special case - we need to use the RTP timestamp to compute the NPT. + if (!rtpSource()->hasBeenSynchronizedUsingRTCP()) { + if (!rtpInfo.infoIsNew) return 0.0; // the "rtpInfo" structure has not been filled in + u_int32_t timestampOffset = rtpSource()->curPacketRTPTimestamp() - rtpInfo.timestamp; + double nptOffset = (timestampOffset/(double)(rtpSource()->timestampFrequency()))*scale(); + double npt = playStartTime() + nptOffset; + + return npt; + } else { + // Common case: We have been synchronized using RTCP. This means that the "presentationTime" parameter + // will be accurate, and so we should use this to compute the NPT. + double ptsDouble = (double)(presentationTime.tv_sec + presentationTime.tv_usec/1000000.0); + + if (rtpInfo.infoIsNew) { + // This is the first time we've been called with a synchronized presentation time since the "rtpInfo" + // structure was last filled in. Use this "presentationTime" to compute "fNPT_PTS_Offset": + if (seqNumLT(rtpSource()->curPacketRTPSeqNum(), rtpInfo.seqNum)) return -0.1; // sanity check; ignore old packets + u_int32_t timestampOffset = rtpSource()->curPacketRTPTimestamp() - rtpInfo.timestamp; + double nptOffset = (timestampOffset/(double)(rtpSource()->timestampFrequency()))*scale(); + double npt = playStartTime() + nptOffset; + fNPT_PTS_Offset = npt - ptsDouble*scale(); + rtpInfo.infoIsNew = False; // for next time + + return npt; + } else { + // Use the precomputed "fNPT_PTS_Offset" to compute the NPT from the PTS: + if (fNPT_PTS_Offset == 0.0) return 0.0; // error: The "rtpInfo" structure was apparently never filled in + return (double)(ptsDouble*scale() + fNPT_PTS_Offset); + } + } +} + +void MediaSubsession +::setAttribute(char const* name, char const* value, Boolean valueIsHexadecimal) { + // Replace any existing attribute record with this name (except that the 'valueIsHexadecimal' + // property will be inherited from it, if it exists). + SDPAttribute* oldAttr = (SDPAttribute*)fAttributeTable->Lookup(name); + if (oldAttr != NULL) { + valueIsHexadecimal = oldAttr->valueIsHexadecimal(); + fAttributeTable->Remove(name); + delete oldAttr; + } + + SDPAttribute* newAttr = new SDPAttribute(value, valueIsHexadecimal); + (void)fAttributeTable->Add(name, newAttr); +} + +Boolean MediaSubsession::parseSDPLine_c(char const* sdpLine) { + // Check for "c=IN IP4 " + // or "c=IN IP4 /" + // (ditto for "c=IN IP6 ...") + // (Later, do something with also #####) + if (parseStringValue(sdpLine, "c=IN IP4 %[^/\r\n]", fConnectionEndpointName)) { + fConnectionEndpointNameAddressFamily = AF_INET; + return True; + } else if (parseStringValue(sdpLine, "c=IN IP6 %[^/\r\n]", fConnectionEndpointName)) { + fConnectionEndpointNameAddressFamily = AF_INET6; + return True; + } + + return False; +} + +Boolean MediaSubsession::parseSDPLine_b(char const* sdpLine) { + // Check for "b=:" line + // RTP applications are expected to use bwtype="AS" + return sscanf(sdpLine, "b=AS:%u", &fBandwidth) == 1; +} + +Boolean MediaSubsession::parseSDPAttribute_rtpmap(char const* sdpLine) { + // Check for a "a=rtpmap: /" line: + // (Also check without the "/"; RealNetworks omits this) + // Also check for a trailing "/". + Boolean parseSuccess = False; + + unsigned rtpmapPayloadFormat; + char* codecName = strDupSize(sdpLine); // ensures we have enough space + unsigned rtpTimestampFrequency = 0; + unsigned numChannels = 1; + if (sscanf(sdpLine, "a=rtpmap: %u %[^/]/%u/%u", + &rtpmapPayloadFormat, codecName, &rtpTimestampFrequency, + &numChannels) == 4 + || sscanf(sdpLine, "a=rtpmap: %u %[^/]/%u", + &rtpmapPayloadFormat, codecName, &rtpTimestampFrequency) == 3 + || sscanf(sdpLine, "a=rtpmap: %u %s", + &rtpmapPayloadFormat, codecName) == 2) { + parseSuccess = True; + if (rtpmapPayloadFormat == fRTPPayloadFormat) { + // This "rtpmap" matches our payload format, so set our + // codec name and timestamp frequency: + // (First, make sure the codec name is upper case) + { + Locale l("POSIX"); + for (char* p = codecName; *p != '\0'; ++p) *p = toupper(*p); + } + delete[] fCodecName; fCodecName = strDup(codecName); + fRTPTimestampFrequency = rtpTimestampFrequency; + fNumChannels = numChannels; + } + } + delete[] codecName; + + return parseSuccess; +} + +Boolean MediaSubsession::parseSDPAttribute_rtcpmux(char const* sdpLine) { + if (strncmp(sdpLine, "a=rtcp-mux", 10) == 0) { + fMultiplexRTCPWithRTP = True; + return True; + } + + return False; +} + +Boolean MediaSubsession::parseSDPAttribute_control(char const* sdpLine) { + // Check for a "a=control:" line: + return parseStringValue(sdpLine, "a=control: %s", fControlPath); +} + +Boolean MediaSubsession::parseSDPAttribute_range(char const* sdpLine) { + // Check for a "a=range:npt=-" line: + // (Later handle other kinds of "a=range" attributes also???#####) + Boolean parseSuccess = False; + + double playStartTime; + double playEndTime; + if (parseRangeAttribute(sdpLine, playStartTime, playEndTime)) { + parseSuccess = True; + if (playStartTime > fPlayStartTime) { + fPlayStartTime = playStartTime; + if (playStartTime > fParent.playStartTime()) { + fParent.playStartTime() = playStartTime; + } + } + if (playEndTime > fPlayEndTime) { + fPlayEndTime = playEndTime; + if (playEndTime > fParent.playEndTime()) { + fParent.playEndTime() = playEndTime; + } + } + } else if (parseRangeAttribute(sdpLine, _absStartTime(), _absEndTime())) { + parseSuccess = True; + } + + return parseSuccess; +} + +Boolean MediaSubsession::parseSDPAttribute_fmtp(char const* sdpLine) { + // Check for a "a=fmtp:" line: + // Later: Check that payload format number matches; ##### + do { + if (strncmp(sdpLine, "a=fmtp:", 7) != 0) break; sdpLine += 7; + while (isdigit(*sdpLine)) ++sdpLine; + + // The remaining "sdpLine" should be a sequence of + // =; + // or + // ; + // parameter assignments. Look at each of these. + unsigned const sdpLineLen = strlen(sdpLine); + char* nameStr = new char[sdpLineLen+1]; + char* valueStr = new char[sdpLineLen+1]; + + while (*sdpLine != '\0' && *sdpLine != '\r' && *sdpLine != '\n') { + int sscanfResult = sscanf(sdpLine, " %[^=; \t\r\n] = %[^; \t\r\n]", nameStr, valueStr); + if (sscanfResult >= 1) { + // or = + // Convert to lower-case, to ease comparison: + Locale l("POSIX"); + for (char* c = nameStr; *c != '\0'; ++c) *c = tolower(*c); + + if (sscanfResult == 1) { + // + setAttribute(nameStr); + } else { + // = + setAttribute(nameStr, valueStr); + } + } + + // Move to the next parameter assignment string: + while (*sdpLine != '\0' && *sdpLine != '\r' && *sdpLine != '\n' && *sdpLine != ';') ++sdpLine; + while (*sdpLine == ';') ++sdpLine; + } + delete[] nameStr; delete[] valueStr; + return True; + } while (0); + + return False; +} + +Boolean MediaSubsession +::parseSDPAttribute_source_filter(char const* sdpLine) { + return parseSourceFilterAttribute(sdpLine, fSourceFilterAddr); +} + +Boolean MediaSubsession::parseSDPAttribute_x_dimensions(char const* sdpLine) { + // Check for a "a=x-dimensions:," line: + Boolean parseSuccess = False; + + int width, height; + if (sscanf(sdpLine, "a=x-dimensions:%d,%d", &width, &height) == 2) { + parseSuccess = True; + fVideoWidth = (unsigned short)width; + fVideoHeight = (unsigned short)height; + } + + return parseSuccess; +} + +Boolean MediaSubsession::parseSDPAttribute_framerate(char const* sdpLine) { + // Check for a "a=framerate: " or "a=x-framerate: " line: + Boolean parseSuccess = False; + + float frate; + int rate; + if (sscanf(sdpLine, "a=framerate: %f", &frate) == 1 || sscanf(sdpLine, "a=framerate:%f", &frate) == 1) { + parseSuccess = True; + fVideoFPS = (unsigned)frate; + } else if (sscanf(sdpLine, "a=x-framerate: %d", &rate) == 1) { + parseSuccess = True; + fVideoFPS = (unsigned)rate; + } + + return parseSuccess; +} + +Boolean MediaSubsession::parseSDPAttribute_key_mgmt(char const* sdpLine) { + MIKEYState* newMIKEYState = parseSDPAttribute_key_mgmtToMIKEY(sdpLine); + if (newMIKEYState == NULL) return False; + + delete fCrypto; delete fMIKEYState; + fMIKEYState = newMIKEYState; + fCrypto = new SRTPCryptographicContext(*fMIKEYState); + + return True; +} + +// added for audio back channel +Boolean MediaSubsession::parseSDPAttribute_flag(char const* sdpLine) { + // Check for a "a=sendonly|recvonly" + Boolean parseSuccess = False; + if (strncmp(sdpLine, "a=sendonly", 10) == 1) { + parseSuccess = True; + fFlag = (unsigned)FLAG_RECVONLY; + } else if (strncmp(sdpLine, "a=recvonly", 10) == 1) { + parseSuccess = True; + fFlag = (unsigned)FLAG_SENDONLY; + } + return parseSuccess; +} + + +Boolean MediaSubsession::createSourceObjects(int useSpecialRTPoffset) { + do { + // First, check "fProtocolName" + if (strcmp(fProtocolName, "UDP") == 0) { + // A UDP-packetized stream (*not* a RTP stream) + fReadSource = BasicUDPSource::createNew(env(), fRTPSocket); + fRTPSource = NULL; // Note! + + if (strcmp(fCodecName, "MP2T") == 0) { // MPEG-2 Transport Stream + fReadSource = MPEG2TransportStreamFramer::createNew(env(), fReadSource); + // this sets "durationInMicroseconds" correctly, based on the PCR values + } + } else { + // Check "fCodecName" against the set of codecs that we support, + // and create our RTP source accordingly + // (Later make this code more efficient, as this set grows #####) + // (Also, add more fmts that can be implemented by SimpleRTPSource#####) + Boolean createSimpleRTPSource = False; // by default; can be changed below + Boolean doNormalMBitRule = False; // default behavior if "createSimpleRTPSource" is True + if (strcmp(fCodecName, "QCELP") == 0) { // QCELP audio + fReadSource = + QCELPAudioRTPSource::createNew(env(), fRTPSocket, fRTPSource, + fRTPPayloadFormat, + fRTPTimestampFrequency); + // Note that fReadSource will differ from fRTPSource in this case + } else if (strcmp(fCodecName, "AMR") == 0) { // AMR audio (narrowband) + fReadSource = + AMRAudioRTPSource::createNew(env(), fRTPSocket, fRTPSource, + fRTPPayloadFormat, False /*isWideband*/, + fNumChannels, attrVal_bool("octet-align"), + attrVal_unsigned("interleaving"), + attrVal_bool("robust-sorting"), + attrVal_bool("crc")); + // Note that fReadSource will differ from fRTPSource in this case + } else if (strcmp(fCodecName, "AMR-WB") == 0) { // AMR audio (wideband) + fReadSource = + AMRAudioRTPSource::createNew(env(), fRTPSocket, fRTPSource, + fRTPPayloadFormat, True /*isWideband*/, + fNumChannels, attrVal_bool("octet-align"), + attrVal_unsigned("interleaving"), + attrVal_bool("robust-sorting"), + attrVal_bool("crc")); + // Note that fReadSource will differ from fRTPSource in this case + } else if (strcmp(fCodecName, "MPA") == 0) { // MPEG-1 or 2 audio + fReadSource = fRTPSource + = MPEG1or2AudioRTPSource::createNew(env(), fRTPSocket, + fRTPPayloadFormat, + fRTPTimestampFrequency); + } else if (strcmp(fCodecName, "MPA-ROBUST") == 0) { // robust MP3 audio + fReadSource = fRTPSource + = MP3ADURTPSource::createNew(env(), fRTPSocket, fRTPPayloadFormat, + fRTPTimestampFrequency); + if (fRTPSource == NULL) break; + + if (!fReceiveRawMP3ADUs) { + // Add a filter that deinterleaves the ADUs after depacketizing them: + MP3ADUdeinterleaver* deinterleaver + = MP3ADUdeinterleaver::createNew(env(), fRTPSource); + if (deinterleaver == NULL) break; + + // Add another filter that converts these ADUs to MP3 frames: + fReadSource = MP3FromADUSource::createNew(env(), deinterleaver); + } + } else if (strcmp(fCodecName, "X-MP3-DRAFT-00") == 0) { + // a non-standard variant of "MPA-ROBUST" used by RealNetworks + // (one 'ADU'ized MP3 frame per packet; no headers) + fRTPSource + = SimpleRTPSource::createNew(env(), fRTPSocket, fRTPPayloadFormat, + fRTPTimestampFrequency, + "audio/MPA-ROBUST" /*hack*/); + if (fRTPSource == NULL) break; + + // Add a filter that converts these ADUs to MP3 frames: + fReadSource = MP3FromADUSource::createNew(env(), fRTPSource, + False /*no ADU header*/); + } else if (strcmp(fCodecName, "MP4A-LATM") == 0) { // MPEG-4 LATM audio + fReadSource = fRTPSource + = MPEG4LATMAudioRTPSource::createNew(env(), fRTPSocket, + fRTPPayloadFormat, + fRTPTimestampFrequency); + } else if (strcmp(fCodecName, "VORBIS") == 0) { // Vorbis audio + fReadSource = fRTPSource + = VorbisAudioRTPSource::createNew(env(), fRTPSocket, + fRTPPayloadFormat, + fRTPTimestampFrequency); + } else if (strcmp(fCodecName, "THEORA") == 0) { // Theora video + fReadSource = fRTPSource + = TheoraVideoRTPSource::createNew(env(), fRTPSocket, fRTPPayloadFormat); + } else if (strcmp(fCodecName, "RAW") == 0) { // Uncompressed raw video (RFC 4175) + fReadSource = fRTPSource + = RawVideoRTPSource::createNew(env(), fRTPSocket, fRTPPayloadFormat, fRTPTimestampFrequency); + } else if (strcmp(fCodecName, "VP8") == 0) { // VP8 video + fReadSource = fRTPSource + = VP8VideoRTPSource::createNew(env(), fRTPSocket, + fRTPPayloadFormat, + fRTPTimestampFrequency); + } else if (strcmp(fCodecName, "VP9") == 0) { // VP9 video + fReadSource = fRTPSource + = VP9VideoRTPSource::createNew(env(), fRTPSocket, + fRTPPayloadFormat, + fRTPTimestampFrequency); + } else if (strcmp(fCodecName, "AC3") == 0 || strcmp(fCodecName, "EAC3") == 0) { // AC3 audio + fReadSource = fRTPSource + = AC3AudioRTPSource::createNew(env(), fRTPSocket, + fRTPPayloadFormat, + fRTPTimestampFrequency); + } else if (strcmp(fCodecName, "MP4V-ES") == 0) { // MPEG-4 Elementary Stream video + fReadSource = fRTPSource + = MPEG4ESVideoRTPSource::createNew(env(), fRTPSocket, + fRTPPayloadFormat, + fRTPTimestampFrequency); + } else if (strcmp(fCodecName, "MPEG4-GENERIC") == 0) { + fReadSource = fRTPSource + = MPEG4GenericRTPSource::createNew(env(), fRTPSocket, + fRTPPayloadFormat, + fRTPTimestampFrequency, + fMediumName, attrVal_strToLower("mode"), + attrVal_unsigned("sizelength"), + attrVal_unsigned("indexlength"), + attrVal_unsigned("indexdeltalength")); + } else if (strcmp(fCodecName, "MPV") == 0) { // MPEG-1 or 2 video + fReadSource = fRTPSource + = MPEG1or2VideoRTPSource::createNew(env(), fRTPSocket, + fRTPPayloadFormat, + fRTPTimestampFrequency); + } else if (strcmp(fCodecName, "MP2T") == 0) { // MPEG-2 Transport Stream + fRTPSource = SimpleRTPSource::createNew(env(), fRTPSocket, fRTPPayloadFormat, + fRTPTimestampFrequency, "video/MP2T", + 0, False); + fReadSource = MPEG2TransportStreamFramer::createNew(env(), fRTPSource); + // this sets "durationInMicroseconds" correctly, based on the PCR values + } else if (strcmp(fCodecName, "H261") == 0) { // H.261 + fReadSource = fRTPSource + = H261VideoRTPSource::createNew(env(), fRTPSocket, + fRTPPayloadFormat, + fRTPTimestampFrequency); + } else if (strcmp(fCodecName, "H263-1998") == 0 || + strcmp(fCodecName, "H263-2000") == 0) { // H.263+ + fReadSource = fRTPSource + = H263plusVideoRTPSource::createNew(env(), fRTPSocket, + fRTPPayloadFormat, + fRTPTimestampFrequency); + } else if (strcmp(fCodecName, "H264") == 0) { + fReadSource = fRTPSource + = H264VideoRTPSource::createNew(env(), fRTPSocket, + fRTPPayloadFormat, + fRTPTimestampFrequency); + } else if (strcmp(fCodecName, "H265") == 0) { + Boolean expectDONFields = attrVal_unsigned("sprop-depack-buf-nalus") > 0; + fReadSource = fRTPSource + = H265VideoRTPSource::createNew(env(), fRTPSocket, + fRTPPayloadFormat, + expectDONFields, + fRTPTimestampFrequency); + } else if (strcmp(fCodecName, "DV") == 0) { + fReadSource = fRTPSource + = DVVideoRTPSource::createNew(env(), fRTPSocket, + fRTPPayloadFormat, + fRTPTimestampFrequency); + } else if (strcmp(fCodecName, "JPEG") == 0) { // motion JPEG + if (fReceiveRawJPEGFrames) { + // Special case (used when proxying JPEG/RTP streams): Receive each JPEG/RTP packet, including the special RTP headers: + fReadSource = fRTPSource + = SimpleRTPSource::createNew(env(), fRTPSocket, fRTPPayloadFormat, + fRTPTimestampFrequency, "video/JPEG", + 0/*special offset*/, False/*doNormalMBitRule => ignore the 'M' bit*/); + } else { + // Normal case: Receive each JPEG frame as a complete, displayable JPEG image: + fReadSource = fRTPSource + = JPEGVideoRTPSource::createNew(env(), fRTPSocket, + fRTPPayloadFormat, + fRTPTimestampFrequency, + videoWidth(), + videoHeight()); + } + } else if (strcmp(fCodecName, "JPEG2000") == 0) { // JPEG 2000 video + fReadSource = fRTPSource + = JPEG2000VideoRTPSource::createNew(env(), fRTPSocket, fRTPPayloadFormat, + fRTPTimestampFrequency, + attrVal_str("sampling")); + } else if (strcmp(fCodecName, "X-QT") == 0 + || strcmp(fCodecName, "X-QUICKTIME") == 0) { + // Generic QuickTime streams, as defined in + // + char* mimeType + = new char[strlen(mediumName()) + strlen(codecName()) + 2] ; + sprintf(mimeType, "%s/%s", mediumName(), codecName()); + fReadSource = fRTPSource + = QuickTimeGenericRTPSource::createNew(env(), fRTPSocket, + fRTPPayloadFormat, + fRTPTimestampFrequency, + mimeType); + delete[] mimeType; + } else if ( strcmp(fCodecName, "PCMU") == 0 // PCM u-law audio + || strcmp(fCodecName, "GSM") == 0 // GSM audio + || strcmp(fCodecName, "DVI4") == 0 // DVI4 (IMA ADPCM) audio + || strcmp(fCodecName, "PCMA") == 0 // PCM a-law audio + || strcmp(fCodecName, "MP1S") == 0 // MPEG-1 System Stream + || strcmp(fCodecName, "MP2P") == 0 // MPEG-2 Program Stream + || strcmp(fCodecName, "L8") == 0 // 8-bit linear audio + || strcmp(fCodecName, "L16") == 0 // 16-bit linear audio + || strcmp(fCodecName, "L20") == 0 // 20-bit linear audio (RFC 3190) + || strcmp(fCodecName, "L24") == 0 // 24-bit linear audio (RFC 3190) + || strcmp(fCodecName, "G722") == 0 // G.722 audio (RFC 3551) + || strcmp(fCodecName, "G726-16") == 0 // G.726, 16 kbps + || strcmp(fCodecName, "G726-24") == 0 // G.726, 24 kbps + || strcmp(fCodecName, "G726-32") == 0 // G.726, 32 kbps + || strcmp(fCodecName, "G726-40") == 0 // G.726, 40 kbps + || strcmp(fCodecName, "SPEEX") == 0 // SPEEX audio + || strcmp(fCodecName, "ILBC") == 0 // iLBC audio + || strcmp(fCodecName, "OPUS") == 0 // Opus audio + || strcmp(fCodecName, "T140") == 0 // T.140 text (RFC 4103) + || strcmp(fCodecName, "DAT12") == 0 // 12-bit nonlinear audio (RFC 3190) + || strcmp(fCodecName, "VND.ONVIF.METADATA") == 0 // 'ONVIF' 'metadata' (a XML document) + ) { + createSimpleRTPSource = True; + useSpecialRTPoffset = 0; + if (strcmp(fCodecName, "VND.ONVIF.METADATA") == 0) { + // This RTP payload format uses the RTP "M" bit to indicate the end of the content (a XML document): + doNormalMBitRule = True; + } + } else if (useSpecialRTPoffset >= 0) { + // We don't know this RTP payload format, but try to receive + // it using a 'SimpleRTPSource' with the specified header offset: + createSimpleRTPSource = True; + } else { + env().setResultMsg("RTP payload format unknown or not supported"); + break; + } + + if (createSimpleRTPSource) { + char* mimeType + = new char[strlen(mediumName()) + strlen(codecName()) + 2] ; + sprintf(mimeType, "%s/%s", mediumName(), codecName()); + fReadSource = fRTPSource + = SimpleRTPSource::createNew(env(), fRTPSocket, fRTPPayloadFormat, + fRTPTimestampFrequency, mimeType, + (unsigned)useSpecialRTPoffset, + doNormalMBitRule); + delete[] mimeType; + } + } + + return True; + } while (0); + + return False; // an error occurred +} + + +////////// SDPAttribute implementation ////////// + +SDPAttribute::SDPAttribute(char const* strValue, Boolean valueIsHexadecimal) + : fStrValue(strDup(strValue)), fStrValueToLower(NULL), fValueIsHexadecimal(valueIsHexadecimal) { + if (fStrValue == NULL) { + // No value was given for this attribute, so consider it to be a Boolean, with value True: + fIntValue = 1; + } else { + // Create a 'tolower' version of "fStrValue", in case it's needed: + Locale l("POSIX"); + size_t strSize; + + fStrValueToLower = strDupSize(fStrValue, strSize); + for (unsigned i = 0; i < strSize-1; ++i) fStrValueToLower[i] = tolower(fStrValue[i]); + fStrValueToLower[strSize-1] = '\0'; + + // Try to parse "fStrValueToLower" as an integer. If we can't, assume an integer value of 0: + if (sscanf(fStrValueToLower, valueIsHexadecimal ? "%x" : "%d", &fIntValue) != 1) { + fIntValue = 0; + } + } +} + +SDPAttribute::~SDPAttribute() { + delete[] fStrValue; + delete[] fStrValueToLower; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MediaSink.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MediaSink.cpp new file mode 100644 index 000000000..15621ffdc --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MediaSink.cpp @@ -0,0 +1,225 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Media Sinks +// Implementation + +#include "MediaSink.hh" +#include "GroupsockHelper.hh" +#include + +////////// MediaSink ////////// + +MediaSink::MediaSink(UsageEnvironment& env) + : Medium(env), fSource(NULL) { +} + +MediaSink::~MediaSink() { + stopPlaying(); +} + +Boolean MediaSink::isSink() const { + return True; +} + +Boolean MediaSink::lookupByName(UsageEnvironment& env, char const* sinkName, + MediaSink*& resultSink) { + resultSink = NULL; // unless we succeed + + Medium* medium; + if (!Medium::lookupByName(env, sinkName, medium)) return False; + + if (!medium->isSink()) { + env.setResultMsg(sinkName, " is not a media sink"); + return False; + } + + resultSink = (MediaSink*)medium; + return True; +} + +Boolean MediaSink::sourceIsCompatibleWithUs(MediaSource& source) { + // We currently support only framed sources. + return source.isFramedSource(); +} + +Boolean MediaSink::startPlaying(MediaSource& source, + afterPlayingFunc* afterFunc, + void* afterClientData) { + // Make sure we're not already being played: + if (fSource != NULL) { + envir().setResultMsg("This sink is already being played"); + return False; + } + + // Make sure our source is compatible: + if (!sourceIsCompatibleWithUs(source)) { + envir().setResultMsg("MediaSink::startPlaying(): source is not compatible!"); + return False; + } + fSource = (FramedSource*)&source; + + fAfterFunc = afterFunc; + fAfterClientData = afterClientData; + return continuePlaying(); +} + +void MediaSink::stopPlaying() { + // First, tell the source that we're no longer interested: + if (fSource != NULL) fSource->stopGettingFrames(); + + // Cancel any pending tasks: + envir().taskScheduler().unscheduleDelayedTask(nextTask()); + + fSource = NULL; // indicates that we can be played again + fAfterFunc = NULL; +} + +void MediaSink::onSourceClosure(void* clientData) { + MediaSink* sink = (MediaSink*)clientData; + sink->onSourceClosure(); +} + +void MediaSink::onSourceClosure() { + // Cancel any pending tasks: + envir().taskScheduler().unscheduleDelayedTask(nextTask()); + + fSource = NULL; // indicates that we can be played again + if (fAfterFunc != NULL) { + (*fAfterFunc)(fAfterClientData); + } +} + +Boolean MediaSink::isRTPSink() const { + return False; // default implementation +} + +////////// OutPacketBuffer ////////// + +unsigned OutPacketBuffer::maxSize = 60000; // by default + +OutPacketBuffer +::OutPacketBuffer(unsigned preferredPacketSize, unsigned maxPacketSize, unsigned maxBufferSize) + : fPreferred(preferredPacketSize), fMax(maxPacketSize), + fOverflowDataSize(0) { + if (maxBufferSize == 0) maxBufferSize = maxSize; + unsigned maxNumPackets = (maxBufferSize + (maxPacketSize-1))/maxPacketSize; + fLimit = maxNumPackets*maxPacketSize; + fBuf = new unsigned char[fLimit]; + resetPacketStart(); + resetOffset(); + resetOverflowData(); +} + +OutPacketBuffer::~OutPacketBuffer() { + delete[] fBuf; +} + +void OutPacketBuffer::enqueue(unsigned char const* from, unsigned numBytes) { + if (numBytes > totalBytesAvailable()) { +#ifdef DEBUG + fprintf(stderr, "OutPacketBuffer::enqueue() warning: %d > %d\n", numBytes, totalBytesAvailable()); +#endif + numBytes = totalBytesAvailable(); + } + + if (curPtr() != from) memmove(curPtr(), from, numBytes); + increment(numBytes); +} + +void OutPacketBuffer::enqueueWord(u_int32_t word) { + u_int32_t nWord = htonl(word); + enqueue((unsigned char*)&nWord, 4); +} + +void OutPacketBuffer::insert(unsigned char const* from, unsigned numBytes, + unsigned toPosition) { + unsigned realToPosition = fPacketStart + toPosition; + if (realToPosition + numBytes > fLimit) { + if (realToPosition > fLimit) return; // we can't do this + numBytes = fLimit - realToPosition; + } + + memmove(&fBuf[realToPosition], from, numBytes); + if (toPosition + numBytes > fCurOffset) { + fCurOffset = toPosition + numBytes; + } +} + +void OutPacketBuffer::insertWord(u_int32_t word, unsigned toPosition) { + u_int32_t nWord = htonl(word); + insert((unsigned char*)&nWord, 4, toPosition); +} + +void OutPacketBuffer::extract(unsigned char* to, unsigned numBytes, + unsigned fromPosition) { + unsigned realFromPosition = fPacketStart + fromPosition; + if (realFromPosition + numBytes > fLimit) { // sanity check + if (realFromPosition > fLimit) return; // we can't do this + numBytes = fLimit - realFromPosition; + } + + memmove(to, &fBuf[realFromPosition], numBytes); +} + +u_int32_t OutPacketBuffer::extractWord(unsigned fromPosition) { + u_int32_t nWord; + extract((unsigned char*)&nWord, 4, fromPosition); + return ntohl(nWord); +} + +void OutPacketBuffer::skipBytes(unsigned numBytes) { + if (numBytes > totalBytesAvailable()) { + numBytes = totalBytesAvailable(); + } + + increment(numBytes); +} + +void OutPacketBuffer +::setOverflowData(unsigned overflowDataOffset, + unsigned overflowDataSize, + struct timeval const& presentationTime, + unsigned durationInMicroseconds) { + fOverflowDataOffset = overflowDataOffset; + fOverflowDataSize = overflowDataSize; + fOverflowPresentationTime = presentationTime; + fOverflowDurationInMicroseconds = durationInMicroseconds; +} + +void OutPacketBuffer::useOverflowData() { + enqueue(&fBuf[fPacketStart + fOverflowDataOffset], fOverflowDataSize); + fCurOffset -= fOverflowDataSize; // undoes increment performed by "enqueue" + resetOverflowData(); +} + +void OutPacketBuffer::adjustPacketStart(unsigned numBytes) { + fPacketStart += numBytes; + if (fOverflowDataOffset >= numBytes) { + fOverflowDataOffset -= numBytes; + } else { + fOverflowDataOffset = 0; + fOverflowDataSize = 0; // an error otherwise + } +} + +void OutPacketBuffer::resetPacketStart() { + if (fOverflowDataSize > 0) { + fOverflowDataOffset += fPacketStart; + } + fPacketStart = 0; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MediaSource.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MediaSource.cpp new file mode 100644 index 000000000..0916754f5 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MediaSource.cpp @@ -0,0 +1,91 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Media Sources +// Implementation + +#include "MediaSource.hh" + +////////// MediaSource ////////// + +MediaSource::MediaSource(UsageEnvironment& env) + : Medium(env) { +} + +MediaSource::~MediaSource() { +} + +Boolean MediaSource::isSource() const { + return True; +} + +char const* MediaSource::MIMEtype() const { + return "application/OCTET-STREAM"; // default type +} + +Boolean MediaSource::isFramedSource() const { + return False; // default implementation +} +Boolean MediaSource::isRTPSource() const { + return False; // default implementation +} +Boolean MediaSource::isMPEG1or2VideoStreamFramer() const { + return False; // default implementation +} +Boolean MediaSource::isMPEG4VideoStreamFramer() const { + return False; // default implementation +} +Boolean MediaSource::isH264VideoStreamFramer() const { + return False; // default implementation +} +Boolean MediaSource::isH265VideoStreamFramer() const { + return False; // default implementation +} +Boolean MediaSource::isDVVideoStreamFramer() const { + return False; // default implementation +} +Boolean MediaSource::isJPEGVideoSource() const { + return False; // default implementation +} +Boolean MediaSource::isAMRAudioSource() const { + return False; // default implementation +} +Boolean MediaSource::isMPEG2TransportStreamMultiplexor() const { + return False; // default implementation +} + +Boolean MediaSource::lookupByName(UsageEnvironment& env, + char const* sourceName, + MediaSource*& resultSource) { + resultSource = NULL; // unless we succeed + + Medium* medium; + if (!Medium::lookupByName(env, sourceName, medium)) return False; + + if (!medium->isSource()) { + env.setResultMsg(sourceName, " is not a media source"); + return False; + } + + resultSource = (MediaSource*)medium; + return True; +} + +void MediaSource::getAttributes() const { + // Default implementation + envir().setResultMsg(""); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MultiFramedRTPSink.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MultiFramedRTPSink.cpp new file mode 100644 index 000000000..e5b57da81 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MultiFramedRTPSink.cpp @@ -0,0 +1,456 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP sink for a common kind of payload format: Those which pack multiple, +// complete codec frames (as many as possible) into each RTP packet. +// Implementation + +#include "MultiFramedRTPSink.hh" +#include "GroupsockHelper.hh" + +////////// MultiFramedRTPSink ////////// + +void MultiFramedRTPSink::setPacketSizes(unsigned preferredPacketSize, + unsigned maxPacketSize) { + if (preferredPacketSize > maxPacketSize || preferredPacketSize == 0) return; + // sanity check + + delete fOutBuf; + fOutBuf = new OutPacketBuffer(preferredPacketSize, maxPacketSize); + fOurMaxPacketSize = maxPacketSize; // save value, in case subclasses need it +} + +#ifndef RTP_PAYLOAD_MAX_SIZE +#define RTP_PAYLOAD_MAX_SIZE 1452 + // Default max packet size (1500, minus allowance for IP, UDP headers) + // (Also, make it a multiple of 4 bytes, just in case that matters.) +#endif +#ifndef RTP_PAYLOAD_PREFERRED_SIZE +#define RTP_PAYLOAD_PREFERRED_SIZE ((RTP_PAYLOAD_MAX_SIZE) < 1000 ? (RTP_PAYLOAD_MAX_SIZE) : 1000) +#endif + +MultiFramedRTPSink::MultiFramedRTPSink(UsageEnvironment& env, + Groupsock* rtpGS, + unsigned char rtpPayloadType, + unsigned rtpTimestampFrequency, + char const* rtpPayloadFormatName, + unsigned numChannels) + : RTPSink(env, rtpGS, rtpPayloadType, rtpTimestampFrequency, + rtpPayloadFormatName, numChannels), + fOutBuf(NULL), fCurFragmentationOffset(0), fPreviousFrameEndedFragmentation(False), + fOnSendErrorFunc(NULL), fOnSendErrorData(NULL) { + setPacketSizes((RTP_PAYLOAD_PREFERRED_SIZE), (RTP_PAYLOAD_MAX_SIZE)); +} + +MultiFramedRTPSink::~MultiFramedRTPSink() { + delete fOutBuf; +} + +void MultiFramedRTPSink +::doSpecialFrameHandling(unsigned /*fragmentationOffset*/, + unsigned char* /*frameStart*/, + unsigned /*numBytesInFrame*/, + struct timeval framePresentationTime, + unsigned /*numRemainingBytes*/) { + // default implementation: If this is the first frame in the packet, + // use its presentationTime for the RTP timestamp: + if (isFirstFrameInPacket()) { + setTimestamp(framePresentationTime); + } +} + +Boolean MultiFramedRTPSink::allowFragmentationAfterStart() const { + return False; // by default +} + +Boolean MultiFramedRTPSink::allowOtherFramesAfterLastFragment() const { + return False; // by default +} + +Boolean MultiFramedRTPSink +::frameCanAppearAfterPacketStart(unsigned char const* /*frameStart*/, + unsigned /*numBytesInFrame*/) const { + return True; // by default +} + +unsigned MultiFramedRTPSink::specialHeaderSize() const { + // default implementation: Assume no special header: + return 0; +} + +unsigned MultiFramedRTPSink::frameSpecificHeaderSize() const { + // default implementation: Assume no frame-specific header: + return 0; +} + +unsigned MultiFramedRTPSink::computeOverflowForNewFrame(unsigned newFrameSize) const { + // default implementation: Just call numOverflowBytes() + return fOutBuf->numOverflowBytes(newFrameSize); +} + +void MultiFramedRTPSink::setMarkerBit() { + unsigned rtpHdr = fOutBuf->extractWord(0); + rtpHdr |= 0x00800000; + fOutBuf->insertWord(rtpHdr, 0); +} + +void MultiFramedRTPSink::setTimestamp(struct timeval framePresentationTime) { + // First, convert the presentation time to a 32-bit RTP timestamp: + fCurrentTimestamp = convertToRTPTimestamp(framePresentationTime); + + // Then, insert it into the RTP packet: + fOutBuf->insertWord(fCurrentTimestamp, fTimestampPosition); +} + +void MultiFramedRTPSink::setSpecialHeaderWord(unsigned word, + unsigned wordPosition) { + fOutBuf->insertWord(word, fSpecialHeaderPosition + 4*wordPosition); +} + +void MultiFramedRTPSink::setSpecialHeaderBytes(unsigned char const* bytes, + unsigned numBytes, + unsigned bytePosition) { + fOutBuf->insert(bytes, numBytes, fSpecialHeaderPosition + bytePosition); +} + +void MultiFramedRTPSink::setFrameSpecificHeaderWord(unsigned word, + unsigned wordPosition) { + fOutBuf->insertWord(word, fCurFrameSpecificHeaderPosition + 4*wordPosition); +} + +void MultiFramedRTPSink::setFrameSpecificHeaderBytes(unsigned char const* bytes, + unsigned numBytes, + unsigned bytePosition) { + fOutBuf->insert(bytes, numBytes, fCurFrameSpecificHeaderPosition + bytePosition); +} + +void MultiFramedRTPSink::setFramePadding(unsigned numPaddingBytes) { + if (numPaddingBytes > 0) { + // Add the padding bytes (with the last one being the padding size): + unsigned char paddingBuffer[255]; //max padding + memset(paddingBuffer, 0, numPaddingBytes); + paddingBuffer[numPaddingBytes-1] = numPaddingBytes; + fOutBuf->enqueue(paddingBuffer, numPaddingBytes); + + // Set the RTP padding bit: + unsigned rtpHdr = fOutBuf->extractWord(0); + rtpHdr |= 0x20000000; + fOutBuf->insertWord(rtpHdr, 0); + } +} + +Boolean MultiFramedRTPSink::continuePlaying() { + // Send the first packet. + // (This will also schedule any future sends.) + buildAndSendPacket(True); + return True; +} + +void MultiFramedRTPSink::stopPlaying() { + fOutBuf->resetPacketStart(); + fOutBuf->resetOffset(); + fOutBuf->resetOverflowData(); + + // Then call the default "stopPlaying()" function: + MediaSink::stopPlaying(); +} + +void MultiFramedRTPSink::buildAndSendPacket(Boolean isFirstPacket) { + nextTask() = NULL; + fIsFirstPacket = isFirstPacket; + + // Set up the RTP header: + unsigned rtpHdr = 0x80000000; // RTP version 2; marker ('M') bit not set (by default; it can be set later) + rtpHdr |= (fRTPPayloadType<<16); + rtpHdr |= fSeqNo; // sequence number + fOutBuf->enqueueWord(rtpHdr); + + // Note where the RTP timestamp will go. + // (We can't fill this in until we start packing payload frames.) + fTimestampPosition = fOutBuf->curPacketSize(); + fOutBuf->skipBytes(4); // leave a hole for the timestamp + + fOutBuf->enqueueWord(SSRC()); + + // Allow for a special, payload-format-specific header following the + // RTP header: + fSpecialHeaderPosition = fOutBuf->curPacketSize(); + fSpecialHeaderSize = specialHeaderSize(); + fOutBuf->skipBytes(fSpecialHeaderSize); + + // Begin packing as many (complete) frames into the packet as we can: + fTotalFrameSpecificHeaderSizes = 0; + fNoFramesLeft = False; + fNumFramesUsedSoFar = 0; + packFrame(); +} + +void MultiFramedRTPSink::packFrame() { + // Get the next frame. + + // First, skip over the space we'll use for any frame-specific header: + fCurFrameSpecificHeaderPosition = fOutBuf->curPacketSize(); + fCurFrameSpecificHeaderSize = frameSpecificHeaderSize(); + fOutBuf->skipBytes(fCurFrameSpecificHeaderSize); + fTotalFrameSpecificHeaderSizes += fCurFrameSpecificHeaderSize; + + // See if we have an overflow frame that was too big for the last pkt + if (fOutBuf->haveOverflowData()) { + // Use this frame before reading a new one from the source + unsigned frameSize = fOutBuf->overflowDataSize(); + struct timeval presentationTime = fOutBuf->overflowPresentationTime(); + unsigned durationInMicroseconds = fOutBuf->overflowDurationInMicroseconds(); + fOutBuf->useOverflowData(); + + afterGettingFrame1(frameSize, 0, presentationTime, durationInMicroseconds); + } else { + // Normal case: we need to read a new frame from the source + if (fSource == NULL) return; + fSource->getNextFrame(fOutBuf->curPtr(), fOutBuf->totalBytesAvailable(), + afterGettingFrame, this, ourHandleClosure, this); + } +} + +void MultiFramedRTPSink +::afterGettingFrame(void* clientData, unsigned numBytesRead, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds) { + MultiFramedRTPSink* sink = (MultiFramedRTPSink*)clientData; + sink->afterGettingFrame1(numBytesRead, numTruncatedBytes, + presentationTime, durationInMicroseconds); +} + +void MultiFramedRTPSink +::afterGettingFrame1(unsigned frameSize, unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds) { + if (fIsFirstPacket) { + // Record the fact that we're starting to play now: + gettimeofday(&fNextSendTime, NULL); + } + + fMostRecentPresentationTime = presentationTime; + if (fInitialPresentationTime.tv_sec == 0 && fInitialPresentationTime.tv_usec == 0) { + fInitialPresentationTime = presentationTime; + } + + if (numTruncatedBytes > 0) { + unsigned const bufferSize = fOutBuf->totalBytesAvailable(); + envir() << "MultiFramedRTPSink::afterGettingFrame1(): The input frame data was too large for our buffer size (" + << bufferSize << "). " + << numTruncatedBytes << " bytes of trailing data was dropped! Correct this by increasing \"OutPacketBuffer::maxSize\" to at least " + << OutPacketBuffer::maxSize + numTruncatedBytes << ", *before* creating this 'RTPSink'. (Current value is " + << OutPacketBuffer::maxSize << ".)\n"; + } + unsigned curFragmentationOffset = fCurFragmentationOffset; + unsigned numFrameBytesToUse = frameSize; + unsigned overflowBytes = 0; + + // If we have already packed one or more frames into this packet, + // check whether this new frame is eligible to be packed after them. + // (This is independent of whether the packet has enough room for this + // new frame; that check comes later.) + if (fNumFramesUsedSoFar > 0) { + if ((fPreviousFrameEndedFragmentation + && !allowOtherFramesAfterLastFragment()) + || !frameCanAppearAfterPacketStart(fOutBuf->curPtr(), frameSize)) { + // Save away this frame for next time: + numFrameBytesToUse = 0; + fOutBuf->setOverflowData(fOutBuf->curPacketSize(), frameSize, + presentationTime, durationInMicroseconds); + } + } + fPreviousFrameEndedFragmentation = False; + + if (numFrameBytesToUse > 0) { + // Check whether this frame overflows the packet + if (fOutBuf->wouldOverflow(frameSize)) { + // Don't use this frame now; instead, save it as overflow data, and + // send it in the next packet instead. However, if the frame is too + // big to fit in a packet by itself, then we need to fragment it (and + // use some of it in this packet, if the payload format permits this.) + if (isTooBigForAPacket(frameSize) + && (fNumFramesUsedSoFar == 0 || allowFragmentationAfterStart())) { + // We need to fragment this frame, and use some of it now: + overflowBytes = computeOverflowForNewFrame(frameSize); + numFrameBytesToUse -= overflowBytes; + fCurFragmentationOffset += numFrameBytesToUse; + } else { + // We don't use any of this frame now: + overflowBytes = frameSize; + numFrameBytesToUse = 0; + } + fOutBuf->setOverflowData(fOutBuf->curPacketSize() + numFrameBytesToUse, + overflowBytes, presentationTime, durationInMicroseconds); + } else if (fCurFragmentationOffset > 0) { + // This is the last fragment of a frame that was fragmented over + // more than one packet. Do any special handling for this case: + fCurFragmentationOffset = 0; + fPreviousFrameEndedFragmentation = True; + } + } + + if (numFrameBytesToUse == 0 && frameSize > 0) { + // Send our packet now, because we have filled it up: + sendPacketIfNecessary(); + } else { + // Use this frame in our outgoing packet: + unsigned char* frameStart = fOutBuf->curPtr(); + fOutBuf->increment(numFrameBytesToUse); + // do this now, in case "doSpecialFrameHandling()" calls "setFramePadding()" to append padding bytes + + // Here's where any payload format specific processing gets done: + doSpecialFrameHandling(curFragmentationOffset, frameStart, + numFrameBytesToUse, presentationTime, + overflowBytes); + + ++fNumFramesUsedSoFar; + + // Update the time at which the next packet should be sent, based + // on the duration of the frame that we just packed into it. + // However, if this frame has overflow data remaining, then don't + // count its duration yet. + if (overflowBytes == 0) { + fNextSendTime.tv_usec += durationInMicroseconds; + fNextSendTime.tv_sec += fNextSendTime.tv_usec/1000000; + fNextSendTime.tv_usec %= 1000000; + } + + // Send our packet now if (i) it's already at our preferred size, or + // (ii) (heuristic) another frame of the same size as the one we just + // read would overflow the packet, or + // (iii) it contains the last fragment of a fragmented frame, and we + // don't allow anything else to follow this or + // (iv) only one frame per packet is allowed: + if (fOutBuf->isPreferredSize() + || fOutBuf->wouldOverflow(numFrameBytesToUse) + || (fPreviousFrameEndedFragmentation && + !allowOtherFramesAfterLastFragment()) + || !frameCanAppearAfterPacketStart(fOutBuf->curPtr() - frameSize, + frameSize) ) { + // The packet is ready to be sent now + sendPacketIfNecessary(); + } else { + // There's room for more frames; try getting another: + packFrame(); + } + } +} + +static unsigned const rtpHeaderSize = 12; + +Boolean MultiFramedRTPSink::isTooBigForAPacket(unsigned numBytes) const { + // Check whether a 'numBytes'-byte frame - together with a RTP header and + // (possible) special headers - would be too big for an output packet: + // (Later allow for RTP extension header!) ##### + numBytes += rtpHeaderSize + specialHeaderSize() + frameSpecificHeaderSize(); + return fOutBuf->isTooBigForAPacket(numBytes); +} + +#define MAX_UDP_PACKET_SIZE 65536 + +void MultiFramedRTPSink::sendPacketIfNecessary() { + if (fNumFramesUsedSoFar > 0) { + // Send the packet: +#ifdef TEST_LOSS + if ((our_random()%10) != 0) // simulate 10% packet loss ##### +#endif + if (fCrypto != NULL) { // Encrypt/tag the data before sending it: +#ifndef NO_OPENSSL + // Hack: Because the MKI + authentication tag at the end of the packet would + // overwrite any following (still to be sent) frame data, we can't encrypt/tag + // the packet in place. Instead, we have to make a copy (on the stack) of + // the packet, before encrypting/tagging/sending it: + if (fOutBuf->curPacketSize() + SRTP_MKI_LENGTH + SRTP_AUTH_TAG_LENGTH > MAX_UDP_PACKET_SIZE) { + fprintf(stderr, "MultiFramedRTPSink::sendPacketIfNecessary(): Fatal error: packet size %d is too large for SRTP\n", fOutBuf->curPacketSize()); + exit(1); + } + u_int8_t packet[MAX_UDP_PACKET_SIZE]; + memcpy(packet, fOutBuf->packet(), fOutBuf->curPacketSize()); + unsigned newPacketSize; + + if (fCrypto->processOutgoingSRTPPacket(packet, fOutBuf->curPacketSize(), newPacketSize)) { + if (!fRTPInterface.sendPacket(packet, newPacketSize)) { + // if failure handler has been specified, call it + if (fOnSendErrorFunc != NULL) (*fOnSendErrorFunc)(fOnSendErrorData); + } + } +#endif + } else { // unencrypted + if (!fRTPInterface.sendPacket(fOutBuf->packet(), fOutBuf->curPacketSize())) { + // if failure handler has been specified, call it + if (fOnSendErrorFunc != NULL) (*fOnSendErrorFunc)(fOnSendErrorData); + } + } + ++fPacketCount; + fTotalOctetCount += fOutBuf->curPacketSize(); + fOctetCount += fOutBuf->curPacketSize() + - rtpHeaderSize - fSpecialHeaderSize - fTotalFrameSpecificHeaderSizes; + + ++fSeqNo; // for next time + } + + if (fOutBuf->haveOverflowData() + && fOutBuf->totalBytesAvailable() > fOutBuf->totalBufferSize()/2) { + // Efficiency hack: Reset the packet start pointer to just in front of + // the overflow data (allowing for the RTP header and special headers), + // so that we probably don't have to "memmove()" the overflow data + // into place when building the next packet: + unsigned newPacketStart = fOutBuf->curPacketSize() + - (rtpHeaderSize + fSpecialHeaderSize + frameSpecificHeaderSize()); + fOutBuf->adjustPacketStart(newPacketStart); + } else { + // Normal case: Reset the packet start pointer back to the start: + fOutBuf->resetPacketStart(); + } + fOutBuf->resetOffset(); + fNumFramesUsedSoFar = 0; + + if (fNoFramesLeft) { + // We're done: + onSourceClosure(); + } else { + // We have more frames left to send. Figure out when the next frame + // is due to start playing, then make sure that we wait this long before + // sending the next packet. + struct timeval timeNow; + gettimeofday(&timeNow, NULL); + int secsDiff = fNextSendTime.tv_sec - timeNow.tv_sec; + int64_t uSecondsToGo = secsDiff*1000000 + (fNextSendTime.tv_usec - timeNow.tv_usec); + if (uSecondsToGo < 0 || secsDiff < 0) { // sanity check: Make sure that the time-to-delay is non-negative: + uSecondsToGo = 0; + } + + // Delay this amount of time: + nextTask() = envir().taskScheduler().scheduleDelayedTask(uSecondsToGo, (TaskFunc*)sendNext, this); + } +} + +// The following is called after each delay between packet sends: +void MultiFramedRTPSink::sendNext(void* firstArg) { + MultiFramedRTPSink* sink = (MultiFramedRTPSink*)firstArg; + sink->buildAndSendPacket(False); +} + +void MultiFramedRTPSink::ourHandleClosure(void* clientData) { + MultiFramedRTPSink* sink = (MultiFramedRTPSink*)clientData; + // There are no frames left, but we may have a partially built packet + // to send + sink->fNoFramesLeft = True; + sink->sendPacketIfNecessary(); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/MultiFramedRTPSource.cpp b/src/big/mpp/middleware/src/live555/liveMedia/MultiFramedRTPSource.cpp new file mode 100644 index 000000000..221b56162 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/MultiFramedRTPSource.cpp @@ -0,0 +1,640 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP source for a common kind of payload format: Those that pack multiple, +// complete codec frames (as many as possible) into each RTP packet. +// Implementation + +#include "MultiFramedRTPSource.hh" +#include "RTCP.hh" +#include "GroupsockHelper.hh" +#include + +////////// ReorderingPacketBuffer definition ////////// + +class ReorderingPacketBuffer { +public: + ReorderingPacketBuffer(BufferedPacketFactory* packetFactory); + virtual ~ReorderingPacketBuffer(); + void reset(); + + BufferedPacket* getFreePacket(MultiFramedRTPSource* ourSource); + Boolean storePacket(BufferedPacket* bPacket); + BufferedPacket* getNextCompletedPacket(Boolean& packetLossPreceded); + void releaseUsedPacket(BufferedPacket* packet); + void freePacket(BufferedPacket* packet) { + if (packet != fSavedPacket) { + delete packet; + } else { + fSavedPacketFree = True; + } + } + Boolean isEmpty() const { return fHeadPacket == NULL; } + + void setThresholdTime(unsigned uSeconds) { fThresholdTime = uSeconds; } + void resetHaveSeenFirstPacket() { fHaveSeenFirstPacket = False; } + +private: + BufferedPacketFactory* fPacketFactory; + unsigned fThresholdTime; // uSeconds + Boolean fHaveSeenFirstPacket; // used to set initial "fNextExpectedSeqNo" + unsigned short fNextExpectedSeqNo; + BufferedPacket* fHeadPacket; + BufferedPacket* fTailPacket; + BufferedPacket* fSavedPacket; + // to avoid calling new/free in the common case + Boolean fSavedPacketFree; +}; + + +////////// MultiFramedRTPSource implementation ////////// + +MultiFramedRTPSource +::MultiFramedRTPSource(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency, + BufferedPacketFactory* packetFactory) + : RTPSource(env, RTPgs, rtpPayloadFormat, rtpTimestampFrequency) { + reset(); + fReorderingBuffer = new ReorderingPacketBuffer(packetFactory); + + // Try to use a big receive buffer for RTP: + // increaseReceiveBufferTo(env, RTPgs->socketNum(), 50*1024); + increaseReceiveBufferTo(env, RTPgs->socketNum(), 1024 * 1024); +} + +void MultiFramedRTPSource::reset() { + fCurrentPacketBeginsFrame = True; // by default + fCurrentPacketCompletesFrame = True; // by default + fAreDoingNetworkReads = False; + fPacketReadInProgress = NULL; + fNeedDelivery = False; + fPacketLossInFragmentedFrame = False; +} + +MultiFramedRTPSource::~MultiFramedRTPSource() { + delete fReorderingBuffer; +} + +Boolean MultiFramedRTPSource +::processSpecialHeader(BufferedPacket* /*packet*/, + unsigned& resultSpecialHeaderSize) { + // Default implementation: Assume no special header: + resultSpecialHeaderSize = 0; + return True; +} + +Boolean MultiFramedRTPSource +::packetIsUsableInJitterCalculation(unsigned char* /*packet*/, + unsigned /*packetSize*/) { + // Default implementation: + return True; +} + +void MultiFramedRTPSource::doStopGettingFrames() { + if (fPacketReadInProgress != NULL) { + fReorderingBuffer->freePacket(fPacketReadInProgress); + fPacketReadInProgress = NULL; + } + envir().taskScheduler().unscheduleDelayedTask(nextTask()); + fRTPInterface.stopNetworkReading(); + fReorderingBuffer->reset(); + reset(); +} + +void MultiFramedRTPSource::doGetNextFrame() { + if (!fAreDoingNetworkReads) { + // Turn on background read handling of incoming packets: + fAreDoingNetworkReads = True; + TaskScheduler::BackgroundHandlerProc* handler + = (TaskScheduler::BackgroundHandlerProc*)&networkReadHandler; + fRTPInterface.startNetworkReading(handler); + } + + fSavedTo = fTo; + fSavedMaxSize = fMaxSize; + fFrameSize = 0; // for now + fNeedDelivery = True; + doGetNextFrame1(); +} + +void MultiFramedRTPSource::doGetNextFrame1() { + while (fNeedDelivery) { + // If we already have packet data available, then deliver it now. + Boolean packetLossPrecededThis; + BufferedPacket* nextPacket + = fReorderingBuffer->getNextCompletedPacket(packetLossPrecededThis); + if (nextPacket == NULL) break; + + fNeedDelivery = False; + + if (nextPacket->useCount() == 0) { + // Before using the packet, check whether it has a special header + // that needs to be processed: + unsigned specialHeaderSize; + if (!processSpecialHeader(nextPacket, specialHeaderSize)) { + // Something's wrong with the header; reject the packet: + fReorderingBuffer->releaseUsedPacket(nextPacket); + fNeedDelivery = True; + continue; + } + nextPacket->skip(specialHeaderSize); + } + + // Check whether we're part of a multi-packet frame, and whether + // there was packet loss that would render this packet unusable: + if (fCurrentPacketBeginsFrame) { + if (packetLossPrecededThis || fPacketLossInFragmentedFrame) { + // We didn't get all of the previous frame. + // Forget any data that we used from it: + fTo = fSavedTo; fMaxSize = fSavedMaxSize; + fFrameSize = 0; + } + fPacketLossInFragmentedFrame = False; + } else if (packetLossPrecededThis) { + // We're in a multi-packet frame, with preceding packet loss + fPacketLossInFragmentedFrame = True; + } + if (fPacketLossInFragmentedFrame) { + // This packet is unusable; reject it: + fReorderingBuffer->releaseUsedPacket(nextPacket); + fNeedDelivery = True; + continue; + } + + // The packet is usable. Deliver all or part of it to our caller: + unsigned frameSize; + nextPacket->use(fTo, fMaxSize, frameSize, fNumTruncatedBytes, + fCurPacketRTPSeqNum, fCurPacketRTPTimestamp, + fPresentationTime, fCurPacketHasBeenSynchronizedUsingRTCP, + fCurPacketMarkerBit); + fFrameSize += frameSize; + + if (!nextPacket->hasUsableData()) { + // We're completely done with this packet now + fReorderingBuffer->releaseUsedPacket(nextPacket); + } + + if (fCurrentPacketCompletesFrame && fFrameSize > 0) { + // We have all the data that the client wants. + if (fNumTruncatedBytes > 0) { + envir() << "MultiFramedRTPSource::doGetNextFrame1(): The total received frame size exceeds the client's buffer size (" + << fSavedMaxSize << "). " + << fNumTruncatedBytes << " bytes of trailing data will be dropped!\n"; + } + // Call our own 'after getting' function, so that the downstream object can consume the data: + if (fReorderingBuffer->isEmpty()) { + // Common case optimization: There are no more queued incoming packets, so this code will not get + // executed again without having first returned to the event loop. Call our 'after getting' function + // directly, because there's no risk of a long chain of recursion (and thus stack overflow): + afterGetting(this); + } else { + // Special case: Call our 'after getting' function via the event loop. + nextTask() = envir().taskScheduler().scheduleDelayedTask(0, + (TaskFunc*)FramedSource::afterGetting, this); + } + } else { + // This packet contained fragmented data, and does not complete + // the data that the client wants. Keep getting data: + fTo += frameSize; fMaxSize -= frameSize; + fNeedDelivery = True; + } + } +} + +void MultiFramedRTPSource +::setPacketReorderingThresholdTime(unsigned uSeconds) { + fReorderingBuffer->setThresholdTime(uSeconds); +} + +#define ADVANCE(n) do { bPacket->skip(n); } while (0) + +void MultiFramedRTPSource::networkReadHandler(MultiFramedRTPSource* source, int /*mask*/) { + source->networkReadHandler1(); +} + +void MultiFramedRTPSource::networkReadHandler1() { + BufferedPacket* bPacket = fPacketReadInProgress; + if (bPacket == NULL) { + // Normal case: Get a free BufferedPacket descriptor to hold the new network packet: + bPacket = fReorderingBuffer->getFreePacket(this); + } + + // Read the network packet, and perform sanity checks on the RTP header: + Boolean readSuccess = False; + do { + struct sockaddr_storage fromAddress; + Boolean packetReadWasIncomplete = fPacketReadInProgress != NULL; + if (!bPacket->fillInData(fRTPInterface, fromAddress, packetReadWasIncomplete)) { + if (bPacket->bytesAvailable() == 0) { // should not happen?? + envir() << "MultiFramedRTPSource internal error: Hit limit when reading incoming packet over TCP\n"; + } + fPacketReadInProgress = NULL; + break; + } + if (packetReadWasIncomplete) { + // We need additional read(s) before we can process the incoming packet: + fPacketReadInProgress = bPacket; + return; + } else { + fPacketReadInProgress = NULL; + } +#ifdef TEST_LOSS + setPacketReorderingThresholdTime(0); + // don't wait for 'lost' packets to arrive out-of-order later + if ((our_random()%10) == 0) break; // simulate 10% packet loss +#endif + + if (fCrypto != NULL) { // The packet is SRTP; authenticate/decrypt it first + unsigned newPacketSize; + if (!fCrypto->processIncomingSRTPPacket(bPacket->data(), bPacket->dataSize(), newPacketSize)) break; + if (newPacketSize > bPacket->dataSize()) break; // sanity check; shouldn't happen + bPacket->removePadding(bPacket->dataSize() - newPacketSize); // treat MKI+auth as padding + } + + // Check for the 12-byte RTP header: + if (bPacket->dataSize() < 12) break; + unsigned rtpHdr = ntohl(*(u_int32_t*)(bPacket->data())); ADVANCE(4); + Boolean rtpMarkerBit = (rtpHdr&0x00800000) != 0; + unsigned rtpTimestamp = ntohl(*(u_int32_t*)(bPacket->data()));ADVANCE(4); + unsigned rtpSSRC = ntohl(*(u_int32_t*)(bPacket->data())); ADVANCE(4); + + // Check the RTP version number (it should be 2): + if ((rtpHdr&0xC0000000) != 0x80000000) break; + + // Check the Payload Type. + unsigned char rtpPayloadType = (unsigned char)((rtpHdr&0x007F0000)>>16); + if (rtpPayloadType != rtpPayloadFormat()) { + if (fRTCPInstanceForMultiplexedRTCPPackets != NULL + && rtpPayloadType >= 64 && rtpPayloadType <= 95) { + // This is a multiplexed RTCP packet, and we've been asked to deliver such packets. + // Do so now: + fRTCPInstanceForMultiplexedRTCPPackets + ->injectReport(bPacket->data()-12, bPacket->dataSize()+12, fromAddress); + } + break; + } + + // Skip over any CSRC identifiers in the header: + unsigned cc = (rtpHdr>>24)&0x0F; + if (bPacket->dataSize() < cc*4) break; + ADVANCE(cc*4); + + // Check for (& ignore) any RTP header extension + if (rtpHdr&0x10000000) { + if (bPacket->dataSize() < 4) break; + unsigned extHdr = ntohl(*(u_int32_t*)(bPacket->data())); ADVANCE(4); + unsigned remExtSize = 4*(extHdr&0xFFFF); + if (bPacket->dataSize() < remExtSize) break; + ADVANCE(remExtSize); + } + + // Discard any padding bytes: + if (rtpHdr&0x20000000) { + if (bPacket->dataSize() == 0) break; + unsigned numPaddingBytes + = (unsigned)(bPacket->data())[bPacket->dataSize()-1]; + if (bPacket->dataSize() < numPaddingBytes) break; + bPacket->removePadding(numPaddingBytes); + } + + // The rest of the packet is the usable data. Record and save it: + if (rtpSSRC != fLastReceivedSSRC) { + // The SSRC of incoming packets has changed. Unfortunately we don't yet handle streams that contain multiple SSRCs, + // but we can handle a single-SSRC stream where the SSRC changes occasionally: + fLastReceivedSSRC = rtpSSRC; + fReorderingBuffer->resetHaveSeenFirstPacket(); + } + unsigned short rtpSeqNo = (unsigned short)(rtpHdr&0xFFFF); + Boolean usableInJitterCalculation + = packetIsUsableInJitterCalculation((bPacket->data()), + bPacket->dataSize()); + struct timeval presentationTime; // computed by: + Boolean hasBeenSyncedUsingRTCP; // computed by: + receptionStatsDB() + .noteIncomingPacket(rtpSSRC, rtpSeqNo, rtpTimestamp, + timestampFrequency(), + usableInJitterCalculation, presentationTime, + hasBeenSyncedUsingRTCP, bPacket->dataSize()); + + // Fill in the rest of the packet descriptor, and store it: + struct timeval timeNow; + gettimeofday(&timeNow, NULL); + bPacket->assignMiscParams(rtpSeqNo, rtpTimestamp, presentationTime, + hasBeenSyncedUsingRTCP, rtpMarkerBit, + timeNow); + if (!fReorderingBuffer->storePacket(bPacket)) break; + + readSuccess = True; + } while (0); + if (!readSuccess) fReorderingBuffer->freePacket(bPacket); + + doGetNextFrame1(); + // If we didn't get proper data this time, we'll get another chance +} + + +////////// BufferedPacket and BufferedPacketFactory implementation ///// + +#define MAX_PACKET_SIZE 65536 + +BufferedPacket::BufferedPacket() + : fPacketSize(MAX_PACKET_SIZE), + fBuf(new unsigned char[MAX_PACKET_SIZE]), + fNextPacket(NULL) { +} + +BufferedPacket::~BufferedPacket() { + delete fNextPacket; + delete[] fBuf; +} + +void BufferedPacket::reset() { + fHead = fTail = 0; + fUseCount = 0; + fIsFirstPacket = False; // by default +} + +// The following function has been deprecated: +unsigned BufferedPacket +::nextEnclosedFrameSize(unsigned char*& /*framePtr*/, unsigned dataSize) { + // By default, use the entire buffered data, even though it may consist + // of more than one frame, on the assumption that the client doesn't + // care. (This is more efficient than delivering a frame at a time) + return dataSize; +} + +void BufferedPacket +::getNextEnclosedFrameParameters(unsigned char*& framePtr, unsigned dataSize, + unsigned& frameSize, + unsigned& frameDurationInMicroseconds) { + // By default, use the entire buffered data, even though it may consist + // of more than one frame, on the assumption that the client doesn't + // care. (This is more efficient than delivering a frame at a time) + + // For backwards-compatibility with existing uses of (the now deprecated) + // "nextEnclosedFrameSize()", call that function to implement this one: + frameSize = nextEnclosedFrameSize(framePtr, dataSize); + + frameDurationInMicroseconds = 0; // by default. Subclasses should correct this. +} + +Boolean BufferedPacket::fillInData(RTPInterface& rtpInterface, struct sockaddr_storage& fromAddress, + Boolean& packetReadWasIncomplete) { + if (!packetReadWasIncomplete) reset(); + + unsigned const maxBytesToRead = bytesAvailable(); + if (maxBytesToRead == 0) return False; // exceeded buffer size when reading over TCP + + unsigned numBytesRead; + int tcpSocketNum; // not used + unsigned char tcpStreamChannelId; // not used + if (!rtpInterface.handleRead(&fBuf[fTail], maxBytesToRead, + numBytesRead, fromAddress, + tcpSocketNum, tcpStreamChannelId, + packetReadWasIncomplete)) { + return False; + } + fTail += numBytesRead; + return True; +} + +void BufferedPacket +::assignMiscParams(unsigned short rtpSeqNo, unsigned rtpTimestamp, + struct timeval presentationTime, + Boolean hasBeenSyncedUsingRTCP, Boolean rtpMarkerBit, + struct timeval timeReceived) { + fRTPSeqNo = rtpSeqNo; + fRTPTimestamp = rtpTimestamp; + fPresentationTime = presentationTime; + fHasBeenSyncedUsingRTCP = hasBeenSyncedUsingRTCP; + fRTPMarkerBit = rtpMarkerBit; + fTimeReceived = timeReceived; +} + +void BufferedPacket::skip(unsigned numBytes) { + fHead += numBytes; + if (fHead > fTail) fHead = fTail; +} + +void BufferedPacket::removePadding(unsigned numBytes) { + if (numBytes > fTail-fHead) numBytes = fTail-fHead; + fTail -= numBytes; +} + +void BufferedPacket::appendData(unsigned char* newData, unsigned numBytes) { + if (numBytes > fPacketSize-fTail) numBytes = fPacketSize - fTail; + memmove(&fBuf[fTail], newData, numBytes); + fTail += numBytes; +} + +void BufferedPacket::use(unsigned char* to, unsigned toSize, + unsigned& bytesUsed, unsigned& bytesTruncated, + unsigned short& rtpSeqNo, unsigned& rtpTimestamp, + struct timeval& presentationTime, + Boolean& hasBeenSyncedUsingRTCP, + Boolean& rtpMarkerBit) { + unsigned char* origFramePtr = &fBuf[fHead]; + unsigned char* newFramePtr = origFramePtr; // may change in the call below + unsigned frameSize, frameDurationInMicroseconds; + + rtpSeqNo = fRTPSeqNo; + rtpTimestamp = fRTPTimestamp; + presentationTime = fPresentationTime; + hasBeenSyncedUsingRTCP = fHasBeenSyncedUsingRTCP; + rtpMarkerBit = fRTPMarkerBit; + + getNextEnclosedFrameParameters(newFramePtr, fTail - fHead, + frameSize, frameDurationInMicroseconds); + if (frameSize > toSize) { + bytesTruncated += frameSize - toSize; + bytesUsed = toSize; + } else { + bytesTruncated = 0; + bytesUsed = frameSize; + } + + memmove(to, newFramePtr, bytesUsed); + fHead += (newFramePtr - origFramePtr) + frameSize; + ++fUseCount; + + // Update "fPresentationTime" for the next enclosed frame (if any): + fPresentationTime.tv_usec += frameDurationInMicroseconds; + if (fPresentationTime.tv_usec >= 1000000) { + fPresentationTime.tv_sec += fPresentationTime.tv_usec/1000000; + fPresentationTime.tv_usec = fPresentationTime.tv_usec%1000000; + } +} + +BufferedPacketFactory::BufferedPacketFactory() { +} + +BufferedPacketFactory::~BufferedPacketFactory() { +} + +BufferedPacket* BufferedPacketFactory +::createNewPacket(MultiFramedRTPSource* /*ourSource*/) { + return new BufferedPacket; +} + + +////////// ReorderingPacketBuffer implementation ////////// + +ReorderingPacketBuffer +::ReorderingPacketBuffer(BufferedPacketFactory* packetFactory) + : fThresholdTime(100000) /* default reordering threshold: 100 ms */, + fHaveSeenFirstPacket(False), fHeadPacket(NULL), fTailPacket(NULL), fSavedPacket(NULL), fSavedPacketFree(True) { + fPacketFactory = (packetFactory == NULL) + ? (new BufferedPacketFactory) + : packetFactory; +} + +ReorderingPacketBuffer::~ReorderingPacketBuffer() { + reset(); + delete fPacketFactory; +} + +void ReorderingPacketBuffer::reset() { + if (fSavedPacketFree) delete fSavedPacket; // because fSavedPacket is not in the list + delete fHeadPacket; // will also delete fSavedPacket if it's in the list + resetHaveSeenFirstPacket(); + fHeadPacket = fTailPacket = fSavedPacket = NULL; +} + +BufferedPacket* ReorderingPacketBuffer::getFreePacket(MultiFramedRTPSource* ourSource) { + if (fSavedPacket == NULL) { // we're being called for the first time + fSavedPacket = fPacketFactory->createNewPacket(ourSource); + fSavedPacketFree = True; + } + + if (fSavedPacketFree == True) { + fSavedPacketFree = False; + return fSavedPacket; + } else { + return fPacketFactory->createNewPacket(ourSource); + } +} + +Boolean ReorderingPacketBuffer::storePacket(BufferedPacket* bPacket) { + unsigned short rtpSeqNo = bPacket->rtpSeqNo(); + + if (!fHaveSeenFirstPacket) { + fNextExpectedSeqNo = rtpSeqNo; // initialization + bPacket->isFirstPacket() = True; + fHaveSeenFirstPacket = True; + } + + // Ignore this packet if its sequence number is less than the one + // that we're looking for (in this case, it's been excessively delayed). + if (seqNumLT(rtpSeqNo, fNextExpectedSeqNo)) return False; + + if (fTailPacket == NULL) { + // Common case: There are no packets in the queue; this will be the first one: + bPacket->nextPacket() = NULL; + fHeadPacket = fTailPacket = bPacket; + return True; + } + + if (seqNumLT(fTailPacket->rtpSeqNo(), rtpSeqNo)) { + // The next-most common case: There are packets already in the queue; this packet arrived in order => put it at the tail: + bPacket->nextPacket() = NULL; + fTailPacket->nextPacket() = bPacket; + fTailPacket = bPacket; + return True; + } + + if (rtpSeqNo == fTailPacket->rtpSeqNo()) { + // This is a duplicate packet - ignore it + return False; + } + + // Rare case: This packet is out-of-order. Run through the list (from the head), to figure out where it belongs: + BufferedPacket* beforePtr = NULL; + BufferedPacket* afterPtr = fHeadPacket; + while (afterPtr != NULL) { + if (seqNumLT(rtpSeqNo, afterPtr->rtpSeqNo())) break; // it comes here + if (rtpSeqNo == afterPtr->rtpSeqNo()) { + // This is a duplicate packet - ignore it + return False; + } + + beforePtr = afterPtr; + afterPtr = afterPtr->nextPacket(); + } + + // Link our new packet between "beforePtr" and "afterPtr": + bPacket->nextPacket() = afterPtr; + if (beforePtr == NULL) { + fHeadPacket = bPacket; + } else { + beforePtr->nextPacket() = bPacket; + } + + return True; +} + +void ReorderingPacketBuffer::releaseUsedPacket(BufferedPacket* packet) { + // ASSERT: packet == fHeadPacket + // ASSERT: fNextExpectedSeqNo == packet->rtpSeqNo() + ++fNextExpectedSeqNo; // because we're finished with this packet now + + fHeadPacket = fHeadPacket->nextPacket(); + if (!fHeadPacket) { + fTailPacket = NULL; + } + packet->nextPacket() = NULL; + + freePacket(packet); +} + +BufferedPacket* ReorderingPacketBuffer +::getNextCompletedPacket(Boolean& packetLossPreceded) { + if (fHeadPacket == NULL) return NULL; + + // Check whether the next packet we want is already at the head + // of the queue: + // ASSERT: fHeadPacket->rtpSeqNo() >= fNextExpectedSeqNo + if (fHeadPacket->rtpSeqNo() == fNextExpectedSeqNo) { + packetLossPreceded = fHeadPacket->isFirstPacket(); + // (The very first packet is treated as if there was packet loss beforehand.) + return fHeadPacket; + } + + // We're still waiting for our desired packet to arrive. However, if + // our time threshold has been exceeded, then forget it, and return + // the head packet instead: + Boolean timeThresholdHasBeenExceeded; + if (fThresholdTime == 0) { + timeThresholdHasBeenExceeded = True; // optimization + } else { + struct timeval timeNow; + gettimeofday(&timeNow, NULL); + unsigned uSecondsSinceReceived + = (timeNow.tv_sec - fHeadPacket->timeReceived().tv_sec)*1000000 + + (timeNow.tv_usec - fHeadPacket->timeReceived().tv_usec); + timeThresholdHasBeenExceeded = uSecondsSinceReceived > fThresholdTime; + } + if (timeThresholdHasBeenExceeded) { + fNextExpectedSeqNo = fHeadPacket->rtpSeqNo(); + // we've given up on earlier packets now + packetLossPreceded = True; + return fHeadPacket; + } + + // Otherwise, keep waiting for our desired packet to arrive: + return NULL; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/OggDemuxedTrack.cpp b/src/big/mpp/middleware/src/live555/liveMedia/OggDemuxedTrack.cpp new file mode 100644 index 000000000..5ad107750 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/OggDemuxedTrack.cpp @@ -0,0 +1,43 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A media track, demultiplexed from an Ogg file +// Implementation + +#include "OggDemuxedTrack.hh" +#include "OggFile.hh" + +OggDemuxedTrack::OggDemuxedTrack(UsageEnvironment& env, unsigned trackNumber, OggDemux& sourceDemux) + : FramedSource(env), + fOurTrackNumber(trackNumber), fOurSourceDemux(sourceDemux), + fCurrentPageIsContinuation(False) { + fNextPresentationTime.tv_sec = 0; fNextPresentationTime.tv_usec = 0; +} + +OggDemuxedTrack::~OggDemuxedTrack() { + fOurSourceDemux.removeTrack(fOurTrackNumber); +} + +void OggDemuxedTrack::doGetNextFrame() { + fOurSourceDemux.continueReading(); +} + +char const* OggDemuxedTrack::MIMEtype() const { + OggTrack* track = fOurSourceDemux.fOurFile.lookup(fOurTrackNumber); + if (track == NULL) return "(unknown)"; // shouldn't happen + return track->mimeType; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/OggDemuxedTrack.hh b/src/big/mpp/middleware/src/live555/liveMedia/OggDemuxedTrack.hh new file mode 100644 index 000000000..1d449358d --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/OggDemuxedTrack.hh @@ -0,0 +1,58 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A media track, demultiplexed from an Ogg file +// C++ header + +#ifndef _OGG_DEMUXED_TRACK_HH +#define _OGG_DEMUXED_TRACK_HH + +#ifndef _FRAMED_SOURCE_HH +#include "FramedSource.hh" +#endif + +class OggDemux; // forward + +class OggDemuxedTrack: public FramedSource { +private: // We are created only by a OggDemux (a friend) + friend class OggDemux; + OggDemuxedTrack(UsageEnvironment& env, unsigned trackNumber, OggDemux& sourceDemux); + virtual ~OggDemuxedTrack(); + +private: + // redefined virtual functions: + virtual void doGetNextFrame(); + virtual char const* MIMEtype() const; + +private: // We are accessed only by OggDemux and by OggFileParser (a friend) + friend class OggFileParser; + unsigned char*& to() { return fTo; } + unsigned& maxSize() { return fMaxSize; } + unsigned& frameSize() { return fFrameSize; } + unsigned& numTruncatedBytes() { return fNumTruncatedBytes; } + struct timeval& presentationTime() { return fPresentationTime; } + unsigned& durationInMicroseconds() { return fDurationInMicroseconds; } + struct timeval& nextPresentationTime() { return fNextPresentationTime; } + +private: + unsigned fOurTrackNumber; + OggDemux& fOurSourceDemux; + Boolean fCurrentPageIsContinuation; + struct timeval fNextPresentationTime; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/OggFile.cpp b/src/big/mpp/middleware/src/live555/liveMedia/OggFile.cpp new file mode 100644 index 000000000..400a84148 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/OggFile.cpp @@ -0,0 +1,350 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A class that encapsulates an Ogg file. +// Implementation + +#include "OggFileParser.hh" +#include "OggDemuxedTrack.hh" +#include "ByteStreamFileSource.hh" +#include "VorbisAudioRTPSink.hh" +#include "SimpleRTPSink.hh" +#include "TheoraVideoRTPSink.hh" + +////////// OggTrackTable definition ///////// + +// For looking up and iterating over the file's tracks: + +class OggTrackTable { +public: + OggTrackTable(); + virtual ~OggTrackTable(); + + void add(OggTrack* newTrack); + OggTrack* lookup(u_int32_t trackNumber); + + unsigned numTracks() const; + +private: + friend class OggTrackTableIterator; + HashTable* fTable; +}; + + +////////// OggFile implementation ////////// + +void OggFile::createNew(UsageEnvironment& env, char const* fileName, + onCreationFunc* onCreation, void* onCreationClientData) { + new OggFile(env, fileName, onCreation, onCreationClientData); +} + +OggTrack* OggFile::lookup(u_int32_t trackNumber) { + return fTrackTable->lookup(trackNumber); +} + +struct DemuxRecord { + OggDemux* demux; + OggDemuxOnDeletionFunc* onDeletionFunc; + void* objectToNotify; +}; + +OggDemux* OggFile +::newDemux(OggDemuxOnDeletionFunc* onDeletionFunc, void* objectToNotify) { + OggDemux* demux = new OggDemux(*this); + + DemuxRecord* demuxRecord = new DemuxRecord(); + demuxRecord->demux = demux; + demuxRecord->onDeletionFunc = onDeletionFunc; + demuxRecord->objectToNotify = objectToNotify; + + fDemuxesTable->Add((char const*)demux, demuxRecord); + + return demux; +} + +void OggFile::removeDemux(OggDemux* demux) { + DemuxRecord* demuxRecord = (DemuxRecord*)(fDemuxesTable->Lookup((char const*)demux)); + if (demuxRecord != NULL) { + fDemuxesTable->Remove((char const*)demux); + + if (demuxRecord->onDeletionFunc != NULL) { + (*demuxRecord->onDeletionFunc)(demuxRecord->objectToNotify, demux); + } + delete demuxRecord; + } +} + +unsigned OggFile::numTracks() const { + return fTrackTable->numTracks(); +} + +FramedSource* OggFile +::createSourceForStreaming(FramedSource* baseSource, u_int32_t trackNumber, + unsigned& estBitrate, unsigned& numFiltersInFrontOfTrack) { + if (baseSource == NULL) return NULL; + + FramedSource* result = baseSource; // by default + numFiltersInFrontOfTrack = 0; // by default + + // Look at the track's MIME type to set its estimated bitrate (for use by RTCP). + // (Later, try to be smarter about figuring out the bitrate.) ##### + // Some MIME types also require adding a special 'framer' in front of the source. + OggTrack* track = lookup(trackNumber); + if (track != NULL) { // should always be true + estBitrate = track->estBitrate; + } + + return result; +} + +RTPSink* OggFile +::createRTPSinkForTrackNumber(u_int32_t trackNumber, Groupsock* rtpGroupsock, + unsigned char rtpPayloadTypeIfDynamic) { + OggTrack* track = lookup(trackNumber); + if (track == NULL || track->mimeType == NULL) return NULL; + + RTPSink* result = NULL; // default value for unknown media types + + if (strcmp(track->mimeType, "audio/VORBIS") == 0) { + // For Vorbis audio, we use the special "identification", "comment", and "setup" headers + // that we read when we initially read the headers at the start of the file: + result = VorbisAudioRTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic, + track->samplingFrequency, track->numChannels, + track->vtoHdrs.header[0], track->vtoHdrs.headerSize[0], + track->vtoHdrs.header[1], track->vtoHdrs.headerSize[1], + track->vtoHdrs.header[2], track->vtoHdrs.headerSize[2]); + } else if (strcmp(track->mimeType, "audio/OPUS") == 0) { + result = SimpleRTPSink + ::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic, + 48000, "audio", "OPUS", 2, False/*only 1 Opus 'packet' in each RTP packet*/); + } else if (strcmp(track->mimeType, "video/THEORA") == 0) { + // For Theora video, we use the special "identification", "comment", and "setup" headers + // that we read when we initially read the headers at the start of the file: + result = TheoraVideoRTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic, + track->vtoHdrs.header[0], track->vtoHdrs.headerSize[0], + track->vtoHdrs.header[1], track->vtoHdrs.headerSize[1], + track->vtoHdrs.header[2], track->vtoHdrs.headerSize[2]); + } + + return result; +} + + +OggFile::OggFile(UsageEnvironment& env, char const* fileName, + onCreationFunc* onCreation, void* onCreationClientData) + : Medium(env), + fFileName(strDup(fileName)), + fOnCreation(onCreation), fOnCreationClientData(onCreationClientData) { + fTrackTable = new OggTrackTable; + fDemuxesTable = HashTable::create(ONE_WORD_HASH_KEYS); + + FramedSource* inputSource = ByteStreamFileSource::createNew(envir(), fileName); + if (inputSource == NULL) { + // The specified input file does not exist! + fParserForInitialization = NULL; + handleEndOfBosPageParsing(); // we have no file, and thus no tracks, but we still need to signal this + } else { + // Initialize ourselves by parsing the file's headers: + fParserForInitialization + = new OggFileParser(*this, inputSource, handleEndOfBosPageParsing, this); + } +} + +OggFile::~OggFile() { + delete fParserForInitialization; + + // Delete any outstanding "OggDemux"s, and the table for them: + DemuxRecord* demuxRecord; + while ((demuxRecord = (DemuxRecord*)fDemuxesTable->RemoveNext()) != NULL) { + delete demuxRecord->demux; + delete demuxRecord; + } + delete fDemuxesTable; + delete fTrackTable; + + delete[] (char*)fFileName; +} + +void OggFile::handleEndOfBosPageParsing(void* clientData) { + ((OggFile*)clientData)->handleEndOfBosPageParsing(); +} + +void OggFile::handleEndOfBosPageParsing() { + // Delete our parser, because it's done its job now: + delete fParserForInitialization; fParserForInitialization = NULL; + + // Finally, signal our caller that we've been created and initialized: + if (fOnCreation != NULL) (*fOnCreation)(this, fOnCreationClientData); +} + +void OggFile::addTrack(OggTrack* newTrack) { + fTrackTable->add(newTrack); +} + + +////////// OggTrackTable implementation ///////// + +OggTrackTable::OggTrackTable() + : fTable(HashTable::create(ONE_WORD_HASH_KEYS)) { +} + +OggTrackTable::~OggTrackTable() { + // Remove and delete all of our "OggTrack" descriptors, and the hash table itself: + OggTrack* track; + while ((track = (OggTrack*)fTable->RemoveNext()) != NULL) { + delete track; + } + delete fTable; +} + +void OggTrackTable::add(OggTrack* newTrack) { + OggTrack* existingTrack + = (OggTrack*)fTable->Add((char const*)newTrack->trackNumber, newTrack); + delete existingTrack; // if any +} + +OggTrack* OggTrackTable::lookup(u_int32_t trackNumber) { + return (OggTrack*)fTable->Lookup((char const*)trackNumber); +} + +unsigned OggTrackTable::numTracks() const { return fTable->numEntries(); } + +OggTrackTableIterator::OggTrackTableIterator(OggTrackTable& ourTable) { + fIter = HashTable::Iterator::create(*(ourTable.fTable)); +} + +OggTrackTableIterator::~OggTrackTableIterator() { + delete fIter; +} + +OggTrack* OggTrackTableIterator::next() { + char const* key; + return (OggTrack*)fIter->next(key); +} + + +////////// OggTrack implementation ////////// + +OggTrack::OggTrack() + : trackNumber(0), mimeType(NULL), + samplingFrequency(48000), numChannels(2), estBitrate(100) { // default settings + vtoHdrs.header[0] = vtoHdrs.header[1] = vtoHdrs.header[2] = NULL; + vtoHdrs.headerSize[0] = vtoHdrs.headerSize[1] = vtoHdrs.headerSize[2] = 0; + + vtoHdrs.vorbis_mode_count = 0; + vtoHdrs.vorbis_mode_blockflag = NULL; +} + +OggTrack::~OggTrack() { + delete[] vtoHdrs.header[0]; delete[] vtoHdrs.header[1]; delete[] vtoHdrs.header[2]; + delete[] vtoHdrs.vorbis_mode_blockflag; +} + + +///////// OggDemux implementation ///////// + +FramedSource* OggDemux::newDemuxedTrack(u_int32_t& resultTrackNumber) { + OggTrack* nextTrack; + do { + nextTrack = fIter->next(); + } while (nextTrack != NULL && nextTrack->mimeType == NULL); + + if (nextTrack == NULL) { // no more tracks + resultTrackNumber = 0; + return NULL; + } + + resultTrackNumber = nextTrack->trackNumber; + FramedSource* trackSource = new OggDemuxedTrack(envir(), resultTrackNumber, *this); + fDemuxedTracksTable->Add((char const*)resultTrackNumber, trackSource); + return trackSource; +} + +FramedSource* OggDemux::newDemuxedTrackByTrackNumber(unsigned trackNumber) { + if (trackNumber == 0) return NULL; + + FramedSource* trackSource = new OggDemuxedTrack(envir(), trackNumber, *this); + fDemuxedTracksTable->Add((char const*)trackNumber, trackSource); + return trackSource; +} + +OggDemuxedTrack* OggDemux::lookupDemuxedTrack(u_int32_t trackNumber) { + return (OggDemuxedTrack*)fDemuxedTracksTable->Lookup((char const*)trackNumber); +} + +OggDemux::OggDemux(OggFile& ourFile) + : Medium(ourFile.envir()), + fOurFile(ourFile), fDemuxedTracksTable(HashTable::create(ONE_WORD_HASH_KEYS)), + fIter(new OggTrackTableIterator(*fOurFile.fTrackTable)) { + FramedSource* fileSource = ByteStreamFileSource::createNew(envir(), ourFile.fileName()); + fOurParser = new OggFileParser(ourFile, fileSource, handleEndOfFile, this, this); +} + +OggDemux::~OggDemux() { + // Begin by acting as if we've reached the end of the source file. + // This should cause all of our demuxed tracks to get closed. + handleEndOfFile(); + + // Then delete our table of "OggDemuxedTrack"s + // - but not the "OggDemuxedTrack"s themselves; that should have already happened: + delete fDemuxedTracksTable; + + delete fIter; + delete fOurParser; + fOurFile.removeDemux(this); +} + +void OggDemux::removeTrack(u_int32_t trackNumber) { + fDemuxedTracksTable->Remove((char const*)trackNumber); + if (fDemuxedTracksTable->numEntries() == 0) { + // We no longer have any demuxed tracks, so delete ourselves now: + Medium::close(this); + } +} + +void OggDemux::continueReading() { + fOurParser->continueParsing(); +} + +void OggDemux::handleEndOfFile(void* clientData) { + ((OggDemux*)clientData)->handleEndOfFile(); +} + +void OggDemux::handleEndOfFile() { + // Iterate through all of our 'demuxed tracks', handling 'end of input' on each one. + // Hack: Because this can cause the hash table to get modified underneath us, + // we don't call the handlers until after we've first iterated through all of the tracks. + unsigned numTracks = fDemuxedTracksTable->numEntries(); + if (numTracks == 0) return; + OggDemuxedTrack** tracks = new OggDemuxedTrack*[numTracks]; + + HashTable::Iterator* iter = HashTable::Iterator::create(*fDemuxedTracksTable); + unsigned i; + char const* trackNumber; + + for (i = 0; i < numTracks; ++i) { + tracks[i] = (OggDemuxedTrack*)iter->next(trackNumber); + } + delete iter; + + for (i = 0; i < numTracks; ++i) { + if (tracks[i] == NULL) continue; // sanity check; shouldn't happen + tracks[i]->handleClosure(); + } + + delete[] tracks; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/OggFileParser.cpp b/src/big/mpp/middleware/src/live555/liveMedia/OggFileParser.cpp new file mode 100644 index 000000000..16fc3a25b --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/OggFileParser.cpp @@ -0,0 +1,1032 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A parser for an Ogg file. +// Implementation + +#include "OggFileParser.hh" +#include "OggDemuxedTrack.hh" +#include // for "gettimeofday() + +PacketSizeTable::PacketSizeTable(unsigned number_page_segments) + : numCompletedPackets(0), totSizes(0), nextPacketNumToDeliver(0), + lastPacketIsIncomplete(False) { + size = new unsigned[number_page_segments]; + for (unsigned i = 0; i < number_page_segments; ++i) size[i] = 0; +} + +PacketSizeTable::~PacketSizeTable() { + delete[] size; +} + +OggFileParser::OggFileParser(OggFile& ourFile, FramedSource* inputSource, + FramedSource::onCloseFunc* onEndFunc, void* onEndClientData, + OggDemux* ourDemux) + : StreamParser(inputSource, onEndFunc, onEndClientData, continueParsing, this), + fOurFile(ourFile), fInputSource(inputSource), + fOnEndFunc(onEndFunc), fOnEndClientData(onEndClientData), + fOurDemux(ourDemux), fNumUnfulfilledTracks(0), + fPacketSizeTable(NULL), fCurrentTrackNumber(0), fSavedPacket(NULL) { + if (ourDemux == NULL) { + // Initialization + fCurrentParseState = PARSING_START_OF_FILE; + continueParsing(); + } else { + fCurrentParseState = PARSING_AND_DELIVERING_PAGES; + // In this case, parsing (of page data) doesn't start until a client starts reading from a track. + } +} + +OggFileParser::~OggFileParser() { + delete[] fSavedPacket; + delete fPacketSizeTable; + Medium::close(fInputSource); +} + +void OggFileParser::continueParsing(void* clientData, unsigned char* ptr, unsigned size, struct timeval presentationTime) { + ((OggFileParser*)clientData)->continueParsing(); +} + +void OggFileParser::continueParsing() { + if (fInputSource != NULL) { + if (fInputSource->isCurrentlyAwaitingData()) return; + // Our input source is currently being read. Wait until that read completes + + if (!parse()) { + // We didn't complete the parsing, because we had to read more data from the source, + // or because we're waiting for another read from downstream. + // Once that happens, we'll get called again. + return; + } + } + + // We successfully parsed the file. Call our 'done' function now: + if (fOnEndFunc != NULL) (*fOnEndFunc)(fOnEndClientData); +} + +Boolean OggFileParser::parse() { + try { + while (1) { + switch (fCurrentParseState) { + case PARSING_START_OF_FILE: { + if (parseStartOfFile()) return True; + } + case PARSING_AND_DELIVERING_PAGES: { + parseAndDeliverPages(); + } + case DELIVERING_PACKET_WITHIN_PAGE: { + if (deliverPacketWithinPage()) return False; + } + } + } + } catch (int /*e*/) { +#ifdef DEBUG + fprintf(stderr, "OggFileParser::parse() EXCEPTION (This is normal behavior - *not* an error)\n"); +#endif + return False; // the parsing got interrupted + } +} + +Boolean OggFileParser::parseStartOfFile() { +#ifdef DEBUG + fprintf(stderr, "parsing start of file\n"); +#endif + // Read and parse each 'page', until we see the first non-BOS page, or until we have + // collected all required headers for Vorbis, Theora, or Opus track(s) (if any). + u_int8_t header_type_flag; + do { + header_type_flag = parseInitialPage(); + } while ((header_type_flag&0x02) != 0 || needHeaders()); + +#ifdef DEBUG + fprintf(stderr, "Finished parsing start of file\n"); +#endif + return True; +} + +static u_int32_t byteSwap(u_int32_t x) { + return (x<<24)|((x<<8)&0x00FF0000)|((x>>8)&0x0000FF00)|(x>>24); +} + +u_int8_t OggFileParser::parseInitialPage() { + u_int8_t header_type_flag; + u_int32_t bitstream_serial_number; + parseStartOfPage(header_type_flag, bitstream_serial_number); + + // If this is a BOS page, examine the first 8 bytes of the first 'packet', to see whether + // the track data type is one that we know how to stream: + OggTrack* track; + if ((header_type_flag&0x02) != 0) { // BOS + char const* mimeType = NULL; // if unknown + if (fPacketSizeTable != NULL && fPacketSizeTable->size[0] >= 8) { // sanity check + char buf[8]; + testBytes((u_int8_t*)buf, 8); + + if (strncmp(&buf[1], "vorbis", 6) == 0) { + mimeType = "audio/VORBIS"; + ++fNumUnfulfilledTracks; + } else if (strncmp(buf, "OpusHead", 8) == 0) { + mimeType = "audio/OPUS"; + ++fNumUnfulfilledTracks; + } else if (strncmp(&buf[1], "theora", 6) == 0) { + mimeType = "video/THEORA"; + ++fNumUnfulfilledTracks; + } + } + + // Add a new track descriptor for this track: + track = new OggTrack; + track->trackNumber = bitstream_serial_number; + track->mimeType = mimeType; + fOurFile.addTrack(track); + } else { // not a BOS page + // Because this is not a BOS page, the specified track should already have been seen: + track = fOurFile.lookup(bitstream_serial_number); + } + + if (track != NULL) { // sanity check +#ifdef DEBUG + fprintf(stderr, "This track's MIME type: %s\n", + track->mimeType == NULL ? "(unknown)" : track->mimeType); +#endif + if (track->mimeType != NULL && + (strcmp(track->mimeType, "audio/VORBIS") == 0 || + strcmp(track->mimeType, "video/THEORA") == 0 || + strcmp(track->mimeType, "audio/OPUS") == 0)) { + // Special-case handling of Vorbis, Theora, or Opus tracks: + // Make a copy of each packet, until we get the three special headers that we need: + Boolean isVorbis = strcmp(track->mimeType, "audio/VORBIS") == 0; + Boolean isTheora = strcmp(track->mimeType, "video/THEORA") == 0; + + for (unsigned j = 0; j < fPacketSizeTable->numCompletedPackets && track->weNeedHeaders(); ++j) { + unsigned const packetSize = fPacketSizeTable->size[j]; + if (packetSize == 0) continue; // sanity check + + delete[] fSavedPacket/*if any*/; fSavedPacket = new u_int8_t[packetSize]; + getBytes(fSavedPacket, packetSize); + fPacketSizeTable->totSizes -= packetSize; + + // The start of the packet tells us whether its a header that we know about: + Boolean headerIsKnown = False; + unsigned index = 0; + if (isVorbis) { + u_int8_t const firstByte = fSavedPacket[0]; + + headerIsKnown = firstByte == 1 || firstByte == 3 || firstByte == 5; + index = (firstByte-1)/2; // 1, 3, or 5 => 0, 1, or 2 + } else if (isTheora) { + u_int8_t const firstByte = fSavedPacket[0]; + + headerIsKnown = firstByte == 0x80 || firstByte == 0x81 || firstByte == 0x82; + index = firstByte &~0x80; // 0x80, 0x81, or 0x82 => 0, 1, or 2 + } else { // Opus + if (strncmp((char const*)fSavedPacket, "OpusHead", 8) == 0) { + headerIsKnown = True; + index = 0; // "identification" header + } else if (strncmp((char const*)fSavedPacket, "OpusTags", 8) == 0) { + headerIsKnown = True; + index = 1; // "comment" header + } + } + if (headerIsKnown) { +#ifdef DEBUG + char const* headerName[3] = { "identification", "comment", "setup" }; + fprintf(stderr, "Saved %d-byte %s \"%s\" header\n", packetSize, track->mimeType, + headerName[index]); +#endif + // This is a header, but first check it for validity: + if (!validateHeader(track, fSavedPacket, packetSize)) continue; + + // Save this header (deleting any old header of the same type that we'd saved before) + delete[] track->vtoHdrs.header[index]; + track->vtoHdrs.header[index] = fSavedPacket; + fSavedPacket = NULL; + track->vtoHdrs.headerSize[index] = packetSize; + + if (!track->weNeedHeaders()) { + // We now have all of the needed Vorbis, Theora, or Opus headers for this track: + --fNumUnfulfilledTracks; + } + // Note: The above code won't work if a required header is fragmented over + // more than one 'page'. We assume that that won't ever happen... + } + } + } + } + + // Skip over any remaining packet data bytes: + if (fPacketSizeTable->totSizes > 0) { +#ifdef DEBUG + fprintf(stderr, "Skipping %d remaining packet data bytes\n", fPacketSizeTable->totSizes); +#endif + skipBytes(fPacketSizeTable->totSizes); + } + + return header_type_flag; +} + +// A simple bit vector class for reading bits in little-endian order. +// (We can't use our usual "BitVector" class, because that's big-endian.) +class LEBitVector { +public: + LEBitVector(u_int8_t const* p, unsigned numBytes) + : fPtr(p), fEnd(&p[numBytes]), fNumBitsRemainingInCurrentByte(8) { + } + + u_int32_t getBits(unsigned numBits/*<=32*/) { + if (noMoreBits()) { + return 0; + } else if (numBits == fNumBitsRemainingInCurrentByte) { + u_int32_t result = (*fPtr++)>>(8-fNumBitsRemainingInCurrentByte); + fNumBitsRemainingInCurrentByte = 8; + + return result; + } else if (numBits < fNumBitsRemainingInCurrentByte) { + u_int8_t mask = 0xFF>>(8-numBits); + u_int32_t result = ((*fPtr)>>(8-fNumBitsRemainingInCurrentByte)) & mask; + fNumBitsRemainingInCurrentByte -= numBits; + + return result; + } else { // numBits > fNumBitsRemainingInCurrentByte + // Do two recursive calls to get the result: + unsigned nbr = fNumBitsRemainingInCurrentByte; + u_int32_t firstBits = getBits(nbr); + u_int32_t nextBits = getBits(numBits - nbr); + + return (nextBits< 32) { + (void)getBits(32); + numBits -= 32; + } + (void)getBits(numBits); + } + + unsigned numBitsRemaining() { return (fEnd-fPtr-1)*8 + fNumBitsRemainingInCurrentByte; } + Boolean noMoreBits() const { return fPtr >= fEnd; } + +private: + u_int8_t const* fPtr; + u_int8_t const* fEnd; + unsigned fNumBitsRemainingInCurrentByte; // 1..8 +}; + +static unsigned ilog(int n) { + if (n < 0) return 0; + + unsigned x = (unsigned)n; + unsigned result = 0; + + while (x > 0) { + ++result; + x >>= 1; + } + + return result; +} + +static unsigned lookup1_values(unsigned codebook_entries, unsigned codebook_dimensions) { + // "the greatest integer value for which [return_value] to the power of [codebook_dimensions] + // is less than or equal to [codebook_entries]" + unsigned return_value = 0; + unsigned powerValue; + + do { + ++return_value; + // Compute powerValue = return_value ** codebook_dimensions + if (return_value == 1) powerValue = 1; // optimization + else { + powerValue = 1; + for (unsigned i = 0; i < codebook_dimensions; ++i) { + powerValue *= return_value; + } + } + } while (powerValue <= codebook_entries); + return_value -= 1; + + return return_value; +} + +static Boolean parseVorbisSetup_codebook(LEBitVector& bv) { + if (bv.noMoreBits()) return False; + + unsigned sync = bv.getBits(24); + if (sync != 0x564342) return False; + unsigned codebook_dimensions = bv.getBits(16); + unsigned codebook_entries = bv.getBits(24); + unsigned ordered = bv.getBits(1); +#ifdef DEBUG_SETUP_HEADER + fprintf(stderr, "\t\t\tcodebook_dimensions: %d; codebook_entries: %d, ordered: %d\n", + codebook_dimensions, codebook_entries, ordered); +#endif + if (!ordered) { + unsigned sparse = bv.getBits(1); +#ifdef DEBUG_SETUP_HEADER + fprintf(stderr, "\t\t\t!ordered: sparse %d\n", sparse); +#endif + for (unsigned i = 0; i < codebook_entries; ++i) { + unsigned codewordLength; + + if (sparse) { + unsigned flag = bv.getBits(1); + if (flag) { + codewordLength = bv.getBits(5) + 1; + } else { + codewordLength = 0; + } + } else { + codewordLength = bv.getBits(5) + 1; + } +#ifdef DEBUG_SETUP_HEADER + fprintf(stderr, "\t\t\t\tcodeword length[%d]:\t%d\n", i, codewordLength); +#else + codewordLength = codewordLength; // to prevent compiler warning +#endif + } + } else { // ordered +#ifdef DEBUG_SETUP_HEADER + fprintf(stderr, "\t\t\tordered:\n"); +#endif + unsigned current_entry = 0; + unsigned current_length = bv.getBits(5) + 1; + do { + unsigned number = bv.getBits(ilog(codebook_entries - current_entry)); +#ifdef DEBUG_SETUP_HEADER + fprintf(stderr, "\t\t\t\tcodeword length[%d..%d]:\t%d\n", + current_entry, current_entry + number - 1, current_length); +#endif + current_entry += number; + if (current_entry > codebook_entries) { + fprintf(stderr, "Vorbis codebook parsing error: current_entry %d > codebook_entries %d!\n", current_entry, codebook_entries); + return False; + } + ++current_length; + } while (current_entry < codebook_entries); + } + + unsigned codebook_lookup_type = bv.getBits(4); +#ifdef DEBUG_SETUP_HEADER + fprintf(stderr, "\t\t\tcodebook_lookup_type: %d\n", codebook_lookup_type); +#endif + if (codebook_lookup_type > 2) { + fprintf(stderr, "Vorbis codebook parsing error: codebook_lookup_type %d!\n", codebook_lookup_type); + return False; + } else if (codebook_lookup_type > 0) { // 1 or 2 + bv.skipBits(32+32); // "codebook_minimum_value" and "codebook_delta_value" + unsigned codebook_value_bits = bv.getBits(4) + 1; + bv.skipBits(1); // "codebook_lookup_p" + unsigned codebook_lookup_values; + if (codebook_lookup_type == 1) { + codebook_lookup_values = lookup1_values(codebook_entries, codebook_dimensions); + } else { // 2 + codebook_lookup_values = codebook_entries*codebook_dimensions; + } + + bv.skipBits(codebook_lookup_values*codebook_value_bits); // "codebook_multiplicands" + } + + return True; +} + +static Boolean parseVorbisSetup_codebooks(LEBitVector& bv) { + if (bv.noMoreBits()) return False; + + unsigned vorbis_codebook_count = bv.getBits(8) + 1; +#ifdef DEBUG_SETUP_HEADER + fprintf(stderr, "\tCodebooks: vorbis_codebook_count: %d\n", vorbis_codebook_count); +#endif + for (unsigned i = 0; i < vorbis_codebook_count; ++i) { +#ifdef DEBUG_SETUP_HEADER + fprintf(stderr, "\t\tCodebook %d:\n", i); +#endif + if (!parseVorbisSetup_codebook(bv)) return False; + } + + return True; +} + +static Boolean parseVorbisSetup_timeDomainTransforms(LEBitVector& bv) { + if (bv.noMoreBits()) return False; + + unsigned vorbis_time_count = bv.getBits(6) + 1; +#ifdef DEBUG_SETUP_HEADER + fprintf(stderr, "\tTime domain transforms: vorbis_time_count: %d\n", vorbis_time_count); +#endif + for (unsigned i = 0; i < vorbis_time_count; ++i) { + unsigned val = bv.getBits(16); + if (val != 0) { + fprintf(stderr, "Vorbis Time domain transforms, read non-zero value %d\n", val); + return False; + } + } + + return True; +} + +static Boolean parseVorbisSetup_floors(LEBitVector& bv) { + if (bv.noMoreBits()) return False; + + unsigned vorbis_floor_count = bv.getBits(6) + 1; +#ifdef DEBUG_SETUP_HEADER + fprintf(stderr, "\tFloors: vorbis_floor_count: %d\n", vorbis_floor_count); +#endif + for (unsigned i = 0; i < vorbis_floor_count; ++i) { + unsigned floorType = bv.getBits(16); + if (floorType == 0) { + bv.skipBits(8+16+16+6+8); + unsigned floor0_number_of_books = bv.getBits(4) + 1; + bv.skipBits(floor0_number_of_books*8); + } else if (floorType == 1) { + unsigned floor1_partitions = bv.getBits(5); + + unsigned* floor1_partition_class_list = new unsigned[floor1_partitions]; + unsigned maximum_class = 0, j; + for (j = 0; j < floor1_partitions; ++j) { + floor1_partition_class_list[j] = bv.getBits(4); + if (floor1_partition_class_list[j] > maximum_class) maximum_class = floor1_partition_class_list[j]; + } + + unsigned* floor1_class_dimensions = new unsigned[maximum_class + 1]; + for (j = 0; j <= maximum_class; ++j) { + floor1_class_dimensions[j] = bv.getBits(3) + 1; + unsigned floor1_class_subclasses = bv.getBits(2); + if (floor1_class_subclasses != 0) { + bv.skipBits(8); // "floor1_class_masterbooks[j]" + } + + unsigned twoExp_floor1_class_subclasses = 1 << floor1_class_subclasses; + bv.skipBits(twoExp_floor1_class_subclasses*8); // "floor1_subclass_books[j][*]" + } + + bv.skipBits(2); // "floor1_multiplier" + unsigned rangebits = bv.getBits(4); + for (j = 0; j < floor1_partitions; ++j) { + unsigned current_class_number = floor1_partition_class_list[j]; + bv.skipBits(floor1_class_dimensions[current_class_number] * rangebits); + } + + delete[] floor1_partition_class_list; + delete[] floor1_class_dimensions; + } else { // floorType > 1 + fprintf(stderr, "Vorbis Floors, read bad floor type %d\n", floorType); + return False; + } + } + + return True; +} + +static Boolean parseVorbisSetup_residues(LEBitVector& bv) { + if (bv.noMoreBits()) return False; + + unsigned vorbis_residue_count = bv.getBits(6) + 1; +#ifdef DEBUG_SETUP_HEADER + fprintf(stderr, "\tResidues: vorbis_residue_count: %d\n", vorbis_residue_count); +#endif + for (unsigned i = 0; i < vorbis_residue_count; ++i) { + unsigned vorbis_residue_type = bv.getBits(16); + if (vorbis_residue_type > 2) { + fprintf(stderr, "Vorbis Residues, read bad vorbis_residue_type: %d\n", vorbis_residue_type); + return False; + } else { + bv.skipBits(24+24+24); // "residue_begin", "residue_end", "residue_partition_size" + unsigned residue_classifications = bv.getBits(6) + 1; + bv.skipBits(8); // "residue_classbook" + + u_int8_t* residue_cascade = new u_int8_t[residue_classifications]; + unsigned j; + for (j = 0; j < residue_classifications; ++j) { + u_int8_t high_bits = 0; + u_int8_t low_bits = bv.getBits(3); + unsigned bitflag = bv.getBits(1); + if (bitflag) { + high_bits = bv.getBits(5); + } + + residue_cascade[j] = (high_bits<<3) | low_bits; + } + + for (j = 0; j < residue_classifications; ++j) { + u_int8_t const cascade = residue_cascade[j]; + u_int8_t mask = 0x80; + while (mask != 0) { + if ((cascade&mask) != 0) bv.skipBits(8); // "residue_books[j][*]" + mask >>= 1; + } + } + + delete[] residue_cascade; + } + } + + return True; +} + +static Boolean parseVorbisSetup_mappings(LEBitVector& bv, unsigned audio_channels) { + if (bv.noMoreBits()) return False; + + unsigned vorbis_mapping_count = bv.getBits(6) + 1; +#ifdef DEBUG_SETUP_HEADER + fprintf(stderr, "\tMappings: vorbis_mapping_count: %d\n", vorbis_mapping_count); +#endif + for (unsigned i = 0; i < vorbis_mapping_count; ++i) { + unsigned vorbis_mapping_type = bv.getBits(16); + if (vorbis_mapping_type != 0) { + fprintf(stderr, "Vorbis Mappings, read bad vorbis_mapping_type: %d\n", vorbis_mapping_type); + return False; + } + + unsigned vorbis_mapping_submaps = 1; + if (bv.getBits(1)) vorbis_mapping_submaps = bv.getBits(4) + 1; + + if (bv.getBits(1)) { // "square polar channel mapping is in use" + unsigned vorbis_mapping_coupling_steps = bv.getBits(8) + 1; + + for (unsigned j = 0; j < vorbis_mapping_coupling_steps; ++j) { + unsigned ilog_audio_channels_minus_1 = ilog(audio_channels - 1); + bv.skipBits(2*ilog_audio_channels_minus_1); // "vorbis_mapping_magnitude", "vorbis_mapping_angle" + } + } + + unsigned reserved = bv.getBits(2); + if (reserved != 0) { + fprintf(stderr, "Vorbis Mappings, read bad 'reserved' field\n"); + return False; + } + + if (vorbis_mapping_submaps > 1) { + for (unsigned j = 0; j < audio_channels; ++j) { + unsigned vorbis_mapping_mux = bv.getBits(4); + + fprintf(stderr, "\t\t\t\tvorbis_mapping_mux[%d]: %d\n", j, vorbis_mapping_mux); + if (vorbis_mapping_mux >= vorbis_mapping_submaps) { + fprintf(stderr, "Vorbis Mappings, read bad \"vorbis_mapping_mux\" %d (>= \"vorbis_mapping_submaps\" %d)\n", vorbis_mapping_mux, vorbis_mapping_submaps); + return False; + } + } + } + + bv.skipBits(vorbis_mapping_submaps*(8+8+8)); // "the floor and residue numbers" + } + + return True; +} + +static Boolean parseVorbisSetup_modes(LEBitVector& bv, OggTrack* track) { + if (bv.noMoreBits()) return False; + + unsigned vorbis_mode_count = bv.getBits(6) + 1; + unsigned ilog_vorbis_mode_count_minus_1 = ilog(vorbis_mode_count - 1); +#ifdef DEBUG_SETUP_HEADER + fprintf(stderr, "\tModes: vorbis_mode_count: %d (ilog(%d-1):%d)\n", + vorbis_mode_count, vorbis_mode_count, ilog_vorbis_mode_count_minus_1); +#endif + track->vtoHdrs.vorbis_mode_count = vorbis_mode_count; + track->vtoHdrs.ilog_vorbis_mode_count_minus_1 = ilog_vorbis_mode_count_minus_1; + track->vtoHdrs.vorbis_mode_blockflag = new u_int8_t[vorbis_mode_count]; + + for (unsigned i = 0; i < vorbis_mode_count; ++i) { + track->vtoHdrs.vorbis_mode_blockflag[i] = (u_int8_t)bv.getBits(1); +#ifdef DEBUG_SETUP_HEADER + fprintf(stderr, "\t\tMode %d: vorbis_mode_blockflag: %d\n", i, track->vtoHdrs.vorbis_mode_blockflag[i]); +#endif + bv.skipBits(16+16+8); // "vorbis_mode_windowtype", "vorbis_mode_transformtype", "vorbis_mode_mapping" + } + + return True; +} + +static Boolean parseVorbisSetupHeader(OggTrack* track, u_int8_t const* p, unsigned headerSize) { + LEBitVector bv(p, headerSize); + do { + if (!parseVorbisSetup_codebooks(bv)) break; + if (!parseVorbisSetup_timeDomainTransforms(bv)) break; + if (!parseVorbisSetup_floors(bv)) break; + if (!parseVorbisSetup_residues(bv)) break; + if (!parseVorbisSetup_mappings(bv, track->numChannels)) break; + if (!parseVorbisSetup_modes(bv, track)) break; + unsigned framingFlag = bv.getBits(1); + if (framingFlag == 0) { + fprintf(stderr, "Vorbis \"setup\" header did not end with a 'framing flag'!\n"); + break; + } + + return True; + } while (0); + + // An error occurred: + return False; +} + +#ifdef DEBUG +#define CHECK_PTR if (p >= pEnd) return False +#define printComment(p, len) do { for (unsigned k = 0; k < len; ++k) { CHECK_PTR; fprintf(stderr, "%c", *p++); } } while (0) +#endif + +static Boolean validateCommentHeader(u_int8_t const *p, unsigned headerSize, + unsigned isOpus = 0) { + if (headerSize < 15+isOpus) { // need 7+isOpus + 4(vendor_length) + 4(user_comment_list_length) + fprintf(stderr, "\"comment\" header is too short (%d bytes)\n", headerSize); + return False; + } + +#ifdef DEBUG + u_int8_t const* pEnd = &p[headerSize]; + p += 7+isOpus; + + u_int32_t vendor_length = (p[3]<<24)|(p[2]<<16)|(p[1]<<8)|p[0]; p += 4; + fprintf(stderr, "\tvendor_string:"); + printComment(p, vendor_length); + fprintf(stderr, "\n"); + + u_int32_t user_comment_list_length = (p[3]<<24)|(p[2]<<16)|(p[1]<<8)|p[0]; p += 4; + for (unsigned i = 0; i < user_comment_list_length; ++i) { + CHECK_PTR; u_int32_t length = (p[3]<<24)|(p[2]<<16)|(p[1]<<8)|p[0]; p += 4; + fprintf(stderr, "\tuser_comment[%d]:", i); + printComment(p, length); + fprintf(stderr, "\n"); + } +#endif + + return True; +} + +static unsigned blocksizeFromExponent(unsigned exponent) { + unsigned result = 1; + for (unsigned i = 0; i < exponent; ++i) result = 2*result; + return result; +} + +Boolean OggFileParser::validateHeader(OggTrack* track, u_int8_t const* p, unsigned headerSize) { + // Assert: headerSize >= 7 (because we've already checked "XXXXXX" or "OpusXXXX") + if (strcmp(track->mimeType, "audio/VORBIS") == 0) { + u_int8_t const firstByte = p[0]; + + if (firstByte == 1) { // "identification" header + if (headerSize < 30) { + fprintf(stderr, "Vorbis \"identification\" header is too short (%d bytes)\n", headerSize); + return False; + } else if ((p[29]&0x1) != 1) { + fprintf(stderr, "Vorbis \"identification\" header: 'framing_flag' is not set\n"); + return False; + } + + p += 7; + u_int32_t vorbis_version = (p[3]<<24)|(p[2]<<16)|(p[1]<<8)|p[0]; p += 4; + if (vorbis_version != 0) { + fprintf(stderr, "Vorbis \"identification\" header has a bad 'vorbis_version': 0x%08x\n", vorbis_version); + return False; + } + + u_int8_t audio_channels = *p++; + if (audio_channels == 0) { + fprintf(stderr, "Vorbis \"identification\" header: 'audio_channels' is 0!\n"); + return False; + } + track->numChannels = audio_channels; + + u_int32_t audio_sample_rate = (p[3]<<24)|(p[2]<<16)|(p[1]<<8)|p[0]; p += 4; + if (audio_sample_rate == 0) { + fprintf(stderr, "Vorbis \"identification\" header: 'audio_sample_rate' is 0!\n"); + return False; + } + track->samplingFrequency = audio_sample_rate; + + p += 4; // skip over 'bitrate_maximum' + u_int32_t bitrate_nominal = (p[3]<<24)|(p[2]<<16)|(p[1]<<8)|p[0]; p += 4; + if (bitrate_nominal > 0) track->estBitrate = (bitrate_nominal+500)/1000; // round + + p += 4; // skip over 'bitrate_maximum' + + // Note the two 'block sizes' (samples per packet), and their durations in microseconds: + u_int8_t blocksizeBits = *p++; + unsigned& blocksize_0 = track->vtoHdrs.blocksize[0]; // alias + unsigned& blocksize_1 = track->vtoHdrs.blocksize[1]; // alias + blocksize_0 = blocksizeFromExponent(blocksizeBits&0x0F); + blocksize_1 = blocksizeFromExponent(blocksizeBits>>4); + + double uSecsPerSample = 1000000.0/(track->samplingFrequency*2); + // Why the "2"? I don't know, but it seems to be necessary + track->vtoHdrs.uSecsPerPacket[0] = (unsigned)(uSecsPerSample*blocksize_0); + track->vtoHdrs.uSecsPerPacket[1] = (unsigned)(uSecsPerSample*blocksize_1); +#ifdef DEBUG + fprintf(stderr, "\t%u Hz, %u-channel, %u kbps (est), block sizes: %u,%u (%u,%u us)\n", + track->samplingFrequency, track->numChannels, track->estBitrate, + blocksize_0, blocksize_1, + track->vtoHdrs.uSecsPerPacket[0], track->vtoHdrs.uSecsPerPacket[1]); +#endif + // To be valid, "blocksize_0" must be <= "blocksize_1", and both must be in [64,8192]: + if (!(blocksize_0 <= blocksize_1 && blocksize_0 >= 64 && blocksize_1 <= 8192)) { + fprintf(stderr, "Invalid Vorbis \"blocksize_0\" (%d) and/or \"blocksize_1\" (%d)!\n", + blocksize_0, blocksize_1); + return False; + } + } else if (firstByte == 3) { // "comment" header + if (!validateCommentHeader(p, headerSize)) return False; + } else if (firstByte == 5) { // "setup" header + // Parse the "setup" header to get the values that we want: + // "vorbis_mode_count", and "vorbis_mode_blockflag" for each mode. Unfortunately these come + // near the end of the header, so we have to parse lots of other crap first. + p += 7; + if (!parseVorbisSetupHeader(track, p, headerSize)) { + fprintf(stderr, "Failed to parse Vorbis \"setup\" header!\n"); + return False; + } + } + } else if (strcmp(track->mimeType, "video/THEORA") == 0) { + u_int8_t const firstByte = p[0]; + + if (firstByte == 0x80) { // "identification" header + if (headerSize < 42) { + fprintf(stderr, "Theora \"identification\" header is too short (%d bytes)\n", headerSize); + return False; + } else if ((p[41]&0x7) != 0) { + fprintf(stderr, "Theora \"identification\" header: 'res' bits are non-zero\n"); + return False; + } + + track->vtoHdrs.KFGSHIFT = ((p[40]&3)<<3) | (p[41]>>5); + u_int32_t FRN = (p[22]<<24) | (p[23]<<16) | (p[24]<<8) | p[25]; // Frame rate numerator + u_int32_t FRD = (p[26]<<24) | (p[27]<<16) | (p[28]<<8) | p[29]; // Frame rate numerator +#ifdef DEBUG + fprintf(stderr, "\tKFGSHIFT %d, Frame rate numerator %d, Frame rate denominator %d\n", track->vtoHdrs.KFGSHIFT, FRN, FRD); +#endif + if (FRN == 0 || FRD == 0) { + fprintf(stderr, "Theora \"identification\" header: Bad FRN and/or FRD values: %d, %d\n", FRN, FRD); + return False; + } + track->vtoHdrs.uSecsPerFrame = (unsigned)((1000000.0*FRD)/FRN); +#ifdef DEBUG + fprintf(stderr, "\t\t=> %u microseconds per frame\n", track->vtoHdrs.uSecsPerFrame); +#endif + } else if (firstByte == 0x81) { // "comment" header + if (!validateCommentHeader(p, headerSize)) return False; + } else if (firstByte == 0x82) { // "setup" header + // We don't care about the contents of the Theora "setup" header; just assume it's valid + } + } else { // Opus audio + if (strncmp((char const*)p, "OpusHead", 8) == 0) { // "identification" header + // Just check the size, and the 'major' number of the version byte: + if (headerSize < 19 || (p[8]&0xF0) != 0) return False; + } else { // comment header + if (!validateCommentHeader(p, headerSize, 1/*isOpus*/)) return False; + } + } + + return True; +} + +void OggFileParser::parseAndDeliverPages() { +#ifdef DEBUG + fprintf(stderr, "parsing and delivering data\n"); +#endif + while (parseAndDeliverPage()) {} +} + +Boolean OggFileParser::parseAndDeliverPage() { + u_int8_t header_type_flag; + u_int32_t bitstream_serial_number; + parseStartOfPage(header_type_flag, bitstream_serial_number); + + OggDemuxedTrack* demuxedTrack = fOurDemux->lookupDemuxedTrack(bitstream_serial_number); + if (demuxedTrack == NULL) { // this track is not being read +#ifdef DEBUG + fprintf(stderr, "\tIgnoring page from unread track; skipping %d remaining packet data bytes\n", + fPacketSizeTable->totSizes); +#endif + skipBytes(fPacketSizeTable->totSizes); + return True; + } else if (fPacketSizeTable->totSizes == 0) { + // This page is empty (has no packets). Skip it and continue +#ifdef DEBUG + fprintf(stderr, "\t[track: %s] Skipping empty page\n", demuxedTrack->MIMEtype()); +#endif + return True; + } + + // Start delivering packets next: + demuxedTrack->fCurrentPageIsContinuation = (header_type_flag&0x01) != 0; + fCurrentTrackNumber = bitstream_serial_number; + fCurrentParseState = DELIVERING_PACKET_WITHIN_PAGE; + saveParserState(); + return False; +} + +Boolean OggFileParser::deliverPacketWithinPage() { + OggDemuxedTrack* demuxedTrack = fOurDemux->lookupDemuxedTrack(fCurrentTrackNumber); + if (demuxedTrack == NULL) return False; // should not happen + + unsigned packetNum = fPacketSizeTable->nextPacketNumToDeliver; + unsigned packetSize = fPacketSizeTable->size[packetNum]; + + if (!demuxedTrack->isCurrentlyAwaitingData()) { + // Someone has been reading this stream, but isn't right now. + // We can't deliver this frame until he asks for it, so punt for now. + // The next time he asks for a frame, he'll get it. +#ifdef DEBUG + fprintf(stderr, "\t[track: %s] Deferring delivery of packet %d (%d bytes%s)\n", + demuxedTrack->MIMEtype(), packetNum, packetSize, + packetNum == fPacketSizeTable->numCompletedPackets ? " (incomplete)" : ""); +#endif + return True; + } + + // Deliver the next packet: +#ifdef DEBUG + fprintf(stderr, "\t[track: %s] Delivering packet %d (%d bytes%s)\n", demuxedTrack->MIMEtype(), + packetNum, packetSize, + packetNum == fPacketSizeTable->numCompletedPackets ? " (incomplete)" : ""); +#endif + unsigned numBytesDelivered + = packetSize < demuxedTrack->maxSize() ? packetSize : demuxedTrack->maxSize(); + getBytes(demuxedTrack->to(), numBytesDelivered); + u_int8_t firstByte = numBytesDelivered > 0 ? demuxedTrack->to()[0] : 0x00; + u_int8_t secondByte = numBytesDelivered > 1 ? demuxedTrack->to()[1] : 0x00; + demuxedTrack->to() += numBytesDelivered; + + if (demuxedTrack->fCurrentPageIsContinuation) { // the previous page's read was incomplete + demuxedTrack->frameSize() += numBytesDelivered; + } else { + // This is the first delivery for this "doGetNextFrame()" call. + demuxedTrack->frameSize() = numBytesDelivered; + } + if (packetSize > demuxedTrack->maxSize()) { + demuxedTrack->numTruncatedBytes() += packetSize - demuxedTrack->maxSize(); + } + demuxedTrack->maxSize() -= numBytesDelivered; + + // Figure out the duration and presentation time of this frame. + unsigned durationInMicroseconds; + OggTrack* track = fOurFile.lookup(demuxedTrack->fOurTrackNumber); + + if (strcmp(track->mimeType, "audio/VORBIS") == 0) { + if ((firstByte&0x01) != 0) { // This is a header packet + durationInMicroseconds = 0; + } else { // This is a data packet. + // Parse the first byte to figure out its duration. + // Extract the next "track->vtoHdrs.ilog_vorbis_mode_count_minus_1" bits of the first byte: + u_int8_t const mask = 0xFE<<(track->vtoHdrs.ilog_vorbis_mode_count_minus_1); + u_int8_t const modeNumber = (firstByte&~mask)>>1; + if (modeNumber >= track->vtoHdrs.vorbis_mode_count) { + fprintf(stderr, "Error: Bad mode number %d (>= vorbis_mode_count %d) in Vorbis packet!\n", + modeNumber, track->vtoHdrs.vorbis_mode_count); + durationInMicroseconds = 0; + } else { + unsigned blockNumber = track->vtoHdrs.vorbis_mode_blockflag[modeNumber]; + durationInMicroseconds = track->vtoHdrs.uSecsPerPacket[blockNumber]; + } + } + } else if (strcmp(track->mimeType, "video/THEORA") == 0) { + if ((firstByte&0x80) != 0) { // This is a header packet + durationInMicroseconds = 0; + } else { // This is a data packet. + durationInMicroseconds = track->vtoHdrs.uSecsPerFrame; + } + } else { // "audio/OPUS" + if (firstByte == 0x4F/*'O'*/ && secondByte == 0x70/*'p*/) { // This is a header packet + durationInMicroseconds = 0; + } else { // This is a data packet. + // Parse the first byte to figure out the duration of each frame, and then (if necessary) + // parse the second byte to figure out how many frames are in this packet: + u_int8_t config = firstByte >> 3; + u_int8_t c = firstByte & 0x03; + unsigned const configDuration[32] = { // in microseconds + 10000, 20000, 40000, 60000, // config 0..3 + 10000, 20000, 40000, 60000, // config 4..7 + 10000, 20000, 40000, 60000, // config 8..11 + 10000, 20000, // config 12..13 + 10000, 20000, // config 14..15 + 2500, 5000, 10000, 20000, // config 16..19 + 2500, 5000, 10000, 20000, // config 20..23 + 2500, 5000, 10000, 20000, // config 24..27 + 2500, 5000, 10000, 20000 // config 28..31 + }; + unsigned const numFramesInPacket = c == 0 ? 1 : c == 3 ? (secondByte&0x3F) : 2; + durationInMicroseconds = numFramesInPacket*configDuration[config]; + } + } + + if (demuxedTrack->nextPresentationTime().tv_sec == 0 && demuxedTrack->nextPresentationTime().tv_usec == 0) { + // This is the first delivery. Initialize "demuxedTrack->nextPresentationTime()": + gettimeofday(&demuxedTrack->nextPresentationTime(), NULL); + } + demuxedTrack->presentationTime() = demuxedTrack->nextPresentationTime(); + demuxedTrack->durationInMicroseconds() = durationInMicroseconds; + + demuxedTrack->nextPresentationTime().tv_usec += durationInMicroseconds; + while (demuxedTrack->nextPresentationTime().tv_usec >= 1000000) { + ++demuxedTrack->nextPresentationTime().tv_sec; + demuxedTrack->nextPresentationTime().tv_usec -= 1000000; + } + saveParserState(); + + // And check whether there's a next packet in this page: + if (packetNum == fPacketSizeTable->numCompletedPackets) { + // This delivery was for an incomplete packet, at the end of the page. + // Return without completing delivery: + fCurrentParseState = PARSING_AND_DELIVERING_PAGES; + return False; + } + + if (packetNum < fPacketSizeTable->numCompletedPackets-1 + || fPacketSizeTable->lastPacketIsIncomplete) { + // There is at least one more packet (possibly incomplete) left in this packet. + // Deliver it next: + ++fPacketSizeTable->nextPacketNumToDeliver; + } else { + // Start parsing a new page next: + fCurrentParseState = PARSING_AND_DELIVERING_PAGES; + } + + FramedSource::afterGetting(demuxedTrack); // completes delivery + return True; +} + +void OggFileParser::parseStartOfPage(u_int8_t& header_type_flag, + u_int32_t& bitstream_serial_number) { + saveParserState(); + // First, make sure we start with the 'capture_pattern': 0x4F676753 ('OggS'): + while (test4Bytes() != 0x4F676753) { + skipBytes(1); + saveParserState(); // ensures forward progress through the file + } + skipBytes(4); +#ifdef DEBUG + fprintf(stderr, "\nSaw Ogg page header:\n"); +#endif + + u_int8_t stream_structure_version = get1Byte(); + if (stream_structure_version != 0) { + fprintf(stderr, "Saw page with unknown Ogg file version number: 0x%02x\n", stream_structure_version); + } + + header_type_flag = get1Byte(); +#ifdef DEBUG + fprintf(stderr, "\theader_type_flag: 0x%02x (", header_type_flag); + if (header_type_flag&0x01) fprintf(stderr, "continuation "); + if (header_type_flag&0x02) fprintf(stderr, "bos "); + if (header_type_flag&0x04) fprintf(stderr, "eos "); + fprintf(stderr, ")\n"); +#endif + + u_int32_t granule_position1 = byteSwap(get4Bytes()); + u_int32_t granule_position2 = byteSwap(get4Bytes()); + bitstream_serial_number = byteSwap(get4Bytes()); + u_int32_t page_sequence_number = byteSwap(get4Bytes()); + u_int32_t CRC_checksum = byteSwap(get4Bytes()); + u_int8_t number_page_segments = get1Byte(); +#ifdef DEBUG + fprintf(stderr, "\tgranule_position 0x%08x%08x, bitstream_serial_number 0x%08x, page_sequence_number 0x%08x, CRC_checksum 0x%08x, number_page_segments %d\n", granule_position2, granule_position1, bitstream_serial_number, page_sequence_number, CRC_checksum, number_page_segments); +#else + // Dummy statements to prevent 'unused variable' compiler warnings: +#define DUMMY_STATEMENT(x) do {x = x;} while (0) + DUMMY_STATEMENT(granule_position1); + DUMMY_STATEMENT(granule_position2); + DUMMY_STATEMENT(page_sequence_number); + DUMMY_STATEMENT(CRC_checksum); +#endif + + // Look at the "segment_table" to count the sizes of the packets in this page: + delete fPacketSizeTable/*if any*/; fPacketSizeTable = new PacketSizeTable(number_page_segments); + u_int8_t lacing_value = 0; +#ifdef DEBUG + fprintf(stderr, "\tsegment_table\n"); +#endif + for (unsigned i = 0; i < number_page_segments; ++i) { + lacing_value = get1Byte(); +#ifdef DEBUG + fprintf(stderr, "\t\t%d:\t%d", i, lacing_value); +#endif + fPacketSizeTable->totSizes += lacing_value; + fPacketSizeTable->size[fPacketSizeTable->numCompletedPackets] += lacing_value; + if (lacing_value < 255) { + // This completes a packet: +#ifdef DEBUG + fprintf(stderr, " (->%d)", fPacketSizeTable->size[fPacketSizeTable->numCompletedPackets]); +#endif + ++fPacketSizeTable->numCompletedPackets; + } +#ifdef DEBUG + fprintf(stderr, "\n"); +#endif + } + + fPacketSizeTable->lastPacketIsIncomplete = lacing_value == 255; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/OggFileParser.hh b/src/big/mpp/middleware/src/live555/liveMedia/OggFileParser.hh new file mode 100644 index 000000000..4e65f44c0 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/OggFileParser.hh @@ -0,0 +1,91 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A parser for an Ogg file +// C++ header + +#ifndef _OGG_FILE_PARSER_HH + +#ifndef _STREAM_PARSER_HH +#include "StreamParser.hh" +#endif +#ifndef _OGG_FILE_HH +#include "OggFile.hh" +#endif + +// An enum representing the current state of the parser: +enum OggParseState { + PARSING_START_OF_FILE, + PARSING_AND_DELIVERING_PAGES, + DELIVERING_PACKET_WITHIN_PAGE +}; + +// A structure that counts the sizes of 'packets' given by each page's "segment_table": +class PacketSizeTable { +public: + PacketSizeTable(unsigned number_page_segments); + ~PacketSizeTable(); + + unsigned numCompletedPackets; // will be <= "number_page_segments" + unsigned* size; // an array of sizes of each of the packets + unsigned totSizes; + unsigned nextPacketNumToDeliver; + Boolean lastPacketIsIncomplete; // iff the last segment's 'lacing' was 255 +}; + +class OggFileParser: public StreamParser { +public: + OggFileParser(OggFile& ourFile, FramedSource* inputSource, + FramedSource::onCloseFunc* onEndFunc, void* onEndClientData, + OggDemux* ourDemux = NULL); + virtual ~OggFileParser(); + + // StreamParser 'client continue' function: + static void continueParsing(void* clientData, unsigned char* ptr, unsigned size, struct timeval presentationTime); + void continueParsing(); + +private: + Boolean needHeaders() { return fNumUnfulfilledTracks > 0; } + + // Parsing functions: + Boolean parse(); // returns True iff we have finished parsing all BOS pages (on initialization) + + Boolean parseStartOfFile(); + u_int8_t parseInitialPage(); // returns the 'header_type_flag' byte + void parseAndDeliverPages(); + Boolean parseAndDeliverPage(); + Boolean deliverPacketWithinPage(); + void parseStartOfPage(u_int8_t& header_type_flag, u_int32_t& bitstream_serial_number); + + Boolean validateHeader(OggTrack* track, u_int8_t const* p, unsigned headerSize); + +private: + // General state for parsing: + OggFile& fOurFile; + FramedSource* fInputSource; + FramedSource::onCloseFunc* fOnEndFunc; + void* fOnEndClientData; + OggDemux* fOurDemux; + OggParseState fCurrentParseState; + + unsigned fNumUnfulfilledTracks; + PacketSizeTable* fPacketSizeTable; + u_int32_t fCurrentTrackNumber; + u_int8_t* fSavedPacket; // used to temporarily save a copy of a 'packet' from a page +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/OggFileServerDemux.cpp b/src/big/mpp/middleware/src/live555/liveMedia/OggFileServerDemux.cpp new file mode 100644 index 000000000..7f167e4bd --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/OggFileServerDemux.cpp @@ -0,0 +1,117 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A server demultiplexor for a Ogg file +// Implementation + +#include "OggFileServerDemux.hh" +#include "OggFileServerMediaSubsession.hh" + +void OggFileServerDemux +::createNew(UsageEnvironment& env, char const* fileName, + onCreationFunc* onCreation, void* onCreationClientData) { + (void)new OggFileServerDemux(env, fileName, + onCreation, onCreationClientData); +} + +ServerMediaSubsession* OggFileServerDemux::newServerMediaSubsession() { + u_int32_t dummyResultTrackNumber; + return newServerMediaSubsession(dummyResultTrackNumber); +} + +ServerMediaSubsession* OggFileServerDemux +::newServerMediaSubsession(u_int32_t& resultTrackNumber) { + resultTrackNumber = 0; + + OggTrack* nextTrack = fIter->next(); + if (nextTrack == NULL) return NULL; + + return newServerMediaSubsessionByTrackNumber(nextTrack->trackNumber); +} + +ServerMediaSubsession* OggFileServerDemux +::newServerMediaSubsessionByTrackNumber(u_int32_t trackNumber) { + OggTrack* track = fOurOggFile->lookup(trackNumber); + if (track == NULL) return NULL; + + ServerMediaSubsession* result = OggFileServerMediaSubsession::createNew(*this, track); + if (result != NULL) { +#ifdef DEBUG + fprintf(stderr, "Created 'ServerMediaSubsession' object for track #%d: (%s)\n", track->trackNumber, track->mimeType); +#endif + } + + return result; +} + +FramedSource* OggFileServerDemux::newDemuxedTrack(unsigned clientSessionId, u_int32_t trackNumber) { + OggDemux* demuxToUse = NULL; + + if (clientSessionId != 0 && clientSessionId == fLastClientSessionId) { + demuxToUse = fLastCreatedDemux; // use the same demultiplexor as before + // Note: This code relies upon the fact that the creation of streams for different + // client sessions do not overlap - so all demuxed tracks are created for one "OggDemux" at a time. + // Also, the "clientSessionId != 0" test is a hack, because 'session 0' is special; its audio and video streams + // are created and destroyed one-at-a-time, rather than both streams being + // created, and then (later) both streams being destroyed (as is the case + // for other ('real') session ids). Because of this, a separate demultiplexor is used for each 'session 0' track. + } + + if (demuxToUse == NULL) demuxToUse = fOurOggFile->newDemux(onDemuxDeletion, this); + + fLastClientSessionId = clientSessionId; + fLastCreatedDemux = demuxToUse; + + return demuxToUse->newDemuxedTrackByTrackNumber(trackNumber); +} + +OggFileServerDemux +::OggFileServerDemux(UsageEnvironment& env, char const* fileName, + onCreationFunc* onCreation, void* onCreationClientData) + : Medium(env), + fFileName(fileName), fOnCreation(onCreation), fOnCreationClientData(onCreationClientData), + fIter(NULL/*until the OggFile is created*/), + fLastClientSessionId(0), fLastCreatedDemux(NULL) { + OggFile::createNew(env, fileName, onOggFileCreation, this); +} + +OggFileServerDemux::~OggFileServerDemux() { + Medium::close(fOurOggFile); + + delete fIter; +} + +void OggFileServerDemux::onOggFileCreation(OggFile* newFile, void* clientData) { + ((OggFileServerDemux*)clientData)->onOggFileCreation(newFile); +} + +void OggFileServerDemux::onOggFileCreation(OggFile* newFile) { + fOurOggFile = newFile; + + fIter = new OggTrackTableIterator(fOurOggFile->trackTable()); + + // Now, call our own creation notification function: + if (fOnCreation != NULL) (*fOnCreation)(this, fOnCreationClientData); +} + +void OggFileServerDemux::onDemuxDeletion(void* clientData, OggDemux* demuxBeingDeleted) { + ((OggFileServerDemux*)clientData)->onDemuxDeletion(demuxBeingDeleted); +} + +void OggFileServerDemux::onDemuxDeletion(OggDemux* demuxBeingDeleted) { + if (fLastCreatedDemux == demuxBeingDeleted) fLastCreatedDemux = NULL; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/OggFileServerMediaSubsession.cpp b/src/big/mpp/middleware/src/live555/liveMedia/OggFileServerMediaSubsession.cpp new file mode 100644 index 000000000..5a607ad52 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/OggFileServerMediaSubsession.cpp @@ -0,0 +1,54 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A 'ServerMediaSubsession' object that creates new, unicast, "RTPSink"s +// on demand, from a track within an Ogg file. +// Implementation + +#include "OggFileServerMediaSubsession.hh" +#include "OggDemuxedTrack.hh" +#include "FramedFilter.hh" + +OggFileServerMediaSubsession* OggFileServerMediaSubsession +::createNew(OggFileServerDemux& demux, OggTrack* track) { + return new OggFileServerMediaSubsession(demux, track); +} + +OggFileServerMediaSubsession +::OggFileServerMediaSubsession(OggFileServerDemux& demux, OggTrack* track) + : FileServerMediaSubsession(demux.envir(), demux.fileName(), False), + fOurDemux(demux), fTrack(track), fNumFiltersInFrontOfTrack(0) { +} + +OggFileServerMediaSubsession::~OggFileServerMediaSubsession() { +} + +FramedSource* OggFileServerMediaSubsession +::createNewStreamSource(unsigned clientSessionId, unsigned& estBitrate) { + FramedSource* baseSource = fOurDemux.newDemuxedTrack(clientSessionId, fTrack->trackNumber); + if (baseSource == NULL) return NULL; + + return fOurDemux.ourOggFile() + ->createSourceForStreaming(baseSource, fTrack->trackNumber, + estBitrate, fNumFiltersInFrontOfTrack); +} + +RTPSink* OggFileServerMediaSubsession +::createNewRTPSink(Groupsock* rtpGroupsock, unsigned char rtpPayloadTypeIfDynamic, FramedSource* /*inputSource*/) { + return fOurDemux.ourOggFile() + ->createRTPSinkForTrackNumber(fTrack->trackNumber, rtpGroupsock, rtpPayloadTypeIfDynamic); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/OggFileServerMediaSubsession.hh b/src/big/mpp/middleware/src/live555/liveMedia/OggFileServerMediaSubsession.hh new file mode 100644 index 000000000..9f94f5569 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/OggFileServerMediaSubsession.hh @@ -0,0 +1,53 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A 'ServerMediaSubsession' object that creates new, unicast, "RTPSink"s +// on demand, from a track within an Ogg file. +// C++ header + +#ifndef _OGG_FILE_SERVER_MEDIA_SUBSESSION_HH +#define _OGG_FILE_SERVER_MEDIA_SUBSESSION_HH + +#ifndef _FILE_SERVER_MEDIA_SUBSESSION_HH +#include "FileServerMediaSubsession.hh" +#endif +#ifndef _OGG_FILE_SERVER_DEMUX_HH +#include "OggFileServerDemux.hh" +#endif + +class OggFileServerMediaSubsession: public FileServerMediaSubsession { +public: + static OggFileServerMediaSubsession* + createNew(OggFileServerDemux& demux, OggTrack* track); + +protected: + OggFileServerMediaSubsession(OggFileServerDemux& demux, OggTrack* track); + // called only by createNew(), or by subclass constructors + virtual ~OggFileServerMediaSubsession(); + +protected: // redefined virtual functions + virtual FramedSource* createNewStreamSource(unsigned clientSessionId, + unsigned& estBitrate); + virtual RTPSink* createNewRTPSink(Groupsock* rtpGroupsock, unsigned char rtpPayloadTypeIfDynamic, FramedSource* inputSource); + +protected: + OggFileServerDemux& fOurDemux; + OggTrack* fTrack; + unsigned fNumFiltersInFrontOfTrack; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/OggFileSink.cpp b/src/big/mpp/middleware/src/live555/liveMedia/OggFileSink.cpp new file mode 100644 index 000000000..fe01bca52 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/OggFileSink.cpp @@ -0,0 +1,274 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// 'Ogg' File Sink (recording a single media track only) +// Implementation + +#include "OggFileSink.hh" +#include "OutputFile.hh" +#include "VorbisAudioRTPSource.hh" // for "parseVorbisOrTheoraConfigStr()" +#include "MPEG2TransportStreamMultiplexor.hh" // for calculateCRC() +#include "FramedSource.hh" + +OggFileSink* OggFileSink +::createNew(UsageEnvironment& env, char const* fileName, + unsigned samplingFrequency, char const* configStr, + unsigned bufferSize, Boolean oneFilePerFrame) { + do { + FILE* fid; + char const* perFrameFileNamePrefix; + if (oneFilePerFrame) { + // Create the fid for each frame + fid = NULL; + perFrameFileNamePrefix = fileName; + } else { + // Normal case: create the fid once + fid = OpenOutputFile(env, fileName); + if (fid == NULL) break; + perFrameFileNamePrefix = NULL; + } + + return new OggFileSink(env, fid, samplingFrequency, configStr, bufferSize, perFrameFileNamePrefix); + } while (0); + + return NULL; +} + +OggFileSink::OggFileSink(UsageEnvironment& env, FILE* fid, + unsigned samplingFrequency, char const* configStr, + unsigned bufferSize, char const* perFrameFileNamePrefix) + : FileSink(env, fid, bufferSize, perFrameFileNamePrefix), + fSamplingFrequency(samplingFrequency), fConfigStr(strDup(configStr)), + fHaveWrittenFirstFrame(False), fHaveSeenEOF(False), + fGranulePosition(0), fGranulePositionAdjustment(0), fPageSequenceNumber(0), + fIsTheora(False), fGranuleIncrementPerFrame(1), + fAltFrameSize(0), fAltNumTruncatedBytes(0) { + fAltBuffer = new unsigned char[bufferSize]; + + // Initialize our 'Ogg page header' array with constant values: + u_int8_t* p = fPageHeaderBytes; + *p++=0x4f; *p++=0x67; *p++=0x67; *p++=0x53; // bytes 0..3: 'capture_pattern': "OggS" + *p++=0; // byte 4: 'stream_structure_version': 0 + *p++=0; // byte 5: 'header_type_flag': set on each write + *p++=0; *p++=0; *p++=0; *p++=0; *p++=0; *p++=0; *p++=0; *p++=0; + // bytes 6..13: 'granule_position': set on each write + *p++=1; *p++=0; *p++=0; *p++=0; // bytes 14..17: 'bitstream_serial_number': 1 + *p++=0; *p++=0; *p++=0; *p++=0; // bytes 18..21: 'page_sequence_number': set on each write + *p++=0; *p++=0; *p++=0; *p++=0; // bytes 22..25: 'CRC_checksum': set on each write + *p=0; // byte 26: 'number_page_segments': set on each write +} + +OggFileSink::~OggFileSink() { + // We still have the previously-arrived frame, so write it to the file before we end: + fHaveSeenEOF = True; + OggFileSink::addData(fAltBuffer, fAltFrameSize, fAltPresentationTime); + + delete[] fAltBuffer; + delete[] (char*)fConfigStr; +} + +Boolean OggFileSink::continuePlaying() { + // Identical to "FileSink::continuePlaying()", + // except that we use our own 'on source closure' function: + if (fSource == NULL) return False; + + fSource->getNextFrame(fBuffer, fBufferSize, + FileSink::afterGettingFrame, this, + ourOnSourceClosure, this); + return True; +} + +#define PAGE_DATA_MAX_SIZE (255*255) + +void OggFileSink::addData(unsigned char const* data, unsigned dataSize, + struct timeval presentationTime) { + if (dataSize == 0) return; + + // Set "fGranulePosition" for this frame: + if (fIsTheora) { + // Special case for Theora: "fGranulePosition" is supposed to be made up of a pair: + // (frame count to last key frame) | (frame count since last key frame) + // However, because there appears to be no easy way to figure out which frames are key frames, + // we just assume that all frames are key frames. + if (!(data[0] >= 0x80 && data[0] <= 0x82)) { // for header pages, "fGranulePosition" remains 0 + fGranulePosition += fGranuleIncrementPerFrame; + } + } else { + double ptDiff + = (presentationTime.tv_sec - fFirstPresentationTime.tv_sec) + + (presentationTime.tv_usec - fFirstPresentationTime.tv_usec)/1000000.0; + int64_t newGranulePosition + = (int64_t)(fSamplingFrequency*ptDiff) + fGranulePositionAdjustment; + if (newGranulePosition < fGranulePosition) { + // Update "fGranulePositionAdjustment" so that "fGranulePosition" remains monotonic + fGranulePositionAdjustment += fGranulePosition - newGranulePosition; + } else { + fGranulePosition = newGranulePosition; + } + } + + // Write the frame to the file as a single Ogg 'page' (or perhaps as multiple pages + // if it's too big for a single page). We don't aggregate more than one frame within + // an Ogg page because that's not legal for some headers, and because that would make + // it difficult for us to properly set the 'eos' (end of stream) flag on the last page. + + // First, figure out how many pages to write here + // (a page can contain no more than PAGE_DATA_MAX_SIZE bytes) + unsigned numPagesToWrite = dataSize/PAGE_DATA_MAX_SIZE + 1; + // Note that if "dataSize" is a integral multiple of PAGE_DATA_MAX_SIZE, there will + // be an extra 0-size page at the end + for (unsigned i = 0; i < numPagesToWrite; ++i) { + // First, fill in the changeable parts of our 'page header' array; + u_int8_t header_type_flag = 0x0; + if (!fHaveWrittenFirstFrame && i == 0) { + header_type_flag |= 0x02; // 'bos' + fHaveWrittenFirstFrame = True; // for the future + } + if (i > 0) header_type_flag |= 0x01; // 'continuation' + if (fHaveSeenEOF && i == numPagesToWrite-1) header_type_flag |= 0x04; // 'eos' + fPageHeaderBytes[5] = header_type_flag; + + if (i < numPagesToWrite-1) { + // For pages where the frame does not end, set 'granule_position' in the header to -1: + fPageHeaderBytes[6] = fPageHeaderBytes[7] = fPageHeaderBytes[8] = fPageHeaderBytes[9] = + fPageHeaderBytes[10] = fPageHeaderBytes[11] = fPageHeaderBytes[12] = fPageHeaderBytes[13] + = 0xFF; + } else { + fPageHeaderBytes[6] = (u_int8_t)fGranulePosition; + fPageHeaderBytes[7] = (u_int8_t)(fGranulePosition>>8); + fPageHeaderBytes[8] = (u_int8_t)(fGranulePosition>>16); + fPageHeaderBytes[9] = (u_int8_t)(fGranulePosition>>24); + fPageHeaderBytes[10] = (u_int8_t)(fGranulePosition>>32); + fPageHeaderBytes[11] = (u_int8_t)(fGranulePosition>>40); + fPageHeaderBytes[12] = (u_int8_t)(fGranulePosition>>48); + fPageHeaderBytes[13] = (u_int8_t)(fGranulePosition>>56); + } + + fPageHeaderBytes[18] = (u_int8_t)fPageSequenceNumber; + fPageHeaderBytes[19] = (u_int8_t)(fPageSequenceNumber>>8); + fPageHeaderBytes[20] = (u_int8_t)(fPageSequenceNumber>>16); + fPageHeaderBytes[21] = (u_int8_t)(fPageSequenceNumber>>24); + ++fPageSequenceNumber; + + unsigned pageDataSize; + u_int8_t number_page_segments; + if (dataSize >= PAGE_DATA_MAX_SIZE) { + pageDataSize = PAGE_DATA_MAX_SIZE; + number_page_segments = 255; + } else { + pageDataSize = dataSize; + number_page_segments = (pageDataSize+255)/255; // so that we don't end with a lacing of 255 + } + fPageHeaderBytes[26] = number_page_segments; + + u_int8_t segment_table[255]; + for (unsigned j = 0; j < (unsigned)(number_page_segments-1); ++j) { + segment_table[j] = 255; + } + segment_table[number_page_segments-1] = pageDataSize%255; + + // Compute the CRC from the 'page header' array, the 'segment_table', and the frame data: + u_int32_t crc = 0; + fPageHeaderBytes[22] = fPageHeaderBytes[23] = fPageHeaderBytes[24] = fPageHeaderBytes[25] = 0; + crc = calculateCRC(fPageHeaderBytes, 27, 0); + crc = calculateCRC(segment_table, number_page_segments, crc); + crc = calculateCRC(data, pageDataSize, crc); + fPageHeaderBytes[22] = (u_int8_t)crc; + fPageHeaderBytes[23] = (u_int8_t)(crc>>8); + fPageHeaderBytes[24] = (u_int8_t)(crc>>16); + fPageHeaderBytes[25] = (u_int8_t)(crc>>24); + + // Then write out the 'page header' array: + FileSink::addData(fPageHeaderBytes, 27, presentationTime); + + // Then write out the 'segment_table': + FileSink::addData(segment_table, number_page_segments, presentationTime); + + // Then add frame data, to complete the page: + FileSink::addData(data, pageDataSize, presentationTime); + data += pageDataSize; + dataSize -= pageDataSize; + } +} + +void OggFileSink::afterGettingFrame(unsigned frameSize, unsigned numTruncatedBytes, struct timeval presentationTime) { + if (!fHaveWrittenFirstFrame) { + fFirstPresentationTime = presentationTime; + + // If we have a 'config string' representing 'packed configuration headers' + // ("identification", "comment", "setup"), unpack them and prepend them to the file: + if (fConfigStr != NULL && fConfigStr[0] != '\0') { + u_int8_t* identificationHdr; unsigned identificationHdrSize; + u_int8_t* commentHdr; unsigned commentHdrSize; + u_int8_t* setupHdr; unsigned setupHdrSize; + u_int32_t identField; + parseVorbisOrTheoraConfigStr(fConfigStr, + identificationHdr, identificationHdrSize, + commentHdr, commentHdrSize, + setupHdr, setupHdrSize, + identField); + if (identificationHdrSize >= 42 + && strncmp((const char*)&identificationHdr[1], "theora", 6) == 0) { + // Hack for Theora video: Parse the "identification" hdr to get the "KFGSHIFT" parameter: + fIsTheora = True; + u_int8_t const KFGSHIFT = ((identificationHdr[40]&3)<<3) | (identificationHdr[41]>>5); + fGranuleIncrementPerFrame = (u_int64_t)(1 << KFGSHIFT); + } + OggFileSink::addData(identificationHdr, identificationHdrSize, presentationTime); + OggFileSink::addData(commentHdr, commentHdrSize, presentationTime); + + // Hack: Handle the "setup" header as if had arrived in the previous delivery, so it'll get + // written properly below: + if (setupHdrSize > fBufferSize) { + fAltFrameSize = fBufferSize; + fAltNumTruncatedBytes = setupHdrSize - fBufferSize; + } else { + fAltFrameSize = setupHdrSize; + fAltNumTruncatedBytes = 0; + } + memmove(fAltBuffer, setupHdr, fAltFrameSize); + fAltPresentationTime = presentationTime; + + delete[] identificationHdr; + delete[] commentHdr; + delete[] setupHdr; + } + } + + // Save this input frame for next time, and instead write the previous input frame now: + unsigned char* tmpPtr = fBuffer; fBuffer = fAltBuffer; fAltBuffer = tmpPtr; + unsigned prevFrameSize = fAltFrameSize; fAltFrameSize = frameSize; + unsigned prevNumTruncatedBytes = fAltNumTruncatedBytes; fAltNumTruncatedBytes = numTruncatedBytes; + struct timeval prevPresentationTime = fAltPresentationTime; fAltPresentationTime = presentationTime; + + // Call the parent class to complete the normal file write with the (previous) input frame: + FileSink::afterGettingFrame(prevFrameSize, prevNumTruncatedBytes, prevPresentationTime); +} + +void OggFileSink::ourOnSourceClosure(void* clientData) { + ((OggFileSink*)clientData)->ourOnSourceClosure(); +} + +void OggFileSink::ourOnSourceClosure() { + fHaveSeenEOF = True; + + // We still have the previously-arrived frame, so write it to the file before we end: + OggFileSink::addData(fAltBuffer, fAltFrameSize, fAltPresentationTime); + + // Handle the closure for real: + onSourceClosure(); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/OnDemandServerMediaSubsession.cpp b/src/big/mpp/middleware/src/live555/liveMedia/OnDemandServerMediaSubsession.cpp new file mode 100644 index 000000000..2288498e9 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/OnDemandServerMediaSubsession.cpp @@ -0,0 +1,649 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A 'ServerMediaSubsession' object that creates new, unicast, "RTPSink"s +// on demand. +// Implementation + +#include "OnDemandServerMediaSubsession.hh" +#include + +OnDemandServerMediaSubsession +::OnDemandServerMediaSubsession(UsageEnvironment& env, + Boolean reuseFirstSource, + portNumBits initialPortNum, + Boolean multiplexRTCPWithRTP) + : ServerMediaSubsession(env), + fSDPLines(NULL), fMIKEYStateMessage(NULL), fMIKEYStateMessageSize(0), + fReuseFirstSource(reuseFirstSource), + fMultiplexRTCPWithRTP(multiplexRTCPWithRTP), fLastStreamToken(NULL), + fAppHandlerTask(NULL), fAppHandlerClientData(NULL) { + fDestinationsHashTable = HashTable::create(ONE_WORD_HASH_KEYS); + if (fMultiplexRTCPWithRTP) { + fInitialPortNum = initialPortNum; + } else { + // Make sure RTP ports are even-numbered: + fInitialPortNum = (initialPortNum+1)&~1; + } + gethostname(fCNAME, sizeof fCNAME); + fCNAME[sizeof fCNAME-1] = '\0'; // just in case +} + +OnDemandServerMediaSubsession::~OnDemandServerMediaSubsession() { + delete[] fMIKEYStateMessage; + delete[] fSDPLines; + + // Clean out the destinations hash table: + while (1) { + Destinations* destinations + = (Destinations*)(fDestinationsHashTable->RemoveNext()); + if (destinations == NULL) break; + delete destinations; + } + delete fDestinationsHashTable; +} + +char const* +OnDemandServerMediaSubsession::sdpLines(int addressFamily) { + if (fSDPLines == NULL) { + // We need to construct a set of SDP lines that describe this + // subsession (as a unicast stream). To do so, we first create + // dummy (unused) source and "RTPSink" objects, + // whose parameters we use for the SDP lines: + unsigned estBitrate; + FramedSource* inputSource = createNewStreamSource(0, estBitrate); + if (inputSource == NULL) return NULL; // file not found + + Groupsock* dummyGroupsock = createGroupsock(nullAddress(addressFamily), 0); + unsigned char rtpPayloadType = 96 + trackNumber()-1; // if dynamic + RTPSink* dummyRTPSink = createNewRTPSink(dummyGroupsock, rtpPayloadType, inputSource); + if (dummyRTPSink != NULL) { + if (fParentSession->streamingUsesSRTP) { + fMIKEYStateMessage = dummyRTPSink->setupForSRTP(fParentSession->streamingIsEncrypted, + fMIKEYStateMessageSize); + } + + if (dummyRTPSink->estimatedBitrate() > 0) estBitrate = dummyRTPSink->estimatedBitrate(); + setSDPLinesFromRTPSink(dummyRTPSink, inputSource, estBitrate); + Medium::close(dummyRTPSink); + } + delete dummyGroupsock; + closeStreamSource(inputSource); + } + + return fSDPLines; +} + +void OnDemandServerMediaSubsession +::getStreamParameters(unsigned clientSessionId, + struct sockaddr_storage const& clientAddress, + Port const& clientRTPPort, + Port const& clientRTCPPort, + int tcpSocketNum, + unsigned char rtpChannelId, + unsigned char rtcpChannelId, + TLSState* tlsState, + struct sockaddr_storage& destinationAddress, + u_int8_t& /*destinationTTL*/, + Boolean& isMulticast, + Port& serverRTPPort, + Port& serverRTCPPort, + void*& streamToken) { + if (addressIsNull(destinationAddress)) { + // normal case - use the client address as the destination address: + destinationAddress = clientAddress; + } + isMulticast = False; + + if (fLastStreamToken != NULL && fReuseFirstSource) { + // Special case: Rather than creating a new 'StreamState', + // we reuse the one that we've already created: + serverRTPPort = ((StreamState*)fLastStreamToken)->serverRTPPort(); + serverRTCPPort = ((StreamState*)fLastStreamToken)->serverRTCPPort(); + ++((StreamState*)fLastStreamToken)->referenceCount(); + streamToken = fLastStreamToken; + } else { + // Normal case: Create a new media source: + unsigned streamBitrate; + FramedSource* mediaSource + = createNewStreamSource(clientSessionId, streamBitrate); + + // Create 'groupsock' and 'sink' objects for the destination, + // using previously unused server port numbers: + RTPSink* rtpSink = NULL; + BasicUDPSink* udpSink = NULL; + Groupsock* rtpGroupsock = NULL; + Groupsock* rtcpGroupsock = NULL; + + if (clientRTPPort.num() != 0 || tcpSocketNum >= 0) { // Normal case: Create destinations + portNumBits serverPortNum; + if (clientRTCPPort.num() == 0) { + // We're streaming raw UDP (not RTP). Create a single groupsock: + NoReuse dummy(envir()); // ensures that we skip over ports that are already in use + for (serverPortNum = fInitialPortNum; ; ++serverPortNum) { + serverRTPPort = serverPortNum; + rtpGroupsock = createGroupsock(nullAddress(destinationAddress.ss_family), serverRTPPort); + if (rtpGroupsock->socketNum() >= 0) break; // success + } + + udpSink = BasicUDPSink::createNew(envir(), rtpGroupsock); + } else { + // Normal case: We're streaming RTP (over UDP or TCP). Create a pair of + // groupsocks (RTP and RTCP), with adjacent port numbers (RTP port number even). + // (If we're multiplexing RTCP and RTP over the same port number, it can be odd or even.) + NoReuse dummy(envir()); // ensures that we skip over ports that are already in use + for (portNumBits serverPortNum = fInitialPortNum; ; ++serverPortNum) { + serverRTPPort = serverPortNum; + rtpGroupsock = createGroupsock(nullAddress(destinationAddress.ss_family), serverRTPPort); + if (rtpGroupsock->socketNum() < 0) { + delete rtpGroupsock; + continue; // try again + } + + if (fMultiplexRTCPWithRTP) { + // Use the RTP 'groupsock' object for RTCP as well: + serverRTCPPort = serverRTPPort; + rtcpGroupsock = rtpGroupsock; + } else { + // Create a separate 'groupsock' object (with the next (odd) port number) for RTCP: + serverRTCPPort = ++serverPortNum; + rtcpGroupsock = createGroupsock(nullAddress(destinationAddress.ss_family), serverRTCPPort); + if (rtcpGroupsock->socketNum() < 0) { + delete rtpGroupsock; + delete rtcpGroupsock; + continue; // try again + } + } + + break; // success + } + + unsigned char rtpPayloadType = 96 + trackNumber()-1; // if dynamic + rtpSink = mediaSource == NULL ? NULL + : createNewRTPSink(rtpGroupsock, rtpPayloadType, mediaSource); + if (rtpSink != NULL) { + if (fParentSession->streamingUsesSRTP) { + rtpSink->setupForSRTP(fMIKEYStateMessage, fMIKEYStateMessageSize); + } + if (rtpSink->estimatedBitrate() > 0) streamBitrate = rtpSink->estimatedBitrate(); + } + } + + // Turn off the destinations for each groupsock. They'll get set later + // (unless TCP is used instead): + if (rtpGroupsock != NULL) rtpGroupsock->removeAllDestinations(); + if (rtcpGroupsock != NULL) rtcpGroupsock->removeAllDestinations(); + + if (rtpGroupsock != NULL) { + // Try to use a big send buffer for RTP - at least 0.1 second of + // specified bandwidth and at least 50 KB + unsigned rtpBufSize = streamBitrate * 25 / 2; // 1 kbps * 0.1 s = 12.5 bytes + if (rtpBufSize < 50 * 1024) rtpBufSize = 50 * 1024; + increaseSendBufferTo(envir(), rtpGroupsock->socketNum(), rtpBufSize); + } + } + + // Set up the state of the stream. The stream will get started later: + streamToken = fLastStreamToken + = new StreamState(*this, serverRTPPort, serverRTCPPort, rtpSink, udpSink, + streamBitrate, mediaSource, + rtpGroupsock, rtcpGroupsock); + } + + // Record these destinations as being for this client session id: + Destinations* destinations; + if (tcpSocketNum < 0) { // UDP + destinations = new Destinations(destinationAddress, clientRTPPort, clientRTCPPort); + } else { // TCP + destinations = new Destinations(tcpSocketNum, rtpChannelId, rtcpChannelId, tlsState); + } + fDestinationsHashTable->Add((char const*)clientSessionId, destinations); +} + +void OnDemandServerMediaSubsession::startStream(unsigned clientSessionId, + void* streamToken, + TaskFunc* rtcpRRHandler, + void* rtcpRRHandlerClientData, + unsigned short& rtpSeqNum, + unsigned& rtpTimestamp, + ServerRequestAlternativeByteHandler* serverRequestAlternativeByteHandler, + void* serverRequestAlternativeByteHandlerClientData) { + StreamState* streamState = (StreamState*)streamToken; + Destinations* destinations + = (Destinations*)(fDestinationsHashTable->Lookup((char const*)clientSessionId)); + if (streamState != NULL) { + streamState->startPlaying(destinations, clientSessionId, + rtcpRRHandler, rtcpRRHandlerClientData, + serverRequestAlternativeByteHandler, serverRequestAlternativeByteHandlerClientData); + RTPSink* rtpSink = streamState->rtpSink(); // alias + if (rtpSink != NULL) { + rtpSeqNum = rtpSink->currentSeqNo(); + rtpTimestamp = rtpSink->presetNextTimestamp(); + } + } +} + +void OnDemandServerMediaSubsession::pauseStream(unsigned /*clientSessionId*/, + void* streamToken) { + // Pausing isn't allowed if multiple clients are receiving data from + // the same source: + if (fReuseFirstSource) return; + + StreamState* streamState = (StreamState*)streamToken; + if (streamState != NULL) streamState->pause(); +} + +void OnDemandServerMediaSubsession::seekStream(unsigned /*clientSessionId*/, + void* streamToken, double& seekNPT, double streamDuration, u_int64_t& numBytes) { + numBytes = 0; // by default: unknown + + // Seeking isn't allowed if multiple clients are receiving data from the same source: + if (fReuseFirstSource) return; + + StreamState* streamState = (StreamState*)streamToken; + if (streamState != NULL && streamState->mediaSource() != NULL) { + seekStreamSource(streamState->mediaSource(), seekNPT, streamDuration, numBytes); + + streamState->startNPT() = (float)seekNPT; + RTPSink* rtpSink = streamState->rtpSink(); // alias + if (rtpSink != NULL) rtpSink->resetPresentationTimes(); + } +} + +void OnDemandServerMediaSubsession::seekStream(unsigned /*clientSessionId*/, + void* streamToken, char*& absStart, char*& absEnd) { + // Seeking isn't allowed if multiple clients are receiving data from the same source: + if (fReuseFirstSource) return; + + StreamState* streamState = (StreamState*)streamToken; + if (streamState != NULL && streamState->mediaSource() != NULL) { + seekStreamSource(streamState->mediaSource(), absStart, absEnd); + } +} + +void OnDemandServerMediaSubsession::nullSeekStream(unsigned /*clientSessionId*/, void* streamToken, + double streamEndTime, u_int64_t& numBytes) { + numBytes = 0; // by default: unknown + + StreamState* streamState = (StreamState*)streamToken; + if (streamState != NULL && streamState->mediaSource() != NULL) { + // Because we're not seeking here, get the current NPT, and remember it as the new 'start' NPT: + streamState->startNPT() = getCurrentNPT(streamToken); + + double duration = streamEndTime - streamState->startNPT(); + if (duration < 0.0) duration = 0.0; + setStreamSourceDuration(streamState->mediaSource(), duration, numBytes); + + RTPSink* rtpSink = streamState->rtpSink(); // alias + if (rtpSink != NULL) rtpSink->resetPresentationTimes(); + } +} + +void OnDemandServerMediaSubsession::setStreamScale(unsigned /*clientSessionId*/, + void* streamToken, float scale) { + // Changing the scale factor isn't allowed if multiple clients are receiving data + // from the same source: + if (fReuseFirstSource) return; + + StreamState* streamState = (StreamState*)streamToken; + if (streamState != NULL && streamState->mediaSource() != NULL) { + setStreamSourceScale(streamState->mediaSource(), scale); + } +} + +float OnDemandServerMediaSubsession::getCurrentNPT(void* streamToken) { + do { + if (streamToken == NULL) break; + + StreamState* streamState = (StreamState*)streamToken; + RTPSink* rtpSink = streamState->rtpSink(); + if (rtpSink == NULL) break; + + return streamState->startNPT() + + (rtpSink->mostRecentPresentationTime().tv_sec - rtpSink->initialPresentationTime().tv_sec) + + (rtpSink->mostRecentPresentationTime().tv_usec - rtpSink->initialPresentationTime().tv_usec)/1000000.0f; + } while (0); + + return 0.0; +} + +FramedSource* OnDemandServerMediaSubsession::getStreamSource(void* streamToken) { + if (streamToken == NULL) return NULL; + + StreamState* streamState = (StreamState*)streamToken; + return streamState->mediaSource(); +} + +void OnDemandServerMediaSubsession +::getRTPSinkandRTCP(void* streamToken, + RTPSink const*& rtpSink, RTCPInstance const*& rtcp) { + if (streamToken == NULL) { + rtpSink = NULL; + rtcp = NULL; + return; + } + + StreamState* streamState = (StreamState*)streamToken; + rtpSink = streamState->rtpSink(); + rtcp = streamState->rtcpInstance(); +} + +void OnDemandServerMediaSubsession::deleteStream(unsigned clientSessionId, + void*& streamToken) { + StreamState* streamState = (StreamState*)streamToken; + + // Look up (and remove) the destinations for this client session: + Destinations* destinations + = (Destinations*)(fDestinationsHashTable->Lookup((char const*)clientSessionId)); + if (destinations != NULL) { + fDestinationsHashTable->Remove((char const*)clientSessionId); + + // Stop streaming to these destinations: + if (streamState != NULL) streamState->endPlaying(destinations, clientSessionId); + } + + // Delete the "StreamState" structure if it's no longer being used: + if (streamState != NULL) { + if (streamState->referenceCount() > 0) --streamState->referenceCount(); + if (streamState->referenceCount() == 0) { + delete streamState; + streamToken = NULL; + } + } + + // Finally, delete the destinations themselves: + delete destinations; +} + +char const* OnDemandServerMediaSubsession +::getAuxSDPLine(RTPSink* rtpSink, FramedSource* /*inputSource*/) { + // Default implementation: + return rtpSink == NULL ? NULL : rtpSink->auxSDPLine(); +} + +void OnDemandServerMediaSubsession::seekStreamSource(FramedSource* /*inputSource*/, + double& /*seekNPT*/, double /*streamDuration*/, u_int64_t& numBytes) { + // Default implementation: Do nothing + numBytes = 0; +} + +void OnDemandServerMediaSubsession::seekStreamSource(FramedSource* /*inputSource*/, + char*& absStart, char*& absEnd) { + // Default implementation: do nothing (but delete[] and assign "absStart" and "absEnd" to NULL, to show that we don't handle this) + delete[] absStart; absStart = NULL; + delete[] absEnd; absEnd = NULL; +} + +void OnDemandServerMediaSubsession +::setStreamSourceScale(FramedSource* /*inputSource*/, float /*scale*/) { + // Default implementation: Do nothing +} + +void OnDemandServerMediaSubsession +::setStreamSourceDuration(FramedSource* /*inputSource*/, double /*streamDuration*/, u_int64_t& numBytes) { + // Default implementation: Do nothing + numBytes = 0; +} + +void OnDemandServerMediaSubsession::closeStreamSource(FramedSource *inputSource) { + Medium::close(inputSource); +} + +Groupsock* OnDemandServerMediaSubsession +::createGroupsock(struct sockaddr_storage const& addr, Port port) { + // Default implementation; may be redefined by subclasses: + return new Groupsock(envir(), addr, port, 255); +} + +RTCPInstance* OnDemandServerMediaSubsession +::createRTCP(Groupsock* RTCPgs, unsigned totSessionBW, /* in kbps */ + unsigned char const* cname, RTPSink* sink) { + // Default implementation; may be redefined by subclasses: + return RTCPInstance::createNew(envir(), RTCPgs, totSessionBW, cname, sink, NULL/*we're a server*/); +} + +void OnDemandServerMediaSubsession +::setRTCPAppPacketHandler(RTCPAppHandlerFunc* handler, void* clientData) { + fAppHandlerTask = handler; + fAppHandlerClientData = clientData; +} + +void OnDemandServerMediaSubsession +::sendRTCPAppPacket(u_int8_t subtype, char const* name, + u_int8_t* appDependentData, unsigned appDependentDataSize) { + StreamState* streamState = (StreamState*)fLastStreamToken; + if (streamState != NULL) { + streamState->sendRTCPAppPacket(subtype, name, appDependentData, appDependentDataSize); + } +} + +void OnDemandServerMediaSubsession +::setSDPLinesFromRTPSink(RTPSink* rtpSink, FramedSource* inputSource, unsigned estBitrate) { + char const* mediaType = rtpSink->sdpMediaType(); + unsigned char rtpPayloadType = rtpSink->rtpPayloadType(); + struct sockaddr_storage const& addressForSDP = rtpSink->groupsockBeingUsed().groupAddress(); + portNumBits portNumForSDP = ntohs(rtpSink->groupsockBeingUsed().port().num()); + + AddressString ipAddressStr(addressForSDP); + char* rtpmapLine = rtpSink->rtpmapLine(); + char* keyMgmtLine = rtpSink->keyMgmtLine(); + char const* rtcpmuxLine = fMultiplexRTCPWithRTP ? "a=rtcp-mux\r\n" : ""; + char const* rangeLine = rangeSDPLine(); + char const* auxSDPLine = getAuxSDPLine(rtpSink, inputSource); + if (auxSDPLine == NULL) auxSDPLine = ""; + + char const* const sdpFmt = + "m=%s %u RTP/%sAVP %d\r\n" + "c=IN %s %s\r\n" + "b=AS:%u\r\n" + "%s" + "%s" + "%s" + "%s" + "%s" + "a=control:%s\r\n"; + unsigned sdpFmtSize = strlen(sdpFmt) + + strlen(mediaType) + 5 /* max short len */ + 1 + 3 /* max char len */ + + 3/*IP4 or IP6*/ + strlen(ipAddressStr.val()) + + 20 /* max int len */ + + strlen(rtpmapLine) + + strlen(keyMgmtLine) + + strlen(rtcpmuxLine) + + strlen(rangeLine) + + strlen(auxSDPLine) + + strlen(trackId()); + char* sdpLines = new char[sdpFmtSize]; + sprintf(sdpLines, sdpFmt, + mediaType, // m= + portNumForSDP, // m= + fParentSession->streamingUsesSRTP ? "S" : "", + rtpPayloadType, // m= + addressForSDP.ss_family == AF_INET ? "IP4" : "IP6", ipAddressStr.val(), // c= address + estBitrate, // b=AS: + rtpmapLine, // a=rtpmap:... (if present) + keyMgmtLine, // a=key-mgmt:... (if present) + rtcpmuxLine, // a=rtcp-mux:... (if present) + rangeLine, // a=range:... (if present) + auxSDPLine, // optional extra SDP line + trackId()); // a=control: + delete[] (char*)rangeLine; delete[] keyMgmtLine; delete[] rtpmapLine; + + delete[] fSDPLines; fSDPLines = strDup(sdpLines); + delete[] sdpLines; +} + + +////////// StreamState implementation ////////// + +static void afterPlayingStreamState(void* clientData) { + StreamState* streamState = (StreamState*)clientData; + if (streamState->streamDuration() == 0.0) { + // When the input stream ends, tear it down. This will cause a RTCP "BYE" + // to be sent to each client, teling it that the stream has ended. + // (Because the stream didn't have a known duration, there was no other + // way for clients to know when the stream ended.) + streamState->reclaim(); + } + // Otherwise, keep the stream alive, in case a client wants to + // subsequently re-play the stream starting from somewhere other than the end. + // (This can be done only on streams that have a known duration.) +} + +StreamState::StreamState(OnDemandServerMediaSubsession& master, + Port const& serverRTPPort, Port const& serverRTCPPort, + RTPSink* rtpSink, BasicUDPSink* udpSink, + unsigned totalBW, FramedSource* mediaSource, + Groupsock* rtpGS, Groupsock* rtcpGS) + : fMaster(master), fAreCurrentlyPlaying(False), fReferenceCount(1), + fServerRTPPort(serverRTPPort), fServerRTCPPort(serverRTCPPort), + fRTPSink(rtpSink), fUDPSink(udpSink), fStreamDuration(master.duration()), + fTotalBW(totalBW), fRTCPInstance(NULL) /* created later */, + fMediaSource(mediaSource), fStartNPT(0.0), fRTPgs(rtpGS), fRTCPgs(rtcpGS) { +} + +StreamState::~StreamState() { + reclaim(); +} + +void StreamState +::startPlaying(Destinations* dests, unsigned clientSessionId, + TaskFunc* rtcpRRHandler, void* rtcpRRHandlerClientData, + ServerRequestAlternativeByteHandler* serverRequestAlternativeByteHandler, + void* serverRequestAlternativeByteHandlerClientData) { + if (dests == NULL) return; + + if (fRTCPInstance == NULL && fRTPSink != NULL) { + // Create (and start) a 'RTCP instance' for this RTP sink: + fRTCPInstance = fMaster.createRTCP(fRTCPgs, fTotalBW, (unsigned char*)fMaster.fCNAME, fRTPSink); + // Note: This starts RTCP running automatically + if (fRTCPInstance != NULL) fRTCPInstance->setAppHandler(fMaster.fAppHandlerTask, fMaster.fAppHandlerClientData); + } + + if (dests->isTCP) { + // Change RTP and RTCP to use the TCP socket instead of UDP: + if (fRTPSink != NULL) { + fRTPSink->addStreamSocket(dests->tcpSocketNum, dests->rtpChannelId, dests->tlsState); + RTPInterface + ::setServerRequestAlternativeByteHandler(fRTPSink->envir(), dests->tcpSocketNum, + serverRequestAlternativeByteHandler, serverRequestAlternativeByteHandlerClientData); + // So that we continue to handle RTSP commands from the client + } + if (fRTCPInstance != NULL) { + fRTCPInstance->addStreamSocket(dests->tcpSocketNum, dests->rtcpChannelId, dests->tlsState); + + struct sockaddr_storage tcpSocketNumAsAddress; // hack + tcpSocketNumAsAddress.ss_family = AF_INET; + ((sockaddr_in&)tcpSocketNumAsAddress).sin_addr.s_addr = dests->tcpSocketNum; + fRTCPInstance->setSpecificRRHandler(tcpSocketNumAsAddress, dests->rtcpChannelId, + rtcpRRHandler, rtcpRRHandlerClientData); + } + } else { + // Tell the RTP and RTCP 'groupsocks' about this destination + // (in case they don't already have it): + if (fRTPgs != NULL) fRTPgs->addDestination(dests->addr, dests->rtpPort, clientSessionId); + if (fRTCPgs != NULL && !(fRTCPgs == fRTPgs && dests->rtcpPort.num() == dests->rtpPort.num())) { + fRTCPgs->addDestination(dests->addr, dests->rtcpPort, clientSessionId); + } + if (fRTCPInstance != NULL) { + fRTCPInstance->setSpecificRRHandler(dests->addr, dests->rtcpPort, + rtcpRRHandler, rtcpRRHandlerClientData); + } + } + + if (fRTCPInstance != NULL) { + // Hack: Send an initial RTCP "SR" packet, before the initial RTP packet, so that receivers will (likely) be able to + // get RTCP-synchronized presentation times immediately: + fRTCPInstance->sendReport(); + } + + if (!fAreCurrentlyPlaying && fMediaSource != NULL) { + if (fRTPSink != NULL) { + fRTPSink->startPlaying(*fMediaSource, afterPlayingStreamState, this); + fAreCurrentlyPlaying = True; + } else if (fUDPSink != NULL) { + fUDPSink->startPlaying(*fMediaSource, afterPlayingStreamState, this); + fAreCurrentlyPlaying = True; + } + } +} + +void StreamState::pause() { + if (fRTPSink != NULL) fRTPSink->stopPlaying(); + if (fUDPSink != NULL) fUDPSink->stopPlaying(); + if (fMediaSource != NULL) fMediaSource->stopGettingFrames(); + fAreCurrentlyPlaying = False; +} + +void StreamState::endPlaying(Destinations* dests, unsigned clientSessionId) { +#if 0 + // The following code is temporarily disabled, because it erroneously sends RTCP "BYE"s to all clients if multiple + // clients are streaming from the same data source (i.e., if "reuseFirstSource" is True), and we don't want that to happen + // if we're being called as a result of a single one of these clients having sent a "TEARDOWN" (rather than the whole stream + // having been closed, for all clients). + // This will be fixed for real later. + if (fRTCPInstance != NULL) { + // Hack: Explicitly send a RTCP "BYE" packet now, because the code below will prevent that from happening later, + // when "fRTCPInstance" gets deleted: + fRTCPInstance->sendBYE(); + } +#endif + + if (dests->isTCP) { + if (fRTPSink != NULL) { + // Comment out the following, because it prevents the "RTSPClientConnection" object + // from being closed after handling a "TEARDOWN": ##### + //RTPInterface::clearServerRequestAlternativeByteHandler(fRTPSink->envir(), dests->tcpSocketNum); + fRTPSink->removeStreamSocket(dests->tcpSocketNum, dests->rtpChannelId); + } + if (fRTCPInstance != NULL) { + fRTCPInstance->removeStreamSocket(dests->tcpSocketNum, dests->rtcpChannelId); + + struct sockaddr_storage tcpSocketNumAsAddress; // hack + tcpSocketNumAsAddress.ss_family = AF_INET; + ((sockaddr_in&)tcpSocketNumAsAddress).sin_addr.s_addr = dests->tcpSocketNum; + fRTCPInstance->unsetSpecificRRHandler(tcpSocketNumAsAddress, dests->rtcpChannelId); + } + } else { + // Tell the RTP and RTCP 'groupsocks' to stop using these destinations: + if (fRTPgs != NULL) fRTPgs->removeDestination(clientSessionId); + if (fRTCPgs != NULL && fRTCPgs != fRTPgs) fRTCPgs->removeDestination(clientSessionId); + if (fRTCPInstance != NULL) { + fRTCPInstance->unsetSpecificRRHandler(dests->addr, dests->rtcpPort); + } + } +} + +void StreamState::sendRTCPAppPacket(u_int8_t subtype, char const* name, + u_int8_t* appDependentData, unsigned appDependentDataSize) { + if (fRTCPInstance != NULL) { + fRTCPInstance->sendAppPacket(subtype, name, appDependentData, appDependentDataSize); + } +} + +void StreamState::reclaim() { + // Delete allocated media objects + Medium::close(fRTCPInstance) /* will send a RTCP BYE */; fRTCPInstance = NULL; + Medium::close(fRTPSink); fRTPSink = NULL; + Medium::close(fUDPSink); fUDPSink = NULL; + + fMaster.closeStreamSource(fMediaSource); fMediaSource = NULL; + if (fMaster.fLastStreamToken == this) fMaster.fLastStreamToken = NULL; + + delete fRTPgs; + if (fRTCPgs != fRTPgs) delete fRTCPgs; + fRTPgs = NULL; fRTCPgs = NULL; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/OutputFile.cpp b/src/big/mpp/middleware/src/live555/liveMedia/OutputFile.cpp new file mode 100644 index 000000000..5c30282e1 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/OutputFile.cpp @@ -0,0 +1,60 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Common routines for opening/closing named output files +// Implementation + +#if (defined(__WIN32__) || defined(_WIN32)) && !defined(_WIN32_WCE) +#include +#include +#endif +#ifndef _WIN32_WCE +#include +#endif +#include + +#include "OutputFile.hh" + +FILE* OpenOutputFile(UsageEnvironment& env, char const* fileName) { + FILE* fid; + + // Check for special case 'file names': "stdout" and "stderr" + if (strcmp(fileName, "stdout") == 0) { + fid = stdout; +#if (defined(__WIN32__) || defined(_WIN32)) && !defined(_WIN32_WCE) + _setmode(_fileno(stdout), _O_BINARY); // convert to binary mode +#endif + } else if (strcmp(fileName, "stderr") == 0) { + fid = stderr; +#if (defined(__WIN32__) || defined(_WIN32)) && !defined(_WIN32_WCE) + _setmode(_fileno(stderr), _O_BINARY); // convert to binary mode +#endif + } else { + fid = fopen(fileName, "wb"); + } + + if (fid == NULL) { + env.setResultMsg("unable to open file \"", fileName, "\""); + } + + return fid; +} + +void CloseOutputFile(FILE* fid) { + // Don't close 'stdout' or 'stderr', in case we want to use it again later. + if (fid != NULL && fid != stdout && fid != stderr) fclose(fid); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/PassiveServerMediaSubsession.cpp b/src/big/mpp/middleware/src/live555/liveMedia/PassiveServerMediaSubsession.cpp new file mode 100644 index 000000000..8d443026e --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/PassiveServerMediaSubsession.cpp @@ -0,0 +1,241 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A 'ServerMediaSubsession' object that represents an existing +// 'RTPSink', rather than one that creates new 'RTPSink's on demand. +// Implementation + +#include "PassiveServerMediaSubsession.hh" +#include + +////////// PassiveServerMediaSubsession ////////// + +PassiveServerMediaSubsession* +PassiveServerMediaSubsession::createNew(RTPSink& rtpSink, + RTCPInstance* rtcpInstance) { + return new PassiveServerMediaSubsession(rtpSink, rtcpInstance); +} + +PassiveServerMediaSubsession +::PassiveServerMediaSubsession(RTPSink& rtpSink, RTCPInstance* rtcpInstance) + : ServerMediaSubsession(rtpSink.envir()), + fSDPLines(NULL), fRTPSink(rtpSink), fRTCPInstance(rtcpInstance) { + fClientRTCPSourceRecords = HashTable::create(ONE_WORD_HASH_KEYS); +} + +class RTCPSourceRecord { +public: + RTCPSourceRecord(struct sockaddr_storage const& addr, Port const& port) + : addr(addr), port(port) { + } + + struct sockaddr_storage addr; + Port port; +}; + +PassiveServerMediaSubsession::~PassiveServerMediaSubsession() { + delete[] fSDPLines; + + // Clean out the RTCPSourceRecord table: + while (1) { + RTCPSourceRecord* source = (RTCPSourceRecord*)(fClientRTCPSourceRecords->RemoveNext()); + if (source == NULL) break; + delete source; + } + + delete fClientRTCPSourceRecords; +} + +Boolean PassiveServerMediaSubsession::rtcpIsMuxed() { + if (fRTCPInstance == NULL) return False; + + // Check whether RTP and RTCP use the same "groupsock" object: + return &(fRTPSink.groupsockBeingUsed()) == fRTCPInstance->RTCPgs(); +} + +char const* +PassiveServerMediaSubsession::sdpLines(int /*addressFamily*/) { + if (fSDPLines == NULL ) { + // Construct a set of SDP lines that describe this subsession: + // Use the components from "rtpSink". + if (fParentSession->streamingUsesSRTP) { // Hack to set up for SRTP/SRTCP + fRTPSink.setupForSRTP(fParentSession->streamingIsEncrypted); + if (fRTCPInstance != NULL) fRTCPInstance->setupForSRTCP(); + } + + Groupsock const& gs = fRTPSink.groupsockBeingUsed(); + AddressString groupAddressStr(gs.groupAddress()); + unsigned short portNum = ntohs(gs.port().num()); + unsigned char ttl = gs.ttl(); + unsigned char rtpPayloadType = fRTPSink.rtpPayloadType(); + char const* mediaType = fRTPSink.sdpMediaType(); + unsigned estBitrate + = fRTCPInstance == NULL ? 50 : fRTCPInstance->totSessionBW(); + char* rtpmapLine = fRTPSink.rtpmapLine(); + char* keyMgmtLine = fRTPSink.keyMgmtLine(); + char const* rtcpmuxLine = rtcpIsMuxed() ? "a=rtcp-mux\r\n" : ""; + char const* rangeLine = rangeSDPLine(); + char const* auxSDPLine = fRTPSink.auxSDPLine(); + if (auxSDPLine == NULL) auxSDPLine = ""; + + char const* const sdpFmt = + "m=%s %d RTP/%sAVP %d\r\n" + "c=IN %s %s/%d\r\n" + "b=AS:%u\r\n" + "%s" + "%s" + "%s" + "%s" + "%s" + "a=control:%s\r\n"; + unsigned sdpFmtSize = strlen(sdpFmt) + + strlen(mediaType) + 5 /* max short len */ + 1 + 3 /* max char len */ + + 3/*IP4 or IP6*/ + strlen(groupAddressStr.val()) + 3 /* max char len */ + + 20 /* max int len */ + + strlen(rtpmapLine) + + strlen(keyMgmtLine) + + strlen(rtcpmuxLine) + + strlen(rangeLine) + + strlen(auxSDPLine) + + strlen(trackId()); + char* sdpLines = new char[sdpFmtSize]; + sprintf(sdpLines, sdpFmt, + mediaType, // m= + portNum, // m= + fParentSession->streamingUsesSRTP ? "S" : "", + rtpPayloadType, // m= + gs.groupAddress().ss_family == AF_INET ? "IP4" : "IP6", // c= address type + groupAddressStr.val(), // c= + ttl, // c= TTL + estBitrate, // b=AS: + rtpmapLine, // a=rtpmap:... (if present) + keyMgmtLine, // a=key-mgmt:... (if present) + rtcpmuxLine, // a=rtcp-mux:... (if present) + rangeLine, // a=range:... (if present) + auxSDPLine, // optional extra SDP line + trackId()); // a=control: + delete[] (char*)rangeLine; delete[] keyMgmtLine; delete[] rtpmapLine; + + fSDPLines = strDup(sdpLines); + delete[] sdpLines; + } + + return fSDPLines; +} + +void PassiveServerMediaSubsession +::getStreamParameters(unsigned clientSessionId, + struct sockaddr_storage const& clientAddress, + Port const& /*clientRTPPort*/, + Port const& clientRTCPPort, + int /*tcpSocketNum*/, + unsigned char /*rtpChannelId*/, + unsigned char /*rtcpChannelId*/, + TLSState* /*tlsState*/, + struct sockaddr_storage& destinationAddress, + u_int8_t& destinationTTL, + Boolean& isMulticast, + Port& serverRTPPort, + Port& serverRTCPPort, + void*& streamToken) { + isMulticast = True; + Groupsock& gs = fRTPSink.groupsockBeingUsed(); + if (destinationTTL == 255) destinationTTL = gs.ttl(); + + if (addressIsNull(destinationAddress)) { + // normal case - use the sink's existing destination address: + destinationAddress = gs.groupAddress(); + } else { // use the client-specified destination address instead: + gs.changeDestinationParameters(destinationAddress, 0, destinationTTL); + if (fRTCPInstance != NULL) { + Groupsock* rtcpGS = fRTCPInstance->RTCPgs(); + rtcpGS->changeDestinationParameters(destinationAddress, 0, destinationTTL); + } + } + serverRTPPort = gs.port(); + if (fRTCPInstance != NULL) { + Groupsock* rtcpGS = fRTCPInstance->RTCPgs(); + serverRTCPPort = rtcpGS->port(); + } + streamToken = NULL; // not used + + // Make a record of this client's source - for RTCP RR handling: + RTCPSourceRecord* source = new RTCPSourceRecord(clientAddress, clientRTCPPort); + fClientRTCPSourceRecords->Add((char const*)clientSessionId, source); +} + +void PassiveServerMediaSubsession::startStream(unsigned clientSessionId, + void* /*streamToken*/, + TaskFunc* rtcpRRHandler, + void* rtcpRRHandlerClientData, + unsigned short& rtpSeqNum, + unsigned& rtpTimestamp, + ServerRequestAlternativeByteHandler* /*serverRequestAlternativeByteHandler*/, + void* /*serverRequestAlternativeByteHandlerClientData*/) { + rtpSeqNum = fRTPSink.currentSeqNo(); + rtpTimestamp = fRTPSink.presetNextTimestamp(); + + // Try to use a big send buffer for RTP - at least 0.1 second of + // specified bandwidth and at least 50 KB + unsigned streamBitrate = fRTCPInstance == NULL ? 50 : fRTCPInstance->totSessionBW(); // in kbps + unsigned rtpBufSize = streamBitrate * 25 / 2; // 1 kbps * 0.1 s = 12.5 bytes + if (rtpBufSize < 50 * 1024) rtpBufSize = 50 * 1024; + increaseSendBufferTo(envir(), fRTPSink.groupsockBeingUsed().socketNum(), rtpBufSize); + + if (fRTCPInstance != NULL) { + // Hack: Send a RTCP "SR" packet now, so that receivers will (likely) be able to + // get RTCP-synchronized presentation times immediately: + fRTCPInstance->sendReport(); + + // Set up the handler for incoming RTCP "RR" packets from this client: + RTCPSourceRecord* source = (RTCPSourceRecord*)(fClientRTCPSourceRecords->Lookup((char const*)clientSessionId)); + if (source != NULL) { + fRTCPInstance->setSpecificRRHandler(source->addr, source->port, + rtcpRRHandler, rtcpRRHandlerClientData); + } + } +} + +float PassiveServerMediaSubsession::getCurrentNPT(void* streamToken) { + // Return the elapsed time between our "RTPSink"s creation time, and the current time: + struct timeval const& creationTime = fRTPSink.creationTime(); // alias + + struct timeval timeNow; + gettimeofday(&timeNow, NULL); + + return (float)(timeNow.tv_sec - creationTime.tv_sec + (timeNow.tv_usec - creationTime.tv_usec)/1000000.0); +} + +void PassiveServerMediaSubsession +::getRTPSinkandRTCP(void* streamToken, + RTPSink const*& rtpSink, RTCPInstance const*& rtcp) { + rtpSink = &fRTPSink; + rtcp = fRTCPInstance; +} + +void PassiveServerMediaSubsession::deleteStream(unsigned clientSessionId, void*& /*streamToken*/) { + // Lookup and remove the 'RTCPSourceRecord' for this client. Also turn off RTCP "RR" handling: + RTCPSourceRecord* source = (RTCPSourceRecord*)(fClientRTCPSourceRecords->Lookup((char const*)clientSessionId)); + if (source != NULL) { + if (fRTCPInstance != NULL) { + fRTCPInstance->unsetSpecificRRHandler(source->addr, source->port); + } + + fClientRTCPSourceRecords->Remove((char const*)clientSessionId); + delete source; + } +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/ProxyServerMediaSession.cpp b/src/big/mpp/middleware/src/live555/liveMedia/ProxyServerMediaSession.cpp new file mode 100644 index 000000000..dc01bf9e3 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/ProxyServerMediaSession.cpp @@ -0,0 +1,948 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A subclass of "ServerMediaSession" that can be used to create a (unicast) RTSP servers that acts as a 'proxy' for +// another (unicast or multicast) RTSP/RTP stream. +// Implementation + +#include "liveMedia.hh" +#include "RTSPCommon.hh" +#include "GroupsockHelper.hh" // for "our_random()" + +#ifndef MILLION +#define MILLION 1000000 +#endif + +// A "OnDemandServerMediaSubsession" subclass, used to implement a unicast RTSP server that's proxying another RTSP stream: + +class ProxyServerMediaSubsession: public OnDemandServerMediaSubsession { +public: + ProxyServerMediaSubsession(MediaSubsession& mediaSubsession, + portNumBits initialPortNum, Boolean multiplexRTCPWithRTP); + virtual ~ProxyServerMediaSubsession(); + + char const* codecName() const { return fCodecName; } + char const* url() const { return ((ProxyServerMediaSession*)fParentSession)->url(); } + +private: // redefined virtual functions + virtual FramedSource* createNewStreamSource(unsigned clientSessionId, + unsigned& estBitrate); + virtual void closeStreamSource(FramedSource *inputSource); + virtual RTPSink* createNewRTPSink(Groupsock* rtpGroupsock, + unsigned char rtpPayloadTypeIfDynamic, + FramedSource* inputSource); + virtual Groupsock* createGroupsock(struct sockaddr_storage const& addr, Port port); + virtual RTCPInstance* createRTCP(Groupsock* RTCPgs, unsigned totSessionBW, /* in kbps */ + unsigned char const* cname, RTPSink* sink); + +private: + static void subsessionByeHandler(void* clientData); + void subsessionByeHandler(); + + int verbosityLevel() const { return ((ProxyServerMediaSession*)fParentSession)->fVerbosityLevel; } + +private: + friend class ProxyRTSPClient; + MediaSubsession& fClientMediaSubsession; // the 'client' media subsession object that corresponds to this 'server' media subsession + char const* fCodecName; // copied from "fClientMediaSubsession" once it's been set up + ProxyServerMediaSubsession* fNext; // used when we're part of a queue + Boolean fHaveSetupStream; +}; + + +////////// ProxyServerMediaSession implementation ////////// + +UsageEnvironment& operator<<(UsageEnvironment& env, const ProxyServerMediaSession& psms) { // used for debugging + return env << "ProxyServerMediaSession[" << psms.url() << "]"; +} + +ProxyRTSPClient* +defaultCreateNewProxyRTSPClientFunc(ProxyServerMediaSession& ourServerMediaSession, + char const* rtspURL, + char const* username, char const* password, + portNumBits tunnelOverHTTPPortNum, int verbosityLevel, + int socketNumToServer) { + return new ProxyRTSPClient(ourServerMediaSession, rtspURL, username, password, + tunnelOverHTTPPortNum, verbosityLevel, socketNumToServer); +} + +ProxyServerMediaSession* ProxyServerMediaSession +::createNew(UsageEnvironment& env, GenericMediaServer* ourMediaServer, + char const* inputStreamURL, char const* streamName, + char const* username, char const* password, + portNumBits tunnelOverHTTPPortNum, int verbosityLevel, int socketNumToServer, + MediaTranscodingTable* transcodingTable) { + return new ProxyServerMediaSession(env, ourMediaServer, inputStreamURL, streamName, username, password, + tunnelOverHTTPPortNum, verbosityLevel, socketNumToServer, + transcodingTable); +} + + +ProxyServerMediaSession +::ProxyServerMediaSession(UsageEnvironment& env, GenericMediaServer* ourMediaServer, + char const* inputStreamURL, char const* streamName, + char const* username, char const* password, + portNumBits tunnelOverHTTPPortNum, int verbosityLevel, + int socketNumToServer, + MediaTranscodingTable* transcodingTable, + createNewProxyRTSPClientFunc* ourCreateNewProxyRTSPClientFunc, + portNumBits initialPortNum, Boolean multiplexRTCPWithRTP) + : ServerMediaSession(env, streamName, NULL, NULL, False, NULL), + describeCompletedFlag(0), fOurMediaServer(ourMediaServer), fClientMediaSession(NULL), + fVerbosityLevel(verbosityLevel), + fPresentationTimeSessionNormalizer(new PresentationTimeSessionNormalizer(envir())), + fCreateNewProxyRTSPClientFunc(ourCreateNewProxyRTSPClientFunc), + fTranscodingTable(transcodingTable), + fInitialPortNum(initialPortNum), fMultiplexRTCPWithRTP(multiplexRTCPWithRTP) { + // Open a RTSP connection to the input stream, and send a "DESCRIBE" command. + // We'll use the SDP description in the response to set ourselves up. + fProxyRTSPClient + = (*fCreateNewProxyRTSPClientFunc)(*this, inputStreamURL, username, password, + tunnelOverHTTPPortNum, + verbosityLevel > 0 ? verbosityLevel-1 : verbosityLevel, + socketNumToServer); + fProxyRTSPClient->sendDESCRIBE(); +} + +ProxyServerMediaSession::~ProxyServerMediaSession() { + if (fVerbosityLevel > 0) { + envir() << *this << "::~ProxyServerMediaSession()\n"; + } + + // Begin by sending a "TEARDOWN" command (without checking for a response): + if (fProxyRTSPClient != NULL && fClientMediaSession != NULL) { + fProxyRTSPClient->sendTeardownCommand(*fClientMediaSession, NULL, fProxyRTSPClient->auth()); + } + + // Then delete our state: + Medium::close(fClientMediaSession); + Medium::close(fProxyRTSPClient); + Medium::close(fPresentationTimeSessionNormalizer); +} + +char const* ProxyServerMediaSession::url() const { + return fProxyRTSPClient == NULL ? NULL : fProxyRTSPClient->url(); +} + +Groupsock* ProxyServerMediaSession +::createGroupsock(struct sockaddr_storage const& addr, Port port) { + // Default implementation; may be redefined by subclasses: + return new Groupsock(envir(), addr, port, 255); +} + +RTCPInstance* ProxyServerMediaSession +::createRTCP(Groupsock* RTCPgs, unsigned totSessionBW, /* in kbps */ + unsigned char const* cname, RTPSink* sink) { + // Default implementation; may be redefined by subclasses: + return RTCPInstance::createNew(envir(), RTCPgs, totSessionBW, cname, sink, NULL/*we're a server*/); +} + +Boolean ProxyServerMediaSession::allowProxyingForSubsession(MediaSubsession const& /*mss*/) { + // Default implementation + return True; +} + +void ProxyServerMediaSession::continueAfterDESCRIBE(char const* sdpDescription) { + describeCompletedFlag = 1; + + // Create a (client) "MediaSession" object from the stream's SDP description ("resultString"), then iterate through its + // "MediaSubsession" objects, to set up corresponding "ServerMediaSubsession" objects that we'll use to serve the stream's tracks. + do { + fClientMediaSession = MediaSession::createNew(envir(), sdpDescription); + if (fClientMediaSession == NULL) break; + + MediaSubsessionIterator iter(*fClientMediaSession); + for (MediaSubsession* mss = iter.next(); mss != NULL; mss = iter.next()) { + if (!allowProxyingForSubsession(*mss)) continue; + + ServerMediaSubsession* smss + = new ProxyServerMediaSubsession(*mss, fInitialPortNum, fMultiplexRTCPWithRTP); + addSubsession(smss); + if (fVerbosityLevel > 0) { + envir() << *this << " added new \"ProxyServerMediaSubsession\" for " + << mss->protocolName() << "/" << mss->mediumName() << "/" << mss->codecName() << " track\n"; + } + } + } while (0); +} + +void ProxyServerMediaSession::resetDESCRIBEState() { + // Delete all of our "ProxyServerMediaSubsession"s; they'll get set up again once we get a response to the new "DESCRIBE". + if (fOurMediaServer != NULL) { + // First, close any client connections that may have already been set up: + fOurMediaServer->closeAllClientSessionsForServerMediaSession(this); + } + deleteAllSubsessions(); + + // Finally, delete the client "MediaSession" object that we had set up after receiving the response to the previous "DESCRIBE": + Medium::close(fClientMediaSession); fClientMediaSession = NULL; +} + +///////// RTSP 'response handlers' ////////// + +static void continueAfterDESCRIBE(RTSPClient* rtspClient, int resultCode, char* resultString) { + char const* res; + + if (resultCode == 0) { + // The "DESCRIBE" command succeeded, so "resultString" should be the stream's SDP description. + res = resultString; + } else { + // The "DESCRIBE" command failed. + res = NULL; + } + ((ProxyRTSPClient*)rtspClient)->continueAfterDESCRIBE(res); + delete[] resultString; +} + +static void continueAfterSETUP(RTSPClient* rtspClient, int resultCode, char* resultString) { + ((ProxyRTSPClient*)rtspClient)->continueAfterSETUP(resultCode); + delete[] resultString; +} + +static void continueAfterPLAY(RTSPClient* rtspClient, int resultCode, char* resultString) { + ((ProxyRTSPClient*)rtspClient)->continueAfterPLAY(resultCode); + delete[] resultString; +} + +static void continueAfterOPTIONS(RTSPClient* rtspClient, int resultCode, char* resultString) { + Boolean serverSupportsGetParameter = False; + if (resultCode == 0) { + // Note whether the server told us that it supports the "GET_PARAMETER" command: + serverSupportsGetParameter = RTSPOptionIsSupported("GET_PARAMETER", resultString); + } + ((ProxyRTSPClient*)rtspClient)->continueAfterLivenessCommand(resultCode, serverSupportsGetParameter); + delete[] resultString; +} + +#ifdef SEND_GET_PARAMETER_IF_SUPPORTED +static void continueAfterGET_PARAMETER(RTSPClient* rtspClient, int resultCode, char* resultString) { + ((ProxyRTSPClient*)rtspClient)->continueAfterLivenessCommand(resultCode, True); + delete[] resultString; +} +#endif + + +////////// "ProxyRTSPClient" implementation ///////// + +UsageEnvironment& operator<<(UsageEnvironment& env, const ProxyRTSPClient& proxyRTSPClient) { // used for debugging + return env << "ProxyRTSPClient[" << proxyRTSPClient.url() << "]"; +} + +ProxyRTSPClient::ProxyRTSPClient(ProxyServerMediaSession& ourServerMediaSession, char const* rtspURL, + char const* username, char const* password, + portNumBits tunnelOverHTTPPortNum, int verbosityLevel, int socketNumToServer) + : RTSPClient(ourServerMediaSession.envir(), rtspURL, verbosityLevel, "ProxyRTSPClient", + tunnelOverHTTPPortNum == (portNumBits)(~0) ? 0 : tunnelOverHTTPPortNum, socketNumToServer), + fOurServerMediaSession(ourServerMediaSession), fOurURL(strDup(rtspURL)), fStreamRTPOverTCP(tunnelOverHTTPPortNum != 0), + fSetupQueueHead(NULL), fSetupQueueTail(NULL), fNumSetupsDone(0), fNextDESCRIBEDelay(1), + fServerSupportsGetParameter(False), fLastCommandWasPLAY(False), fDoneDESCRIBE(False), + fLivenessCommandTask(NULL), fDESCRIBECommandTask(NULL), fSubsessionTimerTask(NULL), fResetTask(NULL) { + if (username != NULL && password != NULL) { + fOurAuthenticator = new Authenticator(username, password); + } else { + fOurAuthenticator = NULL; + } +} + +void ProxyRTSPClient::reset() { + envir().taskScheduler().unscheduleDelayedTask(fLivenessCommandTask); + envir().taskScheduler().unscheduleDelayedTask(fDESCRIBECommandTask); + envir().taskScheduler().unscheduleDelayedTask(fSubsessionTimerTask); + envir().taskScheduler().unscheduleDelayedTask(fResetTask); + + fSetupQueueHead = fSetupQueueTail = NULL; + fNumSetupsDone = 0; + fNextDESCRIBEDelay = 1; + fLastCommandWasPLAY = False; + fDoneDESCRIBE = False; + + RTSPClient::reset(); +} + +ProxyRTSPClient::~ProxyRTSPClient() { + reset(); + + delete fOurAuthenticator; + delete[] fOurURL; +} + +int ProxyRTSPClient::connectToServer(int socketNum, portNumBits remotePortNum) { + int res; + res = RTSPClient::connectToServer(socketNum, remotePortNum); + + if (res == 0 && fDoneDESCRIBE && fStreamRTPOverTCP) { + if (fVerbosityLevel > 0) { + envir() << "ProxyRTSPClient::connectToServer calling scheduleReset()\n"; + } + scheduleReset(); + } + + return res; +} + +void ProxyRTSPClient::continueAfterDESCRIBE(char const* sdpDescription) { + if (sdpDescription != NULL) { + fOurServerMediaSession.continueAfterDESCRIBE(sdpDescription); + + // Unlike most RTSP streams, there might be a long delay between this "DESCRIBE" command (to the downstream server) and the + // subsequent "SETUP"/"PLAY" - which doesn't occur until the first time that a client requests the stream. + // To prevent the proxied connection (between us and the downstream server) from timing out, we send periodic 'liveness' + // ("OPTIONS" or "GET_PARAMETER") commands. (The usual RTCP liveness mechanism wouldn't work here, because RTCP packets + // don't get sent until after the "PLAY" command.) + scheduleLivenessCommand(); + } else { + // The "DESCRIBE" command failed, most likely because the server or the stream is not yet running. + // Reschedule another "DESCRIBE" command to take place later: + scheduleDESCRIBECommand(); + } + fDoneDESCRIBE = True; +} + +void ProxyRTSPClient::continueAfterLivenessCommand(int resultCode, Boolean serverSupportsGetParameter) { + if (resultCode != 0) { + // The periodic 'liveness' command failed, suggesting that the back-end stream is no longer alive. + // We handle this by resetting our connection state with this server. Any current clients will be closed, but + // subsequent clients will cause new RTSP "SETUP"s and "PLAY"s to get done, restarting the stream. + // Then continue by sending more "DESCRIBE" commands, to try to restore the stream. + + fServerSupportsGetParameter = False; // until we learn otherwise, in response to a future "OPTIONS" command + + if (resultCode < 0) { + // The 'liveness' command failed without getting a response from the server (otherwise "resultCode" would have been > 0). + // This suggests that the RTSP connection itself has failed. Print this error code, in case it's useful for debugging: + if (fVerbosityLevel > 0) { + envir() << *this << ": lost connection to server ('errno': " << -resultCode << "). Scheduling reset...\n"; + } + } + + scheduleReset(); + return; + } + + fServerSupportsGetParameter = serverSupportsGetParameter; + + // Schedule the next 'liveness' command (i.e., to tell the back-end server that we're still alive): + scheduleLivenessCommand(); +} + +#define SUBSESSION_TIMEOUT_SECONDS 5 // how many seconds to wait for the last track's "SETUP" to be done (note below) + +void ProxyRTSPClient::continueAfterSETUP(int resultCode) { + if (resultCode != 0) { + // The "SETUP" command failed, so arrange to reset the state. (We don't do this now, because it deletes the + // "ProxyServerMediaSubsession", and we can't do that during "ProxyServerMediaSubsession::createNewStreamSource()".) + scheduleReset(); + return; + } + + if (fVerbosityLevel > 0) { + envir() << *this << "::continueAfterSETUP(): head codec: " << fSetupQueueHead->codecName() + << "; numSubsessions " << fSetupQueueHead->fParentSession->numSubsessions() << "\n\tqueue:"; + for (ProxyServerMediaSubsession* p = fSetupQueueHead; p != NULL; p = p->fNext) { + envir() << "\t" << p->codecName(); + } + envir() << "\n"; + } + envir().taskScheduler().unscheduleDelayedTask(fSubsessionTimerTask); // in case it had been set + + // Dequeue the first "ProxyServerMediaSubsession" from our 'SETUP queue'. It will be the one for which this "SETUP" was done: + ProxyServerMediaSubsession* smss = fSetupQueueHead; // Assert: != NULL + fSetupQueueHead = fSetupQueueHead->fNext; + if (fSetupQueueHead == NULL) fSetupQueueTail = NULL; + + if (fSetupQueueHead != NULL) { + // There are still entries in the queue, for tracks for which we have still to do a "SETUP". + // "SETUP" the first of these now: + sendSetupCommand(fSetupQueueHead->fClientMediaSubsession, ::continueAfterSETUP, + False, fStreamRTPOverTCP, False, fOurAuthenticator); + ++fNumSetupsDone; + fSetupQueueHead->fHaveSetupStream = True; + } else { + if (fNumSetupsDone >= smss->fParentSession->numSubsessions()) { + // We've now finished setting up each of our subsessions (i.e., 'tracks'). + // Continue by sending a "PLAY" command (an 'aggregate' "PLAY" command, on the whole session): + sendPlayCommand(smss->fClientMediaSubsession.parentSession(), ::continueAfterPLAY, -1.0f, -1.0f, 1.0f, fOurAuthenticator); + // the "-1.0f" "start" parameter causes the "PLAY" to be sent without a "Range:" header, in case we'd already done + // a "PLAY" before (as a result of a 'subsession timeout' (note below)) + fLastCommandWasPLAY = True; + } else { + // Some of this session's subsessions (i.e., 'tracks') remain to be "SETUP". They might get "SETUP" very soon, but it's + // also possible - if the remote client chose to play only some of the session's tracks - that they might not. + // To allow for this possibility, we set a timer. If the timer expires without the remaining subsessions getting "SETUP", + // then we send a "PLAY" command anyway: + fSubsessionTimerTask + = envir().taskScheduler().scheduleDelayedTask(SUBSESSION_TIMEOUT_SECONDS*MILLION, (TaskFunc*)subsessionTimeout, this); + } + } +} + +void ProxyRTSPClient::continueAfterPLAY(int resultCode) { + if (resultCode != 0) { + // The "PLAY" command failed, so arrange to reset the state. (We don't do this now, because it deletes the + // "ProxyServerMediaSubsession", and we can't do that during "ProxyServerMediaSubsession::createNewStreamSource()".) + scheduleReset(); + return; + } +} + +void ProxyRTSPClient::scheduleLivenessCommand() { + // Delay a random time before sending another 'liveness' command. + unsigned delayMax = sessionTimeoutParameter(); // if the server specified a maximum time between 'liveness' probes, then use that + if (delayMax == 0) { + delayMax = 60; + } + + // Choose a random time from [delayMax/2,delayMax-1) seconds: + unsigned const us_1stPart = delayMax*500000; + unsigned uSecondsToDelay; + if (us_1stPart <= 1000000) { + uSecondsToDelay = us_1stPart; + } else { + unsigned const us_2ndPart = us_1stPart-1000000; + uSecondsToDelay = us_1stPart + (us_2ndPart*our_random())%us_2ndPart; + } + fLivenessCommandTask = envir().taskScheduler().scheduleDelayedTask(uSecondsToDelay, sendLivenessCommand, this); +} + +void ProxyRTSPClient::sendLivenessCommand(void* clientData) { + ProxyRTSPClient* rtspClient = (ProxyRTSPClient*)clientData; + rtspClient->fLivenessCommandTask = NULL; + + // Note. By default, we do not send "GET_PARAMETER" as our 'liveness notification' command, even if the server previously + // indicated (in its response to our earlier "OPTIONS" command) that it supported "GET_PARAMETER". This is because + // "GET_PARAMETER" crashes some camera servers (even though they claimed to support "GET_PARAMETER"). +#ifdef SEND_GET_PARAMETER_IF_SUPPORTED + MediaSession* sess = rtspClient->fOurServerMediaSession.fClientMediaSession; + + if (rtspClient->fServerSupportsGetParameter && rtspClient->fNumSetupsDone > 0 && sess != NULL) { + rtspClient->sendGetParameterCommand(*sess, ::continueAfterGET_PARAMETER, "", rtspClient->auth()); + } else { +#endif + rtspClient->sendOptionsCommand(::continueAfterOPTIONS, rtspClient->auth()); +#ifdef SEND_GET_PARAMETER_IF_SUPPORTED + } +#endif +} + +void ProxyRTSPClient::scheduleReset() { + if (fVerbosityLevel > 0) { + envir() << "ProxyRTSPClient::scheduleReset\n"; + } + envir().taskScheduler().rescheduleDelayedTask(fResetTask, 0, doReset, this); +} + +void ProxyRTSPClient::doReset() { + fResetTask = NULL; + if (fVerbosityLevel > 0) { + envir() << *this << "::doReset\n"; + } + + reset(); + fOurServerMediaSession.resetDESCRIBEState(); + + setBaseURL(fOurURL); // because we'll be sending an initial "DESCRIBE" all over again + sendDESCRIBE(); +} + +void ProxyRTSPClient::doReset(void* clientData) { + ProxyRTSPClient* rtspClient = (ProxyRTSPClient*)clientData; + rtspClient->doReset(); +} + +void ProxyRTSPClient::scheduleDESCRIBECommand() { + // Delay 1s, 2s, 4s, 8s ... 256s until sending the next "DESCRIBE". Then, keep delaying a random time from [256..511] seconds: + unsigned secondsToDelay; + if (fNextDESCRIBEDelay <= 256) { + secondsToDelay = fNextDESCRIBEDelay; + fNextDESCRIBEDelay *= 2; + } else { + secondsToDelay = 256 + (our_random()&0xFF); // [256..511] seconds + } + + if (fVerbosityLevel > 0) { + envir() << *this << ": RTSP \"DESCRIBE\" command failed; trying again in " << secondsToDelay << " seconds\n"; + } + fDESCRIBECommandTask = envir().taskScheduler().scheduleDelayedTask(secondsToDelay*MILLION, sendDESCRIBE, this); +} + +void ProxyRTSPClient::sendDESCRIBE(void* clientData) { + ProxyRTSPClient* rtspClient = (ProxyRTSPClient*)clientData; + if (rtspClient != NULL) { + rtspClient->fDESCRIBECommandTask = NULL; + rtspClient->sendDESCRIBE(); + } +} + +void ProxyRTSPClient::sendDESCRIBE() { + sendDescribeCommand(::continueAfterDESCRIBE, auth()); +} + +void ProxyRTSPClient::subsessionTimeout(void* clientData) { + ((ProxyRTSPClient*)clientData)->handleSubsessionTimeout(); +} + +void ProxyRTSPClient::handleSubsessionTimeout() { + fSubsessionTimerTask = NULL; + // We still have one or more subsessions ('tracks') left to "SETUP". But we can't wait any longer for them. Send a "PLAY" now: + MediaSession* sess = fOurServerMediaSession.fClientMediaSession; + if (sess != NULL) sendPlayCommand(*sess, ::continueAfterPLAY, -1.0f, -1.0f, 1.0f, fOurAuthenticator); + fLastCommandWasPLAY = True; +} + + +//////// "ProxyServerMediaSubsession" implementation ////////// + +ProxyServerMediaSubsession +::ProxyServerMediaSubsession(MediaSubsession& mediaSubsession, + portNumBits initialPortNum, Boolean multiplexRTCPWithRTP) + : OnDemandServerMediaSubsession(mediaSubsession.parentSession().envir(), True/*reuseFirstSource*/, + initialPortNum, multiplexRTCPWithRTP), + fClientMediaSubsession(mediaSubsession), fCodecName(strDup(mediaSubsession.codecName())), + fNext(NULL), fHaveSetupStream(False) { +} + +UsageEnvironment& operator<<(UsageEnvironment& env, const ProxyServerMediaSubsession& psmss) { // used for debugging + return env << "ProxyServerMediaSubsession[" << psmss.url() << "," << psmss.codecName() << "]"; +} + +ProxyServerMediaSubsession::~ProxyServerMediaSubsession() { + if (verbosityLevel() > 0) { + envir() << *this << "::~ProxyServerMediaSubsession()\n"; + } + + delete[] (char*)fCodecName; +} + +FramedSource* ProxyServerMediaSubsession::createNewStreamSource(unsigned clientSessionId, unsigned& estBitrate) { + ProxyServerMediaSession* const sms = (ProxyServerMediaSession*)fParentSession; + + if (verbosityLevel() > 0) { + envir() << *this << "::createNewStreamSource(session id " << clientSessionId << ")\n"; + } + + // If we haven't yet created a data source from our 'media subsession' object, initiate() it to do so: + if (fClientMediaSubsession.readSource() == NULL) { + if (sms->fTranscodingTable == NULL || !sms->fTranscodingTable->weWillTranscode("audio", "MPA-ROBUST")) fClientMediaSubsession.receiveRawMP3ADUs(); // hack for proxying MPA-ROBUST streams + if (sms->fTranscodingTable == NULL || !sms->fTranscodingTable->weWillTranscode("video", "JPEG")) fClientMediaSubsession.receiveRawJPEGFrames(); // hack for proxying JPEG/RTP streams. + fClientMediaSubsession.initiate(); + if (verbosityLevel() > 0) { + envir() << "\tInitiated: " << *this << "\n"; + } + + if (fClientMediaSubsession.readSource() != NULL) { + // First, check whether we have defined a 'transcoder' filter to be used with this codec: + if (sms->fTranscodingTable != NULL) { + char* outputCodecName; + FramedFilter* transcoder + = sms->fTranscodingTable->lookupTranscoder(fClientMediaSubsession, outputCodecName); + if (transcoder != NULL) { + fClientMediaSubsession.addFilter(transcoder); + delete[] (char*)fCodecName; fCodecName = outputCodecName; + } + } + + // Then, add to the front of all data sources a filter that will 'normalize' their frames' + // presentation times, before the frames get re-transmitted by our server: + FramedFilter* normalizerFilter = sms->fPresentationTimeSessionNormalizer + ->createNewPresentationTimeSubsessionNormalizer(fClientMediaSubsession.readSource(), + fClientMediaSubsession.rtpSource(), + fCodecName); + fClientMediaSubsession.addFilter(normalizerFilter); + + // Some data sources require a 'framer' object to be added, before they can be fed into + // a "RTPSink". Adjust for this now: + if (strcmp(fCodecName, "H264") == 0) { + fClientMediaSubsession.addFilter(H264VideoStreamDiscreteFramer + ::createNew(envir(), fClientMediaSubsession.readSource())); + } else if (strcmp(fCodecName, "H265") == 0) { + fClientMediaSubsession.addFilter(H265VideoStreamDiscreteFramer + ::createNew(envir(), fClientMediaSubsession.readSource())); + } else if (strcmp(fCodecName, "MP4V-ES") == 0) { + fClientMediaSubsession.addFilter(MPEG4VideoStreamDiscreteFramer + ::createNew(envir(), fClientMediaSubsession.readSource(), + True/* leave PTs unmodified*/)); + } else if (strcmp(fCodecName, "MPV") == 0) { + fClientMediaSubsession.addFilter(MPEG1or2VideoStreamDiscreteFramer + ::createNew(envir(), fClientMediaSubsession.readSource(), + False, 5.0, True/* leave PTs unmodified*/)); + } else if (strcmp(fCodecName, "DV") == 0) { + fClientMediaSubsession.addFilter(DVVideoStreamFramer + ::createNew(envir(), fClientMediaSubsession.readSource(), + False, True/* leave PTs unmodified*/)); + } + } + + if (fClientMediaSubsession.rtcpInstance() != NULL) { + fClientMediaSubsession.rtcpInstance()->setByeHandler(subsessionByeHandler, this); + } + } + + ProxyRTSPClient* const proxyRTSPClient = sms->fProxyRTSPClient; + if (clientSessionId != 0) { + // We're being called as a result of implementing a RTSP "SETUP". + if (!fHaveSetupStream) { + // This is our first "SETUP". Send RTSP "SETUP" and later "PLAY" commands to the proxied server, to start streaming: + // (Before sending "SETUP", enqueue ourselves on the "RTSPClient"s 'SETUP queue', so we'll be able to get the correct + // "ProxyServerMediaSubsession" to handle the response. (Note that responses come back in the same order as requests.)) + Boolean queueWasEmpty = proxyRTSPClient->fSetupQueueHead == NULL; + if (queueWasEmpty) { + proxyRTSPClient->fSetupQueueHead = this; + proxyRTSPClient->fSetupQueueTail = this; + } else { + // Add ourself to the "RTSPClient"s 'SETUP queue' (if we're not already on it): + ProxyServerMediaSubsession* psms; + for (psms = proxyRTSPClient->fSetupQueueHead; psms != NULL; psms = psms->fNext) { + if (psms == this) break; + } + if (psms == NULL) { + proxyRTSPClient->fSetupQueueTail->fNext = this; + proxyRTSPClient->fSetupQueueTail = this; + } + } + + // Hack: If there's already a pending "SETUP" request, don't send this track's "SETUP" right away, because + // the server might not properly handle 'pipelined' requests. Instead, wait until after previous "SETUP" responses come back. + if (queueWasEmpty) { + proxyRTSPClient->sendSetupCommand(fClientMediaSubsession, ::continueAfterSETUP, + False, proxyRTSPClient->fStreamRTPOverTCP, False, proxyRTSPClient->auth()); + ++proxyRTSPClient->fNumSetupsDone; + fHaveSetupStream = True; + } + } else { + // This is a "SETUP" from a new client. We know that there are no other currently active clients (otherwise we wouldn't + // have been called here), so we know that the substream was previously "PAUSE"d. Send "PLAY" downstream once again, + // to resume the stream: + if (!proxyRTSPClient->fLastCommandWasPLAY) { // so that we send only one "PLAY"; not one for each subsession + proxyRTSPClient->sendPlayCommand(fClientMediaSubsession.parentSession(), ::continueAfterPLAY, -1.0f/*resume from previous point*/, + -1.0f, 1.0f, proxyRTSPClient->auth()); + proxyRTSPClient->fLastCommandWasPLAY = True; + } + } + } + + estBitrate = fClientMediaSubsession.bandwidth(); + if (estBitrate == 0) estBitrate = 50; // kbps, estimate + return fClientMediaSubsession.readSource(); +} + +void ProxyServerMediaSubsession::closeStreamSource(FramedSource* /*inputSource*/) { + if (verbosityLevel() > 0) { + envir() << *this << "::closeStreamSource()\n"; + } + // Because there's only one input source for this 'subsession' (regardless of how many downstream clients are proxying it), + // we don't close the input source here. (Instead, we wait until *this* object gets deleted.) + // However, because (as evidenced by this function having been called) we no longer have any clients accessing the stream, + // then we "PAUSE" the downstream proxied stream, until a new client arrives: + if (fHaveSetupStream) { + ProxyServerMediaSession* const sms = (ProxyServerMediaSession*)fParentSession; + ProxyRTSPClient* const proxyRTSPClient = sms->fProxyRTSPClient; + if (proxyRTSPClient->fLastCommandWasPLAY) { // so that we send only one "PAUSE"; not one for each subsession + if (fParentSession->referenceCount() > 1) { + // There are other client(s) still streaming other subsessions of this stream. + // Therefore, we don't send a "PAUSE" for the whole stream. + // In principle, we would send a "PAUSE" only for the sub-stream here, but some + // back-end servers might mis-handle that by pausing the entire stream. + // So instead, we do nothing here. + //proxyRTSPClient->sendPauseCommand(fClientMediaSubsession, NULL, proxyRTSPClient->auth()); + } else { + // Normal case: There are no other clients still streaming (parts of) this stream. + // Send a "PAUSE" for the whole stream. + proxyRTSPClient->sendPauseCommand(fClientMediaSubsession.parentSession(), NULL, proxyRTSPClient->auth()); + proxyRTSPClient->fLastCommandWasPLAY = False; + } + } + } +} + +RTPSink* ProxyServerMediaSubsession +::createNewRTPSink(Groupsock* rtpGroupsock, unsigned char rtpPayloadTypeIfDynamic, FramedSource* inputSource) { + if (verbosityLevel() > 0) { + envir() << *this << "::createNewRTPSink()\n"; + } + + // Create (and return) the appropriate "RTPSink" object for our codec: + // (Note: The configuration string might not be correct if a transcoder is used. FIX!) ##### + RTPSink* newSink; + if (strcmp(fCodecName, "AC3") == 0 || strcmp(fCodecName, "EAC3") == 0) { + newSink = AC3AudioRTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic, + fClientMediaSubsession.rtpTimestampFrequency()); +#if 0 // This code does not work; do *not* enable it: + } else if (strcmp(fCodecName, "AMR") == 0 || strcmp(fCodecName, "AMR-WB") == 0) { + Boolean isWideband = strcmp(fCodecName, "AMR-WB") == 0; + newSink = AMRAudioRTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic, + isWideband, fClientMediaSubsession.numChannels()); +#endif + } else if (strcmp(fCodecName, "DV") == 0) { + newSink = DVVideoRTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic); + } else if (strcmp(fCodecName, "GSM") == 0) { + newSink = GSMAudioRTPSink::createNew(envir(), rtpGroupsock); + } else if (strcmp(fCodecName, "H263-1998") == 0 || strcmp(fCodecName, "H263-2000") == 0) { + newSink = H263plusVideoRTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic, + fClientMediaSubsession.rtpTimestampFrequency()); + } else if (strcmp(fCodecName, "H264") == 0) { + newSink = H264VideoRTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic, + fClientMediaSubsession.fmtp_spropparametersets()); + } else if (strcmp(fCodecName, "H265") == 0) { + newSink = H265VideoRTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic, + fClientMediaSubsession.fmtp_spropvps(), + fClientMediaSubsession.fmtp_spropsps(), + fClientMediaSubsession.fmtp_sproppps()); + } else if (strcmp(fCodecName, "JPEG") == 0) { + newSink = SimpleRTPSink::createNew(envir(), rtpGroupsock, 26, 90000, "video", "JPEG", + 1/*numChannels*/, False/*allowMultipleFramesPerPacket*/, False/*doNormalMBitRule*/); + } else if (strcmp(fCodecName, "MP4A-LATM") == 0) { + newSink = MPEG4LATMAudioRTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic, + fClientMediaSubsession.rtpTimestampFrequency(), + fClientMediaSubsession.fmtp_config(), + fClientMediaSubsession.numChannels()); + } else if (strcmp(fCodecName, "MP4V-ES") == 0) { + newSink = MPEG4ESVideoRTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic, + fClientMediaSubsession.rtpTimestampFrequency(), + fClientMediaSubsession.attrVal_unsigned("profile-level-id"), + fClientMediaSubsession.fmtp_config()); + } else if (strcmp(fCodecName, "MPA") == 0) { + newSink = MPEG1or2AudioRTPSink::createNew(envir(), rtpGroupsock); + } else if (strcmp(fCodecName, "MPA-ROBUST") == 0) { + newSink = MP3ADURTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic); + } else if (strcmp(fCodecName, "MPEG4-GENERIC") == 0) { + newSink = MPEG4GenericRTPSink::createNew(envir(), rtpGroupsock, + rtpPayloadTypeIfDynamic, fClientMediaSubsession.rtpTimestampFrequency(), + fClientMediaSubsession.mediumName(), + fClientMediaSubsession.attrVal_str("mode"), + fClientMediaSubsession.fmtp_config(), fClientMediaSubsession.numChannels()); + } else if (strcmp(fCodecName, "MPV") == 0) { + newSink = MPEG1or2VideoRTPSink::createNew(envir(), rtpGroupsock); + } else if (strcmp(fCodecName, "OPUS") == 0) { + newSink = SimpleRTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic, + 48000, "audio", "OPUS", 2, False/*only 1 Opus 'packet' in each RTP packet*/); + } else if (strcmp(fCodecName, "T140") == 0) { + newSink = T140TextRTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic); + } else if (strcmp(fCodecName, "THEORA") == 0) { + newSink = TheoraVideoRTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic, + fClientMediaSubsession.fmtp_config()); + } else if (strcmp(fCodecName, "VORBIS") == 0) { + newSink = VorbisAudioRTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic, + fClientMediaSubsession.rtpTimestampFrequency(), fClientMediaSubsession.numChannels(), + fClientMediaSubsession.fmtp_config()); + } else if (strcmp(fCodecName, "VP8") == 0) { + newSink = VP8VideoRTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic); + } else if (strcmp(fCodecName, "VP9") == 0) { + newSink = VP9VideoRTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic); + } else if (strcmp(fCodecName, "AMR") == 0 || strcmp(fCodecName, "AMR-WB") == 0) { + // Proxying of these codecs is currently *not* supported, because the data received by the "RTPSource" object is not in a + // form that can be fed directly into a corresponding "RTPSink" object. + if (verbosityLevel() > 0) { + envir() << "\treturns NULL (because we currently don't support the proxying of \"" + << fClientMediaSubsession.mediumName() << "/" << fCodecName << "\" streams)\n"; + } + return NULL; + } else if (strcmp(fCodecName, "QCELP") == 0 || + strcmp(fCodecName, "H261") == 0 || + strcmp(fCodecName, "H263-1998") == 0 || strcmp(fCodecName, "H263-2000") == 0 || + strcmp(fCodecName, "X-QT") == 0 || strcmp(fCodecName, "X-QUICKTIME") == 0) { + // This codec requires a specialized RTP payload format; however, we don't yet have an appropriate "RTPSink" subclass for it: + if (verbosityLevel() > 0) { + envir() << "\treturns NULL (because we don't have a \"RTPSink\" subclass for this RTP payload format)\n"; + } + return NULL; + } else { + // This codec is assumed to have a simple RTP payload format that can be implemented just with a "SimpleRTPSink": + Boolean allowMultipleFramesPerPacket = True; // by default + Boolean doNormalMBitRule = True; // by default + // Some codecs change the above default parameters: + if (strcmp(fCodecName, "MP2T") == 0) { + doNormalMBitRule = False; // no RTP 'M' bit + } + newSink = SimpleRTPSink::createNew(envir(), rtpGroupsock, + rtpPayloadTypeIfDynamic, fClientMediaSubsession.rtpTimestampFrequency(), + fClientMediaSubsession.mediumName(), fCodecName, + fClientMediaSubsession.numChannels(), allowMultipleFramesPerPacket, doNormalMBitRule); + } + + // Because our relayed frames' presentation times are inaccurate until the input frames have been RTCP-synchronized, + // we temporarily disable RTCP "SR" reports for this "RTPSink" object: + newSink->enableRTCPReports() = False; + + // Also tell our "PresentationTimeSubsessionNormalizer" object about the "RTPSink", so it can enable RTCP "SR" reports later: + PresentationTimeSubsessionNormalizer* ssNormalizer; + if (strcmp(fCodecName, "H264") == 0 || + strcmp(fCodecName, "H265") == 0 || + strcmp(fCodecName, "MP4V-ES") == 0 || + strcmp(fCodecName, "MPV") == 0 || + strcmp(fCodecName, "DV") == 0) { + // There was a separate 'framer' object in front of the "PresentationTimeSubsessionNormalizer", so go back one object to get it: + ssNormalizer = (PresentationTimeSubsessionNormalizer*)(((FramedFilter*)inputSource)->inputSource()); + } else { + ssNormalizer = (PresentationTimeSubsessionNormalizer*)inputSource; + } + ssNormalizer->setRTPSink(newSink); + + return newSink; +} + +Groupsock* ProxyServerMediaSubsession +::createGroupsock(struct sockaddr_storage const& addr, Port port) { + ProxyServerMediaSession* parentSession = (ProxyServerMediaSession*)fParentSession; + return parentSession->createGroupsock(addr, port); +} + +RTCPInstance* ProxyServerMediaSubsession +::createRTCP(Groupsock* RTCPgs, unsigned totSessionBW, /* in kbps */ + unsigned char const* cname, RTPSink* sink) { + ProxyServerMediaSession* parentSession = (ProxyServerMediaSession*)fParentSession; + return parentSession->createRTCP(RTCPgs, totSessionBW, cname, sink); +} + +void ProxyServerMediaSubsession::subsessionByeHandler(void* clientData) { + ((ProxyServerMediaSubsession*)clientData)->subsessionByeHandler(); +} + +void ProxyServerMediaSubsession::subsessionByeHandler() { + if (verbosityLevel() > 0) { + envir() << *this << ": received RTCP \"BYE\". (The back-end stream has ended.)\n"; + } + + // This "BYE" signals that our input source has (effectively) closed, so pass this onto the front-end clients: + fHaveSetupStream = False; // hack to stop "PAUSE" getting sent by: + if (fClientMediaSubsession.readSource() != NULL) { + fClientMediaSubsession.readSource()->handleClosure(); + } + + // And then treat this as if we had lost connection to the back-end server, + // and can reestablish streaming from it only by sending another "DESCRIBE": + ProxyServerMediaSession* const sms = (ProxyServerMediaSession*)fParentSession; + ProxyRTSPClient* const proxyRTSPClient = sms->fProxyRTSPClient; + proxyRTSPClient->scheduleReset(); +} + + +////////// PresentationTimeSessionNormalizer and PresentationTimeSubsessionNormalizer implementations ////////// + +// PresentationTimeSessionNormalizer: + +PresentationTimeSessionNormalizer::PresentationTimeSessionNormalizer(UsageEnvironment& env) + : Medium(env), + fSubsessionNormalizers(NULL), fMasterSSNormalizer(NULL) { +} + +PresentationTimeSessionNormalizer::~PresentationTimeSessionNormalizer() { + while (fSubsessionNormalizers != NULL) { + Medium::close(fSubsessionNormalizers); + } +} + +PresentationTimeSubsessionNormalizer* PresentationTimeSessionNormalizer +::createNewPresentationTimeSubsessionNormalizer(FramedSource* inputSource, RTPSource* rtpSource, + char const* codecName) { + fSubsessionNormalizers + = new PresentationTimeSubsessionNormalizer(*this, inputSource, rtpSource, codecName, fSubsessionNormalizers); + return fSubsessionNormalizers; +} + +void PresentationTimeSessionNormalizer +::normalizePresentationTime(PresentationTimeSubsessionNormalizer* ssNormalizer, + struct timeval& toPT, struct timeval const& fromPT) { + Boolean const hasBeenSynced = ssNormalizer->fRTPSource->hasBeenSynchronizedUsingRTCP(); + + if (!hasBeenSynced) { + // If "fromPT" has not yet been RTCP-synchronized, then it was generated by our own receiving code, and thus + // is already aligned with 'wall-clock' time. Just copy it 'as is' to "toPT": + toPT = fromPT; + } else { + if (fMasterSSNormalizer == NULL) { + // Make "ssNormalizer" the 'master' subsession - meaning that its presentation time is adjusted to align with 'wall clock' + // time, and the presentation times of other subsessions (if any) are adjusted to retain their relative separation with + // those of the master: + fMasterSSNormalizer = ssNormalizer; + + struct timeval timeNow; + gettimeofday(&timeNow, NULL); + + // Compute: fPTAdjustment = timeNow - fromPT + fPTAdjustment.tv_sec = timeNow.tv_sec - fromPT.tv_sec; + fPTAdjustment.tv_usec = timeNow.tv_usec - fromPT.tv_usec; + // Note: It's OK if one or both of these fields underflows; the result still works out OK later. + } + + // Compute a normalized presentation time: toPT = fromPT + fPTAdjustment + toPT.tv_sec = fromPT.tv_sec + fPTAdjustment.tv_sec - 1; + toPT.tv_usec = fromPT.tv_usec + fPTAdjustment.tv_usec + MILLION; + while (toPT.tv_usec > MILLION) { ++toPT.tv_sec; toPT.tv_usec -= MILLION; } + + // Because "ssNormalizer"s relayed presentation times are accurate from now on, enable RTCP "SR" reports for its "RTPSink": + RTPSink* const rtpSink = ssNormalizer->fRTPSink; + if (rtpSink != NULL) { // sanity check; should always be true + rtpSink->enableRTCPReports() = True; + } + } +} + +void PresentationTimeSessionNormalizer +::removePresentationTimeSubsessionNormalizer(PresentationTimeSubsessionNormalizer* ssNormalizer) { + // Unlink "ssNormalizer" from the linked list (starting with "fSubsessionNormalizers"): + if (fSubsessionNormalizers == ssNormalizer) { + fSubsessionNormalizers = fSubsessionNormalizers->fNext; + } else { + PresentationTimeSubsessionNormalizer** ssPtrPtr = &(fSubsessionNormalizers->fNext); + while (*ssPtrPtr != ssNormalizer) ssPtrPtr = &((*ssPtrPtr)->fNext); + *ssPtrPtr = (*ssPtrPtr)->fNext; + } +} + +// PresentationTimeSubsessionNormalizer: + +PresentationTimeSubsessionNormalizer +::PresentationTimeSubsessionNormalizer(PresentationTimeSessionNormalizer& parent, FramedSource* inputSource, RTPSource* rtpSource, + char const* codecName, PresentationTimeSubsessionNormalizer* next) + : FramedFilter(parent.envir(), inputSource), + fParent(parent), fRTPSource(rtpSource), fRTPSink(NULL), fCodecName(codecName), fNext(next) { +} + +PresentationTimeSubsessionNormalizer::~PresentationTimeSubsessionNormalizer() { + fParent.removePresentationTimeSubsessionNormalizer(this); +} + +void PresentationTimeSubsessionNormalizer::afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds) { + ((PresentationTimeSubsessionNormalizer*)clientData) + ->afterGettingFrame(frameSize, numTruncatedBytes, presentationTime, durationInMicroseconds); +} + +void PresentationTimeSubsessionNormalizer::afterGettingFrame(unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds) { + // This filter is implemented by passing all frames through unchanged, except that "fPresentationTime" is changed: + fFrameSize = frameSize; + fNumTruncatedBytes = numTruncatedBytes; + fDurationInMicroseconds = durationInMicroseconds; + + fParent.normalizePresentationTime(this, fPresentationTime, presentationTime); + + // Hack for JPEG/RTP proxying. Because we're proxying JPEG by just copying the raw JPEG/RTP payloads, without interpreting them, + // we need to also 'copy' the RTP 'M' (marker) bit from the "RTPSource" to the "RTPSink": + if (fRTPSource->curPacketMarkerBit() && strcmp(fCodecName, "JPEG") == 0) ((SimpleRTPSink*)fRTPSink)->setMBitOnNextPacket(); + + // Complete delivery: + FramedSource::afterGetting(this); +} + +void PresentationTimeSubsessionNormalizer::doGetNextFrame() { + fInputSource->getNextFrame(fTo, fMaxSize, afterGettingFrame, this, FramedSource::handleClosure, this); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/QCELPAudioRTPSource.cpp b/src/big/mpp/middleware/src/live555/liveMedia/QCELPAudioRTPSource.cpp new file mode 100644 index 000000000..03f13fe05 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/QCELPAudioRTPSource.cpp @@ -0,0 +1,504 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Qualcomm "PureVoice" (aka. "QCELP") Audio RTP Sources +// Implementation + +#include "QCELPAudioRTPSource.hh" +#include "MultiFramedRTPSource.hh" +#include "FramedFilter.hh" +#include +#include + +// This source is implemented internally by two separate sources: +// (i) a RTP source for the raw (interleaved) QCELP frames, and +// (ii) a deinterleaving filter that reads from this. +// Define these two new classes here: + +class RawQCELPRTPSource: public MultiFramedRTPSource { +public: + static RawQCELPRTPSource* createNew(UsageEnvironment& env, + Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency); + + unsigned char interleaveL() const { return fInterleaveL; } + unsigned char interleaveN() const { return fInterleaveN; } + unsigned char& frameIndex() { return fFrameIndex; } // index within pkt + +private: + RawQCELPRTPSource(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency); + // called only by createNew() + + virtual ~RawQCELPRTPSource(); + +private: + // redefined virtual functions: + virtual Boolean processSpecialHeader(BufferedPacket* packet, + unsigned& resultSpecialHeaderSize); + virtual char const* MIMEtype() const; + + virtual Boolean hasBeenSynchronizedUsingRTCP(); + +private: + unsigned char fInterleaveL, fInterleaveN, fFrameIndex; + unsigned fNumSuccessiveSyncedPackets; +}; + +class QCELPDeinterleaver: public FramedFilter { +public: + static QCELPDeinterleaver* createNew(UsageEnvironment& env, + RawQCELPRTPSource* inputSource); + +private: + QCELPDeinterleaver(UsageEnvironment& env, + RawQCELPRTPSource* inputSource); + // called only by "createNew()" + + virtual ~QCELPDeinterleaver(); + + static void afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + void afterGettingFrame1(unsigned frameSize, struct timeval presentationTime); + +private: + // Redefined virtual functions: + void doGetNextFrame(); + virtual void doStopGettingFrames(); + +private: + class QCELPDeinterleavingBuffer* fDeinterleavingBuffer; + Boolean fNeedAFrame; +}; + + +////////// QCELPAudioRTPSource implementation ////////// + +FramedSource* +QCELPAudioRTPSource::createNew(UsageEnvironment& env, + Groupsock* RTPgs, + RTPSource*& resultRTPSource, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency) { + RawQCELPRTPSource* rawRTPSource; + resultRTPSource = rawRTPSource + = RawQCELPRTPSource::createNew(env, RTPgs, rtpPayloadFormat, + rtpTimestampFrequency); + if (resultRTPSource == NULL) return NULL; + + QCELPDeinterleaver* deinterleaver + = QCELPDeinterleaver::createNew(env, rawRTPSource); + if (deinterleaver == NULL) { + Medium::close(resultRTPSource); + resultRTPSource = NULL; + } + + return deinterleaver; +} + + +////////// QCELPBufferedPacket and QCELPBufferedPacketFactory ////////// + +// A subclass of BufferedPacket, used to separate out QCELP frames. + +class QCELPBufferedPacket: public BufferedPacket { +public: + QCELPBufferedPacket(RawQCELPRTPSource& ourSource); + virtual ~QCELPBufferedPacket(); + +private: // redefined virtual functions + virtual unsigned nextEnclosedFrameSize(unsigned char*& framePtr, + unsigned dataSize); +private: + RawQCELPRTPSource& fOurSource; +}; + +class QCELPBufferedPacketFactory: public BufferedPacketFactory { +private: // redefined virtual functions + virtual BufferedPacket* createNewPacket(MultiFramedRTPSource* ourSource); +}; + + +///////// RawQCELPRTPSource implementation //////// + +RawQCELPRTPSource* +RawQCELPRTPSource::createNew(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency) { + return new RawQCELPRTPSource(env, RTPgs, rtpPayloadFormat, + rtpTimestampFrequency); +} + +RawQCELPRTPSource::RawQCELPRTPSource(UsageEnvironment& env, + Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency) + : MultiFramedRTPSource(env, RTPgs, rtpPayloadFormat, + rtpTimestampFrequency, + new QCELPBufferedPacketFactory), + fInterleaveL(0), fInterleaveN(0), fFrameIndex(0), + fNumSuccessiveSyncedPackets(0) { +} + +RawQCELPRTPSource::~RawQCELPRTPSource() { +} + +Boolean RawQCELPRTPSource +::processSpecialHeader(BufferedPacket* packet, + unsigned& resultSpecialHeaderSize) { + unsigned char* headerStart = packet->data(); + unsigned packetSize = packet->dataSize(); + + // First, check whether this packet's RTP timestamp is synchronized: + if (RTPSource::hasBeenSynchronizedUsingRTCP()) { + ++fNumSuccessiveSyncedPackets; + } else { + fNumSuccessiveSyncedPackets = 0; + } + + // There's a 1-byte header indicating the interleave parameters + if (packetSize < 1) return False; + + // Get the interleaving parameters from the 1-byte header, + // and check them for validity: + unsigned char const firstByte = headerStart[0]; + unsigned char const interleaveL = (firstByte&0x38)>>3; + unsigned char const interleaveN = firstByte&0x07; +#ifdef DEBUG + fprintf(stderr, "packetSize: %d, interleaveL: %d, interleaveN: %d\n", packetSize, interleaveL, interleaveN); +#endif + if (interleaveL > 5 || interleaveN > interleaveL) return False; //invalid + + fInterleaveL = interleaveL; + fInterleaveN = interleaveN; + fFrameIndex = 0; // initially + + resultSpecialHeaderSize = 1; + return True; +} + +char const* RawQCELPRTPSource::MIMEtype() const { + return "audio/QCELP"; +} + +Boolean RawQCELPRTPSource::hasBeenSynchronizedUsingRTCP() { + // Don't report ourselves as being synchronized until we've received + // at least a complete interleave cycle of synchronized packets. + // This ensures that the receiver is currently getting a frame from + // a packet that was synchronized. + if (fNumSuccessiveSyncedPackets > (unsigned)(fInterleaveL+1)) { + fNumSuccessiveSyncedPackets = fInterleaveL+2; // prevents overflow + return True; + } + return False; +} + + +///// QCELPBufferedPacket and QCELPBufferedPacketFactory implementation + +QCELPBufferedPacket::QCELPBufferedPacket(RawQCELPRTPSource& ourSource) + : fOurSource(ourSource) { +} + +QCELPBufferedPacket::~QCELPBufferedPacket() { +} + +unsigned QCELPBufferedPacket:: + nextEnclosedFrameSize(unsigned char*& framePtr, unsigned dataSize) { + // The size of the QCELP frame is determined by the first byte: + if (dataSize == 0) return 0; // sanity check + unsigned char const firstByte = framePtr[0]; + + unsigned frameSize; + switch (firstByte) { + case 0: { frameSize = 1; break; } + case 1: { frameSize = 4; break; } + case 2: { frameSize = 8; break; } + case 3: { frameSize = 17; break; } + case 4: { frameSize = 35; break; } + default: { frameSize = 0; break; } + } + +#ifdef DEBUG + fprintf(stderr, "QCELPBufferedPacket::nextEnclosedFrameSize(): frameSize: %d, dataSize: %d\n", frameSize, dataSize); +#endif + if (dataSize < frameSize) return 0; + + ++fOurSource.frameIndex(); + return frameSize; +} + +BufferedPacket* QCELPBufferedPacketFactory +::createNewPacket(MultiFramedRTPSource* ourSource) { + return new QCELPBufferedPacket((RawQCELPRTPSource&)(*ourSource)); +} + +///////// QCELPDeinterleavingBuffer ///////// +// (used to implement QCELPDeinterleaver) + +#define QCELP_MAX_FRAME_SIZE 35 +#define QCELP_MAX_INTERLEAVE_L 5 +#define QCELP_MAX_FRAMES_PER_PACKET 10 +#define QCELP_MAX_INTERLEAVE_GROUP_SIZE \ + ((QCELP_MAX_INTERLEAVE_L+1)*QCELP_MAX_FRAMES_PER_PACKET) + +class QCELPDeinterleavingBuffer { +public: + QCELPDeinterleavingBuffer(); + virtual ~QCELPDeinterleavingBuffer(); + + void deliverIncomingFrame(unsigned frameSize, + unsigned char interleaveL, + unsigned char interleaveN, + unsigned char frameIndex, + unsigned short packetSeqNum, + struct timeval presentationTime); + Boolean retrieveFrame(unsigned char* to, unsigned maxSize, + unsigned& resultFrameSize, unsigned& resultNumTruncatedBytes, + struct timeval& resultPresentationTime); + + unsigned char* inputBuffer() { return fInputBuffer; } + unsigned inputBufferSize() const { return QCELP_MAX_FRAME_SIZE; } + +private: + class FrameDescriptor { + public: + FrameDescriptor(); + virtual ~FrameDescriptor(); + + unsigned frameSize; + unsigned char* frameData; + struct timeval presentationTime; + }; + + // Use two banks of descriptors - one for incoming, one for outgoing + FrameDescriptor fFrames[QCELP_MAX_INTERLEAVE_GROUP_SIZE][2]; + unsigned char fIncomingBankId; // toggles between 0 and 1 + unsigned char fIncomingBinMax; // in the incoming bank + unsigned char fOutgoingBinMax; // in the outgoing bank + unsigned char fNextOutgoingBin; + Boolean fHaveSeenPackets; + u_int16_t fLastPacketSeqNumForGroup; + unsigned char* fInputBuffer; + struct timeval fLastRetrievedPresentationTime; +}; + + +////////// QCELPDeinterleaver implementation ///////// + +QCELPDeinterleaver* +QCELPDeinterleaver::createNew(UsageEnvironment& env, + RawQCELPRTPSource* inputSource) { + return new QCELPDeinterleaver(env, inputSource); +} + +QCELPDeinterleaver::QCELPDeinterleaver(UsageEnvironment& env, + RawQCELPRTPSource* inputSource) + : FramedFilter(env, inputSource), + fNeedAFrame(False) { + fDeinterleavingBuffer = new QCELPDeinterleavingBuffer(); +} + +QCELPDeinterleaver::~QCELPDeinterleaver() { + delete fDeinterleavingBuffer; +} + +static unsigned const uSecsPerFrame = 20000; // 20 ms + +void QCELPDeinterleaver::doGetNextFrame() { + // First, try getting a frame from the deinterleaving buffer: + if (fDeinterleavingBuffer->retrieveFrame(fTo, fMaxSize, + fFrameSize, fNumTruncatedBytes, + fPresentationTime)) { + // Success! + fNeedAFrame = False; + + fDurationInMicroseconds = uSecsPerFrame; + + // Call our own 'after getting' function. Because we're not a 'leaf' + // source, we can call this directly, without risking + // infinite recursion + afterGetting(this); + return; + } + + // No luck, so ask our source for help: + fNeedAFrame = True; + if (!fInputSource->isCurrentlyAwaitingData()) { + fInputSource->getNextFrame(fDeinterleavingBuffer->inputBuffer(), + fDeinterleavingBuffer->inputBufferSize(), + afterGettingFrame, this, + FramedSource::handleClosure, this); + } +} + +void QCELPDeinterleaver::doStopGettingFrames() { + fNeedAFrame = False; + fInputSource->stopGettingFrames(); +} + +void QCELPDeinterleaver +::afterGettingFrame(void* clientData, unsigned frameSize, + unsigned /*numTruncatedBytes*/, + struct timeval presentationTime, + unsigned /*durationInMicroseconds*/) { + QCELPDeinterleaver* deinterleaver = (QCELPDeinterleaver*)clientData; + deinterleaver->afterGettingFrame1(frameSize, presentationTime); +} + +void QCELPDeinterleaver +::afterGettingFrame1(unsigned frameSize, struct timeval presentationTime) { + RawQCELPRTPSource* source = (RawQCELPRTPSource*)fInputSource; + + // First, put the frame into our deinterleaving buffer: + fDeinterleavingBuffer + ->deliverIncomingFrame(frameSize, source->interleaveL(), + source->interleaveN(), source->frameIndex(), + source->curPacketRTPSeqNum(), + presentationTime); + + // Then, try delivering a frame to the client (if he wants one): + if (fNeedAFrame) doGetNextFrame(); +} + + +////////// QCELPDeinterleavingBuffer implementation ///////// + +QCELPDeinterleavingBuffer::QCELPDeinterleavingBuffer() + : fIncomingBankId(0), fIncomingBinMax(0), + fOutgoingBinMax(0), fNextOutgoingBin(0), + fHaveSeenPackets(False) { + fInputBuffer = new unsigned char[QCELP_MAX_FRAME_SIZE]; +} + +QCELPDeinterleavingBuffer::~QCELPDeinterleavingBuffer() { + delete[] fInputBuffer; +} + +void QCELPDeinterleavingBuffer +::deliverIncomingFrame(unsigned frameSize, + unsigned char interleaveL, + unsigned char interleaveN, + unsigned char frameIndex, + unsigned short packetSeqNum, + struct timeval presentationTime) { + // First perform a sanity check on the parameters: + // (This is overkill, as the source should have already done this.) + if (frameSize > QCELP_MAX_FRAME_SIZE + || interleaveL > QCELP_MAX_INTERLEAVE_L || interleaveN > interleaveL + || frameIndex == 0 || frameIndex > QCELP_MAX_FRAMES_PER_PACKET) { +#ifdef DEBUG + fprintf(stderr, "QCELPDeinterleavingBuffer::deliverIncomingFrame() param sanity check failed (%d,%d,%d,%d)\n", frameSize, interleaveL, interleaveN, frameIndex); +#endif + return; + } + + // The input "presentationTime" was that of the first frame in this + // packet. Update it for the current frame: + unsigned uSecIncrement = (frameIndex-1)*(interleaveL+1)*uSecsPerFrame; + presentationTime.tv_usec += uSecIncrement; + presentationTime.tv_sec += presentationTime.tv_usec/1000000; + presentationTime.tv_usec = presentationTime.tv_usec%1000000; + + // Next, check whether this packet is part of a new interleave group + if (!fHaveSeenPackets + || seqNumLT(fLastPacketSeqNumForGroup, packetSeqNum)) { + // We've moved to a new interleave group + fHaveSeenPackets = True; + fLastPacketSeqNumForGroup = packetSeqNum + interleaveL - interleaveN; + + // Switch the incoming and outgoing banks: + fIncomingBankId ^= 1; + unsigned char tmp = fIncomingBinMax; + fIncomingBinMax = fOutgoingBinMax; + fOutgoingBinMax = tmp; + fNextOutgoingBin = 0; + } + + // Now move the incoming frame into the appropriate bin: + unsigned const binNumber + = interleaveN + (frameIndex-1)*(interleaveL+1); + FrameDescriptor& inBin = fFrames[binNumber][fIncomingBankId]; + unsigned char* curBuffer = inBin.frameData; + inBin.frameData = fInputBuffer; + inBin.frameSize = frameSize; + inBin.presentationTime = presentationTime; + + if (curBuffer == NULL) curBuffer = new unsigned char[QCELP_MAX_FRAME_SIZE]; + fInputBuffer = curBuffer; + + if (binNumber >= fIncomingBinMax) { + fIncomingBinMax = binNumber + 1; + } +} + +Boolean QCELPDeinterleavingBuffer +::retrieveFrame(unsigned char* to, unsigned maxSize, + unsigned& resultFrameSize, unsigned& resultNumTruncatedBytes, + struct timeval& resultPresentationTime) { + if (fNextOutgoingBin >= fOutgoingBinMax) return False; // none left + + FrameDescriptor& outBin = fFrames[fNextOutgoingBin][fIncomingBankId^1]; + unsigned char* fromPtr; + unsigned char fromSize = outBin.frameSize; + outBin.frameSize = 0; // for the next time this bin is used + + // Check whether this frame is missing; if so, return an 'erasure' frame: + unsigned char erasure = 14; + if (fromSize == 0) { + fromPtr = &erasure; + fromSize = 1; + + // Compute this erasure frame's presentation time via extrapolation: + resultPresentationTime = fLastRetrievedPresentationTime; + resultPresentationTime.tv_usec += uSecsPerFrame; + if (resultPresentationTime.tv_usec >= 1000000) { + ++resultPresentationTime.tv_sec; + resultPresentationTime.tv_usec -= 1000000; + } + } else { + // Normal case - a frame exists: + fromPtr = outBin.frameData; + resultPresentationTime = outBin.presentationTime; + } + + fLastRetrievedPresentationTime = resultPresentationTime; + + if (fromSize > maxSize) { + resultNumTruncatedBytes = fromSize - maxSize; + resultFrameSize = maxSize; + } else { + resultNumTruncatedBytes = 0; + resultFrameSize = fromSize; + } + memmove(to, fromPtr, resultFrameSize); + + ++fNextOutgoingBin; + return True; +} + +QCELPDeinterleavingBuffer::FrameDescriptor::FrameDescriptor() + : frameSize(0), frameData(NULL) { +} + +QCELPDeinterleavingBuffer::FrameDescriptor::~FrameDescriptor() { + delete[] frameData; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/QuickTimeFileSink.cpp b/src/big/mpp/middleware/src/live555/liveMedia/QuickTimeFileSink.cpp new file mode 100644 index 000000000..20ec3ccbf --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/QuickTimeFileSink.cpp @@ -0,0 +1,2338 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A sink that generates a QuickTime file from a composite media session +// Implementation + +#include "QuickTimeFileSink.hh" +#include "QuickTimeGenericRTPSource.hh" +#include "GroupsockHelper.hh" +#include "InputFile.hh" +#include "OutputFile.hh" +#include "H263plusVideoRTPSource.hh" // for the special header +#include "MPEG4GenericRTPSource.hh" //for "samplingFrequencyFromAudioSpecificConfig()" +#include "MPEG4LATMAudioRTPSource.hh" // for "parseGeneralConfigStr()" +#include "Base64.hh" + +#include + +#define fourChar(x,y,z,w) ( ((x)<<24)|((y)<<16)|((z)<<8)|(w) ) + +#define H264_IDR_FRAME 0x65 //bit 8 == 0, bits 7-6 (ref) == 3, bits 5-0 (type) == 5 + +////////// SubsessionIOState, ChunkDescriptor /////////// +// A structure used to represent the I/O state of each input 'subsession': + +class ChunkDescriptor { +public: + ChunkDescriptor(int64_t offsetInFile, unsigned size, + unsigned frameSize, unsigned frameDuration, + struct timeval presentationTime); + + ChunkDescriptor* extendChunk(int64_t newOffsetInFile, unsigned newSize, + unsigned newFrameSize, + unsigned newFrameDuration, + struct timeval newPresentationTime); + // this may end up allocating a new chunk instead +public: + ChunkDescriptor* fNextChunk; + int64_t fOffsetInFile; + unsigned fNumFrames; + unsigned fFrameSize; + unsigned fFrameDuration; + struct timeval fPresentationTime; // of the start of the data +}; + +class SubsessionBuffer { +public: + SubsessionBuffer(unsigned bufferSize) + : fBufferSize(bufferSize) { + reset(); + fData = new unsigned char[bufferSize]; + } + virtual ~SubsessionBuffer() { delete[] fData; } + void reset() { fBytesInUse = 0; } + void addBytes(unsigned numBytes) { fBytesInUse += numBytes; } + + unsigned char* dataStart() { return &fData[0]; } + unsigned char* dataEnd() { return &fData[fBytesInUse]; } + unsigned bytesInUse() const { return fBytesInUse; } + unsigned bytesAvailable() const { return fBufferSize - fBytesInUse; } + + void setPresentationTime(struct timeval const& presentationTime) { + fPresentationTime = presentationTime; + } + struct timeval const& presentationTime() const {return fPresentationTime;} + +private: + unsigned fBufferSize; + struct timeval fPresentationTime; + unsigned char* fData; + unsigned fBytesInUse; +}; + +class SyncFrame { +public: + SyncFrame(unsigned frameNum); + +public: + class SyncFrame *nextSyncFrame; + unsigned sfFrameNum; +}; + +// A 64-bit counter, used below: +class Count64 { +public: + Count64() + : hi(0), lo(0) { + } + + void operator+=(unsigned arg); + + u_int32_t hi, lo; +}; + +class SubsessionIOState { +public: + SubsessionIOState(QuickTimeFileSink& sink, MediaSubsession& subsession); + virtual ~SubsessionIOState(); + + Boolean setQTstate(); + void setFinalQTstate(); + + void afterGettingFrame(unsigned packetDataSize, + struct timeval presentationTime); + void onSourceClosure(); + + Boolean syncOK(struct timeval presentationTime); + // returns true iff data is usable despite a sync check + + static void setHintTrack(SubsessionIOState* hintedTrack, + SubsessionIOState* hintTrack); + Boolean isHintTrack() const { return fTrackHintedByUs != NULL; } + Boolean hasHintTrack() const { return fHintTrackForUs != NULL; } + + UsageEnvironment& envir() const { return fOurSink.envir(); } + +public: + static unsigned fCurrentTrackNumber; + unsigned fTrackID; + SubsessionIOState* fHintTrackForUs; SubsessionIOState* fTrackHintedByUs; + + SubsessionBuffer *fBuffer, *fPrevBuffer; + QuickTimeFileSink& fOurSink; + MediaSubsession& fOurSubsession; + + unsigned short fLastPacketRTPSeqNum; + Boolean fOurSourceIsActive; + + Boolean fHaveBeenSynced; // used in synchronizing with other streams + struct timeval fSyncTime; + + Boolean fQTEnableTrack; + unsigned fQTcomponentSubtype; + char const* fQTcomponentName; + typedef unsigned (QuickTimeFileSink::*atomCreationFunc)(); + atomCreationFunc fQTMediaInformationAtomCreator; + atomCreationFunc fQTMediaDataAtomCreator; + char const* fQTAudioDataType; + unsigned short fQTSoundSampleVersion; + unsigned fQTTimeScale; + unsigned fQTTimeUnitsPerSample; + unsigned fQTBytesPerFrame; + unsigned fQTSamplesPerFrame; + // These next fields are derived from the ones above, + // plus the information from each chunk: + unsigned fQTTotNumSamples; + unsigned fQTDurationM; // in media time units + unsigned fQTDurationT; // in track time units + int64_t fTKHD_durationPosn; + // position of the duration in the output 'tkhd' atom + unsigned fQTInitialOffsetDuration; + // if there's a pause at the beginning + + ChunkDescriptor *fHeadChunk, *fTailChunk; + unsigned fNumChunks; + SyncFrame *fHeadSyncFrame, *fTailSyncFrame; + + // Counters to be used in the hint track's 'udta'/'hinf' atom; + struct hinf { + Count64 trpy; + Count64 nump; + Count64 tpyl; + // Is 'maxr' needed? Computing this would be a PITA. ##### + Count64 dmed; + Count64 dimm; + // 'drep' is always 0 + // 'tmin' and 'tmax' are always 0 + unsigned pmax; + unsigned dmax; + } fHINF; + +private: + void useFrame(SubsessionBuffer& buffer); + void useFrameForHinting(unsigned frameSize, + struct timeval presentationTime, + unsigned startSampleNumber); + + // used by the above two routines: + unsigned useFrame1(unsigned sourceDataSize, + struct timeval presentationTime, + unsigned frameDuration, int64_t destFileOffset); + // returns the number of samples in this data + +private: + // A structure used for temporarily storing frame state: + struct { + unsigned frameSize; + struct timeval presentationTime; + int64_t destFileOffset; // used for non-hint tracks only + + // The remaining fields are used for hint tracks only: + unsigned startSampleNumber; + unsigned short seqNum; + unsigned rtpHeader; + unsigned char numSpecialHeaders; // used when our RTP source has special headers + unsigned specialHeaderBytesLength; // ditto + unsigned char specialHeaderBytes[SPECIAL_HEADER_BUFFER_SIZE]; // ditto + unsigned packetSizes[256]; + } fPrevFrameState; +}; + + +////////// QuickTimeFileSink implementation ////////// + +QuickTimeFileSink::QuickTimeFileSink(UsageEnvironment& env, + MediaSession& inputSession, + char const* outputFileName, + unsigned bufferSize, + unsigned short movieWidth, + unsigned short movieHeight, + unsigned movieFPS, + Boolean packetLossCompensate, + Boolean syncStreams, + Boolean generateHintTracks, + Boolean generateMP4Format) + : Medium(env), fInputSession(inputSession), + fBufferSize(bufferSize), fPacketLossCompensate(packetLossCompensate), + fSyncStreams(syncStreams), fGenerateMP4Format(generateMP4Format), + fAreCurrentlyBeingPlayed(False), + fLargestRTPtimestampFrequency(0), + fNumSubsessions(0), fNumSyncedSubsessions(0), + fHaveCompletedOutputFile(False), + fMovieWidth(movieWidth), fMovieHeight(movieHeight), + fMovieFPS(movieFPS), fMaxTrackDurationM(0) { + fOutFid = OpenOutputFile(env, outputFileName); + if (fOutFid == NULL) return; + + fNewestSyncTime.tv_sec = fNewestSyncTime.tv_usec = 0; + fFirstDataTime.tv_sec = fFirstDataTime.tv_usec = (unsigned)(~0); + + // Set up I/O state for each input subsession: + MediaSubsessionIterator iter(fInputSession); + MediaSubsession* subsession; + while ((subsession = iter.next()) != NULL) { + // Ignore subsessions without a data source: + FramedSource* subsessionSource = subsession->readSource(); + if (subsessionSource == NULL) continue; + + // If "subsession's" SDP description specified screen dimension + // or frame rate parameters, then use these. (Note that this must + // be done before the call to "setQTState()" below.) + if (subsession->videoWidth() != 0) { + fMovieWidth = subsession->videoWidth(); + } + if (subsession->videoHeight() != 0) { + fMovieHeight = subsession->videoHeight(); + } + if (subsession->videoFPS() != 0) { + fMovieFPS = subsession->videoFPS(); + } + + SubsessionIOState* ioState + = new SubsessionIOState(*this, *subsession); + if (ioState == NULL || !ioState->setQTstate()) { + // We're not able to output a QuickTime track for this subsession + delete ioState; ioState = NULL; + continue; + } + subsession->miscPtr = (void*)ioState; + + if (generateHintTracks) { + // Also create a hint track for this track: + SubsessionIOState* hintTrack + = new SubsessionIOState(*this, *subsession); + SubsessionIOState::setHintTrack(ioState, hintTrack); + if (!hintTrack->setQTstate()) { + delete hintTrack; + SubsessionIOState::setHintTrack(ioState, NULL); + } + } + + // Also set a 'BYE' handler for this subsession's RTCP instance: + if (subsession->rtcpInstance() != NULL) { + subsession->rtcpInstance()->setByeHandler(onRTCPBye, ioState); + } + + unsigned rtpTimestampFrequency = subsession->rtpTimestampFrequency(); + if (rtpTimestampFrequency > fLargestRTPtimestampFrequency) { + fLargestRTPtimestampFrequency = rtpTimestampFrequency; + } + + ++fNumSubsessions; + } + + // Use the current time as the file's creation and modification + // time. Use Apple's time format: seconds (UTC) since January 1, 1904 + + gettimeofday(&fStartTime, NULL); + fAppleCreationTime = fStartTime.tv_sec - 0x83da4f80; + + // Begin by writing a "mdat" atom at the start of the file. + // (Later, when we've finished copying data to the file, we'll come + // back and fill in its size.) + fMDATposition = TellFile64(fOutFid); + addAtomHeader64("mdat"); + // add 64Bit offset + fMDATposition += 8; +} + +QuickTimeFileSink::~QuickTimeFileSink() { + completeOutputFile(); + + // Then, stop streaming and delete each active "SubsessionIOState": + MediaSubsessionIterator iter(fInputSession); + MediaSubsession* subsession; + while ((subsession = iter.next()) != NULL) { + if (subsession->readSource() != NULL) subsession->readSource()->stopGettingFrames(); + + SubsessionIOState* ioState + = (SubsessionIOState*)(subsession->miscPtr); + if (ioState == NULL) continue; + + delete ioState->fHintTrackForUs; // if any + delete ioState; + } + + // Finally, close our output file: + CloseOutputFile(fOutFid); +} + +QuickTimeFileSink* +QuickTimeFileSink::createNew(UsageEnvironment& env, + MediaSession& inputSession, + char const* outputFileName, + unsigned bufferSize, + unsigned short movieWidth, + unsigned short movieHeight, + unsigned movieFPS, + Boolean packetLossCompensate, + Boolean syncStreams, + Boolean generateHintTracks, + Boolean generateMP4Format) { + QuickTimeFileSink* newSink = + new QuickTimeFileSink(env, inputSession, outputFileName, bufferSize, movieWidth, movieHeight, movieFPS, + packetLossCompensate, syncStreams, generateHintTracks, generateMP4Format); + if (newSink == NULL || newSink->fOutFid == NULL) { + Medium::close(newSink); + return NULL; + } + + return newSink; +} + +void QuickTimeFileSink +::noteRecordedFrame(MediaSubsession& /*inputSubsession*/, + unsigned /*packetDataSize*/, struct timeval const& /*presentationTime*/) { + // Default implementation: Do nothing +} + +Boolean QuickTimeFileSink::startPlaying(afterPlayingFunc* afterFunc, + void* afterClientData) { + // Make sure we're not already being played: + if (fAreCurrentlyBeingPlayed) { + envir().setResultMsg("This sink has already been played"); + return False; + } + + fAreCurrentlyBeingPlayed = True; + fAfterFunc = afterFunc; + fAfterClientData = afterClientData; + + return continuePlaying(); +} + +Boolean QuickTimeFileSink::continuePlaying() { + // Run through each of our input session's 'subsessions', + // asking for a frame from each one: + Boolean haveActiveSubsessions = False; + MediaSubsessionIterator iter(fInputSession); + MediaSubsession* subsession; + while ((subsession = iter.next()) != NULL) { + FramedSource* subsessionSource = subsession->readSource(); + if (subsessionSource == NULL) continue; + + if (subsessionSource->isCurrentlyAwaitingData()) continue; + + SubsessionIOState* ioState + = (SubsessionIOState*)(subsession->miscPtr); + if (ioState == NULL) continue; + + haveActiveSubsessions = True; + unsigned char* toPtr = ioState->fBuffer->dataEnd(); + unsigned toSize = ioState->fBuffer->bytesAvailable(); + subsessionSource->getNextFrame(toPtr, toSize, + afterGettingFrame, ioState, + onSourceClosure, ioState); + } + if (!haveActiveSubsessions) { + envir().setResultMsg("No subsessions are currently active"); + return False; + } + + return True; +} + +void QuickTimeFileSink +::afterGettingFrame(void* clientData, unsigned packetDataSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned /*durationInMicroseconds*/) { + SubsessionIOState* ioState = (SubsessionIOState*)clientData; + if (!ioState->syncOK(presentationTime)) { + // Ignore this data: + ioState->fOurSink.continuePlaying(); + return; + } + if (numTruncatedBytes > 0) { + ioState->envir() << "QuickTimeFileSink::afterGettingFrame(): The input frame data was too large for our buffer. " + << numTruncatedBytes + << " bytes of trailing data was dropped! Correct this by increasing the \"bufferSize\" parameter in the \"createNew()\" call.\n"; + } + ioState->afterGettingFrame(packetDataSize, presentationTime); +} + +void QuickTimeFileSink::onSourceClosure(void* clientData) { + SubsessionIOState* ioState = (SubsessionIOState*)clientData; + ioState->onSourceClosure(); +} + +void QuickTimeFileSink::onSourceClosure1() { + // Check whether *all* of the subsession sources have closed. + // If not, do nothing for now: + MediaSubsessionIterator iter(fInputSession); + MediaSubsession* subsession; + while ((subsession = iter.next()) != NULL) { + SubsessionIOState* ioState + = (SubsessionIOState*)(subsession->miscPtr); + if (ioState == NULL) continue; + + if (ioState->fOurSourceIsActive) return; // this source hasn't closed + } + + completeOutputFile(); + + // Call our specified 'after' function: + if (fAfterFunc != NULL) { + (*fAfterFunc)(fAfterClientData); + } +} + +void QuickTimeFileSink::onRTCPBye(void* clientData) { + SubsessionIOState* ioState = (SubsessionIOState*)clientData; + + struct timeval timeNow; + gettimeofday(&timeNow, NULL); + unsigned secsDiff + = timeNow.tv_sec - ioState->fOurSink.fStartTime.tv_sec; + + MediaSubsession& subsession = ioState->fOurSubsession; + ioState->envir() << "Received RTCP \"BYE\" on \"" + << subsession.mediumName() + << "/" << subsession.codecName() + << "\" subsession (after " + << secsDiff << " seconds)\n"; + + // Handle the reception of a RTCP "BYE" as if the source had closed: + ioState->onSourceClosure(); +} + +static Boolean timevalGE(struct timeval const& tv1, + struct timeval const& tv2) { + return (unsigned)tv1.tv_sec > (unsigned)tv2.tv_sec + || (tv1.tv_sec == tv2.tv_sec + && (unsigned)tv1.tv_usec >= (unsigned)tv2.tv_usec); +} + +void QuickTimeFileSink::completeOutputFile() { + if (fHaveCompletedOutputFile || fOutFid == NULL) return; + + // Begin by filling in the initial "mdat" atom with the current + // file size: + int64_t curFileSize = TellFile64(fOutFid); + setWord64(fMDATposition, (u_int64_t)curFileSize); + + // Then, note the time of the first received data: + MediaSubsessionIterator iter(fInputSession); + MediaSubsession* subsession; + while ((subsession = iter.next()) != NULL) { + SubsessionIOState* ioState + = (SubsessionIOState*)(subsession->miscPtr); + if (ioState == NULL) continue; + + ChunkDescriptor* const headChunk = ioState->fHeadChunk; + if (headChunk != NULL + && timevalGE(fFirstDataTime, headChunk->fPresentationTime)) { + fFirstDataTime = headChunk->fPresentationTime; + } + } + + // Then, update the QuickTime-specific state for each active track: + iter.reset(); + while ((subsession = iter.next()) != NULL) { + SubsessionIOState* ioState + = (SubsessionIOState*)(subsession->miscPtr); + if (ioState == NULL) continue; + + ioState->setFinalQTstate(); + // Do the same for a hint track (if any): + if (ioState->hasHintTrack()) { + ioState->fHintTrackForUs->setFinalQTstate(); + } + } + + if (fGenerateMP4Format) { + // Begin with a "ftyp" atom: + addAtom_ftyp(); + } + + // Then, add a "moov" atom for the file metadata: + addAtom_moov(); + + // We're done: + fHaveCompletedOutputFile = True; +} + + +////////// SubsessionIOState, ChunkDescriptor implementation /////////// + +unsigned SubsessionIOState::fCurrentTrackNumber = 0; + +SubsessionIOState::SubsessionIOState(QuickTimeFileSink& sink, + MediaSubsession& subsession) + : fHintTrackForUs(NULL), fTrackHintedByUs(NULL), + fOurSink(sink), fOurSubsession(subsession), + fLastPacketRTPSeqNum(0), fHaveBeenSynced(False), fQTTotNumSamples(0), + fHeadChunk(NULL), fTailChunk(NULL), fNumChunks(0), + fHeadSyncFrame(NULL), fTailSyncFrame(NULL) { + fTrackID = ++fCurrentTrackNumber; + + fBuffer = new SubsessionBuffer(fOurSink.fBufferSize); + fPrevBuffer = sink.fPacketLossCompensate + ? new SubsessionBuffer(fOurSink.fBufferSize) : NULL; + + FramedSource* subsessionSource = subsession.readSource(); + fOurSourceIsActive = subsessionSource != NULL; + + fPrevFrameState.presentationTime.tv_sec = 0; + fPrevFrameState.presentationTime.tv_usec = 0; + fPrevFrameState.seqNum = 0; +} + +SubsessionIOState::~SubsessionIOState() { + delete fBuffer; delete fPrevBuffer; + + // Delete the list of chunk descriptors: + ChunkDescriptor* chunk = fHeadChunk; + while (chunk != NULL) { + ChunkDescriptor* next = chunk->fNextChunk; + delete chunk; + chunk = next; + } + + // Delete the list of sync frames: + SyncFrame* syncFrame = fHeadSyncFrame; + while (syncFrame != NULL) { + SyncFrame* next = syncFrame->nextSyncFrame; + delete syncFrame; + syncFrame = next; + } +} + +Boolean SubsessionIOState::setQTstate() { + char const* noCodecWarning1 = "Warning: We don't implement a QuickTime "; + char const* noCodecWarning2 = " Media Data Type for the \""; + char const* noCodecWarning3 = "\" track, so we'll insert a dummy \"????\" Media Data Atom instead. A separate, codec-specific editing pass will be needed before this track can be played.\n"; + + do { + fQTEnableTrack = True; // enable this track in the movie by default + fQTTimeScale = fOurSubsession.rtpTimestampFrequency(); // by default + fQTTimeUnitsPerSample = 1; // by default + fQTBytesPerFrame = 0; + // by default - indicates that the whole packet data is a frame + fQTSamplesPerFrame = 1; // by default + + // Make sure our subsession's medium is one that we know how to + // represent in a QuickTime file: + if (isHintTrack()) { + // Hint tracks are treated specially + fQTEnableTrack = False; // hint tracks are marked as inactive + fQTcomponentSubtype = fourChar('h','i','n','t'); + fQTcomponentName = "hint media handler"; + fQTMediaInformationAtomCreator = &QuickTimeFileSink::addAtom_gmhd; + fQTMediaDataAtomCreator = &QuickTimeFileSink::addAtom_rtp; + } else if (strcmp(fOurSubsession.mediumName(), "audio") == 0) { + fQTcomponentSubtype = fourChar('s','o','u','n'); + fQTcomponentName = "Apple Sound Media Handler"; + fQTMediaInformationAtomCreator = &QuickTimeFileSink::addAtom_smhd; + fQTMediaDataAtomCreator + = &QuickTimeFileSink::addAtom_soundMediaGeneral; // by default + fQTSoundSampleVersion = 0; // by default + + // Make sure that our subsession's codec is one that we can handle: + if (strcmp(fOurSubsession.codecName(), "X-QT") == 0 || + strcmp(fOurSubsession.codecName(), "X-QUICKTIME") == 0) { + fQTMediaDataAtomCreator = &QuickTimeFileSink::addAtom_genericMedia; + } else if (strcmp(fOurSubsession.codecName(), "PCMU") == 0) { + fQTAudioDataType = "ulaw"; + fQTBytesPerFrame = 1; + } else if (strcmp(fOurSubsession.codecName(), "GSM") == 0) { + fQTAudioDataType = "agsm"; + fQTBytesPerFrame = 33; + fQTSamplesPerFrame = 160; + } else if (strcmp(fOurSubsession.codecName(), "PCMA") == 0) { + fQTAudioDataType = "alaw"; + fQTBytesPerFrame = 1; + } else if (strcmp(fOurSubsession.codecName(), "QCELP") == 0) { + fQTMediaDataAtomCreator = &QuickTimeFileSink::addAtom_Qclp; + fQTSamplesPerFrame = 160; + } else if (strcmp(fOurSubsession.codecName(), "MPEG4-GENERIC") == 0 || + strcmp(fOurSubsession.codecName(), "MP4A-LATM") == 0) { + fQTMediaDataAtomCreator = &QuickTimeFileSink::addAtom_mp4a; + fQTTimeUnitsPerSample = 1024; // QT considers each frame to be a 'sample' + // The time scale (frequency) comes from the 'config' information. + // It might be different from the RTP timestamp frequency (e.g., aacPlus). + unsigned frequencyFromConfig + = samplingFrequencyFromAudioSpecificConfig(fOurSubsession.fmtp_config()); + if (frequencyFromConfig != 0) fQTTimeScale = frequencyFromConfig; + } else { + envir() << noCodecWarning1 << "Audio" << noCodecWarning2 + << fOurSubsession.codecName() << noCodecWarning3; + fQTMediaDataAtomCreator = &QuickTimeFileSink::addAtom_dummy; + fQTEnableTrack = False; // disable this track in the movie + } + } else if (strcmp(fOurSubsession.mediumName(), "video") == 0) { + fQTcomponentSubtype = fourChar('v','i','d','e'); + fQTcomponentName = "Apple Video Media Handler"; + fQTMediaInformationAtomCreator = &QuickTimeFileSink::addAtom_vmhd; + + // Make sure that our subsession's codec is one that we can handle: + if (strcmp(fOurSubsession.codecName(), "X-QT") == 0 || + strcmp(fOurSubsession.codecName(), "X-QUICKTIME") == 0) { + fQTMediaDataAtomCreator = &QuickTimeFileSink::addAtom_genericMedia; + } else if (strcmp(fOurSubsession.codecName(), "H263-1998") == 0 || + strcmp(fOurSubsession.codecName(), "H263-2000") == 0) { + fQTMediaDataAtomCreator = &QuickTimeFileSink::addAtom_h263; + fQTTimeScale = 600; + fQTTimeUnitsPerSample = fQTTimeScale/fOurSink.fMovieFPS; + } else if (strcmp(fOurSubsession.codecName(), "H264") == 0) { + fQTMediaDataAtomCreator = &QuickTimeFileSink::addAtom_avc1; + fQTTimeScale = 600; + fQTTimeUnitsPerSample = fQTTimeScale/fOurSink.fMovieFPS; + } else if (strcmp(fOurSubsession.codecName(), "MP4V-ES") == 0) { + fQTMediaDataAtomCreator = &QuickTimeFileSink::addAtom_mp4v; + fQTTimeScale = 600; + fQTTimeUnitsPerSample = fQTTimeScale/fOurSink.fMovieFPS; + } else { + envir() << noCodecWarning1 << "Video" << noCodecWarning2 + << fOurSubsession.codecName() << noCodecWarning3; + fQTMediaDataAtomCreator = &QuickTimeFileSink::addAtom_dummy; + fQTEnableTrack = False; // disable this track in the movie + } + } else { + envir() << "Warning: We don't implement a QuickTime Media Handler for media type \"" + << fOurSubsession.mediumName() << "\""; + break; + } + +#ifdef QT_SUPPORT_PARTIALLY_ONLY + envir() << "Warning: We don't have sufficient codec-specific information (e.g., sample sizes) to fully generate the \"" + << fOurSubsession.mediumName() << "/" << fOurSubsession.codecName() + << "\" track, so we'll disable this track in the movie. A separate, codec-specific editing pass will be needed before this track can be played\n"; + fQTEnableTrack = False; // disable this track in the movie +#endif + + return True; + } while (0); + + envir() << ", so a track for the \"" << fOurSubsession.mediumName() + << "/" << fOurSubsession.codecName() + << "\" subsession will not be included in the output QuickTime file\n"; + return False; +} + +void SubsessionIOState::setFinalQTstate() { + // Compute derived parameters, by running through the list of chunks: + fQTDurationT = 0; + + ChunkDescriptor* chunk = fHeadChunk; + while (chunk != NULL) { + unsigned const numFrames = chunk->fNumFrames; + unsigned const dur = numFrames*chunk->fFrameDuration; + fQTDurationT += dur; + + chunk = chunk->fNextChunk; + } + + // Convert this duration from track to movie time scale: + double scaleFactor = fOurSink.movieTimeScale()/(double)fQTTimeScale; + fQTDurationM = (unsigned)(fQTDurationT*scaleFactor); + + if (fQTDurationM > fOurSink.fMaxTrackDurationM) { + fOurSink.fMaxTrackDurationM = fQTDurationM; + } +} + +void SubsessionIOState::afterGettingFrame(unsigned packetDataSize, + struct timeval presentationTime) { + // Begin by checking whether there was a gap in the RTP stream. + // If so, try to compensate for this (if desired): + if (fOurSubsession.rtpSource() != NULL) { // we have a RTP stream + unsigned short rtpSeqNum + = fOurSubsession.rtpSource()->curPacketRTPSeqNum(); + if (fOurSink.fPacketLossCompensate && fPrevBuffer->bytesInUse() > 0) { + short seqNumGap = rtpSeqNum - fLastPacketRTPSeqNum; + for (short i = 1; i < seqNumGap; ++i) { + // Insert a copy of the previous frame, to compensate for the loss: + useFrame(*fPrevBuffer); + } + } + fLastPacketRTPSeqNum = rtpSeqNum; + } + + // Now, continue working with the frame that we just got + fOurSink.noteRecordedFrame(fOurSubsession, packetDataSize, presentationTime); + + if (fBuffer->bytesInUse() == 0) { + fBuffer->setPresentationTime(presentationTime); + } + fBuffer->addBytes(packetDataSize); + + // If our RTP source is a "QuickTimeGenericRTPSource", then + // use its 'qtState' to set some parameters that we need: + if (fOurSubsession.rtpSource() != NULL // we have a RTP stream + && fQTMediaDataAtomCreator == &QuickTimeFileSink::addAtom_genericMedia) { + QuickTimeGenericRTPSource* rtpSource + = (QuickTimeGenericRTPSource*)fOurSubsession.rtpSource(); + QuickTimeGenericRTPSource::QTState& qtState = rtpSource->qtState; + fQTTimeScale = qtState.timescale; + if (qtState.width != 0) { + fOurSink.fMovieWidth = qtState.width; + } + if (qtState.height != 0) { + fOurSink.fMovieHeight = qtState.height; + } + + // Also, if the media type in the "sdAtom" is one that we recognize + // to have a special parameters, then fix this here: + if (qtState.sdAtomSize >= 8) { + char const* atom = qtState.sdAtom; + unsigned mediaType = fourChar(atom[4],atom[5],atom[6],atom[7]); + switch (mediaType) { + case fourChar('a','g','s','m'): { + fQTBytesPerFrame = 33; + fQTSamplesPerFrame = 160; + break; + } + case fourChar('Q','c','l','p'): { + fQTBytesPerFrame = 35; + fQTSamplesPerFrame = 160; + break; + } + case fourChar('H','c','l','p'): { + fQTBytesPerFrame = 17; + fQTSamplesPerFrame = 160; + break; + } + case fourChar('h','2','6','3'): { + fQTTimeUnitsPerSample = fQTTimeScale/fOurSink.fMovieFPS; + break; + } + } + } + } else if (fQTMediaDataAtomCreator == &QuickTimeFileSink::addAtom_Qclp) { + // For QCELP data, make a note of the frame size (even though it's the + // same as the packet data size), because it varies depending on the + // 'rate' of the stream, and this size gets used later when setting up + // the 'Qclp' QuickTime atom: + fQTBytesPerFrame = packetDataSize; + } + + useFrame(*fBuffer); + if (fOurSink.fPacketLossCompensate) { + // Save this frame, in case we need it for recovery: + SubsessionBuffer* tmp = fPrevBuffer; // assert: != NULL + fPrevBuffer = fBuffer; + fBuffer = tmp; + } + fBuffer->reset(); // for the next input + + // Now, try getting more frames: + fOurSink.continuePlaying(); +} + +void SubsessionIOState::useFrame(SubsessionBuffer& buffer) { + unsigned char* const frameSource = buffer.dataStart(); + unsigned const frameSize = buffer.bytesInUse(); + struct timeval const& presentationTime = buffer.presentationTime(); + int64_t const destFileOffset = TellFile64(fOurSink.fOutFid); + unsigned sampleNumberOfFrameStart = fQTTotNumSamples + 1; + Boolean avcHack = fQTMediaDataAtomCreator == &QuickTimeFileSink::addAtom_avc1; + + // If we're not syncing streams, or this subsession is not video, then + // just give this frame a fixed duration: + if (!fOurSink.fSyncStreams + || fQTcomponentSubtype != fourChar('v','i','d','e')) { + unsigned const frameDuration = fQTTimeUnitsPerSample*fQTSamplesPerFrame; + unsigned frameSizeToUse = frameSize; + if (avcHack) frameSizeToUse += 4; // H.264/AVC gets the frame size prefix + + fQTTotNumSamples += useFrame1(frameSizeToUse, presentationTime, frameDuration, destFileOffset); + } else { + // For synced video streams, we use the difference between successive + // frames' presentation times as the 'frame duration'. So, record + // information about the *previous* frame: + struct timeval const& ppt = fPrevFrameState.presentationTime; //abbrev + if (ppt.tv_sec != 0 || ppt.tv_usec != 0) { + // There has been a previous frame. + double duration = (presentationTime.tv_sec - ppt.tv_sec) + + (presentationTime.tv_usec - ppt.tv_usec)/1000000.0; + if (duration < 0.0) duration = 0.0; + unsigned frameDuration + = (unsigned)((2*duration*fQTTimeScale+1)/2); // round + unsigned frameSizeToUse = fPrevFrameState.frameSize; + if (avcHack) frameSizeToUse += 4; // H.264/AVC gets the frame size prefix + + unsigned numSamples + = useFrame1(frameSizeToUse, ppt, frameDuration, fPrevFrameState.destFileOffset); + fQTTotNumSamples += numSamples; + sampleNumberOfFrameStart = fQTTotNumSamples + 1; + } + + if (avcHack && (*frameSource == H264_IDR_FRAME)) { + SyncFrame* newSyncFrame = new SyncFrame(fQTTotNumSamples + 1); + if (fTailSyncFrame == NULL) { + fHeadSyncFrame = newSyncFrame; + } else { + fTailSyncFrame->nextSyncFrame = newSyncFrame; + } + fTailSyncFrame = newSyncFrame; + } + + // Remember the current frame for next time: + fPrevFrameState.frameSize = frameSize; + fPrevFrameState.presentationTime = presentationTime; + fPrevFrameState.destFileOffset = destFileOffset; + } + + if (avcHack) fOurSink.addWord(frameSize); + + // Write the data into the file: + fwrite(frameSource, 1, frameSize, fOurSink.fOutFid); + + // If we have a hint track, then write to it also (only if we have a RTP stream): + if (hasHintTrack() && fOurSubsession.rtpSource() != NULL) { + // Because presentation times are used for RTP packet timestamps, + // we don't starting writing to the hint track until we've been synced: + if (!fHaveBeenSynced) { + fHaveBeenSynced = fOurSubsession.rtpSource()->hasBeenSynchronizedUsingRTCP(); + } + if (fHaveBeenSynced) { + fHintTrackForUs->useFrameForHinting(frameSize, presentationTime, + sampleNumberOfFrameStart); + } + } +} + +void SubsessionIOState::useFrameForHinting(unsigned frameSize, + struct timeval presentationTime, + unsigned startSampleNumber) { + // At this point, we have a single, combined frame - not individual packets. + // For the hint track, we need to split the frame back up into separate packets. + // However, for some RTP sources, then we also need to reuse the special + // header bytes that were at the start of each of the RTP packets. + Boolean hack263 = strcmp(fOurSubsession.codecName(), "H263-1998") == 0; + Boolean hackm4a_generic = strcmp(fOurSubsession.mediumName(), "audio") == 0 + && strcmp(fOurSubsession.codecName(), "MPEG4-GENERIC") == 0; + Boolean hackm4a_latm = strcmp(fOurSubsession.mediumName(), "audio") == 0 + && strcmp(fOurSubsession.codecName(), "MP4A-LATM") == 0; + Boolean hackm4a = hackm4a_generic || hackm4a_latm; + Boolean haveSpecialHeaders = (hack263 || hackm4a_generic); + + // If there has been a previous frame, then output a 'hint sample' for it. + // (We use the current frame's presentation time to compute the previous + // hint sample's duration.) + RTPSource* const rs = fOurSubsession.rtpSource(); // abbrev (ASSERT: != NULL) + struct timeval const& ppt = fPrevFrameState.presentationTime; //abbrev + if (ppt.tv_sec != 0 || ppt.tv_usec != 0) { + double duration = (presentationTime.tv_sec - ppt.tv_sec) + + (presentationTime.tv_usec - ppt.tv_usec)/1000000.0; + if (duration < 0.0) duration = 0.0; + unsigned msDuration = (unsigned)(duration*1000); // milliseconds + if (msDuration > fHINF.dmax) fHINF.dmax = msDuration; + unsigned hintSampleDuration + = (unsigned)((2*duration*fQTTimeScale+1)/2); // round + if (hackm4a) { + // Because multiple AAC frames can appear in a RTP packet, the presentation + // times of the second and subsequent frames will not be accurate. + // So, use the known "hintSampleDuration" instead: + hintSampleDuration = fTrackHintedByUs->fQTTimeUnitsPerSample; + + // Also, if the 'time scale' was different from the RTP timestamp frequency, + // (as can happen with aacPlus), then we need to scale "hintSampleDuration" + // accordingly: + if (fTrackHintedByUs->fQTTimeScale != fOurSubsession.rtpTimestampFrequency()) { + unsigned const scalingFactor + = fOurSubsession.rtpTimestampFrequency()/fTrackHintedByUs->fQTTimeScale ; + hintSampleDuration *= scalingFactor; + } + } + + int64_t const hintSampleDestFileOffset = TellFile64(fOurSink.fOutFid); + + unsigned const maxPacketSize = 1450; + unsigned short numPTEntries + = (fPrevFrameState.frameSize + (maxPacketSize-1))/maxPacketSize; // normal case + unsigned char* immediateDataPtr = NULL; + unsigned immediateDataBytesRemaining = 0; + if (haveSpecialHeaders) { // special case + numPTEntries = fPrevFrameState.numSpecialHeaders; + immediateDataPtr = fPrevFrameState.specialHeaderBytes; + immediateDataBytesRemaining + = fPrevFrameState.specialHeaderBytesLength; + } + unsigned hintSampleSize + = fOurSink.addHalfWord(numPTEntries);// Entry count + hintSampleSize += fOurSink.addHalfWord(0x0000); // Reserved + + unsigned offsetWithinSample = 0; + for (unsigned i = 0; i < numPTEntries; ++i) { + // Output a Packet Table entry (representing a single RTP packet): + unsigned short numDTEntries = 1; + unsigned short seqNum = fPrevFrameState.seqNum++; + // Note: This assumes that the input stream had no packets lost ##### + unsigned rtpHeader = fPrevFrameState.rtpHeader; + if (i+1 < numPTEntries) { + // This is not the last RTP packet, so clear the marker bit: + rtpHeader &=~ (1<<23); + } + unsigned dataFrameSize = (i+1 < numPTEntries) + ? maxPacketSize : fPrevFrameState.frameSize - i*maxPacketSize; // normal case + unsigned sampleNumber = fPrevFrameState.startSampleNumber; + + unsigned char immediateDataLen = 0; + if (haveSpecialHeaders) { // special case + ++numDTEntries; // to include a Data Table entry for the special hdr + if (immediateDataBytesRemaining > 0) { + if (hack263) { + immediateDataLen = *immediateDataPtr++; + --immediateDataBytesRemaining; + if (immediateDataLen > immediateDataBytesRemaining) { + // shouldn't happen (length byte was bad) + immediateDataLen = immediateDataBytesRemaining; + } + } else { + immediateDataLen = fPrevFrameState.specialHeaderBytesLength; + } + } + dataFrameSize = fPrevFrameState.packetSizes[i] - immediateDataLen; + + if (hack263) { + Boolean PbitSet + = immediateDataLen >= 1 && (immediateDataPtr[0]&0x4) != 0; + if (PbitSet) { + offsetWithinSample += 2; // to omit the two leading 0 bytes + } + } + } + + // Output the Packet Table: + hintSampleSize += fOurSink.addWord(0); // Relative transmission time + hintSampleSize += fOurSink.addWord(rtpHeader|seqNum); + // RTP header info + RTP sequence number + hintSampleSize += fOurSink.addHalfWord(0x0000); // Flags + hintSampleSize += fOurSink.addHalfWord(numDTEntries); // Entry count + unsigned totalPacketSize = 0; + + // Output the Data Table: + if (haveSpecialHeaders) { + // use the "Immediate Data" format (1): + hintSampleSize += fOurSink.addByte(1); // Source + unsigned char len = immediateDataLen > 14 ? 14 : immediateDataLen; + hintSampleSize += fOurSink.addByte(len); // Length + totalPacketSize += len; fHINF.dimm += len; + unsigned char j; + for (j = 0; j < len; ++j) { + hintSampleSize += fOurSink.addByte(immediateDataPtr[j]); // Data + } + for (j = len; j < 14; ++j) { + hintSampleSize += fOurSink.addByte(0); // Data (padding) + } + + immediateDataPtr += immediateDataLen; + immediateDataBytesRemaining -= immediateDataLen; + } + // use the "Sample Data" format (2): + hintSampleSize += fOurSink.addByte(2); // Source + hintSampleSize += fOurSink.addByte(0); // Track ref index + hintSampleSize += fOurSink.addHalfWord(dataFrameSize); // Length + totalPacketSize += dataFrameSize; fHINF.dmed += dataFrameSize; + hintSampleSize += fOurSink.addWord(sampleNumber); // Sample number + hintSampleSize += fOurSink.addWord(offsetWithinSample); // Offset + // Get "bytes|samples per compression block" from the hinted track: + unsigned short const bytesPerCompressionBlock + = fTrackHintedByUs->fQTBytesPerFrame; + unsigned short const samplesPerCompressionBlock + = fTrackHintedByUs->fQTSamplesPerFrame; + hintSampleSize += fOurSink.addHalfWord(bytesPerCompressionBlock); + hintSampleSize += fOurSink.addHalfWord(samplesPerCompressionBlock); + + offsetWithinSample += dataFrameSize;// for the next iteration (if any) + + // Tally statistics for this packet: + fHINF.nump += 1; + fHINF.tpyl += totalPacketSize; + totalPacketSize += 12; // add in the size of the RTP header + fHINF.trpy += totalPacketSize; + if (totalPacketSize > fHINF.pmax) fHINF.pmax = totalPacketSize; + } + + // Make note of this completed hint sample frame: + fQTTotNumSamples += useFrame1(hintSampleSize, ppt, hintSampleDuration, + hintSampleDestFileOffset); + } + + // Remember this frame for next time: + fPrevFrameState.frameSize = frameSize; + fPrevFrameState.presentationTime = presentationTime; + fPrevFrameState.startSampleNumber = startSampleNumber; + fPrevFrameState.rtpHeader + = rs->curPacketMarkerBit()<<23 + | (rs->rtpPayloadFormat()&0x7F)<<16; + if (hack263) { + H263plusVideoRTPSource* rs_263 = (H263plusVideoRTPSource*)rs; + fPrevFrameState.numSpecialHeaders = rs_263->fNumSpecialHeaders; + fPrevFrameState.specialHeaderBytesLength = rs_263->fSpecialHeaderBytesLength; + unsigned i; + for (i = 0; i < rs_263->fSpecialHeaderBytesLength; ++i) { + fPrevFrameState.specialHeaderBytes[i] = rs_263->fSpecialHeaderBytes[i]; + } + for (i = 0; i < rs_263->fNumSpecialHeaders; ++i) { + fPrevFrameState.packetSizes[i] = rs_263->fPacketSizes[i]; + } + } else if (hackm4a_generic) { + // Synthesize a special header, so that this frame can be in its own RTP packet. + unsigned const sizeLength = fOurSubsession.attrVal_unsigned("sizelength"); + unsigned const indexLength = fOurSubsession.attrVal_unsigned("indexlength"); + if (sizeLength + indexLength != 16) { + envir() << "Warning: unexpected 'sizeLength' " << sizeLength + << " and 'indexLength' " << indexLength + << "seen when creating hint track\n"; + } + fPrevFrameState.numSpecialHeaders = 1; + fPrevFrameState.specialHeaderBytesLength = 4; + fPrevFrameState.specialHeaderBytes[0] = 0; // AU_headers_length (high byte) + fPrevFrameState.specialHeaderBytes[1] = 16; // AU_headers_length (low byte) + fPrevFrameState.specialHeaderBytes[2] = ((frameSize<>8; + fPrevFrameState.specialHeaderBytes[3] = (frameSize<extendChunk(destFileOffset, sourceDataSize, + frameSize, frameDuration, + presentationTime); + } + if (newTailChunk != fTailChunk) { + // This data created a new chunk, rather than extending the old one + ++fNumChunks; + fTailChunk = newTailChunk; + } + + return numSamples; +} + +void SubsessionIOState::onSourceClosure() { + fOurSourceIsActive = False; + fOurSink.onSourceClosure1(); +} + +Boolean SubsessionIOState::syncOK(struct timeval presentationTime) { + QuickTimeFileSink& s = fOurSink; // abbreviation + if (!s.fSyncStreams || fOurSubsession.rtpSource() == NULL) return True; // we don't care + + if (s.fNumSyncedSubsessions < s.fNumSubsessions) { + // Not all subsessions have yet been synced. Check whether ours was + // one of the unsynced ones, and, if so, whether it is now synced: + if (!fHaveBeenSynced) { + // We weren't synchronized before + if (fOurSubsession.rtpSource()->hasBeenSynchronizedUsingRTCP()) { + // H264 ? + if (fQTMediaDataAtomCreator == &QuickTimeFileSink::addAtom_avc1) { + // special case: audio + H264 video: wait until audio is in sync + if ((s.fNumSubsessions == 2) && (s.fNumSyncedSubsessions < (s.fNumSubsessions - 1))) return False; + + // if audio is in sync, wait for the next IDR frame to start + unsigned char* const frameSource = fBuffer->dataStart(); + if (*frameSource != H264_IDR_FRAME) return False; + } + // But now we are + fHaveBeenSynced = True; + fSyncTime = presentationTime; + ++s.fNumSyncedSubsessions; + + if (timevalGE(fSyncTime, s.fNewestSyncTime)) { + s.fNewestSyncTime = fSyncTime; + } + } + } + } + + // Check again whether all subsessions have been synced: + if (s.fNumSyncedSubsessions < s.fNumSubsessions) return False; + + // Allow this data if it is more recent than the newest sync time: + return timevalGE(presentationTime, s.fNewestSyncTime); +} + +void SubsessionIOState::setHintTrack(SubsessionIOState* hintedTrack, + SubsessionIOState* hintTrack) { + if (hintedTrack != NULL) hintedTrack->fHintTrackForUs = hintTrack; + if (hintTrack != NULL) hintTrack->fTrackHintedByUs = hintedTrack; +} + +SyncFrame::SyncFrame(unsigned frameNum) + : nextSyncFrame(NULL), sfFrameNum(frameNum) { +} + +void Count64::operator+=(unsigned arg) { + unsigned newLo = lo + arg; + if (newLo < lo) { // lo has overflowed + ++hi; + } + lo = newLo; +} + +ChunkDescriptor +::ChunkDescriptor(int64_t offsetInFile, unsigned size, + unsigned frameSize, unsigned frameDuration, + struct timeval presentationTime) + : fNextChunk(NULL), fOffsetInFile(offsetInFile), + fNumFrames(size/frameSize), + fFrameSize(frameSize), fFrameDuration(frameDuration), + fPresentationTime(presentationTime) { +} + +ChunkDescriptor* ChunkDescriptor +::extendChunk(int64_t newOffsetInFile, unsigned newSize, + unsigned newFrameSize, unsigned newFrameDuration, + struct timeval newPresentationTime) { + // First, check whether the new space is just at the end of this + // existing chunk: + if (newOffsetInFile == fOffsetInFile + fNumFrames*fFrameSize) { + // We can extend this existing chunk, provided that the frame size + // and frame duration have not changed: + if (newFrameSize == fFrameSize && newFrameDuration == fFrameDuration) { + fNumFrames += newSize/fFrameSize; + return this; + } + } + + // We'll allocate a new ChunkDescriptor, and link it to the end of us: + ChunkDescriptor* newDescriptor + = new ChunkDescriptor(newOffsetInFile, newSize, + newFrameSize, newFrameDuration, + newPresentationTime); + + fNextChunk = newDescriptor; + + return newDescriptor; +} + + +////////// QuickTime-specific implementation ////////// + +unsigned QuickTimeFileSink::addWord64(u_int64_t word) { + addByte((unsigned char)(word>>56)); addByte((unsigned char)(word>>48)); + addByte((unsigned char)(word>>40)); addByte((unsigned char)(word>>32)); + addByte((unsigned char)(word>>24)); addByte((unsigned char)(word>>16)); + addByte((unsigned char)(word>>8)); addByte((unsigned char)(word)); + + return 8; +} + +unsigned QuickTimeFileSink::addWord(unsigned word) { + addByte(word>>24); addByte(word>>16); + addByte(word>>8); addByte(word); + + return 4; +} + +unsigned QuickTimeFileSink::addHalfWord(unsigned short halfWord) { + addByte((unsigned char)(halfWord>>8)); addByte((unsigned char)halfWord); + + return 2; +} + +unsigned QuickTimeFileSink::addZeroWords(unsigned numWords) { + for (unsigned i = 0; i < numWords; ++i) { + addWord(0); + } + + return numWords*4; +} + +unsigned QuickTimeFileSink::add4ByteString(char const* str) { + addByte(str[0]); addByte(str[1]); addByte(str[2]); addByte(str[3]); + + return 4; +} + +unsigned QuickTimeFileSink::addArbitraryString(char const* str, + Boolean oneByteLength) { + unsigned size = 0; + if (oneByteLength) { + // Begin with a byte containing the string length: + unsigned strLength = strlen(str); + if (strLength >= 256) { + envir() << "QuickTimeFileSink::addArbitraryString(\"" + << str << "\") saw string longer than we know how to handle (" + << strLength << "\n"; + } + size += addByte((unsigned char)strLength); + } + + while (*str != '\0') { + size += addByte(*str++); + } + + return size; +} + +unsigned QuickTimeFileSink::addAtomHeader(char const* atomName) { + // Output a placeholder for the 4-byte size: + addWord(0); + + // Output the 4-byte atom name: + add4ByteString(atomName); + + return 8; +} + +unsigned QuickTimeFileSink::addAtomHeader64(char const* atomName) { + // Output 64Bit size marker + addWord(1); + + // Output the 4-byte atom name: + add4ByteString(atomName); + + addWord64(0); + + return 16; +} + +void QuickTimeFileSink::setWord(int64_t filePosn, unsigned size) { + do { + if (SeekFile64(fOutFid, filePosn, SEEK_SET) < 0) break; + addWord(size); + if (SeekFile64(fOutFid, 0, SEEK_END) < 0) break; // go back to where we were + + return; + } while (0); + + // One of the SeekFile64()s failed, probable because we're not a seekable file + envir() << "QuickTimeFileSink::setWord(): SeekFile64 failed (err " + << envir().getErrno() << ")\n"; +} + +void QuickTimeFileSink::setWord64(int64_t filePosn, u_int64_t size) { + do { + if (SeekFile64(fOutFid, filePosn, SEEK_SET) < 0) break; + addWord64(size); + if (SeekFile64(fOutFid, 0, SEEK_END) < 0) break; // go back to where we were + + return; + } while (0); + + // One of the SeekFile64()s failed, probable because we're not a seekable file + envir() << "QuickTimeFileSink::setWord64(): SeekFile64 failed (err " + << envir().getErrno() << ")\n"; +} + +// Methods for writing particular atoms. Note the following macros: + +#define addAtom(name) \ + unsigned QuickTimeFileSink::addAtom_##name() { \ + int64_t initFilePosn = TellFile64(fOutFid); \ + unsigned size = addAtomHeader("" #name "") + +#define addAtomEnd \ + setWord(initFilePosn, size); \ + return size; \ +} + +addAtom(ftyp); + size += add4ByteString("mp42"); + size += addWord(0x00000000); + size += add4ByteString("mp42"); + size += add4ByteString("isom"); +addAtomEnd; + +addAtom(moov); + size += addAtom_mvhd(); + + if (fGenerateMP4Format) { + size += addAtom_iods(); + } + + // Add a 'trak' atom for each subsession: + // (For some unknown reason, QuickTime Player (5.0 at least) + // doesn't display the movie correctly unless the audio track + // (if present) appears before the video track. So ensure this here.) + MediaSubsessionIterator iter(fInputSession); + MediaSubsession* subsession; + while ((subsession = iter.next()) != NULL) { + fCurrentIOState = (SubsessionIOState*)(subsession->miscPtr); + if (fCurrentIOState == NULL) continue; + if (strcmp(subsession->mediumName(), "audio") != 0) continue; + + size += addAtom_trak(); + + if (fCurrentIOState->hasHintTrack()) { + // This track has a hint track; output it also: + fCurrentIOState = fCurrentIOState->fHintTrackForUs; + size += addAtom_trak(); + } + } + iter.reset(); + while ((subsession = iter.next()) != NULL) { + fCurrentIOState = (SubsessionIOState*)(subsession->miscPtr); + if (fCurrentIOState == NULL) continue; + if (strcmp(subsession->mediumName(), "audio") == 0) continue; + + size += addAtom_trak(); + + if (fCurrentIOState->hasHintTrack()) { + // This track has a hint track; output it also: + fCurrentIOState = fCurrentIOState->fHintTrackForUs; + size += addAtom_trak(); + } + } +addAtomEnd; + +addAtom(mvhd); + size += addWord(0x00000000); // Version + Flags + size += addWord(fAppleCreationTime); // Creation time + size += addWord(fAppleCreationTime); // Modification time + + // For the "Time scale" field, use the largest RTP timestamp frequency + // that we saw in any of the subsessions. + size += addWord(movieTimeScale()); // Time scale + + unsigned const duration = fMaxTrackDurationM; + fMVHD_durationPosn = TellFile64(fOutFid); + size += addWord(duration); // Duration + + size += addWord(0x00010000); // Preferred rate + size += addWord(0x01000000); // Preferred volume + Reserved[0] + size += addZeroWords(2); // Reserved[1-2] + size += addWord(0x00010000); // matrix top left corner + size += addZeroWords(3); // matrix + size += addWord(0x00010000); // matrix center + size += addZeroWords(3); // matrix + size += addWord(0x40000000); // matrix bottom right corner + size += addZeroWords(6); // various time fields + size += addWord(SubsessionIOState::fCurrentTrackNumber+1);// Next track ID +addAtomEnd; + +addAtom(iods); + size += addWord(0x00000000); // Version + Flags + size += addWord(0x10808080); + size += addWord(0x07004FFF); + size += addWord(0xFF0FFFFF); +addAtomEnd; + +addAtom(trak); + size += addAtom_tkhd(); + + // If we're synchronizing the media streams (or are a hint track), + // add an edit list that helps do this: + if (fCurrentIOState->fHeadChunk != NULL + && (fSyncStreams || fCurrentIOState->isHintTrack())) { + size += addAtom_edts(); + } + + // If we're generating a hint track, add a 'tref' atom: + if (fCurrentIOState->isHintTrack()) size += addAtom_tref(); + + size += addAtom_mdia(); + + // If we're generating a hint track, add a 'udta' atom: + if (fCurrentIOState->isHintTrack()) size += addAtom_udta(); +addAtomEnd; + +addAtom(tkhd); + if (fCurrentIOState->fQTEnableTrack) { + size += addWord(0x0000000F); // Version + Flags + } else { + // Disable this track in the movie: + size += addWord(0x00000000); // Version + Flags + } + size += addWord(fAppleCreationTime); // Creation time + size += addWord(fAppleCreationTime); // Modification time + size += addWord(fCurrentIOState->fTrackID); // Track ID + size += addWord(0x00000000); // Reserved + + unsigned const duration = fCurrentIOState->fQTDurationM; // movie units + fCurrentIOState->fTKHD_durationPosn = TellFile64(fOutFid); + size += addWord(duration); // Duration + size += addZeroWords(3); // Reserved+Layer+Alternate grp + size += addWord(0x01000000); // Volume + Reserved + size += addWord(0x00010000); // matrix top left corner + size += addZeroWords(3); // matrix + size += addWord(0x00010000); // matrix center + size += addZeroWords(3); // matrix + size += addWord(0x40000000); // matrix bottom right corner + if (strcmp(fCurrentIOState->fOurSubsession.mediumName(), "video") == 0) { + size += addWord(fMovieWidth<<16); // Track width + size += addWord(fMovieHeight<<16); // Track height + } else { + size += addZeroWords(2); // not video: leave width and height fields zero + } +addAtomEnd; + +addAtom(edts); + size += addAtom_elst(); +addAtomEnd; + +#define addEdit1(duration,trackPosition) do { \ + unsigned trackDuration \ + = (unsigned) ((2*(duration)*movieTimeScale()+1)/2); \ + /* in movie time units */ \ + size += addWord(trackDuration); /* Track duration */ \ + totalDurationOfEdits += trackDuration; \ + size += addWord(trackPosition); /* Media time */ \ + size += addWord(0x00010000); /* Media rate (1x) */ \ + ++numEdits; \ +} while (0) +#define addEdit(duration) addEdit1((duration),editTrackPosition) +#define addEmptyEdit(duration) addEdit1((duration),(~0)) + +addAtom(elst); + size += addWord(0x00000000); // Version + Flags + + // Add a dummy "Number of entries" field + // (and remember its position). We'll fill this field in later: + int64_t numEntriesPosition = TellFile64(fOutFid); + size += addWord(0); // dummy for "Number of entries" + unsigned numEdits = 0; + unsigned totalDurationOfEdits = 0; // in movie time units + + // Run through our chunks, looking at their presentation times. + // From these, figure out the edits that need to be made to keep + // the track media data in sync with the presentation times. + + double const syncThreshold = 0.1; // 100 ms + // don't allow the track to get out of sync by more than this + + struct timeval editStartTime = fFirstDataTime; + unsigned editTrackPosition = 0; + unsigned currentTrackPosition = 0; + double trackDurationOfEdit = 0.0; + unsigned chunkDuration = 0; + + ChunkDescriptor* chunk = fCurrentIOState->fHeadChunk; + while (chunk != NULL) { + struct timeval const& chunkStartTime = chunk->fPresentationTime; + double movieDurationOfEdit + = (chunkStartTime.tv_sec - editStartTime.tv_sec) + + (chunkStartTime.tv_usec - editStartTime.tv_usec)/1000000.0; + trackDurationOfEdit = (currentTrackPosition-editTrackPosition) + / (double)(fCurrentIOState->fQTTimeScale); + + double outOfSync = movieDurationOfEdit - trackDurationOfEdit; + + if (outOfSync > syncThreshold) { + // The track's data is too short, so end this edit, add a new + // 'empty' edit after it, and start a new edit + // (at the current track posn.): + if (trackDurationOfEdit > 0.0) addEdit(trackDurationOfEdit); + addEmptyEdit(outOfSync); + + editStartTime = chunkStartTime; + editTrackPosition = currentTrackPosition; + } else if (outOfSync < -syncThreshold) { + // The track's data is too long, so end this edit, and start + // a new edit (pointing at the current track posn.): + if (movieDurationOfEdit > 0.0) addEdit(movieDurationOfEdit); + + editStartTime = chunkStartTime; + editTrackPosition = currentTrackPosition; + } + + // Note the duration of this chunk: + unsigned numChannels = fCurrentIOState->fOurSubsession.numChannels(); + chunkDuration = chunk->fNumFrames*chunk->fFrameDuration/numChannels; + currentTrackPosition += chunkDuration; + + chunk = chunk->fNextChunk; + } + + // Write out the final edit + trackDurationOfEdit + += (double)chunkDuration/fCurrentIOState->fQTTimeScale; + if (trackDurationOfEdit > 0.0) addEdit(trackDurationOfEdit); + + // Now go back and fill in the "Number of entries" field: + setWord(numEntriesPosition, numEdits); + + // Also, if the sum of all of the edit durations exceeds the + // track duration that we already computed (from sample durations), + // then reset the track duration to this new value: + if (totalDurationOfEdits > fCurrentIOState->fQTDurationM) { + fCurrentIOState->fQTDurationM = totalDurationOfEdits; + setWord(fCurrentIOState->fTKHD_durationPosn, totalDurationOfEdits); + + // Also, check whether the overall movie duration needs to change: + if (totalDurationOfEdits > fMaxTrackDurationM) { + fMaxTrackDurationM = totalDurationOfEdits; + setWord(fMVHD_durationPosn, totalDurationOfEdits); + } + + // Also, convert to track time scale: + double scaleFactor + = fCurrentIOState->fQTTimeScale/(double)movieTimeScale(); + fCurrentIOState->fQTDurationT + = (unsigned)(totalDurationOfEdits*scaleFactor); + } +addAtomEnd; + +addAtom(tref); + size += addAtom_hint(); +addAtomEnd; + +addAtom(hint); + SubsessionIOState* hintedTrack = fCurrentIOState->fTrackHintedByUs; + // Assert: hintedTrack != NULL + size += addWord(hintedTrack->fTrackID); +addAtomEnd; + +addAtom(mdia); + size += addAtom_mdhd(); + size += addAtom_hdlr(); + size += addAtom_minf(); +addAtomEnd; + +addAtom(mdhd); + size += addWord(0x00000000); // Version + Flags + size += addWord(fAppleCreationTime); // Creation time + size += addWord(fAppleCreationTime); // Modification time + + unsigned const timeScale = fCurrentIOState->fQTTimeScale; + size += addWord(timeScale); // Time scale + + unsigned const duration = fCurrentIOState->fQTDurationT; // track units + size += addWord(duration); // Duration + + size += addWord(0x00000000); // Language+Quality +addAtomEnd; + +addAtom(hdlr); + size += addWord(0x00000000); // Version + Flags + size += add4ByteString("mhlr"); // Component type + size += addWord(fCurrentIOState->fQTcomponentSubtype); + // Component subtype + size += add4ByteString("appl"); // Component manufacturer + size += addWord(0x00000000); // Component flags + size += addWord(0x00000000); // Component flags mask + size += addArbitraryString(fCurrentIOState->fQTcomponentName); + // Component name +addAtomEnd; + +addAtom(minf); + SubsessionIOState::atomCreationFunc mediaInformationAtomCreator + = fCurrentIOState->fQTMediaInformationAtomCreator; + size += (this->*mediaInformationAtomCreator)(); + size += addAtom_hdlr2(); + size += addAtom_dinf(); + size += addAtom_stbl(); +addAtomEnd; + +addAtom(smhd); + size += addZeroWords(2); // Version+Flags+Balance+Reserved +addAtomEnd; + +addAtom(vmhd); + size += addWord(0x00000001); // Version + Flags + size += addWord(0x00408000); // Graphics mode + Opcolor[red] + size += addWord(0x80008000); // Opcolor[green} + Opcolor[blue] +addAtomEnd; + +addAtom(gmhd); + size += addAtom_gmin(); +addAtomEnd; + +addAtom(gmin); + size += addWord(0x00000000); // Version + Flags + // The following fields probably aren't used for hint tracks, so just + // use values that I've seen in other files: + size += addWord(0x00408000); // Graphics mode + Opcolor (1st 2 bytes) + size += addWord(0x80008000); // Opcolor (last 4 bytes) + size += addWord(0x00000000); // Balance + Reserved +addAtomEnd; + +unsigned QuickTimeFileSink::addAtom_hdlr2() { + int64_t initFilePosn = TellFile64(fOutFid); + unsigned size = addAtomHeader("hdlr"); + size += addWord(0x00000000); // Version + Flags + size += add4ByteString("dhlr"); // Component type + size += add4ByteString("alis"); // Component subtype + size += add4ByteString("appl"); // Component manufacturer + size += addZeroWords(2); // Component flags+Component flags mask + size += addArbitraryString("Apple Alias Data Handler"); // Component name +addAtomEnd; + +addAtom(dinf); + size += addAtom_dref(); +addAtomEnd; + +addAtom(dref); + size += addWord(0x00000000); // Version + Flags + size += addWord(0x00000001); // Number of entries + size += addAtom_alis(); +addAtomEnd; + +addAtom(alis); + size += addWord(0x00000001); // Version + Flags +addAtomEnd; + +addAtom(stbl); + size += addAtom_stsd(); + size += addAtom_stts(); + if (fCurrentIOState->fQTcomponentSubtype == fourChar('v','i','d','e')) { + size += addAtom_stss(); // only for video streams + } + size += addAtom_stsc(); + size += addAtom_stsz(); + size += addAtom_co64(); +addAtomEnd; + +addAtom(stsd); + size += addWord(0x00000000); // Version+Flags + size += addWord(0x00000001); // Number of entries + SubsessionIOState::atomCreationFunc mediaDataAtomCreator + = fCurrentIOState->fQTMediaDataAtomCreator; + size += (this->*mediaDataAtomCreator)(); +addAtomEnd; + +unsigned QuickTimeFileSink::addAtom_genericMedia() { + int64_t initFilePosn = TellFile64(fOutFid); + + // Our source is assumed to be a "QuickTimeGenericRTPSource" + // Use its "sdAtom" state for our contents: + QuickTimeGenericRTPSource* rtpSource = (QuickTimeGenericRTPSource*) + fCurrentIOState->fOurSubsession.rtpSource(); + unsigned size = 0; + if (rtpSource != NULL) { + QuickTimeGenericRTPSource::QTState& qtState = rtpSource->qtState; + char const* from = qtState.sdAtom; + size = qtState.sdAtomSize; + for (unsigned i = 0; i < size; ++i) addByte(from[i]); + } +addAtomEnd; + +unsigned QuickTimeFileSink::addAtom_soundMediaGeneral() { + int64_t initFilePosn = TellFile64(fOutFid); + unsigned size = addAtomHeader(fCurrentIOState->fQTAudioDataType); + +// General sample description fields: + size += addWord(0x00000000); // Reserved + size += addWord(0x00000001); // Reserved+Data reference index +// Sound sample description fields: + unsigned short const version = fCurrentIOState->fQTSoundSampleVersion; + size += addWord(version<<16); // Version+Revision level + size += addWord(0x00000000); // Vendor + unsigned short numChannels + = (unsigned short)(fCurrentIOState->fOurSubsession.numChannels()); + size += addHalfWord(numChannels); // Number of channels + size += addHalfWord(0x0010); // Sample size + // size += addWord(0x00000000); // Compression ID+Packet size + size += addWord(0xfffe0000); // Compression ID+Packet size ##### + + unsigned const sampleRateFixedPoint = fCurrentIOState->fQTTimeScale << 16; + size += addWord(sampleRateFixedPoint); // Sample rate +addAtomEnd; + +unsigned QuickTimeFileSink::addAtom_Qclp() { + // The beginning of this atom looks just like a general Sound Media atom, + // except with a version field of 1: + int64_t initFilePosn = TellFile64(fOutFid); + fCurrentIOState->fQTAudioDataType = "Qclp"; + fCurrentIOState->fQTSoundSampleVersion = 1; + unsigned size = addAtom_soundMediaGeneral(); + + // Next, add the four fields that are particular to version 1: + // (Later, parameterize these #####) + size += addWord(0x000000a0); // samples per packet + size += addWord(0x00000000); // ??? + size += addWord(0x00000000); // ??? + size += addWord(0x00000002); // bytes per sample (uncompressed) + + // Other special fields are in a 'wave' atom that follows: + size += addAtom_wave(); +addAtomEnd; + +addAtom(wave); + size += addAtom_frma(); + if (strcmp(fCurrentIOState->fQTAudioDataType, "Qclp") == 0) { + size += addWord(0x00000014); // ??? + size += add4ByteString("Qclp"); // ??? + if (fCurrentIOState->fQTBytesPerFrame == 35) { + size += addAtom_Fclp(); // full-rate QCELP + } else { + size += addAtom_Hclp(); // half-rate QCELP + } // what about other QCELP 'rates'??? ##### + size += addWord(0x00000008); // ??? + size += addWord(0x00000000); // ??? + size += addWord(0x00000000); // ??? + size += addWord(0x00000008); // ??? + } else if (strcmp(fCurrentIOState->fQTAudioDataType, "mp4a") == 0) { + size += addWord(0x0000000c); // ??? + size += add4ByteString("mp4a"); // ??? + size += addWord(0x00000000); // ??? + size += addAtom_esds(); // ESDescriptor + size += addWord(0x00000008); // ??? + size += addWord(0x00000000); // ??? + } +addAtomEnd; + +addAtom(frma); + size += add4ByteString(fCurrentIOState->fQTAudioDataType); // ??? +addAtomEnd; + +addAtom(Fclp); + size += addWord(0x00000000); // ??? +addAtomEnd; + +addAtom(Hclp); + size += addWord(0x00000000); // ??? +addAtomEnd; + +unsigned QuickTimeFileSink::addAtom_mp4a() { + unsigned size = 0; + // The beginning of this atom looks just like a general Sound Media atom, + // except with a version field of 1: + int64_t initFilePosn = TellFile64(fOutFid); + fCurrentIOState->fQTAudioDataType = "mp4a"; + + if (fGenerateMP4Format) { + fCurrentIOState->fQTSoundSampleVersion = 0; + size = addAtom_soundMediaGeneral(); + size += addAtom_esds(); + } else { + fCurrentIOState->fQTSoundSampleVersion = 1; + size = addAtom_soundMediaGeneral(); + + // Next, add the four fields that are particular to version 1: + // (Later, parameterize these #####) + size += addWord(fCurrentIOState->fQTTimeUnitsPerSample); + size += addWord(0x00000001); // ??? + size += addWord(0x00000001); // ??? + size += addWord(0x00000002); // bytes per sample (uncompressed) + + // Other special fields are in a 'wave' atom that follows: + size += addAtom_wave(); + } +addAtomEnd; + +addAtom(esds); + // Get the source's 'config' information. (We need the size now.) + unsigned configSize; + MediaSubsession& subsession = fCurrentIOState->fOurSubsession; + unsigned char* config + = parseGeneralConfigStr(subsession.fmtp_config(), configSize); + + if (strcmp(subsession.mediumName(), "audio") == 0) { // MPEG-4 audio + size += addWord(0x00000000); // ??? + size += addWord(0x03808080); // ES_DescrTag+length coding + size += addWord((31+configSize)<<24); // length (includes 'config' and SLConfigDescriptor) + // DecoderConfigDescriptor + size += addWord(0x04808080); // DecoderConfigDescrTag + length coding + size += addWord(((17+configSize)<<24)|0x00401500); // length (includes 'config' info) + size += addWord(0x18000000); // ??? + size += addWord(0x6d600000); // ??? + size += addWord(0x6d600580); // ??? + size += addByte(0x80); size += addByte(0x80); // ??? + } else if (strcmp(subsession.mediumName(), "video") == 0) { // MPEG-4 video + size += addWord(0x00000000); // ??? + size += addWord(((22+configSize)<<16)|0x03000000); // ES_DescrTag + length (incl. 'config') + size += addWord(0x1f042b20); // ??? + size += addWord(0x1104fd46); // ??? + size += addWord(0x000d4e10); // ??? + size += addWord(0x000d4e10); // ??? + size += addByte(0x05); // ??? + } + + // Add the source's 'config' information: + size += addByte(configSize); + for (unsigned i = 0; i < configSize; ++i) { + size += addByte(config[i]); + } + delete[] config; + + + // SLConfigDescriptor: + if (strcmp(subsession.mediumName(), "audio") == 0) { // MPEG-4 audio + size += addWord(0x06808080); // SLConfigDescrTag + length coding + size += addHalfWord(0x0102); // length(1) + ??? + } else { // MPEG-4 video + size += addHalfWord(0x0601); // SLConfigDescrTag + length(1) + size += addByte(0x02); // ??? + } +addAtomEnd; + +addAtom(srcq); + //##### + size += addWord(0x00000040); // ??? + //##### +addAtomEnd; + +addAtom(h263); +// General sample description fields: + size += addWord(0x00000000); // Reserved + size += addWord(0x00000001); // Reserved+Data reference index +// Video sample description fields: + size += addWord(0x00020001); // Version+Revision level + size += add4ByteString("appl"); // Vendor + size += addWord(0x00000000); // Temporal quality + size += addWord(0x000002fc); // Spatial quality + unsigned const widthAndHeight = (fMovieWidth<<16)|fMovieHeight; + size += addWord(widthAndHeight); // Width+height + size += addWord(0x00480000); // Horizontal resolution + size += addWord(0x00480000); // Vertical resolution + size += addWord(0x00000000); // Data size + size += addWord(0x00010548); // Frame count+Compressor name (start) + // "H.263" + size += addWord(0x2e323633); // Compressor name (continued) + size += addZeroWords(6); // Compressor name (continued - zero) + size += addWord(0x00000018); // Compressor name (final)+Depth + size += addHalfWord(0xffff); // Color table id +addAtomEnd; + +addAtom(avc1); +// General sample description fields: + size += addWord(0x00000000); // Reserved + size += addWord(0x00000001); // Reserved+Data reference index +// Video sample description fields: + size += addWord(0x00000000); // Version+Revision level + size += add4ByteString("appl"); // Vendor + size += addWord(0x00000000); // Temporal quality + size += addWord(0x00000000); // Spatial quality + unsigned const widthAndHeight = (fMovieWidth<<16)|fMovieHeight; + size += addWord(widthAndHeight); // Width+height + size += addWord(0x00480000); // Horizontal resolution + size += addWord(0x00480000); // Vertical resolution + size += addWord(0x00000000); // Data size + size += addWord(0x00010548); // Frame count+Compressor name (start) + // "H.264" + size += addWord(0x2e323634); // Compressor name (continued) + size += addZeroWords(6); // Compressor name (continued - zero) + size += addWord(0x00000018); // Compressor name (final)+Depth + size += addHalfWord(0xffff); // Color table id + size += addAtom_avcC(); +addAtomEnd; + +addAtom(avcC); +// Begin by Base-64 decoding the "sprop" parameter sets strings: + char* psets = strDup(fCurrentIOState->fOurSubsession.fmtp_spropparametersets()); + if (psets == NULL) return 0; + + size_t comma_pos = strcspn(psets, ","); + psets[comma_pos] = '\0'; + char const* sps_b64 = psets; + char const* pps_b64 = &psets[comma_pos+1]; + unsigned sps_count; + unsigned char* sps_data = base64Decode(sps_b64, sps_count, false); + unsigned pps_count; + unsigned char* pps_data = base64Decode(pps_b64, pps_count, false); + +// Then add the decoded data: + size += addByte(0x01); // configuration version + size += addByte(sps_data[1]); // profile + size += addByte(sps_data[2]); // profile compat + size += addByte(sps_data[3]); // level + size += addByte(0xff); /* 0b11111100 | lengthsize = 0x11 */ + size += addByte(0xe0 | (sps_count > 0 ? 1 : 0) ); + if (sps_count > 0) { + size += addHalfWord(sps_count); + for (unsigned i = 0; i < sps_count; i++) { + size += addByte(sps_data[i]); + } + } + size += addByte(pps_count > 0 ? 1 : 0); + if (pps_count > 0) { + size += addHalfWord(pps_count); + for (unsigned i = 0; i < pps_count; i++) { + size += addByte(pps_data[i]); + } + } + +// Finally, delete the data that we allocated: + delete[] pps_data; delete[] sps_data; + delete[] psets; +addAtomEnd; + +addAtom(mp4v); +// General sample description fields: + size += addWord(0x00000000); // Reserved + size += addWord(0x00000001); // Reserved+Data reference index +// Video sample description fields: + size += addWord(0x00020001); // Version+Revision level + size += add4ByteString("appl"); // Vendor + size += addWord(0x00000200); // Temporal quality + size += addWord(0x00000400); // Spatial quality + unsigned const widthAndHeight = (fMovieWidth<<16)|fMovieHeight; + size += addWord(widthAndHeight); // Width+height + size += addWord(0x00480000); // Horizontal resolution + size += addWord(0x00480000); // Vertical resolution + size += addWord(0x00000000); // Data size + size += addWord(0x00010c4d); // Frame count+Compressor name (start) + // "MPEG-4 Video" + size += addWord(0x5045472d); // Compressor name (continued) + size += addWord(0x34205669); // Compressor name (continued) + size += addWord(0x64656f00); // Compressor name (continued) + size += addZeroWords(4); // Compressor name (continued - zero) + size += addWord(0x00000018); // Compressor name (final)+Depth + size += addHalfWord(0xffff); // Color table id + size += addAtom_esds(); // ESDescriptor + size += addWord(0x00000000); // ??? +addAtomEnd; + +unsigned QuickTimeFileSink::addAtom_rtp() { + int64_t initFilePosn = TellFile64(fOutFid); + unsigned size = addAtomHeader("rtp "); + + size += addWord(0x00000000); // Reserved (1st 4 bytes) + size += addWord(0x00000001); // Reserved (last 2 bytes) + Data ref index + size += addWord(0x00010001); // Hint track version + Last compat htv + size += addWord(1450); // Max packet size + + size += addAtom_tims(); +addAtomEnd; + +addAtom(tims); + size += addWord(fCurrentIOState->fOurSubsession.rtpTimestampFrequency()); +addAtomEnd; + +addAtom(stts); // Time-to-Sample + size += addWord(0x00000000); // Version+flags + + // First, add a dummy "Number of entries" field + // (and remember its position). We'll fill this field in later: + int64_t numEntriesPosition = TellFile64(fOutFid); + size += addWord(0); // dummy for "Number of entries" + + // Then, run through the chunk descriptors, and enter the entries + // in this (compressed) Time-to-Sample table: + unsigned numEntries = 0, numSamplesSoFar = 0; + unsigned prevSampleDuration = 0; + unsigned const samplesPerFrame = fCurrentIOState->fQTSamplesPerFrame; + ChunkDescriptor* chunk = fCurrentIOState->fHeadChunk; + while (chunk != NULL) { + unsigned const sampleDuration = chunk->fFrameDuration/samplesPerFrame; + if (sampleDuration != prevSampleDuration) { + // This chunk will start a new table entry, + // so write out the old one (if any): + if (chunk != fCurrentIOState->fHeadChunk) { + ++numEntries; + size += addWord(numSamplesSoFar); // Sample count + size += addWord(prevSampleDuration); // Sample duration + numSamplesSoFar = 0; + } + } + + unsigned const numSamples = chunk->fNumFrames*samplesPerFrame; + numSamplesSoFar += numSamples; + prevSampleDuration = sampleDuration; + chunk = chunk->fNextChunk; + } + + // Then, write out the last entry: + ++numEntries; + size += addWord(numSamplesSoFar); // Sample count + size += addWord(prevSampleDuration); // Sample duration + + // Now go back and fill in the "Number of entries" field: + setWord(numEntriesPosition, numEntries); +addAtomEnd; + +addAtom(stss); // Sync-Sample + size += addWord(0x00000000); // Version+flags + + // First, add a dummy "Number of entries" field + // (and remember its position). We'll fill this field in later: + int64_t numEntriesPosition = TellFile64(fOutFid); + size += addWord(0); // dummy for "Number of entries" + + unsigned numEntries = 0, numSamplesSoFar = 0; + if (fCurrentIOState->fHeadSyncFrame != NULL) { + SyncFrame* currentSyncFrame = fCurrentIOState->fHeadSyncFrame; + + // First, count the number of frames (to use as a sanity check; see below): + unsigned totNumFrames = 0; + for (ChunkDescriptor* chunk = fCurrentIOState->fHeadChunk; chunk != NULL; chunk = chunk->fNextChunk) totNumFrames += chunk->fNumFrames; + + while (currentSyncFrame != NULL) { + if (currentSyncFrame->sfFrameNum >= totNumFrames) break; // sanity check + + ++numEntries; + size += addWord(currentSyncFrame->sfFrameNum); + currentSyncFrame = currentSyncFrame->nextSyncFrame; + } + } else { + // First, run through the chunk descriptors, counting up the total number of samples: + unsigned const samplesPerFrame = fCurrentIOState->fQTSamplesPerFrame; + ChunkDescriptor* chunk = fCurrentIOState->fHeadChunk; + while (chunk != NULL) { + unsigned const numSamples = chunk->fNumFrames*samplesPerFrame; + numSamplesSoFar += numSamples; + chunk = chunk->fNextChunk; + } + + // Then, write out the sample numbers that we deem correspond to 'sync samples': + unsigned i; + for (i = 0; i < numSamplesSoFar; i += 12) { + // For an explanation of the constant "12", see http://lists.live555.com/pipermail/live-devel/2009-July/010969.html + // (Perhaps we should really try to keep track of which 'samples' ('frames' for video) really are 'key frames'?) + size += addWord(i+1); + ++numEntries; + } + + // Then, write out the last entry (if we haven't already done so): + if (i != (numSamplesSoFar - 1)) { + size += addWord(numSamplesSoFar); + ++numEntries; + } + } + + // Now go back and fill in the "Number of entries" field: + setWord(numEntriesPosition, numEntries); +addAtomEnd; + +addAtom(stsc); // Sample-to-Chunk + size += addWord(0x00000000); // Version+flags + + // First, add a dummy "Number of entries" field + // (and remember its position). We'll fill this field in later: + int64_t numEntriesPosition = TellFile64(fOutFid); + size += addWord(0); // dummy for "Number of entries" + + // Then, run through the chunk descriptors, and enter the entries + // in this (compressed) Sample-to-Chunk table: + unsigned numEntries = 0, chunkNumber = 0; + unsigned prevSamplesPerChunk = ~0; + unsigned const samplesPerFrame = fCurrentIOState->fQTSamplesPerFrame; + ChunkDescriptor* chunk = fCurrentIOState->fHeadChunk; + while (chunk != NULL) { + ++chunkNumber; + unsigned const samplesPerChunk = chunk->fNumFrames*samplesPerFrame; + if (samplesPerChunk != prevSamplesPerChunk) { + // This chunk will be a new table entry: + ++numEntries; + size += addWord(chunkNumber); // Chunk number + size += addWord(samplesPerChunk); // Samples per chunk + size += addWord(0x00000001); // Sample description ID + + prevSamplesPerChunk = samplesPerChunk; + } + chunk = chunk->fNextChunk; + } + + // Now go back and fill in the "Number of entries" field: + setWord(numEntriesPosition, numEntries); +addAtomEnd; + +addAtom(stsz); // Sample Size + size += addWord(0x00000000); // Version+flags + + // Begin by checking whether our chunks all have the same + // 'bytes-per-sample'. This determines whether this atom's table + // has just a single entry, or multiple entries. + Boolean haveSingleEntryTable = True; + double firstBPS = 0.0; + ChunkDescriptor* chunk = fCurrentIOState->fHeadChunk; + while (chunk != NULL) { + double bps + = (double)(chunk->fFrameSize)/(fCurrentIOState->fQTSamplesPerFrame); + if (bps < 1.0) { + // I don't think a multiple-entry table would make sense in + // this case, so assume a single entry table ??? ##### + break; + } + + if (firstBPS == 0.0) { + firstBPS = bps; + } else if (bps != firstBPS) { + haveSingleEntryTable = False; + break; + } + + chunk = chunk->fNextChunk; + } + + unsigned sampleSize; + if (haveSingleEntryTable) { + if (fCurrentIOState->isHintTrack() + && fCurrentIOState->fHeadChunk != NULL) { + sampleSize = fCurrentIOState->fHeadChunk->fFrameSize + / fCurrentIOState->fQTSamplesPerFrame; + } else { + // The following doesn't seem right, but seems to do the right thing: + sampleSize = fCurrentIOState->fQTTimeUnitsPerSample; //??? + } + } else { + sampleSize = 0; // indicates a multiple-entry table + } + size += addWord(sampleSize); // Sample size + unsigned const totNumSamples = fCurrentIOState->fQTTotNumSamples; + size += addWord(totNumSamples); // Number of entries + + if (!haveSingleEntryTable) { + // Multiple-entry table: + // Run through the chunk descriptors, entering the sample sizes: + ChunkDescriptor* chunk = fCurrentIOState->fHeadChunk; + while (chunk != NULL) { + unsigned numSamples + = chunk->fNumFrames*(fCurrentIOState->fQTSamplesPerFrame); + unsigned sampleSize + = chunk->fFrameSize/(fCurrentIOState->fQTSamplesPerFrame); + for (unsigned i = 0; i < numSamples; ++i) { + size += addWord(sampleSize); + } + + chunk = chunk->fNextChunk; + } + } +addAtomEnd; + +addAtom(co64); // Chunk Offset + size += addWord(0x00000000); // Version+flags + size += addWord(fCurrentIOState->fNumChunks); // Number of entries + + // Run through the chunk descriptors, entering the file offsets: + ChunkDescriptor* chunk = fCurrentIOState->fHeadChunk; + while (chunk != NULL) { + size += addWord64(chunk->fOffsetInFile); + + chunk = chunk->fNextChunk; + } +addAtomEnd; + +addAtom(udta); + size += addAtom_name(); + size += addAtom_hnti(); + size += addAtom_hinf(); +addAtomEnd; + +addAtom(name); + char description[100]; + sprintf(description, "Hinted %s track", + fCurrentIOState->fOurSubsession.mediumName()); + size += addArbitraryString(description, False); // name of object +addAtomEnd; + +addAtom(hnti); + size += addAtom_sdp(); +addAtomEnd; + +unsigned QuickTimeFileSink::addAtom_sdp() { + int64_t initFilePosn = TellFile64(fOutFid); + unsigned size = addAtomHeader("sdp "); + + // Add this subsession's SDP lines: + char const* sdpLines = fCurrentIOState->fOurSubsession.savedSDPLines(); + // We need to change any "a=control:trackID=" values to be this + // track's actual track id: + char* newSDPLines = new char[strlen(sdpLines)+100/*overkill*/]; + char const* searchStr = "a=control:trackid="; + Boolean foundSearchString = False; + char const *p1, *p2, *p3; + for (p1 = sdpLines; *p1 != '\0'; ++p1) { + for (p2 = p1,p3 = searchStr; tolower(*p2) == *p3; ++p2,++p3) {} + if (*p3 == '\0') { + // We found the end of the search string, at p2. + int beforeTrackNumPosn = p2-sdpLines; + // Look for the subsequent track number, and skip over it: + int trackNumLength; + if (sscanf(p2, " %*d%n", &trackNumLength) < 0) break; + int afterTrackNumPosn = beforeTrackNumPosn + trackNumLength; + + // Replace the old track number with the correct one: + int i; + for (i = 0; i < beforeTrackNumPosn; ++i) newSDPLines[i] = sdpLines[i]; + sprintf(&newSDPLines[i], "%d", fCurrentIOState->fTrackID); + i = afterTrackNumPosn; + int j = i + strlen(&newSDPLines[i]); + while (1) { + if ((newSDPLines[j] = sdpLines[i]) == '\0') break; + ++i; ++j; + } + + foundSearchString = True; + break; + } + } + + if (!foundSearchString) { + // Because we didn't find a "a=control:trackID=" line, + // add one of our own: + sprintf(newSDPLines, "%s%s%d\r\n", + sdpLines, searchStr, fCurrentIOState->fTrackID); + } + + size += addArbitraryString(newSDPLines, False); + delete[] newSDPLines; +addAtomEnd; + +addAtom(hinf); + size += addAtom_totl(); + size += addAtom_npck(); + size += addAtom_tpay(); + size += addAtom_trpy(); + size += addAtom_nump(); + size += addAtom_tpyl(); + // Is 'maxr' required? ##### + size += addAtom_dmed(); + size += addAtom_dimm(); + size += addAtom_drep(); + size += addAtom_tmin(); + size += addAtom_tmax(); + size += addAtom_pmax(); + size += addAtom_dmax(); + size += addAtom_payt(); +addAtomEnd; + +addAtom(totl); + size += addWord(fCurrentIOState->fHINF.trpy.lo); +addAtomEnd; + +addAtom(npck); + size += addWord(fCurrentIOState->fHINF.nump.lo); +addAtomEnd; + +addAtom(tpay); + size += addWord(fCurrentIOState->fHINF.tpyl.lo); +addAtomEnd; + +addAtom(trpy); + size += addWord(fCurrentIOState->fHINF.trpy.hi); + size += addWord(fCurrentIOState->fHINF.trpy.lo); +addAtomEnd; + +addAtom(nump); + size += addWord(fCurrentIOState->fHINF.nump.hi); + size += addWord(fCurrentIOState->fHINF.nump.lo); +addAtomEnd; + +addAtom(tpyl); + size += addWord(fCurrentIOState->fHINF.tpyl.hi); + size += addWord(fCurrentIOState->fHINF.tpyl.lo); +addAtomEnd; + +addAtom(dmed); + size += addWord(fCurrentIOState->fHINF.dmed.hi); + size += addWord(fCurrentIOState->fHINF.dmed.lo); +addAtomEnd; + +addAtom(dimm); + size += addWord(fCurrentIOState->fHINF.dimm.hi); + size += addWord(fCurrentIOState->fHINF.dimm.lo); +addAtomEnd; + +addAtom(drep); + size += addWord(0); + size += addWord(0); +addAtomEnd; + +addAtom(tmin); + size += addWord(0); +addAtomEnd; + +addAtom(tmax); + size += addWord(0); +addAtomEnd; + +addAtom(pmax); + size += addWord(fCurrentIOState->fHINF.pmax); +addAtomEnd; + +addAtom(dmax); + size += addWord(fCurrentIOState->fHINF.dmax); +addAtomEnd; + +addAtom(payt); + MediaSubsession& ourSubsession = fCurrentIOState->fOurSubsession; + RTPSource* rtpSource = ourSubsession.rtpSource(); + if (rtpSource != NULL) { + size += addWord(rtpSource->rtpPayloadFormat()); + + // Also, add a 'rtpmap' string: / + unsigned rtpmapStringLength = strlen(ourSubsession.codecName()) + 20; + char* rtpmapString = new char[rtpmapStringLength]; + sprintf(rtpmapString, "%s/%d", + ourSubsession.codecName(), rtpSource->timestampFrequency()); + size += addArbitraryString(rtpmapString); + delete[] rtpmapString; + } +addAtomEnd; + +// A dummy atom (with name "????"): +unsigned QuickTimeFileSink::addAtom_dummy() { + int64_t initFilePosn = TellFile64(fOutFid); + unsigned size = addAtomHeader("????"); +addAtomEnd; diff --git a/src/big/mpp/middleware/src/live555/liveMedia/QuickTimeGenericRTPSource.cpp b/src/big/mpp/middleware/src/live555/liveMedia/QuickTimeGenericRTPSource.cpp new file mode 100644 index 000000000..ca001bf3d --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/QuickTimeGenericRTPSource.cpp @@ -0,0 +1,274 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP Sources containing generic QuickTime stream data, as defined in +// +// Implementation + +#include "QuickTimeGenericRTPSource.hh" + +///// QTGenericBufferedPacket and QTGenericBufferedPacketFactory ///// + +// A subclass of BufferedPacket, used to separate out +// individual frames (when PCK == 2) + +class QTGenericBufferedPacket: public BufferedPacket { +public: + QTGenericBufferedPacket(QuickTimeGenericRTPSource& ourSource); + virtual ~QTGenericBufferedPacket(); + +private: // redefined virtual functions + virtual unsigned nextEnclosedFrameSize(unsigned char*& framePtr, + unsigned dataSize); +private: + QuickTimeGenericRTPSource& fOurSource; +}; + +class QTGenericBufferedPacketFactory: public BufferedPacketFactory { +private: // redefined virtual functions + virtual BufferedPacket* createNewPacket(MultiFramedRTPSource* ourSource); +}; + + +////////// QuickTimeGenericRTPSource ////////// + +QuickTimeGenericRTPSource* +QuickTimeGenericRTPSource::createNew(UsageEnvironment& env, + Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency, + char const* mimeTypeString) { + return new QuickTimeGenericRTPSource(env, RTPgs, rtpPayloadFormat, + rtpTimestampFrequency, + mimeTypeString); +} + +QuickTimeGenericRTPSource +::QuickTimeGenericRTPSource(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency, + char const* mimeTypeString) + : MultiFramedRTPSource(env, RTPgs, + rtpPayloadFormat, rtpTimestampFrequency, + new QTGenericBufferedPacketFactory), + fMIMEtypeString(strDup(mimeTypeString)) { + qtState.PCK = 0; + qtState.timescale = 0; + qtState.sdAtom = NULL; + qtState.sdAtomSize = qtState.width = qtState.height = 0; +} + +QuickTimeGenericRTPSource::~QuickTimeGenericRTPSource() { + delete[] qtState.sdAtom; + delete[] (char*)fMIMEtypeString; +} + +Boolean QuickTimeGenericRTPSource +::processSpecialHeader(BufferedPacket* packet, + unsigned& resultSpecialHeaderSize) { + unsigned char* headerStart = packet->data(); + unsigned packetSize = packet->dataSize(); + + // The "QuickTime Header" must be at least 4 bytes in size: + // Extract the known fields from the first 4 bytes: + unsigned expectedHeaderSize = 4; + if (packetSize < expectedHeaderSize) return False; + + unsigned char VER = (headerStart[0]&0xF0)>>4; + if (VER > 1) return False; // unknown header version + qtState.PCK = (headerStart[0]&0x0C)>>2; +#ifdef DEBUG + Boolean S = (headerStart[0]&0x02) != 0; +#endif + Boolean Q = (headerStart[0]&0x01) != 0; + + Boolean L = (headerStart[1]&0x80) != 0; + +#ifdef DEBUG + Boolean D = (headerStart[2]&0x80) != 0; + unsigned short payloadId = ((headerStart[2]&0x7F)<<8)|headerStart[3]; +#endif + headerStart += 4; + +#ifdef DEBUG + fprintf(stderr, "PCK: %d, S: %d, Q: %d, L: %d, D: %d, payloadId: %d\n", qtState.PCK, S, Q, L, D, payloadId); +#endif + + if (Q) { // A "QuickTime Payload Description" follows + expectedHeaderSize += 4; + if (packetSize < expectedHeaderSize) return False; + +#ifdef DEBUG + Boolean K = (headerStart[0]&0x80) != 0; + Boolean F = (headerStart[0]&0x40) != 0; + Boolean A = (headerStart[0]&0x20) != 0; + Boolean Z = (headerStart[0]&0x10) != 0; +#endif + unsigned payloadDescriptionLength = (headerStart[2]<<8)|headerStart[3]; + headerStart += 4; + +#ifdef DEBUG + fprintf(stderr, "\tK: %d, F: %d, A: %d, Z: %d, payloadDescriptionLength: %d\n", K, F, A, Z, payloadDescriptionLength); +#endif + // Make sure "payloadDescriptionLength" is valid + if (payloadDescriptionLength < 12) return False; + expectedHeaderSize += (payloadDescriptionLength - 4); + unsigned nonPaddedSize = expectedHeaderSize; + expectedHeaderSize += 3; + expectedHeaderSize -= expectedHeaderSize%4; // adds padding + if (packetSize < expectedHeaderSize) return False; + unsigned char padding = expectedHeaderSize - nonPaddedSize; + +#ifdef DEBUG + unsigned mediaType = (headerStart[0]<<24)|(headerStart[1]<<16) + |(headerStart[2]<<8)|headerStart[3]; +#endif + qtState.timescale = (headerStart[4]<<24)|(headerStart[5]<<16) + |(headerStart[6]<<8)|headerStart[7]; + headerStart += 8; + + payloadDescriptionLength -= 12; +#ifdef DEBUG + fprintf(stderr, "\tmediaType: '%c%c%c%c', timescale: %d, %d bytes of TLVs left\n", mediaType>>24, (mediaType&0xFF0000)>>16, (mediaType&0xFF00)>>8, mediaType&0xFF, qtState.timescale, payloadDescriptionLength); +#endif + + while (payloadDescriptionLength > 3) { + unsigned short tlvLength = (headerStart[0]<<8)|headerStart[1]; + unsigned short tlvType = (headerStart[2]<<8)|headerStart[3]; + payloadDescriptionLength -= 4; + if (tlvLength > payloadDescriptionLength) return False; // bad TLV + headerStart += 4; +#ifdef DEBUG + fprintf(stderr, "\t\tTLV '%c%c', length %d, leaving %d remaining bytes\n", tlvType>>8, tlvType&0xFF, tlvLength, payloadDescriptionLength - tlvLength); + for (int i = 0; i < tlvLength; ++i) fprintf(stderr, "%02x:", headerStart[i]); fprintf(stderr, "\n"); +#endif + + // Check for 'TLV's that we can use for our 'qtState' + switch (tlvType) { + case ('s'<<8|'d'): { // session description atom + // Sanity check: the first 4 bytes of this must equal "tlvLength": + unsigned atomLength = (headerStart[0]<<24)|(headerStart[1]<<16) + |(headerStart[2]<<8)|(headerStart[3]); + if (atomLength != (unsigned)tlvLength) break; + + delete[] qtState.sdAtom; qtState.sdAtom = new char[tlvLength]; + memmove(qtState.sdAtom, headerStart, tlvLength); + qtState.sdAtomSize = tlvLength; + break; + } + case ('t'<<8|'w'): { // track width + qtState.width = (headerStart[0]<<8)|headerStart[1]; + break; + } + case ('t'<<8|'h'): { // track height + qtState.height = (headerStart[0]<<8)|headerStart[1]; + break; + } + } + + payloadDescriptionLength -= tlvLength; + headerStart += tlvLength; + } + if (payloadDescriptionLength > 0) return False; // malformed TLV data + headerStart += padding; + } + + if (L) { // Sample-Specific info follows + expectedHeaderSize += 4; + if (packetSize < expectedHeaderSize) return False; + + unsigned ssInfoLength = (headerStart[2]<<8)|headerStart[3]; + headerStart += 4; + +#ifdef DEBUG + fprintf(stderr, "\tssInfoLength: %d\n", ssInfoLength); +#endif + // Make sure "ssInfoLength" is valid + if (ssInfoLength < 4) return False; + expectedHeaderSize += (ssInfoLength - 4); + unsigned nonPaddedSize = expectedHeaderSize; + expectedHeaderSize += 3; + expectedHeaderSize -= expectedHeaderSize%4; // adds padding + if (packetSize < expectedHeaderSize) return False; + unsigned char padding = expectedHeaderSize - nonPaddedSize; + + ssInfoLength -= 4; + while (ssInfoLength > 3) { + unsigned short tlvLength = (headerStart[0]<<8)|headerStart[1]; +#ifdef DEBUG + unsigned short tlvType = (headerStart[2]<<8)|headerStart[3]; +#endif + ssInfoLength -= 4; + if (tlvLength > ssInfoLength) return False; // bad TLV +#ifdef DEBUG + fprintf(stderr, "\t\tTLV '%c%c', length %d, leaving %d remaining bytes\n", tlvType>>8, tlvType&0xFF, tlvLength, ssInfoLength - tlvLength); + for (int i = 0; i < tlvLength; ++i) fprintf(stderr, "%02x:", headerStart[4+i]); fprintf(stderr, "\n"); +#endif + ssInfoLength -= tlvLength; + headerStart += 4 + tlvLength; + } + if (ssInfoLength > 0) return False; // malformed TLV data + headerStart += padding; + } + + fCurrentPacketBeginsFrame = fCurrentPacketCompletesFrame; + // whether the *previous* packet ended a frame + fCurrentPacketCompletesFrame = packet->rtpMarkerBit(); + + resultSpecialHeaderSize = expectedHeaderSize; +#ifdef DEBUG + fprintf(stderr, "Result special header size: %d\n", resultSpecialHeaderSize); +#endif + return True; +} + +char const* QuickTimeGenericRTPSource::MIMEtype() const { + if (fMIMEtypeString == NULL) return MultiFramedRTPSource::MIMEtype(); + + return fMIMEtypeString; +} + + +////////// QTGenericBufferedPacket and QTGenericBufferedPacketFactory impl + +QTGenericBufferedPacket +::QTGenericBufferedPacket(QuickTimeGenericRTPSource& ourSource) + : fOurSource(ourSource) { +} + +QTGenericBufferedPacket::~QTGenericBufferedPacket() { +} + +unsigned QTGenericBufferedPacket:: + nextEnclosedFrameSize(unsigned char*& framePtr, unsigned dataSize) { + // We use the entire packet for a frame, unless "PCK" == 2 + if (fOurSource.qtState.PCK != 2) return dataSize; + + if (dataSize < 8) return 0; // sanity check + + unsigned short sampleLength = (framePtr[2]<<8)|framePtr[3]; + // later, extract and use the "timestamp" field ##### + framePtr += 8; + dataSize -= 8; + + return sampleLength < dataSize ? sampleLength : dataSize; +} + +BufferedPacket* QTGenericBufferedPacketFactory +::createNewPacket(MultiFramedRTPSource* ourSource) { + return new QTGenericBufferedPacket((QuickTimeGenericRTPSource&)(*ourSource)); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/RTCP.cpp b/src/big/mpp/middleware/src/live555/liveMedia/RTCP.cpp new file mode 100644 index 000000000..fcdd8d7d3 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/RTCP.cpp @@ -0,0 +1,1386 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTCP +// Implementation + +#include "RTCP.hh" +#include "GroupsockHelper.hh" +#include "rtcp_from_spec.h" +#if defined(__WIN32__) || defined(_WIN32) || defined(_QNX4) +#define snprintf _snprintf +#endif + +////////// RTCPMemberDatabase ////////// + +class RTCPMemberDatabase { +public: + RTCPMemberDatabase(RTCPInstance& ourRTCPInstance) + : fOurRTCPInstance(ourRTCPInstance), fNumMembers(1 /*ourself*/), + fTable(HashTable::create(ONE_WORD_HASH_KEYS)) { + } + + virtual ~RTCPMemberDatabase() { + delete fTable; + } + + Boolean isMember(u_int32_t ssrc) const { + return fTable->Lookup((char*)(long)ssrc) != NULL; + } + + Boolean noteMembership(u_int32_t ssrc, unsigned curTimeCount) { + Boolean isNew = !isMember(ssrc); + + if (isNew) { + ++fNumMembers; + } + + // Record the current time, so we can age stale members + fTable->Add((char*)(long)ssrc, (void*)(long)curTimeCount); + + return isNew; + } + + Boolean remove(u_int32_t ssrc) { + Boolean wasPresent = fTable->Remove((char*)(long)ssrc); + if (wasPresent) { + --fNumMembers; + } + return wasPresent; + } + + unsigned numMembers() const { + return fNumMembers; + } + + void reapOldMembers(unsigned threshold); + +private: + RTCPInstance& fOurRTCPInstance; + unsigned fNumMembers; + HashTable* fTable; +}; + +void RTCPMemberDatabase::reapOldMembers(unsigned threshold) { + Boolean foundOldMember; + u_int32_t oldSSRC = 0; + + do { + foundOldMember = False; + + HashTable::Iterator* iter + = HashTable::Iterator::create(*fTable); + uintptr_t timeCount; + char const* key; + while ((timeCount = (uintptr_t)(iter->next(key))) != 0) { +#ifdef DEBUG + fprintf(stderr, "reap: checking SSRC 0x%lx: %ld (threshold %d)\n", (unsigned long)key, timeCount, threshold); +#endif + if (timeCount < (uintptr_t)threshold) { // this SSRC is old + uintptr_t ssrc = (uintptr_t)key; + oldSSRC = (u_int32_t)ssrc; + foundOldMember = True; + } + } + delete iter; + + if (foundOldMember) { +#ifdef DEBUG + fprintf(stderr, "reap: removing SSRC 0x%x\n", oldSSRC); +#endif + fOurRTCPInstance.removeSSRC(oldSSRC, True); + } + } while (foundOldMember); +} + + +////////// RTCPInstance ////////// + +static double dTimeNow() { + struct timeval timeNow; + gettimeofday(&timeNow, NULL); + return (double) (timeNow.tv_sec + timeNow.tv_usec/1000000.0); +} + +static unsigned const maxRTCPPacketSize = 1438; + // bytes (1500, minus some allowance for IP, UDP headers; SRTCP trailers) +static unsigned const preferredRTCPPacketSize = 1000; // bytes + +RTCPInstance::RTCPInstance(UsageEnvironment& env, Groupsock* RTCPgs, + unsigned totSessionBW, + unsigned char const* cname, + RTPSink* sink, RTPSource* source, + Boolean isSSMTransmitter, + SRTPCryptographicContext* crypto) + : Medium(env), fRTCPInterface(this, RTCPgs), fTotSessionBW(totSessionBW), + fSink(sink), fSource(source), fIsSSMTransmitter(isSSMTransmitter), fCrypto(crypto), + fCNAME(RTCP_SDES_CNAME, cname), fOutgoingReportCount(1), + fAveRTCPSize(0), fIsInitial(1), fPrevNumMembers(0), + fLastSentSize(0), fLastReceivedSize(0), fLastReceivedSSRC(0), + fTypeOfEvent(EVENT_UNKNOWN), fTypeOfPacket(PACKET_UNKNOWN_TYPE), + fHaveJustSentPacket(False), fLastPacketSentSize(0), + fByeHandlerTask(NULL), fByeWithReasonHandlerTask(NULL), fByeHandlerClientData(NULL), + fSRHandlerTask(NULL), fSRHandlerClientData(NULL), + fRRHandlerTask(NULL), fRRHandlerClientData(NULL), + fSpecificRRHandlerTable(NULL), + fAppHandlerTask(NULL), fAppHandlerClientData(NULL) { +#ifdef DEBUG + fprintf(stderr, "RTCPInstance[%p]::RTCPInstance()\n", this); +#endif + setupForSRTCP(); + + if (fTotSessionBW == 0) { // not allowed! + env << "RTCPInstance::RTCPInstance error: totSessionBW parameter should not be zero!\n"; + fTotSessionBW = 1; + } + + if (isSSMTransmitter) RTCPgs->multicastSendOnly(); // don't receive multicast + + double timeNow = dTimeNow(); + fPrevReportTime = fNextReportTime = timeNow; + + fKnownMembers = new RTCPMemberDatabase(*this); + fInBuf = new unsigned char[maxRTCPPacketSize]; + if (fKnownMembers == NULL || fInBuf == NULL) return; + fNumBytesAlreadyRead = 0; + + fOutBuf = new OutPacketBuffer(preferredRTCPPacketSize, maxRTCPPacketSize, 1500); + if (fOutBuf == NULL) return; + + if (fSource != NULL && fSource->RTPgs() == RTCPgs) { + // We're receiving RTCP reports that are multiplexed with RTP, so ask the RTP source + // to give them to us: + fSource->registerForMultiplexedRTCPPackets(this); + } else { + // Arrange to handle incoming reports from the network: + TaskScheduler::BackgroundHandlerProc* handler + = (TaskScheduler::BackgroundHandlerProc*)&incomingReportHandler; + fRTCPInterface.startNetworkReading(handler); + } + + // Send our first report. + fTypeOfEvent = EVENT_REPORT; + onExpire(this); +} + +struct RRHandlerRecord { + TaskFunc* rrHandlerTask; + void* rrHandlerClientData; +}; + +RTCPInstance::~RTCPInstance() { +#ifdef DEBUG + fprintf(stderr, "RTCPInstance[%p]::~RTCPInstance()\n", this); +#endif + // Begin by sending a BYE. We have to do this immediately, without + // 'reconsideration', because "this" is going away. + fTypeOfEvent = EVENT_BYE; // not used, but... + sendBYE(); + + if (fSource != NULL && fSource->RTPgs() == fRTCPInterface.gs()) { + // We were receiving RTCP reports that were multiplexed with RTP, so tell the RTP source + // to stop giving them to us: + fSource->deregisterForMultiplexedRTCPPackets(); + fRTCPInterface.forgetOurGroupsock(); + // so that the "fRTCPInterface" destructor doesn't turn off background read handling + } + + if (fSpecificRRHandlerTable != NULL) { + AddressPortLookupTable::Iterator iter(*fSpecificRRHandlerTable); + RRHandlerRecord* rrHandler; + while ((rrHandler = (RRHandlerRecord*)iter.next()) != NULL) { + delete rrHandler; + } + delete fSpecificRRHandlerTable; + } + + delete fKnownMembers; + delete fOutBuf; + delete[] fInBuf; +} + +void RTCPInstance::noteArrivingRR(struct sockaddr_storage const& fromAddressAndPort, + int tcpSocketNum, unsigned char tcpStreamChannelId) { + // If a 'RR handler' was set, call it now: + + // Specific RR handler: + if (fSpecificRRHandlerTable != NULL) { + struct sockaddr_storage fromAddress; + portNumBits fromPortNum; + if (tcpSocketNum < 0) { + // Normal case: We read the RTCP packet over UDP + fromAddress = fromAddressAndPort; + fromPortNum = ntohs(portNum(fromAddressAndPort)); + } else { + // Special case: We read the RTCP packet over TCP (interleaved) + // Hack: Use the TCP socket number and channel id to look up the handler + fromAddress.ss_family = AF_INET; + ((sockaddr_in&)fromAddress).sin_addr.s_addr = tcpSocketNum; + fromPortNum = tcpStreamChannelId; + } + Port fromPort(fromPortNum); + RRHandlerRecord* rrHandler + = (RRHandlerRecord*)(fSpecificRRHandlerTable->Lookup(fromAddress, fromPort)); + if (rrHandler != NULL) { + if (rrHandler->rrHandlerTask != NULL) { + (*(rrHandler->rrHandlerTask))(rrHandler->rrHandlerClientData); + } + } + } + + // General RR handler: + if (fRRHandlerTask != NULL) (*fRRHandlerTask)(fRRHandlerClientData); +} + +RTCPInstance* RTCPInstance::createNew(UsageEnvironment& env, Groupsock* RTCPgs, + unsigned totSessionBW, + unsigned char const* cname, + RTPSink* sink, RTPSource* source, + Boolean isSSMTransmitter, + SRTPCryptographicContext* crypt) { + return new RTCPInstance(env, RTCPgs, totSessionBW, cname, sink, source, + isSSMTransmitter, crypt); +} + +Boolean RTCPInstance::lookupByName(UsageEnvironment& env, + char const* instanceName, + RTCPInstance*& resultInstance) { + resultInstance = NULL; // unless we succeed + + Medium* medium; + if (!Medium::lookupByName(env, instanceName, medium)) return False; + + if (!medium->isRTCPInstance()) { + env.setResultMsg(instanceName, " is not a RTCP instance"); + return False; + } + + resultInstance = (RTCPInstance*)medium; + return True; +} + +Boolean RTCPInstance::isRTCPInstance() const { + return True; +} + +unsigned RTCPInstance::numMembers() const { + if (fKnownMembers == NULL) return 0; + + return fKnownMembers->numMembers(); +} + +void RTCPInstance::setupForSRTCP() { + if (fCrypto == NULL && fSink != NULL) { // take crypto state (if any) from the sink instead: + fCrypto = fSink->getCrypto(); + } +} + +void RTCPInstance::setByeHandler(TaskFunc* handlerTask, void* clientData, + Boolean handleActiveParticipantsOnly) { + fByeHandlerTask = handlerTask; + fByeWithReasonHandlerTask = NULL; + fByeHandlerClientData = clientData; + fByeHandleActiveParticipantsOnly = handleActiveParticipantsOnly; +} + +void RTCPInstance::setByeWithReasonHandler(ByeWithReasonHandlerFunc* handlerTask, void* clientData, + Boolean handleActiveParticipantsOnly) { + fByeHandlerTask = NULL; + fByeWithReasonHandlerTask = handlerTask; + fByeHandlerClientData = clientData; + fByeHandleActiveParticipantsOnly = handleActiveParticipantsOnly; +} + +void RTCPInstance::setSRHandler(TaskFunc* handlerTask, void* clientData) { + fSRHandlerTask = handlerTask; + fSRHandlerClientData = clientData; +} + +void RTCPInstance::setRRHandler(TaskFunc* handlerTask, void* clientData) { + fRRHandlerTask = handlerTask; + fRRHandlerClientData = clientData; +} + +void RTCPInstance +::setSpecificRRHandler(struct sockaddr_storage const& fromAddress, Port fromPort, + TaskFunc* handlerTask, void* clientData) { + if (handlerTask == NULL && clientData == NULL) { + unsetSpecificRRHandler(fromAddress, fromPort); + return; + } + + RRHandlerRecord* rrHandler = new RRHandlerRecord; + rrHandler->rrHandlerTask = handlerTask; + rrHandler->rrHandlerClientData = clientData; + if (fSpecificRRHandlerTable == NULL) { + fSpecificRRHandlerTable = new AddressPortLookupTable; + } + RRHandlerRecord* existingRecord + = (RRHandlerRecord*)fSpecificRRHandlerTable->Add(fromAddress, fromPort, rrHandler); + delete existingRecord; // if any + +} + +void RTCPInstance +::unsetSpecificRRHandler(struct sockaddr_storage const& fromAddress, Port fromPort) { + if (fSpecificRRHandlerTable == NULL) return; + + RRHandlerRecord* rrHandler + = (RRHandlerRecord*)(fSpecificRRHandlerTable->Lookup(fromAddress, fromPort)); + if (rrHandler != NULL) { + fSpecificRRHandlerTable->Remove(fromAddress, fromPort); + delete rrHandler; + } +} + +void RTCPInstance::setAppHandler(RTCPAppHandlerFunc* handlerTask, void* clientData) { + fAppHandlerTask = handlerTask; + fAppHandlerClientData = clientData; +} + +void RTCPInstance::sendAppPacket(u_int8_t subtype, char const* name, + u_int8_t* appDependentData, unsigned appDependentDataSize) { + // Set up the first 4 bytes: V,PT,subtype,PT,length: + u_int32_t rtcpHdr = 0x80000000; // version 2, no padding + rtcpHdr |= (subtype&0x1F)<<24; + rtcpHdr |= (RTCP_PT_APP<<16); + unsigned length = 2 + (appDependentDataSize+3)/4; + rtcpHdr |= (length&0xFFFF); + fOutBuf->enqueueWord(rtcpHdr); + + // Set up the next 4 bytes: SSRC: + fOutBuf->enqueueWord(fSource != NULL ? fSource->SSRC() : fSink != NULL ? fSink->SSRC() : 0); + + // Set up the next 4 bytes: name: + char nameBytes[4]; + nameBytes[0] = nameBytes[1] = nameBytes[2] = nameBytes[3] = '\0'; // by default + if (name != NULL) { + snprintf(nameBytes, 4, "%s", name); + } + fOutBuf->enqueue((u_int8_t*)nameBytes, 4); + + // Set up the remaining bytes (if any): application-dependent data (+ padding): + if (appDependentData != NULL && appDependentDataSize > 0) { + fOutBuf->enqueue(appDependentData, appDependentDataSize); + + unsigned modulo = appDependentDataSize%4; + unsigned paddingSize = modulo == 0 ? 0 : 4-modulo; + u_int8_t const paddingByte = 0x00; + for (unsigned i = 0; i < paddingSize; ++i) fOutBuf->enqueue(&paddingByte, 1); + } + + // Finally, send the packet: + sendBuiltPacket(); +} + +void RTCPInstance::setStreamSocket(int sockNum, unsigned char streamChannelId, + TLSState* tlsState) { + // Turn off background read handling: + fRTCPInterface.stopNetworkReading(); + + // Switch to RTCP-over-TCP: + fRTCPInterface.setStreamSocket(sockNum, streamChannelId, tlsState); + + // Turn background reading back on: + TaskScheduler::BackgroundHandlerProc* handler + = (TaskScheduler::BackgroundHandlerProc*)&incomingReportHandler; + fRTCPInterface.startNetworkReading(handler); +} + +void RTCPInstance::addStreamSocket(int sockNum, unsigned char streamChannelId, + TLSState* tlsState) { + // First, turn off background read handling for the default (UDP) socket: + envir().taskScheduler().turnOffBackgroundReadHandling(fRTCPInterface.gs()->socketNum()); + + // Add the RTCP-over-TCP interface: + fRTCPInterface.addStreamSocket(sockNum, streamChannelId, tlsState); + + // Turn on background reading for this socket (in case it's not on already): + TaskScheduler::BackgroundHandlerProc* handler + = (TaskScheduler::BackgroundHandlerProc*)&incomingReportHandler; + fRTCPInterface.startNetworkReading(handler); +} + +void RTCPInstance +::injectReport(u_int8_t const* packet, unsigned packetSize, struct sockaddr_storage const& fromAddress) { + if (packetSize > maxRTCPPacketSize) packetSize = maxRTCPPacketSize; + memmove(fInBuf, packet, packetSize); + + processIncomingReport(packetSize, fromAddress, -1, 0xFF); // assume report received over UDP +} + +static unsigned const IP_UDP_HDR_SIZE = 28; + // overhead (bytes) of IP and UDP hdrs + +#define ADVANCE(n) pkt += (n); packetSize -= (n) + +void RTCPInstance::incomingReportHandler(RTCPInstance* instance, + int /*mask*/) { + instance->incomingReportHandler1(); +} + +void RTCPInstance::incomingReportHandler1() { + do { + if (fNumBytesAlreadyRead >= maxRTCPPacketSize) { + envir() << "RTCPInstance error: Hit limit when reading incoming packet over TCP. (fNumBytesAlreadyRead (" + << fNumBytesAlreadyRead << ") >= maxRTCPPacketSize (" << maxRTCPPacketSize + << ")). The remote endpoint is using a buggy implementation of RTP/RTCP-over-TCP. Please upgrade it!\n"; + break; + } + + unsigned numBytesRead; + struct sockaddr_storage fromAddress; + int tcpSocketNum; + unsigned char tcpStreamChannelId; + Boolean packetReadWasIncomplete; + Boolean readResult + = fRTCPInterface.handleRead(&fInBuf[fNumBytesAlreadyRead], maxRTCPPacketSize - fNumBytesAlreadyRead, + numBytesRead, fromAddress, + tcpSocketNum, tcpStreamChannelId, + packetReadWasIncomplete); + + unsigned packetSize = 0; + if (packetReadWasIncomplete) { + fNumBytesAlreadyRead += numBytesRead; + return; // more reads are needed to get the entire packet + } else { // normal case: We've read the entire packet + packetSize = fNumBytesAlreadyRead + numBytesRead; + fNumBytesAlreadyRead = 0; // for next time + } + if (!readResult) break; + + // Ignore the packet if it was looped-back from ourself: + Boolean packetWasFromOurHost = False; + if (RTCPgs()->wasLoopedBackFromUs(envir(), fromAddress)) { + packetWasFromOurHost = True; + // However, we still want to handle incoming RTCP packets from + // *other processes* on the same machine. To distinguish this + // case from a true loop-back, check whether we've just sent a + // packet of the same size. (This check isn't perfect, but it seems + // to be the best we can do.) + if (fHaveJustSentPacket && fLastPacketSentSize == packetSize) { + // This is a true loop-back: + fHaveJustSentPacket = False; + break; // ignore this packet + } + } + + if (fIsSSMTransmitter && !packetWasFromOurHost) { + // This packet is assumed to have been received via unicast (because we're + // a SSM transmitter, and SSM receivers send back RTCP "RR" packets via unicast). + // 'Reflect' the packet by resending it to the multicast group, so that any other receivers + // can also get to see it. + + // NOTE: Denial-of-service attacks are possible here. + // Users of this software may wish to add their own, + // application-specific mechanism for 'authenticating' the + // validity of this packet before reflecting it. + + // NOTE: The test for "!packetWasFromOurHost" means that we won't reflect RTCP packets + // that come from other processes on the same host as us. The reason for this is that the + // 'packet size' test above is not 100% reliable; some packets that were truly looped back + // from us might not be detected as such, and this might lead to infinite + // forwarding/receiving of some packets. To avoid this possibility, we reflect only + // RTCP packets that we know for sure originated elsewhere. + // (Note, though, that if we ever re-enable the code in "Groupsock::multicastSendOnly()", + // then we could remove the test for "!packetWasFromOurHost".) + fRTCPInterface.sendPacket(fInBuf, packetSize); + fHaveJustSentPacket = True; + fLastPacketSentSize = packetSize; + } + + processIncomingReport(packetSize, fromAddress, tcpSocketNum, tcpStreamChannelId); + } while (0); +} + +void RTCPInstance +::processIncomingReport(unsigned packetSize, struct sockaddr_storage const& fromAddressAndPort, + int tcpSocketNum, unsigned char tcpStreamChannelId) { + do { + if (fCrypto != NULL) { // The packet is assumed to be SRTCP. Verify/decrypt it first: + unsigned newPacketSize; + if (!fCrypto->processIncomingSRTCPPacket(fInBuf, packetSize, newPacketSize)) break; + packetSize = newPacketSize; + } + + Boolean callByeHandler = False; + char* reason = NULL; // by default, unless/until a BYE packet with a 'reason' arrives + unsigned char* pkt = fInBuf; + +#ifdef DEBUG + fprintf(stderr, "[%p]saw incoming RTCP packet (from ", this); + if (tcpSocketNum < 0) { + // Note that "fromAddressAndPort" is valid only if we're receiving over UDP (not over TCP): + fprintf(stderr, "address %s, port %d", AddressString(fromAddressAndPort).val(), ntohs(portNum(fromAddressAndPort))); + } else { + fprintf(stderr, "TCP socket #%d, stream channel id %d", tcpSocketNum, tcpStreamChannelId); + } + fprintf(stderr, ")\n"); + for (unsigned i = 0; i < packetSize; ++i) { + if (i%4 == 0) fprintf(stderr, " "); + fprintf(stderr, "%02x", pkt[i]); + } + fprintf(stderr, "\n"); +#endif + int totPacketSize = IP_UDP_HDR_SIZE + packetSize; + + // Check the RTCP packet for validity: + // It must at least contain a header (4 bytes), and this header + // must be version=2, with no padding bit, and a payload type of + // SR (200), RR (201), or APP (204): + if (packetSize < 4) break; + unsigned rtcpHdr = ntohl(*(u_int32_t*)pkt); + if ((rtcpHdr & 0xE0FE0000) != (0x80000000 | (RTCP_PT_SR<<16)) && + (rtcpHdr & 0xE0FF0000) != (0x80000000 | (RTCP_PT_APP<<16))) { +#ifdef DEBUG + fprintf(stderr, "rejected bad RTCP packet: header 0x%08x\n", rtcpHdr); +#endif + break; + } + + // Process each of the individual RTCP 'subpackets' in (what may be) + // a compound RTCP packet. + int typeOfPacket = PACKET_UNKNOWN_TYPE; + unsigned reportSenderSSRC = 0; + Boolean packetOK = False; + while (1) { + u_int8_t rc = (rtcpHdr>>24)&0x1F; + u_int8_t pt = (rtcpHdr>>16)&0xFF; + unsigned length = 4*(rtcpHdr&0xFFFF); // doesn't count hdr + ADVANCE(4); // skip over the header + if (length > packetSize) break; + + // Assume that each RTCP subpacket begins with a 4-byte SSRC: + if (length < 4) break; length -= 4; + reportSenderSSRC = ntohl(*(u_int32_t*)pkt); ADVANCE(4); +#ifdef HACK_FOR_CHROME_WEBRTC_BUG + if (reportSenderSSRC == 0x00000001 && pt == RTCP_PT_RR) { + // Chrome (and Opera) WebRTC receivers have a bug that causes them to always send + // SSRC 1 in their "RR"s. To work around this (to help us distinguish between different + // receivers), we use a fake SSRC in this case consisting of the IP address, XORed with + // the port number: + reportSenderSSRC = fromAddressAndPort.sin_addr.s_addr^portNum(fromAddressAndPort); + } +#endif + + Boolean subPacketOK = False; + switch (pt) { + case RTCP_PT_SR: { +#ifdef DEBUG + fprintf(stderr, "SR\n"); +#endif + if (length < 20) break; length -= 20; + + // Extract the NTP timestamp, and note this: + unsigned NTPmsw = ntohl(*(u_int32_t*)pkt); ADVANCE(4); + unsigned NTPlsw = ntohl(*(u_int32_t*)pkt); ADVANCE(4); + unsigned rtpTimestamp = ntohl(*(u_int32_t*)pkt); ADVANCE(4); + if (fSource != NULL) { + RTPReceptionStatsDB& receptionStats + = fSource->receptionStatsDB(); + receptionStats.noteIncomingSR(reportSenderSSRC, + NTPmsw, NTPlsw, rtpTimestamp); + } + ADVANCE(8); // skip over packet count, octet count + + // If a 'SR handler' was set, call it now: + if (fSRHandlerTask != NULL) (*fSRHandlerTask)(fSRHandlerClientData); + + // The rest of the SR is handled like a RR (so, no "break;" here) + } + case RTCP_PT_RR: { +#ifdef DEBUG + fprintf(stderr, "RR\n"); +#endif + unsigned reportBlocksSize = rc*(6*4); + if (length < reportBlocksSize) break; + length -= reportBlocksSize; + + if (fSink != NULL) { + // Use this information to update stats about our transmissions: + RTPTransmissionStatsDB& transmissionStats = fSink->transmissionStatsDB(); + for (unsigned i = 0; i < rc; ++i) { + unsigned senderSSRC = ntohl(*(u_int32_t*)pkt); ADVANCE(4); + // We care only about reports about our own transmission, not others' + if (senderSSRC == fSink->SSRC()) { + unsigned lossStats = ntohl(*(u_int32_t*)pkt); ADVANCE(4); + unsigned highestReceived = ntohl(*(u_int32_t*)pkt); ADVANCE(4); + unsigned jitter = ntohl(*(u_int32_t*)pkt); ADVANCE(4); + unsigned timeLastSR = ntohl(*(u_int32_t*)pkt); ADVANCE(4); + unsigned timeSinceLastSR = ntohl(*(u_int32_t*)pkt); ADVANCE(4); + transmissionStats.noteIncomingRR(reportSenderSSRC, fromAddressAndPort, + lossStats, + highestReceived, jitter, + timeLastSR, timeSinceLastSR); + } else { + ADVANCE(4*5); + } + } + } else { + ADVANCE(reportBlocksSize); + } + + if (pt == RTCP_PT_RR) { // i.e., we didn't fall through from 'SR' + noteArrivingRR(fromAddressAndPort, tcpSocketNum, tcpStreamChannelId); + } + + subPacketOK = True; + typeOfPacket = PACKET_RTCP_REPORT; + break; + } + case RTCP_PT_BYE: { +#ifdef DEBUG + fprintf(stderr, "BYE"); +#endif + // Check whether there was a 'reason for leaving': + if (length > 0) { + u_int8_t reasonLength = *pkt; + if (reasonLength > length-1) { + // The 'reason' length field is too large! +#ifdef DEBUG + fprintf(stderr, "\nError: The 'reason' length %d is too large (it should be <= %d)\n", + reasonLength, length-1); +#endif + reasonLength = length-1; + } + reason = new char[reasonLength + 1]; + for (unsigned i = 0; i < reasonLength; ++i) { + reason[i] = pkt[1+i]; + } + reason[reasonLength] = '\0'; +#ifdef DEBUG + fprintf(stderr, " (reason:%s)", reason); +#endif + } +#ifdef DEBUG + fprintf(stderr, "\n"); +#endif + // If a 'BYE handler' was set, arrange for it to be called at the end of this routine. + // (Note: We don't call it immediately, in case it happens to cause "this" to be deleted.) + if ((fByeHandlerTask != NULL || fByeWithReasonHandlerTask != NULL) + && (!fByeHandleActiveParticipantsOnly + || (fSource != NULL + && fSource->receptionStatsDB().lookup(reportSenderSSRC) != NULL) + || (fSink != NULL + && fSink->transmissionStatsDB().lookup(reportSenderSSRC) != NULL))) { + callByeHandler = True; + } + + // We should really check for & handle >1 SSRCs being present ##### + + subPacketOK = True; + typeOfPacket = PACKET_BYE; + break; + } + case RTCP_PT_APP: { + u_int8_t& subtype = rc; // In "APP" packets, the "rc" field gets used as "subtype" +#ifdef DEBUG + fprintf(stderr, "APP (subtype 0x%02x)\n", subtype); +#endif + if (length < 4) { +#ifdef DEBUG + fprintf(stderr, "\tError: No \"name\" field!\n"); +#endif + break; + } + length -= 4; +#ifdef DEBUG + fprintf(stderr, "\tname:%c%c%c%c\n", pkt[0], pkt[1], pkt[2], pkt[3]); +#endif + u_int32_t nameBytes = (pkt[0]<<24)|(pkt[1]<<16)|(pkt[2]<<8)|(pkt[3]); + ADVANCE(4); // skip over "name", to the 'application-dependent data' +#ifdef DEBUG + fprintf(stderr, "\tapplication-dependent data size: %d bytes\n", length); +#endif + + // If an 'APP' packet handler was set, call it now: + if (fAppHandlerTask != NULL) { + (*fAppHandlerTask)(fAppHandlerClientData, subtype, nameBytes, pkt, length); + } + subPacketOK = True; + typeOfPacket = PACKET_RTCP_APP; + break; + } + // Other RTCP packet types that we don't yet handle: + case RTCP_PT_SDES: { +#ifdef DEBUG + // 'Handle' SDES packets only in debugging code, by printing out the 'SDES items': + fprintf(stderr, "SDES\n"); + + // Process each 'chunk': + Boolean chunkOK = False; + ADVANCE(-4); length += 4; // hack so that we see the first SSRC/CSRC again + while (length >= 8) { // A valid chunk must be at least 8 bytes long + chunkOK = False; // until we learn otherwise + + u_int32_t SSRC_CSRC = ntohl(*(u_int32_t*)pkt); ADVANCE(4); length -= 4; + fprintf(stderr, "\tSSRC/CSRC: 0x%08x\n", SSRC_CSRC); + + // Process each 'SDES item' in the chunk: + u_int8_t itemType = *pkt; ADVANCE(1); --length; + while (itemType != 0) { + unsigned itemLen = *pkt; ADVANCE(1); --length; + // Make sure "itemLen" allows for at least 1 zero byte at the end of the chunk: + if (itemLen + 1 > length || pkt[itemLen] != 0) break; + + fprintf(stderr, "\t\t%s:%s\n", + itemType == 1 ? "CNAME" : + itemType == 2 ? "NAME" : + itemType == 3 ? "EMAIL" : + itemType == 4 ? "PHONE" : + itemType == 5 ? "LOC" : + itemType == 6 ? "TOOL" : + itemType == 7 ? "NOTE" : + itemType == 8 ? "PRIV" : + "(unknown)", + itemType < 8 ? (char*)pkt // hack, because we know it's '\0'-terminated + : "???"/* don't try to print out PRIV or unknown items */); + ADVANCE(itemLen); length -= itemLen; + + itemType = *pkt; ADVANCE(1); --length; + } + if (itemType != 0) break; // bad 'SDES item' + + // Thus, itemType == 0. This zero 'type' marks the end of the list of SDES items. + // Skip over remaining zero padding bytes, so that this chunk ends on a 4-byte boundary: + while (length%4 > 0 && *pkt == 0) { ADVANCE(1); --length; } + if (length%4 > 0) break; // Bad (non-zero) padding byte + + chunkOK = True; + } + if (!chunkOK || length > 0) break; // bad chunk, or not enough bytes for the last chunk +#endif + subPacketOK = True; + break; + } + case RTCP_PT_RTPFB: { +#ifdef DEBUG + fprintf(stderr, "RTPFB(unhandled)\n"); +#endif + subPacketOK = True; + break; + } + case RTCP_PT_PSFB: { +#ifdef DEBUG + fprintf(stderr, "PSFB(unhandled)\n"); + // Temporary code to show "Receiver Estimated Maximum Bitrate" (REMB) feedback reports: + //##### + if (length >= 12 && pkt[4] == 'R' && pkt[5] == 'E' && pkt[6] == 'M' && pkt[7] == 'B') { + u_int8_t exp = pkt[9]>>2; + u_int32_t mantissa = ((pkt[9]&0x03)<<16)|(pkt[10]<<8)|pkt[11]; + double remb = (double)mantissa; + while (exp > 0) { + remb *= 2.0; + exp /= 2; + } + fprintf(stderr, "\tReceiver Estimated Max Bitrate (REMB): %g bps\n", remb); + } +#endif + subPacketOK = True; + break; + } + case RTCP_PT_XR: { +#ifdef DEBUG + fprintf(stderr, "XR(unhandled)\n"); +#endif + subPacketOK = True; + break; + } + case RTCP_PT_AVB: { +#ifdef DEBUG + fprintf(stderr, "AVB(unhandled)\n"); +#endif + subPacketOK = True; + break; + } + case RTCP_PT_RSI: { +#ifdef DEBUG + fprintf(stderr, "RSI(unhandled)\n"); +#endif + subPacketOK = True; + break; + } + case RTCP_PT_TOKEN: { +#ifdef DEBUG + fprintf(stderr, "TOKEN(unhandled)\n"); +#endif + subPacketOK = True; + break; + } + case RTCP_PT_IDMS: { +#ifdef DEBUG + fprintf(stderr, "IDMS(unhandled)\n"); +#endif + subPacketOK = True; + break; + } + default: { +#ifdef DEBUG + fprintf(stderr, "UNKNOWN TYPE(0x%x)\n", pt); +#endif + subPacketOK = True; + break; + } + } + if (!subPacketOK) break; + + // need to check for (& handle) SSRC collision! ##### + +#ifdef DEBUG + fprintf(stderr, "validated RTCP subpacket: rc:%d, pt:%d, bytes remaining:%d, report sender SSRC:0x%08x\n", rc, pt, length, reportSenderSSRC); +#endif + + // Skip over any remaining bytes in this subpacket: + ADVANCE(length); + + // Check whether another RTCP 'subpacket' follows: + if (packetSize == 0) { + packetOK = True; + break; + } else if (packetSize < 4) { +#ifdef DEBUG + fprintf(stderr, "extraneous %d bytes at end of RTCP packet!\n", packetSize); +#endif + break; + } + rtcpHdr = ntohl(*(u_int32_t*)pkt); + if ((rtcpHdr & 0xC0000000) != 0x80000000) { +#ifdef DEBUG + fprintf(stderr, "bad RTCP subpacket: header 0x%08x\n", rtcpHdr); +#endif + break; + } + } + + if (!packetOK) { +#ifdef DEBUG + fprintf(stderr, "rejected bad RTCP subpacket: header 0x%08x\n", rtcpHdr); +#endif + break; + } else { +#ifdef DEBUG + fprintf(stderr, "validated entire RTCP packet\n"); +#endif + } + + onReceive(typeOfPacket, totPacketSize, reportSenderSSRC); + + // Finally, if we need to call a "BYE" handler, do so now (in case it causes "this" to get deleted): + if (callByeHandler) { + if (fByeHandlerTask != NULL) { // call a BYE handler without including a 'reason' + TaskFunc* byeHandler = fByeHandlerTask; + fByeHandlerTask = NULL; // because we call the handler only once, by default + (*byeHandler)(fByeHandlerClientData); + } else if (fByeWithReasonHandlerTask != NULL) { // call a BYE handler that includes a 'reason' + ByeWithReasonHandlerFunc* byeHandler = fByeWithReasonHandlerTask; + fByeWithReasonHandlerTask = NULL; // because we call the handler only once, by default + (*byeHandler)(fByeHandlerClientData, reason); + // Note that the handler function is responsible for delete[]ing "reason" + } + } + } while (0); +} + +void RTCPInstance::onReceive(int typeOfPacket, int totPacketSize, u_int32_t ssrc) { + fTypeOfPacket = typeOfPacket; + fLastReceivedSize = totPacketSize; + fLastReceivedSSRC = ssrc; + + int members = (int)numMembers(); + int senders = (fSink != NULL) ? 1 : 0; + + OnReceive(this, // p + this, // e + &members, // members + &fPrevNumMembers, // pmembers + &senders, // senders + &fAveRTCPSize, // avg_rtcp_size + &fPrevReportTime, // tp + dTimeNow(), // tc + fNextReportTime); +} + +void RTCPInstance::sendReport() { +#ifdef DEBUG + fprintf(stderr, "sending REPORT\n"); +#endif + // Begin by including a SR and/or RR report: + if (!addReport()) return; + + // Then, include a SDES: + addSDES(); + + // Send the report: + sendBuiltPacket(); + + // Periodically clean out old members from our SSRC membership database: + const unsigned membershipReapPeriod = 5; + if ((++fOutgoingReportCount) % membershipReapPeriod == 0) { + unsigned threshold = fOutgoingReportCount - membershipReapPeriod; + fKnownMembers->reapOldMembers(threshold); + } +} + +void RTCPInstance::sendBYE(char const* reason) { +#ifdef DEBUG + if (reason != NULL) { + fprintf(stderr, "sending BYE (reason:%s)\n", reason); + } else { + fprintf(stderr, "sending BYE\n"); + } +#endif + // The packet must begin with a SR and/or RR report: + (void)addReport(True); + + addBYE(reason); + sendBuiltPacket(); +} + +void RTCPInstance::sendBuiltPacket() { +#ifdef DEBUG + fprintf(stderr, "sending RTCP packet\n"); + unsigned char* p = fOutBuf->packet(); + for (unsigned i = 0; i < fOutBuf->curPacketSize(); ++i) { + if (i%4 == 0) fprintf(stderr," "); + fprintf(stderr, "%02x", p[i]); + } + fprintf(stderr, "\n"); +#endif + unsigned reportSize = fOutBuf->curPacketSize(); + if (fCrypto != NULL) { // Encrypt/tag the data before sending it: + unsigned newReportSize; + if (!fCrypto->processOutgoingSRTCPPacket(fOutBuf->packet(), reportSize, newReportSize)) return; + reportSize = newReportSize; + } + fRTCPInterface.sendPacket(fOutBuf->packet(), reportSize); + fOutBuf->resetOffset(); + + fLastSentSize = IP_UDP_HDR_SIZE + reportSize; + fHaveJustSentPacket = True; + fLastPacketSentSize = reportSize; +} + +int RTCPInstance::checkNewSSRC() { + return fKnownMembers->noteMembership(fLastReceivedSSRC, + fOutgoingReportCount); +} + +void RTCPInstance::removeLastReceivedSSRC() { + removeSSRC(fLastReceivedSSRC, False/*keep stats around*/); +} + +void RTCPInstance::removeSSRC(u_int32_t ssrc, Boolean alsoRemoveStats) { + fKnownMembers->remove(ssrc); + + if (alsoRemoveStats) { + // Also, remove records of this SSRC from any reception or transmission stats + if (fSource != NULL) fSource->receptionStatsDB().removeRecord(ssrc); + if (fSink != NULL) fSink->transmissionStatsDB().removeRecord(ssrc); + } +} + +void RTCPInstance::onExpire(RTCPInstance* instance) { + instance->onExpire1(); +} + +// Member functions to build specific kinds of report: + +Boolean RTCPInstance::addReport(Boolean alwaysAdd) { + // Include a SR or a RR, depending on whether we have an associated sink or source: + if (fSink != NULL) { + if (!alwaysAdd) { + if (!fSink->enableRTCPReports()) return False; + + // Hack: Don't send a SR during those (brief) times when the timestamp of the + // next outgoing RTP packet has been preset, to ensure that that timestamp gets + // used for that outgoing packet. (David Bertrand, 2006.07.18) + if (fSink->nextTimestampHasBeenPreset()) return False; + } + + addSR(); + } + if (fSource != NULL) { + if (!alwaysAdd) { + if (!fSource->enableRTCPReports()) return False; + } + + addRR(); + } + + return True; +} + +void RTCPInstance::addSR() { + // ASSERT: fSink != NULL + + enqueueCommonReportPrefix(RTCP_PT_SR, fSink->SSRC(), + 5 /* extra words in a SR */); + + // Now, add the 'sender info' for our sink + + // Insert the NTP and RTP timestamps for the 'wallclock time': + struct timeval timeNow; + gettimeofday(&timeNow, NULL); + fOutBuf->enqueueWord(timeNow.tv_sec + 0x83AA7E80); + // NTP timestamp most-significant word (1970 epoch -> 1900 epoch) + double fractionalPart = (timeNow.tv_usec/15625.0)*0x04000000; // 2^32/10^6 + fOutBuf->enqueueWord((unsigned)(fractionalPart+0.5)); + // NTP timestamp least-significant word + unsigned rtpTimestamp = fSink->convertToRTPTimestamp(timeNow); + fOutBuf->enqueueWord(rtpTimestamp); // RTP ts + + // Insert the packet and byte counts: + fOutBuf->enqueueWord(fSink->packetCount()); + fOutBuf->enqueueWord(fSink->octetCount()); + + enqueueCommonReportSuffix(); +} + +void RTCPInstance::addRR() { + // ASSERT: fSource != NULL + + enqueueCommonReportPrefix(RTCP_PT_RR, fSource->SSRC()); + enqueueCommonReportSuffix(); +} + +void RTCPInstance::enqueueCommonReportPrefix(unsigned char packetType, + u_int32_t SSRC, + unsigned numExtraWords) { + unsigned numReportingSources; + if (fSource == NULL) { + numReportingSources = 0; // we don't receive anything + } else { + RTPReceptionStatsDB& allReceptionStats + = fSource->receptionStatsDB(); + numReportingSources = allReceptionStats.numActiveSourcesSinceLastReset(); + // This must be <32, to fit in 5 bits: + if (numReportingSources >= 32) { numReportingSources = 32; } + // Later: support adding more reports to handle >32 sources (unlikely)##### + } + + unsigned rtcpHdr = 0x80000000; // version 2, no padding + rtcpHdr |= (numReportingSources<<24); + rtcpHdr |= (packetType<<16); + rtcpHdr |= (1 + numExtraWords + 6*numReportingSources); + // each report block is 6 32-bit words long + fOutBuf->enqueueWord(rtcpHdr); + + fOutBuf->enqueueWord(SSRC); +} + +void RTCPInstance::enqueueCommonReportSuffix() { + // Output the report blocks for each source: + if (fSource != NULL) { + RTPReceptionStatsDB& allReceptionStats + = fSource->receptionStatsDB(); + + RTPReceptionStatsDB::Iterator iterator(allReceptionStats); + while (1) { + RTPReceptionStats* receptionStats = iterator.next(); + if (receptionStats == NULL) break; + enqueueReportBlock(receptionStats); + } + + allReceptionStats.reset(); // because we have just generated a report + } +} + +void +RTCPInstance::enqueueReportBlock(RTPReceptionStats* stats) { + fOutBuf->enqueueWord(stats->SSRC()); + + unsigned highestExtSeqNumReceived = stats->highestExtSeqNumReceived(); + + unsigned totNumExpected + = highestExtSeqNumReceived - stats->baseExtSeqNumReceived(); + int totNumLost = totNumExpected - stats->totNumPacketsReceived(); + // 'Clamp' this loss number to a 24-bit signed value: + if (totNumLost > 0x007FFFFF) { + totNumLost = 0x007FFFFF; + } else if (totNumLost < 0) { + if (totNumLost < -0x00800000) totNumLost = 0x00800000; // unlikely, but... + totNumLost &= 0x00FFFFFF; + } + + unsigned numExpectedSinceLastReset + = highestExtSeqNumReceived - stats->lastResetExtSeqNumReceived(); + int numLostSinceLastReset + = numExpectedSinceLastReset - stats->numPacketsReceivedSinceLastReset(); + unsigned char lossFraction; + if (numExpectedSinceLastReset == 0 || numLostSinceLastReset < 0) { + lossFraction = 0; + } else { + lossFraction = (unsigned char) + ((numLostSinceLastReset << 8) / numExpectedSinceLastReset); + } + + fOutBuf->enqueueWord((lossFraction<<24) | totNumLost); + fOutBuf->enqueueWord(highestExtSeqNumReceived); + + fOutBuf->enqueueWord(stats->jitter()); + + unsigned NTPmsw = stats->lastReceivedSR_NTPmsw(); + unsigned NTPlsw = stats->lastReceivedSR_NTPlsw(); + unsigned LSR = ((NTPmsw&0xFFFF)<<16)|(NTPlsw>>16); // middle 32 bits + fOutBuf->enqueueWord(LSR); + + // Figure out how long has elapsed since the last SR rcvd from this src: + struct timeval const& LSRtime = stats->lastReceivedSR_time(); // "last SR" + struct timeval timeNow, timeSinceLSR; + gettimeofday(&timeNow, NULL); + if (timeNow.tv_usec < LSRtime.tv_usec) { + timeNow.tv_usec += 1000000; + timeNow.tv_sec -= 1; + } + timeSinceLSR.tv_sec = timeNow.tv_sec - LSRtime.tv_sec; + timeSinceLSR.tv_usec = timeNow.tv_usec - LSRtime.tv_usec; + // The enqueued time is in units of 1/65536 seconds. + // (Note that 65536/1000000 == 1024/15625) + unsigned DLSR; + if (LSR == 0) { + DLSR = 0; + } else { + DLSR = (timeSinceLSR.tv_sec<<16) + | ( (((timeSinceLSR.tv_usec<<11)+15625)/31250) & 0xFFFF); + } + fOutBuf->enqueueWord(DLSR); +} + +void RTCPInstance::addSDES() { + // For now we support only the CNAME item; later support more ##### + + // Begin by figuring out the size of the entire SDES report: + unsigned numBytes = 4; + // counts the SSRC, but not the header; it'll get subtracted out + numBytes += fCNAME.totalSize(); // includes id and length + numBytes += 1; // the special END item + + unsigned num4ByteWords = (numBytes + 3)/4; + + unsigned rtcpHdr = 0x81000000; // version 2, no padding, 1 SSRC chunk + rtcpHdr |= (RTCP_PT_SDES<<16); + rtcpHdr |= num4ByteWords; + fOutBuf->enqueueWord(rtcpHdr); + + if (fSource != NULL) { + fOutBuf->enqueueWord(fSource->SSRC()); + } else if (fSink != NULL) { + fOutBuf->enqueueWord(fSink->SSRC()); + } + + // Add the CNAME: + fOutBuf->enqueue(fCNAME.data(), fCNAME.totalSize()); + + // Add the 'END' item (i.e., a zero byte), plus any more needed to pad: + unsigned numPaddingBytesNeeded = 4 - (fOutBuf->curPacketSize() % 4); + unsigned char const zero = '\0'; + while (numPaddingBytesNeeded-- > 0) fOutBuf->enqueue(&zero, 1); +} + +void RTCPInstance::addBYE(char const* reason) { + u_int32_t rtcpHdr = 0x81000000; // version 2, no padding, 1 SSRC + rtcpHdr |= (RTCP_PT_BYE<<16); + u_int16_t num32BitWords = 2; // by default, two 32-bit words total (i.e., with 1 SSRC) + u_int8_t reasonLength8Bits = 0; // by default + if (reason != NULL) { + // We need to add more 32-bit words for the 'length+reason': + unsigned const reasonLength = strlen(reason); + reasonLength8Bits = reasonLength < 0xFF ? (u_int8_t)reasonLength : 0xFF; + unsigned numExtraWords = ((1/*reason length field*/+reasonLength8Bits)+3)/4; + + num32BitWords += numExtraWords; + } + rtcpHdr |= (num32BitWords-1); // length field + fOutBuf->enqueueWord(rtcpHdr); + + if (fSource != NULL) { + fOutBuf->enqueueWord(fSource->SSRC()); + } else if (fSink != NULL) { + fOutBuf->enqueueWord(fSink->SSRC()); + } + + num32BitWords -= 2; // ASSERT: num32BitWords >= 0 + if (num32BitWords > 0) { + // Add a length+'reason for leaving': + // First word: + u_int32_t lengthPlusFirst3ReasonBytes = reasonLength8Bits<<24; + unsigned index = 0; + if (reasonLength8Bits > index) lengthPlusFirst3ReasonBytes |= ((u_int8_t)reason[index++])<<16; + if (reasonLength8Bits > index) lengthPlusFirst3ReasonBytes |= ((u_int8_t)reason[index++])<<8; + if (reasonLength8Bits > index) lengthPlusFirst3ReasonBytes |= (u_int8_t)reason[index++]; + fOutBuf->enqueueWord(lengthPlusFirst3ReasonBytes); + + // Any subsequent words: + if (reasonLength8Bits > 3) { + // ASSERT: num32BitWords > 1 + while (--num32BitWords > 0) { + u_int32_t fourMoreReasonBytes = 0; + if (reasonLength8Bits > index) fourMoreReasonBytes |= ((u_int8_t)reason[index++])<<24; + if (reasonLength8Bits > index) fourMoreReasonBytes |= ((u_int8_t)reason[index++])<<16; + if (reasonLength8Bits > index) fourMoreReasonBytes |= ((u_int8_t)reason[index++])<<8; + if (reasonLength8Bits > index) fourMoreReasonBytes |= (u_int8_t)reason[index++]; + fOutBuf->enqueueWord(fourMoreReasonBytes); + } + } + } +} + +void RTCPInstance::schedule(double nextTime) { + fNextReportTime = nextTime; + + double secondsToDelay = nextTime - dTimeNow(); + if (secondsToDelay < 0) secondsToDelay = 0; +#ifdef DEBUG + fprintf(stderr, "schedule(%f->%f)\n", secondsToDelay, nextTime); +#endif + int64_t usToGo = (int64_t)(secondsToDelay * 1000000); + nextTask() = envir().taskScheduler().scheduleDelayedTask(usToGo, + (TaskFunc*)RTCPInstance::onExpire, this); +} + +void RTCPInstance::reschedule(double nextTime) { + envir().taskScheduler().unscheduleDelayedTask(nextTask()); + schedule(nextTime); +} + +void RTCPInstance::onExpire1() { + nextTask() = NULL; + + // Note: fTotSessionBW is kbits per second + double rtcpBW = 0.05*fTotSessionBW*1024/8; // -> bytes per second + + OnExpire(this, // event + numMembers(), // members + (fSink != NULL) ? 1 : 0, // senders + rtcpBW, // rtcp_bw + (fSink != NULL) ? 1 : 0, // we_sent + &fAveRTCPSize, // ave_rtcp_size + &fIsInitial, // initial + dTimeNow(), // tc + &fPrevReportTime, // tp + &fPrevNumMembers // pmembers + ); +} + +////////// SDESItem ////////// + +SDESItem::SDESItem(unsigned char tag, unsigned char const* value) { + unsigned length = strlen((char const*)value); + if (length > 0xFF) length = 0xFF; // maximum data length for a SDES item + + fData[0] = tag; + fData[1] = (unsigned char)length; + memmove(&fData[2], value, length); +} + +unsigned SDESItem::totalSize() const { + return 2 + (unsigned)fData[1]; +} + + +////////// Implementation of routines imported by the "rtcp_from_spec" C code + +extern "C" void Schedule(double nextTime, event e) { + RTCPInstance* instance = (RTCPInstance*)e; + if (instance == NULL) return; + + instance->schedule(nextTime); +} + +extern "C" void Reschedule(double nextTime, event e) { + RTCPInstance* instance = (RTCPInstance*)e; + if (instance == NULL) return; + + instance->reschedule(nextTime); +} + +extern "C" void SendRTCPReport(event e) { + RTCPInstance* instance = (RTCPInstance*)e; + if (instance == NULL) return; + + instance->sendReport(); +} + +extern "C" void SendBYEPacket(event e) { + RTCPInstance* instance = (RTCPInstance*)e; + if (instance == NULL) return; + + instance->sendBYE(); +} + +extern "C" int TypeOfEvent(event e) { + RTCPInstance* instance = (RTCPInstance*)e; + if (instance == NULL) return EVENT_UNKNOWN; + + return instance->typeOfEvent(); +} + +extern "C" int SentPacketSize(event e) { + RTCPInstance* instance = (RTCPInstance*)e; + if (instance == NULL) return 0; + + return instance->sentPacketSize(); +} + +extern "C" int PacketType(packet p) { + RTCPInstance* instance = (RTCPInstance*)p; + if (instance == NULL) return PACKET_UNKNOWN_TYPE; + + return instance->packetType(); +} + +extern "C" int ReceivedPacketSize(packet p) { + RTCPInstance* instance = (RTCPInstance*)p; + if (instance == NULL) return 0; + + return instance->receivedPacketSize(); +} + +extern "C" int NewMember(packet p) { + RTCPInstance* instance = (RTCPInstance*)p; + if (instance == NULL) return 0; + + return instance->checkNewSSRC(); +} + +extern "C" int NewSender(packet /*p*/) { + return 0; // we don't yet recognize senders other than ourselves ##### +} + +extern "C" void AddMember(packet /*p*/) { + // Do nothing; all of the real work was done when NewMember() was called +} + +extern "C" void AddSender(packet /*p*/) { + // we don't yet recognize senders other than ourselves ##### +} + +extern "C" void RemoveMember(packet p) { + RTCPInstance* instance = (RTCPInstance*)p; + if (instance == NULL) return; + + instance->removeLastReceivedSSRC(); +} + +extern "C" void RemoveSender(packet /*p*/) { + // we don't yet recognize senders other than ourselves ##### +} + +extern "C" double drand30() { + unsigned tmp = our_random()&0x3FFFFFFF; // a random 30-bit integer + return tmp/(double)(1024*1024*1024); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/RTPInterface.cpp b/src/big/mpp/middleware/src/live555/liveMedia/RTPInterface.cpp new file mode 100644 index 000000000..d91b1c3fc --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/RTPInterface.cpp @@ -0,0 +1,661 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// An abstraction of a network interface used for RTP (or RTCP). +// (This allows the RTP-over-TCP hack (RFC 2326, section 10.12) to +// be implemented transparently.) +// Implementation + +#include "RTPInterface.hh" +#include +#include + +////////// Helper Functions - Definition ////////// + +// Helper routines and data structures, used to implement +// sending/receiving RTP/RTCP over a TCP socket: + +class tcpStreamRecord { + public: + tcpStreamRecord(int streamSocketNum, unsigned char streamChannelId, + TLSState* tlsState, + tcpStreamRecord* next); + virtual ~tcpStreamRecord(); + +public: + tcpStreamRecord* fNext; + int fStreamSocketNum; + unsigned char fStreamChannelId; + TLSState* fTLSState; +}; + +// Reading RTP-over-TCP is implemented using two levels of hash tables. +// The top-level hash table maps TCP socket numbers to a +// "SocketDescriptor" that contains a hash table for each of the +// sub-channels that are reading from this socket. + +static HashTable* socketHashTable(UsageEnvironment& env, Boolean createIfNotPresent = True) { + _Tables* ourTables = _Tables::getOurTables(env, createIfNotPresent); + if (ourTables == NULL) return NULL; + + if (ourTables->socketTable == NULL) { + // Create a new socket number -> SocketDescriptor mapping table: + ourTables->socketTable = HashTable::create(ONE_WORD_HASH_KEYS); + } + return (HashTable*)(ourTables->socketTable); +} + +class SocketDescriptor { +public: + SocketDescriptor(UsageEnvironment& env, int socketNum, TLSState* tlsState); + virtual ~SocketDescriptor(); + + void registerRTPInterface(unsigned char streamChannelId, + RTPInterface* rtpInterface); + RTPInterface* lookupRTPInterface(unsigned char streamChannelId); + void deregisterRTPInterface(unsigned char streamChannelId); + + void setServerRequestAlternativeByteHandler(ServerRequestAlternativeByteHandler* handler, void* clientData) { + fServerRequestAlternativeByteHandler = handler; + fServerRequestAlternativeByteHandlerClientData = clientData; + } + +private: + static void tcpReadHandler(SocketDescriptor*, int mask); + Boolean tcpReadHandler1(int mask); + +private: + UsageEnvironment& fEnv; + int fOurSocketNum; + TLSState* fTLSState; + HashTable* fSubChannelHashTable; + ServerRequestAlternativeByteHandler* fServerRequestAlternativeByteHandler; + void* fServerRequestAlternativeByteHandlerClientData; + u_int8_t fStreamChannelId, fSizeByte1; + Boolean fReadErrorOccurred, fDeleteMyselfNext, fAreInReadHandlerLoop; + enum { AWAITING_DOLLAR, AWAITING_STREAM_CHANNEL_ID, AWAITING_SIZE1, AWAITING_SIZE2, AWAITING_PACKET_DATA } fTCPReadingState; +}; + +static SocketDescriptor* +lookupSocketDescriptor(UsageEnvironment& env, int sockNum, TLSState* tlsState = NULL, + Boolean createIfNotFound = True) { + HashTable* table = socketHashTable(env, createIfNotFound); + if (table == NULL) return NULL; + + char const* key = (char const*)(long)sockNum; + SocketDescriptor* socketDescriptor = (SocketDescriptor*)(table->Lookup(key)); + if (socketDescriptor == NULL) { + if (createIfNotFound) { + socketDescriptor = new SocketDescriptor(env, sockNum, tlsState); + table->Add((char const*)(long)(sockNum), socketDescriptor); + } else if (table->IsEmpty()) { + // We can also delete the table (to reclaim space): + _Tables* ourTables = _Tables::getOurTables(env); + delete table; + ourTables->socketTable = NULL; + ourTables->reclaimIfPossible(); + } + } + + return socketDescriptor; +} + +static void removeSocketDescription(UsageEnvironment& env, int sockNum) { + char const* key = (char const*)(long)sockNum; + HashTable* table = socketHashTable(env); + table->Remove(key); + + if (table->IsEmpty()) { + // We can also delete the table (to reclaim space): + _Tables* ourTables = _Tables::getOurTables(env); + delete table; + ourTables->socketTable = NULL; + ourTables->reclaimIfPossible(); + } +} + + +////////// RTPInterface - Implementation ////////// + +RTPInterface::RTPInterface(Medium* owner, Groupsock* gs) + : fOwner(owner), fGS(gs), + fTCPStreams(NULL), + fNextTCPReadSize(0), fNextTCPReadStreamSocketNum(-1), + fNextTCPReadStreamChannelId(0xFF), fNextTCPReadTLSState(NULL), fReadHandlerProc(NULL), + fAuxReadHandlerFunc(NULL), fAuxReadHandlerClientData(NULL) { + // Make the socket non-blocking, even though it will be read from only asynchronously, when packets arrive. + // The reason for this is that, in some OSs, reads on a blocking socket can (allegedly) sometimes block, + // even if the socket was previously reported (e.g., by "select()") as having data available. + // (This can supposedly happen if the UDP checksum fails, for example.) + makeSocketNonBlocking(fGS->socketNum()); + // increaseSendBufferTo(envir(), fGS->socketNum(), 50*1024); + increaseSendBufferTo(envir(), fGS->socketNum(), 1024 *1024); +} + +RTPInterface::~RTPInterface() { + stopNetworkReading(); + delete fTCPStreams; +} + +void RTPInterface::setStreamSocket(int sockNum, unsigned char streamChannelId, + TLSState* tlsState) { + fGS->removeAllDestinations(); + envir().taskScheduler().disableBackgroundHandling(fGS->socketNum()); // turn off any reading on our datagram socket + fGS->reset(); // and close our datagram socket, because we won't be using it anymore + + addStreamSocket(sockNum, streamChannelId, tlsState); +} + +void RTPInterface::addStreamSocket(int sockNum, unsigned char streamChannelId, + TLSState* tlsState) { + if (sockNum < 0) return; + + for (tcpStreamRecord* streams = fTCPStreams; streams != NULL; + streams = streams->fNext) { + if (streams->fStreamSocketNum == sockNum + && streams->fStreamChannelId == streamChannelId) { + return; // we already have it + } + } + + fTCPStreams = new tcpStreamRecord(sockNum, streamChannelId, tlsState, fTCPStreams); + + // Also, make sure this new socket is set up for receiving RTP/RTCP-over-TCP: + SocketDescriptor* socketDescriptor = lookupSocketDescriptor(envir(), sockNum, tlsState); + socketDescriptor->registerRTPInterface(streamChannelId, this); +} + +static void deregisterSocket(UsageEnvironment& env, int sockNum, unsigned char streamChannelId) { + SocketDescriptor* socketDescriptor = lookupSocketDescriptor(env, sockNum, NULL, False); + if (socketDescriptor != NULL) { + socketDescriptor->deregisterRTPInterface(streamChannelId); + // Note: This may delete "socketDescriptor", + // if no more interfaces are using this socket + } +} + +void RTPInterface::removeStreamSocket(int sockNum, + unsigned char streamChannelId) { + // Remove - from our list of 'TCP streams' - the record of the (sockNum,streamChannelId) pair. + // (However "streamChannelId" == 0xFF is a special case, meaning remove all + // (sockNum,*) pairs.) + + while (1) { + tcpStreamRecord** streamsPtr = &fTCPStreams; + + while (*streamsPtr != NULL) { + if ((*streamsPtr)->fStreamSocketNum == sockNum + && (streamChannelId == 0xFF || streamChannelId == (*streamsPtr)->fStreamChannelId)) { + // Delete the record pointed to by *streamsPtr : + unsigned char streamChannelIdToRemove = (*streamsPtr)->fStreamChannelId; + tcpStreamRecord* next = (*streamsPtr)->fNext; + (*streamsPtr)->fNext = NULL; + delete (*streamsPtr); + *streamsPtr = next; + + // And 'deregister' this socket,channelId pair: + deregisterSocket(envir(), sockNum, streamChannelIdToRemove); + + if (streamChannelId != 0xFF) return; // we're done + break; // start again from the beginning of the list, in case the list has changed + } else { + streamsPtr = &((*streamsPtr)->fNext); + } + } + if (*streamsPtr == NULL) break; + } +} + +void RTPInterface::setServerRequestAlternativeByteHandler(UsageEnvironment& env, int socketNum, + ServerRequestAlternativeByteHandler* handler, void* clientData) { + SocketDescriptor* socketDescriptor = lookupSocketDescriptor(env, socketNum, NULL, False); + + if (socketDescriptor != NULL) socketDescriptor->setServerRequestAlternativeByteHandler(handler, clientData); +} + +void RTPInterface::clearServerRequestAlternativeByteHandler(UsageEnvironment& env, int socketNum) { + setServerRequestAlternativeByteHandler(env, socketNum, NULL, NULL); +} + +Boolean RTPInterface::sendPacket(unsigned char* packet, unsigned packetSize) { + Boolean success = True; // we'll return False instead if any of the sends fail + + // Normal case: Send as a UDP packet: + if (!fGS->output(envir(), packet, packetSize)) success = False; + + // Also, send over each of our TCP sockets: + tcpStreamRecord* nextStream; + for (tcpStreamRecord* stream = fTCPStreams; stream != NULL; stream = nextStream) { + nextStream = stream->fNext; // Set this now, in case the following deletes "stream": + if (!sendRTPorRTCPPacketOverTCP(packet, packetSize, + stream->fStreamSocketNum, stream->fStreamChannelId, + stream->fTLSState)) { + success = False; + } + } + + return success; +} + +void RTPInterface +::startNetworkReading(TaskScheduler::BackgroundHandlerProc* handlerProc) { + // Normal case: Arrange to read UDP packets: + envir().taskScheduler(). + turnOnBackgroundReadHandling(fGS->socketNum(), handlerProc, fOwner); + + // Also, receive RTP over TCP, on each of our TCP connections: + fReadHandlerProc = handlerProc; + for (tcpStreamRecord* streams = fTCPStreams; streams != NULL; + streams = streams->fNext) { + // Get a socket descriptor for "streams->fStreamSocketNum": + SocketDescriptor* socketDescriptor = lookupSocketDescriptor(envir(), streams->fStreamSocketNum); + + // Tell it about our subChannel: + socketDescriptor->registerRTPInterface(streams->fStreamChannelId, this); + } +} + +Boolean RTPInterface::handleRead(unsigned char* buffer, unsigned bufferMaxSize, + unsigned& bytesRead, struct sockaddr_storage& fromAddress, + int& tcpSocketNum, unsigned char& tcpStreamChannelId, + Boolean& packetReadWasIncomplete) { + packetReadWasIncomplete = False; // by default + Boolean readSuccess; + if (fNextTCPReadStreamSocketNum < 0) { + // Normal case: read from the (datagram) 'groupsock': + tcpSocketNum = -1; + readSuccess = fGS->handleRead(buffer, bufferMaxSize, bytesRead, fromAddress); + } else { + // Read from the TCP connection: + tcpSocketNum = fNextTCPReadStreamSocketNum; + tcpStreamChannelId = fNextTCPReadStreamChannelId; + + bytesRead = 0; + unsigned totBytesToRead = fNextTCPReadSize; + if (totBytesToRead > bufferMaxSize) totBytesToRead = bufferMaxSize; + unsigned curBytesToRead = totBytesToRead; + int curBytesRead; + // Because we're calling "readSocket()" on a stream socket, we don't expect "fromAddress" + // to be filled in, so set it to a 'dummy' value instead: + fromAddress.ss_family = AF_INET; + ((sockaddr_in&)fromAddress).sin_addr.s_addr = 0; + ((sockaddr_in&)fromAddress).sin_port = 0; + + while ((curBytesRead = (fNextTCPReadTLSState != NULL && fNextTCPReadTLSState->isNeeded) + ? fNextTCPReadTLSState->read(&buffer[bytesRead], curBytesToRead) + : readSocket(envir(), fNextTCPReadStreamSocketNum, + &buffer[bytesRead], curBytesToRead, + fromAddress)) > 0) { + bytesRead += curBytesRead; + if (bytesRead >= totBytesToRead) break; + curBytesToRead -= curBytesRead; + } + fNextTCPReadSize -= bytesRead; + if (fNextTCPReadSize == 0) { + // We've read all of the data that we asked for + readSuccess = True; + } else if (curBytesRead < 0) { + // There was an error reading the socket + bytesRead = 0; + readSuccess = False; + } else { + // We need to read more bytes, and there was not an error reading the socket + packetReadWasIncomplete = True; + return True; + } + fNextTCPReadStreamSocketNum = -1; // default, for next time + } + + if (readSuccess && fAuxReadHandlerFunc != NULL) { + // Also pass the newly-read packet data to our auxilliary handler: + (*fAuxReadHandlerFunc)(fAuxReadHandlerClientData, buffer, bytesRead); + } + return readSuccess; +} + +void RTPInterface::stopNetworkReading() { + // Normal case + if (fGS != NULL) envir().taskScheduler().turnOffBackgroundReadHandling(fGS->socketNum()); + + // Also turn off read handling on each of our TCP connections: + for (tcpStreamRecord* streams = fTCPStreams; streams != NULL; streams = streams->fNext) { + deregisterSocket(envir(), streams->fStreamSocketNum, streams->fStreamChannelId); + } +} + + +////////// Helper Functions - Implementation ///////// + +Boolean RTPInterface::sendRTPorRTCPPacketOverTCP(u_int8_t* packet, unsigned packetSize, + int socketNum, unsigned char streamChannelId, + TLSState* tlsState) { +#ifdef DEBUG_SEND + fprintf(stderr, "sendRTPorRTCPPacketOverTCP: %d bytes over channel %d (socket %d)\n", + packetSize, streamChannelId, socketNum); fflush(stderr); +#endif + // Send a RTP/RTCP packet over TCP, using the encoding defined in RFC 2326, section 10.12: + // $ + // (If the initial "send()" of '$' succeeds, then we force + // the subsequent "send()" for the data to succeed, even if we have to do so with + // a blocking "send()".) + do { + u_int8_t framingHeader[4]; + framingHeader[0] = '$'; + framingHeader[1] = streamChannelId; + framingHeader[2] = (u_int8_t) ((packetSize&0xFF00)>>8); + framingHeader[3] = (u_int8_t) (packetSize&0xFF); + if (!sendDataOverTCP(socketNum, tlsState, framingHeader, 4, False)) break; + + if (!sendDataOverTCP(socketNum, tlsState, packet, packetSize, True)) break; +#ifdef DEBUG_SEND + fprintf(stderr, "sendRTPorRTCPPacketOverTCP: completed\n"); fflush(stderr); +#endif + + return True; + } while (0); + +#ifdef DEBUG_SEND + fprintf(stderr, "sendRTPorRTCPPacketOverTCP: failed! (errno %d)\n", envir().getErrno()); fflush(stderr); +#endif + return False; +} + +#ifndef RTPINTERFACE_BLOCKING_WRITE_TIMEOUT_MS +#define RTPINTERFACE_BLOCKING_WRITE_TIMEOUT_MS 500 +#endif + +Boolean RTPInterface::sendDataOverTCP(int socketNum, TLSState* tlsState, + u_int8_t const* data, unsigned dataSize, + Boolean forceSendToSucceed) { + int sendResult = (tlsState != NULL && tlsState->isNeeded) + ? tlsState->write((char const*)data, dataSize) + : send(socketNum, (char const*)data, dataSize, 0/*flags*/); + if (sendResult < (int)dataSize) { + // The TCP send() failed - at least partially. + + unsigned numBytesSentSoFar = sendResult < 0 ? 0 : (unsigned)sendResult; + if (numBytesSentSoFar > 0 || (forceSendToSucceed && envir().getErrno() == EAGAIN)) { + // The OS's TCP send buffer has filled up (because the stream's bitrate has exceeded + // the capacity of the TCP connection!). + // Force this data write to succeed, by blocking if necessary until it does: + unsigned numBytesRemainingToSend = dataSize - numBytesSentSoFar; +#ifdef DEBUG_SEND + fprintf(stderr, "sendDataOverTCP: resending %d-byte send (blocking)\n", numBytesRemainingToSend); fflush(stderr); +#endif + makeSocketBlocking(socketNum, RTPINTERFACE_BLOCKING_WRITE_TIMEOUT_MS); + sendResult = (tlsState != NULL && tlsState->isNeeded) + ? tlsState->write((char const*)(&data[numBytesSentSoFar]), numBytesRemainingToSend) + : send(socketNum, (char const*)(&data[numBytesSentSoFar]), numBytesRemainingToSend, 0/*flags*/); + makeSocketNonBlocking(socketNum); + if ((unsigned)sendResult != numBytesRemainingToSend) { + // The blocking "send()" failed, or timed out. In either case, we assume that the + // TCP connection has failed (or is 'hanging' indefinitely), and we stop using it + // (for both RTP and RTP). + // (If we kept using the socket here, the RTP or RTCP packet write would be in an + // incomplete, inconsistent state.) +#ifdef DEBUG_SEND + fprintf(stderr, "sendDataOverTCP: blocking send() failed (delivering %d bytes out of %d); closing socket %d\n", sendResult, numBytesRemainingToSend, socketNum); fflush(stderr); +#endif + removeStreamSocket(socketNum, 0xFF); + return False; + } + + return True; + } else if (sendResult < 0 && envir().getErrno() != EAGAIN) { + // Because the "send()" call failed, assume that the socket is now unusable, so stop + // using it (for both RTP and RTCP): + removeStreamSocket(socketNum, 0xFF); + } + + return False; + } + + return True; +} + +SocketDescriptor::SocketDescriptor(UsageEnvironment& env, int socketNum, TLSState* tlsState) + : fEnv(env), fOurSocketNum(socketNum), fTLSState(tlsState), + fSubChannelHashTable(HashTable::create(ONE_WORD_HASH_KEYS)), + fServerRequestAlternativeByteHandler(NULL), fServerRequestAlternativeByteHandlerClientData(NULL), + fReadErrorOccurred(False), fDeleteMyselfNext(False), fAreInReadHandlerLoop(False), fTCPReadingState(AWAITING_DOLLAR) { +} + +SocketDescriptor::~SocketDescriptor() { + fEnv.taskScheduler().turnOffBackgroundReadHandling(fOurSocketNum); + removeSocketDescription(fEnv, fOurSocketNum); + + if (fSubChannelHashTable != NULL) { + // Remove knowledge of this socket from any "RTPInterface"s that are using it: + HashTable::Iterator* iter = HashTable::Iterator::create(*fSubChannelHashTable); + RTPInterface* rtpInterface; + char const* key; + + while ((rtpInterface = (RTPInterface*)(iter->next(key))) != NULL) { + u_int64_t streamChannelIdLong = (u_int64_t)key; + unsigned char streamChannelId = (unsigned char)streamChannelIdLong; + + rtpInterface->removeStreamSocket(fOurSocketNum, streamChannelId); + } + delete iter; + + // Then remove the hash table entries themselves, and then remove the hash table: + while (fSubChannelHashTable->RemoveNext() != NULL) {} + delete fSubChannelHashTable; + } + + // Finally: + if (fServerRequestAlternativeByteHandler != NULL) { + // Hack: Pass a special character to our alternative byte handler, to tell it that either + // - an error occurred when reading the TCP socket, or + // - no error occurred, but it needs to take over control of the TCP socket once again. + u_int8_t specialChar = fReadErrorOccurred ? 0xFF : 0xFE; + (*fServerRequestAlternativeByteHandler)(fServerRequestAlternativeByteHandlerClientData, specialChar); + } +} + +void SocketDescriptor::registerRTPInterface(unsigned char streamChannelId, + RTPInterface* rtpInterface) { + Boolean isFirstRegistration = fSubChannelHashTable->IsEmpty(); +#if defined(DEBUG_SEND)||defined(DEBUG_RECEIVE) + fprintf(stderr, "SocketDescriptor(socket %d)::registerRTPInterface(channel %d): isFirstRegistration %d\n", fOurSocketNum, streamChannelId, isFirstRegistration); +#endif + fSubChannelHashTable->Add((char const*)(long)streamChannelId, + rtpInterface); + + if (isFirstRegistration) { + // Arrange to handle reads on this TCP socket: + TaskScheduler::BackgroundHandlerProc* handler + = (TaskScheduler::BackgroundHandlerProc*)&tcpReadHandler; + fEnv.taskScheduler(). + setBackgroundHandling(fOurSocketNum, SOCKET_READABLE|SOCKET_EXCEPTION, handler, this); + } +} + +RTPInterface* SocketDescriptor +::lookupRTPInterface(unsigned char streamChannelId) { + char const* lookupArg = (char const*)(long)streamChannelId; + return (RTPInterface*)(fSubChannelHashTable->Lookup(lookupArg)); +} + +void SocketDescriptor +::deregisterRTPInterface(unsigned char streamChannelId) { +#if defined(DEBUG_SEND)||defined(DEBUG_RECEIVE) + fprintf(stderr, "SocketDescriptor(socket %d)::deregisterRTPInterface(channel %d)\n", fOurSocketNum, streamChannelId); +#endif + fSubChannelHashTable->Remove((char const*)(long)streamChannelId); + + if (fSubChannelHashTable->IsEmpty()) { + // No more interfaces are using us, so it's curtains for us now: + if (fAreInReadHandlerLoop) { + fDeleteMyselfNext = True; // we can't delete ourself yet, but we'll do so from "tcpReadHandler()" below + } else { + delete this; + } + } +} + +void SocketDescriptor::tcpReadHandler(SocketDescriptor* socketDescriptor, int mask) { + // Call the read handler until it returns false, with a limit to avoid starving other sockets + unsigned count = 2000; + socketDescriptor->fAreInReadHandlerLoop = True; + while (!socketDescriptor->fDeleteMyselfNext && socketDescriptor->tcpReadHandler1(mask) && --count > 0) {} + socketDescriptor->fAreInReadHandlerLoop = False; + if (socketDescriptor->fDeleteMyselfNext) delete socketDescriptor; +} + +Boolean SocketDescriptor::tcpReadHandler1(int mask) { + // We expect the following data over the TCP channel: + // optional RTSP command or response bytes (before the first '$' character) + // a '$' character + // a 1-byte channel id + // a 2-byte packet size (in network byte order) + // the packet data. + // However, because the socket is being read asynchronously, this data might arrive in pieces. + + u_int8_t c; + struct sockaddr_storage dummy; // not used + if (fTCPReadingState != AWAITING_PACKET_DATA) { + int result = (fTLSState != NULL && fTLSState->isNeeded) + ? fTLSState->read(&c, 1) + : readSocket(fEnv, fOurSocketNum, &c, 1, dummy); + if (result == 0) { // There was no more data to read + return False; + } else if (result != 1) { // error reading TCP socket, so we will no longer handle it +#ifdef DEBUG_RECEIVE + fprintf(stderr, "SocketDescriptor(socket %d)::tcpReadHandler(): readSocket(1 byte) returned %d (error)\n", fOurSocketNum, result); +#endif + fReadErrorOccurred = True; + fDeleteMyselfNext = True; + return False; + } + } + + Boolean callAgain = True; + switch (fTCPReadingState) { + case AWAITING_DOLLAR: { + if (c == '$') { +#ifdef DEBUG_RECEIVE + fprintf(stderr, "SocketDescriptor(socket %d)::tcpReadHandler(): Saw '$'\n", fOurSocketNum); +#endif + fTCPReadingState = AWAITING_STREAM_CHANNEL_ID; + } else { + // This character is part of a RTSP request or command, which is handled separately: + if (fServerRequestAlternativeByteHandler != NULL && c != 0xFF && c != 0xFE) { + // Hack: 0xFF and 0xFE are used as special signaling characters, so don't send them + (*fServerRequestAlternativeByteHandler)(fServerRequestAlternativeByteHandlerClientData, c); + } + } + break; + } + case AWAITING_STREAM_CHANNEL_ID: { + // The byte that we read is the stream channel id. + if (lookupRTPInterface(c) != NULL) { // sanity check + fStreamChannelId = c; + fTCPReadingState = AWAITING_SIZE1; + } else { + // This wasn't a stream channel id that we expected. We're (somehow) in a strange state. Try to recover: +#ifdef DEBUG_RECEIVE + fprintf(stderr, "SocketDescriptor(socket %d)::tcpReadHandler(): Saw nonexistent stream channel id: 0x%02x\n", fOurSocketNum, c); +#endif + fTCPReadingState = AWAITING_DOLLAR; + } + break; + } + case AWAITING_SIZE1: { + // The byte that we read is the first (high) byte of the 16-bit RTP or RTCP packet 'size'. + fSizeByte1 = c; + fTCPReadingState = AWAITING_SIZE2; + break; + } + case AWAITING_SIZE2: { + // The byte that we read is the second (low) byte of the 16-bit RTP or RTCP packet 'size'. + unsigned short size = (fSizeByte1<<8)|c; + + // Record the information about the packet data that will be read next: + RTPInterface* rtpInterface = lookupRTPInterface(fStreamChannelId); + if (rtpInterface != NULL) { + rtpInterface->fNextTCPReadSize = size; + rtpInterface->fNextTCPReadStreamSocketNum = fOurSocketNum; + rtpInterface->fNextTCPReadStreamChannelId = fStreamChannelId; + rtpInterface->fNextTCPReadTLSState = fTLSState; + } + fTCPReadingState = AWAITING_PACKET_DATA; + break; + } + case AWAITING_PACKET_DATA: { + callAgain = False; + fTCPReadingState = AWAITING_DOLLAR; // the next state, unless we end up having to read more data in the current state + // Call the appropriate read handler to get the packet data from the TCP stream: + RTPInterface* rtpInterface = lookupRTPInterface(fStreamChannelId); + if (rtpInterface != NULL) { + if (rtpInterface->fNextTCPReadSize == 0) { + // We've already read all the data for this packet. + break; + } + if (rtpInterface->fReadHandlerProc != NULL) { +#ifdef DEBUG_RECEIVE + fprintf(stderr, "SocketDescriptor(socket %d)::tcpReadHandler(): reading %d bytes on channel %d\n", fOurSocketNum, rtpInterface->fNextTCPReadSize, rtpInterface->fNextTCPReadStreamChannelId); +#endif + fTCPReadingState = AWAITING_PACKET_DATA; + rtpInterface->fReadHandlerProc(rtpInterface->fOwner, mask); + } else { +#ifdef DEBUG_RECEIVE + fprintf(stderr, "SocketDescriptor(socket %d)::tcpReadHandler(): No handler proc for \"rtpInterface\" for channel %d; need to skip %d remaining bytes\n", fOurSocketNum, fStreamChannelId, rtpInterface->fNextTCPReadSize); +#endif + int result = (fTLSState != NULL && fTLSState->isNeeded) + ? fTLSState->read(&c, 1) + : readSocket(fEnv, fOurSocketNum, &c, 1, dummy); + if (result < 0) { // error reading TCP socket, so we will no longer handle it +#ifdef DEBUG_RECEIVE + fprintf(stderr, "SocketDescriptor(socket %d)::tcpReadHandler(): readSocket(1 byte) returned %d (error)\n", fOurSocketNum, result); +#endif + fReadErrorOccurred = True; + fDeleteMyselfNext = True; + return False; + } else { + fTCPReadingState = AWAITING_PACKET_DATA; + if (result == 1) { + --rtpInterface->fNextTCPReadSize; + callAgain = True; + } + } + } + } +#ifdef DEBUG_RECEIVE + else fprintf(stderr, "SocketDescriptor(socket %d)::tcpReadHandler(): No \"rtpInterface\" for channel %d\n", fOurSocketNum, fStreamChannelId); +#endif + } + } + + return callAgain; +} + + +////////// tcpStreamRecord implementation ////////// + +tcpStreamRecord +::tcpStreamRecord(int streamSocketNum, unsigned char streamChannelId, + TLSState* tlsState, + tcpStreamRecord* next) + : fNext(next), + fStreamSocketNum(streamSocketNum), fStreamChannelId(streamChannelId), + fTLSState(tlsState) { +} + +tcpStreamRecord::~tcpStreamRecord() { + delete fNext; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/RTPSink.cpp b/src/big/mpp/middleware/src/live555/liveMedia/RTPSink.cpp new file mode 100644 index 000000000..c82942848 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/RTPSink.cpp @@ -0,0 +1,403 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP Sinks +// Implementation + +#include "RTPSink.hh" +#include "Base64.hh" +#include "GroupsockHelper.hh" + +////////// RTPSink ////////// + +Boolean RTPSink::lookupByName(UsageEnvironment& env, char const* sinkName, + RTPSink*& resultSink) { + resultSink = NULL; // unless we succeed + + MediaSink* sink; + if (!MediaSink::lookupByName(env, sinkName, sink)) return False; + + if (!sink->isRTPSink()) { + env.setResultMsg(sinkName, " is not a RTP sink"); + return False; + } + + resultSink = (RTPSink*)sink; + return True; +} + +Boolean RTPSink::isRTPSink() const { + return True; +} + +RTPSink::RTPSink(UsageEnvironment& env, + Groupsock* rtpGS, unsigned char rtpPayloadType, + unsigned rtpTimestampFrequency, + char const* rtpPayloadFormatName, + unsigned numChannels) + : MediaSink(env), fRTPInterface(this, rtpGS), + fRTPPayloadType(rtpPayloadType), + fPacketCount(0), fOctetCount(0), fTotalOctetCount(0), + fMIKEYState(NULL), fCrypto(NULL), + fTimestampFrequency(rtpTimestampFrequency), fNextTimestampHasBeenPreset(False), fEnableRTCPReports(True), + fNumChannels(numChannels), fEstimatedBitrate(0) { + fRTPPayloadFormatName + = strDup(rtpPayloadFormatName == NULL ? "???" : rtpPayloadFormatName); + gettimeofday(&fCreationTime, NULL); + fTotalOctetCountStartTime = fCreationTime; + resetPresentationTimes(); + + fSeqNo = (u_int16_t)our_random(); + fSSRC = our_random32(); + fTimestampBase = our_random32(); + + fTransmissionStatsDB = new RTPTransmissionStatsDB(*this); +} + +RTPSink::~RTPSink() { + delete fTransmissionStatsDB; + delete[] (char*)fRTPPayloadFormatName; + delete fCrypto; delete fMIKEYState; + fRTPInterface.forgetOurGroupsock(); + // so that the "fRTPInterface" destructor doesn't turn off background read handling (in case + // its 'groupsock' is being shared with something else that does background read handling). +} + +u_int32_t RTPSink::convertToRTPTimestamp(struct timeval tv) { + // Begin by converting from "struct timeval" units to RTP timestamp units: + u_int32_t timestampIncrement = (fTimestampFrequency*tv.tv_sec); + timestampIncrement += (u_int32_t)(fTimestampFrequency*(tv.tv_usec/1000000.0) + 0.5); // note: rounding + + // Then add this to our 'timestamp base': + if (fNextTimestampHasBeenPreset) { + // Make the returned timestamp the same as the current "fTimestampBase", + // so that timestamps begin with the value that was previously preset: + fTimestampBase -= timestampIncrement; + fNextTimestampHasBeenPreset = False; + } + + u_int32_t const rtpTimestamp = fTimestampBase + timestampIncrement; +#ifdef DEBUG_TIMESTAMPS + fprintf(stderr, "fTimestampBase: 0x%08x, tv: %lu.%06ld\n\t=> RTP timestamp: 0x%08x\n", + fTimestampBase, tv.tv_sec, tv.tv_usec, rtpTimestamp); + fflush(stderr); +#endif + + return rtpTimestamp; +} + +u_int32_t RTPSink::presetNextTimestamp() { + struct timeval timeNow; + gettimeofday(&timeNow, NULL); + + u_int32_t tsNow = convertToRTPTimestamp(timeNow); + if (!groupsockBeingUsed().hasMultipleDestinations()) { + // Don't adjust the timestamp stream if we already have another destination ongoing + fTimestampBase = tsNow; + fNextTimestampHasBeenPreset = True; + } + + return tsNow; +} + +void RTPSink::getTotalBitrate(unsigned& outNumBytes, double& outElapsedTime) { + struct timeval timeNow; + gettimeofday(&timeNow, NULL); + + outNumBytes = fTotalOctetCount; + outElapsedTime = (double)(timeNow.tv_sec-fTotalOctetCountStartTime.tv_sec) + + (timeNow.tv_usec-fTotalOctetCountStartTime.tv_usec)/1000000.0; + + fTotalOctetCount = 0; + fTotalOctetCountStartTime = timeNow; +} + +void RTPSink::resetPresentationTimes() { + fInitialPresentationTime.tv_sec = fMostRecentPresentationTime.tv_sec = 0; + fInitialPresentationTime.tv_usec = fMostRecentPresentationTime.tv_usec = 0; +} + +void RTPSink::setupForSRTP(Boolean useEncryption) { + // Set up keying state for streaming via SRTP: + delete fCrypto; delete fMIKEYState; + fMIKEYState = new MIKEYState(useEncryption); + fCrypto = new SRTPCryptographicContext(*fMIKEYState); +} + +u_int8_t* RTPSink::setupForSRTP(Boolean useEncryption, unsigned& resultMIKEYStateMessageSize) { + // Set up keying state for streaming via SRTP: + setupForSRTP(useEncryption); + + u_int8_t* MIKEYStateMessage = fMIKEYState->generateMessage(resultMIKEYStateMessageSize); + return MIKEYStateMessage; +} + +void RTPSink::setupForSRTP(u_int8_t const* MIKEYStateMessage, unsigned MIKEYStateMessageSize) { + // Set up keying state for streaming via SRTP: + delete fCrypto; delete fMIKEYState; + fMIKEYState = MIKEYState::createNew(MIKEYStateMessage, MIKEYStateMessageSize); + fCrypto = new SRTPCryptographicContext(*fMIKEYState); +} + +char const* RTPSink::sdpMediaType() const { + return "data"; + // default SDP media (m=) type, unless redefined by subclasses +} + +char* RTPSink::rtpmapLine() const { + if (rtpPayloadType() >= 96) { // the payload format type is dynamic + char* encodingParamsPart; + if (numChannels() != 1) { + encodingParamsPart = new char[1 + 20 /* max int len */]; + sprintf(encodingParamsPart, "/%d", numChannels()); + } else { + encodingParamsPart = strDup(""); + } + char const* const rtpmapFmt = "a=rtpmap:%d %s/%d%s\r\n"; + unsigned rtpmapLineSize = strlen(rtpmapFmt) + + 3 /* max char len */ + strlen(rtpPayloadFormatName()) + + 20 /* max int len */ + strlen(encodingParamsPart); + char* rtpmapLine = new char[rtpmapLineSize]; + sprintf(rtpmapLine, rtpmapFmt, + rtpPayloadType(), rtpPayloadFormatName(), + rtpTimestampFrequency(), encodingParamsPart); + delete[] encodingParamsPart; + + return rtpmapLine; + } else { + // The payload format is static, so there's no "a=rtpmap:" line: + return strDup(""); + } +} + +char* RTPSink::keyMgmtLine() { + u_int8_t* mikeyMessage; + unsigned mikeyMessageSize; + if (fMIKEYState != NULL && + (mikeyMessage = fMIKEYState->generateMessage(mikeyMessageSize)) != NULL) { + char const* const keyMgmtFmt = "a=key-mgmt:mikey %s\r\n"; + char* base64EncodedData = base64Encode((char*)mikeyMessage, mikeyMessageSize); + delete[] mikeyMessage; + + unsigned keyMgmtLineSize = strlen(keyMgmtFmt) + strlen(base64EncodedData); + char* keyMgmtLine = new char[keyMgmtLineSize]; + sprintf(keyMgmtLine, keyMgmtFmt, base64EncodedData); + delete[] base64EncodedData; + + return keyMgmtLine; + } else { // no "a=key-mgmt:" line + return strDup(""); + } +} + +char const* RTPSink::auxSDPLine() { + return NULL; // by default +} + + +////////// RTPTransmissionStatsDB ////////// + +RTPTransmissionStatsDB::RTPTransmissionStatsDB(RTPSink& rtpSink) + : fOurRTPSink(rtpSink), + fTable(HashTable::create(ONE_WORD_HASH_KEYS)) { + fNumReceivers=0; +} + +RTPTransmissionStatsDB::~RTPTransmissionStatsDB() { + // First, remove and delete all stats records from the table: + RTPTransmissionStats* stats; + while ((stats = (RTPTransmissionStats*)fTable->RemoveNext()) != NULL) { + delete stats; + } + + // Then, delete the table itself: + delete fTable; +} + +void RTPTransmissionStatsDB +::noteIncomingRR(u_int32_t SSRC, struct sockaddr_storage const& lastFromAddress, + unsigned lossStats, unsigned lastPacketNumReceived, + unsigned jitter, unsigned lastSRTime, unsigned diffSR_RRTime) { + RTPTransmissionStats* stats = lookup(SSRC); + if (stats == NULL) { + // This is the first time we've heard of this SSRC. + // Create a new record for it: + stats = new RTPTransmissionStats(fOurRTPSink, SSRC); + if (stats == NULL) return; + add(SSRC, stats); +#ifdef DEBUG_RR + fprintf(stderr, "Adding new entry for SSRC %x in RTPTransmissionStatsDB\n", SSRC); +#endif + } + + stats->noteIncomingRR(lastFromAddress, + lossStats, lastPacketNumReceived, jitter, + lastSRTime, diffSR_RRTime); +} + +void RTPTransmissionStatsDB::removeRecord(u_int32_t SSRC) { + RTPTransmissionStats* stats = lookup(SSRC); + if (stats != NULL) { + long SSRC_long = (long)SSRC; + fTable->Remove((char const*)SSRC_long); + --fNumReceivers; + delete stats; + } +} + +RTPTransmissionStatsDB::Iterator +::Iterator(RTPTransmissionStatsDB& receptionStatsDB) + : fIter(HashTable::Iterator::create(*(receptionStatsDB.fTable))) { +} + +RTPTransmissionStatsDB::Iterator::~Iterator() { + delete fIter; +} + +RTPTransmissionStats* +RTPTransmissionStatsDB::Iterator::next() { + char const* key; // dummy + + return (RTPTransmissionStats*)(fIter->next(key)); +} + +RTPTransmissionStats* RTPTransmissionStatsDB::lookup(u_int32_t SSRC) const { + long SSRC_long = (long)SSRC; + return (RTPTransmissionStats*)(fTable->Lookup((char const*)SSRC_long)); +} + +void RTPTransmissionStatsDB::add(u_int32_t SSRC, RTPTransmissionStats* stats) { + long SSRC_long = (long)SSRC; + fTable->Add((char const*)SSRC_long, stats); + ++fNumReceivers; +} + + +////////// RTPTransmissionStats ////////// + +RTPTransmissionStats::RTPTransmissionStats(RTPSink& rtpSink, u_int32_t SSRC) + : fOurRTPSink(rtpSink), fSSRC(SSRC), fLastPacketNumReceived(0), + fPacketLossRatio(0), fTotNumPacketsLost(0), fJitter(0), + fLastSRTime(0), fDiffSR_RRTime(0), fAtLeastTwoRRsHaveBeenReceived(False), fFirstPacket(True), + fTotalOctetCount_hi(0), fTotalOctetCount_lo(0), + fTotalPacketCount_hi(0), fTotalPacketCount_lo(0) { + gettimeofday(&fTimeCreated, NULL); + + fLastOctetCount = rtpSink.octetCount(); + fLastPacketCount = rtpSink.packetCount(); +} + +RTPTransmissionStats::~RTPTransmissionStats() {} + +void RTPTransmissionStats +::noteIncomingRR(struct sockaddr_storage const& lastFromAddress, + unsigned lossStats, unsigned lastPacketNumReceived, + unsigned jitter, unsigned lastSRTime, + unsigned diffSR_RRTime) { + if (fFirstPacket) { + fFirstPacket = False; + fFirstPacketNumReported = lastPacketNumReceived; + } else { + fAtLeastTwoRRsHaveBeenReceived = True; + fOldLastPacketNumReceived = fLastPacketNumReceived; + fOldTotNumPacketsLost = fTotNumPacketsLost; + } + gettimeofday(&fTimeReceived, NULL); + + fLastFromAddress = lastFromAddress; + fPacketLossRatio = lossStats>>24; + fTotNumPacketsLost = lossStats&0xFFFFFF; + fLastPacketNumReceived = lastPacketNumReceived; + fJitter = jitter; + fLastSRTime = lastSRTime; + fDiffSR_RRTime = diffSR_RRTime; +#ifdef DEBUG_RR + fprintf(stderr, "RTCP RR data (received at %lu.%06ld): lossStats 0x%08x, lastPacketNumReceived 0x%08x, jitter 0x%08x, lastSRTime 0x%08x, diffSR_RRTime 0x%08x\n", + fTimeReceived.tv_sec, fTimeReceived.tv_usec, lossStats, lastPacketNumReceived, jitter, lastSRTime, diffSR_RRTime); + unsigned rtd = roundTripDelay(); + fprintf(stderr, "=> round-trip delay: 0x%04x (== %f seconds)\n", rtd, rtd/65536.0); +#endif + + // Update our counts of the total number of octets and packets sent towards + // this receiver: + u_int32_t newOctetCount = fOurRTPSink.octetCount(); + u_int32_t octetCountDiff = newOctetCount - fLastOctetCount; + fLastOctetCount = newOctetCount; + u_int32_t prevTotalOctetCount_lo = fTotalOctetCount_lo; + fTotalOctetCount_lo += octetCountDiff; + if (fTotalOctetCount_lo < prevTotalOctetCount_lo) { // wrap around + ++fTotalOctetCount_hi; + } + + u_int32_t newPacketCount = fOurRTPSink.packetCount(); + u_int32_t packetCountDiff = newPacketCount - fLastPacketCount; + fLastPacketCount = newPacketCount; + u_int32_t prevTotalPacketCount_lo = fTotalPacketCount_lo; + fTotalPacketCount_lo += packetCountDiff; + if (fTotalPacketCount_lo < prevTotalPacketCount_lo) { // wrap around + ++fTotalPacketCount_hi; + } +} + +unsigned RTPTransmissionStats::roundTripDelay() const { + // Compute the round-trip delay that was indicated by the most recently-received + // RTCP RR packet. Use the method noted in the RTP/RTCP specification (RFC 3350). + + if (fLastSRTime == 0) { + // Either no RTCP RR packet has been received yet, or else the + // reporting receiver has not yet received any RTCP SR packets from us: + return 0; + } + + // First, convert the time that we received the last RTCP RR packet to NTP format, + // in units of 1/65536 (2^-16) seconds: + unsigned lastReceivedTimeNTP_high + = fTimeReceived.tv_sec + 0x83AA7E80; // 1970 epoch -> 1900 epoch + double fractionalPart = (fTimeReceived.tv_usec*0x0400)/15625.0; // 2^16/10^6 + unsigned lastReceivedTimeNTP + = (unsigned)((lastReceivedTimeNTP_high<<16) + fractionalPart + 0.5); + + int rawResult = lastReceivedTimeNTP - fLastSRTime - fDiffSR_RRTime; + if (rawResult < 0) { + // This can happen if there's clock drift between the sender and receiver, + // and if the round-trip time was very small. + rawResult = 0; + } + return (unsigned)rawResult; +} + +void RTPTransmissionStats::getTotalOctetCount(u_int32_t& hi, u_int32_t& lo) { + hi = fTotalOctetCount_hi; + lo = fTotalOctetCount_lo; +} + +void RTPTransmissionStats::getTotalPacketCount(u_int32_t& hi, u_int32_t& lo) { + hi = fTotalPacketCount_hi; + lo = fTotalPacketCount_lo; +} + +unsigned RTPTransmissionStats::packetsReceivedSinceLastRR() const { + if (!fAtLeastTwoRRsHaveBeenReceived) return 0; + + return fLastPacketNumReceived-fOldLastPacketNumReceived; +} + +int RTPTransmissionStats::packetsLostBetweenRR() const { + if (!fAtLeastTwoRRsHaveBeenReceived) return 0; + + return fTotNumPacketsLost - fOldTotNumPacketsLost; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/RTPSource.cpp b/src/big/mpp/middleware/src/live555/liveMedia/RTPSource.cpp new file mode 100644 index 000000000..2afbfe2a9 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/RTPSource.cpp @@ -0,0 +1,409 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP Sources +// Implementation + +#include "RTPSource.hh" +#include "GroupsockHelper.hh" + +////////// RTPSource ////////// + +Boolean RTPSource::lookupByName(UsageEnvironment& env, + char const* sourceName, + RTPSource*& resultSource) { + resultSource = NULL; // unless we succeed + + MediaSource* source; + if (!MediaSource::lookupByName(env, sourceName, source)) return False; + + if (!source->isRTPSource()) { + env.setResultMsg(sourceName, " is not a RTP source"); + return False; + } + + resultSource = (RTPSource*)source; + return True; +} + +Boolean RTPSource::hasBeenSynchronizedUsingRTCP() { + return fCurPacketHasBeenSynchronizedUsingRTCP; +} + +Boolean RTPSource::isRTPSource() const { + return True; +} + +RTPSource::RTPSource(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + u_int32_t rtpTimestampFrequency) + : FramedSource(env), + fRTPInterface(this, RTPgs), + fCurPacketHasBeenSynchronizedUsingRTCP(False), fLastReceivedSSRC(0), + fRTCPInstanceForMultiplexedRTCPPackets(NULL), fCrypto(NULL), + fRTPPayloadFormat(rtpPayloadFormat), fTimestampFrequency(rtpTimestampFrequency), + fSSRC(our_random32()), fEnableRTCPReports(True) { + fReceptionStatsDB = new RTPReceptionStatsDB(); +} + +RTPSource::~RTPSource() { + delete fReceptionStatsDB; +} + +void RTPSource::getAttributes() const { + envir().setResultMsg(""); // Fix later to get attributes from header ##### +} + + +////////// RTPReceptionStatsDB ////////// + +RTPReceptionStatsDB::RTPReceptionStatsDB() + : fTable(HashTable::create(ONE_WORD_HASH_KEYS)), fTotNumPacketsReceived(0) { + reset(); +} + +void RTPReceptionStatsDB::reset() { + fNumActiveSourcesSinceLastReset = 0; + + Iterator iter(*this); + RTPReceptionStats* stats; + while ((stats = iter.next()) != NULL) { + stats->reset(); + } +} + +RTPReceptionStatsDB::~RTPReceptionStatsDB() { + // First, remove and delete all stats records from the table: + RTPReceptionStats* stats; + while ((stats = (RTPReceptionStats*)fTable->RemoveNext()) != NULL) { + delete stats; + } + + // Then, delete the table itself: + delete fTable; +} + +void RTPReceptionStatsDB +::noteIncomingPacket(u_int32_t SSRC, u_int16_t seqNum, + u_int32_t rtpTimestamp, unsigned timestampFrequency, + Boolean useForJitterCalculation, + struct timeval& resultPresentationTime, + Boolean& resultHasBeenSyncedUsingRTCP, + unsigned packetSize) { + ++fTotNumPacketsReceived; + RTPReceptionStats* stats = lookup(SSRC); + if (stats == NULL) { + // This is the first time we've heard from this SSRC. + // Create a new record for it: + stats = new RTPReceptionStats(SSRC, seqNum); + if (stats == NULL) return; + add(SSRC, stats); + } + + if (stats->numPacketsReceivedSinceLastReset() == 0) { + ++fNumActiveSourcesSinceLastReset; + } + + stats->noteIncomingPacket(seqNum, rtpTimestamp, timestampFrequency, + useForJitterCalculation, + resultPresentationTime, + resultHasBeenSyncedUsingRTCP, packetSize); +} + +void RTPReceptionStatsDB +::noteIncomingSR(u_int32_t SSRC, + u_int32_t ntpTimestampMSW, u_int32_t ntpTimestampLSW, + u_int32_t rtpTimestamp) { + RTPReceptionStats* stats = lookup(SSRC); + if (stats == NULL) { + // This is the first time we've heard of this SSRC. + // Create a new record for it: + stats = new RTPReceptionStats(SSRC); + if (stats == NULL) return; + add(SSRC, stats); + } + + stats->noteIncomingSR(ntpTimestampMSW, ntpTimestampLSW, rtpTimestamp); +} + +void RTPReceptionStatsDB::removeRecord(u_int32_t SSRC) { + RTPReceptionStats* stats = lookup(SSRC); + if (stats != NULL) { + long SSRC_long = (long)SSRC; + fTable->Remove((char const*)SSRC_long); + delete stats; + } +} + +RTPReceptionStatsDB::Iterator +::Iterator(RTPReceptionStatsDB& receptionStatsDB) + : fIter(HashTable::Iterator::create(*(receptionStatsDB.fTable))) { +} + +RTPReceptionStatsDB::Iterator::~Iterator() { + delete fIter; +} + +RTPReceptionStats* +RTPReceptionStatsDB::Iterator::next(Boolean includeInactiveSources) { + char const* key; // dummy + + // If asked, skip over any sources that haven't been active + // since the last reset: + RTPReceptionStats* stats; + do { + stats = (RTPReceptionStats*)(fIter->next(key)); + } while (stats != NULL && !includeInactiveSources + && stats->numPacketsReceivedSinceLastReset() == 0); + + return stats; +} + +RTPReceptionStats* RTPReceptionStatsDB::lookup(u_int32_t SSRC) const { + long SSRC_long = (long)SSRC; + return (RTPReceptionStats*)(fTable->Lookup((char const*)SSRC_long)); +} + +void RTPReceptionStatsDB::add(u_int32_t SSRC, RTPReceptionStats* stats) { + long SSRC_long = (long)SSRC; + fTable->Add((char const*)SSRC_long, stats); +} + +////////// RTPReceptionStats ////////// + +RTPReceptionStats::RTPReceptionStats(u_int32_t SSRC, u_int16_t initialSeqNum) { + initSeqNum(initialSeqNum); + init(SSRC); +} + +RTPReceptionStats::RTPReceptionStats(u_int32_t SSRC) { + init(SSRC); +} + +RTPReceptionStats::~RTPReceptionStats() { +} + +void RTPReceptionStats::init(u_int32_t SSRC) { + fSSRC = SSRC; + fTotNumPacketsReceived = 0; + fTotBytesReceived_hi = fTotBytesReceived_lo = 0; + fBaseExtSeqNumReceived = 0; + fHighestExtSeqNumReceived = 0; + fHaveSeenInitialSequenceNumber = False; + fLastTransit = ~0; + fPreviousPacketRTPTimestamp = 0; + fJitter = 0.0; + fLastReceivedSR_NTPmsw = fLastReceivedSR_NTPlsw = 0; + fLastReceivedSR_time.tv_sec = fLastReceivedSR_time.tv_usec = 0; + fLastPacketReceptionTime.tv_sec = fLastPacketReceptionTime.tv_usec = 0; + fMinInterPacketGapUS = 0x7FFFFFFF; + fMaxInterPacketGapUS = 0; + fTotalInterPacketGaps.tv_sec = fTotalInterPacketGaps.tv_usec = 0; + fHasBeenSynchronized = False; + fSyncTime.tv_sec = fSyncTime.tv_usec = 0; + reset(); +} + +void RTPReceptionStats::initSeqNum(u_int16_t initialSeqNum) { + fBaseExtSeqNumReceived = 0x10000 | initialSeqNum; + fHighestExtSeqNumReceived = 0x10000 | initialSeqNum; + fHaveSeenInitialSequenceNumber = True; +} + +#ifndef MILLION +#define MILLION 1000000 +#endif + +void RTPReceptionStats +::noteIncomingPacket(u_int16_t seqNum, u_int32_t rtpTimestamp, + unsigned timestampFrequency, + Boolean useForJitterCalculation, + struct timeval& resultPresentationTime, + Boolean& resultHasBeenSyncedUsingRTCP, + unsigned packetSize) { + if (!fHaveSeenInitialSequenceNumber) initSeqNum(seqNum); + + ++fNumPacketsReceivedSinceLastReset; + ++fTotNumPacketsReceived; + u_int32_t prevTotBytesReceived_lo = fTotBytesReceived_lo; + fTotBytesReceived_lo += packetSize; + if (fTotBytesReceived_lo < prevTotBytesReceived_lo) { // wrap-around + ++fTotBytesReceived_hi; + } + + // Check whether the new sequence number is the highest yet seen: + unsigned oldSeqNum = (fHighestExtSeqNumReceived&0xFFFF); + unsigned seqNumCycle = (fHighestExtSeqNumReceived&0xFFFF0000); + unsigned seqNumDifference = (unsigned)((int)seqNum-(int)oldSeqNum); + unsigned newSeqNum = 0; + if (seqNumLT((u_int16_t)oldSeqNum, seqNum)) { + // This packet was not an old packet received out of order, so check it: + + if (seqNumDifference >= 0x8000) { + // The sequence number wrapped around, so start a new cycle: + seqNumCycle += 0x10000; + } + + newSeqNum = seqNumCycle|seqNum; + if (newSeqNum > fHighestExtSeqNumReceived) { + fHighestExtSeqNumReceived = newSeqNum; + } + } else if (fTotNumPacketsReceived > 1) { + // This packet was an old packet received out of order + + if ((int)seqNumDifference >= 0x8000) { + // The sequence number wrapped around, so switch to an old cycle: + seqNumCycle -= 0x10000; + } + + newSeqNum = seqNumCycle|seqNum; + if (newSeqNum < fBaseExtSeqNumReceived) { + fBaseExtSeqNumReceived = newSeqNum; + } + } + + // Record the inter-packet delay + struct timeval timeNow; + gettimeofday(&timeNow, NULL); + if (fLastPacketReceptionTime.tv_sec != 0 + || fLastPacketReceptionTime.tv_usec != 0) { + unsigned gap + = (timeNow.tv_sec - fLastPacketReceptionTime.tv_sec)*MILLION + + timeNow.tv_usec - fLastPacketReceptionTime.tv_usec; + if (gap > fMaxInterPacketGapUS) { + fMaxInterPacketGapUS = gap; + } + if (gap < fMinInterPacketGapUS) { + fMinInterPacketGapUS = gap; + } + fTotalInterPacketGaps.tv_usec += gap; + if (fTotalInterPacketGaps.tv_usec >= MILLION) { + ++fTotalInterPacketGaps.tv_sec; + fTotalInterPacketGaps.tv_usec -= MILLION; + } + } + fLastPacketReceptionTime = timeNow; + + // Compute the current 'jitter' using the received packet's RTP timestamp, + // and the RTP timestamp that would correspond to the current time. + // (Use the code from appendix A.8 in the RTP spec.) + // Note, however, that we don't use this packet if its timestamp is + // the same as that of the previous packet (this indicates a multi-packet + // fragment), or if we've been explicitly told not to use this packet. + if (useForJitterCalculation + && rtpTimestamp != fPreviousPacketRTPTimestamp) { + unsigned arrival = (timestampFrequency*timeNow.tv_sec); + arrival += (unsigned) + ((2.0*timestampFrequency*timeNow.tv_usec + 1000000.0)/2000000); + // note: rounding + int transit = arrival - rtpTimestamp; + if (fLastTransit == (~0)) fLastTransit = transit; // hack for first time + int d = transit - fLastTransit; + fLastTransit = transit; + if (d < 0) d = -d; + fJitter += (1.0/16.0) * ((double)d - fJitter); + } + + // Return the 'presentation time' that corresponds to "rtpTimestamp": + if (fSyncTime.tv_sec == 0 && fSyncTime.tv_usec == 0) { + // This is the first timestamp that we've seen, so use the current + // 'wall clock' time as the synchronization time. (This will be + // corrected later when we receive RTCP SRs.) + fSyncTimestamp = rtpTimestamp; + fSyncTime = timeNow; + } + + int timestampDiff = rtpTimestamp - fSyncTimestamp; + // Note: This works even if the timestamp wraps around + // (as long as "int" is 32 bits) + + // Divide this by the timestamp frequency to get real time: + double timeDiff = timestampDiff/(double)timestampFrequency; + + // Add this to the 'sync time' to get our result: + unsigned const million = 1000000; + unsigned seconds, uSeconds; + if (timeDiff >= 0.0) { + seconds = fSyncTime.tv_sec + (unsigned)(timeDiff); + uSeconds = fSyncTime.tv_usec + + (unsigned)((timeDiff - (unsigned)timeDiff)*million); + if (uSeconds >= million) { + uSeconds -= million; + ++seconds; + } + } else { + timeDiff = -timeDiff; + seconds = fSyncTime.tv_sec - (unsigned)(timeDiff); + uSeconds = fSyncTime.tv_usec + - (unsigned)((timeDiff - (unsigned)timeDiff)*million); + if ((int)uSeconds < 0) { + uSeconds += million; + --seconds; + } + } + resultPresentationTime.tv_sec = seconds; + resultPresentationTime.tv_usec = uSeconds; + resultHasBeenSyncedUsingRTCP = fHasBeenSynchronized; + + // Save these as the new synchronization timestamp & time: + fSyncTimestamp = rtpTimestamp; + fSyncTime = resultPresentationTime; + + fPreviousPacketRTPTimestamp = rtpTimestamp; +} + +void RTPReceptionStats::noteIncomingSR(u_int32_t ntpTimestampMSW, + u_int32_t ntpTimestampLSW, + u_int32_t rtpTimestamp) { + fLastReceivedSR_NTPmsw = ntpTimestampMSW; + fLastReceivedSR_NTPlsw = ntpTimestampLSW; + + gettimeofday(&fLastReceivedSR_time, NULL); + + // Use this SR to update time synchronization information: + fSyncTimestamp = rtpTimestamp; + fSyncTime.tv_sec = ntpTimestampMSW - 0x83AA7E80; // 1/1/1900 -> 1/1/1970 + double microseconds = (ntpTimestampLSW*15625.0)/0x04000000; // 10^6/2^32 + fSyncTime.tv_usec = (unsigned)(microseconds+0.5); + fHasBeenSynchronized = True; +} + +double RTPReceptionStats::totNumKBytesReceived() const { + double const hiMultiplier = 0x20000000/125.0; // == (2^32)/(10^3) + return fTotBytesReceived_hi*hiMultiplier + fTotBytesReceived_lo/1000.0; +} + +unsigned RTPReceptionStats::jitter() const { + return (unsigned)fJitter; +} + +void RTPReceptionStats::reset() { + fNumPacketsReceivedSinceLastReset = 0; + fLastResetExtSeqNumReceived = fHighestExtSeqNumReceived; +} + +Boolean seqNumLT(u_int16_t s1, u_int16_t s2) { + // a 'less-than' on 16-bit sequence numbers + int diff = s2-s1; + if (diff > 0) { + return (diff < 0x8000); + } else if (diff < 0) { + return (diff < -0x8000); + } else { // diff == 0 + return False; + } +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/RTSPClient.cpp b/src/big/mpp/middleware/src/live555/liveMedia/RTSPClient.cpp new file mode 100644 index 000000000..f1f8df4c2 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/RTSPClient.cpp @@ -0,0 +1,2198 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A generic RTSP client +// Implementation + +#include "RTSPClient.hh" +#include "RTSPCommon.hh" +#include "Base64.hh" +#include "Locale.hh" +#include +#include "ourMD5.hh" + +RTSPClient* RTSPClient::createNew(UsageEnvironment& env, char const* rtspURL, + int verbosityLevel, + char const* applicationName, + portNumBits tunnelOverHTTPPortNum, + int socketNumToServer) { + return new RTSPClient(env, rtspURL, + verbosityLevel, applicationName, tunnelOverHTTPPortNum, socketNumToServer); +} + +unsigned RTSPClient::sendDescribeCommand(responseHandler* responseHandler, Authenticator* authenticator) { + if (fCurrentAuthenticator < authenticator) fCurrentAuthenticator = *authenticator; + return sendRequest(new RequestRecord(++fCSeq, "DESCRIBE", responseHandler)); +} + +unsigned RTSPClient::sendOptionsCommand(responseHandler* responseHandler, Authenticator* authenticator) { + if (fCurrentAuthenticator < authenticator) fCurrentAuthenticator = *authenticator; + return sendRequest(new RequestRecord(++fCSeq, "OPTIONS", responseHandler)); +} + +unsigned RTSPClient::sendAnnounceCommand(char const* sdpDescription, responseHandler* responseHandler, Authenticator* authenticator) { + if (fCurrentAuthenticator < authenticator) fCurrentAuthenticator = *authenticator; + return sendRequest(new RequestRecord(++fCSeq, "ANNOUNCE", responseHandler, NULL, NULL, False, 0.0, 0.0, 0.0, sdpDescription)); +} + +unsigned RTSPClient::sendSetupCommand(MediaSubsession& subsession, responseHandler* responseHandler, + Boolean streamOutgoing, Boolean streamUsingTCP, Boolean forceMulticastOnUnspecified, + Authenticator* authenticator) { + if (fTunnelOverHTTPPortNum != 0) streamUsingTCP = True; // RTSP-over-HTTP tunneling uses TCP (by definition) + if (fCurrentAuthenticator < authenticator) fCurrentAuthenticator = *authenticator; + + u_int32_t booleanFlags = 0; + if (streamUsingTCP) booleanFlags |= 0x1; + if (streamOutgoing) booleanFlags |= 0x2; + if (forceMulticastOnUnspecified) booleanFlags |= 0x4; + return sendRequest(new RequestRecord(++fCSeq, "SETUP", responseHandler, NULL, &subsession, booleanFlags)); +} + +unsigned RTSPClient::sendPlayCommand(MediaSession& session, responseHandler* responseHandler, + double start, double end, float scale, + Authenticator* authenticator) { + if (fCurrentAuthenticator < authenticator) fCurrentAuthenticator = *authenticator; + sendDummyUDPPackets(session); // hack to improve NAT traversal + return sendRequest(new RequestRecord(++fCSeq, "PLAY", responseHandler, &session, NULL, 0, start, end, scale)); +} + +unsigned RTSPClient::sendPlayCommand(MediaSubsession& subsession, responseHandler* responseHandler, + double start, double end, float scale, + Authenticator* authenticator) { + if (fCurrentAuthenticator < authenticator) fCurrentAuthenticator = *authenticator; + sendDummyUDPPackets(subsession); // hack to improve NAT traversal + return sendRequest(new RequestRecord(++fCSeq, "PLAY", responseHandler, NULL, &subsession, 0, start, end, scale)); +} + +unsigned RTSPClient::sendPlayCommand(MediaSession& session, responseHandler* responseHandler, + char const* absStartTime, char const* absEndTime, float scale, + Authenticator* authenticator) { + if (fCurrentAuthenticator < authenticator) fCurrentAuthenticator = *authenticator; + sendDummyUDPPackets(session); // hack to improve NAT traversal + return sendRequest(new RequestRecord(++fCSeq, responseHandler, absStartTime, absEndTime, scale, &session, NULL)); +} + +unsigned RTSPClient::sendPlayCommand(MediaSubsession& subsession, responseHandler* responseHandler, + char const* absStartTime, char const* absEndTime, float scale, + Authenticator* authenticator) { + if (fCurrentAuthenticator < authenticator) fCurrentAuthenticator = *authenticator; + sendDummyUDPPackets(subsession); // hack to improve NAT traversal + return sendRequest(new RequestRecord(++fCSeq, responseHandler, absStartTime, absEndTime, scale, NULL, &subsession)); +} + +unsigned RTSPClient::sendPauseCommand(MediaSession& session, responseHandler* responseHandler, Authenticator* authenticator) { + if (fCurrentAuthenticator < authenticator) fCurrentAuthenticator = *authenticator; + return sendRequest(new RequestRecord(++fCSeq, "PAUSE", responseHandler, &session)); +} + +unsigned RTSPClient::sendPauseCommand(MediaSubsession& subsession, responseHandler* responseHandler, Authenticator* authenticator) { + if (fCurrentAuthenticator < authenticator) fCurrentAuthenticator = *authenticator; + return sendRequest(new RequestRecord(++fCSeq, "PAUSE", responseHandler, NULL, &subsession)); +} + +unsigned RTSPClient::sendRecordCommand(MediaSession& session, responseHandler* responseHandler, Authenticator* authenticator) { + if (fCurrentAuthenticator < authenticator) fCurrentAuthenticator = *authenticator; + return sendRequest(new RequestRecord(++fCSeq, "RECORD", responseHandler, &session)); +} + +unsigned RTSPClient::sendRecordCommand(MediaSubsession& subsession, responseHandler* responseHandler, Authenticator* authenticator) { + if (fCurrentAuthenticator < authenticator) fCurrentAuthenticator = *authenticator; + return sendRequest(new RequestRecord(++fCSeq, "RECORD", responseHandler, NULL, &subsession)); +} + +unsigned RTSPClient::sendTeardownCommand(MediaSession& session, responseHandler* responseHandler, Authenticator* authenticator) { + if (fCurrentAuthenticator < authenticator) fCurrentAuthenticator = *authenticator; + return sendRequest(new RequestRecord(++fCSeq, "TEARDOWN", responseHandler, &session)); +} + +unsigned RTSPClient::sendTeardownCommand(MediaSubsession& subsession, responseHandler* responseHandler, Authenticator* authenticator) { + if (fCurrentAuthenticator < authenticator) fCurrentAuthenticator = *authenticator; + return sendRequest(new RequestRecord(++fCSeq, "TEARDOWN", responseHandler, NULL, &subsession)); +} + +unsigned RTSPClient::sendSetParameterCommand(MediaSession& session, responseHandler* responseHandler, + char const* parameterName, char const* parameterValue, + Authenticator* authenticator) { + if (fCurrentAuthenticator < authenticator) fCurrentAuthenticator = *authenticator; + char* paramString = new char[strlen(parameterName) + strlen(parameterValue) + 10]; + sprintf(paramString, "%s: %s\r\n", parameterName, parameterValue); + unsigned result = sendRequest(new RequestRecord(++fCSeq, "SET_PARAMETER", responseHandler, &session, NULL, False, 0.0, 0.0, 0.0, paramString)); + delete[] paramString; + return result; +} + +unsigned RTSPClient::sendGetParameterCommand(MediaSession& session, responseHandler* responseHandler, char const* parameterName, + Authenticator* authenticator) { + if (fCurrentAuthenticator < authenticator) fCurrentAuthenticator = *authenticator; + + // We assume that: + // parameterName is NULL or "" means: Send no body in the request. + // parameterName is non-empty means: Send "\r\n" as the request body. + unsigned parameterNameLen = parameterName == NULL ? 0 : strlen(parameterName); + char* paramString = new char[parameterNameLen + 3]; // the 3 is for \r\n + the '\0' byte + if (parameterName == NULL || parameterName[0] == '\0') { + paramString[0] = '\0'; + } else { + sprintf(paramString, "%s\r\n", parameterName); + } + unsigned result = sendRequest(new RequestRecord(++fCSeq, "GET_PARAMETER", responseHandler, &session, NULL, False, 0.0, 0.0, 0.0, paramString)); + delete[] paramString; + return result; +} + +static char* createRequireString(char const* requireValue) { + char buf[100]; + if (requireValue == NULL) { + // This is the default value; we don't need a "Require:" header: + buf[0] = '\0'; + } else { + snprintf(buf, sizeof buf, "Require: %s\r\n", requireValue); + } + + return strDup(buf); +} + +void RTSPClient::setRequireValue(char const* requireValue) { + delete[] fRequireStr; + fRequireStr = createRequireString(requireValue); +} + +void RTSPClient::sendDummyUDPPackets(MediaSession& session, unsigned numDummyPackets) { + MediaSubsessionIterator iter(session); + MediaSubsession* subsession; + + while ((subsession = iter.next()) != NULL) { + sendDummyUDPPackets(*subsession, numDummyPackets); + } +} + +void RTSPClient::sendDummyUDPPackets(MediaSubsession& subsession, unsigned numDummyPackets) { + // Hack: To increase the likelihood of UDP packets from the server reaching us, + // if we're behind a NAT, send a few 'dummy' UDP packets to the server now. + // (We do this on both our RTP port and our RTCP port.) + Groupsock* gs1 = NULL; Groupsock* gs2 = NULL; + if (subsession.rtpSource() != NULL) gs1 = subsession.rtpSource()->RTPgs(); + if (subsession.rtcpInstance() != NULL) gs2 = subsession.rtcpInstance()->RTCPgs(); + u_int32_t const dummy = 0xFEEDFACE; + for (unsigned i = 0; i < numDummyPackets; ++i) { + if (gs1 != NULL) gs1->output(envir(), (unsigned char*)&dummy, sizeof dummy); + if (gs2 != NULL) gs2->output(envir(), (unsigned char*)&dummy, sizeof dummy); + } +} + +void RTSPClient::setSpeed(MediaSession& session, float speed) { + // Optionally set download speed for session to be used later on PLAY command: + // The user should call this function after the MediaSession is instantiated, but before the + // first "sendPlayCommand()" is called. + session.speed() = speed; + MediaSubsessionIterator iter(session); + MediaSubsession* subsession; + + while ((subsession = iter.next()) != NULL) { + subsession->speed() = speed; + } +} + +Boolean RTSPClient::changeResponseHandler(unsigned cseq, responseHandler* newResponseHandler) { + // Look for the matching request record in each of our 'pending requests' queues: + RequestRecord* request; + if ((request = fRequestsAwaitingConnection.findByCSeq(cseq)) != NULL + || (request = fRequestsAwaitingHTTPTunneling.findByCSeq(cseq)) != NULL + || (request = fRequestsAwaitingResponse.findByCSeq(cseq)) != NULL) { + request->handler() = newResponseHandler; + return True; + } + + return False; +} + +Boolean RTSPClient::lookupByName(UsageEnvironment& env, + char const* instanceName, + RTSPClient*& resultClient) { + resultClient = NULL; // unless we succeed + + Medium* medium; + if (!Medium::lookupByName(env, instanceName, medium)) return False; + + if (!medium->isRTSPClient()) { + env.setResultMsg(instanceName, " is not a RTSP client"); + return False; + } + + resultClient = (RTSPClient*)medium; + return True; +} + +static void copyUsernameOrPasswordStringFromURL(char* dest, char const* src, unsigned len) { + // Normally, we just copy from the source to the destination. However, if the source contains + // %-encoded characters, then we decode them while doing the copy: + while (len > 0) { + int nBefore = 0; + int nAfter = 0; + + if (*src == '%' && len >= 3 && sscanf(src+1, "%n%2hhx%n", &nBefore, dest, &nAfter) == 1) { + unsigned codeSize = nAfter - nBefore; // should be 1 or 2 + + ++dest; + src += (1 + codeSize); + len -= (1 + codeSize); + } else { + *dest++ = *src++; + --len; + } + } + *dest = '\0'; +} + +Boolean RTSPClient::parseRTSPURL(char const* url, + char*& username, char*& password, + NetAddress& address, + portNumBits& portNum, + char const** urlSuffix) { + do { + // Parse the URL as "rtsp://[[:]@][:][/]" (or "rtsps://...") + char const* rtspPrefix = "rtsp://"; + unsigned const rtspPrefixLength = 7; + char const* rtspsPrefix = "rtsps://"; + unsigned const rtspsPrefixLength = 8; + + portNumBits defaultPortNumber; + char const* from; + if (_strncasecmp(url, rtspPrefix, rtspPrefixLength) == 0) { + defaultPortNumber = 554; + from = &url[rtspPrefixLength]; + } else if (_strncasecmp(url, rtspsPrefix, rtspsPrefixLength) == 0) { + fTLS.isNeeded = True; + defaultPortNumber = 322; + from = &url[rtspsPrefixLength]; + } else { + envir().setResultMsg("URL does not begin with \"rtsp://\" or \"rtsps://\""); + break; + } + + unsigned const parseBufferSize = 100; + char parseBuffer[parseBufferSize]; + + // Check whether "[:]@" occurs next. + // We do this by checking whether '@' appears before the end of the URL, or before the first '/'. + username = password = NULL; // default return values + char const* colonPasswordStart = NULL; + char const* lastAtPtr = NULL; + for (char const* p = from; *p != '\0' && *p != '/'; ++p) { + if (*p == ':' && colonPasswordStart == NULL) { + colonPasswordStart = p; + } else if (*p == '@') { + lastAtPtr = p; + } + } + if (lastAtPtr != NULL) { + // We found (and perhaps ). Copy them into newly-allocated result strings: + if (colonPasswordStart == NULL || colonPasswordStart > lastAtPtr) colonPasswordStart = lastAtPtr; + + char const* usernameStart = from; + unsigned usernameLen = colonPasswordStart - usernameStart; + username = new char[usernameLen + 1] ; // allow for the trailing '\0' + copyUsernameOrPasswordStringFromURL(username, usernameStart, usernameLen); + + char const* passwordStart = colonPasswordStart; + if (passwordStart < lastAtPtr) ++passwordStart; // skip over the ':' + unsigned passwordLen = lastAtPtr - passwordStart; + password = new char[passwordLen + 1]; // allow for the trailing '\0' + copyUsernameOrPasswordStringFromURL(password, passwordStart, passwordLen); + + from = lastAtPtr + 1; // skip over the '@' + } + + // Next, parse + char* to = &parseBuffer[0]; + Boolean isInSquareBrackets = False; // by default + if (*from == '[') { + ++from; + isInSquareBrackets = True; + } + unsigned i; + for (i = 0; i < parseBufferSize; ++i) { + if (*from == '\0' || + (*from == ':' && !isInSquareBrackets) || + *from == '/' || + (*from == ']' && isInSquareBrackets)) { + // We've completed parsing the address + *to = '\0'; + if (*from == ']' && isInSquareBrackets) ++from; + break; + } + *to++ = *from++; + } + if (i == parseBufferSize) { + envir().setResultMsg("URL is too long"); + break; + } + + NetAddressList addresses(parseBuffer); + if (addresses.numAddresses() == 0) { + envir().setResultMsg("Failed to find network address for \"", + parseBuffer, "\""); + break; + } + address = *(addresses.firstAddress()); + + portNum = defaultPortNumber; // unless it's specified explicitly in the URL + char nextChar = *from; + if (nextChar == ':') { + int portNumInt; + if (sscanf(++from, "%d", &portNumInt) != 1) { + envir().setResultMsg("No port number follows ':'"); + break; + } + if (portNumInt < 1 || portNumInt > 65535) { + envir().setResultMsg("Bad port number"); + break; + } + portNum = (portNumBits)portNumInt; + while (*from >= '0' && *from <= '9') ++from; // skip over port number + } + + // The remainder of the URL is the suffix: + if (urlSuffix != NULL) *urlSuffix = from; + + return True; + } while (0); + + // An error occurred in the parsing: + return False; +} + +void RTSPClient::setUserAgentString(char const* userAgentName) { + if (userAgentName == NULL) return; + + // Change the existing user agent header string: + char const* const formatStr = "User-Agent: %s\r\n"; + unsigned const headerSize = strlen(formatStr) + strlen(userAgentName); + delete[] fUserAgentHeaderStr; + fUserAgentHeaderStr = new char[headerSize]; + sprintf(fUserAgentHeaderStr, formatStr, userAgentName); + fUserAgentHeaderStrLen = strlen(fUserAgentHeaderStr); +} + +unsigned RTSPClient::responseBufferSize = 20000; // default value; you can reassign this in your application if you need to + +RTSPClient::RTSPClient(UsageEnvironment& env, char const* rtspURL, + int verbosityLevel, char const* applicationName, + portNumBits tunnelOverHTTPPortNum, int socketNumToServer) + : Medium(env), + desiredMaxIncomingPacketSize(0), fVerbosityLevel(verbosityLevel), fCSeq(1), + fAllowBasicAuthentication(True), fTunnelOverHTTPPortNum(tunnelOverHTTPPortNum), + fUserAgentHeaderStr(NULL), fUserAgentHeaderStrLen(0), + fInputSocketNum(-1), fOutputSocketNum(-1), fBaseURL(NULL), fTCPStreamIdCount(0), + fLastSessionId(NULL), fSessionTimeoutParameter(0), fRequireStr(NULL), + fSessionCookieCounter(0), fHTTPTunnelingConnectionIsPending(False), + fTLS(*this), fPOSTSocketTLS(*this),bRequireBackChannel(False) { + fInputTLS = fOutputTLS = &fTLS; // fOutputTLS will change if we're doing RTSP-over-HTTPS + setBaseURL(rtspURL); + + fResponseBuffer = new char[responseBufferSize+1]; + resetResponseBuffer(); + + setRequireValue(); + + if (socketNumToServer >= 0) { + // This socket number is (assumed to be) already connected to the server. + // Use it, and arrange to handle responses to requests sent on it: + fInputSocketNum = fOutputSocketNum = socketNumToServer; + env.taskScheduler().setBackgroundHandling(fInputSocketNum, SOCKET_READABLE|SOCKET_EXCEPTION, + (TaskScheduler::BackgroundHandlerProc*)&incomingDataHandler, this); + } + + // Set the "User-Agent:" header to use in each request: + char const* const libName = "LIVE555 Streaming Media v"; + char const* const libVersionStr = LIVEMEDIA_LIBRARY_VERSION_STRING; + char const* libPrefix; char const* libSuffix; + if (applicationName == NULL || applicationName[0] == '\0') { + applicationName = libPrefix = libSuffix = ""; + } else { + libPrefix = " ("; + libSuffix = ")"; + } + unsigned userAgentNameSize + = strlen(applicationName) + strlen(libPrefix) + strlen(libName) + strlen(libVersionStr) + strlen(libSuffix) + 1; + char* userAgentName = new char[userAgentNameSize]; + sprintf(userAgentName, "%s%s%s%s%s", applicationName, libPrefix, libName, libVersionStr, libSuffix); + setUserAgentString(userAgentName); + delete[] userAgentName; +} + +RTSPClient::~RTSPClient() { + reset(); + + delete[] fRequireStr; + delete[] fResponseBuffer; + delete[] fUserAgentHeaderStr; +} + +void RTSPClient::reset() { + resetTCPSockets(); + resetResponseBuffer(); + fRequestsAwaitingConnection.reset(); + fRequestsAwaitingHTTPTunneling.reset(); + fRequestsAwaitingResponse.reset(); + + setBaseURL(NULL); + + fCurrentAuthenticator.reset(); + + delete[] fLastSessionId; fLastSessionId = NULL; +} + +void RTSPClient::setBaseURL(char const* url) { + delete[] fBaseURL; fBaseURL = strDup(url); +} + +int RTSPClient::grabSocket() { + int inputSocket = fInputSocketNum; + RTPInterface::clearServerRequestAlternativeByteHandler(envir(), fInputSocketNum); // in case we were receiving RTP-over-TCP + fInputSocketNum = -1; + + return inputSocket; +} + +unsigned RTSPClient::sendRequest(RequestRecord* request) { + char* cmd = NULL; + do { + Boolean connectionIsPending = False; + if (!fRequestsAwaitingConnection.isEmpty()) { + // A connection is currently pending (with at least one enqueued request). Enqueue this request also: + connectionIsPending = True; + } else if (fInputSocketNum < 0) { // we need to open a connection + int connectResult = openConnection(); + if (connectResult < 0) break; // an error occurred + else if (connectResult == 0) { + // A connection is pending + connectionIsPending = True; + } // else the connection succeeded. Continue sending the command. + } + if (connectionIsPending) { + fRequestsAwaitingConnection.enqueue(request); + return request->cseq(); + } + + // If requested (and we're not already doing it, or have done it), set up the special protocol for tunneling RTSP-over-HTTP: + if (fTunnelOverHTTPPortNum != 0 && strcmp(request->commandName(), "GET") != 0 && fOutputSocketNum == fInputSocketNum) { + if (!setupHTTPTunneling1()) break; + fRequestsAwaitingHTTPTunneling.enqueue(request); + return request->cseq(); + } + + // Construct and send the command: + + // First, construct command-specific headers that we need: + + char* cmdURL = fBaseURL; // by default + Boolean cmdURLWasAllocated = False; + + char const* protocolStr = "RTSP/1.0"; // by default + + char* extraHeaders = (char*)""; // by default + Boolean extraHeadersWereAllocated = False; + + char* contentLengthHeader = (char*)""; // by default + Boolean contentLengthHeaderWasAllocated = False; + + if (!setRequestFields(request, + cmdURL, cmdURLWasAllocated, + protocolStr, + extraHeaders, extraHeadersWereAllocated)) { + break; + } + + char const* contentStr = request->contentStr(); // by default + if (contentStr == NULL) contentStr = ""; + unsigned contentStrLen = strlen(contentStr); + if (contentStrLen > 0) { + char const* contentLengthHeaderFmt = + "Content-Length: %d\r\n"; + unsigned contentLengthHeaderSize = strlen(contentLengthHeaderFmt) + + 20 /* max int len */; + contentLengthHeader = new char[contentLengthHeaderSize]; + sprintf(contentLengthHeader, contentLengthHeaderFmt, contentStrLen); + contentLengthHeaderWasAllocated = True; + } + + char* authenticatorStr = createAuthenticatorString(request->commandName(), fBaseURL); + + char const* const cmdFmt = + "%s %s %s\r\n" + "CSeq: %d\r\n" + "%s" + "%s" + "%s" + "%s" + "%s" + "\r\n" + "%s"; + unsigned cmdSize = strlen(cmdFmt) + + strlen(request->commandName()) + strlen(cmdURL) + strlen(protocolStr) + + 20 /* max int len */ + + strlen(authenticatorStr) + + fUserAgentHeaderStrLen + + strlen(fRequireStr) + + strlen(extraHeaders) + + strlen(contentLengthHeader) + + contentStrLen; + cmd = new char[cmdSize]; + sprintf(cmd, cmdFmt, + request->commandName(), cmdURL, protocolStr, + request->cseq(), + authenticatorStr, + fUserAgentHeaderStr, + fRequireStr, + extraHeaders, + contentLengthHeader, + contentStr); + delete[] authenticatorStr; + if (cmdURLWasAllocated) delete[] cmdURL; + if (extraHeadersWereAllocated) delete[] extraHeaders; + if (contentLengthHeaderWasAllocated) delete[] contentLengthHeader; + + if (fVerbosityLevel >= 1) envir() << "Sending request: " << cmd << "\n"; + + if (fTunnelOverHTTPPortNum != 0 && strcmp(request->commandName(), "GET") != 0 && strcmp(request->commandName(), "POST") != 0) { + // When we're tunneling RTSP-over-HTTP, we Base-64-encode the request before we send it. + // (However, we don't do this for the HTTP "GET" and "POST" commands that we use to set up the tunnel.) + char* origCmd = cmd; + cmd = base64Encode(origCmd, strlen(cmd)); + if (fVerbosityLevel >= 1) envir() << "\tThe request was base-64 encoded to: " << cmd << "\n\n"; + delete[] origCmd; + } + + if (write(cmd, strlen(cmd)) < 0) { + char const* errFmt = "%s write() failed: "; + unsigned const errLength = strlen(errFmt) + strlen(request->commandName()); + char* err = new char[errLength]; + sprintf(err, errFmt, request->commandName()); + envir().setResultErrMsg(err); + delete[] err; + break; + } + + // The command send succeeded, so enqueue the request record, so that its response (when it comes) can be handled. + // However, note that we do not expect a response to a POST command with RTSP-over-HTTP, so don't enqueue that. + int cseq = request->cseq(); + + if (fTunnelOverHTTPPortNum == 0 || strcmp(request->commandName(), "POST") != 0) { + fRequestsAwaitingResponse.enqueue(request); + } else { + delete request; + } + + delete[] cmd; + return cseq; + } while (0); + + // An error occurred, so call the response handler immediately (indicating the error): + delete[] cmd; + handleRequestError(request); + delete request; + return 0; +} + +static char* createSessionString(char const* sessionId) { + char* sessionStr; + if (sessionId != NULL) { + sessionStr = new char[20+strlen(sessionId)]; + sprintf(sessionStr, "Session: %s\r\n", sessionId); + } else { + sessionStr = strDup(""); + } + return sessionStr; +} + +// Add support for faster download using the "speed:" option on PLAY +static char* createSpeedString(float speed) { + char buf[100]; + if (speed == 1.0f ) { + // This is the default value; we don't need a "Speed:" header: + buf[0] = '\0'; + } else { + sprintf(buf, "Speed: %.3f\r\n",speed); + } + + return strDup(buf); +} + +static char* createScaleString(float scale, float currentScale) { + char buf[100]; + if (scale == 1.0f && currentScale == 1.0f) { + // This is the default value; we don't need a "Scale:" header: + buf[0] = '\0'; + } else { + Locale l("C", Numeric); + sprintf(buf, "Scale: %f\r\n", scale); + } + + return strDup(buf); +} + +static char* createRangeString(double start, double end, char const* absStartTime, char const* absEndTime) { + char buf[100]; + + if (absStartTime != NULL) { + // Create a "Range:" header that specifies 'absolute' time values: + + if (absEndTime == NULL) { + // There's no end time: + snprintf(buf, sizeof buf, "Range: clock=%s-\r\n", absStartTime); + } else { + // There's both a start and an end time; include them both in the "Range:" hdr + snprintf(buf, sizeof buf, "Range: clock=%s-%s\r\n", absStartTime, absEndTime); + } + } else { + // Create a "Range:" header that specifies relative (i.e., NPT) time values: + + if (start < 0) { + // We're resuming from a PAUSE; there's no "Range:" header at all + buf[0] = '\0'; + } else if (end < 0) { + // There's no end time: + Locale l("C", Numeric); + sprintf(buf, "Range: npt=%.3f-\r\n", start); + } else { + // There's both a start and an end time; include them both in the "Range:" hdr + Locale l("C", Numeric); + sprintf(buf, "Range: npt=%.3f-%.3f\r\n", start, end); + } + } + + return strDup(buf); +} + +Boolean RTSPClient::setRequestFields(RequestRecord* request, + char*& cmdURL, Boolean& cmdURLWasAllocated, + char const*& protocolStr, + char*& extraHeaders, Boolean& extraHeadersWereAllocated + ) { + // Set various fields that will appear in our outgoing request, depending upon the particular command that we are sending. + + if (strcmp(request->commandName(), "DESCRIBE") == 0) { + extraHeaders = (char*)"Accept: application/sdp\r\n"; + + // Enable below header to support ONVIF + extraHeaders = (char*)( bRequireBackChannel == True ? "Accept: application/sdp\r\nRequire: www.onvif.org/ver20/backchannel\r\n" : "Accept: application/sdp\r\n"); + + } else if (strcmp(request->commandName(), "OPTIONS") == 0) { + // If we're currently part of a session, create a "Session:" header (in case the server wants this to indicate + // client 'liveness); this makes up our 'extra headers': + extraHeaders = createSessionString(fLastSessionId); + extraHeadersWereAllocated = True; + } else if (strcmp(request->commandName(), "ANNOUNCE") == 0) { + extraHeaders = (char*)"Content-Type: application/sdp\r\n"; + } else if (strcmp(request->commandName(), "SETUP") == 0) { + MediaSubsession& subsession = *request->subsession(); + Boolean streamUsingTCP = (request->booleanFlags()&0x1) != 0; + Boolean streamOutgoing = (request->booleanFlags()&0x2) != 0; + Boolean forceMulticastOnUnspecified = (request->booleanFlags()&0x4) != 0; + + char const *prefix, *separator, *suffix; + constructSubsessionURL(subsession, prefix, separator, suffix); + + char const* transportFmt; + if (strcmp(subsession.protocolName(), "RTP") == 0) { + transportFmt = "Transport: RTP/AVP%s%s%s=%d-%d\r\n"; + } else if (strcmp(subsession.protocolName(), "SRTP") == 0) { + transportFmt = "Transport: RTP/SAVP%s%s%s=%d-%d\r\n"; + } else { // "UDP" + suffix = ""; + transportFmt = "Transport: RAW/RAW/UDP%s%s%s=%d-%d\r\n"; + } + + cmdURL = new char[strlen(prefix) + strlen(separator) + strlen(suffix) + 1]; + cmdURLWasAllocated = True; + sprintf(cmdURL, "%s%s%s", prefix, separator, suffix); + + // Construct a "Transport:" header. + char const* transportTypeStr; + char const* modeStr = streamOutgoing ? ";mode=receive" : ""; + // Note: I think the above is nonstandard, but DSS wants it this way + char const* portTypeStr; + portNumBits rtpNumber, rtcpNumber; + if (streamUsingTCP) { // streaming over the RTSP connection + transportTypeStr = "/TCP;unicast"; + portTypeStr = ";interleaved"; + rtpNumber = fTCPStreamIdCount++; + rtcpNumber = fTCPStreamIdCount++; + } else { // normal RTP streaming + struct sockaddr_storage connectionAddress; + subsession.getConnectionEndpointAddress(connectionAddress); + Boolean requestMulticastStreaming + = IsMulticastAddress(connectionAddress) + || (forceMulticastOnUnspecified && addressIsNull(connectionAddress)); + transportTypeStr = requestMulticastStreaming ? ";multicast" : ";unicast"; + portTypeStr = requestMulticastStreaming ? ";port" : ";client_port"; + rtpNumber = subsession.clientPortNum(); + if (rtpNumber == 0) { + envir().setResultMsg("Client port number unknown\n"); + delete[] cmdURL; + return False; + } + rtcpNumber = subsession.rtcpIsMuxed() ? rtpNumber : rtpNumber + 1; + } + unsigned transportSize = strlen(transportFmt) + + strlen(transportTypeStr) + strlen(modeStr) + strlen(portTypeStr) + 2*5 /* max port len */; + char* transportStr = new char[transportSize]; + sprintf(transportStr, transportFmt, + transportTypeStr, modeStr, portTypeStr, rtpNumber, rtcpNumber); + + // When sending more than one "SETUP" request, include a "Session:" header in the 2nd and later commands: + char* sessionStr = createSessionString(fLastSessionId); + + // Optionally include a "Blocksize:" string: + char* blocksizeStr = createBlocksizeString(streamUsingTCP); + + // Optionally include a "KeyMgmt:" string: + char* keyMgmtStr = createKeyMgmtString(cmdURL, subsession); + + // The "Transport:", "Session:" (if present), "Blocksize:" (if present), and "KeyMgmt:" (if present) + // headers make up the 'extra headers': + extraHeaders = new char[transportSize + strlen(sessionStr) + strlen(blocksizeStr) + strlen(keyMgmtStr) + 1]; + extraHeadersWereAllocated = True; + sprintf(extraHeaders, "%s%s%s%s", transportStr, sessionStr, blocksizeStr, keyMgmtStr); + delete[] transportStr; delete[] sessionStr; delete[] blocksizeStr; delete[] keyMgmtStr; + } else if (strcmp(request->commandName(), "GET") == 0 || strcmp(request->commandName(), "POST") == 0) { + // We will be sending a HTTP (not a RTSP) request. + // Begin by re-parsing our RTSP URL, to get the stream name (which we'll use as our 'cmdURL' + // in the subsequent request), and the server address (which we'll use in a "Host:" header): + char* username; + char* password; + NetAddress destAddress; + portNumBits urlPortNum; + if (!parseRTSPURL(fBaseURL, username, password, destAddress, urlPortNum, (char const**)&cmdURL)) return False; + if (cmdURL[0] == '\0') cmdURL = (char*)"/"; + delete[] username; + delete[] password; + + struct sockaddr_storage serverAddr; + copyAddress(serverAddr, &destAddress); + AddressString serverAddressString(serverAddr); + + protocolStr = "HTTP/1.0"; + + if (strcmp(request->commandName(), "GET") == 0) { + // Create a 'session cookie' string, using MD5: + struct { + struct timeval timestamp; + unsigned counter; + } seedData; + gettimeofday(&seedData.timestamp, NULL); + seedData.counter = ++fSessionCookieCounter; + our_MD5Data((unsigned char*)(&seedData), sizeof seedData, fSessionCookie); + // DSS seems to require that the 'session cookie' string be 22 bytes long: + fSessionCookie[23] = '\0'; + + char const* const extraHeadersFmt = + "Host: %s\r\n" + "x-sessioncookie: %s\r\n" + "Accept: application/x-rtsp-tunnelled\r\n" + "Pragma: no-cache\r\n" + "Cache-Control: no-cache\r\n"; + unsigned extraHeadersSize = strlen(extraHeadersFmt) + + strlen(serverAddressString.val()) + + strlen(fSessionCookie); + extraHeaders = new char[extraHeadersSize]; + extraHeadersWereAllocated = True; + sprintf(extraHeaders, extraHeadersFmt, + serverAddressString.val(), + fSessionCookie); + } else { // "POST" + char const* const extraHeadersFmt = + "Host: %s\r\n" + "x-sessioncookie: %s\r\n" + "Content-Type: application/x-rtsp-tunnelled\r\n" + "Pragma: no-cache\r\n" + "Cache-Control: no-cache\r\n" + "Content-Length: 32767\r\n" + "Expires: Sun, 9 Jan 1972 00:00:00 GMT\r\n"; + unsigned extraHeadersSize = strlen(extraHeadersFmt) + + strlen(serverAddressString.val()) + + strlen(fSessionCookie); + extraHeaders = new char[extraHeadersSize]; + extraHeadersWereAllocated = True; + sprintf(extraHeaders, extraHeadersFmt, + serverAddressString.val(), + fSessionCookie); + } + } else { // "PLAY", "PAUSE", "TEARDOWN", "RECORD", "SET_PARAMETER", "GET_PARAMETER" + // First, make sure that we have a RTSP session in progress + if (fLastSessionId == NULL) { + envir().setResultMsg("No RTSP session is currently in progress\n"); + return False; + } + + char const* sessionId; + float originalScale; + if (request->session() != NULL) { + // Session-level operation + cmdURL = (char*)sessionURL(*request->session()); + + sessionId = fLastSessionId; + originalScale = request->session()->scale(); + } else { + // Media-level operation + char const *prefix, *separator, *suffix; + constructSubsessionURL(*request->subsession(), prefix, separator, suffix); + cmdURL = new char[strlen(prefix) + strlen(separator) + strlen(suffix) + 1]; + cmdURLWasAllocated = True; + sprintf(cmdURL, "%s%s%s", prefix, separator, suffix); + + sessionId = request->subsession()->sessionId(); + originalScale = request->subsession()->scale(); + } + + if (strcmp(request->commandName(), "PLAY") == 0) { + // Create possible "Session:", "Scale:", "Speed:", and "Range:" headers; + // these make up the 'extra headers': + char* sessionStr = createSessionString(sessionId); + char* scaleStr = createScaleString(request->scale(), originalScale); + float speed = request->session() != NULL ? request->session()->speed() : request->subsession()->speed(); + char* speedStr = createSpeedString(speed); + char* rangeStr = createRangeString(request->start(), request->end(), request->absStartTime(), request->absEndTime()); + extraHeaders = new char[strlen(sessionStr) + strlen(scaleStr) + strlen(speedStr) + strlen(rangeStr) + 1]; + extraHeadersWereAllocated = True; + sprintf(extraHeaders, "%s%s%s%s", sessionStr, scaleStr, speedStr, rangeStr); + delete[] sessionStr; delete[] scaleStr; delete[] speedStr; delete[] rangeStr; + } else { + // Create a "Session:" header; this makes up our 'extra headers': + extraHeaders = createSessionString(sessionId); + extraHeadersWereAllocated = True; + } + } + + return True; +} + +Boolean RTSPClient::isRTSPClient() const { + return True; +} + +void RTSPClient::resetTCPSockets() { + if (fInputSocketNum >= 0) { + RTPInterface::clearServerRequestAlternativeByteHandler(envir(), fInputSocketNum); // in case we were receiving RTP-over-TCP + envir().taskScheduler().disableBackgroundHandling(fInputSocketNum); + ::closeSocket(fInputSocketNum); + if (fOutputSocketNum != fInputSocketNum) { + envir().taskScheduler().disableBackgroundHandling(fOutputSocketNum); + ::closeSocket(fOutputSocketNum); + } + } + fInputSocketNum = fOutputSocketNum = -1; +} + +void RTSPClient::resetResponseBuffer() { + fResponseBytesAlreadySeen = 0; + fResponseBufferBytesLeft = responseBufferSize; +} + +int RTSPClient::openConnection() { + do { + // Set up a connection to the server. Begin by parsing the URL: + + char* username; + char* password; + NetAddress destAddress; + portNumBits urlPortNum; + char const* urlSuffix; + + if (!parseRTSPURL(fBaseURL, username, password, destAddress, urlPortNum, &urlSuffix)) break; + if (urlPortNum == 322) fTLS.isNeeded = True; // port 322 is a special case: "rtsps" + portNumBits destPortNum = fTunnelOverHTTPPortNum == 0 ? urlPortNum : fTunnelOverHTTPPortNum; + + if (username != NULL || password != NULL) { + fCurrentAuthenticator.setUsernameAndPassword(username, password); + delete[] username; + delete[] password; + } + + // We don't yet have a TCP socket (or we used to have one, but it got closed). Set it up now. + copyAddress(fServerAddress, &destAddress); + fInputSocketNum = setupStreamSocket(envir(), 0, fServerAddress.ss_family); + if (fInputSocketNum < 0) break; + ignoreSigPipeOnSocket(fInputSocketNum); // so that servers on the same host that get killed don't also kill us + if (fOutputSocketNum < 0) fOutputSocketNum = fInputSocketNum; + if (fVerbosityLevel >= 1) envir() << "Created new TCP socket " << fInputSocketNum << " for connection\n"; + + // Connect to the remote endpoint: + int connectResult = connectToServer(fInputSocketNum, destPortNum); + if (connectResult < 0) break; + else if (connectResult > 0) { + if (fInputTLS->isNeeded) { + // We need to complete an additional TLS connection: + connectResult = fInputTLS->connect(fInputSocketNum); + if (connectResult < 0) break; + if (connectResult > 0 && fVerbosityLevel >= 1) envir() << "...TLS connection completed\n"; + } + + if (connectResult > 0 && fVerbosityLevel >= 1) envir() << "...local connection opened\n"; + } + + return connectResult; + } while (0); + + resetTCPSockets(); + return -1; +} + +int RTSPClient::connectToServer(int socketNum, portNumBits remotePortNum) { + setPortNum(fServerAddress, htons(remotePortNum)); + if (fVerbosityLevel >= 1) { + envir() << "Connecting to " << AddressString(fServerAddress).val() << ", port " << remotePortNum << " on socket " << socketNum << "...\n"; + } + if (connect(socketNum, (struct sockaddr*)&fServerAddress, addressSize(fServerAddress)) != 0) { + int const err = envir().getErrno(); + if (err == EINPROGRESS || err == EWOULDBLOCK) { + // The connection is pending; we'll need to handle it later. Wait for our socket to be 'writable', or have an exception. + envir().taskScheduler().setBackgroundHandling(socketNum, SOCKET_WRITABLE|SOCKET_EXCEPTION, + (TaskScheduler::BackgroundHandlerProc*)&connectionHandler, this); + return 0; + } + envir().setResultErrMsg("connect() failed: "); + if (fVerbosityLevel >= 1) envir() << "..." << envir().getResultMsg() << "\n"; + return -1; + } + + // The connection succeeded. Arrange to handle responses to requests sent on it: + envir().taskScheduler().setBackgroundHandling(fInputSocketNum, SOCKET_READABLE|SOCKET_EXCEPTION, + (TaskScheduler::BackgroundHandlerProc*)&incomingDataHandler, this); + + return 1; +} + +char* RTSPClient::createAuthenticatorString(char const* cmd, char const* url) { + Authenticator& auth = fCurrentAuthenticator; // alias, for brevity + if (auth.realm() != NULL && auth.username() != NULL && auth.password() != NULL) { + // We have a filled-in authenticator, so use it: + char* authenticatorStr; + if (auth.nonce() != NULL) { // Digest authentication + char const* const authFmt = + "Authorization: Digest username=\"%s\", realm=\"%s\", " + "nonce=\"%s\", uri=\"%s\", response=\"%s\"\r\n"; + char const* response = auth.computeDigestResponse(cmd, url); + unsigned authBufSize = strlen(authFmt) + + strlen(auth.username()) + strlen(auth.realm()) + + strlen(auth.nonce()) + strlen(url) + strlen(response); + authenticatorStr = new char[authBufSize]; + sprintf(authenticatorStr, authFmt, + auth.username(), auth.realm(), + auth.nonce(), url, response); + auth.reclaimDigestResponse(response); + } else { // Basic authentication + char const* const authFmt = "Authorization: Basic %s\r\n"; + + unsigned usernamePasswordLength = strlen(auth.username()) + 1 + strlen(auth.password()); + char* usernamePassword = new char[usernamePasswordLength+1]; + sprintf(usernamePassword, "%s:%s", auth.username(), auth.password()); + + char* response = base64Encode(usernamePassword, usernamePasswordLength); + unsigned const authBufSize = strlen(authFmt) + strlen(response) + 1; + authenticatorStr = new char[authBufSize]; + sprintf(authenticatorStr, authFmt, response); + delete[] response; delete[] usernamePassword; + } + + return authenticatorStr; + } + + // We don't have a (filled-in) authenticator. + return strDup(""); +} + +char* RTSPClient::createBlocksizeString(Boolean streamUsingTCP) { + char* blocksizeStr; + u_int16_t maxPacketSize = desiredMaxIncomingPacketSize; + + // Allow for the RTP header (if streaming over TCP) + // or the IP/UDP/RTP headers (if streaming over UDP): + u_int16_t const headerAllowance = streamUsingTCP ? 12 : 50/*conservative*/; + if (maxPacketSize < headerAllowance) { + maxPacketSize = 0; + } else { + maxPacketSize -= headerAllowance; + } + + if (maxPacketSize > 0) { + blocksizeStr = new char[25]; // more than enough space + sprintf(blocksizeStr, "Blocksize: %u\r\n", maxPacketSize); + } else { + blocksizeStr = strDup(""); + } + return blocksizeStr; +} + +char* RTSPClient::createKeyMgmtString(char const* url, MediaSubsession const& subsession) { + char* keyMgmtStr; + MIKEYState* mikeyState; + u_int8_t* mikeyMessage; + unsigned mikeyMessageSize; + + if ((mikeyState = subsession.getMIKEYState()) == NULL || + (mikeyMessage = mikeyState->generateMessage(mikeyMessageSize)) == NULL) { + keyMgmtStr = strDup(""); + } else { + char const* keyMgmtFmt = "KeyMgmt: prot=mikey; uri=\"%s\"; data=\"%s\"\r\n"; + char* base64EncodedData = base64Encode((char*)mikeyMessage, mikeyMessageSize); + delete[] mikeyMessage; + + unsigned keyMgmtSize = strlen(keyMgmtFmt) + strlen(url) + strlen(base64EncodedData); + keyMgmtStr = new char[keyMgmtSize]; + sprintf(keyMgmtStr, keyMgmtFmt, + url, base64EncodedData); + delete[] base64EncodedData; + } + + return keyMgmtStr; +} + +void RTSPClient::handleRequestError(RequestRecord* request) { + int resultCode = -envir().getErrno(); + if (resultCode == 0) { + // Choose some generic error code instead: +#if defined(__WIN32__) || defined(_WIN32) || defined(_QNX4) + resultCode = -WSAENOTCONN; +#else + resultCode = -ENOTCONN; +#endif + } + if (request->handler() != NULL) (*request->handler())(this, resultCode, strDup(envir().getResultMsg())); +} + +Boolean RTSPClient +::parseResponseCode(char const* line, unsigned& responseCode, char const*& responseString) { + if (sscanf(line, "RTSP/%*s%u", &responseCode) != 1 && + sscanf(line, "HTTP/%*s%u", &responseCode) != 1) return False; + // Note: We check for HTTP responses as well as RTSP responses, both in order to setup RTSP-over-HTTP tunneling, + // and so that we get back a meaningful error if the client tried to mistakenly send a RTSP command to a HTTP-only server. + + // Use everything after the RTSP/* (or HTTP/*) as the response string: + responseString = line; + while (responseString[0] != '\0' && responseString[0] != ' ' && responseString[0] != '\t') ++responseString; + while (responseString[0] != '\0' && (responseString[0] == ' ' || responseString[0] == '\t')) ++responseString; // skip whitespace + + return True; +} + +void RTSPClient::handleIncomingRequest() { + // Parse the request string into command name and 'CSeq', then 'handle' the command (by responding that we don't support it): + char cmdName[RTSP_PARAM_STRING_MAX]; + char urlPreSuffix[RTSP_PARAM_STRING_MAX]; + char urlSuffix[RTSP_PARAM_STRING_MAX]; + char cseq[RTSP_PARAM_STRING_MAX]; + char sessionId[RTSP_PARAM_STRING_MAX]; + unsigned contentLength; + Boolean urlIsRTSPS; + if (!parseRTSPRequestString(fResponseBuffer, fResponseBytesAlreadySeen, + cmdName, sizeof cmdName, + urlPreSuffix, sizeof urlPreSuffix, + urlSuffix, sizeof urlSuffix, + cseq, sizeof cseq, + sessionId, sizeof sessionId, + contentLength, urlIsRTSPS)) { + return; + } else { + if (fVerbosityLevel >= 1) { + envir() << "Received incoming RTSP request: " << fResponseBuffer << "\n"; + } + char tmpBuf[2*RTSP_PARAM_STRING_MAX]; + snprintf(tmpBuf, sizeof tmpBuf, + "RTSP/1.0 405 Method Not Allowed\r\nCSeq: %s\r\n\r\n", cseq); + write(tmpBuf, strlen(tmpBuf)); + } +} + +Boolean RTSPClient::checkForHeader(char const* line, char const* headerName, unsigned headerNameLength, char const*& headerParams) { + if (_strncasecmp(line, headerName, headerNameLength) != 0) return False; + + // The line begins with the desired header name. Trim off any whitespace, and return the header parameters: + unsigned paramIndex = headerNameLength; + while (line[paramIndex] != '\0' && (line[paramIndex] == ' ' || line[paramIndex] == '\t')) ++paramIndex; + if (line[paramIndex] == '\0') return False; // the header is assumed to be bad if it has no parameters + + headerParams = &line[paramIndex]; + return True; +} + +Boolean RTSPClient::parseTransportParams(char const* paramsStr, + char*& serverAddressStr, portNumBits& serverPortNum, + unsigned char& rtpChannelId, unsigned char& rtcpChannelId) { + // Initialize the return parameters to 'not found' values: + serverAddressStr = NULL; + serverPortNum = 0; + rtpChannelId = rtcpChannelId = 0xFF; + if (paramsStr == NULL) return False; + + char* foundServerAddressStr = NULL; + Boolean foundServerPortNum = False; + portNumBits clientPortNum = 0; + Boolean foundClientPortNum = False; + Boolean foundChannelIds = False; + unsigned rtpCid, rtcpCid; + Boolean isMulticast = True; // by default + char* foundDestinationStr = NULL; + portNumBits multicastPortNumRTP, multicastPortNumRTCP; + Boolean foundMulticastPortNum = False; + + // Run through each of the parameters, looking for ones that we handle: + char const* fields = paramsStr; + char* field = strDupSize(fields); + while (sscanf(fields, "%[^;]", field) == 1) { + if (sscanf(field, "server_port=%hu", &serverPortNum) == 1) { + foundServerPortNum = True; + } else if (sscanf(field, "client_port=%hu", &clientPortNum) == 1) { + foundClientPortNum = True; + } else if (_strncasecmp(field, "source=", 7) == 0) { + delete[] foundServerAddressStr; + foundServerAddressStr = strDup(field+7); + } else if (sscanf(field, "interleaved=%u-%u", &rtpCid, &rtcpCid) == 2) { + rtpChannelId = (unsigned char)rtpCid; + rtcpChannelId = (unsigned char)rtcpCid; + foundChannelIds = True; + } else if (strcmp(field, "unicast") == 0) { + isMulticast = False; + } else if (_strncasecmp(field, "destination=", 12) == 0) { + delete[] foundDestinationStr; + foundDestinationStr = strDup(field+12); + } else if (sscanf(field, "port=%hu-%hu", &multicastPortNumRTP, &multicastPortNumRTCP) == 2 || + sscanf(field, "port=%hu", &multicastPortNumRTP) == 1) { + foundMulticastPortNum = True; + } + + fields += strlen(field); + while (fields[0] == ';') ++fields; // skip over all leading ';' chars + if (fields[0] == '\0') break; + } + delete[] field; + + // If we're multicast, and have a "destination=" (multicast) address, then use this + // as the 'server' address (because some weird servers don't specify the multicast + // address earlier, in the "DESCRIBE" response's SDP: + if (isMulticast && foundDestinationStr != NULL && foundMulticastPortNum) { + delete[] foundServerAddressStr; + serverAddressStr = foundDestinationStr; + serverPortNum = multicastPortNumRTP; + return True; + } + delete[] foundDestinationStr; + + // We have a valid "Transport:" header if any of the following are true: + // - We saw a "interleaved=" field, indicating RTP/RTCP-over-TCP streaming, or + // - We saw a "server_port=" field, or + // - We saw a "client_port=" field. + // If we didn't also see a "server_port=" field, then the server port is assumed to be the same as the client port. + if (foundChannelIds || foundServerPortNum || foundClientPortNum) { + if (foundClientPortNum && !foundServerPortNum) { + serverPortNum = clientPortNum; + } + serverAddressStr = foundServerAddressStr; + return True; + } + + delete[] foundServerAddressStr; + return False; +} + +Boolean RTSPClient::parseScaleParam(char const* paramStr, float& scale) { + Locale l("C", Numeric); + return sscanf(paramStr, "%f", &scale) == 1; +} + +Boolean RTSPClient::parseSpeedParam(char const* paramStr, float& speed) { + Locale l("C", Numeric); + return sscanf(paramStr, "%f", &speed) >= 1; +} + +Boolean RTSPClient::parseRTPInfoParams(char const*& paramsStr, u_int16_t& seqNum, u_int32_t& timestamp) { + if (paramsStr == NULL || paramsStr[0] == '\0') return False; + while (paramsStr[0] == ',') ++paramsStr; + + // "paramsStr" now consists of a ';'-separated list of parameters, ending with ',' or '\0'. + char* field = strDupSize(paramsStr); + + Boolean sawSeq = False, sawRtptime = False; + while (sscanf(paramsStr, "%[^;,]", field) == 1) { + if (sscanf(field, "seq=%hu", &seqNum) == 1) { + sawSeq = True; + } else if (sscanf(field, "rtptime=%u", ×tamp) == 1) { + sawRtptime = True; + } + + paramsStr += strlen(field); + if (paramsStr[0] == '\0' || paramsStr[0] == ',') break; + // ASSERT: paramsStr[0] == ';' + ++paramsStr; // skip over the ';' + } + + delete[] field; + // For the "RTP-Info:" parameters to be useful to us, we need to have seen both the "seq=" and "rtptime=" parameters: + return sawSeq && sawRtptime; +} + +Boolean RTSPClient::handleSETUPResponse(MediaSubsession& subsession, char const* sessionParamsStr, char const* transportParamsStr, + Boolean streamUsingTCP) { + char* sessionId = new char[responseBufferSize]; // ensures we have enough space + Boolean success = False; + do { + // Check for a session id: + if (sessionParamsStr == NULL || sscanf(sessionParamsStr, "%[^;]", sessionId) != 1) { + envir().setResultMsg("Missing or bad \"Session:\" header"); + break; + } + subsession.setSessionId(sessionId); + delete[] fLastSessionId; fLastSessionId = strDup(sessionId); + + // Also look for an optional "; timeout = " parameter following this: + char const* afterSessionId = sessionParamsStr + strlen(sessionId); + int timeoutVal; + if (sscanf(afterSessionId, "; timeout = %d", &timeoutVal) == 1) { + fSessionTimeoutParameter = timeoutVal; + } + + // Parse the "Transport:" header parameters: + char* serverAddressStr; + portNumBits serverPortNum; + unsigned char rtpChannelId, rtcpChannelId; + if (!parseTransportParams(transportParamsStr, serverAddressStr, serverPortNum, rtpChannelId, rtcpChannelId)) { + envir().setResultMsg("Missing or bad \"Transport:\" header"); + break; + } + delete[] subsession.connectionEndpointName(); + subsession.connectionEndpointName() = serverAddressStr; + subsession.serverPortNum = serverPortNum; + subsession.rtpChannelId = rtpChannelId; + subsession.rtcpChannelId = rtcpChannelId; + + if (streamUsingTCP) { + // Tell the subsession to receive RTP (and send/receive RTCP) over the RTSP stream: + if (subsession.rtpSource() != NULL) { + subsession.rtpSource()->setStreamSocket(fInputSocketNum, subsession.rtpChannelId, fInputTLS); + // So that we continue to receive & handle RTSP commands and responses from the server + subsession.rtpSource()->enableRTCPReports() = False; + // To avoid confusing the server (which won't start handling RTP/RTCP-over-TCP until "PLAY"), don't send RTCP "RR"s yet + increaseReceiveBufferTo(envir(), fInputSocketNum, 50*1024); + } + + // for audio back channel + if (bRequireBackChannel == True && subsession.sink != NULL) { + RTPSink *sink = (RTPSink *)(subsession.sink); + sink->setStreamSocket(fInputSocketNum, subsession.rtpChannelId, fInputTLS); + increaseReceiveBufferTo(envir(), fInputSocketNum, 50*1024); + } + + if (subsession.rtcpInstance() != NULL) subsession.rtcpInstance()->setStreamSocket(fInputSocketNum, subsession.rtcpChannelId, fInputTLS); + RTPInterface::setServerRequestAlternativeByteHandler(envir(), fInputSocketNum, handleAlternativeRequestByte, this); + } else { + // Normal case. + // Set the RTP and RTCP sockets' destination address and port from the information in the SETUP response (if present): + struct sockaddr_storage destAddress; + subsession.getConnectionEndpointAddress(destAddress); + if (addressIsNull(destAddress)) { + destAddress = fServerAddress; + } + subsession.setDestinations(destAddress); + } + + success = True; + } while (0); + + delete[] sessionId; + return success; +} + +Boolean RTSPClient::handlePLAYResponse(MediaSession* session, MediaSubsession* subsession, + char const* scaleParamsStr, char const* speedParamsStr, + char const* rangeParamsStr, char const* rtpInfoParamsStr) { + Boolean scaleOK = False, rangeOK = False, speedOK = False; + do { + if (session != NULL) { + // The command was on the whole session + if (scaleParamsStr != NULL && !parseScaleParam(scaleParamsStr, session->scale())) break; + scaleOK = True; + if (speedParamsStr != NULL && !parseSpeedParam(speedParamsStr, session->speed())) break; + speedOK = True; + Boolean startTimeIsNow; + if (rangeParamsStr != NULL && + !parseRangeParam(rangeParamsStr, + session->playStartTime(), session->playEndTime(), + session->_absStartTime(), session->_absEndTime(), + startTimeIsNow)) break; + rangeOK = True; + + MediaSubsessionIterator iter(*session); + MediaSubsession* subsession; + while ((subsession = iter.next()) != NULL) { + subsession->scale() = session->scale(); + subsession->speed() = session->speed(); + + u_int16_t seqNum; u_int32_t timestamp; + subsession->rtpInfo.infoIsNew = False; + if (parseRTPInfoParams(rtpInfoParamsStr, seqNum, timestamp)) { + subsession->rtpInfo.seqNum = seqNum; + subsession->rtpInfo.timestamp = timestamp; + subsession->rtpInfo.infoIsNew = True; + } + + if (subsession->rtpSource() != NULL) subsession->rtpSource()->enableRTCPReports() = True; // start sending RTCP "RR"s now + } + } else { + // The command was on a subsession + if (scaleParamsStr != NULL && !parseScaleParam(scaleParamsStr, subsession->scale())) break; + scaleOK = True; + if (speedParamsStr != NULL && !parseSpeedParam(speedParamsStr, subsession->speed())) break; + speedOK = True; + Boolean startTimeIsNow; + if (rangeParamsStr != NULL && + !parseRangeParam(rangeParamsStr, + subsession->_playStartTime(), subsession->_playEndTime(), + subsession->_absStartTime(), subsession->_absEndTime(), + startTimeIsNow)) break; + rangeOK = True; + + u_int16_t seqNum; u_int32_t timestamp; + subsession->rtpInfo.infoIsNew = False; + if (parseRTPInfoParams(rtpInfoParamsStr, seqNum, timestamp)) { + subsession->rtpInfo.seqNum = seqNum; + subsession->rtpInfo.timestamp = timestamp; + subsession->rtpInfo.infoIsNew = True; + } + + if (subsession->rtpSource() != NULL) subsession->rtpSource()->enableRTCPReports() = True; // start sending RTCP "RR"s now + } + + return True; + } while (0); + + // An error occurred: + if (!scaleOK) { + envir().setResultMsg("Bad \"Scale:\" header"); + } else if (!speedOK) { + envir().setResultMsg("Bad \"Speed:\" header"); + } else if (!rangeOK) { + envir().setResultMsg("Bad \"Range:\" header"); + } else { + envir().setResultMsg("Bad \"RTP-Info:\" header"); + } + return False; +} + +Boolean RTSPClient::handleTEARDOWNResponse(MediaSession& /*session*/, MediaSubsession& /*subsession*/) { + // Because we don't expect to always get a response to "TEARDOWN", we don't need to do anything if we do get one: + return True; +} + +Boolean RTSPClient::handleGET_PARAMETERResponse(char const* parameterName, char*& resultValueString, char* resultValueStringEnd) { + do { + // If "parameterName" is non-empty, it may be (possibly followed by ':' and whitespace) at the start of the result string: + if (parameterName != NULL && parameterName[0] != '\0') { + if (parameterName[1] == '\0') break; // sanity check; there should have been \r\n at the end of "parameterName" + + unsigned parameterNameLen = strlen(parameterName); + // ASSERT: parameterNameLen >= 2; + parameterNameLen -= 2; // because of the trailing \r\n + if (resultValueString + parameterNameLen > resultValueStringEnd) break; // not enough space + if (parameterNameLen > 0 && _strncasecmp(resultValueString, parameterName, parameterNameLen) == 0) { + resultValueString += parameterNameLen; + // ASSERT: resultValueString <= resultValueStringEnd + if (resultValueString == resultValueStringEnd) break; + + if (resultValueString[0] == ':') ++resultValueString; + while (resultValueString < resultValueStringEnd + && (resultValueString[0] == ' ' || resultValueString[0] == '\t')) { + ++resultValueString; + } + } + } + + // The rest of "resultValueStr" should be our desired result, but first trim off any \r and/or \n characters at the end: + char saved = *resultValueStringEnd; + *resultValueStringEnd = '\0'; + unsigned resultLen = strlen(resultValueString); + *resultValueStringEnd = saved; + + while (resultLen > 0 && (resultValueString[resultLen-1] == '\r' || resultValueString[resultLen-1] == '\n')) --resultLen; + resultValueString[resultLen] = '\0'; + + return True; + } while (0); + + // An error occurred: + envir().setResultMsg("Bad \"GET_PARAMETER\" response"); + return False; +} + +Boolean RTSPClient::handleAuthenticationFailure(char const* paramsStr) { + if (paramsStr == NULL) return False; // There was no "WWW-Authenticate:" header; we can't proceed. + + // Fill in "fCurrentAuthenticator" with the information from the "WWW-Authenticate:" header: + Boolean realmHasChanged = False; // by default + Boolean isStale = False; // by default + char* realm = strDupSize(paramsStr); + char* nonce = strDupSize(paramsStr); + char* stale = strDupSize(paramsStr); + Boolean success = True; + if (sscanf(paramsStr, "Digest realm=\"%[^\"]\", nonce=\"%[^\"]\", stale=%[a-zA-Z]", realm, nonce, stale) == 3) { + realmHasChanged = fCurrentAuthenticator.realm() == NULL || strcmp(fCurrentAuthenticator.realm(), realm) != 0; + isStale = _strncasecmp(stale, "true", 4) == 0; + fCurrentAuthenticator.setRealmAndNonce(realm, nonce); + } else if (sscanf(paramsStr, "Digest realm=\"%[^\"]\", nonce=\"%[^\"]\"", realm, nonce) == 2) { + realmHasChanged = fCurrentAuthenticator.realm() == NULL || strcmp(fCurrentAuthenticator.realm(), realm) != 0; + fCurrentAuthenticator.setRealmAndNonce(realm, nonce); + } else if (sscanf(paramsStr, "Basic realm=\"%[^\"]\"", realm) == 1 && fAllowBasicAuthentication) { + realmHasChanged = fCurrentAuthenticator.realm() == NULL || strcmp(fCurrentAuthenticator.realm(), realm) != 0; + fCurrentAuthenticator.setRealmAndNonce(realm, NULL); // Basic authentication + } else { + success = False; // bad "WWW-Authenticate:" header + } + delete[] realm; delete[] nonce; delete[] stale; + + if (success) { + if ((!realmHasChanged && !isStale) || fCurrentAuthenticator.username() == NULL || fCurrentAuthenticator.password() == NULL) { + // We already tried with the same realm (and a non-stale nonce), + // or don't have a username and/or password, so the new "WWW-Authenticate:" header + // information won't help us. We remain unauthenticated. + success = False; + } + } + + return success; +} + +Boolean RTSPClient::resendCommand(RequestRecord* request) { + if (fVerbosityLevel >= 1) envir() << "Resending...\n"; + if (request != NULL && strcmp(request->commandName(), "GET") != 0) request->cseq() = ++fCSeq; + return sendRequest(request) != 0; +} + +char const* RTSPClient::sessionURL(MediaSession const& session) const { + char const* url = session.controlPath(); + if (url == NULL || strcmp(url, "*") == 0) url = fBaseURL; + + return url; +} + +void RTSPClient::handleAlternativeRequestByte(void* rtspClient, u_int8_t requestByte) { + ((RTSPClient*)rtspClient)->handleAlternativeRequestByte1(requestByte); +} + +void RTSPClient::handleAlternativeRequestByte1(u_int8_t requestByte) { + if (requestByte == 0xFF) { + // Hack: The new handler of the input TCP socket encountered an error reading it. Indicate this: + handleResponseBytes(-1); + } else if (requestByte == 0xFE) { + // Another hack: The new handler of the input TCP socket no longer needs it, so take back control: + envir().taskScheduler().setBackgroundHandling(fInputSocketNum, SOCKET_READABLE|SOCKET_EXCEPTION, + (TaskScheduler::BackgroundHandlerProc*)&incomingDataHandler, this); + } else { + // Normal case: + fResponseBuffer[fResponseBytesAlreadySeen] = requestByte; + handleResponseBytes(1); + } +} + +static Boolean isAbsoluteURL(char const* url) { + // Assumption: "url" is absolute if it contains a ':', before any + // occurrence of '/' + while (*url != '\0' && *url != '/') { + if (*url == ':') return True; + ++url; + } + + return False; +} + +void RTSPClient::constructSubsessionURL(MediaSubsession const& subsession, + char const*& prefix, + char const*& separator, + char const*& suffix) { + // Figure out what the URL describing "subsession" will look like. + // The URL is returned in three parts: prefix; separator; suffix + //##### NOTE: This code doesn't really do the right thing if "sessionURL()" + // doesn't end with a "/", and "subsession.controlPath()" is relative. + // The right thing would have been to truncate "sessionURL()" back to the + // rightmost "/", and then add "subsession.controlPath()". + // In practice, though, each "DESCRIBE" response typically contains + // a "Content-Base:" header that consists of "sessionURL()" followed by + // a "/", in which case this code ends up giving the correct result. + // However, we should really fix this code to do the right thing, and + // also check for and use the "Content-Base:" header appropriately. ##### + prefix = sessionURL(subsession.parentSession()); + if (prefix == NULL) prefix = ""; + + suffix = subsession.controlPath(); + if (suffix == NULL) suffix = ""; + + if (isAbsoluteURL(suffix)) { + prefix = separator = ""; + } else { + unsigned prefixLen = strlen(prefix); + separator = (prefixLen == 0 || prefix[prefixLen-1] == '/' || suffix[0] == '/') ? "" : "/"; + } +} + +Boolean RTSPClient::setupHTTPTunneling1() { + // Set up RTSP-over-HTTP tunneling, as described in + // http://mirror.informatimago.com/next/developer.apple.com/quicktime/icefloe/dispatch028.html + // and http://images.apple.com/br/quicktime/pdf/QTSS_Modules.pdf + if (fVerbosityLevel >= 1) { + envir() << "Requesting RTSP-over-HTTP tunneling (on port " << fTunnelOverHTTPPortNum << ")\n\n"; + } + + // Begin by sending a HTTP "GET", to set up the server->client link. Continue when we handle the response: + return sendRequest(new RequestRecord(1, "GET", responseHandlerForHTTP_GET)) != 0; +} + +void RTSPClient::responseHandlerForHTTP_GET(RTSPClient* rtspClient, int responseCode, char* responseString) { + if (rtspClient != NULL) rtspClient->responseHandlerForHTTP_GET1(responseCode, responseString); +} + +void RTSPClient::responseHandlerForHTTP_GET1(int responseCode, char* responseString) { + RequestRecord* request; + do { + delete[] responseString; // we don't need it (but are responsible for deleting it) + if (responseCode != 0) break; // The HTTP "GET" failed. + + // Having successfully set up (using the HTTP "GET" command) the server->client link, set up a second TCP connection + // (to the same server & port as before) for the client->server link. All future output will be to this new socket. + fOutputSocketNum = setupStreamSocket(envir(), 0, fServerAddress.ss_family); + if (fOutputSocketNum < 0) break; + ignoreSigPipeOnSocket(fOutputSocketNum); // so that servers on the same host that killed don't also kill us + fOutputTLS = &fPOSTSocketTLS; + fOutputTLS->isNeeded = fInputTLS->isNeeded; + + fHTTPTunnelingConnectionIsPending = True; + int connectResult = connectToServer(fOutputSocketNum, fTunnelOverHTTPPortNum); + if (connectResult < 0) break; // an error occurred + else if (connectResult > 0) { + if (fOutputTLS->isNeeded) { + // We need to complete an additional TLS connection: + connectResult = fOutputTLS->connect(fOutputSocketNum); + if (connectResult < 0) break; + if (connectResult > 0 && fVerbosityLevel >= 1) envir() << "...TLS connection completed\n"; + } + + if (connectResult > 0 && fVerbosityLevel >= 1) envir() << "...local connection opened\n"; + } + + if (connectResult == 0) { + // A connection is pending. Continue setting up RTSP-over-HTTP when the connection completes. + // First, move the pending requests to the 'awaiting connection' queue: + while ((request = fRequestsAwaitingHTTPTunneling.dequeue()) != NULL) { + fRequestsAwaitingConnection.enqueue(request); + } + return; + } + + // The connection succeeded. Continue setting up RTSP-over-HTTP: + if (!setupHTTPTunneling2()) break; + + // RTSP-over-HTTP tunneling succeeded. Resume the pending request(s): + while ((request = fRequestsAwaitingHTTPTunneling.dequeue()) != NULL) { + sendRequest(request); + } + return; + } while (0); + + // An error occurred. Dequeue the pending request(s), and tell them about the error: + fHTTPTunnelingConnectionIsPending = False; + resetTCPSockets(); // do this now, in case an error handler deletes "this" + RequestQueue requestQueue(fRequestsAwaitingHTTPTunneling); + while ((request = requestQueue.dequeue()) != NULL) { + handleRequestError(request); + delete request; + } +} + +Boolean RTSPClient::setupHTTPTunneling2() { + fHTTPTunnelingConnectionIsPending = False; + + // Send a HTTP "POST", to set up the client->server link. (Note that we won't see a reply to the "POST".) + return sendRequest(new RequestRecord(1, "POST", NULL)) != 0; +} + +void RTSPClient::connectionHandler(void* instance, int /*mask*/) { + RTSPClient* client = (RTSPClient*)instance; + client->connectionHandler1(); +} + +void RTSPClient::connectionHandler1() { + // Restore normal handling on our sockets: + envir().taskScheduler().disableBackgroundHandling(fOutputSocketNum); + envir().taskScheduler().setBackgroundHandling(fInputSocketNum, SOCKET_READABLE|SOCKET_EXCEPTION, + (TaskScheduler::BackgroundHandlerProc*)&incomingDataHandler, this); + + // Move all requests awaiting connection into a new, temporary queue, to clear "fRequestsAwaitingConnection" + // (so that "sendRequest()" doesn't get confused by "fRequestsAwaitingConnection" being nonempty, and enqueue them all over again). + RequestQueue tmpRequestQueue(fRequestsAwaitingConnection); + RequestRecord* request; + + // Find out whether the connection succeeded or failed: + do { + int err = 0; + SOCKLEN_T len = sizeof err; + // Note: Normally "fOutputSocketNum" == "fInputSocketNum" here, except when we're connecting + // to the second (i.e., "POST") connection when doing RTSP-over-HTTP: + if (getsockopt(fOutputSocketNum, SOL_SOCKET, SO_ERROR, (char*)&err, (socklen_t *)&len) < 0 || err != 0) { + envir().setResultErrMsg("Connection to server failed: ", err); + if (fVerbosityLevel >= 1) envir() << "..." << envir().getResultMsg() << "\n"; + break; + } + + // Note: Normally "fOutputTLS" == "fInputTLS" here, except when we're connecting + // to the second (i.e., "POST") connection when doing RTSP-over-HTTP: + if (fOutputTLS->isNeeded) { + // We need to complete an additional TLS connection: + int tlsConnectResult = fOutputTLS->connect(fOutputSocketNum); + if (tlsConnectResult < 0) break; // error in TLS connection + if (tlsConnectResult > 0 && fVerbosityLevel >= 1) envir() << "...TLS connection completed\n"; + if (tlsConnectResult == 0) { + // The connection is still pending. Continue deferring... + while ((request = tmpRequestQueue.dequeue()) != NULL) { + fRequestsAwaitingConnection.enqueue(request); + } + return; + } + } + + // The connection succeeded. If the connection came about from an attempt to set up RTSP-over-HTTP, finish this now: + if (fHTTPTunnelingConnectionIsPending && !setupHTTPTunneling2()) break; + + // The connection is complete. Resume sending all pending requests: + if (fVerbosityLevel >= 1) envir() << "...remote connection opened\n"; + while ((request = tmpRequestQueue.dequeue()) != NULL) { + sendRequest(request); + } + return; + } while (0); + + // An error occurred. Tell all pending requests about the error: + resetTCPSockets(); // do this now, in case an error handler deletes "this" + while ((request = tmpRequestQueue.dequeue()) != NULL) { + handleRequestError(request); + delete request; + } +} + +void RTSPClient::incomingDataHandler(void* instance, int /*mask*/) { + RTSPClient* client = (RTSPClient*)instance; + client->incomingDataHandler1(); +} + +void RTSPClient::incomingDataHandler1() { + int bytesRead = read((u_int8_t*)&fResponseBuffer[fResponseBytesAlreadySeen], fResponseBufferBytesLeft); + handleResponseBytes(bytesRead); +} + +static char* getLine(char* startOfLine) { + // returns the start of the next line, or NULL if none. Note that this modifies the input string to add '\0' characters. + for (char* ptr = startOfLine; *ptr != '\0'; ++ptr) { + // Check for the end of line: \r\n (but also accept \r or \n by itself): + if (*ptr == '\r' || *ptr == '\n') { + // We found the end of the line + if (*ptr == '\r') { + *ptr++ = '\0'; + if (*ptr == '\n') ++ptr; + } else { + *ptr++ = '\0'; + } + return ptr; + } + } + + return NULL; +} + +void RTSPClient::handleResponseBytes(int newBytesRead) { + do { + if (newBytesRead >= 0 && (unsigned)newBytesRead < fResponseBufferBytesLeft) break; // data was read OK; process it below + + if (newBytesRead >= (int)fResponseBufferBytesLeft) { + // We filled up our response buffer. Treat this as an error (for the first response handler): + envir().setResultMsg("RTSP response was truncated. Increase \"RTSPClient::responseBufferSize\""); + } + + // An error occurred while reading our TCP socket. Call all pending response handlers, indicating this error. + // (However, the "RTSP response was truncated" error is applied to the first response handler only.) + resetResponseBuffer(); + RequestRecord* request; + if (newBytesRead > 0) { // The "RTSP response was truncated" error + if ((request = fRequestsAwaitingResponse.dequeue()) != NULL) { + handleRequestError(request); + delete request; + } + } else { + RequestQueue requestQueue(fRequestsAwaitingResponse); + resetTCPSockets(); // do this now, in case an error handler deletes "this" + + while ((request = requestQueue.dequeue()) != NULL) { + handleRequestError(request); + delete request; + } + } + return; + } while (0); + + fResponseBufferBytesLeft -= newBytesRead; + fResponseBytesAlreadySeen += newBytesRead; + fResponseBuffer[fResponseBytesAlreadySeen] = '\0'; + if (fVerbosityLevel >= 1 && newBytesRead > 1) envir() << "Received " << newBytesRead << " new bytes of response data.\n"; + + unsigned numExtraBytesAfterResponse = 0; + Boolean responseSuccess = False; // by default + do { + // Data was read OK. Look through the data that we've read so far, to see if it contains . + // (If not, wait for more data to arrive.) + Boolean endOfHeaders = False; + char const* ptr = fResponseBuffer; + if (fResponseBytesAlreadySeen > 3) { + char const* const ptrEnd = &fResponseBuffer[fResponseBytesAlreadySeen-3]; + while (ptr < ptrEnd) { + if (*ptr++ == '\r' && *ptr++ == '\n' && *ptr++ == '\r' && *ptr++ == '\n') { + // This is it + endOfHeaders = True; + break; + } + } + } + + if (!endOfHeaders) return; // subsequent reads will be needed to get the complete response + + // Now that we have the complete response headers (ending with ), parse them to get the response code, CSeq, + // and various other header parameters. To do this, we first make a copy of the received header data, because we'll be + // modifying it by adding '\0' bytes. + char* headerDataCopy; + unsigned responseCode = 200; + char const* responseStr = NULL; + RequestRecord* foundRequest = NULL; + char const* sessionParamsStr = NULL; + char const* transportParamsStr = NULL; + char const* scaleParamsStr = NULL; + char const* speedParamsStr = NULL; + char const* rangeParamsStr = NULL; + char const* rtpInfoParamsStr = NULL; + char const* wwwAuthenticateParamsStr = NULL; + char const* publicParamsStr = NULL; + char* bodyStart = NULL; + unsigned numBodyBytes = 0; + responseSuccess = False; + do { + headerDataCopy = new char[responseBufferSize]; + strncpy(headerDataCopy, fResponseBuffer, fResponseBytesAlreadySeen); + headerDataCopy[fResponseBytesAlreadySeen] = '\0'; + + char* lineStart; + char* nextLineStart = headerDataCopy; + do { + lineStart = nextLineStart; + nextLineStart = getLine(lineStart); + } while (lineStart[0] == '\0' && nextLineStart != NULL); // skip over any blank lines at the start + if (!parseResponseCode(lineStart, responseCode, responseStr)) { + // This does not appear to be a RTSP response; perhaps it's a RTSP request instead? + handleIncomingRequest(); + break; // we're done with this data + } + + // Scan through the headers, handling the ones that we're interested in: + Boolean reachedEndOfHeaders; + unsigned cseq = 0; + unsigned contentLength = 0; + + while (1) { + reachedEndOfHeaders = True; // by default; may get changed below + lineStart = nextLineStart; + if (lineStart == NULL) break; + + nextLineStart = getLine(lineStart); + if (lineStart[0] == '\0') break; // this is a blank line + reachedEndOfHeaders = False; + + char const* headerParamsStr; + if (checkForHeader(lineStart, "CSeq:", 5, headerParamsStr)) { + if (sscanf(headerParamsStr, "%u", &cseq) != 1 || cseq <= 0) { + envir().setResultMsg("Bad \"CSeq:\" header: \"", lineStart, "\""); + break; + } + // Find the handler function for "cseq": + RequestRecord* request; + while ((request = fRequestsAwaitingResponse.dequeue()) != NULL) { + if (request->cseq() < cseq) { // assumes that the CSeq counter will never wrap around + // We never received (and will never receive) a response for this handler, so delete it: + if (fVerbosityLevel >= 1 && strcmp(request->commandName(), "POST") != 0) { + envir() << "WARNING: The server did not respond to our \"" << request->commandName() << "\" request (CSeq: " + << request->cseq() << "). The server appears to be buggy (perhaps not handling pipelined requests properly).\n"; + } + delete request; + } else if (request->cseq() == cseq) { + // This is the handler that we want. Remove its record, but remember it, so that we can later call its handler: + foundRequest = request; + break; + } else { // request->cseq() > cseq + // No handler was registered for this response, so ignore it. + break; + } + } + } else if (checkForHeader(lineStart, "Content-Length:", 15, headerParamsStr)) { + if (sscanf(headerParamsStr, "%u", &contentLength) != 1) { + envir().setResultMsg("Bad \"Content-Length:\" header: \"", lineStart, "\""); + break; + } + } else if (checkForHeader(lineStart, "Content-Base:", 13, headerParamsStr)) { + setBaseURL(headerParamsStr); + } else if (checkForHeader(lineStart, "Session:", 8, sessionParamsStr)) { + } else if (checkForHeader(lineStart, "Transport:", 10, transportParamsStr)) { + } else if (checkForHeader(lineStart, "Scale:", 6, scaleParamsStr)) { + } else if (checkForHeader(lineStart, "Speed:", +// NOTE: Should you feel the need to modify this code, + 6, +// please first email the "live-devel" mailing list + speedParamsStr +// (see http://live555.com/liveMedia/faq.html#mailing-list-address for details), + )) { +// to check whether your proposed modification is appropriate/correct, + } else if (checkForHeader(lineStart, "Range:", +// and, if so, whether instead it could be included in + 6, +// a future release of the "LIVE555 Streaming Media" software, + rangeParamsStr +// so that other projects that use the code could benefit (not just your own project). + )) { + } else if (checkForHeader(lineStart, "RTP-Info:", 9, rtpInfoParamsStr)) { + } else if (checkForHeader(lineStart, "WWW-Authenticate:", 17, headerParamsStr)) { + // If we've already seen a "WWW-Authenticate:" header, then we replace it with this new one only if + // the new one specifies "Digest" authentication: + if (wwwAuthenticateParamsStr == NULL || _strncasecmp(headerParamsStr, "Digest", 6) == 0) { + wwwAuthenticateParamsStr = headerParamsStr; + } + } else if (checkForHeader(lineStart, "Public:", 7, publicParamsStr)) { + } else if (checkForHeader(lineStart, "Allow:", 6, publicParamsStr)) { + // Note: we accept "Allow:" instead of "Public:", so that "OPTIONS" requests made to HTTP servers will work. + } else if (checkForHeader(lineStart, "Location:", 9, headerParamsStr)) { + setBaseURL(headerParamsStr); + } else if (checkForHeader(lineStart, "com.ses.streamID:", 17, headerParamsStr)) { + // Replace the tail of the 'base URL' with the value of this header parameter: + char* oldBaseURLTail = strrchr(fBaseURL, '/'); + if (oldBaseURLTail != NULL) { + unsigned newBaseURLLen + = (oldBaseURLTail - fBaseURL) + 8/* for "/stream=" */ + strlen(headerParamsStr); + char* newBaseURL = new char[newBaseURLLen + 1]; + // Note: We couldn't use "asprintf()", because some compilers don't support it + sprintf(newBaseURL, "%.*s/stream=%s", + (int)(oldBaseURLTail - fBaseURL), fBaseURL, headerParamsStr); + setBaseURL(newBaseURL); + delete[] newBaseURL; + } + } else if (checkForHeader(lineStart, "Connection:", 11, headerParamsStr)) { + if (fTunnelOverHTTPPortNum == 0 && _strncasecmp(headerParamsStr, "Close", 5) == 0) { + resetTCPSockets(); + } + } + } + if (!reachedEndOfHeaders) break; // an error occurred + + if (foundRequest == NULL) { + // Hack: The response didn't have a "CSeq:" header; assume it's for our most recent request: + foundRequest = fRequestsAwaitingResponse.dequeue(); + } + + // If we saw a "Content-Length:" header, then make sure that we have the amount of data that it specified: + unsigned bodyOffset = nextLineStart == NULL ? fResponseBytesAlreadySeen : nextLineStart - headerDataCopy; + bodyStart = &fResponseBuffer[bodyOffset]; + numBodyBytes = fResponseBytesAlreadySeen - bodyOffset; + if (contentLength > numBodyBytes) { + // We need to read more data. First, make sure we have enough space for it: + unsigned numExtraBytesNeeded = contentLength - numBodyBytes; + unsigned remainingBufferSize = responseBufferSize - fResponseBytesAlreadySeen; + if (numExtraBytesNeeded > remainingBufferSize) { + char tmpBuf[200]; + sprintf(tmpBuf, "Response buffer size (%d) is too small for \"Content-Length:\" %d (need a buffer size of >= %d bytes\n", + responseBufferSize, contentLength, fResponseBytesAlreadySeen + numExtraBytesNeeded); + envir().setResultMsg(tmpBuf); + break; + } + + if (fVerbosityLevel >= 1) { + envir() << "Have received " << fResponseBytesAlreadySeen << " total bytes of a " + << (foundRequest != NULL ? foundRequest->commandName() : "(unknown)") + << " RTSP response; awaiting " << numExtraBytesNeeded << " bytes more.\n"; + } + delete[] headerDataCopy; + if (foundRequest != NULL) fRequestsAwaitingResponse.putAtHead(foundRequest);// put our request record back; we need it again + return; // We need to read more data + } + + // We now have a complete response (including all bytes specified by the "Content-Length:" header, if any). + char* responseEnd = bodyStart + contentLength; + numExtraBytesAfterResponse = &fResponseBuffer[fResponseBytesAlreadySeen] - responseEnd; + + if (fVerbosityLevel >= 1) { + char saved = *responseEnd; + *responseEnd = '\0'; + envir() << "Received a complete " + << (foundRequest != NULL ? foundRequest->commandName() : "(unknown)") + << " response:\n" << fResponseBuffer << "\n"; + if (numExtraBytesAfterResponse > 0) envir() << "\t(plus " << numExtraBytesAfterResponse << " additional bytes)\n"; + *responseEnd = saved; + } + + if (foundRequest != NULL) { + Boolean needToResendCommand = False; // by default... + if (responseCode == 200) { + // Do special-case response handling for some commands: + if (strcmp(foundRequest->commandName(), "SETUP") == 0) { + if (!handleSETUPResponse(*foundRequest->subsession(), sessionParamsStr, transportParamsStr, foundRequest->booleanFlags()&0x1)) break; + } else if (strcmp(foundRequest->commandName(), "PLAY") == 0) { + if (!handlePLAYResponse(foundRequest->session(), foundRequest->subsession(), scaleParamsStr, speedParamsStr, rangeParamsStr, rtpInfoParamsStr)) break; + } else if (strcmp(foundRequest->commandName(), "TEARDOWN") == 0) { + if (!handleTEARDOWNResponse(*foundRequest->session(), *foundRequest->subsession())) break; + } else if (strcmp(foundRequest->commandName(), "GET_PARAMETER") == 0) { + if (!handleGET_PARAMETERResponse(foundRequest->contentStr(), bodyStart, responseEnd)) break; + } + } else if (responseCode == 401 && handleAuthenticationFailure(wwwAuthenticateParamsStr)) { + // We need to resend the command, with an "Authorization:" header: + needToResendCommand = True; + + if (strcmp(foundRequest->commandName(), "GET") == 0) { + // Note: If a HTTP "GET" command (for RTSP-over-HTTP tunneling) returns "401 Unauthorized", then we resend it + // (with an "Authorization:" header), just as we would for a RTSP command. However, we do so using a new TCP connection, + // because some servers close the original connection after returning the "401 Unauthorized". + resetTCPSockets(); // forces the opening of a new connection for the resent command + } + } else if (responseCode == 301 || responseCode == 302) { // redirection + resetTCPSockets(); // because we need to connect somewhere else next + needToResendCommand = True; + } + + if (needToResendCommand) { + resetResponseBuffer(); + (void)resendCommand(foundRequest); + delete[] headerDataCopy; + return; // without calling our response handler; the response to the resent command will do that + } + } + + responseSuccess = True; + } while (0); + + // If we have a handler function for this response, call it. + // But first, reset our response buffer, in case the handler goes to the event loop, and we end up getting called recursively: + if (numExtraBytesAfterResponse > 0) { + // An unusual case; usually due to having received pipelined responses. Move the extra bytes to the front of the buffer: + char* responseEnd = &fResponseBuffer[fResponseBytesAlreadySeen - numExtraBytesAfterResponse]; + + // But first: A hack to save a copy of the response 'body', in case it's needed below for "resultString": + numBodyBytes -= numExtraBytesAfterResponse; + if (numBodyBytes > 0) { + char saved = *responseEnd; + *responseEnd = '\0'; + bodyStart = strDup(bodyStart); + *responseEnd = saved; + } + + memmove(fResponseBuffer, responseEnd, numExtraBytesAfterResponse); + fResponseBytesAlreadySeen = numExtraBytesAfterResponse; + fResponseBufferBytesLeft = responseBufferSize - numExtraBytesAfterResponse; + fResponseBuffer[numExtraBytesAfterResponse] = '\0'; + } else { + resetResponseBuffer(); + } + if (foundRequest != NULL && foundRequest->handler() != NULL) { + int resultCode; + char* resultString; + if (responseSuccess) { + if (responseCode == 200) { + resultCode = 0; + resultString = numBodyBytes > 0 ? strDup(bodyStart) : strDup(publicParamsStr); + // Note: The "strDup(bodyStart)" call assumes that the body is encoded without interior '\0' bytes + } else { + resultCode = responseCode; + resultString = strDup(responseStr); + envir().setResultMsg(responseStr); + } + (*foundRequest->handler())(this, resultCode, resultString); + } else { + // An error occurred parsing the response, so call the handler, indicating an error: + handleRequestError(foundRequest); + } + } + delete foundRequest; + delete[] headerDataCopy; + if (numExtraBytesAfterResponse > 0 && numBodyBytes > 0) delete[] bodyStart; + } while (numExtraBytesAfterResponse > 0 && responseSuccess); +} + +int RTSPClient::write(const char* data, unsigned count) { + if (fOutputTLS->isNeeded) { + return fOutputTLS->write(data, count); + } else { + return send(fOutputSocketNum, data, count, 0); + } +} + +int RTSPClient::read(u_int8_t* buffer, unsigned bufferSize) { + if (fInputTLS->isNeeded) { + return fInputTLS->read(buffer, bufferSize); + } else { + struct sockaddr_storage dummy; // 'from' address - not used + return readSocket(envir(), fInputSocketNum, buffer, bufferSize, dummy); + } +} + + +////////// RTSPClient::RequestRecord implementation ////////// + +RTSPClient::RequestRecord::RequestRecord(unsigned cseq, char const* commandName, responseHandler* handler, + MediaSession* session, MediaSubsession* subsession, u_int32_t booleanFlags, + double start, double end, float scale, char const* contentStr) + : fNext(NULL), fCSeq(cseq), fCommandName(commandName), fSession(session), fSubsession(subsession), fBooleanFlags(booleanFlags), + fStart(start), fEnd(end), fAbsStartTime(NULL), fAbsEndTime(NULL), fScale(scale), fContentStr(strDup(contentStr)), fHandler(handler) { +} + +RTSPClient::RequestRecord::RequestRecord(unsigned cseq, responseHandler* handler, + char const* absStartTime, char const* absEndTime, float scale, + MediaSession* session, MediaSubsession* subsession) + : fNext(NULL), fCSeq(cseq), fCommandName("PLAY"), fSession(session), fSubsession(subsession), fBooleanFlags(0), + fStart(0.0f), fEnd(-1.0f), fAbsStartTime(strDup(absStartTime)), fAbsEndTime(strDup(absEndTime)), fScale(scale), + fContentStr(NULL), fHandler(handler) { +} + +RTSPClient::RequestRecord::~RequestRecord() { + // Delete the rest of the list first: + delete fNext; + + delete[] fAbsStartTime; delete[] fAbsEndTime; + delete[] fContentStr; +} + + +////////// RTSPClient::RequestQueue implementation ////////// + +RTSPClient::RequestQueue::RequestQueue() + : fHead(NULL), fTail(NULL) { +} + +RTSPClient::RequestQueue::RequestQueue(RequestQueue& origQueue) + : fHead(NULL), fTail(NULL) { + RequestRecord* request; + while ((request = origQueue.dequeue()) != NULL) { + enqueue(request); + } +} + +RTSPClient::RequestQueue::~RequestQueue() { + reset(); +} + +void RTSPClient::RequestQueue::enqueue(RequestRecord* request) { + if (fTail == NULL) { + fHead = request; + } else { + fTail->next() = request; + } + fTail = request; +} + +RTSPClient::RequestRecord* RTSPClient::RequestQueue::dequeue() { + RequestRecord* request = fHead; + if (fHead == fTail) { + fHead = NULL; + fTail = NULL; + } else { + fHead = fHead->next(); + } + if (request != NULL) request->next() = NULL; + return request; +} + +void RTSPClient::RequestQueue::putAtHead(RequestRecord* request) { + request->next() = fHead; + fHead = request; + if (fTail == NULL) { + fTail = request; + } +} + +RTSPClient::RequestRecord* RTSPClient::RequestQueue::findByCSeq(unsigned cseq) { + RequestRecord* request; + for (request = fHead; request != NULL; request = request->next()) { + if (request->cseq() == cseq) return request; + } + return NULL; +} + +void RTSPClient::RequestQueue::reset() { + delete fHead; + fHead = fTail = NULL; +} + + +#ifndef OMIT_REGISTER_HANDLING +////////// HandlerServerForREGISTERCommand implementation ///////// + +HandlerServerForREGISTERCommand* HandlerServerForREGISTERCommand +::createNew(UsageEnvironment& env, onRTSPClientCreationFunc* creationFunc, Port ourPort, + UserAuthenticationDatabase* authDatabase, int verbosityLevel, char const* applicationName) { + int ourSocketIPv4 = setUpOurSocket(env, ourPort, AF_INET); + int ourSocketIPv6 = setUpOurSocket(env, ourPort, AF_INET6); + if (ourSocketIPv4 < 0 && ourSocketIPv6 < 0) return NULL; + + return new HandlerServerForREGISTERCommand(env, creationFunc, ourSocketIPv4, ourSocketIPv6, ourPort, authDatabase, verbosityLevel, applicationName); +} + +HandlerServerForREGISTERCommand +::HandlerServerForREGISTERCommand(UsageEnvironment& env, onRTSPClientCreationFunc* creationFunc, int ourSocketIPv4, int ourSocketIPv6, Port ourPort, + UserAuthenticationDatabase* authDatabase, int verbosityLevel, char const* applicationName) + : RTSPServer(env, ourSocketIPv4, ourSocketIPv6, ourPort, authDatabase, 30/*small reclamationTestSeconds*/), + fCreationFunc(creationFunc), fVerbosityLevel(verbosityLevel), fApplicationName(strDup(applicationName)) { +} + +HandlerServerForREGISTERCommand::~HandlerServerForREGISTERCommand() { + delete[] fApplicationName; +} + +RTSPClient* HandlerServerForREGISTERCommand +::createNewRTSPClient(char const* rtspURL, int verbosityLevel, char const* applicationName, int socketNumToServer) { + // Default implementation: create a basic "RTSPClient": + return RTSPClient::createNew(envir(), rtspURL, verbosityLevel, applicationName, 0, socketNumToServer); +} + +char const* HandlerServerForREGISTERCommand::allowedCommandNames() { + return "OPTIONS, REGISTER"; +} + +Boolean HandlerServerForREGISTERCommand +::weImplementREGISTER(char const* cmd/*"REGISTER" or "DEREGISTER"*/, + char const* /*proxyURLSuffix*/, char*& responseStr) { + responseStr = NULL; + // By default, we implement only "REGISTER"; not "DEREGISTER". Subclass to implement "DEREGISTER" + return strcmp(cmd, "REGISTER") == 0; +} + +void HandlerServerForREGISTERCommand +::implementCmd_REGISTER(char const* cmd/*"REGISTER" or "DEREGISTER"*/, + char const* url, char const* urlSuffix, int socketToRemoteServer, + Boolean deliverViaTCP, char const* /*proxyURLSuffix*/) { + if (strcmp(cmd, "REGISTER") == 0) { // By default, we don't implement "DEREGISTER" + // Create a new "RTSPClient" object, and call our 'creation function' with it: + RTSPClient* newRTSPClient = createNewRTSPClient(url, fVerbosityLevel, fApplicationName, socketToRemoteServer); + + if (fCreationFunc != NULL) (*fCreationFunc)(newRTSPClient, deliverViaTCP); + } +} +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/RTSPCommon.cpp b/src/big/mpp/middleware/src/live555/liveMedia/RTSPCommon.cpp new file mode 100644 index 000000000..bab17f989 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/RTSPCommon.cpp @@ -0,0 +1,380 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Common routines used by both RTSP clients and servers +// Implementation + +#include "RTSPCommon.hh" +#include "Locale.hh" +#include +#include +#include // for "isxdigit() +#include // for "strftime()" and "gmtime()" + +static void decodeURL(char* url) { + // Replace (in place) any % sequences with the appropriate 8-bit character. + char* cursor = url; + while (*cursor) { + if ((cursor[0] == '%') && + cursor[1] && isxdigit(cursor[1]) && + cursor[2] && isxdigit(cursor[2])) { + // We saw a % followed by 2 hex digits, so we copy the literal hex value into the URL, then advance the cursor past it: + char hex[3]; + hex[0] = cursor[1]; + hex[1] = cursor[2]; + hex[2] = '\0'; + *url++ = (char)strtol(hex, NULL, 16); + cursor += 3; + } else { + // Common case: This is a normal character or a bogus % expression, so just copy it + *url++ = *cursor++; + } + } + + *url = '\0'; +} + +Boolean parseRTSPRequestString(char const* reqStr, unsigned reqStrSize, + char* resultCmdName, + unsigned resultCmdNameMaxSize, + char* resultURLPreSuffix, + unsigned resultURLPreSuffixMaxSize, + char* resultURLSuffix, + unsigned resultURLSuffixMaxSize, + char* resultCSeq, + unsigned resultCSeqMaxSize, + char* resultSessionIdStr, + unsigned resultSessionIdStrMaxSize, + unsigned& contentLength, Boolean& urlIsRTSPS) { + // This parser is currently rather dumb; it should be made smarter ##### + urlIsRTSPS = False; // by default + + // "Be liberal in what you accept": Skip over any whitespace at the start of the request: + unsigned i; + for (i = 0; i < reqStrSize; ++i) { + char c = reqStr[i]; + if (!(c == ' ' || c == '\t' || c == '\r' || c == '\n' || c == '\0')) break; + } + if (i == reqStrSize) return False; // The request consisted of nothing but whitespace! + + // Then read everything up to the next space (or tab) as the command name: + Boolean parseSucceeded = False; + unsigned i1 = 0; + for (; i1 < resultCmdNameMaxSize-1 && i < reqStrSize; ++i,++i1) { + char c = reqStr[i]; + if (c == ' ' || c == '\t') { + parseSucceeded = True; + break; + } + + resultCmdName[i1] = c; + } + resultCmdName[i1] = '\0'; + if (!parseSucceeded) return False; + + // Skip over the prefix of any "rtsp://" or "rtsp:/" (or "rtsps://" or "rtsps:/") + // URL that follows: + unsigned j = i+1; + while (j < reqStrSize && (reqStr[j] == ' ' || reqStr[j] == '\t')) ++j; // skip over any additional white space + for (; (int)j < (int)(reqStrSize-8); ++j) { + if ((reqStr[j] == 'r' || reqStr[j] == 'R') + && (reqStr[j+1] == 't' || reqStr[j+1] == 'T') + && (reqStr[j+2] == 's' || reqStr[j+2] == 'S') + && (reqStr[j+3] == 'p' || reqStr[j+3] == 'P')) { + if (reqStr[j+4] == 's' || reqStr[j+4] == 'S') { + urlIsRTSPS = True; + ++j; + } + if (reqStr[j+4] == ':' && reqStr[j+5] == '/') { + j += 6; + if (reqStr[j] == '/') { + // This is a "rtsp(s)://" URL; skip over the host:port part that follows: + ++j; + while (j < reqStrSize && reqStr[j] != '/' && reqStr[j] != ' ') ++j; + } else { + // This is a "rtsp(s):/" URL; back up to the "/": + --j; + } + i = j; + break; + } + } + } + + // Look for the URL suffix (before the following "RTSP/"): + parseSucceeded = False; + for (unsigned k = i+1; (int)k < (int)(reqStrSize-5); ++k) { + if (reqStr[k] == 'R' && reqStr[k+1] == 'T' && + reqStr[k+2] == 'S' && reqStr[k+3] == 'P' && reqStr[k+4] == '/') { + while (--k >= i && reqStr[k] == ' ') {} // go back over all spaces before "RTSP/" + unsigned k1 = k; + while (k1 > i && reqStr[k1] != '/') --k1; + + // ASSERT: At this point + // i: first space or slash after "host" or "host:port" + // k: last non-space before "RTSP/" + // k1: last slash in the range [i,k] + + // The URL suffix comes from [k1+1,k] + // Copy "resultURLSuffix": + unsigned n = 0, k2 = k1+1; + if (k2 <= k) { + if (k - k1 + 1 > resultURLSuffixMaxSize) return False; // there's no room + while (k2 <= k) resultURLSuffix[n++] = reqStr[k2++]; + } + resultURLSuffix[n] = '\0'; + + // The URL 'pre-suffix' comes from [i+1,k1-1] + // Copy "resultURLPreSuffix": + n = 0; k2 = i+1; + if (k2+1 <= k1) { + if (k1 - i > resultURLPreSuffixMaxSize) return False; // there's no room + while (k2 <= k1-1) resultURLPreSuffix[n++] = reqStr[k2++]; + } + resultURLPreSuffix[n] = '\0'; + decodeURL(resultURLPreSuffix); + + i = k + 7; // to go past " RTSP/" + parseSucceeded = True; + break; + } + } + if (!parseSucceeded) return False; + + // Look for "CSeq:" (mandatory, case insensitive), skip whitespace, + // then read everything up to the next \r or \n as 'CSeq': + parseSucceeded = False; + for (j = i; (int)j < (int)(reqStrSize-5); ++j) { + if (_strncasecmp("CSeq:", &reqStr[j], 5) == 0) { + j += 5; + while (j < reqStrSize && (reqStr[j] == ' ' || reqStr[j] == '\t')) ++j; + unsigned n; + for (n = 0; n < resultCSeqMaxSize-1 && j < reqStrSize; ++n,++j) { + char c = reqStr[j]; + if (c == '\r' || c == '\n') { + parseSucceeded = True; + break; + } + + resultCSeq[n] = c; + } + resultCSeq[n] = '\0'; + break; + } + } + if (!parseSucceeded) return False; + + // Look for "Session:" (optional, case insensitive), skip whitespace, + // then read everything up to the next \r or \n as 'Session': + resultSessionIdStr[0] = '\0'; // default value (empty string) + for (j = i; (int)j < (int)(reqStrSize-8); ++j) { + if (_strncasecmp("Session:", &reqStr[j], 8) == 0) { + j += 8; + while (j < reqStrSize && (reqStr[j] == ' ' || reqStr[j] == '\t')) ++j; + unsigned n; + for (n = 0; n < resultSessionIdStrMaxSize-1 && j < reqStrSize; ++n,++j) { + char c = reqStr[j]; + if (c == '\r' || c == '\n') { + break; + } + + resultSessionIdStr[n] = c; + } + resultSessionIdStr[n] = '\0'; + break; + } + } + + // Also: Look for "Content-Length:" (optional, case insensitive) + contentLength = 0; // default value + for (j = i; (int)j < (int)(reqStrSize-15); ++j) { + if (_strncasecmp("Content-Length:", &(reqStr[j]), 15) == 0) { + j += 15; + while (j < reqStrSize && (reqStr[j] == ' ' || reqStr[j] == '\t')) ++j; + unsigned num; + if (sscanf(&reqStr[j], "%u", &num) == 1) { + contentLength = num; + } + } + } + return True; +} + +Boolean parseRangeParam(char const* paramStr, + double& rangeStart, double& rangeEnd, + char*& absStartTime, char*& absEndTime, + Boolean& startTimeIsNow) { + delete[] absStartTime; delete[] absEndTime; + absStartTime = absEndTime = NULL; // by default, unless "paramStr" is a "clock=..." string + startTimeIsNow = False; // by default + double start, end; + int numCharsMatched1 = 0, numCharsMatched2 = 0, numCharsMatched3 = 0, numCharsMatched4 = 0; + int startHour = 0, startMin = 0, endHour = 0, endMin = 0; + double startSec = 0.0, endSec = 0.0; + Locale l("C", Numeric); + if (sscanf(paramStr, "npt = %d:%d:%lf - %d:%d:%lf", &startHour, &startMin, &startSec, &endHour, &endMin, &endSec) == 6) { + rangeStart = startHour*3600 + startMin*60 + startSec; + rangeEnd = endHour*3600 + endMin*60 + endSec; + } else if (sscanf(paramStr, "npt =%lf - %d:%d:%lf", &start, &endHour, &endMin, &endSec) == 4) { + rangeStart = start; + rangeEnd = endHour*3600 + endMin*60 + endSec; + } else if (sscanf(paramStr, "npt = %d:%d:%lf -", &startHour, &startMin, &startSec) == 3) { + rangeStart = startHour*3600 + startMin*60 + startSec; + rangeEnd = 0.0; + } else if (sscanf(paramStr, "npt = %lf - %lf", &start, &end) == 2) { + rangeStart = start; + rangeEnd = end; + } else if (sscanf(paramStr, "npt = %n%lf -", &numCharsMatched1, &start) == 1) { + if (paramStr[numCharsMatched1] == '-') { + // special case for "npt = -", which matches here: + rangeStart = 0.0; startTimeIsNow = True; + rangeEnd = -start; + } else { + rangeStart = start; + rangeEnd = 0.0; + } + } else if (sscanf(paramStr, "npt = now - %lf", &end) == 1) { + rangeStart = 0.0; startTimeIsNow = True; + rangeEnd = end; + } else if (sscanf(paramStr, "npt = now -%n", &numCharsMatched2) == 0 && numCharsMatched2 > 0) { + rangeStart = 0.0; startTimeIsNow = True; + rangeEnd = 0.0; + } else if (sscanf(paramStr, "clock = %n", &numCharsMatched3) == 0 && numCharsMatched3 > 0) { + rangeStart = rangeEnd = 0.0; + + char const* utcTimes = ¶mStr[numCharsMatched3]; + size_t len = strlen(utcTimes) + 1; + char* as = new char[len]; + char* ae = new char[len]; + int sscanfResult = sscanf(utcTimes, "%[^-]-%[^\r\n]", as, ae); + if (sscanfResult == 2) { + absStartTime = as; + absEndTime = ae; + } else if (sscanfResult == 1) { + absStartTime = as; + delete[] ae; + } else { + delete[] as; delete[] ae; + return False; + } + } else if (sscanf(paramStr, "smtpe = %n", &numCharsMatched4) == 0 && numCharsMatched4 > 0) { + // We accept "smtpe=" parameters, but currently do not interpret them. + } else { + return False; // The header is malformed + } + + return True; +} + +Boolean parseRangeHeader(char const* buf, + double& rangeStart, double& rangeEnd, + char*& absStartTime, char*& absEndTime, + Boolean& startTimeIsNow) { + // First, find "Range:" + while (1) { + if (*buf == '\0') return False; // not found + if (_strncasecmp(buf, "Range: ", 7) == 0) break; + ++buf; + } + + char const* fields = buf + 7; + while (*fields == ' ') ++fields; + return parseRangeParam(fields, rangeStart, rangeEnd, absStartTime, absEndTime, startTimeIsNow); +} + +Boolean parseScaleHeader(char const* buf, float& scale) { + // Initialize the result parameter to a default value: + scale = 1.0; + + // First, find "Scale:" + while (1) { + if (*buf == '\0') return False; // not found + if (_strncasecmp(buf, "Scale:", 6) == 0) break; + ++buf; + } + + char const* fields = buf + 6; + while (*fields == ' ') ++fields; + float sc; + if (sscanf(fields, "%f", &sc) == 1) { + scale = sc; + } else { + return False; // The header is malformed + } + + return True; +} + +// Used to implement "RTSPOptionIsSupported()": +static Boolean isSeparator(char c) { return c == ' ' || c == ',' || c == ';' || c == ':'; } + +Boolean RTSPOptionIsSupported(char const* commandName, char const* optionsResponseString) { + do { + if (commandName == NULL || optionsResponseString == NULL) break; + + unsigned const commandNameLen = strlen(commandName); + if (commandNameLen == 0) break; + + // "optionsResponseString" is assumed to be a list of command names, separated by " " and/or ",", ";", or ":" + // Scan through these, looking for "commandName". + while (1) { + // Skip over separators: + while (*optionsResponseString != '\0' && isSeparator(*optionsResponseString)) ++optionsResponseString; + if (*optionsResponseString == '\0') break; + + // At this point, "optionsResponseString" begins with a command name (with perhaps a separator afterwads). + if (strncmp(commandName, optionsResponseString, commandNameLen) == 0) { + // We have at least a partial match here. + optionsResponseString += commandNameLen; + if (*optionsResponseString == '\0' || isSeparator(*optionsResponseString)) return True; + } + + // No match. Skip over the rest of the command name: + while (*optionsResponseString != '\0' && !isSeparator(*optionsResponseString)) ++optionsResponseString; + } + } while (0); + + return False; +} + +char const* dateHeader() { + static char buf[200]; +#if !defined(_WIN32_WCE) + time_t tt = time(NULL); + strftime(buf, sizeof buf, "Date: %a, %b %d %Y %H:%M:%S GMT\r\n", gmtime(&tt)); +#else + // WinCE apparently doesn't have "time()", "strftime()", or "gmtime()", + // so generate the "Date:" header a different, WinCE-specific way. + // (Thanks to Pierre l'Hussiez for this code) + // RSF: But where is the "Date: " string? This code doesn't look quite right... + SYSTEMTIME SystemTime; + GetSystemTime(&SystemTime); + WCHAR dateFormat[] = L"ddd, MMM dd yyyy"; + WCHAR timeFormat[] = L"HH:mm:ss GMT\r\n"; + WCHAR inBuf[200]; + DWORD locale = LOCALE_NEUTRAL; + + int ret = GetDateFormat(locale, 0, &SystemTime, + (LPTSTR)dateFormat, (LPTSTR)inBuf, sizeof inBuf); + inBuf[ret - 1] = ' '; + ret = GetTimeFormat(locale, 0, &SystemTime, + (LPTSTR)timeFormat, + (LPTSTR)inBuf + ret, (sizeof inBuf) - ret); + wcstombs(buf, inBuf, wcslen(inBuf)); +#endif + return buf; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/RTSPRegisterSender.cpp b/src/big/mpp/middleware/src/live555/liveMedia/RTSPRegisterSender.cpp new file mode 100644 index 000000000..7edd5025f --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/RTSPRegisterSender.cpp @@ -0,0 +1,227 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Special objects which, when created, sends a custom RTSP "REGISTER" (or "DEREGISTER") command +// to a specified client. +// Implementation + +#include "RTSPRegisterSender.hh" + +////////// RTSPRegisterOrDeregisterSender implementation ///////// + +RTSPRegisterOrDeregisterSender +::RTSPRegisterOrDeregisterSender(UsageEnvironment& env, + char const* remoteClientNameOrAddress, portNumBits remoteClientPortNum, + Authenticator* authenticator, + int verbosityLevel, char const* applicationName) + : RTSPClient(env, NULL, verbosityLevel, applicationName, 0, -1), + fRemoteClientPortNum(remoteClientPortNum) { + // Set up a connection to the remote client. To do this, we create a fake "rtsp://" URL for it: + char const* fakeRTSPURLFmt = "rtsp://%s:%u/"; + unsigned fakeRTSPURLSize = strlen(fakeRTSPURLFmt) + strlen(remoteClientNameOrAddress) + 5/* max port num len */; + char* fakeRTSPURL = new char[fakeRTSPURLSize]; + sprintf(fakeRTSPURL, fakeRTSPURLFmt, remoteClientNameOrAddress, remoteClientPortNum); + setBaseURL(fakeRTSPURL); + delete[] fakeRTSPURL; + + if (authenticator != NULL) fCurrentAuthenticator = *authenticator; +} + +RTSPRegisterOrDeregisterSender::~RTSPRegisterOrDeregisterSender() { +} + +RTSPRegisterOrDeregisterSender::RequestRecord_REGISTER_or_DEREGISTER +::RequestRecord_REGISTER_or_DEREGISTER(unsigned cseq, char const* cmdName, + RTSPClient::responseHandler* rtspResponseHandler, + char const* rtspURLToRegisterOrDeregister, + char const* proxyURLSuffix) + : RTSPClient::RequestRecord(cseq, cmdName, rtspResponseHandler), + fRTSPURLToRegisterOrDeregister(strDup(rtspURLToRegisterOrDeregister)), + fProxyURLSuffix(strDup(proxyURLSuffix)) { +} + +RTSPRegisterOrDeregisterSender::RequestRecord_REGISTER_or_DEREGISTER +::~RequestRecord_REGISTER_or_DEREGISTER() { + delete[] fRTSPURLToRegisterOrDeregister; + delete[] fProxyURLSuffix; +} + + +////////// RTSPRegisterSender implementation ///////// + +RTSPRegisterSender* RTSPRegisterSender +::createNew(UsageEnvironment& env, + char const* remoteClientNameOrAddress, portNumBits remoteClientPortNum, char const* rtspURLToRegister, + RTSPClient::responseHandler* rtspResponseHandler, Authenticator* authenticator, + Boolean requestStreamingViaTCP, char const* proxyURLSuffix, Boolean reuseConnection, + int verbosityLevel, char const* applicationName) { + return new RTSPRegisterSender(env, remoteClientNameOrAddress, remoteClientPortNum, rtspURLToRegister, + rtspResponseHandler, authenticator, + requestStreamingViaTCP, proxyURLSuffix, reuseConnection, + verbosityLevel, applicationName); +} + +void RTSPRegisterSender::grabConnection(int& sock, struct sockaddr_storage& remoteAddress) { + sock = grabSocket(); + + remoteAddress = fServerAddress; + setPortNum(remoteAddress, htons(fRemoteClientPortNum)); +} + +RTSPRegisterSender +::RTSPRegisterSender(UsageEnvironment& env, + char const* remoteClientNameOrAddress, portNumBits remoteClientPortNum, char const* rtspURLToRegister, + RTSPClient::responseHandler* rtspResponseHandler, Authenticator* authenticator, + Boolean requestStreamingViaTCP, char const* proxyURLSuffix, Boolean reuseConnection, + int verbosityLevel, char const* applicationName) + : RTSPRegisterOrDeregisterSender(env, remoteClientNameOrAddress, remoteClientPortNum, authenticator, verbosityLevel, applicationName) { + // Send the "REGISTER" request: + (void)sendRequest(new RequestRecord_REGISTER(++fCSeq, rtspResponseHandler, + rtspURLToRegister, reuseConnection, requestStreamingViaTCP, proxyURLSuffix)); +} + +RTSPRegisterSender::~RTSPRegisterSender() { +} + +Boolean RTSPRegisterSender::setRequestFields(RequestRecord* request, + char*& cmdURL, Boolean& cmdURLWasAllocated, + char const*& protocolStr, + char*& extraHeaders, Boolean& extraHeadersWereAllocated) { + if (strcmp(request->commandName(), "REGISTER") == 0) { + RequestRecord_REGISTER* request_REGISTER = (RequestRecord_REGISTER*)request; + + setBaseURL(request_REGISTER->rtspURLToRegister()); + cmdURL = (char*)url(); + cmdURLWasAllocated = False; + + // Generate the "Transport:" header that will contain our REGISTER-specific parameters. This will be "extraHeaders". + // First, generate the "proxy_url_suffix" parameter string, if any: + char* proxyURLSuffixParameterStr; + if (request_REGISTER->proxyURLSuffix() == NULL) { + proxyURLSuffixParameterStr = strDup(""); + } else { + char const* proxyURLSuffixParameterFmt = "; proxy_url_suffix=%s"; + unsigned proxyURLSuffixParameterSize = strlen(proxyURLSuffixParameterFmt) + + strlen(request_REGISTER->proxyURLSuffix()); + proxyURLSuffixParameterStr = new char[proxyURLSuffixParameterSize]; + sprintf(proxyURLSuffixParameterStr, proxyURLSuffixParameterFmt, request_REGISTER->proxyURLSuffix()); + } + + char const* transportHeaderFmt = "Transport: %spreferred_delivery_protocol=%s%s\r\n"; + unsigned transportHeaderSize = strlen(transportHeaderFmt) + 100/*conservative*/ + strlen(proxyURLSuffixParameterStr); + char* transportHeaderStr = new char[transportHeaderSize]; + sprintf(transportHeaderStr, transportHeaderFmt, + request_REGISTER->reuseConnection() ? "reuse_connection; " : "", + request_REGISTER->requestStreamingViaTCP() ? "interleaved" : "udp", + proxyURLSuffixParameterStr); + delete[] proxyURLSuffixParameterStr; + + extraHeaders = transportHeaderStr; + extraHeadersWereAllocated = True; + + return True; + } else { + return RTSPClient::setRequestFields(request, cmdURL, cmdURLWasAllocated, protocolStr, extraHeaders, extraHeadersWereAllocated); + } +} + +RTSPRegisterSender::RequestRecord_REGISTER +::RequestRecord_REGISTER(unsigned cseq, RTSPClient::responseHandler* rtspResponseHandler, char const* rtspURLToRegister, + Boolean reuseConnection, Boolean requestStreamingViaTCP, char const* proxyURLSuffix) + : RTSPRegisterOrDeregisterSender::RequestRecord_REGISTER_or_DEREGISTER(cseq, "REGISTER", rtspResponseHandler, rtspURLToRegister, proxyURLSuffix), + fReuseConnection(reuseConnection), fRequestStreamingViaTCP(requestStreamingViaTCP) { +} + +RTSPRegisterSender::RequestRecord_REGISTER::~RequestRecord_REGISTER() { +} + + +////////// RTSPDeregisterSender implementation ///////// + +RTSPDeregisterSender* RTSPDeregisterSender +::createNew(UsageEnvironment& env, + char const* remoteClientNameOrAddress, portNumBits remoteClientPortNum, char const* rtspURLToDeregister, + RTSPClient::responseHandler* rtspResponseHandler, Authenticator* authenticator, + char const* proxyURLSuffix, int verbosityLevel, char const* applicationName) { + return new RTSPDeregisterSender(env, remoteClientNameOrAddress, remoteClientPortNum, rtspURLToDeregister, + rtspResponseHandler, authenticator, + proxyURLSuffix, verbosityLevel, applicationName); +} + +RTSPDeregisterSender +::RTSPDeregisterSender(UsageEnvironment& env, + char const* remoteClientNameOrAddress, portNumBits remoteClientPortNum, char const* rtspURLToDeregister, + RTSPClient::responseHandler* rtspResponseHandler, Authenticator* authenticator, + char const* proxyURLSuffix, + int verbosityLevel, char const* applicationName) + : RTSPRegisterOrDeregisterSender(env, remoteClientNameOrAddress, remoteClientPortNum, authenticator, verbosityLevel, applicationName) { + // Send the "DEREGISTER" request: + (void)sendRequest(new RequestRecord_DEREGISTER(++fCSeq, rtspResponseHandler, + rtspURLToDeregister, proxyURLSuffix)); +} + +RTSPDeregisterSender::~RTSPDeregisterSender() { +} + +Boolean RTSPDeregisterSender::setRequestFields(RequestRecord* request, + char*& cmdURL, Boolean& cmdURLWasAllocated, + char const*& protocolStr, + char*& extraHeaders, Boolean& extraHeadersWereAllocated) { + if (strcmp(request->commandName(), "DEREGISTER") == 0) { + RequestRecord_DEREGISTER* request_DEREGISTER = (RequestRecord_DEREGISTER*)request; + + setBaseURL(request_DEREGISTER->rtspURLToDeregister()); + cmdURL = (char*)url(); + cmdURLWasAllocated = False; + + // Generate the "Transport:" header that will contain our DEREGISTER-specific parameters. This will be "extraHeaders". + // First, generate the "proxy_url_suffix" parameter string, if any: + char* proxyURLSuffixParameterStr; + if (request_DEREGISTER->proxyURLSuffix() == NULL) { + proxyURLSuffixParameterStr = strDup(""); + } else { + char const* proxyURLSuffixParameterFmt = "proxy_url_suffix=%s"; + unsigned proxyURLSuffixParameterSize = strlen(proxyURLSuffixParameterFmt) + + strlen(request_DEREGISTER->proxyURLSuffix()); + proxyURLSuffixParameterStr = new char[proxyURLSuffixParameterSize]; + sprintf(proxyURLSuffixParameterStr, proxyURLSuffixParameterFmt, request_DEREGISTER->proxyURLSuffix()); + } + + char const* transportHeaderFmt = "Transport: %s\r\n"; + unsigned transportHeaderSize = strlen(transportHeaderFmt) + strlen(proxyURLSuffixParameterStr); + char* transportHeaderStr = new char[transportHeaderSize]; + sprintf(transportHeaderStr, transportHeaderFmt, + proxyURLSuffixParameterStr); + delete[] proxyURLSuffixParameterStr; + + extraHeaders = transportHeaderStr; + extraHeadersWereAllocated = True; + + return True; + } else { + return RTSPClient::setRequestFields(request, cmdURL, cmdURLWasAllocated, protocolStr, extraHeaders, extraHeadersWereAllocated); + } +} + +RTSPDeregisterSender::RequestRecord_DEREGISTER +::RequestRecord_DEREGISTER(unsigned cseq, RTSPClient::responseHandler* rtspResponseHandler, char const* rtspURLToDeregister, + char const* proxyURLSuffix) + : RTSPRegisterOrDeregisterSender::RequestRecord_REGISTER_or_DEREGISTER(cseq, "DEREGISTER", rtspResponseHandler, rtspURLToDeregister, proxyURLSuffix) { +} + +RTSPDeregisterSender::RequestRecord_DEREGISTER::~RequestRecord_DEREGISTER() { +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/RTSPServer.cpp b/src/big/mpp/middleware/src/live555/liveMedia/RTSPServer.cpp new file mode 100644 index 000000000..79925a1e6 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/RTSPServer.cpp @@ -0,0 +1,2035 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A RTSP server +// Implementation + +#include "RTSPServer.hh" +#include "RTSPCommon.hh" +#include "RTSPRegisterSender.hh" +#include "Base64.hh" +#include + +////////// RTSPServer implementation ////////// + +RTSPServer* +RTSPServer::createNew(UsageEnvironment& env, Port ourPort, + UserAuthenticationDatabase* authDatabase, + unsigned reclamationSeconds) { + int ourSocketIPv4 = setUpOurSocket(env, ourPort, AF_INET); + int ourSocketIPv6 = setUpOurSocket(env, ourPort, AF_INET6); + if (ourSocketIPv4 < 0 && ourSocketIPv6 < 0) return NULL; + + return new RTSPServer(env, ourSocketIPv4, ourSocketIPv6, ourPort, authDatabase, reclamationSeconds); +} + +Boolean RTSPServer::lookupByName(UsageEnvironment& env, + char const* name, + RTSPServer*& resultServer) { + resultServer = NULL; // unless we succeed + + Medium* medium; + if (!Medium::lookupByName(env, name, medium)) return False; + + if (!medium->isRTSPServer()) { + env.setResultMsg(name, " is not a RTSP server"); + return False; + } + + resultServer = (RTSPServer*)medium; + return True; +} + +char* RTSPServer +::rtspURL(ServerMediaSession const* serverMediaSession, + int clientSocket, Boolean useIPv6) const { + char* urlPrefix = rtspURLPrefix(clientSocket, useIPv6); + char const* sessionName = serverMediaSession->streamName(); + + char* resultURL = new char[strlen(urlPrefix) + strlen(sessionName) + 1]; + sprintf(resultURL, "%s%s", urlPrefix, sessionName); + + delete[] urlPrefix; + return resultURL; +} + +char* RTSPServer::rtspURLPrefix(int clientSocket, Boolean useIPv6) const { + struct sockaddr_storage ourAddress; + + if (clientSocket < 0) { + // Use our default IP address in the URL: + if (!useIPv6) { // IPv4 + ourAddress.ss_family = AF_INET; + ((sockaddr_in&)ourAddress).sin_addr.s_addr = ourIPv4Address(envir()); + } else { + ourAddress.ss_family = AF_INET6; + ipv6AddressBits const& ourAddr6 = ourIPv6Address(envir()); + for (unsigned i = 0; i < 16; ++i) ((sockaddr_in6&)ourAddress).sin6_addr.s6_addr[i] = ourAddr6[i]; + } + } else { + SOCKLEN_T namelen = sizeof ourAddress; + + getsockname(clientSocket, (struct sockaddr*)&ourAddress, (socklen_t *)&namelen); + } + + char urlBuffer[100]; // more than big enough for "rtsp://:/" + + char const* addressPrefixInURL = ourAddress.ss_family == AF_INET6 ? "[" : ""; + char const* addressSuffixInURL = ourAddress.ss_family == AF_INET6 ? "]" : ""; + + portNumBits defaultPortNum = fOurConnectionsUseTLS ? 322 : 554; + portNumBits portNumHostOrder = ntohs(fServerPort.num()); + if (portNumHostOrder == defaultPortNum) { + sprintf(urlBuffer, "rtsp%s://%s%s%s/", + fOurConnectionsUseTLS ? "s" : "", + addressPrefixInURL, AddressString(ourAddress).val(), addressSuffixInURL); + } else { + sprintf(urlBuffer, "rtsp%s://%s%s%s:%hu/", + fOurConnectionsUseTLS ? "s" : "", + addressPrefixInURL, AddressString(ourAddress).val(), addressSuffixInURL, portNumHostOrder); + } + + return strDup(urlBuffer); +} + +UserAuthenticationDatabase* RTSPServer::setAuthenticationDatabase(UserAuthenticationDatabase* newDB) { + UserAuthenticationDatabase* oldDB = fAuthDB; + fAuthDB = newDB; + + return oldDB; +} + +Boolean RTSPServer::setUpTunnelingOverHTTP(Port httpPort) { + if (fWeServeSRTP) return False; + // If we've already set up streaming using SRTP, then streaming over HTTPS would make no + // sense (as SRTP would add extra overhead for no benefit). + + fHTTPServerSocketIPv4 = setUpOurSocket(envir(), httpPort, AF_INET); + fHTTPServerSocketIPv6 = setUpOurSocket(envir(), httpPort, AF_INET6); + if (fHTTPServerSocketIPv4 >= 0 || fHTTPServerSocketIPv6 >= 0) { + fHTTPServerPort = httpPort; + envir().taskScheduler().turnOnBackgroundReadHandling(fHTTPServerSocketIPv4, + incomingConnectionHandlerHTTPIPv4, this); + envir().taskScheduler().turnOnBackgroundReadHandling(fHTTPServerSocketIPv6, + incomingConnectionHandlerHTTPIPv6, this); + return True; + } + + return False; +} + +portNumBits RTSPServer::httpServerPortNum() const { + return ntohs(fHTTPServerPort.num()); +} + +void RTSPServer +::setTLSState(char const* certFileName, char const* privKeyFileName, + Boolean weServeSRTP, Boolean weEncryptSRTP) { + setTLSFileNames(certFileName, privKeyFileName); + fOurConnectionsUseTLS = True; + fWeServeSRTP = weServeSRTP; + fWeEncryptSRTP = weEncryptSRTP; + + if (fWeServeSRTP) disableStreamingRTPOverTCP(); + // If you want to stream RTP-over-TCP using a secure TCP connection, then stream over TLS, + // but without SRTP (as SRTP would add extra overhead for no benefit). +} + +char const* RTSPServer::allowedCommandNames() { + return "OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, GET_PARAMETER, SET_PARAMETER"; +} + +UserAuthenticationDatabase* RTSPServer::getAuthenticationDatabaseForCommand(char const* /*cmdName*/) { + // default implementation + return fAuthDB; +} + +Boolean RTSPServer::specialClientAccessCheck(int /*clientSocket*/, + struct sockaddr_storage const& /*clientAddr*/, + char const* /*urlSuffix*/) { + // default implementation + return True; +} + +Boolean RTSPServer::specialClientUserAccessCheck(int /*clientSocket*/, + struct sockaddr_storage const& /*clientAddr*/, + char const* /*urlSuffix*/, char const * /*username*/) { + // default implementation; no further access restrictions: + return True; +} + +void RTSPServer +::specialHandlingOfAuthenticationFailure(int /*clientSocket*/, + struct sockaddr_storage const& /*clientAddr*/, + char const* /*urlSuffix*/) { + // default implementation: do nothing +} + +RTSPServer::RTSPServer(UsageEnvironment& env, + int ourSocketIPv4, int ourSocketIPv6, Port ourPort, + UserAuthenticationDatabase* authDatabase, + unsigned reclamationSeconds) + : GenericMediaServer(env, ourSocketIPv4, ourSocketIPv6, ourPort, reclamationSeconds), + fHTTPServerSocketIPv4(-1), fHTTPServerSocketIPv6(-1), fHTTPServerPort(0), + fClientConnectionsForHTTPTunneling(NULL), // will get created if needed + fTCPStreamingDatabase(HashTable::create(ONE_WORD_HASH_KEYS)), + fPendingRegisterOrDeregisterRequests(HashTable::create(ONE_WORD_HASH_KEYS)), + fRegisterOrDeregisterRequestCounter(0), fAuthDB(authDatabase), + fAllowStreamingRTPOverTCP(True), + fOurConnectionsUseTLS(False), fWeServeSRTP(False) { +} + +// A data structure that is used to implement "fTCPStreamingDatabase" +// (and the "noteTCPStreamingOnSocket()" and "stopTCPStreamingOnSocket()" member functions): +class streamingOverTCPRecord { +public: + streamingOverTCPRecord(u_int32_t sessionId, unsigned trackNum, streamingOverTCPRecord* next) + : fNext(next), fSessionId(sessionId), fTrackNum(trackNum) { + } + virtual ~streamingOverTCPRecord() { + delete fNext; + } + + streamingOverTCPRecord* fNext; + u_int32_t fSessionId; + unsigned fTrackNum; +}; + +RTSPServer::~RTSPServer() { + // Turn off background HTTP read handling (if any): + envir().taskScheduler().turnOffBackgroundReadHandling(fHTTPServerSocketIPv4); + ::closeSocket(fHTTPServerSocketIPv4); + envir().taskScheduler().turnOffBackgroundReadHandling(fHTTPServerSocketIPv6); + ::closeSocket(fHTTPServerSocketIPv6); + + cleanup(); // Removes all "ClientSession" and "ClientConnection" objects, and their tables. + delete fClientConnectionsForHTTPTunneling; + + // Delete any pending REGISTER requests: + RTSPRegisterOrDeregisterSender* r; + while ((r = (RTSPRegisterOrDeregisterSender*)fPendingRegisterOrDeregisterRequests->getFirst()) != NULL) { + delete r; + } + delete fPendingRegisterOrDeregisterRequests; + + // Empty out and close "fTCPStreamingDatabase": + streamingOverTCPRecord* sotcp; + while ((sotcp = (streamingOverTCPRecord*)fTCPStreamingDatabase->getFirst()) != NULL) { + delete sotcp; + } + delete fTCPStreamingDatabase; +} + +Boolean RTSPServer::isRTSPServer() const { + return True; +} + +void RTSPServer::addServerMediaSession(ServerMediaSession* serverMediaSession) { + GenericMediaServer::addServerMediaSession(serverMediaSession); + if (serverMediaSession != NULL) { + serverMediaSession->streamingUsesSRTP = fWeServeSRTP; + serverMediaSession->streamingIsEncrypted = fWeEncryptSRTP; + } +} + +void RTSPServer::incomingConnectionHandlerHTTPIPv4(void* instance, int /*mask*/) { + RTSPServer* server = (RTSPServer*)instance; + server->incomingConnectionHandlerHTTPIPv4(); +} +void RTSPServer::incomingConnectionHandlerHTTPIPv4() { + incomingConnectionHandlerOnSocket(fHTTPServerSocketIPv4); +} +void RTSPServer::incomingConnectionHandlerHTTPIPv6(void* instance, int /*mask*/) { + RTSPServer* server = (RTSPServer*)instance; + server->incomingConnectionHandlerHTTPIPv6(); +} +void RTSPServer::incomingConnectionHandlerHTTPIPv6() { + incomingConnectionHandlerOnSocket(fHTTPServerSocketIPv6); +} + +void RTSPServer +::noteTCPStreamingOnSocket(int socketNum, RTSPClientSession* clientSession, unsigned trackNum) { + streamingOverTCPRecord* sotcpCur + = (streamingOverTCPRecord*)fTCPStreamingDatabase->Lookup((char const*)socketNum); + streamingOverTCPRecord* sotcpNew + = new streamingOverTCPRecord(clientSession->fOurSessionId, trackNum, sotcpCur); + fTCPStreamingDatabase->Add((char const*)socketNum, sotcpNew); +} + +void RTSPServer +::unnoteTCPStreamingOnSocket(int socketNum, RTSPClientSession* clientSession, unsigned trackNum) { + if (socketNum < 0) return; + streamingOverTCPRecord* sotcpHead + = (streamingOverTCPRecord*)fTCPStreamingDatabase->Lookup((char const*)socketNum); + if (sotcpHead == NULL) return; + + // Look for a record of the (session,track); remove it if found: + streamingOverTCPRecord* sotcp = sotcpHead; + streamingOverTCPRecord* sotcpPrev = sotcpHead; + do { + if (sotcp->fSessionId == clientSession->fOurSessionId && sotcp->fTrackNum == trackNum) break; + sotcpPrev = sotcp; + sotcp = sotcp->fNext; + } while (sotcp != NULL); + if (sotcp == NULL) return; // not found + + if (sotcp == sotcpHead) { + // We found it at the head of the list. Remove it and reinsert the tail into the hash table: + sotcpHead = sotcp->fNext; + sotcp->fNext = NULL; + delete sotcp; + + if (sotcpHead == NULL) { + // There were no more entries on the list. Remove the original entry from the hash table: + fTCPStreamingDatabase->Remove((char const*)socketNum); + } else { + // Add the rest of the list into the hash table (replacing the original): + fTCPStreamingDatabase->Add((char const*)socketNum, sotcpHead); + } + } else { + // We found it on the list, but not at the head. Unlink it: + sotcpPrev->fNext = sotcp->fNext; + sotcp->fNext = NULL; + delete sotcp; + } +} + +void RTSPServer::stopTCPStreamingOnSocket(int socketNum) { + // Close any stream that is streaming over "socketNum" (using RTP/RTCP-over-TCP streaming): + streamingOverTCPRecord* sotcp + = (streamingOverTCPRecord*)fTCPStreamingDatabase->Lookup((char const*)socketNum); + if (sotcp != NULL) { + do { + RTSPClientSession* clientSession + = (RTSPServer::RTSPClientSession*)lookupClientSession(sotcp->fSessionId); + if (clientSession != NULL) { + clientSession->deleteStreamByTrack(sotcp->fTrackNum); + } + + streamingOverTCPRecord* sotcpNext = sotcp->fNext; + sotcp->fNext = NULL; + delete sotcp; + sotcp = sotcpNext; + } while (sotcp != NULL); + fTCPStreamingDatabase->Remove((char const*)socketNum); + } +} + + +////////// RTSPServer::RTSPClientConnection implementation ////////// + +RTSPServer::RTSPClientConnection +::RTSPClientConnection(RTSPServer& ourServer, + int clientSocket, struct sockaddr_storage const& clientAddr, + Boolean useTLS) + : GenericMediaServer::ClientConnection(ourServer, clientSocket, clientAddr, useTLS), + fOurRTSPServer(ourServer), fClientInputSocket(fOurSocket), fClientOutputSocket(fOurSocket), + fPOSTSocketTLS(envir()), fAddressFamily(clientAddr.ss_family), + fIsActive(True), fRecursionCount(0), fOurSessionCookie(NULL), fScheduledDelayedTask(0) { + resetRequestBuffer(); +} + +RTSPServer::RTSPClientConnection::~RTSPClientConnection() { + if (fOurSessionCookie != NULL) { + // We were being used for RTSP-over-HTTP tunneling. Also remove ourselves from the 'session cookie' hash table before we go: + fOurRTSPServer.fClientConnectionsForHTTPTunneling->Remove(fOurSessionCookie); + delete[] fOurSessionCookie; + } + + closeSocketsRTSP(); +} + +// Handler routines for specific RTSP commands: + +void RTSPServer::RTSPClientConnection::handleCmd_OPTIONS() { + snprintf((char*)fResponseBuffer, sizeof fResponseBuffer, + "RTSP/1.0 200 OK\r\nCSeq: %s\r\n%sPublic: %s\r\n\r\n", + fCurrentCSeq, dateHeader(), fOurRTSPServer.allowedCommandNames()); +} + +void RTSPServer::RTSPClientConnection +::handleCmd_GET_PARAMETER(char const* /*fullRequestStr*/) { + // By default, we implement "GET_PARAMETER" (on the entire server) just as a 'no op', and send back a dummy response. + // (If you want to handle this type of "GET_PARAMETER" differently, you can do so by defining a subclass of "RTSPServer" + // and "RTSPServer::RTSPClientConnection", and then reimplement this virtual function in your subclass.) + setRTSPResponse("200 OK", LIVEMEDIA_LIBRARY_VERSION_STRING); +} + +void RTSPServer::RTSPClientConnection +::handleCmd_SET_PARAMETER(char const* /*fullRequestStr*/) { + // By default, we implement "SET_PARAMETER" (on the entire server) just as a 'no op', and send back an empty response. + // (If you want to handle this type of "SET_PARAMETER" differently, you can do so by defining a subclass of "RTSPServer" + // and "RTSPServer::RTSPClientConnection", and then reimplement this virtual function in your subclass.) + setRTSPResponse("200 OK"); +} + +void RTSPServer::RTSPClientConnection +::handleCmd_DESCRIBE(char const* urlPreSuffix, char const* urlSuffix, char const* fullRequestStr) { + char urlTotalSuffix[2*RTSP_PARAM_STRING_MAX]; + // enough space for urlPreSuffix/urlSuffix'\0' + urlTotalSuffix[0] = '\0'; + if (urlPreSuffix[0] != '\0') { + strcat(urlTotalSuffix, urlPreSuffix); + strcat(urlTotalSuffix, "/"); + } + strcat(urlTotalSuffix, urlSuffix); + + if (!authenticationOK("DESCRIBE", urlTotalSuffix, fullRequestStr)) return; + + // We should really check that the request contains an "Accept:" ##### + // for "application/sdp", because that's what we're sending back ##### + + // Begin by looking up the "ServerMediaSession" object for the specified "urlTotalSuffix": + fOurServer.lookupServerMediaSession(urlTotalSuffix, DESCRIBELookupCompletionFunction, this); +} + +void RTSPServer::RTSPClientConnection +::DESCRIBELookupCompletionFunction(void* clientData, ServerMediaSession* sessionLookedUp) { + RTSPServer::RTSPClientConnection* connection = (RTSPServer::RTSPClientConnection*)clientData; + connection->handleCmd_DESCRIBE_afterLookup(sessionLookedUp); +} + +void RTSPServer::RTSPClientConnection +::handleCmd_DESCRIBE_afterLookup(ServerMediaSession* session) { + char* sdpDescription = NULL; + char* rtspURL = NULL; + do { + if (session == NULL) { + handleCmd_notFound(); + break; + } + + // Increment the "ServerMediaSession" object's reference count, in case someone removes it + // while we're using it: + session->incrementReferenceCount(); + + // Then, assemble a SDP description for this session: + sdpDescription = session->generateSDPDescription(fAddressFamily); + if (sdpDescription == NULL) { + // This usually means that a file name that was specified for a + // "ServerMediaSubsession" does not exist. + setRTSPResponse("404 File Not Found, Or In Incorrect Format"); + break; + } + unsigned sdpDescriptionSize = strlen(sdpDescription); + + // Also, generate our RTSP URL, for the "Content-Base:" header + // (which is necessary to ensure that the correct URL gets used in subsequent "SETUP" requests). + rtspURL = fOurRTSPServer.rtspURL(session, fClientInputSocket); + + snprintf((char*)fResponseBuffer, sizeof fResponseBuffer, + "RTSP/1.0 200 OK\r\nCSeq: %s\r\n" + "%s" + "Content-Base: %s/\r\n" + "Content-Type: application/sdp\r\n" + "Content-Length: %d\r\n\r\n" + "%s", + fCurrentCSeq, + dateHeader(), + rtspURL, + sdpDescriptionSize, + sdpDescription); + } while (0); + + if (session != NULL) { + // Decrement its reference count, now that we're done using it: + session->decrementReferenceCount(); + if (session->referenceCount() == 0 && session->deleteWhenUnreferenced()) { + fOurServer.removeServerMediaSession(session); + } + } + + delete[] sdpDescription; + delete[] rtspURL; +} + +static void lookForHeader(char const* headerName, char const* source, unsigned sourceLen, char* resultStr, unsigned resultMaxSize) { + resultStr[0] = '\0'; // by default, return an empty string + unsigned headerNameLen = strlen(headerName); + for (int i = 0; i < (int)(sourceLen-headerNameLen); ++i) { + if (strncmp(&source[i], headerName, headerNameLen) == 0 && source[i+headerNameLen] == ':') { + // We found the header. Skip over any whitespace, then copy the rest of the line to "resultStr": + for (i += headerNameLen+1; i < (int)sourceLen && (source[i] == ' ' || source[i] == '\t'); ++i) {} + for (unsigned j = i; j < sourceLen; ++j) { + if (source[j] == '\r' || source[j] == '\n') { + // We've found the end of the line. Copy it to the result (if it will fit): + if (j-i+1 > resultMaxSize) return; // it wouldn't fit + char const* resultSource = &source[i]; + char const* resultSourceEnd = &source[j]; + while (resultSource < resultSourceEnd) *resultStr++ = *resultSource++; + *resultStr = '\0'; + return; + } + } + } + } +} + +void RTSPServer::RTSPClientConnection::handleCmd_bad() { + // Don't do anything with "fCurrentCSeq", because it might be nonsense + snprintf((char*)fResponseBuffer, sizeof fResponseBuffer, + "RTSP/1.0 400 Bad Request\r\n%sAllow: %s\r\n\r\n", + dateHeader(), fOurRTSPServer.allowedCommandNames()); +} + +void RTSPServer::RTSPClientConnection::handleCmd_notSupported() { + snprintf((char*)fResponseBuffer, sizeof fResponseBuffer, + "RTSP/1.0 405 Method Not Allowed\r\nCSeq: %s\r\n%sAllow: %s\r\n\r\n", + fCurrentCSeq, dateHeader(), fOurRTSPServer.allowedCommandNames()); +} + +void RTSPServer::RTSPClientConnection::handleCmd_redirect(char const* urlSuffix) { + snprintf((char*)fResponseBuffer, sizeof fResponseBuffer, + "RTSP/1.0 301 Moved Permanently\r\n" + "CSeq: %s\r\n" + "%s" + "Location: %s%s\r\n\r\n", + fCurrentCSeq, + dateHeader(), + fOurRTSPServer.rtspURLPrefix(fClientInputSocket), urlSuffix); +} + +void RTSPServer::RTSPClientConnection::handleCmd_notFound() { + setRTSPResponse("404 Stream Not Found"); +} + +void RTSPServer::RTSPClientConnection::handleCmd_sessionNotFound() { + setRTSPResponse("454 Session Not Found"); +} + +void RTSPServer::RTSPClientConnection::handleCmd_unsupportedTransport() { + setRTSPResponse("461 Unsupported Transport"); +} + +Boolean RTSPServer::RTSPClientConnection::parseHTTPRequestString(char* resultCmdName, unsigned resultCmdNameMaxSize, + char* urlSuffix, unsigned urlSuffixMaxSize, + char* sessionCookie, unsigned sessionCookieMaxSize, + char* acceptStr, unsigned acceptStrMaxSize) { + // Check for the limited HTTP requests that we expect for specifying RTSP-over-HTTP tunneling. + // This parser is currently rather dumb; it should be made smarter ##### + char const* reqStr = (char const*)fRequestBuffer; + unsigned const reqStrSize = fRequestBytesAlreadySeen; + + // Read everything up to the first space as the command name: + Boolean parseSucceeded = False; + unsigned i; + for (i = 0; i < resultCmdNameMaxSize-1 && i < reqStrSize; ++i) { + char c = reqStr[i]; + if (c == ' ' || c == '\t') { + parseSucceeded = True; + break; + } + + resultCmdName[i] = c; + } + resultCmdName[i] = '\0'; + if (!parseSucceeded) return False; + + // Look for the string "HTTP/", before the first \r or \n: + parseSucceeded = False; + for (; i < reqStrSize-5 && reqStr[i] != '\r' && reqStr[i] != '\n'; ++i) { + if (reqStr[i] == 'H' && reqStr[i+1] == 'T' && reqStr[i+2]== 'T' && reqStr[i+3]== 'P' && reqStr[i+4]== '/') { + i += 5; // to advance past the "HTTP/" + parseSucceeded = True; + break; + } + } + if (!parseSucceeded) return False; + + // Get the 'URL suffix' that occurred before this: + unsigned k = i-6; + while (k > 0 && reqStr[k] == ' ') --k; // back up over white space + unsigned j = k; + while (j > 0 && reqStr[j] != ' ' && reqStr[j] != '/') --j; + // The URL suffix is in position (j,k]: + if (k - j + 1 > urlSuffixMaxSize) return False; // there's no room> + unsigned n = 0; + while (++j <= k) urlSuffix[n++] = reqStr[j]; + urlSuffix[n] = '\0'; + + // Look for various headers that we're interested in: + lookForHeader("x-sessioncookie", &reqStr[i], reqStrSize-i, sessionCookie, sessionCookieMaxSize); + lookForHeader("Accept", &reqStr[i], reqStrSize-i, acceptStr, acceptStrMaxSize); + + return True; +} + +void RTSPServer::RTSPClientConnection::handleHTTPCmd_notSupported() { + snprintf((char*)fResponseBuffer, sizeof fResponseBuffer, + "HTTP/1.0 405 Method Not Allowed\r\n%s\r\n\r\n", + dateHeader()); +} + +void RTSPServer::RTSPClientConnection::handleHTTPCmd_notFound() { + snprintf((char*)fResponseBuffer, sizeof fResponseBuffer, + "HTTP/1.0 404 Not Found\r\n%s\r\n\r\n", + dateHeader()); +} + +void RTSPServer::RTSPClientConnection::handleHTTPCmd_OPTIONS() { +#ifdef DEBUG + fprintf(stderr, "Handled HTTP \"OPTIONS\" request\n"); +#endif + // Construct a response to the "OPTIONS" command that notes that our special headers (for RTSP-over-HTTP tunneling) are allowed: + snprintf((char*)fResponseBuffer, sizeof fResponseBuffer, + "HTTP/1.0 200 OK\r\n" + "%s" + "Access-Control-Allow-Origin: *\r\n" + "Access-Control-Allow-Methods: POST, GET, OPTIONS\r\n" + "Access-Control-Allow-Headers: x-sessioncookie, Pragma, Cache-Control\r\n" + "Access-Control-Max-Age: 1728000\r\n" + "\r\n", + dateHeader()); +} + +void RTSPServer::RTSPClientConnection::handleHTTPCmd_TunnelingGET(char const* sessionCookie) { + // Record ourself as having this 'session cookie', so that a subsequent HTTP "POST" command (with the same 'session cookie') + // can find us: + if (fOurRTSPServer.fClientConnectionsForHTTPTunneling == NULL) { + fOurRTSPServer.fClientConnectionsForHTTPTunneling = HashTable::create(STRING_HASH_KEYS); + } + delete[] fOurSessionCookie; fOurSessionCookie = strDup(sessionCookie); + fOurRTSPServer.fClientConnectionsForHTTPTunneling->Add(sessionCookie, (void*)this); +#ifdef DEBUG + fprintf(stderr, "Handled HTTP \"GET\" request (client output socket: %d)\n", fClientOutputSocket); +#endif + + // Construct our response: + snprintf((char*)fResponseBuffer, sizeof fResponseBuffer, + "HTTP/1.0 200 OK\r\n" + "%s" + "Cache-Control: no-cache\r\n" + "Pragma: no-cache\r\n" + "Content-Type: application/x-rtsp-tunnelled\r\n" + "\r\n", + dateHeader()); +} + +Boolean RTSPServer::RTSPClientConnection +::handleHTTPCmd_TunnelingPOST(char const* sessionCookie, unsigned char const* extraData, unsigned extraDataSize) { + // Use the "sessionCookie" string to look up the separate "RTSPClientConnection" object that should have been used to handle + // an earlier HTTP "GET" request: + if (fOurRTSPServer.fClientConnectionsForHTTPTunneling == NULL) { + fOurRTSPServer.fClientConnectionsForHTTPTunneling = HashTable::create(STRING_HASH_KEYS); + } + RTSPServer::RTSPClientConnection* prevClientConnection + = (RTSPServer::RTSPClientConnection*)(fOurRTSPServer.fClientConnectionsForHTTPTunneling->Lookup(sessionCookie)); + if (prevClientConnection == NULL || prevClientConnection == this) { + // Either there was no previous HTTP "GET" request, or it was on the same connection; treat this "POST" request as bad: + handleHTTPCmd_notSupported(); + fIsActive = False; // triggers deletion of ourself + return False; + } +#ifdef DEBUG + fprintf(stderr, "Handled HTTP \"POST\" request (client input socket: %d)\n", fClientInputSocket); +#endif + + // Change the previous "RTSPClientSession" object's input socket to ours. It will be used for subsequent requests: + prevClientConnection->changeClientInputSocket(fClientInputSocket, fInputTLS, + extraData, extraDataSize); + fClientInputSocket = fClientOutputSocket = -1; // so the socket doesn't get closed when we get deleted + fInputTLS->nullify(); // so that our destructor doesn't reset the copied TLS state + + return True; +} + +void RTSPServer::RTSPClientConnection::handleHTTPCmd_StreamingGET(char const* /*urlSuffix*/, char const* /*fullRequestStr*/) { + // By default, we don't support requests to access streams via HTTP: + handleHTTPCmd_notSupported(); +} + +void RTSPServer::RTSPClientConnection::resetRequestBuffer() { + ClientConnection::resetRequestBuffer(); + + fLastCRLF = &fRequestBuffer[-3]; // hack: Ensures that we don't think we have end-of-msg if the data starts with + fBase64RemainderCount = 0; +} + +void RTSPServer::RTSPClientConnection::closeSocketsRTSP() { + // First, tell our server to stop any streaming that it might be doing over our output socket: + fOurRTSPServer.stopTCPStreamingOnSocket(fClientOutputSocket); + + // Turn off background handling on our input socket (and output socket, if different); then close it (or them): + if (fClientOutputSocket != fClientInputSocket) { + envir().taskScheduler().disableBackgroundHandling(fClientOutputSocket); + ::closeSocket(fClientOutputSocket); + } + fClientOutputSocket = -1; + + closeSockets(); // closes fClientInputSocket +} + +void RTSPServer::RTSPClientConnection::handleAlternativeRequestByte(void* instance, u_int8_t requestByte) { + RTSPClientConnection* connection = (RTSPClientConnection*)instance; + connection->handleAlternativeRequestByte1(requestByte); +} + +void RTSPServer::RTSPClientConnection::handleAlternativeRequestByte1(u_int8_t requestByte) { + if (requestByte == 0xFF) { + // Hack: The new handler of the input TCP socket encountered an error reading it. Indicate this: + handleRequestBytes(-1); + } else if (requestByte == 0xFE) { + // Another hack: The new handler of the input TCP socket no longer needs it, so take back control of it: + envir().taskScheduler().setBackgroundHandling(fClientInputSocket, SOCKET_READABLE|SOCKET_EXCEPTION, + incomingRequestHandler, this); + } else { + // Normal case: Add this character to our buffer; then try to handle the data that we have buffered so far: + if (fRequestBufferBytesLeft == 0 || fRequestBytesAlreadySeen >= REQUEST_BUFFER_SIZE) return; + fRequestBuffer[fRequestBytesAlreadySeen] = requestByte; + handleRequestBytes(1); + } +} + +void RTSPServer::RTSPClientConnection::handleRequestBytes(int newBytesRead) { + int numBytesRemaining = 0; + ++fRecursionCount; + + do { + RTSPServer::RTSPClientSession* clientSession = NULL; + + if (newBytesRead < 0 || (unsigned)newBytesRead >= fRequestBufferBytesLeft) { + // Either the client socket has died, or the request was too big for us. + // Terminate this connection: +#ifdef DEBUG + fprintf(stderr, "RTSPClientConnection[%p]::handleRequestBytes() read %d new bytes (of %d); terminating connection!\n", this, newBytesRead, fRequestBufferBytesLeft); +#endif + fIsActive = False; + break; + } + + Boolean endOfMsg = False; + unsigned char* ptr = &fRequestBuffer[fRequestBytesAlreadySeen]; +#ifdef DEBUG + ptr[newBytesRead] = '\0'; + fprintf(stderr, "RTSPClientConnection[%p]::handleRequestBytes() %s %d new bytes:%s\n", + this, numBytesRemaining > 0 ? "processing" : "read", newBytesRead, ptr); +#endif + + if (fClientOutputSocket != fClientInputSocket && numBytesRemaining == 0) { + // We're doing RTSP-over-HTTP tunneling, and input commands are assumed to have been Base64-encoded. + // We therefore Base64-decode as much of this new data as we can (i.e., up to a multiple of 4 bytes). + + // But first, we remove any whitespace that may be in the input data: + unsigned toIndex = 0; + for (int fromIndex = 0; fromIndex < newBytesRead; ++fromIndex) { + char c = ptr[fromIndex]; + if (!(c == ' ' || c == '\t' || c == '\r' || c == '\n')) { // not 'whitespace': space,tab,CR,NL + ptr[toIndex++] = c; + } + } + newBytesRead = toIndex; + + unsigned numBytesToDecode = fBase64RemainderCount + newBytesRead; + unsigned newBase64RemainderCount = numBytesToDecode%4; + numBytesToDecode -= newBase64RemainderCount; + if (numBytesToDecode > 0) { + ptr[newBytesRead] = '\0'; + unsigned decodedSize; + unsigned char* decodedBytes = base64Decode((char const*)(ptr-fBase64RemainderCount), numBytesToDecode, decodedSize); +#ifdef DEBUG + fprintf(stderr, "Base64-decoded %d input bytes into %d new bytes:", numBytesToDecode, decodedSize); + for (unsigned k = 0; k < decodedSize; ++k) fprintf(stderr, "%c", decodedBytes[k]); + fprintf(stderr, "\n"); +#endif + + // Copy the new decoded bytes in place of the old ones (we can do this because there are fewer decoded bytes than original): + unsigned char* to = ptr-fBase64RemainderCount; + for (unsigned i = 0; i < decodedSize; ++i) *to++ = decodedBytes[i]; + + // Then copy any remaining (undecoded) bytes to the end: + for (unsigned j = 0; j < newBase64RemainderCount; ++j) *to++ = (ptr-fBase64RemainderCount+numBytesToDecode)[j]; + + newBytesRead = decodedSize - fBase64RemainderCount + newBase64RemainderCount; + // adjust to allow for the size of the new decoded data (+ remainder) + delete[] decodedBytes; + } + fBase64RemainderCount = newBase64RemainderCount; + } + + unsigned char* tmpPtr = fLastCRLF + 2; + if (fBase64RemainderCount == 0) { // no more Base-64 bytes remain to be read/decoded + // Look for the end of the message: + if (tmpPtr < fRequestBuffer) tmpPtr = fRequestBuffer; + while (tmpPtr < &ptr[newBytesRead-1]) { + if (*tmpPtr == '\r' && *(tmpPtr+1) == '\n') { + if (tmpPtr - fLastCRLF == 2) { // This is it: + endOfMsg = True; + break; + } + fLastCRLF = tmpPtr; + } + ++tmpPtr; + } + } + + fRequestBufferBytesLeft -= newBytesRead; + fRequestBytesAlreadySeen += newBytesRead; + + if (!endOfMsg) break; // subsequent reads will be needed to complete the request + + // Parse the request string into command name and 'CSeq', then handle the command: + fRequestBuffer[fRequestBytesAlreadySeen] = '\0'; + char cmdName[RTSP_PARAM_STRING_MAX]; + char urlPreSuffix[RTSP_PARAM_STRING_MAX]; + char urlSuffix[RTSP_PARAM_STRING_MAX]; + char cseq[RTSP_PARAM_STRING_MAX]; + char sessionIdStr[RTSP_PARAM_STRING_MAX]; + unsigned contentLength = 0; + Boolean urlIsRTSPS; + Boolean playAfterSetup = False; + fLastCRLF[2] = '\0'; // temporarily, for parsing + Boolean parseSucceeded = parseRTSPRequestString((char*)fRequestBuffer, fLastCRLF+2 - fRequestBuffer, + cmdName, sizeof cmdName, + urlPreSuffix, sizeof urlPreSuffix, + urlSuffix, sizeof urlSuffix, + cseq, sizeof cseq, + sessionIdStr, sizeof sessionIdStr, + contentLength, urlIsRTSPS); + fLastCRLF[2] = '\r'; // restore its value + // Check first for a bogus "Content-Length" value that would cause a pointer wraparound: + if (tmpPtr + 2 + contentLength < tmpPtr + 2) { +#ifdef DEBUG + fprintf(stderr, "parseRTSPRequestString() returned a bogus \"Content-Length:\" value: 0x%x (%d)\n", contentLength, (int)contentLength); +#endif + contentLength = 0; + parseSucceeded = False; + } + if (parseSucceeded) { +#ifdef DEBUG + fprintf(stderr, "parseRTSPRequestString() succeeded, returning cmdName \"%s\", urlPreSuffix \"%s\", urlSuffix \"%s\", CSeq \"%s\", Content-Length %u, with %d bytes following the message.\n", cmdName, urlPreSuffix, urlSuffix, cseq, contentLength, ptr + newBytesRead - (tmpPtr + 2)); +#endif + // If there was a "Content-Length:" header, then make sure we've received all of the data that it specified: + if (ptr + newBytesRead < tmpPtr + 2 + contentLength) break; // we still need more data; subsequent reads will give it to us + + // If the request included a "Session:" id, and it refers to a client session that's + // current ongoing, then use this command to indicate 'liveness' on that client session: + Boolean const requestIncludedSessionId = sessionIdStr[0] != '\0'; + if (requestIncludedSessionId) { + clientSession + = (RTSPServer::RTSPClientSession*)(fOurRTSPServer.lookupClientSession(sessionIdStr)); + if (clientSession != NULL) clientSession->noteLiveness(); + } + + // We now have a complete RTSP request. + // Handle the specified command (beginning with commands that are session-independent): + fCurrentCSeq = cseq; + + // If the request specified the wrong type of URL + // (i.e., "rtsps" instead of "rtsp", or vice versa), then send back a 'redirect': + if (urlIsRTSPS != fOurRTSPServer.fOurConnectionsUseTLS) { +#ifdef DEBUG + fprintf(stderr, "Calling handleCmd_redirect()\n"); +#endif + handleCmd_redirect(urlSuffix); + } else if (strcmp(cmdName, "OPTIONS") == 0) { + // If the "OPTIONS" command included a "Session:" id for a session that doesn't exist, + // then treat this as an error: + if (requestIncludedSessionId && clientSession == NULL) { +#ifdef DEBUG + fprintf(stderr, "Calling handleCmd_sessionNotFound() (case 1)\n"); +#endif + handleCmd_sessionNotFound(); + } else { + // Normal case: + handleCmd_OPTIONS(); + } + } else if (urlPreSuffix[0] == '\0' && urlSuffix[0] == '*' && urlSuffix[1] == '\0') { + // The special "*" URL means: an operation on the entire server. This works only for GET_PARAMETER and SET_PARAMETER: + if (strcmp(cmdName, "GET_PARAMETER") == 0) { + handleCmd_GET_PARAMETER((char const*)fRequestBuffer); + } else if (strcmp(cmdName, "SET_PARAMETER") == 0) { + handleCmd_SET_PARAMETER((char const*)fRequestBuffer); + } else { + handleCmd_notSupported(); + } + } else if (strcmp(cmdName, "DESCRIBE") == 0) { + handleCmd_DESCRIBE(urlPreSuffix, urlSuffix, (char const*)fRequestBuffer); + } else if (strcmp(cmdName, "SETUP") == 0) { + Boolean areAuthenticated = True; + + if (!requestIncludedSessionId) { + // No session id was present in the request. + // So create a new "RTSPClientSession" object for this request. + + // But first, make sure that we're authenticated to perform this command: + char urlTotalSuffix[2*RTSP_PARAM_STRING_MAX]; + // enough space for urlPreSuffix/urlSuffix'\0' + urlTotalSuffix[0] = '\0'; + if (urlPreSuffix[0] != '\0') { + strcat(urlTotalSuffix, urlPreSuffix); + strcat(urlTotalSuffix, "/"); + } + strcat(urlTotalSuffix, urlSuffix); + if (authenticationOK("SETUP", urlTotalSuffix, (char const*)fRequestBuffer)) { + clientSession + = (RTSPServer::RTSPClientSession*)fOurRTSPServer.createNewClientSessionWithId(); + } else { + areAuthenticated = False; + } + } + if (clientSession != NULL) { + clientSession->handleCmd_SETUP(this, urlPreSuffix, urlSuffix, (char const*)fRequestBuffer); + playAfterSetup = clientSession->fStreamAfterSETUP; + } else if (areAuthenticated) { +#ifdef DEBUG + fprintf(stderr, "Calling handleCmd_sessionNotFound() (case 2)\n"); +#endif + handleCmd_sessionNotFound(); + } + } else if (strcmp(cmdName, "TEARDOWN") == 0 + || strcmp(cmdName, "PLAY") == 0 + || strcmp(cmdName, "PAUSE") == 0 + || strcmp(cmdName, "GET_PARAMETER") == 0 + || strcmp(cmdName, "SET_PARAMETER") == 0) { + if (clientSession != NULL) { + clientSession->handleCmd_withinSession(this, cmdName, urlPreSuffix, urlSuffix, (char const*)fRequestBuffer); + } else { +#ifdef DEBUG + fprintf(stderr, "Calling handleCmd_sessionNotFound() (case 3)\n"); +#endif + handleCmd_sessionNotFound(); + } + } else if (strcmp(cmdName, "REGISTER") == 0 || strcmp(cmdName, "DEREGISTER") == 0) { + // Because - unlike other commands - an implementation of this command needs + // the entire URL, we re-parse the command to get it: + char* url = strDupSize((char*)fRequestBuffer); + if (sscanf((char*)fRequestBuffer, "%*s %s", url) == 1) { + // Check for special command-specific parameters in a "Transport:" header: + Boolean reuseConnection, deliverViaTCP; + char* proxyURLSuffix; + parseTransportHeaderForREGISTER((const char*)fRequestBuffer, reuseConnection, deliverViaTCP, proxyURLSuffix); + + handleCmd_REGISTER(cmdName, url, urlSuffix, (char const*)fRequestBuffer, reuseConnection, deliverViaTCP, proxyURLSuffix); + delete[] proxyURLSuffix; + } else { + handleCmd_bad(); + } + delete[] url; + } else { + // The command is one that we don't handle: + handleCmd_notSupported(); + } + } else { +#ifdef DEBUG + fprintf(stderr, "parseRTSPRequestString() failed; checking now for HTTP commands (for RTSP-over-HTTP tunneling)...\n"); +#endif + // The request was not (valid) RTSP, but check for a special case: HTTP commands (for setting up RTSP-over-HTTP tunneling): + char sessionCookie[RTSP_PARAM_STRING_MAX]; + char acceptStr[RTSP_PARAM_STRING_MAX]; + *fLastCRLF = '\0'; // temporarily, for parsing + parseSucceeded = parseHTTPRequestString(cmdName, sizeof cmdName, + urlSuffix, sizeof urlPreSuffix, + sessionCookie, sizeof sessionCookie, + acceptStr, sizeof acceptStr); + *fLastCRLF = '\r'; + if (parseSucceeded) { +#ifdef DEBUG + fprintf(stderr, "parseHTTPRequestString() succeeded, returning cmdName \"%s\", urlSuffix \"%s\", sessionCookie \"%s\", acceptStr \"%s\"\n", cmdName, urlSuffix, sessionCookie, acceptStr); +#endif + // Check that the HTTP command is valid for RTSP-over-HTTP tunneling: There must be a 'session cookie'. + Boolean isValidHTTPCmd = True; + if (strcmp(cmdName, "OPTIONS") == 0) { + handleHTTPCmd_OPTIONS(); + } else if (sessionCookie[0] == '\0') { + // There was no "x-sessioncookie:" header. If there was an "Accept: application/x-rtsp-tunnelled" header, + // then this is a bad tunneling request. Otherwise, assume that it's an attempt to access the stream via HTTP. + if (strcmp(acceptStr, "application/x-rtsp-tunnelled") == 0) { + isValidHTTPCmd = False; + } else { + handleHTTPCmd_StreamingGET(urlSuffix, (char const*)fRequestBuffer); + } + } else if (strcmp(cmdName, "GET") == 0) { + handleHTTPCmd_TunnelingGET(sessionCookie); + } else if (strcmp(cmdName, "POST") == 0) { + // We might have received additional data following the HTTP "POST" command - i.e., the first Base64-encoded RTSP command. + // Check for this, and handle it if it exists: + unsigned char const* extraData = fLastCRLF+4; + unsigned extraDataSize = &fRequestBuffer[fRequestBytesAlreadySeen] - extraData; + if (handleHTTPCmd_TunnelingPOST(sessionCookie, extraData, extraDataSize)) { + // We don't respond to the "POST" command, and we go away: + fIsActive = False; + break; + } + } else { + isValidHTTPCmd = False; + } + if (!isValidHTTPCmd) { + handleHTTPCmd_notSupported(); + } + } else { +#ifdef DEBUG + fprintf(stderr, "parseHTTPRequestString() failed!\n"); +#endif + handleCmd_bad(); + } + } + +#ifdef DEBUG + fprintf(stderr, "sending response: %s", fResponseBuffer); +#endif + unsigned const numBytesToWrite = strlen((char*)fResponseBuffer); + if (fOutputTLS->isNeeded) { + fOutputTLS->write((char const*)fResponseBuffer, numBytesToWrite); + } else { + send(fClientOutputSocket, (char const*)fResponseBuffer, numBytesToWrite, 0); + } + + if (playAfterSetup) { + // The client has asked for streaming to commence now, rather than after a + // subsequent "PLAY" command. So, simulate the effect of a "PLAY" command: + clientSession->handleCmd_withinSession(this, "PLAY", urlPreSuffix, urlSuffix, (char const*)fRequestBuffer); + } + + // Check whether there are extra bytes remaining in the buffer, after the end of the request (a rare case). + // If so, move them to the front of our buffer, and keep processing it, because it might be a following, pipelined request. + unsigned requestSize = (fLastCRLF+4-fRequestBuffer) + contentLength; + numBytesRemaining = fRequestBytesAlreadySeen - requestSize; + resetRequestBuffer(); // to prepare for any subsequent request + + if (numBytesRemaining > 0) { + memmove(fRequestBuffer, &fRequestBuffer[requestSize], numBytesRemaining); + newBytesRead = numBytesRemaining; + } + } while (numBytesRemaining > 0); + + --fRecursionCount; + // If it has a scheduledDelayedTask, don't delete the instance or close the sockets. The sockets can be reused in the task. + if (!fIsActive && fScheduledDelayedTask <= 0) { + if (fRecursionCount > 0) closeSockets(); else delete this; + // Note: The "fRecursionCount" test is for a pathological situation where we reenter the event loop and get called recursively + // while handling a command (e.g., while handling a "DESCRIBE", to get a SDP description). + // In such a case we don't want to actually delete ourself until we leave the outermost call. + } +} + +#define SKIP_WHITESPACE while (*fields != '\0' && (*fields == ' ' || *fields == '\t')) ++fields + +static Boolean parseAuthorizationHeader(char const* buf, + char const*& username, + char const*& realm, + char const*& nonce, char const*& uri, + char const*& response) { + // Initialize the result parameters to default values: + username = realm = nonce = uri = response = NULL; + + // First, find "Authorization:" + while (1) { + if (*buf == '\0') return False; // not found + if (_strncasecmp(buf, "Authorization: Digest ", 22) == 0) break; + ++buf; + } + + // Then, run through each of the fields, looking for ones we handle: + char const* fields = buf + 22; + char* parameter = strDupSize(fields); + char* value = strDupSize(fields); + char* p; + Boolean success; + do { + // Parse: ="" + success = False; + parameter[0] = value[0] = '\0'; + SKIP_WHITESPACE; + for (p = parameter; *fields != '\0' && *fields != ' ' && *fields != '\t' && *fields != '='; ) *p++ = *fields++; + SKIP_WHITESPACE; + if (*fields++ != '=') break; // parsing failed + *p = '\0'; // complete parsing + SKIP_WHITESPACE; + if (*fields++ != '"') break; // parsing failed + for (p = value; *fields != '\0' && *fields != '"'; ) *p++ = *fields++; + if (*fields++ != '"') break; // parsing failed + *p = '\0'; // complete parsing + SKIP_WHITESPACE; + success = True; + + // Copy values for parameters that we understand: + if (strcmp(parameter, "username") == 0) { + username = strDup(value); + } else if (strcmp(parameter, "realm") == 0) { + realm = strDup(value); + } else if (strcmp(parameter, "nonce") == 0) { + nonce = strDup(value); + } else if (strcmp(parameter, "uri") == 0) { + uri = strDup(value); + } else if (strcmp(parameter, "response") == 0) { + response = strDup(value); + } + + // Check for a ',', indicating that more ="" pairs follow: + } while (*fields++ == ','); + + delete[] parameter; delete[] value; + return success; +} + +Boolean RTSPServer::RTSPClientConnection +::authenticationOK(char const* cmdName, char const* urlSuffix, char const* fullRequestStr) { + if (!fOurRTSPServer.specialClientAccessCheck(fClientInputSocket, fClientAddr, urlSuffix)) { + setRTSPResponse("401 Unauthorized"); + return False; + } + + // If we weren't set up with an authentication database, we're OK: + UserAuthenticationDatabase* authDB = fOurRTSPServer.getAuthenticationDatabaseForCommand(cmdName); + if (authDB == NULL) return True; + + char const* username = NULL; char const* realm = NULL; char const* nonce = NULL; + char const* uri = NULL; char const* response = NULL; + Boolean success = False; + + do { + // To authenticate, we first need to have a nonce set up + // from a previous attempt: + if (fCurrentAuthenticator.nonce() == NULL) break; + + // Next, the request needs to contain an "Authorization:" header, + // containing a username, (our) realm, (our) nonce, uri, + // and response string: + if (!parseAuthorizationHeader(fullRequestStr, + username, realm, nonce, uri, response) + || username == NULL + || realm == NULL || strcmp(realm, fCurrentAuthenticator.realm()) != 0 + || nonce == NULL || strcmp(nonce, fCurrentAuthenticator.nonce()) != 0 + || uri == NULL || response == NULL) { + break; + } + + // Next, the username has to be known to us: + char const* password = authDB->lookupPassword(username); +#ifdef DEBUG + fprintf(stderr, "lookupPassword(%s) returned password %s\n", username, password); +#endif + if (password == NULL) break; + fCurrentAuthenticator.setUsernameAndPassword(username, password, authDB->passwordsAreMD5()); + + // Finally, compute a digest response from the information that we have, + // and compare it to the one that we were given: + char const* ourResponse + = fCurrentAuthenticator.computeDigestResponse(cmdName, uri); + success = (strcmp(ourResponse, response) == 0); + fCurrentAuthenticator.reclaimDigestResponse(ourResponse); + } while (0); + + delete[] (char*)realm; delete[] (char*)nonce; + delete[] (char*)uri; delete[] (char*)response; + + if (success) { + // The user has been authenticated. + // Now allow subclasses a chance to validate the user against the IP address and/or URL suffix. + if (!fOurRTSPServer.specialClientUserAccessCheck(fClientInputSocket, fClientAddr, urlSuffix, username)) { + // Note: We don't return a "WWW-Authenticate" header here, because the user is valid, + // even though the server has decided that they should not have access. + setRTSPResponse("401 Unauthorized"); + delete[] (char*)username; + return False; + } + } + delete[] (char*)username; + if (success) return True; + + // If we get here, we failed to authenticate the user. + // Send back a "401 Unauthorized" response, with a new random nonce: + Boolean isInitial401 = fCurrentAuthenticator.nonce() == NULL; + fCurrentAuthenticator.setRealmAndRandomNonce(authDB->realm()); + snprintf((char*)fResponseBuffer, sizeof fResponseBuffer, + "RTSP/1.0 401 Unauthorized\r\n" + "CSeq: %s\r\n" + "%s" + "WWW-Authenticate: Digest realm=\"%s\", nonce=\"%s\"\r\n\r\n", + fCurrentCSeq, + dateHeader(), + fCurrentAuthenticator.realm(), fCurrentAuthenticator.nonce()); + if (!isInitial401) { // this is an actual authentication failure + fOurRTSPServer.specialHandlingOfAuthenticationFailure(fClientInputSocket, fClientAddr, urlSuffix); + } + return False; +} + +void RTSPServer::RTSPClientConnection +::setRTSPResponse(char const* responseStr) { + snprintf((char*)fResponseBuffer, sizeof fResponseBuffer, + "RTSP/1.0 %s\r\n" + "CSeq: %s\r\n" + "%s\r\n", + responseStr, + fCurrentCSeq, + dateHeader()); +} + +void RTSPServer::RTSPClientConnection +::setRTSPResponse(char const* responseStr, u_int32_t sessionId) { + snprintf((char*)fResponseBuffer, sizeof fResponseBuffer, + "RTSP/1.0 %s\r\n" + "CSeq: %s\r\n" + "%s" + "Session: %08X\r\n\r\n", + responseStr, + fCurrentCSeq, + dateHeader(), + sessionId); +} + +void RTSPServer::RTSPClientConnection +::setRTSPResponse(char const* responseStr, char const* contentStr) { + if (contentStr == NULL) contentStr = ""; + unsigned const contentLen = strlen(contentStr); + + snprintf((char*)fResponseBuffer, sizeof fResponseBuffer, + "RTSP/1.0 %s\r\n" + "CSeq: %s\r\n" + "%s" + "Content-Length: %d\r\n\r\n" + "%s", + responseStr, + fCurrentCSeq, + dateHeader(), + contentLen, + contentStr); +} + +void RTSPServer::RTSPClientConnection +::setRTSPResponse(char const* responseStr, u_int32_t sessionId, char const* contentStr) { + if (contentStr == NULL) contentStr = ""; + unsigned const contentLen = strlen(contentStr); + + snprintf((char*)fResponseBuffer, sizeof fResponseBuffer, + "RTSP/1.0 %s\r\n" + "CSeq: %s\r\n" + "%s" + "Session: %08X\r\n" + "Content-Length: %d\r\n\r\n" + "%s", + responseStr, + fCurrentCSeq, + dateHeader(), + sessionId, + contentLen, + contentStr); +} + +void RTSPServer::RTSPClientConnection +::changeClientInputSocket(int newSocketNum, ServerTLSState const* newTLSState, + unsigned char const* extraData, unsigned extraDataSize) { + // Change the socket number: + envir().taskScheduler().disableBackgroundHandling(fClientInputSocket); + fClientInputSocket = newSocketNum; + envir().taskScheduler().setBackgroundHandling(fClientInputSocket, SOCKET_READABLE|SOCKET_EXCEPTION, + incomingRequestHandler, this); + + // Change the TLS state: + fPOSTSocketTLS.assignStateFrom(*newTLSState); + fInputTLS = &fPOSTSocketTLS; + + // Also write any extra data to our buffer, and handle it: + if (extraDataSize > 0 && extraDataSize <= fRequestBufferBytesLeft/*sanity check; should always be true*/) { + unsigned char* ptr = &fRequestBuffer[fRequestBytesAlreadySeen]; + for (unsigned i = 0; i < extraDataSize; ++i) { + ptr[i] = extraData[i]; + } + handleRequestBytes(extraDataSize); + } +} + + +////////// RTSPServer::RTSPClientSession implementation ////////// + +RTSPServer::RTSPClientSession +::RTSPClientSession(RTSPServer& ourServer, u_int32_t sessionId) + : GenericMediaServer::ClientSession(ourServer, sessionId), + fOurRTSPServer(ourServer), fIsMulticast(False), fStreamAfterSETUP(False), + fTCPStreamIdCount(0), fNumStreamStates(0), fStreamStates(NULL) { +} + +RTSPServer::RTSPClientSession::~RTSPClientSession() { + reclaimStreamStates(); +} + +void RTSPServer::RTSPClientSession::deleteStreamByTrack(unsigned trackNum) { + if (trackNum >= fNumStreamStates) return; // sanity check; shouldn't happen + if (fStreamStates[trackNum].subsession != NULL) { + fStreamStates[trackNum].subsession->deleteStream(fOurSessionId, fStreamStates[trackNum].streamToken); + fStreamStates[trackNum].subsession = NULL; + } + + // Optimization: If all subsessions have now been deleted, then we can delete ourself now: + Boolean noSubsessionsRemain = True; + for (unsigned i = 0; i < fNumStreamStates; ++i) { + if (fStreamStates[i].subsession != NULL) { + noSubsessionsRemain = False; + break; + } + } + if (noSubsessionsRemain) delete this; +} + +void RTSPServer::RTSPClientSession::reclaimStreamStates() { + for (unsigned i = 0; i < fNumStreamStates; ++i) { + if (fStreamStates[i].subsession != NULL) { + fOurRTSPServer.unnoteTCPStreamingOnSocket(fStreamStates[i].tcpSocketNum, this, i); + fStreamStates[i].subsession->deleteStream(fOurSessionId, fStreamStates[i].streamToken); + } + } + delete[] fStreamStates; fStreamStates = NULL; + fNumStreamStates = 0; +} + +typedef enum StreamingMode { + RTP_UDP, + RTP_TCP, + RAW_UDP +} StreamingMode; + +static void parseTransportHeader(char const* buf, + StreamingMode& streamingMode, + char*& streamingModeString, + char*& destinationAddressStr, + u_int8_t& destinationTTL, + portNumBits& clientRTPPortNum, // if UDP + portNumBits& clientRTCPPortNum, // if UDP + unsigned char& rtpChannelId, // if TCP + unsigned char& rtcpChannelId // if TCP + ) { + // Initialize the result parameters to default values: + streamingMode = RTP_UDP; + streamingModeString = NULL; + destinationAddressStr = NULL; + destinationTTL = 255; + clientRTPPortNum = 0; + clientRTCPPortNum = 1; + rtpChannelId = rtcpChannelId = 0xFF; + + portNumBits p1, p2; + unsigned ttl, rtpCid, rtcpCid; + + // First, find "Transport:" + while (1) { + if (*buf == '\0') return; // not found + if (*buf == '\r' && *(buf+1) == '\n' && *(buf+2) == '\r') return; // end of the headers => not found + if (_strncasecmp(buf, "Transport:", 10) == 0) break; + ++buf; + } + + // Then, run through each of the fields, looking for ones we handle: + char const* fields = buf + 10; + while (*fields == ' ') ++fields; + char* field = strDupSize(fields); + while (sscanf(fields, "%[^;\r\n]", field) == 1) { + if (strcmp(field, "RTP/AVP/TCP") == 0) { + streamingMode = RTP_TCP; + } else if (strcmp(field, "RAW/RAW/UDP") == 0 || + strcmp(field, "MP2T/H2221/UDP") == 0) { + streamingMode = RAW_UDP; + streamingModeString = strDup(field); + } else if (_strncasecmp(field, "destination=", 12) == 0) { + delete[] destinationAddressStr; + destinationAddressStr = strDup(field+12); + } else if (sscanf(field, "ttl%u", &ttl) == 1) { + destinationTTL = (u_int8_t)ttl; + } else if (sscanf(field, "client_port=%hu-%hu", &p1, &p2) == 2) { + clientRTPPortNum = p1; + clientRTCPPortNum = streamingMode == RAW_UDP ? 0 : p2; // ignore the second port number if the client asked for raw UDP + } else if (sscanf(field, "client_port=%hu", &p1) == 1) { + clientRTPPortNum = p1; + clientRTCPPortNum = streamingMode == RAW_UDP ? 0 : p1 + 1; + } else if (sscanf(field, "interleaved=%u-%u", &rtpCid, &rtcpCid) == 2) { + rtpChannelId = (unsigned char)rtpCid; + rtcpChannelId = (unsigned char)rtcpCid; + } + + fields += strlen(field); + while (*fields == ';' || *fields == ' ' || *fields == '\t') ++fields; // skip over separating ';' chars or whitespace + if (*fields == '\0' || *fields == '\r' || *fields == '\n') break; + } + delete[] field; +} + +static Boolean parsePlayNowHeader(char const* buf) { + // Find "x-playNow:" header, if present + while (1) { + if (*buf == '\0') return False; // not found + if (_strncasecmp(buf, "x-playNow:", 10) == 0) break; + ++buf; + } + + return True; +} + +void RTSPServer::RTSPClientSession +::handleCmd_SETUP(RTSPServer::RTSPClientConnection* ourClientConnection, + char const* urlPreSuffix, char const* urlSuffix, char const* fullRequestStr) { + // Normally, "urlPreSuffix" should be the session (stream) name, and "urlSuffix" should be the subsession (track) name. + // However (being "liberal in what we accept"), we also handle 'aggregate' SETUP requests (i.e., without a track name), + // in the special case where we have only a single track. I.e., in this case, we also handle: + // "urlPreSuffix" is empty and "urlSuffix" is the session (stream) name, or + // "urlPreSuffix" concatenated with "urlSuffix" (with "/" inbetween) is the session (stream) name. + fOurClientConnection = ourClientConnection; + fURLPreSuffix = urlPreSuffix; fURLSuffix = urlSuffix; fFullRequestStr = fullRequestStr; + fTrackId = urlSuffix; // in the normal case + + // Begin by checking whether the specified stream name exists: + char const* streamName = urlPreSuffix; // in the normal case + fOurServer.lookupServerMediaSession(streamName, SETUPLookupCompletionFunction1, this, + fOurServerMediaSession == NULL); +} + +void RTSPServer::RTSPClientSession +::SETUPLookupCompletionFunction1(void* clientData, ServerMediaSession* sessionLookedUp) { + RTSPServer::RTSPClientSession* session = (RTSPServer::RTSPClientSession*)clientData; + session->handleCmd_SETUP_afterLookup1(sessionLookedUp); +} + +void RTSPServer::RTSPClientSession +::handleCmd_SETUP_afterLookup1(ServerMediaSession* sms) { + if (sms != NULL) { + // The lookup succeeded; continue working with the returned "ServerMediaSession": + handleCmd_SETUP_afterLookup2(sms); + return; + } + + // The lookup failed. Check for the special case (noted above), before we give up: + char const* streamName; + char* concatenatedStreamName = NULL; + + if (fURLPreSuffix[0] == '\0') { + streamName = fURLSuffix; + } else { + concatenatedStreamName = new char[strlen(fURLPreSuffix) + strlen(fURLSuffix) + 2]; // allow for the "/" and the trailing '\0' + sprintf(concatenatedStreamName, "%s/%s", fURLPreSuffix, fURLSuffix); + streamName = concatenatedStreamName; + } + fTrackId = NULL; + + // Check again: + fOurServer.lookupServerMediaSession(streamName, SETUPLookupCompletionFunction2, this, + fOurServerMediaSession == NULL); + delete[] concatenatedStreamName; +} + +void RTSPServer::RTSPClientSession +::SETUPLookupCompletionFunction2(void* clientData, ServerMediaSession* sessionLookedUp) { + RTSPServer::RTSPClientSession* session = (RTSPServer::RTSPClientSession*)clientData; + session->handleCmd_SETUP_afterLookup2(sessionLookedUp); +} + +void RTSPServer::RTSPClientSession +::handleCmd_SETUP_afterLookup2(ServerMediaSession* sms) { + do { + if (sms == NULL) { + if (fOurServerMediaSession == NULL) { + // The client asked for a stream that doesn't exist (and this session descriptor has not been used before): + fOurClientConnection->handleCmd_notFound(); + } else { + // The client asked for a stream that doesn't exist, but using a stream id for a stream that does exist. Bad request: + fOurClientConnection->handleCmd_bad(); + } + break; + } else { + if (fOurServerMediaSession == NULL) { + // We're accessing the "ServerMediaSession" for the first time. + fOurServerMediaSession = sms; + fOurServerMediaSession->incrementReferenceCount(); + } else if (sms != fOurServerMediaSession) { + // The client asked for a stream that's different from the one originally requested for this stream id. Bad request: + fOurClientConnection->handleCmd_bad(); + break; + } + } + + if (fStreamStates == NULL) { + // This is the first "SETUP" for this session. Set up our array of states for all of this session's subsessions (tracks): + fNumStreamStates = fOurServerMediaSession->numSubsessions(); + fStreamStates = new struct streamState[fNumStreamStates]; + + ServerMediaSubsessionIterator iter(*fOurServerMediaSession); + ServerMediaSubsession* subsession; + for (unsigned i = 0; i < fNumStreamStates; ++i) { + subsession = iter.next(); + fStreamStates[i].subsession = subsession; + fStreamStates[i].tcpSocketNum = -1; // for now; may get set for RTP-over-TCP streaming + fStreamStates[i].streamToken = NULL; // for now; it may be changed by the "getStreamParameters()" call that comes later + } +#ifdef LOG_RTSPSERVER_ACCESS + FILE* logfid = fopen("live555.log", "a"); + if (logfid != NULL) { + time_t tm = time(NULL); + char * tmstr = ctime(&tm); + fwrite(fURLPreSuffix, 1, strlen(fURLPreSuffix), logfid); + fwrite(", ",1,2,logfid); + fwrite(tmstr, 1, strlen(tmstr), logfid); + fclose(logfid); + } +#endif + } + + // Look up information for the specified subsession (track): + ServerMediaSubsession* subsession = NULL; + unsigned trackNum; + if (fTrackId != NULL && fTrackId[0] != '\0') { // normal case + for (trackNum = 0; trackNum < fNumStreamStates; ++trackNum) { + subsession = fStreamStates[trackNum].subsession; + if (subsession != NULL && strcmp(fTrackId, subsession->trackId()) == 0) break; + } + if (trackNum >= fNumStreamStates) { + // The specified track id doesn't exist, so this request fails: + fOurClientConnection->handleCmd_notFound(); + break; + } + } else { + // Weird case: there was no track id in the URL. + // This works only if we have only one subsession: + if (fNumStreamStates != 1 || fStreamStates[0].subsession == NULL) { + fOurClientConnection->handleCmd_bad(); + break; + } + trackNum = 0; + subsession = fStreamStates[trackNum].subsession; + } + // ASSERT: subsession != NULL + + void*& token = fStreamStates[trackNum].streamToken; // alias + if (token != NULL) { + // We already handled a "SETUP" for this track (to the same client), + // so stop any existing streaming of it, before we set it up again: + subsession->pauseStream(fOurSessionId, token); + fOurRTSPServer.unnoteTCPStreamingOnSocket(fStreamStates[trackNum].tcpSocketNum, this, trackNum); + subsession->deleteStream(fOurSessionId, token); + } + + // Look for a "Transport:" header in the request string, to extract client parameters: + StreamingMode streamingMode; + char* streamingModeString = NULL; // set when RAW_UDP streaming is specified + char* clientsDestinationAddressStr; + u_int8_t clientsDestinationTTL; + portNumBits clientRTPPortNum, clientRTCPPortNum; + unsigned char rtpChannelId, rtcpChannelId; + parseTransportHeader(fFullRequestStr, streamingMode, streamingModeString, + clientsDestinationAddressStr, clientsDestinationTTL, + clientRTPPortNum, clientRTCPPortNum, + rtpChannelId, rtcpChannelId); + if ((streamingMode == RTP_TCP && rtpChannelId == 0xFF) || + (streamingMode != RTP_TCP && fOurClientConnection->fClientOutputSocket != fOurClientConnection->fClientInputSocket)) { + // An anomolous situation, caused by a buggy client. Either: + // 1/ TCP streaming was requested, but with no "interleaving=" fields. (QuickTime Player sometimes does this.), or + // 2/ TCP streaming was not requested, but we're doing RTSP-over-HTTP tunneling (which implies TCP streaming). + // In either case, we assume TCP streaming, and set the RTP and RTCP channel ids to proper values: + streamingMode = RTP_TCP; + rtpChannelId = fTCPStreamIdCount; rtcpChannelId = fTCPStreamIdCount+1; + } + if (streamingMode == RTP_TCP) fTCPStreamIdCount += 2; + + Port clientRTPPort(clientRTPPortNum); + Port clientRTCPPort(clientRTCPPortNum); + + // Next, check whether a "Range:" or "x-playNow:" header is present in the request. + // This isn't legal, but some clients do this to combine "SETUP" and "PLAY": + double rangeStart = 0.0, rangeEnd = 0.0; + char* absStart = NULL; char* absEnd = NULL; + Boolean startTimeIsNow; + if (parseRangeHeader(fFullRequestStr, rangeStart, rangeEnd, absStart, absEnd, startTimeIsNow)) { + delete[] absStart; delete[] absEnd; + fStreamAfterSETUP = True; + } else if (parsePlayNowHeader(fFullRequestStr)) { + fStreamAfterSETUP = True; + } else { + fStreamAfterSETUP = False; + } + + // Then, get server parameters from the 'subsession': + if (streamingMode == RTP_TCP) { + // Note that we'll be streaming over the RTSP TCP connection: + fStreamStates[trackNum].tcpSocketNum = fOurClientConnection->fClientOutputSocket; + fOurRTSPServer.noteTCPStreamingOnSocket(fStreamStates[trackNum].tcpSocketNum, this, trackNum); + } + struct sockaddr_storage destinationAddress = nullAddress(); + // used to indicate that the address is 'unassigned' + u_int8_t destinationTTL = 255; +#ifdef RTSP_ALLOW_CLIENT_DESTINATION_SETTING + if (clientsDestinationAddressStr != NULL) { + // Use the client-provided "destination" address. + // Note: This potentially allows the server to be used in denial-of-service + // attacks, so don't enable this code unless you're sure that clients are + // trusted. + NetAddressList destAddresses(clientsDestinationAddressStr); + if (destAddresses.numAddresses() > 0) { + copyAddress(destinationAddress, destAddresses.firstAddress()); + } + } + // Also use the client-provided TTL. + destinationTTL = clientsDestinationTTL; +#endif + delete[] clientsDestinationAddressStr; + Port serverRTPPort(0); + Port serverRTCPPort(0); + + // Make sure that we transmit on the same interface that's used by the client + // (in case we're a multi-homed server): + struct sockaddr_storage sourceAddr; SOCKLEN_T namelen = sizeof sourceAddr; + getsockname(fOurClientConnection->fClientInputSocket, (struct sockaddr*)&sourceAddr, (socklen_t *)&namelen); + + subsession->getStreamParameters(fOurSessionId, fOurClientConnection->fClientAddr, + clientRTPPort, clientRTCPPort, + fStreamStates[trackNum].tcpSocketNum, rtpChannelId, rtcpChannelId, + &fOurClientConnection->fTLS, + destinationAddress, destinationTTL, fIsMulticast, + serverRTPPort, serverRTCPPort, + fStreamStates[trackNum].streamToken); + + AddressString destAddrStr(destinationAddress); + AddressString sourceAddrStr(sourceAddr); + char timeoutParameterString[100]; + if (fOurRTSPServer.fReclamationSeconds > 0) { + sprintf(timeoutParameterString, ";timeout=%u", fOurRTSPServer.fReclamationSeconds); + } else { + timeoutParameterString[0] = '\0'; + } + if (fIsMulticast) { + switch (streamingMode) { + case RTP_UDP: { + snprintf((char*)fOurClientConnection->fResponseBuffer, sizeof fOurClientConnection->fResponseBuffer, + "RTSP/1.0 200 OK\r\n" + "CSeq: %s\r\n" + "%s" + "Transport: RTP/%s;multicast;destination=%s;source=%s;port=%d-%d;ttl=%d\r\n" + "Session: %08X%s\r\n\r\n", + fOurClientConnection->fCurrentCSeq, + dateHeader(), + fOurRTSPServer.fWeServeSRTP ? "SAVP" : "AVP", + destAddrStr.val(), sourceAddrStr.val(), ntohs(serverRTPPort.num()), ntohs(serverRTCPPort.num()), destinationTTL, + fOurSessionId, timeoutParameterString); + break; + } + case RTP_TCP: { + // multicast streams can't be sent via TCP + fOurClientConnection->handleCmd_unsupportedTransport(); + break; + } + case RAW_UDP: { + snprintf((char*)fOurClientConnection->fResponseBuffer, sizeof fOurClientConnection->fResponseBuffer, + "RTSP/1.0 200 OK\r\n" + "CSeq: %s\r\n" + "%s" + "Transport: %s;multicast;destination=%s;source=%s;port=%d;ttl=%d\r\n" + "Session: %08X%s\r\n\r\n", + fOurClientConnection->fCurrentCSeq, + dateHeader(), + streamingModeString, destAddrStr.val(), sourceAddrStr.val(), ntohs(serverRTPPort.num()), destinationTTL, + fOurSessionId, timeoutParameterString); + break; + } + } + } else { + switch (streamingMode) { + case RTP_UDP: { + snprintf((char*)fOurClientConnection->fResponseBuffer, sizeof fOurClientConnection->fResponseBuffer, + "RTSP/1.0 200 OK\r\n" + "CSeq: %s\r\n" + "%s" + "Transport: RTP/%s;unicast;destination=%s;source=%s;client_port=%d-%d;server_port=%d-%d\r\n" + "Session: %08X%s\r\n\r\n", + fOurClientConnection->fCurrentCSeq, + dateHeader(), + fOurRTSPServer.fWeServeSRTP ? "SAVP" : "AVP", + destAddrStr.val(), sourceAddrStr.val(), ntohs(clientRTPPort.num()), ntohs(clientRTCPPort.num()), ntohs(serverRTPPort.num()), ntohs(serverRTCPPort.num()), + fOurSessionId, timeoutParameterString); + break; + } + case RTP_TCP: { + if (!fOurRTSPServer.fAllowStreamingRTPOverTCP) { + fOurClientConnection->handleCmd_unsupportedTransport(); + } else { + snprintf((char*)fOurClientConnection->fResponseBuffer, sizeof fOurClientConnection->fResponseBuffer, + "RTSP/1.0 200 OK\r\n" + "CSeq: %s\r\n" + "%s" + "Transport: RTP/AVP/TCP;unicast;destination=%s;source=%s;interleaved=%d-%d\r\n" + "Session: %08X%s\r\n\r\n", + fOurClientConnection->fCurrentCSeq, + dateHeader(), + destAddrStr.val(), sourceAddrStr.val(), rtpChannelId, rtcpChannelId, + fOurSessionId, timeoutParameterString); + } + break; + } + case RAW_UDP: { + snprintf((char*)fOurClientConnection->fResponseBuffer, sizeof fOurClientConnection->fResponseBuffer, + "RTSP/1.0 200 OK\r\n" + "CSeq: %s\r\n" + "%s" + "Transport: %s;unicast;destination=%s;source=%s;client_port=%d;server_port=%d\r\n" + "Session: %08X%s\r\n\r\n", + fOurClientConnection->fCurrentCSeq, + dateHeader(), + streamingModeString, destAddrStr.val(), sourceAddrStr.val(), ntohs(clientRTPPort.num()), ntohs(serverRTPPort.num()), + fOurSessionId, timeoutParameterString); + break; + } + } + } + delete[] streamingModeString; + } while (0); +} + +void RTSPServer::RTSPClientSession +::handleCmd_withinSession(RTSPServer::RTSPClientConnection* ourClientConnection, + char const* cmdName, + char const* urlPreSuffix, char const* urlSuffix, + char const* fullRequestStr) { + // This will either be: + // - a non-aggregated operation, if "urlPreSuffix" is the session (stream) + // name and "urlSuffix" is the subsession (track) name, or + // - an aggregated operation, if "urlSuffix" is the session (stream) name, + // or "urlPreSuffix" is the session (stream) name, and "urlSuffix" is empty, + // or "urlPreSuffix" and "urlSuffix" are both nonempty, but when concatenated, (with "/") form the session (stream) name. + // Begin by figuring out which of these it is: + ServerMediaSubsession* subsession; + + if (fOurServerMediaSession == NULL) { // There wasn't a previous SETUP! + ourClientConnection->handleCmd_notSupported(); + return; + } else if (urlSuffix[0] != '\0' && strcmp(fOurServerMediaSession->streamName(), urlPreSuffix) == 0) { + // Non-aggregated operation. + // Look up the media subsession whose track id is "urlSuffix": + ServerMediaSubsessionIterator iter(*fOurServerMediaSession); + while ((subsession = iter.next()) != NULL) { + if (strcmp(subsession->trackId(), urlSuffix) == 0) break; // success + } + if (subsession == NULL) { // no such track! + ourClientConnection->handleCmd_notFound(); + return; + } + } else if (strcmp(fOurServerMediaSession->streamName(), urlSuffix) == 0 || + (urlSuffix[0] == '\0' && strcmp(fOurServerMediaSession->streamName(), urlPreSuffix) == 0)) { + // Aggregated operation + subsession = NULL; + } else if (urlPreSuffix[0] != '\0' && urlSuffix[0] != '\0') { + // Aggregated operation, if / is the session (stream) name: + unsigned const urlPreSuffixLen = strlen(urlPreSuffix); + if (strncmp(fOurServerMediaSession->streamName(), urlPreSuffix, urlPreSuffixLen) == 0 && + fOurServerMediaSession->streamName()[urlPreSuffixLen] == '/' && + strcmp(&(fOurServerMediaSession->streamName())[urlPreSuffixLen+1], urlSuffix) == 0) { + subsession = NULL; + } else { + ourClientConnection->handleCmd_notFound(); + return; + } + } else { // the request doesn't match a known stream and/or track at all! + ourClientConnection->handleCmd_notFound(); + return; + } + + if (strcmp(cmdName, "TEARDOWN") == 0) { + handleCmd_TEARDOWN(ourClientConnection, subsession); + } else if (strcmp(cmdName, "PLAY") == 0) { + handleCmd_PLAY(ourClientConnection, subsession, fullRequestStr); + } else if (strcmp(cmdName, "PAUSE") == 0) { + handleCmd_PAUSE(ourClientConnection, subsession); + } else if (strcmp(cmdName, "GET_PARAMETER") == 0) { + handleCmd_GET_PARAMETER(ourClientConnection, subsession, fullRequestStr); + } else if (strcmp(cmdName, "SET_PARAMETER") == 0) { + handleCmd_SET_PARAMETER(ourClientConnection, subsession, fullRequestStr); + } +} + +void RTSPServer::RTSPClientSession +::handleCmd_TEARDOWN(RTSPServer::RTSPClientConnection* ourClientConnection, + ServerMediaSubsession* subsession) { + unsigned i; + for (i = 0; i < fNumStreamStates; ++i) { + if (subsession == NULL /* means: aggregated operation */ + || subsession == fStreamStates[i].subsession) { + if (fStreamStates[i].subsession != NULL) { + fOurRTSPServer.unnoteTCPStreamingOnSocket(fStreamStates[i].tcpSocketNum, this, i); + fStreamStates[i].subsession->deleteStream(fOurSessionId, fStreamStates[i].streamToken); + fStreamStates[i].subsession = NULL; + } + } + } + + setRTSPResponse(ourClientConnection, "200 OK"); + + // Optimization: If all subsessions have now been torn down, then we know that we can reclaim our object now. + // (Without this optimization, however, this object would still get reclaimed later, as a result of a 'liveness' timeout.) + Boolean noSubsessionsRemain = True; + for (i = 0; i < fNumStreamStates; ++i) { + if (fStreamStates[i].subsession != NULL) { + noSubsessionsRemain = False; + break; + } + } + if (noSubsessionsRemain) delete this; +} + +void RTSPServer::RTSPClientSession +::handleCmd_PLAY(RTSPServer::RTSPClientConnection* ourClientConnection, + ServerMediaSubsession* subsession, char const* fullRequestStr) { + char* rtspURL + = fOurRTSPServer.rtspURL(fOurServerMediaSession, ourClientConnection->fClientInputSocket); + unsigned rtspURLSize = strlen(rtspURL); + + // Parse the client's "Scale:" header, if any: + float scale; + Boolean sawScaleHeader = parseScaleHeader(fullRequestStr, scale); + + // Try to set the stream's scale factor to this value: + if (subsession == NULL /*aggregate op*/) { + fOurServerMediaSession->testScaleFactor(scale); + } else { + subsession->testScaleFactor(scale); + } + + char buf[100]; + char* scaleHeader; + if (!sawScaleHeader) { + buf[0] = '\0'; // Because we didn't see a Scale: header, don't send one back + } else { + sprintf(buf, "Scale: %f\r\n", scale); + } + scaleHeader = strDup(buf); + + // Parse the client's "Range:" header, if any: + float duration = 0.0; + double rangeStart = 0.0, rangeEnd = 0.0; + char* absStart = NULL; char* absEnd = NULL; + Boolean startTimeIsNow; + Boolean sawRangeHeader + = parseRangeHeader(fullRequestStr, rangeStart, rangeEnd, absStart, absEnd, startTimeIsNow); + + if (sawRangeHeader && absStart == NULL/*not seeking by 'absolute' time*/) { + // Use this information, plus the stream's duration (if known), to create our own "Range:" header, for the response: + duration = subsession == NULL /*aggregate op*/ + ? fOurServerMediaSession->duration() : subsession->duration(); + if (duration < 0.0) { + // We're an aggregate PLAY, but the subsessions have different durations. + // Use the largest of these durations in our header + duration = -duration; + } + + // Make sure that "rangeStart" and "rangeEnd" (from the client's "Range:" header) + // have sane values, before we send back our own "Range:" header in our response: + if (rangeStart < 0.0) rangeStart = 0.0; + else if (rangeStart > duration) rangeStart = duration; + if (rangeEnd < 0.0) rangeEnd = 0.0; + else if (rangeEnd > duration) rangeEnd = duration; + if ((scale > 0.0 && rangeStart > rangeEnd && rangeEnd > 0.0) || + (scale < 0.0 && rangeStart < rangeEnd)) { + // "rangeStart" and "rangeEnd" were the wrong way around; swap them: + double tmp = rangeStart; + rangeStart = rangeEnd; + rangeEnd = tmp; + } + } + + // Create a "RTP-Info:" line. It will get filled in from each subsession's state: + char const* rtpInfoFmt = + "%s" // "RTP-Info:", plus any preceding rtpInfo items + "%s" // comma separator, if needed + "url=%s/%s" + ";seq=%d" + ";rtptime=%u" + ; + unsigned rtpInfoFmtSize = strlen(rtpInfoFmt); + char* rtpInfo = strDup("RTP-Info: "); + unsigned i, numRTPInfoItems = 0; + + // Do any required seeking/scaling on each subsession, before starting streaming. + // (However, we don't do this if the "PLAY" request was for just a single subsession + // of a multiple-subsession stream; for such streams, seeking/scaling can be done + // only with an aggregate "PLAY".) + for (i = 0; i < fNumStreamStates; ++i) { + if (subsession == NULL /* means: aggregated operation */ || fNumStreamStates == 1) { + if (fStreamStates[i].subsession != NULL) { + if (sawScaleHeader) { + fStreamStates[i].subsession->setStreamScale(fOurSessionId, fStreamStates[i].streamToken, scale); + } + if (absStart != NULL) { + // Special case handling for seeking by 'absolute' time: + + fStreamStates[i].subsession->seekStream(fOurSessionId, fStreamStates[i].streamToken, absStart, absEnd); + } else { + // Seeking by relative (NPT) time: + + u_int64_t numBytes; + if (!sawRangeHeader || startTimeIsNow) { + // We're resuming streaming without seeking, so we just do a 'null' seek + // (to get our NPT, and to specify when to end streaming): + fStreamStates[i].subsession->nullSeekStream(fOurSessionId, fStreamStates[i].streamToken, + rangeEnd, numBytes); + } else { + // We do a real 'seek': + double streamDuration = 0.0; // by default; means: stream until the end of the media + if (rangeEnd > 0.0 && (rangeEnd+0.001) < duration) { + // the 0.001 is because we limited the values to 3 decimal places + // We want the stream to end early. Set the duration we want: + streamDuration = rangeEnd - rangeStart; + if (streamDuration < 0.0) streamDuration = -streamDuration; + // should happen only if scale < 0.0 + } + fStreamStates[i].subsession->seekStream(fOurSessionId, fStreamStates[i].streamToken, + rangeStart, streamDuration, numBytes); + } + } + } + } + } + + // Create the "Range:" header that we'll send back in our response. + // (Note that we do this after seeking, in case the seeking operation changed the range start time.) + char* rangeHeader; + if (absStart != NULL) { + // We're seeking by 'absolute' time: + char* rangeHeaderBuf; + + if (absEnd == NULL) { + rangeHeaderBuf = new char[100 + strlen(absStart)]; // ample space + sprintf(rangeHeaderBuf, "Range: clock=%s-\r\n", absStart); + } else { + rangeHeaderBuf = new char[100 + strlen(absStart) + strlen(absEnd)]; // ample space + sprintf(rangeHeaderBuf, "Range: clock=%s-%s\r\n", absStart, absEnd); + } + delete[] absStart; delete[] absEnd; + rangeHeader = strDup(rangeHeaderBuf); + delete[] rangeHeaderBuf; + } else { + // We're seeking by relative (NPT) time: + if (!sawRangeHeader || startTimeIsNow) { + // We didn't seek, so in our response, begin the range with the current NPT (normal play time): + float curNPT = 0.0; + for (i = 0; i < fNumStreamStates; ++i) { + if (subsession == NULL /* means: aggregated operation */ + || subsession == fStreamStates[i].subsession) { + if (fStreamStates[i].subsession == NULL) continue; + float npt = fStreamStates[i].subsession->getCurrentNPT(fStreamStates[i].streamToken); + if (npt > curNPT) curNPT = npt; + // Note: If this is an aggregate "PLAY" on a multi-subsession stream, + // then it's conceivable that the NPTs of each subsession may differ + // (if there has been a previous seek on just one subsession). + // In this (unusual) case, we just return the largest NPT; I hope that turns out OK... + } + } + rangeStart = curNPT; + } + + if (rangeEnd == 0.0 && scale >= 0.0) { + sprintf(buf, "Range: npt=%.3f-\r\n", rangeStart); + } else { + sprintf(buf, "Range: npt=%.3f-%.3f\r\n", rangeStart, rangeEnd); + } + rangeHeader = strDup(buf); + } + + // Now, start streaming: + for (i = 0; i < fNumStreamStates; ++i) { + if (subsession == NULL /* means: aggregated operation */ + || subsession == fStreamStates[i].subsession) { + unsigned short rtpSeqNum = 0; + unsigned rtpTimestamp = 0; + if (fStreamStates[i].subsession == NULL) continue; + fStreamStates[i].subsession->startStream(fOurSessionId, + fStreamStates[i].streamToken, + (TaskFunc*)noteClientLiveness, this, + rtpSeqNum, rtpTimestamp, + RTSPServer::RTSPClientConnection::handleAlternativeRequestByte, ourClientConnection); + const char *urlSuffix = fStreamStates[i].subsession->trackId(); + char* prevRTPInfo = rtpInfo; + unsigned rtpInfoSize = rtpInfoFmtSize + + strlen(prevRTPInfo) + + 1 + + rtspURLSize + strlen(urlSuffix) + + 5 /*max unsigned short len*/ + + 10 /*max unsigned (32-bit) len*/ + + 2 /*allows for trailing \r\n at final end of string*/; + rtpInfo = new char[rtpInfoSize]; + sprintf(rtpInfo, rtpInfoFmt, + prevRTPInfo, + numRTPInfoItems++ == 0 ? "" : ",", + rtspURL, urlSuffix, + rtpSeqNum, + rtpTimestamp + ); + delete[] prevRTPInfo; + } + } + if (numRTPInfoItems == 0) { + rtpInfo[0] = '\0'; + } else { + unsigned rtpInfoLen = strlen(rtpInfo); + rtpInfo[rtpInfoLen] = '\r'; + rtpInfo[rtpInfoLen+1] = '\n'; + rtpInfo[rtpInfoLen+2] = '\0'; + } + + // Fill in the response: + snprintf((char*)ourClientConnection->fResponseBuffer, sizeof ourClientConnection->fResponseBuffer, + "RTSP/1.0 200 OK\r\n" + "CSeq: %s\r\n" + "%s" + "%s" + "%s" + "Session: %08X\r\n" + "%s\r\n", + ourClientConnection->fCurrentCSeq, + dateHeader(), + scaleHeader, + rangeHeader, + fOurSessionId, + rtpInfo); + delete[] rtpInfo; delete[] rangeHeader; + delete[] scaleHeader; delete[] rtspURL; +} + +void RTSPServer::RTSPClientSession +::handleCmd_PAUSE(RTSPServer::RTSPClientConnection* ourClientConnection, + ServerMediaSubsession* subsession) { + for (unsigned i = 0; i < fNumStreamStates; ++i) { + if (subsession == NULL /* means: aggregated operation */ + || subsession == fStreamStates[i].subsession) { + if (fStreamStates[i].subsession != NULL) { + fStreamStates[i].subsession->pauseStream(fOurSessionId, fStreamStates[i].streamToken); + } + } + } + + setRTSPResponse(ourClientConnection, "200 OK", fOurSessionId); +} + +void RTSPServer::RTSPClientSession +::handleCmd_GET_PARAMETER(RTSPServer::RTSPClientConnection* ourClientConnection, + ServerMediaSubsession* /*subsession*/, char const* /*fullRequestStr*/) { + // By default, we implement "GET_PARAMETER" just as a 'keep alive', and send back a dummy response. + // (If you want to handle "GET_PARAMETER" properly, you can do so by defining a subclass of "RTSPServer" + // and "RTSPServer::RTSPClientSession", and then reimplement this virtual function in your subclass.) + setRTSPResponse(ourClientConnection, "200 OK", fOurSessionId, LIVEMEDIA_LIBRARY_VERSION_STRING); +} + +void RTSPServer::RTSPClientSession +::handleCmd_SET_PARAMETER(RTSPServer::RTSPClientConnection* ourClientConnection, + ServerMediaSubsession* /*subsession*/, char const* /*fullRequestStr*/) { + // By default, we implement "SET_PARAMETER" just as a 'keep alive', and send back an empty response. + // (If you want to handle "SET_PARAMETER" properly, you can do so by defining a subclass of "RTSPServer" + // and "RTSPServer::RTSPClientSession", and then reimplement this virtual function in your subclass.) + setRTSPResponse(ourClientConnection, "200 OK", fOurSessionId); +} + +GenericMediaServer::ClientConnection* +RTSPServer::createNewClientConnection(int clientSocket, struct sockaddr_storage const& clientAddr) { + return new RTSPClientConnection(*this, clientSocket, clientAddr, fOurConnectionsUseTLS); +} + +GenericMediaServer::ClientSession* +RTSPServer::createNewClientSession(u_int32_t sessionId) { + return new RTSPClientSession(*this, sessionId); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/RTSPServerRegister.cpp b/src/big/mpp/middleware/src/live555/liveMedia/RTSPServerRegister.cpp new file mode 100644 index 000000000..270290455 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/RTSPServerRegister.cpp @@ -0,0 +1,438 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A RTSP server +// Implementation of functionality related to the "REGISTER" and "DEREGISTER" commands + +#include "RTSPServer.hh" +#include "RTSPCommon.hh" +#include "RTSPRegisterSender.hh" +#include "ProxyServerMediaSession.hh" +#include "GroupsockHelper.hh" + +////////// Implementation of "RTSPServer::registerStream()": ////////// + +static void rtspRegisterResponseHandler(RTSPClient* rtspClient, int resultCode, char* resultString); // forward + +// A class that represents the state of a "REGISTER" request in progress: +class RegisterRequestRecord: public RTSPRegisterSender { +public: + RegisterRequestRecord(RTSPServer& ourServer, unsigned requestId, + char const* remoteClientNameOrAddress, portNumBits remoteClientPortNum, char const* rtspURLToRegister, + RTSPServer::responseHandlerForREGISTER* responseHandler, Authenticator* authenticator, + Boolean requestStreamingViaTCP, char const* proxyURLSuffix) + : RTSPRegisterSender(ourServer.envir(), remoteClientNameOrAddress, remoteClientPortNum, rtspURLToRegister, + rtspRegisterResponseHandler, authenticator, + requestStreamingViaTCP, proxyURLSuffix, True/*reuseConnection*/, +#ifdef DEBUG + 1/*verbosityLevel*/, +#else + 0/*verbosityLevel*/, +#endif + NULL), + fOurServer(ourServer), fRequestId(requestId), fResponseHandler(responseHandler) { + // Add ourself to our server's 'pending REGISTER or DEREGISTER requests' table: + ourServer.fPendingRegisterOrDeregisterRequests->Add((char const*)this, this); + } + + virtual ~RegisterRequestRecord() { + // Remove ourself from the server's 'pending REGISTER or DEREGISTER requests' hash table before we go: + fOurServer.fPendingRegisterOrDeregisterRequests->Remove((char const*)this); + } + + void handleResponse(int resultCode, char* resultString) { + if (resultCode == 0) { + // The "REGISTER" request succeeded, so use the still-open RTSP socket to await incoming commands from the remote endpoint: + int sock; + struct sockaddr_storage remoteAddress; + + grabConnection(sock, remoteAddress); + if (sock >= 0) { + increaseSendBufferTo(envir(), sock, 50*1024); // in anticipation of streaming over it + (void)fOurServer.createNewClientConnection(sock, remoteAddress); + } + } + + if (fResponseHandler != NULL) { + // Call our (REGISTER-specific) response handler now: + (*fResponseHandler)(&fOurServer, fRequestId, resultCode, resultString); + } else { + // We need to delete[] "resultString" before we leave: + delete[] resultString; + } + + // We're completely done with the REGISTER command now, so delete ourself now: + Medium::close(this); + } + +private: + RTSPServer& fOurServer; + unsigned fRequestId; + RTSPServer::responseHandlerForREGISTER* fResponseHandler; +}; + +static void rtspRegisterResponseHandler(RTSPClient* rtspClient, int resultCode, char* resultString) { + RegisterRequestRecord* registerRequestRecord = (RegisterRequestRecord*)rtspClient; + + registerRequestRecord->handleResponse(resultCode, resultString); +} + +unsigned RTSPServer::registerStream(ServerMediaSession* serverMediaSession, + char const* remoteClientNameOrAddress, portNumBits remoteClientPortNum, + responseHandlerForREGISTER* responseHandler, + char const* username, char const* password, + Boolean receiveOurStreamViaTCP, char const* proxyURLSuffix) { + // Create a new "RegisterRequestRecord" that will send the "REGISTER" command. + // (This object will automatically get deleted after we get a response to the "REGISTER" command, or if we're deleted.) + Authenticator* authenticator = NULL; + if (username != NULL) { + if (password == NULL) password = ""; + authenticator = new Authenticator(username, password); + } + unsigned requestId = ++fRegisterOrDeregisterRequestCounter; + char const* url = rtspURL(serverMediaSession); + new RegisterRequestRecord(*this, requestId, + remoteClientNameOrAddress, remoteClientPortNum, url, + responseHandler, authenticator, + receiveOurStreamViaTCP, proxyURLSuffix); + + delete[] (char*)url; // we can do this here because it was copied to the "RegisterRequestRecord" + delete authenticator; // ditto + return requestId; +} + +////////// Implementation of "RTSPServer::deregisterStream()": ////////// + +static void rtspDeregisterResponseHandler(RTSPClient* rtspClient, int resultCode, char* resultString); // forward + +// A class that represents the state of a "DEREGISTER" request in progress: +class DeregisterRequestRecord: public RTSPDeregisterSender { +public: + DeregisterRequestRecord(RTSPServer& ourServer, unsigned requestId, + char const* remoteClientNameOrAddress, portNumBits remoteClientPortNum, char const* rtspURLToDeregister, + RTSPServer::responseHandlerForDEREGISTER* responseHandler, Authenticator* authenticator, + char const* proxyURLSuffix) + : RTSPDeregisterSender(ourServer.envir(), remoteClientNameOrAddress, remoteClientPortNum, rtspURLToDeregister, + rtspDeregisterResponseHandler, authenticator, proxyURLSuffix, +#ifdef DEBUG + 1/*verbosityLevel*/, +#else + 0/*verbosityLevel*/, +#endif + NULL), + fOurServer(ourServer), fRequestId(requestId), fResponseHandler(responseHandler) { + // Add ourself to our server's 'pending REGISTER or DEREGISTER requests' table: + ourServer.fPendingRegisterOrDeregisterRequests->Add((char const*)this, this); + } + + virtual ~DeregisterRequestRecord() { + // Remove ourself from the server's 'pending REGISTER or DEREGISTER requests' hash table before we go: + fOurServer.fPendingRegisterOrDeregisterRequests->Remove((char const*)this); + } + + void handleResponse(int resultCode, char* resultString) { + if (fResponseHandler != NULL) { + // Call our (DEREGISTER-specific) response handler now: + (*fResponseHandler)(&fOurServer, fRequestId, resultCode, resultString); + } else { + // We need to delete[] "resultString" before we leave: + delete[] resultString; + } + + // We're completely done with the DEREGISTER command now, so delete ourself now: + Medium::close(this); + } + +private: + RTSPServer& fOurServer; + unsigned fRequestId; + RTSPServer::responseHandlerForDEREGISTER* fResponseHandler; +}; + +static void rtspDeregisterResponseHandler(RTSPClient* rtspClient, int resultCode, char* resultString) { + DeregisterRequestRecord* deregisterRequestRecord = (DeregisterRequestRecord*)rtspClient; + + deregisterRequestRecord->handleResponse(resultCode, resultString); +} + +unsigned RTSPServer::deregisterStream(ServerMediaSession* serverMediaSession, + char const* remoteClientNameOrAddress, portNumBits remoteClientPortNum, + responseHandlerForDEREGISTER* responseHandler, + char const* username, char const* password, + char const* proxyURLSuffix) { + // Create a new "DeregisterRequestRecord" that will send the "DEREGISTER" command. + // (This object will automatically get deleted after we get a response to the "DEREGISTER" command, or if we're deleted.) + Authenticator* authenticator = NULL; + if (username != NULL) { + if (password == NULL) password = ""; + authenticator = new Authenticator(username, password); + } + unsigned requestId = ++fRegisterOrDeregisterRequestCounter; + char const* url = rtspURL(serverMediaSession); + new DeregisterRequestRecord(*this, requestId, + remoteClientNameOrAddress, remoteClientPortNum, url, + responseHandler, authenticator, + proxyURLSuffix); + + delete[] (char*)url; // we can do this here because it was copied to the "DeregisterRequestRecord" + delete authenticator; // ditto + return requestId; +} + +Boolean RTSPServer::weImplementREGISTER(char const* /*cmd*//*"REGISTER" or "DEREGISTER"*/, + char const* /*proxyURLSuffix*/, char*& responseStr) { + // By default, servers do not implement our custom "REGISTER"/"DEREGISTER" commands: + responseStr = NULL; + return False; +} + +void RTSPServer::implementCmd_REGISTER(char const* /*cmd*//*"REGISTER" or "DEREGISTER"*/, + char const* /*url*/, char const* /*urlSuffix*/, int /*socketToRemoteServer*/, + Boolean /*deliverViaTCP*/, char const* /*proxyURLSuffix*/) { + // By default, this function is a 'noop' +} + +// Special mechanism for handling our custom "REGISTER" command: + +RTSPServer::RTSPClientConnection::ParamsForREGISTER +::ParamsForREGISTER(char const* cmd/*"REGISTER" or "DEREGISTER"*/, + RTSPServer::RTSPClientConnection* ourConnection, char const* url, char const* urlSuffix, + Boolean reuseConnection, Boolean deliverViaTCP, char const* proxyURLSuffix) + : fCmd(strDup(cmd)), fOurConnection(ourConnection), fURL(strDup(url)), fURLSuffix(strDup(urlSuffix)), + fReuseConnection(reuseConnection), fDeliverViaTCP(deliverViaTCP), fProxyURLSuffix(strDup(proxyURLSuffix)) { +} + +RTSPServer::RTSPClientConnection::ParamsForREGISTER::~ParamsForREGISTER() { + delete[] (char*)fCmd; delete[] fURL; delete[] fURLSuffix; delete[] fProxyURLSuffix; +} + +#define DELAY_USECS_AFTER_REGISTER_RESPONSE 100000 /*100ms*/ + +void RTSPServer +::RTSPClientConnection::handleCmd_REGISTER(char const* cmd/*"REGISTER" or "DEREGISTER"*/, + char const* url, char const* urlSuffix, char const* fullRequestStr, + Boolean reuseConnection, Boolean deliverViaTCP, char const* proxyURLSuffix) { + char* responseStr; + if (fOurRTSPServer.weImplementREGISTER(cmd, proxyURLSuffix, responseStr)) { + // The "REGISTER"/"DEREGISTER" command - if we implement it - may require access control: + if (!authenticationOK(cmd, urlSuffix, fullRequestStr)) return; + + // We implement the "REGISTER"/"DEREGISTER" command by first replying to it, then actually + // handling it (in a separate event-loop task, that will get called after the reply has + // been done). + // Hack: If we're going to reuse the command's connection for subsequent RTSP commands, then we + // delay the actual handling of the command slightly, to make it less likely that the first + // subsequent RTSP command (e.g., "DESCRIBE") will end up in the client's reponse buffer before + // the socket (at the far end) gets reused for RTSP command handling. + setRTSPResponse(responseStr == NULL ? "200 OK" : responseStr); + delete[] responseStr; + + ParamsForREGISTER* registerParams = new ParamsForREGISTER(cmd, this, url, urlSuffix, reuseConnection, deliverViaTCP, proxyURLSuffix); + envir().taskScheduler().scheduleDelayedTask(reuseConnection ? DELAY_USECS_AFTER_REGISTER_RESPONSE : 0, + (TaskFunc*)continueHandlingREGISTER, registerParams); + ++fScheduledDelayedTask; + } else if (responseStr != NULL) { + setRTSPResponse(responseStr); + delete[] responseStr; + } else { + handleCmd_notSupported(); + } +} + +// A special version of "parseTransportHeader()", used just for parsing the "Transport:" header in an incoming "REGISTER" command: +void parseTransportHeaderForREGISTER(char const* buf, + Boolean &reuseConnection, + Boolean& deliverViaTCP, + char*& proxyURLSuffix) { + // Initialize the result parameters to default values: + reuseConnection = False; + deliverViaTCP = False; + proxyURLSuffix = NULL; + + // First, find "Transport:" + while (1) { + if (*buf == '\0') return; // not found + if (*buf == '\r' && *(buf+1) == '\n' && *(buf+2) == '\r') return; // end of the headers => not found + if (_strncasecmp(buf, "Transport:", 10) == 0) break; + ++buf; + } + + // Then, run through each of the fields, looking for ones we handle: + char const* fields = buf + 10; + while (*fields == ' ') ++fields; + char* field = strDupSize(fields); + while (sscanf(fields, "%[^;\r\n]", field) == 1) { + if (strcmp(field, "reuse_connection") == 0) { + reuseConnection = True; + } else if (_strncasecmp(field, "preferred_delivery_protocol=udp", 31) == 0) { + deliverViaTCP = False; + } else if (_strncasecmp(field, "preferred_delivery_protocol=interleaved", 39) == 0) { + deliverViaTCP = True; + } else if (_strncasecmp(field, "proxy_url_suffix=", 17) == 0) { + delete[] proxyURLSuffix; + proxyURLSuffix = strDup(field+17); + } + + fields += strlen(field); + while (*fields == ';' || *fields == ' ' || *fields == '\t') ++fields; // skip over separating ';' chars or whitespace + if (*fields == '\0' || *fields == '\r' || *fields == '\n') break; + } + delete[] field; +} + +void RTSPServer::RTSPClientConnection::continueHandlingREGISTER(ParamsForREGISTER* params) { + params->fOurConnection->continueHandlingREGISTER1(params); +} + +void RTSPServer::RTSPClientConnection::continueHandlingREGISTER1(ParamsForREGISTER* params) { + --fScheduledDelayedTask; + + // Reuse our socket if requested: + int socketNumToBackEndServer = params->fReuseConnection ? fClientOutputSocket : -1; + + RTSPServer* ourServer = &fOurRTSPServer; // copy the pointer now, in case we "delete this" below + + if (socketNumToBackEndServer >= 0) { + // Because our socket will no longer be used by the server to handle incoming requests, we can now delete this + // "RTSPClientConnection" object. We do this now, in case the "implementCmd_REGISTER()" call below would also end up + // deleting this. + fClientInputSocket = fClientOutputSocket = -1; // so the socket doesn't get closed when we get deleted + delete this; + } else if (!fIsActive && fRecursionCount <= 0 && fScheduledDelayedTask <= 0) { + delete this; + } + + ourServer->implementCmd_REGISTER(params->fCmd, + params->fURL, params->fURLSuffix, socketNumToBackEndServer, + params->fDeliverViaTCP, params->fProxyURLSuffix); + delete params; +} + + +///////// RTSPServerWithREGISTERProxying implementation ///////// + +RTSPServerWithREGISTERProxying* RTSPServerWithREGISTERProxying +::createNew(UsageEnvironment& env, Port ourPort, + UserAuthenticationDatabase* authDatabase, UserAuthenticationDatabase* authDatabaseForREGISTER, + unsigned reclamationSeconds, + Boolean streamRTPOverTCP, int verbosityLevelForProxying, + char const* backEndUsername, char const* backEndPassword) { + int ourSocketIPv4 = setUpOurSocket(env, ourPort, AF_INET); + int ourSocketIPv6 = setUpOurSocket(env, ourPort, AF_INET6); + if (ourSocketIPv4 < 0 && ourSocketIPv6 < 0) return NULL; + + return new RTSPServerWithREGISTERProxying(env, ourSocketIPv4, ourSocketIPv6, ourPort, + authDatabase, authDatabaseForREGISTER, + reclamationSeconds, + streamRTPOverTCP, verbosityLevelForProxying, + backEndUsername, backEndPassword); +} + +RTSPServerWithREGISTERProxying +::RTSPServerWithREGISTERProxying(UsageEnvironment& env, int ourSocketIPv4, int ourSocketIPv6, Port ourPort, + UserAuthenticationDatabase* authDatabase, UserAuthenticationDatabase* authDatabaseForREGISTER, + unsigned reclamationSeconds, + Boolean streamRTPOverTCP, int verbosityLevelForProxying, + char const* backEndUsername, char const* backEndPassword) + : RTSPServer(env, ourSocketIPv4, ourSocketIPv6, ourPort, authDatabase, reclamationSeconds), + fStreamRTPOverTCP(streamRTPOverTCP), fVerbosityLevelForProxying(verbosityLevelForProxying), + fRegisteredProxyCounter(0), fAllowedCommandNames(NULL), fAuthDBForREGISTER(authDatabaseForREGISTER), + fBackEndUsername(strDup(backEndUsername)), fBackEndPassword(strDup(backEndPassword)) { +} + +RTSPServerWithREGISTERProxying::~RTSPServerWithREGISTERProxying() { + delete[] fAllowedCommandNames; + delete[] fBackEndUsername; delete[] fBackEndPassword; +} + +char const* RTSPServerWithREGISTERProxying::allowedCommandNames() { + if (fAllowedCommandNames == NULL) { + char const* baseAllowedCommandNames = RTSPServer::allowedCommandNames(); + char const* newAllowedCommandName = ", REGISTER, DEREGISTER"; + fAllowedCommandNames = new char[strlen(baseAllowedCommandNames) + strlen(newAllowedCommandName) + 1/* for '\0' */]; + sprintf(fAllowedCommandNames, "%s%s", baseAllowedCommandNames, newAllowedCommandName); + } + return fAllowedCommandNames; +} + +Boolean RTSPServerWithREGISTERProxying +::weImplementREGISTER(char const* cmd/*"REGISTER" or "DEREGISTER"*/, + char const* proxyURLSuffix, char*& responseStr) { + // First, check whether we have already proxied a stream as "proxyURLSuffix": + if (proxyURLSuffix != NULL) { + ServerMediaSession* sms = getServerMediaSession(proxyURLSuffix); + if ((strcmp(cmd, "REGISTER") == 0 && sms != NULL) || + (strcmp(cmd, "DEREGISTER") == 0 && sms == NULL)) { + responseStr = strDup("451 Invalid parameter"); + return False; + } + } + + // Otherwise, we will implement it: + responseStr = NULL; + return True; +} + +void RTSPServerWithREGISTERProxying +::implementCmd_REGISTER(char const* cmd/*"REGISTER" or "DEREGISTER"*/, + char const* url, char const* /*urlSuffix*/, int socketToRemoteServer, + Boolean deliverViaTCP, char const* proxyURLSuffix) { + // Continue setting up proxying for the specified URL. + // By default: + // - We use "registeredProxyStream-N" as the (front-end) stream name (ignoring the back-end stream's 'urlSuffix'), + // unless "proxyURLSuffix" is non-NULL (in which case we use that) + // - There is no 'username' and 'password' for the back-end stream. (Thus, access-controlled back-end streams will fail.) + // - If "fStreamRTPOverTCP" is True, then we request delivery over TCP, regardless of the value of "deliverViaTCP". + // (Otherwise, if "fStreamRTPOverTCP" is False, we use the value of "deliverViaTCP" to decide this.) + // To change this default behavior, you will need to subclass "RTSPServerWithREGISTERProxying", and reimplement this function. + + char const* proxyStreamName; + char proxyStreamNameBuf[100]; + if (proxyURLSuffix == NULL) { + sprintf(proxyStreamNameBuf, "registeredProxyStream-%u", ++fRegisteredProxyCounter); + proxyStreamName = proxyStreamNameBuf; + } else { + proxyStreamName = proxyURLSuffix; + } + + if (strcmp(cmd, "REGISTER") == 0) { + if (fStreamRTPOverTCP) deliverViaTCP = True; + portNumBits tunnelOverHTTPPortNum = deliverViaTCP ? (portNumBits)(~0) : 0; + // We don't support streaming from the back-end via RTSP/RTP/RTCP-over-HTTP; only via RTP/RTCP-over-TCP or RTP/RTCP-over-UDP + + ServerMediaSession* sms + = ProxyServerMediaSession::createNew(envir(), this, url, proxyStreamName, + fBackEndUsername, fBackEndPassword, + tunnelOverHTTPPortNum, fVerbosityLevelForProxying, socketToRemoteServer); + addServerMediaSession(sms); + + // (Regardless of the verbosity level) announce the fact that we're proxying this new stream, and the URL to use to access it: + char* proxyStreamURL = rtspURL(sms); + envir() << "Proxying the registered back-end stream \"" << url << "\".\n"; + envir() << "\tPlay this stream using the URL: " << proxyStreamURL << "\n"; + delete[] proxyStreamURL; + } else { // "DEREGISTER" + // deleteServerMediaSession(lookupServerMediaSession(proxyStreamName)); + lookupServerMediaSession(proxyStreamName, &GenericMediaServer::deleteServerMediaSession); + } +} + +UserAuthenticationDatabase* RTSPServerWithREGISTERProxying::getAuthenticationDatabaseForCommand(char const* cmdName) { + if (strcmp(cmdName, "REGISTER") == 0) return fAuthDBForREGISTER; + + return RTSPServer::getAuthenticationDatabaseForCommand(cmdName); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/RawVideoRTPSink.cpp b/src/big/mpp/middleware/src/live555/liveMedia/RawVideoRTPSink.cpp new file mode 100644 index 000000000..266b32c5f --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/RawVideoRTPSink.cpp @@ -0,0 +1,319 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP sink for Raw video +// Implementation + +#include "RawVideoRTPSink.hh" + +RawVideoRTPSink* RawVideoRTPSink +::createNew(UsageEnvironment& env, Groupsock* RTPgs, u_int8_t rtpPayloadFormat, + unsigned width, unsigned height, unsigned depth, + char const* sampling, char const* colorimetry) { + if (sampling == NULL || colorimetry == NULL) return NULL; + + return new RawVideoRTPSink(env, RTPgs, + rtpPayloadFormat, + width, height, depth, + sampling, colorimetry); +} + +RawVideoRTPSink +::RawVideoRTPSink(UsageEnvironment& env, Groupsock* RTPgs, u_int8_t rtpPayloadFormat, + unsigned width, unsigned height, unsigned depth, + char const* sampling, char const* colorimetry) + : VideoRTPSink(env, RTPgs, rtpPayloadFormat, 90000, "RAW"), + fLineIndex(0), fP(width, height, depth, sampling) { + + // Construct our "a=fmtp:" SDP line: + // ASSERT: sampling != NULL && colorimetry != NULL + unsigned const fmtpSDPLineMaxSize + = 200 + strlen(sampling) + strlen(colorimetry); // more than enough space + fFmtpSDPLine = new char[fmtpSDPLineMaxSize]; + sprintf(fFmtpSDPLine, "a=fmtp:%d sampling=%s;width=%u;height=%u;depth=%u;colorimetry=%s\r\n", + rtpPayloadType(), sampling, width, height, depth, colorimetry); +} + +RawVideoRTPSink::~RawVideoRTPSink() { + delete[] fFmtpSDPLine; +} + +char const* RawVideoRTPSink::auxSDPLine() { + return fFmtpSDPLine; +} + +void RawVideoRTPSink +::doSpecialFrameHandling(unsigned fragmentationOffset, + unsigned char* frameStart, + unsigned numBytesInFrame, + struct timeval framePresentationTime, + unsigned numRemainingBytes) { + u_int16_t* lengths; + u_int16_t* offsets; + unsigned numLines = getNumLinesInPacket(fragmentationOffset, lengths, offsets); + unsigned specialHeaderSize = 2 + (6 * numLines); + u_int8_t* specialHeader = new u_int8_t[specialHeaderSize]; + + // Extended Sequence Number (not used) + specialHeader[0] = specialHeader[1] = 0; + + unsigned index = 2; + for (unsigned i = 0; i < numLines; ++i) { + // Increment line number if necessary: + if ((offsets[i] == 0) && fragmentationOffset != 0) { + fLineIndex += fP.scanLineIterationStep; + } + + // Set length: + specialHeader[index++] = lengths[i]>>8; + specialHeader[index++] = (u_int8_t)lengths[i]; + + // Set field+line index: + u_int8_t const fieldIdent = 0; // we assume non-interlaced video + specialHeader[index++] = ((fLineIndex>>8) & 0x7F) | (fieldIdent<<7); + specialHeader[index++] = (u_int8_t)fLineIndex; + + // Set continuation+offset: + u_int8_t const continuationBit = i < numLines - 1; + specialHeader[index++] = ((offsets[i]>>8) & 0x7F) | (continuationBit<<7); + specialHeader[index++] = (u_int8_t)offsets[i]; + } + + setSpecialHeaderBytes(specialHeader, specialHeaderSize); + + if (numRemainingBytes == 0) { + // This packet contains the last (or only) fragment of the frame. + // Set the RTP 'M' ('marker') bit: + setMarkerBit(); + // Reset line index + fLineIndex = 0; + } + + // Also set the RTP timestamp: + setTimestamp(framePresentationTime); + + delete[] specialHeader; + delete[] lengths; + delete[] offsets; +} + +Boolean RawVideoRTPSink::frameCanAppearAfterPacketStart(unsigned char const* /*frameStart*/, + unsigned /*numBytesInFrame*/) const { + // Only one frame per packet: + return False; +} + +unsigned RawVideoRTPSink::specialHeaderSize() const { + u_int16_t* lengths; + u_int16_t* offsets; + unsigned numLines = getNumLinesInPacket(curFragmentationOffset(), lengths, offsets); + delete[] lengths; + delete[] offsets; + return 2 + (6 * numLines); +} + +unsigned RawVideoRTPSink +::getNumLinesInPacket(unsigned fragOffset, u_int16_t*& lengths, u_int16_t*& offsets) const { + lengths = offsets = NULL; // initially + + unsigned const rtpHeaderSize = 12; + unsigned specialHeaderSize = 2; // Extended Sequence Number + unsigned const packetMaxSize = ourMaxPacketSize(); + unsigned numLines = 0; + unsigned remainingSizeInPacket; + + if (fragOffset >= fP.frameSize) { + envir() << "RawVideoRTPSink::getNumLinesInPacket(): bad fragOffset " << fragOffset << "\n"; + return 0; + } + + #define MAX_LINES_IN_PACKET 100 + u_int16_t lengthArray[MAX_LINES_IN_PACKET] = {0}; + u_int16_t offsetArray[MAX_LINES_IN_PACKET] = {0}; + unsigned curDataTotalLength = 0; + unsigned offsetWithinLine = fragOffset % fP.scanLineSize; + unsigned remainingLineSize = fP.scanLineSize - offsetWithinLine; + + while (1) { + if (packetMaxSize - specialHeaderSize - rtpHeaderSize - 6 <= curDataTotalLength) { + break; // packet sanity check + } + + // add one line + if (++numLines > MAX_LINES_IN_PACKET) return 0; + specialHeaderSize += 6; + + remainingSizeInPacket = packetMaxSize - specialHeaderSize - rtpHeaderSize - curDataTotalLength; + remainingSizeInPacket -= remainingSizeInPacket % fP.pgroupSize; // use only multiple of pgroup + lengthArray[numLines-1] = remainingLineSize < remainingSizeInPacket ? remainingLineSize : remainingSizeInPacket; + offsetArray[numLines-1] = (offsetWithinLine * fP.numPixelsInPgroup) / fP.pgroupSize; + // Note that the offsets are in specified to be in pixels (not octets, nor pgroups) + if (remainingLineSize >= remainingSizeInPacket) { + break; // packet is full + } + + // All subsequent lines in the packet will have offset 0 + curDataTotalLength += lengthArray[numLines-1]; + offsetWithinLine = 0; + remainingLineSize = fP.scanLineSize; + + if (fragOffset + curDataTotalLength >= fP.frameSize) { + break; // end of the frame. + } + } + + lengths = new u_int16_t[numLines]; + offsets = new u_int16_t[numLines]; + for (unsigned i = 0; i < numLines; i++) { + lengths[i] = lengthArray[i]; + offsets[i] = offsetArray[i]; + } + + return numLines; +} + +unsigned RawVideoRTPSink::computeOverflowForNewFrame(unsigned newFrameSize) const { + unsigned initialOverflow = MultiFramedRTPSink::computeOverflowForNewFrame(newFrameSize); + + // Adjust (increase) this overflow to be a multiple of the pgroup value: + unsigned numFrameBytesUsed = newFrameSize - initialOverflow; + initialOverflow += numFrameBytesUsed % fP.pgroupSize; + + return initialOverflow; +} + + +///////// RawVideoFrameParameters implementation ///////// + +RawVideoFrameParameters +::RawVideoFrameParameters(unsigned width, unsigned height, unsigned depth, char const* sampling) { + scanLineIterationStep = 1; // by default; different for YCbCr-4:2:0 + numPixelsInPgroup = 1; // by default + pgroupSize = 2; // use this for unknown (sampling, depth)s + + if (strcmp(sampling, "RGB") == 0 || strcmp(sampling, "BGR") == 0) { + switch (depth) { + case 8: + pgroupSize = 3; + break; + case 10: + pgroupSize = 15; + numPixelsInPgroup = 4; + break; + case 12: + pgroupSize = 9; + numPixelsInPgroup = 2; + break; + case 16: + pgroupSize = 6; + break; + } + } else if (strcmp(sampling, "RGBA") == 0 || strcmp(sampling, "BGRA") == 0) { + switch (depth) { + case 8: + pgroupSize = 4; + break; + case 10: + pgroupSize = 5; + break; + case 12: + pgroupSize = 6; + break; + case 16: + pgroupSize = 8; + break; + } + } else if (strcmp(sampling, "YCbCr-4:4:4") == 0) { + switch (depth) { + case 8: + pgroupSize = 3; + break; + case 10: + pgroupSize = 15; + numPixelsInPgroup = 4; + break; + case 12: + pgroupSize = 9; + numPixelsInPgroup = 2; + break; + case 16: + pgroupSize = 6; + break; + } + } else if (strcmp(sampling, "YCbCr-4:2:2") == 0) { + switch (depth) { + case 8: + pgroupSize = 4; + break; + case 10: + pgroupSize = 5; + break; + case 12: + pgroupSize = 6; + break; + case 16: + pgroupSize = 8; + break; + } + numPixelsInPgroup = 2; + } else if (strcmp(sampling, "YCbCr-4:1:1") == 0) { + switch (depth) { + case 8: + pgroupSize = 6; + break; + case 10: + pgroupSize = 15; + break; + case 12: + pgroupSize = 9; + break; + case 16: + pgroupSize = 12; + break; + } + numPixelsInPgroup = 4; + } else if (strcmp(sampling, "YCbCr-4:2:0") == 0) { + switch (depth) { + case 8: + pgroupSize = 6; + break; + case 10: + pgroupSize = 15; + break; + case 12: + pgroupSize = 9; + break; + case 16: + pgroupSize = 12; + break; + } + numPixelsInPgroup = 4; + scanLineIterationStep = 2; + } + + unsigned const numPgroupsPerScanLine + = (width*scanLineIterationStep + (numPixelsInPgroup-1))/numPixelsInPgroup; + // Note: This rounds up to the next 'pgroup'; see RFC 4175, section 4.3, paragraph 2 + + scanLineSize = numPgroupsPerScanLine*pgroupSize; + // Note: This is actually the size of 'scanLineIterationStep' scan lines + + frameSize = (height*scanLineSize)/scanLineIterationStep; +} + +RawVideoFrameParameters::~RawVideoFrameParameters() { +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/RawVideoRTPSource.cpp b/src/big/mpp/middleware/src/live555/liveMedia/RawVideoRTPSource.cpp new file mode 100644 index 000000000..767838a4b --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/RawVideoRTPSource.cpp @@ -0,0 +1,187 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Raw Video RTP Sources (RFC 4175) +// Implementation + +#include "RawVideoRTPSource.hh" + +////////// RawVideoBufferedPacket and RawVideoBufferedPacketFactory ////////// + +class RawVideoBufferedPacket: public BufferedPacket { +public: + RawVideoBufferedPacket(RawVideoRTPSource* ourSource); + virtual ~RawVideoBufferedPacket(); + +private: // redefined virtual functions + virtual void getNextEnclosedFrameParameters(unsigned char*& framePtr, + unsigned dataSize, + unsigned& frameSize, + unsigned& frameDurationInMicroseconds); +private: + RawVideoRTPSource* fOurSource; +}; + +class RawVideoBufferedPacketFactory: public BufferedPacketFactory { +private: // redefined virtual functions + virtual BufferedPacket* createNewPacket(MultiFramedRTPSource* ourSource); +}; + + +////////// LineHeader ////////// + +struct LineHeader { + u_int16_t length; + u_int16_t fieldIdAndLineNumber; + u_int16_t offsetWithinLine; +}; + + +///////// RawVideoRTPSource implementation (RFC 4175) //////// + +RawVideoRTPSource* +RawVideoRTPSource::createNew(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency) { + return new RawVideoRTPSource(env, RTPgs, rtpPayloadFormat, rtpTimestampFrequency); +} + +RawVideoRTPSource +::RawVideoRTPSource(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency) + : MultiFramedRTPSource(env, RTPgs, rtpPayloadFormat, rtpTimestampFrequency, + new RawVideoBufferedPacketFactory), + fNumLines(0), fNextLine(0), fLineHeaders(NULL) { +} + +RawVideoRTPSource::~RawVideoRTPSource() { + delete[] fLineHeaders; +} + +u_int16_t RawVideoRTPSource::currentLineNumber() const { + if (fNextLine == 0 || fLineHeaders == NULL) return 0; // we've called this function too soon! + return fLineHeaders[fNextLine-1].fieldIdAndLineNumber&0x7FFF; +} + +u_int8_t RawVideoRTPSource::currentLineFieldId() const { + if (fNextLine == 0 || fLineHeaders == NULL) return 0; // we've called this function too soon! + return (fLineHeaders[fNextLine-1].fieldIdAndLineNumber&0x8000)>>15; +} + +u_int16_t RawVideoRTPSource::currentOffsetWithinLine() const { + if (fNextLine == 0 || fLineHeaders == NULL) return 0; // we've called this function too soon! + return fLineHeaders[fNextLine-1].offsetWithinLine; +} + +Boolean RawVideoRTPSource +::processSpecialHeader(BufferedPacket* packet, + unsigned& resultSpecialHeaderSize) { + + unsigned char* headerStart = packet->data(); + unsigned packetSize = packet->dataSize(); + + // The first 2 bytes of the header are the "Extended Sequence Number". + // In the current implementation, we ignore this. + if (packetSize < 2) return False; + headerStart += 2; + unsigned char* lineHeaderStart = headerStart; + packetSize -= 2; + + // The rest of the header should consist of N*6 bytes (with N >= 1) for each line included. + // Count how many of these there are: + unsigned numLines = 0; + while (1) { + if (packetSize < 6) return False; // there's not enough room for another line header + ++numLines; + Boolean continuationBit = (headerStart[4]&0x80)>>7; + headerStart += 6; + packetSize -= 6; + + // Check the "C" (continuation) bit of this header to see whether any more line headers follow: + if (continuationBit == 0) break; // no more line headers follow + } + + // We now know how many lines are contained in this payload. Allocate and fill in "fLineHeaders": + fNumLines = numLines; // ASSERT: >= 1 + fNextLine = 0; + delete[] fLineHeaders; fLineHeaders = new LineHeader[fNumLines]; + unsigned totalLength = 0; + for (unsigned i = 0; i < fNumLines; ++i) { + fLineHeaders[i].length = (lineHeaderStart[0]<<8) + lineHeaderStart[1]; + totalLength += fLineHeaders[i].length; + fLineHeaders[i].fieldIdAndLineNumber = (lineHeaderStart[2]<<8) + lineHeaderStart[3]; + fLineHeaders[i].offsetWithinLine = ((lineHeaderStart[4]&0x7F)<<8) + lineHeaderStart[5]; + lineHeaderStart += 6; + } + + // Make sure that we have enough bytes for all of the line lengths promised: + if (totalLength > packetSize) { + fNumLines = 0; + delete[] fLineHeaders; fLineHeaders = NULL; + return False; + } + + // Everything looks good: + fCurrentPacketBeginsFrame + = (fLineHeaders[0].fieldIdAndLineNumber&0x7FFF) == 0 && fLineHeaders[0].offsetWithinLine == 0; + // Don't set "fCurrentPacketCompletesFrame" until we've processed the last line in the packet + resultSpecialHeaderSize = headerStart - packet->data(); + return True; +} + +char const* RawVideoRTPSource::MIMEtype() const { + return "video/RAW"; +} + + +////////// RawVideoBufferedPacket and RawVideoBufferedPacketFactory implementation ////////// + +RawVideoBufferedPacket +::RawVideoBufferedPacket(RawVideoRTPSource* ourSource) + : fOurSource(ourSource) { +} + +RawVideoBufferedPacket::~RawVideoBufferedPacket() { +} + +void RawVideoBufferedPacket::getNextEnclosedFrameParameters(unsigned char*& /*framePtr*/, + unsigned dataSize, + unsigned& frameSize, + unsigned& frameDurationInMicroseconds) { + frameDurationInMicroseconds = 0; // because all lines within the same packet are from the same frame + + if (fOurSource->fNextLine >= fOurSource->fNumLines) { + fOurSource->envir() << "RawVideoBufferedPacket::nextEnclosedFrameParameters(" + << dataSize << "): data error (" + << fOurSource->fNextLine << " >= " << fOurSource->fNumLines << ")!\n"; + frameSize = dataSize; + return; + } + + // This line ('subframe') completes a frame if it's the last line in the packet, + // and the packet's 'M' bit was set: + fOurSource->fCurrentPacketCompletesFrame + = fOurSource->fCurPacketMarkerBit && fOurSource->fNextLine == fOurSource->fNumLines-1; + + frameSize = fOurSource->fLineHeaders[fOurSource->fNextLine++].length; +} + +BufferedPacket* RawVideoBufferedPacketFactory +::createNewPacket(MultiFramedRTPSource* ourSource) { + return new RawVideoBufferedPacket((RawVideoRTPSource*)ourSource); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/SIPClient.cpp b/src/big/mpp/middleware/src/live555/liveMedia/SIPClient.cpp new file mode 100644 index 000000000..a1226073f --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/SIPClient.cpp @@ -0,0 +1,977 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A generic SIP client +// Implementation + +#include "SIPClient.hh" +#include "GroupsockHelper.hh" + +#if defined(__WIN32__) || defined(_WIN32) || defined(_QNX4) +#define _strncasecmp _strnicmp +#else +#define _strncasecmp strncasecmp +#endif + +////////// SIPClient ////////// + +SIPClient* SIPClient +::createNew(UsageEnvironment& env, + unsigned char desiredAudioRTPPayloadFormat, + char const* mimeSubtype, + int verbosityLevel, char const* applicationName) { + return new SIPClient(env, desiredAudioRTPPayloadFormat, mimeSubtype, + verbosityLevel, applicationName); +} + +void SIPClient::setUserAgentString(char const* userAgentName) { + if (userAgentName == NULL) return; + + // Change the existing user agent header string: + char const* const formatStr = "User-Agent: %s\r\n"; + unsigned const headerSize = strlen(formatStr) + strlen(userAgentName); + delete[] fUserAgentHeaderStr; + fUserAgentHeaderStr = new char[headerSize]; + sprintf(fUserAgentHeaderStr, formatStr, userAgentName); + fUserAgentHeaderStrLen = strlen(fUserAgentHeaderStr); +} + +SIPClient::SIPClient(UsageEnvironment& env, + unsigned char desiredAudioRTPPayloadFormat, + char const* mimeSubtype, + int verbosityLevel, char const* applicationName) + : Medium(env), + fT1(500000 /* 500 ms */), + fDesiredAudioRTPPayloadFormat(desiredAudioRTPPayloadFormat), + fVerbosityLevel(verbosityLevel), fCSeq(0), + fUserAgentHeaderStr(NULL), fUserAgentHeaderStrLen(0), + fURL(NULL), fURLSize(0), + fToTagStr(NULL), fToTagStrSize(0), + fUserName(NULL), fUserNameSize(0), + fInviteSDPDescription(NULL), fInviteSDPDescriptionReturned(NULL), + fInviteCmd(NULL), fInviteCmdSize(0) { + if (mimeSubtype == NULL) mimeSubtype = ""; + fMIMESubtype = strDup(mimeSubtype); + fMIMESubtypeSize = strlen(fMIMESubtype); + + if (applicationName == NULL) applicationName = ""; + fApplicationName = strDup(applicationName); + fApplicationNameSize = strlen(fApplicationName); + + struct sockaddr_storage ourAddress; + ourAddress.ss_family = AF_INET; // Later, fix to support IPv6 + ((struct sockaddr_in&)ourAddress).sin_addr.s_addr = ourIPv4Address(env); + fOurAddressStr = strDup(AddressString(ourAddress).val()); + fOurAddressStrSize = strlen(fOurAddressStr); + + fOurSocket = new Groupsock(env, ourAddress, 0, 255); + if (fOurSocket == NULL) { + env << "ERROR: Failed to create socket for addr " + << fOurAddressStr << ": " + << env.getResultMsg() << "\n"; + } + + // Now, find out our source port number. Hack: Do this by first trying to + // send a 0-length packet, so that the "getSourcePort()" call will work. + fOurSocket->output(envir(), (unsigned char*)"", 0); + Port srcPort(0); + getSourcePort(env, fOurSocket->socketNum(), AF_INET, srcPort); // later, allow for IPv6 + if (srcPort.num() != 0) { + fOurPortNum = ntohs(srcPort.num()); + } else { + // No luck. Try again using a default port number: + fOurPortNum = 5060; + delete fOurSocket; + fOurSocket = new Groupsock(env, ourAddress, fOurPortNum, 255); + if (fOurSocket == NULL) { + env << "ERROR: Failed to create socket for addr " + << fOurAddressStr << ", port " + << fOurPortNum << ": " + << env.getResultMsg() << "\n"; + } + } + + // Set the "User-Agent:" header to use in each request: + char const* const libName = "LIVE555 Streaming Media v"; + char const* const libVersionStr = LIVEMEDIA_LIBRARY_VERSION_STRING; + char const* libPrefix; char const* libSuffix; + if (applicationName == NULL || applicationName[0] == '\0') { + applicationName = libPrefix = libSuffix = ""; + } else { + libPrefix = " ("; + libSuffix = ")"; + } + unsigned userAgentNameSize + = fApplicationNameSize + strlen(libPrefix) + strlen(libName) + strlen(libVersionStr) + strlen(libSuffix) + 1; + char* userAgentName = new char[userAgentNameSize]; + sprintf(userAgentName, "%s%s%s%s%s", + applicationName, libPrefix, libName, libVersionStr, libSuffix); + setUserAgentString(userAgentName); + delete[] userAgentName; + + reset(); +} + +SIPClient::~SIPClient() { + reset(); + + delete[] fUserAgentHeaderStr; + delete fOurSocket; + delete[] (char*)fOurAddressStr; + delete[] (char*)fApplicationName; + delete[] (char*)fMIMESubtype; +} + +void SIPClient::reset() { + fWorkingAuthenticator = NULL; + delete[] fInviteCmd; fInviteCmd = NULL; fInviteCmdSize = 0; + delete[] fInviteSDPDescription; fInviteSDPDescription = NULL; + + delete[] (char*)fUserName; fUserName = strDup(fApplicationName); + fUserNameSize = strlen(fUserName); + + fValidAuthenticator.reset(); + + delete[] (char*)fToTagStr; fToTagStr = NULL; fToTagStrSize = 0; + fServerPortNum = 0; + fServerAddressIsSet = False; + delete[] (char*)fURL; fURL = NULL; fURLSize = 0; +} + +void SIPClient::setProxyServer(struct sockaddr_storage const& proxyServerAddress, + portNumBits proxyServerPortNum) { + fServerAddress = proxyServerAddress; + fServerAddressIsSet = True; + + fServerPortNum = proxyServerPortNum; + + if (fOurSocket != NULL) { + fOurSocket->changeDestinationParameters(fServerAddress, fServerPortNum, 255); + } +} + +static char* getLine(char* startOfLine) { + // returns the start of the next line, or NULL if none + for (char* ptr = startOfLine; *ptr != '\0'; ++ptr) { + if (*ptr == '\r' || *ptr == '\n') { + // We found the end of the line + *ptr++ = '\0'; + if (*ptr == '\n') ++ptr; + return ptr; + } + } + + return NULL; +} + +char* SIPClient::invite(char const* url, Authenticator* authenticator) { + // First, check whether "url" contains a username:password to be used: + char* username; char* password; + if (authenticator == NULL + && parseSIPURLUsernamePassword(url, username, password)) { + char* result = inviteWithPassword(url, username, password); + delete[] username; delete[] password; // they were dynamically allocated + return result; + } + + if (!processURL(url)) return NULL; + + delete[] (char*)fURL; fURL = strDup(url); + fURLSize = strlen(fURL); + + fCallId = our_random32(); + fFromTag = our_random32(); + + return invite1(authenticator); +} + +char* SIPClient::invite1(Authenticator* authenticator) { + do { + // Send the INVITE command: + + // First, construct an authenticator string: + fValidAuthenticator.reset(); + fWorkingAuthenticator = authenticator; + char* authenticatorStr + = createAuthenticatorString(fWorkingAuthenticator, "INVITE", fURL); + + // Then, construct the SDP description to be sent in the INVITE: + char* rtpmapLine; + unsigned rtpmapLineSize; + if (fMIMESubtypeSize > 0) { + char const* const rtpmapFmt = + "a=rtpmap:%u %s/8000\r\n"; + unsigned rtpmapFmtSize = strlen(rtpmapFmt) + + 3 /* max char len */ + fMIMESubtypeSize; + rtpmapLine = new char[rtpmapFmtSize]; + sprintf(rtpmapLine, rtpmapFmt, + fDesiredAudioRTPPayloadFormat, fMIMESubtype); + rtpmapLineSize = strlen(rtpmapLine); + } else { + // Static payload type => no "a=rtpmap:" line + rtpmapLine = strDup(""); + rtpmapLineSize = 0; + } + char const* const inviteSDPFmt = + "v=0\r\n" + "o=- %u %u IN IP4 %s\r\n" + // Later, use "IP6" if our address is IPv6-only + "s=%s session\r\n" + "c=IN IP4 %s\r\n" + // Later, use "IP6" if our address is IPv6-only + "t=0 0\r\n" + "m=audio %u RTP/AVP %u\r\n" + "%s"; + unsigned inviteSDPFmtSize = strlen(inviteSDPFmt) + + 20 /* max int len */ + 20 + fOurAddressStrSize + + fApplicationNameSize + + fOurAddressStrSize + + 5 /* max short len */ + 3 /* max char len */ + + rtpmapLineSize; + delete[] fInviteSDPDescription; + fInviteSDPDescription = new char[inviteSDPFmtSize]; + sprintf(fInviteSDPDescription, inviteSDPFmt, + fCallId, fCSeq, fOurAddressStr, + fApplicationName, + fOurAddressStr, + fClientStartPortNum, fDesiredAudioRTPPayloadFormat, + rtpmapLine); + unsigned inviteSDPSize = strlen(fInviteSDPDescription); + delete[] rtpmapLine; + + char const* const cmdFmt = + "INVITE %s SIP/2.0\r\n" + "From: %s ;tag=%u\r\n" + "Via: SIP/2.0/UDP %s:%u\r\n" + "Max-Forwards: 70\r\n" + "To: %s\r\n" + "Contact: sip:%s@%s:%u\r\n" + "Call-ID: %u@%s\r\n" + "CSeq: %d INVITE\r\n" + "Content-Type: application/sdp\r\n" + "%s" /* Proxy-Authorization: line (if any) */ + "%s" /* User-Agent: line */ + "Content-Length: %d\r\n\r\n" + "%s"; + unsigned inviteCmdSize = strlen(cmdFmt) + + fURLSize + + 2*fUserNameSize + fOurAddressStrSize + 20 /* max int len */ + + fOurAddressStrSize + 5 /* max port len */ + + fURLSize + + fUserNameSize + fOurAddressStrSize + 5 + + 20 + fOurAddressStrSize + + 20 + + strlen(authenticatorStr) + + fUserAgentHeaderStrLen + + 20 + + inviteSDPSize; + delete[] fInviteCmd; fInviteCmd = new char[inviteCmdSize]; + sprintf(fInviteCmd, cmdFmt, + fURL, + fUserName, fUserName, fOurAddressStr, fFromTag, + fOurAddressStr, fOurPortNum, + fURL, + fUserName, fOurAddressStr, fOurPortNum, + fCallId, fOurAddressStr, + ++fCSeq, + authenticatorStr, + fUserAgentHeaderStr, + inviteSDPSize, + fInviteSDPDescription); + fInviteCmdSize = strlen(fInviteCmd); + delete[] authenticatorStr; + + // Before sending the "INVITE", arrange to handle any response packets, + // and set up timers: + fInviteClientState = Calling; + fEventLoopStopFlag = 0; + TaskScheduler& sched = envir().taskScheduler(); // abbrev. + sched.turnOnBackgroundReadHandling(fOurSocket->socketNum(), + &inviteResponseHandler, this); + fTimerALen = 1*fT1; // initially + fTimerACount = 0; // initially + fTimerA = sched.scheduleDelayedTask(fTimerALen, timerAHandler, this); + fTimerB = sched.scheduleDelayedTask(64*fT1, timerBHandler, this); + fTimerD = NULL; // for now + + if (!sendINVITE()) break; + + // Enter the event loop, to handle response packets, and timeouts: + envir().taskScheduler().doEventLoop(&fEventLoopStopFlag); + + // We're finished with this "INVITE". + // Turn off response handling and timers: + sched.turnOffBackgroundReadHandling(fOurSocket->socketNum()); + sched.unscheduleDelayedTask(fTimerA); + sched.unscheduleDelayedTask(fTimerB); + sched.unscheduleDelayedTask(fTimerD); + + // NOTE: We return the SDP description that we used in the "INVITE", + // not the one that we got from the server. + // ##### Later: match the codecs in the response (offer, answer) ##### + if (fInviteSDPDescription != NULL) { + return strDup(fInviteSDPDescription); + } + } while (0); + + return NULL; +} + +void SIPClient::inviteResponseHandler(void* clientData, int /*mask*/) { + SIPClient* client = (SIPClient*)clientData; + unsigned responseCode = client->getResponseCode(); + client->doInviteStateMachine(responseCode); +} + +// Special 'response codes' that represent timers expiring: +unsigned const timerAFires = 0xAAAAAAAA; +unsigned const timerBFires = 0xBBBBBBBB; +unsigned const timerDFires = 0xDDDDDDDD; + +void SIPClient::timerAHandler(void* clientData) { + SIPClient* client = (SIPClient*)clientData; + client->fTimerA = NULL; + if (client->fVerbosityLevel >= 1) { + client->envir() << "RETRANSMISSION " << ++client->fTimerACount + << ", after " << client->fTimerALen/1000000.0 + << " additional seconds\n"; + } + client->doInviteStateMachine(timerAFires); +} + +void SIPClient::timerBHandler(void* clientData) { + SIPClient* client = (SIPClient*)clientData; + client->fTimerB = NULL; + if (client->fVerbosityLevel >= 1) { + client->envir() << "RETRANSMISSION TIMEOUT, after " + << 64*client->fT1/1000000.0 << " seconds\n"; + fflush(stderr); + } + client->doInviteStateMachine(timerBFires); +} + +void SIPClient::timerDHandler(void* clientData) { + SIPClient* client = (SIPClient*)clientData; + client->fTimerD = NULL; + if (client->fVerbosityLevel >= 1) { + client->envir() << "TIMER D EXPIRED\n"; + } + client->doInviteStateMachine(timerDFires); +} + +void SIPClient::doInviteStateMachine(unsigned responseCode) { + // Implement the state transition diagram (RFC 3261, Figure 5) + TaskScheduler& sched = envir().taskScheduler(); // abbrev. + switch (fInviteClientState) { + case Calling: { + if (responseCode == timerAFires) { + // Restart timer A (with double the timeout interval): + fTimerALen *= 2; + fTimerA + = sched.scheduleDelayedTask(fTimerALen, timerAHandler, this); + + fInviteClientState = Calling; + if (!sendINVITE()) doInviteStateTerminated(0); + } else { + // Turn off timers A & B before moving to a new state: + sched.unscheduleDelayedTask(fTimerA); + sched.unscheduleDelayedTask(fTimerB); + + if (responseCode == timerBFires) { + envir().setResultMsg("No response from server"); + doInviteStateTerminated(0); + } else if (responseCode >= 100 && responseCode <= 199) { + fInviteClientState = Proceeding; + } else if (responseCode >= 200 && responseCode <= 299) { + doInviteStateTerminated(responseCode); + } else if (responseCode >= 400 && responseCode <= 499) { + doInviteStateTerminated(responseCode); + // this isn't what the spec says, but it seems right... + } else if (responseCode >= 300 && responseCode <= 699) { + fInviteClientState = Completed; + fTimerD + = sched.scheduleDelayedTask(32000000, timerDHandler, this); + if (!sendACK()) doInviteStateTerminated(0); + } + } + break; + } + + case Proceeding: { + if (responseCode >= 100 && responseCode <= 199) { + fInviteClientState = Proceeding; + } else if (responseCode >= 200 && responseCode <= 299) { + doInviteStateTerminated(responseCode); + } else if (responseCode >= 400 && responseCode <= 499) { + doInviteStateTerminated(responseCode); + // this isn't what the spec says, but it seems right... + } else if (responseCode >= 300 && responseCode <= 699) { + fInviteClientState = Completed; + fTimerD = sched.scheduleDelayedTask(32000000, timerDHandler, this); + if (!sendACK()) doInviteStateTerminated(0); + } + break; + } + + case Completed: { + if (responseCode == timerDFires) { + envir().setResultMsg("Transaction terminated"); + doInviteStateTerminated(0); + } else if (responseCode >= 300 && responseCode <= 699) { + fInviteClientState = Completed; + if (!sendACK()) doInviteStateTerminated(0); + } + break; + } + + case Terminated: { + doInviteStateTerminated(responseCode); + break; + } + } +} + +void SIPClient::doInviteStateTerminated(unsigned responseCode) { + fInviteClientState = Terminated; // FWIW... + if (responseCode < 200 || responseCode > 299) { + // We failed, so return NULL; + delete[] fInviteSDPDescription; fInviteSDPDescription = NULL; + delete[] fInviteSDPDescriptionReturned; fInviteSDPDescriptionReturned = NULL; + } + + // Unblock the event loop: + fEventLoopStopFlag = ~0; +} + +Boolean SIPClient::sendINVITE() { + if (!sendRequest(fInviteCmd, fInviteCmdSize)) { + envir().setResultErrMsg("INVITE send() failed: "); + return False; + } + return True; +} + +unsigned SIPClient::getResponseCode() { + unsigned responseCode = 0; + do { + // Get the response from the server: + unsigned const readBufSize = 10000; + char readBuffer[readBufSize+1]; char* readBuf = readBuffer; + + char* firstLine = NULL; + char* nextLineStart = NULL; + unsigned bytesRead = getResponse(readBuf, readBufSize); + if (bytesRead == 0) break; + if (fVerbosityLevel >= 1) { + envir() << "Received INVITE response: " << readBuf << "\n"; + } + + // Inspect the first line to get the response code: + firstLine = readBuf; + nextLineStart = getLine(firstLine); + if (!parseResponseCode(firstLine, responseCode)) break; + + if (responseCode != 200) { + if (responseCode >= 400 && responseCode <= 499 + && fWorkingAuthenticator != NULL) { + // We have an authentication failure, so fill in + // "*fWorkingAuthenticator" using the contents of a following + // "Proxy-Authenticate:" or "WWW-Authenticate:" line. (Once we compute a 'response' for + // "fWorkingAuthenticator", it can be used in a subsequent request + // - that will hopefully succeed.) + char* lineStart; + while (1) { + lineStart = nextLineStart; + if (lineStart == NULL) break; + + nextLineStart = getLine(lineStart); + if (lineStart[0] == '\0') break; // this is a blank line + + char* realm = strDupSize(lineStart); + char* nonce = strDupSize(lineStart); + // ##### Check for the format of "Proxy-Authenticate:" lines from + // ##### known server types. + // ##### This is a crock! We should make the parsing more general + Boolean foundAuthenticateHeader = False; + if ( + // Asterisk ##### + sscanf(lineStart, "Proxy-Authenticate: Digest realm=\"%[^\"]\", nonce=\"%[^\"]\"", + realm, nonce) == 2 || + sscanf(lineStart, "WWW-Authenticate: Digest realm=\"%[^\"]\", nonce=\"%[^\"]\"", + realm, nonce) == 2 || + // Cisco ATA ##### + sscanf(lineStart, "Proxy-Authenticate: Digest algorithm=MD5,domain=\"%*[^\"]\",nonce=\"%[^\"]\", realm=\"%[^\"]\"", + nonce, realm) == 2) { + fWorkingAuthenticator->setRealmAndNonce(realm, nonce); + foundAuthenticateHeader = True; + } + delete[] realm; delete[] nonce; + if (foundAuthenticateHeader) break; + } + } + envir().setResultMsg("cannot handle INVITE response: ", firstLine); + break; + } + + // Skip every subsequent header line, until we see a blank line. + // While doing so, check for "To:" and "Content-Length:" lines. + // The remaining data is assumed to be the SDP descriptor that we want. + // We should really do some more checking on the headers here - e.g., to + // check for "Content-type: application/sdp", "CSeq", etc. ##### + int contentLength = -1; + char* lineStart; + while (1) { + lineStart = nextLineStart; + if (lineStart == NULL) break; + + nextLineStart = getLine(lineStart); + if (lineStart[0] == '\0') break; // this is a blank line + + char* toTagStr = strDupSize(lineStart); + if (sscanf(lineStart, "To:%*[^;]; tag=%s", toTagStr) == 1) { + delete[] (char*)fToTagStr; fToTagStr = strDup(toTagStr); + fToTagStrSize = strlen(fToTagStr); + } + delete[] toTagStr; + + if (sscanf(lineStart, "Content-Length: %d", &contentLength) == 1 + || sscanf(lineStart, "Content-length: %d", &contentLength) == 1) { + if (contentLength < 0) { + envir().setResultMsg("Bad \"Content-Length:\" header: \"", + lineStart, "\""); + break; + } + } + } + + // We're now at the end of the response header lines + if (lineStart == NULL) { + envir().setResultMsg("no content following header lines: ", readBuf); + break; + } + + // Use the remaining data as the SDP descr, but first, check + // the "Content-Length:" header (if any) that we saw. We may need to + // read more data, or we may have extraneous data in the buffer. + char* bodyStart = nextLineStart; + if (bodyStart != NULL && contentLength >= 0) { + // We saw a "Content-Length:" header + unsigned numBodyBytes = &readBuf[bytesRead] - bodyStart; + if (contentLength > (int)numBodyBytes) { + // We need to read more data. First, make sure we have enough + // space for it: + unsigned numExtraBytesNeeded = contentLength - numBodyBytes; +#ifdef USING_TCP + // THIS CODE WORKS ONLY FOR TCP: ##### + unsigned remainingBufferSize + = readBufSize - (bytesRead + (readBuf - readBuffer)); + if (numExtraBytesNeeded > remainingBufferSize) { + char tmpBuf[200]; + sprintf(tmpBuf, "Read buffer size (%d) is too small for \"Content-Length:\" %d (need a buffer size of >= %d bytes\n", + readBufSize, contentLength, + readBufSize + numExtraBytesNeeded - remainingBufferSize); + envir().setResultMsg(tmpBuf); + break; + } + + // Keep reading more data until we have enough: + if (fVerbosityLevel >= 1) { + envir() << "Need to read " << numExtraBytesNeeded + << " extra bytes\n"; + } + while (numExtraBytesNeeded > 0) { + char* ptr = &readBuf[bytesRead]; + unsigned bytesRead2; + struct sockaddr_storage dummy; // not used + Boolean readSuccess + = fOurSocket->handleRead((unsigned char*)ptr, + numExtraBytesNeeded, + bytesRead2, dummy); + if (!readSuccess) break; + ptr[bytesRead2] = '\0'; + if (fVerbosityLevel >= 1) { + envir() << "Read " << bytesRead2 + << " extra bytes: " << ptr << "\n"; + } + + bytesRead += bytesRead2; + numExtraBytesNeeded -= bytesRead2; + } +#endif + if (numExtraBytesNeeded > 0) break; // one of the reads failed + } + + bodyStart[contentLength] = '\0'; // trims any extra data + delete[] fInviteSDPDescriptionReturned; fInviteSDPDescriptionReturned = strDup(bodyStart); + } + } while (0); + + return responseCode; +} + +char* SIPClient::inviteWithPassword(char const* url, char const* username, + char const* password) { + delete[] (char*)fUserName; fUserName = strDup(username); + fUserNameSize = strlen(fUserName); + + Authenticator authenticator(username, password); + char* inviteResult = invite(url, &authenticator); + if (inviteResult != NULL) { + // We are already authorized + return inviteResult; + } + + // The "realm" and "nonce" fields should have been filled in: + if (authenticator.realm() == NULL || authenticator.nonce() == NULL) { + // We haven't been given enough information to try again, so fail: + return NULL; + } + + // Try again (but with the same CallId): + inviteResult = invite1(&authenticator); + if (inviteResult != NULL) { + // The authenticator worked, so use it in future requests: + fValidAuthenticator = authenticator; + } + + return inviteResult; +} + +Boolean SIPClient::sendACK() { + char* cmd = NULL; + do { + char const* const cmdFmt = + "ACK %s SIP/2.0\r\n" + "From: %s ;tag=%u\r\n" + "Via: SIP/2.0/UDP %s:%u\r\n" + "Max-Forwards: 70\r\n" + "To: %s;tag=%s\r\n" + "Call-ID: %u@%s\r\n" + "CSeq: %d ACK\r\n" + "Content-Length: 0\r\n\r\n"; + unsigned cmdSize = strlen(cmdFmt) + + fURLSize + + 2*fUserNameSize + fOurAddressStrSize + 20 /* max int len */ + + fOurAddressStrSize + 5 /* max port len */ + + fURLSize + fToTagStrSize + + 20 + fOurAddressStrSize + + 20; + cmd = new char[cmdSize]; + sprintf(cmd, cmdFmt, + fURL, + fUserName, fUserName, fOurAddressStr, fFromTag, + fOurAddressStr, fOurPortNum, + fURL, fToTagStr, + fCallId, fOurAddressStr, + fCSeq /* note: it's the same as before; not incremented */); + + if (!sendRequest(cmd, strlen(cmd))) { + envir().setResultErrMsg("ACK send() failed: "); + break; + } + + delete[] cmd; + return True; + } while (0); + + delete[] cmd; + return False; +} + +Boolean SIPClient::sendBYE() { + // NOTE: This should really be retransmitted, for reliability ##### + char* cmd = NULL; + do { + char const* const cmdFmt = + "BYE %s SIP/2.0\r\n" + "From: %s ;tag=%u\r\n" + "Via: SIP/2.0/UDP %s:%u\r\n" + "Max-Forwards: 70\r\n" + "To: %s;tag=%s\r\n" + "Call-ID: %u@%s\r\n" + "CSeq: %d BYE\r\n" + "Content-Length: 0\r\n\r\n"; + unsigned cmdSize = strlen(cmdFmt) + + fURLSize + + 2*fUserNameSize + fOurAddressStrSize + 20 /* max int len */ + + fOurAddressStrSize + 5 /* max port len */ + + fURLSize + fToTagStrSize + + 20 + fOurAddressStrSize + + 20; + cmd = new char[cmdSize]; + sprintf(cmd, cmdFmt, + fURL, + fUserName, fUserName, fOurAddressStr, fFromTag, + fOurAddressStr, fOurPortNum, + fURL, fToTagStr, + fCallId, fOurAddressStr, + ++fCSeq); + + if (!sendRequest(cmd, strlen(cmd))) { + envir().setResultErrMsg("BYE send() failed: "); + break; + } + + delete[] cmd; + return True; + } while (0); + + delete[] cmd; + return False; +} + +Boolean SIPClient::processURL(char const* url) { + do { + // If we don't already have a server address/port, then + // get these by parsing the URL: + if (!fServerAddressIsSet) { + NetAddress destAddress; + if (!parseSIPURL(envir(), url, destAddress, fServerPortNum)) break; + copyAddress(fServerAddress, &destAddress); + fServerAddressIsSet = True; + + if (fOurSocket != NULL) { + fOurSocket->changeDestinationParameters(fServerAddress, fServerPortNum, 255); + } + } + + return True; + } while (0); + + return False; +} + +Boolean SIPClient::parseSIPURL(UsageEnvironment& env, char const* url, + NetAddress& address, + portNumBits& portNum) { + do { + // Parse the URL as "sip:@:/" + // (with ":" and "/" optional) + // Also, skip over any "[:]@" preceding
+ char const* prefix = "sip:"; + unsigned const prefixLength = 4; + if (_strncasecmp(url, prefix, prefixLength) != 0) { + env.setResultMsg("URL is not of the form \"", prefix, "\""); + break; + } + + unsigned const parseBufferSize = 100; + char parseBuffer[parseBufferSize]; + unsigned addressStartIndex = prefixLength; + while (url[addressStartIndex] != '\0' + && url[addressStartIndex++] != '@') {} + char const* from = &url[addressStartIndex]; + + // Skip over any "[:]@" + char const* from1 = from; + while (*from1 != '\0' && *from1 != '/') { + if (*from1 == '@') { + from = ++from1; + break; + } + ++from1; + } + + // Next, parse + char* to = &parseBuffer[0]; + Boolean isInSquareBrackets = False; // by default + if (*from == '[') { + ++from; + isInSquareBrackets = True; + } + unsigned i; + for (i = 0; i < parseBufferSize; ++i) { + if (*from == '\0' || + (*from == ':' && !isInSquareBrackets) || + *from == '/' || + (*from == ']' && isInSquareBrackets)) { + // We've completed parsing the address + *to = '\0'; + if (*from == ']' && isInSquareBrackets) ++from; + break; + } + *to++ = *from++; + } + if (i == parseBufferSize) { + env.setResultMsg("URL is too long"); + break; + } + + NetAddressList addresses(parseBuffer); + if (addresses.numAddresses() == 0) { + env.setResultMsg("Failed to find network address for \"", + parseBuffer, "\""); + break; + } + address = *(addresses.firstAddress()); + + portNum = 5060; // default value + char nextChar = *from; + if (nextChar == ':') { + int portNumInt; + if (sscanf(++from, "%d", &portNumInt) != 1) { + env.setResultMsg("No port number follows ':'"); + break; + } + if (portNumInt < 1 || portNumInt > 65535) { + env.setResultMsg("Bad port number"); + break; + } + portNum = (portNumBits)portNumInt; + } + + return True; + } while (0); + + return False; +} + +Boolean SIPClient::parseSIPURLUsernamePassword(char const* url, + char*& username, + char*& password) { + username = password = NULL; // by default + do { + // Parse the URL as "sip:[:]@" + char const* prefix = "sip:"; + unsigned const prefixLength = 4; + if (_strncasecmp(url, prefix, prefixLength) != 0) break; + + // Look for the ':' and '@': + unsigned usernameIndex = prefixLength; + unsigned colonIndex = 0, atIndex = 0; + for (unsigned i = usernameIndex; url[i] != '\0' && url[i] != '/'; ++i) { + if (url[i] == ':' && colonIndex == 0) { + colonIndex = i; + } else if (url[i] == '@') { + atIndex = i; + break; // we're done + } + } + if (atIndex == 0) break; // no '@' found + + char* urlCopy = strDup(url); + urlCopy[atIndex] = '\0'; + if (colonIndex > 0) { + urlCopy[colonIndex] = '\0'; + password = strDup(&urlCopy[colonIndex+1]); + } else { + password = strDup(""); + } + username = strDup(&urlCopy[usernameIndex]); + delete[] urlCopy; + + return True; + } while (0); + + return False; +} + +char* +SIPClient::createAuthenticatorString(Authenticator const* authenticator, + char const* cmd, char const* url) { + if (authenticator != NULL && authenticator->realm() != NULL + && authenticator->nonce() != NULL && authenticator->username() != NULL + && authenticator->password() != NULL) { + // We've been provided a filled-in authenticator, so use it: + char const* const authFmt + = "Authorization: Digest username=\"%s\", realm=\"%s\", nonce=\"%s\", response=\"%s\", uri=\"%s\"\r\n"; + char const* response = authenticator->computeDigestResponse(cmd, url); + unsigned authBufSize = strlen(authFmt) + + strlen(authenticator->username()) + strlen(authenticator->realm()) + + strlen(authenticator->nonce()) + strlen(url) + strlen(response); + char* authenticatorStr = new char[authBufSize]; + sprintf(authenticatorStr, authFmt, + authenticator->username(), authenticator->realm(), + authenticator->nonce(), response, url); + authenticator->reclaimDigestResponse(response); + + return authenticatorStr; + } + + return strDup(""); +} + +Boolean SIPClient::sendRequest(char const* requestString, + unsigned requestLength) { + if (fVerbosityLevel >= 1) { + envir() << "Sending request: " << requestString << "\n"; + } + // NOTE: We should really check that "requestLength" is not ##### + // too large for UDP (see RFC 3261, section 18.1.1) ##### + return fOurSocket->output(envir(), (unsigned char*)requestString, requestLength); +} + +unsigned SIPClient::getResponse(char*& responseBuffer, + unsigned responseBufferSize) { + if (responseBufferSize == 0) return 0; // just in case... + responseBuffer[0] = '\0'; // ditto + + // Keep reading data from the socket until we see "\r\n\r\n" (except + // at the start), or until we fill up our buffer. + // Don't read any more than this. + char* p = responseBuffer; + Boolean haveSeenNonCRLF = False; + int bytesRead = 0; + while (bytesRead < (int)responseBufferSize) { + unsigned bytesReadNow; + struct sockaddr_storage dummy; // not used + unsigned char* toPosn = (unsigned char*)(responseBuffer+bytesRead); + Boolean readSuccess + = fOurSocket->handleRead(toPosn, responseBufferSize-bytesRead, + bytesReadNow, dummy); + if (!readSuccess || bytesReadNow == 0) { + envir().setResultMsg("SIP response was truncated"); + break; + } + bytesRead += bytesReadNow; + + // Check whether we have "\r\n\r\n": + char* lastToCheck = responseBuffer+bytesRead-4; + if (lastToCheck < responseBuffer) continue; + for (; p <= lastToCheck; ++p) { + if (haveSeenNonCRLF) { + if (*p == '\r' && *(p+1) == '\n' && + *(p+2) == '\r' && *(p+3) == '\n') { + responseBuffer[bytesRead] = '\0'; + + // Before returning, trim any \r or \n from the start: + while (*responseBuffer == '\r' || *responseBuffer == '\n') { + ++responseBuffer; + --bytesRead; + } + return bytesRead; + } + } else { + if (*p != '\r' && *p != '\n') { + haveSeenNonCRLF = True; + } + } + } + } + + return 0; +} + +Boolean SIPClient::parseResponseCode(char const* line, + unsigned& responseCode) { + if (sscanf(line, "%*s%u", &responseCode) != 1) { + envir().setResultMsg("no response code in line: \"", line, "\""); + return False; + } + + return True; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/SRTPCryptographicContext.cpp b/src/big/mpp/middleware/src/live555/liveMedia/SRTPCryptographicContext.cpp new file mode 100644 index 000000000..0a06ee108 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/SRTPCryptographicContext.cpp @@ -0,0 +1,590 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023, Live Networks, Inc. All rights reserved +// +// The SRTP 'Cryptographic Context', used in all of our uses of SRTP. +// Implementation + +#include "SRTPCryptographicContext.hh" +#ifndef NO_OPENSSL +#include "HMAC_SHA1.hh" +#include +#endif + +#ifdef DEBUG +#include +#endif + +SRTPCryptographicContext +::SRTPCryptographicContext(MIKEYState const& mikeyState) +#ifndef NO_OPENSSL + : fMIKEYState(mikeyState), + fHaveReceivedSRTPPackets(False), fHaveSentSRTPPackets(False), fSRTCPIndex(0) { + // Begin by doing a key derivation, to generate the keying data that we need: + performKeyDerivation(); +#else + { +#endif +} + +SRTPCryptographicContext::~SRTPCryptographicContext() { +} + +Boolean SRTPCryptographicContext +::processIncomingSRTPPacket(u_int8_t* buffer, unsigned inPacketSize, + unsigned& outPacketSize) { +#ifndef NO_OPENSSL + do { + if (inPacketSize < 12) { // For SRTP, 12 is the minimum packet size (if unauthenticated) +#ifdef DEBUG + fprintf(stderr, "SRTPCryptographicContext::processIncomingSRTPPacket(): Error: Packet size %d is too short for SRTP!\n", inPacketSize); +#endif + break; + } + + unsigned const numBytesPastEncryption + = SRTP_MKI_LENGTH + (weAuthenticate() ? SRTP_AUTH_TAG_LENGTH : 0); + if (inPacketSize <= numBytesPastEncryption) { +#ifdef DEBUG + fprintf(stderr, "SRTPCryptographicContext::processIncomingSRTPPacket(): Error: Packet size %d is too short for encrpytion and/or authentication!\n", inPacketSize); +#endif + break; + } + + // Begin by figuring out this packet's 'index' (ROC and RTP sequence number), + // and the ROC and RTP sequence number that will be used subsequently, provided that + // this packet authenticates OK: + u_int16_t const rtpSeqNum = (buffer[2]<<8)|buffer[3]; + u_int32_t nextROC, thisPacketsROC; + u_int16_t nextHighRTPSeqNum; + + if (!fHaveReceivedSRTPPackets) { + // First time: + nextROC = thisPacketsROC = fReceptionROC = 0; + nextHighRTPSeqNum = rtpSeqNum; + } else { + // Check whether the sequence number has rolled over, or is out-of-order: + u_int16_t const SEQ_NUM_THRESHOLD = 0x1000; + if (rtpSeqNum >= fPreviousHighRTPSeqNum) { + // normal case, or out-of-order packet that crosses a rollover: + if (rtpSeqNum - fPreviousHighRTPSeqNum < SEQ_NUM_THRESHOLD) { + // normal case: + nextROC = thisPacketsROC = fReceptionROC; + nextHighRTPSeqNum = rtpSeqNum; + } else { + // out-of-order packet that crosses a rollover: + nextROC = fReceptionROC; + thisPacketsROC = fReceptionROC-1; + nextHighRTPSeqNum = fPreviousHighRTPSeqNum; + } + } else { + // rollover, or out-of-order packet that crosses a rollover: + if (fPreviousHighRTPSeqNum - rtpSeqNum > SEQ_NUM_THRESHOLD) { + // rollover: + nextROC = thisPacketsROC = fReceptionROC+1; + nextHighRTPSeqNum = rtpSeqNum; + } else { + // out-of-order packet (that doesn't cross a rollover): + nextROC = thisPacketsROC = fReceptionROC; + nextHighRTPSeqNum = fPreviousHighRTPSeqNum; + } + } + } + + if (weAuthenticate()) { + // Authenticate the packet. + unsigned const numBytesToAuthenticate + = inPacketSize - (SRTP_MKI_LENGTH + SRTP_AUTH_TAG_LENGTH); // ASSERT: > 0 + u_int8_t const* authenticationTag = &buffer[inPacketSize - SRTP_AUTH_TAG_LENGTH]; + + if (!verifySRTPAuthenticationTag(buffer, numBytesToAuthenticate, thisPacketsROC, authenticationTag)) { +#ifdef DEBUG + fprintf(stderr, "SRTPCryptographicContext::processIncomingSRTPPacket(): Failed to authenticate incoming SRTP packet!\n"); +#endif + break; + } + } + + // Now that we've verified the packet, set the 'index values' for next time: + fReceptionROC = nextROC; + fPreviousHighRTPSeqNum = nextHighRTPSeqNum; + fHaveReceivedSRTPPackets = True; + + if (weEncryptSRTP()) { + // Decrypt the SRTP packet. It has the index "thisPacketsROC" with "rtpSeqNum": + u_int64_t index = (thisPacketsROC<<16)|rtpSeqNum; + + // Figure out the RTP header size. This will tell us which bytes to decrypt: + unsigned rtpHeaderSize = 12; // at least the basic 12-byte header + rtpHeaderSize += (buffer[0]&0x0F)*4; // # CSRC identifiers + if ((buffer[0]&0x10) != 0) { + // There's a RTP extension header. Add its size: + if (inPacketSize < rtpHeaderSize + 4) { +#ifdef DEBUG + fprintf(stderr, "SRTPCryptographicContext::processIncomingSRTPPacket(): Error: Packet size %d is shorter than the minimum specified RTP header size %d!\n", inPacketSize, rtpHeaderSize + 4); +#endif + break; + } + u_int16_t const hdrExtLength = (buffer[rtpHeaderSize+2]<<8)|buffer[rtpHeaderSize+3]; + rtpHeaderSize += 4 + hdrExtLength*4; + } + + unsigned const offsetToEncryptedBytes = rtpHeaderSize; + unsigned numEncryptedBytes = inPacketSize - numBytesPastEncryption; // ASSERT: > 0 + if (offsetToEncryptedBytes > numEncryptedBytes) { +#ifdef DEBUG + fprintf(stderr, "SRTPCryptographicContext::processIncomingSRTPPacket(): Error: RTP header size %d (expected <= %d) is too large!\n", rtpHeaderSize, numEncryptedBytes); +#endif + break; + } + numEncryptedBytes -= offsetToEncryptedBytes; + + u_int32_t const SSRC = (buffer[8]<<24)|(buffer[9]<<16)|(buffer[10]<<8)|buffer[11]; + decryptSRTPPacket(index, SSRC, &buffer[offsetToEncryptedBytes], numEncryptedBytes); + outPacketSize = inPacketSize - numBytesPastEncryption; // trim to what we use + } + + return True; + } while (0); +#endif + + // An error occurred in the handling of the packet: + return False; +} + +Boolean SRTPCryptographicContext +::processIncomingSRTCPPacket(u_int8_t* buffer, unsigned inPacketSize, + unsigned& outPacketSize) { +#ifndef NO_OPENSSL + do { + if (inPacketSize < 12) { + // For SRTCP, 8 is the minumum RTCP packet size, but there's also a mandatory + // 4-byte "E+SRTCP index" word. +#ifdef DEBUG + fprintf(stderr, "SRTPCryptographicContext::processIncomingSRTCPPacket(): Error: Packet size %d is too short for SRTCP!\n", inPacketSize); +#endif + break; + } + + unsigned const numBytesPastEncryption + = 4/*E+SRTCP index*/ + SRTP_MKI_LENGTH + (weAuthenticate() ? SRTP_AUTH_TAG_LENGTH : 0); + if (inPacketSize <= numBytesPastEncryption) { +#ifdef DEBUG + fprintf(stderr, "SRTPCryptographicContext::processIncomingSRTCPPacket(): Error: Packet size %d is too short for encrpytion and/or authentication!\n", inPacketSize); +#endif + break; + } + + if (weAuthenticate()) { + // Authenticate the packet. + unsigned const numBytesToAuthenticate + = inPacketSize - (SRTP_MKI_LENGTH + SRTP_AUTH_TAG_LENGTH); // ASSERT: > 0 + u_int8_t const* authenticationTag = &buffer[inPacketSize - SRTP_AUTH_TAG_LENGTH]; + + if (!verifySRTCPAuthenticationTag(buffer, numBytesToAuthenticate, authenticationTag)) { +#ifdef DEBUG + fprintf(stderr, "SRTPCryptographicContext::processIncomingSRTCPPacket(): Failed to authenticate incoming SRTCP packet!\n"); +#endif + break; + } + } + + if (weEncryptSRTCP()) { + // Decrypt the SRTCP packet: + unsigned numEncryptedBytes = inPacketSize - numBytesPastEncryption; // ASSERT: > 0 + u_int8_t const* p = &buffer[numEncryptedBytes]; // E + SRTCP index + u_int32_t E_plus_SRTCPIndex = (p[0]<<24)|(p[1]<<16)|(p[2]<<8)|p[3]; + if ((E_plus_SRTCPIndex&0x80000000) != 0) { + // The packet is encrypted + unsigned const offsetToEncryptedBytes = 8; + if (offsetToEncryptedBytes > numEncryptedBytes) { +#ifdef DEBUG + fprintf(stderr, "SRTPCryptographicContext::processIncomingSRTCPPacket(): Error: RTCP packet size %d is too small!\n", numEncryptedBytes); +#endif + break; + } + numEncryptedBytes -= offsetToEncryptedBytes; + + u_int32_t index = E_plus_SRTCPIndex&0x7FFFFFFF; + u_int32_t const SSRC = (buffer[4]<<24)|(buffer[5]<<16)|(buffer[6]<<8)|buffer[7]; + decryptSRTCPPacket(index, SSRC, &buffer[offsetToEncryptedBytes], numEncryptedBytes); + } + outPacketSize = inPacketSize - numBytesPastEncryption; // trim to what we use + } + + return True; + } while (0); +#endif + + // An error occurred in the handling of the packet: + return False; +} + +Boolean SRTPCryptographicContext +::processOutgoingSRTPPacket(u_int8_t* buffer, unsigned inPacketSize, + unsigned& outPacketSize) { +#ifndef NO_OPENSSL + do { + unsigned const minRTPHeaderSize = 12; + if (inPacketSize < minRTPHeaderSize) { // packet is too small + // Hack: Let small, non RTCP packets through w/o encryption; they may be used to + // punch through NATs + outPacketSize = inPacketSize; + return True; + } + + // Encrypt the appropriate part of the packet. + if (weEncryptSRTP()) { + // Figure out the RTP header size. This will tell us which bytes to encrypt: + unsigned rtpHeaderSize = 12; // at least the basic 12-byte header + rtpHeaderSize += (buffer[0]&0x0F)*4; // # CSRC identifiers + if ((buffer[0]&0x10) != 0) { + // There's a RTP extension header. Add its size: + if (inPacketSize < rtpHeaderSize + 4) { +#ifdef DEBUG + fprintf(stderr, "SRTPCryptographicContext::processOutgoingSRTPPacket(): Error: Packet size %d is shorter than the minimum specified RTP header size %d!\n", inPacketSize, rtpHeaderSize + 4); +#endif + break; + } + u_int16_t const hdrExtLength = (buffer[rtpHeaderSize+2]<<8)|buffer[rtpHeaderSize+3]; + rtpHeaderSize += 4 + hdrExtLength*4; + } + + unsigned const offsetToEncryptedBytes = rtpHeaderSize; + if (inPacketSize < offsetToEncryptedBytes) { +#ifdef DEBUG + fprintf(stderr, "SRTPCryptographicContext::processOutgoingSRTPPacket(): Error: Packet size %d is too small (should be >= %d)!\n", inPacketSize, offsetToEncryptedBytes); +#endif + break; + } + + // Figure out this packet's 'index' (ROC|rtpSeqNum): + u_int16_t const rtpSeqNum = (buffer[2]<<8)|buffer[3]; + if (!fHaveSentSRTPPackets) { + fSendingROC = 0; + fHaveSentSRTPPackets = True; // for the future + } else { + if (rtpSeqNum == 0) ++fSendingROC; // increment the ROC when the RTP seq num rolls over + } + u_int64_t index = (fSendingROC<<16)|rtpSeqNum; + + unsigned const numEncryptedBytes = inPacketSize - offsetToEncryptedBytes; // ASSERT: >= 0 + u_int32_t const SSRC = (buffer[8]<<24)|(buffer[9]<<16)|(buffer[10]<<8)|buffer[11]; + encryptSRTPPacket(index, SSRC, &buffer[offsetToEncryptedBytes], numEncryptedBytes); + } + + outPacketSize = inPacketSize; // initially + + unsigned const mkiPosition = outPacketSize; // where the MKI will go + + if (weAuthenticate()) { + // Append the ROC to the payload, because it's used to generate the authentication tag. + // (Next, the MKI will take its place.) + buffer[outPacketSize++] = fSendingROC>>24; + buffer[outPacketSize++] = fSendingROC>>16; + buffer[outPacketSize++] = fSendingROC>>8; + buffer[outPacketSize++] = fSendingROC; + + // Generate and add an authentication tag over the whole packet, plus the ROC: + outPacketSize += generateSRTPAuthenticationTag(buffer, outPacketSize, + &buffer[outPacketSize]); + } + + // Add the MKI: + buffer[mkiPosition] = MKI()>>24; + buffer[mkiPosition+1] = MKI()>>16; + buffer[mkiPosition+2] = MKI()>>8; + buffer[mkiPosition+3] = MKI(); + + return True; + } while (0); +#endif + + // An error occurred: + return False; +} + +Boolean SRTPCryptographicContext +::processOutgoingSRTCPPacket(u_int8_t* buffer, unsigned inPacketSize, + unsigned& outPacketSize) { +#ifndef NO_OPENSSL + do { + // Encrypt the appropriate part of the packet. + u_int8_t eFlag = 0x00; + if (weEncryptSRTCP()) { + unsigned const unencryptedHeaderSize = 8; + if (inPacketSize < unencryptedHeaderSize) { // packet is too small + // Hack: Let small, non RTCP packets through w/o encryption; they may be used to + // punch through NATs + outPacketSize = inPacketSize; + return True; + } + unsigned const encryptedDataSize = inPacketSize - unencryptedHeaderSize; + + u_int8_t* const dataToEncrypt = &buffer[unencryptedHeaderSize]; + u_int32_t const ssrc = (buffer[4]<<24)|(buffer[5]<<16)|(buffer[6]<<8)|buffer[7]; + encryptSRTCPPacket(fSRTCPIndex, ssrc, dataToEncrypt, encryptedDataSize); + eFlag = 0x80; + } + + outPacketSize = inPacketSize; // initially + + // Add 4 bytes for the 'E' flag and SRTCP index: + buffer[outPacketSize++] = (fSRTCPIndex>>24)|eFlag; + buffer[outPacketSize++] = fSRTCPIndex>>16; + buffer[outPacketSize++] = fSRTCPIndex>>8; + buffer[outPacketSize++] = fSRTCPIndex; + ++fSRTCPIndex; // for next time + + // Add the MKI: + buffer[outPacketSize++] = MKI()>>24; + buffer[outPacketSize++] = MKI()>>16; + buffer[outPacketSize++] = MKI()>>8; + buffer[outPacketSize++] = MKI(); + + // Generate and add an authentication tag over the data built so far (except the MKI) + outPacketSize += generateSRTCPAuthenticationTag(buffer, outPacketSize-SRTP_MKI_LENGTH, + &buffer[outPacketSize]); + + return True; + } while (0); +#endif + + // An error occurred: + return False; +} + +#ifndef NO_OPENSSL +unsigned SRTPCryptographicContext +::generateSRTPAuthenticationTag(u_int8_t const* dataToAuthenticate, unsigned numBytesToAuthenticate, + u_int8_t* resultAuthenticationTag) { + return generateAuthenticationTag(fDerivedKeys.srtp, dataToAuthenticate, numBytesToAuthenticate, + resultAuthenticationTag); +} + +unsigned SRTPCryptographicContext +::generateSRTCPAuthenticationTag(u_int8_t const* dataToAuthenticate, unsigned numBytesToAuthenticate, + u_int8_t* resultAuthenticationTag) { + return generateAuthenticationTag(fDerivedKeys.srtcp, dataToAuthenticate, numBytesToAuthenticate, + resultAuthenticationTag); +} + +Boolean SRTPCryptographicContext +::verifySRTPAuthenticationTag(u_int8_t* dataToAuthenticate, unsigned numBytesToAuthenticate, + u_int32_t roc, u_int8_t const* authenticationTag) { + // Append the (4-byte) 'ROC' (roll-over counter) to "dataToAuthenticate" before computing + // the authentication tag. We can do this because we have enough space after + // "dataToAuthenticate": + // - If we're encrypted, then there's assumed to be a (4-byte) MKI there. Just overwrite + // that. (If we need the MKI, we could copy it beforehand; later, allow for there being + // no MKI #####) + // - If we're not encrypted, then the ROC will overwrite part of the existing + // authentication tag, so we need to make a copy of this. + u_int8_t const* existingAuthenticationTag; + Boolean haveMKI = True; // later, allow for there being no MKI ##### + u_int8_t authenticationTagCopy[SRTP_AUTH_TAG_LENGTH]; + + if (fMIKEYState.encryptSRTP() && haveMKI) { + existingAuthenticationTag = authenticationTag; + } else { + memcpy(authenticationTagCopy, authenticationTag, sizeof authenticationTagCopy); + existingAuthenticationTag = authenticationTagCopy; + } + + dataToAuthenticate[numBytesToAuthenticate++] = roc>>24; + dataToAuthenticate[numBytesToAuthenticate++] = roc>>16; + dataToAuthenticate[numBytesToAuthenticate++] = roc>>8; + dataToAuthenticate[numBytesToAuthenticate++] = roc; + + return verifyAuthenticationTag(fDerivedKeys.srtp, + dataToAuthenticate, numBytesToAuthenticate, + existingAuthenticationTag); +} + +Boolean SRTPCryptographicContext +::verifySRTCPAuthenticationTag(u_int8_t const* dataToAuthenticate, unsigned numBytesToAuthenticate, + u_int8_t const* authenticationTag) { +return verifyAuthenticationTag(fDerivedKeys.srtcp, + dataToAuthenticate, numBytesToAuthenticate, + authenticationTag); +} + +void SRTPCryptographicContext +::decryptSRTPPacket(u_int64_t index, u_int32_t ssrc, u_int8_t* data, unsigned numDataBytes) { + cryptData(fDerivedKeys.srtp, index, ssrc, data, numDataBytes); +} + +void SRTPCryptographicContext +::decryptSRTCPPacket(u_int32_t index, u_int32_t ssrc, u_int8_t* data, unsigned numDataBytes) { + cryptData(fDerivedKeys.srtcp, (u_int64_t)index, ssrc, data, numDataBytes); +} + +void SRTPCryptographicContext +::encryptSRTPPacket(u_int64_t index, u_int32_t ssrc, u_int8_t* data, unsigned numDataBytes) { + cryptData(fDerivedKeys.srtp, index, ssrc, data, numDataBytes); +} + +void SRTPCryptographicContext +::encryptSRTCPPacket(u_int32_t index, u_int32_t ssrc, u_int8_t* data, unsigned numDataBytes) { + cryptData(fDerivedKeys.srtcp, (u_int64_t)index, ssrc, data, numDataBytes); +} + +unsigned SRTPCryptographicContext +::generateAuthenticationTag(derivedKeys& keysToUse, + u_int8_t const* dataToAuthenticate, unsigned numBytesToAuthenticate, + u_int8_t* resultAuthenticationTag) { + if (SRTP_AUTH_TAG_LENGTH > SHA1_DIGEST_LEN) return 0; // sanity check; shouldn't happen + u_int8_t computedAuthTag[SHA1_DIGEST_LEN]; + HMAC_SHA1(keysToUse.authKey, sizeof keysToUse.authKey, + dataToAuthenticate, numBytesToAuthenticate, + computedAuthTag); + + for (unsigned i = 0; i < SRTP_AUTH_TAG_LENGTH; ++i) { + resultAuthenticationTag[i] = computedAuthTag[i]; + } + + return SRTP_AUTH_TAG_LENGTH; +} + +Boolean SRTPCryptographicContext +::verifyAuthenticationTag(derivedKeys& keysToUse, + u_int8_t const* dataToAuthenticate, unsigned numBytesToAuthenticate, + u_int8_t const* authenticationTag) { + u_int8_t computedAuthTag[SHA1_DIGEST_LEN]; + HMAC_SHA1(keysToUse.authKey, sizeof keysToUse.authKey, + dataToAuthenticate, numBytesToAuthenticate, + computedAuthTag); + + if (SRTP_AUTH_TAG_LENGTH > SHA1_DIGEST_LEN) return False; // sanity check + for (unsigned i = 0; i < SRTP_AUTH_TAG_LENGTH; ++i) { + if (computedAuthTag[i] != authenticationTag[i]) return False; + } + return True; +} + + void SRTPCryptographicContext::cryptData(derivedKeys& keys, u_int64_t index, u_int32_t ssrc, + u_int8_t* data, unsigned numDataBytes) { + // Begin by constructing the IV: (salt * 2^16) XOR (ssrc * 2^64) XOR (index * 2^16) + u_int8_t iv[SRTP_CIPHER_KEY_LENGTH]; + + memmove(iv, keys.salt, SRTP_CIPHER_SALT_LENGTH); + iv[SRTP_CIPHER_SALT_LENGTH] = iv[SRTP_CIPHER_SALT_LENGTH + 1] = 0; + // (This is based upon the fact that SRTP_CIPHER_KEY_LENGTH == SRTP_CIPHER_SALT_LENGTH + 2) + + iv[sizeof iv-12] ^= ssrc>>24; iv[sizeof iv-11] ^= ssrc>>16; iv[sizeof iv-10] ^= ssrc>>8; iv[sizeof iv-9] ^= ssrc; + + iv[sizeof iv-8] ^= index>>40; iv[sizeof iv-7] ^= index>>32; iv[sizeof iv-6] ^= index>>24; iv[sizeof iv-5] ^= index>>16; iv[sizeof iv-4] ^= index>>8; iv[sizeof iv-3] ^= index; + + // Now generate as many blocks of the keystream as we need, by repeatedly encrypting + // the IV using our cipher key. (After each step, we increment the IV by 1.) + // We then XOR the keystream into the provided data, to do the en/decryption. + do { + EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new(); + if (ctx == NULL) break; + + if (EVP_EncryptInit(ctx, EVP_aes_128_ecb(), keys.cipherKey, NULL/*no IV*/) != 1) break; + // Note: We use ECB mode here, because we're using our "iv" as plaintext + + while (numDataBytes > 0) { + u_int8_t keyStream[SRTP_CIPHER_KEY_LENGTH]; + int numBytesEncrypted; + if (EVP_EncryptUpdate(ctx, keyStream, &numBytesEncrypted, iv, SRTP_CIPHER_KEY_LENGTH) != 1) break; + + unsigned numBytesToUse + = numDataBytes < numBytesEncrypted ? numDataBytes : numBytesEncrypted; + for (unsigned i = 0; i < numBytesToUse; ++i) data[i] ^= keyStream[i]; + data += numBytesToUse; + numDataBytes -= numBytesToUse; + + // Increment the IV by 1: + u_int8_t* ptr = &iv[sizeof iv]; + do { + --ptr; + ++*ptr; + } while (*ptr == 0x00); + } + + EVP_CIPHER_CTX_free(ctx); + } while (0); +} + +void SRTPCryptographicContext::performKeyDerivation() { + // Perform a key derivation for the master key+salt, as defined + // by RFC 3711, section 4.3: + deriveKeysFromMaster(masterKey(), masterSalt(), fDerivedKeys); +} + +#define deriveKey(label, resultKey) deriveSingleKey(masterKey, salt, label, sizeof resultKey, resultKey) + +void SRTPCryptographicContext +::deriveKeysFromMaster(u_int8_t const* masterKey, u_int8_t const* salt, + allDerivedKeys& allKeysResult) { + // Derive cipher, salt, and auth keys for both SRTP and SRTCP: + deriveKey(label_srtp_encryption, allKeysResult.srtp.cipherKey); + deriveKey(label_srtp_msg_auth, allKeysResult.srtp.authKey); + deriveKey(label_srtp_salt, allKeysResult.srtp.salt); + + deriveKey(label_srtcp_encryption, allKeysResult.srtcp.cipherKey); + deriveKey(label_srtcp_msg_auth, allKeysResult.srtcp.authKey); + deriveKey(label_srtcp_salt, allKeysResult.srtcp.salt); +} + +#define KDF_PRF_CIPHER_BLOCK_LENGTH 16 + +void SRTPCryptographicContext +::deriveSingleKey(u_int8_t const* masterKey, u_int8_t const* salt, + SRTPKeyDerivationLabel label, + unsigned resultKeyLength, u_int8_t* resultKey) { + u_int8_t counter[KDF_PRF_CIPHER_BLOCK_LENGTH]; + // Fill in the first bytes of "counter" with our 'salt'; set the remaining bytes to zero: + memmove(counter, salt, SRTP_CIPHER_SALT_LENGTH); + for (unsigned i = SRTP_CIPHER_SALT_LENGTH; i < sizeof counter; ++i) { + counter[i] = 0; + } + + // XOR "label" into byte 7 of "counter": + counter[7] ^= label; + + // And use the resulting "counter" as the plaintext: + u_int8_t const* plaintext = counter; + + // Generate the key by repeatedly encrypting the plaintext: + do { + EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new(); + if (ctx == NULL) break; + + if (EVP_EncryptInit(ctx, EVP_aes_128_ecb(), masterKey, NULL/*no IV*/) != 1) break; + // Note: We use ECB mode here, because there's no IV + + unsigned numBytesRemaining = resultKeyLength; + while (numBytesRemaining > 0) { + u_int8_t ciphertext[KDF_PRF_CIPHER_BLOCK_LENGTH]; + int numBytesEncrypted; + if (EVP_EncryptUpdate(ctx, ciphertext, &numBytesEncrypted, plaintext, KDF_PRF_CIPHER_BLOCK_LENGTH) != 1) break; + + unsigned numBytesToCopy + = numBytesRemaining < numBytesEncrypted ? numBytesRemaining : numBytesEncrypted; + memmove(resultKey, ciphertext, numBytesToCopy); + resultKey += numBytesToCopy; + numBytesRemaining -= numBytesToCopy; + ++counter[15]; // for next time + } + + EVP_CIPHER_CTX_free(ctx); + } while (0); +} +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/ServerMediaSession.cpp b/src/big/mpp/middleware/src/live555/liveMedia/ServerMediaSession.cpp new file mode 100644 index 000000000..41beb7604 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/ServerMediaSession.cpp @@ -0,0 +1,465 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A data structure that represents a session that consists of +// potentially multiple (audio and/or video) sub-sessions +// (This data structure is used for media *streamers* - i.e., servers. +// For media receivers, use "MediaSession" instead.) +// Implementation + +#include "ServerMediaSession.hh" +#include +#include +#if defined(__WIN32__) || defined(_WIN32) || defined(_QNX4) +#define snprintf _snprintf +#endif + +////////// ServerMediaSession ////////// + +ServerMediaSession* ServerMediaSession +::createNew(UsageEnvironment& env, + char const* streamName, char const* info, + char const* description, Boolean isSSM, char const* miscSDPLines) { + return new ServerMediaSession(env, streamName, info, description, + isSSM, miscSDPLines); +} + +Boolean ServerMediaSession +::lookupByName(UsageEnvironment& env, char const* mediumName, + ServerMediaSession*& resultSession) { + resultSession = NULL; // unless we succeed + + Medium* medium; + if (!Medium::lookupByName(env, mediumName, medium)) return False; + + if (!medium->isServerMediaSession()) { + env.setResultMsg(mediumName, " is not a 'ServerMediaSession' object"); + return False; + } + + resultSession = (ServerMediaSession*)medium; + return True; +} + +static char const* const libNameStr = "LIVE555 Streaming Media v"; +char const* const libVersionStr = LIVEMEDIA_LIBRARY_VERSION_STRING; + +ServerMediaSession::ServerMediaSession(UsageEnvironment& env, + char const* streamName, + char const* info, + char const* description, + Boolean isSSM, char const* miscSDPLines) + : Medium(env), streamingUsesSRTP(False), streamingIsEncrypted(False), + fIsSSM(isSSM), fSubsessionsHead(NULL), + fSubsessionsTail(NULL), fSubsessionCounter(0), + fReferenceCount(0), fDeleteWhenUnreferenced(False) { + fStreamName = strDup(streamName == NULL ? "" : streamName); + + char* libNamePlusVersionStr = NULL; // by default + if (info == NULL || description == NULL) { + libNamePlusVersionStr = new char[strlen(libNameStr) + strlen(libVersionStr) + 1]; + sprintf(libNamePlusVersionStr, "%s%s", libNameStr, libVersionStr); + } + fInfoSDPString = strDup(info == NULL ? libNamePlusVersionStr : info); + fDescriptionSDPString = strDup(description == NULL ? libNamePlusVersionStr : description); + delete[] libNamePlusVersionStr; + + fMiscSDPLines = strDup(miscSDPLines == NULL ? "" : miscSDPLines); + + gettimeofday(&fCreationTime, NULL); +} + +ServerMediaSession::~ServerMediaSession() { + deleteAllSubsessions(); + delete[] fStreamName; + delete[] fInfoSDPString; + delete[] fDescriptionSDPString; + delete[] fMiscSDPLines; +} + +Boolean +ServerMediaSession::addSubsession(ServerMediaSubsession* subsession) { + if (subsession->fParentSession != NULL) return False; // it's already used + + if (fSubsessionsTail == NULL) { + fSubsessionsHead = subsession; + } else { + fSubsessionsTail->fNext = subsession; + } + fSubsessionsTail = subsession; + + subsession->fParentSession = this; + subsession->fTrackNumber = ++fSubsessionCounter; + return True; +} + +void ServerMediaSession::testScaleFactor(float& scale) { + // First, try setting all subsessions to the desired scale. + // If the subsessions' actual scales differ from each other, choose the + // value that's closest to 1, and then try re-setting all subsessions to that + // value. If the subsessions' actual scales still differ, re-set them all to 1. + float minSSScale = 1.0; + float maxSSScale = 1.0; + float bestSSScale = 1.0; + float bestDistanceTo1 = 0.0; + ServerMediaSubsession* subsession; + for (subsession = fSubsessionsHead; subsession != NULL; + subsession = subsession->fNext) { + float ssscale = scale; + subsession->testScaleFactor(ssscale); + if (subsession == fSubsessionsHead) { // this is the first subsession + minSSScale = maxSSScale = bestSSScale = ssscale; + bestDistanceTo1 = (float)fabs(ssscale - 1.0f); + } else { + if (ssscale < minSSScale) { + minSSScale = ssscale; + } else if (ssscale > maxSSScale) { + maxSSScale = ssscale; + } + + float distanceTo1 = (float)fabs(ssscale - 1.0f); + if (distanceTo1 < bestDistanceTo1) { + bestSSScale = ssscale; + bestDistanceTo1 = distanceTo1; + } + } + } + if (minSSScale == maxSSScale) { + // All subsessions are at the same scale: minSSScale == bestSSScale == maxSSScale + scale = minSSScale; + return; + } + + // The scales for each subsession differ. Try to set each one to the value + // that's closest to 1: + for (subsession = fSubsessionsHead; subsession != NULL; + subsession = subsession->fNext) { + float ssscale = bestSSScale; + subsession->testScaleFactor(ssscale); + if (ssscale != bestSSScale) break; // no luck + } + if (subsession == NULL) { + // All subsessions are at the same scale: bestSSScale + scale = bestSSScale; + return; + } + + // Still no luck. Set each subsession's scale to 1: + for (subsession = fSubsessionsHead; subsession != NULL; + subsession = subsession->fNext) { + float ssscale = 1; + subsession->testScaleFactor(ssscale); + } + scale = 1; +} + +float ServerMediaSession::duration() const { + float minSubsessionDuration = 0.0; + float maxSubsessionDuration = 0.0; + for (ServerMediaSubsession* subsession = fSubsessionsHead; subsession != NULL; + subsession = subsession->fNext) { + // Hack: If any subsession supports seeking by 'absolute' time, then return a negative value, to indicate that only subsessions + // will have a "a=range:" attribute: + char* absStartTime = NULL; char* absEndTime = NULL; + subsession->getAbsoluteTimeRange(absStartTime, absEndTime); + if (absStartTime != NULL) return -1.0f; + + float ssduration = subsession->duration(); + if (subsession == fSubsessionsHead) { // this is the first subsession + minSubsessionDuration = maxSubsessionDuration = ssduration; + } else if (ssduration < minSubsessionDuration) { + minSubsessionDuration = ssduration; + } else if (ssduration > maxSubsessionDuration) { + maxSubsessionDuration = ssduration; + } + } + + if (maxSubsessionDuration != minSubsessionDuration) { + return -maxSubsessionDuration; // because subsession durations differ + } else { + return maxSubsessionDuration; // all subsession durations are the same + } +} + +void ServerMediaSession::noteLiveness() { + // default implementation: do nothing +} + +void ServerMediaSession::deleteAllSubsessions() { + Medium::close(fSubsessionsHead); + fSubsessionsHead = fSubsessionsTail = NULL; + fSubsessionCounter = 0; +} + +Boolean ServerMediaSession::isServerMediaSession() const { + return True; +} + +char* ServerMediaSession::generateSDPDescription(int addressFamily) { + struct sockaddr_storage ourAddress; + if (addressFamily == AF_INET) { + ourAddress.ss_family = AF_INET; + ((sockaddr_in&)ourAddress).sin_addr.s_addr = ourIPv4Address(envir()); + } else { // IPv6 + ourAddress.ss_family = AF_INET6; + for (unsigned i = 0; i < 16; ++i) { + ((sockaddr_in6&)ourAddress).sin6_addr.s6_addr[i] = ourIPv6Address(envir())[i]; + } + } + + AddressString ipAddressStr(ourAddress); + unsigned ipAddressStrSize = strlen(ipAddressStr.val()); + + // For a SSM sessions, we need a "a=source-filter: incl ..." line also: + char* sourceFilterLine; + if (fIsSSM) { + char const* const sourceFilterFmt = + "a=source-filter: incl IN %s * %s\r\n" + "a=rtcp-unicast: reflection\r\n"; + unsigned const sourceFilterFmtSize + = strlen(sourceFilterFmt) + 3/*IP4 or IP6*/ + ipAddressStrSize + 1; + + sourceFilterLine = new char[sourceFilterFmtSize]; + sprintf(sourceFilterLine, sourceFilterFmt, + addressFamily == AF_INET ? "IP4" : "IP6", + ipAddressStr.val()); + } else { + sourceFilterLine = strDup(""); + } + + char* rangeLine = NULL; // for now + char* sdp = NULL; // for now + + do { + // Count the lengths of each subsession's media-level SDP lines. + // (We do this first, because the call to "subsession->sdpLines()" + // causes correct subsession 'duration()'s to be calculated later.) + unsigned sdpLength = 0; + ServerMediaSubsession* subsession; + for (subsession = fSubsessionsHead; subsession != NULL; + subsession = subsession->fNext) { + char const* sdpLines = subsession->sdpLines(addressFamily); + if (sdpLines == NULL) continue; // the media's not available + sdpLength += strlen(sdpLines); + } + if (sdpLength == 0) break; // the session has no usable subsessions + + // Unless subsessions have differing durations, we also have a "a=range:" line: + float dur = duration(); + if (dur == 0.0) { + rangeLine = strDup("a=range:npt=now-\r\n"); + } else if (dur > 0.0) { + char buf[100]; + sprintf(buf, "a=range:npt=0-%.3f\r\n", dur); + rangeLine = strDup(buf); + } else { // subsessions have differing durations, so "a=range:" lines go there + rangeLine = strDup(""); + } + + char const* const sdpPrefixFmt = + "v=0\r\n" + "o=- %ld%06ld %d IN %s %s\r\n" + "s=%s\r\n" + "i=%s\r\n" + "t=0 0\r\n" + "a=tool:%s%s\r\n" + "a=type:broadcast\r\n" + "a=control:*\r\n" + "%s" + "%s" + "a=x-qt-text-nam:%s\r\n" + "a=x-qt-text-inf:%s\r\n" + "%s"; + sdpLength += strlen(sdpPrefixFmt) + + 20 + 6 + 20 + 3/*IP4 or IP6*/ + ipAddressStrSize + + strlen(fDescriptionSDPString) + + strlen(fInfoSDPString) + + strlen(libNameStr) + strlen(libVersionStr) + + strlen(sourceFilterLine) + + strlen(rangeLine) + + strlen(fDescriptionSDPString) + + strlen(fInfoSDPString) + + strlen(fMiscSDPLines); + sdpLength += 1000; // in case the length of the "subsession->sdpLines()" calls below change + sdp = new char[sdpLength]; + if (sdp == NULL) break; + + // Generate the SDP prefix (session-level lines): + snprintf(sdp, sdpLength, sdpPrefixFmt, + fCreationTime.tv_sec, fCreationTime.tv_usec, // o= + 1, // o= // (needs to change if params are modified) + addressFamily == AF_INET ? "IP4" : "IP6", // o=
+ ipAddressStr.val(), // o=
+ fDescriptionSDPString, // s= + fInfoSDPString, // i= + libNameStr, libVersionStr, // a=tool: + sourceFilterLine, // a=source-filter: incl (if a SSM session) + rangeLine, // a=range: line + fDescriptionSDPString, // a=x-qt-text-nam: line + fInfoSDPString, // a=x-qt-text-inf: line + fMiscSDPLines); // miscellaneous session SDP lines (if any) + + // Then, add the (media-level) lines for each subsession: + char* mediaSDP = sdp; + for (subsession = fSubsessionsHead; subsession != NULL; + subsession = subsession->fNext) { + unsigned mediaSDPLength = strlen(mediaSDP); + mediaSDP += mediaSDPLength; + sdpLength -= mediaSDPLength; + if (sdpLength <= 1) break; // the SDP has somehow become too long + + char const* sdpLines = subsession->sdpLines(addressFamily); + if (sdpLines != NULL) snprintf(mediaSDP, sdpLength, "%s", sdpLines); + } + } while (0); + + delete[] rangeLine; delete[] sourceFilterLine; + return sdp; +} + + +////////// ServerMediaSubsessionIterator ////////// + +ServerMediaSubsessionIterator +::ServerMediaSubsessionIterator(ServerMediaSession& session) + : fOurSession(session) { + reset(); +} + +ServerMediaSubsessionIterator::~ServerMediaSubsessionIterator() { +} + +ServerMediaSubsession* ServerMediaSubsessionIterator::next() { + ServerMediaSubsession* result = fNextPtr; + + if (fNextPtr != NULL) fNextPtr = fNextPtr->fNext; + + return result; +} + +void ServerMediaSubsessionIterator::reset() { + fNextPtr = fOurSession.fSubsessionsHead; +} + + +////////// ServerMediaSubsession ////////// + +ServerMediaSubsession::ServerMediaSubsession(UsageEnvironment& env) + : Medium(env), + fParentSession(NULL), fNext(NULL), fTrackNumber(0), fTrackId(NULL) { +} + +ServerMediaSubsession::~ServerMediaSubsession() { + delete[] (char*)fTrackId; + Medium::close(fNext); +} + +char const* ServerMediaSubsession::trackId() { + if (fTrackNumber == 0) return NULL; // not yet in a ServerMediaSession + + if (fTrackId == NULL) { + char buf[100]; + sprintf(buf, "track%d", fTrackNumber); + fTrackId = strDup(buf); + } + return fTrackId; +} + +void ServerMediaSubsession::pauseStream(unsigned /*clientSessionId*/, + void* /*streamToken*/) { + // default implementation: do nothing +} +void ServerMediaSubsession::seekStream(unsigned /*clientSessionId*/, + void* /*streamToken*/, double& /*seekNPT*/, double /*streamDuration*/, u_int64_t& numBytes) { + // default implementation: do nothing + numBytes = 0; +} +void ServerMediaSubsession::seekStream(unsigned /*clientSessionId*/, + void* /*streamToken*/, char*& absStart, char*& absEnd) { + // default implementation: do nothing (but delete[] and assign "absStart" and "absEnd" to NULL, to show that we don't handle this) + delete[] absStart; absStart = NULL; + delete[] absEnd; absEnd = NULL; +} +void ServerMediaSubsession::nullSeekStream(unsigned /*clientSessionId*/, void* /*streamToken*/, + double streamEndTime, u_int64_t& numBytes) { + // default implementation: do nothing + numBytes = 0; +} +void ServerMediaSubsession::setStreamScale(unsigned /*clientSessionId*/, + void* /*streamToken*/, float /*scale*/) { + // default implementation: do nothing +} +float ServerMediaSubsession::getCurrentNPT(void* /*streamToken*/) { + // default implementation: return 0.0 + return 0.0; +} +FramedSource* ServerMediaSubsession::getStreamSource(void* /*streamToken*/) { + // default implementation: return NULL + return NULL; +} +void ServerMediaSubsession::deleteStream(unsigned /*clientSessionId*/, + void*& /*streamToken*/) { + // default implementation: do nothing +} + +void ServerMediaSubsession::testScaleFactor(float& scale) { + // default implementation: Support scale = 1 only + scale = 1; +} + +float ServerMediaSubsession::duration() const { + // default implementation: assume an unbounded session: + return 0.0; +} + +void ServerMediaSubsession::getAbsoluteTimeRange(char*& absStartTime, char*& absEndTime) const { + // default implementation: We don't support seeking by 'absolute' time, so indicate this by setting both parameters to NULL: + absStartTime = absEndTime = NULL; +} + +char const* +ServerMediaSubsession::rangeSDPLine() const { + // First, check for the special case where we support seeking by 'absolute' time: + char* absStart = NULL; char* absEnd = NULL; + getAbsoluteTimeRange(absStart, absEnd); + if (absStart != NULL) { + char buf[100]; + + if (absEnd != NULL) { + sprintf(buf, "a=range:clock=%s-%s\r\n", absStart, absEnd); + } else { + sprintf(buf, "a=range:clock=%s-\r\n", absStart); + } + return strDup(buf); + } + + if (fParentSession == NULL) return NULL; + + // If all of our parent's subsessions have the same duration + // (as indicated by "fParentSession->duration() >= 0"), there's no "a=range:" line: + if (fParentSession->duration() >= 0.0) return strDup(""); + + // Use our own duration for a "a=range:" line: + float ourDuration = duration(); + if (ourDuration == 0.0) { + return strDup("a=range:npt=now-\r\n"); + } else { + char buf[100]; + sprintf(buf, "a=range:npt=0-%.3f\r\n", ourDuration); + return strDup(buf); + } +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/SimpleRTPSink.cpp b/src/big/mpp/middleware/src/live555/liveMedia/SimpleRTPSink.cpp new file mode 100644 index 000000000..ca7b920d8 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/SimpleRTPSink.cpp @@ -0,0 +1,94 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A simple RTP sink that packs frames into each outgoing +// packet, without any fragmentation or special headers. +// Implementation + +#include "SimpleRTPSink.hh" + +SimpleRTPSink::SimpleRTPSink(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency, + char const* sdpMediaTypeString, + char const* rtpPayloadFormatName, + unsigned numChannels, + Boolean allowMultipleFramesPerPacket, + Boolean doNormalMBitRule) + : MultiFramedRTPSink(env, RTPgs, rtpPayloadFormat, + rtpTimestampFrequency, rtpPayloadFormatName, + numChannels), + fAllowMultipleFramesPerPacket(allowMultipleFramesPerPacket), fSetMBitOnNextPacket(False) { + fSDPMediaTypeString + = strDup(sdpMediaTypeString == NULL ? "unknown" : sdpMediaTypeString); + fSetMBitOnLastFrames = doNormalMBitRule && strcmp(fSDPMediaTypeString, "audio") != 0; +} + +SimpleRTPSink::~SimpleRTPSink() { + delete[] (char*)fSDPMediaTypeString; +} + +SimpleRTPSink* +SimpleRTPSink::createNew(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency, + char const* sdpMediaTypeString, + char const* rtpPayloadFormatName, + unsigned numChannels, + Boolean allowMultipleFramesPerPacket, + Boolean doNormalMBitRule) { + return new SimpleRTPSink(env, RTPgs, + rtpPayloadFormat, rtpTimestampFrequency, + sdpMediaTypeString, rtpPayloadFormatName, + numChannels, + allowMultipleFramesPerPacket, + doNormalMBitRule); +} + +void SimpleRTPSink::doSpecialFrameHandling(unsigned fragmentationOffset, + unsigned char* frameStart, + unsigned numBytesInFrame, + struct timeval framePresentationTime, + unsigned numRemainingBytes) { + if (numRemainingBytes == 0) { + // This packet contains the last (or only) fragment of the frame. + // Set the RTP 'M' ('marker') bit, if appropriate: + if (fSetMBitOnLastFrames) setMarkerBit(); + } + if (fSetMBitOnNextPacket) { + // An external object has asked for the 'M' bit to be set on the next packet: + setMarkerBit(); + fSetMBitOnNextPacket = False; + } + + // Important: Also call our base class's doSpecialFrameHandling(), + // to set the packet's timestamp: + MultiFramedRTPSink::doSpecialFrameHandling(fragmentationOffset, + frameStart, numBytesInFrame, + framePresentationTime, + numRemainingBytes); +} + +Boolean SimpleRTPSink:: +frameCanAppearAfterPacketStart(unsigned char const* /*frameStart*/, + unsigned /*numBytesInFrame*/) const { + return fAllowMultipleFramesPerPacket; +} + +char const* SimpleRTPSink::sdpMediaType() const { + return fSDPMediaTypeString; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/SimpleRTPSource.cpp b/src/big/mpp/middleware/src/live555/liveMedia/SimpleRTPSource.cpp new file mode 100644 index 000000000..0d7a6a3a1 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/SimpleRTPSource.cpp @@ -0,0 +1,68 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A RTP source for a simple RTP payload format that +// - doesn't have any special headers following the RTP header +// - doesn't have any special framing apart from the packet data itself +// Implementation + +#include "SimpleRTPSource.hh" +#include + +SimpleRTPSource* +SimpleRTPSource::createNew(UsageEnvironment& env, + Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency, + char const* mimeTypeString, + unsigned offset, Boolean doNormalMBitRule) { + return new SimpleRTPSource(env, RTPgs, rtpPayloadFormat, + rtpTimestampFrequency, + mimeTypeString, offset, doNormalMBitRule); +} + +SimpleRTPSource +::SimpleRTPSource(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency, + char const* mimeTypeString, + unsigned offset, Boolean doNormalMBitRule) + : MultiFramedRTPSource(env, RTPgs, + rtpPayloadFormat, rtpTimestampFrequency), + fMIMEtypeString(strDup(mimeTypeString)), fOffset(offset) { + fUseMBitForFrameEnd = doNormalMBitRule && strncmp(mimeTypeString, "audio/", 6) != 0; +} + +SimpleRTPSource::~SimpleRTPSource() { + delete[] (char*)fMIMEtypeString; +} + +Boolean SimpleRTPSource +::processSpecialHeader(BufferedPacket* packet, + unsigned& resultSpecialHeaderSize) { + fCurrentPacketCompletesFrame + = !fUseMBitForFrameEnd || packet->rtpMarkerBit(); + + resultSpecialHeaderSize = fOffset; + return True; +} + +char const* SimpleRTPSource::MIMEtype() const { + if (fMIMEtypeString == NULL) return MultiFramedRTPSource::MIMEtype(); + + return fMIMEtypeString; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/StreamParser.cpp b/src/big/mpp/middleware/src/live555/liveMedia/StreamParser.cpp new file mode 100644 index 000000000..1ad13fe30 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/StreamParser.cpp @@ -0,0 +1,210 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Abstract class for parsing a byte stream +// Implementation + +#include "StreamParser.hh" + +#include +#include + +#define BANK_SIZE 512 * 1024 + +void StreamParser::flushInput() { + fCurParserIndex = fSavedParserIndex = 0; + fSavedRemainingUnparsedBits = fRemainingUnparsedBits = 0; + fTotNumValidBytes = 0; +} + +StreamParser::StreamParser(FramedSource* inputSource, + FramedSource::onCloseFunc* onInputCloseFunc, + void* onInputCloseClientData, + clientContinueFunc* clientContinueFunc, + void* clientContinueClientData) + : fInputSource(inputSource), fClientOnInputCloseFunc(onInputCloseFunc), + fClientOnInputCloseClientData(onInputCloseClientData), + fClientContinueFunc(clientContinueFunc), + fClientContinueClientData(clientContinueClientData), + fSavedParserIndex(0), fSavedRemainingUnparsedBits(0), + fCurParserIndex(0), fRemainingUnparsedBits(0), + fTotNumValidBytes(0), fHaveSeenEOF(False) { + fBank[0] = new unsigned char[BANK_SIZE]; + fBank[1] = new unsigned char[BANK_SIZE]; + fCurBankNum = 0; + fCurBank = fBank[fCurBankNum]; + + fLastSeenPresentationTime.tv_sec = 0; fLastSeenPresentationTime.tv_usec = 0; +} + +StreamParser::~StreamParser() { + delete[] fBank[0]; delete[] fBank[1]; +} + +void StreamParser::saveParserState() { + fSavedParserIndex = fCurParserIndex; + fSavedRemainingUnparsedBits = fRemainingUnparsedBits; +} + +void StreamParser::restoreSavedParserState() { + fCurParserIndex = fSavedParserIndex; + fRemainingUnparsedBits = fSavedRemainingUnparsedBits; +} + +void StreamParser::skipBits(unsigned numBits) { + if (numBits <= fRemainingUnparsedBits) { + fRemainingUnparsedBits -= numBits; + } else { + numBits -= fRemainingUnparsedBits; + + unsigned numBytesToExamine = (numBits+7)/8; // round up + ensureValidBytes(numBytesToExamine); + fCurParserIndex += numBytesToExamine; + + fRemainingUnparsedBits = 8*numBytesToExamine - numBits; + } +} + +unsigned StreamParser::getBits(unsigned numBits) { + if (numBits <= fRemainingUnparsedBits) { + unsigned char lastByte = *lastParsed(); + lastByte >>= (fRemainingUnparsedBits - numBits); + fRemainingUnparsedBits -= numBits; + + return (unsigned)lastByte &~ ((~0u)< 0) { + lastByte = *lastParsed(); + } else { + lastByte = 0; + } + + unsigned remainingBits = numBits - fRemainingUnparsedBits; // > 0 + + // For simplicity, read the next 4 bytes, even though we might not + // need all of them here: + unsigned result = test4Bytes(); + + result >>= (32 - remainingBits); + result |= (lastByte << remainingBits); + if (numBits < 32) result &=~ ((~0u)<maxFrameSize(); + if (maxInputFrameSize > numBytesNeeded) numBytesNeeded = maxInputFrameSize; + + // First, check whether these new bytes would overflow the current + // bank. If so, start using a new bank now. + if (fCurParserIndex + numBytesNeeded > BANK_SIZE) { + // Swap banks, but save any still-needed bytes from the old bank: + unsigned numBytesToSave = fTotNumValidBytes - fSavedParserIndex; + unsigned char const* from = &curBank()[fSavedParserIndex]; + + fCurBankNum = (fCurBankNum + 1)%2; + fCurBank = fBank[fCurBankNum]; + memmove(curBank(), from, numBytesToSave); + fCurParserIndex = fCurParserIndex - fSavedParserIndex; + fSavedParserIndex = 0; + fTotNumValidBytes = numBytesToSave; + } + + // ASSERT: fCurParserIndex + numBytesNeeded > fTotNumValidBytes + // && fCurParserIndex + numBytesNeeded <= BANK_SIZE + if (fCurParserIndex + numBytesNeeded > BANK_SIZE) { + // If this happens, it means that we have too much saved parser state. + // To fix this, increase BANK_SIZE as appropriate. + fInputSource->envir() << "StreamParser internal error (" + << fCurParserIndex << " + " + << numBytesNeeded << " > " + << BANK_SIZE << ")\n"; + fInputSource->envir().internalError(); + } + + // Try to read as many new bytes as will fit in the current bank: + unsigned maxNumBytesToRead = BANK_SIZE - fTotNumValidBytes; + fInputSource->getNextFrame(&curBank()[fTotNumValidBytes], + maxNumBytesToRead, + afterGettingBytes, this, + onInputClosure, this); + + throw NO_MORE_BUFFERED_INPUT; +} + +void StreamParser::afterGettingBytes(void* clientData, + unsigned numBytesRead, + unsigned /*numTruncatedBytes*/, + struct timeval presentationTime, + unsigned /*durationInMicroseconds*/){ + StreamParser* parser = (StreamParser*)clientData; + if (parser != NULL) parser->afterGettingBytes1(numBytesRead, presentationTime); +} + +void StreamParser::afterGettingBytes1(unsigned numBytesRead, struct timeval presentationTime) { + // Sanity check: Make sure we didn't get too many bytes for our bank: + if (fTotNumValidBytes + numBytesRead > BANK_SIZE) { + fInputSource->envir() + << "StreamParser::afterGettingBytes() warning: read " + << numBytesRead << " bytes; expected no more than " + << BANK_SIZE - fTotNumValidBytes << "\n"; + } + + fLastSeenPresentationTime = presentationTime; + + unsigned char* ptr = &curBank()[fTotNumValidBytes]; + fTotNumValidBytes += numBytesRead; + + // Continue our original calling source where it left off: + restoreSavedParserState(); + // Sigh... this is a crock; things would have been a lot simpler + // here if we were using threads, with synchronous I/O... + fClientContinueFunc(fClientContinueClientData, ptr, numBytesRead, presentationTime); +} + +void StreamParser::onInputClosure(void* clientData) { + StreamParser* parser = (StreamParser*)clientData; + if (parser != NULL) parser->onInputClosure1(); +} + +void StreamParser::onInputClosure1() { + if (!fHaveSeenEOF) { + // We're hitting EOF for the first time. Set our 'EOF' flag, and continue parsing, as if we'd just read 0 bytes of data. + // This allows the parser to re-parse any remaining unparsed data (perhaps while testing for EOF at the end): + fHaveSeenEOF = True; + afterGettingBytes1(0, fLastSeenPresentationTime); + } else { + // We're hitting EOF for the second time. Now, we handle the source input closure: + fHaveSeenEOF = False; + if (fClientOnInputCloseFunc != NULL) (*fClientOnInputCloseFunc)(fClientOnInputCloseClientData); + } +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/StreamParser.hh b/src/big/mpp/middleware/src/live555/liveMedia/StreamParser.hh new file mode 100644 index 000000000..ab97d43a7 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/StreamParser.hh @@ -0,0 +1,167 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Abstract class for parsing a byte stream +// C++ header + +#ifndef _STREAM_PARSER_HH +#define _STREAM_PARSER_HH + +#ifndef _FRAMED_SOURCE_HH +#include "FramedSource.hh" +#endif + +class StreamParser { +public: + virtual void flushInput(); + +protected: // we're a virtual base class + typedef void (clientContinueFunc)(void* clientData, + unsigned char* ptr, unsigned size, + struct timeval presentationTime); + StreamParser(FramedSource* inputSource, + FramedSource::onCloseFunc* onInputCloseFunc, + void* onInputCloseClientData, + clientContinueFunc* clientContinueFunc, + void* clientContinueClientData); + virtual ~StreamParser(); + + void saveParserState(); + virtual void restoreSavedParserState(); + + u_int32_t get4Bytes() { // byte-aligned; returned in big-endian order + u_int32_t result = test4Bytes(); + fCurParserIndex += 4; + fRemainingUnparsedBits = 0; + + return result; + } + u_int32_t test4Bytes() { // as above, but doesn't advance ptr + ensureValidBytes(4); + + unsigned char const* ptr = nextToParse(); + return (ptr[0]<<24)|(ptr[1]<<16)|(ptr[2]<<8)|ptr[3]; + } + + u_int16_t get2Bytes() { + ensureValidBytes(2); + + unsigned char const* ptr = nextToParse(); + u_int16_t result = (ptr[0]<<8)|ptr[1]; + + fCurParserIndex += 2; + fRemainingUnparsedBits = 0; + + return result; + } + u_int16_t test2Bytes() { + ensureValidBytes(2); + + unsigned char const* ptr = nextToParse(); + return (ptr[0]<<8)|ptr[1]; + } + + + u_int8_t get1Byte() { // byte-aligned + ensureValidBytes(1); + fRemainingUnparsedBits = 0; + return curBank()[fCurParserIndex++]; + } + u_int8_t test1Byte() { // as above, but doesn't advance ptr + ensureValidBytes(1); + return nextToParse()[0]; + } + + void getBytes(u_int8_t* to, unsigned numBytes) { + testBytes(to, numBytes); + fCurParserIndex += numBytes; + fRemainingUnparsedBits = 0; + } + void testBytes(u_int8_t* to, unsigned numBytes) { // as above, but doesn't advance ptr + ensureValidBytes(numBytes); + memmove(to, nextToParse(), numBytes); + } + void skipBytes(unsigned numBytes) { + ensureValidBytes(numBytes); + fCurParserIndex += numBytes; + } + + void skipBits(unsigned numBits); + unsigned getBits(unsigned numBits); + // numBits <= 32; returns data into low-order bits of result + + unsigned curOffset() const { return fCurParserIndex; } + + unsigned& totNumValidBytes() { return fTotNumValidBytes; } + + Boolean haveSeenEOF() const { return fHaveSeenEOF; } + + unsigned bankSize() const; + +private: + unsigned char* curBank() { return fCurBank; } + unsigned char* nextToParse() { return &curBank()[fCurParserIndex]; } + unsigned char* lastParsed() { return &curBank()[fCurParserIndex-1]; } + + // makes sure that at least "numBytes" valid bytes remain: + void ensureValidBytes(unsigned numBytesNeeded) { + // common case: inlined: + if (fCurParserIndex + numBytesNeeded <= fTotNumValidBytes) return; + + ensureValidBytes1(numBytesNeeded); + } + void ensureValidBytes1(unsigned numBytesNeeded); + + static void afterGettingBytes(void* clientData, unsigned numBytesRead, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + void afterGettingBytes1(unsigned numBytesRead, struct timeval presentationTime); + + static void onInputClosure(void* clientData); + void onInputClosure1(); + +private: + FramedSource* fInputSource; // should be a byte-stream source?? + FramedSource::onCloseFunc* fClientOnInputCloseFunc; + void* fClientOnInputCloseClientData; + clientContinueFunc* fClientContinueFunc; + void* fClientContinueClientData; + + // Use a pair of 'banks', and swap between them as they fill up: + unsigned char* fBank[2]; + unsigned char fCurBankNum; + unsigned char* fCurBank; + + // The most recent 'saved' parse position: + unsigned fSavedParserIndex; // <= fCurParserIndex + unsigned char fSavedRemainingUnparsedBits; + + // The current position of the parser within the current bank: + unsigned fCurParserIndex; // <= fTotNumValidBytes + unsigned char fRemainingUnparsedBits; // in previous byte: [0,7] + + // The total number of valid bytes stored in the current bank: + unsigned fTotNumValidBytes; // <= BANK_SIZE + + // Whether we have seen EOF on the input source: + Boolean fHaveSeenEOF; + + struct timeval fLastSeenPresentationTime; // hack used for EOF handling +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/StreamReplicator.cpp b/src/big/mpp/middleware/src/live555/liveMedia/StreamReplicator.cpp new file mode 100644 index 000000000..e18d87643 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/StreamReplicator.cpp @@ -0,0 +1,333 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// An class that can be used to create (possibly multiple) 'replicas' of an incoming stream. +// Implementation. + +#include "StreamReplicator.hh" + +////////// Definition of "StreamReplica": The class that implements each stream replica ////////// + +class StreamReplica: public FramedSource { +protected: + friend class StreamReplicator; + StreamReplica(StreamReplicator& ourReplicator); // called only by "StreamReplicator::createStreamReplica()" + virtual ~StreamReplica(); + +private: // redefined virtual functions: + virtual void doGetNextFrame(); + virtual void doStopGettingFrames(); + +private: + static void copyReceivedFrame(StreamReplica* toReplica, StreamReplica* fromReplica); + +private: + StreamReplicator& fOurReplicator; + int fFrameIndex; // 0 or 1, depending upon which frame we're currently requesting; could also be -1 if we've stopped playing + + // Replicas that are currently awaiting data are kept in a (singly-linked) list: + StreamReplica* fNext; +}; + + +////////// StreamReplicator implementation ////////// + +StreamReplicator* StreamReplicator::createNew(UsageEnvironment& env, FramedSource* inputSource, Boolean deleteWhenLastReplicaDies) { + return new StreamReplicator(env, inputSource, deleteWhenLastReplicaDies); +} + +StreamReplicator::StreamReplicator(UsageEnvironment& env, FramedSource* inputSource, Boolean deleteWhenLastReplicaDies) + : Medium(env), + fInputSource(inputSource), fDeleteWhenLastReplicaDies(deleteWhenLastReplicaDies), fInputSourceHasClosed(False), + fNumReplicas(0), fNumActiveReplicas(0), fNumDeliveriesMadeSoFar(0), + fFrameIndex(0), fPrimaryReplica(NULL), fReplicasAwaitingCurrentFrame(NULL), fReplicasAwaitingNextFrame(NULL) { +} + +StreamReplicator::~StreamReplicator() { + Medium::close(fInputSource); +} + +FramedSource* StreamReplicator::createStreamReplica() { + ++fNumReplicas; + return new StreamReplica(*this); +} + +void StreamReplicator::getNextFrame(StreamReplica* replica) { + if (fInputSourceHasClosed) { // handle closure instead + replica->handleClosure(); + return; + } + + if (replica->fFrameIndex == -1) { + // This replica had stopped playing (or had just been created), but is now actively reading. Note this: + replica->fFrameIndex = fFrameIndex; + ++fNumActiveReplicas; + } + + if (fPrimaryReplica == NULL) { + // This is the first replica to request the next unread frame. Make it the 'primary' replica - meaning that we read the frame + // into its buffer, and then copy from this into the other replicas' buffers. + fPrimaryReplica = replica; + + // Arrange to read the next frame into this replica's buffer: + if (fInputSource != NULL) fInputSource->getNextFrame(fPrimaryReplica->fTo, fPrimaryReplica->fMaxSize, + afterGettingFrame, this, onSourceClosure, this); + } else if (replica->fFrameIndex != fFrameIndex) { + // This replica is already asking for the next frame (because it has already received the current frame). Enqueue it: + replica->fNext = fReplicasAwaitingNextFrame; + fReplicasAwaitingNextFrame = replica; + } else { + // This replica is asking for the current frame. Enqueue it: + replica->fNext = fReplicasAwaitingCurrentFrame; + fReplicasAwaitingCurrentFrame = replica; + + if (fInputSource != NULL && !fInputSource->isCurrentlyAwaitingData()) { + // The current frame has already arrived, so deliver it to this replica now: + deliverReceivedFrame(); + } + } +} + +void StreamReplicator::deactivateStreamReplica(StreamReplica* replicaBeingDeactivated) { + if (replicaBeingDeactivated->fFrameIndex == -1) return; // this replica has already been deactivated (or was never activated at all) + + // Assert: fNumActiveReplicas > 0 + if (fNumActiveReplicas == 0) fprintf(stderr, "StreamReplicator::deactivateStreamReplica() Internal Error!\n"); // should not happen + --fNumActiveReplicas; + + // Forget about any frame delivery that might have just been made to this replica: + if (replicaBeingDeactivated->fFrameIndex != fFrameIndex && fNumDeliveriesMadeSoFar > 0) --fNumDeliveriesMadeSoFar; + + replicaBeingDeactivated->fFrameIndex = -1; + + // Check whether the replica being deactivated is the 'primary' replica, or is enqueued awaiting a frame: + if (replicaBeingDeactivated == fPrimaryReplica) { + // We need to replace the 'primary replica', if we can: + if (fReplicasAwaitingCurrentFrame == NULL) { + // There's currently no replacement 'primary replica' + fPrimaryReplica = NULL; + } else { + // There's another replica that we can use as a replacement 'primary replica': + fPrimaryReplica = fReplicasAwaitingCurrentFrame; + fReplicasAwaitingCurrentFrame = fReplicasAwaitingCurrentFrame->fNext; + fPrimaryReplica->fNext = NULL; + } + + // Check whether the read into the old primary replica's buffer is still pending, or has completed: + if (fInputSource != NULL) { + if (fInputSource->isCurrentlyAwaitingData()) { + // We have a pending read into the old primary replica's buffer. + // We need to stop it, and retry the read with a new primary (if available) + fInputSource->stopGettingFrames(); + + if (fPrimaryReplica != NULL) { + fInputSource->getNextFrame(fPrimaryReplica->fTo, fPrimaryReplica->fMaxSize, + afterGettingFrame, this, onSourceClosure, this); + } + } else { + // The read into the old primary replica's buffer has already completed. Copy the data to the new primary replica (if any): + if (fPrimaryReplica != NULL) { + StreamReplica::copyReceivedFrame(fPrimaryReplica, replicaBeingDeactivated); + } else { + // We don't have a new primary replica, so we can't copy the received frame to any new replica that might ask for it. + // Fortunately this should be a very rare occurrence. + } + } + } + } else { + // The replica that's being removed was not our 'primary replica', but make sure it's not on either of our queues: + if (fReplicasAwaitingCurrentFrame != NULL) { + if (replicaBeingDeactivated == fReplicasAwaitingCurrentFrame) { + fReplicasAwaitingCurrentFrame = replicaBeingDeactivated->fNext; + replicaBeingDeactivated->fNext = NULL; + } + else { + for (StreamReplica* r1 = fReplicasAwaitingCurrentFrame; r1->fNext != NULL; r1 = r1->fNext) { + if (r1->fNext == replicaBeingDeactivated) { + r1->fNext = replicaBeingDeactivated->fNext; + replicaBeingDeactivated->fNext = NULL; + break; + } + } + } + } + if (fReplicasAwaitingNextFrame != NULL) { + if (replicaBeingDeactivated == fReplicasAwaitingNextFrame) { + fReplicasAwaitingNextFrame = replicaBeingDeactivated->fNext; + replicaBeingDeactivated->fNext = NULL; + } + else { + for (StreamReplica* r2 = fReplicasAwaitingNextFrame; r2->fNext != NULL; r2 = r2->fNext) { + if (r2->fNext == replicaBeingDeactivated) { + r2->fNext = replicaBeingDeactivated->fNext; + replicaBeingDeactivated->fNext = NULL; + break; + } + } + } + } + + // Check for the possibility that - now that a replica has been deactivated - all other + // replicas have received the current frame, and so now we need to complete delivery to + // the primary replica: + if (fPrimaryReplica != NULL && fInputSource != NULL && !fInputSource->isCurrentlyAwaitingData()) deliverReceivedFrame(); + } + + if (fNumActiveReplicas == 0 && fInputSource != NULL) fInputSource->stopGettingFrames(); // tell our source to stop too +} + +void StreamReplicator::removeStreamReplica(StreamReplica* replicaBeingRemoved) { + // First, handle the replica that's being removed the same way that we would if it were merely being deactivated: + deactivateStreamReplica(replicaBeingRemoved); + + // Assert: fNumReplicas > 0 + if (fNumReplicas == 0) fprintf(stderr, "StreamReplicator::removeStreamReplica() Internal Error!\n"); // should not happen + --fNumReplicas; + + // If this was the last replica, then delete ourselves (if we were set up to do so): + if (fNumReplicas == 0 && fDeleteWhenLastReplicaDies) { + Medium::close(this); + return; + } +} + +void StreamReplicator::afterGettingFrame(void* clientData, unsigned frameSize, unsigned numTruncatedBytes, + struct timeval presentationTime, unsigned durationInMicroseconds) { + ((StreamReplicator*)clientData)->afterGettingFrame(frameSize, numTruncatedBytes, presentationTime, durationInMicroseconds); +} + +void StreamReplicator::afterGettingFrame(unsigned frameSize, unsigned numTruncatedBytes, + struct timeval presentationTime, unsigned durationInMicroseconds) { + // The frame was read into our primary replica's buffer. Update the primary replica's state, but don't complete delivery to it + // just yet. We do that later, after we're sure that we've delivered it to all other replicas. + fPrimaryReplica->fFrameSize = frameSize; + fPrimaryReplica->fNumTruncatedBytes = numTruncatedBytes; + fPrimaryReplica->fPresentationTime = presentationTime; + fPrimaryReplica->fDurationInMicroseconds = durationInMicroseconds; + + deliverReceivedFrame(); +} + +void StreamReplicator::onSourceClosure(void* clientData) { + ((StreamReplicator*)clientData)->onSourceClosure(); +} + +void StreamReplicator::onSourceClosure() { + fInputSourceHasClosed = True; + + // Signal the closure to each replica that is currently awaiting a frame: + StreamReplica* replica; + while ((replica = fReplicasAwaitingCurrentFrame) != NULL) { + fReplicasAwaitingCurrentFrame = replica->fNext; + replica->fNext = NULL; + replica->handleClosure(); + } + while ((replica = fReplicasAwaitingNextFrame) != NULL) { + fReplicasAwaitingNextFrame = replica->fNext; + replica->fNext = NULL; + replica->handleClosure(); + } + if ((replica = fPrimaryReplica) != NULL) { + fPrimaryReplica = NULL; + replica->handleClosure(); + } +} + +void StreamReplicator::deliverReceivedFrame() { + // The 'primary replica' has received its copy of the current frame. + // Copy it (and complete delivery) to any other replica that has requested this frame. + // Then, if no more requests for this frame are expected, complete delivery to the 'primary replica' itself. + StreamReplica* replica; + while ((replica = fReplicasAwaitingCurrentFrame) != NULL) { + fReplicasAwaitingCurrentFrame = replica->fNext; + replica->fNext = NULL; + + // Assert: fPrimaryReplica != NULL + if (fPrimaryReplica == NULL) fprintf(stderr, "StreamReplicator::deliverReceivedFrame() Internal Error 1!\n"); // shouldn't happen + StreamReplica::copyReceivedFrame(replica, fPrimaryReplica); + replica->fFrameIndex = 1 - replica->fFrameIndex; // toggle it (0<->1), because this replica no longer awaits the current frame + ++fNumDeliveriesMadeSoFar; + + // Assert: fNumDeliveriesMadeSoFar < fNumActiveReplicas; // because we still have the 'primary replica' to deliver to + if (!(fNumDeliveriesMadeSoFar < fNumActiveReplicas)) fprintf(stderr, "StreamReplicator::deliverReceivedFrame() Internal Error 2(%d,%d)!\n", fNumDeliveriesMadeSoFar, fNumActiveReplicas); // should not happen + + // Complete delivery to this replica: + FramedSource::afterGetting(replica); + } + + if (fNumDeliveriesMadeSoFar == fNumActiveReplicas - 1 && fPrimaryReplica != NULL) { + // No more requests for this frame are expected, so complete delivery to the 'primary replica': + replica = fPrimaryReplica; + fPrimaryReplica = NULL; + replica->fFrameIndex = 1 - replica->fFrameIndex; // toggle it (0<->1), because this replica no longer awaits the current frame + fFrameIndex = 1 - fFrameIndex; // toggle it (0<->1) for the next frame + fNumDeliveriesMadeSoFar = 0; // reset for the next frame + + if (fReplicasAwaitingNextFrame != NULL) { + // One of the other replicas has already requested the next frame, so make it the next 'primary replica': + fPrimaryReplica = fReplicasAwaitingNextFrame; + fReplicasAwaitingNextFrame = fReplicasAwaitingNextFrame->fNext; + fPrimaryReplica->fNext = NULL; + + // Arrange to read the next frame into this replica's buffer: + if (fInputSource != NULL) fInputSource->getNextFrame(fPrimaryReplica->fTo, fPrimaryReplica->fMaxSize, + afterGettingFrame, this, onSourceClosure, this); + } + + // Move any other replicas that had already requested the next frame to the 'requesting current frame' list: + // Assert: fReplicasAwaitingCurrentFrame == NULL; + if (!(fReplicasAwaitingCurrentFrame == NULL)) fprintf(stderr, "StreamReplicator::deliverReceivedFrame() Internal Error 3!\n"); // should not happen + fReplicasAwaitingCurrentFrame = fReplicasAwaitingNextFrame; + fReplicasAwaitingNextFrame = NULL; + + // Complete delivery to the 'primary' replica (thereby completing all deliveries for this frame): + FramedSource::afterGetting(replica); + } +} + + +////////// StreamReplica implementation ////////// + +StreamReplica::StreamReplica(StreamReplicator& ourReplicator) + : FramedSource(ourReplicator.envir()), + fOurReplicator(ourReplicator), + fFrameIndex(-1/*we haven't started playing yet*/), fNext(NULL) { +} + +StreamReplica::~StreamReplica() { + fOurReplicator.removeStreamReplica(this); +} + +void StreamReplica::doGetNextFrame() { + fOurReplicator.getNextFrame(this); +} + +void StreamReplica::doStopGettingFrames() { + fOurReplicator.deactivateStreamReplica(this); +} + +void StreamReplica::copyReceivedFrame(StreamReplica* toReplica, StreamReplica* fromReplica) { + // First, figure out how much data to copy. ("toReplica" might have a smaller buffer than "fromReplica".) + unsigned numNewBytesToTruncate + = toReplica->fMaxSize < fromReplica->fFrameSize ? fromReplica->fFrameSize - toReplica->fMaxSize : 0; + toReplica->fFrameSize = fromReplica->fFrameSize - numNewBytesToTruncate; + toReplica->fNumTruncatedBytes = fromReplica->fNumTruncatedBytes + numNewBytesToTruncate; + + memmove(toReplica->fTo, fromReplica->fTo, toReplica->fFrameSize); + toReplica->fPresentationTime = fromReplica->fPresentationTime; + toReplica->fDurationInMicroseconds = fromReplica->fDurationInMicroseconds; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/T140TextRTPSink.cpp b/src/big/mpp/middleware/src/live555/liveMedia/T140TextRTPSink.cpp new file mode 100644 index 000000000..be850b51c --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/T140TextRTPSink.cpp @@ -0,0 +1,184 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP sink for T.140 text (RFC 2793) +// Implementation + +#include "T140TextRTPSink.hh" +#include // for "gettimeofday()" + +////////// T140TextRTPSink implementation ////////// + +T140TextRTPSink::T140TextRTPSink(UsageEnvironment& env, Groupsock* RTPgs, unsigned char rtpPayloadFormat) + : TextRTPSink(env, RTPgs, rtpPayloadFormat, 1000/*mandatory RTP timestamp frequency for this payload format*/, "T140"), + fOurIdleFilter(NULL), fAreInIdlePeriod(True) { +} + +T140TextRTPSink::~T140TextRTPSink() { + fSource = fOurIdleFilter; // hack: in case "fSource" had gotten set to NULL before we were called + stopPlaying(); // call this now, because we won't have our 'idle filter' when the base class destructor calls it later. + + // Close our 'idle filter' as well: + Medium::close(fOurIdleFilter); + fSource = NULL; // for the base class destructor, which gets called next +} + +T140TextRTPSink* +T140TextRTPSink::createNew(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat) { + return new T140TextRTPSink(env, RTPgs, rtpPayloadFormat); +} + +Boolean T140TextRTPSink::continuePlaying() { + // First, check whether we have an 'idle filter' set up yet. If not, create it now, and insert it in front of our existing source: + if (fOurIdleFilter == NULL) { + fOurIdleFilter = new T140IdleFilter(envir(), fSource); + } else { + fOurIdleFilter->reassignInputSource(fSource); + } + fSource = fOurIdleFilter; + + // Then call the parent class's implementation: + return MultiFramedRTPSink::continuePlaying(); +} + +void T140TextRTPSink::doSpecialFrameHandling(unsigned /*fragmentationOffset*/, + unsigned char* /*frameStart*/, + unsigned numBytesInFrame, + struct timeval framePresentationTime, + unsigned /*numRemainingBytes*/) { + // Set the RTP 'M' (marker) bit if we have just ended an idle period - i.e., if we were in an idle period, but just got data: + if (fAreInIdlePeriod && numBytesInFrame > 0) setMarkerBit(); + fAreInIdlePeriod = numBytesInFrame == 0; + + setTimestamp(framePresentationTime); +} + +Boolean T140TextRTPSink::frameCanAppearAfterPacketStart(unsigned char const* /*frameStart*/, unsigned /*numBytesInFrame*/) const { + return False; // We don't concatenate input data; instead, send it out immediately +} + + +////////// T140IdleFilter implementation ////////// + +T140IdleFilter::T140IdleFilter(UsageEnvironment& env, FramedSource* inputSource) + : FramedFilter(env, inputSource), + fIdleTimerTask(NULL), + fBufferSize(OutPacketBuffer::maxSize), fNumBufferedBytes(0) { + fBuffer = new char[fBufferSize]; +} + +T140IdleFilter::~T140IdleFilter() { + envir().taskScheduler().unscheduleDelayedTask(fIdleTimerTask); + + delete[] fBuffer; + detachInputSource(); // so that the subsequent ~FramedFilter() doesn't delete it +} + +#define IDLE_TIMEOUT_MICROSECONDS 300000 /* 300 ms */ + +void T140IdleFilter::doGetNextFrame() { + // First, see if we have buffered data that we can deliver: + if (fNumBufferedBytes > 0) { + deliverFromBuffer(); + return; + } + + // We don't have any buffered data, so ask our input source for data (unless we've already done so). + // But also set a timer to expire if this doesn't arrive promptly: + fIdleTimerTask = envir().taskScheduler().scheduleDelayedTask(IDLE_TIMEOUT_MICROSECONDS, handleIdleTimeout, this); + if (fInputSource != NULL && !fInputSource->isCurrentlyAwaitingData()) { + fInputSource->getNextFrame((unsigned char*)fBuffer, fBufferSize, afterGettingFrame, this, onSourceClosure, this); + } +} + +void T140IdleFilter::afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds) { + ((T140IdleFilter*)clientData)->afterGettingFrame(frameSize, numTruncatedBytes, presentationTime, durationInMicroseconds); +} + +void T140IdleFilter::afterGettingFrame(unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds) { + // First, cancel any pending idle timer: + envir().taskScheduler().unscheduleDelayedTask(fIdleTimerTask); + + // Then note the new data that we have in our buffer: + fNumBufferedBytes = frameSize; + fBufferedNumTruncatedBytes = numTruncatedBytes; + fBufferedDataPresentationTime = presentationTime; + fBufferedDataDurationInMicroseconds = durationInMicroseconds; + + // Then, attempt to deliver this data. (If we can't deliver it now, we'll do so the next time the reader asks for data.) + if (isCurrentlyAwaitingData()) (void)deliverFromBuffer(); +} + +void T140IdleFilter::doStopGettingFrames() { + // Cancel any pending idle timer: + envir().taskScheduler().unscheduleDelayedTask(fIdleTimerTask); + + // And call the parent's implementation of this virtual function: + FramedFilter::doStopGettingFrames(); +} + +void T140IdleFilter::handleIdleTimeout(void* clientData) { + ((T140IdleFilter*)clientData)->handleIdleTimeout(); +} + +void T140IdleFilter::handleIdleTimeout() { + fIdleTimerTask = NULL; + // No data has arrived from the upstream source within our specified 'idle period' (after data was requested from downstream). + // Send an empty 'idle' frame to our downstream "T140TextRTPSink". (This will cause an empty RTP packet to get sent.) + deliverEmptyFrame(); +} + +void T140IdleFilter::deliverFromBuffer() { + if (fNumBufferedBytes <= fMaxSize) { // common case + fNumTruncatedBytes = fBufferedNumTruncatedBytes; + fFrameSize = fNumBufferedBytes; + } else { + fNumTruncatedBytes = fBufferedNumTruncatedBytes + fNumBufferedBytes - fMaxSize; + fFrameSize = fMaxSize; + } + + memmove(fTo, fBuffer, fFrameSize); + fPresentationTime = fBufferedDataPresentationTime; + fDurationInMicroseconds = fBufferedDataDurationInMicroseconds; + + fNumBufferedBytes = 0; // reset buffer + + FramedSource::afterGetting(this); // complete delivery +} + +void T140IdleFilter::deliverEmptyFrame() { + fFrameSize = fNumTruncatedBytes = 0; + gettimeofday(&fPresentationTime, NULL); + FramedSource::afterGetting(this); // complete delivery +} + +void T140IdleFilter::onSourceClosure(void* clientData) { + ((T140IdleFilter*)clientData)->onSourceClosure(); +} + +void T140IdleFilter::onSourceClosure() { + envir().taskScheduler().unscheduleDelayedTask(fIdleTimerTask); + + handleClosure(); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/TLSState.cpp b/src/big/mpp/middleware/src/live555/liveMedia/TLSState.cpp new file mode 100644 index 000000000..2eb7e8c78 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/TLSState.cpp @@ -0,0 +1,250 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// State encapsulating a TLS connection +// Implementation + +#include "TLSState.hh" +#include "RTSPClient.hh" +#ifndef NO_OPENSSL +#include +#endif + +////////// TLSState implementation ////////// + +TLSState::TLSState() + : isNeeded(False) +#ifndef NO_OPENSSL + , fHasBeenSetup(False), fCtx(NULL), fCon(NULL) +#endif +{ +} + +TLSState::~TLSState() { +#ifndef NO_OPENSSL + reset(); +#endif +} + +int TLSState::write(const char* data, unsigned count) { +#ifndef NO_OPENSSL + return SSL_write(fCon, data, count); +#else + return -1; +#endif +} + +int TLSState::read(u_int8_t* buffer, unsigned bufferSize) { +#ifndef NO_OPENSSL + int result = SSL_read(fCon, buffer, bufferSize); + if (result <= 0) { + if (SSL_get_error(fCon, result) == SSL_ERROR_WANT_READ) { + // The data can't be delivered yet. Return 0 (bytes read); we'll try again later + return 0; + } + return -1; // assume that the connection has closed + } + return result; +#else + return 0; +#endif +} + +void TLSState::nullify() { +#ifndef NO_OPENSSL + isNeeded = fHasBeenSetup = False; + fCtx = NULL; + fCon = NULL; +#endif +} + +#ifndef NO_OPENSSL +void TLSState::initLibrary() { + static Boolean SSLLibraryHasBeenInitialized = False; + if (!SSLLibraryHasBeenInitialized) { + (void)SSL_library_init(); + SSLLibraryHasBeenInitialized = True; + } +} + +void TLSState::reset() { + if (fHasBeenSetup) SSL_shutdown(fCon); + + if (fCon != NULL) { SSL_free(fCon); fCon = NULL; } + if (fCtx != NULL) { SSL_CTX_free(fCtx); fCtx = NULL; } +} +#endif + + +////////// ClientTLSState implementation ////////// + +ClientTLSState::ClientTLSState(RTSPClient& client) +#ifndef NO_OPENSSL + : fClient(client) +#endif +{ +} + +ClientTLSState::~ClientTLSState() { +} + +int ClientTLSState::connect(int socketNum) { +#ifndef NO_OPENSSL + if (!fHasBeenSetup && !setup(socketNum)) return -1; // error + + // Complete the SSL-level connection to the server: + int sslConnectResult = SSL_connect(fCon); + int sslGetErrorResult = SSL_get_error(fCon, sslConnectResult); + + if (sslConnectResult > 0) { + return sslConnectResult; // connection has completed + } else if (sslConnectResult < 0 + && (sslGetErrorResult == SSL_ERROR_WANT_READ || + sslGetErrorResult == SSL_ERROR_WANT_WRITE)) { + // We need to wait until the socket is readable or writable: + fClient.envir().taskScheduler() + .setBackgroundHandling(socketNum, + sslGetErrorResult == SSL_ERROR_WANT_READ ? SOCKET_READABLE : SOCKET_WRITABLE, + (TaskScheduler::BackgroundHandlerProc*)&RTSPClient::connectionHandler, + &fClient); + return 0; // connection is pending + } else { + fClient.envir().setResultErrMsg("TLS connection to server failed: ", sslGetErrorResult); + return -1; // error + } +#else + return -1; +#endif +} + +#ifndef NO_OPENSSL +Boolean ClientTLSState::setup(int socketNum) { + do { + initLibrary(); + + SSL_METHOD const* meth = SSLv23_client_method(); + if (meth == NULL) break; + + fCtx = SSL_CTX_new(meth); + if (fCtx == NULL) break; + + fCon = SSL_new(fCtx); + if (fCon == NULL) break; + + BIO* bio = BIO_new_socket(socketNum, BIO_NOCLOSE); + SSL_set_bio(fCon, bio, bio); + + SSL_set_connect_state(fCon); + + fHasBeenSetup = True; + return True; + } while (0); + + // An error occurred: + reset(); + return False; +} +#endif + + +////////// ServerTLSState implementation ////////// + +ServerTLSState::ServerTLSState(UsageEnvironment& env) + : tlsAcceptIsNeeded(False) +#ifndef NO_OPENSSL + , fEnv(env), fCertificateFileName(NULL), fPrivateKeyFileName(NULL) +#endif +{ +} + +ServerTLSState::~ServerTLSState() { +} + +void ServerTLSState +::setCertificateAndPrivateKeyFileNames(char const* certFileName, char const* privKeyFileName) { +#ifndef NO_OPENSSL + fCertificateFileName = certFileName; + fPrivateKeyFileName = privKeyFileName; +#endif +} + +void ServerTLSState::assignStateFrom(ServerTLSState const& from) { +#ifndef NO_OPENSSL + isNeeded = from.isNeeded; + fHasBeenSetup = from.fHasBeenSetup; + fCtx = from.fCtx; + fCon = from.fCon; + + fCertificateFileName = from.fCertificateFileName; + fPrivateKeyFileName = from.fPrivateKeyFileName; +#endif +} + +int ServerTLSState::accept(int socketNum) { +#ifndef NO_OPENSSL + if (!fHasBeenSetup && !setup(socketNum)) return -1; // error + + int sslAcceptResult = SSL_accept(fCon); + int sslGetErrorResult = SSL_get_error(fCon, sslAcceptResult); + + if (sslAcceptResult > 0) { + return sslAcceptResult; // success + } else if (sslAcceptResult < 0 && sslGetErrorResult == SSL_ERROR_WANT_READ) { + // We need to wait until the socket is readable: + return 0; // connection is pending + } else { + fEnv.setResultErrMsg("SSL_accept() call failed: ", sslGetErrorResult); + return -1; // error + } +#else + return -1; +#endif +} + +#ifndef NO_OPENSSL +Boolean ServerTLSState::setup(int socketNum) { + do { + initLibrary(); + + SSL_METHOD const* meth = SSLv23_server_method(); + if (meth == NULL) break; + + fCtx = SSL_CTX_new(meth); + if (fCtx == NULL) break; + + if (SSL_CTX_set_ecdh_auto(fCtx, 1) != 1) break; + + if (SSL_CTX_use_certificate_file(fCtx, fCertificateFileName, SSL_FILETYPE_PEM) != 1) break; + + if (SSL_CTX_use_PrivateKey_file(fCtx, fPrivateKeyFileName, SSL_FILETYPE_PEM) != 1) break; + + fCon = SSL_new(fCtx); + if (fCon == NULL) break; + + BIO* bio = BIO_new_socket(socketNum, BIO_NOCLOSE); + SSL_set_bio(fCon, bio, bio); + + fHasBeenSetup = True; + return True; + } while (0); + + // An error occurred: + ERR_print_errors_fp(stderr); + reset(); + return False; +} +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/TextRTPSink.cpp b/src/big/mpp/middleware/src/live555/liveMedia/TextRTPSink.cpp new file mode 100644 index 000000000..ad2c4ab06 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/TextRTPSink.cpp @@ -0,0 +1,36 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A generic RTP sink for text codecs (abstract base class) +// Implementation + +#include "TextRTPSink.hh" + +TextRTPSink::TextRTPSink(UsageEnvironment& env, + Groupsock* rtpgs, unsigned char rtpPayloadType, + unsigned rtpTimestampFrequency, + char const* rtpPayloadFormatName) + : MultiFramedRTPSink(env, rtpgs, rtpPayloadType, rtpTimestampFrequency, + rtpPayloadFormatName) { +} + +TextRTPSink::~TextRTPSink() { +} + +char const* TextRTPSink::sdpMediaType() const { + return "text"; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/TheoraVideoRTPSink.cpp b/src/big/mpp/middleware/src/live555/liveMedia/TheoraVideoRTPSink.cpp new file mode 100644 index 000000000..188a25412 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/TheoraVideoRTPSink.cpp @@ -0,0 +1,176 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP sink for Theora video +// Implementation + +#include "TheoraVideoRTPSink.hh" +#include "Base64.hh" +#include "VorbisAudioRTPSource.hh" // for parseVorbisOrTheoraConfigStr() +#include "VorbisAudioRTPSink.hh" // for generateVorbisOrTheoraConfigStr() + +TheoraVideoRTPSink* TheoraVideoRTPSink +::createNew(UsageEnvironment& env, Groupsock* RTPgs, u_int8_t rtpPayloadFormat, + u_int8_t* identificationHeader, unsigned identificationHeaderSize, + u_int8_t* commentHeader, unsigned commentHeaderSize, + u_int8_t* setupHeader, unsigned setupHeaderSize, + u_int32_t identField) { + return new TheoraVideoRTPSink(env, RTPgs, + rtpPayloadFormat, + identificationHeader, identificationHeaderSize, + commentHeader, commentHeaderSize, + setupHeader, setupHeaderSize, identField); +} + +TheoraVideoRTPSink* TheoraVideoRTPSink +::createNew(UsageEnvironment& env, Groupsock* RTPgs, u_int8_t rtpPayloadFormat, + char const* configStr) { + // Begin by decoding and unpacking the configuration string: + u_int8_t* identificationHeader; unsigned identificationHeaderSize; + u_int8_t* commentHeader; unsigned commentHeaderSize; + u_int8_t* setupHeader; unsigned setupHeaderSize; + u_int32_t identField; + + parseVorbisOrTheoraConfigStr(configStr, + identificationHeader, identificationHeaderSize, + commentHeader, commentHeaderSize, + setupHeader, setupHeaderSize, + identField); + + TheoraVideoRTPSink* resultSink + = new TheoraVideoRTPSink(env, RTPgs, rtpPayloadFormat, + identificationHeader, identificationHeaderSize, + commentHeader, commentHeaderSize, + setupHeader, setupHeaderSize, + identField); + delete[] identificationHeader; delete[] commentHeader; delete[] setupHeader; + + return resultSink; +} + +TheoraVideoRTPSink +::TheoraVideoRTPSink(UsageEnvironment& env, Groupsock* RTPgs, u_int8_t rtpPayloadFormat, + u_int8_t* identificationHeader, unsigned identificationHeaderSize, + u_int8_t* commentHeader, unsigned commentHeaderSize, + u_int8_t* setupHeader, unsigned setupHeaderSize, + u_int32_t identField) + : VideoRTPSink(env, RTPgs, rtpPayloadFormat, 90000, "THEORA"), + fIdent(identField), fFmtpSDPLine(NULL) { + static const char *pf_to_str[] = { + "YCbCr-4:2:0", + "Reserved", + "YCbCr-4:2:2", + "YCbCr-4:4:4", + }; + + unsigned width = 1280; // default value + unsigned height = 720; // default value + unsigned pf = 0; // default value + if (identificationHeaderSize >= 42) { + // Parse this header to get the "width", "height", "pf" (pixel format), and + // 'nominal bitrate' parameters: + u_int8_t* p = identificationHeader; // alias + width = (p[14]<<16)|(p[15]<<8)|p[16]; + height = (p[17]<<16)|(p[18]<<8)|p[19]; + pf = (p[41]&0x18)>>3; + unsigned nominalBitrate = (p[37]<<16)|(p[38]<<8)|p[39]; + if (nominalBitrate > 0) estimatedBitrate() = nominalBitrate/1000; + } + + // Generate a 'config' string from the supplied configuration headers: + char* base64PackedHeaders + = generateVorbisOrTheoraConfigStr(identificationHeader, identificationHeaderSize, + commentHeader, commentHeaderSize, + setupHeader, setupHeaderSize, + identField); + if (base64PackedHeaders == NULL) return; + + // Then use this 'config' string to construct our "a=fmtp:" SDP line: + unsigned fmtpSDPLineMaxSize = 200 + strlen(base64PackedHeaders);// 200 => more than enough space + fFmtpSDPLine = new char[fmtpSDPLineMaxSize]; + sprintf(fFmtpSDPLine, "a=fmtp:%d sampling=%s;width=%u;height=%u;delivery-method=out_band/rtsp;configuration=%s\r\n", rtpPayloadType(), pf_to_str[pf], width, height, base64PackedHeaders); + delete[] base64PackedHeaders; +} + +TheoraVideoRTPSink::~TheoraVideoRTPSink() { + delete[] fFmtpSDPLine; +} + +char const* TheoraVideoRTPSink::auxSDPLine() { + return fFmtpSDPLine; +} + +void TheoraVideoRTPSink +::doSpecialFrameHandling(unsigned fragmentationOffset, + unsigned char* frameStart, + unsigned numBytesInFrame, + struct timeval framePresentationTime, + unsigned numRemainingBytes) { + // Set the 4-byte "payload header", as defined in http://svn.xiph.org/trunk/theora/doc/draft-ietf-avt-rtp-theora-00.txt + u_int8_t header[6]; + + // The three bytes of the header are our "Ident": + header[0] = fIdent>>16; header[1] = fIdent>>8; header[2] = fIdent; + + // The final byte contains the "F", "TDT", and "numPkts" fields: + u_int8_t F; // Fragment type + if (numRemainingBytes > 0) { + if (fragmentationOffset > 0) { + F = 2<<6; // continuation fragment + } else { + F = 1<<6; // start fragment + } + } else { + if (fragmentationOffset > 0) { + F = 3<<6; // end fragment + } else { + F = 0<<6; // not fragmented + } + } + u_int8_t const TDT = 0<<4; // Theora Data Type (always a "Raw Theora payload") + u_int8_t numPkts = F == 0 ? (numFramesUsedSoFar() + 1): 0; // set to 0 when we're a fragment + header[3] = F|TDT|numPkts; + + // There's also a 2-byte 'frame-specific' header: The length of the + // Theora data: + header[4] = numBytesInFrame >>8; + header[5] = numBytesInFrame; + setSpecialHeaderBytes(header, sizeof(header)); + + if (numRemainingBytes == 0) { + // This packet contains the last (or only) fragment of the frame. + // Set the RTP 'M' ('marker') bit: + setMarkerBit(); + } + + // Important: Also call our base class's doSpecialFrameHandling(), + // to set the packet's timestamp: + MultiFramedRTPSink::doSpecialFrameHandling(fragmentationOffset, + frameStart, numBytesInFrame, + framePresentationTime, + numRemainingBytes); +} + +Boolean TheoraVideoRTPSink::frameCanAppearAfterPacketStart(unsigned char const* /*frameStart*/, + unsigned /*numBytesInFrame*/) const { + // Only one frame per packet: + return False; +} + +unsigned TheoraVideoRTPSink::specialHeaderSize() const { + return 6; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/TheoraVideoRTPSource.cpp b/src/big/mpp/middleware/src/live555/liveMedia/TheoraVideoRTPSource.cpp new file mode 100644 index 000000000..d8ecd6d0b --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/TheoraVideoRTPSource.cpp @@ -0,0 +1,113 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Theora Video RTP Sources +// Implementation + +#include "TheoraVideoRTPSource.hh" + +////////// TheoraBufferedPacket and TheoraBufferedPacketFactory ////////// + +class TheoraBufferedPacket: public BufferedPacket { +public: + TheoraBufferedPacket(); + virtual ~TheoraBufferedPacket(); + +private: // redefined virtual functions + virtual unsigned nextEnclosedFrameSize(unsigned char*& framePtr, + unsigned dataSize); +}; + +class TheoraBufferedPacketFactory: public BufferedPacketFactory { +private: // redefined virtual functions + virtual BufferedPacket* createNewPacket(MultiFramedRTPSource* ourSource); +}; + + +///////// TheoraVideoRTPSource implementation //////// + +TheoraVideoRTPSource* +TheoraVideoRTPSource::createNew(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat) { + return new TheoraVideoRTPSource(env, RTPgs, rtpPayloadFormat); +} + +TheoraVideoRTPSource +::TheoraVideoRTPSource(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat) + : MultiFramedRTPSource(env, RTPgs, rtpPayloadFormat, 90000, + new TheoraBufferedPacketFactory), + fCurPacketIdent(0) { +} + +TheoraVideoRTPSource::~TheoraVideoRTPSource() { +} + +Boolean TheoraVideoRTPSource +::processSpecialHeader(BufferedPacket* packet, + unsigned& resultSpecialHeaderSize) { + unsigned char* headerStart = packet->data(); + unsigned packetSize = packet->dataSize(); + + resultSpecialHeaderSize = 4; + if (packetSize < resultSpecialHeaderSize) return False; // packet was too small + + // The first 3 bytes of the header are the "Ident" field: + fCurPacketIdent = (headerStart[0]<<16) | (headerStart[1]<<8) | headerStart[2]; + + // The 4th byte is F|TDT|numPkts. + // Reject any packet with TDT == 3: + if ((headerStart[3]&0x30) == 0x30) return False; + + u_int8_t F = headerStart[3]>>6; + fCurrentPacketBeginsFrame = F <= 1; // "Not Fragmented" or "Start Fragment" + fCurrentPacketCompletesFrame = F == 0 || F == 3; // "Not Fragmented" or "End Fragment" + + return True; +} + +char const* TheoraVideoRTPSource::MIMEtype() const { + return "video/THEORA"; +} + + +////////// TheoraBufferedPacket and TheoraBufferedPacketFactory implementation ////////// + +TheoraBufferedPacket::TheoraBufferedPacket() { +} + +TheoraBufferedPacket::~TheoraBufferedPacket() { +} + +unsigned TheoraBufferedPacket +::nextEnclosedFrameSize(unsigned char*& framePtr, unsigned dataSize) { + if (dataSize < 2) { + // There's not enough space for a 2-byte header. TARFU! Just return the data that's left: + return dataSize; + } + + unsigned frameSize = (framePtr[0]<<8) | framePtr[1]; + framePtr += 2; + if (frameSize > dataSize - 2) return dataSize - 2; // inconsistent frame size => just return all the data that's left + + return frameSize; +} + +BufferedPacket* TheoraBufferedPacketFactory +::createNewPacket(MultiFramedRTPSource* /*ourSource*/) { + return new TheoraBufferedPacket(); +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/VP8VideoRTPSink.cpp b/src/big/mpp/middleware/src/live555/liveMedia/VP8VideoRTPSink.cpp new file mode 100644 index 000000000..aa0d294fb --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/VP8VideoRTPSink.cpp @@ -0,0 +1,68 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP sink for VP8 video +// Implementation + +#include "VP8VideoRTPSink.hh" + +VP8VideoRTPSink +::VP8VideoRTPSink(UsageEnvironment& env, Groupsock* RTPgs, unsigned char rtpPayloadFormat) + : VideoRTPSink(env, RTPgs, rtpPayloadFormat, 90000, "VP8") { +} + +VP8VideoRTPSink::~VP8VideoRTPSink() { +} + +VP8VideoRTPSink* +VP8VideoRTPSink::createNew(UsageEnvironment& env, Groupsock* RTPgs, unsigned char rtpPayloadFormat) { + return new VP8VideoRTPSink(env, RTPgs, rtpPayloadFormat); +} + +Boolean VP8VideoRTPSink +::frameCanAppearAfterPacketStart(unsigned char const* /*frameStart*/, + unsigned /*numBytesInFrame*/) const { + // A packet can contain only one frame + return False; +} + +void VP8VideoRTPSink +::doSpecialFrameHandling(unsigned fragmentationOffset, + unsigned char* /*frameStart*/, + unsigned /*numBytesInFrame*/, + struct timeval framePresentationTime, + unsigned numRemainingBytes) { + // Set the "VP8 Payload Descriptor" (just the minimal required 1-byte version): + u_int8_t vp8PayloadDescriptor = fragmentationOffset == 0 ? 0x10 : 0x00; + // X = R = N = 0; PartID = 0; S = 1 iff this is the first (or only) fragment of the frame + setSpecialHeaderBytes(&vp8PayloadDescriptor, 1); + + if (numRemainingBytes == 0) { + // This packet contains the last (or only) fragment of the frame. + // Set the RTP 'M' ('marker') bit: + setMarkerBit(); + } + + // Also set the RTP timestamp: + setTimestamp(framePresentationTime); +} + + +unsigned VP8VideoRTPSink::specialHeaderSize() const { + // We include only the required 1-byte form of the "VP8 Payload Descriptor": + return 1; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/VP8VideoRTPSource.cpp b/src/big/mpp/middleware/src/live555/liveMedia/VP8VideoRTPSource.cpp new file mode 100644 index 000000000..9432fcc2f --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/VP8VideoRTPSource.cpp @@ -0,0 +1,86 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// VP8 Video RTP Sources +// Implementation + +#include "VP8VideoRTPSource.hh" + +VP8VideoRTPSource* +VP8VideoRTPSource::createNew(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency) { + return new VP8VideoRTPSource(env, RTPgs, rtpPayloadFormat, + rtpTimestampFrequency); +} + +VP8VideoRTPSource +::VP8VideoRTPSource(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency) + : MultiFramedRTPSource(env, RTPgs, rtpPayloadFormat, rtpTimestampFrequency) { +} + +VP8VideoRTPSource::~VP8VideoRTPSource() { +} + +#define incrHeader do { ++resultSpecialHeaderSize; ++headerStart; if (--packetSize == 0) return False; } while (0) + +Boolean VP8VideoRTPSource +::processSpecialHeader(BufferedPacket* packet, + unsigned& resultSpecialHeaderSize) { + unsigned char* headerStart = packet->data(); + unsigned packetSize = packet->dataSize(); + + // The special header is from 1 to 6 bytes long. + if (packetSize == 0) return False; // error + resultSpecialHeaderSize = 1; // unless we learn otherwise + + u_int8_t const byte1 = *headerStart; + Boolean const X = (byte1&0x80) != 0; + Boolean const S = (byte1&0x10) != 0; + u_int8_t const PartID = byte1&0x0F; + + fCurrentPacketBeginsFrame = S && PartID == 0; + fCurrentPacketCompletesFrame = packet->rtpMarkerBit(); // RTP header's "M" bit + + if (X) { + incrHeader; + + u_int8_t const byte2 = *headerStart; + Boolean const I = (byte2&0x80) != 0; + Boolean const L = (byte2&0x40) != 0; + Boolean const T = (byte2&0x20) != 0; + Boolean const K = (byte2&0x10) != 0; + + if (I) { + incrHeader; + if ((*headerStart)&0x80) { // extension flag in the PictureID is set + incrHeader; + } + } + + if (L) incrHeader; + if (T||K) incrHeader; + } + + return True; +} + +char const* VP8VideoRTPSource::MIMEtype() const { + return "video/VP8"; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/VP9VideoRTPSink.cpp b/src/big/mpp/middleware/src/live555/liveMedia/VP9VideoRTPSink.cpp new file mode 100644 index 000000000..2619512b9 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/VP9VideoRTPSink.cpp @@ -0,0 +1,71 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP sink for VP9 video +// Implementation + +#include "VP9VideoRTPSink.hh" + +VP9VideoRTPSink +::VP9VideoRTPSink(UsageEnvironment& env, Groupsock* RTPgs, unsigned char rtpPayloadFormat) + : VideoRTPSink(env, RTPgs, rtpPayloadFormat, 90000, "VP9") { +} + +VP9VideoRTPSink::~VP9VideoRTPSink() { +} + +VP9VideoRTPSink* +VP9VideoRTPSink::createNew(UsageEnvironment& env, Groupsock* RTPgs, unsigned char rtpPayloadFormat) { + return new VP9VideoRTPSink(env, RTPgs, rtpPayloadFormat); +} + +Boolean VP9VideoRTPSink +::frameCanAppearAfterPacketStart(unsigned char const* /*frameStart*/, + unsigned /*numBytesInFrame*/) const { + // A packet can contain only one frame + return False; +} + +void VP9VideoRTPSink +::doSpecialFrameHandling(unsigned fragmentationOffset, + unsigned char* /*frameStart*/, + unsigned /*numBytesInFrame*/, + struct timeval framePresentationTime, + unsigned numRemainingBytes) { + // Set the "VP9 Payload Descriptor" (just the minimal required 1-byte version): + u_int8_t vp9PayloadDescriptor = fragmentationOffset == 0 ? 0x10 : 0x00; + // I = L = F = V = U = 0; S = 1 iff this is the first (or only) fragment of the frame + + if (numRemainingBytes == 0) { + // This packet contains the last (or only) fragment of the frame. + // Set the E bit: + vp9PayloadDescriptor |= 0x08; + // Also set the RTP 'M' ('marker') bit: + setMarkerBit(); + } + + setSpecialHeaderBytes(&vp9PayloadDescriptor, 1); + + // Also set the RTP timestamp: + setTimestamp(framePresentationTime); +} + + +unsigned VP9VideoRTPSink::specialHeaderSize() const { + // We include only the required 1-byte form of the "VP9 Payload Descriptor": + return 1; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/VP9VideoRTPSource.cpp b/src/big/mpp/middleware/src/live555/liveMedia/VP9VideoRTPSource.cpp new file mode 100644 index 000000000..c00df7e29 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/VP9VideoRTPSource.cpp @@ -0,0 +1,108 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// VP9 Video RTP Sources +// Implementation + +#include "VP9VideoRTPSource.hh" + +VP9VideoRTPSource* +VP9VideoRTPSource::createNew(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency) { + return new VP9VideoRTPSource(env, RTPgs, rtpPayloadFormat, + rtpTimestampFrequency); +} + +VP9VideoRTPSource +::VP9VideoRTPSource(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency) + : MultiFramedRTPSource(env, RTPgs, rtpPayloadFormat, rtpTimestampFrequency) { +} + +VP9VideoRTPSource::~VP9VideoRTPSource() { +} + +#define incrHeader do { ++resultSpecialHeaderSize; ++headerStart; if (--packetSize == 0) return False; } while (0) + +Boolean VP9VideoRTPSource +::processSpecialHeader(BufferedPacket* packet, + unsigned& resultSpecialHeaderSize) { + unsigned char* headerStart = packet->data(); + unsigned packetSize = packet->dataSize(); + + // Figure out the size of the special header. + if (packetSize == 0) return False; // error + resultSpecialHeaderSize = 1; // unless we learn otherwise + + u_int8_t const byte1 = *headerStart; + Boolean const I = (byte1&0x80) != 0; + Boolean const L = (byte1&0x40) != 0; + Boolean const F = (byte1&0x20) != 0; + Boolean const B = (byte1&0x10) != 0; + Boolean const E = (byte1&0x08) != 0; + Boolean const V = (byte1&0x04) != 0; + Boolean const U = (byte1&0x02) != 0; + + fCurrentPacketBeginsFrame = B; + fCurrentPacketCompletesFrame = E; + // use this instead of the RTP header's 'M' bit (which might not be accurate) + + if (I) { // PictureID present + incrHeader; + Boolean const M = ((*headerStart)&0x80) != 0; + if (M) incrHeader; + } + + if (L) { // Layer indices present + incrHeader; + if (F) { // Reference indices present + incrHeader; + unsigned R = (*headerStart)&0x03; + while (R-- > 0) { + incrHeader; + Boolean const X = ((*headerStart)&0x10) != 0; + if (X) incrHeader; + } + } + } + + if (V) { // Scalability Structure (SS) present + incrHeader; + unsigned patternLength = *headerStart; + while (patternLength-- > 0) { + incrHeader; + unsigned R = (*headerStart)&0x03; + while (R-- > 0) { + incrHeader; + Boolean const X = ((*headerStart)&0x10) != 0; + if (X) incrHeader; + } + } + } + + if (U) { // Scalability Structure Update (SU) present + return False; // This structure isn't yet defined in the VP9 payload format I-D + } + + return True; +} + +char const* VP9VideoRTPSource::MIMEtype() const { + return "video/VP9"; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/VideoRTPSink.cpp b/src/big/mpp/middleware/src/live555/liveMedia/VideoRTPSink.cpp new file mode 100644 index 000000000..4610e54be --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/VideoRTPSink.cpp @@ -0,0 +1,36 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A generic RTP sink for video codecs (abstract base class) +// Implementation + +#include "VideoRTPSink.hh" + +VideoRTPSink::VideoRTPSink(UsageEnvironment& env, + Groupsock* rtpgs, unsigned char rtpPayloadType, + unsigned rtpTimestampFrequency, + char const* rtpPayloadFormatName) + : MultiFramedRTPSink(env, rtpgs, rtpPayloadType, rtpTimestampFrequency, + rtpPayloadFormatName) { +} + +VideoRTPSink::~VideoRTPSink() { +} + +char const* VideoRTPSink::sdpMediaType() const { + return "video"; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/VorbisAudioRTPSink.cpp b/src/big/mpp/middleware/src/live555/liveMedia/VorbisAudioRTPSink.cpp new file mode 100644 index 000000000..f45e7f1f4 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/VorbisAudioRTPSink.cpp @@ -0,0 +1,266 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP sink for Vorbis audio +// Implementation + +#include "VorbisAudioRTPSink.hh" +#include "Base64.hh" +#include "VorbisAudioRTPSource.hh" // for parseVorbisOrTheoraConfigStr() + +VorbisAudioRTPSink* VorbisAudioRTPSink +::createNew(UsageEnvironment& env, Groupsock* RTPgs, + u_int8_t rtpPayloadFormat, u_int32_t rtpTimestampFrequency, unsigned numChannels, + u_int8_t* identificationHeader, unsigned identificationHeaderSize, + u_int8_t* commentHeader, unsigned commentHeaderSize, + u_int8_t* setupHeader, unsigned setupHeaderSize, + u_int32_t identField) { + return new VorbisAudioRTPSink(env, RTPgs, + rtpPayloadFormat, rtpTimestampFrequency, numChannels, + identificationHeader, identificationHeaderSize, + commentHeader, commentHeaderSize, + setupHeader, setupHeaderSize, + identField); +} + +VorbisAudioRTPSink* VorbisAudioRTPSink +::createNew(UsageEnvironment& env, Groupsock* RTPgs,u_int8_t rtpPayloadFormat, + u_int32_t rtpTimestampFrequency, unsigned numChannels, + char const* configStr) { + // Begin by decoding and unpacking the configuration string: + u_int8_t* identificationHeader; unsigned identificationHeaderSize; + u_int8_t* commentHeader; unsigned commentHeaderSize; + u_int8_t* setupHeader; unsigned setupHeaderSize; + u_int32_t identField; + + parseVorbisOrTheoraConfigStr(configStr, + identificationHeader, identificationHeaderSize, + commentHeader, commentHeaderSize, + setupHeader, setupHeaderSize, + identField); + + VorbisAudioRTPSink* resultSink + = new VorbisAudioRTPSink(env, RTPgs, rtpPayloadFormat, rtpTimestampFrequency, numChannels, + identificationHeader, identificationHeaderSize, + commentHeader, commentHeaderSize, + setupHeader, setupHeaderSize, + identField); + delete[] identificationHeader; delete[] commentHeader; delete[] setupHeader; + + return resultSink; +} + +VorbisAudioRTPSink +::VorbisAudioRTPSink(UsageEnvironment& env, Groupsock* RTPgs, u_int8_t rtpPayloadFormat, + u_int32_t rtpTimestampFrequency, unsigned numChannels, + u_int8_t* identificationHeader, unsigned identificationHeaderSize, + u_int8_t* commentHeader, unsigned commentHeaderSize, + u_int8_t* setupHeader, unsigned setupHeaderSize, + u_int32_t identField) + : AudioRTPSink(env, RTPgs, rtpPayloadFormat, rtpTimestampFrequency, "VORBIS", numChannels), + fIdent(identField), fFmtpSDPLine(NULL) { + if (identificationHeaderSize >= 28) { + // Get the 'bitrate' values from this header, and use them to set our estimated bitrate: + u_int32_t val; + u_int8_t* p; + + p = &identificationHeader[16]; + val = ((p[3]*256 + p[2])*256 + p[1])*256 + p[0]; // i.e., little-endian + int bitrate_maximum = (int)val; + if (bitrate_maximum < 0) bitrate_maximum = 0; + + p = &identificationHeader[20]; + val = ((p[3]*256 + p[2])*256 + p[1])*256 + p[0]; // i.e., little-endian + int bitrate_nominal = (int)val; + if (bitrate_nominal < 0) bitrate_nominal = 0; + + p = &identificationHeader[24]; + val = ((p[3]*256 + p[2])*256 + p[1])*256 + p[0]; // i.e., little-endian + int bitrate_minimum = (int)val; + if (bitrate_minimum < 0) bitrate_minimum = 0; + + int bitrate + = bitrate_nominal > 0 ? bitrate_nominal + : bitrate_maximum > 0 ? bitrate_maximum + : bitrate_minimum > 0 ? bitrate_minimum : 0; + if (bitrate > 0) estimatedBitrate() = ((unsigned)bitrate)/1000; + } + + // Generate a 'config' string from the supplied configuration headers: + char* base64PackedHeaders + = generateVorbisOrTheoraConfigStr(identificationHeader, identificationHeaderSize, + commentHeader, commentHeaderSize, + setupHeader, setupHeaderSize, + identField); + if (base64PackedHeaders == NULL) return; + + // Then use this 'config' string to construct our "a=fmtp:" SDP line: + unsigned fmtpSDPLineMaxSize = 50 + strlen(base64PackedHeaders); // 50 => more than enough space + fFmtpSDPLine = new char[fmtpSDPLineMaxSize]; + sprintf(fFmtpSDPLine, "a=fmtp:%d configuration=%s\r\n", rtpPayloadType(), base64PackedHeaders); + delete[] base64PackedHeaders; +} + +VorbisAudioRTPSink::~VorbisAudioRTPSink() { + delete[] fFmtpSDPLine; +} + +char const* VorbisAudioRTPSink::auxSDPLine() { + return fFmtpSDPLine; +} + +void VorbisAudioRTPSink +::doSpecialFrameHandling(unsigned fragmentationOffset, + unsigned char* frameStart, + unsigned numBytesInFrame, + struct timeval framePresentationTime, + unsigned numRemainingBytes) { + // Set the 4-byte "payload header", as defined in RFC 5215, section 2.2: + u_int8_t header[4]; + + // The first three bytes of the header are our "Ident": + header[0] = fIdent>>16; header[1] = fIdent>>8; header[2] = fIdent; + + // The final byte contains the "F", "VDT", and "numPkts" fields: + u_int8_t F; // Fragment type + if (numRemainingBytes > 0) { + if (fragmentationOffset > 0) { + F = 2<<6; // continuation fragment + } else { + F = 1<<6; // start fragment + } + } else { + if (fragmentationOffset > 0) { + F = 3<<6; // end fragment + } else { + F = 0<<6; // not fragmented + } + } + u_int8_t const VDT = 0<<4; // Vorbis Data Type (always a "Raw Vorbis payload") + u_int8_t numPkts = F == 0 ? (numFramesUsedSoFar() + 1): 0; // set to 0 when we're a fragment + header[3] = F|VDT|numPkts; + + setSpecialHeaderBytes(header, sizeof header); + + // There's also a 2-byte 'frame-specific' header: The length of the Vorbis data: + u_int8_t frameSpecificHeader[2]; + frameSpecificHeader[0] = numBytesInFrame>>8; + frameSpecificHeader[1] = numBytesInFrame; + setFrameSpecificHeaderBytes(frameSpecificHeader, 2); + + // Important: Also call our base class's doSpecialFrameHandling(), + // to set the packet's timestamp: + MultiFramedRTPSink::doSpecialFrameHandling(fragmentationOffset, + frameStart, numBytesInFrame, + framePresentationTime, + numRemainingBytes); +} + +Boolean VorbisAudioRTPSink::frameCanAppearAfterPacketStart(unsigned char const* /*frameStart*/, + unsigned /*numBytesInFrame*/) const { + // We allow more than one frame to be packed into an outgoing RTP packet, but no more than 15: + return numFramesUsedSoFar() <= 15; +} + +unsigned VorbisAudioRTPSink::specialHeaderSize() const { + return 4; +} + +unsigned VorbisAudioRTPSink::frameSpecificHeaderSize() const { + return 2; +} + + +////////// generateVorbisOrTheoraConfigStr() implementation ////////// + +char* generateVorbisOrTheoraConfigStr(u_int8_t* identificationHeader, unsigned identificationHeaderSize, + u_int8_t* commentHeader, unsigned commentHeaderSize, + u_int8_t* setupHeader, unsigned setupHeaderSize, + u_int32_t identField) { + // First, count how many headers (<=3) are included, and how many bytes will be used + // to encode these headers' sizes: + unsigned numHeaders = 0; + unsigned sizeSize[2]; // The number of bytes used to encode the lengths of the first two headers (but not the length of the 3rd) + sizeSize[0] = sizeSize[1] = 0; + if (identificationHeaderSize > 0) { + sizeSize[numHeaders++] = identificationHeaderSize < 128 ? 1 : identificationHeaderSize < 16384 ? 2 : 3; + } + if (commentHeaderSize > 0) { + sizeSize[numHeaders++] = commentHeaderSize < 128 ? 1 : commentHeaderSize < 16384 ? 2 : 3; + } + if (setupHeaderSize > 0) { + ++numHeaders; + } else { + sizeSize[1] = 0; // We have at most two headers, so the second one's length isn't encoded + } + if (numHeaders == 0) return NULL; // With no headers, we can't set up a configuration + if (numHeaders == 1) sizeSize[0] = 0; // With only one header, its length isn't encoded + + // Then figure out the size of the packed configuration headers, and allocate space for this: + unsigned length = identificationHeaderSize + commentHeaderSize + setupHeaderSize; + // The "length" field in the packed headers + if (length > (unsigned)0xFFFF) return NULL; // too big for a 16-bit field; we can't handle this + unsigned packedHeadersSize + = 4 // "Number of packed headers" field + + 3 // "ident" field + + 2 // "length" field + + 1 // "n. of headers" field + + sizeSize[0] + sizeSize[1] // "length1" and "length2" (if present) fields + + length; + u_int8_t* packedHeaders = new u_int8_t[packedHeadersSize]; + if (packedHeaders == NULL) return NULL; + + // Fill in the 'packed headers': + u_int8_t* p = packedHeaders; + *p++ = 0; *p++ = 0; *p++ = 0; *p++ = 1; // "Number of packed headers": 1 + *p++ = identField>>16; *p++ = identField>>8; *p++ = identField; // "Ident" (24 bits) + *p++ = length>>8; *p++ = length; // "length" (16 bits) + *p++ = numHeaders-1; // "n. of headers" + if (numHeaders > 1) { + // Fill in the "length1" header: + unsigned length1 = identificationHeaderSize > 0 ? identificationHeaderSize : commentHeaderSize; + if (length1 >= 16384) { + *p++ = 0x80; // flag, but no more, because we know length1 <= 32767 + } + if (length1 >= 128) { + *p++ = 0x80|((length1&0x3F80)>>7); // flag + the second 7 bits + } + *p++ = length1&0x7F; // the low 7 bits + + if (numHeaders > 2) { // numHeaders == 3 + // Fill in the "length2" header (for the 'Comment' header): + unsigned length2 = commentHeaderSize; + if (length2 >= 16384) { + *p++ = 0x80; // flag, but no more, because we know length2 <= 32767 + } + if (length2 >= 128) { + *p++ = 0x80|((length2&0x3F80)>>7); // flag + the second 7 bits + } + *p++ = length2&0x7F; // the low 7 bits + } + } + // Copy each header: + if (identificationHeader != NULL) memmove(p, identificationHeader, identificationHeaderSize); p += identificationHeaderSize; + if (commentHeader != NULL) memmove(p, commentHeader, commentHeaderSize); p += commentHeaderSize; + if (setupHeader != NULL) memmove(p, setupHeader, setupHeaderSize); + + // Having set up the 'packed configuration headers', Base-64-encode this, for our result: + char* base64PackedHeaders = base64Encode((char const*)packedHeaders, packedHeadersSize); + delete[] packedHeaders; + + return base64PackedHeaders; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/VorbisAudioRTPSource.cpp b/src/big/mpp/middleware/src/live555/liveMedia/VorbisAudioRTPSource.cpp new file mode 100644 index 000000000..5fac36ee6 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/VorbisAudioRTPSource.cpp @@ -0,0 +1,197 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Vorbis Audio RTP Sources +// Implementation + +#include "VorbisAudioRTPSource.hh" +#include "Base64.hh" + +////////// VorbisBufferedPacket and VorbisBufferedPacketFactory ////////// + +class VorbisBufferedPacket: public BufferedPacket { +public: + VorbisBufferedPacket(); + virtual ~VorbisBufferedPacket(); + +private: // redefined virtual functions + virtual unsigned nextEnclosedFrameSize(unsigned char*& framePtr, + unsigned dataSize); +}; + +class VorbisBufferedPacketFactory: public BufferedPacketFactory { +private: // redefined virtual functions + virtual BufferedPacket* createNewPacket(MultiFramedRTPSource* ourSource); +}; + + +///////// VorbisAudioRTPSource implementation //////// + +VorbisAudioRTPSource* +VorbisAudioRTPSource::createNew(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency) { + return new VorbisAudioRTPSource(env, RTPgs, rtpPayloadFormat, rtpTimestampFrequency); +} + +VorbisAudioRTPSource +::VorbisAudioRTPSource(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency) + : MultiFramedRTPSource(env, RTPgs, rtpPayloadFormat, rtpTimestampFrequency, + new VorbisBufferedPacketFactory), + fCurPacketIdent(0) { +} + +VorbisAudioRTPSource::~VorbisAudioRTPSource() { +} + +Boolean VorbisAudioRTPSource +::processSpecialHeader(BufferedPacket* packet, + unsigned& resultSpecialHeaderSize) { + unsigned char* headerStart = packet->data(); + unsigned packetSize = packet->dataSize(); + + resultSpecialHeaderSize = 4; + if (packetSize < resultSpecialHeaderSize) return False; // packet was too small + + // The first 3 bytes of the header are the "Ident" field: + fCurPacketIdent = (headerStart[0]<<16) | (headerStart[1]<<8) | headerStart[2]; + + // The 4th byte is F|VDT|numPkts. + // Reject any packet with VDT == 3: + if ((headerStart[3]&0x30) == 0x30) return False; + + u_int8_t F = headerStart[3]>>6; + fCurrentPacketBeginsFrame = F <= 1; // "Not Fragmented" or "Start Fragment" + fCurrentPacketCompletesFrame = F == 0 || F == 3; // "Not Fragmented" or "End Fragment" + + return True; +} + +char const* VorbisAudioRTPSource::MIMEtype() const { + return "audio/VORBIS"; +} + + +////////// VorbisBufferedPacket and VorbisBufferedPacketFactory implementation ////////// + +VorbisBufferedPacket::VorbisBufferedPacket() { +} + +VorbisBufferedPacket::~VorbisBufferedPacket() { +} + +unsigned VorbisBufferedPacket +::nextEnclosedFrameSize(unsigned char*& framePtr, unsigned dataSize) { + if (dataSize < 2) { + // There's not enough space for a 2-byte header. TARFU! Just return the data that's left: + return dataSize; + } + + unsigned frameSize = (framePtr[0]<<8) | framePtr[1]; + framePtr += 2; + if (frameSize > dataSize - 2) return dataSize - 2; // inconsistent frame size => just return all the data that's left + + return frameSize; +} + +BufferedPacket* VorbisBufferedPacketFactory +::createNewPacket(MultiFramedRTPSource* /*ourSource*/) { + return new VorbisBufferedPacket(); +} + + +////////// parseVorbisOrTheoraConfigStr() implementation ////////// + +#define ADVANCE(n) do { p += (n); rem -= (n); } while (0) +#define GET_ENCODED_VAL(n) do { u_int8_t byte; n = 0; do { if (rem == 0) break; byte = *p; n = (n*128) + (byte&0x7F); ADVANCE(1); } while (byte&0x80); } while (0); if (rem == 0) break + +void parseVorbisOrTheoraConfigStr(char const* configStr, + u_int8_t*& identificationHdr, unsigned& identificationHdrSize, + u_int8_t*& commentHdr, unsigned& commentHdrSize, + u_int8_t*& setupHdr, unsigned& setupHdrSize, + u_int32_t& identField) { + identificationHdr = commentHdr = setupHdr = NULL; // default values, if an error occur + identificationHdrSize = commentHdrSize = setupHdrSize = 0; // ditto + identField = 0; // ditto + + // Begin by Base64-decoding the configuration string: + unsigned configDataSize; + u_int8_t* configData = base64Decode(configStr, configDataSize); + u_int8_t* p = configData; + unsigned rem = configDataSize; + + do { + if (rem < 4) break; + u_int32_t numPackedHeaders = (p[0]<<24)|(p[1]<<16)|(p[2]<<8)|p[3]; ADVANCE(4); + if (numPackedHeaders == 0) break; + + // Use the first 'packed header' only. + if (rem < 3) break; + identField = (p[0]<<16)|(p[1]<<8)|p[2]; ADVANCE(3); + + if (rem < 2) break; + u_int16_t length = (p[0]<<8)|p[1]; ADVANCE(2); + + unsigned numHeaders; + GET_ENCODED_VAL(numHeaders); + + Boolean success = False; + for (unsigned i = 0; i < numHeaders+1 && i < 3; ++i) { + success = False; + unsigned headerSize; + if (i < numHeaders) { + // The header size is encoded: + GET_ENCODED_VAL(headerSize); + if (headerSize > length) break; + length -= headerSize; + } else { + // The last header is implicit: + headerSize = length; + } + + // Allocate space for the header bytes; we'll fill it in later + if (i == 0) { + identificationHdrSize = headerSize; + identificationHdr = new u_int8_t[identificationHdrSize]; + } else if (i == 1) { + commentHdrSize = headerSize; + commentHdr = new u_int8_t[commentHdrSize]; + } else { // i == 2 + setupHdrSize = headerSize; + setupHdr = new u_int8_t[setupHdrSize]; + } + + success = True; + } + if (!success) break; + + // Copy the remaining config bytes into the appropriate 'header' buffers: + if (identificationHdr != NULL) { + memmove(identificationHdr, p, identificationHdrSize); ADVANCE(identificationHdrSize); + if (commentHdr != NULL) { + memmove(commentHdr, p, commentHdrSize); ADVANCE(commentHdrSize); + if (setupHdr != NULL) { + memmove(setupHdr, p, setupHdrSize); ADVANCE(setupHdrSize); + } + } + } + } while (0); + + delete[] configData; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/WAVAudioFileServerMediaSubsession.cpp b/src/big/mpp/middleware/src/live555/liveMedia/WAVAudioFileServerMediaSubsession.cpp new file mode 100644 index 000000000..a0c1cd584 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/WAVAudioFileServerMediaSubsession.cpp @@ -0,0 +1,228 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A 'ServerMediaSubsession' object that creates new, unicast, "RTPSink"s +// on demand, from an WAV audio file. +// Implementation + +#include "WAVAudioFileServerMediaSubsession.hh" +#include "WAVAudioFileSource.hh" +#include "uLawAudioFilter.hh" +#include "SimpleRTPSink.hh" + +WAVAudioFileServerMediaSubsession* WAVAudioFileServerMediaSubsession +::createNew(UsageEnvironment& env, char const* fileName, Boolean reuseFirstSource, + Boolean convertToULaw) { + return new WAVAudioFileServerMediaSubsession(env, fileName, + reuseFirstSource, convertToULaw); +} + +WAVAudioFileServerMediaSubsession +::WAVAudioFileServerMediaSubsession(UsageEnvironment& env, char const* fileName, + Boolean reuseFirstSource, Boolean convertToULaw) + : FileServerMediaSubsession(env, fileName, reuseFirstSource), + fConvertToULaw(convertToULaw) { +} + +WAVAudioFileServerMediaSubsession +::~WAVAudioFileServerMediaSubsession() { +} + +void WAVAudioFileServerMediaSubsession +::seekStreamSource(FramedSource* inputSource, double& seekNPT, double streamDuration, u_int64_t& numBytes) { + WAVAudioFileSource* wavSource; + if (fBitsPerSample > 8) { + // "inputSource" is a filter; its input source is the original WAV file source: + wavSource = (WAVAudioFileSource*)(((FramedFilter*)inputSource)->inputSource()); + } else { + // "inputSource" is the original WAV file source: + wavSource = (WAVAudioFileSource*)inputSource; + } + + unsigned seekSampleNumber = (unsigned)(seekNPT*fSamplingFrequency); + unsigned seekByteNumber = seekSampleNumber*((fNumChannels*fBitsPerSample)/8); + + wavSource->seekToPCMByte(seekByteNumber); + + setStreamSourceDuration(inputSource, streamDuration, numBytes); +} + +void WAVAudioFileServerMediaSubsession +::setStreamSourceDuration(FramedSource* inputSource, double streamDuration, u_int64_t& numBytes) { + WAVAudioFileSource* wavSource; + if (fBitsPerSample > 8) { + // "inputSource" is a filter; its input source is the original WAV file source: + wavSource = (WAVAudioFileSource*)(((FramedFilter*)inputSource)->inputSource()); + } else { + // "inputSource" is the original WAV file source: + wavSource = (WAVAudioFileSource*)inputSource; + } + + unsigned numDurationSamples = (unsigned)(streamDuration*fSamplingFrequency); + unsigned numDurationBytes = numDurationSamples*((fNumChannels*fBitsPerSample)/8); + numBytes = (u_int64_t)numDurationBytes; + + wavSource->limitNumBytesToStream(numDurationBytes); +} + +void WAVAudioFileServerMediaSubsession +::setStreamSourceScale(FramedSource* inputSource, float scale) { + int iScale = (int)scale; + WAVAudioFileSource* wavSource; + if (fBitsPerSample > 8) { + // "inputSource" is a filter; its input source is the original WAV file source: + wavSource = (WAVAudioFileSource*)(((FramedFilter*)inputSource)->inputSource()); + } else { + // "inputSource" is the original WAV file source: + wavSource = (WAVAudioFileSource*)inputSource; + } + + wavSource->setScaleFactor(iScale); +} + +FramedSource* WAVAudioFileServerMediaSubsession +::createNewStreamSource(unsigned /*clientSessionId*/, unsigned& estBitrate) { + FramedSource* resultSource = NULL; + do { + WAVAudioFileSource* wavSource = WAVAudioFileSource::createNew(envir(), fFileName); + if (wavSource == NULL) break; + + // Get attributes of the audio source: + + fAudioFormat = wavSource->getAudioFormat(); + fBitsPerSample = wavSource->bitsPerSample(); + // We handle only 4,8,16,20,24 bits-per-sample audio: + if (fBitsPerSample%4 != 0 || fBitsPerSample < 4 || fBitsPerSample > 24 || fBitsPerSample == 12) { + envir() << "The input file contains " << fBitsPerSample << " bit-per-sample audio, which we don't handle\n"; + break; + } + fSamplingFrequency = wavSource->samplingFrequency(); + fNumChannels = wavSource->numChannels(); + unsigned bitsPerSecond = fSamplingFrequency*fBitsPerSample*fNumChannels; + + fFileDuration = (float)((8.0*wavSource->numPCMBytes())/(fSamplingFrequency*fNumChannels*fBitsPerSample)); + + // Add in any filter necessary to transform the data prior to streaming: + resultSource = wavSource; // by default + if (fAudioFormat == WA_PCM) { + if (fBitsPerSample == 16) { + // Note that samples in the WAV audio file are in little-endian order. + if (fConvertToULaw) { + // Add a filter that converts from raw 16-bit PCM audio to 8-bit u-law audio: + resultSource = uLawFromPCMAudioSource::createNew(envir(), wavSource, 1/*little-endian*/); + bitsPerSecond /= 2; + } else { + // Add a filter that converts from little-endian to network (big-endian) order: + resultSource = EndianSwap16::createNew(envir(), wavSource); + } + } else if (fBitsPerSample == 20 || fBitsPerSample == 24) { + // Add a filter that converts from little-endian to network (big-endian) order: + resultSource = EndianSwap24::createNew(envir(), wavSource); + } + } + + estBitrate = (bitsPerSecond+500)/1000; // kbps + return resultSource; + } while (0); + + // An error occurred: + Medium::close(resultSource); + return NULL; +} + +RTPSink* WAVAudioFileServerMediaSubsession +::createNewRTPSink(Groupsock* rtpGroupsock, + unsigned char rtpPayloadTypeIfDynamic, + FramedSource* /*inputSource*/) { + do { + char const* mimeType; + unsigned char payloadFormatCode = rtpPayloadTypeIfDynamic; // by default, unless a static RTP payload type can be used + if (fAudioFormat == WA_PCM) { + if (fBitsPerSample == 16) { + if (fConvertToULaw) { + mimeType = "PCMU"; + if (fSamplingFrequency == 8000 && fNumChannels == 1) { + payloadFormatCode = 0; // a static RTP payload type + } + } else { + mimeType = "L16"; + if (fSamplingFrequency == 44100 && fNumChannels == 2) { + payloadFormatCode = 10; // a static RTP payload type + } else if (fSamplingFrequency == 44100 && fNumChannels == 1) { + payloadFormatCode = 11; // a static RTP payload type + } + } + } else if (fBitsPerSample == 20) { + mimeType = "L20"; + } else if (fBitsPerSample == 24) { + mimeType = "L24"; + } else { // fBitsPerSample == 8 (we assume that fBitsPerSample == 4 is only for WA_IMA_ADPCM) + mimeType = "L8"; + } + } else if (fAudioFormat == WA_PCMU) { + mimeType = "PCMU"; + if (fSamplingFrequency == 8000 && fNumChannels == 1) { + payloadFormatCode = 0; // a static RTP payload type + } + } else if (fAudioFormat == WA_PCMA) { + mimeType = "PCMA"; + if (fSamplingFrequency == 8000 && fNumChannels == 1) { + payloadFormatCode = 8; // a static RTP payload type + } + } else if (fAudioFormat == WA_IMA_ADPCM) { + mimeType = "DVI4"; + // Use a static payload type, if one is defined: + if (fNumChannels == 1) { + if (fSamplingFrequency == 8000) { + payloadFormatCode = 5; // a static RTP payload type + } else if (fSamplingFrequency == 16000) { + payloadFormatCode = 6; // a static RTP payload type + } else if (fSamplingFrequency == 11025) { + payloadFormatCode = 16; // a static RTP payload type + } else if (fSamplingFrequency == 22050) { + payloadFormatCode = 17; // a static RTP payload type + } + } + } else { //unknown format + break; + } + + return SimpleRTPSink::createNew(envir(), rtpGroupsock, + payloadFormatCode, fSamplingFrequency, + "audio", mimeType, fNumChannels); + } while (0); + + // An error occurred: + return NULL; +} + +void WAVAudioFileServerMediaSubsession::testScaleFactor(float& scale) { + if (fFileDuration <= 0.0) { + // The file is non-seekable, so is probably a live input source. + // We don't support scale factors other than 1 + scale = 1; + } else { + // We support any integral scale, other than 0 + int iScale = scale < 0.0 ? (int)(scale - 0.5) : (int)(scale + 0.5); // round + if (iScale == 0) iScale = 1; + scale = (float)iScale; + } +} + +float WAVAudioFileServerMediaSubsession::duration() const { + return fFileDuration; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/WAVAudioFileSource.cpp b/src/big/mpp/middleware/src/live555/liveMedia/WAVAudioFileSource.cpp new file mode 100644 index 000000000..bf48fb91c --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/WAVAudioFileSource.cpp @@ -0,0 +1,353 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A WAV audio file source +// Implementation + +#include "WAVAudioFileSource.hh" +#include "InputFile.hh" +#include "GroupsockHelper.hh" + +////////// WAVAudioFileSource ////////// + +WAVAudioFileSource* +WAVAudioFileSource::createNew(UsageEnvironment& env, char const* fileName) { + do { + FILE* fid = OpenInputFile(env, fileName); + if (fid == NULL) break; + + WAVAudioFileSource* newSource = new WAVAudioFileSource(env, fid); + if (newSource != NULL && newSource->bitsPerSample() == 0) { + // The WAV file header was apparently invalid. + Medium::close(newSource); + break; + } + + newSource->fFileSize = (unsigned)GetFileSize(fileName, fid); + + return newSource; + } while (0); + + return NULL; +} + +unsigned WAVAudioFileSource::numPCMBytes() const { + if (fFileSize < fWAVHeaderSize) return 0; + return fFileSize - fWAVHeaderSize; +} + +void WAVAudioFileSource::setScaleFactor(int scale) { + if (!fFidIsSeekable) return; // we can't do 'trick play' operations on non-seekable files + + fScaleFactor = scale; + + if (fScaleFactor < 0 && TellFile64(fFid) > 0) { + // Because we're reading backwards, seek back one sample, to ensure that + // (i) we start reading the last sample before the start point, and + // (ii) we don't hit end-of-file on the first read. + int bytesPerSample = (fNumChannels*fBitsPerSample)/8; + if (bytesPerSample == 0) bytesPerSample = 1; + SeekFile64(fFid, -bytesPerSample, SEEK_CUR); + } +} + +void WAVAudioFileSource::seekToPCMByte(unsigned byteNumber) { + byteNumber += fWAVHeaderSize; + if (byteNumber > fFileSize) byteNumber = fFileSize; + + SeekFile64(fFid, byteNumber, SEEK_SET); +} + +void WAVAudioFileSource::limitNumBytesToStream(unsigned numBytesToStream) { + fNumBytesToStream = numBytesToStream; + fLimitNumBytesToStream = fNumBytesToStream > 0; +} + +unsigned char WAVAudioFileSource::getAudioFormat() { + return fAudioFormat; +} + + +#define nextc fgetc(fid) + +static Boolean get4Bytes(FILE* fid, u_int32_t& result) { // little-endian + int c0, c1, c2, c3; + if ((c0 = nextc) == EOF || (c1 = nextc) == EOF || + (c2 = nextc) == EOF || (c3 = nextc) == EOF) return False; + result = (c3<<24)|(c2<<16)|(c1<<8)|c0; + return True; +} + +static Boolean get2Bytes(FILE* fid, u_int16_t& result) {//little-endian + int c0, c1; + if ((c0 = nextc) == EOF || (c1 = nextc) == EOF) return False; + result = (c1<<8)|c0; + return True; +} + +static Boolean skipBytes(FILE* fid, int num) { + while (num-- > 0) { + if (nextc == EOF) return False; + } + return True; +} + +WAVAudioFileSource::WAVAudioFileSource(UsageEnvironment& env, FILE* fid) + : AudioInputDevice(env, 0, 0, 0, 0)/* set the real parameters later */, + fFid(fid), fFidIsSeekable(False), fLastPlayTime(0), fHaveStartedReading(False), fWAVHeaderSize(0), fFileSize(0), + fScaleFactor(1), fLimitNumBytesToStream(False), fNumBytesToStream(0), fAudioFormat(WA_UNKNOWN) { + // Check the WAV file header for validity. + // Note: The following web pages contain info about the WAV format: + // http://www.ringthis.com/dev/wave_format.htm + // http://www.lightlink.com/tjweber/StripWav/Canon.html + // http://www.onicos.com/staff/iz/formats/wav.html + + Boolean success = False; // until we learn otherwise + do { + // RIFF Chunk: + if (nextc != 'R' || nextc != 'I' || nextc != 'F' || nextc != 'F') break; + if (!skipBytes(fid, 4)) break; + if (nextc != 'W' || nextc != 'A' || nextc != 'V' || nextc != 'E') break; + + // Skip over any chunk that's not a FORMAT ('fmt ') chunk: + u_int32_t tmp; + if (!get4Bytes(fid, tmp)) break; + while (tmp != 0x20746d66/*'fmt ', little-endian*/) { + // Skip this chunk: + u_int32_t chunkLength; + if (!get4Bytes(fid, chunkLength)) break; + if (!skipBytes(fid, chunkLength)) break; + if (!get4Bytes(fid, tmp)) break; + } + + // FORMAT Chunk (the 4-byte header code has already been parsed): + unsigned formatLength; + if (!get4Bytes(fid, formatLength)) break; + unsigned short audioFormat; + if (!get2Bytes(fid, audioFormat)) break; + + fAudioFormat = (unsigned char)audioFormat; + if (fAudioFormat != WA_PCM && fAudioFormat != WA_PCMA && fAudioFormat != WA_PCMU && fAudioFormat != WA_IMA_ADPCM) { + // It's a format that we don't (yet) understand + env.setResultMsg("Audio format is not one that we handle (PCM/PCMU/PCMA or IMA ADPCM)"); + break; + } + unsigned short numChannels; + if (!get2Bytes(fid, numChannels)) break; + fNumChannels = (unsigned char)numChannels; + if (fNumChannels < 1 || fNumChannels > 2) { // invalid # channels + char errMsg[100]; + sprintf(errMsg, "Bad # channels: %d", fNumChannels); + env.setResultMsg(errMsg); + break; + } + if (!get4Bytes(fid, fSamplingFrequency)) break; + if (fSamplingFrequency == 0) { + env.setResultMsg("Bad sampling frequency: 0"); + break; + } + if (!skipBytes(fid, 6)) break; // "nAvgBytesPerSec" (4 bytes) + "nBlockAlign" (2 bytes) + unsigned short bitsPerSample; + if (!get2Bytes(fid, bitsPerSample)) break; + fBitsPerSample = (unsigned char)bitsPerSample; + if (fBitsPerSample == 0) { + env.setResultMsg("Bad bits-per-sample: 0"); + break; + } + if (!skipBytes(fid, formatLength - 16)) break; + + // FACT chunk (optional): + int c = nextc; + if (c == 'f') { + if (nextc != 'a' || nextc != 'c' || nextc != 't') break; + unsigned factLength; + if (!get4Bytes(fid, factLength)) break; + if (!skipBytes(fid, factLength)) break; + c = nextc; + } + + // EYRE chunk (optional): + if (c == 'e') { + if (nextc != 'y' || nextc != 'r' || nextc != 'e') break; + unsigned eyreLength; + if (!get4Bytes(fid, eyreLength)) break; + if (!skipBytes(fid, eyreLength)) break; + c = nextc; + } + + // DATA Chunk: + if (c != 'd' || nextc != 'a' || nextc != 't' || nextc != 'a') break; + if (!skipBytes(fid, 4)) break; + + // The header is good; the remaining data are the sample bytes. + fWAVHeaderSize = (unsigned)TellFile64(fid); + success = True; + } while (0); + + if (!success) { + env.setResultMsg("Bad WAV file format"); + // Set "fBitsPerSample" to zero, to indicate failure: + fBitsPerSample = 0; + return; + } + + fPlayTimePerSample = 1e6/(double)fSamplingFrequency; + + // Although PCM is a sample-based format, we group samples into + // 'frames' for efficient delivery to clients. Set up our preferred + // frame size to be close to 20 ms, if possible, but always no greater + // than 1400 bytes (to ensure that it will fit in a single RTP packet) + unsigned maxSamplesPerFrame = (1400*8)/(fNumChannels*fBitsPerSample); + unsigned desiredSamplesPerFrame = (unsigned)(0.02*fSamplingFrequency); + unsigned samplesPerFrame = desiredSamplesPerFrame < maxSamplesPerFrame ? desiredSamplesPerFrame : maxSamplesPerFrame; + fPreferredFrameSize = (samplesPerFrame*fNumChannels*fBitsPerSample)/8; + + fFidIsSeekable = FileIsSeekable(fFid); +#ifndef READ_FROM_FILES_SYNCHRONOUSLY + // Now that we've finished reading the WAV header, all future reads (of audio samples) from the file will be asynchronous: + makeSocketNonBlocking(fileno(fFid)); +#endif +} + +WAVAudioFileSource::~WAVAudioFileSource() { + if (fFid == NULL) return; + +#ifndef READ_FROM_FILES_SYNCHRONOUSLY + envir().taskScheduler().turnOffBackgroundReadHandling(fileno(fFid)); +#endif + + CloseInputFile(fFid); +} + +void WAVAudioFileSource::doGetNextFrame() { + if (feof(fFid) || ferror(fFid) || (fLimitNumBytesToStream && fNumBytesToStream == 0)) { + handleClosure(); + return; + } + + fFrameSize = 0; // until it's set later +#ifdef READ_FROM_FILES_SYNCHRONOUSLY + doReadFromFile(); +#else + if (!fHaveStartedReading) { + // Await readable data from the file: + envir().taskScheduler().turnOnBackgroundReadHandling(fileno(fFid), + (TaskScheduler::BackgroundHandlerProc*)&fileReadableHandler, this); + fHaveStartedReading = True; + } +#endif +} + +void WAVAudioFileSource::doStopGettingFrames() { + envir().taskScheduler().unscheduleDelayedTask(nextTask()); +#ifndef READ_FROM_FILES_SYNCHRONOUSLY + envir().taskScheduler().turnOffBackgroundReadHandling(fileno(fFid)); + fHaveStartedReading = False; +#endif +} + +void WAVAudioFileSource::fileReadableHandler(WAVAudioFileSource* source, int /*mask*/) { + if (!source->isCurrentlyAwaitingData()) { + source->doStopGettingFrames(); // we're not ready for the data yet + return; + } + source->doReadFromFile(); +} + +void WAVAudioFileSource::doReadFromFile() { + // Try to read as many bytes as will fit in the buffer provided (or "fPreferredFrameSize" if less) + if (fLimitNumBytesToStream && fNumBytesToStream < fMaxSize) { + fMaxSize = fNumBytesToStream; + } + if (fPreferredFrameSize < fMaxSize) { + fMaxSize = fPreferredFrameSize; + } + unsigned bytesPerSample = (fNumChannels*fBitsPerSample)/8; + if (bytesPerSample == 0) bytesPerSample = 1; // because we can't read less than a byte at a time + + // For 'trick play', read one sample at a time; otherwise (normal case) read samples in bulk: + unsigned bytesToRead = fScaleFactor == 1 ? fMaxSize - fMaxSize%bytesPerSample : bytesPerSample; + unsigned numBytesRead; + while (1) { // loop for 'trick play' only +#ifdef READ_FROM_FILES_SYNCHRONOUSLY + numBytesRead = fread(fTo, 1, bytesToRead, fFid); +#else + if (fFidIsSeekable) { + numBytesRead = fread(fTo, 1, bytesToRead, fFid); + } else { + // For non-seekable files (e.g., pipes), call "read()" rather than "fread()", to ensure that the read doesn't block: + numBytesRead = read(fileno(fFid), fTo, bytesToRead); + } +#endif + if (numBytesRead == 0) { + handleClosure(); + return; + } + fFrameSize += numBytesRead; + fTo += numBytesRead; + fMaxSize -= numBytesRead; + fNumBytesToStream -= numBytesRead; + + // If we did an asynchronous read, and didn't read an integral number of samples, then we need to wait for another read: +#ifndef READ_FROM_FILES_SYNCHRONOUSLY + if (fFrameSize%bytesPerSample > 0) return; +#endif + + // If we're doing 'trick play', then seek to the appropriate place for reading the next sample, + // and keep reading until we fill the provided buffer: + if (fScaleFactor != 1) { + SeekFile64(fFid, (fScaleFactor-1)*bytesPerSample, SEEK_CUR); + if (fMaxSize < bytesPerSample) break; + } else { + break; // from the loop (normal case) + } + } + + // Set the 'presentation time' and 'duration' of this frame: + if (fPresentationTime.tv_sec == 0 && fPresentationTime.tv_usec == 0) { + // This is the first frame, so use the current time: + gettimeofday(&fPresentationTime, NULL); + } else { + // Increment by the play time of the previous data: + unsigned uSeconds = fPresentationTime.tv_usec + fLastPlayTime; + fPresentationTime.tv_sec += uSeconds/1000000; + fPresentationTime.tv_usec = uSeconds%1000000; + } + + // Remember the play time of this data: + fDurationInMicroseconds = fLastPlayTime + = (unsigned)((fPlayTimePerSample*fFrameSize)/bytesPerSample); + + // Inform the reader that he has data: +#ifdef READ_FROM_FILES_SYNCHRONOUSLY + // To avoid possible infinite recursion, we need to return to the event loop to do this: + nextTask() = envir().taskScheduler().scheduleDelayedTask(0, + (TaskFunc*)FramedSource::afterGetting, this); +#else + // Because the file read was done from the event loop, we can call the + // 'after getting' function directly, without risk of infinite recursion: + FramedSource::afterGetting(this); +#endif +} + +Boolean WAVAudioFileSource::setInputPort(int /*portIndex*/) { + return True; +} + +double WAVAudioFileSource::getAverageLevel() const { + return 0.0;//##### fix this later +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/AC3AudioFileServerMediaSubsession.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/AC3AudioFileServerMediaSubsession.hh new file mode 100644 index 000000000..8af799768 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/AC3AudioFileServerMediaSubsession.hh @@ -0,0 +1,48 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A 'ServerMediaSubsession' object that creates new, unicast, "RTPSink"s +// on demand, from an AC3 audio file. +// C++ header + +#ifndef _AC3_AUDIO_FILE_SERVER_MEDIA_SUBSESSION_HH +#define _AC3_AUDIO_FILE_SERVER_MEDIA_SUBSESSION_HH + +#ifndef _FILE_SERVER_MEDIA_SUBSESSION_HH +#include "FileServerMediaSubsession.hh" +#endif + +class AC3AudioFileServerMediaSubsession: public FileServerMediaSubsession{ +public: + static AC3AudioFileServerMediaSubsession* + createNew(UsageEnvironment& env, char const* fileName, Boolean reuseFirstSource); + +private: + AC3AudioFileServerMediaSubsession(UsageEnvironment& env, + char const* fileName, Boolean reuseFirstSource); + // called only by createNew(); + virtual ~AC3AudioFileServerMediaSubsession(); + +private: // redefined virtual functions + virtual FramedSource* createNewStreamSource(unsigned clientSessionId, + unsigned& estBitrate); + virtual RTPSink* createNewRTPSink(Groupsock* rtpGroupsock, + unsigned char rtpPayloadTypeIfDynamic, + FramedSource* inputSource); +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/AC3AudioRTPSink.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/AC3AudioRTPSink.hh new file mode 100644 index 000000000..6c477fcfc --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/AC3AudioRTPSink.hh @@ -0,0 +1,57 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP sink for AC3 audio +// C++ header + +#ifndef _AC3_AUDIO_RTP_SINK_HH +#define _AC3_AUDIO_RTP_SINK_HH + +#ifndef _AUDIO_RTP_SINK_HH +#include "AudioRTPSink.hh" +#endif + +class AC3AudioRTPSink: public AudioRTPSink { +public: + static AC3AudioRTPSink* createNew(UsageEnvironment& env, + Groupsock* RTPgs, + u_int8_t rtpPayloadFormat, + u_int32_t rtpTimestampFrequency); + +protected: + AC3AudioRTPSink(UsageEnvironment& env, Groupsock* RTPgs, + u_int8_t rtpPayloadFormat, + u_int32_t rtpTimestampFrequency); + // called only by createNew() + + virtual ~AC3AudioRTPSink(); + +private: // redefined virtual functions: + virtual Boolean frameCanAppearAfterPacketStart(unsigned char const* frameStart, + unsigned numBytesInFrame) const; + virtual void doSpecialFrameHandling(unsigned fragmentationOffset, + unsigned char* frameStart, + unsigned numBytesInFrame, + struct timeval framePresentationTime, + unsigned numRemainingBytes); + virtual unsigned specialHeaderSize() const; + +private: + unsigned char fTotNumFragmentsUsed; // used only if a frame gets fragmented across multiple packets +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/AC3AudioRTPSource.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/AC3AudioRTPSource.hh new file mode 100644 index 000000000..050c28209 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/AC3AudioRTPSource.hh @@ -0,0 +1,51 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// AC3 Audio RTP Sources +// C++ header + +#ifndef _AC3_AUDIO_RTP_SOURCE_HH +#define _AC3_AUDIO_RTP_SOURCE_HH + +#ifndef _MULTI_FRAMED_RTP_SOURCE_HH +#include "MultiFramedRTPSource.hh" +#endif + +class AC3AudioRTPSource: public MultiFramedRTPSource { +public: + static AC3AudioRTPSource* + createNew(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency); + +protected: + virtual ~AC3AudioRTPSource(); + +private: + AC3AudioRTPSource(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency); + // called only by createNew() + +private: + // redefined virtual functions: + virtual Boolean processSpecialHeader(BufferedPacket* packet, + unsigned& resultSpecialHeaderSize); + virtual char const* MIMEtype() const; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/AC3AudioStreamFramer.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/AC3AudioStreamFramer.hh new file mode 100644 index 000000000..f4a32ec97 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/AC3AudioStreamFramer.hh @@ -0,0 +1,70 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A filter that breaks up an AC3 audio elementary stream into frames +// C++ header + +#ifndef _AC3_AUDIO_STREAM_FRAMER_HH +#define _AC3_AUDIO_STREAM_FRAMER_HH + +#ifndef _FRAMED_FILTER_HH +#include "FramedFilter.hh" +#endif + +class AC3AudioStreamFramer: public FramedFilter { +public: + static AC3AudioStreamFramer* + createNew(UsageEnvironment& env, FramedSource* inputSource, + unsigned char streamCode = 0); + // If "streamCode" != 0, then we assume that there's a 1-byte code at the beginning of each chunk of data that we read from + // our source. If that code is not the value we want, we discard the chunk of data. + // However, if "streamCode" == 0 (the default), then we don't expect this 1-byte code. + + unsigned samplingRate(); + + void flushInput(); // called if there is a discontinuity (seeking) in the input + +private: + AC3AudioStreamFramer(UsageEnvironment& env, FramedSource* inputSource, + unsigned char streamCode); + // called only by createNew() + virtual ~AC3AudioStreamFramer(); + + static void handleNewData(void* clientData, + unsigned char* ptr, unsigned size, + struct timeval presentationTime); + void handleNewData(unsigned char* ptr, unsigned size); + + void parseNextFrame(); + +private: + // redefined virtual functions: + virtual void doGetNextFrame(); + +private: + struct timeval currentFramePlayTime() const; + +private: + struct timeval fNextFramePresentationTime; + +private: // parsing state + class AC3AudioStreamParser* fParser; + unsigned char fOurStreamCode; + friend class AC3AudioStreamParser; // hack +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/ADTSAudioFileServerMediaSubsession.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/ADTSAudioFileServerMediaSubsession.hh new file mode 100644 index 000000000..dd5d747c7 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/ADTSAudioFileServerMediaSubsession.hh @@ -0,0 +1,48 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A 'ServerMediaSubsession' object that creates new, unicast, "RTPSink"s +// on demand, from an AAC audio file in ADTS format +// C++ header + +#ifndef _ADTS_AUDIO_FILE_SERVER_MEDIA_SUBSESSION_HH +#define _ADTS_AUDIO_FILE_SERVER_MEDIA_SUBSESSION_HH + +#ifndef _FILE_SERVER_MEDIA_SUBSESSION_HH +#include "FileServerMediaSubsession.hh" +#endif + +class ADTSAudioFileServerMediaSubsession: public FileServerMediaSubsession{ +public: + static ADTSAudioFileServerMediaSubsession* + createNew(UsageEnvironment& env, char const* fileName, Boolean reuseFirstSource); + +protected: + ADTSAudioFileServerMediaSubsession(UsageEnvironment& env, + char const* fileName, Boolean reuseFirstSource); + // called only by createNew(); + virtual ~ADTSAudioFileServerMediaSubsession(); + +protected: // redefined virtual functions + virtual FramedSource* createNewStreamSource(unsigned clientSessionId, + unsigned& estBitrate); + virtual RTPSink* createNewRTPSink(Groupsock* rtpGroupsock, + unsigned char rtpPayloadTypeIfDynamic, + FramedSource* inputSource); +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/ADTSAudioFileSource.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/ADTSAudioFileSource.hh new file mode 100644 index 000000000..8e5fbaf98 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/ADTSAudioFileSource.hh @@ -0,0 +1,56 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A source object for AAC audio files in ADTS format +// C++ header + +#ifndef _ADTS_AUDIO_FILE_SOURCE_HH +#define _ADTS_AUDIO_FILE_SOURCE_HH + +#ifndef _FRAMED_FILE_SOURCE_HH +#include "FramedFileSource.hh" +#endif + +class ADTSAudioFileSource: public FramedFileSource { +public: + static ADTSAudioFileSource* createNew(UsageEnvironment& env, + char const* fileName); + + unsigned samplingFrequency() const { return fSamplingFrequency; } + unsigned numChannels() const { return fNumChannels; } + char const* configStr() const { return fConfigStr; } + // returns the 'AudioSpecificConfig' for this stream (in ASCII form) + +private: + ADTSAudioFileSource(UsageEnvironment& env, FILE* fid, u_int8_t profile, + u_int8_t samplingFrequencyIndex, u_int8_t channelConfiguration); + // called only by createNew() + + virtual ~ADTSAudioFileSource(); + +private: + // redefined virtual functions: + virtual void doGetNextFrame(); + +private: + unsigned fSamplingFrequency; + unsigned fNumChannels; + unsigned fuSecsPerFrame; + char fConfigStr[5]; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/ADTSAudioStreamDiscreteFramer.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/ADTSAudioStreamDiscreteFramer.hh new file mode 100644 index 000000000..1f8ffa1ab --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/ADTSAudioStreamDiscreteFramer.hh @@ -0,0 +1,61 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A filter that reads (discrete) AAC audio frames, and outputs each frame with +// a preceding ADTS header. +// C++ header + +#ifndef _ADTS_AUDIO_STREAM_DISCRETE_FRAMER_HH +#define _ADTS_AUDIO_STREAM_DISCRETE_FRAMER_HH + +#ifndef _FRAMED_FILTER_HH +#include "FramedFilter.hh" +#endif + +#define ADTS_HEADER_SIZE 7 // we don't include a checksum + +class ADTSAudioStreamDiscreteFramer: public FramedFilter { +public: + static ADTSAudioStreamDiscreteFramer* + createNew(UsageEnvironment& env, FramedSource* inputSource, char const* configStr); + // "configStr" should be a 4-character hexadecimal string for a 2-byte value + +protected: + ADTSAudioStreamDiscreteFramer(UsageEnvironment& env, FramedSource* inputSource, + u_int8_t profile, u_int8_t samplingFrequencyIndex, u_int8_t channelConfiguration); + // called only by createNew() + virtual ~ADTSAudioStreamDiscreteFramer(); + +protected: + // redefined virtual functions: + virtual void doGetNextFrame(); + +protected: + static void afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + void afterGettingFrame1(unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + +private: + u_int8_t fADTSHeader[ADTS_HEADER_SIZE]; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/AMRAudioFileServerMediaSubsession.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/AMRAudioFileServerMediaSubsession.hh new file mode 100644 index 000000000..cb7f1b8b2 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/AMRAudioFileServerMediaSubsession.hh @@ -0,0 +1,48 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A 'ServerMediaSubsession' object that creates new, unicast, "RTPSink"s +// on demand, from an AMR audio file. +// C++ header + +#ifndef _AMR_AUDIO_FILE_SERVER_MEDIA_SUBSESSION_HH +#define _AMR_AUDIO_FILE_SERVER_MEDIA_SUBSESSION_HH + +#ifndef _FILE_SERVER_MEDIA_SUBSESSION_HH +#include "FileServerMediaSubsession.hh" +#endif + +class AMRAudioFileServerMediaSubsession: public FileServerMediaSubsession{ +public: + static AMRAudioFileServerMediaSubsession* + createNew(UsageEnvironment& env, char const* fileName, Boolean reuseFirstSource); + +private: + AMRAudioFileServerMediaSubsession(UsageEnvironment& env, + char const* fileName, Boolean reuseFirstSource); + // called only by createNew(); + virtual ~AMRAudioFileServerMediaSubsession(); + +private: // redefined virtual functions + virtual FramedSource* createNewStreamSource(unsigned clientSessionId, + unsigned& estBitrate); + virtual RTPSink* createNewRTPSink(Groupsock* rtpGroupsock, + unsigned char rtpPayloadTypeIfDynamic, + FramedSource* inputSource); +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/AMRAudioFileSink.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/AMRAudioFileSink.hh new file mode 100644 index 000000000..6c714000c --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/AMRAudioFileSink.hh @@ -0,0 +1,51 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// AMR Audio File Sinks +// C++ header + +#ifndef _AMR_AUDIO_FILE_SINK_HH +#define _AMR_AUDIO_FILE_SINK_HH + +#ifndef _FILE_SINK_HH +#include "FileSink.hh" +#endif + +class AMRAudioFileSink: public FileSink { +public: + static AMRAudioFileSink* createNew(UsageEnvironment& env, char const* fileName, + unsigned bufferSize = 10000, + Boolean oneFilePerFrame = False); + // (See "FileSink.hh" for a description of these parameters.) + +protected: + AMRAudioFileSink(UsageEnvironment& env, FILE* fid, unsigned bufferSize, + char const* perFrameFileNamePrefix); + // called only by createNew() + virtual ~AMRAudioFileSink(); + +protected: // redefined virtual functions: + virtual Boolean sourceIsCompatibleWithUs(MediaSource& source); + virtual void afterGettingFrame(unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime); + +protected: + Boolean fHaveWrittenHeader; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/AMRAudioFileSource.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/AMRAudioFileSource.hh new file mode 100644 index 000000000..d7d323316 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/AMRAudioFileSource.hh @@ -0,0 +1,48 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A source object for AMR audio files (as defined in RFC 4867, section 5) +// C++ header + +#ifndef _AMR_AUDIO_FILE_SOURCE_HH +#define _AMR_AUDIO_FILE_SOURCE_HH + +#ifndef _AMR_AUDIO_SOURCE_HH +#include "AMRAudioSource.hh" +#endif + +class AMRAudioFileSource: public AMRAudioSource { +public: + static AMRAudioFileSource* createNew(UsageEnvironment& env, + char const* fileName); + +private: + AMRAudioFileSource(UsageEnvironment& env, FILE* fid, + Boolean isWideband, unsigned numChannels); + // called only by createNew() + + virtual ~AMRAudioFileSource(); + +private: + // redefined virtual functions: + virtual void doGetNextFrame(); + +private: + FILE* fFid; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/AMRAudioRTPSink.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/AMRAudioRTPSink.hh new file mode 100644 index 000000000..5fdc564a2 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/AMRAudioRTPSink.hh @@ -0,0 +1,65 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP sink for AMR audio (RFC 4867) +// C++ header + +#ifndef _AMR_AUDIO_RTP_SINK_HH +#define _AMR_AUDIO_RTP_SINK_HH + +#ifndef _AUDIO_RTP_SINK_HH +#include "AudioRTPSink.hh" +#endif + +class AMRAudioRTPSink: public AudioRTPSink { +public: + static AMRAudioRTPSink* createNew(UsageEnvironment& env, + Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + Boolean sourceIsWideband = False, + unsigned numChannelsInSource = 1); + + Boolean sourceIsWideband() const { return fSourceIsWideband; } + +protected: + AMRAudioRTPSink(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + Boolean sourceIsWideband, unsigned numChannelsInSource); + // called only by createNew() + + virtual ~AMRAudioRTPSink(); + +private: // redefined virtual functions: + virtual Boolean sourceIsCompatibleWithUs(MediaSource& source); + virtual void doSpecialFrameHandling(unsigned fragmentationOffset, + unsigned char* frameStart, + unsigned numBytesInFrame, + struct timeval framePresentationTime, + unsigned numRemainingBytes); + virtual Boolean + frameCanAppearAfterPacketStart(unsigned char const* frameStart, + unsigned numBytesInFrame) const; + + virtual unsigned specialHeaderSize() const; + virtual char const* auxSDPLine(); + +private: + Boolean fSourceIsWideband; + char* fFmtpSDPLine; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/AMRAudioRTPSource.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/AMRAudioRTPSource.hh new file mode 100644 index 000000000..1d2387f20 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/AMRAudioRTPSource.hh @@ -0,0 +1,53 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// AMR Audio RTP Sources (RFC 4867) +// C++ header + +#ifndef _AMR_AUDIO_RTP_SOURCE_HH +#define _AMR_AUDIO_RTP_SOURCE_HH + +#ifndef _RTP_SOURCE_HH +#include "RTPSource.hh" +#endif +#ifndef _AMR_AUDIO_SOURCE_HH +#include "AMRAudioSource.hh" +#endif + +class AMRAudioRTPSource { +public: + static AMRAudioSource* createNew(UsageEnvironment& env, + Groupsock* RTPgs, + RTPSource*& resultRTPSource, + unsigned char rtpPayloadFormat, + Boolean isWideband = False, + unsigned numChannels = 1, + Boolean isOctetAligned = True, + unsigned interleaving = 0, + // relevant only if "isOctetAligned" + // The maximum # of frame-blocks in a group + // 0 means: no interleaving + Boolean robustSortingOrder = False, + // relevant only if "isOctetAligned" + Boolean CRCsArePresent = False + // relevant only if "isOctetAligned" + ); + // This returns a source to read from, but "resultRTPSource" will + // point to RTP-related state. +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/AMRAudioSource.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/AMRAudioSource.hh new file mode 100644 index 000000000..c92b51e7a --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/AMRAudioSource.hh @@ -0,0 +1,52 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A source object for AMR audio sources +// C++ header + +#ifndef _AMR_AUDIO_SOURCE_HH +#define _AMR_AUDIO_SOURCE_HH + +#ifndef _FRAMED_SOURCE_HH +#include "FramedSource.hh" +#endif + +class AMRAudioSource: public FramedSource { +public: + Boolean isWideband() const { return fIsWideband; } + unsigned numChannels() const { return fNumChannels; } + + u_int8_t lastFrameHeader() const { return fLastFrameHeader; } + // The frame header for the most recently read frame (RFC 4867, sec. 5.3) + +protected: + AMRAudioSource(UsageEnvironment& env, Boolean isWideband, unsigned numChannels); + // virtual base class + virtual ~AMRAudioSource(); + +private: + // redefined virtual functions: + virtual char const* MIMEtype() const; + virtual Boolean isAMRAudioSource() const; + +protected: + Boolean fIsWideband; + unsigned fNumChannels; + u_int8_t fLastFrameHeader; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/AVIFileSink.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/AVIFileSink.hh new file mode 100644 index 000000000..c573a6603 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/AVIFileSink.hh @@ -0,0 +1,115 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A sink that generates an AVI file from a composite media session +// C++ header + +#ifndef _AVI_FILE_SINK_HH +#define _AVI_FILE_SINK_HH + +#ifndef _MEDIA_SESSION_HH +#include "MediaSession.hh" +#endif + +class AVIFileSink: public Medium { +public: + static AVIFileSink* createNew(UsageEnvironment& env, + MediaSession& inputSession, + char const* outputFileName, + unsigned bufferSize = 20000, + unsigned short movieWidth = 240, + unsigned short movieHeight = 180, + unsigned movieFPS = 15, + Boolean packetLossCompensate = False); + + typedef void (afterPlayingFunc)(void* clientData); + Boolean startPlaying(afterPlayingFunc* afterFunc, + void* afterClientData); + + unsigned numActiveSubsessions() const { return fNumSubsessions; } + +private: + AVIFileSink(UsageEnvironment& env, MediaSession& inputSession, + char const* outputFileName, unsigned bufferSize, + unsigned short movieWidth, unsigned short movieHeight, + unsigned movieFPS, Boolean packetLossCompensate); + // called only by createNew() + virtual ~AVIFileSink(); + + Boolean continuePlaying(); + static void afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + static void onSourceClosure(void* clientData); + void onSourceClosure1(); + static void onRTCPBye(void* clientData); + void addIndexRecord(class AVIIndexRecord* newIndexRecord); + void completeOutputFile(); + +private: + friend class AVISubsessionIOState; + MediaSession& fInputSession; + FILE* fOutFid; + class AVIIndexRecord *fIndexRecordsHead, *fIndexRecordsTail; + unsigned fNumIndexRecords; + unsigned fBufferSize; + Boolean fPacketLossCompensate; + Boolean fAreCurrentlyBeingPlayed; + afterPlayingFunc* fAfterFunc; + void* fAfterClientData; + unsigned fNumSubsessions; + unsigned fNumBytesWritten; + struct timeval fStartTime; + Boolean fHaveCompletedOutputFile; + +private: + ///// Definitions specific to the AVI file format: + + unsigned addWord(unsigned word); // outputs "word" in little-endian order + unsigned addHalfWord(unsigned short halfWord); + unsigned addByte(unsigned char byte) { + putc(byte, fOutFid); + return 1; + } + unsigned addZeroWords(unsigned numWords); + unsigned add4ByteString(char const* str); + void setWord(unsigned filePosn, unsigned size); + + // Define member functions for outputting various types of file header: +#define _header(name) unsigned addFileHeader_##name() + _header(AVI); + _header(hdrl); + _header(avih); + _header(strl); + _header(strh); + _header(strf); + _header(JUNK); +// _header(JUNK); + _header(movi); +private: + unsigned short fMovieWidth, fMovieHeight; + unsigned fMovieFPS; + unsigned fRIFFSizePosition, fRIFFSizeValue; + unsigned fAVIHMaxBytesPerSecondPosition; + unsigned fAVIHFrameCountPosition; + unsigned fMoviSizePosition, fMoviSizeValue; + class AVISubsessionIOState* fCurrentIOState; + unsigned fJunkNumber; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/AudioInputDevice.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/AudioInputDevice.hh new file mode 100644 index 000000000..8c0449b5f --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/AudioInputDevice.hh @@ -0,0 +1,71 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Generic audio input device (such as a microphone, or an input sound card) +// C++ header + +#ifndef _AUDIO_INPUT_DEVICE_HH +#define _AUDIO_INPUT_DEVICE_HH + +#ifndef _FRAMED_SOURCE_HH +#include "FramedSource.hh" +#endif + +class AudioPortNames { +public: + AudioPortNames(); + virtual ~AudioPortNames(); + + unsigned numPorts; + char** portName; +}; + +class AudioInputDevice: public FramedSource { +public: + unsigned char bitsPerSample() const { return fBitsPerSample; } + unsigned char numChannels() const { return fNumChannels; } + unsigned samplingFrequency() const { return fSamplingFrequency; } + + virtual Boolean setInputPort(int portIndex) = 0; + virtual double getAverageLevel() const = 0; + + static AudioInputDevice* + createNew(UsageEnvironment& env, int inputPortNumber, + unsigned char bitsPerSample, unsigned char numChannels, + unsigned samplingFrequency, unsigned granularityInMS = 20); + static AudioPortNames* getPortNames(); + + static char** allowedDeviceNames; + // If this is set to non-NULL, then it's a NULL-terminated array of strings + // of device names that we are allowed to access. + +protected: + AudioInputDevice(UsageEnvironment& env, + unsigned char bitsPerSample, + unsigned char numChannels, + unsigned samplingFrequency, + unsigned granularityInMS); + // we're an abstract base class + + virtual ~AudioInputDevice(); + +protected: + unsigned char fBitsPerSample, fNumChannels; + unsigned fSamplingFrequency; + unsigned fGranularityInMS; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/AudioRTPSink.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/AudioRTPSink.hh new file mode 100644 index 000000000..47042d85f --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/AudioRTPSink.hh @@ -0,0 +1,42 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A generic RTP sink for audio codecs (abstract base class) +// C++ header + +#ifndef _AUDIO_RTP_SINK_HH +#define _AUDIO_RTP_SINK_HH + +#ifndef _MULTI_FRAMED_RTP_SINK_HH +#include "MultiFramedRTPSink.hh" +#endif + +class AudioRTPSink: public MultiFramedRTPSink { +protected: + AudioRTPSink(UsageEnvironment& env, + Groupsock* rtpgs, unsigned char rtpPayloadType, + unsigned rtpTimestampFrequency, + char const* rtpPayloadFormatName, + unsigned numChannels = 1); + // (we're an abstract base class) + virtual ~AudioRTPSink(); + +private: // redefined virtual functions: + virtual char const* sdpMediaType() const; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/Base64.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/Base64.hh new file mode 100644 index 000000000..c8a63c731 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/Base64.hh @@ -0,0 +1,43 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Base64 encoding and decoding +// C++ header + +#ifndef _BASE64_HH +#define _BASE64_HH + +#ifndef _BOOLEAN_HH +#include "Boolean.hh" +#endif + +unsigned char* base64Decode(char const* in, unsigned& resultSize, + Boolean trimTrailingZeros = True); + // returns a newly allocated array - of size "resultSize" - that + // the caller is responsible for delete[]ing. + +unsigned char* base64Decode(char const* in, unsigned inSize, + unsigned& resultSize, + Boolean trimTrailingZeros = True); + // As above, but includes the size of the input string (i.e., the number of bytes to decode) as a parameter. + // This saves an extra call to "strlen()" if we already know the length of the input string. + +char* base64Encode(char const* orig, unsigned origLength); + // returns a 0-terminated string that + // the caller is responsible for delete[]ing. + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/BasicUDPSink.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/BasicUDPSink.hh new file mode 100644 index 000000000..cd6548007 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/BasicUDPSink.hh @@ -0,0 +1,62 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A simple UDP sink (i.e., without RTP or other headers added); one frame per packet +// C++ header + +#ifndef _BASIC_UDP_SINK_HH +#define _BASIC_UDP_SINK_HH + +#ifndef _MEDIA_SINK_HH +#include "MediaSink.hh" +#endif +#ifndef _GROUPSOCK_HH +#include +#endif + +class BasicUDPSink: public MediaSink { +public: + static BasicUDPSink* createNew(UsageEnvironment& env, Groupsock* gs, + unsigned maxPayloadSize = 1450); +protected: + BasicUDPSink(UsageEnvironment& env, Groupsock* gs, unsigned maxPayloadSize); + // called only by createNew() + virtual ~BasicUDPSink(); + +private: // redefined virtual functions: + virtual Boolean continuePlaying(); + +private: + void continuePlaying1(); + + static void afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + void afterGettingFrame1(unsigned frameSize, unsigned numTruncatedBytes, + unsigned durationInMicroseconds); + + static void sendNext(void* firstArg); + +private: + Groupsock* fGS; + unsigned fMaxPayloadSize; + unsigned char* fOutputBuffer; + struct timeval fNextSendTime; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/BasicUDPSource.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/BasicUDPSource.hh new file mode 100644 index 000000000..77b5cddc4 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/BasicUDPSource.hh @@ -0,0 +1,56 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A simple UDP source, where every UDP payload is a complete frame +// C++ header + +#ifndef _BASIC_UDP_SOURCE_HH +#define _BASIC_UDP_SOURCE_HH + +#ifndef _FRAMED_SOURCE_HH +#include "FramedSource.hh" +#endif +#ifndef _GROUPSOCK_HH +#include "Groupsock.hh" +#endif + +class BasicUDPSource: public FramedSource { +public: + static BasicUDPSource* createNew(UsageEnvironment& env, Groupsock* inputGS); + + virtual ~BasicUDPSource(); + + Groupsock* gs() const { return fInputGS; } + +private: + BasicUDPSource(UsageEnvironment& env, Groupsock* inputGS); + // called only by createNew() + + static void incomingPacketHandler(BasicUDPSource* source, int mask); + void incomingPacketHandler1(); + +private: // redefined virtual functions: + virtual unsigned maxFrameSize() const; + virtual void doGetNextFrame(); + virtual void doStopGettingFrames(); + +private: + Groupsock* fInputGS; + Boolean fHaveStartedReading; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/BitVector.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/BitVector.hh new file mode 100644 index 000000000..61f0cc764 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/BitVector.hh @@ -0,0 +1,67 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Bit Vector data structure +// C++ header + +#ifndef _BIT_VECTOR_HH +#define _BIT_VECTOR_HH + +#ifndef _BOOLEAN_HH +#include "Boolean.hh" +#endif + +class BitVector { +public: + BitVector(unsigned char* baseBytePtr, + unsigned baseBitOffset, + unsigned totNumBits); + + void setup(unsigned char* baseBytePtr, + unsigned baseBitOffset, + unsigned totNumBits); + + void putBits(unsigned from, unsigned numBits); // "numBits" <= 32 + void put1Bit(unsigned bit); + + unsigned getBits(unsigned numBits); // "numBits" <= 32 + unsigned get1Bit(); + Boolean get1BitBoolean() { return get1Bit() != 0; } + + void skipBits(unsigned numBits); + + unsigned curBitIndex() const { return fCurBitIndex; } + unsigned totNumBits() const { return fTotNumBits; } + unsigned numBitsRemaining() const { return fTotNumBits - fCurBitIndex; } + + unsigned get_expGolomb(); + // Returns the value of the next bits, assuming that they were encoded using an exponential-Golomb code of order 0 + int get_expGolombSigned(); // signed version of the above + +private: + unsigned char* fBaseBytePtr; + unsigned fBaseBitOffset; + unsigned fTotNumBits; + unsigned fCurBitIndex; +}; + +// A general bit copy operation: +void shiftBits(unsigned char* toBasePtr, unsigned toBitOffset, + unsigned char const* fromBasePtr, unsigned fromBitOffset, + unsigned numBits); + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/ByteStreamFileSource.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/ByteStreamFileSource.hh new file mode 100644 index 000000000..b445d5511 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/ByteStreamFileSource.hh @@ -0,0 +1,82 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A file source that is a plain byte stream (rather than frames) +// C++ header + +#ifndef _BYTE_STREAM_FILE_SOURCE_HH +#define _BYTE_STREAM_FILE_SOURCE_HH + +#ifndef _FRAMED_FILE_SOURCE_HH +#include "FramedFileSource.hh" +#endif + +class ByteStreamFileSource: public FramedFileSource { +public: + static ByteStreamFileSource* createNew(UsageEnvironment& env, + char const* fileName, + unsigned preferredFrameSize = 0, + unsigned playTimePerFrame = 0); + // "preferredFrameSize" == 0 means 'no preference' + // "playTimePerFrame" is in microseconds + + static ByteStreamFileSource* createNew(UsageEnvironment& env, + FILE* fid, + unsigned preferredFrameSize = 0, + unsigned playTimePerFrame = 0); + // an alternative version of "createNew()" that's used if you already have + // an open file. + + u_int64_t fileSize() const { return fFileSize; } + // 0 means zero-length, unbounded, or unknown + + void seekToByteAbsolute(u_int64_t byteNumber, u_int64_t numBytesToStream = 0); + // if "numBytesToStream" is >0, then we limit the stream to that number of bytes, before treating it as EOF + void seekToByteRelative(int64_t offset, u_int64_t numBytesToStream = 0); + void seekToEnd(); // to force EOF handling on the next read + +protected: + ByteStreamFileSource(UsageEnvironment& env, + FILE* fid, + unsigned preferredFrameSize, + unsigned playTimePerFrame); + // called only by createNew() + + virtual ~ByteStreamFileSource(); + + static void fileReadableHandler(ByteStreamFileSource* source, int mask); + void doReadFromFile(); + +private: + // redefined virtual functions: + virtual void doGetNextFrame(); + virtual void doStopGettingFrames(); + +protected: + u_int64_t fFileSize; + +private: + unsigned fPreferredFrameSize; + unsigned fPlayTimePerFrame; + Boolean fFidIsSeekable; + unsigned fLastPlayTime; + Boolean fHaveStartedReading; + Boolean fLimitNumBytesToStream; + u_int64_t fNumBytesToStream; // used iff "fLimitNumBytesToStream" is True +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/ByteStreamMemoryBufferSource.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/ByteStreamMemoryBufferSource.hh new file mode 100644 index 000000000..f83eb44d9 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/ByteStreamMemoryBufferSource.hh @@ -0,0 +1,70 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A class for streaming data from a (static) memory buffer, as if it were a file. +// C++ header + +#ifndef _BYTE_STREAM_MEMORY_BUFFER_SOURCE_HH +#define _BYTE_STREAM_MEMORY_BUFFER_SOURCE_HH + +#ifndef _FRAMED_SOURCE_HH +#include "FramedSource.hh" +#endif + +class ByteStreamMemoryBufferSource: public FramedSource { +public: + static ByteStreamMemoryBufferSource* createNew(UsageEnvironment& env, + u_int8_t* buffer, u_int64_t bufferSize, + Boolean deleteBufferOnClose = True, + unsigned preferredFrameSize = 0, + unsigned playTimePerFrame = 0); + // "preferredFrameSize" == 0 means 'no preference' + // "playTimePerFrame" is in microseconds + + u_int64_t bufferSize() const { return fBufferSize; } + + void seekToByteAbsolute(u_int64_t byteNumber, u_int64_t numBytesToStream = 0); + // if "numBytesToStream" is >0, then we limit the stream to that number of bytes, before treating it as EOF + void seekToByteRelative(int64_t offset, u_int64_t numBytesToStream = 0); + +protected: + ByteStreamMemoryBufferSource(UsageEnvironment& env, + u_int8_t* buffer, u_int64_t bufferSize, + Boolean deleteBufferOnClose, + unsigned preferredFrameSize, + unsigned playTimePerFrame); + // called only by createNew() + + virtual ~ByteStreamMemoryBufferSource(); + +private: + // redefined virtual functions: + virtual void doGetNextFrame(); + +private: + u_int8_t* fBuffer; + u_int64_t fBufferSize; + u_int64_t fCurIndex; + Boolean fDeleteBufferOnClose; + unsigned fPreferredFrameSize; + unsigned fPlayTimePerFrame; + unsigned fLastPlayTime; + Boolean fLimitNumBytesToStream; + u_int64_t fNumBytesToStream; // used iff "fLimitNumBytesToStream" is True +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/ByteStreamMultiFileSource.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/ByteStreamMultiFileSource.hh new file mode 100644 index 000000000..b29f8d91b --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/ByteStreamMultiFileSource.hh @@ -0,0 +1,69 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A source that consists of multiple byte-stream files, read sequentially. +// (The input is an array of file names, with a terminating 'file name' of NULL.) +// C++ header + +#ifndef _BYTE_STREAM_MULTI_FILE_SOURCE_HH +#define _BYTE_STREAM_MULTI_FILE_SOURCE_HH + +#ifndef _BYTE_STREAM_FILE_SOURCE_HH +#include "ByteStreamFileSource.hh" +#endif + +class ByteStreamMultiFileSource: public FramedSource { +public: + static ByteStreamMultiFileSource* + createNew(UsageEnvironment& env, char const** fileNameArray, + unsigned preferredFrameSize = 0, unsigned playTimePerFrame = 0); + // "fileNameArray" is a pointer to an array of (char const*) file names, with + // A 'file name' of NULL indicating the end of the array + + Boolean haveStartedNewFile() const { return fHaveStartedNewFile; } + // True iff the most recently delivered frame was the first from a newly-opened file + +protected: + ByteStreamMultiFileSource(UsageEnvironment& env, char const** fileNameArray, + unsigned preferredFrameSize, unsigned playTimePerFrame); + // called only by createNew() + + virtual ~ByteStreamMultiFileSource(); + +private: + // redefined virtual functions: + virtual void doGetNextFrame(); + +private: + static void onSourceClosure(void* clientData); + void onSourceClosure1(); + static void afterGettingFrame(void* clientData, + unsigned frameSize, unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + +private: + unsigned fPreferredFrameSize; + unsigned fPlayTimePerFrame; + unsigned fNumSources; + unsigned fCurrentlyReadSourceNumber; + Boolean fHaveStartedNewFile; + char const** fFileNameArray; + ByteStreamFileSource** fSourceArray; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/DVVideoFileServerMediaSubsession.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/DVVideoFileServerMediaSubsession.hh new file mode 100644 index 000000000..c09c0b06c --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/DVVideoFileServerMediaSubsession.hh @@ -0,0 +1,51 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A 'ServerMediaSubsession' object that creates new, unicast, "RTPSink"s +// on demand, from a DV video file. +// C++ header + +#ifndef _DV_VIDEO_FILE_SERVER_MEDIA_SUBSESSION_HH +#define _DV_VIDEO_FILE_SERVER_MEDIA_SUBSESSION_HH + +#ifndef _FILE_SERVER_MEDIA_SUBSESSION_HH +#include "FileServerMediaSubsession.hh" +#endif + +class DVVideoFileServerMediaSubsession: public FileServerMediaSubsession{ +public: + static DVVideoFileServerMediaSubsession* + createNew(UsageEnvironment& env, char const* fileName, Boolean reuseFirstSource); + +private: + DVVideoFileServerMediaSubsession(UsageEnvironment& env, char const* fileName, Boolean reuseFirstSource); + // called only by createNew(); + virtual ~DVVideoFileServerMediaSubsession(); + +private: // redefined virtual functions + virtual char const* getAuxSDPLine(RTPSink* rtpSink, FramedSource* inputSource); + virtual void seekStreamSource(FramedSource* inputSource, double& seekNPT, double streamDuration, u_int64_t& numBytes); + virtual void setStreamSourceDuration(FramedSource* inputSource, double streamDuration, u_int64_t& numBytes); + virtual FramedSource* createNewStreamSource(unsigned clientSessionId, unsigned& estBitrate); + virtual RTPSink* createNewRTPSink(Groupsock* rtpGroupsock, unsigned char rtpPayloadTypeIfDynamic, FramedSource* inputSource); + virtual float duration() const; + +private: + float fFileDuration; // in seconds +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/DVVideoRTPSink.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/DVVideoRTPSink.hh new file mode 100644 index 000000000..14424b09c --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/DVVideoRTPSink.hh @@ -0,0 +1,57 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP sink for DV video (RFC 3189) +// (Thanks to Ben Hutchings for prototyping this.) +// C++ header + +#ifndef _DV_VIDEO_RTP_SINK_HH +#define _DV_VIDEO_RTP_SINK_HH + +#ifndef _VIDEO_RTP_SINK_HH +#include "VideoRTPSink.hh" +#endif +#ifndef _DV_VIDEO_STREAM_FRAMER_HH +#include "DVVideoStreamFramer.hh" +#endif + +class DVVideoRTPSink: public VideoRTPSink { +public: + static DVVideoRTPSink* createNew(UsageEnvironment& env, Groupsock* RTPgs, unsigned char rtpPayloadFormat); + char const* auxSDPLineFromFramer(DVVideoStreamFramer* framerSource); + +protected: + DVVideoRTPSink(UsageEnvironment& env, Groupsock* RTPgs, unsigned char rtpPayloadFormat); + // called only by createNew() + + virtual ~DVVideoRTPSink(); + +private: // redefined virtual functions: + virtual Boolean sourceIsCompatibleWithUs(MediaSource& source); + virtual void doSpecialFrameHandling(unsigned fragmentationOffset, + unsigned char* frameStart, + unsigned numBytesInFrame, + struct timeval framePresentationTime, + unsigned numRemainingBytes); + virtual unsigned computeOverflowForNewFrame(unsigned newFrameSize) const; + virtual char const* auxSDPLine(); + +private: + char* fFmtpSDPLine; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/DVVideoRTPSource.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/DVVideoRTPSource.hh new file mode 100644 index 000000000..9ed381e86 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/DVVideoRTPSource.hh @@ -0,0 +1,51 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// DV Video RTP Sources +// C++ header + +#ifndef _DV_VIDEO_RTP_SOURCE_HH +#define _DV_VIDEO_RTP_SOURCE_HH + +#ifndef _MULTI_FRAMED_RTP_SOURCE_HH +#include "MultiFramedRTPSource.hh" +#endif + +class DVVideoRTPSource: public MultiFramedRTPSource { +public: + static DVVideoRTPSource* + createNew(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency); + +protected: + virtual ~DVVideoRTPSource(); + +private: + DVVideoRTPSource(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency); + // called only by createNew() + +private: + // redefined virtual functions: + virtual Boolean processSpecialHeader(BufferedPacket* packet, + unsigned& resultSpecialHeaderSize); + virtual char const* MIMEtype() const; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/DVVideoStreamFramer.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/DVVideoStreamFramer.hh new file mode 100644 index 000000000..4d88e0d5a --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/DVVideoStreamFramer.hh @@ -0,0 +1,72 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A filter that parses a DV input stream into DV frames to deliver to the downstream object +// C++ header + +#ifndef _DV_VIDEO_STREAM_FRAMER_HH +#define _DV_VIDEO_STREAM_FRAMER_HH + +#ifndef _FRAMED_FILTER_HH +#include "FramedFilter.hh" +#endif + +#define DV_DIF_BLOCK_SIZE 80 +#define DV_NUM_BLOCKS_PER_SEQUENCE 150 +#define DV_SAVED_INITIAL_BLOCKS_SIZE ((DV_NUM_BLOCKS_PER_SEQUENCE+6-1)*DV_DIF_BLOCK_SIZE) + /* enough data to ensure that it contains an intact 6-block header (which occurs at the start of a 150-block sequence) */ + +class DVVideoStreamFramer: public FramedFilter { +public: + static DVVideoStreamFramer* + createNew(UsageEnvironment& env, FramedSource* inputSource, + Boolean sourceIsSeekable = False, Boolean leavePresentationTimesUnmodified = False); + // Set "sourceIsSeekable" to True if the input source is a seekable object (e.g. a file), and the server that uses us + // does a seek-to-zero on the source before reading from it. (Our RTSP server implementation does this.) + char const* profileName(); + Boolean getFrameParameters(unsigned& frameSize/*bytes*/, double& frameDuration/*microseconds*/); + +protected: + DVVideoStreamFramer(UsageEnvironment& env, FramedSource* inputSource, + Boolean sourceIsSeekable, Boolean leavePresentationTimesUnmodified); + // called only by createNew(), or by subclass constructors + virtual ~DVVideoStreamFramer(); + +protected: + // redefined virtual functions: + virtual Boolean isDVVideoStreamFramer() const; + virtual void doGetNextFrame(); + +protected: + void getAndDeliverData(); // used to implement "doGetNextFrame()" + static void afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + void afterGettingFrame(unsigned frameSize, unsigned numTruncatedBytes, struct timeval presentationTime); + void getProfile(); + +protected: + Boolean fLeavePresentationTimesUnmodified; + void const* fOurProfile; + struct timeval fNextFramePresentationTime; + unsigned char fSavedInitialBlocks[DV_SAVED_INITIAL_BLOCKS_SIZE]; + char fInitialBlocksPresent; + Boolean fSourceIsSeekable; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/DeviceSource.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/DeviceSource.hh new file mode 100644 index 000000000..e4fd5029e --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/DeviceSource.hh @@ -0,0 +1,66 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A template for a MediaSource encapsulating an audio/video input device +// +// NOTE: Sections of this code labeled "%%% TO BE WRITTEN %%%" are incomplete, and needto be written by the programmer +// (depending on the features of the particulardevice). +// C++ header + +#ifndef _DEVICE_SOURCE_HH +#define _DEVICE_SOURCE_HH + +#ifndef _FRAMED_SOURCE_HH +#include "FramedSource.hh" +#endif + +// The following class can be used to define specific encoder parameters +class DeviceParameters { + //%%% TO BE WRITTEN %%% +}; + +class DeviceSource: public FramedSource { +public: + static DeviceSource* createNew(UsageEnvironment& env, + DeviceParameters params); + +public: + static EventTriggerId eventTriggerId; + // Note that this is defined here to be a static class variable, because this code is intended to illustrate how to + // encapsulate a *single* device - not a set of devices. + // You can, however, redefine this to be a non-static member variable. + +protected: + DeviceSource(UsageEnvironment& env, DeviceParameters params); + // called only by createNew(), or by subclass constructors + virtual ~DeviceSource(); + +private: + // redefined virtual functions: + virtual void doGetNextFrame(); + //virtual void doStopGettingFrames(); // optional + +private: + static void deliverFrame0(void* clientData); + void deliverFrame(); + +private: + static unsigned referenceCount; // used to count how many instances of this class currently exist + DeviceParameters fParams; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/DigestAuthentication.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/DigestAuthentication.hh new file mode 100644 index 000000000..91d596722 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/DigestAuthentication.hh @@ -0,0 +1,75 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A class used for digest authentication. +// C++ header + +#ifndef _DIGEST_AUTHENTICATION_HH +#define _DIGEST_AUTHENTICATION_HH + +#ifndef _BOOLEAN_HH +#include +#endif + +// A class used for digest authentication. +// The "realm", and "nonce" fields are supplied by the server +// (in a "401 Unauthorized" response). +// The "username" and "password" fields are supplied by the client. +class Authenticator { +public: + Authenticator(); + Authenticator(char const* username, char const* password, Boolean passwordIsMD5 = False); + // If "passwordIsMD5" is True, then "password" is actually the value computed + // by md5(::) + Authenticator(const Authenticator& orig); + Authenticator& operator=(const Authenticator& rightSide); + Boolean operator<(const Authenticator* rightSide); + virtual ~Authenticator(); + + void reset(); + void setRealmAndNonce(char const* realm, char const* nonce); + void setRealmAndRandomNonce(char const* realm); + // as above, except that the nonce is created randomly. + // (This is used by servers.) + void setUsernameAndPassword(char const* username, char const* password, Boolean passwordIsMD5 = False); + // If "passwordIsMD5" is True, then "password" is actually the value computed + // by md5(::) + + char const* realm() const { return fRealm; } + char const* nonce() const { return fNonce; } + char const* username() const { return fUsername; } + char const* password() const { return fPassword; } + + char const* computeDigestResponse(char const* cmd, char const* url) const; + // The returned string from this function must later be freed by calling: + void reclaimDigestResponse(char const* responseStr) const; + +private: + void resetRealmAndNonce(); + void resetUsernameAndPassword(); + void assignRealmAndNonce(char const* realm, char const* nonce); + void assignUsernameAndPassword(char const* username, char const* password, Boolean passwordIsMD5); + void assign(char const* realm, char const* nonce, + char const* username, char const* password, Boolean passwordIsMD5); + +private: + char* fRealm; char* fNonce; + char* fUsername; char* fPassword; + Boolean fPasswordIsMD5; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/FileServerMediaSubsession.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/FileServerMediaSubsession.hh new file mode 100644 index 000000000..52c82252d --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/FileServerMediaSubsession.hh @@ -0,0 +1,43 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A 'ServerMediaSubsession' object that creates new, unicast, "RTPSink"s +// on demand, from a file. +// C++ header + +#ifndef _FILE_SERVER_MEDIA_SUBSESSION_HH +#define _FILE_SERVER_MEDIA_SUBSESSION_HH + +#ifndef _SERVER_MEDIA_SESSION_HH +#include "ServerMediaSession.hh" +#endif +#ifndef _ON_DEMAND_SERVER_MEDIA_SUBSESSION_HH +#include "OnDemandServerMediaSubsession.hh" +#endif + +class FileServerMediaSubsession: public OnDemandServerMediaSubsession { +protected: // we're a virtual base class + FileServerMediaSubsession(UsageEnvironment& env, char const* fileName, + Boolean reuseFirstSource); + virtual ~FileServerMediaSubsession(); + +protected: + char const* fFileName; + u_int64_t fFileSize; // if known +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/FileSink.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/FileSink.hh new file mode 100644 index 000000000..125dac876 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/FileSink.hh @@ -0,0 +1,71 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// File Sinks +// C++ header + +#ifndef _FILE_SINK_HH +#define _FILE_SINK_HH + +#ifndef _MEDIA_SINK_HH +#include "MediaSink.hh" +#endif + +class FileSink: public MediaSink { +public: + static FileSink* createNew(UsageEnvironment& env, char const* fileName, + unsigned bufferSize = 20000, + Boolean oneFilePerFrame = False); + // "bufferSize" should be at least as large as the largest expected + // input frame. + // "oneFilePerFrame" - if True - specifies that each input frame will + // be written to a separate file (using the presentation time as a + // file name suffix). The default behavior ("oneFilePerFrame" == False) + // is to output all incoming data into a single file. + + virtual void addData(unsigned char const* data, unsigned dataSize, + struct timeval presentationTime); + // (Available in case a client wants to add extra data to the output file) + +protected: + FileSink(UsageEnvironment& env, FILE* fid, unsigned bufferSize, + char const* perFrameFileNamePrefix); + // called only by createNew() + virtual ~FileSink(); + +protected: // redefined virtual functions: + virtual Boolean continuePlaying(); + +protected: + static void afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + virtual void afterGettingFrame(unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime); + + FILE* fOutFid; + unsigned char* fBuffer; + unsigned fBufferSize; + char* fPerFrameFileNamePrefix; // used if "oneFilePerFrame" is True + char* fPerFrameFileNameBuffer; // used if "oneFilePerFrame" is True + struct timeval fPrevPresentationTime; + unsigned fSamePresentationTimeCounter; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/FramedFileSource.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/FramedFileSource.hh new file mode 100644 index 000000000..b1ab4b794 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/FramedFileSource.hh @@ -0,0 +1,37 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Framed File Sources +// C++ header + +#ifndef _FRAMED_FILE_SOURCE_HH +#define _FRAMED_FILE_SOURCE_HH + +#ifndef _FRAMED_SOURCE_HH +#include "FramedSource.hh" +#endif + +class FramedFileSource: public FramedSource { +protected: + FramedFileSource(UsageEnvironment& env, FILE* fid); // abstract base class + virtual ~FramedFileSource(); + +protected: + FILE* fFid; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/FramedFilter.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/FramedFilter.hh new file mode 100644 index 000000000..91836f547 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/FramedFilter.hh @@ -0,0 +1,52 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Framed Filters +// C++ header + +#ifndef _FRAMED_FILTER_HH +#define _FRAMED_FILTER_HH + +#ifndef _FRAMED_SOURCE_HH +#include "FramedSource.hh" +#endif + +class FramedFilter: public FramedSource { +public: + FramedSource* inputSource() const { return fInputSource; } + + void reassignInputSource(FramedSource* newInputSource) { fInputSource = newInputSource; } + + // Call before destruction if you want to prevent the destructor from closing the input source + void detachInputSource(); + +protected: + FramedFilter(UsageEnvironment& env, FramedSource* inputSource); + // abstract base class + virtual ~FramedFilter(); + +protected: + // Redefined virtual functions (with default 'null' implementations): + virtual char const* MIMEtype() const; + virtual void getAttributes() const; + virtual void doStopGettingFrames(); + +protected: + FramedSource* fInputSource; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/FramedSource.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/FramedSource.hh new file mode 100644 index 000000000..cf74a7931 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/FramedSource.hh @@ -0,0 +1,95 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Framed Sources +// C++ header + +#ifndef _FRAMED_SOURCE_HH +#define _FRAMED_SOURCE_HH + +#ifndef _NET_COMMON_H +#include "NetCommon.h" +#endif +#ifndef _MEDIA_SOURCE_HH +#include "MediaSource.hh" +#endif + +class FramedSource: public MediaSource { +public: + static Boolean lookupByName(UsageEnvironment& env, char const* sourceName, + FramedSource*& resultSource); + + typedef void (afterGettingFunc)(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + typedef void (onCloseFunc)(void* clientData); + void getNextFrame(unsigned char* to, unsigned maxSize, + afterGettingFunc* afterGettingFunc, + void* afterGettingClientData, + onCloseFunc* onCloseFunc, + void* onCloseClientData); + + static void handleClosure(void* clientData); + void handleClosure(); + // This should be called (on ourself) if the source is discovered + // to be closed (i.e., no longer readable) + + void stopGettingFrames(); + + virtual unsigned maxFrameSize() const; + // size of the largest possible frame that we may serve, or 0 + // if no such maximum is known (default) + + virtual void doGetNextFrame() = 0; + // called by getNextFrame() + + Boolean isCurrentlyAwaitingData() const {return fIsCurrentlyAwaitingData;} + + static void afterGetting(FramedSource* source); + // doGetNextFrame() should arrange for this to be called after the + // frame has been read (*iff* it is read successfully) + +protected: + FramedSource(UsageEnvironment& env); // abstract base class + virtual ~FramedSource(); + + virtual void doStopGettingFrames(); + +protected: + // The following variables are typically accessed/set by doGetNextFrame() + unsigned char* fTo; // in + unsigned fMaxSize; // in + unsigned fFrameSize; // out + unsigned fNumTruncatedBytes; // out + struct timeval fPresentationTime; // out + unsigned fDurationInMicroseconds; // out + +private: + // redefined virtual functions: + virtual Boolean isFramedSource() const; + +private: + afterGettingFunc* fAfterGettingFunc; + void* fAfterGettingClientData; + onCloseFunc* fOnCloseFunc; + void* fOnCloseClientData; + + Boolean fIsCurrentlyAwaitingData; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/GSMAudioRTPSink.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/GSMAudioRTPSink.hh new file mode 100644 index 000000000..cee714a99 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/GSMAudioRTPSink.hh @@ -0,0 +1,44 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP sink for GSM audio +// C++ header + +#ifndef _GSM_AUDIO_RTP_SINK_HH +#define _GSM_AUDIO_RTP_SINK_HH + +#ifndef _AUDIO_RTP_SINK_HH +#include "AudioRTPSink.hh" +#endif + +class GSMAudioRTPSink: public AudioRTPSink { +public: + static GSMAudioRTPSink* createNew(UsageEnvironment& env, Groupsock* RTPgs); + +protected: + GSMAudioRTPSink(UsageEnvironment& env, Groupsock* RTPgs); + // called only by createNew() + + virtual ~GSMAudioRTPSink(); + +private: // redefined virtual functions: + virtual + Boolean frameCanAppearAfterPacketStart(unsigned char const* frameStart, + unsigned numBytesInFrame) const; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/GenericMediaServer.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/GenericMediaServer.hh new file mode 100644 index 000000000..9ca04da3a --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/GenericMediaServer.hh @@ -0,0 +1,224 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A generic media server class, used to implement a RTSP server, and any other server that uses +// "ServerMediaSession" objects to describe media to be served. +// C++ header + +#ifndef _GENERIC_MEDIA_SERVER_HH +#define _GENERIC_MEDIA_SERVER_HH + +#ifndef _MEDIA_HH +#include "Media.hh" +#endif +#ifndef _SERVER_MEDIA_SESSION_HH +#include "ServerMediaSession.hh" +#endif + +#ifndef REQUEST_BUFFER_SIZE +#define REQUEST_BUFFER_SIZE 20000 // for incoming requests +#endif +#ifndef RESPONSE_BUFFER_SIZE +#define RESPONSE_BUFFER_SIZE 20000 +#endif + +// Typedef for a handler function that gets called when "lookupServerMediaSession()" +// (defined below) completes: +typedef void lookupServerMediaSessionCompletionFunc(void* clientData, + ServerMediaSession* sessionLookedUp); + +class GenericMediaServer: public Medium { +public: + virtual void addServerMediaSession(ServerMediaSession* serverMediaSession); + + virtual void lookupServerMediaSession(char const* streamName, + lookupServerMediaSessionCompletionFunc* completionFunc, + void* completionClientData, + Boolean isFirstLookupInSession = True); + // Note: This is a virtual function, so can be reimplemented by subclasses. + void lookupServerMediaSession(char const* streamName, + void (GenericMediaServer::*memberFunc)(ServerMediaSession*)); + // Special case of "lookupServerMediaSession()" where the 'completion function' is a + // member function of "GenericMediaServer" (and the 'completion client data' is "this".) + + void removeServerMediaSession(ServerMediaSession* serverMediaSession); + // Removes the "ServerMediaSession" object from our lookup table, so it will no longer be accessible by new clients. + // (However, any *existing* client sessions that use this "ServerMediaSession" object will continue streaming. + // The "ServerMediaSession" object will not get deleted until all of these client sessions have closed.) + // (To both delete the "ServerMediaSession" object *and* close all client sessions that use it, + // call "deleteServerMediaSession(serverMediaSession)" instead.) + virtual void removeServerMediaSession(char const* streamName); + // ditto + + void closeAllClientSessionsForServerMediaSession(ServerMediaSession* serverMediaSession); + // Closes (from the server) all client sessions that are currently using this "ServerMediaSession" object. + // Note, however, that the "ServerMediaSession" object remains accessible by new clients. + virtual void closeAllClientSessionsForServerMediaSession(char const* streamName); + // ditto + + void deleteServerMediaSession(ServerMediaSession* serverMediaSession); + // Equivalent to: + // "closeAllClientSessionsForServerMediaSession(serverMediaSession); removeServerMediaSession(serverMediaSession);" + virtual void deleteServerMediaSession(char const* streamName); + // Equivalent to: + // "closeAllClientSessionsForServerMediaSession(streamName); removeServerMediaSession(streamName); + + unsigned numClientSessions() const { return fClientSessions->numEntries(); } + +protected: + GenericMediaServer(UsageEnvironment& env, int ourSocketIPv4, int ourSocketIPv6, Port ourPort, + unsigned reclamationSeconds); + // If "reclamationSeconds" > 0, then the "ClientSession" state for each client will get + // reclaimed if no activity from the client is detected in at least "reclamationSeconds". + // we're an abstract base class + virtual ~GenericMediaServer(); + void cleanup(); // MUST be called in the destructor of any subclass of us + + static int setUpOurSocket(UsageEnvironment& env, Port& ourPort, int domain); + + static void incomingConnectionHandlerIPv4(void*, int /*mask*/); + static void incomingConnectionHandlerIPv6(void*, int /*mask*/); + void incomingConnectionHandlerIPv4(); + void incomingConnectionHandlerIPv6(); + void incomingConnectionHandlerOnSocket(int serverSocket); + + void setTLSFileNames(char const* certFileName, char const* privKeyFileName); + +public: // should be protected, but some old compilers complain otherwise + // The state of a TCP connection used by a client: + class ClientConnection { + protected: + ClientConnection(GenericMediaServer& ourServer, + int clientSocket, struct sockaddr_storage const& clientAddr, + Boolean useTLS); + virtual ~ClientConnection(); + + UsageEnvironment& envir() { return fOurServer.envir(); } + void closeSockets(); + + static void incomingRequestHandler(void*, int /*mask*/); + void incomingRequestHandler(); + virtual void handleRequestBytes(int newBytesRead) = 0; + void resetRequestBuffer(); + + protected: + friend class GenericMediaServer; + friend class ClientSession; + friend class RTSPServer; // needed to make some broken Windows compilers work; remove this in the future when we end support for Windows + GenericMediaServer& fOurServer; + int fOurSocket; + struct sockaddr_storage fClientAddr; + unsigned char fRequestBuffer[REQUEST_BUFFER_SIZE]; + unsigned char fResponseBuffer[RESPONSE_BUFFER_SIZE]; + unsigned fRequestBytesAlreadySeen, fRequestBufferBytesLeft; + + // Optional support for TLS: + ServerTLSState fTLS; + ServerTLSState* fInputTLS; // by default, just points to "fTLS", but subclasses may change + ServerTLSState* fOutputTLS; // ditto + }; + + // The state of an individual client session (using one or more sequential TCP connections) handled by a server: + class ClientSession { + protected: + ClientSession(GenericMediaServer& ourServer, u_int32_t sessionId); + virtual ~ClientSession(); + + UsageEnvironment& envir() { return fOurServer.envir(); } + void noteLiveness(); + static void noteClientLiveness(ClientSession* clientSession); + static void livenessTimeoutTask(ClientSession* clientSession); + + protected: + friend class GenericMediaServer; + friend class ClientConnection; + GenericMediaServer& fOurServer; + u_int32_t fOurSessionId; + ServerMediaSession* fOurServerMediaSession; + TaskToken fLivenessCheckTask; + }; + +protected: + virtual ClientConnection* createNewClientConnection(int clientSocket, struct sockaddr_storage const& clientAddr) = 0; + virtual ClientSession* createNewClientSession(u_int32_t sessionId) = 0; + + ClientSession* createNewClientSessionWithId(); + // Generates a new (unused) random session id, and calls the "createNewClientSession()" + // virtual function with this session id as parameter. + + // Lookup a "ClientSession" object by sessionId (integer, and string): + ClientSession* lookupClientSession(u_int32_t sessionId); + ClientSession* lookupClientSession(char const* sessionIdStr); + + // An iterator over our "ServerMediaSession" objects: + class ServerMediaSessionIterator { + public: + ServerMediaSessionIterator(GenericMediaServer& server); + virtual ~ServerMediaSessionIterator(); + ServerMediaSession* next(); + private: + HashTable::Iterator* fOurIterator; + }; + + // The basic, synchronous "ServerMediaSession" lookup operation; only for subclasses: + ServerMediaSession* getServerMediaSession(char const* streamName); + +protected: + friend class ClientConnection; + friend class ClientSession; + friend class ServerMediaSessionIterator; + int fServerSocketIPv4, fServerSocketIPv6; + Port fServerPort; + unsigned fReclamationSeconds; + +private: + HashTable* fServerMediaSessions; // maps 'stream name' strings to "ServerMediaSession" objects + HashTable* fClientConnections; // the "ClientConnection" objects that we're using + HashTable* fClientSessions; // maps 'session id' strings to "ClientSession" objects + u_int32_t fPreviousClientSessionId; + + char const* fTLSCertificateFileName; + char const* fTLSPrivateKeyFileName; +}; + +// A data structure used for optional user/password authentication: + +class UserAuthenticationDatabase { +public: + UserAuthenticationDatabase(char const* realm = NULL, + Boolean passwordsAreMD5 = False); + // If "passwordsAreMD5" is True, then each password stored into, or removed from, + // the database is actually the value computed + // by md5(::) + virtual ~UserAuthenticationDatabase(); + + virtual void addUserRecord(char const* username, char const* password); + virtual void removeUserRecord(char const* username); + + virtual char const* lookupPassword(char const* username); + // returns NULL if the user name was not present + + char const* realm() { return fRealm; } + Boolean passwordsAreMD5() { return fPasswordsAreMD5; } + +protected: + HashTable* fTable; + char* fRealm; + Boolean fPasswordsAreMD5; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/H261VideoRTPSource.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/H261VideoRTPSource.hh new file mode 100644 index 000000000..1ee1bda9d --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/H261VideoRTPSource.hh @@ -0,0 +1,56 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// H.261 Video RTP Sources +// C++ header + +#ifndef _H261_VIDEO_RTP_SOURCE_HH +#define _H261_VIDEO_RTP_SOURCE_HH + +#ifndef _MULTI_FRAMED_RTP_SOURCE_HH +#include "MultiFramedRTPSource.hh" +#endif + +class H261VideoRTPSource: public MultiFramedRTPSource { +public: + static H261VideoRTPSource* + createNew(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat = 31, + unsigned rtpTimestampFrequency = 90000); + + u_int32_t lastSpecialHeader() const {return fLastSpecialHeader;} + +protected: + virtual ~H261VideoRTPSource(); + +private: + H261VideoRTPSource(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency); + // called only by createNew() + +private: + // redefined virtual functions: + virtual Boolean processSpecialHeader(BufferedPacket* packet, + unsigned& resultSpecialHeaderSize); + virtual char const* MIMEtype() const; + +private: + u_int32_t fLastSpecialHeader; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/H263plusVideoFileServerMediaSubsession.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/H263plusVideoFileServerMediaSubsession.hh new file mode 100644 index 000000000..5353539eb --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/H263plusVideoFileServerMediaSubsession.hh @@ -0,0 +1,48 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A 'ServerMediaSubsession' object that creates new, unicast, "RTPSink"s +// on demand, from a H.263 video file. +// C++ header + +#ifndef _H263PLUS_VIDEO_FILE_SERVER_MEDIA_SUBSESSION_HH +#define _H263PLUS_VIDEO_FILE_SERVER_MEDIA_SUBSESSION_HH + +#ifndef _FILE_SERVER_MEDIA_SUBSESSION_HH +#include "FileServerMediaSubsession.hh" +#endif + +class H263plusVideoFileServerMediaSubsession: public FileServerMediaSubsession{ +public: + static H263plusVideoFileServerMediaSubsession* + createNew(UsageEnvironment& env, char const* fileName, Boolean reuseFirstSource); + +private: + H263plusVideoFileServerMediaSubsession(UsageEnvironment& env, + char const* fileName, Boolean reuseFirstSource); + // called only by createNew(); + virtual ~H263plusVideoFileServerMediaSubsession(); + +private: // redefined virtual functions + virtual FramedSource* createNewStreamSource(unsigned clientSessionId, + unsigned& estBitrate); + virtual RTPSink* createNewRTPSink(Groupsock* rtpGroupsock, + unsigned char rtpPayloadTypeIfDynamic, + FramedSource* inputSource); +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/H263plusVideoRTPSink.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/H263plusVideoRTPSink.hh new file mode 100644 index 000000000..074c4d20c --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/H263plusVideoRTPSink.hh @@ -0,0 +1,54 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP sink for H.263+ video (RFC 4629) +// C++ header + +#ifndef _H263_PLUS_VIDEO_RTP_SINK_HH +#define _H263_PLUS_VIDEO_RTP_SINK_HH + +#ifndef _VIDEO_RTP_SINK_HH +#include "VideoRTPSink.hh" +#endif + +class H263plusVideoRTPSink: public VideoRTPSink { +public: + static H263plusVideoRTPSink* createNew(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + u_int32_t rtpTimestampFrequency = 90000); + +protected: + H263plusVideoRTPSink(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + u_int32_t rtpTimestampFrequency); + // called only by createNew() + + virtual ~H263plusVideoRTPSink(); + +private: // redefined virtual functions: + virtual void doSpecialFrameHandling(unsigned fragmentationOffset, + unsigned char* frameStart, + unsigned numBytesInFrame, + struct timeval framePresentationTime, + unsigned numRemainingBytes); + virtual + Boolean frameCanAppearAfterPacketStart(unsigned char const* frameStart, + unsigned numBytesInFrame) const; + virtual unsigned specialHeaderSize() const; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/H263plusVideoRTPSource.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/H263plusVideoRTPSource.hh new file mode 100644 index 000000000..40dd4759c --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/H263plusVideoRTPSource.hh @@ -0,0 +1,60 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// H.263+ Video RTP Sources +// C++ header + +#ifndef _H263_PLUS_VIDEO_RTP_SOURCE_HH +#define _H263_PLUS_VIDEO_RTP_SOURCE_HH + +#ifndef _MULTI_FRAMED_RTP_SOURCE_HH +#include "MultiFramedRTPSource.hh" +#endif + +#define SPECIAL_HEADER_BUFFER_SIZE 1000 + +class H263plusVideoRTPSource: public MultiFramedRTPSource { +public: + static H263plusVideoRTPSource* + createNew(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency = 90000); + + // A data structure that stores copies of the special header bytes + // from the most recent frame's RTP packets: + unsigned char fNumSpecialHeaders; + unsigned fSpecialHeaderBytesLength; + unsigned char fSpecialHeaderBytes[SPECIAL_HEADER_BUFFER_SIZE]; + unsigned fPacketSizes[256]; + +protected: + virtual ~H263plusVideoRTPSource(); + +private: + H263plusVideoRTPSource(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency); + // called only by createNew() + +private: + // redefined virtual functions: + virtual Boolean processSpecialHeader(BufferedPacket* packet, + unsigned& resultSpecialHeaderSize); + virtual char const* MIMEtype() const; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/H263plusVideoStreamFramer.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/H263plusVideoStreamFramer.hh new file mode 100644 index 000000000..5dc2d6df0 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/H263plusVideoStreamFramer.hh @@ -0,0 +1,64 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A filter that breaks up an H263 video elementary stream into frames. +// Author Benhard Feiten + +#ifndef _H263PLUS_VIDEO_STREAM_FRAMER_HH +#define _H263PLUS_VIDEO_STREAM_FRAMER_HH + +#ifndef _FRAMED_FILTER_HH +#include "FramedFilter.hh" +#endif + + +class H263plusVideoStreamFramer: public FramedFilter { +public: + + static H263plusVideoStreamFramer* createNew(UsageEnvironment& env, FramedSource* inputSource); + + Boolean& pictureEndMarker() { return fPictureEndMarker; } // a hack for implementing the RTP 'M' bit + +protected: + // Constructor called only by createNew(), or by subclass constructors + H263plusVideoStreamFramer(UsageEnvironment& env, + FramedSource* inputSource, + Boolean createParser = True); + virtual ~H263plusVideoStreamFramer(); + + +public: + static void continueReadProcessing(void* clientData, + unsigned char* ptr, unsigned size, + struct timeval presentationTime); + void continueReadProcessing(); + +private: + virtual void doGetNextFrame(); + virtual Boolean isH263plusVideoStreamFramer() const; + +protected: + double fFrameRate; + unsigned fPictureCount; // hack used to implement doGetNextFrame() ?? + Boolean fPictureEndMarker; + +private: + class H263plusVideoStreamParser* fParser; + struct timeval fPresentationTimeBase; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/H264VideoFileServerMediaSubsession.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/H264VideoFileServerMediaSubsession.hh new file mode 100644 index 000000000..9d28b4f88 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/H264VideoFileServerMediaSubsession.hh @@ -0,0 +1,61 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A 'ServerMediaSubsession' object that creates new, unicast, "RTPSink"s +// on demand, from a H264 Elementary Stream video file. +// C++ header + +#ifndef _H264_VIDEO_FILE_SERVER_MEDIA_SUBSESSION_HH +#define _H264_VIDEO_FILE_SERVER_MEDIA_SUBSESSION_HH + +#ifndef _FILE_SERVER_MEDIA_SUBSESSION_HH +#include "FileServerMediaSubsession.hh" +#endif + +class H264VideoFileServerMediaSubsession: public FileServerMediaSubsession { +public: + static H264VideoFileServerMediaSubsession* + createNew(UsageEnvironment& env, char const* fileName, Boolean reuseFirstSource); + + // Used to implement "getAuxSDPLine()": + void checkForAuxSDPLine1(); + void afterPlayingDummy1(); + +protected: + H264VideoFileServerMediaSubsession(UsageEnvironment& env, + char const* fileName, Boolean reuseFirstSource); + // called only by createNew(); + virtual ~H264VideoFileServerMediaSubsession(); + + void setDoneFlag() { fDoneFlag = ~0; } + +protected: // redefined virtual functions + virtual char const* getAuxSDPLine(RTPSink* rtpSink, + FramedSource* inputSource); + virtual FramedSource* createNewStreamSource(unsigned clientSessionId, + unsigned& estBitrate); + virtual RTPSink* createNewRTPSink(Groupsock* rtpGroupsock, + unsigned char rtpPayloadTypeIfDynamic, + FramedSource* inputSource); + +private: + char* fAuxSDPLine; + char fDoneFlag; // used when setting up "fAuxSDPLine" + RTPSink* fDummyRTPSink; // ditto +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/H264VideoFileSink.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/H264VideoFileSink.hh new file mode 100644 index 000000000..26a8ff948 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/H264VideoFileSink.hh @@ -0,0 +1,47 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// H.264 Video File Sinks +// C++ header + +#ifndef _H264_VIDEO_FILE_SINK_HH +#define _H264_VIDEO_FILE_SINK_HH + +#ifndef _H264_OR_5_VIDEO_FILE_SINK_HH +#include "H264or5VideoFileSink.hh" +#endif + +class H264VideoFileSink: public H264or5VideoFileSink { +public: + static H264VideoFileSink* createNew(UsageEnvironment& env, char const* fileName, + char const* sPropParameterSetsStr = NULL, + // "sPropParameterSetsStr" is an optional 'SDP format' string + // (comma-separated Base64-encoded) representing SPS and/or PPS NAL-units + // to prepend to the output + unsigned bufferSize = 100000, + Boolean oneFilePerFrame = False); + // See "FileSink.hh" for a description of these parameters. + +protected: + H264VideoFileSink(UsageEnvironment& env, FILE* fid, + char const* sPropParameterSetsStr, + unsigned bufferSize, char const* perFrameFileNamePrefix); + // called only by createNew() + virtual ~H264VideoFileSink(); +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/H264VideoRTPSink.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/H264VideoRTPSink.hh new file mode 100644 index 000000000..a9126cd7c --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/H264VideoRTPSink.hh @@ -0,0 +1,59 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP sink for H.264 video (RFC 3984) +// C++ header + +#ifndef _H264_VIDEO_RTP_SINK_HH +#define _H264_VIDEO_RTP_SINK_HH + +#ifndef _H264_OR_5_VIDEO_RTP_SINK_HH +#include "H264or5VideoRTPSink.hh" +#endif + +class H264VideoRTPSink: public H264or5VideoRTPSink { +public: + static H264VideoRTPSink* + createNew(UsageEnvironment& env, Groupsock* RTPgs, unsigned char rtpPayloadFormat); + static H264VideoRTPSink* + createNew(UsageEnvironment& env, Groupsock* RTPgs, unsigned char rtpPayloadFormat, + u_int8_t const* sps, unsigned spsSize, u_int8_t const* pps, unsigned ppsSize); + // an optional variant of "createNew()", useful if we know, in advance, + // the stream's SPS and PPS NAL units. + // This avoids us having to 'pre-read' from the input source in order to get these values. + static H264VideoRTPSink* + createNew(UsageEnvironment& env, Groupsock* RTPgs, unsigned char rtpPayloadFormat, + char const* sPropParameterSetsStr); + // an optional variant of "createNew()", useful if we know, in advance, + // the stream's SPS and PPS NAL units. + // This avoids us having to 'pre-read' from the input source in order to get these values. + +protected: + H264VideoRTPSink(UsageEnvironment& env, Groupsock* RTPgs, unsigned char rtpPayloadFormat, + u_int8_t const* sps = NULL, unsigned spsSize = 0, + u_int8_t const* pps = NULL, unsigned ppsSize = 0); + // called only by createNew() + virtual ~H264VideoRTPSink(); + +protected: // redefined virtual functions: + virtual char const* auxSDPLine(); + +private: // redefined virtual functions: + virtual Boolean sourceIsCompatibleWithUs(MediaSource& source); +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/H264VideoRTPSource.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/H264VideoRTPSource.hh new file mode 100644 index 000000000..ff53c45eb --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/H264VideoRTPSource.hh @@ -0,0 +1,70 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// H.264 Video RTP Sources +// C++ header + +#ifndef _H264_VIDEO_RTP_SOURCE_HH +#define _H264_VIDEO_RTP_SOURCE_HH + +#ifndef _MULTI_FRAMED_RTP_SOURCE_HH +#include "MultiFramedRTPSource.hh" +#endif + +class H264VideoRTPSource: public MultiFramedRTPSource { +public: + static H264VideoRTPSource* + createNew(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency = 90000); + +protected: + H264VideoRTPSource(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency); + // called only by createNew() + + virtual ~H264VideoRTPSource(); + +protected: + // redefined virtual functions: + virtual Boolean processSpecialHeader(BufferedPacket* packet, + unsigned& resultSpecialHeaderSize); + virtual char const* MIMEtype() const; + +private: + friend class H264BufferedPacket; + unsigned char fCurPacketNALUnitType; +}; + +class SPropRecord { +public: + ~SPropRecord() { delete[] sPropBytes; } + + unsigned sPropLength; // in bytes + unsigned char* sPropBytes; +}; + +SPropRecord* parseSPropParameterSets(char const* sPropParameterSetsStr, + // result parameter: + unsigned& numSPropRecords); + // Returns the binary value of each 'parameter set' specified in a + // "sprop-parameter-sets" string (in the SDP description for a H.264/RTP stream). + // The value is returned as an array (length "numSPropRecords") of "SPropRecord"s. + // This array is dynamically allocated by this routine, and must be delete[]d by the caller. + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/H264VideoStreamDiscreteFramer.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/H264VideoStreamDiscreteFramer.hh new file mode 100644 index 000000000..38339b640 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/H264VideoStreamDiscreteFramer.hh @@ -0,0 +1,48 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A simplified version of "H264VideoStreamFramer" that takes only complete, +// discrete frames (rather than an arbitrary byte stream) as input. +// This avoids the parsing and data copying overhead of the full +// "H264VideoStreamFramer". +// C++ header + +#ifndef _H264_VIDEO_STREAM_DISCRETE_FRAMER_HH +#define _H264_VIDEO_STREAM_DISCRETE_FRAMER_HH + +#ifndef _H264_OR_5_VIDEO_STREAM_DISCRETE_FRAMER_HH +#include "H264or5VideoStreamDiscreteFramer.hh" +#endif + +class H264VideoStreamDiscreteFramer: public H264or5VideoStreamDiscreteFramer { +public: + static H264VideoStreamDiscreteFramer* + createNew(UsageEnvironment& env, FramedSource* inputSource, + Boolean includeStartCodeInOutput = False, Boolean insertAccessUnitDelimiters = False); + +protected: + H264VideoStreamDiscreteFramer(UsageEnvironment& env, FramedSource* inputSource, + Boolean includeStartCodeInOutput, Boolean insertAccessUnitDelimiters); + // called only by createNew() + virtual ~H264VideoStreamDiscreteFramer(); + +private: + // redefined virtual functions: + virtual Boolean isH264VideoStreamFramer() const; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/H264VideoStreamFramer.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/H264VideoStreamFramer.hh new file mode 100644 index 000000000..82fe80a11 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/H264VideoStreamFramer.hh @@ -0,0 +1,45 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A filter that breaks up a H.264 Video Elementary Stream into NAL units. +// C++ header + +#ifndef _H264_VIDEO_STREAM_FRAMER_HH +#define _H264_VIDEO_STREAM_FRAMER_HH + +#ifndef _H264_OR_5_VIDEO_STREAM_FRAMER_HH +#include "H264or5VideoStreamFramer.hh" +#endif + +class H264VideoStreamFramer: public H264or5VideoStreamFramer { +public: + static H264VideoStreamFramer* createNew(UsageEnvironment& env, FramedSource* inputSource, + Boolean includeStartCodeInOutput = False, + Boolean insertAccessUnitDelimiters = False); + +protected: + H264VideoStreamFramer(UsageEnvironment& env, FramedSource* inputSource, + Boolean createParser, + Boolean includeStartCodeInOutput, Boolean insertAccessUnitDelimiters); + // called only by "createNew()" + virtual ~H264VideoStreamFramer(); + + // redefined virtual functions: + virtual Boolean isH264VideoStreamFramer() const; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/H264or5VideoFileSink.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/H264or5VideoFileSink.hh new file mode 100644 index 000000000..c370de58a --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/H264or5VideoFileSink.hh @@ -0,0 +1,46 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// H.264 or H.265 Video File Sinks +// C++ header + +#ifndef _H264_OR_5_VIDEO_FILE_SINK_HH +#define _H264_OR_5_VIDEO_FILE_SINK_HH + +#ifndef _FILE_SINK_HH +#include "FileSink.hh" +#endif + +class H264or5VideoFileSink: public FileSink { +protected: + H264or5VideoFileSink(UsageEnvironment& env, FILE* fid, + unsigned bufferSize, char const* perFrameFileNamePrefix, + char const* sPropParameterSetsStr1, + char const* sPropParameterSetsStr2 = NULL, + char const* sPropParameterSetsStr3 = NULL); + // we're an abstract base class + virtual ~H264or5VideoFileSink(); + +protected: // redefined virtual functions: + virtual void afterGettingFrame(unsigned frameSize, unsigned numTruncatedBytes, struct timeval presentationTime); + +private: + char const* fSPropParameterSetsStr[3]; + Boolean fHaveWrittenFirstFrame; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/H264or5VideoRTPSink.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/H264or5VideoRTPSink.hh new file mode 100644 index 000000000..ed3a6bfe2 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/H264or5VideoRTPSink.hh @@ -0,0 +1,60 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP sink for H.264 or H.265 video +// C++ header + +#ifndef _H264_OR_5_VIDEO_RTP_SINK_HH +#define _H264_OR_5_VIDEO_RTP_SINK_HH + +#ifndef _VIDEO_RTP_SINK_HH +#include "VideoRTPSink.hh" +#endif +#ifndef _FRAMED_FILTER_HH +#include "FramedFilter.hh" +#endif + +class H264or5VideoRTPSink: public VideoRTPSink { +protected: + H264or5VideoRTPSink(int hNumber, // 264 or 265 + UsageEnvironment& env, Groupsock* RTPgs, unsigned char rtpPayloadFormat, + u_int8_t const* vps = NULL, unsigned vpsSize = 0, + u_int8_t const* sps = NULL, unsigned spsSize = 0, + u_int8_t const* pps = NULL, unsigned ppsSize = 0); + // we're an abstrace base class + virtual ~H264or5VideoRTPSink(); + +private: // redefined virtual functions: + virtual Boolean continuePlaying(); + virtual void doSpecialFrameHandling(unsigned fragmentationOffset, + unsigned char* frameStart, + unsigned numBytesInFrame, + struct timeval framePresentationTime, + unsigned numRemainingBytes); + virtual Boolean frameCanAppearAfterPacketStart(unsigned char const* frameStart, + unsigned numBytesInFrame) const; + +protected: + int fHNumber; + FramedFilter* fOurFragmenter; + char* fFmtpSDPLine; + u_int8_t* fVPS; unsigned fVPSSize; + u_int8_t* fSPS; unsigned fSPSSize; + u_int8_t* fPPS; unsigned fPPSSize; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/H264or5VideoStreamDiscreteFramer.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/H264or5VideoStreamDiscreteFramer.hh new file mode 100644 index 000000000..ab8f9a8bb --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/H264or5VideoStreamDiscreteFramer.hh @@ -0,0 +1,56 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A simplified version of "H264or5VideoStreamFramer" that takes only complete, +// discrete frames (rather than an arbitrary byte stream) as input. +// This avoids the parsing and data copying overhead of the full +// "H264or5VideoStreamFramer". +// C++ header + +#ifndef _H264_OR_5_VIDEO_STREAM_DISCRETE_FRAMER_HH +#define _H264_OR_5_VIDEO_STREAM_DISCRETE_FRAMER_HH + +#ifndef _H264_OR_5_VIDEO_STREAM_FRAMER_HH +#include "H264or5VideoStreamFramer.hh" +#endif + +class H264or5VideoStreamDiscreteFramer: public H264or5VideoStreamFramer { +protected: + H264or5VideoStreamDiscreteFramer(int hNumber, UsageEnvironment& env, FramedSource* inputSource, + Boolean includeStartCodeInOutput, + Boolean insertAccessUnitDelimiters); + // we're an abstract base class + virtual ~H264or5VideoStreamDiscreteFramer(); + +protected: + // redefined virtual functions: + virtual void doGetNextFrame(); + +protected: + static void afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + void afterGettingFrame1(unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + + virtual Boolean nalUnitEndsAccessUnit(u_int8_t nal_unit_type); +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/H264or5VideoStreamFramer.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/H264or5VideoStreamFramer.hh new file mode 100644 index 000000000..bbf91c666 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/H264or5VideoStreamFramer.hh @@ -0,0 +1,92 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A filter that breaks up a H.264 or H.265 Video Elementary Stream into NAL units. +// C++ header + +#ifndef _H264_OR_5_VIDEO_STREAM_FRAMER_HH +#define _H264_OR_5_VIDEO_STREAM_FRAMER_HH + +#ifndef _MPEG_VIDEO_STREAM_FRAMER_HH +#include "MPEGVideoStreamFramer.hh" +#endif + +class H264or5VideoStreamFramer: public MPEGVideoStreamFramer { +public: + void getVPSandSPSandPPS(u_int8_t*& vps, unsigned& vpsSize, + u_int8_t*& sps, unsigned& spsSize, + u_int8_t*& pps, unsigned& ppsSize) const { + // Returns pointers to copies of the most recently seen VPS (video parameter set) + // SPS (sequence parameter set) and PPS (picture parameter set) NAL units. + // (NULL pointers are returned if the NAL units have not yet been seen.) + vps = fLastSeenVPS; vpsSize = fLastSeenVPSSize; + sps = fLastSeenSPS; spsSize = fLastSeenSPSSize; + pps = fLastSeenPPS; ppsSize = fLastSeenPPSSize; + } + + void setVPSandSPSandPPS(u_int8_t* vps, unsigned vpsSize, + u_int8_t* sps, unsigned spsSize, + u_int8_t* pps, unsigned ppsSize) { + // Assigns copies of the VPS, SPS and PPS NAL units. If this function is not called, + // then these NAL units are assigned only if/when they appear in the input stream. + saveCopyOfVPS(vps, vpsSize); + saveCopyOfSPS(sps, spsSize); + saveCopyOfPPS(pps, ppsSize); + } + +protected: + H264or5VideoStreamFramer(int hNumber, // 264 or 265 + UsageEnvironment& env, FramedSource* inputSource, + Boolean createParser, + Boolean includeStartCodeInOutput, Boolean insertAccessUnitDelimiters); + // We're an abstract base class. + virtual ~H264or5VideoStreamFramer(); + + void saveCopyOfVPS(u_int8_t* from, unsigned size); + void saveCopyOfSPS(u_int8_t* from, unsigned size); + void saveCopyOfPPS(u_int8_t* from, unsigned size); + + void setPresentationTime(); + + Boolean isVPS(u_int8_t nal_unit_type); + Boolean isSPS(u_int8_t nal_unit_type); + Boolean isPPS(u_int8_t nal_unit_type); + Boolean isVCL(u_int8_t nal_unit_type); + +protected: // redefined virtual functions + virtual void doGetNextFrame(); + +protected: + int fHNumber; + Boolean fIncludeStartCodeInOutput, fInsertAccessUnitDelimiters; + u_int8_t* fLastSeenVPS; + unsigned fLastSeenVPSSize; + u_int8_t* fLastSeenSPS; + unsigned fLastSeenSPSSize; + u_int8_t* fLastSeenPPS; + unsigned fLastSeenPPSSize; + struct timeval fNextPresentationTime; // the presentation time to be used for the next NAL unit to be parsed/delivered after this + friend class H264or5VideoStreamParser; // hack +}; + +// A general routine for making a copy of a (H.264 or H.265) NAL unit, +// removing 'emulation' bytes from the copy: +unsigned removeH264or5EmulationBytes(u_int8_t* to, unsigned toMaxSize, + u_int8_t const* from, unsigned fromSize); + // returns the size of the copy; it will be <= min(toMaxSize,fromSize) + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/H265VideoFileServerMediaSubsession.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/H265VideoFileServerMediaSubsession.hh new file mode 100644 index 000000000..e50691af3 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/H265VideoFileServerMediaSubsession.hh @@ -0,0 +1,61 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A 'ServerMediaSubsession' object that creates new, unicast, "RTPSink"s +// on demand, from a H265 Elementary Stream video file. +// C++ header + +#ifndef _H265_VIDEO_FILE_SERVER_MEDIA_SUBSESSION_HH +#define _H265_VIDEO_FILE_SERVER_MEDIA_SUBSESSION_HH + +#ifndef _FILE_SERVER_MEDIA_SUBSESSION_HH +#include "FileServerMediaSubsession.hh" +#endif + +class H265VideoFileServerMediaSubsession: public FileServerMediaSubsession { +public: + static H265VideoFileServerMediaSubsession* + createNew(UsageEnvironment& env, char const* fileName, Boolean reuseFirstSource); + + // Used to implement "getAuxSDPLine()": + void checkForAuxSDPLine1(); + void afterPlayingDummy1(); + +protected: + H265VideoFileServerMediaSubsession(UsageEnvironment& env, + char const* fileName, Boolean reuseFirstSource); + // called only by createNew(); + virtual ~H265VideoFileServerMediaSubsession(); + + void setDoneFlag() { fDoneFlag = ~0; } + +protected: // redefined virtual functions + virtual char const* getAuxSDPLine(RTPSink* rtpSink, + FramedSource* inputSource); + virtual FramedSource* createNewStreamSource(unsigned clientSessionId, + unsigned& estBitrate); + virtual RTPSink* createNewRTPSink(Groupsock* rtpGroupsock, + unsigned char rtpPayloadTypeIfDynamic, + FramedSource* inputSource); + +private: + char* fAuxSDPLine; + char fDoneFlag; // used when setting up "fAuxSDPLine" + RTPSink* fDummyRTPSink; // ditto +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/H265VideoFileSink.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/H265VideoFileSink.hh new file mode 100644 index 000000000..7c87046d1 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/H265VideoFileSink.hh @@ -0,0 +1,51 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// H.265 Video File Sinks +// C++ header + +#ifndef _H265_VIDEO_FILE_SINK_HH +#define _H265_VIDEO_FILE_SINK_HH + +#ifndef _H264_OR_5_VIDEO_FILE_SINK_HH +#include "H264or5VideoFileSink.hh" +#endif + +class H265VideoFileSink: public H264or5VideoFileSink { +public: + static H265VideoFileSink* createNew(UsageEnvironment& env, char const* fileName, + char const* sPropVPSStr = NULL, + char const* sPropSPSStr = NULL, + char const* sPropPPSStr = NULL, + // The "sProp*Str" parameters are optional 'SDP format' strings + // (comma-separated Base64-encoded) representing VPS, SPS, and/or PPS NAL-units + // to prepend to the output + unsigned bufferSize = 100000, + Boolean oneFilePerFrame = False); + // See "FileSink.hh" for a description of these parameters. + +protected: + H265VideoFileSink(UsageEnvironment& env, FILE* fid, + char const* sPropVPSStr, + char const* sPropSPSStr, + char const* sPropPPSStr, + unsigned bufferSize, char const* perFrameFileNamePrefix); + // called only by createNew() + virtual ~H265VideoFileSink(); +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/H265VideoRTPSink.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/H265VideoRTPSink.hh new file mode 100644 index 000000000..5e1a23f2b --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/H265VideoRTPSink.hh @@ -0,0 +1,62 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP sink for H.265 video +// C++ header + +#ifndef _H265_VIDEO_RTP_SINK_HH +#define _H265_VIDEO_RTP_SINK_HH + +#ifndef _H264_OR_5_VIDEO_RTP_SINK_HH +#include "H264or5VideoRTPSink.hh" +#endif + +class H265VideoRTPSink: public H264or5VideoRTPSink { +public: + static H265VideoRTPSink* + createNew(UsageEnvironment& env, Groupsock* RTPgs, unsigned char rtpPayloadFormat); + static H265VideoRTPSink* + createNew(UsageEnvironment& env, Groupsock* RTPgs, unsigned char rtpPayloadFormat, + u_int8_t const* vps, unsigned vpsSize, + u_int8_t const* sps, unsigned spsSize, + u_int8_t const* pps, unsigned ppsSize); + // an optional variant of "createNew()", useful if we know, in advance, + // the stream's VPS, SPS and PPS NAL units. + // This avoids us having to 'pre-read' from the input source in order to get these values. + static H265VideoRTPSink* + createNew(UsageEnvironment& env, Groupsock* RTPgs, unsigned char rtpPayloadFormat, + char const* sPropVPSStr, char const* sPropSPSStr, char const* sPropPPSStr); + // an optional variant of "createNew()", useful if we know, in advance, + // the stream's VPS, SPS and PPS NAL units. + // This avoids us having to 'pre-read' from the input source in order to get these values. + +protected: + H265VideoRTPSink(UsageEnvironment& env, Groupsock* RTPgs, unsigned char rtpPayloadFormat, + u_int8_t const* vps = NULL, unsigned vpsSize = 0, + u_int8_t const* sps = NULL, unsigned spsSize = 0, + u_int8_t const* pps = NULL, unsigned ppsSize = 0); + // called only by createNew() + virtual ~H265VideoRTPSink(); + +protected: // redefined virtual functions: + virtual char const* auxSDPLine(); + +private: // redefined virtual functions: + virtual Boolean sourceIsCompatibleWithUs(MediaSource& source); +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/H265VideoRTPSource.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/H265VideoRTPSource.hh new file mode 100644 index 000000000..25df2a383 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/H265VideoRTPSource.hh @@ -0,0 +1,67 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// H.265 Video RTP Sources +// C++ header + +#ifndef _H265_VIDEO_RTP_SOURCE_HH +#define _H265_VIDEO_RTP_SOURCE_HH + +#ifndef _MULTI_FRAMED_RTP_SOURCE_HH +#include "MultiFramedRTPSource.hh" +#endif + +class H265VideoRTPSource: public MultiFramedRTPSource { +public: + static H265VideoRTPSource* + createNew(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + Boolean expectDONFields = False, + unsigned rtpTimestampFrequency = 90000); + // "expectDONFields" is True iff we expect incoming H.265/RTP packets to contain + // DONL and DOND fields. I.e., if "tx-mode == "MST" or sprop-depack-buf-nalus > 0". + + u_int64_t currentNALUnitAbsDon() const { return fCurrentNALUnitAbsDon; } + // the 'absolute decoding order number (AbsDon)' for the most-recently delivered NAL unit + +protected: + H265VideoRTPSource(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + Boolean expectDONFields, + unsigned rtpTimestampFrequency); + // called only by createNew() + + virtual ~H265VideoRTPSource(); + +protected: + // redefined virtual functions: + virtual Boolean processSpecialHeader(BufferedPacket* packet, + unsigned& resultSpecialHeaderSize); + virtual char const* MIMEtype() const; + +private: + void computeAbsDonFromDON(u_int16_t DON); + +private: + friend class H265BufferedPacket; + Boolean fExpectDONFields; + unsigned char fCurPacketNALUnitType; + u_int16_t fPreviousNALUnitDON; + u_int64_t fCurrentNALUnitAbsDon; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/H265VideoStreamDiscreteFramer.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/H265VideoStreamDiscreteFramer.hh new file mode 100644 index 000000000..a1685beb1 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/H265VideoStreamDiscreteFramer.hh @@ -0,0 +1,48 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A simplified version of "H265VideoStreamFramer" that takes only complete, +// discrete frames (rather than an arbitrary byte stream) as input. +// This avoids the parsing and data copying overhead of the full +// "H265VideoStreamFramer". +// C++ header + +#ifndef _H265_VIDEO_STREAM_DISCRETE_FRAMER_HH +#define _H265_VIDEO_STREAM_DISCRETE_FRAMER_HH + +#ifndef _H264_OR_5_VIDEO_STREAM_DISCRETE_FRAMER_HH +#include "H264or5VideoStreamDiscreteFramer.hh" +#endif + +class H265VideoStreamDiscreteFramer: public H264or5VideoStreamDiscreteFramer { +public: + static H265VideoStreamDiscreteFramer* + createNew(UsageEnvironment& env, FramedSource* inputSource, + Boolean includeStartCodeInOutput = False, Boolean insertAccessUnitDelimiters = False); + +protected: + H265VideoStreamDiscreteFramer(UsageEnvironment& env, FramedSource* inputSource, + Boolean includeStartCodeInOutput, Boolean insertAccessUnitDelimiters); + // called only by createNew() + virtual ~H265VideoStreamDiscreteFramer(); + +private: + // redefined virtual functions: + virtual Boolean isH265VideoStreamFramer() const; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/H265VideoStreamFramer.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/H265VideoStreamFramer.hh new file mode 100644 index 000000000..2a64cd07b --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/H265VideoStreamFramer.hh @@ -0,0 +1,45 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A filter that breaks up a H.265 Video Elementary Stream into NAL units. +// C++ header + +#ifndef _H265_VIDEO_STREAM_FRAMER_HH +#define _H265_VIDEO_STREAM_FRAMER_HH + +#ifndef _H264_OR_5_VIDEO_STREAM_FRAMER_HH +#include "H264or5VideoStreamFramer.hh" +#endif + +class H265VideoStreamFramer: public H264or5VideoStreamFramer { +public: + static H265VideoStreamFramer* createNew(UsageEnvironment& env, FramedSource* inputSource, + Boolean includeStartCodeInOutput = False, + Boolean insertAccessUnitDelimiters = False); + +protected: + H265VideoStreamFramer(UsageEnvironment& env, FramedSource* inputSource, + Boolean createParser, + Boolean includeStartCodeInOutput, Boolean insertAccessUnitDelimiters); + // called only by "createNew()" + virtual ~H265VideoStreamFramer(); + + // redefined virtual functions: + virtual Boolean isH265VideoStreamFramer() const; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/HLSSegmenter.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/HLSSegmenter.hh new file mode 100644 index 000000000..aaa17a640 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/HLSSegmenter.hh @@ -0,0 +1,76 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A media sink that takes - as input - a MPEG Transport Stream, and outputs a series +// of MPEG Transport Stream files, each representing a segment of the input stream, +// suitable for HLS (Apple's "HTTP Live Streaming"). +// C++ header + +#ifndef _HLS_SEGMENTER_HH +#define _HLS_SEGMENTER_HH + +#ifndef _MEDIA_SINK_HH +#include "MediaSink.hh" +#endif + +class HLSSegmenter: public MediaSink { +public: + typedef void (onEndOfSegmentFunc)(void* clientData, + char const* segmentFileName, double segmentDuration); + static HLSSegmenter* createNew(UsageEnvironment& env, + unsigned segmentationDuration, char const* fileNamePrefix, + onEndOfSegmentFunc* onEndOfSegmentFunc = NULL, + void* onEndOfSegmentClientData = NULL); + +private: + HLSSegmenter(UsageEnvironment& env, unsigned segmentationDuration, char const* fileNamePrefix, + onEndOfSegmentFunc* onEndOfSegmentFunc, void* onEndOfSegmentClientData); + // called only by createNew() + virtual ~HLSSegmenter(); + + static void ourEndOfSegmentHandler(void* clientData, double segmentDuration); + void ourEndOfSegmentHandler(double segmentDuration); + + Boolean openNextOutputSegment(); + + static void afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + virtual void afterGettingFrame(unsigned frameSize, + unsigned numTruncatedBytes); + + static void ourOnSourceClosure(void* clientData); + void ourOnSourceClosure(); + +private: // redefined virtual functions: + virtual Boolean sourceIsCompatibleWithUs(MediaSource& source); + virtual Boolean continuePlaying(); + +private: + unsigned fSegmentationDuration; + char const* fFileNamePrefix; + onEndOfSegmentFunc* fOnEndOfSegmentFunc; + void* fOnEndOfSegmentClientData; + Boolean fHaveConfiguredUpstreamSource; + unsigned fCurrentSegmentCounter; + char* fOutputSegmentFileName; + FILE* fOutFid; + unsigned char* fOutputFileBuffer; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/HMAC_SHA1.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/HMAC_SHA1.hh new file mode 100644 index 000000000..6008b7f86 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/HMAC_SHA1.hh @@ -0,0 +1,34 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023, Live Networks, Inc. All rights reserved +// +// A function for computing the HMAC_SHA1 digest +// Definition + +#ifndef _HMAC_SHA1_HH +#define _HMAC_SHA1_HH + +#ifndef NO_OPENSSL +#ifndef _HMAC_HASH_HH +#include "HMAC_hash.hh" +#endif + +#define SHA1_DIGEST_LEN 20 + +HMAC_hash HMAC_SHA1; +#endif +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/HMAC_hash.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/HMAC_hash.hh new file mode 100644 index 000000000..260324962 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/HMAC_hash.hh @@ -0,0 +1,37 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023, Live Networks, Inc. All rights reserved +// +// Generic HMA_HASH functions +// Definition + +#ifndef _HMAC_HASH_HH +#define _HMAC_HASH_HH + +#ifndef _NET_COMMON_H +#include "NetCommon.h" +#endif + +// All HMAC hash functions have the following signature: +typedef void HMAC_hash(u_int8_t const* key, unsigned keyLength, + u_int8_t const* text, unsigned textLength, + u_int8_t* resultDigest); + // "resultDigest" must point to an array of sufficient size to hold the digest + +#define HMAC_BLOCK_SIZE 64 + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/InputFile.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/InputFile.hh new file mode 100644 index 000000000..f79c32364 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/InputFile.hh @@ -0,0 +1,67 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Common routines for opening/closing named input files +// C++ header + +#ifndef _INPUT_FILE_HH +#define _INPUT_FILE_HH + +#include +#include + +#if (defined(__WIN32__) || defined(_WIN32) || defined(_WIN32_WCE)) +#ifndef _WIN32_WCE +// Include header files that might be needed by Windows (in code that uses this header file): +#include +#include +#endif + +#define READ_FROM_FILES_SYNCHRONOUSLY 1 + // Because Windows is a silly toy operating system that doesn't (reliably) treat + // open files as being readable sockets (which can be handled within the default + // "BasicTaskScheduler" event loop, using "select()"), we implement file reading + // in Windows using synchronous, rather than asynchronous, I/O. This can severely + // limit the scalability of servers using this code that run on Windows. + // If this is a problem for you, then either use a better operating system, + // or else write your own Windows-specific event loop ("TaskScheduler" subclass) + // that can handle readable data in Windows open files as an event. +#endif + +#ifndef _WIN32_WCE +#include +#endif + +FILE* OpenInputFile(UsageEnvironment& env, char const* fileName); + +void CloseInputFile(FILE* fid); + +#undef GetFileSize // because some platforms already define this as a macro +u_int64_t GetFileSize(char const* fileName, FILE* fid); + // 0 means zero-length, unbounded, or unknown + +int64_t SeekFile64(FILE *fid, int64_t offset, int whence); + // A platform-independent routine for seeking within (possibly) large files + +int64_t TellFile64(FILE *fid); + // A platform-independent routine for reporting the position within + // (possibly) large files + +Boolean FileIsSeekable(FILE *fid); + // Tests whether "fid" is seekable, by trying to seek within it. + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/JPEG2000VideoRTPSink.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/JPEG2000VideoRTPSink.hh new file mode 100644 index 000000000..4a3fa00e6 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/JPEG2000VideoRTPSink.hh @@ -0,0 +1,46 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. + + +#ifndef _JPEG2000_VIDEO_RTP_SINK_HH +#define _JPEG2000_VIDEO_RTP_SINK_HH + +#ifndef _VIDEO_RTP_SINK_HH +#include "VideoRTPSink.hh" +#endif + +class JPEG2000VideoRTPSink: public VideoRTPSink { +public: + static JPEG2000VideoRTPSink* createNew(UsageEnvironment& env, Groupsock* RTPgs); + +protected: + JPEG2000VideoRTPSink(UsageEnvironment& env, Groupsock* RTPgs); + // called only by createNew() + + virtual ~JPEG2000VideoRTPSink(); + +private: // redefined virtual functions: + virtual void doSpecialFrameHandling(unsigned fragmentationOffset, + unsigned char* frameStart, + unsigned numBytesInFrame, + struct timeval framePresentationTime, + unsigned numRemainingBytes); + virtual unsigned specialHeaderSize() const; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/JPEG2000VideoRTPSource.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/JPEG2000VideoRTPSource.hh new file mode 100644 index 000000000..aed63d67e --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/JPEG2000VideoRTPSource.hh @@ -0,0 +1,53 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. + +#ifndef _JPEG2000_VIDEO_RTP_SOURCE_HH +#define _JPEG2000_VIDEO_RTP_SOURCE_HH + +#ifndef _MULTI_FRAMED_RTP_SOURCE_HH +#include "MultiFramedRTPSource.hh" +#endif + +class JPEG2000VideoRTPSource: public MultiFramedRTPSource { +public: + static JPEG2000VideoRTPSource* createNew(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency, + char const* sampling); + +protected: + virtual ~JPEG2000VideoRTPSource(); + +protected: + JPEG2000VideoRTPSource(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency, + char const* sampling); + // called only by createNew() + +private: + // redefined virtual functions: + virtual Boolean processSpecialHeader(BufferedPacket* packet, + unsigned& resultSpecialHeaderSize); + virtual char const* MIMEtype() const; + +private: + char* fSampling; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/JPEGVideoRTPSink.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/JPEGVideoRTPSink.hh new file mode 100644 index 000000000..f602ba091 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/JPEGVideoRTPSink.hh @@ -0,0 +1,52 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP sink for JPEG video (RFC 2435) +// C++ header + +#ifndef _JPEG_VIDEO_RTP_SINK_HH +#define _JPEG_VIDEO_RTP_SINK_HH + +#ifndef _VIDEO_RTP_SINK_HH +#include "VideoRTPSink.hh" +#endif + +class JPEGVideoRTPSink: public VideoRTPSink { +public: + static JPEGVideoRTPSink* createNew(UsageEnvironment& env, Groupsock* RTPgs); + +protected: + JPEGVideoRTPSink(UsageEnvironment& env, Groupsock* RTPgs); + // called only by createNew() + + virtual ~JPEGVideoRTPSink(); + +private: // redefined virtual functions: + virtual Boolean sourceIsCompatibleWithUs(MediaSource& source); + + virtual void doSpecialFrameHandling(unsigned fragmentationOffset, + unsigned char* frameStart, + unsigned numBytesInFrame, + struct timeval framePresentationTime, + unsigned numRemainingBytes); + virtual + Boolean frameCanAppearAfterPacketStart(unsigned char const* frameStart, + unsigned numBytesInFrame) const; + virtual unsigned specialHeaderSize() const; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/JPEGVideoRTPSource.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/JPEGVideoRTPSource.hh new file mode 100644 index 000000000..1bed8769b --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/JPEGVideoRTPSource.hh @@ -0,0 +1,59 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// JPEG Video (RFC 2435) RTP Sources +// C++ header + +#ifndef _JPEG_VIDEO_RTP_SOURCE_HH +#define _JPEG_VIDEO_RTP_SOURCE_HH + +#ifndef _MULTI_FRAMED_RTP_SOURCE_HH +#include "MultiFramedRTPSource.hh" +#endif + +#define MAX_JPEG_HEADER_SIZE 1024 + +class JPEGVideoRTPSource: public MultiFramedRTPSource { +public: + static JPEGVideoRTPSource* + createNew(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat = 26, + unsigned rtpPayloadFrequency = 90000, + unsigned defaultWidth = 0, unsigned defaultHeight = 0); + +protected: + virtual ~JPEGVideoRTPSource(); + +private: + JPEGVideoRTPSource(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency, + unsigned defaultWidth, unsigned defaultHeight); + // called only by createNew() + + // Image dimensions from the SDP description, if any + unsigned fDefaultWidth, fDefaultHeight; + +private: + // redefined virtual functions: + virtual Boolean processSpecialHeader(BufferedPacket* packet, + unsigned& resultSpecialHeaderSize); + + virtual char const* MIMEtype() const; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/JPEGVideoSource.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/JPEGVideoSource.hh new file mode 100644 index 000000000..5bc70f25e --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/JPEGVideoSource.hh @@ -0,0 +1,55 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// JPEG video sources +// C++ header + +#ifndef _JPEG_VIDEO_SOURCE_HH +#define _JPEG_VIDEO_SOURCE_HH + +#ifndef _FRAMED_SOURCE_HH +#include "FramedSource.hh" +#endif + +class JPEGVideoSource: public FramedSource { +public: + virtual u_int8_t type() = 0; + virtual u_int8_t qFactor() = 0; + virtual u_int8_t width() = 0; // # pixels/8 (or 0 for 2048 pixels) + virtual u_int8_t height() = 0; // # pixels/8 (or 0 for 2048 pixels) + + virtual u_int8_t const* quantizationTables(u_int8_t& precision, + u_int16_t& length); + // If "qFactor()" returns a value >= 128, then this function is called + // to tell us the quantization tables that are being used. + // (The default implementation of this function just returns NULL.) + // "precision" and "length" are as defined in RFC 2435, section 3.1.8. + + virtual u_int16_t restartInterval(); + // If restart intervals are being used (i.e., 64 <= type() <= 127), then this function must be + // redefined - by a subclass - to return a non-zero value. + +protected: + JPEGVideoSource(UsageEnvironment& env); // abstract base class + virtual ~JPEGVideoSource(); + +private: + // redefined virtual functions: + virtual Boolean isJPEGVideoSource() const; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/Locale.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/Locale.hh new file mode 100644 index 000000000..cbc043dc8 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/Locale.hh @@ -0,0 +1,75 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Support for temporarily setting the locale (e.g., to "C" or "POSIX") for (e.g.) parsing or printing +// floating-point numbers in protocol headers, or calling toupper()/tolower() on human-input strings. +// C++ header + +#ifndef _LOCALE_HH +#define _LOCALE_HH + +// If you're on a system that (for whatever reason) doesn't have either the "setlocale()" or the "newlocale()" function, then +// add "-DLOCALE_NOT_USED" to your "config.*" file. + +// If you're on a system that (for whatever reason) has "setlocale()" but not "newlocale()", then +// add "-DNEWLOCALE_NOT_USED" to your "config.*" file. +// (Note that -DLOCALE_NOT_USED implies -DNEWLOCALE_NOT_USED; you do not need both.) +// Also, for Windows systems, we define "NEWLOCALE_NOT_USED" by default, because at least some Windows systems +// (or their development environments) don't have "newlocale()". If, however, your Windows system *does* have "newlocale()", +// then you can override this by defining "NEWLOCALE_USED" before #including this file. + +// Finally, some old development environments need a header file "xlocale.h" to use "newlocale()". +// Should you need this header file, add "-DNEED_XLOCALE_H" to your "config.*" file. + +#ifdef NEWLOCALE_USED +#undef LOCALE_NOT_USED +#undef NEWLOCALE_NOT_USED +#else +#if defined(__WIN32__) || defined(_WIN32) +#define NEWLOCALE_NOT_USED 1 +#endif +#endif + +#ifndef LOCALE_NOT_USED +#include +#ifndef NEWLOCALE_NOT_USED +#ifdef NEED_XLOCALE_H +#include +#endif +#endif +#endif + + +enum LocaleCategory { All, Numeric }; // define and implement more categories later, as needed + +class Locale { +public: + Locale(char const* newLocale, LocaleCategory category = All); + virtual ~Locale(); + +private: +#ifndef LOCALE_NOT_USED +#ifndef NEWLOCALE_NOT_USED + locale_t fLocale, fPrevLocale; +#else + int fCategoryNum; + char* fPrevLocale; +#endif +#endif +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/MIKEY.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/MIKEY.hh new file mode 100644 index 000000000..7f8c3db8a --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/MIKEY.hh @@ -0,0 +1,75 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A data structure that implements a MIKEY message (RFC 3830) +// C++ header + +#ifndef _MIKEY_HH +#define _MIKEY_HH + +#ifndef _NET_COMMON_H +#include "NetCommon.h" +#endif +#ifndef _BOOLEAN_HH +#include "Boolean.hh" +#endif + +class MIKEYState { +public: + MIKEYState(Boolean useEncryption = True); // initialize with default parameters + virtual ~MIKEYState(); + + static MIKEYState* createNew(u_int8_t const* messageToParse, unsigned messageSize); + // (Attempts to) parse a binary MIKEY message, returning a new "MIKEYState" if successful + // (or NULL if unsuccessful). + + u_int8_t* generateMessage(unsigned& messageSize) const; + // Returns a binary message representing the current MIKEY state, of size "messageSize" bytes. + // This array is dynamically allocated by this routine, and must be delete[]d by the caller. + + // Accessors for the encryption/authentication parameters: + Boolean encryptSRTP() const { return fEncryptSRTP; } + Boolean encryptSRTCP() const { return fEncryptSRTCP; } + u_int8_t const* keyData() const { return fKeyData; } + u_int32_t MKI() const { return fMKI; } + Boolean useAuthentication() const { return fUseAuthentication; } + +private: + MIKEYState(u_int8_t const* messageToParse, unsigned messageSize, Boolean& parsedOK); + // called only by "createNew()" + + void addNewPayload(class MIKEYPayload* newPayload); + Boolean parseHDRPayload(u_int8_t const*& ptr, u_int8_t const* endPtr, u_int8_t& nextPayloadType); + Boolean parseNonHDRPayload(u_int8_t const*& ptr, u_int8_t const* endPtr, u_int8_t& nextPayloadType); + +private: + // Encryption/authentication parameters, either set by default + // (if the first (parameterless) constructor is used), or set by parsing an input message + // (if the second constructor is used): + Boolean fEncryptSRTP; + Boolean fEncryptSRTCP; + u_int8_t fKeyData[16+14]; // encryption key + salt + u_int32_t fMKI; // used only if encryption is used. (We assume a MKI length of 4.) + Boolean fUseAuthentication; + + // Our internal binary representation of the MIKEY payloads: + class MIKEYPayload* fHeaderPayload; + class MIKEYPayload* fTailPayload; + unsigned fTotalPayloadByteCount; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/MP3ADU.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/MP3ADU.hh new file mode 100644 index 000000000..59b9a0357 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/MP3ADU.hh @@ -0,0 +1,94 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// 'ADU' MP3 streams (for improved loss-tolerance) +// C++ header + +#ifndef _MP3_ADU_HH +#define _MP3_ADU_HH + +#ifndef _FRAMED_FILTER_HH +#include "FramedFilter.hh" +#endif + +class ADUFromMP3Source: public FramedFilter { +public: + static ADUFromMP3Source* createNew(UsageEnvironment& env, + FramedSource* inputSource, + Boolean includeADUdescriptors = True); + + void resetInput(); + // This is called whenever there's a discontinuity in the input MP3 source + // (e.g., due to seeking within the source). It causes any still-unprocessed + // MP3 frame data within our queue to be discarded, so that it does not + // erroneously get used by backpointers from the new MP3 frames. + + Boolean setScaleFactor(int scale); + +protected: + ADUFromMP3Source(UsageEnvironment& env, + FramedSource* inputSource, + Boolean includeADUdescriptors); + // called only by createNew() + virtual ~ADUFromMP3Source(); + +private: + // Redefined virtual functions: + virtual void doGetNextFrame(); + virtual char const* MIMEtype() const; + +private: + Boolean doGetNextFrame1(); + +private: + Boolean fAreEnqueueingMP3Frame; + class SegmentQueue* fSegments; + Boolean fIncludeADUdescriptors; + unsigned fTotalDataSizeBeforePreviousRead; + int fScale; + unsigned fFrameCounter; +}; + +class MP3FromADUSource: public FramedFilter { +public: + static MP3FromADUSource* createNew(UsageEnvironment& env, + FramedSource* inputSource, + Boolean includeADUdescriptors = True); + +protected: + MP3FromADUSource(UsageEnvironment& env, + FramedSource* inputSource, + Boolean includeADUdescriptors); + // called only by createNew() + virtual ~MP3FromADUSource(); + +private: + // Redefined virtual functions: + virtual void doGetNextFrame(); + virtual char const* MIMEtype() const; + +private: + Boolean needToGetAnADU(); + void insertDummyADUsIfNecessary(); + Boolean generateFrameFromHeadADU(); + +private: + Boolean fAreEnqueueingADU; + class SegmentQueue* fSegments; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/MP3ADURTPSink.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/MP3ADURTPSink.hh new file mode 100644 index 000000000..dcdd6aaf1 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/MP3ADURTPSink.hh @@ -0,0 +1,55 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP sink for 'ADUized' MP3 frames ("mpa-robust") +// C++ header + +#ifndef _MP3_ADU_RTP_SINK_HH +#define _MP3_ADU_RTP_SINK_HH + +#ifndef _AUDIO_RTP_SINK_HH +#include "AudioRTPSink.hh" +#endif + +class MP3ADURTPSink: public AudioRTPSink { +public: + static MP3ADURTPSink* createNew(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char RTPPayloadType); + +protected: + virtual ~MP3ADURTPSink(); + +private: + MP3ADURTPSink(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char RTPPayloadType); + // called only by createNew() + + +private: + // Redefined virtual functions: + virtual void doSpecialFrameHandling(unsigned fragmentationOffset, + unsigned char* frameStart, + unsigned numBytesInFrame, + struct timeval framePresentationTime, + unsigned numRemainingBytes); + virtual unsigned specialHeaderSize() const; + +private: + unsigned fCurADUSize; // used when fragmenting over multiple RTP packets +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/MP3ADURTPSource.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/MP3ADURTPSource.hh new file mode 100644 index 000000000..fdad0b8c7 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/MP3ADURTPSource.hh @@ -0,0 +1,49 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP source for 'ADUized' MP3 frames ("mpa-robust") +// C++ header + +#ifndef _MP3_ADU_SOURCE_HH +#define _MP3_ADU_SOURCE_HH + +#ifndef _MULTI_FRAMED_RTP_SOURCE_HH +#include "MultiFramedRTPSource.hh" +#endif + +class MP3ADURTPSource: public MultiFramedRTPSource { +public: + static MP3ADURTPSource* + createNew(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency = 90000); + +protected: + virtual ~MP3ADURTPSource(); + +private: + MP3ADURTPSource(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency); + // called only by createNew() + +private: + // redefined virtual functions: + virtual char const* MIMEtype() const; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/MP3ADUTranscoder.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/MP3ADUTranscoder.hh new file mode 100644 index 000000000..88f16c99c --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/MP3ADUTranscoder.hh @@ -0,0 +1,64 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Transcoder for ADUized MP3 frames +// C++ header + +#ifndef _MP3_ADU_TRANSCODER_HH +#define _MP3_ADU_TRANSCODER_HH + +#ifndef _FRAMED_FILTER_HH +#include "FramedFilter.hh" +#endif + +class MP3ADUTranscoder: public FramedFilter { +public: + static MP3ADUTranscoder* createNew(UsageEnvironment& env, + unsigned outBitrate /* in kbps */, + FramedSource* inputSource); + + unsigned outBitrate() const { return fOutBitrate; } +protected: + MP3ADUTranscoder(UsageEnvironment& env, + unsigned outBitrate /* in kbps */, + FramedSource* inputSource); + // called only by createNew() + virtual ~MP3ADUTranscoder(); + +private: + // redefined virtual functions: + virtual void doGetNextFrame(); + virtual void getAttributes() const; + +private: + static void afterGettingFrame(void* clientData, + unsigned numBytesRead, unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + void afterGettingFrame1(unsigned numBytesRead, unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + +private: + unsigned fOutBitrate; // in kbps + unsigned fAvailableBytesForBackpointer; + + unsigned char* fOrigADU; + // used to store incoming ADU prior to transcoding +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/MP3ADUinterleaving.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/MP3ADUinterleaving.hh new file mode 100644 index 000000000..9a68feb6d --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/MP3ADUinterleaving.hh @@ -0,0 +1,129 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Interleaving of MP3 ADUs +// C++ header + +#ifndef _MP3_ADU_INTERLEAVING_HH +#define _MP3_ADU_INTERLEAVING_HH + +#ifndef _FRAMED_FILTER_HH +#include "FramedFilter.hh" +#endif + +// A data structure used to represent an interleaving +#define MAX_CYCLE_SIZE 256 +class Interleaving { +public: + Interleaving(unsigned cycleSize, unsigned char const* cycleArray); + virtual ~Interleaving(); + + unsigned cycleSize() const {return fCycleSize;} + unsigned char lookupInverseCycle(unsigned char index) const { + return fInverseCycle[index]; + } + +private: + unsigned fCycleSize; + unsigned char fInverseCycle[MAX_CYCLE_SIZE]; +}; + +// This class is used only as a base for the following two: + +class MP3ADUinterleaverBase: public FramedFilter { +protected: + MP3ADUinterleaverBase(UsageEnvironment& env, + FramedSource* inputSource); + // abstract base class + virtual ~MP3ADUinterleaverBase(); + + static FramedSource* getInputSource(UsageEnvironment& env, + char const* inputSourceName); + static void afterGettingFrame(void* clientData, + unsigned numBytesRead, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + virtual void afterGettingFrame(unsigned numBytesRead, + struct timeval presentationTime, + unsigned durationInMicroseconds) = 0; +}; + +// This class is used to convert an ADU sequence from non-interleaved +// to interleaved form: + +class MP3ADUinterleaver: public MP3ADUinterleaverBase { +public: + static MP3ADUinterleaver* createNew(UsageEnvironment& env, + Interleaving const& interleaving, + FramedSource* inputSource); + +protected: + MP3ADUinterleaver(UsageEnvironment& env, + Interleaving const& interleaving, + FramedSource* inputSource); + // called only by createNew() + virtual ~MP3ADUinterleaver(); + +private: + // redefined virtual functions: + virtual void doGetNextFrame(); + virtual void afterGettingFrame(unsigned numBytesRead, + struct timeval presentationTime, + unsigned durationInMicroseconds); + +private: + void releaseOutgoingFrame(); + +private: + Interleaving const fInterleaving; + class InterleavingFrames* fFrames; + unsigned char fPositionOfNextIncomingFrame; + unsigned fII, fICC; +}; + +// This class is used to convert an ADU sequence from interleaved +// to non-interleaved form: + +class MP3ADUdeinterleaver: public MP3ADUinterleaverBase { +public: + static MP3ADUdeinterleaver* createNew(UsageEnvironment& env, + FramedSource* inputSource); + +protected: + MP3ADUdeinterleaver(UsageEnvironment& env, + FramedSource* inputSource); + // called only by createNew() + virtual ~MP3ADUdeinterleaver(); + +private: + // redefined virtual functions: + virtual void doGetNextFrame(); + virtual void afterGettingFrame(unsigned numBytesRead, + struct timeval presentationTime, + unsigned durationInMicroseconds); + +private: + void releaseOutgoingFrame(); + +private: + class DeinterleavingFrames* fFrames; + unsigned fIIlastSeen, fICClastSeen; +}; + +#endif + diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/MP3AudioFileServerMediaSubsession.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/MP3AudioFileServerMediaSubsession.hh new file mode 100644 index 000000000..5ed5d1135 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/MP3AudioFileServerMediaSubsession.hh @@ -0,0 +1,73 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A 'ServerMediaSubsession' object that creates new, unicast, "RTPSink"s +// on demand, from an MP3 audio file. +// (Actually, any MPEG-1 or MPEG-2 audio file should work.) +// C++ header + +#ifndef _MP3_AUDIO_FILE_SERVER_MEDIA_SUBSESSION_HH +#define _MP3_AUDIO_FILE_SERVER_MEDIA_SUBSESSION_HH + +#ifndef _FILE_SERVER_MEDIA_SUBSESSION_HH +#include "FileServerMediaSubsession.hh" +#endif +#ifndef _MP3_ADU_INTERLEAVING_HH +#include "MP3ADUinterleaving.hh" +#endif +#ifndef _MP3_ADU_HH +#include "MP3ADU.hh" +#endif + +class MP3AudioFileServerMediaSubsession: public FileServerMediaSubsession{ +public: + static MP3AudioFileServerMediaSubsession* + createNew(UsageEnvironment& env, char const* fileName, Boolean reuseFirstSource, + Boolean generateADUs, Interleaving* interleaving); + // Note: "interleaving" is used only if "generateADUs" is True, + // (and a value of NULL means 'no interleaving') + +protected: + MP3AudioFileServerMediaSubsession(UsageEnvironment& env, + char const* fileName, Boolean reuseFirstSource, + Boolean generateADUs, + Interleaving* interleaving); + // called only by createNew(); + virtual ~MP3AudioFileServerMediaSubsession(); + + FramedSource* createNewStreamSourceCommon(FramedSource* baseMP3Source, unsigned mp3NumBytes, unsigned& estBitrate); + void getBaseStreams(FramedSource* frontStream, + FramedSource*& sourceMP3Stream, ADUFromMP3Source*& aduStream/*if any*/); + +protected: // redefined virtual functions + virtual void seekStreamSource(FramedSource* inputSource, double& seekNPT, double streamDuration, u_int64_t& numBytes); + virtual void setStreamSourceScale(FramedSource* inputSource, float scale); + virtual FramedSource* createNewStreamSource(unsigned clientSessionId, + unsigned& estBitrate); + virtual RTPSink* createNewRTPSink(Groupsock* rtpGroupsock, + unsigned char rtpPayloadTypeIfDynamic, + FramedSource* inputSource); + virtual void testScaleFactor(float& scale); + virtual float duration() const; + +protected: + Boolean fGenerateADUs; + Interleaving* fInterleaving; + float fFileDuration; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/MP3FileSource.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/MP3FileSource.hh new file mode 100644 index 000000000..0af803102 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/MP3FileSource.hh @@ -0,0 +1,71 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// MP3 File Sources +// C++ header + +#ifndef _MP3_FILE_SOURCE_HH +#define _MP3_FILE_SOURCE_HH + +#ifndef _FRAMED_FILE_SOURCE_HH +#include "FramedFileSource.hh" +#endif + +class MP3StreamState; // forward + +class MP3FileSource: public FramedFileSource { +public: + static MP3FileSource* createNew(UsageEnvironment& env, char const* fileName); + + float filePlayTime() const; + unsigned fileSize() const; + void setPresentationTimeScale(unsigned scale); + void seekWithinFile(double seekNPT, double streamDuration); + // if "streamDuration" is >0.0, then we limit the stream to that duration, before treating it as EOF + +protected: + MP3FileSource(UsageEnvironment& env, FILE* fid); + // called only by createNew() + + virtual ~MP3FileSource(); + +protected: + void assignStream(FILE* fid, unsigned filesize); + Boolean initializeStream(); + + MP3StreamState* streamState() {return fStreamState;} + +private: + // redefined virtual functions: + virtual void doGetNextFrame(); + virtual char const* MIMEtype() const; + virtual void getAttributes() const; + +private: + static void fileReadableHandler(MP3FileSource* source, int mask); + +private: + MP3StreamState* fStreamState; + Boolean fFidIsSeekable; + Boolean fHaveStartedReading; + unsigned fHaveBeenInitialized; + struct timeval fFirstFramePresentationTime; // set on stream init + Boolean fLimitNumBytesToStream; + unsigned fNumBytesToStream; // used iff "fLimitNumBytesToStream" is True +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/MP3Transcoder.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/MP3Transcoder.hh new file mode 100644 index 000000000..188629b03 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/MP3Transcoder.hh @@ -0,0 +1,44 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// MP3 Transcoder +// C++ header + +#ifndef _MP3_TRANSCODER_HH +#define _MP3_TRANSCODER_HH + +#ifndef _MP3_ADU_HH +#include "MP3ADU.hh" +#endif +#ifndef _MP3_ADU_TRANSCODER_HH +#include "MP3ADUTranscoder.hh" +#endif + +class MP3Transcoder: public MP3FromADUSource { +public: + static MP3Transcoder* createNew(UsageEnvironment& env, + unsigned outBitrate /* in kbps */, + FramedSource* inputSource); + +protected: + MP3Transcoder(UsageEnvironment& env, + MP3ADUTranscoder* aduTranscoder); + // called only by createNew() + virtual ~MP3Transcoder(); +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG1or2AudioRTPSink.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG1or2AudioRTPSink.hh new file mode 100644 index 000000000..f2d77960e --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG1or2AudioRTPSink.hh @@ -0,0 +1,48 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP sink for MPEG audio (RFC 2250) +// C++ header + +#ifndef _MPEG_1OR2_AUDIO_RTP_SINK_HH +#define _MPEG_1OR2_AUDIO_RTP_SINK_HH + +#ifndef _AUDIO_RTP_SINK_HH +#include "AudioRTPSink.hh" +#endif + +class MPEG1or2AudioRTPSink: public AudioRTPSink { +public: + static MPEG1or2AudioRTPSink* createNew(UsageEnvironment& env, + Groupsock* RTPgs); + +protected: + MPEG1or2AudioRTPSink(UsageEnvironment& env, Groupsock* RTPgs); + // called only by createNew() + + virtual ~MPEG1or2AudioRTPSink(); + +private: // redefined virtual functions: + virtual void doSpecialFrameHandling(unsigned fragmentationOffset, + unsigned char* frameStart, + unsigned numBytesInFrame, + struct timeval framePresentationTime, + unsigned numRemainingBytes); + virtual unsigned specialHeaderSize() const; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG1or2AudioRTPSource.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG1or2AudioRTPSource.hh new file mode 100644 index 000000000..a7da51d42 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG1or2AudioRTPSource.hh @@ -0,0 +1,51 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// MPEG-1 or MPEG-2 Audio RTP Sources +// C++ header + +#ifndef _MPEG_1OR2_AUDIO_RTP_SOURCE_HH +#define _MPEG_1OR2_AUDIO_RTP_SOURCE_HH + +#ifndef _MULTI_FRAMED_RTP_SOURCE_HH +#include "MultiFramedRTPSource.hh" +#endif + +class MPEG1or2AudioRTPSource: public MultiFramedRTPSource { +public: + static MPEG1or2AudioRTPSource* + createNew(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat = 14, + unsigned rtpTimestampFrequency = 90000); + +protected: + virtual ~MPEG1or2AudioRTPSource(); + +private: + MPEG1or2AudioRTPSource(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency); + // called only by createNew() + +private: + // redefined virtual functions: + virtual Boolean processSpecialHeader(BufferedPacket* packet, + unsigned& resultSpecialHeaderSize); + virtual char const* MIMEtype() const; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG1or2AudioStreamFramer.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG1or2AudioStreamFramer.hh new file mode 100644 index 000000000..6b06378a3 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG1or2AudioStreamFramer.hh @@ -0,0 +1,70 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A filter that breaks up an MPEG (1,2) audio elementary stream into frames +// C++ header + +#ifndef _MPEG_1OR2_AUDIO_STREAM_FRAMER_HH +#define _MPEG_1OR2_AUDIO_STREAM_FRAMER_HH + +#ifndef _FRAMED_FILTER_HH +#include "FramedFilter.hh" +#endif + +class MPEG1or2AudioStreamFramer: public FramedFilter { +public: + static MPEG1or2AudioStreamFramer* + createNew(UsageEnvironment& env, FramedSource* inputSource, + Boolean syncWithInputSource = False); + // If "syncWithInputSource" is True, the stream's presentation time + // will be reset to that of the input source, whenever new data + // is read from it. + + void flushInput(); // called if there is a discontinuity (seeking) in the input + +private: + MPEG1or2AudioStreamFramer(UsageEnvironment& env, FramedSource* inputSource, + Boolean syncWithInputSource); + // called only by createNew() + virtual ~MPEG1or2AudioStreamFramer(); + + static void continueReadProcessing(void* clientData, + unsigned char* ptr, unsigned size, + struct timeval presentationTime); + void continueReadProcessing(); + + void resetPresentationTime(struct timeval newPresentationTime); + // useful if we're being synced with a separate (e.g., video) stream + +private: + // redefined virtual functions: + virtual void doGetNextFrame(); + +private: + void reset(); + struct timeval currentFramePlayTime() const; + +private: + Boolean fSyncWithInputSource; + struct timeval fNextFramePresentationTime; + +private: // parsing state + class MPEG1or2AudioStreamParser* fParser; + friend class MPEG1or2AudioStreamParser; // hack +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG1or2Demux.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG1or2Demux.hh new file mode 100644 index 000000000..8b1e9f1bc --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG1or2Demux.hh @@ -0,0 +1,158 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Demultiplexer for a MPEG 1 or 2 Program Stream +// C++ header + +#ifndef _MPEG_1OR2_DEMUX_HH +#define _MPEG_1OR2_DEMUX_HH + +#ifndef _FRAMED_SOURCE_HH +#include "FramedSource.hh" +#endif + +class MPEG1or2DemuxedElementaryStream; // forward + +typedef void MPEG1or2DemuxOnDeletionFunc(void* objectToNotify, class MPEG1or2Demux* demuxBeingDeleted); + +class MPEG1or2Demux: public Medium { +public: + static MPEG1or2Demux* createNew(UsageEnvironment& env, + FramedSource* inputSource, + Boolean reclaimWhenLastESDies = False, + MPEG1or2DemuxOnDeletionFunc* onDeletionFunc = NULL, + void* objectToNotify = NULL); + // If "reclaimWhenLastESDies" is True, the the demux is deleted when + // all "MPEG1or2DemuxedElementaryStream"s that we created get deleted. + + MPEG1or2DemuxedElementaryStream* newElementaryStream(u_int8_t streamIdTag); + + // Specialized versions of the above for audio and video: + MPEG1or2DemuxedElementaryStream* newAudioStream(); + MPEG1or2DemuxedElementaryStream* newVideoStream(); + + // A hack for getting raw, undemuxed PES packets from the Program Stream: + MPEG1or2DemuxedElementaryStream* newRawPESStream(); + + void getNextFrame(u_int8_t streamIdTag, + unsigned char* to, unsigned maxSize, + FramedSource::afterGettingFunc* afterGettingFunc, + void* afterGettingClientData, + FramedSource::onCloseFunc* onCloseFunc, + void* onCloseClientData); + // similar to FramedSource::getNextFrame(), except that it also + // takes a stream id tag as parameter. + + void stopGettingFrames(u_int8_t streamIdTag); + // similar to FramedSource::stopGettingFrames(), except that it also + // takes a stream id tag as parameter. + + static void handleClosure(void* clientData); + // This should be called (on ourself) if the source is discovered + // to be closed (i.e., no longer readable) + + FramedSource* inputSource() const { return fInputSource; } + + class SCR { + public: + SCR(); + + u_int8_t highBit; + u_int32_t remainingBits; + u_int16_t extension; + + Boolean isValid; + }; + SCR& lastSeenSCR() { return fLastSeenSCR; } + + unsigned char mpegVersion() const { return fMPEGversion; } + + void flushInput(); // should be called before any 'seek' on the underlying source + +private: + MPEG1or2Demux(UsageEnvironment& env, + FramedSource* inputSource, Boolean reclaimWhenLastESDies, + MPEG1or2DemuxOnDeletionFunc* onDeletionFunc, void* objectToNotify); + // called only by createNew() + virtual ~MPEG1or2Demux(); + + void registerReadInterest(u_int8_t streamIdTag, + unsigned char* to, unsigned maxSize, + FramedSource::afterGettingFunc* afterGettingFunc, + void* afterGettingClientData, + FramedSource::onCloseFunc* onCloseFunc, + void* onCloseClientData); + + Boolean useSavedData(u_int8_t streamIdTag, + unsigned char* to, unsigned maxSize, + FramedSource::afterGettingFunc* afterGettingFunc, + void* afterGettingClientData); + + static void continueReadProcessing(void* clientData, + unsigned char* ptr, unsigned size, + struct timeval presentationTime); + void continueReadProcessing(); + +private: + friend class MPEG1or2DemuxedElementaryStream; + void noteElementaryStreamDeletion(MPEG1or2DemuxedElementaryStream* es); + +private: + FramedSource* fInputSource; + SCR fLastSeenSCR; + unsigned char fMPEGversion; + + unsigned char fNextAudioStreamNumber; + unsigned char fNextVideoStreamNumber; + Boolean fReclaimWhenLastESDies; + unsigned fNumOutstandingESs; + + // A descriptor for each possible stream id tag: + typedef struct OutputDescriptor { + // input parameters + unsigned char* to; unsigned maxSize; + FramedSource::afterGettingFunc* fAfterGettingFunc; + void* afterGettingClientData; + FramedSource::onCloseFunc* fOnCloseFunc; + void* onCloseClientData; + + // output parameters + unsigned frameSize; struct timeval presentationTime; + class SavedData; // forward + SavedData* savedDataHead; + SavedData* savedDataTail; + unsigned savedDataTotalSize; + + // status parameters + Boolean isPotentiallyReadable; + Boolean isCurrentlyActive; + Boolean isCurrentlyAwaitingData; + } OutputDescriptor_t; + OutputDescriptor_t fOutput[256]; + + unsigned fNumPendingReads; + Boolean fHaveUndeliveredData; + + MPEG1or2DemuxOnDeletionFunc* fOnDeletionFunc; + void* fOnDeletionObjectToNotify; + +private: // parsing state + class MPEGProgramStreamParser* fParser; + friend class MPEGProgramStreamParser; // hack +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG1or2DemuxedElementaryStream.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG1or2DemuxedElementaryStream.hh new file mode 100644 index 000000000..e55e999a9 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG1or2DemuxedElementaryStream.hh @@ -0,0 +1,69 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A MPEG 1 or 2 Elementary Stream, demultiplexed from a Program Stream +// C++ header + +#ifndef _MPEG_1OR2_DEMUXED_ELEMENTARY_STREAM_HH +#define _MPEG_1OR2_DEMUXED_ELEMENTARY_STREAM_HH + +#ifndef _MPEG_1OR2_DEMUX_HH +#include "MPEG1or2Demux.hh" +#endif + +class MPEG1or2DemuxedElementaryStream: public FramedSource { +public: + MPEG1or2Demux::SCR lastSeenSCR() const { return fLastSeenSCR; } + + unsigned char mpegVersion() const { return fMPEGversion; } + + MPEG1or2Demux& sourceDemux() const { return fOurSourceDemux; } + +private: // We are created only by a MPEG1or2Demux (a friend) + MPEG1or2DemuxedElementaryStream(UsageEnvironment& env, + u_int8_t streamIdTag, + MPEG1or2Demux& sourceDemux); + virtual ~MPEG1or2DemuxedElementaryStream(); + +private: + // redefined virtual functions: + virtual void doGetNextFrame(); + virtual void doStopGettingFrames(); + virtual char const* MIMEtype() const; + virtual unsigned maxFrameSize() const; + +private: + static void afterGettingFrame(void* clientData, + unsigned frameSize, unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + + void afterGettingFrame1(unsigned frameSize, unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + +private: + u_int8_t fOurStreamIdTag; + MPEG1or2Demux& fOurSourceDemux; + char const* fMIMEtype; + MPEG1or2Demux::SCR fLastSeenSCR; + unsigned char fMPEGversion; + + friend class MPEG1or2Demux; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG1or2DemuxedServerMediaSubsession.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG1or2DemuxedServerMediaSubsession.hh new file mode 100644 index 000000000..cab197cc8 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG1or2DemuxedServerMediaSubsession.hh @@ -0,0 +1,63 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A 'ServerMediaSubsession' object that creates new, unicast, "RTPSink"s +// on demand, from a MPEG-1 or 2 demuxer. +// C++ header + +#ifndef _MPEG_1OR2_DEMUXED_SERVER_MEDIA_SUBSESSION_HH +#define _MPEG_1OR2_DEMUXED_SERVER_MEDIA_SUBSESSION_HH + +#ifndef _ON_DEMAND_SERVER_MEDIA_SUBSESSION_HH +#include "OnDemandServerMediaSubsession.hh" +#endif +#ifndef _MPEG_1OR2_FILE_SERVER_DEMUX_HH +#include "MPEG1or2FileServerDemux.hh" +#endif + +class MPEG1or2DemuxedServerMediaSubsession: public OnDemandServerMediaSubsession{ +public: + static MPEG1or2DemuxedServerMediaSubsession* + createNew(MPEG1or2FileServerDemux& demux, u_int8_t streamIdTag, + Boolean reuseFirstSource, + Boolean iFramesOnly = False, double vshPeriod = 5.0); + // The last two parameters are relevant for video streams only + +private: + MPEG1or2DemuxedServerMediaSubsession(MPEG1or2FileServerDemux& demux, + u_int8_t streamIdTag, Boolean reuseFirstSource, + Boolean iFramesOnly, double vshPeriod); + // called only by createNew(); + virtual ~MPEG1or2DemuxedServerMediaSubsession(); + +private: // redefined virtual functions + virtual void seekStreamSource(FramedSource* inputSource, double& seekNPT, double streamDuration, u_int64_t& numBytes); + virtual FramedSource* createNewStreamSource(unsigned clientSessionId, + unsigned& estBitrate); + virtual RTPSink* createNewRTPSink(Groupsock* rtpGroupsock, + unsigned char rtpPayloadTypeIfDynamic, + FramedSource* inputSource); + virtual float duration() const; + +private: + MPEG1or2FileServerDemux& fOurDemux; + u_int8_t fStreamIdTag; + Boolean fIFramesOnly; // for video streams + double fVSHPeriod; // for video streams +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG1or2FileServerDemux.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG1or2FileServerDemux.hh new file mode 100644 index 000000000..331b4cfae --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG1or2FileServerDemux.hh @@ -0,0 +1,70 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A server demultiplexer for a MPEG 1 or 2 Program Stream +// C++ header + +#ifndef _MPEG_1OR2_FILE_SERVER_DEMUX_HH +#define _MPEG_1OR2_FILE_SERVER_DEMUX_HH + +#ifndef _SERVER_MEDIA_SESSION_HH +#include "ServerMediaSession.hh" +#endif +#ifndef _MPEG_1OR2_DEMUXED_ELEMENTARY_STREAM_HH +#include "MPEG1or2DemuxedElementaryStream.hh" +#endif + +class MPEG1or2FileServerDemux: public Medium { +public: + static MPEG1or2FileServerDemux* + createNew(UsageEnvironment& env, char const* fileName, Boolean reuseFirstSource); + + ServerMediaSubsession* newAudioServerMediaSubsession(); // MPEG-1 or 2 audio + ServerMediaSubsession* newVideoServerMediaSubsession(Boolean iFramesOnly = False, + double vshPeriod = 5.0 + /* how often (in seconds) to inject a Video_Sequence_Header, + if one doesn't already appear in the stream */); + ServerMediaSubsession* newAC3AudioServerMediaSubsession(); // AC-3 audio (from VOB) + + unsigned fileSize() const { return fFileSize; } + float fileDuration() const { return fFileDuration; } + +private: + MPEG1or2FileServerDemux(UsageEnvironment& env, char const* fileName, + Boolean reuseFirstSource); + // called only by createNew(); + virtual ~MPEG1or2FileServerDemux(); + +private: + friend class MPEG1or2DemuxedServerMediaSubsession; + MPEG1or2DemuxedElementaryStream* newElementaryStream(unsigned clientSessionId, + u_int8_t streamIdTag); + + static void onDemuxDeletion(void* clientData, MPEG1or2Demux* demuxBeingDeleted); + void onDemuxDeletion(MPEG1or2Demux* demuxBeingDeleted); + +private: + char const* fFileName; + unsigned fFileSize; + float fFileDuration; + Boolean fReuseFirstSource; + MPEG1or2Demux* fSession0Demux; + MPEG1or2Demux* fLastCreatedDemux; + unsigned fLastClientSessionId; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG1or2VideoFileServerMediaSubsession.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG1or2VideoFileServerMediaSubsession.hh new file mode 100644 index 000000000..33d86595b --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG1or2VideoFileServerMediaSubsession.hh @@ -0,0 +1,59 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A 'ServerMediaSubsession' object that creates new, unicast, "RTPSink"s +// on demand, from a MPEG-1 or 2 Elementary Stream video file. +// C++ header + +#ifndef _MPEG_1OR2_VIDEO_FILE_SERVER_MEDIA_SUBSESSION_HH +#define _MPEG_1OR2_VIDEO_FILE_SERVER_MEDIA_SUBSESSION_HH + +#ifndef _FILE_SERVER_MEDIA_SUBSESSION_HH +#include "FileServerMediaSubsession.hh" +#endif + +class MPEG1or2VideoFileServerMediaSubsession: public FileServerMediaSubsession{ +public: + static MPEG1or2VideoFileServerMediaSubsession* + createNew(UsageEnvironment& env, char const* fileName, Boolean reuseFirstSource, + Boolean iFramesOnly = False, + double vshPeriod = 5.0 + /* how often (in seconds) to inject a Video_Sequence_Header, + if one doesn't already appear in the stream */); + +private: + MPEG1or2VideoFileServerMediaSubsession(UsageEnvironment& env, + char const* fileName, + Boolean reuseFirstSource, + Boolean iFramesOnly, + double vshPeriod); + // called only by createNew(); + virtual ~MPEG1or2VideoFileServerMediaSubsession(); + +private: // redefined virtual functions + virtual FramedSource* createNewStreamSource(unsigned clientSessionId, + unsigned& estBitrate); + virtual RTPSink* createNewRTPSink(Groupsock* rtpGroupsock, + unsigned char rtpPayloadTypeIfDynamic, + FramedSource* inputSource); + +private: + Boolean fIFramesOnly; + double fVSHPeriod; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG1or2VideoRTPSink.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG1or2VideoRTPSink.hh new file mode 100644 index 000000000..be025901d --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG1or2VideoRTPSink.hh @@ -0,0 +1,69 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP sink for MPEG video (RFC 2250) +// C++ header + +#ifndef _MPEG_1OR2_VIDEO_RTP_SINK_HH +#define _MPEG_1OR2_VIDEO_RTP_SINK_HH + +#ifndef _VIDEO_RTP_SINK_HH +#include "VideoRTPSink.hh" +#endif + +class MPEG1or2VideoRTPSink: public VideoRTPSink { +public: + static MPEG1or2VideoRTPSink* createNew(UsageEnvironment& env, Groupsock* RTPgs); + +protected: + MPEG1or2VideoRTPSink(UsageEnvironment& env, Groupsock* RTPgs); + // called only by createNew() + + virtual ~MPEG1or2VideoRTPSink(); + +private: // redefined virtual functions: + virtual Boolean sourceIsCompatibleWithUs(MediaSource& source); + + virtual void doSpecialFrameHandling(unsigned fragmentationOffset, + unsigned char* frameStart, + unsigned numBytesInFrame, + struct timeval framePresentationTime, + unsigned numRemainingBytes); + virtual Boolean allowFragmentationAfterStart() const; + virtual + Boolean frameCanAppearAfterPacketStart(unsigned char const* frameStart, + unsigned numBytesInFrame) const; + virtual unsigned specialHeaderSize() const; + +private: + // MPEG video-specific state, used to decide how to fill out the + // video-specific header, and when to include multiple 'frames' in a + // single outgoing RTP packet. Eventually we should somehow get this + // state from the source (MPEG1or2VideoStreamFramer) instead, as the source + // already has this info itself. + struct { + unsigned temporal_reference; + unsigned char picture_coding_type; + unsigned char vector_code_bits; // FBV,BFC,FFV,FFC from RFC 2250, sec. 3.4 + } fPictureState; + Boolean fPreviousFrameWasSlice; + // used to implement frameCanAppearAfterPacketStart() + Boolean fSequenceHeaderPresent; + Boolean fPacketBeginsSlice, fPacketEndsSlice; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG1or2VideoRTPSource.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG1or2VideoRTPSource.hh new file mode 100644 index 000000000..ee6f9103d --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG1or2VideoRTPSource.hh @@ -0,0 +1,53 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// MPEG-1 or MPEG-2 Video RTP Sources +// C++ header + +#ifndef _MPEG_1OR2_VIDEO_RTP_SOURCE_HH +#define _MPEG_1OR2_VIDEO_RTP_SOURCE_HH + +#ifndef _MULTI_FRAMED_RTP_SOURCE_HH +#include "MultiFramedRTPSource.hh" +#endif + +class MPEG1or2VideoRTPSource: public MultiFramedRTPSource { +public: + static MPEG1or2VideoRTPSource* + createNew(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat = 32, + unsigned rtpPayloadFrequency = 90000); + +protected: + virtual ~MPEG1or2VideoRTPSource(); + +private: + MPEG1or2VideoRTPSource(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency); + // called only by createNew() + +private: + // redefined virtual functions: + virtual Boolean processSpecialHeader(BufferedPacket* packet, + unsigned& resultSpecialHeaderSize); + virtual Boolean packetIsUsableInJitterCalculation(unsigned char* packet, + unsigned packetSize); + virtual char const* MIMEtype() const; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG1or2VideoStreamDiscreteFramer.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG1or2VideoStreamDiscreteFramer.hh new file mode 100644 index 000000000..6a76fc39c --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG1or2VideoStreamDiscreteFramer.hh @@ -0,0 +1,76 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A simplified version of "MPEG1or2VideoStreamFramer" that takes only +// complete, discrete frames (rather than an arbitrary byte stream) as input. +// This avoids the parsing and data copying overhead of the full +// "MPEG1or2VideoStreamFramer". +// C++ header + +#ifndef _MPEG1or2_VIDEO_STREAM_DISCRETE_FRAMER_HH +#define _MPEG1or2_VIDEO_STREAM_DISCRETE_FRAMER_HH + +#ifndef _MPEG1or2_VIDEO_STREAM_FRAMER_HH +#include "MPEG1or2VideoStreamFramer.hh" +#endif + +#define VSH_MAX_SIZE 1000 + +class MPEG1or2VideoStreamDiscreteFramer: public MPEG1or2VideoStreamFramer { +public: + static MPEG1or2VideoStreamDiscreteFramer* + createNew(UsageEnvironment& env, FramedSource* inputSource, + Boolean iFramesOnly = False, // see MPEG1or2VideoStreamFramer.hh + double vshPeriod = 5.0, // see MPEG1or2VideoStreamFramer.hh + Boolean leavePresentationTimesUnmodified = False); + +protected: + MPEG1or2VideoStreamDiscreteFramer(UsageEnvironment& env, + FramedSource* inputSource, + Boolean iFramesOnly, double vshPeriod, Boolean leavePresentationTimesUnmodified); + // called only by createNew() + virtual ~MPEG1or2VideoStreamDiscreteFramer(); + +protected: + // redefined virtual functions: + virtual void doGetNextFrame(); + +protected: + static void afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + void afterGettingFrame1(unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + +protected: + Boolean fLeavePresentationTimesUnmodified; + struct timeval fLastNonBFramePresentationTime; + unsigned fLastNonBFrameTemporal_reference; + + // A saved copy of the most recently seen 'video_sequence_header', + // in case we need to insert it into the stream periodically: + unsigned char fSavedVSHBuffer[VSH_MAX_SIZE]; + unsigned fSavedVSHSize; + double fSavedVSHTimestamp; + Boolean fIFramesOnly; + double fVSHPeriod; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG1or2VideoStreamFramer.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG1or2VideoStreamFramer.hh new file mode 100644 index 000000000..4c13ecf63 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG1or2VideoStreamFramer.hh @@ -0,0 +1,56 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A filter that breaks up an MPEG 1 or 2 video elementary stream into +// frames for: Video_Sequence_Header, GOP_Header, Picture_Header +// C++ header + +#ifndef _MPEG_1OR2_VIDEO_STREAM_FRAMER_HH +#define _MPEG_1OR2_VIDEO_STREAM_FRAMER_HH + +#ifndef _MPEG_VIDEO_STREAM_FRAMER_HH +#include "MPEGVideoStreamFramer.hh" +#endif + +class MPEG1or2VideoStreamFramer: public MPEGVideoStreamFramer { +public: + static MPEG1or2VideoStreamFramer* + createNew(UsageEnvironment& env, FramedSource* inputSource, + Boolean iFramesOnly = False, + double vshPeriod = 5.0 + /* how often (in seconds) to inject a Video_Sequence_Header, + if one doesn't already appear in the stream */); + +protected: + MPEG1or2VideoStreamFramer(UsageEnvironment& env, + FramedSource* inputSource, + Boolean iFramesOnly, double vshPeriod, + Boolean createParser = True); + // called only by createNew(), or by subclass constructors + virtual ~MPEG1or2VideoStreamFramer(); + +private: + // redefined virtual functions: + virtual Boolean isMPEG1or2VideoStreamFramer() const; + +private: + double getCurrentPTS() const; + + friend class MPEG1or2VideoStreamParser; // hack +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG2IndexFromTransportStream.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG2IndexFromTransportStream.hh new file mode 100644 index 000000000..9f72d318c --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG2IndexFromTransportStream.hh @@ -0,0 +1,95 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A filter that produces a sequence of I-frame indices from a MPEG-2 Transport Stream +// C++ header + +#ifndef _MPEG2_IFRAME_INDEX_FROM_TRANSPORT_STREAM_HH +#define _MPEG2_IFRAME_INDEX_FROM_TRANSPORT_STREAM_HH + +#ifndef _FRAMED_FILTER_HH +#include "FramedFilter.hh" +#endif + +#ifndef TRANSPORT_PACKET_SIZE +#define TRANSPORT_PACKET_SIZE 188 +#endif + +#ifndef MAX_PES_PACKET_SIZE +#define MAX_PES_PACKET_SIZE 65536 +#endif + +class IndexRecord; // forward + +class MPEG2IFrameIndexFromTransportStream: public FramedFilter { +public: + static MPEG2IFrameIndexFromTransportStream* + createNew(UsageEnvironment& env, FramedSource* inputSource); + +protected: + MPEG2IFrameIndexFromTransportStream(UsageEnvironment& env, + FramedSource* inputSource); + // called only by createNew() + virtual ~MPEG2IFrameIndexFromTransportStream(); + +private: + // Redefined virtual functions: + virtual void doGetNextFrame(); + +private: + static void afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + void afterGettingFrame1(unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + + static void handleInputClosure(void* clientData); + void handleInputClosure1(); + + void analyzePAT(unsigned char* pkt, unsigned size); + void analyzePMT(unsigned char* pkt, unsigned size); + + Boolean deliverIndexRecord(); + Boolean parseFrame(); + Boolean parseToNextCode(unsigned char& nextCode); + void compactParseBuffer(); + void addToTail(IndexRecord* newIndexRecord); + +private: + Boolean fIsH264; // True iff the video is H.264 (encapsulated in a Transport Stream) + Boolean fIsH265; // True iff the video is H.265 (encapsulated in a Transport Stream) + unsigned long fInputTransportPacketCounter; + unsigned fClosureNumber; + u_int8_t fLastContinuityCounter; + float fFirstPCR, fLastPCR; + Boolean fHaveSeenFirstPCR; + u_int16_t fPMT_PID, fVideo_PID; + // Note: We assume: 1 program per Transport Stream; 1 video stream per program + unsigned char fInputBuffer[TRANSPORT_PACKET_SIZE]; + unsigned char* fParseBuffer; + unsigned fParseBufferSize; + unsigned fParseBufferFrameStart; + unsigned fParseBufferParseEnd; + unsigned fParseBufferDataEnd; + IndexRecord* fHeadIndexRecord; + IndexRecord* fTailIndexRecord; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG2TransportFileServerMediaSubsession.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG2TransportFileServerMediaSubsession.hh new file mode 100644 index 000000000..376248cea --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG2TransportFileServerMediaSubsession.hh @@ -0,0 +1,131 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A 'ServerMediaSubsession' object that creates new, unicast, "RTPSink"s +// on demand, from a MPEG-2 Transport Stream file. +// C++ header + +#ifndef _MPEG2_TRANSPORT_FILE_SERVER_MEDIA_SUBSESSION_HH +#define _MPEG2_TRANSPORT_FILE_SERVER_MEDIA_SUBSESSION_HH + +#ifndef _FILE_SERVER_MEDIA_SUBSESSION_HH +#include "FileServerMediaSubsession.hh" +#endif +#ifndef _MPEG2_TRANSPORT_STREAM_FRAMER_HH +#include "MPEG2TransportStreamFramer.hh" +#endif +#ifndef _BYTE_STREAM_FILE_SOURCE_HH +#include "ByteStreamFileSource.hh" +#endif +#ifndef _MPEG2_TRANSPORT_STREAM_TRICK_MODE_FILTER_HH +#include "MPEG2TransportStreamTrickModeFilter.hh" +#endif +#ifndef _MPEG2_TRANSPORT_STREAM_FROM_ES_SOURCE_HH +#include "MPEG2TransportStreamFromESSource.hh" +#endif + +class ClientTrickPlayState; // forward + +class MPEG2TransportFileServerMediaSubsession: public FileServerMediaSubsession { +public: + static MPEG2TransportFileServerMediaSubsession* + createNew(UsageEnvironment& env, + char const* dataFileName, char const* indexFileName, + Boolean reuseFirstSource); + +protected: + MPEG2TransportFileServerMediaSubsession(UsageEnvironment& env, + char const* fileName, + MPEG2TransportStreamIndexFile* indexFile, + Boolean reuseFirstSource); + // called only by createNew(); + virtual ~MPEG2TransportFileServerMediaSubsession(); + + virtual ClientTrickPlayState* newClientTrickPlayState(); + +private: // redefined virtual functions + // Note that because - to implement 'trick play' operations - we're operating on + // more than just the input source, we reimplement some functions that are + // already implemented in "OnDemandServerMediaSubsession", rather than + // reimplementing "seekStreamSource()" and "setStreamSourceScale()": + virtual void startStream(unsigned clientSessionId, void* streamToken, + TaskFunc* rtcpRRHandler, + void* rtcpRRHandlerClientData, + unsigned short& rtpSeqNum, + unsigned& rtpTimestamp, + ServerRequestAlternativeByteHandler* serverRequestAlternativeByteHandler, + void* serverRequestAlternativeByteHandlerClientData); + virtual void pauseStream(unsigned clientSessionId, void* streamToken); + virtual void seekStream(unsigned clientSessionId, void* streamToken, double& seekNPT, double streamDuration, u_int64_t& numBytes); + virtual void setStreamScale(unsigned clientSessionId, void* streamToken, float scale); + virtual void deleteStream(unsigned clientSessionId, void*& streamToken); + + // The virtual functions that are usually implemented by "ServerMediaSubsession"s: + virtual FramedSource* createNewStreamSource(unsigned clientSessionId, + unsigned& estBitrate); + virtual RTPSink* createNewRTPSink(Groupsock* rtpGroupsock, + unsigned char rtpPayloadTypeIfDynamic, + FramedSource* inputSource); + + virtual void testScaleFactor(float& scale); + virtual float duration() const; + +private: + ClientTrickPlayState* lookupClient(unsigned clientSessionId); + +private: + MPEG2TransportStreamIndexFile* fIndexFile; + float fDuration; + HashTable* fClientSessionHashTable; // indexed by client session id +}; + + +// This class encapsulates the 'trick play' state for each current client (for +// a given "MPEG2TransportFileServerMediaSubsession" - i.e., Transport Stream file). +// It is used only within the implementation of "MPEG2TransportFileServerMediaSubsession", but is included here, +// in case subclasses of "MPEG2TransportFileServerMediaSubsession" want to use it. + +class ClientTrickPlayState { +public: + ClientTrickPlayState(MPEG2TransportStreamIndexFile* indexFile); + + // Functions to bring "fNPT", "fTSRecordNum" and "fIxRecordNum" in sync: + unsigned long updateStateFromNPT(double npt, double seekDuration); + void updateStateOnScaleChange(); + void updateStateOnPlayChange(Boolean reverseToPreviousVSH); + + void handleStreamDeletion(); + void setSource(MPEG2TransportStreamFramer* framer); + + void setNextScale(float nextScale) { fNextScale = nextScale; } + Boolean areChangingScale() const { return fNextScale != fScale; } + +protected: + void updateTSRecordNum(); + void reseekOriginalTransportStreamSource(); + +protected: + MPEG2TransportStreamIndexFile* fIndexFile; + ByteStreamFileSource* fOriginalTransportStreamSource; + MPEG2TransportStreamTrickModeFilter* fTrickModeFilter; + MPEG2TransportStreamFromESSource* fTrickPlaySource; + MPEG2TransportStreamFramer* fFramer; + float fScale, fNextScale, fNPT; + unsigned long fTSRecordNum, fIxRecordNum; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG2TransportStreamAccumulator.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG2TransportStreamAccumulator.hh new file mode 100644 index 000000000..692161f5a --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG2TransportStreamAccumulator.hh @@ -0,0 +1,60 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Collects a stream of incoming MPEG Transport Stream packets into +// a chunk sufficiently large to send in a single outgoing (RTP or UDP) packet. +// C++ header + +#ifndef _MPEG2_TRANSPORT_STREAM_ACCUMULATOR_HH +#define _MPEG2_TRANSPORT_STREAM_ACCUMULATOR_HH + +#ifndef _FRAMED_FILTER_HH +#include "FramedFilter.hh" +#endif + +class MPEG2TransportStreamAccumulator: public FramedFilter { +public: + static MPEG2TransportStreamAccumulator* createNew(UsageEnvironment& env, + FramedSource* inputSource, + unsigned maxPacketSize = 1456); + +protected: + MPEG2TransportStreamAccumulator(UsageEnvironment& env, + FramedSource* inputSource, unsigned maxPacketSize); + // called only by createNew() + virtual ~MPEG2TransportStreamAccumulator(); + +private: + // redefined virtual functions: + virtual void doGetNextFrame(); + +private: + static void afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + void afterGettingFrame1(unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + +private: + unsigned const fDesiredPacketSize; + unsigned fNumBytesGathered; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG2TransportStreamDemux.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG2TransportStreamDemux.hh new file mode 100644 index 000000000..dcc03104f --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG2TransportStreamDemux.hh @@ -0,0 +1,50 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Demultiplexer for a MPEG Transport Stream +// C++ header + +#ifndef _MPEG2_TRANSPORT_STREAM_DEMUX_HH +#define _MPEG2_TRANSPORT_STREAM_DEMUX_HH + +#ifndef _FRAMED_SOURCE_HH +#include "FramedSource.hh" +#endif + +class MPEG2TransportStreamDemux: public Medium { +public: + static MPEG2TransportStreamDemux* createNew(UsageEnvironment& env, + FramedSource* inputSource, + FramedSource::onCloseFunc* onCloseFunc, + void* onCloseClientData); + +private: + MPEG2TransportStreamDemux(UsageEnvironment& env, FramedSource* inputSource, + FramedSource::onCloseFunc* onCloseFunc, void* onCloseClientData); + // called only by createNew() + virtual ~MPEG2TransportStreamDemux(); + + static void handleEndOfFile(void* clientData); + void handleEndOfFile(); + +private: + class MPEG2TransportStreamParser* fParser; + FramedSource::onCloseFunc* fOnCloseFunc; + void* fOnCloseClientData; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG2TransportStreamFramer.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG2TransportStreamFramer.hh new file mode 100644 index 000000000..eec3d05a1 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG2TransportStreamFramer.hh @@ -0,0 +1,78 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A filter that passes through (unchanged) chunks that contain an integral number +// of MPEG-2 Transport Stream packets, but returning (in "fDurationInMicroseconds") +// an updated estimate of the time gap between chunks. +// C++ header + +#ifndef _MPEG2_TRANSPORT_STREAM_FRAMER_HH +#define _MPEG2_TRANSPORT_STREAM_FRAMER_HH + +#ifndef _FRAMED_FILTER_HH +#include "FramedFilter.hh" +#endif + +#ifndef _HASH_TABLE_HH +#include "HashTable.hh" +#endif + +class MPEG2TransportStreamFramer: public FramedFilter { +public: + static MPEG2TransportStreamFramer* + createNew(UsageEnvironment& env, FramedSource* inputSource); + + u_int64_t tsPacketCount() const { return fTSPacketCount; } + + void changeInputSource(FramedSource* newInputSource) { fInputSource = newInputSource; } + + void clearPIDStatusTable(); + void setNumTSPacketsToStream(unsigned long numTSRecordsToStream); + void setPCRLimit(float pcrLimit); + +protected: + MPEG2TransportStreamFramer(UsageEnvironment& env, FramedSource* inputSource); + // called only by createNew() + virtual ~MPEG2TransportStreamFramer(); + +private: + // Redefined virtual functions: + virtual void doGetNextFrame(); + virtual void doStopGettingFrames(); + +private: + static void afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + void afterGettingFrame1(unsigned frameSize, + struct timeval presentationTime); + + Boolean updateTSPacketDurationEstimate(unsigned char* pkt, double timeNow); + +private: + u_int64_t fTSPacketCount; + double fTSPacketDurationEstimate; + HashTable* fPIDStatusTable; + u_int64_t fTSPCRCount; + Boolean fLimitNumTSPacketsToStream; + unsigned long fNumTSPacketsToStream; // used iff "fLimitNumTSPacketsToStream" is True + Boolean fLimitTSPacketsToStreamByPCR; + float fPCRLimit; // used iff "fLimitTSPacketsToStreamByPCR" is True +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG2TransportStreamFromESSource.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG2TransportStreamFromESSource.hh new file mode 100644 index 000000000..71322b3ae --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG2TransportStreamFromESSource.hh @@ -0,0 +1,66 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A filter for converting one or more MPEG Elementary Streams +// to a MPEG-2 Transport Stream +// C++ header + +#ifndef _MPEG2_TRANSPORT_STREAM_FROM_ES_SOURCE_HH +#define _MPEG2_TRANSPORT_STREAM_FROM_ES_SOURCE_HH + +#ifndef _MPEG2_TRANSPORT_STREAM_MULTIPLEXOR_HH +#include "MPEG2TransportStreamMultiplexor.hh" +#endif + +class MPEG2TransportStreamFromESSource: public MPEG2TransportStreamMultiplexor { +public: + static MPEG2TransportStreamFromESSource* createNew(UsageEnvironment& env); + + void addNewVideoSource(FramedSource* inputSource, int mpegVersion, int16_t PID = -1); + // Note: For MPEG-4 video, set "mpegVersion" to 4; for H.264 video, set "mpegVersion" to 5; + // for H.265 video, set "mpegVersion" to 6 + void addNewAudioSource(FramedSource* inputSource, int mpegVersion, int16_t PID = -1); + // Note: For Opus audio, set "mpegVersion" to 3 + + // Note: In these functions, if "PID" is not -1, then it (currently, just the low 8 bits) + // is used as the stream's PID. Otherwise (if "PID" is -1) the 'stream_id' is used as + // the PID. + + static unsigned maxInputESFrameSize; + +protected: + MPEG2TransportStreamFromESSource(UsageEnvironment& env); + // called only by createNew() + virtual ~MPEG2TransportStreamFromESSource(); + + void addNewInputSource(FramedSource* inputSource, + u_int8_t streamId, int mpegVersion, int16_t PID = -1); + // used to implement addNew*Source() above + +private: + // Redefined virtual functions: + virtual void doStopGettingFrames(); + virtual void awaitNewBuffer(unsigned char* oldBuffer); + +private: + friend class InputESSourceRecord; + class InputESSourceRecord* fInputSources; + unsigned fVideoSourceCounter, fAudioSourceCounter; + Boolean fAwaitingBackgroundDelivery; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG2TransportStreamFromPESSource.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG2TransportStreamFromPESSource.hh new file mode 100644 index 000000000..9b7231755 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG2TransportStreamFromPESSource.hh @@ -0,0 +1,62 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A filter for converting a stream of MPEG PES packets to a MPEG-2 Transport Stream +// C++ header + +#ifndef _MPEG2_TRANSPORT_STREAM_FROM_PES_SOURCE_HH +#define _MPEG2_TRANSPORT_STREAM_FROM_PES_SOURCE_HH + +#ifndef _MPEG2_TRANSPORT_STREAM_MULTIPLEXOR_HH +#include "MPEG2TransportStreamMultiplexor.hh" +#endif +#ifndef _MPEG_1OR2_DEMUXED_ELEMENTARY_STREAM_HH +#include "MPEG1or2DemuxedElementaryStream.hh" +#endif + +class MPEG2TransportStreamFromPESSource: public MPEG2TransportStreamMultiplexor { +public: + static MPEG2TransportStreamFromPESSource* + createNew(UsageEnvironment& env, MPEG1or2DemuxedElementaryStream* inputSource); + +protected: + MPEG2TransportStreamFromPESSource(UsageEnvironment& env, + MPEG1or2DemuxedElementaryStream* inputSource); + // called only by createNew() + virtual ~MPEG2TransportStreamFromPESSource(); + +private: + // Redefined virtual functions: + virtual void doStopGettingFrames(); + virtual void awaitNewBuffer(unsigned char* oldBuffer); + +private: + static void afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + void afterGettingFrame1(unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + +private: + MPEG1or2DemuxedElementaryStream* fInputSource; + unsigned char* fInputBuffer; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG2TransportStreamIndexFile.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG2TransportStreamIndexFile.hh new file mode 100644 index 000000000..8676d8034 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG2TransportStreamIndexFile.hh @@ -0,0 +1,96 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A class that encapsulates MPEG-2 Transport Stream 'index files'/ +// These index files are used to implement 'trick play' operations +// (seek-by-time, fast forward, reverse play) on Transport Stream files. +// +// C++ header + +#ifndef _MPEG2_TRANSPORT_STREAM_INDEX_FILE_HH +#define _MPEG2_TRANSPORT_STREAM_INDEX_FILE_HH + +#ifndef _MEDIA_HH +#include "Media.hh" +#endif + +#define INDEX_RECORD_SIZE 11 + +class MPEG2TransportStreamIndexFile: public Medium { +public: + static MPEG2TransportStreamIndexFile* createNew(UsageEnvironment& env, + char const* indexFileName); + + virtual ~MPEG2TransportStreamIndexFile(); + + // Functions that map between a playing time and a Transport packet number + // in the original Transport Stream file: + + void lookupTSPacketNumFromNPT(float& npt, unsigned long& tsPacketNumber, + unsigned long& indexRecordNumber); + // Looks up the Transport Stream Packet number corresponding to "npt". + // (This may modify "npt" to a more exact value.) + // (We also return the index record number that we looked up.) + + void lookupPCRFromTSPacketNum(unsigned long& tsPacketNumber, Boolean reverseToPreviousCleanPoint, + float& pcr, unsigned long& indexRecordNumber); + // Looks up the PCR timestamp for the transport packet "tsPacketNumber". + // (Adjust "tsPacketNumber" only if "reverseToPreviousCleanPoint" is True.) + // (We also return the index record number that we looked up.) + + // Miscellaneous functions used to implement 'trick play': + Boolean readIndexRecordValues(unsigned long indexRecordNum, + unsigned long& transportPacketNum, u_int8_t& offset, + u_int8_t& size, float& pcr, u_int8_t& recordType); + float getPlayingDuration(); + void stopReading() { closeFid(); } + + int mpegVersion(); + // returns the best guess for the version of MPEG being used for data within the underlying Transport Stream file. + // (1,2,4, or 5 (representing H.264). 0 means 'don't know' (usually because the index file is empty)) + +private: + MPEG2TransportStreamIndexFile(UsageEnvironment& env, char const* indexFileName); + + Boolean openFid(); + Boolean seekToIndexRecord(unsigned long indexRecordNumber); + Boolean readIndexRecord(unsigned long indexRecordNum); // into "fBuf" + Boolean readOneIndexRecord(unsigned long indexRecordNum); // closes "fFid" at end + void closeFid(); + + u_int8_t recordTypeFromBuf() { return fBuf[0]; } + u_int8_t offsetFromBuf() { return fBuf[1]; } + u_int8_t sizeFromBuf() { return fBuf[2]; } + float pcrFromBuf(); // after "fBuf" has been read + unsigned long tsPacketNumFromBuf(); + void setMPEGVersionFromRecordType(u_int8_t recordType); + + Boolean rewindToCleanPoint(unsigned long&ixFound); + // used to implement "lookupTSPacketNumber()" + +private: + char* fFileName; + FILE* fFid; // used internally when reading from the file + int fMPEGVersion; + unsigned long fCurrentIndexRecordNum; // within "fFid" + float fCachedPCR; + unsigned long fCachedTSPacketNumber, fCachedIndexRecordNumber; + unsigned long fNumIndexRecords; + unsigned char fBuf[INDEX_RECORD_SIZE]; // used for reading index records from file +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG2TransportStreamMultiplexor.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG2TransportStreamMultiplexor.hh new file mode 100644 index 000000000..52549632d --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG2TransportStreamMultiplexor.hh @@ -0,0 +1,120 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A class for generating MPEG-2 Transport Stream from one or more input +// Elementary Stream data sources +// C++ header + +#ifndef _MPEG2_TRANSPORT_STREAM_MULTIPLEXOR_HH +#define _MPEG2_TRANSPORT_STREAM_MULTIPLEXOR_HH + +#ifndef _FRAMED_SOURCE_HH +#include "FramedSource.hh" +#endif +#ifndef _MPEG_1OR2_DEMUX_HH +#include "MPEG1or2Demux.hh" // for SCR +#endif + +#define PID_TABLE_SIZE 0x2000 // 2^13 + +class MPEG2TransportStreamMultiplexor: public FramedSource { +public: + typedef void (onEndOfSegmentFunc)(void* clientData, double segmentDuration); + void setTimedSegmentation(unsigned segmentationDuration, + onEndOfSegmentFunc* onEndOfSegmentFunc = NULL, + void* onEndOfSegmentClientData = NULL); + // Specifies that PAT and PMT packets should be output every "segmentationDuration" seconds. + // (If "segmentationDuration" is 0 (the default value), then PAT and PMT packets are output + // at a preset frequency.) + // The optional function "onEndOfSegmentFunc" is called after each segment is output. + double currentSegmentDuration() const { return fCurrentSegmentDuration; } + // Valid only if "setTimedSegmentation()" was previously called with "segmentationDuration" > 0 + + Boolean canDeliverNewFrameImmediately() const { return fInputBufferBytesUsed < fInputBufferSize; } + // Can be used by a downstream reader to test whether the next call to "doGetNextFrame()" + // will deliver data immediately). + +protected: + MPEG2TransportStreamMultiplexor(UsageEnvironment& env); + virtual ~MPEG2TransportStreamMultiplexor(); + + virtual void awaitNewBuffer(unsigned char* oldBuffer) = 0; + // implemented by subclasses + + void handleNewBuffer(unsigned char* buffer, unsigned bufferSize, + int mpegVersion, MPEG1or2Demux::SCR scr, int16_t PID = -1); + // called by "awaitNewBuffer()" + // Note: For MPEG-4 video, set "mpegVersion" to 4; for H.264 video, set "mpegVersion" to 5; + // for H.265 video, set "mpegVersion" to 6. + // For Opus audio, set "mpegVersion" to 3. + // The buffer is assumed to be a PES packet, with a proper PES header. + // If "PID" is not -1, then it (currently, only the low 8 bits) is used as the stream's PID, + // otherwise the "stream_id" in the PES header is reused to be the stream's PID. + +private: + // Redefined virtual functions: + virtual Boolean isMPEG2TransportStreamMultiplexor() const; + virtual void doGetNextFrame(); + +private: + void deliverDataToClient(u_int16_t pid, unsigned char* buffer, unsigned bufferSize, + unsigned& startPositionInBuffer); + + void deliverPATPacket(); + void deliverPMTPacket(Boolean hasChanged); + + void setProgramStreamMap(unsigned frameSize); + +protected: + Boolean fHaveVideoStreams; + +private: + unsigned fOutgoingPacketCounter; + unsigned fProgramMapVersion; + u_int8_t fPreviousInputProgramMapVersion, fCurrentInputProgramMapVersion; + // These two fields are used if we see "program_stream_map"s in the input. + struct { + unsigned counter; + u_int8_t streamType; // for use in Program Maps + } fPIDState[PID_TABLE_SIZE]; + u_int16_t fPCR_PID, fCurrentPID; // only the low 13 bits are used + MPEG1or2Demux::SCR fPCR; + unsigned char* fInputBuffer; + unsigned fInputBufferSize, fInputBufferBytesUsed; + Boolean fIsFirstAdaptationField; + unsigned fSegmentationDuration; + // if nonzero, this is the number of seconds between successive 'segments'. Each 'segment' + // begins with a PAT, followed by a PMT. + // if zero (the default value), then the frequency of PATs and PMTs depends on the constants + // PAT_PERIOD_IF_UNTIMED and PMT_PERIOD_IF_UNTIMED, defined in the .cpp file. + Boolean segmentationIsTimed() const { return fSegmentationDuration > 0; } + u_int8_t fSegmentationIndication; + // used only if fSegmentationDuration > 0: + // 1 if a segment has just ended and the next packet is to be a PAT + // 2 if a segment has just ended and the following PAT has been sent; a PMT is next + // 0 otherwise + double fCurrentSegmentDuration, fPreviousPTS; // used only if fSegmentationDuration > 0 + onEndOfSegmentFunc* fOnEndOfSegmentFunc; // used only if fSegmentationDuration > 0 + void* fOnEndOfSegmentClientData; // ditto +}; + + +// The CRC calculation function that Transport Streams use. We make this function public +// here in case it's useful elsewhere: +u_int32_t calculateCRC(u_int8_t const* data, unsigned dataLength, u_int32_t initialValue = 0xFFFFFFFF); + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG2TransportStreamTrickModeFilter.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG2TransportStreamTrickModeFilter.hh new file mode 100644 index 000000000..883403d81 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG2TransportStreamTrickModeFilter.hh @@ -0,0 +1,99 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved.// A filter that converts a MPEG Transport Stream file - with corresponding index file +// - to a corresponding Video Elementary Stream. It also uses a "scale" parameter +// to implement 'trick mode' (fast forward or reverse play, using I-frames) on +// the video stream. +// C++ header + +#ifndef _MPEG2_TRANSPORT_STREAM_TRICK_MODE_FILTER_HH +#define _MPEG2_TRANSPORT_STREAM_TRICK_MODE_FILTER_HH + +#ifndef _FRAMED_FILTER_HH +#include "FramedFilter.hh" +#endif + +#ifndef _MPEG2_TRANSPORT_STREAM_INDEX_FILE_HH +#include "MPEG2TransportStreamIndexFile.hh" +#endif + +#ifndef TRANSPORT_PACKET_SIZE +#define TRANSPORT_PACKET_SIZE 188 +#endif + +class MPEG2TransportStreamTrickModeFilter: public FramedFilter { +public: + static MPEG2TransportStreamTrickModeFilter* + createNew(UsageEnvironment& env, FramedSource* inputSource, + MPEG2TransportStreamIndexFile* indexFile, int scale); + + Boolean seekTo(unsigned long tsPacketNumber, unsigned long indexRecordNumber); + + unsigned long nextIndexRecordNum() const { return fNextIndexRecordNum; } + + void forgetInputSource() { fInputSource = NULL; } + // this lets us delete this without also deleting the input Transport Stream + +protected: + MPEG2TransportStreamTrickModeFilter(UsageEnvironment& env, FramedSource* inputSource, + MPEG2TransportStreamIndexFile* indexFile, int scale); + // called only by createNew() + virtual ~MPEG2TransportStreamTrickModeFilter(); + +private: + // Redefined virtual functions: + virtual void doGetNextFrame(); + virtual void doStopGettingFrames(); + +private: + void attemptDeliveryToClient(); + void seekToTransportPacket(unsigned long tsPacketNum); + void readTransportPacket(unsigned long tsPacketNum); // asynchronously + + static void afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + void afterGettingFrame1(unsigned frameSize); + + static void onSourceClosure(void* clientData); + void onSourceClosure1(); + +private: + Boolean fHaveStarted; + MPEG2TransportStreamIndexFile* fIndexFile; + int fScale; // absolute value + int fDirection; // 1 => forward; -1 => reverse + enum { + SKIPPING_FRAME, + DELIVERING_SAVED_FRAME, + SAVING_AND_DELIVERING_FRAME + } fState; + unsigned fFrameCount; + unsigned long fNextIndexRecordNum; // next to be read from the index file + unsigned long fNextTSPacketNum; // next to be read from the transport stream file + unsigned char fInputBuffer[TRANSPORT_PACKET_SIZE]; + unsigned long fCurrentTSPacketNum; // corresponding to data currently in the buffer + unsigned long fDesiredTSPacketNum; + u_int8_t fDesiredDataOffset, fDesiredDataSize; + float fDesiredDataPCR, fFirstPCR; + unsigned long fSavedFrameIndexRecordStart; + unsigned long fSavedSequentialIndexRecordNum; + Boolean fUseSavedFrameNextTime; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG2TransportUDPServerMediaSubsession.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG2TransportUDPServerMediaSubsession.hh new file mode 100644 index 000000000..8bb64aef7 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG2TransportUDPServerMediaSubsession.hh @@ -0,0 +1,55 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A 'ServerMediaSubsession' object that creates new, unicast, "RTPSink"s +// on demand, from an incoming UDP (or RTP/UDP) MPEG-2 Transport Stream +// C++ header + +#ifndef _MPEG2_TRANSPORT_UDP_SERVER_MEDIA_SUBSESSION_HH +#define _MPEG2_TRANSPORT_UDP_SERVER_MEDIA_SUBSESSION_HH + +#ifndef _ON_DEMAND_SERVER_MEDIA_SUBSESSION_HH +#include "OnDemandServerMediaSubsession.hh" +#endif + +class MPEG2TransportUDPServerMediaSubsession: public OnDemandServerMediaSubsession { +public: + static MPEG2TransportUDPServerMediaSubsession* + createNew(UsageEnvironment& env, + char const* inputAddressStr, // An IP multicast address, or use "0.0.0.0" or NULL for unicast input + Port const& inputPort, + Boolean inputStreamIsRawUDP = False); // otherwise (default) the input stream is RTP/UDP +protected: + MPEG2TransportUDPServerMediaSubsession(UsageEnvironment& env, + char const* inputAddressStr, Port const& inputPort, Boolean inputStreamIsRawUDP); + // called only by createNew(); + virtual ~MPEG2TransportUDPServerMediaSubsession(); + +protected: // redefined virtual functions + virtual FramedSource* createNewStreamSource(unsigned clientSessionId, + unsigned& estBitrate); + virtual RTPSink* createNewRTPSink(Groupsock* rtpGroupsock, + unsigned char rtpPayloadTypeIfDynamic, + FramedSource* inputSource); +protected: + char const* fInputAddressStr; + Port fInputPort; + Groupsock* fInputGroupsock; + Boolean fInputStreamIsRawUDP; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG4ESVideoRTPSink.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG4ESVideoRTPSink.hh new file mode 100644 index 000000000..62cec934d --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG4ESVideoRTPSink.hh @@ -0,0 +1,72 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP sink for MPEG-4 Elementary Stream video (RFC 3016) +// C++ header + +#ifndef _MPEG4ES_VIDEO_RTP_SINK_HH +#define _MPEG4ES_VIDEO_RTP_SINK_HH + +#ifndef _VIDEO_RTP_SINK_HH +#include "VideoRTPSink.hh" +#endif + +class MPEG4ESVideoRTPSink: public VideoRTPSink { +public: + static MPEG4ESVideoRTPSink* createNew(UsageEnvironment& env, + Groupsock* RTPgs, unsigned char rtpPayloadFormat, + u_int32_t rtpTimestampFrequency = 90000); + static MPEG4ESVideoRTPSink* createNew(UsageEnvironment& env, + Groupsock* RTPgs, unsigned char rtpPayloadFormat, u_int32_t rtpTimestampFrequency, + u_int8_t profileAndLevelIndication, char const* configStr); + // an optional variant of "createNew()", useful if we know, in advance, the stream's 'configuration' info. + + +protected: + MPEG4ESVideoRTPSink(UsageEnvironment& env, Groupsock* RTPgs, unsigned char rtpPayloadFormat, u_int32_t rtpTimestampFrequency, + u_int8_t profileAndLevelIndication = 0, char const* configStr = NULL); + // called only by createNew() + + virtual ~MPEG4ESVideoRTPSink(); + +protected: // redefined virtual functions: + virtual Boolean sourceIsCompatibleWithUs(MediaSource& source); + + virtual void doSpecialFrameHandling(unsigned fragmentationOffset, + unsigned char* frameStart, + unsigned numBytesInFrame, + struct timeval framePresentationTime, + unsigned numRemainingBytes); + virtual Boolean allowFragmentationAfterStart() const; + virtual Boolean + frameCanAppearAfterPacketStart(unsigned char const* frameStart, + unsigned numBytesInFrame) const; + + virtual char const* auxSDPLine(); + +protected: + Boolean fVOPIsPresent; + +private: + u_int8_t fProfileAndLevelIndication; + unsigned char* fConfigBytes; + unsigned fNumConfigBytes; + + char* fFmtpSDPLine; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG4ESVideoRTPSource.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG4ESVideoRTPSource.hh new file mode 100644 index 000000000..e3b938996 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG4ESVideoRTPSource.hh @@ -0,0 +1,51 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// MP4V-ES video RTP stream sources +// C++ header + +#ifndef _MPEG4_ES_VIDEO_RTP_SOURCE_HH +#define _MPEG4_ES_VIDEO_RTP_SOURCE_HH + +#ifndef _MULTI_FRAMED_RTP_SOURCE_HH +#include "MultiFramedRTPSource.hh" +#endif + +class MPEG4ESVideoRTPSource: public MultiFramedRTPSource { +public: + static MPEG4ESVideoRTPSource* + createNew(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency); + +protected: + virtual ~MPEG4ESVideoRTPSource(); + +private: + MPEG4ESVideoRTPSource(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency); + // called only by createNew() + +private: + // redefined virtual functions: + virtual Boolean processSpecialHeader(BufferedPacket* packet, + unsigned& resultSpecialHeaderSize); + virtual char const* MIMEtype() const; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG4GenericRTPSink.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG4GenericRTPSink.hh new file mode 100644 index 000000000..7f49b9855 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG4GenericRTPSink.hh @@ -0,0 +1,70 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// MPEG4-GENERIC ("audio", "video", or "application") RTP stream sinks +// C++ header + +#ifndef _MPEG4_GENERIC_RTP_SINK_HH +#define _MPEG4_GENERIC_RTP_SINK_HH + +#ifndef _MULTI_FRAMED_RTP_SINK_HH +#include "MultiFramedRTPSink.hh" +#endif + +class MPEG4GenericRTPSink: public MultiFramedRTPSink { +public: + static MPEG4GenericRTPSink* + createNew(UsageEnvironment& env, Groupsock* RTPgs, + u_int8_t rtpPayloadFormat, u_int32_t rtpTimestampFrequency, + char const* sdpMediaTypeString, char const* mpeg4Mode, + char const* configString, + unsigned numChannels = 1); + +protected: + MPEG4GenericRTPSink(UsageEnvironment& env, Groupsock* RTPgs, + u_int8_t rtpPayloadFormat, + u_int32_t rtpTimestampFrequency, + char const* sdpMediaTypeString, + char const* mpeg4Mode, char const* configString, + unsigned numChannels); + // called only by createNew() + + virtual ~MPEG4GenericRTPSink(); + +private: // redefined virtual functions: + virtual + Boolean frameCanAppearAfterPacketStart(unsigned char const* frameStart, + unsigned numBytesInFrame) const; + virtual void doSpecialFrameHandling(unsigned fragmentationOffset, + unsigned char* frameStart, + unsigned numBytesInFrame, + struct timeval framePresentationTime, + unsigned numRemainingBytes); + virtual unsigned specialHeaderSize() const; + + virtual char const* sdpMediaType() const; + + virtual char const* auxSDPLine(); // for the "a=fmtp:" SDP line + +private: + char const* fSDPMediaTypeString; + char const* fMPEG4Mode; + char const* fConfigString; + char* fFmtpSDPLine; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG4GenericRTPSource.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG4GenericRTPSource.hh new file mode 100644 index 000000000..2e6e5d4e8 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG4GenericRTPSource.hh @@ -0,0 +1,78 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// MPEG4-GENERIC ("audio", "video", or "application") RTP stream sources +// C++ header + +#ifndef _MPEG4_GENERIC_RTP_SOURCE_HH +#define _MPEG4_GENERIC_RTP_SOURCE_HH + +#ifndef _MULTI_FRAMED_RTP_SOURCE_HH +#include "MultiFramedRTPSource.hh" +#endif + +class MPEG4GenericRTPSource: public MultiFramedRTPSource { +public: + static MPEG4GenericRTPSource* + createNew(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency, + char const* mediumName, + char const* mode, unsigned sizeLength, unsigned indexLength, + unsigned indexDeltaLength + // add other parameters later + ); + // mediumName is "audio", "video", or "application" + // it *cannot* be NULL + +protected: + MPEG4GenericRTPSource(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency, + char const* mediumName, + char const* mode, + unsigned sizeLength, unsigned indexLength, + unsigned indexDeltaLength + ); + // called only by createNew(), or by subclass constructors + virtual ~MPEG4GenericRTPSource(); + +protected: + // redefined virtual functions: + virtual Boolean processSpecialHeader(BufferedPacket* packet, + unsigned& resultSpecialHeaderSize); + virtual char const* MIMEtype() const; + +private: + char* fMIMEType; + + char* fMode; + unsigned fSizeLength, fIndexLength, fIndexDeltaLength; + unsigned fNumAUHeaders; // in the most recently read packet + unsigned fNextAUHeader; // index of the next AU Header to read + struct AUHeader* fAUHeaders; + + friend class MPEG4GenericBufferedPacket; +}; + + + +// A function that looks up the sampling frequency from an +// "AudioSpecificConfig" string. (0 means 'unknown') +unsigned samplingFrequencyFromAudioSpecificConfig(char const* configStr); + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG4LATMAudioRTPSink.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG4LATMAudioRTPSink.hh new file mode 100644 index 000000000..f6d9ace5b --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG4LATMAudioRTPSink.hh @@ -0,0 +1,69 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP sink for MPEG-4 audio, using LATM multiplexing (RFC 3016) +// (Note that the initial 'size' field is assumed to be present at the start of +// each frame.) +// C++ header + +#ifndef _MPEG4_LATM_AUDIO_RTP_SINK_HH +#define _MPEG4_LATM_AUDIO_RTP_SINK_HH + +#ifndef _AUDIO_RTP_SINK_HH +#include "AudioRTPSink.hh" +#endif + +class MPEG4LATMAudioRTPSink: public AudioRTPSink { +public: + static MPEG4LATMAudioRTPSink* createNew(UsageEnvironment& env, + Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + u_int32_t rtpTimestampFrequency, + char const* streamMuxConfigString, + unsigned numChannels, + Boolean allowMultipleFramesPerPacket = False); + +protected: + MPEG4LATMAudioRTPSink(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + u_int32_t rtpTimestampFrequency, + char const* streamMuxConfigString, + unsigned numChannels, + Boolean allowMultipleFramesPerPacket); + // called only by createNew() + + virtual ~MPEG4LATMAudioRTPSink(); + +private: // redefined virtual functions: + virtual void doSpecialFrameHandling(unsigned fragmentationOffset, + unsigned char* frameStart, + unsigned numBytesInFrame, + struct timeval framePresentationTime, + unsigned numRemainingBytes); + virtual Boolean + frameCanAppearAfterPacketStart(unsigned char const* frameStart, + unsigned numBytesInFrame) const; + + virtual char const* auxSDPLine(); // for the "a=fmtp:" SDP line + +private: + char const* fStreamMuxConfigString; + char* fFmtpSDPLine; + Boolean fAllowMultipleFramesPerPacket; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG4LATMAudioRTPSource.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG4LATMAudioRTPSource.hh new file mode 100644 index 000000000..319812fae --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG4LATMAudioRTPSource.hh @@ -0,0 +1,101 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// MPEG-4 audio, using LATM multiplexing +// C++ header + +#ifndef _MPEG4_LATM_AUDIO_RTP_SOURCE_HH +#define _MPEG4_LATM_AUDIO_RTP_SOURCE_HH + +#ifndef _MULTI_FRAMED_RTP_SOURCE_HH +#include "MultiFramedRTPSource.hh" +#endif + +class MPEG4LATMAudioRTPSource: public MultiFramedRTPSource { +public: + static MPEG4LATMAudioRTPSource* + createNew(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency); + + // By default, the LATM data length field is included at the beginning of each + // returned frame. To omit this field, call the following: + void omitLATMDataLengthField(); + + Boolean returnedFrameIncludesLATMDataLengthField() const { return fIncludeLATMDataLengthField; } + +protected: + virtual ~MPEG4LATMAudioRTPSource(); + +private: + MPEG4LATMAudioRTPSource(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency); + // called only by createNew() + +private: + // redefined virtual functions: + virtual Boolean processSpecialHeader(BufferedPacket* packet, + unsigned& resultSpecialHeaderSize); + virtual char const* MIMEtype() const; + +private: + Boolean fIncludeLATMDataLengthField; +}; + + +// A utility for parsing a "StreamMuxConfig" string +Boolean +parseStreamMuxConfigStr(char const* configStr, + // result parameters: + Boolean& audioMuxVersion, + Boolean& allStreamsSameTimeFraming, + unsigned char& numSubFrames, + unsigned char& numProgram, + unsigned char& numLayer, + unsigned char*& audioSpecificConfig, + unsigned& audioSpecificConfigSize); + // Parses "configStr" as a sequence of hexadecimal digits, representing + // a "StreamMuxConfig" (as defined in ISO.IEC 14496-3, table 1.21). + // Returns, in "audioSpecificConfig", a binary representation of + // the enclosed "AudioSpecificConfig" structure (of size + // "audioSpecificConfigSize" bytes). The memory for this is allocated + // dynamically by this function; the caller is responsible for + // freeing it. Other values, that precede "AudioSpecificConfig", + // are returned in the other parameters. + // Returns True iff the parsing succeeds. + // IMPORTANT NOTE: The implementation of this function currently assumes + // that everything after the first "numLayer" field is an + // "AudioSpecificConfig". Therefore, it will not work properly if + // "audioMuxVersion" != 0, "numProgram" > 0, or "numLayer" > 0. + // Also, any 'other data' or CRC info will be included at + // the end of "audioSpecificConfig". + +unsigned char* parseStreamMuxConfigStr(char const* configStr, + // result parameter: + unsigned& audioSpecificConfigSize); + // A variant of the above that returns just the "AudioSpecificConfig" data + // (or NULL) if the parsing failed, without bothering with the other + // result parameters. + +unsigned char* parseGeneralConfigStr(char const* configStr, + // result parameter: + unsigned& configSize); + // A routine that parses an arbitrary config string, returning + // the result in binary form. + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG4VideoFileServerMediaSubsession.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG4VideoFileServerMediaSubsession.hh new file mode 100644 index 000000000..15cda5c29 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG4VideoFileServerMediaSubsession.hh @@ -0,0 +1,61 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A 'ServerMediaSubsession' object that creates new, unicast, "RTPSink"s +// on demand, from a MPEG-4 video file. +// C++ header + +#ifndef _MPEG4_VIDEO_FILE_SERVER_MEDIA_SUBSESSION_HH +#define _MPEG4_VIDEO_FILE_SERVER_MEDIA_SUBSESSION_HH + +#ifndef _FILE_SERVER_MEDIA_SUBSESSION_HH +#include "FileServerMediaSubsession.hh" +#endif + +class MPEG4VideoFileServerMediaSubsession: public FileServerMediaSubsession{ +public: + static MPEG4VideoFileServerMediaSubsession* + createNew(UsageEnvironment& env, char const* fileName, Boolean reuseFirstSource); + + // Used to implement "getAuxSDPLine()": + void checkForAuxSDPLine1(); + void afterPlayingDummy1(); + +protected: + MPEG4VideoFileServerMediaSubsession(UsageEnvironment& env, + char const* fileName, Boolean reuseFirstSource); + // called only by createNew(); + virtual ~MPEG4VideoFileServerMediaSubsession(); + + void setDoneFlag() { fDoneFlag = ~0; } + +protected: // redefined virtual functions + virtual char const* getAuxSDPLine(RTPSink* rtpSink, + FramedSource* inputSource); + virtual FramedSource* createNewStreamSource(unsigned clientSessionId, + unsigned& estBitrate); + virtual RTPSink* createNewRTPSink(Groupsock* rtpGroupsock, + unsigned char rtpPayloadTypeIfDynamic, + FramedSource* inputSource); + +private: + char* fAuxSDPLine; + char fDoneFlag; // used when setting up "fAuxSDPLine" + RTPSink* fDummyRTPSink; // ditto +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG4VideoStreamDiscreteFramer.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG4VideoStreamDiscreteFramer.hh new file mode 100644 index 000000000..832572cd0 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG4VideoStreamDiscreteFramer.hh @@ -0,0 +1,73 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A simplified version of "MPEG4VideoStreamFramer" that takes only complete, +// discrete frames (rather than an arbitrary byte stream) as input. +// This avoids the parsing and data copying overhead of the full +// "MPEG4VideoStreamFramer". +// C++ header + +#ifndef _MPEG4_VIDEO_STREAM_DISCRETE_FRAMER_HH +#define _MPEG4_VIDEO_STREAM_DISCRETE_FRAMER_HH + +#ifndef _MPEG4_VIDEO_STREAM_FRAMER_HH +#include "MPEG4VideoStreamFramer.hh" +#endif + +class MPEG4VideoStreamDiscreteFramer: public MPEG4VideoStreamFramer { +public: + static MPEG4VideoStreamDiscreteFramer* + createNew(UsageEnvironment& env, FramedSource* inputSource, Boolean leavePresentationTimesUnmodified = False); + +protected: + MPEG4VideoStreamDiscreteFramer(UsageEnvironment& env, + FramedSource* inputSource, Boolean leavePresentationTimesUnmodified); + // called only by createNew() + virtual ~MPEG4VideoStreamDiscreteFramer(); + +protected: + // redefined virtual functions: + virtual void doGetNextFrame(); + +protected: + static void afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + void afterGettingFrame1(unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + + Boolean getNextFrameBit(u_int8_t& result); + Boolean getNextFrameBits(unsigned numBits, u_int32_t& result); + // Which are used by: + void analyzeVOLHeader(); + +protected: + Boolean fLeavePresentationTimesUnmodified; + u_int32_t vop_time_increment_resolution; + unsigned fNumVTIRBits; + // # of bits needed to count to "vop_time_increment_resolution" + struct timeval fLastNonBFramePresentationTime; + unsigned fLastNonBFrameVop_time_increment; + +private: + unsigned fNumBitsSeenSoFar; // used by the getNextFrameBit*() routines +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG4VideoStreamFramer.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG4VideoStreamFramer.hh new file mode 100644 index 000000000..571f25724 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEG4VideoStreamFramer.hh @@ -0,0 +1,75 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A filter that breaks up an MPEG-4 video elementary stream into +// frames for: +// - Visual Object Sequence (VS) Header + Visual Object (VO) Header +// + Video Object Layer (VOL) Header +// - Group of VOP (GOV) Header +// - VOP frame +// C++ header + +#ifndef _MPEG4_VIDEO_STREAM_FRAMER_HH +#define _MPEG4_VIDEO_STREAM_FRAMER_HH + +#ifndef _MPEG_VIDEO_STREAM_FRAMER_HH +#include "MPEGVideoStreamFramer.hh" +#endif + +class MPEG4VideoStreamFramer: public MPEGVideoStreamFramer { +public: + static MPEG4VideoStreamFramer* + createNew(UsageEnvironment& env, FramedSource* inputSource); + + u_int8_t profile_and_level_indication() const { + return fProfileAndLevelIndication; + } + + unsigned char* getConfigBytes(unsigned& numBytes) const; + + void setConfigInfo(u_int8_t profileAndLevelIndication, char const* configStr); + // Assigns the "profile_and_level_indication" number, and the 'config' bytes. + // If this function is not called, then this data is only assigned later, when it appears in the input stream. + +protected: + MPEG4VideoStreamFramer(UsageEnvironment& env, + FramedSource* inputSource, + Boolean createParser = True); + // called only by createNew(), or by subclass constructors + virtual ~MPEG4VideoStreamFramer(); + + void startNewConfig(); + void appendToNewConfig(unsigned char* newConfigBytes, + unsigned numNewBytes); + void completeNewConfig(); + +private: + // redefined virtual functions: + virtual Boolean isMPEG4VideoStreamFramer() const; + +protected: + u_int8_t fProfileAndLevelIndication; + unsigned char* fConfigBytes; + unsigned fNumConfigBytes; + +private: + unsigned char* fNewConfigBytes; + unsigned fNumNewConfigBytes; + friend class MPEG4VideoStreamParser; // hack +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/MPEGVideoStreamFramer.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEGVideoStreamFramer.hh new file mode 100644 index 000000000..7fe1b7a10 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/MPEGVideoStreamFramer.hh @@ -0,0 +1,85 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A filter that breaks up an MPEG video elementary stream into +// headers and frames +// C++ header + +#ifndef _MPEG_VIDEO_STREAM_FRAMER_HH +#define _MPEG_VIDEO_STREAM_FRAMER_HH + +#ifndef _FRAMED_FILTER_HH +#include "FramedFilter.hh" +#endif + +class TimeCode { +public: + TimeCode(); + virtual ~TimeCode(); + + int operator==(TimeCode const& arg2); + unsigned days, hours, minutes, seconds, pictures; +}; + +class MPEGVideoStreamFramer: public FramedFilter { +public: + Boolean& pictureEndMarker() { return fPictureEndMarker; } + // a hack for implementing the RTP 'M' bit + + void flushInput(); // called if there is a discontinuity (seeking) in the input + +protected: + MPEGVideoStreamFramer(UsageEnvironment& env, FramedSource* inputSource); + // we're an abstract base class + virtual ~MPEGVideoStreamFramer(); + + void computePresentationTime(unsigned numAdditionalPictures); + // sets "fPresentationTime" + void setTimeCode(unsigned hours, unsigned minutes, unsigned seconds, + unsigned pictures, unsigned picturesSinceLastGOP); + +protected: // redefined virtual functions + virtual void doGetNextFrame(); + virtual void doStopGettingFrames(); + +private: + void reset(); + + static void continueReadProcessing(void* clientData, + unsigned char* ptr, unsigned size, + struct timeval presentationTime); + void continueReadProcessing(); + +protected: + double fFrameRate; // Note: For MPEG-4, this is really a 'tick rate' + unsigned fPictureCount; // hack used to implement doGetNextFrame() + Boolean fPictureEndMarker; + struct timeval fPresentationTimeBase; + + // parsing state + class MPEGVideoStreamParser* fParser; + friend class MPEGVideoStreamParser; // hack + +private: + TimeCode fCurGOPTimeCode, fPrevGOPTimeCode; + unsigned fPicturesAdjustment; + double fPictureTimeBase; + unsigned fTcSecsBase; + Boolean fHaveSeenFirstTimeCode; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/MatroskaFile.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/MatroskaFile.hh new file mode 100644 index 000000000..35c2f093e --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/MatroskaFile.hh @@ -0,0 +1,218 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A class that encapsulates a Matroska file. +// C++ header + +#ifndef _MATROSKA_FILE_HH +#define _MATROSKA_FILE_HH + +#ifndef _RTP_SINK_HH +#include "RTPSink.hh" +#endif +#ifndef _FILE_SINK_HH +#include "FileSink.hh" +#endif +#ifndef _HASH_TABLE_HH +#include "HashTable.hh" +#endif + +class MatroskaTrack; // forward +class MatroskaDemux; // forward + +typedef void MatroskaDemuxOnDeletionFunc(void* objectToNotify, MatroskaDemux* demuxBeingDeleted); + +class MatroskaFile: public Medium { +public: + typedef void (onCreationFunc)(MatroskaFile* newFile, void* clientData); + static void createNew(UsageEnvironment& env, char const* fileName, onCreationFunc* onCreation, void* onCreationClientData, + char const* preferredLanguage = "eng"); + // Note: Unlike most "createNew()" functions, this one doesn't return a new object immediately. Instead, because this class + // requires file reading (to parse the Matroska 'Track' headers) before a new object can be initialized, the creation of a new + // object is signalled by calling - from the event loop - an 'onCreationFunc' that is passed as a parameter to "createNew()". + + MatroskaTrack* lookup(unsigned trackNumber) const; + + MatroskaDemux* newDemux(MatroskaDemuxOnDeletionFunc* onDeletionFunc = NULL, void* objectToNotify = NULL); + // Creates a demultiplexor for extracting tracks from this file. + // (Separate clients will typically have separate demultiplexors.) + + // Parameters of the file ('Segment'); set when the file is parsed: + unsigned timecodeScale() { return fTimecodeScale; } // in nanoseconds + float segmentDuration() { return fSegmentDuration; } // in units of "timecodeScale()" + float fileDuration(); // in seconds + + char const* fileName() const { return fFileName; } + + unsigned chosenVideoTrackNumber() { return fChosenVideoTrackNumber; } + unsigned chosenAudioTrackNumber() { return fChosenAudioTrackNumber; } + unsigned chosenSubtitleTrackNumber() { return fChosenSubtitleTrackNumber; } + + FramedSource* + createSourceForStreaming(FramedSource* baseSource, unsigned trackNumber, + unsigned& estBitrate, unsigned& numFiltersInFrontOfTrack); + // Takes a data source (which must be a demultiplexed track from this file) and returns + // a (possibly modified) data source that can be used for streaming. + + char const* trackMIMEType(unsigned trackNumber) const; + // in the form "/", or NULL if no such track exists + + RTPSink* createRTPSinkForTrackNumber(unsigned trackNumber, Groupsock* rtpGroupsock, + unsigned char rtpPayloadTypeIfDynamic); + // Creates a "RTPSink" object that would be appropriate for streaming the specified track, + // or NULL if no appropriate "RTPSink" exists + + FileSink* createFileSinkForTrackNumber(unsigned trackNumber, char const* fileName); + // Creates a "FileSink" object that would be appropriate for recording the contents of + // the specified track, or NULL if no appropriate "FileSink" exists. + +private: + MatroskaFile(UsageEnvironment& env, char const* fileName, onCreationFunc* onCreation, void* onCreationClientData, + char const* preferredLanguage); + // called only by createNew() + virtual ~MatroskaFile(); + + static void handleEndOfTrackHeaderParsing(void* clientData); + void handleEndOfTrackHeaderParsing(); + + void addTrack(MatroskaTrack* newTrack, unsigned trackNumber); + void addCuePoint(double cueTime, u_int64_t clusterOffsetInFile, unsigned blockNumWithinCluster); + Boolean lookupCuePoint(double& cueTime, u_int64_t& resultClusterOffsetInFile, unsigned& resultBlockNumWithinCluster); + void printCuePoints(FILE* fid); + + void removeDemux(MatroskaDemux* demux); + + void getH264ConfigData(MatroskaTrack const* track, + u_int8_t*& sps, unsigned& spsSize, + u_int8_t*& pps, unsigned& ppsSize); + // "sps","pps" are dynamically allocated by this function, and must be delete[]d afterwards + void getH265ConfigData(MatroskaTrack const* track, + u_int8_t*& vps, unsigned& vpsSize, + u_int8_t*& sps, unsigned& spsSize, + u_int8_t*& pps, unsigned& ppsSize); + // "vps","sps","pps" are dynamically allocated by this function, and must be delete[]d afterwards + + void getVorbisOrTheoraConfigData(MatroskaTrack const* track, + u_int8_t*& identificationHeader, unsigned& identificationHeaderSize, + u_int8_t*& commentHeader, unsigned& commentHeaderSize, + u_int8_t*& setupHeader, unsigned& setupHeaderSize); + // "identificationHeader", "commentHeader", "setupHeader" are dynamically allocated by this function, and must be delete[]d afterwards + +private: + friend class MatroskaFileParser; + friend class MatroskaDemux; + char const* fFileName; + onCreationFunc* fOnCreation; + void* fOnCreationClientData; + char const* fPreferredLanguage; + + unsigned fTimecodeScale; // in nanoseconds + float fSegmentDuration; // in units of "fTimecodeScale" + u_int64_t fSegmentDataOffset, fClusterOffset, fCuesOffset; + + class MatroskaTrackTable* fTrackTable; + HashTable* fDemuxesTable; + class CuePoint* fCuePoints; + unsigned fChosenVideoTrackNumber, fChosenAudioTrackNumber, fChosenSubtitleTrackNumber; + class MatroskaFileParser* fParserForInitialization; +}; + +// We define our own track type codes as bits (powers of 2), so we can use the set of track types as a bitmap, representing a set: +// (Note that MATROSKA_TRACK_TYPE_OTHER must be last, and have the largest value.) +#define MATROSKA_TRACK_TYPE_VIDEO 0x01 +#define MATROSKA_TRACK_TYPE_AUDIO 0x02 +#define MATROSKA_TRACK_TYPE_SUBTITLE 0x04 +#define MATROSKA_TRACK_TYPE_OTHER 0x08 + +class MatroskaTrack { +public: + MatroskaTrack(); + virtual ~MatroskaTrack(); + + // track parameters + unsigned trackNumber; + u_int8_t trackType; + Boolean isEnabled, isDefault, isForced; + unsigned defaultDuration; + char* name; + char* language; + char* codecID; + unsigned samplingFrequency; + unsigned numChannels; + char const* mimeType; + unsigned codecPrivateSize; + u_int8_t* codecPrivate; + Boolean codecPrivateUsesH264FormatForH265; // a hack specifically for H.265 video tracks + Boolean codecIsOpus; // a hack for Opus audio + unsigned headerStrippedBytesSize; + u_int8_t* headerStrippedBytes; + char const* colorSampling; + char const* colorimetry; + unsigned pixelWidth; + unsigned pixelHeight; + unsigned bitDepth; + unsigned subframeSizeSize; // 0 means: frames do not have subframes (the default behavior) + Boolean haveSubframes() const { return subframeSizeSize > 0; } +}; + +class MatroskaDemux: public Medium { +public: + FramedSource* newDemuxedTrack(); + FramedSource* newDemuxedTrack(unsigned& resultTrackNumber); + // Returns a new stream ("FramedSource" subclass) that represents the next preferred media + // track (video, audio, subtitle - in that order) from the file. (Preferred media tracks + // are based on the file's language preference.) + // This function returns NULL when no more media tracks exist. + + FramedSource* newDemuxedTrackByTrackNumber(unsigned trackNumber); + // As above, but creates a new stream for a specific track number within the Matroska file. + // (You should not call this function more than once with the same track number.) + + // Note: We assume that: + // - Every track created by "newDemuxedTrack()" is later read + // - All calls to "newDemuxedTrack()" are made before any track is read + +protected: + friend class MatroskaFile; + friend class MatroskaFileParser; + class MatroskaDemuxedTrack* lookupDemuxedTrack(unsigned trackNumber); + + MatroskaDemux(MatroskaFile& ourFile); // we're created only by a "MatroskaFile" (a friend) + virtual ~MatroskaDemux(); + +private: + friend class MatroskaDemuxedTrack; + void removeTrack(unsigned trackNumber); + void continueReading(); // called by a demuxed track to tell us that it has a pending read ("doGetNextFrame()") + void seekToTime(double& seekNPT); + void pause(); + + static void handleEndOfFile(void* clientData); + void handleEndOfFile(); + + void resetState(); + +private: + MatroskaFile& fOurFile; + class MatroskaFileParser* fOurParser; + HashTable* fDemuxedTracksTable; + + // Used to implement "newServerMediaSubsession()": + u_int8_t fNextTrackTypeToCheck; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/MatroskaFileServerDemux.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/MatroskaFileServerDemux.hh new file mode 100644 index 000000000..b2bae9052 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/MatroskaFileServerDemux.hh @@ -0,0 +1,88 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A server demultiplexor for a Matroska file +// C++ header + +#ifndef _MATROSKA_FILE_SERVER_DEMUX_HH +#define _MATROSKA_FILE_SERVER_DEMUX_HH + +#ifndef _SERVER_MEDIA_SESSION_HH +#include "ServerMediaSession.hh" +#endif + +#ifndef _MATROSKA_FILE_HH +#include "MatroskaFile.hh" +#endif + +class MatroskaFileServerDemux: public Medium { +public: + typedef void (onCreationFunc)(MatroskaFileServerDemux* newDemux, void* clientData); + static void createNew(UsageEnvironment& env, char const* fileName, + onCreationFunc* onCreation, void* onCreationClientData, + char const* preferredLanguage = "eng"); + // Note: Unlike most "createNew()" functions, this one doesn't return a new object immediately. Instead, because this class + // requires file reading (to parse the Matroska 'Track' headers) before a new object can be initialized, the creation of a new + // object is signalled by calling - from the event loop - an 'onCreationFunc' that is passed as a parameter to "createNew()". + + ServerMediaSubsession* newServerMediaSubsession(); + ServerMediaSubsession* newServerMediaSubsession(unsigned& resultTrackNumber); + // Returns a new "ServerMediaSubsession" object that represents the next preferred media track + // (video, audio, subtitle - in that order) from the file. (Preferred media tracks are based on the file's language preference.) + // This function returns NULL when no more media tracks exist. + + ServerMediaSubsession* newServerMediaSubsessionByTrackNumber(unsigned trackNumber); + // As above, but creates a new "ServerMediaSubsession" object for a specific track number within the Matroska file. + // (You should not call this function more than once with the same track number.) + + // The following public: member functions are called only by the "ServerMediaSubsession" objects: + + MatroskaFile* ourMatroskaFile() { return fOurMatroskaFile; } + char const* fileName() const { return fFileName; } + float fileDuration() const { return fOurMatroskaFile->fileDuration(); } + + FramedSource* newDemuxedTrack(unsigned clientSessionId, unsigned trackNumber); + // Used by the "ServerMediaSubsession" objects to implement their "createNewStreamSource()" virtual function. + +private: + MatroskaFileServerDemux(UsageEnvironment& env, char const* fileName, + onCreationFunc* onCreation, void* onCreationClientData, + char const* preferredLanguage); + // called only by createNew() + virtual ~MatroskaFileServerDemux(); + + static void onMatroskaFileCreation(MatroskaFile* newFile, void* clientData); + void onMatroskaFileCreation(MatroskaFile* newFile); + + static void onDemuxDeletion(void* clientData, MatroskaDemux* demuxBeingDeleted); + void onDemuxDeletion(MatroskaDemux* demuxBeingDeleted); + +private: + char const* fFileName; + onCreationFunc* fOnCreation; + void* fOnCreationClientData; + MatroskaFile* fOurMatroskaFile; + + // Used to implement "newServerMediaSubsession()": + u_int8_t fNextTrackTypeToCheck; + + // Used to set up demuxing, to implement "newDemuxedTrack()": + unsigned fLastClientSessionId; + MatroskaDemux* fLastCreatedDemux; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/Media.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/Media.hh new file mode 100644 index 000000000..dd17f5ade --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/Media.hh @@ -0,0 +1,137 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Medium +// C++ header + +#ifndef _MEDIA_HH +#define _MEDIA_HH + +#ifndef _LIVEMEDIA_VERSION_HH +#include "liveMedia_version.hh" +#endif + +#ifndef _HASH_TABLE_HH +#include "HashTable.hh" +#endif + +#ifndef _USAGE_ENVIRONMENT_HH +#include "UsageEnvironment.hh" +#endif + +// Lots of files end up needing the following, so just #include them here: +#ifndef _NET_COMMON_H +#include "NetCommon.h" +#endif +#include + +// The following makes the Borland compiler happy: +#ifdef __BORLANDC__ +#define _strnicmp strnicmp +#define fabsf(x) fabs(x) +#endif + +#define mediumNameMaxLen 30 + +class Medium { +public: + static Boolean lookupByName(UsageEnvironment& env, + char const* mediumName, + Medium*& resultMedium); + static void close(UsageEnvironment& env, char const* mediumName); + static void close(Medium* medium); // alternative close() method using ptrs + // (has no effect if medium == NULL) + + UsageEnvironment& envir() const {return fEnviron;} + + char const* name() const {return fMediumName;} + + // Test for specific types of media: + virtual Boolean isSource() const; + virtual Boolean isSink() const; + virtual Boolean isRTCPInstance() const; + virtual Boolean isRTSPClient() const; + virtual Boolean isRTSPServer() const; + virtual Boolean isMediaSession() const; + virtual Boolean isServerMediaSession() const; + +protected: + friend class MediaLookupTable; + Medium(UsageEnvironment& env); // abstract base class + virtual ~Medium(); // instances are deleted using close() only + + TaskToken& nextTask() { + return fNextTask; + } + +private: + UsageEnvironment& fEnviron; + char fMediumName[mediumNameMaxLen]; + TaskToken fNextTask; +}; + + +// A data structure for looking up a Medium by its string name. +// (It is used only to implement "Medium", but we make it visible here, in case developers want to use it to iterate over +// the whole set of "Medium" objects that we've created.) +class MediaLookupTable { +public: + static MediaLookupTable* ourMedia(UsageEnvironment& env); + HashTable const& getTable() { return *fTable; } + +protected: + MediaLookupTable(UsageEnvironment& env); + virtual ~MediaLookupTable(); + +private: + friend class Medium; + + Medium* lookup(char const* name) const; + // Returns NULL if none already exists + + void addNew(Medium* medium, char* mediumName); + void remove(char const* name); + + void generateNewName(char* mediumName, unsigned maxLen); + +private: + UsageEnvironment& fEnv; + HashTable* fTable; + unsigned fNameGenerator; +}; + + +// The structure pointed to by the "liveMediaPriv" UsageEnvironment field: +class _Tables { +public: + static _Tables* getOurTables(UsageEnvironment& env, Boolean createIfNotPresent = True); + // returns a pointer to a "_Tables" structure (creating it if necessary) + void reclaimIfPossible(); + // used to delete ourselves when we're no longer used + + MediaLookupTable* mediaTable; + void* socketTable; + +protected: + _Tables(UsageEnvironment& env); + virtual ~_Tables(); + +private: + UsageEnvironment& fEnv; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/MediaSession.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/MediaSession.hh new file mode 100644 index 000000000..c295618f3 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/MediaSession.hh @@ -0,0 +1,385 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A data structure that represents a session that consists of +// potentially multiple (audio and/or video) sub-sessions +// (This data structure is used for media *receivers* - i.e., clients. +// For media streamers, use "ServerMediaSession" instead.) +// C++ header + +/* NOTE: To support receiving your own custom RTP payload format, you must first define a new + subclass of "MultiFramedRTPSource" (or "BasicUDPSource") that implements it. + Then define your own subclass of "MediaSession" and "MediaSubsession", as follows: + - In your subclass of "MediaSession" (named, for example, "myMediaSession"): + - Define and implement your own static member function + static myMediaSession* createNew(UsageEnvironment& env, char const* sdpDescription); + and call this - instead of "MediaSession::createNew()" - in your application, + when you create a new "MediaSession" object. + - Reimplement the "createNewMediaSubsession()" virtual function, as follows: + MediaSubsession* myMediaSession::createNewMediaSubsession() { return new myMediaSubsession(*this); } + - In your subclass of "MediaSubsession" (named, for example, "myMediaSubsession"): + - Reimplement the "createSourceObjects()" virtual function, perhaps similar to this: + Boolean myMediaSubsession::createSourceObjects(int useSpecialRTPoffset) { + if (strcmp(fCodecName, "X-MY-RTP-PAYLOAD-FORMAT") == 0) { + // This subsession uses our custom RTP payload format: + fReadSource = fRTPSource = myRTPPayloadFormatRTPSource::createNew( ); + return True; + } else { + // This subsession uses some other RTP payload format - perhaps one that we already implement: + return ::createSourceObjects(useSpecialRTPoffset); + } + } +*/ + +#ifndef _MEDIA_SESSION_HH +#define _MEDIA_SESSION_HH + +#ifndef _RTCP_HH +#include "RTCP.hh" +#endif +#ifndef _FRAMED_FILTER_HH +#include "FramedFilter.hh" +#endif +#ifndef _SRTP_CRYPTOGRAPHIC_CONTEXT_HH +#include "SRTPCryptographicContext.hh" +#endif + +// added for audio back channel +#define FLAG_RECVONLY 0 +#define FLAG_SENDONLY 1 + +class MediaSubsession; // forward + +class MediaSession: public Medium { +public: + static MediaSession* createNew(UsageEnvironment& env, + char const* sdpDescription); + + static Boolean lookupByName(UsageEnvironment& env, char const* sourceName, + MediaSession*& resultSession); + + Boolean hasSubsessions() const { return fSubsessionsHead != NULL; } + + char* connectionEndpointName() const { return fConnectionEndpointName; } + int connectionEndpointNameAddressFamily() const { return fConnectionEndpointNameAddressFamily; } + char const* CNAME() const { return fCNAME; } + struct sockaddr_storage const& sourceFilterAddr() const { return fSourceFilterAddr; } + float& scale() { return fScale; } + float& speed() { return fSpeed; } + char* mediaSessionType() const { return fMediaSessionType; } + char* sessionName() const { return fSessionName; } + char* sessionDescription() const { return fSessionDescription; } + char const* controlPath() const { return fControlPath; } + + double& playStartTime() { return fMaxPlayStartTime; } + double& playEndTime() { return fMaxPlayEndTime; } + char* absStartTime() const; + char* absEndTime() const; + // Used only to set the local fields: + char*& _absStartTime() { return fAbsStartTime; } + char*& _absEndTime() { return fAbsEndTime; } + + Boolean initiateByMediaType(char const* mimeType, + MediaSubsession*& resultSubsession, + int useSpecialRTPoffset = -1); + // Initiates the first subsession with the specified MIME type + // Returns the resulting subsession, or 'multi source' (not both) + + MIKEYState* getMIKEYState() const { return fMIKEYState; } + SRTPCryptographicContext* getCrypto() const { return fCrypto; } + +protected: // redefined virtual functions + virtual Boolean isMediaSession() const; + +protected: + MediaSession(UsageEnvironment& env); + // called only by createNew(); + virtual ~MediaSession(); + + virtual MediaSubsession* createNewMediaSubsession(); + + Boolean initializeWithSDP(char const* sdpDescription); + Boolean parseSDPLine(char const* input, char const*& nextLine); + Boolean parseSDPLine_s(char const* sdpLine); + Boolean parseSDPLine_i(char const* sdpLine); + Boolean parseSDPLine_c(char const* sdpLine); + Boolean parseSDPAttribute_type(char const* sdpLine); + Boolean parseSDPAttribute_control(char const* sdpLine); + Boolean parseSDPAttribute_range(char const* sdpLine); + Boolean parseSDPAttribute_source_filter(char const* sdpLine); + Boolean parseSDPAttribute_key_mgmt(char const* sdpLine); + + static char* lookupPayloadFormat(unsigned char rtpPayloadType, + unsigned& rtpTimestampFrequency, + unsigned& numChannels); + static unsigned guessRTPTimestampFrequency(char const* mediumName, + char const* codecName); + +protected: + friend class MediaSubsessionIterator; + char* fCNAME; // used for RTCP + + // Linkage fields: + MediaSubsession* fSubsessionsHead; + MediaSubsession* fSubsessionsTail; + + // Fields set from a SDP description: + char* fConnectionEndpointName; + int fConnectionEndpointNameAddressFamily; + double fMaxPlayStartTime; + double fMaxPlayEndTime; + char* fAbsStartTime; + char* fAbsEndTime; + struct sockaddr_storage fSourceFilterAddr; // used for SSM + float fScale; // set from a RTSP "Scale:" header + float fSpeed; + char* fMediaSessionType; // holds a=type value + char* fSessionName; // holds s= value + char* fSessionDescription; // holds i= value + char* fControlPath; // holds optional a=control: string + + // Optional key management and crypto state: + MIKEYState* fMIKEYState; + SRTPCryptographicContext* fCrypto; +}; + + +class MediaSubsessionIterator { +public: + MediaSubsessionIterator(MediaSession const& session); + virtual ~MediaSubsessionIterator(); + + MediaSubsession* next(); // NULL if none + void reset(); + +private: + MediaSession const& fOurSession; + MediaSubsession* fNextPtr; +}; + + +class MediaSubsession { +public: + MediaSession& parentSession() { return fParent; } + MediaSession const& parentSession() const { return fParent; } + + unsigned short clientPortNum() const { return fClientPortNum; } + unsigned char rtpPayloadFormat() const { return fRTPPayloadFormat; } + char const* savedSDPLines() const { return fSavedSDPLines; } + char const* mediumName() const { return fMediumName; } + char const* codecName() const { return fCodecName; } + char const* protocolName() const { return fProtocolName; } + char const* controlPath() const { return fControlPath; } + + Boolean isSSM() const { return !addressIsNull(fSourceFilterAddr); } + + unsigned short videoWidth() const { return fVideoWidth; } + unsigned short videoHeight() const { return fVideoHeight; } + unsigned videoFPS() const { return fVideoFPS; } + unsigned numChannels() const { return fNumChannels; } + float& scale() { return fScale; } + float& speed() { return fSpeed; } + + RTPSource* rtpSource() { return fRTPSource; } + RTCPInstance* rtcpInstance() { return fRTCPInstance; } + unsigned rtpTimestampFrequency() const { return fRTPTimestampFrequency; } + Boolean rtcpIsMuxed() const { return fMultiplexRTCPWithRTP; } + FramedSource* readSource() { return fReadSource; } + // This is the source that client sinks read from. It is usually + // (but not necessarily) the same as "rtpSource()" + void addFilter(FramedFilter* filter); + // Changes "readSource()" to "filter" (which must have just been created with "readSource()" as its input) + + double playStartTime() const; + double playEndTime() const; + char* absStartTime() const; + char* absEndTime() const; + // Used only to set the local fields: + double& _playStartTime() { return fPlayStartTime; } + double& _playEndTime() { return fPlayEndTime; } + char*& _absStartTime() { return fAbsStartTime; } + char*& _absEndTime() { return fAbsEndTime; } + + Boolean initiate(int useSpecialRTPoffset = -1); + // Creates a "RTPSource" for this subsession. (Has no effect if it's + // already been created.) Returns True iff this succeeds. + void deInitiate(); // Destroys any previously created RTPSource + Boolean setClientPortNum(unsigned short portNum); + // Sets the preferred client port number that any "RTPSource" for + // this subsession would use. (By default, the client port number + // is gotten from the original SDP description, or - if the SDP + // description does not specfy a client port number - an ephemeral + // (even) port number is chosen.) This routine must *not* be + // called after initiate(). + void receiveRawMP3ADUs() { fReceiveRawMP3ADUs = True; } // optional hack for audio/MPA-ROBUST; must not be called after initiate() + void receiveRawJPEGFrames() { fReceiveRawJPEGFrames = True; } // optional hack for video/JPEG; must not be called after initiate() + char*& connectionEndpointName() { return fConnectionEndpointName; } + char const* connectionEndpointName() const { + return fConnectionEndpointName; + } + int connectionEndpointNameAddressFamily() const { + return fConnectionEndpointNameAddressFamily == AF_UNSPEC + ? parentSession().connectionEndpointNameAddressFamily() + : fConnectionEndpointNameAddressFamily; + } + + // 'Bandwidth' parameter, set in the "b=" SDP line: + unsigned bandwidth() const { return fBandwidth; } + + // General SDP attribute accessor functions: + char const* attrVal_str(char const* attrName) const; + // returns "" if attribute doesn't exist (and has no default value), or is not a string + char const* attrVal_strToLower(char const* attrName) const; + // returns "" if attribute doesn't exist (and has no default value), or is not a string + unsigned attrVal_int(char const* attrName) const; + // also returns 0 if attribute doesn't exist (and has no default value) + unsigned attrVal_unsigned(char const* attrName) const { return (unsigned)attrVal_int(attrName); } + Boolean attrVal_bool(char const* attrName) const { return attrVal_int(attrName) != 0; } + + // Old, now-deprecated SDP attribute accessor functions, kept here for backwards-compatibility: + char const* fmtp_config() const; + char const* fmtp_configuration() const { return fmtp_config(); } + char const* fmtp_spropparametersets() const { return attrVal_str("sprop-parameter-sets"); } + char const* fmtp_spropvps() const { return attrVal_str("sprop-vps"); } + char const* fmtp_spropsps() const { return attrVal_str("sprop-sps"); } + char const* fmtp_sproppps() const { return attrVal_str("sprop-pps"); } + + void getConnectionEndpointAddress(struct sockaddr_storage& addr) const; + // Converts "fConnectionEndpointName" to an address (or 0 if unknown) + void setDestinations(struct sockaddr_storage const& defaultDestAddress); + // Uses "fConnectionEndpointName" and "serverPortNum" to set + // the destination address and port of the RTP and RTCP objects. + // This is typically called by RTSP clients after doing "SETUP". + + char const* sessionId() const { return fSessionId; } + void setSessionId(char const* sessionId); + + // Public fields that external callers can use to keep state. + // (They are responsible for all storage management on these fields) + unsigned short serverPortNum; // in host byte order (used by RTSP) + unsigned char rtpChannelId, rtcpChannelId; // used by RTSP (for RTP/TCP) + MediaSink* sink; // callers can use this to keep track of who's playing us + void* miscPtr; // callers can use this for whatever they want + + // Parameters set from a RTSP "RTP-Info:" header: + struct { + u_int16_t seqNum; + u_int32_t timestamp; + Boolean infoIsNew; // not part of the RTSP header; instead, set whenever this struct is filled in + } rtpInfo; + + double getNormalPlayTime(struct timeval const& presentationTime); + // Computes the stream's "Normal Play Time" (NPT) from the given "presentationTime". + // (For the definition of "Normal Play Time", see RFC 2326, section 3.6.) + // This function is useful only if the "rtpInfo" structure was previously filled in + // (e.g., by a "RTP-Info:" header in a RTSP response). + // Also, for this function to work properly, the RTP stream's presentation times must (eventually) be + // synchronized via RTCP. + // (Note: If this function returns a negative number, then the result should be ignored by the caller.) + + MIKEYState* getMIKEYState() const { return fMIKEYState != NULL ? fMIKEYState : fParent.getMIKEYState(); } + SRTPCryptographicContext* getCrypto() const { return fCrypto != NULL ? fCrypto : fParent.getCrypto(); } + +protected: + friend class MediaSession; + friend class MediaSubsessionIterator; + MediaSubsession(MediaSession& parent); + virtual ~MediaSubsession(); + + UsageEnvironment& env() { return fParent.envir(); } + void setNext(MediaSubsession* next) { fNext = next; } + + void setAttribute(char const* name, char const* value = NULL, Boolean valueIsHexadecimal = False); + + Boolean parseSDPLine_c(char const* sdpLine); + Boolean parseSDPLine_b(char const* sdpLine); + Boolean parseSDPAttribute_rtpmap(char const* sdpLine); + Boolean parseSDPAttribute_rtcpmux(char const* sdpLine); + Boolean parseSDPAttribute_control(char const* sdpLine); + Boolean parseSDPAttribute_range(char const* sdpLine); + Boolean parseSDPAttribute_fmtp(char const* sdpLine); + Boolean parseSDPAttribute_source_filter(char const* sdpLine); + Boolean parseSDPAttribute_x_dimensions(char const* sdpLine); + Boolean parseSDPAttribute_framerate(char const* sdpLine); + Boolean parseSDPAttribute_key_mgmt(char const* sdpLine); + + virtual Boolean createSourceObjects(int useSpecialRTPoffset); + // create "fRTPSource" and "fReadSource" member objects, after we've been initialized via SDP + +protected: + // Linkage fields: + MediaSession& fParent; + MediaSubsession* fNext; + + // Fields set from a SDP description: + char* fConnectionEndpointName; // may also be set by RTSP SETUP response + int fConnectionEndpointNameAddressFamily; + unsigned short fClientPortNum; // in host byte order + // This field is also set by initiate() + unsigned char fRTPPayloadFormat; + char* fSavedSDPLines; + char* fMediumName; + char* fCodecName; + char* fProtocolName; + unsigned fRTPTimestampFrequency; + Boolean fMultiplexRTCPWithRTP; + char* fControlPath; // holds optional a=control: string + + // Optional key management and crypto state: + MIKEYState* fMIKEYState; + SRTPCryptographicContext* fCrypto; + + struct sockaddr_storage fSourceFilterAddr; // used for SSM + unsigned fBandwidth; // in kilobits-per-second, from b= line + + double fPlayStartTime; + double fPlayEndTime; + char* fAbsStartTime; + char* fAbsEndTime; + unsigned short fVideoWidth, fVideoHeight; + // screen dimensions (set by an optional a=x-dimensions: , line) + unsigned fVideoFPS; + // frame rate (set by an optional "a=framerate: " or "a=x-framerate: " line) + unsigned fNumChannels; + // optionally set by "a=rtpmap:" lines for audio sessions. Default: 1 + float fScale; // set from a RTSP "Scale:" header + float fSpeed; + double fNPT_PTS_Offset; // set by "getNormalPlayTime()"; add this to a PTS to get NPT + HashTable* fAttributeTable; // for "a=fmtp:" attributes. (Later an array by payload type #####) + + // Fields set or used by initiate(): + Groupsock* fRTPSocket; Groupsock* fRTCPSocket; // works even for unicast + RTPSource* fRTPSource; RTCPInstance* fRTCPInstance; + FramedSource* fReadSource; + Boolean fReceiveRawMP3ADUs, fReceiveRawJPEGFrames; + + // Other fields: + char* fSessionId; // used by RTSP + + // added for audio back channel +public: + unsigned getFlag() { return fFlag; } + +protected: + Boolean parseSDPAttribute_flag(char const* sdpLine); + unsigned fFlag; // 0:recvonly, 1:sendonly + + RTPSink* fRTPSink; + virtual Boolean createBackChannelObjects(int useSpecialRTPoffset) {return False;}; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/MediaSink.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/MediaSink.hh new file mode 100644 index 000000000..272614e04 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/MediaSink.hh @@ -0,0 +1,135 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Media Sinks +// C++ header + +#ifndef _MEDIA_SINK_HH +#define _MEDIA_SINK_HH + +#ifndef _FRAMED_SOURCE_HH +#include "FramedSource.hh" +#endif + +class MediaSink: public Medium { +public: + static Boolean lookupByName(UsageEnvironment& env, char const* sinkName, + MediaSink*& resultSink); + + typedef void (afterPlayingFunc)(void* clientData); + Boolean startPlaying(MediaSource& source, + afterPlayingFunc* afterFunc, + void* afterClientData); + virtual void stopPlaying(); + + // Test for specific types of sink: + virtual Boolean isRTPSink() const; + + FramedSource* source() const {return fSource;} + +protected: + MediaSink(UsageEnvironment& env); // abstract base class + virtual ~MediaSink(); + + virtual Boolean sourceIsCompatibleWithUs(MediaSource& source); + // called by startPlaying() + virtual Boolean continuePlaying() = 0; + // called by startPlaying() + + static void onSourceClosure(void* clientData); // can be used in "getNextFrame()" calls + void onSourceClosure(); + // should be called (on ourselves) by continuePlaying() when it + // discovers that the source we're playing from has closed. + + FramedSource* fSource; + +private: + // redefined virtual functions: + virtual Boolean isSink() const; + +private: + // The following fields are used when we're being played: + afterPlayingFunc* fAfterFunc; + void* fAfterClientData; +}; + +// A data structure that a sink may use for an output packet: +class OutPacketBuffer { +public: + OutPacketBuffer(unsigned preferredPacketSize, unsigned maxPacketSize, + unsigned maxBufferSize = 0); + // if "maxBufferSize" is >0, use it - instead of "maxSize" to compute the buffer size + ~OutPacketBuffer(); + + static unsigned maxSize; + static void increaseMaxSizeTo(unsigned newMaxSize) { if (newMaxSize > OutPacketBuffer::maxSize) OutPacketBuffer::maxSize = newMaxSize; } + + unsigned char* curPtr() const {return &fBuf[fPacketStart + fCurOffset];} + unsigned totalBytesAvailable() const { + return fLimit - (fPacketStart + fCurOffset); + } + unsigned totalBufferSize() const { return fLimit; } + unsigned char* packet() const {return &fBuf[fPacketStart];} + unsigned curPacketSize() const {return fCurOffset;} + + void increment(unsigned numBytes) {fCurOffset += numBytes;} + + void enqueue(unsigned char const* from, unsigned numBytes); + void enqueueWord(u_int32_t word); + void insert(unsigned char const* from, unsigned numBytes, unsigned toPosition); + void insertWord(u_int32_t word, unsigned toPosition); + void extract(unsigned char* to, unsigned numBytes, unsigned fromPosition); + u_int32_t extractWord(unsigned fromPosition); + + void skipBytes(unsigned numBytes); + + Boolean isPreferredSize() const {return fCurOffset >= fPreferred;} + Boolean wouldOverflow(unsigned numBytes) const { + return (fCurOffset+numBytes) > fMax; + } + unsigned numOverflowBytes(unsigned numBytes) const { + return (fCurOffset+numBytes) - fMax; + } + Boolean isTooBigForAPacket(unsigned numBytes) const { + return numBytes > fMax; + } + + void setOverflowData(unsigned overflowDataOffset, + unsigned overflowDataSize, + struct timeval const& presentationTime, + unsigned durationInMicroseconds); + unsigned overflowDataSize() const {return fOverflowDataSize;} + struct timeval overflowPresentationTime() const {return fOverflowPresentationTime;} + unsigned overflowDurationInMicroseconds() const {return fOverflowDurationInMicroseconds;} + Boolean haveOverflowData() const {return fOverflowDataSize > 0;} + void useOverflowData(); + + void adjustPacketStart(unsigned numBytes); + void resetPacketStart(); + void resetOffset() { fCurOffset = 0; } + void resetOverflowData() { fOverflowDataOffset = fOverflowDataSize = 0; } + +private: + unsigned fPacketStart, fCurOffset, fPreferred, fMax, fLimit; + unsigned char* fBuf; + + unsigned fOverflowDataOffset, fOverflowDataSize; + struct timeval fOverflowPresentationTime; + unsigned fOverflowDurationInMicroseconds; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/MediaSource.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/MediaSource.hh new file mode 100644 index 000000000..e60f2e1fd --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/MediaSource.hh @@ -0,0 +1,59 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Media Sources +// C++ header + +#ifndef _MEDIA_SOURCE_HH +#define _MEDIA_SOURCE_HH + +#ifndef _MEDIA_HH +#include "Media.hh" +#endif + +class MediaSource: public Medium { +public: + static Boolean lookupByName(UsageEnvironment& env, char const* sourceName, + MediaSource*& resultSource); + virtual void getAttributes() const; + // attributes are returned in "env's" 'result message' + + // The MIME type of this source: + virtual char const* MIMEtype() const; + + // Test for specific types of source: + virtual Boolean isFramedSource() const; + virtual Boolean isRTPSource() const; + virtual Boolean isMPEG1or2VideoStreamFramer() const; + virtual Boolean isMPEG4VideoStreamFramer() const; + virtual Boolean isH264VideoStreamFramer() const; + virtual Boolean isH265VideoStreamFramer() const; + virtual Boolean isDVVideoStreamFramer() const; + virtual Boolean isJPEGVideoSource() const; + virtual Boolean isAMRAudioSource() const; + virtual Boolean isMPEG2TransportStreamMultiplexor() const; + +protected: + MediaSource(UsageEnvironment& env); // abstract base class + virtual ~MediaSource(); + +private: + // redefined virtual functions: + virtual Boolean isSource() const; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/MediaTranscodingTable.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/MediaTranscodingTable.hh new file mode 100644 index 000000000..8c64ddf94 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/MediaTranscodingTable.hh @@ -0,0 +1,66 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A class that implements a database that can be accessed to create +// "FramedFilter" (subclass) objects that transcode one codec into another. +// The implementation of this class just returns NULL for each codec lookup; +// To actually implement transcoding, you would subclass it. +// C++ header + +#ifndef _MEDIA_TRANSCODING_TABLE_HH +#define _MEDIA_TRANSCODING_TABLE_HH + +#ifndef _FRAMED_FILTER_HH +#include "FramedFilter.hh" +#endif +#ifndef _MEDIA_SESSION_HH +#include "MediaSession.hh" +#endif + +class MediaTranscodingTable: public Medium { +public: + virtual FramedFilter* + lookupTranscoder(MediaSubsession& /*inputCodecDescription*/, // in + char*& outputCodecName/* out; must be delete[]d later */) { + // Default implementation: Return NULL (indicating: no transcoding). + // You would reimplement this virtual function in a subclass to return a new 'transcoding' + // "FramedFilter" (subclass) object for each ("mediumName","codecName") that you wish to + // transcode (or return NULL for no transcoding). + // (Note that "inputCodecDescription" must have a non-NULL "readSource()"; this is used + // as the input to the new "FramedFilter" (subclass) object.) + outputCodecName = NULL; + return NULL; + } + + virtual Boolean weWillTranscode(char const* /*mediumName*/, char const* /*codecName*/) { + // Default implementation: Return False. + // You would reimplement this in a subclass - returning True for each + // / for which you'll do transcoding. + // Note: Unlike "lookupTranscoder()", this function does not actually create any 'transcoding' + // filter objects. (It may be called before "MediaSubsession::initiate()".) + return False; + } + +protected: // we are to be subclassed only + MediaTranscodingTable(UsageEnvironment& env) + : Medium(env) { + } + virtual ~MediaTranscodingTable() { + } +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/MultiFramedRTPSink.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/MultiFramedRTPSink.hh new file mode 100644 index 000000000..3d2882833 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/MultiFramedRTPSink.hh @@ -0,0 +1,140 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP sink for a common kind of payload format: Those which pack multiple, +// complete codec frames (as many as possible) into each RTP packet. +// C++ header + +#ifndef _MULTI_FRAMED_RTP_SINK_HH +#define _MULTI_FRAMED_RTP_SINK_HH + +#ifndef _RTP_SINK_HH +#include "RTPSink.hh" +#endif + +class MultiFramedRTPSink: public RTPSink { +public: + void setPacketSizes(unsigned preferredPacketSize, unsigned maxPacketSize); + + typedef void (onSendErrorFunc)(void* clientData); + void setOnSendErrorFunc(onSendErrorFunc* onSendErrorFunc, void* onSendErrorFuncData) { + // Can be used to set a callback function to be called if there's an error sending RTP packets on our socket. + fOnSendErrorFunc = onSendErrorFunc; + fOnSendErrorData = onSendErrorFuncData; + } + +protected: + MultiFramedRTPSink(UsageEnvironment& env, + Groupsock* rtpgs, unsigned char rtpPayloadType, + unsigned rtpTimestampFrequency, + char const* rtpPayloadFormatName, + unsigned numChannels = 1); + // we're a virtual base class + + virtual ~MultiFramedRTPSink(); + + virtual void doSpecialFrameHandling(unsigned fragmentationOffset, + unsigned char* frameStart, + unsigned numBytesInFrame, + struct timeval framePresentationTime, + unsigned numRemainingBytes); + // perform any processing specific to the particular payload format + virtual Boolean allowFragmentationAfterStart() const; + // whether a frame can be fragmented if other frame(s) appear earlier + // in the packet (by default: False) + virtual Boolean allowOtherFramesAfterLastFragment() const; + // whether other frames can be packed into a packet following the + // final fragment of a previous, fragmented frame (by default: False) + virtual Boolean frameCanAppearAfterPacketStart(unsigned char const* frameStart, + unsigned numBytesInFrame) const; + // whether this frame can appear in position >1 in a pkt (default: True) + virtual unsigned specialHeaderSize() const; + // returns the size of any special header used (following the RTP header) (default: 0) + virtual unsigned frameSpecificHeaderSize() const; + // returns the size of any frame-specific header used (before each frame + // within the packet) (default: 0) + virtual unsigned computeOverflowForNewFrame(unsigned newFrameSize) const; + // returns the number of overflow bytes that would be produced by adding a new + // frame of size "newFrameSize" to the current RTP packet. + // (By default, this just calls "numOverflowBytes()", but subclasses can redefine + // this to (e.g.) impose a granularity upon RTP payload fragments.) + + // Functions that might be called by doSpecialFrameHandling(), or other subclass virtual functions: + Boolean isFirstPacket() const { return fIsFirstPacket; } + Boolean isFirstFrameInPacket() const { return fNumFramesUsedSoFar == 0; } + unsigned curFragmentationOffset() const { return fCurFragmentationOffset; } + void setMarkerBit(); + void setTimestamp(struct timeval framePresentationTime); + void setSpecialHeaderWord(unsigned word, /* 32 bits, in host order */ + unsigned wordPosition = 0); + void setSpecialHeaderBytes(unsigned char const* bytes, unsigned numBytes, + unsigned bytePosition = 0); + void setFrameSpecificHeaderWord(unsigned word, /* 32 bits, in host order */ + unsigned wordPosition = 0); + void setFrameSpecificHeaderBytes(unsigned char const* bytes, unsigned numBytes, + unsigned bytePosition = 0); + void setFramePadding(unsigned numPaddingBytes); + unsigned numFramesUsedSoFar() const { return fNumFramesUsedSoFar; } + unsigned ourMaxPacketSize() const { return fOurMaxPacketSize; } + +public: // redefined virtual functions: + virtual void stopPlaying(); + +protected: // redefined virtual functions: + virtual Boolean continuePlaying(); + +private: + void buildAndSendPacket(Boolean isFirstPacket); + void packFrame(); + void sendPacketIfNecessary(); + static void sendNext(void* firstArg); + friend void sendNext(void*); + + static void afterGettingFrame(void* clientData, + unsigned numBytesRead, unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + void afterGettingFrame1(unsigned numBytesRead, unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + Boolean isTooBigForAPacket(unsigned numBytes) const; + + static void ourHandleClosure(void* clientData); + +private: + OutPacketBuffer* fOutBuf; + + Boolean fNoFramesLeft; + unsigned fNumFramesUsedSoFar; + unsigned fCurFragmentationOffset; + Boolean fPreviousFrameEndedFragmentation; + + Boolean fIsFirstPacket; + struct timeval fNextSendTime; + unsigned fTimestampPosition; + unsigned fSpecialHeaderPosition; + unsigned fSpecialHeaderSize; // size in bytes of any special header used + unsigned fCurFrameSpecificHeaderPosition; + unsigned fCurFrameSpecificHeaderSize; // size in bytes of cur frame-specific header + unsigned fTotalFrameSpecificHeaderSizes; // size of all frame-specific hdrs in pkt + unsigned fOurMaxPacketSize; + + onSendErrorFunc* fOnSendErrorFunc; + void* fOnSendErrorData; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/MultiFramedRTPSource.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/MultiFramedRTPSource.hh new file mode 100644 index 000000000..20134a572 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/MultiFramedRTPSource.hh @@ -0,0 +1,159 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP source for a common kind of payload format: Those which pack multiple, +// complete codec frames (as many as possible) into each RTP packet. +// C++ header + +#ifndef _MULTI_FRAMED_RTP_SOURCE_HH +#define _MULTI_FRAMED_RTP_SOURCE_HH + +#ifndef _RTP_SOURCE_HH +#include "RTPSource.hh" +#endif + +class BufferedPacket; // forward +class BufferedPacketFactory; // forward + +class MultiFramedRTPSource: public RTPSource { +protected: + MultiFramedRTPSource(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency, + BufferedPacketFactory* packetFactory = NULL); + // virtual base class + virtual ~MultiFramedRTPSource(); + + virtual Boolean processSpecialHeader(BufferedPacket* packet, + unsigned& resultSpecialHeaderSize); + // Subclasses redefine this to handle any special, payload format + // specific header that follows the RTP header. + + virtual Boolean packetIsUsableInJitterCalculation(unsigned char* packet, + unsigned packetSize); + // The default implementation returns True, but this can be redefined + +protected: + Boolean fCurrentPacketBeginsFrame; + Boolean fCurrentPacketCompletesFrame; + +protected: + // redefined virtual functions: + virtual void doGetNextFrame(); + virtual void doStopGettingFrames(); + +private: + // redefined virtual functions: + virtual void setPacketReorderingThresholdTime(unsigned uSeconds); + +private: + void reset(); + void doGetNextFrame1(); + + static void networkReadHandler(MultiFramedRTPSource* source, int /*mask*/); + void networkReadHandler1(); + + Boolean fAreDoingNetworkReads; + BufferedPacket* fPacketReadInProgress; + Boolean fNeedDelivery; + Boolean fPacketLossInFragmentedFrame; + unsigned char* fSavedTo; + unsigned fSavedMaxSize; + + // A buffer to (optionally) hold incoming pkts that have been reorderered + class ReorderingPacketBuffer* fReorderingBuffer; +}; + + +// A 'packet data' class that's used to implement the above. +// Note that this can be subclassed - if desired - to redefine +// "nextEnclosedFrameParameters()". + +class BufferedPacket { +public: + BufferedPacket(); + virtual ~BufferedPacket(); + + Boolean hasUsableData() const { return fTail > fHead; } + unsigned useCount() const { return fUseCount; } + + Boolean fillInData(RTPInterface& rtpInterface, struct sockaddr_storage& fromAddress, Boolean& packetReadWasIncomplete); + void assignMiscParams(unsigned short rtpSeqNo, unsigned rtpTimestamp, + struct timeval presentationTime, + Boolean hasBeenSyncedUsingRTCP, + Boolean rtpMarkerBit, struct timeval timeReceived); + void skip(unsigned numBytes); // used to skip over an initial header + void removePadding(unsigned numBytes); // used to remove trailing bytes + void appendData(unsigned char* newData, unsigned numBytes); + void use(unsigned char* to, unsigned toSize, + unsigned& bytesUsed, unsigned& bytesTruncated, + unsigned short& rtpSeqNo, unsigned& rtpTimestamp, + struct timeval& presentationTime, + Boolean& hasBeenSyncedUsingRTCP, Boolean& rtpMarkerBit); + + BufferedPacket*& nextPacket() { return fNextPacket; } + + unsigned short rtpSeqNo() const { return fRTPSeqNo; } + struct timeval const& timeReceived() const { return fTimeReceived; } + + unsigned char* data() const { return &fBuf[fHead]; } + unsigned dataSize() const { return fTail-fHead; } + Boolean rtpMarkerBit() const { return fRTPMarkerBit; } + Boolean& isFirstPacket() { return fIsFirstPacket; } + unsigned bytesAvailable() const { return fPacketSize - fTail; } + +protected: + virtual void reset(); + virtual unsigned nextEnclosedFrameSize(unsigned char*& framePtr, + unsigned dataSize); + // The above function has been deprecated. Instead, new subclasses should use: + virtual void getNextEnclosedFrameParameters(unsigned char*& framePtr, + unsigned dataSize, + unsigned& frameSize, + unsigned& frameDurationInMicroseconds); + + unsigned fPacketSize; + unsigned char* fBuf; + unsigned fHead; + unsigned fTail; + +private: + BufferedPacket* fNextPacket; // used to link together packets + + unsigned fUseCount; + unsigned short fRTPSeqNo; + unsigned fRTPTimestamp; + struct timeval fPresentationTime; // corresponding to "fRTPTimestamp" + Boolean fHasBeenSyncedUsingRTCP; + Boolean fRTPMarkerBit; + Boolean fIsFirstPacket; + struct timeval fTimeReceived; +}; + +// A 'factory' class for creating "BufferedPacket" objects. +// If you want to subclass "BufferedPacket", then you'll also +// want to subclass this, to redefine createNewPacket() + +class BufferedPacketFactory { +public: + BufferedPacketFactory(); + virtual ~BufferedPacketFactory(); + + virtual BufferedPacket* createNewPacket(MultiFramedRTPSource* ourSource); +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/OggFile.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/OggFile.hh new file mode 100644 index 000000000..67b633f29 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/OggFile.hh @@ -0,0 +1,179 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A class that encapsulates an Ogg file +// C++ header + +#ifndef _OGG_FILE_HH +#define _OGG_FILE_HH + +#ifndef _RTP_SINK_HH +#include "RTPSink.hh" +#endif +#ifndef _HASH_TABLE_HH +#include "HashTable.hh" +#endif + +class OggTrack; // forward +class OggDemux; // forward + +typedef void OggDemuxOnDeletionFunc(void* objectToNotify, OggDemux* demuxBeingDeleted); + +class OggFile: public Medium { +public: + typedef void (onCreationFunc)(OggFile* newFile, void* clientData); + static void createNew(UsageEnvironment& env, char const* fileName, + onCreationFunc* onCreation, void* onCreationClientData); + // Note: Unlike most "createNew()" functions, this one doesn't return a new object + // immediately. Instead, because this class requires file reading (to parse the + // Ogg track headers) before a new object can be initialized, the creation of a new object + // is signalled by calling - from the event loop - an 'onCreationFunc' that is passed as + // a parameter to "createNew()". + + OggTrack* lookup(u_int32_t trackNumber); + + OggDemux* newDemux(OggDemuxOnDeletionFunc* onDeletionFunc = NULL, void* objectToNotify = NULL); + // Creates a demultiplexor for extracting tracks from this file. + // (Separate clients will typically have separate demultiplexors.) + + char const* fileName() const { return fFileName; } + unsigned numTracks() const; + + FramedSource* + createSourceForStreaming(FramedSource* baseSource, u_int32_t trackNumber, + unsigned& estBitrate, unsigned& numFiltersInFrontOfTrack); + // Takes a data source (which must be a demultiplexed track from this file) and returns + // a (possibly modified) data source that can be used for streaming. + + RTPSink* createRTPSinkForTrackNumber(u_int32_t trackNumber, Groupsock* rtpGroupsock, + unsigned char rtpPayloadTypeIfDynamic); + // Creates a "RTPSink" object that would be appropriate for streaming the specified track, + // or NULL if no appropriate "RTPSink" exists + + class OggTrackTable& trackTable() { return *fTrackTable; } + +private: + OggFile(UsageEnvironment& env, char const* fileName, onCreationFunc* onCreation, void* onCreationClientData); + // called only by createNew() + virtual ~OggFile(); + + static void handleEndOfBosPageParsing(void* clientData); + void handleEndOfBosPageParsing(); + + void addTrack(OggTrack* newTrack); + void removeDemux(OggDemux* demux); + +private: + friend class OggFileParser; + friend class OggDemux; + char const* fFileName; + onCreationFunc* fOnCreation; + void* fOnCreationClientData; + + class OggTrackTable* fTrackTable; + HashTable* fDemuxesTable; + class OggFileParser* fParserForInitialization; +}; + +class OggTrack { +public: + OggTrack(); + virtual ~OggTrack(); + + // track parameters + u_int32_t trackNumber; // bitstream serial number + char const* mimeType; // NULL if not known + + unsigned samplingFrequency, numChannels; // for audio tracks + unsigned estBitrate; // estimate, in kbps (for RTCP) + + // Special headers for Vorbis audio, Theora video, and Opus audio tracks: + struct _vtoHdrs { + u_int8_t* header[3]; // "identification", "comment", "setup" + unsigned headerSize[3]; + + // Fields specific to Vorbis audio: + unsigned blocksize[2]; // samples per frame (packet) + unsigned uSecsPerPacket[2]; // computed as (blocksize[i]*1000000)/samplingFrequency + unsigned vorbis_mode_count; + unsigned ilog_vorbis_mode_count_minus_1; + u_int8_t* vorbis_mode_blockflag; + // an array (of size "vorbis_mode_count") of indexes into the (2-entry) "blocksize" array + + // Fields specific to Theora video: + u_int8_t KFGSHIFT; + unsigned uSecsPerFrame; + + } vtoHdrs; + + Boolean weNeedHeaders() const { + return + vtoHdrs.header[0] == NULL || + vtoHdrs.header[1] == NULL || + (vtoHdrs.header[2] == NULL && strcmp(mimeType, "audio/OPUS") != 0); + } +}; + +class OggTrackTableIterator { +public: + OggTrackTableIterator(class OggTrackTable& ourTable); + virtual ~OggTrackTableIterator(); + + OggTrack* next(); + +private: + HashTable::Iterator* fIter; +}; + +class OggDemux: public Medium { +public: + FramedSource* newDemuxedTrack(u_int32_t& resultTrackNumber); + // Returns a new stream ("FramedSource" subclass) that represents the next media track + // from the file. This function returns NULL when no more media tracks exist. + + FramedSource* newDemuxedTrackByTrackNumber(unsigned trackNumber); + // As above, but creates a new stream for a specific track number within the Matroska file. + // (You should not call this function more than once with the same track number.) + + // Note: We assume that: + // - Every track created by "newDemuxedTrack()" is later read + // - All calls to "newDemuxedTrack()" are made before any track is read + +protected: + friend class OggFile; + friend class OggFileParser; + class OggDemuxedTrack* lookupDemuxedTrack(u_int32_t trackNumber); + + OggDemux(OggFile& ourFile); + virtual ~OggDemux(); + +private: + friend class OggDemuxedTrack; + void removeTrack(u_int32_t trackNumber); + void continueReading(); // called by a demuxed track to tell us that it has a pending read ("doGetNextFrame()") + + static void handleEndOfFile(void* clientData); + void handleEndOfFile(); + +private: + OggFile& fOurFile; + class OggFileParser* fOurParser; + HashTable* fDemuxedTracksTable; + OggTrackTableIterator* fIter; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/OggFileServerDemux.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/OggFileServerDemux.hh new file mode 100644 index 000000000..1abf35fa5 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/OggFileServerDemux.hh @@ -0,0 +1,85 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A server demultiplexor for an Ogg file +// C++ header + +#ifndef _OGG_FILE_SERVER_DEMUX_HH +#define _OGG_FILE_SERVER_DEMUX_HH + +#ifndef _SERVER_MEDIA_SESSION_HH +#include "ServerMediaSession.hh" +#endif + +#ifndef _OGG_FILE_HH +#include "OggFile.hh" +#endif + +class OggFileServerDemux: public Medium { +public: + typedef void (onCreationFunc)(OggFileServerDemux* newDemux, void* clientData); + static void createNew(UsageEnvironment& env, char const* fileName, + onCreationFunc* onCreation, void* onCreationClientData); + // Note: Unlike most "createNew()" functions, this one doesn't return a new object immediately. Instead, because this class + // requires file reading (to parse the Ogg 'Track' headers) before a new object can be initialized, the creation of a new + // object is signalled by calling - from the event loop - an 'onCreationFunc' that is passed as a parameter to "createNew()". + + ServerMediaSubsession* newServerMediaSubsession(); + ServerMediaSubsession* newServerMediaSubsession(u_int32_t& resultTrackNumber); + // Returns a new "ServerMediaSubsession" object that represents the next media track + // from the file. This function returns NULL when no more media tracks exist. + + ServerMediaSubsession* newServerMediaSubsessionByTrackNumber(u_int32_t trackNumber); + // As above, but creates a new "ServerMediaSubsession" object for a specific track number + // within the Ogg file. + // (You should not call this function more than once with the same track number.) + + // The following public: member functions are called only by the "ServerMediaSubsession" objects: + + OggFile* ourOggFile() { return fOurOggFile; } + char const* fileName() const { return fFileName; } + + FramedSource* newDemuxedTrack(unsigned clientSessionId, u_int32_t trackNumber); + // Used by the "ServerMediaSubsession" objects to implement their "createNewStreamSource()" virtual function. + +private: + OggFileServerDemux(UsageEnvironment& env, char const* fileName, + onCreationFunc* onCreation, void* onCreationClientData); + // called only by createNew() + virtual ~OggFileServerDemux(); + + static void onOggFileCreation(OggFile* newFile, void* clientData); + void onOggFileCreation(OggFile* newFile); + + static void onDemuxDeletion(void* clientData, OggDemux* demuxBeingDeleted); + void onDemuxDeletion(OggDemux* demuxBeingDeleted); + +private: + char const* fFileName; + onCreationFunc* fOnCreation; + void* fOnCreationClientData; + OggFile* fOurOggFile; + + // Used to implement "newServerMediaSubsession()": + OggTrackTableIterator* fIter; + + // Used to set up demuxing, to implement "newDemuxedTrack()": + unsigned fLastClientSessionId; + OggDemux* fLastCreatedDemux; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/OggFileSink.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/OggFileSink.hh new file mode 100644 index 000000000..c657208e0 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/OggFileSink.hh @@ -0,0 +1,79 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// 'Ogg' File Sink (recording a single media track only) +// C++ header + +#ifndef _OGG_FILE_SINK_HH +#define _OGG_FILE_SINK_HH + +#ifndef _FILE_SINK_HH +#include "FileSink.hh" +#endif + +class OggFileSink: public FileSink { +public: + static OggFileSink* createNew(UsageEnvironment& env, char const* fileName, + unsigned samplingFrequency = 0, // used for granule_position + char const* configStr = NULL, + // "configStr" is an optional 'SDP format' string (Base64-encoded) + // representing 'packed configuration headers' ("identification", "comment", "setup") + // to prepend to the output. (For 'Vorbis" audio and 'Theora' video.) + unsigned bufferSize = 100000, + Boolean oneFilePerFrame = False); + // See "FileSink.hh" for a description of these parameters. + +protected: + OggFileSink(UsageEnvironment& env, FILE* fid, unsigned samplingFrequency, char const* configStr, + unsigned bufferSize, char const* perFrameFileNamePrefix); + // called only by createNew() + virtual ~OggFileSink(); + +protected: // redefined virtual functions: + virtual Boolean continuePlaying(); + virtual void addData(unsigned char const* data, unsigned dataSize, + struct timeval presentationTime); + virtual void afterGettingFrame(unsigned frameSize, unsigned numTruncatedBytes, + struct timeval presentationTime); + +private: + static void ourOnSourceClosure(void* clientData); + void ourOnSourceClosure(); + +private: + unsigned fSamplingFrequency; + char const* fConfigStr; + Boolean fHaveWrittenFirstFrame, fHaveSeenEOF; + struct timeval fFirstPresentationTime; + int64_t fGranulePosition; + int64_t fGranulePositionAdjustment; // used to ensure that "fGranulePosition" stays monotonic + u_int32_t fPageSequenceNumber; + u_int8_t fPageHeaderBytes[27]; + // the header of each Ogg page, through the "number_page_segments" byte + + // Special fields used for Theora video: + Boolean fIsTheora; + u_int64_t fGranuleIncrementPerFrame; // == 1 << KFGSHIFT + + // Because the last Ogg page before EOF needs to have a special 'eos' bit set in the header, + // we need to defer the writing of each incoming frame. To do this, we maintain a 2nd buffer: + unsigned char* fAltBuffer; + unsigned fAltFrameSize, fAltNumTruncatedBytes; + struct timeval fAltPresentationTime; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/OnDemandServerMediaSubsession.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/OnDemandServerMediaSubsession.hh new file mode 100644 index 000000000..2ef86795e --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/OnDemandServerMediaSubsession.hh @@ -0,0 +1,233 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A 'ServerMediaSubsession' object that creates new, unicast, "RTPSink"s +// on demand. +// C++ header + +#ifndef _ON_DEMAND_SERVER_MEDIA_SUBSESSION_HH +#define _ON_DEMAND_SERVER_MEDIA_SUBSESSION_HH + +#ifndef _SERVER_MEDIA_SESSION_HH +#include "ServerMediaSession.hh" +#endif +#ifndef _RTP_SINK_HH +#include "RTPSink.hh" +#endif +#ifndef _BASIC_UDP_SINK_HH +#include "BasicUDPSink.hh" +#endif +#ifndef _RTCP_HH +#include "RTCP.hh" +#endif + +class OnDemandServerMediaSubsession: public ServerMediaSubsession { +protected: // we're a virtual base class + OnDemandServerMediaSubsession(UsageEnvironment& env, Boolean reuseFirstSource, + portNumBits initialPortNum = 6970, + Boolean multiplexRTCPWithRTP = False); + virtual ~OnDemandServerMediaSubsession(); + +protected: // redefined virtual functions + virtual char const* sdpLines(int addressFamily); + virtual void getStreamParameters(unsigned clientSessionId, + struct sockaddr_storage const& clientAddress, + Port const& clientRTPPort, + Port const& clientRTCPPort, + int tcpSocketNum, + unsigned char rtpChannelId, + unsigned char rtcpChannelId, + TLSState* tlsState, + struct sockaddr_storage& destinationAddress, + u_int8_t& destinationTTL, + Boolean& isMulticast, + Port& serverRTPPort, + Port& serverRTCPPort, + void*& streamToken); + virtual void startStream(unsigned clientSessionId, void* streamToken, + TaskFunc* rtcpRRHandler, + void* rtcpRRHandlerClientData, + unsigned short& rtpSeqNum, + unsigned& rtpTimestamp, + ServerRequestAlternativeByteHandler* serverRequestAlternativeByteHandler, + void* serverRequestAlternativeByteHandlerClientData); + virtual void pauseStream(unsigned clientSessionId, void* streamToken); + virtual void seekStream(unsigned clientSessionId, void* streamToken, double& seekNPT, double streamDuration, u_int64_t& numBytes); + virtual void seekStream(unsigned clientSessionId, void* streamToken, char*& absStart, char*& absEnd); + virtual void nullSeekStream(unsigned clientSessionId, void* streamToken, + double streamEndTime, u_int64_t& numBytes); + virtual void setStreamScale(unsigned clientSessionId, void* streamToken, float scale); + virtual float getCurrentNPT(void* streamToken); + virtual FramedSource* getStreamSource(void* streamToken); + virtual void getRTPSinkandRTCP(void* streamToken, + RTPSink const*& rtpSink, RTCPInstance const*& rtcp); + virtual void deleteStream(unsigned clientSessionId, void*& streamToken); + +protected: // new virtual functions, possibly redefined by subclasses + virtual char const* getAuxSDPLine(RTPSink* rtpSink, + FramedSource* inputSource); + virtual void seekStreamSource(FramedSource* inputSource, double& seekNPT, double streamDuration, u_int64_t& numBytes); + // This routine is used to seek by relative (i.e., NPT) time. + // "streamDuration", if >0.0, specifies how much data to stream, past "seekNPT". (If <=0.0, all remaining data is streamed.) + // "numBytes" returns the size (in bytes) of the data to be streamed, or 0 if unknown or unlimited. + virtual void seekStreamSource(FramedSource* inputSource, char*& absStart, char*& absEnd); + // This routine is used to seek by 'absolute' time. + // "absStart" should be a string of the form "YYYYMMDDTHHMMSSZ" or "YYYYMMDDTHHMMSS.Z". + // "absEnd" should be either NULL (for no end time), or a string of the same form as "absStart". + // These strings may be modified in-place, or can be reassigned to a newly-allocated value (after delete[]ing the original). + virtual void setStreamSourceScale(FramedSource* inputSource, float scale); + virtual void setStreamSourceDuration(FramedSource* inputSource, double streamDuration, u_int64_t& numBytes); + virtual void closeStreamSource(FramedSource* inputSource); + +protected: // new virtual functions, defined by all subclasses + virtual FramedSource* createNewStreamSource(unsigned clientSessionId, + unsigned& estBitrate) = 0; + // "estBitrate" is the stream's estimated bitrate, in kbps + virtual RTPSink* createNewRTPSink(Groupsock* rtpGroupsock, + unsigned char rtpPayloadTypeIfDynamic, + FramedSource* inputSource) = 0; + +protected: // new virtual functions, may be redefined by a subclass: + virtual Groupsock* createGroupsock(struct sockaddr_storage const& addr, Port port); + virtual RTCPInstance* createRTCP(Groupsock* RTCPgs, unsigned totSessionBW, /* in kbps */ + unsigned char const* cname, RTPSink* sink); + +public: + void multiplexRTCPWithRTP() { fMultiplexRTCPWithRTP = True; } + // An alternative to passing the "multiplexRTCPWithRTP" parameter as True in the constructor + + void setRTCPAppPacketHandler(RTCPAppHandlerFunc* handler, void* clientData); + // Sets a handler to be called if a RTCP "APP" packet arrives from any future client. + // (Any current clients are not affected; any "APP" packets from them will continue to be + // handled by whatever handler existed when the client sent its first RTSP "PLAY" command.) + // (Call with (NULL, NULL) to remove an existing handler - for future clients only) + + void sendRTCPAppPacket(u_int8_t subtype, char const* name, + u_int8_t* appDependentData, unsigned appDependentDataSize); + // Sends a custom RTCP "APP" packet to the most recent client (if "reuseFirstSource" was False), + // or to all current clients (if "reuseFirstSource" was True). + // The parameters correspond to their + // respective fields as described in the RTP/RTCP definition (RFC 3550). + // Note that only the low-order 5 bits of "subtype" are used, and only the first 4 bytes + // of "name" are used. (If "name" has fewer than 4 bytes, or is NULL, + // then the remaining bytes are '\0'.) + +protected: + void setSDPLinesFromRTPSink(RTPSink* rtpSink, FramedSource* inputSource, + unsigned estBitrate); + // used to implement "sdpLines()" + +protected: + char* fSDPLines; + u_int8_t* fMIKEYStateMessage; // used if we're streaming SRTP + unsigned fMIKEYStateMessageSize; // ditto + HashTable* fDestinationsHashTable; // indexed by client session id + +private: + Boolean fReuseFirstSource; + portNumBits fInitialPortNum; + Boolean fMultiplexRTCPWithRTP; + void* fLastStreamToken; + char fCNAME[100]; // for RTCP + RTCPAppHandlerFunc* fAppHandlerTask; + void* fAppHandlerClientData; + friend class StreamState; +}; + + +// A class that represents the state of an ongoing stream. This is used only internally, in the implementation of +// "OnDemandServerMediaSubsession", but we expose the definition here, in case subclasses of "OnDemandServerMediaSubsession" +// want to access it. + +class Destinations { +public: + Destinations(struct sockaddr_storage const& destAddr, + Port const& rtpDestPort, + Port const& rtcpDestPort) + : isTCP(False), addr(destAddr), rtpPort(rtpDestPort), rtcpPort(rtcpDestPort) { + } + Destinations(int tcpSockNum, unsigned char rtpChanId, unsigned char rtcpChanId, + TLSState* tlsSt) + : isTCP(True), rtpPort(0) /*dummy*/, rtcpPort(0) /*dummy*/, + tcpSocketNum(tcpSockNum), rtpChannelId(rtpChanId), rtcpChannelId(rtcpChanId), + tlsState(tlsSt) { + } + +public: + Boolean isTCP; + struct sockaddr_storage addr; + Port rtpPort; + Port rtcpPort; + int tcpSocketNum; + unsigned char rtpChannelId, rtcpChannelId; + TLSState* tlsState; +}; + +class StreamState { +public: + StreamState(OnDemandServerMediaSubsession& master, + Port const& serverRTPPort, Port const& serverRTCPPort, + RTPSink* rtpSink, BasicUDPSink* udpSink, + unsigned totalBW, FramedSource* mediaSource, + Groupsock* rtpGS, Groupsock* rtcpGS); + virtual ~StreamState(); + + void startPlaying(Destinations* destinations, unsigned clientSessionId, + TaskFunc* rtcpRRHandler, void* rtcpRRHandlerClientData, + ServerRequestAlternativeByteHandler* serverRequestAlternativeByteHandler, + void* serverRequestAlternativeByteHandlerClientData); + void pause(); + void sendRTCPAppPacket(u_int8_t subtype, char const* name, + u_int8_t* appDependentData, unsigned appDependentDataSize); + void endPlaying(Destinations* destinations, unsigned clientSessionId); + void reclaim(); + + unsigned& referenceCount() { return fReferenceCount; } + + Port const& serverRTPPort() const { return fServerRTPPort; } + Port const& serverRTCPPort() const { return fServerRTCPPort; } + + RTPSink* rtpSink() const { return fRTPSink; } + RTCPInstance* rtcpInstance() const { return fRTCPInstance; } + + float streamDuration() const { return fStreamDuration; } + + FramedSource* mediaSource() const { return fMediaSource; } + float& startNPT() { return fStartNPT; } + +private: + OnDemandServerMediaSubsession& fMaster; + Boolean fAreCurrentlyPlaying; + unsigned fReferenceCount; + + Port fServerRTPPort, fServerRTCPPort; + + RTPSink* fRTPSink; + BasicUDPSink* fUDPSink; + + float fStreamDuration; + unsigned fTotalBW; + RTCPInstance* fRTCPInstance; + + FramedSource* fMediaSource; + float fStartNPT; // initial 'normal play time'; reset after each seek + + Groupsock* fRTPgs; + Groupsock* fRTCPgs; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/OutputFile.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/OutputFile.hh new file mode 100644 index 000000000..fb0879ac3 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/OutputFile.hh @@ -0,0 +1,31 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Common routines for opening/closing named output files +// C++ header + +#ifndef _OUTPUT_FILE_HH +#define _OUTPUT_FILE_HH + +#include +#include + +FILE* OpenOutputFile(UsageEnvironment& env, char const* fileName); + +void CloseOutputFile(FILE* fid); + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/PassiveServerMediaSubsession.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/PassiveServerMediaSubsession.hh new file mode 100644 index 000000000..f81af6031 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/PassiveServerMediaSubsession.hh @@ -0,0 +1,83 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A 'ServerMediaSubsession' object that represents an existing +// 'RTPSink', rather than one that creates new 'RTPSink's on demand. +// C++ header + +#ifndef _PASSIVE_SERVER_MEDIA_SUBSESSION_HH +#define _PASSIVE_SERVER_MEDIA_SUBSESSION_HH + +#ifndef _SERVER_MEDIA_SESSION_HH +#include "ServerMediaSession.hh" +#endif + +#ifndef _RTP_SINK_HH +#include "RTPSink.hh" +#endif +#ifndef _RTCP_HH +#include "RTCP.hh" +#endif + +class PassiveServerMediaSubsession: public ServerMediaSubsession { +public: + static PassiveServerMediaSubsession* createNew(RTPSink& rtpSink, + RTCPInstance* rtcpInstance = NULL); + +protected: + PassiveServerMediaSubsession(RTPSink& rtpSink, RTCPInstance* rtcpInstance); + // called only by createNew(); + virtual ~PassiveServerMediaSubsession(); + + virtual Boolean rtcpIsMuxed(); + +protected: // redefined virtual functions + virtual char const* sdpLines(int addressFamily); + virtual void getStreamParameters(unsigned clientSessionId, + struct sockaddr_storage const& clientAddress, + Port const& clientRTPPort, + Port const& clientRTCPPort, + int tcpSocketNum, + unsigned char rtpChannelId, + unsigned char rtcpChannelId, + TLSState* tlsSTate, + struct sockaddr_storage& destinationAddress, + u_int8_t& destinationTTL, + Boolean& isMulticast, + Port& serverRTPPort, + Port& serverRTCPPort, + void*& streamToken); + virtual void startStream(unsigned clientSessionId, void* streamToken, + TaskFunc* rtcpRRHandler, + void* rtcpRRHandlerClientData, + unsigned short& rtpSeqNum, + unsigned& rtpTimestamp, + ServerRequestAlternativeByteHandler* serverRequestAlternativeByteHandler, + void* serverRequestAlternativeByteHandlerClientData); + virtual float getCurrentNPT(void* streamToken); + virtual void getRTPSinkandRTCP(void* streamToken, + RTPSink const*& rtpSink, RTCPInstance const*& rtcp); + virtual void deleteStream(unsigned clientSessionId, void*& streamToken); + +protected: + char* fSDPLines; + RTPSink& fRTPSink; + RTCPInstance* fRTCPInstance; + HashTable* fClientRTCPSourceRecords; // indexed by client session id; used to implement RTCP "RR" handling +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/ProxyServerMediaSession.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/ProxyServerMediaSession.hh new file mode 100644 index 000000000..9dba2db75 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/ProxyServerMediaSession.hh @@ -0,0 +1,238 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A subclass of "ServerMediaSession" that can be used to create a (unicast) RTSP servers that acts as a 'proxy' for +// another (unicast or multicast) RTSP/RTP stream. +// C++ header + +#ifndef _PROXY_SERVER_MEDIA_SESSION_HH +#define _PROXY_SERVER_MEDIA_SESSION_HH + +#ifndef _SERVER_MEDIA_SESSION_HH +#include "ServerMediaSession.hh" +#endif +#ifndef _MEDIA_SESSION_HH +#include "MediaSession.hh" +#endif +#ifndef _RTSP_CLIENT_HH +#include "RTSPClient.hh" +#endif +#ifndef _MEDIA_TRANSCODING_TABLE_HH +#include "MediaTranscodingTable.hh" +#endif + +// A subclass of "RTSPClient", used to refer to the particular "ProxyServerMediaSession" object being used. +// It is used only within the implementation of "ProxyServerMediaSession", but is defined here, in case developers wish to +// subclass it. + +class ProxyRTSPClient: public RTSPClient { +public: + ProxyRTSPClient(class ProxyServerMediaSession& ourServerMediaSession, char const* rtspURL, + char const* username, char const* password, + portNumBits tunnelOverHTTPPortNum, int verbosityLevel, int socketNumToServer); + virtual ~ProxyRTSPClient(); + + void continueAfterDESCRIBE(char const* sdpDescription); + void continueAfterLivenessCommand(int resultCode, Boolean serverSupportsGetParameter); + void continueAfterSETUP(int resultCode); + void continueAfterPLAY(int resultCode); + void scheduleReset(); + +private: + void reset(); + int connectToServer(int socketNum, portNumBits remotePortNum); + + Authenticator* auth() { return fOurAuthenticator; } + + void scheduleLivenessCommand(); + static void sendLivenessCommand(void* clientData); + void doReset(); + static void doReset(void* clientData); + + void scheduleDESCRIBECommand(); + static void sendDESCRIBE(void* clientData); + void sendDESCRIBE(); + + static void subsessionTimeout(void* clientData); + void handleSubsessionTimeout(); + +private: + friend class ProxyServerMediaSession; + friend class ProxyServerMediaSubsession; + ProxyServerMediaSession& fOurServerMediaSession; + char* fOurURL; + Authenticator* fOurAuthenticator; + Boolean fStreamRTPOverTCP; + class ProxyServerMediaSubsession *fSetupQueueHead, *fSetupQueueTail; + unsigned fNumSetupsDone; + unsigned fNextDESCRIBEDelay; // in seconds + Boolean fServerSupportsGetParameter, fLastCommandWasPLAY, fDoneDESCRIBE; + TaskToken fLivenessCommandTask, fDESCRIBECommandTask, fSubsessionTimerTask, fResetTask; +}; + + +typedef ProxyRTSPClient* +createNewProxyRTSPClientFunc(ProxyServerMediaSession& ourServerMediaSession, + char const* rtspURL, + char const* username, char const* password, + portNumBits tunnelOverHTTPPortNum, int verbosityLevel, + int socketNumToServer); +ProxyRTSPClient* +defaultCreateNewProxyRTSPClientFunc(ProxyServerMediaSession& ourServerMediaSession, + char const* rtspURL, + char const* username, char const* password, + portNumBits tunnelOverHTTPPortNum, int verbosityLevel, + int socketNumToServer); + +class ProxyServerMediaSession: public ServerMediaSession { +public: + static ProxyServerMediaSession* createNew(UsageEnvironment& env, + GenericMediaServer* ourMediaServer, // Note: We can be used by just one server + char const* inputStreamURL, // the "rtsp://" URL of the stream we'll be proxying + char const* streamName = NULL, + char const* username = NULL, char const* password = NULL, + portNumBits tunnelOverHTTPPortNum = 0, + // for streaming the *proxied* (i.e., back-end) stream + int verbosityLevel = 0, + int socketNumToServer = -1, + MediaTranscodingTable* transcodingTable = NULL); + // Hack: "tunnelOverHTTPPortNum" == 0xFFFF (i.e., all-ones) means: Stream RTP/RTCP-over-TCP, but *not* using HTTP + // "verbosityLevel" == 1 means display basic proxy setup info; "verbosityLevel" == 2 means display RTSP client protocol also. + // If "socketNumToServer" is >= 0, then it is the socket number of an already-existing TCP connection to the server. + // (In this case, "inputStreamURL" must point to the socket's endpoint, so that it can be accessed via the socket.) + + virtual ~ProxyServerMediaSession(); + + char const* url() const; + + char describeCompletedFlag; + // initialized to 0; set to 1 when the back-end "DESCRIBE" completes. + // (This can be used as a 'watch variable' in "doEventLoop()".) + Boolean describeCompletedSuccessfully() const { return fClientMediaSession != NULL; } + // This can be used - along with "describeCompletedFlag" - to check whether the back-end "DESCRIBE" completed *successfully*. + +protected: + ProxyServerMediaSession(UsageEnvironment& env, GenericMediaServer* ourMediaServer, + char const* inputStreamURL, char const* streamName, + char const* username, char const* password, + portNumBits tunnelOverHTTPPortNum, int verbosityLevel, + int socketNumToServer, + MediaTranscodingTable* transcodingTable, + createNewProxyRTSPClientFunc* ourCreateNewProxyRTSPClientFunc + = defaultCreateNewProxyRTSPClientFunc, + portNumBits initialPortNum = 6970, + Boolean multiplexRTCPWithRTP = False); + + // If you subclass "ProxyRTSPClient", then you will also need to define your own function + // - with signature "createNewProxyRTSPClientFunc" (see above) - that creates a new object + // of this subclass. You should also subclass "ProxyServerMediaSession" and, in your + // subclass's constructor, initialize the parent class (i.e., "ProxyServerMediaSession") + // constructor by passing your new function as the "ourCreateNewProxyRTSPClientFunc" + // parameter. + + // Subclasses may redefine the following functions, if they want "ProxyServerSubsession"s + // to create subclassed "Groupsock" and/or "RTCPInstance" objects: + virtual Groupsock* createGroupsock(struct sockaddr_storage const& addr, Port port); + virtual RTCPInstance* createRTCP(Groupsock* RTCPgs, unsigned totSessionBW, /* in kbps */ + unsigned char const* cname, RTPSink* sink); + + virtual Boolean allowProxyingForSubsession(MediaSubsession const& mss); + // By default, this function always returns True. However, a subclass may redefine this + // if it wishes to restrict which subsessions of a stream get proxied - e.g., if it wishes + // to proxy only video tracks, but not audio (or other) tracks. + +protected: + GenericMediaServer* fOurMediaServer; + ProxyRTSPClient* fProxyRTSPClient; + MediaSession* fClientMediaSession; + +private: + friend class ProxyRTSPClient; + friend class ProxyServerMediaSubsession; + void continueAfterDESCRIBE(char const* sdpDescription); + void resetDESCRIBEState(); // undoes what was done by "contineAfterDESCRIBE()" + +private: + int fVerbosityLevel; + class PresentationTimeSessionNormalizer* fPresentationTimeSessionNormalizer; + createNewProxyRTSPClientFunc* fCreateNewProxyRTSPClientFunc; + MediaTranscodingTable* fTranscodingTable; + portNumBits fInitialPortNum; + Boolean fMultiplexRTCPWithRTP; +}; + + +////////// PresentationTimeSessionNormalizer and PresentationTimeSubsessionNormalizer definitions ////////// + +// The following two classes are used by proxies to convert incoming streams' presentation times into wall-clock-aligned +// presentation times that are suitable for our "RTPSink"s (for the corresponding outgoing streams). +// (For multi-subsession (i.e., audio+video) sessions, the outgoing streams' presentation times retain the same relative +// separation as those of the incoming streams.) + +class PresentationTimeSubsessionNormalizer: public FramedFilter { +public: + void setRTPSink(RTPSink* rtpSink) { fRTPSink = rtpSink; } + +private: + friend class PresentationTimeSessionNormalizer; + PresentationTimeSubsessionNormalizer(PresentationTimeSessionNormalizer& parent, FramedSource* inputSource, RTPSource* rtpSource, + char const* codecName, PresentationTimeSubsessionNormalizer* next); + // called only from within "PresentationTimeSessionNormalizer" + virtual ~PresentationTimeSubsessionNormalizer(); + + static void afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + void afterGettingFrame(unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + +private: // redefined virtual functions: + virtual void doGetNextFrame(); + +private: + PresentationTimeSessionNormalizer& fParent; + RTPSource* fRTPSource; + RTPSink* fRTPSink; + char const* fCodecName; + PresentationTimeSubsessionNormalizer* fNext; +}; + +class PresentationTimeSessionNormalizer: public Medium { +public: + PresentationTimeSessionNormalizer(UsageEnvironment& env); + virtual ~PresentationTimeSessionNormalizer(); + + PresentationTimeSubsessionNormalizer* + createNewPresentationTimeSubsessionNormalizer(FramedSource* inputSource, RTPSource* rtpSource, char const* codecName); + +private: // called only from within "~PresentationTimeSubsessionNormalizer": + friend class PresentationTimeSubsessionNormalizer; + void normalizePresentationTime(PresentationTimeSubsessionNormalizer* ssNormalizer, + struct timeval& toPT, struct timeval const& fromPT); + void removePresentationTimeSubsessionNormalizer(PresentationTimeSubsessionNormalizer* ssNormalizer); + +private: + PresentationTimeSubsessionNormalizer* fSubsessionNormalizers; + PresentationTimeSubsessionNormalizer* fMasterSSNormalizer; // used for subsessions that have been RTCP-synced + + struct timeval fPTAdjustment; // Added to (RTCP-synced) subsession presentation times to 'normalize' them with wall-clock time. +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/QCELPAudioRTPSource.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/QCELPAudioRTPSource.hh new file mode 100644 index 000000000..49bec546d --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/QCELPAudioRTPSource.hh @@ -0,0 +1,39 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Qualcomm "PureVoice" (aka. "QCELP") Audio RTP Sources +// C++ header + +#ifndef _QCELP_AUDIO_RTP_SOURCE_HH +#define _QCELP_AUDIO_RTP_SOURCE_HH + +#ifndef _RTP_SOURCE_HH +#include "RTPSource.hh" +#endif + +class QCELPAudioRTPSource { +public: + static FramedSource* createNew(UsageEnvironment& env, + Groupsock* RTPgs, + RTPSource*& resultRTPSource, + unsigned char rtpPayloadFormat = 12, + unsigned rtpTimestampFrequency = 8000); + // This returns a source to read from, but "resultRTPSource" will + // point to RTP-related state. +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/QuickTimeFileSink.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/QuickTimeFileSink.hh new file mode 100644 index 000000000..9311e5ad4 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/QuickTimeFileSink.hh @@ -0,0 +1,192 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A sink that generates a QuickTime file from a composite media session +// C++ header + +#ifndef _QUICKTIME_FILE_SINK_HH +#define _QUICKTIME_FILE_SINK_HH + +#ifndef _MEDIA_SESSION_HH +#include "MediaSession.hh" +#endif + +class QuickTimeFileSink: public Medium { +public: + static QuickTimeFileSink* createNew(UsageEnvironment& env, + MediaSession& inputSession, + char const* outputFileName, + unsigned bufferSize = 20000, + unsigned short movieWidth = 240, + unsigned short movieHeight = 180, + unsigned movieFPS = 15, + Boolean packetLossCompensate = False, + Boolean syncStreams = False, + Boolean generateHintTracks = False, + Boolean generateMP4Format = False); + + typedef void (afterPlayingFunc)(void* clientData); + Boolean startPlaying(afterPlayingFunc* afterFunc, + void* afterClientData); + + unsigned numActiveSubsessions() const { return fNumSubsessions; } + +protected: + QuickTimeFileSink(UsageEnvironment& env, MediaSession& inputSession, + char const* outputFileName, unsigned bufferSize, + unsigned short movieWidth, unsigned short movieHeight, + unsigned movieFPS, Boolean packetLossCompensate, + Boolean syncStreams, Boolean generateHintTracks, + Boolean generateMP4Format); + // called only by createNew() + virtual ~QuickTimeFileSink(); + + virtual void noteRecordedFrame(MediaSubsession& inputSubsession, + unsigned packetDataSize, struct timeval const& presentationTime); + +private: + Boolean continuePlaying(); + static void afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + static void onSourceClosure(void* clientData); + void onSourceClosure1(); + static void onRTCPBye(void* clientData); + void completeOutputFile(); + +private: + friend class SubsessionIOState; + MediaSession& fInputSession; + FILE* fOutFid; + unsigned fBufferSize; + Boolean fPacketLossCompensate; + Boolean fSyncStreams, fGenerateMP4Format; + struct timeval fNewestSyncTime, fFirstDataTime; + Boolean fAreCurrentlyBeingPlayed; + afterPlayingFunc* fAfterFunc; + void* fAfterClientData; + unsigned fAppleCreationTime; + unsigned fLargestRTPtimestampFrequency; + unsigned fNumSubsessions, fNumSyncedSubsessions; + struct timeval fStartTime; + Boolean fHaveCompletedOutputFile; + +private: + ///// Definitions specific to the QuickTime file format: + + unsigned addWord64(u_int64_t word); + unsigned addWord(unsigned word); + unsigned addHalfWord(unsigned short halfWord); + unsigned addByte(unsigned char byte) { + putc(byte, fOutFid); + return 1; + } + unsigned addZeroWords(unsigned numWords); + unsigned add4ByteString(char const* str); + unsigned addArbitraryString(char const* str, + Boolean oneByteLength = True); + unsigned addAtomHeader(char const* atomName); + unsigned addAtomHeader64(char const* atomName); + // strlen(atomName) must be 4 + void setWord(int64_t filePosn, unsigned size); + void setWord64(int64_t filePosn, u_int64_t size); + + unsigned movieTimeScale() const {return fLargestRTPtimestampFrequency;} + + // Define member functions for outputting various types of atom: +#define _atom(name) unsigned addAtom_##name() + _atom(ftyp); // for MP4 format files + _atom(moov); + _atom(mvhd); + _atom(iods); // for MP4 format files + _atom(trak); + _atom(tkhd); + _atom(edts); + _atom(elst); + _atom(tref); + _atom(hint); + _atom(mdia); + _atom(mdhd); + _atom(hdlr); + _atom(minf); + _atom(smhd); + _atom(vmhd); + _atom(gmhd); + _atom(gmin); + unsigned addAtom_hdlr2(); + _atom(dinf); + _atom(dref); + _atom(alis); + _atom(stbl); + _atom(stsd); + unsigned addAtom_genericMedia(); + unsigned addAtom_soundMediaGeneral(); + _atom(ulaw); + _atom(alaw); + _atom(Qclp); + _atom(wave); + _atom(frma); + _atom(Fclp); + _atom(Hclp); + _atom(mp4a); +// _atom(wave); +// _atom(frma); + _atom(esds); + _atom(srcq); + _atom(h263); + _atom(avc1); + _atom(avcC); + _atom(mp4v); + _atom(rtp); + _atom(tims); + _atom(stts); + _atom(stss); + _atom(stsc); + _atom(stsz); + _atom(co64); + _atom(udta); + _atom(name); + _atom(hnti); + _atom(sdp); + _atom(hinf); + _atom(totl); + _atom(npck); + _atom(tpay); + _atom(trpy); + _atom(nump); + _atom(tpyl); + _atom(dmed); + _atom(dimm); + _atom(drep); + _atom(tmin); + _atom(tmax); + _atom(pmax); + _atom(dmax); + _atom(payt); + unsigned addAtom_dummy(); + +private: + unsigned short fMovieWidth, fMovieHeight; + unsigned fMovieFPS; + int64_t fMDATposition; + int64_t fMVHD_durationPosn; + unsigned fMaxTrackDurationM; // in movie time units + class SubsessionIOState* fCurrentIOState; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/QuickTimeGenericRTPSource.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/QuickTimeGenericRTPSource.hh new file mode 100644 index 000000000..876a9a268 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/QuickTimeGenericRTPSource.hh @@ -0,0 +1,68 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP Sources containing generic QuickTime stream data, as defined in +// +// C++ header + +#ifndef _QUICKTIME_GENERIC_RTP_SOURCE_HH +#define _QUICKTIME_GENERIC_RTP_SOURCE_HH + +#ifndef _MULTI_FRAMED_RTP_SOURCE_HH +#include "MultiFramedRTPSource.hh" +#endif + +class QuickTimeGenericRTPSource: public MultiFramedRTPSource { +public: + static QuickTimeGenericRTPSource* + createNew(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, unsigned rtpTimestampFrequency, + char const* mimeTypeString); + + // QuickTime-specific information, set from the QuickTime header + // in each packet. This, along with the data following the header, + // is used by receivers. + struct QTState { + char PCK; + unsigned timescale; + char* sdAtom; + unsigned sdAtomSize; + unsigned short width, height; + // later add other state as needed ##### + } qtState; + +protected: + virtual ~QuickTimeGenericRTPSource(); + +private: + QuickTimeGenericRTPSource(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency, + char const* mimeTypeString); + // called only by createNew() + +private: + // redefined virtual functions: + virtual Boolean processSpecialHeader(BufferedPacket* packet, + unsigned& resultSpecialHeaderSize); + virtual char const* MIMEtype() const; + +private: + char const* fMIMEtypeString; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/RTCP.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/RTCP.hh new file mode 100644 index 000000000..d9eb73b83 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/RTCP.hh @@ -0,0 +1,250 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTCP +// C++ header + +#ifndef _RTCP_HH +#define _RTCP_HH + +#ifndef _RTP_SINK_HH +#include "RTPSink.hh" +#endif +#ifndef _RTP_SOURCE_HH +#include "RTPSource.hh" +#endif +#ifndef _SRTP_CRYPTOGRAPHIC_CONTEXT_HH +#include "SRTPCryptographicContext.hh" +#endif + +class SDESItem { +public: + SDESItem(unsigned char tag, unsigned char const* value); + + unsigned char const* data() const {return fData;} + unsigned totalSize() const; + +private: + unsigned char fData[2 + 0xFF]; // first 2 bytes are tag and length +}; + +typedef void RTCPAppHandlerFunc(void* clientData, + u_int8_t subtype, u_int32_t nameBytes/*big-endian order*/, + u_int8_t* appDependentData, unsigned appDependentDataSize); + +class RTCPMemberDatabase; // forward + +typedef void ByeWithReasonHandlerFunc(void* clientData, char const* reason); + +class RTCPInstance: public Medium { +public: + static RTCPInstance* createNew(UsageEnvironment& env, Groupsock* RTCPgs, + unsigned totSessionBW, /* in kbps */ + unsigned char const* cname, + RTPSink* sink, + RTPSource* source, + Boolean isSSMTransmitter = False, + SRTPCryptographicContext* crypto = NULL); + + static Boolean lookupByName(UsageEnvironment& env, char const* instanceName, + RTCPInstance*& resultInstance); + + unsigned numMembers() const; + unsigned totSessionBW() const { return fTotSessionBW; } + + void setupForSRTCP(); + + void setByeHandler(TaskFunc* handlerTask, void* clientData, + Boolean handleActiveParticipantsOnly = True); + // Assigns a handler routine to be called if a "BYE" arrives. + // The handler is called once only; for subsequent "BYE"s, + // "setByeHandler()" would need to be called again. + // If "handleActiveParticipantsOnly" is True, then the handler is called + // only if the SSRC is for a known sender (if we have a "RTPSource"), + // or if the SSRC is for a known receiver (if we have a "RTPSink"). + // This prevents (for example) the handler for a multicast receiver being + // called if some other multicast receiver happens to exit. + // If "handleActiveParticipantsOnly" is False, then the handler is called + // for any incoming RTCP "BYE". + // (To remove an existing "BYE" handler, call "setByeHandler()" again, with a "handlerTask" of NULL.) + void setByeWithReasonHandler(ByeWithReasonHandlerFunc* handlerTask, void* clientData, + Boolean handleActiveParticipantsOnly = True); + // Like "setByeHandler()", except that a string 'reason for the bye' (received as part of + // the RTCP "BYE" packet) is passed to the handler function (along with "clientData"). + // (The 'reason' parameter to the handler function will be a dynamically-allocated string, + // or NULL, and should be delete[]d by the handler function.) + void setSRHandler(TaskFunc* handlerTask, void* clientData); + void setRRHandler(TaskFunc* handlerTask, void* clientData); + // Assigns a handler routine to be called if a "SR" or "RR" packet + // (respectively) arrives. Unlike "setByeHandler()", the handler will + // be called once for each incoming "SR" or "RR". (To turn off handling, + // call the function again with "handlerTask" (and "clientData") as NULL.) + void setSpecificRRHandler(struct sockaddr_storage const& fromAddress, Port fromPort, + TaskFunc* handlerTask, void* clientData); + // Like "setRRHandler()", but applies only to "RR" packets that come from + // a specific source address and port. (Note that if both a specific + // and a general "RR" handler function is set, then both will be called.) + void unsetSpecificRRHandler(struct sockaddr_storage const& fromAddress, Port fromPort); // equivalent to setSpecificRRHandler(..., NULL, NULL); + void setAppHandler(RTCPAppHandlerFunc* handlerTask, void* clientData); + // Assigns a handler routine to be called whenever an "APP" packet arrives. (To turn off + // handling, call the function again with "handlerTask" (and "clientData") as NULL.) + void sendAppPacket(u_int8_t subtype, char const* name, + u_int8_t* appDependentData, unsigned appDependentDataSize); + // Sends a custom RTCP "APP" packet to the peer(s). The parameters correspond to their + // respective fields as described in the RTP/RTCP definition (RFC 3550). + // Note that only the low-order 5 bits of "subtype" are used, and only the first 4 bytes + // of "name" are used. (If "name" has fewer than 4 bytes, or is NULL, + // then the remaining bytes are '\0'.) + + Groupsock* RTCPgs() const { return fRTCPInterface.gs(); } + + void setStreamSocket(int sockNum, unsigned char streamChannelId, TLSState* tlsState); + void addStreamSocket(int sockNum, unsigned char streamChannelId, TLSState* tlsState); + void removeStreamSocket(int sockNum, unsigned char streamChannelId) { + fRTCPInterface.removeStreamSocket(sockNum, streamChannelId); + } + // hacks to allow sending RTP over TCP (RFC 2236, section 10.12) + + void setAuxilliaryReadHandler(AuxHandlerFunc* handlerFunc, + void* handlerClientData) { + fRTCPInterface.setAuxilliaryReadHandler(handlerFunc, + handlerClientData); + } + + void injectReport(u_int8_t const* packet, unsigned packetSize, struct sockaddr_storage const& fromAddress); + // Allows an outside party to inject an RTCP report (from other than the network interface) + +protected: + RTCPInstance(UsageEnvironment& env, Groupsock* RTPgs, unsigned totSessionBW, + unsigned char const* cname, + RTPSink* sink, RTPSource* source, + Boolean isSSMTransmitter, + SRTPCryptographicContext* crypto); + // called only by createNew() + virtual ~RTCPInstance(); + + virtual void noteArrivingRR(struct sockaddr_storage const& fromAddressAndPort, + int tcpSocketNum, unsigned char tcpStreamChannelId); + + void incomingReportHandler1(); + +private: + // redefined virtual functions: + virtual Boolean isRTCPInstance() const; + +private: + Boolean addReport(Boolean alwaysAdd = False); + void addSR(); + void addRR(); + void enqueueCommonReportPrefix(unsigned char packetType, u_int32_t SSRC, + unsigned numExtraWords = 0); + void enqueueCommonReportSuffix(); + void enqueueReportBlock(RTPReceptionStats* receptionStats); + void addSDES(); + void addBYE(char const* reason); + + void sendBuiltPacket(); + + static void onExpire(RTCPInstance* instance); + void onExpire1(); + + static void incomingReportHandler(RTCPInstance* instance, int /*mask*/); + void processIncomingReport(unsigned packetSize, struct sockaddr_storage const& fromAddressAndPort, + int tcpSocketNum, unsigned char tcpStreamChannelId); + void onReceive(int typeOfPacket, int totPacketSize, u_int32_t ssrc); + +private: + u_int8_t* fInBuf; + unsigned fNumBytesAlreadyRead; + OutPacketBuffer* fOutBuf; + RTPInterface fRTCPInterface; + unsigned fTotSessionBW; + RTPSink* fSink; + RTPSource* fSource; + Boolean fIsSSMTransmitter; + SRTPCryptographicContext* fCrypto; + + SDESItem fCNAME; + RTCPMemberDatabase* fKnownMembers; + unsigned fOutgoingReportCount; // used for SSRC member aging + + double fAveRTCPSize; + int fIsInitial; + double fPrevReportTime; + double fNextReportTime; + int fPrevNumMembers; + + int fLastSentSize; + int fLastReceivedSize; + u_int32_t fLastReceivedSSRC; + int fTypeOfEvent; + int fTypeOfPacket; + Boolean fHaveJustSentPacket; + unsigned fLastPacketSentSize; + + TaskFunc* fByeHandlerTask; + ByeWithReasonHandlerFunc* fByeWithReasonHandlerTask; + void* fByeHandlerClientData; + Boolean fByeHandleActiveParticipantsOnly; + TaskFunc* fSRHandlerTask; + void* fSRHandlerClientData; + TaskFunc* fRRHandlerTask; + void* fRRHandlerClientData; + AddressPortLookupTable* fSpecificRRHandlerTable; + RTCPAppHandlerFunc* fAppHandlerTask; + void* fAppHandlerClientData; + +public: // because this stuff is used by an external "C" function + void schedule(double nextTime); + void reschedule(double nextTime); + void sendReport(); + void sendBYE(char const* reason = NULL); + int typeOfEvent() {return fTypeOfEvent;} + int sentPacketSize() {return fLastSentSize;} + int packetType() {return fTypeOfPacket;} + int receivedPacketSize() {return fLastReceivedSize;} + int checkNewSSRC(); + void removeLastReceivedSSRC(); + void removeSSRC(u_int32_t ssrc, Boolean alsoRemoveStats); +}; + +// RTCP packet types: +const unsigned char RTCP_PT_SR = 200; +const unsigned char RTCP_PT_RR = 201; +const unsigned char RTCP_PT_SDES = 202; +const unsigned char RTCP_PT_BYE = 203; +const unsigned char RTCP_PT_APP = 204; +const unsigned char RTCP_PT_RTPFB = 205; // Generic RTP Feedback [RFC4585] +const unsigned char RTCP_PT_PSFB = 206; // Payload-specific [RFC4585] +const unsigned char RTCP_PT_XR = 207; // extended report [RFC3611] +const unsigned char RTCP_PT_AVB = 208; // AVB RTCP packet ["Standard for Layer 3 Transport Protocol for Time Sensitive Applications in Local Area Networks." Work in progress.] +const unsigned char RTCP_PT_RSI = 209; // Receiver Summary Information [RFC5760] +const unsigned char RTCP_PT_TOKEN = 210; // Port Mapping [RFC6284] +const unsigned char RTCP_PT_IDMS = 211; // IDMS Settings [RFC7272] + +// SDES tags: +const unsigned char RTCP_SDES_END = 0; +const unsigned char RTCP_SDES_CNAME = 1; +const unsigned char RTCP_SDES_NAME = 2; +const unsigned char RTCP_SDES_EMAIL = 3; +const unsigned char RTCP_SDES_PHONE = 4; +const unsigned char RTCP_SDES_LOC = 5; +const unsigned char RTCP_SDES_TOOL = 6; +const unsigned char RTCP_SDES_NOTE = 7; +const unsigned char RTCP_SDES_PRIV = 8; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/RTPInterface.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/RTPInterface.hh new file mode 100644 index 000000000..2e215d11f --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/RTPInterface.hh @@ -0,0 +1,115 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// An abstraction of a network interface used for RTP (or RTCP). +// (This allows the RTP-over-TCP hack (RFC 2326, section 10.12) to +// be implemented transparently.) +// C++ header + +#ifndef _RTP_INTERFACE_HH +#define _RTP_INTERFACE_HH + +#ifndef _MEDIA_HH +#include "Media.hh" +#endif +#ifndef _TLS_STATE_HH +#include "TLSState.hh" +#endif +#ifndef _GROUPSOCK_HH +#include +#endif + +// Typedef for an optional auxilliary handler function, to be called +// when each new packet is read: +typedef void AuxHandlerFunc(void* clientData, unsigned char* packet, + unsigned& packetSize); + +typedef void ServerRequestAlternativeByteHandler(void* instance, u_int8_t requestByte); +// A hack that allows a handler for RTP/RTCP packets received over TCP to process RTSP commands that may also appear within +// the same TCP connection. A RTSP server implementation would supply a function like this - as a parameter to +// "ServerMediaSubsession::startStream()". + +class RTPInterface { +public: + RTPInterface(Medium* owner, Groupsock* gs); + virtual ~RTPInterface(); + + Groupsock* gs() const { return fGS; } + + void setStreamSocket(int sockNum, unsigned char streamChannelId, TLSState* tlsState); + void addStreamSocket(int sockNum, unsigned char streamChannelId, TLSState* tlsState); + void removeStreamSocket(int sockNum, unsigned char streamChannelId); + static void setServerRequestAlternativeByteHandler(UsageEnvironment& env, int socketNum, + ServerRequestAlternativeByteHandler* handler, void* clientData); + static void clearServerRequestAlternativeByteHandler(UsageEnvironment& env, int socketNum); + + Boolean sendPacket(unsigned char* packet, unsigned packetSize); + void startNetworkReading(TaskScheduler::BackgroundHandlerProc* + handlerProc); + Boolean handleRead(unsigned char* buffer, unsigned bufferMaxSize, + // out parameters: + unsigned& bytesRead, struct sockaddr_storage& fromAddress, + int& tcpSocketNum, unsigned char& tcpStreamChannelId, + Boolean& packetReadWasIncomplete); + // Note: If "tcpSocketNum" < 0, then the packet was received over UDP, and "tcpStreamChannelId" + // is undefined (and irrelevant). + + + // Otherwise (if "tcpSocketNum" >= 0), the packet was received (interleaved) over TCP, and + // "tcpStreamChannelId" will return the channel id. + + void stopNetworkReading(); + + UsageEnvironment& envir() const { return fOwner->envir(); } + + void setAuxilliaryReadHandler(AuxHandlerFunc* handlerFunc, + void* handlerClientData) { + fAuxReadHandlerFunc = handlerFunc; + fAuxReadHandlerClientData = handlerClientData; + } + + void forgetOurGroupsock() { fGS = NULL; } + // This may be called - *only immediately prior* to deleting this - to prevent our destructor + // from turning off background reading on the 'groupsock'. (This is in case the 'groupsock' + // is also being read from elsewhere.) + +private: + // Helper functions for sending a RTP or RTCP packet over a TCP connection: + Boolean sendRTPorRTCPPacketOverTCP(unsigned char* packet, unsigned packetSize, + int socketNum, unsigned char streamChannelId, + TLSState* tlsState); + Boolean sendDataOverTCP(int socketNum, TLSState* tlsState, + u_int8_t const* data, unsigned dataSize, Boolean forceSendToSucceed); + +private: + friend class SocketDescriptor; + Medium* fOwner; + Groupsock* fGS; + class tcpStreamRecord* fTCPStreams; // optional, for RTP-over-TCP streaming/receiving + + unsigned short fNextTCPReadSize; + // how much data (if any) is available to be read from the TCP stream + int fNextTCPReadStreamSocketNum; + unsigned char fNextTCPReadStreamChannelId; + TLSState* fNextTCPReadTLSState; + TaskScheduler::BackgroundHandlerProc* fReadHandlerProc; // if any + + AuxHandlerFunc* fAuxReadHandlerFunc; + void* fAuxReadHandlerClientData; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/RTPSink.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/RTPSink.hh new file mode 100644 index 000000000..0bc69307c --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/RTPSink.hh @@ -0,0 +1,250 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP Sinks +// C++ header + +#ifndef _RTP_SINK_HH +#define _RTP_SINK_HH + +#ifndef _MEDIA_SINK_HH +#include "MediaSink.hh" +#endif +#ifndef _RTP_INTERFACE_HH +#include "RTPInterface.hh" +#endif +#ifndef _SRTP_CRYPTOGRAPHIC_CONTEXT_HH +#include "SRTPCryptographicContext.hh" +#endif + +class RTPTransmissionStatsDB; // forward + +class RTPSink: public MediaSink { +public: + static Boolean lookupByName(UsageEnvironment& env, char const* sinkName, + RTPSink*& resultSink); + + // used by RTSP servers: + Groupsock const& groupsockBeingUsed() const { return *(fRTPInterface.gs()); } + Groupsock& groupsockBeingUsed() { return *(fRTPInterface.gs()); } + + unsigned char rtpPayloadType() const { return fRTPPayloadType; } + unsigned rtpTimestampFrequency() const { return fTimestampFrequency; } + void setRTPTimestampFrequency(unsigned freq) { + fTimestampFrequency = freq; + } + char const* rtpPayloadFormatName() const {return fRTPPayloadFormatName;} + + unsigned numChannels() const { return fNumChannels; } + + void setupForSRTP(Boolean useEncryption); + // sets up keying/encryption state for streaming via SRTP, using default values. + u_int8_t* setupForSRTP(Boolean useEncryption, unsigned& resultMIKEYStateMessageSize); + // as above, but returns the binary MIKEY state + void setupForSRTP(u_int8_t const* MIKEYStateMessage, unsigned MIKEYStateMessageSize); + // as above, but takes a MIKEY state message as parameter + + virtual char const* sdpMediaType() const; // for use in SDP m= lines + virtual char* rtpmapLine() const; // returns a string to be delete[]d + virtual char* keyMgmtLine(); // returns a string to be delete[]d + virtual char const* auxSDPLine(); + // optional SDP line (e.g. a=fmtp:...) + + u_int16_t currentSeqNo() const { return fSeqNo; } + u_int32_t presetNextTimestamp(); + // ensures that the next timestamp to be used will correspond to + // the current 'wall clock' time. + + RTPTransmissionStatsDB& transmissionStatsDB() const { + return *fTransmissionStatsDB; + } + + Boolean nextTimestampHasBeenPreset() const { return fNextTimestampHasBeenPreset; } + Boolean& enableRTCPReports() { return fEnableRTCPReports; } + + void getTotalBitrate(unsigned& outNumBytes, double& outElapsedTime); + // returns the number of bytes sent since the last time that we + // were called, and resets the counter. + + struct timeval const& creationTime() const { return fCreationTime; } + struct timeval const& initialPresentationTime() const { return fInitialPresentationTime; } + struct timeval const& mostRecentPresentationTime() const { return fMostRecentPresentationTime; } + void resetPresentationTimes(); + + // Hacks to allow sending RTP over TCP (RFC 2236, section 10.12): + void setStreamSocket(int sockNum, unsigned char streamChannelId, TLSState* tlsState) { + fRTPInterface.setStreamSocket(sockNum, streamChannelId, tlsState); + } + void addStreamSocket(int sockNum, unsigned char streamChannelId, TLSState* tlsState) { + fRTPInterface.addStreamSocket(sockNum, streamChannelId, tlsState); + } + void removeStreamSocket(int sockNum, unsigned char streamChannelId) { + fRTPInterface.removeStreamSocket(sockNum, streamChannelId); + } + unsigned& estimatedBitrate() { return fEstimatedBitrate; } // kbps; usually 0 (i.e., unset) + + u_int32_t SSRC() const {return fSSRC;} + // later need a means of changing the SSRC if there's a collision ##### + + SRTPCryptographicContext* getCrypto() const { return fCrypto; } + +protected: + RTPSink(UsageEnvironment& env, + Groupsock* rtpGS, unsigned char rtpPayloadType, + u_int32_t rtpTimestampFrequency, + char const* rtpPayloadFormatName, + unsigned numChannels); + // abstract base class + + virtual ~RTPSink(); + + // used by RTCP: + friend class RTCPInstance; + friend class RTPTransmissionStats; + u_int32_t convertToRTPTimestamp(struct timeval tv); + unsigned packetCount() const {return fPacketCount;} + unsigned octetCount() const {return fOctetCount;} + +protected: + RTPInterface fRTPInterface; + unsigned char fRTPPayloadType; + unsigned fPacketCount, fOctetCount, fTotalOctetCount /*incl RTP hdr*/; + struct timeval fTotalOctetCountStartTime, fInitialPresentationTime, fMostRecentPresentationTime; + u_int32_t fCurrentTimestamp; + u_int16_t fSeqNo; + + // Optional key management and crypto state; used if we are streaming SRTP + MIKEYState* fMIKEYState; + SRTPCryptographicContext* fCrypto; + +private: + // redefined virtual functions: + virtual Boolean isRTPSink() const; + +private: + u_int32_t fSSRC, fTimestampBase; + unsigned fTimestampFrequency; + Boolean fNextTimestampHasBeenPreset; + Boolean fEnableRTCPReports; // whether RTCP "SR" reports should be sent for this sink (default: True) + char const* fRTPPayloadFormatName; + unsigned fNumChannels; + struct timeval fCreationTime; + unsigned fEstimatedBitrate; // set on creation if known; otherwise 0 + + RTPTransmissionStatsDB* fTransmissionStatsDB; +}; + + +class RTPTransmissionStats; // forward + +class RTPTransmissionStatsDB { +public: + unsigned numReceivers() const { return fNumReceivers; } + + class Iterator { + public: + Iterator(RTPTransmissionStatsDB& receptionStatsDB); + virtual ~Iterator(); + + RTPTransmissionStats* next(); + // NULL if none + + private: + HashTable::Iterator* fIter; + }; + + // The following is called whenever a RTCP RR packet is received: + void noteIncomingRR(u_int32_t SSRC, struct sockaddr_storage const& lastFromAddress, + unsigned lossStats, unsigned lastPacketNumReceived, + unsigned jitter, unsigned lastSRTime, unsigned diffSR_RRTime); + + // The following is called when a RTCP BYE packet is received: + void removeRecord(u_int32_t SSRC); + + RTPTransmissionStats* lookup(u_int32_t SSRC) const; + +private: // constructor and destructor, called only by RTPSink: + friend class RTPSink; + RTPTransmissionStatsDB(RTPSink& rtpSink); + virtual ~RTPTransmissionStatsDB(); + +private: + void add(u_int32_t SSRC, RTPTransmissionStats* stats); + +private: + friend class Iterator; + unsigned fNumReceivers; + RTPSink& fOurRTPSink; + HashTable* fTable; +}; + +class RTPTransmissionStats { +public: + u_int32_t SSRC() const {return fSSRC;} + struct sockaddr_storage const& lastFromAddress() const {return fLastFromAddress;} + unsigned lastPacketNumReceived() const {return fLastPacketNumReceived;} + unsigned firstPacketNumReported() const {return fFirstPacketNumReported;} + unsigned totNumPacketsLost() const {return fTotNumPacketsLost;} + unsigned jitter() const {return fJitter;} + unsigned lastSRTime() const { return fLastSRTime; } + unsigned diffSR_RRTime() const { return fDiffSR_RRTime; } + unsigned roundTripDelay() const; + // The round-trip delay (in units of 1/65536 seconds) computed from + // the most recently-received RTCP RR packet. + struct timeval const& timeCreated() const {return fTimeCreated;} + struct timeval const& lastTimeReceived() const {return fTimeReceived;} + void getTotalOctetCount(u_int32_t& hi, u_int32_t& lo); + void getTotalPacketCount(u_int32_t& hi, u_int32_t& lo); + + // Information which requires at least two RRs to have been received: + unsigned packetsReceivedSinceLastRR() const; + u_int8_t packetLossRatio() const { return fPacketLossRatio; } + // as an 8-bit fixed-point number + int packetsLostBetweenRR() const; + +private: + // called only by RTPTransmissionStatsDB: + friend class RTPTransmissionStatsDB; + RTPTransmissionStats(RTPSink& rtpSink, u_int32_t SSRC); + virtual ~RTPTransmissionStats(); + + void noteIncomingRR(struct sockaddr_storage const& lastFromAddress, + unsigned lossStats, unsigned lastPacketNumReceived, + unsigned jitter, + unsigned lastSRTime, unsigned diffSR_RRTime); + +private: + RTPSink& fOurRTPSink; + u_int32_t fSSRC; + struct sockaddr_storage fLastFromAddress; + unsigned fLastPacketNumReceived; + u_int8_t fPacketLossRatio; + unsigned fTotNumPacketsLost; + unsigned fJitter; + unsigned fLastSRTime; + unsigned fDiffSR_RRTime; + struct timeval fTimeCreated, fTimeReceived; + Boolean fAtLeastTwoRRsHaveBeenReceived; + unsigned fOldLastPacketNumReceived; + unsigned fOldTotNumPacketsLost; + Boolean fFirstPacket; + unsigned fFirstPacketNumReported; + u_int32_t fLastOctetCount, fTotalOctetCount_hi, fTotalOctetCount_lo; + u_int32_t fLastPacketCount, fTotalPacketCount_hi, fTotalPacketCount_lo; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/RTPSource.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/RTPSource.hh new file mode 100644 index 000000000..192da6b85 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/RTPSource.hh @@ -0,0 +1,283 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP Sources +// C++ header + +#ifndef _RTP_SOURCE_HH +#define _RTP_SOURCE_HH + +#ifndef _FRAMED_SOURCE_HH +#include "FramedSource.hh" +#endif +#ifndef _RTP_INTERFACE_HH +#include "RTPInterface.hh" +#endif +#ifndef _SRTP_CRYPTOGRAPHIC_CONTEXT_HH +#include "SRTPCryptographicContext.hh" +#endif + +class RTPReceptionStatsDB; // forward + +class RTPSource: public FramedSource { +public: + static Boolean lookupByName(UsageEnvironment& env, char const* sourceName, + RTPSource*& resultSource); + + Boolean curPacketMarkerBit() const { return fCurPacketMarkerBit; } + + unsigned char rtpPayloadFormat() const { return fRTPPayloadFormat; } + + virtual Boolean hasBeenSynchronizedUsingRTCP(); + + Groupsock* RTPgs() const { return fRTPInterface.gs(); } + + virtual void setPacketReorderingThresholdTime(unsigned uSeconds) = 0; + + void setCrypto(SRTPCryptographicContext* crypto) { fCrypto = crypto; } + + // used by RTCP: + u_int32_t SSRC() const { return fSSRC; } + // Note: This is *our* SSRC, not the SSRC in incoming RTP packets. + // later need a means of changing the SSRC if there's a collision ##### + void registerForMultiplexedRTCPPackets(class RTCPInstance* rtcpInstance) { + fRTCPInstanceForMultiplexedRTCPPackets = rtcpInstance; + } + void deregisterForMultiplexedRTCPPackets() { registerForMultiplexedRTCPPackets(NULL); } + + unsigned timestampFrequency() const {return fTimestampFrequency;} + + RTPReceptionStatsDB& receptionStatsDB() const { + return *fReceptionStatsDB; + } + + u_int32_t lastReceivedSSRC() const { return fLastReceivedSSRC; } + // Note: This is the SSRC in the most recently received RTP packet; not *our* SSRC + + Boolean& enableRTCPReports() { return fEnableRTCPReports; } + Boolean const& enableRTCPReports() const { return fEnableRTCPReports; } + + void setStreamSocket(int sockNum, unsigned char streamChannelId, TLSState* tlsState) { + // hack to allow sending RTP over TCP (RFC 2236, section 10.12) + fRTPInterface.setStreamSocket(sockNum, streamChannelId, tlsState); + } + + // added for audio back channel + void removeStreamSocket(int sockNum, unsigned char streamChannelId) { + fRTPInterface.removeStreamSocket(sockNum, streamChannelId); + } + + void setAuxilliaryReadHandler(AuxHandlerFunc* handlerFunc, + void* handlerClientData) { + fRTPInterface.setAuxilliaryReadHandler(handlerFunc, + handlerClientData); + } + + // Note that RTP receivers will usually not need to call either of the following two functions, because + // RTP sequence numbers and timestamps are usually not useful to receivers. + // (Our implementation of RTP reception already does all needed handling of RTP sequence numbers and timestamps.) + u_int16_t curPacketRTPSeqNum() const { return fCurPacketRTPSeqNum; } + + // modified for audio back channel +#if 0 +private: friend class MediaSubsession; // "MediaSubsession" is the only outside class that ever needs to see RTP timestamps! + u_int32_t curPacketRTPTimestamp() const { return fCurPacketRTPTimestamp; } +#else + u_int32_t curPacketRTPTimestamp() const { return fCurPacketRTPTimestamp; } +#endif + +protected: + RTPSource(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, u_int32_t rtpTimestampFrequency); + // abstract base class + virtual ~RTPSource(); + +protected: + RTPInterface fRTPInterface; + u_int16_t fCurPacketRTPSeqNum; + u_int32_t fCurPacketRTPTimestamp; + Boolean fCurPacketMarkerBit; + Boolean fCurPacketHasBeenSynchronizedUsingRTCP; + u_int32_t fLastReceivedSSRC; + class RTCPInstance* fRTCPInstanceForMultiplexedRTCPPackets; + SRTPCryptographicContext* fCrypto; + +private: + // redefined virtual functions: + virtual Boolean isRTPSource() const; + virtual void getAttributes() const; + +private: + unsigned char fRTPPayloadFormat; + unsigned fTimestampFrequency; + u_int32_t fSSRC; + Boolean fEnableRTCPReports; // whether RTCP "RR" reports should be sent for this source (default: True) + + RTPReceptionStatsDB* fReceptionStatsDB; +}; + + +class RTPReceptionStats; // forward + +class RTPReceptionStatsDB { +public: + unsigned totNumPacketsReceived() const { return fTotNumPacketsReceived; } + unsigned numActiveSourcesSinceLastReset() const { + return fNumActiveSourcesSinceLastReset; + } + + void reset(); + // resets periodic stats (called each time they're used to + // generate a reception report) + + class Iterator { + public: + Iterator(RTPReceptionStatsDB& receptionStatsDB); + virtual ~Iterator(); + + RTPReceptionStats* next(Boolean includeInactiveSources = False); + // NULL if none + + private: + HashTable::Iterator* fIter; + }; + + // The following is called whenever a RTP packet is received: + void noteIncomingPacket(u_int32_t SSRC, u_int16_t seqNum, + u_int32_t rtpTimestamp, + unsigned timestampFrequency, + Boolean useForJitterCalculation, + struct timeval& resultPresentationTime, + Boolean& resultHasBeenSyncedUsingRTCP, + unsigned packetSize /* payload only */); + + // The following is called whenever a RTCP SR packet is received: + void noteIncomingSR(u_int32_t SSRC, + u_int32_t ntpTimestampMSW, u_int32_t ntpTimestampLSW, + u_int32_t rtpTimestamp); + + // The following is called when a RTCP BYE packet is received: + void removeRecord(u_int32_t SSRC); + + RTPReceptionStats* lookup(u_int32_t SSRC) const; + +protected: // constructor and destructor, called only by RTPSource: + friend class RTPSource; + RTPReceptionStatsDB(); + virtual ~RTPReceptionStatsDB(); + +protected: + void add(u_int32_t SSRC, RTPReceptionStats* stats); + +protected: + friend class Iterator; + unsigned fNumActiveSourcesSinceLastReset; + +private: + HashTable* fTable; + unsigned fTotNumPacketsReceived; // for all SSRCs +}; + +class RTPReceptionStats { +public: + u_int32_t SSRC() const { return fSSRC; } + unsigned numPacketsReceivedSinceLastReset() const { + return fNumPacketsReceivedSinceLastReset; + } + unsigned totNumPacketsReceived() const { return fTotNumPacketsReceived; } + double totNumKBytesReceived() const; + + unsigned totNumPacketsExpected() const { + return (fHighestExtSeqNumReceived - fBaseExtSeqNumReceived) + 1; + } + + unsigned baseExtSeqNumReceived() const { return fBaseExtSeqNumReceived; } + unsigned lastResetExtSeqNumReceived() const { + return fLastResetExtSeqNumReceived; + } + unsigned highestExtSeqNumReceived() const { + return fHighestExtSeqNumReceived; + } + + unsigned jitter() const; + + unsigned lastReceivedSR_NTPmsw() const { return fLastReceivedSR_NTPmsw; } + unsigned lastReceivedSR_NTPlsw() const { return fLastReceivedSR_NTPlsw; } + struct timeval const& lastReceivedSR_time() const { + return fLastReceivedSR_time; + } + + unsigned minInterPacketGapUS() const { return fMinInterPacketGapUS; } + unsigned maxInterPacketGapUS() const { return fMaxInterPacketGapUS; } + struct timeval const& totalInterPacketGaps() const { + return fTotalInterPacketGaps; + } + +protected: + // called only by RTPReceptionStatsDB: + friend class RTPReceptionStatsDB; + RTPReceptionStats(u_int32_t SSRC, u_int16_t initialSeqNum); + RTPReceptionStats(u_int32_t SSRC); + virtual ~RTPReceptionStats(); + +private: + void noteIncomingPacket(u_int16_t seqNum, u_int32_t rtpTimestamp, + unsigned timestampFrequency, + Boolean useForJitterCalculation, + struct timeval& resultPresentationTime, + Boolean& resultHasBeenSyncedUsingRTCP, + unsigned packetSize /* payload only */); + void noteIncomingSR(u_int32_t ntpTimestampMSW, u_int32_t ntpTimestampLSW, + u_int32_t rtpTimestamp); + void init(u_int32_t SSRC); + void initSeqNum(u_int16_t initialSeqNum); + void reset(); + // resets periodic stats (called each time they're used to + // generate a reception report) + +protected: + u_int32_t fSSRC; + unsigned fNumPacketsReceivedSinceLastReset; + unsigned fTotNumPacketsReceived; + u_int32_t fTotBytesReceived_hi, fTotBytesReceived_lo; + Boolean fHaveSeenInitialSequenceNumber; + unsigned fBaseExtSeqNumReceived; + unsigned fLastResetExtSeqNumReceived; + unsigned fHighestExtSeqNumReceived; + int fLastTransit; // used in the jitter calculation + u_int32_t fPreviousPacketRTPTimestamp; + double fJitter; + // The following are recorded whenever we receive a RTCP SR for this SSRC: + unsigned fLastReceivedSR_NTPmsw; // NTP timestamp (from SR), most-signif + unsigned fLastReceivedSR_NTPlsw; // NTP timestamp (from SR), least-signif + struct timeval fLastReceivedSR_time; + struct timeval fLastPacketReceptionTime; + unsigned fMinInterPacketGapUS, fMaxInterPacketGapUS; + struct timeval fTotalInterPacketGaps; + +private: + // Used to convert from RTP timestamp to 'wall clock' time: + Boolean fHasBeenSynchronized; + u_int32_t fSyncTimestamp; + struct timeval fSyncTime; +}; + + +Boolean seqNumLT(u_int16_t s1, u_int16_t s2); + // a 'less-than' on 16-bit sequence numbers + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/RTSPClient.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/RTSPClient.hh new file mode 100644 index 000000000..1be4b085f --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/RTSPClient.hh @@ -0,0 +1,419 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A generic RTSP client - for a single "rtsp://" URL +// C++ header + +#ifndef _RTSP_CLIENT_HH +#define _RTSP_CLIENT_HH + +#ifndef _MEDIA_SESSION_HH +#include "MediaSession.hh" +#endif +#ifndef _NET_ADDRESS_HH +#include "NetAddress.hh" +#endif +#ifndef _DIGEST_AUTHENTICATION_HH +#include "DigestAuthentication.hh" +#endif +#ifndef _TLS_STATE_HH +#include "TLSState.hh" +#endif +#ifndef OMIT_REGISTER_HANDLING +#ifndef _RTSP_SERVER_HH +#include "RTSPServer.hh" // For the optional "HandlerForREGISTERCommand" mini-server +#endif +#endif + +class RTSPClient: public Medium { +public: + static RTSPClient* createNew(UsageEnvironment& env, char const* rtspURL, + int verbosityLevel = 0, + char const* applicationName = NULL, + portNumBits tunnelOverHTTPPortNum = 0, + int socketNumToServer = -1); + // If "tunnelOverHTTPPortNum" is non-zero, we tunnel RTSP (and RTP) + // over a HTTP connection with the given port number, using the technique + // described in Apple's document + // If "socketNumToServer" is >= 0, then it is the socket number of an already-existing TCP connection to the server. + // (In this case, "rtspURL" must point to the socket's endpoint, so that it can be accessed via the socket.) + + typedef void (responseHandler)(RTSPClient* rtspClient, + int resultCode, char* resultString); + // A function that is called in response to a RTSP command. The parameters are as follows: + // "rtspClient": The "RTSPClient" object on which the original command was issued. + // "resultCode": If zero, then the command completed successfully. If non-zero, then the command did not complete + // successfully, and "resultCode" indicates the error, as follows: + // A positive "resultCode" is a RTSP error code (for example, 404 means "not found") + // A negative "resultCode" indicates a socket/network error; 0-"resultCode" is the standard "errno" code. + // "resultString": A ('\0'-terminated) string returned along with the response, or else NULL. + // In particular: + // "resultString" for a successful "DESCRIBE" command will be the media session's SDP description. + // "resultString" for a successful "OPTIONS" command will be a list of allowed commands. + // Note that this string can be present (i.e., not NULL) even if "resultCode" is non-zero - i.e., an error message. + // Also, "resultString" can be NULL, even if "resultCode" is zero (e.g., if the RTSP command succeeded, but without + // including an appropriate result header). + // Note also that this string is dynamically allocated, and must be freed by the handler (or the caller) + // - using "delete[]". + + unsigned sendDescribeCommand(responseHandler* responseHandler, Authenticator* authenticator = NULL); + // Issues a RTSP "DESCRIBE" command, then returns the "CSeq" sequence number that was used in the command. + // The (programmer-supplied) "responseHandler" function is called later to handle the response + // (or is called immediately - with an error code - if the command cannot be sent). + // "authenticator" (optional) is used for access control. If you have username and password strings, you can use this by + // passing an actual parameter that you created by creating an "Authenticator(username, password) object". + // (Note that if you supply a non-NULL "authenticator" parameter, you need do this only for the first command you send.) + + unsigned sendOptionsCommand(responseHandler* responseHandler, Authenticator* authenticator = NULL); + // Issues a RTSP "OPTIONS" command, then returns the "CSeq" sequence number that was used in the command. + // (The "responseHandler" and "authenticator" parameters are as described for "sendDescribeCommand".) + + unsigned sendAnnounceCommand(char const* sdpDescription, responseHandler* responseHandler, Authenticator* authenticator = NULL); + // Issues a RTSP "ANNOUNCE" command (with "sdpDescription" as parameter), + // then returns the "CSeq" sequence number that was used in the command. + // (The "responseHandler" and "authenticator" parameters are as described for "sendDescribeCommand".) + + unsigned sendSetupCommand(MediaSubsession& subsession, responseHandler* responseHandler, + Boolean streamOutgoing = False, + Boolean streamUsingTCP = False, + Boolean forceMulticastOnUnspecified = False, + Authenticator* authenticator = NULL); + // Issues a RTSP "SETUP" command, then returns the "CSeq" sequence number that was used in the command. + // (The "responseHandler" and "authenticator" parameters are as described for "sendDescribeCommand".) + + unsigned sendPlayCommand(MediaSession& session, responseHandler* responseHandler, + double start = 0.0f, double end = -1.0f, float scale = 1.0f, + Authenticator* authenticator = NULL); + // Issues an aggregate RTSP "PLAY" command on "session", then returns the "CSeq" sequence number that was used in the command. + // (Note: start=-1 means 'resume'; end=-1 means 'play to end') + // (The "responseHandler" and "authenticator" parameters are as described for "sendDescribeCommand".) + unsigned sendPlayCommand(MediaSubsession& subsession, responseHandler* responseHandler, + double start = 0.0f, double end = -1.0f, float scale = 1.0f, + Authenticator* authenticator = NULL); + // Issues a RTSP "PLAY" command on "subsession", then returns the "CSeq" sequence number that was used in the command. + // (Note: start=-1 means 'resume'; end=-1 means 'play to end') + // (The "responseHandler" and "authenticator" parameters are as described for "sendDescribeCommand".) + + // Alternative forms of "sendPlayCommand()", used to send "PLAY" commands that include an 'absolute' time range: + // (The "absStartTime" string (and "absEndTime" string, if present) *must* be of the form + // "YYYYMMDDTHHMMSSZ" or "YYYYMMDDTHHMMSS.Z") + unsigned sendPlayCommand(MediaSession& session, responseHandler* responseHandler, + char const* absStartTime, char const* absEndTime = NULL, float scale = 1.0f, + Authenticator* authenticator = NULL); + unsigned sendPlayCommand(MediaSubsession& subsession, responseHandler* responseHandler, + char const* absStartTime, char const* absEndTime = NULL, float scale = 1.0f, + Authenticator* authenticator = NULL); + + unsigned sendPauseCommand(MediaSession& session, responseHandler* responseHandler, Authenticator* authenticator = NULL); + // Issues an aggregate RTSP "PAUSE" command on "session", then returns the "CSeq" sequence number that was used in the command. + // (The "responseHandler" and "authenticator" parameters are as described for "sendDescribeCommand".) + unsigned sendPauseCommand(MediaSubsession& subsession, responseHandler* responseHandler, Authenticator* authenticator = NULL); + // Issues a RTSP "PAUSE" command on "subsession", then returns the "CSeq" sequence number that was used in the command. + // (The "responseHandler" and "authenticator" parameters are as described for "sendDescribeCommand".) + + unsigned sendRecordCommand(MediaSession& session, responseHandler* responseHandler, Authenticator* authenticator = NULL); + // Issues an aggregate RTSP "RECORD" command on "session", then returns the "CSeq" sequence number that was used in the command. + // (The "responseHandler" and "authenticator" parameters are as described for "sendDescribeCommand".) + unsigned sendRecordCommand(MediaSubsession& subsession, responseHandler* responseHandler, Authenticator* authenticator = NULL); + // Issues a RTSP "RECORD" command on "subsession", then returns the "CSeq" sequence number that was used in the command. + // (The "responseHandler" and "authenticator" parameters are as described for "sendDescribeCommand".) + + unsigned sendTeardownCommand(MediaSession& session, responseHandler* responseHandler, Authenticator* authenticator = NULL); + // Issues an aggregate RTSP "TEARDOWN" command on "session", then returns the "CSeq" sequence number that was used in the command. + // (The "responseHandler" and "authenticator" parameters are as described for "sendDescribeCommand".) + unsigned sendTeardownCommand(MediaSubsession& subsession, responseHandler* responseHandler, Authenticator* authenticator = NULL); + // Issues a RTSP "TEARDOWN" command on "subsession", then returns the "CSeq" sequence number that was used in the command. + // (The "responseHandler" and "authenticator" parameters are as described for "sendDescribeCommand".) + + unsigned sendSetParameterCommand(MediaSession& session, responseHandler* responseHandler, + char const* parameterName, char const* parameterValue, + Authenticator* authenticator = NULL); + // Issues an aggregate RTSP "SET_PARAMETER" command on "session", then returns the "CSeq" sequence number that was used in the command. + // (The "responseHandler" and "authenticator" parameters are as described for "sendDescribeCommand".) + + unsigned sendGetParameterCommand(MediaSession& session, responseHandler* responseHandler, char const* parameterName, + Authenticator* authenticator = NULL); + // Issues an aggregate RTSP "GET_PARAMETER" command on "session", then returns the "CSeq" sequence number that was used in the command. + // (The "responseHandler" and "authenticator" parameters are as described for "sendDescribeCommand".) + + void setRequireValue(char const* requireValue = NULL); + // Sets a string to be used as the value of a "Require:" header to be included in + // subsequent RTSP commands. Call "setRequireValue()" again (i.e., with no parameter) + // to clear this (and so stop "Require:" headers from being included in subsequent cmds). + + void sendDummyUDPPackets(MediaSession& session, unsigned numDummyPackets = 2); + void sendDummyUDPPackets(MediaSubsession& subsession, unsigned numDummyPackets = 2); + // Sends short 'dummy' (i.e., non-RTP or RTCP) UDP packets towards the server, to increase + // the likelihood of RTP/RTCP packets from the server reaching us if we're behind a NAT. + // (If we requested RTP-over-TCP streaming, then these functions have no effect.) + // Our implementation automatically does this just prior to sending each "PLAY" command; + // You should not call these functions yourself unless you know what you're doing. + + void setSpeed(MediaSession& session, float speed = 1.0f); + // Set (recorded) media download speed to given value to support faster download using 'Speed:' + // option on 'PLAY' command. + + Boolean changeResponseHandler(unsigned cseq, responseHandler* newResponseHandler); + // Changes the response handler for the previously-performed command (whose operation returned "cseq"). + // (To turn off any response handling for the command, use a "newResponseHandler" value of NULL. This might be done as part + // of an implementation of a 'timeout handler' on the command, for example.) + // This function returns True iff "cseq" was for a valid previously-performed command (whose response is still unhandled). + + int socketNum() const { return fInputSocketNum; } + + static Boolean lookupByName(UsageEnvironment& env, + char const* sourceName, + RTSPClient*& resultClient); + + Boolean parseRTSPURL(char const* url, + char*& username, char*& password, NetAddress& address, portNumBits& portNum, char const** urlSuffix = NULL); + // Parses "url" as "rtsp://[[:]@][:][/]" + // (Note that the returned "username" and "password" are either NULL, or heap-allocated strings that the caller must later delete[].) + + void setUserAgentString(char const* userAgentName); + // sets an alternative string to be used in RTSP "User-Agent:" headers + + void disallowBasicAuthentication() { fAllowBasicAuthentication = False; } + // call this if you don't want the server to request 'Basic' authentication + // (which would cause the client to send usernames and passwords over the net). + + unsigned sessionTimeoutParameter() const { return fSessionTimeoutParameter; } + + char const* url() const { return fBaseURL; } + + static unsigned responseBufferSize; + +public: // Some compilers complain if this is "private:" + // The state of a request-in-progress: + class RequestRecord { + public: + RequestRecord(unsigned cseq, char const* commandName, responseHandler* handler, + MediaSession* session = NULL, MediaSubsession* subsession = NULL, u_int32_t booleanFlags = 0, + double start = 0.0f, double end = -1.0f, float scale = 1.0f, char const* contentStr = NULL); + RequestRecord(unsigned cseq, responseHandler* handler, + char const* absStartTime, char const* absEndTime = NULL, float scale = 1.0f, + MediaSession* session = NULL, MediaSubsession* subsession = NULL); + // alternative constructor for creating "PLAY" requests that include 'absolute' time values + virtual ~RequestRecord(); + + RequestRecord*& next() { return fNext; } + unsigned& cseq() { return fCSeq; } + char const* commandName() const { return fCommandName; } + MediaSession* session() const { return fSession; } + MediaSubsession* subsession() const { return fSubsession; } + u_int32_t booleanFlags() const { return fBooleanFlags; } + double start() const { return fStart; } + double end() const { return fEnd; } + char const* absStartTime() const { return fAbsStartTime; } + char const* absEndTime() const { return fAbsEndTime; } + float scale() const { return fScale; } + char* contentStr() const { return fContentStr; } + responseHandler*& handler() { return fHandler; } + + private: + RequestRecord* fNext; + unsigned fCSeq; + char const* fCommandName; + MediaSession* fSession; + MediaSubsession* fSubsession; + u_int32_t fBooleanFlags; + double fStart, fEnd; + char *fAbsStartTime, *fAbsEndTime; // used for optional 'absolute' (i.e., "time=") range specifications + float fScale; + char* fContentStr; + responseHandler* fHandler; + }; + +protected: + RTSPClient(UsageEnvironment& env, char const* rtspURL, + int verbosityLevel, char const* applicationName, portNumBits tunnelOverHTTPPortNum, int socketNumToServer); + // called only by createNew(); + virtual ~RTSPClient(); + + void reset(); + void setBaseURL(char const* url); + int grabSocket(); // allows a subclass to reuse our input socket, so that it won't get closed when we're deleted + virtual unsigned sendRequest(RequestRecord* request); + virtual Boolean setRequestFields(RequestRecord* request, + char*& cmdURL, Boolean& cmdURLWasAllocated, + char const*& protocolStr, + char*& extraHeaders, Boolean& extraHeadersWereAllocated); + // used to implement "sendRequest()"; subclasses may reimplement this (e.g., when implementing a new command name) + virtual int connectToServer(int socketNum, portNumBits remotePortNum); // used to implement "openConnection()"; result values: -1: failure; 0: pending; 1: success + +private: // redefined virtual functions + virtual Boolean isRTSPClient() const; + +private: + class RequestQueue { + public: + RequestQueue(); + RequestQueue(RequestQueue& origQueue); // moves the queue contents to the new queue + virtual ~RequestQueue(); + + void enqueue(RequestRecord* request); // "request" must not be NULL + RequestRecord* dequeue(); + void putAtHead(RequestRecord* request); // "request" must not be NULL + RequestRecord* findByCSeq(unsigned cseq); + Boolean isEmpty() const { return fHead == NULL; } + void reset(); + + private: + RequestRecord* fHead; + RequestRecord* fTail; + }; + + void resetTCPSockets(); + void resetResponseBuffer(); + int openConnection(); // result values: -1: failure; 0: pending; 1: success + char* createAuthenticatorString(char const* cmd, char const* url); + char* createBlocksizeString(Boolean streamUsingTCP); + char* createKeyMgmtString(char const* url, MediaSubsession const& subsession); + void handleRequestError(RequestRecord* request); + Boolean parseResponseCode(char const* line, unsigned& responseCode, char const*& responseString); + void handleIncomingRequest(); + static Boolean checkForHeader(char const* line, char const* headerName, unsigned headerNameLength, char const*& headerParams); + Boolean parseTransportParams(char const* paramsStr, + char*& serverAddressStr, portNumBits& serverPortNum, + unsigned char& rtpChannelId, unsigned char& rtcpChannelId); + Boolean parseScaleParam(char const* paramStr, float& scale); + Boolean parseSpeedParam(char const* paramStr, float& speed); + Boolean parseRTPInfoParams(char const*& paramStr, u_int16_t& seqNum, u_int32_t& timestamp); + Boolean handleSETUPResponse(MediaSubsession& subsession, char const* sessionParamsStr, char const* transportParamsStr, + Boolean streamUsingTCP); + Boolean handlePLAYResponse(MediaSession* session, MediaSubsession* subsession, + char const* scaleParamsStr, const char* speedParamsStr, + char const* rangeParamsStr, char const* rtpInfoParamsStr); + Boolean handleTEARDOWNResponse(MediaSession& session, MediaSubsession& subsession); + Boolean handleGET_PARAMETERResponse(char const* parameterName, char*& resultValueString, char* resultValueStringEnd); + Boolean handleAuthenticationFailure(char const* wwwAuthenticateParamsStr); + Boolean resendCommand(RequestRecord* request); + char const* sessionURL(MediaSession const& session) const; + static void handleAlternativeRequestByte(void*, u_int8_t requestByte); + void handleAlternativeRequestByte1(u_int8_t requestByte); + void constructSubsessionURL(MediaSubsession const& subsession, + char const*& prefix, + char const*& separator, + char const*& suffix); + + // Support for tunneling RTSP-over-HTTP: + Boolean setupHTTPTunneling1(); // send the HTTP "GET" + static void responseHandlerForHTTP_GET(RTSPClient* rtspClient, int responseCode, char* responseString); + void responseHandlerForHTTP_GET1(int responseCode, char* responseString); + Boolean setupHTTPTunneling2(); // send the HTTP "POST" + + // Support for asynchronous connections to the server: + static void connectionHandler(void*, int /*mask*/); + void connectionHandler1(); + + // Support for handling data sent back by a server: + static void incomingDataHandler(void*, int /*mask*/); + void incomingDataHandler1(); + void handleResponseBytes(int newBytesRead); + + // Writing/reading data over a (already set-up) connection: + int write(const char* data, unsigned count); + int read(u_int8_t* buffer, unsigned bufferSize); + +public: + u_int16_t desiredMaxIncomingPacketSize; + // If set to a value >0, then a "Blocksize:" header with this value (minus an allowance for + // IP, UDP, and RTP headers) will be sent with each "SETUP" request. + +protected: + int fVerbosityLevel; + unsigned fCSeq; // sequence number, used in consecutive requests + Authenticator fCurrentAuthenticator; + Boolean fAllowBasicAuthentication; + struct sockaddr_storage fServerAddress; + +private: + portNumBits fTunnelOverHTTPPortNum; + char* fUserAgentHeaderStr; + unsigned fUserAgentHeaderStrLen; + int fInputSocketNum, fOutputSocketNum; + char* fBaseURL; + unsigned char fTCPStreamIdCount; // used for (optional) RTP/TCP + char* fLastSessionId; + unsigned fSessionTimeoutParameter; // optionally set in response "Session:" headers + char* fResponseBuffer; + unsigned fResponseBytesAlreadySeen, fResponseBufferBytesLeft; + RequestQueue fRequestsAwaitingConnection, fRequestsAwaitingHTTPTunneling, fRequestsAwaitingResponse; + char* fRequireStr; + + // Support for tunneling RTSP-over-HTTP: + char fSessionCookie[33]; + unsigned fSessionCookieCounter; + Boolean fHTTPTunnelingConnectionIsPending; + + // Optional support for TLS: + ClientTLSState fTLS; + ClientTLSState fPOSTSocketTLS; // used only for RTSP-over-HTTPS + ClientTLSState* fInputTLS; + ClientTLSState* fOutputTLS; + friend class ClientTLSState; + + // added for audio back channel +public: + Boolean bRequireBackChannel; +}; + + +#ifndef OMIT_REGISTER_HANDLING +////////// HandlerServerForREGISTERCommand ///////// + +// A simple server that creates a new "RTSPClient" object whenever a "REGISTER" request arrives (specifying the "rtsp://" URL +// of a stream). The new "RTSPClient" object will be created with the specified URL, and passed to the provided handler function. + +typedef void onRTSPClientCreationFunc(RTSPClient* newRTSPClient, Boolean requestStreamingOverTCP); + +class HandlerServerForREGISTERCommand: public RTSPServer { +public: + static HandlerServerForREGISTERCommand* createNew(UsageEnvironment& env, onRTSPClientCreationFunc* creationFunc, + Port ourPort = 0, UserAuthenticationDatabase* authDatabase = NULL, + int verbosityLevel = 0, char const* applicationName = NULL); + // If ourPort.num() == 0, we'll choose the port number ourself. (Use the following function to get it.) + portNumBits serverPortNum() const { return ntohs(fServerPort.num()); } + +protected: + HandlerServerForREGISTERCommand(UsageEnvironment& env, onRTSPClientCreationFunc* creationFunc, int ourSocketIPv4, int ourSocketIPv6, Port ourPort, + UserAuthenticationDatabase* authDatabase, int verbosityLevel, char const* applicationName); + // called only by createNew(); + virtual ~HandlerServerForREGISTERCommand(); + + virtual RTSPClient* createNewRTSPClient(char const* rtspURL, int verbosityLevel, char const* applicationName, + int socketNumToServer); + // This function - by default - creates a (base) "RTSPClient" object. If you want to create a subclass + // of "RTSPClient" instead, then subclass this class, and redefine this virtual function. + +protected: // redefined virtual functions + virtual char const* allowedCommandNames(); // "OPTIONS", "REGISTER", and (perhaps) "DEREGISTER" only + virtual Boolean weImplementREGISTER(char const* cmd/*"REGISTER" or "DEREGISTER"*/, + char const* proxyURLSuffix, char*& responseStr); + // redefined to return True (for cmd=="REGISTER") + virtual void implementCmd_REGISTER(char const* cmd/*"REGISTER" or "DEREGISTER"*/, + char const* url, char const* urlSuffix, int socketToRemoteServer, + Boolean deliverViaTCP, char const* proxyURLSuffix); + +private: + onRTSPClientCreationFunc* fCreationFunc; + int fVerbosityLevel; + char* fApplicationName; +}; +#endif + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/RTSPCommon.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/RTSPCommon.hh new file mode 100644 index 000000000..80c6eb9b5 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/RTSPCommon.hh @@ -0,0 +1,65 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Common routines used by both RTSP clients and servers +// C++ header + +#ifndef _RTSP_COMMON_HH +#define _RTSP_COMMON_HH + +#ifndef _BOOLEAN_HH +#include "Boolean.hh" +#endif + +#ifndef _MEDIA_HH +#include // includes some definitions perhaps needed for Borland compilers? +#endif + +#if defined(__WIN32__) || defined(_WIN32) || defined(_QNX4) +#define _strncasecmp _strnicmp +#define snprintf _snprintf +#else +#define _strncasecmp strncasecmp +#endif + +#define RTSP_PARAM_STRING_MAX 200 + +Boolean parseRTSPRequestString(char const *reqStr, unsigned reqStrSize, // in + char *resultCmdName, // out + unsigned resultCmdNameMaxSize, // in + char* resultURLPreSuffix, // out + unsigned resultURLPreSuffixMaxSize, // in + char* resultURLSuffix, // out + unsigned resultURLSuffixMaxSize, // in + char* resultCSeq, // out + unsigned resultCSeqMaxSize, // in + char* resultSessionId, // out + unsigned resultSessionIdMaxSize, // in + unsigned& contentLength, Boolean& urlIsRTSPS); // out + +Boolean parseRangeParam(char const* paramStr, double& rangeStart, double& rangeEnd, char*& absStartTime, char*& absEndTime, Boolean& startTimeIsNow); +Boolean parseRangeHeader(char const* buf, double& rangeStart, double& rangeEnd, char*& absStartTime, char*& absEndTime, Boolean& startTimeIsNow); + +Boolean parseScaleHeader(char const* buf, float& scale); + +Boolean RTSPOptionIsSupported(char const* commandName, char const* optionsResponseString); + // Returns True iff the RTSP command "commandName" is mentioned as one of the commands supported in "optionsResponseString" + // (which should be the 'resultString' from a previous RTSP "OPTIONS" request). + +char const* dateHeader(); // A "Date:" header that can be used in a RTSP (or HTTP) response + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/RTSPRegisterSender.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/RTSPRegisterSender.hh new file mode 100644 index 000000000..ca6d9fff2 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/RTSPRegisterSender.hh @@ -0,0 +1,138 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Special objects which, when created, sends a custom RTSP "REGISTER" (or "DEREGISTER") command +// to a specified client. +// C++ header + +#ifndef _RTSP_REGISTER_SENDER_HH +#define _RTSP_REGISTER_SENDER_HH + +#ifndef _RTSP_CLIENT_HH +#include "RTSPClient.hh" +#endif + +class RTSPRegisterOrDeregisterSender: public RTSPClient { +public: + virtual ~RTSPRegisterOrDeregisterSender(); +protected: // we're a virtual base class + RTSPRegisterOrDeregisterSender(UsageEnvironment& env, + char const* remoteClientNameOrAddress, portNumBits remoteClientPortNum, + Authenticator* authenticator, + int verbosityLevel, char const* applicationName); + +public: // Some compilers complain if this is "protected:" + // A subclass of "RTSPClient::RequestRecord", specific to our "REGISTER" and "DEREGISTER" commands: + class RequestRecord_REGISTER_or_DEREGISTER: public RTSPClient::RequestRecord { + public: + RequestRecord_REGISTER_or_DEREGISTER(unsigned cseq, char const* cmdName, RTSPClient::responseHandler* rtspResponseHandler, char const* rtspURLToRegisterOrDeregister, char const* proxyURLSuffix); + virtual ~RequestRecord_REGISTER_or_DEREGISTER(); + + char const* proxyURLSuffix() const { return fProxyURLSuffix; } + + protected: + char* fRTSPURLToRegisterOrDeregister; + char* fProxyURLSuffix; + }; + +protected: + portNumBits fRemoteClientPortNum; +}; + +////////// + +class RTSPRegisterSender: public RTSPRegisterOrDeregisterSender { +public: + static RTSPRegisterSender* + createNew(UsageEnvironment& env, + char const* remoteClientNameOrAddress, portNumBits remoteClientPortNum, char const* rtspURLToRegister, + RTSPClient::responseHandler* rtspResponseHandler, Authenticator* authenticator = NULL, + Boolean requestStreamingViaTCP = False, char const* proxyURLSuffix = NULL, Boolean reuseConnection = False, + int verbosityLevel = 0, char const* applicationName = NULL); + + void grabConnection(int& sock, struct sockaddr_storage& remoteAddress); // so that the socket doesn't get closed when we're deleted + +protected: + RTSPRegisterSender(UsageEnvironment& env, + char const* remoteClientNameOrAddress, portNumBits remoteClientPortNum, char const* rtspURLToRegister, + RTSPClient::responseHandler* rtspResponseHandler, Authenticator* authenticator, + Boolean requestStreamingViaTCP, char const* proxyURLSuffix, Boolean reuseConnection, + int verbosityLevel, char const* applicationName); + // called only by "createNew()" + virtual ~RTSPRegisterSender(); + + // Redefined virtual functions: + virtual Boolean setRequestFields(RequestRecord* request, + char*& cmdURL, Boolean& cmdURLWasAllocated, + char const*& protocolStr, + char*& extraHeaders, Boolean& extraHeadersWereAllocated); + +public: // Some compilers complain if this is "protected:" + // A subclass of "RequestRecord_REGISTER_or_DEREGISTER", specific to our "REGISTER" command: + class RequestRecord_REGISTER: public RTSPRegisterOrDeregisterSender::RequestRecord_REGISTER_or_DEREGISTER { + public: + RequestRecord_REGISTER(unsigned cseq, RTSPClient::responseHandler* rtspResponseHandler, char const* rtspURLToRegister, + Boolean reuseConnection, Boolean requestStreamingViaTCP, char const* proxyURLSuffix); + virtual ~RequestRecord_REGISTER(); + + char const* rtspURLToRegister() const { return fRTSPURLToRegisterOrDeregister; } + Boolean reuseConnection() const { return fReuseConnection; } + Boolean requestStreamingViaTCP() const { return fRequestStreamingViaTCP; } + + private: + Boolean fReuseConnection, fRequestStreamingViaTCP; + }; +}; + +////////// + +class RTSPDeregisterSender: public RTSPRegisterOrDeregisterSender { +public: + static RTSPDeregisterSender* + createNew(UsageEnvironment& env, + char const* remoteClientNameOrAddress, portNumBits remoteClientPortNum, char const* rtspURLToDeregister, + RTSPClient::responseHandler* rtspResponseHandler, Authenticator* authenticator = NULL, + char const* proxyURLSuffix = NULL, + int verbosityLevel = 0, char const* applicationName = NULL); + +protected: + RTSPDeregisterSender(UsageEnvironment& env, + char const* remoteClientNameOrAddress, portNumBits remoteClientPortNum, char const* rtspURLToDeregister, + RTSPClient::responseHandler* rtspResponseHandler, Authenticator* authenticator, + char const* proxyURLSuffix, + int verbosityLevel, char const* applicationName); + // called only by "createNew()" + virtual ~RTSPDeregisterSender(); + + // Redefined virtual functions: + virtual Boolean setRequestFields(RequestRecord* request, + char*& cmdURL, Boolean& cmdURLWasAllocated, + char const*& protocolStr, + char*& extraHeaders, Boolean& extraHeadersWereAllocated); + +public: // Some compilers complain if this is "protected:" + // A subclass of "RequestRecord_REGISTER_or_DEREGISTER", specific to our "DEREGISTER" command: + class RequestRecord_DEREGISTER: public RTSPRegisterOrDeregisterSender::RequestRecord_REGISTER_or_DEREGISTER { + public: + RequestRecord_DEREGISTER(unsigned cseq, RTSPClient::responseHandler* rtspResponseHandler, char const* rtspURLToDeregister, char const* proxyURLSuffix); + virtual ~RequestRecord_DEREGISTER(); + + char const* rtspURLToDeregister() const { return fRTSPURLToRegisterOrDeregister; } + }; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/RTSPServer.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/RTSPServer.hh new file mode 100644 index 000000000..438089e93 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/RTSPServer.hh @@ -0,0 +1,397 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A RTSP server +// C++ header + +#ifndef _RTSP_SERVER_HH +#define _RTSP_SERVER_HH + +#ifndef _GENERIC_MEDIA_SERVER_HH +#include "GenericMediaServer.hh" +#endif +#ifndef _DIGEST_AUTHENTICATION_HH +#include "DigestAuthentication.hh" +#endif + +class RTSPServer: public GenericMediaServer { +public: + static RTSPServer* createNew(UsageEnvironment& env, Port ourPort = 554, + UserAuthenticationDatabase* authDatabase = NULL, + unsigned reclamationSeconds = 65); + // If ourPort.num() == 0, we'll choose the port number + // Note: The caller is responsible for reclaiming "authDatabase" + // If "reclamationSeconds" > 0, then the "RTSPClientSession" state for + // each client will get reclaimed (and the corresponding RTP stream(s) + // torn down) if no RTSP commands - or RTCP "RR" packets - from the + // client are received in at least "reclamationSeconds" seconds. + + static Boolean lookupByName(UsageEnvironment& env, char const* name, + RTSPServer*& resultServer); + + typedef void (responseHandlerForREGISTER)(RTSPServer* rtspServer, unsigned requestId, int resultCode, char* resultString); + unsigned registerStream(ServerMediaSession* serverMediaSession, + char const* remoteClientNameOrAddress, portNumBits remoteClientPortNum, + responseHandlerForREGISTER* responseHandler, + char const* username = NULL, char const* password = NULL, + Boolean receiveOurStreamViaTCP = False, + char const* proxyURLSuffix = NULL); + // 'Register' the stream represented by "serverMediaSession" with the given remote client (specifed by name and port number). + // This is done using our custom "REGISTER" RTSP command. + // The function returns a unique number that can be used to identify the request; this number is also passed to "responseHandler". + // When a response is received from the remote client (or the "REGISTER" request fails), the specified response handler + // (if non-NULL) is called. (Note that the "resultString" passed to the handler was dynamically allocated, + // and should be delete[]d by the handler after use.) + // If "receiveOurStreamViaTCP" is True, then we're requesting that the remote client access our stream using RTP/RTCP-over-TCP. + // (Otherwise, the remote client may choose regular RTP/RTCP-over-UDP streaming.) + // "proxyURLSuffix" (optional) is used only when the remote client is also a proxy server. + // It tells the proxy server the suffix that it should use in its "rtsp://" URL (when front-end clients access the stream) + + typedef void (responseHandlerForDEREGISTER)(RTSPServer* rtspServer, unsigned requestId, int resultCode, char* resultString); + unsigned deregisterStream(ServerMediaSession* serverMediaSession, + char const* remoteClientNameOrAddress, portNumBits remoteClientPortNum, + responseHandlerForDEREGISTER* responseHandler, + char const* username = NULL, char const* password = NULL, + char const* proxyURLSuffix = NULL); + // Used to turn off a previous "registerStream()" - using our custom "DEREGISTER" RTSP command. + + char* rtspURL(ServerMediaSession const* serverMediaSession, + int clientSocket = -1, Boolean useIPv6 = False) const; + // returns a "rtsp://" URL that could be used to access the + // specified session (which must already have been added to + // us using "addServerMediaSession()". + // This string is dynamically allocated; caller should delete[] + // (If "clientSocket" is non-negative, then it is used (by calling "getsockname()") to determine + // the IP address to be used in the URL.) + // Shortcuts: + char* ipv4rtspURL(ServerMediaSession const* serverMediaSession, int clientSocket = -1) { + return rtspURL(serverMediaSession, clientSocket, False); + } + char* ipv6rtspURL(ServerMediaSession const* serverMediaSession, int clientSocket = -1) { + return rtspURL(serverMediaSession, clientSocket, True); + } + + char* rtspURLPrefix(int clientSocket = -1, Boolean useIPv6 = False) const; + // like "rtspURL()", except that it returns just the common prefix used by + // each session's "rtsp://" URL. + // This string is dynamically allocated; caller should delete[] + // Shortcuts: + char* ipv4rtspURLPrefix(int clientSocket = -1) { return rtspURLPrefix(clientSocket, False); } + char* ipv6rtspURLPrefix(int clientSocket = -1) { return rtspURLPrefix(clientSocket, True); } + + UserAuthenticationDatabase* setAuthenticationDatabase(UserAuthenticationDatabase* newDB); + // Changes the server's authentication database to "newDB", returning a pointer to the old database (if there was one). + // "newDB" may be NULL (you can use this to disable authentication at runtime, if desired). + + void disableStreamingRTPOverTCP() { + fAllowStreamingRTPOverTCP = False; + } + + Boolean setUpTunnelingOverHTTP(Port httpPort); + // (Attempts to) enable RTSP-over-HTTP tunneling on the specified port. + // Returns True iff the specified port can be used in this way (i.e., it's not already being used for a separate HTTP server). + // Note: RTSP-over-HTTP tunneling is described in + // http://mirror.informatimago.com/next/developer.apple.com/quicktime/icefloe/dispatch028.html + // and http://images.apple.com/br/quicktime/pdf/QTSS_Modules.pdf + portNumBits httpServerPortNum() const; // in host byte order. (Returns 0 if not present.) + + void setTLSState(char const* certFileName, char const* privKeyFileName, + Boolean weServeSRTP = True, Boolean weEncryptSRTP = True); + +protected: + RTSPServer(UsageEnvironment& env, + int ourSocketIPv4, int ourSocketIPv6, Port ourPort, + UserAuthenticationDatabase* authDatabase, + unsigned reclamationSeconds); + // called only by createNew(); + virtual ~RTSPServer(); + + virtual char const* allowedCommandNames(); // used to implement "RTSPClientConnection::handleCmd_OPTIONS()" + virtual Boolean weImplementREGISTER(char const* cmd/*"REGISTER" or "DEREGISTER"*/, + char const* proxyURLSuffix, char*& responseStr); + // used to implement "RTSPClientConnection::handleCmd_REGISTER()" + // Note: "responseStr" is dynamically allocated (or NULL), and should be delete[]d after the call + virtual void implementCmd_REGISTER(char const* cmd/*"REGISTER" or "DEREGISTER"*/, + char const* url, char const* urlSuffix, int socketToRemoteServer, + Boolean deliverViaTCP, char const* proxyURLSuffix); + // used to implement "RTSPClientConnection::handleCmd_REGISTER()" + + virtual UserAuthenticationDatabase* getAuthenticationDatabaseForCommand(char const* cmdName); + virtual Boolean specialClientAccessCheck(int clientSocket, + struct sockaddr_storage const& clientAddr, + char const* urlSuffix); + // a hook that allows subclassed servers to do server-specific access checking + // on each client (e.g., based on client IP address), without using digest authentication. + virtual Boolean specialClientUserAccessCheck(int clientSocket, + struct sockaddr_storage const& clientAddr, + char const* urlSuffix, char const *username); + // another hook that allows subclassed servers to do server-specific access checking + // - this time after normal digest authentication has already taken place (and would otherwise allow access). + // (This test can only be used to further restrict access, not to grant additional access.) + virtual void specialHandlingOfAuthenticationFailure(int clientSocket, + struct sockaddr_storage const& clientAddr, + char const* urlSuffix); + // a hook that allows subclassed servers to take extra action whenevever an authentication failure occurs + +public: // redefined virtual functions + virtual Boolean isRTSPServer() const; + virtual void addServerMediaSession(ServerMediaSession* serverMediaSession); + +public: // should be protected, but some old compilers complain otherwise + // The state of a TCP connection used by a RTSP client: + class RTSPClientSession; // forward + class RTSPClientConnection: public GenericMediaServer::ClientConnection { + public: + // A data structure that's used to implement the "REGISTER" command: + class ParamsForREGISTER { + public: + ParamsForREGISTER(char const* cmd/*"REGISTER" or "DEREGISTER"*/, + RTSPClientConnection* ourConnection, char const* url, char const* urlSuffix, + Boolean reuseConnection, Boolean deliverViaTCP, char const* proxyURLSuffix); + virtual ~ParamsForREGISTER(); + private: + friend class RTSPClientConnection; + char const* fCmd; + RTSPClientConnection* fOurConnection; + char* fURL; + char* fURLSuffix; + Boolean fReuseConnection, fDeliverViaTCP; + char* fProxyURLSuffix; + }; + protected: // redefined virtual functions: + virtual void handleRequestBytes(int newBytesRead); + + protected: + RTSPClientConnection(RTSPServer& ourServer, + int clientSocket, struct sockaddr_storage const& clientAddr, + Boolean useTLS = False); + virtual ~RTSPClientConnection(); + + friend class RTSPServer; + friend class RTSPClientSession; + + // Make the handler functions for each command virtual, to allow subclasses to reimplement them, if necessary: + virtual void handleCmd_OPTIONS(); + // You probably won't need to subclass/reimplement this function; reimplement "RTSPServer::allowedCommandNames()" instead. + virtual void handleCmd_GET_PARAMETER(char const* fullRequestStr); // when operating on the entire server + virtual void handleCmd_SET_PARAMETER(char const* fullRequestStr); // when operating on the entire server + virtual void handleCmd_DESCRIBE(char const* urlPreSuffix, char const* urlSuffix, char const* fullRequestStr); + static void DESCRIBELookupCompletionFunction(void* clientData, ServerMediaSession* sessionLookedUp); + virtual void handleCmd_DESCRIBE_afterLookup(ServerMediaSession* session); + virtual void handleCmd_REGISTER(char const* cmd/*"REGISTER" or "DEREGISTER"*/, + char const* url, char const* urlSuffix, char const* fullRequestStr, + Boolean reuseConnection, Boolean deliverViaTCP, char const* proxyURLSuffix); + // You probably won't need to subclass/reimplement this function; + // reimplement "RTSPServer::weImplementREGISTER()" and "RTSPServer::implementCmd_REGISTER()" instead. + virtual void handleCmd_bad(); + virtual void handleCmd_notSupported(); + virtual void handleCmd_redirect(char const* urlSuffix); + virtual void handleCmd_notFound(); + virtual void handleCmd_sessionNotFound(); + virtual void handleCmd_unsupportedTransport(); + // Support for optional RTSP-over-HTTP tunneling: + virtual Boolean parseHTTPRequestString(char* resultCmdName, unsigned resultCmdNameMaxSize, + char* urlSuffix, unsigned urlSuffixMaxSize, + char* sessionCookie, unsigned sessionCookieMaxSize, + char* acceptStr, unsigned acceptStrMaxSize); + virtual void handleHTTPCmd_notSupported(); + virtual void handleHTTPCmd_notFound(); + virtual void handleHTTPCmd_OPTIONS(); + virtual void handleHTTPCmd_TunnelingGET(char const* sessionCookie); + virtual Boolean handleHTTPCmd_TunnelingPOST(char const* sessionCookie, unsigned char const* extraData, unsigned extraDataSize); + virtual void handleHTTPCmd_StreamingGET(char const* urlSuffix, char const* fullRequestStr); + protected: + void resetRequestBuffer(); + void closeSocketsRTSP(); + static void handleAlternativeRequestByte(void*, u_int8_t requestByte); + void handleAlternativeRequestByte1(u_int8_t requestByte); + Boolean authenticationOK(char const* cmdName, char const* urlSuffix, char const* fullRequestStr); + void changeClientInputSocket(int newSocketNum, ServerTLSState const* newTLSState, + unsigned char const* extraData, unsigned extraDataSize); + // used to implement RTSP-over-HTTP tunneling + static void continueHandlingREGISTER(ParamsForREGISTER* params); + virtual void continueHandlingREGISTER1(ParamsForREGISTER* params); + + // Shortcuts for setting up a RTSP response (prior to sending it): + void setRTSPResponse(char const* responseStr); + void setRTSPResponse(char const* responseStr, u_int32_t sessionId); + void setRTSPResponse(char const* responseStr, char const* contentStr); + void setRTSPResponse(char const* responseStr, u_int32_t sessionId, char const* contentStr); + + RTSPServer& fOurRTSPServer; // same as ::fOurServer + int& fClientInputSocket; // aliased to ::fOurSocket + int fClientOutputSocket; + ServerTLSState fPOSTSocketTLS; // used only for RTSP-over-HTTPS + int fAddressFamily; + Boolean fIsActive; + unsigned char* fLastCRLF; + unsigned fRecursionCount; + char const* fCurrentCSeq; + Authenticator fCurrentAuthenticator; // used if access control is needed + char* fOurSessionCookie; // used for optional RTSP-over-HTTP tunneling + unsigned fBase64RemainderCount; // used for optional RTSP-over-HTTP tunneling (possible values: 0,1,2,3) + unsigned fScheduledDelayedTask; + }; + + // The state of an individual client session (using one or more sequential TCP connections) handled by a RTSP server: + class RTSPClientSession: public GenericMediaServer::ClientSession { + protected: + RTSPClientSession(RTSPServer& ourServer, u_int32_t sessionId); + virtual ~RTSPClientSession(); + + friend class RTSPServer; + friend class RTSPClientConnection; + // Make the handler functions for each command virtual, to allow subclasses to redefine them: + virtual void handleCmd_SETUP(RTSPClientConnection* ourClientConnection, + char const* urlPreSuffix, char const* urlSuffix, char const* fullRequestStr); + static void SETUPLookupCompletionFunction1(void* clientData, ServerMediaSession* sessionLookedUp); + virtual void handleCmd_SETUP_afterLookup1(ServerMediaSession* sms); + static void SETUPLookupCompletionFunction2(void* clientData, ServerMediaSession* sessionLookedUp); + virtual void handleCmd_SETUP_afterLookup2(ServerMediaSession* sms); + virtual void handleCmd_withinSession(RTSPClientConnection* ourClientConnection, + char const* cmdName, + char const* urlPreSuffix, char const* urlSuffix, + char const* fullRequestStr); + virtual void handleCmd_TEARDOWN(RTSPClientConnection* ourClientConnection, + ServerMediaSubsession* subsession); + virtual void handleCmd_PLAY(RTSPClientConnection* ourClientConnection, + ServerMediaSubsession* subsession, char const* fullRequestStr); + virtual void handleCmd_PAUSE(RTSPClientConnection* ourClientConnection, + ServerMediaSubsession* subsession); + virtual void handleCmd_GET_PARAMETER(RTSPClientConnection* ourClientConnection, + ServerMediaSubsession* subsession, char const* fullRequestStr); + virtual void handleCmd_SET_PARAMETER(RTSPClientConnection* ourClientConnection, + ServerMediaSubsession* subsession, char const* fullRequestStr); + protected: + void deleteStreamByTrack(unsigned trackNum); + void reclaimStreamStates(); + Boolean isMulticast() const { return fIsMulticast; } + + // Shortcuts for setting up a RTSP response (prior to sending it): + void setRTSPResponse(RTSPClientConnection* ourClientConnection, char const* responseStr) { ourClientConnection->setRTSPResponse(responseStr); } + void setRTSPResponse(RTSPClientConnection* ourClientConnection, char const* responseStr, u_int32_t sessionId) { ourClientConnection->setRTSPResponse(responseStr, sessionId); } + void setRTSPResponse(RTSPClientConnection* ourClientConnection, char const* responseStr, char const* contentStr) { ourClientConnection->setRTSPResponse(responseStr, contentStr); } + void setRTSPResponse(RTSPClientConnection* ourClientConnection, char const* responseStr, u_int32_t sessionId, char const* contentStr) { ourClientConnection->setRTSPResponse(responseStr, sessionId, contentStr); } + + protected: + RTSPServer& fOurRTSPServer; // same as ::fOurServer + Boolean fIsMulticast, fStreamAfterSETUP; + unsigned char fTCPStreamIdCount; // used for (optional) RTP/TCP + Boolean usesTCPTransport() const { return fTCPStreamIdCount > 0; } + unsigned fNumStreamStates; + struct streamState { + ServerMediaSubsession* subsession; + int tcpSocketNum; + void* streamToken; + } * fStreamStates; + + // Member variables used to implement "handleCmd_SETUP()": + RTSPServer::RTSPClientConnection* fOurClientConnection; + char const* fURLPreSuffix; char const* fURLSuffix; char const* fFullRequestStr; char const* fTrackId; + }; + +protected: // redefined virtual functions + // If you subclass "RTSPClientConnection", then you must also redefine this virtual function in order + // to create new objects of your subclass: + virtual ClientConnection* createNewClientConnection(int clientSocket, struct sockaddr_storage const& clientAddr); + +protected: + // If you subclass "RTSPClientSession", then you must also redefine this virtual function in order + // to create new objects of your subclass: + virtual ClientSession* createNewClientSession(u_int32_t sessionId); + +private: + static void incomingConnectionHandlerHTTPIPv4(void*, int /*mask*/); + void incomingConnectionHandlerHTTPIPv4(); + static void incomingConnectionHandlerHTTPIPv6(void*, int /*mask*/); + void incomingConnectionHandlerHTTPIPv6(); + + void noteTCPStreamingOnSocket(int socketNum, RTSPClientSession* clientSession, unsigned trackNum); + void unnoteTCPStreamingOnSocket(int socketNum, RTSPClientSession* clientSession, unsigned trackNum); + void stopTCPStreamingOnSocket(int socketNum); + +private: + friend class RTSPClientConnection; + friend class RTSPClientSession; + friend class RegisterRequestRecord; + friend class DeregisterRequestRecord; + int fHTTPServerSocketIPv4, fHTTPServerSocketIPv6; // for optional RTSP-over-HTTP tunneling + Port fHTTPServerPort; // ditto + HashTable* fClientConnectionsForHTTPTunneling; // maps client-supplied 'session cookie' strings to "RTSPClientConnection"s + // (used only for optional RTSP-over-HTTP tunneling) + HashTable* fTCPStreamingDatabase; + // maps TCP socket numbers to ids of sessions that are streaming over it (RTP/RTCP-over-TCP) + HashTable* fPendingRegisterOrDeregisterRequests; + unsigned fRegisterOrDeregisterRequestCounter; + UserAuthenticationDatabase* fAuthDB; + Boolean fAllowStreamingRTPOverTCP; // by default, True + Boolean fOurConnectionsUseTLS; // by default, False + Boolean fWeServeSRTP; // used only if "fOurConnectionsUseTLS" is True + Boolean fWeEncryptSRTP; // used only if "fWeServeSRTP" is True +}; + + +////////// A subclass of "RTSPServer" that implements the "REGISTER" command to set up proxying on the specified URL ////////// + +class RTSPServerWithREGISTERProxying: public RTSPServer { +public: + static RTSPServerWithREGISTERProxying* createNew(UsageEnvironment& env, Port ourPort = 554, + UserAuthenticationDatabase* authDatabase = NULL, + UserAuthenticationDatabase* authDatabaseForREGISTER = NULL, + unsigned reclamationSeconds = 65, + Boolean streamRTPOverTCP = False, + int verbosityLevelForProxying = 0, + char const* backEndUsername = NULL, + char const* backEndPassword = NULL); + +protected: + RTSPServerWithREGISTERProxying(UsageEnvironment& env, int ourSocketIPv4, int ourSocketIPv6, Port ourPort, + UserAuthenticationDatabase* authDatabase, UserAuthenticationDatabase* authDatabaseForREGISTER, + unsigned reclamationSeconds, + Boolean streamRTPOverTCP, int verbosityLevelForProxying, + char const* backEndUsername, char const* backEndPassword); + // called only by createNew(); + virtual ~RTSPServerWithREGISTERProxying(); + +protected: // redefined virtual functions + virtual char const* allowedCommandNames(); + virtual Boolean weImplementREGISTER(char const* cmd/*"REGISTER" or "DEREGISTER"*/, + char const* proxyURLSuffix, char*& responseStr); + virtual void implementCmd_REGISTER(char const* cmd/*"REGISTER" or "DEREGISTER"*/, + char const* url, char const* urlSuffix, int socketToRemoteServer, + Boolean deliverViaTCP, char const* proxyURLSuffix); + virtual UserAuthenticationDatabase* getAuthenticationDatabaseForCommand(char const* cmdName); + +private: + Boolean fStreamRTPOverTCP; + int fVerbosityLevelForProxying; + unsigned fRegisteredProxyCounter; + char* fAllowedCommandNames; + UserAuthenticationDatabase* fAuthDBForREGISTER; + char* fBackEndUsername; + char* fBackEndPassword; +}; + + +// A special version of "parseTransportHeader()", used just for parsing the "Transport:" header +// in an incoming "REGISTER" command: +void parseTransportHeaderForREGISTER(char const* buf, // in + Boolean &reuseConnection, // out + Boolean& deliverViaTCP, // out + char*& proxyURLSuffix); // out + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/RawVideoFrameParameters.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/RawVideoFrameParameters.hh new file mode 100644 index 000000000..d365dca6e --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/RawVideoFrameParameters.hh @@ -0,0 +1,37 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Parameters used for streaming (transmitting and receiving) raw video frames over RTP +// C++ header + +#ifndef _RAW_VIDEO_FRAME_PARAMETERS_HH +#define _RAW_VIDEO_FRAME_PARAMETERS_HH + +class RawVideoFrameParameters { +public: + RawVideoFrameParameters(unsigned width, unsigned height, unsigned depth, char const* sampling); + virtual ~RawVideoFrameParameters(); + +public: + u_int16_t pgroupSize; // in octets + u_int16_t numPixelsInPgroup; + u_int32_t scanLineSize; // in octets + u_int32_t frameSize; // in octets + u_int16_t scanLineIterationStep; // usually 1, but 2 for sampling=="YCbCr-4:2:0" +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/RawVideoRTPSink.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/RawVideoRTPSink.hh new file mode 100644 index 000000000..c39210927 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/RawVideoRTPSink.hh @@ -0,0 +1,71 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP sink for Raw video +// C++ header + +#ifndef _RAW_VIDEO_RTP_SINK_HH +#define _RAW_VIDEO_RTP_SINK_HH + +#ifndef _VIDEO_RTP_SINK_HH +#include "VideoRTPSink.hh" +#endif + +#ifndef _RAW_VIDEO_FRAME_PARAMETERS_HH +#include "RawVideoFrameParameters.hh" +#endif + +class RawVideoRTPSink: public VideoRTPSink { +public: + static RawVideoRTPSink* + createNew(UsageEnvironment& env, Groupsock* RTPgs, u_int8_t rtpPayloadFormat, + unsigned width, unsigned height, unsigned depth, // as defined by RFC 4175, sec 6.1 + char const* sampling, char const* colorimetry); + +protected: + RawVideoRTPSink(UsageEnvironment& env, Groupsock* RTPgs, + u_int8_t rtpPayloadFormat, + unsigned width, unsigned height, unsigned depth, + char const* sampling, char const* colorimetry); + // called only by createNew() + + virtual ~RawVideoRTPSink(); + +private: // redefined virtual functions: + virtual char const* auxSDPLine(); // for the "a=fmtp:" SDP line + + virtual void doSpecialFrameHandling(unsigned fragmentationOffset, + unsigned char* frameStart, + unsigned numBytesInFrame, + struct timeval framePresentationTime, + unsigned numRemainingBytes); + virtual Boolean frameCanAppearAfterPacketStart(unsigned char const* frameStart, + unsigned numBytesInFrame) const; + virtual unsigned specialHeaderSize() const; + virtual unsigned computeOverflowForNewFrame(unsigned newFrameSize) const; + +private: + char* fFmtpSDPLine; + unsigned fLineIndex; + RawVideoFrameParameters fP; + + unsigned getNumLinesInPacket(unsigned fragOffset, u_int16_t*& lengths, u_int16_t*& offsets) const; + // return the number of lines, their lengths and offsets from the fragmentation offset of the whole frame. + // call delete[] on lengths and offsets after use of the function +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/RawVideoRTPSource.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/RawVideoRTPSource.hh new file mode 100644 index 000000000..281722979 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/RawVideoRTPSource.hh @@ -0,0 +1,60 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Raw Video RTP Sources (RFC 4175) +// C++ header + +#ifndef _RAW_VIDEO_RTP_SOURCE_HH +#define _RAW_VIDEO_RTP_SOURCE_HH + +#ifndef _MULTI_FRAMED_RTP_SOURCE_HH +#include "MultiFramedRTPSource.hh" +#endif + +class RawVideoRTPSource: public MultiFramedRTPSource { +public: + static RawVideoRTPSource* createNew(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency); + + u_int16_t currentLineNumber() const; // of the most recently-read/processed scan line + u_int8_t currentLineFieldId() const; // of the most recently-read/processed scan line (0 or 1) + u_int16_t currentOffsetWithinLine() const; // of the most recently-read/processed scan line + +protected: + RawVideoRTPSource(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency = 90000); + // called only by createNew() + + virtual ~RawVideoRTPSource(); + +protected: + // redefined virtual functions: + virtual Boolean processSpecialHeader(BufferedPacket* packet, + unsigned& resultSpecialHeaderSize); + virtual char const* MIMEtype() const; + +private: + unsigned fNumLines; // in the most recently read packet + unsigned fNextLine; // index of the next AU Header to read + struct LineHeader* fLineHeaders; + + friend class RawVideoBufferedPacket; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/SIPClient.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/SIPClient.hh new file mode 100644 index 000000000..2a63d7fb9 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/SIPClient.hh @@ -0,0 +1,150 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A generic SIP client +// C++ header + +#ifndef _SIP_CLIENT_HH +#define _SIP_CLIENT_HH + +#ifndef _MEDIA_SESSION_HH +#include "MediaSession.hh" +#endif +#ifndef _NET_ADDRESS_HH +#include "NetAddress.hh" +#endif +#ifndef _DIGEST_AUTHENTICATION_HH +#include "DigestAuthentication.hh" +#endif + +// Possible states in the "INVITE" transition diagram (RFC 3261, Figure 5) +enum inviteClientState { Calling, Proceeding, Completed, Terminated }; + +class SIPClient: public Medium { +public: + static SIPClient* createNew(UsageEnvironment& env, + unsigned char desiredAudioRTPPayloadFormat, + char const* mimeSubtype = NULL, + int verbosityLevel = 0, + char const* applicationName = NULL); + + void setProxyServer(struct sockaddr_storage const& proxyServerAddress, + portNumBits proxyServerPortNum); + + void setClientStartPortNum(portNumBits clientStartPortNum) { + fClientStartPortNum = clientStartPortNum; + } + + char* invite(char const* url, Authenticator* authenticator = NULL); + // Issues a SIP "INVITE" command + // Returns the session SDP description if this command succeeds + char* inviteWithPassword(char const* url, + char const* username, char const* password); + // Uses "invite()" to do an "INVITE" - first + // without using "password", then (if we get an Unauthorized + // response) with an authentication response computed from "password" + + Boolean sendACK(); // on current call + Boolean sendBYE(); // on current call + + static Boolean parseSIPURL(UsageEnvironment& env, char const* url, + NetAddress& address, portNumBits& portNum); + // (ignores any "[:]@" in "url") + static Boolean parseSIPURLUsernamePassword(char const* url, + char*& username, + char*& password); + char const* getInviteSdpReply() const { return fInviteSDPDescriptionReturned; } + + void setUserAgentString(char const* userAgentName); + // sets an alternative string to be used in SIP "User-Agent:" headers + +protected: + virtual ~SIPClient(); + +private: + SIPClient(UsageEnvironment& env, + unsigned char desiredAudioRTPPayloadFormat, + char const* mimeSubtype, + int verbosityLevel, + char const* applicationName); + // called only by createNew(); + + void reset(); + + // Routines used to implement invite*(): + char* invite1(Authenticator* authenticator); + Boolean processURL(char const* url); + Boolean sendINVITE(); + static void inviteResponseHandler(void* clientData, int mask); + void doInviteStateMachine(unsigned responseCode); + void doInviteStateTerminated(unsigned responseCode); + TaskToken fTimerA, fTimerB, fTimerD; + static void timerAHandler(void* clientData); + static void timerBHandler(void* clientData); + static void timerDHandler(void* clientData); + unsigned const fT1; // in microseconds + unsigned fTimerALen; // in microseconds; initially fT1, then doubles + unsigned fTimerACount; + + // Routines used to implement all commands: + char* createAuthenticatorString(Authenticator const* authenticator, + char const* cmd, char const* url); + Boolean sendRequest(char const* requestString, unsigned requestLength); + unsigned getResponseCode(); + unsigned getResponse(char*& responseBuffer, unsigned responseBufferSize); + Boolean parseResponseCode(char const* line, unsigned& responseCode); + +private: + // Set for all calls: + unsigned char fDesiredAudioRTPPayloadFormat; + char* fMIMESubtype; + unsigned fMIMESubtypeSize; + int fVerbosityLevel; + unsigned fCSeq; // sequence number, used in consecutive requests + char const* fApplicationName; + unsigned fApplicationNameSize; + char const* fOurAddressStr; + unsigned fOurAddressStrSize; + portNumBits fOurPortNum; + Groupsock* fOurSocket; + char* fUserAgentHeaderStr; + unsigned fUserAgentHeaderStrLen; + + // Set for each call: + char const* fURL; + unsigned fURLSize; + struct sockaddr_storage fServerAddress; + Boolean fServerAddressIsSet; + portNumBits fServerPortNum; // in host order + portNumBits fClientStartPortNum; // in host order + unsigned fCallId, fFromTag; // set by us + char const* fToTagStr; // set by the responder + unsigned fToTagStrSize; + Authenticator fValidAuthenticator; + char const* fUserName; // 'user' name used in "From:" & "Contact:" lines + unsigned fUserNameSize; + + char* fInviteSDPDescription; + char* fInviteSDPDescriptionReturned; + char* fInviteCmd; + unsigned fInviteCmdSize; + Authenticator* fWorkingAuthenticator; + inviteClientState fInviteClientState; + char fEventLoopStopFlag; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/SRTPCryptographicContext.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/SRTPCryptographicContext.hh new file mode 100644 index 000000000..2f662c088 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/SRTPCryptographicContext.hh @@ -0,0 +1,152 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// The SRTP 'Cryptographic Context', used in all of our uses of SRTP. +// Definition + +#ifndef _SRTP_CRYPTOGRAPHIC_CONTEXT_HH +#define _SRTP_CRYPTOGRAPHIC_CONTEXT_HH + +#ifndef _MIKEY_HH +#include "MIKEY.hh" +#endif + +class SRTPCryptographicContext { +public: + SRTPCryptographicContext(MIKEYState const& mikeyState); + virtual ~SRTPCryptographicContext(); + + // Authenticate (if necessary) and decrypt (if necessary) incoming SRTP and SRTCP packets. + // Returns True iff the packet is well-formed and authenticates OK. + // ("outPacketSize" will be <= "inPacketSize".) + Boolean processIncomingSRTPPacket(u_int8_t* buffer, unsigned inPacketSize, + unsigned& outPacketSize); + Boolean processIncomingSRTCPPacket(u_int8_t* buffer, unsigned inPacketSize, + unsigned& outPacketSize); + + // Encrypt (if necessary) and add an authentication tag (if necessary) to an outgoing + // RTP and RTCP packet. + // Returns True iff the packet is well-formed. + // ("outPacketSize" will be >= "inPacketSize"; there must be enough space at the end of + // "buffer" for the extra (4+10 bytes for SRTP; 4+4+10 bytes for SRTCP).) + Boolean processOutgoingSRTPPacket(u_int8_t* buffer, unsigned inPacketSize, + unsigned& outPacketSize); + Boolean processOutgoingSRTCPPacket(u_int8_t* buffer, unsigned inPacketSize, + unsigned& outPacketSize); + +#ifndef NO_OPENSSL +private: + // Definitions specific to the "SRTP_AES128_CM_HMAC_SHA1_80" ciphersuite. + // Later generalize to support more SRTP ciphersuites ##### +#define SRTP_CIPHER_KEY_LENGTH (128/8) // in bytes +#define SRTP_CIPHER_SALT_LENGTH (112/8) // in bytes +#define SRTP_MKI_LENGTH 4 // in bytes +#define SRTP_AUTH_KEY_LENGTH (160/8) // in bytes +#define SRTP_AUTH_TAG_LENGTH (80/8) // in bytes + + struct derivedKeys { + u_int8_t cipherKey[SRTP_CIPHER_KEY_LENGTH]; + u_int8_t salt[SRTP_CIPHER_SALT_LENGTH]; + u_int8_t authKey[SRTP_AUTH_KEY_LENGTH]; + }; + + struct allDerivedKeys { + derivedKeys srtp; + derivedKeys srtcp; + }; + + typedef enum { + label_srtp_encryption = 0x00, + label_srtp_msg_auth = 0x01, + label_srtp_salt = 0x02, + label_srtcp_encryption = 0x03, + label_srtcp_msg_auth = 0x04, + label_srtcp_salt = 0x05 + } SRTPKeyDerivationLabel; + + unsigned generateSRTPAuthenticationTag(u_int8_t const* dataToAuthenticate, unsigned numBytesToAuthenticate, + u_int8_t* resultAuthenticationTag); + // returns the size of the resulting authentication tag + unsigned generateSRTCPAuthenticationTag(u_int8_t const* dataToAuthenticate, unsigned numBytesToAuthenticate, + u_int8_t* resultAuthenticationTag); + // returns the size of the resulting authentication tag + + Boolean verifySRTPAuthenticationTag(u_int8_t* dataToAuthenticate, unsigned numBytesToAuthenticate, + u_int32_t roc, u_int8_t const* authenticationTag); + Boolean verifySRTCPAuthenticationTag(u_int8_t const* dataToAuthenticate, unsigned numBytesToAuthenticate, + u_int8_t const* authenticationTag); + + void decryptSRTPPacket(u_int64_t index, u_int32_t ssrc, u_int8_t* data, unsigned numDataBytes); + void decryptSRTCPPacket(u_int32_t index, u_int32_t ssrc, u_int8_t* data, unsigned numDataBytes); + + void encryptSRTPPacket(u_int64_t index, u_int32_t ssrc, u_int8_t* data, unsigned numDataBytes); + void encryptSRTCPPacket(u_int32_t index, u_int32_t ssrc, u_int8_t* data, unsigned numDataBytes); + + unsigned generateAuthenticationTag(derivedKeys& keysToUse, + u_int8_t const* dataToAuthenticate, unsigned numBytesToAuthenticate, + u_int8_t* resultAuthenticationTag); + // returns the size of the resulting authentication tag + // "resultAuthenticationTag" must point to an array of at least SRTP_AUTH_TAG_LENGTH + Boolean verifyAuthenticationTag(derivedKeys& keysToUse, + u_int8_t const* dataToAuthenticate, unsigned numBytesToAuthenticate, + u_int8_t const* authenticationTag); + + void cryptData(derivedKeys& keys, u_int64_t index, u_int32_t ssrc, + u_int8_t* data, unsigned numDataBytes); + + void performKeyDerivation(); + + void deriveKeysFromMaster(u_int8_t const* masterKey, u_int8_t const* salt, + allDerivedKeys& allKeysResult); + // used to implement "performKeyDerivation()" + void deriveSingleKey(u_int8_t const* masterKey, u_int8_t const* salt, + SRTPKeyDerivationLabel label, + unsigned resultKeyLength, u_int8_t* resultKey); + // used to implement "deriveKeysFromMaster()". + // ("resultKey" must be an existing buffer, of size >= "resultKeyLength") + +private: + MIKEYState const& fMIKEYState; + + // Master key + salt: + u_int8_t const* masterKeyPlusSalt() const { return fMIKEYState.keyData(); } + + u_int8_t const* masterKey() const { return &masterKeyPlusSalt()[0]; } + u_int8_t const* masterSalt() const { return &masterKeyPlusSalt()[SRTP_CIPHER_KEY_LENGTH]; } + + Boolean weEncryptSRTP() const { return fMIKEYState.encryptSRTP(); } + Boolean weEncryptSRTCP() const { return fMIKEYState.encryptSRTCP(); } + Boolean weAuthenticate() const { return fMIKEYState.useAuthentication(); } + u_int32_t MKI() const { return fMIKEYState.MKI(); } + + // Derived (i.e., session) keys: + allDerivedKeys fDerivedKeys; + + // State used for handling the reception of SRTP packets: + Boolean fHaveReceivedSRTPPackets; + u_int16_t fPreviousHighRTPSeqNum; + u_int32_t fReceptionROC; // rollover counter + + // State used for handling the sending of SRTP packets: + Boolean fHaveSentSRTPPackets; + u_int32_t fSendingROC; + + // State used for handling the sending of SRTCP packets: + u_int32_t fSRTCPIndex; +#endif +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/ServerMediaSession.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/ServerMediaSession.hh new file mode 100644 index 000000000..218cb1510 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/ServerMediaSession.hh @@ -0,0 +1,200 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A data structure that represents a session that consists of +// potentially multiple (audio and/or video) sub-sessions +// (This data structure is used for media *streamers* - i.e., servers. +// For media receivers, use "MediaSession" instead.) +// C++ header + +#ifndef _SERVER_MEDIA_SESSION_HH +#define _SERVER_MEDIA_SESSION_HH + +#ifndef _RTCP_HH +#include "RTCP.hh" +#endif + +class ServerMediaSubsession; // forward + +class ServerMediaSession: public Medium { +public: + static ServerMediaSession* createNew(UsageEnvironment& env, + char const* streamName = NULL, + char const* info = NULL, + char const* description = NULL, + Boolean isSSM = False, + char const* miscSDPLines = NULL); + + static Boolean lookupByName(UsageEnvironment& env, + char const* mediumName, + ServerMediaSession*& resultSession); + + char* generateSDPDescription(int addressFamily); // based on the entire session + // Note: The caller is responsible for freeing the returned string + + char const* streamName() const { return fStreamName; } + + Boolean addSubsession(ServerMediaSubsession* subsession); + unsigned numSubsessions() const { return fSubsessionCounter; } + + void testScaleFactor(float& scale); // sets "scale" to the actual supported scale + float duration() const; + // a result == 0 means an unbounded session (the default) + // a result < 0 means: subsession durations differ; the result is -(the largest). + // a result > 0 means: this is the duration of a bounded session + + virtual void noteLiveness(); + // called whenever a client - accessing this media - notes liveness. + // The default implementation does nothing, but subclasses can redefine this - e.g., if you + // want to remove long-unused "ServerMediaSession"s from the server. + + unsigned referenceCount() const { return fReferenceCount; } + void incrementReferenceCount() { ++fReferenceCount; } + void decrementReferenceCount() { if (fReferenceCount > 0) --fReferenceCount; } + Boolean& deleteWhenUnreferenced() { return fDeleteWhenUnreferenced; } + + void deleteAllSubsessions(); + // Removes and deletes all subsessions added by "addSubsession()", returning us to an 'empty' state + // Note: If you have already added this "ServerMediaSession" to a server then, before calling this function, + // you must first close any client connections that use it, + // by calling "GenericMediaServer::closeAllClientSessionsForServerMediaSession()". + + Boolean streamingUsesSRTP; // by default, False + Boolean streamingIsEncrypted; // by default, False + +protected: + ServerMediaSession(UsageEnvironment& env, char const* streamName, + char const* info, char const* description, + Boolean isSSM, char const* miscSDPLines); + // called only by "createNew()" + + virtual ~ServerMediaSession(); + +private: // redefined virtual functions + virtual Boolean isServerMediaSession() const; + +private: + Boolean fIsSSM; + + // Linkage fields: + friend class ServerMediaSubsessionIterator; + ServerMediaSubsession* fSubsessionsHead; + ServerMediaSubsession* fSubsessionsTail; + unsigned fSubsessionCounter; + + char* fStreamName; + char* fInfoSDPString; + char* fDescriptionSDPString; + char* fMiscSDPLines; + struct timeval fCreationTime; + unsigned fReferenceCount; + Boolean fDeleteWhenUnreferenced; +}; + + +class ServerMediaSubsessionIterator { +public: + ServerMediaSubsessionIterator(ServerMediaSession& session); + virtual ~ServerMediaSubsessionIterator(); + + ServerMediaSubsession* next(); // NULL if none + void reset(); + +private: + ServerMediaSession& fOurSession; + ServerMediaSubsession* fNextPtr; +}; + + +class ServerMediaSubsession: public Medium { +public: + unsigned trackNumber() const { return fTrackNumber; } + char const* trackId(); + virtual char const* sdpLines(int addressFamily) = 0; + virtual void getStreamParameters(unsigned clientSessionId, // in + struct sockaddr_storage const& clientAddress, // in + Port const& clientRTPPort, // in + Port const& clientRTCPPort, // in + int tcpSocketNum, // in (-1 means use UDP, not TCP) + unsigned char rtpChannelId, // in (used if TCP) + unsigned char rtcpChannelId, // in (used if TCP) + TLSState* tlsState, // in (used if TCP) + struct sockaddr_storage& destinationAddress, // in out + u_int8_t& destinationTTL, // in out + Boolean& isMulticast, // out + Port& serverRTPPort, // out + Port& serverRTCPPort, // out + void*& streamToken // out + ) = 0; + virtual void startStream(unsigned clientSessionId, void* streamToken, + TaskFunc* rtcpRRHandler, + void* rtcpRRHandlerClientData, + unsigned short& rtpSeqNum, + unsigned& rtpTimestamp, + ServerRequestAlternativeByteHandler* serverRequestAlternativeByteHandler, + void* serverRequestAlternativeByteHandlerClientData) = 0; + virtual void pauseStream(unsigned clientSessionId, void* streamToken); + virtual void seekStream(unsigned clientSessionId, void* streamToken, double& seekNPT, + double streamDuration, u_int64_t& numBytes); + // This routine is used to seek by relative (i.e., NPT) time. + // "streamDuration", if >0.0, specifies how much data to stream, past "seekNPT". (If <=0.0, all remaining data is streamed.) + // "numBytes" returns the size (in bytes) of the data to be streamed, or 0 if unknown or unlimited. + virtual void seekStream(unsigned clientSessionId, void* streamToken, char*& absStart, char*& absEnd); + // This routine is used to seek by 'absolute' time. + // "absStart" should be a string of the form "YYYYMMDDTHHMMSSZ" or "YYYYMMDDTHHMMSS.Z". + // "absEnd" should be either NULL (for no end time), or a string of the same form as "absStart". + // These strings may be modified in-place, or can be reassigned to a newly-allocated value (after delete[]ing the original). + virtual void nullSeekStream(unsigned clientSessionId, void* streamToken, + double streamEndTime, u_int64_t& numBytes); + // Called whenever we're handling a "PLAY" command without a specified start time. + virtual void setStreamScale(unsigned clientSessionId, void* streamToken, float scale); + virtual float getCurrentNPT(void* streamToken); + virtual FramedSource* getStreamSource(void* streamToken); + virtual void getRTPSinkandRTCP(void* streamToken, + RTPSink const*& rtpSink, RTCPInstance const*& rtcp) = 0; + // Returns pointers to the "RTPSink" and "RTCPInstance" objects for "streamToken". + // (This can be useful if you want to get the associated 'Groupsock' objects, for example.) + // You must not delete these objects, or start/stop playing them; instead, that is done + // using the "startStream()" and "deleteStream()" functions. + virtual void deleteStream(unsigned clientSessionId, void*& streamToken); + + virtual void testScaleFactor(float& scale); // sets "scale" to the actual supported scale + virtual float duration() const; + // returns 0 for an unbounded session (the default) + // returns > 0 for a bounded session + virtual void getAbsoluteTimeRange(char*& absStartTime, char*& absEndTime) const; + // Subclasses can reimplement this iff they support seeking by 'absolute' time. + +protected: // we're a virtual base class + ServerMediaSubsession(UsageEnvironment& env); + virtual ~ServerMediaSubsession(); + + char const* rangeSDPLine() const; + // returns a string to be delete[]d + + ServerMediaSession* fParentSession; + +private: + friend class ServerMediaSession; + friend class ServerMediaSubsessionIterator; + ServerMediaSubsession* fNext; + + unsigned fTrackNumber; // within an enclosing ServerMediaSession + char const* fTrackId; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/SimpleRTPSink.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/SimpleRTPSink.hh new file mode 100644 index 000000000..74516e04f --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/SimpleRTPSink.hh @@ -0,0 +1,76 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A simple RTP sink that packs frames into each outgoing +// packet, without any fragmentation or special headers. +// C++ header + +#ifndef _SIMPLE_RTP_SINK_HH +#define _SIMPLE_RTP_SINK_HH + +#ifndef _MULTI_FRAMED_RTP_SINK_HH +#include "MultiFramedRTPSink.hh" +#endif + +class SimpleRTPSink: public MultiFramedRTPSink { +public: + static SimpleRTPSink* + createNew(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency, + char const* sdpMediaTypeString, + char const* rtpPayloadFormatName, + unsigned numChannels = 1, + Boolean allowMultipleFramesPerPacket = True, + Boolean doNormalMBitRule = True); + // "doNormalMBitRule" means: If the medium (i.e., "sdpMediaTypeString") is other than "audio", set the RTP "M" bit + // on each outgoing packet iff it contains the last (or only) fragment of a frame. + // Otherwise (i.e., if "doNormalMBitRule" is False, or the medium is "audio"), leave the "M" bit unset. + + void setMBitOnNextPacket() { fSetMBitOnNextPacket = True; } // hack for optionally setting the RTP 'M' bit from outside the class + +protected: + SimpleRTPSink(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency, + char const* sdpMediaTypeString, + char const* rtpPayloadFormatName, + unsigned numChannels, + Boolean allowMultipleFramesPerPacket, + Boolean doNormalMBitRule); + // called only by createNew() + + virtual ~SimpleRTPSink(); + +protected: // redefined virtual functions + virtual void doSpecialFrameHandling(unsigned fragmentationOffset, + unsigned char* frameStart, + unsigned numBytesInFrame, + struct timeval framePresentationTime, + unsigned numRemainingBytes); + virtual + Boolean frameCanAppearAfterPacketStart(unsigned char const* frameStart, + unsigned numBytesInFrame) const; + virtual char const* sdpMediaType() const; + +private: + char const* fSDPMediaTypeString; + Boolean fAllowMultipleFramesPerPacket; + Boolean fSetMBitOnLastFrames, fSetMBitOnNextPacket; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/SimpleRTPSource.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/SimpleRTPSource.hh new file mode 100644 index 000000000..705070963 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/SimpleRTPSource.hh @@ -0,0 +1,65 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A RTP source for a simple RTP payload format that +// - doesn't have any special headers following the RTP header +// (if necessary, the "offset" parameter can be used to specify a +// special header that we just skip over) +// - doesn't have any special framing apart from the packet data itself +// C++ header + +#ifndef _SIMPLE_RTP_SOURCE_HH +#define _SIMPLE_RTP_SOURCE_HH + +#ifndef _MULTI_FRAMED_RTP_SOURCE_HH +#include "MultiFramedRTPSource.hh" +#endif + +class SimpleRTPSource: public MultiFramedRTPSource { +public: + static SimpleRTPSource* createNew(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency, + char const* mimeTypeString, + unsigned offset = 0, + Boolean doNormalMBitRule = True); + // "doNormalMBitRule" means: If the medium is not audio, use the RTP "M" + // bit on each incoming packet to indicate the last (or only) fragment + // of a frame. Otherwise (i.e., if "doNormalMBitRule" is False, or the medium is "audio"), the "M" bit is ignored. + +protected: + SimpleRTPSource(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency, + char const* mimeTypeString, unsigned offset, + Boolean doNormalMBitRule); + // called only by createNew(), or by subclass constructors + virtual ~SimpleRTPSource(); + +protected: + // redefined virtual functions: + virtual Boolean processSpecialHeader(BufferedPacket* packet, + unsigned& resultSpecialHeaderSize); + virtual char const* MIMEtype() const; + +private: + char const* fMIMEtypeString; + unsigned fOffset; + Boolean fUseMBitForFrameEnd; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/StreamReplicator.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/StreamReplicator.hh new file mode 100644 index 000000000..0490149b4 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/StreamReplicator.hh @@ -0,0 +1,84 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// An class that can be used to create (possibly multiple) 'replicas' of an incoming stream. +// C++ header + +#ifndef _STREAM_REPLICATOR_HH +#define _STREAM_REPLICATOR_HH + +#ifndef _FRAMED_SOURCE_HH +#include "FramedSource.hh" +#endif + +class StreamReplica; // forward + +class StreamReplicator: public Medium { +public: + static StreamReplicator* createNew(UsageEnvironment& env, FramedSource* inputSource, Boolean deleteWhenLastReplicaDies = True); + // If "deleteWhenLastReplicaDies" is True (the default), then the "StreamReplicator" object is deleted when (and only when) + // all replicas have been deleted. (In this case, you must *not* call "Medium::close()" on the "StreamReplicator" object, + // unless you never created any replicas from it to begin with.) + // If "deleteWhenLastReplicaDies" is False, then the "StreamReplicator" object remains in existence, even when all replicas + // have been deleted. (This allows you to create new replicas later, if you wish.) In this case, you delete the + // "StreamReplicator" object by calling "Medium::close()" on it - but you must do so only when "numReplicas()" returns 0. + + FramedSource* createStreamReplica(); + + unsigned numReplicas() const { return fNumReplicas; } + + FramedSource* inputSource() const { return fInputSource; } + + // Call before destruction if you want to prevent the destructor from closing the input source + void detachInputSource() { fInputSource = NULL; } + +protected: + StreamReplicator(UsageEnvironment& env, FramedSource* inputSource, Boolean deleteWhenLastReplicaDies); + // called only by "createNew()" + virtual ~StreamReplicator(); + +private: + // Routines called by replicas to implement frame delivery, and the stopping/restarting/deletion of replicas: + friend class StreamReplica; + void getNextFrame(StreamReplica* replica); + void deactivateStreamReplica(StreamReplica* replica); + void removeStreamReplica(StreamReplica* replica); + +private: + static void afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + void afterGettingFrame(unsigned frameSize, unsigned numTruncatedBytes, + struct timeval presentationTime, unsigned durationInMicroseconds); + + static void onSourceClosure(void* clientData); + void onSourceClosure(); + + void deliverReceivedFrame(); + +private: + FramedSource* fInputSource; + Boolean fDeleteWhenLastReplicaDies, fInputSourceHasClosed; + unsigned fNumReplicas, fNumActiveReplicas, fNumDeliveriesMadeSoFar; + int fFrameIndex; // 0 or 1; used to figure out if a replica is requesting the current frame, or the next frame + + StreamReplica* fPrimaryReplica; // the first replica that requests each frame. We use its buffer when copying to the others. + StreamReplica* fReplicasAwaitingCurrentFrame; // other than the 'primary' replica + StreamReplica* fReplicasAwaitingNextFrame; // replicas that have already received the current frame, and have asked for the next +}; +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/T140TextRTPSink.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/T140TextRTPSink.hh new file mode 100644 index 000000000..7c52514df --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/T140TextRTPSink.hh @@ -0,0 +1,103 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP sink for T.140 text (RFC 2793) +// C++ header + +#ifndef _T140_TEXT_RTP_SINK_HH +#define _T140_TEXT_RTP_SINK_HH + +#ifndef _TEXT_RTP_SINK_HH +#include "TextRTPSink.hh" +#endif +#ifndef _FRAMED_FILTER_HH +#include "FramedFilter.hh" +#endif + +class T140IdleFilter; + +class T140TextRTPSink: public TextRTPSink { +public: + static T140TextRTPSink* createNew(UsageEnvironment& env, Groupsock* RTPgs, unsigned char rtpPayloadFormat); + +protected: + T140TextRTPSink(UsageEnvironment& env, Groupsock* RTPgs, unsigned char rtpPayloadFormat); + // called only by createNew() + + virtual ~T140TextRTPSink(); + +protected: // redefined virtual functions: + virtual Boolean continuePlaying(); + virtual void doSpecialFrameHandling(unsigned fragmentationOffset, + unsigned char* frameStart, + unsigned numBytesInFrame, + struct timeval framePresentationTime, + unsigned numRemainingBytes); + virtual Boolean frameCanAppearAfterPacketStart(unsigned char const* frameStart, + unsigned numBytesInFrame) const; + +protected: + T140IdleFilter* fOurIdleFilter; + Boolean fAreInIdlePeriod; +}; + + +////////// T140IdleFilter definition ////////// + +// Because the T.140 text RTP payload format specification recommends that (empty) RTP packets be sent during 'idle periods' +// when no new text is available, we implement "T140TextRTPSink" using a separate "T140IdleFilter" class - sitting in front +// - that delivers, to the "T140TextRTPSink", a continuous sequence of (possibly) empty frames. +// (Note: This class should be used only by "T140TextRTPSink", or a subclass.) + +class T140IdleFilter: public FramedFilter { +public: + T140IdleFilter(UsageEnvironment& env, FramedSource* inputSource); + virtual ~T140IdleFilter(); + +private: // redefined virtual functions: + virtual void doGetNextFrame(); + virtual void doStopGettingFrames(); + +private: + static void afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + void afterGettingFrame(unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + + static void handleIdleTimeout(void* clientData); + void handleIdleTimeout(); + + void deliverFromBuffer(); + void deliverEmptyFrame(); + + static void onSourceClosure(void* clientData); + void onSourceClosure(); + +private: + TaskToken fIdleTimerTask; + unsigned fBufferSize, fNumBufferedBytes; + char* fBuffer; + unsigned fBufferedNumTruncatedBytes; // a count of truncated bytes from the upstream + struct timeval fBufferedDataPresentationTime; + unsigned fBufferedDataDurationInMicroseconds; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/TLSState.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/TLSState.hh new file mode 100644 index 000000000..2ef2bbade --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/TLSState.hh @@ -0,0 +1,100 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// State encapsulating a TLS connection +// C++ header + +#ifndef _TLS_STATE_HH +#define _TLS_STATE_HH + +#ifndef _NET_COMMON_H +#include "NetCommon.h" +#endif +#ifndef _BOOLEAN_HH +#include "Boolean.hh" +#endif +#ifndef _USAGE_ENVIRONMENT_HH +#include "UsageEnvironment.hh" +#endif +#ifndef NO_OPENSSL +#include +#endif + +class TLSState { +public: + Boolean isNeeded; + + int write(const char* data, unsigned count); + int read(u_int8_t* buffer, unsigned bufferSize); + + void nullify(); // clear the state so that the destructor will have no effect + +protected: // we're an abstract base class + TLSState(); + virtual ~TLSState(); + +#ifndef NO_OPENSSL + void initLibrary(); + void reset(); + +protected: + Boolean fHasBeenSetup; + SSL_CTX* fCtx; + SSL* fCon; +#endif +}; + +class ClientTLSState: public TLSState { +public: + ClientTLSState(class RTSPClient& client); + virtual ~ClientTLSState(); + + int connect(int socketNum); // returns: <0 (error), 0 (pending), >0 (success) + +#ifndef NO_OPENSSL +private: + Boolean setup(int socketNum); + +private: + class RTSPClient& fClient; +#endif +}; + +class ServerTLSState: public TLSState { +public: + ServerTLSState(UsageEnvironment& env); + virtual ~ServerTLSState(); + + void setCertificateAndPrivateKeyFileNames(char const* certFileName, char const* privKeyFileName); + void assignStateFrom(ServerTLSState const& from); + + int accept(int socketNum); // returns: <0 (error), 0 (pending), >0 (success) + + Boolean tlsAcceptIsNeeded; + +#ifndef NO_OPENSSL +private: + Boolean setup(int socketNum); + +private: + UsageEnvironment& fEnv; + char const* fCertificateFileName; + char const* fPrivateKeyFileName; +#endif +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/TextRTPSink.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/TextRTPSink.hh new file mode 100644 index 000000000..697ef8bf9 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/TextRTPSink.hh @@ -0,0 +1,41 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A generic RTP sink for text codecs (abstract base class) +// C++ header + +#ifndef _TEXT_RTP_SINK_HH +#define _TEXT_RTP_SINK_HH + +#ifndef _MULTI_FRAMED_RTP_SINK_HH +#include "MultiFramedRTPSink.hh" +#endif + +class TextRTPSink: public MultiFramedRTPSink { +protected: + TextRTPSink(UsageEnvironment& env, + Groupsock* rtpgs, unsigned char rtpPayloadType, + unsigned rtpTimestampFrequency, + char const* rtpPayloadFormatName); + // (we're an abstract base class) + virtual ~TextRTPSink(); + +private: // redefined virtual functions: + virtual char const* sdpMediaType() const; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/TheoraVideoRTPSink.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/TheoraVideoRTPSink.hh new file mode 100644 index 000000000..238a14059 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/TheoraVideoRTPSink.hh @@ -0,0 +1,72 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP sink for Theora video +// C++ header + +#ifndef _THEORA_VIDEO_RTP_SINK_HH +#define _THEORA_VIDEO_RTP_SINK_HH + +#ifndef _VIDEO_RTP_SINK_HH +#include "VideoRTPSink.hh" +#endif + +class TheoraVideoRTPSink: public VideoRTPSink { +public: + static TheoraVideoRTPSink* + createNew(UsageEnvironment& env, Groupsock* RTPgs, u_int8_t rtpPayloadFormat, + // The following headers provide the 'configuration' information, for the SDP description: + u_int8_t* identificationHeader, unsigned identificationHeaderSize, + u_int8_t* commentHeader, unsigned commentHeaderSize, + u_int8_t* setupHeader, unsigned setupHeaderSize, + u_int32_t identField = 0xFACADE); + + static TheoraVideoRTPSink* + createNew(UsageEnvironment& env, Groupsock* RTPgs, u_int8_t rtpPayloadFormat, + char const* configStr); + // an optional variant of "createNew()" that takes a Base-64-encoded 'configuration' string, + // rather than the raw configuration headers as parameter. + +protected: + TheoraVideoRTPSink(UsageEnvironment& env, Groupsock* RTPgs, + u_int8_t rtpPayloadFormat, + u_int8_t* identificationHeader, unsigned identificationHeaderSize, + u_int8_t* commentHeader, unsigned commentHeaderSize, + u_int8_t* setupHeader, unsigned setupHeaderSize, + u_int32_t identField); + // called only by createNew() + + virtual ~TheoraVideoRTPSink(); + +private: // redefined virtual functions: + virtual char const* auxSDPLine(); // for the "a=fmtp:" SDP line + + virtual void doSpecialFrameHandling(unsigned fragmentationOffset, + unsigned char* frameStart, + unsigned numBytesInFrame, + struct timeval framePresentationTime, + unsigned numRemainingBytes); + virtual Boolean frameCanAppearAfterPacketStart(unsigned char const* frameStart, + unsigned numBytesInFrame) const; + virtual unsigned specialHeaderSize() const; + +private: + u_int32_t fIdent; // "Ident" field used by this stream. (Only the low 24 bits of this are used.) + char* fFmtpSDPLine; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/TheoraVideoRTPSource.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/TheoraVideoRTPSource.hh new file mode 100644 index 000000000..9ecef6665 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/TheoraVideoRTPSource.hh @@ -0,0 +1,53 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Theora Video Audio RTP Sources +// C++ header + +#ifndef _THEORA_VIDEO_RTP_SOURCE_HH +#define _THEORA_VIDEO_RTP_SOURCE_HH + +#ifndef _MULTI_FRAMED_RTP_SOURCE_HH +#include "MultiFramedRTPSource.hh" +#endif + +class TheoraVideoRTPSource: public MultiFramedRTPSource { +public: + static TheoraVideoRTPSource* + createNew(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat); + + u_int32_t curPacketIdent() const { return fCurPacketIdent; } // The current "Ident" field; only the low-order 24 bits are used + +protected: + TheoraVideoRTPSource(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat); + // called only by createNew() + + virtual ~TheoraVideoRTPSource(); + +protected: + // redefined virtual functions: + virtual Boolean processSpecialHeader(BufferedPacket* packet, + unsigned& resultSpecialHeaderSize); + virtual char const* MIMEtype() const; + +private: + u_int32_t fCurPacketIdent; // only the low-order 24 bits are used +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/VP8VideoRTPSink.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/VP8VideoRTPSink.hh new file mode 100644 index 000000000..d1b7ca0a6 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/VP8VideoRTPSink.hh @@ -0,0 +1,50 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP sink for VP8 video +// C++ header + +#ifndef _VP8_VIDEO_RTP_SINK_HH +#define _VP8_VIDEO_RTP_SINK_HH + +#ifndef _VIDEO_RTP_SINK_HH +#include "VideoRTPSink.hh" +#endif + +class VP8VideoRTPSink: public VideoRTPSink { +public: + static VP8VideoRTPSink* createNew(UsageEnvironment& env, Groupsock* RTPgs, unsigned char rtpPayloadFormat); + +protected: + VP8VideoRTPSink(UsageEnvironment& env, Groupsock* RTPgs, unsigned char rtpPayloadFormat); + // called only by createNew() + + virtual ~VP8VideoRTPSink(); + +private: // redefined virtual functions: + virtual void doSpecialFrameHandling(unsigned fragmentationOffset, + unsigned char* frameStart, + unsigned numBytesInFrame, + struct timeval framePresentationTime, + unsigned numRemainingBytes); + virtual + Boolean frameCanAppearAfterPacketStart(unsigned char const* frameStart, + unsigned numBytesInFrame) const; + virtual unsigned specialHeaderSize() const; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/VP8VideoRTPSource.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/VP8VideoRTPSource.hh new file mode 100644 index 000000000..d5a8f07ac --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/VP8VideoRTPSource.hh @@ -0,0 +1,50 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// VP8 Video RTP Sources +// C++ header + +#ifndef _VP8_VIDEO_RTP_SOURCE_HH +#define _VP8_VIDEO_RTP_SOURCE_HH + +#ifndef _MULTI_FRAMED_RTP_SOURCE_HH +#include "MultiFramedRTPSource.hh" +#endif + +class VP8VideoRTPSource: public MultiFramedRTPSource { +public: + static VP8VideoRTPSource* + createNew(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency = 90000); + +protected: + VP8VideoRTPSource(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency); + // called only by createNew() + + virtual ~VP8VideoRTPSource(); + +protected: + // redefined virtual functions: + virtual Boolean processSpecialHeader(BufferedPacket* packet, + unsigned& resultSpecialHeaderSize); + virtual char const* MIMEtype() const; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/VP9VideoRTPSink.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/VP9VideoRTPSink.hh new file mode 100644 index 000000000..2124101a7 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/VP9VideoRTPSink.hh @@ -0,0 +1,50 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP sink for VP9 video +// C++ header + +#ifndef _VP9_VIDEO_RTP_SINK_HH +#define _VP9_VIDEO_RTP_SINK_HH + +#ifndef _VIDEO_RTP_SINK_HH +#include "VideoRTPSink.hh" +#endif + +class VP9VideoRTPSink: public VideoRTPSink { +public: + static VP9VideoRTPSink* createNew(UsageEnvironment& env, Groupsock* RTPgs, unsigned char rtpPayloadFormat); + +protected: + VP9VideoRTPSink(UsageEnvironment& env, Groupsock* RTPgs, unsigned char rtpPayloadFormat); + // called only by createNew() + + virtual ~VP9VideoRTPSink(); + +private: // redefined virtual functions: + virtual void doSpecialFrameHandling(unsigned fragmentationOffset, + unsigned char* frameStart, + unsigned numBytesInFrame, + struct timeval framePresentationTime, + unsigned numRemainingBytes); + virtual + Boolean frameCanAppearAfterPacketStart(unsigned char const* frameStart, + unsigned numBytesInFrame) const; + virtual unsigned specialHeaderSize() const; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/VP9VideoRTPSource.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/VP9VideoRTPSource.hh new file mode 100644 index 000000000..c6f0b5048 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/VP9VideoRTPSource.hh @@ -0,0 +1,50 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// VP9 Video RTP Sources +// C++ header + +#ifndef _VP9_VIDEO_RTP_SOURCE_HH +#define _VP9_VIDEO_RTP_SOURCE_HH + +#ifndef _MULTI_FRAMED_RTP_SOURCE_HH +#include "MultiFramedRTPSource.hh" +#endif + +class VP9VideoRTPSource: public MultiFramedRTPSource { +public: + static VP9VideoRTPSource* + createNew(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency = 90000); + +protected: + VP9VideoRTPSource(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency); + // called only by createNew() + + virtual ~VP9VideoRTPSource(); + +protected: + // redefined virtual functions: + virtual Boolean processSpecialHeader(BufferedPacket* packet, + unsigned& resultSpecialHeaderSize); + virtual char const* MIMEtype() const; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/VideoRTPSink.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/VideoRTPSink.hh new file mode 100644 index 000000000..c4d180e85 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/VideoRTPSink.hh @@ -0,0 +1,41 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A generic RTP sink for video codecs (abstract base class) +// C++ header + +#ifndef _VIDEO_RTP_SINK_HH +#define _VIDEO_RTP_SINK_HH + +#ifndef _MULTI_FRAMED_RTP_SINK_HH +#include "MultiFramedRTPSink.hh" +#endif + +class VideoRTPSink: public MultiFramedRTPSink { +protected: + VideoRTPSink(UsageEnvironment& env, + Groupsock* rtpgs, unsigned char rtpPayloadType, + unsigned rtpTimestampFrequency, + char const* rtpPayloadFormatName); + // (we're an abstract base class) + virtual ~VideoRTPSink(); + +private: // redefined virtual functions: + virtual char const* sdpMediaType() const; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/VorbisAudioRTPSink.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/VorbisAudioRTPSink.hh new file mode 100644 index 000000000..1abf33f84 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/VorbisAudioRTPSink.hh @@ -0,0 +1,85 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// RTP sink for Vorbis audio +// C++ header + +#ifndef _VORBIS_AUDIO_RTP_SINK_HH +#define _VORBIS_AUDIO_RTP_SINK_HH + +#ifndef _AUDIO_RTP_SINK_HH +#include "AudioRTPSink.hh" +#endif + +class VorbisAudioRTPSink: public AudioRTPSink { +public: + static VorbisAudioRTPSink* + createNew(UsageEnvironment& env, Groupsock* RTPgs, u_int8_t rtpPayloadFormat, + u_int32_t rtpTimestampFrequency, unsigned numChannels, + // The following headers provide the 'configuration' information, for the SDP description: + u_int8_t* identificationHeader, unsigned identificationHeaderSize, + u_int8_t* commentHeader, unsigned commentHeaderSize, + u_int8_t* setupHeader, unsigned setupHeaderSize, + u_int32_t identField = 0xFACADE); + + static VorbisAudioRTPSink* + createNew(UsageEnvironment& env, Groupsock* RTPgs, u_int8_t rtpPayloadFormat, + u_int32_t rtpTimestampFrequency, unsigned numChannels, + char const* configStr); + // an optional variant of "createNew()" that takes a Base-64-encoded 'configuration' string, + // rather than the raw configuration headers as parameter. + +protected: + VorbisAudioRTPSink(UsageEnvironment& env, Groupsock* RTPgs, + u_int8_t rtpPayloadFormat, u_int32_t rtpTimestampFrequency, unsigned numChannels, + u_int8_t* identificationHeader, unsigned identificationHeaderSize, + u_int8_t* commentHeader, unsigned commentHeaderSize, + u_int8_t* setupHeader, unsigned setupHeaderSize, + u_int32_t identField); + // called only by createNew() + + virtual ~VorbisAudioRTPSink(); + +private: // redefined virtual functions: + virtual char const* auxSDPLine(); // for the "a=fmtp:" SDP line + + virtual void doSpecialFrameHandling(unsigned fragmentationOffset, + unsigned char* frameStart, + unsigned numBytesInFrame, + struct timeval framePresentationTime, + unsigned numRemainingBytes); + virtual Boolean frameCanAppearAfterPacketStart(unsigned char const* frameStart, + unsigned numBytesInFrame) const; + virtual unsigned specialHeaderSize() const; + virtual unsigned frameSpecificHeaderSize() const; + +private: + u_int32_t fIdent; // "Ident" field used by this stream. (Only the low 24 bits of this are used.) + char* fFmtpSDPLine; +}; + + +// A general function used by both "VorbisAudioRTPSink" and "TheoraVideoRTPSink" to construct +// a Base64-encoded 'config' string (for SDP) from "identification", "comment", "setup" headers. +// (Note: The result string was heap-allocated, and the caller should delete[] it afterwards.) + +char* generateVorbisOrTheoraConfigStr(u_int8_t* identificationHeader, unsigned identificationHeaderSize, + u_int8_t* commentHeader, unsigned commentHeaderSize, + u_int8_t* setupHeader, unsigned setupHeaderSize, + u_int32_t identField); + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/VorbisAudioRTPSource.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/VorbisAudioRTPSource.hh new file mode 100644 index 000000000..8eec0ec71 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/VorbisAudioRTPSource.hh @@ -0,0 +1,66 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Vorbis Audio RTP Sources +// C++ header + +#ifndef _VORBIS_AUDIO_RTP_SOURCE_HH +#define _VORBIS_AUDIO_RTP_SOURCE_HH + +#ifndef _MULTI_FRAMED_RTP_SOURCE_HH +#include "MultiFramedRTPSource.hh" +#endif + +class VorbisAudioRTPSource: public MultiFramedRTPSource { +public: + static VorbisAudioRTPSource* + createNew(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency); + + u_int32_t curPacketIdent() const { return fCurPacketIdent; } // The current "Ident" field; only the low-order 24 bits are used + +protected: + VorbisAudioRTPSource(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency); + // called only by createNew() + + virtual ~VorbisAudioRTPSource(); + +protected: + // redefined virtual functions: + virtual Boolean processSpecialHeader(BufferedPacket* packet, + unsigned& resultSpecialHeaderSize); + virtual char const* MIMEtype() const; + +private: + u_int32_t fCurPacketIdent; // only the low-order 24 bits are used +}; + +void parseVorbisOrTheoraConfigStr(char const* configStr, + u_int8_t*& identificationHdr, unsigned& identificationHdrSize, + u_int8_t*& commentHdr, unsigned& commentHdrSize, + u_int8_t*& setupHdr, unsigned& setupHdrSize, + u_int32_t& identField); + // Returns (in each of the result parameters) unpacked Vorbis or Theora + // "identification", "comment", and "setup" headers that were specified in a + // "config" string (in the SDP description for a Vorbis/RTP or Theora/RTP stream). + // Each of the "*Hdr" result arrays are dynamically allocated by this routine, + // and must be delete[]d by the caller. + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/WAVAudioFileServerMediaSubsession.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/WAVAudioFileServerMediaSubsession.hh new file mode 100644 index 000000000..66a59fa69 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/WAVAudioFileServerMediaSubsession.hh @@ -0,0 +1,68 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A 'ServerMediaSubsession' object that creates new, unicast, "RTPSink"s +// on demand, from an WAV audio file. +// C++ header + +#ifndef _WAV_AUDIO_FILE_SERVER_MEDIA_SUBSESSION_HH +#define _WAV_AUDIO_FILE_SERVER_MEDIA_SUBSESSION_HH + +#ifndef _FILE_SERVER_MEDIA_SUBSESSION_HH +#include "FileServerMediaSubsession.hh" +#endif + +class WAVAudioFileServerMediaSubsession: public FileServerMediaSubsession{ +public: + static WAVAudioFileServerMediaSubsession* + createNew(UsageEnvironment& env, char const* fileName, Boolean reuseFirstSource, + Boolean convertToULaw = False); + // If "convertToULaw" is True, 16-bit audio streams are converted to + // 8-bit u-law audio prior to streaming. + +protected: + WAVAudioFileServerMediaSubsession(UsageEnvironment& env, char const* fileName, + Boolean reuseFirstSource, Boolean convertToULaw); + // called only by createNew(); + virtual ~WAVAudioFileServerMediaSubsession(); + +protected: // redefined virtual functions + virtual void seekStreamSource(FramedSource* inputSource, double& seekNPT, double streamDuration, u_int64_t& numBytes); + virtual void setStreamSourceScale(FramedSource* inputSource, float scale); + virtual void setStreamSourceDuration(FramedSource* inputSource, double streamDuration, u_int64_t& numBytes); + + virtual FramedSource* createNewStreamSource(unsigned clientSessionId, + unsigned& estBitrate); + virtual RTPSink* createNewRTPSink(Groupsock* rtpGroupsock, + unsigned char rtpPayloadTypeIfDynamic, + FramedSource* inputSource); + virtual void testScaleFactor(float& scale); + virtual float duration() const; + +protected: + Boolean fConvertToULaw; + + // The following parameters of the input stream are set after + // "createNewStreamSource" is called: + unsigned char fAudioFormat; + unsigned char fBitsPerSample; + unsigned fSamplingFrequency; + unsigned fNumChannels; + float fFileDuration; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/WAVAudioFileSource.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/WAVAudioFileSource.hh new file mode 100644 index 000000000..7972a6663 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/WAVAudioFileSource.hh @@ -0,0 +1,86 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A WAV audio file source +// NOTE: Samples are returned in little-endian order (the same order in which +// they were stored in the file). +// C++ header + +#ifndef _WAV_AUDIO_FILE_SOURCE_HH +#define _WAV_AUDIO_FILE_SOURCE_HH + +#ifndef _AUDIO_INPUT_DEVICE_HH +#include "AudioInputDevice.hh" +#endif + +typedef enum { + WA_PCM = 0x01, + WA_PCMA = 0x06, + WA_PCMU = 0x07, + WA_IMA_ADPCM = 0x11, + WA_UNKNOWN +} WAV_AUDIO_FORMAT; + + +class WAVAudioFileSource: public AudioInputDevice { +public: + + static WAVAudioFileSource* createNew(UsageEnvironment& env, + char const* fileName); + + unsigned numPCMBytes() const; + void setScaleFactor(int scale); + void seekToPCMByte(unsigned byteNumber); + void limitNumBytesToStream(unsigned numBytesToStream); + // if "numBytesToStream" is >0, then we limit the stream to that number of bytes, before treating it as EOF + + unsigned char getAudioFormat(); + +protected: + WAVAudioFileSource(UsageEnvironment& env, FILE* fid); + // called only by createNew() + + virtual ~WAVAudioFileSource(); + + static void fileReadableHandler(WAVAudioFileSource* source, int mask); + void doReadFromFile(); + +private: + // redefined virtual functions: + virtual void doGetNextFrame(); + virtual void doStopGettingFrames(); + virtual Boolean setInputPort(int portIndex); + virtual double getAverageLevel() const; + +protected: + unsigned fPreferredFrameSize; + +private: + FILE* fFid; + double fPlayTimePerSample; // useconds + Boolean fFidIsSeekable; + unsigned fLastPlayTime; // useconds + Boolean fHaveStartedReading; + unsigned fWAVHeaderSize; + unsigned fFileSize; + int fScaleFactor; + Boolean fLimitNumBytesToStream; + unsigned fNumBytesToStream; // used iff "fLimitNumBytesToStream" is True + unsigned char fAudioFormat; +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/liveMedia.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/liveMedia.hh new file mode 100644 index 000000000..325119e46 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/liveMedia.hh @@ -0,0 +1,137 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Inclusion of header files representing the interface +// for the entire library +// +// Programs that use the library can include this header file, +// instead of each of the individual media header files + +#ifndef _LIVEMEDIA_HH +#define _LIVEMEDIA_HH +#include "JPEG2000VideoRTPSource.hh" +#include "JPEG2000VideoRTPSink.hh" +//#include "JPEG2000VideoStreamFramer.hh" +//#include "JPEG2000VideoFileServerMediaSubsession.hh" +#include "MPEG1or2AudioRTPSink.hh" +#include "MP3ADURTPSink.hh" +#include "MPEG1or2VideoRTPSink.hh" +#include "MPEG4ESVideoRTPSink.hh" +#include "AMRAudioFileSink.hh" +#include "H264VideoFileSink.hh" +#include "H265VideoFileSink.hh" +#include "OggFileSink.hh" +#include "BasicUDPSink.hh" +#include "GSMAudioRTPSink.hh" +#include "H263plusVideoRTPSink.hh" +#include "H264VideoRTPSink.hh" +#include "H265VideoRTPSink.hh" +#include "DVVideoRTPSource.hh" +#include "DVVideoRTPSink.hh" +#include "DVVideoStreamFramer.hh" +#include "H264VideoStreamFramer.hh" +#include "H265VideoStreamFramer.hh" +#include "H264VideoStreamDiscreteFramer.hh" +#include "H265VideoStreamDiscreteFramer.hh" +#include "JPEGVideoRTPSink.hh" +#include "SimpleRTPSink.hh" +#include "uLawAudioFilter.hh" +#include "MPEG2IndexFromTransportStream.hh" +#include "MPEG2TransportStreamTrickModeFilter.hh" +#include "ByteStreamMultiFileSource.hh" +#include "ByteStreamMemoryBufferSource.hh" +#include "BasicUDPSource.hh" +#include "SimpleRTPSource.hh" +#include "MPEG1or2AudioRTPSource.hh" +#include "MPEG4LATMAudioRTPSource.hh" +#include "MPEG4LATMAudioRTPSink.hh" +#include "MPEG4ESVideoRTPSource.hh" +#include "MPEG4GenericRTPSource.hh" +#include "MP3ADURTPSource.hh" +#include "QCELPAudioRTPSource.hh" +#include "AMRAudioRTPSource.hh" +#include "JPEGVideoRTPSource.hh" +#include "JPEGVideoSource.hh" +#include "MPEG1or2VideoRTPSource.hh" +#include "VorbisAudioRTPSource.hh" +#include "TheoraVideoRTPSource.hh" +#include "VP8VideoRTPSource.hh" +#include "VP9VideoRTPSource.hh" +#include "RawVideoRTPSource.hh" +#include "MPEG2TransportStreamFromPESSource.hh" +#include "MPEG2TransportStreamFromESSource.hh" +#include "MPEG2TransportStreamFramer.hh" +#include "ADTSAudioFileSource.hh" +#include "ADTSAudioStreamDiscreteFramer.hh" +#include "H261VideoRTPSource.hh" +#include "H263plusVideoRTPSource.hh" +#include "H264VideoRTPSource.hh" +#include "H265VideoRTPSource.hh" +#include "MP3FileSource.hh" +#include "MP3ADU.hh" +#include "MP3ADUinterleaving.hh" +#include "MP3Transcoder.hh" +#include "MPEG1or2DemuxedElementaryStream.hh" +#include "MPEG1or2AudioStreamFramer.hh" +#include "H263plusVideoStreamFramer.hh" +#include "AC3AudioStreamFramer.hh" +#include "AC3AudioRTPSource.hh" +#include "AC3AudioRTPSink.hh" +#include "VorbisAudioRTPSink.hh" +#include "TheoraVideoRTPSink.hh" +#include "VP8VideoRTPSink.hh" +#include "VP9VideoRTPSink.hh" +#include "MPEG4GenericRTPSink.hh" +#include "RawVideoRTPSink.hh" +#include "MPEG1or2VideoStreamDiscreteFramer.hh" +#include "MPEG4VideoStreamDiscreteFramer.hh" +#include "DeviceSource.hh" +#include "AudioInputDevice.hh" +#include "WAVAudioFileSource.hh" +#include "StreamReplicator.hh" +#include "RTSPRegisterSender.hh" +#include "RTSPClient.hh" +#include "SIPClient.hh" +#include "QuickTimeFileSink.hh" +#include "QuickTimeGenericRTPSource.hh" +#include "AVIFileSink.hh" +#include "PassiveServerMediaSubsession.hh" +#include "MPEG4VideoFileServerMediaSubsession.hh" +#include "H264VideoFileServerMediaSubsession.hh" +#include "H265VideoFileServerMediaSubsession.hh" +#include "WAVAudioFileServerMediaSubsession.hh" +#include "AMRAudioFileServerMediaSubsession.hh" +#include "AMRAudioFileSource.hh" +#include "AMRAudioRTPSink.hh" +#include "T140TextRTPSink.hh" +#include "MP3AudioFileServerMediaSubsession.hh" +#include "MPEG1or2VideoFileServerMediaSubsession.hh" +#include "MPEG1or2FileServerDemux.hh" +#include "MPEG2TransportFileServerMediaSubsession.hh" +#include "H263plusVideoFileServerMediaSubsession.hh" +#include "ADTSAudioFileServerMediaSubsession.hh" +#include "DVVideoFileServerMediaSubsession.hh" +#include "AC3AudioFileServerMediaSubsession.hh" +#include "MPEG2TransportUDPServerMediaSubsession.hh" +#include "MatroskaFileServerDemux.hh" +#include "OggFileServerDemux.hh" +#include "MPEG2TransportStreamDemux.hh" +#include "ProxyServerMediaSession.hh" +#include "HLSSegmenter.hh" +#include "MPEG2TransportStreamAccumulator.hh" + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/liveMedia_version.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/liveMedia_version.hh new file mode 100644 index 000000000..064db4ac6 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/liveMedia_version.hh @@ -0,0 +1,25 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// Version information for the "liveMedia" library +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. + +#ifndef _LIVEMEDIA_VERSION_HH +#define _LIVEMEDIA_VERSION_HH + +#define LIVEMEDIA_LIBRARY_VERSION_STRING "2023.01.19" +#define LIVEMEDIA_LIBRARY_VERSION_INT 1674086400 + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/ourMD5.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/ourMD5.hh new file mode 100644 index 000000000..e92d13ce6 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/ourMD5.hh @@ -0,0 +1,38 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Because MD5 may not be implemented (at least, with the same interface) on all systems, +// we have our own implementation. +// C++ header + +#ifndef _OUR_MD5_HH +#define _OUR_MD5_HH + +extern char* our_MD5Data(unsigned char const* data, unsigned dataSize, char* outputDigest); + // "outputDigest" must be either NULL (in which case this function returns a heap-allocated + // buffer, which should be later delete[]d by the caller), or else it must point to + // a (>=)33-byte buffer (which this function will also return). + +extern unsigned char* our_MD5DataRaw(unsigned char const* data, unsigned dataSize, + unsigned char* outputDigest); + // Like "ourMD5Data()", except that it returns the digest in 'raw' binary form, rather than + // as an ASCII hex string. + // "outputDigest" must be either NULL (in which case this function returns a heap-allocated + // buffer, which should be later delete[]d by the caller), or else it must point to + // a (>=)16-byte buffer (which this function will also return). + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/include/uLawAudioFilter.hh b/src/big/mpp/middleware/src/live555/liveMedia/include/uLawAudioFilter.hh new file mode 100644 index 000000000..881bd8a8c --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/include/uLawAudioFilter.hh @@ -0,0 +1,208 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Filters for converting between raw PCM audio and uLaw +// C++ header + +#ifndef _ULAW_AUDIO_FILTER_HH +#define _ULAW_AUDIO_FILTER_HH + +#ifndef _FRAMED_FILTER_HH +#include "FramedFilter.hh" +#endif + +////////// 16-bit PCM (in various byte orderings) -> 8-bit u-Law ////////// + +class uLawFromPCMAudioSource: public FramedFilter { +public: + static uLawFromPCMAudioSource* + createNew(UsageEnvironment& env, FramedSource* inputSource, + int byteOrdering = 0); + // "byteOrdering" == 0 => host order (the default) + // "byteOrdering" == 1 => little-endian order + // "byteOrdering" == 2 => network (i.e., big-endian) order + +protected: + uLawFromPCMAudioSource(UsageEnvironment& env, FramedSource* inputSource, + int byteOrdering); + // called only by createNew() + virtual ~uLawFromPCMAudioSource(); + +private: + // Redefined virtual functions: + virtual void doGetNextFrame(); + +private: + static void afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + void afterGettingFrame1(unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + +private: + int fByteOrdering; + unsigned char* fInputBuffer; + unsigned fInputBufferSize; +}; + + +////////// u-Law -> 16-bit PCM (in host order) ////////// + +class PCMFromuLawAudioSource: public FramedFilter { +public: + static PCMFromuLawAudioSource* + createNew(UsageEnvironment& env, FramedSource* inputSource); + +protected: + PCMFromuLawAudioSource(UsageEnvironment& env, + FramedSource* inputSource); + // called only by createNew() + virtual ~PCMFromuLawAudioSource(); + +private: + // Redefined virtual functions: + virtual void doGetNextFrame(); + +private: + static void afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + void afterGettingFrame1(unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + +private: + unsigned char* fInputBuffer; + unsigned fInputBufferSize; +}; + + +////////// 16-bit values (in host order) -> 16-bit network order ////////// + +class NetworkFromHostOrder16: public FramedFilter { +public: + static NetworkFromHostOrder16* + createNew(UsageEnvironment& env, FramedSource* inputSource); + +protected: + NetworkFromHostOrder16(UsageEnvironment& env, FramedSource* inputSource); + // called only by createNew() + virtual ~NetworkFromHostOrder16(); + +private: + // Redefined virtual functions: + virtual void doGetNextFrame(); + +private: + static void afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + void afterGettingFrame1(unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); +}; + + +////////// 16-bit values (in network order) -> 16-bit host order ////////// + +class HostFromNetworkOrder16: public FramedFilter { +public: + static HostFromNetworkOrder16* + createNew(UsageEnvironment& env, FramedSource* inputSource); + +protected: + HostFromNetworkOrder16(UsageEnvironment& env, FramedSource* inputSource); + // called only by createNew() + virtual ~HostFromNetworkOrder16(); + +private: + // Redefined virtual functions: + virtual void doGetNextFrame(); + +private: + static void afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + void afterGettingFrame1(unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); +}; + + +////////// 16-bit values: little-endian <-> big-endian ////////// + +class EndianSwap16: public FramedFilter { +public: + static EndianSwap16* createNew(UsageEnvironment& env, FramedSource* inputSource); + +protected: + EndianSwap16(UsageEnvironment& env, FramedSource* inputSource); + // called only by createNew() + virtual ~EndianSwap16(); + +private: + // Redefined virtual functions: + virtual void doGetNextFrame(); + +private: + static void afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + void afterGettingFrame1(unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); +}; + + +////////// 24-bit values: little-endian <-> big-endian ////////// + +class EndianSwap24: public FramedFilter { +public: + static EndianSwap24* createNew(UsageEnvironment& env, FramedSource* inputSource); + +protected: + EndianSwap24(UsageEnvironment& env, FramedSource* inputSource); + // called only by createNew() + virtual ~EndianSwap24(); + +private: + // Redefined virtual functions: + virtual void doGetNextFrame(); + +private: + static void afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + void afterGettingFrame1(unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/ourMD5.cpp b/src/big/mpp/middleware/src/live555/liveMedia/ourMD5.cpp new file mode 100644 index 000000000..be5f76942 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/ourMD5.cpp @@ -0,0 +1,325 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Because MD5 may not be implemented (at least, with the same interface) on all systems, +// we have our own implementation. +// Implementation + +#include "ourMD5.hh" +#include // for u_int32_t, u_int64_t +#include + +#define DIGEST_SIZE_IN_BYTES 16 +#define DIGEST_SIZE_IN_HEX_DIGITS (2*DIGEST_SIZE_IN_BYTES) +#define DIGEST_SIZE_AS_STRING (DIGEST_SIZE_IN_HEX_DIGITS+1) + +// The state of a MD5 computation in progress: + +class MD5Context { +public: + MD5Context(); + ~MD5Context(); + + void addData(unsigned char const* inputData, unsigned inputDataSize); + void end(char* outputDigest /*must point to an array of size DIGEST_SIZE_AS_STRING*/); + void finalize(unsigned char* outputDigestInBytes); + // Like "end()", except that the argument is a byte array, of size DIGEST_SIZE_IN_BYTES. + // This function is used to implement "end()". + +private: + void zeroize(); // to remove potentially sensitive information + void transform64Bytes(unsigned char const block[64]); // does the actual MD5 transform + +private: + u_int32_t fState[4]; // ABCD + u_int64_t fBitCount; // number of bits, modulo 2^64 + unsigned char fWorkingBuffer[64]; +}; + +char* our_MD5Data(unsigned char const* data, unsigned dataSize, char* outputDigest) { + MD5Context ctx; + + ctx.addData(data, dataSize); + + if (outputDigest == NULL) outputDigest = new char[DIGEST_SIZE_AS_STRING]; + ctx.end(outputDigest); + + return outputDigest; +} + +unsigned char* our_MD5DataRaw(unsigned char const* data, unsigned dataSize, + unsigned char* outputDigest) { + MD5Context ctx; + + ctx.addData(data, dataSize); + + if (outputDigest == NULL) outputDigest = new unsigned char[DIGEST_SIZE_IN_BYTES]; + ctx.finalize(outputDigest); + + return outputDigest; +} + + +////////// MD5Context implementation ////////// + +MD5Context::MD5Context() + : fBitCount(0) { + // Initialize with magic constants: + fState[0] = 0x67452301; + fState[1] = 0xefcdab89; + fState[2] = 0x98badcfe; + fState[3] = 0x10325476; +} + +MD5Context::~MD5Context() { + zeroize(); +} + +void MD5Context::addData(unsigned char const* inputData, unsigned inputDataSize) { + // Begin by noting how much of our 64-byte working buffer remains unfilled: + u_int64_t const byteCount = fBitCount>>3; + unsigned bufferBytesInUse = (unsigned)(byteCount&0x3F); + unsigned bufferBytesRemaining = 64 - bufferBytesInUse; + + // Then update our bit count: + fBitCount += inputDataSize<<3; + + unsigned i = 0; + if (inputDataSize >= bufferBytesRemaining) { + // We have enough input data to do (64-byte) MD5 transforms. + // Do this now, starting with a transform on our working buffer, then with + // (as many as possible) transforms on rest of the input data. + + memcpy((unsigned char*)&fWorkingBuffer[bufferBytesInUse], (unsigned char*)inputData, bufferBytesRemaining); + transform64Bytes(fWorkingBuffer); + bufferBytesInUse = 0; + + for (i = bufferBytesRemaining; i + 63 < inputDataSize; i += 64) { + transform64Bytes(&inputData[i]); + } + } + + // Copy any remaining (and currently un-transformed) input data into our working buffer: + if (i < inputDataSize) { + memcpy((unsigned char*)&fWorkingBuffer[bufferBytesInUse], (unsigned char*)&inputData[i], inputDataSize - i); + } +} + +void MD5Context::end(char* outputDigest) { + unsigned char digestInBytes[DIGEST_SIZE_IN_BYTES]; + finalize(digestInBytes); + + // Convert the digest from bytes (binary) to hex digits: + static char const hex[]="0123456789abcdef"; + unsigned i; + for (i = 0; i < DIGEST_SIZE_IN_BYTES; ++i) { + outputDigest[2*i] = hex[digestInBytes[i] >> 4]; + outputDigest[2*i+1] = hex[digestInBytes[i] & 0x0F]; + } + outputDigest[2*i] = '\0'; +} + +// Routines that unpack 32 and 64-bit values into arrays of bytes (in little-endian order). +// (These are used to implement "finalize()".) + +static void unpack32(unsigned char out[4], u_int32_t in) { + for (unsigned i = 0; i < 4; ++i) { + out[i] = (unsigned char)((in>>(8*i))&0xFF); + } +} + +static void unpack64(unsigned char out[8], u_int64_t in) { + for (unsigned i = 0; i < 8; ++i) { + out[i] = (unsigned char)((in>>(8*i))&0xFF); + } +} + +static unsigned char const PADDING[64] = { + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +void MD5Context::finalize(unsigned char* outputDigestInBytes) { + // Unpack our bit count: + unsigned char bitCountInBytes[8]; + unpack64(bitCountInBytes, fBitCount); + + // Before 'finalizing', make sure that we transform any remaining bytes in our working buffer: + u_int64_t const byteCount = fBitCount>>3; + unsigned bufferBytesInUse = (unsigned)(byteCount&0x3F); + unsigned numPaddingBytes + = (bufferBytesInUse < 56) ? (56 - bufferBytesInUse) : (64 + 56 - bufferBytesInUse); + addData(PADDING, numPaddingBytes); + + addData(bitCountInBytes, 8); + + // Unpack our 'state' into the output digest: + unpack32(&outputDigestInBytes[0], fState[0]); + unpack32(&outputDigestInBytes[4], fState[1]); + unpack32(&outputDigestInBytes[8], fState[2]); + unpack32(&outputDigestInBytes[12], fState[3]); + + zeroize(); +} + +void MD5Context::zeroize() { + fState[0] = fState[1] = fState[2] = fState[3] = 0; + fBitCount = 0; + for (unsigned i = 0; i < 64; ++i) fWorkingBuffer[i] = 0; +} + + +////////// Implementation of the MD5 transform ("MD5Context::transform64Bytes()") ////////// + +// Constants for the transform: +#define S11 7 +#define S12 12 +#define S13 17 +#define S14 22 +#define S21 5 +#define S22 9 +#define S23 14 +#define S24 20 +#define S31 4 +#define S32 11 +#define S33 16 +#define S34 23 +#define S41 6 +#define S42 10 +#define S43 15 +#define S44 21 + +// Basic MD5 functions: +#define F(x, y, z) (((x) & (y)) | ((~x) & (z))) +#define G(x, y, z) (((x) & (z)) | ((y) & (~z))) +#define H(x, y, z) ((x) ^ (y) ^ (z)) +#define I(x, y, z) ((y) ^ ((x) | (~z))) + +// Rotate "x" left "n" bits: +#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) + +// Other transforms: +#define FF(a, b, c, d, x, s, ac) { \ + (a) += F((b), (c), (d)) + (x) + (u_int32_t)(ac); \ + (a) = ROTATE_LEFT((a), (s)); \ + (a) += (b); \ +} +#define GG(a, b, c, d, x, s, ac) { \ + (a) += G((b), (c), (d)) + (x) + (u_int32_t)(ac); \ + (a) = ROTATE_LEFT((a), (s)); \ + (a) += (b); \ +} +#define HH(a, b, c, d, x, s, ac) { \ + (a) += H((b), (c), (d)) + (x) + (u_int32_t)(ac); \ + (a) = ROTATE_LEFT((a), (s)); \ + (a) += (b); \ +} +#define II(a, b, c, d, x, s, ac) { \ + (a) += I((b), (c), (d)) + (x) + (u_int32_t)(ac); \ + (a) = ROTATE_LEFT((a), (s)); \ + (a) += (b); \ +} + +void MD5Context::transform64Bytes(unsigned char const block[64]) { + u_int32_t a = fState[0], b = fState[1], c = fState[2], d = fState[3]; + + // Begin by packing "block" into an array ("x") of 16 32-bit values (in little-endian order): + u_int32_t x[16]; + for (unsigned i = 0, j = 0; i < 16; ++i, j += 4) { + x[i] = ((u_int32_t)block[j]) | (((u_int32_t)block[j+1]) << 8) | (((u_int32_t)block[j+2]) << 16) | (((u_int32_t)block[j+3]) << 24); + } + + // Now, perform the transform on the array "x": + + // Round 1 + FF(a, b, c, d, x[0], S11, 0xd76aa478); // 1 + FF(d, a, b, c, x[1], S12, 0xe8c7b756); // 2 + FF(c, d, a, b, x[2], S13, 0x242070db); // 3 + FF(b, c, d, a, x[3], S14, 0xc1bdceee); // 4 + FF(a, b, c, d, x[4], S11, 0xf57c0faf); // 5 + FF(d, a, b, c, x[5], S12, 0x4787c62a); // 6 + FF(c, d, a, b, x[6], S13, 0xa8304613); // 7 + FF(b, c, d, a, x[7], S14, 0xfd469501); // 8 + FF(a, b, c, d, x[8], S11, 0x698098d8); // 9 + FF(d, a, b, c, x[9], S12, 0x8b44f7af); // 10 + FF(c, d, a, b, x[10], S13, 0xffff5bb1); // 11 + FF(b, c, d, a, x[11], S14, 0x895cd7be); // 12 + FF(a, b, c, d, x[12], S11, 0x6b901122); // 13 + FF(d, a, b, c, x[13], S12, 0xfd987193); // 14 + FF(c, d, a, b, x[14], S13, 0xa679438e); // 15 + FF(b, c, d, a, x[15], S14, 0x49b40821); // 16 + + // Round 2 + GG(a, b, c, d, x[1], S21, 0xf61e2562); // 17 + GG(d, a, b, c, x[6], S22, 0xc040b340); // 18 + GG(c, d, a, b, x[11], S23, 0x265e5a51); // 19 + GG(b, c, d, a, x[0], S24, 0xe9b6c7aa); // 20 + GG(a, b, c, d, x[5], S21, 0xd62f105d); // 21 + GG(d, a, b, c, x[10], S22, 0x2441453); // 22 + GG(c, d, a, b, x[15], S23, 0xd8a1e681); // 23 + GG(b, c, d, a, x[4], S24, 0xe7d3fbc8); // 24 + GG(a, b, c, d, x[9], S21, 0x21e1cde6); // 25 + GG(d, a, b, c, x[14], S22, 0xc33707d6); // 26 + GG(c, d, a, b, x[3], S23, 0xf4d50d87); // 27 + GG(b, c, d, a, x[8], S24, 0x455a14ed); // 28 + GG(a, b, c, d, x[13], S21, 0xa9e3e905); // 29 + GG(d, a, b, c, x[2], S22, 0xfcefa3f8); // 30 + GG(c, d, a, b, x[7], S23, 0x676f02d9); // 31 + GG(b, c, d, a, x[12], S24, 0x8d2a4c8a); // 32 + + // Round 3 + HH(a, b, c, d, x[5], S31, 0xfffa3942); // 33 + HH(d, a, b, c, x[8], S32, 0x8771f681); // 34 + HH(c, d, a, b, x[11], S33, 0x6d9d6122); // 35 + HH(b, c, d, a, x[14], S34, 0xfde5380c); // 36 + HH(a, b, c, d, x[1], S31, 0xa4beea44); // 37 + HH(d, a, b, c, x[4], S32, 0x4bdecfa9); // 38 + HH(c, d, a, b, x[7], S33, 0xf6bb4b60); // 39 + HH(b, c, d, a, x[10], S34, 0xbebfbc70); // 40 + HH(a, b, c, d, x[13], S31, 0x289b7ec6); // 41 + HH(d, a, b, c, x[0], S32, 0xeaa127fa); // 42 + HH(c, d, a, b, x[3], S33, 0xd4ef3085); // 43 + HH(b, c, d, a, x[6], S34, 0x4881d05); // 44 + HH(a, b, c, d, x[9], S31, 0xd9d4d039); // 45 + HH(d, a, b, c, x[12], S32, 0xe6db99e5); // 46 + HH(c, d, a, b, x[15], S33, 0x1fa27cf8); // 47 + HH(b, c, d, a, x[2], S34, 0xc4ac5665); // 48 + + // Round 4 + II(a, b, c, d, x[0], S41, 0xf4292244); // 49 + II(d, a, b, c, x[7], S42, 0x432aff97); // 50 + II(c, d, a, b, x[14], S43, 0xab9423a7); // 51 + II(b, c, d, a, x[5], S44, 0xfc93a039); // 52 + II(a, b, c, d, x[12], S41, 0x655b59c3); // 53 + II(d, a, b, c, x[3], S42, 0x8f0ccc92); // 54 + II(c, d, a, b, x[10], S43, 0xffeff47d); // 55 + II(b, c, d, a, x[1], S44, 0x85845dd1); // 56 + II(a, b, c, d, x[8], S41, 0x6fa87e4f); // 57 + II(d, a, b, c, x[15], S42, 0xfe2ce6e0); // 58 + II(c, d, a, b, x[6], S43, 0xa3014314); // 59 + II(b, c, d, a, x[13], S44, 0x4e0811a1); // 60 + II(a, b, c, d, x[4], S41, 0xf7537e82); // 61 + II(d, a, b, c, x[11], S42, 0xbd3af235); // 62 + II(c, d, a, b, x[2], S43, 0x2ad7d2bb); // 63 + II(b, c, d, a, x[9], S44, 0xeb86d391); // 64 + + fState[0] += a; fState[1] += b; fState[2] += c; fState[3] += d; + + // Zeroize sensitive information. + for (unsigned k = 0; k < 16; ++k) x[k] = 0; +} diff --git a/src/big/mpp/middleware/src/live555/liveMedia/rtcp_from_spec.c b/src/big/mpp/middleware/src/live555/liveMedia/rtcp_from_spec.c new file mode 100644 index 000000000..c59be11c2 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/rtcp_from_spec.c @@ -0,0 +1,289 @@ +/* RTCP code taken directly from the most recent RTP specification: RFC 3550 + * Copyright (C) The Internet Society (2003). All Rights Reserved. + * Implementation + */ + +#include "rtcp_from_spec.h" + +/***** + +A.7 Computing the RTCP Transmission Interval + + The following functions implement the RTCP transmission and reception + rules described in Section 6.2. These rules are coded in several + functions: + + o rtcp_interval() computes the deterministic calculated + interval, measured in seconds. The parameters are defined in + Section 6.3. + + o OnExpire() is called when the RTCP transmission timer expires. + + o OnReceive() is called whenever an RTCP packet is received. + + Both OnExpire() and OnReceive() have event e as an argument. This is + the next scheduled event for that participant, either an RTCP report + or a BYE packet. It is assumed that the following functions are + available: + + o Schedule(time t, event e) schedules an event e to occur at + time t. When time t arrives, the function OnExpire is called + with e as an argument. + + o Reschedule(time t, event e) reschedules a previously scheduled + event e for time t. + + o SendRTCPReport(event e) sends an RTCP report. + + o SendBYEPacket(event e) sends a BYE packet. + + o TypeOfEvent(event e) returns EVENT_BYE if the event being + processed is for a BYE packet to be sent, else it returns + EVENT_REPORT. + + o PacketType(p) returns PACKET_RTCP_REPORT if packet p is an + RTCP report (not BYE), PACKET_BYE if its a BYE RTCP packet, + and PACKET_RTP if its a regular RTP data packet. + + o ReceivedPacketSize() and SentPacketSize() return the size of + the referenced packet in octets. + + o NewMember(p) returns a 1 if the participant who sent packet p + is not currently in the member list, 0 otherwise. Note this + function is not sufficient for a complete implementation + because each CSRC identifier in an RTP packet and each SSRC in + a BYE packet should be processed. + + o NewSender(p) returns a 1 if the participant who sent packet p + is not currently in the sender sublist of the member list, 0 + otherwise. + + o AddMember() and RemoveMember() to add and remove participants + from the member list. + + o AddSender() and RemoveSender() to add and remove participants + from the sender sublist of the member list. +*****/ + + + double rtcp_interval(int members, + int senders, + double rtcp_bw, + int we_sent, + double avg_rtcp_size, + int initial) + { + /* + * Minimum average time between RTCP packets from this site (in + * seconds). This time prevents the reports from `clumping' when + * sessions are small and the law of large numbers isn't helping + * to smooth out the traffic. It also keeps the report interval + * from becoming ridiculously small during transient outages like + * a network partition. + */ + double const RTCP_MIN_TIME = 5.; + /* + * Fraction of the RTCP bandwidth to be shared among active + * senders. (This fraction was chosen so that in a typical + * session with one or two active senders, the computed report + * time would be roughly equal to the minimum report time so that + * we don't unnecessarily slow down receiver reports.) The + * receiver fraction must be 1 - the sender fraction. + */ + double const RTCP_SENDER_BW_FRACTION = 0.25; + double const RTCP_RCVR_BW_FRACTION = (1-RTCP_SENDER_BW_FRACTION); + /* + * To compensate for "unconditional reconsideration" converging to a + * value below the intended average. + */ + double const COMPENSATION = 2.71828 - 1.5; + + double t; /* interval */ + double rtcp_min_time = RTCP_MIN_TIME; + int n; /* no. of members for computation */ + + /* + * Very first call at application start-up uses half the min + * delay for quicker notification while still allowing some time + * before reporting for randomization and to learn about other + * sources so the report interval will converge to the correct + * interval more quickly. + */ + if (initial) { + rtcp_min_time /= 2; + } + + /* + * If there were active senders, give them at least a minimum + * share of the RTCP bandwidth. Otherwise all participants share + * the RTCP bandwidth equally. + */ + n = members; + if (senders > 0 && senders < members * RTCP_SENDER_BW_FRACTION) { + if (we_sent) { + rtcp_bw *= RTCP_SENDER_BW_FRACTION; + n = senders; + } else { + rtcp_bw *= RTCP_RCVR_BW_FRACTION; + n -= senders; + } + } + + /* + * The effective number of sites times the average packet size is + * the total number of octets sent when each site sends a report. + * Dividing this by the effective bandwidth gives the time + * interval over which those packets must be sent in order to + * meet the bandwidth target, with a minimum enforced. In that + * time interval we send one report so this time is also our + * average time between reports. + */ + t = avg_rtcp_size * n / rtcp_bw; + if (t < rtcp_min_time) t = rtcp_min_time; + + /* + * To avoid traffic bursts from unintended synchronization with + * other sites, we then pick our actual next report interval as a + * random number uniformly distributed between 0.5*t and 1.5*t. + */ + t = t * (drand48() + 0.5); + t = t / COMPENSATION; + return t; + } + + void OnExpire(event e, + int members, + int senders, + double rtcp_bw, + int we_sent, + double *avg_rtcp_size, + int *initial, + time_tp tc, + time_tp *tp, + int *pmembers) + { + /* This function is responsible for deciding whether to send + * an RTCP report or BYE packet now, or to reschedule transmission. + * It is also responsible for updating the pmembers, initial, tp, + * and avg_rtcp_size state variables. This function should be called + * upon expiration of the event timer used by Schedule(). */ + + double t; /* Interval */ + double tn; /* Next transmit time */ + + /* In the case of a BYE, we use "unconditional reconsideration" to + * reschedule the transmission of the BYE if necessary */ + + if (TypeOfEvent(e) == EVENT_BYE) { + t = rtcp_interval(members, + senders, + rtcp_bw, + we_sent, + *avg_rtcp_size, + *initial); + tn = *tp + t; + if (tn <= tc) { + SendBYEPacket(e); + exit(1); + } else { + Schedule(tn, e); + } + + } else if (TypeOfEvent(e) == EVENT_REPORT) { + t = rtcp_interval(members, + senders, + rtcp_bw, + we_sent, + *avg_rtcp_size, + *initial); + tn = *tp + t; + + if (tn <= tc) { + SendRTCPReport(e); + *avg_rtcp_size = (1./16.)*SentPacketSize(e) + + (15./16.)*(*avg_rtcp_size); + *tp = tc; + + /* We must redraw the interval. Don't reuse the + one computed above, since its not actually + distributed the same, as we are conditioned + on it being small enough to cause a packet to + be sent */ + + t = rtcp_interval(members, + senders, + rtcp_bw, + we_sent, + *avg_rtcp_size, + *initial); + + Schedule(t+tc,e); + *initial = 0; + } else { + Schedule(tn, e); + } + *pmembers = members; + } + } + + + void OnReceive(packet p, + event e, + int *members, + int *pmembers, + int *senders, + double *avg_rtcp_size, + double *tp, + double tc, + double tn) + { + /* What we do depends on whether we have left the group, and + * are waiting to send a BYE (TypeOfEvent(e) == EVENT_BYE) or + * an RTCP report. p represents the packet that was just received. */ + + if (PacketType(p) == PACKET_RTCP_REPORT) { + if (NewMember(p) && (TypeOfEvent(e) == EVENT_REPORT)) { + AddMember(p); + *members += 1; + } + *avg_rtcp_size = (1./16.)*ReceivedPacketSize(p) + + (15./16.)*(*avg_rtcp_size); + } else if (PacketType(p) == PACKET_RTP) { + if (NewMember(p) && (TypeOfEvent(e) == EVENT_REPORT)) { + AddMember(p); + *members += 1; + } + if (NewSender(p) && (TypeOfEvent(e) == EVENT_REPORT)) { + AddSender(p); + *senders += 1; + } + } else if (PacketType(p) == PACKET_BYE) { + *avg_rtcp_size = (1./16.)*ReceivedPacketSize(p) + + (15./16.)*(*avg_rtcp_size); + + if (TypeOfEvent(e) == EVENT_REPORT) { + if (NewSender(p) == FALSE) { + RemoveSender(p); + *senders -= 1; + } + + if (NewMember(p) == FALSE) { + RemoveMember(p); + *members -= 1; + } + + if(*members < *pmembers) { + tn = tc + (((double) *members)/(*pmembers))*(tn - tc); + *tp = tc - (((double) *members)/(*pmembers))*(tc - *tp); + + /* Reschedule the next report for time tn */ + + Reschedule(tn, e); + *pmembers = *members; + } + + } else if (TypeOfEvent(e) == EVENT_BYE) { + *members += 1; + } + } + } diff --git a/src/big/mpp/middleware/src/live555/liveMedia/rtcp_from_spec.h b/src/big/mpp/middleware/src/live555/liveMedia/rtcp_from_spec.h new file mode 100644 index 000000000..7173460e9 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/rtcp_from_spec.h @@ -0,0 +1,100 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +/* + * "liveMedia" + * Copyright (c) 1996-2023, Live Networks, Inc. All rights reserved + * + * RTCP code taken directly from the most recent RTP specification: RFC 3550 + * C header + */ + +#ifndef _RTCP_FROM_SPEC_H +#define _RTCP_FROM_SPEC_H + +#include + +/* Definitions of _ANSI_ARGS and EXTERN that will work in either + C or C++ code: + */ +#undef _ANSI_ARGS_ +#if ((defined(__STDC__) || defined(SABER)) && !defined(NO_PROTOTYPE)) || defined(__cplusplus) || defined(USE_PROTOTYPE) +# define _ANSI_ARGS_(x) x +#else +# define _ANSI_ARGS_(x) () +#endif +#ifdef __cplusplus +# define EXTERN extern "C" +#else +# define EXTERN extern +#endif + +/* The code from the spec assumes a type "event"; make this a void*: */ +typedef void* event; + +#define EVENT_UNKNOWN 0 +#define EVENT_REPORT 1 +#define EVENT_BYE 2 + +/* The code from the spec assumes a type "time_tp"; make this a double: */ +typedef double time_tp; + +/* The code from the spec assumes a type "packet"; make this a void*: */ +typedef void* packet; + +#define PACKET_UNKNOWN_TYPE 0 +#define PACKET_RTP 1 +#define PACKET_RTCP_REPORT 2 +#define PACKET_BYE 3 +#define PACKET_RTCP_APP 4 + +/* The code from the spec calls drand48(), but we have drand30() instead */ +#define drand48 drand30 + +/* The code calls "exit()", but we don't want to exit, so make it a noop: */ +#define exit(n) do {} while (0) + +#ifndef FALSE +#define FALSE 0 +#endif +#ifndef TRUE +#define TRUE 1 +#endif + +/* EXPORTS: */ + +EXTERN void OnExpire _ANSI_ARGS_((event, int, int, double, int, double*, int*, time_tp, time_tp*, int*)); + +EXTERN void OnReceive _ANSI_ARGS_((packet, event, int*, int*, int*, double*, double*, double, double)); + +/* IMPORTS: */ + +EXTERN void Schedule _ANSI_ARGS_((double,event)); +EXTERN void Reschedule _ANSI_ARGS_((double,event)); +EXTERN void SendRTCPReport _ANSI_ARGS_((event)); +EXTERN void SendBYEPacket _ANSI_ARGS_((event)); +EXTERN int TypeOfEvent _ANSI_ARGS_((event)); +EXTERN int SentPacketSize _ANSI_ARGS_((event)); +EXTERN int PacketType _ANSI_ARGS_((packet)); +EXTERN int ReceivedPacketSize _ANSI_ARGS_((packet)); +EXTERN int NewMember _ANSI_ARGS_((packet)); +EXTERN int NewSender _ANSI_ARGS_((packet)); +EXTERN void AddMember _ANSI_ARGS_((packet)); +EXTERN void AddSender _ANSI_ARGS_((packet)); +EXTERN void RemoveMember _ANSI_ARGS_((packet)); +EXTERN void RemoveSender _ANSI_ARGS_((packet)); +EXTERN double drand30 _ANSI_ARGS_((void)); + +#endif diff --git a/src/big/mpp/middleware/src/live555/liveMedia/uLawAudioFilter.cpp b/src/big/mpp/middleware/src/live555/liveMedia/uLawAudioFilter.cpp new file mode 100644 index 000000000..4931ee3fb --- /dev/null +++ b/src/big/mpp/middleware/src/live555/liveMedia/uLawAudioFilter.cpp @@ -0,0 +1,431 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// Filters for converting between raw PCM audio and uLaw +// Implementation + +#include "uLawAudioFilter.hh" + +////////// 16-bit PCM (in various byte orders) -> 8-bit u-Law ////////// + +uLawFromPCMAudioSource* uLawFromPCMAudioSource +::createNew(UsageEnvironment& env, FramedSource* inputSource, int byteOrdering) { + // "byteOrdering" must be 0, 1, or 2: + if (byteOrdering < 0 || byteOrdering > 2) { + env.setResultMsg("uLawFromPCMAudioSource::createNew(): bad \"byteOrdering\" parameter"); + return NULL; + } + return new uLawFromPCMAudioSource(env, inputSource, byteOrdering); +} + +uLawFromPCMAudioSource +::uLawFromPCMAudioSource(UsageEnvironment& env, FramedSource* inputSource, + int byteOrdering) + : FramedFilter(env, inputSource), + fByteOrdering(byteOrdering), fInputBuffer(NULL), fInputBufferSize(0) { +} + +uLawFromPCMAudioSource::~uLawFromPCMAudioSource() { + delete[] fInputBuffer; +} + +void uLawFromPCMAudioSource::doGetNextFrame() { + // Figure out how many bytes of input data to ask for, and increase + // our input buffer if necessary: + unsigned bytesToRead = fMaxSize*2; // because we're converting 16 bits->8 + if (bytesToRead > fInputBufferSize) { + delete[] fInputBuffer; fInputBuffer = new unsigned char[bytesToRead]; + fInputBufferSize = bytesToRead; + } + + // Arrange to read samples into the input buffer: + fInputSource->getNextFrame(fInputBuffer, bytesToRead, + afterGettingFrame, this, + FramedSource::handleClosure, this); +} + +void uLawFromPCMAudioSource +::afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds) { + uLawFromPCMAudioSource* source = (uLawFromPCMAudioSource*)clientData; + source->afterGettingFrame1(frameSize, numTruncatedBytes, + presentationTime, durationInMicroseconds); +} + +#define BIAS 0x84 // the add-in bias for 16 bit samples +#define CLIP 32635 + +static unsigned char uLawFrom16BitLinear(u_int16_t sample) { + static int const exp_lut[256] = {0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, + 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, + 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, + 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7}; + unsigned char sign = (sample >> 8) & 0x80; + if (sign != 0) sample = -sample; // get the magnitude + + if (sample > CLIP) sample = CLIP; // clip the magnitude + sample += BIAS; + + unsigned char exponent = exp_lut[(sample>>7) & 0xFF]; + unsigned char mantissa = (sample >> (exponent+3)) & 0x0F; + unsigned char result = ~(sign | (exponent << 4) | mantissa); + if (result == 0 ) result = 0x02; // CCITT trap + + return result; +} + +void uLawFromPCMAudioSource +::afterGettingFrame1(unsigned frameSize, unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds) { + // Translate raw 16-bit PCM samples (in the input buffer) + // into uLaw samples (in the output buffer). + unsigned numSamples = frameSize/2; + switch (fByteOrdering) { + case 0: { // host order + u_int16_t* inputSample = (u_int16_t*)fInputBuffer; + for (unsigned i = 0; i < numSamples; ++i) { + fTo[i] = uLawFrom16BitLinear(inputSample[i]); + } + break; + } + case 1: { // little-endian order + for (unsigned i = 0; i < numSamples; ++i) { + u_int16_t const newValue = (fInputBuffer[2*i+1]<<8)|fInputBuffer[2*i]; + fTo[i] = uLawFrom16BitLinear(newValue); + } + break; + } + case 2: { // network (i.e., big-endian) order + for (unsigned i = 0; i < numSamples; ++i) { + u_int16_t const newValue = (fInputBuffer[2*i]<<8)|fInputBuffer[2*i+i]; + fTo[i] = uLawFrom16BitLinear(newValue); + } + break; + } + } + + // Complete delivery to the client: + fFrameSize = numSamples; + fNumTruncatedBytes = numTruncatedBytes; + fPresentationTime = presentationTime; + fDurationInMicroseconds = durationInMicroseconds; + afterGetting(this); +} + + +////////// u-Law -> 16-bit PCM (in host order) ////////// + +PCMFromuLawAudioSource* PCMFromuLawAudioSource +::createNew(UsageEnvironment& env, FramedSource* inputSource) { + return new PCMFromuLawAudioSource(env, inputSource); +} + +PCMFromuLawAudioSource +::PCMFromuLawAudioSource(UsageEnvironment& env, + FramedSource* inputSource) + : FramedFilter(env, inputSource), + fInputBuffer(NULL), fInputBufferSize(0) { +} + +PCMFromuLawAudioSource::~PCMFromuLawAudioSource() { + delete[] fInputBuffer; +} + +void PCMFromuLawAudioSource::doGetNextFrame() { + // Figure out how many bytes of input data to ask for, and increase + // our input buffer if necessary: + unsigned bytesToRead = fMaxSize/2; // because we're converting 8 bits->16 + if (bytesToRead > fInputBufferSize) { + delete[] fInputBuffer; fInputBuffer = new unsigned char[bytesToRead]; + fInputBufferSize = bytesToRead; + } + + // Arrange to read samples into the input buffer: + fInputSource->getNextFrame(fInputBuffer, bytesToRead, + afterGettingFrame, this, + FramedSource::handleClosure, this); +} + +void PCMFromuLawAudioSource +::afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds) { + PCMFromuLawAudioSource* source = (PCMFromuLawAudioSource*)clientData; + source->afterGettingFrame1(frameSize, numTruncatedBytes, + presentationTime, durationInMicroseconds); +} + +static u_int16_t linear16FromuLaw(unsigned char uLawByte) { + static int const exp_lut[8] = {0,132,396,924,1980,4092,8316,16764}; + uLawByte = ~uLawByte; + + Boolean sign = (uLawByte & 0x80) != 0; + unsigned char exponent = (uLawByte>>4) & 0x07; + unsigned char mantissa = uLawByte & 0x0F; + + u_int16_t result = exp_lut[exponent] + (mantissa << (exponent+3)); + if (sign) result = -result; + return result; +} + +void PCMFromuLawAudioSource +::afterGettingFrame1(unsigned frameSize, unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds) { + // Translate uLaw samples (in the input buffer) + // into 16-bit PCM samples (in the output buffer), in host order. + unsigned numSamples = frameSize; + u_int16_t* outputSample = (u_int16_t*)fTo; + for (unsigned i = 0; i < numSamples; ++i) { + outputSample[i] = linear16FromuLaw(fInputBuffer[i]); + } + + // Complete delivery to the client: + fFrameSize = numSamples*2; + fNumTruncatedBytes = numTruncatedBytes; + fPresentationTime = presentationTime; + fDurationInMicroseconds = durationInMicroseconds; + afterGetting(this); +} + + +////////// 16-bit values (in host order) -> 16-bit network order ////////// + +NetworkFromHostOrder16* NetworkFromHostOrder16 +::createNew(UsageEnvironment& env, FramedSource* inputSource) { + return new NetworkFromHostOrder16(env, inputSource); +} + +NetworkFromHostOrder16 +::NetworkFromHostOrder16(UsageEnvironment& env, + FramedSource* inputSource) + : FramedFilter(env, inputSource) { +} + +NetworkFromHostOrder16::~NetworkFromHostOrder16() { +} + +void NetworkFromHostOrder16::doGetNextFrame() { + // Arrange to read data directly into the client's buffer: + fInputSource->getNextFrame(fTo, fMaxSize, + afterGettingFrame, this, + FramedSource::handleClosure, this); +} + +void NetworkFromHostOrder16 +::afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds) { + NetworkFromHostOrder16* source = (NetworkFromHostOrder16*)clientData; + source->afterGettingFrame1(frameSize, numTruncatedBytes, + presentationTime, durationInMicroseconds); +} + +void NetworkFromHostOrder16 +::afterGettingFrame1(unsigned frameSize, unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds) { + // Translate the 16-bit values that we have just read from host + // to network order (in-place) + unsigned numValues = frameSize/2; + u_int16_t* value = (u_int16_t*)fTo; + for (unsigned i = 0; i < numValues; ++i) { + value[i] = htons(value[i]); + } + + // Complete delivery to the client: + fFrameSize = numValues*2; + fNumTruncatedBytes = numTruncatedBytes; + fPresentationTime = presentationTime; + fDurationInMicroseconds = durationInMicroseconds; + afterGetting(this); +} + + +////////// 16-bit values (in network order) -> 16-bit host order ////////// + +HostFromNetworkOrder16* HostFromNetworkOrder16 +::createNew(UsageEnvironment& env, FramedSource* inputSource) { + return new HostFromNetworkOrder16(env, inputSource); +} + +HostFromNetworkOrder16 +::HostFromNetworkOrder16(UsageEnvironment& env, + FramedSource* inputSource) + : FramedFilter(env, inputSource) { +} + +HostFromNetworkOrder16::~HostFromNetworkOrder16() { +} + +void HostFromNetworkOrder16::doGetNextFrame() { + // Arrange to read data directly into the client's buffer: + fInputSource->getNextFrame(fTo, fMaxSize, + afterGettingFrame, this, + FramedSource::handleClosure, this); +} + +void HostFromNetworkOrder16 +::afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds) { + HostFromNetworkOrder16* source = (HostFromNetworkOrder16*)clientData; + source->afterGettingFrame1(frameSize, numTruncatedBytes, + presentationTime, durationInMicroseconds); +} + +void HostFromNetworkOrder16 +::afterGettingFrame1(unsigned frameSize, unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds) { + // Translate the 16-bit values that we have just read from network + // to host order (in-place): + unsigned numValues = frameSize/2; + u_int16_t* value = (u_int16_t*)fTo; + for (unsigned i = 0; i < numValues; ++i) { + value[i] = ntohs(value[i]); + } + + // Complete delivery to the client: + fFrameSize = numValues*2; + fNumTruncatedBytes = numTruncatedBytes; + fPresentationTime = presentationTime; + fDurationInMicroseconds = durationInMicroseconds; + afterGetting(this); +} + + +////////// 16-bit values: little-endian <-> big-endian ////////// + +EndianSwap16* +EndianSwap16::createNew(UsageEnvironment& env, FramedSource* inputSource) { + return new EndianSwap16(env, inputSource); +} + +EndianSwap16::EndianSwap16(UsageEnvironment& env, + FramedSource* inputSource) + : FramedFilter(env, inputSource) { +} + +EndianSwap16::~EndianSwap16() { +} + +void EndianSwap16::doGetNextFrame() { + // Arrange to read data directly into the client's buffer: + fInputSource->getNextFrame(fTo, fMaxSize, + afterGettingFrame, this, + FramedSource::handleClosure, this); +} + +void EndianSwap16::afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds) { + EndianSwap16* source = (EndianSwap16*)clientData; + source->afterGettingFrame1(frameSize, numTruncatedBytes, + presentationTime, durationInMicroseconds); +} + +void EndianSwap16::afterGettingFrame1(unsigned frameSize, unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds) { + // Swap the byte order of the 16-bit values that we have just read (in place): + unsigned numValues = frameSize/2; + u_int16_t* value = (u_int16_t*)fTo; + for (unsigned i = 0; i < numValues; ++i) { + u_int16_t const orig = value[i]; + value[i] = ((orig&0xFF)<<8) | ((orig&0xFF00)>>8); + } + + // Complete delivery to the client: + fFrameSize = numValues*2; + fNumTruncatedBytes = numTruncatedBytes + (frameSize - fFrameSize); + fPresentationTime = presentationTime; + fDurationInMicroseconds = durationInMicroseconds; + afterGetting(this); +} + + +////////// 24-bit values: little-endian <-> big-endian ////////// + +EndianSwap24* +EndianSwap24::createNew(UsageEnvironment& env, FramedSource* inputSource) { + return new EndianSwap24(env, inputSource); +} + +EndianSwap24::EndianSwap24(UsageEnvironment& env, + FramedSource* inputSource) + : FramedFilter(env, inputSource) { +} + +EndianSwap24::~EndianSwap24() { +} + +void EndianSwap24::doGetNextFrame() { + // Arrange to read data directly into the client's buffer: + fInputSource->getNextFrame(fTo, fMaxSize, + afterGettingFrame, this, + FramedSource::handleClosure, this); +} + +void EndianSwap24::afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds) { + EndianSwap24* source = (EndianSwap24*)clientData; + source->afterGettingFrame1(frameSize, numTruncatedBytes, + presentationTime, durationInMicroseconds); +} + +void EndianSwap24::afterGettingFrame1(unsigned frameSize, unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds) { + // Swap the byte order of the 24-bit values that we have just read (in place): + unsigned const numValues = frameSize/3; + u_int8_t* p = fTo; + for (unsigned i = 0; i < numValues; ++i) { + u_int8_t tmp = p[0]; + p[0] = p[2]; + p[2] = tmp; + p += 3; + } + + // Complete delivery to the client: + fFrameSize = numValues*3; + fNumTruncatedBytes = numTruncatedBytes + (frameSize - fFrameSize); + fPresentationTime = presentationTime; + fDurationInMicroseconds = durationInMicroseconds; + afterGetting(this); +} diff --git a/src/big/mpp/middleware/src/live555/mediaServer/DynamicRTSPServer.cpp b/src/big/mpp/middleware/src/live555/mediaServer/DynamicRTSPServer.cpp new file mode 100644 index 000000000..e289566df --- /dev/null +++ b/src/big/mpp/middleware/src/live555/mediaServer/DynamicRTSPServer.cpp @@ -0,0 +1,247 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// Copyright (c) 1996-2023, Live Networks, Inc. All rights reserved +// A subclass of "RTSPServer" that creates "ServerMediaSession"s on demand, +// based on whether or not the specified stream name exists as a file +// Implementation + +#include "DynamicRTSPServer.hh" +#include +#include + +DynamicRTSPServer* +DynamicRTSPServer::createNew(UsageEnvironment& env, Port ourPort, + UserAuthenticationDatabase* authDatabase, + unsigned reclamationTestSeconds) { + int ourSocketIPv4 = setUpOurSocket(env, ourPort, AF_INET); + int ourSocketIPv6 = setUpOurSocket(env, ourPort, AF_INET6); + if (ourSocketIPv4 < 0 && ourSocketIPv6 < 0) return NULL; + + return new DynamicRTSPServer(env, ourSocketIPv4, ourSocketIPv6, ourPort, + authDatabase, reclamationTestSeconds); +} + +DynamicRTSPServer::DynamicRTSPServer(UsageEnvironment& env, int ourSocketIPv4, int ourSocketIPv6, + Port ourPort, + UserAuthenticationDatabase* authDatabase, unsigned reclamationTestSeconds) + : RTSPServer(env, ourSocketIPv4, ourSocketIPv6, ourPort, authDatabase, reclamationTestSeconds) { +} + +DynamicRTSPServer::~DynamicRTSPServer() { +} + +static ServerMediaSession* createNewSMS(UsageEnvironment& env, + char const* fileName, FILE* fid); // forward + +void DynamicRTSPServer +::lookupServerMediaSession(char const* streamName, + lookupServerMediaSessionCompletionFunc* completionFunc, + void* completionClientData, + Boolean isFirstLookupInSession) { + // First, check whether the specified "streamName" exists as a local file: + FILE* fid = fopen(streamName, "rb"); + Boolean const fileExists = fid != NULL; + + // Next, check whether we already have a "ServerMediaSession" for this file: + ServerMediaSession* sms = getServerMediaSession(streamName); + Boolean const smsExists = sms != NULL; + + // Handle the four possibilities for "fileExists" and "smsExists": + if (!fileExists) { + if (smsExists) { + // "sms" was created for a file that no longer exists. Remove it: + removeServerMediaSession(sms); + } + + sms = NULL; + } else { + if (smsExists && isFirstLookupInSession) { + // Remove the existing "ServerMediaSession" and create a new one, in case the underlying + // file has changed in some way: + removeServerMediaSession(sms); + sms = NULL; + } + + if (sms == NULL) { + sms = createNewSMS(envir(), streamName, fid); + addServerMediaSession(sms); + } + + fclose(fid); + } + + if (completionFunc != NULL) { + (*completionFunc)(completionClientData, sms); + } +} + +// Special code for handling Matroska files: +struct MatroskaDemuxCreationState { + MatroskaFileServerDemux* demux; + char watchVariable; +}; +static void onMatroskaDemuxCreation(MatroskaFileServerDemux* newDemux, void* clientData) { + MatroskaDemuxCreationState* creationState = (MatroskaDemuxCreationState*)clientData; + creationState->demux = newDemux; + creationState->watchVariable = 1; +} +// END Special code for handling Matroska files: + +// Special code for handling Ogg files: +struct OggDemuxCreationState { + OggFileServerDemux* demux; + char watchVariable; +}; +static void onOggDemuxCreation(OggFileServerDemux* newDemux, void* clientData) { + OggDemuxCreationState* creationState = (OggDemuxCreationState*)clientData; + creationState->demux = newDemux; + creationState->watchVariable = 1; +} +// END Special code for handling Ogg files: + +#define NEW_SMS(description) do {\ +char const* descStr = description\ + ", streamed by the LIVE555 Media Server";\ +sms = ServerMediaSession::createNew(env, fileName, fileName, descStr);\ +} while(0) + +static ServerMediaSession* createNewSMS(UsageEnvironment& env, + char const* fileName, FILE* /*fid*/) { + // Use the file name extension to determine the type of "ServerMediaSession": + char const* extension = strrchr(fileName, '.'); + if (extension == NULL) return NULL; + + ServerMediaSession* sms = NULL; + Boolean const reuseSource = False; + if (strcmp(extension, ".aac") == 0) { + // Assumed to be an AAC Audio (ADTS format) file: + NEW_SMS("AAC Audio"); + sms->addSubsession(ADTSAudioFileServerMediaSubsession::createNew(env, fileName, reuseSource)); + } else if (strcmp(extension, ".amr") == 0) { + // Assumed to be an AMR Audio file: + NEW_SMS("AMR Audio"); + sms->addSubsession(AMRAudioFileServerMediaSubsession::createNew(env, fileName, reuseSource)); + } else if (strcmp(extension, ".ac3") == 0) { + // Assumed to be an AC-3 Audio file: + NEW_SMS("AC-3 Audio"); + sms->addSubsession(AC3AudioFileServerMediaSubsession::createNew(env, fileName, reuseSource)); + } else if (strcmp(extension, ".m4e") == 0) { + // Assumed to be a MPEG-4 Video Elementary Stream file: + NEW_SMS("MPEG-4 Video"); + sms->addSubsession(MPEG4VideoFileServerMediaSubsession::createNew(env, fileName, reuseSource)); + } else if (strcmp(extension, ".264") == 0) { + // Assumed to be a H.264 Video Elementary Stream file: + NEW_SMS("H.264 Video"); + OutPacketBuffer::maxSize = 100000; // allow for some possibly large H.264 frames + sms->addSubsession(H264VideoFileServerMediaSubsession::createNew(env, fileName, reuseSource)); + } else if (strcmp(extension, ".265") == 0) { + // Assumed to be a H.265 Video Elementary Stream file: + NEW_SMS("H.265 Video"); + OutPacketBuffer::maxSize = 100000; // allow for some possibly large H.265 frames + sms->addSubsession(H265VideoFileServerMediaSubsession::createNew(env, fileName, reuseSource)); + } else if (strcmp(extension, ".mp3") == 0) { + // Assumed to be a MPEG-1 or 2 Audio file: + NEW_SMS("MPEG-1 or 2 Audio"); + // To stream using 'ADUs' rather than raw MP3 frames, uncomment the following: +//#define STREAM_USING_ADUS 1 + // To also reorder ADUs before streaming, uncomment the following: +//#define INTERLEAVE_ADUS 1 + // (For more information about ADUs and interleaving, + // see ) + Boolean useADUs = False; + Interleaving* interleaving = NULL; +#ifdef STREAM_USING_ADUS + useADUs = True; +#ifdef INTERLEAVE_ADUS + unsigned char interleaveCycle[] = {0,2,1,3}; // or choose your own... + unsigned const interleaveCycleSize + = (sizeof interleaveCycle)/(sizeof (unsigned char)); + interleaving = new Interleaving(interleaveCycleSize, interleaveCycle); +#endif +#endif + sms->addSubsession(MP3AudioFileServerMediaSubsession::createNew(env, fileName, reuseSource, useADUs, interleaving)); + } else if (strcmp(extension, ".mpg") == 0) { + // Assumed to be a MPEG-1 or 2 Program Stream (audio+video) file: + NEW_SMS("MPEG-1 or 2 Program Stream"); + MPEG1or2FileServerDemux* demux + = MPEG1or2FileServerDemux::createNew(env, fileName, reuseSource); + sms->addSubsession(demux->newVideoServerMediaSubsession()); + sms->addSubsession(demux->newAudioServerMediaSubsession()); + } else if (strcmp(extension, ".vob") == 0) { + // Assumed to be a VOB (MPEG-2 Program Stream, with AC-3 audio) file: + NEW_SMS("VOB (MPEG-2 video with AC-3 audio)"); + MPEG1or2FileServerDemux* demux + = MPEG1or2FileServerDemux::createNew(env, fileName, reuseSource); + sms->addSubsession(demux->newVideoServerMediaSubsession()); + sms->addSubsession(demux->newAC3AudioServerMediaSubsession()); + } else if (strcmp(extension, ".ts") == 0) { + // Assumed to be a MPEG Transport Stream file: + // Use an index file name that's the same as the TS file name, except with ".tsx": + unsigned indexFileNameLen = strlen(fileName) + 2; // allow for trailing "x\0" + char* indexFileName = new char[indexFileNameLen]; + sprintf(indexFileName, "%sx", fileName); + NEW_SMS("MPEG Transport Stream"); + sms->addSubsession(MPEG2TransportFileServerMediaSubsession::createNew(env, fileName, indexFileName, reuseSource)); + delete[] indexFileName; + } else if (strcmp(extension, ".wav") == 0) { + // Assumed to be a WAV Audio file: + NEW_SMS("WAV Audio Stream"); + // To convert 16-bit PCM data to 8-bit u-law, prior to streaming, + // change the following to True: + Boolean convertToULaw = False; + sms->addSubsession(WAVAudioFileServerMediaSubsession::createNew(env, fileName, reuseSource, convertToULaw)); + } else if (strcmp(extension, ".dv") == 0) { + // Assumed to be a DV Video file + // First, make sure that the RTPSinks' buffers will be large enough to handle the huge size of DV frames (as big as 288000). + OutPacketBuffer::maxSize = 300000; + + NEW_SMS("DV Video"); + sms->addSubsession(DVVideoFileServerMediaSubsession::createNew(env, fileName, reuseSource)); + } else if (strcmp(extension, ".mkv") == 0 || strcmp(extension, ".webm") == 0) { + // Assumed to be a Matroska file (note that WebM ('.webm') files are also Matroska files) + OutPacketBuffer::maxSize = 300000; // allow for some possibly large VP8 or VP9 frames + NEW_SMS("Matroska video+audio+(optional)subtitles"); + + // Create a Matroska file server demultiplexor for the specified file. + // (We enter the event loop to wait for this to complete.) + MatroskaDemuxCreationState creationState; + creationState.watchVariable = 0; + MatroskaFileServerDemux::createNew(env, fileName, onMatroskaDemuxCreation, &creationState); + env.taskScheduler().doEventLoop(&creationState.watchVariable); + + ServerMediaSubsession* smss; + while ((smss = creationState.demux->newServerMediaSubsession()) != NULL) { + sms->addSubsession(smss); + } + } else if (strcmp(extension, ".ogg") == 0 || strcmp(extension, ".ogv") == 0 || strcmp(extension, ".opus") == 0) { + // Assumed to be an Ogg file + NEW_SMS("Ogg video and/or audio"); + + // Create a Ogg file server demultiplexor for the specified file. + // (We enter the event loop to wait for this to complete.) + OggDemuxCreationState creationState; + creationState.watchVariable = 0; + OggFileServerDemux::createNew(env, fileName, onOggDemuxCreation, &creationState); + env.taskScheduler().doEventLoop(&creationState.watchVariable); + + ServerMediaSubsession* smss; + while ((smss = creationState.demux->newServerMediaSubsession()) != NULL) { + sms->addSubsession(smss); + } + } + + return sms; +} diff --git a/src/big/mpp/middleware/src/live555/mediaServer/DynamicRTSPServer.hh b/src/big/mpp/middleware/src/live555/mediaServer/DynamicRTSPServer.hh new file mode 100644 index 000000000..3a3166a00 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/mediaServer/DynamicRTSPServer.hh @@ -0,0 +1,47 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// Copyright (c) 1996-2023, Live Networks, Inc. All rights reserved +// A subclass of "RTSPServer" that creates "ServerMediaSession"s on demand, +// based on whether or not the specified stream name exists as a file +// Header file + +#ifndef _DYNAMIC_RTSP_SERVER_HH +#define _DYNAMIC_RTSP_SERVER_HH + +#ifndef _RTSP_SERVER_HH +#include "RTSPServer.hh" +#endif + +class DynamicRTSPServer: public RTSPServer { +public: + static DynamicRTSPServer* createNew(UsageEnvironment& env, Port ourPort, + UserAuthenticationDatabase* authDatabase, + unsigned reclamationTestSeconds = 65); + +protected: + DynamicRTSPServer(UsageEnvironment& env, int ourSocketIPv4, int ourSocketIPv6, Port ourPort, + UserAuthenticationDatabase* authDatabase, unsigned reclamationTestSeconds); + // called only by createNew(); + virtual ~DynamicRTSPServer(); + +protected: // redefined virtual functions + virtual void lookupServerMediaSession(char const* streamName, + lookupServerMediaSessionCompletionFunc* completionFunc, + void* completionClientData, + Boolean isFirstLookupInSession); +}; + +#endif diff --git a/src/big/mpp/middleware/src/live555/mediaServer/Makefile b/src/big/mpp/middleware/src/live555/mediaServer/Makefile new file mode 100644 index 000000000..4c494f803 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/mediaServer/Makefile @@ -0,0 +1,61 @@ +include $(MPP_SRC_DIR)/middleware/mpp.mk +include $(MPP_SRC_DIR)/middleware/rt-smart.mk + +AR = riscv64-unknown-linux-musl-ar +ARFLAGS = -rc + +CURRECT_DIR_NAME=$(shell basename `pwd`) +LOCAL_SRC_DIR = $(shell pwd) +BIN = $(MPP_SRC_DIR)/userapps/sample/elf/$(CURRECT_DIR_NAME).elf +LIBPATH = $(MPP_LIB_PATH) +LIBS = $(MPP_LIBS) + +LIBS_FOR_CONSOLE_APPLICATION = -lssl -lcrypto +CC_CFLAGS_EX=-mcmodel=medany -march=rv64imafdcv -mabi=lp64d -Wall -O0 -g -gdwarf-2 -n --static $(KCFLAGS) + +LIVE555_USAGEENVIRONMENT= ../UsageEnvironment +LIVE555_BASICUSAGEENVIRONMENT= ../BasicUsageEnvironment +LIVE555_GROUPSOCK = ../groupsock +LIVE555_LIVEMEDIA = ../liveMedia + +LOCAL_LIBS_PATH = -L$(LIVE555_USAGEENVIRONMENT) -L$(LIVE555_BASICUSAGEENVIRONMENT) -L$(LIVE555_GROUPSOCK) -L$(LIVE555_LIVEMEDIA) +LOCAL_LIBS = -lliveMedia -lgroupsock -lBasicUsageEnvironment -lUsageEnvironment + +LIVE555_COMPILE_OPTS = -DSOCKLEN_T=socklen_t -DNO_SSTREAM=1 -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -DNO_OPENSSL=1 + +LOCAL_CFLAGS = -I$(LOCAL_SRC_DIR) -I$(LIVE555_GROUPSOCK)/include -I$(LIVE555_USAGEENVIRONMENT)/include -I$(LIVE555_BASICUSAGEENVIRONMENT)/include -I$(LIVE555_LIVEMEDIA)/include + +WERROR_FLAGS = -Wno-register -Wno-multichar -Wno-pessimizing-move -Wno-deprecated-declarations -Wno-unused-result -Wno-unused-variable -Wno-format -Wno-return-type -Wno-sign-compare -Wno-unused-label + +CXX_FLAGS = $(WERROR_FLAGS) \ + $(LIVE555_COMPILE_OPTS) \ + +SRCS = $(wildcard $(LOCAL_SRC_DIR)/*.c) + +OBJS = $(patsubst %.c,%.o,$(SRCS)) + +CPP_SRCS = $(wildcard $(LOCAL_SRC_DIR)/*.cpp) + +CPP_OBJS = $(patsubst %.cpp,%.o,$(CPP_SRCS)) + +all:$(BIN) + @-rm -f *.o + @echo "${PWD}/Makefile all" + +$(OBJS): %.o : %.c + @echo CC $@ + @$(CC) $(CC_CFLAGS_EX) $(LOCAL_CFLAGS) $(BSP_CFLGAS) $(RTSMART_CFLAGS) $(MPP_USER_CFLGAS) $(LOCAL_LIBS)-c $< -o $@ + +$(CPP_OBJS): %.o : %.cpp + @echo CXX $@ + @$(CPP) $(CC_CFLAGS_EX) $(CXX_FLAGS) $(LOCAL_CFLAGS) $(BSP_CFLGAS) $(RTSMART_CFLAGS) $(MPP_USER_CFLGAS) $(LOCAL_LIBS) -c $< -o $@ + +$(BIN): $(OBJS) $(CPP_OBJS) + @echo LD $@ + @$(CPP) -o $(BIN) $(LINKFLAG) -Wl,--whole-archive -Wl,--no-whole-archive -n --static $^ -L$(LIBPATH) $(CXX_FLAGS) $(LOCAL_LIBS) $(LOCAL_LIBS_PATH) -Wl,--start-group $(LIBS) -Wl,--end-group + +clean: + echo "${PWD}/Makefile clean" + rm -rf $(BIN) $(OBJS) + +.PHONY: all clean diff --git a/src/big/mpp/middleware/src/live555/mediaServer/live555MediaServer.cpp b/src/big/mpp/middleware/src/live555/mediaServer/live555MediaServer.cpp new file mode 100644 index 000000000..06af56ae2 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/mediaServer/live555MediaServer.cpp @@ -0,0 +1,104 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// Copyright (c) 1996-2023, Live Networks, Inc. All rights reserved +// LIVE555 Media Server +// main program + +#include +#include "DynamicRTSPServer.hh" +#include "version.hh" +#include // for "weHaveAnIPv*Address()" + +int main(int argc, char** argv) { + // Begin by setting up our usage environment: + TaskScheduler* scheduler = BasicTaskScheduler::createNew(); + UsageEnvironment* env = BasicUsageEnvironment::createNew(*scheduler); + + UserAuthenticationDatabase* authDB = NULL; +#ifdef ACCESS_CONTROL + // To implement client access control to the RTSP server, do the following: + authDB = new UserAuthenticationDatabase; + authDB->addUserRecord("username1", "password1"); // replace these with real strings + // Repeat the above with each , that you wish to allow + // access to the server. +#endif + + // Create the RTSP server. Try first with the default port number (554), + // and then with the alternative port number (8554): + RTSPServer* rtspServer; + portNumBits rtspServerPortNum = 554; + rtspServer = DynamicRTSPServer::createNew(*env, rtspServerPortNum, authDB); + if (rtspServer == NULL) { + rtspServerPortNum = 8554; + rtspServer = DynamicRTSPServer::createNew(*env, rtspServerPortNum, authDB); + } + if (rtspServer == NULL) { + *env << "Failed to create RTSP server: " << env->getResultMsg() << "\n"; + exit(1); + } + + *env << "LIVE555 Media Server\n"; + *env << "\tversion " << MEDIA_SERVER_VERSION_STRING + << " (LIVE555 Streaming Media library version " + << LIVEMEDIA_LIBRARY_VERSION_STRING << ").\n"; + + *env << "Play streams from this server using the URL\n"; + if (weHaveAnIPv4Address(*env)) { + char* rtspURLPrefix = rtspServer->ipv4rtspURLPrefix(); + *env << "\t" << rtspURLPrefix << "\n"; + delete[] rtspURLPrefix; + if (weHaveAnIPv6Address(*env)) *env << "or\n"; + } + if (weHaveAnIPv6Address(*env)) { + char* rtspURLPrefix = rtspServer->ipv6rtspURLPrefix(); + *env << "\t" << rtspURLPrefix << "\n"; + delete[] rtspURLPrefix; + } + *env << "where is a file present in the current directory.\n"; + + *env << "Each file's type is inferred from its name suffix:\n"; + *env << "\t\".264\" => a H.264 Video Elementary Stream file\n"; + *env << "\t\".265\" => a H.265 Video Elementary Stream file\n"; + *env << "\t\".aac\" => an AAC Audio (ADTS format) file\n"; + *env << "\t\".ac3\" => an AC-3 Audio file\n"; + *env << "\t\".amr\" => an AMR Audio file\n"; + *env << "\t\".dv\" => a DV Video file\n"; + *env << "\t\".m4e\" => a MPEG-4 Video Elementary Stream file\n"; + *env << "\t\".mkv\" => a Matroska audio+video+(optional)subtitles file\n"; + *env << "\t\".mp3\" => a MPEG-1 or 2 Audio file\n"; + *env << "\t\".mpg\" => a MPEG-1 or 2 Program Stream (audio+video) file\n"; + *env << "\t\".ogg\" or \".ogv\" or \".opus\" => an Ogg audio and/or video file\n"; + *env << "\t\".ts\" => a MPEG Transport Stream file\n"; + *env << "\t\t(a \".tsx\" index file - if present - provides server 'trick play' support)\n"; + *env << "\t\".vob\" => a VOB (MPEG-2 video with AC-3 audio) file\n"; + *env << "\t\".wav\" => a WAV Audio file\n"; + *env << "\t\".webm\" => a WebM audio(Vorbis)+video(VP8) file\n"; + *env << "See http://www.live555.com/mediaServer/ for additional documentation.\n"; + + // Also, attempt to create a HTTP server for RTSP-over-HTTP tunneling. + // Try first with the default HTTP port (80), and then with the alternative HTTP + // port numbers (8000 and 8080). + + if (rtspServer->setUpTunnelingOverHTTP(80) || rtspServer->setUpTunnelingOverHTTP(8000) || rtspServer->setUpTunnelingOverHTTP(8080)) { + *env << "(We use port " << rtspServer->httpServerPortNum() << " for optional RTSP-over-HTTP tunneling).)\n"; + } else { + *env << "(RTSP-over-HTTP tunneling is not available.)\n"; + } + + env->taskScheduler().doEventLoop(); // does not return + + return 0; // only to prevent compiler warning +} diff --git a/src/big/mpp/middleware/src/live555/mediaServer/version.hh b/src/big/mpp/middleware/src/live555/mediaServer/version.hh new file mode 100644 index 000000000..dcc74bcd7 --- /dev/null +++ b/src/big/mpp/middleware/src/live555/mediaServer/version.hh @@ -0,0 +1,25 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// Copyright (c) 1996-2023, Live Networks, Inc. All rights reserved +// Version information for the LIVE555 Media Server application +// Header file + +#ifndef _MEDIA_SERVER_VERSION_HH +#define _MEDIA_SERVER_VERSION_HH + +#define MEDIA_SERVER_VERSION_STRING "1.10" + +#endif diff --git a/src/big/mpp/middleware/src/mp4_format/Makefile b/src/big/mpp/middleware/src/mp4_format/Makefile new file mode 100644 index 000000000..2167a6beb --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/Makefile @@ -0,0 +1,60 @@ +include $(MPP_SRC_DIR)/middleware/mpp.mk +include $(MPP_SRC_DIR)/middleware/rt-smart.mk + +BIN=libmp4.a +# CC=riscv64-unknown-linux-gnu-gcc +# AR=riscv64-unknown-linux-gnu-ar -rcs + +CC=riscv64-unknown-linux-musl-gcc +AR=riscv64-unknown-linux-musl-ar -rc + +# CC=gcc -g +# AR=gcc-ar rc + +CURRECT_DIR_NAME=$(shell pwd) + +CFLAGS= +DEFINE= +TARGET_DIR=lib +BUILD_DIR=build + +MP4_SRC=src +MOV_SRC=src/libmov/source +FLV_SRC=src/libflv/source + +$(shell if [ ! -e $(TARGET_DIR) ];then mkdir -p $(TARGET_DIR); fi) +$(shell if [ ! -e $(BUILD_DIR) ];then mkdir -p $(BUILD_DIR); fi) + +INCS=-I$(CURRECT_DIR_NAME)/include +INCS+=-I$(CURRECT_DIR_NAME)/src/libflv/include +INCS+=-I$(CURRECT_DIR_NAME)/src/libmov/include + +MP4_SRCS:= $(foreach dir, $(MP4_SRC), $(wildcard $(dir)/*.c $())) +MP4_COBJS:= $(addprefix $(BUILD_DIR)/,$(patsubst %.c,%.o,$(notdir $(MP4_SRCS)))) +MOV_SRCS:= $(foreach dir, $(MOV_SRC), $(wildcard $(dir)/*.c $())) +MOV_COBJS:= $(addprefix $(BUILD_DIR)/,$(patsubst %.c,%.o,$(notdir $(MOV_SRCS)))) +FLV_SRCS:= $(foreach dir, $(FLV_SRC), $(wildcard $(dir)/*.c $())) +FLV_COBJS:= $(addprefix $(BUILD_DIR)/,$(patsubst %.c,%.o,$(notdir $(FLV_SRCS)))) + + + +all:$(BIN) + @rm -f $(MP4_COBJS) + @rm -f $(MOV_COBJS) + @rm -f $(FLV_COBJS) + +$(MOV_COBJS) : $(BUILD_DIR)/%.o: $(MOV_SRC)/%.c + $(CC) -c -fPIC $(CFLAGS) $< -o $@ $(INCS) $(DEFINE) + +$(FLV_COBJS) : $(BUILD_DIR)/%.o: $(FLV_SRC)/%.c + $(CC) -c -fPIC $(CFLAGS) $< -o $@ $(INCS) $(DEFINE) + +$(MP4_COBJS) : $(BUILD_DIR)/%.o: $(MP4_SRC)/%.c + $(CC) -c -fPIC $(CFLAGS) $< -o $@ $(INCS) $(DEFINE) + + +$(BIN):$(MP4_COBJS) $(MOV_COBJS) $(FLV_COBJS) + $(AR) -o $(TARGET_DIR)/$(BIN) $(MP4_COBJS) $(MOV_COBJS) $(FLV_COBJS) +clean: + @rm -f $(TARGET_DIR)/$(BIN) $(MP4_COBJS) $(MOV_COBJS) $(FLV_COBJS) + @rm -rf $(TARGET_DIR) $(BUILD_DIR) diff --git a/src/big/mpp/middleware/src/mp4_format/include/mp4_format.h b/src/big/mpp/middleware/src/mp4_format/include/mp4_format.h new file mode 100644 index 000000000..5883f30d6 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/include/mp4_format.h @@ -0,0 +1,112 @@ +#ifndef _KD_MP4_FORMAT_H_ +#define _KD_MP4_FORMAT_H_ + +#include +#include +#include + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif // __cplusplus + +typedef void* KD_HANDLE; + +typedef enum { + K_MP4_CONFIG_MUXER = 1, + K_MP4_CONFIG_DEMUXER, + K_MP4_CONFIG_BUTT +} k_mp4_config_type_e; + +typedef enum { + K_MP4_STREAM_VIDEO = 1, + K_MP4_STREAM_AUDIO, + K_MP4_STREAM_BUTT +} k_mp4_track_type_e; + +typedef enum { + K_MP4_CODEC_ID_H264 = 0, + K_MP4_CODEC_ID_H265, + K_MP4_CODEC_ID_G711A, + K_MP4_CODEC_ID_G711U, + K_MP4_CODEC_ID_BUTT +} k_mp4_codec_id_e; + +typedef struct { + char file_name[128]; + uint8_t fmp4_flag; +} k_mp4_config_muxer_s; + +typedef struct { + char file_name[128]; +} k_mp4_config_demuxer_s; + +typedef struct { + k_mp4_config_type_e config_type; + union { + k_mp4_config_muxer_s muxer_config; + k_mp4_config_demuxer_s demuxer_config; + }; +} k_mp4_config_s; + +typedef struct { + uint32_t width; + uint32_t height; + uint32_t track_id; + k_mp4_codec_id_e codec_id; +} k_mp4_video_info_s; + +typedef struct { + uint32_t channels; + uint32_t sample_rate; + uint32_t bit_per_sample; + uint32_t track_id; + k_mp4_codec_id_e codec_id; +} k_mp4_audio_info_s; + +typedef struct { + k_mp4_track_type_e track_type; + uint32_t time_scale; + union { + k_mp4_video_info_s video_info; + k_mp4_audio_info_s audio_info; + }; +} k_mp4_track_info_s; + +typedef struct { + uint64_t duration; + uint32_t track_num; +} k_mp4_file_info_s; + +typedef struct { + k_mp4_codec_id_e codec_id; + uint64_t time_stamp; + uint8_t *data; + uint32_t data_length; + uint8_t eof; +} k_mp4_frame_data_s; + +int kd_mp4_create(KD_HANDLE *mp4_handle, k_mp4_config_s *mp4_cfg); + +int kd_mp4_destroy(KD_HANDLE mp4_handle); + +int kd_mp4_create_track(KD_HANDLE mp4_handle, KD_HANDLE *track_handle, k_mp4_track_info_s *mp4_track_info); + +int kd_mp4_destroy_tracks(KD_HANDLE mp4_handle); + +int kd_mp4_write_frame(KD_HANDLE mp4_handle, KD_HANDLE track_handle, k_mp4_frame_data_s *frame_data); + +int kd_mp4_get_file_info(KD_HANDLE mp4_handle, k_mp4_file_info_s *file_info); + +int kd_mp4_get_track_by_index(KD_HANDLE mp4_handle, uint32_t index, k_mp4_track_info_s *mp4_track_info); + +int kd_mp4_get_frame(KD_HANDLE mp4_handle, k_mp4_frame_data_s *frame_data); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif // __cplusplus + +#endif // _KD_MP4_FORMAT_H_ diff --git a/src/big/mpp/middleware/src/mp4_format/src/libflv/include/amf0.h b/src/big/mpp/middleware/src/mp4_format/src/libflv/include/amf0.h new file mode 100644 index 000000000..432a6c3b5 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libflv/include/amf0.h @@ -0,0 +1,69 @@ +#ifndef _amf0_h_ +#define _amf0_h_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +enum AMFDataType +{ + AMF_NUMBER = 0x00, + AMF_BOOLEAN, + AMF_STRING, + AMF_OBJECT, + AMF_MOVIECLIP, + AMF_NULL, + AMF_UNDEFINED, + AMF_REFERENCE, + AMF_ECMA_ARRAY, + AMF_OBJECT_END, + AMF_STRICT_ARRAY, + AMF_DATE, + AMF_LONG_STRING, + AMF_UNSUPPORTED, + AMF_RECORDSET, + AMF_XML_DOCUMENT, + AMF_TYPED_OBJECT, + AMF_AVMPLUS_OBJECT, +}; + +uint8_t* AMFWriteNull(uint8_t* ptr, const uint8_t* end); +uint8_t* AMFWriteUndefined(uint8_t* ptr, const uint8_t* end); +uint8_t* AMFWriteObject(uint8_t* ptr, const uint8_t* end); +uint8_t* AMFWriteObjectEnd(uint8_t* ptr, const uint8_t* end); +uint8_t* AMFWriteTypedObject(uint8_t* ptr, const uint8_t* end); +uint8_t* AMFWriteECMAArarry(uint8_t* ptr, const uint8_t* end); + +uint8_t* AMFWriteBoolean(uint8_t* ptr, const uint8_t* end, uint8_t value); +uint8_t* AMFWriteDouble(uint8_t* ptr, const uint8_t* end, double value); +uint8_t* AMFWriteString(uint8_t* ptr, const uint8_t* end, const char* string, size_t length); +uint8_t* AMFWriteDate(uint8_t* ptr, const uint8_t* end, double milliseconds, int16_t timezone); + +uint8_t* AMFWriteNamedString(uint8_t* ptr, const uint8_t* end, const char* name, size_t length, const char* value, size_t length2); +uint8_t* AMFWriteNamedDouble(uint8_t* ptr, const uint8_t* end, const char* name, size_t length, double value); +uint8_t* AMFWriteNamedBoolean(uint8_t* ptr, const uint8_t* end, const char* name, size_t length, uint8_t value); + +const uint8_t* AMFReadNull(const uint8_t* ptr, const uint8_t* end); +const uint8_t* AMFReadUndefined(const uint8_t* ptr, const uint8_t* end); +const uint8_t* AMFReadBoolean(const uint8_t* ptr, const uint8_t* end, uint8_t* value); +const uint8_t* AMFReadDouble(const uint8_t* ptr, const uint8_t* end, double* value); +const uint8_t* AMFReadString(const uint8_t* ptr, const uint8_t* end, int isLongString, char* string, size_t length); +const uint8_t* AMFReadDate(const uint8_t* ptr, const uint8_t* end, double *milliseconds, int16_t *timezone); + + +struct amf_object_item_t +{ + enum AMFDataType type; + const char* name; + void* value; + size_t size; +}; +const uint8_t* amf_read_items(const uint8_t* data, const uint8_t* end, struct amf_object_item_t* items, size_t count); + +#ifdef __cplusplus +} +#endif +#endif /* !_amf0_h_ */ diff --git a/src/big/mpp/middleware/src/mp4_format/src/libflv/include/amf3.h b/src/big/mpp/middleware/src/mp4_format/src/libflv/include/amf3.h new file mode 100644 index 000000000..cf1fede26 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libflv/include/amf3.h @@ -0,0 +1,56 @@ +#ifndef _amf3_h_ +#define _amf3_h_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +enum AMF3DataType +{ + AMF3_UNDEFINED = 0x00, + AMF3_NULL, + AMF3_FALSE, + AMF3_TRUE, + AMF3_INTEGER, + AMF3_DOUBLE, + AMF3_STRING, + AMF3_XML_DOCUMENT, + AMF3_DATE, + AMF3_ARRAY, + AMF3_OBJECT, + AMF3_XML, + AMF3_BYTE_ARRAY, + AMF3_VECTOR_INT, + AMF3_VECTOR_UINT, + AMF3_VECTOR_DOUBLE, + AMF3_VECTOR_OBJECT, + AMF3_DICTIONARY, +}; + +//uint8_t* AMF3WriteNull(uint8_t* ptr, const uint8_t* end); +//uint8_t* AMF3WriteObject(uint8_t* ptr, const uint8_t* end); +//uint8_t* AMF3WriteObjectEnd(uint8_t* ptr, const uint8_t* end); +// +//uint8_t* AMF3WriteBoolean(uint8_t* ptr, const uint8_t* end, uint8_t value); +//uint8_t* AMF3WriteInteger(uint8_t* ptr, const uint8_t* end, int32_t value); +//uint8_t* AMF3WriteDouble(uint8_t* ptr, const uint8_t* end, double value); +//uint8_t* AMF3WriteString(uint8_t* ptr, const uint8_t* end, const char* string, size_t length); +// +//uint8_t* AMF3WriteNamedBoolean(uint8_t* ptr, const uint8_t* end, const char* name, size_t length, uint8_t value); +//uint8_t* AMF3WriteNamedInteger(uint8_t* ptr, const uint8_t* end, const char* name, size_t length, int32_t value); +//uint8_t* AMF3WriteNamedString(uint8_t* ptr, const uint8_t* end, const char* name, size_t length, const char* value, size_t length2); +//uint8_t* AM3FWriteNamedDouble(uint8_t* ptr, const uint8_t* end, const char* name, size_t length, double value); + +const uint8_t* AMF3ReadNull(const uint8_t* ptr, const uint8_t* end); +const uint8_t* AMF3ReadBoolean(const uint8_t* ptr, const uint8_t* end); +const uint8_t* AMF3ReadInteger(const uint8_t* ptr, const uint8_t* end, int32_t* value); +const uint8_t* AMF3ReadDouble(const uint8_t* ptr, const uint8_t* end, double* value); +const uint8_t* AMF3ReadString(const uint8_t* ptr, const uint8_t* end, char* string, uint32_t* length); + +#ifdef __cplusplus +} +#endif +#endif /* !_amf3_h_ */ diff --git a/src/big/mpp/middleware/src/mp4_format/src/libflv/include/aom-av1.h b/src/big/mpp/middleware/src/mp4_format/src/libflv/include/aom-av1.h new file mode 100644 index 000000000..e610b698b --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libflv/include/aom-av1.h @@ -0,0 +1,54 @@ +#ifndef _aom_av1_h_ +#define _aom_av1_h_ + +#include +#include + +#if defined(__cplusplus) +extern "C" { +#endif + +struct aom_av1_t +{ + uint32_t marker : 1; + uint32_t version : 7; + uint32_t seq_profile : 3; + uint32_t seq_level_idx_0 : 5; + uint32_t seq_tier_0 : 1; + uint32_t high_bitdepth : 1; + uint32_t twelve_bit : 1; + uint32_t monochrome : 1; + uint32_t chroma_subsampling_x : 1; + uint32_t chroma_subsampling_y : 1; + uint32_t chroma_sample_position : 2; + + uint32_t reserved : 3; + uint32_t initial_presentation_delay_present : 1; + uint32_t initial_presentation_delay_minus_one : 4; + + uint8_t buffer_delay_length_minus_1; // decoder_model_info + uint32_t width; // max_frame_width_minus_1 + uint32_t height; // max_frame_height_minus_1 + + uint16_t bytes; + uint8_t data[2 * 1024]; +}; + +/// Create av1 codec configuration record from Sequence Header OBU +/// @param[in] data av1 low overhead bitstream format +/// @return 0-ok, other-error +int aom_av1_codec_configuration_record_init(struct aom_av1_t* av1, const void* data, size_t bytes); + +int aom_av1_codec_configuration_record_load(const uint8_t* data, size_t bytes, struct aom_av1_t* av1); +int aom_av1_codec_configuration_record_save(const struct aom_av1_t* av1, uint8_t* data, size_t bytes); + +/// @param[in] data av1 split low overhead/annexb bitstream format to obu +int aom_av1_obu_split(const uint8_t* data, size_t bytes, int (*handler)(void* param, const uint8_t* obu, size_t bytes), void* param); +int aom_av1_annexb_split(const uint8_t* data, size_t bytes, int (*handler)(void* param, const uint8_t* obu, size_t bytes), void* param); + +int aom_av1_codecs(const struct aom_av1_t* av1, char* codecs, size_t bytes); + +#if defined(__cplusplus) +} +#endif +#endif /* !_aom_av1_h_ */ diff --git a/src/big/mpp/middleware/src/mp4_format/src/libflv/include/flv-demuxer.h b/src/big/mpp/middleware/src/mp4_format/src/libflv/include/flv-demuxer.h new file mode 100644 index 000000000..b09304716 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libflv/include/flv-demuxer.h @@ -0,0 +1,38 @@ +#ifndef _flv_demuxer_h_ +#define _flv_demuxer_h_ + +#include +#include + +#if defined(__cplusplus) +extern "C" { +#endif + +typedef struct flv_demuxer_t flv_demuxer_t; + +/// Audio/Video Elementary Stream +/// @param[in] param user-defined parameter +/// @param[in] codec audio/video format (see more flv-proto.h) +/// @param[in] data audio/video element data, AAC: ADTS + AAC-Frame, H.264: startcode + NALU, MP3-Raw data +/// @param[in] bytes data length in byte +/// @param[in] pts audio/video presentation timestamp +/// @param[in] dts audio/video decoding timestamp +/// @param[in] flags 1-video keyframe, other-undefined +/// @return 0-ok, other-error +typedef int (*flv_demuxer_handler)(void* param, int codec, const void* data, size_t bytes, uint32_t pts, uint32_t dts, int flags); + +flv_demuxer_t* flv_demuxer_create(flv_demuxer_handler handler, void* param); +void flv_demuxer_destroy(flv_demuxer_t* demuxer); + +/// Input FLV Audio/Video Stream +/// @param[in] type 8-audio, 9-video, 18-script (see more flv-proto.h) +/// @param[in] data flv audio/video Stream, AudioTagHeader/VideoTagHeader + A/V Data +/// @param[in] bytes data length in byte +/// @param[in] timestamp milliseconds relative to the first tag(DTS) +/// @return 0-ok, other-error +int flv_demuxer_input(flv_demuxer_t* demuxer, int type, const void* data, size_t bytes, uint32_t timestamp); + +#if defined(__cplusplus) +} +#endif +#endif /* !_flv_demuxer_h_ */ diff --git a/src/big/mpp/middleware/src/mp4_format/src/libflv/include/flv-header.h b/src/big/mpp/middleware/src/mp4_format/src/libflv/include/flv-header.h new file mode 100644 index 000000000..e11f1d450 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libflv/include/flv-header.h @@ -0,0 +1,118 @@ +#ifndef _flv_header_h_ +#define _flv_header_h_ + +#include +#include + +#if defined(__cplusplus) +extern "C" { +#endif + +struct flv_header_t +{ + uint8_t FLV[3]; + uint8_t version; + uint8_t audio; + uint8_t video; + uint32_t offset; // data offset +}; + +struct flv_tag_header_t +{ + uint8_t filter; // 0-No pre-processing required + uint8_t type; // 8-audio, 9-video, 18-script data + uint32_t size; // data size + uint32_t timestamp; + uint32_t streamId; +}; + +struct flv_audio_tag_header_t +{ + uint8_t codecid; /// audio codec id: FLV_AUDIO_AAC + uint8_t rate; /// audio sample frequence: 0-5.5 kHz, 1-11 kHz, 2-22 kHz, 3-44 kHz + uint8_t bits; /// audio sample bits: 0-8 bit samples, 1-16-bit samples + uint8_t channels; /// audio channel count: 0-Mono sound, 1-Stereo sound + uint8_t avpacket; /// AAC only:FLV_SEQUENCE_HEADER/FLV_AVPACKET +}; + +struct flv_video_tag_header_t +{ + uint8_t codecid; /// video codec id: FLV_VIDEO_H264 + uint8_t keyframe; /// video frame type: 1-key frame, 2-inter frame + uint8_t avpacket; /// H.264/H.265/AV1 only:FLV_SEQUENCE_HEADER/FLV_AVPACKET/FLV_END_OF_SEQUENCE + int32_t cts; /// video composition time(PTS - DTS), AVC/HEVC/AV1 only +}; + +/// Read FLV File Header +/// @return >=0-header length in byte, <0-error +int flv_header_read(struct flv_header_t* flv, const uint8_t* buf, size_t len); + +/// Write FLV File Header +/// @param[in] audio 1-has audio, 0-don't have +/// @param[in] video 1-has video, 0-don't have +/// @param[out] buf flv header buffer +/// @param[out] len flv header length +/// @return >=0-header length in byte, <0-error +int flv_header_write(int audio, int video, uint8_t* buf, size_t len); + + +/// Read FLV Tag Header +/// @return >=0-header length in byte, <0-error +int flv_tag_header_read(struct flv_tag_header_t* tag, const uint8_t* buf, size_t len); + +/// Write FLV Tag Header +/// @param[out] buf flv tag header buffer +/// @param[out] len flv tag header length +/// @return >=0-header length in byte, <0-error +int flv_tag_header_write(const struct flv_tag_header_t* tag, uint8_t* buf, size_t len); + + +/// Read FLV Audio Tag Header +/// @param[out] audio flv audio parameter +/// @param[in] buf flv audio tag header buffer +/// @param[in] len flv audio tag header length +/// @return >=0-header length in byte, <0-error +int flv_audio_tag_header_read(struct flv_audio_tag_header_t* audio, const uint8_t* buf, size_t len); + +/// Write FLV Audio Tag Header +/// @param[in] audio flv audio parameter +/// @param[out] buf flv audio tag header buffer +/// @param[out] len flv audio tag header length +/// @return >=0-header length in byte, <0-error +int flv_audio_tag_header_write(const struct flv_audio_tag_header_t* audio, uint8_t* buf, size_t len); + + +/// Read FLV Video Tag Header +/// @param[out] video flv video parameter +/// @param[in] buf flv video tag header buffer +/// @param[in] len flv video tag header length +/// @return >=0-header length in byte, <0-error +int flv_video_tag_header_read(struct flv_video_tag_header_t* video, const uint8_t* buf, size_t len); + +/// Write FLV Video Tag Header +/// @param[in] video flv video parameter +/// @param[out] buf flv video tag header buffer +/// @param[out] len flv video tag header length +/// @return >=0-header length in byte, <0-error +int flv_video_tag_header_write(const struct flv_video_tag_header_t* video, uint8_t* buf, size_t len); + + +/// Read FLV Data Tag Header +/// @return >=0-header length in byte, <0-error +int flv_data_tag_header_read(const uint8_t* buf, size_t len); + +/// Write FLV Data Tag Header +/// @param[out] buf flv data tag header buffer +/// @param[out] len flv data tag header length +/// @return >=0-header length in byte, <0-error +int flv_data_tag_header_write(uint8_t* buf, size_t len); + + +/// Read/Write FLV previous tag size +int flv_tag_size_read(const uint8_t* buf, size_t len, uint32_t* size); +int flv_tag_size_write(uint8_t* buf, size_t len, uint32_t size); + +#if defined(__cplusplus) +} +#endif +#endif /* !_flv_header_h_ */ diff --git a/src/big/mpp/middleware/src/mp4_format/src/libflv/include/flv-muxer.h b/src/big/mpp/middleware/src/mp4_format/src/libflv/include/flv-muxer.h new file mode 100644 index 000000000..a2b66b7cf --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libflv/include/flv-muxer.h @@ -0,0 +1,70 @@ +#ifndef _flv_muxer_h_ +#define _flv_muxer_h_ + +#include +#include + +#if defined(__cplusplus) +extern "C" { +#endif + +typedef struct flv_muxer_t flv_muxer_t; + +///Video: FLV VideoTagHeader + AVCVIDEOPACKET: AVCDecoderConfigurationRecord(ISO 14496-15) / One or more NALUs(four-bytes length + NALU) +///Audio: FLV AudioTagHeader + AACAUDIODATA: AudioSpecificConfig(14496-3) / Raw AAC frame data in UI8 +///@param[in] data FLV Audio/Video Data(don't include FLV Tag Header) +///@param[in] type 8-audio, 9-video +///@return 0-ok, other-error +typedef int (*flv_muxer_handler)(void* param, int type, const void* data, size_t bytes, uint32_t timestamp); + +flv_muxer_t* flv_muxer_create(flv_muxer_handler handler, void* param); +void flv_muxer_destroy(flv_muxer_t* muxer); + +/// re-create AAC/AVC sequence header +int flv_muxer_reset(flv_muxer_t* muxer); + +/// @param[in] data AAC ADTS stream, 0xFFF15C40011FFC... +int flv_muxer_aac(flv_muxer_t* muxer, const void* data, size_t bytes, uint32_t pts, uint32_t dts); + +/// @param[in] data mp3 stream +int flv_muxer_mp3(flv_muxer_t* muxer, const void* data, size_t bytes, uint32_t pts, uint32_t dts); + +/// g711 alaw/mu-law +int flv_muxer_g711a(flv_muxer_t* muxer, const void* data, size_t bytes, uint32_t pts, uint32_t dts); +int flv_muxer_g711u(flv_muxer_t* muxer, const void* data, size_t bytes, uint32_t pts, uint32_t dts); + +/// @param[in] data opus stream, first opus head, then opus samples +int flv_muxer_opus(flv_muxer_t* muxer, const void* data, size_t bytes, uint32_t pts, uint32_t dts); + +/// @param[in] data h.264 annexb bitstream: H.264 start code + H.264 NALU, 0x0000000168... +int flv_muxer_avc(flv_muxer_t* muxer, const void* data, size_t bytes, uint32_t pts, uint32_t dts); + +/// @param[in] data h.265 annexb bitstream: H.265 start code + H.265 NALU, 0x00000001... +int flv_muxer_hevc(flv_muxer_t* muxer, const void* data, size_t bytes, uint32_t pts, uint32_t dts); + +/// @param[in] data av1 low overhead bitstream format +int flv_muxer_av1(flv_muxer_t* muxer, const void* data, size_t bytes, uint32_t pts, uint32_t dts); + +struct flv_metadata_t +{ + int audiocodecid; + double audiodatarate; // kbps + int audiosamplerate; + int audiosamplesize; + int stereo; + + int videocodecid; + double videodatarate; // kbps + double framerate; // fps + double duration; + int interval; // frame interval + int width; + int height; +}; + +int flv_muxer_metadata(flv_muxer_t* muxer, const struct flv_metadata_t* metadata); + +#if defined(__cplusplus) +} +#endif +#endif /* !_flv_muxer_h_ */ diff --git a/src/big/mpp/middleware/src/mp4_format/src/libflv/include/flv-parser.h b/src/big/mpp/middleware/src/mp4_format/src/libflv/include/flv-parser.h new file mode 100644 index 000000000..413661cf7 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libflv/include/flv-parser.h @@ -0,0 +1,53 @@ +#ifndef _flv_parser_h_ +#define _flv_parser_h_ + +#include +#include +#include "flv-header.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +/// Audio/Video Elementary Stream +/// @param[in] param user-defined parameter +/// @param[in] codec audio/video format (see more flv-proto.h) +/// @param[in] data audio/video element data, AAC: AAC-Frame, H.264: MP4 Stream, MP3-Raw data +/// @param[in] bytes data length in byte +/// @param[in] pts audio/video presentation timestamp +/// @param[in] dts audio/video decoding timestamp +/// @param[in] flags 1-video keyframe, other-undefined +/// @return 0-ok, other-error +typedef int (*flv_parser_handler)(void* param, int codec, const void* data, size_t bytes, uint32_t pts, uint32_t dts, int flags); + +/// Input FLV Audio/Video Stream +/// @param[in] type 8-audio, 9-video, 18-script (see more flv-proto.h) +/// @param[in] data flv audio/video Stream, AudioTagHeader/VideoTagHeader + A/V Data +/// @param[in] bytes data length in byte +/// @param[in] timestamp milliseconds relative to the first tag(DTS) +/// @return 0-ok, other-error +int flv_parser_tag(int type, const void* data, size_t bytes, uint32_t timestamp, flv_parser_handler handler, void* param); + +struct flv_parser_t +{ + int state; + + size_t bytes; + size_t expect; + uint8_t ptr[32]; + struct flv_header_t header; + struct flv_tag_header_t tag; + struct flv_audio_tag_header_t audio; + struct flv_video_tag_header_t video; + + uint8_t* body; + void* (*alloc)(void* param, size_t bytes); + void (*free)(void* param, void* ptr); +}; + +int flv_parser_input(struct flv_parser_t* parser, const uint8_t* data, size_t bytes, flv_parser_handler handler, void* param); + +#if defined(__cplusplus) +} +#endif +#endif /* !_flv_parser_h_ */ diff --git a/src/big/mpp/middleware/src/mp4_format/src/libflv/include/flv-proto.h b/src/big/mpp/middleware/src/mp4_format/src/libflv/include/flv-proto.h new file mode 100644 index 000000000..acda45223 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libflv/include/flv-proto.h @@ -0,0 +1,75 @@ +#ifndef _flv_proto_h_ +#define _flv_proto_h_ + +// FLV Tag Type +#define FLV_TYPE_AUDIO 8 +#define FLV_TYPE_VIDEO 9 +#define FLV_TYPE_SCRIPT 18 + +// FLV Audio Type +#define FLV_AUDIO_LPCM (0 << 4) // Linear PCM, platform endian +#define FLV_AUDIO_ADPCM (1 << 4) +#define FLV_AUDIO_MP3 (2 << 4) +#define FLV_AUDIO_LLPCM (3 << 4) // Linear PCM, little endian +#define FLV_AUDIO_G711A (7 << 4) // G711 A-law +#define FLV_AUDIO_G711U (8 << 4) // G711 mu-law +#define FLV_AUDIO_AAC (10 << 4) +#define FLV_AUDIO_SPEEX (11 << 4) +#define FLV_AUDIO_OPUS (13 << 4) +#define FLV_AUDIO_MP3_8K (14 << 4) // MP3 8 kHz +#define FLV_AUDIO_DEVIDE (15 << 4) // Device-specific sound +#define FLV_AUDIO_ASC (0x1000 | FLV_AUDIO_AAC) // AudioSpecificConfig(ISO-14496-3) +#define FLV_AUDIO_OPUS_HEAD (0x1100 | FLV_AUDIO_OPUS)// opus-codec.org + +// FLV Video Type +#define FLV_VIDEO_H263 2 // Sorenson H.263 +#define FLV_VIDEO_SCREEN 3 // Screen video +#define FLV_VIDEO_VP6 4 // On2 VP6 +#define FLV_VIDEO_H264 7 // AVC +#define FLV_VIDEO_H265 12 // https://github.com/CDN-Union/H265 +#define FLV_VIDEO_AV1 13 // https://aomediacodec.github.io/av1-isobmff +#define FLV_VIDEO_H266 14 +#define FLV_VIDEO_AVCC (0x2000 | FLV_VIDEO_H264) // AVCDecoderConfigurationRecord(ISO-14496-15) +#define FLV_VIDEO_HVCC (0x2100 | FLV_VIDEO_H265) // HEVCDecoderConfigurationRecord(ISO-14496-15) +#define FLV_VIDEO_AV1C (0x2200 | FLV_VIDEO_AV1) // AV1CodecConfigurationRecord(av1-isobmff) +#define FLV_VIDEO_VVCC (0x2300 | FLV_VIDEO_H266) // VVCDecoderConfigurationRecord(ISO-14496-15) + +#define FLV_SCRIPT_METADATA 0x4000 // onMetaData + +enum +{ + FLV_SEQUENCE_HEADER = 0, // AVC/AAC sequence header + FLV_AVPACKET = 1, // AVC NALU / AAC raw + FLV_END_OF_SEQUENCE = 2, // AVC end of sequence (lower level NALU sequence ender is not required or supported) +}; + +enum +{ + FLV_VIDEO_KEY_FRAME = 1, // key frame (for AVC, a seekable frame) + FLV_VIDEO_INTER_FRAME = 2, // inter frame (for AVC, a non-seekable frame) + FLV_VIDEO_DISPOSABLE_INTER_FRAME = 3, // H.263 only + FLV_VIDEO_GENERATED_KEY_FRAME = 4, // generated key frame (reserved for server use only) + FLV_VIDEO_COMMAND_FRAME = 5, // video info/command frame +}; + +enum +{ + FLV_SOUND_RATE_5500 = 0, // 5.5 kHz + FLV_SOUND_RATE_11025 = 1, // 11 kHz + FLV_SOUND_RATE_22050 = 2, // 22 kHz + FLV_SOUND_RATE_44100 = 3, // 44 kHz +}; + +enum +{ + FLV_SOUND_BIT_8 = 0, // 8-bit samples + FLV_SOUND_BIT_16 = 1, // 16-bit samples +}; + +enum +{ + FLV_SOUND_CHANNEL_MONO = 0, // 1-channel + FLV_SOUND_CHANNEL_STEREO = 1, // 2-channels +}; + +#endif /* !_flv_proto_h_ */ diff --git a/src/big/mpp/middleware/src/mp4_format/src/libflv/include/flv-reader.h b/src/big/mpp/middleware/src/mp4_format/src/libflv/include/flv-reader.h new file mode 100644 index 000000000..69f9c61a4 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libflv/include/flv-reader.h @@ -0,0 +1,26 @@ +#ifndef _flv_reader_h_ +#define _flv_reader_h_ + +#include +#include + +#if defined(__cplusplus) +extern "C" { +#endif + +void* flv_reader_create(const char* file); +void* flv_reader_create2(int(*read)(void* param, void* buf, int len), void* param); +void flv_reader_destroy(void* flv); + +///@param[out] tagtype 8-audio, 9-video, 18-script data +///@param[out] timestamp FLV timestamp +///@param[out] taglen flv tag length(0 is ok but should be silently discard) +///@param[out] buffer FLV stream +///@param[in] bytes buffer size +///@return 1-got a packet, 0-EOF, other-error +int flv_reader_read(void* flv, int* tagtype, uint32_t* timestamp, size_t* taglen, void* buffer, size_t bytes); + +#if defined(__cplusplus) +} +#endif +#endif /* !_flv_reader_h_ */ diff --git a/src/big/mpp/middleware/src/mp4_format/src/libflv/include/flv-writer.h b/src/big/mpp/middleware/src/mp4_format/src/libflv/include/flv-writer.h new file mode 100644 index 000000000..90f54a8c5 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libflv/include/flv-writer.h @@ -0,0 +1,41 @@ +#ifndef _flv_writer_h_ +#define _flv_writer_h_ + +#include +#include + +#if defined(__cplusplus) +extern "C" { +#endif + +struct flv_vec_t +{ + void* ptr; + int len; +}; + +/// @param[in] param flv_writer_create2 param +/// @param[in] n vec number +/// @return 0-ok, other-error +typedef int (*flv_writer_onwrite)(void* param, const struct flv_vec_t* vec, int n); + +void* flv_writer_create(const char* file); +/// @param[in] audio 1-has audio, 0-don't has audio +/// @param[in] video 1-has video, 0-don't has video +void* flv_writer_create2(int audio, int video, flv_writer_onwrite onwrite, void* param); + +void flv_writer_destroy(void* flv); + +/// Video: FLV VideoTagHeader + AVCVIDEOPACKET: AVCDecoderConfigurationRecord(ISO 14496-15) / One or more NALUs(four-bytes length + NALU) +/// Audio: FLV AudioTagHeader + AACAUDIODATA: AudioSpecificConfig(14496-3) / Raw AAC frame data in UI8 +/// @param[in] data FLV Audio/Video Data(don't include FLV Tag Header) +/// @param[in] type 8-audio, 9-video +/// @return 0-ok, other-error +int flv_writer_input(void* flv, int type, const void* data, size_t bytes, uint32_t timestamp); + +int flv_writer_input_v(void* flv, int type, const struct flv_vec_t* vec, int num, uint32_t timestamp); + +#if defined(__cplusplus) +} +#endif +#endif /* !_flv_writer_h_ */ diff --git a/src/big/mpp/middleware/src/mp4_format/src/libflv/include/mp3-header.h b/src/big/mpp/middleware/src/mp4_format/src/libflv/include/mp3-header.h new file mode 100644 index 000000000..0c3bb90a9 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libflv/include/mp3-header.h @@ -0,0 +1,109 @@ +#ifndef _mp3_header_h_ +#define _mp3_header_h_ + +// https://en.wikipedia.org/wiki/MP3 + +#if defined(__cplusplus) +extern "C" { +#endif + +/* +ISO/IEC 11172-3 +2.4.1.3 Header +unsigned int sync: 12 +unsigned int version: 1 +unsigned int layer: 2 +unsigned int error protection: 1 +unsigned int bitrate_index: 4 +unsigned int sampling_frequency: 2 +unsigned int padding: 1 +unsigned int private: 1 +unsigned int mode: 2 +unsigned int mode extension: 2 +unsigned int copyright: 1 +unsigned int original: 1 +unsigned int emphasis: 2 + +bit_rate_index Layer I Layer II Layer III + '0000' free format free format free format + '0001' 32 kbit/s 32 kbit/s 32 kbit/s + '0010' 64 kbit/s 48 kbit/s 40 kbit/s + '0011' 96 kbit/s 56 kbit/s 48 kbit/s + '0100' 128 kbit/s 64 kbit/s 56 kbit/s + '0101' 160 kbit/s 80 kbit/s 64 kbit/s + '0110' 192 kbit/s 96 kbit/s 80 kbit/s + '0111' 224 kbit/s 112 kbit/s 96 kbit/s + '1000' 256 kbit/s 128 kbit/s 112 kbit/s + '1001' 288 kbit/s 160 kbit/s 128 kbit/s + '1010' 320 kbit/s 192 kbit/s 160 kbit/s + '1011' 352 kbit/s 224 kbit/s 192 kbit/s + '1100' 384 kbit/s 256 kbit/s 224 kbit/s + '1101' 416 kbit/s 320 kbit/s 256 kbit/s + '1110' 448 kbit/s 384 kbit/s 320 kbit/s + +sampling_frequency +'00' 44.1 kHz +'01' 48 kHz +'10' 32 kHz +'11' reserved + +mode +'00' stereo +'01' joint_stereo (intensity_stereo and/or ms_stereo) +'10' dual_channel +'11' single_channel + +mode_extension +'00' subbands 4-31 in intensity_stereo, bound==4 +'01' subbands 8-31 in intensity_stereo, bound==8 +'10' subbands 12-31 in intensity_stereo, bound==12 +'11' subbands 16-31 in intensity_stereo, bound==16 + +emphasis +'00' no emphasis +'01' 50/15 microsec. emphasis +'10' reserved +'11' CCITT J.17 +*/ + +struct mp3_header_t +{ + unsigned int version : 2; // 0-MPEG 2.5, 1-undefined, 2-MPEG-2, 3-MPEG-1 + unsigned int layer : 2; // 3-Layer I, 2-Layer II, 1-Layer III, 0-reserved + unsigned int protection : 1; + unsigned int bitrate_index : 4; //0-free, + unsigned int sampling_frequency : 2; + unsigned int priviate : 1; + unsigned int mode : 2; + unsigned int mode_extension : 2; + unsigned int copyright : 1; + unsigned int original : 1; + unsigned int emphasis : 2; +}; + +// version +#define MP3_MPEG1 3 +#define MP3_MPEG2 2 +#define MP3_MPEG2_5 0 + +// layer +#define MP3_LAYER1 3 +#define MP3_LAYER2 2 +#define MP3_LAYER3 1 + +#define MP3_BITS_PER_SAMPLE 16 + +///MP3 Header size: 4 +int mp3_header_load(struct mp3_header_t* mp3, const void* data, int bytes); +int mp3_header_save(const struct mp3_header_t* mp3, void* data, int bytes); + +int mp3_get_channel(const struct mp3_header_t* mp3); +int mp3_get_bitrate(const struct mp3_header_t* mp3); +int mp3_set_bitrate(struct mp3_header_t* mp3, int bitrate); +int mp3_get_frequency(const struct mp3_header_t* mp3); +int mp3_set_frequency(struct mp3_header_t* mp3, int frequency); + +#if defined(__cplusplus) +} +#endif +#endif /* !_mp3_header_h_ */ diff --git a/src/big/mpp/middleware/src/mp4_format/src/libflv/include/mpeg4-aac.h b/src/big/mpp/middleware/src/mp4_format/src/libflv/include/mpeg4-aac.h new file mode 100644 index 000000000..7bed7d12e --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libflv/include/mpeg4-aac.h @@ -0,0 +1,151 @@ +#ifndef _mpeg4_aac_h_ +#define _mpeg4_aac_h_ + +#include +#include + +#if defined(__cplusplus) +extern "C" { +#endif + +struct mpeg4_aac_t +{ + uint8_t profile; // 0-NULL, 1-AAC Main, 2-AAC LC, 2-AAC SSR, 3-AAC LTP + uint8_t sampling_frequency_index; // 0-96000, 1-88200, 2-64000, 3-48000, 4-44100, 5-32000, 6-24000, 7-22050, 8-16000, 9-12000, 10-11025, 11-8000, 12-7350, 13/14-reserved, 15-frequency is written explictly + uint8_t channel_configuration; // 0-AOT, 1-1channel,front-center, 2-2channels, front-left/right, 3-3channels: front center/left/right, 4-4channels: front-center/left/right, back-center, 5-5channels: front center/left/right, back-left/right, 6-6channels: front center/left/right, back left/right LFE-channel, 7-8channels + + uint32_t extension_frequency; // play frequency(AAC-HE v1/v2 sbr/ps) + uint32_t sampling_frequency; // codec frequency, valid only in decode + uint8_t channels; // valid only in decode + int sbr; // sbr flag, valid only in decode + int ps; // ps flag, valid only in decode + uint8_t pce[64]; + int npce; // pce bytes +}; + +enum mpeg2_aac_profile +{ + MPEG2_AAC_MAIN = 0, + MPEG2_AAC_LC, + MPEG2_AAC_SSR, +}; + +// ISO/IEC 14496-3:2009(E) Table 1.3 - Audio Profiles definition (p41) +// https://en.wikipedia.org/wiki/MPEG-4_Part_3#Audio_Profiles +enum mpeg4_aac_object_type +{ + MPEG4_AAC_MAIN = 1, + MPEG4_AAC_LC, + MPEG4_AAC_SSR, + MPEG4_AAC_LTP, + MPEG4_AAC_SBR, // (used with AAC LC in the "High Efficiency AAC Profile" (HE-AAC v1)) + MPEG4_AAC_SCALABLE, + MPEG4_AAC_TWINVQ, + MPEG4_AAC_CELP, + MPEG4_AAC_HVXC, + MPEG4_AAC_TTSI = 12, + MPEG4_AAC_MAIN_SYNTHETIC, + MPEG4_AAC_WAVETABLE_SYNTHETIC, + MPEG4_AAC_GENERAL_MIDI, + MPEG4_AAC_ALGORITHMIC_SYNTHESIS, // Algorithmic Synthesis and Audio FX object type + MPEG4_AAC_ER_LC, // Error Resilient (ER) AAC Low Complexity (LC) object type + MPEG4_AAC_ER_LTP = 19, // Error Resilient (ER) AAC Long Term Predictor (LTP) object type + MPEG4_AAC_ER_SCALABLE, // Error Resilient (ER) AAC scalable object type + MPEG4_AAC_ER_TWINVQ, // Error Resilient (ER) TwinVQ object type + MPEG4_AAC_ER_BSAC, // Error Resilient (ER) BSAC object type + MPEG4_AAC_ER_AAC_LD, // Error Resilient (ER) AAC LD object type(used with CELP, ER CELP, HVXC, ER HVXC and TTSI in the "Low Delay Profile") + MPEG4_AAC_ER_CELP, // Error Resilient (ER) CELP object type + MPEG4_AAC_ER_HVXC, // Error Resilient (ER) HVXC object type + MPEG4_AAC_ER_HILN, // Error Resilient (ER) HILN object type + MPEG4_AAC_ER_PARAMTRIC, // Error Resilient (ER) Parametric object type + MPEG4_AAC_SSC, // SSC Audio object type + MPEG4_AAC_PS, // PS object type(used with AAC LC and SBR in the "HE-AAC v2 Profile") + MPEG4_AAC_MPEG_SURROUND, // MPEG Surround object type + MPEG4_AAC_LAYER_1 = 32, // Layer-1 Audio object type + MPEG4_AAC_LAYER_2, // Layer-2 Audio object type + MPEG4_AAC_LAYER_3, // Layer-3 Audio object type + MPEG4_AAC_DST, + MPEG4_AAC_ALS, // ALS Audio object type + MPEG4_AAC_SLS, // SLS Audio object type + MPEG4_AAC_SLS_NON_CORE, // SLS Non-Core Audio object type + MPEG4_AAC_ER_AAC_ELD, // Error Resilient (ER) AAC ELD object type (uses AAC-LD, AAC-ELD and AAC-ELDv2, "Low Delay AAC v2") + MPEG4_AAC_SMR_SIMPLE, // SMR Simple object type: MPEG-4 Part 23 standard (ISO/IEC 14496-23:2008) + MPEG4_AAC_SMR_MAIN, // SMR Main object type + MPEG4_AAC_USAC_NO_SBR, // Unified Speech and Audio Coding (no SBR) + MPEG4_AAC_SAOC, // Spatial Audio Object Coding: MPEG-D Part 2 standard (ISO/IEC 23003-2:2010) + MPEG4_AAC_LD_MEPG_SURROUND, // MPEG-D Part 2 - ISO/IEC 23003-2 + MPEG4_AAC_USAC, // MPEG-D Part 3 - ISO/IEC 23003-3 +}; + +enum mpeg4_audio_profile +{ + MPEG4_AAC_PROFILE, // AAC LC + MPEG4_HIGH_EFFICIENCY_AAC_PROFILE, // AAC LC, SBR (<=128 kbps) + MPEG4_HE_AAC_V2_PROFILE, // AAC LC, SBR, PS (approx. 16 - 48 kbit/s) + MPEG4_MAIN_AUDIO_PROFILE, // AAC Main, AAC LC, AAC SSR, AAC LTP, AAC Scalable, TwinVQ, CELP, HVXC, TTSI, Main synthesis + MPEG4_SCALABLE_AUDIO_PROFILE, // AAC LC, AAC LTP, AAC Scalable, TwinVQ, CELP, HVXC, TTSI + MPEG4_SPEECH_AUDIO_PROFILE, // CELP, HVXC, TTSI + MPEG4_SYNTHETIC_AUDIO_PRIFILE, // TTSI, Main synthesis + MPEG4_HIGH_QUALITY_AUDIO_PROFILE, // AAC LC, AAC LTP, AAC Scalable, CELP, ER AAC LC, ER AAC LTP, ER AAC Scalable, ER CELP + MPEG4_LOW_DELAY_AUDIO_PROFILE, // CELP, HVXC, TTSI, ER AAC LD, ER CELP, ER HVXC + MPEG4_NATURAL_AUDIO_PRIFILE, // AAC Main, AAC LC, AAC SSR, AAC LTP, AAC Scalable, TwinVQ, CELP, HVXC, TTSI, ER AAC LC, ER AAC LTP, ER AAC Scalable, ER TwinVQ, ER BSAC, ER AAC LD, ER CELP, ER HVXC, ER HILN, ER Parametric + MPEG4_MOBILE_AUDIO_INTERNETWORKING_PROFILE, // ER AAC LC, ER AAC Scalable, ER TwinVQ, ER BSAC, ER AAC LD + MPEG4_HD_AAC_PROFILE, // AAC LC, SLS + MPEG4_ALS_SIMPLE_PROFILE, // ALS +}; + +enum mpeg4_aac_frequency +{ + MPEG4_AAC_96000 = 0, + MPEG4_AAC_88200, // 0x1 + MPEG4_AAC_64000, // 0x2 + MPEG4_AAC_48000, // 0x3 + MPEG4_AAC_44100, // 0x4 + MPEG4_AAC_32000, // 0x5 + MPEG4_AAC_24000, // 0x6 + MPEG4_AAC_22050, // 0x7 + MPEG4_AAC_16000, // 0x8 + MPEG4_AAC_12000, // 0x9 + MPEG4_AAC_11025, // 0xa + MPEG4_AAC_8000, // 0xb + MPEG4_AAC_7350, // 0xc + // reserved + // reserved + // escape value + +}; + +/// @return >=0-adts header length, <0-error +int mpeg4_aac_adts_save(const struct mpeg4_aac_t* aac, size_t payload, uint8_t* data, size_t bytes); +/// @return >=0-adts header length, <0-error +int mpeg4_aac_adts_load(const uint8_t* data, size_t bytes, struct mpeg4_aac_t* aac); + +/// @return >=0-audio specific config length, <0-error +int mpeg4_aac_audio_specific_config_load(const uint8_t* data, size_t bytes, struct mpeg4_aac_t* aac); +/// @return >=0-audio specific config length, <0-error +int mpeg4_aac_audio_specific_config_save(const struct mpeg4_aac_t* aac, uint8_t* data, size_t bytes); + +/// @return >=0-stream mux config length, <0-error +int mpeg4_aac_stream_mux_config_load(const uint8_t* data, size_t bytes, struct mpeg4_aac_t* aac); +/// @return >=0-stream mux config length, <0-error +int mpeg4_aac_stream_mux_config_save(const struct mpeg4_aac_t* aac, uint8_t* data, size_t bytes); + +/// get AAC profile level indication value +int mpeg4_aac_profile_level(const struct mpeg4_aac_t* aac); + +/// MPEG4_AAC_96000 => 96000 +/// @return -1-error, other-frequency value +int mpeg4_aac_audio_frequency_to(enum mpeg4_aac_frequency index); +/// 96000 => MPEG4_AAC_96000 +/// @return -1-error, other-frequency index +int mpeg4_aac_audio_frequency_from(int frequency); + +/// @return aac channel count +uint8_t mpeg4_aac_channel_count(uint8_t channel_configuration); + +int mpeg4_aac_adts_frame_length(const uint8_t* data, size_t bytes); + +#if defined(__cplusplus) +} +#endif +#endif /* !_mpeg4_aac_h_ */ diff --git a/src/big/mpp/middleware/src/mp4_format/src/libflv/include/mpeg4-avc.h b/src/big/mpp/middleware/src/mp4_format/src/libflv/include/mpeg4-avc.h new file mode 100644 index 000000000..939eb89e6 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libflv/include/mpeg4-avc.h @@ -0,0 +1,76 @@ +#ifndef _mpeg4_avc_h_ +#define _mpeg4_avc_h_ + +#include +#include + +#if defined(__cplusplus) +extern "C" { +#endif + +struct mpeg4_avc_t +{ +// uint8_t version; // 1-only + uint8_t profile; + uint8_t compatibility; // constraint_set[0-5]_flag + uint8_t level; + uint8_t nalu; // NALUnitLength = (lengthSizeMinusOne + 1), default 4(0x03+1) + + uint8_t nb_sps; + uint8_t nb_pps; + + struct mpeg4_avc_sps_t + { + uint16_t bytes; + uint8_t* data; + } sps[32]; // [0-31] + + struct mpeg4_avc_pps_t + { + uint16_t bytes; + uint8_t* data; + } pps[256]; + + // extension + uint8_t chroma_format_idc; + uint8_t bit_depth_luma_minus8; + uint8_t bit_depth_chroma_minus8; + + uint8_t data[4 * 1024]; + size_t off; +}; + +// load avc from AVCDecoderConfigurationRecord +int mpeg4_avc_decoder_configuration_record_load(const uint8_t* data, size_t bytes, struct mpeg4_avc_t* avc); + +int mpeg4_avc_decoder_configuration_record_save(const struct mpeg4_avc_t* avc, uint8_t* data, size_t bytes); + +// load avc from annex-b bitstream +int mpeg4_avc_from_nalu(const uint8_t* data, size_t bytes, struct mpeg4_avc_t* avc); + +int mpeg4_avc_to_nalu(const struct mpeg4_avc_t* avc, uint8_t* data, size_t bytes); + +int mpeg4_avc_codecs(const struct mpeg4_avc_t* avc, char* codecs, size_t bytes); + +/// @param[out] vcl 0-non VCL, 1-IDR, 2-P/B +/// @return <=0-error, >0-output bytes +int h264_annexbtomp4(struct mpeg4_avc_t* avc, const void* data, size_t bytes, void* out, size_t size, int* vcl, int* update); + +/// @return <=0-error, >0-output bytes +int h264_mp4toannexb(const struct mpeg4_avc_t* avc, const void* data, size_t bytes, void* out, size_t size); + +/// h264_is_new_access_unit H.264 new access unit(frame) +/// @return 1-new access, 0-not a new access +int h264_is_new_access_unit(const uint8_t* nalu, size_t bytes); + +/// H.264 nal unit split +int mpeg4_h264_annexb_nalu(const void* h264, size_t bytes, void (*handler)(void* param, const uint8_t* nalu, size_t bytes), void* param); + +/// Detect H.264 bitstrem type: H.264 Annexb or MP4-AVCC +/// @return 0-annexb, >0-avcc length, <0-error +int mpeg4_h264_bitstream_format(const uint8_t* h264, size_t bytes); + +#if defined(__cplusplus) +} +#endif +#endif /* !_mpeg4_avc_h_ */ diff --git a/src/big/mpp/middleware/src/mp4_format/src/libflv/include/mpeg4-bits.h b/src/big/mpp/middleware/src/mp4_format/src/libflv/include/mpeg4-bits.h new file mode 100644 index 000000000..4c5343d9e --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libflv/include/mpeg4-bits.h @@ -0,0 +1,201 @@ +#ifndef _mpeg4_bits_h_ +#define _mpeg4_bits_h_ + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct mpeg4_bits_t +{ + uint8_t* data; + size_t size; + size_t bits; // offset bit + int error; +}; + +#define mpeg4_bits_read_uint8(bits, n) (uint8_t)mpeg4_bits_read_n(bits, n) +#define mpeg4_bits_read_uint16(bits, n) (uint16_t)mpeg4_bits_read_n(bits, n) +#define mpeg4_bits_read_uint32(bits, n) (uint32_t)mpeg4_bits_read_n(bits, n) +#define mpeg4_bits_read_uint64(bits, n) (uint64_t)mpeg4_bits_read_n(bits, n) +#define mpeg4_bits_write_uint8(bits, v, n) mpeg4_bits_write_n(bits, (uint64_t)v, n) +#define mpeg4_bits_write_uint16(bits, v, n) mpeg4_bits_write_n(bits, (uint64_t)v, n) +#define mpeg4_bits_write_uint32(bits, v, n) mpeg4_bits_write_n(bits, (uint64_t)v, n) +#define mpeg4_bits_write_uint64(bits, v, n) mpeg4_bits_write_n(bits, (uint64_t)v, n) + +static inline void mpeg4_bits_init(struct mpeg4_bits_t* bits, void* data, size_t size) +{ + bits->data = (uint8_t*)data; + bits->size = size; + bits->bits = 0; + bits->error = 0; +} + +/// @return 1-error, 0-no error +static inline int mpeg4_bits_error(struct mpeg4_bits_t* bits) +{ + //return bits->bits >= bits->size * 8 ? 1 : 0; + return bits->error; +} + +static inline void mpeg4_bits_aligment(struct mpeg4_bits_t* bits, int n) +{ + bits->bits = (bits->bits + n - 1) / n * n; +} + +static inline size_t mpeg4_bits_remain(struct mpeg4_bits_t* bits) +{ + return bits->error ? 0 : (bits->size * 8 - bits->bits); +} + +static inline void mpeg4_bits_skip(struct mpeg4_bits_t* bits, size_t n) +{ + bits->bits += n; + if (bits->bits > bits->size * 8) + { + bits->error = -1; + } +} + +/// read 1-bit from bit stream(offset position) +/// @param[in] bits bit stream +/// @return -1-error, 1-value, 0-value +static inline int mpeg4_bits_read(struct mpeg4_bits_t* bits) +{ + uint8_t bit; + assert(bits && bits->data && bits->size > 0); + if (bits->bits >= bits->size * 8) + { + bits->error = -1; + return 0; // throw exception + } + + bit = bits->data[bits->bits/8] & (0x80U >> (bits->bits%8)); + bits->bits += 1; // update offset + return bit ? 1 : 0; +} + +/// read n-bit(n <= 64) from bit stream(offset position) +/// @param[in] bits bit stream +/// @return -1-error, other-value +static inline uint64_t mpeg4_bits_read_n(struct mpeg4_bits_t* bits, int n) +{ + int m; + size_t i; + uint64_t v; + + assert(n > 0 && n <= 64); + assert(bits && bits->data && bits->size > 0); + if (bits->bits + n > bits->size * 8 || n > 64 || n < 0) + { + bits->error = -1; + return 0; // throw exception + } + + m = n; + v = bits->data[bits->bits / 8] & (0xFFU >> (bits->bits%8)); // remain valid value + if (n <= 8 - (int)(bits->bits % 8)) + { + v = v >> (8 - (bits->bits % 8) - n); // shift right value + bits->bits += n; + return v; + } + + n -= 8 - (int)(bits->bits % 8); + for (i = 1; n >= 8; i++) + { + assert(bits->bits / 8 + i < bits->size); + v <<= 8; + v += bits->data[bits->bits / 8 + i]; + n -= 8; + } + + if (n > 0) + { + v <<= n; + v += bits->data[bits->bits / 8 + i] >> (8 - n); + } + + bits->bits += m; + return v; +} + +// http://aomedia.org/av1/specification/conventions/#descriptors +static inline uint64_t mpeg4_bits_read_uvlc(struct mpeg4_bits_t* bits) +{ + uint64_t value; + int leadingZeros; + for (leadingZeros = 0; !mpeg4_bits_read(bits); ++leadingZeros) + { + } + + if (leadingZeros >= 32) + return (1ULL << 32) - 1; + + value = mpeg4_bits_read_n(bits, leadingZeros); + return (1ULL << leadingZeros) - 1 + value; +} + +static inline uint64_t mpeg4_bits_read_latm(struct mpeg4_bits_t* bits) +{ + int len; + len = (int)mpeg4_bits_read_n(bits, 2); + return mpeg4_bits_read_n(bits, (len + 1) * 8); +} + +/// write 1-bit +/// @param[in] v write 0 if v value 0, other, write 1 +static inline int mpeg4_bits_write(struct mpeg4_bits_t* bits, int v) +{ + assert(bits && bits->data && bits->size > 0); + if (bits->bits >= bits->size * 8) + { + bits->error = -1; + return -1; // throw exception + } + + if(v) + bits->data[bits->bits / 8] |= (0x80U >> (bits->bits % 8)); + bits->bits += 1; // update offset + return 0; +} + +static inline int mpeg4_bits_write_n(struct mpeg4_bits_t* bits, uint64_t v, int n) +{ + int m; + size_t i; + + assert(n > 0 && n <= 64); + assert(bits && bits->data && bits->size > 0); + if (bits->bits + n > bits->size * 8 || n > 64 || n < 0) + { + bits->error = -1; + return -1; // throw exception + } + + m = n; + v = v << (64 - n); // left shift to first bit + + bits->data[bits->bits / 8] |= v >> (56 + (bits->bits % 8)); // remain valid value + v <<= 8 - (bits->bits % 8); + n -= 8 - (int)(bits->bits % 8); + + for (i = 1; n > 0; i++) + { + assert(bits->bits / 8 + i < bits->size); + bits->data[bits->bits / 8 + i] = (uint8_t)(v >> 56); + v <<= 8; + n -= 8; + } + + bits->bits += m; + return 0; +} + +#ifdef __cplusplus +} +#endif +#endif /* !_mpeg4_bits_h_ */ diff --git a/src/big/mpp/middleware/src/mp4_format/src/libflv/include/mpeg4-hevc.h b/src/big/mpp/middleware/src/mp4_format/src/libflv/include/mpeg4-hevc.h new file mode 100644 index 000000000..f95e4d620 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libflv/include/mpeg4-hevc.h @@ -0,0 +1,68 @@ +#ifndef _mpeg4_hevc_h_ +#define _mpeg4_hevc_h_ + +#include +#include + +#if defined(__cplusplus) +extern "C" { +#endif + +struct mpeg4_hevc_t +{ + uint8_t configurationVersion; // 1-only + uint8_t general_profile_space; // 2bit,[0,3] + uint8_t general_tier_flag; // 1bit,[0,1] + uint8_t general_profile_idc; // 5bit,[0,31] + uint32_t general_profile_compatibility_flags; + uint64_t general_constraint_indicator_flags; + uint8_t general_level_idc; + uint16_t min_spatial_segmentation_idc; + uint8_t parallelismType; // 2bit,[0,3] + uint8_t chromaFormat; // 2bit,[0,3] + uint8_t bitDepthLumaMinus8; // 3bit,[0,7] + uint8_t bitDepthChromaMinus8; // 3bit,[0,7] + uint16_t avgFrameRate; + uint8_t constantFrameRate; // 2bit,[0,3] + uint8_t numTemporalLayers; // 3bit,[0,7] + uint8_t temporalIdNested; // 1bit,[0,1] + uint8_t lengthSizeMinusOne; // 2bit,[0,3] + + uint8_t numOfArrays; + struct + { + uint8_t array_completeness; + uint8_t type; // nalu type + uint16_t bytes; + uint8_t* data; + } nalu[64]; + + uint8_t array_completeness; + uint8_t data[4 * 1024]; + size_t off; +}; + +// load hevc from HEVCDecoderConfigurationRecord +int mpeg4_hevc_decoder_configuration_record_load(const uint8_t* data, size_t bytes, struct mpeg4_hevc_t* hevc); + +int mpeg4_hevc_decoder_configuration_record_save(const struct mpeg4_hevc_t* hevc, uint8_t* data, size_t bytes); + +// load hevc from annex-b bitstream +int mpeg4_hevc_from_nalu(const uint8_t* data, size_t bytes, struct mpeg4_hevc_t* hevc); + +int mpeg4_hevc_to_nalu(const struct mpeg4_hevc_t* hevc, uint8_t* data, size_t bytes); + +int mpeg4_hevc_codecs(const struct mpeg4_hevc_t* hevc, char* codecs, size_t bytes); + +int h265_annexbtomp4(struct mpeg4_hevc_t* hevc, const void* data, size_t bytes, void* out, size_t size, int *vcl, int* update); + +int h265_mp4toannexb(const struct mpeg4_hevc_t* hevc, const void* data, size_t bytes, void* out, size_t size); + +/// h265_is_new_access_unit H.265 new access unit(frame) +/// @return 1-new access, 0-not a new access +int h265_is_new_access_unit(const uint8_t* nalu, size_t bytes); + +#if defined(__cplusplus) +} +#endif +#endif /* !_mpeg4_hevc_h_ */ diff --git a/src/big/mpp/middleware/src/mp4_format/src/libflv/include/mpeg4-vvc.h b/src/big/mpp/middleware/src/mp4_format/src/libflv/include/mpeg4-vvc.h new file mode 100644 index 000000000..d025df63d --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libflv/include/mpeg4-vvc.h @@ -0,0 +1,73 @@ +#ifndef _mpeg_vvc_h +#define _mpeg_vvc_h + +#include +#include + +#if defined(__cplusplus) +extern "C" { +#endif + +struct mpeg4_vvc_t +{ + uint32_t lengthSizeMinusOne : 2; // 2bit,[0,3] + uint32_t ptl_present_flag : 1; + + // valid on ptl_present_flag + uint32_t ols_idx : 9; + uint32_t num_sublayers : 3; + uint32_t constant_frame_rate : 2; + uint32_t chroma_format_idc : 2; + uint32_t bit_depth_minus8 : 2; + uint16_t max_picture_width; + uint16_t max_picture_height; + uint16_t avg_frame_rate; + struct + { + uint32_t num_bytes_constraint_info : 6; + uint32_t general_profile_idc : 7; + uint32_t general_tier_flag : 1; + uint32_t general_level_idc : 8; + uint32_t ptl_frame_only_constraint_flag : 1; + uint32_t ptl_multi_layer_enabled_flag : 1; + uint32_t ptl_sublayer_level_present_flag : 8; + uint8_t general_constraint_info[64]; + uint8_t sublayer_level_idc[8 - 2]; + uint8_t ptl_num_sub_profiles; + uint32_t *general_sub_profile_idc; // --> data + } native_ptl; + + uint8_t numOfArrays; + struct + { + uint8_t array_completeness; + uint8_t type; // nalu type + uint16_t bytes; + uint8_t* data; + } nalu[64]; + + uint8_t array_completeness; + uint8_t data[4 * 1024]; + size_t off; +}; + +int mpeg4_vvc_decoder_configuration_record_load(const uint8_t* data, size_t bytes, struct mpeg4_vvc_t* vvc); + +int mpeg4_vvc_decoder_configuration_record_save(const struct mpeg4_vvc_t* vvc, uint8_t* data, size_t bytes); + +int mpeg4_vvc_to_nalu(const struct mpeg4_vvc_t* vvc, uint8_t* data, size_t bytes); + +int mpeg4_vvc_codecs(const struct mpeg4_vvc_t* vvc, char* codecs, size_t bytes); + +int h266_annexbtomp4(struct mpeg4_vvc_t* vvc, const void* data, size_t bytes, void* out, size_t size, int* vcl, int* update); + +int h266_mp4toannexb(const struct mpeg4_vvc_t* vvc, const void* data, size_t bytes, void* out, size_t size); + +/// h266_is_new_access_unit H.266 new access unit(frame) +/// @return 1-new access, 0-not a new access +int h266_is_new_access_unit(const uint8_t* nalu, size_t bytes); + +#if defined(__cplusplus) +} +#endif +#endif /* !_mpeg_vvc_h */ diff --git a/src/big/mpp/middleware/src/mp4_format/src/libflv/include/opus-head.h b/src/big/mpp/middleware/src/mp4_format/src/libflv/include/opus-head.h new file mode 100644 index 000000000..630ad5411 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libflv/include/opus-head.h @@ -0,0 +1,39 @@ +#ifndef _opus_head_h_ +#define _opus_head_h_ + +#include +#include + +#if defined(__cplusplus) +extern "C" { +#endif + +struct opus_head_t +{ + uint8_t version; + uint8_t channels; + uint16_t pre_skip; + uint32_t input_sample_rate; + int16_t output_gain; + uint8_t channel_mapping_family; + uint8_t stream_count; + uint8_t coupled_count; + uint8_t channel_mapping[8]; +}; + +/// @return >0-ok, <=0-error +int opus_head_save(const struct opus_head_t* opus, uint8_t* data, size_t bytes); +/// @return >0-ok, <=0-error +int opus_head_load(const uint8_t* data, size_t bytes, struct opus_head_t* opus); + +static inline int opus_head_channels(const struct opus_head_t* opus) +{ + return 0 == opus->channels ? 2 : opus->channels; +} + +int opus_packet_getframes(const void* data, size_t len, int (*onframe)(uint8_t toc, const void* frame, size_t size), void* param); + +#if defined(__cplusplus) +} +#endif +#endif /* !_opus_head_h_ */ diff --git a/src/big/mpp/middleware/src/mp4_format/src/libflv/include/riff-acm.h b/src/big/mpp/middleware/src/mp4_format/src/libflv/include/riff-acm.h new file mode 100644 index 000000000..5e1b28265 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libflv/include/riff-acm.h @@ -0,0 +1,43 @@ +#ifndef _riff_acm_h_ +#define _riff_acm_h_ + +#include +#include + +#ifndef WAVE_FORMAT_PCM +#define WAVE_FORMAT_PCM 1 +#define WAVE_FORMAT_ADPCM 2 +#define WAVE_FORMAT_ALAW 6 +#define WAVE_FORMAT_MULAW 7 +#endif + +#if defined(__cplusplus) +extern "C" { +#endif + +#pragma pack(push) +#pragma pack(1) +struct wave_format_t +{ + uint16_t wFormatTag; + uint16_t nChannels; + uint32_t nSamplesPerSec; + uint32_t nAvgBytesPerSec; + uint16_t nBlockAlign; + uint16_t wBitsPerSample; + uint16_t cbSize; + + // WAVEFORMATEXTENSIBLE(only cbSize > 0) + uint16_t Samples; + uint32_t dwChannelMask; + uint8_t SubFormat[16]; +}; +#pragma pack(pop) + +int wave_format_load(const uint8_t* data, int bytes, struct wave_format_t* wav); +int wave_format_save(const struct wave_format_t* wav, uint8_t* data, int bytes); + +#if defined(__cplusplus) +} +#endif +#endif /* !_riff_acm_h_ */ diff --git a/src/big/mpp/middleware/src/mp4_format/src/libflv/include/webm-vpx.h b/src/big/mpp/middleware/src/mp4_format/src/libflv/include/webm-vpx.h new file mode 100644 index 000000000..680825718 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libflv/include/webm-vpx.h @@ -0,0 +1,35 @@ +#ifndef _webm_vpx_h_ +#define _webm_vpx_h_ + +#include +#include + +#if defined(__cplusplus) +extern "C" { +#endif + +// VP8/VP9/VP10 +struct webm_vpx_t +{ + uint8_t profile; + uint8_t level; + uint8_t bit_depth; + uint8_t chroma_subsampling; // 0-4:2:0 vertical, 1-4:2:0 colocated with luma (0,0), 2-4:2:2, 3-4:4:4 + uint8_t video_full_range_flag; // 0 = legal range (e.g. 16-235 for 8 bit sample depth); 1 = full range (e.g. 0-255 for 8-bit sample depth) + uint8_t colour_primaries; // ISO/IEC 23001-8:2016 + uint8_t transfer_characteristics; + uint8_t matrix_coefficients; + uint16_t codec_intialization_data_size; // must be 0 + uint8_t codec_intialization_data[1]; // not used for VP8 and VP9 +}; + +int webm_vpx_codec_configuration_record_load(const uint8_t* data, size_t bytes, struct webm_vpx_t* vpx); +int webm_vpx_codec_configuration_record_save(const struct webm_vpx_t* vpx, uint8_t* data, size_t bytes); + +int webm_vpx_codec_configuration_record_from_vp8(struct webm_vpx_t* vpx, int* width, int* height, const void* keyframe, size_t bytes); +int webm_vpx_codec_configuration_record_from_vp9(struct webm_vpx_t* vpx, int* width, int* height, const void* keyframe, size_t bytes); + +#if defined(__cplusplus) +} +#endif +#endif /* !_webm_vpx_h_ */ diff --git a/src/big/mpp/middleware/src/mp4_format/src/libflv/source/amf0.c b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/amf0.c new file mode 100644 index 000000000..333cc394b --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/amf0.c @@ -0,0 +1,591 @@ +#include "amf0.h" +#include +#include +#include +#include + +static double s_double = 1.0; // 3ff0 0000 0000 0000 + +static uint8_t* AMFWriteInt16(uint8_t* ptr, const uint8_t* end, uint16_t value) +{ + if (ptr + 2 > end) return NULL; + ptr[0] = value >> 8; + ptr[1] = value & 0xFF; + return ptr + 2; +} + +static uint8_t* AMFWriteInt32(uint8_t* ptr, const uint8_t* end, uint32_t value) +{ + if (ptr + 4 > end) return NULL; + ptr[0] = (uint8_t)(value >> 24); + ptr[1] = (uint8_t)(value >> 16); + ptr[2] = (uint8_t)(value >> 8); + ptr[3] = (uint8_t)(value & 0xFF); + return ptr + 4; +} + +static uint8_t* AMFWriteString16(uint8_t* ptr, const uint8_t* end, const char* string, size_t length) +{ + if (ptr + 2 + length > end) return NULL; + ptr = AMFWriteInt16(ptr, end, (uint16_t)length); + memcpy(ptr, string, length); + return ptr + length; +} + +static uint8_t* AMFWriteString32(uint8_t* ptr, const uint8_t* end, const char* string, size_t length) +{ + if (ptr + 4 + length > end) return NULL; + ptr = AMFWriteInt32(ptr, end, (uint32_t)length); + memcpy(ptr, string, length); + return ptr + length; +} + +uint8_t* AMFWriteNull(uint8_t* ptr, const uint8_t* end) +{ + if (!ptr || ptr + 1 > end) return NULL; + + *ptr++ = AMF_NULL; + return ptr; +} + +uint8_t* AMFWriteUndefined(uint8_t* ptr, const uint8_t* end) +{ + if (!ptr || ptr + 1 > end) return NULL; + + *ptr++ = AMF_UNDEFINED; + return ptr; +} + +uint8_t* AMFWriteObject(uint8_t* ptr, const uint8_t* end) +{ + if (!ptr || ptr + 1 > end) return NULL; + + *ptr++ = AMF_OBJECT; + return ptr; +} + +uint8_t* AMFWriteObjectEnd(uint8_t* ptr, const uint8_t* end) +{ + if (!ptr || ptr + 3 > end) return NULL; + + /* end of object - 0x00 0x00 0x09 */ + *ptr++ = 0; + *ptr++ = 0; + *ptr++ = AMF_OBJECT_END; + return ptr; +} + +uint8_t* AMFWriteTypedObject(uint8_t* ptr, const uint8_t* end) +{ + if (!ptr || ptr + 1 > end) return NULL; + + *ptr++ = AMF_TYPED_OBJECT; + return ptr; +} + +uint8_t* AMFWriteECMAArarry(uint8_t* ptr, const uint8_t* end) +{ + if (!ptr || ptr + 1 > end) return NULL; + + *ptr++ = AMF_ECMA_ARRAY; + return AMFWriteInt32(ptr, end, 0); // U32 associative-count +} + +uint8_t* AMFWriteBoolean(uint8_t* ptr, const uint8_t* end, uint8_t value) +{ + if (!ptr || ptr + 2 > end) return NULL; + + ptr[0] = AMF_BOOLEAN; + ptr[1] = 0 == value ? 0 : 1; + return ptr + 2; +} + +uint8_t* AMFWriteDouble(uint8_t* ptr, const uint8_t* end, double value) +{ + if (!ptr || ptr + 9 > end) return NULL; + + assert(8 == sizeof(double)); + *ptr++ = AMF_NUMBER; + + // Little-Endian + if (0x00 == *(char*)&s_double) + { + *ptr++ = ((uint8_t*)&value)[7]; + *ptr++ = ((uint8_t*)&value)[6]; + *ptr++ = ((uint8_t*)&value)[5]; + *ptr++ = ((uint8_t*)&value)[4]; + *ptr++ = ((uint8_t*)&value)[3]; + *ptr++ = ((uint8_t*)&value)[2]; + *ptr++ = ((uint8_t*)&value)[1]; + *ptr++ = ((uint8_t*)&value)[0]; + } + else + { + memcpy(ptr, &value, 8); + } + return ptr; +} + +uint8_t* AMFWriteString(uint8_t* ptr, const uint8_t* end, const char* string, size_t length) +{ + if (!ptr || ptr + 1 + (length < 65536 ? 2 : 4) + length > end || length > UINT32_MAX) + return NULL; + + if (length < 65536) + { + *ptr++ = AMF_STRING; + AMFWriteString16(ptr, end, string, length); + ptr += 2; + } + else + { + *ptr++ = AMF_LONG_STRING; + AMFWriteString32(ptr, end, string, length); + ptr += 4; + } + return ptr + length; +} + +uint8_t* AMFWriteDate(uint8_t* ptr, const uint8_t* end, double milliseconds, int16_t timezone) +{ + if (!ptr || ptr + 11 > end) + return NULL; + + AMFWriteDouble(ptr, end, milliseconds); + *ptr = AMF_DATE; // rewrite to date + return AMFWriteInt16(ptr + 8, end, timezone); +} + +uint8_t* AMFWriteNamedBoolean(uint8_t* ptr, const uint8_t* end, const char* name, size_t length, uint8_t value) +{ + if (ptr + length + 2 + 2 > end) + return NULL; + + ptr = AMFWriteString16(ptr, end, name, length); + return ptr ? AMFWriteBoolean(ptr, end, value) : NULL; +} + +uint8_t* AMFWriteNamedDouble(uint8_t* ptr, const uint8_t* end, const char* name, size_t length, double value) +{ + if (ptr + length + 2 + 8 + 1 > end) + return NULL; + + ptr = AMFWriteString16(ptr, end, name, length); + return ptr ? AMFWriteDouble(ptr, end, value) : NULL; +} + +uint8_t* AMFWriteNamedString(uint8_t* ptr, const uint8_t* end, const char* name, size_t length, const char* value, size_t length2) +{ + if (ptr + length + 2 + length2 + 3 > end) + return NULL; + + ptr = AMFWriteString16(ptr, end, name, length); + return ptr ? AMFWriteString(ptr, end, value, length2) : NULL; +} + +static const uint8_t* AMFReadInt16(const uint8_t* ptr, const uint8_t* end, uint32_t* value) +{ + if (!ptr || ptr + 2 > end) + return NULL; + + if (value) + { + *value = ((uint32_t)ptr[0] << 8) | ptr[1]; + } + return ptr + 2; +} + +static const uint8_t* AMFReadInt32(const uint8_t* ptr, const uint8_t* end, uint32_t* value) +{ + if (!ptr || ptr + 4 > end) + return NULL; + + if (value) + { + *value = ((uint32_t)ptr[0] << 24) | ((uint32_t)ptr[1] << 16) | ((uint32_t)ptr[2] << 8) | ptr[3]; + } + return ptr + 4; +} + +const uint8_t* AMFReadNull(const uint8_t* ptr, const uint8_t* end) +{ + (void)end; + return ptr; +} + +const uint8_t* AMFReadUndefined(const uint8_t* ptr, const uint8_t* end) +{ + (void)end; + return ptr; +} + +const uint8_t* AMFReadBoolean(const uint8_t* ptr, const uint8_t* end, uint8_t* value) +{ + if (!ptr || ptr + 1 > end) + return NULL; + + if (value) + { + *value = ptr[0]; + } + return ptr + 1; +} + +const uint8_t* AMFReadDouble(const uint8_t* ptr, const uint8_t* end, double* value) +{ + uint8_t* p = (uint8_t*)value; + if (!ptr || ptr + 8 > end) + return NULL; + + if (value) + { + if (0x00 == *(char*)&s_double) + {// Little-Endian + *p++ = ptr[7]; + *p++ = ptr[6]; + *p++ = ptr[5]; + *p++ = ptr[4]; + *p++ = ptr[3]; + *p++ = ptr[2]; + *p++ = ptr[1]; + *p++ = ptr[0]; + } + else + { + memcpy(value, ptr, 8); + } + } + return ptr + 8; +} + +const uint8_t* AMFReadString(const uint8_t* ptr, const uint8_t* end, int isLongString, char* string, size_t length) +{ + uint32_t len = 0; + if (0 == isLongString) + ptr = AMFReadInt16(ptr, end, &len); + else + ptr = AMFReadInt32(ptr, end, &len); + + if (!ptr || ptr + len > end) + return NULL; + + if (string && length > len) + { + memcpy(string, ptr, len); + string[len] = 0; + } + return ptr + len; +} + +const uint8_t* AMFReadDate(const uint8_t* ptr, const uint8_t* end, double *milliseconds, int16_t *timezone) +{ + uint32_t v; + ptr = AMFReadDouble(ptr, end, milliseconds); + if (ptr) + { + ptr = AMFReadInt16(ptr, end, &v); + if(timezone) + *timezone = (int16_t)v; + } + return ptr; +} + +static const uint8_t* amf_read_object(const uint8_t* data, const uint8_t* end, struct amf_object_item_t* items, size_t n); +static const uint8_t* amf_read_ecma_array(const uint8_t* data, const uint8_t* end, struct amf_object_item_t* items, size_t n); +static const uint8_t* amf_read_strict_array(const uint8_t* ptr, const uint8_t* end, struct amf_object_item_t* items, size_t n); + +static const uint8_t* amf_read_item(const uint8_t* data, const uint8_t* end, enum AMFDataType type, struct amf_object_item_t* item) +{ + switch (type) + { + case AMF_BOOLEAN: + return AMFReadBoolean(data, end, (uint8_t*)(item ? item->value : NULL)); + + case AMF_NUMBER: + return AMFReadDouble(data, end, (double*)(item ? item->value : NULL)); + + case AMF_STRING: + return AMFReadString(data, end, 0, (char*)(item ? item->value : NULL), item ? item->size : 0); + + case AMF_LONG_STRING: + return AMFReadString(data, end, 1, (char*)(item ? item->value : NULL), item ? item->size : 0); + + case AMF_DATE: + return AMFReadDate(data, end, (double*)(item ? item->value : NULL), (int16_t*)(item ? (char*)item->value + 8 : NULL)); + + case AMF_OBJECT: + return amf_read_object(data, end, (struct amf_object_item_t*)(item ? item->value : NULL), item ? item->size : 0); + + case AMF_NULL: + return data; + + case AMF_UNDEFINED: + return data; + + case AMF_ECMA_ARRAY: + return amf_read_ecma_array(data, end, (struct amf_object_item_t*)(item ? item->value : NULL), item ? item->size : 0); + + case AMF_STRICT_ARRAY: + return amf_read_strict_array(data, end, (struct amf_object_item_t*)(item ? item->value : NULL), item ? item->size : 0); + + default: + assert(0); + return NULL; + } +} + +static inline int amf_read_item_type_check(uint8_t type0, uint8_t itemtype) +{ + // decode AMF_ECMA_ARRAY as AMF_OBJECT + return (type0 == itemtype || (AMF_OBJECT == itemtype && (AMF_ECMA_ARRAY == type0 || AMF_NULL == type0))) ? 1 : 0; +} + +static const uint8_t* amf_read_strict_array(const uint8_t* ptr, const uint8_t* end, struct amf_object_item_t* items, size_t n) +{ + uint8_t type; + uint32_t i, count; + if (!ptr || ptr + 4 > end) + return NULL; + + ptr = AMFReadInt32(ptr, end, &count); // U32 array-count + for (i = 0; i < count && ptr && ptr < end; i++) + { + type = *ptr++; + ptr = amf_read_item(ptr, end, type, (i < n && amf_read_item_type_check(type, items[i].type)) ? &items[i] : NULL); + } + + return ptr; +} + +static const uint8_t* amf_read_ecma_array(const uint8_t* ptr, const uint8_t* end, struct amf_object_item_t* items, size_t n) +{ + if (!ptr || ptr + 4 > end) + return NULL; + ptr += 4; // U32 associative-count + return amf_read_object(ptr, end, items, n); +} + +static const uint8_t* amf_read_object(const uint8_t* data, const uint8_t* end, struct amf_object_item_t* items, size_t n) +{ + uint8_t type; + uint32_t len; + size_t i; + + while (data && data + 2 <= end) + { + len = *data++ << 8; + len |= *data++; + if (0 == len) + break; // last item + + if (data + len + 1 > end) + return NULL; // invalid + + for (i = 0; i < n; i++) + { + if (strlen(items[i].name) == len && 0 == memcmp(items[i].name, data, len) && amf_read_item_type_check(data[len], items[i].type)) + break; + } + + data += len; // skip name string + type = *data++; // value type + data = amf_read_item(data, end, type, i < n ? &items[i] : NULL); + } + + if (data && data < end && AMF_OBJECT_END == *data) + return data + 1; + return NULL; // invalid object +} + +const uint8_t* amf_read_items(const uint8_t* data, const uint8_t* end, struct amf_object_item_t* items, size_t count) +{ + size_t i; + uint8_t type; + for (i = 0; i < count && data && data < end; i++) + { + type = *data++; + if (!amf_read_item_type_check(type, items[i].type)) + return NULL; + + data = amf_read_item(data, end, type, &items[i]); + } + + return data; +} + +#if defined(_DEBUG) || defined(DEBUG) +struct rtmp_amf0_command_t +{ + char fmsVer[64]; + double capabilities; + double mode; +}; +struct rtmp_amf0_data_t +{ + char version[64]; +}; +struct rtmp_amf0_information_t +{ + char code[64]; // NetStream.Play.Start + char level[8]; // warning/status/error + char description[256]; + double clientid; + double objectEncoding; + struct rtmp_amf0_data_t data; +}; +static void amf0_test_1(void) +{ + const uint8_t amf0[] = { + 0x02, 0x00, 0x07, 0x5F, 0x72, 0x65, 0x73, 0x75, 0x6C, 0x74, + 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + + 0x03, + 0x00, 0x06, 0x66, 0x6D, 0x73, 0x56, 0x65, 0x72, 0x02, 0x00, 0x0E, 0x46, 0x4D, 0x53, 0x2F, 0x33, 0x2C, 0x35, 0x2C, 0x35, 0x2C, 0x32, 0x30, 0x30, 0x34, + 0x00, 0x0C, 0x63, 0x61, 0x70,0x61, 0x62, 0x69, 0x6C, 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x6D, 0x6F, 0x64, 0x65, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x09, + + 0x03, + 0x00, 0x05, 0x6C, 0x65, 0x76, 0x65, 0x6C, 0x02, 0x00, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x00, 0x04, 0x63, 0x6F, 0x64, 0x65, 0x02, 0x00, 0x1D, 0x4E, 0x65, 0x74, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x2E, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x00, 0x0B, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x02, 0x00, 0x15, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x73, 0x75, 0x63, 0x63, 0x65, 0x65, 0x64, 0x65, 0x64, 0x2E, + 0x00, 0x04, 0x64, 0x61, 0x74, 0x61, + 0x08, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x02, 0x00, 0x0A, 0x33, 0x2C, 0x35, 0x2C, 0x35, 0x2C, 0x32, 0x30, 0x30, 0x34, + 0x00, 0x00, 0x09, + 0x00, 0x08, 0x63, 0x6C, 0x69, 0x65, 0x6E, 0x74, 0x69, 0x64, 0x00, 0x41, 0xD7, 0x9B, 0x78, 0x7C, 0xC0, 0x00, 0x00, + 0x00, 0x0E, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x45, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x00, 0x40, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x09, + }; + + char reply[8]; + const uint8_t* end; + double transactionId; + struct rtmp_amf0_command_t fms; + struct rtmp_amf0_information_t result; + struct amf_object_item_t cmd[3]; + struct amf_object_item_t data[1]; + struct amf_object_item_t info[6]; + struct amf_object_item_t items[4]; + +#define AMF_OBJECT_ITEM_VALUE(v, amf_type, amf_name, amf_value, amf_size) { v.type=amf_type; v.name=amf_name; v.value=amf_value; v.size=amf_size; } + AMF_OBJECT_ITEM_VALUE(cmd[0], AMF_STRING, "fmsVer", fms.fmsVer, sizeof(fms.fmsVer)); + AMF_OBJECT_ITEM_VALUE(cmd[1], AMF_NUMBER, "capabilities", &fms.capabilities, sizeof(fms.capabilities)); + AMF_OBJECT_ITEM_VALUE(cmd[2], AMF_NUMBER, "mode", &fms.mode, sizeof(fms.mode)); + + AMF_OBJECT_ITEM_VALUE(data[0], AMF_STRING, "version", result.data.version, sizeof(result.data.version)); + + AMF_OBJECT_ITEM_VALUE(info[0], AMF_STRING, "code", result.code, sizeof(result.code)); + AMF_OBJECT_ITEM_VALUE(info[1], AMF_STRING, "level", result.level, sizeof(result.level)); + AMF_OBJECT_ITEM_VALUE(info[2], AMF_STRING, "description", result.description, sizeof(result.description)); + AMF_OBJECT_ITEM_VALUE(info[3], AMF_ECMA_ARRAY, "data", data, sizeof(data)/sizeof(data[0])); + AMF_OBJECT_ITEM_VALUE(info[4], AMF_NUMBER, "clientid", &result.clientid, sizeof(result.clientid)); + AMF_OBJECT_ITEM_VALUE(info[5], AMF_NUMBER, "objectEncoding", &result.objectEncoding, sizeof(result.objectEncoding)); + + AMF_OBJECT_ITEM_VALUE(items[0], AMF_STRING, "reply", reply, sizeof(reply)); // Command object + AMF_OBJECT_ITEM_VALUE(items[1], AMF_NUMBER, "transaction", &transactionId, sizeof(transactionId)); // Command object + AMF_OBJECT_ITEM_VALUE(items[2], AMF_OBJECT, "command", cmd, sizeof(cmd)/sizeof(cmd[0])); // Command object + AMF_OBJECT_ITEM_VALUE(items[3], AMF_OBJECT, "information", info, sizeof(info) / sizeof(info[0])); // Information object + + end = amf0 + sizeof(amf0); + assert(end == amf_read_items(amf0, end, items, sizeof(items) / sizeof(items[0]))); + assert(0 == strcmp(fms.fmsVer, "FMS/3,5,5,2004")); + assert(fms.capabilities == 31.0); + assert(fms.mode == 1.0); + assert(0 == strcmp(result.code, "NetConnection.Connect.Success")); + assert(0 == strcmp(result.level, "status")); + assert(0 == strcmp(result.description, "Connection succeeded.")); + assert(0 == strcmp(result.data.version, "3,5,5,2004")); + assert(1584259571.0 == result.clientid); + assert(3.0 == result.objectEncoding); +} + +struct rtmp_amf0_connect_t +{ + char app[64]; // Server application name, e.g.: testapp + char flashver[32]; // Flash Player version, FMSc/1.0 + char swfUrl[256]; // URL of the source SWF file + char tcUrl[256]; // URL of the Server, rtmp://host:1935/testapp/instance1 + uint8_t fpad; // boolean: True if proxy is being used. + double capabilities; // double default: 15 + double audioCodecs; // double default: 4071 + double videoCodecs; // double default: 252 + double videoFunction; // double default: 1 + double encoding; + char pageUrl[256]; // http://host/sample.html +}; + +static void amf0_test_2(void) +{ + const uint8_t amf0[] = { + 0x02, 0x00, 0x07, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x00, + 0x03, 0x61, 0x70, 0x70, + 0x02, + 0x00, 0x05, 0x6c, 0x69, 0x76, 0x65, 0x2f, + 0x00, 0x05, 0x74, 0x63, 0x55, 0x72, 0x6c, + 0x02, 0x00, 0x1A, 0x72, 0x74, 0x6d, 0x70, 0x3a, 0x2f, 0x2f, 0x70, 0x75, 0x73, 0x68, 0x2e, 0x72, 0x74, 0x6d, 0x70, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x69, 0x76, 0x65, 0x2f, + 0x00, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x02, 0x00, 0x0a, 0x6e, 0x6f, 0x6e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x00, + 0x08, 0x66, 0x6c, 0x61, 0x73, 0x68, 0x56, 0x65, 0x72, 0x02, 0x00, 0x1f, 0x46, 0x4d, 0x4c, 0x45, + 0x2f, 0x33, 0x2e, 0x30, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, + 0x65, 0x3b, 0x20, 0x46, 0x4d, 0x53, 0x63, 0x2f, 0x31, 0x2e, 0x30, 0x29, 0x00, 0x06, 0x73, 0x77, + 0x66, 0x55, 0x72, 0x6c, + 0x02, 0x00, 0x1A, 0x72, 0x74, 0x6d, 0x70, 0x3a, 0x2f, 0x2f, 0x70, 0x75, 0x73, 0x68, 0x2e, 0x72, 0x74, 0x6d, 0x70, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x69, 0x76, 0x65, 0x2f, + 0x00, 0x04, 0x66, 0x70, 0x61, 0x64, 0x01, 0x00, 0x00, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, + 0x69, 0x74, 0x69, 0x65, 0x73, 0x00, 0x40, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, + 0x61, 0x75, 0x64, 0x69, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x00, 0x40, 0xa8, 0xee, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x76, 0x69, 0x64, 0x65, 0x6f, 0x43, 0x6f, 0x64, 0x65, + 0x63, 0x73, 0x00, 0x40, 0x6f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x76, 0x69, 0x64, + 0x65, 0x6f, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0x70, 0x61, 0x67, 0x65, 0x55, 0x72, 0x6c, 0x06, 0x00, 0x0e, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, + }; + + char reply[8]; + const uint8_t* end; + double transactionId; + struct rtmp_amf0_connect_t connect; + struct amf_object_item_t commands[11]; + struct amf_object_item_t items[3]; + +#define AMF_OBJECT_ITEM_VALUE(v, amf_type, amf_name, amf_value, amf_size) { v.type=amf_type; v.name=amf_name; v.value=amf_value; v.size=amf_size; } + AMF_OBJECT_ITEM_VALUE(commands[0], AMF_STRING, "app", connect.app, sizeof(connect.app)); + AMF_OBJECT_ITEM_VALUE(commands[1], AMF_STRING, "flashVer", connect.flashver, sizeof(connect.flashver)); + AMF_OBJECT_ITEM_VALUE(commands[2], AMF_STRING, "tcUrl", connect.tcUrl, sizeof(connect.tcUrl)); + AMF_OBJECT_ITEM_VALUE(commands[3], AMF_BOOLEAN, "fpad", &connect.fpad, 1); + AMF_OBJECT_ITEM_VALUE(commands[4], AMF_NUMBER, "audioCodecs", &connect.audioCodecs, 8); + AMF_OBJECT_ITEM_VALUE(commands[5], AMF_NUMBER, "videoCodecs", &connect.videoCodecs, 8); + AMF_OBJECT_ITEM_VALUE(commands[6], AMF_NUMBER, "videoFunction", &connect.videoFunction, 8); + AMF_OBJECT_ITEM_VALUE(commands[7], AMF_NUMBER, "objectEncoding", &connect.encoding, 8); + AMF_OBJECT_ITEM_VALUE(commands[8], AMF_NUMBER, "capabilities", &connect.capabilities, 8); + AMF_OBJECT_ITEM_VALUE(commands[9], AMF_STRING, "pageUrl", &connect.pageUrl, sizeof(connect.pageUrl)); + AMF_OBJECT_ITEM_VALUE(commands[10], AMF_STRING, "swfUrl", &connect.swfUrl, sizeof(connect.swfUrl)); + + AMF_OBJECT_ITEM_VALUE(items[0], AMF_STRING, "reply", reply, sizeof(reply)); // Command object + AMF_OBJECT_ITEM_VALUE(items[1], AMF_NUMBER, "transaction", &transactionId, sizeof(transactionId)); // Command object + AMF_OBJECT_ITEM_VALUE(items[2], AMF_OBJECT, "command", commands, sizeof(commands) / sizeof(commands[0])); // Command object + + end = amf0 + sizeof(amf0); + memset(&connect, 0, sizeof(connect)); + assert(end == amf_read_items(amf0, end, items, sizeof(items) / sizeof(items[0]))); + assert(0 == strcmp(connect.app, "live/")); + assert(0 == strcmp(connect.tcUrl, "rtmp://push.rtmp.com/live/")); + assert(0 == strcmp(connect.flashver, "FMLE/3.0 (compatible; FMSc/1.0)")); + assert(0 == strcmp(connect.swfUrl, "rtmp://push.rtmp.com/live/")); + assert(0 == strcmp(connect.pageUrl, "")); // pageUrl undefined + assert(connect.fpad == 0); + assert(connect.capabilities == 15); + assert(connect.audioCodecs == 3191); + assert(connect.videoCodecs == 252); + assert(connect.videoFunction == 1); + assert(connect.encoding == 0); +} + +void amf0_test(void) +{ + amf0_test_1(); + amf0_test_2(); +} +#endif diff --git a/src/big/mpp/middleware/src/mp4_format/src/libflv/source/amf3.c b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/amf3.c new file mode 100644 index 000000000..54e005d70 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/amf3.c @@ -0,0 +1,95 @@ +#include "amf3.h" +#include +#include + +static double s_double = 1.0; // 3ff0 0000 0000 0000 + +const uint8_t* AMF3ReadNull(const uint8_t* ptr, const uint8_t* end) +{ + (void)end; + return ptr; +} + +const uint8_t* AMF3ReadBoolean(const uint8_t* ptr, const uint8_t* end) +{ + (void)end; + return ptr; +} + +const uint8_t* AMF3ReadInteger(const uint8_t* ptr, const uint8_t* end, int32_t* value) +{ + int i; + int32_t v = 0; + + for (i = 0; i < 3 && ptr + i < end && (0x80 & ptr[i]); i++) + { + v <<= 7; + v |= (ptr[i] & 0x7F); + } + + if (ptr + i >= end) + return NULL; + + if (3 == i) + { + v <<= 8; + v |= ptr[i]; + + if (v >= (1 << 28)) + v -= (1 << 29); + } + else + { + v <<= 7; + v |= ptr[i]; + } + + *value = v; + return ptr + i + 1; +} + +const uint8_t* AMF3ReadDouble(const uint8_t* ptr, const uint8_t* end, double* value) +{ + uint8_t* p = (uint8_t*)value; + if (!ptr || end - ptr < 8) + return NULL; + + if (value) + { + if (0x00 == *(char*)&s_double) + {// Little-Endian + *p++ = ptr[7]; + *p++ = ptr[6]; + *p++ = ptr[5]; + *p++ = ptr[4]; + *p++ = ptr[3]; + *p++ = ptr[2]; + *p++ = ptr[1]; + *p++ = ptr[0]; + } + else + { + memcpy(&value, ptr, 8); + } + } + return ptr + 8; +} + +const uint8_t* AMF3ReadString(const uint8_t* ptr, const uint8_t* end, char* string, uint32_t* length) +{ + uint32_t v; + ptr = AMF3ReadInteger(ptr, end, (int32_t*)&v); + + if (v & 0x01) + { + // reference + return ptr; + } + else + { + *length = v >> 1; + memcpy(string, ptr, *length); + string[*length] = 0; + return ptr + *length; + } +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libflv/source/aom-av1.c b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/aom-av1.c new file mode 100644 index 000000000..d9d8309c5 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/aom-av1.c @@ -0,0 +1,607 @@ +#include "aom-av1.h" +#include +#include +#include +#include +#include "mpeg4-bits.h" + +// https://aomediacodec.github.io/av1-isobmff +// https://aomediacodec.github.io/av1-avif/ + +enum +{ + OBU_SEQUENCE_HEADER = 1, + OBU_TEMPORAL_DELIMITER = 2, + OBU_FRAME_HEADER = 3, + OBU_TILE_GROUP = 4, + OBU_METADATA = 5, + OBU_FRAME = 6, + OBU_REDUNDANT_FRAME_HEADER = 7, + OBU_TILE_LIST = 8, + // 9-14 Reserved + OBU_PADDING = 15, +}; + +/* +aligned (8) class AV1CodecConfigurationRecord { + unsigned int (1) marker = 1; + unsigned int (7) version = 1; + unsigned int (3) seq_profile; + unsigned int (5) seq_level_idx_0; + unsigned int (1) seq_tier_0; + unsigned int (1) high_bitdepth; + unsigned int (1) twelve_bit; + unsigned int (1) monochrome; + unsigned int (1) chroma_subsampling_x; + unsigned int (1) chroma_subsampling_y; + unsigned int (2) chroma_sample_position; + unsigned int (3) reserved = 0; + + unsigned int (1) initial_presentation_delay_present; + if (initial_presentation_delay_present) { + unsigned int (4) initial_presentation_delay_minus_one; + } else { + unsigned int (4) reserved = 0; + } + + unsigned int (8)[] configOBUs; +} +*/ + +int aom_av1_codec_configuration_record_load(const uint8_t* data, size_t bytes, struct aom_av1_t* av1) +{ + if (bytes < 4) + return -1; + + av1->marker = data[0] >> 7; + av1->version = data[0] & 0x7F; + av1->seq_profile = data[1] >> 5; + av1->seq_level_idx_0 = data[1] & 0x1F; + + av1->seq_tier_0 = data[2] >> 7; + av1->high_bitdepth = (data[2] >> 6) & 0x01; + av1->twelve_bit = (data[2] >> 5) & 0x01; + av1->monochrome = (data[2] >> 4) & 0x01; + av1->chroma_subsampling_x = (data[2] >> 3) & 0x01; + av1->chroma_subsampling_y = (data[2] >> 2) & 0x01; + av1->chroma_sample_position = data[2] & 0x03; + + av1->reserved = data[3] >> 5; + av1->initial_presentation_delay_present = (data[3] >> 4) & 0x01; + av1->initial_presentation_delay_minus_one = data[3] & 0x0F; + + if (bytes - 4 > sizeof(av1->data)) + return -1; + + av1->bytes = (uint16_t)(bytes - 4); + memcpy(av1->data, data + 4, av1->bytes); + return (int)bytes; +} + +int aom_av1_codec_configuration_record_save(const struct aom_av1_t* av1, uint8_t* data, size_t bytes) +{ + if (bytes < (size_t)av1->bytes + 4) + return 0; // don't have enough memory + + data[0] = (uint8_t)((av1->marker << 7) | av1->version); + data[1] = (uint8_t)((av1->seq_profile << 5) | av1->seq_level_idx_0); + data[2] = (uint8_t)((av1->seq_tier_0 << 7) | (av1->high_bitdepth << 6) | (av1->twelve_bit << 5) | (av1->monochrome << 4) | (av1->chroma_subsampling_x << 3) | (av1->chroma_subsampling_y << 2) | av1->chroma_sample_position); + data[3] = (uint8_t)((av1->initial_presentation_delay_present << 4) | av1->initial_presentation_delay_minus_one); + + memcpy(data + 4, av1->data, av1->bytes); + return av1->bytes + 4; +} + +static inline const uint8_t* leb128(const uint8_t* data, int bytes, uint64_t* v) +{ + int i; + uint64_t b; + + b = 0x80; + for (*v = i = 0; i * 7 < 64 && i < bytes && 0 != (b & 0x80); i++) + { + b = data[i]; + *v |= (b & 0x7F) << (i * 7); + } + return data + i; +} + +int aom_av1_annexb_split(const uint8_t* data, size_t bytes, int (*handler)(void* param, const uint8_t* obu, size_t bytes), void* param) +{ + int r; + uint64_t n[3]; + const uint8_t* temporal, * frame, * obu; + + r = 0; + for (temporal = data; temporal < data + bytes && 0 == r; temporal += n[0]) + { + // temporal_unit_size + temporal = leb128(temporal, (int)(data + bytes - temporal), &n[0]); + if (temporal + n[0] > data + bytes) + return -1; + + for (frame = temporal; frame < temporal + n[0] && 0 == r; frame += n[1]) + { + // frame_unit_size + frame = leb128(frame, (int)(temporal + n[0] - frame), &n[1]); + if (frame + n[1] > temporal + n[0]) + return -1; + + for (obu = frame; obu < frame + n[1] && 0 == r; obu += n[2]) + { + obu = leb128(obu, (int)(frame + n[1] - obu), &n[2]); + if (obu + n[2] > frame + n[1]) + return -1; + + r = handler(param, obu, (size_t)n[2]); + } + } + } + + return r; +} + +int aom_av1_obu_split(const uint8_t* data, size_t bytes, int (*handler)(void* param, const uint8_t* obu, size_t bytes), void* param) +{ + int r; + size_t i; + size_t offset; + uint64_t len; + uint8_t obu_type; + const uint8_t* ptr; + + for (i = r = 0; i < bytes && 0 == r; i += (size_t)len) + { + // http://aomedia.org/av1/specification/syntax/#obu-header-syntax + obu_type = (data[i] >> 3) & 0x0F; + if (data[i] & 0x04) // obu_extension_flag + { + // http://aomedia.org/av1/specification/syntax/#obu-extension-header-syntax + // temporal_id = (obu[1] >> 5) & 0x07; + // spatial_id = (obu[1] >> 3) & 0x03; + offset = 2; + } + else + { + offset = 1; + } + + if (data[i] & 0x02) // obu_has_size_field + { + ptr = leb128(data + i + offset, (int)(bytes - i - offset), &len); + if (ptr + len > data + bytes) + return -1; + len += ptr - data - i; + } + else + { + len = bytes - i; + } + + r = handler(param, data + i, (size_t)len); + } + + return r; +} + +// http://aomedia.org/av1/specification/syntax/#color-config-syntax +static int aom_av1_color_config(struct mpeg4_bits_t* bits, struct aom_av1_t* av1) +{ + uint8_t BitDepth; + uint8_t color_primaries; + uint8_t transfer_characteristics; + uint8_t matrix_coefficients; + + av1->high_bitdepth = mpeg4_bits_read(bits); + if (av1->seq_profile == 2 && av1->high_bitdepth) + { + av1->twelve_bit = mpeg4_bits_read(bits); + BitDepth = av1->twelve_bit ? 12 : 10; + } + else if (av1->seq_profile <= 2) + { + BitDepth = av1->high_bitdepth ? 10 : 8; + } + else + { + assert(0); + BitDepth = 8; + } + + if (av1->seq_profile == 1) + { + av1->monochrome = 0; + } + else + { + av1->monochrome = mpeg4_bits_read(bits); + } + + if (mpeg4_bits_read(bits)) // color_description_present_flag + { + color_primaries = mpeg4_bits_read_uint8(bits, 8); // color_primaries + transfer_characteristics = mpeg4_bits_read_uint8(bits, 8); // transfer_characteristics + matrix_coefficients = mpeg4_bits_read_uint8(bits, 8); // matrix_coefficients + } + else + { + // http://aomedia.org/av1/specification/semantics/#color-config-semantics + color_primaries = 2; // CP_UNSPECIFIED; + transfer_characteristics = 2; // TC_UNSPECIFIED; + matrix_coefficients = 2; // MC_UNSPECIFIED; + } + + if (av1->monochrome) + { + mpeg4_bits_read(bits); // color_range + av1->chroma_subsampling_x = 1; + av1->chroma_subsampling_y = 1; + } + else if (color_primaries == 1 /*CP_BT_709*/ && transfer_characteristics == 13 /*TC_SRGB*/ && matrix_coefficients == 0 /*MC_IDENTITY*/) + { + av1->chroma_subsampling_x = 0; + av1->chroma_subsampling_y = 0; + } + else + { + mpeg4_bits_read(bits); // color_range + if (av1->seq_profile == 0) + { + av1->chroma_subsampling_x = 1; + av1->chroma_subsampling_y = 1; + } + else if (av1->seq_profile == 1) + { + av1->chroma_subsampling_x = 0; + av1->chroma_subsampling_y = 0; + } + else + { + if (BitDepth == 12) + { + av1->chroma_subsampling_x = mpeg4_bits_read(bits); + if (av1->chroma_subsampling_x) + av1->chroma_subsampling_y = mpeg4_bits_read(bits); + else + av1->chroma_subsampling_y = 0; + } + else + { + av1->chroma_subsampling_x = 1; + av1->chroma_subsampling_y = 0; + } + } + + if (av1->chroma_subsampling_x && av1->chroma_subsampling_y) + av1->chroma_sample_position = mpeg4_bits_read_uint32(bits, 2); + } + + mpeg4_bits_read(bits); // separate_uv_delta_q + return 0; +} + +// http://aomedia.org/av1/specification/syntax/#timing-info-syntax +static int aom_av1_timing_info(struct mpeg4_bits_t* bits, struct aom_av1_t* av1) +{ + (void)av1; + mpeg4_bits_read_n(bits, 32); // num_units_in_display_tick + mpeg4_bits_read_n(bits, 32); // time_scale + if(mpeg4_bits_read(bits)) // equal_picture_interval + mpeg4_bits_read_uvlc(bits); // num_ticks_per_picture_minus_1 + return 0; +} + +// http://aomedia.org/av1/specification/syntax/#decoder-model-info-syntax +static int aom_av1_decoder_model_info(struct mpeg4_bits_t* bits, struct aom_av1_t* av1) +{ + av1->buffer_delay_length_minus_1 = mpeg4_bits_read_uint8(bits, 5); // buffer_delay_length_minus_1 + mpeg4_bits_read_n(bits, 32); // num_units_in_decoding_tick + mpeg4_bits_read_n(bits, 5); // buffer_removal_time_length_minus_1 + mpeg4_bits_read_n(bits, 5); // frame_presentation_time_length_minus_1 + return 0; +} + +// http://aomedia.org/av1/specification/syntax/#operating-parameters-info-syntax +static int aom_av1_operating_parameters_info(struct mpeg4_bits_t* bits, struct aom_av1_t* av1, int op) +{ + uint8_t n; + n = av1->buffer_delay_length_minus_1 + 1; + mpeg4_bits_read_n(bits, n); // decoder_buffer_delay[ op ] + mpeg4_bits_read_n(bits, n); // encoder_buffer_delay[ op ] + mpeg4_bits_read(bits); // low_delay_mode_flag[ op ] + (void)op; + return 0; +} + +// http://aomedia.org/av1/specification/syntax/#sequence-header-obu-syntax +static int aom_av1_obu_sequence_header(struct aom_av1_t* av1, const void* data, size_t bytes) +{ + uint8_t i; + uint8_t reduced_still_picture_header; + uint8_t decoder_model_info_present_flag; + uint8_t operating_points_cnt_minus_1; + uint8_t frame_width_bits_minus_1; + uint8_t frame_height_bits_minus_1; + uint8_t enable_order_hint; + uint8_t seq_force_screen_content_tools; + struct mpeg4_bits_t bits; + + mpeg4_bits_init(&bits, (void*)data, bytes); + av1->seq_profile = mpeg4_bits_read_uint32(&bits, 3); + mpeg4_bits_read(&bits); // still_picture + reduced_still_picture_header = mpeg4_bits_read_uint8(&bits, 1); + if (reduced_still_picture_header) + { + av1->initial_presentation_delay_present = 0; // initial_display_delay_present_flag + av1->seq_level_idx_0 = mpeg4_bits_read_uint32(&bits, 5); + av1->seq_tier_0 = 0; + decoder_model_info_present_flag = 0; + } + else + { + if (mpeg4_bits_read(&bits)) // timing_info_present_flag + { + // timing_info( ) + aom_av1_timing_info(&bits, av1); + + decoder_model_info_present_flag = mpeg4_bits_read_uint8(&bits, 1); // decoder_model_info_present_flag + if (decoder_model_info_present_flag) + { + // decoder_model_info( ) + aom_av1_decoder_model_info(&bits, av1); + } + } + else + { + decoder_model_info_present_flag = 0; + } + + av1->initial_presentation_delay_present = mpeg4_bits_read(&bits); // initial_display_delay_present_flag = + operating_points_cnt_minus_1 = mpeg4_bits_read_uint8(&bits, 5); + for (i = 0; i <= operating_points_cnt_minus_1; i++) + { + uint8_t seq_level_idx; + uint8_t seq_tier; + uint8_t initial_display_delay_minus_1; + + mpeg4_bits_read_n(&bits, 12); // operating_point_idc[ i ] + seq_level_idx = mpeg4_bits_read_uint8(&bits, 5); // seq_level_idx[ i ] + if (seq_level_idx > 7) + { + seq_tier = mpeg4_bits_read_uint8(&bits, 1); // seq_tier[ i ] + } + else + { + seq_tier = 0; + } + + if (decoder_model_info_present_flag) + { + if (mpeg4_bits_read(&bits)) // decoder_model_present_for_this_op[i] + { + aom_av1_operating_parameters_info(&bits, av1, i); + } + } + + if (av1->initial_presentation_delay_present && mpeg4_bits_read(&bits)) // initial_display_delay_present_for_this_op[ i ] + initial_display_delay_minus_1 = mpeg4_bits_read_uint8(&bits, 4); // initial_display_delay_minus_1[ i ] + else + initial_display_delay_minus_1 = 0; + + if (0 == i) + { + av1->seq_level_idx_0 = seq_level_idx; + av1->seq_tier_0 = seq_tier; + av1->initial_presentation_delay_minus_one = initial_display_delay_minus_1; + } + } + } + + // choose_operating_point( ) + frame_width_bits_minus_1 = mpeg4_bits_read_uint8(&bits, 4); + frame_height_bits_minus_1 = mpeg4_bits_read_uint8(&bits, 4); + av1->width = 1 + mpeg4_bits_read_uint32(&bits, frame_width_bits_minus_1 + 1); // max_frame_width_minus_1 + av1->height = 1 + mpeg4_bits_read_uint32(&bits, frame_height_bits_minus_1 + 1); // max_frame_height_minus_1 + + if (!reduced_still_picture_header && mpeg4_bits_read(&bits)) // frame_id_numbers_present_flag + { + mpeg4_bits_read_n(&bits, 4); // delta_frame_id_length_minus_2 + mpeg4_bits_read_n(&bits, 3); // additional_frame_id_length_minus_1 + } + + mpeg4_bits_read(&bits); // use_128x128_superblock + mpeg4_bits_read(&bits); // enable_filter_intra + mpeg4_bits_read(&bits); // enable_intra_edge_filter + + if (!reduced_still_picture_header) + { + mpeg4_bits_read(&bits); // enable_interintra_compound + mpeg4_bits_read(&bits); // enable_masked_compound + mpeg4_bits_read(&bits); // enable_warped_motion + mpeg4_bits_read(&bits); // enable_dual_filter + enable_order_hint = mpeg4_bits_read_uint8(&bits, 1); + if (enable_order_hint) + { + mpeg4_bits_read(&bits); // enable_jnt_comp + mpeg4_bits_read(&bits); // enable_ref_frame_mvs + } + if (mpeg4_bits_read(&bits)) // seq_choose_screen_content_tools + { + seq_force_screen_content_tools = 2; // SELECT_SCREEN_CONTENT_TOOLS; + } + else + { + seq_force_screen_content_tools = mpeg4_bits_read_uint8(&bits, 1); // seq_force_screen_content_tools + } + + if (seq_force_screen_content_tools > 0) + { + if (!mpeg4_bits_read(&bits)) // seq_choose_integer_mv + mpeg4_bits_read(&bits); // seq_force_integer_mv + //else + // seq_force_integer_mv = SELECT_INTEGER_MV + } + else + { + //seq_force_integer_mv = SELECT_INTEGER_MV; + } + + if (enable_order_hint) + { + mpeg4_bits_read_n(&bits, 3); // order_hint_bits_minus_1 + } + } + + mpeg4_bits_read(&bits); // enable_superres + mpeg4_bits_read(&bits); // enable_cdef + mpeg4_bits_read(&bits); // enable_restoration + + // color_config( ) + aom_av1_color_config(&bits, av1); + + mpeg4_bits_read(&bits); // film_grain_params_present + + return mpeg4_bits_error(&bits) ? -1 : 0; +} + +// http://aomedia.org/av1/specification/syntax/#general-obu-syntax +static int aom_av1_extra_handler(void* param, const uint8_t* obu, size_t bytes) +{ + uint64_t i; + uint64_t len; + size_t offset; + uint8_t obu_type; + const uint8_t* ptr; + struct aom_av1_t* av1; + + av1 = (struct aom_av1_t*)param; + if (bytes < 2) + return -1; + + // http://aomedia.org/av1/specification/syntax/#obu-header-syntax + obu_type = (obu[0] >> 3) & 0x0F; + if (obu[0] & 0x04) // obu_extension_flag + { + // http://aomedia.org/av1/specification/syntax/#obu-extension-header-syntax + // temporal_id = (obu[1] >> 5) & 0x07; + // spatial_id = (obu[1] >> 3) & 0x03; + offset = 2; + } + else + { + offset = 1; + } + + if (obu[0] & 0x02) // obu_has_size_field + { + ptr = leb128(obu + offset, (int)(bytes - offset), &len); + if (ptr + len > obu + bytes) + return -1; + } + else + { + ptr = obu + offset; + len = bytes - offset; + } + + if (OBU_SEQUENCE_HEADER == obu_type || OBU_METADATA == obu_type) + { + if (av1->bytes + bytes + 8 /*leb128*/ >= sizeof(av1->data)) + return -1; + + av1->data[av1->bytes++] = obu[0] | 0x02 /*obu_has_size_field*/; + if (obu[0] & 0x04) // obu_extension_flag + av1->data[av1->bytes++] = obu[1]; + + //if (0 == (obu[0] & 0x02)) + { + // fill obu size, leb128 + for(i = len; i >= 0x80; av1->bytes++) + { + av1->data[av1->bytes] = (uint8_t)(i & 0x7F); + av1->data[av1->bytes] |= 0x80; + i >>= 7; + } + av1->data[av1->bytes++] = (uint8_t)(i & 0x7F); + } + memcpy(av1->data + av1->bytes, ptr, (size_t)len); + av1->bytes += (uint16_t)len; + } + + // http://aomedia.org/av1/specification/semantics/#obu-header-semantics + if (obu_type == OBU_SEQUENCE_HEADER) + { + return aom_av1_obu_sequence_header(av1, ptr, (size_t)len); + } + + return 0; +} + +// https://aomediacodec.github.io/av1-isobmff/#av1codecconfigurationbox-section +int aom_av1_codec_configuration_record_init(struct aom_av1_t* av1, const void* data, size_t bytes) +{ + av1->version = 1; + av1->marker = 1; + return aom_av1_obu_split((const uint8_t*)data, bytes, aom_av1_extra_handler, av1); +} + +int aom_av1_codecs(const struct aom_av1_t* av1, char* codecs, size_t bytes) +{ + unsigned int bitdepth; + + // AV1 5.5.2.Color config syntax + if (2 == av1->seq_profile && av1->high_bitdepth) + bitdepth = av1->twelve_bit ? 12 : 10; + else + bitdepth = av1->high_bitdepth ? 10 : 8; + + // https://aomediacodec.github.io/av1-isobmff/#codecsparam + // https://developer.mozilla.org/en-US/docs/Web/Media/Formats/codecs_parameter + // ......... + return snprintf(codecs, bytes, "av01.%u.%02u%c.%02u", (unsigned int)av1->seq_profile, (unsigned int)av1->seq_level_idx_0, av1->seq_tier_0 ? 'H' : 'M', (unsigned int)bitdepth); +} + +#if defined(_DEBUG) || defined(DEBUG) +void aom_av1_test(void) +{ + const unsigned char src[] = { + 0x81, 0x04, 0x0c, 0x00, 0x0a, 0x0b, 0x00, 0x00, 0x00, 0x24, 0xcf, 0x7f, 0x0d, 0xbf, 0xff, 0x30, 0x08 + }; + unsigned char data[sizeof(src)]; + + struct aom_av1_t av1; + assert(sizeof(src) == aom_av1_codec_configuration_record_load(src, sizeof(src), &av1)); + assert(1 == av1.version && 0 == av1.seq_profile && 4 == av1.seq_level_idx_0); + assert(0 == av1.seq_tier_0 && 0 == av1.high_bitdepth && 0 == av1.twelve_bit && 0 == av1.monochrome && 1 == av1.chroma_subsampling_x && 1 == av1.chroma_subsampling_y && 0 == av1.chroma_sample_position); + assert(0 == av1.initial_presentation_delay_present && 0 == av1.initial_presentation_delay_minus_one); + assert(13 == av1.bytes); + assert(sizeof(src) == aom_av1_codec_configuration_record_save(&av1, data, sizeof(data))); + assert(0 == memcmp(src, data, sizeof(src))); + + aom_av1_codecs(&av1, (char*)data, sizeof(data)); + assert(0 == memcmp("av01.0.04M.08", data, 13)); +} + +void aom_av1_sequence_header_obu_test(void) +{ + const uint8_t obu[] = { /*0x0A, 0x0B,*/ 0x00, 0x00, 0x00, 0x2C, 0xCF, 0x7F, 0x0D, 0xBF, 0xFF, 0x38, 0x18 }; + + struct aom_av1_t av1; + memset(&av1, 0, sizeof(av1)); + assert(0 == aom_av1_obu_sequence_header(&av1, obu, sizeof(obu))); +} + +void aom_av1_obu_test(const char* file) +{ + size_t n; + FILE* fp; + struct aom_av1_t av1; + static uint8_t buffer[24 * 1024 * 1024]; + aom_av1_sequence_header_obu_test(); + memset(&av1, 0, sizeof(av1)); + fp = fopen(file, "rb"); + n = fread(buffer, 1, sizeof(buffer), fp); + aom_av1_codec_configuration_record_init(&av1, buffer, n); + fclose(fp); +} +#endif diff --git a/src/big/mpp/middleware/src/mp4_format/src/libflv/source/flv-demuxer-script.c b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/flv-demuxer-script.c new file mode 100644 index 000000000..9158355c4 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/flv-demuxer-script.c @@ -0,0 +1,84 @@ +#include "flv-demuxer.h" +#include "amf0.h" +#include +#include +#include + +#define N_ONMETADATA 12 // 2-LEN + 10-onMetaData + +/// http://www.cnblogs.com/musicfans/archive/2012/11/07/2819291.html +/// metadata keyframes/filepositions +/// @return >0-OK, 0-don't metadata, <0-error +int flv_demuxer_script(struct flv_demuxer_t* flv, const uint8_t* data, size_t bytes) +{ + const uint8_t* end; + char buffer[64] = { 0 }; + double audiocodecid = 0; + double audiodatarate = 0; // bitrate / 1024 + double audiodelay = 0; + double audiosamplerate = 0; + double audiosamplesize = 0; + double videocodecid = 0; + double videodatarate = 0; // bitrate / 1024 + double framerate = 0; + double height = 0; + double width = 0; + double duration = 0; + double filesize = 0; + int canSeekToEnd = 0; + int stereo = 0; + struct amf_object_item_t keyframes[2]; + struct amf_object_item_t prop[16]; + struct amf_object_item_t items[1]; + +#define AMF_OBJECT_ITEM_VALUE(v, amf_type, amf_name, amf_value, amf_size) { v.type=amf_type; v.name=amf_name; v.value=amf_value; v.size=amf_size; } + AMF_OBJECT_ITEM_VALUE(keyframes[0], AMF_STRICT_ARRAY, "filepositions", NULL, 0); // ignore keyframes + AMF_OBJECT_ITEM_VALUE(keyframes[1], AMF_STRICT_ARRAY, "times", NULL, 0); + + AMF_OBJECT_ITEM_VALUE(prop[0], AMF_NUMBER, "audiocodecid", &audiocodecid, sizeof(audiocodecid)); + AMF_OBJECT_ITEM_VALUE(prop[1], AMF_NUMBER, "audiodatarate", &audiodatarate, sizeof(audiodatarate)); + AMF_OBJECT_ITEM_VALUE(prop[2], AMF_NUMBER, "audiodelay", &audiodelay, sizeof(audiodelay)); + AMF_OBJECT_ITEM_VALUE(prop[3], AMF_NUMBER, "audiosamplerate", &audiosamplerate, sizeof(audiosamplerate)); + AMF_OBJECT_ITEM_VALUE(prop[4], AMF_NUMBER, "audiosamplesize", &audiosamplesize, sizeof(audiosamplesize)); + AMF_OBJECT_ITEM_VALUE(prop[5], AMF_BOOLEAN, "stereo", &stereo, sizeof(stereo)); + + AMF_OBJECT_ITEM_VALUE(prop[6], AMF_BOOLEAN, "canSeekToEnd", &canSeekToEnd, sizeof(canSeekToEnd)); + AMF_OBJECT_ITEM_VALUE(prop[7], AMF_STRING, "creationdate", buffer, sizeof(buffer)); + AMF_OBJECT_ITEM_VALUE(prop[8], AMF_NUMBER, "duration", &duration, sizeof(duration)); + AMF_OBJECT_ITEM_VALUE(prop[9], AMF_NUMBER, "filesize", &filesize, sizeof(filesize)); + + AMF_OBJECT_ITEM_VALUE(prop[10], AMF_NUMBER, "videocodecid", &videocodecid, sizeof(videocodecid)); + AMF_OBJECT_ITEM_VALUE(prop[11], AMF_NUMBER, "videodatarate", &videodatarate, sizeof(videodatarate)); + AMF_OBJECT_ITEM_VALUE(prop[12], AMF_NUMBER, "framerate", &framerate, sizeof(framerate)); + AMF_OBJECT_ITEM_VALUE(prop[13], AMF_NUMBER, "height", &height, sizeof(height)); + AMF_OBJECT_ITEM_VALUE(prop[14], AMF_NUMBER, "width", &width, sizeof(width)); + + AMF_OBJECT_ITEM_VALUE(prop[15], AMF_OBJECT, "keyframes", keyframes, 2); // FLV I-index + + AMF_OBJECT_ITEM_VALUE(items[0], AMF_OBJECT, "onMetaData", prop, sizeof(prop) / sizeof(prop[0])); +#undef AMF_OBJECT_ITEM_VALUE + + end = data + bytes; + if (AMF_STRING != data[0] || NULL == (data = AMFReadString(data + 1, end, 0, buffer, sizeof(buffer) - 1))) + { + assert(0); + return -1; + } + + // filter @setDataFrame + if (0 == strcmp(buffer, "@setDataFrame")) + { + if (AMF_STRING != data[0] || NULL == (data = AMFReadString(data + 1, end, 0, buffer, sizeof(buffer) - 1))) + { + assert(0); + return -1; + } + } + + // onTextData/onCaption/onCaptionInfo/onCuePoint/|RtmpSampleAccess + if (0 != strcmp(buffer, "onMetaData")) + return 0; // skip + + (void)flv; + return amf_read_items(data, end, items, sizeof(items) / sizeof(items[0])) ? N_ONMETADATA : -1; +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libflv/source/flv-demuxer.c b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/flv-demuxer.c new file mode 100644 index 000000000..3ddc994e8 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/flv-demuxer.c @@ -0,0 +1,322 @@ +#include "flv-demuxer.h" +#include "flv-header.h" +#include "flv-proto.h" +#include "mpeg4-aac.h" +#include "mpeg4-avc.h" +#include "mpeg4-hevc.h" +#include "mpeg4-vvc.h" +#include "opus-head.h" +#include "aom-av1.h" +#include "amf0.h" +#include +#include +#include +#include + +struct flv_demuxer_t +{ + union + { + struct mpeg4_aac_t aac; + struct opus_head_t opus; + } a; + + union + { + struct aom_av1_t av1; + struct mpeg4_avc_t avc; + struct mpeg4_hevc_t hevc; + struct mpeg4_vvc_t vvc; + } v; + + flv_demuxer_handler handler; + void* param; + + uint8_t* ptr; + int capacity; +}; + +struct flv_demuxer_t* flv_demuxer_create(flv_demuxer_handler handler, void* param) +{ + struct flv_demuxer_t* flv; + flv = (struct flv_demuxer_t*)malloc(sizeof(struct flv_demuxer_t)); + if (NULL == flv) + return NULL; + + memset(flv, 0, sizeof(struct flv_demuxer_t)); + flv->handler = handler; + flv->param = param; + return flv; +} + +void flv_demuxer_destroy(struct flv_demuxer_t* flv) +{ + if (flv->ptr) + { + assert(flv->capacity > 0); + free(flv->ptr); + } + + free(flv); +} + +static int flv_demuxer_check_and_alloc(struct flv_demuxer_t* flv, int bytes) +{ + if (bytes > flv->capacity) + { + void* p = realloc(flv->ptr, bytes); + if (NULL == p) + return -1; + flv->ptr = (uint8_t*)p; + flv->capacity = bytes; + } + return 0; +} + +static int flv_demuxer_audio(struct flv_demuxer_t* flv, const uint8_t* data, int bytes, uint32_t timestamp) +{ + int r, n; + struct flv_audio_tag_header_t audio; + n = flv_audio_tag_header_read(&audio, data, bytes); + if (n < 0) + return n; + + if (FLV_AUDIO_AAC == audio.codecid) + { + // Adobe Flash Video File Format Specification Version 10.1 >> E.4.2.1 AUDIODATA (p77) + // If the SoundFormat indicates AAC, the SoundType should be 1 (stereo) and the SoundRate should be 3 (44 kHz). + // However, this does not mean that AAC audio in FLV is always stereo, 44 kHz data.Instead, the Flash Player ignores + // these values and extracts the channel and sample rate data is encoded in the AAC bit stream. + //assert(3 == audio.bitrate && 1 == audio.channel); + if (FLV_SEQUENCE_HEADER == audio.avpacket) + { + flv->a.aac.profile = MPEG4_AAC_LC; + flv->a.aac.sampling_frequency_index = MPEG4_AAC_44100; + flv->a.aac.channel_configuration = 2; + flv->a.aac.channels = 2; + flv->a.aac.sampling_frequency = 44100; + flv->a.aac.extension_frequency = 44100; + mpeg4_aac_audio_specific_config_load(data + n, bytes - n, &flv->a.aac); + return flv->handler(flv->param, FLV_AUDIO_ASC, data + n, bytes - n, timestamp, timestamp, 0); + } + else + { + if (0 != flv_demuxer_check_and_alloc(flv, bytes + 7 + 1 + flv->a.aac.npce)) + return -ENOMEM; + + // AAC ES stream with ADTS header + assert(bytes <= 0x1FFF); + assert(bytes > 2 && 0xFFF0 != (((data[2] << 8) | data[3]) & 0xFFF0)); // don't have ADTS + r = mpeg4_aac_adts_save(&flv->a.aac, (uint16_t)bytes - n, flv->ptr, 7 + 1 + flv->a.aac.npce); // 13-bits + if (r < 7) return -EINVAL; // invalid pce + flv->a.aac.npce = 0; // pce write only once + memmove(flv->ptr + r, data + n, bytes - n); + return flv->handler(flv->param, FLV_AUDIO_AAC, flv->ptr, bytes - n + r, timestamp, timestamp, 0); + } + } + else if (FLV_AUDIO_OPUS == audio.codecid) + { + if (FLV_SEQUENCE_HEADER == audio.avpacket) + { + opus_head_load(data + n, bytes - n, &flv->a.opus); + return flv->handler(flv->param, FLV_AUDIO_OPUS_HEAD, data + n, bytes - n, timestamp, timestamp, 0); + } + else + { + return flv->handler(flv->param, audio.codecid, data + n, bytes - n, timestamp, timestamp, 0); + } + } + else if (FLV_AUDIO_MP3 == audio.codecid || FLV_AUDIO_MP3_8K == audio.codecid) + { + return flv->handler(flv->param, audio.codecid, data + n, bytes - n, timestamp, timestamp, 0); + } + else + { + // Audio frame data + return flv->handler(flv->param, audio.codecid, data + n, bytes - n, timestamp, timestamp, 0); + } +} + +static int flv_demuxer_video(struct flv_demuxer_t* flv, const uint8_t* data, int bytes, uint32_t timestamp) +{ + int n; + struct flv_video_tag_header_t video; + n = flv_video_tag_header_read(&video, data, bytes); + if (n < 0) + return n; + + if (FLV_VIDEO_H264 == video.codecid) + { + if (FLV_SEQUENCE_HEADER == video.avpacket) + { + // AVCDecoderConfigurationRecord + assert(bytes > n + 7); + mpeg4_avc_decoder_configuration_record_load(data + n, bytes - n, &flv->v.avc); + return flv->handler(flv->param, FLV_VIDEO_AVCC, data + n, bytes - n, timestamp + video.cts, timestamp, 0); + } + else if(FLV_AVPACKET == video.avpacket) + { + // feat: h264_mp4toannexb support flv->v.avc.nalu == 0 + //assert(flv->v.avc.nalu > 0); // parse AVCDecoderConfigurationRecord failed + //if (flv->v.avc.nalu > 0 && bytes > n) // 5 == bytes flv eof + { + // H.264 + if (0 != flv_demuxer_check_and_alloc(flv, bytes + 4 * 1024)) + return -ENOMEM; + + assert(flv->v.avc.nalu <= 4); + n = h264_mp4toannexb(&flv->v.avc, data + n, bytes - n, flv->ptr, flv->capacity); + if (n <= 0 || n > flv->capacity) + { + assert(0); + return -ENOMEM; + } + return flv->handler(flv->param, FLV_VIDEO_H264, flv->ptr, n, timestamp + video.cts, timestamp, (FLV_VIDEO_KEY_FRAME == video.keyframe) ? 1 : 0); + } + return -EINVAL; + } + else if (FLV_END_OF_SEQUENCE == video.avpacket) + { + return 0; // AVC end of sequence (lower level NALU sequence ender is not required or supported) + } + else + { + assert(0); + return -EINVAL; + } + } + else if (FLV_VIDEO_H265 == video.codecid) + { + if (FLV_SEQUENCE_HEADER == video.avpacket) + { + // HEVCDecoderConfigurationRecord + assert(bytes > n + 7); + mpeg4_hevc_decoder_configuration_record_load(data + n, bytes - n, &flv->v.hevc); + return flv->handler(flv->param, FLV_VIDEO_HVCC, data + n, bytes - n, timestamp + video.cts, timestamp, 0); + } + else if (FLV_AVPACKET == video.avpacket) + { + // feat: h265_mp4toannexb support flv->v.hevc.numOfArrays == 0 + //assert(flv->v.hevc.numOfArrays > 0); // parse HEVCDecoderConfigurationRecord failed + //if (flv->v.hevc.numOfArrays > 0 && bytes > n) // 5 == bytes flv eof + { + // H.265 + if (0 != flv_demuxer_check_and_alloc(flv, bytes + 4 * 1024)) + return -ENOMEM; + + n = h265_mp4toannexb(&flv->v.hevc, data + n, bytes - n, flv->ptr, flv->capacity); + if (n <= 0 || n > flv->capacity) + { + assert(0); + return -ENOMEM; + } + return flv->handler(flv->param, FLV_VIDEO_H265, flv->ptr, n, timestamp + video.cts, timestamp, (FLV_VIDEO_KEY_FRAME == video.keyframe) ? 1 : 0); + } + return -EINVAL; + } + else if (FLV_END_OF_SEQUENCE == video.avpacket) + { + return 0; // AVC end of sequence (lower level NALU sequence ender is not required or supported) + } + else + { + assert(0); + return -EINVAL; + } + } + else if (FLV_VIDEO_H266 == video.codecid) + { + if (FLV_SEQUENCE_HEADER == video.avpacket) + { + // VVCDecoderConfigurationRecord + assert(bytes > n + 5); + mpeg4_vvc_decoder_configuration_record_load(data + n, bytes - n, &flv->v.vvc); + return flv->handler(flv->param, FLV_VIDEO_VVCC, data + n, bytes - n, timestamp + video.cts, timestamp, 0); + } + else if (FLV_AVPACKET == video.avpacket) + { + // feat: h266_mp4toannexb support flv->v.vvc.numOfArrays == 0 + //assert(flv->v.vvc.numOfArrays > 0); // parse VVCDecoderConfigurationRecord failed + //if (flv->v.vvc.numOfArrays > 0 && bytes > n) // 5 == bytes flv eof + { + // H.266 + if (0 != flv_demuxer_check_and_alloc(flv, bytes + 4 * 1024)) + return -ENOMEM; + + n = h266_mp4toannexb(&flv->v.vvc, data + n, bytes - n, flv->ptr, flv->capacity); + if (n <= 0 || n > flv->capacity) + { + assert(0); + return -ENOMEM; + } + return flv->handler(flv->param, FLV_VIDEO_H266, flv->ptr, n, timestamp + video.cts, timestamp, (FLV_VIDEO_KEY_FRAME == video.keyframe) ? 1 : 0); + } + return -EINVAL; + } + else if (FLV_END_OF_SEQUENCE == video.avpacket) + { + return 0; // AVC end of sequence (lower level NALU sequence ender is not required or supported) + } + else + { + assert(0); + return -EINVAL; + } + } + else if (FLV_VIDEO_AV1 == video.codecid) + { + if (FLV_SEQUENCE_HEADER == video.avpacket) + { + // AV1CodecConfigurationRecord + assert(bytes > n + 5); + aom_av1_codec_configuration_record_load(data + n, bytes - n, &flv->v.av1); + return flv->handler(flv->param, FLV_VIDEO_AV1C, data + n, bytes - n, timestamp + video.cts, timestamp, 0); + } + else if (FLV_AVPACKET == video.avpacket) + { + return flv->handler(flv->param, FLV_VIDEO_AV1, data + n, bytes - n, timestamp + video.cts, timestamp, (FLV_VIDEO_KEY_FRAME == video.keyframe) ? 1 : 0); + } + else if (FLV_END_OF_SEQUENCE == video.avpacket) + { + return 0; // AV1 end of sequence (lower level NALU sequence ender is not required or supported) + } + else + { + assert(0); + return -EINVAL; + } + } + else + { + // Video frame data + return flv->handler(flv->param, video.codecid, data + n, bytes - n, timestamp + video.cts, timestamp, (FLV_VIDEO_KEY_FRAME==video.keyframe) ? 1 : 0); + } +} + +int flv_demuxer_script(struct flv_demuxer_t* flv, const uint8_t* data, size_t bytes); +int flv_demuxer_input(struct flv_demuxer_t* flv, int type, const void* data, size_t bytes, uint32_t timestamp) +{ + int n; + if (bytes < 1) + return 0; + + switch (type) + { + case FLV_TYPE_AUDIO: + return flv_demuxer_audio(flv, data, (int)bytes, timestamp); + + case FLV_TYPE_VIDEO: + return flv_demuxer_video(flv, data, (int)bytes, timestamp); + + case FLV_TYPE_SCRIPT: + n = flv_demuxer_script(flv, data, bytes); + if (n < 12) + return 0; // ignore + n -= 12; // 2-LEN + 10-onMetaData + return flv->handler(flv->param, FLV_SCRIPT_METADATA, (const uint8_t*)data + n, bytes - n, timestamp, timestamp, 0); + + default: + assert(0); + return -1; + } +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libflv/source/flv-header.c b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/flv-header.c new file mode 100644 index 000000000..2716c3406 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/flv-header.c @@ -0,0 +1,238 @@ +#include "flv-header.h" +#include "flv-proto.h" +#include +#include + +#define N_TAG_SIZE 4 // previous tag size +#define FLV_HEADER_SIZE 9 // DataOffset included +#define FLV_TAG_HEADER_SIZE 11 // StreamID included + +static inline uint32_t be_read_uint32(const uint8_t* ptr) +{ + return (ptr[0] << 24) | (ptr[1] << 16) | (ptr[2] << 8) | ptr[3]; +} + +static inline void be_write_uint32(uint8_t* ptr, uint32_t val) +{ + ptr[0] = (uint8_t)((val >> 24) & 0xFF); + ptr[1] = (uint8_t)((val >> 16) & 0xFF); + ptr[2] = (uint8_t)((val >> 8) & 0xFF); + ptr[3] = (uint8_t)(val & 0xFF); +} + +int flv_header_read(struct flv_header_t* flv, const uint8_t* buf, size_t len) +{ + if (len < FLV_HEADER_SIZE || 'F' != buf[0] || 'L' != buf[1] || 'V' != buf[2]) + { + assert(0); + return -1; + } + + flv->FLV[0] = buf[0]; + flv->FLV[1] = buf[1]; + flv->FLV[2] = buf[2]; + flv->version = buf[3]; + + assert(0x00 == (buf[4] & 0xF8) && 0x00 == (buf[4] & 0x20)); + flv->audio = (buf[4] >> 2) & 0x01; + flv->video = buf[4] & 0x01; + flv->offset = be_read_uint32(buf + 5); + + return FLV_HEADER_SIZE; +} + +int flv_tag_header_read(struct flv_tag_header_t* tag, const uint8_t* buf, size_t len) +{ + if (len < FLV_TAG_HEADER_SIZE) + { + assert(0); + return -1; + } + + // TagType + tag->type = buf[0] & 0x1F; + tag->filter = (buf[0] >> 5) & 0x01; + assert(FLV_TYPE_VIDEO == tag->type || FLV_TYPE_AUDIO == tag->type || FLV_TYPE_SCRIPT == tag->type); + + // DataSize + tag->size = ((uint32_t)buf[1] << 16) | ((uint32_t)buf[2] << 8) | buf[3]; + + // TimestampExtended | Timestamp + tag->timestamp = ((uint32_t)buf[4] << 16) | ((uint32_t)buf[5] << 8) | buf[6] | ((uint32_t)buf[7] << 24); + + // StreamID Always 0 + tag->streamId = ((uint32_t)buf[8] << 16) | ((uint32_t)buf[9] << 8) | buf[10]; + //assert(0 == tag->streamId); + + return FLV_TAG_HEADER_SIZE; +} + +int flv_audio_tag_header_read(struct flv_audio_tag_header_t* audio, const uint8_t* buf, size_t len) +{ + assert(len > 0); + audio->codecid = (buf[0] & 0xF0) /*>> 4*/; + audio->rate = (buf[0] & 0x0C) >> 2; + audio->bits = (buf[0] & 0x02) >> 1; + audio->channels = buf[0] & 0x01; + audio->avpacket = FLV_AVPACKET; + + if (FLV_AUDIO_AAC == audio->codecid || FLV_AUDIO_OPUS == audio->codecid) + { + if (len < 2) + { + assert(0); + return -1; + } + audio->avpacket = buf[1]; + assert(FLV_SEQUENCE_HEADER == audio->avpacket || FLV_AVPACKET == audio->avpacket); + return 2; + } + else + { + return 1; + } +} + +int flv_video_tag_header_read(struct flv_video_tag_header_t* video, const uint8_t* buf, size_t len) +{ + assert(len > 0); + video->keyframe = (buf[0] & 0xF0) >> 4; + video->codecid = (buf[0] & 0x0F); + video->avpacket = FLV_AVPACKET; + + if (FLV_VIDEO_H264 == video->codecid || FLV_VIDEO_H265 == video->codecid || FLV_VIDEO_H266 == video->codecid || FLV_VIDEO_AV1 == video->codecid) + { + if (len < 5) + return -1; + + video->avpacket = buf[1]; // AVCPacketType + video->cts = ((uint32_t)buf[2] << 16) | ((uint32_t)buf[3] << 8) | buf[4]; + //if (video->cts >= (1 << 23)) video->cts -= (1 << 24); + video->cts = (video->cts + 0xFF800000) ^ 0xFF800000; // signed 24-integer + assert(FLV_SEQUENCE_HEADER == video->avpacket || FLV_AVPACKET == video->avpacket || FLV_END_OF_SEQUENCE == video->avpacket); + return 5; + } + else + { + return 1; + } +} + +int flv_data_tag_header_read(const uint8_t* buf, size_t len) +{ + (void)buf; + return (int)len; +} + +int flv_header_write(int audio, int video, uint8_t* buf, size_t len) +{ + if (len < FLV_HEADER_SIZE) + { + assert(0); + return -1; + } + + buf[0] = 'F'; // FLV signature + buf[1] = 'L'; + buf[2] = 'V'; + buf[3] = 0x01; // File version + buf[4] = ((audio ? 1 : 0) << 2) | (video ? 1 : 0); // Type flags (audio & video) + be_write_uint32(buf + 5, FLV_HEADER_SIZE); // Data offset + return FLV_HEADER_SIZE; +} + +int flv_tag_header_write(const struct flv_tag_header_t* tag, uint8_t* buf, size_t len) +{ + if (len < FLV_TAG_HEADER_SIZE) + { + assert(0); + return -1; + } + + // TagType + assert(FLV_TYPE_VIDEO == tag->type || FLV_TYPE_AUDIO == tag->type || FLV_TYPE_SCRIPT == tag->type); + buf[0] = (tag->type & 0x1F) | ((tag->filter & 0x01) << 5); + + // DataSize + buf[1] = (tag->size >> 16) & 0xFF; + buf[2] = (tag->size >> 8) & 0xFF; + buf[3] = tag->size & 0xFF; + + // Timestamp + buf[4] = (tag->timestamp >> 16) & 0xFF; + buf[5] = (tag->timestamp >> 8) & 0xFF; + buf[6] = (tag->timestamp >> 0) & 0xFF; + buf[7] = (tag->timestamp >> 24) & 0xFF; // Timestamp Extended + + // StreamID(Always 0) + buf[8] = (tag->streamId >> 16) & 0xFF; + buf[9] = (tag->streamId >> 8) & 0xFF; + buf[10] = (tag->streamId) & 0xFF; + + return FLV_TAG_HEADER_SIZE; +} + +int flv_audio_tag_header_write(const struct flv_audio_tag_header_t* audio, uint8_t* buf, size_t len) +{ + if ((int)len < 1 + ((FLV_AUDIO_AAC == audio->codecid || FLV_AUDIO_OPUS == audio->codecid)? 1 : 0)) + return -1; + + if (FLV_AUDIO_AAC == audio->codecid || FLV_AUDIO_OPUS == audio->codecid) + { + assert(FLV_SEQUENCE_HEADER == audio->avpacket || FLV_AVPACKET == audio->avpacket); + buf[0] = (audio->codecid /* <<4 */) /* SoundFormat */ | (3 << 2) /* 44k-SoundRate */ | (1 << 1) /* 16-bit samples */ | 1 /* Stereo sound */; + buf[1] = audio->avpacket; // AACPacketType + return 2; + } + else + { + buf[0] = (audio->codecid /* <<4 */) | ((audio->rate & 0x03) << 2) | ((audio->bits & 0x01) << 1) | (audio->channels & 0x01); + return 1; + } +} + +int flv_video_tag_header_write(const struct flv_video_tag_header_t* video, uint8_t* buf, size_t len) +{ + if (len < 1) + return -1; + + buf[0] = (video->keyframe << 4) /*FrameType*/ | (video->codecid & 0x0F) /*CodecID*/; + + if (FLV_VIDEO_H264 == video->codecid || FLV_VIDEO_H265 == video->codecid || FLV_VIDEO_H266 == video->codecid || FLV_VIDEO_AV1 == video->codecid) + { + assert(FLV_SEQUENCE_HEADER == video->avpacket || FLV_AVPACKET == video->avpacket || FLV_END_OF_SEQUENCE == video->avpacket); + if (len < 5) + return -1; + + buf[1] = video->avpacket; // AVCPacketType + buf[2] = (video->cts >> 16) & 0xFF; + buf[3] = (video->cts >> 8) & 0xFF; + buf[4] = video->cts & 0xFF; + return 5; + } + + return 1; +} + +int flv_data_tag_header_write(uint8_t* buf, size_t len) +{ + (void)buf; + (void)len; + return 0; +} + +int flv_tag_size_read(const uint8_t* buf, size_t len, uint32_t* size) +{ + if(len < 4) + return -1; + *size = be_read_uint32(buf); + return 4; +} + +int flv_tag_size_write(uint8_t* buf, size_t len, uint32_t size) +{ + if(len < 4) + return -1; + be_write_uint32(buf, size); + return 4; +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libflv/source/flv-muxer.c b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/flv-muxer.c new file mode 100644 index 000000000..d34cd33cb --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/flv-muxer.c @@ -0,0 +1,512 @@ +#include "flv-muxer.h" +#include "flv-proto.h" +#include "flv-header.h" +#include "amf0.h" +#include +#include +#include +#include +#include +#include +#include "aom-av1.h" +#include "mpeg4-aac.h" +#include "mpeg4-avc.h" +#include "mpeg4-vvc.h" +#include "mpeg4-hevc.h" +#include "mp3-header.h" +#include "opus-head.h" + +#define FLV_MUXER "ireader/media-server" + +struct flv_muxer_t +{ + flv_muxer_handler handler; + void* param; + + uint8_t audio_sequence_header; + uint8_t video_sequence_header; + + union + { + struct mpeg4_aac_t aac; + struct opus_head_t opus; + } a; + + union + { + struct aom_av1_t av1; + struct mpeg4_avc_t avc; + struct mpeg4_hevc_t hevc; + struct mpeg4_vvc_t vvc; + } v; + int vcl; // 0-non vcl, 1-idr, 2-p/b + int update; // avc/hevc sequence header update + + uint8_t* ptr; + size_t bytes; + size_t capacity; +}; + +struct flv_muxer_t* flv_muxer_create(flv_muxer_handler handler, void* param) +{ + struct flv_muxer_t* flv; + flv = (struct flv_muxer_t*)calloc(1, sizeof(struct flv_muxer_t)); + if (NULL == flv) + return NULL; + + flv_muxer_reset(flv); + flv->handler = handler; + flv->param = param; + return flv; +} + +void flv_muxer_destroy(struct flv_muxer_t* flv) +{ + if (flv->ptr) + { + assert(flv->capacity > 0); + free(flv->ptr); + flv->ptr = NULL; + } + + free(flv); +} + +int flv_muxer_reset(struct flv_muxer_t* flv) +{ + memset(&flv->v, 0, sizeof(flv->v)); + flv->audio_sequence_header = 0; + flv->video_sequence_header = 0; + return 0; +} + +static int flv_muxer_alloc(struct flv_muxer_t* flv, size_t bytes) +{ + void* p; + p = realloc(flv->ptr, bytes); + if (!p) + return -ENOMEM; + + flv->ptr = (uint8_t*)p; + flv->capacity = bytes; + return 0; +} + +int flv_muxer_g711a(struct flv_muxer_t* flv, const void* data, size_t bytes, uint32_t pts, uint32_t dts) +{ + struct flv_audio_tag_header_t audio; + (void)pts; + + if (flv->capacity < bytes + 1) + { + if (0 != flv_muxer_alloc(flv, bytes + 4)) + return -ENOMEM; + } + + audio.bits = FLV_SOUND_BIT_16; // 16-bit samples + audio.channels = FLV_SOUND_CHANNEL_MONO; + audio.rate = 0; + audio.codecid = FLV_AUDIO_G711A; + audio.avpacket = FLV_AVPACKET; + flv_audio_tag_header_write(&audio, flv->ptr, 1); + memcpy(flv->ptr + 1, data, bytes); + return flv->handler(flv->param, FLV_TYPE_AUDIO, flv->ptr, bytes + 1, dts); +} + +int flv_muxer_g711u(struct flv_muxer_t* flv, const void* data, size_t bytes, uint32_t pts, uint32_t dts) +{ + struct flv_audio_tag_header_t audio; + (void)pts; + + if (flv->capacity < bytes + 1) + { + if (0 != flv_muxer_alloc(flv, bytes + 4)) + return -ENOMEM; + } + + audio.bits = FLV_SOUND_BIT_16; // 16-bit samples + audio.channels = FLV_SOUND_CHANNEL_MONO; + audio.rate = 0; + audio.codecid = FLV_AUDIO_G711U; + audio.avpacket = FLV_AVPACKET; + flv_audio_tag_header_write(&audio, flv->ptr, 1); + memcpy(flv->ptr + 1, data, bytes); + return flv->handler(flv->param, FLV_TYPE_AUDIO, flv->ptr, bytes + 1, dts); +} + +int flv_muxer_mp3(struct flv_muxer_t* flv, const void* data, size_t bytes, uint32_t pts, uint32_t dts) +{ + struct mp3_header_t mp3; + struct flv_audio_tag_header_t audio; + (void)pts; + + if (0 == mp3_header_load(&mp3, data, (int)bytes)) + { + return -EINVAL; + } + else + { + audio.channels = 3 == mp3.mode ? FLV_SOUND_CHANNEL_MONO : FLV_SOUND_CHANNEL_STEREO; + switch (mp3_get_frequency(&mp3)) + { + case 5500: audio.rate = FLV_SOUND_RATE_5500; break; + case 11025: audio.rate = FLV_SOUND_RATE_11025; break; + case 22050: audio.rate = FLV_SOUND_RATE_22050; break; + case 44100: audio.rate = FLV_SOUND_RATE_44100; break; + default: audio.rate = FLV_SOUND_RATE_44100; + } + } + + if (flv->capacity < bytes + 1) + { + if (0 != flv_muxer_alloc(flv, bytes + 4)) + return -ENOMEM; + } + + audio.bits = FLV_SOUND_BIT_16; // 16-bit samples + audio.codecid = FLV_AUDIO_MP3; + audio.avpacket = FLV_AVPACKET; + flv_audio_tag_header_write(&audio, flv->ptr, 1); + memcpy(flv->ptr + 1, data, bytes); // MP3 + return flv->handler(flv->param, FLV_TYPE_AUDIO, flv->ptr, bytes + 1, dts); +} + +int flv_muxer_aac(struct flv_muxer_t* flv, const void* data, size_t bytes, uint32_t pts, uint32_t dts) +{ + int r, n, m; + struct flv_audio_tag_header_t audio; + (void)pts; + + if (flv->capacity < bytes + 2/*AudioTagHeader*/ + 2/*AudioSpecificConfig*/) + { + if (0 != flv_muxer_alloc(flv, bytes + 4)) + return -ENOMEM; + } + + /* ADTS */ + n = mpeg4_aac_adts_load(data, bytes, &flv->a.aac); + if (n <= 0) + return -1; // invalid data + + audio.codecid = FLV_AUDIO_AAC; + audio.rate = FLV_SOUND_RATE_44100; // 44k-SoundRate + audio.bits = FLV_SOUND_BIT_16; // 16-bit samples + audio.channels = FLV_SOUND_CHANNEL_STEREO; // Stereo sound + if (0 == flv->audio_sequence_header) + { + flv->audio_sequence_header = 1; // once only + audio.avpacket = FLV_SEQUENCE_HEADER; + + // AudioSpecificConfig(AAC sequence header) + flv_audio_tag_header_write(&audio, flv->ptr, flv->capacity); + m = mpeg4_aac_audio_specific_config_save(&flv->a.aac, flv->ptr + 2, flv->capacity - 2); + assert(m + 2 <= (int)flv->capacity); + r = flv->handler(flv->param, FLV_TYPE_AUDIO, flv->ptr, m + 2, dts); + if (0 != r) return r; + } + + audio.avpacket = FLV_AVPACKET; + flv_audio_tag_header_write(&audio, flv->ptr, flv->capacity); + memcpy(flv->ptr + 2, (uint8_t*)data + n, bytes - n); // AAC exclude ADTS + assert(bytes - n + 2 <= flv->capacity); + return flv->handler(flv->param, FLV_TYPE_AUDIO, flv->ptr, bytes - n + 2, dts); +} + +int flv_muxer_opus(flv_muxer_t* flv, const void* data, size_t bytes, uint32_t pts, uint32_t dts) +{ + int r, m; + struct flv_audio_tag_header_t audio; + (void)pts; + + if (flv->capacity < bytes + 2/*AudioTagHeader*/ + 29/*OpusHead*/) + { + if (0 != flv_muxer_alloc(flv, bytes + 4)) + return -ENOMEM; + } + + audio.codecid = FLV_AUDIO_OPUS; + audio.rate = FLV_SOUND_RATE_44100; // 44k-SoundRate + audio.bits = FLV_SOUND_BIT_16; // 16-bit samples + audio.channels = FLV_SOUND_CHANNEL_STEREO; // Stereo sound + + if (0 == flv->audio_sequence_header) + { + if (opus_head_load(data, bytes, &flv->a.opus) < 0) + return -1; + + flv->audio_sequence_header = 1; // once only + audio.avpacket = FLV_SEQUENCE_HEADER; + + // Opus Head + m = flv_audio_tag_header_write(&audio, flv->ptr, flv->capacity); + m += opus_head_save(&flv->a.opus, flv->ptr+m, flv->capacity-m); + assert(m <= (int)flv->capacity); + r = flv->handler(flv->param, FLV_TYPE_AUDIO, flv->ptr, m, dts); + if (0 != r) return r; + } + + audio.avpacket = FLV_AVPACKET; + m = flv_audio_tag_header_write(&audio, flv->ptr, flv->capacity); + memcpy(flv->ptr + m, (uint8_t*)data, bytes); + assert(bytes - m <= flv->capacity); + return flv->handler(flv->param, FLV_TYPE_AUDIO, flv->ptr, bytes + m, dts); +} + +static int flv_muxer_h264(struct flv_muxer_t* flv, uint32_t pts, uint32_t dts) +{ + int r; + int m; + struct flv_video_tag_header_t video; + + video.codecid = FLV_VIDEO_H264; + if ( /*0 == flv->video_sequence_header &&*/ flv->update && flv->v.avc.nb_sps > 0 && flv->v.avc.nb_pps > 0) + { + video.cts = 0; + video.keyframe = 1; // keyframe + video.avpacket = FLV_SEQUENCE_HEADER; + flv_video_tag_header_write(&video, flv->ptr + flv->bytes, flv->capacity - flv->bytes); + m = mpeg4_avc_decoder_configuration_record_save(&flv->v.avc, flv->ptr + flv->bytes + 5, flv->capacity - flv->bytes - 5); + if (m <= 0) + return -1; // invalid data + + flv->video_sequence_header = 1; // once only + assert(flv->bytes + m + 5 <= flv->capacity); + r = flv->handler(flv->param, FLV_TYPE_VIDEO, flv->ptr + flv->bytes, m + 5, dts); + if (0 != r) return r; + } + + // has video frame + if (flv->vcl && flv->video_sequence_header) + { + video.cts = pts - dts; + video.keyframe = 1 == flv->vcl ? FLV_VIDEO_KEY_FRAME : FLV_VIDEO_INTER_FRAME; + video.avpacket = FLV_AVPACKET; + flv_video_tag_header_write(&video, flv->ptr, flv->capacity); + assert(flv->bytes <= flv->capacity); + return flv->handler(flv->param, FLV_TYPE_VIDEO, flv->ptr, flv->bytes, dts); + } + return 0; +} + +int flv_muxer_avc(struct flv_muxer_t* flv, const void* data, size_t bytes, uint32_t pts, uint32_t dts) +{ + if (flv->capacity < bytes + sizeof(flv->v.avc) /*AVCDecoderConfigurationRecord*/) + { + if (0 != flv_muxer_alloc(flv, bytes + sizeof(flv->v.avc))) + return -ENOMEM; + } + + flv->bytes = 5; + flv->bytes += h264_annexbtomp4(&flv->v.avc, data, bytes, flv->ptr + flv->bytes, flv->capacity - flv->bytes, &flv->vcl, &flv->update); + if (flv->bytes <= 5) + return -ENOMEM; + + return flv_muxer_h264(flv, pts, dts); +} + +static int flv_muxer_h265(struct flv_muxer_t* flv, uint32_t pts, uint32_t dts) +{ + int r; + int m; + struct flv_video_tag_header_t video; + + video.codecid = FLV_VIDEO_H265; + if ( /*0 == flv->avc_sequence_header &&*/ flv->update && flv->v.hevc.numOfArrays >= 3) // vps + sps + pps + { + video.cts = 0; + video.keyframe = 1; // keyframe + video.avpacket = FLV_SEQUENCE_HEADER; + flv_video_tag_header_write(&video, flv->ptr + flv->bytes, flv->capacity - flv->bytes); + m = mpeg4_hevc_decoder_configuration_record_save(&flv->v.hevc, flv->ptr + flv->bytes + 5, flv->capacity - flv->bytes - 5); + if (m <= 0) + return -1; // invalid data + + flv->video_sequence_header = 1; // once only + assert(flv->bytes + m + 5 <= flv->capacity); + r = flv->handler(flv->param, FLV_TYPE_VIDEO, flv->ptr + flv->bytes, m + 5, dts); + if (0 != r) return r; + } + + // has video frame + if (flv->vcl && flv->video_sequence_header) + { + video.cts = pts - dts; + video.keyframe = 1 == flv->vcl ? FLV_VIDEO_KEY_FRAME : FLV_VIDEO_INTER_FRAME; + video.avpacket = FLV_AVPACKET; + flv_video_tag_header_write(&video, flv->ptr, flv->capacity); + assert(flv->bytes <= flv->capacity); + return flv->handler(flv->param, FLV_TYPE_VIDEO, flv->ptr, flv->bytes, dts); + } + return 0; +} + +int flv_muxer_hevc(struct flv_muxer_t* flv, const void* data, size_t bytes, uint32_t pts, uint32_t dts) +{ + if ((size_t)flv->capacity < bytes + sizeof(flv->v.hevc) /*HEVCDecoderConfigurationRecord*/) + { + if (0 != flv_muxer_alloc(flv, bytes + sizeof(flv->v.hevc))) + return -ENOMEM; + } + + flv->bytes = 5; + flv->bytes += h265_annexbtomp4(&flv->v.hevc, data, bytes, flv->ptr + flv->bytes, flv->capacity - flv->bytes, &flv->vcl, &flv->update); + if (flv->bytes <= 5) + return -ENOMEM; + + return flv_muxer_h265(flv, pts, dts); +} + +static int flv_muxer_h266(struct flv_muxer_t* flv, uint32_t pts, uint32_t dts) +{ + int r; + int m; + struct flv_video_tag_header_t video; + + video.codecid = FLV_VIDEO_H266; + if ( /*0 == flv->avc_sequence_header &&*/ flv->update && flv->v.vvc.numOfArrays >= 3) // vps + sps + pps + { + video.cts = 0; + video.keyframe = 1; // keyframe + video.avpacket = FLV_SEQUENCE_HEADER; + flv_video_tag_header_write(&video, flv->ptr + flv->bytes, flv->capacity - flv->bytes); + m = mpeg4_vvc_decoder_configuration_record_save(&flv->v.vvc, flv->ptr + flv->bytes + 5, flv->capacity - flv->bytes - 5); + if (m <= 0) + return -1; // invalid data + + flv->video_sequence_header = 1; // once only + assert(flv->bytes + m + 5 <= flv->capacity); + r = flv->handler(flv->param, FLV_TYPE_VIDEO, flv->ptr + flv->bytes, m + 5, dts); + if (0 != r) return r; + } + + // has video frame + if (flv->vcl && flv->video_sequence_header) + { + video.cts = pts - dts; + video.keyframe = 1 == flv->vcl ? FLV_VIDEO_KEY_FRAME : FLV_VIDEO_INTER_FRAME; + video.avpacket = FLV_AVPACKET; + flv_video_tag_header_write(&video, flv->ptr, flv->capacity); + assert(flv->bytes <= flv->capacity); + return flv->handler(flv->param, FLV_TYPE_VIDEO, flv->ptr, flv->bytes, dts); + } + return 0; +} + +int flv_muxer_vvc(struct flv_muxer_t* flv, const void* data, size_t bytes, uint32_t pts, uint32_t dts) +{ + if ((size_t)flv->capacity < bytes + sizeof(flv->v.vvc) /*HEVCDecoderConfigurationRecord*/) + { + if (0 != flv_muxer_alloc(flv, bytes + sizeof(flv->v.vvc))) + return -ENOMEM; + } + + flv->bytes = 5; + flv->bytes += h266_annexbtomp4(&flv->v.vvc, data, bytes, flv->ptr + flv->bytes, flv->capacity - flv->bytes, &flv->vcl, &flv->update); + if (flv->bytes <= 5) + return -ENOMEM; + + return flv_muxer_h266(flv, pts, dts); +} + +int flv_muxer_av1(flv_muxer_t* flv, const void* data, size_t bytes, uint32_t pts, uint32_t dts) +{ + int r; + int m; + struct flv_video_tag_header_t video; + + if ((size_t)flv->capacity < bytes + 5 + sizeof(flv->v.av1) /*HEVCDecoderConfigurationRecord*/) + { + if (0 != flv_muxer_alloc(flv, bytes + sizeof(flv->v.av1))) + return -ENOMEM; + } + + video.codecid = FLV_VIDEO_AV1; + if (0 == flv->video_sequence_header) + { + // load av1 information + r = aom_av1_codec_configuration_record_init(&flv->v.av1, data, bytes); + if (0 != r || flv->v.av1.width < 1 || flv->v.av1.height < 1) + return 0 == r ? -1 : r; + + video.cts = 0; + video.keyframe = 1; // keyframe + video.avpacket = FLV_SEQUENCE_HEADER; + flv_video_tag_header_write(&video, flv->ptr + flv->bytes, flv->capacity - flv->bytes); + m = aom_av1_codec_configuration_record_save(&flv->v.av1, flv->ptr + flv->bytes + 5, flv->capacity - flv->bytes - 5); + if (m <= 0) + return -1; // invalid data + + flv->video_sequence_header = 1; // once only + assert(flv->bytes + m + 5 <= flv->capacity); + r = flv->handler(flv->param, FLV_TYPE_VIDEO, flv->ptr + flv->bytes, m + 5, dts); + if (0 != r) return r; + } + + // has video frame + if (flv->video_sequence_header) + { + video.cts = pts - dts; + video.keyframe = 1 == flv->vcl ? FLV_VIDEO_KEY_FRAME : FLV_VIDEO_INTER_FRAME; + video.avpacket = FLV_AVPACKET; + flv_video_tag_header_write(&video, flv->ptr, flv->capacity); + memcpy(flv->ptr + 5, data, bytes); + return flv->handler(flv->param, FLV_TYPE_VIDEO, flv->ptr, bytes + 5, dts); + } + return 0; +} + +int flv_muxer_metadata(flv_muxer_t* flv, const struct flv_metadata_t* metadata) +{ + uint8_t* ptr, *end; + uint32_t count; + + if (!metadata) return -1; + + if (flv->capacity < 1024) + { + if (0 != flv_muxer_alloc(flv, 1024)) + return -ENOMEM; + } + + ptr = flv->ptr; + end = flv->ptr + flv->capacity; + count = (metadata->audiocodecid ? 5 : 0) + (metadata->videocodecid ? 7 : 0) + 1; + + // ScriptTagBody + + // name + ptr = AMFWriteString(ptr, end, "onMetaData", 10); + + // value: SCRIPTDATAECMAARRAY + ptr[0] = AMF_ECMA_ARRAY; + ptr[1] = (uint8_t)((count >> 24) & 0xFF);; + ptr[2] = (uint8_t)((count >> 16) & 0xFF);; + ptr[3] = (uint8_t)((count >> 8) & 0xFF); + ptr[4] = (uint8_t)(count & 0xFF); + ptr += 5; + + if (metadata->audiocodecid) + { + ptr = AMFWriteNamedDouble(ptr, end, "audiocodecid", 12, metadata->audiocodecid); + ptr = AMFWriteNamedDouble(ptr, end, "audiodatarate", 13, metadata->audiodatarate /* / 1024.0*/); + ptr = AMFWriteNamedDouble(ptr, end, "audiosamplerate", 15, metadata->audiosamplerate); + ptr = AMFWriteNamedDouble(ptr, end, "audiosamplesize", 15, metadata->audiosamplesize); + ptr = AMFWriteNamedBoolean(ptr, end, "stereo", 6, (uint8_t)metadata->stereo); + } + + if (metadata->videocodecid) + { + ptr = AMFWriteNamedDouble(ptr, end, "duration", 8, metadata->duration); + ptr = AMFWriteNamedDouble(ptr, end, "interval", 8, metadata->interval); + ptr = AMFWriteNamedDouble(ptr, end, "videocodecid", 12, metadata->videocodecid); + ptr = AMFWriteNamedDouble(ptr, end, "videodatarate", 13, metadata->videodatarate /* / 1024.0*/); + ptr = AMFWriteNamedDouble(ptr, end, "framerate", 9, metadata->framerate); + ptr = AMFWriteNamedDouble(ptr, end, "height", 6, metadata->height); + ptr = AMFWriteNamedDouble(ptr, end, "width", 5, metadata->width); + } + + ptr = AMFWriteNamedString(ptr, end, "encoder", 7, FLV_MUXER, strlen(FLV_MUXER)); + ptr = AMFWriteObjectEnd(ptr, end); + + return flv->handler(flv->param, FLV_TYPE_SCRIPT, flv->ptr, ptr - flv->ptr, 0); +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libflv/source/flv-parser.c b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/flv-parser.c new file mode 100644 index 000000000..4cb78bf64 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/flv-parser.c @@ -0,0 +1,261 @@ +#include "flv-parser.h" +#include "flv-header.h" +#include "flv-proto.h" +#include +#include +#include +#include + +#define N_TAG_SIZE 4 // previous tag size +#define FLV_HEADER_SIZE 9 // DataOffset included +#define FLV_TAG_HEADER_SIZE 11 // StreamID included + +#define FLV_VIDEO_CODEC_NAME(codecid) (FLV_VIDEO_H264==(codecid) ? FLV_VIDEO_AVCC : (FLV_VIDEO_H265==(codecid) ? FLV_VIDEO_HVCC : (FLV_VIDEO_H266==(codecid) ? FLV_VIDEO_VVCC : FLV_VIDEO_AV1C))) + +static int flv_parser_audio(struct flv_audio_tag_header_t* audio, const uint8_t* data, size_t bytes, uint32_t timestamp, flv_parser_handler handler, void* param) +{ + if (FLV_SEQUENCE_HEADER == audio->avpacket) + return handler(param, FLV_AUDIO_AAC == audio->codecid ? FLV_AUDIO_ASC : FLV_AUDIO_OPUS_HEAD, data, bytes, timestamp, timestamp, 0); + else + return handler(param, audio->codecid, data, bytes, timestamp, timestamp, 0); +} + +static int flv_parser_video(struct flv_video_tag_header_t* video, const uint8_t* data, size_t bytes, uint32_t timestamp, flv_parser_handler handler, void* param) +{ + if (FLV_VIDEO_H264 == video->codecid || FLV_VIDEO_H265 == video->codecid || FLV_VIDEO_H266 == video->codecid || FLV_VIDEO_AV1 == video->codecid) + { + if (FLV_SEQUENCE_HEADER == video->avpacket) + { + return handler(param, FLV_VIDEO_CODEC_NAME(video->codecid), data, bytes, timestamp, timestamp, 0); + } + else if (FLV_AVPACKET == video->avpacket) + { + return handler(param, video->codecid, data, bytes, timestamp + video->cts, timestamp, (FLV_VIDEO_KEY_FRAME == video->keyframe) ? 1 : 0); + } + else if (FLV_END_OF_SEQUENCE == video->avpacket) + { + return 0; // AVC end of sequence (lower level NALU sequence ender is not required or supported) + } + else + { + assert(0); + return -EINVAL; + } + } + else + { + // Video frame data + return handler(param, video->codecid, data, bytes, timestamp, timestamp, (FLV_VIDEO_KEY_FRAME == video->keyframe) ? 1 : 0); + } +} + +// http://www.cnblogs.com/musicfans/archive/2012/11/07/2819291.html +// metadata keyframes/filepositions +static int flv_parser_script(const uint8_t* data, size_t bytes, uint32_t timestamp, flv_parser_handler handler, void* param) +{ + return handler(param, FLV_SCRIPT_METADATA, data, bytes, timestamp, timestamp, 0); +} + +int flv_parser_tag(int type, const void* data, size_t bytes, uint32_t timestamp, flv_parser_handler handler, void* param) +{ + int n; + struct flv_audio_tag_header_t audio; + struct flv_video_tag_header_t video; + + if (bytes < 1) return -EINVAL; + + switch (type) + { + case FLV_TYPE_AUDIO: + n = flv_audio_tag_header_read(&audio, data, bytes); + if (n < 0) + return n; + return flv_parser_audio(&audio, (const uint8_t*)data + n, (int)bytes - n, timestamp, handler, param); + + case FLV_TYPE_VIDEO: + n = flv_video_tag_header_read(&video, data, bytes); + if (n < 0) + return n; + return flv_parser_video(&video, (const uint8_t*)data + n, (int)bytes - n, timestamp, handler, param); + + case FLV_TYPE_SCRIPT: + n = flv_data_tag_header_read(data, bytes); + if (n < 0) + return n; + return flv_parser_script((const uint8_t*)data + n, (int)bytes - n, timestamp, handler, param); + + default: + assert(0); + return -1; + } +} + +static size_t flv_parser_append(struct flv_parser_t* parser, const uint8_t* data, size_t bytes, size_t expect) +{ + size_t n; + if (parser->bytes > expect || expect > sizeof(parser->ptr)) + { + // invalid status, consume all + assert(0); + parser->bytes = expect; + return bytes; + } + + n = parser->bytes + bytes >= expect ? expect - parser->bytes : bytes; + if (n > 0) + { + memcpy(parser->ptr + parser->bytes, data, n); + parser->bytes += n; + } + return n; +} + +int flv_parser_input(struct flv_parser_t* parser, const uint8_t* data, size_t bytes, flv_parser_handler handler, void* param) +{ + int r; + size_t n; + uint8_t codec; + uint32_t size; + enum {FLV_HEADER=0, FLV_HEADER_OFFSET, FLV_PREVIOUS_SIZE, FLV_TAG_HEADER, FLV_AVHEADER_CODEC, FLV_AVHEADER_EXTRA, FLV_TAG_BODY}; + + for (n = r = 0; bytes > 0 && n >= 0 && 0 == r; data += n, bytes -= n) + { + switch (parser->state) + { + case FLV_HEADER: + n = flv_parser_append(parser, data, bytes, FLV_HEADER_SIZE); + if (FLV_HEADER_SIZE == parser->bytes) + { + flv_header_read(&parser->header, parser->ptr, parser->bytes); + if (parser->header.offset < 9 || parser->header.offset > sizeof(parser->ptr)) + return -1; + parser->header.offset -= 9; + parser->state = parser->header.offset > 0 ? FLV_HEADER_OFFSET : FLV_PREVIOUS_SIZE; + parser->bytes = 0; + } + break; + + case FLV_HEADER_OFFSET: + n = flv_parser_append(parser, data, bytes, parser->header.offset); + if (parser->header.offset == (uint32_t)parser->bytes) + { + parser->bytes = 0; + parser->state = FLV_PREVIOUS_SIZE; + } + break; + + case FLV_PREVIOUS_SIZE: + n = flv_parser_append(parser, data, bytes, N_TAG_SIZE); + if (N_TAG_SIZE == parser->bytes) + { + flv_tag_size_read(parser->ptr, parser->bytes, &size); + assert(size == 0 || size == parser->tag.size + FLV_TAG_HEADER_SIZE); + parser->bytes = 0; + parser->state = FLV_TAG_HEADER; + } + break; + + case FLV_TAG_HEADER: + n = flv_parser_append(parser, data, bytes, FLV_TAG_HEADER_SIZE); + if (FLV_TAG_HEADER_SIZE == parser->bytes) + { + flv_tag_header_read(&parser->tag, parser->ptr, parser->bytes); + parser->bytes = 0; + parser->expect = 0; + parser->state = FLV_AVHEADER_CODEC; + } + break; + + case FLV_AVHEADER_CODEC: + switch (parser->tag.type) + { + case FLV_TYPE_AUDIO: + parser->expect = 1; + n = flv_parser_append(parser, data, bytes, 1); + codec = (parser->ptr[0] & 0xF0) /*>> 4*/; + if (FLV_AUDIO_AAC == codec || FLV_AUDIO_OPUS == codec) + parser->expect = 2; + break; + + case FLV_TYPE_VIDEO: + parser->expect = 1; + n = flv_parser_append(parser, data, bytes, 1); + codec = (parser->ptr[0] & 0x0F); + if (FLV_VIDEO_H264 == codec || FLV_VIDEO_H265 == codec || FLV_VIDEO_H266 == codec || FLV_VIDEO_AV1 == codec) + parser->expect = 5; + break; + + case FLV_TYPE_SCRIPT: + parser->expect = 0; + n = 0; // noops + break; + + default: + assert(0); + return -1; // invalid flv file + } + parser->state = FLV_AVHEADER_EXTRA; + break; + + case FLV_AVHEADER_EXTRA: + n = flv_parser_append(parser, data, bytes, parser->expect); + if (parser->expect == parser->bytes) + { + if(FLV_TYPE_AUDIO == parser->tag.type) + flv_audio_tag_header_read(&parser->audio, parser->ptr, parser->bytes); + else if(FLV_TYPE_VIDEO == parser->tag.type) + flv_video_tag_header_read(&parser->video, parser->ptr, parser->bytes); + parser->bytes = 0; + parser->state = FLV_TAG_BODY; + + parser->expect = parser->tag.size - parser->expect; + parser->body = parser->alloc ? parser->alloc(param, parser->expect) : malloc(parser->expect); + if (!parser->body) + return -1; + } + break; + + case FLV_TAG_BODY: + assert(parser->body && parser->bytes <= parser->expect); + n = parser->bytes + bytes >= parser->expect ? parser->expect - parser->bytes : bytes; + if(n > 0) { + memmove(parser->body + parser->bytes, data, n); + parser->bytes += n; + } + + if (parser->expect == parser->bytes) + { + parser->bytes = 0; + parser->state = FLV_PREVIOUS_SIZE; + switch (parser->tag.type) + { + case FLV_TYPE_AUDIO: + r = flv_parser_audio(&parser->audio, parser->body, parser->expect, parser->tag.timestamp, handler, param); + break; + + case FLV_TYPE_VIDEO: + r = flv_parser_video(&parser->video, parser->body, parser->expect, parser->tag.timestamp, handler, param); + break; + + case FLV_TYPE_SCRIPT: + r = flv_parser_script(parser->body, parser->expect, parser->tag.timestamp, handler, param); + break; + + default: + assert(0); + r = -1; + break; + } + + parser->free ? parser->free(param, parser->body) : free(parser->body); + } + break; + + default: + assert(0); + return -1; + } + } + + return r; +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libflv/source/flv-reader.c b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/flv-reader.c new file mode 100644 index 000000000..bdf0d8264 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/flv-reader.c @@ -0,0 +1,135 @@ +#include "flv-reader.h" +#include "flv-header.h" +#include "flv-proto.h" +#include +#include +#include +#include + +#define FLV_HEADER_SIZE 9 // DataOffset included +#define FLV_TAG_HEADER_SIZE 11 // StreamID included + +struct flv_reader_t +{ + FILE* fp; + int (*read)(void* param, void* buf, int len); + void* param; +}; + +static int flv_read_header(struct flv_reader_t* flv) +{ + uint32_t sz; + uint8_t data[FLV_HEADER_SIZE]; + struct flv_header_t h; + int n; + + if (FLV_HEADER_SIZE != flv->read(flv->param, data, FLV_HEADER_SIZE)) + return -1; + + if(FLV_HEADER_SIZE != flv_header_read(&h, data, FLV_HEADER_SIZE)) + return -1; + + assert(h.offset >= FLV_HEADER_SIZE && h.offset < FLV_HEADER_SIZE + 4096); + for(n = (int)(h.offset - FLV_HEADER_SIZE); n > 0 && n < 4096; n -= sizeof(data)) + flv->read(flv->param, data, n >= sizeof(data) ? sizeof(data) : n); // skip + + // PreviousTagSize0 + if (4 != flv->read(flv->param, data, 4)) + return -1; + + flv_tag_size_read(data, 4, &sz); + assert(0 == sz); + return 0 == sz ? 0 : -1; +} + +static int file_read(void* param, void* buf, int len) +{ + return (int)fread(buf, 1, len, (FILE*)param); +} + +void* flv_reader_create(const char* file) +{ + FILE* fp; + struct flv_reader_t* flv; + fp = fopen(file, "rb"); + if (!fp) + return NULL; + + flv = flv_reader_create2(file_read, fp); + if (!flv) + { + fclose(fp); + return NULL; + } + + flv->fp = fp; + return flv; +} + +void* flv_reader_create2(int (*read)(void* param, void* buf, int len), void* param) +{ + struct flv_reader_t* flv; + flv = (struct flv_reader_t*)calloc(1, sizeof(*flv)); + if (!flv) + return NULL; + + flv->read = read; + flv->param = param; + if (0 != flv_read_header(flv)) + { + flv_reader_destroy(flv); + return NULL; + } + + return flv; +} + +void flv_reader_destroy(void* p) +{ + struct flv_reader_t* flv; + flv = (struct flv_reader_t*)p; + if (NULL != flv) + { + if (flv->fp) + fclose(flv->fp); + free(flv); + } +} + +int flv_reader_read(void* p, int* tagtype, uint32_t* timestamp, size_t* taglen, void* buffer, size_t bytes) +{ + int r; + uint32_t sz; + uint8_t header[FLV_TAG_HEADER_SIZE]; + struct flv_tag_header_t tag; + struct flv_reader_t* flv; + flv = (struct flv_reader_t*)p; + + r = flv->read(flv->param, &header, FLV_TAG_HEADER_SIZE); + if (r != FLV_TAG_HEADER_SIZE) + return r < 0 ? r : 0; // 0-EOF + + if (FLV_TAG_HEADER_SIZE != flv_tag_header_read(&tag, header, FLV_TAG_HEADER_SIZE)) + return -1; + + if (bytes < tag.size) + return -1; + + // FLV stream + r = flv->read(flv->param, buffer, tag.size); + if(tag.size != (uint32_t)r) + return r < 0 ? r : 0; // 0-EOF + + // PreviousTagSizeN + r = flv->read(flv->param, header, 4); + if (4 != r) + return r < 0 ? r : 0; // 0-EOF + + *taglen = tag.size; + *tagtype = tag.type; + *timestamp = tag.timestamp; + flv_tag_size_read(header, 4, &sz); + assert(0 == tag.streamId); // StreamID Always 0 + assert(sz == tag.size + FLV_TAG_HEADER_SIZE); + return (sz == tag.size + FLV_TAG_HEADER_SIZE) ? 1 : -1; +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libflv/source/flv-writer.c b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/flv-writer.c new file mode 100644 index 000000000..37186e30c --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/flv-writer.c @@ -0,0 +1,162 @@ +#include "flv-writer.h" +#include "flv-header.h" +#include "flv-proto.h" +#include +#include +#include +#include + +#define FLV_HEADER_SIZE 9 // DataOffset included +#define FLV_TAG_HEADER_SIZE 11 // StreamID included + +struct flv_writer_t +{ + FILE* fp; + flv_writer_onwrite write; + void* param; +}; + +static int flv_write_header(int audio, int video, struct flv_writer_t* flv) +{ + struct flv_vec_t vec[1]; + uint8_t header[FLV_HEADER_SIZE + 4]; + flv_header_write(audio, video, header, FLV_HEADER_SIZE); + flv_tag_size_write(header + FLV_HEADER_SIZE, 4, 0); // PreviousTagSize0(Always 0) + vec[0].ptr = header; + vec[0].len = sizeof(header); + return flv->write(flv->param, vec, 1); +} + +static int flv_write_eos(struct flv_writer_t* flv) +{ + int n; + uint8_t header[16]; + struct flv_video_tag_header_t video; + memset(&video, 0, sizeof(video)); + video.codecid = FLV_VIDEO_H264; + video.keyframe = FLV_VIDEO_KEY_FRAME; + video.avpacket = FLV_END_OF_SEQUENCE; + video.cts = 0; + + n = flv_video_tag_header_write(&video, header, sizeof(header)); + return n > 0 ? flv_writer_input(flv, FLV_TYPE_VIDEO, header, n, 0) : -1; +} + +static int file_write(void* param, const struct flv_vec_t* vec, int n) +{ + int i; + for(i = 0; i < n; i++) + { + if (vec[i].len != (int)fwrite(vec[i].ptr, 1, vec[i].len, (FILE*)param)) + return ferror((FILE*)param); + } + return 0; +} + +void* flv_writer_create(const char* file) +{ + FILE* fp; + struct flv_writer_t* flv; + fp = fopen(file, "wb"); + if (!fp) + return NULL; + + flv = flv_writer_create2(1, 1, file_write, fp); + if (!flv) + { + fclose(fp); + return NULL; + } + + flv->fp = fp; + return flv; +} + +void* flv_writer_create2(int audio, int video, flv_writer_onwrite write, void* param) +{ + struct flv_writer_t* flv; + flv = (struct flv_writer_t*)calloc(1, sizeof(*flv)); + if (!flv) + return NULL; + + flv->write = write; + flv->param = param; + if (0 != flv_write_header(audio, video, flv)) + { + flv_writer_destroy(flv); + return NULL; + } + + return flv; +} + +void flv_writer_destroy(void* p) +{ + struct flv_writer_t* flv; + flv = (struct flv_writer_t*)p; + + if (NULL != flv) + { + flv_write_eos(flv); + if (flv->fp) + fclose(flv->fp); + free(flv); + } +} + +int flv_writer_input(void* p, int type, const void* data, size_t bytes, uint32_t timestamp) +{ + uint8_t buf[FLV_TAG_HEADER_SIZE + 4]; + struct flv_vec_t vec[3]; + struct flv_writer_t* flv; + struct flv_tag_header_t tag; + flv = (struct flv_writer_t*)p; + + memset(&tag, 0, sizeof(tag)); + tag.size = (int)bytes; + tag.type = (uint8_t)type; + tag.timestamp = timestamp; + flv_tag_header_write(&tag, buf, FLV_TAG_HEADER_SIZE); + flv_tag_size_write(buf + FLV_TAG_HEADER_SIZE, 4, (uint32_t)bytes + FLV_TAG_HEADER_SIZE); + + vec[0].ptr = buf; // FLV Tag Header + vec[0].len = FLV_TAG_HEADER_SIZE; + vec[1].ptr = (void*)data; + vec[1].len = (int)bytes; + vec[2].ptr = buf + FLV_TAG_HEADER_SIZE; // TAG size + vec[2].len = 4; + return flv->write(flv->param, vec, 3); +} + +int flv_writer_input_v(void* p, int type, const struct flv_vec_t* v, int n, uint32_t timestamp) +{ + int i; + uint8_t buf[FLV_TAG_HEADER_SIZE + 4]; + struct flv_vec_t vec[8]; + struct flv_writer_t* flv; + struct flv_tag_header_t tag; + flv = (struct flv_writer_t*)p; + + memset(&tag, 0, sizeof(tag)); + tag.size = 0; + tag.type = (uint8_t)type; + tag.timestamp = timestamp; + + assert(n + 2 <= sizeof(vec) / sizeof(vec[0])); + for (i = 0; i < n && i + 2 < sizeof(vec)/sizeof(vec[0]); i++) + { + tag.size += v[i].len; + vec[i+1].ptr = v[i].ptr; + vec[i+1].len = v[i].len; + } + + vec[0].ptr = buf; // FLV Tag Header + vec[0].len = FLV_TAG_HEADER_SIZE; + vec[n + 1].ptr = buf + FLV_TAG_HEADER_SIZE; // TAG size + vec[n + 1].len = 4; + + flv_tag_header_write(&tag, buf, FLV_TAG_HEADER_SIZE); + flv_tag_size_write(buf + FLV_TAG_HEADER_SIZE, 4, (uint32_t)tag.size + FLV_TAG_HEADER_SIZE); + + return flv->write(flv->param, vec, n+2); +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libflv/source/hevc-annexbtomp4.c b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/hevc-annexbtomp4.c new file mode 100644 index 000000000..016192eef --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/hevc-annexbtomp4.c @@ -0,0 +1,467 @@ +#include "mpeg4-hevc.h" +#include "mpeg4-avc.h" +#include +#include + +#define H265_NAL_BLA_W_LP 16 +#define H265_NAL_RSV_IRAP 23 +#define H265_NAL_VPS 32 +#define H265_NAL_SPS 33 +#define H265_NAL_PPS 34 +#define H265_NAL_AUD 35 +#define H265_NAL_SEI_PREFIX 39 +#define H265_NAL_SEI_SUFFIX 40 + +#define MAX(x, y) ((x) > (y) ? (x) : (y)) + +#define BIT(ptr, off) (((ptr)[(off) / 8] >> (7 - ((off) % 8))) & 0x01) + +struct h265_annexbtomp4_handle_t +{ + struct mpeg4_hevc_t* hevc; + int errcode; + int* update; // avc sps/pps update flags + int* vcl; + + uint8_t* out; + size_t bytes; + size_t capacity; +}; + +uint8_t mpeg4_h264_read_ue(const uint8_t* data, size_t bytes, size_t* offset); + +static size_t hevc_rbsp_decode(const uint8_t* nalu, size_t bytes, uint8_t* sodb, size_t len) +{ + size_t i, j; + const size_t max_sps_luma_bit_depth_offset = 256; + for (j = i = 0; i < bytes && j < len && i < max_sps_luma_bit_depth_offset; i++) + { + if (i + 2 < bytes && 0 == nalu[i] && 0 == nalu[i + 1] && 0x03 == nalu[i + 2]) + { + sodb[j++] = nalu[i]; + sodb[j++] = nalu[i + 1]; + i += 2; + } + else + { + sodb[j++] = nalu[i]; + } + } + return j; +} + +static int hevc_profile_tier_level(const uint8_t* nalu, size_t bytes, uint8_t maxNumSubLayersMinus1, struct mpeg4_hevc_t* hevc) +{ + size_t n; + uint8_t i; + uint8_t sub_layer_profile_present_flag[8]; + uint8_t sub_layer_level_present_flag[8]; + + if (bytes < 12) + return -1; + + hevc->general_profile_space = (nalu[0] >> 6) & 0x03; + hevc->general_tier_flag = (nalu[0] >> 5) & 0x01; + hevc->general_profile_idc = nalu[0] & 0x1f; + + hevc->general_profile_compatibility_flags = 0; + hevc->general_profile_compatibility_flags |= nalu[1] << 24; + hevc->general_profile_compatibility_flags |= nalu[2] << 16; + hevc->general_profile_compatibility_flags |= nalu[3] << 8; + hevc->general_profile_compatibility_flags |= nalu[4]; + + hevc->general_constraint_indicator_flags = 0; + hevc->general_constraint_indicator_flags |= ((uint64_t)nalu[5]) << 40; + hevc->general_constraint_indicator_flags |= ((uint64_t)nalu[6]) << 32; + hevc->general_constraint_indicator_flags |= ((uint64_t)nalu[7]) << 24; + hevc->general_constraint_indicator_flags |= ((uint64_t)nalu[8]) << 16; + hevc->general_constraint_indicator_flags |= ((uint64_t)nalu[9]) << 8; + hevc->general_constraint_indicator_flags |= nalu[10]; + + hevc->general_level_idc = nalu[11]; + if (maxNumSubLayersMinus1 < 1) + return 12; + + if (bytes < 14) + return -1; // error + + for (i = 0; i < maxNumSubLayersMinus1; i++) + { + sub_layer_profile_present_flag[i] = BIT(nalu, 12 * 8 + i * 2); + sub_layer_level_present_flag[i] = BIT(nalu, 12 * 8 + i * 2 + 1); + } + + n = 12 + 2; + for (i = 0; i < maxNumSubLayersMinus1; i++) + { + if(sub_layer_profile_present_flag[i]) + n += 11; + if (sub_layer_level_present_flag[i]) + n += 1; + } + + return bytes >= n ? (int)n : -1; +} + +static uint8_t hevc_vps_id(const uint8_t* rbsp, size_t bytes, struct mpeg4_hevc_t* hevc, uint8_t* ptr, size_t len) +{ + size_t sodb; + uint8_t vps; + uint8_t vps_max_sub_layers_minus1; + uint8_t vps_temporal_id_nesting_flag; + + sodb = hevc_rbsp_decode(rbsp, bytes, ptr, len); + if (sodb < 16 + 2) + return 0xFF; + + vps = ptr[2] >> 4; // 2-nalu type + vps_max_sub_layers_minus1 = (ptr[3] >> 1) & 0x07; + vps_temporal_id_nesting_flag = ptr[3] & 0x01; + hevc->numTemporalLayers = MAX(hevc->numTemporalLayers, vps_max_sub_layers_minus1 + 1); + hevc->temporalIdNested = (hevc->temporalIdNested || vps_temporal_id_nesting_flag) ? 1 : 0; + hevc_profile_tier_level(ptr + 6, sodb - 6, vps_max_sub_layers_minus1, hevc); + + return vps; +} + +static uint8_t hevc_sps_id(const uint8_t* rbsp, size_t bytes, struct mpeg4_hevc_t* hevc, uint8_t* ptr, size_t len, uint8_t* vps) +{ + size_t n; + size_t sodb; + uint8_t sps; + uint8_t sps_max_sub_layers_minus1; + uint8_t sps_temporal_id_nesting_flag; + uint8_t conformance_window_flag; + + sodb = hevc_rbsp_decode(rbsp, bytes, ptr, len); + if (sodb < 12+3) + return 0xFF; + + *vps = ptr[2] >> 4; // 2-nalu type + sps_max_sub_layers_minus1 = (ptr[2] >> 1) & 0x07; + sps_temporal_id_nesting_flag = ptr[2] & 0x01; + n = hevc_profile_tier_level(ptr + 3, sodb - 3, sps_max_sub_layers_minus1, hevc); + if (n <= 0) + return 0xFF; + + n = (n + 3) * 8; + sps = mpeg4_h264_read_ue(ptr, sodb, &n); + hevc->chromaFormat = mpeg4_h264_read_ue(ptr, sodb, &n); + if (3 == hevc->chromaFormat) + n++; + mpeg4_h264_read_ue(ptr, sodb, &n); // pic_width_in_luma_samples + mpeg4_h264_read_ue(ptr, sodb, &n); // pic_height_in_luma_samples + conformance_window_flag = BIT(ptr, n); n++; // conformance_window_flag + if (conformance_window_flag) + { + mpeg4_h264_read_ue(ptr, sodb, &n); // conf_win_left_offset + mpeg4_h264_read_ue(ptr, sodb, &n); // conf_win_right_offset + mpeg4_h264_read_ue(ptr, sodb, &n); // conf_win_top_offset + mpeg4_h264_read_ue(ptr, sodb, &n); // conf_win_bottom_offset + } + hevc->bitDepthLumaMinus8 = mpeg4_h264_read_ue(ptr, sodb, &n); + hevc->bitDepthChromaMinus8 = mpeg4_h264_read_ue(ptr, sodb, &n); + + // TODO: vui_parameters + //mp4->hevc->min_spatial_segmentation_idc; // min_spatial_segmentation_idc + return sps; +} + +static uint8_t hevc_pps_id(const uint8_t* rbsp, size_t bytes, struct mpeg4_hevc_t* hevc, uint8_t* ptr, size_t len, uint8_t* sps) +{ + uint8_t pps; + size_t sodb; + size_t offset = 2 * 8; // 2-nalu type + sodb = hevc_rbsp_decode(rbsp, bytes, ptr, len); + if (sodb < 3) + return 0xFF; (void)hevc; + pps = mpeg4_h264_read_ue(ptr, sodb, &offset); + *sps = mpeg4_h264_read_ue(ptr, sodb, &offset); + return pps; +} + +static void mpeg4_hevc_remove(struct mpeg4_hevc_t* hevc, uint8_t* ptr, size_t bytes, const uint8_t* end) +{ + uint8_t i; + assert(ptr >= hevc->data && ptr + bytes <= end && end <= hevc->data + sizeof(hevc->data)); + memmove(ptr, ptr + bytes, end - ptr - bytes); + + for (i = 0; i < hevc->numOfArrays; i++) + { + if (hevc->nalu[i].data > ptr) + hevc->nalu[i].data -= bytes; + } +} + +static int mpeg4_hevc_update2(struct mpeg4_hevc_t* hevc, int i, const uint8_t* nalu, size_t bytes) +{ + if (bytes == hevc->nalu[i].bytes && 0 == memcmp(nalu, hevc->nalu[i].data, bytes)) + return 0; // do nothing + + if (bytes > hevc->nalu[i].bytes && hevc->off + (bytes - hevc->nalu[i].bytes) > sizeof(hevc->data)) + { + assert(0); + return -1; // too big + } + + mpeg4_hevc_remove(hevc, hevc->nalu[i].data, hevc->nalu[i].bytes, hevc->data + hevc->off); + hevc->off -= hevc->nalu[i].bytes; + + hevc->nalu[i].data = hevc->data + hevc->off; + hevc->nalu[i].bytes = (uint16_t)bytes; + memcpy(hevc->nalu[i].data, nalu, bytes); + hevc->off += bytes; + return 1; +} + +static int mpeg4_hevc_add(struct mpeg4_hevc_t* hevc, uint8_t type, const uint8_t* nalu, size_t bytes) +{ + // copy new + assert(hevc->numOfArrays < sizeof(hevc->nalu) / sizeof(hevc->nalu[0])); + if (hevc->numOfArrays >= sizeof(hevc->nalu) / sizeof(hevc->nalu[0]) + || hevc->off + bytes > sizeof(hevc->data)) + { + assert(0); + return -1; + } + + hevc->nalu[hevc->numOfArrays].type = type; + hevc->nalu[hevc->numOfArrays].bytes = (uint16_t)bytes; + hevc->nalu[hevc->numOfArrays].array_completeness = 1; + hevc->nalu[hevc->numOfArrays].data = hevc->data + hevc->off; + memcpy(hevc->nalu[hevc->numOfArrays].data, nalu, bytes); + hevc->off += bytes; + ++hevc->numOfArrays; + return 1; +} + +static int h265_vps_copy(struct mpeg4_hevc_t* hevc, const uint8_t* nalu, size_t bytes) +{ + int i; + uint8_t vpsid; + + if (bytes < 3) + { + assert(0); + return -1; // invalid length + } + + vpsid = hevc_vps_id(nalu, bytes, hevc, hevc->data + hevc->off, sizeof(hevc->data)-hevc->off); + for (i = 0; i < hevc->numOfArrays; i++) + { + if (H265_NAL_VPS == hevc->nalu[i].type && vpsid == hevc_vps_id(hevc->nalu[i].data, hevc->nalu[i].bytes, hevc, hevc->data + hevc->off, sizeof(hevc->data) - hevc->off)) + return mpeg4_hevc_update2(hevc, i, nalu, bytes); + } + + return mpeg4_hevc_add(hevc, H265_NAL_VPS, nalu, bytes); +} + +static int h265_sps_copy(struct mpeg4_hevc_t* hevc, const uint8_t* nalu, size_t bytes) +{ + int i; + uint8_t spsid; + uint8_t vpsid, vpsid2; + + if (bytes < 13 + 2) + { + assert(0); + return -1; // invalid length + } + + spsid = hevc_sps_id(nalu, bytes, hevc, hevc->data + hevc->off, sizeof(hevc->data) - hevc->off, &vpsid); + for (i = 0; i < hevc->numOfArrays; i++) + { + if (H265_NAL_SPS == hevc->nalu[i].type && spsid == hevc_sps_id(hevc->nalu[i].data, hevc->nalu[i].bytes, hevc, hevc->data + hevc->off, sizeof(hevc->data) - hevc->off, &vpsid2) && vpsid == vpsid2) + return mpeg4_hevc_update2(hevc, i, nalu, bytes); + } + + return mpeg4_hevc_add(hevc, H265_NAL_SPS, nalu, bytes); +} + +static int h265_pps_copy(struct mpeg4_hevc_t* hevc, const uint8_t* nalu, size_t bytes) +{ + int i; + uint8_t ppsid; + uint8_t spsid, spsid2; + + if (bytes < 1 + 2) + { + assert(0); + return -1; // invalid length + } + + ppsid = hevc_pps_id(nalu, bytes, hevc, hevc->data + hevc->off, sizeof(hevc->data) - hevc->off, &spsid); + for (i = 0; i < hevc->numOfArrays; i++) + { + if (H265_NAL_PPS == hevc->nalu[i].type && ppsid == hevc_pps_id(hevc->nalu[i].data, hevc->nalu[i].bytes, hevc, hevc->data + hevc->off, sizeof(hevc->data) - hevc->off, &spsid2) && spsid == spsid2) + return mpeg4_hevc_update2(hevc, i, nalu, bytes); + } + + return mpeg4_hevc_add(hevc, H265_NAL_PPS, nalu, bytes); +} + +static int h265_sei_clear(struct mpeg4_hevc_t* hevc) +{ + int i; + for (i = 0; i < hevc->numOfArrays; i++) + { + if (H265_NAL_SEI_PREFIX == hevc->nalu[i].type || H265_NAL_SEI_SUFFIX == hevc->nalu[i].type) + { + mpeg4_hevc_remove(hevc, hevc->nalu[i].data, hevc->nalu[i].bytes, hevc->data + hevc->off); + hevc->off -= hevc->nalu[i].bytes; + if(i + 1 < hevc->numOfArrays) + memmove(hevc->nalu + i, hevc->nalu + i + 1, sizeof(hevc->nalu[0]) * (hevc->numOfArrays - i - 1)); + --hevc->numOfArrays; + --i; + } + } + return 0; +} + +int mpeg4_hevc_update(struct mpeg4_hevc_t* hevc, const uint8_t* nalu, size_t bytes) +{ + int r; + + switch ((nalu[0] >> 1) & 0x3f) + { + case H265_NAL_VPS: + h265_sei_clear(hevc); // remove all prefix/suffix sei + r = h265_vps_copy(hevc, nalu, bytes); + break; + + case H265_NAL_SPS: + r = h265_sps_copy(hevc, nalu, bytes); + break; + + case H265_NAL_PPS: + r = h265_pps_copy(hevc, nalu, bytes); + break; + +#if defined(H265_FILTER_SEI) + case H265_NAL_SEI_PREFIX: + r = mpeg4_hevc_add(hevc, H265_NAL_SEI_PREFIX, nalu, bytes); + break; + + case H265_NAL_SEI_SUFFIX: + r = mpeg4_hevc_add(hevc, H265_NAL_SEI_SUFFIX, nalu, bytes); + break; +#endif + + default: + r = 0; + break; + } + + return r; +} + +static void hevc_handler(void* param, const uint8_t* nalu, size_t bytes) +{ + int r; + uint8_t nalutype; + struct h265_annexbtomp4_handle_t* mp4; + mp4 = (struct h265_annexbtomp4_handle_t*)param; + + nalutype = (nalu[0] >> 1) & 0x3f; +#if defined(H2645_FILTER_AUD) + if(H265_NAL_AUD == nalutype) + return; // ignore AUD +#endif + + r = mpeg4_hevc_update(mp4->hevc, nalu, bytes); + if (1 == r && mp4->update) + *mp4->update = 1; + else if (r < 0) + mp4->errcode = r; + + // IRAP-1, B/P-2, other-0 + if (mp4->vcl && nalutype < H265_NAL_VPS) + *mp4->vcl = H265_NAL_BLA_W_LP<=nalutype && nalutype<=H265_NAL_RSV_IRAP ? 1 : 2; + + if (mp4->capacity >= mp4->bytes + bytes + 4) + { + mp4->out[mp4->bytes + 0] = (uint8_t)((bytes >> 24) & 0xFF); + mp4->out[mp4->bytes + 1] = (uint8_t)((bytes >> 16) & 0xFF); + mp4->out[mp4->bytes + 2] = (uint8_t)((bytes >> 8) & 0xFF); + mp4->out[mp4->bytes + 3] = (uint8_t)((bytes >> 0) & 0xFF); + memmove(mp4->out + mp4->bytes + 4, nalu, bytes); + mp4->bytes += bytes + 4; + } + else + { + mp4->errcode = -1; + } +} + +int h265_annexbtomp4(struct mpeg4_hevc_t* hevc, const void* data, size_t bytes, void* out, size_t size, int *vcl, int* update) +{ + struct h265_annexbtomp4_handle_t h; + memset(&h, 0, sizeof(h)); + h.hevc = hevc; + h.vcl = vcl; + h.update = update; + h.out = (uint8_t*)out; + h.capacity = size; + if (vcl) *vcl = 0; + if (update) *update = 0; + +// hevc->numTemporalLayers = 0; +// hevc->temporalIdNested = 0; +// hevc->min_spatial_segmentation_idc = 0; +// hevc->general_profile_compatibility_flags = 0xffffffff; +// hevc->general_constraint_indicator_flags = 0xffffffffffULL; +// hevc->chromaFormat = 1; // 4:2:0 + + mpeg4_h264_annexb_nalu((const uint8_t*)data, bytes, hevc_handler, &h); + hevc->configurationVersion = 1; + hevc->lengthSizeMinusOne = 3; // 4 bytes + return 0 == h.errcode ? (int)h.bytes : 0; +} + +int h265_is_new_access_unit(const uint8_t* nalu, size_t bytes) +{ + enum { NAL_VPS = 32, NAL_SPS = 33, NAL_PPS = 34, NAL_AUD = 35, NAL_PREFIX_SEI = 39, }; + + uint8_t nal_type; + uint8_t nuh_layer_id; + + if(bytes < 3) + return 0; + + nal_type = (nalu[0] >> 1) & 0x3f; + nuh_layer_id = ((nalu[0] & 0x01) << 5) | ((nalu[1] >> 3) &0x1F); + + // 7.4.2.4.4 Order of NAL units and coded pictures and their association to access units + if(NAL_VPS == nal_type || NAL_SPS == nal_type || NAL_PPS == nal_type || + (nuh_layer_id == 0 && (NAL_AUD == nal_type || NAL_PREFIX_SEI == nal_type || (41 <= nal_type && nal_type <= 44) || (48 <= nal_type && nal_type <= 55)))) + return 1; + + // 7.4.2.4.5 Order of VCL NAL units and association to coded pictures + if (nal_type <= 31) + { + //first_slice_segment_in_pic_flag 0x80 + return (nalu[2] & 0x80) ? 1 : 0; + } + + return 0; +} + +#if defined(_DEBUG) || defined(DEBUG) +void hevc_annexbtomp4_test(void) +{ + const uint8_t vps[] = { 0x40, 0x01, 0x0c, 0x01, 0xff, 0xff, 0x01, 0x60, 0x00, 0x00, 0x03, 0x00, 0x80, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x78, 0x9d, 0xc0, 0x90 }; + const uint8_t sps[] = { 0x42, 0x01, 0x01, 0x01, 0x60, 0x00, 0x00, 0x03, 0x00, 0x80, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x78, 0xa0, 0x03, 0xc0, 0x80, 0x32, 0x16, 0x59, 0xde, 0x49, 0x1b, 0x6b, 0x80, 0x40, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x17, 0x70, 0x02 }; + const uint8_t pps[] = { 0x44, 0x01, 0xc1, 0x73, 0xd1, 0x89 }; + const uint8_t annexb[] = { 0x00, 0x00, 0x00, 0x01, 0x4e, 0x01, 0x06, 0x01, 0xd0, 0x80, 0x00, 0x00, 0x00, 0x01, 0x40, 0x01, 0x0c, 0x01, 0xff, 0xff, 0x01, 0x60, 0x00, 0x00, 0x03, 0x00, 0x80, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x78, 0x9d, 0xc0, 0x90, 0x00, 0x00, 0x00, 0x01, 0x42, 0x01, 0x01, 0x01, 0x60, 0x00, 0x00, 0x03, 0x00, 0x80, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x78, 0xa0, 0x03, 0xc0, 0x80, 0x32, 0x16, 0x59, 0xde, 0x49, 0x1b, 0x6b, 0x80, 0x40, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x17, 0x70, 0x02, 0x00, 0x00, 0x00, 0x01, 0x44, 0x01, 0xc1, 0x73, 0xd1, 0x89 }; + uint8_t output[512]; + int vcl, update; + + struct mpeg4_hevc_t hevc; + memset(&hevc, 0, sizeof(hevc)); + assert(h265_annexbtomp4(&hevc, annexb, sizeof(annexb), output, sizeof(output), &vcl, &update) > 0); + assert(3 == hevc.numOfArrays && vcl == 0 && update == 1); + assert(hevc.nalu[0].bytes == sizeof(vps) && 0 == memcmp(hevc.nalu[0].data, vps, sizeof(vps))); + assert(hevc.nalu[1].bytes == sizeof(sps) && 0 == memcmp(hevc.nalu[1].data, sps, sizeof(sps))); + assert(hevc.nalu[2].bytes == sizeof(pps) && 0 == memcmp(hevc.nalu[2].data, pps, sizeof(pps))); +} +#endif diff --git a/src/big/mpp/middleware/src/mp4_format/src/libflv/source/hevc-mp4toannexb.c b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/hevc-mp4toannexb.c new file mode 100644 index 000000000..764473e7a --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/hevc-mp4toannexb.c @@ -0,0 +1,134 @@ +#include "mpeg4-hevc.h" +#include "mpeg4-avc.h" +#include +#include +#include +#include +#include + +#define H265_NAL_BLA_W_LP 16 +#define H265_NAL_RSV_IRAP 23 +#define H265_NAL_VPS 32 +#define H265_NAL_SPS 33 +#define H265_NAL_PPS 34 +#define H265_NAL_AUD 35 // Access unit delimiter + +struct h265_mp4toannexb_handle_t +{ + const struct mpeg4_hevc_t* hevc; + int vps_sps_pps_flag; + int errcode; + + uint8_t* out; + size_t bytes; + size_t capacity; +}; + +static int h265_vps_sps_pps_size(const struct mpeg4_hevc_t* hevc) +{ + int i, n = 0; + for (i = 0; i < hevc->numOfArrays; i++) + n += hevc->nalu[i].bytes + 4; + return n; +} + +static void h265_mp4toannexb_handler(void* param, const uint8_t* nalu, size_t bytes) +{ + int n; + uint8_t irap, nalu_type; + const uint8_t h265_start_code[] = { 0x00, 0x00, 0x00, 0x01 }; + struct h265_mp4toannexb_handle_t* mp4; + mp4 = (struct h265_mp4toannexb_handle_t*)param; + + if (bytes < 1) + { + assert(0); + mp4->errcode = -EINVAL; + return; + } + + nalu_type = (nalu[0] >> 1) & 0x3F; +#if defined(H2645_FILTER_AUD) + if (H265_NAL_AUD == nalu_type) + continue; // ignore AUD +#endif + + if (H265_NAL_VPS == nalu_type || H265_NAL_SPS == nalu_type || H265_NAL_PPS == nalu_type) + mp4->vps_sps_pps_flag = 1; + + irap = H265_NAL_BLA_W_LP <= nalu_type && nalu_type <= H265_NAL_RSV_IRAP; + if (irap && 0 == mp4->vps_sps_pps_flag) + { + // insert VPS/SPS/PPS before IDR frame + if (mp4->bytes > 0) + { + // write sps/pps at first + n = h265_vps_sps_pps_size(mp4->hevc); + if (n + mp4->bytes > mp4->capacity) + { + mp4->errcode = -E2BIG; + return; + } + memmove(mp4->out + n, mp4->out, mp4->bytes); + } + + n = mpeg4_hevc_to_nalu(mp4->hevc, mp4->out, mp4->capacity); + if (n <= 0) + { + mp4->errcode = 0 == n ? -EINVAL : n; + return; + } + mp4->bytes += n; + mp4->vps_sps_pps_flag = 1; + } + + if (mp4->bytes + bytes + sizeof(h265_start_code) > mp4->capacity) + { + mp4->errcode = -E2BIG; + return; + } + + memcpy(mp4->out + mp4->bytes, h265_start_code, sizeof(h265_start_code)); + memcpy(mp4->out + mp4->bytes + sizeof(h265_start_code), nalu, bytes); + mp4->bytes += sizeof(h265_start_code) + bytes; +} + +int h265_mp4toannexb(const struct mpeg4_hevc_t* hevc, const void* data, size_t bytes, void* out, size_t size) +{ + int i, n; + const uint8_t* src, * end; + struct h265_mp4toannexb_handle_t h; + + memset(&h, 0, sizeof(h)); + h.hevc = hevc; + h.out = (uint8_t*)out; + h.capacity = size; + + end = (uint8_t*)data + bytes; + for(src = (uint8_t*)data; src + hevc->lengthSizeMinusOne + 1 < end; src += n) + { + for (n = i = 0; i < hevc->lengthSizeMinusOne + 1; i++) + n = (n << 8) + ((uint8_t*)src)[i]; + + // fix 0x00 00 00 01 => flv nalu size + if (0 == hevc->lengthSizeMinusOne || (1 == n && (2 == hevc->lengthSizeMinusOne || 3 == hevc->lengthSizeMinusOne))) + { + //n = (int)(end - src) - avc->nalu; + mpeg4_h264_annexb_nalu(src, end - src, h265_mp4toannexb_handler, &h); + src = end; + break; + } + + src += hevc->lengthSizeMinusOne + 1; + if (n < 1 || src + n > end) + { + assert(0); + return -EINVAL; + } + + h265_mp4toannexb_handler(&h, src, n); + } + + assert(src == end); + return 0 == h.errcode ? (int)h.bytes : 0; +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libflv/source/mp3-header.c b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/mp3-header.c new file mode 100644 index 000000000..fd6976549 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/mp3-header.c @@ -0,0 +1,233 @@ +#include "mp3-header.h" +#include +#include +#include + +// layer-1, layer-2, layer-3 +static int s_bitrate_mpeg1[3][16] = { + { 0/*free*/, 32000, 64000, 96000, 128000, 160000, 192000, 224000, 256000, 288000, 320000, 352000, 384000, 416000, 448000, -1 }, + { 0/*free*/, 32000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 160000, 192000, 224000, 256000, 320000, 384000, -1 }, + { 0/*free*/, 32000, 40000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 160000, 192000, 224000, 256000, 320000, -1 }, +}; + +// layer-1, layer-2, layer-3 +static int s_bitrate_mpeg2[3][16] = { + { 0/*free*/, 32000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 144000, 160000, 176000, 192000, 224000, 256000, -1 }, + { 0/*free*/, 8000, 16000, 24000, 32000, 40000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 144000, 160000, -1 }, + { 0/*free*/, 8000, 16000, 24000, 32000, 40000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 144000, 160000, -1 }, +}; + +// layer-1, layer-2, layer-3 +static int s_frequency_mpeg1[4] = { 44100, 48000, 32000, -1 }; +static int s_frequency_mpeg2[4] = { 22050, 24000, 16000, -1 }; +static int s_frequency_mpeg25[4] = { 11025, 12000, 8000, -1 }; + +// layer-1, layer-2, layer-3 +//static int s_frames_mpeg1[3] = { 384, 1152, 1152 }; +//static int s_frames_mpeg2[3] = { 384, 1152, 576 }; +//static int s_frames_mpeg25[3] = { 384, 1152, 576 }; + +// layer-1 bytes = ((frames / 8 * bitrate) / frequency + padding * 4 +// layer-2/3 bytes = ((frames / 8 * bitrate) / frequency + padding + +int mp3_header_load(struct mp3_header_t* mp3, const void* data, int bytes) +{ + const uint8_t* p; + if (bytes < 4) + return 0; + + p = data; + if (0 == memcmp("TAG", p, 3)) + { + if (bytes < 128/*ID3v1*/ + 4) + return 0; + p += 128; + } + else if (0 == memcmp("ID3", p, 3)) + { + uint32_t n; + if (3 != p[3]/*version*/ || bytes < 10) + return 0; + n = (((uint32_t)p[6] & 0x7F) << 21) | (((uint32_t)p[7] & 0x7F) << 14) | (((uint32_t)p[8] & 0x7F) << 7) | (p[9] & 0x7F); + if (bytes < (int)n + 10) + return 0; + p += n + 10; + } + + //sync: 1111 1111 111 + if (0xFF != p[0] || 0xE0 != (p[1] & 0xE0)) + { + assert(0); + return 0; + } + + mp3->version = (p[1] >> 3) & 0x03; + mp3->layer = (p[1] >> 1) & 0x03; + mp3->protection = p[1] & 0x01; + mp3->bitrate_index = (p[2] >> 4) & 0x0F; + mp3->sampling_frequency = (p[2] >> 2) & 0x03; + mp3->priviate = p[2] & 0x01; + mp3->mode = (p[3] >> 6) & 0x03; + mp3->mode_extension = (p[3] >> 4) & 0x03; + mp3->copyright = (p[3] >> 3) & 0x01; + mp3->original = (p[3] >> 2) & 0x01; + mp3->emphasis = p[3] & 0x03; + + return (int)(p - (uint8_t*)data) + 4; +} + +int mp3_header_save(const struct mp3_header_t* mp3, void* data, int bytes) +{ + uint8_t* p; + if (bytes < 4) + return 0; + + p = data; + p[0] = 0xFF; + p[1] = (uint8_t)(0xE0 | (mp3->version << 3) | (mp3->layer << 1) | mp3->protection); + p[2] = (uint8_t)((mp3->bitrate_index << 4) | (mp3->sampling_frequency << 2) | 0x00 /*padding*/ | mp3->priviate); + p[3] = (uint8_t)((mp3->mode << 6) | (mp3->mode_extension << 4) | (mp3->copyright << 3) | (mp3->original << 2) | mp3->emphasis); + return 4; +} + +int mp3_get_channel(const struct mp3_header_t* mp3) +{ + return 0x03 == mp3->mode ? 1 : 2; +} + +int mp3_get_bitrate(const struct mp3_header_t* mp3) +{ + if (mp3->layer < 1 || mp3->layer > 3) + { + assert(0); + return -1; + } + + switch (mp3->version) + { + case MP3_MPEG1: + return s_bitrate_mpeg1[3 - mp3->layer][mp3->bitrate_index]; + + case MP3_MPEG2: + case MP3_MPEG2_5: + return s_bitrate_mpeg2[3 - mp3->layer][mp3->bitrate_index]; + + default: + assert(0); + return -1; + } +} + +static int mp3_find_bitrate(const int* arr, int bitrate) +{ + int i; + for (i = 0; i < 16; i++) + { + if (bitrate == arr[i]) + return i; + } + return -1; +} + +int mp3_set_bitrate(struct mp3_header_t* mp3, int bitrate) +{ + int r; + if (mp3->layer < 1 || mp3->layer > 3) + { + assert(0); + return -1; + } + + switch (mp3->version) + { + case MP3_MPEG1: + r = mp3_find_bitrate(s_bitrate_mpeg1[3 - mp3->layer], bitrate); + break; + + case MP3_MPEG2: + case MP3_MPEG2_5: + r = mp3_find_bitrate(s_bitrate_mpeg2[3 - mp3->layer], bitrate); + break; + + default: + assert(0); + r = -1; + } + + if (-1 == r) + return -1; + + mp3->bitrate_index = (unsigned int)r; + return 0; +} + +int mp3_get_frequency(const struct mp3_header_t* mp3) +{ + if (mp3->sampling_frequency < 0 || mp3->sampling_frequency > 3) + return -1; + + switch (mp3->version) + { + case MP3_MPEG1: return s_frequency_mpeg1[mp3->sampling_frequency]; + case MP3_MPEG2: return s_frequency_mpeg2[mp3->sampling_frequency]; + case MP3_MPEG2_5: return s_frequency_mpeg25[mp3->sampling_frequency]; + default: assert(0); return -1; + } +} + +static int mp3_find_frequency(const int* arr, int frequency) +{ + int i; + for (i = 0; i < 4; i++) + { + if (frequency == arr[i]) + return i; + } + return -1; +} + +int mp3_set_frequency(struct mp3_header_t* mp3, int frequency) +{ + int r; + switch (mp3->version) + { + case MP3_MPEG1: + r = mp3_find_frequency(s_frequency_mpeg1, frequency); + break; + + case MP3_MPEG2: + r = mp3_find_frequency(s_frequency_mpeg2, frequency); + break; + + case MP3_MPEG2_5: + r = mp3_find_frequency(s_frequency_mpeg25, frequency); + break; + + default: + assert(0); + r = -1; + } + + if (-1 == r) + return -1; + + mp3->sampling_frequency = (unsigned int)r; + return 0; +} + +#if defined(DEBUG) || defined(_DEBUG) +void mp3_header_test(void) +{ + uint8_t v[4] = { 0xff, 0xfb, 0xe0, 0x64 }; + uint8_t v2[4]; + struct mp3_header_t mp3; + + assert(4 == mp3_header_load(&mp3, v, 4)); + assert(MP3_MPEG1 == mp3.version && MP3_LAYER3 == mp3.layer); + assert(14 == mp3.bitrate_index && 320000 == mp3_get_bitrate(&mp3)); + assert(0 == mp3.sampling_frequency && 44100 == mp3_get_frequency(&mp3)); + assert(1 == mp3.mode && 1 == mp3.protection); + assert(4 == mp3_header_save(&mp3, v2, 4)); + assert(0 == memcmp(v, v2, 4)); +} +#endif diff --git a/src/big/mpp/middleware/src/mp4_format/src/libflv/source/mpeg4-aac-asc.c b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/mpeg4-aac-asc.c new file mode 100644 index 000000000..9852d9bbd --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/mpeg4-aac-asc.c @@ -0,0 +1,664 @@ +#include "mpeg4-aac.h" +#include "mpeg4-bits.h" +#include +#include +#include + +// Table 4.85 - Syntactic elements (p533) +enum { + ID_SCE = 0x0, // single channel element() + ID_CPE = 0x1, // channel_pair_element() + ID_CCE = 0x2, // coupling_channel_element() + ID_LFE = 0x3, // lfe_channel_element() + ID_DSE = 0x4, // data_stream_element() + ID_PCE = 0x5, // program_config_element() + ID_FIL = 0x6, // fill_element() + ID_END = 0x7, +}; + +// ISO-14496-3 4.4.1.1 Program config element (p488) +// There may be up to 16 such elements per raw data block, each one must have a unique element_instance_tag +// PCEs must come before all other syntactic elements in a raw_data_block(). +/* +program_config_element() +{ + element_instance_tag; 4 uimsbf + object_type; 2 uimsbf + sampling_frequency_index; 4 uimsbf + num_front_channel_elements; 4 uimsbf + num_side_channel_elements; 4 uimsbf + num_back_channel_elements; 4 uimsbf + num_lfe_channel_elements; 2 uimsbf + num_assoc_data_elements; 3 uimsbf + num_valid_cc_elements; 4 uimsbf + mono_mixdown_present; 1 uimsbf + if (mono_mixdown_present == 1 ) + mono_mixdown_element_number; 4 uimsbf + stereo_mixdown_present; 1 uimsbf + if (stereo_mixdown_present == 1 ) + stereo_mixdown_element_number; 4 uimsbf + matrix_mixdown_idx_present; 1 uimsbf + if (matrix_mixdown_idx_present == 1 ) { + matrix_mixdown_idx ; 2 uimsbf + pseudo_surround_enable; 1 uimsbf + } + + for (i = 0; i < num_front_channel_elements; i++) { + front_element_is_cpe[i]; 1 bslbf + front_element_tag_select[i]; 4 uimsbf + } + for (i = 0; i < num_side_channel_elements; i++) { + side_element_is_cpe[i]; 1 bslbf + side_element_tag_select[i]; 4 uimsbf + } + for (i = 0; i < num_back_channel_elements; i++) { + back_element_is_cpe[i]; 1 bslbf + back_element_tag_select[i]; 4 uimsbf + } + for (i = 0; i < num_lfe_channel_elements; i++) + lfe_element_tag_select[i]; 4 uimsbf + for ( i = 0; i < num_assoc_data_elements; i++) + assoc_data_element_tag_select[i]; 4 uimsbf + for (i = 0; i < num_valid_cc_elements; i++) { + cc_element_is_ind_sw[i]; 1 uimsbf + valid_cc_element_tag_select[i]; 4 uimsbf + } + byte_alignment(); Note 1 + comment_field_bytes; 8 uimsbf + for (i = 0; i < comment_field_bytes; i++) + comment_field_data[i]; 8 uimsbf +} +*/ +static inline uint64_t mpeg4_bits_copy(struct mpeg4_bits_t* dst, struct mpeg4_bits_t* src, int n) +{ + uint64_t v; + v = mpeg4_bits_read_n(src, n); + mpeg4_bits_write_n(dst, v, n); + return v; +} + +static int mpeg4_aac_pce_load(struct mpeg4_bits_t* bits, struct mpeg4_aac_t* aac, struct mpeg4_bits_t* pce) +{ + uint64_t i, cpe, tag; + uint64_t element_instance_tag; + uint64_t object_type; + uint64_t sampling_frequency_index; + uint64_t num_front_channel_elements; + uint64_t num_side_channel_elements; + uint64_t num_back_channel_elements; + uint64_t num_lfe_channel_elements; + uint64_t num_assoc_data_elements; + uint64_t num_valid_cc_elements; + uint64_t comment_field_bytes; + + aac->channels = 0; + element_instance_tag = mpeg4_bits_copy(pce, bits, 4); + object_type = mpeg4_bits_copy(pce, bits, 2); + sampling_frequency_index = mpeg4_bits_copy(pce, bits, 4); + num_front_channel_elements = mpeg4_bits_copy(pce, bits, 4); + num_side_channel_elements = mpeg4_bits_copy(pce, bits, 4); + num_back_channel_elements = mpeg4_bits_copy(pce, bits, 4); + num_lfe_channel_elements = mpeg4_bits_copy(pce, bits, 2); + num_assoc_data_elements = mpeg4_bits_copy(pce, bits, 3); + num_valid_cc_elements = mpeg4_bits_copy(pce, bits, 4); + + if (mpeg4_bits_copy(pce, bits, 1)) + mpeg4_bits_copy(pce, bits, 4); // MONO + if (mpeg4_bits_copy(pce, bits, 1)) + mpeg4_bits_copy(pce, bits, 4); // STEREO + if (mpeg4_bits_copy(pce, bits, 1)) + mpeg4_bits_copy(pce, bits, 3); // Matrix, Pseudo surround + + for (i = 0; i < num_front_channel_elements; i++) + { + cpe = mpeg4_bits_copy(pce, bits, 1); // front_element_is_cpe + tag = mpeg4_bits_copy(pce, bits, 4); // front_element_tag_select + aac->channels += (cpe || aac->ps) ? 2 : 1; + } + + for (i = 0; i < num_side_channel_elements; i++) + { + cpe = mpeg4_bits_copy(pce, bits, 1); // side_element_is_cpe + tag = mpeg4_bits_copy(pce, bits, 4); // side_element_tag_select + aac->channels += (cpe || aac->ps) ? 2 : 1; + } + + for (i = 0; i < num_back_channel_elements; i++) + { + cpe = mpeg4_bits_copy(pce, bits, 1); // back_element_is_cpe + tag = mpeg4_bits_copy(pce, bits, 4); // back_element_tag_select + aac->channels += (cpe || aac->ps) ? 2 : 1; + } + + for (i = 0; i < num_lfe_channel_elements; i++) + { + tag = mpeg4_bits_copy(pce, bits, 4); // lfe_element_tag_select + aac->channels += 1; + } + + for (i = 0; i < num_assoc_data_elements; i++) + { + tag = mpeg4_bits_copy(pce, bits, 4); // assoc_data_element_tag_select + } + + for (i = 0; i < num_valid_cc_elements; i++) + { + cpe = mpeg4_bits_copy(pce, bits, 1); // cc_element_is_ind_sw + tag = mpeg4_bits_copy(pce, bits, 4); // valid_cc_element_tag_select + } + + mpeg4_bits_aligment(bits, 8); // byte_alignment(); + mpeg4_bits_aligment(pce, 8); + + comment_field_bytes = mpeg4_bits_copy(pce, bits, 8); + for (i = 0; i < comment_field_bytes; i++) + mpeg4_bits_copy(pce, bits, 8); // comment_field_data + + assert(aac->sampling_frequency_index == sampling_frequency_index); + assert(aac->profile == object_type + 1); + return (int)((pce->bits + 7) / 8); +} + +// 4.4.1 Decoder configuration (GASpecificConfig) (p487) +/* +GASpecificConfig (samplingFrequencyIndex, channelConfiguration, audioObjectType) +{ + frameLengthFlag; 1 bslbf + dependsOnCoreCoder; 1 bslbf + if (dependsOnCoreCoder) { + coreCoderDelay; 14 uimsbf + } + extensionFlag; 1 bslbf + if (! channelConfiguration) { + program_config_element (); + } + if ((audioObjectType == 6) || (audioObjectType == 20)) { + layerNr; 3 uimsbf + } + if (extensionFlag) { + if (audioObjectType == 22) { + numOfSubFrame; 5 bslbf + layer_length; 11 bslbf + } + if (audioObjectType == 17 || audioObjectType == 19 || audioObjectType == 20 || audioObjectType == 23) { + aacSectionDataResilienceFlag; 1 bslbf + aacScalefactorDataResilienceFlag; 1 bslbf + aacSpectralDataResilienceFlag; 1 bslbf + } + extensionFlag3; 1 bslbf + if (extensionFlag3) { + // tbd in version 3 + } + } +} +*/ +static int mpeg4_aac_ga_specific_config_load(struct mpeg4_bits_t* bits, struct mpeg4_aac_t* aac) +{ + int extensionFlag; + struct mpeg4_bits_t pce; + + mpeg4_bits_read(bits); // frameLengthFlag + if (mpeg4_bits_read(bits)) // dependsOnCoreCoder + mpeg4_bits_read_uint16(bits, 14); // coreCoderDelay + extensionFlag = mpeg4_bits_read(bits); // extensionFlag + + if (0 == aac->channel_configuration) + { + mpeg4_bits_init(&pce, aac->pce, sizeof(aac->pce)); + aac->npce = mpeg4_aac_pce_load(bits, aac, &pce); // update channel count + } + + if (6 == aac->profile || 20 == aac->profile) + mpeg4_bits_read_uint8(bits, 3); // layerNr + + if (extensionFlag) + { + if (22 == aac->profile) + { + mpeg4_bits_read_uint8(bits, 5); // numOfSubFrame + mpeg4_bits_read_uint16(bits, 11); // layer_length + } + + if (17 == aac->profile || 19 == aac->profile || 20 == aac->profile || 23 == aac->profile) + { + mpeg4_bits_read(bits); // aacSectionDataResilienceFlag + mpeg4_bits_read(bits); // aacScalefactorDataResilienceFlag + mpeg4_bits_read(bits); // aacSpectralDataResilienceFlag + } + + if (mpeg4_bits_read(bits)) // extensionFlag3 + { + // tbd in version 3 + assert(0); + } + } + + return mpeg4_bits_error(bits); +} + +static int mpeg4_aac_celp_specific_config_load(struct mpeg4_bits_t* bits, struct mpeg4_aac_t* aac) +{ + int ExcitationMode; + if (mpeg4_bits_read(bits)) // isBaseLayer + { + // CelpHeader + + ExcitationMode = mpeg4_bits_read(bits); + mpeg4_bits_read(bits); // SampleRateMode + mpeg4_bits_read(bits); // FineRateControl + + // Table 3.50 - Description of ExcitationMode + if (ExcitationMode == 1 /*RPE*/) + { + mpeg4_bits_read_n(bits, 3); // RPE_Configuration + } + if (ExcitationMode == 0 /*MPE*/) + { + mpeg4_bits_read_n(bits, 5); // MPE_Configuration + mpeg4_bits_read_n(bits, 2); // NumEnhLayers + mpeg4_bits_read(bits); // BandwidthScalabilityMode + } + } + else + { + if (mpeg4_bits_read(bits)) // isBWSLayer + mpeg4_bits_read_n(bits, 2); // BWS_configuration + else + mpeg4_bits_read_n(bits, 2); // CELP-BRS-id + } + + (void)aac; + return mpeg4_bits_error(bits); +} + +// ISO/IEC 23003-1 Table 9.1 Syntax of SpatialSpecificConfig() +/* +SpatialSpecificConfig() +{ + bsSamplingFrequencyIndex; 4 uimsbf + if ( bsSamplingFrequencyIndex == 0xf ) { + bsSamplingFrequency; 24 uimsbf + } + bsFrameLength; 7 uimsbf + bsFreqRes; 3 uimsbf + bsTreeConfig; 4 uimsbf + if (bsTreeConfig == 0111) { + bsNumInCh; 4 uimsbf + bsNumLFE 2 uimsbf + bsHasSpeakerConfig 1 uimsbf + if ( bsHasSpeakerConfig == 1 ) { + audioChannelLayout = SpeakerConfig3d(); Note 1 + } + } + + bsQuantMode; 2 uimsbf + bsOneIcc; 1 uimsbf + bsArbitraryDownmix; 1 uimsbf + bsFixedGainSur; 3 uimsbf + bsFixedGainLFE; 3 uimsbf + bsFixedGainDMX; 3 uimsbf + bsMatrixMode; 1 uimsbf + bsTempShapeConfig; 2 uimsbf + bsDecorrConfig; 2 uimsbf + bs3DaudioMode; 1 uimsbf + + if ( bsTreeConfig == 0111 ) { + for (i=0; i< NumInCh - NumLfe; i++) { + defaultCld[i] = 1; + ottModelfe[i] = 0; + } + for (i= NumInCh - NumLfe; i< NumInCh; i++) { + defaultCld[i] = 1; + ottModelfe[i] = 1; + } + } + + for (i=0; ibits; + aac->profile = mpeg4_aac_get_audio_object_type(bits); + aac->sampling_frequency_index = mpeg4_aac_get_sampling_frequency(bits); + aac->channel_configuration = mpeg4_bits_read_uint8(bits, 4); + aac->channels = mpeg4_aac_channel_count(aac->channel_configuration); + aac->sampling_frequency = mpeg4_aac_audio_frequency_to(aac->sampling_frequency_index); + aac->extension_frequency = aac->sampling_frequency; + + if (5 == aac->profile || 29 == aac->profile) + { + extensionAudioObjectType = 5; + aac->sbr = 1; + if (29 == aac->profile) + aac->ps = 1; + extensionSamplingFrequencyIndex = mpeg4_aac_get_sampling_frequency(bits); + aac->extension_frequency = mpeg4_aac_audio_frequency_to(extensionSamplingFrequencyIndex); + aac->profile = mpeg4_aac_get_audio_object_type(bits); + if (22 == aac->profile) + extensionChannelConfiguration = mpeg4_bits_read_uint8(bits, 4); + } + else + { + extensionAudioObjectType = 0; + } + + switch (aac->profile) + { + case 1: case 2: case 3: case 4: case 6: case 7: + case 17: case 19: case 20: case 21: case 22: case 23: + mpeg4_aac_ga_specific_config_load(bits, aac); + break; + + case 8: + mpeg4_aac_celp_specific_config_load(bits, aac); + break; + + case 30: + /*sacPayloadEmbedding=*/ mpeg4_bits_read(bits); + break; + + default: + assert(0); + return bits->bits - offset; + } + + switch (aac->profile) + { + case 17: case 19: case 20: case 21: case 22: + case 23: case 24: case 25: case 26: case 27: case 39: + epConfig = mpeg4_bits_read_uint8(bits, 2); + if (2 == epConfig || 3 == epConfig) + { + // 1.8.2.1 Error protection specific configuration (p96) + // TODO: ErrorProtectionSpecificConfig(); + assert(0); + } + if (3 == epConfig) + { + if (mpeg4_bits_read(bits)) // directMapping + { + // tbd + assert(0); + } + } + break; + + default: + break; // do nothing; + } + + if (5 != extensionAudioObjectType && mpeg4_bits_remain(bits) >= 16) + { + syncExtensionType = mpeg4_bits_read_uint16(bits, 11); + if (0x2b7 == syncExtensionType) + { + extensionAudioObjectType = mpeg4_aac_get_audio_object_type(bits); + if (5 == extensionAudioObjectType) + { + aac->sbr = mpeg4_bits_read(bits); + if (aac->sbr) + { + extensionSamplingFrequencyIndex = mpeg4_aac_get_sampling_frequency(bits); + aac->extension_frequency = mpeg4_aac_audio_frequency_to(extensionSamplingFrequencyIndex); + if (mpeg4_bits_remain(bits) >= 12) + { + syncExtensionType = mpeg4_bits_read_uint16(bits, 11); + if (0x548 == syncExtensionType) + aac->ps = mpeg4_bits_read(bits); + } + } + } + if (22 == extensionAudioObjectType) + { + aac->sbr = mpeg4_bits_read(bits); + if (aac->sbr) + { + extensionSamplingFrequencyIndex = mpeg4_aac_get_sampling_frequency(bits); + aac->extension_frequency = mpeg4_aac_audio_frequency_to(extensionSamplingFrequencyIndex); + } + extensionChannelConfiguration = mpeg4_bits_read_uint8(bits, 4); + } + } + } + + return bits->bits - offset; +} + +int mpeg4_aac_audio_specific_config_load2(const uint8_t* data, size_t bytes, struct mpeg4_aac_t* aac) +{ + struct mpeg4_bits_t bits; + mpeg4_bits_init(&bits, (void*)data, bytes); + mpeg4_aac_audio_specific_config_load3(&bits, aac); + mpeg4_bits_aligment(&bits, 8); + return mpeg4_bits_error(&bits) ? -1 : (int)(bits.bits / 8); +} + +int mpeg4_aac_audio_specific_config_save2(const struct mpeg4_aac_t* aac, uint8_t* data, size_t bytes) +{ + if (bytes < 2 + (size_t)aac->npce) + return -1; + + memcpy(data + 2, aac->pce, aac->npce); + return 2 + aac->npce; + //data[2 + aac->npce] = 0x56; + //data[2 + aac->npce + 1] = 0xe5; + //data[2 + aac->npce + 2] = 0x00; + //return 2 + aac->npce + 3; +} + +int mpeg4_aac_adts_pce_load(const uint8_t* data, size_t bytes, struct mpeg4_aac_t* aac) +{ + uint8_t i; + size_t offset = 7; + struct mpeg4_bits_t bits, pce; + + if (0 == (data[1] & 0x01)) // protection_absent + { + // number_of_raw_data_blocks_in_frame + for (i = 1; i <= (data[6] & 0x03); i++) + offset += 2; // raw_data_block_position 16-bits + offset += 2; // crc_check 16-bits + } + + if (bytes <= offset) + return (int)offset; + + mpeg4_bits_init(&bits, (uint8_t*)data + offset, bytes - offset); + if (ID_PCE == mpeg4_bits_read_uint8(&bits, 3)) + { + mpeg4_bits_init(&pce, aac->pce, sizeof(aac->pce)); + aac->npce = mpeg4_aac_pce_load(&bits, aac, &pce); + return mpeg4_bits_error(&bits) ? -1 : (int)(7 + (pce.bits + 7) / 8); + } + return 7; +} + +int mpeg4_aac_adts_pce_save(uint8_t* data, size_t bytes, const struct mpeg4_aac_t* aac) +{ + struct mpeg4_aac_t src; + struct mpeg4_bits_t pce, adts; + if ((size_t)aac->npce + 7 > bytes) + return 0; + memcpy(&src, aac, sizeof(src)); +// assert(data[1] & 0x01); // disable protection_absent + mpeg4_bits_init(&pce, (uint8_t*)aac->pce, aac->npce); + mpeg4_bits_init(&adts, (uint8_t*)data + 7, bytes - 7); + mpeg4_bits_write_uint8(&adts, ID_PCE, 3); + mpeg4_aac_pce_load(&pce, &src, &adts); + assert(src.channels == aac->channels && (adts.bits + 7) / 8 <= bytes); + return mpeg4_bits_error(&pce) ? 0 : (int)((adts.bits+7) / 8); +} + +static size_t mpeg4_aac_stream_mux_config_load3(struct mpeg4_bits_t* bits, struct mpeg4_aac_t* aac) +{ + uint8_t audioMuxVersion = 0; + uint8_t numSubFrames; + uint8_t numProgram; + uint8_t numLayer; + uint8_t allStreamsSameTimeFraming; + uint8_t profile = 0; + uint64_t ascLen; + size_t offset; + int streamCnt, prog, lay; + + offset = bits->bits; + audioMuxVersion = (uint8_t)mpeg4_bits_read(bits); + if (!audioMuxVersion || 0 == mpeg4_bits_read(bits)) + { + if (1 == audioMuxVersion) + /*taraBufferFullness =*/ mpeg4_bits_read_latm(bits); + + streamCnt = 0; + allStreamsSameTimeFraming = (uint8_t)mpeg4_bits_read(bits); + numSubFrames = (uint8_t)mpeg4_bits_read_n(bits, 6); + numProgram = (uint8_t)mpeg4_bits_read_n(bits, 4); + for (prog = 0; prog <= numProgram; prog++) + { + numLayer = (uint8_t)mpeg4_bits_read_n(bits, 3); + for (lay = 0; lay <= numLayer; lay++) + { + //progSIndx[streamCnt] = prog; + //laySIndx[streamCnt] = lay; + //streamID[prog][lay] = streamCnt++; + if ( (prog == 0 && lay == 0) || 0 == (uint8_t)mpeg4_bits_read(bits)) + { + profile = aac->profile; // previous profile + if (audioMuxVersion == 0) { + mpeg4_aac_audio_specific_config_load3(bits, aac); + } else { + ascLen = mpeg4_bits_read_latm(bits); + ascLen -= mpeg4_aac_audio_specific_config_load3(bits, aac); + mpeg4_bits_skip(bits, (size_t)ascLen); + } + } + + //frameLengthType[streamID[prog][lay]] = (uint8_t)mpeg4_bits_read_n(bits, 3); + //switch (frameLengthType[streamID[prog][lay]]) + switch (mpeg4_bits_read_n(bits, 3)) + { + case 0: + /*latmBufferFullness[streamID[prog][lay]] =*/ (uint8_t)mpeg4_bits_read_n(bits, 8); + if (!allStreamsSameTimeFraming) + { + // fixme + //if ((AudioObjectType[lay] == 6 || AudioObjectType[lay] == 20) && + // (AudioObjectType[lay - 1] == 8 || AudioObjectType[lay - 1] == 24)) + if( (aac->profile == 6 || aac->profile == 20) && (profile == 8 || profile == 24) ) + { + /*coreFrameOffset =*/ (uint8_t)mpeg4_bits_read_n(bits, 6); + } + } + break; + + case 1: + /*frameLength[streamID[prog][lay]] =*/ (uint16_t)mpeg4_bits_read_n(bits, 9); + break; + + case 3: + case 4: + case 5: + /*CELPframeLengthTableIndex[streamID[prog][lay]] =*/ (uint16_t)mpeg4_bits_read_n(bits, 6); + break; + + case 6: + case 7: + /*HVXCframeLengthTableIndex[streamID[prog][lay]] =*/ (uint16_t)mpeg4_bits_read_n(bits, 1); + break; + + default: + // nothing to do + break; + } + } + } + + // otherDataPresent + if (mpeg4_bits_read(bits)) + { + if (audioMuxVersion == 1) + { + /*otherDataLenBits =*/ mpeg4_bits_read_latm(bits); + } + else + { + /*otherDataLenBits =*/ mpeg4_bits_read_n(bits, 8); /* helper variable 32bit */ + while(mpeg4_bits_read(bits)) + { + /*otherDataLenBits <<= 8; + otherDataLenBits +=*/ mpeg4_bits_read_n(bits, 8); + } + } + } + + // crcCheckPresent + if (mpeg4_bits_read(bits)) + /*crcCheckSum =*/ mpeg4_bits_read_n(bits, 8); + } + else + { + /*tbd*/ + } + + return bits->bits - offset; +} + +int mpeg4_aac_stream_mux_config_load2(const uint8_t* data, size_t bytes, struct mpeg4_aac_t* aac) +{ + struct mpeg4_bits_t bits; + mpeg4_bits_init(&bits, (void*)data, bytes); + mpeg4_aac_stream_mux_config_load3(&bits, aac); + mpeg4_bits_aligment(&bits, 8); + return mpeg4_bits_error(&bits) ? -1 : (int)(bits.bits / 8); +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libflv/source/mpeg4-aac.c b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/mpeg4-aac.c new file mode 100644 index 000000000..3306e8f00 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/mpeg4-aac.c @@ -0,0 +1,357 @@ +#include "mpeg4-aac.h" +#include +#include + +int mpeg4_aac_adts_pce_load(const uint8_t* data, size_t bytes, struct mpeg4_aac_t* aac); +int mpeg4_aac_adts_pce_save(uint8_t* data, size_t bytes, const struct mpeg4_aac_t* aac); +int mpeg4_aac_audio_specific_config_load2(const uint8_t* data, size_t bytes, struct mpeg4_aac_t* aac); +int mpeg4_aac_audio_specific_config_save2(const struct mpeg4_aac_t* aac, uint8_t* data, size_t bytes); +int mpeg4_aac_stream_mux_config_load2(const uint8_t* data, size_t bytes, struct mpeg4_aac_t* aac); + +/* +// ISO-14496-3 adts_frame (p122) + +adts_fixed_header() +{ + syncword; 12 bslbf + ID; 1 bslbf + layer; 2 uimsbf + protection_absent; 1 bslbf + profile_ObjectType; 2 uimsbf + sampling_frequency_index; 4 uimsbf + private_bit; 1 bslbf + channel_configuration; 3 uimsbf + original_copy; 1 bslbf + home; 1 bslbf +} + +adts_variable_header() +{ + copyright_identification_bit; 1 bslbf + copyright_identification_start; 1 bslbf + aac_frame_length; 13 bslbf + adts_buffer_fullness; 11 bslbf + number_of_raw_data_blocks_in_frame; 2 uimsbf +} +*/ +/// @return >=0-adts header length, <0-error +int mpeg4_aac_adts_load(const uint8_t* data, size_t bytes, struct mpeg4_aac_t* aac) +{ + if (bytes < 7) return -1; + + memset(aac, 0, sizeof(struct mpeg4_aac_t)); + assert(0xFF == data[0] && 0xF0 == (data[1] & 0xF0)); /* syncword */ + aac->profile = ((data[2] >> 6) & 0x03) + 1; // 2 bits: the MPEG-2 Audio Object Type add 1 + aac->sampling_frequency_index = (data[2] >> 2) & 0x0F; // 4 bits: MPEG-4 Sampling Frequency Index (15 is forbidden) + aac->channel_configuration = ((data[2] & 0x01) << 2) | ((data[3] >> 6) & 0x03); // 3 bits: MPEG-4 Channel Configuration + assert(aac->profile > 0 && aac->profile < 31); + assert(aac->channel_configuration >= 0 && aac->channel_configuration <= 7); + assert(aac->sampling_frequency_index >= 0 && aac->sampling_frequency_index <= 0xc); + aac->channels = mpeg4_aac_channel_count(aac->channel_configuration); + aac->sampling_frequency = mpeg4_aac_audio_frequency_to(aac->sampling_frequency_index); + aac->extension_frequency = aac->sampling_frequency; + + if (0 == aac->channel_configuration) + return mpeg4_aac_adts_pce_load(data, bytes, aac); + return 7; +} + +/// @return >=0-adts header length, <0-error +int mpeg4_aac_adts_save(const struct mpeg4_aac_t* aac, size_t payload, uint8_t* data, size_t bytes) +{ + const uint8_t ID = 0; // 0-MPEG4/1-MPEG2 + size_t len = payload + 7; + if (bytes < 7 || len >= (1 << 12)) return -1; + + if (0 == aac->channel_configuration && aac->npce > 0) + len += mpeg4_aac_adts_pce_save(data, bytes, aac); + + assert(aac->profile > 0 && aac->profile < 31); + assert(aac->channel_configuration >= 0 && aac->channel_configuration <= 7); + assert(aac->sampling_frequency_index >= 0 && aac->sampling_frequency_index <= 0xc); + data[0] = 0xFF; /* 12-syncword */ + data[1] = 0xF0 /* 12-syncword */ | (ID << 3)/*1-ID*/ | (0x00 << 2) /*2-layer*/ | 0x01 /*1-protection_absent*/; + data[2] = ((aac->profile - 1) << 6) | ((aac->sampling_frequency_index & 0x0F) << 2) | ((aac->channel_configuration >> 2) & 0x01); + data[3] = ((aac->channel_configuration & 0x03) << 6) | ((len >> 11) & 0x03); /*0-original_copy*/ /*0-home*/ /*0-copyright_identification_bit*/ /*0-copyright_identification_start*/ + data[4] = (uint8_t)(len >> 3); + data[5] = ((len & 0x07) << 5) | 0x1F; + data[6] = 0xFC /*| ((len / (1024 * aac->channels)) & 0x03)*/; + return (int)(len - payload); +} + +int mpeg4_aac_adts_frame_length(const uint8_t* data, size_t bytes) +{ + uint16_t len; + if (bytes < 7) return -1; + assert(0xFF == data[0] && 0xF0 == (data[1] & 0xF0)); /* syncword */ + len = ((uint16_t)(data[3] & 0x03) << 11) | ((uint16_t)data[4] << 3) | ((uint16_t)(data[5] >> 5) & 0x07); + return len; +} + +// ISO-14496-3 AudioSpecificConfig (p52) +/* +audioObjectType; 5 uimsbf +if (audioObjectType == 31) { + audioObjectType = 32 + audioObjectTypeExt; 6 uimsbf +} +samplingFrequencyIndex; 4 bslbf +if ( samplingFrequencyIndex == 0xf ) { + samplingFrequency; 24 uimsbf +} +channelConfiguration; 4 bslbf +*/ +/// @return >=0-adts header length, <0-error +int mpeg4_aac_audio_specific_config_load(const uint8_t* data, size_t bytes, struct mpeg4_aac_t* aac) +{ + if (bytes < 2) return -1; + + memset(aac, 0, sizeof(struct mpeg4_aac_t)); + aac->profile = (data[0] >> 3) & 0x1F; + aac->sampling_frequency_index = ((data[0] & 0x7) << 1) | ((data[1] >> 7) & 0x01); + aac->channel_configuration = (data[1] >> 3) & 0x0F; + assert(aac->profile > 0 && aac->profile < 31); + assert(aac->channel_configuration >= 0 && aac->channel_configuration <= 7); + assert(aac->sampling_frequency_index >= 0 && aac->sampling_frequency_index <= 0xc); + aac->channels = mpeg4_aac_channel_count(aac->channel_configuration); + aac->sampling_frequency = mpeg4_aac_audio_frequency_to(aac->sampling_frequency_index); + aac->extension_frequency = aac->sampling_frequency; + + if (bytes > 2) + return mpeg4_aac_audio_specific_config_load2(data, bytes, aac); + return 2; +} + +// ISO-14496-3 AudioSpecificConfig +int mpeg4_aac_audio_specific_config_save(const struct mpeg4_aac_t* aac, uint8_t* data, size_t bytes) +{ + uint8_t channel_configuration; + if (bytes < 2+ (size_t)aac->npce) return -1; + + channel_configuration = aac->npce > 0 ? 0 : aac->channel_configuration; + assert(aac->profile > 0 && aac->profile < 31); + assert(aac->channel_configuration >= 0 && aac->channel_configuration <= 7); + assert(aac->sampling_frequency_index >= 0 && aac->sampling_frequency_index <= 0xc); + data[0] = (aac->profile << 3) | ((aac->sampling_frequency_index >> 1) & 0x07); + data[1] = ((aac->sampling_frequency_index & 0x01) << 7) | ((channel_configuration & 0xF) << 3) | (0 << 2) /* frame length-1024 samples*/ | (0 << 1) /* don't depend on core */ | 0 /* not extension */; + + if (0 == aac->channel_configuration && aac->npce > 0) + return mpeg4_aac_audio_specific_config_save2(aac, data, bytes); + return 2; +} + +// ISO/IEC 14496-3:2009(E) Table 1.42 - Syntax of StreamMuxConfig() (p83) +int mpeg4_aac_stream_mux_config_load(const uint8_t* data, size_t bytes, struct mpeg4_aac_t* aac) +{ + if (bytes < 6) return -1; + + memset(aac, 0, sizeof(*aac)); + if (6 == bytes && 0x40 == data[0] && 0 == (data[1] & 0xFE)) + { + // fast path + // [0] 0-audioMuxVersion(1), 1-allStreamsSameTimeFraming(1), 0-numSubFrames(6) + assert(0 == (0x80 & data[0])); // audioMuxVersion: 0 + aac->profile = ((data[1] & 0x01) << 4) | (data[2] >> 4); // 0-numProgram(4), 0-numLayer(3), 1-ASC(1) + aac->sampling_frequency_index = data[2] & 0x0F; + aac->channel_configuration = data[3] >> 4; + assert(aac->profile > 0 && aac->profile < 31); + assert(aac->channel_configuration >= 0 && aac->channel_configuration <= 7); + assert(aac->sampling_frequency_index >= 0 && aac->sampling_frequency_index <= 0xc); + aac->channels = mpeg4_aac_channel_count(aac->channel_configuration); + aac->sampling_frequency = mpeg4_aac_audio_frequency_to(aac->sampling_frequency_index); + aac->extension_frequency = aac->sampling_frequency; + return 6; + } + + return mpeg4_aac_stream_mux_config_load2(data, bytes, aac); +} + +// ISO/IEC 14496-3:2009(E) Table 1.42 - Syntax of StreamMuxConfig() (p83) +int mpeg4_aac_stream_mux_config_save(const struct mpeg4_aac_t* aac, uint8_t* data, size_t bytes) +{ + int profile; + int frequncy; + if (bytes < 6) return -1; + + profile = aac->ps ? MPEG4_AAC_PS : aac->profile; + frequncy = mpeg4_aac_audio_frequency_from(aac->extension_frequency); + frequncy = (aac->sbr || aac->ps) && -1 != frequncy ? frequncy : 0; + + assert(aac->profile > 0 && aac->profile < 31); + assert(aac->channel_configuration >= 0 && aac->channel_configuration <= 7); + assert(aac->sampling_frequency_index >= 0 && aac->sampling_frequency_index <= 0xc); + data[0] = 0x40; // 0-audioMuxVersion(1), 1-allStreamsSameTimeFraming(1), 0-numSubFrames(6) + data[1] = 0x00 | ((profile >> 4) & 0x01); // 0-numProgram(4), 0-numLayer(3) + data[2] = ((profile & 0x0F) << 4) | (aac->sampling_frequency_index & 0x0F); + data[3] = ((aac->channel_configuration & 0x0F) << 4) | (-1 != frequncy ? (frequncy & 0x0F) : 0); // 0-GASpecificConfig(3), 0-frameLengthType(1) + data[4] = 0x3F; // 0-frameLengthType(2), 111111-latmBufferFullness(6) + data[5] = 0xC0; // 11-latmBufferFullness(2), 0-otherDataPresent, 0-crcCheckPresent + return 6; +} + +// Table 1.6 C Levels for the High Quality Audio Profile +static int mpeg4_aac_high_quality_level(const struct mpeg4_aac_t* aac) +{ + if (aac->sampling_frequency <= 22050) + { + if (aac->channel_configuration <= 2) + return 1; // Level 1/5 + } + else if (aac->sampling_frequency <= 48000) + { + if (aac->channel_configuration <= 2) + return 2; // Level 2/6 + else if (aac->channel_configuration <= 5) + return 3; // Level 3/4/7/8 + } + + return 8; +} + +// Table 1.10 C Levels for the AAC Profile +static int mpeg4_aac_level(const struct mpeg4_aac_t* aac) +{ + if (aac->sampling_frequency <= 24000) + { + if (aac->channel_configuration <= 2) + return 1; // AAC Profile, Level 1 + } + else if (aac->sampling_frequency <= 48000) + { + if (aac->channel_configuration <= 2) + return 2; // Level 2 + else if (aac->channel_configuration <= 5) + return 4; // Level 4 + } + else if (aac->sampling_frequency <= 96000) + { + if (aac->channel_configuration <= 5) + return 5; // Level 5 + } + + return 5; +} + +static int mpeg4_aac_he_level(const struct mpeg4_aac_t* aac) +{ + if (aac->sampling_frequency <= 48000) + { + if (aac->channel_configuration <= 2) + return aac->sbr ? 3 : 2; // Level 2/3 + else if (aac->channel_configuration <= 5) + return 4; // Level 4 + } + else if (aac->sampling_frequency <= 96000) + { + if (aac->channel_configuration <= 5) + return 5; // Level 5 + } + + return 5; +} + +// ISO/IEC 14496-3:2009(E) Table 1.14 - audioProfileLevelIndication values (p51) +int mpeg4_aac_profile_level(const struct mpeg4_aac_t* aac) +{ + // Table 1.10 - Levels for the AAC Profile (p49) + // Table 1.14 - audioProfileLevelIndication values (p51) + switch (aac->profile) + { + case MPEG4_AAC_LC: + return mpeg4_aac_level(aac) - 1 + 0x28; // AAC Profile + case MPEG4_AAC_SBR: + return mpeg4_aac_he_level(aac) - 2 + 0x2C; // High Efficiency AAC Profile + case MPEG4_AAC_PS: + return mpeg4_aac_he_level(aac) - 2 + 0x30; // High Efficiency AAC v2 Profile + case MPEG4_AAC_CELP: + return mpeg4_aac_high_quality_level(aac) - 1 + 0x0E; // High Quality Audio Profile + default: + return 1; // Main Audio Profile, Level 1 + } +} + +#define ARRAYOF(arr) sizeof(arr)/sizeof(arr[0]) + +static const int s_frequency[] = { 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000, 7350 }; + +int mpeg4_aac_audio_frequency_to(enum mpeg4_aac_frequency index) +{ + if (index < 0 || index >= ARRAYOF(s_frequency)) + return 0; + return s_frequency[index]; +} + +int mpeg4_aac_audio_frequency_from(int frequence) +{ + int i = 0; + while (i < ARRAYOF(s_frequency) && s_frequency[i] != frequence) i++; + return i >= ARRAYOF(s_frequency) ? -1 : i; +} + +uint8_t mpeg4_aac_channel_count(uint8_t channel_configuration) +{ + static const uint8_t s_channels[] = { 0, 1, 2, 3, 4, 5, 6, 8 }; + if (channel_configuration < 0 || channel_configuration >= ARRAYOF(s_channels)) + return 0; + return s_channels[channel_configuration]; +} +#undef ARRAYOF + +#if defined(_DEBUG) || defined(DEBUG) +void mpeg4_aac_test(void) +{ + struct mpeg4_aac_t aac, aac2; + const unsigned char asc[] = { 0x13, 0x88 }; + const unsigned char adts[] = { 0xFF, 0xF1, 0x5C, 0x40, 0x01, 0x1F, 0xFC }; +// const unsigned char ascsbr[] = { 0x13, 0x10, 0x56, 0xe5, 0x9d, 0x48, 0x00 }; + const unsigned char ascsbr[] = { 0x2b, 0x92, 0x08, 0x00 }; + const unsigned char asc8ch[] = { 0x12, 0x00, 0x05, 0x08, 0x48, 0x00, 0x20, 0x00, 0xC6, 0x40, 0x0D, 0x4C, 0x61, 0x76, 0x63, 0x35, 0x38, 0x2E, 0x39, 0x37, 0x2E, 0x31, 0x30, 0x32, 0x56, 0xE5, 0x00 }; + // https://datatracker.ietf.org/doc/html/rfc6416#page-25 + const unsigned char mux1[] = { 0x40, 0x00, 0x8B, 0x18, 0x38, 0x83, 0x80 }; // 6 kbit/s CELP + const unsigned char mux2[] = { 0x40, 0x00, 0x26, 0x20, 0x3f, 0xc0 }; // 64 kbit/s AAC LC Stereo + const unsigned char mux3[] = { 0x40, 0x00, 0x56, 0x23, 0x10, 0x1f, 0xe0 }; // Hierarchical Signaling of SBR + const unsigned char mux4[] = { 0x40, 0x00, 0x26, 0x10, 0x3f, 0xc0 }; // HE AAC v2 Signaling + const unsigned char mux5[] = { 0x40, 0x01, 0xd6, 0x13, 0x10, 0x1f, 0xe0 }; // Hierarchical Signaling of PS + const unsigned char mux6[] = { 0x8F, 0xF8, 0x00, 0x41, 0x92, 0xB1, 0x18, 0x80, 0xFF, 0x0D, 0xDE, 0x36, 0x99, 0xF2, 0x40, 0x8C, 0x00, 0x53, 0x6C, 0x02, 0x31, 0x3C, 0xF3, 0xCE, 0x0F, 0xF0 }; // MPEG Surround + const unsigned char mux7[] = { 0x40, 0x00, 0x56, 0x23, 0x10, 0x1f, 0xe0 }; // MPEG Surround with Extended SDP Parameters + const unsigned char mux8[] = { 0x8F, 0xF8, 0x00, 0x06, 0x52, 0xB9, 0x20, 0x87, 0x6A, 0x83, 0xA1, 0xF4, 0x40, 0x88, 0x40, 0x53, 0x62, 0x0F, 0xF0 }; // MPEG Surround with Single-Layer Configuration + + unsigned char data[32]; + + assert(sizeof(ascsbr) == mpeg4_aac_audio_specific_config_load(ascsbr, sizeof(ascsbr), &aac)); + assert(2 == aac.profile && 7 == aac.sampling_frequency_index && 2 == aac.channel_configuration); + //assert(sizeof(ascsbr) == mpeg4_aac_audio_specific_config_save(&aac, data, sizeof(data))); + //assert(0 == memcmp(ascsbr, data, sizeof(ascsbr))); + + assert(sizeof(asc) == mpeg4_aac_audio_specific_config_load(asc, sizeof(asc), &aac)); + assert(2 == aac.profile && 7 == aac.sampling_frequency_index && 1 == aac.channel_configuration); + assert(sizeof(asc) == mpeg4_aac_audio_specific_config_save(&aac, data, sizeof(data))); + assert(0 == memcmp(asc, data, sizeof(asc))); + + assert(sizeof(adts) == mpeg4_aac_adts_save(&aac, 1, data, sizeof(data))); + assert(0 == memcmp(adts, data, sizeof(adts))); + assert(7 == mpeg4_aac_adts_load(data, sizeof(adts), &aac2)); + assert(0 == memcmp(&aac, &aac2, sizeof(aac))); + + assert(22050 == mpeg4_aac_audio_frequency_to(aac.sampling_frequency_index)); + assert(aac.sampling_frequency_index == mpeg4_aac_audio_frequency_from(22050)); + + //assert(sizeof(ascsbr) == mpeg4_aac_audio_specific_config_load(ascsbr, sizeof(ascsbr), &aac)); + //assert(2 == aac.profile && 6 == aac.sampling_frequency_index && 1 == aac.channel_configuration); + + assert(sizeof(asc8ch) == mpeg4_aac_audio_specific_config_load(asc8ch, sizeof(asc8ch), &aac)); + assert(2 == aac.profile && 4 == aac.sampling_frequency_index && 8 == aac.channels); + assert(29 == mpeg4_aac_adts_save(&aac, 1, data, sizeof(data))); + + memset(&aac, 0, sizeof(aac)); + mpeg4_aac_stream_mux_config_load(mux1, sizeof(mux1), &aac); + mpeg4_aac_stream_mux_config_load(mux2, sizeof(mux2), &aac); + mpeg4_aac_stream_mux_config_load(mux3, sizeof(mux3), &aac); + mpeg4_aac_stream_mux_config_load(mux4, sizeof(mux4), &aac); + mpeg4_aac_stream_mux_config_load(mux5, sizeof(mux5), &aac); + //mpeg4_aac_stream_mux_config_load(mux6, sizeof(mux6), &aac); + //mpeg4_aac_stream_mux_config_load(mux7, sizeof(mux7), &aac); + //mpeg4_aac_stream_mux_config_load(mux8, sizeof(mux8), &aac); + mpeg4_aac_stream_mux_config_save(&aac, data, sizeof(data)); + //assert(0 == memcmp(data, mux1, sizeof(mux1))); +} +#endif diff --git a/src/big/mpp/middleware/src/mp4_format/src/libflv/source/mpeg4-annexbtomp4.c b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/mpeg4-annexbtomp4.c new file mode 100644 index 000000000..4570aad25 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/mpeg4-annexbtomp4.c @@ -0,0 +1,518 @@ +// ISO/IEC 14496-1:2010(E) +// Annex I: Usage of ITU-T Recommendation H.264 | ISO/IEC 14496-10 AVC (p150) +// +// 1. Start Codes shall not be present in the stream. The field indicating the size of each following NAL unit +// shall be added before NAL unit.The size of this field is defined in DecoderSpecificInfo. +// 2. It is recommended encapsulating one NAL unit in one SL packet when it is delivered over lossy environment. + +#include "mpeg4-avc.h" +#include +#include +#include +#include +#include + +#define H264_NAL_IDR 5 // Coded slice of an IDR picture +#define H264_NAL_SPS 7 // Sequence parameter set +#define H264_NAL_PPS 8 // Picture parameter set +#define H264_NAL_AUD 9 // Access unit delimiter + +#define H2645_BITSTREAM_FORMAT_DETECT + +struct h264_annexbtomp4_handle_t +{ + struct mpeg4_avc_t* avc; + int errcode; + int* update; // avc sps/pps update flags + int* vcl; + + uint8_t* out; + size_t bytes; + size_t capacity; +}; + +static const uint8_t* h264_startcode(const uint8_t *data, size_t bytes) +{ + size_t i; + for (i = 2; i + 1 < bytes; i++) + { + if (0x01 == data[i] && 0x00 == data[i - 1] && 0x00 == data[i - 2]) + return data + i + 1; + } + + return NULL; +} + +/// @return >0-ok, <=0-error +static inline int h264_avcc_length(const uint8_t* h264, size_t bytes, size_t avcc) +{ + size_t i; + uint32_t n; + + n = 0; + assert(3 <= avcc && avcc <= 4); + for (i = 0; i < avcc && i < bytes; i++) + n = (n << 8) | h264[i]; + return avcc >= bytes ? -1 : (int)n; +} + +/// @return 1-true, 0-false +static int mpeg4_h264_avcc_bitstream_valid(const uint8_t* h264, size_t bytes, size_t avcc) +{ + size_t n; + + while(avcc + 1 < bytes) + { + n = h264_avcc_length(h264, bytes, avcc); + if (n < 0 || n + avcc > bytes) + return 0; // invalid + + h264 += n + avcc; + bytes -= n + avcc; + } + + return 0 == bytes ? 1 : 0; +} + +/// @return 0-annexb, >0-avcc, <0-error +int mpeg4_h264_bitstream_format(const uint8_t* h264, size_t bytes) +{ + uint32_t n; + if (bytes < 4) + return -1; + + n = ((uint32_t)h264[0]) << 16 | ((uint32_t)h264[1]) << 8 | ((uint32_t)h264[2]); + if (0 == n && h264[3] <= 1) + { + return 0; // annexb + } + else if(1 == n) + { + // try avcc & annexb + return mpeg4_h264_avcc_bitstream_valid(h264, bytes, 4) ? 4 : 0; + } + else + { + // try avcc 4/3 bytes + return mpeg4_h264_avcc_bitstream_valid(h264, bytes, 4) ? 4 : (mpeg4_h264_avcc_bitstream_valid(h264, bytes, 3) ? 3 : -1); + } +} + +static int mpeg4_h264_avcc_nalu(const void* h264, size_t bytes, int avcc, void (*handler)(void* param, const uint8_t* nalu, size_t bytes), void* param) +{ + uint32_t n; + const uint8_t* p, * end; + + p = (const uint8_t*)h264; + end = (const uint8_t*)h264 + bytes; + for(n = h264_avcc_length(p, (int)(end - p), avcc); p + n + avcc <= end; n = h264_avcc_length(p, (int)(end - p), avcc)) + { + assert(n > 0); + if (n > 0) + { + handler(param, p + avcc, (int)n); + } + + p += n + avcc; + } + + return 0; +} + +///@param[in] h264 H.264 byte stream format data(A set of NAL units) +int mpeg4_h264_annexb_nalu(const void* h264, size_t bytes, void (*handler)(void* param, const uint8_t* nalu, size_t bytes), void* param) +{ + ptrdiff_t n; + const uint8_t* p, *next, *end; + +#if defined(H2645_BITSTREAM_FORMAT_DETECT) + int avcc; + avcc = mpeg4_h264_bitstream_format(h264, bytes); + if (avcc > 0) + return mpeg4_h264_avcc_nalu(h264, bytes, avcc, handler, param); +#endif + + end = (const uint8_t*)h264 + bytes; + p = h264_startcode((const uint8_t*)h264, bytes); + + while (p) + { + next = h264_startcode(p, (int)(end - p)); + if (next) + { + n = next - p - 3; + } + else + { + n = end - p; + } + + while (n > 0 && 0 == p[n - 1]) n--; // filter tailing zero + + assert(n > 0); + if (n > 0) + { + handler(param, p, (int)n); + } + + p = next; + } + + return 0; +} + +uint8_t mpeg4_h264_read_ue(const uint8_t* data, size_t bytes, size_t* offset) +{ + int bit, i; + int leadingZeroBits = -1; + + for (bit = 0; !bit && *offset / 8 < bytes; ++leadingZeroBits) + { + bit = (data[*offset / 8] >> (7 - (*offset % 8))) & 0x01; + ++*offset; + } + + bit = 0; + assert(leadingZeroBits < 32); + for (i = 0; i < leadingZeroBits && *offset / 8 < bytes; i++) + { + bit = (bit << 1) | ((data[*offset / 8] >> (7 - (*offset % 8))) & 0x01); + ++*offset; + } + + return (uint8_t)((1 << leadingZeroBits) - 1 + bit); +} + +static void mpeg4_avc_remove(struct mpeg4_avc_t* avc, uint8_t* ptr, size_t bytes, const uint8_t* end) +{ + uint8_t i; + assert(ptr >= avc->data && ptr + bytes <= end && end <= avc->data + sizeof(avc->data)); + memmove(ptr, ptr + bytes, end - ptr - bytes); + + for (i = 0; i < avc->nb_sps; i++) + { + if (avc->sps[i].data > ptr) + avc->sps[i].data -= bytes; + } + + for (i = 0; i < avc->nb_pps; i++) + { + if (avc->pps[i].data > ptr) + avc->pps[i].data -= bytes; + } +} + +static int h264_sps_copy(struct mpeg4_avc_t* avc, const uint8_t* nalu, size_t bytes) +{ + size_t i; + size_t offset; + uint8_t spsid; + + if (bytes < 4 + 1) + { + assert(0); + return -1; // invalid length + } + + offset = 4 * 8; // 1-NALU + 3-profile+flags+level + spsid = mpeg4_h264_read_ue(nalu, bytes, &offset); + + for (i = 0; i < avc->nb_sps; i++) + { + offset = 4 * 8; // reset offset + if (spsid == mpeg4_h264_read_ue(avc->sps[i].data, avc->sps[i].bytes, &offset)) + { + if (bytes == avc->sps[i].bytes && 0 == memcmp(nalu, avc->sps[i].data, bytes)) + return 0; // do nothing + + if (bytes > avc->sps[i].bytes && avc->off + (bytes - avc->sps[i].bytes) > sizeof(avc->data)) + { + assert(0); + return -1; // too big + } + + mpeg4_avc_remove(avc, avc->sps[i].data, avc->sps[i].bytes, avc->data + avc->off); + avc->off -= avc->sps[i].bytes; + + avc->sps[i].data = avc->data + avc->off; + avc->sps[i].bytes = (uint16_t)bytes; + memcpy(avc->sps[i].data, nalu, bytes); + avc->off += bytes; + return 1; // set update flag + } + } + + // copy new + assert(avc->nb_sps < sizeof(avc->sps) / sizeof(avc->sps[0])); + if (avc->nb_sps >= sizeof(avc->sps) / sizeof(avc->sps[0]) + || avc->off + bytes > sizeof(avc->data)) + { + assert(0); + return -1; + } + + avc->sps[avc->nb_sps].data = avc->data + avc->off; + avc->sps[avc->nb_sps].bytes = (uint16_t)bytes; + memcpy(avc->sps[avc->nb_sps].data, nalu, bytes); + avc->off += bytes; + ++avc->nb_sps; + return 1; // set update flag +} + +static int h264_pps_copy(struct mpeg4_avc_t* avc, const uint8_t* nalu, size_t bytes) +{ + size_t i; + size_t offset; + uint8_t spsid; + uint8_t ppsid; + + if (bytes < 1 + 1) + { + assert(0); + return -1; // invalid length + } + + offset = 1 * 8; // 1-NALU + ppsid = mpeg4_h264_read_ue(nalu, bytes, &offset); + spsid = mpeg4_h264_read_ue(nalu, bytes, &offset); + + for (i = 0; i < avc->nb_pps; i++) + { + offset = 1 * 8; // reset offset + if (ppsid == mpeg4_h264_read_ue(avc->pps[i].data, avc->pps[i].bytes, &offset) && spsid == mpeg4_h264_read_ue(avc->pps[i].data, avc->pps[i].bytes, &offset)) + { + if (bytes == avc->pps[i].bytes && 0 == memcmp(nalu, avc->pps[i].data, bytes)) + return 0; // do nothing + + if (bytes > avc->pps[i].bytes && avc->off + (bytes - avc->pps[i].bytes) > sizeof(avc->data)) + { + assert(0); + return -1; // too big + } + + mpeg4_avc_remove(avc, avc->pps[i].data, avc->pps[i].bytes, avc->data + avc->off); + avc->off -= avc->pps[i].bytes; + + avc->pps[i].data = avc->data + avc->off; + avc->pps[i].bytes = (uint16_t)bytes; + memcpy(avc->pps[i].data, nalu, bytes); + avc->off += bytes; + return 1; // set update flag + } + } + + // fix openh264 sps/pps id cycle (0/0, 1/1, 2/2, ..., 31/31, 0/32, 1/33, ...) + if ((unsigned int)avc->nb_pps + 1 >= sizeof(avc->pps) / sizeof(avc->pps[0]) && avc->nb_sps > 16) + { + // replace the oldest pps + mpeg4_avc_remove(avc, avc->pps[0].data, avc->pps[0].bytes, avc->data + avc->off); + avc->off -= avc->pps[0].bytes; + + avc->pps[0].data = avc->data + avc->off; + avc->pps[0].bytes = (uint16_t)bytes; + memcpy(avc->pps[0].data, nalu, bytes); + avc->off += bytes; + return 1; // set update flag + } + + // copy new + assert((unsigned int)avc->nb_pps + 1 < sizeof(avc->pps) / sizeof(avc->pps[0])); + if ((unsigned int)avc->nb_pps + 1 >= sizeof(avc->pps) / sizeof(avc->pps[0]) + || avc->off + bytes > sizeof(avc->data)) + { + assert(0); + return -1; + } + + avc->pps[avc->nb_pps].data = avc->data + avc->off; + avc->pps[avc->nb_pps].bytes = (uint16_t)bytes; + memcpy(avc->pps[avc->nb_pps].data, nalu, bytes); + avc->off += bytes; + ++avc->nb_pps; // fixme: uint8_t overflow + return 1; // set update flag +} + +int mpeg4_avc_update(struct mpeg4_avc_t* avc, const uint8_t* nalu, size_t bytes) +{ + int r; + + switch (nalu[0] & 0x1f) + { + case H264_NAL_SPS: + r = h264_sps_copy(avc, nalu, bytes); + if (1 == r || 1 == avc->nb_sps) + { + // update profile/level + avc->profile = nalu[1]; + avc->compatibility = nalu[2]; + avc->level = nalu[3]; + } + break; + + case H264_NAL_PPS: + r = h264_pps_copy(avc, nalu, bytes); + break; + + default: + r = 0; + } + + return r; +} + +static void h264_handler(void* param, const uint8_t* nalu, size_t bytes) +{ + int r; + uint8_t nalutype; + struct h264_annexbtomp4_handle_t* mp4; + mp4 = (struct h264_annexbtomp4_handle_t*)param; + + if (bytes < 1) + { + assert(0); + return; + } + + nalutype = (nalu[0]) & 0x1f; +#if defined(H2645_FILTER_AUD) + if (H264_NAL_AUD == nalutype) + return; // ignore AUD +#endif + + r = mpeg4_avc_update(mp4->avc, nalu, bytes); + if (1 == r && mp4->update) + *mp4->update = 1; + else if (r < 0) + mp4->errcode = r; + + // IDR-1, B/P-2, other-0 + if (mp4->vcl && 1 <= nalutype && nalutype <= H264_NAL_IDR) + *mp4->vcl = nalutype == H264_NAL_IDR ? 1 : 2; + + if (mp4->capacity >= mp4->bytes + bytes + 4) + { + mp4->out[mp4->bytes + 0] = (uint8_t)((bytes >> 24) & 0xFF); + mp4->out[mp4->bytes + 1] = (uint8_t)((bytes >> 16) & 0xFF); + mp4->out[mp4->bytes + 2] = (uint8_t)((bytes >> 8) & 0xFF); + mp4->out[mp4->bytes + 3] = (uint8_t)((bytes >> 0) & 0xFF); + memmove(mp4->out + mp4->bytes + 4, nalu, bytes); + mp4->bytes += bytes + 4; + } + else + { + mp4->errcode = -E2BIG; + } +} + +int h264_annexbtomp4(struct mpeg4_avc_t* avc, const void* data, size_t bytes, void* out, size_t size, int* vcl, int* update) +{ + struct h264_annexbtomp4_handle_t h; + memset(&h, 0, sizeof(h)); + h.avc = avc; + h.vcl = vcl; + h.update = update; + h.out = (uint8_t*)out; + h.capacity = size; + if (vcl) *vcl = 0; + if (update) *update = 0; + + mpeg4_h264_annexb_nalu(data, bytes, h264_handler, &h); + avc->nalu = 4; + return 0 == h.errcode ? (int)h.bytes : 0; +} + +/// h264_is_new_access_unit H.264 new access unit(frame) +/// @return 1-new access, 0-not a new access +int h264_is_new_access_unit(const uint8_t* nalu, size_t bytes) +{ + enum { NAL_NIDR = 1, NAL_PARTITION_A = 2, NAL_IDR = 5, NAL_SEI = 6, NAL_SPS = 7, NAL_PPS = 8, NAL_AUD = 9, }; + + uint8_t nal_type; + + if(bytes < 2) + return 0; + + nal_type = nalu[0] & 0x1f; + + // 7.4.1.2.3 Order of NAL units and coded pictures and association to access units + if(NAL_AUD == nal_type || NAL_SPS == nal_type || NAL_PPS == nal_type || NAL_SEI == nal_type || (14 <= nal_type && nal_type <= 18)) + return 1; + + // 7.4.1.2.4 Detection of the first VCL NAL unit of a primary coded picture + if(NAL_NIDR == nal_type || NAL_PARTITION_A == nal_type || NAL_IDR == nal_type) + { + // Live555 H264or5VideoStreamParser::parse + // The high-order bit of the byte after the "nal_unit_header" tells us whether it's + // the start of a new 'access unit' (and thus the current NAL unit ends an 'access unit'): + return (nalu[1] & 0x80) ? 1 : 0; // first_mb_in_slice + } + + return 0; +} + +#if defined(_DEBUG) || defined(DEBUG) +static void mpeg4_h264_bitstream_format_test(void) +{ + const uint8_t bs3[] = { 0x00,0x00,0x01,0x67,0x42,0xe0,0x1e,0xab,0xcd, }; + const uint8_t bs4[] = { 0x00,0x00,0x00,0x01,0x67,0x42,0xe0,0x1e,0xab,0xcd, }; + const uint8_t bs5[] = { 0x00,0x00,0x00,0x00,0x01,0x67,0x42,0xe0,0x1e,0xab,0xcd, }; + const uint8_t avcc3[] = { 0x00,0x00,0x06,0x67,0x42,0xe0,0x1e,0xab,0xcd, }; + const uint8_t avcc4[] = { 0x00,0x00,0x00,0x06,0x67,0x42,0xe0,0x1e,0xab,0xcd, }; + assert(0 == mpeg4_h264_bitstream_format(bs3, sizeof(bs3))); + assert(0 == mpeg4_h264_bitstream_format(bs4, sizeof(bs4))); + assert(0 == mpeg4_h264_bitstream_format(bs5, sizeof(bs5))); + assert(3 == mpeg4_h264_bitstream_format(avcc3, sizeof(avcc3))); + assert(4 == mpeg4_h264_bitstream_format(avcc4, sizeof(avcc4))); +} + +static void mpeg4_annexbtomp4_test2(void) +{ + const uint8_t sps[] = { 0x00,0x00,0x00,0x01,0x67,0x42,0xe0,0x1e,0xab,0xcd, }; + const uint8_t pps[] = { 0x00,0x00,0x00,0x01,0x28,0xce,0x3c,0x80 }; + const uint8_t sps1[] = { 0x00,0x00,0x00,0x01,0x67,0x42,0xe0,0x1e,0x4b,0xcd, 0x01 }; + const uint8_t pps1[] = { 0x00,0x00,0x00,0x01,0x28,0xce,0x3c,0x80, 0x01 }; + const uint8_t sps2[] = { 0x00,0x00,0x00,0x01,0x67,0x42,0xe0,0x1e,0xab }; + const uint8_t pps2[] = { 0x00,0x00,0x00,0x01,0x28,0xce,0x3c }; + + int vcl, update; + uint8_t buffer[128]; + struct mpeg4_avc_t avc; + memset(&avc, 0, sizeof(avc)); + + h264_annexbtomp4(&avc, sps, sizeof(sps), buffer, sizeof(buffer), &vcl, &update); + assert(0 == vcl && 1 == update); + h264_annexbtomp4(&avc, pps, sizeof(pps), buffer, sizeof(buffer), &vcl, &update); + assert(0 == vcl && 1 == update && 1 == avc.nb_sps && avc.sps[0].bytes == sizeof(sps)-4 && 0 == memcmp(avc.sps[0].data, sps+4, sizeof(sps) - 4) && 1 == avc.nb_pps && avc.pps[0].bytes == sizeof(pps) - 4 && 0 == memcmp(avc.pps[0].data, pps+4, sizeof(pps) - 4)); + + h264_annexbtomp4(&avc, sps1, sizeof(sps1), buffer, sizeof(buffer), &vcl, &update); + assert(0 == vcl && 1 == update && 2 == avc.nb_sps && avc.sps[0].bytes == sizeof(sps) - 4 && avc.sps[1].bytes == sizeof(sps1) - 4 && 0 == memcmp(avc.sps[0].data, sps+4, sizeof(sps) - 4) && 0 == memcmp(avc.sps[1].data, sps1 + 4, sizeof(sps1) - 4) && 1 == avc.nb_pps && avc.pps[0].bytes == sizeof(pps) - 4 && 0 == memcmp(avc.pps[0].data, pps + 4, sizeof(pps) - 4)); + + h264_annexbtomp4(&avc, pps1, sizeof(pps1), buffer, sizeof(buffer), &vcl, &update); + assert(0 == vcl && 1 == update && 2 == avc.nb_sps && avc.sps[0].bytes == sizeof(sps) - 4 && avc.sps[1].bytes == sizeof(sps1) - 4 && 0 == memcmp(avc.sps[0].data, sps + 4, sizeof(sps) - 4) && 0 == memcmp(avc.sps[1].data, sps1 + 4, sizeof(sps1) - 4) && 1 == avc.nb_pps && avc.pps[0].bytes == sizeof(pps1) - 4 && 0 == memcmp(avc.pps[0].data, pps1 + 4, sizeof(pps1) - 4)); + + h264_annexbtomp4(&avc, sps2, sizeof(sps2), buffer, sizeof(buffer), &vcl, &update); + assert(0 == vcl && 1 == update && 2 == avc.nb_sps && avc.sps[0].bytes == sizeof(sps2) - 4 && avc.sps[1].bytes == sizeof(sps1) - 4 && 0 == memcmp(avc.sps[0].data, sps2 + 4, sizeof(sps2) - 4) && 0 == memcmp(avc.sps[1].data, sps1 + 4, sizeof(sps1) - 4) && 1 == avc.nb_pps && avc.pps[0].bytes == sizeof(pps1) - 4 && 0 == memcmp(avc.pps[0].data, pps1 + 4, sizeof(pps1) - 4)); + + h264_annexbtomp4(&avc, pps2, sizeof(pps2), buffer, sizeof(buffer), &vcl, &update); + assert(0 == vcl && 1 == update && 2 == avc.nb_sps && avc.sps[0].bytes == sizeof(sps2) - 4 && avc.sps[1].bytes == sizeof(sps1) - 4 && 0 == memcmp(avc.sps[0].data, sps2 + 4, sizeof(sps2) - 4) && 0 == memcmp(avc.sps[1].data, sps1 + 4, sizeof(sps1) - 4) && 1 == avc.nb_pps && avc.pps[0].bytes == sizeof(pps2) - 4 && 0 == memcmp(avc.pps[0].data, pps2 + 4, sizeof(pps2) - 4)); +} + +void mpeg4_annexbtomp4_test(void) +{ + const uint8_t sps[] = { 0x67,0x42,0xe0,0x1e,0xab }; + const uint8_t pps[] = { 0x28,0xce,0x3c,0x80 }; + const uint8_t annexb[] = { 0x00,0x00,0x00,0x01,0x67,0x42,0xe0,0x1e,0xab, 0x00,0x00,0x00,0x01,0x28,0xce,0x3c,0x80,0x00,0x00,0x00,0x01,0x65,0x11 }; + uint8_t output[256]; + int vcl, update; + + struct mpeg4_avc_t avc; + memset(&avc, 0, sizeof(avc)); + assert(h264_annexbtomp4(&avc, annexb, sizeof(annexb), output, sizeof(output), &vcl, &update) > 0); + assert(1 == avc.nb_sps && avc.sps[0].bytes == sizeof(sps) && 0 == memcmp(avc.sps[0].data, sps, sizeof(sps))); + assert(1 == avc.nb_pps && avc.pps[0].bytes == sizeof(pps) && 0 == memcmp(avc.pps[0].data, pps, sizeof(pps))); + assert(vcl == 1); + + mpeg4_annexbtomp4_test2(); + mpeg4_h264_bitstream_format_test(); +} +#endif diff --git a/src/big/mpp/middleware/src/mp4_format/src/libflv/source/mpeg4-avc.c b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/mpeg4-avc.c new file mode 100644 index 000000000..f38772cce --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/mpeg4-avc.c @@ -0,0 +1,277 @@ +#include "mpeg4-avc.h" +#include +#include +#include + +/* +ISO/IEC 14496-15:2010(E) 5.2.4.1.1 Syntax (p16) + +aligned(8) class AVCDecoderConfigurationRecord { + unsigned int(8) configurationVersion = 1; + unsigned int(8) AVCProfileIndication; + unsigned int(8) profile_compatibility; + unsigned int(8) AVCLevelIndication; + bit(6) reserved = '111111'b; + unsigned int(2) lengthSizeMinusOne; + bit(3) reserved = '111'b; + + unsigned int(5) numOfSequenceParameterSets; + for (i=0; i< numOfSequenceParameterSets; i++) { + unsigned int(16) sequenceParameterSetLength ; + bit(8*sequenceParameterSetLength) sequenceParameterSetNALUnit; + } + + unsigned int(8) numOfPictureParameterSets; + for (i=0; i< numOfPictureParameterSets; i++) { + unsigned int(16) pictureParameterSetLength; + bit(8*pictureParameterSetLength) pictureParameterSetNALUnit; + } + + if( profile_idc == 100 || profile_idc == 110 || + profile_idc == 122 || profile_idc == 144 ) + { + bit(6) reserved = '111111'b; + unsigned int(2) chroma_format; + bit(5) reserved = '11111'b; + unsigned int(3) bit_depth_luma_minus8; + bit(5) reserved = '11111'b; + unsigned int(3) bit_depth_chroma_minus8; + unsigned int(8) numOfSequenceParameterSetExt; + for (i=0; i< numOfSequenceParameterSetExt; i++) { + unsigned int(16) sequenceParameterSetExtLength; + bit(8*sequenceParameterSetExtLength) sequenceParameterSetExtNALUnit; + } + } +} +*/ +static int _mpeg4_avc_decoder_configuration_record_load(const uint8_t* data, size_t bytes, struct mpeg4_avc_t* avc) +{ + uint8_t i; + uint32_t j; + uint16_t len; + uint8_t *p, *end; + + if (bytes < 7) return -1; + assert(1 == data[0]); +// avc->version = data[0]; + avc->profile = data[1]; + avc->compatibility = data[2]; + avc->level = data[3]; + avc->nalu = (data[4] & 0x03) + 1; + avc->nb_sps = data[5] & 0x1F; + if (avc->nb_sps > sizeof(avc->sps) / sizeof(avc->sps[0])) + { + assert(0); + return -1; // sps <= 32 + } + + j = 6; + p = avc->data; + end = avc->data + sizeof(avc->data); + for (i = 0; i < avc->nb_sps && j + 2 < bytes; ++i) + { + len = (data[j] << 8) | data[j + 1]; + if (j + 2 + len >= bytes || p + len > end) + { + assert(0); + return -1; + } + + memcpy(p, data + j + 2, len); + avc->sps[i].data = p; + avc->sps[i].bytes = len; + j += len + 2; + p += len; + } + + if (j >= bytes || (unsigned int)data[j] > sizeof(avc->pps) / sizeof(avc->pps[0])) + { + assert(0); + return -1; + } + + avc->nb_pps = data[j++]; + for (i = 0; i < avc->nb_pps && j + 2 < bytes; i++) + { + len = (data[j] << 8) | data[j + 1]; + if (j + 2 + len > bytes || p + len > end) + { + assert(0); + return -1; + } + + memcpy(p, data + j + 2, len); + avc->pps[i].data = p; + avc->pps[i].bytes = len; + j += len + 2; + p += len; + } + + avc->off = (int)(p - avc->data); + return j; +} + +int mpeg4_avc_decoder_configuration_record_save(const struct mpeg4_avc_t* avc, uint8_t* data, size_t bytes) +{ + uint8_t i; + uint8_t *p = data; + + assert(0 < avc->nalu && avc->nalu <= 4); + if (bytes < 7 || avc->nb_sps > 32) return -1; + bytes -= 7; + + // AVCDecoderConfigurationRecord + // ISO/IEC 14496-15:2010 + // 5.2.4.1.1 Syntax + p[0] = 1; // configurationVersion + p[1] = avc->profile; // AVCProfileIndication + p[2] = avc->compatibility; // profile_compatibility + p[3] = avc->level; // AVCLevelIndication + p[4] = 0xFC | (avc->nalu - 1); // lengthSizeMinusOne: 3 + p += 5; + + // sps + *p++ = 0xE0 | avc->nb_sps; + for (i = 0; i < avc->nb_sps && bytes >= (size_t)avc->sps[i].bytes + 2; i++) + { + *p++ = (avc->sps[i].bytes >> 8) & 0xFF; + *p++ = avc->sps[i].bytes & 0xFF; + memcpy(p, avc->sps[i].data, avc->sps[i].bytes); + + p += avc->sps[i].bytes; + bytes -= avc->sps[i].bytes + 2; + } + if (i < avc->nb_sps) return -1; // check length + + // pps + *p++ = avc->nb_pps; + for (i = 0; i < avc->nb_pps && bytes >= (size_t)avc->pps[i].bytes + 2; i++) + { + *p++ = (avc->pps[i].bytes >> 8) & 0xFF; + *p++ = avc->pps[i].bytes & 0xFF; + memcpy(p, avc->pps[i].data, avc->pps[i].bytes); + + p += avc->pps[i].bytes; + bytes -= avc->pps[i].bytes + 2; + } + if (i < avc->nb_pps) return -1; // check length + + if (bytes >= 4) + { + if (avc->profile == 100 || avc->profile == 110 || + avc->profile == 122 || avc->profile == 244 || avc->profile == 44 || + avc->profile == 83 || avc->profile == 86 || avc->profile == 118 || + avc->profile == 128 || avc->profile == 138 || avc->profile == 139 || + avc->profile == 134) + { + *p++ = 0xFC | avc->chroma_format_idc; + *p++ = 0xF8 | avc->bit_depth_luma_minus8; + *p++ = 0xF8 | avc->bit_depth_chroma_minus8; + *p++ = 0; // numOfSequenceParameterSetExt + } + } + + return (int)(p - data); +} + +#define H264_STARTCODE(p) (p[0]==0 && p[1]==0 && (p[2]==1 || (p[2]==0 && p[3]==1))) + +int mpeg4_avc_from_nalu(const uint8_t* data, size_t bytes, struct mpeg4_avc_t* avc) +{ + int r; + r = h264_annexbtomp4(avc, data, bytes, NULL, 0, NULL, NULL); + return avc->nb_sps > 0 && avc->nb_pps > 0 ? bytes : r; +} + +int mpeg4_avc_to_nalu(const struct mpeg4_avc_t* avc, uint8_t* data, size_t bytes) +{ + uint8_t i; + size_t k = 0; + uint8_t* h264 = data; + + // sps + for (i = 0; i < avc->nb_sps && bytes >= k + avc->sps[i].bytes + 4; i++) + { + if (avc->sps[i].bytes < 4 || !H264_STARTCODE(avc->sps[i].data)) + { + h264[k++] = 0; + h264[k++] = 0; + h264[k++] = 0; + h264[k++] = 1; + } + memcpy(h264 + k, avc->sps[i].data, avc->sps[i].bytes); + + k += avc->sps[i].bytes; + } + if (i < avc->nb_sps) return -1; // check length + + // pps + for (i = 0; i < avc->nb_pps && bytes >= k + avc->pps[i].bytes + 2; i++) + { + if (avc->pps[i].bytes < 4 || !H264_STARTCODE(avc->pps[i].data)) + { + h264[k++] = 0; + h264[k++] = 0; + h264[k++] = 0; + h264[k++] = 1; + } + memcpy(h264 + k, avc->pps[i].data, avc->pps[i].bytes); + + k += avc->pps[i].bytes; + } + if (i < avc->nb_pps) return -1; // check length + + assert(k < 0x7FFF); + return (int)k; +} + +int mpeg4_avc_codecs(const struct mpeg4_avc_t* avc, char* codecs, size_t bytes) +{ + // https://tools.ietf.org/html/rfc6381#section-3.3 + // https://developer.mozilla.org/en-US/docs/Web/Media/Formats/codecs_parameter + return snprintf(codecs, bytes, "avc1.%02x%02x%02x", avc->profile, avc->compatibility, avc->level); +} + +int mpeg4_avc_decoder_configuration_record_load(const uint8_t* data, size_t bytes, struct mpeg4_avc_t* avc) +{ + int r; + r = _mpeg4_avc_decoder_configuration_record_load(data, bytes, avc); + if (r > 0 && avc->nb_sps > 0 && avc->nb_pps > 0) + return r; + + // try annexb + memset(avc, 0, sizeof(*avc)); + return mpeg4_avc_from_nalu(data, bytes, avc); +} + +#if defined(_DEBUG) || defined(DEBUG) +void mpeg4_annexbtomp4_test(void); +void mpeg4_avc_test(void) +{ + const unsigned char src[] = { + 0x01,0x42,0xe0,0x1e,0xff,0xe1,0x00,0x21,0x67,0x42,0xe0,0x1e,0xab,0x40,0xf0,0x28, + 0xd0,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x19,0x70,0x20,0x00,0x78,0x00,0x00,0x0f, + 0x00,0x16,0xb1,0xb0,0x3c,0x50,0xaa,0x80,0x80,0x01,0x00,0x04,0x28,0xce,0x3c,0x80 + }; + const unsigned char nalu[] = { + 0x00,0x00,0x00,0x01,0x67,0x42,0xe0,0x1e,0xab,0x40,0xf0,0x28,0xd0,0x80,0x00,0x00, + 0x00,0x80,0x00,0x00,0x19,0x70,0x20,0x00,0x78,0x00,0x00,0x0f,0x00,0x16,0xb1,0xb0, + 0x3c,0x50,0xaa,0x80,0x80,0x00,0x00,0x00,0x01,0x28,0xce,0x3c,0x80 + }; + unsigned char data[sizeof(src)]; + + struct mpeg4_avc_t avc; + assert(sizeof(src) == mpeg4_avc_decoder_configuration_record_load(src, sizeof(src), &avc)); + assert(0x42 == avc.profile && 0xe0 == avc.compatibility && 0x1e == avc.level); + assert(4 == avc.nalu && 1 == avc.nb_sps && 1 == avc.nb_pps); + assert(sizeof(src) == mpeg4_avc_decoder_configuration_record_save(&avc, data, sizeof(data))); + assert(0 == memcmp(src, data, sizeof(src))); + mpeg4_avc_codecs(&avc, (char*)data, sizeof(data)); + assert(0 == memcmp("avc1.42e01e", data, 11)); + + assert(sizeof(nalu) == mpeg4_avc_to_nalu(&avc, data, sizeof(data))); + assert(0 == memcmp(nalu, data, sizeof(nalu))); + + mpeg4_annexbtomp4_test(); +} +#endif diff --git a/src/big/mpp/middleware/src/mp4_format/src/libflv/source/mpeg4-hevc.c b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/mpeg4-hevc.c new file mode 100644 index 000000000..62498bc15 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/mpeg4-hevc.c @@ -0,0 +1,329 @@ +#include "mpeg4-hevc.h" +#include +#include +#include + +#define H265_VPS 32 +#define H265_SPS 33 +#define H265_PPS 34 +#define H265_PREFIX_SEI 39 +#define H265_SUFFIX_SEI 40 + +static uint8_t* w32(uint8_t* p, uint32_t v) +{ + *p++ = (uint8_t)(v >> 24); + *p++ = (uint8_t)(v >> 16); + *p++ = (uint8_t)(v >> 8); + *p++ = (uint8_t)v; + return p; +} + +static uint8_t* w16(uint8_t* p, uint16_t v) +{ + *p++ = (uint8_t)(v >> 8); + *p++ = (uint8_t)v; + return p; +} + +/* +ISO/IEC 14496-15:2017(E) 8.3.3.1.2 Syntax (p71) + +aligned(8) class HEVCDecoderConfigurationRecord { + unsigned int(8) configurationVersion = 1; + unsigned int(2) general_profile_space; + unsigned int(1) general_tier_flag; + unsigned int(5) general_profile_idc; + unsigned int(32) general_profile_compatibility_flags; + unsigned int(48) general_constraint_indicator_flags; + unsigned int(8) general_level_idc; + bit(4) reserved = '1111'b; + unsigned int(12) min_spatial_segmentation_idc; + bit(6) reserved = '111111'b; + unsigned int(2) parallelismType; + bit(6) reserved = '111111'b; + unsigned int(2) chromaFormat; + bit(5) reserved = '11111'b; + unsigned int(3) bitDepthLumaMinus8; + bit(5) reserved = '11111'b; + unsigned int(3) bitDepthChromaMinus8; + bit(16) avgFrameRate; + bit(2) constantFrameRate; + bit(3) numTemporalLayers; + bit(1) temporalIdNested; + unsigned int(2) lengthSizeMinusOne; + unsigned int(8) numOfArrays; + for (j=0; j < numOfArrays; j++) { + bit(1) array_completeness; + unsigned int(1) reserved = 0; + unsigned int(6) NAL_unit_type; + unsigned int(16) numNalus; + for (i=0; i< numNalus; i++) { + unsigned int(16) nalUnitLength; + bit(8*nalUnitLength) nalUnit; + } + } +} +*/ +static int _mpeg4_hevc_decoder_configuration_record_load(const uint8_t* data, size_t bytes, struct mpeg4_hevc_t* hevc) +{ + uint8_t nalutype; + uint16_t i, j, k, n, numOfArrays; + const uint8_t* p; + uint8_t* dst; + + if (bytes < 23) + return -1; + + hevc->configurationVersion = data[0]; + if (1 != hevc->configurationVersion) + return -1; + + hevc->general_profile_space = (data[1] >> 6) & 0x03; + hevc->general_tier_flag = (data[1] >> 5) & 0x01; + hevc->general_profile_idc = data[1] & 0x1F; + hevc->general_profile_compatibility_flags = (data[2] << 24) | (data[3] << 16) | (data[4] << 8) | data[5]; + hevc->general_constraint_indicator_flags = ((uint32_t)data[6] << 24) | ((uint32_t)data[7] << 16) | ((uint32_t)data[8] << 8) | (uint32_t)data[9]; + hevc->general_constraint_indicator_flags = (hevc->general_constraint_indicator_flags << 16) | (((uint64_t)data[10]) << 8) | data[11]; + hevc->general_level_idc = data[12]; + hevc->min_spatial_segmentation_idc = ((data[13] & 0x0F) << 8) | data[14]; + hevc->parallelismType = data[15] & 0x03; + hevc->chromaFormat = data[16] & 0x03; + hevc->bitDepthLumaMinus8 = data[17] & 0x07; + hevc->bitDepthChromaMinus8 = data[18] & 0x07; + hevc->avgFrameRate = (data[19] << 8) | data[20]; + hevc->constantFrameRate = (data[21] >> 6) & 0x03; + hevc->numTemporalLayers = (data[21] >> 3) & 0x07; + hevc->temporalIdNested = (data[21] >> 2) & 0x01; + hevc->lengthSizeMinusOne = data[21] & 0x03; + numOfArrays = data[22]; + + p = data + 23; + dst = hevc->data; + hevc->numOfArrays = 0; + for (i = 0; i < numOfArrays; i++) + { + if (p + 3 > data + bytes) + return -1; + + nalutype = p[0]; + n = (p[1] << 8) | p[2]; + p += 3; + + for (j = 0; j < n; j++) + { + if (hevc->numOfArrays >= sizeof(hevc->nalu) / sizeof(hevc->nalu[0])) + { + assert(0); + return -1; // too many nalu(s) + } + + if (p + 2 > data + bytes) + return -1; + + k = (p[0] << 8) | p[1]; + if (p + 2 + k > data + bytes || dst + k > hevc->data + sizeof(hevc->data)) + { + assert(0); + return -1; + } + + assert((nalutype & 0x3F) == ((p[2] >> 1) & 0x3F)); + hevc->nalu[hevc->numOfArrays].array_completeness = (nalutype >> 7) & 0x01; + hevc->nalu[hevc->numOfArrays].type = nalutype & 0x3F; + hevc->nalu[hevc->numOfArrays].bytes = k; + hevc->nalu[hevc->numOfArrays].data = dst; + memcpy(hevc->nalu[hevc->numOfArrays].data, p + 2, k); + hevc->numOfArrays++; + + p += 2 + k; + dst += k; + } + } + + hevc->off = (int)(dst - hevc->data); + return (int)(p - data); +} + +int mpeg4_hevc_decoder_configuration_record_save(const struct mpeg4_hevc_t* hevc, uint8_t* data, size_t bytes) +{ + uint16_t n; + uint8_t i, j, k; + uint8_t *ptr, *end; + uint8_t *p = data; + uint8_t array_completeness = 1; + const uint8_t nalu[] = {H265_VPS, H265_SPS, H265_PPS, H265_PREFIX_SEI, H265_SUFFIX_SEI}; + + assert(hevc->lengthSizeMinusOne <= 3); + end = data + bytes; + if (bytes < 23) + return 0; // don't have enough memory + + // HEVCDecoderConfigurationRecord + // ISO/IEC 14496-15:2017 + // 8.3.3.1.2 Syntax + assert(1 == hevc->configurationVersion); + data[0] = hevc->configurationVersion; + + // general_profile_space + general_tier_flag + general_profile_idc + data[1] = ((hevc->general_profile_space & 0x03) << 6) | ((hevc->general_tier_flag & 0x01) << 5) | (hevc->general_profile_idc & 0x1F); + + // general_profile_compatibility_flags + w32(data + 2, hevc->general_profile_compatibility_flags); + + // general_constraint_indicator_flags + w32(data + 6, (uint32_t)(hevc->general_constraint_indicator_flags >> 16)); + w16(data + 10, (uint16_t)hevc->general_constraint_indicator_flags); + + // general_level_idc + data[12] = hevc->general_level_idc; + + // min_spatial_segmentation_idc + w16(data + 13, 0xF000 | hevc->min_spatial_segmentation_idc); + + data[15] = 0xFC | hevc->parallelismType; + data[16] = 0xFC | hevc->chromaFormat; + data[17] = 0xF8 | hevc->bitDepthLumaMinus8; + data[18] = 0xF8 | hevc->bitDepthChromaMinus8; + w16(data + 19, hevc->avgFrameRate); + data[21] = (hevc->constantFrameRate << 6) | ((hevc->numTemporalLayers & 0x07) << 3) | ((hevc->temporalIdNested & 0x01) << 2) | (hevc->lengthSizeMinusOne & 0x03); +// data[22] = hevc->numOfArrays; + + p = data + 23; + for (k = i = 0; i < sizeof(nalu)/sizeof(nalu[0]) && p + 3 <= end; i++) + { + ptr = p + 3; + for (n = j = 0; j < hevc->numOfArrays; j++) + { + assert(hevc->nalu[j].type == ((hevc->nalu[j].data[0] >> 1) & 0x3F)); + if(nalu[i] != hevc->nalu[j].type) + continue; + + if (ptr + 2 + hevc->nalu[j].bytes > end) + return 0; // don't have enough memory + + array_completeness = hevc->nalu[j].array_completeness; + assert(hevc->nalu[i].data + hevc->nalu[j].bytes <= hevc->data + sizeof(hevc->data)); + w16(ptr, hevc->nalu[j].bytes); + memcpy(ptr + 2, hevc->nalu[j].data, hevc->nalu[j].bytes); + ptr += 2 + hevc->nalu[j].bytes; + n++; + } + + if (n > 0) + { + // array_completeness + NAL_unit_type + p[0] = (array_completeness << 7) | (nalu[i] & 0x3F); + w16(p + 1, n); + p = ptr; + k++; + } + } + + data[22] = k; + + return (int)(p - data); +} + +int mpeg4_hevc_from_nalu(const uint8_t* data, size_t bytes, struct mpeg4_hevc_t* hevc) +{ + int r; + r = h265_annexbtomp4(hevc, data, bytes, NULL, 0, NULL, NULL); + return hevc->numOfArrays > 1 ? bytes : r; +} + +int mpeg4_hevc_to_nalu(const struct mpeg4_hevc_t* hevc, uint8_t* data, size_t bytes) +{ + uint8_t i; + uint8_t* p, *end; + const uint8_t startcode[] = { 0, 0, 0, 1 }; + + p = data; + end = p + bytes; + + for (i = 0; i < hevc->numOfArrays; i++) + { + if (p + hevc->nalu[i].bytes + 4 > end) + return -1; + + memcpy(p, startcode, 4); + memcpy(p + 4, hevc->nalu[i].data, hevc->nalu[i].bytes); + assert(hevc->nalu[i].type == ((hevc->nalu[i].data[0] >> 1) & 0x3F)); + p += 4 + hevc->nalu[i].bytes; + } + + return (int)(p - data); +} + +int mpeg4_hevc_codecs(const struct mpeg4_hevc_t* hevc, char* codecs, size_t bytes) +{ + // ISO/IEC 14496-15:2017(E) + // Annex E Sub-parameters of the MIME type "codecs" parameter (p154) + // 'hev1.' or 'hvc1.' prefix (5 chars) + // profile, e.g. '.A12' (max 4 chars) + // profile_compatibility reserve bit order, dot + 32-bit hex number (max 9 chars) + // tier and level, e.g. '.H120' (max 5 chars) + // up to 6 constraint bytes, bytes are dot-separated and hex-encoded. + const char* tier = "LH"; + const char* space[] = { "", "A", "B", "C" }; + uint32_t x; + x = hevc->general_profile_compatibility_flags; + x = ((x >> 1) & 0x55555555) | ((x & 0x55555555) << 1); + x = ((x >> 2) & 0x33333333) | ((x & 0x33333333) << 2); + x = ((x >> 4) & 0x0f0f0f0f) | ((x & 0x0f0f0f0f) << 4); + x = ((x >> 8) & 0x00ff00ff) | ((x & 0x00ff00ff) << 8); + x = (x >> 16) | (x << 16); + return snprintf(codecs, bytes, "hvc1.%s%u.%x.%c%u", space[hevc->general_profile_space%4], (unsigned int)hevc->general_profile_idc, (unsigned int)x, tier[hevc->general_tier_flag%2], (unsigned int)hevc->general_level_idc); +} + +int mpeg4_hevc_decoder_configuration_record_load(const uint8_t* data, size_t bytes, struct mpeg4_hevc_t* hevc) +{ + int r; + r = _mpeg4_hevc_decoder_configuration_record_load(data, bytes, hevc); + if (r > 0 && hevc->numOfArrays >= 2) + return r; + + memset(hevc, 0, sizeof(*hevc)); + return mpeg4_hevc_from_nalu(data, bytes, hevc); +} + +#if defined(_DEBUG) || defined(DEBUG) +void hevc_annexbtomp4_test(void); +void mpeg4_hevc_test(void) +{ + const unsigned char src[] = { + 0x01,0x01,0x60,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0xb4,0xf0,0x00, + 0xfc,0xfd,0xf8,0xf8,0x00,0x00,0x0f,0x03,0xa0,0x00,0x01,0x00,0x18,0x40,0x01, + 0x0c,0x01,0xff,0xff,0x01,0x60,0x00,0x00,0x03,0x00,0x80,0x00,0x00,0x03,0x00, + 0x00,0x03,0x00,0xb4,0x9d,0xc0,0x90,0xa1,0x00,0x01,0x00,0x29,0x42,0x01,0x01, + 0x01,0x60,0x00,0x00,0x03,0x00,0x80,0x00,0x00,0x03,0x00,0x00,0x03,0x00,0xb4, + 0xa0,0x01,0xe0,0x20,0x02,0x1c,0x59,0x67,0x79,0x24,0x6d,0xae,0x01,0x00,0x00, + 0x03,0x03,0xe8,0x00,0x00,0x5d,0xc0,0x08,0xa2,0x00,0x01,0x00,0x06,0x44,0x01, + 0xc1,0x73,0xd1,0x89 + }; + const unsigned char nalu[] = { + 0x00,0x00,0x00,0x01,0x40,0x01,0x0c,0x01,0xff,0xff,0x01,0x60,0x00,0x00,0x03, + 0x00,0x80,0x00,0x00,0x03,0x00,0x00,0x03,0x00,0xb4,0x9d,0xc0,0x90,0x00,0x00, + 0x00,0x01,0x42,0x01,0x01,0x01,0x60,0x00,0x00,0x03,0x00,0x80,0x00,0x00,0x03, + 0x00,0x00,0x03,0x00,0xb4,0xa0,0x01,0xe0,0x20,0x02,0x1c,0x59,0x67,0x79,0x24, + 0x6d,0xae,0x01,0x00,0x00,0x03,0x03,0xe8,0x00,0x00,0x5d,0xc0,0x08,0x00,0x00, + 0x00,0x01,0x44,0x01,0xc1,0x73,0xd1,0x89 + }; + unsigned char data[sizeof(src)]; + + struct mpeg4_hevc_t hevc; + assert(sizeof(src) == mpeg4_hevc_decoder_configuration_record_load(src, sizeof(src), &hevc)); + assert(0 == hevc.general_profile_space && 0 == hevc.general_tier_flag); + assert(1 == hevc.general_profile_idc && 0xb4 == hevc.general_level_idc); + assert(1 == hevc.numTemporalLayers && 1 == hevc.temporalIdNested); + assert(3 == hevc.numOfArrays); + assert(sizeof(src) == mpeg4_hevc_decoder_configuration_record_save(&hevc, data, sizeof(data))); + assert(0 == memcmp(src, data, sizeof(src))); + mpeg4_hevc_codecs(&hevc, (char*)data, sizeof(data)); + assert(0 == memcmp("hvc1.1.6.L180", data, 13)); + + assert(sizeof(nalu) == mpeg4_hevc_to_nalu(&hevc, data, sizeof(data))); + assert(0 == memcmp(nalu, data, sizeof(nalu))); + + hevc_annexbtomp4_test(); +} +#endif diff --git a/src/big/mpp/middleware/src/mp4_format/src/libflv/source/mpeg4-mp4toannexb.c b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/mpeg4-mp4toannexb.c new file mode 100644 index 000000000..94d3ede2d --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/mpeg4-mp4toannexb.c @@ -0,0 +1,170 @@ +// ISO/IEC 14496-1:2010(E) +// Annex I: Usage of ITU-T Recommendation H.264 | ISO/IEC 14496-10 AVC (p150) + +#include "mpeg4-avc.h" +#include +#include +#include +#include +#include + +#define H264_NAL_IDR 5 // Coded slice of an IDR picture +#define H264_NAL_SPS 7 // Sequence parameter set +#define H264_NAL_PPS 8 // Picture parameter set +#define H264_NAL_AUD 9 // Access unit delimiter + +struct h264_mp4toannexb_handle_t +{ + const struct mpeg4_avc_t* avc; + int sps_pps_flag; + int errcode; + + uint8_t* out; + size_t bytes; + size_t capacity; +}; + +static int h264_sps_pps_size(const struct mpeg4_avc_t* avc) +{ + int i, n = 0; + for (i = 0; i < avc->nb_sps; i++) + n += avc->sps[i].bytes + 4; + for (i = 0; i < avc->nb_pps; i++) + n += avc->pps[i].bytes + 4; + return n; +} + +static void h264_mp4toannexb_handler(void* param, const uint8_t* nalu, size_t bytes) +{ + int n; + const uint8_t h264_start_code[] = { 0x00, 0x00, 0x00, 0x01 }; + struct h264_mp4toannexb_handle_t* mp4; + mp4 = (struct h264_mp4toannexb_handle_t*)param; + + if (bytes < 1) + { + assert(0); + mp4->errcode = -EINVAL; + return; + } + + // insert SPS/PPS before IDR frame + switch (nalu[0] & 0x1f) + { + case H264_NAL_SPS: + case H264_NAL_PPS: + //flv->data[k++] = 0; // SPS/PPS add zero_byte(ITU H.264 B.1.2 Byte stream NAL unit semantics) + mp4->sps_pps_flag = 1; + break; + + case H264_NAL_IDR: + if (0 == mp4->sps_pps_flag) + { + if (mp4->bytes > 0) + { + // write sps/pps at first + n = h264_sps_pps_size(mp4->avc); + if (n + mp4->bytes > mp4->capacity) + { + mp4->errcode = -E2BIG; + return; + } + memmove(mp4->out + n, mp4->out, mp4->bytes); + } + n = mpeg4_avc_to_nalu(mp4->avc, mp4->out, mp4->capacity); + if (n <= 0) + { + mp4->errcode = 0 == n ? -EINVAL : n; + return; + } + mp4->bytes += n; + mp4->sps_pps_flag = 1; // don't insert more than one-times + } + break; + +#if defined(H2645_FILTER_AUD) + case H264_NAL_AUD: + continue; // ignore AUD +#endif + } + + if (mp4->bytes + bytes + sizeof(h264_start_code) > mp4->capacity) + { + mp4->errcode = -E2BIG; + return; + } + + memcpy(mp4->out + mp4->bytes, h264_start_code, sizeof(h264_start_code)); + memcpy(mp4->out + mp4->bytes + sizeof(h264_start_code), nalu, bytes); + mp4->bytes += sizeof(h264_start_code) + bytes; +} + +int h264_mp4toannexb(const struct mpeg4_avc_t* avc, const void* data, size_t bytes, void* out, size_t size) +{ + int i, n; + const uint8_t* src, *end; + struct h264_mp4toannexb_handle_t h; + + memset(&h, 0, sizeof(h)); + h.avc = avc; + h.out = (uint8_t*)out; + h.capacity = size; + + end = (const uint8_t*)data + bytes; + for (src = (const uint8_t*)data; src + avc->nalu < end; src += n + avc->nalu) + { + for (n = i = 0; i < avc->nalu; i++) + n = (n << 8) + ((uint8_t*)src)[i]; + + // fix 0x00 00 00 01 => flv nalu size + if (0 == avc->nalu || (1 == n && (3 == avc->nalu || 4 == avc->nalu))) + { + //n = (int)(end - src) - avc->nalu; + mpeg4_h264_annexb_nalu(src, end - src, h264_mp4toannexb_handler, &h); + src = end; + break; + } + + if (n <= 0 || src + n + avc->nalu > end) + { + assert(0); + return -EINVAL; + } + + h264_mp4toannexb_handler(&h, src + avc->nalu, n); + } + + assert(src == end); + return 0 == h.errcode ? (int)h.bytes : 0; +} + +#if defined(DEBUG) || defined(_DEBUG) +void h264_mp4toannexb_test(void) +{ + const uint8_t data[] = { + 0x01, 0x42, 0xe0, 0x1e, 0xff, 0xe1, 0x00, 0x21, 0x67, 0x42, 0xe0, 0x1e, 0xab, 0x40, 0xf0, 0x28, + 0xd0, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x19, 0x70, 0x20, 0x00, 0x78, 0x00, 0x00, 0x0f, + 0x00, 0x16, 0xb1, 0xb0, 0x3c, 0x50, 0xaa, 0x80, 0x80, 0x01, 0x00, 0x04, 0x28, 0xce, 0x3c, 0x80, + }; + + const uint8_t mp4[] = { + 0x00, 0x00, 0x00, 0x08, 0x65, 0x88, 0x84, 0x01, 0x7f, 0xec, 0x05, 0x17, 0x00, 0x00, 0x00, 0x01, 0xab, + }; + + const uint8_t annexb[] = { + 0x00, 0x00, 0x00, 0x01, 0x67, 0x42, 0xe0, 0x1e, 0xab, 0x40, 0xf0, 0x28, 0xd0, 0x80, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x19, 0x70, 0x20, 0x00, 0x78, 0x00, 0x00, 0x0f, 0x00, 0x16, 0xb1, 0xb0, + 0x3c, 0x50, 0xaa, 0x80, 0x80, + 0x00, 0x00, 0x00, 0x01, 0x28, 0xce, 0x3c, 0x80, + 0x00, 0x00, 0x00, 0x01, 0x65, 0x88, 0x84, 0x01, 0x7f, 0xec, 0x05, 0x17, 0x00, 0x00, 0x00, 0x01, 0xab, + }; + + int n; + uint8_t out[sizeof(annexb) + 64]; + struct mpeg4_avc_t avc; + memset(&avc, 0, sizeof(avc)); + assert(sizeof(data) == mpeg4_avc_decoder_configuration_record_load(data, sizeof(data), &avc)); + n = h264_mp4toannexb(&avc, mp4, sizeof(mp4), out, sizeof(out)); + assert(n == sizeof(annexb) && 0 == memcmp(annexb, out, n)); +} +#endif \ No newline at end of file diff --git a/src/big/mpp/middleware/src/mp4_format/src/libflv/source/mpeg4-vvc.c b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/mpeg4-vvc.c new file mode 100644 index 000000000..983f45e4a --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/mpeg4-vvc.c @@ -0,0 +1,427 @@ +#include "mpeg4-vvc.h" +#include "mpeg4-bits.h" +#include +#include +#include +#include + +#define H266_OPI 12 +#define H266_DCI 13 +#define H266_VPS 14 +#define H266_SPS 15 +#define H266_PPS 16 +#define H266_AUD 20 +#define H266_PREFIX_SEI 23 +#define H266_SUFFIX_SEI 24 + +/* +* ISO/IEC 14496-15:2021 11.2.4.2.2 Syntax (p156) + +aligned(8) class VvcPTLRecord(num_sublayers) { + bit(2) reserved = 0; + unsigned int(6) num_bytes_constraint_info; + unsigned int(7) general_profile_idc; + unsigned int(1) general_tier_flag; + unsigned int(8) general_level_idc; + unsigned int(1) ptl_frame_only_constraint_flag; + unsigned int(1) ptl_multi_layer_enabled_flag; + unsigned int(8*num_bytes_constraint_info - 2) general_constraint_info; + for (i=num_sublayers - 2; i >= 0; i--) + unsigned int(1) ptl_sublayer_level_present_flag[i]; + for (j=num_sublayers; j<=8 && num_sublayers > 1; j++) + bit(1) ptl_reserved_zero_bit = 0; + for (i=num_sublayers-2; i >= 0; i--) + if (ptl_sublayer_level_present_flag[i]) + unsigned int(8) sublayer_level_idc[i]; + unsigned int(8) ptl_num_sub_profiles; + for (j=0; j < ptl_num_sub_profiles; j++) + unsigned int(32) general_sub_profile_idc[j]; +} +*/ + +static int mpeg4_vvc_ptl_record_load(struct mpeg4_bits_t* bits, struct mpeg4_vvc_t* vvc) +{ + int i; + mpeg4_bits_read_n(bits, 2); // reserved + vvc->native_ptl.num_bytes_constraint_info = mpeg4_bits_read_uint32(bits, 6); + vvc->native_ptl.general_profile_idc = mpeg4_bits_read_uint32(bits, 7); + vvc->native_ptl.general_tier_flag = mpeg4_bits_read_uint32(bits, 1); + vvc->native_ptl.general_level_idc = mpeg4_bits_read_uint32(bits, 8); + for (i = 0; i < (int)vvc->native_ptl.num_bytes_constraint_info && i < sizeof(vvc->native_ptl.general_constraint_info)/sizeof(vvc->native_ptl.general_constraint_info[0]); i++) + { + vvc->native_ptl.general_constraint_info[i] = mpeg4_bits_read_uint8(bits, 8); + } + vvc->native_ptl.ptl_frame_only_constraint_flag = (vvc->native_ptl.general_constraint_info[0] & 0x80) ? 1 : 0; + vvc->native_ptl.ptl_multi_layer_enabled_flag = (vvc->native_ptl.general_constraint_info[0] & 0x40) ? 1 : 0; + + vvc->native_ptl.ptl_sublayer_level_present_flag = 0; + assert(vvc->num_sublayers >= 0 && vvc->num_sublayers <= 8); + for (i = (int)vvc->num_sublayers - 2; i >= 0; i-=8) + vvc->native_ptl.ptl_sublayer_level_present_flag = mpeg4_bits_read_uint8(bits, 8); + + for (i = (int)vvc->num_sublayers - 2; i >= 0 && i < sizeof(vvc->native_ptl.sublayer_level_idc)/sizeof(vvc->native_ptl.sublayer_level_idc[0]); i--) + { + if(vvc->native_ptl.ptl_sublayer_level_present_flag & (1 << i)) + vvc->native_ptl.sublayer_level_idc[i] = mpeg4_bits_read_uint8(bits, 8); + } + + vvc->native_ptl.ptl_num_sub_profiles = mpeg4_bits_read_uint8(bits, 8); + vvc->native_ptl.general_sub_profile_idc = (uint32_t*)(vvc->data + vvc->off); + vvc->off += 4 * vvc->native_ptl.ptl_num_sub_profiles; + for (i = 0; i < vvc->native_ptl.ptl_num_sub_profiles; i++) + { + vvc->native_ptl.general_sub_profile_idc[i] = mpeg4_bits_read_uint32(bits, 32); + } + + return mpeg4_bits_error(bits); +} + +static int mpeg4_vvc_ptl_record_save(struct mpeg4_bits_t* bits, const struct mpeg4_vvc_t* vvc) +{ + int i; + mpeg4_bits_write_n(bits, 0, 2); // reserved + mpeg4_bits_write_n(bits, vvc->native_ptl.num_bytes_constraint_info, 6); + mpeg4_bits_write_n(bits, vvc->native_ptl.general_profile_idc, 7); + mpeg4_bits_write_n(bits, vvc->native_ptl.general_tier_flag, 1); + mpeg4_bits_write_n(bits, vvc->native_ptl.general_level_idc, 8); + mpeg4_bits_write_n(bits, vvc->native_ptl.ptl_frame_only_constraint_flag, 1); + mpeg4_bits_write_n(bits, vvc->native_ptl.ptl_multi_layer_enabled_flag, 1); + for (i = 0; i < (int)vvc->native_ptl.num_bytes_constraint_info; i++) + { + mpeg4_bits_write_n(bits, vvc->native_ptl.general_constraint_info[i], i + 1 < (int)vvc->native_ptl.num_bytes_constraint_info ? 8 : 6); + } + + assert(vvc->num_sublayers >= 0 && vvc->num_sublayers <= 8); + for (i = (int)vvc->num_sublayers - 2; i >= 0; i -= 8) + mpeg4_bits_write_n(bits, vvc->native_ptl.ptl_sublayer_level_present_flag, 8); + + for (i = (int)vvc->num_sublayers - 2; i >= 0 && i < sizeof(vvc->native_ptl.sublayer_level_idc) / sizeof(vvc->native_ptl.sublayer_level_idc[0]); i--) + { + if (vvc->native_ptl.ptl_sublayer_level_present_flag & (1 << i)) + mpeg4_bits_write_uint8(bits, vvc->native_ptl.sublayer_level_idc[i], 8); + } + + mpeg4_bits_write_uint8(bits, vvc->native_ptl.ptl_num_sub_profiles, 8); + for (i = 0; i < vvc->native_ptl.ptl_num_sub_profiles; i++) + { + mpeg4_bits_write_uint32(bits, vvc->native_ptl.general_sub_profile_idc[i], 32); + } + + return mpeg4_bits_error(bits); +} + +/* +* ISO/IEC 14496-15:2021 11.2.4.2.2 Syntax (p156) + +aligned(8) class VvcDecoderConfigurationRecord { + bit(5) reserved = '11111'b; + unsigned int(2) LengthSizeMinusOne; + unsigned int(1) ptl_present_flag; + if (ptl_present_flag) { + unsigned int(9) ols_idx; + unsigned int(3) num_sublayers; + unsigned int(2) constant_frame_rate; + unsigned int(2) chroma_format_idc; + unsigned int(3) bit_depth_minus8; + bit(5) reserved = '11111'b; + VvcPTLRecord(num_sublayers) native_ptl; + unsigned_int(16) max_picture_width; + unsigned_int(16) max_picture_height; + unsigned int(16) avg_frame_rate; + } + unsigned int(8) num_of_arrays; + for (j=0; j < num_of_arrays; j++) { + unsigned int(1) array_completeness; + bit(2) reserved = 0; + unsigned int(5) NAL_unit_type; + if (NAL_unit_type != DCI_NUT && NAL_unit_type != OPI_NUT) + unsigned int(16) num_nalus; + for (i=0; i< num_nalus; i++) { + unsigned int(16) nal_unit_length; + bit(8*nal_unit_length) nal_unit; + } + } +} +*/ +int mpeg4_vvc_decoder_configuration_record_load(const uint8_t* data, size_t bytes, struct mpeg4_vvc_t* vvc) +{ + struct mpeg4_bits_t bits; + uint8_t nalutype; + uint16_t i, j, k, n, numOfArrays; + uint8_t* dst; + + vvc->off = 0; // clear + mpeg4_bits_init(&bits, (void*)data, bytes); + mpeg4_bits_read_n(&bits, 5); // reserved '11111'b + vvc->lengthSizeMinusOne = mpeg4_bits_read_uint32(&bits, 2); + vvc->ptl_present_flag = mpeg4_bits_read(&bits); + if (vvc->ptl_present_flag) + { + vvc->ols_idx = mpeg4_bits_read_uint32(&bits, 9); + vvc->num_sublayers = mpeg4_bits_read_uint32(&bits, 3); + vvc->constant_frame_rate = mpeg4_bits_read_uint32(&bits, 2); + vvc->chroma_format_idc = mpeg4_bits_read_uint32(&bits, 2); + vvc->bit_depth_minus8 = mpeg4_bits_read_uint32(&bits, 3); + mpeg4_bits_read_n(&bits, 5); // reserved '11111'b + mpeg4_vvc_ptl_record_load(&bits, vvc); + vvc->max_picture_width = mpeg4_bits_read_uint16(&bits, 16); + vvc->max_picture_height = mpeg4_bits_read_uint16(&bits, 16); + vvc->avg_frame_rate = mpeg4_bits_read_uint16(&bits, 16); + } + + if (0 != mpeg4_bits_error(&bits)) + { + assert(0); + return -1; + } + + assert(0 == bits.bits % 8); + dst = vvc->data + vvc->off; + + numOfArrays = mpeg4_bits_read_uint8(&bits, 8); + for (i = 0; i < numOfArrays && 0 == mpeg4_bits_error(&bits); i++) + { + nalutype = mpeg4_bits_read_uint8(&bits, 8); + + n = 1; + if ((nalutype & 0x1f) != H266_DCI && (nalutype & 0x1f) != H266_OPI) + n = mpeg4_bits_read_uint16(&bits, 16); + + for (j = 0; j < n; j++) + { + if (vvc->numOfArrays >= sizeof(vvc->nalu) / sizeof(vvc->nalu[0])) + { + assert(0); + return -E2BIG; // too many nalu(s) + } + + k = mpeg4_bits_read_uint16(&bits, 16); + vvc->nalu[vvc->numOfArrays].array_completeness = (nalutype >> 7) & 0x01; + vvc->nalu[vvc->numOfArrays].type = nalutype & 0x1F; + vvc->nalu[vvc->numOfArrays].bytes = k; + vvc->nalu[vvc->numOfArrays].data = dst; + memcpy(vvc->nalu[vvc->numOfArrays].data, data + bits.bits / 8, k); + vvc->numOfArrays++; + + mpeg4_bits_skip(&bits, (uint64_t)k * 8); + dst += k; + } + } + + vvc->off = (int)(dst - vvc->data); + return mpeg4_bits_error(&bits) ? -1 : (int)(bits.bits / 8); +} + +int mpeg4_vvc_decoder_configuration_record_save(const struct mpeg4_vvc_t* vvc, uint8_t* data, size_t bytes) +{ + uint16_t n; + uint8_t i, j, k; + uint8_t* ptr, * end; + uint8_t* p; + uint8_t array_completeness = 1; + struct mpeg4_bits_t bits; + const uint8_t nalu[] = { H266_OPI, H266_DCI, H266_VPS, H266_SPS, H266_PPS, H266_PREFIX_SEI, H266_SUFFIX_SEI }; + + assert(vvc->lengthSizeMinusOne <= 3); + memset(data, 0, bytes); + mpeg4_bits_init(&bits, (void*)data, bytes); + mpeg4_bits_write_n(&bits, 0x1F, 5); + mpeg4_bits_write_n(&bits, vvc->lengthSizeMinusOne, 2); + mpeg4_bits_write_n(&bits, vvc->ptl_present_flag, 1); + + if (vvc->ptl_present_flag) + { + mpeg4_bits_write_n(&bits, vvc->ols_idx, 9); + mpeg4_bits_write_n(&bits, vvc->num_sublayers, 3); + mpeg4_bits_write_n(&bits, vvc->constant_frame_rate, 2); + mpeg4_bits_write_n(&bits, vvc->chroma_format_idc, 2); + mpeg4_bits_write_n(&bits, vvc->bit_depth_minus8, 3); + mpeg4_bits_write_n(&bits, 0x1F, 5); + mpeg4_vvc_ptl_record_save(&bits, vvc); + mpeg4_bits_write_uint16(&bits, vvc->max_picture_width, 16); + mpeg4_bits_write_uint16(&bits, vvc->max_picture_height, 16); + mpeg4_bits_write_uint16(&bits, vvc->avg_frame_rate, 16); + } + + if (0 != mpeg4_bits_error(&bits) || 0 != bits.bits % 8) + { + assert(0); + return -1; + } + + //mpeg4_bits_write_uint8(&bits, vvc->numOfArrays, 8); + p = data + bits.bits / 8 + 1 /*num_of_arrays*/; + end = data + bytes; + for (k = i = 0; i < sizeof(nalu) / sizeof(nalu[0]) && p + 5 <= end; i++) + { + ptr = p + 3; + for (n = j = 0; j < vvc->numOfArrays; j++) + { + if (nalu[i] != vvc->nalu[j].type) + continue; + + if (ptr + 2 + vvc->nalu[j].bytes > end) + return 0; // don't have enough memory + + array_completeness = vvc->nalu[j].array_completeness; + assert(vvc->nalu[i].data + vvc->nalu[j].bytes <= vvc->data + sizeof(vvc->data)); + ptr[0] = (vvc->nalu[j].bytes >> 8) & 0xFF; + ptr[1] = vvc->nalu[j].bytes & 0xFF; + memcpy(ptr + 2, vvc->nalu[j].data, vvc->nalu[j].bytes); + ptr += 2 + vvc->nalu[j].bytes; + n++; + } + + if (n > 0) + { + // array_completeness + NAL_unit_type + p[0] = (array_completeness << 7) | (nalu[i] & 0x1F); + p[1] = (n >> 8) & 0xFF; + p[2] = n & 0xFF; + p = ptr; + k++; + } + } + + data[bits.bits / 8] = k; // num_of_arrays + + return mpeg4_bits_error(&bits) ? -1 : (int)(p - data); +} + +int mpeg4_vvc_to_nalu(const struct mpeg4_vvc_t* vvc, uint8_t* data, size_t bytes) +{ + uint8_t i; + uint8_t* p, * end; + const uint8_t startcode[] = { 0, 0, 0, 1 }; + + p = data; + end = p + bytes; + + for (i = 0; i < vvc->numOfArrays; i++) + { + if (p + vvc->nalu[i].bytes + 4 > end || vvc->nalu[i].bytes < 2) + return -1; + + memcpy(p, startcode, 4); + memcpy(p + 4, vvc->nalu[i].data, vvc->nalu[i].bytes); + assert(vvc->nalu[i].type == ((vvc->nalu[i].data[1] >> 3) & 0x1F)); + p += 4 + vvc->nalu[i].bytes; + } + + return (int)(p - data); +} + +// RFC4648 +static size_t base32_encode(char* target, const void* source, size_t bytes) +{ + size_t i, j; + const uint8_t* ptr = (const uint8_t*)source; + static const char* s_base32_enc = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"; + + for (j = i = 0; i < bytes / 5 * 5; i += 5) + { + target[j++] = s_base32_enc[(ptr[i] >> 3) & 0x1F]; /* c1 */ + target[j++] = s_base32_enc[((ptr[i] & 0x07) << 2) | ((ptr[i + 1] >> 6) & 0x03)]; /*c2*/ + target[j++] = s_base32_enc[(ptr[i + 1] >> 1) & 0x1F];/*c3*/ + target[j++] = s_base32_enc[((ptr[i + 1] & 0x01) << 4) | ((ptr[i + 2] >> 4) & 0x0F)]; /*c4*/ + target[j++] = s_base32_enc[((ptr[i + 2] & 0x0F) << 1) | ((ptr[i + 3] >> 7) & 0x01)]; /*c5*/ + target[j++] = s_base32_enc[(ptr[i + 3] >> 2) & 0x1F];/*c6*/ + target[j++] = s_base32_enc[((ptr[i + 3] & 0x03) << 3) | ((ptr[i + 4] >> 5) & 0x07)]; /*c7*/ + target[j++] = s_base32_enc[ptr[i + 4] & 0x1F]; /* c8 */ + } + + if (i + 1 == bytes) + { + target[j++] = s_base32_enc[(ptr[i] >> 3) & 0x1F]; /* c1 */ + target[j++] = s_base32_enc[((ptr[i] & 0x07) << 2)]; /*c2*/ + } + else if (i + 2 == bytes) + { + target[j++] = s_base32_enc[(ptr[i] >> 3) & 0x1F]; /* c1 */ + target[j++] = s_base32_enc[((ptr[i] & 0x07) << 2) | ((ptr[i + 1] >> 6) & 0x03)]; /*c2*/ + target[j++] = s_base32_enc[(ptr[i + 1] >> 1) & 0x1F];/*c3*/ + target[j++] = s_base32_enc[((ptr[i + 1] & 0x01) << 4)]; /*c4*/ + } + else if (i + 3 == bytes) + { + target[j++] = s_base32_enc[(ptr[i] >> 3) & 0x1F]; /* c1 */ + target[j++] = s_base32_enc[((ptr[i] & 0x07) << 2) | ((ptr[i + 1] >> 6) & 0x03)]; /*c2*/ + target[j++] = s_base32_enc[(ptr[i + 1] >> 1) & 0x1F];/*c3*/ + target[j++] = s_base32_enc[((ptr[i + 1] & 0x01) << 4) | ((ptr[i + 2] >> 4) & 0x0F)]; /*c4*/ + target[j++] = s_base32_enc[((ptr[i + 2] & 0x0F) << 1)]; /*c5*/ + } + else if (i + 4 == bytes) + { + target[j++] = s_base32_enc[(ptr[i] >> 3) & 0x1F]; /* c1 */ + target[j++] = s_base32_enc[((ptr[i] & 0x07) << 2) | ((ptr[i + 1] >> 6) & 0x03)]; /*c2*/ + target[j++] = s_base32_enc[(ptr[i + 1] >> 1) & 0x1F];/*c3*/ + target[j++] = s_base32_enc[((ptr[i + 1] & 0x01) << 4) | ((ptr[i + 2] >> 4) & 0x0F)]; /*c4*/ + target[j++] = s_base32_enc[((ptr[i + 2] & 0x0F) << 1) | ((ptr[i + 3] >> 7) & 0x01)]; /*c5*/ + target[j++] = s_base32_enc[(ptr[i + 3] >> 2) & 0x1F];/*c6*/ + target[j++] = s_base32_enc[((ptr[i + 3] & 0x03) << 3)]; /*c7*/ + } + + while (0 != (j % 8)) + { + target[j++] = '='; + } + + return j; +} + +int mpeg4_vvc_codecs(const struct mpeg4_vvc_t* vvc, char* codecs, size_t bytes) +{ + // ISO/IEC 14496-15:2021 + // Annex E Sub-parameters of the MIME type "codecs" parameter (p276) + // 'vvc1.' or 'vvi1.' prefix (5 chars) + int i, n; + char buffer[129]; + + // 1. trailing zero bits of the general_constraint_info() syntax structure may be omitted from the input bits to base32 encoding + n = (int)vvc->native_ptl.num_bytes_constraint_info; + for (i = (int)vvc->native_ptl.num_bytes_constraint_info - 1; i >= 0 && n > 1; i--) + { + if (0 == vvc->native_ptl.general_constraint_info[i]) + n--; + else + break; + } + i = base32_encode(buffer, vvc->native_ptl.general_constraint_info, n); + //2, the trailing padding with the "=" character may be omitted from the base32 string; + while (i > 0 && buffer[i - 1] == '=') i--; + + return snprintf(codecs, bytes, "vvc1.%u.%c%u.C%.*s", + (unsigned int)vvc->native_ptl.general_profile_idc, + vvc->native_ptl.general_tier_flag ? 'H' : 'L', vvc->native_ptl.general_level_idc, i, buffer); +} + +#if defined(_DEBUG) || defined(DEBUG) +void vvc_annexbtomp4_test(void); +static void mpeg4_vvc_codecs_test(struct mpeg4_vvc_t* vvc) +{ + int r; + char buffer[129]; + //const char* s = "vvc1.1.L51.CQA.O1+3"; + //const char* s1 = "vvc1.17.L83.CYA.O1+3"; + //const char* s2 = "vvc1.17.L83.CYA.O1+3"; + const char* s3 = "vvc1.1.L105.CAA"; + r = mpeg4_vvc_codecs(vvc, buffer, sizeof(buffer)); + assert(r == strlen(s3) && 0 == memcmp(buffer, s3, r)); +} + +void mpeg4_vvc_test(void) +{ + const uint8_t data[] = { 0xff, 0x00, 0x11, 0x1f, 0x01, 0x02, 0x69, 0x00, 0x00, 0x02, 0xd0, 0x05, 0x00, 0x00, 0x00, 0x02, 0x8f, 0x00, 0x01, 0x00, 0x2a, 0x00, 0x79, 0x00, 0x0b, 0x02, 0x69, 0x00, 0x00, 0x03, 0x00, 0x16, 0x88, 0x01, 0x40, 0x48, 0x80, 0x2b, 0x49, 0xff, 0x45, 0x19, 0x18, 0xe0, 0x0c, 0x42, 0x55, 0x5a, 0xab, 0xd5, 0xeb, 0x33, 0x25, 0x5a, 0x12, 0xe4, 0x72, 0xd4, 0x56, 0x5a, 0x32, 0x30, 0x40, 0x90, 0x00, 0x01, 0x00, 0x0c, 0x00, 0x81, 0x00, 0x00, 0x0b, 0x44, 0x00, 0xa0, 0x22, 0x24, 0x18, 0x20 }; + uint8_t buffer[sizeof(data)]; + struct mpeg4_vvc_t vvc; + memset(&vvc, 0, sizeof(vvc)); + assert(sizeof(data) == mpeg4_vvc_decoder_configuration_record_load(data, sizeof(data), &vvc)); + assert(3 == vvc.lengthSizeMinusOne && 1 == vvc.ptl_present_flag && 1 == vvc.num_sublayers); + assert(1 == vvc.chroma_format_idc && 0 == vvc.bit_depth_minus8); + assert(720 == vvc.max_picture_width && 1280 == vvc.max_picture_height && 0 == vvc.avg_frame_rate); + assert(1 == vvc.native_ptl.num_bytes_constraint_info && 1 == vvc.native_ptl.general_profile_idc && 0 == vvc.native_ptl.general_tier_flag && 0x69 == vvc.native_ptl.general_level_idc); + assert(2 == vvc.numOfArrays && H266_SPS == vvc.nalu[0].type && 0x2a == vvc.nalu[0].bytes && H266_PPS == vvc.nalu[1].type && 0x0c == vvc.nalu[1].bytes); + assert(sizeof(data) == mpeg4_vvc_decoder_configuration_record_save(&vvc, buffer, sizeof(buffer)) && 0 == memcmp(buffer, data, sizeof(data))); + mpeg4_vvc_codecs_test(&vvc); +} +#endif diff --git a/src/big/mpp/middleware/src/mp4_format/src/libflv/source/opus-head.c b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/opus-head.c new file mode 100644 index 000000000..d1387cc9d --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/opus-head.c @@ -0,0 +1,419 @@ +#include "opus-head.h" +#include +#include +#include + +// http://www.opus-codec.org/docs/opus_in_isobmff.html +// 4.3.2 Opus Specific Box +/* +class ChannelMappingTable (unsigned int(8) OutputChannelCount){ + unsigned int(8) StreamCount; + unsigned int(8) CoupledCount; + unsigned int(8 * OutputChannelCount) ChannelMapping; +} + +aligned(8) class OpusSpecificBox extends Box('dOps'){ + unsigned int(8) Version; + unsigned int(8) OutputChannelCount; + unsigned int(16) PreSkip; + unsigned int(32) InputSampleRate; + signed int(16) OutputGain; + unsigned int(8) ChannelMappingFamily; + if (ChannelMappingFamily != 0) { + ChannelMappingTable(OutputChannelCount); + } +} +*/ + +static const uint8_t opus_coupled_stream_cnt[9] = { + 1, 0, 1, 1, 2, 2, 2, 3, 3 +}; + +static const uint8_t opus_stream_cnt[9] = { + 1, 1, 1, 2, 2, 3, 4, 4, 5, +}; + +static const uint8_t opus_channel_map[8][8] = { + { 0 }, + { 0,1 }, + { 0,2,1 }, + { 0,1,2,3 }, + { 0,4,1,2,3 }, + { 0,4,1,2,3,5 }, + { 0,4,1,2,3,5,6 }, + { 0,6,1,2,3,4,5,7 }, +}; + +int opus_head_save(const struct opus_head_t* opus, uint8_t* data, size_t bytes) +{ + if (bytes < 19) + return -1; + + memcpy(data, "OpusHead", 8); + data[8] = opus->version; // 0 only + data[9] = opus->channels; + data[11] = (uint8_t)(opus->pre_skip >> 8); // LSB + data[10] = (uint8_t)opus->pre_skip; + data[15] = (uint8_t)(opus->input_sample_rate >> 24); // LSB + data[14] = (uint8_t)(opus->input_sample_rate >> 16); + data[13] = (uint8_t)(opus->input_sample_rate >> 8); + data[12] = (uint8_t)opus->input_sample_rate; + data[17] = (uint8_t)(opus->output_gain >> 8); // LSB + data[16] = (uint8_t)opus->output_gain; + data[18] = opus->channel_mapping_family; + if (0 != opus->channel_mapping_family && bytes >= 29) + { + data[19] = opus->stream_count; + data[20] = opus->coupled_count; + memcpy(data+21, opus->channel_mapping, 8); + return 29; + } + + return 19; +} + +int opus_head_load(const uint8_t* data, size_t bytes, struct opus_head_t* opus) +{ + int n = 0; + if (bytes > 8 && 0 == memcmp(data, "OpusHead", 8)) + { + n = 8; + data += 8; + bytes -= 8; + } + + // check channels: [1, 8] + if (bytes < 11 || data[1] > 8 || data[1] < 1) + return -1; + + memset(opus, 0, sizeof(*opus)); + opus->version = data[0]; + opus->channels = data[1]; + opus->pre_skip = ((uint16_t)data[3] << 8) | data[2]; + opus->input_sample_rate = ((uint32_t)data[7] << 24) | ((uint32_t)data[6] << 16) | ((uint32_t)data[5] << 8) | data[4]; + opus->output_gain = ((uint16_t)data[9] << 8) | data[8]; + opus->channel_mapping_family = data[10]; + + if (0 != opus->channel_mapping_family && bytes >= 21) + { + opus->stream_count = data[11]; + opus->coupled_count = data[12]; + memcpy(opus->channel_mapping, data+13, 8); + return 21 + n; + } + else + { + opus->stream_count = opus_stream_cnt[opus->channels]; + opus->coupled_count = opus_coupled_stream_cnt[opus->channels]; + memcpy(opus->channel_mapping, opus_channel_map[opus_head_channels(opus)-1], 8); + } + + return 11 + n; +} + +static const uint8_t* opus_parse_size(const uint8_t* data, size_t bytes, size_t *size) +{ + if (bytes < 1) + return NULL; + + if (data[0] < 252) + { + *size = data[0]; + return data + 1; + } + + if (bytes < 2) + return NULL; + *size = 4 * (uint16_t)data[1] + data[0]; + return data + 2; +} + +static const uint8_t* opus_parse_padding(const uint8_t* data, int len) +{ + int n; + int pad; + + pad = 0; + do + { + if (len <= 0) + return NULL; + + n = *data++; + len--; + + len -= n == 255 ? 254 : n; + pad += n == 255 ? 254 : n; + } while (n == 255); + + return data; +} + +/* + * Table 6-1 opus_access_unit syntax + + |Syntax |Number of |Identif| + | |bits |ier | + |opus_access_unit() { | | | + | if(nextbits(11)==0x3FF) { | | | + | opus_control_header() | | | + | | | | + | for(i=0; i> 4) & 0x01; + end_trim_flag = (prefix >> 3) & 0x01; + control_extension_flag = (prefix >> 2) & 0x01; + + au_size = data[2]; + for(i = 3; i < bytes && 0xff == data[i-1]; i++) + au_size += data[i]; + + if(i + (start_trim_flag ? 2 : 0) + (end_trim_flag ? 2 : 0) + (control_extension_flag ? 1 : 0) > bytes) + return NULL; + + if(start_trim_flag) + i += 2; + if(end_trim_flag) + i += 2; + if(control_extension_flag) + { + if(i + 1 + data[i] > bytes) + return NULL; + i += 1 + data[i]; + } + + if(i + au_size > bytes) + return NULL; + + *payload = au_size; + return data + i; + } + else + { + *payload = bytes; + return data; + } +} + +static int opus_parse_frames(const void* data, size_t len, int (*onframe)(uint8_t toc, const void* frame, size_t size), void* param) +{ + int i, r; + int vbr, count; + uint8_t toc; + size_t n[48]; + const uint8_t* p, *end; + + if (len < 1) + return -1; + + p = (const uint8_t*)data; + end = p + len; + + toc = *p++; + len -= 1; + switch (toc & 0x03) + { + case 0: // one frame + return onframe(toc, p, len - 1); + + case 1: // two CBR frames + if (1 == (len % 2)) + return -1; + + toc = toc & 0xFC; // convert to one frame + for (i = 0; i < 2; i++) + { + r = onframe(toc, p, len / 2); + if (0 != r) + return r; + } + return 0; + + case 2: // two VBR frames + p = opus_parse_size(p, len, &n[0]); + if (!p || n[0] < 0 || p + n[0] > end) + return -1; + + toc = toc & 0xFC; // convert to one frame + r = onframe(toc, p, n[0]); + if (0 != r) + return r; + + // frame 2 + p += n[0]; + return onframe(toc, p, end - p); + + default: // multiple CBR/VBR frames (from 0 to 120ms) + if (len < 1) + return -1; + + len--; + count = *p & 0x3F; // bits of frames length (0-5) + vbr = *p & 0x80; + if (*p++ & 0x40) // padding + { + p = opus_parse_padding(p, (int)len); + if (!p) + return -1; + } + + toc = toc & 0xFC; // convert to one frame + + if (vbr) + { + for (i = 0; i < count - 1; i++) + { + p = opus_parse_size(p, end - p, &n[i]); + if (!p || n[i] < 0 || p + n[i] > end) + return -1; + } + + /* Because it's not encoded explicitly, it's possible the size of the + last packet (or all the packets, for the CBR case) is larger than + 1275. Reject them here.*/ + if (end - p > 1275) + return -1; + n[i] = end - p; // last frame + + for (i = 0; i < count; i++) + { + r = onframe(toc, p, n[i]); + if (0 != r) + return r; + + p += n[i]; + } + } + else + { + n[0] = (end - p) / count; + if (p + n[0] * count != end) + return -1; + + for (i = 0; i < count; i++) + { + r = onframe(toc, p, n[0]); + if (0 != r) + return r; + + p += n[0]; + } + } + } + + return 0; +} + +int opus_packet_getframes(const void* data, size_t len, int (*onframe)(uint8_t toc, const void* frame, size_t size), void* param) +{ + int r; + size_t payload; + const uint8_t* p, *end; + + p = (const uint8_t*)data; + end = p + len; + + while(p < end) + { + p = opus_ts_header(p, end - p, &payload); + if(!p) + return -1; + assert(p + payload <= end); + + r = opus_parse_frames(p, payload, onframe, param); + if(r < 0) + return r; + + p += payload; + } + + return 0; +} + +#if defined(DEBUG) || defined(_DEBUG) +static int opus_onframe(uint8_t toc, const void* frame, size_t size) +{ + (void)toc, frame, size; + return 0; +} + +static void opus_packet_getframes_test(void) +{ + const uint8_t data[] = { 0x7F ,0xF0 ,0xF1 ,0x00 ,0x78 ,0xFC ,0x6F ,0xE9 ,0x04 ,0x92 ,0x8B ,0x99 ,0xEF ,0x20 ,0x00 ,0x20 ,0x58 ,0x7E ,0x2E ,0x82 ,0xC6 ,0xCC ,0x27 ,0x92 ,0x56 ,0x45 ,0xA7 ,0x5C ,0xDD ,0xAB ,0x41 ,0x1F ,0xD0 ,0x4A ,0x49 ,0xBB ,0xEA ,0xC2 ,0x1F ,0xD5 ,0x2A ,0x67 ,0xD2 ,0xF4 ,0x3F ,0x9E ,0xF4 ,0x52 ,0x38 ,0x41 ,0xBE ,0x55 ,0x4C ,0xFB ,0xD7 ,0x18 ,0xF1 ,0x93 ,0x26 ,0x36 ,0x46 ,0x01 ,0x41 ,0x85 ,0x7E ,0xAD ,0xB0 ,0x37 ,0x4B ,0xB7 ,0x15 ,0xB1 ,0x4C ,0x81 ,0x05 ,0x99 ,0xF8 ,0xE1 ,0xB6 ,0x54 }; + opus_packet_getframes(data, sizeof(data), opus_onframe, NULL); +} + +void opus_head_test(void) +{ + uint8_t data[29]; + const uint8_t src[] = { 0x4f, 0x70, 0x75, 0x73, 0x48, 0x65, 0x61, 0x64, 0x01, 0x02, 0x78, 0x00, 0x80, 0xbb, 0x00, 0x00, 0x00, 0x00, 0x00 }; + + struct opus_head_t opus; + assert(sizeof(src) == opus_head_load(src, sizeof(src), &opus)); + assert(1 == opus.version && 2 == opus.channels && 120 == opus.pre_skip && 48000 == opus.input_sample_rate && 0 == opus.output_gain); + assert(0 == opus.channel_mapping_family && 1 == opus.stream_count && 1 == opus.coupled_count); + assert(0 == memcmp(opus_channel_map[opus.channels-1], opus.channel_mapping, 8)); + assert(sizeof(src) == opus_head_save(&opus, data, sizeof(data))); + assert(0 == memcmp(src, data, sizeof(src))); + + opus_packet_getframes_test(); +} +#endif diff --git a/src/big/mpp/middleware/src/mp4_format/src/libflv/source/riff-acm.c b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/riff-acm.c new file mode 100644 index 000000000..429727106 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/riff-acm.c @@ -0,0 +1,51 @@ +#include "riff-acm.h" + +int wave_format_load(const uint8_t* data, int bytes, struct wave_format_t* wav) +{ + if (bytes < 18) + return -1; + + // little endian + wav->wFormatTag = data[0] | ((uint16_t)data[1] << 8); + wav->nChannels = data[2] | ((uint16_t)data[3] << 8); + wav->nSamplesPerSec = ((uint32_t)data[4] << 0) | ((uint32_t)data[5] << 8) | ((uint32_t)data[6] << 16) | ((uint32_t)data[7] << 24); + wav->nAvgBytesPerSec = ((uint32_t)data[8] << 0) | ((uint32_t)data[9] << 8) | ((uint32_t)data[10] << 16) | ((uint32_t)data[11] << 24); + wav->nBlockAlign = data[12] | ((uint16_t)data[13] << 8); + wav->wBitsPerSample = data[14] | ((uint16_t)data[15] << 8); + wav->cbSize = data[16] | ((uint16_t)data[17] << 8); + + if (18 + wav->cbSize > bytes) + return -1; + + return 18 + wav->cbSize; +} + +int wave_format_save(const struct wave_format_t* wav, uint8_t* data, int bytes) +{ + if (bytes < wav->cbSize) + return -1; + + // little endian + data[0] = (uint8_t)wav->wFormatTag; + data[1] = (uint8_t)(wav->wFormatTag >> 8); + data[2] = (uint8_t)wav->nChannels; + data[3] = (uint8_t)(wav->nChannels >> 8); + data[4] = (uint8_t)wav->nSamplesPerSec; + data[5] = (uint8_t)(wav->nSamplesPerSec >> 8); + data[6] = (uint8_t)(wav->nSamplesPerSec >> 16); + data[7] = (uint8_t)(wav->nSamplesPerSec >> 24); + data[8] = (uint8_t)wav->nAvgBytesPerSec; + data[9] = (uint8_t)(wav->nAvgBytesPerSec >> 8); + data[10] = (uint8_t)(wav->nAvgBytesPerSec >> 16); + data[11] = (uint8_t)(wav->nAvgBytesPerSec >> 24); + data[12] = (uint8_t)wav->nBlockAlign; + data[13] = (uint8_t)(wav->nBlockAlign >> 8); + data[14] = (uint8_t)wav->wBitsPerSample; + data[15] = (uint8_t)(wav->wBitsPerSample >> 8); + data[16] = (uint8_t)wav->cbSize; + data[17] = (uint8_t)(wav->cbSize >> 8); + + //if(wav->cbSize > 0) + // memcpy(data + 18, wav->extra, wav->cbSize); + return wav->cbSize + 18; +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libflv/source/test.mp4 b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/test.mp4 new file mode 100644 index 000000000..e69de29bb diff --git a/src/big/mpp/middleware/src/mp4_format/src/libflv/source/vvc-annexbtomp4.c b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/vvc-annexbtomp4.c new file mode 100644 index 000000000..d5b94e82c --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/vvc-annexbtomp4.c @@ -0,0 +1,424 @@ +#include "mpeg4-vvc.h" +#include "mpeg4-avc.h" +#include +#include +#include + +#define H266_NAL_IDR_W_RADL 7 +#define H266_NAL_RSV_IRAP 11 +#define H266_NAL_OPI 12 +#define H266_NAL_DCI 13 +#define H266_NAL_VPS 14 +#define H266_NAL_SPS 15 +#define H266_NAL_PPS 16 +#define H266_NAL_PREFIX_APS 17 +#define H266_NAL_SUFFIX_APS 18 +#define H266_NAL_PH 19 +#define H266_NAL_AUD 20 +#define H266_NAL_PREFIX_SEI 23 +#define H266_NAL_SUFFIX_SEI 24 + +#define MAX(x, y) ((x) > (y) ? (x) : (y)) + +#define BIT(ptr, off) (((ptr)[(off) / 8] >> (7 - ((off) % 8))) & 0x01) + +struct h266_annexbtomp4_handle_t +{ + struct mpeg4_vvc_t* vvc; + int errcode; + int* update; // avc sps/pps update flags + int* vcl; + + uint8_t* out; + size_t bytes; + size_t capacity; +}; + +uint8_t mpeg4_h264_read_ue(const uint8_t* data, size_t bytes, size_t* offset); + +static size_t vvc_rbsp_decode(const uint8_t* nalu, size_t bytes, uint8_t* sodb, size_t len) +{ + size_t i, j; + const size_t max_sps_luma_bit_depth_offset = 256; + for (j = i = 0; i < bytes && j < len && i < max_sps_luma_bit_depth_offset; i++) + { + if (i + 2 < bytes && 0 == nalu[i] && 0 == nalu[i + 1] && 0x03 == nalu[i + 2]) + { + sodb[j++] = nalu[i]; + sodb[j++] = nalu[i + 1]; + i += 2; + } + else + { + sodb[j++] = nalu[i]; + } + } + return j; +} + +static uint8_t vvc_vps_id(const uint8_t* rbsp, size_t bytes, struct mpeg4_vvc_t* vvc, uint8_t* ptr, size_t len) +{ + size_t sodb; + uint8_t vps; + uint8_t vps_max_layers_minus1; + uint8_t vps_max_sub_layers_minus1; + + sodb = vvc_rbsp_decode(rbsp, bytes, ptr, len); + if (sodb < 4) + return 0xFF; + + vps = ptr[2] >> 4; // 2-nalu type + vps_max_layers_minus1 = (ptr[3] >> 2) & 0x3F; + vps_max_sub_layers_minus1 = ((ptr[3] & 0x3) << 2) | ((ptr[4] >> 7) & 0x01); + + return vps; +} + +static uint8_t vvc_sps_id(const uint8_t* rbsp, size_t bytes, struct mpeg4_vvc_t* vvc, uint8_t* ptr, size_t len, uint8_t* vps) +{ + size_t sodb; + uint8_t sps; + uint8_t sps_max_sub_layers_minus1; + + sodb = vvc_rbsp_decode(rbsp, bytes, ptr, len); + if (sodb < 12 + 3) + return 0xFF; + + sps = (ptr[2] >> 4) & 0x0F; // 2-nalu type + *vps = ptr[2] & 0x0F; + sps_max_sub_layers_minus1 = (ptr[3] >> 5) & 0x07; + vvc->chroma_format_idc = (ptr[3] >> 3) & 0x03; + + return sps; +} + +static uint8_t vvc_pps_id(const uint8_t* rbsp, size_t bytes, struct mpeg4_vvc_t* vvc, uint8_t* ptr, size_t len, uint8_t* sps) +{ + uint8_t pps; + size_t sodb; + size_t n = 2 * 8; // 2-nalu type + sodb = vvc_rbsp_decode(rbsp, bytes, ptr, len); + if (sodb < 12) + return 0xFF; (void)vvc; + pps = (ptr[2] >> 2) & 0x3F; // 2-nalu type + *sps = ((ptr[2] & 0x03) << 2) | ((ptr[3] >> 6) & 0x03); + + n = 11; + vvc->max_picture_width = mpeg4_h264_read_ue(ptr, sodb, &n); // pic_width_in_luma_samples + vvc->max_picture_height = mpeg4_h264_read_ue(ptr, sodb, &n); // pic_height_in_luma_samples + return pps; +} + +static void mpeg4_vvc_remove(struct mpeg4_vvc_t* vvc, uint8_t* ptr, size_t bytes, const uint8_t* end) +{ + uint8_t i; + assert(ptr >= vvc->data && ptr + bytes <= end && end <= vvc->data + sizeof(vvc->data)); + memmove(ptr, ptr + bytes, end - ptr - bytes); + + for (i = 0; i < vvc->numOfArrays; i++) + { + if (vvc->nalu[i].data > ptr) + vvc->nalu[i].data -= bytes; + } +} + +static int mpeg4_vvc_update2(struct mpeg4_vvc_t* vvc, int i, const uint8_t* nalu, size_t bytes) +{ + if (bytes == vvc->nalu[i].bytes && 0 == memcmp(nalu, vvc->nalu[i].data, bytes)) + return 0; // do nothing + + if (bytes > vvc->nalu[i].bytes && vvc->off + (bytes - vvc->nalu[i].bytes) > sizeof(vvc->data)) + { + assert(0); + return -1; // too big + } + + mpeg4_vvc_remove(vvc, vvc->nalu[i].data, vvc->nalu[i].bytes, vvc->data + vvc->off); + vvc->off -= vvc->nalu[i].bytes; + + vvc->nalu[i].data = vvc->data + vvc->off; + vvc->nalu[i].bytes = (uint16_t)bytes; + memcpy(vvc->nalu[i].data, nalu, bytes); + vvc->off += bytes; + return 1; +} + +static int mpeg4_vvc_add(struct mpeg4_vvc_t* vvc, uint8_t type, const uint8_t* nalu, size_t bytes) +{ + // copy new + assert(vvc->numOfArrays < sizeof(vvc->nalu) / sizeof(vvc->nalu[0])); + if (vvc->numOfArrays >= sizeof(vvc->nalu) / sizeof(vvc->nalu[0]) + || vvc->off + bytes > sizeof(vvc->data)) + { + assert(0); + return -1; + } + + vvc->nalu[vvc->numOfArrays].type = type; + vvc->nalu[vvc->numOfArrays].bytes = (uint16_t)bytes; + vvc->nalu[vvc->numOfArrays].array_completeness = 1; + vvc->nalu[vvc->numOfArrays].data = vvc->data + vvc->off; + memcpy(vvc->nalu[vvc->numOfArrays].data, nalu, bytes); + vvc->off += bytes; + ++vvc->numOfArrays; + return 1; +} + +static int h266_opi_copy(struct mpeg4_vvc_t* vvc, const uint8_t* nalu, size_t bytes) +{ + int i; + for (i = 0; i < vvc->numOfArrays; i++) + { + if (H266_NAL_OPI == vvc->nalu[i].type) + return mpeg4_vvc_update2(vvc, i, nalu, bytes); + } + + return mpeg4_vvc_add(vvc, H266_NAL_OPI, nalu, bytes); +} + +static int h266_dci_copy(struct mpeg4_vvc_t* vvc, const uint8_t* nalu, size_t bytes) +{ + int i; + for (i = 0; i < vvc->numOfArrays; i++) + { + if (H266_NAL_DCI == vvc->nalu[i].type) + return mpeg4_vvc_update2(vvc, i, nalu, bytes); + } + + return mpeg4_vvc_add(vvc, H266_NAL_DCI, nalu, bytes); +} + +static int h266_vps_copy(struct mpeg4_vvc_t* vvc, const uint8_t* nalu, size_t bytes) +{ + int i; + uint8_t vpsid; + + if (bytes < 3) + { + assert(0); + return -1; // invalid length + } + + vpsid = vvc_vps_id(nalu, bytes, vvc, vvc->data + vvc->off, sizeof(vvc->data) - vvc->off); + for (i = 0; i < vvc->numOfArrays; i++) + { + if (H266_NAL_VPS == vvc->nalu[i].type && vpsid == vvc_vps_id(vvc->nalu[i].data, vvc->nalu[i].bytes, vvc, vvc->data + vvc->off, sizeof(vvc->data) - vvc->off)) + return mpeg4_vvc_update2(vvc, i, nalu, bytes); + } + + return mpeg4_vvc_add(vvc, H266_NAL_VPS, nalu, bytes); +} + +static int h266_sps_copy(struct mpeg4_vvc_t* vvc, const uint8_t* nalu, size_t bytes) +{ + int i; + uint8_t spsid; + uint8_t vpsid, vpsid2; + + if (bytes < 13 + 2) + { + assert(0); + return -1; // invalid length + } + + spsid = vvc_sps_id(nalu, bytes, vvc, vvc->data + vvc->off, sizeof(vvc->data) - vvc->off, &vpsid); + for (i = 0; i < vvc->numOfArrays; i++) + { + if (H266_NAL_SPS == vvc->nalu[i].type && spsid == vvc_sps_id(vvc->nalu[i].data, vvc->nalu[i].bytes, vvc, vvc->data + vvc->off, sizeof(vvc->data) - vvc->off, &vpsid2) && vpsid == vpsid2) + return mpeg4_vvc_update2(vvc, i, nalu, bytes); + } + + return mpeg4_vvc_add(vvc, H266_NAL_SPS, nalu, bytes); +} + +static int h266_pps_copy(struct mpeg4_vvc_t* vvc, const uint8_t* nalu, size_t bytes) +{ + int i; + uint8_t ppsid; + uint8_t spsid, spsid2; + + if (bytes < 1 + 2) + { + assert(0); + return -1; // invalid length + } + + ppsid = vvc_pps_id(nalu, bytes, vvc, vvc->data + vvc->off, sizeof(vvc->data) - vvc->off, &spsid); + for (i = 0; i < vvc->numOfArrays; i++) + { + if (H266_NAL_PPS == vvc->nalu[i].type && ppsid == vvc_pps_id(vvc->nalu[i].data, vvc->nalu[i].bytes, vvc, vvc->data + vvc->off, sizeof(vvc->data) - vvc->off, &spsid2) && spsid == spsid2) + return mpeg4_vvc_update2(vvc, i, nalu, bytes); + } + + return mpeg4_vvc_add(vvc, H266_NAL_PPS, nalu, bytes); +} + +static int h266_sei_clear(struct mpeg4_vvc_t* vvc) +{ + int i; + for (i = 0; i < vvc->numOfArrays; i++) + { + if (H266_NAL_PREFIX_SEI == vvc->nalu[i].type || H266_NAL_SUFFIX_SEI == vvc->nalu[i].type) + { + mpeg4_vvc_remove(vvc, vvc->nalu[i].data, vvc->nalu[i].bytes, vvc->data + vvc->off); + vvc->off -= vvc->nalu[i].bytes; + if (i + 1 < vvc->numOfArrays) + memmove(vvc->nalu + i, vvc->nalu + i + 1, sizeof(vvc->nalu[0]) * (vvc->numOfArrays - i - 1)); + --vvc->numOfArrays; + --i; + } + } + return 0; +} + +int mpeg4_vvc_update(struct mpeg4_vvc_t* vvc, const uint8_t* nalu, size_t bytes) +{ + int r; + + switch ((nalu[1] >> 3) & 0x1f) + { + case H266_NAL_OPI: + r = h266_opi_copy(vvc, nalu, bytes); + break; + + case H266_NAL_DCI: + r = h266_dci_copy(vvc, nalu, bytes); + break; + + case H266_NAL_VPS: + h266_sei_clear(vvc); // remove all prefix/suffix sei + r = h266_vps_copy(vvc, nalu, bytes); + break; + + case H266_NAL_SPS: + r = h266_sps_copy(vvc, nalu, bytes); + break; + + case H266_NAL_PPS: + r = h266_pps_copy(vvc, nalu, bytes); + break; + +#if defined(H266_FILTER_SEI) + case H266_NAL_PREFIX_SEI: + r = mpeg4_vvc_add(vvc, H266_NAL_SEI_PREFIX, nalu, bytes); + break; + + case H266_NAL_SUFFIX_SEI: + r = mpeg4_vvc_add(vvc, H266_NAL_SEI_SUFFIX, nalu, bytes); + break; +#endif + + default: + r = 0; + break; + } + + return r; +} + +static void vvc_handler(void* param, const uint8_t* nalu, size_t bytes) +{ + int r; + uint8_t nalutype; + struct h266_annexbtomp4_handle_t* mp4; + mp4 = (struct h266_annexbtomp4_handle_t*)param; + + if (bytes < 2) + { + assert(0); + mp4->errcode = -EINVAL; + return; + } + + nalutype = (nalu[1] >> 3) & 0x1f; +#if defined(H2645_FILTER_AUD) + if (H266_NAL_AUD == nalutype) + return; // ignore AUD +#endif + + r = mpeg4_vvc_update(mp4->vvc, nalu, bytes); + if (1 == r && mp4->update) + *mp4->update = 1; + else if (r < 0) + mp4->errcode = r; + + // IRAP-1, B/P-2, other-0 + if (mp4->vcl && nalutype < H266_NAL_OPI) + *mp4->vcl = H266_NAL_IDR_W_RADL <= nalutype && nalutype <= H266_NAL_RSV_IRAP ? 1 : 2; + + if (mp4->capacity >= mp4->bytes + bytes + 4) + { + mp4->out[mp4->bytes + 0] = (uint8_t)((bytes >> 24) & 0xFF); + mp4->out[mp4->bytes + 1] = (uint8_t)((bytes >> 16) & 0xFF); + mp4->out[mp4->bytes + 2] = (uint8_t)((bytes >> 8) & 0xFF); + mp4->out[mp4->bytes + 3] = (uint8_t)((bytes >> 0) & 0xFF); + memmove(mp4->out + mp4->bytes + 4, nalu, bytes); + mp4->bytes += bytes + 4; + } + else + { + mp4->errcode = -1; + } +} + +int h266_annexbtomp4(struct mpeg4_vvc_t* vvc, const void* data, size_t bytes, void* out, size_t size, int* vcl, int* update) +{ + struct h266_annexbtomp4_handle_t h; + memset(&h, 0, sizeof(h)); + h.vvc = vvc; + h.vcl = vcl; + h.update = update; + h.out = (uint8_t*)out; + h.capacity = size; + if (vcl) *vcl = 0; + if (update) *update = 0; + + // vvc->numTemporalLayers = 0; + // vvc->temporalIdNested = 0; + // vvc->min_spatial_segmentation_idc = 0; + // vvc->general_profile_compatibility_flags = 0xffffffff; + // vvc->general_constraint_indicator_flags = 0xffffffffffULL; + // vvc->chromaFormat = 1; // 4:2:0 + + mpeg4_h264_annexb_nalu((const uint8_t*)data, bytes, vvc_handler, &h); + vvc->lengthSizeMinusOne = 3; // 4 bytes + return 0 == h.errcode ? (int)h.bytes : 0; +} + +int h266_is_new_access_unit(const uint8_t* nalu, size_t bytes) +{ + uint8_t nal_type; + if (bytes < 2) + return 0; + + nal_type = (nalu[1] >> 3) & 0x1f; + + // 7.4.2.4.3 Order of PUs and their association to AUs + if (H266_NAL_AUD == nal_type || H266_NAL_OPI == nal_type || H266_NAL_DCI == nal_type + || H266_NAL_VPS == nal_type || H266_NAL_SPS == nal_type || H266_NAL_PPS == nal_type + || H266_NAL_PREFIX_APS == nal_type || H266_NAL_PH == nal_type || H266_NAL_PREFIX_SEI == nal_type + || 26 == nal_type || (28 <= nal_type && nal_type <= 29)) + return 1; + + return 0; +} + +#if defined(_DEBUG) || defined(DEBUG) +void vvc_annexbtomp4_test(void) +{ + const uint8_t vps[] = { 0x40, 0x01, 0x0c, 0x01, 0xff, 0xff, 0x01, 0x60, 0x00, 0x00, 0x03, 0x00, 0x80, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x78, 0x9d, 0xc0, 0x90 }; + const uint8_t sps[] = { 0x42, 0x01, 0x01, 0x01, 0x60, 0x00, 0x00, 0x03, 0x00, 0x80, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x78, 0xa0, 0x03, 0xc0, 0x80, 0x32, 0x16, 0x59, 0xde, 0x49, 0x1b, 0x6b, 0x80, 0x40, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x17, 0x70, 0x02 }; + const uint8_t pps[] = { 0x44, 0x01, 0xc1, 0x73, 0xd1, 0x89 }; + const uint8_t annexb[] = { 0x00, 0x00, 0x00, 0x01, 0x4e, 0x01, 0x06, 0x01, 0xd0, 0x80, 0x00, 0x00, 0x00, 0x01, 0x40, 0x01, 0x0c, 0x01, 0xff, 0xff, 0x01, 0x60, 0x00, 0x00, 0x03, 0x00, 0x80, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x78, 0x9d, 0xc0, 0x90, 0x00, 0x00, 0x00, 0x01, 0x42, 0x01, 0x01, 0x01, 0x60, 0x00, 0x00, 0x03, 0x00, 0x80, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x78, 0xa0, 0x03, 0xc0, 0x80, 0x32, 0x16, 0x59, 0xde, 0x49, 0x1b, 0x6b, 0x80, 0x40, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x17, 0x70, 0x02, 0x00, 0x00, 0x00, 0x01, 0x44, 0x01, 0xc1, 0x73, 0xd1, 0x89 }; + uint8_t output[512]; + int vcl, update; + + struct mpeg4_vvc_t vvc; + memset(&vvc, 0, sizeof(vvc)); + assert(h266_annexbtomp4(&vvc, annexb, sizeof(annexb), output, sizeof(output), &vcl, &update) > 0); + assert(3 == vvc.numOfArrays && vcl == 0 && update == 1); + assert(vvc.nalu[0].bytes == sizeof(vps) && 0 == memcmp(vvc.nalu[0].data, vps, sizeof(vps))); + assert(vvc.nalu[1].bytes == sizeof(sps) && 0 == memcmp(vvc.nalu[1].data, sps, sizeof(sps))); + assert(vvc.nalu[2].bytes == sizeof(pps) && 0 == memcmp(vvc.nalu[2].data, pps, sizeof(pps))); +} +#endif diff --git a/src/big/mpp/middleware/src/mp4_format/src/libflv/source/vvc-mp4toannexb.c b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/vvc-mp4toannexb.c new file mode 100644 index 000000000..2c289f25d --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/vvc-mp4toannexb.c @@ -0,0 +1,138 @@ +#include "mpeg4-vvc.h" +#include "mpeg4-avc.h" +#include +#include +#include +#include +#include + +#define H266_NAL_IDR_W_RADL 7 +#define H266_NAL_RSV_IRAP 11 +#define H266_NAL_OPI 12 +#define H266_NAL_DCI 13 +#define H266_NAL_VPS 14 +#define H266_NAL_SPS 15 +#define H266_NAL_PPS 16 +#define H266_NAL_AUD 20 +#define H266_NAL_PREFIX_SEI 23 +#define H266_NAL_SUFFIX_SEI 24 + +struct h266_mp4toannexb_handle_t +{ + const struct mpeg4_vvc_t* vvc; + int vps_sps_pps_flag; + int errcode; + + uint8_t* out; + size_t bytes; + size_t capacity; +}; + +static int h266_vps_sps_pps_size(const struct mpeg4_vvc_t* vvc) +{ + int i, n = 0; + for (i = 0; i < vvc->numOfArrays; i++) + n += vvc->nalu[i].bytes + 4; + return n; +} + +static void h266_mp4toannexb_handler(void* param, const uint8_t* nalu, size_t bytes) +{ + int n; + uint8_t irap, nalu_type; + const uint8_t h266_start_code[] = { 0x00, 0x00, 0x00, 0x01 }; + struct h266_mp4toannexb_handle_t* mp4; + mp4 = (struct h266_mp4toannexb_handle_t*)param; + + if (bytes < 2) + { + assert(0); + mp4->errcode = -EINVAL; + return; + } + + nalu_type = (nalu[1] >> 3) & 0x1F; +#if defined(H2645_FILTER_AUD) + if (H266_NAL_AUD == nalu_type) + continue; // ignore AUD +#endif + + if (H266_NAL_OPI == nalu_type || H266_NAL_DCI == nalu_type || H266_NAL_VPS == nalu_type || H266_NAL_SPS == nalu_type || H266_NAL_PPS == nalu_type) + mp4->vps_sps_pps_flag = 1; + + irap = H266_NAL_IDR_W_RADL <= nalu_type && nalu_type <= H266_NAL_RSV_IRAP; + if (irap && 0 == mp4->vps_sps_pps_flag) + { + // insert VPS/SPS/PPS before IDR frame + if (mp4->bytes > 0) + { + // write sps/pps at first + n = h266_vps_sps_pps_size(mp4->vvc); + if (n + mp4->bytes > mp4->capacity) + { + mp4->errcode = -E2BIG; + return; + } + memmove(mp4->out + n, mp4->out, mp4->bytes); + } + + n = mpeg4_vvc_to_nalu(mp4->vvc, mp4->out, mp4->capacity); + if (n <= 0) + { + mp4->errcode = 0 == n ? -EINVAL : n; + return; + } + mp4->bytes += n; + mp4->vps_sps_pps_flag = 1; + } + + if (mp4->bytes + bytes + sizeof(h266_start_code) > mp4->capacity) + { + mp4->errcode = -E2BIG; + return; + } + + memcpy(mp4->out + mp4->bytes, h266_start_code, sizeof(h266_start_code)); + memcpy(mp4->out + mp4->bytes + sizeof(h266_start_code), nalu, bytes); + mp4->bytes += sizeof(h266_start_code) + bytes; +} + +int h266_mp4toannexb(const struct mpeg4_vvc_t* vvc, const void* data, size_t bytes, void* out, size_t size) +{ + int i, n; + const uint8_t* src, * end; + struct h266_mp4toannexb_handle_t h; + + memset(&h, 0, sizeof(h)); + h.vvc = vvc; + h.out = (uint8_t*)out; + h.capacity = size; + + end = (uint8_t*)data + bytes; + for (src = (uint8_t*)data; src + vvc->lengthSizeMinusOne + 1 < end; src += n) + { + for (n = i = 0; i < vvc->lengthSizeMinusOne + 1; i++) + n = (n << 8) + ((uint8_t*)src)[i]; + + // fix 0x00 00 00 01 => flv nalu size + if (0 == vvc->lengthSizeMinusOne || (1 == n && (2 == vvc->lengthSizeMinusOne || 3 == vvc->lengthSizeMinusOne))) + { + //n = (int)(end - src) - avc->nalu; + mpeg4_h264_annexb_nalu(src, end - src, h266_mp4toannexb_handler, &h); + src = end; + break; + } + + src += vvc->lengthSizeMinusOne + 1; + if (n < 1 || src + n > end) + { + assert(0); + return -EINVAL; + } + + h266_mp4toannexb_handler(&h, src, n); + } + + assert(src == end); + return 0 == h.errcode ? (int)h.bytes : 0; +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libflv/source/webm-vpx.c b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/webm-vpx.c new file mode 100644 index 000000000..723a56eea --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libflv/source/webm-vpx.c @@ -0,0 +1,171 @@ +#include "webm-vpx.h" +#include "mpeg4-bits.h" +#include +#include +#include + +enum { + WEBM_VP_LEVEL_1 = 10, + WEBM_VP_LEVEL_1_1 = 11, + WEBM_VP_LEVEL_2 = 20, + WEBM_VP_LEVEL_2_1 = 21, + WEBM_VP_LEVEL_3 = 30, + WEBM_VP_LEVEL_3_1 = 31, + WEBM_VP_LEVEL_4 = 40, + WEBM_VP_LEVEL_4_1 = 41, + WEBM_VP_LEVEL_5 = 50, + WEBM_VP_LEVEL_5_1 = 51, + WEBM_VP_LEVEL_5_2 = 52, + WEBM_VP_LEVEL_6 = 60, + WEBM_VP_LEVEL_6_1 = 61, + WEBM_VP_LEVEL_6_2 = 62, +}; + +/* +aligned (8) class VPCodecConfigurationRecord { + unsigned int (8) profile; + unsigned int (8) level; + unsigned int (4) bitDepth; + unsigned int (3) chromaSubsampling; + unsigned int (1) videoFullRangeFlag; + unsigned int (8) colourPrimaries; + unsigned int (8) transferCharacteristics; + unsigned int (8) matrixCoefficients; + unsigned int (16) codecIntializationDataSize; + unsigned int (8)[] codecIntializationData; +} +*/ + +int webm_vpx_codec_configuration_record_load(const uint8_t* data, size_t bytes, struct webm_vpx_t* vpx) +{ + if (bytes < 8) + return -1; + + vpx->profile = data[0]; + vpx->level = data[1]; + vpx->bit_depth = (data[2] >> 4) & 0x0F; + vpx->chroma_subsampling = (data[2] >> 1) & 0x07; + vpx->video_full_range_flag = data[2] & 0x01; + vpx->colour_primaries = data[3]; + vpx->transfer_characteristics = data[4]; + vpx->matrix_coefficients = data[5]; + vpx->codec_intialization_data_size = (((uint16_t)data[6]) << 8) | data[7]; + assert(0 == vpx->codec_intialization_data_size); + return 8; +} + +int webm_vpx_codec_configuration_record_save(const struct webm_vpx_t* vpx, uint8_t* data, size_t bytes) +{ + if (bytes < 8 + (size_t)vpx->codec_intialization_data_size) + return 0; // don't have enough memory + + data[0] = vpx->profile; + data[1] = vpx->level; + data[2] = (vpx->bit_depth << 4) | ((vpx->chroma_subsampling & 0x07) << 1) | (vpx->video_full_range_flag & 0x01); + data[3] = vpx->colour_primaries; + data[4] = vpx->transfer_characteristics; + data[5] = vpx->matrix_coefficients; + data[6] = (uint8_t)(vpx->codec_intialization_data_size >> 8); + data[7] = (uint8_t)vpx->codec_intialization_data_size; + + if(vpx->codec_intialization_data_size > 0) + memcpy(data + 8, vpx->codec_intialization_data, vpx->codec_intialization_data_size); + return 8 + vpx->codec_intialization_data_size; +} + +// https://www.webmproject.org/vp9/mp4/ +// https://github.com/webmproject/vp9-dash +// https://www.rfc-editor.org/rfc/pdfrfc/rfc6386.txt.pdf +// https://storage.googleapis.com/downloads.webmproject.org/docs/vp9/vp9-bitstream-specification-v0.6-20160331-draft.pdf +int webm_vpx_codec_configuration_record_from_vp8(struct webm_vpx_t* vpx, int *width, int* height, const void* keyframe, size_t bytes) +{ + uint32_t tag; + const uint8_t* p; + const uint8_t startcode[] = { 0x9d, 0x01, 0x2a }; + + if (bytes < 10) + return -1; + + p = (const uint8_t*)keyframe; + + // 9.1. Uncompressed Data Chunk + tag = (uint32_t)p[0] | ((uint32_t)p[1] << 8) | ((uint32_t)p[2] << 16); + //key_frame = tag & 0x01; + //version = (tag >> 1) & 0x07; + //show_frame = (tag >> 4) & 0x1; + //first_part_size = (tag >> 5) & 0x7FFFF; + + if (0 != (tag & 0x01) || startcode[0] != p[3] || startcode[1] != p[4] || startcode[2] != p[5]) + return -1; // not key frame + + *width = ((uint16_t)(p[7] & 0x3F) << 8) | (uint16_t)(p[6]); // (2 bits Horizontal Scale << 14) | Width (14 bits) + *height = ((uint16_t)(p[9] & 0x3F) << 8) | (uint16_t)(p[8]); // (2 bits Vertical Scale << 14) | Height (14 bits) + + memset(vpx, 0, sizeof(*vpx)); + vpx->profile = (tag >> 1) & 0x03; + vpx->level = 31; + vpx->bit_depth = 8; + return 0; +} + +// https://storage.googleapis.com/downloads.webmproject.org/docs/vp9/vp9-bitstream-specification-v0.6-20160331-draft.pdf +int webm_vpx_codec_configuration_record_from_vp9(struct webm_vpx_t* vpx, int* width, int* height, const void* keyframe, size_t bytes) +{ + const uint8_t* p; + struct mpeg4_bits_t bits; + const uint8_t frame_sync_code[] = { 0x49, 0x83, 0x42 }; + + p = (const uint8_t*)keyframe; + if (bytes < 4 || frame_sync_code[0] != p[1] || frame_sync_code[1] != p[2] || frame_sync_code[2] != p[3]) + return -1; + + memset(vpx, 0, sizeof(*vpx)); + vpx->level = 31; + + // 6.2 Uncompressed header syntax + mpeg4_bits_init(&bits, (void*)keyframe, bytes); + mpeg4_bits_read_n(&bits, 2); // 2-frame_marker + vpx->profile = (uint8_t)(mpeg4_bits_read(&bits) | (mpeg4_bits_read(&bits) << 1)); // 2-profile_low_bit+profile_high_bit + mpeg4_bits_read_n(&bits, 4 + 24); // skip 4-bits + frame_sync_code + + // color_config() + if (vpx->profile >= 2) + vpx->bit_depth = (uint8_t)mpeg4_bits_read(&bits) ? 12 : 10; // 1-ten_or_twelve_bit + else + vpx->bit_depth = 8; + if (7 /*CS_RGB*/ != mpeg4_bits_read_n(&bits, 3)) // 3-color_space + { + vpx->video_full_range_flag = (uint8_t)mpeg4_bits_read(&bits); // color_range + if (1 == vpx->profile || 3 == vpx->profile) + { + vpx->chroma_subsampling = 3 - (uint8_t)mpeg4_bits_read_n(&bits, 2); // subsampling_x/subsampling_y + mpeg4_bits_read(&bits); // reserved_zero + } + } + else + { + if (1 == vpx->profile || 3 == vpx->profile) + mpeg4_bits_read(&bits); // reserved_zero + } + + // frame_size() + *width = (int)mpeg4_bits_read_n(&bits, 16) + 1; + *height = (int)mpeg4_bits_read_n(&bits, 16) + 1; + return mpeg4_bits_error(&bits) ? -1 : 0; +} + +#if defined(_DEBUG) || defined(DEBUG) +void webm_vpx_test(void) +{ + const unsigned char src[] = { + 0x00, 0x1f, 0x80, 0x02, 0x02, 0x02, 0x00, 0x00 + }; + unsigned char data[sizeof(src)]; + + struct webm_vpx_t vpx; + assert(sizeof(src) == webm_vpx_codec_configuration_record_load(src, sizeof(src), &vpx)); + assert(0 == vpx.profile && 31 == vpx.level && 8 == vpx.bit_depth && 0 == vpx.chroma_subsampling && 0 == vpx.video_full_range_flag); + assert(sizeof(src) == webm_vpx_codec_configuration_record_save(&vpx, data, sizeof(data))); + assert(0 == memcmp(src, data, sizeof(src))); +} +#endif diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/include/fmp4-writer.h b/src/big/mpp/middleware/src/mp4_format/src/libmov/include/fmp4-writer.h new file mode 100644 index 000000000..326697608 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/include/fmp4-writer.h @@ -0,0 +1,49 @@ +#ifndef _fmp4_writer_h_ +#define _fmp4_writer_h_ + +#include +#include +#include "mov-buffer.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct fmp4_writer_t fmp4_writer_t; + +/// @param[in] flags mov flags, such as: MOV_FLAG_SEGMENT, see more @mov-format.h +fmp4_writer_t* fmp4_writer_create(const struct mov_buffer_t *buffer, void* param, int flags); +void fmp4_writer_destroy(fmp4_writer_t* fmp4); + +/// @param[in] object MPEG-4 systems ObjectTypeIndication such as: MOV_OBJECT_H264, see more @mov-format.h +/// @param[in] extra_data AudioSpecificConfig/AVCDecoderConfigurationRecord/HEVCDecoderConfigurationRecord +/// @return >=0-track, <0-error +int fmp4_writer_add_audio(fmp4_writer_t* fmp4, uint8_t object, int channel_count, int bits_per_sample, int sample_rate, const void* extra_data, size_t extra_data_size); +int fmp4_writer_add_video(fmp4_writer_t* fmp4, uint8_t object, int width, int height, const void* extra_data, size_t extra_data_size); +int fmp4_writer_add_subtitle(fmp4_writer_t* fmp4, uint8_t object, const void* extra_data, size_t extra_data_size); + +/// Write audio/video stream +/// raw AAC data, don't include ADTS/AudioSpecificConfig +/// H.264/H.265 MP4 format, replace start code(0x00000001) with NALU size +/// @param[in] track return by mov_writer_add_audio/mov_writer_add_video +/// @param[in] data audio/video frame +/// @param[in] bytes buffer size +/// @param[in] pts timestamp in millisecond +/// @param[in] dts timestamp in millisecond +/// @param[in] flags MOV_AV_FLAG_XXX, such as: MOV_AV_FLAG_KEYFREAME, see more @mov-format.h +/// @return 0-ok, other-error +int fmp4_writer_write(fmp4_writer_t* fmp4, int track, const void* data, size_t bytes, int64_t pts, int64_t dts, int flags); + +/// Save data and open next segment +/// @return 0-ok, other-error +int fmp4_writer_save_segment(fmp4_writer_t* fmp4); + +/// Get init segment data(write FTYP, MOOV only) +/// WARNING: it caller duty to switch file/buffer context with fmp4_writer_write +/// @return 0-ok, other-error +int fmp4_writer_init_segment(fmp4_writer_t* fmp4); + +#ifdef __cplusplus +} +#endif +#endif /* !_fmp4_writer_h_ */ diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/include/mov-atom.h b/src/big/mpp/middleware/src/mp4_format/src/libmov/include/mov-atom.h new file mode 100644 index 000000000..107a8c5db --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/include/mov-atom.h @@ -0,0 +1,182 @@ +#ifndef _mov_atom_h_ +#define _mov_atom_h_ + +#include +#include + +#define N_BRAND 8 + +struct mov_ftyp_t +{ + uint32_t major_brand; + uint32_t minor_version; + + uint32_t compatible_brands[N_BRAND]; + int brands_count; +}; + +// A.4 Temporal structure of the media (p148) +// The movie, and each track, has a timescale. +// This defines a time axis which has a number of ticks per second +struct mov_mvhd_t +{ + // FullBox + uint32_t version : 8; + uint32_t flags : 24; + + uint32_t timescale; // time-scale for the entire presentation, the number of time units that pass in one second + uint64_t duration; // default UINT64_MAX(by timescale) + uint64_t creation_time; // seconds sine midnight, Jan. 1, 1904, UTC + uint64_t modification_time; // seconds sine midnight, Jan. 1, 1904, UTC + + uint32_t rate; + uint16_t volume; // fixed point 8.8 number, 1.0 (0x0100) is full volume + //uint16_t reserved; + //uint32_t reserved2[2]; + int32_t matrix[9]; // u,v,w + //int32_t pre_defined[6]; + uint32_t next_track_ID; +}; + +enum +{ + MOV_TKHD_FLAG_TRACK_ENABLE = 0x01, + MOV_TKHD_FLAG_TRACK_IN_MOVIE = 0x02, + MOV_TKHD_FLAG_TRACK_IN_PREVIEW = 0x04, +}; + +struct mov_tkhd_t +{ + // FullBox + uint32_t version : 8; + uint32_t flags : 24; // MOV_TKHD_FLAG_XXX + + uint32_t track_ID; // cannot be zero + uint64_t creation_time; // seconds sine midnight, Jan. 1, 1904, UTC + uint64_t modification_time; // seconds sine midnight, Jan. 1, 1904, UTC + uint64_t duration; // default UINT64_MAX(by Movie Header Box timescale) + //uint32_t reserved; + + //uint32_t reserved2[2]; + int16_t layer; + int16_t alternate_group; + int16_t volume; // fixed point 8.8 number, 1.0 (0x0100) is full volume + //uint16_t reserved; + int32_t matrix[9]; // u,v,w + uint32_t width; // fixed-point 16.16 values + uint32_t height; // fixed-point 16.16 values +}; + +struct mov_mdhd_t +{ + // FullBox + uint32_t version : 8; + uint32_t flags : 24; + + uint32_t timescale; // second + uint64_t duration; // default UINT64_MAX(by timescale) + uint64_t creation_time; // seconds sine midnight, Jan. 1, 1904, UTC + uint64_t modification_time; // seconds sine midnight, Jan. 1, 1904, UTC + + uint32_t pad : 1; + uint32_t language : 15; + uint32_t pre_defined : 16; +}; + +struct mov_sample_entry_t +{ + uint16_t data_reference_index; // ref [dref] Data Reference Boxes + uint8_t object_type_indication; // H.264/AAC MOV_OBJECT_XXX (DecoderConfigDescriptor) + uint8_t stream_type; // MP4_STREAM_XXX + uint8_t* extra_data; // H.264 sps/pps + int extra_data_size; + + union + { + struct mov_bitrate_t + { + uint32_t bufferSizeDB; + uint32_t maxBitrate; + uint32_t avgBitrate; + } bitrate; + + //struct mov_uri_t + //{ + // char uri[256]; + //} uri; + + // visual + struct mov_visual_sample_t + { + uint16_t width; + uint16_t height; + uint32_t horizresolution; // 0x00480000 - 72dpi + uint32_t vertresolution; // 0x00480000 - 72dpi + uint16_t frame_count; // default 1 + uint16_t depth; // 0x0018 + + struct mov_pixel_aspect_ratio_t + { + uint32_t h_spacing; + uint32_t v_spacing; + } pasp; + } visual; + + struct mov_audio_sample_t + { + uint16_t channelcount; // default 2 + uint16_t samplesize; // default 16 + uint32_t samplerate; // { default samplerate of media } << 16 + } audio; + } u; +}; + +struct mov_stsd_t +{ + struct mov_sample_entry_t *current; // current entry, read only + struct mov_sample_entry_t *entries; + uint32_t entry_count; +}; + +struct mov_stts_t +{ + uint32_t sample_count; + uint32_t sample_delta; // in the time-scale of the media +}; + +struct mov_stsc_t +{ + uint32_t first_chunk; + uint32_t samples_per_chunk; + uint32_t sample_description_index; +}; + +struct mov_elst_t +{ + uint64_t segment_duration; // by Movie Header Box timescale + int64_t media_time; + int16_t media_rate_integer; + int16_t media_rate_fraction; +}; + +struct mov_trex_t +{ +// uint32_t track_ID; + uint32_t default_sample_description_index; + uint32_t default_sample_duration; + uint32_t default_sample_size; + uint32_t default_sample_flags; +}; + +struct mov_tfhd_t +{ + uint32_t flags; +// uint32_t track_ID; + uint64_t base_data_offset; + uint32_t sample_description_index; + uint32_t default_sample_duration; + uint32_t default_sample_size; + uint32_t default_sample_flags; +}; + +#endif /* !_mov_atom_h_ */ diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/include/mov-box.h b/src/big/mpp/middleware/src/mp4_format/src/libmov/include/mov-box.h new file mode 100644 index 000000000..8d38048e5 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/include/mov-box.h @@ -0,0 +1,25 @@ +#ifndef _mov_box_h_ +#define _mov_box_h_ + +#include +#include + +// ISO/IEC 14496-12:2012(E) 4.2 Object Structure (16) +struct mov_box_t +{ + uint64_t size; // 0-size: box extends to end of file, 1-size: large size + uint32_t type; + + // if 'uuid' == type + //uint8_t usertype[16]; + + // FullBox + //uint32_t version : 8; + //uint32_t flags : 24; + +#if defined(DEBUG) || defined(_DEBUG) + int level; +#endif +}; + +#endif /* !_mov_box_h_ */ diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/include/mov-buffer.h b/src/big/mpp/middleware/src/mp4_format/src/libmov/include/mov-buffer.h new file mode 100644 index 000000000..a15f31e9b --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/include/mov-buffer.h @@ -0,0 +1,33 @@ +#ifndef _mov_buffer_h_ +#define _mov_buffer_h_ + +#include + +struct mov_buffer_t +{ + /// read data from buffer + /// @param[in] param user-defined parameter + /// @param[out] data user buffer + /// @param[in] bytes data buffer size + /// @return 0-ok, <0-error + int (*read)(void* param, void* data, uint64_t bytes); + + /// write data to buffer + /// @param[in] param user-defined parameter + /// @param[in] data user buffer + /// @param[in] bytes data buffer size + /// @return 0-ok, <0-error + int (*write)(void* param, const void* data, uint64_t bytes); + + /// move buffer position + /// @param[in] param user-defined parameter + /// @param[in] offset >=0-seek buffer read/write position to offset(from buffer begin), <0-seek from file end(SEEK_END) + /// @return 0-ok, <0-error + int (*seek)(void* param, int64_t offset); + + /// get buffer read/write position + /// @return <0-error, other-current read/write position + int64_t (*tell)(void* param); +}; + +#endif /* !_mov_buffer_h_ */ diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/include/mov-format.h b/src/big/mpp/middleware/src/mp4_format/src/libmov/include/mov-format.h new file mode 100644 index 000000000..c3c9737f9 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/include/mov-format.h @@ -0,0 +1,53 @@ +#ifndef _mov_format_h_ +#define _mov_format_h_ + +// ISO/IEC 14496-1:2010(E) 7.2.6.6 DecoderConfigDescriptor (p48) +// MPEG-4 systems ObjectTypeIndication +// http://www.mp4ra.org/object.html +#define MOV_OBJECT_TEXT 0x08 // Text Stream +#define MOV_OBJECT_MP4V 0x20 // Visual ISO/IEC 14496-2 (c) +#define MOV_OBJECT_H264 0x21 // Visual ITU-T Recommendation H.264 | ISO/IEC 14496-10 +#define MOV_OBJECT_H265 0x23 // Visual ISO/IEC 23008-2 | ITU-T Recommendation H.265 +#define MOV_OBJECT_AAC 0x40 // Audio ISO/IEC 14496-3 +#define MOV_OBJECT_MP2V 0x60 // Visual ISO/IEC 13818-2 Simple Profile +#define MOV_OBJECT_AAC_MAIN 0x66 // MPEG-2 AAC Main +#define MOV_OBJECT_AAC_LOW 0x67 // MPEG-2 AAC Low +#define MOV_OBJECT_AAC_SSR 0x68 // MPEG-2 AAC SSR +#define MOV_OBJECT_MP3 0x69 // Audio ISO/IEC 13818-3 +#define MOV_OBJECT_MP1V 0x6A // Visual ISO/IEC 11172-2 +#define MOV_OBJECT_MP1A 0x6B // Audio ISO/IEC 11172-3 +#define MOV_OBJECT_JPEG 0x6C // Visual ISO/IEC 10918-1 (JPEG) +#define MOV_OBJECT_PNG 0x6D // Portable Network Graphics (f) +#define MOV_OBJECT_JPEG2000 0x6E // Visual ISO/IEC 15444-1 (JPEG 2000) +#define MOV_OBJECT_VC1 0xA3 // SMPTE VC-1 Video +#define MOV_OBJECT_DIRAC 0xA4 // Dirac Video Coder +#define MOV_OBJECT_AC3 0xA5 // AC-3 +#define MOV_OBJECT_EAC3 0xA6 // Enhanced AC-3 +#define MOV_OBJECT_G719 0xA8 // ITU G.719 Audio +#define MOV_OBJECT_DTS 0xA9 // Core Substream +#define MOV_OBJECT_OPUS 0xAD // Opus audio https://opus-codec.org/docs/opus_in_isobmff.html +#define MOV_OBJECT_VP9 0xB1 // VP9 Video +#define MOV_OBJECT_FLAC 0xC1 // nonstandard from FFMPEG +#define MOV_OBJECT_VP8 0xC2 // nonstandard +#define MOV_OBJECT_H266 0xFC // ITU-T Recommendation H.266 +#define MOV_OBJECT_G711a 0xFD // ITU G.711 alaw +#define MOV_OBJECT_G711u 0xFE // ITU G.711 ulaw +#define MOV_OBJECT_AV1 0xFF // AV1: https://aomediacodec.github.io/av1-isobmff + +#define MOV_OBJECT_NONE 0x00 // unknown object id +#define MOV_OBJECT_AVC MOV_OBJECT_H264 +#define MOV_OBJECT_HEVC MOV_OBJECT_H265 +#define MOV_OBJECT_VVC MOV_OBJECT_H266 +#define MOV_OBJECT_ALAW MOV_OBJECT_G711a +#define MOV_OBJECT_ULAW MOV_OBJECT_G711u + +/// MOV flags +#define MOV_FLAG_FASTSTART 0x00000001 +#define MOV_FLAG_SEGMENT 0x00000002 // fmp4_writer only + +/// MOV av stream flag +#define MOV_AV_FLAG_KEYFREAME 0x0001 +#define MOV_AV_FLAG_SEGMENT_FORCE 0x8000 // exclude with MOV_AV_FLAG_SEGMENT_DISABLE, fmp4_writer only +#define MOV_AV_FLAG_SEGMENT_DISABLE 0x4000 // exclude with MOV_AV_FLAG_SEGMENT_FORCE, fmp4_writer only + +#endif /* !_mov_format_h_ */ diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/include/mov-memory-buffer.h b/src/big/mpp/middleware/src/mp4_format/src/libmov/include/mov-memory-buffer.h new file mode 100644 index 000000000..292791e12 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/include/mov-memory-buffer.h @@ -0,0 +1,89 @@ +#ifndef _mov_memory_buffer_h_ +#define _mov_memory_buffer_h_ + +#include "mov-buffer.h" +#include +#include +#include +#include +#include + +struct mov_memory_buffer_t +{ + uint8_t* ptr; + uint64_t bytes; + + uint64_t off; + uint64_t capacity; + uint64_t maxsize; // limit +}; + +static int mov_memory_read(void* param, void* data, uint64_t bytes) +{ + struct mov_memory_buffer_t* ptr; + ptr = (struct mov_memory_buffer_t*)param; + if (ptr->off + bytes > ptr->bytes) + return -E2BIG; + + memcpy(data, ptr->ptr + ptr->off, (size_t)bytes); + ptr->off += bytes; + return 0; +} + +static int mov_memory_write(void* param, const void* data, uint64_t bytes) +{ + void* p; + uint64_t capacity; + struct mov_memory_buffer_t* ptr; + ptr = (struct mov_memory_buffer_t*)param; + if (ptr->off + bytes > ptr->maxsize) + return -E2BIG; + + if (ptr->off + bytes > ptr->capacity) + { + capacity = ptr->off + bytes + 1 * 1024 * 1024; + capacity = capacity > ptr->maxsize ? ptr->maxsize : capacity; + p = realloc(ptr->ptr, capacity); + if (NULL == p) + return -ENOMEM; + ptr->ptr = (uint8_t*)p; + ptr->capacity = capacity; + } + + memcpy(ptr->ptr + ptr->off, data, bytes); + ptr->off += bytes; + + if (ptr->off > ptr->bytes) + ptr->bytes = ptr->off; + return 0; +} + +static int mov_memory_seek(void* param, int64_t offset) +{ + struct mov_memory_buffer_t* ptr; + ptr = (struct mov_memory_buffer_t*)param; + if ((uint64_t)(offset >= 0 ? offset : -offset) > ptr->capacity) + return -E2BIG; + ptr->off = offset >= 0 ? offset : (ptr->capacity+offset); + return 0; +} + +static int64_t mov_memory_tell(void* param) +{ + struct mov_memory_buffer_t* ptr; + ptr = (struct mov_memory_buffer_t*)param; + return (int64_t)ptr->off; +} + +static inline const struct mov_buffer_t* mov_memory_buffer(void) +{ + static struct mov_buffer_t s_io = { + mov_memory_read, + mov_memory_write, + mov_memory_seek, + mov_memory_tell, + }; + return &s_io; +} + +#endif /* !_mov_memory_buffer_h_ */ diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/include/mov-reader.h b/src/big/mpp/middleware/src/mp4_format/src/libmov/include/mov-reader.h new file mode 100644 index 000000000..be5c23ba9 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/include/mov-reader.h @@ -0,0 +1,60 @@ +#ifndef _mov_reader_h_ +#define _mov_reader_h_ + +#include +#include +#include "mov-buffer.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct mov_reader_t mov_reader_t; + +mov_reader_t* mov_reader_create(const struct mov_buffer_t* buffer, void* param); +void mov_reader_destroy(mov_reader_t* mov); + +struct mov_reader_trackinfo_t +{ + /// @param[in] object: MOV_OBJECT_H264/MOV_OBJECT_AAC, see more @mov-format.h + void (*onvideo)(void* param, uint32_t track, uint32_t time_scale, uint8_t object, int width, int height, const void* extra, size_t bytes); + void (*onaudio)(void* param, uint32_t track, uint32_t time_scale, uint8_t object, int channel_count, int bit_per_sample, int sample_rate, const void* extra, size_t bytes); + void (*onsubtitle)(void* param, uint32_t track, uint8_t object, const void* extra, size_t bytes); +}; + +/// @return 0-OK, other-error +int mov_reader_getinfo(mov_reader_t* mov, uint32_t index, struct mov_reader_trackinfo_t *ontrack, void* param); + +uint64_t mov_reader_getduration(mov_reader_t* mov); + +uint32_t mov_reader_objectid(mov_reader_t* mov, uint32_t track_id); + +uint32_t mov_reader_gettrackcount(mov_reader_t *mov); + +void mov_reader_video_entry_info(mov_reader_t *mov, uint8_t *obj_id, uint8_t *extra_data, int *extra_data_size); + +/// audio: AAC raw data, don't include ADTS/AudioSpecificConfig +/// video: 4-byte data length(don't include self length) + H.264 NALU(don't include 0x00000001) +/// @param[in] flags MOV_AV_FLAG_xxx, such as: MOV_AV_FLAG_KEYFREAME +typedef void (*mov_reader_onread)(void* param, uint32_t track, const void* buffer, size_t bytes, int64_t pts, int64_t dts, int flags); +/// @return 1-read one frame, 0-EOF, <0-error +int mov_reader_read(mov_reader_t* mov, void* buffer, size_t bytes, mov_reader_onread onread, void* param); + +/// audio: AAC raw data, don't include ADTS/AudioSpecificConfig +/// video: 4-byte data length(don't include self length) + H.264 NALU(don't include 0x00000001) +/// @param[in] flags MOV_AV_FLAG_xxx, such as: MOV_AV_FLAG_KEYFREAME +/// @return NULL-error, other-user alloc buffer +typedef void* (*mov_reader_onread2)(void* param, uint32_t track, size_t bytes, int64_t pts, int64_t dts, int flags); +/// same as mov_reader_read + user alloc buffer +/// NOTICE: user should free buffer on return error!!! +/// @return 1-read one frame, 0-EOF, <0-error +int mov_reader_read2(mov_reader_t* mov, mov_reader_onread2 onread, void* param); + +/// @param[in,out] timestamp input seek timestamp, output seek location timestamp +/// @return 0-ok, other-error +int mov_reader_seek(mov_reader_t* mov, int64_t* timestamp); + +#ifdef __cplusplus +} +#endif +#endif /* !_mov_reader_h_*/ diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/include/mov-udta.h b/src/big/mpp/middleware/src/mp4_format/src/libmov/include/mov-udta.h new file mode 100644 index 000000000..1e21c2da2 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/include/mov-udta.h @@ -0,0 +1,46 @@ +#ifndef _mov_udta_h_ +#define _mov_udta_h_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +// https://developer.apple.com/library/archive/documentation/QuickTime/QTFF/Metadata/Metadata.html + +struct mov_udta_meta_t +{ + //char* title; + //char* artist; + //char* album_artist; + //char* album; + //char* date; + //char* comment; + //char* genre; + //char* copyright; + //char* lyrics; + //char* description; + //char* synopsis; + //char* show; + //char* episode_id; + //char* network; + //char* keywords; + //char* season_num; + //char* media_type; + //char* hd_video; + //char* gapless_playback; + //char* compilation; + + uint8_t* cover; // cover binary data, jpeg/png only + int cover_size; // cover binnary data length in byte +}; + +int mov_udta_meta_write(const struct mov_udta_meta_t* meta, void* data, int bytes); + +#ifdef __cplusplus +} +#endif +#endif /* !_mov_udta_h_ */ diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/include/mov-writer.h b/src/big/mpp/middleware/src/mp4_format/src/libmov/include/mov-writer.h new file mode 100644 index 000000000..96554fbe2 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/include/mov-writer.h @@ -0,0 +1,40 @@ +#ifndef _mov_writer_h_ +#define _mov_writer_h_ + +#include +#include +#include "mov-buffer.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct mov_writer_t mov_writer_t; + +/// @param[in] flags mov flags, such as: MOV_FLAG_FASTSTART, see more @mov-format.h +mov_writer_t* mov_writer_create(const struct mov_buffer_t* buffer, void* param, int flags); +void mov_writer_destroy(mov_writer_t* mov); + +/// @param[in] object MPEG-4 systems ObjectTypeIndication such as: MOV_OBJECT_H264, see more @mov-format.h +/// @param[in] extra_data AudioSpecificConfig/AVCDecoderConfigurationRecord/HEVCDecoderConfigurationRecord +/// @return >=0-track, <0-error +int mov_writer_add_audio(mov_writer_t* mov, uint8_t object, int channel_count, int bits_per_sample, int sample_rate, const void* extra_data, size_t extra_data_size); +int mov_writer_add_video(mov_writer_t* mov, uint8_t object, int width, int height, const void* extra_data, size_t extra_data_size); +int mov_writer_add_subtitle(mov_writer_t* mov, uint8_t object, const void* extra_data, size_t extra_data_size); + +/// Write audio/video stream +/// raw AAC data, don't include ADTS/AudioSpecificConfig +/// H.264/H.265 MP4 format, replace start code(0x00000001) with NALU size +/// @param[in] track return by mov_writer_add_audio/mov_writer_add_video +/// @param[in] data audio/video frame +/// @param[in] bytes buffer size +/// @param[in] pts timestamp in millisecond +/// @param[in] dts timestamp in millisecond +/// @param[in] flags MOV_AV_FLAG_XXX, such as: MOV_AV_FLAG_KEYFREAME, see more @mov-format.h +/// @return 0-ok, other-error +int mov_writer_write(mov_writer_t* mov, int track, const void* data, size_t bytes, int64_t pts, int64_t dts, int flags); + +#ifdef __cplusplus +} +#endif +#endif /* !_mov_writer_h_ */ diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/include/mp4-writer.h b/src/big/mpp/middleware/src/mp4_format/src/libmov/include/mp4-writer.h new file mode 100644 index 000000000..e03742389 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/include/mp4-writer.h @@ -0,0 +1,131 @@ +#ifndef _mp4_writer_h_ +#define _mp4_writer_h_ + +#include +#include +#include +#include +#include "mov-buffer.h" +#include "mov-format.h" +#include "mov-writer.h" +#include "fmp4-writer.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct mp4_writer_t +{ + mov_writer_t *mov; + fmp4_writer_t* fmp4; +}; + +/// @param[in] flags mov flags, such as: MOV_FLAG_SEGMENT, see more @mov-format.h +static inline struct mp4_writer_t* mp4_writer_create(int is_fmp4, const struct mov_buffer_t* buffer, void* param, int flags) +{ + struct mp4_writer_t* mp4; + mp4 = (struct mp4_writer_t*)calloc(1, sizeof(struct mp4_writer_t)); + if (!mp4) return NULL; + + if (!is_fmp4) { + mp4->mov = mov_writer_create(buffer, param, flags); + } else { + mp4->fmp4 = fmp4_writer_create(buffer, param, flags); + } + return mp4; +} + +static inline void mp4_writer_destroy(struct mp4_writer_t* mp4) +{ + assert((mp4->fmp4 && !mp4->mov) || (!mp4->fmp4 && mp4->mov)); + if (mp4->mov) { + mov_writer_destroy(mp4->mov); + } else { + fmp4_writer_destroy(mp4->fmp4); + } + free(mp4); +} + +/// @param[in] object MPEG-4 systems ObjectTypeIndication such as: MOV_OBJECT_AAC, see more @mov-format.h +/// @param[in] extra_data AudioSpecificConfig +/// @return >=0-track, <0-error +static inline int mp4_writer_add_audio(struct mp4_writer_t* mp4, uint8_t object, int channel_count, int bits_per_sample, int sample_rate, const void* extra_data, size_t extra_data_size) +{ + assert((mp4->fmp4 && !mp4->mov) || (!mp4->fmp4 && mp4->mov)); + if (mp4->mov) { + return mov_writer_add_audio(mp4->mov, object, channel_count, bits_per_sample, sample_rate, extra_data, extra_data_size); + } else { + return fmp4_writer_add_audio(mp4->fmp4, object, channel_count, bits_per_sample, sample_rate, extra_data, extra_data_size); + } +} + +/// @param[in] object MPEG-4 systems ObjectTypeIndication such as: MOV_OBJECT_H264, see more @mov-format.h +/// @param[in] extra_data AVCDecoderConfigurationRecord/HEVCDecoderConfigurationRecord +/// @return >=0-track, <0-error +static inline int mp4_writer_add_video(struct mp4_writer_t* mp4, uint8_t object, int width, int height, const void* extra_data, size_t extra_data_size) +{ + assert((mp4->fmp4 && !mp4->mov) || (!mp4->fmp4 && mp4->mov)); + if (mp4->mov) { + return mov_writer_add_video(mp4->mov, object, width, height, extra_data, extra_data_size); + } else { + return fmp4_writer_add_video(mp4->fmp4, object, width, height, extra_data, extra_data_size); + } +} + +static inline int mp4_writer_add_subtitle(struct mp4_writer_t* mp4, uint8_t object, const void* extra_data, size_t extra_data_size) +{ + assert((mp4->fmp4 && !mp4->mov) || (!mp4->fmp4 && mp4->mov)); + if (mp4->mov) { + return mov_writer_add_subtitle(mp4->mov, object, extra_data, extra_data_size); + } else { + return fmp4_writer_add_subtitle(mp4->fmp4, object, extra_data, extra_data_size); + } +} + +/// Write audio/video stream +/// raw AAC data, don't include ADTS/AudioSpecificConfig +/// H.264/H.265 MP4 format, replace start code(0x00000001) with NALU size +/// @param[in] track return by mov_writer_add_audio/mov_writer_add_video +/// @param[in] data audio/video frame +/// @param[in] bytes buffer size +/// @param[in] pts timestamp in millisecond +/// @param[in] dts timestamp in millisecond +/// @param[in] flags MOV_AV_FLAG_XXX, such as: MOV_AV_FLAG_KEYFREAME, see more @mov-format.h +/// @return 0-ok, other-error +static inline int mp4_writer_write(struct mp4_writer_t* mp4, int track, const void* data, size_t bytes, int64_t pts, int64_t dts, int flags) +{ + assert((mp4->fmp4 && !mp4->mov) || (!mp4->fmp4 && mp4->mov)); + if (mp4->mov) { + return mov_writer_write(mp4->mov, track, data, bytes, pts, dts, flags); + } else { + return fmp4_writer_write(mp4->fmp4, track, data, bytes, pts, dts, flags); + } +} + +///////////////////// The following interfaces are only applicable to fmp4 /////////////////////////////// + +/// Save data and open next segment +/// @return 0-ok, other-error +static inline int mp4_writer_save_segment(struct mp4_writer_t* mp4) +{ + assert((mp4->fmp4 && !mp4->mov) || (!mp4->fmp4 && mp4->mov)); + if (mp4->fmp4) + return fmp4_writer_save_segment(mp4->fmp4); + return 0; +} + +/// Get init segment data(write FTYP, MOOV only) +/// WARNING: it caller duty to switch file/buffer context with fmp4_writer_write +/// @return 0-ok, other-error +static inline int mp4_writer_init_segment(struct mp4_writer_t* mp4) +{ + assert((mp4->fmp4 && !mp4->mov) || (!mp4->fmp4 && mp4->mov)); + if (mp4->fmp4) + return fmp4_writer_init_segment(mp4->fmp4); + return 0; +} + +#ifdef __cplusplus +} +#endif +#endif /* !_mp4_writer_h_ */ diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/source/fmp4-reader.c b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/fmp4-reader.c new file mode 100644 index 000000000..f11b6cb29 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/fmp4-reader.c @@ -0,0 +1,119 @@ +#include "mov-internal.h" +#include +#include + +#define DIFF(a, b) ((a) > (b) ? ((a) - (b)) : ((b) - (a))) + +static int mov_fragment_seek_get_duration(struct mov_t* mov) +{ + int i; + struct mov_track_t* track; + track = mov->track_count > 0 ? &mov->tracks[0] : NULL; + if (track && track->frag_capacity < track->frag_count && track->mdhd.timescale) + { + mov_buffer_seek(&mov->io, track->frags[track->frag_count - 1].offset); + mov_reader_root(mov); // moof + + track->mdhd.duration = track->samples[track->sample_count - 1].dts - track->samples[0].dts; + mov->mvhd.duration = track->mdhd.duration * mov->mvhd.timescale / track->mdhd.timescale; + + // clear samples and seek to the first moof + for (i = 0; i < mov->track_count; i++) + { + mov->tracks[i].sample_count = 0; + mov->tracks[i].sample_offset = 0; + } + track->frag_capacity = 0; + } + + return 0; +} + +int mov_fragment_seek_read_mfra(struct mov_t* mov) +{ + uint64_t pos; + pos = mov_buffer_tell(&mov->io); // for fallback + mov_buffer_seek(&mov->io, -16); + mov_reader_root(mov); // mfro + if (mov->mfro > 0) + { + mov_buffer_seek(&mov->io, -((int64_t)mov->mfro)); + mov_reader_root(mov); // mfra + mov_fragment_seek_get_duration(mov); // for get fmp4 duration + } + mov_buffer_seek(&mov->io, pos); + return mov_buffer_error(&mov->io); +} + +int mov_fragment_seek(struct mov_t* mov, int64_t* timestamp) +{ + int i; + uint64_t clock; + size_t idx, start, end; + struct mov_track_t* track; + struct mov_fragment_t* frag, *prev, *next; + + track = mov->track_count > 0 ? &mov->tracks[0] : NULL; + if (!track || track->frag_count < 1) + return -1; + + idx = start = 0; + end = track->frag_count; + assert(track->frag_count > 0); + clock = (uint64_t)(*timestamp) * track->mdhd.timescale / 1000; // mvhd timescale + + while (start < end) + { + idx = (start + end) / 2; + frag = &track->frags[idx]; + + if (frag->time > clock) + end = idx; + else if (frag->time < clock) + start = idx + 1; + else + break; + } + + frag = &track->frags[idx]; + prev = &track->frags[idx > 0 ? idx - 1 : idx]; + next = &track->frags[idx + 1 < track->frag_count ? idx + 1 : idx]; + if (DIFF(prev->time, clock) < DIFF(frag->time, clock)) + frag = prev; + if (DIFF(next->time, clock) < DIFF(frag->time, clock)) + frag = next; + + *timestamp = frag->time * 1000 / track->mdhd.timescale; + + // clear samples and seek + for (i = 0; i < mov->track_count; i++) + { + mov->tracks[i].sample_count = 0; + mov->tracks[i].sample_offset = 0; + } + track->frag_capacity = (uint32_t)idx; + return 0; +} + +int mov_fragment_read_next_moof(struct mov_t* mov) +{ + int i; + struct mov_track_t* track; + + // clear moof samples + for (i = 0; i < mov->track_count; i++) + { + mov->tracks[i].sample_count = 0; + mov->tracks[i].sample_offset = 0; + } + + track = mov->track_count > 0 ? &mov->tracks[0] : NULL; + if (track && track->frag_capacity < track->frag_count) + { + mov_buffer_seek(&mov->io, track->frags[track->frag_capacity++].offset); + mov_reader_root(mov); // moof + return 0; + } + + return 1; // eof +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/source/fmp4-writer.c b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/fmp4-writer.c new file mode 100644 index 000000000..b8a10b56c --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/fmp4-writer.c @@ -0,0 +1,545 @@ +#include "fmp4-writer.h" +#include "mov-internal.h" +#include +#include +#include +#include +#include + +struct fmp4_writer_t +{ + struct mov_t mov; + size_t mdat_size; + int has_moov; + + uint32_t frag_interleave; + uint32_t fragment_id; // start from 1 + uint32_t sn; // sample sn +}; + +static int fmp4_write_app(struct mov_t* mov) +{ + mov_buffer_w32(&mov->io, 8 + strlen(MOV_APP)); /* size */ + mov_buffer_write(&mov->io, "free", 4); + mov_buffer_write(&mov->io, MOV_APP, strlen(MOV_APP)); + return 0; +} + +static size_t fmp4_write_mvex(struct mov_t* mov) +{ + int i; + size_t size; + uint64_t offset; + + size = 8 /* Box */; + offset = mov_buffer_tell(&mov->io); + mov_buffer_w32(&mov->io, 0); /* size */ + mov_buffer_write(&mov->io, "mvex", 4); + + size += mov_write_mehd(mov); + for (i = 0; i < mov->track_count; i++) + { + mov->track = mov->tracks + i; + size += mov_write_trex(mov); + } + //size += mov_write_leva(mov); + + mov_write_size(mov, offset, size); /* update size */ + return size; +} + +static size_t fmp4_write_traf(struct mov_t* mov, uint32_t moof) +{ + uint32_t i, start; + size_t size; + uint64_t offset; + struct mov_track_t* track; + + size = 8 /* Box */; + offset = mov_buffer_tell(&mov->io); + mov_buffer_w32(&mov->io, 0); /* size */ + mov_buffer_write(&mov->io, "traf", 4); + + track = mov->track; + track->tfhd.flags = MOV_TFHD_FLAG_DEFAULT_FLAGS /*| MOV_TFHD_FLAG_BASE_DATA_OFFSET*/; + track->tfhd.flags |= MOV_TFHD_FLAG_SAMPLE_DESCRIPTION_INDEX; + // ISO/IEC 23009-1:2014(E) 6.3.4.2 General format type (p93) + // The 'moof' boxes shall use movie-fragment relative addressing for media data that + // does not use external data references, the flag 'default-base-is-moof' shall be set, + // and data-offset shall be used, i.e. base-data-offset-present shall not be used. + //if (mov->flags & MOV_FLAG_SEGMENT) + { + //track->tfhd.flags &= ~MOV_TFHD_FLAG_BASE_DATA_OFFSET; + track->tfhd.flags |= MOV_TFHD_FLAG_DEFAULT_BASE_IS_MOOF; + } + track->tfhd.base_data_offset = mov->moof_offset; + track->tfhd.sample_description_index = 1; + track->tfhd.default_sample_flags = MOV_AUDIO == track->handler_type ? MOV_TREX_FLAG_SAMPLE_DEPENDS_ON_I_PICTURE : (MOV_TREX_FLAG_SAMPLE_IS_NO_SYNC_SAMPLE| MOV_TREX_FLAG_SAMPLE_DEPENDS_ON_NOT_I_PICTURE); + if (track->sample_count > 0) + { + track->tfhd.flags |= MOV_TFHD_FLAG_DEFAULT_DURATION | MOV_TFHD_FLAG_DEFAULT_SIZE; + track->tfhd.default_sample_duration = track->sample_count > 1 ? (uint32_t)(track->samples[1].dts - track->samples[0].dts) : (uint32_t)track->turn_last_duration; + track->tfhd.default_sample_size = track->samples[0].bytes; + } + else + { + track->tfhd.flags |= MOV_TFHD_FLAG_DURATION_IS_EMPTY; + track->tfhd.default_sample_duration = 0; // not set + track->tfhd.default_sample_size = 0; // not set + } + + size += mov_write_tfhd(mov); + // ISO/IEC 23009-1:2014(E) 6.3.4.2 General format type (p93) + // Each 'traf' box shall contain a 'tfdt' box. + size += mov_write_tfdt(mov); + + for (start = 0, i = 1; i < track->sample_count; i++) + { + if (track->samples[i - 1].offset + track->samples[i - 1].bytes != track->samples[i].offset) + { + size += mov_write_trun(mov, start, i-start, moof); + start = i; + } + } + size += mov_write_trun(mov, start, i-start, moof); + + mov_write_size(mov, offset, size); /* update size */ + return size; +} + +static size_t fmp4_write_moof(struct mov_t* mov, uint32_t fragment, uint32_t moof) +{ + int i; + size_t size, j; + uint64_t offset; + uint64_t n; + + size = 8 /* Box */; + offset = mov_buffer_tell(&mov->io); + mov_buffer_w32(&mov->io, 0); /* size */ + mov_buffer_write(&mov->io, "moof", 4); + + size += mov_write_mfhd(mov, fragment); + + n = 0; + for (i = 0; i < mov->track_count; i++) + { + mov->track = mov->tracks + i; + + // rewrite offset, write only one trun + // 2017/10/17 Dale Curtis SHA-1: a5fd8aa45b11c10613e6e576033a6b5a16b9cbb9 (libavformat/mov.c) + for (j = 0; j < mov->track->sample_count; j++) + { + mov->track->samples[j].offset = n; + n += mov->track->samples[j].bytes; + } + + if (mov->track->sample_count > 0) + size += fmp4_write_traf(mov, moof); + } + + mov_write_size(mov, offset, size); /* update size */ + return size; +} + +static size_t fmp4_write_moov(struct mov_t* mov) +{ + int i; + size_t size; + uint32_t count; + uint64_t offset; + + size = 8 /* Box */; + offset = mov_buffer_tell(&mov->io); + mov_buffer_w32(&mov->io, 0); /* size */ + mov_buffer_write(&mov->io, "moov", 4); + + size += mov_write_mvhd(mov); +// size += fmp4_write_iods(mov); + for (i = 0; i < mov->track_count; i++) + { + mov->track = mov->tracks + i; + count = mov->track->sample_count; + mov->track->sample_count = 0; + size += mov_write_trak(mov); + mov->track->sample_count = count; // restore sample count + } + + size += fmp4_write_mvex(mov); + size += mov_write_udta(mov); + mov_write_size(mov, offset, size); /* update size */ + return size; +} + +static size_t fmp4_write_sidx(struct mov_t* mov) +{ + int i; + for (i = 0; i < mov->track_count; i++) + { + mov->track = mov->tracks + i; + mov_write_sidx(mov, 52 * (uint64_t)(mov->track_count - i - 1)); /* first_offset */ + } + + return 52 * mov->track_count; +} + +static int fmp4_write_mfra(struct mov_t* mov) +{ + int i; + uint64_t mfra_offset; + uint64_t mfro_offset; + + // mfra + mfra_offset = mov_buffer_tell(&mov->io); + mov_buffer_w32(&mov->io, 0); /* size */ + mov_buffer_write(&mov->io, "mfra", 4); + + // tfra + for (i = 0; i < mov->track_count; i++) + { + mov->track = mov->tracks + i; + mov_write_tfra(mov); + } + + // mfro + mfro_offset = mov_buffer_tell(&mov->io); + mov_buffer_w32(&mov->io, 16); /* size */ + mov_buffer_write(&mov->io, "mfro", 4); + mov_buffer_w32(&mov->io, 0); /* version & flags */ + mov_buffer_w32(&mov->io, (uint32_t)(mfro_offset - mfra_offset + 16)); + + mov_write_size(mov, mfra_offset, (size_t)(mfro_offset - mfra_offset + 16)); + return (int)(mfro_offset - mfra_offset + 16); +} + +static int fmp4_add_fragment_entry(struct mov_track_t* track, uint64_t time, uint64_t offset) +{ + if (track->frag_count >= track->frag_capacity) + { + void* p = realloc(track->frags, sizeof(struct mov_fragment_t) * (track->frag_capacity + 64)); + if (!p) return -ENOMEM; + track->frags = p; + track->frag_capacity += 64; + } + + track->frags[track->frag_count].time = time; + track->frags[track->frag_count].offset = offset; + ++track->frag_count; + return 0; +} + +static int fmp4_write_fragment(struct fmp4_writer_t* writer) +{ + int i; + size_t n; + size_t refsize; + struct mov_t* mov; + mov = &writer->mov; + + if (writer->mdat_size < 1) + return 0; // empty + + // write moov + if (mov->flags & MOV_FLAG_SEGMENT) + { + // write stype + mov_write_styp(mov); + + // ISO/IEC 23009-1:2014(E) 6.3.4.2 General format type (p93) + // Each Media Segment may contain one or more 'sidx' boxes. + // If present, the first 'sidx' box shall be placed before any 'moof' box + // and the first Segment Index box shall document the entire Segment. + fmp4_write_sidx(mov); + } + else if (!writer->has_moov) + { + mov_write_ftyp(mov); + fmp4_write_app(mov); + fmp4_write_moov(mov); + writer->has_moov = 1; + } + + // moof + mov->moof_offset = mov_buffer_tell(&mov->io); + refsize = fmp4_write_moof(mov, ++writer->fragment_id, 0); // start from 1 + // rewrite moof with trun data offset + mov_buffer_seek(&mov->io, mov->moof_offset); + fmp4_write_moof(mov, writer->fragment_id, (uint32_t)refsize+8); + refsize += writer->mdat_size + 8/*mdat box*/; + + // add mfra entry + for (i = 0; i < mov->track_count; i++) + { + mov->track = mov->tracks + i; + if (mov->track->sample_count > 0 && 0 == (mov->flags & MOV_FLAG_SEGMENT)) + fmp4_add_fragment_entry(mov->track, mov->track->samples[0].dts, mov->moof_offset); + + // hack: write sidx referenced_size + if (mov->flags & MOV_FLAG_SEGMENT) + mov_write_size(mov, mov->moof_offset - 52 * (uint64_t)(mov->track_count - i) + 40, (0 << 31) | (refsize & 0x7fffffff)); + + mov->track->offset = 0; // reset + } + + // mdat + if (writer->mdat_size + 8 <= UINT32_MAX) + { + mov_buffer_w32(&mov->io, (uint32_t)writer->mdat_size + 8); /* size */ + mov_buffer_write(&mov->io, "mdat", 4); + } + else + { + mov_buffer_w32(&mov->io, 1); + mov_buffer_write(&mov->io, "mdat", 4); + mov_buffer_w64(&mov->io, writer->mdat_size + 16); + } + + // interleave write samples + n = 0; + while(n < writer->mdat_size) + { + for (i = 0; i < mov->track_count; i++) + { + mov->track = mov->tracks + i; + while (mov->track->offset < mov->track->sample_count && n == mov->track->samples[mov->track->offset].offset) + { + mov_buffer_write(&mov->io, mov->track->samples[mov->track->offset].data, mov->track->samples[mov->track->offset].bytes); + free(mov->track->samples[mov->track->offset].data); // free av packet memory + n += mov->track->samples[mov->track->offset].bytes; + ++mov->track->offset; + } + } + } + + // clear track samples(don't free samples memory) + for (i = 0; i < mov->track_count; i++) + { + mov->tracks[i].sample_count = 0; + mov->tracks[i].offset = 0; + } + writer->mdat_size = 0; + + return mov_buffer_error(&mov->io); +} + +static int fmp4_writer_init(struct mov_t* mov) +{ + if (mov->flags & MOV_FLAG_SEGMENT) + { + mov->ftyp.major_brand = MOV_BRAND_MSDH; + mov->ftyp.minor_version = 0; + mov->ftyp.brands_count = 6; + mov->ftyp.compatible_brands[0] = MOV_BRAND_ISOM; + mov->ftyp.compatible_brands[1] = MOV_BRAND_MP42; + mov->ftyp.compatible_brands[2] = MOV_BRAND_MSDH; + mov->ftyp.compatible_brands[3] = MOV_BRAND_MSIX; + mov->ftyp.compatible_brands[4] = MOV_BRAND_ISO5; // default�\base�\is�\moof flag + mov->ftyp.compatible_brands[5] = MOV_BRAND_ISO6; // styp + mov->header = 0; + } + else + { + mov->ftyp.major_brand = MOV_BRAND_ISOM; + mov->ftyp.minor_version = 1; + mov->ftyp.brands_count = 5; + mov->ftyp.compatible_brands[0] = MOV_BRAND_ISOM; + mov->ftyp.compatible_brands[1] = MOV_BRAND_MP42; + mov->ftyp.compatible_brands[2] = MOV_BRAND_AVC1; + mov->ftyp.compatible_brands[3] = MOV_BRAND_DASH; + mov->ftyp.compatible_brands[4] = MOV_BRAND_ISO5; // default�\base�\is�\moof flag + mov->header = 0; + } + return 0; +} + +struct fmp4_writer_t* fmp4_writer_create(const struct mov_buffer_t *buffer, void* param, int flags) +{ + struct mov_t* mov; + struct fmp4_writer_t* writer; + writer = (struct fmp4_writer_t*)calloc(1, sizeof(struct fmp4_writer_t)); + if (NULL == writer) + return NULL; + + writer->frag_interleave = 5; + + mov = &writer->mov; + mov->flags = flags; + mov->mvhd.next_track_ID = 1; + mov->mvhd.creation_time = time(NULL) + 0x7C25B080; // 1970 based -> 1904 based; + mov->mvhd.modification_time = mov->mvhd.creation_time; + mov->mvhd.timescale = 1000; + mov->mvhd.duration = 0; // placeholder + fmp4_writer_init(mov); + + mov->io.param = param; + memcpy(&mov->io.io, buffer, sizeof(mov->io.io)); + return writer; +} + +void fmp4_writer_destroy(struct fmp4_writer_t* writer) +{ + int i; + struct mov_t* mov; + mov = &writer->mov; + + fmp4_writer_save_segment(writer); + + // write mfra + if (0 == (mov->flags & MOV_FLAG_SEGMENT)) + { + fmp4_write_mfra(mov); + for (i = 0; i < mov->track_count; i++) + mov->tracks[i].frag_count = 0; // don't free frags memory + } + + // mov_buffer_error(&mov->io); + + for (i = 0; i < mov->track_count; i++) + mov_free_track(mov->tracks + i); + if (mov->tracks) + free(mov->tracks); + free(writer); +} + +int fmp4_writer_write(struct fmp4_writer_t* writer, int idx, const void* data, size_t bytes, int64_t pts, int64_t dts, int flags) +{ + int64_t duration; + struct mov_track_t* track; + struct mov_sample_t* sample; + + if (idx < 0 || idx >= (int)writer->mov.track_count) + return -ENOENT; + + track = &writer->mov.tracks[idx]; + + duration = dts > track->last_dts && INT64_MIN != track->last_dts ? dts - track->last_dts : 0; +#if 1 + track->turn_last_duration = duration; +#else + track->turn_last_duration = track->turn_last_duration > 0 ? track->turn_last_duration * 7 / 8 + duration / 8 : duration; +#endif + + // 1. force segment or + // 2. video key frame + if (0 == (flags & MOV_AV_FLAG_SEGMENT_DISABLE) && (0 != (flags & MOV_AV_FLAG_SEGMENT_FORCE) || (MOV_VIDEO == track->handler_type && (flags & MOV_AV_FLAG_KEYFREAME))) ) + fmp4_write_fragment(writer); // fragment per video keyframe + + if (track->sample_count + 1 >= track->sample_offset) + { + void* ptr = realloc(track->samples, sizeof(struct mov_sample_t) * (track->sample_offset + 1024)); + if (NULL == ptr) return -ENOMEM; + track->samples = (struct mov_sample_t*)ptr; + track->sample_offset += 1024; + } + + pts = pts * track->mdhd.timescale / 1000; + dts = dts * track->mdhd.timescale / 1000; + + sample = &track->samples[track->sample_count]; + sample->sample_description_index = 1; + sample->bytes = (uint32_t)bytes; + sample->flags = flags; + sample->pts = pts; + sample->dts = dts; + sample->offset = writer->mdat_size; + + sample->data = malloc(bytes); + if (NULL == sample->data) + return -ENOMEM; + memcpy(sample->data, data, bytes); + + if (INT64_MIN == track->start_dts) + track->start_dts = sample->dts; + writer->mdat_size += bytes; // update media data size + track->sample_count += 1; + track->last_dts = sample->dts; + return mov_buffer_error(&writer->mov.io); +} + +int fmp4_writer_add_audio(struct fmp4_writer_t* writer, uint8_t object, int channel_count, int bits_per_sample, int sample_rate, const void* extra_data, size_t extra_data_size) +{ + struct mov_t* mov; + struct mov_track_t* track; + + mov = &writer->mov; + track = mov_add_track(mov); + if (NULL == track) + return -ENOMEM; + + if (0 != mov_add_audio(track, &mov->mvhd, 1000, object, channel_count, bits_per_sample, sample_rate, extra_data, extra_data_size)) + return -ENOMEM; + + mov->mvhd.next_track_ID++; + return mov->track_count++; +} + +int fmp4_writer_add_video(struct fmp4_writer_t* writer, uint8_t object, int width, int height, const void* extra_data, size_t extra_data_size) +{ + struct mov_t* mov; + struct mov_track_t* track; + + mov = &writer->mov; + track = mov_add_track(mov); + if (NULL == track) + return -ENOMEM; + + if (0 != mov_add_video(track, &mov->mvhd, 1000, object, width, height, extra_data, extra_data_size)) + return -ENOMEM; + + mov->mvhd.next_track_ID++; + return mov->track_count++; +} + +int fmp4_writer_add_subtitle(struct fmp4_writer_t* writer, uint8_t object, const void* extra_data, size_t extra_data_size) +{ + struct mov_t* mov; + struct mov_track_t* track; + + mov = &writer->mov; + track = mov_add_track(mov); + if (NULL == track) + return -ENOMEM; + + if (0 != mov_add_subtitle(track, &mov->mvhd, 1000, object, extra_data, extra_data_size)) + return -ENOMEM; + + mov->mvhd.next_track_ID++; + return mov->track_count++; +} + +int fmp4_writer_add_udta(fmp4_writer_t* writer, const void* data, size_t size) +{ + writer->mov.udta = data; + writer->mov.udta_size = size; + return 0; +} + +int fmp4_writer_save_segment(fmp4_writer_t* writer) +{ + //int i; + //struct mov_t* mov; + //mov = &writer->mov; + + // flush fragment + return fmp4_write_fragment(writer); + + //// write mfra + //if (0 == (mov->flags & MOV_FLAG_SEGMENT)) + //{ + // fmp4_write_mfra(mov); + // for (i = 0; i < mov->track_count; i++) + // mov->tracks[i].frag_count = 0; // don't free frags memory + //} + + //return mov_buffer_error(&mov->io); +} + +int fmp4_writer_init_segment(fmp4_writer_t* writer) +{ + struct mov_t* mov; + mov = &writer->mov; + mov_write_ftyp(mov); + fmp4_write_moov(mov); + writer->has_moov = 1; + return mov_buffer_error(&mov->io); +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-av1.c b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-av1.c new file mode 100644 index 000000000..f3d069cf7 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-av1.c @@ -0,0 +1,34 @@ +#include "mov-internal.h" +#include +#include +#include + +// https://aomediacodec.github.io/av1-isobmff +// extra data: AV1CodecConfigurationRecord + +int mov_read_av1c(struct mov_t* mov, const struct mov_box_t* box) +{ + struct mov_track_t* track = mov->track; + struct mov_sample_entry_t* entry = track->stsd.current; + if (entry->extra_data_size < box->size) + { + void* p = realloc(entry->extra_data, (size_t)box->size); + if (NULL == p) return -ENOMEM; + entry->extra_data = p; + } + + mov_buffer_read(&mov->io, entry->extra_data, box->size); + entry->extra_data_size = (int)box->size; + return mov_buffer_error(&mov->io); +} + +size_t mov_write_av1c(const struct mov_t* mov) +{ + const struct mov_track_t* track = mov->track; + const struct mov_sample_entry_t* entry = track->stsd.current; + mov_buffer_w32(&mov->io, entry->extra_data_size + 8); /* size */ + mov_buffer_write(&mov->io, "av1C", 4); + if (entry->extra_data_size > 0) + mov_buffer_write(&mov->io, entry->extra_data, entry->extra_data_size); + return entry->extra_data_size + 8; +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-avc1.c b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-avc1.c new file mode 100644 index 000000000..a5ac786c5 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-avc1.c @@ -0,0 +1,33 @@ +#include "mov-internal.h" +#include +#include +#include + +// extra_data: ISO/IEC 14496-15 AVCDecoderConfigurationRecord + +int mov_read_avcc(struct mov_t* mov, const struct mov_box_t* box) +{ + struct mov_track_t* track = mov->track; + struct mov_sample_entry_t* entry = track->stsd.current; + if (entry->extra_data_size < box->size) + { + void* p = realloc(entry->extra_data, (size_t)box->size); + if (NULL == p) return -ENOMEM; + entry->extra_data = p; + } + + mov_buffer_read(&mov->io, entry->extra_data, box->size); + entry->extra_data_size = (int)box->size; + return mov_buffer_error(&mov->io); +} + +size_t mov_write_avcc(const struct mov_t* mov) +{ + const struct mov_track_t* track = mov->track; + const struct mov_sample_entry_t* entry = track->stsd.current; + mov_buffer_w32(&mov->io, entry->extra_data_size + 8); /* size */ + mov_buffer_write(&mov->io, "avcC", 4); + if (entry->extra_data_size > 0) + mov_buffer_write(&mov->io, entry->extra_data, entry->extra_data_size); + return entry->extra_data_size + 8; +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-dinf.c b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-dinf.c new file mode 100644 index 000000000..6f462d85f --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-dinf.c @@ -0,0 +1,32 @@ +#include "mov-internal.h" + +size_t mov_write_dref(const struct mov_t* mov) +{ + mov_buffer_w32(&mov->io, 28); /* size */ + mov_buffer_write(&mov->io, "dref", 4); + mov_buffer_w32(&mov->io, 0); /* version & flags */ + mov_buffer_w32(&mov->io, 1); /* entry count */ + + mov_buffer_w32(&mov->io, 12); /* size */ + //FIXME add the alis and rsrc atom + mov_buffer_write(&mov->io, "url ", 4); + mov_buffer_w32(&mov->io, 1); /* version & flags */ + + return 28; +} + +size_t mov_write_dinf(const struct mov_t* mov) +{ + size_t size; + uint64_t offset; + + size = 8 /* Box */; + offset = mov_buffer_tell(&mov->io); + mov_buffer_w32(&mov->io, 0); /* size */ + mov_buffer_write(&mov->io, "dinf", 4); + + size += mov_write_dref(mov); + + mov_write_size(mov, offset, size); /* update size */ + return size; +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-elst.c b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-elst.c new file mode 100644 index 000000000..e7497ce04 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-elst.c @@ -0,0 +1,136 @@ +#include "mov-internal.h" +#include +#include +#include + +// 8.6.6 Edit List Box (p53) +int mov_read_elst(struct mov_t* mov, const struct mov_box_t* box) +{ + uint32_t i, entry_count; + uint32_t version; + struct mov_track_t* track = mov->track; + + version = mov_buffer_r8(&mov->io); /* version */ + mov_buffer_r24(&mov->io); /* flags */ + entry_count = mov_buffer_r32(&mov->io); + + assert(0 == track->elst_count && NULL == track->elst); + if (track->elst_count < entry_count) + { + void* p = realloc(track->elst, sizeof(struct mov_elst_t) * entry_count); + if (NULL == p) return -ENOMEM; + track->elst = (struct mov_elst_t*)p; + } + track->elst_count = entry_count; + + for (i = 0; i < entry_count; i++) + { + if (1 == version) + { + track->elst[i].segment_duration = mov_buffer_r64(&mov->io); + track->elst[i].media_time = (int64_t)mov_buffer_r64(&mov->io); + } + else + { + assert(0 == version); + track->elst[i].segment_duration = mov_buffer_r32(&mov->io); + track->elst[i].media_time = (int32_t)mov_buffer_r32(&mov->io); + } + track->elst[i].media_rate_integer = (int16_t)mov_buffer_r16(&mov->io); + track->elst[i].media_rate_fraction = (int16_t)mov_buffer_r16(&mov->io); + } + + (void)box; + return mov_buffer_error(&mov->io); +} + +size_t mov_write_elst(const struct mov_t* mov) +{ + uint32_t size; + int64_t time; + int64_t delay; + uint8_t version; + const struct mov_track_t* track = mov->track; + + assert(track->start_dts == track->samples[0].dts); + version = track->tkhd.duration > UINT32_MAX ? 1 : 0; + + // in media time scale units, in composition time + time = track->samples[0].pts - track->samples[0].dts; + // in units of the timescale in the Movie Header Box + delay = track->samples[0].pts * mov->mvhd.timescale / track->mdhd.timescale; + if (delay > UINT32_MAX) + version = 1; + + time = time < 0 ? 0 : time; + size = 12/* full box */ + 4/* entry count */ + (delay > 0 ? 2 : 1) * (version ? 20 : 12); + + mov_buffer_w32(&mov->io, size); /* size */ + mov_buffer_write(&mov->io, "elst", 4); + mov_buffer_w8(&mov->io, version); /* version */ + mov_buffer_w24(&mov->io, 0); /* flags */ + mov_buffer_w32(&mov->io, delay > 0 ? 2 : 1); /* entry count */ + + if (delay > 0) + { + if (1 == version) + { + mov_buffer_w64(&mov->io, (uint64_t)delay); /* segment_duration */ + mov_buffer_w64(&mov->io, (uint64_t)-1); /* media_time */ + } + else + { + mov_buffer_w32(&mov->io, (uint32_t)delay); + mov_buffer_w32(&mov->io, (uint32_t)-1); + } + + mov_buffer_w16(&mov->io, 1); /* media_rate_integer */ + mov_buffer_w16(&mov->io, 0); /* media_rate_fraction */ + } + + /* duration */ + if (version == 1) + { + mov_buffer_w64(&mov->io, track->tkhd.duration); + mov_buffer_w64(&mov->io, time); + } + else + { + mov_buffer_w32(&mov->io, (uint32_t)track->tkhd.duration); + mov_buffer_w32(&mov->io, (uint32_t)time); + } + mov_buffer_w16(&mov->io, 1); /* media_rate_integer */ + mov_buffer_w16(&mov->io, 0); /* media_rate_fraction */ + + return size; +} + +void mov_apply_elst(struct mov_track_t *track) +{ + size_t i; + + // edit list + track->samples[0].dts = 0; + track->samples[0].pts = 0; + for (i = 0; i < track->elst_count; i++) + { + if (-1 == track->elst[i].media_time) + { + track->samples[0].dts = track->elst[i].segment_duration; + track->samples[0].pts = track->samples[0].dts; + } + } +} + +void mov_apply_elst_tfdt(struct mov_track_t *track) +{ + size_t i; + + for (i = 0; i < track->elst_count; i++) + { + if (-1 == track->elst[i].media_time) + { + track->tfdt_dts += track->elst[i].segment_duration; + } + } +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-esds.c b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-esds.c new file mode 100644 index 000000000..654dca666 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-esds.c @@ -0,0 +1,391 @@ +#include "mov-internal.h" +#include +#include +#include + +static int mp4_read_tag(struct mov_t* mov, uint64_t bytes); + +// ISO/IEC 14496-1:2010(E) +// 7.2.2 Common data structures +// Table-1 List of Class Tags for Descriptors (p31) +enum { + ISO_ObjectDescrTag = 0x01, + ISO_InitialObjectDescrTag = 0x02, + ISO_ESDescrTag = 0x03, + ISO_DecoderConfigDescrTag = 0x04, + ISO_DecSpecificInfoTag = 0x05, + ISO_SLConfigDescrTag = 0x06, + ISO_ContentIdentDescrTag = 0x07, + ISO_SupplContentIdentDescrTag = 0x08, + ISO_IPI_DescrPointerTag = 0x09, + ISO_IPMP_DescrPointerTag = 0x0A, + ISO_IPMP_DescrTag = 0x0B, + ISO_QoS_DescrTag = 0x0C, + ISO_RegistrationDescrTag = 0x0D, + ISO_ES_ID_IncTag = 0x0E, + ISO_ES_ID_RefTag = 0x0F, + ISO_MP4_IOD_Tag = 0x10, + ISO_MP4_OD_Tag = 0x11, +}; + +// ISO/IEC 14496-1:2010(E) +// 7.2.2.3 BaseCommand +// Table-2 List of Class Tags for Commands (p33) +enum { + ISO_ObjectDescrUpdateTag = 0x01, + ISO_ObjectDescrRemoveTag = 0x02, + ISO_ES_DescrUpdateTag = 0x03, + ISO_ES_DescrRemoveTag = 0x04, + ISO_IPMP_DescrUpdateTag = 0x05, + ISO_IPMP_DescrRemoveTag = 0x06, + ISO_ES_DescrRemoveRefTag = 0x07, + ISO_ObjectDescrExecuteTag = 0x08, + ISO_User_Private = 0xC0, +}; + +// ISO/IEC 14496-1:2010(E) 7.2.2.2 BaseDescriptor (p32) +// ISO/IEC 14496-1:2010(E) 8.3.3 Expandable classes (p116) +/* +abstract aligned(8) expandable(2^28-1) class BaseDescriptor : bit(8) tag=0 { + // empty. To be filled by classes extending this class. +} + +int sizeOfInstance = 0; +bit(1) nextByte; +bit(7) sizeOfInstance; +while(nextByte) { + bit(1) nextByte; + bit(7) sizeByte; + sizeOfInstance = sizeOfInstance<<7 | sizeByte; +} +*/ +static int mov_read_base_descr(struct mov_t* mov, int bytes, int* tag, int* len) +{ + int i; + uint32_t c; + + *tag = mov_buffer_r8(&mov->io); + *len = 0; + c = 0x80; + for (i = 0; i < 4 && i + 1 < bytes && 0 != (c & 0x80); i++) + { + c = mov_buffer_r8(&mov->io); + *len = (*len << 7) | (c & 0x7F); + //if (0 == (c & 0x80)) + // break; + } + return 1 + i; +} + +static uint32_t mov_write_base_descr(const struct mov_t* mov, uint8_t tag, uint32_t len) +{ + mov_buffer_w8(&mov->io, tag); + mov_buffer_w8(&mov->io, (uint8_t)(0x80 | (len >> 21))); + mov_buffer_w8(&mov->io, (uint8_t)(0x80 | (len >> 14))); + mov_buffer_w8(&mov->io, (uint8_t)(0x80 | (len >> 7))); + mov_buffer_w8(&mov->io, (uint8_t)(0x7F & len)); + return 5; +} + +// ISO/IEC 14496-1:2010(E) 7.2.6.5 ES_Descriptor (p47) +/* +class ES_Descriptor extends BaseDescriptor : bit(8) tag=ES_DescrTag { + bit(16) ES_ID; + bit(1) streamDependenceFlag; + bit(1) URL_Flag; + bit(1) OCRstreamFlag; + bit(5) streamPriority; + if (streamDependenceFlag) + bit(16) dependsOn_ES_ID; + if (URL_Flag) { + bit(8) URLlength; + bit(8) URLstring[URLlength]; + } + if (OCRstreamFlag) + bit(16) OCR_ES_Id; + DecoderConfigDescriptor decConfigDescr; + if (ODProfileLevelIndication==0x01) //no SL extension. + { + SLConfigDescriptor slConfigDescr; + } + else // SL extension is possible. + { + SLConfigDescriptor slConfigDescr; + } + IPI_DescrPointer ipiPtr[0 .. 1]; + IP_IdentificationDataSet ipIDS[0 .. 255]; + IPMP_DescriptorPointer ipmpDescrPtr[0 .. 255]; + LanguageDescriptor langDescr[0 .. 255]; + QoS_Descriptor qosDescr[0 .. 1]; + RegistrationDescriptor regDescr[0 .. 1]; + ExtensionDescriptor extDescr[0 .. 255]; +} +*/ +static int mp4_read_es_descriptor(struct mov_t* mov, uint64_t bytes) +{ + uint64_t p1, p2; + p1 = mov_buffer_tell(&mov->io); + /*uint32_t ES_ID = */mov_buffer_r16(&mov->io); + uint32_t flags = mov_buffer_r8(&mov->io); + if (flags & 0x80) //streamDependenceFlag + mov_buffer_r16(&mov->io); + if (flags & 0x40) { //URL_Flag + uint32_t n = mov_buffer_r8(&mov->io); + mov_buffer_skip(&mov->io, n); + } + + if (flags & 0x20) //OCRstreamFlag + mov_buffer_r16(&mov->io); + + p2 = mov_buffer_tell(&mov->io); + return mp4_read_tag(mov, bytes - (p2 - p1)); +} + +// ISO/IEC 14496-1:2010(E) 7.2.6.7 DecoderSpecificInfo (p51) +/* +abstract class DecoderSpecificInfo extends BaseDescriptor : bit(8) + tag=DecSpecificInfoTag +{ + // empty. To be filled by classes extending this class. +} +*/ +static int mp4_read_decoder_specific_info(struct mov_t* mov, int len) +{ + struct mov_track_t* track = mov->track; + struct mov_sample_entry_t* entry = track->stsd.current; + if (entry->extra_data_size < len) + { + void* p = realloc(entry->extra_data, len); + if (NULL == p) return -ENOMEM; + entry->extra_data = p; + } + + mov_buffer_read(&mov->io, entry->extra_data, len); + entry->extra_data_size = len; + return mov_buffer_error(&mov->io); +} + +static int mp4_write_decoder_specific_info(const struct mov_t* mov) +{ + const struct mov_sample_entry_t* entry = mov->track->stsd.current; + mov_write_base_descr(mov, ISO_DecSpecificInfoTag, entry->extra_data_size); + mov_buffer_write(&mov->io, entry->extra_data, entry->extra_data_size); + return entry->extra_data_size; +} + +// ISO/IEC 14496-1:2010(E) 7.2.6.6 DecoderConfigDescriptor (p48) +/* +class DecoderConfigDescriptor extends BaseDescriptor : bit(8) tag=DecoderConfigDescrTag { + bit(8) objectTypeIndication; + bit(6) streamType; + bit(1) upStream; + const bit(1) reserved=1; + bit(24) bufferSizeDB; + bit(32) maxBitrate; + bit(32) avgBitrate; + DecoderSpecificInfo decSpecificInfo[0 .. 1]; + profileLevelIndicationIndexDescriptor profileLevelIndicationIndexDescr[0..255]; +} +*/ +static int mp4_read_decoder_config_descriptor(struct mov_t* mov, int len) +{ + struct mov_sample_entry_t* entry = mov->track->stsd.current; + entry->object_type_indication = (uint8_t)mov_buffer_r8(&mov->io); /* objectTypeIndication */ + entry->stream_type = (uint8_t)mov_buffer_r8(&mov->io) >> 2; /* stream type */ + /*uint32_t bufferSizeDB = */mov_buffer_r24(&mov->io); /* buffer size db */ + /*uint32_t max_rate = */mov_buffer_r32(&mov->io); /* max bit-rate */ + /*uint32_t bit_rate = */mov_buffer_r32(&mov->io); /* avg bit-rate */ + return mp4_read_tag(mov, (uint64_t)len - 13); // mp4_read_decoder_specific_info +} + +static int mp4_write_decoder_config_descriptor(const struct mov_t* mov) +{ + const struct mov_sample_entry_t* entry = mov->track->stsd.current; + int size = 13 + (entry->extra_data_size > 0 ? entry->extra_data_size + 5 : 0); + mov_write_base_descr(mov, ISO_DecoderConfigDescrTag, size); + mov_buffer_w8(&mov->io, entry->object_type_indication); + mov_buffer_w8(&mov->io, 0x01/*reserved*/ | (entry->stream_type << 2)); + mov_buffer_w24(&mov->io, 0); /* buffer size db */ + mov_buffer_w32(&mov->io, 88360); /* max bit-rate */ + mov_buffer_w32(&mov->io, 88360); /* avg bit-rate */ + + if (entry->extra_data_size > 0) + mp4_write_decoder_specific_info(mov); + + return size; +} + +// ISO/IEC 14496-1:2010(E) 7.3.2.3 SL Packet Header Configuration (p92) +/* +class SLConfigDescriptor extends BaseDescriptor : bit(8) tag=SLConfigDescrTag { + bit(8) predefined; + if (predefined==0) { + bit(1) useAccessUnitStartFlag; + bit(1) useAccessUnitEndFlag; + bit(1) useRandomAccessPointFlag; + bit(1) hasRandomAccessUnitsOnlyFlag; + bit(1) usePaddingFlag; + bit(1) useTimeStampsFlag; + bit(1) useIdleFlag; + bit(1) durationFlag; + bit(32) timeStampResolution; + bit(32) OCRResolution; + bit(8) timeStampLength; // must be 64 + bit(8) OCRLength; // must be 64 + bit(8) AU_Length; // must be 32 + bit(8) instantBitrateLength; + bit(4) degradationPriorityLength; + bit(5) AU_seqNumLength; // must be 16 + bit(5) packetSeqNumLength; // must be 16 + bit(2) reserved=0b11; + } + if (durationFlag) { + bit(32) timeScale; + bit(16) accessUnitDuration; + bit(16) compositionUnitDuration; + } + if (!useTimeStampsFlag) { + bit(timeStampLength) startDecodingTimeStamp; + bit(timeStampLength) startCompositionTimeStamp; + } +} + +class ExtendedSLConfigDescriptor extends SLConfigDescriptor : bit(8) +tag=ExtSLConfigDescrTag { + SLExtensionDescriptor slextDescr[1..255]; +} +*/ +static int mp4_read_sl_config_descriptor(struct mov_t* mov) +{ + int flags = 0; + int predefined = mov_buffer_r8(&mov->io); + if (0 == predefined) + { + flags = mov_buffer_r8(&mov->io); + /*uint32_t timeStampResolution = */mov_buffer_r32(&mov->io); + /*uint32_t OCRResolution = */mov_buffer_r32(&mov->io); + /*int timeStampLength = */mov_buffer_r8(&mov->io); + /*int OCRLength = */mov_buffer_r8(&mov->io); + /*int AU_Length = */mov_buffer_r8(&mov->io); + /*int instantBitrateLength = */mov_buffer_r8(&mov->io); + /*uint16_t length = */mov_buffer_r16(&mov->io); + } + else if (1 == predefined) // null SL packet header + { + flags = 0x00; + //int TimeStampResolution = 1000; + //int timeStampLength = 32; + } + else if (2 == predefined) // Reserved for use in MP4 files + { + // Table 14 Detailed predefined SLConfigDescriptor values (p93) + flags = 0x04; + } + + // durationFlag + if (flags & 0x01) + { + /*uint32_t timeScale = */mov_buffer_r32(&mov->io); + /*uint16_t accessUnitDuration = */mov_buffer_r16(&mov->io); + /*uint16_t compositionUnitDuration = */mov_buffer_r16(&mov->io); + } + + // useTimeStampsFlag + if (0 == (flags & 0x04)) + { + //uint64_t startDecodingTimeStamp = 0; // file_reader_rb8(timeStampLength / 8) + //uint64_t startCompositionTimeStamp = 0; // file_reader_rb8(timeStampLength / 8) + } + return mov_buffer_error(&mov->io); +} + +static size_t mp4_write_sl_config_descriptor(const struct mov_t* mov) +{ + size_t size = 1; + size += mov_write_base_descr(mov, ISO_SLConfigDescrTag, 1); + mov_buffer_w8(&mov->io, 0x02); + return size; +} + +static int mp4_read_tag(struct mov_t* mov, uint64_t bytes) +{ + int tag, len; + uint64_t p1, p2, offset; + + for (offset = 0; offset < bytes; offset += len) + { + tag = len = 0; + offset += mov_read_base_descr(mov, (int)(bytes - offset), &tag, &len); + if (offset + len > bytes) + break; + + p1 = mov_buffer_tell(&mov->io); + switch (tag) + { + case ISO_ESDescrTag: + mp4_read_es_descriptor(mov, len); + break; + + case ISO_DecoderConfigDescrTag: + mp4_read_decoder_config_descriptor(mov, len); + break; + + case ISO_DecSpecificInfoTag: + mp4_read_decoder_specific_info(mov, len); + break; + + case ISO_SLConfigDescrTag: + mp4_read_sl_config_descriptor(mov); + break; + + default: + break; + } + + p2 = mov_buffer_tell(&mov->io); + mov_buffer_skip(&mov->io, len - (p2 - p1)); + } + + return mov_buffer_error(&mov->io); +} + +// ISO/IEC 14496-14:2003(E) 5.6 Sample Description Boxes (p15) +int mov_read_esds(struct mov_t* mov, const struct mov_box_t* box) +{ + mov_buffer_r8(&mov->io); /* version */ + mov_buffer_r24(&mov->io); /* flags */ + return mp4_read_tag(mov, box->size - 4); +} + +static size_t mp4_write_es_descriptor(const struct mov_t* mov) +{ + uint32_t size = 3; // mp4_write_decoder_config_descriptor + const struct mov_sample_entry_t* entry = mov->track->stsd.current; + size += 5 + 13 + (entry->extra_data_size > 0 ? entry->extra_data_size + 5 : 0); // mp4_write_decoder_config_descriptor + size += 5 + 1; // mp4_write_sl_config_descriptor + + size += mov_write_base_descr(mov, ISO_ESDescrTag, size); + mov_buffer_w16(&mov->io, (uint16_t)mov->track->tkhd.track_ID); // ES_ID + mov_buffer_w8(&mov->io, 0x00); // flags (= no flags) + + mp4_write_decoder_config_descriptor(mov); + mp4_write_sl_config_descriptor(mov); + return size; +} + +size_t mov_write_esds(const struct mov_t* mov) +{ + size_t size; + uint64_t offset; + + size = 12 /* full box */; + offset = mov_buffer_tell(&mov->io); + mov_buffer_w32(&mov->io, 0); /* size */ + mov_buffer_write(&mov->io, "esds", 4); + mov_buffer_w32(&mov->io, 0); /* version & flags */ + + size += mp4_write_es_descriptor(mov); + + mov_write_size(mov, offset, size); /* update size */ + return size; +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-ftyp.c b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-ftyp.c new file mode 100644 index 000000000..69af7c15a --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-ftyp.c @@ -0,0 +1,54 @@ +#include "mov-internal.h" +#include + +// 4.3 File Type Box (p17) +int mov_read_ftyp(struct mov_t* mov, const struct mov_box_t* box) +{ + if(box->size < 8) return -1; + + mov->ftyp.major_brand = mov_buffer_r32(&mov->io); + mov->ftyp.minor_version = mov_buffer_r32(&mov->io); + + for(mov->ftyp.brands_count = 0; mov->ftyp.brands_count < N_BRAND && (uint64_t)mov->ftyp.brands_count * 4 < box->size - 8; ++mov->ftyp.brands_count) + { + mov->ftyp.compatible_brands[mov->ftyp.brands_count] = mov_buffer_r32(&mov->io); + } + + assert(box->size == 4 * (uint64_t)mov->ftyp.brands_count + 8); + mov_buffer_skip(&mov->io, box->size - 4 * (uint64_t)mov->ftyp.brands_count - 8 ); // skip compatible_brands + return 0; +} + +size_t mov_write_ftyp(const struct mov_t* mov) +{ + int size, i; + + size = 8/* box */ + 8/* item */ + mov->ftyp.brands_count * 4 /* compatible brands */; + + mov_buffer_w32(&mov->io, size); /* size */ + mov_buffer_write(&mov->io, "ftyp", 4); + mov_buffer_w32(&mov->io, mov->ftyp.major_brand); + mov_buffer_w32(&mov->io, mov->ftyp.minor_version); + + for (i = 0; i < mov->ftyp.brands_count; i++) + mov_buffer_w32(&mov->io, mov->ftyp.compatible_brands[i]); + + return size; +} + +size_t mov_write_styp(const struct mov_t* mov) +{ + int size, i; + + size = 8/* box */ + 8/* item */ + mov->ftyp.brands_count * 4 /* compatible brands */; + + mov_buffer_w32(&mov->io, size); /* size */ + mov_buffer_write(&mov->io, "styp", 4); + mov_buffer_w32(&mov->io, mov->ftyp.major_brand); + mov_buffer_w32(&mov->io, mov->ftyp.minor_version); + + for (i = 0; i < mov->ftyp.brands_count; i++) + mov_buffer_w32(&mov->io, mov->ftyp.compatible_brands[i]); + + return size; +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-hdlr.c b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-hdlr.c new file mode 100644 index 000000000..c27c578d9 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-hdlr.c @@ -0,0 +1,43 @@ +#include "mov-internal.h" +#include +#include + +// 8.4.3 Handler Reference Box (p36) +// Box Type: 'hdlr' +// Container: Media Box ('mdia') or Meta Box ('meta') +// Mandatory: Yes +// Quantity: Exactly one +int mov_read_hdlr(struct mov_t* mov, const struct mov_box_t* box) +{ + struct mov_track_t* track = mov->track; + + mov_buffer_r8(&mov->io); /* version */ + mov_buffer_r24(&mov->io); /* flags */ + //uint32_t pre_defined = mov_buffer_r32(&mov->io); + mov_buffer_skip(&mov->io, 4); + track->handler_type = mov_buffer_r32(&mov->io); + // const unsigned int(32)[3] reserved = 0; + mov_buffer_skip(&mov->io, 12); + // string name; + mov_buffer_skip(&mov->io, box->size - 24); // String name + return 0; +} + +size_t mov_write_hdlr(const struct mov_t* mov) +{ + const struct mov_track_t* track = mov->track; + + mov_buffer_w32(&mov->io, 33 + (uint32_t)strlen(track->handler_descr)); /* size */ + mov_buffer_write(&mov->io, "hdlr", 4); + mov_buffer_w32(&mov->io, 0); /* Version & flags */ + + mov_buffer_w32(&mov->io, 0); /* pre_defined */ + mov_buffer_w32(&mov->io, track->handler_type); /* handler_type */ + + mov_buffer_w32(&mov->io, 0); /* reserved */ + mov_buffer_w32(&mov->io, 0); /* reserved */ + mov_buffer_w32(&mov->io, 0); /* reserved */ + + mov_buffer_write(&mov->io, track->handler_descr, (uint64_t)strlen(track->handler_descr)+1); /* name */ + return 33 + strlen(track->handler_descr); +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-hdr.c b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-hdr.c new file mode 100644 index 000000000..3c9ba3b6c --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-hdr.c @@ -0,0 +1,37 @@ +#include "mov-internal.h" +#include +#include +#include + +// https://www.webmproject.org/vp9/mp4/ + +int mov_read_smdm(struct mov_t* mov, const struct mov_box_t* box) +{ + (void)box; + mov_buffer_r8(&mov->io); // version + mov_buffer_r24(&mov->io); // flags + + mov_buffer_r16(&mov->io); // primaryRChromaticity_x, 0.16 fixed-point Red X chromaticity coordinate as defined by CIE 1931 + mov_buffer_r16(&mov->io); // primaryRChromaticity_y + mov_buffer_r16(&mov->io); // primaryGChromaticity_x + mov_buffer_r16(&mov->io); // primaryGChromaticity_y + mov_buffer_r16(&mov->io); // primaryBChromaticity_x + mov_buffer_r16(&mov->io); // primaryBChromaticity_y + mov_buffer_r16(&mov->io); // whitePointChromaticity_x + mov_buffer_r16(&mov->io); // whitePointChromaticity_y + mov_buffer_r32(&mov->io); // luminanceMax, 24.8 fixed point Maximum luminance, represented in candelas per square meter (cd/m²) + mov_buffer_r32(&mov->io); // luminanceMin + + return mov_buffer_error(&mov->io); +} + +int mov_read_coll(struct mov_t* mov, const struct mov_box_t* box) +{ + (void)box; + mov_buffer_r8(&mov->io); // version + mov_buffer_r24(&mov->io); // flags + + mov_buffer_r16(&mov->io); // maxCLL, Maximum Content Light Level as specified in CEA-861.3, Appendix A. + mov_buffer_r16(&mov->io); // maxFALL, Maximum Frame-Average Light Level as specified in CEA-861.3, Appendix A. + return mov_buffer_error(&mov->io); +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-hvcc.c b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-hvcc.c new file mode 100644 index 000000000..f1ad95748 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-hvcc.c @@ -0,0 +1,33 @@ +#include "mov-internal.h" +#include +#include +#include + +// extra_data: ISO/IEC 14496-15:2017 HEVCDecoderConfigurationRecord + +int mov_read_hvcc(struct mov_t* mov, const struct mov_box_t* box) +{ + struct mov_track_t* track = mov->track; + struct mov_sample_entry_t* entry = track->stsd.current; + if (entry->extra_data_size < box->size) + { + void* p = realloc(entry->extra_data, (size_t)box->size); + if (NULL == p) return -ENOMEM; + entry->extra_data = p; + } + + mov_buffer_read(&mov->io, entry->extra_data, (size_t)box->size); + entry->extra_data_size = (int)box->size; + return mov_buffer_error(&mov->io); +} + +size_t mov_write_hvcc(const struct mov_t* mov) +{ + const struct mov_track_t* track = mov->track; + const struct mov_sample_entry_t* entry = track->stsd.current; + mov_buffer_w32(&mov->io, entry->extra_data_size + 8); /* size */ + mov_buffer_write(&mov->io, "hvcC", 4); + if (entry->extra_data_size > 0) + mov_buffer_write(&mov->io, entry->extra_data, entry->extra_data_size); + return entry->extra_data_size + 8; +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-internal.h b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-internal.h new file mode 100644 index 000000000..ea17ba890 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-internal.h @@ -0,0 +1,333 @@ +#ifndef _mov_internal_h_ +#define _mov_internal_h_ + +#include "mov-box.h" +#include "mov-atom.h" +#include "mov-format.h" +#include "mov-buffer.h" +#include "mov-ioutil.h" + +#define MOV_APP "ireader/media-server" + +#define MOV_TAG(a, b, c, d) (((a) << 24) | ((b) << 16) | ((c) << 8) | (d)) + +#define MOV_MOOV MOV_TAG('m', 'o', 'o', 'v') +#define MOV_ROOT MOV_TAG('r', 'o', 'o', 't') +#define MOV_TRAK MOV_TAG('t', 'r', 'a', 'k') +#define MOV_MDIA MOV_TAG('m', 'd', 'i', 'a') +#define MOV_EDTS MOV_TAG('e', 'd', 't', 's') +#define MOV_MINF MOV_TAG('m', 'i', 'n', 'f') +#define MOV_GMHD MOV_TAG('g', 'm', 'h', 'd') // Apple QuickTime gmhd(text media) +#define MOV_DINF MOV_TAG('d', 'i', 'n', 'f') +#define MOV_STBL MOV_TAG('s', 't', 'b', 'l') +#define MOV_MVEX MOV_TAG('m', 'v', 'e', 'x') +#define MOV_MOOF MOV_TAG('m', 'o', 'o', 'f') +#define MOV_TRAF MOV_TAG('t', 'r', 'a', 'f') +#define MOV_MFRA MOV_TAG('m', 'f', 'r', 'a') + +#define MOV_VIDEO MOV_TAG('v', 'i', 'd', 'e') // ISO/IEC 14496-12:2015(E) 12.1 Video media (p169) +#define MOV_AUDIO MOV_TAG('s', 'o', 'u', 'n') // ISO/IEC 14496-12:2015(E) 12.2 Audio media (p173) +#define MOV_META MOV_TAG('m', 'e', 't', 'a') // ISO/IEC 14496-12:2015(E) 12.3 Metadata media (p181) +#define MOV_HINT MOV_TAG('h', 'i', 'n', 't') // ISO/IEC 14496-12:2015(E) 12.4 Hint media (p183) +#define MOV_TEXT MOV_TAG('t', 'e', 'x', 't') // ISO/IEC 14496-12:2015(E) 12.5 Text media (p184) +#define MOV_SUBT MOV_TAG('s', 'u', 'b', 't') // ISO/IEC 14496-12:2015(E) 12.6 Subtitle media (p185) +#define MOV_FONT MOV_TAG('f', 'd', 's', 'm') // ISO/IEC 14496-12:2015(E) 12.7 Font media (p186) +#define MOV_CLCP MOV_TAG('c', 'l', 'c', 'p') // ClosedCaptionHandler +#define MOV_ALIS MOV_TAG('a', 'l', 'i', 's') // Apple QuickTime Macintosh alias +#define MOV_SBTL MOV_TAG('s', 'b', 't', 'l') // text/tx3g + +// https://developer.apple.com/library/content/documentation/General/Reference/HLSAuthoringSpec/Requirements.html#//apple_ref/doc/uid/TP40016596-CH2-SW1 +// Video encoding requirements 1.10: Use 'avc1', 'hvc1', or 'dvh1' rather than 'avc3', 'hev1', or 'dvhe' +#define MOV_H264 MOV_TAG('a', 'v', 'c', '1') // H.264 ISO/IEC 14496-15:2010(E) 5.3.4 AVC Video Stream Definition (18) +#define MOV_H265 MOV_TAG('h', 'v', 'c', '1') // H.265 +#define MOV_H266 MOV_TAG('v', 'v', 'c', '1') // H.266 +#define MOV_MP4V MOV_TAG('m', 'p', '4', 'v') // MPEG-4 Video +#define MOV_MP4A MOV_TAG('m', 'p', '4', 'a') // AAC +#define MOV_MP4S MOV_TAG('m', 'p', '4', 's') // ISO/IEC 14496-14:2003(E) 5.6 Sample Description Boxes (p14) +#define MOV_OPUS MOV_TAG('O', 'p', 'u', 's') // http://www.opus-codec.org/docs/opus_in_isobmff.html +#define MOV_VP8 MOV_TAG('v', 'p', '0', '8') +#define MOV_VP9 MOV_TAG('v', 'p', '0', '9') // https://www.webmproject.org/vp9/mp4/ +#define MOV_VP10 MOV_TAG('v', 'p', '1', '0') +#define MOV_AV1 MOV_TAG('a', 'v', '0', '1') // https://aomediacodec.github.io/av1-isobmff +#define MOV_VC1 MOV_TAG('v', 'c', '-', '1') +#define MOV_DIRAC MOV_TAG('d', 'r', 'a', 'c') +#define MOV_AC3 MOV_TAG('a', 'c', '-', '3') +#define MOV_DTS MOV_TAG('d', 't', 's', 'c') // DTS-HD + +// ISO/IEC 14496-1:2010(E) 7.2.6.6 DecoderConfigDescriptor +// Table 6 - streamType Values (p51) +enum +{ + MP4_STREAM_ODS = 0x01, /* ObjectDescriptorStream */ + MP4_STREAM_CRS = 0x02, /* ClockReferenceStream */ + MP4_STREAM_SDS = 0x03, /* SceneDescriptionStream */ + MP4_STREAM_VISUAL = 0x04, /* VisualStream */ + MP4_STREAM_AUDIO = 0x05, /* AudioStream */ + MP4_STREAM_MP7 = 0x06, /* MPEG7Stream */ + MP4_STREAM_IPMP = 0x07, /* IPMPStream */ + MP4_STREAM_OCIS = 0x08, /* ObjectContentInfoStream */ + MP4_STREAM_MPEGJ = 0x09, /* MPEGJStream */ + MP4_STREAM_IS = 0x0A, /* Interaction Stream */ + MP4_STREAM_IPMPTOOL = 0x0B, /* IPMPToolStream */ +}; + +enum +{ + MOV_BRAND_ISOM = MOV_TAG('i', 's', 'o', 'm'), + MOV_BRAND_AVC1 = MOV_TAG('a', 'v', 'c', '1'), + MOV_BRAND_ISO2 = MOV_TAG('i', 's', 'o', '2'), + MOV_BRAND_MP71 = MOV_TAG('m', 'p', '7', '1'), + MOV_BRAND_ISO3 = MOV_TAG('i', 's', 'o', '3'), + MOV_BRAND_ISO4 = MOV_TAG('i', 's', 'o', '4'), + MOV_BRAND_ISO5 = MOV_TAG('i', 's', 'o', '5'), + MOV_BRAND_ISO6 = MOV_TAG('i', 's', 'o', '6'), + MOV_BRAND_MP41 = MOV_TAG('m', 'p', '4', '1'), // ISO/IEC 14496-1:2001 MP4 File Format v1 + MOV_BRAND_MP42 = MOV_TAG('m', 'p', '4', '2'), // ISO/IEC 14496-14:2003 MP4 File Format v2 + MOV_BRAND_MOV = MOV_TAG('q', 't', ' ', ' '), // Apple Quick-Time File Format + MOV_BRAND_DASH = MOV_TAG('d', 'a', 's', 'h'), // MPEG-DASH + MOV_BRAND_MSDH = MOV_TAG('m', 's', 'd', 'h'), // MPEG-DASH + MOV_BRAND_MSIX = MOV_TAG('m', 's', 'i', 'x'), // MPEG-DASH +}; + +#define MOV_TREX_FLAG_IS_LEADING_MASK 0x0C000000 +#define MOV_TREX_FLAG_SAMPLE_DEPENDS_ON_MASK 0x03000000 +#define MOV_TREX_FLAG_SAMPLE_IS_DEPENDED_ON_MASK 0x00C00000 +#define MOV_TREX_FLAG_SAMPLE_HAS_REDUNDANCY_MASK 0x00300000 +#define MOV_TREX_FLAG_SAMPLE_PADDING_VALUE_MASK 0x000E0000 +#define MOV_TREX_FLAG_SAMPLE_IS_NO_SYNC_SAMPLE 0x00010000 +#define MOV_TREX_FLAG_SAMPLE_DEGRADATION_PRIORITY_MASK 0x0000FFFF + +// 8.6.4 Independent and Disposable Samples Box (p55) +#define MOV_TREX_FLAG_SAMPLE_DEPENDS_ON_I_PICTURE 0x02000000 +#define MOV_TREX_FLAG_SAMPLE_DEPENDS_ON_NOT_I_PICTURE 0x01000000 + +#define MOV_TFHD_FLAG_BASE_DATA_OFFSET 0x00000001 +#define MOV_TFHD_FLAG_SAMPLE_DESCRIPTION_INDEX 0x00000002 +#define MOV_TFHD_FLAG_DEFAULT_DURATION 0x00000008 +#define MOV_TFHD_FLAG_DEFAULT_SIZE 0x00000010 +#define MOV_TFHD_FLAG_DEFAULT_FLAGS 0x00000020 +#define MOV_TFHD_FLAG_DURATION_IS_EMPTY 0x00010000 +#define MOV_TFHD_FLAG_DEFAULT_BASE_IS_MOOF 0x00020000 + +#define MOV_TRUN_FLAG_DATA_OFFSET_PRESENT 0x0001 +#define MOV_TRUN_FLAG_FIRST_SAMPLE_FLAGS_PRESENT 0x0004 +#define MOV_TRUN_FLAG_SAMPLE_DURATION_PRESENT 0x0100 +#define MOV_TRUN_FLAG_SAMPLE_SIZE_PRESENT 0x0200 +#define MOV_TRUN_FLAG_SAMPLE_FLAGS_PRESENT 0x0400 +#define MOV_TRUN_FLAG_SAMPLE_COMPOSITION_TIME_OFFSET_PRESENT 0x0800 + +#define MOV_TRACK_FLAG_CTTS_V1 0x0001 //ctts version 1 + +struct mov_stbl_t +{ + struct mov_stsc_t* stsc; + size_t stsc_count; + + uint64_t* stco; + uint32_t stco_count; + + struct mov_stts_t* stts; + size_t stts_count; + + struct mov_stts_t* ctts; + size_t ctts_count; + + uint32_t* stss; // sample_number, start from 1 + size_t stss_count; +}; + +struct mov_sample_t +{ + int flags; // MOV_AV_FLAG_KEYFREAME + int64_t pts; // track mdhd timescale + int64_t dts; + + void* data; + uint64_t offset; // is a 32 or 64 bit integer that gives the offset of the start of a chunk into its containing media file. + uint32_t bytes; + + uint32_t sample_description_index; + uint32_t samples_per_chunk; // write only + uint32_t first_chunk; // write only +}; + +struct mov_fragment_t +{ + uint64_t time; + uint64_t offset; // moof offset +}; + +struct mov_track_t +{ + uint32_t tag; // MOV_H264/MOV_MP4A + uint32_t handler_type; // MOV_VIDEO/MOV_AUDIO + const char* handler_descr; // VideoHandler/SoundHandler/SubtitleHandler + + struct mov_tkhd_t tkhd; + struct mov_mdhd_t mdhd; + struct mov_stbl_t stbl; + + // 8.8 Movie Fragments + struct mov_trex_t trex; + struct mov_tfhd_t tfhd; + struct mov_fragment_t* frags; + uint32_t frag_count, frag_capacity /*offset for read*/; + + struct mov_stsd_t stsd; + + struct mov_elst_t* elst; + size_t elst_count; + + struct mov_sample_t* samples; + uint32_t sample_count; + size_t sample_offset; // sample_capacity + + int64_t tfdt_dts; // tfdt baseMediaDecodeTime + int64_t start_dts; // write fmp4 only + uint64_t offset; // write only + int64_t last_dts; // write fmp4 only + int64_t turn_last_duration; // write fmp4 only + + unsigned int flags; +}; + +struct mov_t +{ + struct mov_ioutil_t io; + + struct mov_ftyp_t ftyp; + struct mov_mvhd_t mvhd; + + int flags; + int header; + uint32_t mfro; // mfro size + uint64_t moof_offset; // last moof offset(from file begin) + uint64_t implicit_offset; + + struct mov_track_t* track; // current stream + struct mov_track_t* tracks; + int track_count; + + const void* udta; + uint64_t udta_size; +}; + +int mov_reader_root(struct mov_t* mov); +int mov_reader_box(struct mov_t* mov, const struct mov_box_t* parent); +int mp4_read_extra(struct mov_t* mov, const struct mov_box_t* parent); + +int mov_read_ftyp(struct mov_t* mov, const struct mov_box_t* box); +int mov_read_mvhd(struct mov_t* mov, const struct mov_box_t* box); +int mov_read_tkhd(struct mov_t* mov, const struct mov_box_t* box); +int mov_read_hdlr(struct mov_t* mov, const struct mov_box_t* box); +int mov_read_mdhd(struct mov_t* mov, const struct mov_box_t* box); +int mov_read_vmhd(struct mov_t* mov, const struct mov_box_t* box); +int mov_read_smhd(struct mov_t* mov, const struct mov_box_t* box); +int mov_read_nmhd(struct mov_t* mov, const struct mov_box_t* box); +int mov_read_esds(struct mov_t* mov, const struct mov_box_t* box); +int mov_read_elst(struct mov_t* mov, const struct mov_box_t* box); +int mov_read_stsd(struct mov_t* mov, const struct mov_box_t* box); +int mov_read_stsz(struct mov_t* mov, const struct mov_box_t* box); +int mov_read_stz2(struct mov_t* mov, const struct mov_box_t* box); +int mov_read_stsc(struct mov_t* mov, const struct mov_box_t* box); +int mov_read_stco(struct mov_t* mov, const struct mov_box_t* box); +int mov_read_stts(struct mov_t* mov, const struct mov_box_t* box); +int mov_read_ctts(struct mov_t* mov, const struct mov_box_t* box); +int mov_read_cslg(struct mov_t* mov, const struct mov_box_t* box); +int mov_read_stss(struct mov_t* mov, const struct mov_box_t* box); +int mov_read_avcc(struct mov_t* mov, const struct mov_box_t* box); +int mov_read_hvcc(struct mov_t* mov, const struct mov_box_t* box); +int mov_read_vvcc(struct mov_t* mov, const struct mov_box_t* box); +int mov_read_av1c(struct mov_t* mov, const struct mov_box_t* box); +int mov_read_vpcc(struct mov_t* mov, const struct mov_box_t* box); +int mov_read_tx3g(struct mov_t* mov, const struct mov_box_t* box); +int mov_read_trex(struct mov_t* mov, const struct mov_box_t* box); +int mov_read_leva(struct mov_t* mov, const struct mov_box_t* box); +int mov_read_tfhd(struct mov_t* mov, const struct mov_box_t* box); +int mov_read_trun(struct mov_t* mov, const struct mov_box_t* box); +int mov_read_tfra(struct mov_t* mov, const struct mov_box_t* box); +int mov_read_sidx(struct mov_t* mov, const struct mov_box_t* box); +int mov_read_mfhd(struct mov_t* mov, const struct mov_box_t* box); +int mov_read_tfdt(struct mov_t* mov, const struct mov_box_t* box); +int mov_read_mehd(struct mov_t* mov, const struct mov_box_t* box); +int mov_read_dops(struct mov_t* mov, const struct mov_box_t* box); +int mov_read_pasp(struct mov_t* mov, const struct mov_box_t* box); +int mov_read_gmin(struct mov_t* mov, const struct mov_box_t* box); +int mov_read_text(struct mov_t* mov, const struct mov_box_t* box); +int mov_read_smdm(struct mov_t* mov, const struct mov_box_t* box); +int mov_read_coll(struct mov_t* mov, const struct mov_box_t* box); +int mov_read_udta(struct mov_t* mov, const struct mov_box_t* box); + +size_t mov_write_ftyp(const struct mov_t* mov); +size_t mov_write_mvhd(const struct mov_t* mov); +size_t mov_write_mdhd(const struct mov_t* mov); +size_t mov_write_tkhd(const struct mov_t* mov); +size_t mov_write_hdlr(const struct mov_t* mov); +size_t mov_write_vmhd(const struct mov_t* mov); +size_t mov_write_smhd(const struct mov_t* mov); +size_t mov_write_nmhd(const struct mov_t* mov); +size_t mov_write_sthd(const struct mov_t* mov); +size_t mov_write_dinf(const struct mov_t* mov); +size_t mov_write_dref(const struct mov_t* mov); +size_t mov_write_elst(const struct mov_t* mov); +size_t mov_write_stsd(const struct mov_t* mov); +size_t mov_write_stts(const struct mov_t* mov, uint32_t count); +size_t mov_write_ctts(const struct mov_t* mov, uint32_t count); +size_t mov_write_stco(const struct mov_t* mov, uint32_t count); +size_t mov_write_stss(const struct mov_t* mov); +size_t mov_write_stsc(const struct mov_t* mov); +size_t mov_write_stsz(const struct mov_t* mov); +size_t mov_write_esds(const struct mov_t* mov); +size_t mov_write_avcc(const struct mov_t* mov); +size_t mov_write_hvcc(const struct mov_t* mov); +size_t mov_write_vvcc(const struct mov_t* mov); +size_t mov_write_av1c(const struct mov_t* mov); +size_t mov_write_vpcc(const struct mov_t* mov); +size_t mov_write_tx3g(const struct mov_t* mov); +size_t mov_write_trex(const struct mov_t* mov); +size_t mov_write_tfhd(const struct mov_t* mov); +size_t mov_write_trun(const struct mov_t* mov, uint32_t from, uint32_t count, uint32_t offset); +size_t mov_write_tfra(const struct mov_t* mov); +size_t mov_write_styp(const struct mov_t* mov); +size_t mov_write_tfdt(const struct mov_t* mov); +size_t mov_write_mehd(const struct mov_t* mov); +size_t mov_write_sidx(const struct mov_t* mov, uint64_t offset); +size_t mov_write_mfhd(const struct mov_t* mov, uint32_t fragment); +size_t mov_write_edts(const struct mov_t* mov); +size_t mov_write_stbl(const struct mov_t* mov); +size_t mov_write_minf(const struct mov_t* mov); +size_t mov_write_mdia(const struct mov_t* mov); +size_t mov_write_trak(const struct mov_t* mov); +size_t mov_write_dops(const struct mov_t* mov); +size_t mov_write_udta(const struct mov_t* mov); + +uint32_t mov_build_stts(struct mov_track_t* track); +uint32_t mov_build_ctts(struct mov_track_t* track); +uint32_t mov_build_stco(struct mov_track_t* track); +void mov_apply_stco(struct mov_track_t* track); +void mov_apply_elst(struct mov_track_t *track); +void mov_apply_stts(struct mov_track_t* track); +void mov_apply_ctts(struct mov_track_t* track); +void mov_apply_stss(struct mov_track_t* track); +void mov_apply_elst_tfdt(struct mov_track_t *track); + +void mov_write_size(const struct mov_t* mov, uint64_t offset, size_t size); + +size_t mov_stco_size(const struct mov_track_t* track, uint64_t offset); + +int mov_fragment_read_next_moof(struct mov_t* mov); +int mov_fragment_seek_read_mfra(struct mov_t* mov); +int mov_fragment_seek(struct mov_t* mov, int64_t* timestamp); + +uint8_t mov_tag_to_object(uint32_t tag); +uint32_t mov_object_to_tag(uint8_t object); + +void mov_free_track(struct mov_track_t* track); +struct mov_track_t* mov_add_track(struct mov_t* mov); +struct mov_track_t* mov_find_track(const struct mov_t* mov, uint32_t track); +struct mov_track_t* mov_fetch_track(struct mov_t* mov, uint32_t track); // find and add +int mov_add_audio(struct mov_track_t* track, const struct mov_mvhd_t* mvhd, uint32_t timescale, uint8_t object, int channel_count, int bits_per_sample, int sample_rate, const void* extra_data, size_t extra_data_size); +int mov_add_video(struct mov_track_t* track, const struct mov_mvhd_t* mvhd, uint32_t timescale, uint8_t object, int width, int height, const void* extra_data, size_t extra_data_size); +int mov_add_subtitle(struct mov_track_t* track, const struct mov_mvhd_t* mvhd, uint32_t timescale, uint8_t object, const void* extra_data, size_t extra_data_size); + +#endif /* !_mov_internal_h_ */ diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-iods.c b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-iods.c new file mode 100644 index 000000000..4f884c428 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-iods.c @@ -0,0 +1,90 @@ +#include "mov-internal.h" +#include +#include +#include + +// Table 1 - List of Class Tags for Descriptors (p31) +/* +0x10 MP4_IOD_Tag +0x11 MP4_OD_Tag +*/ + +// 7.2.2.2 BaseDescriptor (p32) +/* +abstract aligned(8) expandable(2^28-1) class BaseDescriptor : bit(8) tag=0 { +// empty. To be filled by classes extending this class. +} +*/ + +// 7.2.6.2 ObjectDescriptorBase (p42) +/* +abstract class ObjectDescriptorBase extends BaseDescriptor : bit(8) + tag=[ObjectDescrTag..InitialObjectDescrTag] { + // empty. To be filled by classes extending this class. +} +class ObjectDescriptor extends ObjectDescriptorBase : bit(8) tag=ObjectDescrTag { + bit(10) ObjectDescriptorID; + bit(1) URL_Flag; + const bit(5) reserved=0b1111.1; + if (URL_Flag) { + bit(8) URLlength; + bit(8) URLstring[URLlength]; + } else { + ES_Descriptor esDescr[1 .. 255]; + OCI_Descriptor ociDescr[0 .. 255]; + IPMP_DescriptorPointer ipmpDescrPtr[0 .. 255]; + IPMP_Descriptor ipmpDescr [0 .. 255]; + } + ExtensionDescriptor extDescr[0 .. 255]; +} +*/ + +// 7.2.6.4 InitialObjectDescriptor (p44) +/* +class InitialObjectDescriptor extends ObjectDescriptorBase : bit(8) + tag=InitialObjectDescrTag { + bit(10) ObjectDescriptorID; + bit(1) URL_Flag; + bit(1) includeInlineProfileLevelFlag; + const bit(4) reserved=0b1111; + if (URL_Flag) { + bit(8) URLlength; + bit(8) URLstring[URLlength]; + } else { + bit(8) ODProfileLevelIndication; + bit(8) sceneProfileLevelIndication; + bit(8) audioProfileLevelIndication; + bit(8) visualProfileLevelIndication; + bit(8) graphicsProfileLevelIndication; + ES_Descriptor esDescr[1 .. 255]; + OCI_Descriptor ociDescr[0 .. 255]; + IPMP_DescriptorPointer ipmpDescrPtr[0 .. 255]; + IPMP_Descriptor ipmpDescr [0 .. 255]; + IPMP_ToolListDescriptor toolListDescr[0 .. 1]; + } + ExtensionDescriptor extDescr[0 .. 255]; +} +*/ +size_t mov_write_iods(const struct mov_t* mov) +{ + size_t size = 12 /* full box */ + 12 /* InitialObjectDescriptor */; + + mov_buffer_w32(&mov->io, 24); /* size */ + mov_buffer_write(&mov->io, "iods", 4); + mov_buffer_w32(&mov->io, 0); /* version & flags */ + + mov_buffer_w8(&mov->io, 0x10); // ISO_MP4_IOD_Tag + mov_buffer_w8(&mov->io, (uint8_t)(0x80 | (7 >> 21))); + mov_buffer_w8(&mov->io, (uint8_t)(0x80 | (7 >> 14))); + mov_buffer_w8(&mov->io, (uint8_t)(0x80 | (7 >> 7))); + mov_buffer_w8(&mov->io, (uint8_t)(0x7F & 7)); + + mov_buffer_w16(&mov->io, 0x004f); // objectDescriptorId 1 + mov_buffer_w8(&mov->io, 0xff); // No OD capability required + mov_buffer_w8(&mov->io, 0xff); + mov_buffer_w8(&mov->io, 0xFF); + mov_buffer_w8(&mov->io, 0xFF); // no visual capability required + mov_buffer_w8(&mov->io, 0xff); + + return size; +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-ioutil.h b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-ioutil.h new file mode 100644 index 000000000..c48aaf08b --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-ioutil.h @@ -0,0 +1,123 @@ +#ifndef _mov_ioutil_h_ +#define _mov_ioutil_h_ + +#include "mov-buffer.h" + +struct mov_ioutil_t +{ + struct mov_buffer_t io; + void* param; + int error; +}; + +static inline int mov_buffer_error(const struct mov_ioutil_t* io) +{ + return io->error; +} + +static inline uint64_t mov_buffer_tell(const struct mov_ioutil_t* io) +{ + int64_t v; + v = io->io.tell(io->param); + if (v < 0) + ((struct mov_ioutil_t*)io)->error = -1; + return v; +} + +static inline void mov_buffer_seek(const struct mov_ioutil_t* io, int64_t offset) +{ +// if (0 == io->error) + ((struct mov_ioutil_t*)io)->error = io->io.seek(io->param, offset); +} + +static inline void mov_buffer_skip(struct mov_ioutil_t* io, uint64_t bytes) +{ + uint64_t offset; + if (0 == io->error) + { + offset = io->io.tell(io->param); + io->error = io->io.seek(io->param, offset + bytes); + } +} + +static inline void mov_buffer_read(struct mov_ioutil_t* io, void* data, uint64_t bytes) +{ + if (0 == io->error) + io->error = io->io.read(io->param, data, bytes); +} + +static inline void mov_buffer_write(const struct mov_ioutil_t* io, const void* data, uint64_t bytes) +{ + if (0 == io->error) + ((struct mov_ioutil_t*)io)->error = io->io.write(io->param, data, bytes); +} + +static inline uint8_t mov_buffer_r8(struct mov_ioutil_t* io) +{ + uint8_t v = 0; + mov_buffer_read(io, &v, 1); + return v; +} + +static inline uint16_t mov_buffer_r16(struct mov_ioutil_t* io) +{ + uint16_t v; + v = mov_buffer_r8(io); + v = (v << 8) | mov_buffer_r8(io); + return v; +} + +static inline uint32_t mov_buffer_r24(struct mov_ioutil_t* io) +{ + uint32_t v; + v = mov_buffer_r8(io); + v = (v << 16) | mov_buffer_r16(io); + return v; +} + +static inline uint32_t mov_buffer_r32(struct mov_ioutil_t* io) +{ + uint32_t v; + v = mov_buffer_r16(io); + v = (v << 16) | mov_buffer_r16(io); + return v; +} + +static inline uint64_t mov_buffer_r64(struct mov_ioutil_t* io) +{ + uint64_t v; + v = mov_buffer_r32(io); + v = (v << 32) | mov_buffer_r32(io); + return v; +} + +static inline void mov_buffer_w8(const struct mov_ioutil_t* io, uint8_t v) +{ + mov_buffer_write(io, &v, 1); +} + +static inline void mov_buffer_w16(const struct mov_ioutil_t* io, uint16_t v) +{ + mov_buffer_w8(io, (uint8_t)(v >> 8)); + mov_buffer_w8(io, (uint8_t)v); +} + +static inline void mov_buffer_w24(const struct mov_ioutil_t* io, uint32_t v) +{ + mov_buffer_w16(io, (uint16_t)(v >> 8)); + mov_buffer_w8(io, (uint8_t)v); +} + +static inline void mov_buffer_w32(const struct mov_ioutil_t* io, uint32_t v) +{ + mov_buffer_w16(io, (uint16_t)(v >> 16)); + mov_buffer_w16(io, (uint16_t)v); +} + +static inline void mov_buffer_w64(const struct mov_ioutil_t* io, uint64_t v) +{ + mov_buffer_w32(io, (uint32_t)(v >> 32)); + mov_buffer_w32(io, (uint32_t)v); +} + +#endif /* !_mov_ioutil_h_ */ diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-leva.c b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-leva.c new file mode 100644 index 000000000..f8ec64911 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-leva.c @@ -0,0 +1,35 @@ +#include "mov-internal.h" +#include + +// 8.8.13 Level Assignment Box (p77) +int mov_read_leva(struct mov_t* mov, const struct mov_box_t* box) +{ + unsigned int i, level_count; + unsigned int assignment_type; + + mov_buffer_r32(&mov->io); /* version & flags */ + level_count = mov_buffer_r8(&mov->io); /* level_count */ + for (i = 0; i < level_count; i++) + { + mov_buffer_r32(&mov->io); /* track_id */ + assignment_type = mov_buffer_r8(&mov->io); /* padding_flag & assignment_type */ + assignment_type &= 0x7F; // 7-bits + + if (0 == assignment_type) + { + mov_buffer_r32(&mov->io); /* grouping_type */ + } + else if (1 == assignment_type) + { + mov_buffer_r32(&mov->io); /* grouping_type */ + mov_buffer_r32(&mov->io); /* grouping_type_parameter */ + } + else if (4 == assignment_type) + { + mov_buffer_r32(&mov->io); /* sub_track_id */ + } + } + + (void)box; + return mov_buffer_error(&mov->io); +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-mdhd.c b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-mdhd.c new file mode 100644 index 000000000..26833dd87 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-mdhd.c @@ -0,0 +1,76 @@ +#include "mov-internal.h" +#include + +// 8.4.2 Media Header Box (p35) +// Box Type: 'mdhd' +// Container: Media Box ('mdia') +// Mandatory: Yes +// Quantity: Exactly one + +/* +aligned(8) class MediaHeaderBox extends FullBox('mdhd', version, 0) { + if (version==1) { + unsigned int(64) creation_time; + unsigned int(64) modification_time; + unsigned int(32) timescale; + unsigned int(64) duration; + } else { // version==0 + unsigned int(32) creation_time; + unsigned int(32) modification_time; + unsigned int(32) timescale; + unsigned int(32) duration; + } + bit(1) pad = 0; + unsigned int(5)[3] language; // ISO-639-2/T language code + unsigned int(16) pre_defined = 0; +} +*/ +int mov_read_mdhd(struct mov_t* mov, const struct mov_box_t* box) +{ + uint32_t val; + struct mov_mdhd_t* mdhd = &mov->track->mdhd; + + mdhd->version = mov_buffer_r8(&mov->io); + mdhd->flags = mov_buffer_r24(&mov->io); + + if (1 == mdhd->version) + { + mdhd->creation_time = mov_buffer_r64(&mov->io); + mdhd->modification_time = mov_buffer_r64(&mov->io); + mdhd->timescale = mov_buffer_r32(&mov->io); + mdhd->duration = mov_buffer_r64(&mov->io); + } + else + { + assert(0 == mdhd->version); + mdhd->creation_time = mov_buffer_r32(&mov->io); + mdhd->modification_time = mov_buffer_r32(&mov->io); + mdhd->timescale = mov_buffer_r32(&mov->io); + mdhd->duration = mov_buffer_r32(&mov->io); + } + + val = mov_buffer_r32(&mov->io); + mdhd->language = (val >> 16) & 0x7FFF; + mdhd->pre_defined = val & 0xFFFF; + + (void)box; + return mov_buffer_error(&mov->io); +} + +size_t mov_write_mdhd(const struct mov_t* mov) +{ + const struct mov_mdhd_t* mdhd = &mov->track->mdhd; + + mov_buffer_w32(&mov->io, 32); /* size */ + mov_buffer_write(&mov->io, "mdhd", 4); + mov_buffer_w32(&mov->io, 0); /* version 1 & flags */ + + mov_buffer_w32(&mov->io, (uint32_t)mdhd->creation_time); /* creation_time */ + mov_buffer_w32(&mov->io, (uint32_t)mdhd->modification_time); /* modification_time */ + mov_buffer_w32(&mov->io, mdhd->timescale); /* timescale */ + mov_buffer_w32(&mov->io, (uint32_t)mdhd->duration); /* duration */ + + mov_buffer_w16(&mov->io, (uint16_t)mdhd->language); /* ISO-639-2/T language code */ + mov_buffer_w16(&mov->io, 0); /* pre_defined (quality) */ + return 32; +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-mehd.c b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-mehd.c new file mode 100644 index 000000000..dcb7387cd --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-mehd.c @@ -0,0 +1,33 @@ +#include "mov-internal.h" +#include +#include +#include +#include + +// 8.8.2 Movie Extends Header Box (p68) +int mov_read_mehd(struct mov_t* mov, const struct mov_box_t* box) +{ + unsigned int version; + uint64_t fragment_duration; + version = mov_buffer_r8(&mov->io); /* version */ + mov_buffer_r24(&mov->io); /* flags */ + + if (1 == version) + fragment_duration = mov_buffer_r64(&mov->io); /* fragment_duration*/ + else + fragment_duration = mov_buffer_r32(&mov->io); /* fragment_duration*/ + + (void)box; + //assert(fragment_duration <= mov->mvhd.duration); + return mov_buffer_error(&mov->io); +} + +size_t mov_write_mehd(const struct mov_t* mov) +{ + mov_buffer_w32(&mov->io, 20); /* size */ + mov_buffer_write(&mov->io, "mehd", 4); + mov_buffer_w8(&mov->io, 1); /* version */ + mov_buffer_w24(&mov->io, 0); /* flags */ + mov_buffer_w64(&mov->io, mov->mvhd.duration); // 0 ? + return 20; +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-mfhd.c b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-mfhd.c new file mode 100644 index 000000000..8adfac9f9 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-mfhd.c @@ -0,0 +1,22 @@ +#include "mov-internal.h" +#include +#include +#include + +// 8.8.5 Movie Fragment Header Box (p70) +int mov_read_mfhd(struct mov_t* mov, const struct mov_box_t* box) +{ + (void)box; + mov_buffer_r32(&mov->io); /* version & flags */ + mov_buffer_r32(&mov->io); /* sequence_number */ + return mov_buffer_error(&mov->io); +} + +size_t mov_write_mfhd(const struct mov_t* mov, uint32_t fragment) +{ + mov_buffer_w32(&mov->io, 16); /* size */ + mov_buffer_write(&mov->io, "mfhd", 4); + mov_buffer_w32(&mov->io, 0); /* version & flags */ + mov_buffer_w32(&mov->io, fragment); /* sequence_number */ + return 16; +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-minf.c b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-minf.c new file mode 100644 index 000000000..999d63214 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-minf.c @@ -0,0 +1,117 @@ +#include "mov-internal.h" +#include + +int mov_read_vmhd(struct mov_t* mov, const struct mov_box_t* box) +{ + mov_buffer_r8(&mov->io); /* version */ + mov_buffer_r24(&mov->io); /* flags */ + mov_buffer_r16(&mov->io); /* graphicsmode */ + // template unsigned int(16)[3] opcolor = {0, 0, 0}; + mov_buffer_skip(&mov->io, 6); + + (void)box; + return 0; +} + +int mov_read_smhd(struct mov_t* mov, const struct mov_box_t* box) +{ + mov_buffer_r8(&mov->io); /* version */ + mov_buffer_r24(&mov->io); /* flags */ + mov_buffer_r16(&mov->io); /* balance */ + //const unsigned int(16) reserved = 0; + mov_buffer_skip(&mov->io, 2); + + (void)box; + return 0; +} + +int mov_read_nmhd(struct mov_t* mov, const struct mov_box_t* box) +{ + mov_buffer_r8(&mov->io); /* version */ + mov_buffer_r24(&mov->io); /* flags */ + (void)box; + return 0; +} + +// https://developer.apple.com/library/archive/documentation/QuickTime/QTFF/QTFFChap2/qtff2.html#//apple_ref/doc/uid/TP40000939-CH204-25675 +/* +Size: A 32-bit integer that specifies the number of bytes in this base media info atom. +Type: A 32-bit integer that identifies the atom type; this field must be set to 'gmin'. +Version: A 1-byte specification of the version of this base media information header atom. +Flags: A 3-byte space for base media information flags. Set this field to 0. +Graphics mode: A 16-bit integer that specifies the transfer mode. The transfer mode specifies which Boolean operation QuickDraw should perform when drawing or transferring an image from one location to another. See Graphics Modes for more information about graphics modes supported by QuickTime. +Opcolor: Three 16-bit values that specify the red, green, and blue colors for the transfer mode operation indicated in the graphics mode field. +Balance: A 16-bit integer that specifies the sound balance of this media. Sound balance is the setting that controls the mix of sound between the two speakers of a computer. This field is normally set to 0. See Balance for more information about balance values. +Reserved: Reserved for use by Apple. A 16-bit integer. Set this field to 0 +*/ +int mov_read_gmin(struct mov_t* mov, const struct mov_box_t* box) +{ + mov_buffer_r8(&mov->io); /* version */ + mov_buffer_r24(&mov->io); /* flags */ + mov_buffer_r16(&mov->io); /* graphics mode */ + mov_buffer_r16(&mov->io); /* opcolor red*/ + mov_buffer_r16(&mov->io); /* opcolor green*/ + mov_buffer_r16(&mov->io); /* opcolor blue*/ + mov_buffer_r16(&mov->io); /* balance */ + mov_buffer_r16(&mov->io); /* reserved */ + + (void)box; + return 0; +} + +// https://developer.apple.com/library/archive/documentation/QuickTime/QTFF/QTFFChap3/qtff3.html#//apple_ref/doc/uid/TP40000939-CH205-SW90 +/* +Size:A 32-bit integer that specifies the number of bytes in this text media information atom. +Type:A 32-bit integer that identifies the atom type; this field must be set to 'text'. +Matrix structure:A matrix structure associated with this text media +*/ +int mov_read_text(struct mov_t* mov, const struct mov_box_t* box) +{ + int i; + // Matrix structure + for (i = 0; i < 9; i++) + mov_buffer_r32(&mov->io); + + (void)box; + return 0; +} + +size_t mov_write_vmhd(const struct mov_t* mov) +{ + mov_buffer_w32(&mov->io, 20); /* size (always 0x14) */ + mov_buffer_write(&mov->io, "vmhd", 4); + mov_buffer_w32(&mov->io, 0x01); /* version & flags */ + mov_buffer_w64(&mov->io, 0); /* reserved (graphics mode = copy) */ + return 20; +} + +size_t mov_write_smhd(const struct mov_t* mov) +{ + mov_buffer_w32(&mov->io, 16); /* size */ + mov_buffer_write(&mov->io, "smhd", 4); + mov_buffer_w32(&mov->io, 0); /* version & flags */ + mov_buffer_w16(&mov->io, 0); /* reserved (balance, normally = 0) */ + mov_buffer_w16(&mov->io, 0); /* reserved */ + return 16; +} + +size_t mov_write_nmhd(const struct mov_t* mov) +{ + mov_buffer_w32(&mov->io, 12); /* size */ + mov_buffer_write(&mov->io, "nmhd", 4); + mov_buffer_w32(&mov->io, 0); /* version & flags */ + return 12; +} + +/* +ISO/IEC 14496-12:2015(E) 12.6.2 Subtitle media header (p185) + aligned(8) class SubtitleMediaHeaderBox extends FullBox ('sthd', version = 0, flags = 0){ +} +*/ +size_t mov_write_sthd(const struct mov_t* mov) +{ + mov_buffer_w32(&mov->io, 12); /* size */ + mov_buffer_write(&mov->io, "sthd", 4); + mov_buffer_w32(&mov->io, 0); /* version & flags */ + return 12; +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-mvhd.c b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-mvhd.c new file mode 100644 index 000000000..f0035f1e7 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-mvhd.c @@ -0,0 +1,125 @@ +#include "mov-internal.h" +#include + +// ISO/IEC 14496-12:2012(E) +// 8.2.2.1 Movie Header Box (p30) +// Box Type : 'mvhd' +// Container : Movie Box('moov') +// Mandatory : Yes +// Quantity : Exactly one + +/* +aligned(8) class MovieHeaderBox extends FullBox('mvhd', version, 0) { + if (version==1) { + unsigned int(64) creation_time; + unsigned int(64) modification_time; + unsigned int(32) timescale; + unsigned int(64) duration; + } else { // version==0 + unsigned int(32) creation_time; + unsigned int(32) modification_time; + unsigned int(32) timescale; + unsigned int(32) duration; + } + template int(32) rate = 0x00010000; // typically 1.0 + template int(16) volume = 0x0100; // typically, full volume + const bit(16) reserved = 0; + const unsigned int(32)[2] reserved = 0; + template int(32)[9] matrix = { + 0x00010000,0,0,0,0x00010000,0,0,0,0x40000000 + }; // Unity matrix + bit(32)[6] pre_defined = 0; + unsigned int(32) next_track_ID; +} +*/ +int mov_read_mvhd(struct mov_t* mov, const struct mov_box_t* box) +{ + int i; + struct mov_mvhd_t* mvhd = &mov->mvhd; + + mvhd->version = mov_buffer_r8(&mov->io); + mvhd->flags = mov_buffer_r24(&mov->io); + + if (1 == mvhd->version) + { + mvhd->creation_time = mov_buffer_r64(&mov->io); + mvhd->modification_time = mov_buffer_r64(&mov->io); + mvhd->timescale = mov_buffer_r32(&mov->io); + mvhd->duration = mov_buffer_r64(&mov->io); + } + else + { + assert(0 == mvhd->version); + mvhd->creation_time = mov_buffer_r32(&mov->io); + mvhd->modification_time = mov_buffer_r32(&mov->io); + mvhd->timescale = mov_buffer_r32(&mov->io); + mvhd->duration = mov_buffer_r32(&mov->io); + } + + mvhd->rate = mov_buffer_r32(&mov->io); + mvhd->volume = (uint16_t)mov_buffer_r16(&mov->io); + //mvhd->reserved = mov_buffer_r16(&mov->io); + //mvhd->reserved2[0] = mov_buffer_r32(&mov->io); + //mvhd->reserved2[1] = mov_buffer_r32(&mov->io); + mov_buffer_skip(&mov->io, 10); + for (i = 0; i < 9; i++) + mvhd->matrix[i] = mov_buffer_r32(&mov->io); +#if 0 + for (i = 0; i < 6; i++) + mvhd->pre_defined[i] = mov_buffer_r32(&mov->io); +#else + mov_buffer_r32(&mov->io); /* preview time */ + mov_buffer_r32(&mov->io); /* preview duration */ + mov_buffer_r32(&mov->io); /* poster time */ + mov_buffer_r32(&mov->io); /* selection time */ + mov_buffer_r32(&mov->io); /* selection duration */ + mov_buffer_r32(&mov->io); /* current time */ +#endif + mvhd->next_track_ID = mov_buffer_r32(&mov->io); + + (void)box; + return 0; +} + +size_t mov_write_mvhd(const struct mov_t* mov) +{ +// int rotation = 0; // 90/180/270 + const struct mov_mvhd_t* mvhd = &mov->mvhd; + + mov_buffer_w32(&mov->io, 108); /* size */ + mov_buffer_write(&mov->io, "mvhd", 4); + mov_buffer_w32(&mov->io, 0); /* version & flags */ + + mov_buffer_w32(&mov->io, (uint32_t)mvhd->creation_time); /* creation_time */ + mov_buffer_w32(&mov->io, (uint32_t)mvhd->modification_time); /* modification_time */ + mov_buffer_w32(&mov->io, mvhd->timescale); /* timescale */ + mov_buffer_w32(&mov->io, (uint32_t)mvhd->duration); /* duration */ + + mov_buffer_w32(&mov->io, 0x00010000); /* rate 1.0 */ + mov_buffer_w16(&mov->io, 0x0100); /* volume 1.0 = normal */ + mov_buffer_w16(&mov->io, 0); /* reserved */ + mov_buffer_w32(&mov->io, 0); /* reserved */ + mov_buffer_w32(&mov->io, 0); /* reserved */ + + // matrix + mov_buffer_w32(&mov->io, 0x00010000); /* u */ + mov_buffer_w32(&mov->io, 0); + mov_buffer_w32(&mov->io, 0); + mov_buffer_w32(&mov->io, 0); /* v */ + mov_buffer_w32(&mov->io, 0x00010000); + mov_buffer_w32(&mov->io, 0); + mov_buffer_w32(&mov->io, 0); /* w */ + mov_buffer_w32(&mov->io, 0); + mov_buffer_w32(&mov->io, 0x40000000); + + mov_buffer_w32(&mov->io, 0); /* reserved (preview time) */ + mov_buffer_w32(&mov->io, 0); /* reserved (preview duration) */ + mov_buffer_w32(&mov->io, 0); /* reserved (poster time) */ + mov_buffer_w32(&mov->io, 0); /* reserved (selection time) */ + mov_buffer_w32(&mov->io, 0); /* reserved (selection duration) */ + mov_buffer_w32(&mov->io, 0); /* reserved (current time) */ + + mov_buffer_w32(&mov->io, mvhd->next_track_ID); /* Next track id */ + + return 108; +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-opus.c b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-opus.c new file mode 100644 index 000000000..4f9f12750 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-opus.c @@ -0,0 +1,77 @@ +#include "mov-internal.h" +#include +#include +#include +#include + +// http://www.opus-codec.org/docs/opus_in_isobmff.html +// 4.3.2 Opus Specific Box +/* +class ChannelMappingTable (unsigned int(8) OutputChannelCount){ + unsigned int(8) StreamCount; + unsigned int(8) CoupledCount; + unsigned int(8 * OutputChannelCount) ChannelMapping; +} + +aligned(8) class OpusSpecificBox extends Box('dOps'){ + unsigned int(8) Version; + unsigned int(8) OutputChannelCount; + unsigned int(16) PreSkip; + unsigned int(32) InputSampleRate; + signed int(16) OutputGain; + unsigned int(8) ChannelMappingFamily; + if (ChannelMappingFamily != 0) { + ChannelMappingTable(OutputChannelCount); + } +} +*/ + +int mov_read_dops(struct mov_t* mov, const struct mov_box_t* box) +{ + struct mov_track_t* track = mov->track; + struct mov_sample_entry_t* entry = track->stsd.current; + if(box->size >= 10) + { + if (entry->extra_data_size < box->size + 8) + { + void* p = realloc(entry->extra_data, (size_t)box->size + 8); + if (NULL == p) return -ENOMEM; + entry->extra_data = p; + } + + memcpy(entry->extra_data, "OpusHead", 8); + entry->extra_data[8] = 1; // OpusHead version + mov_buffer_r8(&mov->io); // version 0 + entry->extra_data[9] = mov_buffer_r8(&mov->io); // channel + entry->extra_data[11] = mov_buffer_r8(&mov->io); // PreSkip (MSB -> LSB) + entry->extra_data[10] = mov_buffer_r8(&mov->io); + entry->extra_data[15] = mov_buffer_r8(&mov->io); // InputSampleRate (LSB -> MSB) + entry->extra_data[14] = mov_buffer_r8(&mov->io); + entry->extra_data[13] = mov_buffer_r8(&mov->io); + entry->extra_data[12] = mov_buffer_r8(&mov->io); + entry->extra_data[17] = mov_buffer_r8(&mov->io); // OutputGain (LSB -> MSB) + entry->extra_data[16] = mov_buffer_r8(&mov->io); + mov_buffer_read(&mov->io, entry->extra_data + 18, (size_t)box->size - 10); + entry->extra_data_size = (int)box->size + 8; + } + return mov_buffer_error(&mov->io); +} + +size_t mov_write_dops(const struct mov_t* mov) +{ + const struct mov_track_t* track = mov->track; + const struct mov_sample_entry_t* entry = track->stsd.current; + if (entry->extra_data_size < 18) + return 0; + + assert(0 == memcmp(entry->extra_data, "OpusHead", 8)); + mov_buffer_w32(&mov->io, entry->extra_data_size); /* size */ + mov_buffer_write(&mov->io, "dOps", 4); + mov_buffer_w8(&mov->io, 0); // The Version field shall be set to 0. + mov_buffer_w8(&mov->io, entry->extra_data[9]); // channel count + mov_buffer_w16(&mov->io, (entry->extra_data[11]<<8) | entry->extra_data[10]); // PreSkip (LSB -> MSB) + mov_buffer_w32(&mov->io, (entry->extra_data[15]<<8) | (entry->extra_data[14]<<8) | (entry->extra_data[13]<<8) | entry->extra_data[12]); // InputSampleRate (LSB -> MSB) + mov_buffer_w16(&mov->io, (entry->extra_data[17]<<8) | entry->extra_data[16]); // OutputGain (LSB -> MSB) + mov_buffer_write(&mov->io, entry->extra_data + 18, entry->extra_data_size - 18); + return entry->extra_data_size; +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-reader.c b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-reader.c new file mode 100755 index 000000000..846b8e8f8 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-reader.c @@ -0,0 +1,727 @@ +#include "mov-reader.h" +#include "mov-internal.h" +#include +#include +#include +#include +#include +#include + +#define MOV_NULL MOV_TAG(0, 0, 0, 0) + +#define AV_TRACK_TIMEBASE 1000 + +//#define MOV_READER_BOX_TREE 1 +#define MOV_READER_FMP4_FAST 1 + +#define MOV_READER_FLAG_FMP4_FAST 0x01 + +struct mov_reader_t +{ + int flags; + int have_read_mfra; + + struct mov_t mov; +}; + +#define MOV_READER_FROM_MOV(ptr) ((struct mov_reader_t*)((char*)(ptr)-(ptrdiff_t)(&((struct mov_reader_t*)0)->mov))) + +struct mov_parse_t +{ + uint32_t type; + uint32_t parent; + int(*parse)(struct mov_t* mov, const struct mov_box_t* box); +}; + +static int mov_stss_seek(struct mov_track_t* track, int64_t *timestamp); +static int mov_sample_seek(struct mov_track_t* track, int64_t timestamp); + +// 8.1.1 Media Data Box (p28) +static int mov_read_mdat(struct mov_t* mov, const struct mov_box_t* box) +{ + mov_buffer_skip(&mov->io, box->size); + return mov_buffer_error(&mov->io); +} + +// 8.1.2 Free Space Box (p28) +static int mov_read_free(struct mov_t* mov, const struct mov_box_t* box) +{ + // Container: File or other box + mov_buffer_skip(&mov->io, box->size); + return mov_buffer_error(&mov->io); +} + +//static struct mov_sample_entry_t* mov_track_stsd_find(struct mov_track_t* track, uint32_t sample_description_index) +//{ +// if (sample_description_index > 0 && sample_description_index <= track->stsd.entry_count) +// return &track->stsd.entries[sample_description_index-1]; +// return NULL; +//} + +static int mov_index_build(struct mov_track_t* track) +{ + void* p; + uint32_t i, j; + struct mov_stbl_t* stbl = &track->stbl; + + if (stbl->stss_count > 0 || MOV_VIDEO != track->handler_type) + return 0; + + for (i = 0; i < track->sample_count; i++) + { + if (track->samples[i].flags & MOV_AV_FLAG_KEYFREAME) + ++stbl->stss_count; + } + + p = realloc(stbl->stss, sizeof(stbl->stss[0]) * stbl->stss_count); + if (!p) return -ENOMEM; + stbl->stss = p; + + for (j = i = 0; i < track->sample_count && j < stbl->stss_count; i++) + { + if (track->samples[i].flags & MOV_AV_FLAG_KEYFREAME) + stbl->stss[j++] = i + 1; // uint32_t sample_number, start from 1 + } + assert(j == stbl->stss_count); + return 0; +} + +// 8.3.1 Track Box (p31) +// Box Type : 'trak' +// Container : Movie Box('moov') +// Mandatory : Yes +// Quantity : One or more +static int mov_read_trak(struct mov_t* mov, const struct mov_box_t* box) +{ + int r; + + mov->track = NULL; + r = mov_reader_box(mov, box); + if (0 == r) + { + mov->track->tfdt_dts = 0; + if (mov->track->sample_count > 0) + { + mov_apply_stco(mov->track); + mov_apply_elst(mov->track); + mov_apply_stts(mov->track); + mov_apply_ctts(mov->track); + mov_apply_stss(mov->track); + + mov->track->tfdt_dts = mov->track->samples[mov->track->sample_count - 1].dts; + } + } + + return r; +} + +static int mov_read_dref(struct mov_t* mov, const struct mov_box_t* box) +{ + uint32_t i, entry_count; + mov_buffer_r8(&mov->io); /* version */ + mov_buffer_r24(&mov->io); /* flags */ + entry_count = mov_buffer_r32(&mov->io); + + for (i = 0; i < entry_count; i++) + { + uint32_t size = mov_buffer_r32(&mov->io); + /*uint32_t type = */mov_buffer_r32(&mov->io); + /*uint32_t vern = */mov_buffer_r32(&mov->io); /* version + flags */ + mov_buffer_skip(&mov->io, size-12); + } + + (void)box; + return 0; +} + +static int mov_read_btrt(struct mov_t* mov, const struct mov_box_t* box) +{ + // ISO/IEC 14496-15:2010(E) + // 5.3.4 AVC Video Stream Definition (p19) + mov_buffer_r32(&mov->io); /* bufferSizeDB */ + mov_buffer_r32(&mov->io); /* maxBitrate */ + mov_buffer_r32(&mov->io); /* avgBitrate */ + (void)box; + return 0; +} + +static int mov_read_uuid(struct mov_t* mov, const struct mov_box_t* box) +{ + uint8_t usertype[16] = { 0 }; + if(box->size > 16) + { + mov_buffer_read(&mov->io, usertype, sizeof(usertype)); + mov_buffer_skip(&mov->io, box->size - 16); + } + return mov_buffer_error(&mov->io); +} + +static int mov_read_moof(struct mov_t* mov, const struct mov_box_t* box) +{ + // 8.8.7 Track Fragment Header Box (p71) + // If base-data-offset-present not provided and if the default-base-is-moof flag is not set, + // the base-data-offset for the first track in the movie fragment is the position of + // the first byte of the enclosing Movie Fragment Box, for second and subsequent track fragments, + // the default is the end of the data defined by the preceding track fragment. + mov->moof_offset = mov->implicit_offset = mov_buffer_tell(&mov->io) - 8 /*box size */; + return mov_reader_box(mov, box); +} + +static int mov_read_mfra(struct mov_t* mov, const struct mov_box_t* box) +{ + int r; + struct mov_reader_t* reader; + reader = MOV_READER_FROM_MOV(mov); + r = mov_reader_box(mov, box); + reader->have_read_mfra = 1; + return r; +} + +// 8.8.11 Movie Fragment Random Access Offset Box (p75) +static int mov_read_mfro(struct mov_t* mov, const struct mov_box_t* box) +{ + (void)box; + mov_buffer_r32(&mov->io); /* version & flags */ + mov->mfro = mov_buffer_r32(&mov->io); /* size */ + return mov_buffer_error(&mov->io); +} + +int mov_reader_root(struct mov_t* mov) +{ + struct mov_box_t box; + + box.type = MOV_ROOT; + box.size = UINT64_MAX; +#if defined(DEBUG) || defined(_DEBUG) + box.level = 0; +#endif + + return mov_reader_box(mov, &box); +} + +static int mov_read_default(struct mov_t* mov, const struct mov_box_t* box) +{ + return mov_reader_box(mov, box); +} + +static struct mov_parse_t s_mov_parse_table[] = { + { MOV_TAG('a', 'v', '1', 'C'), MOV_NULL, mov_read_av1c }, // av1-isobmff + { MOV_TAG('a', 'v', 'c', 'C'), MOV_NULL, mov_read_avcc }, // ISO/IEC 14496-15:2010(E) avcC + { MOV_TAG('b', 't', 'r', 't'), MOV_NULL, mov_read_btrt }, // ISO/IEC 14496-15:2010(E) 5.3.4.1.1 Definition + { MOV_TAG('c', 'o', '6', '4'), MOV_STBL, mov_read_stco }, + { MOV_TAG('C', 'o', 'L', 'L'), MOV_STBL, mov_read_coll }, + { MOV_TAG('c', 't', 't', 's'), MOV_STBL, mov_read_ctts }, + { MOV_TAG('c', 's', 'l', 'g'), MOV_STBL, mov_read_cslg }, + { MOV_TAG('d', 'i', 'n', 'f'), MOV_MINF, mov_read_default }, + { MOV_TAG('d', 'O', 'p', 's'), MOV_NULL, mov_read_dops }, + { MOV_TAG('d', 'r', 'e', 'f'), MOV_DINF, mov_read_dref }, + { MOV_TAG('e', 'd', 't', 's'), MOV_TRAK, mov_read_default }, + { MOV_TAG('e', 'l', 's', 't'), MOV_EDTS, mov_read_elst }, + { MOV_TAG('e', 's', 'd', 's'), MOV_NULL, mov_read_esds }, // ISO/IEC 14496-14:2003(E) mp4a/mp4v/mp4s + { MOV_TAG('f', 'r', 'e', 'e'), MOV_NULL, mov_read_free }, + { MOV_TAG('f', 't', 'y', 'p'), MOV_ROOT, mov_read_ftyp }, + { MOV_TAG('g', 'm', 'i', 'n'), MOV_GMHD, mov_read_gmin }, // Apple QuickTime gmin + { MOV_TAG('g', 'm', 'h', 'd'), MOV_MINF, mov_read_default }, // Apple QuickTime gmhd + { MOV_TAG('h', 'd', 'l', 'r'), MOV_MDIA, mov_read_hdlr }, // Apple QuickTime minf also has hdlr + { MOV_TAG('h', 'v', 'c', 'C'), MOV_NULL, mov_read_hvcc }, // ISO/IEC 14496-15:2014 hvcC + { MOV_TAG('l', 'e', 'v', 'a'), MOV_MVEX, mov_read_leva }, + { MOV_TAG('m', 'd', 'a', 't'), MOV_ROOT, mov_read_mdat }, + { MOV_TAG('m', 'd', 'h', 'd'), MOV_MDIA, mov_read_mdhd }, + { MOV_TAG('m', 'd', 'i', 'a'), MOV_TRAK, mov_read_default }, + { MOV_TAG('m', 'e', 'h', 'd'), MOV_MVEX, mov_read_mehd }, + { MOV_TAG('m', 'f', 'h', 'd'), MOV_MOOF, mov_read_mfhd }, + { MOV_TAG('m', 'f', 'r', 'a'), MOV_ROOT, mov_read_mfra }, + { MOV_TAG('m', 'f', 'r', 'o'), MOV_MFRA, mov_read_mfro }, + { MOV_TAG('m', 'i', 'n', 'f'), MOV_MDIA, mov_read_default }, + { MOV_TAG('m', 'o', 'o', 'v'), MOV_ROOT, mov_read_default }, + { MOV_TAG('m', 'o', 'o', 'f'), MOV_ROOT, mov_read_moof }, + { MOV_TAG('m', 'v', 'e', 'x'), MOV_MOOV, mov_read_default }, + { MOV_TAG('m', 'v', 'h', 'd'), MOV_MOOV, mov_read_mvhd }, + { MOV_TAG('n', 'm', 'h', 'd'), MOV_MINF, mov_read_nmhd }, // ISO/IEC 14496-12:2015(E) 8.4.5.2 Null Media Header Box (p45) + { MOV_TAG('p', 'a', 's', 'p'), MOV_NULL, mov_read_pasp }, + { MOV_TAG('s', 'i', 'd', 'x'), MOV_ROOT, mov_read_sidx }, + { MOV_TAG('s', 'k', 'i', 'p'), MOV_NULL, mov_read_free }, + { MOV_TAG('S', 'm', 'D', 'm'), MOV_MINF, mov_read_smdm }, + { MOV_TAG('s', 'm', 'h', 'd'), MOV_MINF, mov_read_smhd }, + { MOV_TAG('s', 't', 'b', 'l'), MOV_MINF, mov_read_default }, + { MOV_TAG('s', 't', 'c', 'o'), MOV_STBL, mov_read_stco }, +// { MOV_TAG('s', 't', 'h', 'd'), MOV_MINF, mov_read_default }, // ISO/IEC 14496-12:2015(E) 12.6.2 Subtitle media header (p185) + { MOV_TAG('s', 't', 's', 'c'), MOV_STBL, mov_read_stsc }, + { MOV_TAG('s', 't', 's', 'd'), MOV_STBL, mov_read_stsd }, + { MOV_TAG('s', 't', 's', 's'), MOV_STBL, mov_read_stss }, + { MOV_TAG('s', 't', 's', 'z'), MOV_STBL, mov_read_stsz }, + { MOV_TAG('s', 't', 't', 's'), MOV_STBL, mov_read_stts }, + { MOV_TAG('s', 't', 'z', '2'), MOV_STBL, mov_read_stz2 }, + { MOV_TAG('t', 'e', 'x', 't'), MOV_GMHD, mov_read_text }, + { MOV_TAG('t', 'f', 'd', 't'), MOV_TRAF, mov_read_tfdt }, + { MOV_TAG('t', 'f', 'h', 'd'), MOV_TRAF, mov_read_tfhd }, + { MOV_TAG('t', 'f', 'r', 'a'), MOV_MFRA, mov_read_tfra }, + { MOV_TAG('t', 'k', 'h', 'd'), MOV_TRAK, mov_read_tkhd }, + { MOV_TAG('t', 'r', 'a', 'k'), MOV_MOOV, mov_read_trak }, + { MOV_TAG('t', 'r', 'e', 'x'), MOV_MVEX, mov_read_trex }, + { MOV_TAG('t', 'r', 'a', 'f'), MOV_MOOF, mov_read_default }, + { MOV_TAG('t', 'r', 'u', 'n'), MOV_TRAF, mov_read_trun }, + { MOV_TAG('u', 'd', 't', 'a'), MOV_MOOV, mov_read_udta }, + { MOV_TAG('u', 'u', 'i', 'd'), MOV_NULL, mov_read_uuid }, + { MOV_TAG('v', 'm', 'h', 'd'), MOV_MINF, mov_read_vmhd }, + { MOV_TAG('v', 'p', 'c', 'C'), MOV_NULL, mov_read_vpcc }, + + { 0, 0, NULL } // last +}; + +int mov_reader_box(struct mov_t* mov, const struct mov_box_t* parent) +{ + int i; + uint64_t bytes = 0; + struct mov_box_t box; + struct mov_reader_t* reader; + int (*parse)(struct mov_t* mov, const struct mov_box_t* box); + + reader = MOV_READER_FROM_MOV(mov); + while (bytes + 8 < parent->size && 0 == mov_buffer_error(&mov->io)) + { + uint64_t n = 8; + box.size = mov_buffer_r32(&mov->io); + box.type = mov_buffer_r32(&mov->io); + +#if defined(MOV_READER_BOX_TREE) && !defined(NDEBUG) + box.level = parent->level + 1; + for (i = 0; i < parent->level; i++) + printf("\t"); + printf("%c%c%c%c, size: %d\n", (char)(box.type >> 24), (char)(box.type >> 16), (char)(box.type >> 8), (char)box.type, (int)box.size); +#endif + + if (1 == box.size) + { + // unsigned int(64) large size + box.size = mov_buffer_r64(&mov->io); + n += 8; + } + else if (0 == box.size) + { + if (0 == box.type) + return 0; // all done + box.size = UINT64_MAX; + } + + if (UINT64_MAX == box.size) + { + bytes = parent->size; + } + else + { + bytes += box.size; + box.size -= n; + } + + if (bytes > parent->size) + return -1; + + for (i = 0, parse = NULL; s_mov_parse_table[i].type && !parse; i++) + { + if (s_mov_parse_table[i].type == box.type) + { + // Apple QuickTime minf also has hdlr + if(!s_mov_parse_table[i].parent || MOV_ROOT == parent->type || s_mov_parse_table[i].parent == parent->type) + parse = s_mov_parse_table[i].parse; + } + } + + if (NULL == parse) + { + mov_buffer_skip(&mov->io, box.size); + } + else + { + int r; + uint64_t pos, pos2; + pos = mov_buffer_tell(&mov->io); + r = parse(mov, &box); + assert(0 == r || mov_buffer_error(&mov->io)); + if (0 != r) return r; + pos2 = mov_buffer_tell(&mov->io); + assert(pos2 - pos == box.size); + mov_buffer_skip(&mov->io, box.size - (pos2 - pos)); + } + + // fmp4: read one-fragment only + if ((reader->flags & MOV_READER_FLAG_FMP4_FAST) && MOV_TAG('m', 'o', 'o', 'f') == box.type) + { + if (!reader->have_read_mfra) + { + mov_fragment_seek_read_mfra(mov); + reader->have_read_mfra = 1; // force, seek once only + } + + // skip fast mode, fallback to read all + if(mov->mfro > 0) + break; + } + } + + return mov_buffer_error(&mov->io) ? -1 : 0; +} + +static int mov_reader_init(struct mov_reader_t* reader) +{ + int i, r; + struct mov_t* mov; + struct mov_track_t* track; + + mov = &reader->mov; + r = mov_reader_root(mov); + if (0 != r) { /*return r;*/ } // ignore file read error(for streaming file) + + for (i = 0; i < mov->track_count; i++) + { + track = mov->tracks + i; + mov_index_build(track); + //track->sample_offset = 0; // reset + + // fragment mp4 + if (0 == track->mdhd.duration && track->sample_count > 0) + track->mdhd.duration = track->samples[track->sample_count - 1].dts - track->samples[0].dts; + if (0 == track->tkhd.duration) + track->tkhd.duration = track->mdhd.duration * mov->mvhd.timescale / track->mdhd.timescale; + if (track->tkhd.duration > mov->mvhd.duration) + mov->mvhd.duration = track->tkhd.duration; // maximum track duration + } + + return 0; +} + +struct mov_reader_t* mov_reader_create(const struct mov_buffer_t* buffer, void* param) +{ + struct mov_reader_t* reader; + reader = (struct mov_reader_t*)calloc(1, sizeof(*reader)); + if (NULL == reader) + return NULL; + +#if defined(MOV_READER_FMP4_FAST) + reader->flags |= MOV_READER_FLAG_FMP4_FAST; +#endif + + // ISO/IEC 14496-12:2012(E) 4.3.1 Definition (p17) + // Files with no file-type box should be read as if they contained an FTYP box + // with Major_brand='mp41', minor_version=0, and the single compatible brand 'mp41'. + reader->mov.ftyp.major_brand = MOV_BRAND_MP41; + reader->mov.ftyp.minor_version = 0; + reader->mov.ftyp.brands_count = 0; + reader->mov.header = 0; + + reader->mov.io.param = param; + memcpy(&reader->mov.io.io, buffer, sizeof(reader->mov.io.io)); + if (0 != mov_reader_init(reader)) + { + mov_reader_destroy(reader); + return NULL; + } + return reader; +} + +void mov_reader_destroy(struct mov_reader_t* reader) +{ + int i; + for (i = 0; i < reader->mov.track_count; i++) + mov_free_track(reader->mov.tracks + i); + if (reader->mov.tracks) + free(reader->mov.tracks); + free(reader); +} + +static struct mov_track_t* mov_reader_next(struct mov_reader_t* reader) +{ + int i; + int64_t dts, best_dts = 0; + struct mov_track_t* track = NULL; + struct mov_track_t* track2; + + for (i = 0; i < reader->mov.track_count; i++) + { + track2 = &reader->mov.tracks[i]; + assert(track2->sample_offset <= track2->sample_count); + if (track2->sample_offset >= track2->sample_count) + continue; + + dts = track2->samples[track2->sample_offset].dts * 1000 / track2->mdhd.timescale; + //if (NULL == track || dts < best_dts) + //if (NULL == track || track->samples[track->sample_offset].offset > track2->samples[track2->sample_offset].offset) + if (NULL == track || (dts < best_dts && best_dts - dts > AV_TRACK_TIMEBASE) || track2->samples[track2->sample_offset].offset < track->samples[track->sample_offset].offset) + { + track = track2; + best_dts = dts; + } + } + + return track; +} + +int mov_reader_read2(struct mov_reader_t* reader, mov_reader_onread2 onread, void* param) +{ + void* ptr; + struct mov_track_t* track; + struct mov_sample_t* sample; + +FMP4_NEXT_FRAGMENT: + track = mov_reader_next(reader); + if (NULL == track || 0 == track->mdhd.timescale) + { + if ((MOV_READER_FLAG_FMP4_FAST & reader->flags) && reader->have_read_mfra + && 0 == mov_fragment_read_next_moof(&reader->mov)) + { + goto FMP4_NEXT_FRAGMENT; + } + return 0; // EOF + } + + assert(track->sample_offset < track->sample_count); + sample = &track->samples[track->sample_offset]; + assert(sample->sample_description_index > 0); + ptr = onread(param, track->tkhd.track_ID, /*sample->sample_description_index-1,*/ sample->bytes, sample->pts * 1000 / track->mdhd.timescale, sample->dts * 1000 / track->mdhd.timescale, sample->flags); + if(!ptr) + return -ENOMEM; + + mov_buffer_seek(&reader->mov.io, sample->offset); + mov_buffer_read(&reader->mov.io, ptr, sample->bytes); + if (mov_buffer_error(&reader->mov.io)) + { + // TODO: user free buffer + return mov_buffer_error(&reader->mov.io); + } + + track->sample_offset++; //mark as read + return 1; +} + +static void* mov_reader_read_helper(void* param, uint32_t track, size_t bytes, int64_t pts, int64_t dts, int flags) +{ + struct mov_sample_t* sample; + sample = (struct mov_sample_t*)param; + if (sample->bytes < bytes) + return NULL; + + sample->pts = pts; + sample->dts = dts; + sample->flags = flags; + sample->bytes = (uint32_t)bytes; + sample->sample_description_index = track; + return sample->data; +} + +int mov_reader_read(struct mov_reader_t* reader, void* buffer, size_t bytes, mov_reader_onread onread, void* param) +{ + int r; + struct mov_sample_t sample; // temp + //memset(&sample, 0, sizeof(sample)); + sample.data = buffer; + sample.bytes = (uint32_t)bytes; + r = mov_reader_read2(reader, mov_reader_read_helper, &sample); + if (r <= 0) + return r; + + onread(param, sample.sample_description_index, buffer, sample.bytes, sample.pts, sample.dts, sample.flags); + return 1; +} + +int mov_reader_seek(struct mov_reader_t* reader, int64_t* timestamp) +{ + int i; + struct mov_track_t* track; + + if (reader->have_read_mfra && (MOV_READER_FLAG_FMP4_FAST & reader->flags) + && reader->mov.track_count > 0 && reader->mov.tracks[0].frag_count > 0) + return mov_fragment_seek(&reader->mov, timestamp); + + // seek video track(s) + for (i = 0; i < reader->mov.track_count; i++) + { + track = &reader->mov.tracks[i]; + if (MOV_VIDEO == track->handler_type && track->stbl.stss_count > 0) + { + if (0 != mov_stss_seek(track, timestamp)) + return -1; + } + } + + // seek other track(s) + for (i = 0; i < reader->mov.track_count; i++) + { + track = &reader->mov.tracks[i]; + if (MOV_VIDEO == track->handler_type && track->stbl.stss_count > 0) + continue; // seek done + + mov_sample_seek(track, *timestamp); + } + + return 0; +} + +int mov_reader_getinfo(struct mov_reader_t* reader, uint32_t index, struct mov_reader_trackinfo_t *ontrack, void* param) +{ + // int i; + uint32_t j; + struct mov_track_t* track; + struct mov_sample_entry_t* entry; + + // for (i = 0; i < reader->mov.track_count; i++) + { + track = &reader->mov.tracks[index]; + uint32_t time_scale = reader->mov.mvhd.timescale; + for (j = 0; j < track->stsd.entry_count && j < 1 /* only the first */; j++) + { + entry = &track->stsd.entries[j]; + switch (track->handler_type) + { + case MOV_VIDEO: + if(ontrack->onvideo) ontrack->onvideo(param, track->tkhd.track_ID, time_scale, entry->object_type_indication, entry->u.visual.width, entry->u.visual.height, entry->extra_data, entry->extra_data_size); + break; + + case MOV_AUDIO: + if (ontrack->onaudio) ontrack->onaudio(param, track->tkhd.track_ID, time_scale, entry->object_type_indication, entry->u.audio.channelcount, entry->u.audio.samplesize, entry->u.audio.samplerate >> 16, entry->extra_data, entry->extra_data_size); + break; + + case MOV_SUBT: + case MOV_TEXT: + case MOV_SBTL: + if (ontrack->onsubtitle) ontrack->onsubtitle(param, track->tkhd.track_ID, entry->object_type_indication, entry->extra_data, entry->extra_data_size); + break; + + default: + break; + } + } + } + return 0; +} + +uint64_t mov_reader_getduration(struct mov_reader_t* reader) +{ + return 0 != reader->mov.mvhd.timescale ? reader->mov.mvhd.duration * 1000 / reader->mov.mvhd.timescale : 0; +} + +uint32_t mov_reader_objectid(mov_reader_t* mov, uint32_t track_id) { + struct mov_track_t *track; + struct mov_sample_entry_t *entry; + + for (int i = 0; i < mov->mov.track_count; i++) { + track = &mov->mov.tracks[i]; + if (track->tkhd.track_ID == track_id) { + break; + } + } + + entry = &track->stsd.entries[0]; + + return entry->object_type_indication; +} + +uint32_t mov_reader_gettrackcount(mov_reader_t *mov) { + return mov->mov.track_count; +} + +void mov_reader_video_entry_info(mov_reader_t *mov, uint8_t *obj_id, uint8_t *extra_data, int *extra_data_size) { + struct mov_track_t *track; + struct mov_sample_entry_t *entry; + + for (int i = 0; i < mov->mov.track_count; i++) { + track = &mov->mov.tracks[i]; + for (int j = 0; j < track->stsd.entry_count && j < 1; j++) { + entry = &track->stsd.entries[j]; + if (MOV_OBJECT_H264 == entry->object_type_indication || + MOV_OBJECT_HEVC == entry->object_type_indication) { + memcpy(extra_data, entry->extra_data, entry->extra_data_size); + *extra_data_size = entry->extra_data_size; + *obj_id = entry->object_type_indication; + return; + } + } + } + printf("has not video track.\n"); + return; +} + +#define DIFF(a, b) ((a) > (b) ? ((a) - (b)) : ((b) - (a))) + +static int mov_stss_seek(struct mov_track_t* track, int64_t *timestamp) +{ + int64_t clock; + size_t start, end, mid; + size_t idx, prev, next; + struct mov_sample_t* sample; + + idx = mid = start = 0; + end = track->stbl.stss_count; + assert(track->stbl.stss_count > 0); + clock = *timestamp * track->mdhd.timescale / 1000; // mvhd timescale + + while (start < end) + { + mid = (start + end) / 2; + idx = track->stbl.stss[mid]; + + if (idx < 1 || idx > track->sample_count) + { + // start from 1 + assert(0); + return -1; + } + idx -= 1; + sample = &track->samples[idx]; + + if (sample->dts > clock) + end = mid; + else if (sample->dts < clock) + start = mid + 1; + else + break; + } + + prev = track->stbl.stss[mid > 0 ? mid - 1 : mid] - 1; + next = track->stbl.stss[mid + 1 < track->stbl.stss_count ? mid + 1 : mid] - 1; + if (DIFF(track->samples[prev].dts, clock) < DIFF(track->samples[idx].dts, clock)) + idx = prev; + if (DIFF(track->samples[next].dts, clock) < DIFF(track->samples[idx].dts, clock)) + idx = next; + + *timestamp = track->samples[idx].dts * 1000 / track->mdhd.timescale; + track->sample_offset = idx; + return 0; +} + +static int mov_sample_seek(struct mov_track_t* track, int64_t timestamp) +{ + size_t prev, next; + size_t start, end, mid; + struct mov_sample_t* sample; + + if (track->sample_count < 1) + return -1; + + sample = NULL; + mid = start = 0; + end = track->sample_count; + timestamp = timestamp * track->mdhd.timescale / 1000; // mvhd timecale + + while (start < end) + { + mid = (start + end) / 2; + sample = track->samples + mid; + + if (sample->dts > timestamp) + end = mid; + else if (sample->dts < timestamp) + start = mid + 1; + else + break; + } + + prev = mid > 0 ? mid - 1 : mid; + next = mid + 1 < track->sample_count ? mid + 1 : mid; + if (DIFF(track->samples[prev].dts, timestamp) < DIFF(track->samples[mid].dts, timestamp)) + mid = prev; + if (DIFF(track->samples[next].dts, timestamp) < DIFF(track->samples[mid].dts, timestamp)) + mid = next; + + track->sample_offset = mid; + return 0; +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-sidx.c b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-sidx.c new file mode 100644 index 000000000..029115f56 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-sidx.c @@ -0,0 +1,73 @@ +#include "mov-internal.h" +#include + +// 8.16.3 Segment Index Box (p119) +int mov_read_sidx(struct mov_t* mov, const struct mov_box_t* box) +{ + unsigned int version; + unsigned int i, reference_count; + + version = mov_buffer_r8(&mov->io); /* version */ + mov_buffer_r24(&mov->io); /* flags */ + mov_buffer_r32(&mov->io); /* reference_ID */ + mov_buffer_r32(&mov->io); /* timescale */ + + if (0 == version) + { + mov_buffer_r32(&mov->io); /* earliest_presentation_time */ + mov_buffer_r32(&mov->io); /* first_offset */ + } + else + { + mov_buffer_r64(&mov->io); /* earliest_presentation_time */ + mov_buffer_r64(&mov->io); /* first_offset */ + } + + mov_buffer_r16(&mov->io); /* reserved */ + reference_count = mov_buffer_r16(&mov->io); /* reference_count */ + for (i = 0; i < reference_count; i++) + { + mov_buffer_r32(&mov->io); /* reference_type & referenced_size */ + mov_buffer_r32(&mov->io); /* subsegment_duration */ + mov_buffer_r32(&mov->io); /* starts_with_SAP & SAP_type & SAP_delta_time */ + } + + (void)box; + return mov_buffer_error(&mov->io); +} + +size_t mov_write_sidx(const struct mov_t* mov, uint64_t offset) +{ + uint32_t duration; + uint64_t earliest_presentation_time; + const struct mov_track_t* track = mov->track; + + if (track->sample_count > 0) + { + earliest_presentation_time = track->samples[0].pts; + duration = (uint32_t)(track->samples[track->sample_count - 1].dts - track->samples[0].dts) + (uint32_t)track->turn_last_duration; + } + else + { + duration = 0; + earliest_presentation_time = 0; + } + + mov_buffer_w32(&mov->io, 52); /* size */ + mov_buffer_write(&mov->io, "sidx", 4); + mov_buffer_w8(&mov->io, 1); /* version */ + mov_buffer_w24(&mov->io, 0); /* flags */ + + mov_buffer_w32(&mov->io, track->tkhd.track_ID); /* reference_ID */ + mov_buffer_w32(&mov->io, track->mdhd.timescale); /* timescale */ + mov_buffer_w64(&mov->io, earliest_presentation_time); /* earliest_presentation_time */ + mov_buffer_w64(&mov->io, offset); /* first_offset */ + mov_buffer_w16(&mov->io, 0); /* reserved */ + mov_buffer_w16(&mov->io, 1); /* reference_count */ + + mov_buffer_w32(&mov->io, 0); /* reference_type & referenced_size */ + mov_buffer_w32(&mov->io, duration); /* subsegment_duration */ + mov_buffer_w32(&mov->io, (1U/*starts_with_SAP*/ << 31) | (1 /*SAP_type*/ << 28) | 0 /*SAP_delta_time*/); + + return 52; +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-stco.c b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-stco.c new file mode 100644 index 000000000..dbec696f2 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-stco.c @@ -0,0 +1,174 @@ +#include "mov-internal.h" +#include +#include +#include + +// 8.7.5 Chunk Offset Box (p58) +/* +aligned(8) class ChunkOffsetBox extends FullBox('stco', version = 0, 0) { + unsigned int(32) entry_count; + for (i=1; i <= entry_count; i++) { + unsigned int(32) chunk_offset; + } +} + +aligned(8) class ChunkLargeOffsetBox extends FullBox('co64', version = 0, 0) { + unsigned int(32) entry_count; + for (i=1; i <= entry_count; i++) { + unsigned int(64) chunk_offset; + } +} +*/ + +int mov_read_stco(struct mov_t* mov, const struct mov_box_t* box) +{ + uint32_t i, entry_count; + struct mov_stbl_t* stbl = &mov->track->stbl; + + mov_buffer_r8(&mov->io); /* version */ + mov_buffer_r24(&mov->io); /* flags */ + entry_count = mov_buffer_r32(&mov->io); + + assert(0 == stbl->stco_count && NULL == stbl->stco); + if (stbl->stco_count < entry_count) + { + void* p = realloc(stbl->stco, sizeof(stbl->stco[0]) * entry_count); + if (NULL == p) return -ENOMEM; + stbl->stco = p; + } + stbl->stco_count = entry_count; + + if (MOV_TAG('s', 't', 'c', 'o') == box->type) + { + for (i = 0; i < entry_count; i++) + stbl->stco[i] = mov_buffer_r32(&mov->io); // chunk_offset + } + else if (MOV_TAG('c', 'o', '6', '4') == box->type) + { + for (i = 0; i < entry_count; i++) + stbl->stco[i] = mov_buffer_r64(&mov->io); // chunk_offset + } + else + { + i = 0; + assert(0); + } + + stbl->stco_count = i; + return mov_buffer_error(&mov->io); +} + +size_t mov_write_stco(const struct mov_t* mov, uint32_t count) +{ + int co64; + uint32_t size, i; + const struct mov_sample_t* sample; + const struct mov_track_t* track = mov->track; + + sample = track->sample_count > 0 ? &track->samples[track->sample_count - 1] : NULL; + co64 = (sample && sample->offset + track->offset > UINT32_MAX) ? 1 : 0; + size = 12/* full box */ + 4/* entry count */ + count * (co64 ? 8 : 4); + + mov_buffer_w32(&mov->io, size); /* size */ + mov_buffer_write(&mov->io, co64 ? "co64" : "stco", 4); + mov_buffer_w32(&mov->io, 0); /* version & flags */ + mov_buffer_w32(&mov->io, count); /* entry count */ + + for (i = 0; i < track->sample_count; i++) + { + sample = track->samples + i; + if(0 == sample->first_chunk) + continue; + + if(0 == co64) + mov_buffer_w32(&mov->io, (uint32_t)(sample->offset + track->offset)); + else + mov_buffer_w64(&mov->io, sample->offset + track->offset); + } + + return size; +} + +size_t mov_stco_size(const struct mov_track_t* track, uint64_t offset) +{ + size_t i, j; + uint64_t co64; + const struct mov_sample_t* sample; + + if (track->sample_count < 1) + return 0; + + sample = &track->samples[track->sample_count - 1]; + co64 = sample->offset + track->offset; + if (co64 > UINT32_MAX || co64 + offset <= UINT32_MAX) + return 0; + + for (i = 0, j = 0; i < track->sample_count; i++) + { + sample = track->samples + i; + if (0 != sample->first_chunk) + j++; + } + + return j * 4; +} + +uint32_t mov_build_stco(struct mov_track_t* track) +{ + size_t i; + size_t bytes = 0; + uint32_t count = 0; + struct mov_sample_t* sample = NULL; + + assert(track->stsd.entry_count > 0); + for (i = 0; i < track->sample_count; i++) + { + if (NULL != sample + && sample->offset + bytes == track->samples[i].offset + && sample->sample_description_index == track->samples[i].sample_description_index) + { + track->samples[i].first_chunk = 0; // mark invalid value + bytes += track->samples[i].bytes; + ++sample->samples_per_chunk; + } + else + { + sample = &track->samples[i]; + sample->first_chunk = ++count; // chunk start from 1 + sample->samples_per_chunk = 1; + bytes = sample->bytes; + } + } + + return count; +} + +void mov_apply_stco(struct mov_track_t* track) +{ + uint32_t i, j, k; + uint64_t n, chunk_offset; + struct mov_stbl_t* stbl = &track->stbl; + + // sample offset + assert(stbl->stsc_count > 0 && stbl->stco_count > 0); + stbl->stsc[stbl->stsc_count].first_chunk = stbl->stco_count + 1; // fill stco count + for (i = 0, n = 0; i < stbl->stsc_count; i++) + { + assert(stbl->stsc[i].first_chunk <= stbl->stco_count); + for (j = stbl->stsc[i].first_chunk; j < stbl->stsc[i + 1].first_chunk; j++) + { + chunk_offset = stbl->stco[j - 1]; // chunk start from 1 + for (k = 0; k < stbl->stsc[i].samples_per_chunk; k++, n++) + { + track->samples[n].sample_description_index = stbl->stsc[i].sample_description_index; + track->samples[n].offset = chunk_offset; + track->samples[n].data = NULL; + chunk_offset += track->samples[n].bytes; + assert(track->samples[n].bytes > 0); + assert(0 == n || track->samples[n - 1].offset + track->samples[n - 1].bytes <= track->samples[n].offset); + } + } + } + + assert(n == track->sample_count); +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-stsc.c b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-stsc.c new file mode 100644 index 000000000..3601c45f7 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-stsc.c @@ -0,0 +1,86 @@ +#include "mov-internal.h" +#include +#include +#include + +// 8.7.4 Sample To Chunk Box (p57) +/* +aligned(8) class SampleToChunkBox extends FullBox('stsc', version = 0, 0) { + unsigned int(32) entry_count; + for (i=1; i <= entry_count; i++) { + unsigned int(32) first_chunk; + unsigned int(32) samples_per_chunk; + unsigned int(32) sample_description_index; + } +} +*/ +int mov_read_stsc(struct mov_t* mov, const struct mov_box_t* box) +{ + uint32_t i, entry_count; + struct mov_stbl_t* stbl = &mov->track->stbl; + + mov_buffer_r8(&mov->io); /* version */ + mov_buffer_r24(&mov->io); /* flags */ + entry_count = mov_buffer_r32(&mov->io); + + assert(0 == stbl->stsc_count && NULL == stbl->stsc); // duplicated STSC atom + if (stbl->stsc_count < entry_count) + { + void* p = realloc(stbl->stsc, sizeof(struct mov_stsc_t) * (entry_count + 1/*stco count*/)); + if (NULL == p) return -ENOMEM; + stbl->stsc = (struct mov_stsc_t*)p; + } + stbl->stsc_count = entry_count; + + for (i = 0; i < entry_count; i++) + { + stbl->stsc[i].first_chunk = mov_buffer_r32(&mov->io); + stbl->stsc[i].samples_per_chunk = mov_buffer_r32(&mov->io); + stbl->stsc[i].sample_description_index = mov_buffer_r32(&mov->io); + } + + (void)box; + return mov_buffer_error(&mov->io); +} + +size_t mov_write_stsc(const struct mov_t* mov) +{ + uint64_t offset; + uint64_t offset2; + uint32_t size, i, entry; + const struct mov_sample_t* chunk = NULL; + const struct mov_sample_t* sample = NULL; + const struct mov_track_t* track = mov->track; + + size = 12/* full box */ + 4/* entry count */; + + offset = mov_buffer_tell(&mov->io); + mov_buffer_w32(&mov->io, 0); /* size */ + mov_buffer_write(&mov->io, "stsc", 4); + mov_buffer_w32(&mov->io, 0); /* version & flags */ + mov_buffer_w32(&mov->io, 0); /* entry count */ + + for (i = 0, entry = 0; i < track->sample_count; i++) + { + sample = &track->samples[i]; + if (0 == sample->first_chunk || + (chunk && chunk->samples_per_chunk == sample->samples_per_chunk + && chunk->sample_description_index == sample->sample_description_index)) + continue; + + ++entry; + chunk = sample; + mov_buffer_w32(&mov->io, sample->first_chunk); + mov_buffer_w32(&mov->io, sample->samples_per_chunk); + mov_buffer_w32(&mov->io, sample->sample_description_index); + } + + size += entry * 12/* entry size*/; + offset2 = mov_buffer_tell(&mov->io); + mov_buffer_seek(&mov->io, offset); + mov_buffer_w32(&mov->io, size); /* size */ + mov_buffer_seek(&mov->io, offset + 12); + mov_buffer_w32(&mov->io, entry); /* entry count */ + mov_buffer_seek(&mov->io, offset2); + return size; +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-stsd.c b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-stsd.c new file mode 100644 index 000000000..cb44ba7ef --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-stsd.c @@ -0,0 +1,554 @@ +#include "mov-internal.h" +#include +#include +#include +#include + +// stsd: Sample Description Box + +int mp4_read_extra(struct mov_t* mov, const struct mov_box_t* box) +{ + int r; + uint64_t p1, p2; + p1 = mov_buffer_tell(&mov->io); + r = mov_reader_box(mov, box); + p2 = mov_buffer_tell(&mov->io); + mov_buffer_skip(&mov->io, box->size - (p2 - p1)); + return r; +} + +/* +aligned(8) abstract class SampleEntry (unsigned int(32) format) + extends Box(format){ + const unsigned int(8)[6] reserved = 0; + unsigned int(16) data_reference_index; +} +*/ +static int mov_read_sample_entry(struct mov_t* mov, struct mov_box_t* box, uint16_t* data_reference_index) +{ + box->size = mov_buffer_r32(&mov->io); + box->type = mov_buffer_r32(&mov->io); + mov_buffer_skip(&mov->io, 6); // const unsigned int(8)[6] reserved = 0; + *data_reference_index = (uint16_t)mov_buffer_r16(&mov->io); // ref [dref] + return 0; +} + +/* +class AudioSampleEntry(codingname) extends SampleEntry (codingname){ + const unsigned int(32)[2] reserved = 0; + template unsigned int(16) channelcount = 2; + template unsigned int(16) samplesize = 16; + unsigned int(16) pre_defined = 0; + const unsigned int(16) reserved = 0 ; + template unsigned int(32) samplerate = { default samplerate of media}<<16; +} +*/ +static int mov_read_audio(struct mov_t* mov, struct mov_sample_entry_t* entry) +{ + uint16_t qtver; + struct mov_box_t box; + mov_read_sample_entry(mov, &box, &entry->data_reference_index); + entry->object_type_indication = mov_tag_to_object(box.type); + entry->stream_type = MP4_STREAM_AUDIO; + mov->track->tag = box.type; + +#if 0 + // const unsigned int(32)[2] reserved = 0; + mov_buffer_skip(&mov->io, 8); +#else + qtver = mov_buffer_r16(&mov->io); /* version */ + mov_buffer_r16(&mov->io); /* revision level */ + mov_buffer_r32(&mov->io); /* vendor */ +#endif + + entry->u.audio.channelcount = (uint16_t)mov_buffer_r16(&mov->io); + entry->u.audio.samplesize = (uint16_t)mov_buffer_r16(&mov->io); + +#if 0 + // unsigned int(16) pre_defined = 0; + // const unsigned int(16) reserved = 0 ; + mov_buffer_skip(&mov->io, 4); +#else + mov_buffer_r16(&mov->io); /* audio cid */ + mov_buffer_r16(&mov->io); /* packet size = 0 */ +#endif + + entry->u.audio.samplerate = mov_buffer_r32(&mov->io); // { default samplerate of media}<<16; + + // audio extra(avc1: ISO/IEC 14496-14:2003(E)) + box.size -= 36; + + // https://developer.apple.com/library/archive/documentation/QuickTime/QTFF/QTFFChap3/qtff3.html#//apple_ref/doc/uid/TP40000939-CH205-124774 + if (1 == qtver && box.size >= 16) + { + // Sound Sample Description (Version 1) + mov_buffer_r32(&mov->io); // Samples per packet + mov_buffer_r32(&mov->io); // Bytes per packet + mov_buffer_r32(&mov->io); // Bytes per frame + mov_buffer_r32(&mov->io); // Bytes per sample + box.size -= 16; + } + else if (2 == qtver && box.size >= 36) + { + // Sound Sample Description (Version 2) + mov_buffer_r32(&mov->io); // sizeOfStructOnly + mov_buffer_r64(&mov->io); // audioSampleRate + mov_buffer_r32(&mov->io); // numAudioChannels + mov_buffer_r32(&mov->io); // always7F000000 + mov_buffer_r32(&mov->io); // constBitsPerChannel + mov_buffer_r32(&mov->io); // formatSpecificFlags + mov_buffer_r32(&mov->io); // constBytesPerAudioPacket + mov_buffer_r32(&mov->io); // constLPCMFramesPerAudioPacket + box.size -= 36; + } + + return mp4_read_extra(mov, &box); +} + +/* +class VisualSampleEntry(codingname) extends SampleEntry (codingname){ + unsigned int(16) pre_defined = 0; + const unsigned int(16) reserved = 0; + unsigned int(32)[3] pre_defined = 0; + unsigned int(16) width; + unsigned int(16) height; + template unsigned int(32) horizresolution = 0x00480000; // 72 dpi + template unsigned int(32) vertresolution = 0x00480000; // 72 dpi + const unsigned int(32) reserved = 0; + template unsigned int(16) frame_count = 1; + string[32] compressorname; + template unsigned int(16) depth = 0x0018; + int(16) pre_defined = -1; + // other boxes from derived specifications + CleanApertureBox clap; // optional + PixelAspectRatioBox pasp; // optional +} +class AVCSampleEntry() extends VisualSampleEntry ('avc1'){ + AVCConfigurationBox config; + MPEG4BitRateBox (); // optional + MPEG4ExtensionDescriptorsBox (); // optional +} +class AVC2SampleEntry() extends VisualSampleEntry ('avc2'){ + AVCConfigurationBox avcconfig; + MPEG4BitRateBox bitrate; // optional + MPEG4ExtensionDescriptorsBox descr; // optional + extra_boxes boxes; // optional +} +*/ +static int mov_read_video(struct mov_t* mov, struct mov_sample_entry_t* entry) +{ + struct mov_box_t box; + mov_read_sample_entry(mov, &box, &entry->data_reference_index); + entry->object_type_indication = mov_tag_to_object(box.type); + entry->stream_type = MP4_STREAM_VISUAL; + mov->track->tag = box.type; +#if 1 + //unsigned int(16) pre_defined = 0; + //const unsigned int(16) reserved = 0; + //unsigned int(32)[3] pre_defined = 0; + mov_buffer_skip(&mov->io, 16); +#else + mov_buffer_r16(&mov->io); /* version */ + mov_buffer_r16(&mov->io); /* revision level */ + mov_buffer_r32(&mov->io); /* vendor */ + mov_buffer_r32(&mov->io); /* temporal quality */ + mov_buffer_r32(&mov->io); /* spatial quality */ +#endif + entry->u.visual.width = (uint16_t)mov_buffer_r16(&mov->io); + entry->u.visual.height = (uint16_t)mov_buffer_r16(&mov->io); + entry->u.visual.horizresolution = mov_buffer_r32(&mov->io); // 0x00480000 - 72 dpi + entry->u.visual.vertresolution = mov_buffer_r32(&mov->io); // 0x00480000 - 72 dpi + // const unsigned int(32) reserved = 0; + mov_buffer_r32(&mov->io); /* data size, always 0 */ + entry->u.visual.frame_count = (uint16_t)mov_buffer_r16(&mov->io); + + //string[32] compressorname; + //uint32_t len = mov_buffer_r8(&mov->io); + //mov_buffer_skip(&mov->io, len); + mov_buffer_skip(&mov->io, 32); + + entry->u.visual.depth = (uint16_t)mov_buffer_r16(&mov->io); + // int(16) pre_defined = -1; + mov_buffer_skip(&mov->io, 2); + + // video extra(avc1: ISO/IEC 14496-15:2010(E)) + box.size -= 86; + return mp4_read_extra(mov, &box); +} + +/* +class PixelAspectRatioBox extends Box(pasp?{ + unsigned int(32) hSpacing; + unsigned int(32) vSpacing; +} +*/ +int mov_read_pasp(struct mov_t* mov, const struct mov_box_t* box) +{ + mov_buffer_r32(&mov->io); + mov_buffer_r32(&mov->io); + + (void)box; + return 0; +} + +static int mov_read_hint_sample_entry(struct mov_t* mov, struct mov_sample_entry_t* entry) +{ + struct mov_box_t box; + mov_read_sample_entry(mov, &box, &entry->data_reference_index); + mov_buffer_skip(&mov->io, box.size - 16); + mov->track->tag = box.type; + return mov_buffer_error(&mov->io); +} + +static int mov_read_meta_sample_entry(struct mov_t* mov, struct mov_sample_entry_t* entry) +{ + struct mov_box_t box; + mov_read_sample_entry(mov, &box, &entry->data_reference_index); + mov_buffer_skip(&mov->io, box.size - 16); + mov->track->tag = box.type; + return mov_buffer_error(&mov->io); +} + +// ISO/IEC 14496-12:2015(E) 12.5 Text media (p184) +/* +class PlainTextSampleEntry(codingname) extends SampleEntry (codingname) { +} +class SimpleTextSampleEntry(codingname) extends PlainTextSampleEntry ('stxt') { + string content_encoding; // optional + string mime_format; + BitRateBox (); // optional + TextConfigBox (); // optional +} +*/ +static int mov_read_text_sample_entry(struct mov_t* mov, struct mov_sample_entry_t* entry) +{ + struct mov_box_t box; + mov_read_sample_entry(mov, &box, &entry->data_reference_index); + if (MOV_TEXT == box.type) + { + // https://developer.apple.com/library/archive/documentation/QuickTime/QTFF/QTFFChap3/qtff3.html#//apple_ref/doc/uid/TP40000939-CH205-69835 + //mov_buffer_r32(&mov->io); /* display flags */ + //mov_buffer_r32(&mov->io); /* text justification */ + //mov_buffer_r16(&mov->io); /* background color: 48-bit RGB color */ + //mov_buffer_r16(&mov->io); + //mov_buffer_r16(&mov->io); + //mov_buffer_r64(&mov->io); /* default text box (top, left, bottom, right) */ + //mov_buffer_r64(&mov->io); /* reserved */ + //mov_buffer_r16(&mov->io); /* font number */ + //mov_buffer_r16(&mov->io); /* font face */ + //mov_buffer_r8(&mov->io); /* reserved */ + //mov_buffer_r16(&mov->io); /* reserved */ + //mov_buffer_r16(&mov->io); /* foreground color: 48-bit RGB color */ + //mov_buffer_r16(&mov->io); + //mov_buffer_r16(&mov->io); + ////mov_buffer_r16(&mov->io); /* text name */ + mov_buffer_skip(&mov->io, box.size - 16); + } + else + { + mov_buffer_skip(&mov->io, box.size - 16); + } + + mov->track->tag = box.type; + return mov_buffer_error(&mov->io); +} + +// ISO/IEC 14496-12:2015(E) 12.6 Subtitle media (p185) +/* +class SubtitleSampleEntry(codingname) extends SampleEntry (codingname) { +} +class XMLSubtitleSampleEntry() extends SubtitleSampleEntry('stpp') { + string namespace; + string schema_location; // optional + string auxiliary_mime_types; + // optional, required if auxiliary resources are present + BitRateBox (); // optional +} +class TextSubtitleSampleEntry() extends SubtitleSampleEntry('sbtt') { + string content_encoding; // optional + string mime_format; + BitRateBox (); // optional + TextConfigBox (); // optional +} +class TextSampleEntry() extends SampleEntry('tx3g') { + unsigned int(32) displayFlags; + signed int(8) horizontal-justification; + signed int(8) vertical-justification; + unsigned int(8) background-color-rgba[4]; + BoxRecord default-text-box; + StyleRecord default-style; + FontTableBox font-table; + DisparityBox default-disparity; +} +*/ +static int mov_read_subtitle_sample_entry(struct mov_t* mov, struct mov_sample_entry_t* entry) +{ + struct mov_box_t box; + mov_read_sample_entry(mov, &box, &entry->data_reference_index); + box.size -= 16; + if (box.type == MOV_TAG('t', 'x', '3', 'g')) + { + mov_read_tx3g(mov, &box); + } + else + { + mov_buffer_skip(&mov->io, box.size - 16); + } + + entry->object_type_indication = MOV_OBJECT_TEXT; + entry->stream_type = MP4_STREAM_VISUAL; + mov->track->tag = box.type; + return mov_buffer_error(&mov->io); +} + +int mov_read_stsd(struct mov_t* mov, const struct mov_box_t* box) +{ + uint32_t i, entry_count; + struct mov_track_t* track = mov->track; + + mov_buffer_r8(&mov->io); + mov_buffer_r24(&mov->io); + entry_count = mov_buffer_r32(&mov->io); + + if (track->stsd.entry_count < entry_count) + { + void* p = realloc(track->stsd.entries, sizeof(track->stsd.entries[0]) * entry_count); + if (NULL == p) return -ENOMEM; + track->stsd.entries = (struct mov_sample_entry_t*)p; + } + + track->stsd.entry_count = entry_count; + for (i = 0; i < entry_count; i++) + { + track->stsd.current = &track->stsd.entries[i]; + memset(track->stsd.current, 0, sizeof(*track->stsd.current)); + if (MOV_AUDIO == track->handler_type) + { + mov_read_audio(mov, &track->stsd.entries[i]); + } + else if (MOV_VIDEO == track->handler_type) + { + mov_read_video(mov, &track->stsd.entries[i]); + } + else if (MOV_HINT == track->handler_type) + { + mov_read_hint_sample_entry(mov, &track->stsd.entries[i]); + } + else if (MOV_META == track->handler_type) + { + mov_read_meta_sample_entry(mov, &track->stsd.entries[i]); + } + else if (MOV_CLCP == track->handler_type) + { + mov_read_meta_sample_entry(mov, &track->stsd.entries[i]); + } + else if (MOV_TEXT == track->handler_type) + { + mov_read_text_sample_entry(mov, &track->stsd.entries[i]); + } + else if (MOV_SUBT == track->handler_type || MOV_SBTL == track->handler_type) + { + mov_read_subtitle_sample_entry(mov, &track->stsd.entries[i]); + } + else if (MOV_ALIS == track->handler_type) + { + mov_read_meta_sample_entry(mov, &track->stsd.entries[i]); + } + else + { + assert(0); // ignore + mov_read_meta_sample_entry(mov, &track->stsd.entries[i]); + } + } + + (void)box; + return mov_buffer_error(&mov->io); +} + +//static int mov_write_h264(const struct mov_t* mov) +//{ +// size_t size; +// uint64_t offset; +// const struct mov_track_t* track = mov->track; +// +// size = 8 /* Box */; +// +// offset = mov_buffer_tell(&mov->io); +// mov_buffer_w32(&mov->io, 0); /* size */ +// mov_buffer_w32(&mov->io, MOV_TAG('a', 'v', 'c', 'C')); +// +// mov_write_size(mov, offset, size); /* update size */ +// return size; +//} + +static size_t mov_write_video(const struct mov_t* mov, const struct mov_sample_entry_t* entry) +{ + size_t size; + uint64_t offset; + char compressorname[32]; + memset(compressorname, 0, sizeof(compressorname)); + assert(1 == entry->data_reference_index); + + size = 8 /* Box */ + 8 /* SampleEntry */ + 70 /* VisualSampleEntry */; + + offset = mov_buffer_tell(&mov->io); + mov_buffer_w32(&mov->io, 0); /* size */ + mov_buffer_w32(&mov->io, mov->track->tag); // "h264" + + mov_buffer_w32(&mov->io, 0); /* Reserved */ + mov_buffer_w16(&mov->io, 0); /* Reserved */ + mov_buffer_w16(&mov->io, entry->data_reference_index); /* Data-reference index */ + + mov_buffer_w16(&mov->io, 0); /* Reserved / Codec stream version */ + mov_buffer_w16(&mov->io, 0); /* Reserved / Codec stream revision (=0) */ + mov_buffer_w32(&mov->io, 0); /* Reserved */ + mov_buffer_w32(&mov->io, 0); /* Reserved */ + mov_buffer_w32(&mov->io, 0); /* Reserved */ + + mov_buffer_w16(&mov->io, entry->u.visual.width); /* Video width */ + mov_buffer_w16(&mov->io, entry->u.visual.height); /* Video height */ + mov_buffer_w32(&mov->io, 0x00480000); /* Horizontal resolution 72dpi */ + mov_buffer_w32(&mov->io, 0x00480000); /* Vertical resolution 72dpi */ + mov_buffer_w32(&mov->io, 0); /* reserved / Data size (= 0) */ + mov_buffer_w16(&mov->io, 1); /* Frame count (= 1) */ + + // ISO 14496-15:2017 AVCC \012AVC Coding + // ISO 14496-15:2017 HVCC \013HEVC Coding + //mov_buffer_w8(&mov->io, 0 /*strlen(compressor_name)*/); /* compressorname */ + mov_buffer_write(&mov->io, compressorname, 32); // fill empty + + // ISO/IEC 14496-15:2017 4.5 Template field used (19) + // 0x18 - the video sequence is in color with no alpha + // 0x28 - the video sequence is in grayscale with no alpha + // 0x20 - the video sequence has alpha (gray or color) + mov_buffer_w16(&mov->io, 0x18); /* Reserved */ + mov_buffer_w16(&mov->io, 0xffff); /* Reserved */ + + if(MOV_OBJECT_H264 == entry->object_type_indication) + size += mov_write_avcc(mov); + else if (MOV_OBJECT_H265 == entry->object_type_indication) + size += mov_write_hvcc(mov); + else if (MOV_OBJECT_H266 == entry->object_type_indication) + size += mov_write_vvcc(mov); + else if (MOV_OBJECT_MP4V == entry->object_type_indication || MOV_OBJECT_JPEG == entry->object_type_indication || MOV_OBJECT_PNG == entry->object_type_indication || MOV_OBJECT_JPEG2000 == entry->object_type_indication) + size += mov_write_esds(mov); + else if (MOV_OBJECT_AV1 == entry->object_type_indication) + size += mov_write_av1c(mov); + else if (MOV_OBJECT_VP8 == entry->object_type_indication || MOV_OBJECT_VP9 == entry->object_type_indication) + size += mov_write_vpcc(mov); + + mov_write_size(mov, offset, size); /* update size */ + return size; +} + +static size_t mov_write_audio(const struct mov_t* mov, const struct mov_sample_entry_t* entry) +{ + size_t size; + uint64_t offset; + + size = 8 /* Box */ + 8 /* SampleEntry */ + 20 /* AudioSampleEntry */; + + offset = mov_buffer_tell(&mov->io); + mov_buffer_w32(&mov->io, 0); /* size */ + mov_buffer_w32(&mov->io, mov->track->tag); // "mp4a" + + mov_buffer_w32(&mov->io, 0); /* Reserved */ + mov_buffer_w16(&mov->io, 0); /* Reserved */ + mov_buffer_w16(&mov->io, 1); /* Data-reference index */ + + /* SoundDescription */ + mov_buffer_w16(&mov->io, 0); /* Version */ + mov_buffer_w16(&mov->io, 0); /* Revision level */ + mov_buffer_w32(&mov->io, 0); /* Reserved */ + + mov_buffer_w16(&mov->io, entry->u.audio.channelcount); /* channelcount */ + mov_buffer_w16(&mov->io, entry->u.audio.samplesize); /* samplesize */ + + mov_buffer_w16(&mov->io, 0); /* pre_defined */ + mov_buffer_w16(&mov->io, 0); /* reserved / packet size (= 0) */ + + // https://www.opus-codec.org/docs/opus_in_isobmff.html + // 4.3 Definitions of Opus sample + // OpusSampleEntry: + // 1. The samplesize field shall be set to 16. + // 2. The samplerate field shall be set to 48000<<16. + mov_buffer_w32(&mov->io, entry->u.audio.samplerate); /* samplerate */ + + if(MOV_OBJECT_AAC == entry->object_type_indication || MOV_OBJECT_MP3 == entry->object_type_indication || MOV_OBJECT_MP1A == entry->object_type_indication) + size += mov_write_esds(mov); + else if(MOV_OBJECT_OPUS == entry->object_type_indication) + size += mov_write_dops(mov); + + mov_write_size(mov, offset, size); /* update size */ + return size; +} + +static int mov_write_subtitle(const struct mov_t* mov, const struct mov_sample_entry_t* entry) +{ + int size; + uint64_t offset; + + size = 8 /* Box */ + 8 /* SampleEntry */ + entry->extra_data_size; + + offset = mov_buffer_tell(&mov->io); + mov_buffer_w32(&mov->io, 0); /* size */ + mov_buffer_w32(&mov->io, mov->track->tag); // "tx3g" + + mov_buffer_w32(&mov->io, 0); /* Reserved */ + mov_buffer_w16(&mov->io, 0); /* Reserved */ + mov_buffer_w16(&mov->io, entry->data_reference_index); /* Data-reference index */ + + if (MOV_TAG('t', 'x', '3', 'g') == mov->track->tag) + { + size += mov_write_tx3g(mov); + } + else if (entry->extra_data_size > 0) // unknown type + { + mov_buffer_write(&mov->io, entry->extra_data, entry->extra_data_size); + size += entry->extra_data_size; + } + + mov_write_size(mov, offset, size); /* update size */ + return size; +} + +size_t mov_write_stsd(const struct mov_t* mov) +{ + uint32_t i; + size_t size; + uint64_t offset; + const struct mov_track_t* track = mov->track; + + size = 12 /* full box */ + 4 /* entry count */; + + offset = mov_buffer_tell(&mov->io); + mov_buffer_w32(&mov->io, 0); /* size */ + mov_buffer_write(&mov->io, "stsd", 4); + mov_buffer_w32(&mov->io, 0); /* version & flags */ + mov_buffer_w32(&mov->io, track->stsd.entry_count); /* entry count */ + + for (i = 0; i < track->stsd.entry_count; i++) + { + ((struct mov_track_t*)track)->stsd.current = &track->stsd.entries[i]; + + if (MOV_VIDEO == track->handler_type) + { + size += mov_write_video(mov, &track->stsd.entries[i]); + } + else if (MOV_AUDIO == track->handler_type) + { + size += mov_write_audio(mov, &track->stsd.entries[i]); + } + else if (MOV_SUBT == track->handler_type || MOV_TEXT == track->handler_type || MOV_SBTL == track->handler_type) + { + size += mov_write_subtitle(mov, &track->stsd.entries[i]); + } + else + { + assert(0); + } + } + + mov_write_size(mov, offset, size); /* update size */ + return size; +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-stss.c b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-stss.c new file mode 100644 index 000000000..279c1de10 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-stss.c @@ -0,0 +1,79 @@ +#include "mov-internal.h" +#include +#include +#include + +// 8.6.2 Sync Sample Box (p50) +int mov_read_stss(struct mov_t* mov, const struct mov_box_t* box) +{ + uint32_t i, entry_count; + struct mov_stbl_t* stbl = &mov->track->stbl; + + mov_buffer_r8(&mov->io); /* version */ + mov_buffer_r24(&mov->io); /* flags */ + entry_count = mov_buffer_r32(&mov->io); + + assert(0 == stbl->stss_count && NULL == stbl->stss); + if (stbl->stss_count < entry_count) + { + void* p = realloc(stbl->stss, sizeof(stbl->stss[0]) * entry_count); + if (NULL == p) return -ENOMEM; + stbl->stss = p; + } + stbl->stss_count = entry_count; + + for (i = 0; i < entry_count; i++) + stbl->stss[i] = mov_buffer_r32(&mov->io); // uint32_t sample_number + + (void)box; + return mov_buffer_error(&mov->io); +} + +size_t mov_write_stss(const struct mov_t* mov) +{ + uint64_t offset; + uint64_t offset2; + uint32_t size, i, j; + const struct mov_sample_t* sample; + const struct mov_track_t* track = mov->track; + + size = 12/* full box */ + 4/* entry count */; + + offset = mov_buffer_tell(&mov->io); + mov_buffer_w32(&mov->io, 0); /* size */ + mov_buffer_write(&mov->io, "stss", 4); + mov_buffer_w32(&mov->io, 0); /* version & flags */ + mov_buffer_w32(&mov->io, 0); /* entry count */ + + for (i = 0, j = 0; i < track->sample_count; i++) + { + sample = &track->samples[i]; + if (sample->flags & MOV_AV_FLAG_KEYFREAME) + { + ++j; + mov_buffer_w32(&mov->io, i + 1); // start from 1 + } + } + + size += j * 4/* entry */; + offset2 = mov_buffer_tell(&mov->io); + mov_buffer_seek(&mov->io, offset); + mov_buffer_w32(&mov->io, size); /* size */ + mov_buffer_seek(&mov->io, offset + 12); + mov_buffer_w32(&mov->io, j); /* entry count */ + mov_buffer_seek(&mov->io, offset2); + return size; +} + +void mov_apply_stss(struct mov_track_t* track) +{ + size_t i, j; + struct mov_stbl_t* stbl = &track->stbl; + + for (i = 0; i < stbl->stss_count; i++) + { + j = stbl->stss[i]; // start from 1 + if (j > 0 && j <= track->sample_count) + track->samples[j - 1].flags |= MOV_AV_FLAG_KEYFREAME; + } +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-stsz.c b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-stsz.c new file mode 100644 index 000000000..fcf3b3537 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-stsz.c @@ -0,0 +1,131 @@ +#include "mov-internal.h" +#include +#include +#include +#include + +// 8.7.3.2 Sample Size Box (p57) +int mov_read_stsz(struct mov_t* mov, const struct mov_box_t* box) +{ + uint32_t i = 0, sample_size, sample_count; + struct mov_track_t* track = mov->track; + + mov_buffer_r8(&mov->io); /* version */ + mov_buffer_r24(&mov->io); /* flags */ + sample_size = mov_buffer_r32(&mov->io); + sample_count = mov_buffer_r32(&mov->io); + + assert(0 == track->sample_count && NULL == track->samples); // duplicated STSZ atom + if (track->sample_count < sample_count) + { + void* p = realloc(track->samples, sizeof(struct mov_sample_t) * (sample_count + 1)); + if (NULL == p) return -ENOMEM; + track->samples = (struct mov_sample_t*)p; + memset(track->samples, 0, sizeof(struct mov_sample_t) * (sample_count + 1)); + } + track->sample_count = sample_count; + + if (0 == sample_size) + { + for (i = 0; i < sample_count; i++) + track->samples[i].bytes = mov_buffer_r32(&mov->io); // uint32_t entry_size + } + else + { + for (i = 0; i < sample_count; i++) + track->samples[i].bytes = sample_size; + } + + (void)box; + return mov_buffer_error(&mov->io); +} + +// 8.7.3.3 Compact Sample Size Box (p57) +int mov_read_stz2(struct mov_t* mov, const struct mov_box_t* box) +{ + uint32_t i, v, field_size, sample_count; + struct mov_track_t* track = mov->track; + + mov_buffer_r8(&mov->io); /* version */ + mov_buffer_r24(&mov->io); /* flags */ + // unsigned int(24) reserved = 0; + mov_buffer_r24(&mov->io); /* reserved */ + field_size = mov_buffer_r8(&mov->io); + sample_count = mov_buffer_r32(&mov->io); + + assert(4 == field_size || 8 == field_size || 16 == field_size); + assert(0 == track->sample_count && NULL == track->samples); // duplicated STSZ atom + if (track->sample_count < sample_count) + { + void* p = realloc(track->samples, sizeof(struct mov_sample_t) * (sample_count + 1)); + if (NULL == p) return -ENOMEM; + track->samples = (struct mov_sample_t*)p; + memset(track->samples, 0, sizeof(struct mov_sample_t) * (sample_count + 1)); + } + track->sample_count = sample_count; + + if (4 == field_size) + { + for (i = 0; i < sample_count/2; i++) + { + v = mov_buffer_r8(&mov->io); + track->samples[i * 2].bytes = (v >> 4) & 0x0F; + track->samples[i * 2 + 1].bytes = v & 0x0F; + } + if (sample_count % 2) + { + v = mov_buffer_r8(&mov->io); + track->samples[i * 2].bytes = (v >> 4) & 0x0F; + } + } + else if (8 == field_size) + { + for (i = 0; i < sample_count; i++) + track->samples[i].bytes = mov_buffer_r8(&mov->io); + } + else if (16 == field_size) + { + for (i = 0; i < sample_count; i++) + track->samples[i].bytes = mov_buffer_r16(&mov->io); + } + else + { + i = 0; + assert(0); + } + + (void)box; + return mov_buffer_error(&mov->io); +} + +size_t mov_write_stsz(const struct mov_t* mov) +{ + uint32_t size, i; + const struct mov_track_t* track = mov->track; + + for(i = 1; i < track->sample_count; i++) + { + if(track->samples[i].bytes != track->samples[i-1].bytes) + break; + } + + size = 12/* full box */ + 8 + (i < track->sample_count ? 4 * track->sample_count : 0); + mov_buffer_w32(&mov->io, size); /* size */ + mov_buffer_write(&mov->io, "stsz", 4); + mov_buffer_w32(&mov->io, 0); /* version & flags */ + + if(i < track->sample_count) + { + mov_buffer_w32(&mov->io, 0); + mov_buffer_w32(&mov->io, track->sample_count); + for(i = 0; i < track->sample_count; i++) + mov_buffer_w32(&mov->io, track->samples[i].bytes); + } + else + { + mov_buffer_w32(&mov->io, track->sample_count < 1 ? 0 : track->samples[0].bytes); + mov_buffer_w32(&mov->io, track->sample_count); + } + + return size; +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-stts.c b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-stts.c new file mode 100644 index 000000000..520ab962a --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-stts.c @@ -0,0 +1,243 @@ +#include "mov-internal.h" +#include +#include +#include + +// 8.6.1.2 Decoding Time to Sample Box (p47) +int mov_read_stts(struct mov_t* mov, const struct mov_box_t* box) +{ + uint32_t i, entry_count; + struct mov_stbl_t* stbl = &mov->track->stbl; + + mov_buffer_r8(&mov->io); /* version */ + mov_buffer_r24(&mov->io); /* flags */ + entry_count = mov_buffer_r32(&mov->io); + + assert(0 == stbl->stts_count && NULL == stbl->stts); // duplicated STTS atom + if (stbl->stts_count < entry_count) + { + void* p = realloc(stbl->stts, sizeof(struct mov_stts_t) * entry_count); + if (NULL == p) return -ENOMEM; + stbl->stts = (struct mov_stts_t*)p; + } + stbl->stts_count = entry_count; + + for (i = 0; i < entry_count; i++) + { + stbl->stts[i].sample_count = mov_buffer_r32(&mov->io); + stbl->stts[i].sample_delta = mov_buffer_r32(&mov->io); + } + + (void)box; + return mov_buffer_error(&mov->io); +} + +// 8.6.1.3 Composition Time to Sample Box (p47) +int mov_read_ctts(struct mov_t* mov, const struct mov_box_t* box) +{ + uint32_t i, entry_count; + struct mov_stbl_t* stbl = &mov->track->stbl; + + mov_buffer_r8(&mov->io); /* version */ + mov_buffer_r24(&mov->io); /* flags */ + entry_count = mov_buffer_r32(&mov->io); + + assert(0 == stbl->ctts_count && NULL == stbl->ctts); // duplicated CTTS atom + if (stbl->ctts_count < entry_count) + { + void* p = realloc(stbl->ctts, sizeof(struct mov_stts_t) * entry_count); + if (NULL == p) return -ENOMEM; + stbl->ctts = (struct mov_stts_t*)p; + } + stbl->ctts_count = entry_count; + + for (i = 0; i < entry_count; i++) + { + stbl->ctts[i].sample_count = mov_buffer_r32(&mov->io); + stbl->ctts[i].sample_delta = mov_buffer_r32(&mov->io); // parse at int32_t + } + + (void)box; + return mov_buffer_error(&mov->io); +} + +// 8.6.1.4 Composition to Decode Box (p53) +int mov_read_cslg(struct mov_t* mov, const struct mov_box_t* box) +{ + uint8_t version; +// struct mov_stbl_t* stbl = &mov->track->stbl; + + version = (uint8_t)mov_buffer_r8(&mov->io); /* version */ + mov_buffer_r24(&mov->io); /* flags */ + + if (0 == version) + { + mov_buffer_r32(&mov->io); /* compositionToDTSShift */ + mov_buffer_r32(&mov->io); /* leastDecodeToDisplayDelta */ + mov_buffer_r32(&mov->io); /* greatestDecodeToDisplayDelta */ + mov_buffer_r32(&mov->io); /* compositionStartTime */ + mov_buffer_r32(&mov->io); /* compositionEndTime */ + } + else + { + mov_buffer_r64(&mov->io); + mov_buffer_r64(&mov->io); + mov_buffer_r64(&mov->io); + mov_buffer_r64(&mov->io); + mov_buffer_r64(&mov->io); + } + + (void)box; + return mov_buffer_error(&mov->io); +} + +size_t mov_write_stts(const struct mov_t* mov, uint32_t count) +{ + uint32_t size, i; + const struct mov_sample_t* sample; + const struct mov_track_t* track = mov->track; + + size = 12/* full box */ + 4/* entry count */ + count * 8/* entry */; + + mov_buffer_w32(&mov->io, size); /* size */ + mov_buffer_write(&mov->io, "stts", 4); + mov_buffer_w32(&mov->io, 0); /* version & flags */ + mov_buffer_w32(&mov->io, count); /* entry count */ + + for (i = 0; i < track->sample_count; i++) + { + sample = &track->samples[i]; + if(0 == sample->first_chunk) + continue; + mov_buffer_w32(&mov->io, sample->first_chunk); // count + mov_buffer_w32(&mov->io, sample->samples_per_chunk); // delta * timescale / 1000 + } + + return size; +} + +size_t mov_write_ctts(const struct mov_t* mov, uint32_t count) +{ + uint32_t size, i; + const struct mov_sample_t* sample; + const struct mov_track_t* track = mov->track; + + size = 12/* full box */ + 4/* entry count */ + count * 8/* entry */; + + mov_buffer_w32(&mov->io, size); /* size */ + mov_buffer_write(&mov->io, "ctts", 4); + mov_buffer_w8(&mov->io, (track->flags & MOV_TRACK_FLAG_CTTS_V1) ? 1 : 0); /* version */ + mov_buffer_w24(&mov->io, 0); /* flags */ + mov_buffer_w32(&mov->io, count); /* entry count */ + + for (i = 0; i < track->sample_count; i++) + { + sample = &track->samples[i]; + if(0 == sample->first_chunk) + continue; + mov_buffer_w32(&mov->io, sample->first_chunk); // count + mov_buffer_w32(&mov->io, sample->samples_per_chunk); // offset * timescale / 1000 + } + + return size; +} + +uint32_t mov_build_stts(struct mov_track_t* track) +{ + size_t i; + uint32_t delta, count = 0; + struct mov_sample_t* sample = NULL; + + for (i = 0; i < track->sample_count; i++) + { + assert(track->samples[i + 1].dts >= track->samples[i].dts || i + 1 == track->sample_count); + delta = (uint32_t)(i + 1 < track->sample_count && track->samples[i + 1].dts > track->samples[i].dts ? track->samples[i + 1].dts - track->samples[i].dts : 1); + if (NULL != sample && delta == sample->samples_per_chunk) + { + track->samples[i].first_chunk = 0; + assert(sample->first_chunk > 0); + ++sample->first_chunk; // compress + } + else + { + sample = &track->samples[i]; + sample->first_chunk = 1; + sample->samples_per_chunk = delta; + ++count; + } + } + return count; +} + +uint32_t mov_build_ctts(struct mov_track_t* track) +{ + size_t i; + uint32_t delta; + uint32_t count = 0; + struct mov_sample_t* sample = NULL; + + for (i = 0; i < track->sample_count; i++) + { + delta = (uint32_t)(track->samples[i].pts - track->samples[i].dts); + if (i > 0 && delta == sample->samples_per_chunk) + { + track->samples[i].first_chunk = 0; + assert(sample->first_chunk > 0); + ++sample->first_chunk; // compress + } + else + { + sample = &track->samples[i]; + sample->first_chunk = 1; + sample->samples_per_chunk = delta; + ++count; + + // fixed: firefox version 51 don't support version 1 + if (track->samples[i].pts < track->samples[i].dts) + track->flags |= MOV_TRACK_FLAG_CTTS_V1; + } + } + + return count; +} + +void mov_apply_stts(struct mov_track_t* track) +{ + size_t i, j, n; + struct mov_stbl_t* stbl = &track->stbl; + + for (i = 0, n = 1; i < stbl->stts_count; i++) + { + for (j = 0; j < stbl->stts[i].sample_count; j++, n++) + { + track->samples[n].dts = track->samples[n - 1].dts + stbl->stts[i].sample_delta; + track->samples[n].pts = track->samples[n].dts; + } + } + assert(n - 1 == track->sample_count); // see more mov_read_stsz +} + +void mov_apply_ctts(struct mov_track_t* track) +{ + size_t i, j, n; + int32_t delta, dts_shift; + struct mov_stbl_t* stbl = &track->stbl; + + // make sure pts >= dts + dts_shift = 0; + for (i = 0; i < stbl->ctts_count; i++) + { + delta = (int32_t)stbl->ctts[i].sample_delta; + if (delta < 0 && dts_shift > delta && delta != -1 /* see more cslg box*/) + dts_shift = delta; + } + assert(dts_shift <= 0); + + // sample cts/pts + for (i = 0, n = 0; i < stbl->ctts_count; i++) + { + for (j = 0; j < stbl->ctts[i].sample_count; j++, n++) + track->samples[n].pts += (int64_t)((int32_t)stbl->ctts[i].sample_delta - dts_shift); // always as int, fixed mp4box delta version error + } + assert(0 == stbl->ctts_count || n == track->sample_count); +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-tag.c b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-tag.c new file mode 100644 index 000000000..9bc1791f0 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-tag.c @@ -0,0 +1,60 @@ +#include "mov-internal.h" +#include + +struct mov_object_tag { + uint8_t id; + uint32_t tag; +}; + +static struct mov_object_tag s_tags[] = { + { MOV_OBJECT_H264, MOV_H264 }, // AVCSampleEntry (ISO/IEC 14496-15:2010) + { MOV_OBJECT_H264, MOV_TAG('a', 'v', 'c', '2') }, // AVC2SampleEntry (ISO/IEC 14496-15:2010) + { MOV_OBJECT_H264, MOV_TAG('a', 'v', 'c', '3') }, // AVCSampleEntry (ISO/IEC 14496-15:2017) + { MOV_OBJECT_H264, MOV_TAG('a', 'v', 'c', '4') }, // AVC2SampleEntry (ISO/IEC 14496-15:2017) + { MOV_OBJECT_H265, MOV_H265 }, // HEVCSampleEntry (ISO/IEC 14496-15:2013) + { MOV_OBJECT_H265, MOV_TAG('h', 'e', 'v', '1') }, // HEVCSampleEntry (ISO/IEC 14496-15:2013) + { MOV_OBJECT_H266, MOV_TAG('v', 'v', 'c', '1') }, // VVCSampleEntry (ISO/IEC 14496-15:2021) + { MOV_OBJECT_MP4V, MOV_MP4V }, + { MOV_OBJECT_JPEG, MOV_MP4V }, + { MOV_OBJECT_PNG, MOV_MP4V }, + { MOV_OBJECT_JPEG2000, MOV_MP4V }, + { MOV_OBJECT_AAC, MOV_MP4A }, + { MOV_OBJECT_MP3, MOV_MP4A }, // mp4_read_decoder_config_descriptor + { MOV_OBJECT_MP1A, MOV_MP4A }, // mp4_read_decoder_config_descriptor + { MOV_OBJECT_G711a, MOV_TAG('a', 'l', 'a', 'w') }, + { MOV_OBJECT_G711u, MOV_TAG('u', 'l', 'a', 'w') }, + { MOV_OBJECT_TEXT, MOV_TAG('t', 'x', '3', 'g') }, + { MOV_OBJECT_TEXT, MOV_TAG('t', 'e', 'x', 't') }, + { MOV_OBJECT_TEXT, MOV_TAG('c', '6', '0', '8') }, + { MOV_OBJECT_OPUS, MOV_OPUS }, + { MOV_OBJECT_VP8, MOV_VP8 }, + { MOV_OBJECT_VP9, MOV_VP9 }, + { MOV_OBJECT_AV1, MOV_AV1 }, + { MOV_OBJECT_AC3, MOV_AC3 }, + { MOV_OBJECT_EAC3, MOV_TAG('e', 'c', '-', '3') }, + { MOV_OBJECT_DTS, MOV_DTS }, + { MOV_OBJECT_VC1, MOV_VC1 }, + { MOV_OBJECT_DIRAC, MOV_DIRAC }, +}; + +uint32_t mov_object_to_tag(uint8_t object) +{ + int i; + for (i = 0; i < sizeof(s_tags) / sizeof(s_tags[0]); i++) + { + if (s_tags[i].id == object) + return s_tags[i].tag; + } + return 0; +} + +uint8_t mov_tag_to_object(uint32_t tag) +{ + int i; + for (i = 0; i < sizeof(s_tags) / sizeof(s_tags[0]); i++) + { + if (s_tags[i].tag == tag) + return s_tags[i].id; + } + return 0; +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-tfdt.c b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-tfdt.c new file mode 100644 index 000000000..2ed4865a6 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-tfdt.c @@ -0,0 +1,48 @@ +#include "mov-internal.h" +#include +#include +#include +#include + +// 8.8.12 Track fragment decode time (p76) +int mov_read_tfdt(struct mov_t* mov, const struct mov_box_t* box) +{ + unsigned int version; + version = mov_buffer_r8(&mov->io); /* version */ + mov_buffer_r24(&mov->io); /* flags */ + + if (1 == version) + mov->track->tfdt_dts = mov_buffer_r64(&mov->io); /* baseMediaDecodeTime */ + else + mov->track->tfdt_dts = mov_buffer_r32(&mov->io); /* baseMediaDecodeTime */ + + // baseMediaDecodeTime + ELST start offset + mov_apply_elst_tfdt(mov->track); + + (void)box; + return mov_buffer_error(&mov->io); +} + +size_t mov_write_tfdt(const struct mov_t* mov) +{ + uint8_t version; + uint64_t baseMediaDecodeTime; + + if (mov->track->sample_count < 1) + return 0; + + baseMediaDecodeTime = mov->track->samples[0].dts - mov->track->start_dts; + version = baseMediaDecodeTime > INT32_MAX ? 1 : 0; + + mov_buffer_w32(&mov->io, 0 == version ? 16 : 20); /* size */ + mov_buffer_write(&mov->io, "tfdt", 4); + mov_buffer_w8(&mov->io, version); /* version */ + mov_buffer_w24(&mov->io, 0); /* flags */ + + if (1 == version) + mov_buffer_w64(&mov->io, baseMediaDecodeTime); /* baseMediaDecodeTime */ + else + mov_buffer_w32(&mov->io, (uint32_t)baseMediaDecodeTime); /* baseMediaDecodeTime */ + + return 0 == version ? 16 : 20; +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-tfhd.c b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-tfhd.c new file mode 100644 index 000000000..65d0ab7fc --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-tfhd.c @@ -0,0 +1,98 @@ +#include "mov-internal.h" +#include + +// 8.8.7 Track Fragment Header Box (p71) +int mov_read_tfhd(struct mov_t* mov, const struct mov_box_t* box) +{ + uint32_t flags; + uint32_t track_ID; + + mov_buffer_r8(&mov->io); /* version */ + flags = mov_buffer_r24(&mov->io); /* flags */ + track_ID = mov_buffer_r32(&mov->io); /* track_ID */ + + mov->track = mov_find_track(mov, track_ID); + if (NULL == mov->track) + return -1; + + mov->track->tfhd.flags = flags; + + if (MOV_TFHD_FLAG_BASE_DATA_OFFSET & flags) + mov->track->tfhd.base_data_offset = mov_buffer_r64(&mov->io); /* base_data_offset*/ + else if(MOV_TFHD_FLAG_DEFAULT_BASE_IS_MOOF & flags) + mov->track->tfhd.base_data_offset = mov->moof_offset; /* default-base-is-moof */ + else + mov->track->tfhd.base_data_offset = mov->implicit_offset; + + if (MOV_TFHD_FLAG_SAMPLE_DESCRIPTION_INDEX & flags) + mov->track->tfhd.sample_description_index = mov_buffer_r32(&mov->io); /* sample_description_index*/ + else + mov->track->tfhd.sample_description_index = mov->track->trex.default_sample_description_index; + + if (MOV_TFHD_FLAG_DEFAULT_DURATION & flags) + mov->track->tfhd.default_sample_duration = mov_buffer_r32(&mov->io); /* default_sample_duration*/ + else + mov->track->tfhd.default_sample_duration = mov->track->trex.default_sample_duration; + + if (MOV_TFHD_FLAG_DEFAULT_SIZE & flags) + mov->track->tfhd.default_sample_size = mov_buffer_r32(&mov->io); /* default_sample_size*/ + else + mov->track->tfhd.default_sample_size = mov->track->trex.default_sample_size; + + if (MOV_TFHD_FLAG_DEFAULT_FLAGS & flags) + mov->track->tfhd.default_sample_flags = mov_buffer_r32(&mov->io); /* default_sample_flags*/ + else + mov->track->tfhd.default_sample_flags = mov->track->trex.default_sample_flags; + + if (MOV_TFHD_FLAG_DURATION_IS_EMPTY & flags) + (void)box; /* duration-is-empty*/ + return mov_buffer_error(&mov->io); +} + +size_t mov_write_tfhd(const struct mov_t* mov) +{ + size_t size; + uint64_t offset; + + size = 12 + 4 /* track_ID */; + + offset = mov_buffer_tell(&mov->io); + mov_buffer_w32(&mov->io, 0); /* size */ + mov_buffer_write(&mov->io, "tfhd", 4); + mov_buffer_w8(&mov->io, 0); /* version */ + mov_buffer_w24(&mov->io, mov->track->tfhd.flags); /* flags */ + mov_buffer_w32(&mov->io, mov->track->tkhd.track_ID); /* track_ID */ + + if (MOV_TFHD_FLAG_BASE_DATA_OFFSET & mov->track->tfhd.flags) + { + mov_buffer_w64(&mov->io, mov->track->tfhd.base_data_offset); /* base_data_offset*/ + size += 8; + } + + if (MOV_TFHD_FLAG_SAMPLE_DESCRIPTION_INDEX & mov->track->tfhd.flags) + { + mov_buffer_w32(&mov->io, mov->track->stsd.entries[0].data_reference_index); /* sample_description_index*/ + size += 4; + } + + if (MOV_TFHD_FLAG_DEFAULT_DURATION & mov->track->tfhd.flags) + { + mov_buffer_w32(&mov->io, mov->track->tfhd.default_sample_duration); /* default_sample_duration*/ + size += 4; + } + + if (MOV_TFHD_FLAG_DEFAULT_SIZE & mov->track->tfhd.flags) + { + mov_buffer_w32(&mov->io, mov->track->tfhd.default_sample_size); /* default_sample_size*/ + size += 4; + } + + if (MOV_TFHD_FLAG_DEFAULT_FLAGS & mov->track->tfhd.flags) + { + mov_buffer_w32(&mov->io, mov->track->tfhd.default_sample_flags); /* default_sample_flags*/ + size += 4; + } + + mov_write_size(mov, offset, size); + return size; +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-tfra.c b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-tfra.c new file mode 100644 index 000000000..ff4c605bd --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-tfra.c @@ -0,0 +1,87 @@ +#include "mov-internal.h" +#include +#include +#include + +// 8.8.10 Track Fragment Random Access Box (p74) +int mov_read_tfra(struct mov_t* mov, const struct mov_box_t* box) +{ + unsigned int version; + uint32_t track_ID; + uint32_t length_size_of; + uint32_t i, j, number_of_entry; + uint32_t traf_number, trun_number, sample_number; + struct mov_track_t* track; + + version = mov_buffer_r8(&mov->io); /* version */ + mov_buffer_r24(&mov->io); /* flags */ + track_ID = mov_buffer_r32(&mov->io); /* track_ID */ + + track = mov_find_track(mov, track_ID); + if (NULL == track) + return -1; + + length_size_of = mov_buffer_r32(&mov->io); /* length_size_of XXX */ + number_of_entry = mov_buffer_r32(&mov->io); /* number_of_entry */ + if (number_of_entry > 0) + { + void* p = realloc(track->frags, sizeof(struct mov_fragment_t) * number_of_entry); + if (!p) return -ENOMEM; + track->frags = p; + } + track->frag_count = number_of_entry; + + for (i = 0; i < number_of_entry; i++) + { + if (1 == version) + { + track->frags[i].time = mov_buffer_r64(&mov->io); /* time */ + track->frags[i].offset = mov_buffer_r64(&mov->io); /* moof_offset */ + } + else + { + track->frags[i].time = mov_buffer_r32(&mov->io); /* time */ + track->frags[i].offset = mov_buffer_r32(&mov->io); /* moof_offset */ + } + + for (traf_number = 0, j = 0; j < ((length_size_of >> 4) & 0x03) + 1; j++) + traf_number = (traf_number << 8) | mov_buffer_r8(&mov->io); /* traf_number */ + + for (trun_number = 0, j = 0; j < ((length_size_of >> 2) & 0x03) + 1; j++) + trun_number = (trun_number << 8) | mov_buffer_r8(&mov->io); /* trun_number */ + + for (sample_number = 0, j = 0; j < (length_size_of & 0x03) + 1; j++) + sample_number = (sample_number << 8) | mov_buffer_r8(&mov->io); /* sample_number */ + } + + (void)box; + return mov_buffer_error(&mov->io); +} + +size_t mov_write_tfra(const struct mov_t* mov) +{ + uint32_t i, size; + const struct mov_track_t* track = mov->track; + + size = 12/* full box */ + 12/* base */ + track->frag_count * 19/* index */; + + mov_buffer_w32(&mov->io, size); /* size */ + mov_buffer_write(&mov->io, "tfra", 4); + mov_buffer_w8(&mov->io, 1); /* version */ + mov_buffer_w24(&mov->io, 0); /* flags */ + + mov_buffer_w32(&mov->io, track->tkhd.track_ID); /* track_ID */ + mov_buffer_w32(&mov->io, 0); /* length_size_of_traf_num/trun/sample */ + mov_buffer_w32(&mov->io, track->frag_count); /* number_of_entry */ + + for (i = 0; i < track->frag_count; i++) + { + mov_buffer_w64(&mov->io, track->frags[i].time); + mov_buffer_w64(&mov->io, track->frags[i].offset); /* moof_offset */ + mov_buffer_w8(&mov->io, 1); /* traf number */ + mov_buffer_w8(&mov->io, 1); /* trun number */ + mov_buffer_w8(&mov->io, 1); /* sample number */ + } + + return size; +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-tkhd.c b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-tkhd.c new file mode 100644 index 000000000..d189a11c0 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-tkhd.c @@ -0,0 +1,135 @@ +#include "mov-internal.h" +#include + +// ISO/IEC 14496-12:2012(E) +// 8.3.2 Track Header Box (p31) +// Box Type : 'tkhd' +// Container : Movie Box('trak') +// Mandatory : Yes +// Quantity : Exactly one + +/* +aligned(8) class TrackHeaderBox extends FullBox('tkhd', version, flags){ + if (version==1) { + unsigned int(64) creation_time; + unsigned int(64) modification_time; + unsigned int(32) track_ID; + const unsigned int(32) reserved = 0; + unsigned int(64) duration; + } else { // version==0 + unsigned int(32) creation_time; + unsigned int(32) modification_time; + unsigned int(32) track_ID; + const unsigned int(32) reserved = 0; + unsigned int(32) duration; + } + const unsigned int(32)[2] reserved = 0; + template int(16) layer = 0; + template int(16) alternate_group = 0; + template int(16) volume = {if track_is_audio 0x0100 else 0}; + const unsigned int(16) reserved = 0; + template int(32)[9] matrix= { 0x00010000,0,0,0,0x00010000,0,0,0,0x40000000 }; // unity matrix + unsigned int(32) width; + unsigned int(32) height; +} +*/ +int mov_read_tkhd(struct mov_t* mov, const struct mov_box_t* box) +{ + int i; + uint8_t version; + uint32_t flags; + uint64_t creation_time; + uint64_t modification_time; + uint64_t duration; + uint32_t track_ID; + struct mov_tkhd_t* tkhd; + struct mov_track_t* track; + + version = mov_buffer_r8(&mov->io); + flags = mov_buffer_r24(&mov->io); + + if (1 == version) + { + creation_time = mov_buffer_r64(&mov->io); + modification_time = mov_buffer_r64(&mov->io); + track_ID = mov_buffer_r32(&mov->io); + /*reserved = */mov_buffer_r32(&mov->io); + duration = mov_buffer_r64(&mov->io); + } + else + { + assert(0 == version); + creation_time = mov_buffer_r32(&mov->io); + modification_time = mov_buffer_r32(&mov->io); + track_ID = mov_buffer_r32(&mov->io); + /*reserved = */mov_buffer_r32(&mov->io); + duration = mov_buffer_r32(&mov->io); + } + mov_buffer_skip(&mov->io, 8); // const unsigned int(32)[2] reserved = 0; + + track = mov_fetch_track(mov, track_ID); + if (NULL == track) return -1; + + mov->track = track; + tkhd = &mov->track->tkhd; + tkhd->version = version; + tkhd->flags = flags; + tkhd->duration = duration; + tkhd->creation_time = creation_time; + tkhd->modification_time = modification_time; + + tkhd->layer = (int16_t)mov_buffer_r16(&mov->io); + tkhd->alternate_group = (int16_t)mov_buffer_r16(&mov->io); + tkhd->volume = (int16_t)mov_buffer_r16(&mov->io); + mov_buffer_skip(&mov->io, 2); // const unsigned int(16) reserved = 0; + for (i = 0; i < 9; i++) + tkhd->matrix[i] = mov_buffer_r32(&mov->io); + tkhd->width = mov_buffer_r32(&mov->io); + tkhd->height = mov_buffer_r32(&mov->io); + + (void)box; + return 0; +} + +size_t mov_write_tkhd(const struct mov_t* mov) +{ +// int rotation = 0; // 90/180/270 + uint16_t group = 0; + const struct mov_tkhd_t* tkhd = &mov->track->tkhd; + + mov_buffer_w32(&mov->io, 92); /* size */ + mov_buffer_write(&mov->io, "tkhd", 4); + mov_buffer_w8(&mov->io, 0); /* version */ + mov_buffer_w24(&mov->io, tkhd->flags); /* flags */ + + mov_buffer_w32(&mov->io, (uint32_t)tkhd->creation_time); /* creation_time */ + mov_buffer_w32(&mov->io, (uint32_t)tkhd->modification_time); /* modification_time */ + mov_buffer_w32(&mov->io, tkhd->track_ID); /* track_ID */ + mov_buffer_w32(&mov->io, 0); /* reserved */ + mov_buffer_w32(&mov->io, (uint32_t)tkhd->duration); /* duration */ + + mov_buffer_w32(&mov->io, 0); /* reserved */ + mov_buffer_w32(&mov->io, 0); /* reserved */ + mov_buffer_w16(&mov->io, tkhd->layer); /* layer */ + mov_buffer_w16(&mov->io, group); /* alternate_group */ + //mov_buffer_w16(&mov->io, AVSTREAM_AUDIO == track->stream_type ? 0x0100 : 0); /* volume */ + mov_buffer_w16(&mov->io, tkhd->volume); /* volume */ + mov_buffer_w16(&mov->io, 0); /* reserved */ + + // matrix + //for (i = 0; i < 9; i++) + // file_reader_rb32(mov->fp, tkhd->matrix[i]); + mov_buffer_w32(&mov->io, 0x00010000); /* u */ + mov_buffer_w32(&mov->io, 0); + mov_buffer_w32(&mov->io, 0); + mov_buffer_w32(&mov->io, 0); /* v */ + mov_buffer_w32(&mov->io, 0x00010000); + mov_buffer_w32(&mov->io, 0); + mov_buffer_w32(&mov->io, 0); /* w */ + mov_buffer_w32(&mov->io, 0); + mov_buffer_w32(&mov->io, 0x40000000); + + mov_buffer_w32(&mov->io, tkhd->width /*track->av.video.width * 0x10000U*/); /* width */ + mov_buffer_w32(&mov->io, tkhd->height/*track->av.video.height * 0x10000U*/); /* height */ + return 92; +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-track.c b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-track.c new file mode 100644 index 000000000..4efcab9f4 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-track.c @@ -0,0 +1,340 @@ +#include "mov-internal.h" +#include +#include +#include +#include + +#define FREE(p) do { if(p) free(p); } while(0) + +struct mov_track_t* mov_add_track(struct mov_t* mov) +{ + void* ptr = NULL; + struct mov_track_t* track; + + ptr = realloc(mov->tracks, sizeof(struct mov_track_t) * (mov->track_count + 1)); + if (NULL == ptr) return NULL; + + mov->tracks = ptr; + track = &mov->tracks[mov->track_count]; + memset(track, 0, sizeof(struct mov_track_t)); + track->start_dts = INT64_MIN; + track->last_dts = INT64_MIN; + + track->stsd.entries = calloc(1, sizeof(struct mov_sample_entry_t)); + if (NULL == track->stsd.entries) + return NULL; + track->stsd.current = track->stsd.entries; + + return track; +} + +void mov_free_track(struct mov_track_t* track) +{ + size_t i; + for (i = 0; i < track->sample_count; i++) + { + if (track->samples[i].data) + free(track->samples[i].data); + } + + for (i = 0; i < track->stsd.entry_count; i++) + { + if (track->stsd.entries[i].extra_data) + free(track->stsd.entries[i].extra_data); + } + + FREE(track->elst); + FREE(track->frags); + FREE(track->samples); +// FREE(track->extra_data); + FREE(track->stsd.entries); + FREE(track->stbl.stco); + FREE(track->stbl.stsc); + FREE(track->stbl.stss); + FREE(track->stbl.stts); + FREE(track->stbl.ctts); +} + +struct mov_track_t* mov_find_track(const struct mov_t* mov, uint32_t track) +{ + int i; + for (i = 0; i < mov->track_count; i++) + { + if (mov->tracks[i].tkhd.track_ID == track) + return mov->tracks + i; + } + return NULL; +} + +struct mov_track_t* mov_fetch_track(struct mov_t* mov, uint32_t track) +{ + struct mov_track_t* t; + t = mov_find_track(mov, track); + if (NULL == t) + { + t = mov_add_track(mov); + if (NULL != t) + { + ++mov->track_count; + t->tkhd.track_ID = track; + } + } + return t; +} + +int mov_add_audio(struct mov_track_t* track, const struct mov_mvhd_t* mvhd, uint32_t timescale, uint8_t object, int channel_count, int bits_per_sample, int sample_rate, const void* extra_data, size_t extra_data_size) +{ + struct mov_sample_entry_t* audio; + + if (MOV_OBJECT_MP3 == object && sample_rate > 24000) + object = MOV_OBJECT_MP1A; // use mpeg1 sample rate table, see more @libflv/source/mp3-header.c + + audio = &track->stsd.entries[0]; + audio->data_reference_index = 1; + audio->object_type_indication = object; + audio->stream_type = MP4_STREAM_AUDIO; + audio->u.audio.channelcount = (uint16_t)channel_count; + audio->u.audio.samplesize = (uint16_t)bits_per_sample; + audio->u.audio.samplerate = ((uint32_t)(sample_rate > 56635 ? 0 : sample_rate)) << 16; + + assert(0 != mov_object_to_tag(object)); + track->tag = mov_object_to_tag(object); + track->handler_type = MOV_AUDIO; + track->handler_descr = "SoundHandler"; + track->stsd.entry_count = 1; + track->offset = 0; + + track->tkhd.flags = MOV_TKHD_FLAG_TRACK_ENABLE | MOV_TKHD_FLAG_TRACK_IN_MOVIE; + track->tkhd.track_ID = mvhd->next_track_ID; + track->tkhd.creation_time = mvhd->creation_time; + track->tkhd.modification_time = mvhd->modification_time; + track->tkhd.width = 0; + track->tkhd.height = 0; + track->tkhd.volume = 0x0100; + track->tkhd.duration = 0; // placeholder + + track->mdhd.creation_time = track->tkhd.creation_time; + track->mdhd.modification_time = track->tkhd.modification_time; + track->mdhd.timescale = timescale; //sample_rate + track->mdhd.language = 0x55c4; + track->mdhd.duration = 0; // placeholder + + audio->extra_data = malloc(extra_data_size + 1); + if (NULL == audio->extra_data) + return -ENOMEM; + memcpy(audio->extra_data, extra_data, extra_data_size); + audio->extra_data_size = (int)extra_data_size; + + return 0; +} + +int mov_add_video(struct mov_track_t* track, const struct mov_mvhd_t* mvhd, uint32_t timescale, uint8_t object, int width, int height, const void* extra_data, size_t extra_data_size) +{ + struct mov_sample_entry_t* video; + + video = &track->stsd.entries[0]; + video->data_reference_index = 1; + video->object_type_indication = object; + video->stream_type = MP4_STREAM_VISUAL; + video->u.visual.width = (uint16_t)width; + video->u.visual.height = (uint16_t)height; + video->u.visual.depth = 0x0018; + video->u.visual.frame_count = 1; + video->u.visual.horizresolution = 0x00480000; + video->u.visual.vertresolution = 0x00480000; + + assert(0 != mov_object_to_tag(object)); + track->tag = mov_object_to_tag(object); + track->handler_type = MOV_VIDEO; + track->handler_descr = "VideoHandler"; + track->stsd.entry_count = 1; + track->offset = 0; + + track->tkhd.flags = MOV_TKHD_FLAG_TRACK_ENABLE | MOV_TKHD_FLAG_TRACK_IN_MOVIE; + track->tkhd.track_ID = mvhd->next_track_ID; + track->tkhd.creation_time = mvhd->creation_time; + track->tkhd.modification_time = mvhd->modification_time; + track->tkhd.width = width << 16; + track->tkhd.height = height << 16; + track->tkhd.volume = 0; + track->tkhd.duration = 0; // placeholder + + track->mdhd.creation_time = track->tkhd.creation_time; + track->mdhd.modification_time = track->tkhd.modification_time; + track->mdhd.timescale = timescale; //mov->mvhd.timescale + track->mdhd.language = 0x55c4; + track->mdhd.duration = 0; // placeholder + + video->extra_data = malloc(extra_data_size + 1); + if (NULL == video->extra_data) + return -ENOMEM; + memcpy(video->extra_data, extra_data, extra_data_size); + video->extra_data_size = (int)extra_data_size; + + return 0; +} + +int mov_add_subtitle(struct mov_track_t* track, const struct mov_mvhd_t* mvhd, uint32_t timescale, uint8_t object, const void* extra_data, size_t extra_data_size) +{ + struct mov_sample_entry_t* subtitle; + + subtitle = &track->stsd.entries[0]; + subtitle->data_reference_index = 1; + subtitle->object_type_indication = object; + subtitle->stream_type = MP4_STREAM_VISUAL; // Visually composed tracks including video and text are layered using the 'layer' value. + + assert(0 != mov_object_to_tag(object)); + track->tag = mov_object_to_tag(object); + track->handler_type = MOV_SBTL; + track->handler_descr = "SubtitleHandler"; + track->stsd.entry_count = 1; + track->offset = 0; + + track->tkhd.flags = MOV_TKHD_FLAG_TRACK_ENABLE | MOV_TKHD_FLAG_TRACK_IN_MOVIE; + track->tkhd.track_ID = mvhd->next_track_ID; + track->tkhd.creation_time = mvhd->creation_time; + track->tkhd.modification_time = mvhd->modification_time; + track->tkhd.width = 0; + track->tkhd.height = 0; + track->tkhd.volume = 0; + track->tkhd.duration = 0; // placeholder + + track->mdhd.creation_time = track->tkhd.creation_time; + track->mdhd.modification_time = track->tkhd.modification_time; + track->mdhd.timescale = timescale; + track->mdhd.language = 0x55c4; + track->mdhd.duration = 0; // placeholder + + subtitle->extra_data = malloc(extra_data_size + 1); + if (NULL == subtitle->extra_data) + return -ENOMEM; + memcpy(subtitle->extra_data, extra_data, extra_data_size); + subtitle->extra_data_size = (int)extra_data_size; + + return 0; +} + +// ISO/IEC 14496-12:2012(E) 6.2.3 Box Order (p23) +// It is recommended that the boxes within the Sample Table Box be in the following order: +// Sample Description, Time to Sample, Sample to Chunk, Sample Size, Chunk Offset. +size_t mov_write_stbl(const struct mov_t* mov) +{ + size_t size; + uint32_t count; + uint64_t offset; + struct mov_track_t* track; + track = (struct mov_track_t*)mov->track; + + size = 8 /* Box */; + offset = mov_buffer_tell(&mov->io); + mov_buffer_w32(&mov->io, 0); /* size */ + mov_buffer_write(&mov->io, "stbl", 4); + + size += mov_write_stsd(mov); + + count = mov_build_stts(track); + size += mov_write_stts(mov, count); + if (track->tkhd.width > 0 && track->tkhd.height > 0) + size += mov_write_stss(mov); // video only + count = mov_build_ctts(track); + if (track->sample_count > 0 && (count > 1 || track->samples[0].samples_per_chunk != 0)) + size += mov_write_ctts(mov, count); + + count = mov_build_stco(track); + size += mov_write_stsc(mov); + size += mov_write_stsz(mov); + size += mov_write_stco(mov, count); + + mov_write_size(mov, offset, size); /* update size */ + return size; +} + +size_t mov_write_minf(const struct mov_t* mov) +{ + size_t size; + uint64_t offset; + const struct mov_track_t* track = mov->track; + + size = 8 /* Box */; + offset = mov_buffer_tell(&mov->io); + mov_buffer_w32(&mov->io, 0); /* size */ + mov_buffer_write(&mov->io, "minf", 4); + + if (MOV_VIDEO == track->handler_type) + { + size += mov_write_vmhd(mov); + } + else if (MOV_AUDIO == track->handler_type) + { + size += mov_write_smhd(mov); + } + else if (MOV_SUBT == track->handler_type || MOV_SBTL == track->handler_type) + { + size += mov_write_nmhd(mov); + } + else + { + assert(0); + } + + size += mov_write_dinf(mov); + size += mov_write_stbl(mov); + mov_write_size(mov, offset, size); /* update size */ + return size; +} + +size_t mov_write_mdia(const struct mov_t* mov) +{ + size_t size; + uint64_t offset; + + size = 8 /* Box */; + offset = mov_buffer_tell(&mov->io); + mov_buffer_w32(&mov->io, 0); /* size */ + mov_buffer_write(&mov->io, "mdia", 4); + + size += mov_write_mdhd(mov); + size += mov_write_hdlr(mov); + size += mov_write_minf(mov); + + mov_write_size(mov, offset, size); /* update size */ + return size; +} + +size_t mov_write_trak(const struct mov_t* mov) +{ + size_t size; + uint64_t offset; + + size = 8 /* Box */; + offset = mov_buffer_tell(&mov->io); + mov_buffer_w32(&mov->io, 0); /* size */ + mov_buffer_write(&mov->io, "trak", 4); + + size += mov_write_tkhd(mov); + //size += mov_write_tref(mov); + size += mov_write_edts(mov); + size += mov_write_mdia(mov); + + mov_write_size(mov, offset, size); /* update size */ + return size; +} + +size_t mov_write_edts(const struct mov_t* mov) +{ + size_t size; + uint64_t offset; + + if (mov->track->sample_count < 1) + return 0; + + size = 8 /* Box */; + offset = mov_buffer_tell(&mov->io); + mov_buffer_w32(&mov->io, 0); /* size */ + mov_buffer_write(&mov->io, "edts", 4); + + size += mov_write_elst(mov); + + mov_write_size(mov, offset, size); /* update size */ + return size; +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-trex.c b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-trex.c new file mode 100644 index 000000000..b6130d65b --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-trex.c @@ -0,0 +1,37 @@ +#include "mov-internal.h" +#include +#include +#include + +// 8.8.3 Track Extends Box (p69) +int mov_read_trex(struct mov_t* mov, const struct mov_box_t* box) +{ + uint32_t track_ID; + struct mov_track_t* track; + + (void)box; + mov_buffer_r32(&mov->io); /* version & flags */ + track_ID = mov_buffer_r32(&mov->io); /* track_ID */ + + track = mov_fetch_track(mov, track_ID); + if (NULL == track) return -1; + + track->trex.default_sample_description_index = mov_buffer_r32(&mov->io); /* default_sample_description_index */ + track->trex.default_sample_duration = mov_buffer_r32(&mov->io); /* default_sample_duration */ + track->trex.default_sample_size = mov_buffer_r32(&mov->io); /* default_sample_size */ + track->trex.default_sample_flags = mov_buffer_r32(&mov->io); /* default_sample_flags */ + return mov_buffer_error(&mov->io); +} + +size_t mov_write_trex(const struct mov_t* mov) +{ + mov_buffer_w32(&mov->io, 12 + 20); /* size */ + mov_buffer_write(&mov->io, "trex", 4); + mov_buffer_w32(&mov->io, 0); /* version & flags */ + mov_buffer_w32(&mov->io, mov->track->tkhd.track_ID); /* track_ID */ + mov_buffer_w32(&mov->io, 1); /* default_sample_description_index */ + mov_buffer_w32(&mov->io, 0); /* default_sample_duration */ + mov_buffer_w32(&mov->io, 0); /* default_sample_size */ + mov_buffer_w32(&mov->io, 0); /* default_sample_flags */ + return 32; +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-trun.c b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-trun.c new file mode 100644 index 000000000..fa0365377 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-trun.c @@ -0,0 +1,163 @@ +#include "mov-internal.h" +#include +#include +#include +#include + +// 8.8.8 Track Fragment Run Box (p72) +int mov_read_trun(struct mov_t* mov, const struct mov_box_t* box) +{ + unsigned int version; + uint32_t flags; + uint32_t i, sample_count; + uint64_t data_offset; + uint32_t first_sample_flags; + uint32_t sample_duration, sample_size, sample_flags; + int64_t sample_composition_time_offset; + struct mov_track_t* track; + struct mov_sample_t* sample; + + version = mov_buffer_r8(&mov->io); /* version */ + flags = mov_buffer_r24(&mov->io); /* flags */ + sample_count = mov_buffer_r32(&mov->io); /* sample_count */ + + track = mov->track; + if (sample_count > 0) + { + void* p = realloc(track->samples, sizeof(struct mov_sample_t) * (track->sample_count + sample_count + 1)); + if (NULL == p) return -ENOMEM; + track->samples = (struct mov_sample_t*)p; + memset(track->samples + track->sample_count, 0, sizeof(struct mov_sample_t) * (sample_count + 1)); + } + + data_offset = track->tfhd.base_data_offset; + if (MOV_TRUN_FLAG_DATA_OFFSET_PRESENT & flags) + data_offset += (int32_t)mov_buffer_r32(&mov->io); /* data_offset */ + + if (MOV_TRUN_FLAG_FIRST_SAMPLE_FLAGS_PRESENT & flags) + first_sample_flags = mov_buffer_r32(&mov->io); /* first_sample_flags */ + else + first_sample_flags = track->tfhd.flags; + + sample = track->samples + track->sample_count; + for (i = 0; i < sample_count; i++) + { + if (MOV_TRUN_FLAG_SAMPLE_DURATION_PRESENT & flags) + sample_duration = mov_buffer_r32(&mov->io); /* sample_duration*/ + else + sample_duration = track->tfhd.default_sample_duration; + + if (MOV_TRUN_FLAG_SAMPLE_SIZE_PRESENT & flags) + sample_size = mov_buffer_r32(&mov->io); /* sample_size*/ + else + sample_size = track->tfhd.default_sample_size; + + if (MOV_TRUN_FLAG_SAMPLE_FLAGS_PRESENT & flags) + sample_flags = mov_buffer_r32(&mov->io); /* sample_flags*/ + else + sample_flags = i ? track->tfhd.default_sample_flags : first_sample_flags; + + if (MOV_TRUN_FLAG_SAMPLE_COMPOSITION_TIME_OFFSET_PRESENT & flags) + { + sample_composition_time_offset = mov_buffer_r32(&mov->io); /* sample_composition_time_offset*/ + if (1 == version) + sample_composition_time_offset = (int32_t)sample_composition_time_offset; + } + else + sample_composition_time_offset = 0; + + sample[i].offset = data_offset; + sample[i].bytes = sample_size; + sample[i].dts = track->tfdt_dts; + sample[i].pts = sample[i].dts + sample_composition_time_offset; + sample[i].flags = (sample_flags & (MOV_TREX_FLAG_SAMPLE_IS_NO_SYNC_SAMPLE | 0x01000000)) ? 0 : MOV_AV_FLAG_KEYFREAME; + sample[i].sample_description_index = track->tfhd.sample_description_index; + + data_offset += sample_size; + track->tfdt_dts += sample_duration; + } + track->sample_count += sample_count; + mov->implicit_offset = data_offset; + + (void)box; + return mov_buffer_error(&mov->io); +} + +size_t mov_write_trun(const struct mov_t* mov, uint32_t from, uint32_t count, uint32_t moof) +{ + uint32_t flags; + uint32_t delta; + uint64_t offset; + uint32_t size, i; + const struct mov_sample_t* sample; + const struct mov_track_t* track = mov->track; + + if (count < 1) return 0; + assert(from + count <= track->sample_count); + flags = MOV_TRUN_FLAG_DATA_OFFSET_PRESENT; + if (track->samples[from].flags & MOV_AV_FLAG_KEYFREAME) + flags |= MOV_TRUN_FLAG_FIRST_SAMPLE_FLAGS_PRESENT; + + for (i = from; i < from + count; i++) + { + sample = track->samples + i; + if (sample->bytes != track->tfhd.default_sample_size) + flags |= MOV_TRUN_FLAG_SAMPLE_SIZE_PRESENT; + if ((uint32_t)(i + 1 < track->sample_count ? track->samples[i + 1].dts - track->samples[i].dts : track->turn_last_duration) != track->tfhd.default_sample_duration) + flags |= MOV_TRUN_FLAG_SAMPLE_DURATION_PRESENT; + if (sample->pts != sample->dts) + flags |= MOV_TRUN_FLAG_SAMPLE_COMPOSITION_TIME_OFFSET_PRESENT; + } + + size = 12/* full box */ + 4/* sample count */; + + offset = mov_buffer_tell(&mov->io); + mov_buffer_w32(&mov->io, 0); /* size */ + mov_buffer_write(&mov->io, "trun", 4); + mov_buffer_w8(&mov->io, 1); /* version */ + mov_buffer_w24(&mov->io, flags); /* flags */ + mov_buffer_w32(&mov->io, count); /* sample_count */ + + assert(flags & MOV_TRUN_FLAG_DATA_OFFSET_PRESENT); + if (flags & MOV_TRUN_FLAG_DATA_OFFSET_PRESENT) + { + mov_buffer_w32(&mov->io, moof + (uint32_t)track->samples[from].offset); + size += 4; + } + + if (flags & MOV_TRUN_FLAG_FIRST_SAMPLE_FLAGS_PRESENT) + { + mov_buffer_w32(&mov->io, MOV_TREX_FLAG_SAMPLE_DEPENDS_ON_I_PICTURE); /* first_sample_flags */ + size += 4; + } + + assert(from + count <= track->sample_count); + for (i = from; i < from + count; i++) + { + sample = track->samples + i; + if (flags & MOV_TRUN_FLAG_SAMPLE_DURATION_PRESENT) + { + delta = (uint32_t)(i + 1 < track->sample_count ? track->samples[i + 1].dts - track->samples[i].dts : track->turn_last_duration); + mov_buffer_w32(&mov->io, delta); /* sample_duration */ + size += 4; + } + + if (flags & MOV_TRUN_FLAG_SAMPLE_SIZE_PRESENT) + { + mov_buffer_w32(&mov->io, (uint32_t)sample->bytes); /* sample_size */ + size += 4; + } + + assert(0 == (flags & MOV_TRUN_FLAG_SAMPLE_FLAGS_PRESENT)); +// mov_buffer_w32(&mov->io, 0); /* sample_flags */ + + if (flags & MOV_TRUN_FLAG_SAMPLE_COMPOSITION_TIME_OFFSET_PRESENT) + { + mov_buffer_w32(&mov->io, (int32_t)(sample->pts - sample->dts)); /* sample_composition_time_offset */ + size += 4; + } + } + + mov_write_size(mov, offset, size); + return size; +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-tx3g.c b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-tx3g.c new file mode 100644 index 000000000..01ed3a1de --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-tx3g.c @@ -0,0 +1,115 @@ +#include "mov-internal.h" +#include +#include +#include + +// 3GPP TS 26.245 Release 14 12 V14.0.0 (2017-03) +/* +aligned(8) class StyleRecord { + unsigned int(16) startChar; + unsigned int(16) endChar; + unsigned int(16) font-ID; + unsigned int(8) face-style-flags; + unsigned int(8) font-size; + unsigned int(8) text-color-rgba[4]; +} + +class FontRecord { + unsigned int(16) font-ID; + unsigned int(8) font-name-length; + unsigned int(8) font[font-name-length]; +} +class FontTableBox() extends Box('ftab') { + unsigned int(16) entry-count; + FontRecord font-entry[entry-count]; +} +class DisparityBox() extends TextSampleModifierBox ('disp') { + signed int(16) disparity-shift-in-16th-pel; +} +class BoxRecord { + signed int(16) top; + signed int(16) left; + signed int(16) bottom; + signed int(16) right; +} +class TextSampleEntry() extends SampleEntry ('tx3g') { + unsigned int(32) displayFlags; + signed int(8) horizontal-justification; + signed int(8) vertical-justification; + unsigned int(8) background-color-rgba[4]; + BoxRecord default-text-box; + StyleRecord default-style; + FontTableBox font-table; + DisparityBox default-disparity; +} +*/ + +int mov_read_tx3g(struct mov_t* mov, const struct mov_box_t* box) +{ + struct mov_box_t extra; + //struct mov_track_t* track = mov->track; + //struct mov_sample_entry_t* entry = track->stsd.current; + + mov_buffer_r32(&mov->io); // displayFlags + mov_buffer_r8(&mov->io); // horizontal-justification + mov_buffer_r8(&mov->io); // vertical-justification + mov_buffer_r8(&mov->io); // background-color-rgba[4] + mov_buffer_r8(&mov->io); + mov_buffer_r8(&mov->io); + mov_buffer_r8(&mov->io); + mov_buffer_r16(&mov->io); // BoxRecord.top + mov_buffer_r16(&mov->io); // BoxRecord.left + mov_buffer_r16(&mov->io); // BoxRecord.bottom + mov_buffer_r16(&mov->io); // BoxRecord.right + mov_buffer_r16(&mov->io); // StyleRecord.startChar + mov_buffer_r16(&mov->io); // StyleRecord.endChar + mov_buffer_r16(&mov->io); // StyleRecord.font-ID + mov_buffer_r8(&mov->io); // StyleRecord.face-style-flags + mov_buffer_r8(&mov->io); // StyleRecord.font-size + mov_buffer_r8(&mov->io); // StyleRecord.text-color-rgba[4] + mov_buffer_r8(&mov->io); + mov_buffer_r8(&mov->io); + mov_buffer_r8(&mov->io); + + // FontTableBox + extra.type = box->type; + extra.size = box->size - 30; + return mp4_read_extra(mov, &extra); +} + +size_t mov_write_tx3g(const struct mov_t* mov) +{ + //const struct mov_track_t* track = mov->track; + //const struct mov_sample_entry_t* entry = track->stsd.current; + + mov_buffer_w32(&mov->io, 0); // displayFlags + mov_buffer_w8(&mov->io, 0x01); // horizontal-justification + mov_buffer_w8(&mov->io, 0xFF); // vertical-justification + mov_buffer_w8(&mov->io, 0x00); // background-color-rgba[4] + mov_buffer_w8(&mov->io, 0x00); + mov_buffer_w8(&mov->io, 0x00); + mov_buffer_w8(&mov->io, 0x00); + mov_buffer_w16(&mov->io, 0x0000); // BoxRecord.top + mov_buffer_w16(&mov->io, 0x0000); // BoxRecord.left + mov_buffer_w16(&mov->io, 0x0000); // BoxRecord.bottom + mov_buffer_w16(&mov->io, 0x0000); // BoxRecord.right + mov_buffer_w16(&mov->io, 0x0000); // StyleRecord.startChar + mov_buffer_w16(&mov->io, 0x0000); // StyleRecord.endChar + mov_buffer_w16(&mov->io, 0x0001); // StyleRecord.font-ID + mov_buffer_w8(&mov->io, 0x00); // StyleRecord.face-style-flags + mov_buffer_w8(&mov->io, 0x12); // StyleRecord.font-size + mov_buffer_w8(&mov->io, 0xFF); // StyleRecord.text-color-rgba[4] + mov_buffer_w8(&mov->io, 0xFF); + mov_buffer_w8(&mov->io, 0xFF); + mov_buffer_w8(&mov->io, 0xFF); + + // FontTableBox + mov_buffer_w32(&mov->io, 18); /* size */ + mov_buffer_write(&mov->io, "ftab", 4); + mov_buffer_w16(&mov->io, 1); /* entry-count */ + mov_buffer_w16(&mov->io, 0x0001); /* FontRecord.font-ID */ + mov_buffer_w8(&mov->io, 5); /* FontRecord.font-name-length */ + mov_buffer_write(&mov->io, "Serif", 5); /* FontRecord.font[font-name-length] */ + + return 30 + 18; +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-udta.c b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-udta.c new file mode 100644 index 000000000..2b861cbf3 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-udta.c @@ -0,0 +1,74 @@ +#include "mov-udta.h" +#include "mov-ioutil.h" +#include "mov-memory-buffer.h" +#include "mov-internal.h" + +int mov_read_udta(struct mov_t* mov, const struct mov_box_t* box) +{ + mov_buffer_skip(&mov->io, box->size); + return mov_buffer_error(&mov->io); +} + +size_t mov_write_udta(const struct mov_t* mov) +{ + if (!mov->udta || mov->udta_size < 1) + return 0; + + mov_buffer_w32(&mov->io, 8 + (uint32_t)mov->udta_size); + mov_buffer_write(&mov->io, "udta", 4); + mov_buffer_write(&mov->io, mov->udta, mov->udta_size); + return 8 + (size_t)mov->udta_size; +} + +int mov_udta_meta_write(const struct mov_udta_meta_t* meta, void* data, int bytes) +{ + struct mov_ioutil_t w; + struct mov_memory_buffer_t ptr; + uint64_t pmeta, pilst, n; + + ptr.maxsize = bytes; + ptr.capacity = bytes; + ptr.off = 0; + ptr.ptr = (uint8_t*)data; + memset(&w, 0, sizeof(w)); + memcpy(&w.io, mov_memory_buffer(), sizeof(w.io)); + w.param = &ptr; + + pmeta = mov_buffer_tell(&w); + mov_buffer_w32(&w, 0); // placeholder + mov_buffer_write(&w, "meta", 4); + mov_buffer_w32(&w, 0); /* version & flags */ + + mov_buffer_w32(&w, 33); + mov_buffer_write(&w, "hdlr", 4); + mov_buffer_w32(&w, 0); /* version & flags */ + mov_buffer_w32(&w, 0); + mov_buffer_write(&w, "mdir", 4); + mov_buffer_write(&w, "appl", 4); + mov_buffer_w32(&w, 0); + mov_buffer_w32(&w, 0); + mov_buffer_w8(&w, 0); + + pilst = mov_buffer_tell(&w); + mov_buffer_w32(&w, 0); // placeholder + mov_buffer_write(&w, "ilst", 4); + + // write cover + mov_buffer_w32(&w, meta->cover_size + 16 + 8); + mov_buffer_write(&w, "covr", 4); + mov_buffer_w32(&w, meta->cover_size + 16); + mov_buffer_write(&w, "data", 4); + mov_buffer_w32(&w, 0); // TODO track tag + mov_buffer_w32(&w, 0); + mov_buffer_write(&w, meta->cover, meta->cover_size); + + // update box size + n = mov_buffer_tell(&w); + mov_buffer_seek(&w, pilst); + mov_buffer_w32(&w, (uint32_t)(n - pilst)); + mov_buffer_seek(&w, pmeta); + mov_buffer_w32(&w, (uint32_t)(n - pmeta)); + mov_buffer_seek(&w, n); // rewind + + return (int)ptr.bytes; +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-vpcc.c b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-vpcc.c new file mode 100644 index 000000000..a51006914 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-vpcc.c @@ -0,0 +1,40 @@ +#include "mov-internal.h" +#include +#include +#include + +// https://www.webmproject.org/vp9/mp4/ +// extra data: VPCodecConfigurationBox + +int mov_read_vpcc(struct mov_t* mov, const struct mov_box_t* box) +{ + struct mov_track_t* track = mov->track; + struct mov_sample_entry_t* entry = track->stsd.current; + if(box->size < 4) + return -1; + if (entry->extra_data_size < box->size-4) + { + void* p = realloc(entry->extra_data, (size_t)box->size-4); + if (NULL == p) return -ENOMEM; + entry->extra_data = p; + } + + mov_buffer_r8(&mov->io); /* version */ + mov_buffer_r24(&mov->io); /* flags */ + mov_buffer_read(&mov->io, entry->extra_data, box->size-4); + entry->extra_data_size = (int)box->size - 4; + return mov_buffer_error(&mov->io); +} + +size_t mov_write_vpcc(const struct mov_t* mov) +{ + const struct mov_track_t* track = mov->track; + const struct mov_sample_entry_t* entry = track->stsd.current; + mov_buffer_w32(&mov->io, entry->extra_data_size + 12); /* size */ + mov_buffer_write(&mov->io, "vpcC", 4); + mov_buffer_w8(&mov->io, 1); /* version */ + mov_buffer_w24(&mov->io, 0); /* flags */ + if (entry->extra_data_size > 0) + mov_buffer_write(&mov->io, entry->extra_data, entry->extra_data_size); + return entry->extra_data_size + 12; +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-vvc.c b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-vvc.c new file mode 100644 index 000000000..22973e2e0 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-vvc.c @@ -0,0 +1,38 @@ +#include "mov-internal.h" +#include +#include +#include + +// extra_data: ISO/IEC 14496-15 AVCDecoderConfigurationRecord +/* +class VvcConfigurationBox extends FullBox('vvcC',version=0,flags) { + VvcDecoderConfigurationRecord() VvcConfig; +} +*/ + +int mov_read_vvcc(struct mov_t* mov, const struct mov_box_t* box) +{ + struct mov_track_t* track = mov->track; + struct mov_sample_entry_t* entry = track->stsd.current; + if (entry->extra_data_size < box->size) + { + void* p = realloc(entry->extra_data, (size_t)box->size); + if (NULL == p) return -ENOMEM; + entry->extra_data = p; + } + + mov_buffer_read(&mov->io, entry->extra_data, box->size); + entry->extra_data_size = (int)box->size; + return mov_buffer_error(&mov->io); +} + +size_t mov_write_vvcc(const struct mov_t* mov) +{ + const struct mov_track_t* track = mov->track; + const struct mov_sample_entry_t* entry = track->stsd.current; + mov_buffer_w32(&mov->io, entry->extra_data_size + 8); /* size */ + mov_buffer_write(&mov->io, "vvcC", 4); + if (entry->extra_data_size > 0) + mov_buffer_write(&mov->io, entry->extra_data, entry->extra_data_size); + return entry->extra_data_size + 8; +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-writer.c b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-writer.c new file mode 100644 index 000000000..1a291f691 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/mov-writer.c @@ -0,0 +1,339 @@ +#include "mov-writer.h" +#include "mov-internal.h" +#include +#include +#include +#include +#include + +struct mov_writer_t +{ + struct mov_t mov; + uint64_t mdat_size; + uint64_t mdat_offset; +}; + +static int mov_write_tail(struct mov_t* mov) +{ + mov_buffer_w32(&mov->io, 8 + strlen(MOV_APP)); /* size */ + mov_buffer_write(&mov->io, "free", 4); + mov_buffer_write(&mov->io, MOV_APP, strlen(MOV_APP)); + return 0; +} + +static size_t mov_write_moov(struct mov_t* mov) +{ + int i; + size_t size; + uint64_t offset; + + size = 8 /* Box */; + offset = mov_buffer_tell(&mov->io); + mov_buffer_w32(&mov->io, 0); /* size */ + mov_buffer_write(&mov->io, "moov", 4); + + size += mov_write_mvhd(mov); +// size += mov_write_iods(mov); + for(i = 0; i < mov->track_count; i++) + { + mov->track = mov->tracks + i; + if (mov->track->sample_count < 1) + continue; + size += mov_write_trak(mov); + } + + size += mov_write_udta(mov); + mov_write_size(mov, offset, size); /* update size */ + return size; +} + +void mov_write_size(const struct mov_t* mov, uint64_t offset, size_t size) +{ + uint64_t offset2; + assert(size < UINT32_MAX); + offset2 = mov_buffer_tell(&mov->io); + mov_buffer_seek(&mov->io, offset); + mov_buffer_w32(&mov->io, (uint32_t)size); + mov_buffer_seek(&mov->io, offset2); +} + +static int mov_writer_init(struct mov_t* mov) +{ + mov->ftyp.major_brand = MOV_BRAND_ISOM; + mov->ftyp.minor_version = 0x200; + mov->ftyp.brands_count = 4; + mov->ftyp.compatible_brands[0] = MOV_BRAND_ISOM; + mov->ftyp.compatible_brands[1] = MOV_BRAND_ISO2; + mov->ftyp.compatible_brands[2] = MOV_BRAND_AVC1; + mov->ftyp.compatible_brands[3] = MOV_BRAND_MP41; + mov->header = 0; + return 0; +} + +struct mov_writer_t* mov_writer_create(const struct mov_buffer_t* buffer, void* param, int flags) +{ + struct mov_t* mov; + struct mov_writer_t* writer; + writer = (struct mov_writer_t*)calloc(1, sizeof(struct mov_writer_t)); + if (NULL == writer) + return NULL; + + mov = &writer->mov; + mov->flags = flags; + mov->io.param = param; + memcpy(&mov->io.io, buffer, sizeof(mov->io.io)); + + mov->mvhd.next_track_ID = 1; + mov->mvhd.creation_time = time(NULL) + 0x7C25B080; // 1970 based -> 1904 based; + mov->mvhd.modification_time = mov->mvhd.creation_time; + mov->mvhd.timescale = 1000; + mov->mvhd.duration = 0; // placeholder + + mov_writer_init(mov); + mov_write_ftyp(mov); + + // free(reserved for 64bit mdat) + mov_buffer_w32(&mov->io, 8); /* size */ + mov_buffer_write(&mov->io, "free", 4); + + // mdat + writer->mdat_offset = mov_buffer_tell(&mov->io); + mov_buffer_w32(&mov->io, 0); /* size */ + mov_buffer_write(&mov->io, "mdat", 4); + return writer; +} + +static int mov_writer_move(struct mov_t* mov, uint64_t to, uint64_t from, size_t bytes); +void mov_writer_destroy(struct mov_writer_t* writer) +{ + int i; + uint64_t offset, offset2; + struct mov_t* mov; + struct mov_track_t* track; + mov = &writer->mov; + + // finish mdat box + if (writer->mdat_size + 8 <= UINT32_MAX) + { + mov_write_size(mov, writer->mdat_offset, (uint32_t)(writer->mdat_size + 8)); /* update size */ + } + else + { + offset2 = mov_buffer_tell(&mov->io); + writer->mdat_offset -= 8; // overwrite free box + mov_buffer_seek(&mov->io, writer->mdat_offset); + mov_buffer_w32(&mov->io, 1); + mov_buffer_write(&mov->io, "mdat", 4); + mov_buffer_w64(&mov->io, writer->mdat_size + 16); + mov_buffer_seek(&mov->io, offset2); + } + + // finish sample info + for (i = 0; i < mov->track_count; i++) + { + track = &mov->tracks[i]; + if(track->sample_count < 1) + continue; + + // pts in ms + track->mdhd.duration = (track->samples[track->sample_count - 1].dts - track->samples[0].dts); + if (track->sample_count > 1) + { + // duration += 3/4 * avg-duration + 1/4 * last-frame-duration + track->mdhd.duration += track->mdhd.duration * 3 / (track->sample_count - 1) / 4 + (track->samples[track->sample_count - 1].dts - track->samples[track->sample_count - 2].dts) / 4; + } + //track->mdhd.duration = track->mdhd.duration * track->mdhd.timescale / 1000; + track->tkhd.duration = track->mdhd.duration * mov->mvhd.timescale / track->mdhd.timescale; + if (track->tkhd.duration > mov->mvhd.duration) + mov->mvhd.duration = track->tkhd.duration; // maximum track duration + } + + // write moov box + offset = mov_buffer_tell(&mov->io); + mov_write_moov(mov); + offset2 = mov_buffer_tell(&mov->io); + + if (MOV_FLAG_FASTSTART & mov->flags) + { + // check stco -> co64 + uint64_t co64 = 0; + for (i = 0; i < mov->track_count; i++) + { + co64 += mov_stco_size(&mov->tracks[i], offset2 - offset); + } + + if (co64) + { + uint64_t sz; + do + { + sz = co64; + co64 = 0; + for (i = 0; i < mov->track_count; i++) + { + co64 += mov_stco_size(&mov->tracks[i], offset2 - offset + sz); + } + } while (sz != co64); + } + + // rewrite moov + for (i = 0; i < mov->track_count; i++) + mov->tracks[i].offset += (offset2 - offset) + co64; + + mov_buffer_seek(&mov->io, offset); + mov_write_moov(mov); + assert(mov_buffer_tell(&mov->io) == offset2 + co64); + offset2 = mov_buffer_tell(&mov->io); + + mov_writer_move(mov, writer->mdat_offset, offset, (size_t)(offset2 - offset)); + } + + mov_write_tail(mov); + for (i = 0; i < mov->track_count; i++) + mov_free_track(mov->tracks + i); + if (mov->tracks) + free(mov->tracks); + free(writer); +} + +static int mov_writer_move(struct mov_t* mov, uint64_t to, uint64_t from, size_t bytes) +{ + uint8_t* ptr; + uint64_t i, j; + void* buffer[2]; + + assert(bytes < INT32_MAX); + ptr = malloc((size_t)(bytes * 2)); + if (NULL == ptr) + return -ENOMEM; + buffer[0] = ptr; + buffer[1] = ptr + bytes; + + mov_buffer_seek(&mov->io, from); + mov_buffer_read(&mov->io, buffer[0], bytes); + mov_buffer_seek(&mov->io, to); + mov_buffer_read(&mov->io, buffer[1], bytes); + + j = 0; + for (i = to; i < from; i += bytes) + { + mov_buffer_seek(&mov->io, i); + mov_buffer_write(&mov->io, buffer[j], bytes); + // MSDN: fopen https://msdn.microsoft.com/en-us/library/yeby3zcb.aspx + // When the "r+", "w+", or "a+" access type is specified, both reading and + // writing are enabled (the file is said to be open for "update"). + // However, when you switch from reading to writing, the input operation + // must encounter an EOF marker. If there is no EOF, you must use an intervening + // call to a file positioning function. The file positioning functions are + // fsetpos, fseek, and rewind. + // When you switch from writing to reading, you must use an intervening + // call to either fflush or to a file positioning function. + mov_buffer_seek(&mov->io, i+bytes); + mov_buffer_read(&mov->io, buffer[j], bytes); + j ^= 1; + } + + mov_buffer_seek(&mov->io, i); + mov_buffer_write(&mov->io, buffer[j], bytes - (size_t)(i - from)); + + free(ptr); + return mov_buffer_error(&mov->io); +} + +int mov_writer_write(struct mov_writer_t* writer, int track, const void* data, size_t bytes, int64_t pts, int64_t dts, int flags) +{ + struct mov_t* mov; + struct mov_sample_t* sample; + + assert(bytes < UINT32_MAX); + if (track < 0 || track >= (int)writer->mov.track_count) + return -ENOENT; + + mov = &writer->mov; + mov->track = &mov->tracks[track]; + + if (mov->track->sample_count + 1 >= mov->track->sample_offset) + { + void* ptr = realloc(mov->track->samples, sizeof(struct mov_sample_t) * (mov->track->sample_offset + 1024)); + if (NULL == ptr) return -ENOMEM; + mov->track->samples = ptr; + mov->track->sample_offset += 1024; + } + + pts = pts * mov->track->mdhd.timescale / 1000; + dts = dts * mov->track->mdhd.timescale / 1000; + + sample = &mov->track->samples[mov->track->sample_count++]; + sample->sample_description_index = 1; + sample->bytes = (uint32_t)bytes; + sample->flags = flags; + sample->data = NULL; + sample->pts = pts; + sample->dts = dts; + + sample->offset = mov_buffer_tell(&mov->io); + mov_buffer_write(&mov->io, data, bytes); + + if (INT64_MIN == mov->track->start_dts) + mov->track->start_dts = sample->dts; + writer->mdat_size += bytes; // update media data size + return mov_buffer_error(&mov->io); +} + +int mov_writer_add_audio(struct mov_writer_t* writer, uint8_t object, int channel_count, int bits_per_sample, int sample_rate, const void* extra_data, size_t extra_data_size) +{ + struct mov_t* mov; + struct mov_track_t* track; + + mov = &writer->mov; + track = mov_add_track(mov); + if (NULL == track) + return -ENOMEM; + + if (0 != mov_add_audio(track, &mov->mvhd, 1000, object, channel_count, bits_per_sample, sample_rate, extra_data, extra_data_size)) + return -ENOMEM; + + mov->mvhd.next_track_ID++; + return mov->track_count++; +} + +int mov_writer_add_video(struct mov_writer_t* writer, uint8_t object, int width, int height, const void* extra_data, size_t extra_data_size) +{ + struct mov_t* mov; + struct mov_track_t* track; + + mov = &writer->mov; + track = mov_add_track(mov); + if (NULL == track) + return -ENOMEM; + + if (0 != mov_add_video(track, &mov->mvhd, 1000, object, width, height, extra_data, extra_data_size)) + return -ENOMEM; + + mov->mvhd.next_track_ID++; + return mov->track_count++; +} + +int mov_writer_add_subtitle(struct mov_writer_t* writer, uint8_t object, const void* extra_data, size_t extra_data_size) +{ + struct mov_t* mov; + struct mov_track_t* track; + + mov = &writer->mov; + track = mov_add_track(mov); + if (NULL == track) + return -ENOMEM; + + if (0 != mov_add_subtitle(track, &mov->mvhd, 1000, object, extra_data, extra_data_size)) + return -ENOMEM; + + mov->mvhd.next_track_ID++; + return mov->track_count++; +} + +int mov_writer_add_udta(mov_writer_t* mov, const void* data, size_t size) +{ + mov->mov.udta = data; + mov->mov.udta_size = size; + return 0; +} diff --git a/src/big/mpp/middleware/src/mp4_format/src/libmov/source/test.mp4 b/src/big/mpp/middleware/src/mp4_format/src/libmov/source/test.mp4 new file mode 100644 index 000000000..e69de29bb diff --git a/src/big/mpp/middleware/src/mp4_format/src/mp4_format.c b/src/big/mpp/middleware/src/mp4_format/src/mp4_format.c new file mode 100644 index 000000000..34d2afa4d --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_format/src/mp4_format.c @@ -0,0 +1,794 @@ +#include +#include +#include +#include "mp4_format.h" +#include "mov-writer.h" +#include "mov-reader.h" +#include "mpeg4-avc.h" +#include "mpeg4-hevc.h" +#include "mov-format.h" +#include "mp4-writer.h" + +#define MAX_INSTANCE_NUM 4 +#define MAX_TRACK_NUM 3 +static pthread_mutex_t s_mutex = PTHREAD_MUTEX_INITIALIZER; + +struct mov_file_cache_t +{ + FILE* fp; + uint8_t ptr[64 * 1024]; + unsigned int len; + unsigned int off; + uint64_t tell; +}; + +typedef struct kmp4_packet_t { + int flags; + uint64_t pts; + uint64_t dts; + uint32_t track_id; + void *ptr; + size_t bytes; +} k_mp4_packet_t; + +typedef struct ktrack_info_s { + struct mpeg4_avc_t s_avc; + struct mpeg4_hevc_t s_hevc; + uint32_t obj_id; +} k_track_info_s; + +typedef struct kdemuxer_instance { + struct mov_reader_t *mov; + struct mov_file_cache_t file_cache; + k_track_info_s track_ctx; +} k_demuxer_instance; + +typedef struct ktrack_ctx { + uint8_t s_extra_data[64 * 1024]; + uint32_t time_scale; + uint32_t width; + uint32_t height; + uint32_t pts; + uint32_t dts; + int track_flag; + int add_to_mp4; + int has_get_idr; + int has_vps; + int has_sps; + int has_pps; + int has_idr; + k_mp4_track_type_e track_type; + struct mpeg4_avc_t avc; + struct mpeg4_hevc_t hevc; + k_mp4_audio_info_s audio_info; + k_mp4_video_info_s video_info; +} k_track_ctx; + +typedef struct kmuxer_instance { + struct mp4_writer_t *mov; + k_track_ctx *track[MAX_TRACK_NUM]; + FILE *fp; +} k_muxer_instance; + +typedef struct kmp4_instance { + k_mp4_config_type_e instance_type; + union { + k_muxer_instance muxer_instance; + k_demuxer_instance demuxer_instance; + }; + uint8_t buffer[2 * 1024 * 1024]; + size_t buffer_size; + uint8_t buffer2[2 * 1024 * 1024]; + size_t buffer2_size; +} k_mp4_instance; + +static int mov_file_read(void* fp, void* data, uint64_t bytes) +{ + if (bytes == fread(data, 1, bytes, (FILE*)fp)) + return 0; + return 0 != ferror((FILE*)fp) ? ferror((FILE*)fp) : -1 /*EOF*/; +} + +static int mov_file_write(void* fp, const void* data, uint64_t bytes) +{ + return bytes == fwrite(data, 1, bytes, (FILE*)fp) ? 0 : ferror((FILE*)fp); +} + +static int mov_file_seek(void* fp, int64_t offset) +{ + return fseek((FILE*)fp, offset, offset >= 0 ? SEEK_SET : SEEK_END); +} + +static int64_t mov_file_tell(void* fp) +{ + return ftell((FILE*)fp); +} + +static int mov_file_cache_read(void* fp, void* data, uint64_t bytes) +{ + uint8_t* p = (uint8_t*)data; + struct mov_file_cache_t* file = (struct mov_file_cache_t*)fp; + while (bytes > 0) + { + assert(file->off <= file->len); + if (file->off >= file->len) + { + if (bytes >= sizeof(file->ptr)) + { + if (bytes == fread(p, 1, bytes, file->fp)) + { + file->tell += bytes; + return 0; + } + return 0 != ferror(file->fp) ? ferror(file->fp) : -1 /*EOF*/; + } + else + { + file->off = 0; + file->len = (unsigned int)fread(file->ptr, 1, sizeof(file->ptr), file->fp); + if (file->len < 1) + return 0 != ferror(file->fp) ? ferror(file->fp) : -1 /*EOF*/; + } + } + + if (file->off < file->len) + { + unsigned int n = file->len - file->off; + n = n > bytes ? (unsigned int)bytes : n; + memcpy(p, file->ptr + file->off, n); + file->tell += n; + file->off += n; + bytes -= n; + p += n; + } + } + + return 0; +} + +static int mov_file_cache_write(void* fp, const void* data, uint64_t bytes) +{ + struct mov_file_cache_t* file = (struct mov_file_cache_t*)fp; + + file->tell += bytes; + + if (file->off + bytes < sizeof(file->ptr)) + { + memcpy(file->ptr + file->off, data, bytes); + file->off += (unsigned int)bytes; + return 0; + } + + // write buffer + if (file->off > 0) + { + if (file->off != fwrite(file->ptr, 1, file->off, file->fp)) + return ferror(file->fp); + file->off = 0; // clear buffer + } + + // write data; + return bytes == fwrite(data, 1, bytes, file->fp) ? 0 : ferror(file->fp); +} + +static int mov_file_cache_seek(void* fp, int64_t offset) +{ + int r; + struct mov_file_cache_t* file = (struct mov_file_cache_t*)fp; + if (offset != file->tell) + { + if (file->off > file->len) + { + // write bufferred data + if(file->off != fwrite(file->ptr, 1, file->off, file->fp)) + return ferror(file->fp); + } + + file->off = file->len = 0; + r = fseek(file->fp, offset, offset >= 0 ? SEEK_SET : SEEK_END); + file->tell = ftell(file->fp); + return r; + } + return 0; +} + +static int64_t mov_file_cache_tell(void* fp) +{ + struct mov_file_cache_t* file = (struct mov_file_cache_t*)fp; + if (ftell(file->fp) != (int64_t)(file->tell + (uint64_t)(int)(file->len - file->off))) + return -1; + return (int64_t)file->tell; + //return ftell(file->fp); +} + +const struct mov_buffer_t* mov_file_buffer(void) +{ + static struct mov_buffer_t s_io = { + mov_file_read, + mov_file_write, + mov_file_seek, + mov_file_tell, + }; + return &s_io; +}; + +const struct mov_buffer_t* mov_file_cache_buffer(void) +{ + static struct mov_buffer_t s_io = { + mov_file_cache_read, + mov_file_cache_write, + mov_file_cache_seek, + mov_file_cache_tell, + }; + return &s_io; +}; + +static const uint8_t* startcode(const uint8_t *data, size_t bytes) +{ + size_t i; + for (i = 2; i + 1 < bytes; i++) + { + if (0x01 == data[i] && 0x00 == data[i - 1] && 0x00 == data[i - 2]) + return data + i + 1; + } + + return NULL; +} + +static void mov_video_info(void *param, uint32_t track_id, uint32_t time_scale, uint8_t object, int width, int height, const void *extra, size_t bytes) { + k_mp4_track_info_s *track_info = (k_mp4_track_info_s*)param; + track_info->track_type = K_MP4_STREAM_VIDEO; + track_info->time_scale = time_scale; + if (MOV_OBJECT_H264 == object) { + // mpeg4_avc_decoder_configuration_record_load((const uint8_t*)extra, bytes, &s_avc); + track_info->video_info.codec_id = K_MP4_CODEC_ID_H264; + track_info->video_info.width = width; + track_info->video_info.height = height; + track_info->video_info.track_id = track_id; + } else if (MOV_OBJECT_H265 == object) { + track_info->video_info.codec_id = K_MP4_CODEC_ID_H265; + track_info->video_info.width = width; + track_info->video_info.height = height; + track_info->video_info.track_id = track_id; + } + + return; +} + +static void mov_audio_info(void *param, uint32_t track_id, uint32_t time_scale, uint8_t object, int channel_count, int bit_per_sample, int sample_rate, const void *extra, size_t bytes) { + k_mp4_track_info_s *track_info = (k_mp4_track_info_s*)param; + track_info->track_type = K_MP4_STREAM_AUDIO; + track_info->time_scale = time_scale; + if (MOV_OBJECT_G711a == object || MOV_OBJECT_G711u == object) { + track_info->audio_info.channels = channel_count; + if (MOV_OBJECT_G711a == object) + track_info->audio_info.codec_id = K_MP4_CODEC_ID_G711A; + else if (MOV_OBJECT_G711u == object) + track_info->audio_info.codec_id = K_MP4_CODEC_ID_G711U; + track_info->audio_info.sample_rate = sample_rate; + track_info->audio_info.bit_per_sample = bit_per_sample; + track_info->audio_info.track_id = track_id; + } + + return; +} + +static void* onalloc(void* param, uint32_t track, size_t bytes, int64_t pts, int64_t dts, int flags) +{ + k_mp4_packet_t* pkt = (k_mp4_packet_t*)param; + if (pkt->bytes < bytes) + return NULL; + pkt->flags = flags; + pkt->pts = pts; + pkt->dts = dts; + pkt->track_id = track; + pkt->bytes = bytes; + return pkt->ptr; +} + +int kd_mp4_create(KD_HANDLE *mp4_handle, k_mp4_config_s *mp4_cfg) { + if (!mp4_cfg) { + printf("kd_mp4_create: mp4 config is null.\n"); + return -1; + } + + k_mp4_instance *mp4_instance = NULL; + mp4_instance = (k_mp4_instance *)calloc(1, sizeof(k_mp4_instance)); + if (!mp4_instance) { + printf("kd_mp4_create: create mp4 instance failed.\n"); + return -1; + } + mp4_instance->buffer_size = 2 * 1024 * 1024; + mp4_instance->buffer2_size = 2 * 1024 * 1024; + + mp4_instance->instance_type = mp4_cfg->config_type; + + switch (mp4_cfg->config_type) { + case K_MP4_CONFIG_MUXER: { + FILE *fp = fopen(mp4_cfg->muxer_config.file_name, "wb+"); + if (!fp) { + printf("kd_mp4_create: output file %s open failed.\n", mp4_cfg->muxer_config.file_name); + return -1; + } + + // remove "MOV_FLAG_SEGMENT", in order to obtain fmp4-duration.. TODO + mp4_instance->muxer_instance.mov = mp4_writer_create(mp4_cfg->muxer_config.fmp4_flag, mov_file_buffer(), fp, MOV_FLAG_FASTSTART /*| MOV_FLAG_SEGMENT*/); + if (!mp4_instance->muxer_instance.mov) { + printf("kd_mp4_create: create mp4 writer failed.\n"); + return -1; + } + mp4_instance->muxer_instance.fp = fp; + break; + } + case K_MP4_CONFIG_DEMUXER: { + struct mov_file_cache_t *file_cache = &(mp4_instance->demuxer_instance.file_cache); + file_cache->fp = fopen(mp4_cfg->demuxer_config.file_name, "rb"); + if (!file_cache->fp) { + printf("input file %s open failed.\n", mp4_cfg->demuxer_config.file_name); + return -1; + } + mp4_instance->demuxer_instance.mov = mov_reader_create(mov_file_cache_buffer(), file_cache); + if (!mp4_instance->demuxer_instance.mov) { + printf("kd_mp4_create: create mp4 reader failed.\n"); + return -1; + } + + k_demuxer_instance *demuxer = &mp4_instance->demuxer_instance; + uint8_t extra_data[1024]; + int32_t extra_data_size = 0; + uint8_t obj_id; + mov_reader_video_entry_info(demuxer->mov, &obj_id, extra_data, &extra_data_size); + if (extra_data_size) { + if (obj_id == MOV_OBJECT_H264) + mpeg4_avc_decoder_configuration_record_load((const uint8_t*)extra_data, extra_data_size, &demuxer->track_ctx.s_avc); + else if (obj_id == MOV_OBJECT_HEVC) { + mpeg4_hevc_decoder_configuration_record_load((const uint8_t*)extra_data, extra_data_size, &demuxer->track_ctx.s_hevc); + } + } + + break; + } + default : { + printf("kd_mp4_create: mp4 config type not support.\n"); + return -1; + } + } + + *mp4_handle = (KD_HANDLE)mp4_instance; + + return 0; +} + +int kd_mp4_destroy(KD_HANDLE mp4_handle) { + if (mp4_handle == NULL) { + printf("kd_mp4_destroy: mp4 handle is null.\n"); + return -1; + } + + k_mp4_instance *mp4_instance = (k_mp4_instance *)mp4_handle; + + switch (mp4_instance->instance_type) { + case K_MP4_CONFIG_MUXER: { + if (mp4_instance->muxer_instance.mov) { + mp4_writer_destroy(mp4_instance->muxer_instance.mov); + mp4_instance->muxer_instance.mov = NULL; + } + if (mp4_instance->muxer_instance.fp) { + fclose(mp4_instance->muxer_instance.fp); + mp4_instance->muxer_instance.fp = NULL; + } + break; + } + case K_MP4_CONFIG_DEMUXER: { + if (mp4_instance->demuxer_instance.mov) { + mov_reader_destroy(mp4_instance->demuxer_instance.mov); + mp4_instance->demuxer_instance.mov = NULL; + if (mp4_instance->demuxer_instance.file_cache.fp) { + fclose(mp4_instance->demuxer_instance.file_cache.fp); + mp4_instance->demuxer_instance.file_cache.fp = NULL; + } + } + break; + } + default : { + printf("kd_mp4_destroy: mp4 config type not support.\n"); + return -1; + } + } + + if (mp4_instance) { + free(mp4_instance); + mp4_instance = NULL; + } + + return 0; +} + +int kd_mp4_create_track(KD_HANDLE mp4_handle, KD_HANDLE *track_handle, k_mp4_track_info_s *mp4_track_info) { + if (mp4_handle == NULL) { + printf("kd_mp4_create_track: mp4 handl is null.\n"); + return -1; + } + + k_mp4_instance *mp4_instance = (k_mp4_instance *)mp4_handle; + k_track_ctx *track = NULL; + + if (mp4_track_info->track_type == K_MP4_STREAM_VIDEO) { + track = (k_track_ctx *)calloc(1, sizeof(k_track_ctx)); + if (!track) { + printf("kd_mp4_create_track: create track failed.\n"); + return -1; + } + + track->track_type = K_MP4_STREAM_VIDEO; + track->time_scale = mp4_track_info->time_scale; + track->pts = 0; + track->dts = 0; + track->width = mp4_track_info->video_info.width; + track->height = mp4_track_info->video_info.height; + track->track_flag = 1; + track->add_to_mp4 = -1; + track->has_get_idr = 0; + track->has_vps = 0; + track->has_sps = 0; + track->has_pps = 0; + track->has_idr = 0; + memcpy(&track->video_info, &(mp4_track_info->video_info), sizeof(k_mp4_video_info_s)); + } else if (mp4_track_info->track_type == K_MP4_STREAM_AUDIO) { + track = (k_track_ctx *)calloc(1, sizeof(k_track_ctx)); + if (!track) { + printf("kd_mp4_create_track: create track failed.\n"); + return -1; + } + + track->track_type = K_MP4_STREAM_AUDIO; + track->pts = 0; + track->dts = 0; + track->track_flag = 1; + track->add_to_mp4 = -1; + memcpy(&track->audio_info, &(mp4_track_info->audio_info), sizeof(k_mp4_audio_info_s)); + } else { + printf("kd_mp4_create_track: the track type is invalid.\n"); + return -1; + } + + *track_handle = (KD_HANDLE)track; + + int track_set_to_mp4 = 0; + pthread_mutex_lock(&s_mutex); + for (int i = 0; i < MAX_TRACK_NUM; i++) { + if (mp4_instance->muxer_instance.track[i] == NULL) { + mp4_instance->muxer_instance.track[i] = track; + track_set_to_mp4 = 1; + break; + } + } + pthread_mutex_unlock(&s_mutex); + + if (!track_set_to_mp4) { + printf("kd_mp4_create_track: mp4 already cannot creat new track.\n"); + return -1; + } + + return 0; +} + +int kd_mp4_destroy_tracks(KD_HANDLE mp4_handle) { + if (mp4_handle == NULL) { + printf("kd_mp4_destroy_tracks: mp4 handle is null.\n"); + return -1; + } + + k_mp4_instance *mp4_instance = (k_mp4_instance *)mp4_handle; + if (mp4_instance->instance_type == K_MP4_CONFIG_DEMUXER) { + printf("kd_mp4_destroy_tracks: this interface not support demuxer type.\n"); + return -1; + } + + for (int i = 0; i < MAX_TRACK_NUM; i++) { + if (mp4_instance->muxer_instance.track[i]) { + free(mp4_instance->muxer_instance.track[i]); + mp4_instance->muxer_instance.track[i] = NULL; + } + } + + return 0; +} + +static k_track_ctx * get_audio_track(KD_HANDLE mp4_handle) { + if (mp4_handle == NULL) { + return NULL; + } + + k_mp4_instance *mp4_instance = (k_mp4_instance *)mp4_handle; + if (mp4_instance->instance_type == K_MP4_CONFIG_DEMUXER) { + return NULL; + } + + for (int i = 0; i < MAX_TRACK_NUM; i++) { + k_track_ctx *track = mp4_instance->muxer_instance.track[i]; + if (track && track->track_type == K_MP4_STREAM_AUDIO) { + return track; + } + } + return NULL; +} + +int kd_mp4_write_frame(KD_HANDLE mp4_handle, KD_HANDLE track_handle, k_mp4_frame_data_s *frame_data) { + if (mp4_handle == NULL || track_handle == NULL) { + printf("k_mp4_write_frame: mp4 handle or track handle is null.\n"); + return -1; + } + + k_mp4_instance *mp4_instance = (k_mp4_instance *)mp4_handle; + if (mp4_instance->instance_type == K_MP4_CONFIG_DEMUXER) { + printf("kd_mp4_write_frame: this interface not support demuxer.\n"); + return -1; + } + + k_track_ctx *track = (k_track_ctx *)track_handle; + + if (track->track_type == K_MP4_STREAM_VIDEO) { + const uint8_t *ptr, *nalu, *end; + uint32_t ptr_len; + + ptr = (const uint8_t *)frame_data->data; + ptr_len = frame_data->data_length; + end = ptr + ptr_len; + const uint8_t *p = ptr; + + if (!track->has_get_idr) { + if (frame_data->codec_id == K_MP4_CODEC_ID_H264) { + while (1) { + nalu = startcode(p, (int)(end - p)); + if (!nalu) { + break; + } + int nalu_type = nalu[0] & 0x1F; + if (nalu_type == 7) { + track->has_sps = 1; + } else if (nalu_type == 8) { + track->has_pps = 1; + } else if (nalu_type == 5) { + track->has_idr = 1; + } + p = nalu; + } + if (track->has_sps && track->has_pps && track->has_idr) { + track->has_get_idr = 1; + } else { + printf("kd_mp4_write_frame: mp4 muxer write should start with key frame (header + idr).\n"); + return -1; + } + } else if (frame_data->codec_id == K_MP4_CODEC_ID_H265) { + while (1) { + nalu = startcode(p, (int)(end - p)); + if (!nalu) { + break; + } + int nalu_type = (nalu[0] >> 1) &0x3f; + if (nalu_type == 32) { + track->has_vps = 1; + } else if (nalu_type == 33) { + track->has_sps = 1; + } else if (nalu_type == 34) { + track->has_pps = 1; + } else if (nalu_type == 19) { + track->has_idr = 1; + } + p = nalu; + } + if (track->has_vps && track->has_sps && track->has_pps && track->has_idr) { + track->has_get_idr = 1; + } else { + printf("kd_mp4_write_frame: mp4 muxer write should start with key frame (header + idr).\n"); + return -1; + } + } + } + + int vcl = 0; + int update = 0; + uint8_t *s_buffer = mp4_instance->buffer; + size_t s_buffer_size = mp4_instance->buffer_size; + if (frame_data->codec_id == K_MP4_CODEC_ID_H264) { + int n = h264_annexbtomp4(&track->avc, ptr, ptr_len, s_buffer, s_buffer_size, &vcl, &update); + if (track->add_to_mp4 < 0) { + if (track->avc.nb_sps < 1 || track->avc.nb_pps < 1) { + return -2; + } + + int extra_data_size = mpeg4_avc_decoder_configuration_record_save(&track->avc, track->s_extra_data, sizeof(track->s_extra_data)); + if (extra_data_size <= 0) { + return -1; + } + + track->add_to_mp4 = mp4_writer_add_video(mp4_instance->muxer_instance.mov, MOV_OBJECT_H264, track->width, track->height, track->s_extra_data, extra_data_size); + if (track->add_to_mp4 < 0) + return -1; + + // FIXME, code-refactor expected + #if 0 + k_track_ctx *track_audio = get_audio_track(mp4_handle); + if (track_audio && track_audio->add_to_mp4 < 0) { + track_audio->add_to_mp4 = mp4_writer_add_audio(mp4_instance->muxer_instance.mov, MOV_OBJECT_G711u, 1, 16, 8000, NULL, 0); + } + #endif + mp4_writer_init_segment(mp4_instance->muxer_instance.mov); + } + + track->pts = frame_data->time_stamp / 1000; + mp4_writer_write(mp4_instance->muxer_instance.mov, track->add_to_mp4, s_buffer, n, track->pts, track->pts, vcl == 1 ? MOV_AV_FLAG_KEYFREAME : 0); + } else if (frame_data->codec_id == K_MP4_CODEC_ID_H265) { + int n = h265_annexbtomp4(&track->hevc, ptr, ptr_len, s_buffer, s_buffer_size, &vcl, &update); + if (track->add_to_mp4 < 0) { + if (track->hevc.numOfArrays < 1) { + return -2; + } + + int extra_data_size = mpeg4_hevc_decoder_configuration_record_save(&track->hevc, track->s_extra_data, sizeof(track->s_extra_data)); + if (extra_data_size <= 0) { + return -1; + } + + track->add_to_mp4 = mp4_writer_add_video(mp4_instance->muxer_instance.mov, MOV_OBJECT_HEVC, track->width, track->height, track->s_extra_data, extra_data_size); + if (track->add_to_mp4 < 0) { + return -1; + } + + // FIXME, code-refactor expected + #if 0 + k_track_ctx *track_audio = get_audio_track(mp4_handle); + if (track_audio && track_audio->add_to_mp4 < 0) { + track_audio->add_to_mp4 = mp4_writer_add_audio(mp4_instance->muxer_instance.mov, MOV_OBJECT_G711u, 1, 16, 8000, NULL, 0); + } + #endif + mp4_writer_init_segment(mp4_instance->muxer_instance.mov); + } + track->pts = frame_data->time_stamp / 1000; + mp4_writer_write(mp4_instance->muxer_instance.mov, track->add_to_mp4, s_buffer, n, track->pts, track->pts, 1 == vcl ? MOV_AV_FLAG_KEYFREAME : 0); + } + } else if (track->track_type == K_MP4_STREAM_AUDIO) { + if (frame_data->codec_id == K_MP4_CODEC_ID_G711A) { + if (track->add_to_mp4 < 0) { + int channels = track->audio_info.channels; + int sample_rate = track->audio_info.sample_rate; + int bit_per_sample = track->audio_info.bit_per_sample; + track->add_to_mp4 = mp4_writer_add_audio(mp4_instance->muxer_instance.mov, MOV_OBJECT_G711a, channels, bit_per_sample, sample_rate, NULL, 0); + } + + track->pts = frame_data->time_stamp / 1000; + mp4_writer_write(mp4_instance->muxer_instance.mov, track->add_to_mp4, frame_data->data, frame_data->data_length, track->pts, track->pts, 0); + } else if (frame_data->codec_id == K_MP4_CODEC_ID_G711U) { + if (track->add_to_mp4 < 0) { + int channels = track->audio_info.channels; + int sample_rate = track->audio_info.sample_rate; + int bit_per_sample = track->audio_info.bit_per_sample; + track->add_to_mp4 = mp4_writer_add_audio(mp4_instance->muxer_instance.mov, MOV_OBJECT_G711u, channels, bit_per_sample, sample_rate, NULL, 0); + } + + track->pts = frame_data->time_stamp / 1000; + mp4_writer_write(mp4_instance->muxer_instance.mov, track->add_to_mp4, frame_data->data, frame_data->data_length, track->pts, track->pts, 0); + } + } + + return 0; +} + +int kd_mp4_get_file_info(KD_HANDLE mp4_handle, k_mp4_file_info_s *file_info) { + if (file_info) { + file_info->duration = 0; + file_info->track_num = 0; + } + + if (mp4_handle == NULL || file_info == NULL) { + printf("kd_mp4_get_file_info: mp4 handle or file_info is null.\n"); + return -1; + } + + k_mp4_instance *mp4_instance = (k_mp4_instance *)mp4_handle; + + if (mp4_instance->instance_type != K_MP4_CONFIG_DEMUXER) { + printf("kd_mp4_get_file_info: this interface is not support muxer.\n"); + return -1; + } + + mov_reader_t *reader = mp4_instance->demuxer_instance.mov; + file_info->duration = mov_reader_getduration(reader); + file_info->track_num = mov_reader_gettrackcount(reader); + + return 0; +} + +int kd_mp4_get_track_by_index(KD_HANDLE mp4_handle, uint32_t index, k_mp4_track_info_s *mp4_track_info) { + if (mp4_handle == NULL || mp4_track_info == NULL) { + printf("kd_mp4_get_track_by_index: mp4 handle or mp4_track_info is null.\n"); + return -1; + } + + k_mp4_instance *mp4_instance = (k_mp4_instance *)mp4_handle; + + struct mov_reader_t *reader = mp4_instance->demuxer_instance.mov; + + uint32_t track_num = mov_reader_gettrackcount(reader); + if (index < 0 || index > track_num) { + printf("k_mp4_get_track_by_index: the track index: %d is invalid.\n", index); + return -1; + } + + struct mov_reader_trackinfo_t info = {mov_video_info, mov_audio_info, NULL}; + mov_reader_getinfo(reader, index, &info, mp4_track_info); + + return 0; +} + +int kd_mp4_get_frame(KD_HANDLE mp4_handle, k_mp4_frame_data_s *frame_data) { + if (mp4_handle == NULL || frame_data == NULL) { + printf("kd_mp4_get_frame: mp4 handle or frame_data is null.\n"); + return -1; + } + + k_mp4_instance *mp4_instance = (k_mp4_instance *)mp4_handle; + if (mp4_instance->instance_type == K_MP4_CONFIG_MUXER) { + printf("kd_mp4_get_frame: this interface is not support muxer.\n"); + return -1; + } + + uint8_t *s_buffer = mp4_instance->buffer; + size_t s_buffer_size = mp4_instance->buffer_size; + k_mp4_packet_t pkt; + memset(&pkt, 0, sizeof(pkt)); + pkt.ptr = s_buffer; + pkt.bytes = s_buffer_size; + int ret = mov_reader_read2(mp4_instance->demuxer_instance.mov, onalloc, &pkt); + if (ret < 0) { + printf("kd_mp4_get_frame: get packet failed.\n"); + return -1; + } + if (ret == 0) { + printf("kd_mp4_get_frame: demuxer has finished.\n"); + frame_data->eof = 1; + return ret; + } + + uint8_t *s_packet = mp4_instance->buffer2; + size_t s_packet_size = mp4_instance->buffer2_size; + uint32_t object_id = mov_reader_objectid(mp4_instance->demuxer_instance.mov, pkt.track_id); + if (object_id == MOV_OBJECT_H264) { + assert(h264_is_new_access_unit((const uint8_t*)pkt.ptr + 4, pkt.bytes - 4)); + uint32_t n = h264_mp4toannexb(&mp4_instance->demuxer_instance.track_ctx.s_avc, pkt.ptr, pkt.bytes, s_packet, s_packet_size); + frame_data->data = s_packet; + frame_data->data_length = n; + frame_data->time_stamp = pkt.pts; + frame_data->codec_id = K_MP4_CODEC_ID_H264; + } else if (object_id == MOV_OBJECT_H265) { + assert(h265_is_new_access_unit((const uint8_t*)pkt.ptr + 4, pkt.bytes - 4)); + uint32_t n = h265_mp4toannexb(&mp4_instance->demuxer_instance.track_ctx.s_hevc, pkt.ptr, pkt.bytes, s_packet, s_packet_size); + frame_data->data = s_packet; + frame_data->data_length = n; + frame_data->time_stamp = pkt.pts; + frame_data->codec_id = K_MP4_CODEC_ID_H265; + } else if (object_id == MOV_OBJECT_G711a) { + frame_data->codec_id = K_MP4_CODEC_ID_G711A; + #if 0 + frame_data->data = (uint8_t*)pkt.ptr + 2; + frame_data->data_length = pkt.bytes - 2; + #else + frame_data->data = (uint8_t*)pkt.ptr; + frame_data->data_length = pkt.bytes; + #endif + frame_data->time_stamp = pkt.pts; + } else if (object_id == MOV_OBJECT_G711u) { + frame_data->codec_id = K_MP4_CODEC_ID_G711U; + #if 0 + frame_data->data = (uint8_t*)pkt.ptr + 2; + frame_data->data_length = pkt.bytes - 2; + #else + frame_data->data = (uint8_t*)pkt.ptr; + frame_data->data_length = pkt.bytes; + #endif + frame_data->time_stamp = pkt.pts; + } + + return 0; +} diff --git a/src/big/mpp/middleware/src/mp4_player/Makefile b/src/big/mpp/middleware/src/mp4_player/Makefile new file mode 100644 index 000000000..e18dbdf6a --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_player/Makefile @@ -0,0 +1,56 @@ +include $(MPP_SRC_DIR)/middleware/mpp.mk +include $(MPP_SRC_DIR)/middleware/rt-smart.mk + +AR = riscv64-unknown-linux-musl-ar +ARFLAGS = -rc + +CURRECT_DIR_NAME=$(shell basename `pwd`) +LOCAL_SRC_DIR = $(shell pwd) +BIN = lib$(CURRECT_DIR_NAME).a +LIBPATH = $(MPP_LIB_PATH) +LIBS = $(MPP_LIBS) + +CC_CFLAGS_EX=-mcmodel=medany -march=rv64imafdcv -mabi=lp64d -Wall -O0 -g -gdwarf-2 -n --static $(KCFLAGS) + +MP4_FORMAT = $(MPP_SRC_DIR)/middleware/src/mp4_format + +LOCAL_LIBS_PATH = -L$(MP4_FORMAT)/lib +LOCAL_LIBS = -lmp4 + + +LOCAL_CFLAGS = -I$(LOCAL_SRC_DIR) -I$(LOCAL_SRC_DIR)/include -I$(MP4_FORMAT)/include + +WERROR_FLAGS = -Wno-register -Wno-multichar -Wno-pessimizing-move -Wno-deprecated-declarations -Wno-unused-result -Wno-unused-variable -Wno-format -Wno-return-type -Wno-sign-compare -Wno-unused-label + +CXX_FLAGS = -std=c++20 \ + $(WERROR_FLAGS) \ + +SRCS = $(wildcard $(LOCAL_SRC_DIR)/*.c) + +OBJS = $(patsubst %.c,%.o,$(SRCS)) + +CPP_SRCS = $(wildcard $(LOCAL_SRC_DIR)/*.cpp) + +CPP_OBJS = $(patsubst %.cpp,%.o,$(CPP_SRCS)) + +all:$(BIN) + @-rm -f *.o + @echo "${PWD}/Makefile all" + +$(OBJS): %.o : %.c + @echo CC $@ + @$(CC) $(CC_CFLAGS_EX) $(LOCAL_CFLAGS) $(BSP_CFLGAS) $(RTSMART_CFLAGS) $(MPP_USER_CFLGAS) $(LOCAL_LIBS) -c $< -o $@ + +$(CPP_OBJS): %.o : %.cpp + @echo CXX $@ + @$(CPP) $(CC_CFLAGS_EX) $(CXX_FLAGS) $(LOCAL_CFLAGS) $(BSP_CFLGAS) $(RTSMART_CFLAGS) $(MPP_USER_CFLGAS) $(LOCAL_LIBS) -c $< -o $@ + +$(BIN): $(OBJS) $(CPP_OBJS) + @echo LD $@ + #@$(CPP) -o $(BIN) $(LINKFLAG) -Wl,--whole-archive -Wl,--no-whole-archive -n --static $^ -L$(LIBPATH) $(CXX_FLAGS) $(LOCAL_LIBS) $(LOCAL_LIBS_PATH) -Wl,--start-group $(LIBS) -Wl,--end-group + $(AR) $(ARFLAGS) $@ $^ +clean: + echo "${PWD}/Makefile clean" + rm -rf $(BIN) $(OBJS) + +.PHONY: all clean diff --git a/src/big/mpp/middleware/src/mp4_player/display_cfg.c b/src/big/mpp/middleware/src/mp4_player/display_cfg.c new file mode 100644 index 000000000..7f775f5f6 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_player/display_cfg.c @@ -0,0 +1,275 @@ +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "display_cfg.h" +#include +#include +#include +#include +#include +#include +#include +#include "mpi_vo_api.h" +#include "mpi_sys_api.h" +#include "k_video_comm.h" + +#include "k_vo_comm.h" + +#include "k_connector_comm.h" +#include "mpi_connector_api.h" + +#define ENABLE_VO_LAYER 1 + +#define VO_WIDTH 1080 +#define VO_HEIGHT 1920 +#define VO_MAX_FRAME_COUNT 5 + +#define PRIVATE_POLL_SZE (1920 * 1080 * 3 / 2) +#define PRIVATE_POLL_NUM (4) + +static k_connector_type g_connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; + +typedef struct +{ + k_u64 osd_phy_addr; + void *osd_virt_addr; + k_pixel_format format; + k_vo_point offset; + k_vo_size act_size; + k_u32 size; + k_u32 stride; + k_u8 global_alptha; +} osd_info; + +typedef struct +{ + k_u64 layer_phy_addr; + k_pixel_format format; + k_vo_point offset; + k_vo_size act_size; + k_u32 size; + k_u32 stride; + k_u8 global_alptha; + //only layer0、layer1 + k_u32 func; + // only layer0 + k_vo_scaler_attr attr; +} layer_info; + + +int sample_vo_creat_layer(k_vo_layer chn_id, layer_info *info) +{ + k_vo_video_layer_attr attr; + + // check layer + if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) + || ((info->func != 0) && (chn_id == K_VO_LAYER2))) + { + printf("input layer num failed \n"); + return -1 ; + } + + // check scaler + + // set offset + attr.display_rect = info->offset; + // set act + attr.img_size = info->act_size; + // sget size + info->size = info->act_size.height * info->act_size.width * 3 / 2; + //set pixel format + attr.pixel_format = info->format; + if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) + { + printf("input pix format failed \n"); + return -1; + } + // set stride + attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); + // set function + attr.func = info->func; + // set scaler attr + attr.scaler_attr = info->attr; + + // set video layer atrr + kd_mpi_vo_set_video_layer_attr(chn_id, &attr); + // enable layer + kd_mpi_vo_enable_video_layer(chn_id); + + return 0; +} + +k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) +{ + k_vo_video_osd_attr attr; + + // set attr + attr.global_alptha = info->global_alptha; + + if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) + { + info->size = info->act_size.width * info->act_size.height * 4; + info->stride = info->act_size.width * 4 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) + { + info->size = info->act_size.width * info->act_size.height * 3; + info->stride = info->act_size.width * 3 / 8; + } + else if (info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if (info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else + { + printf("set osd pixel format failed \n"); + } + + attr.stride = info->stride; + attr.pixel_format = info->format; + attr.display_rect = info->offset; + attr.img_size = info->act_size; + kd_mpi_vo_set_video_osd_attr(osd, &attr); + + // 打开osd层 + kd_mpi_vo_osd_enable(osd); + + return 0; +} + +static k_s32 sample_connector_init(void) +{ + k_s32 ret = 0; + char dev_name[64] = {0}; + k_s32 connector_fd; + k_connector_type connector_type = g_connector_type; + printf("connector_type:%d \n",g_connector_type); + k_connector_info connector_info; + + memset(&connector_info, 0, sizeof(k_connector_info)); + connector_info.connector_name = (char *)dev_name; + + //connector get sensor info + ret = kd_mpi_get_connector_info(connector_type, &connector_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + // printf("connector_info name is %s \n", connector_info.connector_name); + + connector_fd = kd_mpi_connector_open(connector_info.connector_name); + if (connector_fd < 0) { + printf("%s, connector open failed.\n", __func__); + return K_ERR_VO_NOTREADY; + } + + printf("connector_fd is %d ret is %d \n", connector_fd, ret); + + // set connect power + kd_mpi_connector_power_set(connector_fd, 1); + // // connector init + kd_mpi_connector_init(connector_fd, connector_info); + + return 0; +} + +void display_set_connector_type(k_connector_type type) +{ + g_connector_type = type; +} + +void display_layer_init(k_u32 width,k_u32 height) +{ + k_video_frame_info vf_info; + layer_info info; + + k_vo_layer chn_id = ENABLE_VO_LAYER; + + memset(&vf_info, 0, sizeof(vf_info)); + memset(&info, 0, sizeof(info)); + + //static k_bool vo_init = K_FALSE; + //if (!vo_init) + { + printf("********************************8start sample_connector_init \n"); + sample_connector_init(); + //vo_init = K_TRUE; + } + + // config lyaer + if (width > 1088) + { + if (g_connector_type == HX8377_V2_MIPI_4LAN_1080X1920_30FPS) + { + info.act_size.width = height; + info.act_size.height = width; + info.func = K_ROTATION_90; + } + else + { + info.act_size.width = width; + info.act_size.height = height; + info.func = 0; + } + } + else + { + info.act_size.width = width; + info.act_size.height = height; + info.func = 0; + } + + info.format = PIXEL_FORMAT_YVU_PLANAR_420; + + info.global_alptha = 0xff; + info.offset.x = 0; + info.offset.y = 0; + sample_vo_creat_layer(chn_id, &info); +} + +void display_layer_deinit() +{ + kd_mpi_vo_disable_video_layer(ENABLE_VO_LAYER); +} + +k_s32 vo_init() +{ + return K_SUCCESS; +} + +k_s32 vo_deinit() +{ + return K_SUCCESS; +} \ No newline at end of file diff --git a/src/big/mpp/middleware/src/mp4_player/display_cfg.h b/src/big/mpp/middleware/src/mp4_player/display_cfg.h new file mode 100644 index 000000000..75306559e --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_player/display_cfg.h @@ -0,0 +1,50 @@ +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __DISPLAY_CFG_H__ +#define __DISPLAY_CFG_H__ + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif + +#include "k_type.h" +#include "k_connector_comm.h" + +k_s32 vo_init(); +k_s32 vo_deinit(); +void display_layer_init(k_u32 width,k_u32 height); +void display_set_connector_type(k_connector_type type); +void display_layer_deinit(); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif + +#endif diff --git a/src/big/mpp/middleware/src/mp4_player/include/kplayer.h b/src/big/mpp/middleware/src/mp4_player/include/kplayer.h new file mode 100644 index 000000000..66576c7a8 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_player/include/kplayer.h @@ -0,0 +1,142 @@ +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __K_PLAYER_H__ +#define __K_PLAYER_H__ + +#include "k_type.h" + + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif + + +typedef enum KLAYER_EVENT_E +{ + K_PLAYER_EVENT_EOF, /**< the player is playing the end*/ + K_PLAYER_EVENT_PROGRESS, + K_LITEPLAYER_EVENT_BUTT +} K_PLAYER_EVENT_E; + +typedef struct kPLAYER_PROGRESS_INFO_E +{ + k_u64 total_time; + k_u64 cur_time; +}K_PLAYER_PROGRESS_INFO; + +typedef k_s32 (*K_PLAYER_EVENT_FN)(K_PLAYER_EVENT_E enEvent, void* pData); + +/** +* @brief init the player +* @param[in] N/A +* @retval 0 success,others failed +*/ +k_s32 kd_player_init(k_bool init_vo); + +/** +* @brief deinit of the player +* @param[in] : N/A +* @retval 0 success,others failed +*/ +k_s32 kd_player_deinit(k_bool deinit_vo); + +/** +* @brief set connector type +* @param[in] connector_type : set vo connector type +* @retval N/A +*/ +void kd_player_set_connector_type(int connector_type); + +/** +* @brief register call back fun +* @param[in] pfnCallback : K_PLAYER_EVENT_E: call back fun +* @param[in] pData : call back data +* @retval 0 success,others failed +*/ +k_s32 kd_player_regcallback( K_PLAYER_EVENT_FN pfnCallback,void* pData); + +/** +* @brief set the file for playing +* @param[in] filePath : k_char: media file path +* @retval 0 success,others failed +*/ +k_s32 kd_player_setdatasource(const k_char* filePath); + +/** +* @brief do play of the stream +* @param[in] : N/A +* @retval 0 success,others failed +*/ +k_s32 kd_player_start(); + +/** +* @brief pause the stream +* @param[in] : N/A +* @retval 0 success,others failed +*/ +k_s32 kd_player_pause(); + +/** +* @brief resume the stream +* @param[in] : N/A +* @retval 0 success,others failed +*/ +k_s32 kd_player_resume(); + +/** +* @brief stop the stream playing, and release the resource +* @retval 0 success,others failed +*/ +k_s32 kd_player_stop(); + +/** +* @brief init picture +* @retval 0 success,others failed +*/ +k_s32 kd_picture_init(); + +/** +* @brief decode picture and show picture +* @param[in] filePath : k_char: media file path +* @retval 0 success,others failed +*/ +k_s32 kd_picture_show(const k_char* filePath); + +/** +* @brief deinit picture +* @retval 0 success,others failed +*/ +k_s32 kd_picture_deinit(); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif + +#endif diff --git a/src/big/mpp/middleware/src/mp4_player/kplayer.c b/src/big/mpp/middleware/src/mp4_player/kplayer.c new file mode 100644 index 000000000..267cd52e3 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_player/kplayer.c @@ -0,0 +1,392 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "kplayer.h" +#include "player_res.h" +#include "k_type.h" +#include "mp4_format.h" + +typedef struct TAG_PLAYER_VIDEO_INFO +{ + k_u32 track_id; + k_payload_type type; + k_u32 width; + k_u32 height; + +} PLAYER_VIDEO_INFO; + +typedef struct TAG_PLAYER_AUDIO_INFO +{ + k_u32 track_id; + k_payload_type type; + k_u32 samplerate; + k_u32 channel_num; +} PLAYER_AUDIO_INFO; +#define INVALID_STREAM_TRACK -1 + +static K_PLAYER_EVENT_FN g_pfnCallback = NULL; +static void *g_data_context = NULL; +static void *g_mp4_demuxer_handle = NULL; +static k_char g_mp4_filename[256]; +static PLAYER_VIDEO_INFO g_player_video_info; +static PLAYER_AUDIO_INFO g_player_audio_info; +static k_s32 g_video_track = INVALID_STREAM_TRACK; +static k_s32 g_audio_track = INVALID_STREAM_TRACK; +static k_bool g_play_start = K_FALSE; +static k_bool g_play_pause = K_FALSE; +static pthread_t g_play_tid = 0; +static K_PLAYER_PROGRESS_INFO g_progress_info; +static int g_connector_type = 0; + +static k_payload_type _get_payload_type(k_mp4_codec_id_e codec_id) +{ + if (codec_id == K_MP4_CODEC_ID_H264) + { + return K_PT_H264; + } + else if (codec_id == K_MP4_CODEC_ID_H265) + { + return K_PT_H265; + } + else if (codec_id == K_MP4_CODEC_ID_G711A) + { + return K_PT_G711A; + } + else if (codec_id == K_MP4_CODEC_ID_G711U) + { + return K_PT_G711U; + } + + return K_PT_BUTT; +} + +static k_s32 _init_mp4_demuxer(const k_char *filePath) +{ + memset(&g_player_video_info, 0, sizeof(g_player_video_info)); + memset(&g_player_audio_info, 0, sizeof(g_player_audio_info)); + g_video_track = INVALID_STREAM_TRACK; + g_audio_track = INVALID_STREAM_TRACK; + + k_mp4_config_s mp4_config; + memset(&mp4_config, 0, sizeof(mp4_config)); + mp4_config.config_type = K_MP4_CONFIG_DEMUXER; + strcpy(mp4_config.demuxer_config.file_name, filePath); + mp4_config.muxer_config.fmp4_flag = 0; + + k_s32 ret = kd_mp4_create(&g_mp4_demuxer_handle, &mp4_config); + if (ret < 0) + { + printf("mp4 muxer create failed.\n"); + return -1; + } + + k_mp4_file_info_s file_info; + memset(&file_info, 0, sizeof(file_info)); + ret = kd_mp4_get_file_info(g_mp4_demuxer_handle, &file_info); + if (ret < 0) + { + printf("k_mp4_get_file_info: get file info failed.\n"); + kd_mp4_destroy(g_mp4_demuxer_handle); + return -1; + } + //printf("k_mp4_get_file_info duration:%d,track count:%d\n",file_info.duration ,file_info.track_num); + g_progress_info.total_time = file_info.duration; + + for (int i = 0; i < file_info.track_num; i++) + { + k_mp4_track_info_s track_info; + memset(&track_info, 0, sizeof(track_info)); + ret = kd_mp4_get_track_by_index(g_mp4_demuxer_handle, i, &track_info); + if (ret < 0) + { + printf("k_mp4_get_track_by_index: get track: %d info failed.\n", i); + kd_mp4_destroy(g_mp4_demuxer_handle); + return -1; + } + + if (track_info.track_type == K_MP4_STREAM_VIDEO) + { + g_player_video_info.track_id = track_info.video_info.track_id; + g_player_video_info.width = track_info.video_info.width; + g_player_video_info.height = track_info.video_info.height; + g_player_video_info.type = _get_payload_type(track_info.video_info.codec_id); + g_video_track = track_info.video_info.track_id; + + printf("video track info:type:%d,track_id:%d,width:%d,height:%d\n", + g_player_video_info.type, track_info.video_info.track_id, + track_info.video_info.width, track_info.video_info.height); + } + else if (track_info.track_type == K_MP4_STREAM_AUDIO) + { + g_player_audio_info.track_id = track_info.audio_info.track_id; + g_player_audio_info.type = _get_payload_type(track_info.audio_info.codec_id); + g_player_audio_info.samplerate = track_info.audio_info.sample_rate; + g_player_audio_info.channel_num = track_info.audio_info.channels; + + if (g_player_audio_info.type != K_PT_G711A && g_player_audio_info.type != K_PT_G711U) + { + continue; + } + g_audio_track = track_info.audio_info.track_id; + + printf("audio track info:type:%d,track_id:%d,samplerate:%d,channels:%d\n", + g_player_audio_info.type, track_info.audio_info.track_id, + track_info.audio_info.sample_rate, track_info.audio_info.channels); + } + } + + return 0; +} +k_s32 kd_player_init(k_bool init_vo) +{ + sys_init(init_vo); + return K_SUCCESS; +} + +k_s32 kd_player_deinit(k_bool deinit_vo) +{ + sys_deinit(deinit_vo); + + return K_SUCCESS; +} + +void kd_player_set_connector_type(int connector_type) +{ + g_connector_type = connector_type; +} + +k_s32 kd_player_setdatasource(const k_char *filePath) +{ + k_s32 ret; + k_bool avsync = K_FALSE; + + memset(g_mp4_filename, 0, sizeof(g_mp4_filename)); + memcpy(g_mp4_filename, filePath, strlen(filePath) + 1); + + ret = _init_mp4_demuxer(g_mp4_filename); + if (ret != K_SUCCESS) + { + printf("_init_mp4_demuxer failed\n"); + return K_FAILED; + } + + if (g_video_track != INVALID_STREAM_TRACK) + { + ret = disp_open(g_player_video_info.type,g_player_video_info.width,g_player_video_info.height,g_connector_type); + if (ret != K_SUCCESS) + { + printf("disp_open failed\n"); + return K_FAILED; + } + //avsync = K_TRUE; + } + + if (g_audio_track != INVALID_STREAM_TRACK) + { + ret = ao_open(g_player_audio_info.samplerate, g_player_audio_info.channel_num, g_player_audio_info.type, avsync); + if (ret != K_SUCCESS) + { + printf("ao_open failed\n"); + return K_FAILED; + } + } + + return K_SUCCESS; +} + +static void *play_thread(void *arg) +{ + k_s32 ret; + k_mp4_frame_data_s frame_data; + while (g_play_start) + { + if (g_play_pause) + { + usleep(100*1000); + continue; + } + memset(&frame_data, 0, sizeof(frame_data)); + ret = kd_mp4_get_frame(g_mp4_demuxer_handle, &frame_data); + + if (ret < 0) + { + printf("k_mp4_get_frame: get frame failed.\n"); + return NULL; + } + if (frame_data.eof) + { + printf("demuxer finished.\n"); + break; + } + + if (frame_data.codec_id == K_MP4_CODEC_ID_H264 || frame_data.codec_id == K_MP4_CODEC_ID_H265) + { + if (g_video_track != INVALID_STREAM_TRACK) + { +// printf("video data size:%d\n",frame_data.data_length); +#if 0 + printf("video data size:%d,data:0x%x_0x%x_0x%x_0x%x_0x%x_0x%x_0x%x_0x%x_0x%x_0x%x\n",\ + frame_data.data_length,frame_data.data[0],frame_data.data[1],frame_data.data[2],frame_data.data[3],frame_data.data[4], + frame_data.data[5],frame_data.data[6],frame_data.data[7],frame_data.data[8],frame_data.data[9]); +#endif + if (frame_data.data_length != 0) + { + disp_play(frame_data.data, frame_data.data_length, frame_data.time_stamp, K_FALSE); + g_progress_info.cur_time = frame_data.time_stamp; + //printf("video data size:%d,timestamp:%d\n", frame_data.data_length,frame_data.time_stamp); + if (g_pfnCallback != NULL) + { + g_pfnCallback(K_PLAYER_EVENT_PROGRESS, &g_progress_info); + } + } + } + } + else if (frame_data.codec_id == K_MP4_CODEC_ID_G711A || frame_data.codec_id == K_MP4_CODEC_ID_G711U) + { + if (g_audio_track != INVALID_STREAM_TRACK) + { + //printf("audio data size:%d,timestamp:%d\n", frame_data.data_length,frame_data.time_stamp); + ao_play(frame_data.data,frame_data.data_length,frame_data.time_stamp); + } + } + } + + //send over frame + if (g_video_track != INVALID_STREAM_TRACK) + { + char end_frame[100] = {0}; + end_frame[0] = 0x0; + end_frame[1] = 0x0; + end_frame[2] = 0x0; + end_frame[3] = 0x1; + end_frame[4] = 0x41; + disp_play((k_u8*)end_frame, 100, 0, K_TRUE); + } + + ret = kd_mp4_destroy(g_mp4_demuxer_handle); + if (ret < 0) + { + printf("destroy mp4 failed.\n"); + } + + if (g_pfnCallback != NULL) + { + g_pfnCallback(K_PLAYER_EVENT_EOF, g_data_context); + } + + return NULL; +} + +k_s32 kd_player_start() +{ + if (g_play_start) + { + printf("kd_player_start already start\n"); + return K_FAILED; + } + + g_play_start = K_TRUE; + pthread_create(&g_play_tid, NULL, play_thread, NULL); + + return K_SUCCESS; +} + +k_s32 kd_player_pause() +{ + g_play_pause = K_TRUE; + return K_SUCCESS; +} + +k_s32 kd_player_resume() +{ + g_play_pause = K_FALSE; + return K_SUCCESS; +} + +k_s32 kd_player_regcallback(K_PLAYER_EVENT_FN pfnCallback, void *pData) +{ + g_pfnCallback = pfnCallback; + g_data_context = pData; + return 0; +} + +k_s32 kd_player_stop() +{ + if (!g_play_start) + { + printf("kd_player_start already stop\n"); + return K_FAILED; + } + + g_play_start = K_FALSE; + pthread_join(g_play_tid, NULL); + //wait ao send all data + sleep(1); + + if (g_audio_track != INVALID_STREAM_TRACK) + { + ao_close(); + } + if (g_video_track != INVALID_STREAM_TRACK) + { + disp_close(); + } + + return K_SUCCESS; +} + + +static int g_pic_width = 1088; +static int g_pic_height = 1920; +static k_u8 g_pic_data[1920*1088*3/2]; +static int g_pic_size = 0; + + +k_s32 kd_picture_init() +{ + k_s32 ret; + ret = disp_open(K_PT_JPEG,g_pic_width,g_pic_height,g_connector_type); + if (ret != K_SUCCESS) + { + printf("disp_open failed\n"); + return K_FAILED; + } + + return K_SUCCESS; +} + +k_s32 kd_picture_show(const k_char* filePath) +{ + //read jpeg file + FILE *fp = fopen(filePath, "rb"); + if (NULL == fp) + { + printf("open file:%s failed\n", filePath); + return -1; + } + + fseek(fp, 0, SEEK_END); + g_pic_size = ftell(fp); + fseek(fp, 0, SEEK_SET); + fread(g_pic_data, g_pic_size, 1, fp); + fclose(fp); + + disp_play(g_pic_data, g_pic_size, 0, K_FALSE); + + return K_SUCCESS; +} + +k_s32 kd_picture_deinit() +{ + disp_close(); + return K_SUCCESS; +} \ No newline at end of file diff --git a/src/big/mpp/middleware/src/mp4_player/player_res.c b/src/big/mpp/middleware/src/mp4_player/player_res.c new file mode 100644 index 000000000..fabf367d4 --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_player/player_res.c @@ -0,0 +1,662 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "player_res.h" +#include "mpi_vdec_api.h" +#include "mpi_sys_api.h" +#include "mpi_ao_api.h" +#include "mpi_adec_api.h" +#include "display_cfg.h" +#include "mpi_vb_api.h" + +static k_u32 g_ao_dev = 0; +static k_u32 g_ao_chn = 0; +static k_handle g_adec_hdl = 0; +#define AUDIO_PERSEC_DIV_NUM 25 + +#define VDEC_MAX_WIDTH 1920 +#define VDEC_MAX_HEIGHT 1088 +#define OUTPUT_BUF_CNT 6 +#define INPUT_BUF_CNT 4 +#define STREAM_BUF_SIZE VDEC_MAX_WIDTH * VDEC_MAX_HEIGHT +#define FRAME_BUF_SIZE VDEC_MAX_WIDTH *VDEC_MAX_HEIGHT * 2 + + +#define BIND_VO_LAYER 1 +static k_u32 g_max_sample_rate = 48000; + +static k_audio_stream g_audio_stream; +static k_u32 g_audio_pool_id; +static int g_enc_frame_len = 0; + +typedef struct +{ + k_pixel_format chn_format; + k_u32 file_size; + k_s32 pool_id; + pthread_t input_tid; + pthread_t config_vo_tid; + sem_t sem_vdec_done; + FILE *input_file; + k_u32 ch_id; + char *dump_frame; + k_u32 dump_frame_size; + k_bool done; + k_payload_type type; + k_vb_blk_handle vb_handle[INPUT_BUF_CNT]; + k_u32 act_width; + k_u32 act_height; + k_u32 input_pool_id; + k_u32 output_pool_id; +} sample_vdec_conf_t; + +static sample_vdec_conf_t g_vdec_conf[VDEC_MAX_CHN_NUMS]; + +static k_s32 _vdec_vb_create_pool(int ch) +{ + k_vb_pool_config pool_config; + memset(&pool_config, 0, sizeof(pool_config)); + pool_config.blk_cnt = INPUT_BUF_CNT; + pool_config.blk_size = STREAM_BUF_SIZE; + pool_config.mode = VB_REMAP_MODE_NOCACHE; + g_vdec_conf[ch].input_pool_id = kd_mpi_vb_create_pool(&pool_config); + printf("input_pool_id %d\n", g_vdec_conf[ch].input_pool_id); + + memset(&pool_config, 0, sizeof(pool_config)); + pool_config.blk_cnt = OUTPUT_BUF_CNT; + pool_config.blk_size = FRAME_BUF_SIZE; + pool_config.mode = VB_REMAP_MODE_NOCACHE; + g_vdec_conf[ch].output_pool_id = kd_mpi_vb_create_pool(&pool_config); + printf("output_pool_id %d\n", g_vdec_conf[ch].output_pool_id); + + return 0; +} + +static k_s32 vb_destory_pool(int ch) +{ + //printf("destory_pool input %d \n", g_vdec_conf[ch].input_pool_id); + kd_mpi_vb_destory_pool(g_vdec_conf[ch].input_pool_id); + //printf("destory_pool output %d \n", g_vdec_conf[ch].output_pool_id); + kd_mpi_vb_destory_pool(g_vdec_conf[ch].output_pool_id); + + return 0; +} + +k_s32 sys_init(k_bool init_vo) +{ + k_s32 ret; + if (init_vo) + { + vo_init(); + } + + k_vb_config config; + memset(&config, 0, sizeof(config)); + config.max_pool_cnt = 4; + + config.comm_pool[0].blk_cnt = 150; + config.comm_pool[0].blk_size = g_max_sample_rate * 2 * 4 / AUDIO_PERSEC_DIV_NUM; + config.comm_pool[0].mode = VB_REMAP_MODE_CACHED ; + + config.comm_pool[1].blk_cnt = 2; + config.comm_pool[1].blk_size = g_max_sample_rate * 2 * 4 / AUDIO_PERSEC_DIV_NUM * 2; // ao use + config.comm_pool[1].mode = VB_REMAP_MODE_CACHED ; + + /* vb pool config */ + ret = kd_mpi_vb_set_config(&config); + if(ret != K_SUCCESS) { + printf("kd_mpi_vb_set_config failed:0x%08x\n",ret); + return -1; + } + + /* vb pool init */ + ret = kd_mpi_vb_init(); + if(ret != K_SUCCESS) { + printf("kd_mpi_vb_init failed:0x%08x\n",ret); + return -1; + } + return ret; +} + +k_s32 sys_deinit(k_bool deinit_vo) +{ + k_s32 ret; + ret = kd_mpi_vb_exit(); + if(ret != K_SUCCESS) { + printf("kd_mpi_vb_exit failed:0x%08x\n",ret); + return -1; + } + + if (deinit_vo) + { + vo_deinit(); + } + + return ret; +} + +static k_s32 kd_sample_vdec_bind_vo(k_u32 chn_num, k_u32 vo_dev, k_u32 vo_chn) +{ + k_mpp_chn vdec_mpp_chn; + k_mpp_chn vvo_mpp_chn; + k_s32 ret; + + vdec_mpp_chn.mod_id = K_ID_VDEC; + vdec_mpp_chn.dev_id = 0; + vdec_mpp_chn.chn_id = chn_num; + vvo_mpp_chn.mod_id = K_ID_VO; + vvo_mpp_chn.dev_id = vo_dev; + vvo_mpp_chn.chn_id = vo_chn; + ret = kd_mpi_sys_bind(&vdec_mpp_chn, &vvo_mpp_chn); + if (ret) + { + printf("kd_mpi_sys_bind failed:0x%x\n", ret); + } + return ret; +} + + +static k_s32 kd_sample_vdec_unbind_vo(k_u32 chn_num, k_u32 vo_dev, k_u32 vo_chn) +{ + k_mpp_chn vdec_mpp_chn; + k_mpp_chn vvo_mpp_chn; + k_s32 ret; + + vdec_mpp_chn.mod_id = K_ID_VDEC; + vdec_mpp_chn.dev_id = 0; + vdec_mpp_chn.chn_id = chn_num; + vvo_mpp_chn.mod_id = K_ID_VO; + vvo_mpp_chn.dev_id = vo_dev; + vvo_mpp_chn.chn_id = vo_chn; + + ret = kd_mpi_sys_unbind(&vdec_mpp_chn, &vvo_mpp_chn); + return ret; +} + +static k_s32 _initvo(k_u32 width,k_u32 height,k_u32 vdec_chn,int type) +{ + //init vo + display_set_connector_type((k_connector_type)type); + display_layer_init(width,height); + + if (K_SUCCESS != kd_sample_vdec_bind_vo(vdec_chn, 0, BIND_VO_LAYER)) + { + printf("kd_sample_vdec_bind_vo failed\n"); + return K_FAILED; + } + + return K_SUCCESS; +} + +k_s32 disp_open(k_payload_type video_dec_type,k_u32 width,k_u32 height,int type) +{ + + if (_vdec_vb_create_pool(0) != K_SUCCESS) + { + printf("_vb_create_pool error\n"); + return K_FAILED; + } + + int ch = 0; + k_vdec_chn_attr attr; + attr.pic_width = VDEC_MAX_WIDTH; + attr.pic_height = VDEC_MAX_HEIGHT; + attr.frame_buf_cnt = OUTPUT_BUF_CNT; + attr.frame_buf_size = FRAME_BUF_SIZE; + attr.stream_buf_size = STREAM_BUF_SIZE; + attr.type = video_dec_type; + attr.frame_buf_pool_id = g_vdec_conf[ch].output_pool_id; + + if (K_SUCCESS != kd_mpi_vdec_create_chn(ch, &attr)) + { + printf("kd_mpi_vdec_create_chn failed\n"); + return K_FAILED; + } + + if (K_SUCCESS != kd_mpi_vdec_start_chn(ch)) + { + printf("kd_mpi_vdec_start_chn failed\n"); + return K_FAILED; + } + + _initvo(width,height,ch,type); + + return K_SUCCESS; +} + + +static k_s32 g_mmap_fd_tmp = 0; +static void *_sys_mmap(k_u64 phys_addr, k_u32 size) +{ + void *virt_addr = NULL; + void *mmap_addr = NULL; + k_u32 page_size = sysconf(_SC_PAGESIZE); + k_u64 page_mask = (page_size - 1); + k_u32 mmap_size = ((size) + (phys_addr & page_mask) + page_mask) & ~(page_mask); + + if (g_mmap_fd_tmp == 0) + { + g_mmap_fd_tmp = open("/dev/mem", O_RDWR | O_SYNC); + } + + mmap_addr = mmap(NULL, mmap_size, PROT_READ | PROT_WRITE, MAP_SHARED, g_mmap_fd_tmp, phys_addr & ~page_mask); + + if (mmap_addr != (void *)-1) + virt_addr = (void *)((char *)mmap_addr + (phys_addr & page_mask)); + else + { + printf("mmap addr error: %p %s.\n", mmap_addr, strerror(errno)); + } + + return virt_addr; +} + +static k_s32 _sys_munmap(k_u64 phy_addr, void *virt_addr, k_u32 size) +{ + if (g_mmap_fd_tmp == 0) + { + return -1; + } + k_u32 ret; + + k_u32 page_size = sysconf(_SC_PAGESIZE); + k_u64 page_mask = page_size - 1; + k_u32 mmap_size = ((size) + (phy_addr & page_mask) + page_mask) & ~(page_mask); + ret = munmap((void *)((k_u64)(virt_addr) & ~page_mask), mmap_size); + if (ret == -1) + { + printf("munmap error.\n"); + } + + return 0; +} + +static k_s32 kd_sample_sys_get_vb_block_from_pool_id(k_u32 pool_id, k_u64 *phys_addr, k_u64 blk_size, const char* mmz_name) +{ + k_vb_blk_handle handle; + k_u64 get_phys_addr; + + handle = kd_mpi_vb_get_block(pool_id, blk_size, mmz_name); + if(handle == VB_INVALID_HANDLE) { + printf("kd_mpi_vb_get_block get failed\n"); + return -1; + } + + get_phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); + if(get_phys_addr == 0) { + printf("kd_mpi_vb_handle_to_phyaddr failed\n"); + return -1; + } + + *phys_addr = get_phys_addr; + + return 0; +} + +static k_s32 kd_sample_sys_release_vb_block(k_u64 phys_addr, k_u64 blk_size) +{ + k_s32 ret; + k_vb_blk_handle handle; + + handle = kd_mpi_vb_phyaddr_to_handle(phys_addr); + if(handle == VB_INVALID_HANDLE) { + printf("kd_mpi_vb_phyaddr_to_handle failed\n"); + return -1; + } + + ret = kd_mpi_vb_release_block(handle); + if(ret != K_SUCCESS) { + printf("kd_mpi_vb_release_block failed\n"); + return -1; + } + + return K_SUCCESS; +} + +k_s32 disp_play(k_u8*pdata,k_u32 len,k_u64 timestamp,k_bool end_stream) +{ + k_s32 ret; + sample_vdec_conf_t *vdec_conf; + k_vdec_stream stream; + vdec_conf = &g_vdec_conf[0]; + int poolid = vdec_conf->input_pool_id; + k_u64 phys_addr = 0; + k_u8 *virt_addr; + k_u32 blk_size; + + blk_size = len; + + while(1) + { + ret = kd_sample_sys_get_vb_block_from_pool_id(poolid, &phys_addr, blk_size, NULL); + if (K_SUCCESS != ret) + { + usleep(30000); + continue; + } + break; + } + + vdec_conf->pool_id = poolid; + virt_addr = (unsigned char*)_sys_mmap(phys_addr, blk_size); + + memcpy(virt_addr,pdata,len); + stream.phy_addr = phys_addr; + stream.len = len; + stream.pts = timestamp; + stream.end_of_stream = end_stream; + + ret = kd_mpi_vdec_send_stream(0, &stream, -1); + if (K_SUCCESS != ret) + { + printf("kd_mpi_vdec_send_stream failed\n"); + return K_FAILED; + } + _sys_munmap(phys_addr, virt_addr, blk_size); + ret = kd_sample_sys_release_vb_block(phys_addr, blk_size); + if (K_SUCCESS != ret) + { + printf("kd_sample_sys_release_vb_block failed\n"); + return K_FAILED; + } + + if(end_stream) + { + // check vdec over + k_vdec_chn_status status; + while (1) + { + ret = kd_mpi_vdec_query_status(vdec_conf->ch_id, &status); + if (K_SUCCESS != ret) + { + printf("kd_mpi_vdec_query_status failed\n"); + break; + } + + if (status.end_of_stream) + { + printf("%s>ch %d, receive eos\n", __func__, vdec_conf->ch_id); + break; + } + usleep(100); + } + } + + return K_SUCCESS; +} + +k_s32 disp_close() +{ + int ch = 0; + if (K_SUCCESS != kd_sample_vdec_unbind_vo(ch, 0, BIND_VO_LAYER)) + { + printf("kd_sample_vdec_unbind_vo failed\n"); + return K_FAILED; + } + + if (K_SUCCESS != kd_mpi_vdec_stop_chn(ch)) + { + printf("kd_mpi_vdec_stop_chn failed\n"); + return K_FAILED; + } + + if (K_SUCCESS != kd_mpi_vdec_destroy_chn(ch)) + { + printf("kd_mpi_vdec_destroy_chn failed\n"); + return K_FAILED; + } + + display_layer_deinit(); + + if (vb_destory_pool(0) != K_SUCCESS) + { + printf("vb_destory_pool error"); + return K_FAILED; + } + + return K_SUCCESS; +} + +static k_s32 kd_sample_adec_bind_ao(k_u32 ao_dev,k_u32 ao_chn, k_handle adec_hdl) +{ + k_mpp_chn ao_mpp_chn; + k_mpp_chn adec_mpp_chn; + + adec_mpp_chn.mod_id = K_ID_ADEC; + adec_mpp_chn.dev_id = 0; + adec_mpp_chn.chn_id = adec_hdl; + ao_mpp_chn.mod_id = K_ID_AO; + ao_mpp_chn.dev_id = ao_dev; + ao_mpp_chn.chn_id = ao_chn; + + return kd_mpi_sys_bind(&adec_mpp_chn, &ao_mpp_chn); +} + +static k_s32 kd_sample_adec_unbind_ao(k_u32 ao_dev,k_u32 ao_chn, k_handle adec_hdl) +{ + k_mpp_chn ao_mpp_chn; + k_mpp_chn adec_mpp_chn; + + adec_mpp_chn.mod_id = K_ID_ADEC; + adec_mpp_chn.dev_id = 0; + adec_mpp_chn.chn_id = adec_hdl; + ao_mpp_chn.mod_id = K_ID_AO; + ao_mpp_chn.dev_id = ao_dev; + ao_mpp_chn.chn_id = ao_chn; + + return kd_mpi_sys_unbind(&adec_mpp_chn, &ao_mpp_chn); +} + +static k_s32 kd_sample_sys_get_vb_block(k_u32 *pool_id, k_u64 *phys_addr, k_u64 blk_size, const char* mmz_name) +{ + k_vb_blk_handle handle; + k_u64 get_phys_addr; + k_u32 get_pool_id; + + handle = kd_mpi_vb_get_block(VB_INVALID_POOLID, blk_size, mmz_name); + if(handle == VB_INVALID_HANDLE) { + printf("kd_mpi_vb_get_block get failed\n"); + return -1; + } + + get_phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); + if(get_phys_addr == 0) { + printf("kd_mpi_vb_handle_to_phyaddr failed\n"); + return -1; + } + + get_pool_id = kd_mpi_vb_handle_to_pool_id(handle); + if(get_pool_id == VB_INVALID_POOLID) { + printf("kd_mpi_vb_handle_to_pool_id failed\n"); + return -1; + } +#if 0 + get_virt_addr = kd_mpi_sys_mmap(get_phys_addr, blk_size); +#endif + *phys_addr = get_phys_addr; + *pool_id = get_pool_id; + + return K_SUCCESS; +} + +static k_s32 kd_sample_ao_start(k_u32 dev,k_u32 chn) +{ + k_s32 ret; + if (dev != 0) + { + printf("dev value not supported\n"); + return K_FAILED; + } + + if (chn <0 || chn > 2) + { + printf("chn value not supported\n"); + return K_FAILED; + } + + ret = kd_mpi_ao_enable(dev); + if(ret != K_SUCCESS) { + printf("kd_mpi_ao_enable failed:0x%x\n", ret); + return K_FAILED; + } + + if (2 == chn) + { + for (int i =0;i < 2;i ++) + { + ret = kd_mpi_ao_enable_chn(dev,i); + if(ret != K_SUCCESS) { + printf("kd_mpi_ao_enable_chn(%d) failed:0x%x\n",i, ret); + return K_FAILED; + } + } + } + else + { + ret = kd_mpi_ao_enable_chn(dev,chn); + if(ret != K_SUCCESS) { + printf("kd_mpi_ao_enable_chn failed:0x%x\n", ret); + return K_FAILED; + } + } + + return ret; +} + +k_s32 ao_open(k_s32 s32SampleRate, k_s32 s32ChanNum,k_payload_type audio_dec_type, k_bool avsync) +{ + k_aio_dev_attr aio_dev_attr; + aio_dev_attr.audio_type = KD_AUDIO_OUTPUT_TYPE_I2S; + aio_dev_attr.avsync = avsync; + aio_dev_attr.kd_audio_attr.i2s_attr.sample_rate = s32SampleRate; + aio_dev_attr.kd_audio_attr.i2s_attr.bit_width = KD_AUDIO_BIT_WIDTH_16; + aio_dev_attr.kd_audio_attr.i2s_attr.chn_cnt = 2; + aio_dev_attr.kd_audio_attr.i2s_attr.snd_mode = (1==s32ChanNum)?KD_AUDIO_SOUND_MODE_MONO:KD_AUDIO_SOUND_MODE_STEREO; + aio_dev_attr.kd_audio_attr.i2s_attr.i2s_mode = K_STANDARD_MODE; + aio_dev_attr.kd_audio_attr.i2s_attr.frame_num = AUDIO_PERSEC_DIV_NUM; + aio_dev_attr.kd_audio_attr.i2s_attr.point_num_per_frame = s32SampleRate / AUDIO_PERSEC_DIV_NUM; + aio_dev_attr.kd_audio_attr.i2s_attr.i2s_type = K_AIO_I2STYPE_INNERCODEC; + + if (K_SUCCESS != kd_mpi_ao_set_pub_attr(g_ao_dev, &aio_dev_attr)) + { + printf("kd_mpi_ao_set_pub_attr failed\n"); + return K_FAILED; + } + + if (K_SUCCESS != kd_sample_ao_start(g_ao_dev,g_ao_chn)) + { + printf("kd_mpi_ao_enable failed\n"); + return K_FAILED; + } + + k_adec_chn_attr adec_chn_attr; + adec_chn_attr.type = audio_dec_type; + adec_chn_attr.buf_size = AUDIO_PERSEC_DIV_NUM; + adec_chn_attr.point_num_per_frame = s32SampleRate / adec_chn_attr.buf_size; + adec_chn_attr.mode = K_ADEC_MODE_PACK; + + if (K_SUCCESS != kd_mpi_adec_create_chn(g_adec_hdl, &adec_chn_attr)) + { + printf("kd_mpi_adec_create_chn faild\n"); + return K_FAILED; + } + + if(K_SUCCESS != kd_sample_adec_bind_ao(g_ao_dev,g_ao_chn,g_adec_hdl)) { + printf("kd_sample_adec_bind_ao failed\n"); + return K_FAILED; + } + + g_enc_frame_len = s32SampleRate * 2 * 2 / AUDIO_PERSEC_DIV_NUM / 2; + kd_sample_sys_get_vb_block(&g_audio_pool_id, &g_audio_stream.phys_addr, g_enc_frame_len, NULL); + g_audio_stream.stream = _sys_mmap(g_audio_stream.phys_addr,g_enc_frame_len); + + return K_SUCCESS; +} + +k_s32 ao_play(k_u8*pdata,k_u32 len,k_u64 timestamp) +{ + memcpy(g_audio_stream.stream, pdata, len); + g_audio_stream.seq++; + g_audio_stream.time_stamp = timestamp; + g_audio_stream.len = len; + + return kd_mpi_adec_send_stream(g_adec_hdl,&g_audio_stream,K_TRUE); +} + +static k_s32 kd_sample_ao_stop(k_u32 dev,k_u32 chn) +{ + k_s32 ret; + + if (dev != 0) + { + printf("dev value not supported\n"); + return K_FAILED; + } + + if (chn <0 || chn > 2) + { + printf("chn value not supported\n"); + return K_FAILED; + } + + if (2 == chn) + { + for (int i =0;i < 2;i ++) + { + ret = kd_mpi_ao_disable_chn(dev,i); + if(ret != K_SUCCESS) { + printf("kd_mpi_ao_disable_chn(%d) failed:0x%x\n",i, ret); + return K_FAILED; + } + } + } + else + { + ret = kd_mpi_ao_disable_chn(dev,chn); + if(ret != K_SUCCESS) { + printf("kd_mpi_ao_disable_chn failed:0x%x\n", ret); + return K_FAILED; + } + } + + ret = kd_mpi_ao_disable(dev); + if(ret != K_SUCCESS) { + printf("kd_mpi_ai_disable failed:0x%x\n", ret); + return K_FAILED; + } + + return ret; +} + +k_s32 ao_close() +{ + if (K_SUCCESS !=kd_sample_ao_stop(g_ao_dev,g_ao_chn)) + { + printf("kd_sample_ao_stop failed\n"); + return K_FAILED; + } + + if(K_SUCCESS != kd_sample_adec_unbind_ao(g_ao_dev,g_ao_chn,g_adec_hdl)) { + printf("kd_sample_adec_unbind_ao failed\n"); + return K_FAILED; + } + + if (K_SUCCESS != kd_mpi_adec_destroy_chn(g_adec_hdl)) + { + printf("kd_mpi_adec_destroy_chn failed\n"); + return K_FAILED; + } + + kd_sample_sys_release_vb_block(g_audio_stream.phys_addr, g_enc_frame_len); + _sys_munmap(g_audio_stream.phys_addr,g_audio_stream.stream,g_enc_frame_len); + + return K_SUCCESS; +} + diff --git a/src/big/mpp/middleware/src/mp4_player/player_res.h b/src/big/mpp/middleware/src/mp4_player/player_res.h new file mode 100644 index 000000000..4c57bf6ba --- /dev/null +++ b/src/big/mpp/middleware/src/mp4_player/player_res.h @@ -0,0 +1,57 @@ +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __K_PLAYER_RES_H__ +#define __K_PLAYER_RES_H__ + +#include "k_type.h" +#include "k_payload_comm.h" +#include "kplayer.h" + + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif + +k_s32 sys_init(k_bool init_vo); +k_s32 sys_deinit(k_bool deinit_vo); + +k_s32 disp_open(k_payload_type video_dec_type,k_u32 width,k_u32 height,int type);//K_PT_H264/K_PT_H265 +k_s32 disp_play(k_u8*pdata,k_u32 len,k_u64 timestamp,k_bool end_stream); +k_s32 disp_close(); + +k_s32 ao_open(k_s32 s32SampleRate, k_s32 s32ChanNum,k_payload_type audio_dec_type, k_bool avsync);//K_PT_G711A/K_PT_G711U +k_s32 ao_play(k_u8*pdata,k_u32 len,k_u64 timestamp); +k_s32 ao_close(); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif + +#endif diff --git a/src/big/mpp/middleware/src/rtsp_client/LiveFrameSource.cpp b/src/big/mpp/middleware/src/rtsp_client/LiveFrameSource.cpp new file mode 100644 index 000000000..3af281d62 --- /dev/null +++ b/src/big/mpp/middleware/src/rtsp_client/LiveFrameSource.cpp @@ -0,0 +1,144 @@ +#include +#include +#include "LiveFrameSource.h" + +LiveFrameSource* LiveFrameSource::createNew(UsageEnvironment &env, size_t queue_size) { + return new LiveFrameSource(env, queue_size); +} + +LiveFrameSource::LiveFrameSource(UsageEnvironment &env, size_t queue_size) : FramedSource(env), fQueueSize(queue_size) { + fEventTriggerId = envir().taskScheduler().createEventTrigger(deliverFrame0); + fThread = std::thread([this](){ + while(this->fNeedReadFrame) { + this->getFrame(); + usleep(1000 * 10); // FIXME + } + }); +} + +void LiveFrameSource::pushData(const uint8_t *data, size_t data_size, uint64_t timestamp) { + std::shared_ptr buf = make_shared_array(data_size); + memcpy(buf.get(), data, data_size); + RawData raw_data; + raw_data.buffer_ = buf; + raw_data.size_ = data_size; + raw_data.timestamp_ = timestamp; + + std::unique_lock lck(fMutexRaw); + fRawDataQueue.push_back(raw_data); +} + +int LiveFrameSource::getFrame() { + RawData raw_data; + std::unique_lock lck(fMutexRaw); + if (!fRawDataQueue.empty()) { + raw_data = fRawDataQueue.front(); + fRawDataQueue.pop_front(); + } + lck.unlock(); + + int frameSize = 0; + if (raw_data.buffer_ && raw_data.size_) { + // use system-time when getFrame() called as PresentationTime + struct timeval ref; + gettimeofday(&ref, NULL); + frameSize = raw_data.size_; + processFrame(raw_data.buffer_, frameSize, ref); + } + return frameSize; +} + +void LiveFrameSource::processFrame(std::shared_ptr data, size_t size, const struct timeval &ref) { + std::list packetList = this->parseFrame(data, size, ref); + while (!packetList.empty()) { + auto packet = packetList.front(); + queueFramePacket(packet); + packetList.pop_front(); + } +} + +void LiveFrameSource::queueFramePacket(LiveFrameSource::FramePacket &packet) { + std::unique_lock lck(fMutex); + while (fFramePacketQueue.size() >= fQueueSize) { + fFramePacketQueue.pop_front(); + } + fFramePacketQueue.push_back(packet); + lck.unlock(); + + // post an event to ask to deliver the frame + envir().taskScheduler().triggerEvent(fEventTriggerId, this); +} + + void LiveFrameSource::doGetNextFrame() { + deliverFrame(); + } + +void LiveFrameSource::doStopGettingFrames() { + FramedSource::doStopGettingFrames(); +} + +LiveFrameSource::~LiveFrameSource() { + fNeedReadFrame.store(false); + if(fThread.joinable()) { + fThread.join(); + } + while (!fFramePacketQueue.empty()) { + fFramePacketQueue.pop_front(); + } + while (!fRawDataQueue.empty()) { + fRawDataQueue.pop_front(); + } + if(fEventTriggerId) { + envir().taskScheduler().deleteEventTrigger(fEventTriggerId); + fEventTriggerId = 0; + } +} + +std::list +LiveFrameSource::parseFrame(std::shared_ptr frame_data, size_t size, const struct timeval &ref) { + std::list frameList; + if (frame_data != NULL) { + FramePacket packet(frame_data, 0, size, ref); + frameList.push_back(packet); + } else { + std::cout << "LiveFrameSource::parseFrame frame empty" << std::endl; + } + return frameList; +} + + +void LiveFrameSource::deliverFrame0(void *clientData) { + ((LiveFrameSource*)clientData)->deliverFrame(); +} + +void LiveFrameSource::deliverFrame() { + if (isCurrentlyAwaitingData()) { + fDurationInMicroseconds = 0; + fFrameSize = 0; + + FramePacket packet; + std::unique_lock lck(fMutex); + if (!fFramePacketQueue.empty()) { + packet = fFramePacketQueue.front(); + fFramePacketQueue.pop_front(); + } + lck.unlock(); + + if(packet.size_) { + if (packet.size_ > fMaxSize) { + fFrameSize = fMaxSize; + fNumTruncatedBytes = packet.size_ - fMaxSize; + std::cout << "LiveFrameSource::deliverFrame() -- truncate bytes " << fNumTruncatedBytes << std::endl; + } else { + fFrameSize = packet.size_; + } + fPresentationTime = packet.timestamp_; + memcpy(fTo, packet.buffer_.get() + packet.offset_, fFrameSize); + } + + if (fFrameSize > 0) { + FramedSource::afterGetting(this); + // envir().taskScheduler().scheduleDelayedTask(0, (TaskFunc*)FramedSource::afterGetting, this); + } + } +} diff --git a/src/big/mpp/middleware/src/rtsp_client/LiveFrameSource.h b/src/big/mpp/middleware/src/rtsp_client/LiveFrameSource.h new file mode 100644 index 000000000..7414b3329 --- /dev/null +++ b/src/big/mpp/middleware/src/rtsp_client/LiveFrameSource.h @@ -0,0 +1,79 @@ +#ifndef _LIVEFRAMESOURCE_H +#define _LIVEFRAMESOURCE_H + +#include "FramedSource.hh" +#include +#include +#include +#include +#include + +enum class EncodeType { + INVALID = 0, + H264 = 1, + H265 = 2, + G711U = 100, + BOTTOM +}; + +template +std::shared_ptr make_shared_array(size_t size) { + return std::shared_ptr(new T[size], std::default_delete()); +} + +class LiveFrameSource : public FramedSource { + public: + static LiveFrameSource *createNew(UsageEnvironment &env, size_t queue_size); + void pushData(const uint8_t *data, size_t data_size, uint64_t timestamp); + std::string getAuxLine() { return fAuxLine; }; + virtual EncodeType GetEncodeType() { return EncodeType::INVALID;} + + public: + struct FramePacket { + FramePacket() = default; + FramePacket(std::shared_ptr buffer, size_t offset, size_t size, struct timeval timestamp) : + buffer_(buffer), offset_(offset), size_(size), timestamp_(timestamp) {} + std::shared_ptr buffer_{nullptr}; + size_t offset_{0}; + size_t size_{0}; + struct timeval timestamp_{0}; + }; + + struct RawData { + std::shared_ptr buffer_{nullptr}; + size_t size_{0}; + uint64_t timestamp_{0}; + }; + + protected: + LiveFrameSource(UsageEnvironment &env, size_t queue_size); + virtual ~LiveFrameSource(); + + virtual void doGetNextFrame(); + virtual void doStopGettingFrames(); + + virtual unsigned maxFrameSize() const { + return 128 * 1024; // set a reasonable value ..TODO + } + static void deliverFrame0(void *clientData); + void deliverFrame(); + + int getFrame(); + void processFrame(std::shared_ptr data, size_t size, const struct timeval &ref); + virtual std::list parseFrame(std::shared_ptr data, size_t size, const struct timeval &ref); + void queueFramePacket(FramePacket &packet); + + protected: + std::list fFramePacketQueue; + std::list fRawDataQueue; + EventTriggerId fEventTriggerId = 0; + size_t fQueueSize; + + std::thread fThread; + std::mutex fMutex; + std::mutex fMutexRaw; + std::atomic fNeedReadFrame{true}; + std::string fAuxLine; +}; + +#endif // CLIENT_LIVEFRAMESOURCE_H diff --git a/src/big/mpp/middleware/src/rtsp_client/Makefile b/src/big/mpp/middleware/src/rtsp_client/Makefile new file mode 100644 index 000000000..00325842d --- /dev/null +++ b/src/big/mpp/middleware/src/rtsp_client/Makefile @@ -0,0 +1,62 @@ +include $(MPP_SRC_DIR)/middleware/mpp.mk +include $(MPP_SRC_DIR)/middleware/rt-smart.mk + +AR = riscv64-unknown-linux-musl-ar +ARFLAGS = -rc + +CURRECT_DIR_NAME=$(shell basename `pwd`) +LOCAL_SRC_DIR = $(shell pwd) +BIN = lib$(CURRECT_DIR_NAME).a +LIBPATH = $(MPP_LIB_PATH) +LIBS = $(MPP_LIBS) + +LIBS_FOR_CONSOLE_APPLICATION = -lssl -lcrypto +CC_CFLAGS_EX=-mcmodel=medany -march=rv64imafdcv -mabi=lp64d -Wall -O0 -g -gdwarf-2 -n --static $(KCFLAGS) + +LIVE555_USAGEENVIRONMENT= ../live555/UsageEnvironment +LIVE555_BASICUSAGEENVIRONMENT= ../live555/BasicUsageEnvironment +LIVE555_GROUPSOCK = ../live555/groupsock +LIVE555_LIVEMEDIA = ../live555/liveMedia + +LOCAL_LIBS_PATH = -L$(LIVE555_USAGEENVIRONMENT) -L$(LIVE555_BASICUSAGEENVIRONMENT) -L$(LIVE555_GROUPSOCK) -L$(LIVE555_LIVEMEDIA) +LOCAL_LIBS = -lliveMedia -lgroupsock -lBasicUsageEnvironment -lUsageEnvironment + +LIVE555_COMPILE_OPTS = -DSOCKLEN_T=socklen_t -DNO_SSTREAM=1 -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -DNO_OPENSSL=1 + +LOCAL_CFLAGS = -I$(LOCAL_SRC_DIR) -I$(LOCAL_SRC_DIR)/include -I$(LIVE555_GROUPSOCK)/include -I$(LIVE555_USAGEENVIRONMENT)/include -I$(LIVE555_BASICUSAGEENVIRONMENT)/include -I$(LIVE555_LIVEMEDIA)/include + +WERROR_FLAGS = -Wno-register -Wno-multichar -Wno-pessimizing-move -Wno-deprecated-declarations -Wno-unused-result -Wno-unused-variable -Wno-format -Wno-return-type -Wno-sign-compare -Wno-unused-label + +CXX_FLAGS = -std=c++20 \ + $(WERROR_FLAGS) \ + $(LIVE555_COMPILE_OPTS) \ + +SRCS = $(wildcard $(LOCAL_SRC_DIR)/*.c) + +OBJS = $(patsubst %.c,%.o,$(SRCS)) + +CPP_SRCS = $(wildcard $(LOCAL_SRC_DIR)/*.cpp) + +CPP_OBJS = $(patsubst %.cpp,%.o,$(CPP_SRCS)) + +all:$(BIN) + @-rm -f *.o + @echo "${PWD}/Makefile all" + +$(OBJS): %.o : %.c + @echo CC $@ + @$(CC) $(CC_CFLAGS_EX) $(LOCAL_CFLAGS) $(BSP_CFLGAS) $(RTSMART_CFLAGS) $(MPP_USER_CFLGAS) $(LOCAL_LIBS)-c $< -o $@ + +$(CPP_OBJS): %.o : %.cpp + @echo CXX $@ + @$(CPP) $(CC_CFLAGS_EX) $(CXX_FLAGS) $(LOCAL_CFLAGS) $(BSP_CFLGAS) $(RTSMART_CFLAGS) $(MPP_USER_CFLGAS) $(LOCAL_LIBS) -c $< -o $@ + +$(BIN): $(OBJS) $(CPP_OBJS) + @echo LD $@ + #@$(CPP) -o $(BIN) $(LINKFLAG) -Wl,--whole-archive -Wl,--no-whole-archive -n --static $^ -L$(LIBPATH) $(CXX_FLAGS) $(LOCAL_LIBS) $(LOCAL_LIBS_PATH) -Wl,--start-group $(LIBS) -Wl,--end-group + $(AR) $(ARFLAGS) $@ $^ +clean: + echo "${PWD}/Makefile clean" + rm -rf $(BIN) $(OBJS) + +.PHONY: all clean diff --git a/src/big/mpp/middleware/src/rtsp_client/g711LiveFrameSource.cpp b/src/big/mpp/middleware/src/rtsp_client/g711LiveFrameSource.cpp new file mode 100644 index 000000000..ebd2d6e15 --- /dev/null +++ b/src/big/mpp/middleware/src/rtsp_client/g711LiveFrameSource.cpp @@ -0,0 +1,8 @@ +#include "g711LiveFrameSource.h" + +G711LiveFrameSource* G711LiveFrameSource::createNew(UsageEnvironment &env, size_t queue_size) { + return new G711LiveFrameSource(env, queue_size); +} + +G711LiveFrameSource::G711LiveFrameSource(UsageEnvironment &env, size_t queue_size) : LiveFrameSource(env, queue_size) +{} diff --git a/src/big/mpp/middleware/src/rtsp_client/g711LiveFrameSource.h b/src/big/mpp/middleware/src/rtsp_client/g711LiveFrameSource.h new file mode 100644 index 000000000..ad5dea342 --- /dev/null +++ b/src/big/mpp/middleware/src/rtsp_client/g711LiveFrameSource.h @@ -0,0 +1,15 @@ +#ifndef _G711_LIVEFRAMESOURCE_H +#define _G711_LIVEFRAMESOURCE_H + +#include "LiveFrameSource.h" + +class G711LiveFrameSource : public LiveFrameSource { + public: + static G711LiveFrameSource *createNew(UsageEnvironment &env, size_t queue_size); + + protected: + G711LiveFrameSource(UsageEnvironment &env, size_t queue_size); + virtual EncodeType GetEncodeType() override { return EncodeType::G711U;} +}; + +#endif // _CLIENT_G711_LIVEFRAMESOURCE_H diff --git a/src/big/mpp/middleware/src/rtsp_client/include/rtsp_client.h b/src/big/mpp/middleware/src/rtsp_client/include/rtsp_client.h new file mode 100644 index 000000000..5688f2bf3 --- /dev/null +++ b/src/big/mpp/middleware/src/rtsp_client/include/rtsp_client.h @@ -0,0 +1,62 @@ +#ifndef _KD_RTSP_CLIENT_H +#define _KD_RTSP_CLIENT_H + +#include +#include + +class IOnAudioData { + public: + virtual ~IOnAudioData() {} + virtual void OnAudioStart() = 0; + virtual void OnAudioData(const uint8_t *data, size_t size, uint64_t timestamp) = 0; +}; + +class IOnBackChannel { + public: + virtual ~IOnBackChannel() {} + virtual void OnBackChannelStart() = 0; +}; + +class IOnVideoData { + public: + enum VideoType {VideoTypeInvalid, VideoTypeH264, VideoTypeH265}; + virtual ~IOnVideoData() {} + virtual void OnVideoType(VideoType type, uint8_t *extra_data, size_t extra_data_size) = 0; + virtual void OnVideoData(const uint8_t *data, size_t size, uint64_t timestamp, bool keyframe) = 0; +}; + +class IRtspClientEvent { + public: + virtual ~IRtspClientEvent() {} + virtual void OnRtspClientEvent(int event) = 0; // event 0: shutdown +}; + +struct RtspClientInitParam { + IOnVideoData *on_video_data{nullptr}; + IOnAudioData *on_audio_data{nullptr}; + IOnBackChannel *on_backchannel{nullptr}; + IRtspClientEvent *on_event{nullptr}; +}; + +class KdRtspClient { + public: + KdRtspClient(); + ~KdRtspClient(); + + int Init(const RtspClientInitParam ¶m); + void DeInit(); + int Open(const char *url); + void Close(); + + int SendAudioData(const uint8_t *data, size_t size, uint64_t timestamp); + + private: + KdRtspClient(const KdRtspClient &) = delete; + KdRtspClient& operator=(const KdRtspClient &) = delete; + + private: + class Impl; + std::unique_ptr impl_{nullptr}; +}; + +#endif // _KD_RTSP_CLIENT_H \ No newline at end of file diff --git a/src/big/mpp/middleware/src/rtsp_client/rtsp_client.cpp b/src/big/mpp/middleware/src/rtsp_client/rtsp_client.cpp new file mode 100644 index 000000000..3f122c871 --- /dev/null +++ b/src/big/mpp/middleware/src/rtsp_client/rtsp_client.cpp @@ -0,0 +1,909 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include "rtsp_client.h" +#include "BasicUsageEnvironment.hh" +#include "GroupsockHelper.hh" +#include "liveMedia.hh" +#include "BasicUsageEnvironment.hh" +#include "g711LiveFrameSource.h" + +// Forward function definitions: + +static FramedSource *s_backchannel_source = nullptr; +static IOnAudioData *s_on_audio_data = nullptr; +static IOnVideoData *s_on_video_data = nullptr; +static IOnBackChannel *s_on_backchannel = nullptr; +bool s_bRequireBackChannel = false; + +namespace backchannel_test { +// RTSP 'response handlers': +void continueAfterDESCRIBE(RTSPClient* rtspClient, int resultCode, char* resultString); +void continueAfterSETUP(RTSPClient* rtspClient, int resultCode, char* resultString); +void continueAfterPLAY(RTSPClient* rtspClient, int resultCode, char* resultString); + +// Other event handler functions: +void subsessionAfterPlaying(void* clientData); // called when a stream's subsession (e.g., audio or video substream) ends +void subsessionByeHandler(void* clientData, char const* reason); + // called when a RTCP "BYE" is received for a subsession +void streamTimerHandler(void* clientData); + // called at the end of a stream's expected duration (if the stream has not already signaled its end using a RTCP "BYE") + +// The main streaming routine (for each "rtsp://" URL): +void openURL(UsageEnvironment& env, char const* progName, char const* rtspURL); + +// Used to iterate through each stream's 'subsessions', setting up each one: +void setupNextSubsession(RTSPClient* rtspClient); + +// Used to shut down and close a stream (including its "RTSPClient" object): +void shutdownStream(RTSPClient* rtspClient, int exitCode = 1); + +// A function that outputs a string that identifies each stream (for debugging output). Modify this if you wish: +UsageEnvironment& operator<<(UsageEnvironment& env, const RTSPClient& rtspClient) { + return env << "[URL:\"" << rtspClient.url() << "\"]: "; +} + +// A function that outputs a string that identifies each subsession (for debugging output). Modify this if you wish: +UsageEnvironment& operator<<(UsageEnvironment& env, const MediaSubsession& subsession) { + return env << subsession.mediumName() << "/" << subsession.codecName(); +} + +class MediaSessionExt; +class MediaSubSessionExt : public MediaSubsession { + public: + explicit MediaSubSessionExt(MediaSessionExt& parent): MediaSubsession((MediaSession&)parent) {} + virtual Boolean createBackChannelObjects(int useSpecialRTPoffset) override { + do { + fReadSource = s_backchannel_source; + printf("MediaSubSessionExt::createBackChannelObjects() SimpleRTPSink::createNew payloadFormat = %d\n",(int)fRTPPayloadFormat); + fRTPSink = SimpleRTPSink::createNew(fParent.envir(), fRTPSocket, fRTPPayloadFormat, 8000, "audio", "PCMU", 1, false); + if(!fRTPSink) { + fprintf(stderr, "MediaSubSessionExt::createBackChannelObjects() fRTPSink==NULL\n"); + break; + } + printf("MediaSubSessionExt::createBackChannelObjects() sink = %p\n",fRTPSink); + printf("MediaSubSessionExt::createBackChannelObjects() source = %p\n",fReadSource); + return True; + } while (0); + return False; // an error occurred + } +}; + +class MediaSessionExt: public MediaSession { + public: + static MediaSession* createNew(UsageEnvironment& env, char const* sdpDescription); + protected: + explicit MediaSessionExt(UsageEnvironment& env) : MediaSession(env) {} + MediaSubsession* createNewMediaSubsession() { + return (MediaSubsession*) (new MediaSubSessionExt(*this)); + } + private: + FramedSource *source_{nullptr}; +}; + +MediaSession* MediaSessionExt::createNew(UsageEnvironment& env, char const* sdpDescription) { + MediaSessionExt* newSession = new MediaSessionExt(env); + if (newSession != NULL) { + if (!newSession->initializeWithSDP(sdpDescription)) { + delete newSession; + return NULL; + } + } + + return (MediaSessionExt*)newSession; +} + +// Define a class to hold per-stream state that we maintain throughout each stream's lifetime: + +class StreamClientState { +public: + StreamClientState(); + virtual ~StreamClientState(); + +public: + MediaSubsessionIterator* iter; + MediaSession* session; + MediaSubsession* subsession; + TaskToken streamTimerTask; + double duration; +}; + +// If you're streaming just a single stream (i.e., just from a single URL, once), then you can define and use just a single +// "StreamClientState" structure, as a global variable in your application. However, because - in this demo application - we're +// showing how to play multiple streams, concurrently, we can't do that. Instead, we have to have a separate "StreamClientState" +// structure for each "RTSPClient". To do this, we subclass "RTSPClient", and add a "StreamClientState" field to the subclass: + +class ourRTSPClient: public RTSPClient { +public: + static ourRTSPClient* createNew(UsageEnvironment& env, char const* rtspURL, + int verbosityLevel = 0, + char const* applicationName = NULL, + portNumBits tunnelOverHTTPPortNum = 0); + +protected: + ourRTSPClient(UsageEnvironment& env, char const* rtspURL, + int verbosityLevel, char const* applicationName, portNumBits tunnelOverHTTPPortNum); + // called only by createNew(); + virtual ~ourRTSPClient(); + +public: + StreamClientState scs; +}; + +// Define a data sink (a subclass of "MediaSink") to receive the data for each subsession (i.e., each audio or video 'substream'). +// In practice, this might be a class (or a chain of classes) that decodes and then renders the incoming audio or video. +// Or it might be a "FileSink", for outputting the received data into a file (as is done by the "openRTSP" application). +// In this example code, however, we define a simple 'dummy' sink that receives incoming data, but does nothing with it. + +class DummySink: public MediaSink { +public: + static DummySink* createNew(UsageEnvironment& env, + MediaSubsession& subsession, // identifies the kind of data that's being received + char const* streamId = NULL); // identifies the stream itself (optional) + +private: + DummySink(UsageEnvironment& env, MediaSubsession& subsession, char const* streamId); + // called only by "createNew()" + virtual ~DummySink(); + + static void afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + void afterGettingFrame(unsigned frameSize, unsigned numTruncatedBytes, + struct timeval presentationTime, unsigned durationInMicroseconds); + +private: + // redefined virtual functions: + virtual Boolean continuePlaying(); + +private: + void ProcessH264(unsigned frameSize, uint64_t ms); + void ProcessH265(unsigned frameSize, uint64_t ms); + +private: + u_int8_t* fReceiveBufferAlloc; + u_int8_t* fReceiveBuffer; + MediaSubsession& fSubsession; + char* fStreamId; + + uint8_t * fExtraData; + size_t fExtraDataSize; + uint64_t fExtraTimestamp; + enum class ExtraState : int { INIT, VPS_OK, SPS_OK, OK}; + ExtraState fExtraState; +}; + +#define RTSP_CLIENT_VERBOSITY_LEVEL 1 // by default, print verbose output from each "RTSPClient" + +static int rtspClientCount = 0; // Counts how many streams (i.e., "RTSPClient"s) are currently in use. +static IRtspClientEvent *on_event = nullptr; + +void openURL(UsageEnvironment& env, char const* progName, char const* rtspURL) { + // Begin by creating a "RTSPClient" object. Note that there is a separate "RTSPClient" object for each stream that we wish + // to receive (even if more than stream uses the same "rtsp://" URL). + RTSPClient* rtspClient = ourRTSPClient::createNew(env, rtspURL, RTSP_CLIENT_VERBOSITY_LEVEL, progName); + if (rtspClient == NULL) { + env << "Failed to create a RTSP client for URL \"" << rtspURL << "\": " << env.getResultMsg() << "\n"; + return; + } + + ++rtspClientCount; + rtspClient->bRequireBackChannel = s_bRequireBackChannel; + // Next, send a RTSP "DESCRIBE" command, to get a SDP description for the stream. + // Note that this command - like all RTSP commands - is sent asynchronously; we do not block, waiting for a response. + // Instead, the following function call returns immediately, and we handle the RTSP response later, from within the event loop: + rtspClient->sendDescribeCommand(continueAfterDESCRIBE); +} + + +// Implementation of the RTSP 'response handlers': +void continueAfterDESCRIBE(RTSPClient* rtspClient, int resultCode, char* resultString) { + do { + UsageEnvironment& env = rtspClient->envir(); // alias + StreamClientState& scs = ((ourRTSPClient*)rtspClient)->scs; // alias + + if (resultCode != 0) { + env << *rtspClient << "Failed to get a SDP description: " << resultString << "\n"; + delete[] resultString; + break; + } + + char* const sdpDescription = resultString; + env << *rtspClient << "Got a SDP description:\n" << sdpDescription << "\n"; + + // Create a media session object from this SDP description: + scs.session = MediaSessionExt::createNew(env, sdpDescription); + delete[] sdpDescription; // because we don't need it anymore + if (scs.session == NULL) { + env << *rtspClient << "Failed to create a MediaSession object from the SDP description: " << env.getResultMsg() << "\n"; + break; + } else if (!scs.session->hasSubsessions()) { + env << *rtspClient << "This session has no media subsessions (i.e., no \"m=\" lines)\n"; + break; + } + + // Then, create and set up our data source objects for the session. We do this by iterating over the session's 'subsessions', + // calling "MediaSubsession::initiate()", and then sending a RTSP "SETUP" command, on each one. + // (Each 'subsession' will have its own data source.) + scs.iter = new MediaSubsessionIterator(*scs.session); + setupNextSubsession(rtspClient); + return; + } while (0); + + // An unrecoverable error occurred with this stream. + shutdownStream(rtspClient); +} + +// By default, we request that the server stream its data using RTP/UDP. +// If, instead, you want to request that the server stream via RTP-over-TCP, change the following to True: +#define REQUEST_STREAMING_OVER_TCP True + +void setupNextSubsession(RTSPClient* rtspClient) { + UsageEnvironment& env = rtspClient->envir(); // alias + StreamClientState& scs = ((ourRTSPClient*)rtspClient)->scs; // alias + + scs.subsession = scs.iter->next(); + if (scs.subsession != NULL) { + if (!scs.subsession->initiate()) { + env << *rtspClient << "Failed to initiate the \"" << *scs.subsession << "\" subsession: " << env.getResultMsg() << "\n"; + setupNextSubsession(rtspClient); // give up on this subsession; go to the next one + } else { + env << *rtspClient << "Initiated the \"" << *scs.subsession << "\" subsession ("; + if (scs.subsession->rtcpIsMuxed()) { + env << "client port " << scs.subsession->clientPortNum(); + } else { + env << "client ports " << scs.subsession->clientPortNum() << "-" << scs.subsession->clientPortNum()+1; + } + env << ")\n"; + + // Continue setting up this subsession, by sending a RTSP "SETUP" command: + rtspClient->sendSetupCommand(*scs.subsession, continueAfterSETUP, False, REQUEST_STREAMING_OVER_TCP); + } + return; + } + + // We've finished setting up all of the subsessions. Now, send a RTSP "PLAY" command to start the streaming: + if (scs.session->absStartTime() != NULL) { + // Special case: The stream is indexed by 'absolute' time, so send an appropriate "PLAY" command: + rtspClient->sendPlayCommand(*scs.session, continueAfterPLAY, scs.session->absStartTime(), scs.session->absEndTime()); + } else { + scs.duration = scs.session->playEndTime() - scs.session->playStartTime(); + rtspClient->sendPlayCommand(*scs.session, continueAfterPLAY); + } +} + +void continueAfterSETUP(RTSPClient* rtspClient, int resultCode, char* resultString) { + do { + UsageEnvironment& env = rtspClient->envir(); // alias + StreamClientState& scs = ((ourRTSPClient*)rtspClient)->scs; // alias + + if (resultCode != 0) { + env << *rtspClient << "Failed to set up the \"" << *scs.subsession << "\" subsession: " << resultString << "\n"; + break; + } + + env << *rtspClient << "Set up the \"" << *scs.subsession << "\" subsession ("; + if (scs.subsession->rtcpIsMuxed()) { + env << "client port " << scs.subsession->clientPortNum(); + } else { + env << "client ports " << scs.subsession->clientPortNum() << "-" << scs.subsession->clientPortNum()+1; + } + env << ")\n"; + + // Having successfully setup the subsession, create a data sink for it, and call "startPlaying()" on it. + // (This will prepare the data sink to receive data; the actual flow of data from the client won't start happening until later, + // after we've sent a RTSP "PLAY" command.) + + if (scs.subsession->getFlag() == FLAG_RECVONLY) { + scs.subsession->sink = DummySink::createNew(env, *scs.subsession, rtspClient->url()); + // perhaps use your own custom "MediaSink" subclass instead + // scs.subsession->sink = FileSink::createNew(env, "back.pcm"); + + if (scs.subsession->sink == NULL) { + env << *rtspClient << "Failed to create a data sink for the \"" << *scs.subsession + << "\" subsession: " << env.getResultMsg() << "\n"; + break; + } + + env << *rtspClient << "Created a data sink for the \"" << *scs.subsession << "\" subsession\n"; + scs.subsession->miscPtr = rtspClient; // a hack to let subsession handle functions get the "RTSPClient" from the subsession + scs.subsession->sink->startPlaying(*(scs.subsession->readSource()), + subsessionAfterPlaying, scs.subsession); + + if(!strcmp(scs.subsession->mediumName(), "video")) { + IOnVideoData::VideoType type = IOnVideoData::VideoTypeInvalid; + if(!strcmp(scs.subsession->codecName(),"H264")) { + if (s_on_video_data) { + // TODO + uint8_t *extra_data = nullptr; + size_t extra_data_size = 0; + unsigned int len = 0; + unsigned int numSpropRecords = 0; + SPropRecord *record = parseSPropParameterSets(scs.subsession->fmtp_spropparametersets(), numSpropRecords); + if (numSpropRecords == 2 && record) { // sps & pps + for (auto i = 0; i < numSpropRecords; i++) { + len += 4; + len += record[i].sPropLength; + } + } + if (len) { + uint8_t start_code[4] = {0x00, 0x00, 0x00, 0x01}; + extra_data = new uint8_t[len]; + extra_data_size = 0; + for (auto i = 0; i < numSpropRecords; i++) { + memcpy(&extra_data[extra_data_size], start_code, 4); + extra_data_size += 4; + memcpy(&extra_data[extra_data_size], record[i].sPropBytes, record[i].sPropLength); + extra_data_size += record[i].sPropLength; + } + } + s_on_video_data->OnVideoType(IOnVideoData::VideoTypeH264, extra_data, extra_data_size); + + if (extra_data) delete []extra_data; + } + } else if (!strcmp(scs.subsession->codecName(),"H265")) { + if (s_on_video_data) { + // TODO + uint8_t *extra_data = nullptr; + size_t extra_data_size = 0; + unsigned int len = 0; + unsigned int numSpropRecords = 0; + SPropRecord *record = parseSPropParameterSets(scs.subsession->fmtp_spropparametersets(), numSpropRecords); + if (numSpropRecords == 3 && record) { // vps & sps & pps + for (auto i = 0; i < numSpropRecords; i++) { + len += 4; + len += record[i].sPropLength; + } + } + if (len) { + uint8_t start_code[4] = {0x00, 0x00, 0x00, 0x01}; + extra_data = new uint8_t[len]; + extra_data_size = 0; + for (auto i = 0; i < numSpropRecords; i++) { + memcpy(&extra_data[extra_data_size], start_code, 4); + extra_data_size += 4; + memcpy(&extra_data[extra_data_size], record[i].sPropBytes, record[i].sPropLength); + extra_data_size += record[i].sPropLength; + } + } + s_on_video_data->OnVideoType(IOnVideoData::VideoTypeH265, extra_data, extra_data_size); + if (extra_data) delete []extra_data; + } + } else { + if (s_on_video_data) { + s_on_video_data->OnVideoType(IOnVideoData::VideoTypeInvalid, nullptr, 0); + } + } + } else if(!strcmp(scs.subsession->mediumName(), "audio")) { + if (s_on_audio_data) { + s_on_audio_data->OnAudioStart(); + } + } + } else { + //scs.subsession->sink is equal to scs.subsession->fRTPSink; + + env << *rtspClient << "Created a data sink for the \"" << *scs.subsession << "\" subsession\n"; + scs.subsession->miscPtr = rtspClient; // a hack to let subsession handle functions get the "RTSPClient" from the subsession + + // This sink is created by function MediaSubsession::createBackChannelObjects + env << *rtspClient << "sink = " << scs.subsession->sink << "\n"; + env << *rtspClient << "source = " << scs.subsession->readSource() << "\n"; + + scs.subsession->sink->startPlaying(*(scs.subsession->readSource()), + subsessionAfterPlaying, scs.subsession); + if (s_on_backchannel) { + s_on_backchannel->OnBackChannelStart(); + } + } + + // Also set a handler to be called if a RTCP "BYE" arrives for this subsession: + if (scs.subsession->rtcpInstance() != NULL) { + scs.subsession->rtcpInstance()->setByeWithReasonHandler(subsessionByeHandler, scs.subsession); + } + } while (0); + delete[] resultString; + + // Set up the next subsession, if any: + setupNextSubsession(rtspClient); +} + +void continueAfterPLAY(RTSPClient* rtspClient, int resultCode, char* resultString) { + Boolean success = False; + + rtspClient->envir() << *rtspClient << "continueAfterPLAY \n"; + do { + UsageEnvironment& env = rtspClient->envir(); // alias + StreamClientState& scs = ((ourRTSPClient*)rtspClient)->scs; // alias + + if (resultCode != 0) { + env << *rtspClient << "Failed to start playing session: " << resultString << "\n"; + break; + } + + // Set a timer to be handled at the end of the stream's expected duration (if the stream does not already signal its end + // using a RTCP "BYE"). This is optional. If, instead, you want to keep the stream active - e.g., so you can later + // 'seek' back within it and do another RTSP "PLAY" - then you can omit this code. + // (Alternatively, if you don't want to receive the entire stream, you could set this timer for some shorter value.) + if (scs.duration > 0) { + unsigned const delaySlop = 2; // number of seconds extra to delay, after the stream's expected duration. (This is optional.) + scs.duration += delaySlop; + unsigned uSecsToDelay = (unsigned)(scs.duration*1000000); + scs.streamTimerTask = env.taskScheduler().scheduleDelayedTask(uSecsToDelay, (TaskFunc*)streamTimerHandler, rtspClient); + } + + env << *rtspClient << "Started playing session"; + if (scs.duration > 0) { + env << " (for up to " << scs.duration << " seconds)"; + } + env << "...\n"; + + success = True; + } while (0); + delete[] resultString; + + rtspClient->envir() << *rtspClient << "continueAfterPLAY done\n"; + if (!success) { + // An unrecoverable error occurred with this stream. + rtspClient->envir() << *rtspClient << "continueAfterPLAY shutdownStream\n"; + shutdownStream(rtspClient); + } +} + + +// Implementation of the other event handlers: + +void subsessionAfterPlaying(void* clientData) { + MediaSubsession* subsession = (MediaSubsession*)clientData; + RTSPClient* rtspClient = (RTSPClient*)(subsession->miscPtr); + + rtspClient->envir() << *rtspClient << "subsessionAfterPlaying\n"; + + // Begin by closing this subsession's stream: + Medium::close(subsession->sink); + subsession->sink = NULL; + + // Next, check whether *all* subsessions' streams have now been closed: + MediaSession& session = subsession->parentSession(); + MediaSubsessionIterator iter(session); + while ((subsession = iter.next()) != NULL) { + if (subsession->sink != NULL) return; // this subsession is still active + } + + // All subsessions' streams have now been closed, so shutdown the client: + rtspClient->envir() << *rtspClient << "subsessionAfterPlaying shutdownStream\n"; + shutdownStream(rtspClient); +} + +void subsessionByeHandler(void* clientData, char const* reason) { + MediaSubsession* subsession = (MediaSubsession*)clientData; + RTSPClient* rtspClient = (RTSPClient*)subsession->miscPtr; + UsageEnvironment& env = rtspClient->envir(); // alias + + env << *rtspClient << "Received RTCP \"BYE\""; + if (reason != NULL) { + env << " (reason:\"" << reason << "\")"; + delete[] (char*)reason; + } + env << " on \"" << *subsession << "\" subsession\n"; + + // Now act as if the subsession had closed: + subsessionAfterPlaying(subsession); +} + +void streamTimerHandler(void* clientData) { + ourRTSPClient* rtspClient = (ourRTSPClient*)clientData; + StreamClientState& scs = rtspClient->scs; // alias + + scs.streamTimerTask = NULL; + + rtspClient->envir() << *rtspClient << "streamTimerHandler shutdownStream\n"; + // Shut down the stream: + shutdownStream(rtspClient); +} + +void shutdownStream(RTSPClient* rtspClient, int exitCode) { + UsageEnvironment& env = rtspClient->envir(); // alias + StreamClientState& scs = ((ourRTSPClient*)rtspClient)->scs; // alias + + // First, check whether any subsessions have still to be closed: + if (scs.session != NULL) { + Boolean someSubsessionsWereActive = False; + MediaSubsessionIterator iter(*scs.session); + MediaSubsession* subsession; + + while ((subsession = iter.next()) != NULL) { + if (subsession->sink != NULL) { + Medium::close(subsession->sink); + subsession->sink = NULL; + + if (subsession->rtcpInstance() != NULL) { + subsession->rtcpInstance()->setByeHandler(NULL, NULL); // in case the server sends a RTCP "BYE" while handling "TEARDOWN" + } + + someSubsessionsWereActive = True; + } + } + + if (someSubsessionsWereActive) { + // Send a RTSP "TEARDOWN" command, to tell the server to shutdown the stream. + // Don't bother handling the response to the "TEARDOWN". + rtspClient->sendTeardownCommand(*scs.session, NULL); + } + } + + env << *rtspClient << "Closing the stream.\n"; + Medium::close(rtspClient); + // Note that this will also cause this stream's "StreamClientState" structure to get reclaimed. + + if (--rtspClientCount == 0) { + // The final stream has ended, so exit the application now. + // (Of course, if you're embedding this code into your own application, you might want to comment this out, + // and replace it with "eventLoopWatchVariable = 1;", so that we leave the LIVE555 event loop, and continue running "main()".) + // exit(exitCode); + // eventLoopWatchVariable = 1; + if (on_event) { + on_event->OnRtspClientEvent(0); + } + } +} + + +// Implementation of "ourRTSPClient": + +ourRTSPClient* ourRTSPClient::createNew(UsageEnvironment& env, char const* rtspURL, + int verbosityLevel, char const* applicationName, portNumBits tunnelOverHTTPPortNum) { + return new ourRTSPClient(env, rtspURL, verbosityLevel, applicationName, tunnelOverHTTPPortNum); +} + +ourRTSPClient::ourRTSPClient(UsageEnvironment& env, char const* rtspURL, + int verbosityLevel, char const* applicationName, portNumBits tunnelOverHTTPPortNum) + : RTSPClient(env,rtspURL, verbosityLevel, applicationName, tunnelOverHTTPPortNum, -1) { +} + +ourRTSPClient::~ourRTSPClient() { +} + + +// Implementation of "StreamClientState": + +StreamClientState::StreamClientState() + : iter(NULL), session(NULL), subsession(NULL), streamTimerTask(NULL), duration(0.0) { +} + +StreamClientState::~StreamClientState() { + delete iter; + if (session != NULL) { + // We also need to delete "session", and unschedule "streamTimerTask" (if set) + UsageEnvironment& env = session->envir(); // alias + + env.taskScheduler().unscheduleDelayedTask(streamTimerTask); + Medium::close(session); + } +} + + +// Implementation of "DummySink": + +// Even though we're not going to be doing anything with the incoming data, we still need to receive it. +// Define the size of the buffer that we'll use: +#define DUMMY_SINK_RECEIVE_BUFFER_SIZE 1000000 + +DummySink* DummySink::createNew(UsageEnvironment& env, MediaSubsession& subsession, char const* streamId) { + return new DummySink(env, subsession, streamId); +} + +DummySink::DummySink(UsageEnvironment& env, MediaSubsession& subsession, char const* streamId) + : MediaSink(env), + fSubsession(subsession) { + fStreamId = strDup(streamId); + fReceiveBufferAlloc = new u_int8_t[DUMMY_SINK_RECEIVE_BUFFER_SIZE + 2048]; + // add bytes to merge vps/sps/pps and idr, and start-code as well + fReceiveBuffer = fReceiveBufferAlloc + 2048; + fExtraData = new u_int8_t[1536]; + fExtraDataSize = 0; + fExtraState = ExtraState::INIT; +} + +DummySink::~DummySink() { + delete[] fReceiveBufferAlloc; + delete[] fExtraData; + delete[] fStreamId; +} + +void DummySink::afterGettingFrame(void* clientData, unsigned frameSize, unsigned numTruncatedBytes, + struct timeval presentationTime, unsigned durationInMicroseconds) { + DummySink* sink = (DummySink*)clientData; + sink->afterGettingFrame(frameSize, numTruncatedBytes, presentationTime, durationInMicroseconds); +} + +void DummySink::ProcessH264(unsigned frameSize, uint64_t ms) { + #define H264_NAL(v) (v & 0x1F) + enum class H264_NAL_TYPE : int { + NAL_IDR = 5, + NAL_SEI = 6, + NAL_SPS = 7, + NAL_PPS = 8 + }; + + u_int8_t *data = &fReceiveBuffer[-4]; + data[0] = 0x00; data[1] = 0x00; data[2] = 0x00; data[3] = 0x01; + unsigned frame_size = frameSize + 4; + + int nal_type = H264_NAL(fReceiveBuffer[0]); + if (nal_type == (int)H264_NAL_TYPE::NAL_SPS) { + fExtraDataSize = 0; + memcpy(&fExtraData[fExtraDataSize], data, frame_size); + fExtraDataSize = frame_size; + fExtraState = ExtraState::SPS_OK; + fExtraTimestamp = ms; + // printf("SPS\n"); + } else if (nal_type == (int)H264_NAL_TYPE::NAL_PPS) { + if (fExtraState == ExtraState::SPS_OK && fExtraTimestamp == ms) { + memcpy(&fExtraData[fExtraDataSize], data, frame_size); + fExtraDataSize += frame_size; + fExtraState = ExtraState::OK; + // printf("PPS\n"); + } else { + fExtraState = ExtraState::INIT; + fExtraDataSize = 0; + } + } else if (nal_type == (int)H264_NAL_TYPE::NAL_IDR) { + // printf("IDR\n"); + if (fExtraState == ExtraState::OK) { + u_int8_t *start = &data[-fExtraDataSize]; + memcpy(start, fExtraData, fExtraDataSize); + if(s_on_video_data) s_on_video_data->OnVideoData(start, frame_size + fExtraDataSize, ms, true); + } + } else if (nal_type < (int)H264_NAL_TYPE::NAL_IDR) { + // printf("nonIDR\n"); + if(s_on_video_data) s_on_video_data->OnVideoData(data, frame_size, ms, false); + } else if (nal_type == (int)H264_NAL_TYPE::NAL_SEI) { + // discard SEI + } else { + // discard it, do nothing + printf("discard h264 packets, nal type = %d\n", nal_type); + } +} + +void DummySink::ProcessH265(unsigned frameSize, uint64_t ms) { + #define H265_NAL(v) (((v)>> 1) & 0x3f) + enum class H265_NAL_TYPE : int { + NAL_IDR_W_RADL = 19, + NAL_IDR_N_LP= 20, + NAL_VPS = 32, + NAL_SPS = 33, + NAL_PPS = 34, + NAL_SEI_PREFIX = 39, + NAL_TRAIL_N = 0, + NAL_TRAIL_R = 1, + NAL_RASL_N = 8, + NAL_RASL_R = 9 + }; + + u_int8_t *data = &fReceiveBuffer[-4]; + data[0] = 0x00; data[1] = 0x00; data[2] = 0x00; data[3] = 0x01; + unsigned frame_size = frameSize + 4; + + int nal_type = H265_NAL(fReceiveBuffer[0]); + if (nal_type == (int)H265_NAL_TYPE::NAL_VPS) { + fExtraDataSize = 0; + memcpy(&fExtraData[fExtraDataSize], data, frame_size); + fExtraDataSize = frame_size; + fExtraState = ExtraState::VPS_OK; + fExtraTimestamp = ms; + // printf("VPS\n"); + } + else if (nal_type == (int)H265_NAL_TYPE::NAL_SPS) { + if (fExtraState == ExtraState::VPS_OK && fExtraTimestamp == ms) { + memcpy(&fExtraData[fExtraDataSize], data, frame_size); + fExtraDataSize += frame_size; + fExtraState = ExtraState::SPS_OK; + // printf("SPS\n"); + } else { + fExtraState = ExtraState::INIT; + fExtraDataSize = 0; + } + } else if (nal_type == (int)H265_NAL_TYPE::NAL_PPS) { + if (fExtraState == ExtraState::SPS_OK && fExtraTimestamp == ms) { + memcpy(&fExtraData[fExtraDataSize], data, frame_size); + fExtraDataSize += frame_size; + fExtraState = ExtraState::OK; + // printf("PPS\n"); + } else { + fExtraState = ExtraState::INIT; + fExtraDataSize = 0; + } + } else if (nal_type == (int)H265_NAL_TYPE::NAL_IDR_W_RADL || nal_type == (int)H265_NAL_TYPE::NAL_IDR_N_LP) { + // printf("IDR\n"); + if (fExtraState == ExtraState::OK) { + u_int8_t *start = &data[-fExtraDataSize]; + memcpy(start, fExtraData, fExtraDataSize); + if(s_on_video_data) s_on_video_data->OnVideoData(start, frame_size + fExtraDataSize, ms, true); + } + } else if (nal_type == (int)H265_NAL_TYPE::NAL_TRAIL_N || nal_type == (int)H265_NAL_TYPE::NAL_TRAIL_R + || nal_type == (int)H265_NAL_TYPE::NAL_RASL_N || nal_type == (int)H265_NAL_TYPE::NAL_RASL_R + || ( nal_type >=16 && nal_type <= 21 /*I frame*/)) { + // printf("nonIDR\n"); + if(s_on_video_data) s_on_video_data->OnVideoData(data, frame_size, ms, false); + } else if( nal_type == (int)H265_NAL_TYPE::NAL_SEI_PREFIX){ + // discard SEI_PREFIX + } else { + // discard it, do nothing + printf("discard h265 packets, nal type = %d\n", nal_type); + } +} + +void DummySink::afterGettingFrame(unsigned frameSize, unsigned numTruncatedBytes, + struct timeval presentationTime, unsigned /*durationInMicroseconds*/) { + + if (!strcmp(fSubsession.mediumName(), "audio") && !strcmp(fSubsession.codecName(),"PCMU")) { + if (s_on_audio_data) { + uint64_t ms = presentationTime.tv_sec * 1000 + presentationTime.tv_usec/1000; + s_on_audio_data->OnAudioData(fReceiveBuffer, frameSize, ms); + } + } + + if (!strcmp(fSubsession.mediumName(), "video")) { + uint64_t ms = presentationTime.tv_sec * 1000 + presentationTime.tv_usec/1000; + if(!strcmp(fSubsession.codecName(),"H264")) { + ProcessH264(frameSize, ms); + } else if (!strcmp(fSubsession.codecName(),"H265")) { + ProcessH265(frameSize, ms); + } else { + // discard it, do nothing + } + } + // Then continue, to request the next frame of data: + continuePlaying(); +} + +Boolean DummySink::continuePlaying() { + if (fSource == NULL) return False; // sanity check (should not happen) + + // Request the next frame of data from our input source. "afterGettingFrame()" will get called later, when it arrives: + fSource->getNextFrame(fReceiveBuffer, DUMMY_SINK_RECEIVE_BUFFER_SIZE, + afterGettingFrame, this, + onSourceClosure, this); + return True; +} + +} //namespace + +class KdRtspClient::Impl { + public: + Impl() {} + ~Impl() { DeInit(); } + + int Init(const RtspClientInitParam ¶m); + void DeInit(); + int Open(const char *url); + void Close(); + + int SendAudioData(const uint8_t *data, size_t size, uint64_t timestamp); + + private: + Impl(const Impl &) = delete; + Impl& operator=(const Impl &) = delete; + + private: + std::mutex mutex_; + bool initialized_ = false; + bool started_ = false; + TaskScheduler *scheduler_{nullptr}; + UsageEnvironment* env_{nullptr}; + bool enableBackchanel_{false}; + FramedSource *g711_source_{nullptr}; // source, to send data to rtsp-server + std::thread thread_; + volatile char watchVariable_{0}; + IOnAudioData *on_audio_data_{nullptr}; + IOnVideoData *on_video_data_{nullptr}; + IOnBackChannel *on_backchannel_{nullptr}; + IRtspClientEvent *on_event_{nullptr}; +}; + +int KdRtspClient::Impl::Init(const RtspClientInitParam ¶m) { + std::unique_lock lck(mutex_); + if (initialized_) return 0; + scheduler_ = BasicTaskScheduler::createNew(); + env_ = BasicUsageEnvironment::createNew(*scheduler_); + enableBackchanel_ = (param.on_backchannel != nullptr); + if(enableBackchanel_) { + g711_source_ = G711LiveFrameSource::createNew(*env_, 8); + on_backchannel_ = param.on_backchannel; + } + on_audio_data_ = param.on_audio_data; + on_video_data_ = param.on_video_data; + on_event_ = param.on_event; + initialized_ = true; + started_ = false; + return 0; +} + +void KdRtspClient::Impl::DeInit() { + std::unique_lock lck(mutex_); + if (!initialized_) return; + if (g711_source_) { + Medium::close(g711_source_),g711_source_ = nullptr; + } + env_->reclaim(), env_ = nullptr; + delete scheduler_, scheduler_ = nullptr; + initialized_ = false; + started_ = false; +} + +int KdRtspClient::Impl::Open(const char *url) { + std::unique_lock lck(mutex_); + if (started_) return 0; + watchVariable_ = 0; + thread_ = std::thread([this, url]() { + s_bRequireBackChannel = enableBackchanel_; + if (s_bRequireBackChannel) { + s_backchannel_source = g711_source_; + s_on_backchannel = on_backchannel_; + } + s_on_audio_data = on_audio_data_; + s_on_video_data = on_video_data_; + backchannel_test::on_event = on_event_; + backchannel_test::openURL(*env_, "BackChannel RTSP Client", url); + // All subsequent activity takes place within the event loop: + env_->taskScheduler().doEventLoop(&watchVariable_); + backchannel_test::on_event = nullptr; + s_backchannel_source = nullptr; + s_on_backchannel = nullptr; + s_on_audio_data = nullptr; + s_on_video_data = nullptr; + printf("KdRtspClient thread exit\n"); + }); + started_ = true; + return 0; +} + +void KdRtspClient::Impl::Close() { + std::unique_lock lck(mutex_); + if (!started_) return; + if(thread_.joinable()) { + watchVariable_ = 1; + thread_.join(); + } + started_ = false; +} + +int KdRtspClient::Impl::SendAudioData(const uint8_t *data, size_t size, uint64_t timestamp) { + std::unique_lock lck(mutex_); + if (g711_source_) { + ((G711LiveFrameSource*)g711_source_)->pushData(data, size, timestamp); + return 0; + } + return -1; +} + + +KdRtspClient::KdRtspClient() : impl_(std::make_unique()) {} +KdRtspClient::~KdRtspClient() {} + +int KdRtspClient::Init(const RtspClientInitParam ¶m) { + return impl_->Init(param); +} + +void KdRtspClient::DeInit() { + return impl_->DeInit(); +} + +int KdRtspClient::Open(const char *url) { + return impl_->Open(url); +} + +void KdRtspClient::Close() { + impl_->Close(); +} + +int KdRtspClient::SendAudioData(const uint8_t *data, size_t size, uint64_t timestamp) { + return impl_->SendAudioData(data, size, timestamp); +} + diff --git a/src/big/mpp/middleware/src/rtsp_server/BackChannelServerMediaSubsession.cpp b/src/big/mpp/middleware/src/rtsp_server/BackChannelServerMediaSubsession.cpp new file mode 100644 index 000000000..2fc38cda8 --- /dev/null +++ b/src/big/mpp/middleware/src/rtsp_server/BackChannelServerMediaSubsession.cpp @@ -0,0 +1,662 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A 'ServerMediaSubsession' object that creates new, unicast, "RTPSink"s +// on demand. +// Implementation + +#include "BackChannelServerMediaSubsession.h" +#include + +DataSink::DataSink(UsageEnvironment& env, IOnData *onData) + : MediaSink(env), fOnData(onData),fSamePresentationTimeCounter(0) { + fBufferSize = 20000; + fBuffer = new unsigned char[fBufferSize]; + fPrevPresentationTime.tv_sec = ~0; fPrevPresentationTime.tv_usec = 0; +} + +DataSink::~DataSink() { + delete[] fBuffer; +} + +DataSink* DataSink::createNew(UsageEnvironment& env, IOnData *onData) { + return new DataSink(env, onData); +} + +Boolean DataSink::continuePlaying() { + if (fSource == NULL) return False; + + fSource->getNextFrame(fBuffer, fBufferSize, + afterGettingFrame, this, + onSourceClosure, this); + + return True; +} + +void DataSink::afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned /*durationInMicroseconds*/) { + DataSink* sink = (DataSink*)clientData; + sink->afterGettingFrame(frameSize, numTruncatedBytes, presentationTime); +} + +void DataSink::addData(unsigned char const* data, unsigned dataSize, + struct timeval presentationTime) { + if (fOnData) { + fOnData->OnData(data, dataSize, presentationTime); + } +} + +void DataSink::afterGettingFrame(unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime) { + if (numTruncatedBytes > 0) { + envir() << "DataSink::afterGettingFrame(): The input frame data was too large for our buffer size (" + << fBufferSize << "). " + << numTruncatedBytes << " bytes of trailing data was dropped! Correct this by increasing the \"bufferSize\" parameter in the \"createNew()\" call to at least " + << fBufferSize + numTruncatedBytes << "\n"; + } + addData(fBuffer, frameSize, presentationTime); + + // Then try getting the next frame: + continuePlaying(); +} + +namespace BackChannel { + +OnDemandServerMediaSubsession +::OnDemandServerMediaSubsession(UsageEnvironment& env, + Boolean reuseFirstSource, + portNumBits initialPortNum, + Boolean multiplexRTCPWithRTP) + : ServerMediaSubsession(env), + fSDPLines(NULL), fMIKEYStateMessage(NULL), fMIKEYStateMessageSize(0), + fReuseFirstSource(reuseFirstSource), + fMultiplexRTCPWithRTP(multiplexRTCPWithRTP), fLastStreamToken(NULL), + fAppHandlerTask(NULL), fAppHandlerClientData(NULL) { + fDestinationsHashTable = HashTable::create(ONE_WORD_HASH_KEYS); + if (fMultiplexRTCPWithRTP) { + fInitialPortNum = initialPortNum; + } else { + // Make sure RTP ports are even-numbered: + fInitialPortNum = (initialPortNum+1)&~1; + } + gethostname(fCNAME, sizeof fCNAME); + fCNAME[sizeof fCNAME-1] = '\0'; // just in case +} + +OnDemandServerMediaSubsession::~OnDemandServerMediaSubsession() { + delete[] fMIKEYStateMessage; + delete[] fSDPLines; + + // Clean out the destinations hash table: + while (1) { + Destinations* destinations + = (Destinations*)(fDestinationsHashTable->RemoveNext()); + if (destinations == NULL) break; + delete destinations; + } + delete fDestinationsHashTable; +} + +char const* +OnDemandServerMediaSubsession::sdpLines(int addressFamily) { + if (fSDPLines == NULL) { + unsigned estBitrate; + // The file sink should bind to specific type + // We can know the type once we invoke the createNewStreamDestination() implemented by descendant + DataSink* sink = createNewStreamDestination(0, estBitrate); + if (sink == NULL) { + return NULL; // file not found + } + + Groupsock* dummyGroupsock = createGroupsock(nullAddress(addressFamily), 0); + unsigned char rtpPayloadType = 96 + trackNumber()-1; // if dynamic + + RTPSource* dummyRTPSource = createNewRTPSource(dummyGroupsock, rtpPayloadType, sink); + setSDPLinesFromMediaSink(dummyRTPSource, sink, estBitrate); + Medium::close(sink); + Medium::close(dummyRTPSource); + } + return fSDPLines; +} + +void OnDemandServerMediaSubsession +::getStreamParameters(unsigned clientSessionId, + struct sockaddr_storage const& clientAddress, + Port const& clientRTPPort, + Port const& clientRTCPPort, + int tcpSocketNum, + unsigned char rtpChannelId, + unsigned char rtcpChannelId, + TLSState* tlsState, + struct sockaddr_storage& destinationAddress, + u_int8_t& /*destinationTTL*/, + Boolean& isMulticast, + Port& serverRTPPort, + Port& serverRTCPPort, + void*& streamToken) { + if (addressIsNull(destinationAddress)) { + // normal case - use the client address as the destination address: + destinationAddress = clientAddress; + } + isMulticast = False; + + if (fLastStreamToken != NULL && fReuseFirstSource) { + // Special case: Rather than creating a new 'StreamState', + // we reuse the one that we've already created: + serverRTPPort = ((StreamState*)fLastStreamToken)->serverRTPPort(); + serverRTCPPort = ((StreamState*)fLastStreamToken)->serverRTCPPort(); + ++((StreamState*)fLastStreamToken)->referenceCount(); + streamToken = fLastStreamToken; + } else { + // Normal case: Create a new media source: + unsigned streamBitrate = 0; + DataSink *dataSink = createNewStreamDestination(clientSessionId, streamBitrate); + + // Create 'groupsock' and 'sink' objects for the destination, + // using previously unused server port numbers: + RTPSource* rtpSource = NULL; + BasicUDPSource* udpSource = NULL; + Groupsock* rtpGroupsock = NULL; + Groupsock* rtcpGroupsock = NULL; + + if (clientRTPPort.num() != 0 || tcpSocketNum >= 0) { // Normal case: Create destinations + portNumBits serverPortNum; + if (clientRTCPPort.num() == 0) { + // We're streaming raw UDP (not RTP). Create a single groupsock: + NoReuse dummy(envir()); // ensures that we skip over ports that are already in use + for (serverPortNum = fInitialPortNum; ; ++serverPortNum) { + serverRTPPort = serverPortNum; + rtpGroupsock = createGroupsock(nullAddress(destinationAddress.ss_family), serverRTPPort); + if (rtpGroupsock->socketNum() >= 0) break; // success + } + + udpSource = BasicUDPSource::createNew(envir(), rtpGroupsock); + } else { + // Normal case: We're streaming RTP (over UDP or TCP). Create a pair of + // groupsocks (RTP and RTCP), with adjacent port numbers (RTP port number even). + // (If we're multiplexing RTCP and RTP over the same port number, it can be odd or even.) + NoReuse dummy(envir()); // ensures that we skip over ports that are already in use + for (portNumBits serverPortNum = fInitialPortNum; ; ++serverPortNum) { + serverRTPPort = serverPortNum; + rtpGroupsock = createGroupsock(nullAddress(destinationAddress.ss_family), serverRTPPort); + if (rtpGroupsock->socketNum() < 0) { + delete rtpGroupsock; + continue; // try again + } + + if (fMultiplexRTCPWithRTP) { + // Use the RTP 'groupsock' object for RTCP as well: + serverRTCPPort = serverRTPPort; + rtcpGroupsock = rtpGroupsock; + } else { + // Create a separate 'groupsock' object (with the next (odd) port number) for RTCP: + serverRTCPPort = ++serverPortNum; + rtcpGroupsock = createGroupsock(nullAddress(destinationAddress.ss_family), serverRTCPPort); + if (rtcpGroupsock->socketNum() < 0) { + delete rtpGroupsock; + delete rtcpGroupsock; + continue; // try again + } + } + + break; // success + } + + unsigned char rtpPayloadType = 96 + trackNumber()-1; // if dynamic + + rtpSource = createNewRTPSource(rtpGroupsock, rtpPayloadType, dataSink); + } + + // Turn off the destinations for each groupsock. They'll get set later + // (unless TCP is used instead): + if (rtpGroupsock != NULL) rtpGroupsock->removeAllDestinations(); + if (rtcpGroupsock != NULL) rtcpGroupsock->removeAllDestinations(); + + if (rtpGroupsock != NULL) { + // Try to use a big send buffer for RTP - at least 0.1 second of + // specified bandwidth and at least 50 KB + unsigned rtpBufSize = streamBitrate * 25 / 2; // 1 kbps * 0.1 s = 12.5 bytes + if (rtpBufSize < 50 * 1024) rtpBufSize = 50 * 1024; + increaseSendBufferTo(envir(), rtpGroupsock->socketNum(), rtpBufSize); + } + } + + // Set up the state of the stream. The stream will get started later: + streamToken = fLastStreamToken + = new StreamState(*this, serverRTPPort, serverRTCPPort, + streamBitrate, rtpGroupsock, rtcpGroupsock, rtpSource, udpSource, dataSink); + } + + // Record these destinations as being for this client session id: + Destinations* destinations; + if (tcpSocketNum < 0) { // UDP + destinations = new Destinations(destinationAddress, clientRTPPort, clientRTCPPort); + } else { // TCP + destinations = new Destinations(tcpSocketNum, rtpChannelId, rtcpChannelId, tlsState); + } + fDestinationsHashTable->Add((char const*)clientSessionId, destinations); +} + +void OnDemandServerMediaSubsession::startStream(unsigned clientSessionId, + void* streamToken, + TaskFunc* rtcpRRHandler, + void* rtcpRRHandlerClientData, + unsigned short& rtpSeqNum, + unsigned& rtpTimestamp, + ServerRequestAlternativeByteHandler* serverRequestAlternativeByteHandler, + void* serverRequestAlternativeByteHandlerClientData) { + StreamState* streamState = (StreamState*)streamToken; + Destinations* destinations + = (Destinations*)(fDestinationsHashTable->Lookup((char const*)clientSessionId)); + if (streamState != NULL) { + streamState->startPlaying(destinations, clientSessionId, + rtcpRRHandler, rtcpRRHandlerClientData, + serverRequestAlternativeByteHandler, serverRequestAlternativeByteHandlerClientData); + RTPSource* rtpSource = streamState->rtpSource(); // alias + if (rtpSource != NULL) { + rtpSeqNum = rtpSource->curPacketRTPSeqNum(); + rtpTimestamp = rtpSource->curPacketRTPTimestamp(); // how to get RTPTimestamp if live555 not modified??? + } + } +} + +void OnDemandServerMediaSubsession::pauseStream(unsigned /*clientSessionId*/, + void* streamToken) { + // Pausing isn't allowed if multiple clients are receiving data from + // the same source: + if (fReuseFirstSource) return; + + StreamState* streamState = (StreamState*)streamToken; + if (streamState != NULL) streamState->pause(); +} + +void OnDemandServerMediaSubsession::seekStream(unsigned /*clientSessionId*/, + void* streamToken, double& seekNPT, double streamDuration, u_int64_t& numBytes) { + numBytes = 0; // by default: unknown + + return; +} + +void OnDemandServerMediaSubsession::seekStream(unsigned /*clientSessionId*/, + void* streamToken, char*& absStart, char*& absEnd) { + // Seeking isn't allowed + return; +} + +void OnDemandServerMediaSubsession::nullSeekStream(unsigned /*clientSessionId*/, void* streamToken, + double streamEndTime, u_int64_t& numBytes) { + numBytes = 0; // by default: unknown + return; +} + +void OnDemandServerMediaSubsession::setStreamScale(unsigned /*clientSessionId*/, + void* streamToken, float scale) { + return; +} + +float OnDemandServerMediaSubsession::getCurrentNPT(void* streamToken) { + return 0.0; +} + +DataSink* OnDemandServerMediaSubsession::getStreamSink(void* streamToken) { + if (streamToken == NULL) return NULL; + printf("%s %s line=%d \n",__FILE__, __FUNCTION__ , __LINE__); + StreamState* streamState = (StreamState*)streamToken; + return streamState->mediaSink(); +} + + +void OnDemandServerMediaSubsession::deleteStream(unsigned clientSessionId, + void*& streamToken) { + StreamState* streamState = (StreamState*)streamToken; + + // Look up (and remove) the destinations for this client session: + Destinations* destinations + = (Destinations*)(fDestinationsHashTable->Lookup((char const*)clientSessionId)); + if (destinations != NULL) { + fDestinationsHashTable->Remove((char const*)clientSessionId); + + // Stop streaming to these destinations: + if (streamState != NULL) streamState->endPlaying(destinations, clientSessionId); + } + + // Delete the "StreamState" structure if it's no longer being used: + if (streamState != NULL) { + if (streamState->referenceCount() > 0) --streamState->referenceCount(); + if (streamState->referenceCount() == 0) { + delete streamState; + streamToken = NULL; + } + } + + // Finally, delete the destinations themselves: + delete destinations; +} + +char const* OnDemandServerMediaSubsession +::getAuxSDPLineForBackChannel(DataSink* mediaSink, RTPSource* rtpSource) { + return NULL; +} + +void OnDemandServerMediaSubsession::closeStreamSink(MediaSink *outputSink) { + Medium::close(outputSink); +} + +Groupsock* OnDemandServerMediaSubsession +::createGroupsock(struct sockaddr_storage const& addr, Port port) { + // Default implementation; may be redefined by subclasses: + return new Groupsock(envir(), addr, port, 255); +} + +RTCPInstance* OnDemandServerMediaSubsession +::createRTCP(Groupsock* RTCPgs, unsigned totSessionBW, /* in kbps */ + unsigned char const* cname, RTPSink* sink) { + // Default implementation; may be redefined by subclasses: + return RTCPInstance::createNew(envir(), RTCPgs, totSessionBW, cname, sink, NULL/*we're a server*/); +} + +void OnDemandServerMediaSubsession +::setRTCPAppPacketHandler(RTCPAppHandlerFunc* handler, void* clientData) { + fAppHandlerTask = handler; + fAppHandlerClientData = clientData; +} + +void OnDemandServerMediaSubsession +::sendRTCPAppPacket(u_int8_t subtype, char const* name, + u_int8_t* appDependentData, unsigned appDependentDataSize) { + StreamState* streamState = (StreamState*)fLastStreamToken; + if (streamState != NULL) { + streamState->sendRTCPAppPacket(subtype, name, appDependentData, appDependentDataSize); + } +} + +char* OnDemandServerMediaSubsession::getRtpMapLine(RTPSource* rtpSource) const { + + // assume numChannels = 1; + int vNumChannels=1; + if (rtpSource->rtpPayloadFormat() >= 96) { // the payload format type is dynamic + char* encodingParamsPart; + if (vNumChannels != 1) { + encodingParamsPart = new char[1 + 20 /* max int len */]; + sprintf(encodingParamsPart, "/%d", vNumChannels); + } else { + encodingParamsPart = strDup(""); + } + char const* const rtpmapFmt = "a=rtpmap:%d %s/%d%s\r\n"; + unsigned rtpmapFmtSize = strlen(rtpmapFmt) + + 3 /* max char len */ + strlen("MPEG4-GENERIC") + + 20 /* max int len */ + strlen(encodingParamsPart); + char* rtpmapLine = new char[rtpmapFmtSize]; + sprintf(rtpmapLine, rtpmapFmt, + rtpSource->rtpPayloadFormat(), "MPEG4-GENERIC", + rtpSource->timestampFrequency(), encodingParamsPart); + delete[] encodingParamsPart; + + return rtpmapLine; + } else { + // The payload format is staic, so there's no "a=rtpmap:" line: + return strDup("a=rtpmap:0 PCMU/8000\r\n"); // FIXME, hardcode at the moment + } +} + +void OnDemandServerMediaSubsession +::setSDPLinesFromMediaSink(RTPSource* rtpSource, DataSink* mediaSink, unsigned estBitrate) { + if (rtpSource == NULL) { + printf("%s line:%d\n", __FUNCTION__, __LINE__); + return; + } + char const* mediaType = "audio"; + unsigned char rtpPayloadType = rtpSource->rtpPayloadFormat(); + struct sockaddr_storage const& addressForSDP = rtpSource->RTPgs()->groupAddress(); + portNumBits portNumForSDP = ntohs(rtpSource->RTPgs()->port().num()); + + AddressString ipAddressStr(addressForSDP); + char* rtpmapLine = getRtpMapLine(rtpSource); + char const* rangeLine = rangeSDPLine(); + // TODO: fix me + //char const* auxSDPLine = "a=fmtp:96 streamtype=5;\r\n"; + char const* auxSDPLine = getAuxSDPLineForBackChannel(mediaSink, rtpSource); + if (auxSDPLine == NULL) auxSDPLine = ""; + + char const* const sdpFmt = + "m=%s %u RTP/%sAVP %d\r\n" + "c=IN %s %s\r\n" + "b=AS:%u\r\n" + "%s" + "%s" + "%s" + "a=sendonly\r\n" + "a=control:%s\r\n"; + unsigned sdpFmtSize = strlen(sdpFmt) + + strlen(mediaType) + 5 /* max short len */ + 1 + 3 /* max char len */ + + 3/*IP4 or IP6*/ + strlen(ipAddressStr.val()) + + 20 /* max int len */ + + strlen(rtpmapLine) + + strlen(rangeLine) + + strlen(auxSDPLine) + + strlen(trackId()); + char* sdpLines = new char[sdpFmtSize]; + sprintf(sdpLines, sdpFmt, + mediaType, // m= + portNumForSDP, // m= + fParentSession->streamingUsesSRTP ? "S" : "", + rtpPayloadType, // m= + addressForSDP.ss_family == AF_INET ? "IP4" : "IP6", + ipAddressStr.val(), // c= address + estBitrate, // b=AS: + rtpmapLine, // a=rtpmap:... (if present) + rangeLine, // a=range:... (if present) + auxSDPLine, // optional extra SDP line + trackId()); // a=control: + // std::cout << "SDPLines:\r\n" << sdpLines << std::endl; + delete[] (char*)rangeLine; delete[] rtpmapLine; + + delete[] fSDPLines; fSDPLines = strDup(sdpLines); + delete[] sdpLines; +} + + +DataSink* OnDemandServerMediaSubsession::createNewStreamDestination(unsigned clientSessionId, + unsigned& estBitrate) +{ return NULL;} + + +// "estBitrate" is the stream's estimated bitrate, in kbps +RTPSource* OnDemandServerMediaSubsession::createNewRTPSource(Groupsock* rtpGroupsock, + unsigned char rtpPayloadTypeIfDynamic, + DataSink* outputSink) +{ return NULL;} + + + +////////// StreamState implementation ////////// + +static void afterPlayingStreamState(void* clientData) { + StreamState* streamState = (StreamState*)clientData; + if (streamState->streamDuration() == 0.0) { + // When the input stream ends, tear it down. This will cause a RTCP "BYE" + // to be sent to each client, teling it that the stream has ended. + // (Because the stream didn't have a known duration, there was no other + // way for clients to know when the stream ended.) + streamState->reclaim(); + } + // Otherwise, keep the stream alive, in case a client wants to + // subsequently re-play the stream starting from somewhere other than the end. + // (This can be done only on streams that have a known duration.) +} + +StreamState::StreamState(OnDemandServerMediaSubsession& master, + Port const& serverRTPPort, Port const& serverRTCPPort, + unsigned totalBW, Groupsock* rtpGS, Groupsock* rtcpGS, + RTPSource* rtpSource, BasicUDPSource* udpSource, DataSink* dataSink) + : fMaster(master), fAreCurrentlyPlaying(False), fReferenceCount(1), + fServerRTPPort(serverRTPPort), fServerRTCPPort(serverRTCPPort), + fStreamDuration(master.duration()), + fTotalBW(totalBW), fRTCPInstance(NULL) /* created later */, + fStartNPT(0.0), fRTPgs(rtpGS), fRTCPgs(rtcpGS), + fRTPSource(rtpSource), fUDPSource(udpSource), fDataSink(dataSink){ +} + +StreamState::~StreamState() { + reclaim(); +} + +void StreamState +::startPlaying(Destinations* dests, unsigned clientSessionId, + TaskFunc* rtcpRRHandler, void* rtcpRRHandlerClientData, + ServerRequestAlternativeByteHandler* serverRequestAlternativeByteHandler, + void* serverRequestAlternativeByteHandlerClientData) { + if (dests == NULL) return; + + // printf("%s %s %d fIsBackChannel=%d\n", __FILE__, __FUNCTION__, __LINE__, fMaster.fIsBackChannel); + if (fRTCPInstance == NULL && fRTPSource != NULL) { + // Create (and start) a 'RTCP Instance' for this RTP Source: + fRTCPInstance = RTCPInstance::createNew(fRTPSource->envir(), fRTCPgs, fTotalBW, (unsigned char*)fMaster.fCNAME, + NULL/*RTPSink*/, fRTPSource/*We are a server with backchannel*/); + // Note: This starts RTCP running automatically + } + + if (dests->isTCP) { + // Change RTP and RTCP to use the TCP socket instead of UDP: + if (fRTPSource!= NULL) { + fRTPSource->setStreamSocket(dests->tcpSocketNum, dests->rtpChannelId, dests->tlsState); + RTPInterface::setServerRequestAlternativeByteHandler(fRTPSource->envir(), dests->tcpSocketNum, + serverRequestAlternativeByteHandler, serverRequestAlternativeByteHandlerClientData); + // So that we continue to handle RTSP commands from the client + } + if (fRTCPInstance != NULL) { + fRTCPInstance->addStreamSocket(dests->tcpSocketNum, dests->rtcpChannelId, dests->tlsState); + + struct sockaddr_storage tcpSocketNumAsAddress; // hack + tcpSocketNumAsAddress.ss_family = AF_INET; + ((sockaddr_in&)tcpSocketNumAsAddress).sin_addr.s_addr = dests->tcpSocketNum; + fRTCPInstance->setSpecificRRHandler(tcpSocketNumAsAddress, dests->rtcpChannelId, + rtcpRRHandler, rtcpRRHandlerClientData); + } + } else { + // Tell the RTP and RTCP 'groupsocks' about this destination + // (in case they don't already have it): + if (fRTPgs != NULL) fRTPgs->addDestination(dests->addr, dests->rtpPort, clientSessionId); + if (fRTCPgs != NULL && !(fRTCPgs == fRTPgs && dests->rtcpPort.num() == dests->rtpPort.num())) { + fRTCPgs->addDestination(dests->addr, dests->rtcpPort, clientSessionId); + } + if (fRTCPInstance != NULL) { + fRTCPInstance->setSpecificRRHandler(dests->addr, dests->rtcpPort, + rtcpRRHandler, rtcpRRHandlerClientData); + } + } + + if (fRTCPInstance != NULL) { + // Hack: Send an initial RTCP "SR" packet, before the initial RTP packet, so that receivers will (likely) be able to + // get RTCP-synchronized presentation times immediately: + fRTCPInstance->sendReport(); + } + + if (!fAreCurrentlyPlaying && fDataSink != NULL) { + if (fRTPSource != NULL) { + fDataSink->startPlaying(*fRTPSource, afterPlayingStreamState, this); + fAreCurrentlyPlaying = True; + } else if (fUDPSource != NULL) { + fDataSink->startPlaying(*fUDPSource, afterPlayingStreamState, this); + fAreCurrentlyPlaying = True; + } + } + // printf("%s %s %d fIsBackChannel=%d\n", __FILE__, __FUNCTION__, __LINE__, fMaster.fIsBackChannel); +} + +void StreamState::pause() { + if (fRTPSource != NULL) fDataSink->stopPlaying(); + if (fUDPSource != NULL) fDataSink->stopPlaying(); + + fAreCurrentlyPlaying = False; +} + +void StreamState::endPlaying(Destinations* dests, unsigned clientSessionId) { +#if 0 + // The following code is temporarily disabled, because it erroneously sends RTCP "BYE"s to all clients if multiple + // clients are streaming from the same data source (i.e., if "reuseFirstSource" is True), and we don't want that to happen + // if we're being called as a result of a single one of these clients having sent a "TEARDOWN" (rather than the whole stream + // having been closed, for all clients). + // This will be fixed for real later. + if (fRTCPInstance != NULL) { + // Hack: Explicitly send a RTCP "BYE" packet now, because the code below will prevent that from happening later, + // when "fRTCPInstance" gets deleted: + fRTCPInstance->sendBYE(); + } +#endif + + if (dests->isTCP) { + if (fRTPSource != NULL) { + fRTPSource->removeStreamSocket(dests->tcpSocketNum, dests->rtpChannelId); + } + if (fRTCPInstance != NULL) { + fRTCPInstance->removeStreamSocket(dests->tcpSocketNum, dests->rtcpChannelId); + + struct sockaddr_storage tcpSocketNumAsAddress; // hack + tcpSocketNumAsAddress.ss_family = AF_INET; + ((sockaddr_in&)tcpSocketNumAsAddress).sin_addr.s_addr = dests->tcpSocketNum; + fRTCPInstance->unsetSpecificRRHandler(tcpSocketNumAsAddress, dests->rtcpChannelId); + } + } else { + // Tell the RTP and RTCP 'groupsocks' to stop using these destinations: + if (fRTPgs != NULL) fRTPgs->removeDestination(clientSessionId); + if (fRTCPgs != NULL && fRTCPgs != fRTPgs) fRTCPgs->removeDestination(clientSessionId); + if (fRTCPInstance != NULL) { + fRTCPInstance->unsetSpecificRRHandler(dests->addr, dests->rtcpPort); + } + } +} + +void StreamState::sendRTCPAppPacket(u_int8_t subtype, char const* name, + u_int8_t* appDependentData, unsigned appDependentDataSize) { + if (fRTCPInstance != NULL) { + fRTCPInstance->sendAppPacket(subtype, name, appDependentData, appDependentDataSize); + } +} + +void StreamState::reclaim() { + // Delete allocated media objects + Medium::close(fRTCPInstance) /* will send a RTCP BYE */; fRTCPInstance = NULL; + if (fMaster.fLastStreamToken == this) fMaster.fLastStreamToken = NULL; + + if(fDataSink) + { + fMaster.closeStreamSink(fDataSink); + fDataSink = NULL; + } + + if(fRTPSource) + { + Medium::close(fRTPSource); + fRTPSource = NULL; + } + + if(fUDPSource) + { + Medium::close(fUDPSource); + fUDPSource = NULL; + } + + delete fRTPgs; + if (fRTCPgs != fRTPgs) delete fRTCPgs; + fRTPgs = NULL; fRTCPgs = NULL; +} + +} // namespace BackChannel diff --git a/src/big/mpp/middleware/src/rtsp_server/BackChannelServerMediaSubsession.h b/src/big/mpp/middleware/src/rtsp_server/BackChannelServerMediaSubsession.h new file mode 100644 index 000000000..a36f07e8a --- /dev/null +++ b/src/big/mpp/middleware/src/rtsp_server/BackChannelServerMediaSubsession.h @@ -0,0 +1,276 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// A 'ServerMediaSubsession' object that creates new, unicast, "RTPSink"s +// on demand. +// C++ header + +#ifndef _BACKCHANNEL_SERVER_MEDIA_SUBSESSION_HH +#define _BACKCHANNEL_SERVER_MEDIA_SUBSESSION_HH + +#ifndef _SERVER_MEDIA_SESSION_HH +#include "ServerMediaSession.hh" +#endif +#ifndef _RTCP_HH +#include "RTCP.hh" +#endif + +#ifndef _RTP_SOURCE_HH +#include "RTPSource.hh" +#endif +#ifndef _BASIC_UDP_SOURCE_HH +#include "BasicUDPSource.hh" +#endif + +class IOnData { + public: + virtual ~IOnData(){} + virtual void OnData(unsigned char const* data, unsigned dataSize, struct timeval presentationTime) = 0; +}; + +class DataSink: public MediaSink { +public: + static DataSink* createNew(UsageEnvironment& env, IOnData *onData); + + virtual void addData(unsigned char const* data, unsigned dataSize, + struct timeval presentationTime); + // (Available in case a client wants to add extra data to the output file) + +protected: + DataSink(UsageEnvironment& env, IOnData *onData); + // called only by createNew() + virtual ~DataSink(); + +protected: // redefined virtual functions: + virtual Boolean continuePlaying(); + +protected: + static void afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + virtual void afterGettingFrame(unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime); + + IOnData *fOnData; + unsigned char* fBuffer; + unsigned fBufferSize; + struct timeval fPrevPresentationTime; + unsigned fSamePresentationTimeCounter; +}; + +namespace BackChannel { + +class OnDemandServerMediaSubsession: public ServerMediaSubsession { + +protected: // we're a virtual base class + OnDemandServerMediaSubsession(UsageEnvironment& env, Boolean reuseFirstSource, + portNumBits initialPortNum = 6970, + Boolean multiplexRTCPWithRTP = False); + virtual ~OnDemandServerMediaSubsession(); + +protected: // redefined virtual functions + virtual char const* sdpLines(int addressFamily); + virtual void getStreamParameters(unsigned clientSessionId, + struct sockaddr_storage const& clientAddress, + Port const& clientRTPPort, + Port const& clientRTCPPort, + int tcpSocketNum, + unsigned char rtpChannelId, + unsigned char rtcpChannelId, + TLSState* tlsState, + struct sockaddr_storage& destinationAddress, + u_int8_t& destinationTTL, + Boolean& isMulticast, + Port& serverRTPPort, + Port& serverRTCPPort, + void*& streamToken); + virtual void startStream(unsigned clientSessionId, void* streamToken, + TaskFunc* rtcpRRHandler, + void* rtcpRRHandlerClientData, + unsigned short& rtpSeqNum, + unsigned& rtpTimestamp, + ServerRequestAlternativeByteHandler* serverRequestAlternativeByteHandler, + void* serverRequestAlternativeByteHandlerClientData); + virtual void pauseStream(unsigned clientSessionId, void* streamToken); + virtual void seekStream(unsigned clientSessionId, void* streamToken, double& seekNPT, double streamDuration, u_int64_t& numBytes); + virtual void seekStream(unsigned clientSessionId, void* streamToken, char*& absStart, char*& absEnd); + virtual void nullSeekStream(unsigned clientSessionId, void* streamToken, + double streamEndTime, u_int64_t& numBytes); + virtual void setStreamScale(unsigned clientSessionId, void* streamToken, float scale); + virtual float getCurrentNPT(void* streamToken); + + virtual FramedSource* getStreamSource(void* streamToken) { return NULL;}; + virtual void getRTPSinkandRTCP(void* streamToken, + RTPSink const*& rtpSink, RTCPInstance const*& rtcp) {return;} + virtual void deleteStream(unsigned clientSessionId, void*& streamToken); + + // added for audio back channel + virtual DataSink* getStreamSink(void* streamToken); + +protected: // new virtual functions, possibly redefined by subclasses + // added for audio back channel + virtual char const* getAuxSDPLineForBackChannel(DataSink* mediaSink, + RTPSource* rtpSource); + + // added for audio back channel + virtual void closeStreamSink(MediaSink *outputSink); + +protected: // new virtual functions, defined by all subclasses + // use RTPSource to read data, and use DataSink to receive data + virtual DataSink* createNewStreamDestination(unsigned clientSessionId, + unsigned& estBitrate); + // "estBitrate" is the stream's estimated bitrate, in kbps + virtual RTPSource* createNewRTPSource(Groupsock* rtpGroupsock, + unsigned char rtpPayloadTypeIfDynamic, + DataSink* outputSink); + + +protected: // new virtual functions, may be redefined by a subclass: + virtual Groupsock* createGroupsock(struct sockaddr_storage const& addr, Port port); + virtual RTCPInstance* createRTCP(Groupsock* RTCPgs, unsigned totSessionBW, /* in kbps */ + unsigned char const* cname, RTPSink* sink); + +public: + void multiplexRTCPWithRTP() { fMultiplexRTCPWithRTP = True; } + // An alternative to passing the "multiplexRTCPWithRTP" parameter as True in the constructor + + void setRTCPAppPacketHandler(RTCPAppHandlerFunc* handler, void* clientData); + // Sets a handler to be called if a RTCP "APP" packet arrives from any future client. + // (Any current clients are not affected; any "APP" packets from them will continue to be + // handled by whatever handler existed when the client sent its first RTSP "PLAY" command.) + // (Call with (NULL, NULL) to remove an existing handler - for future clients only) + + void sendRTCPAppPacket(u_int8_t subtype, char const* name, + u_int8_t* appDependentData, unsigned appDependentDataSize); + // Sends a custom RTCP "APP" packet to the most recent client (if "reuseFirstSource" was False), + // or to all current clients (if "reuseFirstSource" was True). + // The parameters correspond to their + // respective fields as described in the RTP/RTCP definition (RFC 3550). + // Note that only the low-order 5 bits of "subtype" are used, and only the first 4 bytes + // of "name" are used. (If "name" has fewer than 4 bytes, or is NULL, + // then the remaining bytes are '\0'.) + +protected: + void setSDPLinesFromMediaSink(RTPSource* rtpSource, DataSink* mediaSink, + unsigned estBitrate); + char* getRtpMapLine(RTPSource* rtpSource) const; + + // used to implement "sdpLines()" + +protected: + char* fSDPLines; + u_int8_t* fMIKEYStateMessage; // used if we're streaming SRTP + unsigned fMIKEYStateMessageSize; // ditto + HashTable* fDestinationsHashTable; // indexed by client session id + +private: + Boolean fReuseFirstSource; + portNumBits fInitialPortNum; + Boolean fMultiplexRTCPWithRTP; + void* fLastStreamToken; + char fCNAME[100]; // for RTCP + RTCPAppHandlerFunc* fAppHandlerTask; + void* fAppHandlerClientData; + + friend class StreamState; +}; + +// A class that represents the state of an ongoing stream. This is used only internally, in the implementation of +// "OnDemandServerMediaSubsession", but we expose the definition here, in case subclasses of "OnDemandServerMediaSubsession" +// want to access it. + +class Destinations { +public: + Destinations(struct sockaddr_storage const& destAddr, + Port const& rtpDestPort, + Port const& rtcpDestPort) + : isTCP(False), addr(destAddr), rtpPort(rtpDestPort), rtcpPort(rtcpDestPort) { + } + Destinations(int tcpSockNum, unsigned char rtpChanId, unsigned char rtcpChanId, + TLSState* tlsSt) + : isTCP(True), rtpPort(0) /*dummy*/, rtcpPort(0) /*dummy*/, + tcpSocketNum(tcpSockNum), rtpChannelId(rtpChanId), rtcpChannelId(rtcpChanId), + tlsState(tlsSt) { + } + +public: + Boolean isTCP; + struct sockaddr_storage addr; + Port rtpPort; + Port rtcpPort; + int tcpSocketNum; + unsigned char rtpChannelId, rtcpChannelId; + TLSState* tlsState; +}; + +class StreamState { +public: + StreamState(OnDemandServerMediaSubsession& master, + Port const& serverRTPPort, Port const& serverRTCPPort, + unsigned totalBW, Groupsock* rtpGS, Groupsock* rtcpGS, + RTPSource* rtpSource, BasicUDPSource* udpSource, DataSink* fFileSink); + virtual ~StreamState(); + + void startPlaying(Destinations* destinations, unsigned clientSessionId, + TaskFunc* rtcpRRHandler, void* rtcpRRHandlerClientData, + ServerRequestAlternativeByteHandler* serverRequestAlternativeByteHandler, + void* serverRequestAlternativeByteHandlerClientData); + void pause(); + void sendRTCPAppPacket(u_int8_t subtype, char const* name, + u_int8_t* appDependentData, unsigned appDependentDataSize); + void endPlaying(Destinations* destinations, unsigned clientSessionId); + void reclaim(); + + unsigned& referenceCount() { return fReferenceCount; } + + Port const& serverRTPPort() const { return fServerRTPPort; } + Port const& serverRTCPPort() const { return fServerRTCPPort; } + + RTCPInstance* rtcpInstance() const { return fRTCPInstance; } + + RTPSource* rtpSource() const { return fRTPSource; } + DataSink* mediaSink() const {return fDataSink;} + + float streamDuration() const { return fStreamDuration; } + float& startNPT() { return fStartNPT; } + +private: + OnDemandServerMediaSubsession& fMaster; + Boolean fAreCurrentlyPlaying; + unsigned fReferenceCount; + + Port fServerRTPPort, fServerRTCPPort; + + float fStreamDuration; + unsigned fTotalBW; + RTCPInstance* fRTCPInstance; + + float fStartNPT; // initial 'normal play time'; reset after each seek + + Groupsock* fRTPgs; + Groupsock* fRTCPgs; + + RTPSource* fRTPSource; + BasicUDPSource* fUDPSource; + DataSink* fDataSink; +}; + +} // namespace BackChannel + +#endif diff --git a/src/big/mpp/middleware/src/rtsp_server/JpegFrameParser.cpp b/src/big/mpp/middleware/src/rtsp_server/JpegFrameParser.cpp new file mode 100644 index 000000000..883e2d5d9 --- /dev/null +++ b/src/big/mpp/middleware/src/rtsp_server/JpegFrameParser.cpp @@ -0,0 +1,393 @@ +/* + * Copyright (C) Peter Gaal + * this code is derived from work of W.L. Chuang + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include +#include +#include "JpegFrameParser.hh" + +#ifndef NDEBUG + #include + #define LOGGY(format, ...) fprintf (stderr, format, ##__VA_ARGS__) +#else + #define LOGGY(format, ...) +#endif /* NDEBUG */ + +enum { + START_MARKER = 0xFF, + SOI_MARKER = 0xD8, + JFIF_MARKER = 0xE0, + CMT_MARKER = 0xFE, + DQT_MARKER = 0xDB, + SOF_MARKER = 0xC0, + DHT_MARKER = 0xC4, + SOS_MARKER = 0xDA, + EOI_MARKER = 0xD9, + DRI_MARKER = 0xDD +}; + +typedef struct +{ + unsigned char id; + unsigned char samp; + unsigned char qt; +} CompInfo; + +JpegFrameParser::JpegFrameParser() : + _width(0), _height(0), _type(0), + _precision(0), _qFactor(255), + _qTables(NULL), _qTablesLength(0), + _restartInterval(0), + _scandata(NULL), _scandataLength(0) +{ + _qTables = new unsigned char[128 * 2]; + memset(_qTables, 8, 128 * 2); +} + +JpegFrameParser::~JpegFrameParser() +{ + if (_qTables != NULL) delete[] _qTables; +} + +JpegFrameParser::JpegFrameParser(const JpegFrameParser &other) { + _width = other._width; + _height = other._height; + _type = other._type; + _precision = other._precision; + _qFactor = other._qFactor; + _qTablesLength = other._qTablesLength; + _restartInterval = other._restartInterval; + _qTables = new unsigned char[128 * 2]; + memcpy(_qTables, other._qTables, _qTablesLength); + // std::cout << "JpegFrameParser::JpegFrameParser(c) --- width = " << (long) _width << std::endl; +} + +JpegFrameParser& JpegFrameParser::operator = (const JpegFrameParser& other) { + if (this == &other) return *this; + _width = other._width; + _height = other._height; + _type = other._type; + _precision = other._precision; + _qFactor = other._qFactor; + _qTablesLength = other._qTablesLength; + _restartInterval = other._restartInterval; + memcpy(_qTables, other._qTables, _qTablesLength); + return *this; +} + +unsigned int JpegFrameParser::scanJpegMarker(const unsigned char* data, + unsigned int size, + unsigned int* offset) +{ + while ((data[(*offset)++] != START_MARKER) && ((*offset) < size)); + + if ((*offset) >= size) { + return EOI_MARKER; + } else { + unsigned int marker; + + marker = data[*offset]; + (*offset)++; + + return marker; + } +} + +static unsigned int _jpegHeaderSize(const unsigned char* data, unsigned int offset) +{ + return data[offset] << 8 | data[offset + 1]; +} + +int JpegFrameParser::readSOF(const unsigned char* data, unsigned int size, + unsigned int* offset) +{ + int i, j; + CompInfo elem; + CompInfo info[3] = { {0,}, }; + unsigned int sof_size, off; + unsigned int width, height, infolen; + + off = *offset; + + /* we need at least 17 bytes for the SOF */ + if (off + 17 > size) goto wrong_size; + + sof_size = _jpegHeaderSize(data, off); + if (sof_size < 17) goto wrong_length; + + *offset += sof_size; + + /* skip size */ + off += 2; + + /* precision should be 8 */ + if (data[off++] != 8) goto bad_precision; + + /* read dimensions */ + height = data[off] << 8 | data[off + 1]; + width = data[off + 2] << 8 | data[off + 3]; + off += 4; + + if (height == 0 || height > 2040) goto invalid_dimension; + if (width == 0 || width > 2040) goto invalid_dimension; + + _width = width / 8; + _height = height / 8; + + /* we only support 3 components */ + if (data[off++] != 3) goto bad_components; + + infolen = 0; + for (i = 0; i < 3; i++) { + elem.id = data[off++]; + elem.samp = data[off++]; + elem.qt = data[off++]; + + /* insertion sort from the last element to the first */ + for (j = infolen; j > 1; j--) { + if (info[j - 1].id < elem.id) break; + info[j] = info[j - 1]; + } + info[j] = elem; + infolen++; + } + + /* see that the components are supported */ + if (info[0].samp == 0x21) { + _type = 0; + } else if (info[0].samp == 0x22) { + _type = 1; + } else { + goto invalid_comp; + } + + if (!(info[1].samp == 0x11)) goto invalid_comp; + if (!(info[2].samp == 0x11)) goto invalid_comp; + if (info[1].qt != info[2].qt) goto invalid_comp; + + return 0; + + /* ERRORS */ +wrong_size: + LOGGY("Wrong SOF size\n"); + return -1; + +wrong_length: + LOGGY("Wrong SOF length\n"); + return -1; + +bad_precision: + LOGGY("Bad precision\n"); + return -1; + +invalid_dimension: + LOGGY("Invalid dimension\n"); + return -1; + +bad_components: + LOGGY("Bad component\n"); + return -1; + +invalid_comp: + LOGGY("Invalid component\n"); + return -1; +} + +unsigned int JpegFrameParser::readDQT(const unsigned char* data, + unsigned int size, + unsigned int offset) +{ + unsigned int quant_size, tab_size; + unsigned char prec; + unsigned char id; + + if (offset + 2 > size) goto too_small; + + quant_size = _jpegHeaderSize(data, offset); + if (quant_size < 2) goto small_quant_size; + + /* clamp to available data */ + if (offset + quant_size > size) { + quant_size = size - offset; + } + + offset += 2; + quant_size -= 2; + + while (quant_size > 0) { + /* not enough to read the id */ + if (offset + 1 > size) break; + + id = data[offset] & 0x0f; + if (id == 15) goto invalid_id; + + prec = (data[offset] & 0xf0) >> 4; + if (prec) { + tab_size = 128; + _qTablesLength = 128 * 2; + } else { + tab_size = 64; + _qTablesLength = 64 * 2; + } + + /* there is not enough for the table */ + if (quant_size < tab_size + 1) goto no_table; + + //LOGGY("Copy quantization table: %u\n", id); + memcpy(&_qTables[id * tab_size], &data[offset + 1], tab_size); + + tab_size += 1; + quant_size -= tab_size; + offset += tab_size; + } + +done: + return offset + quant_size; + + /* ERRORS */ +too_small: + LOGGY("DQT is too small\n"); + return size; + +small_quant_size: + LOGGY("Quantization table is too small\n"); + return size; + +invalid_id: + LOGGY("Invalid table ID\n"); + goto done; + +no_table: + LOGGY("table doesn't exist\n"); + goto done; +} + +int JpegFrameParser::readDRI(const unsigned char* data, + unsigned int size, unsigned int* offset) +{ + unsigned int dri_size, off; + + off = *offset; + + /* we need at least 4 bytes for the DRI */ + if (off + 4 > size) goto wrong_size; + + dri_size = _jpegHeaderSize(data, off); + if (dri_size < 4) goto wrong_length; + + *offset += dri_size; + off += 2; + + _restartInterval = (data[off] << 8) | data[off + 1]; + + return 0; + +wrong_size: + return -1; + +wrong_length: + *offset += dri_size; + return -1; +} + +int JpegFrameParser::parse(unsigned char* data, unsigned int size) +{ + _width = 0; + _height = 0; + _type = 0; + _precision = 0; + //_qFactor = 0; + _restartInterval = 0, + + _scandata = NULL; + _scandataLength = 0; + + unsigned int offset = 0; + unsigned int dqtFound = 0; + unsigned int sosFound = 0; + unsigned int sofFound = 0; + unsigned int driFound = 0; + unsigned int jpeg_header_size = 0; + + while ((sosFound == 0) && (offset < size)) { + switch (scanJpegMarker(data, size, &offset)) { + case JFIF_MARKER: + case CMT_MARKER: + case DHT_MARKER: + offset += _jpegHeaderSize(data, offset); + break; + case SOF_MARKER: + if (readSOF(data, size, &offset) != 0) { + std::cout << "invalid_format" << std::endl; + goto invalid_format; + } + sofFound = 1; + break; + case DQT_MARKER: + offset = readDQT(data, size, offset); + dqtFound = 1; + break; + case SOS_MARKER: + sosFound = 1; + jpeg_header_size = offset + _jpegHeaderSize(data, offset); + break; + case EOI_MARKER: + /* EOI reached before SOS!? */ + LOGGY("EOI reached before SOS!?\n"); + break; + case SOI_MARKER: + //LOGGY("SOI found\n"); + break; + case DRI_MARKER: + LOGGY("DRI found\n"); + if (readDRI(data, size, &offset) == 0) { + driFound = 1; + } + break; + default: + break; + } + } + if ((dqtFound == 0) || (sofFound == 0)) { + std::cout << "unsupported_jpeg" << std::endl; + goto unsupported_jpeg; + } + + if (_width == 0 || _height == 0) { + std::cout << "width or height invalid" << std::endl; + goto no_dimension; + } + + _scandata = data + jpeg_header_size; + _scandataLength = size - jpeg_header_size; + + if (driFound == 1) { + _type += 64; + } + return 0; + + /* ERRORS */ +unsupported_jpeg: + return -1; + +no_dimension: + return -1; + +invalid_format: + return -1; +} diff --git a/src/big/mpp/middleware/src/rtsp_server/JpegFrameParser.hh b/src/big/mpp/middleware/src/rtsp_server/JpegFrameParser.hh new file mode 100644 index 000000000..4edc6fc48 --- /dev/null +++ b/src/big/mpp/middleware/src/rtsp_server/JpegFrameParser.hh @@ -0,0 +1,81 @@ +/* + * Copyright (C) Peter Gaal + * this code is derived from work of W.L. Chuang + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef _JPEG_FRAME_PARSER_HH_INCLUDED +#define _JPEG_FRAME_PARSER_HH_INCLUDED + +class JpegFrameParser { + public: + JpegFrameParser(); + virtual ~JpegFrameParser(); + + JpegFrameParser(const JpegFrameParser &other); + JpegFrameParser& operator = (const JpegFrameParser& other); + + unsigned char width() { return _width; } + unsigned char height() { return _height; } + unsigned char type() { return _type; } + unsigned char precision() { return _precision; } + unsigned char qFactor() { return _qFactor; } + + unsigned short restartInterval() { return _restartInterval; } + + unsigned char const* quantizationTables(unsigned short& length) + { + length = _qTablesLength; + return _qTables; + } + + int parse(unsigned char* data, unsigned int size); + + unsigned char const* scandata(unsigned int& length) + { + length = _scandataLength; + + return _scandata; + } + + private: + unsigned int scanJpegMarker(const unsigned char* data, + unsigned int size, + unsigned int* offset); + int readSOF(const unsigned char* data, + unsigned int size, unsigned int* offset); + unsigned int readDQT(const unsigned char* data, + unsigned int size, unsigned int offset); + int readDRI(const unsigned char* data, + unsigned int size, unsigned int* offset); + + private: + unsigned char _width{0}; + unsigned char _height{0}; + unsigned char _type{0}; + unsigned char _precision{0}; + unsigned char _qFactor{0}; + + unsigned char* _qTables{nullptr}; + unsigned short _qTablesLength{0}; + + unsigned short _restartInterval{0}; + + unsigned char* _scandata{nullptr}; + unsigned int _scandataLength{0}; +}; + +#endif /* _JPEG_FRAME_PARSER_HH_INCLUDED */ diff --git a/src/big/mpp/middleware/src/rtsp_server/LiveFrameSource.cpp b/src/big/mpp/middleware/src/rtsp_server/LiveFrameSource.cpp new file mode 100644 index 000000000..e24225fd9 --- /dev/null +++ b/src/big/mpp/middleware/src/rtsp_server/LiveFrameSource.cpp @@ -0,0 +1,144 @@ +#include +#include +#include "LiveFrameSource.h" + +LiveFrameSource* LiveFrameSource::createNew(UsageEnvironment &env, size_t queue_size) { + return new LiveFrameSource(env, queue_size); +} + +LiveFrameSource::LiveFrameSource(UsageEnvironment &env, size_t queue_size) : FramedSource(env), fQueueSize(queue_size) { + fEventTriggerId = envir().taskScheduler().createEventTrigger(deliverFrame0); + fThread = std::thread([this](){ + while(this->fNeedReadFrame) { + this->getFrame(); + usleep(1000 * 10); // FIXME + } + }); +} + +void LiveFrameSource::pushData(const uint8_t *data, size_t data_size, uint64_t timestamp) { + std::shared_ptr buf = make_shared_array(data_size); + memcpy(buf.get(), data, data_size); + RawData raw_data; + raw_data.buffer_ = buf; + raw_data.size_ = data_size; + raw_data.timestamp_ = timestamp; + + std::unique_lock lck(fMutexRaw); + fRawDataQueue.push_back(raw_data); +} + +int LiveFrameSource::getFrame() { + RawData raw_data; + std::unique_lock lck(fMutexRaw); + if (!fRawDataQueue.empty()) { + raw_data = fRawDataQueue.front(); + fRawDataQueue.pop_front(); + } + lck.unlock(); + + int frameSize = 0; + if (raw_data.buffer_ && raw_data.size_) { + // use system-time when getFrame() called as PresentationTime + struct timeval ref; + gettimeofday(&ref, NULL); + frameSize = raw_data.size_; + processFrame(raw_data.buffer_, frameSize, ref); + } + return frameSize; +} + +void LiveFrameSource::processFrame(std::shared_ptr data, size_t size, const struct timeval &ref) { + std::list packetList = this->parseFrame(data, size, ref); + while (!packetList.empty()) { + auto packet = packetList.front(); + queueFramePacket(packet); + packetList.pop_front(); + } +} + +void LiveFrameSource::queueFramePacket(LiveFrameSource::FramePacket &packet) { + std::unique_lock lck(fMutex); + while (fFramePacketQueue.size() >= fQueueSize) { + fFramePacketQueue.pop_front(); + } + fFramePacketQueue.push_back(packet); + lck.unlock(); + + // post an event to ask to deliver the frame + envir().taskScheduler().triggerEvent(fEventTriggerId, this); +} + + void LiveFrameSource::doGetNextFrame() { + deliverFrame(); + } + +void LiveFrameSource::doStopGettingFrames() { + FramedSource::doStopGettingFrames(); +} + +LiveFrameSource::~LiveFrameSource() { + fNeedReadFrame.store(false); + if(fThread.joinable()) { + fThread.join(); + } + while (!fFramePacketQueue.empty()) { + fFramePacketQueue.pop_front(); + } + while (!fRawDataQueue.empty()) { + fRawDataQueue.pop_front(); + } + if(fEventTriggerId) { + envir().taskScheduler().deleteEventTrigger(fEventTriggerId); + fEventTriggerId = 0; + } +} + +std::list +LiveFrameSource::parseFrame(std::shared_ptr frame_data, size_t size, const struct timeval &ref) { + std::list frameList; + if (frame_data != NULL) { + FramePacket packet(frame_data, 0, size, ref); + frameList.push_back(packet); + } else { + std::cout << "LiveFrameSource::parseFrame frame empty" << std::endl; + } + return frameList; +} + + +void LiveFrameSource::deliverFrame0(void *clientData) { + ((LiveFrameSource*)clientData)->deliverFrame(); +} + +void LiveFrameSource::deliverFrame() { + if (isCurrentlyAwaitingData()) { + fDurationInMicroseconds = 0; + fFrameSize = 0; + + FramePacket packet; + std::unique_lock lck(fMutex); + if (!fFramePacketQueue.empty()) { + packet = fFramePacketQueue.front(); + fFramePacketQueue.pop_front(); + } + lck.unlock(); + + if(packet.size_) { + if (packet.size_ > fMaxSize) { + fFrameSize = fMaxSize; + fNumTruncatedBytes = packet.size_ - fMaxSize; + std::cout << "LiveFrameSource::deliverFrame() -- truncate bytes " << fNumTruncatedBytes << std::endl; + } else { + fFrameSize = packet.size_; + } + fPresentationTime = packet.timestamp_; + memcpy(fTo, packet.buffer_.get() + packet.offset_, fFrameSize); + } + + if (fFrameSize > 0) { + FramedSource::afterGetting(this); + // envir().taskScheduler().scheduleDelayedTask(0, (TaskFunc*)FramedSource::afterGetting, this); + } + } +} diff --git a/src/big/mpp/middleware/src/rtsp_server/LiveFrameSource.h b/src/big/mpp/middleware/src/rtsp_server/LiveFrameSource.h new file mode 100644 index 000000000..8f419d730 --- /dev/null +++ b/src/big/mpp/middleware/src/rtsp_server/LiveFrameSource.h @@ -0,0 +1,79 @@ +#ifndef _LIVEFRAMESOURCE_H +#define _LIVEFRAMESOURCE_H + +#include "FramedSource.hh" +#include +#include +#include +#include +#include + +enum class EncodeType { + INVALID = 0, + H264 = 1, + H265 = 2, + G711U = 100, + BOTTOM +}; + +template +std::shared_ptr make_shared_array(size_t size) { + return std::shared_ptr(new T[size], std::default_delete()); +} + +class LiveFrameSource : public FramedSource { + public: + static LiveFrameSource *createNew(UsageEnvironment &env, size_t queue_size); + void pushData(const uint8_t *data, size_t data_size, uint64_t timestamp); + std::string getAuxLine() { return fAuxLine; }; + virtual EncodeType GetEncodeType() { return EncodeType::INVALID;} + + public: + struct FramePacket { + FramePacket() = default; + FramePacket(std::shared_ptr buffer, size_t offset, size_t size, struct timeval timestamp) : + buffer_(buffer), offset_(offset), size_(size), timestamp_(timestamp) {} + std::shared_ptr buffer_{nullptr}; + size_t offset_{0}; + size_t size_{0}; + struct timeval timestamp_{0}; + }; + + struct RawData { + std::shared_ptr buffer_{nullptr}; + size_t size_{0}; + uint64_t timestamp_{0}; + }; + + protected: + LiveFrameSource(UsageEnvironment &env, size_t queue_size); + virtual ~LiveFrameSource(); + + virtual void doGetNextFrame(); + virtual void doStopGettingFrames(); + + virtual unsigned maxFrameSize() const { + return 512 * 1024; // set a reasonable value ..TODO + } + static void deliverFrame0(void *clientData); + void deliverFrame(); + + int getFrame(); + void processFrame(std::shared_ptr data, size_t size, const struct timeval &ref); + virtual std::list parseFrame(std::shared_ptr data, size_t size, const struct timeval &ref); + void queueFramePacket(FramePacket &packet); + + protected: + std::list fFramePacketQueue; + std::list fRawDataQueue; + EventTriggerId fEventTriggerId = 0; + size_t fQueueSize; + + std::thread fThread; + std::mutex fMutex; + std::mutex fMutexRaw; + std::atomic fNeedReadFrame{true}; + std::string fAuxLine; +}; + +#endif // _LIVEFRAMESOURCE_H diff --git a/src/big/mpp/middleware/src/rtsp_server/LiveServerMediaSession.cpp b/src/big/mpp/middleware/src/rtsp_server/LiveServerMediaSession.cpp new file mode 100644 index 000000000..8ac18f252 --- /dev/null +++ b/src/big/mpp/middleware/src/rtsp_server/LiveServerMediaSession.cpp @@ -0,0 +1,66 @@ +#include +#include +#include "LiveServerMediaSession.h" +#include "LiveFrameSource.h" + +LiveServerMediaSession *LiveServerMediaSession::createNew(UsageEnvironment &env, StreamReplicator *replicator) { + return new LiveServerMediaSession(env, replicator); +} + +// For live streaming, we always set reuseFirstSource False, and use StreamReplicator, +// so that createNewStreamSource() will be called when a new client comes. +// +LiveServerMediaSession::LiveServerMediaSession(UsageEnvironment &env, StreamReplicator *replicator) + : OnDemandServerMediaSubsession(env, False/*reuseFirstSource*/), fReplicator(replicator) + { } + +LiveServerMediaSession::~LiveServerMediaSession() { +} + +char const *LiveServerMediaSession::getAuxSDPLine(RTPSink *rtpSink, FramedSource *inputSource) { + const char *auxLine = NULL; + std::string sdpLine = ((LiveFrameSource *)(fReplicator->inputSource()))->getAuxLine(); + if (!sdpLine.empty()) { + std::ostringstream os; + os << "a=fmtp:" << (int)rtpSink->rtpPayloadType() << " "; + os << sdpLine; + os << "\r\n"; + auxLine = strdup(os.str().c_str()); + + // std::cout << auxLine << std::endl; + } + return auxLine; +} + +FramedSource *LiveServerMediaSession::createNewStreamSource(unsigned clientSessionId, unsigned &estBitrate) { + EncodeType type = ((LiveFrameSource *)fReplicator->inputSource())->GetEncodeType(); + if (type == EncodeType::H264) { + estBitrate = 2048; + return H264VideoStreamDiscreteFramer::createNew(envir(), fReplicator->createStreamReplica()); + } else if (type == EncodeType::H265) { + estBitrate = 2048; + return H265VideoStreamDiscreteFramer::createNew(envir(), fReplicator->createStreamReplica()); + } else if (type == EncodeType::G711U) { + estBitrate = 64; + return fReplicator->createStreamReplica(); + } else { + std::cout << "createNewStreamSource() -- type not supported yet" << (int) type << std::endl; + return nullptr; + } +} + +RTPSink *LiveServerMediaSession::createNewRTPSink(Groupsock *rtpGroupsock, unsigned char rtpPayloadTypeIfDynamic, FramedSource* inputSource) { + EncodeType type = ((LiveFrameSource *)fReplicator->inputSource())->GetEncodeType(); + if (type == EncodeType::H264) { + OutPacketBuffer::maxSize = 1024 * 1024; + return H264VideoRTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic); + } else if (type == EncodeType::H265) { + OutPacketBuffer::maxSize = 1024 * 1024; + return H265VideoRTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic); + } else if (type == EncodeType::G711U) { + return SimpleRTPSink::createNew(envir(), rtpGroupsock, 0, 8000, "audio", "PCMU", 1, False /*allowMultipleFramesPerPacket*/); + } else { + std::cout << "createNewRTPSink() -- type not supported yet" << (int) type << std::endl; + return nullptr; + } +} diff --git a/src/big/mpp/middleware/src/rtsp_server/LiveServerMediaSession.h b/src/big/mpp/middleware/src/rtsp_server/LiveServerMediaSession.h new file mode 100644 index 000000000..f41dafeec --- /dev/null +++ b/src/big/mpp/middleware/src/rtsp_server/LiveServerMediaSession.h @@ -0,0 +1,25 @@ +#ifndef _LIVFRAMESERVERMEDIASUBSESSION_H +#define _LIVFRAMESERVERMEDIASUBSESSION_H + +#include "liveMedia.hh" +#include "OnDemandServerMediaSubsession.hh" +#include "LiveFrameSource.h" + +class LiveServerMediaSession : public OnDemandServerMediaSubsession { + public: + static LiveServerMediaSession *createNew(UsageEnvironment &env, StreamReplicator *replicator); + + protected: + LiveServerMediaSession(UsageEnvironment &env, StreamReplicator *replicator); + virtual ~LiveServerMediaSession(); + + protected: + virtual char const *getAuxSDPLine(RTPSink *rtpSink, FramedSource *inputSource); + virtual FramedSource *createNewStreamSource(unsigned clientSessionId, unsigned &estBitrate); + virtual RTPSink *createNewRTPSink(Groupsock *rtpGroupsock, unsigned char rtpPayloadTypeIfDynamic, FramedSource* inputSource); + + protected: + StreamReplicator *fReplicator{nullptr}; +}; + +#endif // _LIVFRAMESERVERMEDIASUBSESSION_H \ No newline at end of file diff --git a/src/big/mpp/middleware/src/rtsp_server/Makefile b/src/big/mpp/middleware/src/rtsp_server/Makefile new file mode 100644 index 000000000..00325842d --- /dev/null +++ b/src/big/mpp/middleware/src/rtsp_server/Makefile @@ -0,0 +1,62 @@ +include $(MPP_SRC_DIR)/middleware/mpp.mk +include $(MPP_SRC_DIR)/middleware/rt-smart.mk + +AR = riscv64-unknown-linux-musl-ar +ARFLAGS = -rc + +CURRECT_DIR_NAME=$(shell basename `pwd`) +LOCAL_SRC_DIR = $(shell pwd) +BIN = lib$(CURRECT_DIR_NAME).a +LIBPATH = $(MPP_LIB_PATH) +LIBS = $(MPP_LIBS) + +LIBS_FOR_CONSOLE_APPLICATION = -lssl -lcrypto +CC_CFLAGS_EX=-mcmodel=medany -march=rv64imafdcv -mabi=lp64d -Wall -O0 -g -gdwarf-2 -n --static $(KCFLAGS) + +LIVE555_USAGEENVIRONMENT= ../live555/UsageEnvironment +LIVE555_BASICUSAGEENVIRONMENT= ../live555/BasicUsageEnvironment +LIVE555_GROUPSOCK = ../live555/groupsock +LIVE555_LIVEMEDIA = ../live555/liveMedia + +LOCAL_LIBS_PATH = -L$(LIVE555_USAGEENVIRONMENT) -L$(LIVE555_BASICUSAGEENVIRONMENT) -L$(LIVE555_GROUPSOCK) -L$(LIVE555_LIVEMEDIA) +LOCAL_LIBS = -lliveMedia -lgroupsock -lBasicUsageEnvironment -lUsageEnvironment + +LIVE555_COMPILE_OPTS = -DSOCKLEN_T=socklen_t -DNO_SSTREAM=1 -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -DNO_OPENSSL=1 + +LOCAL_CFLAGS = -I$(LOCAL_SRC_DIR) -I$(LOCAL_SRC_DIR)/include -I$(LIVE555_GROUPSOCK)/include -I$(LIVE555_USAGEENVIRONMENT)/include -I$(LIVE555_BASICUSAGEENVIRONMENT)/include -I$(LIVE555_LIVEMEDIA)/include + +WERROR_FLAGS = -Wno-register -Wno-multichar -Wno-pessimizing-move -Wno-deprecated-declarations -Wno-unused-result -Wno-unused-variable -Wno-format -Wno-return-type -Wno-sign-compare -Wno-unused-label + +CXX_FLAGS = -std=c++20 \ + $(WERROR_FLAGS) \ + $(LIVE555_COMPILE_OPTS) \ + +SRCS = $(wildcard $(LOCAL_SRC_DIR)/*.c) + +OBJS = $(patsubst %.c,%.o,$(SRCS)) + +CPP_SRCS = $(wildcard $(LOCAL_SRC_DIR)/*.cpp) + +CPP_OBJS = $(patsubst %.cpp,%.o,$(CPP_SRCS)) + +all:$(BIN) + @-rm -f *.o + @echo "${PWD}/Makefile all" + +$(OBJS): %.o : %.c + @echo CC $@ + @$(CC) $(CC_CFLAGS_EX) $(LOCAL_CFLAGS) $(BSP_CFLGAS) $(RTSMART_CFLAGS) $(MPP_USER_CFLGAS) $(LOCAL_LIBS)-c $< -o $@ + +$(CPP_OBJS): %.o : %.cpp + @echo CXX $@ + @$(CPP) $(CC_CFLAGS_EX) $(CXX_FLAGS) $(LOCAL_CFLAGS) $(BSP_CFLGAS) $(RTSMART_CFLAGS) $(MPP_USER_CFLGAS) $(LOCAL_LIBS) -c $< -o $@ + +$(BIN): $(OBJS) $(CPP_OBJS) + @echo LD $@ + #@$(CPP) -o $(BIN) $(LINKFLAG) -Wl,--whole-archive -Wl,--no-whole-archive -n --static $^ -L$(LIBPATH) $(CXX_FLAGS) $(LOCAL_LIBS) $(LOCAL_LIBS_PATH) -Wl,--start-group $(LIBS) -Wl,--end-group + $(AR) $(ARFLAGS) $@ $^ +clean: + echo "${PWD}/Makefile clean" + rm -rf $(BIN) $(OBJS) + +.PHONY: all clean diff --git a/src/big/mpp/middleware/src/rtsp_server/g711BackChannelServerMediaSubsession.cpp b/src/big/mpp/middleware/src/rtsp_server/g711BackChannelServerMediaSubsession.cpp new file mode 100644 index 000000000..95874fc3e --- /dev/null +++ b/src/big/mpp/middleware/src/rtsp_server/g711BackChannelServerMediaSubsession.cpp @@ -0,0 +1,58 @@ +#include "g711BackChannelServerMediaSubsession.h" + +G711BackChannelServerMediaSubsession* +G711BackChannelServerMediaSubsession::createNew(UsageEnvironment& env, + IOnData *onData, + Boolean reuseFirstSource) { + return new G711BackChannelServerMediaSubsession(env, onData, reuseFirstSource); +} + +G711BackChannelServerMediaSubsession::G711BackChannelServerMediaSubsession(UsageEnvironment& env, + IOnData *onData, + Boolean reuseFirstSource) +: BackChannel::OnDemandServerMediaSubsession(env, reuseFirstSource), fOnData(onData) { +} + + +G711BackChannelServerMediaSubsession::~G711BackChannelServerMediaSubsession() { +} + + +DataSink* G711BackChannelServerMediaSubsession::createNewStreamDestination(unsigned clientSessionId, + unsigned& estBitrate) { + estBitrate = 64; // kbps, estimate + return DataSink::createNew(envir(), fOnData); +} + +#include +// "estBitrate" is the stream's estimated bitrate, in kbps +RTPSource* G711BackChannelServerMediaSubsession::createNewRTPSource(Groupsock* rtpGroupsock, + unsigned char rtpPayloadTypeIfDynamic, + DataSink* outputSink) +{ + rtpPayloadTypeIfDynamic = 0; // PCMU + unsigned fSamplingFrequency = 8000; + RTPSource* fReadSource = G711RTPSource::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic, fSamplingFrequency); + return fReadSource; +} + +G711RTPSource* G711RTPSource::createNew(UsageEnvironment& env, + Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency) { + return new G711RTPSource(env, RTPgs, rtpPayloadFormat, rtpTimestampFrequency); +} + +G711RTPSource::G711RTPSource(UsageEnvironment& env, + Groupsock* rtpGS, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency) + : MultiFramedRTPSource(env, rtpGS, rtpPayloadFormat, rtpTimestampFrequency) { +} + +G711RTPSource::~G711RTPSource() { +} + +char const* G711RTPSource::MIMEtype() const { + return "audio"; +} diff --git a/src/big/mpp/middleware/src/rtsp_server/g711BackChannelServerMediaSubsession.h b/src/big/mpp/middleware/src/rtsp_server/g711BackChannelServerMediaSubsession.h new file mode 100644 index 000000000..50102c247 --- /dev/null +++ b/src/big/mpp/middleware/src/rtsp_server/g711BackChannelServerMediaSubsession.h @@ -0,0 +1,53 @@ +#ifndef __g711_BackChannelServerMediaSubsession__ +#define __g711_BackChannelServerMediaSubsession__ + +// #include "FileServerMediaSubsession.hh" +#include "BackChannelServerMediaSubsession.h" +#include "MultiFramedRTPSource.hh" +#include + +class G711BackChannelServerMediaSubsession: public BackChannel::OnDemandServerMediaSubsession{ + public: + static G711BackChannelServerMediaSubsession* + createNew(UsageEnvironment& env, IOnData *onData, + Boolean reuseFirstSource = False); + + protected: + G711BackChannelServerMediaSubsession(UsageEnvironment& env, + IOnData *onData, + Boolean reuseFirstSource = False); + // called only by createNew(); + virtual ~G711BackChannelServerMediaSubsession(); + + protected: // redefined virtual functions + virtual DataSink* createNewStreamDestination(unsigned clientSessionId, + unsigned& estBitrate); + // "estBitrate" is the stream's estimated bitrate, in kbps + virtual RTPSource* createNewRTPSource(Groupsock* rtpGroupsock, + unsigned char rtpPayloadTypeIfDynamic, + DataSink* outputSink); + protected: + IOnData *fOnData; +}; + +class G711RTPSource: public MultiFramedRTPSource { + public: + static G711RTPSource* + createNew(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency); + + protected: + virtual ~G711RTPSource(); + + private: + G711RTPSource(UsageEnvironment& env, Groupsock* RTPgs, + unsigned char rtpPayloadFormat, + unsigned rtpTimestampFrequency); + // called only by createNew() + + private: + virtual char const* MIMEtype() const; +}; + +#endif diff --git a/src/big/mpp/middleware/src/rtsp_server/g711LiveFrameSource.cpp b/src/big/mpp/middleware/src/rtsp_server/g711LiveFrameSource.cpp new file mode 100644 index 000000000..ebd2d6e15 --- /dev/null +++ b/src/big/mpp/middleware/src/rtsp_server/g711LiveFrameSource.cpp @@ -0,0 +1,8 @@ +#include "g711LiveFrameSource.h" + +G711LiveFrameSource* G711LiveFrameSource::createNew(UsageEnvironment &env, size_t queue_size) { + return new G711LiveFrameSource(env, queue_size); +} + +G711LiveFrameSource::G711LiveFrameSource(UsageEnvironment &env, size_t queue_size) : LiveFrameSource(env, queue_size) +{} diff --git a/src/big/mpp/middleware/src/rtsp_server/g711LiveFrameSource.h b/src/big/mpp/middleware/src/rtsp_server/g711LiveFrameSource.h new file mode 100644 index 000000000..d8533c05a --- /dev/null +++ b/src/big/mpp/middleware/src/rtsp_server/g711LiveFrameSource.h @@ -0,0 +1,15 @@ +#ifndef _G711_LIVEFRAMESOURCE_H +#define _G711_LIVEFRAMESOURCE_H + +#include "LiveFrameSource.h" + +class G711LiveFrameSource : public LiveFrameSource { + public: + static G711LiveFrameSource *createNew(UsageEnvironment &env, size_t queue_size); + + protected: + G711LiveFrameSource(UsageEnvironment &env, size_t queue_size); + virtual EncodeType GetEncodeType() override { return EncodeType::G711U;} +}; + +#endif // _G711_LIVEFRAMESOURCE_H diff --git a/src/big/mpp/middleware/src/rtsp_server/h264LiveFrameSource.cpp b/src/big/mpp/middleware/src/rtsp_server/h264LiveFrameSource.cpp new file mode 100644 index 000000000..1438f4b62 --- /dev/null +++ b/src/big/mpp/middleware/src/rtsp_server/h264LiveFrameSource.cpp @@ -0,0 +1,86 @@ +#include +#include "Base64.hh" +#include +#include "h264LiveFrameSource.h" + +H264LiveFrameSource* H264LiveFrameSource::createNew(UsageEnvironment &env, size_t queue_size) { + return new H264LiveFrameSource(env, queue_size); +} + +H264LiveFrameSource::H264LiveFrameSource(UsageEnvironment &env, size_t queue_size) : LiveFrameSource(env, queue_size) +{} + +const uint8_t H264marker[] = {0, 0, 0, 1}; +uint8_t *H264LiveFrameSource::extractFrame(uint8_t *frame, size_t &size, size_t &outsize) { + unsigned char *outFrame = NULL; + outsize = 0; + if ((size >= sizeof(H264marker)) && (memcmp(frame, H264marker, sizeof(H264marker)) == 0)) { + size -= sizeof(H264marker); + outFrame = &frame[sizeof(H264marker)]; + outsize = size; + for (int i = 0; i + sizeof(H264marker) < size; ++i) { + if (memcmp(&outFrame[i], H264marker, sizeof(H264marker)) == 0) { + outsize = (size_t) i; + break; + } + } + size -= outsize; + } + return outFrame; +} + +std::list +H264LiveFrameSource::parseFrame(std::shared_ptr data, size_t data_size, const struct timeval &ref) { + std::list packetList; + + size_t bufSize = data_size; + size_t size = 0; + uint8_t *buffer = this->extractFrame(data.get(), bufSize, size); + while (buffer != NULL) { + switch (buffer[0] & 0x1F) { + case 7: + fAuxLine.clear(); + fSps.reset(), fPps.reset(); + fSps = make_shared_array(size);; + memcpy(fSps.get(), buffer, size); + sps_size = size; + break; + case 8: + fPps = make_shared_array(size); + memcpy(fPps.get(), buffer, size); + pps_size = size; + break; + case 5: + if (fRepeatConfig && fSps && fPps) { + FramePacket sps(fSps, 0, sps_size, ref); + packetList.push_back(sps); + FramePacket pps(fPps, 0, pps_size, ref); + packetList.push_back(pps); + } + break; + default: + break; + } + + if (fAuxLine.empty() && fSps && fPps) { + u_int32_t profile_level_id = 0; + if (sps_size >= 4) + profile_level_id = (u_int32_t) ((fSps.get()[1] << 16) | (fSps.get()[2] << 8) | fSps.get()[3]); + char *sps_base64 = base64Encode((char*)fSps.get(), sps_size); + char *pps_base64 = base64Encode((char*)fPps.get(), pps_size); + + std::ostringstream os; + os << "profile-level-id=" << std::hex << std::setw(6) << profile_level_id; + os << ";sprop-parameter-sets=" << sps_base64 << "," << pps_base64 << ";"; + fAuxLine.assign(os.str()); + + free(sps_base64); + free(pps_base64); + // std::cout << "H264 SDP-aux-line: " << fAuxLine.c_str() << std::endl; + } + FramePacket packet(data, buffer - data.get(), size, ref); + packetList.push_back(packet); + buffer = this->extractFrame(&buffer[size], bufSize, size); + } + return packetList; +} diff --git a/src/big/mpp/middleware/src/rtsp_server/h264LiveFrameSource.h b/src/big/mpp/middleware/src/rtsp_server/h264LiveFrameSource.h new file mode 100644 index 000000000..61644c4ec --- /dev/null +++ b/src/big/mpp/middleware/src/rtsp_server/h264LiveFrameSource.h @@ -0,0 +1,26 @@ +#ifndef _H264_LIVEFRAMESOURCE_H +#define _H264_LIVEFRAMESOURCE_H + +#include "LiveFrameSource.h" + +class H264LiveFrameSource : public LiveFrameSource { + public: + static H264LiveFrameSource *createNew(UsageEnvironment &env, size_t queue_size); + + protected: + H264LiveFrameSource(UsageEnvironment &env, size_t queue_size); + virtual std::list parseFrame(std::shared_ptr data, size_t size, const struct timeval &ref) override; + + uint8_t *extractFrame(uint8_t *data, size_t &size, size_t &outsize); + + virtual EncodeType GetEncodeType() override { return EncodeType::H264;} + + private: + std::shared_ptr fSps; + size_t sps_size{0}; + std::shared_ptr fPps; + size_t pps_size{0}; + bool fRepeatConfig{true}; +}; + +#endif // _H264_LIVEFRAMESOURCE_H diff --git a/src/big/mpp/middleware/src/rtsp_server/h265LiveFrameSource.cpp b/src/big/mpp/middleware/src/rtsp_server/h265LiveFrameSource.cpp new file mode 100644 index 000000000..3cbb6ba13 --- /dev/null +++ b/src/big/mpp/middleware/src/rtsp_server/h265LiveFrameSource.cpp @@ -0,0 +1,99 @@ +#include +#include +#include +#include "h265LiveFrameSource.h" + +H265LiveFrameSource* H265LiveFrameSource::createNew(UsageEnvironment &env, size_t queue_size) { + return new H265LiveFrameSource(env, queue_size); +} + +H265LiveFrameSource::H265LiveFrameSource(UsageEnvironment &env, size_t queue_size) : LiveFrameSource(env, queue_size) +{} + +const uint8_t H265marker[] = {0, 0, 0, 1}; +uint8_t *H265LiveFrameSource::extractFrame(uint8_t *frame, size_t &size, size_t &outsize) { + unsigned char *outFrame = NULL; + outsize = 0; + if ((size >= sizeof(H265marker)) && (memcmp(frame, H265marker, sizeof(H265marker)) == 0)) { + size -= sizeof(H265marker); + outFrame = &frame[sizeof(H265marker)]; + outsize = size; + for (int i = 0; i + sizeof(H265marker) < size; ++i) { + if (memcmp(&outFrame[i], H265marker, sizeof(H265marker)) == 0) { + outsize = (size_t) i; + break; + } + } + size -= outsize; + } + return outFrame; +} + + +#define H265_NAL(v) ((v>> 1) & 0x3f) + +std::list +H265LiveFrameSource::parseFrame(std::shared_ptr data, size_t data_size, const struct timeval &ref) { + std::list packetList; + + size_t bufSize = data_size; + size_t size = 0; + uint8_t *buffer = this->extractFrame(data.get(), bufSize, size); + while (buffer != NULL) { + int nal_type = H265_NAL(buffer[0]); + switch (nal_type) { + case 32: // VPS + fAuxLine.clear(); + fVps.reset(), fSps.reset(), fPps.reset(); + fVps = make_shared_array(size); + memcpy(fVps.get(), buffer, size); + vps_size = size; + break; + case 33: // SPS + fSps = make_shared_array(size); + memcpy(fSps.get(), buffer, size); + sps_size = size; + break; + case 34: // PPS + fPps = make_shared_array(size); + memcpy(fPps.get(), buffer, size); + pps_size = size; + break; + case 19: // IDR_W_RADL + case 20: // IDR_N_LP + if (fRepeatConfig && fVps && fSps && fPps) { + FramePacket vps(fVps, 0, vps_size, ref); + packetList.push_back(vps); + FramePacket sps(fSps, 0, sps_size, ref); + packetList.push_back(sps); + FramePacket pps(fPps, 0, pps_size, ref); + packetList.push_back(pps); + } + break; + default: + break; + } + + if (fAuxLine.empty() && fVps && fSps && fPps) { + u_int32_t profile_level_id = 0; + if (sps_size >= 4) + profile_level_id = (u_int32_t) ((fSps.get()[1] << 16) | (fSps.get()[2] << 8) | fSps.get()[3]); + char *vps_base64 = base64Encode((char*)fVps.get(), vps_size); + char *sps_base64 = base64Encode((char*)fSps.get(), sps_size); + char *pps_base64 = base64Encode((char*)fPps.get(), pps_size); + std::ostringstream os; + os << "profile-level-id=" << std::hex << std::setw(6) << profile_level_id; + os << ";sprop-parameter-sets=" << vps_base64 << "," << sps_base64 << "," << pps_base64 << ";"; + fAuxLine.assign(os.str()); + + free(vps_base64); + free(sps_base64); + free(pps_base64); + // std::cout << "H265 SDP-aux-line: " << fAuxLine.c_str() << std::endl; + } + FramePacket packet(data, buffer - data.get(), size, ref); + packetList.push_back(packet); + buffer = this->extractFrame(&buffer[size], bufSize, size); + } + return packetList; +} diff --git a/src/big/mpp/middleware/src/rtsp_server/h265LiveFrameSource.h b/src/big/mpp/middleware/src/rtsp_server/h265LiveFrameSource.h new file mode 100644 index 000000000..e91de9fac --- /dev/null +++ b/src/big/mpp/middleware/src/rtsp_server/h265LiveFrameSource.h @@ -0,0 +1,28 @@ +#ifndef _H265_LIVEFRAMESOURCE_H +#define _H265_LIVEFRAMESOURCE_H + +#include "LiveFrameSource.h" + +class H265LiveFrameSource : public LiveFrameSource { + public: + static H265LiveFrameSource *createNew(UsageEnvironment &env, size_t queue_size); + + protected: + H265LiveFrameSource(UsageEnvironment &env, size_t queue_size); + virtual std::list parseFrame(std::shared_ptr data, size_t size, const struct timeval &ref) override; + + uint8_t *extractFrame(uint8_t *data, size_t &size, size_t &outsize); + + virtual EncodeType GetEncodeType() override { return EncodeType::H265;} + + private: + std::shared_ptr fVps; + size_t vps_size{0}; + std::shared_ptr fSps; + size_t sps_size{0}; + std::shared_ptr fPps; + size_t pps_size{0}; + bool fRepeatConfig{true}; +}; + +#endif // _H265_LIVEFRAMESOURCE_H diff --git a/src/big/mpp/middleware/src/rtsp_server/include/rtsp_server.h b/src/big/mpp/middleware/src/rtsp_server/include/rtsp_server.h new file mode 100644 index 000000000..de4c52395 --- /dev/null +++ b/src/big/mpp/middleware/src/rtsp_server/include/rtsp_server.h @@ -0,0 +1,53 @@ +#ifndef _KD_RTSP_SERVER_H +#define _KD_RTSP_SERVER_H + +#include +#include +#include + +enum class VideoType { + kVideoTypeH264, + kVideoTypeH265, + kVideoTypeMjpeg, + kVideoTypeButt +}; + +struct SessionAttr { + bool with_video {false}; + bool with_audio {false}; // G711U + bool with_audio_backchannel{false}; // G711U + VideoType video_type; // valid when with_video is true +}; + +class IOnBackChannel { + public: + virtual ~IOnBackChannel() {} + virtual void OnBackChannelData(std::string &session_name, const uint8_t *data, size_t size, uint64_t timestamp) = 0; +}; + +class KdRtspServer { + public: + KdRtspServer(); + ~KdRtspServer(); + + int Init(int port = 8554, IOnBackChannel *back_channel = nullptr); + void DeInit(); + + int CreateSession(const std::string &session_name, const SessionAttr &session_attr); + int DestroySession(const std::string &session_name); + void Start(); + void Stop(); + + int SendVideoData(const std::string &session_name, const uint8_t *data, size_t size, uint64_t timestamp); + int SendAudioData(const std::string &session_name, const uint8_t *data, size_t size, uint64_t timestamp); + + private: + KdRtspServer(const KdRtspServer &) = delete; + KdRtspServer& operator=(const KdRtspServer &) = delete; + + private: + class Impl; + std::unique_ptr impl_{nullptr}; +}; + +#endif // _RTSP_SERVER_H \ No newline at end of file diff --git a/src/big/mpp/middleware/src/rtsp_server/mjpegLiveFrameSource.cpp b/src/big/mpp/middleware/src/rtsp_server/mjpegLiveFrameSource.cpp new file mode 100644 index 000000000..25090c946 --- /dev/null +++ b/src/big/mpp/middleware/src/rtsp_server/mjpegLiveFrameSource.cpp @@ -0,0 +1,137 @@ +#include +#include +#include "mjpegLiveFrameSource.h" + +MjpegLiveVideoSource *MjpegLiveVideoSource::createNew(UsageEnvironment &env, size_t queue_size) { + return new MjpegLiveVideoSource(env, queue_size); +} + +MjpegLiveVideoSource::MjpegLiveVideoSource(UsageEnvironment &env, size_t queue_size) : + JPEGVideoSource(env), fQueueSize(queue_size) { + OutPacketBuffer::maxSize = 512000; + fEventTriggerId = envir().taskScheduler().createEventTrigger(deliverFrame0); + fThread = std::thread([this](){ + while(this->fNeedReadFrame) { + this->getFrame(); + usleep(1000 * 10); // FIXME + } + }); +} + +MjpegLiveVideoSource::~MjpegLiveVideoSource() { + fNeedReadFrame.store(false); + if(fThread.joinable()) { + fThread.join(); + } + while (!fFramePacketQueue.empty()) { + fFramePacketQueue.pop_front(); + } + while (!fRawDataQueue.empty()) { + fRawDataQueue.pop_front(); + } + if(fEventTriggerId) { + envir().taskScheduler().deleteEventTrigger(fEventTriggerId); + fEventTriggerId = 0; + } +} + +template +std::shared_ptr make_shared_array(size_t size) { + return std::shared_ptr(new T[size], std::default_delete()); +} +void MjpegLiveVideoSource::pushData(const uint8_t *data, size_t data_size, uint64_t timestamp) { + std::shared_ptr buf = make_shared_array(data_size); + memcpy(buf.get(), data, data_size); + + RawData raw_data; + raw_data.buffer_ = buf; + raw_data.size_ = data_size; + raw_data.timestamp_ = timestamp; + std::unique_lock lck(fMutexRaw); + fRawDataQueue.push_back(raw_data); +} + +int MjpegLiveVideoSource::getFrame() { + RawData raw_data; + std::unique_lock lck(fMutexRaw); + if (!fRawDataQueue.empty()) { + raw_data = fRawDataQueue.front(); + fRawDataQueue.pop_front(); + } + lck.unlock(); + + int frameSize = 0; + if (raw_data.buffer_ && raw_data.size_) { + // use system-time when getFrame() called as PresentationTime + struct timeval ref; + gettimeofday(&ref, NULL); + frameSize = raw_data.size_; + processFrame(raw_data.buffer_, frameSize, ref); + } + return frameSize; +} + +void MjpegLiveVideoSource::processFrame(std::shared_ptr data, size_t size, const struct timeval &ref) { + if (fParser.parse(const_cast(data.get()), size) == 0) { + unsigned int len = 0; + const uint8_t *frame_bits = fParser.scandata(len); + FramePacket packet(data, frame_bits - data.get(), len, ref); + queueFramePacket(packet); + } +} + +void MjpegLiveVideoSource::queueFramePacket(MjpegLiveVideoSource::FramePacket &packet) { + std::unique_lock lck(fMutex); + while (fFramePacketQueue.size() >= fQueueSize) { + fFramePacketQueue.pop_front(); + } + fFramePacketQueue.push_back(packet); + lck.unlock(); + // post an event to ask to deliver the frame + envir().taskScheduler().triggerEvent(fEventTriggerId, this); +} + +void MjpegLiveVideoSource::doGetNextFrame() { + deliverFrame(); +} + +void MjpegLiveVideoSource::doStopGettingFrames() { + FramedSource::doStopGettingFrames(); +} + +void MjpegLiveVideoSource::deliverFrame0(void *clientData) { + ((MjpegLiveVideoSource*)clientData)->deliverFrame(); +} + +void MjpegLiveVideoSource::deliverFrame() { + if (isCurrentlyAwaitingData()) { + fDurationInMicroseconds = 0; + fFrameSize = 0; + + FramePacket packet; + std::unique_lock lck(fMutex); + if (!fFramePacketQueue.empty()) { + packet = fFramePacketQueue.front(); + fFramePacketQueue.pop_front(); + } + lck.unlock(); + + if(packet.size_) { + if (packet.size_ > fMaxSize) { + fFrameSize = fMaxSize; + fNumTruncatedBytes = packet.size_ - fMaxSize; + std::cout << "MjpegLiveVideoSource::deliverFrame() -- truncate bytes " << fNumTruncatedBytes << std::endl; + } else { + fFrameSize = packet.size_; + } + + fPresentationTime = packet.timestamp_; + memcpy(fTo, packet.buffer_.get() + packet.offset_, fFrameSize); + } + + if (fFrameSize > 0) { + FramedSource::afterGetting(this); + // envir().taskScheduler().scheduleDelayedTask(0, (TaskFunc*)FramedSource::afterGetting, this); + } + } +} diff --git a/src/big/mpp/middleware/src/rtsp_server/mjpegLiveFrameSource.h b/src/big/mpp/middleware/src/rtsp_server/mjpegLiveFrameSource.h new file mode 100644 index 000000000..9e848b0c8 --- /dev/null +++ b/src/big/mpp/middleware/src/rtsp_server/mjpegLiveFrameSource.h @@ -0,0 +1,72 @@ +#ifndef _MJPEG_LIVEFRAMESOURCE_H +#define _MJPEG_LIVEFRAMESOURCE_H + +#include +#include +#include +#include +#include +#include "JPEGVideoSource.hh" +#include "JpegFrameParser.hh" + +class MjpegLiveVideoSource : public JPEGVideoSource { + public: + static MjpegLiveVideoSource *createNew(UsageEnvironment &env, size_t queue_size = 8); + JpegFrameParser &Parser() { return fParser;} + void pushData(const uint8_t *data, size_t data_size, uint64_t timestamp); + + protected: + MjpegLiveVideoSource(UsageEnvironment &env, size_t queue_size = 8); + virtual ~MjpegLiveVideoSource(); + + public: + struct FramePacket { + FramePacket() = default; + FramePacket(std::shared_ptr buffer, size_t offset, size_t size, struct timeval timestamp) : + buffer_(buffer), offset_(offset), size_(size), timestamp_(timestamp) {} + std::shared_ptr buffer_{nullptr}; + size_t offset_{0}; + size_t size_{0}; + struct timeval timestamp_{0}; + }; + + struct RawData { + std::shared_ptr buffer_{nullptr}; + size_t size_{0}; + uint64_t timestamp_{0}; + }; + + int getFrame(); + void processFrame(std::shared_ptr data, size_t size, const struct timeval &ref); + void queueFramePacket(FramePacket &packet); + + protected: + std::list fFramePacketQueue; + std::list fRawDataQueue; + size_t fQueueSize; + std::thread fThread; + std::mutex fMutex; + std::mutex fMutexRaw; + std::atomic fNeedReadFrame{true}; + + protected: + virtual void doGetNextFrame(); + virtual void doStopGettingFrames(); + static void deliverFrame0(void *clientData); + void deliverFrame(); + + virtual u_int8_t type() { return fParser.type(); } + virtual u_int8_t qFactor() { return fParser.qFactor(); } + virtual u_int8_t width() { return fParser.width(); } + virtual u_int8_t height() { return fParser.height(); } + virtual u_int8_t const *quantizationTables(u_int8_t &precision, u_int16_t &length) { + precision = fParser.precision(); + return fParser.quantizationTables(length); + } + virtual u_int16_t restartInterval() { return fParser.restartInterval(); } + + JpegFrameParser fParser; + EventTriggerId fEventTriggerId = 0; +}; + +#endif // _MJPEG_LIVEFRAMESOURCE_H \ No newline at end of file diff --git a/src/big/mpp/middleware/src/rtsp_server/mjpegMediaSubSession.cpp b/src/big/mpp/middleware/src/rtsp_server/mjpegMediaSubSession.cpp new file mode 100644 index 000000000..cdb9c04dc --- /dev/null +++ b/src/big/mpp/middleware/src/rtsp_server/mjpegMediaSubSession.cpp @@ -0,0 +1,31 @@ +#include "mjpegMediaSubSession.h" +#include "FramedSource.hh" +#include "mjpegLiveFrameSource.h" +#include "JPEGVideoRTPSink.hh" + +MjpegMediaSubsession *MjpegMediaSubsession::createNew(UsageEnvironment &env, JpegStreamReplicator *replicator) { + return new MjpegMediaSubsession(env, replicator); +} + +MjpegMediaSubsession::MjpegMediaSubsession(UsageEnvironment &env, JpegStreamReplicator *replicator) + : OnDemandServerMediaSubsession(env, False/*reuseFirstSource*/), fReplicator(replicator) + { } + +MjpegMediaSubsession::~MjpegMediaSubsession() { +} + +FramedSource* MjpegMediaSubsession::createNewStreamSource(unsigned clientSessionId, unsigned& estBitrate) { + if (fReplicator) { + // std::cout << "MjpegMediaSubsession::createNewStreamSource replicator called" << std::endl; + estBitrate = 9000; + MjpegLiveVideoSource *frameSource = fReplicator->createStreamReplica(); + return frameSource; + } + return nullptr; +} + +RTPSink* MjpegMediaSubsession::createNewRTPSink(Groupsock* rtpGroupsock, unsigned char rtpPayloadTypeIfDynamic, FramedSource* inputSource){ + // std::cout << "MjpegMediaSubsession::createNewRTPSink called"<< std::endl; + OutPacketBuffer::maxSize = 2 * 1024 * 1024; + return JPEGVideoRTPSink::createNew(envir(), rtpGroupsock); +} \ No newline at end of file diff --git a/src/big/mpp/middleware/src/rtsp_server/mjpegMediaSubSession.h b/src/big/mpp/middleware/src/rtsp_server/mjpegMediaSubSession.h new file mode 100644 index 000000000..5d6a47d56 --- /dev/null +++ b/src/big/mpp/middleware/src/rtsp_server/mjpegMediaSubSession.h @@ -0,0 +1,25 @@ +#ifndef _MJPEG_MEDIASUBSESSION_H +#define _MJPEG_MEDIASUBSESSION_H + +#include "liveMedia.hh" +#include "OnDemandServerMediaSubsession.hh" +#include "FramedSource.hh" +#include "mjpegStreamReplicator.h" + +class MjpegMediaSubsession: public OnDemandServerMediaSubsession { + public: + static MjpegMediaSubsession *createNew(UsageEnvironment &env, JpegStreamReplicator *replicator); + + protected: + MjpegMediaSubsession(UsageEnvironment& env, JpegStreamReplicator *replicator); + ~MjpegMediaSubsession(); + + protected: + virtual FramedSource* createNewStreamSource(unsigned clientSessionId, unsigned& estBitrate); + virtual RTPSink* createNewRTPSink(Groupsock* rtpGroupsock, unsigned char rtpPayloadTypeIfDynamic, FramedSource* inputSource); + + protected: + JpegStreamReplicator *fReplicator{nullptr}; +}; + +#endif // _MJPEG_MEDIASUBSESSION_H \ No newline at end of file diff --git a/src/big/mpp/middleware/src/rtsp_server/mjpegStreamReplicator.cpp b/src/big/mpp/middleware/src/rtsp_server/mjpegStreamReplicator.cpp new file mode 100644 index 000000000..97cd9d0bc --- /dev/null +++ b/src/big/mpp/middleware/src/rtsp_server/mjpegStreamReplicator.cpp @@ -0,0 +1,340 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// An class that can be used to create (possibly multiple) 'replicas' of an incoming stream. +// Implementation. + +#include "mjpegStreamReplicator.h" + +////////// Definition of "StreamReplica": The class that implements each stream replica ////////// + +class JpegStreamReplica: public MjpegLiveVideoSource { +protected: + friend class JpegStreamReplicator; + JpegStreamReplica(JpegStreamReplicator& ourReplicator); // called only by "StreamReplicator::createStreamReplica()" + virtual ~JpegStreamReplica(); + +private: // redefined virtual functions: + virtual void doGetNextFrame(); + virtual void doStopGettingFrames(); + +private: + static void copyReceivedFrame(JpegStreamReplica* toReplica, JpegStreamReplica* fromReplica); + +private: + JpegStreamReplicator& fOurReplicator; + int fFrameIndex; // 0 or 1, depending upon which frame we're currently requesting; could also be -1 if we've stopped playing + + // Replicas that are currently awaiting data are kept in a (singly-linked) list: + JpegStreamReplica* fNext; +}; + + +////////// StreamReplicator implementation ////////// + +JpegStreamReplicator* JpegStreamReplicator::createNew(UsageEnvironment& env, MjpegLiveVideoSource* inputSource, Boolean deleteWhenLastReplicaDies) { + return new JpegStreamReplicator(env, inputSource, deleteWhenLastReplicaDies); +} + +JpegStreamReplicator::JpegStreamReplicator(UsageEnvironment& env, MjpegLiveVideoSource* inputSource, Boolean deleteWhenLastReplicaDies) + : Medium(env), + fInputSource(inputSource), fDeleteWhenLastReplicaDies(deleteWhenLastReplicaDies), fInputSourceHasClosed(False), + fNumReplicas(0), fNumActiveReplicas(0), fNumDeliveriesMadeSoFar(0), + fFrameIndex(0), fPrimaryReplica(NULL), fReplicasAwaitingCurrentFrame(NULL), fReplicasAwaitingNextFrame(NULL) { +} + +JpegStreamReplicator::~JpegStreamReplicator() { + Medium::close(fInputSource); +} + +MjpegLiveVideoSource* JpegStreamReplicator::createStreamReplica() { + // std::cout << "JpegStreamReplicator::createStreamReplica called" << std::endl; + ++fNumReplicas; + return new JpegStreamReplica(*this); +} + +void JpegStreamReplicator::getNextFrame(JpegStreamReplica* replica) { + // std::cout << "JpegStreamReplicator::getNextFrame() called" << std::endl; + if (fInputSourceHasClosed) { // handle closure instead + replica->handleClosure(); + return; + } + + if (replica->fFrameIndex == -1) { + // This replica had stopped playing (or had just been created), but is now actively reading. Note this: + replica->fFrameIndex = fFrameIndex; + ++fNumActiveReplicas; + } + + if (fPrimaryReplica == NULL) { + // This is the first replica to request the next unread frame. Make it the 'primary' replica - meaning that we read the frame + // into its buffer, and then copy from this into the other replicas' buffers. + fPrimaryReplica = replica; + + // Arrange to read the next frame into this replica's buffer: + if (fInputSource != NULL) fInputSource->getNextFrame(fPrimaryReplica->fTo, fPrimaryReplica->fMaxSize, + afterGettingFrame, this, onSourceClosure, this); + } else if (replica->fFrameIndex != fFrameIndex) { + // This replica is already asking for the next frame (because it has already received the current frame). Enqueue it: + replica->fNext = fReplicasAwaitingNextFrame; + fReplicasAwaitingNextFrame = replica; + } else { + // This replica is asking for the current frame. Enqueue it: + replica->fNext = fReplicasAwaitingCurrentFrame; + fReplicasAwaitingCurrentFrame = replica; + + if (fInputSource != NULL && !fInputSource->isCurrentlyAwaitingData()) { + // The current frame has already arrived, so deliver it to this replica now: + deliverReceivedFrame(); + } + } +} + +void JpegStreamReplicator::deactivateStreamReplica(JpegStreamReplica* replicaBeingDeactivated) { + if (replicaBeingDeactivated->fFrameIndex == -1) return; // this replica has already been deactivated (or was never activated at all) + + // Assert: fNumActiveReplicas > 0 + if (fNumActiveReplicas == 0) fprintf(stderr, "StreamReplicator::deactivateStreamReplica() Internal Error!\n"); // should not happen + --fNumActiveReplicas; + + // Forget about any frame delivery that might have just been made to this replica: + if (replicaBeingDeactivated->fFrameIndex != fFrameIndex && fNumDeliveriesMadeSoFar > 0) --fNumDeliveriesMadeSoFar; + + replicaBeingDeactivated->fFrameIndex = -1; + + // Check whether the replica being deactivated is the 'primary' replica, or is enqueued awaiting a frame: + if (replicaBeingDeactivated == fPrimaryReplica) { + // We need to replace the 'primary replica', if we can: + if (fReplicasAwaitingCurrentFrame == NULL) { + // There's currently no replacement 'primary replica' + fPrimaryReplica = NULL; + } else { + // There's another replica that we can use as a replacement 'primary replica': + fPrimaryReplica = fReplicasAwaitingCurrentFrame; + fReplicasAwaitingCurrentFrame = fReplicasAwaitingCurrentFrame->fNext; + fPrimaryReplica->fNext = NULL; + } + + // Check whether the read into the old primary replica's buffer is still pending, or has completed: + if (fInputSource != NULL) { + if (fInputSource->isCurrentlyAwaitingData()) { + // We have a pending read into the old primary replica's buffer. + // We need to stop it, and retry the read with a new primary (if available) + fInputSource->stopGettingFrames(); + + if (fPrimaryReplica != NULL) { + fInputSource->getNextFrame(fPrimaryReplica->fTo, fPrimaryReplica->fMaxSize, + afterGettingFrame, this, onSourceClosure, this); + } + } else { + // The read into the old primary replica's buffer has already completed. Copy the data to the new primary replica (if any): + if (fPrimaryReplica != NULL) { + JpegStreamReplica::copyReceivedFrame(fPrimaryReplica, replicaBeingDeactivated); + } else { + // We don't have a new primary replica, so we can't copy the received frame to any new replica that might ask for it. + // Fortunately this should be a very rare occurrence. + } + } + } + } else { + // The replica that's being removed was not our 'primary replica', but make sure it's not on either of our queues: + if (fReplicasAwaitingCurrentFrame != NULL) { + if (replicaBeingDeactivated == fReplicasAwaitingCurrentFrame) { + fReplicasAwaitingCurrentFrame = replicaBeingDeactivated->fNext; + replicaBeingDeactivated->fNext = NULL; + } + else { + for (JpegStreamReplica* r1 = fReplicasAwaitingCurrentFrame; r1->fNext != NULL; r1 = r1->fNext) { + if (r1->fNext == replicaBeingDeactivated) { + r1->fNext = replicaBeingDeactivated->fNext; + replicaBeingDeactivated->fNext = NULL; + break; + } + } + } + } + if (fReplicasAwaitingNextFrame != NULL) { + if (replicaBeingDeactivated == fReplicasAwaitingNextFrame) { + fReplicasAwaitingNextFrame = replicaBeingDeactivated->fNext; + replicaBeingDeactivated->fNext = NULL; + } + else { + for (JpegStreamReplica* r2 = fReplicasAwaitingNextFrame; r2->fNext != NULL; r2 = r2->fNext) { + if (r2->fNext == replicaBeingDeactivated) { + r2->fNext = replicaBeingDeactivated->fNext; + replicaBeingDeactivated->fNext = NULL; + break; + } + } + } + } + + // Check for the possibility that - now that a replica has been deactivated - all other + // replicas have received the current frame, and so now we need to complete delivery to + // the primary replica: + if (fPrimaryReplica != NULL && fInputSource != NULL && !fInputSource->isCurrentlyAwaitingData()) deliverReceivedFrame(); + } + + if (fNumActiveReplicas == 0 && fInputSource != NULL) fInputSource->stopGettingFrames(); // tell our source to stop too +} + +void JpegStreamReplicator::removeStreamReplica(JpegStreamReplica* replicaBeingRemoved) { + // First, handle the replica that's being removed the same way that we would if it were merely being deactivated: + deactivateStreamReplica(replicaBeingRemoved); + + // Assert: fNumReplicas > 0 + if (fNumReplicas == 0) fprintf(stderr, "StreamReplicator::removeStreamReplica() Internal Error!\n"); // should not happen + --fNumReplicas; + + // If this was the last replica, then delete ourselves (if we were set up to do so): + if (fNumReplicas == 0 && fDeleteWhenLastReplicaDies) { + Medium::close(this); + return; + } +} + +void JpegStreamReplicator::afterGettingFrame(void* clientData, unsigned frameSize, unsigned numTruncatedBytes, + struct timeval presentationTime, unsigned durationInMicroseconds) { + ((JpegStreamReplicator*)clientData)->afterGettingFrame(frameSize, numTruncatedBytes, presentationTime, durationInMicroseconds); +} + +void JpegStreamReplicator::afterGettingFrame(unsigned frameSize, unsigned numTruncatedBytes, + struct timeval presentationTime, unsigned durationInMicroseconds) { + // The frame was read into our primary replica's buffer. Update the primary replica's state, but don't complete delivery to it + // just yet. We do that later, after we're sure that we've delivered it to all other replicas. + fPrimaryReplica->fFrameSize = frameSize; + fPrimaryReplica->fNumTruncatedBytes = numTruncatedBytes; + fPrimaryReplica->fPresentationTime = presentationTime; + fPrimaryReplica->fDurationInMicroseconds = durationInMicroseconds; + + deliverReceivedFrame(); +} + +void JpegStreamReplicator::onSourceClosure(void* clientData) { + ((JpegStreamReplicator*)clientData)->onSourceClosure(); +} + +void JpegStreamReplicator::onSourceClosure() { + fInputSourceHasClosed = True; + + // Signal the closure to each replica that is currently awaiting a frame: + JpegStreamReplica* replica; + while ((replica = fReplicasAwaitingCurrentFrame) != NULL) { + fReplicasAwaitingCurrentFrame = replica->fNext; + replica->fNext = NULL; + replica->handleClosure(); + } + while ((replica = fReplicasAwaitingNextFrame) != NULL) { + fReplicasAwaitingNextFrame = replica->fNext; + replica->fNext = NULL; + replica->handleClosure(); + } + if ((replica = fPrimaryReplica) != NULL) { + fPrimaryReplica = NULL; + replica->handleClosure(); + } +} + +void JpegStreamReplicator::deliverReceivedFrame() { + // The 'primary replica' has received its copy of the current frame. + // Copy it (and complete delivery) to any other replica that has requested this frame. + // Then, if no more requests for this frame are expected, complete delivery to the 'primary replica' itself. + JpegStreamReplica* replica; + while ((replica = fReplicasAwaitingCurrentFrame) != NULL) { + fReplicasAwaitingCurrentFrame = replica->fNext; + replica->fNext = NULL; + + // Assert: fPrimaryReplica != NULL + if (fPrimaryReplica == NULL) fprintf(stderr, "JpegStreamReplicator::deliverReceivedFrame() Internal Error 1!\n"); // shouldn't happen + JpegStreamReplica::copyReceivedFrame(replica, fPrimaryReplica); + replica->fFrameIndex = 1 - replica->fFrameIndex; // toggle it (0<->1), because this replica no longer awaits the current frame + ++fNumDeliveriesMadeSoFar; + + // Assert: fNumDeliveriesMadeSoFar < fNumActiveReplicas; // because we still have the 'primary replica' to deliver to + if (!(fNumDeliveriesMadeSoFar < fNumActiveReplicas)) fprintf(stderr, "JpegStreamReplicator::deliverReceivedFrame() Internal Error 2(%d,%d)!\n", fNumDeliveriesMadeSoFar, fNumActiveReplicas); // should not happen + + // Complete delivery to this replica: + FramedSource::afterGetting(replica); + } + + if (fNumDeliveriesMadeSoFar == fNumActiveReplicas - 1 && fPrimaryReplica != NULL) { + // No more requests for this frame are expected, so complete delivery to the 'primary replica': + replica = fPrimaryReplica; + fPrimaryReplica = NULL; + replica->fFrameIndex = 1 - replica->fFrameIndex; // toggle it (0<->1), because this replica no longer awaits the current frame + fFrameIndex = 1 - fFrameIndex; // toggle it (0<->1) for the next frame + fNumDeliveriesMadeSoFar = 0; // reset for the next frame + + if (fReplicasAwaitingNextFrame != NULL) { + // One of the other replicas has already requested the next frame, so make it the next 'primary replica': + fPrimaryReplica = fReplicasAwaitingNextFrame; + fReplicasAwaitingNextFrame = fReplicasAwaitingNextFrame->fNext; + fPrimaryReplica->fNext = NULL; + + // Arrange to read the next frame into this replica's buffer: + if (fInputSource != NULL) fInputSource->getNextFrame(fPrimaryReplica->fTo, fPrimaryReplica->fMaxSize, + afterGettingFrame, this, onSourceClosure, this); + } + + // Move any other replicas that had already requested the next frame to the 'requesting current frame' list: + // Assert: fReplicasAwaitingCurrentFrame == NULL; + if (!(fReplicasAwaitingCurrentFrame == NULL)) fprintf(stderr, "StreamReplicator::deliverReceivedFrame() Internal Error 3!\n"); // should not happen + fReplicasAwaitingCurrentFrame = fReplicasAwaitingNextFrame; + fReplicasAwaitingNextFrame = NULL; + + // Complete delivery to the 'primary' replica (thereby completing all deliveries for this frame): + FramedSource::afterGetting(replica); + } +} + + +////////// StreamReplica implementation ////////// + +JpegStreamReplica::JpegStreamReplica(JpegStreamReplicator& ourReplicator) + : MjpegLiveVideoSource(ourReplicator.envir()), + fOurReplicator(ourReplicator), + fFrameIndex(-1/*we haven't started playing yet*/), fNext(NULL) { + // std::cout << "JpegStreamReplicator::createStreamReplica called" << std::endl; +} + +JpegStreamReplica::~JpegStreamReplica() { + fOurReplicator.removeStreamReplica(this); +} + +void JpegStreamReplica::doGetNextFrame() { + // std::cout << "JpegStreamReplica::doGetNextFrame() called" << std::endl; + fOurReplicator.getNextFrame(this); + + // update special parameters for jpeg + this->fParser = fOurReplicator.inputSource()->Parser(); +} + +void JpegStreamReplica::doStopGettingFrames() { + fOurReplicator.deactivateStreamReplica(this); +} + +void JpegStreamReplica::copyReceivedFrame(JpegStreamReplica* toReplica, JpegStreamReplica* fromReplica) { + // First, figure out how much data to copy. ("toReplica" might have a smaller buffer than "fromReplica".) + unsigned numNewBytesToTruncate + = toReplica->fMaxSize < fromReplica->fFrameSize ? fromReplica->fFrameSize - toReplica->fMaxSize : 0; + toReplica->fFrameSize = fromReplica->fFrameSize - numNewBytesToTruncate; + toReplica->fNumTruncatedBytes = fromReplica->fNumTruncatedBytes + numNewBytesToTruncate; + + memmove(toReplica->fTo, fromReplica->fTo, toReplica->fFrameSize); + toReplica->fPresentationTime = fromReplica->fPresentationTime; + toReplica->fDurationInMicroseconds = fromReplica->fDurationInMicroseconds; +} diff --git a/src/big/mpp/middleware/src/rtsp_server/mjpegStreamReplicator.h b/src/big/mpp/middleware/src/rtsp_server/mjpegStreamReplicator.h new file mode 100644 index 000000000..8e1740691 --- /dev/null +++ b/src/big/mpp/middleware/src/rtsp_server/mjpegStreamReplicator.h @@ -0,0 +1,82 @@ +/********** +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. (See .) + +This library is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for +more details. + +You should have received a copy of the GNU Lesser General Public License +along with this library; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +**********/ +// "liveMedia" +// Copyright (c) 1996-2023 Live Networks, Inc. All rights reserved. +// An class that can be used to create (possibly multiple) 'replicas' of an incoming stream. +// C++ header + +#ifndef _MJPEG_STREAM_REPLICATOR_H +#define _MJPEG_STREAM_REPLICATOR_H + +#include "mjpegLiveFrameSource.h" + +class JpegStreamReplica; // forward + +class JpegStreamReplicator: public Medium { +public: + static JpegStreamReplicator* createNew(UsageEnvironment& env, MjpegLiveVideoSource *inputSource, Boolean deleteWhenLastReplicaDies = True); + // If "deleteWhenLastReplicaDies" is True (the default), then the "JpegStreamReplicator" object is deleted when (and only when) + // all replicas have been deleted. (In this case, you must *not* call "Medium::close()" on the "JpegStreamReplicator" object, + // unless you never created any replicas from it to begin with.) + // If "deleteWhenLastReplicaDies" is False, then the "JpegStreamReplicator" object remains in existence, even when all replicas + // have been deleted. (This allows you to create new replicas later, if you wish.) In this case, you delete the + // "JpegStreamReplicator" object by calling "Medium::close()" on it - but you must do so only when "numReplicas()" returns 0. + + MjpegLiveVideoSource* createStreamReplica(); + + unsigned numReplicas() const { return fNumReplicas; } + + MjpegLiveVideoSource* inputSource() const { return fInputSource; } + + // Call before destruction if you want to prevent the destructor from closing the input source + void detachInputSource() { fInputSource = NULL; } + +protected: + JpegStreamReplicator(UsageEnvironment& env, MjpegLiveVideoSource *inputSource, Boolean deleteWhenLastReplicaDies); + // called only by "createNew()" + virtual ~JpegStreamReplicator(); + +private: + // Routines called by replicas to implement frame delivery, and the stopping/restarting/deletion of replicas: + friend class JpegStreamReplica; + void getNextFrame(JpegStreamReplica* replica); + void deactivateStreamReplica(JpegStreamReplica* replica); + void removeStreamReplica(JpegStreamReplica* replica); + +private: + static void afterGettingFrame(void* clientData, unsigned frameSize, + unsigned numTruncatedBytes, + struct timeval presentationTime, + unsigned durationInMicroseconds); + void afterGettingFrame(unsigned frameSize, unsigned numTruncatedBytes, + struct timeval presentationTime, unsigned durationInMicroseconds); + + static void onSourceClosure(void* clientData); + void onSourceClosure(); + + void deliverReceivedFrame(); + +private: + MjpegLiveVideoSource* fInputSource{nullptr}; + Boolean fDeleteWhenLastReplicaDies, fInputSourceHasClosed; + unsigned fNumReplicas, fNumActiveReplicas, fNumDeliveriesMadeSoFar; + int fFrameIndex; // 0 or 1; used to figure out if a replica is requesting the current frame, or the next frame + + JpegStreamReplica* fPrimaryReplica; // the first replica that requests each frame. We use its buffer when copying to the others. + JpegStreamReplica* fReplicasAwaitingCurrentFrame; // other than the 'primary' replica + JpegStreamReplica* fReplicasAwaitingNextFrame; // replicas that have already received the current frame, and have asked for the next +}; +#endif diff --git a/src/big/mpp/middleware/src/rtsp_server/rtsp_server.cpp b/src/big/mpp/middleware/src/rtsp_server/rtsp_server.cpp new file mode 100644 index 000000000..476df5066 --- /dev/null +++ b/src/big/mpp/middleware/src/rtsp_server/rtsp_server.cpp @@ -0,0 +1,317 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include "rtsp_server.h" +#include "liveMedia.hh" +#include "BasicUsageEnvironment.hh" +#include "GroupsockHelper.hh" +#include "LiveServerMediaSession.h" +#include "h264LiveFrameSource.h" +#include "h265LiveFrameSource.h" +#include "g711LiveFrameSource.h" +#include "mjpegLiveFrameSource.h" +#include "mjpegMediaSubSession.h" +#include "mjpegStreamReplicator.h" +#include "g711BackChannelServerMediaSubsession.h" + +class OnBackChannel: public IOnData { + public: + explicit OnBackChannel(const std::string &name, IOnBackChannel *back_channel): name_(name), back_channel_(back_channel) {} + virtual void OnData(const unsigned char *data, unsigned dataSize, struct timeval presentationTime); + private: + std::string name_; + IOnBackChannel *back_channel_{nullptr}; +}; + +struct SessionInfo { + // video, FIXME + LiveFrameSource *h26x_source = nullptr; + StreamReplicator *h26x_replicator = nullptr; + MjpegLiveVideoSource *jpeg_source = nullptr; + JpegStreamReplicator *jpeg_replicator = nullptr; + // audio + LiveFrameSource *g711_source = nullptr; + StreamReplicator *g711_replicator = nullptr; + // backchannel + std::shared_ptr back_channel = nullptr; +}; + +static std::mutex session_info_map_mutex_; +static std::map session_info_map_; + +void OnBackChannel::OnData(unsigned char const* data, unsigned size, struct timeval presentationTime) { + if (back_channel_) { + uint64_t ms = presentationTime.tv_sec * 1000 + presentationTime.tv_usec/1000; + // std::cout << "OnBackChannel::OnData : size = " << size << ", timestamp = " << ms << std::endl; + back_channel_->OnBackChannelData(name_, data, size, ms); + } +} + +class KdRtspServer::Impl { + public: + Impl() {} + ~Impl() { DeInit(); } + + int Init(Port port = 8554, IOnBackChannel *back_channel = nullptr); + void DeInit(); + + int CreateSession(const std::string &session_name, const SessionAttr &session_attr); + int DestroySession(const std::string &session_name); + void Start(); + void Stop(); + + int SendVideoData(const std::string &session_name, const uint8_t *data, size_t size, uint64_t timestamp); + int SendAudioData(const std::string &session_name, const uint8_t *data, size_t size, uint64_t timestamp); + + private: + Impl(const Impl &) = delete; + Impl& operator=(const Impl &) = delete; + + private: + void announceStream(ServerMediaSession* sms, char const* streamName); + + private: + TaskScheduler *scheduler_{nullptr}; + UsageEnvironment* env_{nullptr}; + RTSPServer *rtspServer_{nullptr}; + volatile char watchVariable_{0}; + std::thread server_loop_; + IOnBackChannel *back_channel_{nullptr}; +}; + +int KdRtspServer::Impl::Init(Port port, IOnBackChannel *back_channel) { + scheduler_ = BasicTaskScheduler::createNew(); + env_ = BasicUsageEnvironment::createNew(*scheduler_); + UserAuthenticationDatabase* authDB = nullptr; + unsigned reclamationSeconds = 10; + rtspServer_ = RTSPServer::createNew(*env_, port, authDB, reclamationSeconds); + if (!rtspServer_) { + *env_ << "create rtsp server failed." << env_->getResultMsg() << "\n"; + return -1; + } + back_channel_ = back_channel; + return 0; +} + +void KdRtspServer::Impl::DeInit() { + if (rtspServer_) { + Medium::close(rtspServer_); + env_->reclaim(); + delete scheduler_; + env_ = nullptr; + scheduler_ = nullptr; + rtspServer_ = nullptr; + } +} + +int KdRtspServer::Impl::CreateSession(const std::string &session_name, const SessionAttr &session_attr) { + std::unique_lock lck(session_info_map_mutex_); + if (session_info_map_.count(session_name)) { + *env_ << "stream session has already been created\n"; + return 0; + } + lck.unlock(); + if (!session_attr.with_video && !session_attr.with_audio && !session_attr.with_audio_backchannel) { + *env_ << "no subSessions\n"; + return -1; + } + + char const* descriptionString = "Session streamed by \"KdRTSPServer\""; + ServerMediaSession *sms = nullptr; + + // create live-sources and replicators + SessionInfo info; + if(session_attr.with_video) { + if (session_attr.video_type == VideoType::kVideoTypeH264) { + info.h26x_source = H264LiveFrameSource::createNew(*env_, 8); + info.h26x_replicator = StreamReplicator::createNew(*env_, info.h26x_source, false); + if (!info.h26x_replicator) goto err_exit; + } else if (session_attr.video_type == VideoType::kVideoTypeH265) { + info.h26x_source = H265LiveFrameSource::createNew(*env_, 8); + info.h26x_replicator = StreamReplicator::createNew(*env_, info.h26x_source, false); + if (!info.h26x_replicator) goto err_exit; + } else if (session_attr.video_type == VideoType::kVideoTypeMjpeg) { + info.jpeg_source = MjpegLiveVideoSource::createNew(*env_, 8); + info.jpeg_replicator = JpegStreamReplicator::createNew(*env_, info.jpeg_source, false); + if (!info.jpeg_replicator) goto err_exit; + } else { + *env_ << "video type not supported yet\n"; + goto err_exit; + } + std::cout << "with_video" << std::endl; + } + + if (session_attr.with_audio) { + std::cout << "with_audio" << std::endl; + info.g711_source = G711LiveFrameSource::createNew(*env_, 8); + info.g711_replicator = StreamReplicator::createNew(*env_, info.g711_source, false); + } + + if (session_attr.with_audio_backchannel) { + std::cout << "with_audio_backchannel" << std::endl; + info.back_channel = std::make_shared(session_name, back_channel_); + } + + // create SMS and subsessions + sms = ServerMediaSession::createNew(*env_, session_name.c_str(), session_name.c_str(), descriptionString); + if (info.h26x_replicator) { + LiveServerMediaSession *h26xliveSubSession = LiveServerMediaSession::createNew(*env_, info.h26x_replicator); + sms->addSubsession(h26xliveSubSession); + } + + if (info.jpeg_replicator) { + MjpegMediaSubsession *jpegliveSubSession = MjpegMediaSubsession::createNew(*env_, info.jpeg_replicator); + sms->addSubsession(jpegliveSubSession); + } + + if (info.g711_replicator) { + LiveServerMediaSession *g711liveSubSession = LiveServerMediaSession::createNew(*env_, info.g711_replicator); + std::cout << "g711liveSubSession" << std::endl; + sms->addSubsession(g711liveSubSession); + } + + if (info.back_channel) { + G711BackChannelServerMediaSubsession *backChannel = G711BackChannelServerMediaSubsession::createNew(*env_, info.back_channel.get()); + std::cout << "G711BackChannelServerMediaSubsession" << std::endl; + sms->addSubsession(backChannel); + } + + rtspServer_->addServerMediaSession(sms); + announceStream(sms, session_name.c_str()); + + lck.lock(); + session_info_map_[session_name] = info; + return 0; + +err_exit: + if (info.h26x_replicator) Medium::close(info.h26x_replicator); + if (info.jpeg_replicator) Medium::close(info.jpeg_replicator); + if (info.g711_replicator) Medium::close(info.g711_replicator); + if (info.back_channel) info.back_channel.reset(); + return -1; +} + + +int KdRtspServer::Impl::DestroySession(const std::string &session_name) { + std::unique_lock lck(session_info_map_mutex_); + auto iter = session_info_map_.find(session_name); + if (iter != session_info_map_.end()) { + if (iter->second.h26x_replicator) Medium::close(iter->second.h26x_replicator); + if (iter->second.jpeg_replicator) Medium::close(iter->second.jpeg_replicator); + if (iter->second.g711_replicator) Medium::close(iter->second.g711_replicator); + if (iter->second.back_channel) iter->second.back_channel.reset(); + } + session_info_map_.erase(iter); + return 0; +} + +void KdRtspServer::Impl::Start() { + if (rtspServer_->setUpTunnelingOverHTTP(80) || rtspServer_->setUpTunnelingOverHTTP(8000) || rtspServer_->setUpTunnelingOverHTTP(8080)) { + *env_ << "\n(We use port " << rtspServer_->httpServerPortNum() << " for optional RTSP-over-HTTP tunneling.)\n"; + } else { + *env_ << "\n(RTSP-over-HTTP tunneling is not available.)\n"; + } + + watchVariable_ = 0; + server_loop_ = std::thread([this]() { + env_->taskScheduler().doEventLoop(&watchVariable_); + }); +} + +void KdRtspServer::Impl::Stop() { + std::unique_lock lck(session_info_map_mutex_); + for(auto &it: session_info_map_) { + if (it.second.h26x_replicator) Medium::close(it.second.h26x_replicator); + if (it.second.jpeg_replicator) Medium::close(it.second.jpeg_replicator); + if (it.second.g711_replicator) Medium::close(it.second.g711_replicator); + if (it.second.back_channel) it.second.back_channel.reset(); + } + session_info_map_.clear(); + lck.unlock(); + + if(server_loop_.joinable()) { + watchVariable_ = 1; + server_loop_.join(); + } +} + + +void KdRtspServer::Impl::announceStream(ServerMediaSession* sms, char const* streamName) { + char* url = rtspServer_->rtspURL(sms); + UsageEnvironment& env = rtspServer_->envir(); + env << "\n\"" << streamName << "\" stream " << "\n"; + env << "Play this stream using the URL \"" << url << "\"\n"; + delete[] url; +} + +int KdRtspServer::Impl::SendVideoData(const std::string &session_name, const uint8_t *data, size_t size, uint64_t timestamp) { + std::unique_lock lck(session_info_map_mutex_); + if (session_info_map_.count(session_name)) { + auto &info = session_info_map_[session_name]; + if (info.h26x_source) { + // TODO, send when there is at least one client + info.h26x_source->pushData(data, size, timestamp); + } + if (info.jpeg_source) { + // TODO, send when there is at least one client + info.jpeg_source->pushData(data, size, timestamp); + } + return 0; + } + return -1; +} + +int KdRtspServer::Impl::SendAudioData(const std::string &session_name, const uint8_t *data, size_t size, uint64_t timestamp) { + std::unique_lock lck(session_info_map_mutex_); + if (session_info_map_.count(session_name)) { + auto &info = session_info_map_[session_name]; + if (info.g711_source) { + // TODO, send when there is at least one client + info.g711_source->pushData(data, size, timestamp); + } + return 0; + } + return -1; +} + + +KdRtspServer::KdRtspServer() : impl_(std::make_unique()) {} +KdRtspServer::~KdRtspServer() {} + +int KdRtspServer::Init(int port, IOnBackChannel *back_channel) { + return impl_->Init((Port)port, back_channel); +} + +void KdRtspServer::DeInit() { + impl_->DeInit(); +} + +int KdRtspServer::CreateSession(const std::string &session_name, const SessionAttr &session_attr) { + return impl_->CreateSession(session_name, session_attr); +} + +int KdRtspServer::DestroySession(const std::string &session_name) { + return impl_->DestroySession(session_name); +} + +void KdRtspServer::Start() { + impl_->Start(); +} + +void KdRtspServer::Stop() { + impl_->Stop(); +} + +int KdRtspServer::SendVideoData(const std::string &session_name, const uint8_t *data, size_t size, uint64_t timestamp) { + return impl_->SendVideoData(session_name, data, size, timestamp); +} + +int KdRtspServer::SendAudioData(const std::string &session_name, const uint8_t *data, size_t size, uint64_t timestamp) { + return impl_->SendAudioData(session_name, data, size, timestamp); +} diff --git a/src/big/mpp/userapps/lib/lib3a.a b/src/big/mpp/userapps/lib/lib3a.a index 9aabdd778..cb7807efe 100644 Binary files a/src/big/mpp/userapps/lib/lib3a.a and b/src/big/mpp/userapps/lib/lib3a.a differ diff --git a/src/big/mpp/userapps/lib/libadec.a b/src/big/mpp/userapps/lib/libadec.a index 4f624d5ea..be68fced1 100644 Binary files a/src/big/mpp/userapps/lib/libadec.a and b/src/big/mpp/userapps/lib/libadec.a differ diff --git a/src/big/mpp/userapps/lib/libaenc.a b/src/big/mpp/userapps/lib/libaenc.a index 3533467dd..bcad9cb53 100644 Binary files a/src/big/mpp/userapps/lib/libaenc.a and b/src/big/mpp/userapps/lib/libaenc.a differ diff --git a/src/big/mpp/userapps/lib/libai.a b/src/big/mpp/userapps/lib/libai.a index 776acd0b7..9134eeb88 100644 Binary files a/src/big/mpp/userapps/lib/libai.a and b/src/big/mpp/userapps/lib/libai.a differ diff --git a/src/big/mpp/userapps/lib/libao.a b/src/big/mpp/userapps/lib/libao.a index 935a09cca..73f197d25 100644 Binary files a/src/big/mpp/userapps/lib/libao.a and b/src/big/mpp/userapps/lib/libao.a differ diff --git a/src/big/mpp/userapps/lib/libauto_ctrol.a b/src/big/mpp/userapps/lib/libauto_ctrol.a index 1222645bf..f5a3838ea 100644 Binary files a/src/big/mpp/userapps/lib/libauto_ctrol.a and b/src/big/mpp/userapps/lib/libauto_ctrol.a differ diff --git a/src/big/mpp/userapps/lib/libbinder.a b/src/big/mpp/userapps/lib/libbinder.a index 40eec4620..73dfafc6d 100644 Binary files a/src/big/mpp/userapps/lib/libbinder.a and b/src/big/mpp/userapps/lib/libbinder.a differ diff --git a/src/big/mpp/userapps/lib/libbuffer_management.a b/src/big/mpp/userapps/lib/libbuffer_management.a index a8e38872d..3dd8637c3 100644 Binary files a/src/big/mpp/userapps/lib/libbuffer_management.a and b/src/big/mpp/userapps/lib/libbuffer_management.a differ diff --git a/src/big/mpp/userapps/lib/libcam_caldb.a b/src/big/mpp/userapps/lib/libcam_caldb.a index b195da78c..aec427e02 100644 Binary files a/src/big/mpp/userapps/lib/libcam_caldb.a and b/src/big/mpp/userapps/lib/libcam_caldb.a differ diff --git a/src/big/mpp/userapps/lib/libcam_device.a b/src/big/mpp/userapps/lib/libcam_device.a index 181aff1ba..d5ac435d5 100644 Binary files a/src/big/mpp/userapps/lib/libcam_device.a and b/src/big/mpp/userapps/lib/libcam_device.a differ diff --git a/src/big/mpp/userapps/lib/libcam_engine.a b/src/big/mpp/userapps/lib/libcam_engine.a index b660ae6ba..9d0bbefc3 100644 Binary files a/src/big/mpp/userapps/lib/libcam_engine.a and b/src/big/mpp/userapps/lib/libcam_engine.a differ diff --git a/src/big/mpp/userapps/lib/libcameric_drv.a b/src/big/mpp/userapps/lib/libcameric_drv.a index f786ee2c9..2f01989e8 100644 Binary files a/src/big/mpp/userapps/lib/libcameric_drv.a and b/src/big/mpp/userapps/lib/libcameric_drv.a differ diff --git a/src/big/mpp/userapps/lib/libcameric_reg_drv.a b/src/big/mpp/userapps/lib/libcameric_reg_drv.a index 0877e1fa8..a23bbd130 100644 Binary files a/src/big/mpp/userapps/lib/libcameric_reg_drv.a and b/src/big/mpp/userapps/lib/libcameric_reg_drv.a differ diff --git a/src/big/mpp/userapps/lib/libcmd_buffer.a b/src/big/mpp/userapps/lib/libcmd_buffer.a index 045e965dc..e2564b7b9 100644 Binary files a/src/big/mpp/userapps/lib/libcmd_buffer.a and b/src/big/mpp/userapps/lib/libcmd_buffer.a differ diff --git a/src/big/mpp/userapps/lib/libcommon.a b/src/big/mpp/userapps/lib/libcommon.a index 5a5a3d155..b28379e0e 100644 Binary files a/src/big/mpp/userapps/lib/libcommon.a and b/src/big/mpp/userapps/lib/libcommon.a differ diff --git a/src/big/mpp/userapps/lib/libdma.a b/src/big/mpp/userapps/lib/libdma.a index ebe6ab46c..40deb60d1 100644 Binary files a/src/big/mpp/userapps/lib/libdma.a and b/src/big/mpp/userapps/lib/libdma.a differ diff --git a/src/big/mpp/userapps/lib/libdpu.a b/src/big/mpp/userapps/lib/libdpu.a index f113fd8b2..fcb688006 100644 Binary files a/src/big/mpp/userapps/lib/libdpu.a and b/src/big/mpp/userapps/lib/libdpu.a differ diff --git a/src/big/mpp/userapps/lib/libebase.a b/src/big/mpp/userapps/lib/libebase.a index 46cab8cb8..f835942e9 100644 Binary files a/src/big/mpp/userapps/lib/libebase.a and b/src/big/mpp/userapps/lib/libebase.a differ diff --git a/src/big/mpp/userapps/lib/libfpga.a b/src/big/mpp/userapps/lib/libfpga.a index 194f62d2d..6cb994f35 100644 Binary files a/src/big/mpp/userapps/lib/libfpga.a and b/src/big/mpp/userapps/lib/libfpga.a differ diff --git a/src/big/mpp/userapps/lib/libhal.a b/src/big/mpp/userapps/lib/libhal.a index 24870af8a..e5c0a6048 100644 Binary files a/src/big/mpp/userapps/lib/libhal.a and b/src/big/mpp/userapps/lib/libhal.a differ diff --git a/src/big/mpp/userapps/lib/libisi.a b/src/big/mpp/userapps/lib/libisi.a index c7c59e4f4..ff42282a9 100644 Binary files a/src/big/mpp/userapps/lib/libisi.a and b/src/big/mpp/userapps/lib/libisi.a differ diff --git a/src/big/mpp/userapps/lib/libisp_drv.a b/src/big/mpp/userapps/lib/libisp_drv.a index 849425d3f..8db392df4 100644 Binary files a/src/big/mpp/userapps/lib/libisp_drv.a and b/src/big/mpp/userapps/lib/libisp_drv.a differ diff --git a/src/big/mpp/userapps/lib/liboslayer.a b/src/big/mpp/userapps/lib/liboslayer.a index 0cf7d1149..e428b447d 100644 Binary files a/src/big/mpp/userapps/lib/liboslayer.a and b/src/big/mpp/userapps/lib/liboslayer.a differ diff --git a/src/big/mpp/userapps/lib/libstart_engine.a b/src/big/mpp/userapps/lib/libstart_engine.a index a0aac331f..b5ce6d98d 100644 Binary files a/src/big/mpp/userapps/lib/libstart_engine.a and b/src/big/mpp/userapps/lib/libstart_engine.a differ diff --git a/src/big/mpp/userapps/lib/libswitch.a b/src/big/mpp/userapps/lib/libswitch.a index 44833b360..c15a454ca 100644 Binary files a/src/big/mpp/userapps/lib/libswitch.a and b/src/big/mpp/userapps/lib/libswitch.a differ diff --git a/src/big/mpp/userapps/lib/libsys.a b/src/big/mpp/userapps/lib/libsys.a index 68c6f3462..045924ef8 100644 Binary files a/src/big/mpp/userapps/lib/libsys.a and b/src/big/mpp/userapps/lib/libsys.a differ diff --git a/src/big/mpp/userapps/lib/libt_common_c.a b/src/big/mpp/userapps/lib/libt_common_c.a index e375fe4e2..a813efe93 100644 Binary files a/src/big/mpp/userapps/lib/libt_common_c.a and b/src/big/mpp/userapps/lib/libt_common_c.a differ diff --git a/src/big/mpp/userapps/lib/libt_database_c.a b/src/big/mpp/userapps/lib/libt_database_c.a index 4b9810aa8..60c08794e 100644 Binary files a/src/big/mpp/userapps/lib/libt_database_c.a and b/src/big/mpp/userapps/lib/libt_database_c.a differ diff --git a/src/big/mpp/userapps/lib/libt_json_c.a b/src/big/mpp/userapps/lib/libt_json_c.a index ca3a9ebac..a01f6517d 100644 Binary files a/src/big/mpp/userapps/lib/libt_json_c.a and b/src/big/mpp/userapps/lib/libt_json_c.a differ diff --git a/src/big/mpp/userapps/lib/libt_mxml_c.a b/src/big/mpp/userapps/lib/libt_mxml_c.a index 14979907f..c0fa5ab44 100644 Binary files a/src/big/mpp/userapps/lib/libt_mxml_c.a and b/src/big/mpp/userapps/lib/libt_mxml_c.a differ diff --git a/src/big/mpp/userapps/lib/libvb.a b/src/big/mpp/userapps/lib/libvb.a index bac16f37b..42d6cda68 100644 Binary files a/src/big/mpp/userapps/lib/libvb.a and b/src/big/mpp/userapps/lib/libvb.a differ diff --git a/src/big/mpp/userapps/lib/libvdec.a b/src/big/mpp/userapps/lib/libvdec.a index 62fe7d649..9b3167426 100644 Binary files a/src/big/mpp/userapps/lib/libvdec.a and b/src/big/mpp/userapps/lib/libvdec.a differ diff --git a/src/big/mpp/userapps/lib/libvdss.a b/src/big/mpp/userapps/lib/libvdss.a index 9869591d6..6d209fd4a 100644 Binary files a/src/big/mpp/userapps/lib/libvdss.a and b/src/big/mpp/userapps/lib/libvdss.a differ diff --git a/src/big/mpp/userapps/lib/libvenc.a b/src/big/mpp/userapps/lib/libvenc.a index cfda80000..85de71b9c 100644 Binary files a/src/big/mpp/userapps/lib/libvenc.a and b/src/big/mpp/userapps/lib/libvenc.a differ diff --git a/src/big/mpp/userapps/lib/libvicap.a b/src/big/mpp/userapps/lib/libvicap.a index c01676762..10d00910b 100644 Binary files a/src/big/mpp/userapps/lib/libvicap.a and b/src/big/mpp/userapps/lib/libvicap.a differ diff --git a/src/big/mpp/userapps/lib/libvideo_in.a b/src/big/mpp/userapps/lib/libvideo_in.a index 0327efea9..e1547fffc 100644 Binary files a/src/big/mpp/userapps/lib/libvideo_in.a and b/src/big/mpp/userapps/lib/libvideo_in.a differ diff --git a/src/big/mpp/userapps/lib/libvirtual_hal.a b/src/big/mpp/userapps/lib/libvirtual_hal.a index 33cea1395..a6288e35a 100644 Binary files a/src/big/mpp/userapps/lib/libvirtual_hal.a and b/src/big/mpp/userapps/lib/libvirtual_hal.a differ diff --git a/src/big/mpp/userapps/lib/libvo.a b/src/big/mpp/userapps/lib/libvo.a index c4c358747..1bf2ae7aa 100644 Binary files a/src/big/mpp/userapps/lib/libvo.a and b/src/big/mpp/userapps/lib/libvo.a differ diff --git a/src/big/mpp/userapps/lib/libvvi.a b/src/big/mpp/userapps/lib/libvvi.a index aee55c4d5..e5b83c222 100644 Binary files a/src/big/mpp/userapps/lib/libvvi.a and b/src/big/mpp/userapps/lib/libvvi.a differ diff --git a/src/big/mpp/userapps/sample/fastboot_app/main.cc b/src/big/mpp/userapps/sample/fastboot_app/main.cc index 4404be533..9200bcfe5 100644 --- a/src/big/mpp/userapps/sample/fastboot_app/main.cc +++ b/src/big/mpp/userapps/sample/fastboot_app/main.cc @@ -47,7 +47,7 @@ using namespace nncase::runtime::detail; #define CHANNEL 3 -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) #define ISP_CHN1_HEIGHT (720) #define ISP_CHN1_WIDTH (1280) #define ISP_CHN0_WIDTH (1920) @@ -58,6 +58,20 @@ using namespace nncase::runtime::detail; #define LCD_WIDTH (1080) #define LCD_HEIGHT (1920) + +#elif defined(CONFIG_BOARD_K230D_CANMV) +#define ISP_CHN1_HEIGHT (720) +#define ISP_CHN1_WIDTH (1280) + +#define ISP_CHN0_WIDTH (800) +#define ISP_CHN0_HEIGHT (480) + +#define ISP_INPUT_WIDTH (1920) +#define ISP_INPUT_HEIGHT (1080) + +#define LCD_WIDTH (1080) +#define LCD_HEIGHT (1920) + #else #define ISP_CHN1_HEIGHT (1280) #define ISP_CHN1_WIDTH (720) @@ -277,8 +291,10 @@ k_s32 sample_connector_init(void) { k_u32 ret = 0; k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#elif defined(CONFIG_BOARD_K230D_CANMV) + k_connector_type connector_type = ST7701_V1_MIPI_2LAN_480X800_30FPS; #else k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; #endif @@ -316,10 +332,17 @@ static k_s32 vo_layer_vdss_bind_vo_config(void) sample_connector_init(); +#if defined(CONFIG_BOARD_K230D_CANMV) + info.act_size.width = ISP_CHN0_HEIGHT;//1080;//640;//1080; + info.act_size.height = ISP_CHN0_WIDTH;//1920;//480;//1920; + info.format = PIXEL_FORMAT_YVU_PLANAR_420; + info.func = K_ROTATION_90; +#else info.act_size.width = ISP_CHN0_WIDTH;//1080;//640;//1080; info.act_size.height = ISP_CHN0_HEIGHT;//1920;//480;//1920; info.format = PIXEL_FORMAT_YVU_PLANAR_420; info.func = K_ROTATION_0;////K_ROTATION_90; +#endif info.global_alptha = 0xff; info.offset.x = 0;//(1080-w)/2, info.offset.y = 0;//(1920-h)/2; @@ -418,13 +441,17 @@ int sample_vb_init(void) } return ret; } -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) || defined(CONFIG_BOARD_K230D_CANMV) int sample_vivcap_init( void ) { k_s32 ret = 0; - // sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; +#if defined(CONFIG_BOARD_K230_CANMV) sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - // kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; +#elif defined(CONFIG_BOARD_K230D_CANMV) + sensor_type = OV_OV5647_MIPI_1920X1080_30FPS_10BIT_LINEAR; +#endif vicap_dev = VICAP_DEV_ID_0; memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); @@ -742,10 +769,18 @@ int main(int argc, char *argv[]) { // std::cout << "[" << boxes[i] << ", " << boxes[i + 1] << ", " << boxes[i + 2] <<", " << boxes[i + 3] << "]" << std::endl; vo_frame.draw_en = 1; +#if defined(CONFIG_BOARD_K230D_CANMV) + /* vo rotation 90 */ + vo_frame.line_x_start = 480 - (((uint32_t)boxes[i].y2) * ISP_CHN0_HEIGHT / ISP_CHN1_HEIGHT); + vo_frame.line_y_start = ((uint32_t)boxes[i].x1) * ISP_CHN0_WIDTH / ISP_CHN1_WIDTH; + vo_frame.line_x_end = 480 - (((uint32_t)boxes[i].y1) * ISP_CHN0_HEIGHT / ISP_CHN1_HEIGHT); + vo_frame.line_y_end = ((uint32_t)boxes[i].x2) * ISP_CHN0_WIDTH / ISP_CHN1_WIDTH; +#else vo_frame.line_x_start = ((uint32_t)boxes[i].x1) * ISP_CHN0_WIDTH / ISP_CHN1_WIDTH; vo_frame.line_y_start = ((uint32_t)boxes[i].y1) * ISP_CHN0_HEIGHT / ISP_CHN1_HEIGHT; vo_frame.line_x_end = ((uint32_t)boxes[i].x2) * ISP_CHN0_WIDTH / ISP_CHN1_WIDTH; vo_frame.line_y_end = ((uint32_t)boxes[i].y2) * ISP_CHN0_HEIGHT / ISP_CHN1_HEIGHT; +#endif vo_frame.frame_num = ++j; kd_mpi_vo_draw_frame(&vo_frame); } diff --git a/src/big/mpp/userapps/sample/fastboot_app/mobile_retinaface.cc b/src/big/mpp/userapps/sample/fastboot_app/mobile_retinaface.cc index 439b6dba6..152eb784b 100644 --- a/src/big/mpp/userapps/sample/fastboot_app/mobile_retinaface.cc +++ b/src/big/mpp/userapps/sample/fastboot_app/mobile_retinaface.cc @@ -53,7 +53,7 @@ MobileRetinaface::MobileRetinaface(const char *kmodel_file, size_t channel, size int w_pad_before = w_pad / 2; int w_pad_after = w_pad - w_pad_before; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) || defined(CONFIG_BOARD_K230D_CANMV) ai2d_pad_param_t pad_param { true, { { 0, 0 }, { 0, 0 }, { 70, 70 }, { 0, 0 } }, ai2d_pad_mode::constant, { 0, 0, 0 } }; #else ai2d_pad_param_t pad_param { true, { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 70, 70 } }, ai2d_pad_mode::constant, { 0, 0, 0 } }; diff --git a/src/big/mpp/userapps/sample/linker_scripts/riscv64/link.lds b/src/big/mpp/userapps/sample/linker_scripts/riscv64/link.lds index b0b2301a7..0c6d54219 100644 --- a/src/big/mpp/userapps/sample/linker_scripts/riscv64/link.lds +++ b/src/big/mpp/userapps/sample/linker_scripts/riscv64/link.lds @@ -23,7 +23,7 @@ SECTIONS { __text_start__ = .; *(.start); - *(.text) /* remaining code */ + *(.text*) /* remaining code */ KEEP(*(.init)) KEEP(*(.fini)) @@ -42,7 +42,7 @@ SECTIONS *(SORT(.dtors.*)) *(.dtors) - *(.rodata) /* read-only data (constants) */ + *(.rodata*) /* read-only data (constants) */ KEEP(*(.eh_frame*)) diff --git a/src/big/mpp/userapps/sample/opencv_camera_test/opencv_videocapture_basic.cpp b/src/big/mpp/userapps/sample/opencv_camera_test/opencv_videocapture_basic.cpp index d2ce64b9c..9ac7319e0 100755 --- a/src/big/mpp/userapps/sample/opencv_camera_test/opencv_videocapture_basic.cpp +++ b/src/big/mpp/userapps/sample/opencv_camera_test/opencv_videocapture_basic.cpp @@ -57,6 +57,8 @@ typedef struct { k_bool enable[MAX_VO_LAYER_NUM]; } k230_display_layer_conf; +k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_60FPS; + static int k230_vo_creat_layer(k_vo_layer chn_id, layer_info *info) { k_vo_video_layer_attr attr; @@ -178,7 +180,6 @@ static int k230_display_connector_init() int ret = 0; int connector_fd; - k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; k_connector_info connector_info; memset(&connector_info, 0, sizeof(k_connector_info)); @@ -301,18 +302,21 @@ static struct option long_options[] = { static void usage(char * const argv[]) { printf("[sample_vicap]#\n"); - printf("Usage: %s -m 0 -d 0 -s 0 -c 0 -f 0 -W 1088 -H 720 -P 30\n", argv[0]); + printf("Usage: %s -D 101 -m 0 -d 0 -s 24 -c 0 -f 0 -W 1920 -H 1080\n", argv[0]); + printf(" -D: vo(Display) connector device [0: hx8399, 101: HDMI-lt9611-1920x1080p60\tdefault 101\n"); printf(" -m or --mode work mode, 0: online, 1: offline, multiple sensor will use offline mode\n"); printf(" -d or --dev device num, 0, 1, 2, set 1 will enter multiple sensor test\n"); + printf(" -s\n"); printf(" 0: ov9732\n"); printf(" 1: ov9286 ir\n"); printf(" 2: ov9286 speckle\n"); - printf(" 3: imx335 2LANE 1920Wx1080H\n"); - printf(" 4: imx335 2LANE 2592Wx1944H\n"); - printf(" 5: imx335 4LANE 2592Wx1944H\n"); - printf(" 6: imx335 2LANE MCLK 7425 1920Wx1080H\n"); - printf(" 7: imx335 2LANE MCLK 7425 2592Wx1944H\n"); - printf(" 8: imx335 4LANE MCLK 7425 2592Wx1944H\n"); + printf(" 7: imx335 2LANE 1920Wx1080H\n"); + printf(" 8: imx335 2LANE 2592Wx1944H\n"); + printf(" 9: imx335 4LANE 2592Wx1944H\n"); + printf(" 10: imx335 2LANE MCLK 7425 1920Wx1080H\n"); + printf(" 11: imx335 2LANE MCLK 7425 2592Wx1944H\n"); + printf(" 12: imx335 4LANE MCLK 7425 2592Wx1944H\n"); + printf(" 24: OV5647 CSI0 1920X1080 30FPS\n"); printf(" -c or --chn channel num, 0, 1, 2\n"); printf(" -f or --ofmt out pixel format, 0: yuv420sp, 1: rgb888, 2: rgb888p, 3: raw\n"); printf(" -w or --width output width\n"); @@ -341,10 +345,14 @@ int main(int argc, char *argv[]) int c; int option_index = 0; - while ((c = getopt_long(argc, argv, "s:c:f:W:H:m:h", long_options, &option_index)) != -1) + while ((c = getopt_long(argc, argv, "D:s:c:f:W:H:m:h", long_options, &option_index)) != -1) { switch(c) { + case 'D': + connector_type =k_connector_type(atoi(optarg)); + printf("[opencv_camera]# display: %d\n", connector_type); + break; case 's': cam_name = get_camera_name(atoi(optarg)); printf("[opencv_camera]# device_name: %s\n", cam_name); diff --git a/src/big/mpp/userapps/sample/sample_av/sample_av.c b/src/big/mpp/userapps/sample/sample_av/sample_av.c index 2403b6f55..5c8d99f35 100755 --- a/src/big/mpp/userapps/sample/sample_av/sample_av.c +++ b/src/big/mpp/userapps/sample/sample_av/sample_av.c @@ -108,7 +108,7 @@ k_aenc_chn aenc_chn = 0; static k_u64 K_audio_stamap = 0; static k_u32 audio_outframes = 0; -static k_s32 k_time = 0; +static k_s32 k_time = 1; static k_bool quit = K_TRUE; @@ -303,6 +303,7 @@ static void *output_thread(void *arg) k_u32 total_len = 0; venc_conf = (sample_venc_conf_t *)arg; k_s64 delta = 0; + k_u64 prev_v_pts = 0LL; out_cnt = 0; out_frames = 0; @@ -329,12 +330,31 @@ static void *output_thread(void *arg) if (output.pack[i].type != K_VENC_HEADER) { out_frames++; + + if(prev_v_pts != 0) + { + if(output.pack[i].pts == prev_v_pts) + { + av_debug("v_pts error: %ld %ld frame number %d\n", output.pack[i].pts, prev_v_pts, out_frames); + } + else + { + delta = output.pack[i].pts - prev_v_pts; + if(delta > 35000LL || delta < 30000LL) + av_debug("v_pts error: %ld %ld frame number %d\n", output.pack[i].pts, prev_v_pts, out_frames); + } + } + prev_v_pts = output.pack[i].pts; + + if (g_av_test_start && out_frames % (venc_conf->output_frames * k_time ) == 0) + { + delta = (output.pack[i].pts - K_audio_stamap); + av_debug("v pts = %8ld a pts = %8ld av delta = %8ldms video frames = %d audio frames = %d\n", output.pack[i].pts, K_audio_stamap, delta / 1000, out_frames, audio_outframes); + if(delta > 33000LL) + av_debug("av sync error: %ld us\n", delta); + } } - if (g_av_test_start && out_frames % (venc_conf->output_frames * k_time ) == 0) - { - delta = (output.pack[i].pts - K_audio_stamap); - av_debug("v pts = %8ld a pts = %8ld av delta = %8ldms video frames = %d audio frames = %d\n", output.pack[i].pts, K_audio_stamap, delta / 1000, out_frames, audio_outframes); - } + total_len += output.pack[i].len; } @@ -392,9 +412,9 @@ static void *_test_ai_aenc_file_sysbind(void *arg) { k_audio_stream audio_stream; k_aenc_chn aenc_channel = aenc_chn; - k_u64 tmppts = 0; - k_u64 min = 38000; - k_u64 max = 40000; + k_u64 prev_a_pts = 0LL; + k_s32 delta; + while (g_aenc_test_start) { if (0 != kd_mpi_aenc_get_stream(aenc_channel, &audio_stream, 1000)) @@ -404,9 +424,21 @@ static void *_test_ai_aenc_file_sysbind(void *arg) } else { - if ((audio_stream.time_stamp - tmppts) > max || (audio_stream.time_stamp - tmppts) < min) - av_debug("audio delta error %ld, frame %d\n", (audio_stream.time_stamp - tmppts), audio_outframes); - tmppts = audio_stream.time_stamp; + if(prev_a_pts != 0) + { + if(audio_stream.time_stamp == prev_a_pts) + { + av_debug("a_pts error: %ld %ld frame number %d\n", audio_stream.time_stamp, prev_a_pts, audio_outframes); + } + else + { + delta = audio_stream.time_stamp - prev_a_pts; + if(delta > 42000LL || delta < 38000LL) + av_debug("a_pts error: %ld %ld frame number %d\n", audio_stream.time_stamp, prev_a_pts, audio_outframes); + } + } + + prev_a_pts = audio_stream.time_stamp; audio_outframes++; K_audio_stamap = audio_stream.time_stamp; kd_mpi_aenc_release_stream(aenc_channel, &audio_stream); @@ -422,11 +454,6 @@ int main(int argc, char const *argv[]) k_vicap_sensor_type sensor_type = IMX335_MIPI_2LANE_RAW12_1920X1080_30FPS_LINEAR; #ifdef ENABLE_MPI - if (argc <= 1) - { - _help(); - return -1; - } for (int i = 1; i < argc; i += 2) { @@ -438,7 +465,6 @@ int main(int argc, char const *argv[]) else if (strcmp(argv[i], "-time") == 0) { k_time = atoi(argv[i + 1]); - if(!k_time)g_av_test_start = K_FALSE; } else if (strcmp(argv[i], "-sensor") == 0) { diff --git a/src/big/mpp/userapps/sample/sample_face_ae/main.cc b/src/big/mpp/userapps/sample/sample_face_ae/main.cc index 79e47f479..1298b01d2 100644 --- a/src/big/mpp/userapps/sample/sample_face_ae/main.cc +++ b/src/big/mpp/userapps/sample/sample_face_ae/main.cc @@ -47,7 +47,7 @@ using namespace nncase::runtime::detail; #define CHANNEL 3 -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) #define ISP_CHN1_HEIGHT (720) #define ISP_CHN1_WIDTH (1280) #define ISP_CHN0_WIDTH (1920) @@ -282,7 +282,7 @@ k_s32 sample_connector_init(void) { k_u32 ret = 0; k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; #else k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; @@ -424,14 +424,15 @@ int sample_vb_init(void) return ret; } -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) int sample_vivcap_init( void ) { k_s32 ret = 0; - // sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; +#if defined(CONFIG_BOARD_K230_CANMV) sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - // kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); - vicap_dev = VICAP_DEV_ID_0; +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; +#endif memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); ret = kd_mpi_vicap_get_sensor_info(sensor_type, &sensor_info); @@ -828,7 +829,7 @@ int main(int argc, char *argv[]) face_count = boxes.size(); k_isp_ae_roi user_roi; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) face_location_convert_roi(boxes, &user_roi, 0, 0, ISP_CHN1_WIDTH, ISP_CHN1_HEIGHT, 1920, 1080); #else face_location_convert_roi(boxes, &user_roi, 768, 16, ISP_CHN1_WIDTH, ISP_CHN1_HEIGHT, 1088, 1920); diff --git a/src/big/mpp/userapps/sample/sample_face_ae/mobile_retinaface.cc b/src/big/mpp/userapps/sample/sample_face_ae/mobile_retinaface.cc index 439b6dba6..e441d9f0f 100644 --- a/src/big/mpp/userapps/sample/sample_face_ae/mobile_retinaface.cc +++ b/src/big/mpp/userapps/sample/sample_face_ae/mobile_retinaface.cc @@ -53,7 +53,7 @@ MobileRetinaface::MobileRetinaface(const char *kmodel_file, size_t channel, size int w_pad_before = w_pad / 2; int w_pad_after = w_pad - w_pad_before; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) ai2d_pad_param_t pad_param { true, { { 0, 0 }, { 0, 0 }, { 70, 70 }, { 0, 0 } }, ai2d_pad_mode::constant, { 0, 0, 0 } }; #else ai2d_pad_param_t pad_param { true, { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 70, 70 } }, ai2d_pad_mode::constant, { 0, 0, 0 } }; diff --git a/src/big/mpp/userapps/sample/sample_venc/sample_venc.c b/src/big/mpp/userapps/sample/sample_venc/sample_venc.c index a946a581c..061f88ecc 100755 --- a/src/big/mpp/userapps/sample/sample_venc/sample_venc.c +++ b/src/big/mpp/userapps/sample/sample_venc/sample_venc.c @@ -76,6 +76,8 @@ extern const unsigned int osd_data; extern const int osd_data_size; +#define VI_ALIGN_UP(addr, size) (((addr)+((size)-1U))&(~((size)-1U))) + typedef enum { VENC_SAMPLE_STATUS_IDLE = 0, @@ -201,6 +203,7 @@ static void sample_vicap_config(k_u32 ch, k_u32 width, k_u32 height, k_vicap_sen ret = kd_mpi_vicap_set_dev_attr(vicap_dev, dev_attr); CHECK_RET(ret, __func__, __LINE__); + width = VI_ALIGN_UP(width,16); chn_attr.out_win.width = width; chn_attr.out_win.height = height; @@ -344,6 +347,7 @@ static void *output_thread(void *arg) pData = (k_u8 *)kd_mpi_sys_mmap(output.pack[i].phys_addr, output.pack[i].len); if (output_file) fwrite(pData, 1, output.pack[i].len, output_file); + kd_mpi_sys_munmap(pData, output.pack[i].len); total_len += output.pack[i].len; @@ -774,6 +778,7 @@ k_s32 sample_venc_osd_border_h265(k_vicap_sensor_type sensor_type) k_u32 bitrate = 4000; //kbps int width = 1280; int height = 720; + k_venc_rc_mode rc_mode = K_VENC_RC_MODE_CBR; k_payload_type type = K_PT_H265; k_venc_profile profile = VENC_PROFILE_H265_MAIN; diff --git a/src/big/mpp/userapps/sample/sample_vicap/sample_vicap.c b/src/big/mpp/userapps/sample/sample_vicap/sample_vicap.c index e4f89ff8c..4fb8268a8 100755 --- a/src/big/mpp/userapps/sample/sample_vicap/sample_vicap.c +++ b/src/big/mpp/userapps/sample/sample_vicap/sample_vicap.c @@ -521,6 +521,8 @@ int main(int argc, char *argv[]) connector_type = LT9611_MIPI_4LAN_1920X1080_60FPS; } else if (conn == 2) { connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS; + }else if (conn == 3) { + connector_type = ST7701_V1_MIPI_2LAN_480X800_30FPS; } else { printf("unsupport connector deivce.\n"); return -1; @@ -878,6 +880,48 @@ int main(int argc, char *argv[]) // kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); break; } + case 28: + { + device_obj[cur_dev].sensor_type = OV_OV9286_MIPI_1280X720_30FPS_10BIT_MCLK_25M_LINEAR_SPECKLE_V2; + // kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); + break; + } + case 29: + { + device_obj[cur_dev].sensor_type = OV_OV9286_MIPI_1280X720_30FPS_10BIT_MCLK_25M_LINEAR_IR_V2; + // kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); + break; + } + case 30: + { + device_obj[cur_dev].sensor_type = OV_OV9732_MIPI_1280X720_30FPS_10BIT_MCLK_16M_LINEAR_V2; + // kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); + break; + } + case 31: + { + device_obj[cur_dev].sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR_V2; + // kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); + break; + } + case 32: + { + device_obj[cur_dev].sensor_type = OV_OV5647_MIPI_CSI1_1920X1080_30FPS_10BIT_LINEAR_V2; + // kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); + break; + } + case 33: + { + device_obj[cur_dev].sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; + // kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); + break; + } + case 34: + { + device_obj[cur_dev].sensor_type = GC2053_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; + // kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); + break; + } default: { printf("unsupport sensor type.\n"); diff --git a/src/big/mpp/userapps/src/connector/mpi_connector.c b/src/big/mpp/userapps/src/connector/mpi_connector.c index 3d0d923db..cc848c57b 100755 --- a/src/big/mpp/userapps/src/connector/mpi_connector.c +++ b/src/big/mpp/userapps/src/connector/mpi_connector.c @@ -1,288 +1,342 @@ -#include -#include -#include -#include -#include - - -#include "k_connector_comm.h" -#include "k_connector_ioctl.h" -#include "k_vo_comm.h" -#include "mpi_connector_api.h" - -#define pr_debug(...) //printf(__VA_ARGS__) -#define pr_info(...) //printf(__VA_ARGS__) -#define pr_warn(...) //printf(__VA_ARGS__) -#define pr_err(...) printf(__VA_ARGS__) - - -const k_connector_info connector_info_list[] = { - { - "hx8399", - 0, - 0, - BACKGROUND_BLACK_COLOR, - 11, - 7, - K_DSI_4LAN, - K_BURST_MODE, - K_VO_LP_MODE, - {15, 295, 0x17, 0x96}, - {74250, 445500, 1160, 1080, 20, 20, 40, 2134, 1920, 5, 8, 206}, - HX8377_V2_MIPI_4LAN_1080X1920_30FPS, - }, - { - "lt9611", - 0, - 0, - BACKGROUND_BLACK_COLOR, - 10, - 0, - K_DSI_4LAN, - K_BURST_MODE, - K_VO_LP_MODE, - {0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - LT9611_MIPI_ADAPT_RESOLUTION, - }, - { - "lt9611", - 0, - 0, - BACKGROUND_BLACK_COLOR, - 10, - 0, - K_DSI_4LAN, - K_BURST_MODE, - K_VO_LP_MODE, - {8, 165, 0x09, 0x96}, - {148500, 890666, 2200, 1920, 44, 148, 88, 1125, 1080, 5, 4, 36}, - LT9611_MIPI_4LAN_1920X1080_60FPS, - }, - { - "lt9611", - 0, - 0, - BACKGROUND_BLACK_COLOR, - 10, - 0, - K_DSI_4LAN, - K_BURST_MODE, - K_VO_LP_MODE, - {8, 165, 0x09, 0x96}, // use LT9611_MIPI_4LAN_1920X1080_60FPS's configuration - {148500, 890666, 2200, 1920, 44, 148, 88, 1125, 1080, 5, 4, 36}, // use LT9611_MIPI_4LAN_1920X1080_60FPS's configuration - //{15, 295, 0x17, 0x96}, - //{74250, 445500, 2200, 1920, 44, 148, 88, 1125, 1080, 5, 4, 36}, - LT9611_MIPI_4LAN_1920X1080_30FPS, - }, - // { - // "st7701", - // 0, - // 0, - // BACKGROUND_PINK_COLOR, - // 9, - // 39, // pixclk div - // K_DSI_2LAN, - // K_BURST_MODE, - // K_VO_LP_MODE, - // {12, 191, 0x2f, 0x92}, - // {14850, 178200, 550, 480, 10, 20, 40, 900, 800, 5, 20, 75}, - // ST7701_V1_MIPI_2LAN_480X800_30FPS, - // }, - { - "st7701", - 0, - 0, - BACKGROUND_PINK_COLOR, - 10, - 24, // pixclk div - K_DSI_2LAN, - K_BURST_MODE, - K_VO_LP_MODE, - {10, 259, 0x27, 0x84}, // 285.12M - {23760, 285120, 660, 480, 10, 20, 150, 1200, 800, 10, 20, 370}, // 1024 + 30 = 1060 - ST7701_V1_MIPI_2LAN_480X800_30FPS, - }, - { - "st7701", - 0, - 0, - BACKGROUND_PINK_COLOR, - 10, - 24, // pixclk div - K_DSI_2LAN, - K_BURST_MODE, - K_VO_LP_MODE, - {10, 259, 0x27, 0x84}, // 285.12M - {23760, 285120, 660, 480, 10, 20, 150, 1200, 854, 10, 20, 316}, // 1024 + 30 = 1060 - ST7701_V1_MIPI_2LAN_480X854_30FPS, - }, -}; - - -k_s32 kd_mpi_get_connector_info(k_connector_type connector_type, k_connector_info *connector_info) -{ - if(!connector_info) { - pr_err("%s, connector_info is null\n",__func__); - return K_ERR_VO_NULL_PTR; - } - - if (connector_type >= CONNECTOR_NUM_MAX) { - pr_err("%s, invalid connector_type type.\n", __func__); - return K_ERR_VO_ILLEGAL_PARAM; - } - for(k_s32 i = 0; i < sizeof(connector_info_list)/sizeof(k_connector_info); i++) { - if (connector_type == connector_info_list[i].type) { - memcpy(connector_info, &connector_info_list[i], sizeof(k_connector_info)); - return 0; - } - } - return K_ERR_UNEXIST; -} - - -k_s32 kd_mpi_connector_adapt_resolution(k_connector_type type, k_connector_negotiated_data *negotiated_data) -{ - k_u32 ret = 0; - k_s32 connector_fd; - k_connector_type connector_type; - k_connector_info connector_info; - - // step 1 - // read HDMI monitor EDID and negotiate the resolution - memset(&connector_info, 0, sizeof(k_connector_info)); - connector_type = type; - ret = kd_mpi_get_connector_info(connector_type, &connector_info); - if (ret) { - printf("%s get connector info failed for connector_type %d\n", __func__, connector_type); - return ret; - } - - connector_fd = kd_mpi_connector_open(connector_info.connector_name); - if (connector_fd < 0) { - printf("%s connector open %s failed \n", __func__, connector_info.connector_name); - return K_ERR_VO_NOTREADY; - } - kd_mpi_connector_get_negotiated_data(connector_fd, negotiated_data); - kd_mpi_connector_close(connector_fd); - - // step 2 - // according to the negotiated resolution and then set the prefered resolution - memset(&connector_info, 0, sizeof(k_connector_info)); - connector_type = negotiated_data->negotiated_types[0]; - ret = kd_mpi_get_connector_info(connector_type, &connector_info); - if (ret) { - printf("%s get connector info failed for connector_type %d\n", __func__, connector_type); - return ret; - } - - connector_fd = kd_mpi_connector_open(connector_info.connector_name); - if (connector_fd < 0) { - printf("%s connector open %s failed \n", __func__, connector_info.connector_name); - return K_ERR_VO_NOTREADY; - } - kd_mpi_connector_power_set(connector_fd, 1); - kd_mpi_connector_init(connector_fd, connector_info); - - return 0; -} - - -k_s32 kd_mpi_connector_open(const char *connector_name) -{ - k_s32 fd = 0; - char dev_name[52]; - - if(!connector_name) { - pr_err("%s, sensor_name is null\n",__func__); - return -K_ERR_VO_NULL_PTR; - } - - snprintf(dev_name, sizeof(dev_name), "/dev/connector_%s", connector_name); - fd = open(dev_name, O_RDWR); - if (fd < 0) { - pr_err("%s, failed(%d).\n", __func__, fd); - return -K_ERR_VO_NOTREADY; - } - return fd; -} - - -k_s32 kd_mpi_connector_close(k_s32 fd) -{ - close(fd); -} - - -k_s32 kd_mpi_connector_power_set(k_s32 fd, k_bool on) -{ - k_s32 ret; - - ret = ioctl(fd, KD_IOC_CONNECTOR_S_POWER, &on); - if (ret != 0) { - pr_err("%s, error(%d)\n", __func__, ret); - return K_ERR_VO_NOT_SUPPORT; - } - - return ret; -} - - -k_s32 kd_mpi_connector_id_get(k_s32 fd, k_u32 *sensor_id) -{ - k_s32 ret; - - if(!sensor_id) { - pr_err("%s, sensor_id is null\n",__func__); - return K_ERR_VO_NULL_PTR; - } - - ret = ioctl(fd, KD_IOC_CONNECTOR_G_ID, sensor_id); - if (ret != 0) { - pr_err("%s, error(%d)\n", __func__, ret); - return K_ERR_VO_NOT_SUPPORT; - } - - return ret; -} - - -k_s32 kd_mpi_connector_init(k_s32 fd, k_connector_info info) -{ - k_s32 ret; - - ret = ioctl(fd, KD_IOC_CONNECTOR_S_INIT, info); - if (ret != 0) { - pr_err("%s, error(%d)\n", __func__, ret); - return K_ERR_VO_NOT_SUPPORT; - } - - return ret; -} - -k_s32 kd_mpi_connector_get_negotiated_data(k_s32 fd, k_connector_negotiated_data *negotiated_data) -{ - k_s32 ret; - - ret = ioctl(fd, KD_IOC_CONNECTOR_G_NEG_DATA, negotiated_data); - if (ret == -1) { - pr_err("%s, error(%d)\n", __func__, ret); - return K_ERR_VO_NOT_SUPPORT; - } - - return ret; -} - - -k_s32 kd_mpi_connector_set_mirror(k_s32 fd, k_connector_mirror mirror) -{ - k_s32 ret; - - ret = ioctl(fd, KD_IOC_CONNECTOR_S_MIRROR, &mirror); - if (ret != 0) { - pr_err("%s, error(%d)\n", __func__, ret); - return K_ERR_VO_NOT_SUPPORT; - } - - return ret; -} \ No newline at end of file +#include +#include +#include +#include +#include + +#include "k_connector_comm.h" +#include "k_connector_ioctl.h" +#include "k_vo_comm.h" +#include "mpi_connector_api.h" + +#define pr_debug(...) // printf(__VA_ARGS__) +#define pr_info(...) // printf(__VA_ARGS__) +#define pr_warn(...) // printf(__VA_ARGS__) +#define pr_err(...) printf(__VA_ARGS__) + +k_connector_info connector_info_list[] = { + { + "hx8399", + 0, + 0, + BACKGROUND_BLACK_COLOR, + 11, + 7, + K_DSI_4LAN, + K_BURST_MODE, + K_VO_LP_MODE, + { 15, 295, 0x17, 0x96 }, + { 74250, 445500, 1160, 1080, 20, 20, 40, 2134, 1920, 5, 8, 206 }, + HX8377_V2_MIPI_4LAN_1080X1920_30FPS, + }, + { + "lt9611", + 0, + 0, + BACKGROUND_BLACK_COLOR, + 10, + 0, + K_DSI_4LAN, + K_BURST_MODE, + K_VO_LP_MODE, + { 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + LT9611_MIPI_ADAPT_RESOLUTION, + }, + { + "lt9611", + 0, + 0, + BACKGROUND_BLACK_COLOR, + 10, + 3, + K_DSI_4LAN, + K_BURST_MODE, + K_VO_LP_MODE, + { 15, 295, 0x09, 0x96 }, + { 148500, 891000, 2200, 1920, 44, 148, 88, 1125, 1080, 5, 4, 36 }, + LT9611_MIPI_4LAN_1920X1080_60FPS, + }, + { + "lt9611", + 0, + 0, + BACKGROUND_BLACK_COLOR, + 10, + 3, + K_DSI_4LAN, + K_BURST_MODE, + K_VO_LP_MODE, + { 15, 295, 0x09, 0x96 }, + { 148500, 891000, 2200, 1920, 44, 148, 88, 1125, 1080, 5, 4, 36 }, + LT9611_MIPI_4LAN_1920X1080_30FPS, + }, + // { + // "lt9611", + // 0, + // 0, + // BACKGROUND_BLACK_COLOR, + // 10, + // 7, + // K_DSI_4LAN, + // K_BURST_MODE, + // K_VO_LP_MODE, + // { 15, 295, 0x19, 0x96 }, + // { 74250, 445500, 2200, 1920, 44, 148, 88, 1125, 1080, 5, 4, 36 }, + // LT9611_MIPI_4LAN_1920X1080_30FPS, + // }, + { + "lt9611", + 0, + 0, + BACKGROUND_BLACK_COLOR, + 9, + 7, + K_DSI_4LAN, + K_BURST_MODE, + K_VO_LP_MODE, + { 15, 295, 0x19, 0x96 }, + { 74250, 445500, 1616, 1280, 40, 220, 76, 765, 720, 5, 4, 36 }, + LT9611_MIPI_4LAN_1280X720_60FPS, + }, + { + "lt9611", + 0, + 0, + BACKGROUND_BLACK_COLOR, + 9, + 7, + K_DSI_4LAN, + K_BURST_MODE, + K_VO_LP_MODE, + { 15, 295, 0x19, 0x96 }, + { 74250, 445500, 1940, 1280, 40, 220, 400, 765, 720, 5, 4, 36 }, + LT9611_MIPI_4LAN_1280X720_50FPS, + }, + { + "lt9611", + 0, + 0, + BACKGROUND_BLACK_COLOR, + 9, + 7, + K_DSI_4LAN, + K_BURST_MODE, + K_VO_LP_MODE, + { 15, 295, 0x19, 0x96 }, + { 74250, 445500, 3232, 1280, 40, 220, 1692, 765, 720, 5, 4, 36 }, + LT9611_MIPI_4LAN_1280X720_30FPS, + }, + { + "lt9611", + 0, + 0, + BACKGROUND_BLACK_COLOR, + 9, + 23, + K_DSI_4LAN, + K_BURST_MODE, + K_VO_LP_MODE, + { 15, 394, 0x39, 0x96 }, + { 24750, 148500, 800, 640, 96, 48, 16, 525, 480, 5, 4, 36 }, + LT9611_MIPI_4LAN_640X480_60FPS, + }, + { + "lt9611", + 0, + 0, + BACKGROUND_BLACK_COLOR, + 8, + 43, + K_DSI_4LAN, + K_BURST_MODE, + K_VO_LP_MODE, + { 15, 214, 0x3f, 0x96 }, + { 13500, 81000, 752, 320, 96, 48, 288, 300, 240, 10, 14, 36 }, + OTHER_MIPI_4LAN_320X240_60FPS, + }, + { + "st7701", + 0, + 0, + BACKGROUND_BLACK_COLOR, + 10, + 24, + K_DSI_2LAN, + K_BURST_MODE, + K_VO_LP_MODE, + { 10, 259, 0x27, 0x84 }, + { 23760, 285120, 660, 480, 10, 20, 150, 1200, 800, 10, 20, 370 }, + ST7701_V1_MIPI_2LAN_480X800_30FPS, + }, + { + "st7701", + 0, + 0, + BACKGROUND_PINK_COLOR, + 10, + 24, + K_DSI_2LAN, + K_BURST_MODE, + K_VO_LP_MODE, + { 10, 259, 0x27, 0x84 }, + { 23760, 285120, 660, 480, 10, 20, 150, 1200, 854, 10, 20, 316 }, + ST7701_V1_MIPI_2LAN_480X854_30FPS, + }, +}; + +k_s32 kd_mpi_get_connector_info(k_connector_type connector_type, k_connector_info* connector_info) +{ + if (!connector_info) { + pr_err("%s, connector_info is null\n", __func__); + return K_ERR_VO_NULL_PTR; + } + + for (k_s32 i = 0; i < sizeof(connector_info_list) / sizeof(k_connector_info); i++) { + if (connector_type == connector_info_list[i].type) { + memcpy(connector_info, &connector_info_list[i], sizeof(k_connector_info)); + return 0; + } + } + return K_ERR_UNEXIST; +} + +k_s32 kd_mpi_connector_adapt_resolution(k_connector_type type, k_connector_negotiated_data* negotiated_data) +{ + k_u32 ret = 0; + k_s32 connector_fd; + k_connector_type connector_type; + k_connector_info connector_info; + + // step 1 + // read HDMI monitor EDID and negotiate the resolution + memset(&connector_info, 0, sizeof(k_connector_info)); + connector_type = type; + ret = kd_mpi_get_connector_info(connector_type, &connector_info); + if (ret) { + printf("%s get connector info failed for connector_type %d\n", __func__, connector_type); + return ret; + } + + connector_fd = kd_mpi_connector_open(connector_info.connector_name); + if (connector_fd < 0) { + printf("%s connector open %s failed \n", __func__, connector_info.connector_name); + return K_ERR_VO_NOTREADY; + } + kd_mpi_connector_get_negotiated_data(connector_fd, negotiated_data); + kd_mpi_connector_close(connector_fd); + + // step 2 + // according to the negotiated resolution and then set the prefered resolution + memset(&connector_info, 0, sizeof(k_connector_info)); + connector_type = negotiated_data->negotiated_types[0]; + ret = kd_mpi_get_connector_info(connector_type, &connector_info); + if (ret) { + printf("%s get connector info failed for connector_type %d\n", __func__, connector_type); + return ret; + } + + connector_fd = kd_mpi_connector_open(connector_info.connector_name); + if (connector_fd < 0) { + printf("%s connector open %s failed \n", __func__, connector_info.connector_name); + return K_ERR_VO_NOTREADY; + } + kd_mpi_connector_power_set(connector_fd, 1); + kd_mpi_connector_init(connector_fd, connector_info); + + return 0; +} + +k_s32 kd_mpi_connector_open(const char* connector_name) +{ + k_s32 fd = 0; + char dev_name[52]; + + if (!connector_name) { + pr_err("%s, sensor_name is null\n", __func__); + return -K_ERR_VO_NULL_PTR; + } + + snprintf(dev_name, sizeof(dev_name), "/dev/connector_%s", connector_name); + fd = open(dev_name, O_RDWR); + if (fd < 0) { + pr_err("%s, failed(%d).\n", __func__, fd); + return -K_ERR_VO_NOTREADY; + } + return fd; +} + +k_s32 kd_mpi_connector_close(k_s32 fd) +{ + close(fd); +} + +k_s32 kd_mpi_connector_power_set(k_s32 fd, k_bool on) +{ + k_s32 ret; + + ret = ioctl(fd, KD_IOC_CONNECTOR_S_POWER, &on); + if (ret != 0) { + pr_err("%s, error(%d)\n", __func__, ret); + return K_ERR_VO_NOT_SUPPORT; + } + + return ret; +} + +k_s32 kd_mpi_connector_id_get(k_s32 fd, k_u32* sensor_id) +{ + k_s32 ret; + + if (!sensor_id) { + pr_err("%s, sensor_id is null\n", __func__); + return K_ERR_VO_NULL_PTR; + } + + ret = ioctl(fd, KD_IOC_CONNECTOR_G_ID, sensor_id); + if (ret != 0) { + pr_err("%s, error(%d)\n", __func__, ret); + return K_ERR_VO_NOT_SUPPORT; + } + + return ret; +} + +k_s32 kd_mpi_connector_init(k_s32 fd, k_connector_info info) +{ + k_s32 ret; + + ret = ioctl(fd, KD_IOC_CONNECTOR_S_INIT, info); + if (ret != 0) { + pr_err("%s, error(%d)\n", __func__, ret); + return K_ERR_VO_NOT_SUPPORT; + } + + return ret; +} + +k_s32 kd_mpi_connector_get_negotiated_data(k_s32 fd, k_connector_negotiated_data* negotiated_data) +{ + k_s32 ret; + + ret = ioctl(fd, KD_IOC_CONNECTOR_G_NEG_DATA, negotiated_data); + if (ret == -1) { + pr_err("%s, error(%d)\n", __func__, ret); + return K_ERR_VO_NOT_SUPPORT; + } + + return ret; +} + +k_s32 kd_mpi_connector_set_mirror(k_s32 fd, k_connector_mirror mirror) +{ + k_s32 ret; + + ret = ioctl(fd, KD_IOC_CONNECTOR_S_MIRROR, &mirror); + if (ret != 0) { + pr_err("%s, error(%d)\n", __func__, ret); + return K_ERR_VO_NOT_SUPPORT; + } + + return ret; +} diff --git a/src/big/mpp/userapps/src/sensor/config/gc2053-1920x1080.xml b/src/big/mpp/userapps/src/sensor/config/gc2053-1920x1080.xml new file mode 100755 index 000000000..8b0589048 --- /dev/null +++ b/src/big/mpp/userapps/src/sensor/config/gc2053-1920x1080.xml @@ -0,0 +1,1927 @@ + + +
+ + 14-Apr-2023 + + + CANAAN + + + imx335 + + + 5MP_03 + + + v2.1.4 + + + + + 1920x1080 + + + 0x00000001 + + + [ 1920] + + + [ 1080] + + + + + FPS_15 + + + [ 14.9916] + + + + + FPS_10 + + + [ 9.9944] + + + + + FPS_05 + + + [ 4.9972] + + + + + +
+ + + + + + 1920x1080 + + + 1920x1080 + + + [0.33685 0.445674 0.21748] + + + [-0.72856 0.0450608 0.683499 0.368602 -0.815252 0.44665] + + + [-0.878596 -0.477567 -2.3806] + + + [0.893637 1.04155 1.17171 1.25175 1.32974 1.41182 1.46781 1.53637 1.59933 1.64725 1.68643 1.73597 1.76776 1.82244 1.8724 1.9224] + + + [0.299527 0.226256 0.163008 0.126249 0.0816264 0.0527321 0.0331506 -0.000740207 -0.024855 -0.0284617 -0.0187152 -0.0003949 0.0279478 0.104482 0.185854 0.27988] + + + [0.898917 1.0374 1.17249 1.27478 1.36246 1.43936 1.48864 1.54489 1.5827 1.63209 1.66455 1.70195 1.74248 1.78982 1.85229 1.9224] + + + [-0.0218459 0.0406928 0.116339 0.161454 0.200124 0.233306 0.23167 0.234567 0.230063 0.180995 0.150031 0.131465 0.116475 0.0752721 0.00714526 -0.079878] + + + [0.8 0.87749 0.95498 1.03247 1.10996 1.18745 1.26494 1.34243 1.41992 1.49741 1.5749 1.65239 1.72988 1.80737 1.88486 2.0624] + + + [0.430794 0.386435 0.344197 0.302953 0.26424 0.227241 0.192823 0.162269 0.13544 0.114444 0.100864 0.0992768 0.118688 0.183998 0.308179 0.45827] + + + [0.8 0.87749 0.95498 1.03247 1.10996 1.18745 1.26494 1.34243 1.41992 1.49741 1.5749 1.65239 1.72988 1.80737 1.88486 2.0624] + + + [-0.0307939 0.0135649 0.055803 0.0970467 0.13576 0.172759 0.207177 0.237731 0.26456 0.285556 0.299136 0.300723 0.281312 0.216002 0.0918215 -0.058265] + + + [ 0.9] + + + [ 1.9224] + + + [ 2.0624] + + + [ 1.6226] + + + D50 + + + [ 240.0] + + + [0.75 1.28836 1.77672 2.164 2.6 3.0618] + + + [114 114 105 95 95 90] + + + [83 83 110 120 122 128] + + + [28 27 18 16 9 9] + + + [123 123 123 123 123 120] + + + [123 123 123 123 123 126] + + + [5 5 5 5 5 5] + + + [ 1] + + + [ 0.8] + + + [ 0.05] + + + + [ 0.05] + + + [ 0.05] + + + [ 0.4] + + + [ 0.5] + + + [ 0.9] + + + [ 0.5] + + + [ 50] + + + [ 1] + + + [ 0.5] + + + + + + + + A + + + Indoor + + + + [1313.1 1699.29 1699.29 4038.1337] + + + [ 247.3246] + + + [1 1] + + + [-0.0850574 -0.034564] + + + + + + 1920x1080 + + + 1920x1080_A_100 + + + + + [1.21742 1 1 3.2662] + + + [1.65109 -0.164824 -0.486268 -0.477326 1.75283 -0.275504 0.114565 -1.18037 2.0658] + + + [0 0 0] + + + AUTO + + + + [1 2 4 8] + + + [100 95 90 74] + + + + + [1 2 4 8] + + + [100 95 90 70] + + + + + A_100 + + + + + + D50 + + + Outdoor + + + + [334.205 75.7405 75.7405 1625.4991] + + + [ 116.6849] + + + [1 1] + + + [0.0832239 -0.040631] + + + + + + 1920x1080 + + + 1920x1080_D50_100 + + + + + [1.84715 1 1 1.8834] + + + [1.78555 -0.639126 -0.146426 -0.312724 1.6701 -0.357375 0.0557804 -0.75418 1.6984] + + + [0 0 0] + + + AUTO + + + + [1 2 4 8] + + + [100 95 90 74] + + + + + [1 2 4 8] + + + [100 95 90 70] + + + + + D50_100 + + + + + + D65 + + + Outdoor + + + + [323.735 -144.193 -144.193 1344.2478] + + + [ 102.4529] + + + [1 1] + + + [0.129053 -0.034564] + + + + + + 1920x1080 + + + 1920x1080_D65_100 + + + + + [2.08473 1 1 1.6526] + + + [1.76069 -0.652646 -0.108048 -0.291881 1.62035 -0.328466 0.0097552 -0.579155 1.5694] + + + [0 0 0] + + + AUTO + + + + [1 2 4 8] + + + [100 95 90 74] + + + + + [1 2 4 8] + + + [100 95 90 70] + + + + + D65_100 + + + + + + F11 (TL84) + + + Indoor + + + + [390.016 -24.1121 -24.1121 1181.1561] + + + [ 107.9546] + + + [1 1] + + + [0.0130937 -0.044363] + + + + + + 1920x1080 + + + 1920x1080_F11_100 + + + + + [1.55143 1 1 2.335] + + + [1.81385 -0.612826 -0.201022 -0.380081 1.59118 -0.211099 0.0598573 -0.690456 1.6306] + + + [0 0 0] + + + AUTO + + + + [1 2 4 8] + + + [100 95 90 74] + + + + + [1 2 4 8] + + + [100 95 90 70] + + + + + F11_100 + + + + + + F12 + + + Indoor + + + + [568.743 333.687 333.687 1612.9066] + + + [ 142.8837] + + + [1 1] + + + [-0.084276 -0.031516] + + + + + + 1920x1080 + + + 1920x1080_F12_100 + + + + + [1.20934 1 1 3.207] + + + [1.53261 -0.298219 -0.234395 -0.544301 1.76922 -0.224918 0.0315831 -0.881887 1.8503] + + + [0 0 0] + + + AUTO + + + + [1 2 4 8] + + + [100 95 90 74] + + + + + [1 2 4 8] + + + [100 95 90 70] + + + + + F12_100 + + + + + + + + + 1920x1080_A_100 + + + 1920x1080 + + + A + + + [ 32] + + + [ 10] + + + [ 15] + + + [ 15] + + + [45 47 50 52 55 56 57 60 61 63 67 67 69 69 72 70 70 72 69 69 67 67 63 61 60 57 56 55 52 50 47 45] + + + [30 31 33 33 32 33 34 34 35 35 35 35 35 36 34 35] + + + [ 100] + + + [ 1900 1850 1798 1740 1685 1634 1581 1540 1500 1473 1430 1396 1384 1352 1335 1316 1318 1318 1316 1321 1343 1343 1369 1378 1420 1443 1486 1514 1551 1581 1630 1663 1735 + 1900 1840 1793 1731 1681 1621 1574 1532 1497 1456 1427 1396 1360 1343 1327 1316 1310 1308 1308 1316 1327 1343 1357 1384 1402 1436 1469 1500 1536 1578 1634 1668 1703 + 1850 1814 1764 1690 1655 1593 1543 1507 1463 1433 1399 1366 1343 1324 1302 1294 1284 1284 1282 1287 1305 1313 1332 1352 1375 1408 1443 1483 1514 1555 1597 1630 1668 + 1824 1779 1726 1663 1613 1562 1529 1497 1449 1414 1384 1346 1324 1313 1284 1271 1261 1264 1256 1271 1276 1292 1316 1332 1360 1396 1424 1453 1490 1529 1574 1605 1668 + 1814 1754 1694 1655 1597 1547 1504 1459 1430 1381 1357 1324 1302 1287 1264 1252 1244 1242 1247 1237 1269 1276 1294 1313 1340 1366 1399 1436 1473 1507 1543 1589 1625 + 1774 1726 1676 1621 1562 1529 1473 1440 1402 1366 1332 1305 1279 1254 1244 1232 1221 1223 1216 1230 1239 1252 1271 1292 1313 1352 1384 1408 1443 1483 1518 1562 1609 + 1764 1717 1659 1597 1547 1507 1463 1424 1387 1349 1310 1284 1269 1237 1228 1214 1205 1202 1207 1211 1218 1239 1259 1287 1308 1335 1355 1399 1427 1469 1511 1547 1581 + 1740 1672 1638 1578 1536 1479 1443 1411 1360 1327 1297 1271 1239 1223 1207 1200 1182 1180 1178 1196 1205 1214 1242 1256 1276 1305 1343 1372 1408 1443 1486 1521 1566 + 1721 1655 1613 1570 1521 1466 1417 1387 1346 1310 1287 1249 1223 1202 1185 1174 1169 1161 1167 1176 1180 1200 1221 1242 1261 1292 1321 1352 1393 1427 1469 1500 1543 + 1690 1646 1593 1536 1486 1446 1411 1369 1324 1294 1264 1235 1209 1187 1165 1161 1153 1153 1149 1153 1167 1187 1205 1225 1249 1276 1310 1346 1378 1411 1446 1483 1521 + 1668 1617 1581 1518 1476 1433 1393 1346 1313 1276 1239 1214 1191 1174 1151 1140 1128 1136 1136 1144 1147 1163 1185 1207 1232 1261 1292 1318 1366 1387 1424 1463 1518 + 1659 1609 1558 1504 1459 1414 1369 1335 1297 1266 1235 1200 1182 1161 1140 1128 1113 1111 1119 1124 1136 1153 1169 1198 1218 1242 1282 1310 1346 1372 1420 1456 1479 + 1655 1593 1547 1497 1449 1399 1363 1318 1276 1256 1218 1185 1161 1149 1124 1111 1105 1101 1105 1109 1119 1134 1157 1187 1211 1232 1266 1300 1327 1363 1399 1433 1469 + 1630 1581 1525 1473 1433 1384 1343 1308 1269 1239 1198 1174 1155 1126 1115 1096 1092 1092 1088 1094 1107 1121 1138 1169 1182 1218 1252 1284 1310 1349 1387 1427 1459 + 1617 1570 1518 1469 1424 1375 1338 1305 1259 1228 1193 1167 1140 1121 1103 1088 1077 1085 1079 1086 1092 1109 1134 1161 1185 1209 1244 1279 1310 1352 1387 1414 1466 + 1609 1547 1507 1459 1408 1369 1327 1289 1259 1216 1185 1155 1128 1103 1088 1079 1065 1061 1068 1075 1085 1098 1119 1144 1169 1205 1230 1261 1300 1335 1366 1402 1433 + 1593 1543 1504 1456 1408 1363 1318 1282 1244 1211 1182 1147 1122 1103 1077 1065 1056 1054 1054 1063 1072 1092 1113 1144 1159 1193 1223 1256 1287 1324 1360 1405 1420 + 1585 1547 1486 1449 1387 1346 1308 1269 1232 1207 1172 1147 1117 1096 1074 1058 1049 1044 1042 1054 1065 1079 1113 1130 1151 1185 1211 1247 1279 1313 1346 1393 1430 + 1581 1532 1486 1436 1390 1349 1302 1264 1232 1193 1165 1132 1111 1085 1061 1053 1039 1036 1034 1044 1065 1079 1103 1126 1142 1178 1207 1235 1276 1305 1343 1375 1411 + 1585 1529 1476 1433 1393 1346 1308 1264 1232 1191 1165 1128 1103 1083 1063 1042 1034 1032 1039 1042 1056 1070 1099 1122 1144 1176 1205 1237 1266 1308 1340 1375 1424 + 1570 1518 1469 1424 1378 1338 1294 1259 1218 1191 1155 1124 1096 1072 1053 1042 1027 1026 1027 1034 1051 1070 1086 1111 1130 1161 1200 1225 1256 1302 1340 1372 1408 + 1570 1521 1469 1430 1375 1332 1289 1256 1221 1185 1151 1121 1096 1070 1058 1032 1029 1027 1031 1032 1047 1068 1092 1107 1140 1172 1198 1228 1261 1300 1332 1372 1405 + 1555 1511 1466 1420 1375 1335 1297 1254 1216 1180 1151 1122 1096 1070 1049 1031 1032 1031 1034 1031 1044 1061 1086 1107 1136 1163 1196 1228 1261 1294 1327 1363 1393 + 1566 1511 1469 1427 1375 1332 1294 1244 1216 1176 1149 1119 1092 1067 1047 1036 1031 1026 1026 1036 1046 1059 1092 1105 1138 1163 1193 1230 1259 1297 1335 1366 1396 + 1566 1518 1469 1427 1384 1340 1294 1261 1216 1187 1151 1119 1094 1070 1058 1029 1032 1029 1027 1036 1047 1061 1090 1111 1138 1167 1205 1232 1261 1305 1338 1363 1399 + 1578 1514 1476 1427 1384 1329 1292 1252 1218 1187 1149 1122 1099 1068 1056 1036 1027 1024 1031 1034 1047 1065 1090 1113 1138 1174 1196 1225 1269 1300 1332 1372 1408 + 1566 1518 1466 1430 1384 1338 1302 1259 1221 1191 1159 1126 1098 1077 1056 1044 1037 1026 1029 1036 1051 1067 1094 1115 1142 1174 1198 1235 1279 1297 1335 1375 1411 + 1566 1532 1483 1436 1390 1346 1305 1266 1225 1189 1167 1130 1103 1083 1063 1053 1042 1039 1042 1047 1058 1077 1103 1124 1144 1176 1211 1237 1274 1313 1349 1390 1417 + 1589 1536 1483 1443 1393 1343 1302 1269 1230 1198 1167 1138 1107 1083 1061 1053 1044 1041 1047 1047 1061 1081 1107 1134 1153 1187 1214 1239 1274 1316 1352 1390 1420 + 1601 1547 1497 1449 1399 1352 1313 1269 1239 1205 1174 1144 1119 1092 1074 1067 1059 1051 1051 1065 1070 1090 1117 1136 1159 1187 1223 1254 1279 1321 1355 1396 1420 + 1601 1551 1504 1456 1405 1366 1327 1287 1249 1209 1178 1151 1130 1107 1081 1072 1068 1058 1063 1070 1090 1103 1122 1151 1169 1193 1230 1261 1289 1321 1366 1405 1433 + 1605 1555 1511 1459 1417 1375 1329 1284 1254 1216 1182 1163 1134 1109 1098 1079 1070 1063 1072 1083 1088 1103 1126 1155 1176 1207 1235 1266 1302 1332 1372 1408 1436 + 1621 1555 1514 1473 1427 1384 1340 1308 1261 1235 1198 1165 1151 1124 1105 1092 1075 1081 1086 1092 1096 1121 1142 1159 1180 1205 1244 1274 1302 1335 1381 1424 1443] + + + [1814 1750 1714 1680 1626 1578 1530 1502 1461 1428 1407 1373 1356 1339 1342 1320 1307 1302 1314 1309 1316 1327 1354 1376 1404 1412 1445 1476 1508 1520 1571 1608 1629 + 1796 1746 1703 1651 1612 1565 1530 1484 1445 1420 1396 1368 1354 1318 1307 1300 1293 1291 1295 1300 1316 1323 1342 1359 1384 1407 1436 1461 1499 1527 1558 1601 1622 + 1763 1707 1676 1636 1588 1536 1496 1464 1434 1399 1371 1346 1325 1302 1287 1284 1274 1269 1271 1274 1280 1295 1323 1327 1354 1378 1404 1431 1473 1502 1530 1561 1605 + 1742 1695 1654 1601 1558 1514 1479 1442 1409 1389 1351 1327 1307 1287 1267 1263 1250 1248 1252 1254 1267 1278 1298 1323 1332 1363 1391 1412 1450 1487 1520 1552 1581 + 1711 1669 1629 1591 1539 1502 1459 1434 1394 1361 1337 1309 1282 1263 1246 1240 1238 1228 1234 1238 1252 1261 1276 1293 1311 1342 1368 1399 1425 1459 1496 1533 1552 + 1688 1643 1601 1555 1520 1479 1439 1409 1368 1342 1314 1289 1265 1244 1234 1224 1216 1210 1218 1222 1230 1240 1261 1278 1295 1320 1344 1378 1409 1445 1476 1511 1536 + 1673 1619 1588 1542 1499 1467 1425 1391 1361 1323 1298 1267 1252 1230 1214 1202 1198 1193 1200 1202 1208 1224 1248 1259 1284 1309 1327 1361 1396 1420 1459 1496 1520 + 1647 1615 1568 1517 1479 1445 1407 1366 1337 1304 1278 1246 1236 1212 1195 1191 1172 1172 1180 1187 1193 1208 1224 1246 1269 1289 1304 1346 1378 1407 1434 1476 1499 + 1629 1591 1549 1505 1461 1428 1378 1351 1316 1289 1263 1238 1212 1193 1176 1169 1165 1163 1161 1171 1178 1193 1210 1228 1252 1276 1295 1327 1359 1386 1417 1456 1490 + 1622 1575 1539 1479 1445 1404 1378 1342 1304 1276 1246 1218 1202 1180 1169 1153 1151 1149 1144 1154 1169 1174 1197 1210 1236 1263 1284 1309 1346 1368 1407 1447 1479 + 1608 1555 1520 1473 1434 1394 1363 1323 1289 1259 1232 1206 1183 1158 1153 1135 1127 1123 1127 1132 1144 1160 1174 1198 1224 1244 1267 1287 1325 1359 1391 1417 1456 + 1588 1542 1508 1456 1425 1376 1344 1311 1280 1254 1220 1198 1169 1158 1139 1122 1117 1115 1122 1123 1132 1147 1171 1185 1208 1234 1256 1284 1316 1346 1381 1420 1445 + 1571 1527 1482 1447 1402 1376 1327 1295 1267 1238 1210 1180 1165 1142 1120 1112 1102 1099 1102 1104 1122 1135 1144 1172 1195 1222 1244 1276 1309 1334 1373 1396 1428 + 1561 1524 1482 1442 1396 1356 1318 1287 1259 1224 1195 1171 1149 1125 1107 1096 1086 1083 1092 1096 1107 1122 1142 1156 1172 1206 1228 1265 1298 1323 1354 1381 1420 + 1555 1511 1470 1425 1384 1359 1311 1282 1248 1212 1187 1163 1140 1123 1100 1081 1078 1080 1075 1083 1100 1120 1130 1149 1174 1198 1228 1252 1287 1318 1344 1381 1412 + 1527 1493 1461 1415 1373 1339 1302 1263 1234 1204 1176 1149 1122 1108 1096 1071 1069 1062 1062 1072 1081 1100 1115 1142 1156 1183 1208 1240 1274 1302 1325 1363 1399 + 1524 1484 1461 1407 1366 1327 1298 1261 1230 1193 1172 1147 1120 1102 1083 1065 1059 1054 1054 1060 1074 1091 1107 1128 1156 1182 1208 1230 1265 1293 1327 1366 1378 + 1530 1490 1442 1412 1356 1327 1293 1248 1226 1195 1161 1135 1112 1091 1071 1056 1048 1050 1048 1053 1071 1086 1107 1120 1151 1172 1200 1226 1261 1284 1320 1354 1384 + 1511 1473 1434 1402 1359 1316 1284 1248 1218 1182 1154 1128 1105 1084 1059 1053 1040 1035 1038 1050 1060 1077 1100 1118 1142 1163 1191 1224 1250 1284 1316 1337 1381 + 1511 1470 1431 1386 1354 1314 1274 1246 1214 1185 1158 1128 1107 1075 1059 1047 1038 1031 1041 1041 1054 1069 1094 1115 1135 1167 1193 1220 1250 1276 1311 1339 1378 + 1502 1470 1423 1386 1342 1300 1271 1242 1208 1182 1144 1118 1094 1072 1051 1038 1031 1028 1031 1028 1045 1065 1086 1104 1132 1153 1182 1212 1240 1271 1300 1339 1359 + 1508 1464 1423 1389 1346 1304 1271 1234 1208 1172 1149 1120 1097 1072 1053 1040 1030 1028 1024 1031 1044 1063 1083 1112 1128 1156 1185 1208 1246 1269 1298 1330 1366 + 1502 1467 1417 1376 1339 1302 1263 1232 1202 1172 1140 1112 1092 1069 1045 1034 1034 1024 1032 1031 1045 1060 1080 1107 1127 1153 1178 1208 1242 1267 1302 1334 1381 + 1502 1459 1420 1381 1342 1307 1267 1228 1202 1172 1139 1117 1089 1068 1047 1034 1024 1025 1028 1032 1041 1062 1081 1099 1130 1153 1180 1204 1232 1269 1295 1330 1363 + 1511 1464 1425 1389 1344 1309 1267 1240 1202 1176 1139 1118 1091 1072 1045 1037 1031 1030 1032 1031 1045 1068 1083 1105 1133 1161 1185 1212 1240 1278 1309 1337 1368 + 1490 1461 1423 1376 1344 1304 1267 1236 1204 1172 1142 1117 1094 1068 1045 1031 1031 1025 1025 1037 1045 1057 1083 1108 1132 1158 1185 1206 1238 1269 1300 1334 1373 + 1508 1456 1431 1389 1349 1311 1278 1236 1206 1176 1146 1122 1097 1074 1056 1042 1032 1030 1032 1038 1051 1068 1088 1110 1125 1158 1189 1208 1250 1274 1307 1332 1359 + 1511 1470 1436 1391 1354 1307 1276 1240 1208 1183 1154 1125 1100 1074 1060 1045 1037 1034 1037 1047 1060 1074 1096 1112 1139 1167 1185 1218 1250 1274 1314 1344 1371 + 1517 1473 1436 1386 1351 1318 1276 1244 1208 1180 1153 1132 1100 1084 1063 1050 1044 1037 1044 1048 1063 1075 1096 1117 1144 1167 1191 1224 1246 1278 1316 1349 1371 + 1514 1484 1439 1407 1363 1325 1291 1252 1222 1193 1156 1135 1115 1092 1074 1063 1047 1050 1050 1060 1072 1088 1107 1123 1147 1169 1200 1232 1263 1287 1318 1356 1376 + 1533 1487 1447 1409 1373 1318 1291 1263 1224 1195 1165 1140 1117 1099 1081 1068 1053 1059 1059 1063 1083 1094 1113 1135 1156 1183 1206 1234 1263 1295 1330 1363 1391 + 1533 1496 1456 1417 1376 1332 1298 1265 1232 1198 1169 1144 1118 1100 1086 1074 1066 1062 1065 1071 1084 1096 1118 1137 1158 1189 1214 1242 1267 1304 1332 1361 1391 + 1555 1508 1467 1425 1373 1342 1307 1276 1238 1204 1189 1151 1135 1113 1100 1078 1077 1072 1077 1091 1092 1108 1130 1151 1169 1197 1222 1242 1269 1311 1349 1373 1409] + + + [ 1847 1794 1733 1690 1646 1610 1551 1516 1478 1447 1414 1391 1365 1343 1325 1308 1306 1313 1304 1313 1329 1332 1358 1370 1396 1417 1458 1478 1513 1554 1590 1642 1667 + 1803 1773 1721 1682 1621 1583 1532 1495 1461 1427 1396 1363 1351 1336 1315 1304 1297 1295 1304 1302 1313 1322 1341 1368 1393 1414 1433 1463 1504 1544 1570 1610 1653 + 1794 1733 1686 1646 1597 1551 1507 1472 1438 1406 1373 1346 1322 1304 1295 1275 1280 1275 1275 1273 1286 1304 1322 1339 1363 1388 1414 1447 1481 1523 1548 1583 1621 + 1765 1717 1675 1635 1577 1532 1492 1449 1427 1391 1358 1334 1311 1286 1273 1265 1262 1260 1252 1262 1269 1284 1306 1322 1348 1368 1396 1422 1463 1492 1529 1573 1604 + 1745 1694 1638 1600 1560 1516 1472 1436 1401 1370 1341 1308 1295 1265 1244 1240 1238 1238 1238 1242 1252 1262 1282 1304 1327 1353 1375 1403 1441 1478 1507 1538 1583 + 1705 1679 1624 1583 1538 1481 1452 1414 1388 1346 1322 1288 1275 1238 1231 1221 1210 1212 1214 1221 1231 1238 1265 1280 1299 1334 1358 1391 1414 1452 1489 1526 1551 + 1705 1653 1604 1560 1519 1484 1438 1398 1358 1339 1299 1271 1254 1240 1218 1206 1208 1200 1204 1208 1214 1227 1250 1267 1293 1315 1346 1370 1409 1441 1481 1513 1538 + 1679 1635 1590 1538 1498 1455 1422 1380 1343 1308 1286 1258 1236 1212 1204 1189 1183 1179 1176 1185 1202 1214 1233 1246 1273 1302 1332 1353 1383 1414 1449 1487 1516 + 1656 1614 1570 1526 1472 1438 1403 1365 1327 1295 1275 1242 1220 1200 1183 1174 1168 1161 1167 1176 1183 1200 1216 1227 1254 1269 1308 1332 1370 1401 1441 1469 1513 + 1642 1614 1564 1510 1458 1433 1388 1351 1315 1282 1248 1225 1202 1189 1172 1161 1151 1152 1152 1152 1170 1185 1196 1218 1236 1262 1293 1318 1363 1388 1419 1455 1489 + 1631 1583 1538 1492 1449 1409 1370 1336 1302 1267 1242 1212 1185 1167 1154 1140 1128 1132 1132 1142 1149 1161 1179 1204 1221 1248 1271 1304 1336 1365 1401 1438 1478 + 1610 1564 1519 1475 1438 1388 1356 1325 1288 1252 1225 1202 1178 1156 1145 1127 1117 1113 1120 1125 1138 1151 1176 1191 1212 1238 1265 1299 1325 1351 1396 1425 1466 + 1597 1544 1504 1466 1425 1380 1339 1306 1271 1244 1212 1183 1168 1145 1125 1113 1105 1097 1105 1107 1118 1135 1156 1172 1200 1229 1248 1282 1318 1348 1380 1409 1438 + 1583 1541 1495 1452 1409 1363 1332 1297 1267 1227 1196 1176 1151 1132 1113 1099 1089 1086 1094 1102 1115 1127 1144 1167 1185 1216 1242 1273 1302 1329 1368 1401 1422 + 1564 1538 1492 1441 1409 1353 1318 1293 1250 1221 1191 1168 1149 1115 1102 1092 1084 1081 1080 1092 1102 1117 1137 1156 1176 1200 1227 1267 1297 1327 1358 1388 1433 + 1570 1519 1472 1430 1380 1348 1315 1280 1240 1208 1183 1154 1133 1110 1091 1080 1069 1064 1064 1075 1077 1102 1118 1140 1161 1185 1221 1250 1282 1318 1348 1385 1403 + 1538 1513 1475 1422 1380 1339 1306 1275 1233 1208 1181 1144 1123 1103 1081 1068 1061 1056 1059 1066 1081 1097 1115 1133 1161 1191 1210 1236 1280 1306 1339 1370 1401 + 1557 1507 1463 1425 1383 1336 1293 1258 1225 1198 1165 1138 1113 1091 1068 1060 1051 1048 1048 1054 1072 1088 1108 1125 1154 1179 1212 1236 1269 1297 1334 1365 1401 + 1541 1489 1455 1409 1373 1327 1293 1254 1223 1185 1158 1135 1108 1091 1069 1056 1040 1035 1041 1051 1063 1077 1099 1117 1144 1170 1196 1223 1256 1295 1322 1353 1391 + 1541 1489 1447 1414 1360 1320 1293 1254 1221 1189 1156 1128 1105 1081 1068 1047 1041 1037 1035 1041 1063 1074 1095 1118 1142 1170 1196 1227 1265 1291 1318 1360 1393 + 1529 1489 1441 1393 1363 1315 1282 1254 1214 1183 1154 1125 1094 1075 1056 1044 1031 1031 1027 1032 1044 1068 1086 1110 1133 1165 1191 1220 1256 1284 1315 1348 1383 + 1523 1481 1438 1398 1358 1318 1284 1250 1214 1178 1152 1120 1099 1069 1053 1042 1032 1035 1030 1032 1048 1068 1091 1110 1142 1163 1191 1221 1246 1282 1313 1346 1388 + 1519 1472 1438 1401 1353 1308 1271 1248 1206 1178 1144 1120 1089 1069 1045 1032 1030 1028 1037 1035 1044 1061 1084 1112 1135 1163 1187 1218 1250 1277 1306 1346 1370 + 1526 1475 1433 1393 1360 1315 1277 1248 1206 1174 1138 1115 1092 1066 1050 1032 1027 1024 1031 1027 1048 1059 1083 1108 1135 1159 1187 1210 1246 1275 1311 1343 1378 + 1529 1481 1444 1401 1353 1313 1280 1246 1212 1181 1152 1120 1092 1071 1050 1034 1035 1030 1031 1034 1050 1064 1089 1113 1133 1159 1189 1218 1250 1280 1313 1346 1380 + 1519 1484 1438 1398 1353 1318 1273 1246 1210 1174 1147 1117 1092 1069 1053 1037 1030 1031 1032 1034 1048 1064 1086 1113 1137 1159 1189 1220 1248 1275 1304 1343 1373 + 1516 1487 1436 1396 1358 1325 1275 1246 1212 1181 1154 1123 1099 1077 1057 1044 1037 1028 1034 1040 1054 1071 1089 1112 1135 1167 1185 1220 1250 1284 1320 1351 1388 + 1532 1487 1444 1403 1358 1322 1291 1250 1214 1183 1151 1130 1105 1080 1064 1050 1041 1031 1038 1044 1057 1077 1092 1123 1142 1167 1194 1220 1254 1284 1322 1348 1388 + 1538 1484 1447 1411 1368 1329 1286 1252 1216 1189 1156 1132 1105 1083 1068 1053 1045 1044 1045 1051 1063 1072 1105 1118 1138 1174 1194 1221 1256 1286 1320 1358 1385 + 1538 1492 1455 1406 1370 1336 1295 1260 1220 1194 1168 1138 1115 1089 1075 1063 1051 1048 1050 1057 1069 1086 1108 1122 1156 1174 1202 1231 1269 1299 1322 1365 1396 + 1548 1504 1461 1422 1375 1336 1304 1260 1225 1198 1170 1142 1120 1094 1080 1072 1059 1057 1060 1066 1077 1094 1117 1133 1156 1183 1200 1242 1269 1295 1325 1365 1396 + 1557 1504 1461 1425 1391 1341 1308 1265 1227 1202 1170 1149 1122 1103 1088 1077 1066 1063 1066 1072 1083 1100 1122 1138 1159 1189 1220 1246 1275 1302 1334 1375 1401 + 1583 1519 1478 1430 1396 1348 1315 1288 1250 1208 1183 1156 1137 1115 1092 1086 1078 1074 1072 1084 1094 1107 1130 1140 1178 1194 1229 1246 1284 1313 1353 1378 1411] + + + [1725 1725 1657 1625 1604 1545 1499 1473 1456 1423 1399 1369 1347 1333 1312 1305 1292 1305 1312 1298 1312 1319 1333 1362 1384 1392 1423 1423 1482 1508 1527 1565 1574 + 1725 1714 1636 1604 1574 1527 1508 1465 1431 1407 1384 1362 1333 1319 1312 1285 1292 1285 1279 1298 1285 1312 1319 1340 1369 1392 1423 1439 1456 1499 1517 1574 1574 + 1691 1668 1615 1574 1545 1508 1473 1439 1407 1392 1369 1340 1319 1298 1292 1266 1266 1266 1272 1272 1292 1285 1305 1319 1340 1369 1384 1407 1448 1482 1491 1527 1565 + 1702 1646 1615 1565 1536 1499 1465 1415 1407 1369 1340 1319 1305 1285 1272 1260 1253 1247 1253 1253 1260 1272 1298 1305 1326 1347 1384 1392 1423 1456 1473 1517 1555 + 1679 1615 1574 1555 1508 1465 1456 1415 1377 1354 1319 1298 1279 1266 1253 1253 1235 1235 1235 1241 1247 1253 1272 1292 1312 1340 1354 1377 1399 1423 1465 1499 1517 + 1604 1615 1565 1508 1499 1465 1423 1407 1354 1326 1298 1285 1253 1253 1229 1229 1217 1205 1211 1223 1229 1241 1253 1272 1285 1319 1340 1354 1407 1415 1448 1473 1491 + 1604 1584 1555 1508 1473 1439 1415 1392 1362 1319 1298 1266 1247 1229 1223 1205 1194 1183 1205 1211 1211 1235 1253 1260 1272 1292 1319 1354 1369 1407 1431 1456 1499 + 1604 1584 1527 1491 1473 1423 1377 1354 1333 1305 1272 1247 1223 1211 1194 1183 1177 1183 1177 1183 1194 1211 1223 1241 1266 1272 1305 1326 1362 1392 1415 1439 1465 + 1604 1545 1517 1482 1448 1407 1377 1354 1326 1279 1266 1229 1211 1200 1183 1166 1166 1156 1166 1172 1183 1188 1211 1235 1253 1266 1279 1312 1340 1384 1392 1431 1465 + 1565 1536 1517 1473 1431 1399 1384 1326 1292 1272 1247 1223 1211 1188 1166 1161 1150 1145 1150 1156 1166 1177 1194 1217 1235 1253 1285 1305 1333 1362 1377 1423 1448 + 1574 1527 1499 1448 1415 1377 1354 1326 1285 1260 1217 1211 1188 1177 1150 1130 1140 1135 1140 1135 1150 1161 1177 1200 1217 1241 1266 1285 1312 1347 1377 1415 1415 + 1555 1517 1465 1448 1407 1377 1340 1305 1279 1247 1217 1200 1177 1156 1145 1135 1125 1125 1115 1120 1135 1150 1172 1188 1205 1229 1253 1285 1305 1326 1347 1384 1407 + 1517 1508 1465 1423 1384 1362 1319 1298 1260 1235 1205 1194 1161 1150 1125 1110 1115 1095 1115 1115 1115 1130 1150 1172 1200 1217 1235 1266 1292 1319 1340 1377 1392 + 1508 1491 1439 1415 1384 1347 1298 1285 1253 1229 1194 1172 1150 1125 1115 1100 1100 1081 1095 1095 1100 1120 1130 1161 1188 1205 1229 1266 1285 1298 1340 1369 1384 + 1517 1482 1448 1399 1369 1326 1312 1272 1247 1217 1188 1166 1140 1115 1105 1090 1086 1072 1086 1090 1095 1110 1135 1145 1177 1200 1223 1241 1285 1312 1340 1354 1369 + 1508 1473 1439 1392 1362 1319 1298 1266 1235 1200 1172 1150 1130 1105 1090 1081 1077 1067 1063 1063 1081 1090 1110 1145 1161 1183 1200 1229 1266 1285 1312 1326 1362 + 1491 1465 1423 1392 1347 1340 1292 1260 1229 1211 1177 1145 1120 1100 1090 1077 1072 1058 1063 1072 1090 1090 1120 1125 1156 1177 1200 1223 1247 1285 1319 1333 1362 + 1482 1448 1423 1377 1340 1312 1272 1247 1217 1194 1161 1135 1125 1095 1081 1063 1054 1054 1054 1058 1081 1090 1105 1120 1150 1177 1194 1223 1253 1266 1305 1333 1369 + 1482 1456 1407 1369 1347 1312 1272 1241 1205 1177 1150 1140 1110 1086 1072 1054 1045 1041 1041 1054 1063 1081 1095 1120 1135 1166 1183 1211 1247 1272 1292 1319 1340 + 1482 1448 1407 1369 1333 1305 1266 1241 1217 1188 1156 1135 1105 1086 1067 1050 1045 1041 1041 1054 1063 1081 1100 1110 1145 1161 1188 1205 1241 1272 1292 1319 1354 + 1456 1423 1392 1377 1326 1285 1253 1235 1205 1177 1145 1115 1100 1077 1058 1037 1045 1041 1028 1037 1041 1072 1081 1100 1130 1156 1177 1194 1223 1260 1292 1312 1340 + 1465 1431 1384 1369 1333 1285 1253 1229 1200 1177 1145 1110 1095 1072 1050 1028 1032 1037 1041 1037 1050 1058 1090 1115 1125 1150 1177 1205 1223 1247 1285 1312 1326 + 1465 1431 1399 1362 1326 1285 1266 1223 1194 1183 1140 1115 1090 1063 1050 1045 1037 1032 1037 1032 1050 1067 1081 1100 1125 1156 1177 1205 1229 1253 1285 1305 1354 + 1473 1423 1392 1354 1326 1285 1247 1217 1188 1166 1140 1115 1090 1058 1054 1028 1037 1032 1032 1024 1045 1058 1072 1095 1125 1135 1177 1200 1229 1241 1285 1305 1333 + 1482 1439 1399 1362 1326 1285 1260 1229 1200 1161 1140 1110 1095 1067 1045 1041 1032 1037 1028 1028 1045 1067 1081 1105 1135 1145 1172 1200 1235 1260 1285 1305 1326 + 1465 1439 1399 1362 1326 1292 1266 1223 1188 1166 1130 1110 1086 1067 1050 1032 1032 1028 1037 1032 1050 1063 1081 1100 1125 1150 1177 1194 1241 1260 1279 1305 1340 + 1456 1439 1399 1354 1326 1292 1260 1229 1205 1166 1135 1115 1095 1086 1050 1037 1032 1024 1041 1032 1050 1072 1086 1105 1140 1156 1172 1205 1223 1260 1292 1305 1326 + 1465 1431 1407 1369 1333 1298 1266 1241 1211 1166 1140 1115 1095 1077 1045 1041 1037 1037 1045 1041 1045 1058 1095 1110 1140 1156 1183 1200 1229 1266 1292 1312 1347 + 1473 1439 1399 1354 1333 1298 1272 1235 1211 1183 1140 1125 1105 1081 1067 1045 1032 1028 1041 1045 1067 1077 1090 1115 1135 1156 1183 1211 1217 1266 1285 1319 1333 + 1473 1439 1415 1377 1333 1305 1272 1241 1223 1183 1150 1140 1105 1090 1067 1058 1045 1050 1050 1050 1058 1081 1105 1115 1145 1161 1194 1217 1235 1266 1292 1340 1369 + 1465 1448 1415 1369 1347 1298 1279 1241 1217 1183 1161 1135 1105 1095 1072 1067 1063 1050 1050 1054 1072 1086 1105 1125 1140 1161 1194 1223 1247 1266 1292 1319 1362 + 1482 1439 1423 1392 1340 1319 1279 1253 1211 1194 1161 1145 1115 1095 1077 1063 1063 1058 1058 1067 1077 1086 1105 1120 1161 1172 1188 1235 1241 1279 1292 1326 1362 + 1482 1465 1431 1377 1354 1326 1292 1253 1229 1205 1172 1135 1130 1110 1090 1081 1067 1077 1067 1077 1086 1100 1125 1125 1150 1188 1200 1247 1247 1279 1305 1340 1369] + + + + + 1920x1080_D50_100 + + + 1920x1080 + + + D50 + + + [ 32] + + + [ 10] + + + [ 15] + + + [ 15] + + + [46 47 48 52 53 55 58 60 61 65 67 67 68 71 70 72 72 70 71 68 67 67 65 61 60 58 55 53 52 48 47 46] + + + [29 32 33 32 33 34 34 34 35 34 35 35 35 36 35 34] + + + [ 100] + + + [1888 1808 1760 1722 1667 1610 1583 1541 1478 1455 1424 1386 1362 1343 1320 1313 1298 1302 1291 1324 1320 1331 1370 1378 1407 1433 1451 1492 1531 1588 1604 1643 1691 + 1880 1822 1767 1715 1655 1621 1572 1516 1487 1451 1429 1386 1374 1343 1328 1309 1302 1298 1306 1309 1317 1339 1355 1374 1391 1429 1455 1492 1531 1567 1604 1643 1691 + 1843 1794 1741 1679 1632 1588 1536 1497 1464 1429 1399 1362 1343 1320 1295 1288 1284 1277 1288 1288 1295 1306 1324 1355 1374 1407 1429 1473 1497 1546 1572 1610 1649 + 1836 1760 1697 1643 1604 1567 1511 1473 1451 1399 1370 1339 1309 1302 1288 1267 1260 1263 1267 1270 1274 1288 1313 1328 1355 1374 1411 1446 1483 1506 1562 1588 1649 + 1774 1728 1685 1638 1588 1541 1497 1460 1416 1395 1358 1317 1298 1281 1260 1247 1240 1237 1247 1247 1257 1277 1291 1309 1335 1366 1399 1420 1469 1497 1541 1567 1610 + 1774 1715 1661 1604 1562 1521 1469 1433 1399 1362 1335 1302 1274 1260 1237 1230 1221 1221 1215 1224 1240 1253 1274 1291 1324 1339 1366 1407 1446 1478 1506 1551 1588 + 1734 1685 1632 1588 1541 1497 1460 1420 1374 1351 1313 1284 1253 1240 1221 1205 1199 1199 1208 1208 1211 1230 1257 1281 1298 1324 1351 1386 1420 1451 1492 1531 1567 + 1709 1673 1615 1567 1516 1478 1451 1403 1362 1331 1295 1270 1247 1215 1202 1193 1190 1178 1181 1190 1205 1202 1237 1260 1281 1309 1339 1378 1407 1442 1478 1506 1546 + 1697 1643 1610 1551 1502 1460 1424 1386 1343 1313 1281 1243 1221 1205 1193 1175 1163 1166 1166 1172 1184 1196 1221 1234 1274 1295 1320 1351 1386 1424 1455 1487 1536 + 1673 1615 1588 1526 1483 1442 1407 1358 1328 1291 1257 1227 1205 1187 1169 1158 1152 1146 1155 1152 1166 1178 1199 1227 1250 1267 1302 1335 1374 1399 1437 1478 1506 + 1661 1604 1562 1521 1478 1429 1391 1351 1306 1277 1250 1218 1199 1169 1158 1146 1135 1130 1130 1144 1152 1169 1190 1208 1234 1260 1284 1313 1347 1382 1429 1460 1497 + 1643 1588 1546 1502 1451 1407 1366 1331 1295 1260 1224 1202 1175 1155 1130 1119 1119 1119 1124 1124 1138 1146 1169 1196 1211 1240 1277 1298 1335 1366 1403 1442 1473 + 1626 1577 1546 1478 1451 1403 1358 1331 1277 1243 1224 1190 1163 1152 1122 1111 1103 1106 1109 1111 1122 1141 1155 1184 1202 1230 1260 1298 1335 1362 1399 1433 1464 + 1604 1567 1521 1483 1429 1391 1343 1306 1270 1237 1205 1178 1152 1130 1116 1098 1093 1088 1093 1098 1114 1130 1144 1163 1193 1221 1250 1281 1313 1355 1374 1416 1455 + 1593 1567 1506 1460 1424 1374 1335 1302 1263 1230 1196 1169 1144 1119 1101 1088 1076 1078 1076 1085 1101 1114 1135 1158 1184 1215 1240 1270 1298 1335 1358 1403 1437 + 1593 1541 1511 1455 1411 1366 1328 1284 1257 1221 1187 1158 1130 1103 1091 1078 1073 1056 1066 1073 1085 1101 1122 1144 1172 1196 1237 1253 1298 1328 1366 1399 1442 + 1583 1531 1492 1446 1391 1355 1313 1281 1237 1211 1178 1146 1119 1098 1080 1063 1059 1059 1059 1066 1076 1096 1119 1135 1163 1202 1221 1253 1284 1324 1355 1386 1411 + 1577 1536 1478 1446 1391 1347 1324 1267 1243 1208 1169 1146 1114 1096 1071 1061 1047 1049 1047 1056 1063 1085 1111 1133 1155 1178 1221 1250 1284 1313 1343 1382 1411 + 1572 1526 1478 1433 1391 1347 1313 1267 1224 1199 1169 1133 1111 1085 1066 1051 1042 1033 1040 1049 1063 1080 1103 1130 1146 1178 1205 1240 1274 1302 1339 1366 1407 + 1567 1526 1464 1429 1382 1331 1295 1263 1224 1193 1163 1130 1109 1080 1063 1047 1035 1033 1042 1038 1059 1078 1096 1116 1144 1178 1202 1237 1281 1306 1335 1366 1411 + 1567 1511 1460 1424 1374 1335 1295 1260 1218 1187 1152 1127 1103 1076 1056 1044 1035 1026 1033 1038 1049 1073 1098 1116 1144 1172 1199 1227 1257 1302 1335 1366 1395 + 1556 1506 1460 1424 1370 1328 1295 1253 1224 1193 1163 1116 1096 1073 1051 1042 1024 1024 1031 1035 1047 1068 1088 1114 1144 1166 1196 1221 1260 1295 1328 1355 1399 + 1556 1506 1464 1420 1378 1335 1298 1250 1218 1187 1152 1122 1096 1071 1047 1035 1033 1026 1033 1035 1044 1066 1096 1114 1135 1166 1193 1224 1260 1291 1331 1362 1391 + 1562 1502 1464 1420 1370 1335 1291 1257 1215 1187 1152 1116 1091 1076 1056 1038 1031 1026 1026 1035 1051 1068 1083 1116 1141 1169 1190 1227 1257 1295 1324 1362 1399 + 1551 1502 1460 1433 1374 1331 1291 1253 1211 1187 1146 1130 1098 1076 1056 1040 1031 1033 1024 1031 1049 1066 1085 1114 1135 1169 1208 1224 1270 1291 1324 1358 1399 + 1556 1526 1464 1420 1382 1335 1298 1260 1224 1196 1158 1130 1101 1078 1056 1047 1031 1033 1033 1038 1054 1073 1098 1119 1146 1169 1202 1234 1263 1298 1331 1370 1399 + 1562 1506 1469 1424 1386 1343 1306 1263 1218 1193 1155 1130 1101 1080 1061 1044 1040 1028 1028 1040 1056 1073 1101 1119 1152 1169 1199 1234 1270 1298 1339 1374 1407 + 1567 1526 1473 1437 1382 1335 1302 1260 1230 1196 1169 1135 1103 1085 1063 1051 1040 1042 1038 1051 1066 1080 1109 1122 1152 1181 1208 1240 1267 1298 1335 1378 1411 + 1588 1526 1469 1437 1399 1366 1309 1277 1237 1202 1172 1144 1109 1096 1073 1056 1047 1042 1051 1059 1068 1091 1109 1124 1158 1184 1218 1247 1284 1313 1351 1391 1411 + 1588 1531 1483 1442 1399 1355 1320 1284 1234 1202 1172 1146 1124 1101 1076 1068 1056 1051 1054 1066 1073 1093 1116 1135 1158 1196 1215 1253 1281 1313 1343 1391 1429 + 1604 1541 1492 1451 1403 1366 1328 1288 1243 1221 1187 1152 1124 1111 1091 1076 1068 1063 1068 1076 1091 1103 1116 1144 1178 1193 1221 1260 1295 1324 1355 1391 1424 + 1604 1546 1506 1460 1420 1374 1331 1284 1257 1221 1196 1163 1135 1114 1096 1085 1080 1076 1078 1078 1093 1114 1130 1158 1178 1218 1234 1270 1295 1335 1374 1403 1433 + 1583 1562 1506 1464 1424 1386 1335 1298 1260 1221 1199 1178 1135 1124 1109 1085 1091 1088 1080 1093 1101 1119 1144 1161 1187 1211 1237 1270 1320 1339 1378 1403 1455] + + + [1791 1740 1691 1645 1605 1557 1518 1487 1464 1414 1394 1363 1354 1324 1313 1309 1296 1293 1298 1296 1300 1322 1344 1358 1377 1404 1420 1459 1498 1518 1560 1592 1635 + 1775 1728 1680 1635 1595 1563 1512 1478 1446 1409 1380 1358 1333 1320 1298 1285 1285 1285 1289 1291 1293 1306 1328 1349 1370 1392 1422 1448 1473 1507 1548 1589 1608 + 1752 1688 1649 1612 1573 1533 1495 1459 1425 1397 1370 1335 1313 1298 1283 1279 1266 1260 1266 1273 1275 1289 1315 1331 1349 1370 1402 1430 1459 1492 1527 1560 1592 + 1725 1680 1618 1592 1548 1507 1470 1427 1404 1368 1340 1322 1296 1275 1260 1252 1244 1244 1242 1250 1258 1270 1283 1315 1326 1354 1382 1404 1435 1473 1501 1539 1570 + 1702 1663 1615 1570 1536 1498 1454 1414 1392 1356 1328 1296 1275 1264 1246 1237 1231 1227 1227 1231 1244 1252 1270 1287 1313 1333 1358 1394 1420 1459 1487 1518 1557 + 1688 1632 1589 1551 1504 1473 1432 1399 1370 1335 1309 1287 1258 1240 1227 1217 1206 1208 1214 1214 1217 1231 1252 1264 1298 1315 1340 1372 1407 1432 1462 1495 1527 + 1666 1605 1567 1521 1481 1448 1412 1375 1347 1320 1285 1260 1242 1221 1206 1199 1186 1186 1188 1204 1210 1214 1237 1252 1270 1298 1320 1356 1387 1420 1451 1475 1507 + 1649 1602 1554 1512 1478 1432 1392 1368 1331 1302 1264 1238 1223 1208 1193 1183 1179 1176 1177 1184 1190 1197 1223 1237 1258 1281 1309 1340 1365 1397 1435 1464 1504 + 1618 1573 1536 1492 1456 1417 1385 1342 1309 1289 1252 1227 1202 1192 1170 1167 1162 1153 1158 1158 1176 1188 1202 1223 1244 1268 1293 1324 1351 1392 1404 1440 1475 + 1605 1557 1524 1481 1440 1404 1370 1328 1302 1268 1240 1216 1197 1179 1158 1148 1138 1141 1145 1148 1160 1163 1188 1208 1231 1254 1281 1309 1342 1368 1397 1438 1464 + 1589 1551 1509 1470 1430 1385 1358 1324 1289 1254 1225 1202 1179 1162 1145 1136 1122 1127 1128 1135 1143 1158 1174 1190 1216 1238 1268 1291 1322 1351 1382 1414 1448 + 1573 1536 1495 1446 1412 1372 1333 1311 1273 1244 1217 1192 1167 1150 1132 1117 1109 1108 1116 1119 1132 1140 1163 1181 1199 1233 1258 1275 1311 1337 1368 1397 1435 + 1563 1524 1481 1448 1399 1365 1324 1298 1264 1233 1206 1179 1158 1130 1122 1106 1100 1101 1100 1106 1120 1133 1145 1169 1193 1221 1240 1275 1302 1333 1358 1394 1427 + 1554 1512 1470 1425 1392 1347 1324 1285 1250 1223 1192 1165 1143 1125 1106 1092 1092 1086 1089 1094 1103 1119 1136 1158 1177 1201 1233 1252 1289 1322 1342 1380 1417 + 1536 1498 1459 1422 1382 1347 1309 1281 1242 1206 1184 1158 1132 1114 1094 1082 1077 1074 1071 1085 1094 1108 1128 1150 1176 1197 1223 1248 1275 1311 1347 1368 1404 + 1545 1495 1451 1417 1377 1337 1300 1262 1237 1204 1177 1146 1120 1109 1086 1067 1064 1060 1060 1074 1085 1100 1117 1141 1162 1190 1212 1240 1270 1298 1324 1356 1392 + 1515 1478 1440 1404 1368 1331 1296 1260 1223 1190 1167 1136 1116 1085 1076 1060 1056 1049 1057 1057 1070 1088 1108 1123 1157 1170 1204 1231 1258 1291 1315 1354 1382 + 1524 1475 1435 1404 1354 1328 1289 1254 1221 1190 1167 1130 1109 1091 1073 1057 1046 1042 1051 1056 1070 1088 1103 1123 1150 1176 1197 1229 1260 1283 1320 1349 1382 + 1504 1473 1430 1389 1356 1315 1277 1242 1210 1184 1150 1130 1101 1079 1060 1047 1038 1032 1040 1046 1057 1073 1094 1112 1145 1163 1195 1223 1250 1273 1313 1342 1368 + 1501 1464 1422 1377 1347 1309 1273 1242 1210 1181 1148 1120 1098 1074 1060 1039 1028 1025 1031 1040 1049 1071 1085 1114 1133 1162 1186 1217 1248 1268 1309 1333 1368 + 1492 1454 1414 1382 1337 1304 1268 1240 1202 1176 1145 1114 1089 1069 1053 1040 1032 1031 1029 1042 1049 1063 1082 1114 1132 1160 1188 1210 1238 1268 1298 1335 1361 + 1492 1456 1412 1377 1333 1298 1273 1235 1202 1172 1143 1112 1089 1063 1049 1031 1028 1024 1032 1031 1040 1061 1085 1108 1128 1157 1181 1214 1238 1266 1296 1331 1361 + 1495 1454 1409 1370 1333 1304 1266 1237 1202 1172 1143 1114 1091 1071 1047 1032 1028 1025 1031 1031 1047 1064 1080 1101 1128 1157 1181 1212 1242 1270 1293 1331 1361 + 1487 1451 1417 1377 1337 1304 1264 1229 1199 1177 1141 1112 1085 1070 1046 1027 1025 1024 1029 1033 1039 1061 1083 1106 1127 1153 1177 1212 1231 1264 1296 1328 1358 + 1498 1454 1417 1380 1340 1296 1266 1229 1201 1176 1140 1114 1085 1066 1046 1028 1032 1025 1029 1031 1046 1061 1077 1105 1125 1157 1184 1214 1231 1260 1296 1331 1354 + 1501 1456 1425 1382 1340 1298 1262 1233 1208 1179 1151 1116 1095 1067 1053 1040 1029 1028 1031 1032 1051 1060 1091 1109 1135 1153 1186 1214 1242 1270 1300 1333 1361 + 1492 1464 1412 1380 1342 1306 1275 1240 1204 1172 1145 1116 1095 1071 1051 1038 1033 1028 1028 1033 1053 1066 1082 1109 1130 1155 1190 1217 1242 1273 1298 1337 1365 + 1495 1464 1427 1389 1349 1315 1285 1237 1206 1184 1151 1122 1097 1080 1058 1046 1035 1033 1032 1043 1057 1070 1092 1117 1145 1160 1190 1217 1244 1277 1306 1335 1368 + 1507 1470 1432 1387 1354 1317 1279 1246 1208 1186 1158 1132 1103 1088 1069 1047 1044 1038 1039 1050 1070 1077 1097 1122 1145 1169 1193 1217 1254 1283 1311 1349 1375 + 1518 1470 1435 1394 1354 1315 1281 1252 1216 1183 1155 1130 1109 1092 1070 1054 1049 1042 1049 1056 1067 1085 1100 1122 1146 1169 1201 1225 1260 1287 1315 1342 1377 + 1521 1484 1443 1404 1365 1333 1287 1264 1219 1199 1167 1145 1123 1098 1085 1067 1061 1056 1061 1063 1079 1092 1111 1127 1155 1183 1210 1233 1262 1291 1322 1351 1387 + 1533 1492 1446 1409 1368 1335 1300 1264 1233 1199 1172 1145 1127 1103 1088 1073 1067 1067 1061 1073 1082 1097 1116 1140 1160 1186 1217 1237 1264 1302 1335 1361 1382 + 1542 1498 1448 1417 1368 1340 1300 1273 1238 1210 1179 1151 1128 1111 1094 1080 1073 1070 1076 1079 1094 1100 1123 1148 1170 1192 1216 1248 1277 1304 1324 1358 1394] + + + [1804 1744 1710 1656 1622 1589 1542 1501 1459 1432 1402 1368 1354 1340 1324 1306 1302 1300 1298 1311 1315 1328 1342 1363 1385 1414 1443 1464 1504 1533 1570 1608 1656 + 1800 1744 1699 1656 1612 1560 1521 1489 1446 1420 1387 1365 1342 1324 1304 1293 1291 1281 1289 1291 1304 1311 1328 1358 1375 1402 1432 1456 1489 1524 1554 1592 1628 + 1763 1717 1670 1618 1579 1545 1498 1478 1432 1397 1368 1344 1313 1302 1287 1273 1262 1264 1268 1268 1281 1291 1313 1331 1356 1380 1412 1435 1462 1501 1530 1573 1605 + 1748 1695 1649 1612 1560 1509 1478 1443 1407 1375 1347 1322 1300 1277 1262 1256 1248 1248 1240 1254 1266 1275 1293 1315 1331 1363 1389 1412 1443 1481 1515 1542 1582 + 1728 1677 1632 1579 1536 1504 1462 1432 1392 1368 1333 1304 1279 1266 1238 1231 1231 1223 1231 1235 1246 1262 1273 1289 1320 1337 1370 1394 1432 1459 1492 1527 1554 + 1702 1652 1605 1570 1518 1487 1440 1399 1370 1342 1313 1285 1262 1248 1233 1225 1214 1206 1210 1217 1221 1237 1258 1275 1302 1322 1344 1380 1404 1440 1475 1507 1551 + 1680 1628 1579 1539 1504 1467 1420 1392 1347 1320 1291 1266 1244 1227 1212 1199 1192 1192 1188 1204 1208 1216 1246 1254 1279 1306 1328 1358 1397 1425 1462 1495 1530 + 1656 1618 1563 1524 1484 1443 1414 1368 1337 1311 1277 1252 1229 1206 1195 1192 1179 1181 1176 1186 1195 1208 1217 1235 1266 1285 1317 1342 1370 1407 1451 1475 1504 + 1649 1602 1545 1512 1459 1427 1394 1354 1324 1291 1266 1233 1210 1193 1177 1165 1160 1160 1160 1163 1172 1190 1204 1233 1248 1268 1296 1328 1358 1385 1414 1448 1487 + 1618 1592 1539 1495 1451 1407 1380 1344 1311 1279 1248 1221 1199 1179 1163 1151 1140 1146 1143 1151 1167 1176 1190 1206 1233 1264 1279 1315 1344 1368 1409 1446 1478 + 1612 1570 1518 1484 1435 1407 1361 1328 1298 1264 1231 1212 1184 1165 1148 1136 1133 1128 1130 1138 1145 1155 1181 1197 1223 1242 1275 1302 1331 1363 1389 1427 1456 + 1589 1551 1501 1467 1422 1380 1349 1315 1273 1250 1221 1188 1165 1146 1135 1119 1112 1112 1116 1116 1135 1148 1163 1186 1204 1237 1258 1287 1309 1347 1387 1414 1440 + 1567 1536 1501 1451 1414 1370 1335 1300 1268 1237 1206 1177 1158 1148 1119 1117 1101 1098 1108 1109 1117 1132 1153 1176 1193 1219 1244 1266 1302 1337 1372 1399 1425 + 1560 1521 1487 1438 1397 1365 1324 1285 1254 1223 1195 1174 1150 1130 1109 1100 1085 1088 1089 1097 1109 1127 1138 1163 1181 1208 1235 1264 1291 1328 1356 1392 1422 + 1563 1524 1473 1430 1392 1358 1315 1279 1248 1212 1193 1162 1140 1117 1100 1088 1077 1074 1074 1086 1097 1108 1130 1153 1176 1204 1227 1260 1283 1317 1347 1377 1407 + 1536 1507 1462 1425 1382 1344 1313 1277 1237 1212 1176 1151 1128 1103 1086 1073 1067 1067 1063 1071 1083 1103 1119 1140 1163 1186 1217 1242 1277 1306 1333 1370 1387 + 1539 1501 1456 1412 1375 1335 1298 1260 1231 1206 1165 1133 1123 1092 1077 1064 1057 1051 1058 1063 1074 1089 1108 1130 1160 1186 1208 1242 1266 1300 1331 1358 1387 + 1527 1489 1451 1409 1370 1326 1296 1256 1229 1195 1162 1140 1119 1097 1070 1060 1051 1050 1046 1054 1069 1083 1106 1130 1150 1174 1206 1231 1262 1291 1324 1356 1382 + 1533 1478 1438 1402 1361 1322 1283 1256 1219 1188 1160 1132 1105 1086 1067 1050 1044 1039 1039 1046 1066 1076 1100 1119 1145 1170 1195 1229 1252 1283 1311 1351 1382 + 1527 1475 1432 1397 1354 1317 1289 1244 1216 1184 1150 1125 1098 1077 1060 1043 1039 1031 1029 1040 1057 1071 1089 1116 1133 1165 1193 1221 1250 1283 1309 1347 1377 + 1509 1470 1430 1392 1349 1317 1275 1250 1212 1181 1146 1119 1100 1071 1051 1038 1032 1028 1027 1035 1051 1066 1083 1119 1135 1158 1190 1217 1240 1283 1309 1337 1370 + 1509 1470 1427 1389 1354 1315 1273 1238 1201 1174 1146 1120 1094 1067 1049 1029 1028 1028 1024 1032 1050 1063 1082 1108 1133 1162 1186 1210 1244 1281 1302 1340 1370 + 1501 1473 1427 1394 1347 1315 1275 1237 1206 1176 1135 1116 1089 1069 1049 1032 1032 1028 1028 1028 1050 1063 1085 1105 1127 1162 1190 1214 1246 1273 1302 1331 1358 + 1507 1467 1420 1382 1344 1304 1270 1235 1197 1167 1141 1122 1091 1069 1050 1028 1025 1028 1033 1027 1043 1058 1085 1109 1135 1150 1186 1206 1235 1270 1302 1326 1365 + 1504 1470 1425 1382 1347 1309 1273 1240 1210 1176 1138 1114 1094 1061 1044 1033 1032 1027 1029 1033 1043 1061 1085 1109 1130 1155 1183 1210 1238 1268 1306 1335 1363 + 1504 1464 1427 1387 1347 1317 1273 1240 1208 1179 1145 1117 1088 1071 1049 1036 1029 1033 1029 1033 1051 1067 1086 1111 1133 1157 1184 1214 1238 1279 1309 1342 1372 + 1509 1473 1422 1387 1347 1313 1277 1238 1204 1177 1146 1120 1098 1074 1051 1039 1035 1032 1031 1039 1050 1070 1089 1111 1133 1165 1188 1216 1244 1273 1302 1342 1380 + 1530 1473 1438 1392 1358 1313 1277 1246 1214 1184 1148 1123 1103 1074 1061 1043 1039 1033 1039 1043 1053 1070 1092 1112 1140 1167 1193 1225 1248 1279 1313 1351 1377 + 1521 1478 1443 1404 1358 1320 1289 1248 1225 1183 1157 1132 1108 1088 1067 1051 1042 1043 1042 1051 1061 1074 1098 1120 1148 1174 1195 1221 1256 1285 1315 1344 1375 + 1533 1484 1440 1399 1358 1326 1289 1254 1217 1190 1163 1133 1108 1085 1071 1063 1049 1043 1050 1057 1070 1083 1105 1125 1150 1176 1202 1235 1258 1285 1320 1354 1385 + 1530 1487 1446 1412 1372 1337 1289 1264 1233 1199 1163 1140 1123 1098 1080 1067 1060 1054 1061 1069 1082 1097 1111 1136 1160 1181 1206 1240 1264 1302 1328 1365 1402 + 1548 1498 1454 1425 1377 1335 1298 1264 1233 1208 1174 1146 1127 1105 1086 1077 1064 1066 1061 1076 1083 1101 1125 1141 1162 1188 1214 1242 1266 1302 1335 1365 1402 + 1560 1515 1473 1432 1385 1342 1309 1279 1242 1210 1184 1151 1122 1109 1098 1083 1077 1069 1076 1080 1097 1109 1122 1146 1162 1195 1216 1244 1283 1311 1333 1372 1399] + + + [1708 1708 1669 1625 1562 1556 1497 1467 1434 1401 1379 1350 1337 1325 1313 1294 1294 1290 1282 1286 1286 1313 1325 1337 1371 1388 1420 1434 1462 1482 1518 1567 1596 + 1742 1682 1638 1596 1567 1524 1497 1443 1424 1406 1362 1350 1321 1301 1290 1286 1279 1275 1279 1282 1286 1294 1313 1325 1362 1375 1397 1438 1457 1487 1524 1545 1584 + 1695 1656 1613 1579 1540 1497 1472 1438 1397 1375 1350 1329 1305 1294 1275 1260 1249 1256 1260 1253 1271 1275 1290 1309 1333 1358 1393 1406 1434 1467 1497 1518 1556 + 1669 1625 1602 1562 1534 1487 1457 1410 1384 1358 1333 1313 1290 1271 1256 1242 1235 1239 1235 1249 1249 1267 1279 1301 1317 1333 1366 1393 1424 1443 1472 1513 1540 + 1663 1625 1573 1540 1508 1462 1434 1401 1375 1333 1309 1294 1264 1253 1235 1228 1218 1218 1215 1232 1235 1256 1267 1279 1309 1321 1345 1384 1401 1434 1448 1492 1524 + 1644 1596 1551 1513 1487 1457 1410 1384 1358 1321 1297 1264 1249 1235 1211 1208 1201 1205 1191 1201 1215 1228 1249 1271 1286 1305 1321 1354 1388 1397 1438 1472 1508 + 1625 1579 1556 1503 1457 1429 1397 1371 1341 1309 1275 1260 1239 1218 1201 1195 1185 1185 1182 1195 1198 1215 1228 1246 1260 1290 1305 1337 1362 1410 1415 1457 1487 + 1590 1567 1524 1487 1462 1424 1393 1354 1321 1294 1264 1242 1221 1198 1188 1172 1169 1169 1166 1172 1185 1198 1208 1239 1256 1282 1294 1321 1354 1388 1410 1434 1472 + 1602 1556 1513 1477 1434 1401 1366 1337 1305 1271 1246 1218 1208 1188 1172 1166 1157 1148 1148 1160 1179 1182 1201 1221 1242 1260 1279 1309 1341 1362 1388 1415 1448 + 1579 1540 1503 1457 1429 1379 1366 1317 1297 1264 1239 1218 1191 1172 1163 1151 1142 1136 1136 1142 1160 1163 1185 1195 1221 1246 1271 1297 1321 1350 1375 1410 1424 + 1556 1529 1477 1448 1406 1388 1345 1313 1282 1264 1221 1201 1175 1166 1139 1136 1121 1124 1121 1127 1136 1154 1169 1191 1218 1228 1260 1286 1317 1341 1366 1397 1424 + 1534 1508 1467 1429 1388 1366 1333 1301 1267 1232 1205 1188 1160 1145 1130 1124 1107 1107 1110 1113 1130 1142 1151 1169 1191 1218 1239 1267 1297 1329 1350 1379 1406 + 1551 1497 1462 1429 1375 1354 1317 1290 1253 1239 1205 1179 1154 1136 1110 1101 1104 1090 1101 1107 1118 1127 1151 1169 1195 1205 1235 1253 1279 1313 1341 1375 1397 + 1524 1477 1448 1406 1375 1341 1305 1271 1242 1218 1191 1169 1142 1118 1104 1093 1085 1080 1085 1093 1104 1113 1124 1148 1172 1201 1221 1253 1264 1305 1325 1362 1388 + 1518 1472 1443 1401 1371 1329 1294 1275 1242 1218 1182 1160 1136 1113 1093 1082 1077 1069 1077 1080 1093 1096 1127 1142 1172 1182 1218 1239 1264 1294 1321 1350 1384 + 1497 1462 1420 1393 1350 1317 1286 1260 1232 1201 1166 1151 1124 1101 1088 1072 1066 1059 1069 1069 1082 1104 1110 1130 1157 1185 1201 1228 1249 1286 1321 1341 1371 + 1492 1453 1415 1379 1350 1317 1282 1246 1218 1191 1160 1136 1113 1096 1072 1061 1051 1051 1056 1061 1074 1088 1104 1121 1148 1169 1198 1221 1253 1275 1305 1329 1354 + 1472 1453 1420 1379 1345 1309 1286 1249 1218 1182 1163 1130 1113 1088 1074 1051 1049 1046 1051 1059 1069 1085 1104 1118 1148 1163 1195 1221 1242 1275 1297 1329 1362 + 1477 1434 1401 1371 1337 1309 1271 1242 1205 1191 1148 1118 1104 1077 1061 1046 1044 1031 1039 1051 1064 1074 1088 1113 1139 1160 1185 1215 1242 1267 1290 1329 1354 + 1482 1434 1401 1371 1329 1294 1260 1225 1205 1163 1142 1124 1099 1066 1054 1039 1034 1029 1031 1034 1046 1066 1088 1107 1127 1154 1182 1211 1235 1256 1282 1321 1350 + 1457 1434 1401 1354 1329 1294 1264 1228 1191 1160 1142 1107 1093 1072 1056 1041 1029 1031 1029 1036 1051 1061 1080 1101 1124 1154 1179 1208 1221 1253 1290 1313 1337 + 1457 1434 1397 1358 1329 1294 1260 1221 1195 1157 1139 1115 1099 1069 1049 1026 1026 1029 1034 1029 1039 1064 1077 1099 1121 1145 1172 1195 1225 1264 1267 1305 1325 + 1477 1434 1393 1354 1325 1297 1253 1228 1195 1166 1136 1113 1085 1066 1044 1031 1031 1029 1031 1034 1044 1059 1077 1099 1121 1148 1179 1198 1225 1249 1275 1301 1341 + 1477 1438 1393 1354 1321 1275 1256 1218 1188 1166 1136 1104 1085 1056 1044 1031 1026 1029 1026 1026 1039 1054 1082 1096 1121 1145 1163 1191 1225 1253 1271 1301 1337 + 1467 1429 1393 1358 1325 1294 1249 1225 1188 1163 1133 1104 1085 1059 1044 1034 1026 1026 1026 1029 1044 1059 1072 1099 1124 1142 1166 1191 1221 1253 1275 1305 1329 + 1477 1434 1401 1354 1329 1294 1264 1228 1188 1166 1133 1104 1082 1064 1046 1029 1024 1034 1034 1036 1041 1056 1080 1099 1127 1145 1179 1198 1228 1256 1282 1313 1337 + 1467 1434 1397 1362 1321 1282 1256 1228 1188 1169 1136 1110 1088 1072 1049 1036 1026 1026 1029 1034 1041 1066 1082 1101 1121 1148 1175 1198 1221 1249 1279 1305 1329 + 1472 1438 1388 1371 1321 1301 1260 1228 1195 1166 1145 1121 1090 1074 1054 1041 1031 1026 1034 1044 1059 1069 1090 1104 1136 1151 1179 1208 1239 1249 1294 1313 1345 + 1492 1453 1406 1375 1329 1309 1267 1235 1205 1175 1142 1124 1096 1072 1061 1044 1039 1034 1036 1044 1059 1069 1085 1121 1130 1163 1185 1208 1232 1267 1297 1313 1350 + 1477 1453 1401 1371 1341 1301 1267 1239 1205 1188 1154 1121 1099 1088 1061 1051 1044 1046 1039 1049 1056 1074 1096 1115 1142 1154 1188 1208 1235 1267 1294 1321 1354 + 1492 1448 1420 1384 1350 1313 1275 1242 1215 1188 1166 1130 1104 1088 1072 1066 1054 1049 1054 1061 1069 1082 1101 1121 1145 1175 1191 1215 1239 1275 1301 1325 1366 + 1497 1457 1424 1388 1354 1317 1282 1249 1215 1191 1172 1136 1113 1090 1085 1072 1054 1056 1059 1064 1080 1085 1110 1124 1154 1179 1198 1221 1249 1282 1309 1337 1345 + 1482 1462 1420 1388 1354 1321 1294 1242 1215 1208 1166 1148 1124 1099 1090 1082 1069 1069 1056 1072 1090 1096 1110 1133 1151 1175 1195 1235 1264 1290 1313 1341 1375] + + + + + 1920x1080_D65_100 + + + 1920x1080 + + + D65 + + + [ 32] + + + [ 10] + + + [ 15] + + + [ 15] + + + [45 48 50 51 54 56 59 60 62 62 64 66 69 70 73 71 71 73 70 69 66 64 62 62 60 59 56 54 51 50 48 45] + + + [31 32 32 33 32 34 33 34 34 35 36 34 35 35 36 34] + + + [ 100] + + + [1871 1791 1739 1725 1657 1600 1547 1530 1472 1461 1422 1384 1375 1336 1332 1315 1303 1303 1311 1311 1319 1345 1362 1375 1403 1427 1451 1487 1519 1565 1606 1631 1650 + 1838 1799 1754 1690 1638 1594 1553 1519 1487 1436 1412 1380 1353 1328 1319 1311 1299 1287 1299 1303 1315 1319 1353 1358 1375 1417 1436 1482 1519 1547 1594 1619 1670 + 1806 1783 1718 1663 1631 1570 1530 1492 1456 1417 1398 1362 1340 1311 1299 1287 1279 1283 1279 1279 1291 1311 1332 1349 1375 1389 1427 1461 1492 1536 1565 1606 1638 + 1799 1754 1697 1638 1594 1553 1498 1472 1432 1389 1366 1349 1311 1295 1271 1264 1256 1256 1253 1260 1275 1287 1311 1323 1358 1380 1408 1432 1466 1508 1542 1582 1625 + 1783 1718 1663 1613 1565 1530 1482 1446 1412 1375 1353 1319 1299 1268 1256 1241 1231 1238 1234 1241 1249 1256 1275 1299 1328 1362 1375 1417 1456 1482 1514 1559 1594 + 1746 1690 1644 1600 1559 1514 1456 1436 1394 1353 1328 1299 1275 1253 1234 1227 1223 1213 1231 1231 1241 1253 1271 1291 1323 1345 1362 1394 1436 1472 1519 1542 1559 + 1732 1683 1625 1582 1525 1487 1446 1412 1371 1328 1311 1279 1264 1238 1220 1206 1196 1199 1199 1209 1216 1238 1256 1264 1283 1319 1358 1375 1408 1441 1482 1530 1559 + 1711 1657 1600 1559 1514 1472 1432 1394 1353 1319 1291 1264 1238 1220 1206 1189 1192 1182 1179 1189 1192 1213 1234 1256 1271 1299 1332 1371 1394 1432 1466 1498 1547 + 1690 1638 1600 1547 1492 1461 1417 1371 1340 1307 1271 1245 1220 1199 1186 1169 1169 1163 1169 1172 1186 1196 1216 1234 1268 1291 1323 1349 1375 1412 1451 1482 1525 + 1677 1613 1570 1530 1477 1432 1398 1349 1319 1287 1260 1227 1206 1182 1169 1147 1144 1147 1141 1153 1176 1179 1206 1216 1238 1268 1303 1332 1358 1394 1432 1472 1508 + 1663 1606 1542 1519 1461 1427 1384 1353 1307 1275 1241 1220 1196 1176 1153 1144 1128 1141 1134 1144 1153 1172 1189 1199 1227 1256 1295 1323 1340 1389 1417 1461 1487 + 1631 1588 1542 1492 1446 1403 1371 1328 1295 1260 1227 1199 1172 1159 1144 1125 1116 1116 1122 1119 1134 1150 1163 1189 1216 1231 1264 1299 1336 1366 1403 1441 1477 + 1606 1576 1519 1482 1436 1398 1353 1319 1279 1249 1209 1192 1166 1137 1128 1113 1102 1102 1099 1110 1122 1137 1150 1179 1209 1231 1256 1287 1323 1353 1389 1427 1461 + 1606 1559 1514 1461 1427 1389 1345 1299 1275 1241 1199 1179 1153 1134 1113 1102 1093 1093 1090 1105 1113 1125 1144 1176 1192 1216 1238 1275 1311 1349 1371 1417 1446 + 1594 1553 1508 1456 1412 1366 1328 1291 1256 1216 1189 1166 1141 1116 1102 1090 1076 1074 1082 1085 1102 1113 1131 1153 1182 1206 1234 1264 1299 1332 1371 1403 1446 + 1576 1542 1503 1451 1408 1362 1328 1291 1245 1213 1189 1159 1137 1110 1090 1082 1065 1060 1063 1076 1090 1099 1119 1144 1169 1199 1223 1253 1291 1323 1362 1394 1432 + 1582 1530 1487 1436 1398 1358 1315 1271 1245 1216 1179 1153 1128 1105 1082 1063 1055 1060 1055 1057 1085 1093 1122 1134 1166 1186 1216 1256 1279 1311 1349 1389 1417 + 1565 1530 1472 1427 1389 1349 1311 1268 1238 1202 1172 1137 1116 1096 1074 1060 1047 1044 1047 1052 1065 1088 1105 1131 1156 1186 1213 1234 1275 1311 1336 1380 1412 + 1553 1519 1466 1427 1389 1340 1307 1264 1234 1199 1169 1147 1110 1093 1065 1057 1042 1037 1037 1050 1063 1082 1099 1122 1150 1179 1206 1241 1275 1311 1336 1371 1403 + 1547 1498 1466 1412 1375 1332 1291 1245 1213 1189 1159 1125 1105 1082 1063 1050 1042 1037 1037 1044 1063 1074 1096 1113 1141 1163 1192 1223 1260 1295 1323 1362 1403 + 1536 1514 1466 1412 1371 1328 1283 1264 1220 1186 1156 1125 1108 1076 1057 1044 1032 1029 1032 1044 1063 1076 1090 1113 1134 1169 1192 1227 1260 1291 1328 1366 1394 + 1553 1508 1456 1412 1371 1328 1295 1253 1213 1182 1153 1128 1099 1076 1060 1039 1034 1032 1032 1037 1047 1068 1085 1113 1144 1166 1189 1220 1260 1295 1323 1353 1394 + 1547 1492 1456 1417 1371 1328 1287 1253 1216 1179 1150 1125 1093 1076 1052 1037 1034 1032 1032 1032 1044 1063 1090 1110 1134 1172 1189 1231 1249 1283 1323 1358 1389 + 1553 1503 1461 1417 1371 1319 1291 1256 1209 1182 1153 1131 1099 1071 1055 1037 1032 1037 1029 1034 1047 1071 1093 1110 1137 1163 1189 1223 1256 1291 1319 1358 1394 + 1547 1492 1461 1422 1362 1328 1283 1264 1223 1182 1150 1122 1096 1076 1055 1034 1032 1029 1024 1029 1047 1065 1088 1116 1134 1166 1196 1220 1260 1291 1328 1358 1389 + 1553 1508 1472 1422 1375 1332 1299 1253 1220 1189 1153 1122 1096 1079 1060 1042 1029 1032 1029 1037 1057 1068 1090 1113 1141 1176 1196 1238 1264 1299 1328 1366 1403 + 1559 1519 1466 1417 1375 1336 1287 1260 1216 1192 1153 1131 1108 1082 1065 1044 1037 1034 1034 1037 1057 1079 1099 1119 1144 1169 1202 1234 1268 1299 1332 1371 1408 + 1559 1525 1466 1417 1371 1332 1303 1253 1223 1196 1166 1131 1102 1085 1071 1052 1042 1042 1037 1050 1057 1082 1102 1122 1144 1176 1202 1234 1264 1299 1332 1362 1394 + 1559 1514 1477 1432 1389 1340 1307 1275 1238 1202 1169 1137 1125 1099 1071 1063 1047 1047 1050 1052 1074 1090 1102 1131 1159 1179 1213 1249 1279 1307 1349 1380 1427 + 1570 1530 1487 1432 1394 1349 1307 1271 1238 1206 1163 1150 1119 1099 1082 1063 1052 1050 1047 1071 1079 1096 1116 1134 1163 1189 1216 1245 1287 1323 1353 1384 1417 + 1582 1536 1492 1446 1408 1362 1319 1291 1253 1216 1182 1150 1128 1105 1085 1074 1071 1060 1063 1076 1093 1099 1122 1141 1169 1199 1220 1260 1283 1319 1349 1394 1432 + 1588 1542 1503 1451 1403 1371 1328 1291 1260 1220 1192 1163 1137 1122 1099 1090 1074 1071 1076 1085 1090 1110 1131 1153 1179 1206 1238 1264 1295 1332 1362 1408 1432 + 1606 1542 1503 1472 1408 1380 1323 1307 1260 1234 1202 1159 1153 1119 1108 1090 1088 1082 1090 1099 1102 1122 1147 1156 1172 1209 1238 1279 1299 1332 1371 1412 1412] + + + [1776 1738 1691 1650 1594 1552 1517 1481 1449 1424 1387 1371 1352 1324 1317 1306 1292 1284 1290 1294 1306 1321 1334 1359 1382 1387 1439 1454 1486 1517 1543 1594 1620 + 1765 1727 1680 1626 1588 1552 1508 1470 1436 1406 1385 1354 1332 1315 1300 1290 1284 1276 1284 1282 1292 1304 1324 1345 1361 1389 1414 1446 1470 1503 1543 1582 1604 + 1727 1702 1656 1614 1567 1520 1483 1449 1416 1385 1366 1339 1315 1300 1284 1266 1264 1256 1264 1266 1276 1300 1304 1328 1350 1368 1389 1419 1462 1489 1523 1558 1591 + 1709 1674 1623 1582 1552 1511 1462 1429 1389 1366 1341 1313 1290 1268 1262 1248 1244 1237 1242 1248 1250 1272 1286 1311 1328 1343 1378 1409 1429 1467 1494 1534 1561 + 1691 1663 1604 1567 1520 1475 1439 1409 1375 1348 1319 1300 1280 1260 1242 1233 1225 1225 1220 1225 1239 1252 1264 1288 1313 1330 1354 1378 1409 1446 1475 1517 1549 + 1667 1636 1585 1543 1508 1470 1431 1397 1371 1334 1302 1282 1258 1239 1227 1213 1207 1213 1207 1214 1227 1240 1250 1272 1288 1313 1345 1371 1399 1431 1473 1500 1534 + 1650 1614 1564 1523 1486 1449 1411 1375 1341 1315 1284 1264 1237 1218 1207 1191 1191 1184 1188 1188 1196 1214 1237 1246 1270 1296 1319 1341 1382 1404 1444 1483 1514 + 1626 1598 1561 1506 1467 1429 1389 1361 1326 1296 1266 1248 1229 1207 1195 1181 1172 1169 1170 1176 1186 1205 1220 1237 1260 1280 1306 1334 1357 1394 1429 1462 1486 + 1610 1579 1543 1500 1457 1414 1382 1345 1313 1286 1252 1233 1209 1188 1169 1165 1157 1155 1154 1165 1174 1189 1202 1222 1239 1270 1294 1313 1350 1382 1419 1446 1467 + 1588 1555 1520 1481 1439 1394 1361 1326 1288 1264 1244 1211 1193 1174 1155 1149 1142 1142 1142 1144 1155 1170 1186 1204 1229 1254 1270 1300 1330 1361 1397 1429 1459 + 1585 1549 1506 1462 1426 1389 1354 1313 1290 1258 1225 1200 1179 1162 1147 1134 1125 1125 1128 1139 1151 1159 1176 1195 1220 1237 1272 1298 1326 1348 1387 1419 1444 + 1576 1528 1483 1446 1416 1378 1337 1304 1270 1244 1211 1188 1165 1144 1131 1117 1113 1105 1117 1117 1128 1142 1159 1174 1198 1220 1250 1274 1311 1332 1375 1401 1426 + 1549 1523 1475 1436 1399 1359 1326 1290 1260 1231 1200 1174 1157 1138 1114 1105 1096 1098 1101 1102 1111 1125 1149 1165 1184 1214 1235 1268 1294 1324 1361 1389 1421 + 1549 1511 1475 1429 1387 1350 1315 1286 1250 1218 1191 1170 1147 1125 1107 1093 1086 1084 1087 1093 1108 1114 1134 1159 1177 1205 1229 1254 1288 1319 1341 1385 1411 + 1540 1492 1452 1411 1380 1341 1302 1272 1246 1209 1172 1155 1134 1113 1087 1081 1071 1070 1073 1086 1090 1111 1120 1147 1170 1186 1220 1252 1272 1306 1337 1375 1404 + 1525 1492 1457 1406 1371 1334 1300 1264 1224 1202 1170 1146 1127 1105 1086 1071 1063 1063 1063 1071 1083 1098 1114 1136 1159 1182 1204 1237 1268 1292 1330 1361 1392 + 1514 1483 1436 1397 1364 1324 1290 1250 1225 1202 1165 1134 1119 1095 1077 1059 1056 1045 1049 1062 1073 1087 1110 1125 1149 1181 1202 1237 1252 1292 1321 1354 1373 + 1511 1481 1439 1401 1359 1313 1282 1246 1214 1181 1159 1133 1111 1087 1067 1056 1042 1044 1046 1056 1063 1081 1101 1116 1144 1167 1196 1222 1250 1278 1313 1354 1378 + 1511 1465 1434 1389 1352 1324 1282 1246 1214 1181 1152 1133 1104 1080 1060 1048 1038 1034 1038 1046 1059 1073 1098 1114 1136 1162 1196 1220 1246 1282 1315 1345 1380 + 1500 1454 1419 1382 1343 1304 1268 1240 1205 1176 1147 1119 1093 1074 1053 1036 1034 1033 1029 1034 1052 1067 1086 1107 1130 1154 1182 1214 1239 1270 1306 1334 1366 + 1503 1465 1429 1382 1334 1304 1270 1237 1204 1176 1149 1117 1093 1073 1051 1038 1027 1028 1031 1036 1046 1066 1086 1108 1130 1154 1184 1205 1239 1274 1296 1332 1354 + 1489 1457 1416 1373 1337 1300 1268 1237 1204 1167 1144 1113 1093 1069 1048 1034 1025 1028 1031 1031 1044 1064 1081 1107 1130 1155 1177 1207 1239 1270 1296 1330 1368 + 1492 1459 1414 1366 1337 1300 1268 1237 1198 1160 1139 1108 1089 1066 1048 1029 1031 1025 1027 1024 1042 1059 1079 1096 1128 1149 1179 1204 1233 1264 1298 1328 1357 + 1497 1452 1419 1375 1339 1298 1270 1233 1196 1167 1138 1111 1092 1070 1044 1032 1025 1029 1024 1028 1044 1060 1083 1099 1122 1149 1182 1209 1246 1268 1298 1328 1371 + 1503 1449 1411 1375 1334 1298 1262 1225 1193 1167 1139 1111 1087 1066 1049 1032 1028 1028 1024 1031 1046 1055 1084 1104 1122 1152 1186 1207 1237 1266 1292 1328 1354 + 1494 1457 1416 1375 1343 1298 1268 1227 1202 1169 1138 1114 1092 1071 1045 1034 1031 1031 1028 1029 1046 1067 1084 1104 1130 1154 1184 1213 1237 1274 1300 1337 1364 + 1500 1457 1419 1378 1341 1302 1268 1239 1204 1174 1141 1117 1095 1073 1053 1040 1032 1027 1032 1034 1048 1066 1086 1107 1130 1160 1181 1213 1240 1270 1302 1337 1373 + 1503 1457 1416 1385 1348 1309 1272 1240 1205 1172 1146 1120 1096 1079 1056 1046 1034 1034 1033 1044 1052 1069 1090 1111 1136 1164 1182 1218 1246 1276 1304 1339 1366 + 1511 1473 1429 1389 1350 1317 1278 1248 1211 1182 1147 1133 1110 1086 1066 1049 1045 1041 1045 1051 1066 1076 1090 1120 1141 1169 1193 1224 1252 1282 1315 1350 1371 + 1508 1481 1439 1397 1357 1317 1282 1250 1214 1184 1154 1133 1111 1087 1064 1055 1049 1046 1051 1060 1067 1086 1104 1119 1152 1167 1193 1224 1250 1280 1317 1345 1385 + 1514 1470 1444 1399 1359 1324 1286 1258 1220 1184 1162 1138 1116 1089 1080 1067 1057 1052 1059 1062 1079 1090 1111 1133 1152 1177 1198 1229 1262 1286 1321 1350 1378 + 1523 1489 1449 1411 1371 1339 1302 1262 1229 1196 1176 1147 1125 1107 1090 1074 1071 1069 1063 1073 1084 1104 1114 1142 1159 1179 1207 1239 1268 1300 1326 1364 1392 + 1531 1500 1449 1414 1368 1334 1300 1266 1239 1209 1176 1147 1128 1113 1098 1077 1070 1070 1067 1079 1092 1111 1122 1139 1167 1184 1213 1244 1286 1306 1330 1364 1404] + + + [1799 1756 1705 1662 1613 1578 1530 1496 1458 1435 1393 1369 1349 1324 1327 1307 1305 1295 1295 1305 1318 1316 1338 1367 1383 1403 1433 1464 1502 1524 1572 1613 1635 + 1780 1737 1683 1642 1594 1551 1510 1477 1445 1412 1374 1358 1333 1316 1299 1291 1280 1280 1276 1284 1295 1303 1322 1342 1362 1398 1412 1440 1482 1519 1548 1581 1622 + 1745 1712 1666 1619 1572 1536 1491 1456 1422 1388 1367 1335 1309 1291 1278 1268 1264 1262 1258 1264 1280 1282 1307 1320 1340 1372 1398 1425 1464 1488 1530 1563 1597 + 1734 1687 1639 1594 1551 1505 1472 1433 1393 1367 1342 1318 1293 1276 1266 1251 1243 1241 1239 1251 1260 1270 1284 1301 1322 1356 1376 1410 1440 1466 1510 1542 1581 + 1712 1666 1609 1572 1533 1485 1448 1412 1376 1344 1322 1299 1280 1257 1241 1224 1220 1220 1228 1228 1239 1257 1270 1287 1303 1338 1353 1388 1427 1453 1491 1519 1542 + 1683 1635 1597 1548 1516 1472 1438 1400 1367 1331 1307 1280 1258 1237 1232 1215 1206 1204 1209 1219 1220 1239 1249 1272 1299 1316 1347 1374 1400 1430 1464 1499 1536 + 1666 1613 1581 1527 1488 1451 1417 1383 1342 1318 1282 1262 1241 1222 1209 1195 1190 1186 1190 1192 1200 1219 1232 1258 1274 1295 1333 1353 1388 1415 1451 1482 1516 + 1635 1609 1563 1513 1480 1435 1400 1367 1329 1301 1276 1241 1220 1208 1193 1178 1179 1178 1174 1179 1186 1202 1217 1235 1257 1280 1312 1335 1367 1403 1438 1469 1499 + 1616 1587 1542 1502 1453 1425 1383 1356 1318 1284 1257 1237 1211 1190 1176 1162 1154 1154 1161 1162 1168 1193 1202 1217 1241 1272 1297 1327 1356 1386 1415 1448 1477 + 1606 1566 1536 1480 1438 1405 1365 1331 1299 1264 1239 1219 1193 1176 1156 1146 1136 1136 1143 1146 1153 1176 1186 1209 1224 1249 1284 1307 1342 1369 1400 1430 1466 + 1594 1563 1522 1469 1440 1393 1358 1322 1291 1253 1228 1208 1186 1164 1154 1138 1128 1127 1128 1133 1144 1156 1178 1193 1217 1241 1266 1293 1327 1353 1381 1422 1451 + 1575 1542 1496 1456 1420 1367 1335 1305 1266 1239 1211 1193 1169 1146 1133 1121 1110 1111 1110 1111 1128 1136 1156 1181 1199 1224 1251 1280 1307 1342 1376 1410 1435 + 1572 1533 1488 1443 1398 1367 1324 1297 1264 1230 1204 1176 1153 1140 1119 1108 1095 1096 1099 1104 1119 1132 1149 1166 1190 1219 1241 1262 1303 1331 1356 1398 1420 + 1554 1522 1469 1427 1398 1356 1309 1278 1245 1222 1188 1176 1146 1128 1108 1096 1087 1084 1090 1093 1108 1122 1138 1161 1183 1208 1235 1260 1295 1316 1351 1381 1415 + 1542 1510 1466 1417 1386 1338 1301 1278 1239 1215 1178 1153 1132 1111 1095 1076 1077 1072 1073 1082 1093 1104 1128 1146 1168 1192 1217 1247 1274 1303 1340 1374 1400 + 1539 1505 1453 1412 1374 1338 1303 1274 1233 1204 1179 1153 1124 1105 1086 1074 1066 1063 1063 1072 1083 1096 1117 1138 1159 1183 1213 1239 1272 1301 1331 1365 1400 + 1524 1491 1453 1408 1367 1327 1291 1257 1220 1193 1169 1141 1121 1095 1076 1063 1058 1052 1049 1059 1072 1083 1107 1125 1151 1178 1206 1226 1253 1287 1322 1351 1383 + 1530 1482 1440 1398 1362 1324 1284 1247 1220 1179 1162 1133 1111 1090 1069 1053 1048 1041 1041 1053 1067 1083 1101 1121 1143 1168 1202 1224 1255 1282 1318 1351 1383 + 1513 1482 1438 1400 1353 1316 1280 1251 1213 1179 1154 1130 1102 1087 1063 1049 1041 1037 1034 1047 1064 1079 1093 1114 1143 1166 1193 1228 1253 1289 1312 1344 1379 + 1505 1472 1427 1393 1344 1309 1284 1237 1208 1179 1148 1124 1102 1073 1059 1041 1032 1032 1033 1036 1053 1063 1089 1111 1130 1158 1183 1208 1247 1270 1305 1338 1367 + 1513 1469 1420 1388 1338 1309 1266 1239 1204 1173 1146 1122 1095 1077 1055 1040 1028 1028 1029 1033 1045 1067 1084 1102 1130 1156 1183 1213 1241 1274 1303 1331 1365 + 1499 1461 1417 1383 1344 1305 1266 1232 1195 1164 1140 1113 1092 1066 1047 1033 1031 1025 1031 1031 1045 1059 1087 1108 1130 1156 1174 1208 1239 1270 1293 1329 1365 + 1496 1461 1415 1381 1335 1303 1262 1232 1197 1166 1141 1114 1089 1062 1045 1029 1027 1025 1024 1029 1041 1060 1076 1099 1124 1153 1181 1208 1239 1266 1297 1331 1358 + 1499 1461 1427 1381 1340 1309 1262 1228 1204 1169 1146 1114 1090 1067 1053 1033 1025 1028 1025 1027 1047 1064 1076 1107 1130 1154 1185 1202 1239 1268 1309 1327 1358 + 1502 1458 1417 1379 1338 1299 1266 1233 1199 1166 1136 1111 1086 1069 1044 1028 1029 1027 1025 1031 1044 1062 1079 1104 1122 1151 1176 1213 1232 1264 1297 1333 1365 + 1499 1466 1427 1383 1344 1305 1266 1233 1200 1171 1136 1121 1093 1067 1045 1034 1029 1029 1028 1034 1042 1058 1083 1102 1133 1156 1183 1215 1239 1280 1301 1338 1365 + 1513 1469 1420 1383 1344 1309 1266 1237 1199 1173 1138 1116 1095 1070 1053 1038 1029 1028 1028 1034 1048 1063 1089 1104 1127 1154 1181 1209 1239 1270 1297 1329 1365 + 1513 1469 1430 1381 1347 1303 1270 1237 1200 1171 1151 1117 1095 1072 1059 1038 1034 1031 1032 1042 1048 1064 1087 1110 1135 1154 1186 1213 1243 1278 1301 1333 1369 + 1519 1472 1425 1391 1358 1318 1278 1241 1213 1181 1151 1128 1105 1083 1063 1048 1045 1036 1042 1051 1064 1074 1098 1117 1141 1168 1193 1222 1253 1274 1309 1347 1374 + 1513 1474 1435 1398 1351 1320 1280 1249 1211 1183 1158 1132 1110 1087 1069 1053 1049 1038 1042 1056 1064 1079 1101 1116 1144 1171 1195 1226 1257 1284 1314 1353 1388 + 1524 1482 1435 1400 1360 1322 1291 1253 1215 1192 1159 1138 1116 1096 1077 1059 1053 1056 1056 1063 1076 1092 1099 1124 1151 1173 1195 1237 1264 1289 1316 1353 1388 + 1524 1499 1448 1415 1374 1335 1295 1264 1232 1197 1171 1149 1125 1102 1084 1074 1064 1060 1069 1076 1084 1098 1121 1138 1154 1183 1209 1247 1274 1295 1324 1360 1395 + 1551 1505 1458 1420 1372 1327 1307 1274 1237 1208 1178 1151 1128 1107 1090 1077 1072 1070 1074 1069 1086 1102 1124 1146 1161 1185 1219 1241 1272 1303 1335 1367 1398] + + + [1742 1684 1667 1608 1578 1530 1502 1471 1438 1409 1378 1356 1342 1317 1297 1300 1287 1280 1277 1293 1297 1307 1317 1349 1360 1378 1405 1446 1467 1493 1530 1539 1588 + 1712 1689 1645 1598 1558 1516 1489 1442 1421 1386 1360 1342 1320 1310 1283 1280 1267 1270 1270 1274 1287 1297 1310 1331 1352 1367 1394 1421 1446 1484 1511 1549 1583 + 1701 1645 1629 1588 1553 1493 1467 1430 1398 1375 1338 1317 1303 1287 1277 1264 1258 1254 1254 1254 1270 1283 1290 1317 1342 1352 1378 1402 1434 1454 1489 1525 1553 + 1667 1629 1603 1553 1530 1476 1446 1413 1375 1349 1327 1303 1280 1261 1254 1242 1236 1230 1230 1242 1248 1264 1277 1293 1317 1324 1363 1382 1417 1442 1467 1502 1534 + 1651 1613 1573 1530 1493 1454 1425 1398 1360 1338 1300 1290 1267 1248 1236 1227 1212 1215 1218 1224 1236 1242 1264 1267 1303 1320 1345 1363 1390 1430 1454 1480 1516 + 1645 1593 1573 1525 1489 1446 1421 1378 1352 1320 1290 1267 1254 1233 1224 1209 1203 1195 1203 1206 1218 1230 1245 1264 1280 1303 1324 1356 1378 1413 1438 1476 1480 + 1619 1583 1539 1498 1459 1430 1394 1360 1338 1300 1277 1251 1233 1212 1198 1183 1178 1181 1186 1183 1195 1203 1224 1239 1258 1287 1310 1334 1356 1398 1425 1454 1484 + 1619 1558 1525 1484 1454 1421 1382 1349 1320 1290 1258 1233 1221 1198 1189 1172 1172 1164 1167 1172 1183 1195 1209 1236 1245 1280 1293 1320 1352 1375 1402 1446 1459 + 1583 1553 1511 1471 1430 1402 1371 1342 1300 1274 1239 1224 1203 1183 1164 1167 1156 1153 1153 1159 1172 1178 1192 1215 1230 1258 1287 1307 1338 1367 1386 1417 1454 + 1573 1530 1507 1450 1425 1378 1363 1320 1287 1267 1230 1209 1192 1167 1151 1143 1133 1135 1135 1135 1151 1156 1178 1198 1221 1242 1270 1293 1327 1349 1375 1398 1446 + 1553 1525 1484 1446 1409 1382 1345 1310 1280 1245 1224 1203 1181 1156 1146 1133 1125 1123 1120 1133 1140 1153 1170 1192 1209 1236 1258 1280 1303 1338 1375 1394 1421 + 1534 1511 1467 1434 1394 1360 1327 1290 1264 1239 1212 1178 1161 1146 1123 1118 1108 1100 1108 1115 1120 1133 1156 1170 1192 1215 1239 1274 1293 1327 1352 1386 1402 + 1520 1493 1463 1421 1382 1342 1314 1277 1248 1233 1195 1172 1151 1128 1118 1096 1098 1091 1093 1100 1113 1123 1143 1159 1181 1203 1233 1251 1287 1303 1338 1360 1386 + 1534 1489 1442 1409 1360 1331 1303 1280 1245 1212 1183 1164 1143 1118 1105 1088 1091 1086 1091 1091 1100 1115 1130 1153 1178 1195 1221 1245 1277 1307 1338 1352 1386 + 1502 1476 1434 1402 1360 1324 1297 1264 1236 1209 1172 1156 1138 1113 1100 1079 1077 1065 1072 1077 1088 1096 1120 1138 1167 1186 1206 1239 1264 1300 1320 1349 1367 + 1493 1463 1438 1390 1356 1324 1283 1264 1227 1200 1170 1151 1123 1105 1086 1077 1061 1061 1065 1072 1079 1096 1110 1133 1156 1178 1203 1221 1254 1280 1310 1338 1367 + 1489 1454 1409 1382 1349 1310 1274 1245 1218 1192 1156 1135 1120 1088 1070 1063 1048 1048 1054 1054 1072 1077 1108 1118 1148 1172 1195 1218 1245 1274 1307 1338 1360 + 1471 1442 1413 1378 1345 1303 1277 1236 1206 1186 1153 1130 1100 1079 1070 1056 1045 1043 1043 1056 1063 1081 1096 1105 1138 1159 1186 1212 1248 1267 1303 1331 1360 + 1471 1438 1405 1363 1331 1297 1267 1242 1200 1175 1148 1123 1105 1081 1063 1048 1037 1037 1035 1048 1063 1072 1091 1113 1133 1161 1189 1209 1239 1264 1293 1320 1356 + 1467 1438 1405 1363 1327 1297 1258 1230 1198 1167 1138 1110 1093 1074 1065 1041 1032 1026 1035 1039 1048 1074 1086 1103 1123 1151 1175 1203 1233 1251 1283 1317 1342 + 1471 1434 1402 1367 1334 1287 1261 1227 1192 1170 1138 1113 1086 1070 1054 1035 1037 1030 1030 1037 1050 1065 1084 1100 1123 1151 1172 1192 1224 1258 1283 1314 1334 + 1459 1434 1390 1356 1327 1290 1258 1224 1198 1167 1133 1108 1086 1065 1045 1037 1028 1028 1030 1030 1045 1056 1074 1098 1118 1146 1170 1195 1221 1251 1283 1303 1334 + 1463 1425 1394 1360 1317 1283 1261 1215 1183 1159 1133 1105 1081 1065 1045 1030 1026 1030 1028 1032 1039 1059 1074 1091 1118 1143 1170 1198 1224 1251 1277 1307 1327 + 1476 1434 1398 1352 1327 1280 1254 1221 1192 1161 1135 1113 1086 1061 1048 1028 1028 1028 1028 1030 1039 1059 1072 1096 1118 1138 1172 1189 1224 1254 1280 1307 1327 + 1459 1430 1390 1360 1320 1283 1248 1218 1186 1161 1133 1110 1088 1059 1041 1032 1030 1028 1026 1030 1037 1054 1079 1088 1123 1146 1167 1200 1218 1248 1277 1303 1334 + 1467 1438 1398 1356 1327 1287 1251 1224 1192 1159 1130 1110 1091 1065 1041 1032 1026 1028 1028 1028 1043 1056 1081 1103 1123 1143 1175 1198 1224 1254 1293 1310 1334 + 1471 1425 1405 1356 1327 1300 1254 1230 1189 1167 1135 1110 1088 1068 1048 1035 1028 1028 1024 1037 1048 1059 1074 1098 1125 1143 1175 1195 1230 1251 1277 1317 1345 + 1467 1430 1398 1360 1327 1280 1261 1221 1198 1170 1135 1113 1091 1074 1052 1037 1037 1028 1030 1035 1052 1065 1088 1100 1130 1146 1167 1198 1227 1254 1280 1314 1327 + 1484 1450 1402 1367 1338 1307 1267 1236 1203 1172 1143 1118 1096 1079 1061 1048 1045 1035 1041 1048 1061 1077 1091 1113 1133 1156 1178 1206 1239 1254 1290 1317 1349 + 1480 1442 1413 1367 1345 1300 1270 1239 1203 1178 1151 1125 1105 1081 1065 1059 1041 1041 1043 1054 1065 1072 1091 1118 1138 1156 1181 1212 1236 1261 1290 1320 1338 + 1480 1450 1409 1371 1342 1303 1267 1236 1206 1186 1153 1133 1105 1086 1068 1061 1052 1048 1050 1061 1063 1084 1096 1115 1148 1161 1189 1215 1239 1270 1297 1327 1363 + 1498 1454 1417 1386 1352 1320 1280 1245 1218 1186 1161 1140 1120 1100 1084 1068 1059 1059 1063 1070 1079 1091 1103 1125 1146 1172 1200 1227 1248 1283 1307 1345 1356 + 1511 1471 1425 1378 1356 1317 1287 1248 1224 1203 1172 1138 1125 1105 1081 1072 1056 1063 1065 1077 1091 1103 1113 1128 1153 1175 1206 1227 1245 1287 1310 1338 1367] + + + + + 1920x1080_F11_100 + + + 1920x1080 + + + F11 + + + [ 32] + + + [ 10] + + + [ 15] + + + [ 15] + + + [43 50 49 51 55 54 59 58 60 65 67 68 69 70 71 71 71 71 70 69 68 67 65 60 58 59 54 55 51 49 50 43] + + + [30 32 32 33 32 34 33 35 34 34 36 35 36 34 35 35] + + + [ 100] + + + [1919 1841 1788 1727 1680 1636 1590 1545 1504 1477 1435 1395 1379 1353 1342 1325 1321 1314 1318 1332 1335 1342 1364 1391 1411 1456 1464 1517 1527 1600 1626 1658 1709 + 1868 1828 1769 1721 1669 1610 1570 1517 1499 1456 1431 1391 1361 1339 1328 1314 1307 1314 1311 1314 1321 1346 1361 1379 1403 1447 1460 1504 1527 1575 1615 1658 1692 + 1848 1814 1751 1697 1642 1600 1550 1517 1468 1443 1407 1364 1346 1332 1307 1291 1284 1291 1284 1297 1297 1318 1342 1368 1383 1411 1451 1473 1513 1541 1585 1631 1675 + 1848 1788 1721 1664 1610 1575 1517 1490 1447 1415 1383 1350 1325 1307 1291 1277 1258 1268 1268 1274 1287 1287 1318 1339 1361 1395 1415 1451 1490 1527 1560 1610 1658 + 1795 1745 1692 1653 1590 1550 1504 1464 1431 1395 1357 1335 1307 1287 1268 1255 1246 1239 1243 1249 1264 1274 1294 1318 1335 1368 1407 1435 1464 1504 1541 1580 1621 + 1782 1727 1680 1626 1570 1517 1481 1456 1407 1376 1339 1307 1277 1268 1255 1236 1224 1221 1230 1236 1243 1255 1274 1297 1325 1350 1387 1411 1456 1481 1522 1565 1600 + 1763 1703 1653 1595 1545 1499 1460 1431 1379 1353 1325 1291 1264 1249 1230 1215 1210 1195 1204 1212 1218 1243 1264 1277 1301 1332 1357 1383 1427 1451 1504 1541 1580 + 1727 1680 1636 1585 1531 1495 1447 1403 1372 1332 1307 1271 1246 1224 1207 1195 1192 1184 1192 1198 1204 1218 1236 1261 1291 1318 1350 1376 1411 1439 1473 1517 1555 + 1709 1658 1615 1570 1508 1477 1415 1387 1350 1307 1287 1261 1227 1207 1192 1178 1173 1165 1173 1178 1192 1201 1224 1246 1268 1294 1328 1361 1391 1431 1460 1499 1536 + 1686 1636 1595 1541 1490 1451 1415 1368 1328 1294 1264 1233 1212 1187 1167 1156 1154 1146 1146 1159 1170 1181 1204 1224 1255 1277 1307 1332 1364 1403 1447 1495 1517 + 1669 1631 1570 1522 1473 1443 1395 1357 1318 1284 1252 1224 1195 1175 1156 1151 1135 1141 1135 1143 1159 1175 1195 1215 1236 1264 1294 1321 1357 1399 1427 1473 1513 + 1647 1600 1555 1504 1460 1419 1383 1335 1297 1268 1236 1204 1184 1156 1141 1133 1118 1120 1120 1125 1138 1154 1175 1204 1212 1255 1274 1304 1350 1383 1407 1451 1481 + 1631 1590 1541 1504 1456 1407 1361 1328 1294 1255 1227 1195 1167 1146 1128 1118 1101 1105 1105 1118 1123 1141 1165 1189 1210 1236 1268 1294 1335 1368 1403 1435 1477 + 1621 1585 1541 1490 1439 1391 1350 1318 1281 1239 1212 1178 1165 1135 1115 1103 1096 1089 1093 1103 1110 1123 1148 1178 1204 1227 1261 1281 1325 1353 1383 1423 1460 + 1605 1565 1513 1464 1419 1383 1342 1304 1261 1236 1198 1167 1146 1123 1103 1089 1079 1077 1077 1089 1098 1110 1138 1162 1187 1212 1230 1271 1311 1342 1376 1415 1451 + 1595 1565 1499 1460 1415 1376 1332 1301 1252 1230 1187 1162 1141 1115 1093 1079 1068 1063 1065 1072 1091 1103 1133 1159 1181 1204 1236 1274 1301 1328 1364 1403 1451 + 1590 1541 1504 1447 1407 1368 1321 1291 1249 1212 1181 1148 1133 1105 1079 1065 1061 1056 1054 1068 1079 1093 1120 1141 1170 1198 1227 1258 1281 1321 1357 1391 1443 + 1590 1545 1486 1451 1391 1361 1318 1281 1233 1201 1178 1146 1120 1103 1072 1059 1050 1045 1045 1056 1070 1091 1110 1135 1159 1192 1218 1252 1291 1314 1357 1387 1419 + 1580 1531 1481 1443 1383 1350 1311 1268 1243 1201 1173 1138 1113 1093 1070 1061 1043 1045 1043 1048 1065 1086 1103 1130 1159 1184 1218 1246 1277 1311 1339 1383 1419 + 1560 1513 1464 1431 1387 1346 1304 1268 1224 1192 1167 1130 1110 1084 1065 1048 1037 1037 1039 1041 1054 1079 1096 1120 1143 1170 1207 1236 1274 1304 1339 1376 1415 + 1580 1522 1468 1423 1383 1342 1304 1258 1230 1192 1154 1130 1108 1079 1056 1039 1035 1030 1032 1045 1059 1077 1098 1125 1143 1175 1201 1230 1268 1304 1346 1372 1403 + 1560 1513 1468 1423 1387 1328 1301 1258 1218 1192 1156 1133 1105 1075 1061 1039 1032 1030 1028 1037 1056 1077 1089 1113 1151 1170 1201 1227 1271 1291 1335 1376 1407 + 1560 1522 1473 1423 1379 1332 1297 1255 1224 1184 1156 1128 1098 1070 1054 1041 1032 1030 1035 1039 1048 1063 1089 1118 1141 1173 1198 1227 1271 1291 1332 1372 1403 + 1575 1522 1473 1427 1383 1342 1301 1264 1218 1187 1159 1135 1103 1075 1056 1039 1030 1030 1030 1032 1052 1065 1096 1120 1143 1170 1201 1236 1264 1297 1335 1376 1399 + 1555 1517 1460 1427 1383 1335 1291 1255 1224 1192 1154 1120 1101 1075 1052 1035 1032 1030 1024 1035 1050 1072 1086 1115 1143 1165 1204 1233 1264 1294 1325 1361 1391 + 1565 1527 1481 1427 1379 1339 1301 1255 1224 1192 1165 1133 1110 1075 1054 1041 1032 1032 1035 1037 1054 1075 1101 1113 1148 1175 1204 1233 1261 1301 1339 1379 1419 + 1570 1531 1468 1427 1383 1342 1304 1261 1236 1189 1170 1128 1113 1084 1063 1045 1037 1035 1035 1045 1059 1072 1101 1128 1148 1173 1212 1246 1274 1301 1339 1376 1415 + 1580 1527 1477 1427 1387 1328 1304 1268 1233 1201 1165 1133 1115 1079 1065 1052 1043 1043 1043 1050 1065 1079 1096 1128 1148 1187 1215 1246 1274 1307 1339 1379 1419 + 1590 1541 1490 1443 1407 1361 1307 1274 1239 1207 1173 1146 1110 1091 1075 1061 1048 1048 1054 1061 1075 1091 1110 1143 1167 1187 1221 1249 1281 1321 1350 1391 1423 + 1590 1545 1490 1451 1407 1361 1318 1284 1246 1212 1178 1159 1120 1101 1077 1061 1061 1052 1059 1068 1082 1096 1123 1143 1167 1192 1218 1255 1291 1325 1350 1387 1431 + 1605 1541 1495 1456 1403 1364 1321 1287 1249 1221 1187 1154 1135 1115 1086 1075 1063 1065 1070 1075 1084 1105 1123 1151 1178 1201 1230 1261 1291 1339 1368 1395 1431 + 1631 1565 1522 1464 1411 1379 1342 1297 1258 1224 1184 1167 1135 1118 1101 1091 1077 1072 1072 1084 1101 1115 1138 1154 1181 1210 1236 1271 1301 1339 1372 1411 1439 + 1605 1570 1527 1481 1431 1387 1335 1304 1268 1230 1204 1175 1156 1128 1108 1086 1082 1089 1089 1098 1103 1125 1141 1162 1184 1210 1243 1284 1311 1350 1376 1423 1451] + + + [1796 1749 1704 1654 1607 1562 1526 1489 1459 1417 1401 1362 1349 1327 1315 1308 1296 1289 1301 1296 1308 1327 1344 1362 1387 1414 1436 1462 1489 1526 1556 1600 1639 + 1770 1733 1689 1628 1593 1556 1523 1474 1439 1411 1385 1356 1337 1325 1299 1301 1283 1287 1285 1294 1299 1313 1325 1346 1372 1395 1422 1451 1489 1514 1546 1589 1618 + 1753 1708 1662 1621 1576 1530 1498 1462 1425 1403 1369 1339 1317 1299 1285 1274 1265 1261 1263 1274 1278 1289 1310 1329 1351 1385 1406 1431 1471 1492 1526 1566 1600 + 1724 1681 1639 1593 1549 1511 1465 1439 1398 1374 1349 1322 1299 1274 1263 1252 1250 1248 1243 1252 1265 1272 1287 1310 1327 1354 1387 1409 1442 1483 1504 1542 1579 + 1692 1658 1618 1562 1533 1489 1454 1414 1387 1367 1329 1301 1274 1256 1246 1229 1229 1221 1231 1227 1237 1258 1272 1287 1315 1337 1362 1385 1422 1451 1489 1526 1562 + 1696 1636 1596 1549 1504 1474 1431 1406 1372 1329 1310 1283 1261 1246 1219 1217 1217 1206 1210 1212 1229 1235 1258 1283 1294 1322 1346 1380 1414 1436 1468 1498 1536 + 1665 1621 1583 1526 1489 1454 1417 1377 1351 1310 1292 1263 1241 1227 1208 1189 1197 1183 1189 1193 1199 1215 1231 1256 1285 1296 1327 1354 1382 1414 1445 1486 1501 + 1643 1607 1556 1514 1480 1436 1401 1367 1332 1308 1272 1250 1221 1210 1199 1185 1177 1172 1175 1185 1185 1201 1225 1241 1265 1287 1308 1342 1372 1403 1434 1471 1501 + 1628 1583 1539 1501 1462 1414 1390 1354 1317 1283 1256 1229 1206 1191 1179 1168 1159 1151 1162 1161 1177 1183 1208 1227 1241 1272 1296 1322 1354 1385 1420 1454 1480 + 1610 1569 1536 1480 1442 1398 1374 1327 1303 1272 1239 1210 1199 1175 1161 1146 1148 1142 1142 1146 1157 1174 1187 1206 1233 1252 1280 1306 1339 1367 1398 1436 1468 + 1621 1549 1514 1468 1434 1387 1362 1327 1292 1261 1233 1201 1181 1164 1146 1137 1127 1127 1132 1135 1148 1161 1175 1197 1221 1243 1274 1299 1317 1359 1387 1417 1451 + 1586 1539 1495 1451 1417 1372 1344 1310 1272 1241 1215 1191 1168 1150 1130 1118 1113 1108 1109 1116 1134 1144 1161 1179 1203 1229 1254 1280 1313 1342 1374 1401 1436 + 1556 1526 1483 1439 1406 1369 1327 1301 1265 1229 1208 1177 1159 1137 1121 1115 1099 1098 1103 1106 1108 1130 1153 1172 1191 1217 1239 1274 1303 1329 1359 1401 1428 + 1549 1520 1480 1436 1390 1349 1322 1276 1250 1221 1193 1172 1142 1125 1103 1098 1085 1085 1085 1095 1103 1123 1137 1164 1181 1205 1237 1265 1292 1317 1342 1385 1417 + 1542 1514 1459 1422 1385 1344 1310 1272 1237 1219 1187 1159 1139 1109 1099 1086 1070 1072 1075 1083 1088 1109 1125 1148 1175 1193 1217 1248 1272 1308 1339 1374 1401 + 1542 1492 1456 1411 1377 1337 1296 1272 1237 1206 1175 1153 1120 1104 1085 1070 1067 1066 1067 1080 1085 1096 1116 1142 1162 1195 1215 1239 1269 1303 1337 1364 1393 + 1523 1483 1439 1406 1364 1327 1299 1256 1223 1193 1162 1137 1121 1095 1075 1060 1052 1047 1054 1061 1074 1086 1108 1128 1157 1177 1205 1233 1258 1299 1317 1359 1374 + 1530 1480 1445 1398 1359 1320 1283 1252 1227 1197 1162 1135 1113 1095 1070 1055 1046 1042 1047 1054 1070 1080 1103 1125 1146 1168 1199 1225 1258 1285 1315 1354 1385 + 1507 1471 1434 1401 1354 1320 1283 1239 1219 1183 1151 1128 1104 1083 1064 1050 1036 1037 1042 1047 1061 1075 1099 1116 1148 1166 1195 1223 1254 1283 1310 1342 1372 + 1495 1462 1425 1387 1351 1310 1267 1241 1208 1177 1144 1120 1095 1074 1052 1036 1030 1031 1030 1040 1049 1067 1088 1113 1135 1157 1185 1210 1243 1269 1303 1334 1359 + 1514 1462 1417 1387 1344 1306 1269 1237 1206 1174 1142 1116 1091 1075 1052 1033 1033 1024 1027 1039 1049 1064 1086 1108 1130 1157 1185 1212 1243 1274 1306 1332 1369 + 1498 1477 1417 1380 1337 1303 1274 1239 1205 1177 1142 1121 1093 1070 1049 1036 1024 1027 1024 1034 1046 1067 1083 1106 1125 1153 1181 1208 1233 1263 1294 1334 1364 + 1489 1456 1420 1380 1339 1299 1267 1227 1206 1170 1141 1116 1086 1070 1047 1031 1031 1030 1028 1031 1047 1057 1080 1104 1120 1151 1181 1212 1239 1265 1292 1329 1369 + 1486 1456 1417 1382 1337 1296 1263 1233 1203 1170 1144 1109 1091 1067 1049 1025 1024 1027 1030 1034 1039 1061 1086 1103 1130 1151 1177 1210 1239 1269 1296 1329 1362 + 1492 1459 1414 1377 1334 1299 1267 1231 1201 1170 1135 1113 1082 1061 1044 1025 1030 1024 1025 1030 1046 1058 1078 1104 1127 1148 1179 1210 1233 1269 1296 1332 1362 + 1514 1462 1422 1374 1344 1303 1269 1241 1206 1174 1144 1113 1088 1069 1050 1031 1027 1031 1027 1033 1050 1063 1085 1104 1132 1161 1187 1217 1243 1265 1294 1332 1362 + 1504 1468 1417 1377 1344 1303 1269 1239 1205 1183 1148 1118 1093 1070 1054 1039 1030 1030 1027 1037 1050 1067 1088 1106 1132 1161 1189 1215 1248 1265 1306 1342 1367 + 1498 1468 1425 1382 1346 1303 1278 1243 1203 1175 1144 1120 1098 1075 1058 1042 1031 1033 1031 1039 1054 1067 1091 1113 1141 1159 1191 1215 1243 1272 1303 1342 1372 + 1520 1471 1434 1401 1354 1317 1283 1246 1210 1189 1155 1130 1101 1085 1066 1047 1046 1043 1044 1054 1064 1078 1103 1123 1146 1170 1199 1221 1252 1276 1315 1351 1369 + 1514 1474 1434 1385 1359 1320 1280 1246 1215 1189 1157 1132 1106 1090 1067 1054 1047 1044 1044 1054 1067 1086 1101 1125 1144 1170 1193 1223 1256 1289 1317 1351 1382 + 1520 1489 1445 1403 1364 1327 1292 1261 1223 1199 1166 1142 1115 1099 1080 1067 1057 1054 1064 1063 1074 1095 1109 1137 1153 1183 1206 1231 1256 1285 1322 1351 1390 + 1542 1504 1451 1409 1374 1327 1306 1269 1229 1203 1172 1148 1120 1109 1088 1078 1066 1061 1069 1067 1086 1099 1125 1142 1162 1185 1210 1241 1269 1294 1327 1369 1393 + 1536 1495 1454 1428 1377 1334 1296 1274 1241 1210 1177 1157 1132 1106 1093 1077 1078 1066 1074 1080 1086 1111 1127 1144 1170 1197 1219 1235 1269 1306 1334 1362 1382] + + + [1807 1776 1710 1675 1630 1591 1537 1499 1466 1443 1404 1370 1355 1332 1316 1306 1299 1301 1301 1311 1327 1325 1342 1378 1396 1418 1443 1472 1502 1534 1570 1622 1644 + 1803 1743 1694 1648 1608 1560 1521 1487 1449 1418 1388 1357 1345 1318 1311 1295 1290 1283 1288 1290 1306 1316 1335 1355 1367 1401 1418 1457 1490 1524 1557 1598 1633 + 1776 1734 1678 1630 1594 1544 1502 1466 1429 1396 1375 1337 1320 1297 1285 1276 1272 1265 1265 1270 1279 1297 1311 1330 1352 1380 1407 1440 1460 1499 1550 1570 1605 + 1738 1702 1648 1605 1567 1518 1475 1440 1407 1378 1352 1323 1299 1279 1261 1257 1248 1252 1240 1248 1265 1279 1295 1308 1327 1355 1388 1415 1452 1481 1518 1547 1587 + 1706 1682 1622 1584 1531 1502 1463 1420 1388 1360 1332 1301 1276 1270 1244 1237 1229 1227 1233 1240 1240 1254 1276 1292 1313 1345 1367 1396 1429 1463 1496 1527 1567 + 1698 1652 1601 1567 1524 1484 1449 1404 1378 1340 1313 1290 1270 1242 1233 1223 1211 1205 1209 1213 1229 1242 1259 1279 1304 1320 1347 1375 1412 1446 1475 1521 1547 + 1678 1637 1587 1544 1505 1469 1423 1383 1357 1318 1292 1263 1244 1223 1211 1201 1189 1183 1187 1199 1203 1223 1240 1257 1276 1301 1330 1362 1393 1423 1460 1490 1531 + 1671 1622 1570 1521 1487 1454 1412 1372 1345 1313 1272 1248 1233 1209 1197 1181 1176 1172 1176 1185 1191 1205 1223 1244 1265 1292 1313 1340 1370 1404 1440 1481 1505 + 1648 1598 1544 1512 1460 1426 1388 1360 1323 1288 1257 1231 1213 1195 1178 1166 1161 1157 1159 1166 1176 1187 1211 1223 1248 1274 1301 1323 1357 1385 1423 1457 1487 + 1622 1591 1540 1496 1437 1412 1370 1345 1304 1272 1242 1219 1197 1172 1163 1146 1139 1144 1137 1144 1155 1178 1191 1209 1233 1259 1276 1313 1350 1378 1401 1443 1472 + 1619 1567 1524 1478 1446 1396 1365 1325 1290 1259 1231 1213 1183 1163 1146 1135 1134 1127 1127 1139 1146 1157 1180 1199 1223 1248 1276 1301 1335 1362 1396 1432 1463 + 1587 1560 1515 1463 1426 1378 1350 1313 1279 1246 1215 1195 1170 1153 1134 1118 1110 1113 1111 1122 1128 1141 1159 1185 1205 1233 1252 1279 1313 1347 1375 1420 1446 + 1574 1544 1493 1457 1418 1372 1340 1301 1272 1242 1205 1180 1157 1141 1123 1110 1105 1096 1103 1106 1116 1132 1150 1174 1201 1223 1244 1279 1308 1337 1370 1404 1432 + 1570 1540 1493 1446 1409 1357 1327 1288 1257 1225 1195 1176 1152 1125 1111 1100 1082 1083 1088 1096 1101 1123 1137 1161 1181 1205 1231 1263 1297 1325 1357 1391 1429 + 1553 1518 1481 1434 1388 1345 1313 1283 1246 1217 1187 1155 1137 1115 1105 1085 1080 1069 1077 1080 1093 1108 1127 1148 1170 1201 1223 1244 1281 1313 1345 1383 1401 + 1560 1515 1460 1429 1383 1342 1313 1263 1235 1205 1178 1153 1130 1105 1090 1072 1064 1060 1064 1074 1086 1098 1122 1143 1163 1187 1219 1242 1276 1311 1340 1375 1404 + 1544 1502 1454 1415 1370 1332 1290 1263 1231 1197 1161 1137 1118 1093 1075 1061 1055 1052 1055 1063 1071 1082 1108 1127 1152 1178 1205 1233 1261 1295 1330 1365 1399 + 1544 1502 1449 1407 1367 1330 1292 1257 1231 1195 1161 1135 1106 1091 1069 1057 1049 1042 1043 1055 1064 1083 1103 1127 1144 1176 1197 1229 1263 1285 1323 1360 1388 + 1521 1481 1446 1401 1355 1323 1281 1248 1213 1187 1157 1127 1101 1086 1064 1048 1037 1042 1042 1043 1060 1083 1096 1122 1143 1166 1199 1227 1252 1288 1318 1352 1383 + 1515 1484 1429 1396 1350 1316 1276 1244 1209 1183 1152 1120 1100 1072 1054 1040 1033 1030 1033 1037 1052 1069 1088 1113 1139 1163 1193 1213 1254 1274 1311 1350 1360 + 1508 1478 1432 1396 1357 1316 1272 1244 1211 1178 1143 1123 1095 1077 1049 1036 1027 1028 1031 1039 1049 1066 1086 1113 1132 1164 1187 1217 1250 1281 1306 1345 1367 + 1505 1475 1432 1388 1347 1306 1270 1240 1209 1170 1143 1120 1091 1069 1049 1033 1025 1025 1024 1033 1048 1064 1082 1110 1128 1155 1183 1205 1240 1274 1299 1337 1362 + 1502 1463 1423 1385 1350 1311 1279 1240 1207 1172 1139 1113 1082 1064 1048 1036 1030 1025 1027 1030 1042 1060 1083 1106 1125 1155 1183 1215 1250 1268 1299 1337 1370 + 1502 1475 1434 1396 1347 1306 1274 1240 1203 1172 1148 1118 1083 1067 1051 1031 1033 1024 1033 1031 1043 1058 1083 1105 1134 1157 1187 1211 1246 1270 1301 1337 1375 + 1518 1463 1429 1378 1337 1301 1265 1233 1207 1168 1139 1116 1095 1063 1042 1030 1027 1028 1025 1025 1042 1058 1085 1101 1128 1157 1180 1211 1240 1272 1306 1337 1372 + 1515 1469 1429 1396 1350 1304 1276 1233 1211 1174 1143 1115 1086 1069 1049 1036 1028 1028 1030 1036 1048 1064 1086 1108 1139 1159 1189 1215 1246 1279 1306 1342 1372 + 1515 1475 1432 1388 1355 1313 1276 1244 1201 1174 1144 1118 1095 1075 1057 1040 1031 1028 1031 1033 1052 1066 1086 1106 1130 1159 1187 1215 1246 1274 1308 1337 1375 + 1515 1478 1426 1393 1355 1313 1279 1240 1211 1183 1146 1118 1100 1080 1058 1043 1036 1031 1033 1040 1051 1067 1090 1118 1141 1161 1189 1221 1250 1276 1313 1342 1375 + 1518 1484 1446 1399 1367 1325 1281 1248 1215 1185 1159 1130 1108 1077 1064 1051 1040 1039 1036 1049 1061 1077 1098 1120 1141 1172 1201 1221 1257 1283 1323 1352 1383 + 1527 1478 1449 1404 1357 1323 1283 1257 1223 1191 1157 1134 1106 1086 1067 1054 1048 1046 1042 1052 1061 1078 1101 1125 1148 1170 1201 1227 1252 1288 1311 1355 1383 + 1540 1490 1460 1407 1370 1330 1297 1259 1227 1193 1166 1137 1116 1100 1075 1071 1052 1054 1058 1061 1077 1090 1106 1128 1155 1181 1199 1231 1265 1299 1332 1360 1393 + 1544 1502 1457 1418 1370 1337 1301 1263 1235 1201 1172 1146 1130 1103 1091 1074 1063 1064 1064 1069 1080 1100 1123 1141 1159 1185 1211 1244 1270 1304 1337 1367 1404 + 1547 1512 1463 1420 1372 1342 1308 1279 1244 1203 1183 1153 1130 1108 1091 1083 1071 1069 1071 1083 1090 1106 1122 1137 1166 1195 1211 1248 1276 1301 1345 1378 1396] + + + [1742 1700 1660 1608 1572 1538 1506 1487 1450 1410 1388 1361 1346 1321 1311 1302 1292 1306 1302 1287 1316 1316 1326 1351 1351 1377 1421 1444 1474 1518 1538 1565 1593 + 1742 1700 1653 1608 1565 1532 1493 1450 1433 1416 1372 1351 1331 1302 1306 1292 1283 1278 1283 1283 1283 1302 1316 1341 1361 1383 1404 1433 1462 1487 1518 1552 1579 + 1717 1676 1615 1579 1552 1512 1474 1450 1416 1383 1361 1336 1311 1297 1278 1269 1260 1265 1269 1269 1274 1292 1306 1321 1336 1356 1393 1410 1444 1474 1506 1552 1565 + 1684 1653 1601 1558 1538 1487 1462 1421 1393 1361 1331 1306 1287 1278 1265 1242 1238 1242 1234 1256 1251 1269 1287 1302 1331 1341 1367 1393 1421 1444 1481 1506 1538 + 1653 1637 1558 1538 1506 1462 1433 1410 1377 1341 1316 1302 1269 1251 1238 1230 1221 1213 1221 1230 1242 1251 1269 1287 1306 1331 1346 1367 1399 1439 1456 1506 1525 + 1645 1601 1579 1532 1493 1456 1433 1393 1356 1336 1306 1287 1265 1238 1234 1213 1209 1205 1213 1217 1230 1242 1251 1269 1283 1321 1341 1346 1393 1416 1439 1481 1506 + 1630 1593 1552 1506 1474 1439 1404 1377 1351 1306 1274 1265 1238 1225 1200 1192 1196 1192 1192 1196 1200 1209 1242 1256 1274 1287 1311 1331 1377 1399 1421 1456 1493 + 1615 1579 1545 1499 1450 1433 1393 1367 1326 1297 1269 1238 1234 1209 1196 1184 1180 1173 1180 1177 1188 1205 1221 1238 1265 1287 1302 1336 1367 1383 1410 1444 1468 + 1608 1558 1518 1487 1444 1399 1377 1336 1316 1278 1251 1234 1213 1192 1177 1169 1157 1161 1169 1165 1177 1188 1205 1230 1234 1265 1292 1316 1351 1367 1393 1427 1450 + 1579 1545 1518 1468 1433 1388 1361 1326 1297 1265 1238 1213 1200 1177 1157 1150 1139 1139 1143 1150 1157 1173 1180 1205 1225 1256 1265 1297 1326 1361 1393 1416 1421 + 1565 1525 1493 1456 1410 1388 1346 1316 1292 1265 1225 1209 1180 1169 1150 1135 1135 1128 1139 1135 1150 1157 1177 1192 1217 1238 1260 1292 1321 1346 1377 1399 1433 + 1552 1506 1474 1439 1404 1372 1341 1297 1278 1242 1217 1188 1177 1154 1135 1117 1114 1117 1114 1114 1128 1139 1169 1180 1196 1217 1247 1274 1302 1326 1351 1393 1399 + 1538 1506 1468 1439 1388 1346 1321 1292 1260 1230 1200 1184 1165 1146 1124 1114 1104 1097 1107 1110 1117 1132 1150 1165 1188 1213 1238 1265 1287 1321 1351 1377 1404 + 1525 1499 1450 1416 1377 1351 1311 1278 1260 1225 1205 1169 1146 1132 1107 1093 1097 1087 1090 1100 1107 1128 1135 1165 1177 1192 1230 1256 1292 1306 1336 1356 1404 + 1532 1481 1444 1404 1372 1336 1302 1265 1234 1209 1192 1161 1139 1110 1107 1077 1080 1073 1073 1083 1093 1107 1128 1150 1161 1192 1225 1247 1274 1297 1316 1351 1393 + 1512 1481 1439 1399 1356 1326 1302 1265 1234 1205 1180 1161 1132 1104 1090 1080 1073 1064 1070 1070 1090 1104 1128 1139 1165 1192 1213 1234 1256 1283 1316 1356 1377 + 1499 1468 1427 1377 1356 1316 1283 1251 1225 1192 1169 1143 1121 1090 1077 1064 1061 1054 1054 1058 1070 1087 1100 1128 1157 1180 1205 1221 1256 1278 1311 1341 1367 + 1487 1468 1404 1383 1351 1316 1287 1247 1221 1192 1161 1128 1117 1097 1077 1061 1051 1051 1048 1058 1073 1083 1100 1124 1143 1169 1192 1217 1256 1278 1292 1326 1361 + 1474 1462 1410 1383 1351 1306 1283 1247 1217 1180 1150 1135 1100 1090 1064 1054 1042 1036 1045 1054 1067 1077 1100 1117 1135 1165 1196 1213 1238 1269 1292 1341 1361 + 1474 1439 1410 1372 1331 1297 1274 1238 1205 1177 1150 1124 1097 1077 1064 1045 1036 1027 1039 1045 1054 1073 1090 1121 1132 1161 1184 1205 1230 1260 1292 1331 1346 + 1487 1439 1399 1361 1326 1306 1265 1234 1200 1169 1154 1117 1097 1077 1058 1039 1033 1045 1039 1036 1048 1067 1087 1107 1132 1154 1177 1205 1234 1260 1287 1326 1346 + 1462 1433 1410 1361 1336 1292 1260 1230 1209 1169 1146 1114 1090 1070 1054 1030 1033 1036 1036 1033 1051 1058 1080 1107 1121 1146 1177 1209 1225 1260 1287 1321 1346 + 1468 1444 1404 1356 1326 1287 1265 1230 1188 1165 1132 1128 1087 1070 1048 1036 1039 1030 1030 1036 1048 1061 1083 1097 1117 1157 1165 1209 1225 1260 1283 1311 1346 + 1487 1439 1393 1361 1321 1287 1260 1225 1192 1165 1143 1117 1090 1067 1051 1036 1036 1033 1039 1036 1051 1064 1083 1097 1121 1143 1180 1200 1230 1247 1278 1306 1341 + 1474 1439 1404 1361 1331 1287 1251 1230 1188 1165 1139 1107 1087 1070 1048 1033 1033 1027 1033 1033 1051 1061 1083 1104 1124 1146 1177 1192 1225 1251 1278 1316 1341 + 1468 1444 1404 1372 1331 1292 1265 1225 1200 1173 1139 1114 1093 1058 1051 1039 1036 1036 1033 1039 1051 1064 1080 1107 1124 1154 1173 1205 1238 1256 1283 1321 1346 + 1468 1433 1410 1367 1331 1302 1269 1230 1196 1165 1143 1117 1090 1077 1058 1039 1036 1033 1042 1045 1054 1064 1087 1107 1139 1150 1177 1205 1234 1265 1278 1316 1331 + 1468 1444 1399 1367 1336 1292 1265 1230 1200 1169 1146 1114 1097 1073 1054 1045 1030 1036 1024 1042 1051 1067 1093 1107 1139 1154 1180 1205 1234 1260 1283 1316 1341 + 1499 1450 1410 1372 1341 1306 1278 1251 1209 1184 1150 1128 1104 1083 1064 1051 1042 1036 1048 1048 1061 1073 1093 1132 1143 1161 1192 1217 1234 1265 1297 1321 1361 + 1481 1450 1416 1372 1341 1306 1274 1242 1209 1184 1150 1124 1107 1083 1067 1054 1045 1048 1048 1054 1058 1077 1104 1121 1143 1165 1188 1217 1242 1269 1297 1336 1351 + 1474 1450 1421 1383 1351 1316 1278 1256 1225 1196 1157 1132 1107 1090 1077 1064 1058 1051 1058 1067 1073 1090 1104 1124 1154 1169 1196 1225 1256 1274 1297 1336 1356 + 1512 1468 1421 1399 1351 1321 1287 1256 1225 1196 1165 1150 1121 1100 1087 1073 1061 1061 1064 1070 1087 1097 1117 1128 1154 1180 1205 1230 1251 1278 1311 1346 1367 + 1499 1493 1416 1393 1367 1321 1283 1242 1234 1196 1180 1154 1135 1100 1083 1087 1067 1067 1067 1087 1090 1104 1110 1135 1173 1192 1213 1225 1260 1283 1316 1341 1356] + + + + + 1920x1080_F12_100 + + + 1920x1080 + + + F12 + + + [ 32] + + + [ 10] + + + [ 15] + + + [ 15] + + + [45 48 50 49 53 55 58 63 61 65 65 67 69 71 71 70 70 71 71 69 67 65 65 61 63 58 55 53 49 50 48 45] + + + [30 33 32 32 33 34 35 34 34 34 34 35 35 34 36 35] + + + [ 100] + + + [1890 1867 1791 1741 1683 1638 1579 1536 1499 1477 1426 1396 1378 1353 1330 1327 1310 1316 1307 1330 1324 1344 1368 1381 1400 1449 1480 1517 1548 1588 1630 1665 1721 + 1896 1840 1786 1721 1670 1625 1579 1540 1491 1459 1429 1384 1371 1344 1324 1313 1304 1307 1310 1318 1318 1344 1362 1384 1400 1436 1473 1499 1544 1584 1621 1665 1707 + 1856 1807 1745 1697 1643 1592 1548 1502 1463 1432 1396 1368 1341 1330 1304 1288 1283 1280 1277 1288 1293 1318 1336 1356 1378 1412 1439 1477 1506 1552 1588 1630 1665 + 1851 1781 1731 1674 1621 1579 1528 1484 1446 1409 1378 1339 1318 1296 1280 1277 1262 1262 1262 1267 1280 1288 1313 1339 1350 1393 1416 1456 1491 1536 1575 1613 1647 + 1812 1755 1697 1647 1600 1555 1502 1473 1419 1387 1362 1316 1302 1280 1267 1244 1244 1246 1246 1244 1262 1277 1296 1316 1344 1368 1400 1436 1470 1506 1559 1588 1630 + 1781 1731 1679 1617 1571 1525 1484 1446 1396 1365 1333 1302 1280 1262 1239 1224 1214 1219 1219 1229 1231 1249 1275 1291 1324 1347 1374 1406 1449 1480 1517 1555 1613 + 1771 1702 1652 1596 1552 1517 1459 1419 1378 1350 1316 1283 1262 1234 1226 1207 1207 1200 1205 1212 1221 1236 1256 1272 1302 1330 1359 1396 1432 1463 1502 1536 1579 + 1716 1674 1630 1579 1536 1480 1446 1406 1371 1327 1293 1264 1236 1217 1205 1198 1184 1177 1179 1191 1202 1212 1236 1256 1277 1310 1339 1374 1406 1432 1477 1510 1571 + 1688 1665 1613 1555 1510 1466 1426 1390 1333 1313 1283 1251 1214 1202 1186 1177 1164 1159 1161 1173 1182 1195 1212 1239 1262 1299 1316 1353 1387 1419 1459 1499 1532 + 1697 1643 1596 1540 1502 1452 1412 1368 1330 1296 1264 1229 1205 1188 1173 1159 1153 1153 1155 1157 1166 1193 1205 1221 1246 1275 1313 1344 1374 1406 1446 1488 1517 + 1683 1621 1571 1532 1477 1429 1387 1347 1307 1272 1246 1217 1195 1173 1155 1140 1136 1136 1131 1140 1155 1170 1184 1202 1229 1259 1288 1327 1359 1396 1426 1470 1502 + 1661 1613 1559 1506 1463 1416 1384 1336 1293 1262 1231 1200 1179 1157 1138 1127 1115 1113 1117 1131 1136 1153 1173 1186 1219 1251 1269 1304 1341 1381 1416 1449 1495 + 1638 1596 1548 1495 1449 1406 1362 1321 1285 1246 1221 1191 1168 1146 1125 1113 1107 1103 1105 1111 1127 1136 1159 1182 1205 1236 1269 1299 1330 1368 1400 1442 1477 + 1625 1584 1528 1484 1439 1396 1350 1310 1272 1239 1207 1179 1153 1131 1113 1095 1084 1082 1086 1097 1105 1125 1144 1166 1188 1221 1246 1285 1316 1341 1381 1429 1456 + 1625 1563 1525 1470 1432 1387 1341 1302 1264 1234 1195 1170 1148 1123 1101 1089 1080 1078 1080 1087 1101 1119 1138 1159 1188 1212 1241 1277 1313 1341 1384 1416 1446 + 1600 1559 1506 1463 1412 1368 1333 1296 1251 1209 1191 1157 1129 1111 1089 1070 1063 1061 1059 1070 1087 1103 1127 1144 1170 1205 1231 1264 1299 1327 1362 1393 1442 + 1600 1552 1495 1442 1403 1362 1324 1285 1244 1214 1177 1148 1127 1101 1078 1065 1056 1054 1059 1061 1070 1091 1113 1134 1157 1195 1229 1254 1288 1327 1359 1390 1419 + 1592 1540 1484 1449 1406 1359 1321 1280 1244 1202 1168 1146 1117 1093 1072 1061 1045 1045 1045 1056 1069 1087 1111 1131 1157 1191 1224 1249 1291 1313 1350 1390 1432 + 1575 1525 1480 1432 1390 1347 1310 1267 1234 1195 1159 1131 1111 1084 1061 1045 1040 1033 1036 1048 1059 1082 1097 1119 1148 1182 1207 1241 1275 1302 1341 1381 1416 + 1571 1525 1477 1439 1396 1347 1299 1264 1226 1195 1161 1134 1101 1078 1061 1045 1036 1036 1029 1041 1057 1072 1099 1121 1146 1177 1207 1241 1277 1304 1344 1381 1412 + 1559 1517 1470 1419 1374 1341 1299 1262 1224 1182 1157 1123 1095 1076 1056 1045 1031 1026 1026 1034 1052 1065 1091 1113 1140 1170 1198 1229 1256 1296 1333 1371 1403 + 1571 1513 1466 1419 1384 1339 1293 1254 1219 1188 1148 1121 1095 1072 1047 1038 1024 1024 1027 1031 1048 1057 1086 1117 1140 1168 1193 1226 1259 1296 1321 1362 1409 + 1575 1521 1470 1422 1393 1347 1302 1246 1224 1184 1153 1119 1099 1076 1048 1033 1027 1027 1033 1027 1050 1069 1087 1113 1138 1175 1202 1231 1269 1296 1330 1368 1409 + 1555 1513 1470 1416 1378 1327 1291 1256 1212 1182 1151 1117 1093 1074 1054 1034 1029 1026 1031 1027 1048 1063 1084 1117 1136 1166 1200 1229 1256 1296 1324 1368 1390 + 1559 1525 1466 1422 1374 1344 1291 1262 1219 1184 1146 1127 1099 1074 1054 1034 1027 1026 1029 1029 1045 1069 1087 1113 1142 1168 1195 1231 1264 1291 1330 1371 1406 + 1567 1513 1470 1419 1387 1336 1299 1254 1217 1188 1151 1121 1097 1076 1047 1038 1031 1027 1029 1033 1050 1072 1099 1117 1140 1168 1200 1229 1267 1296 1336 1374 1409 + 1567 1517 1473 1429 1378 1341 1302 1262 1219 1188 1159 1123 1105 1078 1054 1040 1029 1029 1031 1038 1052 1070 1091 1119 1144 1175 1202 1234 1267 1302 1341 1378 1403 + 1571 1528 1480 1432 1396 1359 1302 1267 1236 1195 1166 1134 1109 1086 1067 1050 1043 1040 1034 1050 1061 1080 1101 1127 1153 1184 1209 1246 1283 1310 1350 1390 1419 + 1575 1536 1484 1439 1396 1350 1316 1269 1231 1195 1164 1136 1111 1093 1067 1056 1050 1043 1043 1057 1067 1080 1103 1134 1153 1179 1219 1251 1277 1313 1353 1387 1419 + 1584 1544 1488 1449 1412 1353 1318 1272 1236 1202 1173 1146 1119 1095 1076 1067 1056 1050 1054 1065 1076 1087 1115 1136 1161 1191 1221 1256 1283 1316 1359 1387 1432 + 1584 1548 1499 1463 1412 1365 1333 1291 1251 1221 1186 1148 1127 1101 1086 1070 1067 1056 1067 1070 1086 1109 1125 1142 1173 1202 1229 1262 1299 1330 1365 1409 1436 + 1596 1555 1513 1463 1416 1381 1330 1296 1254 1226 1191 1161 1129 1113 1099 1080 1076 1065 1069 1078 1091 1105 1134 1144 1175 1207 1239 1272 1304 1333 1368 1409 1436 + 1617 1584 1521 1463 1426 1378 1341 1304 1264 1234 1195 1173 1142 1129 1113 1095 1089 1078 1078 1084 1097 1125 1134 1151 1184 1219 1249 1269 1313 1347 1384 1412 1463] + + + [1810 1767 1707 1669 1618 1587 1541 1501 1474 1435 1410 1377 1359 1349 1328 1314 1300 1314 1307 1309 1316 1316 1352 1364 1389 1416 1446 1469 1507 1526 1567 1608 1647 + 1793 1747 1691 1654 1615 1567 1535 1495 1457 1418 1392 1372 1344 1332 1314 1300 1291 1291 1293 1302 1309 1328 1342 1354 1382 1410 1435 1460 1501 1519 1554 1601 1622 + 1759 1707 1665 1622 1584 1532 1504 1466 1429 1400 1367 1340 1323 1296 1293 1276 1271 1267 1267 1273 1282 1296 1316 1332 1357 1379 1410 1438 1466 1498 1538 1564 1597 + 1742 1687 1650 1597 1561 1519 1477 1449 1408 1377 1354 1328 1307 1280 1267 1263 1248 1250 1248 1252 1265 1278 1293 1316 1340 1364 1397 1418 1457 1483 1513 1548 1577 + 1726 1676 1622 1587 1538 1501 1460 1429 1392 1362 1332 1307 1282 1276 1252 1240 1231 1229 1234 1240 1248 1267 1282 1302 1321 1342 1379 1400 1435 1454 1492 1532 1554 + 1684 1643 1597 1554 1510 1477 1432 1418 1367 1344 1314 1284 1267 1244 1227 1217 1212 1212 1221 1223 1229 1244 1256 1280 1296 1328 1344 1382 1410 1435 1477 1501 1535 + 1676 1622 1587 1541 1507 1471 1424 1392 1359 1323 1296 1263 1250 1229 1214 1206 1200 1196 1198 1202 1206 1219 1240 1261 1280 1309 1340 1369 1397 1424 1454 1492 1516 + 1650 1604 1564 1513 1471 1443 1410 1369 1337 1309 1269 1248 1227 1210 1196 1183 1175 1177 1174 1187 1196 1208 1227 1244 1267 1291 1309 1340 1377 1405 1438 1471 1510 + 1622 1587 1544 1513 1463 1429 1387 1354 1318 1291 1261 1234 1208 1188 1177 1168 1157 1159 1157 1166 1181 1188 1208 1227 1246 1280 1300 1328 1354 1384 1421 1451 1477 + 1611 1574 1538 1483 1451 1416 1382 1344 1302 1280 1248 1217 1204 1181 1164 1155 1152 1147 1148 1154 1161 1179 1200 1214 1231 1261 1282 1321 1352 1374 1405 1443 1474 + 1608 1554 1510 1477 1429 1400 1367 1321 1293 1258 1227 1208 1188 1166 1154 1136 1129 1127 1131 1134 1145 1166 1177 1202 1225 1250 1273 1298 1328 1362 1384 1429 1451 + 1587 1538 1504 1457 1421 1382 1352 1316 1276 1248 1223 1190 1170 1157 1138 1126 1117 1116 1116 1124 1133 1150 1164 1181 1206 1234 1261 1287 1316 1344 1382 1405 1443 + 1570 1535 1486 1454 1418 1369 1337 1307 1265 1244 1215 1181 1164 1136 1124 1112 1104 1098 1111 1109 1121 1134 1155 1179 1194 1229 1250 1276 1305 1332 1362 1400 1427 + 1554 1513 1477 1435 1392 1362 1328 1291 1252 1225 1194 1168 1148 1131 1104 1094 1093 1085 1093 1098 1103 1121 1143 1159 1177 1210 1231 1265 1291 1316 1344 1389 1424 + 1548 1513 1466 1427 1397 1352 1316 1282 1250 1212 1192 1168 1145 1121 1104 1085 1076 1076 1077 1087 1104 1117 1136 1155 1179 1208 1225 1256 1287 1314 1344 1377 1408 + 1532 1498 1460 1413 1377 1335 1307 1278 1238 1212 1174 1150 1124 1107 1091 1071 1066 1065 1065 1077 1087 1104 1119 1145 1168 1188 1214 1242 1273 1296 1330 1362 1400 + 1532 1480 1446 1410 1377 1332 1296 1263 1229 1202 1172 1141 1124 1091 1077 1066 1057 1056 1057 1063 1072 1088 1109 1129 1157 1187 1206 1231 1267 1293 1318 1357 1387 + 1526 1480 1435 1400 1362 1325 1291 1261 1227 1198 1164 1138 1114 1087 1072 1056 1048 1050 1048 1062 1071 1090 1112 1127 1154 1174 1204 1238 1263 1287 1321 1357 1384 + 1510 1471 1427 1392 1357 1325 1280 1252 1214 1179 1150 1124 1106 1085 1060 1050 1040 1035 1037 1045 1063 1074 1094 1119 1143 1170 1196 1223 1252 1273 1309 1344 1374 + 1507 1471 1429 1395 1359 1323 1273 1248 1210 1183 1164 1126 1098 1083 1056 1045 1032 1032 1035 1043 1054 1076 1090 1117 1136 1166 1190 1219 1250 1278 1311 1337 1372 + 1507 1471 1421 1384 1352 1309 1271 1240 1210 1175 1148 1117 1096 1076 1050 1043 1030 1031 1027 1035 1045 1068 1083 1111 1133 1161 1188 1214 1246 1271 1307 1337 1354 + 1498 1463 1427 1382 1349 1309 1267 1234 1206 1170 1148 1117 1099 1069 1050 1035 1028 1031 1030 1030 1044 1071 1080 1111 1127 1159 1187 1217 1248 1269 1298 1340 1364 + 1501 1463 1424 1387 1347 1307 1276 1240 1204 1172 1141 1117 1094 1072 1050 1035 1032 1030 1031 1032 1051 1063 1091 1104 1134 1163 1188 1214 1242 1267 1307 1335 1362 + 1504 1463 1424 1379 1335 1307 1267 1231 1198 1168 1145 1114 1087 1066 1048 1031 1024 1028 1035 1032 1041 1059 1082 1106 1127 1154 1188 1210 1240 1276 1302 1332 1359 + 1498 1469 1421 1382 1337 1309 1265 1238 1206 1174 1141 1117 1090 1066 1047 1031 1031 1028 1031 1028 1044 1066 1087 1104 1129 1157 1187 1214 1244 1271 1307 1332 1357 + 1495 1463 1427 1379 1340 1307 1269 1244 1202 1174 1138 1121 1096 1071 1054 1041 1032 1032 1031 1037 1051 1066 1087 1111 1138 1154 1192 1215 1246 1267 1305 1337 1367 + 1498 1471 1424 1384 1347 1311 1276 1244 1206 1179 1143 1116 1096 1076 1051 1038 1028 1028 1034 1032 1054 1071 1087 1109 1133 1157 1190 1219 1252 1273 1307 1342 1369 + 1510 1474 1435 1389 1354 1323 1282 1248 1208 1185 1147 1127 1106 1085 1056 1047 1041 1038 1040 1050 1059 1074 1103 1119 1147 1170 1194 1225 1248 1282 1316 1342 1377 + 1516 1477 1438 1387 1359 1314 1280 1254 1217 1183 1155 1133 1109 1088 1068 1054 1040 1040 1044 1050 1063 1080 1103 1119 1143 1168 1196 1225 1248 1284 1314 1344 1374 + 1510 1489 1446 1397 1364 1316 1293 1261 1221 1194 1155 1129 1114 1091 1071 1054 1050 1041 1047 1054 1069 1087 1103 1127 1154 1174 1204 1225 1261 1291 1314 1352 1379 + 1532 1492 1457 1416 1374 1332 1293 1267 1221 1202 1172 1141 1122 1104 1080 1069 1059 1057 1062 1068 1085 1098 1119 1133 1157 1187 1208 1234 1276 1296 1323 1364 1395 + 1519 1498 1446 1413 1374 1335 1298 1258 1229 1204 1170 1147 1126 1109 1087 1077 1063 1059 1062 1074 1087 1099 1117 1143 1161 1188 1210 1244 1271 1302 1330 1362 1392 + 1551 1516 1466 1416 1374 1347 1316 1276 1238 1215 1185 1148 1134 1112 1099 1083 1076 1076 1077 1093 1099 1107 1129 1143 1177 1200 1221 1244 1276 1311 1342 1367 1400] + + + [1830 1777 1736 1685 1630 1592 1562 1505 1472 1438 1417 1377 1362 1345 1324 1317 1312 1310 1310 1303 1328 1331 1352 1365 1401 1430 1452 1487 1517 1546 1585 1637 1666 + 1821 1769 1720 1681 1623 1575 1536 1496 1461 1430 1398 1372 1347 1324 1312 1301 1294 1296 1296 1305 1307 1319 1338 1362 1382 1417 1444 1472 1505 1530 1572 1609 1648 + 1786 1732 1685 1637 1592 1549 1508 1472 1427 1398 1375 1343 1324 1303 1289 1276 1267 1270 1263 1274 1285 1294 1324 1338 1355 1385 1411 1436 1475 1502 1542 1585 1612 + 1744 1708 1659 1609 1572 1536 1487 1452 1419 1382 1352 1326 1298 1287 1270 1257 1253 1253 1250 1261 1267 1278 1301 1319 1340 1372 1398 1419 1458 1478 1527 1552 1598 + 1740 1693 1644 1595 1555 1514 1469 1430 1401 1372 1335 1312 1285 1263 1250 1244 1234 1230 1236 1240 1257 1267 1280 1303 1319 1352 1380 1401 1441 1469 1508 1555 1572 + 1712 1666 1612 1568 1530 1484 1450 1406 1377 1347 1319 1285 1267 1244 1234 1216 1212 1206 1212 1222 1232 1238 1259 1280 1303 1331 1347 1380 1419 1447 1493 1527 1552 + 1681 1644 1598 1555 1517 1475 1430 1395 1365 1333 1296 1272 1253 1228 1218 1204 1196 1198 1196 1202 1212 1230 1242 1257 1287 1312 1338 1367 1398 1438 1472 1502 1533 + 1674 1626 1588 1530 1496 1447 1419 1380 1343 1312 1280 1255 1230 1212 1200 1185 1183 1176 1176 1183 1198 1204 1226 1246 1261 1292 1321 1350 1382 1411 1447 1478 1514 + 1655 1609 1558 1511 1467 1438 1393 1357 1326 1289 1265 1236 1216 1202 1181 1170 1165 1159 1161 1170 1176 1192 1208 1230 1253 1274 1305 1333 1372 1393 1430 1467 1493 + 1637 1595 1552 1505 1461 1427 1385 1350 1317 1278 1255 1220 1200 1179 1168 1154 1154 1150 1147 1150 1159 1181 1200 1212 1240 1263 1292 1328 1352 1380 1422 1458 1490 + 1619 1578 1533 1493 1444 1406 1370 1333 1298 1261 1234 1208 1187 1166 1152 1134 1133 1121 1128 1141 1147 1165 1181 1200 1228 1250 1274 1305 1335 1367 1403 1441 1464 + 1616 1572 1511 1481 1438 1395 1362 1324 1283 1253 1224 1200 1170 1152 1136 1123 1118 1109 1119 1119 1131 1148 1165 1191 1208 1236 1263 1296 1321 1355 1380 1419 1455 + 1602 1546 1511 1461 1419 1380 1350 1310 1270 1244 1210 1183 1165 1141 1124 1111 1106 1099 1103 1113 1123 1134 1152 1177 1202 1224 1253 1285 1317 1345 1377 1406 1438 + 1572 1533 1487 1450 1411 1375 1333 1296 1259 1230 1196 1174 1150 1131 1108 1095 1091 1083 1088 1096 1101 1119 1140 1166 1192 1206 1232 1265 1305 1328 1355 1401 1422 + 1565 1536 1490 1441 1403 1365 1326 1289 1248 1222 1191 1165 1140 1121 1103 1093 1087 1076 1080 1090 1103 1109 1136 1154 1181 1210 1232 1263 1292 1319 1365 1382 1422 + 1558 1520 1475 1433 1385 1347 1305 1276 1242 1206 1181 1156 1128 1103 1087 1080 1069 1066 1068 1076 1090 1098 1119 1141 1168 1191 1216 1240 1280 1301 1340 1377 1398 + 1546 1505 1461 1425 1385 1340 1305 1267 1236 1198 1166 1147 1126 1099 1082 1063 1057 1057 1057 1063 1074 1095 1114 1134 1156 1183 1210 1240 1265 1310 1331 1367 1395 + 1546 1496 1464 1417 1382 1345 1307 1263 1226 1194 1174 1145 1114 1096 1074 1062 1048 1047 1048 1054 1068 1091 1103 1131 1154 1176 1204 1232 1270 1296 1331 1365 1390 + 1527 1487 1452 1403 1362 1326 1289 1257 1224 1183 1161 1131 1106 1087 1059 1047 1038 1040 1037 1047 1057 1076 1093 1119 1145 1174 1198 1230 1253 1287 1317 1350 1385 + 1536 1487 1438 1406 1357 1326 1287 1253 1216 1185 1154 1129 1099 1085 1057 1046 1044 1035 1034 1043 1056 1076 1088 1118 1145 1172 1196 1226 1259 1283 1321 1350 1385 + 1527 1475 1433 1395 1365 1319 1276 1248 1210 1177 1140 1119 1093 1071 1050 1040 1030 1027 1028 1031 1047 1065 1085 1111 1131 1159 1194 1224 1248 1278 1310 1345 1377 + 1520 1475 1438 1390 1352 1312 1278 1238 1212 1176 1147 1121 1093 1071 1053 1035 1028 1031 1028 1030 1047 1059 1082 1106 1136 1159 1189 1222 1246 1283 1305 1345 1367 + 1520 1487 1436 1398 1350 1317 1283 1242 1210 1170 1143 1118 1093 1069 1046 1032 1031 1024 1028 1038 1046 1063 1088 1111 1131 1163 1185 1216 1248 1276 1307 1343 1375 + 1508 1469 1430 1385 1355 1317 1278 1234 1202 1174 1141 1114 1093 1069 1047 1035 1027 1024 1030 1031 1043 1062 1080 1104 1126 1159 1187 1218 1248 1278 1312 1343 1375 + 1527 1481 1436 1385 1352 1310 1278 1246 1206 1174 1141 1114 1088 1066 1050 1034 1032 1030 1027 1030 1051 1063 1088 1109 1134 1161 1187 1222 1244 1280 1314 1340 1382 + 1523 1484 1436 1398 1345 1317 1276 1244 1202 1179 1140 1121 1088 1069 1047 1032 1034 1025 1028 1035 1046 1062 1090 1108 1129 1163 1189 1218 1242 1276 1310 1345 1372 + 1511 1475 1441 1395 1360 1314 1283 1242 1208 1177 1148 1116 1096 1068 1048 1037 1032 1024 1031 1037 1047 1069 1088 1106 1136 1165 1183 1222 1255 1276 1314 1340 1380 + 1530 1490 1436 1395 1360 1331 1287 1250 1216 1179 1156 1128 1099 1076 1066 1047 1037 1034 1038 1044 1059 1079 1090 1116 1141 1172 1194 1222 1257 1287 1319 1357 1390 + 1542 1487 1444 1406 1365 1319 1287 1253 1212 1179 1148 1129 1109 1083 1060 1046 1041 1040 1038 1050 1059 1082 1103 1119 1141 1166 1196 1228 1255 1285 1317 1350 1390 + 1536 1490 1450 1411 1362 1338 1294 1259 1220 1194 1161 1134 1108 1088 1071 1060 1053 1047 1046 1054 1068 1085 1101 1116 1148 1170 1202 1234 1263 1289 1321 1355 1395 + 1552 1508 1458 1417 1372 1331 1303 1261 1230 1200 1166 1140 1119 1093 1077 1069 1062 1057 1059 1060 1082 1095 1114 1134 1154 1187 1206 1240 1276 1298 1335 1372 1401 + 1542 1511 1461 1417 1375 1347 1303 1265 1230 1206 1170 1140 1119 1103 1082 1077 1065 1065 1062 1077 1082 1096 1123 1138 1156 1187 1216 1244 1272 1301 1338 1362 1398 + 1585 1511 1464 1427 1393 1355 1310 1280 1242 1222 1187 1161 1133 1108 1093 1087 1074 1066 1073 1076 1098 1108 1131 1148 1168 1194 1222 1253 1280 1310 1352 1372 1406] + + + [1726 1694 1642 1622 1575 1539 1530 1480 1448 1433 1381 1347 1340 1320 1314 1301 1282 1307 1301 1301 1301 1320 1333 1360 1367 1403 1417 1456 1464 1505 1530 1539 1613 + 1737 1683 1652 1613 1566 1539 1496 1456 1440 1388 1374 1347 1327 1314 1301 1295 1282 1282 1282 1289 1301 1307 1327 1340 1353 1381 1410 1425 1456 1496 1522 1548 1584 + 1715 1673 1613 1594 1548 1513 1472 1440 1403 1381 1353 1327 1320 1295 1282 1276 1264 1258 1258 1264 1276 1289 1301 1314 1340 1367 1388 1417 1440 1464 1496 1539 1548 + 1673 1632 1594 1566 1539 1488 1448 1410 1388 1367 1340 1320 1307 1270 1264 1258 1247 1241 1241 1241 1264 1264 1282 1307 1327 1340 1367 1395 1425 1448 1472 1513 1548 + 1662 1632 1584 1557 1505 1472 1433 1395 1374 1360 1327 1295 1276 1253 1241 1235 1219 1224 1230 1241 1235 1253 1276 1289 1320 1333 1347 1360 1417 1433 1456 1488 1505 + 1652 1603 1557 1522 1488 1448 1425 1395 1353 1333 1289 1276 1253 1241 1224 1219 1197 1208 1213 1208 1224 1235 1258 1270 1289 1314 1340 1353 1388 1403 1433 1464 1496 + 1594 1584 1566 1496 1464 1448 1388 1381 1353 1301 1276 1264 1247 1224 1219 1202 1192 1197 1192 1192 1213 1224 1224 1253 1258 1301 1307 1353 1360 1388 1417 1456 1480 + 1603 1557 1539 1480 1456 1417 1388 1353 1307 1289 1270 1247 1230 1202 1186 1181 1176 1166 1176 1181 1186 1202 1219 1230 1253 1276 1295 1327 1360 1388 1417 1440 1464 + 1575 1548 1505 1472 1440 1403 1381 1353 1314 1289 1253 1235 1202 1181 1171 1166 1156 1151 1161 1166 1176 1192 1208 1219 1235 1258 1282 1307 1340 1360 1403 1410 1425 + 1584 1530 1505 1472 1425 1395 1360 1333 1301 1276 1241 1208 1197 1176 1161 1156 1151 1146 1151 1146 1166 1171 1181 1202 1224 1241 1276 1301 1333 1360 1395 1403 1425 + 1557 1530 1480 1448 1395 1388 1347 1314 1276 1264 1230 1208 1181 1166 1146 1132 1132 1132 1127 1141 1156 1156 1176 1197 1213 1230 1258 1276 1314 1340 1367 1395 1433 + 1548 1505 1464 1433 1388 1367 1340 1314 1264 1241 1224 1192 1176 1156 1141 1122 1108 1108 1113 1122 1127 1146 1161 1176 1202 1224 1253 1276 1301 1327 1360 1381 1417 + 1530 1496 1472 1425 1395 1360 1320 1301 1258 1235 1202 1181 1156 1136 1113 1113 1108 1095 1104 1104 1117 1127 1151 1166 1192 1224 1235 1270 1295 1327 1347 1374 1403 + 1522 1488 1456 1395 1374 1347 1314 1270 1253 1213 1197 1176 1146 1127 1099 1095 1090 1077 1090 1090 1108 1122 1136 1151 1181 1202 1230 1258 1276 1314 1320 1360 1388 + 1505 1480 1433 1395 1353 1340 1320 1276 1247 1213 1186 1166 1151 1117 1104 1090 1077 1077 1082 1086 1090 1113 1122 1156 1171 1192 1219 1253 1270 1301 1320 1353 1381 + 1496 1456 1425 1388 1353 1333 1282 1276 1235 1208 1181 1146 1127 1108 1090 1073 1064 1056 1069 1064 1082 1104 1117 1136 1151 1181 1197 1235 1258 1289 1314 1333 1367 + 1505 1448 1417 1388 1347 1307 1282 1258 1224 1192 1161 1141 1122 1090 1077 1064 1056 1052 1056 1060 1082 1086 1099 1132 1156 1176 1197 1224 1253 1276 1301 1327 1353 + 1488 1448 1410 1374 1340 1320 1289 1241 1213 1186 1161 1132 1108 1086 1077 1056 1048 1048 1044 1052 1069 1086 1090 1127 1141 1161 1197 1224 1241 1282 1301 1333 1360 + 1472 1433 1403 1367 1333 1301 1270 1230 1208 1171 1161 1122 1104 1086 1056 1052 1040 1032 1036 1048 1060 1077 1086 1122 1132 1161 1192 1202 1235 1264 1295 1307 1347 + 1472 1433 1403 1360 1320 1307 1270 1230 1208 1181 1141 1117 1095 1086 1060 1048 1040 1028 1040 1044 1056 1064 1095 1117 1132 1156 1176 1213 1230 1258 1289 1320 1340 + 1456 1417 1381 1360 1333 1295 1258 1224 1192 1156 1141 1117 1090 1069 1044 1036 1036 1032 1028 1036 1044 1069 1077 1117 1127 1156 1176 1197 1224 1247 1276 1295 1340 + 1440 1425 1403 1353 1327 1289 1264 1219 1197 1161 1136 1113 1090 1069 1044 1036 1032 1024 1028 1032 1048 1056 1077 1104 1127 1151 1176 1197 1219 1258 1276 1307 1333 + 1464 1448 1403 1353 1320 1295 1253 1224 1197 1166 1141 1108 1082 1064 1044 1036 1028 1028 1032 1036 1036 1052 1082 1104 1127 1146 1171 1192 1235 1247 1289 1307 1327 + 1456 1433 1388 1360 1320 1295 1258 1224 1197 1166 1141 1104 1086 1056 1048 1028 1028 1024 1028 1028 1048 1060 1069 1095 1117 1141 1161 1192 1219 1247 1282 1301 1347 + 1456 1440 1403 1367 1327 1289 1270 1230 1197 1171 1136 1099 1086 1060 1040 1024 1032 1024 1032 1028 1052 1060 1077 1095 1132 1146 1176 1202 1224 1264 1282 1301 1340 + 1456 1425 1388 1353 1320 1289 1264 1230 1197 1171 1132 1104 1090 1064 1048 1024 1032 1024 1036 1032 1044 1060 1077 1099 1127 1156 1176 1197 1230 1253 1282 1295 1340 + 1464 1433 1388 1353 1333 1301 1258 1230 1197 1171 1136 1113 1086 1060 1052 1036 1024 1028 1032 1036 1044 1060 1073 1108 1132 1151 1181 1197 1235 1247 1282 1307 1340 + 1472 1433 1410 1360 1327 1289 1264 1235 1192 1166 1136 1122 1090 1073 1052 1044 1036 1036 1028 1040 1048 1069 1095 1108 1127 1156 1181 1202 1230 1253 1276 1314 1340 + 1464 1433 1403 1360 1327 1282 1270 1241 1202 1181 1146 1127 1095 1073 1060 1044 1032 1040 1032 1040 1060 1077 1099 1117 1141 1156 1181 1202 1235 1253 1289 1307 1353 + 1464 1456 1403 1374 1333 1301 1282 1230 1208 1186 1151 1127 1099 1082 1064 1056 1040 1040 1040 1044 1056 1073 1095 1117 1136 1161 1186 1219 1235 1264 1295 1320 1333 + 1472 1448 1403 1374 1347 1314 1276 1247 1208 1186 1161 1127 1113 1095 1064 1056 1056 1048 1056 1060 1073 1082 1099 1117 1141 1171 1186 1213 1247 1270 1307 1327 1353 + 1488 1440 1417 1374 1333 1307 1276 1247 1213 1192 1156 1132 1113 1095 1069 1069 1064 1048 1052 1056 1077 1086 1104 1122 1141 1166 1197 1230 1253 1276 1295 1340 1347 + 1505 1464 1410 1381 1353 1320 1289 1270 1219 1192 1171 1141 1136 1108 1073 1069 1064 1069 1064 1077 1082 1099 1113 1132 1151 1176 1202 1235 1253 1289 1301 1327 1353] + + + + + + + A_100 + + + [ 100] + + + [1.65109 -0.164824 -0.486268 -0.477326 1.75283 -0.275504 0.114565 -1.18037 2.0658] + + + [0 0 0] + + + [1.21742 1 1 3.2662] + + + + + D50_100 + + + [ 100] + + + [1.78555 -0.639126 -0.146426 -0.312724 1.6701 -0.357375 0.0557804 -0.75418 1.6984] + + + [0 0 0] + + + [1.84715 1 1 1.8834] + + + + + D65_100 + + + [ 100] + + + [1.76069 -0.652646 -0.108048 -0.291881 1.62035 -0.328466 0.0097552 -0.579155 1.5694] + + + [0 0 0] + + + [2.08473 1 1 1.6526] + + + + + F11_100 + + + [ 100] + + + [1.81385 -0.612826 -0.201022 -0.380081 1.59118 -0.211099 0.0598573 -0.690456 1.6306] + + + [0 0 0] + + + [1.55143 1 1 2.335] + + + + + F12_100 + + + [ 100] + + + [1.53261 -0.298219 -0.234395 -0.544301 1.76922 -0.224918 0.0315831 -0.881887 1.8503] + + + [0 0 0] + + + [1.20934 1 1 3.207] + + + + + + [ -1] + + + + + [ 50] + + + [ 10] + + + [ 0.3] + + + [ 0.3] + + + [ 0.3] + + + [ 0.3] + + + + + 1920x1080_FPS_15 + + + + + fast + + + [ 1] + + + [ 2] + + + + + normal + + + [ 1] + + + [ 1] + + + + + slow + + + [ 2] + + + [ 1] + + + + + + + 1920x1080_FPS_10 + + + + + fast + + + [ 1] + + + [ 2] + + + + + normal + + + [ 1] + + + [ 1] + + + + + slow + + + [ 2] + + + [ 1] + + + + + + + 1920x1080_FPS_05 + + + + + fast + + + [ 1] + + + [ 1] + + + + + normal + + + [ 2] + + + [ 0.9] + + + + + slow + + + [ 4] + + + [ 0.9] + + + + + + + [ 8] + + + + + + 1920x1080 + + + 1920x1080 + + + [64 64 64 64] + + + + + + + linear + + + [256 512 768 1024 1280 1536 1792 2048 2304 2560 2816 3072 3328 3584 3840 4096] + + + [0 256 512 768 1024 1280 1536 1792 2048 2304 2560 2816 3072 3328 3584 3840 4095] + + + + + + [ -1] + + + + [-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1] + + + [-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1] + + + + + [-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1] + + + [-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1] + + + + + + + 1920x1080 + + + 1920x1080 + + + [ 6] + + + [ 21] + + + [ 6] + + + [ 21] + + + [ 0] + + + [ 0] + + + [-30 59 -41] + + + [-56 117 -68] + + + + + + + 1920x1080 + + + 1920x1080 + + + [ 1] + + + [1023 736 525 430 373 305 264 236 216 187 167 153 132 118 108 100 94] + + + [ 4] + + + [ 4] + + + [ 0.15] + + + [ 0] + + + [1 1 1 1] + + + + + + + 1920x1080 + + + 1920x1080 + + + + + ISP_DPCC_MODE + + + 0x0004 + + + + + ISP_DPCC_OUT_MODE + + + 0x0003 + + + + + ISP_DPCC_SET_USE + + + 0x0007 + + + + + ISP_DPCC_METHODS_SET1 + + + 0x1D1D + + + + + ISP_DPCC_METHODS_SET2 + + + 0x0707 + + + + + ISP_DPCC_METHODS_SET3 + + + 0x1F1F + + + + + ISP_DPCC_LINE_THRESH_1 + + + 0x0808 + + + + + ISP_DPCC_LINE_MAD_FAC_1 + + + 0x0404 + + + + + ISP_DPCC_PG_FAC_1 + + + 0x0403 + + + + + ISP_DPCC_RND_THRESH_1 + + + 0x0A0A + + + + + ISP_DPCC_RG_FAC_1 + + + 0x2020 + + + + + ISP_DPCC_LINE_THRESH_2 + + + 0x100C + + + + + ISP_DPCC_LINE_MAD_FAC_2 + + + 0x1810 + + + + + ISP_DPCC_PG_FAC_2 + + + 0x0403 + + + + + ISP_DPCC_RND_THRESH_2 + + + 0x0808 + + + + + ISP_DPCC_RG_FAC_2 + + + 0x0808 + + + + + ISP_DPCC_LINE_THRESH_3 + + + 0x2020 + + + + + ISP_DPCC_LINE_MAD_FAC_3 + + + 0x0404 + + + + + ISP_DPCC_PG_FAC_3 + + + 0x0403 + + + + + ISP_DPCC_RND_THRESH_3 + + + 0x0806 + + + + + ISP_DPCC_RG_FAC_3 + + + 0x0404 + + + + + ISP_DPCC_RO_LIMITS + + + 0x0A0A + + + + + ISP_DPCC_RND_OFFS + + + 0x0FFF + + + + + + + + + + on + + + +
diff --git a/src/big/mpp/userapps/src/sensor/config/gc2053-1920x1080_auto.json b/src/big/mpp/userapps/src/sensor/config/gc2053-1920x1080_auto.json new file mode 100644 index 000000000..f86905f16 --- /dev/null +++ b/src/big/mpp/userapps/src/sensor/config/gc2053-1920x1080_auto.json @@ -0,0 +1,810 @@ +{ + "root": [ + { + "antiBandingMode": 1, + "classname": "AdaptiveAe", + "dampOver": 0.3, + "dampOverGain": 4.0, + "dampOverRatio": 2.0, + "dampUnder": 0.3, + "dampUnderGain": 4.0, + "dampUnderRatio": 0.5, + "enable": true, + "lowlight": { + "hdr_gain": [4, 8, 16, 32, 100], + "hdr_repress": [1, 0.8, 0.8, 0.8, 0.8], + "linear_gain": [4, 8, 16, 32, 100], + "linear_repress": [1, 0.8, 0.6, 0.4, 0.4] + }, + "maxIspDgain": 1, + "maxSensorAgain": 50.0, + "maxSensorDgain": 1, + "mode": 1, + "motionFilter": 0.5, + "motionThreshold": 0.7, + "roiWeight": 0.6, + "semMode": 1, + "setPoint": 50, + "targetFilter": 0.5, + "tolerance": 10, + "wdrContrast.max": 110, + "wdrContrast.min": 10 + }, + { + "avg": 0.01, + "classname": "Awbv2", + "enable": true, + "illuorder": "A, D50, D65, F11, F12", + "indoor": [0.3, 1, 1, 1, 1], + "outdoor": [0, 1, 1, 1, 0], + "overExposureWeight": [ + 0.5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.8, 0.6, 0.4, 0.2 + ], + "transition": [1, 1, 1, 1, 1] + }, + { + "cMseTolerance": 0.2, + "cPdConfThreshold": 50, + "cPointsOfCurve": 12, + "cStableTolerance": 0.2, + "classname": "Af", + "enable": false, + "focalFilter": [440, 0, 3, 100, 1], + "maxFocal": 600, + "minFocal": 400, + "shapFilter": [10, 0, 2, 10, 1], + "stableThreshold": 0.005, + "stableTolerance": 0.1, + "step": 13, + "weightWindow": [0.3, 1, 0.7], + "PdFocal": [-38, -38, -38, -38, -38, -38, -38, -38, -38, -38, 0, 0, 0, 0, 0, 0], + "PdDistance": 8, + "PdShiftThreshold": 0.1, + "PdStablecountMax": 2 + }, + { + "classname": "IspController", + "enable": true + }, + { + "classname": "CcWhitePixels", + "damping": 0.5, + "enable": true + }, + { + "classname": "LscWhitePixels", + "damping": 0.5, + "enable": true + }, + { + "classname": "AutoHdr", + "enable": false + }, + { + "classname": "DciHist", + "enable": false, + "gaussAmpNeg": 1, + "gaussAmpPos": 1, + "gaussMeanNeg": 0, + "gaussMeanPos": 64, + "gaussSigmaNeg": 128, + "gaussSigmaPos": 128 + }, + { + "classname": "SensorController", + "enable": true + }, + { + "classname": "AGamma64", + "disable": false, + "enable": true, + "forcecreate": true, + "tables": [ + { + "curve": [ + [ + 154, 211, 254, 290, 321, 348, 374, 397, 419, 440, 459, 478, 495, + 512, 529, 544, 560, 574, 589, 602, 616, 629, 642, 655, 667, 679, + 691, 702, 713, 725, 735, 746, 757, 767, 777, 787, 797, 807, 816, + 826, 835, 844, 853, 862, 871, 880, 889, 897, 906, 914, 922, 930, + 939, 947, 955, 962, 970, 978, 985, 993, 1001, 1008, 1015, 1023 + ], + [ + 147, 204, 246, 281, 312, 340, 365, 389, 411, 431, 451, 470, 487, + 505, 521, 537, 552, 567, 582, 596, 609, 623, 636, 648, 661, 673, + 685, 697, 708, 719, 730, 741, 752, 763, 773, 783, 793, 803, 813, + 822, 832, 841, 851, 860, 869, 878, 887, 895, 904, 912, 921, 929, + 938, 946, 954, 962, 970, 978, 985, 993, 1001, 1008, 1016, 1023 + ], + [ + 141, 196, 238, 273, 304, 331, 356, 380, 402, 423, 442, 461, 479, + 496, 513, 529, 544, 559, 574, 588, 602, 615, 629, 641, 654, 666, + 678, 690, 702, 713, 725, 736, 746, 757, 768, 778, 788, 798, 808, + 818, 828, 837, 847, 856, 865, 874, 883, 892, 901, 910, 919, 927, + 936, 944, 952, 960, 969, 977, 985, 993, 1000, 1008, 1016, 1023 + ], + [ + 134, 188, 230, 264, 295, 322, 347, 371, 393, 414, 433, 452, 470, + 487, 504, 520, 536, 551, 566, 580, 594, 608, 621, 634, 647, 659, + 672, 684, 695, 707, 719, 730, 741, 752, 762, 773, 783, 794, 804, + 814, 824, 833, 843, 852, 862, 871, 880, 889, 898, 907, 916, 925, + 933, 942, 951, 959, 967, 975, 984, 992, 1000, 1008, 1016, 1023 + ], + [ + 128, 181, 221, 256, 286, 313, 338, 362, 384, 404, 424, 443, 461, + 478, 495, 512, 527, 543, 557, 572, 586, 600, 613, 627, 640, 652, + 665, 677, 689, 701, 712, 724, 735, 746, 757, 768, 778, 789, 799, + 809, 819, 829, 839, 849, 858, 868, 877, 886, 896, 905, 914, 923, + 931, 940, 949, 957, 966, 974, 983, 991, 999, 1007, 1015, 1023 + ], + [ + 114, 165, 204, 237, 267, 294, 319, 342, 364, 385, 405, 424, 442, + 460, 477, 493, 509, 525, 540, 555, 569, 583, 597, 611, 624, 637, + 650, 662, 675, 687, 699, 710, 722, 734, 745, 756, 767, 778, 789, + 799, 810, 820, 830, 840, 850, 860, 870, 880, 889, 899, 908, 917, + 927, 936, 945, 954, 963, 972, 981, 989, 998, 1007, 1015, 1023 + ] + ], + "gains": [1, 4, 8, 16, 32, 64], + "hdr": false + }, + { + "curve": [ + [ + 154, 211, 254, 290, 321, 348, 374, 397, 419, 440, 459, 478, 495, + 512, 529, 544, 560, 574, 589, 602, 616, 629, 642, 655, 667, 679, + 691, 702, 713, 725, 735, 746, 757, 767, 777, 787, 797, 807, 816, + 826, 835, 844, 853, 862, 871, 880, 889, 897, 906, 914, 922, 930, + 939, 947, 955, 962, 970, 978, 985, 993, 1001, 1008, 1015, 1023 + ], + [ + 147, 204, 246, 281, 312, 340, 365, 389, 411, 431, 451, 470, 487, + 505, 521, 537, 552, 567, 582, 596, 609, 623, 636, 648, 661, 673, + 685, 697, 708, 719, 730, 741, 752, 763, 773, 783, 793, 803, 813, + 822, 832, 841, 851, 860, 869, 878, 887, 895, 904, 912, 921, 929, + 938, 946, 954, 962, 970, 978, 985, 993, 1001, 1008, 1016, 1023 + ], + [ + 141, 196, 238, 273, 304, 331, 356, 380, 402, 423, 442, 461, 479, + 496, 513, 529, 544, 559, 574, 588, 602, 615, 629, 641, 654, 666, + 678, 690, 702, 713, 725, 736, 746, 757, 768, 778, 788, 798, 808, + 818, 828, 837, 847, 856, 865, 874, 883, 892, 901, 910, 919, 927, + 936, 944, 952, 960, 969, 977, 985, 993, 1000, 1008, 1016, 1023 + ], + [ + 134, 188, 230, 264, 295, 322, 347, 371, 393, 414, 433, 452, 470, + 487, 504, 520, 536, 551, 566, 580, 594, 608, 621, 634, 647, 659, + 672, 684, 695, 707, 719, 730, 741, 752, 762, 773, 783, 794, 804, + 814, 824, 833, 843, 852, 862, 871, 880, 889, 898, 907, 916, 925, + 933, 942, 951, 959, 967, 975, 984, 992, 1000, 1008, 1016, 1023 + ], + [ + 128, 181, 221, 256, 286, 313, 338, 362, 384, 404, 424, 443, 461, + 478, 495, 512, 527, 543, 557, 572, 586, 600, 613, 627, 640, 652, + 665, 677, 689, 701, 712, 724, 735, 746, 757, 768, 778, 789, 799, + 809, 819, 829, 839, 849, 858, 868, 877, 886, 896, 905, 914, 923, + 931, 940, 949, 957, 966, 974, 983, 991, 999, 1007, 1015, 1023 + ], + [ + 114, 165, 204, 237, 267, 294, 319, 342, 364, 385, 405, 424, 442, + 460, 477, 493, 509, 525, 540, 555, 569, 583, 597, 611, 624, 637, + 650, 662, 675, 687, 699, 710, 722, 734, 745, 756, 767, 778, 789, + 799, 810, 820, 830, 840, 850, 860, 870, 880, 889, 899, 908, 917, + 927, 936, 945, 954, 963, 972, 981, 989, 998, 1007, 1015, 1023 + ] + ], + "gains": [1, 4, 8, 16, 32, 64], + "hdr": true + } + ] + }, + { + "classname": "ACproc", + "disable": false, + "enable": true, + "forcecreate": true, + "tables": [ + { + "bright": [0, 0, 0, 0, 0], + "chroma_out": [2, 2, 2, 2, 2], + "contrast": [1.0, 1.0, 1.0, 1.0, 1.0], + "gains": [1, 4, 16, 32, 64], + "hdr": false, + "hue": [0, 0, 0, 0, 0], + "luma_in": [2, 2, 2, 2, 2], + "luma_out": [2, 2, 2, 2, 2], + "saturation": [1.25, 1.25, 1.15, 1.1, 1.0] + }, + { + "bright": [0, 0, 0, 0, 0], + "chroma_out": [2, 2, 2, 2, 2], + "contrast": [1.0, 1.0, 1.0, 1.0, 1.0], + "gains": [1, 4, 16, 32, 64], + "hdr": true, + "hue": [0, 0, 0, 0, 0], + "luma_in": [2, 2, 2, 2, 2], + "luma_out": [2, 2, 2, 2, 2], + "saturation": [1.25, 1.25, 1.15, 1.1, 1.0] + } + ] + }, + { + "classname": "Aeev1", + "disable": false, + "enable": false, + "forcecreate": true, + "tables": [ + { + "ca_curve": [ + [ + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024 + ], + [ + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024 + ], + [ + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024 + ], + [ + 0, 149, 278, 390, 486, 570, 641, 702, 754, 799, 836, 868, 895, + 918, 937, 953, 966, 977, 986, 993, 999, 1004, 1008, 1012, 1014, + 1016, 1018, 1019, 1020, 1021, 1022, 1022, 1023, 1023, 1023, 1023, + 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, + 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, + 1023, 1023, 1023, 1023, 1023, 1024, 1024 + ], + [ + 0, 149, 278, 390, 486, 570, 641, 702, 754, 799, 836, 868, 895, + 918, 937, 953, 966, 977, 986, 993, 999, 1004, 1008, 1012, 1014, + 1016, 1018, 1019, 1020, 1021, 1022, 1022, 1023, 1023, 1023, 1023, + 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, + 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, + 1023, 1023, 1023, 1023, 1023, 1024, 1024 + ], + [ + 0, 0, 0, 48, 378, 600, 747, 845, 909, 950, 977, 995, 1006, 1012, + 1017, 1019, 1021, 1022, 1023, 1023, 1023, 1023, 1023, 1023, 1023, + 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024 + ] + ], + "ca_enable": [0, 0, 0, 0, 0, 0], + "dci_curve": [ + [ + 0, 1, 5, 9, 16, 23, 32, 42, 54, 67, 81, 95, 111, 127, 144, 162, + 180, 198, 215, 234, 252, 270, 287, 305, 323, 340, 357, 374, 391, + 407, 424, 440, 457, 473, 489, 506, 522, 539, 556, 573, 590, 607, + 625, 644, 662, 681, 700, 721, 741, 761, 782, 804, 826, 847, 869, + 891, 912, 933, 952, 970, 987, 1000, 1011, 1019, 1022 + ], + [ + 0, 1, 5, 9, 16, 23, 32, 42, 54, 67, 81, 95, 111, 127, 144, 162, + 180, 198, 215, 234, 252, 270, 287, 305, 323, 340, 357, 374, 391, + 407, 424, 440, 457, 473, 489, 506, 522, 539, 556, 573, 590, 607, + 625, 644, 662, 681, 700, 721, 741, 761, 782, 804, 826, 847, 869, + 891, 912, 933, 952, 970, 987, 1000, 1011, 1019, 1022 + ], + [ + 0, 1, 5, 9, 16, 23, 32, 42, 54, 67, 81, 95, 111, 127, 144, 162, + 180, 198, 215, 234, 252, 270, 287, 305, 323, 340, 357, 374, 391, + 407, 424, 440, 457, 473, 489, 506, 522, 539, 556, 573, 590, 607, + 625, 644, 662, 681, 700, 721, 741, 761, 782, 804, 826, 847, 869, + 891, 912, 933, 952, 970, 987, 1000, 1011, 1019, 1022 + ], + [ + 0, 1, 5, 9, 16, 23, 32, 42, 54, 67, 81, 95, 111, 127, 144, 162, + 180, 198, 215, 234, 252, 270, 287, 305, 323, 340, 357, 374, 391, + 407, 424, 440, 457, 473, 489, 506, 522, 539, 556, 573, 590, 607, + 625, 644, 662, 681, 700, 721, 741, 761, 782, 804, 826, 847, 869, + 891, 912, 933, 952, 970, 987, 1000, 1011, 1019, 1022 + ], + [ + 0, 1, 5, 9, 16, 23, 32, 42, 54, 67, 81, 95, 111, 127, 144, 162, + 180, 198, 215, 234, 252, 270, 287, 305, 323, 340, 357, 374, 391, + 407, 424, 440, 457, 473, 489, 506, 522, 539, 556, 573, 590, 607, + 625, 644, 662, 681, 700, 721, 741, 761, 782, 804, 826, 847, 869, + 891, 912, 933, 952, 970, 987, 1000, 1011, 1019, 1022 + ], + [ + 0, 1, 5, 9, 16, 23, 32, 42, 54, 67, 81, 95, 111, 127, 144, 162, + 180, 198, 215, 234, 252, 270, 287, 305, 323, 340, 357, 374, 391, + 407, 424, 440, 457, 473, 489, 506, 522, 539, 556, 573, 590, 607, + 625, 644, 662, 681, 700, 721, 741, 761, 782, 804, 826, 847, 869, + 891, 912, 933, 952, 970, 987, 1000, 1011, 1019, 1022 + ] + ], + "dci_enable": [0, 0, 0, 0, 0, 0], + "ee_edge_gain": [2000, 2000, 2000, 2000, 2000, 2000], + "ee_src_strength": [1, 1, 1, 1, 1, 1], + "ee_strength": [110, 110, 110, 100, 100, 100], + "ee_uv_gain": [0, 0, 0, 0, 0, 0], + "ee_y_down_gain": [3000, 3000, 3000, 3000, 3000, 3000], + "ee_y_up_gain": [1000, 1000, 1000, 1000, 1000, 1000], + "gains": [1, 4, 8, 16, 32, 64], + "hdr": false + }, + { + "ca_curve": [ + [ + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024 + ], + [ + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024 + ], + [ + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024 + ], + [ + 0, 149, 278, 390, 486, 570, 641, 702, 754, 799, 836, 868, 895, + 918, 937, 953, 966, 977, 986, 993, 999, 1004, 1008, 1012, 1014, + 1016, 1018, 1019, 1020, 1021, 1022, 1022, 1023, 1023, 1023, 1023, + 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, + 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, + 1023, 1023, 1023, 1023, 1023, 1024, 1024 + ], + [ + 0, 149, 278, 390, 486, 570, 641, 702, 754, 799, 836, 868, 895, + 918, 937, 953, 966, 977, 986, 993, 999, 1004, 1008, 1012, 1014, + 1016, 1018, 1019, 1020, 1021, 1022, 1022, 1023, 1023, 1023, 1023, + 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, + 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, + 1023, 1023, 1023, 1023, 1023, 1024, 1024 + ], + [ + 0, 0, 0, 48, 378, 600, 747, 845, 909, 950, 977, 995, 1006, 1012, + 1017, 1019, 1021, 1022, 1023, 1023, 1023, 1023, 1023, 1023, 1023, + 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024 + ] + ], + "ca_enable": [1, 1, 1, 1, 1, 1], + "dci_curve": [ + [ + 0, 1, 5, 9, 16, 23, 32, 42, 54, 67, 81, 95, 111, 127, 144, 162, + 180, 198, 215, 234, 252, 270, 287, 305, 323, 340, 357, 374, 391, + 407, 424, 440, 457, 473, 489, 506, 522, 539, 556, 573, 590, 607, + 625, 644, 662, 681, 700, 721, 741, 761, 782, 804, 826, 847, 869, + 891, 912, 933, 952, 970, 987, 1000, 1011, 1019, 1022 + ], + [ + 0, 1, 5, 9, 16, 23, 32, 42, 54, 67, 81, 95, 111, 127, 144, 162, + 180, 198, 215, 234, 252, 270, 287, 305, 323, 340, 357, 374, 391, + 407, 424, 440, 457, 473, 489, 506, 522, 539, 556, 573, 590, 607, + 625, 644, 662, 681, 700, 721, 741, 761, 782, 804, 826, 847, 869, + 891, 912, 933, 952, 970, 987, 1000, 1011, 1019, 1022 + ], + [ + 0, 1, 5, 9, 16, 23, 32, 42, 54, 67, 81, 95, 111, 127, 144, 162, + 180, 198, 215, 234, 252, 270, 287, 305, 323, 340, 357, 374, 391, + 407, 424, 440, 457, 473, 489, 506, 522, 539, 556, 573, 590, 607, + 625, 644, 662, 681, 700, 721, 741, 761, 782, 804, 826, 847, 869, + 891, 912, 933, 952, 970, 987, 1000, 1011, 1019, 1022 + ], + [ + 0, 1, 5, 9, 16, 23, 32, 42, 54, 67, 81, 95, 111, 127, 144, 162, + 180, 198, 215, 234, 252, 270, 287, 305, 323, 340, 357, 374, 391, + 407, 424, 440, 457, 473, 489, 506, 522, 539, 556, 573, 590, 607, + 625, 644, 662, 681, 700, 721, 741, 761, 782, 804, 826, 847, 869, + 891, 912, 933, 952, 970, 987, 1000, 1011, 1019, 1022 + ], + [ + 0, 1, 5, 9, 16, 23, 32, 42, 54, 67, 81, 95, 111, 127, 144, 162, + 180, 198, 215, 234, 252, 270, 287, 305, 323, 340, 357, 374, 391, + 407, 424, 440, 457, 473, 489, 506, 522, 539, 556, 573, 590, 607, + 625, 644, 662, 681, 700, 721, 741, 761, 782, 804, 826, 847, 869, + 891, 912, 933, 952, 970, 987, 1000, 1011, 1019, 1022 + ], + [ + 0, 1, 5, 9, 16, 23, 32, 42, 54, 67, 81, 95, 111, 127, 144, 162, + 180, 198, 215, 234, 252, 270, 287, 305, 323, 340, 357, 374, 391, + 407, 424, 440, 457, 473, 489, 506, 522, 539, 556, 573, 590, 607, + 625, 644, 662, 681, 700, 721, 741, 761, 782, 804, 826, 847, 869, + 891, 912, 933, 952, 970, 987, 1000, 1011, 1019, 1022 + ] + ], + "dci_enable": [1, 1, 1, 1, 1, 1], + "ee_edge_gain": [2000, 2000, 2000, 2000, 2000, 2000], + "ee_src_strength": [1, 1, 1, 1, 1, 1], + "ee_strength": [110, 110, 110, 100, 100, 100], + "ee_uv_gain": [0, 0, 0, 0, 0, 0], + "ee_y_down_gain": [3000, 3000, 3000, 3000, 3000, 3000], + "ee_y_up_gain": [1000, 1000, 1000, 1000, 1000, 1000], + "gains": [1, 4, 8, 16, 32, 64], + "hdr": true + } + ] + }, + { + "classname": "ADmscv2", + "disable": false, + "enable": false, + "forcecreate": true, + "tables": [ + { + "dmsc_denoise_strength": [0, 0, 0, 0, 0, 0], + "dmsc_depurple_cbcr_mode": [3, 3, 3, 3, 3, 3], + "dmsc_depurple_enable": [1, 1, 1, 1, 1, 1], + "dmsc_depurple_sat_shrink": [8, 8, 8, 8, 8, 8], + "dmsc_depurple_thr": [20, 40, 60, 80, 100, 140], + "dmsc_sharpen_clip_black": [500, 500, 500, 300, 300, 300], + "dmsc_sharpen_clip_white": [500, 500, 500, 300, 300, 300], + "dmsc_sharpen_enable": [1, 1, 1, 1, 1, 1], + "dmsc_sharpen_factor_black": [200, 150, 130, 100, 90, 70], + "dmsc_sharpen_factor_white": [200, 150, 130, 100, 90, 70], + "dmsc_sharpen_r1": [0, 0, 0, 0, 0, 0], + "dmsc_sharpen_r2": [256, 230, 210, 190, 128, 100], + "dmsc_sharpen_r3": [511, 480, 410, 380, 256, 200], + "dmsc_sharpen_size": [8, 8, 8, 8, 8, 8], + "dmsc_sharpen_t1": [8, 16, 16, 16, 32, 64], + "dmsc_sharpen_t2_shift": [4, 4, 4, 4, 5, 6], + "dmsc_sharpen_t3": [48, 32, 32, 32, 64, 128], + "dmsc_sharpen_t4_shift": [4, 4, 4, 4, 5, 5], + "gains": [1, 4, 16, 128, 256, 512], + "hdr": false + }, + { + "dmsc_denoise_strength": [0, 0, 0, 0, 0, 0], + "dmsc_depurple_cbcr_mode": [3, 3, 3, 3, 3, 3], + "dmsc_depurple_enable": [1, 1, 1, 1, 1, 1], + "dmsc_depurple_sat_shrink": [8, 8, 8, 8, 8, 8], + "dmsc_depurple_thr": [20, 40, 60, 80, 100, 140], + "dmsc_sharpen_clip_black": [500, 500, 500, 300, 300, 300], + "dmsc_sharpen_clip_white": [500, 500, 500, 300, 300, 300], + "dmsc_sharpen_enable": [1, 1, 1, 1, 1, 1], + "dmsc_sharpen_factor_black": [200, 150, 130, 100, 90, 70], + "dmsc_sharpen_factor_white": [200, 150, 130, 100, 90, 70], + "dmsc_sharpen_r1": [0, 0, 0, 0, 0, 0], + "dmsc_sharpen_r2": [256, 230, 210, 190, 128, 100], + "dmsc_sharpen_r3": [511, 480, 410, 380, 256, 200], + "dmsc_sharpen_size": [8, 8, 8, 8, 8, 8], + "dmsc_sharpen_t1": [8, 16, 16, 16, 32, 64], + "dmsc_sharpen_t2_shift": [4, 4, 4, 4, 5, 6], + "dmsc_sharpen_t3": [48, 32, 32, 32, 64, 128], + "dmsc_sharpen_t4_shift": [4, 4, 4, 4, 5, 5], + "gains": [1, 4, 16, 128, 256, 512], + "hdr": true + } + ] + }, + { + "classname": "AWdrv4", + "disable": false, + "enable": true, + "forcecreate": true, + "tables": [ + { + "contrast": [ + 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512 + ], + "entropy_base": [ + 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716 + ], + "entropy_slope": [ + 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204 + ], + "flat_strength": [4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4], + "flat_thr": [19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19], + "gains": [2, 4, 8, 12, 16, 24, 32, 48, 64, 128, 250, 500], + "global_strength": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "hdr": false, + "high_strength": [90, 95, 100, 105, 110, 115, 120, 125, 128, 128, 128, 128], + "low_strength": [8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8], + "strength": [ + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 + ] + }, + { + "contrast": [ + 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512 + ], + "entropy_base": [ + 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716 + ], + "entropy_slope": [ + 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204 + ], + "flat_strength": [4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4], + "flat_thr": [19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19], + "gains": [2, 4, 8, 12, 16, 24, 32, 48, 64, 128, 200, 240], + "global_strength": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "hdr": true, + "high_strength": [90, 95, 100, 105, 110, 115, 120, 125, 128, 128, 128, 128], + "low_strength": [ + 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192 + ], + "strength": [ + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 + ] + } + ] + }, + { + "classname": "A3dnrv3", + "disable": false, + "enable": false, + "forcecreate": true, + "nlm_en": false, + "tables": [ + { + "blend_motion": [95, 95, 95, 95, 95, 95], + "blend_slope": [2, 2, 2, 2, 2, 2], + "blend_static": [95, 95, 95, 95, 95, 95], + "dialte_h": [7, 7, 7, 7, 7, 7], + "filter_len": [20, 20, 20, 20, 20, 20], + "filter_len2": [5, 5, 5, 5, 5, 5], + "gains": [2, 4, 8, 16, 32, 64], + "hdr": false, + "motion_dilate_en": [1, 1, 1, 1, 1, 1], + "motion_erode_en": [1, 1, 1, 1, 1, 1], + "noise_level": [128, 128, 128, 128, 128, 128], + "pregamma_en": [1, 1, 1, 1, 1, 1], + "preweight": [8, 8, 8, 8, 8, 8], + "range_h": [7, 7, 7, 7, 7, 7], + "range_v": [7, 7, 7, 7, 7, 7], + "sadweight": [16, 16, 16, 12, 8, 4], + "sigma": [2, 4, 5, 6, 7, 8], + "strength": [120, 120, 120, 120, 120, 120], + "thr_motion_slope": [16, 16, 16, 16, 16, 16] + }, + { + "blend_motion": [95, 95, 95, 95, 95, 95], + "blend_slope": [2, 2, 2, 2, 2, 2], + "blend_static": [95, 95, 95, 95, 95, 95], + "dialte_h": [7, 7, 7, 7, 7, 7], + "filter_len": [20, 20, 20, 20, 20, 20], + "filter_len2": [5, 5, 5, 5, 5, 5], + "gains": [2, 4, 8, 16, 32, 64], + "hdr": true, + "motion_dilate_en": [1, 1, 1, 1, 1, 1], + "motion_erode_en": [1, 1, 1, 1, 1, 1], + "noise_level": [128, 128, 128, 128, 128, 128], + "pregamma_en": [1, 1, 1, 1, 1, 1], + "preweight": [8, 8, 8, 8, 8, 8], + "range_h": [7, 7, 7, 7, 7, 7], + "range_v": [7, 7, 7, 7, 7, 7], + "sadweight": [16, 16, 16, 12, 8, 4], + "sigma": [2, 4, 5, 6, 7, 8], + "strength": [120, 120, 120, 120, 120, 120], + "thr_motion_slope": [16, 16, 16, 16, 16, 16] + } + ], + "tnr_en": false + }, + { + "classname": "ADpf", + "disable": false, + "enable": false, + "forcecreate": true, + "tables": [ + { + "div": [65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65], + "gains": [ + 1, 8, 16, 24, 48, 72, 96, 192, 384, 768, 1536, 3072, 3970, 4000 + ], + "gradient": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "hdr": false, + "min": [8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8], + "noise_curve": [ + [ + 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, + 4095, 4095, 4095, 4095, 4095, 4095 + ], + [ + 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, + 4095, 4095, 4095, 4095, 4095, 4095 + ], + [ + 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, + 4095, 4095, 4095, 4095, 4095, 4095 + ], + [ + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048 + ], + [ + 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, + 2048, 2048, 2048, 2048, 2048, 2048 + ], + [ + 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024 + ], + [ + 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, + 512, 512, 512, 512 + ], + [ + 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, + 256, 256, 256, 256 + ], + [ + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128 + ], + [ + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64 + ], + [ + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32 + ], + [ + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16 + ], + [ + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16 + ], + [16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16] + ], + "offset": [1, 1, 1, 1, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1], + "sigma_g": [2, 2, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4], + "sigma_rb": [2, 2, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4] + }, + { + "div": [ + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65 + ], + "gains": [ + 1, 1.8, 4.4, 8.6, 12, 16, 20, 24, 32, 40, 48, 64, 80, 96, 128, 160, + 192, 224, 230 + ], + "gradient": [ + 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, + 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002 + ], + "hdr": true, + "min": [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], + "noise_curve": [ + [ + 4095, 4095, 4030, 3325, 2894, 2376, 2063, 1848, 1689, 1464, 1311, + 1197, 1038, 928, 848, 785, 736 + ], + [ + 4095, 4095, 3051, 2492, 2158, 1762, 1526, 1365, 1246, 1079, 965, + 881, 763, 682, 623, 577, 540 + ], + [ + 4095, 2741, 1963, 1610, 1397, 1143, 991, 887, 810, 702, 628, 574, + 497, 445, 406, 376, 352 + ], + [ + 2885, 1688, 1311, 1109, 979, 815, 713, 642, 588, 512, 459, 420, + 365, 327, 299, 277, 260 + ], + [ + 1926, 1304, 1051, 904, 805, 677, 596, 538, 495, 432, 388, 356, + 309, 277, 254, 235, 221 + ], + [ + 1029, 886, 790, 720, 665, 585, 529, 486, 452, 401, 364, 336, 295, + 266, 244, 227, 214 + ], + [ + 1027, 841, 730, 653, 597, 517, 463, 423, 391, 345, 312, 287, 251, + 226, 207, 193, 181 + ], + [ + 794, 694, 624, 572, 531, 470, 426, 392, 366, 325, 296, 274, 240, + 217, 199, 185, 174 + ], + [ + 676, 595, 537, 493, 459, 407, 370, 341, 318, 284, 258, 239, 210, + 190, 174, 162, 153 + ], + [ + 561, 506, 464, 431, 404, 363, 332, 308, 289, 259, 237, 219, 194, + 175, 161, 150, 142 + ], + [ + 495, 451, 417, 389, 367, 331, 304, 283, 266, 239, 219, 203, 180, + 163, 150, 140, 132 + ], + [ + 367, 345, 326, 311, 297, 274, 256, 241, 228, 208, 192, 179, 160, + 146, 135, 126, 119 + ], + [ + 326, 306, 289, 275, 263, 242, 226, 213, 201, 183, 169, 158, 141, + 129, 119, 111, 105 + ], + [ + 277, 263, 251, 241, 231, 216, 203, 192, 183, 168, 156, 146, 131, + 120, 112, 105, 99 + ], + [ + 226, 216, 207, 199, 192, 180, 170, 161, 154, 141, 132, 124, 112, + 102, 95, 89, 84 + ], + [ + 190, 183, 176, 170, 164, 155, 146, 139, 133, 123, 115, 109, 98, + 90, 84, 79, 75 + ], + [ + 164, 158, 152, 147, 143, 135, 128, 123, 118, 109, 102, 97, 88, 81, + 75, 71, 67 + ], + [ + 143, 138, 134, 130, 126, 120, 114, 110, 105, 98, 92, 87, 79, 73, + 68, 64, 61 + ], + [ + 143, 138, 133, 129, 125, 119, 113, 108, 104, 97, 91, 86, 78, 72, + 67, 63, 60 + ] + ], + "offset": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + "sigma_g": [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], + "sigma_rb": [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2] + } + ] + }, + { + "classname": "ABls", + "enable": false, + "forcecreate": true, + "tables": [ + { + "bls": [64, 64, 64, 64, 64], + "gains": [1, 8, 16, 32, 64], + "hdr": false + }, + { + "bls": [0, 0, 0, 0, 0], + "gains": [1, 8, 16, 32, 64], + "hdr": true + } + ] + }, + { + "classname": "ARgbir", + "enable": false, + "forcecreate": false, + "tables": [ + { + "gains": [1, 8, 16, 32, 64], + "hdr": false, + "lThreshold": [3700, 3750, 3800, 3900, 4095] + }, + { + "gains": [1, 8, 16, 32, 64], + "hdr": true, + "lThreshold": [3700, 3750, 3800, 3900, 4095] + } + ] + } + ] +} diff --git a/src/big/mpp/userapps/src/sensor/config/gc2053-1920x1080_manual.json b/src/big/mpp/userapps/src/sensor/config/gc2053-1920x1080_manual.json new file mode 100644 index 000000000..891b66865 --- /dev/null +++ b/src/big/mpp/userapps/src/sensor/config/gc2053-1920x1080_manual.json @@ -0,0 +1,495 @@ +{ + "ARCH": "ISP8000_V2201.Manual_ext", + "root": [ + { + "driver": [ + { + "base_frame": 0, + "bls": [64, 64, 64, 64], + "bls_out": [0, 0, 0, 0], + "bypass": false, + "bypass_select": 0, + "class": "CHdrv2", + "color_weight": [254, 1, 0], + "driver_load": false, + "enable": false, + "extend_bit": [-1, -1], + "ratio": [16, 16], + "sensor_type": 7, + "stitching_mode": 0, + "trans_range": [ + [0.85, 0.95], + [0.85, 0.95], + [0, 0.1], + [0, 0.01], + [0.85, 0.95], + [0, 0.1] + ] + }, + { + "class": "CGreenEqu", + "driver_load": true, + "threshold": 2.5 + }, + { + "bit" : 12, + "bls" : [ 64, 64, 64, 64 ], + "ccmatrix" : [ 1.0, 0, 0, 0, 0, 1.0, 0, 0, 0, 0, 1.0, 0 ], + "class" : "CRgbIR", + "dpcc_mid_th" : [ 4095, 4095, 4095, 4095 ], + "dpcc_th" : [ 400, 100, 100, 100 ], + "enable" : false, + "gain" : [ 1, 1, 1 ], + "ir_threshold" : 512, + "irbayer_pattern" : 2, + "l_threshold" : 1024, + "out_rgb_pattern" : 3 + }, + { + "class": "CManualWb", + "driver_load": true, + "gain": [1.84715, 1.0, 1.0, 1.8834] + }, + { + "bit": 13, + "ccmatrix": [ + 1.78555, -0.639126, -0.146426, + -0.312724, 1.6701, -0.357375, + 0.0557804, -0.75418, 1.6984 + ], + "ccoffset": [0, 0, 0], + "class": "CCcm", + "driver_load": true + }, + { + "class": "CDgain", + "digital_gain_b": 1, + "digital_gain_gb": 1, + "digital_gain_gr": 1, + "digital_gain_r": 1, + "driver_load": true + }, + { + "bit": 20, + "bls": [64, 64, 64, 64], + "bls_enable": true, + "class": "CCpdv1", + "compress_curve_x": [ + 21, 20, 18, 14, 20, 18, 14, 13, 20, 18, 14, 13, 20, 18, 14, 20, 18, + 14, 20, 18, 14, 13, 20, 18, 14, 20, 18, 14, 13, 20, 18, 14, 20, 18, + 14, 13, 20, 18, 14, 13, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + ], + "compress_curve_y": [ + 8192, 14640, 16256, 16352, 29232, 32464, 32672, 32768, 58576, 65024, + 65440, 65744, 117360, 130272, 131072, 234320, 260128, 261744, + 467824, 519456, 522672, 524288, 937264, 1040512, 1046960, 1871312, + 2077792, 2090704, 2097152, 3749056, 4162048, 4187856, 7485216, + 8311168, 8362800, 8388608, 14996256, 16648160, 16751408, 16777216, + 16777216, 16777216, 16777216, 16777216, 16777216, 16777216, + 16777216, 16777216, 16777216, 16777216, 16777216, 16777216, + 16777216, 16777216, 16777216, 16777216, 16777216, 16777216, + 16777216, 16777216, 16777216, 16777216, 16777216, 16777216 + ], + "compress_enable": false, + "compress_use_out_y_curve": false, + "enable": false, + "expand_curve_x": [ + 21, 20, 18, 16, 13, 12, 21, 17, 16, 14, 15, 14, 13, 12, 16, 15, 17, + 15, 18, 14, 18, 17, 16, 19, 17, 16, 15, 13, 20, 17, 16, 14, 12, 17, + 16, 15, 14, 13, 12, 18, 17, 15, 13, 19, 17, 15, 14, 13, 12, 20, 17, + 14, 20, 19, 18, 17, 14, 21, 20, 17, 14, 13, 0, 0 + ], + "expand_curve_y": [ + 512, 898, 995, 1019, 1022, 1024, 1953, 2011, 2040, 2048, 3140, 3686, + 3959, 4096, 6826, 8192, 14745, 16384, 31804, 32768, 51492, 60854, + 65536, 110636, 121911, 127548, 130367, 131072, 239662, 253236, + 260023, 261719, 262144, 395296, 461872, 495160, 511804, 520126, + 524288, 840839, 999114, 1038683, 1048576, 1815534, 2007274, 2055208, + 2079176, 2091160, 2097152, 3935751, 4165575, 4194304, 6412778, + 7522016, 8076634, 8353944, 8388608, 13717350, 16381722, 16714768, + 16756399, 16777215, 16777215, 16777215 + ], + "expand_enable": false, + "expand_use_out_y_curve": false + }, + { + "class": "CGamma64", + "curve": [ + 154, 211, 254, 290, 321, 349, 374, 397, 419, 440, 459, 478, 496, + 513, 529, 545, 560, 575, 589, 603, 617, 630, 643, 655, 667, 679, + 691, 703, 714, 725, 736, 747, 757, 768, 778, 788, 798, 807, 817, + 827, 836, 845, 854, 863, 872, 881, 889, 898, 906, 915, 923, 931, + 939, 947, 955, 963, 971, 979, 986, 994, 1001, 1009, 1016, 1023 + ], + "driver_load": true, + "standard": true, + "standard_val": 2.2 + }, + { + "bpt_enable": false, + "bpt_num": 3, + "bpt_out_mode": 0, + "bpt_pos_x": [4, 24, 4], + "bpt_pos_y": [10, 20, 8], + "bypass": true, + "class": "CDpcc", + "enable": true, + "line_mad_fac": [ + [4, 24, 4], + [4, 16, 4] + ], + "line_thresh": [ + [8, 16, 32], + [8, 12, 32] + ], + "methods_set": [7453, 1799, 7967], + "out_mode": 3, + "pg_fac": [ + [8, 8, 10], + [6, 6, 10] + ], + "rg_fac": [ + [32, 8, 4], + [32, 8, 4] + ], + "rnd_offs": [ + [3, 3, 3], + [3, 3, 3] + ], + "rnd_thresh": [ + [10, 8, 8], + [10, 8, 6] + ], + "ro_limits": [ + [2, 3, 2], + [2, 3, 2] + ], + "set_use": 7 + }, + { + "class": "CDpf", + "div": 0, + "enable": true, + "gain": 24, + "gradient": 2, + "min": 2.5, + "noise_curve": [ + 4092, 4092, 4092, 4092, 4092, 4092, 4092, 4092, 4092, 4092, 4092, 4092, + 4092, 4092, 4092, 4092, 4092 + ], + "offset": 1, + "sigma_g": 1, + "sigma_rb": 1 + }, + { + "class": "CLscv2", + "enable": true, + "matrix": [ + [ + 1888, 1808, 1760, 1722, 1667, 1610, 1583, 1541, 1478, 1455, 1424, 1386, 1362, 1343, 1320, 1313, 1298, 1302, 1291, 1324, 1320, 1331, 1370, 1378, 1407, 1433, 1451, 1492, 1531, 1588, 1604, 1643, 1691, + 1880, 1822, 1767, 1715, 1655, 1621, 1572, 1516, 1487, 1451, 1429, 1386, 1374, 1343, 1328, 1309, 1302, 1298, 1306, 1309, 1317, 1339, 1355, 1374, 1391, 1429, 1455, 1492, 1531, 1567, 1604, 1643, 1691, + 1843, 1794, 1741, 1679, 1632, 1588, 1536, 1497, 1464, 1429, 1399, 1362, 1343, 1320, 1295, 1288, 1284, 1277, 1288, 1288, 1295, 1306, 1324, 1355, 1374, 1407, 1429, 1473, 1497, 1546, 1572, 1610, 1649, + 1836, 1760, 1697, 1643, 1604, 1567, 1511, 1473, 1451, 1399, 1370, 1339, 1309, 1302, 1288, 1267, 1260, 1263, 1267, 1270, 1274, 1288, 1313, 1328, 1355, 1374, 1411, 1446, 1483, 1506, 1562, 1588, 1649, + 1774, 1728, 1685, 1638, 1588, 1541, 1497, 1460, 1416, 1395, 1358, 1317, 1298, 1281, 1260, 1247, 1240, 1237, 1247, 1247, 1257, 1277, 1291, 1309, 1335, 1366, 1399, 1420, 1469, 1497, 1541, 1567, 1610, + 1774, 1715, 1661, 1604, 1562, 1521, 1469, 1433, 1399, 1362, 1335, 1302, 1274, 1260, 1237, 1230, 1221, 1221, 1215, 1224, 1240, 1253, 1274, 1291, 1324, 1339, 1366, 1407, 1446, 1478, 1506, 1551, 1588, + 1734, 1685, 1632, 1588, 1541, 1497, 1460, 1420, 1374, 1351, 1313, 1284, 1253, 1240, 1221, 1205, 1199, 1199, 1208, 1208, 1211, 1230, 1257, 1281, 1298, 1324, 1351, 1386, 1420, 1451, 1492, 1531, 1567, + 1709, 1673, 1615, 1567, 1516, 1478, 1451, 1403, 1362, 1331, 1295, 1270, 1247, 1215, 1202, 1193, 1190, 1178, 1181, 1190, 1205, 1202, 1237, 1260, 1281, 1309, 1339, 1378, 1407, 1442, 1478, 1506, 1546, + 1697, 1643, 1610, 1551, 1502, 1460, 1424, 1386, 1343, 1313, 1281, 1243, 1221, 1205, 1193, 1175, 1163, 1166, 1166, 1172, 1184, 1196, 1221, 1234, 1274, 1295, 1320, 1351, 1386, 1424, 1455, 1487, 1536, + 1673, 1615, 1588, 1526, 1483, 1442, 1407, 1358, 1328, 1291, 1257, 1227, 1205, 1187, 1169, 1158, 1152, 1146, 1155, 1152, 1166, 1178, 1199, 1227, 1250, 1267, 1302, 1335, 1374, 1399, 1437, 1478, 1506, + 1661, 1604, 1562, 1521, 1478, 1429, 1391, 1351, 1306, 1277, 1250, 1218, 1199, 1169, 1158, 1146, 1135, 1130, 1130, 1144, 1152, 1169, 1190, 1208, 1234, 1260, 1284, 1313, 1347, 1382, 1429, 1460, 1497, + 1643, 1588, 1546, 1502, 1451, 1407, 1366, 1331, 1295, 1260, 1224, 1202, 1175, 1155, 1130, 1119, 1119, 1119, 1124, 1124, 1138, 1146, 1169, 1196, 1211, 1240, 1277, 1298, 1335, 1366, 1403, 1442, 1473, + 1626, 1577, 1546, 1478, 1451, 1403, 1358, 1331, 1277, 1243, 1224, 1190, 1163, 1152, 1122, 1111, 1103, 1106, 1109, 1111, 1122, 1141, 1155, 1184, 1202, 1230, 1260, 1298, 1335, 1362, 1399, 1433, 1464, + 1604, 1567, 1521, 1483, 1429, 1391, 1343, 1306, 1270, 1237, 1205, 1178, 1152, 1130, 1116, 1098, 1093, 1088, 1093, 1098, 1114, 1130, 1144, 1163, 1193, 1221, 1250, 1281, 1313, 1355, 1374, 1416, 1455, + 1593, 1567, 1506, 1460, 1424, 1374, 1335, 1302, 1263, 1230, 1196, 1169, 1144, 1119, 1101, 1088, 1076, 1078, 1076, 1085, 1101, 1114, 1135, 1158, 1184, 1215, 1240, 1270, 1298, 1335, 1358, 1403, 1437, + 1593, 1541, 1511, 1455, 1411, 1366, 1328, 1284, 1257, 1221, 1187, 1158, 1130, 1103, 1091, 1078, 1073, 1056, 1066, 1073, 1085, 1101, 1122, 1144, 1172, 1196, 1237, 1253, 1298, 1328, 1366, 1399, 1442, + 1583, 1531, 1492, 1446, 1391, 1355, 1313, 1281, 1237, 1211, 1178, 1146, 1119, 1098, 1080, 1063, 1059, 1059, 1059, 1066, 1076, 1096, 1119, 1135, 1163, 1202, 1221, 1253, 1284, 1324, 1355, 1386, 1411, + 1577, 1536, 1478, 1446, 1391, 1347, 1324, 1267, 1243, 1208, 1169, 1146, 1114, 1096, 1071, 1061, 1047, 1049, 1047, 1056, 1063, 1085, 1111, 1133, 1155, 1178, 1221, 1250, 1284, 1313, 1343, 1382, 1411, + 1572, 1526, 1478, 1433, 1391, 1347, 1313, 1267, 1224, 1199, 1169, 1133, 1111, 1085, 1066, 1051, 1042, 1033, 1040, 1049, 1063, 1080, 1103, 1130, 1146, 1178, 1205, 1240, 1274, 1302, 1339, 1366, 1407, + 1567, 1526, 1464, 1429, 1382, 1331, 1295, 1263, 1224, 1193, 1163, 1130, 1109, 1080, 1063, 1047, 1035, 1033, 1042, 1038, 1059, 1078, 1096, 1116, 1144, 1178, 1202, 1237, 1281, 1306, 1335, 1366, 1411, + 1567, 1511, 1460, 1424, 1374, 1335, 1295, 1260, 1218, 1187, 1152, 1127, 1103, 1076, 1056, 1044, 1035, 1026, 1033, 1038, 1049, 1073, 1098, 1116, 1144, 1172, 1199, 1227, 1257, 1302, 1335, 1366, 1395, + 1556, 1506, 1460, 1424, 1370, 1328, 1295, 1253, 1224, 1193, 1163, 1116, 1096, 1073, 1051, 1042, 1024, 1024, 1031, 1035, 1047, 1068, 1088, 1114, 1144, 1166, 1196, 1221, 1260, 1295, 1328, 1355, 1399, + 1556, 1506, 1464, 1420, 1378, 1335, 1298, 1250, 1218, 1187, 1152, 1122, 1096, 1071, 1047, 1035, 1033, 1026, 1033, 1035, 1044, 1066, 1096, 1114, 1135, 1166, 1193, 1224, 1260, 1291, 1331, 1362, 1391, + 1562, 1502, 1464, 1420, 1370, 1335, 1291, 1257, 1215, 1187, 1152, 1116, 1091, 1076, 1056, 1038, 1031, 1026, 1026, 1035, 1051, 1068, 1083, 1116, 1141, 1169, 1190, 1227, 1257, 1295, 1324, 1362, 1399, + 1551, 1502, 1460, 1433, 1374, 1331, 1291, 1253, 1211, 1187, 1146, 1130, 1098, 1076, 1056, 1040, 1031, 1033, 1024, 1031, 1049, 1066, 1085, 1114, 1135, 1169, 1208, 1224, 1270, 1291, 1324, 1358, 1399, + 1556, 1526, 1464, 1420, 1382, 1335, 1298, 1260, 1224, 1196, 1158, 1130, 1101, 1078, 1056, 1047, 1031, 1033, 1033, 1038, 1054, 1073, 1098, 1119, 1146, 1169, 1202, 1234, 1263, 1298, 1331, 1370, 1399, + 1562, 1506, 1469, 1424, 1386, 1343, 1306, 1263, 1218, 1193, 1155, 1130, 1101, 1080, 1061, 1044, 1040, 1028, 1028, 1040, 1056, 1073, 1101, 1119, 1152, 1169, 1199, 1234, 1270, 1298, 1339, 1374, 1407, + 1567, 1526, 1473, 1437, 1382, 1335, 1302, 1260, 1230, 1196, 1169, 1135, 1103, 1085, 1063, 1051, 1040, 1042, 1038, 1051, 1066, 1080, 1109, 1122, 1152, 1181, 1208, 1240, 1267, 1298, 1335, 1378, 1411, + 1588, 1526, 1469, 1437, 1399, 1366, 1309, 1277, 1237, 1202, 1172, 1144, 1109, 1096, 1073, 1056, 1047, 1042, 1051, 1059, 1068, 1091, 1109, 1124, 1158, 1184, 1218, 1247, 1284, 1313, 1351, 1391, 1411, + 1588, 1531, 1483, 1442, 1399, 1355, 1320, 1284, 1234, 1202, 1172, 1146, 1124, 1101, 1076, 1068, 1056, 1051, 1054, 1066, 1073, 1093, 1116, 1135, 1158, 1196, 1215, 1253, 1281, 1313, 1343, 1391, 1429, + 1604, 1541, 1492, 1451, 1403, 1366, 1328, 1288, 1243, 1221, 1187, 1152, 1124, 1111, 1091, 1076, 1068, 1063, 1068, 1076, 1091, 1103, 1116, 1144, 1178, 1193, 1221, 1260, 1295, 1324, 1355, 1391, 1424, + 1604, 1546, 1506, 1460, 1420, 1374, 1331, 1284, 1257, 1221, 1196, 1163, 1135, 1114, 1096, 1085, 1080, 1076, 1078, 1078, 1093, 1114, 1130, 1158, 1178, 1218, 1234, 1270, 1295, 1335, 1374, 1403, 1433, + 1583, 1562, 1506, 1464, 1424, 1386, 1335, 1298, 1260, 1221, 1199, 1178, 1135, 1124, 1109, 1085, 1091, 1088, 1080, 1093, 1101, 1119, 1144, 1161, 1187, 1211, 1237, 1270, 1320, 1339, 1378, 1403, 1455 + ], + [ + 1791, 1740, 1691, 1645, 1605, 1557, 1518, 1487, 1464, 1414, 1394, 1363, 1354, 1324, 1313, 1309, 1296, 1293, 1298, 1296, 1300, 1322, 1344, 1358, 1377, 1404, 1420, 1459, 1498, 1518, 1560, 1592, 1635, + 1775, 1728, 1680, 1635, 1595, 1563, 1512, 1478, 1446, 1409, 1380, 1358, 1333, 1320, 1298, 1285, 1285, 1285, 1289, 1291, 1293, 1306, 1328, 1349, 1370, 1392, 1422, 1448, 1473, 1507, 1548, 1589, 1608, + 1752, 1688, 1649, 1612, 1573, 1533, 1495, 1459, 1425, 1397, 1370, 1335, 1313, 1298, 1283, 1279, 1266, 1260, 1266, 1273, 1275, 1289, 1315, 1331, 1349, 1370, 1402, 1430, 1459, 1492, 1527, 1560, 1592, + 1725, 1680, 1618, 1592, 1548, 1507, 1470, 1427, 1404, 1368, 1340, 1322, 1296, 1275, 1260, 1252, 1244, 1244, 1242, 1250, 1258, 1270, 1283, 1315, 1326, 1354, 1382, 1404, 1435, 1473, 1501, 1539, 1570, + 1702, 1663, 1615, 1570, 1536, 1498, 1454, 1414, 1392, 1356, 1328, 1296, 1275, 1264, 1246, 1237, 1231, 1227, 1227, 1231, 1244, 1252, 1270, 1287, 1313, 1333, 1358, 1394, 1420, 1459, 1487, 1518, 1557, + 1688, 1632, 1589, 1551, 1504, 1473, 1432, 1399, 1370, 1335, 1309, 1287, 1258, 1240, 1227, 1217, 1206, 1208, 1214, 1214, 1217, 1231, 1252, 1264, 1298, 1315, 1340, 1372, 1407, 1432, 1462, 1495, 1527, + 1666, 1605, 1567, 1521, 1481, 1448, 1412, 1375, 1347, 1320, 1285, 1260, 1242, 1221, 1206, 1199, 1186, 1186, 1188, 1204, 1210, 1214, 1237, 1252, 1270, 1298, 1320, 1356, 1387, 1420, 1451, 1475, 1507, + 1649, 1602, 1554, 1512, 1478, 1432, 1392, 1368, 1331, 1302, 1264, 1238, 1223, 1208, 1193, 1183, 1179, 1176, 1177, 1184, 1190, 1197, 1223, 1237, 1258, 1281, 1309, 1340, 1365, 1397, 1435, 1464, 1504, + 1618, 1573, 1536, 1492, 1456, 1417, 1385, 1342, 1309, 1289, 1252, 1227, 1202, 1192, 1170, 1167, 1162, 1153, 1158, 1158, 1176, 1188, 1202, 1223, 1244, 1268, 1293, 1324, 1351, 1392, 1404, 1440, 1475, + 1605, 1557, 1524, 1481, 1440, 1404, 1370, 1328, 1302, 1268, 1240, 1216, 1197, 1179, 1158, 1148, 1138, 1141, 1145, 1148, 1160, 1163, 1188, 1208, 1231, 1254, 1281, 1309, 1342, 1368, 1397, 1438, 1464, + 1589, 1551, 1509, 1470, 1430, 1385, 1358, 1324, 1289, 1254, 1225, 1202, 1179, 1162, 1145, 1136, 1122, 1127, 1128, 1135, 1143, 1158, 1174, 1190, 1216, 1238, 1268, 1291, 1322, 1351, 1382, 1414, 1448, + 1573, 1536, 1495, 1446, 1412, 1372, 1333, 1311, 1273, 1244, 1217, 1192, 1167, 1150, 1132, 1117, 1109, 1108, 1116, 1119, 1132, 1140, 1163, 1181, 1199, 1233, 1258, 1275, 1311, 1337, 1368, 1397, 1435, + 1563, 1524, 1481, 1448, 1399, 1365, 1324, 1298, 1264, 1233, 1206, 1179, 1158, 1130, 1122, 1106, 1100, 1101, 1100, 1106, 1120, 1133, 1145, 1169, 1193, 1221, 1240, 1275, 1302, 1333, 1358, 1394, 1427, + 1554, 1512, 1470, 1425, 1392, 1347, 1324, 1285, 1250, 1223, 1192, 1165, 1143, 1125, 1106, 1092, 1092, 1086, 1089, 1094, 1103, 1119, 1136, 1158, 1177, 1201, 1233, 1252, 1289, 1322, 1342, 1380, 1417, + 1536, 1498, 1459, 1422, 1382, 1347, 1309, 1281, 1242, 1206, 1184, 1158, 1132, 1114, 1094, 1082, 1077, 1074, 1071, 1085, 1094, 1108, 1128, 1150, 1176, 1197, 1223, 1248, 1275, 1311, 1347, 1368, 1404, + 1545, 1495, 1451, 1417, 1377, 1337, 1300, 1262, 1237, 1204, 1177, 1146, 1120, 1109, 1086, 1067, 1064, 1060, 1060, 1074, 1085, 1100, 1117, 1141, 1162, 1190, 1212, 1240, 1270, 1298, 1324, 1356, 1392, + 1515, 1478, 1440, 1404, 1368, 1331, 1296, 1260, 1223, 1190, 1167, 1136, 1116, 1085, 1076, 1060, 1056, 1049, 1057, 1057, 1070, 1088, 1108, 1123, 1157, 1170, 1204, 1231, 1258, 1291, 1315, 1354, 1382, + 1524, 1475, 1435, 1404, 1354, 1328, 1289, 1254, 1221, 1190, 1167, 1130, 1109, 1091, 1073, 1057, 1046, 1042, 1051, 1056, 1070, 1088, 1103, 1123, 1150, 1176, 1197, 1229, 1260, 1283, 1320, 1349, 1382, + 1504, 1473, 1430, 1389, 1356, 1315, 1277, 1242, 1210, 1184, 1150, 1130, 1101, 1079, 1060, 1047, 1038, 1032, 1040, 1046, 1057, 1073, 1094, 1112, 1145, 1163, 1195, 1223, 1250, 1273, 1313, 1342, 1368, + 1501, 1464, 1422, 1377, 1347, 1309, 1273, 1242, 1210, 1181, 1148, 1120, 1098, 1074, 1060, 1039, 1028, 1025, 1031, 1040, 1049, 1071, 1085, 1114, 1133, 1162, 1186, 1217, 1248, 1268, 1309, 1333, 1368, + 1492, 1454, 1414, 1382, 1337, 1304, 1268, 1240, 1202, 1176, 1145, 1114, 1089, 1069, 1053, 1040, 1032, 1031, 1029, 1042, 1049, 1063, 1082, 1114, 1132, 1160, 1188, 1210, 1238, 1268, 1298, 1335, 1361, + 1492, 1456, 1412, 1377, 1333, 1298, 1273, 1235, 1202, 1172, 1143, 1112, 1089, 1063, 1049, 1031, 1028, 1024, 1032, 1031, 1040, 1061, 1085, 1108, 1128, 1157, 1181, 1214, 1238, 1266, 1296, 1331, 1361, + 1495, 1454, 1409, 1370, 1333, 1304, 1266, 1237, 1202, 1172, 1143, 1114, 1091, 1071, 1047, 1032, 1028, 1025, 1031, 1031, 1047, 1064, 1080, 1101, 1128, 1157, 1181, 1212, 1242, 1270, 1293, 1331, 1361, + 1487, 1451, 1417, 1377, 1337, 1304, 1264, 1229, 1199, 1177, 1141, 1112, 1085, 1070, 1046, 1027, 1025, 1024, 1029, 1033, 1039, 1061, 1083, 1106, 1127, 1153, 1177, 1212, 1231, 1264, 1296, 1328, 1358, + 1498, 1454, 1417, 1380, 1340, 1296, 1266, 1229, 1201, 1176, 1140, 1114, 1085, 1066, 1046, 1028, 1032, 1025, 1029, 1031, 1046, 1061, 1077, 1105, 1125, 1157, 1184, 1214, 1231, 1260, 1296, 1331, 1354, + 1501, 1456, 1425, 1382, 1340, 1298, 1262, 1233, 1208, 1179, 1151, 1116, 1095, 1067, 1053, 1040, 1029, 1028, 1031, 1032, 1051, 1060, 1091, 1109, 1135, 1153, 1186, 1214, 1242, 1270, 1300, 1333, 1361, + 1492, 1464, 1412, 1380, 1342, 1306, 1275, 1240, 1204, 1172, 1145, 1116, 1095, 1071, 1051, 1038, 1033, 1028, 1028, 1033, 1053, 1066, 1082, 1109, 1130, 1155, 1190, 1217, 1242, 1273, 1298, 1337, 1365, + 1495, 1464, 1427, 1389, 1349, 1315, 1285, 1237, 1206, 1184, 1151, 1122, 1097, 1080, 1058, 1046, 1035, 1033, 1032, 1043, 1057, 1070, 1092, 1117, 1145, 1160, 1190, 1217, 1244, 1277, 1306, 1335, 1368, + 1507, 1470, 1432, 1387, 1354, 1317, 1279, 1246, 1208, 1186, 1158, 1132, 1103, 1088, 1069, 1047, 1044, 1038, 1039, 1050, 1070, 1077, 1097, 1122, 1145, 1169, 1193, 1217, 1254, 1283, 1311, 1349, 1375, + 1518, 1470, 1435, 1394, 1354, 1315, 1281, 1252, 1216, 1183, 1155, 1130, 1109, 1092, 1070, 1054, 1049, 1042, 1049, 1056, 1067, 1085, 1100, 1122, 1146, 1169, 1201, 1225, 1260, 1287, 1315, 1342, 1377, + 1521, 1484, 1443, 1404, 1365, 1333, 1287, 1264, 1219, 1199, 1167, 1145, 1123, 1098, 1085, 1067, 1061, 1056, 1061, 1063, 1079, 1092, 1111, 1127, 1155, 1183, 1210, 1233, 1262, 1291, 1322, 1351, 1387, + 1533, 1492, 1446, 1409, 1368, 1335, 1300, 1264, 1233, 1199, 1172, 1145, 1127, 1103, 1088, 1073, 1067, 1067, 1061, 1073, 1082, 1097, 1116, 1140, 1160, 1186, 1217, 1237, 1264, 1302, 1335, 1361, 1382, + 1542, 1498, 1448, 1417, 1368, 1340, 1300, 1273, 1238, 1210, 1179, 1151, 1128, 1111, 1094, 1080, 1073, 1070, 1076, 1079, 1094, 1100, 1123, 1148, 1170, 1192, 1216, 1248, 1277, 1304, 1324, 1358, 1394 + ], + [ + 1804, 1744, 1710, 1656, 1622, 1589, 1542, 1501, 1459, 1432, 1402, 1368, 1354, 1340, 1324, 1306, 1302, 1300, 1298, 1311, 1315, 1328, 1342, 1363, 1385, 1414, 1443, 1464, 1504, 1533, 1570, 1608, 1656, + 1800, 1744, 1699, 1656, 1612, 1560, 1521, 1489, 1446, 1420, 1387, 1365, 1342, 1324, 1304, 1293, 1291, 1281, 1289, 1291, 1304, 1311, 1328, 1358, 1375, 1402, 1432, 1456, 1489, 1524, 1554, 1592, 1628, + 1763, 1717, 1670, 1618, 1579, 1545, 1498, 1478, 1432, 1397, 1368, 1344, 1313, 1302, 1287, 1273, 1262, 1264, 1268, 1268, 1281, 1291, 1313, 1331, 1356, 1380, 1412, 1435, 1462, 1501, 1530, 1573, 1605, + 1748, 1695, 1649, 1612, 1560, 1509, 1478, 1443, 1407, 1375, 1347, 1322, 1300, 1277, 1262, 1256, 1248, 1248, 1240, 1254, 1266, 1275, 1293, 1315, 1331, 1363, 1389, 1412, 1443, 1481, 1515, 1542, 1582, + 1728, 1677, 1632, 1579, 1536, 1504, 1462, 1432, 1392, 1368, 1333, 1304, 1279, 1266, 1238, 1231, 1231, 1223, 1231, 1235, 1246, 1262, 1273, 1289, 1320, 1337, 1370, 1394, 1432, 1459, 1492, 1527, 1554, + 1702, 1652, 1605, 1570, 1518, 1487, 1440, 1399, 1370, 1342, 1313, 1285, 1262, 1248, 1233, 1225, 1214, 1206, 1210, 1217, 1221, 1237, 1258, 1275, 1302, 1322, 1344, 1380, 1404, 1440, 1475, 1507, 1551, + 1680, 1628, 1579, 1539, 1504, 1467, 1420, 1392, 1347, 1320, 1291, 1266, 1244, 1227, 1212, 1199, 1192, 1192, 1188, 1204, 1208, 1216, 1246, 1254, 1279, 1306, 1328, 1358, 1397, 1425, 1462, 1495, 1530, + 1656, 1618, 1563, 1524, 1484, 1443, 1414, 1368, 1337, 1311, 1277, 1252, 1229, 1206, 1195, 1192, 1179, 1181, 1176, 1186, 1195, 1208, 1217, 1235, 1266, 1285, 1317, 1342, 1370, 1407, 1451, 1475, 1504, + 1649, 1602, 1545, 1512, 1459, 1427, 1394, 1354, 1324, 1291, 1266, 1233, 1210, 1193, 1177, 1165, 1160, 1160, 1160, 1163, 1172, 1190, 1204, 1233, 1248, 1268, 1296, 1328, 1358, 1385, 1414, 1448, 1487, + 1618, 1592, 1539, 1495, 1451, 1407, 1380, 1344, 1311, 1279, 1248, 1221, 1199, 1179, 1163, 1151, 1140, 1146, 1143, 1151, 1167, 1176, 1190, 1206, 1233, 1264, 1279, 1315, 1344, 1368, 1409, 1446, 1478, + 1612, 1570, 1518, 1484, 1435, 1407, 1361, 1328, 1298, 1264, 1231, 1212, 1184, 1165, 1148, 1136, 1133, 1128, 1130, 1138, 1145, 1155, 1181, 1197, 1223, 1242, 1275, 1302, 1331, 1363, 1389, 1427, 1456, + 1589, 1551, 1501, 1467, 1422, 1380, 1349, 1315, 1273, 1250, 1221, 1188, 1165, 1146, 1135, 1119, 1112, 1112, 1116, 1116, 1135, 1148, 1163, 1186, 1204, 1237, 1258, 1287, 1309, 1347, 1387, 1414, 1440, + 1567, 1536, 1501, 1451, 1414, 1370, 1335, 1300, 1268, 1237, 1206, 1177, 1158, 1148, 1119, 1117, 1101, 1098, 1108, 1109, 1117, 1132, 1153, 1176, 1193, 1219, 1244, 1266, 1302, 1337, 1372, 1399, 1425, + 1560, 1521, 1487, 1438, 1397, 1365, 1324, 1285, 1254, 1223, 1195, 1174, 1150, 1130, 1109, 1100, 1085, 1088, 1089, 1097, 1109, 1127, 1138, 1163, 1181, 1208, 1235, 1264, 1291, 1328, 1356, 1392, 1422, + 1563, 1524, 1473, 1430, 1392, 1358, 1315, 1279, 1248, 1212, 1193, 1162, 1140, 1117, 1100, 1088, 1077, 1074, 1074, 1086, 1097, 1108, 1130, 1153, 1176, 1204, 1227, 1260, 1283, 1317, 1347, 1377, 1407, + 1536, 1507, 1462, 1425, 1382, 1344, 1313, 1277, 1237, 1212, 1176, 1151, 1128, 1103, 1086, 1073, 1067, 1067, 1063, 1071, 1083, 1103, 1119, 1140, 1163, 1186, 1217, 1242, 1277, 1306, 1333, 1370, 1387, + 1539, 1501, 1456, 1412, 1375, 1335, 1298, 1260, 1231, 1206, 1165, 1133, 1123, 1092, 1077, 1064, 1057, 1051, 1058, 1063, 1074, 1089, 1108, 1130, 1160, 1186, 1208, 1242, 1266, 1300, 1331, 1358, 1387, + 1527, 1489, 1451, 1409, 1370, 1326, 1296, 1256, 1229, 1195, 1162, 1140, 1119, 1097, 1070, 1060, 1051, 1050, 1046, 1054, 1069, 1083, 1106, 1130, 1150, 1174, 1206, 1231, 1262, 1291, 1324, 1356, 1382, + 1533, 1478, 1438, 1402, 1361, 1322, 1283, 1256, 1219, 1188, 1160, 1132, 1105, 1086, 1067, 1050, 1044, 1039, 1039, 1046, 1066, 1076, 1100, 1119, 1145, 1170, 1195, 1229, 1252, 1283, 1311, 1351, 1382, + 1527, 1475, 1432, 1397, 1354, 1317, 1289, 1244, 1216, 1184, 1150, 1125, 1098, 1077, 1060, 1043, 1039, 1031, 1029, 1040, 1057, 1071, 1089, 1116, 1133, 1165, 1193, 1221, 1250, 1283, 1309, 1347, 1377, + 1509, 1470, 1430, 1392, 1349, 1317, 1275, 1250, 1212, 1181, 1146, 1119, 1100, 1071, 1051, 1038, 1032, 1028, 1027, 1035, 1051, 1066, 1083, 1119, 1135, 1158, 1190, 1217, 1240, 1283, 1309, 1337, 1370, + 1509, 1470, 1427, 1389, 1354, 1315, 1273, 1238, 1201, 1174, 1146, 1120, 1094, 1067, 1049, 1029, 1028, 1028, 1024, 1032, 1050, 1063, 1082, 1108, 1133, 1162, 1186, 1210, 1244, 1281, 1302, 1340, 1370, + 1501, 1473, 1427, 1394, 1347, 1315, 1275, 1237, 1206, 1176, 1135, 1116, 1089, 1069, 1049, 1032, 1032, 1028, 1028, 1028, 1050, 1063, 1085, 1105, 1127, 1162, 1190, 1214, 1246, 1273, 1302, 1331, 1358, + 1507, 1467, 1420, 1382, 1344, 1304, 1270, 1235, 1197, 1167, 1141, 1122, 1091, 1069, 1050, 1028, 1025, 1028, 1033, 1027, 1043, 1058, 1085, 1109, 1135, 1150, 1186, 1206, 1235, 1270, 1302, 1326, 1365, + 1504, 1470, 1425, 1382, 1347, 1309, 1273, 1240, 1210, 1176, 1138, 1114, 1094, 1061, 1044, 1033, 1032, 1027, 1029, 1033, 1043, 1061, 1085, 1109, 1130, 1155, 1183, 1210, 1238, 1268, 1306, 1335, 1363, + 1504, 1464, 1427, 1387, 1347, 1317, 1273, 1240, 1208, 1179, 1145, 1117, 1088, 1071, 1049, 1036, 1029, 1033, 1029, 1033, 1051, 1067, 1086, 1111, 1133, 1157, 1184, 1214, 1238, 1279, 1309, 1342, 1372, + 1509, 1473, 1422, 1387, 1347, 1313, 1277, 1238, 1204, 1177, 1146, 1120, 1098, 1074, 1051, 1039, 1035, 1032, 1031, 1039, 1050, 1070, 1089, 1111, 1133, 1165, 1188, 1216, 1244, 1273, 1302, 1342, 1380, + 1530, 1473, 1438, 1392, 1358, 1313, 1277, 1246, 1214, 1184, 1148, 1123, 1103, 1074, 1061, 1043, 1039, 1033, 1039, 1043, 1053, 1070, 1092, 1112, 1140, 1167, 1193, 1225, 1248, 1279, 1313, 1351, 1377, + 1521, 1478, 1443, 1404, 1358, 1320, 1289, 1248, 1225, 1183, 1157, 1132, 1108, 1088, 1067, 1051, 1042, 1043, 1042, 1051, 1061, 1074, 1098, 1120, 1148, 1174, 1195, 1221, 1256, 1285, 1315, 1344, 1375, + 1533, 1484, 1440, 1399, 1358, 1326, 1289, 1254, 1217, 1190, 1163, 1133, 1108, 1085, 1071, 1063, 1049, 1043, 1050, 1057, 1070, 1083, 1105, 1125, 1150, 1176, 1202, 1235, 1258, 1285, 1320, 1354, 1385, + 1530, 1487, 1446, 1412, 1372, 1337, 1289, 1264, 1233, 1199, 1163, 1140, 1123, 1098, 1080, 1067, 1060, 1054, 1061, 1069, 1082, 1097, 1111, 1136, 1160, 1181, 1206, 1240, 1264, 1302, 1328, 1365, 1402, + 1548, 1498, 1454, 1425, 1377, 1335, 1298, 1264, 1233, 1208, 1174, 1146, 1127, 1105, 1086, 1077, 1064, 1066, 1061, 1076, 1083, 1101, 1125, 1141, 1162, 1188, 1214, 1242, 1266, 1302, 1335, 1365, 1402, + 1560, 1515, 1473, 1432, 1385, 1342, 1309, 1279, 1242, 1210, 1184, 1151, 1122, 1109, 1098, 1083, 1077, 1069, 1076, 1080, 1097, 1109, 1122, 1146, 1162, 1195, 1216, 1244, 1283, 1311, 1333, 1372, 1399 + ], + [ + 1708, 1708, 1669, 1625, 1562, 1556, 1497, 1467, 1434, 1401, 1379, 1350, 1337, 1325, 1313, 1294, 1294, 1290, 1282, 1286, 1286, 1313, 1325, 1337, 1371, 1388, 1420, 1434, 1462, 1482, 1518, 1567, 1596, + 1742, 1682, 1638, 1596, 1567, 1524, 1497, 1443, 1424, 1406, 1362, 1350, 1321, 1301, 1290, 1286, 1279, 1275, 1279, 1282, 1286, 1294, 1313, 1325, 1362, 1375, 1397, 1438, 1457, 1487, 1524, 1545, 1584, + 1695, 1656, 1613, 1579, 1540, 1497, 1472, 1438, 1397, 1375, 1350, 1329, 1305, 1294, 1275, 1260, 1249, 1256, 1260, 1253, 1271, 1275, 1290, 1309, 1333, 1358, 1393, 1406, 1434, 1467, 1497, 1518, 1556, + 1669, 1625, 1602, 1562, 1534, 1487, 1457, 1410, 1384, 1358, 1333, 1313, 1290, 1271, 1256, 1242, 1235, 1239, 1235, 1249, 1249, 1267, 1279, 1301, 1317, 1333, 1366, 1393, 1424, 1443, 1472, 1513, 1540, + 1663, 1625, 1573, 1540, 1508, 1462, 1434, 1401, 1375, 1333, 1309, 1294, 1264, 1253, 1235, 1228, 1218, 1218, 1215, 1232, 1235, 1256, 1267, 1279, 1309, 1321, 1345, 1384, 1401, 1434, 1448, 1492, 1524, + 1644, 1596, 1551, 1513, 1487, 1457, 1410, 1384, 1358, 1321, 1297, 1264, 1249, 1235, 1211, 1208, 1201, 1205, 1191, 1201, 1215, 1228, 1249, 1271, 1286, 1305, 1321, 1354, 1388, 1397, 1438, 1472, 1508, + 1625, 1579, 1556, 1503, 1457, 1429, 1397, 1371, 1341, 1309, 1275, 1260, 1239, 1218, 1201, 1195, 1185, 1185, 1182, 1195, 1198, 1215, 1228, 1246, 1260, 1290, 1305, 1337, 1362, 1410, 1415, 1457, 1487, + 1590, 1567, 1524, 1487, 1462, 1424, 1393, 1354, 1321, 1294, 1264, 1242, 1221, 1198, 1188, 1172, 1169, 1169, 1166, 1172, 1185, 1198, 1208, 1239, 1256, 1282, 1294, 1321, 1354, 1388, 1410, 1434, 1472, + 1602, 1556, 1513, 1477, 1434, 1401, 1366, 1337, 1305, 1271, 1246, 1218, 1208, 1188, 1172, 1166, 1157, 1148, 1148, 1160, 1179, 1182, 1201, 1221, 1242, 1260, 1279, 1309, 1341, 1362, 1388, 1415, 1448, + 1579, 1540, 1503, 1457, 1429, 1379, 1366, 1317, 1297, 1264, 1239, 1218, 1191, 1172, 1163, 1151, 1142, 1136, 1136, 1142, 1160, 1163, 1185, 1195, 1221, 1246, 1271, 1297, 1321, 1350, 1375, 1410, 1424, + 1556, 1529, 1477, 1448, 1406, 1388, 1345, 1313, 1282, 1264, 1221, 1201, 1175, 1166, 1139, 1136, 1121, 1124, 1121, 1127, 1136, 1154, 1169, 1191, 1218, 1228, 1260, 1286, 1317, 1341, 1366, 1397, 1424, + 1534, 1508, 1467, 1429, 1388, 1366, 1333, 1301, 1267, 1232, 1205, 1188, 1160, 1145, 1130, 1124, 1107, 1107, 1110, 1113, 1130, 1142, 1151, 1169, 1191, 1218, 1239, 1267, 1297, 1329, 1350, 1379, 1406, + 1551, 1497, 1462, 1429, 1375, 1354, 1317, 1290, 1253, 1239, 1205, 1179, 1154, 1136, 1110, 1101, 1104, 1090, 1101, 1107, 1118, 1127, 1151, 1169, 1195, 1205, 1235, 1253, 1279, 1313, 1341, 1375, 1397, + 1524, 1477, 1448, 1406, 1375, 1341, 1305, 1271, 1242, 1218, 1191, 1169, 1142, 1118, 1104, 1093, 1085, 1080, 1085, 1093, 1104, 1113, 1124, 1148, 1172, 1201, 1221, 1253, 1264, 1305, 1325, 1362, 1388, + 1518, 1472, 1443, 1401, 1371, 1329, 1294, 1275, 1242, 1218, 1182, 1160, 1136, 1113, 1093, 1082, 1077, 1069, 1077, 1080, 1093, 1096, 1127, 1142, 1172, 1182, 1218, 1239, 1264, 1294, 1321, 1350, 1384, + 1497, 1462, 1420, 1393, 1350, 1317, 1286, 1260, 1232, 1201, 1166, 1151, 1124, 1101, 1088, 1072, 1066, 1059, 1069, 1069, 1082, 1104, 1110, 1130, 1157, 1185, 1201, 1228, 1249, 1286, 1321, 1341, 1371, + 1492, 1453, 1415, 1379, 1350, 1317, 1282, 1246, 1218, 1191, 1160, 1136, 1113, 1096, 1072, 1061, 1051, 1051, 1056, 1061, 1074, 1088, 1104, 1121, 1148, 1169, 1198, 1221, 1253, 1275, 1305, 1329, 1354, + 1472, 1453, 1420, 1379, 1345, 1309, 1286, 1249, 1218, 1182, 1163, 1130, 1113, 1088, 1074, 1051, 1049, 1046, 1051, 1059, 1069, 1085, 1104, 1118, 1148, 1163, 1195, 1221, 1242, 1275, 1297, 1329, 1362, + 1477, 1434, 1401, 1371, 1337, 1309, 1271, 1242, 1205, 1191, 1148, 1118, 1104, 1077, 1061, 1046, 1044, 1031, 1039, 1051, 1064, 1074, 1088, 1113, 1139, 1160, 1185, 1215, 1242, 1267, 1290, 1329, 1354, + 1482, 1434, 1401, 1371, 1329, 1294, 1260, 1225, 1205, 1163, 1142, 1124, 1099, 1066, 1054, 1039, 1034, 1029, 1031, 1034, 1046, 1066, 1088, 1107, 1127, 1154, 1182, 1211, 1235, 1256, 1282, 1321, 1350, + 1457, 1434, 1401, 1354, 1329, 1294, 1264, 1228, 1191, 1160, 1142, 1107, 1093, 1072, 1056, 1041, 1029, 1031, 1029, 1036, 1051, 1061, 1080, 1101, 1124, 1154, 1179, 1208, 1221, 1253, 1290, 1313, 1337, + 1457, 1434, 1397, 1358, 1329, 1294, 1260, 1221, 1195, 1157, 1139, 1115, 1099, 1069, 1049, 1026, 1026, 1029, 1034, 1029, 1039, 1064, 1077, 1099, 1121, 1145, 1172, 1195, 1225, 1264, 1267, 1305, 1325, + 1477, 1434, 1393, 1354, 1325, 1297, 1253, 1228, 1195, 1166, 1136, 1113, 1085, 1066, 1044, 1031, 1031, 1029, 1031, 1034, 1044, 1059, 1077, 1099, 1121, 1148, 1179, 1198, 1225, 1249, 1275, 1301, 1341, + 1477, 1438, 1393, 1354, 1321, 1275, 1256, 1218, 1188, 1166, 1136, 1104, 1085, 1056, 1044, 1031, 1026, 1029, 1026, 1026, 1039, 1054, 1082, 1096, 1121, 1145, 1163, 1191, 1225, 1253, 1271, 1301, 1337, + 1467, 1429, 1393, 1358, 1325, 1294, 1249, 1225, 1188, 1163, 1133, 1104, 1085, 1059, 1044, 1034, 1026, 1026, 1026, 1029, 1044, 1059, 1072, 1099, 1124, 1142, 1166, 1191, 1221, 1253, 1275, 1305, 1329, + 1477, 1434, 1401, 1354, 1329, 1294, 1264, 1228, 1188, 1166, 1133, 1104, 1082, 1064, 1046, 1029, 1024, 1034, 1034, 1036, 1041, 1056, 1080, 1099, 1127, 1145, 1179, 1198, 1228, 1256, 1282, 1313, 1337, + 1467, 1434, 1397, 1362, 1321, 1282, 1256, 1228, 1188, 1169, 1136, 1110, 1088, 1072, 1049, 1036, 1026, 1026, 1029, 1034, 1041, 1066, 1082, 1101, 1121, 1148, 1175, 1198, 1221, 1249, 1279, 1305, 1329, + 1472, 1438, 1388, 1371, 1321, 1301, 1260, 1228, 1195, 1166, 1145, 1121, 1090, 1074, 1054, 1041, 1031, 1026, 1034, 1044, 1059, 1069, 1090, 1104, 1136, 1151, 1179, 1208, 1239, 1249, 1294, 1313, 1345, + 1492, 1453, 1406, 1375, 1329, 1309, 1267, 1235, 1205, 1175, 1142, 1124, 1096, 1072, 1061, 1044, 1039, 1034, 1036, 1044, 1059, 1069, 1085, 1121, 1130, 1163, 1185, 1208, 1232, 1267, 1297, 1313, 1350, + 1477, 1453, 1401, 1371, 1341, 1301, 1267, 1239, 1205, 1188, 1154, 1121, 1099, 1088, 1061, 1051, 1044, 1046, 1039, 1049, 1056, 1074, 1096, 1115, 1142, 1154, 1188, 1208, 1235, 1267, 1294, 1321, 1354, + 1492, 1448, 1420, 1384, 1350, 1313, 1275, 1242, 1215, 1188, 1166, 1130, 1104, 1088, 1072, 1066, 1054, 1049, 1054, 1061, 1069, 1082, 1101, 1121, 1145, 1175, 1191, 1215, 1239, 1275, 1301, 1325, 1366, + 1497, 1457, 1424, 1388, 1354, 1317, 1282, 1249, 1215, 1191, 1172, 1136, 1113, 1090, 1085, 1072, 1054, 1056, 1059, 1064, 1080, 1085, 1110, 1124, 1154, 1179, 1198, 1221, 1249, 1282, 1309, 1337, 1345, + 1482, 1462, 1420, 1388, 1354, 1321, 1294, 1242, 1215, 1208, 1166, 1148, 1124, 1099, 1090, 1082, 1069, 1069, 1056, 1072, 1090, 1096, 1110, 1133, 1151, 1175, 1195, 1235, 1264, 1290, 1313, 1341, 1375 + ] + ], + "x_size": [ + 46, 47, 48, 52, 53, 55, 58, 60, 61, 65, 67, 67, 68, 71, 70, 72, 72, 70, 71, 68, 67, 67, 65, 61, 60, 58, 55, 53, 52, 48, 47, 46 + ], + "y_size": [ + 29, 32, 33, 32, 33, 34, 34, 34, 35, 34, 35, 35, 35, 36, 35, 34 + ] + }, + { + "class": "CWdrv4", + "contrast": 512, + "enable": true, + "entropy": [ + 0, 0, 0, 2, 3, 6, 11, 22, 39, 67, 111, 177, 227, 266, 321, 355, 377, + 355, 221, 0 + ], + "entropy_base": 700, + "entropy_slope": 200, + "flat_strength": 1, + "flat_thr": 1, + "gamma_down": [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 9, 16, 36, 64, 136, 256, 576, + 1023 + ], + "gamma_pre": [ + 0, 31514, 36815, 42173, 47646, 53350, 59514, 66602, 75530, 88145, + 108135, 142869, 175428, 207095, 269144, 330303, 442139, 571475, + 810472, 1048575 + ], + "gamma_up": [ + 0, 1024, 34837, 56737, 82912, 116814, 162079, 223337, 306767, + 420749, 576707, 735048, 745499, 755950, 776852, 797754, 839557, + 881361, 964968, 1048575 + ], + "global_strength": 0, + "high_strength": 90, + "low_strength": 8, + "strength": 128 + }, + { + "blend_motion": 80, + "blend_slope": 2, + "blend_static": 20, + "class": "C3dnrv3_1", + "dialte_h": 7, + "enable": true, + "filter_len": 20, + "filter_len2": 5, + "motion_dilate_en": true, + "motion_erode_en": true, + "nlm_en": true, + "noise_level": 128, + "noisemodel_a": 16.49220085144043, + "noisemodel_b": 785.5836181640625, + "pregamma_en": true, + "preweight": 8, + "range_h": 7, + "range_v": 7, + "sadweight": 16, + "sigma": 4, + "strength": 110, + "thr_motion_slope": 16, + "tnr_en": false + }, + { + "bright": 0, + "chroma_out": 2, + "class": "CCproc", + "contrast": 1, + "driver_load": true, + "hue": 0, + "luma_in": 2, + "luma_out": 2, + "saturation": 1.25 + }, + { + "ca_curve": [ + 0, 16, 292, 495, 644, 752, 831, 887, 928, 957, 977, 992, 1002, 1009, + 1014, 1017, 1019, 1021, 1022, 1022, 1023, 1023, 1023, 1023, 1023, + 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, + 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, + 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1024, 1024, 1024, + 1024, 1024, 1024, 1024, 1024, 1024, 1024 + ], + "ca_en": true, + "ca_mode": 1, + "class": "CEEv1", + "curve_en": true, + "dci_curve": [ + 0, 16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 192, 208, 224, + 240, 256, 272, 288, 304, 320, 336, 352, 368, 384, 400, 416, 432, + 448, 464, 480, 496, 512, 528, 544, 560, 576, 592, 608, 624, 640, + 656, 672, 688, 704, 720, 736, 752, 768, 784, 800, 816, 832, 848, + 864, 880, 896, 912, 928, 944, 960, 976, 992, 1008, 1023 + ], + "dci_en": true, + "ee_edge_gain": 2000, + "ee_src_strength": 1, + "ee_strength": 100, + "ee_uv_gain": 0, + "ee_y_down_gain": 3000, + "ee_y_up_gain": 1000, + "enable": true + }, + { + "a_blue": 0, + "a_red": 0, + "b_blue": 0, + "b_red": 0, + "c_blue": 0, + "c_red": 0, + "cac_enable": false, + "center_h_offs": 0, + "center_v_offs": 0, + "class": "CDmscv2", + "demoire_edge_r1": 250, + "demoire_edge_r2": 0, + "demoire_edge_t1": 256, + "demoire_edge_t2_shift": 4, + "demosaic_enable": true, + "demosaic_thr": 4, + "dmsc_demoire_area_thr": 32, + "dmsc_demoire_enable": true, + "dmsc_demoire_r1": 0, + "dmsc_demoire_r2": 256, + "dmsc_demoire_sat_shrink": 8, + "dmsc_demoire_t1": 0, + "dmsc_demoire_t2_shift": 4, + "dmsc_denoise_strength": 0, + "dmsc_depurple_cbcr_mode": 3, + "dmsc_depurple_enable": true, + "dmsc_depurple_sat_shrink": 8, + "dmsc_depurple_thr": 20, + "dmsc_dir_thr_max": 0, + "dmsc_dir_thr_min": 0, + "dmsc_sharpen_clip_black": 200, + "dmsc_sharpen_clip_white": 200, + "dmsc_sharpen_enable": true, + "dmsc_sharpen_factor_black": 80, + "dmsc_sharpen_factor_white": 120, + "dmsc_sharpen_line_enable": true, + "dmsc_sharpen_line_r1": 0, + "dmsc_sharpen_line_r2": 0, + "dmsc_sharpen_line_strength": 8, + "dmsc_sharpen_line_thr": 24, + "dmsc_sharpen_line_thr_shift1": 3, + "dmsc_sharpen_r1": 0, + "dmsc_sharpen_r2": 128, + "dmsc_sharpen_r3": 256, + "dmsc_sharpen_size": 16, + "dmsc_sharpen_t1": 0, + "dmsc_sharpen_t2_shift": 0, + "dmsc_sharpen_t3": 0, + "dmsc_sharpen_t4_shift": 0, + "dmsc_skin_cb_thr_max": 0, + "dmsc_skin_cb_thr_min": 0, + "dmsc_skin_cr_thr_max": 0, + "dmsc_skin_cr_thr_min": 0, + "dmsc_skin_enable": false, + "dmsc_skin_y_thr_max": 0, + "dmsc_skin_y_thr_min": 0, + "enable": true + } + ] + } + ] +} diff --git a/src/big/mpp/userapps/src/sensor/config/ov5647-1920x1080_auto.json b/src/big/mpp/userapps/src/sensor/config/ov5647-1920x1080_auto.json index 5464c8352..f15848350 100644 --- a/src/big/mpp/userapps/src/sensor/config/ov5647-1920x1080_auto.json +++ b/src/big/mpp/userapps/src/sensor/config/ov5647-1920x1080_auto.json @@ -35,7 +35,7 @@ "classname": "Awbv2", "enable": true, "illuorder": "A, D50, D65, F11, F12", - "indoor": [0.3, 1, 1, 1, 1], + "indoor": [1, 1, 1, 1, 1], "outdoor": [0, 1, 1, 1, 0], "overExposureWeight": [ 0.5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.8, 0.6, 0.4, 0.2 @@ -457,7 +457,7 @@ { "dmsc_denoise_strength": [0, 16, 31, 31, 31, 31], "dmsc_depurple_cbcr_mode": [3, 3, 3, 3, 3, 3], - "dmsc_depurple_enable": [1, 1, 1, 1, 1, 1], + "dmsc_depurple_enable": [0, 0, 0, 0, 0, 0], "dmsc_depurple_sat_shrink": [8, 8, 8, 8, 8, 8], "dmsc_depurple_thr": [20, 20, 20, 20, 20, 20], "dmsc_sharpen_clip_black": [200, 200, 200, 200, 200, 200], @@ -479,7 +479,7 @@ { "dmsc_denoise_strength": [0, 0, 0, 0, 0, 0], "dmsc_depurple_cbcr_mode": [3, 3, 3, 3, 3, 3], - "dmsc_depurple_enable": [1, 1, 1, 1, 1, 1], + "dmsc_depurple_enable": [0, 0, 0, 0, 0, 0], "dmsc_depurple_sat_shrink": [8, 8, 8, 8, 8, 8], "dmsc_depurple_thr": [20, 40, 60, 80, 100, 140], "dmsc_sharpen_clip_black": [500, 500, 500, 300, 300, 300], diff --git a/src/big/mpp/userapps/src/sensor/config/ov5647-1920x1080_manual.json b/src/big/mpp/userapps/src/sensor/config/ov5647-1920x1080_manual.json index bd387f682..09c1b3a83 100644 --- a/src/big/mpp/userapps/src/sensor/config/ov5647-1920x1080_manual.json +++ b/src/big/mpp/userapps/src/sensor/config/ov5647-1920x1080_manual.json @@ -421,7 +421,7 @@ 656, 672, 688, 704, 720, 736, 752, 768, 784, 800, 816, 832, 848, 864, 880, 896, 912, 928, 944, 960, 976, 992, 1008, 1023 ], - "dci_en": true, + "dci_en": false, "ee_edge_gain": 2000, "ee_src_strength": 1, "ee_strength": 100, diff --git a/src/big/mpp/userapps/src/sensor/config/ov5647_csi1-1920x1080_auto.json b/src/big/mpp/userapps/src/sensor/config/ov5647_csi1-1920x1080_auto.json index ad6e471e2..f15848350 100755 --- a/src/big/mpp/userapps/src/sensor/config/ov5647_csi1-1920x1080_auto.json +++ b/src/big/mpp/userapps/src/sensor/config/ov5647_csi1-1920x1080_auto.json @@ -35,7 +35,7 @@ "classname": "Awbv2", "enable": true, "illuorder": "A, D50, D65, F11, F12", - "indoor": [0.3, 1, 1, 1, 1], + "indoor": [1, 1, 1, 1, 1], "outdoor": [0, 1, 1, 1, 0], "overExposureWeight": [ 0.5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.8, 0.6, 0.4, 0.2 @@ -451,35 +451,35 @@ { "classname": "ADmscv2", "disable": false, - "enable": false, + "enable": true, "forcecreate": true, "tables": [ { - "dmsc_denoise_strength": [0, 0, 0, 0, 0, 0], + "dmsc_denoise_strength": [0, 16, 31, 31, 31, 31], "dmsc_depurple_cbcr_mode": [3, 3, 3, 3, 3, 3], - "dmsc_depurple_enable": [1, 1, 1, 1, 1, 1], + "dmsc_depurple_enable": [0, 0, 0, 0, 0, 0], "dmsc_depurple_sat_shrink": [8, 8, 8, 8, 8, 8], - "dmsc_depurple_thr": [20, 40, 60, 80, 100, 140], - "dmsc_sharpen_clip_black": [500, 500, 500, 300, 300, 300], - "dmsc_sharpen_clip_white": [500, 500, 500, 300, 300, 300], + "dmsc_depurple_thr": [20, 20, 20, 20, 20, 20], + "dmsc_sharpen_clip_black": [200, 200, 200, 200, 200, 200], + "dmsc_sharpen_clip_white": [200, 200, 200, 200, 200, 200], "dmsc_sharpen_enable": [1, 1, 1, 1, 1, 1], - "dmsc_sharpen_factor_black": [200, 150, 130, 100, 90, 70], - "dmsc_sharpen_factor_white": [200, 150, 130, 100, 90, 70], + "dmsc_sharpen_factor_black": [80, 80, 80, 80, 80, 80], + "dmsc_sharpen_factor_white": [120, 120, 120, 120, 120, 120], "dmsc_sharpen_r1": [0, 0, 0, 0, 0, 0], - "dmsc_sharpen_r2": [256, 230, 210, 190, 128, 100], - "dmsc_sharpen_r3": [511, 480, 410, 380, 256, 200], - "dmsc_sharpen_size": [8, 8, 8, 8, 8, 8], - "dmsc_sharpen_t1": [8, 16, 16, 16, 32, 64], - "dmsc_sharpen_t2_shift": [4, 4, 4, 4, 5, 6], - "dmsc_sharpen_t3": [48, 32, 32, 32, 64, 128], - "dmsc_sharpen_t4_shift": [4, 4, 4, 4, 5, 5], - "gains": [1, 4, 16, 128, 256, 512], + "dmsc_sharpen_r2": [128, 128, 128, 128, 128, 128], + "dmsc_sharpen_r3": [256, 256, 256, 256, 256, 256], + "dmsc_sharpen_size": [16, 12, 8, 8, 8, 8], + "dmsc_sharpen_t1": [0, 0, 0, 0, 0, 0], + "dmsc_sharpen_t2_shift": [0, 0, 0, 0, 0, 0], + "dmsc_sharpen_t3": [0, 0, 0, 0, 0, 0], + "dmsc_sharpen_t4_shift": [0, 0, 0, 0, 0, 0], + "gains": [1, 4, 8, 16, 32, 64], "hdr": false }, { "dmsc_denoise_strength": [0, 0, 0, 0, 0, 0], "dmsc_depurple_cbcr_mode": [3, 3, 3, 3, 3, 3], - "dmsc_depurple_enable": [1, 1, 1, 1, 1, 1], + "dmsc_depurple_enable": [0, 0, 0, 0, 0, 0], "dmsc_depurple_sat_shrink": [8, 8, 8, 8, 8, 8], "dmsc_depurple_thr": [20, 40, 60, 80, 100, 140], "dmsc_sharpen_clip_black": [500, 500, 500, 300, 300, 300], diff --git a/src/big/mpp/userapps/src/sensor/config/ov5647_csi1-1920x1080_manual.json b/src/big/mpp/userapps/src/sensor/config/ov5647_csi1-1920x1080_manual.json index 7d83793fd..09c1b3a83 100755 --- a/src/big/mpp/userapps/src/sensor/config/ov5647_csi1-1920x1080_manual.json +++ b/src/big/mpp/userapps/src/sensor/config/ov5647_csi1-1920x1080_manual.json @@ -48,14 +48,14 @@ { "class": "CManualWb", "driver_load": true, - "gain": [1.0, 1.0, 1.0, 1.0] + "gain": [1.3552, 1.0, 1.0, 1.4445] }, { "bit": 13, "ccmatrix": [ - 1.0, 0, 0, - 0, 1.0, 0, - 0, 0, 1.0 + 1.8846, -0.49571, -0.388893, + -0.34724, 1.70192, -0.354679, + -0.000328715, -0.844644, 1.845 ], "ccoffset": [0, 0, 0], "class": "CCcm", @@ -335,7 +335,7 @@ ] }, { - "class": "CWdrv41", + "class": "CWdrv4", "contrast": 512, "enable": false, "entropy": [ @@ -344,8 +344,8 @@ ], "entropy_base": 200, "entropy_slope": 700, - "flat_strength": 1, - "flat_thr": 1, + "flat_strength": 4, + "flat_thr": 19, "gamma_down": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 9, 16, 36, 64, 136, 256, 576, 1023 @@ -366,9 +366,9 @@ "strength": 128 }, { - "blend_motion": 80, + "blend_motion": 95, "blend_slope": 2, - "blend_static": 20, + "blend_static": 95, "class": "C3dnrv3_1", "dialte_h": 7, "enable": true, @@ -385,7 +385,7 @@ "range_h": 7, "range_v": 7, "sadweight": 16, - "sigma": 8, + "sigma": 5, "strength": 110, "thr_motion_slope": 16, "tnr_en": false @@ -421,7 +421,7 @@ 656, 672, 688, 704, 720, 736, 752, 768, 784, 800, 816, 832, 848, 864, 880, 896, 912, 928, 944, 960, 976, 992, 1008, 1023 ], - "dci_en": true, + "dci_en": false, "ee_edge_gain": 2000, "ee_src_strength": 1, "ee_strength": 100, @@ -456,7 +456,7 @@ "dmsc_demoire_t2_shift": 4, "dmsc_denoise_strength": 0, "dmsc_depurple_cbcr_mode": 3, - "dmsc_depurple_enable": true, + "dmsc_depurple_enable": false, "dmsc_depurple_sat_shrink": 8, "dmsc_depurple_thr": 20, "dmsc_dir_thr_max": 0, @@ -466,7 +466,7 @@ "dmsc_sharpen_enable": true, "dmsc_sharpen_factor_black": 80, "dmsc_sharpen_factor_white": 120, - "dmsc_sharpen_line_enable": true, + "dmsc_sharpen_line_enable": false, "dmsc_sharpen_line_r1": 0, "dmsc_sharpen_line_r2": 0, "dmsc_sharpen_line_strength": 8, diff --git a/src/big/mpp/userapps/src/sensor/config/ov5647_csi2-1920x1080_auto.json b/src/big/mpp/userapps/src/sensor/config/ov5647_csi2-1920x1080_auto.json index ad6e471e2..f15848350 100755 --- a/src/big/mpp/userapps/src/sensor/config/ov5647_csi2-1920x1080_auto.json +++ b/src/big/mpp/userapps/src/sensor/config/ov5647_csi2-1920x1080_auto.json @@ -35,7 +35,7 @@ "classname": "Awbv2", "enable": true, "illuorder": "A, D50, D65, F11, F12", - "indoor": [0.3, 1, 1, 1, 1], + "indoor": [1, 1, 1, 1, 1], "outdoor": [0, 1, 1, 1, 0], "overExposureWeight": [ 0.5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.8, 0.6, 0.4, 0.2 @@ -451,35 +451,35 @@ { "classname": "ADmscv2", "disable": false, - "enable": false, + "enable": true, "forcecreate": true, "tables": [ { - "dmsc_denoise_strength": [0, 0, 0, 0, 0, 0], + "dmsc_denoise_strength": [0, 16, 31, 31, 31, 31], "dmsc_depurple_cbcr_mode": [3, 3, 3, 3, 3, 3], - "dmsc_depurple_enable": [1, 1, 1, 1, 1, 1], + "dmsc_depurple_enable": [0, 0, 0, 0, 0, 0], "dmsc_depurple_sat_shrink": [8, 8, 8, 8, 8, 8], - "dmsc_depurple_thr": [20, 40, 60, 80, 100, 140], - "dmsc_sharpen_clip_black": [500, 500, 500, 300, 300, 300], - "dmsc_sharpen_clip_white": [500, 500, 500, 300, 300, 300], + "dmsc_depurple_thr": [20, 20, 20, 20, 20, 20], + "dmsc_sharpen_clip_black": [200, 200, 200, 200, 200, 200], + "dmsc_sharpen_clip_white": [200, 200, 200, 200, 200, 200], "dmsc_sharpen_enable": [1, 1, 1, 1, 1, 1], - "dmsc_sharpen_factor_black": [200, 150, 130, 100, 90, 70], - "dmsc_sharpen_factor_white": [200, 150, 130, 100, 90, 70], + "dmsc_sharpen_factor_black": [80, 80, 80, 80, 80, 80], + "dmsc_sharpen_factor_white": [120, 120, 120, 120, 120, 120], "dmsc_sharpen_r1": [0, 0, 0, 0, 0, 0], - "dmsc_sharpen_r2": [256, 230, 210, 190, 128, 100], - "dmsc_sharpen_r3": [511, 480, 410, 380, 256, 200], - "dmsc_sharpen_size": [8, 8, 8, 8, 8, 8], - "dmsc_sharpen_t1": [8, 16, 16, 16, 32, 64], - "dmsc_sharpen_t2_shift": [4, 4, 4, 4, 5, 6], - "dmsc_sharpen_t3": [48, 32, 32, 32, 64, 128], - "dmsc_sharpen_t4_shift": [4, 4, 4, 4, 5, 5], - "gains": [1, 4, 16, 128, 256, 512], + "dmsc_sharpen_r2": [128, 128, 128, 128, 128, 128], + "dmsc_sharpen_r3": [256, 256, 256, 256, 256, 256], + "dmsc_sharpen_size": [16, 12, 8, 8, 8, 8], + "dmsc_sharpen_t1": [0, 0, 0, 0, 0, 0], + "dmsc_sharpen_t2_shift": [0, 0, 0, 0, 0, 0], + "dmsc_sharpen_t3": [0, 0, 0, 0, 0, 0], + "dmsc_sharpen_t4_shift": [0, 0, 0, 0, 0, 0], + "gains": [1, 4, 8, 16, 32, 64], "hdr": false }, { "dmsc_denoise_strength": [0, 0, 0, 0, 0, 0], "dmsc_depurple_cbcr_mode": [3, 3, 3, 3, 3, 3], - "dmsc_depurple_enable": [1, 1, 1, 1, 1, 1], + "dmsc_depurple_enable": [0, 0, 0, 0, 0, 0], "dmsc_depurple_sat_shrink": [8, 8, 8, 8, 8, 8], "dmsc_depurple_thr": [20, 40, 60, 80, 100, 140], "dmsc_sharpen_clip_black": [500, 500, 500, 300, 300, 300], diff --git a/src/big/mpp/userapps/src/sensor/config/ov5647_csi2-1920x1080_manual.json b/src/big/mpp/userapps/src/sensor/config/ov5647_csi2-1920x1080_manual.json index 7d83793fd..09c1b3a83 100755 --- a/src/big/mpp/userapps/src/sensor/config/ov5647_csi2-1920x1080_manual.json +++ b/src/big/mpp/userapps/src/sensor/config/ov5647_csi2-1920x1080_manual.json @@ -48,14 +48,14 @@ { "class": "CManualWb", "driver_load": true, - "gain": [1.0, 1.0, 1.0, 1.0] + "gain": [1.3552, 1.0, 1.0, 1.4445] }, { "bit": 13, "ccmatrix": [ - 1.0, 0, 0, - 0, 1.0, 0, - 0, 0, 1.0 + 1.8846, -0.49571, -0.388893, + -0.34724, 1.70192, -0.354679, + -0.000328715, -0.844644, 1.845 ], "ccoffset": [0, 0, 0], "class": "CCcm", @@ -335,7 +335,7 @@ ] }, { - "class": "CWdrv41", + "class": "CWdrv4", "contrast": 512, "enable": false, "entropy": [ @@ -344,8 +344,8 @@ ], "entropy_base": 200, "entropy_slope": 700, - "flat_strength": 1, - "flat_thr": 1, + "flat_strength": 4, + "flat_thr": 19, "gamma_down": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 9, 16, 36, 64, 136, 256, 576, 1023 @@ -366,9 +366,9 @@ "strength": 128 }, { - "blend_motion": 80, + "blend_motion": 95, "blend_slope": 2, - "blend_static": 20, + "blend_static": 95, "class": "C3dnrv3_1", "dialte_h": 7, "enable": true, @@ -385,7 +385,7 @@ "range_h": 7, "range_v": 7, "sadweight": 16, - "sigma": 8, + "sigma": 5, "strength": 110, "thr_motion_slope": 16, "tnr_en": false @@ -421,7 +421,7 @@ 656, 672, 688, 704, 720, 736, 752, 768, 784, 800, 816, 832, 848, 864, 880, 896, 912, 928, 944, 960, 976, 992, 1008, 1023 ], - "dci_en": true, + "dci_en": false, "ee_edge_gain": 2000, "ee_src_strength": 1, "ee_strength": 100, @@ -456,7 +456,7 @@ "dmsc_demoire_t2_shift": 4, "dmsc_denoise_strength": 0, "dmsc_depurple_cbcr_mode": 3, - "dmsc_depurple_enable": true, + "dmsc_depurple_enable": false, "dmsc_depurple_sat_shrink": 8, "dmsc_depurple_thr": 20, "dmsc_dir_thr_max": 0, @@ -466,7 +466,7 @@ "dmsc_sharpen_enable": true, "dmsc_sharpen_factor_black": 80, "dmsc_sharpen_factor_white": 120, - "dmsc_sharpen_line_enable": true, + "dmsc_sharpen_line_enable": false, "dmsc_sharpen_line_r1": 0, "dmsc_sharpen_line_r2": 0, "dmsc_sharpen_line_strength": 8, diff --git a/src/big/mpp/userapps/src/sensor/mpi_sensor.c b/src/big/mpp/userapps/src/sensor/mpi_sensor.c index 20b72a5da..bb02873f1 100755 --- a/src/big/mpp/userapps/src/sensor/mpi_sensor.c +++ b/src/big/mpp/userapps/src/sensor/mpi_sensor.c @@ -56,7 +56,18 @@ static const k_vicap_sensor_type_map sensor_type_map_list[] = { "cam-imx335-mode2", IMX335_MIPI_4LANE_RAW12_2592X1944_30FPS_LINEAR }, - + { + "cam-ov5647-mode0", + OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR + }, + { + "cam-ov5647-mode1", + OV_OV5647_MIPI_CSI1_1920X1080_30FPS_10BIT_LINEAR + }, + { + "cam-ov5647-mode2", + OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR + } }; static const k_vicap_sensor_info sensor_info_list[] = { @@ -76,6 +87,22 @@ static const k_vicap_sensor_info sensor_info_list[] = { 0, OV_OV9732_MIPI_1280X720_30FPS_10BIT_MCLK_16M_LINEAR }, + { + "ov9732", + 1280, + 720, + VICAP_CSI2, + VICAP_MIPI_1LANE, + VICAP_SOURCE_CSI2, + K_FALSE, + VICAP_MIPI_PHY_800M, + VICAP_CSI_DATA_TYPE_RAW10, + VICAP_LINERA_MODE, + VICAP_FLASH_DISABLE, + VICAP_VI_FIRST_FRAME_FS_TR0, + 0, + OV_OV9732_MIPI_1280X720_30FPS_10BIT_MCLK_16M_LINEAR_V2 + }, { "ov9732", 1280, @@ -124,6 +151,38 @@ static const k_vicap_sensor_info sensor_info_list[] = { 0, OV_OV9286_MIPI_1280X720_30FPS_10BIT_MCLK_25M_LINEAR_IR }, + { + "ov9286", + 1280, + 720, + VICAP_CSI1, + VICAP_MIPI_2LANE, + VICAP_SOURCE_CSI1_FS_TR1, + K_TRUE, + VICAP_MIPI_PHY_800M, + VICAP_CSI_DATA_TYPE_RAW10, + VICAP_LINERA_MODE, + VICAP_FLASH_FOLLOW_STROBE, + VICAP_VI_FIRST_FRAME_FS_TR0, + 0, + OV_OV9286_MIPI_1280X720_30FPS_10BIT_MCLK_25M_LINEAR_SPECKLE_V2 + }, + { + "ov9286", + 1280, + 720, + VICAP_CSI1, + VICAP_MIPI_2LANE, + VICAP_SOURCE_CSI1_FS_TR0, //VICAP_SOURCE_CSI1_FS_TR0, + K_TRUE, + VICAP_MIPI_PHY_800M, + VICAP_CSI_DATA_TYPE_RAW10, + VICAP_LINERA_MODE, + VICAP_FLASH_FOLLOW_STROBE, + VICAP_VI_FIRST_FRAME_FS_TR0, + 0, + OV_OV9286_MIPI_1280X720_30FPS_10BIT_MCLK_25M_LINEAR_IR_V2 + }, { "ov9286", 1280, @@ -236,7 +295,6 @@ static const k_vicap_sensor_info sensor_info_list[] = { 0, IMX335_MIPI_4LANE_RAW12_2592X1944_30FPS_LINEAR, }, - { "imx335", 1920, @@ -526,6 +584,55 @@ static const k_vicap_sensor_info sensor_info_list[] = { 0, OV_OV5647_MIPI_CSI1_1920X1080_30FPS_10BIT_LINEAR, }, + { + "ov5647", + 1920, + 1080, + VICAP_CSI0, + VICAP_MIPI_2LANE, + VICAP_SOURCE_CSI0, + K_TRUE, + VICAP_MIPI_PHY_800M, + VICAP_CSI_DATA_TYPE_RAW10, + VICAP_LINERA_MODE, + VICAP_FLASH_DISABLE, + VICAP_VI_FIRST_FRAME_FS_TR0, + 0, + OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR_V2, + }, + { + "ov5647_csi1", + 1920, + 1080, + VICAP_CSI1, + VICAP_MIPI_2LANE, + VICAP_SOURCE_CSI1, + K_TRUE, + VICAP_MIPI_PHY_800M, + VICAP_CSI_DATA_TYPE_RAW10, + VICAP_LINERA_MODE, + VICAP_FLASH_DISABLE, + VICAP_VI_FIRST_FRAME_FS_TR0, + 0, + OV_OV5647_MIPI_CSI1_1920X1080_30FPS_10BIT_LINEAR_V2, + }, + { + "ov5647_csi2", + 1920, + 1080, + VICAP_CSI2, + VICAP_MIPI_2LANE, + VICAP_SOURCE_CSI2, + K_TRUE, + VICAP_MIPI_PHY_800M, + VICAP_CSI_DATA_TYPE_RAW10, + VICAP_LINERA_MODE, + VICAP_FLASH_DISABLE, + VICAP_VI_FIRST_FRAME_FS_TR0, + 0, + OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2, + }, + { "xs9922b", 1280, @@ -606,6 +713,22 @@ static const k_vicap_sensor_info sensor_info_list[] = { 0, XS9950_MIPI_CSI0_1920X1080_30FPS_YUV422, }, + { + "gc2053", + 1920, + 1080, + VICAP_CSI0, + VICAP_MIPI_2LANE, + VICAP_SOURCE_CSI0, + K_FALSE, + VICAP_MIPI_PHY_1200M, + VICAP_CSI_DATA_TYPE_RAW10, + VICAP_LINERA_MODE, + VICAP_FLASH_DISABLE, + VICAP_VI_FIRST_FRAME_FS_TR0, + 0, + GC2053_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR, + }, }; const char *kd_mpi_vicap_get_sensor_string(k_vicap_sensor_type sensor_type) diff --git a/src/big/rt-smart/kernel/bsp/maix3/applications/main.c b/src/big/rt-smart/kernel/bsp/maix3/applications/main.c old mode 100644 new mode 100755 index 01a2a04d8..6e68b54c1 --- a/src/big/rt-smart/kernel/bsp/maix3/applications/main.c +++ b/src/big/rt-smart/kernel/bsp/maix3/applications/main.c @@ -11,6 +11,7 @@ #include #include #include +#include #if CONFIG_ENABLE_USB_DEVICE #include "usbd_core.h" @@ -20,23 +21,16 @@ int main(void) { printf("RT-SMART Hello RISC-V\n"); +#ifdef RT_USING_SDIO + while (mmcsd_wait_cd_changed(100) != MMCSD_HOST_PLUGED); + if (dfs_mount("sd", "/sdcard", "elm", 0, 0) != 0) + rt_kprintf("Dir /sdcard mount failed!\n"); +#endif #if CONFIG_ENABLE_USB_DEVICE - printf("CherryUSB device cdc msc example\n"); - extern void cdc_acm_msc_init(void); cdc_acm_msc_init(); - - // Wait until configured - while (!usb_device_is_configured()) - { - rt_thread_delay(10); - } - - // Everything is interrupt driven so just loop here - while (1) - { - rt_thread_delay(10); - } + rt_thread_delay(10); #endif + msh_exec("/bin/init.sh", 13); return 0; } diff --git a/src/big/rt-smart/kernel/bsp/maix3/applications/mnt.c b/src/big/rt-smart/kernel/bsp/maix3/applications/mnt.c old mode 100644 new mode 100755 index e4234064d..3730cdc44 --- a/src/big/rt-smart/kernel/bsp/maix3/applications/mnt.c +++ b/src/big/rt-smart/kernel/bsp/maix3/applications/mnt.c @@ -4,18 +4,6 @@ #include #include -#define RT_SDCARD_MOUNT_STACK_SIZE 2048 -static struct rt_thread sdcard_mount_thread; -static rt_uint8_t sdcard_mount_thread_stack[RT_SDCARD_MOUNT_STACK_SIZE]; - -void sdcard_mount(void *param) -{ - rt_thread_mdelay(1000); - if (dfs_mount("sd", "/sdcard", "elm", 0, 0) != 0) - { - rt_kprintf("Dir /sdcard mount failed!\n"); - } -} int mnt_init(void) { rt_err_t ret; @@ -26,14 +14,6 @@ int mnt_init(void) return -1; } -#ifdef RT_USING_SDIO - ret = rt_thread_init(&sdcard_mount_thread, "sdcard_mount", sdcard_mount, RT_NULL, - &sdcard_mount_thread_stack[0], RT_SDCARD_MOUNT_STACK_SIZE, 0x16, 20); - if (ret == RT_EOK) - { - rt_thread_startup(&sdcard_mount_thread); - } -#endif mkdir("/dev/shm", 0x777); if (dfs_mount(RT_NULL, "/dev/shm", "tmp", 0, 0) != 0) { rt_kprintf("Dir /dev/shm mount failed!\n"); diff --git a/src/big/rt-smart/kernel/bsp/maix3/board/board.c b/src/big/rt-smart/kernel/bsp/maix3/board/board.c old mode 100644 new mode 100755 index f079466ba..244891da0 --- a/src/big/rt-smart/kernel/bsp/maix3/board/board.c +++ b/src/big/rt-smart/kernel/bsp/maix3/board/board.c @@ -121,8 +121,10 @@ void rt_hw_board_init(void) /* initialize memory system */ rt_system_heap_init(RT_HW_HEAP_BEGIN, RT_HW_HEAP_END); #endif +#if MEM_IPCM_SIZE > MEM_RESVERD_SIZE init_ipcm_mem(); /* initalize interrupt */ +#endif rt_hw_interrupt_init(); /* initialize hardware interrupt */ diff --git a/src/big/rt-smart/kernel/bsp/maix3/board/extdrv/touch/SConscript b/src/big/rt-smart/kernel/bsp/maix3/board/extdrv/touch/SConscript new file mode 100644 index 000000000..fc5c1b899 --- /dev/null +++ b/src/big/rt-smart/kernel/bsp/maix3/board/extdrv/touch/SConscript @@ -0,0 +1,14 @@ +# RT-Thread building script for component + +from building import * + +cwd = GetCurrentDir() +src = [] +CPPPATH = [cwd] + +if GetDepend(['RT_USING_FT5316']): + src += Glob('ft5316.c') + +group = DefineGroup('touch', src, depend = ['RT_USING_TOUCH'], CPPPATH = CPPPATH) + +Return('group') diff --git a/src/big/rt-smart/kernel/bsp/maix3/board/extdrv/touch/ft5316.c b/src/big/rt-smart/kernel/bsp/maix3/board/extdrv/touch/ft5316.c new file mode 100644 index 000000000..db2f5f45e --- /dev/null +++ b/src/big/rt-smart/kernel/bsp/maix3/board/extdrv/touch/ft5316.c @@ -0,0 +1,172 @@ +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#define DBG_TAG "ft5316" +#ifdef RT_DEBUG +#define DBG_LVL DBG_LOG +#else +#define DBG_LVL DBG_WARNING +#endif +#define DBG_COLOR +#include + +#define TOUCH_EVENT_DOWN 0x00 +#define TOUCH_EVENT_UP 0x01 +#define TOUCH_EVENT_ON 0x02 +#define TOUCH_EVENT_RESERVED 0x03 + +struct ft5316_dev { + const char *i2c_name; + rt_uint16_t i2c_addr; + struct rt_i2c_bus_device *bus; +}; + +static int ft5316_read_reg(struct ft5316_dev *dev, rt_uint8_t addr, + rt_uint8_t *buffer, rt_size_t length) +{ + int ret; + // todo fix + struct rt_i2c_msg msgs[2] = + { + { + .addr = dev->i2c_addr, + .flags = RT_I2C_WR, + .buf = &addr, + .len = 1, + }, + { + .addr = dev->i2c_addr, + .flags = RT_I2C_RD, + .len = 1, + }, + }; + + for (int i = 0; i < length; i++) { + msgs[1].buf = buffer + i, + ret = rt_i2c_transfer(dev->bus, msgs, 2); + addr++; + } + + return ret; +} + +static rt_size_t ft5316_read_point(struct rt_touch_device *touch, void *buf, rt_size_t read_num) +{ + int ret, read_point, valid_point, offset; + uint16_t tmp; + struct rt_touch_data *point; + uint8_t rdbuf[touch->info.point_num * 6 + 1]; + + read_point = read_num / sizeof(struct rt_touch_data); + if (!read_point) + return -RT_EINVAL; + + ret = ft5316_read_reg(touch->config.user_data, 2, rdbuf, sizeof(rdbuf)); + if (ret < 0) + return ret; + + valid_point = rdbuf[0] & 0xf; + read_point = read_point > valid_point ? valid_point : read_point; + point = (struct rt_touch_data *)buf; + offset = 1; + for (int i = 0; i < read_point; i++) { + tmp = rdbuf[offset] >> 6; + point[i].event = tmp == TOUCH_EVENT_DOWN ? + RT_TOUCH_EVENT_DOWN : tmp == TOUCH_EVENT_UP ? + RT_TOUCH_EVENT_UP : tmp == TOUCH_EVENT_ON ? + RT_TOUCH_EVENT_MOVE : RT_TOUCH_EVENT_NONE; + tmp = rdbuf[offset] & 0xf; + tmp = (tmp << 8) | rdbuf[offset + 1]; + point[i].x_coordinate = tmp; + tmp = rdbuf[offset + 2] >> 4; + point[i].track_id = tmp; + tmp = rdbuf[offset + 2] & 0xf; + tmp = (tmp << 8) | rdbuf[offset + 3]; + point[i].y_coordinate = tmp; + point[i].width = rdbuf[offset + 4]; + point[i].timestamp = 0; + offset += 6; + } + + return sizeof(struct rt_touch_data) * read_point; +} + +static struct rt_touch_ops touch_ops = { + .touch_readpoint = ft5316_read_point, +}; + +static struct ft5316_dev ft5316_dev0 = { + .i2c_name = "i2c3", + .i2c_addr = 0x38, +}; + +static int ft5316_register(struct rt_touch_config *cfg) +{ + int ret; + rt_touch_t touch_device; + struct ft5316_dev *dev; + + touch_device = (rt_touch_t)rt_calloc(1, sizeof(struct rt_touch_device)); + rt_memcpy(&touch_device->config, cfg, sizeof(struct rt_touch_config)); + dev = (struct ft5316_dev *)(cfg->user_data); + dev->bus = (struct rt_i2c_bus_device *)rt_device_find(dev->i2c_name); + if (dev->bus == RT_NULL) { + LOG_E("Can't find %s device", dev->i2c_name); + return -RT_ERROR; + } + + ret = rt_device_open((rt_device_t)dev->bus, RT_DEVICE_FLAG_RDWR); + if (ret != RT_EOK) { + LOG_E("open %s device failed: %d", dev->i2c_name, ret); + return -RT_ERROR; + } + + touch_device->info.type = RT_TOUCH_TYPE_CAPACITANCE; + touch_device->info.vendor = RT_TOUCH_VENDOR_FT; + touch_device->info.point_num = 5; + touch_device->info.range_x = 480; + touch_device->info.range_y = 800; + touch_device->ops = &touch_ops; + + ret= rt_hw_touch_register(touch_device, cfg->dev_name, 0, RT_NULL); + + return ret; +} + +int ft5316_init(void) +{ + int ret; + struct rt_touch_config cfg; + + cfg.dev_name = "touch0"; + cfg.user_data = &ft5316_dev0; + + ret = ft5316_register(&cfg); + + return ret; +} +INIT_DEVICE_EXPORT(ft5316_init); diff --git a/src/big/rt-smart/kernel/bsp/maix3/board/interdrv/adc/drv_adc.c b/src/big/rt-smart/kernel/bsp/maix3/board/interdrv/adc/drv_adc.c index da05bbdf6..898579bd9 100755 --- a/src/big/rt-smart/kernel/bsp/maix3/board/interdrv/adc/drv_adc.c +++ b/src/big/rt-smart/kernel/bsp/maix3/board/interdrv/adc/drv_adc.c @@ -146,10 +146,10 @@ rt_err_t k230_adc_enabled(struct rt_adc_device *device, rt_uint32_t channel, rt_ adc_dev.chn[channel].enabled = 1; adc_dev.use_num++; } - if (adc_dev.use_num == 1) - { - k_adc_drv_enabled(adc_dev.adc_regs); - } + // if (adc_dev.use_num == 1) + // { + // k_adc_drv_enabled(adc_dev.adc_regs); + // } } else { @@ -162,10 +162,10 @@ rt_err_t k230_adc_enabled(struct rt_adc_device *device, rt_uint32_t channel, rt_ adc_dev.chn[channel].enabled = 0; adc_dev.use_num--; } - if (adc_dev.use_num == 0) - { - k_adc_drv_disabled(adc_dev.adc_regs); - } + // if (adc_dev.use_num == 0) + // { + // k_adc_drv_disabled(adc_dev.adc_regs); + // } } return RT_EOK; @@ -173,30 +173,16 @@ rt_err_t k230_adc_enabled(struct rt_adc_device *device, rt_uint32_t channel, rt_ rt_err_t k230_get_adc_value(struct rt_adc_device *device, rt_uint32_t channel, rt_uint32_t *value) { - rt_uint32_t reg; - - *value = 0; - if (channel >= ADC_MAX_CHANNEL) - { return RT_ERROR; - } - - if (!adc_dev.chn[channel].enabled) - { + + if (!adc_dev.chn[channel].enabled){ return RT_ERROR; } - writel(channel, &adc_dev.adc_regs->cfg_reg); - - reg = readl(&adc_dev.adc_regs->cfg_reg); - reg |= 0x10; - writel(reg, &adc_dev.adc_regs->cfg_reg); - - rt_thread_mdelay(1); - - reg = readl(&adc_dev.adc_regs->data_reg[channel]); - *value = reg; + writel(channel | 0x10, &adc_dev.adc_regs->cfg_reg); + while ((readl(&adc_dev.adc_regs->cfg_reg) & 0x10000) == 0); + *value = readl(&adc_dev.adc_regs->data_reg[channel]); return RT_EOK; } diff --git a/src/big/rt-smart/kernel/bsp/maix3/board/interdrv/gpio/drv_gpio.c b/src/big/rt-smart/kernel/bsp/maix3/board/interdrv/gpio/drv_gpio.c index 143c961b7..d68a84eeb 100755 --- a/src/big/rt-smart/kernel/bsp/maix3/board/interdrv/gpio/drv_gpio.c +++ b/src/big/rt-smart/kernel/bsp/maix3/board/interdrv/gpio/drv_gpio.c @@ -119,7 +119,12 @@ static int kd_set_drive_mode(rt_base_t pin, rt_base_t mode) kd_gpio_reg_writel(kd_gpio[0] + DIRECTION, pin, dir); } else { pin -= 32; - kd_gpio_reg_writel(kd_gpio[1] + DIRECTION, pin, dir); + if(pin < 32) + kd_gpio_reg_writel(kd_gpio[1] + DIRECTION, pin, dir); + else { + pin -= 32; + kd_gpio_reg_writel(kd_gpio[1] + DIRECTION + DIRECTION_STRIDE, pin, dir); + } } return RT_EOK; @@ -134,7 +139,12 @@ static rt_base_t kd_get_drive_mode(rt_base_t pin) return kd_gpio_reg_readl(kd_gpio[0] + DIRECTION, pin); else { pin -= 32; - return kd_gpio_reg_readl(kd_gpio[1] + DIRECTION, pin); + if(pin < 32) + return kd_gpio_reg_readl(kd_gpio[1] + DIRECTION, pin); + else { + pin -= 32; + return kd_gpio_reg_readl(kd_gpio[1] + DIRECTION + DIRECTION_STRIDE, pin); + } } } @@ -161,7 +171,12 @@ void kd_pin_write(rt_base_t pin, rt_base_t value) kd_gpio_reg_writel(kd_gpio[0] + DATA_OUTPUT, pin, value == KD_GPIO_HIGH ? GPIO_PV_HIGH : GPIO_PV_LOW); else { pin -= 32; - kd_gpio_reg_writel(kd_gpio[1] + DATA_OUTPUT, pin, value == KD_GPIO_HIGH ? GPIO_PV_HIGH : GPIO_PV_LOW); + if(pin < 32) + kd_gpio_reg_writel(kd_gpio[1] + DATA_OUTPUT, pin, value == KD_GPIO_HIGH ? GPIO_PV_HIGH : GPIO_PV_LOW); + else { + pin -= 32; + kd_gpio_reg_writel(kd_gpio[1] + DATA_OUTPUT + DATA_OUTPUT_STRIDE, pin, value == KD_GPIO_HIGH ? GPIO_PV_HIGH : GPIO_PV_LOW); + } } } @@ -177,7 +192,12 @@ int kd_pin_read(rt_base_t pin) return kd_gpio_reg_readl(kd_gpio[0] + DATA_INPUT, pin) == GPIO_PV_HIGH ? PIN_HIGH : PIN_LOW; else { pin -= 32; - return kd_gpio_reg_readl(kd_gpio[1] + DATA_INPUT, pin) == GPIO_PV_HIGH ? PIN_HIGH : PIN_LOW; + if(pin < 32) + return kd_gpio_reg_readl(kd_gpio[1] + DATA_INPUT, pin) == GPIO_PV_HIGH ? PIN_HIGH : PIN_LOW; + else { + pin -= 32; + return kd_gpio_reg_readl(kd_gpio[1] + DATA_INPUT + DATA_INPUT_STRIDE, pin) == GPIO_PV_HIGH ? PIN_HIGH : PIN_LOW; + } } } @@ -189,7 +209,11 @@ static void kd_set_pin_edge(rt_int32_t pin, gpio_pin_edge_t edge) reg = kd_gpio[0]; else { pin -= 32; - reg = kd_gpio[1]; + if(pin < 32) + reg = kd_gpio[1]; + else { + LOG_E("pin %d not support interrupt", pin+32); + } } switch (edge) @@ -236,7 +260,11 @@ static void pin_irq(int vector, void *param) reg = kd_gpio[0]; else { pin -= 32; - reg = kd_gpio[1]; + if(pin < 32) + reg = kd_gpio[1]; + else { + LOG_E("pin %d not support interrupt", pin+32); + } } switch (edge) @@ -310,7 +338,11 @@ rt_err_t kd_pin_detach_irq(rt_int32_t pin) reg = kd_gpio[0]; else { pin -= 32; - reg = kd_gpio[1]; + if(pin < 32) + reg = kd_gpio[1]; + else { + LOG_E("pin %d not support interrupt", pin+32); + } } irq_table[pin_id].hdr = RT_NULL; diff --git a/src/big/rt-smart/kernel/bsp/maix3/board/interdrv/gpio/drv_gpio.h b/src/big/rt-smart/kernel/bsp/maix3/board/interdrv/gpio/drv_gpio.h index 1f104ffc8..1bb7b0909 100755 --- a/src/big/rt-smart/kernel/bsp/maix3/board/interdrv/gpio/drv_gpio.h +++ b/src/big/rt-smart/kernel/bsp/maix3/board/interdrv/gpio/drv_gpio.h @@ -25,7 +25,7 @@ #ifndef DRV_GPIO_H__ #define DRV_GPIO_H__ -#define GPIO_MAX_NUM 64 +#define GPIO_MAX_NUM (64+8) #define IRQN_GPIO0_INTERRUPT 32 /* k230 gpio register table */ @@ -44,6 +44,10 @@ #define VER_ID_CODE 0x64 #define INT_BOTHEDGE 0x68 +#define DATA_INPUT_STRIDE 0x04 /* register stride 32 bits */ +#define DATA_OUTPUT_STRIDE 0x0c /* register stride 3*32 bits */ +#define DIRECTION_STRIDE 0x0c /* register stride 3*32 bits */ + #define KD_GPIO_HIGH 1 #define KD_GPIO_LOW 0 #define KD_GPIO_IRQ_DISABLE 0x00 diff --git a/src/big/rt-smart/kernel/bsp/maix3/board/interdrv/i2c/drv_i2c.c b/src/big/rt-smart/kernel/bsp/maix3/board/interdrv/i2c/drv_i2c.c index 4380642c0..e7032493d 100755 --- a/src/big/rt-smart/kernel/bsp/maix3/board/interdrv/i2c/drv_i2c.c +++ b/src/big/rt-smart/kernel/bsp/maix3/board/interdrv/i2c/drv_i2c.c @@ -156,7 +156,7 @@ static unsigned int __dw_i2c_set_bus_speed(struct i2c_regs *i2c_base, switch (i2c_spd) { case IC_SPEED_MODE_MAX: - cntl |= IC_CON_SPD_SS; + cntl |= IC_CON_SPD_HS; if (scl_sda_cfg) { hcnt = scl_sda_cfg->fs_hcnt; diff --git a/src/big/rt-smart/kernel/bsp/maix3/board/interdrv/i2c/drv_i2c.h b/src/big/rt-smart/kernel/bsp/maix3/board/interdrv/i2c/drv_i2c.h index 9e891fc7d..7f0da1131 100755 --- a/src/big/rt-smart/kernel/bsp/maix3/board/interdrv/i2c/drv_i2c.h +++ b/src/big/rt-smart/kernel/bsp/maix3/board/interdrv/i2c/drv_i2c.h @@ -174,7 +174,7 @@ struct i2c_regs }; #if !defined(IC_CLK) -#define IC_CLK 166 +#define IC_CLK 100 #endif #define NANO_TO_MICRO 1000 diff --git a/src/big/rt-smart/kernel/bsp/maix3/board/interdrv/sdio/drv_sdhci.c b/src/big/rt-smart/kernel/bsp/maix3/board/interdrv/sdio/drv_sdhci.c index 34ff94b87..68e0d6e9b 100755 --- a/src/big/rt-smart/kernel/bsp/maix3/board/interdrv/sdio/drv_sdhci.c +++ b/src/big/rt-smart/kernel/bsp/maix3/board/interdrv/sdio/drv_sdhci.c @@ -744,8 +744,9 @@ static void kd_mmc_request(struct rt_mmcsd_host *host, struct rt_mmcsd_req *req) { mmcsd->sdhci_data = RT_NULL; } - + rt_base_t flag = rt_hw_interrupt_disable(); error = sdhci_transfer_blocking(mmcsd); + rt_hw_interrupt_enable(flag); if (error == 1) { sdhic_error_recovery(mmcsd); diff --git a/src/big/rt-smart/kernel/bsp/maix3/rtconfig.h b/src/big/rt-smart/kernel/bsp/maix3/rtconfig.h index 414701644..f6f130367 100644 --- a/src/big/rt-smart/kernel/bsp/maix3/rtconfig.h +++ b/src/big/rt-smart/kernel/bsp/maix3/rtconfig.h @@ -142,7 +142,6 @@ #define RT_USING_HWHASH #define RT_USING_AES #define RT_USING_SM4 -//#define RT_USING_SDIO #define RT_USING_HARDLOCK #define RT_USING_GPIO #define RT_USING_SPI diff --git a/src/big/rt-smart/kernel/rt-thread/components/drivers/touch/touch.c b/src/big/rt-smart/kernel/rt-thread/components/drivers/touch/touch.c index 2b292e3ec..a4833762e 100644 --- a/src/big/rt-smart/kernel/rt-thread/components/drivers/touch/touch.c +++ b/src/big/rt-smart/kernel/rt-thread/components/drivers/touch/touch.c @@ -247,7 +247,7 @@ int rt_hw_touch_register(rt_touch_t touch, return result; } - LOG_I("rt_touch init success"); + LOG_D("rt_touch init success"); return RT_EOK; } diff --git a/src/big/rt-smart/kernel/rt-thread/components/finsh/shell.c b/src/big/rt-smart/kernel/rt-thread/components/finsh/shell.c old mode 100644 new mode 100755 index ced3b7506..dc998011b --- a/src/big/rt-smart/kernel/rt-thread/components/finsh/shell.c +++ b/src/big/rt-smart/kernel/rt-thread/components/finsh/shell.c @@ -450,14 +450,8 @@ void finsh_thread_entry(void *parameter) #endif rt_kprintf(FINSH_PROMPT); -static int shell_thread_first_run = 1; while (1) { - if(shell_thread_first_run) { - shell_thread_first_run = 0; - msh_exec("/bin/init.sh", 13); - continue; - } ch = finsh_getchar(); if (ch < 0) { diff --git a/src/common/cdk/kernel/ipcm/include/ipcm_buffer.h b/src/common/cdk/kernel/ipcm/include/ipcm_buffer.h index ef3a385dd..7dedc9b84 100644 --- a/src/common/cdk/kernel/ipcm/include/ipcm_buffer.h +++ b/src/common/cdk/kernel/ipcm/include/ipcm_buffer.h @@ -49,6 +49,7 @@ struct ipcm_transfer_handle { ipcm_atomic_t max_send_len; ipcm_atomic_t max_recv_len; struct ipcm_lock lock; + struct ipcm_event connect_event; }; struct mem_region { diff --git a/src/common/cdk/kernel/ipcm/message/ipcm.c b/src/common/cdk/kernel/ipcm/message/ipcm.c index ce65348f4..4cd45c9c8 100644 --- a/src/common/cdk/kernel/ipcm/message/ipcm.c +++ b/src/common/cdk/kernel/ipcm/message/ipcm.c @@ -193,6 +193,7 @@ void *ipcm_vdd_open(int target, int port, int priority) } handle = __ipcm_mem_alloc__(sizeof(struct ipcm_transfer_handle)); + __memset__(handle, 0, sizeof(struct ipcm_transfer_handle)); if (!handle) { ipcm_err("handle alloc failed!"); return NULL; @@ -215,7 +216,7 @@ void *ipcm_vdd_open(int target, int port, int priority) __ipcm_atomic_set__(&handle->recv_count, 0); __ipcm_atomic_set__(&handle->max_send_len, 0); __ipcm_atomic_set__(&handle->max_recv_len, 0); - + __ipcm_event_init__(&handle->connect_event); g_ipcm_nodes[target].handlers[port] = handle; return handle; @@ -237,6 +238,8 @@ void ipcm_vdd_close(void *data) return; } ipcm_trace(TRACE_DEV, "target [%d:%d]", target, port); + __ipcm_event_free__(&handle->connect_event); + __ipcm_lock_free__(&handle->lock); __ipcm_mem_free__(handle); if (g_ipcm_nodes[target].handlers) { g_ipcm_nodes[target].handlers[port] = NULL; @@ -374,7 +377,7 @@ int ipcm_vdd_connect(void *data, int is_block) __ipcm_lock__(&handle->lock); if (__HANDLE_CONNECTED == handle->state) { - ipcm_trace(TRACE_MSG, "handle is connected"); + ipcm_err(TRACE_MSG, "handle is connected"); __ipcm_unlock__(&handle->lock); __ipcm_irq_restore__(irq_save); return 0; @@ -416,18 +419,19 @@ int ipcm_vdd_connect(void *data, int is_block) return 1; #ifndef NO_MULTITASKS - /* wait until the handle is connected */ - do { - if (__HANDLE_DISCONNECTED == handle->state) { - ret = -1; - break; - } + if (__HANDLE_DISCONNECTED == handle->state) { + ipcm_err("handle is disconnected\n"); + return -1; + } - if (__HANDLE_CONNECTED == handle->state) - break; + if(__HANDLE_CONNECTED == handle->state) { + ipcm_info("handle is CONNECTED \n"); + return 0; + } + + /* wait until the handle is connected */ + __ipcm_wait_event__(&handle->connect_event); - __ipcm_msleep__(1); - } while(1); #else return 1; #endif diff --git a/src/common/cdk/kernel/ipcm/message/ipcm_data.c b/src/common/cdk/kernel/ipcm/message/ipcm_data.c index 18c88f037..74813fb74 100644 --- a/src/common/cdk/kernel/ipcm/message/ipcm_data.c +++ b/src/common/cdk/kernel/ipcm/message/ipcm_data.c @@ -220,6 +220,7 @@ static void ack_connect_msg(struct ipcm_node *node, #endif node->handlers_state[head->port] = CONNECT_ACKED; handle->state = __HANDLE_CONNECTED; + __ipcm_wakeup_event__(&handle->connect_event); __ipcm_unlock__(&handle->lock); } break; diff --git a/src/common/cdk/kernel/ipcm/sysdeps/linux/os_adapt.c b/src/common/cdk/kernel/ipcm/sysdeps/linux/os_adapt.c index 948c20c43..bda6fa235 100644 --- a/src/common/cdk/kernel/ipcm/sysdeps/linux/os_adapt.c +++ b/src/common/cdk/kernel/ipcm/sysdeps/linux/os_adapt.c @@ -114,7 +114,7 @@ void __ipcm_io_unmapping__(void *addr) void __ipcm_msleep__(unsigned int ms) { - msleep(ms); + msleep_interruptible(ms); } struct ipcm_task *__ipcm_thread_create__(char *name, @@ -209,7 +209,7 @@ void __ipcm_timer_restart__(struct ipcm_timer *itimer, int ms) int __ipcm_event_init__(struct ipcm_event *ievent) { wait_queue_head_t *wait; - wait = kmalloc(sizeof(wait_queue_head_t), GFP_KERNEL); + wait = kzalloc(sizeof(wait_queue_head_t), GFP_KERNEL); if (NULL == wait) { printk(KERN_ERR "alloc event failed\n"); return -ENOMEM; diff --git a/src/common/cdk/user/component/datafifo/host/lib/libdatafifo.a b/src/common/cdk/user/component/datafifo/host/lib/libdatafifo.a index 4f18d56a3..a0fa1a776 100644 Binary files a/src/common/cdk/user/component/datafifo/host/lib/libdatafifo.a and b/src/common/cdk/user/component/datafifo/host/lib/libdatafifo.a differ diff --git a/src/common/cdk/user/component/datafifo/slave/lib/libdatafifo.a b/src/common/cdk/user/component/datafifo/slave/lib/libdatafifo.a index fd8fd4999..de8fea5fd 100644 Binary files a/src/common/cdk/user/component/datafifo/slave/lib/libdatafifo.a and b/src/common/cdk/user/component/datafifo/slave/lib/libdatafifo.a differ diff --git a/src/common/cdk/user/component/ipcmsg/host/lib/libipcmsg.a b/src/common/cdk/user/component/ipcmsg/host/lib/libipcmsg.a index a93922270..5aa46ae2f 100644 Binary files a/src/common/cdk/user/component/ipcmsg/host/lib/libipcmsg.a and b/src/common/cdk/user/component/ipcmsg/host/lib/libipcmsg.a differ diff --git a/src/common/cdk/user/component/ipcmsg/slave/lib/libipcmsg.a b/src/common/cdk/user/component/ipcmsg/slave/lib/libipcmsg.a index 6de065d3e..3514981ae 100644 Binary files a/src/common/cdk/user/component/ipcmsg/slave/lib/libipcmsg.a and b/src/common/cdk/user/component/ipcmsg/slave/lib/libipcmsg.a differ diff --git a/src/common/cdk/user/mapi/mediaserver/dpu/mapi_dpu_server.c b/src/common/cdk/user/mapi/mediaserver/dpu/mapi_dpu_server.c index 7c8fe4b1d..687a194c8 100644 --- a/src/common/cdk/user/mapi/mediaserver/dpu/mapi_dpu_server.c +++ b/src/common/cdk/user/mapi/mediaserver/dpu/mapi_dpu_server.c @@ -58,31 +58,30 @@ #include "k_vvi_comm.h" #include "mpi_vvi_api.h" -#define REF_VOL (1.8) -#define RESOLUTION (4096) +#define REF_VOL (1.8) +#define RESOLUTION (4096) -#define ADC_CHN_ENABLE (0) +#define ADC_CHN_ENABLE (0) #define ADC_CHN_DISABLE (1) /* dpu file path define */ -#define PARAM_PATH "/sharefs/H1280W720_conf.bin" -#define REF_PATH "/sharefs/H1280W720_ref.bin" +#define PARAM_PATH "/sharefs/H1280W720_conf.bin" +#define REF_PATH "/sharefs/H1280W720_ref.bin" #define MSG_KEY_TYPE 0XFFF1 #define BLOCKLEN (512) #define DATAFIFO_CHN 4 -#define VICAP_OUTPUT_BUF_NUM 60 +#define VICAP_OUTPUT_BUF_NUM 10 -#define DISPLAY_WITDH 1088 -#define DISPLAY_HEIGHT 1920 - -#define CHECK_MAPI_DPU_NULL_PTR(paraname, ptr) \ - do { \ - if ((ptr) == NULL) { \ +#define CHECK_MAPI_DPU_NULL_PTR(paraname, ptr) \ + do \ + { \ + if ((ptr) == NULL) \ + { \ mapi_dpu_error_trace("%s is NULL pointer\n", paraname); \ - return K_MAPI_ERR_DPU_NULL_PTR; \ - } \ + return K_MAPI_ERR_DPU_NULL_PTR; \ + } \ } while (0) static inline void VDD_CHECK_RET(k_s32 ret, const char *func, const int line) @@ -91,7 +90,7 @@ static inline void VDD_CHECK_RET(k_s32 ret, const char *func, const int line) printf("error ret %d, func %s line %d\n", ret, func, line); } -static k_datafifo_handle hDataFifo[DATAFIFO_CHN] = {K_DATAFIFO_INVALID_HANDLE,K_DATAFIFO_INVALID_HANDLE,K_DATAFIFO_INVALID_HANDLE,K_DATAFIFO_INVALID_HANDLE}; +static k_datafifo_handle hDataFifo[DATAFIFO_CHN] = {K_DATAFIFO_INVALID_HANDLE, K_DATAFIFO_INVALID_HANDLE, K_DATAFIFO_INVALID_HANDLE, K_DATAFIFO_INVALID_HANDLE}; static k_u32 dump_count = 0; static pthread_t output_tid = 0; static pthread_t adc_tid = 0; @@ -102,30 +101,36 @@ static k_bool image_exiting = K_FALSE; static k_bool speckle_exiting = K_FALSE; static k_video_frame_info rgb_buf[VICAP_OUTPUT_BUF_NUM]; static k_video_frame_info speckle_buf[VICAP_OUTPUT_BUF_NUM]; -static k_u32 rgb_wp=0; -static k_u32 rgb_rp=0; -static k_u32 speckle_wp=0; -static k_u32 speckle_rp=0; -static k_u32 rgb_total_cnt=0; -static k_u32 speckle_total_cnt=0; +static k_dpu_chn_result_u depth_buf[VICAP_OUTPUT_BUF_NUM]; +static k_bool image_overflow; +static k_u32 rgb_wp = 0; +static k_u32 rgb_rp = 0; +static k_u32 speckle_wp = 0; +static k_u32 speckle_rp = 0; +static k_u32 depth_wp=0; +static k_u32 depth_rp=0; +static k_u32 rgb_total_cnt = 0; +static k_u32 speckle_total_cnt = 0; +static k_u32 depth_total_cnt=0; static int rgb_dev; static int rgb_chn; static int speckle_dev; static int speckle_chn; static k_vb_blk_handle ir_handle; static k_bool adc_en = K_FALSE; -static k_u64 dump_start_time=0; +static k_u64 dump_start_time = 0; +static k_u64 rgb_dump_start_time = 0; static k_bool depth_send_done; static k_bool rgb_send_done; static kd_dpu_callback_s dpu_callback_attr[VICAP_DEV_ID_MAX]; static k_datafifo_params_s dpu_writer_params = {128, BLOCKLEN, K_TRUE, DATAFIFO_WRITER}; static int IsInitok[DATAFIFO_CHN] = {0}; -static k_dpu_mode_e dpu_bind=DPU_UNBIND; +static k_dpu_mode_e dpu_bind = DPU_UNBIND; static k_u32 width; static k_u32 height; static k_video_frame_info ir_frame; -static k_char depth_send_buf[BLOCKLEN*8]; -static k_char image_send_buf[BLOCKLEN*8]; +static k_char depth_send_buf[BLOCKLEN * 8]; +static k_char image_send_buf[BLOCKLEN * 8]; static k_dma_dev_attr_t dma_dev_attr; static k_dma_chn_attr_u chn_attr[DMA_MAX_CHN_NUMS]; static k_dpu_init_t dpu_init; @@ -136,11 +141,12 @@ static k_dpu_user_space_t g_temp_space; static k_u32 ir_buf_size; static k_u32 dpu_buf_cnt; static k_u32 dma_buf_cnt; -static rt_device_t adc_dev=NULL; +static rt_device_t adc_dev = NULL; static k_dpu_temperature_t temperature; -static float g_cur_temperature = 0; +static float g_cur_temperature = 0; static k_dpu_image_mode image_mode; -static k_u32 delay_us=3000; +static k_u32 delay_us = 3000; +static pthread_mutex_t dump_mutex = PTHREAD_MUTEX_INITIALIZER; static k_u64 get_ticks() { @@ -151,21 +157,21 @@ static k_u64 get_ticks() return time_elapsed; } -int sample_adc(float* temp) +int sample_adc(float *temp) { - //adc - int ret = 0; - unsigned int channel = 2; - unsigned int reg_value = 0; - float R_series = 10.2; - float R_ntc = 1.0; - float R_t0 = 10.0; - float Bn = 3380; + // adc + int ret = 0; + unsigned int channel = 2; + unsigned int reg_value = 0; + float R_series = 10.2; + float R_ntc = 1.0; + float R_t0 = 10.0; + float Bn = 3380; - float temperature = 0.0f; - float vol = 0.0; + float temperature = 0.0f; + float vol = 0.0; - if(adc_dev == NULL) + if (adc_dev == NULL) { adc_dev = rt_device_find("adc"); if (adc_dev == RT_NULL) @@ -182,87 +188,89 @@ int sample_adc(float* temp) } } - /////////// - //get temperature - //1read - uint32_t *p; - p = (uint32_t *)(intptr_t)channel; - ret = rt_device_control(adc_dev, ADC_CHN_ENABLE, (void *)p); - if (ret != RT_EOK) - { - printf("adc device control err\n"); - return -1; - } + /////////// + // get temperature + // 1read + uint32_t *p; + p = (uint32_t *)(intptr_t)channel; + ret = rt_device_control(adc_dev, ADC_CHN_ENABLE, (void *)p); + if (ret != RT_EOK) + { + printf("adc device control err\n"); + return -1; + } - ret = rt_device_read(adc_dev, channel, (void *)®_value, sizeof(unsigned int)); + ret = rt_device_read(adc_dev, channel, (void *)®_value, sizeof(unsigned int)); - //2get target - vol = REF_VOL * reg_value / RESOLUTION; - R_ntc = vol * R_series / (REF_VOL - vol); - temperature = Bn / (log(R_ntc / R_t0) + Bn / 298.15) - 273.15; - // printf("channel %d reg_value:0x%04x, voltage:%f, R_ntc:%f, temperature:%f *c\n", channel, reg_value, vol, R_ntc, temperature); + // 2get target + vol = REF_VOL * reg_value / RESOLUTION; + R_ntc = vol * R_series / (REF_VOL - vol); + temperature = Bn / (log(R_ntc / R_t0) + Bn / 298.15) - 273.15; + // printf("channel %d reg_value:0x%04x, voltage:%f, R_ntc:%f, temperature:%f *c\n", channel, reg_value, vol, R_ntc, temperature); - *temp = temperature; - return 0; + *temp = temperature; + return 0; } int sample_dv_dpu_update_temp(float temperature_obj) { - if (temperature_obj < -50 || temperature_obj>100) { - printf("obj temperature is invalid!\n"); - return -1; - } - - //printf("start temperature rectify:ref_temp: %f, temperature:%f \n", temperature.ref, temperature_obj); - float diff_temp = temperature_obj - temperature.ref; - //if (diff_temp < 3 && diff_temp > -3) - //{ - // printf("temperature is near refence temperature!there is no need to rectify \n"); - // return 0; - //} - - k_u16 image_width = dpu_dev_attr.dev_param.spp.width_speckle; - k_u16 image_height = dpu_dev_attr.dev_param.spp.height_speckle; - - float* row_offset_ = dpu_dev_attr.dev_param.lpp.row_offset; - float* col_offset_ = dpu_dev_attr.dev_param.lpp.col_offset; - - // 温度补偿量计算 - for (k_u16 r = 0; r < image_height; r++) { - // 行偏差温度补偿 - float dalte_v_ = 0.f; - float temp_vertical = (r - temperature.cy) * diff_temp * temperature.ky; - float y_temp = temp_vertical + r; - if (y_temp > 0.5 && y_temp < image_height - 0.5) - dalte_v_ = temp_vertical; - row_offset_[r] = dalte_v_; - } - - for (k_u16 c = 0; c < image_width; c++) { - // 列偏差温度补偿 - float dalte_u_ = 0.f; - float temp_horizonal = (c - temperature.cx) * diff_temp * temperature.kx; - float x_temp = temp_horizonal + c; - if (x_temp > 0.5 && x_temp < image_width-0.5) - dalte_u_ = temp_horizonal; - col_offset_[c] = dalte_u_; - } - - kd_mpi_sys_mmz_flush_cache(dpu_dev_attr.dev_param.lpp.row_offset_phys, dpu_dev_attr.dev_param.lpp.row_offset, image_height * sizeof(float)); - kd_mpi_sys_mmz_flush_cache(dpu_dev_attr.dev_param.lpp.col_offset_phys, dpu_dev_attr.dev_param.lpp.col_offset, image_width * sizeof(float)); - - - k_s32 ret = kd_mpi_dpu_set_dev_attr(&dpu_dev_attr); - if (ret) { - printf("kd_mpi_dpu_set_dev_attr failed\n"); - printf("rectify failed\n"); - return -1; - //goto err_dpu_delet; - } - printf("rectify success\n"); - - return 0; + if (temperature_obj < -50 || temperature_obj > 100) + { + printf("obj temperature is invalid!\n"); + return -1; + } + + // printf("start temperature rectify:ref_temp: %f, temperature:%f \n", temperature.ref, temperature_obj); + float diff_temp = temperature_obj - temperature.ref; + // if (diff_temp < 3 && diff_temp > -3) + //{ + // printf("temperature is near refence temperature!there is no need to rectify \n"); + // return 0; + // } + + k_u16 image_width = dpu_dev_attr.dev_param.spp.width_speckle; + k_u16 image_height = dpu_dev_attr.dev_param.spp.height_speckle; + + float *row_offset_ = dpu_dev_attr.dev_param.lpp.row_offset; + float *col_offset_ = dpu_dev_attr.dev_param.lpp.col_offset; + + // 温度补偿量计算 + for (k_u16 r = 0; r < image_height; r++) + { + // 行偏差温度补偿 + float dalte_v_ = 0.f; + float temp_vertical = (r - temperature.cy) * diff_temp * temperature.ky; + float y_temp = temp_vertical + r; + if (y_temp > 0.5 && y_temp < image_height - 0.5) + dalte_v_ = temp_vertical; + row_offset_[r] = dalte_v_; + } + + for (k_u16 c = 0; c < image_width; c++) + { + // 列偏差温度补偿 + float dalte_u_ = 0.f; + float temp_horizonal = (c - temperature.cx) * diff_temp * temperature.kx; + float x_temp = temp_horizonal + c; + if (x_temp > 0.5 && x_temp < image_width - 0.5) + dalte_u_ = temp_horizonal; + col_offset_[c] = dalte_u_; + } + + kd_mpi_sys_mmz_flush_cache(dpu_dev_attr.dev_param.lpp.row_offset_phys, dpu_dev_attr.dev_param.lpp.row_offset, image_height * sizeof(float)); + kd_mpi_sys_mmz_flush_cache(dpu_dev_attr.dev_param.lpp.col_offset_phys, dpu_dev_attr.dev_param.lpp.col_offset, image_width * sizeof(float)); + + k_s32 ret = kd_mpi_dpu_set_dev_attr(&dpu_dev_attr); + if (ret) + { + printf("kd_mpi_dpu_set_dev_attr failed\n"); + printf("rectify failed\n"); + return -1; + // goto err_dpu_delet; + } + printf("rectify success\n"); + return 0; } int sample_dv_dpu_init() @@ -276,7 +284,8 @@ int sample_dv_dpu_init() dpu_init.start_num = 0; dpu_init.buffer_num = dpu_buf_cnt; ret = kd_mpi_dpu_init(&dpu_init); - if (ret) { + if (ret) + { printf("kd_mpi_dpu_init failed\n"); goto err_return; } @@ -289,11 +298,13 @@ int sample_dv_dpu_init() &g_temp_space); // printf("g_temp_space.virt_addr:%p, g_temp_space.phys_addr:%lx\n", // g_temp_space.virt_addr, g_temp_space.phys_addr); - if (g_temp_space.virt_addr == NULL) { + if (g_temp_space.virt_addr == NULL) + { printf("g_temp_space.virt_addr is NULL\n"); goto err_return; } - if (ret) { + if (ret) + { printf("kd_mpi_dpu_parse_file failed\n"); goto err_return; } @@ -305,7 +316,8 @@ int sample_dv_dpu_init() dpu_dev_attr.param_valid = 123; ret = kd_mpi_dpu_set_dev_attr(&dpu_dev_attr); - if (ret) { + if (ret) + { printf("kd_mpi_dpu_set_dev_attr failed\n"); goto err_dpu_delet; } @@ -313,7 +325,8 @@ int sample_dv_dpu_init() /* set reference image */ ret = kd_mpi_dpu_set_ref_image(REF_PATH); - if (ret) { + if (ret) + { printf("kd_mpi_dpu_set_ref_image failed\n"); goto err_dpu_delet; } @@ -321,7 +334,8 @@ int sample_dv_dpu_init() /* set template image */ ret = kd_mpi_dpu_set_template_image(&g_temp_space); - if (ret) { + if (ret) + { printf("kd_mpi_dpu_set_template_image failed\n"); goto err_dpu_delet; } @@ -329,7 +343,8 @@ int sample_dv_dpu_init() /* start dev */ ret = kd_mpi_dpu_start_dev(); - if (ret) { + if (ret) + { printf("kd_mpi_dpu_start_dev failed\n"); goto err_dpu_delet; } @@ -341,7 +356,8 @@ int sample_dv_dpu_init() ir_attr.chn_num = 1; ir_attr.param_valid = 0; ret = kd_mpi_dpu_set_chn_attr(&lcn_attr, &ir_attr); - if (ret) { + if (ret) + { printf("kd_mpi_dpu_set_chn_attr failed\n"); goto err_dpu_dev; } @@ -349,7 +365,8 @@ int sample_dv_dpu_init() /* start channel 0 */ ret = kd_mpi_dpu_start_chn(0); - if (ret) { + if (ret) + { printf("kd_mpi_dpu_start_chn 0 failed\n"); goto err_dpu_dev; } @@ -357,7 +374,8 @@ int sample_dv_dpu_init() /* start channel 1 */ ret = kd_mpi_dpu_start_chn(1); - if (ret) { + if (ret) + { printf("kd_mpi_dpu_start_chn 1 failed\n"); goto err_dpu_dev; } @@ -369,12 +387,14 @@ int sample_dv_dpu_init() * This part is used to stop the DPU ***********************************************************/ ret = kd_mpi_dpu_stop_chn(0); - if (ret) { + if (ret) + { printf("kd_mpi_dpu_stop_chn lcn failed\n"); return 0; } ret = kd_mpi_dpu_stop_chn(1); - if (ret) { + if (ret) + { printf("kd_mpi_dpu_stop_chn ir failed\n"); return 0; } @@ -382,7 +402,8 @@ int sample_dv_dpu_init() err_dpu_dev: ret = kd_mpi_dpu_stop_dev(); - if (ret) { + if (ret) + { printf("kd_mpi_dpu_stop_dev failed\n"); return 0; } @@ -400,19 +421,22 @@ int sample_dv_dpu_delete() k_s32 ret; ret = kd_mpi_dpu_stop_chn(0); - if (ret) { + if (ret) + { printf("kd_mpi_dpu_stop_chn lcn failed\n"); return 0; } ret = kd_mpi_dpu_stop_chn(1); - if (ret) { + if (ret) + { printf("kd_mpi_dpu_stop_chn ir failed\n"); return 0; } printf("kd_mpi_dpu_stop_chn success\n"); ret = kd_mpi_dpu_stop_dev(); - if (ret) { + if (ret) + { printf("kd_mpi_dpu_stop_dev failed\n"); return 0; } @@ -438,7 +462,7 @@ static k_s32 dma_chn_attr_init(k_dma_chn_attr_u attr[8]) gdma_attr = &attr[0].gdma_attr; gdma_attr->buffer_num = dma_buf_cnt; - gdma_attr->rotation = DEGREE_90;//DEGREE_90; + gdma_attr->rotation = DEGREE_90; // DEGREE_90; gdma_attr->x_mirror = K_FALSE; gdma_attr->y_mirror = K_FALSE; gdma_attr->width = width; @@ -472,7 +496,7 @@ int sample_dv_dma_init() /************************************************************ * This part is used to initialize the parameters of the dma. ***********************************************************/ - memset(chn_attr, 0, sizeof(k_dma_chn_attr_u)*DMA_MAX_CHN_NUMS); + memset(chn_attr, 0, sizeof(k_dma_chn_attr_u) * DMA_MAX_CHN_NUMS); dma_dev_attr_init(&dma_dev_attr); dma_chn_attr_init(chn_attr); @@ -480,35 +504,41 @@ int sample_dv_dma_init() * This part is the demo that actually starts to use DMA ***********************************************************/ ret = kd_mpi_dma_set_dev_attr(&dma_dev_attr); - if (ret != K_SUCCESS) { + if (ret != K_SUCCESS) + { printf("set dev attr error\r\n"); goto err_return; } ret = kd_mpi_dma_start_dev(); - if (ret != K_SUCCESS) { + if (ret != K_SUCCESS) + { printf("start dev error\r\n"); goto err_return; } ret = kd_mpi_dma_set_chn_attr(0, &chn_attr[0]); - if (ret != K_SUCCESS) { + if (ret != K_SUCCESS) + { printf("set chn attr error\r\n"); goto err_dma_dev; } ret = kd_mpi_dma_start_chn(0); - if (ret != K_SUCCESS) { + if (ret != K_SUCCESS) + { printf("start chn error\r\n"); goto err_dma_dev; } ret = kd_mpi_dma_set_chn_attr(1, &chn_attr[1]); - if (ret != K_SUCCESS) { + if (ret != K_SUCCESS) + { printf("set chn attr error\r\n"); goto err_dma_dev; } ret = kd_mpi_dma_start_chn(1); - if (ret != K_SUCCESS) { + if (ret != K_SUCCESS) + { printf("start chn error\r\n"); goto err_dma_dev; } @@ -519,18 +549,21 @@ int sample_dv_dma_init() * This part is used to stop the DMA ***********************************************************/ ret = kd_mpi_dma_stop_chn(0); - if (ret != K_SUCCESS) { + if (ret != K_SUCCESS) + { printf("stop chn error\r\n"); } ret = kd_mpi_dma_stop_chn(1); - if (ret != K_SUCCESS) { + if (ret != K_SUCCESS) + { printf("stop chn error\r\n"); } err_dma_dev: ret = kd_mpi_dma_stop_dev(); - if (ret != K_SUCCESS) { + if (ret != K_SUCCESS) + { printf("stop dev error\r\n"); } @@ -546,48 +579,50 @@ int sample_dv_dma_delete() * This part is used to stop the DMA ***********************************************************/ ret = kd_mpi_dma_stop_chn(0); - if (ret != K_SUCCESS) { + if (ret != K_SUCCESS) + { printf("stop chn error\r\n"); } ret = kd_mpi_dma_stop_chn(1); - if (ret != K_SUCCESS) { + if (ret != K_SUCCESS) + { printf("stop chn error\r\n"); } ret = kd_mpi_dma_stop_dev(); - if (ret != K_SUCCESS) { + if (ret != K_SUCCESS) + { printf("stop dev error\r\n"); } return K_SUCCESS; } -static void dpu_release(void* pStream) +static void dpu_release(void *pStream) { - datafifo_msg * pmsg = (datafifo_msg *)pStream; + datafifo_msg *pmsg = (datafifo_msg *)pStream; int j = 0; k_s32 ret; - if(pmsg->msg_type == MSG_KEY_TYPE) + if (pmsg->msg_type == MSG_KEY_TYPE) { - if(pmsg->dev_num == rgb_dev) + if (pmsg->dev_num == rgb_dev) { rgb_send_done = K_TRUE; // printf("%s>rgb time %ld ms\n", __func__, get_ticks()/27000); } - else if(pmsg->dev_num == speckle_dev) + else if (pmsg->dev_num == speckle_dev) { depth_send_done = K_TRUE; // printf("%s>depth time %ld ms\n", __func__, get_ticks()/27000); } } - } k_u64 send_dpu_data_init(int chn) { printf("send_dpu_data_init chn:%d \n", chn); - if(chn >= DATAFIFO_CHN) + if (chn >= DATAFIFO_CHN) { printf("open datafifo chn:%d error\n", chn); return -1; @@ -618,15 +653,14 @@ k_u64 send_dpu_data_init(int chn) return phyAddr; } - int callwriteNULLtoflushdpu(int chn) { - if(chn >= DATAFIFO_CHN) + if (chn >= DATAFIFO_CHN) { printf("callwriteNULLtoflushdpu chn:%d error\n", chn); return -1; } - if(IsInitok[chn] == 1) + if (IsInitok[chn] == 1) { k_s32 s32Ret = K_SUCCESS; // call write NULL to flush @@ -640,16 +674,16 @@ int callwriteNULLtoflushdpu(int chn) return 0; } -int send_dpu_data_to_little(int chn, k_char * buf ) +int send_dpu_data_to_little(int chn, k_char *buf) { - if(chn >= DATAFIFO_CHN) + if (chn >= DATAFIFO_CHN) { printf("open datafifo_sen chn:%d error\n", chn); return -1; } - if(IsInitok[chn] != 1) + if (IsInitok[chn] != 1) { - //printf("not open datafifo chn:%d error\n", chn); + // printf("not open datafifo chn:%d error\n", chn); return -2; } @@ -672,9 +706,9 @@ int send_dpu_data_to_little(int chn, k_char * buf ) return -4; } - if (availWriteLen >= BLOCKLEN && availWriteLen <= (128*BLOCKLEN) ) + if (availWriteLen >= BLOCKLEN && availWriteLen <= (128 * BLOCKLEN)) { - datafifo_msg * pmsg = (datafifo_msg *)buf; + datafifo_msg *pmsg = (datafifo_msg *)buf; s32Ret = kd_datafifo_write(hDataFifo[chn], buf); if (K_SUCCESS != s32Ret) @@ -689,15 +723,14 @@ int send_dpu_data_to_little(int chn, k_char * buf ) printf("write done error:%x\n", s32Ret); return -6; } - //printf("send end datafifo[%d] phys_addr:0x%lx time[%ld]\n", chn, pmsg->pack[0].phys_addr, get_big_currtime()); + // printf("send end datafifo[%d] phys_addr:0x%lx time[%ld]\n", chn, pmsg->pack[0].phys_addr, get_big_currtime()); } return 0; } - int send_dpu_data_deinit(int chn) { - if(chn >= DATAFIFO_CHN) + if (chn >= DATAFIFO_CHN) { printf("send_dpu_data_deinit chn:%d error\n", chn); return -1; @@ -717,67 +750,135 @@ int send_dpu_data_deinit(int chn) return 0; } +static void release_image() +{ + k_s32 ret; -static void image_dump() + ret = kd_mpi_vicap_dump_release(rgb_dev, rgb_chn, &rgb_buf[rgb_rp]); + if (ret) + { + printf("sample_vicap, dev(%d) chn(%d) dump frame failed.\n", rgb_dev, rgb_chn); + } + + rgb_rp++; + rgb_rp %= VICAP_OUTPUT_BUF_NUM; +} + +static void release_speckle() { - k_video_frame_info dump_info; k_s32 ret; - if(dpu_bind == DPU_UNBIND && - (image_mode == IMAGE_MODE_RGB_DEPTH || image_mode == IMAGE_MODE_RGB_IR)) + ret = kd_mpi_vicap_dump_release(speckle_dev, speckle_chn, &speckle_buf[speckle_rp]); + if (ret) { - kd_mpi_vicap_3d_mode_crtl(K_FALSE); - usleep(delay_us); + printf("sample_vicap, dev(%d) chn(%d) dump frame failed.\n", speckle_dev, speckle_chn); } + speckle_rp++; + speckle_rp %= VICAP_OUTPUT_BUF_NUM; +} + +static void image_dump() +{ + k_video_frame_info dump_info; + k_s32 ret; + k_u32 temp; + + if (rgb_dump_start_time == 0) + rgb_dump_start_time = get_ticks() / 27000; + + // if (dpu_bind == DPU_UNBIND && + // (image_mode == IMAGE_MODE_RGB_DEPTH || image_mode == IMAGE_MODE_RGB_IR)) + // { + // kd_mpi_vicap_3d_mode_crtl(K_FALSE); + // usleep(delay_us); + // } ret = kd_mpi_vicap_dump_frame(rgb_dev, rgb_chn, VICAP_DUMP_YUV, &rgb_buf[rgb_wp], 100); - if(dpu_bind == DPU_UNBIND && - (image_mode == IMAGE_MODE_RGB_DEPTH || image_mode == IMAGE_MODE_RGB_IR)) + // if (dpu_bind == DPU_UNBIND && + // (image_mode == IMAGE_MODE_RGB_DEPTH || image_mode == IMAGE_MODE_RGB_IR)) + // { + // kd_mpi_vicap_3d_mode_crtl(K_TRUE); + // usleep(delay_us); + // } + + if (ret) { - kd_mpi_vicap_3d_mode_crtl(K_TRUE); - usleep(delay_us); + // printf("sample_vicap, dev(%d) chn(%d) dump frame failed 0x%lx.\n", dev_num, chn_num, ret); + return; } - if (ret) { - //printf("sample_vicap, dev(%d) chn(%d) dump frame failed 0x%lx.\n", dev_num, chn_num, ret); + if (rgb_buf[rgb_wp].v_frame.phys_addr[0] == 0) + { + printf("rgb dump error: phys_addr is 0\n"); return; } - if(rgb_buf[rgb_wp].v_frame.phys_addr[0] == 0) + temp = rgb_wp; + temp++; + temp %= VICAP_OUTPUT_BUF_NUM; + if (temp == rgb_rp) { - printf("rgb dump error: phys_addr is 0\n"); + printf("image buffer overflow\n"); + image_overflow = K_TRUE; + ret = kd_mpi_vicap_dump_release(rgb_dev, rgb_chn, &rgb_buf[rgb_wp]); + if (ret) + { + printf("sample_vicap, dev(%d) chn(%d) dump frame failed.\n", rgb_dev, rgb_chn); + } return; } // printf("save rgb_wp %d, pts %ld, stc %ld\n", rgb_wp, rgb_buf[rgb_wp].v_frame.pts, get_ticks()/27000); + rgb_wp++; rgb_wp %= VICAP_OUTPUT_BUF_NUM; - if (rgb_wp == rgb_rp) - { - printf("rgb buffer overflow\n"); - } rgb_total_cnt++; + image_overflow = K_FALSE; + + // if (rgb_total_cnt % 30 == 0) + // { + // printf("rgb_dump_count %d, Average FrameRate = %ld Fps\n", rgb_total_cnt, (rgb_total_cnt * 1000) / (get_ticks() / 27000 - rgb_dump_start_time)); + // } + // printf("image frame cnt:%d,timestamp:%ld,frame_num:%d\n",rgb_total_cnt,rgb_buf[rgb_wp].v_frame.pts,rgb_buf[rgb_wp].v_frame.time_ref); } static void speckle_dump() { k_video_frame_info dump_info; k_s32 ret; + k_u32 temp; - ret = kd_mpi_vicap_dump_frame(speckle_dev, speckle_chn, VICAP_DUMP_YUV, &speckle_buf[speckle_wp], 200); - if (ret) { - //printf("sample_vicap, dev(%d) chn(%d) dump frame failed 0x%lx.\n", dev_num, chn_num, ret); + ret = kd_mpi_vicap_dump_frame(speckle_dev, speckle_chn, VICAP_DUMP_YUV, &speckle_buf[speckle_wp], 100); + if (ret) + { + // printf("sample_vicap, dev(%d) chn(%d) dump frame failed 0x%lx.\n", dev_num, chn_num, ret); return; } - if(speckle_buf[speckle_wp].v_frame.phys_addr[0] == 0) + + if (speckle_buf[speckle_wp].v_frame.phys_addr[0] == 0) { printf("speckle dump error: phys_addr is 0\n"); return; } // printf("save speckle_wp %d, pts %ld, %p, stc %ld\n", speckle_wp, speckle_buf[speckle_wp].v_frame.pts, &speckle_buf[speckle_wp], get_ticks()/27000); + + temp = speckle_wp; + temp++; + temp %= VICAP_OUTPUT_BUF_NUM; + if (temp == speckle_rp) + { + printf("speckle buffer overflow\n"); + ret = kd_mpi_vicap_dump_release(speckle_dev, speckle_chn, &speckle_buf[speckle_wp]); + if (ret) + { + printf("sample_vicap, dev(%d) chn(%d) release frame failed %d.\n", speckle_dev, speckle_chn, ret); + } + return; + } + speckle_wp++; speckle_wp %= VICAP_OUTPUT_BUF_NUM; if (speckle_wp == speckle_rp) @@ -788,86 +889,150 @@ static void speckle_dump() speckle_total_cnt++; } -static void send_image(k_u64 depth_pts) +static void depth_dump() { - k_video_frame_info dma_get_info; - int dataret = -1; k_s32 ret; + k_dpu_chn_result_u ir_result; + k_bool get_ir = K_FALSE; + + if(dpu_dev_attr.dev_param.spp.flag_align) + get_ir = K_TRUE; - memset(image_send_buf, 0, BLOCKLEN*8); + ret = kd_mpi_dpu_get_frame(0, &depth_buf[depth_wp], 100); + if (ret) + { + printf("kd_mpi_dpu_get_frame lcn failed\n"); + return; + } - while(rgb_wp != rgb_rp) + if(get_ir) { - k_u64 delta; - k_u32 temp; - k_bool found = K_FALSE; + ret = kd_mpi_dpu_get_frame(1, &ir_result, 100); + if (ret) { + printf("kd_mpi_dpu_get_frame ir failed\n"); + } + kd_mpi_dpu_release_frame(); + } - delta = depth_pts - rgb_buf[rgb_rp].v_frame.pts; - temp = (rgb_rp + 1) % VICAP_OUTPUT_BUF_NUM; - // printf("rgb_rp %d, rgb pts %ld, depth pts %ld\n", rgb_rp, rgb_buf[rgb_rp].v_frame.pts, depth_pts); - // if((rgb_buf[rgb_rp].v_frame.pts >= depth_pts) || - // (delta < 35000) || (delta > 1000000) || - // (temp == rgb_wp)) - { - k_u32 data_size = 0; - void *virt_addr = NULL; - k_char filename[256]; + depth_wp++; + depth_wp %= VICAP_OUTPUT_BUF_NUM; + if (depth_wp == depth_rp) + { + printf("depth buffer overflow\n"); + } - data_size = rgb_buf[rgb_rp].v_frame.width * rgb_buf[rgb_rp].v_frame.height * 3/2; + // printf("save depth_wp %d, pts %ld, %p, stc %ld\n", depth_wp, depth_buf[depth_wp].lcn_result.pts, &depth_buf[depth_wp], get_ticks()/27000); - ret = kd_mpi_dma_send_frame(1, &rgb_buf[rgb_rp], 30); - if (ret != K_SUCCESS) - { - printf("dma send frame error\r\n"); - } + depth_total_cnt++; +} - ret = kd_mpi_dma_get_frame(1, &dma_get_info, 30); - if (ret != K_SUCCESS) - { - printf("dma get frame error\r\n"); - } +static void send_image(k_u64 depth_pts) +{ + k_s32 ret; + k_u64 delta, prev_delta, prev_pts; + int i, cnt=0; + k_u32 temp_rp; - k_u64 start_time=get_ticks()/27000; - datafifo_msg *pmsg = (datafifo_msg *)image_send_buf; - pmsg->msg_type = MSG_KEY_TYPE; - pmsg->dev_num = rgb_dev; - pmsg->result_type = DPU_RESULT_TYPE_IMG; - pmsg->upfunc = (k_u8 *)dpu_callback_attr[rgb_dev].pfn_data_cb; - pmsg->puserdata = dpu_callback_attr[rgb_dev].p_private_data; + memset(image_send_buf, 0, BLOCKLEN * 8); - rgb_send_done = K_FALSE; - memcpy(&pmsg->dpu_result.img_result, &dma_get_info, sizeof(k_video_frame)); - pmsg->dpu_result.img_result.time_ref = dump_count; - pmsg->dpu_result.img_result.pts = rgb_buf[rgb_rp].v_frame.pts; - dataret = -1; - pmsg->temperature = g_cur_temperature; - dataret = send_dpu_data_to_little(rgb_dev, image_send_buf); - // printf("send depth and rgb: delta pts %6ld, time %6ld ms\n", delta, get_ticks()/27000); - if(dataret){ - printf("send img error: %d\n", dataret); - } - while(!rgb_send_done) + // printf("depth_pts %ld, rgb_wp %d, rgb_rp %d\n", depth_pts, rgb_wp, rgb_rp); + // for(i=0; i rgb_buf[temp_rp].v_frame.pts) + delta = depth_pts - rgb_buf[temp_rp].v_frame.pts; + else + delta = rgb_buf[temp_rp].v_frame.pts - depth_pts; + // printf("temp_rp %d, pts %ld, delta %ld, prev_delta %ld\n", temp_rp, rgb_buf[temp_rp].v_frame.pts, delta, prev_delta); + if(cnt > 0) + { + if(delta > prev_delta) { - callwriteNULLtoflushdpu(rgb_dev); - usleep(1000); + // printf("found matched pts %ld, cnt %d\n", prev_pts, cnt); + break; } - // printf("send rgb take time %6ld ms\n", (get_ticks()/27000-start_time)); - kd_mpi_dma_release_frame(1, &dma_get_info); + } + prev_delta = delta; + prev_pts = rgb_buf[temp_rp].v_frame.pts; - found = K_TRUE; + temp_rp ++; + temp_rp %= VICAP_OUTPUT_BUF_NUM; + if(temp_rp == rgb_wp) + { + break; } + cnt++; + } + for(i=0; imsg_type = MSG_KEY_TYPE; + pmsg->dev_num = rgb_dev; + pmsg->result_type = DPU_RESULT_TYPE_IMG; + pmsg->upfunc = (k_u8 *)dpu_callback_attr[rgb_dev].pfn_data_cb; + pmsg->puserdata = dpu_callback_attr[rgb_dev].p_private_data; + + rgb_send_done = K_FALSE; + memcpy(&pmsg->dpu_result.img_result, &dma_get_info, sizeof(k_video_frame)); + pmsg->dpu_result.img_result.time_ref = dump_count; + pmsg->dpu_result.img_result.pts = rgb_buf[rgb_rp].v_frame.pts; + dataret = -1; + pmsg->temperature = g_cur_temperature; + dataret = send_dpu_data_to_little(rgb_dev, image_send_buf); + // printf("send depth and rgb: delta pts %6ld, rgb_rp %d, time %6ld ms\n", + // (depth_pts-rgb_buf[rgb_rp].v_frame.pts), rgb_rp, get_ticks()/27000); + if (dataret) { - break; + printf("send img error: %d\n", dataret); + } + while (!rgb_send_done) + { + callwriteNULLtoflushdpu(rgb_dev); + usleep(1000); + } + // printf("send %d rgb pts %ld, take time %6ld ms\n", dump_count, rgb_buf[rgb_rp].v_frame.pts, (get_ticks()/27000-start_time)); + kd_mpi_dma_release_frame(1, &dma_get_info); + } + + release_image(); + + if(image_overflow) + { + while (rgb_wp != rgb_rp) + { + release_image(); } } } @@ -880,19 +1045,29 @@ static void dpu_unbind_dump() k_bool get_ir = K_FALSE; int dataret = -1; k_s32 ret; - k_u64 depth_pts=0; + k_u64 depth_pts = 0; - memset(depth_send_buf, 0, BLOCKLEN*8); + memset(depth_send_buf, 0, BLOCKLEN * 8); - if(dpu_dev_attr.dev_param.spp.flag_align) + if (dpu_dev_attr.dev_param.spp.flag_align) get_ir = K_TRUE; - if(dump_start_time == 0) - dump_start_time = get_ticks()/27000; + if (dump_start_time == 0) + dump_start_time = get_ticks() / 27000; - while(speckle_wp != speckle_rp) + while (speckle_wp != speckle_rp) { depth_pts = speckle_buf[speckle_rp].v_frame.pts; + { + k_u32 next_speckle_rp = speckle_rp + 1; + next_speckle_rp %= VICAP_OUTPUT_BUF_NUM; + //find the latest frame and discard old frame + if (depth_pts == 0 || (next_speckle_rp != speckle_wp)) + { + release_speckle(); + continue; + } + } ret = kd_mpi_dma_send_frame(0, &speckle_buf[speckle_rp], 30); if (ret != K_SUCCESS) @@ -906,19 +1081,13 @@ static void dpu_unbind_dump() printf("dma get frame error\r\n"); } - ret = kd_mpi_vicap_dump_release(speckle_dev, speckle_chn, &speckle_buf[speckle_rp]); - if (ret) { - printf("sample_vicap, dev(%d) chn(%d) release frame failed %d.\n", speckle_dev, speckle_chn, ret); - } - - speckle_rp++; - speckle_rp %= VICAP_OUTPUT_BUF_NUM; + release_speckle(); - k_u64 start_time=get_ticks()/27000; + k_u64 start_time = get_ticks() / 27000; - if(image_mode == IMAGE_MODE_RGB_IR || - image_mode == IMAGE_MODE_NONE_SPECKLE || - image_mode == IMAGE_MODE_NONE_IR) + if (image_mode == IMAGE_MODE_RGB_IR || + image_mode == IMAGE_MODE_NONE_SPECKLE || + image_mode == IMAGE_MODE_NONE_IR) { datafifo_msg *pmsg = (datafifo_msg *)depth_send_buf; pmsg->msg_type = MSG_KEY_TYPE; @@ -935,43 +1104,48 @@ static void dpu_unbind_dump() dataret = send_dpu_data_to_little(speckle_dev, depth_send_buf); - if(dataret){ + if (dataret) + { printf("send IR error: %d\n", dataret); } - while(!depth_send_done) + while (!depth_send_done) { callwriteNULLtoflushdpu(speckle_dev); usleep(1000); } kd_mpi_dma_release_frame(0, &dma_get_info); - // printf("send IR take time %6ld ms\n", (get_ticks()/27000-start_time)); + // printf("send %d IR pts %ld take time %6ld ms\n", dump_count, depth_pts, (get_ticks()/27000-start_time)); } else { ret = kd_mpi_dpu_send_frame(0, dma_get_info.v_frame.phys_addr[0], 30); - if (ret) { - printf("kd_mpi_dpu_send_frame failed, time %ld ms\n", get_ticks()/27000); + if (ret) + { + printf("kd_mpi_dpu_send_frame failed, time %ld ms\n", get_ticks() / 27000); } - if(get_ir) + if (get_ir) { ret = kd_mpi_dpu_send_frame(1, ir_frame.v_frame.phys_addr[0], 30); - if (ret) { + if (ret) + { printf("kd_mpi_dpu_send_frame ir failed\n"); } } ret = kd_mpi_dpu_get_frame(0, &lcn_result, 100); - if (ret) { + if (ret) + { printf("kd_mpi_dpu_get_frame failed\n"); } - if(get_ir) + if (get_ir) { ret = kd_mpi_dpu_get_frame(1, &ir_result, 100); - if (ret) { + if (ret) + { printf("kd_mpi_dpu_get_frame failed\n"); } kd_mpi_dpu_release_frame(); @@ -993,88 +1167,172 @@ static void dpu_unbind_dump() kd_mpi_dma_release_frame(0, &dma_get_info); - if(dataret){ + if (dataret) + { printf("send depth error: %d\n", dataret); kd_mpi_dpu_release_frame(); } - while(!depth_send_done) + while (!depth_send_done) { callwriteNULLtoflushdpu(speckle_dev); usleep(1000); } kd_mpi_dpu_release_frame(); - // printf("send depth take time %6ld ms\n", (get_ticks()/27000-start_time)); + // printf("send %d depth pts %ld take time %6ld ms\n", dump_count, depth_pts, (get_ticks()/27000-start_time)); } send_image(depth_pts); dump_count++; - if(dump_count % 30 == 0) + if (dump_count % 30 == 0) { - printf("dump_count %d, Average FrameRate = %ld Fps\n", dump_count, (dump_count*1000)/(get_ticks()/27000-dump_start_time)); + printf("dump_count %d, Average FrameRate = %ld Fps\n", dump_count, (dump_count * 1000) / (get_ticks() / 27000 - dump_start_time)); } } } static void dpu_bind_dump() { - k_video_frame_info dma_get_info; k_dpu_chn_result_u lcn_result; - k_dpu_chn_result_u ir_result; k_bool get_ir = K_FALSE; int dataret = -1; k_s32 ret; k_u64 depth_pts=0; + k_video_frame_info dma_get_info; memset(depth_send_buf, 0, BLOCKLEN * sizeof(k_char)); - if(dpu_dev_attr.dev_param.spp.flag_align) - get_ir = K_TRUE; - if(dump_start_time == 0) dump_start_time = get_ticks()/27000; - ret = kd_mpi_dpu_get_frame(0, &lcn_result, 1000); - if (ret) { - printf("kd_mpi_dpu_get_frame lcn failed\n"); - return; - } - - if(get_ir) + while(depth_wp != depth_rp && rgb_wp != rgb_rp) { - ret = kd_mpi_dpu_get_frame(1, &ir_result, 1000); - if (ret) { - printf("kd_mpi_dpu_get_frame ir failed\n"); + k_bool found = K_FALSE; + + lcn_result = depth_buf[depth_rp]; + depth_pts = lcn_result.lcn_result.pts; + { + k_u32 next_depth_rp = depth_rp + 1; + next_depth_rp %= VICAP_OUTPUT_BUF_NUM; + //find the latest frame and drop old frames + if (next_depth_rp != depth_wp) + { + kd_mpi_dpu_release_frame(); + depth_rp++; + depth_rp %= VICAP_OUTPUT_BUF_NUM; + continue; + } + } + + while(rgb_wp != rgb_rp) + { + k_u64 delta, rgb_pts; + k_u32 temp; + rgb_pts = rgb_buf[rgb_rp].v_frame.pts; + delta = depth_pts > rgb_pts?(depth_pts - rgb_pts):(rgb_pts - depth_pts); + temp = (rgb_rp + 1) % VICAP_OUTPUT_BUF_NUM; + // printf("rgb_rp %d, rgb pts %ld, depth pts %ld, delta %ld\n", rgb_rp, rgb_pts, depth_pts, delta); + if((delta < 100000) || (delta > 1000000) || (temp == rgb_wp)) + { + found = K_TRUE; + break; + } + release_image(); + } + + if(!found) + { + kd_mpi_dpu_release_frame(); + depth_rp++; + depth_rp %= VICAP_OUTPUT_BUF_NUM; + continue; + } + + k_u64 start_time=get_ticks()/27000; + + datafifo_msg *pmsg = (datafifo_msg *)depth_send_buf; + pmsg->msg_type = MSG_KEY_TYPE; + pmsg->dev_num = speckle_dev; + pmsg->result_type = DPU_RESULT_TYPE_LCN; + pmsg->upfunc = (k_u8 *)dpu_callback_attr[speckle_dev].pfn_data_cb; + pmsg->puserdata = dpu_callback_attr[speckle_dev].p_private_data; + depth_send_done = K_FALSE; + memcpy(&pmsg->dpu_result.lcn_result, &lcn_result, sizeof(k_dpu_chn_result_u)); + pmsg->dpu_result.lcn_result.time_ref = dump_count; + pmsg->dpu_result.lcn_result.pts = depth_pts; + pmsg->temperature = g_cur_temperature; + + dataret = -1; + dataret = send_dpu_data_to_little(speckle_dev, depth_send_buf); + if(dataret){ + printf("send depth error: %d\n", dataret); + kd_mpi_dpu_release_frame(); } + + while(!depth_send_done) + { + callwriteNULLtoflushdpu(speckle_dev); + usleep(1000); + } + + // printf("send depth take time %6ld ms\n", (get_ticks()/27000-start_time)); kd_mpi_dpu_release_frame(); - } - depth_pts = lcn_result.lcn_result.pts; + k_u32 data_size = 0; + void *virt_addr = NULL; + k_char filename[256]; - k_u64 start_time=get_ticks()/27000; + data_size = rgb_buf[rgb_rp].v_frame.width * rgb_buf[rgb_rp].v_frame.height * 3 / 2; - datafifo_msg *pmsg = (datafifo_msg *)depth_send_buf; - pmsg->msg_type = MSG_KEY_TYPE; - pmsg->dev_num = speckle_dev; - pmsg->result_type = DPU_RESULT_TYPE_LCN; - pmsg->upfunc = (k_u8 *)dpu_callback_attr[speckle_dev].pfn_data_cb; - pmsg->puserdata = dpu_callback_attr[speckle_dev].p_private_data; - depth_send_done = K_FALSE; - memcpy(&pmsg->dpu_result.lcn_result, &lcn_result, sizeof(k_dpu_chn_result_u)); - dataret = -1; - pmsg->temperature = g_cur_temperature; - dataret = send_dpu_data_to_little(speckle_dev, depth_send_buf); + ret = kd_mpi_dma_send_frame(1, &rgb_buf[rgb_rp], 30); + if (ret != K_SUCCESS) + { + printf("dma send frame error\r\n"); + } - while(!depth_send_done) - { - callwriteNULLtoflushdpu(speckle_dev); - usleep(1000); - } - // printf("send depth take time %6ld ms\n", (get_ticks()/27000-start_time)); - kd_mpi_dpu_release_frame(); + ret = kd_mpi_dma_get_frame(1, &dma_get_info, 30); + if (ret != K_SUCCESS) + { + printf("dma get frame error\r\n"); + } + + start_time = get_ticks() / 27000; + pmsg = (datafifo_msg *)image_send_buf; + pmsg->msg_type = MSG_KEY_TYPE; + pmsg->dev_num = rgb_dev; + pmsg->result_type = DPU_RESULT_TYPE_IMG; + pmsg->upfunc = (k_u8 *)dpu_callback_attr[rgb_dev].pfn_data_cb; + pmsg->puserdata = dpu_callback_attr[rgb_dev].p_private_data; + + rgb_send_done = K_FALSE; + memcpy(&pmsg->dpu_result.img_result, &dma_get_info, sizeof(k_video_frame)); + pmsg->dpu_result.img_result.time_ref = dump_count; + pmsg->dpu_result.img_result.pts = rgb_buf[rgb_rp].v_frame.pts; + dataret = -1; + pmsg->temperature = g_cur_temperature; + dataret = send_dpu_data_to_little(rgb_dev, image_send_buf); + // printf("send depth and rgb: delta pts %6ld, time %6ld ms\n", delta, get_ticks()/27000); + if (dataret) + { + printf("send img error: %d\n", dataret); + } + while (!rgb_send_done) + { + callwriteNULLtoflushdpu(rgb_dev); + usleep(1000); + } + // printf("send rgb take time %6ld ms\n", (get_ticks()/27000-start_time)); + kd_mpi_dma_release_frame(1, &dma_get_info); + + release_image(); - send_image(depth_pts); + dump_count++; + if(dump_count % 30 == 0) + { + printf("dump_count %d, Average FrameRate = %ld Fps\n", dump_count, (dump_count*1000)/(get_ticks()/27000-dump_start_time)); + } + } } static void *dump_thread(void *arg) @@ -1082,9 +1340,9 @@ static void *dump_thread(void *arg) printf("%s\n", __FUNCTION__); k_s32 ret; - while(!exiting) + while (!exiting) { - if(dpu_bind == DPU_BIND) + if (dpu_bind == DPU_BIND) { dpu_bind_dump(); } @@ -1098,96 +1356,110 @@ static void *dump_thread(void *arg) return arg; } -static void *dump_image_thread(void *arg) +static void *dump_rgb_thread(void *arg) { printf("%s\n", __FUNCTION__); k_s32 ret; - while(!image_exiting) + while (!image_exiting) { - if(dpu_bind == DPU_UNBIND) - { - speckle_dump(); - } - - if(image_mode < IMAGE_MODE_NONE_SPECKLE) + if (image_mode < IMAGE_MODE_NONE_SPECKLE) { image_dump(); } + else + usleep(100000); } - while(rgb_wp != rgb_rp) + while (rgb_wp != rgb_rp) { - ret = kd_mpi_vicap_dump_release(rgb_dev, rgb_chn, &rgb_buf[rgb_rp]); - if (ret) { - printf("sample_vicap, dev(%d) chn(%d) dump frame failed.\n", rgb_dev, rgb_chn); - } - rgb_rp++; - rgb_rp %= VICAP_OUTPUT_BUF_NUM; + release_image(); } - while(speckle_wp != speckle_rp) + image_exiting = K_FALSE; + return arg; +} + +static void *dump_speckle_thread(void *arg) +{ + printf("%s\n", __FUNCTION__); + k_s32 ret; + + while (!speckle_exiting) { - ret = kd_mpi_vicap_dump_release(speckle_dev, speckle_chn, &speckle_buf[speckle_rp]); - if (ret) { - printf("sample_vicap, dev(%d) chn(%d) dump frame failed.\n", speckle_dev, speckle_chn); - } - speckle_rp++; - speckle_rp %= VICAP_OUTPUT_BUF_NUM; + if(dpu_bind == DPU_UNBIND) + speckle_dump(); + else + depth_dump(); } - image_exiting = K_FALSE; + while (speckle_wp != speckle_rp) + { + release_speckle(); + } + + while(depth_wp != depth_rp) + { + kd_mpi_dpu_release_frame(); + depth_rp++; + depth_rp %= VICAP_OUTPUT_BUF_NUM; + } + + speckle_exiting = K_FALSE; return arg; } static void *adc_thread(void *arg) { printf("%s\n", __FUNCTION__); - float temp = -300.0;//初始变量建议定义到正常范围之外,如果没有正常赋值,不会影响计算。 - float old_temp = -300.0; - // char input = 'a'; - while (!exiting) - { - if (!sample_adc(&temp)) - { - //printf("%f\n", temp - old_temp); - if (temp - old_temp > 5 || temp - old_temp < -5) - { - sample_dv_dpu_update_temp(temp); - old_temp = temp; - } - } + float temp = -300.0; // 初始变量建议定义到正常范围之外,如果没有正常赋值,不会影响计算。 + float old_temp = -300.0; + // char input = 'a'; + while (!exiting) + { + if (!sample_adc(&temp)) + { + // printf("%f\n", temp - old_temp); + if (temp - old_temp > 5 || temp - old_temp < -5) + { + sample_dv_dpu_update_temp(temp); + old_temp = temp; + } + } g_cur_temperature = temp; - fd_set rfds; - struct timeval tv; - int retval; + fd_set rfds; + struct timeval tv; + int retval; - FD_ZERO(&rfds); - FD_SET(0, &rfds); // 监视标准输入流 + FD_ZERO(&rfds); + FD_SET(0, &rfds); // 监视标准输入流 #if 0 tv.tv_sec = 1; // 设置等待时间为5秒 tv.tv_usec = 0; #else - tv.tv_sec = 0; // wait 500 ms - tv.tv_usec = 500*1000; + tv.tv_sec = 0; // wait 500 ms + tv.tv_usec = 500 * 1000; #endif - retval = select(1, &rfds, NULL, NULL, &tv); - if (retval == -1) { - perror("select()"); - } - else if (retval > 0) { - FD_ISSET(0, &rfds); - } - else { - // printf("Timeout reached\n"); - } - - //k_u32 display_ms = 1000;//get temperature per 1s - //usleep(1000 * display_ms); - } + retval = select(1, &rfds, NULL, NULL, &tv); + if (retval == -1) + { + perror("select()"); + } + else if (retval > 0) + { + FD_ISSET(0, &rfds); + } + else + { + // printf("Timeout reached\n"); + } + + // k_u32 display_ms = 1000;//get temperature per 1s + // usleep(1000 * display_ms); + } printf("adc exit\n"); return arg; @@ -1216,6 +1488,11 @@ static k_s32 sample_dv_bind() ret = kd_mpi_sys_bind(&dma_mpp_chn, &dpu_mpp_chn); VDD_CHECK_RET(ret, __func__, __LINE__); + dpu_mpp_chn.mod_id = K_ID_DPU; + dpu_mpp_chn.dev_id = 0; + dpu_mpp_chn.chn_id = 1; + ret = kd_mpi_sys_bind(&dma_mpp_chn, &dpu_mpp_chn); + VDD_CHECK_RET(ret, __func__, __LINE__); return ret; } @@ -1242,85 +1519,18 @@ static k_s32 sample_dv_unbind() ret = kd_mpi_sys_unbind(&dma_mpp_chn, &dpu_mpp_chn); VDD_CHECK_RET(ret, __func__, __LINE__); - return ret; -} - -static k_s32 sample_vvi_bind_dpu() -{ - k_s32 ret; - k_mpp_chn vvi_mpp_chn; - k_mpp_chn dpu_mpp_chn; - - vvi_mpp_chn.mod_id = K_ID_V_VI; - vvi_mpp_chn.dev_id = 0; - vvi_mpp_chn.chn_id = 0; dpu_mpp_chn.mod_id = K_ID_DPU; dpu_mpp_chn.dev_id = 0; dpu_mpp_chn.chn_id = 1; - ret = kd_mpi_sys_bind(&vvi_mpp_chn, &dpu_mpp_chn); - if (ret) { - printf("kd_mpi_sys_bind failed:0x:%x\n", ret); - return ret; - } - - return K_SUCCESS; -} - -static k_s32 sample_vvi_unbind_dpu() -{ - k_s32 ret; - k_mpp_chn vvi_mpp_chn; - k_mpp_chn dpu_mpp_chn; - - vvi_mpp_chn.mod_id = K_ID_V_VI; - vvi_mpp_chn.dev_id = 0; - vvi_mpp_chn.chn_id = 0; - dpu_mpp_chn.mod_id = K_ID_DPU; - dpu_mpp_chn.dev_id = 0; - dpu_mpp_chn.chn_id = 1; - ret = kd_mpi_sys_unbind(&vvi_mpp_chn, &dpu_mpp_chn); - if (ret) { - printf("kd_mpi_sys_bind failed:0x:%x\n", ret); - return ret; - } - - return K_SUCCESS; -} - -static k_s32 sample_vvi_prepare() -{ - k_vvi_dev_attr dev_attr; - k_vvi_chn_attr chn_attr; - - memset(&chn_attr, 0, sizeof(chn_attr)); - memset(&dev_attr, 0, sizeof(dev_attr)); - dev_attr.format = PIXEL_FORMAT_YUV_SEMIPLANAR_420; - dev_attr.height = height; - dev_attr.width = width; - chn_attr.frame_rate = 15; - chn_attr.format = PIXEL_FORMAT_YUV_SEMIPLANAR_420; - chn_attr.height = height; - chn_attr.width = width; - kd_mpi_vvi_set_dev_attr(0, &dev_attr); - - kd_mpi_vvi_start_pipe(0, 0); - - kd_mpi_vvi_chn_insert_pic(0, &ir_frame); - - return K_SUCCESS; -} + ret = kd_mpi_sys_unbind(&dma_mpp_chn, &dpu_mpp_chn); + VDD_CHECK_RET(ret, __func__, __LINE__); -static void sample_vvi_stop() -{ - kd_mpi_vvi_stop_pipe(0, 0); - return; + return ret; } k_s32 kd_mapi_dpu_init(k_dpu_info_t *init) { k_s32 ret = 0; - k_u8 dev_count = 0, cur_dev = 0; - k_u8 chn_count = 0, cur_chn = 0; ir_frame.v_frame.phys_addr[0] = init->ir_phys_addr; adc_en = init->adc_en; @@ -1337,41 +1547,48 @@ k_s32 kd_mapi_dpu_init(k_dpu_info_t *init) dpu_bind = init->dpu_bind; memcpy(&temperature, &init->temperature, sizeof(k_dpu_temperature_t)); - ir_buf_size = ((width * height *3/2 + 0x3ff) & ~0x3ff); + ir_buf_size = ((width * height * 3 / 2 + 0x3ff) & ~0x3ff); ir_frame.v_frame.virt_addr[0] = (k_u64)kd_mpi_sys_mmap_cached(ir_frame.v_frame.phys_addr[0], ir_buf_size); if (ir_frame.v_frame.virt_addr[0] == 0) { - printf("%s mmap error\n", __func__); + printf("%s>mmap error\n", __func__); return -1; } - printf("%s>adc_en %d, dpu_bind %d, image_mode %d, delay_ms %d\n", __FUNCTION__, adc_en, dpu_bind, image_mode, init->delay_ms); - if(dpu_bind == DPU_BIND) { - sample_vvi_bind_dpu(); + if((image_mode != IMAGE_MODE_RGB_DEPTH) && (image_mode != IMAGE_MODE_NONE_DEPTH)) + { + printf("%s>dpu_bind mode error: image_mode %d\n", __func__, image_mode); + return -1; + } + } + + printf("rgb_dev %d, rgb_chn %d, speckle_dev %d, speckle_chn %d\n", rgb_dev, rgb_chn, speckle_dev, speckle_chn); + printf("adc_en %d, dpu_bind %d, image_mode %d, delay_ms %d\n", adc_en, dpu_bind, image_mode, init->delay_ms); + printf("dpu_buf_cnt %d, dma_buf_cnt %d\n", dpu_buf_cnt, dma_buf_cnt); + + if (dpu_bind == DPU_BIND) + { sample_dv_bind(); } ret = sample_dv_dpu_init(); - if (ret) { + if (ret) + { printf("sample_dv_dpu_init failed\n"); return -1; } printf("sample_dv_dpu_init ok\n"); ret = sample_dv_dma_init(); - if (ret) { + if (ret) + { printf("sample_dma_init failed\n"); return -1; } printf("sample_dma_init ok\n"); - if(dpu_bind == DPU_BIND) - { - sample_vvi_prepare(); - } - return K_SUCCESS; } @@ -1382,15 +1599,16 @@ k_s32 kd_mapi_dpu_start_grab() kd_mpi_vicap_set_dump_reserved(rgb_dev, rgb_chn, K_TRUE); kd_mpi_vicap_set_dump_reserved(speckle_dev, speckle_chn, K_TRUE); + pthread_create(&image_tid, NULL, dump_rgb_thread, NULL); + pthread_create(&speckle_tid, NULL, dump_speckle_thread, NULL); pthread_create(&output_tid, NULL, dump_thread, NULL); - pthread_create(&image_tid, NULL, dump_image_thread, NULL); - // struct sched_param param; // param.sched_priority = 3; // pthread_setschedparam(image_tid, SCHED_FIFO, ¶m); - if(adc_en){ + if (adc_en) + { pthread_create(&adc_tid, NULL, adc_thread, NULL); } @@ -1404,9 +1622,9 @@ k_s32 kd_mapi_dpu_stop_grab() exiting = K_TRUE; image_exiting = K_TRUE; - if(output_tid) + if (output_tid) { - while(exiting) + while (exiting) { usleep(10000); } @@ -1414,9 +1632,9 @@ k_s32 kd_mapi_dpu_stop_grab() pthread_join(output_tid, NULL); } - if(image_tid) + if (image_tid) { - while(image_exiting) + while (image_exiting) { usleep(10000); } @@ -1424,7 +1642,17 @@ k_s32 kd_mapi_dpu_stop_grab() pthread_join(image_tid, NULL); } - if(adc_tid) + if (speckle_tid) + { + while (speckle_exiting) + { + usleep(10000); + } + pthread_cancel(speckle_tid); + pthread_join(speckle_tid, NULL); + } + + if (adc_tid) { pthread_cancel(adc_tid); pthread_join(adc_tid, NULL); @@ -1438,24 +1666,24 @@ k_s32 kd_mapi_dpu_close() int ret = 0; ret = sample_dv_dma_delete(); - if (ret) { + if (ret) + { printf("sample_dma_delete failed\n"); return 0; } ret = sample_dv_dpu_delete(); - if (ret) { + if (ret) + { printf("sample_dpu_delete failed\n"); return 0; } - kd_mpi_sys_munmap((void*)ir_frame.v_frame.virt_addr[0], ir_buf_size); + kd_mpi_sys_munmap((void *)ir_frame.v_frame.virt_addr[0], ir_buf_size); - if(dpu_bind == DPU_BIND) + if (dpu_bind == DPU_BIND) { - sample_vvi_stop(); sample_dv_unbind(); - sample_vvi_unbind_dpu(); } return K_SUCCESS; @@ -1492,4 +1720,3 @@ k_s32 kd_mapi_dpu_unregistercallback(k_u32 dev_num, kd_dpu_callback_s *pst_dpu_c return K_SUCCESS; } - diff --git a/src/common/cdk/user/mapi/mediaserver/venc/mapi_venc_server.c b/src/common/cdk/user/mapi/mediaserver/venc/mapi_venc_server.c index 219e50b72..a9dfd3c07 100755 --- a/src/common/cdk/user/mapi/mediaserver/venc/mapi_venc_server.c +++ b/src/common/cdk/user/mapi/mediaserver/venc/mapi_venc_server.c @@ -521,24 +521,24 @@ k_s32 kd_mapi_venc_request_idr(k_s32 chn_num) k_s32 kd_mapi_nonai_2d_init(k_u32 chn_num, k_nonai_2d_chn_attr *attr) { - printf("%s\n", __FUNCTION__); + printf("%s>ch %d\n", __FUNCTION__, chn_num); return kd_mpi_nonai_2d_create_chn(chn_num, attr); } k_s32 kd_mapi_nonai_2d_deinit(k_u32 chn_num) { - printf("%s\n", __FUNCTION__); + printf("%s>ch %d\n", __FUNCTION__, chn_num); return kd_mpi_nonai_2d_destroy_chn(chn_num); } k_s32 kd_mapi_nonai_2d_start(k_u32 chn_num) { - printf("%s\n", __FUNCTION__); + printf("%s>ch %d\n", __FUNCTION__, chn_num); return kd_mpi_nonai_2d_start_chn(chn_num); } k_s32 kd_mapi_nonai_2d_stop(k_u32 chn_num) { - printf("%s\n", __FUNCTION__); + printf("%s>ch %d\n", __FUNCTION__, chn_num); return kd_mpi_nonai_2d_stop_chn(chn_num); } diff --git a/src/common/cdk/user/mapi/sample/sample_dpu_uvc/sample_dpu.c b/src/common/cdk/user/mapi/sample/sample_dpu_uvc/sample_dpu.c index 549b7d87a..c07962440 100755 --- a/src/common/cdk/user/mapi/sample/sample_dpu_uvc/sample_dpu.c +++ b/src/common/cdk/user/mapi/sample/sample_dpu_uvc/sample_dpu.c @@ -66,8 +66,8 @@ pthread_t dpu_startup_tid; #define MAX_DEV_CNT 2 #define VICAP_OUTPUT_BUF_NUM 15 -#define VICAP_INPUT_BUF_NUM 6 -#define DPU_BUF_NUM 6 +#define VICAP_INPUT_BUF_NUM 4 +#define DPU_BUF_NUM 10 #define DMA_BUF_NUM 3 #define VICAP_WIDTH 1280 @@ -102,8 +102,8 @@ static k_s32 g_mmap_fd_tmp = 0; static k_vb_blk_handle ir_handle; static k_u64 ir_phys_addr; static k_u8 *ir_virt_addr; -static k_u32 vicap_width; -static k_u32 vicap_height; +static k_u32 vicap_width = VICAP_WIDTH; +static k_u32 vicap_height = VICAP_HEIGHT; static k_u32 ir_buf_size; extern char g_out_path[]; @@ -206,6 +206,7 @@ typedef enum static unsigned long long g_sync_clock_server_timestamp = 0; static unsigned long long g_sync_clock_client_timestamp = 0; +static unsigned long long g_rev_first_frame_systime = 0; static FRAME_SYNC_CLOCK_INFO g_frame_sync_clock_info[em_sync_clock_max]; typedef struct { @@ -285,7 +286,11 @@ static unsigned long long _do_sync_frame_timestamp(SYNC_CLOCK_FRAME_TYPE frame_ if(1) { //以k230时钟计算,从同步时间戳时刻算起,到当前共运行时间微妙 - unsigned long long take_time_from_sync = get_system_time_microsecond()-g_sync_clock_client_timestamp; + if (g_rev_first_frame_systime == 0) + { + g_rev_first_frame_systime = get_system_time_microsecond(); + } + unsigned long long take_time_from_sync = /*get_system_time_microsecond()*/g_rev_first_frame_systime-g_sync_clock_client_timestamp; //printf("=========take sync time:%llu\n",take_time_from_sync); g_frame_sync_clock_info[frame_type].start_server_timestamp = g_sync_clock_server_timestamp + take_time_from_sync; @@ -305,6 +310,7 @@ int do_dpu_ctrol_cmd(UVC_TRANSFER_CONTROL_CMD cmd_ctrl) { if(cmd_ctrl.type == em_uvc_transfer_control_sync_clock) { + g_rev_first_frame_systime = 0; g_sync_clock_client_timestamp = get_system_time_microsecond(); g_sync_clock_server_timestamp = cmd_ctrl.ctrl_info.sync_clock; printf("recv pc sync clock %llu,cur clock:%llu,differ(%lld)\n",g_sync_clock_server_timestamp,g_sync_clock_client_timestamp,g_sync_clock_server_timestamp-g_sync_clock_client_timestamp); @@ -458,20 +464,20 @@ static k_s32 sample_dpu_vicap_vb_init(vicap_device_obj *dev_obj) /* dma vb init */ config->comm_pool[k].blk_cnt = DMA_BUF_NUM; - config->comm_pool[k].blk_size = VICAP_WIDTH * VICAP_HEIGHT; + config->comm_pool[k].blk_size = VICAP_ALIGN_UP((vicap_width * vicap_height * 3 / 2), 0x1000); config->comm_pool[k].mode = VB_REMAP_MODE_NOCACHE; config->comm_pool[k+1].blk_cnt = DMA_BUF_NUM; - config->comm_pool[k+1].blk_size = VICAP_WIDTH * VICAP_HEIGHT * 3; + config->comm_pool[k+1].blk_size = VICAP_ALIGN_UP((vicap_width * vicap_height * 3 / 2), 0x1000); config->comm_pool[k+1].mode = VB_REMAP_MODE_NOCACHE; /* dpu vb init */ config->comm_pool[k+2].blk_cnt = DPU_BUF_NUM; - config->comm_pool[k+2].blk_size = 5 * 1024 * 1024; + config->comm_pool[k+2].blk_size = 3 * 1024 * 1024; config->comm_pool[k+2].mode = VB_REMAP_MODE_NOCACHE; //ir - ir_buf_size = ((vicap_width * vicap_height *3/2 + 0x3ff) & ~0x3ff); + ir_buf_size = VICAP_ALIGN_UP((vicap_width * vicap_height * 3 / 2), 0x1000); config->comm_pool[k+3].blk_cnt = 1; config->comm_pool[k+3].blk_size = ir_buf_size; config->comm_pool[k+3].mode = VB_REMAP_MODE_NOCACHE; @@ -529,6 +535,11 @@ static k_s32 sample_dpu_get_sensor_info(vicap_device_obj *dev_obj) memset(&dev_attr_info, 0, sizeof(k_vicap_dev_set_info)); dev_attr_info.dw_en = dev_obj[dev_num].dw_enable; dev_attr_info.pipe_ctrl.data = 0xFFFFFFFF; + dev_attr_info.pipe_ctrl.bits.af_enable = 0; + dev_attr_info.pipe_ctrl.bits.ae_enable = K_TRUE; + dev_attr_info.pipe_ctrl.bits.awb_enable = K_TRUE; + dev_attr_info.pipe_ctrl.bits.dnr3_enable = K_FALSE; + dev_attr_info.pipe_ctrl.bits.ahdr_enable = K_FALSE; dev_attr_info.sensor_type = dev_obj[dev_num].sensor_type; dev_attr_info.vicap_dev = (k_vicap_dev)dev_num; dev_attr_info.mode = dev_obj[dev_num].mode; @@ -694,7 +705,7 @@ static k_s32 sample_dpu_vicap_init(vicap_device_obj *dev_obj) chn_attr_info.crop_v_start = 0; chn_attr_info.out_height = VICAP_HEIGHT; chn_attr_info.out_width = VICAP_WIDTH; - chn_attr_info.buffer_num = 6; + chn_attr_info.buffer_num = VICAP_OUTPUT_BUF_NUM; chn_attr_info.pixel_format = dev_obj[dev_num].out_format[chn_num]; chn_attr_info.vicap_dev = dev_obj[dev_num].dev_num; chn_attr_info.vicap_chn = (k_vicap_chn)dev_obj[dev_num].chn_num[chn_num]; @@ -1055,9 +1066,6 @@ static k_s32 parse_pramas(vicap_init_info_t *init, vicap_device_obj *device_obj) device_obj[i].mode = VICAP_WORK_OFFLINE_MODE; device_obj[i].dev_num = i; device_obj[i].dev_enable = K_TRUE; - device_obj[i].ae_enable = K_TRUE;//default enable ae - device_obj[i].awb_enable = K_TRUE;//default enable awb - device_obj[i].dnr3_enable = K_FALSE;//default disable 3ndr device_obj[i].sensor_type = init->sensor_type[i];//OV_OV9732_MIPI_1280X720_30FPS_10BIT_LINEAR; @@ -1145,16 +1153,16 @@ static k_s32 sample_dpu_startup(void) g_dpu_info.ir_phys_addr = ir_phys_addr; g_dpu_info.dev_cnt = 2; g_dpu_info.rgb_dev = 0; - g_dpu_info.rgb_chn = 1; + g_dpu_info.rgb_chn = g_vicap_init.chn_num[0]; g_dpu_info.speckle_dev = 1; - g_dpu_info.speckle_chn = 0; + g_dpu_info.speckle_chn = g_vicap_init.chn_num[1]; g_dpu_info.dpu_bind = DPU_UNBIND; //g_dpu_info.width = VICAP_WIDTH; //g_dpu_info.height = VICAP_HEIGHT; g_dpu_info.width = g_grab_init_param.camera_width; g_dpu_info.height = g_grab_init_param.camera_height; g_dpu_info.dpu_buf_cnt = DPU_BUF_NUM; - g_dpu_info.dma_buf_cnt = DPU_BUF_NUM; + g_dpu_info.dma_buf_cnt = DMA_BUF_NUM; /*g_dpu_info.adc_en = K_TRUE; g_dpu_info.temperature.ref = 36.289; g_dpu_info.temperature.cx = 640; diff --git a/src/common/cdk/user/mapi/sample/sample_venc/sample_venc.c b/src/common/cdk/user/mapi/sample/sample_venc/sample_venc.c index 74ed1b535..8c8ef58e1 100755 --- a/src/common/cdk/user/mapi/sample/sample_venc/sample_venc.c +++ b/src/common/cdk/user/mapi/sample/sample_venc/sample_venc.c @@ -346,7 +346,7 @@ int main(int argc, char *argv[]) { vi_chn_attr_info.chn_en = K_TRUE; vi_chn_attr_info.crop_h_start = 0; vi_chn_attr_info.crop_v_start = 0; - vi_chn_attr_info.out_width = pic_width[vichn_idx]; + vi_chn_attr_info.out_width = VI_ALIGN_UP(pic_width[vichn_idx],16); vi_chn_attr_info.out_height = pic_height[vichn_idx]; vi_chn_attr_info.pixel_format = PIXEL_FORMAT_YUV_SEMIPLANAR_420; vi_chn_attr_info.vicap_dev = VICAP_DEV_ID_0; @@ -354,7 +354,7 @@ int main(int argc, char *argv[]) { vi_chn_attr_info.buffer_num = 6; vi_chn_attr_info.alignment = 12; if (!dev_attr_info.dw_en) - vi_chn_attr_info.buf_size = VI_ALIGN_UP(pic_width[vichn_idx] * pic_height[vichn_idx] * 3 / 2, 0x400); + vi_chn_attr_info.buf_size = VI_ALIGN_UP(VI_ALIGN_UP(pic_width[vichn_idx],16) * pic_height[vichn_idx] * 3 / 2, 0x400); else vi_chn_attr_info.buf_size = VI_ALIGN_UP(sensor_info.width * sensor_info.height * 3 / 2, 0x400); ret = kd_mapi_vicap_set_chn_attr(vi_chn_attr_info); diff --git a/src/common/cdk/user/out/little/t_server_c-6.1.0 b/src/common/cdk/user/out/little/t_server_c-6.1.0 index 3bcf4f41a..7331ec696 100755 Binary files a/src/common/cdk/user/out/little/t_server_c-6.1.0 and b/src/common/cdk/user/out/little/t_server_c-6.1.0 differ diff --git a/src/common/cdk/user/samples/backchannel_client/vo_cfg.cpp b/src/common/cdk/user/samples/backchannel_client/vo_cfg.cpp index 05b8a04d0..6b9de6b2b 100644 --- a/src/common/cdk/user/samples/backchannel_client/vo_cfg.cpp +++ b/src/common/cdk/user/samples/backchannel_client/vo_cfg.cpp @@ -217,7 +217,7 @@ void vo_layer_init(k_u32 width,k_u32 height) memset(&info, 0, sizeof(info)); // config layer - if (width > 1080 && g_connector_type == HX8377_V2_MIPI_4LAN_1080X1920_30FPS) + if (width > 1088 && g_connector_type == HX8377_V2_MIPI_4LAN_1080X1920_30FPS) { info.act_size.width = height; info.act_size.height = width; diff --git a/src/common/cdk/user/samples/rtsp_demo/src/streaming_player.cpp b/src/common/cdk/user/samples/rtsp_demo/src/streaming_player.cpp index 63529bc84..f054ddbac 100644 --- a/src/common/cdk/user/samples/rtsp_demo/src/streaming_player.cpp +++ b/src/common/cdk/user/samples/rtsp_demo/src/streaming_player.cpp @@ -225,7 +225,7 @@ int StreamingPlayer::CreateVideoEncode(const SessionAttr &session_attr) { chn_attr.rc_attr.rc_mode = K_VENC_RC_MODE_CBR; chn_attr.rc_attr.cbr.src_frame_rate = 30; chn_attr.rc_attr.cbr.dst_frame_rate = 30; - if (sensor_type_ == OV_OV9286_MIPI_1280X720_30FPS_10BIT_LINEAR_IR || + if (sensor_type_ == OV_OV9286_MIPI_1280X720_30FPS_10BIT_LINEAR_IR || sensor_type_ == OV_OV9286_MIPI_1280X720_30FPS_10BIT_LINEAR_SPECKLE) { chn_attr.rc_attr.cbr.src_frame_rate = 15; chn_attr.rc_attr.cbr.dst_frame_rate = 15; @@ -285,7 +285,7 @@ int StreamingPlayer::CreateVideoEncode(const SessionAttr &session_attr) { vi_chn_attr_info.chn_en = K_TRUE; vi_chn_attr_info.crop_h_start = 0; vi_chn_attr_info.crop_v_start = 0; - vi_chn_attr_info.out_width = session_attr.video_width; + vi_chn_attr_info.out_width = VI_ALIGN_UP(session_attr.video_width,16); vi_chn_attr_info.out_height = session_attr.video_height; vi_chn_attr_info.pixel_format = PIXEL_FORMAT_YUV_SEMIPLANAR_420; vi_chn_attr_info.vicap_dev = VICAP_DEV_ID_0; @@ -293,9 +293,9 @@ int StreamingPlayer::CreateVideoEncode(const SessionAttr &session_attr) { vi_chn_attr_info.alignment = 12; vi_chn_attr_info.buffer_num = 6; if (!dev_attr_info_.dw_en) - vi_chn_attr_info.buf_size = VI_ALIGN_UP(session_attr.video_width * session_attr.video_height * 3 / 2, 0x400); + vi_chn_attr_info.buf_size = VI_ALIGN_UP(VI_ALIGN_UP(session_attr.video_width,16) * session_attr.video_height * 3 / 2, 0x400); else - vi_chn_attr_info.buf_size = VI_ALIGN_UP(sensor_info.width * sensor_info.height * 3 / 2, 0x400); + vi_chn_attr_info.buf_size = VI_ALIGN_UP(VI_ALIGN_UP(sensor_info.width,16) * sensor_info.height * 3 / 2, 0x400); ret = kd_mapi_vicap_set_chn_attr(vi_chn_attr_info); if (ret != K_SUCCESS) { printf("vicap chn %d set attr failed, %x.\n", session_attr.session_idx, ret); diff --git a/src/common/cdk/user/samples/rtsp_server/media.cpp b/src/common/cdk/user/samples/rtsp_server/media.cpp index cf39364b0..6dff18e0d 100644 --- a/src/common/cdk/user/samples/rtsp_server/media.cpp +++ b/src/common/cdk/user/samples/rtsp_server/media.cpp @@ -364,7 +364,7 @@ int KdMedia::CreateVcapVEnc(IOnVEncData *on_venc_data) { chn_attr.rc_attr.rc_mode = K_VENC_RC_MODE_CBR; chn_attr.rc_attr.cbr.src_frame_rate = 30; chn_attr.rc_attr.cbr.dst_frame_rate = 30; - if (config_.sensor_type == OV_OV9286_MIPI_1280X720_30FPS_10BIT_LINEAR_IR || + if (config_.sensor_type == OV_OV9286_MIPI_1280X720_30FPS_10BIT_LINEAR_IR || config_.sensor_type == OV_OV9286_MIPI_1280X720_30FPS_10BIT_LINEAR_SPECKLE) { chn_attr.rc_attr.cbr.src_frame_rate = 15; chn_attr.rc_attr.cbr.dst_frame_rate = 15; @@ -425,16 +425,16 @@ int KdMedia::CreateVcapVEnc(IOnVEncData *on_venc_data) { vi_chn_attr_info.chn_en = K_TRUE; vi_chn_attr_info.crop_h_start = 0; vi_chn_attr_info.crop_v_start = 0; - vi_chn_attr_info.out_width = config_.venc_width; + vi_chn_attr_info.out_width = VI_ALIGN_UP(config_.venc_width,16); vi_chn_attr_info.out_height = config_.venc_height; vi_chn_attr_info.pixel_format = PIXEL_FORMAT_YUV_SEMIPLANAR_420; vi_chn_attr_info.vicap_dev = VICAP_DEV_ID_0; vi_chn_attr_info.buffer_num = 6; vi_chn_attr_info.vicap_chn = (k_vicap_chn)venc_chn_id; if (!vcap_dev_info_.dw_en) - vi_chn_attr_info.buf_size = VI_ALIGN_UP(config_.venc_width * config_.venc_height * 3 / 2, 0x400); + vi_chn_attr_info.buf_size = VI_ALIGN_UP(VI_ALIGN_UP(config_.venc_width,16) * config_.venc_height * 3 / 2, 0x100); else - vi_chn_attr_info.buf_size = VI_ALIGN_UP(config_.venc_width * config_.venc_height * 3 / 2, 0x400); + vi_chn_attr_info.buf_size = VI_ALIGN_UP(VI_ALIGN_UP(config_.venc_width,16) * config_.venc_height * 3 / 2, 0x400); ret = kd_mapi_vicap_set_chn_attr(vi_chn_attr_info); if (ret != K_SUCCESS) { printf("vicap chn %d set attr failed, %x.\n", venc_chn_id, ret); diff --git a/src/common/cdk/user/thirdparty/live/liveMedia/GenericMediaServer.cpp b/src/common/cdk/user/thirdparty/live/liveMedia/GenericMediaServer.cpp index 6ca5a58ca..03256b774 100644 --- a/src/common/cdk/user/thirdparty/live/liveMedia/GenericMediaServer.cpp +++ b/src/common/cdk/user/thirdparty/live/liveMedia/GenericMediaServer.cpp @@ -29,12 +29,12 @@ along with this library; if not, write to the Free Software Foundation, Inc., void GenericMediaServer::addServerMediaSession(ServerMediaSession* serverMediaSession) { if (serverMediaSession == NULL) return; - + char const* sessionName = serverMediaSession->streamName(); if (sessionName == NULL) sessionName = ""; removeServerMediaSession(sessionName); // in case an existing "ServerMediaSession" with this name already exists - + fServerMediaSessions->Add(sessionName, (void*)serverMediaSession); } @@ -66,7 +66,7 @@ ::lookupServerMediaSession(char const* streamName, struct lsmsMemberFunctionRecord* memberFunctionRecord = new struct lsmsMemberFunctionRecord; memberFunctionRecord->fServer = this; memberFunctionRecord->fMemberFunc = memberFunc; - + GenericMediaServer ::lookupServerMediaSession(streamName, lsmsMemberFunctionCompletionFunc, memberFunctionRecord); @@ -74,7 +74,7 @@ ::lookupServerMediaSession(char const* streamName, void GenericMediaServer::removeServerMediaSession(ServerMediaSession* serverMediaSession) { if (serverMediaSession == NULL) return; - + fServerMediaSessions->Remove(serverMediaSession->streamName()); if (serverMediaSession->referenceCount() == 0) { Medium::close(serverMediaSession); @@ -89,7 +89,7 @@ void GenericMediaServer::removeServerMediaSession(char const* streamName) { void GenericMediaServer::closeAllClientSessionsForServerMediaSession(ServerMediaSession* serverMediaSession) { if (serverMediaSession == NULL) return; - + HashTable::Iterator* iter = HashTable::Iterator::create(*fClientSessions); GenericMediaServer::ClientSession* clientSession; char const* key; // dummy @@ -108,7 +108,7 @@ void GenericMediaServer::closeAllClientSessionsForServerMediaSession(char const* void GenericMediaServer::deleteServerMediaSession(ServerMediaSession* serverMediaSession) { if (serverMediaSession == NULL) return; - + closeAllClientSessionsForServerMediaSession(serverMediaSession); removeServerMediaSession(serverMediaSession); } @@ -130,7 +130,7 @@ ::GenericMediaServer(UsageEnvironment& env, int ourSocketIPv4, int ourSocketIPv6 fTLSCertificateFileName(NULL), fTLSPrivateKeyFileName(NULL) { ignoreSigPipeOnSocket(fServerSocketIPv4); // so that clients on the same host that are killed don't also kill us ignoreSigPipeOnSocket(fServerSocketIPv6); // ditto - + // Arrange to handle connections from others: env.taskScheduler().turnOnBackgroundReadHandling(fServerSocketIPv4, incomingConnectionHandlerIPv4, this); env.taskScheduler().turnOnBackgroundReadHandling(fServerSocketIPv6, incomingConnectionHandlerIPv6, this); @@ -159,14 +159,14 @@ void GenericMediaServer::cleanup() { delete clientSession; } delete fClientSessions; - + // Close all client connection objects: GenericMediaServer::ClientConnection* connection; while ((connection = (GenericMediaServer::ClientConnection*)fClientConnections->getFirst()) != NULL) { delete connection; } delete fClientConnections; - + // Delete all server media sessions ServerMediaSession* serverMediaSession; while ((serverMediaSession = (ServerMediaSession*)fServerMediaSessions->getFirst()) != NULL) { @@ -179,7 +179,7 @@ void GenericMediaServer::cleanup() { int GenericMediaServer::setUpOurSocket(UsageEnvironment& env, Port& ourPort, int domain) { int ourSocket = -1; - + do { // The following statement is enabled by default. // Don't disable it (by defining ALLOW_SERVER_PORT_REUSE) unless you know what you're doing. @@ -187,28 +187,28 @@ int GenericMediaServer::setUpOurSocket(UsageEnvironment& env, Port& ourPort, int // ALLOW_RTSP_SERVER_PORT_REUSE is for backwards-compatibility ##### NoReuse dummy(env); // Don't use this socket if there's already a local server using it #endif - + ourSocket = setupStreamSocket(env, ourPort, domain, True, True); // later fix to support IPv6 if (ourSocket < 0) break; - + // Make sure we have a big send buffer: if (!increaseSendBufferTo(env, ourSocket, 50*1024)) break; - + // Allow multiple simultaneous connections: if (listen(ourSocket, LISTEN_BACKLOG_SIZE) < 0) { env.setResultErrMsg("listen() failed: "); break; } - + if (ourPort.num() == 0) { // bind() will have chosen a port for us; return it also: if (!getSourcePort(env, ourSocket, domain, ourPort)) break; } - + return ourSocket; } while (0); - + if (ourSocket != -1) ::closeSocket(ourSocket); return -1; } @@ -228,6 +228,19 @@ void GenericMediaServer::incomingConnectionHandlerIPv6() { incomingConnectionHandlerOnSocket(fServerSocketIPv6); } +static int setNoTimeWait(UsageEnvironment& env,int socket) +{ + struct linger so_linger; + so_linger.l_onoff = 1; + so_linger.l_linger = 0; + if (setsockopt(socket,SOL_SOCKET,SO_LINGER,&so_linger,sizeof(so_linger)) <0) + { + //envir().setResultErrMsg("failed to set SO_LINGER: "); + return -1; + } + return 0; +} + void GenericMediaServer::incomingConnectionHandlerOnSocket(int serverSocket) { struct sockaddr_storage clientAddr; SOCKLEN_T clientAddrLen = sizeof clientAddr; @@ -242,11 +255,12 @@ void GenericMediaServer::incomingConnectionHandlerOnSocket(int serverSocket) { ignoreSigPipeOnSocket(clientSocket); // so that clients on the same host that are killed don't also kill us makeSocketNonBlocking(clientSocket); increaseSendBufferTo(envir(), clientSocket, 50*1024); - + setNoTimeWait(envir(),clientSocket); + #ifdef DEBUG envir() << "accept()ed connection from " << AddressString(clientAddr).val() << "\n"; #endif - + // Create a new object for handling this connection: (void)createNewClientConnection(clientSocket, clientAddr); } @@ -269,7 +283,7 @@ ::ClientConnection(GenericMediaServer& ourServer, // Add ourself to our 'client connections' table: fOurServer.fClientConnections->Add((char const*)this, this); - + if (useTLS) { // Perform extra processing to handle a TLS connection: fTLS.setCertificateAndPrivateKeyFileNames(ourServer.fTLSCertificateFileName, @@ -288,7 +302,7 @@ ::ClientConnection(GenericMediaServer& ourServer, GenericMediaServer::ClientConnection::~ClientConnection() { // Remove ourself from the server's 'client connections' hash table before we go: fOurServer.fClientConnections->Remove((char const*)this); - + closeSockets(); } @@ -318,7 +332,7 @@ void GenericMediaServer::ClientConnection::incomingRequestHandler() { bytesRead = fInputTLS->read(&fRequestBuffer[fRequestBytesAlreadySeen], fRequestBufferBytesLeft); } else { struct sockaddr_storage dummy; // 'from' address, meaningless in this case - + bytesRead = readSocket(envir(), fOurSocket, &fRequestBuffer[fRequestBytesAlreadySeen], fRequestBufferBytesLeft, dummy); } handleRequestBytes(bytesRead); @@ -347,7 +361,7 @@ GenericMediaServer::ClientSession::~ClientSession() { char sessionIdStr[8+1]; sprintf(sessionIdStr, "%08X", fOurSessionId); fOurServer.fClientSessions->Remove(sessionIdStr); - + if (fOurServerMediaSession != NULL) { fOurServerMediaSession->decrementReferenceCount(); if (fOurServerMediaSession->referenceCount() == 0 @@ -459,7 +473,7 @@ UserAuthenticationDatabase::UserAuthenticationDatabase(char const* realm, UserAuthenticationDatabase::~UserAuthenticationDatabase() { delete[] fRealm; - + // Delete the allocated 'password' strings that we stored in the table, and then the table itself: char* password; while ((password = (char*)fTable->RemoveNext()) != NULL) { diff --git a/src/common/opensbi/Makefile b/src/common/opensbi/Makefile index 76b266f0f..dffa0702b 100644 --- a/src/common/opensbi/Makefile +++ b/src/common/opensbi/Makefile @@ -156,8 +156,14 @@ ifndef PLATFORM_RISCV_ABI endif endif ifndef PLATFORM_RISCV_ISA - ifneq ($(PLATFORM_RISCV_TOOLCHAIN_DEFAULT), 1) - PLATFORM_RISCV_ISA = rv$(PLATFORM_RISCV_XLEN)imafdc + ifneq ($(PLATFORM_RISCV_TOOLCHAIN_DEFAULT), 1) + # Check whether the assembler and the compiler support the Zicsr and Zifencei extensions + CC_SUPPORT_ZICSR_ZIFENCEI := $(shell $(CC) $(CLANG_TARGET) $(RELAX_FLAG) -nostdlib -march=rv$(OPENSBI_CC_XLEN)imafd_zicsr_zifencei -x c /dev/null -o /dev/null 2>&1 | grep "zicsr\|zifencei" > /dev/null && echo n || echo y) + ifeq ($(CC_SUPPORT_ZICSR_ZIFENCEI), y) + PLATFORM_RISCV_ISA = rv$(PLATFORM_RISCV_XLEN)imafdc_zicsr_zifencei + else + PLATFORM_RISCV_ISA = rv$(PLATFORM_RISCV_XLEN)imafdc + endif else PLATFORM_RISCV_ISA = $(OPENSBI_CC_ISA) endif diff --git a/src/common/opensbi/lib/utils/reset/fdt_reset_thead.c b/src/common/opensbi/lib/utils/reset/fdt_reset_thead.c index 95f8c369c..805067859 100644 --- a/src/common/opensbi/lib/utils/reset/fdt_reset_thead.c +++ b/src/common/opensbi/lib/utils/reset/fdt_reset_thead.c @@ -62,7 +62,7 @@ static int thead_reset_init(void *fdt, int nodeoff, void *p; const fdt64_t *val; const fdt32_t *val_w; - int len, i, cnt; + int len, i, cnt=0; u32 t, tmp = 0; /* Prepare clone csrs */ diff --git a/src/little/buildroot-ext/Config.in b/src/little/buildroot-ext/Config.in index 51f07cef9..4aa62e8fb 100644 --- a/src/little/buildroot-ext/Config.in +++ b/src/little/buildroot-ext/Config.in @@ -19,3 +19,4 @@ source "$BR2_EXTERNAL_K230_PATH/package/ota/Config.in" source "$BR2_EXTERNAL_K230_PATH/package/crypto_test/Config.in" source "$BR2_EXTERNAL_K230_PATH/package/k230_timer/Config.in" source "$BR2_EXTERNAL_K230_PATH/package/ws2812/Config.in" +source "$BR2_EXTERNAL_K230_PATH/package/mvx_player/Config.in" diff --git a/src/little/buildroot-ext/configs/k230_evb_defconfig b/src/little/buildroot-ext/configs/k230_evb_defconfig index 43d88b85e..0bc05094a 100644 --- a/src/little/buildroot-ext/configs/k230_evb_defconfig +++ b/src/little/buildroot-ext/configs/k230_evb_defconfig @@ -18,7 +18,6 @@ BR2_TOOLCHAIN_EXTERNAL_CXX=y BR2_PACKAGE_HOST_GDB=y BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_MDEV=y BR2_ROOTFS_DEVICE_TABLE="$(TOPDIR)/../board/canaan/k230/device_table.txt" -BR2_ROOTFS_POST_IMAGE_SCRIPT="$(TOPDIR)/../board/canaan/k230/post-image.sh" BR2_PACKAGE_BUSYBOX_CONFIG_FRAGMENT_FILES="$(TOPDIR)/../board/canaan/k230/defconfigs/busybox-riscv.fragment" BR2_PACKAGE_BUSYBOX_SHOW_OTHERS=y BR2_PACKAGE_FIO=y @@ -87,3 +86,5 @@ BR2_PACKAGE_LVGL=y BR2_PACKAGE_TOUCH_EMU=y BR2_PACKAGE_CRYPTO_TEST=y BR2_PACKAGE_K230_TIMER=y +BR2_PACKAGE_MVX_PLAYER=y +BR2_PACKAGE_EVTEST=y \ No newline at end of file diff --git a/src/little/buildroot-ext/package/mvx_player/Config.in b/src/little/buildroot-ext/package/mvx_player/Config.in new file mode 100755 index 000000000..82c850b36 --- /dev/null +++ b/src/little/buildroot-ext/package/mvx_player/Config.in @@ -0,0 +1,5 @@ + +config BR2_PACKAGE_MVX_PLAYER + bool "mvx player" + help + k230 vpu demo diff --git a/src/little/buildroot-ext/package/mvx_player/mvx_player.mk b/src/little/buildroot-ext/package/mvx_player/mvx_player.mk new file mode 100755 index 000000000..15fd562ed --- /dev/null +++ b/src/little/buildroot-ext/package/mvx_player/mvx_player.mk @@ -0,0 +1,27 @@ +################################################################################ +# +# mvx_player +# +################################################################################ +MVX_PLAYER_LOCAL_PATH:= $(realpath $(dir $(lastword $(MAKEFILE_LIST)))) +MVX_PLAYER_DIR_NAME := mvx_player +MVX_PLAYER_APP_NAME := mvx + +MVX_PLAYER_SITE = $(MVX_PLAYER_LOCAL_PATH)/src +MVX_PLAYER_SITE_METHOD = local + +MVX_PLAYER_INSTALL_IMAGES := YES + + +define MVX_PLAYER_BUILD_CMDS + $(TARGET_MAKE_ENV) $(MAKE) -C $(@D) +endef + +define MVX_PLAYER_INSTALL_TARGET_CMDS + $(INSTALL) -D -m 0755 $(@D)/mvx_encoder $(TARGET_DIR)/app/mvx_player/mvx_encoder + $(INSTALL) -D -m 0755 $(@D)/mvx_encoder_multi $(TARGET_DIR)/app/mvx_player/mvx_encoder_multi + $(INSTALL) -D -m 0755 $(@D)/mvx_decoder $(TARGET_DIR)/app/mvx_player/mvx_decoder + $(INSTALL) -D -m 0755 $(@D)/mvx_decoder_multi $(TARGET_DIR)/app/mvx_player/mvx_decoder_multi +endef + +$(eval $(generic-package)) diff --git a/src/little/buildroot-ext/package/mvx_player/src/Makefile b/src/little/buildroot-ext/package/mvx_player/src/Makefile new file mode 100755 index 000000000..90eb30ae2 --- /dev/null +++ b/src/little/buildroot-ext/package/mvx_player/src/Makefile @@ -0,0 +1,41 @@ +#CROSS_COMPILE := riscv64-linux- +CROSS_COMPILE := riscv64-unknown-linux-gnu- + +CC := $(CROSS_COMPILE)gcc +C++ := $(CROSS_COMPILE)g++ +OBJDUMP := $(CROSS_COMPILE)objdump +OBJCOPY := $(CROSS_COMPILE)objcopy +AR := $(CROSS_COMPILE)ar +AS := $(CROSS_COMPILE)as +LD := $(CROSS_COMPILE)gcc + +CFLAGS = \ + -fomit-frame-pointer -fno-strict-aliasing -fno-builtin \ + -ffunction-sections -fdata-sections \ + -DCFG_MAKEFILE -DTARGET_BOARD_TYPE_def=\"$(BR2_TARGET_BOARD_TYPE)\" + +PROG_1 = mvx_encoder +PROG_2 = mvx_encoder_multi +PROG_3 = mvx_decoder +PROG_4 = mvx_decoder_multi + +all: ${PROG_1} ${PROG_2} ${PROG_3} ${PROG_4} +.PHONY: all + +${PROG_1}: mvx_encoder.cpp mvx_player.cpp md5.c mvx_argparse.c + $(C++) $(CFLAGS) $^ -lstdc++ -Wl,-rpath . -lpthread -g -o $@ + +${PROG_2}: mvx_encoder_multi.cpp mvx_player.cpp md5.c mvx_argparse.c + $(C++) $(CFLAGS) $^ -lstdc++ -Wl,-rpath . -lpthread -g -o $@ + +${PROG_3}: mvx_decoder.cpp mvx_player.cpp md5.c mvx_argparse.c + $(C++) $(CFLAGS) $^ -lstdc++ -Wl,-rpath . -lpthread -g -o $@ + +${PROG_4}: mvx_decoder_multi.cpp mvx_player.cpp md5.c mvx_argparse.c + $(C++) $(CFLAGS) $^ -lstdc++ -Wl,-rpath . -lpthread -g -o $@ + +clean: + rm -f *.o + rm -f *.d + rm -f ${PROG_1} ${PROG_2} ${PROG_3} ${PROG_4} + diff --git a/src/little/buildroot-ext/package/mvx_player/src/ion.h b/src/little/buildroot-ext/package/mvx_player/src/ion.h new file mode 100755 index 000000000..33db23018 --- /dev/null +++ b/src/little/buildroot-ext/package/mvx_player/src/ion.h @@ -0,0 +1,134 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * ion.h + * + * Copyright (C) 2011 Google, Inc. + */ + +/* This file is copied from drivers/staging/android/uapi/ion.h + * This local copy is required for the selftest to pass, when build + * outside the kernel source tree. + * Please keep this file in sync with its original file until the + * ion driver is moved outside the staging tree. + */ + +#ifndef _UAPI_LINUX_ION_H +#define _UAPI_LINUX_ION_H + +#include +#include + +/** + * enum ion_heap_types - list of all possible types of heaps + * @ION_HEAP_TYPE_SYSTEM: memory allocated via vmalloc + * @ION_HEAP_TYPE_SYSTEM_CONTIG: memory allocated via kmalloc + * @ION_HEAP_TYPE_CARVEOUT: memory allocated from a prereserved + * carveout heap, allocations are physically + * contiguous + * @ION_HEAP_TYPE_DMA: memory allocated via DMA API + * @ION_NUM_HEAPS: helper for iterating over heaps, a bit mask + * is used to identify the heaps, so only 32 + * total heap types are supported + */ +enum ion_heap_type { + ION_HEAP_TYPE_SYSTEM, + ION_HEAP_TYPE_SYSTEM_CONTIG, + ION_HEAP_TYPE_CARVEOUT, + ION_HEAP_TYPE_CHUNK, + ION_HEAP_TYPE_DMA, + ION_HEAP_TYPE_CUSTOM, /* + * must be last so device specific heaps always + * are at the end of this enum + */ +}; + +#define ION_NUM_HEAP_IDS (sizeof(unsigned int) * 8) + +/** + * allocation flags - the lower 16 bits are used by core ion, the upper 16 + * bits are reserved for use by the heaps themselves. + */ + +/* + * mappings of this buffer should be cached, ion will do cache maintenance + * when the buffer is mapped for dma + */ +#define ION_FLAG_CACHED 1 + +/** + * DOC: Ion Userspace API + * + * create a client by opening /dev/ion + * most operations handled via following ioctls + * + */ + +/** + * struct ion_allocation_data - metadata passed from userspace for allocations + * @len: size of the allocation + * @heap_id_mask: mask of heap ids to allocate from + * @flags: flags passed to heap + * @handle: pointer that will be populated with a cookie to use to + * refer to this allocation + * + * Provided by userspace as an argument to the ioctl + */ +struct ion_allocation_data { + __u64 len; + __u32 heap_id_mask; + __u32 flags; + __u32 fd; + __u32 unused; +}; + +#define MAX_HEAP_NAME 32 + +/** + * struct ion_heap_data - data about a heap + * @name - first 32 characters of the heap name + * @type - heap type + * @heap_id - heap id for the heap + */ +struct ion_heap_data { + char name[MAX_HEAP_NAME]; + __u32 type; + __u32 heap_id; + __u32 reserved0; + __u32 reserved1; + __u32 reserved2; +}; + +/** + * struct ion_heap_query - collection of data about all heaps + * @cnt - total number of heaps to be copied + * @heaps - buffer to copy heap data + */ +struct ion_heap_query { + __u32 cnt; /* Total number of heaps to be copied */ + __u32 reserved0; /* align to 64bits */ + __u64 heaps; /* buffer to be populated */ + __u32 reserved1; + __u32 reserved2; +}; + +#define ION_IOC_MAGIC 'I' + +/** + * DOC: ION_IOC_ALLOC - allocate memory + * + * Takes an ion_allocation_data struct and returns it with the handle field + * populated with the opaque handle for the allocation. + */ +#define ION_IOC_ALLOC _IOWR(ION_IOC_MAGIC, 0, \ + struct ion_allocation_data) + +/** + * DOC: ION_IOC_HEAP_QUERY - information about available heaps + * + * Takes an ion_heap_query structure and populates information about + * available Ion heaps. + */ +#define ION_IOC_HEAP_QUERY _IOWR(ION_IOC_MAGIC, 8, \ + struct ion_heap_query) + +#endif /* _UAPI_LINUX_ION_H */ diff --git a/src/little/buildroot-ext/package/mvx_player/src/md5.c b/src/little/buildroot-ext/package/mvx_player/src/md5.c new file mode 100755 index 000000000..dfa29e9af --- /dev/null +++ b/src/little/buildroot-ext/package/mvx_player/src/md5.c @@ -0,0 +1,176 @@ +/* + * Copyright: + * ---------------------------------------------------------------------------- + * This confidential and proprietary software may be used only as authorized + * by a licensing agreement from Arm Technology (China) Co., Ltd. + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * The entire notice above must be reproduced on all authorized copies and + * copies may only be made to the extent permitted by a licensing agreement + * from Arm Technology (China) Co., Ltd. + * ---------------------------------------------------------------------------- + */ + +#include +#include +#include "md5.h" +#include + +/* Table taken from RFC1321 */ +uint32_t const sbox[] = { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 +}; + +/* Table taken from RFC1321 */ +uint32_t const K[] = { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 +}; + +uint8_t const Z[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +void MD5_Init(MD5_CTX *ctx) +{ + ctx->A = 0x67452301; + ctx->B = 0xefcdab89; + ctx->C = 0x98badcfe; + ctx->D = 0x10325476; + + ctx->nValidData = 0; + ctx->nLength = 0; +} + +#define lr(x, c) (((x) << (c)) | ((x) >> (32 - (c)))); + +#if defined(__clang__) +__attribute__((no_sanitize("unsigned-integer-overflow", "signed-integer-overflow"))) +#endif +void MD5_Update(MD5_CTX *ctx, const void *data, size_t len) +{ + uint8_t const *p = (uint8_t const *)data; + uint32_t remain = len; + uint8_t *d = &ctx->data[0]; + uint32_t s; + + while (0 != remain) + { + s = MIN(remain, MD5_CHUNK_LENGTH - ctx->nValidData); + memcpy(d + ctx->nValidData, p, s); + + remain -= s; + ctx->nValidData += s; + ctx->nLength += s; + p += s; + + if (ctx->nValidData == MD5_CHUNK_LENGTH) + { + /* Time to update the hash */ + uint32_t *w = (uint32_t *)d; + uint32_t A = ctx->A; + uint32_t B = ctx->B; + uint32_t C = ctx->C; + uint32_t D = ctx->D; + uint32_t dT; + uint32_t i, g; + uint32_t F; + uint32_t W; + + for (i = 0; i < 64; ++i) + { + if (i < 16) + { + F = (B & C) | ((~B) & D); + g = i; + } + else if (i < 32) + { + F = (D & B) | ((~D) & C); + g = (5 * i + 1) % 16; + } + else if (i < 48) + { + F = B ^ C ^ D; + g = (3 * i + 5) % 16; + } + else + { + F = C ^ (B | (~D)); + g = (7 * i) % 16; + } + + dT = D; + D = C; + C = B; + W = w[g]; + B = B + lr((A + F + K[i] + W), sbox[i]); + A = dT; + } + + ctx->A = ctx->A + A; + ctx->B = ctx->B + B; + ctx->C = ctx->C + C; + ctx->D = ctx->D + D; + + /* Consumed the bytes in the chunk. Reset */ + ctx->nValidData = 0; + } + } +} + +void MD5_Finalize(MD5_CTX *ctx) +{ + uint64_t length; + + length = ctx->nLength * 8; /* 64bit value, original length in _bits_ */ + + ctx->data[ctx->nValidData++] = 0x80; + + if ((MD5_CHUNK_LENGTH - ctx->nValidData) < 8) + { + MD5_Update(ctx, Z, MD5_CHUNK_LENGTH - ctx->nValidData); + } + + if (MD5_CHUNK_LENGTH - ctx->nValidData > 8) + { + MD5_Update(ctx, Z, MD5_CHUNK_LENGTH - ctx->nValidData - 8); + } + + MD5_Update(ctx, &length, sizeof(uint64_t)); +} + +void MD5_GetHash(MD5_CTX *ctx, uint8_t *digest) +{ + uint32_t *d = (uint32_t *)digest; + d[0] = (ctx->A); + d[1] = (ctx->B); + d[2] = (ctx->C); + d[3] = (ctx->D); +} + +void MD5_Final(unsigned char *md, MD5_CTX *c) +{ + MD5_Finalize(c); + MD5_GetHash(c, (uint8_t *)md); +} + diff --git a/src/little/buildroot-ext/package/mvx_player/src/md5.h b/src/little/buildroot-ext/package/mvx_player/src/md5.h new file mode 100755 index 000000000..42ee50d17 --- /dev/null +++ b/src/little/buildroot-ext/package/mvx_player/src/md5.h @@ -0,0 +1,49 @@ +/* + * Copyright: + * ---------------------------------------------------------------------------- + * This confidential and proprietary software may be used only as authorized + * by a licensing agreement from Arm Technology (China) Co., Ltd. + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * The entire notice above must be reproduced on all authorized copies and + * copies may only be made to the extent permitted by a licensing agreement + * from Arm Technology (China) Co., Ltd. + * ---------------------------------------------------------------------------- + */ + +#ifndef __MD5_H__ +#define __MD5_H__ + +#ifdef __cplusplus +extern "C" { +#endif + + +/* 512 bit chunks. Divide by eight for bytes. */ +#define MD5_CHUNK_LENGTH (512 >> 3) + + +#ifndef MIN +#define MIN( x, y ) ((x) < (y) ? (x) : (y)) +#endif + + +typedef struct MD5_CTX +{ + uint32_t A, B, C, D; + uint8_t data[MD5_CHUNK_LENGTH]; + uint32_t nValidData; + uint32_t nLength; +} MD5_CTX; + +void MD5_Init(MD5_CTX *ctx); +void MD5_Update(MD5_CTX *ctx, const void *data, size_t len); +void MD5_Finalize(MD5_CTX *ctx); +void MD5_GetHash(MD5_CTX *ctx, uint8_t *digest); +void MD5_Final(unsigned char *md, MD5_CTX *c); + + +#ifdef __cplusplus +} +#endif + +#endif /* __MD5_H__ */ diff --git a/src/little/buildroot-ext/package/mvx_player/src/mvx-v4l2-controls.h b/src/little/buildroot-ext/package/mvx_player/src/mvx-v4l2-controls.h new file mode 100755 index 000000000..be4e9ff07 --- /dev/null +++ b/src/little/buildroot-ext/package/mvx_player/src/mvx-v4l2-controls.h @@ -0,0 +1,732 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef _MVX_V4L2_CONTROLS_H_ +#define _MVX_V4L2_CONTROLS_H_ + +/**************************************************************************** + * Includes + ****************************************************************************/ + +#include +#include +#include + +/**************************************************************************** + * Pixel formats + ****************************************************************************/ + +#define V4L2_PIX_FMT_YUV420_AFBC_8 v4l2_fourcc('Y', '0', 'A', '8') +#define V4L2_PIX_FMT_YUV420_AFBC_10 v4l2_fourcc('Y', '0', 'A', 'A') +#define V4L2_PIX_FMT_YUV422_AFBC_8 v4l2_fourcc('Y', '2', 'A', '8') +#define V4L2_PIX_FMT_YUV422_AFBC_10 v4l2_fourcc('Y', '2', 'A', 'A') +#define V4L2_PIX_FMT_AQB1 v4l2_fourcc('Y', '0', 'A', 'B') +#define V4L2_PIX_FMT_Y210 v4l2_fourcc('Y', '2', '1', '0') +#define V4L2_PIX_FMT_P010 v4l2_fourcc('Y', '0', 'P', '1') +#define V4L2_PIX_FMT_Y0L2 v4l2_fourcc('Y', '0', 'Y', 'L') +#define V4L2_PIX_FMT_RGB_3P v4l2_fourcc('R', 'G', 'B', 'M') + + +#define V4L2_PIX_FMT_Y10_LE v4l2_fourcc('Y', '1', '0', 'L') +#define V4L2_PIX_FMT_YUV444_10 v4l2_fourcc('Y', '4', 'P', '3') +#define V4L2_PIX_FMT_YUV422_1P_10 v4l2_fourcc('Y', '2', 'P', '1') +#define V4L2_PIX_FMT_YUV420_2P_10 v4l2_fourcc('Y', '0', 'P', '2') +#define V4L2_PIX_FMT_YUV420_I420_10 v4l2_fourcc('Y', '0', 'P', '3') + + +#define V4L2_PIX_FMT_RV v4l2_fourcc('R', 'V', '0', '0') + +#ifndef V4L2_PIX_FMT_HEVC +#define V4L2_PIX_FMT_HEVC v4l2_fourcc('H', 'E', 'V', 'C') +#endif + +#ifndef V4L2_PIX_FMT_VP9 +#define V4L2_PIX_FMT_VP9 v4l2_fourcc('V', 'P', '9', '0') +#endif + +#ifndef V4L2_PIX_FMT_AV1 +#define V4L2_PIX_FMT_AV1 v4l2_fourcc('A', 'V', '1', '0') +#endif + +#define V4L2_PIX_FMT_AVS v4l2_fourcc('A', 'V', 'S', '1') +#define V4L2_PIX_FMT_AVS2 v4l2_fourcc('A', 'V', 'S', '2') + +#ifndef V4L2_CID_MPEG_VIDEO_HEVC_MIN_QP +#define V4L2_CID_MPEG_VIDEO_HEVC_MIN_QP (V4L2_CID_MPEG_BASE + 600) +#endif +#ifndef V4L2_CID_MPEG_VIDEO_HEVC_MAX_QP +#define V4L2_CID_MPEG_VIDEO_HEVC_MAX_QP (V4L2_CID_MPEG_BASE + 601) +#endif +#ifndef V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_QP +#define V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_QP (V4L2_CID_MPEG_BASE + 602) +#endif +#ifndef V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_QP +#define V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_QP (V4L2_CID_MPEG_BASE + 603) +#endif +#ifndef V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QP +#define V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QP (V4L2_CID_MPEG_BASE + 604) +#endif +/**************************************************************************** + * Buffers + * @see v4l2_buffer + ****************************************************************************/ + +/* + * Extended buffer flags. + */ +/* +#define V4L2_BUF_FLAG_MVX_DECODE_ONLY 0x01000000 +#define V4L2_BUF_FLAG_MVX_CODEC_CONFIG 0x02000000 +#define V4L2_BUF_FLAG_MVX_AFBC_TILED_HEADERS 0x10000000 +#define V4L2_BUF_FLAG_MVX_AFBC_TILED_BODY 0x20000000 +#define V4L2_BUF_FLAG_MVX_AFBC_32X8_SUPERBLOCK 0x40000000 +#define V4L2_BUF_FLAG_MVX_MASK 0xff000000 +#define V4L2_BUF_FLAG_END_OF_SUB_FRAME 0x04000000 +#define V4L2_BUF_FLAG_MVX_BUFFER_FRAME_PRESENT 0x08000000 +#define V4L2_BUF_FLAG_MVX_BUFFER_NEED_REALLOC 0x07000000 + + +#define V4L2_BUF_FRAME_FLAG_ROTATION_90 0x81000000 +#define V4L2_BUF_FRAME_FLAG_ROTATION_180 0x82000000 +#define V4L2_BUF_FRAME_FLAG_ROTATION_270 0x83000000 +#define V4L2_BUF_FRAME_FLAG_ROTATION_MASK 0x83000000 +#define V4L2_BUF_FRAME_FLAG_MIRROR_HORI 0x90000000 +#define V4L2_BUF_FRAME_FLAG_MIRROR_VERT 0xA0000000 +#define V4L2_BUF_FRAME_FLAG_MIRROR_MASK 0xB0000000 +#define V4L2_BUF_FRAME_FLAG_SCALING_2 0x84000000 +#define V4L2_BUF_FRAME_FLAG_SCALING_4 0x88000000 +#define V4L2_BUF_FRAME_FLAG_SCALING_MASK 0x8C000000 + +#define V4L2_BUF_FLAG_MVX_BUFFER_EPR 0xC0000000 +#define V4L2_BUF_FLAG_MVX_BUFFER_ROI 0x70000000 +*/ +//redefine these flags +/*use encode/decode frame/bitstream to update these flags*/ + +#define V4L2_BUF_FLAG_MVX_MASK 0xfff00000 + +//for decode frame flag +#define V4L2_BUF_FRAME_FLAG_ROTATION_90 0x01000000 /* Frame is rotated 90 degrees */ +#define V4L2_BUF_FRAME_FLAG_ROTATION_180 0x02000000 /* Frame is rotated 180 degrees */ +#define V4L2_BUF_FRAME_FLAG_ROTATION_270 0x03000000 /* Frame is rotated 270 degrees */ +#define V4L2_BUF_FRAME_FLAG_ROTATION_MASK 0x03000000 +#define V4L2_BUF_FRAME_FLAG_SCALING_2 0x04000000 /* Frame is scaled by half */ +#define V4L2_BUF_FRAME_FLAG_SCALING_4 0x08000000 /* Frame is scaled by quarter */ +#define V4L2_BUF_FRAME_FLAG_SCALING_MASK 0x0C000000 +#define V4L2_BUF_FLAG_MVX_BUFFER_FRAME_PRESENT 0x10000000 +#define V4L2_BUF_FLAG_MVX_BUFFER_NEED_REALLOC 0x20000000 + +//for decode bitstream flag +#define V4L2_BUF_FLAG_MVX_CODEC_CONFIG 0xC1000000 +#define V4L2_BUF_FLAG_END_OF_SUB_FRAME 0xC2000000 +#define V4L2_BUF_FLAG_MVX_DECODE_ONLY 0xC4000000 + +//for encode frame flag +#define V4L2_BUF_FRAME_FLAG_MIRROR_HORI 0x01000000 +#define V4L2_BUF_FRAME_FLAG_MIRROR_VERT 0x02000000 +#define V4L2_BUF_FRAME_FLAG_MIRROR_MASK 0x03000000 +#define V4L2_BUF_ENCODE_FLAG_ROTATION_90 0x10000000 /* Frame is rotated 90 degrees */ +#define V4L2_BUF_ENCODE_FLAG_ROTATION_180 0x20000000 /* Frame is rotated 180 degrees */ +#define V4L2_BUF_ENCODE_FLAG_ROTATION_270 0x30000000 /* Frame is rotated 270 degrees */ +#define V4L2_BUF_ENCODE_FLAG_ROTATION_MASK 0x30000000 + +#define V4L2_BUF_FLAG_MVX_BUFFER_ROI 0x04000000 /* this buffer has a roi region */ +#define V4L2_BUF_FLAG_MVX_BUFFER_EPR 0x08000000 /* EPR buffer flag */ +#define V4L2_BUF_FLAG_MVX_BUFFER_GENERAL 0x08000000 +#define V4L2_BUF_FLAG_MVX_BUFFER_CHR 0x40000000 +#define V4L2_BUF_FLAG_MVX_BUFFER_GOP_RESET 0x80000000 /* reset GOP */ +#define V4L2_BUF_FLAG_MVX_BUFFER_LTR_RESET 0x00200000 /* reset GOP */ +#define V4L2_BUF_FLAG_MVX_BUFFER_ENC_STATS 0x00400000 /* reset LTR */ + +//afbc flag +#define V4L2_BUF_FLAG_MVX_AFBC_TILED_HEADERS 0x01000000 +#define V4L2_BUF_FLAG_MVX_AFBC_TILED_BODY 0x02000000 +#define V4L2_BUF_FLAG_MVX_AFBC_32X8_SUPERBLOCK 0x04000000 + +//for customeized flag, set to v4l2_buffer.reserved2 +#define V4L2_BUF_FLAG_MVX_MINIFRAME 0x00000001 +#define V4L2_BUF_FLAG_MVX_OSD_1 0x00000002 +#define V4L2_BUF_FLAG_MVX_OSD_2 0x00000004 +#define V4L2_BUF_FLAG_MVX_OSD_MASK 0x00000006 +#define V4L2_BUF_FLAG_MVX_AD_STATS 0x00000008 + +/**************************************************************************** + * HDR color description. + ****************************************************************************/ + +#define V4L2_EVENT_MVX_COLOR_DESC V4L2_EVENT_PRIVATE_START +#define V4L2_MVX_MAX_FRAME_REGIONS 16 +#define V4L2_MAX_FRAME_OSD_REGION 2 +enum v4l2_mvx_range { + V4L2_MVX_RANGE_UNSPECIFIED, + V4L2_MVX_RANGE_FULL, + V4L2_MVX_RANGE_LIMITED +}; + +enum v4l2_mvx_primaries { + V4L2_MVX_PRIMARIES_UNSPECIFIED, + V4L2_MVX_PRIMARIES_BT709, /* Rec.ITU-R BT.709 */ + V4L2_MVX_PRIMARIES_BT470M, /* Rec.ITU-R BT.470 System M */ + V4L2_MVX_PRIMARIES_BT601_625, /* Rec.ITU-R BT.601 625 */ + V4L2_MVX_PRIMARIES_BT601_525, /* Rec.ITU-R BT.601 525 */ + V4L2_MVX_PRIMARIES_GENERIC_FILM, /* Generic Film */ + V4L2_MVX_PRIMARIES_BT2020 /* Rec.ITU-R BT.2020 */ +}; + +enum v4l2_mvx_transfer { + V4L2_MVX_TRANSFER_UNSPECIFIED, + V4L2_MVX_TRANSFER_LINEAR, /* Linear transfer characteristics */ + V4L2_MVX_TRANSFER_SRGB, /* sRGB */ + V4L2_MVX_TRANSFER_SMPTE170M, /* SMPTE 170M */ + V4L2_MVX_TRANSFER_GAMMA22, /* Assumed display gamma 2.2 */ + V4L2_MVX_TRANSFER_GAMMA28, /* Assumed display gamma 2.8 */ + V4L2_MVX_TRANSFER_ST2084, /* SMPTE ST 2084 */ + V4L2_MVX_TRANSFER_HLG, /* ARIB STD-B67 hybrid-log-gamma */ + V4L2_MVX_TRANSFER_SMPTE240M, /* SMPTE 240M */ + V4L2_MVX_TRANSFER_XVYCC, /* IEC 61966-2-4 */ + V4L2_MVX_TRANSFER_BT1361, /* Rec.ITU-R BT.1361 extended gamut */ + V4L2_MVX_TRANSFER_ST428 /* SMPTE ST 428-1 */ +}; + +enum v4l2_mvx_matrix { + V4L2_MVX_MATRIX_UNSPECIFIED, + V4L2_MVX_MATRIX_BT709, /* Rec.ITU-R BT.709 */ + V4L2_MVX_MATRIX_BT470M, /* KR=0.30, KB=0.11 */ + V4L2_MVX_MATRIX_BT601, /* Rec.ITU-R BT.601 625 */ + V4L2_MVX_MATRIX_SMPTE240M, /* SMPTE 240M or equivalent */ + V4L2_MVX_MATRIX_BT2020, /* Rec.ITU-R BT.2020 non-const lum */ + V4L2_MVX_MATRIX_BT2020Constant /* Rec.ITU-R BT.2020 constant lum */ +}; + +enum v4l2_nalu_format { + V4L2_OPT_NALU_FORMAT_START_CODES, + V4L2_OPT_NALU_FORMAT_ONE_NALU_PER_BUFFER, + V4L2_OPT_NALU_FORMAT_ONE_BYTE_LENGTH_FIELD, + V4L2_OPT_NALU_FORMAT_TWO_BYTE_LENGTH_FIELD, + V4L2_OPT_NALU_FORMAT_FOUR_BYTE_LENGTH_FIELD, + V4L2_OPT_NALU_FORMAT_ONE_FRAME_PER_BUFFER +}; + +struct v4l2_mvx_primary { + unsigned short x; + unsigned short y; +}; + +/** + * struct v4l2_mvx_color_desc - HDR color description. + * @flags: Flags which fields that are valid. + * @range: enum v4l2_mvx_range. + * @primaries: enum v4l2_mvx_primaries. + * @transfer: enum v4l2_mvx_transfer. + * @matrix: enum v4l2_mvx_matrix. + * @display.r: Red point. + * @display.g: Green point. + * @display.b: Blue point. + * @display.w: White point. + * @display.luminance_min: Minimum display luminance. + * @display.luminance_max: Maximum display luminance. + * @content.luminance_max: Maximum content luminance. + * @content.luminance_average: Average content luminance. + * + * Color- and white point primaries are given in increments of 0.00002 + * and in the range of 0 to 50'000. + * + * Luminance is given in increments of 0.0001 candelas per m3. + */ +struct v4l2_mvx_color_desc { + unsigned int flags; + #define V4L2_BUFFER_PARAM_COLOUR_FLAG_MASTERING_DISPLAY_DATA_VALID (1) + #define V4L2_BUFFER_PARAM_COLOUR_FLAG_CONTENT_LIGHT_DATA_VALID (2) + unsigned char range; + unsigned char primaries; + unsigned char transfer; + unsigned char matrix; + struct { + struct v4l2_mvx_primary r; + struct v4l2_mvx_primary g; + struct v4l2_mvx_primary b; + struct v4l2_mvx_primary w; + unsigned short luminance_min; + unsigned short luminance_max; + } display; + struct { + unsigned short luminance_max; + unsigned short luminance_average; + } content; + + unsigned char video_format; + unsigned char aspect_ratio_idc; + unsigned short sar_width; + unsigned short sar_height; + unsigned int num_units_in_tick; + unsigned int time_scale; +} __attribute__ ((packed)); + +struct v4l2_buffer_param_region +{ + unsigned short mbx_left; /**< X coordinate of the left most macroblock */ + unsigned short mbx_right; /**< X coordinate of the right most macroblock */ + unsigned short mby_top; /**< Y coordinate of the top most macroblock */ + unsigned short mby_bottom; /**< Y coordinate of the bottom most macroblock */ + short qp_delta; /**< QP delta value. This region will be encoded + * with qp = qp_default + qp_delta. */ + unsigned short prio; + unsigned short force_intra; +}; + +struct v4l2_mvx_roi_regions +{ + unsigned int pic_index; + unsigned char qp_present; + unsigned char qp; + unsigned char roi_present; + unsigned char num_roi; + struct v4l2_buffer_param_region roi[V4L2_MVX_MAX_FRAME_REGIONS]; +}; + +struct v4l2_sei_user_data +{ + unsigned char flags; + #define V4L2_BUFFER_PARAM_USER_DATA_UNREGISTERED_VALID (1) + unsigned char uuid[16]; + char user_data[256 - 35]; + unsigned char user_data_len; +}; + +struct v4l2_rate_control +{ + unsigned int rc_type; + #define V4L2_OPT_RATE_CONTROL_MODE_OFF (0) + #define V4L2_OPT_RATE_CONTROL_MODE_STANDARD (1) + #define V4L2_OPT_RATE_CONTROL_MODE_VARIABLE (2) + #define V4L2_OPT_RATE_CONTROL_MODE_CONSTANT (3) + #define V4L2_OPT_RATE_CONTROL_MODE_C_VARIABLE (4) + unsigned int target_bitrate; + unsigned int maximum_bitrate; +}; + +struct v4l2_mvx_dsl_frame +{ + unsigned int width; + unsigned int height; +}; + +struct v4l2_mvx_dsl_ratio +{ + unsigned int hor; + unsigned int ver; +}; + +struct v4l2_mvx_long_term_ref +{ + unsigned int mode; + unsigned int period; +}; + +struct v4l2_buffer_param_rectangle +{ + unsigned short x_left; /* pixel x left edge (inclusive) */ + unsigned short x_right; /* pixel x right edge (exclusive) */ + unsigned short y_top; /* pixel y top edge (inclusive) */ + unsigned short y_bottom; /* pixel y bottom edge (exclusive) */ +}; + +/* input for encoder, + * indicate which parts of the source picture has changed. + * The encoder can (optionally) use this information to + * reduce memory bandwidth. + * + * n_rectangles=0 indicates the source picture is unchanged. + * + * This parameter only applies to the picture that immediately + * follows (and not to subsequent ones). + */ +struct v4l2_mvx_chr_config +{ + unsigned int pic_index; + unsigned int num_chr; + #define V4L2_MAX_FRAME_CHANGE_RECTANGLES 2 + struct v4l2_buffer_param_rectangle rectangle[V4L2_MAX_FRAME_CHANGE_RECTANGLES]; +}; + +struct v4l2_mvx_osd_cfg +{ + uint8_t osd_inside_enable; + uint8_t osd_inside_alpha_enable; + uint8_t osd_inside_convert_color_enable; + uint8_t osd_inside_alpha_value; /* as alpha range [0~16], use u8 */ + uint8_t osd_inside_convert_color_threshold;/* threshold range [0~255], if input is 10bit, th * 4 */ + uint8_t osd_inside_rgb2yuv_mode;/* 0-601L, 1-601F, 2-709_L, 3-709_F */ + uint16_t osd_inside_start_x; /* pixel x left edge (inclusive) */ + uint16_t osd_inside_start_y; /* pixel y top edge (inclusive) */ + uint16_t reserved[3]; +}; + +struct v4l2_osd_config +{ + unsigned int pic_index; + unsigned int num_osd; + struct v4l2_mvx_osd_cfg osd_single_cfg[V4L2_MAX_FRAME_OSD_REGION];/* include single osd region config and index */ +}; + +struct v4l2_osd_info +{ + uint32_t width_osd[V4L2_MAX_FRAME_OSD_REGION]; + uint32_t height_osd[V4L2_MAX_FRAME_OSD_REGION]; + uint32_t inputFormat_osd[V4L2_MAX_FRAME_OSD_REGION]; +}; + +#define V4L2_MVX_COLOR_DESC_DISPLAY_VALID 0x1 +#define V4L2_MVX_COLOR_DESC_CONTENT_VALID 0x2 + +/**************************************************************************** + * Custom IOCTL + ****************************************************************************/ + +#define VIDIOC_G_MVX_COLORDESC _IOWR('V', BASE_VIDIOC_PRIVATE, \ + struct v4l2_mvx_color_desc) +#define VIDIOC_S_MVX_ROI_REGIONS _IOWR('V', BASE_VIDIOC_PRIVATE + 1, \ + struct v4l2_mvx_roi_regions) +#define VIDIOC_S_MVX_QP_EPR _IOWR('V', BASE_VIDIOC_PRIVATE + 2, \ + struct v4l2_buffer_param_qp) +#define VIDIOC_S_MVX_COLORDESC _IOWR('V', BASE_VIDIOC_PRIVATE + 3, \ + struct v4l2_mvx_color_desc) +#define VIDIOC_S_MVX_SEI_USERDATA _IOWR('V', BASE_VIDIOC_PRIVATE + 4, \ + struct v4l2_sei_user_data) +#define VIDIOC_S_MVX_RATE_CONTROL _IOWR('V', BASE_VIDIOC_PRIVATE + 5, \ + struct v4l2_rate_control) +#define VIDIOC_S_MVX_DSL_FRAME _IOWR('V', BASE_VIDIOC_PRIVATE + 6, \ + struct v4l2_mvx_dsl_frame) +#define VIDIOC_S_MVX_DSL_RATIO _IOWR('V', BASE_VIDIOC_PRIVATE + 7, \ + struct v4l2_mvx_dsl_ratio) +#define VIDIOC_S_MVX_LONG_TERM_REF _IOWR('V', BASE_VIDIOC_PRIVATE + 8, \ + struct v4l2_mvx_long_term_ref) +#define VIDIOC_S_MVX_DSL_MODE _IOWR('V', BASE_VIDIOC_PRIVATE + 9, \ + int) +#define VIDIOC_S_MVX_MINI_FRAME_HEIGHT _IOWR('V', BASE_VIDIOC_PRIVATE + 10, \ + int) +#define VIDIOC_S_MVX_STATS_MODE _IOWR('V', BASE_VIDIOC_PRIVATE + 11, \ + struct v4l2_buffer_param_enc_stats) +#define VIDIOC_S_MVX_CHR_CFG _IOWR('V', BASE_VIDIOC_PRIVATE + 12, \ + struct v4l2_mvx_chr_config) +#define VIDIOC_S_MVX_HUFF_TABLE _IOWR('V', BASE_VIDIOC_PRIVATE + 13, \ + struct v4l2_mvx_huff_table) +#define VIDIOC_S_MVX_SEAMLESS_TARGET _IOWR('V', BASE_VIDIOC_PRIVATE + 14, \ + struct v4l2_mvx_seamless_target) +#define VIDIOC_S_MVX_COLOR_CONV_COEF _IOWR('V', BASE_VIDIOC_PRIVATE + 15, \ + struct v4l2_mvx_color_conv_coef) +#define VIDIOC_S_MVX_ENC_SRC_CROP _IOWR('V', BASE_VIDIOC_PRIVATE + 16, \ + struct v4l2_mvx_crop_cfg) +#define VIDIOC_S_MVX_DEC_DST_CROP _IOWR('V', BASE_VIDIOC_PRIVATE + 17, \ + struct v4l2_mvx_crop_cfg) +#define VIDIOC_S_MVX_RGB2YUV_COLOR_CONV_COEF _IOWR('V', BASE_VIDIOC_PRIVATE + 18, \ + struct v4l2_mvx_rgb2yuv_color_conv_coef) +#define VIDIOC_S_MVX_OSD_CONFIG _IOWR('V', BASE_VIDIOC_PRIVATE + 19, \ + struct v4l2_osd_config) +#define VIDIOC_S_MVX_OSD_INFO _IOWR('V', BASE_VIDIOC_PRIVATE + 20, \ + struct v4l2_osd_info) +/**************************************************************************** + * Custom controls + ****************************************************************************/ + +/* + * Video for Linux 2 custom controls. + */ +enum v4l2_cid_mve_video { + V4L2_CID_MVE_VIDEO_FRAME_RATE = V4L2_CTRL_CLASS_MPEG + 0x2000, + V4L2_CID_MVE_VIDEO_NALU_FORMAT, + V4L2_CID_MVE_VIDEO_STREAM_ESCAPING, + V4L2_CID_MVE_VIDEO_H265_PROFILE, + V4L2_CID_MVE_VIDEO_VC1_PROFILE, + V4L2_CID_MVE_VIDEO_H265_LEVEL, + V4L2_CID_MVE_VIDEO_IGNORE_STREAM_HEADERS, + V4L2_CID_MVE_VIDEO_FRAME_REORDERING, + V4L2_CID_MVE_VIDEO_INTBUF_SIZE, + V4L2_CID_MVE_VIDEO_P_FRAMES, + V4L2_CID_MVE_VIDEO_GOP_TYPE, + V4L2_CID_MVE_VIDEO_CONSTR_IPRED, + V4L2_CID_MVE_VIDEO_ENTROPY_SYNC, + V4L2_CID_MVE_VIDEO_TEMPORAL_MVP, + V4L2_CID_MVE_VIDEO_TILE_ROWS, + V4L2_CID_MVE_VIDEO_TILE_COLS, + V4L2_CID_MVE_VIDEO_MIN_LUMA_CB_SIZE, + V4L2_CID_MVE_VIDEO_MB_MASK, + V4L2_CID_MVE_VIDEO_VP9_PROB_UPDATE, + V4L2_CID_MVE_VIDEO_BITDEPTH_CHROMA, + V4L2_CID_MVE_VIDEO_BITDEPTH_LUMA, + V4L2_CID_MVE_VIDEO_FORCE_CHROMA_FORMAT, + V4L2_CID_MVE_VIDEO_RGB_TO_YUV_MODE, + V4L2_CID_MVE_VIDEO_BANDWIDTH_LIMIT, + V4L2_CID_MVE_VIDEO_CABAC_INIT_IDC, + V4L2_CID_MVE_VIDEO_VPX_B_FRAME_QP, + V4L2_CID_MVE_VIDEO_SECURE_VIDEO, + V4L2_CID_MVE_VIDEO_CROP_LEFT, + V4L2_CID_MVE_VIDEO_CROP_RIGHT, + V4L2_CID_MVE_VIDEO_CROP_TOP, + V4L2_CID_MVE_VIDEO_CROP_BOTTOM, + V4L2_CID_MVE_VIDEO_HRD_BUFFER_SIZE, + V4L2_CID_MVE_VIDEO_INIT_QP_I, + V4L2_CID_MVE_VIDEO_INIT_QP_P, + V4L2_CID_MVE_VIDEO_SAO_LUMA, + V4L2_CID_MVE_VIDEO_SAO_CHROMA, + V4L2_CID_MVE_VIDEO_QP_DELTA_I_P, + V4L2_CID_MVE_VIDEO_QP_REF_RB_EN, + V4L2_CID_MVE_VIDEO_RC_CLIP_TOP, + V4L2_CID_MVE_VIDEO_RC_CLIP_BOT, + V4L2_CID_MVE_VIDEO_QP_MAP_CLIP_TOP, + V4L2_CID_MVE_VIDEO_QP_MAP_CLIP_BOT, + V4L2_CID_MVE_VIDEO_MAX_QP_I, + V4L2_CID_MVE_VIDEO_MIN_QP_I, + V4L2_CID_MVE_VIDEO_FW_PROFILING, + V4L2_CID_MVE_VIDEO_VISIBLE_WIDTH, + V4L2_CID_MVE_VIDEO_VISIBLE_HEIGHT, + V4L2_CID_MVE_VIDEO_JPEG_QUALITY_LUMA, + V4L2_CID_MVE_VIDEO_JPEG_QUALITY_CHROMA, + V4L2_CID_MVE_VIDEO_RC_I_MODE, + V4L2_CID_MVE_VIDEO_RC_I_RATIO, + V4L2_CID_MVE_VIDEO_INTER_MED_BUF_SIZE, + V4L2_CID_MVE_VIDEO_SVCT3_LEVEL1_PERIOD, + V4L2_CID_MVE_VIDEO_GOP_RESET_PFRAMES, + V4L2_CID_MVE_VIDEO_LTR_RESET_PERIOD, + V4L2_CID_MVE_VIDEO_QP_FIXED, + V4L2_CID_MVE_VIDEO_GDR_NUMBER, + V4L2_CID_MVE_VIDEO_GDR_PERIOD, + V4L2_CID_MVE_VIDEO_MULTI_SPS_PPS, + V4L2_CID_MVE_VIDEO_ENABLE_VISUAL, + V4L2_CID_MVE_VIDEO_SCD_ENABLE, + V4L2_CID_MVE_VIDEO_SCD_PERCENT, + V4L2_CID_MVE_VIDEO_SCD_THRESHOLD, + V4L2_CID_MVE_VIDEO_AQ_SSIM_EN, + V4L2_CID_MVE_VIDEO_AQ_NEG_RATIO, + V4L2_CID_MVE_VIDEO_AQ_POS_RATIO, + V4L2_CID_MVE_VIDEO_AQ_QPDELTA_LMT, + V4L2_CID_MVE_VIDEO_AQ_INIT_FRM_AVG_SVAR, + V4L2_CID_MVE_VIDEO_COLOR_CONVERSION, + V4L2_CID_MVE_VIDEO_RGB2YUV_COLOR_CONV_COEF, + V4L2_CID_MVE_VIDEO_FORCED_UV_VALUE, + V4L2_CID_MVE_VIDEO_DSL_INTERP_MODE, + V4L2_CID_MVE_VIDEO_DISABLED_FEATURES, + V4L2_CID_MVE_VIDEO_ENABLE_ADAPTIVE_INTRA_BLOCK, + V4L2_CID_MVE_VIDEO_CHANGE_POS, +}; + +struct v4l2_buffer_param_enc_stats +{ + unsigned int mms_buffer_size; + unsigned int bitcost_buffer_size; + unsigned int qp_buffer_size; + unsigned int flags; + //ENC_STATS_FLAGS + #define V4L2_BUFFER_ENC_STATS_FLAG_MMS (1<<0) + #define V4L2_BUFFER_ENC_STATS_FLAG_BITCOST (1<<1) + #define V4L2_BUFFER_ENC_STATS_FLAG_QP (1<<2) + #define V4L2_BUFFER_ENC_STATS_FLAG_DROP (1<<3) + unsigned int pic_index_or_mb_size; +}; + + +/* block configuration uncompressed rows header. this configures the size of the + * uncompressed body. */ +struct v4l2_buffer_general_rows_uncomp_hdr +{ + unsigned char n_cols_minus1; /* number of quad cols in picture minus 1 */ + unsigned char n_rows_minus1; /* number of quad rows in picture minus 1 */ + unsigned char reserved[2]; +}; + +struct v4l2_buffer_general_block_configs +{ + unsigned char blk_cfg_type; + #define V4L2_BLOCK_CONFIGS_TYPE_NONE (0x00) + #define V4L2_BLOCK_CONFIGS_TYPE_ROW_UNCOMP (0xff) + unsigned char reserved[3]; + union + { + struct v4l2_buffer_general_rows_uncomp_hdr rows_uncomp; + } blk_cfgs; +}; + +struct v4l2_buffer_general_ad_stats +{ + unsigned int frame_averages; + // bitfields + #define v4l2_AD_STATS_PIC_AVGS_Y (0) + #define v4l2_AD_STATS_PIC_AVGS_Y_SZ (12) + #define v4l2_AD_STATS_PIC_AVGS_CB (12) + #define v4l2_AD_STATS_PIC_AVGS_CB_SZ (10) + #define v4l2_AD_STATS_PIC_AVGS_CR (22) + #define v4l2_AD_STATS_PIC_AVGS_CR_SZ (10) + unsigned short thumbnail_width; + unsigned short thumbnail_height; + unsigned char ad_stats_flags; + #define v4l2_AD_STATS_PIC_FMT_PROGRESSIVE (0) + #define v4l2_AD_STATS_PIC_FMT_INTERLACED (1) + unsigned char reserved[3]; +}; + +/* input for encoder */ +struct v4l2_buffer_param_qp +{ + /* QP (quantization parameter) for encode. + * + * When used to set fixed QP for encode, with rate control + * disabled, then the valid ranges are: + * H264: 0-51 + * HEVC: 0-51 + * VP8: 0-63 + * VP9: 0-63 + * Note: The QP must be set separately for I, P and B frames. + * + * But when this message is used with the regions-feature, + * then the valid ranges are the internal bitstream ranges: + * H264: 0-51 + * HEVC: 0-51 + * VP8: 0-127 + * VP9: 0-255 + */ + int qp; + int epr_iframe_enable; +}; + +/* the block parameter record specifies the various properties of a quad */ +struct v4l2_block_param_record +{ + unsigned int qp_delta; + /* Bitset of four 4-bit QP delta values for a quad. + * For H.264 and HEVC these are qp delta values in the range -8 to +7. + * For Vp9 these are segment map values in the range 0 to 7. + */ + #define V4L2_BLOCK_PARAM_RECORD_QP_DELTA_TOP_LEFT_16X16 (0) + #define V4L2_BLOCK_PARAM_RECORD_QP_DELTA_TOP_LEFT_16X16_SZ (6) + #define V4L2_BLOCK_PARAM_RECORD_QP_DELTA_TOP_RIGHT_16X16 (6) + #define V4L2_BLOCK_PARAM_RECORD_QP_DELTA_TOP_RIGHT_16X16_SZ (6) + #define V4L2_BLOCK_PARAM_RECORD_QP_DELTA_BOT_LEFT_16X16 (12) + #define V4L2_BLOCK_PARAM_RECORD_QP_DELTA_BOT_LEFT_16X16_SZ (6) + #define V4L2_BLOCK_PARAM_RECORD_QP_DELTA_BOT_RIGHT_16X16 (18) + #define V4L2_BLOCK_PARAM_RECORD_QP_DELTA_BOT_RIGHT_16X16_SZ (6) + + #define V4L2_BLOCK_PARAM_RECORD_QP_FORCE_FIELD (24) + #define V4L2_BLOCK_PARAM_RECORD_QP_FORCE_FIELD_SZ (5) + #define V4L2_BLOCK_PARAM_RECORD_QUAD_FORCE_INTRA (29) + #define V4L2_BLOCK_PARAM_RECORD_QUAD_FORCE_INTRA_SZ (1) + #define V4L2_BLOCK_PARAM_RECORD_QP_ABSOLUTE (30) + #define V4L2_BLOCK_PARAM_RECORD_QP_ABSOLUTE_SZ (1) + #define V4L2_BLOCK_PARAM_RECORD_QP_QUAD_SKIP (31) + #define V4L2_BLOCK_PARAM_RECORD_QP_QUAD_SKIP_SZ (1) + + #define V4L2_BLOCK_PARAM_RECORD_FORCE_NONE (0x00) + #define V4L2_BLOCK_PARAM_RECORD_FORCE_QP (0x01) + unsigned int min_qp; + #define V4L2_BLOCK_PARAM_RECORD_MIN_QP_TOP_LEFT_16X16 (0) + #define V4L2_BLOCK_PARAM_RECORD_MIN_QP_TOP_LEFT_16X16_SZ (6) + #define V4L2_BLOCK_PARAM_RECORD_MIN_QP_TOP_RIGHT_16X16 (6) + #define V4L2_BLOCK_PARAM_RECORD_MIN_QP_TOP_RIGHT_16X16_SZ (6) + #define V4L2_BLOCK_PARAM_RECORD_MIN_QP_BOT_LEFT_16X16 (12) + #define V4L2_BLOCK_PARAM_RECORD_MIN_QP_BOT_LEFT_16X16_SZ (6) + #define V4L2_BLOCK_PARAM_RECORD_MIN_QP_BOT_RIGHT_16X16 (18) + #define V4L2_BLOCK_PARAM_RECORD_MIN_QP_BOT_RIGHT_16X16_SZ (6) + #define V4L2_BLOCK_PARAM_RECORD_QUAD_SELECT_QP_DELTA (24) + #define V4L2_BLOCK_PARAM_RECORD_QUAD_SELECT_QP_DELTA_SZ (1) + +}; + +struct v4l2_buffer_general_rows_uncomp_body +{ + /* the size of this array is variable and not necessarily equal to 1. + * therefore the sizeof operator should not be used + */ + struct v4l2_block_param_record bpr[1]; +}; + +struct v4l2_core_buffer_header_general +{ + //uint64_t user_data_tag; // User supplied tracking identifier + //uint64_t app_handle; // Host buffer handle number + unsigned short type; // type of config, value is one of V4L2_BUFFER_GENERAL_TYPE_X + + #define V4L2_BUFFER_GENERAL_TYPE_INVALID (0) /* invalid */ + #define V4L2_BUFFER_GENERAL_TYPE_BLOCK_CONFIGS (1) /* block_configs */ + #define V4L2_BUFFER_GENERAL_TYPE_AD_STATS (2) /* assertive display statistics */ + unsigned short config_size; // size of the configuration + unsigned int buffer_size; + union { + struct v4l2_buffer_general_block_configs config; + struct v4l2_buffer_general_ad_stats ad_stats; + } config; +}; + +struct v4l2_mvx_huff_table +{ + unsigned int type; + #define V4L2_OPT_HUFFMAN_TABLE_DC_LUMA (1) + #define V4L2_OPT_HUFFMAN_TABLE_AC_LUMA (2) + #define V4L2_OPT_HUFFMAN_TABLE_DC_CHROMA (4) + #define V4L2_OPT_HUFFMAN_TABLE_AC_CHROMA (8) + unsigned char dc_luma_code_lenght[16]; + unsigned char ac_luma_code_lenght[16]; + unsigned char dc_chroma_code_lenght[16]; + unsigned char ac_chroma_code_lenght[16]; + unsigned char dc_luma_table[162]; + unsigned char ac_luma_table[162]; + unsigned char dc_chroma_table[162]; + unsigned char ac_chroma_table[162]; +}; +struct v4l2_mvx_seamless_target +{ + unsigned int seamless_mode; + unsigned int target_width; + unsigned int target_height; + unsigned int target_stride[3]; + unsigned int target_size[3]; +}; +struct v4l2_mvx_color_conv_coef +{ + short coef[3][3]; + unsigned short offset[3]; +}; + +struct v4l2_mvx_rgb2yuv_color_conv_coef +{ + short coef[3 * 3]; //coef[Y|U|V][R|G|B] + unsigned char luma_range[2]; + unsigned char chroma_range[2]; + unsigned char rgb_range[2]; +}; + +struct v4l2_mvx_crop_cfg +{ + unsigned char crop_en; + unsigned short x; + unsigned short y; + unsigned short width; + unsigned short height; +}; +#endif /* _MVX_V4L2_CONTROLS_H_ */ diff --git a/src/little/buildroot-ext/package/mvx_player/src/mvx_argparse.c b/src/little/buildroot-ext/package/mvx_player/src/mvx_argparse.c new file mode 100755 index 000000000..381bc2f2e --- /dev/null +++ b/src/little/buildroot-ext/package/mvx_player/src/mvx_argparse.c @@ -0,0 +1,584 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +/**************************************************************************** + * Include + ****************************************************************************/ + +#include +#include +#include +#include +#include +#include "mvx_argparse.h" + +/**************************************************************************** + * Defines + ****************************************************************************/ + +#define min(x, y) \ + ({ \ + typeof(x)_min1 = (x); \ + typeof(y)_min2 = (y); \ + (void)(&_min1 == &_min2); \ + _min1 < _min2 ? _min1 : _min2; }) + +/**************************************************************************** + * Types + ****************************************************************************/ + +struct mvx_value { + struct mvx_list_head head; + char *value; +}; + +struct mvx_argument { + struct mvx_list_head head; + char arg_short; + const char *arg_long; + bool optional; + int nargs; + enum mvx_argp_action action; + const char *def; + const char *help; + bool is_set; + struct mvx_list values; + int min_args; + int max_args; +}; + +/**************************************************************************** + * Argument + ****************************************************************************/ + +/** + * Return: 1 on success, 0 if arg can't accept more value, else error code. + */ +static int arg_push(struct mvx_argument *arg, + const char *s) +{ + size_t size; + struct mvx_value *value; + + size = mvx_list_size(&arg->values); + if ((int)size >= arg->max_args) + return 0; + + value = (mvx_value *)malloc(sizeof(*value)); + if (value == NULL) + return -EINVAL; + + mvx_list_add_tail(&arg->values, &value->head); + value->value = strdup(s); + + return 1; +} + +static void arg_clear(struct mvx_argument *arg) +{ + struct mvx_value *value; + struct mvx_list_head *tmp; + + mvx_list_for_each_entry_safe(&arg->values, value, head, tmp) { + mvx_list_del(&value->head); + free(value->value); + free(value); + } +} + +static const char *arg_value(struct mvx_argument *arg, + unsigned int index) +{ + struct mvx_value *value; + + mvx_list_for_each_entry(&arg->values, value, head) { + if (index-- == 0) + return value->value; + } + + if (arg->def != NULL) + return arg->def; + + return NULL; +} + +static void arg_open(struct mvx_argument *arg) +{ + if (arg->action == MVX_ARGP_STORE) + arg_clear(arg); + + arg->is_set = true; +} + +static int arg_close(struct mvx_argument *arg) +{ + size_t size; + + if (arg == NULL) + return 0; + + /* Verify that sufficient arguments have been given. */ + size = mvx_list_size(&arg->values); + if ((int)size < arg->min_args) + return -EINVAL; + + return 0; +} + +static void arg_construct(struct mvx_argument *arg, + const char arg_short, + const char *arg_long, + bool optional, + int nargs, + const char *def, + const char *help) +{ + arg->arg_short = arg_short; + arg->arg_long = arg_long; + arg->optional = optional; + arg->nargs = nargs; + arg->action = MVX_ARGP_STORE; + arg->def = def; + arg->help = help; + arg->is_set = false; + + mvx_list_construct(&arg->values); + + switch (arg->nargs) { + case mvx_argp_ZERO_OR_ONE: + arg->min_args = 0; + arg->max_args = 1; + break; + case mvx_argp_ZERO_OR_MORE: + arg->min_args = 0; + arg->max_args = 1000000; + break; + case mvx_argp_ONE_OR_MORE: + arg->min_args = 1; + arg->max_args = 1000000; + break; + default: + arg->min_args = arg->nargs; + arg->max_args = arg->nargs; + } +} + +static struct mvx_argument *arg_new(const char c, + const char *s, + bool optional, + int nargs, + const char *def, + const char *help) +{ + struct mvx_argument *arg; + + arg = (mvx_argument *)malloc(sizeof(*arg)); + if (arg == NULL) + return NULL; + + arg_construct(arg, c, s, optional, nargs, def, help); + + return arg; +} + +static void arg_destruct(struct mvx_argument *arg) +{ + arg_clear(arg); +} + +static void arg_delete(struct mvx_argument *arg) +{ + arg_destruct(arg); + free(arg); +} + +/**************************************************************************** + * Static functions + ****************************************************************************/ + +static struct mvx_argument *find_arg_long(struct mvx_list *list, + const char *arg_long) +{ + struct mvx_argument *arg; + + mvx_list_for_each_entry(list, arg, head) { + if (strcmp(arg->arg_long, arg_long) == 0) + return arg; + } + + return NULL; +} + +static struct mvx_argument *find_arg_short(struct mvx_list *list, + const char arg_short) +{ + struct mvx_argument *arg; + + mvx_list_for_each_entry(list, arg, head) { + if (arg->arg_short == arg_short) + return arg; + } + + return NULL; +} + +static struct mvx_argument *find_arg(struct mvx_argparse *argp, + const char c, + const char *s) +{ + struct mvx_argument *arg; + + if (isalpha(c) && find_arg_short(&argp->optional, c) != NULL) { + arg = find_arg_short(&argp->optional, c); + if (arg != NULL) + return arg; + } + + if (s != NULL) { + arg = find_arg_long(&argp->optional, s); + if (arg != NULL) + return arg; + + arg = find_arg_long(&argp->positional, s); + if (arg != NULL) + return arg; + } + + return NULL; +} + +static int parse_positional(struct mvx_argparse *argp, + struct mvx_argument *arg, + int argc, + const char **argv) +{ + struct mvx_argument *end; + int i; + + /* Have all positional arguments been handled? */ + end = mvx_list_end_entry(&argp->positional, typeof(*end), head); + if (arg == end) { + if (argc == 0) + return 0; + else + return -EINVAL; + } + + /* + * Use greedy algorithm. Current argument consume as many command line + * arguments as possible. + */ + for (i = min(arg->max_args, argc); i >= arg->min_args; i--) { + struct mvx_argument *next = mvx_list_next_entry(arg, head); + int ret; + + ret = parse_positional(argp, next, argc - i, &argv[i]); + if (ret == 0) { + int j; + + for (j = 0; j < i; j++) + arg_push(arg, argv[j]); + + return 0; + } + } + + if (arg->optional != false) { + struct mvx_argument *next = mvx_list_next_entry(arg, head); + return parse_positional(argp, next, argc, argv); + } + + /* No valid combination was found. */ + return -EINVAL; +} + +/**************************************************************************** + * Exported functions + ****************************************************************************/ + +void mvx_argp_construct(struct mvx_argparse *argp) +{ + mvx_list_construct(&argp->optional); + mvx_list_construct(&argp->positional); +} + +void mvx_argp_destruct(struct mvx_argparse *argp) +{ + struct mvx_argument *arg; + struct mvx_list_head *tmp; + + mvx_list_for_each_entry_safe(&argp->optional, arg, head, tmp) { + mvx_list_del(&arg->head); + arg_delete(arg); + } + + mvx_list_for_each_entry_safe(&argp->positional, arg, head, tmp) { + mvx_list_del(&arg->head); + arg_delete(arg); + } +} + +int mvx_argp_add_opt(struct mvx_argparse *argp, + const char c, + const char *s, + bool optional, + int nargs, + const char *def, + const char *help) +{ + struct mvx_argument *arg; + + if (find_arg(argp, c, s) != NULL) { + fprintf(stderr, + "Error: Argument already exists. short='%c', long='%s'.\n", + c, s); + return -EINVAL; + } + + arg = arg_new(c, s, optional, nargs, def, help); + if (arg == NULL) + return -EINVAL; + + mvx_list_add_tail(&argp->optional, &arg->head); + + return 0; +} + +int mvx_argp_add_pos(struct mvx_argparse *argp, + const char *s, + bool optional, + int nargs, + const char *def, + const char *help) +{ + struct mvx_argument *arg; + + if (find_arg(argp, 0, s) != NULL) { + fprintf(stderr, "Error: Argument already exists. long='%s'.\n", + s); + return -EINVAL; + } + + arg = arg_new(0, s, optional, nargs, def, help); + if (arg == NULL) + return -EINVAL; + + mvx_list_add_tail(&argp->positional, &arg->head); + + return 0; +} + +int mvx_argp_parse(struct mvx_argparse *argp, + int argc, + const char **argv) +{ + struct mvx_argument *arg = NULL; + int i; + int ret; + + for (i = 0; i < argc; i++) { + if (strcmp(argv[i], "--") == 0) { + i++; + break; + } else if (strncmp(argv[i], "--", 2) == 0) { + size_t len = strlen(&argv[i][2]); + char __argv[len + 1]; + char *value; + + ret = arg_close(arg); + if (ret != 0) + return ret; + + memcpy(__argv, &argv[i][2], len + 1); + value = strchr(__argv, '='); + if (value != NULL) + *value++ = '\0'; + + arg = find_arg_long(&argp->optional, __argv); + if (arg == NULL) { + fprintf(stderr, + "Error: Could not find optional argument '--%s'.\n", + &argv[i][2]); + return -EINVAL; + } + + arg_open(arg); + if (value != NULL) { + ret = arg_push(arg, value); + if (ret <= 0) + return -EINVAL; + } + } else if (argv[i][0] == '-' && strlen(argv[i]) > 1) { + const char *c; + + for (c = &argv[i][1]; *c != '\0'; c++) { + ret = arg_close(arg); + if (ret != 0) + return ret; + + arg = find_arg_short(&argp->optional, *c); + if (arg == NULL) { + fprintf(stderr, + "Error: Could not find optional argument '-%c'.\n", + *c); + return -EINVAL; + } + + arg_open(arg); + + /* + * If this optional argument takes additional + * command line arguments, then the rest of the + * argument is treated as a value. + */ + if (strlen(&c[1]) > 0) { + ret = arg_push(arg, &c[1]); + if (ret > 0) + break; + } + } + } else if (arg != NULL) { + ret = arg_push(arg, argv[i]); + if (ret < 0) + return ret; + else if (ret == 0) + break; + } else { + break; + } + } + + ret = arg_close(arg); + if (ret != 0) + return ret; + + ret = parse_positional(argp, + mvx_list_first_entry(&argp->positional, + struct mvx_argument, + head), + argc - i, &argv[i]); + if (ret != 0) + return ret; + + mvx_list_for_each_entry(&argp->optional, arg, head) { + if (arg->optional == false && arg->is_set == false) { + fprintf(stderr, + "Error: Mandatory optional argument not set. short='-%c', long='--%s'.\n", + arg->arg_short, arg->arg_long); + return -EINVAL; + } + } + + return ret; +} + +const char *mvx_argp_get(struct mvx_argparse *argp, + const char *arg_long, + unsigned int index) +{ + struct mvx_argument *arg; + + arg = find_arg(argp, 0, arg_long); + if (arg == NULL) + return NULL; + + return arg_value(arg, index); +} + +int mvx_argp_get_int(struct mvx_argparse *argp, + const char *arg_long, + unsigned int index) +{ + const char *value; + int base = 10; + + value = mvx_argp_get(argp, arg_long, index); + if (value == NULL) + return 0; + + if (strncmp(value, "0x", 2) == 0 || strncmp(value, "0X", 2) == 0) + base = 16; + else if (value[0] == '0') + base = 8; + + return strtol(value, NULL, base); +} + +bool mvx_argp_is_set(struct mvx_argparse *argp, + const char *arg_long) +{ + struct mvx_argument *arg; + + arg = find_arg(argp, 0, arg_long); + if (arg == NULL) + return false; + + return arg->is_set; +} + +void mvx_argp_help(struct mvx_argparse *argp, + const char *exe) +{ + struct mvx_argument *arg; + + printf("usage: %s [optional] [positional]\n\n", exe); + + printf("positional arguments:\n"); + mvx_list_for_each_entry(&argp->positional, arg, head) { + printf("\t%s\n", arg->arg_long); + + if (arg->help) + printf("\t\t%s\n", arg->help); + } + + printf("\noptional arguments:\n"); + mvx_list_for_each_entry(&argp->optional, arg, head) { + char *delim = (char *)""; + + printf("\t"); + + if (arg->arg_short != 0) { + printf("-%c", arg->arg_short); + delim = (char *)", "; + } + + if (arg->arg_long != NULL) + printf("%s--%s", delim, arg->arg_long); + + printf("\n"); + + if (arg->help != NULL) + printf("\t\t%s\n", arg->help); + + if (arg->def != NULL) + printf("\t\tDefault: %s\n", arg->def); + } +} diff --git a/src/little/buildroot-ext/package/mvx_player/src/mvx_argparse.h b/src/little/buildroot-ext/package/mvx_player/src/mvx_argparse.h new file mode 100755 index 000000000..14cabfd1f --- /dev/null +++ b/src/little/buildroot-ext/package/mvx_player/src/mvx_argparse.h @@ -0,0 +1,139 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef __mvx_argp_H__ +#define __mvx_argp_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/**************************************************************************** + * Includes + ****************************************************************************/ + +#include "mvx_list.h" + +/**************************************************************************** + * Defines + ****************************************************************************/ + +#define mvx_argp_ZERO_OR_ONE -1 +#define mvx_argp_ZERO_OR_MORE -2 +#define mvx_argp_ONE_OR_MORE -3 + +/**************************************************************************** + * Types + ****************************************************************************/ + +enum mvx_argp_action { + MVX_ARGP_STORE, + MVX_ARGP_APPEND +}; + +struct mvx_argparse { + struct mvx_list optional; + struct mvx_list positional; +}; + +/**************************************************************************** + * Exported functions + ****************************************************************************/ + +/** + * mvx_argp_construct() - Construct argparse. + */ +void mvx_argp_construct(struct mvx_argparse *argp); + +/** + * mvx_argp_destruct() - Destruct argparse. + */ +void mvx_argp_destruct(struct mvx_argparse *argp); + +/** + * mvx_argp_add_opt() - Add optional argument. + */ +int mvx_argp_add_opt(struct mvx_argparse *argp, + const char arg_short, + const char *arg_long, + bool optional, + int nargs, + const char *def, + const char *help); + +/** + * mvx_argp_add_pos() - Add positional argument. + */ +int mvx_argp_add_pos(struct mvx_argparse *argp, + const char *arg_long, + bool optional, + int nargs, + const char *def, + const char *help); + +/** + * mvx_argp_parse() - Parse command line arguments. + */ +int mvx_argp_parse(struct mvx_argparse *argp, + int argc, + const char **argv); + +/** + * mvx_argp_parse() - Parse command line arguments. + */ +const char *mvx_argp_get(struct mvx_argparse *argp, + const char *arg_long, + unsigned int index); + +/** + * mvx_argp_get_int() - Parse command line arguments. + */ +int mvx_argp_get_int(struct mvx_argparse *argp, + const char *arg_long, + unsigned int index); + +/** + * mvx_argp_is_set() - Return if argument has been set. + */ +bool mvx_argp_is_set(struct mvx_argparse *argp, + const char *arg_long); + +/** + * mvx_argp_help() - Print help message. + */ +void mvx_argp_help(struct mvx_argparse *argp, + const char *exe); + +#ifdef __cplusplus +} +#endif + +#endif /* __mvx_argp_H__ */ diff --git a/src/little/buildroot-ext/package/mvx_player/src/mvx_decoder.cpp b/src/little/buildroot-ext/package/mvx_player/src/mvx_decoder.cpp new file mode 100755 index 000000000..7c173c2ec --- /dev/null +++ b/src/little/buildroot-ext/package/mvx_player/src/mvx_decoder.cpp @@ -0,0 +1,433 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "mvx_argparse.h" +#include "mvx_player.hpp" +#include + +using namespace std; + + +static void tokenize_values(const std::string &s, const char delim, std::vector&out) +{ + std::string::size_type beg = 0; + for (std::string::size_type end = 0; (end = s.find(delim, end)) != std::string::npos; ++end) + { + out.push_back(atoi(s.substr(beg, end - beg).c_str())); + beg = end + 1; + } + out.push_back(atoi(s.substr(beg).c_str())); +} + + +bool color_conversion_parse_coef(const char * conv_ceof_str,struct v4l2_mvx_color_conv_coef * conv_coef) +{ + std::vector ceof_list; + + tokenize_values(conv_ceof_str, ':', ceof_list); + if (ceof_list.size() == 12) + { + conv_coef->coef[0][0] = ceof_list[0]; + conv_coef->coef[0][1] = ceof_list[1]; + conv_coef->coef[0][2] = ceof_list[2]; + + conv_coef->coef[1][0] = ceof_list[3]; + conv_coef->coef[1][1] = ceof_list[4]; + conv_coef->coef[1][2] = ceof_list[5]; + + conv_coef->coef[2][0] = ceof_list[6]; + conv_coef->coef[2][1] = ceof_list[7]; + conv_coef->coef[2][2] = ceof_list[8]; + + + conv_coef->offset[0] = ceof_list[9]; + conv_coef->offset[1] = ceof_list[10]; + conv_coef->offset[2] = ceof_list[11]; + + } + cout << "color_conversion_parse_coef coef[0][0]( " << conv_coef->coef[0][0]<< ")" << endl; + cout << "color_conversion_parse_coef coef[0][1]( " << conv_coef->coef[0][1]<< ")" << endl; + cout << "color_conversion_parse_coef coef[0][2]( " << conv_coef->coef[0][2]<< ")" << endl; + cout << "color_conversion_parse_coef coef[1][0]( " << conv_coef->coef[1][0]<< ")" << endl; + cout << "color_conversion_parse_coef coef[1][1]( " << conv_coef->coef[1][1]<< ")" << endl; + cout << "color_conversion_parse_coef coef[1][2]( " << conv_coef->coef[1][2]<< ")" << endl; + cout << "color_conversion_parse_coef coef[2][0]( " << conv_coef->coef[2][0]<< ")" << endl; + cout << "color_conversion_parse_coef coef[2][1]( " << conv_coef->coef[2][1]<< ")" << endl; + cout << "color_conversion_parse_coef coef[2][2]( " << conv_coef->coef[2][2]<< ")" << endl; + cout << "color_conversion_parse_coef offset[0] ( " << conv_coef->offset[0]<< ")" << endl; + cout << "color_conversion_parse_coef offset[1] ( " << conv_coef->offset[1]<< ")" << endl; + cout << "color_conversion_parse_coef offset[2] ( " << conv_coef->offset[2]<< ")" << endl; + + if ( ( conv_coef->offset[0]<0 || conv_coef->offset[0]>255) + || ( conv_coef->offset[1]<0 || conv_coef->offset[1]>255) + || ( conv_coef->offset[2]<0 || conv_coef->offset[2]>255)) + { + return false; + } + return (ceof_list.size() == 12) ? true: false; +} +int main(int argc, const char *argv[]) +{ + int ret; + mvx_argparse argp; + uint32_t inputFormat; + uint32_t outputFormat; + const char *md5_filename = NULL; + ofstream *md5_os = NULL; + + mvx_argp_construct(&argp); + mvx_argp_add_opt(&argp, '\0', "dev", true, 1, "/dev/video0", "Device."); + mvx_argp_add_opt(&argp, 'i', "inputformat", true, 1, "h264", "Pixel format."); + mvx_argp_add_opt(&argp, 'o', "outputformat", true, 1, "yuv420", "Output pixel format."); + mvx_argp_add_opt(&argp, 'f', "format", true, 1, "ivf", "Input container format. [ivf, rcv, raw, rv]\n\t\tFor ivf input format will be taken from IVF header."); + mvx_argp_add_opt(&argp, 's', "strideAlign", true, 1, "1", "Stride alignment."); + mvx_argp_add_opt(&argp, 0, "stride0", true, 1, "1", "Number of bytes of stride for the first plane."); + mvx_argp_add_opt(&argp, 0, "stride1", true, 1, "1", "Number of bytes of stride for the second plane if have."); + mvx_argp_add_opt(&argp, 0, "stride2", true, 1, "1", "Number of bytes of stride for the third plane if have."); + mvx_argp_add_opt(&argp, 'y', "intbuf", true, 1, "1000000", "Limit of intermediate buffer size"); + mvx_argp_add_opt(&argp, 'm', "md5", true, 1, NULL, "Output md5 file"); + mvx_argp_add_opt(&argp, 'u', "nalu", true, 1, "0", "Nalu format, START_CODES (0) and ONE_NALU_PER_BUFFER (1), ONE_BYTE_LENGTH_FIELD (2), TWO_BYTE_LENGTH_FIELD (3), FOUR_BYTE_LENGTH_FIELD (4)."); + mvx_argp_add_opt(&argp, 'r', "rotate", true, 1, "0", "Rotation, 0 | 90 | 180 | 270"); + mvx_argp_add_opt(&argp, 'd', "downscale", true, 1, "1", "Down Scale, 1 | 2 | 4"); + mvx_argp_add_opt(&argp, 0, "memory", true, 1, "mmap", "support mmap and dma."); + mvx_argp_add_opt(&argp, 0, "input_thread", true, 1, "0", "read input buffer in other thread."); + mvx_argp_add_opt(&argp, 0, "dsl_ratio_hor", true, 1, "0", "Horizontal downscale ratio, [1, 256]"); + mvx_argp_add_opt(&argp, 0, "dsl_ratio_ver", true, 1, "0", "Vertical downscale ratio, [1, 128]"); + mvx_argp_add_opt(&argp, 0, "dsl_frame_width", true, 1, "0", "Downscaled frame width in pixels"); + mvx_argp_add_opt(&argp, 0, "dsl_frame_height", true, 1, "0", "Downscaled frame height in pixels"); + mvx_argp_add_opt(&argp, 0, "dsl_pos_mode", true, 1, "0", "Flexible Downscaled original position mode [0, 2], only availble in high precision mode." + "\t\tValue: 0 [default:x_original=(x_resized + 0.5)/scale - 0.5]" + "\t\tValue: 1 [x_original=x_reized/scale]" + "\t\tValue: 2 [x_original=(x_resized+0.5)/scale]"); + mvx_argp_add_opt(&argp, 0, "dsl_nearest_mode", true, 1, "0", "Downscaling Interpolation mode: 0: Bilinear(default), 1: Nearest"); + mvx_argp_add_opt(&argp, 0, "frames", true, 1, "0", "nr of frames to process"); + mvx_argp_add_opt(&argp, 0, "fro", true, 1, "1", "Frame reordering 1 is on (default), 0 is off"); + mvx_argp_add_opt(&argp, 0, "ish", true, 1, "0", "Ignore Stream Headers 1 is on, 0 is off (default)"); + mvx_argp_add_opt(&argp, 0, "trystop", true, 0, "0", "Try if Decoding Stop Command exixts"); + mvx_argp_add_opt(&argp, 0, "one_frame_per_packet", true, 0, "0", "Each input buffer contains one frame."); + mvx_argp_add_opt(&argp, 0, "framebuffer_cnt", true, 1, NULL, "Number of buffers to use for yuv data"); + mvx_argp_add_opt(&argp, 0, "bitbuffer_cnt", true, 1, NULL, "Number of buffers to use for bitstream data"); + mvx_argp_add_opt(&argp, 0, "interlaced", true, 0, "0", "Frames are interlaced"); + mvx_argp_add_opt(&argp, 0, "color_conversion", true, 1, "0", "decoder color conversion for ycbcr2rgb." + "\t\tValue: 0 [default:predefined standards bt601]" + "\t\tValue: 1 [predefined standards bt601f]" + "\t\tValue: 2 [predefined standards bt709]" + "\t\tValue: 3 [predefined standards bt709f]" + "\t\tValue: 4 [predefined standards bt2020]" + "\t\tValue: 5 [predefined standards bt2020f]"); + mvx_argp_add_opt(&argp, 0, "cust_yuv2rgb_coef", true, 1, "", "customized integer coeffiecents for decoder ycbcr2rgb y2r:u2r:v2r:y2g:u2g:v2g:y2b:u2b:v2b:yoffset:cboffste:croffset"); + mvx_argp_add_opt(&argp, 0, "disable_features", true, 1, 0, "Disable features bitmask:" + "\t\tb0=AFBC compression, b1=REF caching, b2=Deblock, b3=SAO,b5=Picture Output Removal, " + "\t\tb6=Pipe, b7=Sleep b8=LegacyAFBC, b9=FilmGrain b12=REFSZ limit"); + + mvx_argp_add_opt(&argp, 0, "dst_crop_x", true, 1, 0, "left start x of luma in output image"); + mvx_argp_add_opt(&argp, 0, "dst_crop_y", true, 1, 0, "top start y of luma in output image"); + mvx_argp_add_opt(&argp, 0, "dst_crop_width", true, 1, 0, "cropped width of luma in output image"); + mvx_argp_add_opt(&argp, 0, "dst_crop_height", true, 1, 0, "cropped height of luma in output image"); + + mvx_argp_add_opt(&argp, 0, "ad_stats", true, 1, "0", "Enable the output of Assertive Display (AD) statistics for decode (.adatst = frame level statistics, .thumbnail = luma thumbnail)"); + + mvx_argp_add_opt(&argp, 0, "tiled", true, 0, "disabled", "Use tiles for AFBC formats."); + mvx_argp_add_pos(&argp, "input", false, 1, "", "Input file."); + mvx_argp_add_pos(&argp, "output", false, 1, "", "Output file."); + mvx_argp_add_opt(&argp, 0, "seamless", true, 1, "", "seamless mode for mjepg. 0:disable 1:fixed buffer w/h fhd,1:fixed buffer uhd"); + + ret = mvx_argp_parse(&argp, argc - 1, &argv[1]); + if (ret != 0) + { + mvx_argp_help(&argp, argv[0]); + return 1; + } + + inputFormat = Codec::to4cc(mvx_argp_get(&argp, "inputformat", 0)); + if (inputFormat == 0) + { + fprintf(stderr, "Error: Illegal bitstream format. format=%s.\n", + mvx_argp_get(&argp, "inputformat", 0)); + return 1; + } + + ifstream is(mvx_argp_get(&argp, "input", 0)); + Input *inputFile; + if (string(mvx_argp_get(&argp, "format", 0)).compare("ivf") == 0) + { + inputFile = new InputIVF(is, inputFormat); + } + else if (string(mvx_argp_get(&argp, "format", 0)).compare("rcv") == 0) + { + inputFile = new InputRCV(is); + } + else if (string(mvx_argp_get(&argp, "format", 0)).compare("rv") == 0) + { + inputFile = new InputRV(is); + } + else if (string(mvx_argp_get(&argp, "format", 0)).compare("raw") == 0) + { + inputFile = new InputFile(is, inputFormat); + } + else + { + cerr << "Error: Unsupported container format. format=" << + mvx_argp_get(&argp, "format", 0) << "." << endl; + return 1; + } + int nalu_format = mvx_argp_get_int(&argp,"nalu",0); + int rotation = mvx_argp_get_int(&argp,"rotate",0); + int scale = mvx_argp_get_int(&argp,"downscale",0); + int frames = mvx_argp_get_int(&argp,"frames",0); + if (rotation % 90 != 0){ + cerr << "Unsupported rotation:"<.\n", md5_filename); + md5_os = new ofstream(md5_filename, ios::binary); + if(NULL == md5_os){ + fprintf(stderr, "Error: (NULL == md5_os).\n"); + return 1; + } + output = new OutputFileWithMD5(os, outputFormat, *md5_os, inputFormat == V4L2_PIX_FMT_AV1); + } + else if( mvx_argp_is_set(&argp, "ad_stats") && mvx_argp_get_int(&argp, "ad_stats", 0) !=0 + && mvx_argp_is_set(&argp, "seamless") && mvx_argp_get_int(&argp, "seamless", 0) !=0) + { + std::string thumbnail_file = std::string( mvx_argp_get(&argp, "output", 0)) + ".thumbnail"; + std::string ad_stats_file = std::string( mvx_argp_get(&argp, "output", 0)) + ".stats"; + output = new OutputFileWithADStats(os, outputFormat,ad_stats_file,thumbnail_file,inputFormat == V4L2_PIX_FMT_AV1); + } + else { + output = new OutputFile(os, outputFormat, inputFormat == V4L2_PIX_FMT_AV1); + } + } + + Decoder decoder(mvx_argp_get(&argp, "dev", 0), *inputFile, *output); + if (mvx_argp_is_set(&argp, "intbuf")) + { + decoder.setH264IntBufSize(mvx_argp_get_int(&argp, "intbuf", 0)); + } + if (mvx_argp_is_set(&argp, "fro")) + { + decoder.setFrameReOrdering(mvx_argp_get_int(&argp, "fro", 0)); + } + if (mvx_argp_is_set(&argp, "ish")) + { + decoder.setIgnoreStreamHeaders(mvx_argp_get_int(&argp, "ish", 0)); + } + if (mvx_argp_is_set(&argp, "trystop")) + { + decoder.tryStopCmd(true); + } + if (mvx_argp_is_set(&argp, "one_frame_per_packet")) + { + decoder.setNaluFormat(V4L2_OPT_NALU_FORMAT_ONE_FRAME_PER_BUFFER); + } else { + decoder.setNaluFormat(nalu_format); + } + if (mvx_argp_is_set(&argp, "input_thread")) + { + decoder.setInputThread(mvx_argp_get_int(&argp, "input_thread", 0)); + } + if (mvx_argp_is_set(&argp, "memory")) + { + const char *memory_type = mvx_argp_get(&argp, "memory", 0); + if (strcmp(memory_type, "mmap") == 0) { + decoder.setMemoryType(V4L2_MEMORY_MMAP); + } else if (strcmp(memory_type, "dma") == 0) { + decoder.setMemoryType(V4L2_MEMORY_DMABUF); + } else { + cerr<<"didnot support this memory type!!!"< 2) { + mode = 0; + } + decoder.setDSLMode(mode); + } + + if (mvx_argp_is_set(&argp, "dsl_nearest_mode")) { + assert(mvx_argp_is_set(&argp, "dsl_ratio_hor") || mvx_argp_is_set(&argp, "dsl_ratio_ver") || + mvx_argp_is_set(&argp, "dsl_frame_width") || mvx_argp_is_set(&argp, "dsl_frame_height")); + int mode = mvx_argp_get_int(&argp, "dsl_nearest_mode", 0); + if (mode < 0 || mode > 1) { + mode = 0; + } + decoder.setDSLInterpMode(mode); + } + + if (mvx_argp_is_set(&argp, "disable_features")) { + decoder.setDisabledFeatures(mvx_argp_get_int(&argp, "disable_features", 0)); + } + + if (mvx_argp_is_set(&argp, "color_conversion")) + { + int conv_mode = mvx_argp_get_int(&argp, "color_conversion", 0); + if (conv_mode < 0 || conv_mode > 5) { + conv_mode = 0; + } + decoder.setColorConversion(conv_mode); + } + + if (mvx_argp_is_set(&argp, "cust_yuv2rgb_coef")) + { + assert(!mvx_argp_is_set(&argp, "color_conversion")); + struct v4l2_mvx_color_conv_coef conv_coef; + if(true==color_conversion_parse_coef(mvx_argp_get(&argp, "cust_yuv2rgb_coef", 0),&conv_coef)) + decoder.setCustColorConvCoef(&conv_coef); + else + cerr << "invalid yuv2rgb csd coef params,pls check " << endl; + } + + + if (mvx_argp_is_set(&argp, "dst_crop_x") && mvx_argp_is_set(&argp, "dst_crop_y") + && mvx_argp_is_set(&argp, "dst_crop_width") && mvx_argp_is_set(&argp, "dst_crop_height")) + { + assert(!mvx_argp_is_set(&argp, "dsl_ratio_hor") && !mvx_argp_is_set(&argp, "dsl_ratio_ver")); + assert(!mvx_argp_is_set(&argp, "dsl_frame_width") && !mvx_argp_is_set(&argp, "dsl_frame_height")); + assert(rotation == 0); + assert(mvx_argp_get_int(&argp, "dst_crop_x", 0) %4==0); + assert(mvx_argp_get_int(&argp, "dst_crop_y", 0) %4==0); + assert(mvx_argp_get_int(&argp, "dst_crop_width", 0) %4==0); + assert(mvx_argp_get_int(&argp, "dst_crop_height", 0) %4==0); + assert(mvx_argp_get_int(&argp, "dst_crop_width", 0) >0); + assert(mvx_argp_get_int(&argp, "dst_crop_height", 0) >0); + + struct v4l2_mvx_crop_cfg dst_crop; + dst_crop.crop_en =1; + dst_crop.x = mvx_argp_get_int(&argp, "dst_crop_x", 0); + dst_crop.y = mvx_argp_get_int(&argp, "dst_crop_y", 0); + dst_crop.width = mvx_argp_get_int(&argp, "dst_crop_width", 0); + dst_crop.height = mvx_argp_get_int(&argp, "dst_crop_height", 0); + decoder.setDecDstCrop(&dst_crop); + } + + if (mvx_argp_is_set(&argp, "stride0") || mvx_argp_is_set(&argp, "stride1") || + mvx_argp_is_set(&argp, "stride2")) { + size_t stride[VIDEO_MAX_PLANES] = {0}; + stride[0] = mvx_argp_get_int(&argp, "stride0", 0); + stride[1] = mvx_argp_get_int(&argp, "stride1", 0); + stride[2] = mvx_argp_get_int(&argp, "stride2", 0); + decoder.setStride(stride); + } + if(mvx_argp_is_set(&argp, "seamless") && mvx_argp_get_int(&argp, "seamless", 0) !=0) + { + unsigned int target_width = 1920; + unsigned int target_height =1088; + struct v4l2_mvx_seamless_target seamless; + seamless.seamless_mode = mvx_argp_get_int(&argp, "seamless", 0); + + if(mvx_argp_get_int(&argp, "seamless", 0) == 1) + { + target_width = 1920; + target_height =1088; + } + else if(mvx_argp_get_int(&argp, "seamless", 0) == 2) + { + target_width = 3840; + target_height =2160; + } + else if(mvx_argp_get_int(&argp, "seamless", 0) == 3) + { + target_width = 4096; + target_height =2304; + } + + seamless.target_width = target_width; + seamless.target_height = target_height; + decoder.setSeamlessTarget(outputFormat,&seamless); + + if(mvx_argp_is_set(&argp, "ad_stats")) + { + decoder.setAdStats(mvx_argp_get_int(&argp, "ad_stats", 0)); + } + + } + + + + decoder.setInterlaced(interlaced); + decoder.setRotation(rotation); + decoder.setDownScale(scale); + decoder.setFrameCount(frames); + decoder.setFrameBufCnt(mvx_argp_get_int(&argp, "framebuffer_cnt", 0)); + decoder.setBitBufCnt(mvx_argp_get_int(&argp, "bitbuffer_cnt", 0)); + ret = decoder.stream(); + + delete inputFile; + delete output; + if(md5_os){ + delete md5_os; + } + + return ret; +} diff --git a/src/little/buildroot-ext/package/mvx_player/src/mvx_decoder_multi.cpp b/src/little/buildroot-ext/package/mvx_player/src/mvx_decoder_multi.cpp new file mode 100755 index 000000000..df5a909fc --- /dev/null +++ b/src/little/buildroot-ext/package/mvx_player/src/mvx_decoder_multi.cpp @@ -0,0 +1,154 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "mvx_argparse.h" +#include "mvx_player.hpp" +#include +#include +#include + +using namespace std; + +struct job +{ + job(const char *dev, + const string &inputFile, const uint32_t inputFormat, + const string &outputFile, const uint32_t outputFormat, + const size_t outputStride) : + dev(dev), + inputFile(inputFile), + inputFormat(inputFormat), + outputFile(outputFile), + outputFormat(outputFormat), + outputStride(outputStride), + ret(0) + {} + + const char *dev; + string inputFile; + uint32_t inputFormat; + string outputFile; + uint32_t outputFormat; + size_t outputStride; + int ret; +}; + +void *decodeThread(void *arg) +{ + job *j = static_cast(arg); + + ifstream is(j->inputFile.c_str()); + ofstream os(j->outputFile.c_str()); + string logf = j->outputFile + ".log"; + ofstream log(logf.c_str()); + + InputFile inputFile = InputFile(is, j->inputFormat); + OutputFile outputFile = OutputFile(os, j->outputFormat); + + Decoder decoder(j->dev, inputFile, outputFile, true, log); + j->ret = decoder.stream(); + + return j; +} + +int main(int argc, const char *argv[]) +{ + int ret; + mvx_argparse argp; + uint32_t inputFormat; + uint32_t outputFormat; + int nsessions; + + mvx_argp_construct(&argp); + mvx_argp_add_opt(&argp, '\0', "dev", true, 1, "/dev/video0", "Device."); + mvx_argp_add_opt(&argp, 'i', "inputformat", true, 1, "h264", "Pixel format."); + mvx_argp_add_opt(&argp, 'o', "outputformat", true, 1, "yuv420", "Output pixel format."); + mvx_argp_add_opt(&argp, 's', "stride", true, 1, "1", "Stride alignment."); + mvx_argp_add_opt(&argp, 'n', "nsessions", true, 1, "1", "Number of sessions."); + mvx_argp_add_pos(&argp, "input", false, 1, "", "Input file."); + mvx_argp_add_pos(&argp, "output", false, 1, "", "Output file."); + + ret = mvx_argp_parse(&argp, argc - 1, &argv[1]); + if (ret != 0) + { + mvx_argp_help(&argp, argv[0]); + return 1; + } + + inputFormat = Codec::to4cc(mvx_argp_get(&argp, "inputformat", 0)); + if (inputFormat == 0) + { + fprintf(stderr, "Error: Illegal bitstream format. format=%s.\n", + mvx_argp_get(&argp, "inputformat", 0)); + return 1; + } + + outputFormat = Codec::to4cc(mvx_argp_get(&argp, "outputformat", 0)); + if (outputFormat == 0) + { + fprintf(stderr, "Error: Illegal frame format. format=%s.\n", + mvx_argp_get(&argp, "outputformat", 0)); + return 1; + } + + nsessions = mvx_argp_get_int(&argp, "nsessions", 0); + + pthread_t tid[nsessions]; + for (int i = 0; i < nsessions; ++i) + { + stringstream ss; + int ret; + + ss << mvx_argp_get(&argp, "output", 0) << "." << i; + job *j = new job(mvx_argp_get(&argp, "dev", 0), + string(mvx_argp_get(&argp, "input", 0)), + inputFormat, ss.str(), outputFormat, + mvx_argp_get_int(&argp, "stride", 0)); + + ret = pthread_create(&tid[i], NULL, decodeThread, j); + if (ret != 0) + { + throw Exception("Failed to create input thread."); + } + } + + ret = 0; + for (int i = 0; i < nsessions; ++i) + { + job *j; + + pthread_join(tid[i], reinterpret_cast(&j)); + ret += j->ret; + delete(j); + } + + return ret; +} diff --git a/src/little/buildroot-ext/package/mvx_player/src/mvx_encoder.cpp b/src/little/buildroot-ext/package/mvx_player/src/mvx_encoder.cpp new file mode 100755 index 000000000..eadcc7aca --- /dev/null +++ b/src/little/buildroot-ext/package/mvx_player/src/mvx_encoder.cpp @@ -0,0 +1,1414 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "mvx_argparse.h" +#include "mvx_player.hpp" +#include + +using namespace std; +#define CFG_FILE_LINE_SIZE (6144) +static char cfg_file_line_buf[CFG_FILE_LINE_SIZE]; + +static bool encode_get_huffman_table(FILE* file, uint32_t type, + uint8_t *bits, uint8_t* values ) +{ + const char *table_name_bits; + const char *table_name_val; + + if (type == V4L2_OPT_HUFFMAN_TABLE_DC_LUMA) + { + table_name_bits = "DHT_luma_dc_bits"; + table_name_val = "DHT_luma_dc_val"; + } + else if (type == V4L2_OPT_HUFFMAN_TABLE_DC_CHROMA) + { + table_name_bits = "DHT_chroma_dc_bits"; + table_name_val = "DHT_chroma_dc_val"; + } + else if (type == V4L2_OPT_HUFFMAN_TABLE_AC_LUMA) + { + table_name_bits = "DHT_luma_ac_bits"; + table_name_val = "DHT_luma_ac_val"; + } + else + { + assert(type == V4L2_OPT_HUFFMAN_TABLE_AC_CHROMA); + + table_name_bits = "DHT_chroma_ac_bits"; + table_name_val = "DHT_chroma_ac_val"; + } + + bool load_bits = false; + bool load_val = false; + uint32_t temp; + + while(fgets(cfg_file_line_buf, CFG_FILE_LINE_SIZE, file) != NULL) + { + if (strstr(cfg_file_line_buf, table_name_bits) != NULL) + { + if (fgets(cfg_file_line_buf, CFG_FILE_LINE_SIZE, file) != NULL) + { + if (strcmp(cfg_file_line_buf, "{\n") == 0) + { + for (int i = 0; i < 16; i++) + { + if (fscanf(file, "0x%x, ", &temp) != 1) + { + cerr<<"Failed to load entry from huffman table file"<&out) +{ + std::string::size_type beg = 0; + for (std::string::size_type end = 0; (end = s.find(delim, end)) != std::string::npos; ++end) + { + out.push_back(atoi(s.substr(beg, end - beg).c_str())); + beg = end + 1; + } + out.push_back(atoi(s.substr(beg).c_str())); +} + + +bool color_conversion_parse_coef(const char * conv_ceof_str,struct v4l2_mvx_rgb2yuv_color_conv_coef * conv_coef) +{ + std::vector ceof_list; + + tokenize_values(conv_ceof_str, ':', ceof_list); + if (ceof_list.size() == 15) + { + conv_coef->coef[0] = ceof_list[0]; + conv_coef->coef[1] = ceof_list[1]; + conv_coef->coef[2] = ceof_list[2]; + + conv_coef->coef[3] = ceof_list[3]; + conv_coef->coef[4] = ceof_list[4]; + conv_coef->coef[5] = ceof_list[5]; + + conv_coef->coef[6] = ceof_list[6]; + conv_coef->coef[7] = ceof_list[7]; + conv_coef->coef[8] = ceof_list[8]; + + + conv_coef->luma_range[0] = ceof_list[9]; + conv_coef->luma_range[1] = ceof_list[10]; + conv_coef->chroma_range[0] = ceof_list[11]; + conv_coef->chroma_range[1] = ceof_list[12]; + conv_coef->rgb_range[0] = ceof_list[13]; + conv_coef->rgb_range[1] = ceof_list[14]; + } + cout << "color_conversion_parse_coef" << endl; + for(int i = 0 ; i< 10; i++){ + cout << conv_coef->coef[i] << " "; + } + cout << endl; + cout << "conv_coef->luma_range" << conv_coef->luma_range[0] <<" "<< conv_coef->luma_range[1] << endl; + cout << "conv_coef->chroma_range" << conv_coef->chroma_range[0] << " " << conv_coef->chroma_range[1] << endl; + cout << "conv_coef->rgb_range" << conv_coef->rgb_range[0] << " "<< conv_coef->rgb_range[1] << endl; + return (ceof_list.size() == 15) ? true: false; +} + +int main(int argc, const char *argv[]) +{ + int ret; + mvx_argparse argp; + uint32_t inputFormat; + uint32_t outputFormat; + uint32_t width, height; + const char *roi_file = NULL; + const char *epr_file = NULL; + struct v4l2_osd_info osd_info; + memset(&osd_info, 0, sizeof(struct v4l2_osd_info)); + + mvx_argp_construct(&argp); + mvx_argp_add_opt(&argp, '\0', "dev", true, 1, "/dev/video0", "Device."); + mvx_argp_add_opt(&argp, 'i', "inputformat", true, 1, "yuv420", "Pixel format."); + mvx_argp_add_opt(&argp, 'o', "outputformat", true, 1, "h264", "Output pixel format."); + mvx_argp_add_opt(&argp, 'f', "format", true, 1, "ivf", "Output container format. [ivf, raw]"); + mvx_argp_add_opt(&argp, 'w', "width", true, 1, "1920", "Width."); + mvx_argp_add_opt(&argp, 'h', "height", true, 1, "1080", "Height."); + mvx_argp_add_opt(&argp, 0, "visible_width", true, 1, "0", "Visible Width."); + mvx_argp_add_opt(&argp, 0, "visible_height", true, 1, "0", "Visible Height."); + mvx_argp_add_opt(&argp, 's', "strideAlign", true, 1, "1", "Stride alignment."); + mvx_argp_add_opt(&argp, 0, "stride0", true, 1, "1", "Number of bytes of stride for the first plane."); + mvx_argp_add_opt(&argp, 0, "stride1", true, 1, "1", "Number of bytes of stride for the second plane if have."); + mvx_argp_add_opt(&argp, 0, "stride2", true, 1, "1", "Number of bytes of stride for the third plane if have."); + mvx_argp_add_opt(&argp, 0, "mirror", true, 1, "0", "mirror, 1 : horizontal; 2 : vertical."); + mvx_argp_add_opt(&argp, 'r', "rotate", true, 1, "0", "Rotation, 0 | 90 | 180 | 270"); + mvx_argp_add_opt(&argp, 0, "roi_cfg", true, 1, NULL, "ROI config file."); + mvx_argp_add_opt(&argp, 0, "frames", true, 1, "0", "nr of frames to process"); + mvx_argp_add_opt(&argp, 0, "epr_cfg", true, 1, NULL, "Encode Parameter Records config file name"); + mvx_argp_add_opt(&argp, 0, "idr_cfg", true, 1, NULL, "Encode config file to set IDR flag on pic index"); + mvx_argp_add_opt(&argp, 0, "chr_cfg", true, 1, NULL, "Encode Change Rectangle config file name"); + mvx_argp_add_opt(&argp, 0, "rate_control", true, 1, "off", "Selects rate control type, constant/variable/off"); + mvx_argp_add_opt(&argp, 0, "target_bitrate", true, 1, "0", "If rate control is enabled, this option sets target bitrate"); + mvx_argp_add_opt(&argp, 0, "max_bitrate", true, 1, "0", "If rate control is enabled, this option sets maximum bitrate"); + mvx_argp_add_opt(&argp, 0, "rc_bit_i_mode", true, 1, "0", "0 or 1, rc_bit_i_mode for rate control (for I frames)"); + mvx_argp_add_opt(&argp, 0, "rc_bit_ratio_i", true, 1, "0", "1 ~ 100 rc_bit_ratio_i for rate control (for I frames)"); + mvx_argp_add_opt(&argp, 0, "gop", true, 1, "0", "GOP: 0 is None, 1 is Bidi, 2 is Low delay, 3 is Pyramid, 4 is Svct-3, 5 is gdr"); + mvx_argp_add_opt(&argp, 0, "pframes", true, 1, "0", "Number of P frames"); + mvx_argp_add_opt(&argp, 0, "bframes", true, 1, "0", "Number of B frames"); + mvx_argp_add_opt(&argp, 'n', "minqp", true, 1, "0", "min QP for rate control"); + mvx_argp_add_opt(&argp, 'm', "maxqp", true, 1, "51", "max QP for rate control"); + mvx_argp_add_opt(&argp, 't', "tier", true, 1, "2", "Profile."); + mvx_argp_add_opt(&argp, 'l', "level", true, 1, "1", "Level."); + mvx_argp_add_opt(&argp, 'v', "fps", true, 1, "24", "Frame rate."); + mvx_argp_add_opt(&argp, 0, "ecm", true, 1, "1", "0 is CAVLC, 1 is CABAC"); + mvx_argp_add_opt(&argp, 0, "bitdepth", true, 1, "8", "Set other bitdepth,invalid value 8 | 10.used for 10bit source encode as 8bit"); + mvx_argp_add_opt(&argp, 'q', "fixedqp", true, 1, "20", "fixed QP for I P B frames. If it is combined with -x then the value will later be increased with 2."); + mvx_argp_add_opt(&argp, 0, "qpi", true, 1, "20", "fixed QP for I frames."); + mvx_argp_add_opt(&argp, 0, "qpb", true, 1, "20", "fixed QP for B frames."); + mvx_argp_add_opt(&argp, 0, "qpp", true, 1, "20", "fixed QP for P frames."); + mvx_argp_add_opt(&argp, 0, "memory", true, 1, "mmap", "support mmap and dma."); + mvx_argp_add_opt(&argp, 0, "crop_left", true, 1, "0", "encoder SPS crop param, left offset"); + mvx_argp_add_opt(&argp, 0, "crop_right", true, 1, "0", "encoder SPS crop param, right offset"); + mvx_argp_add_opt(&argp, 0, "crop_top", true, 1, "0", "encoder SPS crop param, top offset"); + mvx_argp_add_opt(&argp, 0, "crop_bottom", true, 1, "0", "encoder SPS crop param, bottom offset"); + mvx_argp_add_opt(&argp, 0, "input_thread", true, 1, "0", "read input buffer in other thread."); + + mvx_argp_add_opt(&argp, 0, "colour_description_range", true, 1, "0", "VUI param: Colour description; range\n" + "\t\tValue: 0=Unspecified, 1=Limited, 2=Full"); + mvx_argp_add_opt(&argp, 0, "colour_primaries", true, 1, "0", "VUI param: Colour description; colour primaries (0-255, see hevc spec. E.3.1)\n" + "\t\tValue: 0=Unspecified, 1=BT709, 2=BT470M, 3=BT601_625, 4=T601_525, 5=GENERIC_FILM, 6=BT2020"); + mvx_argp_add_opt(&argp, 0, "transfer_characteristics", true, 1, "0", "VUI param: Colour description; transfer characteristics (0-255, see hevc spec. E.3.1)\n" + "\t\tValue: 0=Unspecified, 1=LINEAR, 2=SRGB, 3=SMPTE170M, 4=GAMMA22, 5=GAMMA28, 6=ST2084, 7=HLG, 8=SMPTE240M, 9=XVYCC, 10=BT1361, 11=ST428"); + mvx_argp_add_opt(&argp, 0, "matrix_coeff", true, 1, "0", "VUI param: Colour description; matrix coefficients (0-255, see hevc spec. E.3.1)\n" + "\t\tValue: 0=Unspecified, 1=BT709, 2=BT470M, 3=BT601, 4=SMPTE240M, 5=T2020, 6=BT2020Constant"); + mvx_argp_add_opt(&argp, 0, "time_scale", true, 1, "0", "VUI param: vui_time_scale"); + mvx_argp_add_opt(&argp, 0, "num_units_in_tick", true, 1, "0", "VUI param: vui_num_units_in_tick"); + mvx_argp_add_opt(&argp, 0, "aspect_ratio_idc", true, 1, "0", "VUI param: aspect_ratio_idc. [0,255]"); + mvx_argp_add_opt(&argp, 0, "sar_width", true, 1, "0", "VUI param: sar_width"); + mvx_argp_add_opt(&argp, 0, "sar_height", true, 1, "0", "VUI param: sar_height"); + mvx_argp_add_opt(&argp, 0, "video_format", true, 1, "0", "VUI param: video_format. (0-5, see hevc spec. E.3.1)\n" + "\t\tValue: 0=Component, 2=PAL, 2=NTSC, 3=SECAM, 4=MAC, 5=Unspecified"); + + mvx_argp_add_opt(&argp, 0, "sei_mastering_display", true, 1, "0", "SEI param : mastering display 's parameters"); + mvx_argp_add_opt(&argp, 0, "sei_content_light", true, 1, "0", "SEI param : sei_content_light"); + mvx_argp_add_opt(&argp, 0, "sei_user_data_unregistered", true, 1, "0", "SEI param : user data unregisterd"); + mvx_argp_add_opt(&argp, 0, "hrd_buffer_size", true, 1, "0", "Hypothetical Reference Decoder buffer size relative to the bitrate (in seconds) for rate control" + "\t\tValue: should bigger than target_bitrate/fps on normal case"); + mvx_argp_add_opt(&argp, 0, "ltr_mode", true, 1, "0", "encoder long term reference mode,range from 1 to 8 (inclusive)\n" + "\t\t1: LDP-method-1 | 2: LDP-method-2 | 3: LDB-method-1 | 4: LDB-method-2\n" + "\t\t5: BiDirection-method-1 | 6: BiDirection-method-2 | 7: Pyrimid-method-1 | 8: Pyrimid-method-2\n"); + mvx_argp_add_opt(&argp, 0, "ltr_period", true, 1, "0", "encoder long term reference period, range from 1 to 255 (inclusive)"); + mvx_argp_add_pos(&argp, "input", false, 1, "", "Input file."); + mvx_argp_add_pos(&argp, "output", false, 1, "", "Output file."); + mvx_argp_add_opt(&argp, 0, "trystop", true, 0, "0", "Try if Encoding Stop Command exixts"); + mvx_argp_add_opt(&argp, 0, "restart_interval", true, 1, "-1", "JPEG restart interval."); + mvx_argp_add_opt(&argp, 0, "quality", true, 1, "0", "JPEG compression quality. [1-100, 0 - default]"); + mvx_argp_add_opt(&argp, 0, "enc_stats_mode", true, 1, "0", "Only availble in H264ENC and HEVCENC, encode data statistics mode bitmask:{b0=MMS On/Off(MAD, MSE, SATD); b1=BITCOST}. Default is all off"); + mvx_argp_add_opt(&argp, 0, "enc_stats_cfg", true, 1, NULL, "enc stats cfg file, [$pic_index-$stats_mode]"); + mvx_argp_add_opt(&argp, 0, "miniframe_height", true, 1, "0", "one input frame was seperated in several input buffer"); + + mvx_argp_add_opt(&argp, 0, "packet_mbs", true, 1, "0", "Number of coding units (Macroblocks/CTUs) per slice"); + mvx_argp_add_opt(&argp, 0, "constrained_intra_pred", true, 1, "0", "constrained_intra_pred"); + mvx_argp_add_opt(&argp, 0, "nQpMinI", true, 1, "0", "nQpMinI for rate control (for I frames)"); + mvx_argp_add_opt(&argp, 0, "nQpMaxI", true, 1, "0", "nQpMaxI for rate control (for I frames)"); + mvx_argp_add_opt(&argp, 0, "init_qpi", true, 1, "0", "0 ~ 51, set init_qpi by user"); + mvx_argp_add_opt(&argp, 0, "init_qpp", true, 1, "0", "0 ~ 51, set init_qpi by user"); + mvx_argp_add_opt(&argp, 0, "sao_luma_dis", true, 1, "0", "sao luma disable"); + mvx_argp_add_opt(&argp, 0, "sao_chroma_dis", true, 1, "0", "sao chroma disable"); + mvx_argp_add_opt(&argp, 0, "qp_delta_i_p", true, 1, "0", "0 ~ 51, set init_qpi by user"); + mvx_argp_add_opt(&argp, 0, "ref_rb_en", true, 1, "0", "Enable/Disable reference ring buffer feature [1:enable, 0:disable], default is disable"); + mvx_argp_add_opt(&argp, 0, "rc_qp_clip_top", true, 1, "0", "encoder : rc qp clip top, range [0, 51], but must less than --rc_qp_clip_bottom"); + mvx_argp_add_opt(&argp, 0, "rc_qp_clip_bottom", true, 1, "0", "encoder : rc qp clip top, range [0, 51], but must greater than --rc_qp_clip_top"); + mvx_argp_add_opt(&argp, 0, "qpmap_clip_top", true, 1, "0", "encoder : qpmap clip top, range [0, 51], but must less than --qpmap_clip_bottom"); + mvx_argp_add_opt(&argp, 0, "qpmap_clip_bottom", true, 1, "0", "encoder : qpmap clip top, range [0, 51], but must greater than --qpmap_clip_top"); + mvx_argp_add_opt(&argp, 0, "xsearch_range", true, 1, "0", "Search range for suitable MBs in x direction"); + mvx_argp_add_opt(&argp, 0, "ysearch_range", true, 1, "0", "Search range for suitable MBs in y direction"); + mvx_argp_add_opt(&argp, 0, "profiling", true, 1, "0", "debug purpose, disable by default"); + + mvx_argp_add_opt(&argp, 0, "svct3_level1_peroid", true, 1, "0", "encoder SVCT3 level 1 peroid: must be an even number and range from 4 to 250 (inclusive)"); + mvx_argp_add_opt(&argp, 0, "intermediate_buffer_size", true, 1, "0", "intermediate_buffer_size"); + + mvx_argp_add_opt(&argp, 0, "qscale", true, 1, "0", "Quantization table scaler (JPEG only)"); + mvx_argp_add_opt(&argp, 0, "qscale_luma", true, 1, "0", "Luma Quantization table scaler (JPEG only)"); + mvx_argp_add_opt(&argp, 0, "qscale_chroma", true, 1, "0", "Chroma Quantization table scaler (JPEG only)"); + mvx_argp_add_opt(&argp, 0, "huff_table", true, 1, NULL, "File to load huffman table to JPEG encoder (JPEG only)"); + + mvx_argp_add_opt(&argp, 0, "reset_gop_cfg", true, 1, NULL, "Set reset gop config file, [20-5] means frame-20 reset gop and pframes use 5"); + mvx_argp_add_opt(&argp, 0, "reset_ltr_peroid_cfg", true, 1, NULL, "Set LTR peroid dynamiclly, only support LDP of H264 and HEVC now"); + + mvx_argp_add_opt(&argp, 0, "gdr_number", true, 1, NULL, "The number of GDR frames per group"); + mvx_argp_add_opt(&argp, 0, "gdr_period", true, 1, NULL, "The number of normal P frames between two group of GDR frames"); + + mvx_argp_add_opt(&argp, 0, "scd_enable", true, 1, NULL, "Enable scene change detection"); + mvx_argp_add_opt(&argp, 0, "scd_percent", true, 1, NULL, "0 ~ 100,The percentage of stripe are calculated for scene change detection"); + mvx_argp_add_opt(&argp, 0, "scd_threshold", true, 1, NULL, "0 ~ 2047,Threshold of scene change"); + mvx_argp_add_opt(&argp, 0, "aq_ssim_en", true, 1, NULL, "Enable SSIM driven adaptive quantizatoin.For H.264/HEVC only"); + mvx_argp_add_opt(&argp, 0, "aq_neg_ratio", true, 1, NULL, "0 ~ 63,The weight of negative delta QP.For H.264/HEVC only"); + mvx_argp_add_opt(&argp, 0, "aq_pos_ratio", true, 1, NULL, "0 ~ 63,The weight of positive delta QP.For H.264/HEVC only"); + mvx_argp_add_opt(&argp, 0, "aq_qpdelta_lmt", true, 1, NULL, "0 ~ 7,The boundary of delta QP.For H.264/HEVC only"); + mvx_argp_add_opt(&argp, 0, "aq_init_frm_avg_svar", true, 1, NULL, "0 ~ 15,Initial frame variance for aq ssim.For H.264/HEVC only"); + + mvx_argp_add_opt(&argp, 0, "multi_sps_pps", true, 1, NULL, "Support multi SPS PSS for h264 and hevc"); + mvx_argp_add_opt(&argp, 0, "turn_visual", true, 1, NULL, "Pursue subjective optimization rather than BD-rate"); + + mvx_argp_add_opt(&argp, 0, "forced_uv_value", true, 1, NULL, "Set forced uv valule to YUV format. The uv value represented in 10b(0~1023),recommend value:512. Supported formats:\n" + "\tyuv444 yuv444_10 yuv420 yuv_i42010 gray gray_10"); + mvx_argp_add_opt(&argp, 0, "422to420", true, 1, NULL, "chroma format use 4:2:2 or 4:2:0,default is 420,set value 2 will use 422,only used for mjpeg 422 source to select use 420 or 422 encode"); + mvx_argp_add_opt(&argp, 0, "cust_rgb2yuv_range", true, 1, "", "customized integer coeffiecents for encoder rgb2yuv r2y:g2y:b2y:r2u:g2u:b2u:r2v:g2v:b2v:luma_offset[0]:luma_offset[1]:chroma_offste[0]:chroma_offste[1]:rgb_offset[0]:rgb_offset[1],the coefficients bit-length is 15 bits"); + mvx_argp_add_opt(&argp, 0, "rgb2yuv_color_conversion", true, 1, "0", "decoder color conversion for rgb2yuv." + "\t\tValue: 0 [default:predefined standards bt601]" + "\t\tValue: 1 [predefined standards bt601f]" + "\t\tValue: 2 [predefined standards bt709]" + "\t\tValue: 3 [predefined standards bt709f]" + "\t\tValue: 4 [predefined standards bt2020]" + "\t\tValue: 5 [predefined standards bt2020f]"); + mvx_argp_add_opt(&argp, 0, "src_crop_x", true, 1, 0, "left start x of luma in original image"); + mvx_argp_add_opt(&argp, 0, "src_crop_y", true, 1, 0, "top start y of luma in original image"); + mvx_argp_add_opt(&argp, 0, "src_crop_width", true, 1, 0, "cropped width of luma in original image"); + mvx_argp_add_opt(&argp, 0, "src_crop_height", true, 1, 0, "cropped height of luma in original image"); + + mvx_argp_add_opt(&argp, 0, "adaptive_intra_block", true, 1, 0, "0: disable adaptive_intra_block function, 1: enable --scd_en and adaptive_intra_block"); + mvx_argp_add_opt(&argp, 0, "change_pos", true, 1, 0, "If rate control is enabled (with option --rate_control...), this option indicates the ratio of the max_bitrate when CVBR starts to adjust " + "QP to the maximum bitrate[50 100]."); + + mvx_argp_add_opt(&argp, 0, "framebuffer_cnt", true, 1, NULL, "Number of buffers to use for yuv data"); + mvx_argp_add_opt(&argp, 0, "bitbuffer_cnt", true, 1, NULL, "Number of buffers to use for encoded data"); + + mvx_argp_add_opt(&argp, 0, "osd_cfg", true, 1, NULL, "OSD config file name"); + mvx_argp_add_opt(&argp, 0, "osd_infile", true, 1, NULL, "osd in_file_1"); + mvx_argp_add_opt(&argp, 0, "osd_width", true, 1, NULL, "Width of osd 0 images in pixels"); + mvx_argp_add_opt(&argp, 0, "osd_height", true, 1, NULL, "Height of osd 0 images in pixels"); + mvx_argp_add_opt(&argp, 0, "osd_color", true, 1, "rgb1555", "Osd 0 buffer color format. Default is agrb1555. supported:argb4444, rgb565"); + + mvx_argp_add_opt(&argp, 0, "osd_infile2", true, 1, NULL, "osd in_file_2"); + mvx_argp_add_opt(&argp, 0, "osd_width2", true, 1, NULL, "Width of osd 1 images in pixels"); + mvx_argp_add_opt(&argp, 0, "osd_height2", true, 1, NULL, "Height of osd 1 images in pixels"); + mvx_argp_add_opt(&argp, 0, "osd_color2", true, 1, "rgb1555", "Osd 1 buffer color format. Default is agrb1555. supported:argb4444, rgb565"); + + ret = mvx_argp_parse(&argp, argc - 1, &argv[1]); + width = mvx_argp_get_int(&argp, "width", 0); + height = mvx_argp_get_int(&argp, "height", 0); + if (ret != 0) + { + mvx_argp_help(&argp, argv[0]); + return 1; + } + + inputFormat = Codec::to4cc(mvx_argp_get(&argp, "inputformat", 0)); + if (inputFormat == 0) + { + fprintf(stderr, "Error: Illegal frame format. format=%s.\n", + mvx_argp_get(&argp, "inputformat", 0)); + return 1; + } + + outputFormat = Codec::to4cc(mvx_argp_get(&argp, "outputformat", 0)); + if (outputFormat == 0) + { + fprintf(stderr, "Error: Illegal bitstream format. format=%s.\n", + mvx_argp_get(&argp, "outputformat", 0)); + return 1; + } + ifstream is(mvx_argp_get(&argp, "input", 0)); + Input *inputFile; + ifstream *roi_stream = NULL; + ifstream *epr_stream = NULL; + std::string out_stats_file_base = std::string( mvx_argp_get(&argp, "output", 0)) + ".stats"; + uint32_t mini_height = 0; + int mirror = mvx_argp_get_int(&argp,"mirror",0); + int frames = mvx_argp_get_int(&argp,"frames",0); + int rotation = mvx_argp_get_int(&argp,"rotate",0); + size_t stride[VIDEO_MAX_PLANES] = {0}; + if (mvx_argp_is_set(&argp, "stride0") || mvx_argp_is_set(&argp, "stride1") || + mvx_argp_is_set(&argp, "stride2")) { + stride[0] = mvx_argp_get_int(&argp, "stride0", 0); + stride[1] = mvx_argp_get_int(&argp, "stride1", 0); + stride[2] = mvx_argp_get_int(&argp, "stride2", 0); + } + if (Codec::isAFBC(inputFormat)) + { + inputFile = new InputAFBC(is, inputFormat, mvx_argp_get_int(&argp, "width", 0), + mvx_argp_get_int(&argp, "height", 0)); + } + else + { + roi_file = mvx_argp_get(&argp, "roi_cfg", 0); + if (roi_file) { + printf("roi config filename is < %s >.\n", roi_file); + roi_stream = new ifstream(roi_file, ios::binary); + if(NULL == roi_stream){ + fprintf(stderr, "Error: (NULL == roi_stream).\n"); + return 1; + } + inputFile = new InputFileFrameWithROI(is, + inputFormat, + mvx_argp_get_int(&argp, "width", 0), + mvx_argp_get_int(&argp, "height", 0), + mvx_argp_get_int(&argp, "strideAlign", 0), *roi_stream, stride); + } else { + epr_file = mvx_argp_get(&argp, "epr_cfg", 0); + if (epr_file) { + printf("epr config filename is < %s >.\n", epr_file); + epr_stream = new ifstream(epr_file, ios::binary); + if(NULL == epr_stream){ + fprintf(stderr, "Error: (NULL == epr_stream).\n"); + return 1; + } + inputFile = new InputFileFrameWithEPR(is, + inputFormat, + mvx_argp_get_int(&argp, "width", 0), + mvx_argp_get_int(&argp, "height", 0), + mvx_argp_get_int(&argp, "strideAlign", 0), *epr_stream,outputFormat, stride); + } else if (mvx_argp_is_set(&argp, "miniframe_height")){ + mini_height = mvx_argp_get_int(&argp,"miniframe_height",0); + assert((mini_height >= 128) && (mini_height % 64 == 0) && "miniframe_height should be aligned with 64, and greater than 128"); + inputFile = new InputFileMiniFrame(is, + inputFormat, + mvx_argp_get_int(&argp, "width", 0), + mvx_argp_get_int(&argp, "height", 0), + mvx_argp_get_int(&argp, "strideAlign", 0), + mini_height, stride); + } else if (mvx_argp_is_set(&argp, "osd_cfg") && mvx_argp_is_set(&argp, "osd_infile")) { + assert(mvx_argp_is_set(&argp, "osd_width") && mvx_argp_is_set(&argp, "osd_height")); + inputFile = new InputFileFrameOSD(is, + inputFormat, + mvx_argp_get_int(&argp, "width", 0), + mvx_argp_get_int(&argp, "height", 0), + mvx_argp_get_int(&argp, "strideAlign", 0), stride); + InputFileFrameOSD *input = dynamic_cast(inputFile); + osd_info.inputFormat_osd[0] = Codec::to4cc(mvx_argp_get(&argp, "osd_color", 0)); + osd_info.width_osd[0] = mvx_argp_get_int(&argp, "osd_width", 0); + osd_info.height_osd[0] = mvx_argp_get_int(&argp, "osd_height", 0); + input->osd_file_1 = new InputFileOsd(mvx_argp_get(&argp, "osd_infile", 0), + osd_info.inputFormat_osd[0], + osd_info.width_osd[0], + osd_info.height_osd[0], + 1); + if (mvx_argp_is_set(&argp, "osd_infile2")) { + assert(mvx_argp_is_set(&argp, "osd_width2") && mvx_argp_is_set(&argp, "osd_height2")); + osd_info.inputFormat_osd[1] = Codec::to4cc(mvx_argp_get(&argp, "osd_color2", 0)); + osd_info.width_osd[1] = mvx_argp_get_int(&argp, "osd_width2", 0); + osd_info.height_osd[1] = mvx_argp_get_int(&argp, "osd_height2", 0); + input->osd_file_2 = new InputFileOsd(mvx_argp_get(&argp, "osd_infile2", 0), + osd_info.inputFormat_osd[1], + osd_info.width_osd[1], + osd_info.height_osd[1], + 1); + } + } else { + inputFile = new InputFileFrame(is, + inputFormat, + mvx_argp_get_int(&argp, "width", 0), + mvx_argp_get_int(&argp, "height", 0), + mvx_argp_get_int(&argp, "strideAlign", 0), stride); + } + } + } + + if (mvx_argp_is_set(&argp, "chr_cfg")) { + const char* chr_cfg = mvx_argp_get(&argp, "chr_cfg", 0); + char *sub_buf1, *sub_buf2; + v4l2_mvx_chr_config config; + FILE *chr_file = fopen(chr_cfg, "r"); + if (NULL == chr_file) { + cerr << "Could not read IDR config file!" <(inputFile); + if (input->chr_list == NULL) { + input->chr_list = new v4l2_chr_list_t(); + } + while (fgets(cfg_file_line_buf, CFG_FILE_LINE_SIZE, chr_file)) + { + if (2 != sscanf(cfg_file_line_buf, "pic=%d num_chr=%d", &config.pic_index, &config.num_chr)) + { + cerr<<"Parse CHR config file ERROR"< V4L2_MAX_FRAME_CHANGE_RECTANGLES) + { + cerr<<"Invalid n_rectangles value = "< 0) + { + int match = 0; + uint16_t tmp_left=0; + uint16_t tmp_right=0; + uint16_t tmp_top=0; + uint16_t tmp_bottom=0; + + sub_buf1 = cfg_file_line_buf; + + for (unsigned i = 0; i < config.num_chr; i++) + { + sub_buf2 = strstr(sub_buf1, " chr="); + match = sscanf(sub_buf2, " chr={%hu,%hu,%hu,%hu}", + &tmp_left, + &tmp_right, + &tmp_top, + &tmp_bottom); + if (match != 4) + { + cerr<<"Error while parsing the change rectangles "<< match<chr_list->push_back(config); + } + fclose(chr_file); + } + + if (mvx_argp_is_set(&argp, "reset_gop_cfg")) { + const char* gop_cfg = mvx_argp_get(&argp, "reset_gop_cfg", 0); + FILE *file = fopen(gop_cfg, "r"); + char *sub_buf; + if (NULL == file) { + cerr << "Could not read reset_gop_cfg file!" <(inputFile); + if (input->gop_list == NULL) { + input->gop_list = new gop_list_t(); + } + while (fgets(cfg_file_line_buf, CFG_FILE_LINE_SIZE, file)) + { + sub_buf = strtok(cfg_file_line_buf, ","); + while(sub_buf != NULL) + { + int reset_pic; + int reset_pframes; + if (2 == sscanf(sub_buf, "[%d-%d]", &reset_pic, &reset_pframes)) + { + struct v4l2_gop_config tmp_rest_gop; + tmp_rest_gop.gop_pic = reset_pic; + tmp_rest_gop.gop_pframes = reset_pframes; + input->gop_list->push(tmp_rest_gop); + } else { + printf("--reset_gop_cfg file format error:[%s], should be [int-int]\n", sub_buf); + exit(1); + } + sub_buf = strtok(NULL, ","); + } + } + fclose(file); + } + + if (mvx_argp_is_set(&argp, "reset_ltr_peroid_cfg")) { + const char *ltr_cfg = mvx_argp_get(&argp, "reset_ltr_peroid_cfg", 0); + FILE *file = fopen(ltr_cfg, "r"); + char *sub_buf; + if (NULL == file) { + cerr << "Could not read reset_gop_cfg file!" <(inputFile); + if (input->ltr_list == NULL) { + input->ltr_list = new ltr_list_t(); + } + while (fgets(cfg_file_line_buf, CFG_FILE_LINE_SIZE, file)) + { + sub_buf = strtok(cfg_file_line_buf, ","); + while(sub_buf != NULL) + { + int reset_pic; + int reset_ltr_peroid; + if (2 == sscanf(sub_buf, "[%d-%d]", &reset_pic, &reset_ltr_peroid)) + { + if (reset_ltr_peroid == 0) + printf("--reset_ltr_peroid_cfg error: ltr new peroid must be > 0, but now get input [%s]\n", sub_buf); + struct v4l2_reset_ltr_peroid_config tmp_rest_gop; + tmp_rest_gop.reset_trigger_pic = reset_pic; + tmp_rest_gop.reset_ltr_peroid = reset_ltr_peroid; + input->ltr_list->push(tmp_rest_gop); + } else { + printf("--reset_ltr_peroid_cfg file format error:[%s], should be [int-int]\n", sub_buf); + } + sub_buf = strtok(NULL, ","); + } + } + fclose(file); + } + + if (mvx_argp_is_set(&argp, "idr_cfg")) { + const char* idr_cfg = mvx_argp_get(&argp, "idr_cfg", 0); + FILE *file = fopen(idr_cfg, "r"); + char *sub_buf; + if (NULL == file) { + cerr << "Could not read IDR config file!" <idr_list.push(index); + sub_buf = strtok(NULL, ","); + } + } + fclose(file); + } + + if (mvx_argp_is_set(&argp, "osd_cfg") && mvx_argp_is_set(&argp, "osd_infile")) { + const char* osd_cfg = mvx_argp_get(&argp, "osd_cfg", 0); + FILE *file = fopen(osd_cfg, "r"); + char *sub_buf1, *sub_buf2; + v4l2_osd_config config; + if (NULL == file) { + cerr << "Could not read OSD config file!" <(inputFile); + if (input->osd_list == NULL) { + input->osd_list = new v4l2_osd_list_t(); + } + + /* cfg_file_line_buf --- all config uses this buf */ + while (fgets(cfg_file_line_buf, CFG_FILE_LINE_SIZE, file)) { + if (2 != sscanf(cfg_file_line_buf, "pic=%d osd_idx=%d", &config.pic_index, &config.num_osd)) { + printf("Parse OSD config file ERROR\n"); + } + + if (config.num_osd > (1 << V4L2_MAX_FRAME_OSD_REGION) - 1) { + printf("Invalid n_rectangles value = %d\n", config.num_osd); + } + + int match = 0; + int8_t osd_para_num = 8; + sub_buf1 = cfg_file_line_buf; + uint32_t en, alpha_en, cvt_en, alpha_val, cvt_th, csc_coef; + uint16_t startx, starty; + for (uint8_t i = 0; i < V4L2_MAX_FRAME_OSD_REGION; i++) { + sub_buf2 = (i == 0) ? strstr(sub_buf1, "osd1_cfg") : strstr(sub_buf1, "osd2_cfg"); + sub_buf2 += 5; + match = sscanf(sub_buf2, "cfg={en=%01d,alpha_en=%01d,cvt_en=%01d,alpha_val=%d,cvt_th=%d,csc_coef=%d,startx=%hu,starty=%hu}", + &en, &alpha_en, &cvt_en, &alpha_val, &cvt_th, &csc_coef, &startx, &starty); + config.osd_single_cfg[i].osd_inside_enable = en; + config.osd_single_cfg[i].osd_inside_alpha_enable = alpha_en; + config.osd_single_cfg[i].osd_inside_convert_color_enable = cvt_en; + config.osd_single_cfg[i].osd_inside_alpha_value = alpha_val; + config.osd_single_cfg[i].osd_inside_convert_color_threshold = cvt_th; + config.osd_single_cfg[i].osd_inside_rgb2yuv_mode = csc_coef; + config.osd_single_cfg[i].osd_inside_start_x = startx; + config.osd_single_cfg[i].osd_inside_start_y = starty; + if (match != osd_para_num) { /* since matched, convert format to pre_defined */ + /* when not found, set current osd para to be zero */ + memset(&config.osd_single_cfg[i], 0, sizeof(v4l2_mvx_osd_cfg)); + } + } + input->osd_list->push_back(config);/* copy config info to osd_opt_list */ + } + fclose(file); + } + + ofstream os(mvx_argp_get(&argp, "output", 0)); + Output *outputFile; + if (rotation % 90 != 0){ + cerr << "Unsupported rotation:"< 0 || mvx_argp_is_set(&argp, "enc_stats_cfg")) { + std::string out_stats_file_base = std::string( mvx_argp_get(&argp, "output", 0)) + ".stats"; + outputFile = new OutputFileFrameStats(os, outputFormat, + mvx_argp_get_int(&argp,"enc_stats_mode",0), + out_stats_file_base, mvx_argp_get_int(&argp, "width", 0), + mvx_argp_get_int(&argp, "height", 0)); + } else { + outputFile = new OutputFile(os, outputFormat); + } + printf("%s>outputFile: %s\n", __FUNCTION__, outputFile); + } + else + { + cerr << "Error: Unsupported container format. format=" << + mvx_argp_get(&argp, "format", 0) << "." << endl; + return 1; + } + + Encoder encoder(mvx_argp_get(&argp, "dev", 0), *inputFile, *outputFile); + printf("Encoder construct done\n"); + if (mvx_argp_is_set(&argp, "trystop")) + { + encoder.tryStopCmd(true); + } + if (mvx_argp_is_set(&argp, "restart_interval")) + { + encoder.setJPEGRefreshInterval(mvx_argp_get_int(&argp, "restart_interval", 0)); + } + if (mvx_argp_is_set(&argp, "quality")) + { + encoder.setJPEGQuality(mvx_argp_get_int(&argp, "quality", 0)); + } + if (mvx_argp_is_set(&argp, "osd_cfg") && mvx_argp_is_set(&argp, "osd_infile")) + { + encoder.setEncOSDinfo(&osd_info); + } + encoder.setMirror(mirror); + encoder.setRotation(rotation); + encoder.setStride(stride); + encoder.setFrameCount(frames); + encoder.setRateControl(mvx_argp_get(&argp, "rate_control", 0), + mvx_argp_get_int(&argp,"target_bitrate",0), + mvx_argp_get_int(&argp,"max_bitrate",0)); + if (mvx_argp_is_set(&argp, "change_pos")) { + encoder.setChangePos(mvx_argp_get_int(&argp, "change_pos", 0)); + } + if (mvx_argp_is_set(&argp, "rc_bit_i_mode")) { + encoder.setRcBitIMode(mvx_argp_get_int(&argp, "rc_bit_i_mode", 0)); + } + if (mvx_argp_is_set(&argp, "rc_bit_ratio_i")) { + encoder.setRcBitRationI(mvx_argp_get_int(&argp, "rc_bit_ratio_i", 0)); + } + if (mvx_argp_is_set(&argp, "multi_sps_pps")) { + encoder.setMultiSPSPPS(mvx_argp_get_int(&argp, "multi_sps_pps", 0)); + } + if (mvx_argp_is_set(&argp, "turn_visual")) { + encoder.setEnableVisual(mvx_argp_get_int(&argp, "turn_visual", 0)); + } + if (mvx_argp_is_set(&argp, "adaptive_intra_block")) { + assert(!(mvx_argp_is_set(&argp, "scd_enable") && mvx_argp_get_int(&argp, "scd_enable", 0) == 0)); + encoder.setAdaptiveIntraBlock(mvx_argp_get_int(&argp, "adaptive_intra_block", 0)); + } + if (mvx_argp_is_set(&argp, "scd_enable") || mvx_argp_is_set(&argp, "adaptive_intra_block")) { + uint32_t scd_enable = mvx_argp_get_int(&argp, "scd_enable", 0); + // If adaptive_intra_block is open, the scd_enable will open too. + if (mvx_argp_is_set(&argp, "adaptive_intra_block") && mvx_argp_get_int(&argp, "adaptive_intra_block", 0)) { + scd_enable = 1; + } + encoder.setEnableSCD(scd_enable); + } + if (mvx_argp_is_set(&argp, "scd_percent") && mvx_argp_is_set(&argp, "scd_enable")) { + assert(mvx_argp_get_int(&argp, "scd_percent", 0) >=0 && mvx_argp_get_int(&argp, "scd_percent", 0) <= 100); + encoder.setScdPercent(mvx_argp_get_int(&argp, "scd_percent", 0)); + } + if (mvx_argp_is_set(&argp, "scd_threshold") && mvx_argp_is_set(&argp, "scd_enable")) { + assert(mvx_argp_get_int(&argp, "scd_threshold", 0) >= 0 && mvx_argp_get_int(&argp, "scd_threshold", 0) <= 2047); + encoder.setScdThreshold(mvx_argp_get_int(&argp, "scd_threshold", 0)); + } + if (mvx_argp_is_set(&argp, "aq_ssim_en")) { + encoder.setEnableAQSsim(mvx_argp_get_int(&argp, "aq_ssim_en", 0)); + } + if (mvx_argp_is_set(&argp, "aq_neg_ratio") && mvx_argp_is_set(&argp, "aq_ssim_en")) { + assert(mvx_argp_get_int(&argp, "aq_neg_ratio", 0) >= 0 && mvx_argp_get_int(&argp, "aq_neg_ratio", 0) <= 63); + encoder.setAQNegRatio(mvx_argp_get_int(&argp, "aq_neg_ratio", 0)); + } + if (mvx_argp_is_set(&argp, "aq_pos_ratio") && mvx_argp_is_set(&argp, "aq_ssim_en")) { + assert(mvx_argp_get_int(&argp, "aq_pos_ratio", 0) >= 0 && mvx_argp_get_int(&argp, "aq_pos_ratio", 0) <= 63); + encoder.setAQPosRatio(mvx_argp_get_int(&argp, "aq_pos_ratio", 0)); + } + if (mvx_argp_is_set(&argp, "aq_qpdelta_lmt") && mvx_argp_is_set(&argp, "aq_ssim_en")) { + assert(mvx_argp_get_int(&argp, "aq_qpdelta_lmt", 0) >= 0 && mvx_argp_get_int(&argp, "aq_qpdelta_lmt", 0) <=7); + encoder.setAQQPDeltaLmt(mvx_argp_get_int(&argp, "aq_qpdelta_lmt", 0)); + } + if (mvx_argp_is_set(&argp, "aq_init_frm_avg_svar") && mvx_argp_is_set(&argp, "aq_ssim_en")) { + assert(mvx_argp_get_int(&argp, "aq_init_frm_avg_svar", 0) >= 0 && mvx_argp_get_int(&argp, "aq_init_frm_avg_svar", 0) <= 15); + encoder.setAQInitFrmAvgSvar(mvx_argp_get_int(&argp, "aq_init_frm_avg_svar", 0)); + } + if (mvx_argp_is_set(&argp, "huff_table")) { + struct v4l2_mvx_huff_table huff_table; + uint8_t bits[16] = {0}; + uint8_t vals[162] = {0}; + FILE *file = fopen(mvx_argp_get(&argp, "huff_table", 0), "r"); + if (!file) { + cerr<<"fail to open huff table file!"<= 64) { + encoder.setMiniHeight(mini_height); + } + if (mvx_argp_is_set(&argp, "visible_width")) + { + encoder.setVisibleWidth(mvx_argp_get_int(&argp, "visible_width", 0)); + } + if (mvx_argp_is_set(&argp, "visible_height")) + { + encoder.setVisibleHeight(mvx_argp_get_int(&argp, "visible_height", 0)); + } + if (outputFormat == V4L2_PIX_FMT_JPEG && mvx_argp_is_set(&argp, "qscale")) + { + encoder.setJPEGQuality(mvx_argp_get_int(&argp, "qscale", 0)); + } + if (outputFormat == V4L2_PIX_FMT_JPEG && mvx_argp_is_set(&argp, "qscale_luma")) + { + encoder.setJPEGQualityLuma(mvx_argp_get_int(&argp, "qscale_luma", 0)); + } + if (outputFormat == V4L2_PIX_FMT_JPEG && mvx_argp_is_set(&argp, "qscale_chroma")) + { + encoder.setJPEGQualityChroma(mvx_argp_get_int(&argp, "qscale_chroma", 0)); + } + if (mvx_argp_is_set(&argp, "pframes")) + { + encoder.setPFrames(mvx_argp_get_int(&argp, "pframes", 0)); + } + if (mvx_argp_is_set(&argp, "bframes")) + { + encoder.setBFrames(mvx_argp_get_int(&argp, "bframes", 0)); + } + if (mvx_argp_is_set(&argp, "packet_mbs")) + { + encoder.setSliceSpacing(mvx_argp_get_int(&argp, "packet_mbs", 0)); + } + if (mvx_argp_is_set(&argp, "constrained_intra_pred")) + { + encoder.setConstrainedIntraPred(mvx_argp_get_int(&argp, "constrained_intra_pred", 0)); + } + if (mvx_argp_is_set(&argp, "nQpMinI")) + { + encoder.setEncMinQPI(mvx_argp_get_int(&argp, "nQpMinI", 0)); + } + if (mvx_argp_is_set(&argp, "nQpMaxI")) + { + encoder.setEncMaxQPI(mvx_argp_get_int(&argp, "nQpMaxI", 0)); + } + if (mvx_argp_is_set(&argp, "init_qpi")) + { + encoder.setEncInitQPI(mvx_argp_get_int(&argp, "init_qpi", 0)); + } + if (mvx_argp_is_set(&argp, "init_qpp")) + { + encoder.setEncInitQPP(mvx_argp_get_int(&argp, "init_qpp", 0)); + } + if (mvx_argp_is_set(&argp, "sao_luma_dis")) + { + encoder.setEncSAOluma(mvx_argp_get_int(&argp, "sao_luma_dis", 0)); + } + if (mvx_argp_is_set(&argp, "sao_chroma_dis")) + { + encoder.setEncSAOchroma(mvx_argp_get_int(&argp, "sao_chroma_dis", 0)); + } + if (mvx_argp_is_set(&argp, "qp_delta_i_p")) + { + encoder.setEncQPDeltaIP(mvx_argp_get_int(&argp, "qp_delta_i_p", 0)); + } + if (mvx_argp_is_set(&argp, "ref_rb_en")) + { + encoder.setEncRefRbEn(mvx_argp_get_int(&argp, "ref_rb_en", 0)); + } + if (mvx_argp_is_set(&argp, "rc_qp_clip_top")) + { + encoder.setEncRCClipTop(mvx_argp_get_int(&argp, "rc_qp_clip_top", 0)); + } + if (mvx_argp_is_set(&argp, "rc_qp_clip_bottom")) + { + encoder.setEncRCClipBot(mvx_argp_get_int(&argp, "rc_qp_clip_bottom", 0)); + } + if (mvx_argp_is_set(&argp, "qpmap_clip_top")) + { + encoder.setEncQpmapClipTop(mvx_argp_get_int(&argp, "qpmap_clip_top", 0)); + } + if (mvx_argp_is_set(&argp, "qpmap_clip_bottom")) + { + encoder.setEncQpmapClipBot(mvx_argp_get_int(&argp, "qpmap_clip_bottom", 0)); + } + if (mvx_argp_is_set(&argp, "xsearch_range")) + { + encoder.setHorizontalMVSearchRange(mvx_argp_get_int(&argp, "xsearch_range", 0)); + } + if (mvx_argp_is_set(&argp, "ysearch_range")) + { + encoder.setVerticalMVSearchRange(mvx_argp_get_int(&argp, "ysearch_range", 0)); + } + if (mvx_argp_is_set(&argp, "profiling")) + { + encoder.setEncProfiling(mvx_argp_get_int(&argp, "profiling", 0)); + } + if (mvx_argp_is_set(&argp, "maxqp")) + { + encoder.setEncMaxQP(mvx_argp_get_int(&argp, "maxqp", 0)); + } + if (mvx_argp_is_set(&argp, "minqp")) + { + encoder.setEncMinQP(mvx_argp_get_int(&argp, "minqp", 0)); + } + if (mvx_argp_is_set(&argp, "tier")) + { + encoder.setProfile(mvx_argp_get_int(&argp, "tier", 0)); + } + if (mvx_argp_is_set(&argp, "level")) + { + encoder.setLevel(mvx_argp_get_int(&argp, "level", 0)); + } + if (mvx_argp_is_set(&argp, "fps")) + { + encoder.setFramerate(mvx_argp_get_int(&argp, "fps", 0) << 16); + /* encoder.setFramerate(mvx_argp_get_int(&argp, "fps", 0)); */ + } + if (mvx_argp_is_set(&argp, "bitdepth")) + { + encoder.setEncBitdepth(mvx_argp_get_int(&argp, "bitdepth", 0)); + } + if (mvx_argp_is_set(&argp, "ecm")) + { + encoder.setH264EntropyCodingMode(mvx_argp_get_int(&argp, "ecm", 0)); + } + if (mvx_argp_is_set(&argp, "fixedqp")) + { + encoder.setEncFixedQP(mvx_argp_get_int(&argp, "fixedqp", 0)); + } + if (mvx_argp_is_set(&argp, "qpi")) + { + encoder.setEncFixedQPI(mvx_argp_get_int(&argp, "qpi", 0)); + } + if (mvx_argp_is_set(&argp, "qpb")) + { + encoder.setEncFixedQPB(mvx_argp_get_int(&argp, "qpb", 0)); + } + if (mvx_argp_is_set(&argp, "qpp")) + { + encoder.setEncFixedQPP(mvx_argp_get_int(&argp, "qpp", 0)); + } + if (mvx_argp_is_set(&argp, "crop_left")) + { + encoder.setCropLeft(mvx_argp_get_int(&argp, "crop_left", 0)); + } + if (mvx_argp_is_set(&argp, "crop_right")) + { + encoder.setCropRight(mvx_argp_get_int(&argp, "crop_right", 0)); + } + if (mvx_argp_is_set(&argp, "crop_top")) + { + encoder.setCropTop(mvx_argp_get_int(&argp, "crop_top", 0)); + } + if (mvx_argp_is_set(&argp, "crop_bottom")) + { + encoder.setCropBottom(mvx_argp_get_int(&argp, "crop_bottom", 0)); + } + if (mvx_argp_is_set(&argp, "input_thread")) + { + encoder.setInputThread(mvx_argp_get_int(&argp, "input_thread", 0)); + } + printf("Encoder set parameters----------1\n"); + if (mvx_argp_is_set(&argp, "enc_stats_mode") || mvx_argp_is_set(&argp, "enc_stats_cfg")) + { + assert(!(mvx_argp_is_set(&argp, "enc_stats_mode") && mvx_argp_is_set(&argp, "enc_stats_cfg"))); + uint32_t roundup, is_hevcenc; + uint32_t mms_buffer_size, bitcost_buffer_size, qp_buffer_size; + if (outputFormat == V4L2_PIX_FMT_H264) { + roundup = 16; + is_hevcenc = 0; + } else if (outputFormat == V4L2_PIX_FMT_HEVC) { + roundup = 64; + is_hevcenc = 1; + } else { + assert( 0 && "enc stats mode only support on h264enc/hevcenc now!"); + } + mms_buffer_size = + ((((width + roundup - 1)/roundup)<(inputFile); + if (input->enc_stats_list == NULL) { + input->enc_stats_list = new enc_stats_list_t(); + } + + while (fgets(cfg_file_line_buf, CFG_FILE_LINE_SIZE, file)) + { + sub_buf = strtok(cfg_file_line_buf, ","); + while(sub_buf != NULL) + { + int reset_pic; + int reset_cfg; + if (2 == sscanf(sub_buf, "[%d-%d]", &reset_pic, &reset_cfg)) + { + struct v4l2_enc_stats_cfg tmp_enc_stats; + tmp_enc_stats.reset_pic = reset_pic; + tmp_enc_stats.reset_cfg = reset_cfg; + input->enc_stats_list->push(tmp_enc_stats); + } else { + printf("--enc_stats_cfg file format error:[%s], should be [int-int]\n", sub_buf); + return 1; + } + sub_buf = strtok(NULL, ","); + } + } + fclose(file); + } + } + if (mvx_argp_is_set(&argp, "memory")) + { + const char *memory_type = mvx_argp_get(&argp, "memory", 0); + if (strcmp(memory_type, "mmap") == 0) { + encoder.setMemoryType(V4L2_MEMORY_MMAP); + } else if (strcmp(memory_type, "dma") == 0) { + encoder.setMemoryType(V4L2_MEMORY_DMABUF); + } else { + cerr<<"didnot support this memory type!!!"< 5) { + conv_mode = 0; + } + encoder.setRGBToYUVMode(conv_mode); + } + if (mvx_argp_is_set(&argp, "cust_rgb2yuv_range")) + { + assert(!mvx_argp_is_set(&argp, "rgb2yuv_color_conversion")); + struct v4l2_mvx_rgb2yuv_color_conv_coef conv_coef; + if(true==color_conversion_parse_coef(mvx_argp_get(&argp, "cust_rgb2yuv_range", 0),&conv_coef)) + encoder.setRGBConvertYUV(&conv_coef); + else + cerr << "invalid rgb2yuv coef params,pls check" << endl; + } + if (mvx_argp_is_set(&argp, "colour_description_range") || mvx_argp_is_set(&argp, "colour_primaries") + || mvx_argp_is_set(&argp, "transfer_characteristics") || mvx_argp_is_set(&argp, "matrix_coeff") + || mvx_argp_is_set(&argp, "time_scale") || mvx_argp_is_set(&argp, "num_units_in_tick") + || mvx_argp_is_set(&argp, "aspect_ratio_idc") || mvx_argp_is_set(&argp, "sar_width") + || mvx_argp_is_set(&argp, "sar_height") || mvx_argp_is_set(&argp, "video_format") + || mvx_argp_is_set(&argp, "sei_mastering_display") || mvx_argp_is_set(&argp, "sei_content_light")) + { + struct v4l2_mvx_color_desc color_desc; + memset(&color_desc, 0, sizeof(color_desc)); + color_desc.range = mvx_argp_get_int(&argp, "colour_description_range", 0); + color_desc.primaries = mvx_argp_get_int(&argp, "colour_primaries", 0); + color_desc.transfer = mvx_argp_get_int(&argp, "transfer_characteristics", 0); + color_desc.matrix = mvx_argp_get_int(&argp, "matrix_coeff", 0); + color_desc.time_scale = mvx_argp_get_int(&argp, "time_scale", 0); + color_desc.num_units_in_tick = mvx_argp_get_int(&argp, "num_units_in_tick", 0); + color_desc.aspect_ratio_idc = mvx_argp_get_int(&argp, "aspect_ratio_idc", 0); + color_desc.sar_width = mvx_argp_get_int(&argp, "sar_width", 0); + color_desc.sar_height = mvx_argp_get_int(&argp, "sar_height", 0); + color_desc.video_format = mvx_argp_get_int(&argp, "video_format", 0); + if (mvx_argp_is_set(&argp, "sei_mastering_display")) { + uint32_t x[3]; + uint32_t y[3]; + uint32_t wp_x, wp_y; + uint32_t max_dml, min_dml; + if (10 == sscanf(mvx_argp_get(&argp, "sei_mastering_display", 0), + "SEI_MS=%d,%d,%d,%d,%d,%d,%d,%d,%d,%d", + &x[0], &y[0], &x[1], &y[1], &x[2], &y[2], &wp_x, &wp_y, &max_dml, &min_dml)) { + color_desc.display.r.x = x[0]; + color_desc.display.r.y = y[0]; + color_desc.display.g.x = x[1]; + color_desc.display.g.y = y[1]; + color_desc.display.b.x = x[2]; + color_desc.display.b.y = y[2]; + color_desc.display.w.x = wp_x; + color_desc.display.w.y = wp_y; + color_desc.display.luminance_min = min_dml; + color_desc.display.luminance_max = max_dml; + color_desc.flags |= V4L2_BUFFER_PARAM_COLOUR_FLAG_MASTERING_DISPLAY_DATA_VALID; + } + } + if (mvx_argp_is_set(&argp, "sei_content_light")) { + uint32_t max_cl; + uint32_t min_pal; + if (2 == sscanf(mvx_argp_get(&argp, "sei_content_light", 0), "SEI_CL=%d,%d", &max_cl, &min_pal)) { + color_desc.content.luminance_average = min_pal; + color_desc.content.luminance_max = max_cl; + color_desc.flags |= V4L2_BUFFER_PARAM_COLOUR_FLAG_CONTENT_LIGHT_DATA_VALID; + } + } + encoder.setVuiColourDesc(&color_desc); + } + if (mvx_argp_is_set(&argp, "sei_user_data_unregistered")) { + const char *user_data = mvx_argp_get(&argp, "sei_user_data_unregistered", 0); + char *data_loc; + int user_data_len; + uint32_t uuid_l0, uuid_l1, uuid_l2, uuid_l3; + struct v4l2_sei_user_data sei_user_data; + user_data_len = strlen(user_data); + if (user_data_len > (256-1)) { + cout<<"ERROR: host input error, user_data_unregistered string info larger than 256"<(user_data), "+"); + if (data_loc == NULL) { + cout<<"ERROR: host input error, user_data_unregistered do not have seperate character : +"<>24; + sei_user_data.uuid[1] = (uuid_l3>>16) & 0xff; + sei_user_data.uuid[2] = (uuid_l3>>8) & 0xff; + sei_user_data.uuid[3] = uuid_l3 & 0xff; + sei_user_data.uuid[4] = uuid_l2>>24; + sei_user_data.uuid[5] = (uuid_l2>>16) & 0xff; + sei_user_data.uuid[6] = (uuid_l2>>8) & 0xff; + sei_user_data.uuid[7] = uuid_l2 & 0xff; + sei_user_data.uuid[8] = uuid_l1>>24; + sei_user_data.uuid[9] = (uuid_l1>>16) & 0xff; + sei_user_data.uuid[10] = (uuid_l1>>8) & 0xff; + sei_user_data.uuid[11] = uuid_l1 & 0xff; + sei_user_data.uuid[12] = uuid_l0>>24; + sei_user_data.uuid[13] = (uuid_l0>>16) & 0xff; + sei_user_data.uuid[14] = (uuid_l0>>8) & 0xff; + sei_user_data.uuid[15] = uuid_l0 & 0xff; + } else { + cout<<"ERROR: invalid wrong userdata format"<= 1 && ltr_mode <= 4) { + if (!(is_gop_set && gop == 2)){ + cerr << "(ltr_mode >= 1 && ltr_mode <= 4), but gop_type is not MVE_OPT_GOP_TYPE_LOW_DELAY!" << endl; + return 1; + } + } + if (ltr_mode == 5 || ltr_mode == 6) { + if (!(is_gop_set && gop == 1)){ + cerr << "(ltr_mode == 5 or 6), but gop_type is not MVE_OPT_GOP_TYPE_BIDIRECTIONAL!" << endl; + return 1; + } + } + if (ltr_mode == 7 || ltr_mode == 8) { + if (!(is_gop_set && gop == 3)){ + cerr << "(ltr_mode == 7 or 8), but gop_type is not MVE_OPT_GOP_TYPE_PYRAMID!" << endl; + return 1; + } + } + if (mvx_argp_is_set(&argp, "ltr_period")) { + int ltr_period = mvx_argp_get_int(&argp, "ltr_period", 0); + switch (ltr_mode) { + case 1: { + if (ltr_period < 1 || ltr_period > 255) { + cerr<<"ltr_period can not less than 1 or greater than 255 under long term LDP method 1!"< 255) { + cerr<<"ltr_period can not less than 2 or greater than 255 under long term LDP method 2!"< 255/(mvx_argp_get_int(&argp, "bframes", 0) + 1)) { + cerr<<"--ltr_period can not less than 1 or greater than 255/(options_p->bframes.val+1), and --bframes must be assigned under long term LDB method 3 or 5!"< 255/(mvx_argp_get_int(&argp, "bframes", 0) + 1)) { + cerr<<"--ltr_period can not less than 1 or greater than 255/(options_p->bframes.val+1), and --bframes must be assigned under long term LDB method 4 or 6!"< 63) { + cerr<<"ltr_period can not less than 1 or greater than 63 under long term LDP method 7!"< 63) { + cerr<<"ltr_period can not less than 1 or greater than 63 under long term LDP method 8!"<= 4 && mvx_argp_get_int(&argp, "svct3_level1_peroid", 0) <= 250)) + { + printf("--gop_type==4 have been set, but --svct3_level1_peroid is wrong or don't set\n"); + exit(1); + } + } + if (gop_type == 5) + { + if (!(mvx_argp_is_set(&argp, "gdr_number") && mvx_argp_is_set(&argp, "gdr_period"))) + { + printf("--gop_type==5 have been set, but --gdr_number or --gdr_period is wrong or don't set\n"); + exit(1); + } + } + encoder.setH264GOPType(gop_type); + } + if (mvx_argp_is_set(&argp, "gdr_number") && mvx_argp_is_set(&argp, "gdr_period")) { + uint32_t frame_height_quad=0; + if (mvx_argp_is_set(&argp, "rotate") && (rotation % 360 == 90 || rotation % 360 == 270 )) + { + frame_height_quad = (width + 31) >> 5; + } else + { + frame_height_quad = (height + 31) >> 5; + } + uint32_t gdr_number = mvx_argp_get_int(&argp, "gdr_number", 0); + if ( gdr_number < 2 || gdr_number > frame_height_quad){ + printf("--gdr_number must be greater than 1 and lower than frame_height_quad(current is %d)\n",frame_height_quad); + exit(1); + } + if( !(mvx_argp_get_int(&argp, "gop", 0) && mvx_argp_get_int(&argp, "gop", 0) == 5)){ + printf("--gdr_number have been set, but gop_type != 5\n"); + exit(1); + } + encoder.setGDRnumber(gdr_number); + encoder.setGDRperiod(mvx_argp_get_int(&argp, "gdr_period", 0)); + } + + if (mvx_argp_is_set(&argp, "svct3_level1_peroid")) + { + int svct3 = mvx_argp_get_int(&argp, "svct3_level1_peroid", 0); + if ( svct3 < 4 || svct3 > 250 || svct3 % 2 ==1 ) + { + printf("--svct3_level1_peroid must be an even number or larger than 4\n"); + exit(1); + } + if( !(mvx_argp_is_set(&argp, "gop") && mvx_argp_get_int(&argp, "gop", 0) == 4) ) + { + printf("--svct3_level1_peroid have been set, but gop_type != 4\n"); + exit(1); + } + encoder.setSvct3Level1Period(svct3); + } + if (mvx_argp_is_set(&argp, "intermediate_buffer_size")) + { + encoder.setIntermediateBufSize(mvx_argp_get_int(&argp, "intermediate_buffer_size", 0)); + } + + if (mvx_argp_is_set(&argp, "forced_uv_value")) + { + assert(mvx_argp_get_int(&argp, "forced_uv_value", 0)>=0 && mvx_argp_get_int(&argp, "forced_uv_value", 0)<=1023); + encoder.setForcedUVvalue(mvx_argp_get_int(&argp, "forced_uv_value", 0)); + } + + if(Codec::isYUV422(inputFormat) && V4L2_PIX_FMT_MJPEG == outputFormat) + { + if (mvx_argp_is_set(&argp, "422to420")) + { + encoder.setEncForceChroma(mvx_argp_get_int(&argp, "422to420", 0)); + } + } + + if (mvx_argp_is_set(&argp, "src_crop_x") && mvx_argp_is_set(&argp, "src_crop_y") + && mvx_argp_is_set(&argp, "src_crop_width") && mvx_argp_is_set(&argp, "src_crop_height")) + { + + assert(rotation == 0 && mirror==0); + assert(mvx_argp_get_int(&argp, "src_crop_x", 0) %2==0); + assert(mvx_argp_get_int(&argp, "src_crop_y", 0) %2==0); + assert(mvx_argp_get_int(&argp, "src_crop_width", 0) %2==0); + assert(mvx_argp_get_int(&argp, "src_crop_height", 0) %2==0); + + struct v4l2_mvx_crop_cfg src_crop; + src_crop.crop_en =1; + src_crop.x = mvx_argp_get_int(&argp, "src_crop_x", 0); + src_crop.y = mvx_argp_get_int(&argp, "src_crop_y", 0); + src_crop.width = mvx_argp_get_int(&argp, "src_crop_width", 0); + src_crop.height = mvx_argp_get_int(&argp, "src_crop_height", 0); + assert(src_crop.x >=0 && src_crop.x < width); + assert(src_crop.y >=0 && src_crop.y < height); + assert(src_crop.width >0 && src_crop.width <= width); + assert((src_crop.width +src_crop.x) >0 && (src_crop.width+src_crop.x) <= width); + assert(src_crop.height >0 && src_crop.height <= height); + assert((src_crop.height +src_crop.y) >0 && (src_crop.height +src_crop.y) <= height); + + //old crop need to set in the range of src crop region + if(mvx_argp_is_set(&argp, "crop_left") && mvx_argp_is_set(&argp, "crop_right") + && mvx_argp_is_set(&argp, "crop_top") && mvx_argp_is_set(&argp, "crop_bottom")) + { + assert(mvx_argp_get_int(&argp, "crop_left", 0) < src_crop.width ); + assert(mvx_argp_get_int(&argp, "crop_top", 0) < src_crop.height ); + assert(mvx_argp_get_int(&argp, "crop_right", 0) <= src_crop.width ); + assert(mvx_argp_get_int(&argp, "crop_bottom", 0) <= src_crop.height ); + assert(mvx_argp_get_int(&argp, "crop_right", 0) - mvx_argp_get_int(&argp, "crop_left", 0) <= src_crop.width ); + assert(mvx_argp_get_int(&argp, "crop_bottom", 0) - mvx_argp_get_int(&argp, "crop_top", 0) <= src_crop.height ); + } + encoder.setEncSrcCrop(&src_crop); + } + + encoder.setFrameBufCnt(mvx_argp_get_int(&argp, "framebuffer_cnt", 0)); + encoder.setBitBufCnt(mvx_argp_get_int(&argp, "bitbuffer_cnt", 0)); + printf("Encoding\n"); + return encoder.stream(); +} diff --git a/src/little/buildroot-ext/package/mvx_player/src/mvx_encoder_gen.cpp b/src/little/buildroot-ext/package/mvx_player/src/mvx_encoder_gen.cpp new file mode 100755 index 000000000..e71f9587c --- /dev/null +++ b/src/little/buildroot-ext/package/mvx_player/src/mvx_encoder_gen.cpp @@ -0,0 +1,251 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "mvx_argparse.h" +#include "mvx_player.hpp" +#include +#include + +using namespace std; + +int main(int argc, const char *argv[]) +{ + int ret; + mvx_argparse argp; + uint32_t inputFormat; + uint32_t outputFormat; + + mvx_argp_construct(&argp); + mvx_argp_add_opt(&argp, '\0', "dev", true, 1, "/dev/video0", "Device."); + mvx_argp_add_opt(&argp, 'i', "inputformat", true, 1, "yuv420", "Pixel format."); + mvx_argp_add_opt(&argp, 'o', "outputformat", true, 1, "h264", "Output pixel format."); + mvx_argp_add_opt(&argp, 'f', "format", true, 1, "ivf", "Output container format. [ivf, raw]"); + mvx_argp_add_opt(&argp, 'w', "width", true, 1, "1920", "Width."); + mvx_argp_add_opt(&argp, 'h', "height", true, 1, "1080", "Height."); + mvx_argp_add_opt(&argp, 's', "stride", true, 1, "1", "Stride alignment."); + mvx_argp_add_opt(&argp, 'c', "count", true, 1, "100", "Number of frames to generate."); + mvx_argp_add_opt(&argp, 'x', "exec", true, 1, "1", "Change settings while encoding is ongoing. The main purpose is to exercise code for coverage."); + mvx_argp_add_opt(&argp, 'v', "fps", true, 1, "24", "Frame rate."); + mvx_argp_add_opt(&argp, 'r', "bps", true, 1, "2000000", "Bit rate. If it is combined with -x then the value will later be 1000 and rate control deactivated."); + mvx_argp_add_opt(&argp, 't', "tier", true, 1, "2", "Profile."); + mvx_argp_add_opt(&argp, 'l', "level", true, 1, "1", "Level."); + mvx_argp_add_opt(&argp, 'e', "ecm", true, 1, "1", "0 is CAVLC, 1 is CABAC"); + mvx_argp_add_opt(&argp, 'g', "gop", true, 1, "1", "GOP: 0 is None, 1 is Bidi, 2 is Low delay, 3 is Pyramid"); + mvx_argp_add_opt(&argp, 'd', "imbr", true, 1, "200", "Intra MB refresh."); + mvx_argp_add_opt(&argp, 'u', "slice", true, 1, "1000", "Slice spacing."); + mvx_argp_add_opt(&argp, 'a', "chroma", true, 1, "1", "Force chroma format."); + mvx_argp_add_opt(&argp, 'j', "bitdepth", true, 1, "8", "Set other bitdepth"); + mvx_argp_add_opt(&argp, 'k', "tileCR", true, 1, "2", "Set tile columns and rows"); + mvx_argp_add_opt(&argp, 'y', "bandwidth", true, 1, "10000000", "Set bandwidth limit"); + mvx_argp_add_opt(&argp, 'n', "minqp", true, 1, "0", "H264 min QP"); + mvx_argp_add_opt(&argp, 'm', "maxqp", true, 1, "51", "H264 max QP"); + mvx_argp_add_opt(&argp, 'q', "fixedqp", true, 1, "20", "H264 fixed QP for I P B frames. If it is combined with -x then the value will later be increased with 2."); + mvx_argp_add_opt(&argp, 'p', "pframes", true, 1, "29", "Number of P frames"); + mvx_argp_add_opt(&argp, 'b', "bframes", true, 1, "1", "Number of B frames"); + mvx_argp_add_opt(&argp, 0, "cip", true, 1, "0", "Constrained Intraprediction, 1 is on, 0 is off"); + mvx_argp_add_opt(&argp, 0, "es", true, 1, "0", "Entropy Sync 1 is on, 0 is off"); + mvx_argp_add_opt(&argp, 0, "tmvp", true, 1, "0", "TMVP 1 is on, 0 is off"); + mvx_argp_add_opt(&argp, 0, "sesc", true, 1, "16", "Stream escaping 1 is on, 0 is off"); + mvx_argp_add_opt(&argp, 0, "hmvsr", true, 1, "16", "Horisontal MV Search Range"); + mvx_argp_add_opt(&argp, 0, "vmvsr", true, 1, "16", "Vertical MV Search Range"); + mvx_argp_add_opt(&argp, 'z', "block", true, 0, "0", "Use video device in blocking mode"); + mvx_argp_add_opt(&argp, 0, "restart_interval", true, 1, "-1", "JPEG restart interval."); + mvx_argp_add_opt(&argp, 0, "quality", true, 1, "0", "JPEG compression quality. [1-100, 0 - default]"); + mvx_argp_add_pos(&argp, "output", false, 1, "", "Output file."); + + ret = mvx_argp_parse(&argp, argc - 1, &argv[1]); + if (ret != 0) + { + mvx_argp_help(&argp, argv[0]); + return 1; + } + + inputFormat = Codec::to4cc(mvx_argp_get(&argp, "inputformat", 0)); + if (inputFormat == 0) + { + cerr << "Error: Illegal frame format. format=" << + mvx_argp_get(&argp, "inputformat", 0) << "." << endl; + return 1; + } + + InputFrame inputFrame = InputFrame( + inputFormat, + mvx_argp_get_int(&argp, "width", 0), + mvx_argp_get_int(&argp, "height", 0), + mvx_argp_get_int(&argp, "stride", 0), + mvx_argp_get_int(&argp, "count", 0)); + + outputFormat = Codec::to4cc(mvx_argp_get(&argp, "outputformat", 0)); + if (outputFormat == 0) + { + cerr << "Error: Illegal bitstream format. format=" << + mvx_argp_get(&argp, "outputformat", 0) << "." << endl; + return 1; + } + + ofstream os(mvx_argp_get(&argp, "output", 0)); + Output *outputFile; + if (string(mvx_argp_get(&argp, "format", 0)).compare("ivf") == 0) + { + outputFile = new OutputIVF(os, outputFormat, + mvx_argp_get_int(&argp, "width", 0), + mvx_argp_get_int(&argp, "height", 0)); + } + else if (string(mvx_argp_get(&argp, "format", 0)).compare("raw") == 0) + { + outputFile = new OutputFile(os, outputFormat); + } + else + { + cerr << "Error: Unsupported container format. format=" << + mvx_argp_get(&argp, "format", 0) << "." << endl; + return 1; + } + + bool nonblock = true; + if (mvx_argp_is_set(&argp, "block")) + { + nonblock = false; + } + + Encoder encoder(mvx_argp_get(&argp, "dev", 0), inputFrame, *outputFile, nonblock); + if (mvx_argp_is_set(&argp, "exec")) + { + encoder.changeSWEO(mvx_argp_get_int(&argp, "exec", 0)); + } + if (mvx_argp_is_set(&argp, "bandwidth")) + { + encoder.setH264Bandwidth(mvx_argp_get_int(&argp, "bandwidth", 0)); + } + if (mvx_argp_is_set(&argp, "chroma")) + { + encoder.setEncForceChroma(mvx_argp_get_int(&argp, "chroma", 0)); + } + if (mvx_argp_is_set(&argp, "bitdepth")) + { + encoder.setEncBitdepth(mvx_argp_get_int(&argp, "bitdepth", 0)); + } + if (mvx_argp_is_set(&argp, "tileCR")) + { + encoder.setVP9TileCR(mvx_argp_get_int(&argp, "tileCR", 0)); + } + if (mvx_argp_is_set(&argp, "imbr")) + { + encoder.setH264IntraMBRefresh(mvx_argp_get_int(&argp, "imbr", 0)); + } + if (mvx_argp_is_set(&argp, "slice")) + { + encoder.setSliceSpacing(mvx_argp_get_int(&argp, "slice", 0)); + } + if (mvx_argp_is_set(&argp, "tier")) + { + encoder.setProfile(mvx_argp_get_int(&argp, "tier", 0)); + } + if (mvx_argp_is_set(&argp, "level")) + { + encoder.setLevel(mvx_argp_get_int(&argp, "level", 0)); + } + if (mvx_argp_is_set(&argp, "ecm")) + { + encoder.setH264EntropyCodingMode(mvx_argp_get_int(&argp, "ecm", 0)); + } + if (mvx_argp_is_set(&argp, "gop")) + { + encoder.setH264GOPType(mvx_argp_get_int(&argp, "gop", 0)); + } + /* Set maxQP before minQP, otherwise FW rejects */ + if (mvx_argp_is_set(&argp, "maxqp")) + { + encoder.setEncMaxQP(mvx_argp_get_int(&argp, "maxqp", 0)); + } + if (mvx_argp_is_set(&argp, "minqp")) + { + encoder.setEncMinQP(mvx_argp_get_int(&argp, "minqp", 0)); + } + if (mvx_argp_is_set(&argp, "fixedqp")) + { + encoder.setEncFixedQP(mvx_argp_get_int(&argp, "fixedqp", 0)); + } + if (mvx_argp_is_set(&argp, "cip")) + { + encoder.setConstrainedIntraPred(mvx_argp_get_int(&argp, "cip", 0)); + } + if (mvx_argp_is_set(&argp, "es")) + { + encoder.setHEVCEntropySync(mvx_argp_get_int(&argp, "es", 0)); + } + if (mvx_argp_is_set(&argp, "tmvp")) + { + encoder.setHEVCTemporalMVP(mvx_argp_get_int(&argp, "tmvp", 0)); + } + if (mvx_argp_is_set(&argp, "sesc")) + { + encoder.setStreamEscaping(mvx_argp_get_int(&argp, "sesc", 0)); + } + if (mvx_argp_is_set(&argp, "pframes")) + { + encoder.setPFrames(mvx_argp_get_int(&argp, "pframes", 0)); + } + if (mvx_argp_is_set(&argp, "bframes")) + { + encoder.setBFrames(mvx_argp_get_int(&argp, "bframes", 0)); + } + if (mvx_argp_is_set(&argp, "fps")) + { + encoder.setFramerate(mvx_argp_get_int(&argp, "fps", 0) << 16); + /* encoder.setFramerate(mvx_argp_get_int(&argp, "fps", 0)); */ + } + if (mvx_argp_is_set(&argp, "bps")) + { + encoder.setBitrate(mvx_argp_get_int(&argp, "bps", 0)); + } + if (mvx_argp_is_set(&argp, "hmvsr")) + { + encoder.setHorizontalMVSearchRange(mvx_argp_get_int(&argp, "hmvsr", 0)); + } + if (mvx_argp_is_set(&argp, "vmvsr")) + { + encoder.setVerticalMVSearchRange(mvx_argp_get_int(&argp, "vmvsr", 0)); + } + if (mvx_argp_is_set(&argp, "restart_interval")) + { + encoder.setJPEGRefreshInterval(mvx_argp_get_int(&argp, "restart_interval", 0)); + } + if (mvx_argp_is_set(&argp, "quality")) + { + encoder.setJPEGQuality(mvx_argp_get_int(&argp, "quality", 0)); + } + + ret = encoder.stream(); + delete outputFile; + + return ret; +} diff --git a/src/little/buildroot-ext/package/mvx_player/src/mvx_encoder_multi.cpp b/src/little/buildroot-ext/package/mvx_player/src/mvx_encoder_multi.cpp new file mode 100755 index 000000000..88afb73cc --- /dev/null +++ b/src/little/buildroot-ext/package/mvx_player/src/mvx_encoder_multi.cpp @@ -0,0 +1,171 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "mvx_argparse.h" +#include "mvx_player.hpp" +#include +#include +#include + +using namespace std; + +struct job +{ + job(const char *dev, + const string &inputFile, const uint32_t inputFormat, + const string &outputFile, const uint32_t outputFormat, + const size_t outputStride, const uint32_t w, const uint32_t h, const uint32_t f) : + dev(dev), + inputFile(inputFile), + inputFormat(inputFormat), + outputFile(outputFile), + outputFormat(outputFormat), + outputStride(outputStride), + width(w), + height(h), + frames(f), + ret(0) + {} + + const char *dev; + string inputFile; + uint32_t inputFormat; + string outputFile; + uint32_t outputFormat; + size_t outputStride; + uint32_t width; + uint32_t height; + uint32_t frames; + int ret; +}; + +void *encodeThread(void *arg) +{ + job *j = static_cast(arg); + + ifstream is(j->inputFile.c_str()); + ofstream os(j->outputFile.c_str()); + string logf = j->outputFile + ".log"; + ofstream log(logf.c_str()); + size_t stride[VIDEO_MAX_PLANES] = {0}; + InputFileFrame inputFile = InputFileFrame(is, j->inputFormat, j->width, j->height, j->outputStride, stride); + OutputFile outputFile = OutputFile(os, j->outputFormat); + + Encoder encoder(j->dev, inputFile, outputFile, true, log); + if (j->frames > 0) { + encoder.setFrameCount(j->frames); + } + j->ret = encoder.stream(); + + return j; +} + +int main(int argc, const char *argv[]) +{ + int ret; + mvx_argparse argp; + uint32_t inputFormat; + uint32_t outputFormat; + int nsessions; + + mvx_argp_construct(&argp); + mvx_argp_add_opt(&argp, '\0', "dev", true, 1, "/dev/video0", "Device."); + mvx_argp_add_opt(&argp, 'i', "inputformat", true, 1, "yuv420", "Pixel format."); + mvx_argp_add_opt(&argp, 'o', "outputformat", true, 1, "h264", "Output pixel format."); + mvx_argp_add_opt(&argp, 's', "stride", true, 1, "1", "Stride alignment."); + mvx_argp_add_opt(&argp, 'w', "width", true, 1, "1280", "input yuv width."); + mvx_argp_add_opt(&argp, 'h', "height", true, 1, "720", "input yuv height."); + mvx_argp_add_opt(&argp, 'f', "frames", true, 1, "0", "Specfied frame count to be processed."); + mvx_argp_add_opt(&argp, 'n', "nsessions", true, 1, "1", "Number of sessions."); + mvx_argp_add_pos(&argp, "input", false, 1, "", "Input file."); + mvx_argp_add_pos(&argp, "output", false, 1, "", "Output file."); + + ret = mvx_argp_parse(&argp, argc - 1, &argv[1]); + if (ret != 0) + { + mvx_argp_help(&argp, argv[0]); + return 1; + } + + inputFormat = Codec::to4cc(mvx_argp_get(&argp, "inputformat", 0)); + if (inputFormat == 0) + { + fprintf(stderr, "Error: Illegal bitstream format. format=%s.\n", + mvx_argp_get(&argp, "inputformat", 0)); + return 1; + } + + outputFormat = Codec::to4cc(mvx_argp_get(&argp, "outputformat", 0)); + if (outputFormat == 0) + { + fprintf(stderr, "Error: Illegal frame format. format=%s.\n", + mvx_argp_get(&argp, "outputformat", 0)); + return 1; + } + + nsessions = mvx_argp_get_int(&argp, "nsessions", 0); + + pthread_t tid[nsessions]; + for (int i = 0; i < nsessions; ++i) + { + stringstream ss; + int ret; + + ss << mvx_argp_get(&argp, "output", 0) << "." << i; + cout << "output file name " << ss.str() << endl; + job *j = new job(mvx_argp_get(&argp, "dev", 0), + string(mvx_argp_get(&argp, "input", 0)), + inputFormat, ss.str(), outputFormat, + mvx_argp_get_int(&argp, "stride", 0), + mvx_argp_get_int(&argp, "width", 0), + mvx_argp_get_int(&argp, "height", 0), + mvx_argp_get_int(&argp, "frames", 0)); + + ret = pthread_create(&tid[i], NULL, encodeThread, j); + if (ret != 0) + { + throw Exception("Failed to create input thread."); + } + } + + ret = 0; + for (int i = 0; i < nsessions; ++i) + { + job *j; + + pthread_join(tid[i], reinterpret_cast(&j)); + ret += j->ret; + delete(j); + } + + return ret; +} + diff --git a/src/little/buildroot-ext/package/mvx_player/src/mvx_info.cpp b/src/little/buildroot-ext/package/mvx_player/src/mvx_info.cpp new file mode 100755 index 000000000..66d90fc93 --- /dev/null +++ b/src/little/buildroot-ext/package/mvx_player/src/mvx_info.cpp @@ -0,0 +1,62 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "mvx_argparse.h" +#include "mvx_player.hpp" +#include + +using namespace std; + +int main(int argc, const char *argv[]) +{ + int ret; + mvx_argparse argp; + + mvx_argp_construct(&argp); + mvx_argp_add_opt(&argp, '\0', "dev", true, 1, "/dev/video0", "Device."); + mvx_argp_add_opt(&argp, 'f', "formats", true, 0, "0", "List supported formats."); + + ret = mvx_argp_parse(&argp, argc - 1, &argv[1]); + if (ret != 0) + { + mvx_argp_help(&argp, argv[0]); + return 1; + } + + Info info(mvx_argp_get(&argp, "dev", 0)); + if (mvx_argp_is_set(&argp, "formats")) + { + cout << "Supported formats:" << endl; + info.enumerateFormats(); + } + + return 0; +} diff --git a/src/little/buildroot-ext/package/mvx_player/src/mvx_list.h b/src/little/buildroot-ext/package/mvx_player/src/mvx_list.h new file mode 100755 index 000000000..88ea273ef --- /dev/null +++ b/src/little/buildroot-ext/package/mvx_player/src/mvx_list.h @@ -0,0 +1,139 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef __MVX_LIST_H__ +#define __MVX_LIST_H__ + +/**************************************************************************** + * Includes + ****************************************************************************/ + +#include +#include + +/**************************************************************************** + * Defines + ****************************************************************************/ + +#define mvx_list_entry(head, type, member) \ + (type *)((char *)head - offsetof(type, member)) + +#define mvx_list_first_entry(list, type, member) \ + mvx_list_entry((list)->root.next, type, member) + +#define mvx_list_next_entry(ptr, member) \ + mvx_list_entry((ptr)->member.next, typeof(*ptr), member) + +#define mvx_list_end_entry(list, type, member) \ + mvx_list_entry(&(list)->root, type, member) + +#define mvx_list_for_each_entry(list, ptr, member) \ + for (ptr = mvx_list_first_entry(list, typeof(*ptr), member); \ + ptr != mvx_list_end_entry(list, typeof(*ptr), member); \ + ptr = mvx_list_next_entry(ptr, member)) + +#define mvx_list_for_each_entry_safe(list, ptr, member, tmp) \ + for (ptr = mvx_list_first_entry(list, typeof(*ptr), member), \ + tmp = (ptr)->member.next; \ + ptr != mvx_list_end_entry(list, typeof(*ptr), member); \ + ptr = mvx_list_entry(tmp, typeof(*ptr), member), \ + tmp = tmp->next) + +/**************************************************************************** + * Types + ****************************************************************************/ + +struct mvx_list_head { + struct mvx_list_head *next; + struct mvx_list_head *prev; +}; + +struct mvx_list { + struct mvx_list_head root; +}; + +/**************************************************************************** + * Static functions + ****************************************************************************/ + +static inline void mvx_list_construct(struct mvx_list *list) +{ + list->root.next = &list->root; + list->root.prev = &list->root; +} + +/** + * Insert 'add' after 'curr'. + */ +static inline void mvx_list_add(struct mvx_list_head *curr, + struct mvx_list_head *add) +{ + add->next = curr->next; + add->prev = curr; + curr->next->prev = add; + curr->next = add; +} + +static inline void mvx_list_add_tail(struct mvx_list *list, + struct mvx_list_head *add) +{ + mvx_list_add(list->root.prev, add); +} + +static inline void mvx_list_add_head(struct mvx_list *list, + struct mvx_list_head *add) +{ + mvx_list_add(&list->root, add); +} + +static inline void mvx_list_del(struct mvx_list_head *head) +{ + head->next->prev = head->prev; + head->prev->next = head->next; +} + +static inline bool mvx_list_empty(struct mvx_list *list) +{ + return list->root.next == &list->root; +} + +static inline size_t mvx_list_size(struct mvx_list *list) +{ + size_t size = 0; + struct mvx_list_head *head; + + for (head = list->root.next; head != &list->root; head = head->next) + size++; + + return size; +} + +#endif /* __MVX_LIST_H__ */ diff --git a/src/little/buildroot-ext/package/mvx_player/src/mvx_player.cpp b/src/little/buildroot-ext/package/mvx_player/src/mvx_player.cpp new file mode 100755 index 000000000..14fc11344 --- /dev/null +++ b/src/little/buildroot-ext/package/mvx_player/src/mvx_player.cpp @@ -0,0 +1,7401 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +/**************************************************************************** + * Includes + ****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +// #include +#include "ion.h" + +#include "mvx_player.hpp" +#include "md5.h" + +using namespace std; + +/**************************************************************************** + * Defines + ****************************************************************************/ +// Define bit field extract and test macros +// SBFX = signed bitfield extract +// BFS = bit field set +#define SBFX(Rn,lsb,width) ((int32_t)((Rn)<<(32-(lsb)-(width)))>>(32-(width))) +#define BFS(Rn,lsb,width) (((Rn)&((1u<<(width))-1))<<(lsb)) +#define UBFX(Rn,lsb,width) ((uint32_t)((Rn)<<(32-(lsb)-(width)))>>(32-(width))) + +// Extract macros as above but with width macro automatically generated +#define GET(lsb,Rn) UBFX(Rn,lsb,lsb ## _SZ) +#define SET(lsb,Rn) BFS(Rn,lsb,lsb ## _SZ) +#define SGET(lsb,Rn) SBFX(Rn,lsb,lsb ## _SZ) + +#ifndef V4L2_BUF_FLAG_LAST +#define V4L2_BUF_FLAG_LAST 0x00100000 +#endif + +#define V4L2_ALLOCATE_BUFFER_ROI 1048576 * 3 +#define V4L2_READ_LEN_BUFFER_ROI 1048576 * 2 + +#ifndef V4L2_EVENT_SOURCE_CHANGE +#define V4L2_EVENT_SOURCE_CHANGE 5 +#endif + +#ifndef MVX_AD_STATS_THUMBNAIL_SIZE +#define MVX_AD_STATS_THUMBNAIL_SIZE (3*4096) +#endif + + + +typedef reader::result result; +/**************************************************************************** + * Misc + ****************************************************************************/ + +template +static T divRoundUp(T value, U round) +{ + return (value + round - 1) / round; +} + +template +static T roundUp(T value, U round) +{ + return divRoundUp(value, round) * round; +} + +/* +static void swapInt32( int32_t& value) +{ + int32_t tmp =value; + value = ((tmp & 0x000000FF) << 24) | + ((tmp & 0x0000FF00) << 8) | + ((tmp & 0x00FF0000) >> 8) | + ((tmp & 0xFF000000) >> 24) ; +} +*/ + +static void swapUint32( uint32_t& value) +{ + uint32_t tmp =value; + value = ((tmp & 0x000000FF) << 24) | + ((tmp & 0x0000FF00) << 8) | + ((tmp & 0x00FF0000) >> 8) | + ((tmp & 0xFF000000) >> 24) ; +} + +static void swapUint16( uint16_t& value) +{ + uint16_t tmp =value; + value = ((tmp & 0x00FF) << 8) | ((tmp & 0xFF00) >> 8); +} + +/**************************************************************************** + * Exception + ****************************************************************************/ + +Exception::Exception(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + vsnprintf(msg, sizeof(msg), fmt, ap); + va_end(ap); +} + +Exception::Exception(const string &str) +{ + strncpy(msg, str.c_str(), sizeof(msg)); +} + +Exception::~Exception() throw() +{} + +const char *Exception::what() const throw() +{ + return msg; +} + +/**************************************************************************** + * Input and output + ****************************************************************************/ + +const uint32_t IVFHeader::signatureDKIF = v4l2_fourcc('D', 'K', 'I', 'F'); +static const uint8_t startCode[4] = { 0x00, 0x00, 0x00, 0x01 }; +static const uint8_t subStartCode[3] = { 0x00, 0x00, 0x01 }; +static std::mutex m_Mutex; + +//COnfiguration file maximum line lengths, for use by fgets() +//ROI requires 512 +//ERP requires 10+1 + 7+1 + 11+1 + (22+1)*256 = 5919 (8k width) +#define CFG_FILE_LINE_SIZE (6144) +static char cfg_file_line_buf[CFG_FILE_LINE_SIZE]; +//static int startcode_find_candidate(char *buf, int size); + +IVFHeader::IVFHeader() : + signature(signatureDKIF), + version(0), + length(32), + codec(0), + width(0), + height(0), + frameRate(30 << 16), + timeScale(1 << 16), + frameCount(0), + padding(0) +{} + +IVFHeader::IVFHeader(uint32_t codec, uint16_t width, uint16_t height) : + signature(signatureDKIF), + version(0), + length(32), + codec(codec), + width(width), + height(height), + frameRate(30 << 16), + timeScale(1 << 16), + frameCount(0), + padding(0) +{} + +IVFFrame::IVFFrame() : + size(0), + timestamp(0) +{} + +IVFFrame::IVFFrame(uint32_t size, uint64_t timestamp) : + size(size), + timestamp(timestamp) +{} + +const uint8_t VC1SequenceLayerData::magic1 = 0xC5; +const uint32_t VC1SequenceLayerData::magic2 = 4; + +VC1SequenceLayerData::VC1SequenceLayerData() : + numFrames(0), + signature1(0), + signature2(0), + headerC(), + restOfSLD() +{} + +VC1FrameLayerData::VC1FrameLayerData() : + frameSize(0), + reserved(0), + key(0), + timestamp(0) +{} + + + +RVHeader::RVHeader() +{} + +const uint32_t RVHeader::signatureVIDO = v4l2_fourcc('V', 'I', 'D', 'O'); +const uint32_t RVHeader::signatureRV30 = v4l2_fourcc('R', 'V', '3', '0'); +const uint32_t RVHeader::signatureRV40 = v4l2_fourcc('R', 'V', '4', '0'); + +RVFrame::RVFrame() +{} + +const uint32_t RVFrame::slicestartcode = 0x00000001; + +RVSlice::RVSlice() +{} + + +AFBCHeader::AFBCHeader() +{} + +AFBCHeader::AFBCHeader(const v4l2_format &format, size_t frameSize, const v4l2_crop &crop, bool tiled, const int field) : + magic(MAGIC), + headerSize(sizeof(AFBCHeader)), + version(VERSION), + frameSize(frameSize), + numComponents(0), + subsampling(0), + yuvTransform(false), + blockSplit(false), + yBits(0), + cbBits(0), + crBits(0), + alphaBits(0), + mbWidth(0), + mbHeight(0), + width(0), + height(0), + cropLeft(crop.c.left), + cropTop(crop.c.top), + param(0), + fileMessage(field) +{ + uint32_t pixelformat; + + if (V4L2_TYPE_IS_MULTIPLANAR(format.type)) + { + const v4l2_pix_format_mplane &f = format.fmt.pix_mp; + + width = f.width; + height = f.height; + pixelformat = f.pixelformat; + } + else + { + const v4l2_pix_format &f = format.fmt.pix; + + width = f.width; + height = f.height; + pixelformat = f.pixelformat; + } + + if (field != FIELD_NONE) + { + height = divRoundUp(height, 2); + } + mbWidth = (width + cropLeft + 15) / 16; + mbHeight = (height + cropTop + 15) / 16; + + switch (pixelformat) + { + case V4L2_PIX_FMT_YUV420_AFBC_8: + numComponents = 3; + subsampling = 1; + yBits = 8; + crBits = 8; + cbBits = 8; + alphaBits = 0; + break; + case V4L2_PIX_FMT_YUV420_AFBC_10: + numComponents = 3; + subsampling = 1; + yBits = 10; + crBits = 10; + cbBits = 10; + alphaBits = 0; + break; + case V4L2_PIX_FMT_YUV422_AFBC_8: + numComponents = 3; + subsampling = 2; + yBits = 8; + crBits = 8; + cbBits = 8; + alphaBits = 0; + break; + case V4L2_PIX_FMT_YUV422_AFBC_10: + numComponents = 3; + subsampling = 2; + yBits = 10; + crBits = 10; + cbBits = 10; + alphaBits = 0; + break; + default: + throw Exception("Unsupported AFBC pixel format. pixelformat=0x%x.", pixelformat); + } + + if (tiled) + { + param |= (PARAM_TILED_BODY | PARAM_TILED_HEADER); + } +} + + + + + +IO::IO(uint32_t format, size_t width, size_t height, size_t strideAlign) : + format(format), + width(width), + height(height), + strideAlign(strideAlign) +{} + +Input::Input(uint32_t format, size_t width, size_t height, size_t strideAlign) : + IO(format, width, height, strideAlign) +{ + if (format == V4L2_PIX_FMT_VC1_ANNEX_G) + { + profile = 12; + } + dir = 0; +} + +InputFile::InputFile(istream &input, uint32_t format) : + Input(format), + input(input) +{ + state = 7; + offset=0; + curlen=0; + iseof = false; + naluFmt = 0; + remaining_bytes = 0; +} + +InputFile::InputFile(istream &input, uint32_t format, size_t width, size_t height, size_t strideAlign) : + Input(format, width, height, strideAlign), + input(input) +{ + state = 7; + offset=0; + curlen=0; + iseof = false; + naluFmt = 0; + remaining_bytes = 0; +} + +InputFile::~InputFile() +{ + if (inputBuf) { + free(inputBuf); + } + if (reader) { + delete reader; + } +} + +void InputFile::prepare(Buffer &buf) +{ + vector iov = buf.getImageSize(); + buf.getBuffer().flags = 0; + if (getNaluFormat() != V4L2_OPT_NALU_FORMAT_START_CODES) { + reader::result res; + uint8_t *buffer_data = static_cast(iov[0].iov_base); + uint32_t buffer_size = buf.getBuffer().length; + uint32_t buf_offset = 0; + int mode = 0, nalu_val = 0; + { + m_Mutex.lock(); + if (!reader) { + reader = new start_code_reader(getFormat(), &input); + switch(getNaluFormat()){ + case V4L2_OPT_NALU_FORMAT_ONE_BYTE_LENGTH_FIELD: + case V4L2_OPT_NALU_FORMAT_TWO_BYTE_LENGTH_FIELD: + case V4L2_OPT_NALU_FORMAT_FOUR_BYTE_LENGTH_FIELD: + mode |= reader::RMODE_DELIMITED; + if (V4L2_OPT_NALU_FORMAT_ONE_BYTE_LENGTH_FIELD == getNaluFormat()) { + nalu_val = 1; + } else if (V4L2_OPT_NALU_FORMAT_TWO_BYTE_LENGTH_FIELD == getNaluFormat()) { + nalu_val = 2; + } else { + nalu_val = 4; + } + reader->set_metadata(reader::RMETA_DELIMITER_LENGTH, nalu_val); + break; + case V4L2_OPT_NALU_FORMAT_ONE_NALU_PER_BUFFER: + mode |= reader::RMODE_PACKETED; + send_end_of_subframe_flag = true; + send_end_of_frame_flag = true; + break; + case V4L2_OPT_NALU_FORMAT_ONE_FRAME_PER_BUFFER: + send_end_of_frame_flag = true; + break; + } + if (send_end_of_subframe_flag || send_end_of_frame_flag) { + mode |= reader::RMODE_FLAGS; + } + input.seekg(0, ios::end); + reader->setFileLength((uint64_t)input.tellg()); + input.seekg(0,ios::beg); + reader->set_mode(mode); + } + m_Mutex.unlock(); + } + do { + uint32_t filled_size; + res = reader->read(0, buffer_data+buf_offset, buffer_size-buf_offset, &filled_size); + buf_offset += filled_size; + + if(res == reader::RR_EOS) + { + break; + } + if(send_end_of_frame_flag && (res==reader::RR_EOP_FRAME || res==reader::RR_EOP_CODEC_CONFIG)) + { + break; + } + bool eosf = res==reader::RR_EOP || res==reader::RR_EOP_FRAME || res==reader::RR_EOP_CODEC_CONFIG; + if(send_end_of_subframe_flag && eosf) + { + break; + } + } while (buf_offset < buffer_size); + if(res==reader::RR_EOP_CODEC_CONFIG) + { + buf.setCodecConfig( true ); + } + if(res==reader::RR_EOP_FRAME && send_end_of_frame_flag) + { + buf.setEndOfFrame( true ); + } + if((res==reader::RR_EOP || res == reader::RR_EOP_FRAME || res==reader::RR_EOP_CODEC_CONFIG) && send_end_of_subframe_flag) + { + buf.setEndOfSubFrame( true ); + } + if(res==reader::RR_EOS) + { + iseof = true; + buf.setEndOfStream( true ); + } + iov[0].iov_len = buf_offset; + buf.setBytesUsed(iov); + } else { + for (size_t i = 0; i < iov.size(); ++i) + { + input.read(static_cast(iov[i].iov_base), iov[i].iov_len); + if ((unsigned int)input.gcount() < iov[i].iov_len) { + iseof = true; + + } + iov[i].iov_len = input.gcount(); + } + + buf.setBytesUsed(iov); + } +} + +/*int startcode_find_candidate(char *buf, int size){ + int i = 0; + for (; i < size; i++){ + if (!buf[i]) + break; + } + return i; +}*/ +bool InputFile::eof() +{ + //return input.peek() == EOF; + return iseof; +} + +InputIVF::InputIVF(istream &input, uint32_t informat) : + InputFile(input, 0) +{ + IVFHeader header; + left_bytes = 0; + input.read(reinterpret_cast(&header), sizeof(header)); + + if (header.signature != IVFHeader::signatureDKIF) + { + char *c = reinterpret_cast(&header.signature); + throw Exception("Incorrect DKIF signature. signature=%c%c%c%c.", c[0], c[1], c[2], c[3]); + } + + if (header.version != 0) + { + throw Exception("Incorrect DKIF version. version=%u.", header.version); + } + + if (header.length != 32) + { + throw Exception("Incorrect DKIF length. length=%u.", header.length); + } + if (informat != header.codec) { + format = informat; + } else { + format = header.codec; + } +} + +bool InputIVF::eof() +{ + return input.peek() == EOF; +} + +void InputIVF::prepare(Buffer &buf) +{ + uint32_t cal_size = 0; + if (left_bytes == 0) { + IVFFrame frame; + input.read(reinterpret_cast(&frame), sizeof(frame)); + cal_size = frame.size; + timestamp = frame.timestamp; + + } else { + cal_size = left_bytes; + } + + vector iov = buf.getImageSize(); + uint32_t read_bytes = cal_size > iov[0].iov_len? iov[0].iov_len:cal_size; + input.read(static_cast(iov[0].iov_base), read_bytes); + if (input.gcount() < read_bytes){ + cout<<"read less than need!."<(&sld), sizeof(sld)); + + if (sld.signature1 != VC1SequenceLayerData::magic1 || + sld.signature2 != VC1SequenceLayerData::magic2) + { + cout<<"This is a raw stream of VC1!"<(q); + profile = hc.profile; + + format = V4L2_PIX_FMT_VC1_ANNEX_L; + + codecConfigSent = false; + isRcv = true; + } +} + +bool InputRCV::eof() +{ + return input.peek() == EOF; +} + +void InputRCV::prepare(Buffer &buf) +{ + vector iov = buf.getImageSize(); + if (!isRcv) { + InputFile::prepare(buf); + return; + } + if (codecConfigSent != false) + { + uint32_t cal_size = 0; + uint32_t read_bytes = 0; + char * read_addr; + uint32_t offset = 0; + VC1FrameLayerData *fld = static_cast(iov[0].iov_base); + if (left_bytes == 0) { + input.read(reinterpret_cast(fld), sizeof(*fld)); + cal_size = fld->frameSize; + read_addr = reinterpret_cast(fld->data); + offset = sizeof(*fld); + } else { + cal_size = left_bytes; + read_addr = static_cast(iov[0].iov_base); + } + read_bytes = iov[0].iov_len - offset > cal_size?cal_size:iov[0].iov_len - offset; + input.read(read_addr, read_bytes); + iov[0].iov_len = input.gcount() + offset; + left_bytes = cal_size > input.gcount()? cal_size - input.gcount(): 0; + buf.setEndOfFrame(left_bytes == 0); + } + else + { + memcpy(iov[0].iov_base, &sld, sizeof(sld)); + iov[0].iov_len = sizeof(sld); + + buf.setCodecConfig(true); + codecConfigSent = true; + } + + buf.setBytesUsed(iov); +} + + +InputRV::InputRV(istream &input) : + InputFile(input, 0) +{ + b_header_read =false; + frame_left_bytes =0; + slice_read_indx =0; + memset(&frameheader,0,sizeof(RVFrame)); + memset(&header,0,sizeof(RVFrame)); + input.read(reinterpret_cast(&header), sizeof(header)); + swapUint32(header.metlen); + cout<<"read a new RVHeader"; + cout<<" metlen:"< iov = buf.getImageSize(); + uint32_t read_bytes = cal_size > iov[0].iov_len ? iov[0].iov_len : cal_size; + + cout<<"read RVHeader config data"<(iov[0].iov_base), read_bytes); + if (input.gcount() < read_bytes){ + cout<<"read less than need!."<(&frameheader), sizeof(frameheader)); + + swapUint32(frameheader.size); //only include silce data size + swapUint32(frameheader.timestamp); + swapUint16(frameheader.sequencenum);//the same as framecnt + swapUint16(frameheader.flags);//not need to set to mve + swapUint32(frameheader.lastpacket); + swapUint32(frameheader.slicesnum); + + frame_left_bytes = frameheader.size; + slice_read_indx = 0; + + cout<<"read a new RVFrame header sequencenum:"<(&rvslice), sizeof(RVSlice)); + + swapUint32(rvslice.startcode); + swapUint32(rvslice.offset); + + if(rvslice.startcode != RVFrame::slicestartcode) + { + throw Exception("Incorrect slicestartcode:%x",rvslice.startcode); + } + + slice.push_back(rvslice); + cout<<"read slice header indx:"<< i <<" sliceoffset:"< iov = buf.getImageSize(); + uint32_t read_bytes = cal_size > iov[0].iov_len ? iov[0].iov_len : cal_size; + input.read(static_cast(iov[0].iov_base), read_bytes); + cout<<"read slice indx:"<< slice_read_indx <<" read_bytes:"< iov = buf.getImageSize(); + AFBCHeader header; + + input.read(reinterpret_cast(&header), sizeof(header)); + + if (header.version > AFBCHeader::VERSION) //if (header.version != AFBCHeader::VERSION) + { + throw Exception("Incorrect AFBC header version. got=%u, exptected <=%d.", header.version, AFBCHeader::VERSION); + } + + if (header.headerSize < sizeof(header)) + { + throw Exception("AFBC header size too small. size=%u.", header.headerSize); + } + + if (6 == header.version && 64 != header.headerSize) + { + throw Exception("Incorrect AFBC headerSize, got=%u, exptected 64 in header.version=%d.", header.headerSize, header.version); + } + + if (header.frameSize > iov[0].iov_len) + { + throw Exception("AFBC buffer too small. header_size=%u, frame_size=%u, buffer_size=%zu.", + header.headerSize, header.frameSize, iov[0].iov_len); + } + + size_t skip = header.headerSize - sizeof(header); + if (skip > 0) + { + input.ignore(skip); + } + + input.read(reinterpret_cast(iov[0].iov_base), header.frameSize); + if (input.gcount() != header.frameSize) + { + throw Exception("Too few AFBC bytes read. expected=%u, got=%zu.", + header.frameSize, input.gcount()); + } + + iov[0].iov_len = header.frameSize; + + buf.setBytesUsed(iov); + + bool tiled = header.param & AFBCHeader::PARAM_TILED_BODY; + buf.setTiled(tiled); + + bool superblock = 2 < header.subsampling; + buf.setSuperblock(superblock); +} + +bool InputAFBC::eof() +{ + return input.peek() == EOF; +} + + +InputFileFrame::InputFileFrame(istream &input, uint32_t format, size_t width, size_t height, + size_t strideAlign, size_t __stride[]) : + InputFile(input, format, width, height, strideAlign), + nplanes(0) +{ + memcpy(stride, __stride, sizeof(size_t) * 3); + framesize = Codec::getSize(format, width, height, strideAlign, nplanes, stride, size, heights); +} + +bool InputFileFrame::eof() +{ + return input.peek() == EOF || iseof; +} + +void InputFileFrame::prepare(Buffer &buf) +{ + if (chr_list){ + if (0 == prepared_frames) { + chr_cur = chr_list->begin(); + } + if (chr_list->end() != chr_cur && chr_cur->pic_index == prepared_frames) { + buf.setChrCfg(*chr_cur); + buf.setChrflag(true); + chr_cur++; + } else { + buf.setChrflag(false); + } + } + if (gop_list && gop_list->size()){ + struct v4l2_gop_config cfg = gop_list->front(); + + if (cfg.gop_pic == prepared_frames) { + buf.setGopResetCfg(cfg); + buf.setGopResetflag(true); + gop_list->pop(); + } else { + buf.setGopResetflag(false); + } + } else { + buf.setGopResetflag(false); + } + + if (ltr_list && ltr_list->size()){ + struct v4l2_reset_ltr_peroid_config cfg = ltr_list->front(); + + if (cfg.reset_trigger_pic == prepared_frames) { + buf.setLtrResetCfg(cfg); + buf.setLtrResetflag(true); + ltr_list->pop(); + } else { + buf.setLtrResetflag(false); + } + } else { + buf.setLtrResetflag(false); + } + + if (enc_stats_list && enc_stats_list->size()){ + struct v4l2_enc_stats_cfg stats_cfg = enc_stats_list->front(); + + if (stats_cfg.reset_pic == prepared_frames) { + buf.setResetStatsMode(stats_cfg.reset_pic, stats_cfg.reset_cfg); + enc_stats_list->pop(); + } else { + buf.setResetStatsMode(stats_cfg.reset_pic, 0); + } + } else { + buf.setResetStatsMode(prepared_frames, 0); + } + vector iov = buf.getImageSize(); + + if (nplanes != iov.size()) + { + throw Exception("Frame format and buffer have different number of planes. format=%zu, buffer=%zu.", + nplanes, iov.size()); + } + + for (size_t i = 0; i < nplanes; ++i) + { + if (size[i] > iov[i].iov_len) + { + throw Exception("Frame plane is larger than buffer plane. plane=%zu, plane_size=%zu, buffer_size=%zu.", + i, size[i], iov[0].iov_len); + } + + input.read(static_cast(iov[i].iov_base), size[i]); + if ((unsigned int)input.gcount() < iov[i].iov_len) { + iseof = true; + } + iov[i].iov_len = input.gcount(); + } + prepared_frames++; + buf.setBytesUsed(iov); +} + +InputFileMiniFrame::InputFileMiniFrame(std :: istream & input, uint32_t format, size_t width, size_t height, + size_t strideAlign, uint32_t mini_height, size_t __stride[]): + InputFileFrame(input, format, width, height, strideAlign, __stride), + miniframe_height(mini_height) +{ + for (size_t i = 0; i < 3; ++i) + { offset[i] = 0; is_done[i] = true;} + cnt_of_miniframe = divRoundUp(height, miniframe_height); + setReadHeight(miniframe_height); +} + +void InputFileMiniFrame::prepare(Buffer &buf) +{ + vector iov = buf.getImageSize(); + size_t readlen = 0; + size_t readheight = 0; + size_t quad = 0; + v4l2_buffer &v_buf = buf.getBuffer(); + v_buf.reserved2 |= V4L2_BUF_FLAG_MVX_MINIFRAME;//use this to indicate miniframe mode + if (nplanes != iov.size()) + { + throw Exception("Frame format and buffer have different number of planes. format=%zu, buffer=%zu.", + nplanes, iov.size()); + } + if (format == V4L2_PIX_FMT_Y0L2 || format == V4L2_PIX_FMT_AQB1) { + quad = 2; + } else { + quad = 1; + } + for (size_t i = 0; i < nplanes; ++i) + { + readheight = i >= 1 ? miniframe_height / (2 * quad) : miniframe_height / quad; + if (offset[i] + readheight * quad >= heights[i]) { + readheight = (heights[i] - offset[i]) / quad; + } + readlen = stride[i] * readheight; + input.seekg(count * framesize + offset[i] * stride[i] / quad); + if (i == 1) input.seekg(size[i - 1], ios::cur); + if (i == 2) input.seekg(size[i - 1] + size[i - 2], ios::cur); + v_buf.m.planes[i].reserved[10] = offset[i] << 16; //it's better that don't use miniframe mode with epr together. + offset[i] += (readheight * quad); + v_buf.m.planes[i].reserved[10] |= offset[i]; + input.read(static_cast(iov[i].iov_base), readlen); + cout<<"read bytes in plane:"<begin(); +} + +InputFileFrameWithROI::~InputFileFrameWithROI() +{ + if (roi_list) { + delete roi_list; + } +} + +void InputFileFrameWithROI::prepare(Buffer & buf) +{ + if (roi_list->end() != cur && cur->pic_index == prepared_frames) { + buf.setRoiCfg(*cur); + buf.setROIflag(true); + cur++; + } else { + buf.setROIflag(false); + } + InputFileFrame::prepare(buf); +} + +void InputFileFrameWithROI::load_roi_cfg() +{ + int pic_index, qp, num_roi, prio_valid = 0; + struct v4l2_mvx_roi_regions roi; + if (!roi_list) { + roi_list = new v4l2_roi_list_t; + } + while (roi_is.getline(cfg_file_line_buf, CFG_FILE_LINE_SIZE)){ + memset(&roi, 0, sizeof(struct v4l2_mvx_roi_regions)); + if (4 == sscanf(cfg_file_line_buf, "pic=%d qp=%d num_roi=%d prio_valid=%d",&pic_index,&qp,&num_roi, &prio_valid)) { + roi.pic_index = pic_index; + roi.qp = qp; + roi.num_roi = num_roi; + roi.roi_present = true; + roi.qp_present = true; + } else if (4 == sscanf(cfg_file_line_buf, "pic=%d num_roi=%d qp=%d prio_valid=%d",&pic_index,&num_roi,&qp, &prio_valid)) { + roi.pic_index = pic_index; + roi.qp = qp; + roi.num_roi = num_roi; + roi.roi_present = true; + roi.qp_present = true; + } else if (2 == sscanf(cfg_file_line_buf, "pic=%d num_roi=%d qp=%d prio_valid=%d",&pic_index,&num_roi,&qp, &prio_valid)) { + roi.pic_index = pic_index; + roi.qp = 0; + roi.num_roi = num_roi; + roi.roi_present = true; + roi.qp_present = false; + } else if (2 == sscanf(cfg_file_line_buf, "pic=%d qp=%d num_roi=%d prio_valid=%d",&pic_index,&qp,&num_roi, &prio_valid)) { + roi.pic_index = pic_index; + roi.qp = qp; + roi.num_roi = 0; + roi.roi_present = false; + roi.qp_present = true; + } else { + cout <<"parse ROI config file ERROR!"< V4L2_MVX_MAX_FRAME_REGIONS) { + cout <<"invalid n_regions value:"< 0){ + char *sub_buf1 = cfg_file_line_buf; + char *sub_buf2; + int match = 0; + for (int i = 0; i < roi.num_roi; i++) { + sub_buf2 = strstr(sub_buf1," roi="); + match = sscanf(sub_buf2, " roi={%hu,%hu,%hu,%hu,%hd,%hu,%hu}", + &roi.roi[i].mbx_left, &roi.roi[i].mbx_right, + &roi.roi[i].mby_top, &roi.roi[i].mby_bottom, + &roi.roi[i].qp_delta, &roi.roi[i].prio, &roi.roi[i].force_intra); + if (match != 7){ + cout<<"Error while parsing the ROI regions:"<push_back(roi); + } +} + +InputFileFrameWithEPR::InputFileFrameWithEPR(std :: istream & input, uint32_t format, size_t width, + size_t height, size_t strideAlign, std :: istream & epr, uint32_t oformat, size_t __stride[]) : + InputFileFrame(input, format, width, height, strideAlign, __stride), + epr_is(epr), + outformat(oformat) +{ + prepared_frames = 0; + load_epr_cfg(); + cur = epr_list->begin(); +} + +InputFileFrameWithEPR::~InputFileFrameWithEPR(){ + if (epr_list) { + delete epr_list; + } +} + +void InputFileFrameWithEPR::erp_adjust_bpr_to_64_64( + struct v4l2_buffer_general_rows_uncomp_body* uncomp_body, + int qp_delta, + uint32_t bpr_base_idx, + uint32_t row_off, + uint8_t force, + uint8_t quad_skip, + int local_base) +{ + if (bpr_base_idx < local_base + row_off) { + uncomp_body->bpr[bpr_base_idx].qp_delta = (uint16_t)(SET(V4L2_BLOCK_PARAM_RECORD_QP_DELTA_TOP_LEFT_16X16, qp_delta) + | SET(V4L2_BLOCK_PARAM_RECORD_QP_DELTA_TOP_RIGHT_16X16, qp_delta) + | SET(V4L2_BLOCK_PARAM_RECORD_QP_DELTA_BOT_LEFT_16X16, qp_delta) + | SET(V4L2_BLOCK_PARAM_RECORD_QP_DELTA_BOT_RIGHT_16X16, qp_delta) + | SET(V4L2_BLOCK_PARAM_RECORD_QP_FORCE_FIELD, force) + | SET(V4L2_BLOCK_PARAM_RECORD_QP_QUAD_SKIP, quad_skip)); + } + if (bpr_base_idx + 1 < local_base + row_off) + uncomp_body->bpr[bpr_base_idx + 1] = uncomp_body->bpr[bpr_base_idx]; + if (bpr_base_idx + row_off < local_base + 2 * row_off) + uncomp_body->bpr[bpr_base_idx + row_off] = uncomp_body->bpr[bpr_base_idx]; + if (bpr_base_idx + row_off + 1 < local_base + 2 * row_off) + uncomp_body->bpr[bpr_base_idx + row_off + 1] = uncomp_body->bpr[bpr_base_idx]; + //uncomp_body->bpr[bpr_base_idx].force = force; + //uncomp_body->bpr[bpr_base_idx + 1] = uncomp_body->bpr[bpr_base_idx]; + //uncomp_body->bpr[bpr_base_idx + 1].force = force; + //uncomp_body->bpr[bpr_base_idx + row_off] = uncomp_body->bpr[bpr_base_idx]; + //uncomp_body->bpr[bpr_base_idx + row_off].force = force; + //uncomp_body->bpr[bpr_base_idx + row_off + 1] = uncomp_body->bpr[bpr_base_idx]; + //uncomp_body->bpr[bpr_base_idx + row_off + 1].force = force; +} + +void InputFileFrameWithEPR::prepare(Buffer & buf) +{ + /*if (prepared_frames % 2 == 0) { + prepareEPR(buf); + } else { + InputFileFrame::prepare(buf); + } + prepared_frames++;*/ + if (epr_list->end() != cur && cur->pic_index == prepared_frames) { + prepareEPR(buf); + cur++; + } else { + InputFileFrame::prepare(buf); + } +} + +void InputFileFrameWithEPR::prepareEPR(Buffer & buf) +{ + vector iov = buf.getImageSize(); + v4l2_epr_list_t::iterator iter= cur; + v4l2_epr_list_t::iterator end= epr_list->end(); + /*for (; iter != end; iter++) { + if (iter->pic_index == prepared_frames / 2) { + break; + } + }*/ + if (cur != end) { + if (iter->qp_present) { + printf("set epr qp:%d, iframe_enabled:%d\n", iter->qp.qp, iter->qp.epr_iframe_enable); + buf.setQPofEPR(iter->qp); + } + if (iter->block_configs_present) { + struct v4l2_buffer_general_block_configs block_configs; + struct v4l2_core_buffer_header_general buffer_configs; + unsigned int blk_cfg_size = 0; + if (iter->block_configs.blk_cfg_type == V4L2_BLOCK_CONFIGS_TYPE_ROW_UNCOMP) { + blk_cfg_size += sizeof(block_configs.blk_cfgs.rows_uncomp); + + int max_cols = (getWidth()+31) >> 5; + int max_rows = (getHeight()+31) >> 5; + if (getRotation() % 360 == 90 || getRotation() % 360 == 270) { + swap(max_cols,max_rows); + } + block_configs.blk_cfgs.rows_uncomp.n_cols_minus1 = max_cols - 1; + block_configs.blk_cfgs.rows_uncomp.n_rows_minus1 = max_rows - 1; + size_t bpru_body_size; + if (outformat == V4L2_PIX_FMT_HEVC) { + if (getRotation() % 360 == 90 || getRotation() % 360 == 270) + { + max_rows = (getWidth() + 127) >> 7; + } + else + { + max_rows = (getHeight() + 127) >> 7; + } + max_rows *= 4; + bpru_body_size = max_rows * max_cols * sizeof(v4l2_buffer_general_rows_uncomp_body); + } else { + bpru_body_size = max_rows * max_cols * sizeof(v4l2_buffer_general_rows_uncomp_body); + } + struct v4l2_buffer_general_rows_uncomp_body *uncomp_body = + static_cast(iov[0].iov_base); + iov[0].iov_len = bpru_body_size; + cout<<"plane 0 size:"<block_configs.blk_cfgs.rows_uncomp.n_cols_minus1 + 1; + int n_rows = iter->block_configs.blk_cfgs.rows_uncomp.n_rows_minus1 + 1; + for (int j = 0; j < n_rows; j++) + { + for (int i = 0; i < n_cols; i++) + { + int idx = (j * n_cols) + i; + unsigned int quad_qp_delta = iter->bc_row_body.uncomp->bpr[idx].qp_delta; + printf(" bpr[%u]={%d,%d,%d,%d,0x%x,0x%x,0x%x}\n", idx, + (int)SGET(V4L2_BLOCK_PARAM_RECORD_QP_DELTA_TOP_LEFT_16X16, quad_qp_delta), + (int)SGET(V4L2_BLOCK_PARAM_RECORD_QP_DELTA_TOP_RIGHT_16X16, quad_qp_delta), + (int)SGET(V4L2_BLOCK_PARAM_RECORD_QP_DELTA_BOT_LEFT_16X16, quad_qp_delta), + (int)SGET(V4L2_BLOCK_PARAM_RECORD_QP_DELTA_BOT_RIGHT_16X16, quad_qp_delta), + (uint8_t)GET(V4L2_BLOCK_PARAM_RECORD_QP_FORCE_FIELD, quad_qp_delta), + (uint8_t)GET(V4L2_BLOCK_PARAM_RECORD_QP_QUAD_SKIP, quad_qp_delta), + (uint8_t)GET(V4L2_BLOCK_PARAM_RECORD_QP_ABSOLUTE, quad_qp_delta)); + } + } + //qp-set quad granularity is 32*32, the minimum qp-set granularity + //is 16*16. These keep the same with H264. Pls not the FS flag in + //ME QUADCFG register. + if (true) { + for (int row = 0; row < n_rows; row++) { + memcpy(&uncomp_body->bpr[row * max_cols], + &iter->bc_row_body.uncomp->bpr[row * n_cols], + n_cols * sizeof(uncomp_body->bpr[0])); + for (int col = n_cols; col < max_cols; col++) { + memcpy(&uncomp_body->bpr[(row * max_cols) + col], + &uncomp_body->bpr[(row * max_cols) + n_cols - 1], + sizeof(uncomp_body->bpr[0])); + // bpr quad skip flag cant not inherit + uncomp_body->bpr[(row * max_cols) + col].qp_delta &= ~((uint32_t)SET(V4L2_BLOCK_PARAM_RECORD_QP_QUAD_SKIP, 1)); + uncomp_body->bpr[(row * max_cols) + col].qp_delta &= ~((uint32_t)SET(V4L2_BLOCK_PARAM_RECORD_QP_ABSOLUTE, 1)); + uncomp_body->bpr[(row * max_cols) + col].qp_delta &= ~((uint32_t)SET(V4L2_BLOCK_PARAM_RECORD_QUAD_FORCE_INTRA, 1)); + } + } + for (int row = n_rows; row < max_rows; row++) { + memcpy(&uncomp_body->bpr[row * max_cols], + &uncomp_body->bpr[(n_rows - 1) * max_cols], + max_cols * sizeof(uncomp_body->bpr[0])); + // bpr quad skip and absolute QP flag cant not inherit + for(int tmpj = 0; tmpj < max_cols; tmpj++) { + uncomp_body->bpr[row * max_cols + tmpj].qp_delta &= ~((uint32_t)SET(V4L2_BLOCK_PARAM_RECORD_QP_QUAD_SKIP, 1)); + uncomp_body->bpr[(row * max_cols) + tmpj].qp_delta &= ~((uint32_t)SET(V4L2_BLOCK_PARAM_RECORD_QP_ABSOLUTE, 1)); + uncomp_body->bpr[(row * max_cols) + tmpj].qp_delta &= ~((uint32_t)SET(V4L2_BLOCK_PARAM_RECORD_QUAD_FORCE_INTRA, 1)); + } + + } + } else { + for (int row = 0; row < n_rows; row++) + { + for (int k=0; kbc_row_body.uncomp->bpr[row * n_cols + k].qp_delta; + int top_left = (int)SGET(V4L2_BLOCK_PARAM_RECORD_QP_DELTA_TOP_LEFT_16X16, quad_qp_delta); + int top_right = (int)SGET(V4L2_BLOCK_PARAM_RECORD_QP_DELTA_TOP_RIGHT_16X16, quad_qp_delta); + int bot_left = (int)SGET(V4L2_BLOCK_PARAM_RECORD_QP_DELTA_BOT_LEFT_16X16, quad_qp_delta); + int bot_right = (int)SGET(V4L2_BLOCK_PARAM_RECORD_QP_DELTA_BOT_RIGHT_16X16, quad_qp_delta); + uint8_t force = (uint8_t)GET(V4L2_BLOCK_PARAM_RECORD_QP_FORCE_FIELD, quad_qp_delta); + uint8_t quad_skip = (uint8_t)GET(V4L2_BLOCK_PARAM_RECORD_QP_QUAD_SKIP, quad_qp_delta); + // top left 64*64 + erp_adjust_bpr_to_64_64(uncomp_body, top_left, 4*row*max_cols + 4*k, max_cols, force, quad_skip, 4*row*max_cols); + // top right 64*64 + erp_adjust_bpr_to_64_64(uncomp_body, top_right, 4*row*max_cols + 4*k + 2, max_cols, force, quad_skip, 4*row*max_cols); + // bottom left 64*64 + erp_adjust_bpr_to_64_64(uncomp_body, bot_left, 4*row*max_cols + 2*max_cols + 4*k, max_cols, force, quad_skip, 4*row*max_cols + 2*max_cols); + // bottom right 64*64 + erp_adjust_bpr_to_64_64(uncomp_body, bot_right, 4*row*max_cols + 2*max_cols + 4*k + 2, max_cols, force, quad_skip, 4*row*max_cols + 2*max_cols); + } + // extend the end of a row + for (int col = 4*n_cols; col < max_cols; col++) + { + memcpy(&uncomp_body->bpr[(4*row * max_cols) + col], + &uncomp_body->bpr[(4*row * max_cols) + 4*n_cols - 1], + sizeof(uncomp_body->bpr[0])); + memcpy(&uncomp_body->bpr[(4*row * max_cols + max_cols) + col], + &uncomp_body->bpr[(4*row * max_cols + max_cols) + 4*n_cols - 1], + sizeof(uncomp_body->bpr[0])); + memcpy(&uncomp_body->bpr[(4*row * max_cols + 2*max_cols) + col], + &uncomp_body->bpr[(4*row * max_cols + 2*max_cols) + 4*n_cols - 1], + sizeof(uncomp_body->bpr[0])); + memcpy(&uncomp_body->bpr[(4*row * max_cols + 3*max_cols) + col], + &uncomp_body->bpr[(4*row * max_cols + 3*max_cols) + 4*n_cols - 1], + sizeof(uncomp_body->bpr[0])); + // bpr quad skip flag cant not inherit + uncomp_body->bpr[(4*row * max_cols) + col].qp_delta &= ~((uint32_t)SET(V4L2_BLOCK_PARAM_RECORD_QP_QUAD_SKIP, 1)); + uncomp_body->bpr[(4*row * max_cols + max_cols) + col].qp_delta &= ~((uint32_t)SET(V4L2_BLOCK_PARAM_RECORD_QP_QUAD_SKIP, 1)); + uncomp_body->bpr[(4*row * max_cols + 2*max_cols) + col].qp_delta &= ~((uint32_t)SET(V4L2_BLOCK_PARAM_RECORD_QP_QUAD_SKIP, 1)); + uncomp_body->bpr[(4*row * max_cols + 3*max_cols) + col].qp_delta &= ~((uint32_t)SET(V4L2_BLOCK_PARAM_RECORD_QP_QUAD_SKIP, 1)); + } + } + for (int row = 4*n_rows; row < max_rows; row++) { + // extend the last row + memcpy(&uncomp_body->bpr[row * max_cols], + &uncomp_body->bpr[(row - 4) * max_cols], + max_cols * sizeof(uncomp_body->bpr[0])); + // bpr quad skip flag cant not inherit + for(int tmpj = 0; tmpj < max_cols; tmpj++) { + uncomp_body->bpr[row * max_cols + tmpj].qp_delta &= ~((uint32_t)SET(V4L2_BLOCK_PARAM_RECORD_QP_QUAD_SKIP, 1)); + } + } + } + + block_configs.blk_cfg_type = iter->block_configs.blk_cfg_type; + blk_cfg_size += sizeof(block_configs.blk_cfg_type); + blk_cfg_size += sizeof(block_configs.reserved); + + buffer_configs.type = V4L2_BUFFER_GENERAL_TYPE_BLOCK_CONFIGS; + buffer_configs.buffer_size = bpru_body_size; + buffer_configs.config_size = blk_cfg_size; + memcpy(&buffer_configs.config.config, &block_configs, blk_cfg_size); + memcpy(&buf.getBuffer().m.planes[0].reserved[0], &buffer_configs, sizeof(buffer_configs.buffer_size) + + sizeof(buffer_configs.type) + sizeof(buffer_configs.config_size) + blk_cfg_size); + + } + } + } + for (uint32_t i = 1; i < iov.size(); i++) { + iov[i].iov_len = 0; + } + buf.setBytesUsed(iov); + buf.setEPRflag(); +} + +void InputFileFrameWithEPR::read_row_cfg(char * buf, int row, int len, epr_config & config) +{ + char *sub_buf1, *sub_buf2; + int quad_qp_delta[4]; + uint8_t force_tmp, force_qual_skip, absolute_qp, force_intra, select_qp_delta; + int quad_min_qp[4]={0}; + struct v4l2_block_param_record *bpr = NULL; + int n_cols = config.block_configs.blk_cfgs.rows_uncomp.n_cols_minus1 + 1; + if (row == 0) + { + config.block_configs.blk_cfgs.rows_uncomp.n_cols_minus1 = len - 1; + } + bpr = &config.bc_row_body.uncomp->bpr[row * n_cols]; + sub_buf1 = buf; + + for (int i = 0; i< len; i++) { + sub_buf2 = strstr(sub_buf1, " bpr="); + //assert(sub_buf2); + if (!sub_buf2) { + printf("Error : the real bpr number is less than num_bpr for picture =%d (%s))\n", + config.pic_index, cfg_file_line_buf); + return; + } + if (13 == sscanf(sub_buf2, " bpr={%d,%d,%d,%d,%hhi,%hhi,%hhi,%hhi,%d,%d,%d,%d,%hhi}", + &quad_qp_delta[0], + &quad_qp_delta[1], + &quad_qp_delta[2], + &quad_qp_delta[3], + &force_tmp, + &force_qual_skip, + &absolute_qp, + &force_intra, + &quad_min_qp[0], + &quad_min_qp[1], + &quad_min_qp[2], + &quad_min_qp[3], + &select_qp_delta)) { + } else if(12 == sscanf(sub_buf2, " bpr={%d,%d,%d,%d,%hhi,%hhi,%hhi,%hhi,%d,%d,%d,%d}", + &quad_qp_delta[0], + &quad_qp_delta[1], + &quad_qp_delta[2], + &quad_qp_delta[3], + &force_tmp, + &force_qual_skip, + &absolute_qp, + &force_intra, + &quad_min_qp[0], + &quad_min_qp[1], + &quad_min_qp[2], + &quad_min_qp[3])) { + } else if(8 == sscanf(sub_buf2, " bpr={%d,%d,%d,%d,%hhi,%hhi,%hhi,%hhi}", + &quad_qp_delta[0], + &quad_qp_delta[1], + &quad_qp_delta[2], + &quad_qp_delta[3], + &force_tmp, + &force_qual_skip, + &absolute_qp, + &force_intra)){ + } else { + printf("Error while parsing the row BPR[%d]\n", i); + } + assert(V4L2_BLOCK_PARAM_RECORD_QP_DELTA_TOP_LEFT_16X16_SZ == V4L2_BLOCK_PARAM_RECORD_QP_DELTA_TOP_RIGHT_16X16_SZ && + V4L2_BLOCK_PARAM_RECORD_QP_DELTA_TOP_LEFT_16X16_SZ == V4L2_BLOCK_PARAM_RECORD_QP_DELTA_BOT_LEFT_16X16_SZ && + V4L2_BLOCK_PARAM_RECORD_QP_DELTA_TOP_LEFT_16X16_SZ == V4L2_BLOCK_PARAM_RECORD_QP_DELTA_BOT_RIGHT_16X16_SZ); + + const int qpd_min = -(1 << (V4L2_BLOCK_PARAM_RECORD_QP_DELTA_TOP_LEFT_16X16_SZ - 1)); + const int qpd_max = (1 << (V4L2_BLOCK_PARAM_RECORD_QP_DELTA_TOP_LEFT_16X16_SZ - 1)) - 1; + if (quad_qp_delta[0] < qpd_min || quad_qp_delta[0] > qpd_max || + quad_qp_delta[1] < qpd_min || quad_qp_delta[1] > qpd_max || + quad_qp_delta[2] < qpd_min || quad_qp_delta[2] > qpd_max || + quad_qp_delta[3] < qpd_min || quad_qp_delta[3] > qpd_max) { + + printf("Error qp_deltas (%d,%d,%d,%d) are out of range (min=%d, max=%d)\n", + quad_qp_delta[0], quad_qp_delta[1], quad_qp_delta[2], quad_qp_delta[3], + qpd_min, qpd_max); + + } + bpr[i].qp_delta = SET(V4L2_BLOCK_PARAM_RECORD_QP_DELTA_TOP_LEFT_16X16, quad_qp_delta[0]); + bpr[i].qp_delta |= SET(V4L2_BLOCK_PARAM_RECORD_QP_DELTA_TOP_RIGHT_16X16, quad_qp_delta[1]); + bpr[i].qp_delta |= SET(V4L2_BLOCK_PARAM_RECORD_QP_DELTA_BOT_LEFT_16X16, quad_qp_delta[2]); + bpr[i].qp_delta |= SET(V4L2_BLOCK_PARAM_RECORD_QP_DELTA_BOT_RIGHT_16X16, quad_qp_delta[3]); + bpr[i].qp_delta |= SET(V4L2_BLOCK_PARAM_RECORD_QP_FORCE_FIELD, force_tmp); + bpr[i].qp_delta |= SET(V4L2_BLOCK_PARAM_RECORD_QP_QUAD_SKIP, force_qual_skip); + bpr[i].qp_delta |= SET(V4L2_BLOCK_PARAM_RECORD_QP_ABSOLUTE, absolute_qp); + bpr[i].qp_delta |= SET(V4L2_BLOCK_PARAM_RECORD_QUAD_FORCE_INTRA, force_intra); + if( quad_min_qp[0] < 0 || quad_min_qp[0] > 51 || + quad_min_qp[1] < 0 || quad_min_qp[1] > 51 || + quad_min_qp[2] < 0 || quad_min_qp[2] > 51 || + quad_min_qp[3] < 0 || quad_min_qp[3] > 51) + { + printf("Error min_qp (%d,%d,%d,%d) are out of range (min=0, max=51)\n", + quad_min_qp[0], quad_min_qp[1], quad_min_qp[2], quad_min_qp[3]); + } + bpr[i].min_qp = SET(V4L2_BLOCK_PARAM_RECORD_MIN_QP_TOP_LEFT_16X16, quad_min_qp[0]); + bpr[i].min_qp |= SET(V4L2_BLOCK_PARAM_RECORD_MIN_QP_TOP_RIGHT_16X16, quad_min_qp[1]); + bpr[i].min_qp |= SET(V4L2_BLOCK_PARAM_RECORD_MIN_QP_BOT_LEFT_16X16, quad_min_qp[2]); + bpr[i].min_qp |= SET(V4L2_BLOCK_PARAM_RECORD_MIN_QP_BOT_RIGHT_16X16, quad_min_qp[3]); + bpr[i].min_qp |= SET(V4L2_BLOCK_PARAM_RECORD_QUAD_SELECT_QP_DELTA, select_qp_delta); + + sub_buf1 = sub_buf2 + 5; + } + sub_buf2 = strstr(sub_buf1, " bpr="); + if (sub_buf2) { + printf("Error : the real bpr number is larger than num_bpr for picture =%d (%s)\n", + config.pic_index, cfg_file_line_buf); + } + /* + for (int i=len; iqp.qp)) + { + cout<<"Error while parsing qp:"<qp_present = true; + epr_count++; + } + // iframe enable + config->qp.epr_iframe_enable = 1; // default is on + sub_buf1 = strstr(buf, " iframe_enable="); + if (sub_buf1) + { + if (1 != sscanf(sub_buf1, " iframe_enable=%u", + &config->qp.epr_iframe_enable)) + { + printf("Error while parsing qp %s\n", sub_buf1); + } + } + if (epr_count != num_epr) + { + cout<<"Error not parsed enough EPRs"<> 5) * ((getHeight() +31) >> 5) * + sizeof(struct v4l2_block_param_record); + epr_config config(max_bprf_body_size); + while (epr_is.getline(cfg_file_line_buf, CFG_FILE_LINE_SIZE)) { + if (1 != sscanf(cfg_file_line_buf, "pic=%d", &pic_num)) { + cout<<"Line:"<push_back(config); + } + config.clear(); + epr_num_row = 0; + epr_real_row = 0; + memset(config.bc_row_body.uncomp->bpr, 0, max_bprf_body_size); + } + if (2 == sscanf(cfg_file_line_buf,"pic=%d num_efp=%d", &config.pic_index, &num)) { + read_efp_cfg(cfg_file_line_buf, num, &config); + } else if (3 == sscanf(cfg_file_line_buf, "pic=%d num_row=%d type=%i", &config.pic_index, &num, &num2)) { + if (num == 0) { + cout<<"num_row must be greater than 0"< (last_row + 1)) { + //duplicate row + int n_cols = config.block_configs.blk_cfgs.rows_uncomp.n_cols_minus1 + 1; + memcpy(&config.bc_row_body.uncomp->bpr[(last_row + 1) * n_cols], + &config.bc_row_body.uncomp->bpr[last_row * n_cols], + n_cols * sizeof(struct v4l2_block_param_record)); + // bpr quad skip flag cant not inherit + for (int tmpi = 0; tmpi < n_cols; tmpi++) { + config.bc_row_body.uncomp->bpr[(last_row + 1) * n_cols + tmpi].qp_delta &= ~((uint32_t)SET(V4L2_BLOCK_PARAM_RECORD_QP_QUAD_SKIP, 1)); + } + config.block_configs.blk_cfgs.rows_uncomp.n_rows_minus1++; + last_row++; + } + epr_real_row++; + read_row_cfg(cfg_file_line_buf, num, num2, config); + last_row = num; + } else { + cout<<"Error - block_configs_type is set to an unsupported value"<push_back(config); +} + +InputFrame::InputFrame(uint32_t format, size_t width, size_t height, + size_t strideAlign, size_t nframes) : + Input(format, width, height, strideAlign), + nframes(nframes), + count(0) +{ + Codec::getSize(format, width, height, strideAlign, nplanes, stride, size, heights); +} + +void InputFrame::prepare(Buffer &buf) +{ + vector iov = buf.getImageSize(); + + unsigned int color = (0xff << 24) | (count * 10); + unsigned int rgba[4]; + for (int i = 0; i < 3; ++i) + { + rgba[i] = (color >> (i * 8)) & 0xff; + } + + unsigned int yuv[3]; + rgb2yuv(yuv, rgba); + + unsigned int y = yuv[0]; + unsigned int u = yuv[1]; + unsigned int v = yuv[2]; + + switch (format) + { + case V4L2_PIX_FMT_YUV420M: + { + if (iov.size() != 3) + { + throw Exception("YUV420 has 3 planes. planes=%zu.", iov.size()); + } + + /* Y plane. */ + if (iov[0].iov_len < size[0]) + { + throw Exception("YUV420 Y plane has incorrect size. size=%zu, expected=%zu.", + iov[0].iov_len, size[0]); + } + + memset(iov[0].iov_base, y, size[0]); + iov[0].iov_len = size[0]; + + /* U plane. */ + if (iov[1].iov_len < size[1]) + { + throw Exception("YUV420 U plane has incorrect size. size=%zu, expected=%zu.", + iov[1].iov_len, size[1]); + } + + memset(iov[1].iov_base, u, size[1]); + iov[1].iov_len = size[1]; + + /* V plane. */ + if (iov[2].iov_len < size[2]) + { + throw Exception("YUV420 V plane has incorrect size. size=%zu, expected=%zu.", + iov[2].iov_len, size[2]); + } + + memset(iov[2].iov_base, v, size[2]); + iov[2].iov_len = size[2]; + + break; + } + case V4L2_PIX_FMT_NV12: + { + if (iov.size() != 2) + { + throw Exception("YUV420 NV12 has 2 planes. planes=%zu.", iov.size()); + } + + /* Y plane. */ + if (iov[0].iov_len < size[0]) + { + throw Exception("YUV420 NV12 Y plane has incorrect size. size=%zu, expected=%zu.", + iov[0].iov_len, size[0]); + } + + memset(iov[0].iov_base, y, size[0]); + iov[0].iov_len = size[0]; + + /* UV plane. */ + if (iov[1].iov_len < size[1]) + { + throw Exception("YUV420 NV12 UV plane has incorrect size. size=%zu, expected=%zu.", + iov[1].iov_len, size[1]); + } + + uint8_t *p = static_cast(iov[1].iov_base); + for (size_t i = 0; i < iov[1].iov_len; i += 2) + { + *p++ = u; + *p++ = v; + } + + break; + } + case V4L2_PIX_FMT_NV21: + { + if (iov.size() != 2) + { + throw Exception("YUV420 NV12 has 2 planes. planes=%zu.", iov.size()); + } + + /* Y plane. */ + if (iov[0].iov_len < size[0]) + { + throw Exception("YUV420 NV12 Y plane has incorrect size. size=%zu, expected=%zu.", + iov[0].iov_len, size[0]); + } + + memset(iov[0].iov_base, y, size[0]); + iov[0].iov_len = size[0]; + + /* UV plane. */ + if (iov[1].iov_len < size[1]) + { + throw Exception("YUV420 NV12 UV plane has incorrect size. size=%zu, expected=%zu.", + iov[1].iov_len, size[1]); + } + + uint8_t *p = static_cast(iov[1].iov_base); + for (size_t i = 0; i < iov[1].iov_len; i += 2) + { + *p++ = v; + *p++ = u; + } + + break; + } + case V4L2_PIX_FMT_YUYV: + { + if (iov.size() != 1) + { + throw Exception("YUYV has 1 plane. planes=%zu.", iov.size()); + } + + if (iov[0].iov_len < size[0]) + { + throw Exception("YUYV plane 1 has incorrect size. size=%zu, expected=%zu.", + iov[0].iov_len, size[0]); + } + + uint8_t *p = static_cast(iov[0].iov_base); + for (size_t i = 0; i < size[0]; i += 4) + { + *p++ = y; + *p++ = u; + *p++ = y; + *p++ = v; + } + + iov[0].iov_len = size[0]; + + break; + } + case V4L2_PIX_FMT_UYVY: + { + if (iov.size() != 1) + { + throw Exception("UYVY has 1 plane. planes=%zu.", iov.size()); + } + + if (iov[0].iov_len < size[0]) + { + throw Exception("UYVY plane 1 has incorrect size. size=%zu, expected=%zu.", + iov[0].iov_len, size[0]); + } + + uint8_t *p = static_cast(iov[0].iov_base); + for (size_t i = 0; i < size[0]; i += 4) + { + *p++ = u; + *p++ = y; + *p++ = v; + *p++ = y; + } + + iov[0].iov_len = size[0]; + + break; + } + case V4L2_PIX_FMT_Y210: + { + uint16_t y16 = y << 8; + uint16_t u16 = u << 8; + uint16_t v16 = v << 8; + + if (iov.size() != 1) + { + throw Exception("Y210 has 1 plane. planes=%zu.", iov.size()); + } + + if (iov[0].iov_len < size[0]) + { + throw Exception("Y210 plane 1 has incorrect size. size=%zu, expected=%zu.", + iov[0].iov_len, size[0]); + } + + uint16_t *p = static_cast(iov[0].iov_base); + for (size_t i = 0; i < (size[0] / sizeof(*p)); i += 4) + { + *p++ = y16; + *p++ = u16; + *p++ = y16; + *p++ = v16; + } + + iov[0].iov_len = size[0]; + + break; + } + case V4L2_PIX_FMT_P010: + { + uint16_t y16 = y << 8; + uint16_t u16 = u << 8; + uint16_t v16 = v << 8; + + if (iov.size() != 2) + { + throw Exception("P010 has 2 planes. planes=%zu.", iov.size()); + } + + /* Y plane. */ + if (iov[0].iov_len < size[0]) + { + throw Exception("P010 Y plane has incorrect size. size=%zu, expected=%zu.", + iov[0].iov_len, size[0]); + } + + uint16_t *p = static_cast(iov[0].iov_base); + for (size_t i = 0; i < (size[0] / sizeof(*p)); ++i) + { + *p++ = y16; + } + + iov[0].iov_len = size[0]; + + /* UV plane. */ + if (iov[1].iov_len < size[1]) + { + throw Exception("P010 UV plane has incorrect size. size=%zu, expected=%zu.", + iov[1].iov_len, size[1]); + } + + p = static_cast(iov[1].iov_base); + for (size_t i = 0; i < (size[1] / sizeof(*p)); i += 2) + { + *p++ = u16; + *p++ = v16; + } + + iov[1].iov_len = size[1]; + + break; + } + case V4L2_PIX_FMT_Y0L2: + { + if (iov.size() != 1) + { + throw Exception("Y0L2 has 1 plane. planes=%zu.", iov.size()); + } + + if (iov[0].iov_len < size[0]) + { + throw Exception("Y0L2 plane 1 has incorrect size. size=%zu, expected=%zu.", + iov[0].iov_len, size[0]); + } + + uint64_t a = 3; + uint64_t y10 = y << 2; + uint64_t u10 = u << 2; + uint64_t v10 = v << 2; + uint64_t w = (a << 62) | (y10 << 52) | (v10 << 42) | (y10 << 32) | (a << 30) | (y10 << 20) | (u10 << 10) | y10; + uint8_t *p = static_cast(iov[0].iov_base); + for (size_t i = 0; i < iov[0].iov_len; i += 8) + { + *p++ = w & 0xff; + *p++ = (w >> 8) & 0xff; + *p++ = (w >> 16) & 0xff; + *p++ = (w >> 24) & 0xff; + *p++ = (w >> 32) & 0xff; + *p++ = (w >> 40) & 0xff; + *p++ = (w >> 48) & 0xff; + *p++ = (w >> 56) & 0xff; + } + + iov[0].iov_len = size[0]; + + break; + } + case DRM_FORMAT_ABGR8888: + { + if (iov.size() != 1) + { + throw Exception("RGBA has 1 plane. planes=%zu.", iov.size()); + } + + if (iov[0].iov_len < size[0]) + { + throw Exception("RGBA plane 1 has incorrect size. size=%zu, expected=%zu.", + iov[0].iov_len, size[0]); + } + + uint8_t *p = static_cast(iov[0].iov_base); + for (size_t i = 0; i < size[0]; i += 4) + { + *p++ = rgba[0]; + *p++ = rgba[1]; + *p++ = rgba[2]; + *p++ = rgba[3]; + } + + break; + } + case DRM_FORMAT_ARGB8888: + { + if (iov.size() != 1) + { + throw Exception("BGRA has 1 plane. planes=%zu.", iov.size()); + } + + if (iov[0].iov_len < size[0]) + { + throw Exception("BGRA plane 1 has incorrect size. size=%zu, expected=%zu.", + iov[0].iov_len, size[0]); + } + + uint8_t *p = static_cast(iov[0].iov_base); + for (size_t i = 0; i < size[0]; i += 4) + { + *p++ = rgba[2]; + *p++ = rgba[1]; + *p++ = rgba[0]; + *p++ = rgba[3]; + } + + break; + } + case DRM_FORMAT_BGRA8888: + { + if (iov.size() != 1) + { + throw Exception("ARGB has 1 plane. planes=%zu.", iov.size()); + } + + if (iov[0].iov_len < size[0]) + { + throw Exception("ABGR plane 1 has incorrect size. size=%zu, expected=%zu.", + iov[0].iov_len, size[0]); + } + + uint8_t *p = static_cast(iov[0].iov_base); + for (size_t i = 0; i < size[0]; i += 4) + { + *p++ = rgba[3]; + *p++ = rgba[0]; + *p++ = rgba[1]; + *p++ = rgba[2]; + } + + break; + } + case DRM_FORMAT_RGBA8888: + { + if (iov.size() != 1) + { + throw Exception("ABGR has 1 plane. planes=%zu.", iov.size()); + } + + if (iov[0].iov_len < size[0]) + { + throw Exception("ABGR plane 1 has incorrect size. size=%zu, expected=%zu.", + iov[0].iov_len, size[0]); + } + + uint8_t *p = static_cast(iov[0].iov_base); + for (size_t i = 0; i < size[0]; i += 4) + { + *p++ = rgba[3]; + *p++ = rgba[2]; + *p++ = rgba[1]; + *p++ = rgba[0]; + } + + break; + } + default: + throw Exception("Unsupport input frame format."); + } + + ++count; + buf.setBytesUsed(iov); + buf.setTimeStamp(count); +} + +bool InputFrame::eof() +{ + return count >= nframes; +} + +InputFileOsd::InputFileOsd(const char * filename, uint32_t format, size_t width, size_t height, size_t strideAlign, size_t __stride[]): + osd_is(filename) +{ + if (__stride) { + memcpy(stride, __stride, sizeof(size_t) * 3); + } else { + memset(stride, 0, sizeof(size_t) * 3); + } + framesize = Codec::getSize(format, width, height, strideAlign, nplanes, stride, size, heights); +} + +void InputFileOsd::prepare(Buffer & buf) +{ + vector iov = buf.getImageSize(); + + for (size_t i = 0; i < nplanes; ++i) + { + osd_is.read(static_cast(iov[i].iov_base), size[i]); + iov[i].iov_len = osd_is.gcount(); + } + buf.setBytesUsed(iov); +} + +bool InputFileOsd::eof() +{ + return osd_is.peek() == EOF; +} + +InputFileFrameOSD::InputFileFrameOSD(istream &input, uint32_t format, size_t width, + size_t height, size_t strideAlign, size_t __stride[]) : + InputFileFrame(input, format, width, height, strideAlign, __stride) +{ + refresh_index = 0; + osd_file_1 = NULL; + osd_file_2 = NULL; +} + +void InputFileFrameOSD::prepare(Buffer & buf) +{ + bool prepared = false; + if (osd_list){ + if (0 == prepared_frames && refresh_index == 0) { + osd_cur = osd_list->begin(); + } + if (osd_list->end() != osd_cur && osd_cur->pic_index == prepared_frames) { + buf.setOsdCfg(*osd_cur); + buf.setOsdCfgEnable(true); + refresh_index = osd_cur->num_osd; + osd_cur++; + } else { + buf.setOsdCfgEnable(false); + } + } + while (!prepared) { + switch (refresh_index & 0x3) { + case 0x1: + case 0x3: + if (osd_file_1) { + if (!osd_file_1->eof()) { + osd_file_1->prepare(buf); + prepared = true; + buf.setOsdBufferflag(refresh_index); + } + refresh_index &= ~0x1; + } else { + cerr<<"osd file 1 not exist"<< endl; + exit(1); + } + break; + case 0x2: + if (osd_file_2) { + if (!osd_file_2->eof()) { + osd_file_2->prepare(buf); + prepared = true; + buf.setOsdBufferflag(refresh_index); + } + refresh_index &= ~0x2; + } else { + cerr<<"osd file 2 not exist"<< endl; + exit(1); + } + break; + case 0x0: + InputFileFrame::prepare(buf); + prepared = true; + buf.setOsdBufferflag(refresh_index); + break; + default: + cerr<<"Unkonw refresh index:"<< refresh_index << endl; + exit(1); + } + } +} + +void InputFrame::rgb2yuv(unsigned int yuv[3], const unsigned int rgb[3]) +{ + /* Y = Kr*R + Kg*G + Kb*B */ + /* U = (B-Y)/(1-Kb) = - R * Kr/(1-Kb) - G * Kg/(1-Kb) + B */ + /* V = (R-Y)/(1-Kr) = R - G * Kg/(1-Kr) - B * Kb/(1-Kr) */ + + /* BT601 { 0.2990, 0.5870, 0.1140 } */ + /* BT709 { 0.2125, 0.7154, 0.0721 }; */ + + float Kr = 0.299; + float Kg = 0.587; + float Kb = 0.114; + + float r = rgb[0] / 255.0; + float g = rgb[1] / 255.0; + float b = rgb[2] / 255.0; + + float y; + float u; + float v; + + /* RGB to YUV. */ + y = Kr * r + Kg * g + Kb * b; + u = (b - y) / (1 - Kb); + v = (r - y) / (1 - Kr); + + /* Map YUV to limited color space. */ + yuv[0] = y * 219 + 16; + yuv[1] = u * 112 + 128; + yuv[2] = v * 112 + 128; +} + +Output::Output(uint32_t format) : + IO(format), + timestamp(0), + totalSize(0) +{ + dir = 1; + packed = false; +} + +Output::Output(uint32_t format, bool packed) : + IO(format), + timestamp(0), + totalSize(0), + packed(packed) +{ + dir = 1; +} + +Output::~Output() +{ + cout << "Total size " << totalSize << endl; +} + +void Output::prepare(Buffer &buf) +{ + buf.clearBytesUsed(); +} + +void Output::finalize(Buffer &buf) +{ + v4l2_buffer &b = buf.getBuffer(); + if (V4L2_TYPE_IS_MULTIPLANAR(b.type) && + ((b.flags & V4L2_BUF_FLAG_MVX_BUFFER_FRAME_PRESENT) != V4L2_BUF_FLAG_MVX_BUFFER_FRAME_PRESENT || + (b.flags & V4L2_BUF_FLAG_MVX_DECODE_ONLY) == V4L2_BUF_FLAG_MVX_DECODE_ONLY)){ + return; + } + if (b.timestamp.tv_usec != 0 + && b.timestamp.tv_usec != timestamp + && b.timestamp.tv_usec != (timestamp + 1) + && b.timestamp.tv_usec != (timestamp + 100)) + { + cerr << "Incorrect timestamp. got=" << b.timestamp.tv_usec << ", expected=" << timestamp << endl; + } + + if (!V4L2_TYPE_IS_MULTIPLANAR(b.type)) { + uint8_t frame_type = (b.reserved2 & 0xFF000000) >> 24; + uint8_t src_transform = (b.reserved2 & 0xFF0000) >> 16; + uint16_t remaining_bytes = b.reserved2; + switch(frame_type){ + case 0: + printf("I frame.\n"); + break; + case 1: + printf("P frame.\n"); + break; + case 2: + printf("B frame.\n"); + break; + case 3: + printf("LOWER B frame.\n"); + break; + case 4: + printf("P key frame.\n"); + break; + case 5: + printf("No ref P frame.\n"); + break; + case 6: + printf("GDR frame.\n"); + break; + default: + printf("unrecognized frame type.\n"); + break; + } + switch(src_transform){ + case 0: + printf("none src transform.\n"); + break; + case 1: + printf("rotate 90 degrees.\n"); + break; + case 2: + printf("rotate 180 degrees.\n"); + break; + case 3: + printf("rotate 270 degrees.\n"); + break; + case 4: + printf("vertical flip (no rotation).\n"); + break; + case 5: + printf("rotate 90 degrees and vertical flip.\n"); + break; + case 6: + printf("rotate 180 degrees and vertical flip.\n"); + break; + case 7: + printf("rotate 270 degrees and vertical flip.\n"); + break; + default: + printf("unrecognized src transform.\n"); + break; + } + printf("remaining bytes of this buffer:%d\n", remaining_bytes); + } + timestamp = b.timestamp.tv_usec; + + vector iov; + vector img_buf; + size_t y_width, y_height, frame_size, nplanes = 0; + size_t src_stride[3] = {0}, dst_stride[3] = {0}, dst_heights[3] = {0}, dst_size[3] = {0}; + if (packed) { + if (V4L2_TYPE_IS_MULTIPLANAR(b.type)) { + y_width = b.m.planes[0].reserved[1] >> 16; + y_height = b.m.planes[0].reserved[1] & 0xFFFF; + + for (uint32_t i = 0; i < b.length; i++) { + src_stride[i] = b.m.planes[i].reserved[0]; + } + frame_size = Codec::getSize(getFormat(), y_width, y_height, 1, nplanes, dst_stride, dst_size, dst_heights); + img_buf.resize(frame_size); + buf.getPackedBuffer(static_cast(&img_buf[0]), nplanes, dst_heights, dst_stride, src_stride); + if (getFormat() == V4L2_PIX_FMT_P010) { + iov = buf._convert10Bit((unsigned short*)(&img_buf[0]), (unsigned short*)(&img_buf[dst_size[0]]), + dst_size[0], dst_size[1]); + } else { + iovec vec = { .iov_base = static_cast(&img_buf[0]), .iov_len = frame_size }; + iov.push_back(vec); + } + } + } else { + iov = buf.getBytesUsed(); + } + const struct v4l2_mvx_seamless_target &seamless = buf.getSeamless(); + for (size_t i = 0; i < iov.size(); ++i) + { + if (V4L2_TYPE_IS_MULTIPLANAR(b.type)&& seamless.seamless_mode !=0) + { + write(iov[i].iov_base, b.m.planes[i].length); + memset(iov[i].iov_base,0,b.m.planes[i].length); + totalSize += b.m.planes[i].length; + //cerr << b.m.planes[i].length <(ptr), nbytes); + output.flush(); +} + +OutputIVF::OutputIVF(ofstream &output, + uint32_t format, + uint16_t width, + uint16_t height) : + OutputFile(output, format) +{ + IVFHeader header(format, width, height); + write(reinterpret_cast(&header), sizeof(header)); +} + +void OutputIVF::finalize(Buffer &buf) +{ + vector iov = buf.getBytesUsed(); + v4l2_buffer &b = buf.getBuffer(); + if (V4L2_TYPE_IS_MULTIPLANAR(b.type) && + (b.flags & V4L2_BUF_FLAG_MVX_BUFFER_FRAME_PRESENT) != V4L2_BUF_FLAG_MVX_BUFFER_FRAME_PRESENT){ + return; + } + + for (size_t i = 0; i < iov.size(); ++i) + { + size_t n = temp.size(); + temp.resize(temp.size() + iov[i].iov_len); + + char *p = static_cast(iov[i].iov_base); + copy(p, p + iov[i].iov_len, &temp[n]); + } + + if (b.flags & V4L2_BUF_FLAG_KEYFRAME) + { + IVFFrame frame(temp.size(), b.timestamp.tv_usec); + write(&frame, sizeof(frame)); + + write(&temp[0], temp.size()); + temp.clear(); + } +} + +OutputAFBC::OutputAFBC(std::ofstream &output, uint32_t format, bool tiled) : + OutputFile(output, format), + tiled(tiled) +{} + +void OutputAFBC::prepare(Buffer &buf) +{ + buf.clearBytesUsed(); + buf.setTiled(tiled); +} + +void OutputAFBC::finalize(Buffer &buf) +{ + vector iov = buf.getBytesUsed(); + v4l2_buffer &b = buf.getBuffer(); + if (V4L2_TYPE_IS_MULTIPLANAR(b.type) && + (b.flags & V4L2_BUF_FLAG_MVX_BUFFER_FRAME_PRESENT) != V4L2_BUF_FLAG_MVX_BUFFER_FRAME_PRESENT){ + return; + } + + if (iov[0].iov_len > 0) + { + AFBCHeader header(buf.getFormat(), iov[0].iov_len, buf.getCrop(), tiled); + write(&header, sizeof(header)); + OutputFile::finalize(buf); + } +} + +OutputAFBCInterlaced::OutputAFBCInterlaced(std::ofstream &output, uint32_t format, bool tiled) : + OutputAFBC(output, format, tiled) +{} + +void OutputAFBCInterlaced::finalize(Buffer &buf) +{ + vector iov = buf.getBytesUsed(); + v4l2_buffer &b = buf.getBuffer(); + if (V4L2_TYPE_IS_MULTIPLANAR(b.type) && + (b.flags & V4L2_BUF_FLAG_MVX_BUFFER_FRAME_PRESENT) == 0){ + return; + } + + if (iov[0].iov_len == 0) + { + return; + } + + size_t top_len = roundUp(iov[0].iov_len / 2, 32); + AFBCHeader top_header(buf.getFormat(), top_len, buf.getCrop(), tiled, AFBCHeader::FIELD_TOP); + + write(&top_header, sizeof(top_header)); + write(iov[0].iov_base, top_len); + + size_t bot_len = iov[0].iov_len - top_len; + AFBCHeader bot_header(buf.getFormat(), bot_len, buf.getCrop(), tiled, AFBCHeader::FIELD_BOTTOM); + + write(&bot_header, sizeof(bot_header)); + write(static_cast(iov[0].iov_base) + top_len, bot_len); +} + +OutputFileWithMD5::OutputFileWithMD5(std::ofstream &output, uint32_t format, std::ofstream &output_md5, bool packed) : + OutputFile(output, format, packed), + output_md5(output_md5) +{} + +void OutputFileWithMD5::finalize(Buffer &buf) +{ +#define HASH_DIGEST_LENGTH 16 +#define STR_HASH_SIZE (HASH_DIGEST_LENGTH * 2 + 2) + MD5_CTX ctx; + char str_hash[STR_HASH_SIZE]; + uint32_t data[HASH_DIGEST_LENGTH/sizeof(uint32_t)]; + uint8_t *hash = (uint8_t *)data; + static char const slookup[] = { + '0', '1', '2', '3', + '4', '5', '6', '7', + '8', '9', 'a', 'b', + 'c', 'd', 'e', 'f' + }; + int i; + vector iov; + vector img_buf; + size_t y_width, y_height, frame_size, nplanes = 0; + size_t src_stride[3] = {0}, dst_stride[3] = {0}, dst_heights[3] = {0}, dst_size[3] = {0}; + v4l2_buffer &b = buf.getBuffer(); + if (V4L2_TYPE_IS_MULTIPLANAR(b.type) && + (b.flags & V4L2_BUF_FLAG_MVX_BUFFER_FRAME_PRESENT) != V4L2_BUF_FLAG_MVX_BUFFER_FRAME_PRESENT){ + return; + } + if (packed) { + if (V4L2_TYPE_IS_MULTIPLANAR(b.type)) { + y_width = (b.m.planes[0].reserved[1] & 0xFFFF0000) >> 16; + y_height = b.m.planes[0].reserved[1] & 0xFFFF; + + for (uint32_t i = 0; i < b.length; i++) { + src_stride[i] = b.m.planes[i].reserved[0]; + } + frame_size = Codec::getSize(getFormat(), y_width, y_height, 1, nplanes, dst_stride, dst_size, dst_heights); + img_buf.resize(frame_size); + buf.getPackedBuffer(static_cast(&img_buf[0]), nplanes, dst_heights, dst_stride, src_stride); + if (getFormat() == V4L2_PIX_FMT_P010) { + iov = buf._convert10Bit((unsigned short*)(&img_buf[0]), (unsigned short*)(&img_buf[dst_size[0]]), + dst_size[0], dst_size[1]); + } else { + iovec vec = { .iov_base = static_cast(&img_buf[0]), .iov_len = frame_size }; + iov.push_back(vec); + } + } + } else { + if(getFormat() == V4L2_PIX_FMT_P010){ + iov = buf.convert10Bit(); + } else { + iov = buf.getBytesUsed(); + } + } + for (size_t i = 0; i < iov.size(); ++i) + { + write(iov[i].iov_base, iov[i].iov_len); + totalSize += iov[i].iov_len; + } + //OutputFile::finalize(buf); + + if(iov[0].iov_len){ + MD5_Init(&ctx); + for(i = 0; (size_t)i < iov.size(); ++i){ + MD5_Update(&ctx, iov[i].iov_base, iov[i].iov_len); + } + MD5_Finalize(&ctx); + MD5_GetHash(&ctx, hash); + + for(i = 0; i < HASH_DIGEST_LENGTH; ++i){ + str_hash[i << 1] = slookup[hash[i] >> 4]; + str_hash[(i << 1) + 1] = slookup[hash[i] & 0xF]; + } + str_hash[sizeof(str_hash) - 2] = '\r'; + str_hash[sizeof(str_hash) - 1] = '\n'; + + output_md5.write(static_cast(str_hash), STR_HASH_SIZE); + output_md5.flush(); +#if 0 + printf("hash: %02x,%02x,%02x,%02x," + "%02x,%02x,%02x,%02x," + "%02x,%02x,%02x,%02x," + "%02x,%02x,%02x,%02x.\n", + hash[0], hash[1], hash[2], hash[3], + hash[4], hash[5], hash[6], hash[7], + hash[8], hash[9], hash[10], hash[11], + hash[12], hash[13], hash[14], hash[15]); +#endif + } +} + +OutputFileWithADStats::OutputFileWithADStats(std::ofstream &output, uint32_t format, + const std::string& ad_stats_filename,const std::string&thumbnail_filename, bool packed) : + OutputFile(output, format, packed) +{ + char str_ad_stats[256]; + + output_ad_stats.open(ad_stats_filename.c_str(), std::ios_base::trunc ); + printf( "Output: AD statistics file, %s\n", ad_stats_filename.c_str() ); + + memset(str_ad_stats,0,sizeof(str_ad_stats)); + sprintf(str_ad_stats,"%s","Assertive Display Frame Average Statistics (Frame number, Y 12-bit, Cb 10-bit, Cr 10-bit)\n"); + output_ad_stats.write(str_ad_stats, strlen(str_ad_stats)); + + if(thumbnail_filename != std::string("dev/null")) + { + output_thumbnail.open( thumbnail_filename.c_str(), std::ios_base::binary ); + printf( "Output: thumbnail file, %s\n", thumbnail_filename.c_str() ); + } +} + +OutputFileWithADStats::~OutputFileWithADStats() +{ + if (output_ad_stats.is_open()) + { + output_ad_stats.close(); + } + if (output_thumbnail.is_open()) + { + output_thumbnail.close(); + } +} + +void OutputFileWithADStats::finalize(Buffer &buf) +{ + char str_ad_stats[256]; + unsigned int thumbnail_size=0; + struct v4l2_core_buffer_header_general buffer_configs; + v4l2_buffer &b = buf.getBuffer(); + vector iov; + + if (V4L2_TYPE_IS_MULTIPLANAR(b.type) && + ((b.flags & V4L2_BUF_FLAG_MVX_BUFFER_FRAME_PRESENT) != V4L2_BUF_FLAG_MVX_BUFFER_FRAME_PRESENT || + (b.flags & V4L2_BUF_FLAG_MVX_DECODE_ONLY) == V4L2_BUF_FLAG_MVX_DECODE_ONLY)){ + return; + } + + if ((b.reserved2 & V4L2_BUF_FLAG_MVX_AD_STATS) != V4L2_BUF_FLAG_MVX_AD_STATS) + { + OutputFile::finalize(buf); + return; + } + + buffer_configs.buffer_size = b.m.planes[0].reserved[2]; + buffer_configs.type = (b.m.planes[0].reserved[3] & 0xFFFF0000) >> 16; + buffer_configs.config_size = b.m.planes[0].reserved[3] & 0XFFFF; + + buffer_configs.config.ad_stats.frame_averages = b.m.planes[0].reserved[4]; + buffer_configs.config.ad_stats.thumbnail_width = (b.m.planes[0].reserved[5] & 0xFFFF0000) >> 16; + buffer_configs.config.ad_stats.thumbnail_height= b.m.planes[0].reserved[5] & 0XFFFF; + buffer_configs.config.ad_stats.ad_stats_flags = b.m.planes[0].reserved[6]; + + if(buffer_configs.config.ad_stats.ad_stats_flags == 1) + { + thumbnail_size = 2*buffer_configs.config.ad_stats.thumbnail_width*buffer_configs.config.ad_stats.thumbnail_height; + } + else + { + thumbnail_size = buffer_configs.config.ad_stats.thumbnail_width*buffer_configs.config.ad_stats.thumbnail_height; + } + + printf("<-: ad_stats info: frame count:%d, frame_averages:%u, thumbnail_width:%u, thumbnail_height:%u, ad_stats_flags:%u thumbnail_size:%u\n", + buf.getFrameProcessCount(), + buffer_configs.config.ad_stats.frame_averages, + buffer_configs.config.ad_stats.thumbnail_width, + buffer_configs.config.ad_stats.thumbnail_height, + buffer_configs.config.ad_stats.ad_stats_flags, + thumbnail_size); + + memset(str_ad_stats,0,sizeof(str_ad_stats)); + sprintf(str_ad_stats,"%d, %d, %d, %d\n", + buf.getFrameProcessCount(), + buffer_configs.config.ad_stats.frame_averages & 0xfff, + (buffer_configs.config.ad_stats.frame_averages & 0x003ff000) >> 12, + (buffer_configs.config.ad_stats.frame_averages & 0xffc00000) >>22); + + output_ad_stats.write(str_ad_stats, strlen(str_ad_stats)); + + if (output_thumbnail.is_open()) + { + iov = buf.getImageSize(); + output_thumbnail.write(static_cast(iov[0].iov_base) + iov[0].iov_len - MVX_AD_STATS_THUMBNAIL_SIZE,thumbnail_size); + memset(static_cast(iov[0].iov_base) + iov[0].iov_len - MVX_AD_STATS_THUMBNAIL_SIZE,0,MVX_AD_STATS_THUMBNAIL_SIZE); + } + + OutputFile::finalize(buf); + +} + +OutputFileFrameStats::OutputFileFrameStats(std::ostream &output, uint32_t format, + uint32_t stats_mode, const std::string& filename, uint32_t width, uint32_t height): + OutputFile(output, format) +{ + queued_buffer = 0; + //open all enc stats file by default for convenience + std::string file_name_mms = std::string( filename) + ".mms"; + file_mms.open( file_name_mms.c_str(), std::ios_base::binary ); + printf( "Output: statistics(SATD, MSE, MAD) file, %s\n", file_name_mms.c_str() ); + + std::string file_name_bitcost = std::string( filename) + ".bc"; + file_bitcost.open( file_name_bitcost.c_str(), std::ios_base::binary ); + printf( "Output: statistics(bitcost) file, %s\n", file_name_bitcost.c_str() ); + + std::string file_name_qp = std::string( filename) + ".qp"; + file_qp.open( file_name_qp.c_str(), std::ios_base::binary ); + printf( "Output: statistics(bitcost) file, %s\n", file_name_qp.c_str() ); + +} + +void OutputFileFrameStats::finalize(Buffer & buf) +{ + if ((buf.getBuffer().flags & V4L2_BUF_FLAG_MVX_BUFFER_ENC_STATS) != V4L2_BUF_FLAG_MVX_BUFFER_ENC_STATS) + { + OutputFile::finalize(buf); + return; + } + + vector iov = buf.getBytesUsed(); + struct v4l2_buffer_param_enc_stats *stats =static_cast(iov[0].iov_base); + uint32_t offset = sizeof(struct v4l2_buffer_param_enc_stats); + if (stats->flags & V4L2_BUFFER_ENC_STATS_FLAG_DROP) + { + return; + } + + if ( stats->flags & V4L2_BUFFER_ENC_STATS_FLAG_MMS ) + { + file_mms.write(static_cast(iov[0].iov_base) + offset, + stats->mms_buffer_size); + file_mms << std::flush; + } + if ( stats->flags & V4L2_BUFFER_ENC_STATS_FLAG_BITCOST ) + { + file_bitcost.write(static_cast(iov[0].iov_base) + offset + stats->mms_buffer_size, + stats->bitcost_buffer_size); + file_bitcost << std::flush; + } + if ( stats->flags & V4L2_BUFFER_ENC_STATS_FLAG_QP ) + { + file_qp.write(static_cast(iov[0].iov_base) + offset + stats->mms_buffer_size + stats->bitcost_buffer_size, + stats->qp_buffer_size); + file_qp << std::flush; + } + printf("stats mb size of this buffer, width:%u, height:%u\n", (stats->pic_index_or_mb_size & 0xFFFF), (stats->pic_index_or_mb_size & 0xFFFF0000)>>16); +} + +OutputFileFrameStats::~OutputFileFrameStats() +{ + if (file_mms.is_open()) + { + file_mms.close(); + } + if (file_bitcost.is_open()) + { + file_bitcost.close(); + } + if (file_qp.is_open()) + { + file_qp.close(); + } +} + +/**************************************************************************** + * Buffer + ****************************************************************************/ + +Buffer::Buffer(const v4l2_format &format) : + format(format) +{ + isRoiCfg = false; + epr_qp.qp = 0; + frames_processed=0; + memset(&seamless,0,sizeof(seamless)); +} + +Buffer::Buffer(v4l2_buffer &buf, int fd, const v4l2_format &format, enum v4l2_memory memory_type) : + buf(buf), + format(format), + memory_type(memory_type) +{ + memset(ptr, 0, sizeof(ptr)); + + if (V4L2_TYPE_IS_MULTIPLANAR(buf.type)) + { + memcpy(planes, buf.m.planes, sizeof(planes[0]) * buf.length); + this->buf.m.planes = planes; + } + isRoiCfg = false; + epr_qp.qp = 0; + frames_processed=0; + memset(&seamless,0,sizeof(seamless)); + //memoryMap(fd); +} + +Buffer::~Buffer() +{ + memoryUnmap(); +} + +v4l2_buffer &Buffer::getBuffer() +{ + return buf; +} + +const v4l2_format &Buffer::getFormat() const +{ + return format; +} + +void Buffer::setCrop(const v4l2_crop &crop) +{ + this->crop = crop; +} + +const v4l2_crop &Buffer::getCrop() const +{ + return crop; +} + +void Buffer::setSeamless(const struct v4l2_mvx_seamless_target &seamless) +{ + this->seamless = seamless; +} + +const v4l2_mvx_seamless_target &Buffer::getSeamless()const +{ + return seamless; +} + +void Buffer::setFrameProcessCount(int count) +{ + this->frames_processed = count; +} + +const int Buffer::getFrameProcessCount()const +{ + return this->frames_processed; +} + + +vector Buffer::getImageSize() const +{ + vector iova; + + if (V4L2_TYPE_IS_MULTIPLANAR(buf.type)) + { + for (unsigned int i = 0; i < buf.length; ++i) + { + iovec iov = { .iov_base = ptr[i], .iov_len = buf.m.planes[i].length }; + iova.push_back(iov); + } + } + else + { + iovec iov = { .iov_base = ptr[0], .iov_len = buf.length }; + iova.push_back(iov); + } + + return iova; +} + +vector Buffer::convert10Bit(){ + return _convert10Bit(static_cast(ptr[0]) + buf.m.planes[0].data_offset, + static_cast(ptr[1]) + buf.m.planes[1].data_offset, + buf.m.planes[0].bytesused - buf.m.planes[0].data_offset, + buf.m.planes[1].bytesused - buf.m.planes[1].data_offset); +} + +vector Buffer::_convert10Bit(unsigned short* ptr_y, unsigned short* ptr_uv, size_t size_y, size_t size_uv){ + unsigned int i=0; + unsigned short *y, *tmp_uv, *u, *v; + size_t y_size, uv_size; + vector iova; + //v4l2_plane &y_p = buf.m.planes[0]; + //y = static_cast(ptr[0]) + y_p.data_offset; + //y_size = y_p.bytesused - y_p.data_offset; + //v4l2_plane &u_p = buf.m.planes[1]; + //u = static_cast(ptr[1]) + u_p.data_offset; + //uv_size = u_p.bytesused - u_p.data_offset; + y = ptr_y; + y_size = size_y; + u = ptr_uv; + uv_size = size_uv; + + + v = u + uv_size/(2*sizeof(short)); + //buf.length = 3; + iovec iov; + + tmp_uv = static_cast(calloc(uv_size / sizeof(short), sizeof(short))); + if(NULL == tmp_uv){ + memset(y, 0xcc, y_size); + iov = { .iov_base = y, .iov_len = y_size}; + iova.push_back(iov); + } else { + memcpy(tmp_uv, u , uv_size); + memset(u, 0, uv_size); + for( i=0; i < y_size / sizeof(short); i++){ + y[i] = y[i] >> 6; + } + iov = { .iov_base = y, .iov_len = y_size}; + iova.push_back(iov); + for(i = 0; i < uv_size / (2*sizeof(short)); i++){ + u[i] = tmp_uv[2*i] >> 6; + v[i] = tmp_uv[2*i+1] >> 6; + } + iov = { .iov_base = u, .iov_len = (uv_size)/2}; + iova.push_back(iov); + iov = { .iov_base = v, .iov_len = (uv_size)/2}; + iova.push_back(iov); + free(tmp_uv); + } + return iova; +} +vector Buffer::getBytesUsed() const +{ + vector iova; + + if (V4L2_TYPE_IS_MULTIPLANAR(buf.type)) + { + for (unsigned int i = 0; i < buf.length; ++i) + { + v4l2_plane &p = buf.m.planes[i]; + + iovec iov = { .iov_base = static_cast(ptr[i]) + p.data_offset, .iov_len = p.bytesused - p.data_offset }; + + if (p.bytesused < p.data_offset) + { + iov.iov_len = 0; + } + + iova.push_back(iov); + } + } + else + { + iovec iov = { .iov_base = ptr[0], .iov_len = buf.bytesused }; + + /* + * Single planar buffers has no support for offset, but for HEVC and VP9 + * encode we must find a way to relay the offset from the code. + * + * For MMAP we use the lower 12 bits (assuming 4k page size) to relay + * the offset. + * + * For userptr the actual pointer is updated to point at the first byte + * of the data. + * + * Because there is no offset 'bytesused' does not have to be adjusted + * similar to multi planar buffers. + */ + switch (buf.memory) + { + case V4L2_MEMORY_MMAP: + iov.iov_base = static_cast(iov.iov_base) + (buf.m.offset & ((1 << 12) - 1)); + break; + case V4L2_MEMORY_USERPTR: + iov.iov_base = reinterpret_cast(buf.m.userptr); + break; + default: + break; + } + + iova.push_back(iov); + } + + return iova; +} + +void Buffer::getPackedBuffer(char* img, size_t nplanes, size_t dst_heights[], size_t dst_stride[], size_t src_stride[]) +{ + char *dst = img; + for (uint32_t i = 0; i < nplanes; i++) { + char *src = static_cast(ptr[i]); + for (uint32_t row = 0; row < dst_heights[i]; row++) { + memcpy(dst, src, dst_stride[i]); + dst += dst_stride[i]; + src += src_stride[i]; + } + } + +} + +void Buffer::setBytesUsed(vector &iov) +{ + if (V4L2_TYPE_IS_MULTIPLANAR(buf.type)) + { + if (iov.size() > buf.length) + { + throw Exception("iovec vector size is larger than V4L2 buffer number of planes. size=%u, planes=%u", + iov.size(), buf.length); + } + + size_t i; + for (i = 0; i < iov.size(); ++i) + { + buf.m.planes[i].bytesused = iov[i].iov_len; + } + + for (; i < buf.length; ++i) + { + buf.m.planes[i].bytesused = 0; + } + } + else + { + buf.bytesused = 0; + + for (size_t i = 0; i < iov.size(); ++i) + { + buf.bytesused += iov[i].iov_len; + + if (buf.bytesused > buf.length) + { + throw Exception("V4L2 buffer size too small. length=%u, buyteused=%u.", buf.length, buf.bytesused); + } + } + } +} + +void Buffer::clearBytesUsed() +{ + if (V4L2_TYPE_IS_MULTIPLANAR(buf.type)) + { + for (size_t i = 0; i < buf.length; ++i) + { + buf.m.planes[i].bytesused = 0; + } + } + else + { + buf.bytesused = 0; + } +} + +void Buffer::resetVendorFlags() +{ + buf.flags &= ~V4L2_BUF_FLAG_MVX_MASK; +} + +void Buffer::setCodecConfig(bool codecConfig) +{ + buf.flags &= ~V4L2_BUF_FLAG_MVX_CODEC_CONFIG; + buf.flags |= codecConfig ? V4L2_BUF_FLAG_MVX_CODEC_CONFIG : 0; +} + +void Buffer::setTimeStamp(unsigned int timeUs) +{ + buf.flags |= V4L2_BUF_FLAG_TIMESTAMP_COPY; + buf.timestamp.tv_sec = timeUs / 1000000; + buf.timestamp.tv_usec = timeUs % 1000000; +} + +void Buffer::setEndOfFrame(bool eof) +{ + buf.flags &= ~V4L2_BUF_FLAG_KEYFRAME; + buf.flags |= eof ? V4L2_BUF_FLAG_KEYFRAME : 0; +} + +void Buffer::setEndOfSubFrame(bool eosf) +{ + buf.flags &= ~V4L2_BUF_FLAG_END_OF_SUB_FRAME; + buf.flags |= eosf ? V4L2_BUF_FLAG_END_OF_SUB_FRAME : 0; +} + +void Buffer::setRotation(int rotation) +{ + if( rotation%90 !=0) { + return; + } + + switch (rotation%360) { + case 90: + buf.flags &= ~V4L2_BUF_FRAME_FLAG_ROTATION_MASK; + buf.flags |= V4L2_BUF_FRAME_FLAG_ROTATION_90; + break; + case 180: + buf.flags &= ~V4L2_BUF_FRAME_FLAG_ROTATION_MASK; + buf.flags |= V4L2_BUF_FRAME_FLAG_ROTATION_180; + break; + case 270: + buf.flags &= ~V4L2_BUF_FRAME_FLAG_ROTATION_MASK; + buf.flags |= V4L2_BUF_FRAME_FLAG_ROTATION_270; + break; + default: + break; + } + return; +} + +void Buffer::setEncRotation(int rotation) +{ + if( rotation%90 !=0) { + return; + } + + switch (rotation%360) { + case 90: + buf.flags &= ~V4L2_BUF_ENCODE_FLAG_ROTATION_MASK; + buf.flags |= V4L2_BUF_ENCODE_FLAG_ROTATION_90; + break; + case 180: + buf.flags &= ~V4L2_BUF_ENCODE_FLAG_ROTATION_MASK; + buf.flags |= V4L2_BUF_ENCODE_FLAG_ROTATION_180; + break; + case 270: + buf.flags &= ~V4L2_BUF_ENCODE_FLAG_ROTATION_MASK; + buf.flags |= V4L2_BUF_ENCODE_FLAG_ROTATION_270; + break; + default: + break; + } + return; +} + +void Buffer::setDownScale(int scale) +{ + if (scale == 1) { + return; + } + switch (scale) { + case 2: + buf.flags &= ~V4L2_BUF_FRAME_FLAG_SCALING_MASK; + buf.flags |= V4L2_BUF_FRAME_FLAG_SCALING_2; + break; + case 4: + buf.flags &= ~V4L2_BUF_FRAME_FLAG_SCALING_MASK; + buf.flags |= V4L2_BUF_FRAME_FLAG_SCALING_4; + break; + default: + printf("didnot support this scale factor :%d",scale); + break; + } + return; +} + +void Buffer::setMirror(int mirror) +{ + if (mirror == 0) { + return; + } else { + if (mirror == 1) { + buf.flags &= ~V4L2_BUF_FRAME_FLAG_MIRROR_MASK; + buf.flags |= V4L2_BUF_FRAME_FLAG_MIRROR_HORI; + } else if (mirror == 2) { + buf.flags &= ~V4L2_BUF_FRAME_FLAG_MIRROR_MASK; + buf.flags |= V4L2_BUF_FRAME_FLAG_MIRROR_VERT; + } + } + return; +} + +void Buffer::setEndOfStream(bool eos) +{ + buf.flags &= ~V4L2_BUF_FLAG_LAST; + buf.flags |= eos ? V4L2_BUF_FLAG_LAST : 0; +} + +void Buffer::set_force_idr_flag(bool idr) +{ + buf.flags &= ~V4L2_BUF_FLAG_KEYFRAME; + buf.flags |= idr ? V4L2_BUF_FLAG_KEYFRAME : 0; +} + +void Buffer::setROIflag(bool roi_valid){ + buf.flags &= ~V4L2_BUF_FLAG_MVX_BUFFER_ROI; + if (roi_valid) { + buf.flags |= V4L2_BUF_FLAG_MVX_BUFFER_ROI; + isRoiCfg = true; + } else { + isRoiCfg = false; + } +} + +void Buffer::setChrflag(bool chr_valid){ + buf.flags &= ~V4L2_BUF_FLAG_MVX_BUFFER_CHR; + if (chr_valid) { + buf.flags |= V4L2_BUF_FLAG_MVX_BUFFER_CHR; + isChrCfg = true; + } else { + isChrCfg = false; + } +} + +void Buffer::setGopResetflag(bool valid){ + buf.flags &= ~V4L2_BUF_FLAG_MVX_BUFFER_GOP_RESET; + if (valid) { + buf.flags |= V4L2_BUF_FLAG_MVX_BUFFER_GOP_RESET; + isGopCfg = true; + } else { + isGopCfg = false; + } +} + +void Buffer::setLtrResetflag(bool valid){ + buf.flags &= ~V4L2_BUF_FLAG_MVX_BUFFER_LTR_RESET; + if (valid) { + buf.flags |= V4L2_BUF_FLAG_MVX_BUFFER_LTR_RESET; + isLtrCfg = true; + } else { + isLtrCfg = false; + } +} + +void Buffer::setEPRflag(){ + buf.flags &= ~V4L2_BUF_FLAG_MVX_BUFFER_EPR; + buf.flags |= V4L2_BUF_FLAG_MVX_BUFFER_EPR; +} + +void Buffer::setOsdBufferflag(uint32_t index) +{ + buf.reserved2 &= ~V4L2_BUF_FLAG_MVX_OSD_MASK; + if (index & 0x1) { + buf.reserved2 |= V4L2_BUF_FLAG_MVX_OSD_1; + return; + } + if (index & 0x2) { + buf.reserved2 |= V4L2_BUF_FLAG_MVX_OSD_2; + return; + } +} + + +void Buffer::setAdStatsGeneralBuffer(int ad_stats) +{ + struct v4l2_core_buffer_header_general buffer_configs; + + buf.reserved2 &= ~V4L2_BUF_FLAG_MVX_AD_STATS; + + if (ad_stats == 0) + { + return; + } + + if(buf.m.planes[0].length < MVX_AD_STATS_THUMBNAIL_SIZE) + { + printf("frame size is less than %d,can not support AdStats\n",MVX_AD_STATS_THUMBNAIL_SIZE); + return; + } + + buffer_configs.type = V4L2_BUFFER_GENERAL_TYPE_AD_STATS; + buffer_configs.buffer_size = MVX_AD_STATS_THUMBNAIL_SIZE; + buffer_configs.config_size = sizeof(v4l2_buffer_general_ad_stats); + memset(&buffer_configs.config.ad_stats,0,sizeof(buffer_configs.config.ad_stats)); + memcpy(&buf.m.planes[0].reserved[0], &buffer_configs,sizeof(buffer_configs.type) + sizeof(buffer_configs.config_size) + sizeof(buffer_configs.buffer_size) + + sizeof(buffer_configs.config.ad_stats)); + + buf.reserved2 |= V4L2_BUF_FLAG_MVX_AD_STATS; + + printf("setAdStatsGeneralBuffer ad_stats:%d\n",ad_stats); +} + +void Buffer::update(v4l2_buffer &b) +{ + buf = b; + + if (V4L2_TYPE_IS_MULTIPLANAR(buf.type)) + { + buf.m.planes = planes; + for (size_t i = 0; i < buf.length; ++i) + { + buf.m.planes[i] = b.m.planes[i]; + } + } +} + +void Buffer::memoryMap(int fd) +{ + if (V4L2_TYPE_IS_MULTIPLANAR(buf.type)) + { + for (uint32_t i = 0; i < buf.length; ++i) + { + v4l2_plane &p = buf.m.planes[i]; + + if (p.length > 0) + { + ptr[i] = mmap(NULL, + p.length, + PROT_READ | PROT_WRITE, + MAP_SHARED, + fd, + p.m.mem_offset); + if (ptr[i] == MAP_FAILED) + { + throw Exception("Failed to mmap multi memory."); + } + } + } + } + else + { + if (buf.length > 0) + { + ptr[0] = mmap(NULL, buf.length, PROT_READ | PROT_WRITE, + MAP_SHARED, fd, buf.m.offset); + if (ptr[0] == MAP_FAILED) + { + throw Exception("Failed to mmap memory."); + } + } + } +} + +void Buffer::memoryUnmap() +{ + if (V4L2_TYPE_IS_MULTIPLANAR(buf.type)) + { + for (uint32_t i = 0; i < buf.length; ++i) + { + if (buf.memory == V4L2_MEMORY_DMABUF) + { + close(buf.m.planes[i].m.fd); + } + if (ptr[i] != 0) + { + munmap(ptr[i], buf.m.planes[i].length); + } + } + } + else + { + if (ptr[0]) + { + if (buf.memory == V4L2_MEMORY_DMABUF) + { + close(buf.m.fd); + } + munmap(ptr[0], buf.length); + } + } +} + +size_t Buffer::getLength(unsigned int plane) +{ + if (V4L2_TYPE_IS_MULTIPLANAR(buf.type)) + { + if (buf.length <= plane) + { + return 0; + } + + return buf.m.planes[plane].length; + } + else + { + if (plane > 0) + { + return 0; + } + + return buf.length; + } +} + +void Buffer::setInterlaced(bool interlaced) +{ + buf.field = interlaced ? V4L2_FIELD_SEQ_TB : V4L2_FIELD_NONE; +} + +void Buffer::setTiled(bool tiled) +{ + buf.flags &= ~(V4L2_BUF_FLAG_MVX_AFBC_TILED_HEADERS | V4L2_BUF_FLAG_MVX_AFBC_TILED_BODY); + if (tiled) + { + buf.flags |= V4L2_BUF_FLAG_MVX_AFBC_TILED_HEADERS; + buf.flags |= V4L2_BUF_FLAG_MVX_AFBC_TILED_BODY; + } +} + +void Buffer::setRoiCfg(struct v4l2_mvx_roi_regions roi) +{ + roi_cfg = roi; + isRoiCfg = true; +} + +void Buffer::setChrCfg(struct v4l2_mvx_chr_config chr) +{ + chr_cfg = chr; + isChrCfg = true; +} + +void Buffer::setOsdCfg(struct v4l2_osd_config osd) +{ + osd_cfg = osd; +} + +void Buffer::setOsdCfgEnable(bool enable) +{ + isOsdCfg = enable; +} +void Buffer::setGopResetCfg(struct v4l2_gop_config cfg) +{ + gop_cfg = cfg; + isGopCfg = true; +} + +void Buffer::setLtrResetCfg(struct v4l2_reset_ltr_peroid_config cfg) +{ + ltr_cfg = cfg; + isLtrCfg = true; +} + +void Buffer::setSuperblock(bool superblock) +{ + buf.flags &= ~(V4L2_BUF_FLAG_MVX_AFBC_32X8_SUPERBLOCK); + if (superblock) + { + buf.flags |= V4L2_BUF_FLAG_MVX_AFBC_32X8_SUPERBLOCK; + } +} + +void Buffer::setDmaFd(int fd, const unsigned int plane, const unsigned offset) +{ + if (buf.memory != V4L2_MEMORY_DMABUF) + { + throw Exception("Failed to set file descriptor. Illegal memory type. memory=%d.", buf.memory); + } + + if (V4L2_TYPE_IS_MULTIPLANAR(buf.type)) + { + buf.m.planes[plane].m.fd = fd; + buf.m.planes[plane].data_offset = offset; + } + else + { + buf.m.fd = fd; + } +} + +void Buffer::setLength(const unsigned int length, const unsigned int plane) +{ + if (V4L2_TYPE_IS_MULTIPLANAR(buf.type)) + { + buf.m.planes[plane].length = length; + } + else + { + buf.length = length; + } +} + +void Buffer::dmaMemoryMap(int dma_fd, const unsigned int plane) +{ + unsigned int length = getLength(plane); + ptr[plane] = mmap(NULL, length, PROT_READ | PROT_WRITE, MAP_SHARED, dma_fd, 0); + if (ptr[plane] == MAP_FAILED) + { + throw Exception("Failed to mmap buffer."); + } +} + +void Buffer::dmaMemoryunMap(void *p, const unsigned int plane) +{ + unsigned int length = getLength(plane); + munmap(p, length); +} + +unsigned int Buffer::getNumPlanes() const +{ + if (V4L2_TYPE_IS_MULTIPLANAR(buf.type)) + { + return buf.length; + } + else + { + return 1; + } +} + +/**************************************************************************** + * Transcoder, decoder, encoder + ****************************************************************************/ + +Codec::Codec(const char *dev, + enum v4l2_buf_type inputType, + enum v4l2_buf_type outputType, + ostream &log, + bool nonblock) : + input(fd, inputType, log), + output(fd, outputType, log), + log(log), + nonblock(nonblock) +{ + openDev(dev); + mini_frame_height = 0; + memory_type = V4L2_MEMORY_MMAP; +} + +Codec::Codec(const char *dev, + Input &input, + enum v4l2_buf_type inputType, + Output &output, + enum v4l2_buf_type outputType, + ostream &log, + bool nonblock) : + input(fd, input, inputType, log), + output(fd, output, outputType, log), + log(log), + csweo(false), + fps(0), + bps(0), + minqp(0), + maxqp(0), + fixedqp(0), + nonblock(nonblock) +{ + openDev(dev); + mini_frame_height = 0; + memory_type = V4L2_MEMORY_MMAP; +} + +Codec::~Codec() +{ + closeDev(); +} + +int Codec::stream() +{ + /* Set NALU. */ + if (isVPx(input.io->getFormat())) + { + input.setNALU(NALU_FORMAT_ONE_NALU_PER_BUFFER); + } + + if (input.io->getFormat() == V4L2_PIX_FMT_RV) + { + input.setNALU(NALU_FORMAT_ONE_NALU_PER_BUFFER); + } + if (input.io->getFormat() == V4L2_PIX_FMT_VC1_ANNEX_L) + { + input.setNALU(NALU_FORMAT_ONE_NALU_PER_BUFFER); + } + if (input.io->getNaluFormat() == NALU_FORMAT_ONE_NALU_PER_BUFFER + || input.io->getNaluFormat() == NALU_FORMAT_ONE_BYTE_LENGTH_FIELD + || input.io->getNaluFormat() == NALU_FORMAT_TWO_BYTE_LENGTH_FIELD + || input.io->getNaluFormat() == NALU_FORMAT_FOUR_BYTE_LENGTH_FIELD){ + input.setNALU((NaluFormat)input.io->getNaluFormat()); + } + if ((input.io->getFormat() == V4L2_PIX_FMT_VC1_ANNEX_L) || + (input.io->getFormat() == V4L2_PIX_FMT_VC1_ANNEX_G)) + { + struct v4l2_control control; + int profile = 0xff; + + switch (input.io->getProfile()) + { + case 0: + { + profile = 0; + break; + } + case 4: + { + profile = 1; + break; + } + case 12: + { + profile = 2; + break; + } + default: + { + throw Exception("Unsupported VC1 profile.\n"); + } + } + + log << "VC1 decoding profile( " << profile << " )" << endl; + + memset(&control, 0, sizeof(control)); + + control.id = V4L2_CID_MVE_VIDEO_VC1_PROFILE; + control.value = profile; + + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) + { + throw Exception("Failed to set profile=%u for fmt: %u .", profile, input.io->getFormat()); + } + } + + /* Add VPx file header. */ + if (isVPx(output.io->getFormat())) + { + output.setNALU(NALU_FORMAT_ONE_NALU_PER_BUFFER); + } + + try + { + queryCapabilities(); + /* enumerateFormats(); */ + enumerateFramesizes(output.io->getFormat()); + setFormats(); + subscribeEvents(); + allocateBuffers(memory_type); + queueBuffers(); + streamon(); + + if (nonblock) + { + runPoll(); + } + else + { + runThreads(); + } + streamoff(); + } + catch (Exception &e) + { + cerr << "Error: " << e.what() << endl; + return 1; + } + + return 0; +} + +uint32_t Codec::to4cc(const string &str) +{ + if (str.compare("yuv420_afbc_8") == 0) + { + return v4l2_fourcc('Y', '0', 'A', '8'); + } + else if (str.compare("yuv420_afbc_10") == 0) + { + return v4l2_fourcc('Y', '0', 'A', 'A'); + } + else if (str.compare("yuv422_afbc_8") == 0) + { + return v4l2_fourcc('Y', '2', 'A', '8'); + } + else if (str.compare("yuv422_afbc_10") == 0) + { + return v4l2_fourcc('Y', '2', 'A', 'A'); + } + else if (str.compare("yuv420") == 0) + { + return V4L2_PIX_FMT_YUV420M; + } + else if (str.compare("yuv420_nv12") == 0) + { + return V4L2_PIX_FMT_NV12; + } + else if (str.compare("yuv420_nv21") == 0) + { + return V4L2_PIX_FMT_NV21; + } + else if (str.compare("yuv420_p010") == 0) + { + return V4L2_PIX_FMT_P010; + } + else if (str.compare("yuv420_y0l2") == 0) + { + return V4L2_PIX_FMT_Y0L2; + } + else if (str.compare("yuv420_aqb1") == 0) + { + return V4L2_PIX_FMT_AQB1; + } + else if (str.compare("yuv422_yuy2") == 0) + { + return V4L2_PIX_FMT_YUYV; + } + else if (str.compare("yuv422_uyvy") == 0) + { + return V4L2_PIX_FMT_UYVY; + } + else if (str.compare("yuv422_y210") == 0) + { + return V4L2_PIX_FMT_Y210; + } + else if (str.compare("rgba") == 0) + { + return DRM_FORMAT_ABGR8888; + } + else if (str.compare("bgra") == 0) + { + return DRM_FORMAT_ARGB8888; + } + else if (str.compare("argb") == 0) + { + return DRM_FORMAT_BGRA8888; + } + else if (str.compare("abgr") == 0) + { + return DRM_FORMAT_RGBA8888; + } + else if (str.compare("bgr") == 0) + { + return V4L2_PIX_FMT_BGR24; + } + else if (str.compare("rgb") == 0) + { + return V4L2_PIX_FMT_RGB24; + } + else if (str.compare("rgb3p") == 0) + { + return V4L2_PIX_FMT_RGB_3P; + } + else if (str.compare("argb1555") == 0) + { + return V4L2_PIX_FMT_ARGB555; + } + else if (str.compare("argb4444") == 0) + { + return V4L2_PIX_FMT_ARGB444; + } + else if (str.compare("rgb565") == 0) + { + return V4L2_PIX_FMT_RGB565; + } + else if (str.compare("gray") == 0) + { + return V4L2_PIX_FMT_GREY; + } + else if (str.compare("gray_10") == 0) + { + return V4L2_PIX_FMT_Y10_LE; + } + else if (str.compare("yuv444") == 0) + { + return V4L2_PIX_FMT_YUV444M; + } + else if (str.compare("yuv444_10") == 0) + { + return V4L2_PIX_FMT_YUV444_10; + } + else if (str.compare("yuv420_2p10") == 0) + { + return V4L2_PIX_FMT_YUV420_2P_10; + } + else if (str.compare("yuv422_1p10") == 0) + { + return V4L2_PIX_FMT_YUV422_1P_10; + } + else if (str.compare("yuv_i42010") == 0) + { + return V4L2_PIX_FMT_YUV420_I420_10; + } + else if (str.compare("avs2") == 0) + { + return V4L2_PIX_FMT_AVS2; + } + else if (str.compare("avs") == 0) + { + return V4L2_PIX_FMT_AVS; + } + else if (str.compare("h263") == 0) + { + return V4L2_PIX_FMT_H263; + } + else if (str.compare("h264") == 0) + { + return V4L2_PIX_FMT_H264; + } + else if (str.compare("h264_mvc") == 0) + { + return V4L2_PIX_FMT_H264_MVC; + } + else if (str.compare("h264_no_sc") == 0) + { + return V4L2_PIX_FMT_H264_NO_SC; + } + else if (str.compare("hevc") == 0) + { + return V4L2_PIX_FMT_HEVC; + } + else if (str.compare("mjpeg") == 0) + { + return V4L2_PIX_FMT_MJPEG; + } + else if (str.compare("jpeg") == 0) + { + return V4L2_PIX_FMT_JPEG; + } + else if (str.compare("mpeg2") == 0) + { + return V4L2_PIX_FMT_MPEG2; + } + else if (str.compare("mpeg4") == 0) + { + return V4L2_PIX_FMT_MPEG4; + } + else if (str.compare("rv") == 0) + { + return V4L2_PIX_FMT_RV; + } + else if (str.compare("vc1") == 0) + { + return V4L2_PIX_FMT_VC1_ANNEX_G; + } + else if (str.compare("vc1_l") == 0) + { + return V4L2_PIX_FMT_VC1_ANNEX_L; + } + else if (str.compare("vp8") == 0) + { + return V4L2_PIX_FMT_VP8; + } + else if (str.compare("vp9") == 0) + { + return V4L2_PIX_FMT_VP9; + } + else if (str.compare("av1") == 0) + { + return V4L2_PIX_FMT_AV1; + } + else + { + throw Exception("Not a valid format '%s'.\n", str.c_str()); + } + + return 0; +} + +bool Codec::isVPx(uint32_t format) +{ + return format == V4L2_PIX_FMT_VP8 || format == V4L2_PIX_FMT_VP9 || format == V4L2_PIX_FMT_AV1; +} + +bool Codec::isAFBC(uint32_t format) +{ + switch (format) + { + case V4L2_PIX_FMT_YUV420_AFBC_8: + case V4L2_PIX_FMT_YUV420_AFBC_10: + case V4L2_PIX_FMT_YUV422_AFBC_8: + case V4L2_PIX_FMT_YUV422_AFBC_10: + return true; + default: + return false; + } +} + +bool Codec::isYUV422(uint32_t format) +{ + switch (format) + { + case V4L2_PIX_FMT_YUYV: + case V4L2_PIX_FMT_UYVY: + case V4L2_PIX_FMT_Y210: + case V4L2_PIX_FMT_YUV422_1P_10: + case V4L2_PIX_FMT_YUV422_AFBC_8: + case V4L2_PIX_FMT_YUV422_AFBC_10: + return true; + default: + return false; + } +} + +size_t Codec::getBytesUsed(v4l2_buffer &buf) +{ + size_t size = 0; + + if (V4L2_TYPE_IS_MULTIPLANAR(buf.type)) + { + for (uint32_t i = 0; i < buf.length; ++i) + { + size += buf.m.planes[i].bytesused; + } + } + else + { + size = buf.bytesused; + } + + return size; +} + +void Codec::openDev(const char *dev) +{ + int flags = O_RDWR; + + log << "Opening '" << dev << "'." << endl; + + if (nonblock) + { + flags |= O_NONBLOCK; + } + + /* Open the video device in read/write mode. */ + fd = open(dev, flags); + if (fd < 0) + { + throw Exception("Failed to open device."); + } +} + +void Codec::closeDev() +{ + log << "Closing fd " << fd << "." << endl; + close(fd); + fd = -1; +} + +void Codec::queryCapabilities() +{ + struct v4l2_capability cap; + int ret; + + /* Query capabilities. */ + ret = ioctl(fd, VIDIOC_QUERYCAP, &cap); + if (ret != 0) + { + throw Exception("Failed to query for capabilities"); + } + + if ((cap.capabilities & + (V4L2_CAP_VIDEO_M2M | V4L2_CAP_VIDEO_M2M_MPLANE)) == 0) + { + throw Exception("Device is missing m2m support."); + } +} + +void Codec::enumerateFormats() +{ + input.enumerateFormats(); + output.enumerateFormats(); +} + +void Codec::Port::enumerateFormats() +{ + struct v4l2_fmtdesc fmtdesc; + int ret; + + fmtdesc.index = 0; + fmtdesc.type = type; + + while (1) + { + ret = ioctl(fd, VIDIOC_ENUM_FMT, &fmtdesc); + if (ret != 0) + { + break; + } + + log << "fmt: index=" << fmtdesc.index << + ", type=" << fmtdesc.type << + " , flags=" << hex << fmtdesc.flags << + ", pixelformat=" << fmtdesc.pixelformat << + ", description=" << fmtdesc.description << + endl; + + fmtdesc.index++; + } + + printf("\n"); +} + +void Codec::enumerateFramesizes(uint32_t format) +{ + struct v4l2_frmsizeenum frmsize; + + frmsize.index = 0; + frmsize.pixel_format = format; + + int ret = ioctl(fd, VIDIOC_ENUM_FRAMESIZES, &frmsize); + if (ret != 0) + { + throw Exception("Failed to enumerate frame sizes. ret=d.\n", + ret); + } + + log << "Enumerate frame size." << + " index=" << frmsize.index << + ", pixel_format=" << hex << frmsize.pixel_format << dec; + + switch (frmsize.type) + { + case V4L2_FRMIVAL_TYPE_DISCRETE: + break; + case V4L2_FRMIVAL_TYPE_CONTINUOUS: + case V4L2_FRMIVAL_TYPE_STEPWISE: + log << ", min_width=" << frmsize.stepwise.min_width << + ", max_width=" << frmsize.stepwise.max_width << + ", step_width=" << frmsize.stepwise.step_width << + ", min_height=" << frmsize.stepwise.min_height << + ", max_height=" << frmsize.stepwise.max_height << + ", step_height=" << frmsize.stepwise.step_height; + break; + default: + throw Exception("Unsupported enumerate frame size type. type=d.\n", + frmsize.type); + } + + log << endl; +} + +const v4l2_format &Codec::Port::getFormat() +{ + /* Get and print format. */ + format.type = type; + int ret = ioctl(fd, VIDIOC_G_FMT, &format); + if (ret != 0) + { + throw Exception("Failed to get format."); + } + + return format; +} + +void Codec::Port::tryFormat(v4l2_format &format) +{ + int ret = ioctl(fd, VIDIOC_TRY_FMT, &format); + if (ret != 0) + { + throw Exception("Failed to try format."); + } +} + +void Codec::Port::setFormat(v4l2_format &format) +{ + int ret = ioctl(fd, VIDIOC_S_FMT, &format); + if (ret != 0) + { + throw Exception("Failed to set format."); + } + + this->format = format; +} + +void Codec::Port::getTrySetFormat() +{ + size_t width = 0, height = 0; + + v4l2_format fmt = getFormat(); + if (V4L2_TYPE_IS_MULTIPLANAR(type)) + { + struct v4l2_pix_format_mplane &f = fmt.fmt.pix_mp; + + f.pixelformat = io->getFormat(); + f.width = io->getWidth(); + f.height = io->getHeight(); + f.num_planes = 3; + f.field = interlaced ? V4L2_FIELD_SEQ_TB : V4L2_FIELD_NONE; + + for (int i = 0; i < 3; ++i) + { + f.plane_fmt[i].bytesperline = __stride[i]; + f.plane_fmt[i].sizeimage = 0; + } + } + else + { + struct v4l2_pix_format &f = fmt.fmt.pix; + + f.pixelformat = io->getFormat(); + f.width = io->getWidth(); + f.height = io->getHeight(); + f.bytesperline = 0; + f.sizeimage = 1 * 1024 * 1024; + f.field = interlaced ? V4L2_FIELD_SEQ_TB : V4L2_FIELD_NONE; + } + + /* Try format. */ + tryFormat(fmt); + + if (V4L2_TYPE_IS_MULTIPLANAR(type)) + { + struct v4l2_pix_format_mplane &f = fmt.fmt.pix_mp; + width = f.width; + height = f.height; + if (mini_frame_height >= 64) { + for (int i = 0; i < 3; ++i) + { + f.plane_fmt[i].sizeimage = f.plane_fmt[i].bytesperline * io->getReadHeight(); + if (i > 0) f.plane_fmt[i].sizeimage /= 2; + } + } + } + else + { + struct v4l2_pix_format &f = fmt.fmt.pix; + width = f.width; + height = f.height; + } + // for dsl frame case, this is not suitable, remove this. + if (V4L2_TYPE_IS_OUTPUT(type) && (width != io->getWidth() || height != io->getHeight())) + { + //throw Exception("Selected resolution is not supported for this format width:%d, io width:%d", width, io->getWidth()); + } + setFormat(fmt); + printFormat(fmt); +} + +void Codec::setFormats() +{ + input.getTrySetFormat(); + output.getTrySetFormat(); +} + +void Codec::Port::printFormat(const struct v4l2_format &format) +{ + if (V4L2_TYPE_IS_MULTIPLANAR(format.type)) + { + const struct v4l2_pix_format_mplane &f = format.fmt.pix_mp; + + log << "Format:" << dec << + " type=" << format.type << + ", format=" << f.pixelformat << + ", width=" << f.width << + ", height=" << f.height << + ", nplanes=" << int(f.num_planes) << + ", bytesperline=[" << f.plane_fmt[0].bytesperline << + ", " << f.plane_fmt[1].bytesperline << + ", " << f.plane_fmt[2].bytesperline << "]" << + ", sizeimage=[" << f.plane_fmt[0].sizeimage << + ", " << f.plane_fmt[1].sizeimage << + ", " << f.plane_fmt[2].sizeimage << "]" << + ", interlaced:" << interlaced << + endl; + } + else + { + const struct v4l2_pix_format &f = format.fmt.pix; + + log << "Format:" << dec << + " type=" << format.type << + ", format=" << f.pixelformat << + ", width=" << f.width << + ", height=" << f.height << + ", sizeimage=" << f.sizeimage << + ", bytesperline=" << f.bytesperline << + ", interlaced:" << interlaced << endl; + } +} + +const v4l2_crop Codec::Port::getCrop() +{ + v4l2_crop crop = { .type = type }; + + int ret = ioctl(fd, VIDIOC_G_CROP, &crop); + if (ret != 0) + { + throw Exception("Failed to get crop."); + } + + return crop; +} + +void Codec::Port::setInterlaced(bool interlaced) +{ + this->interlaced = interlaced; +} + +void Codec::Port::tryEncStopCmd(bool tryStop) +{ + this->tryEncStop = tryStop; +} + +void Codec::Port::tryDecStopCmd(bool tryStop) +{ + this->tryDecStop = tryStop; +} + +v4l2_mvx_color_desc Codec::getColorDesc() +{ + v4l2_mvx_color_desc color; + + int ret = ioctl(fd, VIDIOC_G_MVX_COLORDESC, &color); + if (ret != 0) + { + throw Exception("Failed to get color description."); + } + + return color; +} + +void Codec::printColorDesc(const v4l2_mvx_color_desc &color) +{ + log << "Color desc. range=" << static_cast(color.range) << + ", primaries=" << static_cast(color.primaries) << + ", transfer=" << static_cast(color.transfer) << + ", matrix=" << static_cast(color.matrix); + + if (color.flags & V4L2_MVX_COLOR_DESC_DISPLAY_VALID) + { + log << ", display={" << + "r={x=" << color.display.r.x << ", y=" << color.display.r.y << "}" << + ", g={x=" << color.display.g.x << ", y=" << color.display.g.y << "}" << + ", b={x=" << color.display.b.x << ", y=" << color.display.b.y << "}" << + ", w={x=" << color.display.w.x << ", y=" << color.display.w.y << "}"; + } + + if (color.flags & V4L2_MVX_COLOR_DESC_CONTENT_VALID) + { + log << ", luminance_min=" << color.display.luminance_min * 0.00002 << + ", lumiance_max=" << color.display.luminance_max * 0.00002 << "}" << + ", content={luminance_max=" << color.content.luminance_max * 0.00002 << + ", luminance_average=" << color.content.luminance_average * 0.00002 << "}"; + } + + log << endl; +} + +void Codec::subscribeEvents() +{ + subscribeEvents(V4L2_EVENT_EOS); + subscribeEvents(V4L2_EVENT_SOURCE_CHANGE); + subscribeEvents(V4L2_EVENT_MVX_COLOR_DESC); +} + +void Codec::subscribeEvents(uint32_t event) +{ + struct v4l2_event_subscription sub = { + .type = event, .id = 0 + }; + int ret; + + ret = ioctl(fd, VIDIOC_SUBSCRIBE_EVENT, &sub); + if (ret != 0) + { + throw Exception("Failed to subscribe for event."); + } +} + +void Codec::unsubscribeEvents() +{ + unsubscribeEvents(V4L2_EVENT_ALL); +} + +void Codec::unsubscribeEvents(uint32_t event) +{ + struct v4l2_event_subscription sub; + int ret; + + sub.type = event; + ret = ioctl(fd, VIDIOC_UNSUBSCRIBE_EVENT, &sub); + if (ret != 0) + { + throw Exception("Failed to unsubscribe for event."); + } +} +void Codec::setInputThread(int input_thread) +{ + if (input_thread) + { + input.startInputThread(); + } +} + +void Codec::setMemoryType(enum v4l2_memory mem_type) +{ + memory_type = mem_type; + input.setPortMemoryType(mem_type); + output.setPortMemoryType(mem_type); +} + +void Codec::allocateBuffers(enum v4l2_memory m_type) +{ + //0 is default value, let port handle buffer cnt + input.allocateBuffers(input.getBufferCnt() ? input.getBufferCnt() : 6, m_type); + output.allocateBuffers(output.getBufferCnt()? output.getBufferCnt() : 6, m_type); +} + +uint32_t Codec::Port::getInputBufferIdx(pthread_mutex_t *mutex, pthread_cond_t *cond, std::queue *input_queue) +{ + uint32_t index; + pthread_mutex_lock(mutex); + while(input_queue->size() == 0) + { + pthread_cond_wait(cond, mutex); + } + index = input_queue->front(); + input_queue->pop(); + pthread_mutex_unlock(mutex); + return index; +} + +void Codec::Port::appendInputBufferIdx(pthread_mutex_t *mutex, pthread_cond_t *cond, std::queue *input_queue, uint32_t index) +{ + pthread_mutex_lock(mutex); + input_queue->push(index); + pthread_cond_broadcast(cond); + pthread_mutex_unlock(mutex); +} + +void* Codec::Port::fillInputThread(void *arg) +{ + Codec::Port *input = static_cast(arg); + pthread_detach(pthread_self()); + input->_fillInputThread(); + pthread_exit((void *)NULL); +} + +void Codec::Port::_fillInputThread() +{ + while(!io->eof()){ + uint32_t index = getInputBufferIdx(&input_producer_mutex, &input_producer_cond, &input_producer_queue); + Buffer &buffer = *(buffers.at(index)); + io->prepare(buffer); + buffer.setEndOfStream(io->eof()); + appendInputBufferIdx(&input_consumer_mutex, &input_consumer_cond, &input_consumer_queue, index); + } +} + +void Codec::Port::startInputThread() +{ + int ret; + isInputThread = true; + pthread_mutex_init(&input_consumer_mutex, NULL); + pthread_mutex_init(&input_producer_mutex, NULL); + pthread_cond_init(&input_consumer_cond, NULL); + pthread_cond_init(&input_producer_cond, NULL); + ret = pthread_create(&tid, NULL, fillInputThread, this); + if (ret != 0) + { + throw Exception("Failed to create input thread."); + } +} + +void Codec::Port::setPortMemoryType(enum v4l2_memory mem_type) +{ + memory_type_port = mem_type; +} + +int Codec::Port::allocateDMABuf(size_t size) +{ + int ionfd = open("/dev/ion", O_RDWR); + int dma_fd; + if (ionfd < 0) + { + throw Exception("Failed to open ion device."); + } + + struct ion_allocation_data allocData = { .len = size }; + allocData.heap_id_mask = 1 << (ION_HEAP_TYPE_CUSTOM + 1); + if (ioctl(ionfd, ION_IOC_ALLOC, &allocData) < 0) + { + throw Exception("ION_IOC_ALLOC failed. errno=%d (%s).", errno, strerror(errno)); + } + +#ifdef ION_IOC_MAP + ion_user_handle_t handle = allocData.handle; + + struct ion_fd_data fdData= { .handle = handle, .fd = -1 }; + if (ioctl(ionfd, ION_IOC_MAP, &fdData) < 0) + { + throw Exception("ION_IOC_MAP failed. errno=%d (%s).", errno, strerror(errno)); + } + + dma_fd = fdData.fd; + struct ion_handle_data handleData = { .handle = handle }; + if (ioctl(ionfd, ION_IOC_FREE, &handleData) < 0) + { + throw Exception("ION_IOC_FREE failed. errno=%d (%s).", errno, strerror(errno)); + } +#else + dma_fd = allocData.fd; +#endif + close(ionfd); + return dma_fd; +} + +void Codec::Port::allocateBuffers(size_t count, enum v4l2_memory mem_type) +{ + struct v4l2_requestbuffers reqbuf; + uint32_t i; + int ret; + /* Free existing meta buffer. */ + freeBuffers(); + /* Request new buffer to be allocated. */ + reqbuf.count = io->needDoubleCount()?count * 2 : count; + reqbuf.type = type; + reqbuf.memory = mem_type; + ret = ioctl(fd, VIDIOC_REQBUFS, &reqbuf); + if (ret != 0) + { + throw Exception("Failed to request buffers.%d", mem_type); + } + + log << "Request buffers." << + " type=" << reqbuf.type << + ", count=" << reqbuf.count << + ", memory=" << reqbuf.memory << endl; + + /* Reset number of buffers queued to driver. */ + pending = 0; + + /* Query each buffer and create a new meta buffer. */ + for (i = 0; i < reqbuf.count; ++i) + { + v4l2_buffer buf; + struct v4l2_plane planes[VIDEO_MAX_PLANES]; + + buf.type = type; + buf.memory = mem_type; + buf.index = i; + buf.length = 3; + buf.m.planes = planes; + ret = ioctl(fd, VIDIOC_QUERYBUF, &buf); + if (ret != 0) + { + throw Exception("Failed to query buffer.ret=%d", ret); + } + + printBuffer(buf, "Query"); + + buffers[buf.index] = new Buffer(buf, fd, format, mem_type); + size_t nplanes = buffers[buf.index]->getNumPlanes(); + if (mem_type == V4L2_MEMORY_MMAP) { + buffers[buf.index]->memoryMap(fd); + } else if (mem_type == V4L2_MEMORY_DMABUF) { + for (unsigned int plane = 0; plane < nplanes; ++plane) + { + unsigned int length = nplanes == 1 ? buf.length : buf.m.planes[plane].length; + int dma_fd = allocateDMABuf(length); + + buffers[buf.index]->setDmaFd(dma_fd, plane); + buffers[buf.index]->setLength(length, plane); + buffers[buf.index]->dmaMemoryMap(dma_fd, plane); + } + } else { + cerr<<"didnot support this v4l2 memory type on this mode:"<second); + buffers.erase(it); + } +} + +unsigned int Codec::Port::getBufferCount() +{ + struct v4l2_control control; + uint32_t value; + + control.id = V4L2_TYPE_IS_OUTPUT(type) ? V4L2_CID_MIN_BUFFERS_FOR_OUTPUT : V4L2_CID_MIN_BUFFERS_FOR_CAPTURE; + if (-1 == ioctl(fd, VIDIOC_G_CTRL, &control)) + { + throw Exception("Failed to get minimum buffers."); + } + value = control.value; + return value > getBufferCnt() ? value : getBufferCnt(); +} + +void Codec::queueBuffers() +{ + output.queueBuffers(); + input.queueBuffers(); +} + +void Codec::Port::queueBuffers() +{ + for (BufferMap::iterator it = buffers.begin(); + it != buffers.end(); ++it) + { + Buffer &buffer = *(it->second); + if (!io->eof()) + { + /* Remove vendor custom flags. */ + buffer.resetVendorFlags(); + + if (isInputThread) { + appendInputBufferIdx(&input_producer_mutex, &input_producer_cond, &input_producer_queue, buffer.getBuffer().index); + uint32_t index = getInputBufferIdx(&input_consumer_mutex, &input_consumer_cond, &input_consumer_queue); + Buffer &buffer_input = *(buffers.at(index)); + queueBuffer(buffer_input); + } else { + io->prepare(buffer); + buffer.setEndOfStream(io->eof()); + queueBuffer(buffer); + } + } + } +} + +void Codec::Port::queueBuffer(Buffer &buf) +{ + v4l2_buffer &b = buf.getBuffer(); + int ret; + + buf.setFrameProcessCount(frames_processed); + buf.setInterlaced(interlaced); + if(io->getDir() == 0 && V4L2_TYPE_IS_MULTIPLANAR(b.type)){ + buf.setEncRotation(rotation); + } + if(io->getDir() == 1 && V4L2_TYPE_IS_MULTIPLANAR(b.type)){ + buf.setRotation(rotation); + } + buf.setMirror(mirror); + buf.setDownScale(scale); + + if (buf.getRoiCfgflag() && getBytesUsed(b) != 0) { + struct v4l2_mvx_roi_regions roi = buf.getRoiCfg(); + ret = ioctl(fd, VIDIOC_S_MVX_ROI_REGIONS, &roi); + if (ret != 0) + { + throw Exception("Failed to queue roi param."); + } + } + + if (buf.getChrCfgflag() && getBytesUsed(b) != 0) { + struct v4l2_mvx_chr_config chr = buf.getChrCfg(); + ret = ioctl(fd, VIDIOC_S_MVX_CHR_CFG, &chr); + if (ret != 0) + { + throw Exception("Failed to queue chr param."); + } + } + + if (buf.getGopResetCfgflag() && getBytesUsed(b) != 0) { + struct v4l2_gop_config gop = buf.getGopResetCfg(); + setGopResetPframes(gop.gop_pframes); + } + + if (buf.getLtrResetCfgflag() && getBytesUsed(b) != 0) { + struct v4l2_reset_ltr_peroid_config ltr = buf.getLtrResetCfg(); + setLtrResetPeriod(ltr.reset_ltr_peroid); + } + if (buf.getResetStatsMode() > 0 && getBytesUsed(b) != 0) { + setStatsMode(buf.getResetStatsMode(), buf.getResetStatsPicIndex()); + } + + if (buf.getOsdCfgEnable() > 0 && getBytesUsed(b) != 0) { + setOsdCfg(buf.getOsdCfg()); + } + + if (buf.getQPofEPR().qp > 0) { + struct v4l2_buffer_param_qp _epr_qp = buf.getQPofEPR(); + ret = ioctl(fd, VIDIOC_S_MVX_QP_EPR, &_epr_qp); + if (ret != 0) + { + throw Exception("Failed to queue roi param."); + } + _epr_qp.qp = 0; + buf.setQPofEPR(_epr_qp); + } + /* Mask buffer offset. */ + if (!V4L2_TYPE_IS_MULTIPLANAR(b.type)) + { + switch (b.memory) + { + case V4L2_MEMORY_MMAP: + b.m.offset &= ~((1 << 12) - 1); + break; + default: + break; + } + } + //encoder specfied frames count to be processed + if (io->getDir() == 0 && frames_count > 0 && frames_processed >= frames_count - 1 && !buf.isGeneralBuffer() && !buf.isOsdBuffer()) { + if (frames_processed >= frames_count) { + buf.clearBytesUsed(); + buf.resetVendorFlags(); + return; + } + buf.setEndOfStream(true); + } + if (io->getDir() == 0 && V4L2_TYPE_IS_MULTIPLANAR(b.type) && + !buf.isGeneralBuffer() && !buf.isOsdBuffer()) { + Input *is = dynamic_cast(io); + if (is->idr_list.size()) + { + if (is->idr_list.front() == frames_processed){ + is->idr_list.pop(); + buf.set_force_idr_flag(true); + } else { + buf.set_force_idr_flag(false); + } + } + frames_processed++; + } + if (seamless.seamless_mode !=0 && io->getDir() == 1 && V4L2_TYPE_IS_MULTIPLANAR(b.type)) { + buf.setAdStatsGeneralBuffer(ad_stats); + } + printBuffer(b, "->"); + ret = ioctl(fd, VIDIOC_QBUF, &b); + if (ret != 0) + { + throw Exception("Failed to queue buffer."); + } + + ++pending; +} + +Buffer &Codec::Port::dequeueBuffer() +{ + v4l2_plane planes[VIDEO_MAX_PLANES]; + v4l2_buffer buf; + buf.m.planes = planes; + int ret; + + buf.type = type; + buf.memory = memory_type_port; + buf.length = 3; + + ret = ioctl(fd, VIDIOC_DQBUF, &buf); + if (ret != 0) + { + throw Exception("Failed to dequeue buffer. type=%u, memory=%u", + buf.type, buf.memory); + } + + --pending; + printBuffer(buf, "<-"); + + Buffer &buffer = *(buffers.at(buf.index)); + buffer.update(buf); + + buffer.setCrop(getCrop()); + if (V4L2_TYPE_IS_MULTIPLANAR(buf.type)) + { + buffer.setSeamless(this->seamless); + } + return buffer; +} + +void Codec::Port::printBuffer(const v4l2_buffer &buf, const char *prefix) +{ + log << prefix << ": " << + "type=" << buf.type << + ", index=" << buf.index << + ", sequence=" << buf.sequence << + ", timestamp={" << buf.timestamp.tv_sec << ", " << buf.timestamp.tv_usec << "}" << + ", flags=" << hex << buf.flags << dec; + + if (V4L2_TYPE_IS_MULTIPLANAR(buf.type)) + { + const char *delim; + + log << ", num_planes=" << buf.length; + + delim = ""; + log << ", bytesused=["; + for (unsigned int i = 0; i < buf.length; ++i) + { + log << delim << buf.m.planes[i].bytesused; + delim = ", "; + } + log << "]"; + + delim = ""; + log << ", length=["; + for (unsigned int i = 0; i < buf.length; ++i) + { + log << delim << buf.m.planes[i].length; + delim = ", "; + } + log << "]"; + + delim = ""; + log << ", offset=["; + for (unsigned int i = 0; i < buf.length; ++i) + { + log << delim << buf.m.planes[i].data_offset; + delim = ", "; + } + log << "]"; + if(seamless.seamless_mode != 0 && buf.m.planes[0].bytesused >0) + { + log << ", out video w:h=["; + log<<((buf.m.planes[0].reserved[1] & 0xffff0000) >> 16); + delim = ", "; + log << delim << (buf.m.planes[0].reserved[1] & 0xffff); + log << "]"; + log << ", stride=["; + delim =""; + for (unsigned int i = 0; i < buf.length; ++i) + { + log << delim << buf.m.planes[i].reserved[0]; + delim = ", "; + } + log << "]"; + } + } + else + { + log << ", bytesused=" << buf.bytesused << + ", length=" << buf.length; + } + + log << endl; +} + +void Codec::streamon() +{ + input.streamon(); + output.streamon(); +} + +void Codec::Port::streamon() +{ + log << "Stream on " << dec << type << endl; + + int ret = ioctl(fd, VIDIOC_STREAMON, &type); + if (ret != 0) + { + throw Exception("Failed to stream on."); + } +} + +void Codec::streamoff() +{ + input.streamoff(); + output.streamoff(); +} + +void Codec::Port::streamoff() +{ + log << "Stream off " << dec << type << endl; + + int ret = ioctl(fd, VIDIOC_STREAMOFF, &type); + if (ret != 0) + { + throw Exception("Failed to stream off."); + } +} + +void Codec::Port::sendEncStopCommand() +{ + v4l2_encoder_cmd cmd = { .cmd = V4L2_ENC_CMD_STOP }; + + if (tryEncStop) + { + if (0 != ioctl(fd, VIDIOC_TRY_ENCODER_CMD, &cmd)) + { + throw Exception("Failed to send try encoder stop command."); + } + if (0 != ioctl(fd, VIDIOC_ENCODER_CMD, &cmd)) + { + throw Exception("Failed to send encoding stop command."); + } + } +} + +void Codec::Port::sendDecStopCommand() +{ + v4l2_decoder_cmd cmd = { .cmd = V4L2_DEC_CMD_STOP }; + + if (tryDecStop) + { + if (0 != ioctl(fd, VIDIOC_TRY_DECODER_CMD, &cmd)) + { + throw Exception("Failed to send try decoder stop command."); + } + } + + if (0 != ioctl(fd, VIDIOC_DECODER_CMD, &cmd)) + { + throw Exception("Failed to send decoding stop command."); + } +} + +void Codec::Port::setH264DecIntBufSize(uint32_t ibs) +{ + log << "setH264DecIntBufSize( " << ibs << " )" << endl; + + struct v4l2_control control; + + memset(&control, 0, sizeof(control)); + control.id = V4L2_CID_MVE_VIDEO_INTBUF_SIZE; + control.value = ibs; + + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) + { + throw Exception("Failed to set H264 ibs=%u.", ibs); + } +} + +void Codec::Port::setDecFrameReOrdering(uint32_t fro) +{ + log << "setDecFrameReOrdering( " << fro << " )" << endl; + + struct v4l2_control control; + + memset(&control, 0, sizeof(control)); + control.id = V4L2_CID_MVE_VIDEO_FRAME_REORDERING; + control.value = fro; + + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) + { + throw Exception("Failed to set decoding fro=%u.", fro); + } +} + +void Codec::Port::setDecIgnoreStreamHeaders(uint32_t ish) +{ + log << "setDecIgnoreStreamHeaders( " << ish << " )" << endl; + + struct v4l2_control control; + + memset(&control, 0, sizeof(control)); + control.id = V4L2_CID_MVE_VIDEO_IGNORE_STREAM_HEADERS; + control.value = ish; + + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) + { + throw Exception("Failed to set decoding ish=%u.", ish); + } +} + +void Codec::Port::setNALU(NaluFormat nalu) +{ + log << "Set NALU " << nalu << endl; + + struct v4l2_control control; + + memset(&control, 0, sizeof(control)); + control.id = V4L2_CID_MVE_VIDEO_NALU_FORMAT; + control.value = nalu; + + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) + { + throw Exception("Failed to set NALU. nalu=%u.", nalu); + } +} + +void Codec::Port::setEncFramerate(uint32_t frame_rate) +{ + log << "setEncFramerate( " << frame_rate << " )" << endl; + + struct v4l2_control control; + + memset(&control, 0, sizeof(control)); + control.id = V4L2_CID_MVE_VIDEO_FRAME_RATE; + control.value = frame_rate; + + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) + { + throw Exception("Failed to set frame_rate=%u.", frame_rate); + } +} + +void Codec::Port::setEncBitrate(uint32_t bit_rate) +{ + log << "setEncBitrate( " << bit_rate << " )" << endl; + log << "setRctype( " << rc_type << " )" << endl; + if (bit_rate == 0 && rc_type == 0) { + return; + } + struct v4l2_control control; + + memset(&control, 0, sizeof(control)); + control.id = V4L2_CID_MPEG_VIDEO_BITRATE; + control.value = bit_rate; + + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) + { + throw Exception("Failed to set bit_rate=%u.", bit_rate); + } +} + +void Codec::Port::setRateControl(struct v4l2_rate_control *rc) +{ + log << "setRateControl( " << rc->rc_type << ","; + log << rc->target_bitrate << "," << rc->maximum_bitrate << ")" << endl; + + int ret = ioctl(fd, VIDIOC_S_MVX_RATE_CONTROL, rc); + if (ret != 0) + { + throw Exception("Failed to set rate control."); + } + + return; + +} + +void Codec::Port::setEncPFrames(uint32_t pframes) +{ + log << "setEncPFrames( " << pframes << " )" << endl; + + struct v4l2_control control; + + memset(&control, 0, sizeof(control)); + control.id = V4L2_CID_MVE_VIDEO_P_FRAMES; + control.value = pframes; + + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) + { + throw Exception("Failed to set pframes=%u.", pframes); + } +} + +void Codec::Port::setEncBFrames(uint32_t bframes) +{ + log << "setEncBFrames( " << bframes << " )" << endl; + + struct v4l2_control control; + + memset(&control, 0, sizeof(control)); + control.id = V4L2_CID_MPEG_VIDEO_B_FRAMES; + control.value = bframes; + + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) + { + throw Exception("Failed to set bframes=%u.", bframes); + } +} + +void Codec::Port::setEncSliceSpacing(uint32_t spacing) +{ + log << "setEncSliceSpacing( " << spacing << " )" << endl; + + struct v4l2_control control; + + memset(&control, 0, sizeof(control)); + control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB; + control.value = spacing; + + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) + { + throw Exception("Failed to set slice spacing=%u.", spacing); + } + + memset(&control, 0, sizeof(control)); + control.id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE; + control.value = spacing != 0; + + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) + { + throw Exception("Failed to set slice mode."); + } +} + +void Codec::Port::setEncForceChroma(uint32_t fmt) +{ + log << "setEncForceChroma( " << fmt << " )" << endl; + + struct v4l2_control control; + + memset(&control, 0, sizeof(control)); + control.id = V4L2_CID_MVE_VIDEO_FORCE_CHROMA_FORMAT; + control.value = fmt; + + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) + { + throw Exception("Failed to set Force chroma fmt=%u.", fmt); + } +} + +void Codec::Port::setEncBitdepth(uint32_t bd) +{ + log << "setEncBitdepth( " << bd << " )" << endl; + + struct v4l2_control control; + + memset(&control, 0, sizeof(control)); + control.id = V4L2_CID_MVE_VIDEO_BITDEPTH_LUMA; + control.value = bd; + + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) + { + throw Exception("Failed to set encode video frame luma bd=%u.", bd); + } + + memset(&control, 0, sizeof(control)); + control.id = V4L2_CID_MVE_VIDEO_BITDEPTH_CHROMA; + control.value = bd; + + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) + { + throw Exception("Failed to set encode video frame chroma bd=%u.", bd); + } +} + +void Codec::Port::setH264EncIntraMBRefresh(uint32_t period) +{ + log << "setH264EncIntraMBRefresh( " << period << " )" << endl; + + struct v4l2_control control; + + memset(&control, 0, sizeof(control)); + control.id = V4L2_CID_MPEG_VIDEO_CYCLIC_INTRA_REFRESH_MB; + control.value = period; + + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) + { + throw Exception("Failed to set H264 period=%u.", period); + } +} + +void Codec::Port::setEncProfile(uint32_t profile) +{ + log << "setEncProfile( " << profile << " )" << endl; + + bool setProfile = false; + struct v4l2_control control; + + memset(&control, 0, sizeof(control)); + + if (io->getFormat() == to4cc("h264")) + { + setProfile = true; + control.id = V4L2_CID_MPEG_VIDEO_H264_PROFILE; + control.value = profile; + } + else if (io->getFormat() == to4cc("hevc")) + { + setProfile = true; + control.id = V4L2_CID_MVE_VIDEO_H265_PROFILE; + control.value = profile; + } + + if (setProfile) + { + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) + { + throw Exception("Failed to set profile=%u for fmt: %u .", profile, io->getFormat()); + } + } + else + { + log << "Profile cannot be set for this codec" << endl; + } +} + +void Codec::Port::setEncLevel(uint32_t level) +{ + log << "setEncLevel( " << level << " )" << endl; + + bool setLevel = false; + struct v4l2_control control; + + memset(&control, 0, sizeof(control)); + + if (io->getFormat() == to4cc("h264")) + { + setLevel = true; + control.id = V4L2_CID_MPEG_VIDEO_H264_LEVEL; + control.value = level; + } + else if (io->getFormat() == to4cc("hevc")) + { + setLevel = true; + control.id = V4L2_CID_MVE_VIDEO_H265_LEVEL; + control.value = level; + } + + if (setLevel) + { + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) + { + throw Exception("Failed to set level=%u for fmt: %u .", level, io->getFormat()); + } + } + else + { + log << "Level cannot be set for this codec" << endl; + } +} + +void Codec::Port::setEncConstrainedIntraPred(uint32_t cip) +{ + log << "setEncConstrainedIntraPred( " << cip << " )" << endl; + + struct v4l2_control control; + + memset(&control, 0, sizeof(control)); + control.id = V4L2_CID_MVE_VIDEO_CONSTR_IPRED; + control.value = cip; + + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) + { + throw Exception("Failed to set encoding cip=%u.", cip); + } +} + +void Codec::Port::setH264EncEntropyMode(uint32_t ecm) +{ + log << "setH264EncEntropyMode( " << ecm << " )" << endl; + + struct v4l2_control control; + + memset(&control, 0, sizeof(control)); + control.id = V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE; + control.value = ecm; + + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) + { + throw Exception("Failed to set H264 ecm=%u.", ecm); + } +} + +void Codec::Port::setH264EncGOPType(uint32_t gop) +{ + log << "setH264EncGOPType( " << gop << " )" << endl; + + struct v4l2_control control; + + memset(&control, 0, sizeof(control)); + control.id = V4L2_CID_MVE_VIDEO_GOP_TYPE; + control.value = gop; + + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) + { + throw Exception("Failed to set H264 gop=%u.", gop); + } +} + +void Codec::Port::setEncMinQP(uint32_t minqp) +{ + log << "setH264EncMinQP( " << minqp << " )" << endl; + + struct v4l2_control control; + memset(&control, 0, sizeof(control)); + control.id = V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE; + control.value = 1; + + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) + { + throw Exception("Failed to enable/disable rate control."); + } + + memset(&control, 0, sizeof(control)); + if (io->getFormat() == V4L2_PIX_FMT_H264) { + control.id = V4L2_CID_MPEG_VIDEO_H264_MIN_QP; + } else if (io->getFormat() == V4L2_PIX_FMT_HEVC) { + control.id = V4L2_CID_MPEG_VIDEO_HEVC_MIN_QP; + } else if (io->getFormat() == V4L2_PIX_FMT_VP9) { + control.id = V4L2_CID_MPEG_VIDEO_VPX_MIN_QP; + } else { + cerr<<"This format is not supported for min QP"<getFormat() == V4L2_PIX_FMT_H264) { + control.id = V4L2_CID_MPEG_VIDEO_H264_MAX_QP; + } else if (io->getFormat() == V4L2_PIX_FMT_HEVC) { + control.id = V4L2_CID_MPEG_VIDEO_HEVC_MAX_QP; + } else if (io->getFormat() == V4L2_PIX_FMT_VP9) { + control.id = V4L2_CID_MPEG_VIDEO_VPX_MAX_QP; + } else { + cerr<<"This format is not supported for max QP"<getFormat() == V4L2_PIX_FMT_H264) { + control.id = V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP; + } else if (io->getFormat() == V4L2_PIX_FMT_HEVC) { + control.id = V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_QP; + } else if (io->getFormat() == V4L2_PIX_FMT_VP9) { + control.id = V4L2_CID_MPEG_VIDEO_VPX_I_FRAME_QP; + } else { + cerr<<"This format is not supported for I frames fixed QP"<getFormat() == V4L2_PIX_FMT_H264) { + control.id = V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP; + } else if (io->getFormat() == V4L2_PIX_FMT_HEVC) { + control.id = V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_QP; + } else if (io->getFormat() == V4L2_PIX_FMT_VP9) { + control.id = V4L2_CID_MPEG_VIDEO_VPX_P_FRAME_QP; + } else { + cerr<<"This format is not supported for P frames fixed QP"<getFormat() == V4L2_PIX_FMT_H264) { + control.id = V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP; + } else if (io->getFormat() == V4L2_PIX_FMT_HEVC) { + control.id = V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QP; + } else if (io->getFormat() == V4L2_PIX_FMT_VP9) { + control.id = V4L2_CID_MVE_VIDEO_VPX_B_FRAME_QP; + } else { + cerr<<"This format is not supported for B frames fixed QP"<type<< ")" << endl; + + struct v4l2_mvx_huff_table huff_table; + memcpy(&huff_table, table, sizeof(struct v4l2_mvx_huff_table)); + int ret = ioctl(fd, VIDIOC_S_MVX_HUFF_TABLE, &huff_table); + if (ret != 0) + { + throw Exception("Failed to set JPEG huff table."); + } +} + +void Codec::Port::setSeamlessTarget(struct v4l2_mvx_seamless_target * seamless) +{ + log << "setSeamlessTarget seamless_mode( " << seamless->seamless_mode<< ")" << endl; + log << "setSeamlessTarget target_width( " << seamless->target_width<< ")" << endl; + log << "setSeamlessTarget target_height( " << seamless->target_height<< ")" << endl; + log << "setSeamlessTarget target_stride( " << seamless->target_stride[0]<< ")" << endl; + log << "setSeamlessTarget target_stride( " << seamless->target_stride[1]<< ")" << endl; + log << "setSeamlessTarget target_stride( " << seamless->target_stride[2]<< ")" << endl; + log << "setSeamlessTarget target_stride( " << seamless->target_size[0]<< ")" << endl; + log << "setSeamlessTarget target_stride( " << seamless->target_size[1]<< ")" << endl; + log << "setSeamlessTarget target_stride( " << seamless->target_size[2]<< ")" << endl; + + memcpy(&this->seamless, seamless, sizeof(struct v4l2_mvx_seamless_target)); + + int ret = ioctl(fd, VIDIOC_S_MVX_SEAMLESS_TARGET, &this->seamless); + if (ret != 0) + { + throw Exception("Failed to set Seamless Target."); + } +} +void Codec::Port::setJPEGEncQuality(uint32_t q) +{ + log << "setJPEGEncQuality( " << q << " )" << endl; + + struct v4l2_control control; + + memset(&control, 0, sizeof(control)); + control.id = V4L2_CID_JPEG_COMPRESSION_QUALITY; + control.value = q; + + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) + { + throw Exception("Failed to set JPEG compression quality=%u.", q); + } +} + +void Codec::Port::setJPEGEncQualityLuma(uint32_t q) +{ + log << "setJPEGEncQualityLuma( " << q << " )" << endl; + + struct v4l2_control control; + + memset(&control, 0, sizeof(control)); + control.id = V4L2_CID_MVE_VIDEO_JPEG_QUALITY_LUMA; + control.value = q; + + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) + { + throw Exception("Failed to set JPEG compression luma quality=%u.", q); + } +} + +void Codec::Port::setJPEGEncQualityChroma(uint32_t q) +{ + log << "setJPEGEncQualityChroma( " << q << " )" << endl; + + struct v4l2_control control; + + memset(&control, 0, sizeof(control)); + control.id = V4L2_CID_MVE_VIDEO_JPEG_QUALITY_CHROMA; + control.value = q; + + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) + { + throw Exception("Failed to set JPEG compression chroma quality=%u.", q); + } +} + +void Codec::Port::setAdStats(int ad_stats) +{ + this->ad_stats =ad_stats; +} + + +void Codec::Port::setRotation(int rotation) +{ + this->rotation = rotation; + io->setRotation(rotation); +} + +void Codec::Port::setMirror(int mirror) +{ + this->mirror = mirror; +} + +void Codec::Port::setDownScale(int scale) +{ + this->scale = scale; +} + +void Codec::Port::setDSLFrame(int width, int height) +{ + log<<"setDSLFrame( "<coef[0][0]<< ")" << endl; + log << "setCustColorConvCoef coef[0][1]( " << color_conv_coef->coef[0][1]<< ")" << endl; + log << "setCustColorConvCoef coef[0][2]( " << color_conv_coef->coef[0][2]<< ")" << endl; + log << "setCustColorConvCoef coef[1][0]( " << color_conv_coef->coef[1][0]<< ")" << endl; + log << "setCustColorConvCoef coef[1][1]( " << color_conv_coef->coef[1][1]<< ")" << endl; + log << "setCustColorConvCoef coef[1][2]( " << color_conv_coef->coef[1][2]<< ")" << endl; + log << "setCustColorConvCoef coef[2][0]( " << color_conv_coef->coef[2][0]<< ")" << endl; + log << "setCustColorConvCoef coef[2][1]( " << color_conv_coef->coef[2][1]<< ")" << endl; + log << "setCustColorConvCoef coef[2][2]( " << color_conv_coef->coef[2][2]<< ")" << endl; + log << "setCustColorConvCoef offset[0] ( " << color_conv_coef->offset[0]<< ")" << endl; + log << "setCustColorConvCoef offset[1] ( " << color_conv_coef->offset[1]<< ")" << endl; + log << "setCustColorConvCoef offset[2] ( " << color_conv_coef->offset[2]<< ")" << endl; + + int ret = ioctl(fd, VIDIOC_S_MVX_COLOR_CONV_COEF, color_conv_coef); + if (ret != 0) + { + throw Exception("Failed to set Cust Color Conv Coef."); + } +} + +void Codec::Port::setRGBConvertYUV(struct v4l2_mvx_rgb2yuv_color_conv_coef * color_conv_coef) +{ + int ret = ioctl(fd, VIDIOC_S_MVX_RGB2YUV_COLOR_CONV_COEF, color_conv_coef); + if (ret != 0) + { + throw Exception("Failed to set RGB To YUV Conv Coef."); + } +} + +void Codec::Port::setDecDstCrop(struct v4l2_mvx_crop_cfg * dst_crop) +{ + log << "setDecDstCrop crop_en( " << dst_crop->crop_en<< ")" << endl; + log << "setDecDstCrop x( " << dst_crop->x<< ")" << endl; + log << "setDecDstCrop y( " << dst_crop->y<< ")" << endl; + log << "setDecDstCrop width( " << dst_crop->width<< ")" << endl; + log << "setDecDstCrop height( " << dst_crop->height<< ")" << endl; + + int ret = ioctl(fd, VIDIOC_S_MVX_DEC_DST_CROP, dst_crop); + if (ret != 0) + { + throw Exception("Failed to setDecDstCrop."); + } +} + + +void Codec::Port::setVisibleWidth(uint32_t v_width) +{ + log<<"setVisibleWidth("< io->getWidth()) { + cerr<<"visible width should not greater than frame width!"< io->getHeight()) { + cerr<<"visible height should not greater than frame height!"<frames_count = frames; +} + +void Codec::Port::setCropLeft(int left){ + log << "setCropLeft( " << left << " )" << endl; + + struct v4l2_control control; + + memset(&control, 0, sizeof(control)); + control.id = V4L2_CID_MVE_VIDEO_CROP_LEFT; + control.value = left; + + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) + { + throw Exception("Failed to set crop left=%u.", left); + } +} + +void Codec::Port::setCropRight(int right){ + log << "setCropRight( " << right << " )" << endl; + + struct v4l2_control control; + + memset(&control, 0, sizeof(control)); + control.id = V4L2_CID_MVE_VIDEO_CROP_RIGHT; + control.value = right; + + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) + { + throw Exception("Failed to set crop right=%u.", right); + } +} + +void Codec::Port::setCropTop(int top){ + log << "setCropTop( " << top << " )" << endl; + + struct v4l2_control control; + + memset(&control, 0, sizeof(control)); + control.id = V4L2_CID_MVE_VIDEO_CROP_TOP; + control.value = top; + + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) + { + throw Exception("Failed to set crop top=%u.", top); + } +} + +void Codec::Port::setCropBottom(int bottom){ + log << "setCropBottom( " << bottom << " )" << endl; + + struct v4l2_control control; + + memset(&control, 0, sizeof(control)); + control.id = V4L2_CID_MVE_VIDEO_CROP_BOTTOM; + control.value = bottom; + + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) + { + throw Exception("Failed to set crop bottom=%u.", bottom); + } +} + +void Codec::Port::setStatsMode(int mode, int index){ + int stats_mode = mode; + + struct v4l2_buffer_param_enc_stats stats; + memset(&stats, 0, sizeof(struct v4l2_buffer_param_enc_stats)); + stats.pic_index_or_mb_size = index; + stats.mms_buffer_size = stats_mode & 0x1? mms_buffer_size : 0; + stats.bitcost_buffer_size = stats_mode & 0x2? bitcost_buffer_size : 0; + stats.qp_buffer_size = stats_mode & 0x4? qp_buffer_size : 0; + stats.flags |= stats_mode & 0x1? V4L2_BUFFER_ENC_STATS_FLAG_MMS : 0; + stats.flags |= stats_mode & 0x2? V4L2_BUFFER_ENC_STATS_FLAG_BITCOST : 0; + stats.flags |= stats_mode & 0x4? V4L2_BUFFER_ENC_STATS_FLAG_QP : 0; + + int ret = ioctl(fd, VIDIOC_S_MVX_STATS_MODE, &stats); + if (ret != 0) + { + throw Exception("Failed to set color description."); + } + + return; +} + +void Codec::Port::setOsdCfg(struct v4l2_osd_config osd){ + log << "setOsdCfg, for pic_index " << osd.pic_index << endl; + struct v4l2_osd_config osd_cfg = osd; + int ret = ioctl(fd, VIDIOC_S_MVX_OSD_CONFIG, &osd_cfg); + if (ret != 0) + { + throw Exception("Failed to set osd cfg."); + } +} + +void Codec::Port::setEncOSDinfo(struct v4l2_osd_info* info){ + log << "setOsdinfo, osd 1 size " << info->width_osd[0] <<"x"<< info->height_osd[0] << endl; + log << "setOsdinfo, osd 2 size " << info->width_osd[1] <<"x"<< info->height_osd[1] << endl; + int ret = ioctl(fd, VIDIOC_S_MVX_OSD_INFO, info); + if (ret != 0) + { + throw Exception("Failed to set osd info."); + } +} + +void Codec::Port::setVuiColourDesc(struct v4l2_mvx_color_desc *color){ + log << "setVuiColourDesc( " << color->content.luminance_average << ","; + log << color->content.luminance_max << ")" << endl; + + int ret = ioctl(fd, VIDIOC_S_MVX_COLORDESC, color); + if (ret != 0) + { + throw Exception("Failed to set color description."); + } + + return; +} + +void Codec::Port::setSeiUserData(struct v4l2_sei_user_data *sei_user_data){ + log << "setSeiUserData( " << sei_user_data->user_data<< ")" << endl; + + int ret = ioctl(fd, VIDIOC_S_MVX_SEI_USERDATA, sei_user_data); + if (ret != 0) + { + throw Exception("Failed to set color description."); + } + + return; + +} + +void Codec::Port::setHRDBufferSize(int size) { + log << "setHRDBufferSize( " << size << " )" << endl; + + struct v4l2_control control; + + memset(&control, 0, sizeof(control)); + control.id = V4L2_CID_MVE_VIDEO_HRD_BUFFER_SIZE; + control.value = size; + + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) + { + throw Exception("Failed to set crop bottom=%u.", size); + } +} + +void Codec::Port::setFrameStride(size_t* stride){ + __stride[0] = stride[0]; + __stride[1] = stride[1]; + __stride[2] = stride[2]; +} + +void Codec::Port::setRcBitIMode(uint32_t mode) +{ + log << "set mode for I frame of rate control( " << mode << " )" << endl; + + struct v4l2_control control; + + memset(&control, 0, sizeof(control)); + control.id = V4L2_CID_MVE_VIDEO_RC_I_MODE; + control.value = mode; + + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) + { + throw Exception("Failed to set rc bit i frame mode=%u.", mode); + } +} + +void Codec::Port::setChangePos(uint32_t pos) +{ + log << "set change pos for jpeg rc( " << pos << " )" << endl; + + struct v4l2_control control; + + memset(&control, 0, sizeof(control)); + control.id = V4L2_CID_MVE_VIDEO_CHANGE_POS; + control.value = pos; + + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) + { + throw Exception("Failed to set jpeg rc change pos=%u.", pos); + } +} + +void Codec::Port::setRcBitRationI(uint32_t ratio) +{ + log << "set ratio for I frame of rate control( " << ratio << " )" << endl; + + struct v4l2_control control; + + memset(&control, 0, sizeof(control)); + control.id = V4L2_CID_MVE_VIDEO_RC_I_RATIO; + control.value = ratio; + + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) + { + throw Exception("Failed to set rc i frame ratio=%u.", ratio); + } +} + +void Codec::Port::setMultiSPSPPS(uint32_t sps_pps) +{ + log << "Support multi SPS PSS for h264 and hevc ( " << sps_pps << " )" << endl; + + struct v4l2_control control; + + memset(&control, 0, sizeof(control)); + control.id = V4L2_CID_MVE_VIDEO_MULTI_SPS_PPS; + control.value = sps_pps; + + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) + { + throw Exception("Failed to support multi SPS PSS=%u.", sps_pps); + } +} + +void Codec::Port::setEnableVisual(uint32_t enable) +{ + log << "Enable Visual ( " << enable << " )" << endl; + + struct v4l2_control control; + + memset(&control, 0, sizeof(control)); + control.id = V4L2_CID_MVE_VIDEO_ENABLE_VISUAL; + control.value = enable; + + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) + { + throw Exception("Failed to enable visual =%u.", enable); + } +} + +void Codec::Port::setAdaptiveIntraBlock(uint32_t enable) +{ + log << "setAdaptiveIntraBlock (" << enable << " )" << endl; + + struct v4l2_control control; + + memset(&control, 0, sizeof(control)); + control.id = V4L2_CID_MVE_VIDEO_ENABLE_ADAPTIVE_INTRA_BLOCK; + control.value = enable; + + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) + { + throw Exception("Failed to adaptive intra block =%u.", enable); + } +} + +void Codec::Port::setEnableSCD(uint32_t scd_enable) +{ + log << "Enable SCD ( " << scd_enable << " )" << endl; + + struct v4l2_control control; + + memset(&control, 0, sizeof(control)); + control.id = V4L2_CID_MVE_VIDEO_SCD_ENABLE; + control.value = scd_enable; + + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) + { + throw Exception("Failed to enable SCD =%u.", scd_enable); + } +} + +void Codec::Port::setScdPercent(uint32_t scd_percent) +{ + log << "SCD Percent ( " << scd_percent << " )" << endl; + + struct v4l2_control control; + + memset(&control, 0, sizeof(control)); + control.id = V4L2_CID_MVE_VIDEO_SCD_PERCENT; + control.value = scd_percent; + + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) + { + throw Exception("Failed to set SCD percent =%u.", scd_percent); + } +} + +void Codec::Port::setScdThreshold(uint32_t scd_threshold) +{ + log << "SCD Threshold ( " << scd_threshold << " )" << endl; + + struct v4l2_control control; + + memset(&control, 0, sizeof(control)); + control.id = V4L2_CID_MVE_VIDEO_SCD_THRESHOLD; + control.value = scd_threshold; + + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) + { + throw Exception("Failed to set scd threshold =%u.", scd_threshold); + } +} + +void Codec::Port::setEnableAQSsim(uint32_t aq_ssim_en) +{ + log << "Enable AQ SSIM ( " << aq_ssim_en << " )" << endl; + + struct v4l2_control control; + + memset(&control, 0, sizeof(control)); + control.id = V4L2_CID_MVE_VIDEO_AQ_SSIM_EN; + control.value = aq_ssim_en; + + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) + { + throw Exception("Failed to enable AQ SSIM =%u.", aq_ssim_en); + } +} + +void Codec::Port::setAQNegRatio(uint32_t aq_neg_ratio) +{ + log << "AQ Negaive Ratio ( " << aq_neg_ratio << " )" << endl; + + struct v4l2_control control; + + memset(&control, 0, sizeof(control)); + control.id = V4L2_CID_MVE_VIDEO_AQ_NEG_RATIO; + control.value = aq_neg_ratio; + + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) + { + throw Exception("Failed to set AQ negaive ratio =%u.", aq_neg_ratio); + } +} + +void Codec::Port::setAQPosRatio(uint32_t aq_pos_ratio) +{ + log << "AQ Positive Ratio ( " << aq_pos_ratio << " )" << endl; + + struct v4l2_control control; + + memset(&control, 0, sizeof(control)); + control.id = V4L2_CID_MVE_VIDEO_AQ_POS_RATIO; + control.value = aq_pos_ratio; + + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) + { + throw Exception("Failed to set AQ positive ratio =%u.", aq_pos_ratio); + } +} + +void Codec::Port::setAQQPDeltaLmt(uint32_t aq_qpdelta_lmt) +{ + log << "AQ QPDelta LMT ( " << aq_qpdelta_lmt << " )" << endl; + + struct v4l2_control control; + + memset(&control, 0, sizeof(control)); + control.id = V4L2_CID_MVE_VIDEO_AQ_QPDELTA_LMT; + control.value = aq_qpdelta_lmt; + + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) + { + throw Exception("Failed to set AQ QPDelta LMT =%u.", aq_qpdelta_lmt); + } +} + +void Codec::Port::setAQInitFrmAvgSvar(uint32_t aq_init_frm_avg_svar) +{ + log << "Initial Frame Variance ( " << aq_init_frm_avg_svar << " )" << endl; + + struct v4l2_control control; + + memset(&control, 0, sizeof(control)); + control.id = V4L2_CID_MVE_VIDEO_AQ_INIT_FRM_AVG_SVAR; + control.value = aq_init_frm_avg_svar; + + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) + { + throw Exception("Failed to initial frame variance =%u.", aq_init_frm_avg_svar); + } +} + +void Codec::Port::setIntermediateBufSize(uint32_t size) +{ + log << "setIntermediateBufSize( " << size << " )" << endl; + + struct v4l2_control control; + + memset(&control, 0, sizeof(control)); + control.id = V4L2_CID_MVE_VIDEO_INTER_MED_BUF_SIZE; + control.value = size; + + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) + { + throw Exception("Failed to setIntermediateBufSize=%u.", size); + } +} + +void Codec::Port::setSvct3Level1Period(uint32_t period) +{ + log << "setSvct3Level1Period( " << period << " )" << endl; + + struct v4l2_control control; + + memset(&control, 0, sizeof(control)); + control.id = V4L2_CID_MVE_VIDEO_SVCT3_LEVEL1_PERIOD; + control.value = period; + + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) + { + throw Exception("Failed to setSvct3Level1Period=%u.", period); + } +} + +void Codec::Port::setGopResetPframes(int pframes) +{ + log << "setGopResetPframes( " << pframes << " )" << endl; + + struct v4l2_control control; + + memset(&control, 0, sizeof(control)); + control.id = V4L2_CID_MVE_VIDEO_GOP_RESET_PFRAMES; + control.value = pframes; + + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) + { + throw Exception("Failed to setGopResetPframes=%u.", pframes); + } + +} + +void Codec::Port::setLtrResetPeriod(int period) +{ + log << "setLtrResetPeriod( " << period << " )" << endl; + + struct v4l2_control control; + + memset(&control, 0, sizeof(control)); + control.id = V4L2_CID_MVE_VIDEO_LTR_RESET_PERIOD; + control.value = period; + + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) + { + throw Exception("Failed to setLtrResetPeriod=%u.", period); + } + +} + +void Codec::Port::setGDRnumber(uint32_t numbder) +{ + log << "setGDRnumber( " << numbder << " )" << endl; + + struct v4l2_control control; + + memset(&control, 0, sizeof(control)); + control.id = V4L2_CID_MVE_VIDEO_GDR_NUMBER; + control.value = numbder; + + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) + { + throw Exception("Failed to setGDRnumber=%u.", numbder); + } +} + +void Codec::Port::setGDRperiod(uint32_t period) +{ + log << "setGDRperiod( " << period << " )" << endl; + + struct v4l2_control control; + + memset(&control, 0, sizeof(control)); + control.id = V4L2_CID_MVE_VIDEO_GDR_PERIOD; + control.value = period; + + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) + { + throw Exception("Failed to setGDRperiod=%u.", period); + } +} + +void Codec::Port::setForcedUVvalue(uint32_t uv_value) +{ + log << "setForcedUVvalue( " << uv_value << " )" << endl; + + struct v4l2_control control; + + memset(&control, 0, sizeof(control)); + control.id = V4L2_CID_MVE_VIDEO_FORCED_UV_VALUE; + control.value = uv_value; + + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &control)) + { + throw Exception("Failed to setForcedUVvalue=%u.", uv_value); + } +} + +void Codec::Port::setEncSrcCrop(struct v4l2_mvx_crop_cfg * src_crop) +{ + log << "setEncSrcCrop crop_en( " << src_crop->crop_en<< ")" << endl; + log << "setEncSrcCrop x( " << src_crop->x<< ")" << endl; + log << "setEncSrcCrop y( " << src_crop->y<< ")" << endl; + log << "setEncSrcCrop width( " << src_crop->width<< ")" << endl; + log << "setEncSrcCrop height( " << src_crop->height<< ")" << endl; + + int ret = ioctl(fd, VIDIOC_S_MVX_ENC_SRC_CROP, src_crop); + if (ret != 0) + { + throw Exception("Failed to setEncSrcCrop."); + } +} + +void Codec::Port::setPortStatsSize(uint32_t mms, uint32_t bc, uint32_t qp) +{ + mms_buffer_size = mms; + bitcost_buffer_size = bc; + qp_buffer_size = qp; +} + +void Codec::runPoll() +{ + bool eos = false; + + while (!eos) + { + struct pollfd p = { + .fd = fd, .events = POLLPRI + }; + + if (input.pending > 0) + { + p.events |= POLLOUT; + } + + if (output.pending > 0) + { + p.events |= POLLIN; + } + + int ret = poll(&p, 1, 60000); + if (ret < 0) + { + throw Exception("Poll returned error code."); + } + + if (p.revents & POLLERR) + { + throw Exception("Poll returned error event."); + } + + if (ret == 0) + { + throw Exception("Poll timed out."); + } + + if (p.revents & POLLOUT) + { + input.handleBuffer(); + } + if (p.revents & POLLIN) + { + if (csweo) + { + log << "Changing settings while encoding." << endl; + if (fps != 0) + { + output.setEncFramerate(fps); + fps = 0; + } + if (bps != 0) + { + /* output.setEncBitrate(bps); */ + output.setEncBitrate(0); /* only for coverage */ + bps = 0; + } + /* Set maxQP before minQP, otherwise FW rejects */ + if (maxqp != 0) + { + output.setEncMaxQP(maxqp); + maxqp = 0; + } + if (minqp != 0) + { + output.setEncMinQP(minqp); + minqp = 0; + } + if (fixedqp != 0) + { + output.setEncFixedQP(fixedqp); + fixedqp = 0; + } + + csweo = false; + } + + eos = output.handleBuffer(); + } + if (p.revents & POLLPRI) + { + handleEvent(); + } + } +} + +void Codec::runThreads() +{ + int ret; + void *retval; + + ret = pthread_create(&input.tid, NULL, runThreadInput, this); + if (ret != 0) + { + throw Exception("Failed to create input thread."); + } + + ret = pthread_create(&output.tid, NULL, runThreadOutput, this); + if (ret != 0) + { + throw Exception("Failed to create output thread."); + } + + pthread_join(input.tid, &retval); + pthread_join(output.tid, &retval); +} + +void *Codec::runThreadInput(void *arg) +{ + Codec *_this = static_cast(arg); + bool eos = false; + + while (!eos) + eos = _this->input.handleBuffer(); + + return NULL; +} + +void *Codec::runThreadOutput(void *arg) +{ + Codec *_this = static_cast(arg); + bool eos = false; + + while (!eos) + eos = _this->output.handleBuffer(); + + return NULL; +} + +bool Codec::Port::handleBuffer() +{ + Buffer &buffer = dequeueBuffer(); + v4l2_buffer &b = buffer.getBuffer(); + if (io->getDir() == 0 && isInputThread) { + appendInputBufferIdx(&input_producer_mutex, &input_producer_cond, &input_producer_queue, b.index); + } + + buffer.setFrameProcessCount(frames_processed); + io->finalize(buffer); + if (io->eof()) + { + if (tryDecStop) + { + sendDecStopCommand(); + } + return true; + } + + /* EOS on capture port. */ + if (!V4L2_TYPE_IS_OUTPUT(b.type) && b.flags & V4L2_BUF_FLAG_LAST) + { + log << "Capture EOS." << endl; + return true; + } + + /* Resolution change. we should only handle this on decode output:V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE*/ + if (!V4L2_TYPE_IS_OUTPUT(b.type) && V4L2_TYPE_IS_MULTIPLANAR(b.type) && + (getBytesUsed(b) == 0 || + (b.flags & V4L2_BUF_FLAG_MVX_BUFFER_FRAME_PRESENT) != V4L2_BUF_FLAG_MVX_BUFFER_FRAME_PRESENT) && + (b.flags & V4L2_BUF_FLAG_ERROR) == 0) + { + v4l2_format fmt = format; + getFormat(); + bool isResChange = true; + if (V4L2_TYPE_IS_MULTIPLANAR(type)) + { + struct v4l2_pix_format_mplane &f = fmt.fmt.pix_mp; + isResChange = ((f.width != format.fmt.pix_mp.width) || + (f.height != format.fmt.pix_mp.height) )&& + (f.width * f.height) < (format.fmt.pix_mp.height * format.fmt.pix_mp.width); + } else { + struct v4l2_pix_format &f = fmt.fmt.pix; + isResChange = ((f.width != format.fmt.pix.width) || + (f.height != format.fmt.pix.height)) && + (f.width * f.height) < (format.fmt.pix.height * format.fmt.pix.width); + } + if ((b.flags & V4L2_BUF_FLAG_MVX_BUFFER_NEED_REALLOC) == V4L2_BUF_FLAG_MVX_BUFFER_NEED_REALLOC) { + log << "Resolution changed:" << isResChange <getDir() == 1 && V4L2_TYPE_IS_MULTIPLANAR(b.type) + && (b.flags & V4L2_BUF_FLAG_MVX_BUFFER_FRAME_PRESENT) == V4L2_BUF_FLAG_MVX_BUFFER_FRAME_PRESENT) { + frames_processed++; + } + buffer.resetVendorFlags(); + if (io->getDir() == 1 && frames_count > 0 && frames_processed >= frames_count) { + buffer.clearBytesUsed(); + buffer.setEndOfStream(true); + queueBuffer(buffer); + return true; + } else { + if (io->getDir() == 0 && isInputThread) { + uint32_t index = getInputBufferIdx(&input_consumer_mutex, &input_consumer_cond, &input_consumer_queue); + Buffer& buffer_input = *(buffers.at(index)); + buffer_input.setEndOfFrame(io->eof()); + queueBuffer(buffer_input); + if (io->eof()) + { + sendEncStopCommand(); + } + return false; + } + io->prepare(buffer); + buffer.setEndOfStream(io->eof()); + } + queueBuffer(buffer); + + if (io->eof()) + { + sendEncStopCommand(); + } + + return false; +} + +void Codec::Port::handleResolutionChange() +{ + streamoff(); + getFormat(); + allocateBuffers(0, memory_type_port); + allocateBuffers(getBufferCount(), memory_type_port); + queueBuffers(); + //frames_processed = 0; + streamon(); +} + +bool Codec::handleEvent() +{ + struct v4l2_event event; + int ret; + + ret = ioctl(fd, VIDIOC_DQEVENT, &event); + if (ret != 0) + { + throw Exception("Failed to dequeue event."); + } + + log << "Event. type=" << event.type << "." << endl; + + if (event.type == V4L2_EVENT_MVX_COLOR_DESC) + { + v4l2_mvx_color_desc color = getColorDesc(); + printColorDesc(color); + } + + if (event.type == V4L2_EVENT_EOS) + { + return true; + } + + return false; +} + +void Codec::getStride(uint32_t format, size_t &nplanes, size_t stride[3][2]) +{ + switch (format) + { + case V4L2_PIX_FMT_YUV420M: + nplanes = 3; + stride[0][0] = 2; + stride[0][1] = 2; + stride[1][0] = 1; + stride[1][1] = 1; + stride[2][0] = 1; + stride[2][1] = 1; + break; + case V4L2_PIX_FMT_NV12: + case V4L2_PIX_FMT_NV21: + nplanes = 2; + stride[0][0] = 2; + stride[0][1] = 2; + stride[1][0] = 2; + stride[1][1] = 1; + stride[2][0] = 0; + stride[2][1] = 0; + break; + case V4L2_PIX_FMT_P010: + case V4L2_PIX_FMT_YUV420_2P_10: + nplanes = 2; + stride[0][0] = 4; + stride[0][1] = 2; + stride[1][0] = 4; + stride[1][1] = 1; + stride[2][0] = 0; + stride[2][1] = 0; + break; + case V4L2_PIX_FMT_Y0L2: + case V4L2_PIX_FMT_AQB1: + nplanes = 1; + stride[0][0] = 8; + stride[0][1] = 1; + stride[1][0] = 0; + stride[1][1] = 0; + stride[2][0] = 0; + stride[2][1] = 0; + break; + case V4L2_PIX_FMT_YUYV: + case V4L2_PIX_FMT_UYVY: + nplanes = 1; + stride[0][0] = 4; + stride[0][1] = 2; + stride[1][0] = 0; + stride[1][1] = 0; + stride[2][0] = 0; + stride[2][1] = 0; + break; + case V4L2_PIX_FMT_Y210: + case V4L2_PIX_FMT_YUV422_1P_10: + case DRM_FORMAT_ARGB8888: + case DRM_FORMAT_ABGR8888: + case DRM_FORMAT_RGBA8888: + case DRM_FORMAT_BGRA8888: + nplanes = 1; + stride[0][0] = 8; + stride[0][1] = 2; + stride[1][0] = 0; + stride[1][1] = 0; + stride[2][0] = 0; + stride[2][1] = 0; + break; + case V4L2_PIX_FMT_RGB24: + case V4L2_PIX_FMT_BGR24: + nplanes = 1; + stride[0][0] = 6; + stride[0][1] = 2; + stride[1][0] = 0; + stride[1][1] = 0; + stride[2][0] = 0; + stride[2][1] = 0; + break; + case V4L2_PIX_FMT_RGB_3P: + case V4L2_PIX_FMT_YUV444M: + nplanes = 3; + stride[0][0] = 2; + stride[0][1] = 2; + stride[1][0] = 2; + stride[1][1] = 2; + stride[2][0] = 2; + stride[2][1] = 2; + break; + case V4L2_PIX_FMT_GREY: + nplanes = 1; + stride[0][0] = 2; + stride[0][1] = 2; + stride[1][0] = 0; + stride[1][1] = 0; + stride[2][0] = 0; + stride[2][1] = 0; + break; + case V4L2_PIX_FMT_Y10_LE: + nplanes = 1; + stride[0][0] = 4; + stride[0][1] = 2; + stride[1][0] = 0; + stride[1][1] = 0; + stride[2][0] = 0; + stride[2][1] = 0; + break; + case V4L2_PIX_FMT_YUV444_10: + nplanes = 3; + stride[0][0] = 4; + stride[0][1] = 2; + stride[1][0] = 4; + stride[1][1] = 2; + stride[2][0] = 4; + stride[2][1] = 2; + break; + case V4L2_PIX_FMT_YUV420_I420_10: + nplanes = 3; + stride[0][0] = 4; + stride[0][1] = 2; + stride[1][0] = 2; + stride[1][1] = 1; + stride[2][0] = 2; + stride[2][1] = 1; + break; + case V4L2_PIX_FMT_ARGB555: + case V4L2_PIX_FMT_ARGB444: + case V4L2_PIX_FMT_RGB565: + nplanes = 1; + stride[0][0] = 4; + stride[0][1] = 2; + stride[1][0] = 0; + stride[1][1] = 0; + stride[2][0] = 0; + stride[2][1] = 0; + break; + default: + throw Exception("Unsupported buffer format."); + } +} + +size_t Codec::getSize(uint32_t format, size_t width, size_t height, + size_t strideAlign, size_t &nplanes, size_t stride[3], size_t size[3], size_t heights[3]) +{ + size_t s[3][2]; + size_t frameSize = 0; + size_t tmp_witdh, tmp_height; + getStride(format, nplanes, s); + + for (int i = 0; i < 3; ++i) + { + tmp_witdh = i == 0? width : roundUp(width, 2); + tmp_height = i == 0? height : roundUp(height, 2); + stride[i] = max(stride[i], roundUp(divRoundUp(tmp_witdh * s[i][0], 2), strideAlign)); + heights[i] = divRoundUp(tmp_height * s[i][1], 2); + size[i] = stride[i] * heights[i];//divRoundUp(height * stride[i] * s[i][1], 4); + frameSize += size[i]; + } + + return frameSize; +} + +Decoder::Decoder(const char *dev, Input &input, Output &output, bool nonblock, ostream &log) : + Codec(dev, input, V4L2_BUF_TYPE_VIDEO_OUTPUT, output, + V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE, log, nonblock) +{} + +void Decoder::setH264IntBufSize(uint32_t ibs) +{ + output.setH264DecIntBufSize(ibs); +} + +void Decoder::setInterlaced(bool interlaced) +{ + output.setInterlaced(interlaced); +} + +void Decoder::setFrameReOrdering(uint32_t fro) +{ + output.setDecFrameReOrdering(fro); +} + +void Decoder::setIgnoreStreamHeaders(uint32_t ish) +{ + output.setDecIgnoreStreamHeaders(ish); +} + +void Decoder::tryStopCmd(bool tryStop) +{ + input.tryDecStopCmd(tryStop); +} + +void Decoder::setNaluFormat(int nalu) +{ + input.io->setNaluFormat(nalu); + naluFmt = nalu; +} + +void Decoder::setAdStats(int ad_stats) +{ + output.setAdStats(ad_stats); +} + +void Decoder::setRotation(int rotation) +{ + output.setRotation(rotation); +} + +void Decoder::setDownScale(int scale) +{ + output.setDownScale(scale); +} + +void Decoder::setFrameCount(int frames) { + output.setFrameCount(frames); +} + +void Decoder::setDSLFrame(int width, int height){ + output.setDSLFrame(width, height); +} + +void Decoder::setDSLRatio(int hor, int ver){ + output.setDSLRatio(hor, ver); +} + +void Decoder::setDSLMode(int mode){ + output.setDSLMode(mode); +} + +void Decoder::setDSLInterpMode(int mode){ + output.setDSLInterpMode(mode); +} + +void Decoder::setDisabledFeatures(int val){ + output.setDisabledFeatures(val); +} + +void Decoder::setColorConversion(uint32_t mode){ + output.setColorConversion(mode); +} + +void Decoder::setCustColorConvCoef(struct v4l2_mvx_color_conv_coef *coef){ + output.setCustColorConvCoef(coef); +} + +void Decoder::setDecDstCrop(struct v4l2_mvx_crop_cfg *dst_crop){ + output.setDecDstCrop(dst_crop); +} + +void Decoder::setStride(size_t *stride){ + output.setFrameStride(stride); +} + + +void Decoder::setSeamlessTarget(uint32_t format, struct v4l2_mvx_seamless_target *seamless) +{ + size_t nplanes; + size_t stride[3]; + size_t size[3]; + size_t heights[3]; + unsigned int framesize; + + memset(stride,0,sizeof(stride)); + memset(size,0,sizeof(size)); + memset(heights,0,sizeof(heights)); + framesize = Codec::getSize(format, (size_t)seamless->target_width, (size_t)seamless->target_height,(size_t)16, nplanes, stride, size, heights); + seamless->target_stride[0] = stride[0]; + seamless->target_stride[1] = stride[1]; + seamless->target_stride[2] = stride[2]; + + seamless->target_size[0] = size[0]; + seamless->target_size[1] = size[1]; + seamless->target_size[2] = size[2]; + + cout<<"setSeamlessTarget framesize= %u" <output.setEncFramerate(30 << 16); + //this->output.setEncBitrate(input.getWidth() * input.getHeight() * 30 / 2); +} + +void Encoder::changeSWEO(uint32_t csweo) +{ + this->csweo = (csweo == 1); +} + +void Encoder::setFramerate(uint32_t fps) +{ + if (!csweo) + { + output.setEncFramerate(fps); + } + else + { + this->fps = fps; + } +} + +void Encoder::setBitrate(uint32_t bps) +{ + if (!csweo) + { + output.setEncBitrate(bps); + } + else + { + output.setEncBitrate(bps); + this->bps = bps - 500; + } +} + +void Encoder::setPFrames(uint32_t pframes) +{ + output.setEncPFrames(pframes); +} + +void Encoder::setBFrames(uint32_t bframes) +{ + output.setEncBFrames(bframes); +} + +void Encoder::setSliceSpacing(uint32_t spacing) +{ + output.setEncSliceSpacing(spacing); +} + +void Encoder::setHorizontalMVSearchRange(uint32_t hmvsr) +{ + output.setEncHorizontalMVSearchRange(hmvsr); +} + +void Encoder::setVerticalMVSearchRange(uint32_t vmvsr) +{ + output.setEncVerticalMVSearchRange(vmvsr); +} + +void Encoder::setEncForceChroma(uint32_t fmt) +{ + input.setEncForceChroma(fmt); +} + +void Encoder::setEncBitdepth(uint32_t bd) +{ + input.setEncBitdepth(bd); +} + +void Encoder::setH264IntraMBRefresh(uint32_t period) +{ + output.setH264EncIntraMBRefresh(period); +} + +void Encoder::setProfile(uint32_t profile) +{ + output.setEncProfile(profile); +} + +void Encoder::setLevel(uint32_t level) +{ + output.setEncLevel(level); +} + +void Encoder::setConstrainedIntraPred(uint32_t cip) +{ + output.setEncConstrainedIntraPred(cip); +} + +void Encoder::setH264EntropyCodingMode(uint32_t ecm) +{ + output.setH264EncEntropyMode(ecm); +} + +void Encoder::setH264GOPType(uint32_t gop) +{ + output.setH264EncGOPType(gop); +} + +void Encoder::setEncMinQP(uint32_t minqp) +{ + if (!csweo) + { + output.setEncMinQP(minqp); + } + else + { + this->minqp = minqp; + } +} + +void Encoder::setEncMaxQP(uint32_t maxqp) +{ + if (!csweo) + { + output.setEncMaxQP(maxqp); + } + else + { + this->maxqp = maxqp; + } +} + +void Encoder::setEncFixedQP(uint32_t fqp) +{ + if (!csweo) + { + output.setEncFixedQP(fqp); + } + else + { + output.setEncFixedQP(fqp); + this->fixedqp = fqp + 2; + } +} + +void Encoder::setEncFixedQPI(uint32_t fqp) +{ + output.setEncFixedQPI(fqp); +} + +void Encoder::setEncFixedQPP(uint32_t fqp) +{ + output.setEncFixedQPP(fqp); +} + +void Encoder::setEncFixedQPB(uint32_t fqp) +{ + output.setEncFixedQPB(fqp); +} + +void Encoder::setEncMinQPI(uint32_t nQpMinI) +{ + output.setEncMinQPI(nQpMinI); +} + +void Encoder::setEncMaxQPI(uint32_t nQpMaxI) +{ + output.setEncMaxQPI(nQpMaxI); +} + +void Encoder::setEncInitQPI(uint32_t init_qpi) +{ + output.setEncInitQPI(init_qpi); +} + +void Encoder::setEncInitQPP(uint32_t init_qpp) +{ + output.setEncInitQPP(init_qpp); +} + +void Encoder::setEncSAOluma(uint32_t sao_luma_dis) +{ + output.setEncSAOluma(sao_luma_dis); +} + +void Encoder::setEncSAOchroma(uint32_t sao_chroma_dis) +{ + output.setEncSAOchroma(sao_chroma_dis); +} + +void Encoder::setEncQPDeltaIP(uint32_t qp_delta_i_p) +{ + output.setEncQPDeltaIP(qp_delta_i_p); +} + +void Encoder::setEncRefRbEn(uint32_t ref_rb_en) +{ + output.setEncRefRbEn(ref_rb_en); +} + +void Encoder::setEncRCClipTop(uint32_t rc_qp_clip_top) +{ + output.setEncRCClipTop(rc_qp_clip_top); +} + +void Encoder::setEncRCClipBot(uint32_t rc_qp_clip_bottom) +{ + output.setEncRCClipBot(rc_qp_clip_bottom); +} + +void Encoder::setEncQpmapClipTop(uint32_t qpmap_clip_top) +{ + output.setEncQpmapClipTop(qpmap_clip_top); +} + +void Encoder::setEncQpmapClipBot(uint32_t qpmap_clip_bottom) +{ + output.setEncQpmapClipBot(qpmap_clip_bottom); +} + +void Encoder::setH264Bandwidth(uint32_t bw) +{ + output.setH264EncBandwidth(bw); +} + +void Encoder::setEncProfiling(uint32_t enable) +{ + output.setPortProfiling(enable); +} + +void Encoder::setVP9TileCR(uint32_t tcr) +{ + output.setVP9EncTileCR(tcr); +} + +void Encoder::setJPEGRefreshInterval(uint32_t r) +{ + output.setJPEGEncRefreshInterval(r); +} + +void Encoder::setJPEGQuality(uint32_t q) +{ + output.setJPEGEncQuality(q); +} + +void Encoder::setJPEGQualityLuma(uint32_t q) +{ + output.setJPEGEncQualityLuma(q); +} + +void Encoder::setJPEGQualityChroma(uint32_t q) +{ + output.setJPEGEncQualityChroma(q); +} + +void Encoder::setJPEGHufftable(struct v4l2_mvx_huff_table *table) +{ + output.setJPEGHufftable(table); +} + +void Encoder::setHEVCEntropySync(uint32_t es) +{ + output.setHEVCEncEntropySync(es); +} + +void Encoder::setHEVCTemporalMVP(uint32_t tmvp) +{ + output.setHEVCEncTemporalMVP(tmvp); +} + +void Encoder::setStreamEscaping(uint32_t sesc) +{ + output.setEncStreamEscaping(sesc); +} + +void Encoder::tryStopCmd(bool tryStop) +{ + input.tryEncStopCmd(tryStop); +} + +void Encoder::setMirror(int mirror) +{ + input.setMirror(mirror); +} + +void Encoder::setRotation(int rotation) +{ + input.setRotation(rotation); +} + +void Encoder::setFrameCount(int frames) { + input.setFrameCount(frames); +} + +void Encoder::setMiniHeight(uint32_t mini_height) +{ + mini_frame_height = mini_height; + input.setMiniHeight(mini_height); +} + +void Encoder::setStride(size_t *stride){ + input.setFrameStride(stride); +} + +void Encoder::setRateControl(const std::string &rc, int target_bitrate, int maximum_bitrate){ + + struct v4l2_rate_control v4l2_rc; + memset(&v4l2_rc, 0, sizeof(v4l2_rc)); + if (rc.compare("standard") == 0) { + v4l2_rc.rc_type = V4L2_OPT_RATE_CONTROL_MODE_STANDARD; + } else if (rc.compare("constant") == 0) { + v4l2_rc.rc_type = V4L2_OPT_RATE_CONTROL_MODE_CONSTANT; + } else if (rc.compare("variable") == 0) { + v4l2_rc.rc_type = V4L2_OPT_RATE_CONTROL_MODE_VARIABLE; + } else if (rc.compare("cvbr") == 0) { + v4l2_rc.rc_type = V4L2_OPT_RATE_CONTROL_MODE_C_VARIABLE; + } else if (rc.compare("off") == 0){ + v4l2_rc.rc_type = V4L2_OPT_RATE_CONTROL_MODE_OFF; + } else { + v4l2_rc.rc_type = V4L2_OPT_RATE_CONTROL_MODE_OFF; + } + if (v4l2_rc.rc_type) { + v4l2_rc.target_bitrate = target_bitrate; + } + if (v4l2_rc.rc_type == V4L2_OPT_RATE_CONTROL_MODE_C_VARIABLE) { + v4l2_rc.maximum_bitrate = maximum_bitrate; + } + output.setRateControl(&v4l2_rc); +} + +void Encoder::setCropLeft(int left){ + input.setCropLeft(left); +} + +void Encoder::setCropRight(int right){ + input.setCropRight(right); +} + +void Encoder::setCropTop(int top){ + input.setCropTop(top); +} + +void Encoder::setCropBottom(int bottom){ + input.setCropBottom(bottom); +} + +void Encoder::setStatsMode(int mode){ + input.setStatsMode(mode); +} + +void Encoder::setVuiColourDesc(struct v4l2_mvx_color_desc *color){ + input.setVuiColourDesc(color); +} + +void Encoder::setSeiUserData(struct v4l2_sei_user_data *sei_user_data){ + input.setSeiUserData(sei_user_data); +} + +void Encoder::setHRDBufferSize(int size) { + input.setHRDBufferSize(size); +} + +void Encoder::setLongTermRef(uint32_t mode, uint32_t period){ + input.setLongTermRef(mode, period); +} + +void Encoder::setVisibleWidth(uint32_t v_width) +{ + input.setVisibleWidth(v_width); +} + +void Encoder::setVisibleHeight(uint32_t v_height) +{ + input.setVisibleHeight(v_height); +} + +void Encoder::setRcBitIMode(uint32_t mode) +{ + output.setRcBitIMode(mode); +} + +void Encoder::setChangePos(uint32_t pos) +{ + output.setChangePos(pos); +} + +void Encoder::setRcBitRationI(uint32_t ratio) +{ + output.setRcBitRationI(ratio); +} + +void Encoder::setMultiSPSPPS(uint32_t sps_pps){ + output.setMultiSPSPPS(sps_pps); +} + +void Encoder::setEnableSCD(uint32_t scd_enable){ + output.setEnableSCD(scd_enable); +} + +void Encoder::setScdPercent(uint32_t scd_percent){ + output.setScdPercent(scd_percent); +} + +void Encoder::setScdThreshold(uint32_t scd_threshold){ + output.setScdThreshold(scd_threshold); +} + +void Encoder::setEnableAQSsim(uint32_t aq_ssim_en){ + output.setEnableAQSsim(aq_ssim_en); +} + +void Encoder::setAQNegRatio(uint32_t aq_neg_ratio){ + output.setAQNegRatio(aq_neg_ratio); +} + +void Encoder::setAQPosRatio(uint32_t aq_pos_ratio){ + output.setAQPosRatio(aq_pos_ratio); +} + +void Encoder::setAQQPDeltaLmt(uint32_t aq_qpdelta_lmt){ + output.setAQQPDeltaLmt(aq_qpdelta_lmt); +} + +void Encoder::setAQInitFrmAvgSvar(uint32_t aq_init_frm_avg_svar){ + output.setAQInitFrmAvgSvar(aq_init_frm_avg_svar); +} + +void Encoder::setEnableVisual(uint32_t enable){ + output.setEnableVisual(enable); +} + +void Encoder::setAdaptiveIntraBlock(uint32_t enable){ + output.setAdaptiveIntraBlock(enable); +} + +void Encoder::setSvct3Level1Period(uint32_t period) +{ + input.setSvct3Level1Period(period); +} + +void Encoder::setIntermediateBufSize(uint32_t size) +{ + input.setIntermediateBufSize(size); +} + +void Encoder::setStatsSize(uint32_t mms, uint32_t bc, uint32_t qp) +{ + input.setPortStatsSize(mms,bc,qp); +} + +void Encoder::setGDRnumber(uint32_t numbder) +{ + input.setGDRnumber(numbder); +} + +void Encoder::setGDRperiod(uint32_t period) +{ + input.setGDRperiod(period); +} + +void Encoder::setForcedUVvalue(uint32_t uv_value) +{ + input.setForcedUVvalue(uv_value); +} + +void Encoder::setEncSrcCrop(struct v4l2_mvx_crop_cfg * src_crop) +{ + input.setEncSrcCrop(src_crop); +} + +void Encoder::setRGBToYUVMode(uint32_t mode){ + input.setRGBToYUVMode(mode); +} + +void Encoder::setRGBConvertYUV(struct v4l2_mvx_rgb2yuv_color_conv_coef *coef){ + input.setRGBConvertYUV(coef); +} + +void Encoder::setFrameBufCnt(uint32_t count) +{ + input.setBufferCnt(count); +} + +void Encoder::setBitBufCnt(uint32_t count) +{ + output.setBufferCnt(count); +} + +void Encoder::setEncOSDinfo(struct v4l2_osd_info* info) +{ + input.setEncOSDinfo(info); +} + +Info::Info(const char *dev, ostream &log) : + Codec(dev, + V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE, + V4L2_BUF_TYPE_VIDEO_CAPTURE, + log, + true) +{} + +void Info::enumerateFormats() +{ + try + { + Codec::enumerateFormats(); + } + catch (Exception &e) + { + cerr << "Error: " << e.what() << endl; + } +} diff --git a/src/little/buildroot-ext/package/mvx_player/src/mvx_player.hpp b/src/little/buildroot-ext/package/mvx_player/src/mvx_player.hpp new file mode 100755 index 000000000..54568e3a5 --- /dev/null +++ b/src/little/buildroot-ext/package/mvx_player/src/mvx_player.hpp @@ -0,0 +1,1262 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef __MVX_PLAYER_H__ +#define __MVX_PLAYER_H__ + +/**************************************************************************** + * Includes + ****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include "mvx-v4l2-controls.h" + +#include "reader/read_util.h" +#include "reader/parser.h" +#include "reader/start_code_reader.h" + +struct epr_config +{ + unsigned int pic_index; + + struct v4l2_buffer_general_block_configs block_configs; + struct v4l2_buffer_param_qp qp; + bool block_configs_present; + bool qp_present; + + size_t bc_row_body_size; + union + { + char* _bc_row_body_data; + struct v4l2_buffer_general_rows_uncomp_body* uncomp; + } bc_row_body; + + epr_config(const size_t size = 0) + { + pic_index = 0; + qp.qp = 0; + clear(); + allocate_bprf(size); + }; + epr_config(const epr_config& other) + : pic_index (other.pic_index), + block_configs (other.block_configs), + qp (other.qp), + block_configs_present (other.block_configs_present), + qp_present (other.qp_present) + { + allocate_bprf(other.bc_row_body_size); + + if (other.bc_row_body_size > 0) + { + std::copy(other.bc_row_body._bc_row_body_data, + other.bc_row_body._bc_row_body_data + other.bc_row_body_size, + bc_row_body._bc_row_body_data); + } + }; + ~epr_config() + { + if (bc_row_body_size > 0) + { + delete [] bc_row_body._bc_row_body_data; + } + }; + epr_config& operator= (epr_config other) + { + swap(*this, other); + return *this; + }; + friend void swap(epr_config& a, epr_config& b) + { + using std::swap; + + swap(a.pic_index, b.pic_index); + swap(a.block_configs, b.block_configs); + swap(a.qp, b.qp); + swap(a.block_configs_present, b.block_configs_present); + swap(a.qp_present, b.qp_present); + + swap(a.bc_row_body_size, b.bc_row_body_size); + swap(a.bc_row_body._bc_row_body_data, b.bc_row_body._bc_row_body_data); + }; + void clear(void) + { + block_configs_present = false; + qp_present = false; + } + +private: + void allocate_bprf(size_t size) + { + bc_row_body_size = size; + if (size > 0) + { + bc_row_body._bc_row_body_data = new char[size]; + } + else + { + bc_row_body._bc_row_body_data = NULL; + } + }; +}; + +struct v4l2_gop_config +{ + uint32_t gop_pic; + uint32_t gop_pframes; +}; + +struct v4l2_reset_ltr_peroid_config +{ + unsigned int reset_trigger_pic; + unsigned int reset_ltr_peroid; +}; + +struct v4l2_enc_stats_cfg +{ + unsigned int reset_pic; + unsigned int reset_cfg; +}; + +typedef std::list v4l2_epr_list_t; +typedef std::list v4l2_roi_list_t; +typedef std::list v4l2_chr_list_t; +typedef std::queue gop_list_t; +typedef std::queue ltr_list_t; +typedef std::queue enc_stats_list_t; +typedef std::list v4l2_osd_list_t; + +/**************************************************************************** + * Exception + ****************************************************************************/ +class Exception : + public std::exception +{ +public: + Exception(const char *fmt, ...); + Exception(const std::string &str); + virtual ~Exception() throw(); + + virtual const char *what() const throw(); + +private: + char msg[100]; +}; + +/**************************************************************************** + * Buffer + ****************************************************************************/ + +class Buffer +{ +public: + Buffer(const v4l2_format &format); + Buffer(v4l2_buffer &buf, int fd, const v4l2_format &format, enum v4l2_memory memory_type); + virtual ~Buffer(); + + v4l2_buffer &getBuffer(); + const v4l2_format &getFormat() const; + void setCrop(const v4l2_crop &crop); + const v4l2_crop &getCrop() const; + void setSeamless(const struct v4l2_mvx_seamless_target &seamless); + const v4l2_mvx_seamless_target &getSeamless()const; + void setFrameProcessCount(int count); + const int getFrameProcessCount()const; + std::vector getImageSize() const; + std::vector getBytesUsed() const; + void getPackedBuffer(char* img, size_t nplanes, size_t dst_heights[], size_t dst_stride[], size_t src_stride[]); + void setBytesUsed(std::vector &iov); + void clearBytesUsed(); + void resetVendorFlags(); + void setCodecConfig(bool codecConfig); + void setTimeStamp(unsigned int timeUs); + void setEndOfFrame(bool eof); + void setEndOfStream(bool eos); + void update(v4l2_buffer &buf); + void setInterlaced(bool interlaced); + void setTiled(bool tiled); + void setRotation(int rotation); + void setEncRotation(int rotation); + void setMirror(int mirror); + void setDownScale(int scale); + void setEndOfSubFrame(bool eos); + std::vector convert10Bit(); + std::vector _convert10Bit(unsigned short* ptr_y, unsigned short* ptr_uv, size_t size_y, size_t size_uv); + void setRoiCfg(struct v4l2_mvx_roi_regions roi); + void setChrCfg(struct v4l2_mvx_chr_config chr); + void setGopResetCfg(struct v4l2_gop_config cfg); + void setLtrResetCfg(struct v4l2_reset_ltr_peroid_config cfg); + bool getRoiCfgflag() {return isRoiCfg;} + bool getChrCfgflag() {return isChrCfg;} + bool getGopResetCfgflag() {return isGopCfg;} + bool getLtrResetCfgflag() {return isLtrCfg;} + void setResetStatsMode(uint32_t pic_index, uint32_t cfg_mode){stats_pic_index = pic_index;stats_cfg_mode = cfg_mode;} + uint32_t &getResetStatsMode(){return stats_cfg_mode;} + uint32_t &getResetStatsPicIndex(){return stats_pic_index;} + struct v4l2_mvx_roi_regions getRoiCfg() {return roi_cfg;}; + struct v4l2_mvx_chr_config getChrCfg() {return chr_cfg;} + struct v4l2_gop_config getGopResetCfg() {return gop_cfg;} + struct v4l2_reset_ltr_peroid_config getLtrResetCfg() {return ltr_cfg;} + void setSuperblock(bool superblock); + void setROIflag(bool roi_valid); + void setChrflag(bool chr_valid); + void setGopResetflag(bool valid); + void setLtrResetflag(bool valid); + void setOsdCfgEnable(bool enable); + bool getOsdCfgEnable(){return isOsdCfg;} + void setOsdCfg(struct v4l2_osd_config osd); + struct v4l2_osd_config getOsdCfg(){return osd_cfg;} + void setOsdBufferflag(uint32_t index); + void setAdStatsGeneralBuffer(int ad_stats); + void setEPRflag(); + void set_force_idr_flag(bool idr); + void setQPofEPR(struct v4l2_buffer_param_qp data) {epr_qp = data;}; + struct v4l2_buffer_param_qp getQPofEPR(){return epr_qp;} + bool isGeneralBuffer(){return (buf.flags & V4L2_BUF_FLAG_MVX_BUFFER_EPR) == V4L2_BUF_FLAG_MVX_BUFFER_EPR;}; + bool isOsdBuffer(){return buf.reserved2 & V4L2_BUF_FLAG_MVX_OSD_MASK;} + void memoryMap(int fd); + void memoryUnmap(); + size_t getLength(unsigned int plane); + void dmaMemoryMap(int dma_fd, const unsigned int plane); + void dmaMemoryunMap(void *p, const unsigned int plane); + void setLength(const unsigned int length, const unsigned int plane); + void setDmaFd(int fd, const unsigned int plane, const unsigned offset = 0); + unsigned int getNumPlanes() const; + void *getPlaneptr(unsigned i) {return ptr[i];} +private: + + void *ptr[VIDEO_MAX_PLANES]; + v4l2_buffer buf; + v4l2_plane planes[VIDEO_MAX_PLANES]; + const v4l2_format &format; + v4l2_crop crop; + struct v4l2_mvx_seamless_target seamless; + int frames_processed; + bool isRoiCfg; + bool isChrCfg; + bool isGopCfg; + bool isLtrCfg; + bool isOsdCfg; + struct v4l2_mvx_roi_regions roi_cfg; + struct v4l2_mvx_chr_config chr_cfg; + struct v4l2_gop_config gop_cfg; + struct v4l2_reset_ltr_peroid_config ltr_cfg; + struct v4l2_buffer_param_enc_stats enc_stats_res; + struct v4l2_buffer_param_qp epr_qp; + struct v4l2_osd_config osd_cfg; + enum v4l2_memory memory_type; + uint32_t stats_pic_index; + uint32_t stats_cfg_mode; +}; + +/**************************************************************************** + * Input and output + ****************************************************************************/ + +#pragma pack(push, 1) +class IVFHeader +{ +public: + IVFHeader(); + IVFHeader(uint32_t codec, uint16_t width, uint16_t height); + + uint32_t signature; + uint16_t version; + uint16_t length; + uint32_t codec; + uint16_t width; + uint16_t height; + uint32_t frameRate; + uint32_t timeScale; + uint32_t frameCount; + uint32_t padding; + + static const uint32_t signatureDKIF; +}; + +class IVFFrame +{ +public: + IVFFrame(); + IVFFrame(uint32_t size, uint64_t timestamp); + + uint32_t size; + uint64_t timestamp; +}; + +/* STRUCT_C (for details see specification SMPTE-421M) */ +struct HeaderC +{ + uint32_t reserved : 28; + uint32_t profile : 4; +}; + +/* Sequence Layer Data (for details see specification SMPTE-421M) */ +class VC1SequenceLayerData +{ +public: + VC1SequenceLayerData(); + + uint32_t numFrames : 24; + uint8_t signature1; + uint32_t signature2; + uint32_t headerC; + uint32_t restOfSLD[6]; + + static const uint8_t magic1; + static const uint32_t magic2; +}; + +/* Frame Layer Data (for details see specification SMPTE-421M) */ +class VC1FrameLayerData +{ +public: + VC1FrameLayerData(); + + uint32_t frameSize : 24; + uint32_t reserved : 7; + uint32_t key : 1; + uint32_t timestamp; + uint8_t data[]; +}; + +class RVHeader +{ +public: + RVHeader(); + uint32_t metlen; + uint32_t signature1; + uint32_t signature2; + + static const uint32_t signatureVIDO; + static const uint32_t signatureRV40; + static const uint32_t signatureRV30; +}; + + +class RVFrame +{ +public: + RVFrame(); + + uint32_t size; + uint32_t timestamp; + uint16_t sequencenum; + uint16_t flags; + uint32_t lastpacket; + uint32_t slicesnum; + + static const uint32_t slicestartcode; +}; + +class RVSlice +{ +public: + RVSlice(); + uint32_t startcode; + uint32_t offset; +}; + +class AFBCHeader +{ +public: + AFBCHeader(); + AFBCHeader(const v4l2_format &format, size_t frameSize, const v4l2_crop &crop, bool tiled, const int field = FIELD_NONE); + + uint32_t magic; + uint16_t headerSize; + uint16_t version; + uint32_t frameSize; + uint8_t numComponents; + uint8_t subsampling; + uint8_t yuvTransform; + uint8_t blockSplit; + uint8_t yBits; + uint8_t cbBits; + uint8_t crBits; + uint8_t alphaBits; + uint16_t mbWidth; + uint16_t mbHeight; + uint16_t width; + uint16_t height; + uint8_t cropLeft; + uint8_t cropTop; + uint8_t param; + uint8_t fileMessage; + + static const uint32_t MAGIC = 0x43424641; + static const uint16_t VERSION = 5;//5; + static const uint8_t PARAM_TILED_BODY = 0x00000001; + static const uint8_t PARAM_TILED_HEADER = 0x00000002; + static const uint8_t PARAM_32X8_SUPERBLOCK = 0x00000004; + static const int FIELD_NONE = 0; + static const int FIELD_TOP = 1; + static const int FIELD_BOTTOM = 2; +}; +#pragma pack(pop) + +class IO +{ +public: + IO(uint32_t format, size_t width = 0, size_t height = 0, size_t strideAlign = 0); + virtual ~IO() {} + + virtual void prepare(Buffer &buf) {} + virtual void finalize(Buffer &buf) {} + virtual bool eof() { return false; } + virtual void setNaluFormat(int nalu){} + virtual int getNaluFormat(){return 0;} + virtual bool needDoubleCount(){return false;}; + + uint32_t getFormat() const { return format; } + uint8_t getProfile() const { return profile; } + size_t getWidth() const { return width; } + size_t getHeight() const { return height; } + size_t getStrideAlign() const { return strideAlign; } + int getDir(){return dir;} + void setReadHeight(size_t h) {readHeight = h;} + size_t getReadHeight() const { return readHeight;} + void setRotation(int rot) {rotation = rot;} + int getRotation() {return rotation;} + + +protected: + uint32_t format; + uint8_t profile; + size_t width; + size_t height; + size_t strideAlign; + size_t readHeight; + int dir;//0 for input; 1 for output + int rotation; +}; + +class Input : + public IO +{ +public: + Input(uint32_t format, size_t width = 0, size_t height = 0, size_t strideAlign = 0); + + virtual void prepare(Buffer &buf) {} + virtual void finalize(Buffer &buf) {} + virtual void setNaluFormat(int nalu){} + virtual int getNaluFormat(){return 0;} + std::queue idr_list; +}; + +class InputFile : + public Input +{ +public: + InputFile(std::istream &input, uint32_t format); + virtual ~InputFile(); + + virtual void prepare(Buffer &buf); + virtual bool eof(); + virtual void setNaluFormat(int nalu){naluFmt = nalu;} + virtual int getNaluFormat(){return naluFmt;} +protected: + InputFile(std::istream &input, uint32_t format, size_t width, size_t height, size_t strideAlign); + std::istream &input; + char* inputBuf; + uint32_t offset; + int state; + int curlen; + bool iseof; + int naluFmt; + uint32_t remaining_bytes; + start_code_reader* reader; + bool send_end_of_frame_flag; + bool send_end_of_subframe_flag; +}; + +class InputIVF : + public InputFile +{ +public: + InputIVF(std::istream &input, uint32_t informat); + + virtual void prepare(Buffer &buf); + virtual bool eof(); +protected: + uint32_t left_bytes; + uint64_t timestamp; +}; + +class InputRCV : + public InputFile +{ +public: + InputRCV(std::istream &input); + + virtual void prepare(Buffer &buf); + virtual bool eof(); +private: + bool codecConfigSent; + VC1SequenceLayerData sld; + uint32_t left_bytes; + bool isRcv; +}; + +class InputRV : + public InputFile +{ +public: + InputRV(std::istream &input); + + virtual void prepare(Buffer &buf); + virtual bool eof(); + void prepare_config_data(Buffer &buf); + void prepare_slice_data(Buffer &buf); + + +protected: + RVHeader header; + RVFrame frameheader; + uint32_t frame_left_bytes; + uint32_t slice_read_indx; + std::vector slice; + bool b_header_read; +}; + +class InputAFBC : + public InputFile +{ +public: + InputAFBC(std::istream &input, uint32_t format, size_t width, size_t height); + + virtual void prepare(Buffer &buf); + virtual bool eof(); +}; + +class InputFileFrame : + public InputFile +{ +public: + InputFileFrame(std::istream &input, uint32_t format, size_t width, size_t height, size_t strideAlign, size_t stride[] = {0}); + + virtual void prepare(Buffer &buf); + unsigned int get_prepared_frames(){return prepared_frames;} + virtual bool eof(); + v4l2_chr_list_t *chr_list; + gop_list_t *gop_list; + ltr_list_t *ltr_list; + enc_stats_list_t *enc_stats_list; +protected: + size_t nplanes; + size_t stride[3]; + size_t size[3]; + size_t heights[3]; + size_t framesize; + v4l2_chr_list_t::iterator chr_cur; + unsigned int prepared_frames; +}; + +class InputFileMiniFrame : + public InputFileFrame + +{ +public: + InputFileMiniFrame(std::istream &input, uint32_t format, size_t width, size_t height, size_t strideAlign, uint32_t mini_height, size_t stride[]); + virtual void prepare(Buffer &buf); + virtual bool eof(); +protected: + size_t offset[3]; + bool is_done[3];//one whoel frame is read done of each plane. + int count;//nbr of frame + uint32_t cnt_of_miniframe; + uint32_t miniframe_height; +}; + +class InputFileFrameWithROI : + public InputFileFrame +{ +public: + InputFileFrameWithROI(std::istream &input, uint32_t format, + size_t width, size_t height, size_t strideAlign, std::istream &roi, size_t stride[]); + virtual void prepare(Buffer &buf); + virtual ~InputFileFrameWithROI(); +private: + void load_roi_cfg(); + std::istream &roi_is; + v4l2_roi_list_t *roi_list; + v4l2_roi_list_t::iterator cur; +}; + +class InputFileFrameWithEPR : + public InputFileFrame +{ +public: + InputFileFrameWithEPR(std::istream &input, uint32_t format, + size_t width, size_t height, size_t strideAlign, std::istream &epr, uint32_t oformat, size_t stride[]); + virtual ~InputFileFrameWithEPR(); + virtual void prepare(Buffer &buf); + void prepareEPR(Buffer &buf); + virtual bool needDoubleCount(){return true;}; +private: + std::istream &epr_is; + v4l2_epr_list_t *epr_list; + v4l2_epr_list_t::iterator cur; + uint32_t outformat; + void load_epr_cfg(); + void read_efp_cfg(char *buf, int num_epr, struct epr_config *config); + void read_row_cfg(char *buf, int row, int len, struct epr_config &config); + void erp_adjust_bpr_to_64_64( + struct v4l2_buffer_general_rows_uncomp_body* uncomp_body, + int qp_delta, + uint32_t bpr_base_idx, + uint32_t row_off, + uint8_t force, + uint8_t quad_skip, + int local_base); +}; + +class InputFileOsd +{ +public: + InputFileOsd(const char * filename, uint32_t format, size_t width, size_t height, size_t strideAlign, size_t stride[] = {0}); + virtual void prepare(Buffer &buf); + virtual bool eof(); +protected: + size_t nplanes; + size_t stride[3]; + size_t size[3]; + size_t heights[3]; + size_t framesize; + std::ifstream osd_is; +}; + +class InputFileFrameOSD : + public InputFileFrame +{ +public: + InputFileFrameOSD(std::istream &input, uint32_t format, size_t width, size_t height, size_t strideAlign, size_t stride[] = {0}); + virtual void prepare(Buffer &buf); + v4l2_osd_list_t *osd_list; + v4l2_osd_list_t::iterator osd_cur; + InputFileOsd* osd_file_1; + InputFileOsd* osd_file_2; +private: + uint32_t refresh_index; +}; + +class InputFrame : + public Input +{ +public: + InputFrame(uint32_t format, size_t width, size_t height, + size_t strideAlign, size_t nframes); + + virtual void prepare(Buffer &buf); + virtual bool eof(); + +private: + void rgb2yuv(unsigned int yuv[3], const unsigned int rgb[3]); + + size_t nplanes; + size_t stride[3]; + size_t size[3]; + size_t nframes; + size_t count; + size_t heights[3]; +}; + +class Output : + public IO +{ +public: + Output(uint32_t format); + Output(uint32_t format, bool packed); + virtual ~Output(); + + virtual void prepare(Buffer &buf); + virtual void finalize(Buffer &buf); + virtual void write(void *ptr, size_t nbytes) {} + +protected: + unsigned int timestamp; + size_t totalSize; + bool packed; +}; + +class OutputFile : + public Output +{ +public: + OutputFile(std::ostream &output, uint32_t format); + OutputFile(std::ostream &output, uint32_t format, bool packed); + + virtual void write(void *ptr, size_t nbytes); + +protected: + std::ostream &output; +}; + +class OutputIVF : + public OutputFile +{ +public: + OutputIVF(std::ofstream &output, uint32_t format, uint16_t width, uint16_t height); + + virtual void finalize(Buffer &buf); + +private: + std::vector temp; +}; + +class OutputAFBC : + public OutputFile +{ +public: + OutputAFBC(std::ofstream &output, uint32_t format, bool tiled); + virtual void prepare(Buffer &buf); + virtual void finalize(Buffer &buf); +protected: + bool tiled; +}; + +class OutputAFBCInterlaced : + public OutputAFBC +{ +public: + OutputAFBCInterlaced(std::ofstream &output, uint32_t format, bool tiled); + virtual void finalize(Buffer &buf); +}; + +class OutputFileWithMD5 : + public OutputFile +{ +public: + OutputFileWithMD5(std::ofstream &output, uint32_t format, std::ofstream &output_md5, bool packed); + virtual void finalize(Buffer &buf); + +private: + std::ofstream &output_md5; +}; + +class OutputFileWithADStats : + public OutputFile +{ +public: + OutputFileWithADStats(std::ofstream &output, uint32_t format, + const std::string& ad_stats_filename,const std::string&thumbnail_filename, bool packed); + virtual void finalize(Buffer &buf); + virtual ~OutputFileWithADStats(); +private: + std::ofstream output_ad_stats; + std::ofstream output_thumbnail; +}; + + +class OutputFileFrameStats : + public OutputFile +{ +public: + OutputFileFrameStats(std::ostream &output, uint32_t format, uint32_t stats_mode, + const std::string& filename, uint32_t width, uint32_t height); + virtual void finalize(Buffer &buf); + virtual ~OutputFileFrameStats(); +private: + uint32_t outformat; + int enc_stats_mode; + std::ofstream file_mms; + std::ofstream file_bitcost; + std::ofstream file_qp; + unsigned int queued_buffer; +}; + +/**************************************************************************** + * Codec, Decoder, Encoder + ****************************************************************************/ + +class Codec +{ +public: + typedef std::map BufferMap; + + Codec(const char *dev, + enum v4l2_buf_type inputType, + enum v4l2_buf_type outputType, + std::ostream &log, + bool nonblock); + Codec(const char *dev, + Input &input, + enum v4l2_buf_type inputType, + Output &output, + enum v4l2_buf_type outputType, + std::ostream &log, + bool nonblock); + virtual ~Codec(); + + int stream(); + void setMemoryType(enum v4l2_memory mem_type); + void setInputThread(int input_thread); + static uint32_t to4cc(const std::string &str); + static bool isVPx(uint32_t format); + static bool isYUV422(uint32_t format); + static bool isAFBC(uint32_t format); + static void getStride(uint32_t format, size_t & nplanes, size_t stride[3][2]); + static size_t getSize(uint32_t format, size_t width, size_t height, + size_t strideAlign, size_t & nplanes, size_t stride[3], size_t size[3], size_t heights[3]); +protected: + enum NaluFormat + { + NALU_FORMAT_START_CODES, + NALU_FORMAT_ONE_NALU_PER_BUFFER, + NALU_FORMAT_ONE_BYTE_LENGTH_FIELD, + NALU_FORMAT_TWO_BYTE_LENGTH_FIELD, + NALU_FORMAT_FOUR_BYTE_LENGTH_FIELD + }; + + class Port + { + public: + Port(int &fd, enum v4l2_buf_type type, std::ostream &log) : + fd(fd), + type(type), + log(log), + interlaced(false), + tryEncStop(false), + tryDecStop(false), + ad_stats(0), + mirror(0), + scale(1), + frames_processed(0), + frames_count(0), + memory_type_port(V4L2_MEMORY_MMAP), + isInputThread(false) + {memset(__stride, 0, sizeof(size_t) * VIDEO_MAX_PLANES); + memset(&seamless,0,sizeof(seamless));} + Port(int &fd, IO &io, v4l2_buf_type type, std::ostream &log) : + fd(fd), + io(&io), + type(type), + log(log), + pending(0), + tid(0), + interlaced(false), + tryEncStop(false), + tryDecStop(false), + ad_stats(0), + mirror(0), + scale(1), + frames_processed(0), + frames_count(0), + memory_type_port(V4L2_MEMORY_MMAP), + isInputThread(false) + {memset(__stride, 0, sizeof(size_t) * VIDEO_MAX_PLANES); + memset(&seamless,0,sizeof(seamless));} + + void enumerateFormats(); + const v4l2_format &getFormat(); + void tryFormat(v4l2_format &format); + void setFormat(v4l2_format &format); + void getTrySetFormat(); + void printFormat(const struct v4l2_format &format); + const v4l2_crop getCrop(); + + void allocateBuffers(size_t count, enum v4l2_memory mempry_type); + void freeBuffers(); + unsigned int getBufferCount(); + void queueBuffers(); + void queueBuffer(Buffer &buf); + Buffer &dequeueBuffer(); + void printBuffer(const v4l2_buffer &buf, const char *prefix); + + bool handleBuffer(); + void handleResolutionChange(); + + void streamon(); + void streamoff(); + + void sendEncStopCommand(); + void sendDecStopCommand(); + + void setH264DecIntBufSize(uint32_t ibs); + void setNALU(NaluFormat nalu); + void setEncFramerate(uint32_t fps); + void setEncBitrate(uint32_t bps); + void setEncPFrames(uint32_t pframes); + void setEncBFrames(uint32_t bframes); + void setEncSliceSpacing(uint32_t spacing); + void setEncForceChroma(uint32_t fmt); + void setEncBitdepth(uint32_t bd); + void setH264EncIntraMBRefresh(uint32_t period); + void setEncProfile(uint32_t profile); + void setEncLevel(uint32_t level); + void setEncConstrainedIntraPred(uint32_t cip); + void setH264EncEntropyMode(uint32_t ecm); + void setH264EncGOPType(uint32_t gop); + void setEncMinQP(uint32_t minqp); + void setEncMaxQP(uint32_t maxqp); + void setEncFixedQP(uint32_t fqp); + void setEncFixedQPI(uint32_t fqp); + void setEncFixedQPP(uint32_t fqp); + void setEncFixedQPB(uint32_t fqp); + void setEncMinQPI(uint32_t nQpMinI); + void setEncMaxQPI(uint32_t nQpMaxI); + void setEncInitQPI(uint32_t init_qpi); + void setEncInitQPP(uint32_t init_qpp); + void setEncSAOluma(uint32_t sao_luma_dis); + void setEncSAOchroma(uint32_t sao_chroma_dis); + void setEncQPDeltaIP(uint32_t qp_delta_i_p); + void setEncRefRbEn(uint32_t ref_rb_en); + void setEncRCClipTop(uint32_t rc_qp_clip_top); + void setEncRCClipBot(uint32_t rc_qp_clip_bottom); + void setEncQpmapClipTop(uint32_t qpmap_clip_top); + void setEncQpmapClipBot(uint32_t qpmap_clip_bottom); + void setPortProfiling(uint32_t enable); + void setH264EncBandwidth(uint32_t bw); + void setHEVCEncEntropySync(uint32_t es); + void setHEVCEncTemporalMVP(uint32_t tmvp); + void setEncStreamEscaping(uint32_t sesc); + void setEncHorizontalMVSearchRange(uint32_t hmvsr); + void setEncVerticalMVSearchRange(uint32_t vmvsr); + void setVP9EncTileCR(uint32_t tcr); + void setJPEGEncQuality(uint32_t q); + void setJPEGEncQualityLuma(uint32_t q); + void setJPEGEncQualityChroma(uint32_t q); + void setJPEGEncRefreshInterval(uint32_t r); + void setJPEGHufftable(struct v4l2_mvx_huff_table *table); + void setSeamlessTarget(struct v4l2_mvx_seamless_target * seamless); + void setInterlaced(bool interlaced); + void setRotation(int rotation); + void setMirror(int mirror); + void setDownScale(int scale); + void tryEncStopCmd(bool tryStop); + void tryDecStopCmd(bool tryStop); + void setDecFrameReOrdering(uint32_t fro); + void setDecIgnoreStreamHeaders(uint32_t ish); + bool isEncoder(); + void setFrameCount(int frames); + void setRateControl(struct v4l2_rate_control *rc); + void setCropLeft(int left); + void setCropRight(int right); + void setCropTop(int top); + void setColorConversion(uint32_t mode); + void setCustColorConvCoef(struct v4l2_mvx_color_conv_coef *coef); + void setCropBottom(int bottom); + void setStatsMode(int mode, int index = 0); + void setVuiColourDesc(struct v4l2_mvx_color_desc *color); + void setSeiUserData(struct v4l2_sei_user_data *sei_user_data); + void setHRDBufferSize(int size); + void setDSLFrame(int width, int height); + void setDSLRatio(int hor, int ver); + void setLongTermRef(uint32_t mode, uint32_t period); + void setDSLMode(int mode); + void setDSLInterpMode(int mode); + void setDisabledFeatures(int val); + void setRGBToYUVMode(uint32_t mode); + void setRGBConvertYUV(struct v4l2_mvx_rgb2yuv_color_conv_coef *coef); + void setDecDstCrop(struct v4l2_mvx_crop_cfg *dst_crop); + void setVisibleWidth(uint32_t v_width); + void setVisibleHeight(uint32_t v_height); + void setMiniHeight(uint32_t mini_height); + int allocateDMABuf(size_t size); + void setPortMemoryType(enum v4l2_memory mem_type); + void startInputThread(); + static void* fillInputThread(void *arg); + void _fillInputThread(); + uint32_t getInputBufferIdx(pthread_mutex_t *mutex, pthread_cond_t *cond, std::queue *input_queue); + void appendInputBufferIdx(pthread_mutex_t *mutex, pthread_cond_t *cond, std::queue *input_queue, uint32_t index); + void setFrameStride(size_t *stride); + void setRcBitIMode(uint32_t mode); + void setRcBitRationI(uint32_t ratio); + void setMultiSPSPPS(uint32_t sps_pps); + void setEnableVisual(uint32_t enable); + void setEnableSCD(uint32_t scd_enable); + void setScdPercent(uint32_t scd_percent); + void setScdThreshold(uint32_t scd_threshold); + void setEnableAQSsim(uint32_t aq_ssim_en); + void setAQNegRatio(uint32_t aq_neg_ratio); + void setAQPosRatio(uint32_t aq_pos_ratio); + void setAQQPDeltaLmt(uint32_t aq_qpdelta_lmt); + void setAQInitFrmAvgSvar(uint32_t aq_init_frm_avg_svar); + void setAdaptiveIntraBlock(uint32_t enable); + void setIntermediateBufSize(uint32_t size); + void setSvct3Level1Period(uint32_t period); + void setGopResetPframes(int pframes); + void setLtrResetPeriod(int period); + void setPortStatsSize(uint32_t mms, uint32_t bc, uint32_t qp); + void setGDRnumber(uint32_t numbder); + void setGDRperiod(uint32_t period); + void setForcedUVvalue(uint32_t uv_value); + void setEncSrcCrop(struct v4l2_mvx_crop_cfg * src_crop); + void setBufferCnt(uint32_t count){buf_cnt = count;} + uint32_t &getBufferCnt(){return buf_cnt;}//this buf_cnt comes from setting value, default 0 + void setOsdCfg(struct v4l2_osd_config osd); + void setEncOSDinfo(struct v4l2_osd_info* info); + void setChangePos(uint32_t pos); + void setAdStats(int ad_stats); + int &fd; + IO *io; + v4l2_buf_type type; + v4l2_format format; + std::ostream &log; + BufferMap buffers; + size_t pending; + pthread_t tid; + FILE *roi_cfg; + + private: + int rotation; + bool interlaced; + bool tryEncStop; + bool tryDecStop; + int ad_stats; + int mirror; + int scale; + int frames_processed; + int frames_count; + int rc_type; + uint32_t mini_frame_height; + enum v4l2_memory memory_type_port; + bool isInputThread; + std::queue input_producer_queue; + std::queue input_consumer_queue; + pthread_mutex_t input_producer_mutex; + pthread_mutex_t input_consumer_mutex; + pthread_cond_t input_producer_cond; + pthread_cond_t input_consumer_cond; + size_t __stride[VIDEO_MAX_PLANES]; + uint32_t mms_buffer_size; + uint32_t bitcost_buffer_size; + uint32_t qp_buffer_size; + uint32_t buf_cnt;//buffer number to be allocated for this port + struct v4l2_mvx_seamless_target seamless; + }; + + static size_t getBytesUsed(v4l2_buffer &buf); + void enumerateFormats(); + + Port input; + Port output; + int fd; + std::ostream &log; + bool csweo; + uint32_t fps; + uint32_t bps; + uint32_t minqp; + uint32_t maxqp; + uint32_t fixedqp; + uint32_t mini_frame_height; + enum v4l2_memory memory_type; + +private: + void openDev(const char *dev); + void closeDev(); + + void queryCapabilities(); + void enumerateFramesizes(uint32_t format); + void setFormats(); + + v4l2_mvx_color_desc getColorDesc(); + void printColorDesc(const v4l2_mvx_color_desc &color); + + void subscribeEvents(); + void subscribeEvents(uint32_t event); + void unsubscribeEvents(); + void unsubscribeEvents(uint32_t event); + + void allocateBuffers(enum v4l2_memory m_type = V4L2_MEMORY_MMAP); + void freeBuffers(); + void queueBuffers(); + + void streamon(); + void streamoff(); + + void runPoll(); + void runThreads(); + static void *runThreadInput(void *arg); + static void *runThreadOutput(void *arg); + bool handleEvent(); + + bool nonblock; +}; + +class Decoder : + public Codec +{ +public: + Decoder(const char *dev, Input &input, Output &output, bool nonblock = true, std::ostream &log = std::cout); + void setH264IntBufSize(uint32_t ibs); + void setInterlaced(bool interlaced); + void setFrameReOrdering(uint32_t fro); + void setIgnoreStreamHeaders(uint32_t ish); + void tryStopCmd(bool tryStop); + void setNaluFormat(int nalu); + void setRotation(int rotation); + void setDownScale(int scale); + void setFrameCount(int frames); + void setDSLFrame(int width, int height); + void setDSLRatio(int hor, int ver); + void setDSLMode(int mode); + void setDSLInterpMode(int mode); + void setDisabledFeatures(int val); + void setColorConversion(uint32_t mode); + void setCustColorConvCoef(struct v4l2_mvx_color_conv_coef *coef); + void setDecDstCrop(struct v4l2_mvx_crop_cfg *dst_crop); + void setStride(size_t *stride); + void setSeamlessTarget(uint32_t format, struct v4l2_mvx_seamless_target *seamless); + void setFrameBufCnt(uint32_t count); + void setBitBufCnt(uint32_t count); + void setAdStats(int ad_stats); +private: + int naluFmt; +}; + +class Encoder : + public Codec +{ +public: + Encoder(const char *dev, Input &input, Output &output, bool nonblock = true, std::ostream &log = std::cout); + void changeSWEO(uint32_t csweo); + void setFramerate(uint32_t fps); + void setBitrate(uint32_t bps); + void setPFrames(uint32_t pframes); + void setBFrames(uint32_t bframes); + void setSliceSpacing(uint32_t spacing); + void setConstrainedIntraPred(uint32_t cip); + void setEncForceChroma(uint32_t fmt); + void setEncBitdepth(uint32_t bd); + void setH264IntraMBRefresh(uint32_t period); + void setProfile(uint32_t profile); + void setLevel(uint32_t level); + void setH264EntropyCodingMode(uint32_t ecm); + void setH264GOPType(uint32_t gop); + void setEncMinQP(uint32_t minqp); + void setEncMaxQP(uint32_t maxqp); + void setEncFixedQP(uint32_t fqp); + void setEncFixedQPI(uint32_t fqp); + void setEncFixedQPP(uint32_t fqp); + void setEncFixedQPB(uint32_t fqp); + void setH264Bandwidth(uint32_t bw); + void setVP9TileCR(uint32_t tcr); + void setJPEGRefreshInterval(uint32_t ri); + void setJPEGQuality(uint32_t q); + void setJPEGQualityLuma(uint32_t q); + void setJPEGQualityChroma(uint32_t q); + void setJPEGHufftable(struct v4l2_mvx_huff_table *table); + void setHEVCEntropySync(uint32_t es); + void setHEVCTemporalMVP(uint32_t tmvp); + void setStreamEscaping(uint32_t sesc); + void setHorizontalMVSearchRange(uint32_t hmvsr); + void setVerticalMVSearchRange(uint32_t vmvsr); + void tryStopCmd(bool tryStop); + void setMirror(int mirror); + void setRotation(int rotation); + void setFrameCount(int frames); + void setRateControl(const std::string &rc, int target_bitrate, int maximum_bitrate); + void setCropLeft(int left); + void setCropRight(int right); + void setCropTop(int top); + void setCropBottom(int bottom); + void setStatsMode(int mode); + void setVuiColourDesc(struct v4l2_mvx_color_desc *color); + void setSeiUserData(struct v4l2_sei_user_data *sei_user_data); + void setHRDBufferSize(int size); + void setLongTermRef(uint32_t mode, uint32_t period); + void setMiniHeight(uint32_t mini_height); + void setEncMinQPI(uint32_t nQpMinI); + void setEncMaxQPI(uint32_t nQpMaxI); + void setEncInitQPI(uint32_t init_qpi); + void setEncInitQPP(uint32_t init_qpp); + void setEncSAOluma(uint32_t sao_luma_dis); + void setEncSAOchroma(uint32_t sao_chroma_dis); + void setEncQPDeltaIP(uint32_t qp_delta_i_p); + void setEncRefRbEn(uint32_t ref_rb_en); + void setEncRCClipTop(uint32_t rc_qp_clip_top); + void setEncRCClipBot(uint32_t rc_qp_clip_bottom); + void setEncQpmapClipTop(uint32_t qpmap_clip_top); + void setEncQpmapClipBot(uint32_t qpmap_clip_bottom); + void setEncProfiling(uint32_t enable); + void setVisibleWidth(uint32_t v_width); + void setVisibleHeight(uint32_t v_height); + void setStride(size_t *stride); + void setRcBitIMode(uint32_t mode); + void setRGBToYUVMode(uint32_t mode); + void setRGBConvertYUV(struct v4l2_mvx_rgb2yuv_color_conv_coef *coef); + void setRcBitRationI(uint32_t ratio); + void setMultiSPSPPS(uint32_t sps_pps); + void setEnableSCD(uint32_t scd_enable); + void setScdPercent(uint32_t scd_percent); + void setScdThreshold(uint32_t scd_threshold); + void setEnableAQSsim(uint32_t aq_ssim_en); + void setAQNegRatio(uint32_t aq_neg_ratio); + void setAQPosRatio(uint32_t aq_pos_ratio); + void setAQQPDeltaLmt(uint32_t aq_qpdelta_lmt); + void setAQInitFrmAvgSvar(uint32_t aq_init_frm_avg_svar); + void setEnableVisual(uint32_t enable); + void setAdaptiveIntraBlock(uint32_t enable); + void setIntermediateBufSize(uint32_t size); + void setSvct3Level1Period(uint32_t period); + void setStatsSize(uint32_t mms, uint32_t bc, uint32_t qp); + void setGDRnumber(uint32_t numbder); + void setGDRperiod(uint32_t period); + void setForcedUVvalue(uint32_t uv_value); + void setEncSrcCrop(struct v4l2_mvx_crop_cfg * src_crop); + void setFrameBufCnt(uint32_t count); + void setBitBufCnt(uint32_t count); + void setEncOSDinfo(struct v4l2_osd_info* info); + void setChangePos(uint32_t pos); +}; + +class Info : + public Codec +{ +public: + Info(const char *dev, std::ostream &log = std::cout); + void enumerateFormats(); +}; + +#endif /* __MVX_PLAYER_H__ */ diff --git a/src/little/buildroot-ext/package/mvx_player/src/reader/parser.h b/src/little/buildroot-ext/package/mvx_player/src/reader/parser.h new file mode 100755 index 000000000..4bfd0ae83 --- /dev/null +++ b/src/little/buildroot-ext/package/mvx_player/src/reader/parser.h @@ -0,0 +1,652 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef __C_APP_PACKET_PARSER_H__ +#define __C_APP_PACKET_PARSER_H__ + +#include "simple_reader.h" + +class parser +{ +public: + class info + { + public: + bool new_frame; + bool config; + info() + { + new_frame = false; + config = false; + } + }; + virtual void reset(){} + virtual bool parse(simple_reader::packet_info packet, info& inf)=0; + virtual ~parser(){} +}; + + +class mpeg4_parser: public parser +{ +public: + mpeg4_parser() + { + } + + bool parse(simple_reader::packet_info packet, info& inf) + { + uint8_t buf[4]; + packet.write_to_buffer(buf,4); + //printf(" %x\n",buf[3]); + if(buf[3]==0xb6) + { + inf.new_frame = true; + } + return true; + } +}; + +class mpeg2_parser: public parser +{ +public: + mpeg2_parser() + { + } + + bool parse(simple_reader::packet_info packet, info& inf) + { + uint8_t buf[1]; + packet.write_to_buffer(buf,1); + if(buf[0]==0x0) + { + inf.new_frame = true; + } + return true; + } +}; +class h263_parser: public parser +{ + +public: + h263_parser() + { + } + + bool parse(simple_reader::packet_info packet, info& inf) + { + (void)packet; + inf.new_frame=true; + return true; + } +}; +class jpeg_parser: public parser +{ + +public: + jpeg_parser() + { + } + + bool parse(simple_reader::packet_info packet, info& inf) + { + (void)packet; + inf.new_frame=true; + return true; + } +}; +class rv_parser: public parser +{ +public: + rv_parser() + { + } + bool parse(simple_reader::packet_info packet, info& inf) + { + (void)packet; + inf.new_frame=true;//hmm + return true; + } +}; + +class vc1_advanced_parser: public parser +{ +public: + vc1_advanced_parser() + { + } + + bool parse(simple_reader::packet_info packet, info& inf) + { + uint8_t buf[1]; + packet.write_to_buffer(buf,1); + if(buf[0]==0x0D || buf[0]==0x0C) + { + inf.new_frame = true; + } + return true; + } +}; + +class hevc_parser: public parser +{ +public: + hevc_parser() + { + } + + bool parse(simple_reader::packet_info packet, info& inf) + { + uint8_t buf[32]; + uint32_t r = packet.write_to_buffer(buf,32); + bitreader b(buf,r); + + int forbidden_zero_bit = b.read_bits(1); + int nal_unit_type = b.read_bits(6); + int nuh_layer_id = b.read_bits(6); + int nuh_temporal_id = b.read_bits(3); + + (void)forbidden_zero_bit; + (void)nuh_layer_id; + (void)nuh_temporal_id; + + //printf("%d\n",nal_unit_type); + switch(nal_unit_type) + { + case HEVC_NAL_TRAIL_N: + case HEVC_NAL_TRAIL_R: + case HEVC_NAL_TSA_N: + case HEVC_NAL_TLA_R: + case HEVC_NAL_STSA_N: + case HEVC_NAL_STSA_R: + case HEVC_NAL_RADL_N: + case HEVC_NAL_RADL_R: + case HEVC_NAL_RASL_N: + case HEVC_NAL_RASL_R: + case HEVC_NAL_BLA_W_LP: + case HEVC_NAL_BLA_W_RADL: + case HEVC_NAL_BLA_N_LP: + case HEVC_NAL_IDR_W_RADL: + case HEVC_NAL_IDR_N_LP: + case HEVC_NAL_CRA: + { + //printf("Slice\n"); + uint32_t first_slice_segment_in_pic = b.read_bits(1); + if(first_slice_segment_in_pic) + { + inf.new_frame = true; + } + break; + } + case HEVC_NAL_VPS: + //printf("VPS\n"); + inf.config = true; + break; + case HEVC_NAL_SPS: + //printf("SPS\n"); + inf.config = true; + break; + case HEVC_NAL_PPS: + //printf("PPS\n"); + inf.config = true; + break; + default: + //printf("NAL %d\n",nal_unit_type); + break; + } + return true; + } + enum hevc_nal_unit_type + { + HEVC_NAL_TRAIL_N = 0, // 0 + HEVC_NAL_TRAIL_R, // 1 + HEVC_NAL_TSA_N, // 2 + HEVC_NAL_TLA_R, // 3 + HEVC_NAL_STSA_N, // 4 + HEVC_NAL_STSA_R, // 5 + HEVC_NAL_RADL_N, // 6 + HEVC_NAL_RADL_R, // 7 + HEVC_NAL_RASL_N, // 8 + HEVC_NAL_RASL_R, // 9 + + HEVC_NAL_RSV_VCL_N10, + HEVC_NAL_RSV_VCL_R11, + HEVC_NAL_RSV_VCL_N12, + HEVC_NAL_RSV_VCL_R13, + HEVC_NAL_RSV_VCL_N14, + HEVC_NAL_RSV_VCL_R15, + + HEVC_NAL_BLA_W_LP = 16,// 16 + HEVC_NAL_BLA_W_RADL, // 17 + HEVC_NAL_BLA_N_LP, // 18 + HEVC_NAL_IDR_W_RADL, // 19 + HEVC_NAL_IDR_N_LP, // 20 + HEVC_NAL_CRA, // 21 + + HEVC_NAL_RSV_IRAP_VCL22, + HEVC_NAL_RSV_IRAP_VCL23, + HEVC_NAL_RSV_VCL24, + HEVC_NAL_RSV_VCL25, + HEVC_NAL_RSV_VCL26, + HEVC_NAL_RSV_VCL27, + HEVC_NAL_RSV_VCL28, + HEVC_NAL_RSV_VCL29, + HEVC_NAL_RSV_VCL30, + HEVC_NAL_RSV_VCL31, + + HEVC_NAL_VPS = 32, // 32 + HEVC_NAL_SPS, // 33 + HEVC_NAL_PPS, // 34 + HEVC_NAL_AUD, // 35 + HEVC_NAL_EOS, // 36 + HEVC_NAL_EOB, // 37 + HEVC_NAL_FILLER_DATA, // 38 + HEVC_NAL_PREFIX_SEI, // 39 + HEVC_NAL_SUFFIX_SEI, // 40 + HEVC_NAL_RSV_NVCL41, + HEVC_NAL_RSV_NVCL42, + HEVC_NAL_RSV_NVCL43, + HEVC_NAL_RSV_NVCL44, + HEVC_NAL_RSV_NVCL45, + HEVC_NAL_RSV_NVCL46, + HEVC_NAL_RSV_NVCL47, + HEVC_NAL_INVALID = 64, + }; +}; + + +class avs2_parser: public parser +{ +public: + avs2_parser() + { + } + + bool parse(simple_reader::packet_info packet, info& inf) + { + uint8_t buf[32]; + uint32_t r = packet.write_to_buffer(buf,32); + bitreader b(buf,r); + + int nal_unit_type = b.read_bits(8); + + //printf("[avs2_parser] %x\n",nal_unit_type); + if ((nal_unit_type >= AVS2_NAL_SLICE) && (nal_unit_type < AVS2_NAL_SEQUENCE_START)) + { + //printf("AVS2-Slice\n"); + if(nal_unit_type == 0) + { + inf.new_frame = true; + } + } + else + { + switch(nal_unit_type) + { + case AVS2_NAL_SEQUENCE_START: + //printf("AVS2-SPS\n"); + inf.config = true; + break; + case AVS2_NAL_I_PICTURE: + //printf("AVS2-I-Pic\n"); + inf.config = true; + break; + case AVS2_NAL_PB_PICTURE: + //printf("AVS2-PB-Pic\n"); + inf.config = true; + break; + case AVS2_NAL_SEQUENCE_END: + case AVS2_NAL_VIDEO_EDIT: + break; + default: + //printf("AVS2-NAL %x\n", nal_unit_type); + break; + } + } + return true; + } + enum avs2_nal_unit_type + { + AVS2_NAL_SLICE = 0, + AVS2_NAL_SEQUENCE_START = 0xb0, + AVS2_NAL_SEQUENCE_END = 0xb1, + AVS2_NAL_USER_DATA = 0xb2, + AVS2_NAL_I_PICTURE = 0xb3, + AVS2_NAL_RESERVED0 = 0xb4, + AVS2_NAL_EXT = 0xb5, + AVS2_NAL_PB_PICTURE = 0xb6, + AVS2_NAL_VIDEO_EDIT = 0xb7, + AVS2_NAL_RESERVED1 = 0xb8, + AVS2_NAL_SYSTEM = 0xb9, + AVS2_NAL_INVALID = 64, + }; +}; + +class h264_parser: public parser +{ + struct sps_data + { + int log2_max_frame_num; + bool frame_mbs_only_flag; + int pic_order_cnt_type; + int log2_max_pic_order_cnt_lsb; + bool delta_pic_order_always_zero_flag; + sps_data() + { + log2_max_frame_num = 0; + frame_mbs_only_flag = false; + pic_order_cnt_type = 0; + log2_max_pic_order_cnt_lsb = 0; + delta_pic_order_always_zero_flag = false; + } + }; + struct pps_data + { + int sps_id; + bool pic_order_present_flag; + pps_data() + { + sps_id = 0; + pic_order_present_flag = false; + } + }; + + sps_data sps[32]; + pps_data pps[256]; + int last_frame_num; + int last_field_mode; + int last_idr_pic_flag; + int last_idr_pic_id; + int last_nal_ref_idc; + int last_pps_id; + int last_pic_order_cnt_0; + int last_pic_order_cnt_1; +public: + + h264_parser() + { + last_frame_num = -1; + last_field_mode = -1; + last_idr_pic_flag = -1; + last_idr_pic_id = -1; + last_nal_ref_idc = -1; + last_pps_id = -1; + last_pic_order_cnt_0 = -1; + last_pic_order_cnt_1 = -1; + } + + bool parse(simple_reader::packet_info packet, info& inf) + { + const int buf_size = 256; + uint8_t buf[buf_size]; + uint32_t bytes = packet.write_to_buffer(buf,32); + bitreader b(buf,bytes); + + b.read_bits(1); // forbidden_zero_bit + int nal_ref_idc=b.read_bits(2); + int nal_unit_type=b.read_bits(5); + + //printf("nal_unit_type %d\n",nal_unit_type); + switch(nal_unit_type) + { + case 1: + case 5: // slice + { + ue(b); // first_mb_in_slice + ue(b); // slice_type + int pps_id = ue(b); + pps_data& p = pps[pps_id]; + sps_data& s = sps[p.sps_id]; + int log2_max_frame_num = s.log2_max_frame_num; + + int frame_num = b.read_bits(log2_max_frame_num); + + int field_mode = 0; + if (!s.frame_mbs_only_flag) + { + if (b.read_bits(1))//field_pic_flag + { + field_mode = 1; + field_mode += b.read_bits(1);// bottom_field_flag + } + } + int idr_pic_flag = 0; + int idr_pic_id = 0; + if ( nal_unit_type == 5 ) + { + idr_pic_flag = 1; + idr_pic_id = ue(b); + } + int pic_order_cnt_type = s.pic_order_cnt_type; + int pic_order_cnt_0 = 0; + int pic_order_cnt_1 = 0; + if ( pic_order_cnt_type == 0 ) + { + pic_order_cnt_0 = b.read_bits(s.log2_max_pic_order_cnt_lsb); + if( p.pic_order_present_flag && field_mode==0 ) + { + pic_order_cnt_1 = se(b); + } + } + else if( pic_order_cnt_type == 1 && !s.delta_pic_order_always_zero_flag ) + { + pic_order_cnt_0 = se(b); + if( p.pic_order_present_flag && field_mode==0 ) + { + pic_order_cnt_1 = se(b); + } + } + if (pps_id != last_pps_id || + frame_num != last_frame_num || + field_mode != last_field_mode || + idr_pic_flag != last_idr_pic_flag || + idr_pic_id != last_idr_pic_id || + ((nal_ref_idc!=0) && (last_nal_ref_idc==0)) || + ((nal_ref_idc==0) && (last_nal_ref_idc!=0)) || + pic_order_cnt_0 != last_pic_order_cnt_0 || + pic_order_cnt_1 != last_pic_order_cnt_1 ) + { + inf.new_frame = true; + //printf("new frame\n"); + } + + last_field_mode = field_mode; + last_idr_pic_flag = idr_pic_flag; + last_idr_pic_id = idr_pic_id; + last_nal_ref_idc = nal_ref_idc; + last_pps_id= pps_id; + last_frame_num = frame_num; + last_pic_order_cnt_0 = pic_order_cnt_0; + last_pic_order_cnt_1 = pic_order_cnt_1; + + //printf("first_mb_in_slice %d, slice_type %d, pps_id %d, frame_num %d pic_order_cnt_type %d pic_order_cnt_0 %d pic_order_cnt_1 %d log2_max_pic_order_cnt_lsb %d \n",first_mb_in_slice,slice_type ,pps_id,frame_num, pic_order_cnt_type, pic_order_cnt_0,pic_order_cnt_1,s.log2_max_pic_order_cnt_lsb); + break; + } + case 9: + { + /*access unit delimiter*/ + break; + } + case 6: + { + /*SEI NAL unit*/ + break; + } + case 8: //PPS + { + inf.config = true; + int pic_parameter_set_id = ue(b); + int seq_parameter_set_id = ue(b); + b.read_bits(1); // entropy_coding_mode_flag + + /* bottom_field_pic_order_in_frame_present_flag */ + bool pic_order_present_flag = b.read_bits(1); + + pps[pic_parameter_set_id].sps_id = seq_parameter_set_id; + pps[pic_parameter_set_id].pic_order_present_flag = pic_order_present_flag; + // printf("pic_parameter_set_id %d, pic_parameter_set_id %d\n",pic_parameter_set_id,pic_parameter_set_id); + break; + } + case 7: //SPS + { + //printf("sps\n"); + inf.config = true; + + bytes += packet.write_to_buffer(buf+32,buf_size-32); + b = bitreader(buf+1,bytes-1); + + int profile_idc=b.read_bits(8); + b.read_bits(8); // constra_and_res + b.read_bits(8); // level_idc + int sps_id = ue(b); + + // printf("profile_idc %d, cc %d, level %d, id %d\n",profile_idc,constra_and_res,level_idc,sps_id); + + if( profile_idc == 100 || profile_idc == 110 || + profile_idc == 122 || profile_idc == 244 || profile_idc == 44 || + profile_idc == 83 || profile_idc == 86 || profile_idc == 118 || profile_idc == 128 ) + { + int chroma_format_idc=ue(b); + + if( chroma_format_idc == 3 ) + { + b.read_bits(1);//separate_colour_plane_flag + } + ue(b); // bit_depth_luma_minus8 + ue(b); // bit_depth_chroma_minus8 + b.read_bits(1); // qpprime_y_zero_transform_bypass_flag + int seq_scaling_matrix_present_flag = b.read_bits(1); + + if( seq_scaling_matrix_present_flag ) + { + for(int i = 0; i < ( ( chroma_format_idc != 3 ) ? 8 : 12 ) && !b.eos; i++ ) + { + bool seq_scaling_list_present_flag = b.read_bits(1); + if( seq_scaling_list_present_flag) + { + if( i < 6 ) + { + scaling_list(b,16); + } + else + { + scaling_list(b,64); + } + } + } + } + } + + int log2_max_frame_num = ue(b) + 4; + //printf("log2_max_frame_num %d\n",log2_max_frame_num); + + sps_data* s=&sps[sps_id]; + s->log2_max_frame_num = log2_max_frame_num; + + int pic_order_cnt_type = ue(b); + + if( pic_order_cnt_type == 0 ) + { + int log2_max_pic_order_cnt_lsb_minus4 = ue(b); + s->log2_max_pic_order_cnt_lsb = log2_max_pic_order_cnt_lsb_minus4+4; + } + else if( pic_order_cnt_type == 1 ) + { + bool delta_pic_order_always_zero_flag = b.read_bits(1); + s->delta_pic_order_always_zero_flag=delta_pic_order_always_zero_flag; + se(b); // offset_for_non_ref_pic + se(b); // offset_for_top_to_bottom_field + int num_ref_frames_in_pic_order_cnt_cycle = ue(b); + for(int i = 0; i < num_ref_frames_in_pic_order_cnt_cycle && !b.eos; i++ ) + { + se(b); // offset_for_ref_frame[i] + } + } + ue(b); // ax_num_ref_frames + b.read_bits(1); // gaps_in_frame_num_value_allowed_flag + + ue(b); // pic_width_in_mbs_minus1 + ue(b); // pic_height_in_map_units_minus1 + s->frame_mbs_only_flag = b.read_bits(1); + + s->pic_order_cnt_type=pic_order_cnt_type; + //printf("s->frame_mbs_only_flag %d\n",s->frame_mbs_only_flag); + + break; + } + default: + { + break; + } + } + return true; + } + +private: + + uint32_t ue(bitreader &b) + { + return b.read_exp_golomb(); + } + + int32_t se(bitreader &b) + { + uint32_t c = ue(b); + if((c&1)==0) + { + return -(c>>1); + } + else + { + return 1+(c>>1); + } + } + + void scaling_list(bitreader &b, int sizeOfScalingList) + { + + int lastScale = 8; + int nextScale = 8; + for(int j = 0; j < sizeOfScalingList && !b.eos; j++ ) + { + if( nextScale != 0 ) + { + int delta_scale = se(b); + nextScale = ( lastScale + delta_scale + 256 ) % 256; + } + int s = ( nextScale == 0 ) ? lastScale : nextScale; + lastScale = s; + } + } + +}; + +#endif + diff --git a/src/little/buildroot-ext/package/mvx_player/src/reader/read_util.h b/src/little/buildroot-ext/package/mvx_player/src/reader/read_util.h new file mode 100755 index 000000000..7e7e94a10 --- /dev/null +++ b/src/little/buildroot-ext/package/mvx_player/src/reader/read_util.h @@ -0,0 +1,213 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef __C_APP_READ_UTIL_H__ +#define __C_APP_READ_UTIL_H__ +#include +#include +#include +#include + +// Endian conversion helper functions +static inline uint16_t bswap_16(uint16_t val) +{ + return (val >> 8) | (val << 8); +} + +static inline uint32_t bswap_32(uint32_t val) +{ + return (val >> 24) | ((val & 0xFF0000) >> 8) | ((val & 0xFF00) << 8) | (val << 24); +} + +static inline uint64_t bswap_64(uint64_t val) +{ + return (uint64_t)bswap_32((uint32_t)val) << 32 | bswap_32((uint32_t)(val >> 32)); +} + +class bitreader +{ + uint8_t* data; + uint32_t size; + uint64_t t; + uint32_t e; + uint32_t off; +public: + bool eos; + bitreader(uint8_t* _data,uint32_t _size) + { + this->data=_data; + this->size=_size; + e=0; + t=0; + off=0; + eos=false; + } + + uint32_t read_bits(uint32_t n) + { + uint32_t val = peek_bits(n); + t <<=n; + e-=n; + return val; + } + uint32_t peek_bits(uint32_t n) + { + while(e=size) + { + eos = true; + return 0; + } + uint64_t a=data[off++]; + t |= a<<(56-e); + e+=8; + } + uint32_t val = (uint64_t)(t>>(64-n)); + return val; + } + uint32_t read_exp_golomb() + { + if(eos) + { + return 0; + } + int leadingZeroBits = -1; + for(bool b = 0; !b && !eos; leadingZeroBits++ ) + { + b = read_bits( 1 ) ; + } + return (1< +class mem_buf_writer +{ + +public: + uint32_t offset; + uint8_t data[SIZE]; + uint32_t size; + mem_buf_writer() + { + size = 0; + offset = 0; + } + + uint32_t write(uint8_t* buf,uint32_t alloc_size) + { + uint32_t size_left = size-offset; + if(size_left == 0) + { + return 0; + } + uint32_t s=alloc_size < size_left ? alloc_size : size_left; + memcpy(buf, data+offset ,s); + offset+=s; + return s; + } + uint32_t write(buf& buf) + { + uint32_t alloc_size = buf.size-buf.offset; + uint32_t size_left = size-offset; + if(size_left == 0) + { + return 0; + } + uint32_t s=alloc_size < size_left ? alloc_size : size_left; + memcpy(buf.data+buf.offset, data+offset ,s); + offset+=s; + buf.offset+=s; + return s; + } +}; + +class length_field_writer : public mem_buf_writer<4> +{ +public: + + length_field_writer(uint32_t length_field_bytes, uint32_t nal_size) + { + init(length_field_bytes,nal_size); + } + length_field_writer() + { + + } + void init(uint32_t length_field_bytes, uint32_t nal_size) + { + assert(length_field_bytes > 0 && length_field_bytes <= 4); + uint8_t* buffer = data; + if (length_field_bytes == 1) + { + *buffer++ = nal_size & 0xff; + assert( (nal_size >> 8) == 0 ); + } + else if (length_field_bytes == 2) + { + *buffer++ = nal_size & 0xff; + *buffer++ = (nal_size >> 8) & 0xff; + assert( (nal_size >> 16) == 0 ); + } + else if (length_field_bytes == 4) + { + *buffer++ = nal_size & 0xff; + *buffer++ = (nal_size >> 8) & 0xff; + *buffer++ = (nal_size >> 16) & 0xff; + *buffer++ = (nal_size >> 24) & 0xff; + } + size = length_field_bytes; + offset = 0; + } + +}; + +#endif /*__C_APP_READ_UTIL_H__*/ + diff --git a/src/little/buildroot-ext/package/mvx_player/src/reader/reader.h b/src/little/buildroot-ext/package/mvx_player/src/reader/reader.h new file mode 100755 index 000000000..a73e5ff48 --- /dev/null +++ b/src/little/buildroot-ext/package/mvx_player/src/reader/reader.h @@ -0,0 +1,128 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef __C_APP_READER_H__ +#define __C_APP_READER_H__ + +#include +#include +#include +#include +#include "read_util.h" + +class reader +{ +public: + enum result + { + RR_OK, // Read operation OK (streamed data) + RR_EOS, // Read to end of file (returned data still valid) + RR_EOP, // Read to end of packet + RR_EOP_FRAME, // Read to end of frame + RR_EOP_CODEC_CONFIG,// Read to end of codec config + RR_RESIZE, // + RR_ERROR, + }; + + enum codec + { + RCODEC_UNKNOWN, + RCODEC_VC1, + RCODEC_VC1_SIMPLE_PROFILE, + RCODEC_VC1_MAIN_PROFILE, + RCODEC_VC1_ADVANCED_PROFILE, + RCODEC_REAL_VIDEO, + RCODEC_REAL_MEDIA_FORMAT, + RCODEC_MPEG2, + RCODEC_MPEG4, + RCODEC_H263, + RCODEC_H264, + RCODEC_HEVC, + RCODEC_VP8, + RCODEC_VP9, + RCODEC_JPEG, + RCODEC_MBINFO, + RCODEC_AVS, + RCODEC_AVS2, + }; + enum reader_mode + { + RMODE_FLAGS=1, + RMODE_PACKETED=2, + RMODE_DELIMITED=4 + }; + + // Metadata published or consumed by the reader + enum reader_metadata + { + RMETA_CODEC = 0, // Detected codec type index + RMETA_WIDTH, // Video frame width + RMETA_HEIGHT, // Video frame height + RMETA_VIDEO_TRACK, // Video track index + RMETA_AUDIO_TRACK, // Audio track index + RMETA_YUV_FORMAT, // YUV color format + RMETA_DELIMITER_LENGTH, + RMETA_LAST, + }; + +protected: + union meta_value + { + bool b; + int32_t i; + float f; + }; + + std::istream *file; + meta_value metadata[RMETA_LAST]; + int mode; + uint64_t file_length; +public: + + reader(std::istream * file): file(file) + { + mode = 0; + } + + virtual bool seek_frames(uint32_t track, uint32_t nbr_frames) = 0; + + virtual result read(uint32_t track, uint8_t* buffer, uint32_t alloc_len, uint32_t *filled_len ) = 0; + + virtual void set_mode(int new_mode) { this->mode=new_mode;} + virtual int get_mode() { return mode;} + void setFileLength(uint64_t length){file_length = length;} + void set_metadata(int name,int value) { metadata[name].i=value;} + int get_metadata_int(int name) { return metadata[name].i; } + + virtual ~reader() {} +}; + +#endif diff --git a/src/little/buildroot-ext/package/mvx_player/src/reader/simple_reader.h b/src/little/buildroot-ext/package/mvx_player/src/reader/simple_reader.h new file mode 100755 index 000000000..abd239bb8 --- /dev/null +++ b/src/little/buildroot-ext/package/mvx_player/src/reader/simple_reader.h @@ -0,0 +1,219 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef __C_APP_SIMPLE_READER_H__ +#define __C_APP_SIMPLE_READER_H__ + +#include "reader.h" + +class simple_reader : public reader +{ +protected: + length_field_writer lf; + + bool resize_buffer; + bool raw_stream; +public: + class packet_info + { + public: + enum packet_write_flags + { + WRITE_FLAGS_NONE=0, + WRITE_FLAGS_ADD_PREFIX=1 + }; + + std::istream* file; + uint32_t tag; + uint64_t file_pos; + uint32_t size; + uint8_t prefix_size; + bool codec_config; + bool eos; + bool eof; + bool valid() + { + return file!=NULL; + } + bool is_consumed() + { + return size==0; + } + uint32_t get_remaining_size(packet_write_flags flags=WRITE_FLAGS_NONE) + { + bool incl_prefix = flags & WRITE_FLAGS_ADD_PREFIX; + return (incl_prefix ? prefix_size:0) + size; + } + uint32_t write_to_buffer(uint8_t* buffer,uint32_t alloc_size, packet_write_flags flags=WRITE_FLAGS_NONE) + { + uint32_t bytes_read=0; + bool incl_prefix = flags & packet_info::WRITE_FLAGS_ADD_PREFIX; + if(incl_prefix) + { + uint32_t s=alloc_size < prefix_size ? alloc_size : prefix_size; + + file->seekg(file_pos-prefix_size); + file->read((char*)buffer,s); + prefix_size-=s; + alloc_size-=s; + buffer+=s; + bytes_read+=s; + } + + if(prefix_size==0 || !incl_prefix) + { + file->seekg(file_pos); + uint32_t bytes_to_read = alloc_size < size ? alloc_size : size; + file->read((char*)buffer, bytes_to_read); + bytes_read += file->gcount(); + file_pos +=bytes_to_read; + size -=bytes_to_read; + //printf("r %d\n",read); + } + + return bytes_read; + } + ~packet_info() {} + packet_info() + { + size = 0; + file_pos = 0; + prefix_size=0; + file = NULL; + eof = false; + eos = false; + codec_config=false; + } + }; + +private: + packet_info current_packet; + void next_frame() + { + if(!current_packet.valid() || !current_packet.eof || current_packet.is_consumed()) + { + do + { + current_packet=packet_info(); + read_packet(current_packet); + } + while(!current_packet.eof && !current_packet.eos); + } + current_packet.size=0; + } + +public: + simple_reader(std::istream* file) : reader(file), resize_buffer(false), raw_stream(false) + { + } + virtual bool seek_frames(uint32_t track, uint32_t nbr_frames) + { + (void)track; + for(uint32_t f=0;f +#include "parser.h" +#include "read_util.h" +#include "simple_reader.h" + +class start_code_reader : public simple_reader +{ +protected: + int last_start_code_len; + uint64_t prev_offset; + bool include_start_codes_in_packet; + bool allow_start_codes_len_4; + parser *dec; + uint32_t start_code; + uint32_t start_code_mask; + packet_info next_packet; + bool seen_new_frame; + bool has_reset; + codec codec_id; +public: + + start_code_reader(uint32_t name, std::istream*file) : simple_reader(file), prev_offset(0),dec(NULL) + { + start_code = 0x00000001; + start_code_mask = 0x00ffffff; + allow_start_codes_len_4 = false; + include_start_codes_in_packet = false; + seen_new_frame = false; + raw_stream = true; + simple_reader::reset(0); + switch(name) + { + /*case RCODEC_VC1: + set_metadata(RMETA_CODEC, RCODEC_VC1_ADVANCED_PROFILE); + dec = new vc1_advanced_parser(); + break; + case RCODEC_MPEG2: + dec = new mpeg2_parser(); + break; + case RCODEC_MPEG4: + include_start_codes_in_packet = true; + dec = new mpeg4_parser(); + break;*/ + case V4L2_PIX_FMT_HEVC: + allow_start_codes_len_4 = true; + dec = new hevc_parser(); + break; + case V4L2_PIX_FMT_H264: + allow_start_codes_len_4 = true; + dec = new h264_parser(); + break; + /*case RCODEC_REAL_VIDEO: + dec = new rv_parser(); + break; + case RCODEC_AVS2: + allow_start_codes_len_4 = true; + dec = new avs2_parser(); + break;*/ + default: + break; + } + } + virtual ~start_code_reader() + { + if(dec!=NULL) + { + delete dec; + } + } + void reset() + { + has_reset = true; + prev_offset = 0; + seen_new_frame = false; + file->seekg(0); + } + + virtual bool read_packet(packet_info& packet) + { + if(has_reset) + { + read_next_packet(next_packet); + if(dec!=NULL) + { + parser::info info; + dec->parse(next_packet,info); + next_packet.codec_config = info.config; + seen_new_frame |= info.new_frame; + } + has_reset = false; + } + //printf("read_packet cc %d pos %d size %d\n",packet.codec_config,packet.file_pos,packet.size ); + packet=next_packet; + // read ahead to find end of frame + if(!next_packet.eos) + { + read_next_packet(next_packet); + + if(dec!=NULL) + { + parser::info info; + dec->parse(next_packet,info); + //printf("config %d seen_new_frame %d, new frame %d\n",info.config,seen_new_frame,info.new_frame); + if(seen_new_frame && (info.new_frame || info.config)) + { + packet.eof = true; + seen_new_frame = false; + } + seen_new_frame |= info.new_frame; + next_packet.codec_config = info.config; + } + } + else + { + packet.eof=true; + } + packet.file = next_packet.file; + return true; + } +private: + + bool read_next_packet(packet_info& packet) + { + + if(prev_offset==0) + { + find_first_start_code(); + } + + uint64_t next, prev = prev_offset; + uint32_t prefix; + + file->seekg(prev); + //printf("prev %x\n",prev); + next = seek_prefix(start_code_mask, start_code, prefix); + + int start_code_len = get_start_code_len(prefix); + + packet.prefix_size = last_start_code_len; + uint32_t size = (uint32_t)(next - prev); + if(include_start_codes_in_packet) + { + prev-=packet.prefix_size; + size+=packet.prefix_size; + packet.prefix_size=0; + } + + packet.file_pos = prev; + packet.eos=file->peek() == EOF; + packet.size = size - (!packet.eos?start_code_len:0); + packet.file = file; + prev_offset = next; + last_start_code_len = start_code_len; + //file->seekg(packet.file_pos); + return true; + + } + + + void find_first_start_code() + { + file->seekg(0); + uint32_t prefix; + prev_offset = seek_prefix(start_code_mask, start_code, prefix); + last_start_code_len = get_start_code_len(prefix); + } + + virtual int get_start_code_len(uint32_t prefix) + { + if(allow_start_codes_len_4 && (prefix&0xff000000)==0) + { + return 4; + } + else + { + return 3; + } + } + + bool seek_prefix_in_buffer(char* buffer, uint32_t buffer_size, uint32_t mask, uint32_t match,uint64_t &found_pos, uint32_t &check ) + { + for(uint32_t i=0;iread(static_cast(buf),SEEK_PREFIX_BUF_SIZE); + uint32_t bytes = file->gcount(); + + if( bytes == 0 ) + { + break; + } + uint64_t pos; + if(seek_prefix_in_buffer(buf,bytes,mask,match,pos,check)) + { + if(bytes < SEEK_PREFIX_BUF_SIZE) { + file->clear(); + } + file->seekg( pos-bytes, std::ios::cur ); + break; + } else if(bytes < SEEK_PREFIX_BUF_SIZE) { + file->clear(); + break; + } + } + outprefix = check; + return file->tellg(); + } +}; + +#endif diff --git a/src/little/linux/arch/riscv/boot/dts/kendryte/clock_consumer.dtsi b/src/little/linux/arch/riscv/boot/dts/kendryte/clock_consumer.dtsi index e45096b8f..598d29f7a 100755 --- a/src/little/linux/arch/riscv/boot/dts/kendryte/clock_consumer.dtsi +++ b/src/little/linux/arch/riscv/boot/dts/kendryte/clock_consumer.dtsi @@ -29,6 +29,11 @@ clock-names = "vglite"; }; +&vpu { + clocks = <&vpu_src>; + clock-names = "vpu"; +}; + &mmc_sd0 { clocks = <&sd0_cclk_gate>,<&sd0_cclk_gate>; clock-names = "core", "bus"; diff --git a/src/little/linux/arch/riscv/boot/dts/kendryte/clock_provider.dtsi b/src/little/linux/arch/riscv/boot/dts/kendryte/clock_provider.dtsi index 832880ebd..7842a2ede 100755 --- a/src/little/linux/arch/riscv/boot/dts/kendryte/clock_provider.dtsi +++ b/src/little/linux/arch/riscv/boot/dts/kendryte/clock_provider.dtsi @@ -2892,7 +2892,119 @@ clk-gate-reg-bit-reverse = <0>; }; + /* vpu system clock tree + pll0_div2--->DIV--->GATE--->|-------------------------->vpu core clk + |--->DIV----->|-----GATE--->vpu axi clk + |-----GATE--->ddrc p2 clk + 1. vpu_src: vpu core clk DIV & GATE + 2. vpu_aclk_src: vpu aclk DIV + 3. vpu_aclk: vpu aclk GATE + 4. vpu_ddrcp2: ddrc p2 clk GATE + + 1. vpu_cfg: vpu cfg clk DIV & GATE + */ + vpu_src: vpu_src { + #clock-cells = <0>; + compatible = "canaan,k230-clk-composite"; + clocks = <&pll0_div2>; + status = "okay"; + read-only = <0>; /* 1 means read-only, 0 means read-write */ + + /* rate */ + clk-rate-conf-mul-min = <1>; + clk-rate-conf-mul-max = <16>; + clk-rate-conf-div-min = <16>; + clk-rate-conf-div-max = <16>; + clk-rate-calc-method = <0>; /* 0 for mul changeabled, 1 for div changeabled, 2 for div&mul changeable */ + + clk-rate-reg-offset = <0xC>; /* divider register offset */ + clk-rate-reg-mul-value-shift = <0>; /* multiple field shift. It's valid when clk-rate-calc-method = 2 */ + clk-rate-reg-mul-value-mask = <0>; /* multiple field mask. It's valid when clk-rate-calc-method = 2 */ + clk-rate-reg-div-value-shift = <1>; /* divider field shift. */ + clk-rate-reg-div-value-mask = <0xF>; /* divider field mask. */ + clk-rate-reg-write-enable-bit = <31>; + + /* gate */ + clk-gate-reg-offset = <0xC>; + clk-gate-reg-bit-enable = <0>; + clk-gate-reg-bit-reverse = <0>; + }; + + vpu_aclk_src: vpu_aclk_src { + #clock-cells = <0>; + compatible = "canaan,k230-clk-composite"; + clocks = <&vpu_src>; + status = "okay"; + read-only = <0>; /* 1 means read-only, 0 means read-write */ + + /* rate */ + clk-rate-conf-mul-min = <1>; + clk-rate-conf-mul-max = <1>; + clk-rate-conf-div-min = <1>; + clk-rate-conf-div-max = <16>; + clk-rate-calc-method = <1>; /* 0 for mul changeabled, 1 for div changeabled, 2 for div&mul changeable */ + + clk-rate-reg-offset = <0xC>; /* divider register offset */ + clk-rate-reg-mul-value-shift = <0>; /* multiple field shift. It's valid when clk-rate-calc-method = 2 */ + clk-rate-reg-mul-value-mask = <0>; /* multiple field mask. It's valid when clk-rate-calc-method = 2 */ + clk-rate-reg-div-value-shift = <6>; /* divider field shift. */ + clk-rate-reg-div-value-mask = <0xF>; /* divider field mask. */ + clk-rate-reg-write-enable-bit = <31>; + }; + + vpu_aclk: vpu_aclk { + #clock-cells = <0>; + compatible = "canaan,k230-clk-composite"; + clocks = <&vpu_aclk_src>; + status = "okay"; + read-only = <0>; /* 1 means read-only, 0 means read-write */ + + /* gate */ + clk-gate-reg-offset = <0xc>; + clk-gate-reg-bit-enable = <5>; + clk-gate-reg-bit-reverse = <0>; + }; + + vpu_ddrcp2: vpu_ddrcp2 { + #clock-cells = <0>; + compatible = "canaan,k230-clk-composite"; + clocks = <&vpu_aclk_src>; + status = "okay"; + read-only = <0>; /* 1 means read-only, 0 means read-write */ + + /* gate */ + clk-gate-reg-offset = <0x60>; + clk-gate-reg-bit-enable = <5>; + clk-gate-reg-bit-reverse = <0>; + }; + + vpu_cfg: vpu_cfg { + #clock-cells = <0>; + compatible = "canaan,k230-clk-composite"; + clocks = <&pll0_div4>; + status = "okay"; + read-only = <0>; /* 1 means read-only, 0 means read-write */ + + /* rate */ + clk-rate-conf-mul-min = <1>; + clk-rate-conf-mul-max = <1>; + clk-rate-conf-div-min = <1>; + clk-rate-conf-div-max = <16>; + clk-rate-calc-method = <1>; /* 0 for mul changeabled, 1 for div changeabled, 2 for div&mul changeable */ + + clk-rate-reg-offset = <0xC>; /* divider register offset */ + clk-rate-reg-mul-value-shift = <0>; /* multiple field shift. It's valid when clk-rate-calc-method = 2 */ + clk-rate-reg-mul-value-mask = <0>; /* multiple field mask. It's valid when clk-rate-calc-method = 2 */ + clk-rate-reg-div-value-shift = <11>; /* divider field shift. */ + clk-rate-reg-div-value-mask = <0xF>; /* divider field mask. */ + clk-rate-reg-write-enable-bit = <31>; + + /* gate */ + clk-gate-reg-offset = <0xC>; + clk-gate-reg-bit-enable = <10>; + clk-gate-reg-bit-reverse = <0>; + }; /* sec system clock tree pll0_div4--->|---DIV--->GATE--->sec apb clk diff --git a/src/little/linux/arch/riscv/boot/dts/kendryte/gpio_provider.dtsi b/src/little/linux/arch/riscv/boot/dts/kendryte/gpio_provider.dtsi index 60e70324f..5daf9e5e6 100755 --- a/src/little/linux/arch/riscv/boot/dts/kendryte/gpio_provider.dtsi +++ b/src/little/linux/arch/riscv/boot/dts/kendryte/gpio_provider.dtsi @@ -1286,4 +1286,132 @@ id =<63>; }; }; + gpio64: gpio64@9140c000 { + #address-cells = <0>; + #size-cells = <0>; + compatible = "canaan,k230-apb-gpio"; + reg = <0x0 0x9140c000 0x0 0x1000>; + hardlock = <0>; + status = "disabled"; + + port64: gpio-controller@0 { + gpio-controller; + #gpio-cells = <2>; + ngpios = <1>; + reg-bank = <1>; + id =<64>; + }; + }; + gpio65: gpio65@9140c000 { + #address-cells = <0>; + #size-cells = <0>; + compatible = "canaan,k230-apb-gpio"; + reg = <0x0 0x9140c000 0x0 0x1000>; + hardlock = <0>; + status = "disabled"; + + port65: gpio-controller@0 { + gpio-controller; + #gpio-cells = <2>; + ngpios = <1>; + reg-bank = <1>; + id =<65>; + }; + }; + gpio66: gpio66@9140c000 { + #address-cells = <0>; + #size-cells = <0>; + compatible = "canaan,k230-apb-gpio"; + reg = <0x0 0x9140c000 0x0 0x1000>; + hardlock = <0>; + status = "disabled"; + + port66: gpio-controller@0 { + gpio-controller; + #gpio-cells = <2>; + ngpios = <1>; + reg-bank = <1>; + id =<66>; + }; + }; + gpio67: gpio67@9140c000 { + #address-cells = <0>; + #size-cells = <0>; + compatible = "canaan,k230-apb-gpio"; + reg = <0x0 0x9140c000 0x0 0x1000>; + hardlock = <0>; + status = "disabled"; + + port67: gpio-controller@0 { + gpio-controller; + #gpio-cells = <2>; + ngpios = <1>; + reg-bank = <1>; + id =<67>; + }; + }; + gpio68: gpio68@9140c000 { + #address-cells = <0>; + #size-cells = <0>; + compatible = "canaan,k230-apb-gpio"; + reg = <0x0 0x9140c000 0x0 0x1000>; + hardlock = <0>; + status = "disabled"; + + port68: gpio-controller@0 { + gpio-controller; + #gpio-cells = <2>; + ngpios = <1>; + reg-bank = <1>; + id =<68>; + }; + }; + gpio69: gpio69@9140c000 { + #address-cells = <0>; + #size-cells = <0>; + compatible = "canaan,k230-apb-gpio"; + reg = <0x0 0x9140c000 0x0 0x1000>; + hardlock = <0>; + status = "disabled"; + + port69: gpio-controller@0 { + gpio-controller; + #gpio-cells = <2>; + ngpios = <1>; + reg-bank = <1>; + id =<69>; + }; + }; + gpio70: gpio70@9140c000 { + #address-cells = <0>; + #size-cells = <0>; + compatible = "canaan,k230-apb-gpio"; + reg = <0x0 0x9140c000 0x0 0x1000>; + hardlock = <0>; + status = "disabled"; + + port70: gpio-controller@0 { + gpio-controller; + #gpio-cells = <2>; + ngpios = <1>; + reg-bank = <1>; + id =<70>; + }; + }; + gpio71: gpio71@9140c000 { + #address-cells = <0>; + #size-cells = <0>; + compatible = "canaan,k230-apb-gpio"; + reg = <0x0 0x9140c000 0x0 0x1000>; + hardlock = <0>; + status = "disabled"; + + port71: gpio-controller@0 { + gpio-controller; + #gpio-cells = <2>; + ngpios = <1>; + reg-bank = <1>; + id =<71>; + }; + }; }; diff --git a/src/little/linux/arch/riscv/boot/dts/kendryte/k230.dtsi b/src/little/linux/arch/riscv/boot/dts/kendryte/k230.dtsi index db21d7c82..919fc7889 100755 --- a/src/little/linux/arch/riscv/boot/dts/kendryte/k230.dtsi +++ b/src/little/linux/arch/riscv/boot/dts/kendryte/k230.dtsi @@ -226,6 +226,15 @@ status = "okay"; }; + vpu: vpu@0x90400000 { + status = "okay"; + compatible = "armChina,linlon-v5","armChina,linlon-v8"; + reg = <0x0 0x90400000 0x0 0x10000>; + interrupt-parent = <&intc>; + interrupts = <132>; + }; + + pmu_thead: pmu_thead { interrupt-parent = <&cpu0_intc>; interrupts = <17>; diff --git a/src/little/linux/arch/riscv/boot/dts/kendryte/k230_canmv_01studio.dts b/src/little/linux/arch/riscv/boot/dts/kendryte/k230_canmv_01studio.dts new file mode 100755 index 000000000..344c7373e --- /dev/null +++ b/src/little/linux/arch/riscv/boot/dts/kendryte/k230_canmv_01studio.dts @@ -0,0 +1,79 @@ +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. +*/ +#include "k230.dtsi" +#include "clock_provider.dtsi" /* k230 soc clock tree */ +#include "clock_consumer.dtsi" /* k230 soc clock consumer */ +#include "reset_provider.dtsi" /* k230 soc reset provider */ +#include "reset_consumer.dtsi" /* k230 soc reset consumer */ +#include "power_provider.dtsi" /* k230 soc power provider */ +#include "power_consumer.dtsi" /* k230 soc power consumer */ +#include "gpio_provider.dtsi" /* k230 soc gpio provider */ +#include "gpio_consumer.dtsi" /* k230 soc gpio consumer */ + + +/ { + aliases { + serial0 = &uart0; + }; + + chosen { + bootargs = ""; + linux,initrd-start = <0x0 0xa100000>; + linux,initrd-end = <0x0 0x0>; + stdout-path = "serial0:115200"; + }; +}; +&ddr { + reg = <0x0 0x8200000 0x0 0x7dff000>; /*linux memory config*/ +}; + +&usbotg0 { + status = "okay"; +}; + +&usbotg1 { + dr_mode = "host"; + status = "okay"; +}; + +&mmc_sd0{ + status = "okay"; + no-1-8-v; + cap-sd-highspeed; + rx_delay_line = <0x00>; + tx_delay_line = <0xb0>; +}; + +&mmc_sd1{ + status = "okay"; + no-1-8-v; + cap-sd-highspeed; + mshc_ctrl_r = <0x00>; +}; + +&uart0 { + status = "okay"; +}; + +&gpio22 { + status = "okay"; +}; + +&gpio23 { + status = "okay"; +}; + +&i2c3 { + status = "okay"; + touchscreen@38 { + compatible = "edt,edt-ft5306"; + reg = <0x38>; + interrupt-parent = <&port23>; + interrupts = <0 IRQ_TYPE_EDGE_FALLING>; + reset-gpios = <&port22 0 GPIO_ACTIVE_LOW>; + }; +}; diff --git a/src/little/linux/arch/riscv/boot/dts/kendryte/k230_canmv_v2.dts b/src/little/linux/arch/riscv/boot/dts/kendryte/k230_canmv_v2.dts new file mode 100755 index 000000000..17c59ce1b --- /dev/null +++ b/src/little/linux/arch/riscv/boot/dts/kendryte/k230_canmv_v2.dts @@ -0,0 +1,81 @@ +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. +*/ +#include "k230.dtsi" +#include "clock_provider.dtsi" /* k230 soc clock tree */ +#include "clock_consumer.dtsi" /* k230 soc clock consumer */ +#include "reset_provider.dtsi" /* k230 soc reset provider */ +#include "reset_consumer.dtsi" /* k230 soc reset consumer */ +#include "power_provider.dtsi" /* k230 soc power provider */ +#include "power_consumer.dtsi" /* k230 soc power consumer */ +#include "gpio_provider.dtsi" /* k230 soc gpio provider */ +#include "gpio_consumer.dtsi" /* k230 soc gpio consumer */ + + +/ { + aliases { + serial0 = &uart0; + }; + + chosen { + bootargs = ""; + linux,initrd-start = <0x0 0xa100000>; + linux,initrd-end = <0x0 0x0>; + stdout-path = "serial0:115200"; + }; +}; +&ddr { + reg = <0x0 0x8200000 0x0 0x7dff000>; /*linux memory config*/ +}; + +&usbotg0 { + status = "okay"; +}; + +&usbotg1 { + dr_mode = "host"; + status = "okay"; +}; + +&mmc_sd0{ + status = "okay"; + rx_delay_line = <0x00>; + tx_delay_line = <0xc0>; +}; + +&mmc_sd1{ + status = "okay"; + no-1-8-v; + cap-sd-highspeed; + mshc_ctrl_r = <0x00>; +}; + +&dsi { + status = "okay"; + + panel@0 { + compatible = "canaan,hx8399"; + reg = <0>; + + display-timings { + timing-0 { + clock-frequency = <74250000>; + hactive = <1920>; + vactive = <1080>; + hfront-porch = <88>; + hback-porch = <148>; + hsync-len = <44>; + vfront-porch = <36>; + vback-porch = <4>; + vsync-len = <5>; + }; + }; + }; +}; + +&uart0 { + status = "okay"; +}; diff --git a/src/little/linux/arch/riscv/boot/dts/kendryte/power_consumer.dtsi b/src/little/linux/arch/riscv/boot/dts/kendryte/power_consumer.dtsi index b51dfde35..368ea5b8d 100755 --- a/src/little/linux/arch/riscv/boot/dts/kendryte/power_consumer.dtsi +++ b/src/little/linux/arch/riscv/boot/dts/kendryte/power_consumer.dtsi @@ -24,3 +24,8 @@ &display { power-domains = <&sysctl_power K230_PM_DOMAIN_DISP>; }; + +&vpu { + power-domains = <&sysctl_power K230_PM_DOMAIN_VPU>; +}; + diff --git a/src/little/linux/arch/riscv/configs/k230_canmv_01studio_defconfig b/src/little/linux/arch/riscv/configs/k230_canmv_01studio_defconfig new file mode 100755 index 000000000..eca6cc9db --- /dev/null +++ b/src/little/linux/arch/riscv/configs/k230_canmv_01studio_defconfig @@ -0,0 +1,405 @@ +# CONFIG_LOCALVERSION_AUTO is not set +CONFIG_SYSVIPC=y +CONFIG_POSIX_MQUEUE=y +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=y +CONFIG_CGROUPS=y +CONFIG_CGROUP_SCHED=y +CONFIG_CFS_BANDWIDTH=y +CONFIG_CGROUP_BPF=y +CONFIG_NAMESPACES=y +CONFIG_USER_NS=y +CONFIG_CHECKPOINT_RESTORE=y +CONFIG_BLK_DEV_INITRD=y +CONFIG_EXPERT=y +CONFIG_BPF_SYSCALL=y +CONFIG_PERF_EVENTS=y +CONFIG_SOC_THEAD=y +CONFIG_SMP=y +CONFIG_PM=y +CONFIG_KPROBES=y +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +CONFIG_PARTITION_ADVANCED=y +CONFIG_ACORN_PARTITION=y +CONFIG_ACORN_PARTITION_CUMANA=y +CONFIG_ACORN_PARTITION_EESOX=y +CONFIG_ACORN_PARTITION_ICS=y +CONFIG_ACORN_PARTITION_ADFS=y +CONFIG_ACORN_PARTITION_POWERTEC=y +CONFIG_ACORN_PARTITION_RISCIX=y +CONFIG_AIX_PARTITION=y +CONFIG_OSF_PARTITION=y +CONFIG_AMIGA_PARTITION=y +CONFIG_ATARI_PARTITION=y +CONFIG_MAC_PARTITION=y +CONFIG_BSD_DISKLABEL=y +CONFIG_MINIX_SUBPARTITION=y +CONFIG_SOLARIS_X86_PARTITION=y +CONFIG_UNIXWARE_DISKLABEL=y +CONFIG_LDM_PARTITION=y +CONFIG_LDM_DEBUG=y +CONFIG_SGI_PARTITION=y +CONFIG_ULTRIX_PARTITION=y +CONFIG_SUN_PARTITION=y +CONFIG_KARMA_PARTITION=y +CONFIG_SYSV68_PARTITION=y +CONFIG_CMDLINE_PARTITION=y +CONFIG_NET=y +CONFIG_PACKET=y +CONFIG_UNIX=y +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +CONFIG_IP_ADVANCED_ROUTER=y +CONFIG_IP_PNP=y +CONFIG_IP_PNP_DHCP=y +CONFIG_IP_PNP_BOOTP=y +CONFIG_IP_PNP_RARP=y +CONFIG_NETLINK_DIAG=y +CONFIG_CFG80211=y +# CONFIG_CFG80211_DEFAULT_PS is not set +# CONFIG_CFG80211_CRDA_SUPPORT is not set +CONFIG_CFG80211_WEXT=y +CONFIG_MAC80211=y +CONFIG_NET_9P=y +CONFIG_NET_9P_VIRTIO=y +CONFIG_NET_9P_DEBUG=y +CONFIG_DEVTMPFS=y +CONFIG_DEVTMPFS_MOUNT=y +CONFIG_MTD=y +CONFIG_MTD_TESTS=m +CONFIG_MTD_CMDLINE_PARTS=y +CONFIG_MTD_BLOCK=y +CONFIG_MTD_RAW_NAND=y +CONFIG_MTD_SPI_NAND=y +CONFIG_MTD_SPI_NOR=y +# CONFIG_MTD_SPI_NOR_USE_4K_SECTORS is not set +CONFIG_MTD_UBI=y +CONFIG_BLK_DEV_LOOP=y +CONFIG_VIRTIO_BLK=y +CONFIG_EEPROM_AT24=y +CONFIG_SCSI=y +CONFIG_BLK_DEV_SD=y +CONFIG_NETDEVICES=y +# CONFIG_ETHERNET is not set +CONFIG_MARVELL_PHY=y +CONFIG_PCS_XPCS=y +CONFIG_USB_CATC=y +CONFIG_USB_KAWETH=y +CONFIG_USB_PEGASUS=y +CONFIG_USB_RTL8150=y +CONFIG_USB_RTL8152=y +CONFIG_USB_LAN78XX=y +CONFIG_USB_USBNET=y +# CONFIG_WLAN_VENDOR_ADMTEK is not set +# CONFIG_WLAN_VENDOR_AICH is not set +# CONFIG_WLAN_VENDOR_ATH is not set +# CONFIG_WLAN_VENDOR_ATMEL is not set +# CONFIG_WLAN_VENDOR_BROADCOM is not set +# CONFIG_WLAN_VENDOR_CISCO is not set +# CONFIG_WLAN_VENDOR_INTEL is not set +# CONFIG_WLAN_VENDOR_INTERSIL is not set +# CONFIG_WLAN_VENDOR_MARVELL is not set +# CONFIG_WLAN_VENDOR_MEDIATEK is not set +# CONFIG_WLAN_VENDOR_MICROCHIP is not set +# CONFIG_WLAN_VENDOR_RALINK is not set +# CONFIG_WLAN_VENDOR_REALTEK is not set +# CONFIG_WLAN_VENDOR_RSI is not set +# CONFIG_WLAN_VENDOR_ST is not set +# CONFIG_WLAN_VENDOR_TI is not set +# CONFIG_WLAN_VENDOR_ZYDAS is not set +# CONFIG_WLAN_VENDOR_QUANTENNA is not set +CONFIG_RTL8189FS=y +CONFIG_NET_FAILOVER=y +CONFIG_INPUT_EVDEV=y +CONFIG_KEYBOARD_GPIO=y +# CONFIG_MOUSE_PS2 is not set +CONFIG_INPUT_TOUCHSCREEN=y +CONFIG_TOUCHSCREEN_GOODIX=y +CONFIG_TOUCHSCREEN_EDT_FT5X06=y +# CONFIG_SERIO_SERPORT is not set +CONFIG_SERIAL_8250=y +# CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set +CONFIG_SERIAL_8250_CONSOLE=y +CONFIG_SERIAL_8250_NR_UARTS=5 +CONFIG_SERIAL_8250_RUNTIME_UARTS=5 +CONFIG_SERIAL_8250_DW=y +CONFIG_SERIAL_OF_PLATFORM=y +CONFIG_SERIAL_EARLYCON_RISCV_SBI=y +CONFIG_HVC_RISCV_SBI=y +CONFIG_HW_RANDOM=y +CONFIG_HW_RANDOM_VIRTIO=y +CONFIG_I2C_CHARDEV=y +CONFIG_I2C_MUX=y +CONFIG_I2C_DESIGNWARE_PLATFORM=y +CONFIG_I2C_DESIGNWARE_ICE=y +CONFIG_SPI=y +CONFIG_SPI_DEBUG=y +CONFIG_SPI_DESIGNWARE=y +CONFIG_SPI_DW_DMA=y +CONFIG_SPI_DW_MMIO=y +CONFIG_GPIOLIB=y +CONFIG_DEBUG_GPIO=y +CONFIG_GPIO_SYSFS=y +CONFIG_GPIO_DWAPB=y +CONFIG_POWER_RESET=y +CONFIG_POWER_SUPPLY=y +# CONFIG_HWMON is not set +CONFIG_THERMAL=y +CONFIG_CANAAN_THERMAL=y +CONFIG_WATCHDOG=y +CONFIG_DW_WATCHDOG=y +CONFIG_MFD_SYSCON=y +# CONFIG_MEDIA_CEC_SUPPORT is not set +CONFIG_MEDIA_SUPPORT=y +# CONFIG_DVB_NET is not set +# CONFIG_DVB_DYNAMIC_MINORS is not set +# CONFIG_RADIO_ADAPTERS is not set +# CONFIG_CXD2880_SPI_DRV is not set +# CONFIG_MEDIA_TUNER_SIMPLE is not set +# CONFIG_MEDIA_TUNER_TDA18250 is not set +# CONFIG_MEDIA_TUNER_TDA8290 is not set +# CONFIG_MEDIA_TUNER_TDA827X is not set +# CONFIG_MEDIA_TUNER_TDA18271 is not set +# CONFIG_MEDIA_TUNER_TDA9887 is not set +# CONFIG_MEDIA_TUNER_TEA5761 is not set +# CONFIG_MEDIA_TUNER_TEA5767 is not set +# CONFIG_MEDIA_TUNER_MSI001 is not set +# CONFIG_MEDIA_TUNER_MT20XX is not set +# CONFIG_MEDIA_TUNER_MT2060 is not set +# CONFIG_MEDIA_TUNER_MT2063 is not set +# CONFIG_MEDIA_TUNER_MT2266 is not set +# CONFIG_MEDIA_TUNER_MT2131 is not set +# CONFIG_MEDIA_TUNER_QT1010 is not set +# CONFIG_MEDIA_TUNER_XC2028 is not set +# CONFIG_MEDIA_TUNER_XC5000 is not set +# CONFIG_MEDIA_TUNER_XC4000 is not set +# CONFIG_MEDIA_TUNER_MXL5005S is not set +# CONFIG_MEDIA_TUNER_MXL5007T is not set +# CONFIG_MEDIA_TUNER_MC44S803 is not set +# CONFIG_MEDIA_TUNER_MAX2165 is not set +# CONFIG_MEDIA_TUNER_TDA18218 is not set +# CONFIG_MEDIA_TUNER_FC0011 is not set +# CONFIG_MEDIA_TUNER_FC0012 is not set +# CONFIG_MEDIA_TUNER_FC0013 is not set +# CONFIG_MEDIA_TUNER_TDA18212 is not set +# CONFIG_MEDIA_TUNER_E4000 is not set +# CONFIG_MEDIA_TUNER_FC2580 is not set +# CONFIG_MEDIA_TUNER_M88RS6000T is not set +# CONFIG_MEDIA_TUNER_TUA9001 is not set +# CONFIG_MEDIA_TUNER_SI2157 is not set +# CONFIG_MEDIA_TUNER_IT913X is not set +# CONFIG_MEDIA_TUNER_R820T is not set +# CONFIG_MEDIA_TUNER_MXL301RF is not set +# CONFIG_MEDIA_TUNER_QM1D1C0042 is not set +# CONFIG_MEDIA_TUNER_QM1D1B0004 is not set +# CONFIG_DVB_STB0899 is not set +# CONFIG_DVB_STB6100 is not set +# CONFIG_DVB_STV090x is not set +# CONFIG_DVB_STV0910 is not set +# CONFIG_DVB_STV6110x is not set +# CONFIG_DVB_STV6111 is not set +# CONFIG_DVB_MXL5XX is not set +# CONFIG_DVB_M88DS3103 is not set +# CONFIG_DVB_DRXK is not set +# CONFIG_DVB_TDA18271C2DD is not set +# CONFIG_DVB_SI2165 is not set +# CONFIG_DVB_MN88472 is not set +# CONFIG_DVB_MN88473 is not set +# CONFIG_DVB_CX24110 is not set +# CONFIG_DVB_CX24123 is not set +# CONFIG_DVB_MT312 is not set +# CONFIG_DVB_ZL10036 is not set +# CONFIG_DVB_ZL10039 is not set +# CONFIG_DVB_S5H1420 is not set +# CONFIG_DVB_STV0288 is not set +# CONFIG_DVB_STB6000 is not set +# CONFIG_DVB_STV0299 is not set +# CONFIG_DVB_STV6110 is not set +# CONFIG_DVB_STV0900 is not set +# CONFIG_DVB_TDA8083 is not set +# CONFIG_DVB_TDA10086 is not set +# CONFIG_DVB_TDA8261 is not set +# CONFIG_DVB_VES1X93 is not set +# CONFIG_DVB_TUNER_ITD1000 is not set +# CONFIG_DVB_TUNER_CX24113 is not set +# CONFIG_DVB_TDA826X is not set +# CONFIG_DVB_TUA6100 is not set +# CONFIG_DVB_CX24116 is not set +# CONFIG_DVB_CX24117 is not set +# CONFIG_DVB_CX24120 is not set +# CONFIG_DVB_SI21XX is not set +# CONFIG_DVB_TS2020 is not set +# CONFIG_DVB_DS3000 is not set +# CONFIG_DVB_MB86A16 is not set +# CONFIG_DVB_TDA10071 is not set +# CONFIG_DVB_SP8870 is not set +# CONFIG_DVB_SP887X is not set +# CONFIG_DVB_CX22700 is not set +# CONFIG_DVB_CX22702 is not set +# CONFIG_DVB_S5H1432 is not set +# CONFIG_DVB_DRXD is not set +# CONFIG_DVB_L64781 is not set +# CONFIG_DVB_TDA1004X is not set +# CONFIG_DVB_NXT6000 is not set +# CONFIG_DVB_MT352 is not set +# CONFIG_DVB_ZL10353 is not set +# CONFIG_DVB_DIB3000MB is not set +# CONFIG_DVB_DIB3000MC is not set +# CONFIG_DVB_DIB7000M is not set +# CONFIG_DVB_DIB7000P is not set +# CONFIG_DVB_DIB9000 is not set +# CONFIG_DVB_TDA10048 is not set +# CONFIG_DVB_AF9013 is not set +# CONFIG_DVB_EC100 is not set +# CONFIG_DVB_STV0367 is not set +# CONFIG_DVB_CXD2820R is not set +# CONFIG_DVB_CXD2841ER is not set +# CONFIG_DVB_RTL2830 is not set +# CONFIG_DVB_RTL2832 is not set +# CONFIG_DVB_RTL2832_SDR is not set +# CONFIG_DVB_SI2168 is not set +# CONFIG_DVB_ZD1301_DEMOD is not set +# CONFIG_DVB_CXD2880 is not set +# CONFIG_DVB_VES1820 is not set +# CONFIG_DVB_TDA10021 is not set +# CONFIG_DVB_TDA10023 is not set +# CONFIG_DVB_STV0297 is not set +# CONFIG_DVB_NXT200X is not set +# CONFIG_DVB_OR51211 is not set +# CONFIG_DVB_OR51132 is not set +# CONFIG_DVB_BCM3510 is not set +# CONFIG_DVB_LGDT330X is not set +# CONFIG_DVB_LGDT3305 is not set +# CONFIG_DVB_LGDT3306A is not set +# CONFIG_DVB_LG2160 is not set +# CONFIG_DVB_S5H1409 is not set +# CONFIG_DVB_AU8522_DTV is not set +# CONFIG_DVB_AU8522_V4L is not set +# CONFIG_DVB_S5H1411 is not set +# CONFIG_DVB_S921 is not set +# CONFIG_DVB_DIB8000 is not set +# CONFIG_DVB_MB86A20S is not set +# CONFIG_DVB_TC90522 is not set +# CONFIG_DVB_MN88443X is not set +# CONFIG_DVB_PLL is not set +# CONFIG_DVB_TUNER_DIB0070 is not set +# CONFIG_DVB_TUNER_DIB0090 is not set +# CONFIG_DVB_DRX39XYJ is not set +# CONFIG_DVB_LNBH25 is not set +# CONFIG_DVB_LNBH29 is not set +# CONFIG_DVB_LNBP21 is not set +# CONFIG_DVB_LNBP22 is not set +# CONFIG_DVB_ISL6405 is not set +# CONFIG_DVB_ISL6421 is not set +# CONFIG_DVB_ISL6423 is not set +# CONFIG_DVB_A8293 is not set +# CONFIG_DVB_LGS8GL5 is not set +# CONFIG_DVB_LGS8GXX is not set +# CONFIG_DVB_ATBM8830 is not set +# CONFIG_DVB_TDA665x is not set +# CONFIG_DVB_IX2505V is not set +# CONFIG_DVB_M88RS2000 is not set +# CONFIG_DVB_AF9033 is not set +# CONFIG_DVB_HORUS3A is not set +# CONFIG_DVB_ASCOT2E is not set +# CONFIG_DVB_HELENE is not set +# CONFIG_DVB_CXD2099 is not set +# CONFIG_DVB_SP2 is not set +CONFIG_DRM=y +CONFIG_DRM_PANEL_CANAAN_UNIVERSAL=y +CONFIG_DRM_CANAAN=y +CONFIG_DRM_CANAAN_DSI=y +CONFIG_VG_LITE=m +CONFIG_FB_VIRTUAL=m +CONFIG_FB_SIMPLE=y +CONFIG_LCD_CLASS_DEVICE=y +CONFIG_BACKLIGHT_CLASS_DEVICE=y +# CONFIG_VGA_CONSOLE is not set +CONFIG_USB=y +CONFIG_USB_ANNOUNCE_NEW_DEVICES=y +CONFIG_USB_STORAGE=y +CONFIG_USB_DWC2=y +CONFIG_USB_TEST=m +CONFIG_USB_GADGET=y +CONFIG_USB_SNP_UDC_PLAT=y +CONFIG_USB_CONFIGFS=y +CONFIG_USB_CONFIGFS_MASS_STORAGE=y +CONFIG_USB_CONFIGFS_F_LB_SS=y +CONFIG_USB_CONFIGFS_F_HID=y +CONFIG_USB_CONFIGFS_F_UVC=y +CONFIG_MMC=y +CONFIG_MMC_DEBUG=y +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_PLTFM=y +CONFIG_MMC_SDHCI_OF_KENDRYTE=y +CONFIG_NEW_LEDS=y +CONFIG_LEDS_CLASS=y +CONFIG_LEDS_GPIO=y +CONFIG_LEDS_TRIGGERS=y +CONFIG_LEDS_TRIGGER_CPU=y +CONFIG_DMADEVICES=y +CONFIG_DW_AXI_DMAC=y +CONFIG_DMATEST=y +CONFIG_VIRTIO_BALLOON=y +CONFIG_VIRTIO_MMIO=y +CONFIG_IIO=y +CONFIG_PWM=y +CONFIG_PWM_K230=y +CONFIG_SIFIVE_PLIC=y +CONFIG_RESET_CONTROLLER=y +CONFIG_GENERIC_PHY=y +CONFIG_RAS=y +CONFIG_NVMEM_KENDRYTE_K230_OTP=y +CONFIG_EXT2_FS=y +CONFIG_EXT2_FS_XATTR=y +CONFIG_EXT2_FS_POSIX_ACL=y +CONFIG_EXT2_FS_SECURITY=y +CONFIG_EXT4_FS=y +CONFIG_EXT4_FS_POSIX_ACL=y +CONFIG_AUTOFS4_FS=y +CONFIG_FUSE_FS=y +CONFIG_MSDOS_FS=y +CONFIG_VFAT_FS=y +CONFIG_FAT_DEFAULT_UTF8=y +CONFIG_EXFAT_FS=y +CONFIG_NTFS_FS=y +CONFIG_NTFS_RW=y +CONFIG_TMPFS=y +CONFIG_TMPFS_POSIX_ACL=y +CONFIG_HFS_FS=y +CONFIG_HFSPLUS_FS=y +CONFIG_JFFS2_FS=y +CONFIG_JFFS2_COMPRESSION_OPTIONS=y +CONFIG_UBIFS_FS=y +CONFIG_UBIFS_FS_ADVANCED_COMPR=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_9P_FS_POSIX_ACL=y +CONFIG_9P_FS_SECURITY=y +CONFIG_NLS_CODEPAGE_437=y +CONFIG_NLS_CODEPAGE_936=y +CONFIG_NLS_CODEPAGE_1250=y +CONFIG_NLS_CODEPAGE_1251=y +CONFIG_NLS_ISO8859_1=y +CONFIG_LSM="lockdown,yama,loadpin,safesetid,integrity" +CONFIG_CRYPTO_USER=y +CONFIG_CRYPTO_MICHAEL_MIC=y +CONFIG_CRYPTO_USER_API_HASH=y +CONFIG_CRYPTO_USER_API_AEAD=y +CONFIG_CRYPTO_DEV_VIRTIO=y +CONFIG_CRYPTO_DEV_CANAAN=y +CONFIG_CRYPTO_DEV_KENDRYTE_CRYP=y +CONFIG_PRINTK_TIME=y +CONFIG_DEBUG_INFO=y +# CONFIG_ENABLE_MUST_CHECK is not set +CONFIG_MAGIC_SYSRQ=y +CONFIG_DEBUG_FS=y +CONFIG_DETECT_HUNG_TASK=y +CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=60 +CONFIG_DEBUG_ATOMIC_SLEEP=y +# CONFIG_RCU_TRACE is not set diff --git a/src/little/linux/arch/riscv/configs/k230_canmv_v2_defconfig b/src/little/linux/arch/riscv/configs/k230_canmv_v2_defconfig new file mode 100755 index 000000000..ee4db0d9d --- /dev/null +++ b/src/little/linux/arch/riscv/configs/k230_canmv_v2_defconfig @@ -0,0 +1,401 @@ +# CONFIG_LOCALVERSION_AUTO is not set +CONFIG_SYSVIPC=y +CONFIG_POSIX_MQUEUE=y +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=y +CONFIG_CGROUPS=y +CONFIG_CGROUP_SCHED=y +CONFIG_CFS_BANDWIDTH=y +CONFIG_CGROUP_BPF=y +CONFIG_NAMESPACES=y +CONFIG_USER_NS=y +CONFIG_CHECKPOINT_RESTORE=y +CONFIG_BLK_DEV_INITRD=y +CONFIG_EXPERT=y +CONFIG_BPF_SYSCALL=y +CONFIG_PERF_EVENTS=y +CONFIG_SOC_THEAD=y +CONFIG_SMP=y +CONFIG_PM=y +CONFIG_KPROBES=y +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +CONFIG_PARTITION_ADVANCED=y +CONFIG_ACORN_PARTITION=y +CONFIG_ACORN_PARTITION_CUMANA=y +CONFIG_ACORN_PARTITION_EESOX=y +CONFIG_ACORN_PARTITION_ICS=y +CONFIG_ACORN_PARTITION_ADFS=y +CONFIG_ACORN_PARTITION_POWERTEC=y +CONFIG_ACORN_PARTITION_RISCIX=y +CONFIG_AIX_PARTITION=y +CONFIG_OSF_PARTITION=y +CONFIG_AMIGA_PARTITION=y +CONFIG_ATARI_PARTITION=y +CONFIG_MAC_PARTITION=y +CONFIG_BSD_DISKLABEL=y +CONFIG_MINIX_SUBPARTITION=y +CONFIG_SOLARIS_X86_PARTITION=y +CONFIG_UNIXWARE_DISKLABEL=y +CONFIG_LDM_PARTITION=y +CONFIG_LDM_DEBUG=y +CONFIG_SGI_PARTITION=y +CONFIG_ULTRIX_PARTITION=y +CONFIG_SUN_PARTITION=y +CONFIG_KARMA_PARTITION=y +CONFIG_SYSV68_PARTITION=y +CONFIG_CMDLINE_PARTITION=y +CONFIG_NET=y +CONFIG_PACKET=y +CONFIG_UNIX=y +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +CONFIG_IP_ADVANCED_ROUTER=y +CONFIG_IP_PNP=y +CONFIG_IP_PNP_DHCP=y +CONFIG_IP_PNP_BOOTP=y +CONFIG_IP_PNP_RARP=y +CONFIG_NETLINK_DIAG=y +CONFIG_CFG80211=y +# CONFIG_CFG80211_DEFAULT_PS is not set +# CONFIG_CFG80211_CRDA_SUPPORT is not set +CONFIG_CFG80211_WEXT=y +CONFIG_MAC80211=y +CONFIG_NET_9P=y +CONFIG_NET_9P_VIRTIO=y +CONFIG_NET_9P_DEBUG=y +CONFIG_DEVTMPFS=y +CONFIG_DEVTMPFS_MOUNT=y +CONFIG_MTD=y +CONFIG_MTD_TESTS=m +CONFIG_MTD_CMDLINE_PARTS=y +CONFIG_MTD_BLOCK=y +CONFIG_MTD_RAW_NAND=y +CONFIG_MTD_SPI_NAND=y +CONFIG_MTD_SPI_NOR=y +# CONFIG_MTD_SPI_NOR_USE_4K_SECTORS is not set +CONFIG_MTD_UBI=y +CONFIG_BLK_DEV_LOOP=y +CONFIG_VIRTIO_BLK=y +CONFIG_EEPROM_AT24=y +CONFIG_SCSI=y +CONFIG_BLK_DEV_SD=y +CONFIG_NETDEVICES=y +CONFIG_VIRTIO_NET=y +# CONFIG_ETHERNET is not set +CONFIG_PHYLIB=y +CONFIG_MARVELL_PHY=y +CONFIG_MICROCHIP_PHY=y +CONFIG_PCS_XPCS=y +CONFIG_USB_RTL8150=y +CONFIG_USB_RTL8152=y +# CONFIG_WLAN_VENDOR_ADMTEK is not set +# CONFIG_WLAN_VENDOR_AICH is not set +# CONFIG_WLAN_VENDOR_ATH is not set +# CONFIG_WLAN_VENDOR_ATMEL is not set +# CONFIG_WLAN_VENDOR_BROADCOM is not set +# CONFIG_WLAN_VENDOR_CISCO is not set +# CONFIG_WLAN_VENDOR_INTEL is not set +# CONFIG_WLAN_VENDOR_INTERSIL is not set +# CONFIG_WLAN_VENDOR_MARVELL is not set +# CONFIG_WLAN_VENDOR_MEDIATEK is not set +# CONFIG_WLAN_VENDOR_MICROCHIP is not set +# CONFIG_WLAN_VENDOR_RALINK is not set +# CONFIG_WLAN_VENDOR_REALTEK is not set +# CONFIG_WLAN_VENDOR_RSI is not set +# CONFIG_WLAN_VENDOR_ST is not set +# CONFIG_WLAN_VENDOR_TI is not set +# CONFIG_WLAN_VENDOR_ZYDAS is not set +# CONFIG_WLAN_VENDOR_QUANTENNA is not set +CONFIG_RTL8189FS=y +CONFIG_INPUT_EVDEV=y +CONFIG_KEYBOARD_GPIO=y +# CONFIG_MOUSE_PS2 is not set +CONFIG_INPUT_TOUCHSCREEN=y +CONFIG_TOUCHSCREEN_GOODIX=y +# CONFIG_SERIO_SERPORT is not set +CONFIG_SERIAL_8250=y +# CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set +CONFIG_SERIAL_8250_CONSOLE=y +CONFIG_SERIAL_8250_NR_UARTS=5 +CONFIG_SERIAL_8250_RUNTIME_UARTS=5 +CONFIG_SERIAL_8250_DW=y +CONFIG_SERIAL_OF_PLATFORM=y +CONFIG_SERIAL_EARLYCON_RISCV_SBI=y +CONFIG_HVC_RISCV_SBI=y +CONFIG_HW_RANDOM=y +CONFIG_HW_RANDOM_VIRTIO=y +CONFIG_I2C_CHARDEV=y +CONFIG_I2C_MUX=y +CONFIG_I2C_DESIGNWARE_PLATFORM=y +CONFIG_I2C_DESIGNWARE_ICE=y +CONFIG_SPI=y +CONFIG_SPI_DEBUG=y +CONFIG_SPI_DESIGNWARE=y +CONFIG_SPI_DW_DMA=y +CONFIG_SPI_DW_MMIO=y +CONFIG_GPIOLIB=y +CONFIG_DEBUG_GPIO=y +CONFIG_GPIO_SYSFS=y +CONFIG_GPIO_DWAPB=y +CONFIG_POWER_RESET=y +CONFIG_POWER_SUPPLY=y +# CONFIG_HWMON is not set +CONFIG_THERMAL=y +CONFIG_CANAAN_THERMAL=y +CONFIG_WATCHDOG=y +CONFIG_DW_WATCHDOG=y +CONFIG_MFD_SYSCON=y +# CONFIG_MEDIA_CEC_SUPPORT is not set +CONFIG_MEDIA_SUPPORT=y +# CONFIG_DVB_NET is not set +# CONFIG_DVB_DYNAMIC_MINORS is not set +# CONFIG_RADIO_ADAPTERS is not set +# CONFIG_CXD2880_SPI_DRV is not set +# CONFIG_MEDIA_TUNER_SIMPLE is not set +# CONFIG_MEDIA_TUNER_TDA18250 is not set +# CONFIG_MEDIA_TUNER_TDA8290 is not set +# CONFIG_MEDIA_TUNER_TDA827X is not set +# CONFIG_MEDIA_TUNER_TDA18271 is not set +# CONFIG_MEDIA_TUNER_TDA9887 is not set +# CONFIG_MEDIA_TUNER_TEA5761 is not set +# CONFIG_MEDIA_TUNER_TEA5767 is not set +# CONFIG_MEDIA_TUNER_MSI001 is not set +# CONFIG_MEDIA_TUNER_MT20XX is not set +# CONFIG_MEDIA_TUNER_MT2060 is not set +# CONFIG_MEDIA_TUNER_MT2063 is not set +# CONFIG_MEDIA_TUNER_MT2266 is not set +# CONFIG_MEDIA_TUNER_MT2131 is not set +# CONFIG_MEDIA_TUNER_QT1010 is not set +# CONFIG_MEDIA_TUNER_XC2028 is not set +# CONFIG_MEDIA_TUNER_XC5000 is not set +# CONFIG_MEDIA_TUNER_XC4000 is not set +# CONFIG_MEDIA_TUNER_MXL5005S is not set +# CONFIG_MEDIA_TUNER_MXL5007T is not set +# CONFIG_MEDIA_TUNER_MC44S803 is not set +# CONFIG_MEDIA_TUNER_MAX2165 is not set +# CONFIG_MEDIA_TUNER_TDA18218 is not set +# CONFIG_MEDIA_TUNER_FC0011 is not set +# CONFIG_MEDIA_TUNER_FC0012 is not set +# CONFIG_MEDIA_TUNER_FC0013 is not set +# CONFIG_MEDIA_TUNER_TDA18212 is not set +# CONFIG_MEDIA_TUNER_E4000 is not set +# CONFIG_MEDIA_TUNER_FC2580 is not set +# CONFIG_MEDIA_TUNER_M88RS6000T is not set +# CONFIG_MEDIA_TUNER_TUA9001 is not set +# CONFIG_MEDIA_TUNER_SI2157 is not set +# CONFIG_MEDIA_TUNER_IT913X is not set +# CONFIG_MEDIA_TUNER_R820T is not set +# CONFIG_MEDIA_TUNER_MXL301RF is not set +# CONFIG_MEDIA_TUNER_QM1D1C0042 is not set +# CONFIG_MEDIA_TUNER_QM1D1B0004 is not set +# CONFIG_DVB_STB0899 is not set +# CONFIG_DVB_STB6100 is not set +# CONFIG_DVB_STV090x is not set +# CONFIG_DVB_STV0910 is not set +# CONFIG_DVB_STV6110x is not set +# CONFIG_DVB_STV6111 is not set +# CONFIG_DVB_MXL5XX is not set +# CONFIG_DVB_M88DS3103 is not set +# CONFIG_DVB_DRXK is not set +# CONFIG_DVB_TDA18271C2DD is not set +# CONFIG_DVB_SI2165 is not set +# CONFIG_DVB_MN88472 is not set +# CONFIG_DVB_MN88473 is not set +# CONFIG_DVB_CX24110 is not set +# CONFIG_DVB_CX24123 is not set +# CONFIG_DVB_MT312 is not set +# CONFIG_DVB_ZL10036 is not set +# CONFIG_DVB_ZL10039 is not set +# CONFIG_DVB_S5H1420 is not set +# CONFIG_DVB_STV0288 is not set +# CONFIG_DVB_STB6000 is not set +# CONFIG_DVB_STV0299 is not set +# CONFIG_DVB_STV6110 is not set +# CONFIG_DVB_STV0900 is not set +# CONFIG_DVB_TDA8083 is not set +# CONFIG_DVB_TDA10086 is not set +# CONFIG_DVB_TDA8261 is not set +# CONFIG_DVB_VES1X93 is not set +# CONFIG_DVB_TUNER_ITD1000 is not set +# CONFIG_DVB_TUNER_CX24113 is not set +# CONFIG_DVB_TDA826X is not set +# CONFIG_DVB_TUA6100 is not set +# CONFIG_DVB_CX24116 is not set +# CONFIG_DVB_CX24117 is not set +# CONFIG_DVB_CX24120 is not set +# CONFIG_DVB_SI21XX is not set +# CONFIG_DVB_TS2020 is not set +# CONFIG_DVB_DS3000 is not set +# CONFIG_DVB_MB86A16 is not set +# CONFIG_DVB_TDA10071 is not set +# CONFIG_DVB_SP8870 is not set +# CONFIG_DVB_SP887X is not set +# CONFIG_DVB_CX22700 is not set +# CONFIG_DVB_CX22702 is not set +# CONFIG_DVB_S5H1432 is not set +# CONFIG_DVB_DRXD is not set +# CONFIG_DVB_L64781 is not set +# CONFIG_DVB_TDA1004X is not set +# CONFIG_DVB_NXT6000 is not set +# CONFIG_DVB_MT352 is not set +# CONFIG_DVB_ZL10353 is not set +# CONFIG_DVB_DIB3000MB is not set +# CONFIG_DVB_DIB3000MC is not set +# CONFIG_DVB_DIB7000M is not set +# CONFIG_DVB_DIB7000P is not set +# CONFIG_DVB_DIB9000 is not set +# CONFIG_DVB_TDA10048 is not set +# CONFIG_DVB_AF9013 is not set +# CONFIG_DVB_EC100 is not set +# CONFIG_DVB_STV0367 is not set +# CONFIG_DVB_CXD2820R is not set +# CONFIG_DVB_CXD2841ER is not set +# CONFIG_DVB_RTL2830 is not set +# CONFIG_DVB_RTL2832 is not set +# CONFIG_DVB_RTL2832_SDR is not set +# CONFIG_DVB_SI2168 is not set +# CONFIG_DVB_ZD1301_DEMOD is not set +# CONFIG_DVB_CXD2880 is not set +# CONFIG_DVB_VES1820 is not set +# CONFIG_DVB_TDA10021 is not set +# CONFIG_DVB_TDA10023 is not set +# CONFIG_DVB_STV0297 is not set +# CONFIG_DVB_NXT200X is not set +# CONFIG_DVB_OR51211 is not set +# CONFIG_DVB_OR51132 is not set +# CONFIG_DVB_BCM3510 is not set +# CONFIG_DVB_LGDT330X is not set +# CONFIG_DVB_LGDT3305 is not set +# CONFIG_DVB_LGDT3306A is not set +# CONFIG_DVB_LG2160 is not set +# CONFIG_DVB_S5H1409 is not set +# CONFIG_DVB_AU8522_DTV is not set +# CONFIG_DVB_AU8522_V4L is not set +# CONFIG_DVB_S5H1411 is not set +# CONFIG_DVB_S921 is not set +# CONFIG_DVB_DIB8000 is not set +# CONFIG_DVB_MB86A20S is not set +# CONFIG_DVB_TC90522 is not set +# CONFIG_DVB_MN88443X is not set +# CONFIG_DVB_PLL is not set +# CONFIG_DVB_TUNER_DIB0070 is not set +# CONFIG_DVB_TUNER_DIB0090 is not set +# CONFIG_DVB_DRX39XYJ is not set +# CONFIG_DVB_LNBH25 is not set +# CONFIG_DVB_LNBH29 is not set +# CONFIG_DVB_LNBP21 is not set +# CONFIG_DVB_LNBP22 is not set +# CONFIG_DVB_ISL6405 is not set +# CONFIG_DVB_ISL6421 is not set +# CONFIG_DVB_ISL6423 is not set +# CONFIG_DVB_A8293 is not set +# CONFIG_DVB_LGS8GL5 is not set +# CONFIG_DVB_LGS8GXX is not set +# CONFIG_DVB_ATBM8830 is not set +# CONFIG_DVB_TDA665x is not set +# CONFIG_DVB_IX2505V is not set +# CONFIG_DVB_M88RS2000 is not set +# CONFIG_DVB_AF9033 is not set +# CONFIG_DVB_HORUS3A is not set +# CONFIG_DVB_ASCOT2E is not set +# CONFIG_DVB_HELENE is not set +# CONFIG_DVB_CXD2099 is not set +# CONFIG_DVB_SP2 is not set +CONFIG_DRM=y +CONFIG_DRM_PANEL_CANAAN_UNIVERSAL=y +CONFIG_DRM_CANAAN=y +CONFIG_DRM_CANAAN_DSI=y +CONFIG_VG_LITE=m +CONFIG_FB_VIRTUAL=m +CONFIG_FB_SIMPLE=y +CONFIG_LCD_CLASS_DEVICE=y +CONFIG_BACKLIGHT_CLASS_DEVICE=y +# CONFIG_VGA_CONSOLE is not set +CONFIG_USB=y +CONFIG_USB_ANNOUNCE_NEW_DEVICES=y +CONFIG_USB_STORAGE=y +CONFIG_USB_DWC2=y +CONFIG_USB_TEST=m +CONFIG_USB_GADGET=y +CONFIG_USB_SNP_UDC_PLAT=y +CONFIG_USB_CONFIGFS=y +CONFIG_USB_CONFIGFS_MASS_STORAGE=y +CONFIG_USB_CONFIGFS_F_LB_SS=y +CONFIG_USB_CONFIGFS_F_HID=y +CONFIG_USB_CONFIGFS_F_UVC=y +CONFIG_MMC=y +CONFIG_MMC_DEBUG=y +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_PLTFM=y +CONFIG_MMC_SDHCI_OF_KENDRYTE=y +CONFIG_NEW_LEDS=y +CONFIG_LEDS_CLASS=y +CONFIG_LEDS_GPIO=y +CONFIG_LEDS_TRIGGERS=y +CONFIG_LEDS_TRIGGER_CPU=y +CONFIG_DMADEVICES=y +CONFIG_DW_AXI_DMAC=y +CONFIG_DMATEST=y +CONFIG_VIRTIO_BALLOON=y +CONFIG_VIRTIO_MMIO=y +CONFIG_IIO=y +CONFIG_PWM=y +CONFIG_PWM_K230=y +CONFIG_SIFIVE_PLIC=y +CONFIG_RESET_CONTROLLER=y +CONFIG_GENERIC_PHY=y +CONFIG_RAS=y +CONFIG_NVMEM_KENDRYTE_K230_OTP=y +CONFIG_EXT2_FS=y +CONFIG_EXT2_FS_XATTR=y +CONFIG_EXT2_FS_POSIX_ACL=y +CONFIG_EXT2_FS_SECURITY=y +CONFIG_EXT4_FS=y +CONFIG_EXT4_FS_POSIX_ACL=y +CONFIG_AUTOFS4_FS=y +CONFIG_FUSE_FS=y +CONFIG_MSDOS_FS=y +CONFIG_VFAT_FS=y +CONFIG_FAT_DEFAULT_UTF8=y +CONFIG_EXFAT_FS=y +CONFIG_NTFS_FS=y +CONFIG_NTFS_RW=y +CONFIG_TMPFS=y +CONFIG_TMPFS_POSIX_ACL=y +CONFIG_HFS_FS=y +CONFIG_HFSPLUS_FS=y +CONFIG_JFFS2_FS=y +CONFIG_JFFS2_COMPRESSION_OPTIONS=y +CONFIG_UBIFS_FS=y +CONFIG_UBIFS_FS_ADVANCED_COMPR=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_9P_FS_POSIX_ACL=y +CONFIG_9P_FS_SECURITY=y +CONFIG_NLS_CODEPAGE_437=y +CONFIG_NLS_CODEPAGE_936=y +CONFIG_NLS_CODEPAGE_1250=y +CONFIG_NLS_CODEPAGE_1251=y +CONFIG_NLS_ISO8859_1=y +CONFIG_LSM="lockdown,yama,loadpin,safesetid,integrity" +CONFIG_CRYPTO_USER=y +CONFIG_CRYPTO_MICHAEL_MIC=y +CONFIG_CRYPTO_USER_API_HASH=y +CONFIG_CRYPTO_USER_API_AEAD=y +CONFIG_CRYPTO_DEV_VIRTIO=y +CONFIG_CRYPTO_DEV_CANAAN=y +CONFIG_CRYPTO_DEV_KENDRYTE_CRYP=y +CONFIG_PRINTK_TIME=y +CONFIG_DEBUG_INFO=y +# CONFIG_ENABLE_MUST_CHECK is not set +CONFIG_MAGIC_SYSRQ=y +CONFIG_DEBUG_FS=y +CONFIG_DETECT_HUNG_TASK=y +CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=60 +CONFIG_DEBUG_ATOMIC_SLEEP=y +# CONFIG_RCU_TRACE is not set diff --git a/src/little/linux/arch/riscv/configs/k230_evb_linux_enable_vector_defconfig b/src/little/linux/arch/riscv/configs/k230_evb_linux_enable_vector_defconfig index ae27f3434..113b84208 100644 --- a/src/little/linux/arch/riscv/configs/k230_evb_linux_enable_vector_defconfig +++ b/src/little/linux/arch/riscv/configs/k230_evb_linux_enable_vector_defconfig @@ -412,3 +412,7 @@ CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=60 CONFIG_DEBUG_ATOMIC_SLEEP=y # CONFIG_RCU_TRACE is not set CONFIG_VECTOR=y +CONFIG_MEDIA_PLATFORM_SUPPORT=y +CONFIG_V4L_PLATFORM_DRIVERS=y +CONFIG_VPU_CANAAN=y + diff --git a/src/little/linux/arch/riscv/include/asm/cache.h b/src/little/linux/arch/riscv/include/asm/cache.h index 9b58b1045..bffae73e3 100644 --- a/src/little/linux/arch/riscv/include/asm/cache.h +++ b/src/little/linux/arch/riscv/include/asm/cache.h @@ -10,6 +10,7 @@ #define L1_CACHE_SHIFT 6 #define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT) +#define ARCH_DMA_MINALIGN L1_CACHE_BYTES /* * RISC-V requires the stack pointer to be 16-byte aligned, so ensure that diff --git a/src/little/linux/drivers/canaan-hwtimer/canaan-hwtimer.c b/src/little/linux/drivers/canaan-hwtimer/canaan-hwtimer.c index aa618f52e..81ed1e3f9 100755 --- a/src/little/linux/drivers/canaan-hwtimer/canaan-hwtimer.c +++ b/src/little/linux/drivers/canaan-hwtimer/canaan-hwtimer.c @@ -187,12 +187,6 @@ static int k230_hwtimer_open(struct inode *inode, struct file *file) static int k230_hwtimer_release(struct inode *inode, struct file *file) { - struct miscdevice *mdev = file->private_data; - hw_timer_t *timer = to_hwtimer(mdev); - - //del_timer(&timer->softtimer); - - //k230_hwtimer_start(timer, 0); return 0; } @@ -225,9 +219,7 @@ static ssize_t k230_hwtimer_read(struct file *file, char __user *buf, size_t len } } - // if(freq == 0) { - // printk("diff %llx timeout %x , old %x new %x f=%d \n", time_diff, timeout, timer->old, timer->new, freq); - // } + if(copy_to_user(data, &freq, sizeof(freq))) return -EFAULT; diff --git a/src/little/linux/drivers/gpio/gpio-k230.c b/src/little/linux/drivers/gpio/gpio-k230.c index d72a6bd4c..4fda758ee 100755 --- a/src/little/linux/drivers/gpio/gpio-k230.c +++ b/src/little/linux/drivers/gpio/gpio-k230.c @@ -354,7 +354,7 @@ static int k230_gpio_set_debounce(struct gpio_chip *gc, unsigned long mask; offset = gc->base; if (offset >= 32) - offset -= 32; + offset = offset % 32; mask = BIT(offset); spin_lock_irqsave(&gc->bgpio_lock, flags); while(hardlock_lock(hardlock)); @@ -445,7 +445,7 @@ static int k230_gpio_get(struct gpio_chip *gc, unsigned int gpio) { gpio = gc->base; if (gpio >= 32) - gpio -= 32; + gpio = gpio % 32; return !!(gc->read_reg(gc->reg_dat) & BIT(gpio)); } @@ -457,8 +457,9 @@ static void k230_gpio_set_set(struct gpio_chip *gc, unsigned int gpio, int val) gpio = gc->base; if (gpio >= 32) - gpio -= 32; + gpio = gpio % 32; mask = BIT(gpio); + spin_lock_irqsave(&gc->bgpio_lock, flags); while(hardlock_lock(hardlock)); if (val) { @@ -486,7 +487,7 @@ static int k230_gpio_dir_in(struct gpio_chip *gc, unsigned int gpio) gpio = gc->base; if (gpio >= 32) - gpio -= 32; + gpio = gpio % 32; dir = ~BIT(gpio); @@ -508,7 +509,7 @@ static int k230_gpio_get_dir(struct gpio_chip *gc, unsigned int gpio) { gpio = gc->base; if (gpio >= 32) - gpio -= 32; + gpio = gpio % 32; /* Return 0 if output, 1 if input */ if (gc->bgpio_dir_unreadable) { if (gc->bgpio_dir & BIT(gpio)) @@ -538,7 +539,7 @@ static int k230_dir_out_val_first(struct gpio_chip *gc, unsigned int gpio, gpio = gc->base; if (gpio >= 32) - gpio -= 32; + gpio = gpio % 32; spin_lock_irqsave(&gc->bgpio_lock, flags); @@ -614,9 +615,8 @@ static int k230_gpio_add_port(struct platform_device *pdev, struct k230_gpio *gp port->gc.base = pp->gpio_base; port->gc.set_config = k230_gpio_set_config; - if (of_property_read_u32(pdev->dev.of_node, "interrupts", &pp->irq[0])) { - dev_err(gpio->dev, "get irq num failed!\n"); - return -EINVAL; + if (!of_property_read_u32(pdev->dev.of_node, "interrupts", &pp->irq[0])) { + k230_configure_irqs(gpio, port, pp); } /* get gpio used hardlock num */ @@ -634,8 +634,6 @@ static int k230_gpio_add_port(struct platform_device *pdev, struct k230_gpio *gp dev_err(gpio->dev, "request hardlock %d success!\n", hardlock); } - k230_configure_irqs(gpio, port, pp); - err = devm_gpiochip_add_data(gpio->dev, &port->gc, port); if (err) { dev_err(gpio->dev, "failed to register gpiochip for port%d\n", @@ -799,14 +797,13 @@ static int k230_gpio_probe(struct platform_device *pdev) gpio->irq_parent = of_irq_find_parent(gpio->node); if (!gpio->irq_parent) { dev_err(dev, "no IRQ parent node\n"); - return -ENODEV; - } - gpio->parent = irq_find_host(gpio->irq_parent); - if (!gpio->parent) { - dev_err(dev, "no IRQ parent domain\n"); - return -ENODEV; - } - + } else { + gpio->parent = irq_find_host(gpio->irq_parent); + if (!gpio->parent) { + dev_err(dev, "no IRQ parent domain\n"); + return -ENODEV; + } + } err = k230_get_reset(gpio); if (err) return err; @@ -824,10 +821,8 @@ static int k230_gpio_probe(struct platform_device *pdev) if (r->start == K230_GPIOA_BASE_ADDR) { gpio->regs = iomem_gpio_a; - pdata->properties[0].idx = 0; } else if (r->start == K230_GPIOB_BASE_ADDR) { gpio->regs = iomem_gpio_b; - pdata->properties[0].idx = 0; } } else { dev_err(dev, "get device register address failed!\n"); diff --git a/src/little/linux/drivers/gpu/drm/canaan/canaan_vo.c b/src/little/linux/drivers/gpu/drm/canaan/canaan_vo.c index 94d203d8a..02ae14670 100755 --- a/src/little/linux/drivers/gpu/drm/canaan/canaan_vo.c +++ b/src/little/linux/drivers/gpu/drm/canaan/canaan_vo.c @@ -81,12 +81,12 @@ static void canaan_vo_update_video(struct canaan_vo *vo, struct canaan_plane *ca writel(reg_val, vo->reg_base + plane_offset + VO_LAYER2_3_ACT_SIZE_REG_OFFSET); offset_w = plane_state->crtc_x; - start_w = adj_mode->crtc_htotal - adj_mode->crtc_hsync_start + 5 + 1; + start_w = readl(vo->reg_base + VO_DISP_XZONE_CTL) & 0x1fff; reg_val = ((start_w + offset_w + actual_w -1) << 16) + (start_w + offset_w); writel(reg_val, vo->reg_base + xctl_reg_offset); offset_h = plane_state->crtc_y; - start_h = adj_mode->crtc_vtotal - adj_mode->crtc_vsync_end + 1; + start_h = readl(vo->reg_base + VO_DISP_YZONE_CTL) & 0x1fff; reg_val = ((start_h + offset_h + actual_h -1) << 16) + (start_h + offset_h); writel(reg_val, vo->reg_base + yctl_reg_offset); @@ -162,12 +162,12 @@ static void canaan_vo_update_osd(struct canaan_vo *vo, struct canaan_plane *cana writel(reg_val, vo->reg_base + plane_offset + VO_OSD0_7_SIZE_REG_OFFSET); offset_w = plane_state->crtc_x; - start_w = adj_mode->crtc_htotal - adj_mode->crtc_hsync_start + 5 + 1; + start_w = readl(vo->reg_base + VO_DISP_XZONE_CTL) & 0x1fff; reg_val = ((start_w + offset_w + actual_w -1) << 16) + (start_w + offset_w); writel(reg_val, vo->reg_base + xctl_reg_offset); offset_h = plane_state->crtc_y; - start_h = adj_mode->crtc_vtotal - adj_mode->crtc_vsync_end + 1; + start_h = readl(vo->reg_base + VO_DISP_YZONE_CTL) & 0x1fff; reg_val = ((start_h + offset_h + actual_h -1) << 16) + (start_h + offset_h); writel(reg_val, vo->reg_base + yctl_reg_offset); diff --git a/src/little/linux/drivers/gpu/drm/canaan/canaan_vo_regs.h b/src/little/linux/drivers/gpu/drm/canaan/canaan_vo_regs.h index ec0115662..1f9688d83 100755 --- a/src/little/linux/drivers/gpu/drm/canaan/canaan_vo_regs.h +++ b/src/little/linux/drivers/gpu/drm/canaan/canaan_vo_regs.h @@ -46,6 +46,8 @@ #define VO_DISP_CTL 0x114 #define VO_DISP_ENABLE 0x118 +#define VO_DISP_XZONE_CTL 0x0C0 +#define VO_DISP_YZONE_CTL 0x0C4 #define VO_DISP_LAYER0_XCTL 0x0C8 #define VO_DISP_LAYER0_YCTL 0x0CC #define VO_DISP_LAYER1_XCTL 0x0D0 diff --git a/src/little/linux/drivers/media/platform/Kconfig b/src/little/linux/drivers/media/platform/Kconfig index 7e152bbb4..ae0d82277 100644 --- a/src/little/linux/drivers/media/platform/Kconfig +++ b/src/little/linux/drivers/media/platform/Kconfig @@ -153,6 +153,7 @@ source "drivers/media/platform/xilinx/Kconfig" source "drivers/media/platform/rcar-vin/Kconfig" source "drivers/media/platform/atmel/Kconfig" source "drivers/media/platform/sunxi/Kconfig" +source "drivers/media/platform/canaan-vpu/Kconfig" config VIDEO_TI_CAL tristate "TI CAL (Camera Adaptation Layer) driver" diff --git a/src/little/linux/drivers/media/platform/Makefile b/src/little/linux/drivers/media/platform/Makefile index 62b6cdc8c..7292e7213 100644 --- a/src/little/linux/drivers/media/platform/Makefile +++ b/src/little/linux/drivers/media/platform/Makefile @@ -80,3 +80,5 @@ obj-$(CONFIG_VIDEO_QCOM_CAMSS) += qcom/camss/ obj-$(CONFIG_VIDEO_QCOM_VENUS) += qcom/venus/ obj-y += sunxi/ + +obj-y += canaan-vpu/ diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/Kconfig b/src/little/linux/drivers/media/platform/canaan-vpu/Kconfig new file mode 100755 index 000000000..7163d7b6e --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/Kconfig @@ -0,0 +1,26 @@ +config VPU_CANAAN + tristate "Linlon VPU support." + depends on VIDEO_DEV + depends on COMMON_CLK && HAS_DMA + select VIDEO_V4L2_SUBDEV_API + select VIDEOBUF2_DMA_CONTIG + select V4L_MEM2MEM_DRIVERS + select V4L2_FWNODE + select VIDEOBUF2_DMA_SG + default y + help + This enables support for the Linlon VPU family. + +config VPU_CANAAN_FTRACE + depends on VPU_CANAAN + bool "Send kernel space logs to ftrace." + default n + help + Send kernel space logs to ftrace. + +config VPU_CANAAN_PRINT_FILE + depends on VPU_CANAAN + bool "Append file and line number to kernel space log messages." + default y + help + Append file and line number to kernel space log messages. diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/Makefile b/src/little/linux/drivers/media/platform/canaan-vpu/Makefile new file mode 100755 index 000000000..691e4b56d --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/Makefile @@ -0,0 +1,58 @@ +#############################################if/############## +# Set the include-path according to the defined interface. +########################################################### + +ccflags-y += -I$(src) -I$(src)/if -I$(src)/dev -I$(src)/if/v4l2 -I$(src)/external +ccflags-$(CONFIG_VPU_CANAAN_FTRACE) += -DMVX_LOG_FTRACE_ENABLE +ccflags-$(CONFIG_VPU_CANAAN_PRINT_FILE) += -DMVX_LOG_PRINT_FILE_ENABLE +ccflags-y += $(EXTRA_CCFLAGS) + +########################################################### +# Define build targets and what files to include. +########################################################### + +# Amvx module +obj-$(CONFIG_VPU_CANAAN) := amvx.o + +# Add objects for if module. +if-y := mvx_if.o \ + mvx_buffer.o \ + mvx_firmware_cache.o \ + mvx_firmware.o \ + mvx_firmware_v2.o \ + mvx_firmware_v3.o \ + mvx_mmu.o \ + mvx_secure.o \ + mvx_session.o \ + fw_jpegenc.o \ + fw_jpegdec.o \ + fw_h264enc.o \ + fw_h264dec.o \ + fw_hevcenc.o \ + fw_hevcdec.o + +# Add external interface. +if-y += mvx_ext_v4l2.o \ + mvx_v4l2_buffer.o \ + mvx_v4l2_session.o \ + mvx_v4l2_vidioc.o \ + mvx_v4l2_fops.o \ + mvx_v4l2_ctrls.o + +# Add objects for dev module. +dev-y := mvx_dev.o \ + mvx_hwreg.o \ + mvx_hwreg_v500.o \ + mvx_hwreg_v550.o \ + mvx_hwreg_v61.o \ + mvx_hwreg_v52_v76.o \ + mvx_lsid.o \ + mvx_scheduler.o \ + mvx_pm_runtime.o + +# Add driver objects. +amvx-y := mvx_driver.o \ + mvx_seq.o \ + mvx_log.o \ + mvx_log_group.o \ + $(if-y) $(dev-y) diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/fw_h264dec.c b/src/little/linux/drivers/media/platform/canaan-vpu/fw_h264dec.c new file mode 100755 index 000000000..ca74e871a --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/fw_h264dec.c @@ -0,0 +1,67779 @@ +const unsigned int fw_h264dec[] __attribute__((aligned(0x1000))) = { + 0x0000eb5e, + 0x02020305, + 0x33363635, + 0x32303137, + 0x36322e48, + 0x50422034, + 0x2f504d2f, + 0x44205048, + 0x646f6365, + 0x00007265, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x34363248, + 0x20434544, + 0x33346332, + 0x31643430, + 0x30703172, + 0x6530302d, + 0x00306361, + 0x00000000, + 0x00042300, + 0x00044000, + 0x0000002c, + 0xfff80bef, + 0x00000fff, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00057000, + 0x00018064, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x01a70d27, + 0x6ea7f07b, + 0x53fdcfff, + 0x530207f0, + 0xa50183f1, + 0x27609561, + 0x25601501, + 0x15002760, + 0x9b602560, + 0x6ea70ef0, + 0x01fd4fff, + 0x33110361, + 0xc512a314, + 0x60c13861, + 0xf810ce38, + 0xffff1ea7, + 0x213127ff, + 0x99240714, + 0x6c402416, + 0x27659680, + 0x169d806c, + 0x27612724, + 0x0e210330, + 0x07202762, + 0x19520b51, + 0xce0b6650, + 0x3826f042, + 0x139d3327, + 0xbd31270d, + 0x27063a13, + 0x0ef09b00, + 0xa70f1099, + 0xfd4fff6e, + 0x600b0233, + 0x274063c5, + 0x0ef39b30, + 0x4fff6ea7, + 0x3863c5fd, + 0x10000d27, + 0x871ef0e8, + 0x01271225, + 0x1399501d, + 0x0353070c, + 0x0c139d31, + 0x2c333207, + 0x04f29b18, + 0x0ea721a3, + 0x05feffff, + 0x9b202702, + 0x03150ef2, + 0x2708059d, + 0x9302000d, + 0x0482c3f1, + 0x04002d27, + 0x0706f09b, + 0xb5f193f1, + 0x1001045d, + 0x01270b36, + 0xf0931005, + 0x930430a8, + 0x042e23f3, + 0x011e03c2, + 0x803c0331, + 0x93f930ca, + 0x042e13f3, + 0x1e8ef293, + 0x03210104, + 0x03310524, + 0xf630ca34, + 0x00024ebe, + 0xf09b0027, + 0x0276be0b, + 0x27012700, + 0x06f09b10, + 0xfd1eff8b, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x01a70d27, + 0x6ea7f07b, + 0x93feffff, + 0x000cf6f1, + 0x937f1ce3, + 0x00107ef2, + 0x05b66001, + 0x9bfa21d2, + 0x1c030ff1, + 0xe3f21e80, + 0x04f09b01, + 0x02000d27, + 0xabcef193, + 0x022d2704, + 0x06f09b40, + 0xc4bef107, + 0xff8b000c, + 0x0000fd1e, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x01a70d27, + 0x6ea7f07b, + 0x93feffff, + 0x00020cf1, + 0x937f1ce3, + 0x000c6ef2, + 0x05b66001, + 0x9bfa21d2, + 0x1c030ff1, + 0xe3f21e80, + 0x04f09b01, + 0x02000d27, + 0x98cef193, + 0x012d2704, + 0x06f09b40, + 0xf1bef107, + 0xff8b0001, + 0x0000fd1e, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x01a70d27, + 0x6ea7f07b, + 0x93feffff, + 0x000f86f1, + 0x937f1ce3, + 0x001268f2, + 0x05b66001, + 0x9bfa21d2, + 0x1c030ff1, + 0xe3f21e80, + 0x04f09b01, + 0x02000d27, + 0xbe4ef193, + 0x032d2704, + 0x06f09b40, + 0x54bef107, + 0xff8b000f, + 0x0000fd1e, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x01a70d27, + 0x6ea7f07b, + 0x93feffff, + 0x0011f0f1, + 0x937f1ce3, + 0x00131af2, + 0x05b66001, + 0x9bfa21d2, + 0x1c030ff1, + 0xe3f21e80, + 0x04f09b01, + 0x02000d27, + 0xe04ef193, + 0x042d2704, + 0x06f09b40, + 0xbebef107, + 0xff8b0011, + 0xf09bfd1e, + 0x07fe0b06, + 0x4efe0b0f, + 0x25fd93f5, + 0xd0010000, + 0xf08b0506, + 0xf71ed403, + 0xf54ef58e, + 0x0016fd93, + 0x06d00100, + 0x03f08b05, + 0x8ef71ed4, + 0x000000f5, + 0x00000000, + 0x00000000, + 0xf4abfa4e, + 0x3c7af493, + 0xa7f41b01, + 0xfd9fff3e, + 0x04024d27, + 0x34153425, + 0x001466be, + 0xffff0ea7, + 0xff1ea7ff, + 0x031efd4f, + 0x0499f2e8, + 0x2713010e, + 0xd8437b26, + 0xaea7f341, + 0x11feffff, + 0x0834f9a3, + 0xe3ff000a, + 0x0834fd41, + 0xa7ff000a, + 0xfdcfffbe, + 0xf093c127, + 0x27042dac, + 0x68bcc510, + 0x001502be, + 0xfcebf4ab, + 0x001278be, + 0x0027f4ab, + 0x0014e0be, + 0xf49b4027, + 0x0ef49b0b, + 0xa3bd3227, + 0xbcc51ff8, + 0x0ef49b40, + 0x9fff3ea7, + 0x68bcc5fd, + 0x40273415, + 0x070ef49b, + 0x1eff8b00, + 0x000000f6, + 0x0004afd4, + 0x0004afec, + 0x00100000, + 0x0004ad88, + 0x0004ae54, + 0xf0e3f54e, + 0x4dcaf493, + 0x27f41b01, + 0x274ea730, + 0x4305fefd, + 0x2ea74315, + 0x05fefd1f, + 0xa7231523, + 0xebffff1e, + 0x00014f27, + 0x14155010, + 0xc5102c27, + 0xcea75c12, + 0x27e7ffff, + 0xa7cb05b2, + 0xfefd334e, + 0x2ea74325, + 0x25fee43f, + 0x331ea723, + 0x1325fee4, + 0xe4570ea7, + 0xa70325fe, + 0xfee44bee, + 0x9127e325, + 0x9350c9c5, + 0x04966bfa, + 0x4305a315, + 0x23054315, + 0x13052315, + 0x03051315, + 0xe3050315, + 0xf093e315, + 0x93049658, + 0x04965bf1, + 0x965ef293, + 0x61f49304, + 0x03050496, + 0x23050315, + 0x43052315, + 0xf2934315, + 0x930497a0, + 0x049793f4, + 0x979efe93, + 0xa1f09304, + 0xa3050497, + 0x13151305, + 0x43154305, + 0x23052315, + 0xe315e305, + 0x03150305, + 0xa70ef39b, + 0xfdcfff2e, + 0xfd7ef493, + 0x3524b5ff, + 0x93233529, + 0xfffdf3f4, + 0x453024c5, + 0xa7234529, + 0xefffff4e, + 0x2ea74315, + 0x25fd8fff, + 0x212b152b, + 0x5df59323, + 0x3da30497, + 0x23252800, + 0x18272411, + 0x28004da3, + 0x3ea72415, + 0xa7fee1c7, + 0xf7ffff4e, + 0xc54041c5, + 0xf313c053, + 0x7f3ce3fe, + 0x0ea73103, + 0xd1feffff, + 0x27014804, + 0x1843c026, + 0x1f833ff4, + 0x089b0000, + 0xd10ff39b, + 0x03014804, + 0x2627803c, + 0x27ea43c4, + 0x4801d130, + 0x5553bd01, + 0x4203ad02, + 0x2720a701, + 0x5054bd40, + 0x5c52d502, + 0x5153bd02, + 0x5852d502, + 0x5653bd02, + 0x5253ad02, + 0x5453bd02, + 0x1113c002, + 0xffff2ea7, + 0xe84627fe, + 0x4823d1f4, + 0xf633c401, + 0x96cef293, + 0xff4ea704, + 0x1207ffff, + 0x062843d1, + 0xd5971c03, + 0xe3024c53, + 0x2ce37f1c, + 0x0324197f, + 0x21c2802c, + 0x262c27f9, + 0x96a6f393, + 0x07102704, + 0x23310542, + 0xb8340321, + 0x374ea7f4, + 0x5465fee0, + 0xabb052c5, + 0xeb4127f3, + 0xf9f093f4, + 0xf1930490, + 0xe3049963, + 0x1ce37f0c, + 0x25f0157f, + 0xff2ea7f1, + 0x24d1ffff, + 0x4fe60a14, + 0x3ea70657, + 0x11fd8fff, + 0x104ca334, + 0x5cc13415, + 0x1d4027c0, + 0x53b227c4, + 0x01fddff1, + 0xbe1c0710, + 0xb9004d11, + 0xf6025054, + 0x96063d4f, + 0x35f393b1, + 0x32c10496, + 0x991127c0, + 0x23d16024, + 0x44960114, + 0x1c331027, + 0x403cfc0e, + 0x24810699, + 0xab282389, + 0x07248541, + 0xa231e0d2, + 0x19f31107, + 0x03f42134, + 0x34c2803c, + 0xa7e027f7, + 0xfdeb971e, + 0x4f271e05, + 0x0d030000, + 0xd1c11415, + 0x95f09358, + 0x20a70494, + 0x038d30a7, + 0xe0028d14, + 0x0e150105, + 0x02d50d25, + 0x02d50124, + 0x02d50128, + 0x02d5012c, + 0x028d0130, + 0x9c028d58, + 0xa70efe9b, + 0xfdeb8f3e, + 0x4f273e05, + 0x0d830000, + 0xfe9b3415, + 0x0538030e, + 0x004f273e, + 0x150e0300, + 0x0efe9b34, + 0x3e053803, + 0x00004f27, + 0x34150e83, + 0xa70efe9b, + 0xfdeb6f3e, + 0x4f273e05, + 0x14420000, + 0xfe9b3415, + 0x68d4c10e, + 0x0201cd07, + 0xe664cc03, + 0xa705fd4f, + 0xfde5bf4e, + 0x2c274205, + 0xa7421548, + 0xfde5af3e, + 0x4c274e35, + 0x15340524, + 0x07002732, + 0xbe3e351c, + 0x8902f971, + 0xf29372d3, + 0x8d0493f0, + 0xd3991023, + 0x72d18998, + 0x9974d089, + 0x133b62d4, + 0xf293033b, + 0x270450c0, + 0xff4ce0e0, + 0x41270666, + 0x249d433b, + 0x1d245d04, + 0x94d39923, + 0x132b2459, + 0x247d412b, + 0x9996d399, + 0x032b0424, + 0x402b2e3d, + 0x249d2339, + 0x673fe605, + 0x023f2705, + 0x27c40000, + 0x0000804f, + 0x7dfe93c7, + 0xe4350450, + 0xf093e325, + 0xc104938c, + 0x040164d3, + 0x0bc056c1, + 0x99043543, + 0x63996e61, + 0x27f1059a, + 0x27349620, + 0xc1f39321, + 0x329d0494, + 0xb6d499a2, + 0x423b1027, + 0x27a3349d, + 0xadf49320, + 0x30270494, + 0x9da6439d, + 0x42c5a141, + 0xa4418dac, + 0x99a842c5, + 0x3027a364, + 0x31274486, + 0xfe933633, + 0x0304948c, + 0x0163803f, + 0x60e3d500, + 0x6862c102, + 0xeeb0e4c1, + 0xa700ae24, + 0xfeffff1e, + 0x014214a9, + 0x014413a9, + 0x4f8b432b, + 0x072342c8, + 0xf1f153c1, + 0x271001fb, + 0xbe640f1d, + 0xa902f918, + 0xa90142c4, + 0x2b0144c3, + 0xcc4f8b43, + 0x62c1e442, + 0x0521e468, + 0xa7402705, + 0xfef9973e, + 0x34153405, + 0xf98f2ea7, + 0x152405fe, + 0x15f39324, + 0xf2930494, + 0x15049418, + 0x15340524, + 0xc1240534, + 0x5cc16861, + 0x3111e0c0, + 0x013f2705, + 0x27501000, + 0x0227102c, + 0x1003ed27, + 0xffff4ea7, + 0xc54315eb, + 0x3ea75c42, + 0x05e7ffff, + 0x503ec530, + 0xffff2ea7, + 0x154127f7, + 0xc5382724, + 0xc4994023, + 0xff3ea7b5, + 0x4123efff, + 0x34154183, + 0x53b051c5, + 0x01fb5bf3, + 0xacd7c130, + 0x02f92bbe, + 0x4ea73127, + 0x53f7ffff, + 0xc5fb4bfe, + 0xe4014c43, + 0x3c272027, + 0x03420510, + 0x27f3c844, + 0x27a027b0, + 0x4127119c, + 0x478b4a3b, + 0x008a4fe6, + 0x40070a47, + 0x41994d0b, + 0x038007b8, + 0xff1ce081, + 0x310703a0, + 0x33334107, + 0x432b4533, + 0x01984cf1, + 0x4807ff00, + 0x42994d0b, + 0xff2ce0b8, + 0x3207037b, + 0x33334207, + 0x432b4533, + 0x01904ef1, + 0xd499ff00, + 0xe046169a, + 0x100000ce, + 0xeee00371, + 0x71100000, + 0x14d4d103, + 0x004ddc01, + 0x4b872f04, + 0x4cf53b07, + 0xff0a3f80, + 0x0bfd3103, + 0x0004afec, + 0xb02cb1fd, + 0x43870004, + 0x3f804ef5, + 0x32fdff0a, + 0x0004b02c, + 0xafec83fd, + 0xb2030004, + 0xf9f8a103, + 0x4b07ff6a, + 0x54bd4f6b, + 0x47960256, + 0x92f6fe93, + 0x60e3d104, + 0xff4ea702, + 0x43e5f7ff, + 0xe5023f80, + 0x023f8443, + 0xbcd4b203, + 0x3c271720, + 0x002e2720, + 0x3b2b1000, + 0x42f54b87, + 0xff0a3f80, + 0xf398b103, + 0xfa56f153, + 0x40a71001, + 0x025c54d5, + 0x025854d5, + 0x02f6f3be, + 0xf46e6499, + 0x93030246, + 0x03071ff0, + 0x64895005, + 0x8d443372, + 0x63999c54, + 0x0736236e, + 0x034f6b43, + 0x2b42f036, + 0x00112704, + 0x0710273a, + 0x74648931, + 0x433b4433, + 0x999e548d, + 0x3b266c63, + 0x3c033607, + 0x4034c164, + 0xff004ed8, + 0xf4932aff, + 0x27049264, + 0xa1429d21, + 0xe6413499, + 0x9304044f, + 0x049253fe, + 0x99bce29d, + 0x41e04234, + 0x41f40402, + 0x402703e7, + 0x99bd549d, + 0x47e06e64, + 0x112703c1, + 0x10274600, + 0x9512f293, + 0x24210504, + 0x05322713, + 0xff4ea723, + 0x3d27f7ff, + 0x6e99069a, + 0xc052c19a, + 0x3d274335, + 0x43450208, + 0xf6a32399, + 0x99023e3f, + 0x4ff6a424, + 0x0027023a, + 0x10273027, + 0xe4864127, + 0x44474027, + 0x02104fa3, + 0x22c10400, + 0xab43ab68, + 0xe0312740, + 0x33033521, + 0xfe931e3c, + 0xab0491d8, + 0xc143ab41, + 0xe4c5c0e3, + 0x6832c1a8, + 0x033721e0, + 0x99a43499, + 0x4383a33d, + 0xd433d383, + 0xd4ab4833, + 0x2ff6daa3, + 0xb1270202, + 0xffff2ea7, + 0x312321ef, + 0xcb3dcb24, + 0x8643ab4b, + 0xdc24a14a, + 0x0000004f, + 0xc2072140, + 0xf922f153, + 0x10014127, + 0x1c27c405, + 0xf646be1a, + 0x05402702, + 0xd8c3a1c4, + 0x0000003f, + 0x4ea7e340, + 0x25efffff, + 0xa74b354d, + 0xfdefff3e, + 0x34d54327, + 0x34c10288, + 0xfb48dc88, + 0xefff2ea7, + 0x8824c1fd, + 0x08004ddc, + 0xd54427f9, + 0xd5028824, + 0x27028c24, + 0x6023d530, + 0x772ea706, + 0x2305fdeb, + 0x00004f27, + 0x24151402, + 0xa70ef39b, + 0xfde5cf2e, + 0x05184c27, + 0xc1231524, + 0x3f27c051, + 0x20000000, + 0x35281489, + 0x004d8323, + 0xc145c680, + 0x41dc4414, + 0xdc148128, + 0x9322c04c, + 0x0490fbf2, + 0xe6a22499, + 0x27022f4f, + 0x54991f1c, + 0xa65399a3, + 0x248b2107, + 0x529d138b, + 0xa6519da3, + 0x025652b9, + 0x017e2fe6, + 0x90d2f393, + 0xa434b904, + 0x33340702, + 0x2b433335, + 0x9c3ee934, + 0x93ff0001, + 0x0490bbf4, + 0xe99c4e8d, + 0x00019e30, + 0x9e408dff, + 0x01a031e9, + 0x53c1ff00, + 0x283489c0, + 0x80004d83, + 0x34c14566, + 0x03423844, + 0x0117e317, + 0xe0d027f2, + 0x27020d2a, + 0x2d11e0c1, + 0x21f35302, + 0xbe3001f8, + 0x5300464b, + 0x01f81bf4, + 0x27102742, + 0x2730a7e4, + 0x27230d00, + 0x57219d30, + 0x9d52218d, + 0x239d5621, + 0x50208d58, + 0x0354208d, + 0x602c0311, + 0x07dffef0, + 0xad40134c, + 0x66017c54, + 0x41f493d5, + 0x40bd0490, + 0xfe530182, + 0xe001f7d8, + 0x02f97bbe, + 0xffff3ea7, + 0xf83401f7, + 0x01f6204c, + 0xf7b6f253, + 0x89be2001, + 0x2ea702f5, + 0xd1ffffff, + 0xf60a1424, + 0xa7f9ad4f, + 0xfd8fffee, + 0x4ce3e411, + 0x5ee41510, + 0xf253f9aa, + 0x2001f790, + 0xa5be1c07, + 0xb00702f5, + 0xf9a1bff6, + 0x53f9b45e, + 0x01f783f3, + 0xfc905e3e, + 0xf77af253, + 0x6b5e2c01, + 0x07ce07fc, + 0xfc935e12, + 0x2107ec07, + 0x99fc8c5e, + 0x1227a424, + 0x142b3213, + 0x17833783, + 0x33143c33, + 0x0e27171c, + 0x5e040000, + 0xb327fdb8, + 0xf0fdff5e, + 0xe400ee48, + 0x93fcfa4a, + 0x034473f3, + 0x8f9af293, + 0x5e230504, + 0x3f27fcf2, + 0xe4000100, + 0x01004f27, + 0x9a5ee700, + 0x072481fa, + 0x004da302, + 0xbe248540, + 0x5e003d68, + 0x0027f905, + 0x27241c27, + 0x56be483c, + 0x1c0702f3, + 0x2c270027, + 0xf383be48, + 0xfa115e02, + 0x8f56f193, + 0x27302704, + 0x139d104c, + 0x8d3027a3, + 0x129d9e14, + 0xa4138da6, + 0x279c148d, + 0xfe945e11, + 0x3ea74027, + 0x25fee43f, + 0x332ea734, + 0x2425fee4, + 0xe4571ea7, + 0xa71425fe, + 0xfee44b0e, + 0xfe930425, + 0x15048db0, + 0x153405e4, + 0x15240534, + 0x15140524, + 0x15040514, + 0x89f19304, + 0xf093048d, + 0x93048d7c, + 0x048d87f2, + 0x04150405, + 0x14151405, + 0x24152405, + 0x61c1e405, + 0xc05cc168, + 0xfad311e4, + 0x00013f27, + 0x2e275310, + 0x27088098, + 0x0000020f, + 0x03ed2790, + 0xfaca5e50, + 0x5e0f1c27, + 0xe127fdd2, + 0x93f9995e, + 0x03234bfe, + 0x8eb2f493, + 0x5e4e0504, + 0x3027fc0a, + 0x931e3c33, + 0x048ea3fe, + 0x43ab41ab, + 0xc5c0e3c1, + 0x32c1a8e4, + 0xcd21e468, + 0x614c27fc, + 0xc1ace4c5, + 0xc15e6832, + 0x5ef2e8fc, + 0xd127f753, + 0xf65ec027, + 0x934227fd, + 0x049157f3, + 0x4a5e3405, + 0xbe0207fc, + 0x5e003d48, + 0x3127f7f5, + 0xc0fbdc5e, + 0xff1e1d42, + 0xd25ec027, + 0x934027fd, + 0x048e4ff0, + 0x5ebc049d, + 0x4127fbfb, + 0x5ebd549d, + 0x6499fc03, + 0x2c4ac06e, + 0x549d4227, + 0xfbf55ebd, + 0xcc27d307, + 0xbdf15328, + 0xc51001f5, + 0x1c2740dc, + 0xf2e2be0d, + 0xc5482702, + 0xd30140d4, + 0xed203cfc, + 0x27e31efd, + 0xbd549d43, + 0x4efbca5e, + 0x99f493fb, + 0xf41b0145, + 0xffff3ea7, + 0x113499ff, + 0x34994696, + 0x9345f612, + 0x055feff4, + 0x44d64419, + 0x010165be, + 0xa70f3c27, + 0xfdbfff4e, + 0x3c274335, + 0xff4ea75f, + 0x43c5fd4f, + 0xb63c2734, + 0xefff4ea7, + 0x0443d5fd, + 0x077bbe0f, + 0xff3ea701, + 0x4e27fd7f, + 0x1580000a, + 0x25422734, + 0x92c6be34, + 0xff3ea700, + 0x3499ffff, + 0x2744c611, + 0x99231eb0, + 0xb1271234, + 0xb0274486, + 0xf493b726, + 0x19055f90, + 0x99460644, + 0x4c3c2434, + 0x4986be7f, + 0x4991be00, + 0xff2ea700, + 0x2499ffff, + 0xffcea711, + 0x4103feff, + 0x2711249d, + 0x48c4d543, + 0xff1ea701, + 0x1401fd4f, + 0x3d07d127, + 0x4307343b, + 0x6b0e2399, + 0x9d34ab4f, + 0x14c50e23, + 0x9b40273c, + 0x01270ef4, + 0x004b42be, + 0x1ffdc0bd, + 0x14300cd8, + 0xa7100c38, + 0xfdcfff4e, + 0xa7644dc5, + 0xfdcfff4e, + 0x86604dc5, + 0xff4ea7bf, + 0x41d1ffff, + 0x18060a14, + 0xafff2ea7, + 0xa72441fd, + 0xfd7fff3e, + 0x2405410b, + 0x4ce33421, + 0x11342510, + 0x104ca334, + 0xfc933415, + 0x19055ef4, + 0x4df3bec0, + 0x16c41900, + 0x480d2748, + 0x4ccfbe0d, + 0xd5f49300, + 0x4005055e, + 0x04000d27, + 0x004cc0be, + 0x5ecaf493, + 0xbe400505, + 0x27007f80, + 0x0ef49b40, + 0xffffbea7, + 0xff3ea7fe, + 0xb2b9fd4f, + 0x34c50140, + 0xb925c638, + 0x531ffdb0, + 0xbe018304, + 0xa7007f92, + 0xffffeb0e, + 0x01050dbe, + 0x004985be, + 0xffeb0ea7, + 0x04ddbeff, + 0x90c6be01, + 0x27f4ab00, + 0xa7fcebc1, + 0xfd7fffde, + 0x03aafdbe, + 0x4c83d411, + 0xbed41518, + 0xbe0090ae, + 0xb90105ed, + 0x260141b4, + 0xff4ea745, + 0x4c45d07f, + 0x9d53f493, + 0x26441904, + 0xbe012747, + 0xab00474a, + 0x4e09befc, + 0xe3d41100, + 0x0400004e, + 0xfcebd415, + 0x2027f1ab, + 0x22c0041e, + 0xf824f921, + 0xd0ff011f, + 0x42872142, + 0x300044f1, + 0x44d8ff02, + 0x27420716, + 0x2b410335, + 0x27461032, + 0xf0210331, + 0x4127d9f3, + 0x4027031e, + 0x4d56f1eb, + 0x4ea73127, + 0xc5fdcfff, + 0xf1ab6043, + 0x041e2027, + 0xf92122c0, + 0x011ff824, + 0x2142d0ff, + 0x44f14287, + 0xff023000, + 0x071644d8, + 0x03352742, + 0x10322b41, + 0x03312746, + 0xd9f3f021, + 0x031e4127, + 0xf1eb4027, + 0x43274516, + 0xc31ef4e8, + 0x012e85be, + 0xffffbea7, + 0xffdea7ff, + 0x0b1efd4f, + 0xc50ef39b, + 0x6fbe38d3, + 0xb461012e, + 0x42563027, + 0x4fff4ea7, + 0x994201fd, + 0xbe990eb3, + 0x3b412711, + 0x2334eb42, + 0x0eb39de1, + 0xa711be9d, + 0xfeffff2e, + 0x83092499, + 0x33340743, + 0x2b448734, + 0x5034f934, + 0x07ff0000, + 0x4f34f9c4, + 0x23ff0000, + 0x4f34fd41, + 0xd6ff0000, + 0x092399eb, + 0x2b44b499, + 0xc84f4b43, + 0xc5863041, + 0x0628b4d1, + 0xc525bc9d, + 0xf49340b4, + 0x01055d34, + 0xa7402741, + 0xffffff0e, + 0x9d12be9d, + 0xb49d0cb4, + 0x464cbe2a, + 0xbe0c0700, + 0x1e007a29, + 0xffcea717, + 0xc199ffff, + 0xcd0ea70e, + 0x98befff9, + 0x41270106, + 0x9312c49d, + 0x049bfcf4, + 0x4d064419, + 0xffff1ea7, + 0xd61251ff, + 0x93302723, + 0x049be8f4, + 0x4027431d, + 0x9b0bf49b, + 0x3ea70ef4, + 0x9dfd4fff, + 0x129d1012, + 0x9b33010f, + 0x21270ef4, + 0x3b0e1499, + 0xa724cb23, + 0xfd4fbf3e, + 0x41272138, + 0x21533405, + 0x25863403, + 0x4027f31e, + 0x9b0bf49b, + 0x3ea70ef4, + 0x11feffff, + 0x104c2732, + 0x1fdc34bd, + 0x24fd4027, + 0xff000000, + 0xf49b4027, + 0xff4ea70e, + 0x4499ffff, + 0xbe44d612, + 0x2700469b, + 0xff4ea731, + 0x43c5fd4f, + 0x4eff1e30, + 0x3df493f7, + 0xf41b0164, + 0x6fff2ea7, + 0x024d27fd, + 0x27242560, + 0x1540023d, + 0xa7102723, + 0xfee0674e, + 0x3ea7411d, + 0x1dfee066, + 0x1d420331, + 0x1d320341, + 0x1d420331, + 0x1d320341, + 0x1d420331, + 0x1d320341, + 0x1d420331, + 0x1d320341, + 0x1d420331, + 0x1d320341, + 0x93202731, + 0x04aeb7f3, + 0xae92f093, + 0x95fe9304, + 0xfc9304ae, + 0x9304ae98, + 0x04ae9bfb, + 0xaea6fa93, + 0xa9f99304, + 0xf89304ae, + 0x9304aeac, + 0x04aeaff7, + 0x02153215, + 0xc215e215, + 0xa215b215, + 0x82159215, + 0x42037215, + 0x3205411d, + 0xe2050205, + 0xb205c205, + 0x9205a205, + 0x72058205, + 0x3ea74103, + 0x1dfee059, + 0x03311d41, + 0xa7411d42, + 0xfdeb3f3e, + 0x4f273205, + 0x11030000, + 0xf29b3415, + 0x0538030e, + 0x004f2732, + 0x150b0400, + 0x0ef29b34, + 0xe4ef1ea7, + 0x1f4c27fd, + 0x12151405, + 0x00000f27, + 0x1035a000, + 0xe4df3ea7, + 0x054103fd, + 0xa7321534, + 0xfdeb671e, + 0x12053035, + 0x00004f27, + 0x14151482, + 0x930ef29b, + 0x04aefbfe, + 0xec033e07, + 0xe32e0797, + 0x2ce37f3c, + 0x97ec237f, + 0x3c033419, + 0xf932c280, + 0x93262c27, + 0x04aedbf3, + 0x42071027, + 0x21233105, + 0xf4b83403, + 0xe01f4ea7, + 0xabe455fe, + 0xeb4127f3, + 0xff3ea7f4, + 0x3235ebff, + 0x2ea74327, + 0xd5fdefff, + 0xc102a024, + 0x48dca024, + 0xff1ea7fb, + 0x14c1fdef, + 0x004ddca0, + 0x4427f908, + 0x02a014d5, + 0x02a414d5, + 0x13d53027, + 0x2ea706a0, + 0x05fdeb5f, + 0x004f2723, + 0x150f0300, + 0x0ef39b24, + 0xe56f2ea7, + 0x284c27fd, + 0x23152405, + 0x00004f27, + 0x33272000, + 0x13d52435, + 0x3ea702a8, + 0xc1fdefff, + 0x48dca834, + 0xff1ea7fb, + 0x14c1fdef, + 0x004ddca8, + 0x4427f908, + 0x02a814d5, + 0x02ac14d5, + 0x13d53027, + 0x2ea706a4, + 0x05fdeb57, + 0x004f2723, + 0x150f8300, + 0x0ef39b24, + 0xe54f2ea7, + 0x294c27fd, + 0x23152405, + 0x00004f27, + 0x33272000, + 0x13d52435, + 0x3ea702b0, + 0xc1fdefff, + 0x48dcb034, + 0xff1ea7fb, + 0x14c1fdef, + 0x004ddcb0, + 0x4427f908, + 0x02b014d5, + 0x02b414d5, + 0x13d53027, + 0x2ea706a8, + 0x05fdeb4f, + 0x004f2723, + 0x15100300, + 0x0ef39b24, + 0xe52f2ea7, + 0x2a4c27fd, + 0x23152405, + 0x00004f27, + 0x33272000, + 0x13d52435, + 0x3ea702b8, + 0xc1fdefff, + 0x48dcb834, + 0xff2ea7fb, + 0x24c1fdef, + 0x004ddcb8, + 0x3427f908, + 0x02b823d5, + 0x02bc23d5, + 0x24d54027, + 0x2ea706ac, + 0x05fdeb47, + 0x003f2724, + 0x15108300, + 0x0ef49b23, + 0xe50f1ea7, + 0x2b3c27fd, + 0x14151305, + 0x00003f27, + 0x13352000, + 0xaf9af293, + 0x93302704, + 0x04ad5ff0, + 0xc5e8e48d, + 0xe38d9024, + 0x352445f6, + 0x3c24c524, + 0xc53824c5, + 0x24c56824, + 0x9424c564, + 0x8df4e48d, + 0xe48dc0e4, + 0xc4e48dc2, + 0x8dc6e48d, + 0xe48dc8e4, + 0xe2e48de0, + 0x0ee4e48d, + 0xd8129ef7, + 0xa3fa4e03, + 0x49f493f6, + 0xf41b0162, + 0x5fff3ea7, + 0x024d27fd, + 0xddfa9382, + 0x342504ce, + 0xac032a07, + 0x07341597, + 0x7f2ce33a, + 0x237f3ce3, + 0x241997ac, + 0xc2802c03, + 0xdc27f923, + 0xb9f39326, + 0x202704ce, + 0x32054d07, + 0x3403d123, + 0x3d27f4b8, + 0x4ea70104, + 0x25fdbf3f, + 0x0f2ea743, + 0x2d05fdeb, + 0x00004f27, + 0x24151542, + 0xce1ef193, + 0x21f09304, + 0xfe9304ce, + 0x9304ce24, + 0x04ce27fc, + 0xce2afb93, + 0x133ea704, + 0xa355fee0, + 0x0d151d15, + 0xcd15ed15, + 0x1d05bd15, + 0xed050d05, + 0xbd05cd05, + 0xf49b4027, + 0x27f3ab0e, + 0xa7f2eb21, + 0xfddfff4e, + 0xc5c44dc5, + 0x3d27c84d, + 0x43c52000, + 0x5c42d5cc, + 0xad402701, + 0x070118a4, + 0xff3ea74f, + 0x4c03e7ff, + 0xd53d3520, + 0x270150a4, + 0x934f0730, + 0x04ce1ff0, + 0x8db1a39d, + 0xa4d5caad, + 0xadd50154, + 0xadd502c0, + 0xadad033c, + 0xadad011a, + 0xadad011c, + 0xadad011e, + 0xadad0120, + 0xadad0140, + 0xadad0142, + 0xadad0144, + 0xad8d0148, + 0xbaad8dbc, + 0x8db2ad8d, + 0xad8db4ad, + 0xb8ad8db6, + 0x8dbead8d, + 0xad8dc0ad, + 0xc4ad8dc2, + 0xbec8ad8d, + 0x8303fc45, + 0x1efa8ef6, + 0xa7fc4eff, + 0xfd9fff4e, + 0xc0074d01, + 0xbe12d2d8, + 0xa701809e, + 0xfdcfff3e, + 0x34c54027, + 0x6034c540, + 0x0710dc58, + 0x9efc0e0c, + 0x8e000893, + 0xa7fa4efc, + 0xffffffae, + 0x9fffbea7, + 0xffdea7fd, + 0xcea7feff, + 0xd1fdcfff, + 0x260a14a4, + 0xa3b41145, + 0x061e104c, + 0x4ce3b411, + 0xb9b41510, + 0x3c1ffdd4, + 0x0027104c, + 0xd4d1331e, + 0x42c40148, + 0x09d49920, + 0x4383d311, + 0x44332487, + 0x3387422b, + 0x0d1833f1, + 0x44f1ff00, + 0xff000054, + 0x009643e2, + 0x01772cbe, + 0x04964127, + 0x04074027, + 0x44f9d411, + 0xff000a08, + 0x423c4f4b, + 0x1ffdd4b9, + 0xb9104c3c, + 0xd81ffdd4, + 0x9914204c, + 0x438309d4, + 0x44333487, + 0x44f9432b, + 0xff000050, + 0x0ff64f96, + 0xd311ff7f, + 0x0a0834f9, + 0x41a3ff00, + 0x0a0834fd, + 0x2127ff00, + 0xc568c2c5, + 0xf1ab40c2, + 0xd4bd4127, + 0x30271ff8, + 0xc50ef39b, + 0xf39b68c2, + 0x8b00070e, + 0xbd4027ff, + 0x9b1ff8d4, + 0xf1eb0ef3, + 0x1140c0c5, + 0x60c0c5d3, + 0x0a0834f9, + 0x41e3ff00, + 0x0a0834fd, + 0xc2c5ff00, + 0xff295e68, + 0x4107fa8e, + 0x43d840ab, + 0x01151e0f, + 0x05242313, + 0x03140303, + 0x07071e04, + 0x03425342, + 0x86f45841, + 0x03141925, + 0x03041d11, + 0x0bf2a801, + 0x07f94efe, + 0x07b107a0, + 0x409c27c2, + 0xdc071c1e, + 0x0741cc10, + 0xbe1d07d9, + 0x0701753f, + 0xbe1d070a, + 0x2b017521, + 0x0bbd0bcd, + 0x760b07ad, + 0x07f98ec0, + 0x33453340, + 0xf9402b03, + 0x00018c40, + 0x0f0c83ff, + 0x0e230333, + 0x9effff7e, + 0x9303d14d, + 0x0419bff2, + 0xfeb33ea7, + 0x304c27fe, + 0x34033101, + 0x24032105, + 0x4027f4a8, + 0x0b0ef49b, + 0xb32ea7fe, + 0xf393fefe, + 0x2704199c, + 0x3101304c, + 0x21053403, + 0xf4a82403, + 0xf49b4027, + 0xa7fe0b0e, + 0xfdebff3e, + 0x34054027, + 0x00004f27, + 0x34151282, + 0xf49b4027, + 0x4efe0b0e, + 0xffbea7f8, + 0x8007fdeb, + 0x0027c027, + 0x9f27a107, + 0x12820000, + 0x01750bbe, + 0xb915bc05, + 0xf49b4027, + 0xff3ea70e, + 0x4427fde7, + 0x3a153405, + 0xe7ef4ea7, + 0x053c35fd, + 0x274a1548, + 0xbe4c3500, + 0x050174e4, + 0x27b915bc, + 0x0ef49b40, + 0x0027f88e, + 0xfd4efe0b, + 0xffff4ea7, + 0x094499fe, + 0xffff1ea7, + 0x034383ff, + 0xd1348741, + 0x33062012, + 0xf1432b44, + 0x00004843, + 0x2724c6ff, + 0xd10d1e40, + 0x27062c14, + 0x27430a21, + 0x07420720, + 0xabdf6bd4, + 0x273027fe, + 0xc0151e25, + 0x34f91232, + 0xff011ff8, + 0x14f146a6, + 0xff023000, + 0x030b44d8, + 0x28138731, + 0x1e0127f2, + 0x8b002703, + 0x8efeeb0d, + 0x6bfe4efd, + 0xbe05960f, + 0x0e0021e8, + 0x15e49efe, + 0x4efe8e00, + 0x070419fd, + 0xc61f6bd0, + 0xbe18d645, + 0x0e001619, + 0x217d9efd, + 0x9316d600, + 0x0174a8f3, + 0x6a86f493, + 0xbe430504, + 0xbe000938, + 0x270017eb, + 0x8ed41d41, + 0x07fd4efd, + 0x563f6bd1, + 0xbe3bc626, + 0xbe0018af, + 0x27002211, + 0x1e402701, + 0x2c22c42b, + 0x4f4b0419, + 0x00274220, + 0xd6befd8e, + 0xf4930021, + 0xd5046b24, + 0x93021440, + 0x01745cf3, + 0x6a3af493, + 0x27430504, + 0x1d422701, + 0x27fd8ed4, + 0x4efd8e00, + 0x01f493fc, + 0x4e69046b, + 0xdea74329, + 0x09fee043, + 0x08d19942, + 0xc007e30b, + 0x4049e22b, + 0xc1ce4221, + 0x09d49910, + 0x490a42ce, + 0x69e42ed4, + 0x1904ced4, + 0x4fff4ea7, + 0xa74311fd, + 0xfee0434e, + 0x4c9d4305, + 0x09429d08, + 0x406d4e4d, + 0xf94efc8e, + 0xbc23b007, + 0x0b414714, + 0x0742094b, + 0x99d10730, + 0x24c62409, + 0x241e0107, + 0x41034107, + 0x0107e447, + 0x0b1c1c27, + 0x101d2beb, + 0x11271d4c, + 0xf1f00103, + 0x1e302705, + 0x03e20953, + 0x072266e2, + 0x0c4c2340, + 0x3301493b, + 0x1047c487, + 0x21234b07, + 0xc30b410b, + 0x3287420d, + 0x3c0b2007, + 0xa4271223, + 0x1b0b2d2b, + 0x3301a93b, + 0x0d0a2103, + 0xffffdfc4, + 0x270bffff, + 0x27071e21, + 0x05142d41, + 0x270123ce, + 0x2be03be1, + 0x23e30bca, + 0x07f25812, + 0x4ef98e03, + 0xc5f6a3f5, + 0x029954f0, + 0x3b312724, + 0x50f2c532, + 0x20074f07, + 0xc54cf3c5, + 0x2c2358f1, + 0x40f4c514, + 0xc1103c27, + 0x402740f1, + 0x14031405, + 0x8840f1c5, + 0xc17207f3, + 0x10274cf2, + 0x3a272123, + 0x2748f1c5, + 0xf2c50dac, + 0x64f3c560, + 0x89187889, + 0x82f01a75, + 0xf4c100ea, + 0xe345ee4c, + 0x50f1c100, + 0x3a074a07, + 0x230d4c23, + 0x413b0c3c, + 0xf1c1313b, + 0x01048754, + 0x23350b12, + 0x0bc387a1, + 0x07312702, + 0x273a3bb8, + 0x03c20b40, + 0x079507a1, + 0x036027d0, + 0x5cf3c5b1, + 0x1e44f4c5, + 0x070e0151, + 0x5b3e071f, + 0x0f3c833a, + 0x410b4387, + 0x2b264201, + 0x8b5cf4c1, + 0x07450642, + 0x1e2e0712, + 0xc11e0703, + 0x420b5cf4, + 0xc11b41ce, + 0xc20544f4, + 0x33874203, + 0x320b2f07, + 0x0344f4c5, + 0x034027c4, + 0x1e340591, + 0x03de0509, + 0x05031ed4, + 0x0304034e, + 0x05fbf061, + 0x211e3f07, + 0xca60f2c1, + 0x4607a492, + 0x41033807, + 0x840a362b, + 0x31278496, + 0x04030401, + 0xd403d405, + 0xdd1ef3a8, + 0x45463401, + 0x4027d405, + 0x3405d403, + 0x0340f2c1, + 0xed32ce34, + 0xce58f3c1, + 0x41270aa3, + 0x4027950e, + 0xc148f4c5, + 0x798d44f4, + 0x8d481b1a, + 0xf1c11874, + 0x23a10364, + 0x64f1c511, + 0x1ff67203, + 0xf0c1ff00, + 0x8ef68348, + 0xff3ea7f5, + 0x34d1ffff, + 0x400b0608, + 0x060834d5, + 0xfe0bfe0b, + 0xffff4ea7, + 0x0042b9ff, + 0xfc40c101, + 0x40073207, + 0x030f4c83, + 0x27121e31, + 0xfd010340, + 0x00007c14, + 0x234007ff, + 0x0f4c8321, + 0x13331407, + 0x1e03f3f0, + 0x7e14f909, + 0x06ff0000, + 0xff4ea740, + 0x42bdffff, + 0x40c50100, + 0x4efe0bfc, + 0x3ec007fc, + 0x0e4127b4, + 0x0740270c, + 0x4efc8e04, + 0x03c007fc, + 0xffffffcf, + 0x00cf8303, + 0x07fc0000, + 0x2720271c, + 0x25be163c, + 0x4ea700f8, + 0x27fffa23, + 0x404cc530, + 0xc53c43c5, + 0xfc8e3840, + 0xd007fa4e, + 0x4714dc23, + 0x03cd0bc2, + 0xdb9914dc, + 0x27ce0924, + 0x074b3b41, + 0x0b4223ae, + 0x32d001a3, + 0x8e0127a4, + 0x0c2c23fa, + 0xe20b2b3b, + 0x040b4e87, + 0x1cbe2387, + 0x412700eb, + 0xca0d0027, + 0x8e31d49d, + 0x99f74efa, + 0x41272403, + 0xf063433b, + 0x0a017407, + 0xf105d007, + 0x7333b107, + 0xc0078487, + 0xc2499027, + 0x1a070b07, + 0x91032287, + 0x00eae6be, + 0xb70ba80b, + 0x9cc4c203, + 0xd499e910, + 0x07de0124, + 0x9d4103c4, + 0xf40124d4, + 0xd405c603, + 0x1f070d07, + 0x31272c07, + 0x6d7efe05, + 0xb10596ff, + 0x3b4127d3, + 0xb5340b4c, + 0x8ef043d3, + 0x93fa4ef7, + 0x01234bf0, + 0x00f387be, + 0x234bf093, + 0xf37ebe01, + 0x1fbea700, + 0xdc27fffa, + 0x09a0270c, + 0x071d07b2, + 0x93cd3bc2, + 0x012355f0, + 0xb2033c07, + 0x00f35fbe, + 0xd103ac0b, + 0x0600bfc4, + 0xa7e1ff00, + 0xfffa23ce, + 0x9332c189, + 0x01235af0, + 0x00f343be, + 0xc3b1c1a1, + 0x4a072107, + 0x2361f093, + 0x0e2a2b01, + 0xf32e9efa, + 0xc1f64e00, + 0x0cc13808, + 0x240e993c, + 0xb107d007, + 0x90277027, + 0x270c6c27, + 0x06071c3c, + 0x031e362b, + 0x22270103, + 0x203b4c07, + 0x2c0b405b, + 0xf3f0415c, + 0xc2041e03, + 0x4007eb2b, + 0x470c4c23, + 0x492d0b24, + 0x0b4e3b21, + 0x87d30141, + 0x07430b44, + 0x273c0b38, + 0x034305a1, + 0x074a0711, + 0x4d403b3e, + 0x0b370321, + 0x27030ac4, + 0x07190271, + 0x3b4a0791, + 0xda42234e, + 0x76661494, + 0x0d071307, + 0x07fc097e, + 0x7e0d0710, + 0xde99feb9, + 0x90cbca24, + 0xd3c1d4a1, + 0x3cdbc53c, + 0x4b0b432b, + 0xf68ed4a5, + 0x02c1fa4e, + 0x4003c13c, + 0x04a1d107, + 0x0fffdd03, + 0x0fffdde3, + 0xa007322b, + 0x00c1d42b, + 0x07376638, + 0x07d302bd, + 0x0bcb07b3, + 0xbe1c07c2, + 0x0700f610, + 0x7e1c070a, + 0xdb2bff35, + 0x0d07d606, + 0x07fdf67e, + 0x0e1d070a, + 0xff235efa, + 0xfa4efa8e, + 0x07310499, + 0x07a207d0, + 0xc6c107b3, + 0xfc1d7e46, + 0x0d070526, + 0x877e1c07, + 0x9d4027fb, + 0x0fd631d4, + 0x0bb2c05e, + 0xb07e0a07, + 0xc00e66fd, + 0x4c474fb3, + 0x99144c23, + 0x4d0b24d2, + 0x323b3127, + 0x31234409, + 0x3c073422, + 0x4207111e, + 0xc4424703, + 0x31033c07, + 0x3207051e, + 0x41273803, + 0xd1a1433b, + 0x31233407, + 0x13eb130b, + 0x0d07140b, + 0x89ff4b7e, + 0x0d0732d4, + 0x1c074103, + 0x0e32d48d, + 0xfb245efa, + 0xfa8e0027, + 0xd207fa4e, + 0xb107a007, + 0x3d072a46, + 0x2b071a07, + 0xfa230ea7, + 0xfd7e7eff, + 0xcea707a6, + 0x99fffa23, + 0x222724c0, + 0x07031027, + 0x018b4fbe, + 0x0c071007, + 0x1efda47e, + 0x9b4027d6, + 0xfa8e0ef4, + 0x0c274007, + 0x03031e0c, + 0x3b212701, + 0xf824ca20, + 0xffff3ea7, + 0x0834d1ff, + 0x0b102706, + 0x0834d542, + 0x9e222706, + 0x4e018b18, + 0x9bb007fb, + 0xf093121f, + 0xbe0121be, + 0x1100f158, + 0xcbf093b1, + 0x4dbe0121, + 0xb12100f1, + 0x21d2f093, + 0xf142be01, + 0x93b10100, + 0x0121d9f0, + 0x00f137be, + 0xdb07c027, + 0x1c07d231, + 0x21daf093, + 0xbec10301, + 0x0300f124, + 0x0fccc4d4, + 0x0e0b07ec, + 0xf6f59efb, + 0xa80499ff, + 0x4ea74626, + 0xc5fff5d7, + 0x41033804, + 0x0b3404c5, + 0xff4ea7fe, + 0x4411feff, + 0xf5e04e23, + 0x3404c5ff, + 0x04c54823, + 0xa7fe0b38, + 0xf9ffff3e, + 0x11112f27, + 0x4d271111, + 0x32050100, + 0xf4c83403, + 0xf49b4027, + 0x6af49b0e, + 0x9b6bf49b, + 0xf49b62f4, + 0x9d302763, + 0x039da904, + 0x5004c54c, + 0xc55404c5, + 0x04c59004, + 0x4804c544, + 0xc5a004c5, + 0x04c53c04, + 0x4d049d40, + 0x9d8b049d, + 0x049d8c04, + 0xa7fe0b8a, + 0xfdebc73e, + 0x34054027, + 0x00004f27, + 0x34150704, + 0xf49b4027, + 0x6bf29b0e, + 0x9b62f29b, + 0xf29b6af2, + 0x1c1ca363, + 0x0b60f19b, + 0x4efe0bfe, + 0x9df293fc, + 0x2ec10463, + 0x4023c150, + 0x4307e333, + 0x40084e2b, + 0x2d99e307, + 0x30249931, + 0x4d1bc207, + 0x2f6b2407, + 0x0431171e, + 0x21070341, + 0x4333430b, + 0x2f6b4e1b, + 0x0111404c, + 0xfc8e0001, + 0x41834207, + 0x05330407, + 0x042b4333, + 0x0f031207, + 0x00049488, + 0xd2ce1103, + 0xd0c0c1d2, + 0x8ed4c1c1, + 0x41f393fc, + 0x34990463, + 0x230f6baa, + 0xb0309d42, + 0x4c144f6b, + 0xc500270f, + 0xfe0bbc30, + 0x6326f493, + 0xcc40c104, + 0xfa4efe0b, + 0x05c60f6b, + 0xa7044f9b, + 0xf9f7ff3e, + 0x0b1e410b, + 0xa7043f9b, + 0xf9f7ff4e, + 0xd307310b, + 0xad27e407, + 0xbf271800, + 0x07090a00, + 0x1d27c427, + 0x0b070600, + 0x20070f6b, + 0x24032333, + 0xf3e8031e, + 0x100024f1, + 0x3327ff02, + 0x53184c33, + 0x44c01d4c, + 0x334007ee, + 0x004ef545, + 0xf5ff0218, + 0x02180441, + 0x233027ff, + 0xfde8004e, + 0x4e034335, + 0xf5fde800, + 0x0218104d, + 0x1441f5ff, + 0x23ff0218, + 0xfde7f04e, + 0xa12b4335, + 0x4a07c244, + 0x071ec127, + 0x4107c123, + 0xe10bc586, + 0xb853d10b, + 0x971e1407, + 0x0a000f27, + 0x14270709, + 0x2f6b2007, + 0x24032333, + 0xf3e8031e, + 0x100024f1, + 0x3327ff02, + 0xfc6a4ddc, + 0x100853f2, + 0x4efa8ef1, + 0x010d28fb, + 0x000d2720, + 0x0c051e20, + 0x07070300, + 0x07d373d0, + 0x93b823bd, + 0x046243f4, + 0x0fab0b07, + 0x33b441c1, + 0x27c40708, + 0xc47c1ee0, + 0x19d62fe4, + 0xc8633f9b, + 0xc49927b1, + 0x9b40abbc, + 0x4f9b6df4, + 0x63ef9b6d, + 0xe373e32b, + 0x4f9be403, + 0xbcc3c161, + 0x4486438b, + 0xed3a1127, + 0x641e0427, + 0xc1642f9b, + 0x2c53bcc3, + 0x0d32d818, + 0x440a21c4, + 0x644f9b12, + 0x151e4827, + 0x16103cd8, + 0x4c234207, + 0x0e44d480, + 0x9b0b12c4, + 0x4627644f, + 0x1e65f49b, + 0x403c1821, + 0x4f9b17a6, + 0x9b482764, + 0x24c665f4, + 0x051e1027, + 0x11031214, + 0xeddae103, + 0x1e032783, + 0x614f9b13, + 0x61aaf293, + 0xbc23c104, + 0x438b0027, + 0x93cc24c5, + 0x04619bf4, + 0x8eb441c5, + 0x07fc4efb, + 0x272f6bc0, + 0x0000ff4f, + 0x61f49b40, + 0x3e7e0207, + 0x934027fe, + 0x04617bfd, + 0xc5c8d4c5, + 0xc486c4d4, + 0xd4c1ff1e, + 0x004dd494, + 0x46361980, + 0x80000d27, + 0x20271007, + 0x00f2a2be, + 0x2798d0c5, + 0xc580004d, + 0xfc8e94d4, + 0xdd27fd4e, + 0xf0930600, + 0x7e046144, + 0x3ea7fcf5, + 0x27f9f7ff, + 0x054d0720, + 0x03d12332, + 0x93f4b834, + 0x04612bf0, + 0x93fd067e, + 0x046123f0, + 0x20271027, + 0x93fd4e7e, + 0x046117f4, + 0x9d7f3ca7, + 0x3c27b043, + 0xac43c5f7, + 0x4dc530a7, + 0xaa439d9c, + 0xc5bc4dc5, + 0x4dc5c04d, + 0x4efd8eb8, + 0xe9f493fe, + 0x4ce3040f, + 0x9b071e7f, + 0x4c0308f4, + 0x804fd080, + 0xf4000463, + 0x60daf393, + 0x8c329904, + 0x078a3499, + 0x9d42ab03, + 0x7cbe8c34, + 0x0027016c, + 0x0fbaf193, + 0xfda07e04, + 0x93604f9b, + 0x040faff3, + 0x200034d5, + 0xd5634f9b, + 0x9b200434, + 0x34d5624f, + 0xfe8e2008, + 0x05634f9b, + 0x99f49304, + 0x43c10460, + 0x9903153c, + 0x039db043, + 0xaa439908, + 0x9909039d, + 0x039dac43, + 0x8b44990a, + 0x0b0b049d, + 0x634f9bfe, + 0x6072f393, + 0xc5412304, + 0xfe0b4034, + 0x0399fd4e, + 0x83d0078a, + 0x2734d637, + 0x99fd8e00, + 0x4fa38b04, + 0xffffffa0, + 0x049d43ab, + 0x630f9b8b, + 0xbe40d0c5, + 0x070186e7, + 0x6bbbbe0d, + 0x8bd49901, + 0x46180027, + 0xfd8e0127, + 0xf293fe4e, + 0xc104602c, + 0x4f9b4023, + 0x1134ce63, + 0x388b2499, + 0x4ca3104c, + 0x8b249d20, + 0x016c75be, + 0x600ef093, + 0x8c049904, + 0xab8a0399, + 0x8a049d43, + 0x049d4027, + 0x623f9b8c, + 0xce634f9b, + 0x893e0943, + 0x022704c6, + 0xf093fe8e, + 0x99045fe8, + 0x4c838b04, + 0x104c24f0, + 0xfe8e0027, + 0x8b9c04c1, + 0x4efe8ef4, + 0xff4ea7fb, + 0x0cc1ffff, + 0x2a4bb938, + 0x27d0070a, + 0x009d5e00, + 0xd0994307, + 0x0f4c8331, + 0x0183e407, + 0xe3334533, + 0x2007e40b, + 0xee233007, + 0x33fff5d4, + 0x2b353323, + 0x0be17132, + 0x81e2613d, + 0x413135e4, + 0x07420be1, + 0x83342521, + 0x3127802c, + 0x30272496, + 0x26332307, + 0x27a31138, + 0x1c38151e, + 0x1e23a310, + 0x001d380e, + 0x1e21a304, + 0xa3100c06, + 0x4007802c, + 0x03334533, + 0x4d0b402b, + 0xc114429d, + 0x403154d1, + 0xc3194145, + 0xc115439d, + 0xe12154d3, + 0x300be231, + 0x42154105, + 0x1954d3c5, + 0x030127c4, + 0x99c41d41, + 0xd39931d4, + 0x03410330, + 0x31d49d31, + 0x9930d39d, + 0x42d430d4, + 0x07c3190c, + 0xfc4b2b43, + 0xff56804c, + 0xfa4efb8e, + 0x99310499, + 0x0bc13003, + 0x07432b34, + 0x6bd107e4, + 0x1ea027ef, + 0x41313141, + 0x33210b32, + 0x2b420723, + 0x9941284d, + 0x4cd81434, + 0x34994620, + 0x104cdc14, + 0x0e44d817, + 0xd24e15b6, + 0x1b320499, + 0x804cd84e, + 0x03b4192f, + 0x99b41d41, + 0xec073004, + 0xef6b4123, + 0x2730049d, + 0x834e07a1, + 0x33340741, + 0x2b433335, + 0x31049934, + 0x300bce07, + 0xe4cec103, + 0x41051ea9, + 0xc1041e34, + 0x04c55404, + 0xa7a7e650, + 0xffffff3e, + 0x34bd4127, + 0x33990635, + 0x9b40270f, + 0x41270ef4, + 0x34f53387, + 0xff02b040, + 0x99310499, + 0x03993002, + 0x6b422b32, + 0x18342b4f, + 0x049d803c, + 0x4efa8e32, + 0x59f093fd, + 0x08be045e, + 0xfd93016a, + 0xc1045e50, + 0x0d0754d1, + 0x13331103, + 0x07ff357e, + 0xfe6d7e0d, + 0xf09301f6, + 0x7e045e38, + 0xd1c1fa13, + 0x2df093a4, + 0x2027045e, + 0x585efd0e, + 0x07fb4efa, + 0x070107b0, + 0x84bdbec1, + 0x070b0701, + 0xff047e1c, + 0xfb0e0b07, + 0x4efe3a5e, + 0x890499f8, + 0x43831e21, + 0x94339407, + 0x942b4487, + 0xb9071d31, + 0xb00be30b, + 0x2b58bec5, + 0x07c007d3, + 0x6b4307a1, + 0x01df102f, + 0x27010000, + 0x000000df, + 0x60b29d01, + 0x315cbdc5, + 0x274d0ba3, + 0x27430e80, + 0x1f2ea781, + 0xa301fde7, + 0x2e05a411, + 0xc561b89d, + 0xc4c5d0c3, + 0x272d15d4, + 0xa72e35e0, + 0xfde70f3e, + 0x051a4c27, + 0x993d1534, + 0x3e3561b4, + 0x98be44c6, + 0xc4990168, + 0x88c39989, + 0x2c032907, + 0x030c0758, + 0x0b310341, + 0x89c49d02, + 0x8e88c39d, + 0x93fc4ef8, + 0x040c6ff4, + 0x1e7f4ce3, + 0x0cf49b07, + 0xd0804c03, + 0x0463804f, + 0x4027f400, + 0x930ef49b, + 0x045d5bf0, + 0x27f90c7e, + 0x49f19301, + 0x2f7e040c, + 0x41fc93fa, + 0xf093040c, + 0xd1045d44, + 0xd12000c1, + 0x072004c2, + 0xf9697ed0, + 0x588ad499, + 0x04c3d147, + 0x08c4d120, + 0x2834ce20, + 0xf630d499, + 0x7e0d0744, + 0xc1d1fd4b, + 0xd4c12004, + 0x4cd29940, + 0x2432411b, + 0x20274008, + 0x5d06f093, + 0x9efc0e04, + 0x8e016a2e, + 0x9bfc4efc, + 0xf09363cf, + 0xc1045cf4, + 0x20273c01, + 0x016a19be, + 0x27634f9b, + 0x274c4e00, + 0x9b482701, + 0xfc8e65f4, + 0xd007fd4e, + 0x3f9b0401, + 0xc8432b63, + 0x03997240, + 0x53312409, + 0x1e03ddf2, + 0x5332240d, + 0x1e048cf2, + 0x3cf25305, + 0xb1f49302, + 0x439d045c, + 0x9c42c5aa, + 0x7e08d099, + 0xd099f961, + 0x68acbe0a, + 0x60f09b01, + 0x4cbed001, + 0x02c0016b, + 0x8df393f8, + 0x3499045c, + 0xd8d2118a, + 0x33c10e41, + 0x33420790, + 0x08432b33, + 0x93230741, + 0x045c73f4, + 0x993c42c5, + 0x30270bdd, + 0x9d8b4d9d, + 0x0f9b8c43, + 0x9efd0e63, + 0x8e0182ff, + 0x07fd4efd, + 0x51f093d0, + 0x7c7e045c, + 0x49f493fc, + 0x43c1045c, + 0x4c429940, + 0x432b4d07, + 0x40082432, + 0x1d072027, + 0x5c32f093, + 0x9efd0e04, + 0x9301695a, + 0x045c27f4, + 0x1e4040c1, + 0x99f54ec9, + 0x03993104, + 0x9802c130, + 0xc407432b, + 0xd007f0a3, + 0xb207cf6b, + 0x90278027, + 0xa0275027, + 0xe7ff6ea7, + 0xef7ea7fd, + 0xf205fde7, + 0x9f5ef115, + 0x83ec0700, + 0x074e07e1, + 0x3343333e, + 0x0b342b35, + 0x4130313d, + 0x0bf11134, + 0x33240740, + 0x03212b23, + 0x02237327, + 0x21200720, + 0x07a4d633, + 0x07522b54, + 0x94d4c11a, + 0x41ca120b, + 0x2b030b6d, + 0x270bce02, + 0x231e24d6, + 0x3ea7f3e8, + 0x11fdefff, + 0x33332734, + 0x4c53184c, + 0xed44c01d, + 0x62156005, + 0x64354027, + 0x72157b05, + 0x3e077435, + 0xe3333533, + 0x3d0b3e2b, + 0x07143099, + 0x200ca348, + 0x309d49ab, + 0x0144d614, + 0x07391138, + 0x66478340, + 0xa3c40745, + 0xa10710cc, + 0x4c071d1e, + 0xc4074103, + 0xcf6bb20b, + 0xd499a107, + 0x5ec4ee31, + 0x10cc27ff, + 0xf3e8051e, + 0x2ea7061e, + 0x11fdefff, + 0xdc332724, + 0xeffc6a4d, + 0x0d07f111, + 0x99fc217e, + 0xd39931d4, + 0x07432b30, + 0x9d2f6b24, + 0xa4d632d2, + 0x3e1e0027, + 0x21832123, + 0x12074207, + 0x15334333, + 0x1d0b142b, + 0x149d4027, + 0x141c9d15, + 0x1a35f401, + 0x18051545, + 0x14251915, + 0xc530d499, + 0x410390d5, + 0xc530d49d, + 0x0d0750d5, + 0xd87e3027, + 0x330011fc, + 0x8ef08303, + 0xc1f84ef5, + 0xc007440d, + 0xa2079107, + 0x8027d7e3, + 0x78be0c07, + 0x0c070166, + 0x9e7e1d07, + 0x8ac499fe, + 0x4576b007, + 0xe07e0c07, + 0x964127fa, + 0x22402704, + 0xd68b07b8, + 0xb4f6db4f, + 0x3350cdc1, + 0xbe0c07d3, + 0x0b01673e, + 0x071b07b0, + 0x6625be0d, + 0x2b490701, + 0x27a4124d, + 0x070907a0, + 0x9ef80e1a, + 0x4e01659d, + 0x75f493fa, + 0x4399045a, + 0x3c0ac14c, + 0x274d439d, + 0x9dc00730, + 0xd4074c43, + 0x9940d4c1, + 0x4a1b4cd3, + 0x20273432, + 0x2307400c, + 0x1a070d07, + 0x016779be, + 0x0344b007, + 0xc5634f9b, + 0x3a1e40d4, + 0xbe630f9b, + 0xc10180db, + 0x0d0744d1, + 0x99fb217e, + 0x41c4aad4, + 0x634f9b1b, + 0x2b40d3c1, + 0x014f5043, + 0x9b700000, + 0x4f03634f, + 0xf0000000, + 0x0740d4c5, + 0x7eb4240d, + 0x0fd6fa37, + 0x01fd93a4, + 0xd499045a, + 0x4cd49d4d, + 0x010cb4e0, + 0x991bb2c4, + 0xc4998bc3, + 0x203ca38a, + 0x34ab4783, + 0xc39d0c07, + 0x655bbe8b, + 0x8e022701, + 0xaac399fa, + 0x274dd49d, + 0x9d002740, + 0xb3474cd4, + 0x016835be, + 0xbe630f9b, + 0x07018063, + 0x6925be0b, + 0x4dd49901, + 0xea4cd49d, + 0x9b009e0b, + 0x482764df, + 0x9b18dc53, + 0xb9d065f4, + 0x643f9b2f, + 0x5365f49b, + 0x3833183c, + 0xbcd0d3ab, + 0x4f9b1e11, + 0x9b382764, + 0x2f9b65f3, + 0x65f39b64, + 0x33184c53, + 0x2ee3104c, + 0xabffffff, + 0x27d4ab42, + 0x8bc49d40, + 0x41234d07, + 0xffff4fd4, + 0x9b2b0fff, + 0x0407634f, + 0xbe40c4c5, + 0xc1017ffb, + 0xd33340c4, + 0xc0c1d40b, + 0x3ccdc5c0, + 0x0167b5be, + 0x278bc499, + 0x104ca300, + 0x8e8bc49d, + 0x634f9bfa, + 0x9340c4c5, + 0x04592ff4, + 0x9b4042c1, + 0x1f9b624f, + 0x8bc39963, + 0x2f03412b, + 0x7fffff00, + 0x3ca3242b, + 0x991e1e40, + 0x46d88ac4, + 0x632f9b22, + 0x998bc399, + 0x07e38ac4, + 0x83203ca3, + 0x40c2c547, + 0x200b34ab, + 0xc39d0227, + 0x3cc2c58b, + 0x0427fa8e, + 0xfc4efa8e, + 0x58e2f493, + 0x4c439904, + 0x439dd007, + 0x9d30274d, + 0x00274c43, + 0x01673dbe, + 0xbe630f9b, + 0x27017f6b, + 0xbe20000d, + 0x3601682b, + 0x8ad49906, + 0x277446dc, + 0x9dc42740, + 0x6f1e8bd4, + 0x07f64e7e, + 0xd303c0c0, + 0x991102c4, + 0x0d078ad4, + 0xd49d4783, + 0x6413be8b, + 0x76541e01, + 0x634f9b0e, + 0xc58ad399, + 0x315840d4, + 0x3390d4c1, + 0x93191e43, + 0x04587bf4, + 0x9b4044c1, + 0x2f9b623f, + 0x03322b63, + 0xffff004f, + 0xc5432b7f, + 0xd0c13cd4, + 0x104c27c0, + 0xbe8bd49d, + 0xc10166c6, + 0x4fa3bcd4, + 0x40000000, + 0x2761f49b, + 0xb4d4c540, + 0xc227051e, + 0xf4939e1e, + 0x9904583c, + 0x0c074d43, + 0x8e4c439d, + 0x93fa4efc, + 0x04582bf3, + 0x074c3499, + 0x4d349dd0, + 0x349d4027, + 0x8b04994c, + 0x402c4f4b, + 0x711eb427, + 0xb027a307, + 0xc18adc99, + 0x4f9b3ca3, + 0x0e34ce63, + 0x073cd1c1, + 0xbe20270d, + 0x07016526, + 0x630f9bb0, + 0x017e92be, + 0x0744d1c1, + 0xf8d87e0d, + 0xb4440d07, + 0xa6f80e7e, + 0x36ce1e0b, + 0x3ca4c1c6, + 0x2b633f9b, + 0x99412c43, + 0xc1a38adc, + 0x078bd499, + 0xa337833c, + 0x43ab204c, + 0x078bd49d, + 0x6333be0d, + 0x27c61801, + 0x8bd499b2, + 0xff804fa3, + 0xd49dffff, + 0x6db2c08b, + 0x4b8bd499, + 0x5a40cc4f, + 0x00be0127, + 0xd4990167, + 0x2744d630, + 0x9b4b1eb4, + 0xd399634f, + 0x40d4c58a, + 0xd4c13158, + 0x1e433390, + 0x75f49319, + 0x44c10457, + 0x623f9b40, + 0x2b632f9b, + 0x004f0332, + 0x2b7fffff, + 0x3cd4c543, + 0x9d104c27, + 0x06b68bd4, + 0xe97e0d07, + 0xc105c6f6, + 0x0d0744d1, + 0x377eb227, + 0x27031ef8, + 0x3df493b0, + 0x43990457, + 0x4c439d4d, + 0xfa8e0b07, + 0xbf9bfa4e, + 0x29fa9363, + 0xb7830457, + 0x9b3cacc1, + 0xdc27634f, + 0x2bc42b1f, + 0x624f9bdb, + 0x2b633f9b, + 0x18d4d243, + 0x74be0d07, + 0xd0d20166, + 0x3ca4c10f, + 0x2b633f9b, + 0x27403243, + 0x27031ea4, + 0xbe0027a0, + 0x9b01655e, + 0xf49364df, + 0xc10456e8, + 0x4fbec040, + 0xc12c0165, + 0xfa8e0127, + 0x2f032d07, + 0x80000000, + 0x0c20cccc, + 0x2b203c27, + 0x3b40a73c, + 0x03248b43, + 0x5b4207b1, + 0x2744c64b, + 0x27fa8e00, + 0x27a48601, + 0x4efa8e00, + 0x07b107fb, + 0xc0bf6bd0, + 0x245f200c, + 0xb7f45301, + 0x240d1efd, + 0x66f45302, + 0x53051efe, + 0x93fc16f4, + 0x04568bfc, + 0xc5b0c099, + 0xcd9d9cc4, + 0xf33b7eaa, + 0xc4c54027, + 0x27d2203c, + 0x041e314c, + 0x9d7f4ca7, + 0xb6468bc4, + 0x5666f493, + 0xac40c104, + 0xa30f0c83, + 0x041e100c, + 0xbe180c27, + 0x93016262, + 0x04564ff4, + 0x0ec040c1, + 0x64b49efb, + 0xa7fb8e01, + 0xfdefff2e, + 0xf3e8031e, + 0x275c24c1, + 0x6a4ddc33, + 0xfe0bf5fc, + 0x5702f293, + 0x99412704, + 0x24bd1923, + 0x3646011b, + 0x23892469, + 0x27342b20, + 0x9d240d40, + 0x232d1924, + 0x3127fe0b, + 0x56def493, + 0x9343bd04, + 0x4efe0b02, + 0x234107fd, + 0x16048d41, + 0x43834107, + 0x3427d107, + 0x2007d253, + 0x342be427, + 0x31274410, + 0x019c21ad, + 0x1d2be123, + 0xf3982223, + 0x4d034e47, + 0x2d070194, + 0x400b3e07, + 0x31032f0b, + 0x412d051e, + 0x4223120b, + 0x4027f3b8, + 0x019404ad, + 0x3ea7fd8e, + 0x27feffff, + 0x8f34bd43, + 0xd540271f, + 0xbd1f8834, + 0x271f8c34, + 0x8d34bd41, + 0xbd42271f, + 0x0b1f8e34, + 0xd1fd4efe, + 0x99012003, + 0x02d14b04, + 0x03c50124, + 0x6c02c540, + 0x43f54487, + 0xff001c00, + 0xd1770499, + 0x87012403, + 0x0043f544, + 0x27ff001c, + 0x2004d130, + 0xa9030d01, + 0x07012803, + 0x53032dd0, + 0x24f49b42, + 0x012404d1, + 0xf49b4253, + 0x99402725, + 0x04bd1803, + 0x34c401c8, + 0x89034927, + 0x43ca1004, + 0x0604b91f, + 0xd1414402, + 0x99021404, + 0xc4be4641, + 0xf49301cc, + 0x41045898, + 0x270d0744, + 0x8ef48b11, + 0x93fb4efd, + 0x045887f4, + 0xf0934431, + 0x8b0455e0, + 0x11fc93f4, + 0x0c070456, + 0x017ebfbe, + 0x0c07b007, + 0xbe2c0c03, + 0x93017eb4, + 0x0455c3f4, + 0xc14042c1, + 0x43296c41, + 0x2b2b4e09, + 0x3e2b102b, + 0x012843ad, + 0x012042d5, + 0x012441d5, + 0xfd4efb8e, + 0x559efd93, + 0x18d49904, + 0x3e1244c4, + 0x31f493a9, + 0x44210458, + 0xf48b0027, + 0x015dccbe, + 0x0c030d07, + 0x0923be38, + 0x030d0700, + 0x1abe640c, + 0xd4b90009, + 0x41040206, + 0x000b54be, + 0xbefe4e7e, + 0x0effe8c7, + 0xf3919efd, + 0xa7fd4eff, + 0xfdebaf2e, + 0x24054027, + 0x00003f27, + 0x23150a04, + 0x230ef49b, + 0x27240528, + 0x0400003f, + 0x9b231509, + 0x2ea70ef4, + 0x05fdebc7, + 0x003f2724, + 0x15070400, + 0x0ef49b23, + 0xfff6d0be, + 0x57bef493, + 0x93440104, + 0x045517f0, + 0xf48bd007, + 0xbefe857e, + 0x99ffe88d, + 0x442418d4, + 0x9a7e0d07, + 0x9b4127fe, + 0x0d07a2f4, + 0xbe380c03, + 0x070008ad, + 0x640c030d, + 0xa29efd0e, + 0xfc4e0008, + 0xffff4ea7, + 0xa74411fe, + 0xffffffde, + 0x0624d3d1, + 0x43f54487, + 0xff000d18, + 0x21273007, + 0xcfff4ea7, + 0x6842c5fd, + 0x2b634f9b, + 0x1b30c834, + 0x53defc93, + 0x4cc39904, + 0xc49d4027, + 0x4dc39d4c, + 0x016286be, + 0x9d4dc499, + 0xf4934cc4, + 0x990453c4, + 0x439d4c43, + 0x9d30274d, + 0xdcd14c43, + 0x0f9b0cb0, + 0x7a51be63, + 0x624f9b01, + 0x2b633f9b, + 0x0cc4d243, + 0x08be0c07, + 0xc0120163, + 0x93634f9b, + 0x045393f4, + 0x9d4d4399, + 0xfc8e4c43, + 0x0421fa4e, + 0x545af293, + 0x384c0304, + 0x314424c5, + 0xc5f06301, + 0x03597021, + 0x239dd007, + 0x2e04891a, + 0x892c248d, + 0x218d2c01, + 0x1c03992e, + 0x791d239d, + 0x1c249d04, + 0xb9480399, + 0xce020624, + 0x23bd4334, + 0x37560206, + 0x56baf293, + 0xb5f39304, + 0x462703fe, + 0x34033101, + 0x24032105, + 0x171ef4a8, + 0x56a2f293, + 0xb5f39304, + 0x462703fe, + 0x34033101, + 0x24032105, + 0xf493f4a8, + 0x0104568c, + 0xe5f09344, + 0xf48b0453, + 0xd299d161, + 0x83c1071f, + 0xc3330fcc, + 0xff84ce23, + 0x07d391ff, + 0x03a0274c, + 0xfdf09344, + 0xfa050453, + 0x000883be, + 0xd299d161, + 0x07d3a120, + 0x03b0074c, + 0x11f09345, + 0xfa050454, + 0x00086bbe, + 0x04d60b8b, + 0x2c1e0a27, + 0x539afc93, + 0x34d3c104, + 0xd51cc499, + 0xa5020cca, + 0x074506c3, + 0x6a26be0c, + 0xbd40a701, + 0x610284c4, + 0x254027dd, + 0x1cc4adcd, + 0x43002701, + 0x4efa8ef0, + 0x69f493fc, + 0x24070453, + 0x029f2d03, + 0x2ce33407, + 0x7f3ce37f, + 0x3c033419, + 0xf932c280, + 0x534ef393, + 0x27202704, + 0x3205a84c, + 0xf4c83403, + 0xffffeea7, + 0x93e411fe, + 0x045337fc, + 0x48034447, + 0x24074f6b, + 0x210330a7, + 0x3027c325, + 0x9d4bc49d, + 0xc29d18c3, + 0x9b402777, + 0xf49b24f4, + 0x04ee9925, + 0x1a270c07, + 0x27380c03, + 0x003d2720, + 0xbd4a2728, + 0xbe01f0ce, + 0x0700071e, + 0x2729270c, + 0x2724003d, + 0x640c034a, + 0x0bbe1927, + 0xf2930007, + 0x93045584, + 0x03fd7ff3, + 0x31014627, + 0x21053403, + 0xf4a82403, + 0x556ef493, + 0x93440104, + 0x0452c7f0, + 0xfc0ef48b, + 0x4efc355e, + 0x03c007fc, + 0x5cbe380c, + 0x0c07017c, + 0xbe640c03, + 0x93017c53, + 0x045547f4, + 0x00274421, + 0xe2bef48b, + 0xfc0e015a, + 0x4efb7e5e, + 0xf35dbefd, + 0x8df093ff, + 0xd0070452, + 0xd499ca3e, + 0x1344c418, + 0x0c030d07, + 0x7eedbe38, + 0x030d0701, + 0xe4be640c, + 0x3027017e, + 0xd39d40a7, + 0x18d39d19, + 0x0ea7d425, + 0xbeffffdf, + 0xc100e2fa, + 0xd1c14cd4, + 0x0b0d0740, + 0x0314eb14, + 0xd0be380c, + 0xd4c10006, + 0x6cd1c178, + 0x140b0d07, + 0xeb640c03, + 0x06bdbe14, + 0xdf0ea700, + 0xfd0effff, + 0x00e2a69e, + 0xa007f74e, + 0xac03c007, + 0x070a0738, + 0x649c039c, + 0xbe40cbc1, + 0x07017b00, + 0xc1090780, + 0xf5be6ccc, + 0x7007017a, + 0x05be0a07, + 0x0907017d, + 0xfdbeb82b, + 0xb253017c, + 0x2b24fb9b, + 0x9bc253c7, + 0xf78e25fc, + 0xf1e3f74e, + 0xf989f065, + 0x1af08918, + 0x79073123, + 0x51d6fd93, + 0x2b340b04, + 0x3cfbc171, + 0x6d10d38d, + 0x4dd72dd1, + 0x07a007d0, + 0x14d8d1c2, + 0x25b5b602, + 0x074027fb, + 0x04f49dbf, + 0x40a7b403, + 0x2912d48d, + 0x1cd3a9d4, + 0x14d48d01, + 0x070c3cce, + 0x7e1c070d, + 0xdcadfac3, + 0xfa2d011c, + 0xf493f90d, + 0x5104542c, + 0x27f2014c, + 0xc8d4bd40, + 0x07180701, + 0x8b0d073b, + 0xf6c007fc, + 0x99d43106, + 0x472b18d3, + 0x3420d435, + 0x3d7e0d07, + 0x9d4427ff, + 0x0c0718d4, + 0xf78ef1c3, + 0xf093fe4e, + 0x7e045154, + 0xf093fe93, + 0x7e04514c, + 0xf093fae1, + 0x0e045144, + 0xff165efe, + 0x0dd1fd4e, + 0x04d1012c, + 0xdc53020c, + 0x8312531c, + 0xb94526d3, + 0xce021004, + 0x0289364d, + 0x2c04892e, + 0x429b03a1, + 0xe30be487, + 0x02100dbd, + 0x1faef393, + 0x0c0ed504, + 0x15402702, + 0x043e2534, + 0x032247d2, + 0x424f2721, + 0x1e018000, + 0x03e40505, + 0x93f2c8e4, + 0x041f8bf0, + 0xd204012d, + 0x41871147, + 0x40270435, + 0xfd8e0455, + 0xc007fc4e, + 0x0d031127, + 0x26270174, + 0x4b003d27, + 0xe7be4827, + 0x0c070004, + 0x27900c03, + 0x27272712, + 0x274c003d, + 0x04d4be48, + 0x030c0700, + 0x1327cc0c, + 0x3d272827, + 0x48274d00, + 0x0004c1be, + 0xeba73ea7, + 0x054027fd, + 0x004f2734, + 0x15138200, + 0x9b402734, + 0xfc8e0ef4, + 0xf49b4027, + 0x84f49b82, + 0xa785f49b, + 0xfdefff3e, + 0x34d54327, + 0x34210208, + 0xa7fc48dc, + 0xfdefff2e, + 0x4ddc2421, + 0x27fa0800, + 0x0824d544, + 0x0c24d502, + 0xd5302702, + 0xa7061823, + 0xfdebf72e, + 0x4f272305, + 0x12c20000, + 0xf39b2415, + 0xb9fe0b0e, + 0x03013004, + 0x0301340d, + 0xf49b104c, + 0x94f49b94, + 0x2c273627, + 0x90f39b10, + 0xf49b0401, + 0x03040393, + 0xf280103c, + 0x2007fe0b, + 0x01342d03, + 0x53824f9b, + 0x41831c4c, + 0x013004bd, + 0x9b104c03, + 0xf49b94f4, + 0x3404d194, + 0x7004d101, + 0x003f2701, + 0x27200230, + 0x90f39b14, + 0x05884f9b, + 0x894f9b24, + 0x3d032415, + 0xf39b4200, + 0x884f9b90, + 0x4f9b2425, + 0x23243589, + 0x0341c03d, + 0xf1f0102c, + 0x4efe0bd9, + 0x03d007f7, + 0x2901740d, + 0x7b00bed7, + 0x804f9b01, + 0x012cd4d1, + 0x2780f49b, + 0x82f49b40, + 0x9b84f49b, + 0xd48985f4, + 0x16d38912, + 0x40cc4f8b, + 0x33430713, + 0xab31034a, + 0x81f39b34, + 0xf49b4027, + 0x33131e83, + 0x9b34ab3a, + 0x4a3381f3, + 0xa383f49b, + 0x0000004f, + 0x82f49b80, + 0x1327d449, + 0xd44d4123, + 0xe5be0d07, + 0x0d070180, + 0xddbe1027, + 0xd4490180, + 0x4103cd07, + 0x4d90cc03, + 0x27b027d4, + 0x2702018d, + 0x000000af, + 0x129c2780, + 0x8d30c4c1, + 0x4b2620c8, + 0x7bbe0c07, + 0x4027017a, + 0x8d22c48d, + 0xd44920c4, + 0x44470d07, + 0xc48d4b0b, + 0xbe1b0724, + 0xb6018156, + 0x84fa9bb6, + 0xc426c499, + 0xd4491542, + 0x9b1041d8, + 0x0b1e94f9, + 0x0385fa9b, + 0x0ab2c0b1, + 0xb127031e, + 0x1e3ccc03, + 0x2d4027b4, + 0x96d4a9d4, + 0x8d0d0701, + 0x14be1ed4, + 0x04d60161, + 0xf78e0727, + 0xb0274127, + 0x8c27c827, + 0x109c270c, + 0xbd1eac27, + 0x1e011ad4, + 0xceb10345, + 0xd4890db7, + 0x07b44214, + 0xfe797e0d, + 0xfc9bc807, + 0x1dd49994, + 0x48c44a00, + 0x10cc030d, + 0x2394fc9b, + 0xf99b10cc, + 0x23d40994, + 0x0d4fab41, + 0x0745d6d4, + 0x822ebe0d, + 0x27059601, + 0x9b0c1e07, + 0xfa9b94fa, + 0xbab7ce94, + 0x40270027, + 0x011ad4bd, + 0xf74ef78e, + 0x071d0e99, + 0xa70e07d0, + 0x9d015340, + 0xd49df3d4, + 0x800af9b7, + 0x6300019c, + 0x451499f0, + 0x051aac33, + 0x0701c3f2, + 0x839307b1, + 0x00afa301, + 0x29800000, + 0xc4f709f8, + 0x14994742, + 0x5324073f, + 0x83e4ab21, + 0x8023f9e1, + 0x3300019c, + 0x3c3319ec, + 0x00efa31c, + 0xab400000, + 0x833207e3, + 0xab030b31, + 0x994720ae, + 0x041e4614, + 0x9d471499, + 0x0556b7d4, + 0x9d46b299, + 0x091ef3d2, + 0xb4992124, + 0xf3d49d47, + 0xd3992027, + 0xc0d2c5b7, + 0xc5b8d2c5, + 0x3cc0bcd2, + 0x43071cff, + 0x33334533, + 0x44f1432b, + 0xff000194, + 0xd4c54301, + 0xc5430bc0, + 0xd09dc8d4, + 0xf3d399b6, + 0xc5f8d2c5, + 0xd2c5fcd2, + 0xff3cc0f4, + 0x3343071d, + 0x2b333345, + 0x9444f143, + 0x01ff0001, + 0xfcd4c543, + 0xd4d5430b, + 0xd09d0104, + 0x030d07f2, + 0xdcc1380c, + 0x767abe40, + 0x40bbc101, + 0xdbc5c02b, + 0x274d0730, + 0xa04cd535, + 0xb44cd501, + 0x98440301, + 0x2cdad5f3, + 0x07911901, + 0xfdad7e0d, + 0x40270546, + 0xd40dd84d, + 0xf043d72d, + 0x0027f78e, + 0xfd4efe0b, + 0x01d402b9, + 0x42073327, + 0x01b94333, + 0x43f501d5, + 0xff021200, + 0x100044f1, + 0xd007ff02, + 0x4c3c0247, + 0x1e2027e0, + 0x87253313, + 0x0423f141, + 0xf1ff0218, + 0x02160042, + 0x87230bff, + 0xf5422730, + 0x02120034, + 0xecd4d1ff, + 0xd5422b01, + 0xbe01fcd4, + 0xd502647c, + 0x8e0200d0, + 0x93fc4efd, + 0x044cfbf4, + 0x021444d1, + 0x4489e007, + 0x47c10710, + 0x0bd29bd4, + 0x070616d3, + 0x071a3314, + 0xbe20270d, + 0x1e00dd4b, + 0xc214010c, + 0x1d070bd4, + 0x00dc67be, + 0xcd05e007, + 0xfc8e0e07, + 0xc007fc4e, + 0x0d031427, + 0x2c2701d0, + 0x003d2716, + 0xbe4a2710, + 0x070000d2, + 0xd40d030c, + 0x27152701, + 0x3d27172c, + 0x4a271400, + 0x0000bdbe, + 0x0d030c07, + 0x1627027c, + 0x3d272127, + 0x4a271800, + 0x0000a9be, + 0xeb9f3ea7, + 0x052027fd, + 0x004f2732, + 0x1513c200, + 0x9b402734, + 0x38230ef4, + 0x4f273205, + 0x13820000, + 0x40273415, + 0x8e0ef49b, + 0x99fd4efc, + 0xd0071204, + 0xf8be4244, + 0x42270175, + 0x8e12d49d, + 0x120499fd, + 0xc29e4204, + 0xfe0b0176, + 0xd007fb4e, + 0xdcbeb107, + 0xd4510175, + 0x3407d221, + 0x34eb320b, + 0x422b4307, + 0xd325b422, + 0xd4992307, + 0x5b320710, + 0x83430734, + 0x51448741, + 0x0b3207dc, + 0x613b0b4d, + 0x25c28b44, + 0x07d315d3, + 0xbec40b0d, + 0x11017700, + 0x9b4253d4, + 0x0c0724f4, + 0xfc4efb8e, + 0x90bec007, + 0x0c070175, + 0xe59efc0e, + 0xfe4e0176, + 0x4623e407, + 0x4c83e30b, + 0x0e3c330f, + 0x011d023d, + 0x00003f83, + 0x13333ff0, + 0x4c332027, + 0xf543ab10, + 0x02140012, + 0x0414f5ff, + 0x2dff0214, + 0x9b40270e, + 0xfe8e0ef4, + 0xd007fd4e, + 0xd7be0107, + 0xd299ffe2, + 0xa1d42110, + 0x83425bd1, + 0x3b312741, + 0x0b448732, + 0x654d0b31, + 0x46d3a540, + 0x0e0d0715, + 0x75ff9efd, + 0x4efd8e01, + 0x07f063fb, + 0x1eb107d0, + 0x10d19927, + 0xc15bcb07, + 0xcc87c183, + 0xc461cd0b, + 0x85bef405, + 0xd299ffe5, + 0x27d3a110, + 0x2b423b41, + 0x65402734, + 0xa1d3a5c4, + 0x270f07d4, + 0xd2b4ce21, + 0xfb8ef043, + 0xd007fa4e, + 0x07120099, + 0x07b207a1, + 0xc6230714, + 0x8e012704, + 0x21d451fa, + 0x10d399dc, + 0xd285c40b, + 0xc4ebd195, + 0xa7333bce, + 0xffffdf0e, + 0x00dbadbe, + 0x0d071c07, + 0x0ea78e3e, + 0xbeffffdf, + 0x2700db7b, + 0x233b3b31, + 0xebc30b31, + 0x5b4c07c3, + 0x9d41234b, + 0xdb9d11d4, + 0xa5d35510, + 0x15d4a1dc, + 0xcedc25dc, + 0xf25115c4, + 0x1a070d07, + 0x017789be, + 0x04964127, + 0x04074027, + 0x0d07fa8e, + 0x017544be, + 0xfa8e0127, + 0x0207fe0b, + 0xfe0bfe0b, + 0x04030105, + 0x0027fe0b, + 0xf94efe0b, + 0x020c04d1, + 0xd0079107, + 0x02d19253, + 0x4db60214, + 0x892e0b89, + 0x04a12c0c, + 0xcc87cb9b, + 0xf393c40b, + 0x25041960, + 0xd541273c, + 0x15020c0c, + 0x12249934, + 0x43230c07, + 0x4c334383, + 0xa314070e, + 0x0000001f, + 0xbea407cf, + 0x1b000069, + 0x00afa3c0, + 0xadc70000, + 0x1e0212dc, + 0x030a0505, + 0x93fbc804, + 0x041923f3, + 0xd1a9392d, + 0x29870212, + 0x44234107, + 0x3435420b, + 0x34554027, + 0x8dff4c27, + 0x318d1a34, + 0x032ea718, + 0x4c27fee2, + 0x0331010e, + 0x03210534, + 0x8ef4a824, + 0xff4ea7f9, + 0x3227feff, + 0x1df043bd, + 0x4a0af293, + 0xd5402704, + 0xbd021824, + 0x0b026b24, + 0x054127fe, + 0x03041501, + 0x4efe0b08, + 0xa5fd93fd, + 0xd499044c, + 0xbe44d64c, + 0x990000f4, + 0x41c44cd4, + 0x270d070b, + 0x9efd0e11, + 0x99000a53, + 0x454665d4, + 0xfd0e0d07, + 0x0004599e, + 0x013cd4d1, + 0xd1daf49b, + 0x9b0140d4, + 0xd4a9dcf4, + 0xf49b012e, + 0x114f27df, + 0x9b100000, + 0xfd8ea0f4, + 0xf093fe4e, + 0x99044c58, + 0x41444c04, + 0xfe0e1127, + 0x0007399e, + 0x46650499, + 0x630f9b49, + 0x016f52be, + 0x9b624f9b, + 0x432b633f, + 0x270c41cc, + 0x5809be01, + 0x9b010c01, + 0xf093634f, + 0x0e044c24, + 0x03259efe, + 0xda4f9b00, + 0x013c04d5, + 0xd5dc4f9b, + 0x8e014004, + 0x93fc4efe, + 0x015bcff4, + 0x4c02fc93, + 0x27102704, + 0x05002722, + 0xe6d3bec4, + 0xbe0127ff, + 0x0701546e, + 0x8e04030c, + 0x4edb1efc, + 0x300a89f9, + 0xa33c0bc1, + 0x07c007f0, + 0xbe0b071a, + 0x070102f5, + 0x079fab90, + 0x6d0b071a, + 0x02e1bef9, + 0x89f04d01, + 0xf01132c4, + 0x3907e027, + 0x492b2a07, + 0xfe051027, + 0xfff70fbe, + 0xf98ef083, + 0x1027fd4e, + 0xf7ffdea7, + 0x80ec27f9, + 0x42734107, + 0x08273227, + 0x09401ccc, + 0x03730107, + 0x35274147, + 0x4c832307, + 0x0c2c330f, + 0x34333407, + 0x320b20ab, + 0x30003d03, + 0x32074830, + 0x07803c03, + 0x104c3343, + 0x1103430b, + 0x80004d18, + 0x00004e03, + 0x03d40510, + 0xb9fef0d4, + 0x08004e27, + 0x70f49b08, + 0xfe4efd8e, + 0x013204a9, + 0x03b801d1, + 0x018604ad, + 0x02980ed1, + 0x029c04d1, + 0x0ed51803, + 0x04d50134, + 0x4f9b0138, + 0x3c04d5da, + 0xdc4f9b01, + 0x04d53007, + 0x3d030140, + 0x41070144, + 0x01102c27, + 0x0544034e, + 0xa834033e, + 0x8003c1f2, + 0x029404d1, + 0x012c0ea9, + 0x019004d5, + 0x01840ead, + 0x018803d5, + 0x04b935e6, + 0x4c1302c0, + 0xd5342b40, + 0xd5018803, + 0x0e018c01, + 0xf2379efe, + 0x07fd4eff, + 0x114f27d0, + 0x9b100000, + 0x4c27a0f4, + 0xdef49bff, + 0x99750499, + 0x43837603, + 0x33333383, + 0x43ab4447, + 0xf49b41a3, + 0x4c0499e0, + 0x54be4ce6, + 0x4d270005, + 0xd4ad0600, + 0x4d27012e, + 0xf49b0600, + 0x01f493df, + 0xd19901a3, + 0x30d4056f, + 0x1e132713, + 0x00412709, + 0x47402712, + 0x70d29914, + 0x23272330, + 0x4127091e, + 0x40272200, + 0x0d072447, + 0x0006a1be, + 0x7e00985e, + 0x4d27febc, + 0xd4ad0280, + 0x4d27012e, + 0xf49b0280, + 0x99f493df, + 0x43290447, + 0x44094169, + 0xd399130b, + 0x27142b67, + 0xb4d4bd40, + 0x07133b03, + 0x631ebe0d, + 0x49d49901, + 0x43d444e6, + 0x99141e29, + 0x452667d4, + 0x9f8cf493, + 0x931d1e01, + 0x01605cf4, + 0xd499161e, + 0x93452667, + 0x019fd3f4, + 0xf4930a1e, + 0x1e015fe6, + 0xd5ff1e03, + 0x990210d4, + 0x488607d4, + 0xbd404c27, + 0xd102c0d4, + 0xc10210d4, + 0xd4d580d0, + 0xf4930304, + 0xd5015ea3, + 0x270210d4, + 0x90be401c, + 0xf493014f, + 0x0501695f, + 0x8e0027d4, + 0x93fd4efd, + 0x044637f4, + 0x994443c1, + 0xd0074e44, + 0x030b0407, + 0x0154debe, + 0x0190d4d1, + 0x0188d0d1, + 0x0294d4d5, + 0x41834b53, + 0x03bcd4bd, + 0x0184d4a9, + 0xad80d0c5, + 0x06012cd4, + 0x401c2706, + 0x014f46be, + 0xbd404c27, + 0x2702c0d4, + 0xb4d4bd40, + 0x86d4a903, + 0x8cd0d101, + 0x32d4ad01, + 0x34d4d101, + 0xd5082301, + 0xd10298d4, + 0xd50138d4, + 0xd503b8d0, + 0x03029cd4, + 0x3cd4d108, + 0xdaf49b01, + 0x0140d4d1, + 0xa7dcf49b, + 0xf9dbff2e, + 0x2c10202b, + 0x402c2741, + 0x1d031d07, + 0x8cbe0144, + 0x4c2700c9, + 0xdef49bff, + 0x1d9efd0e, + 0xfd4efff5, + 0x4596f293, + 0xc1d00704, + 0x4f9b3c23, + 0x1943ce63, + 0x994424c1, + 0x040b4e20, + 0x015436be, + 0xffef4fbe, + 0xfd0e0d07, + 0x0158a59e, + 0x27ff347e, + 0x4efd8e04, + 0x00cd27fc, + 0xa0fc9b03, + 0xadcf4f9b, + 0x9b014804, + 0x04d5d04f, + 0x4f9b014c, + 0x5004d5d1, + 0xd24f9b01, + 0x015404d5, + 0xd5d34f9b, + 0x9b015804, + 0x04d5c44f, + 0x4f9b0208, + 0x0c04d5c9, + 0x104c2702, + 0x27c3f49b, + 0x27f4e843, + 0xc3f49b41, + 0x020804d1, + 0x27c4f49b, + 0x9b01004d, + 0x0ea7a0f4, + 0xa7f9e1ff, + 0xf97fff1e, + 0x02002d27, + 0x014d0bbe, + 0x8ea0fc9b, + 0x07fe4efc, + 0x9832a930, + 0xb804d102, + 0x3200a903, + 0x3432ad01, + 0xa032d101, + 0xfc30ad02, + 0x9c30d101, + 0x3c32d502, + 0xa832d101, + 0x3830d502, + 0xa430d101, + 0x144c0302, + 0x014432d5, + 0x34d52307, + 0x30d50200, + 0x2d030140, + 0x1c27015c, + 0x03400128, + 0x03200544, + 0xd1f1a824, + 0x07029432, + 0x0432d503, + 0xff357e02, + 0x869efe0e, + 0xfc4effef, + 0x4727c007, + 0x27c3f49b, + 0x9b01004d, + 0x0ea7a0f4, + 0xa7f97fff, + 0xf9e1ff1e, + 0x02002d27, + 0x014c7fbe, + 0xf49b4027, + 0x004d270e, + 0xa0f49b03, + 0x00114f27, + 0xf49b2000, + 0x08c4d1a0, + 0xc4f49b02, + 0x0148c4a9, + 0xd1cff49b, + 0x9b014cc4, + 0xc4d1d0f4, + 0xf49b0150, + 0x54c4d1d1, + 0xd2f49b01, + 0x0158c4d1, + 0xd1d3f49b, + 0x9b020cc4, + 0xfc8ec9f4, + 0xd007fd4e, + 0xf493913e, + 0xc1044424, + 0x40994443, + 0xbe030b4e, + 0xd10152cf, + 0xd10204d4, + 0xd50200d0, + 0x530294d4, + 0xbd41834b, + 0x2703bcd4, + 0xb4d4bd40, + 0xfcd4a903, + 0x140c2301, + 0x0132d4ad, + 0x0134d4a9, + 0x03b8d0d5, + 0x0298d4ad, + 0x0138d4d1, + 0xd5140c03, + 0xd1029cd4, + 0xa7013cd4, + 0xf9cdff2e, + 0x02a0d4d5, + 0x0140d4d1, + 0xd4d5202b, + 0xd4d102a4, + 0xd4d50144, + 0x2c1002a8, + 0xa02c27a1, + 0x1d031d07, + 0x90be015c, + 0xfd0e00c7, + 0xfff3279e, + 0xf293fd4e, + 0x070443a0, + 0x3c23c1d0, + 0xce634f9b, + 0x24c11943, + 0x4e209944, + 0x40be040b, + 0x59be0152, + 0x0d07ffed, + 0xaf9efd0e, + 0x4d7e0156, + 0x8e0427ff, + 0x07fd4efd, + 0x2714ccd0, + 0x931812c0, + 0x044367f4, + 0x994443c1, + 0x030b4e40, + 0x015212be, + 0xffed2bbe, + 0x70be051e, + 0x0d07016a, + 0x7b9efd0e, + 0x01070156, + 0xf54efd8e, + 0xfac1f223, + 0x07820748, + 0x07710750, + 0x27b40793, + 0x202c27e0, + 0x4e0b4f07, + 0x431d30a7, + 0x4e0b4807, + 0xe103431d, + 0xb856f268, + 0x4f6b4a07, + 0x071e4c03, + 0x1e4c2324, + 0x271f4c13, + 0xe407101c, + 0x2f6b6f07, + 0x6103ef6b, + 0x061ec107, + 0x1e2dbac4, + 0x071123dc, + 0x19410b47, + 0x07020744, + 0x233f07de, + 0x0bd22302, + 0x1f4c5434, + 0x460b321d, + 0x20074e1d, + 0x2f6bed07, + 0xfcf0ef6b, + 0x07161ed9, + 0x07e1233e, + 0x194e0b47, + 0x204c5444, + 0x410b1f07, + 0xf3604e1d, + 0x9a0094e6, + 0x24379bc4, + 0x1ea027b6, + 0x27b70405, + 0x070507a1, + 0x104c2728, + 0x1f070319, + 0x0103130b, + 0x3cd41a0b, + 0x1119111f, + 0x211d3103, + 0x1f073a2b, + 0x3319310b, + 0x2203233d, + 0x1edef4f0, + 0x27302720, + 0x450720ec, + 0x4419430b, + 0x130b1807, + 0x4cd43103, + 0x2f070920, + 0x4419420b, + 0xfe28141d, + 0xf58ef203, + 0xd007f84e, + 0xa107d423, + 0xc2079007, + 0x0344d1c1, + 0x0702109d, + 0x99c6338a, + 0xd49943d3, + 0x03c90b20, + 0x07f06388, + 0x071803b2, + 0x052c0708, + 0xfee47efb, + 0x9944d1c1, + 0xd49943d3, + 0x28ac0320, + 0x18032c07, + 0x07202c03, + 0x7efb050a, + 0xd399feca, + 0x109d2343, + 0x073a2302, + 0x034f6b43, + 0x3042d43a, + 0x9944d1c1, + 0x290720d4, + 0x18030807, + 0x2d03c127, + 0xfc050250, + 0xc1fea17e, + 0xd49944d1, + 0x43d39920, + 0x0a072907, + 0x2d031803, + 0xfc050270, + 0x43fe897e, + 0x4ef88ef0, + 0x440dc1fd, + 0xefff2ea7, + 0xe8031efd, + 0x5c24c1f3, + 0x4c333327, + 0x1d4c5318, + 0x42c84413, + 0x271d07ef, + 0x2f2ea70b, + 0x3c27f9ef, + 0x49b2bed0, + 0x031d0701, + 0x0b27501c, + 0xf4ff2ea7, + 0x803c27f9, + 0x9d9efd0e, + 0xfd4e0149, + 0x07650499, + 0xbe4506d0, + 0x1efffc0f, + 0xda4f9b0f, + 0x03e404d5, + 0xd5dc4f9b, + 0x9b03e804, + 0x3ea7c24f, + 0xd5fbffff, + 0xd103ecd4, + 0xd1041434, + 0xd50228d2, + 0xd103f0d4, + 0xb90234d4, + 0xd5023dde, + 0xd503fcd4, + 0xd103f8d2, + 0xbd0290d4, + 0xd10450de, + 0x00041833, + 0x3c45d643, + 0xc000003f, + 0x94d0d11f, + 0xa70e1e02, + 0xfbffff4e, + 0x041844d1, + 0x0fab0407, + 0x41eaf493, + 0x29416904, + 0x0b420943, + 0x30d4d113, + 0x0e122b02, + 0xf4d0d514, + 0x30d1d503, + 0xff4ea702, + 0x43d1fbff, + 0xd2a90418, + 0xd4a90132, + 0x3a33012c, + 0xd2ad0d07, + 0xd4ad03e0, + 0x3c5303e2, + 0x000d031a, + 0x07152704, + 0x403c3023, + 0x2c232307, + 0x33420740, + 0x004ef143, + 0x03ff0608, + 0xf10e0531, + 0x06080444, + 0x870415ff, + 0x0044f142, + 0x25ff060a, + 0x0c0c0304, + 0x8ed1f1f0, + 0xd1fe4efd, + 0xc6022404, + 0xa24f9b47, + 0x422743a6, + 0xd1a2f49b, + 0x9b022404, + 0x4f9bb4f4, + 0x2743a6a2, + 0x2404d540, + 0x2004d102, + 0x3348c602, + 0x4c530e4c, + 0x9004d51e, + 0xff3ea702, + 0x34d1fbff, + 0x42d80420, + 0x2004d1fa, + 0x2434d502, + 0xd5402704, + 0xa7022004, + 0xfbffff3e, + 0x042034d1, + 0x27fa42d8, + 0xfec07e10, + 0x2a9efe0e, + 0xfb4effeb, + 0xc207e107, + 0xef6bd007, + 0x4f9bcf6b, + 0xfb40ccc1, + 0xffff4ea7, + 0x204bd1fb, + 0x83b15304, + 0xf6b1c4b1, + 0x9964d499, + 0x438368d3, + 0xd0993183, + 0x6ed29949, + 0x44873433, + 0xab75d199, + 0x83038343, + 0x2b333f2c, + 0x138340ab, + 0x1c3342ab, + 0x99e38311, + 0x41ab69d3, + 0xc383e633, + 0x21274eab, + 0x20273486, + 0xc8333207, + 0x35334cab, + 0xf49b43ab, + 0x65d499c2, + 0x45334183, + 0xf49b41a3, + 0x6dd499c0, + 0x9969d399, + 0x418349d1, + 0xd2993183, + 0x3339336c, + 0x8343ab48, + 0x151c3313, + 0x218342a3, + 0x2c3341ab, + 0xff0ea710, + 0x42abfbff, + 0x040404d5, + 0x04300bd5, + 0x40271027, + 0x0238d4bd, + 0x0234d1d5, + 0x405af493, + 0x29436904, + 0x0b440942, + 0xd5342b32, + 0xd50230d3, + 0xd503f4d1, + 0xd5041801, + 0xd50290d1, + 0xd50294d1, + 0xd1043401, + 0xd50124d4, + 0x99041404, + 0x414473d4, + 0x14270027, + 0x44d60b1e, + 0x031e0827, + 0x10270027, + 0x9971d499, + 0xd2b972d3, + 0x4c830128, + 0x3f3c833f, + 0x330c3c33, + 0x8343ab46, + 0xd3b90f2c, + 0x2c330129, + 0xab41a318, + 0x1c3c3342, + 0x40ab43ab, + 0xd4d541ab, + 0xcea7021c, + 0xd5fbffff, + 0x270410c4, + 0x0540004e, + 0x27a3f49b, + 0x48aabe0b, + 0x2f4ea701, + 0xdb99f9ef, + 0x6fde9970, + 0x0218d4d5, + 0x0c271027, + 0x33310710, + 0x10e1c235, + 0x10d814f9, + 0x2407ff06, + 0x23ab2153, + 0x07ff4c04, + 0x103ca323, + 0xf90eb1c2, + 0x0610f814, + 0xff4c20ff, + 0x34ab4153, + 0x041cc2d5, + 0x041cc3d5, + 0xf0f01103, + 0x4efb8ec9, + 0x650499fd, + 0x4506d007, + 0xfffa09be, + 0x00a93c1e, + 0xd4d103e2, + 0xd0ad03e4, + 0xf49b012c, + 0xe8d4d1da, + 0xdcf49b03, + 0x9975d499, + 0x438376d3, + 0x33333383, + 0x43ab4447, + 0xf49b41a3, + 0x2ed4a9e0, + 0xdff49b01, + 0x00114f27, + 0xf49b1000, + 0x65d499a0, + 0x45334183, + 0xf49b41a3, + 0x6dd499c0, + 0x9969d399, + 0x418349d1, + 0xd2993183, + 0x3339336c, + 0x8343ab48, + 0x151c3313, + 0x218342a3, + 0x2c3341ab, + 0xa742ab10, + 0xfbffff3e, + 0x040434d5, + 0x34d54127, + 0xd4d10430, + 0xf49b03ec, + 0xf0d4d1c2, + 0xe0d1a903, + 0x1434d503, + 0x1cd4d104, + 0x32d1ad02, + 0x1034d501, + 0xf8d0d104, + 0xf4d4d103, + 0x28d0d503, + 0x002e2702, + 0x34d50540, + 0xf29b0418, + 0xa74d07a3, + 0xf9f7ff2e, + 0x04004d03, + 0xf5ff1ea7, + 0x013527f9, + 0x11200540, + 0x21201540, + 0x05280340, + 0x0c4c0310, + 0xf3501403, + 0xd4bd4127, + 0xd1d10239, + 0xd2d103f4, + 0xd4b903fc, + 0x30270450, + 0x0290d3d5, + 0x0294d1d5, + 0x022cd3d5, + 0x0234d2d5, + 0x023dd4bd, + 0xf04efd8e, + 0xdf3bcf5b, + 0xfc4efe2b, + 0xecbe0f07, + 0xff1effd8, + 0xff1eff1e, + 0xb007fb4e, + 0xf0931127, + 0xbe010b70, + 0x1100ca3c, + 0x7df093b1, + 0x31be010b, + 0xb12100ca, + 0x0b84f093, + 0xca26be01, + 0x93b10100, + 0x010b8bf0, + 0x00ca1bbe, + 0xf093b231, + 0x27010b92, + 0xca0ebe10, + 0x03db0700, + 0x31c127d4, + 0x931c07d2, + 0x010b7df0, + 0xf9bec103, + 0xd40300c9, + 0xec0fccc4, + 0xfb0e0b07, + 0xfb4ea11e, + 0x07620499, + 0x0e1d8930, + 0x270a1b99, + 0xff4c00e0, + 0x1089e127, + 0x03cd8710, + 0x9b140101, + 0x5833c10c, + 0x0b361299, + 0xd6030b04, + 0x470c0b24, + 0x27e846dd, + 0x8004c11f, + 0xa3b41802, + 0x0708001d, + 0x0530072d, + 0x06340331, + 0x054027e5, + 0x88340334, + 0x27fb8ef2, + 0x8000421f, + 0x4edf1e01, + 0xc022c1fa, + 0xc253c107, + 0x41a7b027, + 0x0d6823c1, + 0x150c2d04, + 0xf6d0070b, + 0x59fa9339, + 0xa4110454, + 0xa3214cc6, + 0x00623499, + 0xcc47ff4c, + 0xc00a3499, + 0xa311314a, + 0xd3254c87, + 0xdbb5aa11, + 0xda85d435, + 0xdb55db95, + 0x3c27fa8e, + 0x32038dff, + 0x0b350b85, + 0x0b250b55, + 0x0bb50b95, + 0x271a038d, + 0x0ef49b40, + 0xcc47fa8e, + 0x1207cd1e, + 0x1c03a021, + 0xff387e64, + 0xaf1ea015, + 0x4007fe4e, + 0x3c272027, + 0x03420534, + 0x27f3c844, + 0x31a7d04c, + 0x40070405, + 0x4803034d, + 0x382720a7, + 0x44034205, + 0x4007f3c8, + 0xa7284c03, + 0x05382720, + 0xc8440342, + 0x621499f3, + 0x1bff4cc0, + 0x049d4127, + 0x62139906, + 0x9908039d, + 0x44dc0a14, + 0xe343070f, + 0x08049d41, + 0x4027fe8e, + 0x8e06049d, + 0x070001fe, + 0x0501ab32, + 0xdc340320, + 0x0000000f, + 0x40471208, + 0x441d4c53, + 0x05402746, + 0x07340334, + 0x27fe0b03, + 0x15340341, + 0x07e81e24, + 0x48230742, + 0x27412811, + 0x07cb1e10, + 0x004f2702, + 0x03f00000, + 0x0b240504, + 0x07f94efe, + 0x07b107c2, + 0xc8900723, + 0xc1c84f11, + 0x101cc04c, + 0xcca10739, + 0xdc073819, + 0x073ac9cc, + 0x071a0732, + 0x3e09072d, + 0x07b823bf, + 0x072d0730, + 0x3e09071b, + 0x07c823b3, + 0x071a0730, + 0x3e09072c, + 0x073007a7, + 0x0709071b, + 0x1ef90e2c, + 0x10ccc09b, + 0x07a8271a, + 0xc8c9c8dc, + 0xc41ed827, + 0x4f270207, + 0xf0004000, + 0x24050403, + 0x1d27f98e, + 0xf90e4000, + 0x4eff4c5e, + 0x07c207f9, + 0x072307b1, + 0x5a11c890, + 0xc057c1c8, + 0x0741201c, + 0x111ccca1, + 0xccdc073f, + 0x074211cc, + 0x071a0732, + 0x7e09072d, + 0xbc23ff65, + 0x07300710, + 0x071b072d, + 0xff577e09, + 0x0710cc23, + 0x071a0730, + 0x7e09072c, + 0x3007ff49, + 0x09071b07, + 0xf90e2c07, + 0xc0ff3c5e, + 0x271d20cc, + 0xdc0710ac, + 0xc011ccc8, + 0x1e10dc27, + 0x270207bb, + 0x0080004f, + 0x050403f0, + 0x27f98e24, + 0x0e80001d, + 0xfecf5ef9, + 0xc207f94e, + 0x2307b107, + 0x1cc09007, + 0xa1074640, + 0x44211ccc, + 0xccccdc07, + 0x32073521, + 0x2d071a07, + 0x607e0907, + 0x20bc23ff, + 0x2d073007, + 0x09071b07, + 0x23ff527e, + 0x300720cc, + 0x2c071a07, + 0x447e0907, + 0x073007ff, + 0x0709071b, + 0x5ef90e2c, + 0xdc27ff37, + 0xc0c81e20, + 0x270c40cc, + 0xdc0720ac, + 0xbb21ccc8, + 0x1d27ed1e, + 0xf90ec000, + 0x4efe645e, + 0x994127fe, + 0x049d0a02, + 0xc031070b, + 0x25343024, + 0x1e1523c0, + 0xc0252006, + 0xff1e1926, + 0x99090299, + 0xfe0e0801, + 0x99fef25e, + 0x01990902, + 0x5efe0e08, + 0x0299fe5b, + 0x08019909, + 0x595efe0e, + 0x090299ff, + 0x0e080199, + 0xfe5f5efe, + 0x3c270071, + 0x4e040110, + 0xb8080314, + 0x0b0027f3, + 0x994007fe, + 0x42712000, + 0x30070103, + 0x03330123, + 0x0b0f3c83, + 0x20439d02, + 0xfe4efe0b, + 0xed03e007, + 0x4027034c, + 0x034c04d5, + 0x18270e75, + 0x070f2c27, + 0x27310b3e, + 0x03340540, + 0x27f29818, + 0x20049d40, + 0xfe4efe8e, + 0x21c8e207, + 0xff3ea72a, + 0x34c1fdef, + 0x184c336c, + 0xcc1d4c53, + 0x4ea7f542, + 0x05fde65f, + 0x274e1541, + 0xa7423520, + 0xfde64f3e, + 0x3e153005, + 0xfe8e3235, + 0x03d1f94e, + 0xa2070228, + 0xf993a253, + 0xa7040d44, + 0x0d3b1141, + 0x151a2d14, + 0x07c00719, + 0x21b896d1, + 0xd12a8602, + 0x990224c4, + 0x3c006243, + 0x25aa47ff, + 0x87cc21d2, + 0x35dbb54a, + 0x55dc85d4, + 0x8edb95db, + 0x460421f9, + 0xb5402749, + 0x55d435d4, + 0x95d425d4, + 0x8ed485d4, + 0x2400d1f9, + 0x7e130702, + 0xc1d1fc0e, + 0xc0250224, + 0xd17e0907, + 0x1ec221fc, + 0x2401d1b7, + 0x25412702, + 0x7e090704, + 0xca1efcc0, + 0x0d39fb4e, + 0xffff3ea7, + 0xb9d123ff, + 0x83010834, + 0xc0070fdc, + 0x00bcd4ee, + 0x2027d333, + 0xffff0ea7, + 0x0cd2f5fe, + 0xa9ff0001, + 0x39014403, + 0xff4ea7c1, + 0x3103ffff, + 0x010841bd, + 0x014403ad, + 0x270ef29b, + 0xff4ea731, + 0xc229fdcf, + 0xa67043c5, + 0x27fb8e25, + 0x03e8070e, + 0x02b53ebe, + 0xf74b0ea7, + 0x4f83beff, + 0xec00c801, + 0x40072007, + 0x25334733, + 0x2e23240b, + 0x07fff73c, + 0x27102742, + 0x4105283c, + 0xf3c84403, + 0x4c073207, + 0x4c033403, + 0x121c2710, + 0x44034e01, + 0x34033e05, + 0xc431f1a8, + 0xccd12405, + 0x4ea70110, + 0xc5fd4fff, + 0x4311642c, + 0x276823c5, + 0xb804fd42, + 0xa7ff0008, + 0xffffff2e, + 0x24bd4127, + 0x23990638, + 0x9b40270f, + 0x41270ef4, + 0x34f53387, + 0xff02b040, + 0xb307fb8e, + 0x64060d27, + 0x02b4babe, + 0x0108b4b9, + 0xff364dee, + 0x0000ef1e, + 0x000466bc, + 0x0000000e, + 0x01c1f54e, + 0xc5fd2358, + 0xf0c5bcf1, + 0xff0299c8, + 0xf2c51301, + 0xfe049978, + 0xc5fc0289, + 0x01b17cf4, + 0xc5bcf4c1, + 0x0131c0f1, + 0x930e4489, + 0x0407ebf8, + 0xc580f2c5, + 0x02d1c4f1, + 0xf1c10100, + 0xc1842dbc, + 0xf2c5f804, + 0x10128974, + 0x4584f4c5, + 0x0b402783, + 0x0d833531, + 0xd5811582, + 0x25022881, + 0x2480d584, + 0x34149902, + 0x13073127, + 0xf2c1143b, + 0x2c81adbc, + 0x35219902, + 0x022c82a9, + 0x83ad313b, + 0xf3c1022e, + 0xbcf1c1bc, + 0x890e3489, + 0x429b3033, + 0x242b432b, + 0x023082ad, + 0x022e83a9, + 0x89101489, + 0x439b3212, + 0x342b422b, + 0x00004f27, + 0x83ad8f00, + 0x84d50232, + 0x03990238, + 0xff3ce062, + 0x4f2704dd, + 0xef000100, + 0x023884d5, + 0x93bcf3c1, + 0x04074ff0, + 0xd5343499, + 0x7e023484, + 0x8409fd66, + 0xf4c58229, + 0x90f1c190, + 0xd1878441, + 0x0b94f2c5, + 0xe68631d4, + 0x27017a1f, + 0xc5328740, + 0xf4c588f3, + 0x8cf4c5b4, + 0x50a77027, + 0x460b4787, + 0x21dc4201, + 0xf1f1536b, + 0x014f07fe, + 0x3c4c0313, + 0x24032101, + 0x44034105, + 0xf2c1f3a8, + 0x50f3c148, + 0x0b68f4c1, + 0x60f3c123, + 0x0b182c03, + 0xb4f3c143, + 0x0b40f1c1, + 0xddf09334, + 0xd20b0406, + 0x03b4f3c5, + 0xfcca7e51, + 0x00f80fe6, + 0xc13ef489, + 0x740b94f1, + 0xc1aa71ca, + 0xf3c18cf2, + 0xa125fd90, + 0x03000464, + 0x8cf2c521, + 0x010223ee, + 0x0b88f4c1, + 0x078a1e64, + 0x3c1c031f, + 0x069ef093, + 0xfd167e04, + 0x81b98429, + 0x82d10234, + 0xf19d0238, + 0x23f2050a, + 0x85f39341, + 0x47ee0406, + 0x33b900c8, + 0x8409022c, + 0x9d8cf1c1, + 0x412308f3, + 0x066ef393, + 0xaa14ee04, + 0x2e34b900, + 0x41f25302, + 0x072101fe, + 0x09f49d0f, + 0x89fc067e, + 0xefe63efe, + 0xf2c1ff56, + 0x23a00748, + 0x0466bcaf, + 0x07842900, + 0x532a0bc7, + 0x03fe1bf3, + 0x48f2c5c1, + 0xb0274123, + 0x062ef993, + 0x010f0704, + 0x464cce31, + 0xf399b586, + 0x2c94a908, + 0x1e34ce02, + 0x023894d1, + 0xffff4f83, + 0xf405f7ff, + 0x07fbba7e, + 0x3efe89a0, + 0x2348f2c1, + 0x0466bcaf, + 0x03b10300, + 0xfeebe2c1, + 0x0b8429fe, + 0xcdf3532a, + 0x48f2c5fd, + 0x0f074123, + 0xc4ce3101, + 0x3094b9bc, + 0x08f49d02, + 0xf093b31e, + 0x7e0405d4, + 0xf4c1fbd9, + 0xc1040540, + 0x430140f4, + 0xf55ed30b, + 0x3234b9fe, + 0xff575e02, + 0x023033b9, + 0x27ff395e, + 0xb4f1c510, + 0x55b4f2c1, + 0x18dc038d, + 0xf3c18265, + 0xc52d0bc4, + 0xdc23a4f2, + 0x03351618, + 0xf2c50c2c, + 0xc8f1c1a4, + 0xc1a4f2c1, + 0x42ea4414, + 0x4ea701cb, + 0x27fdeb97, + 0x27430530, + 0x0300002f, + 0x9b42150d, + 0xf3c10ef3, + 0x273fe6c4, + 0x27c02703, + 0xf3c118bc, + 0xb4f4c1c4, + 0xf3c1f335, + 0x65f48574, + 0x78f4c1f3, + 0xc17cf3c1, + 0xf49dc0f0, + 0x16f39d17, + 0xc180f4c1, + 0x1f0784f3, + 0x1c030c0b, + 0x182c270c, + 0xf48df345, + 0xbefd7514, + 0xc100b917, + 0x8c41c0f7, + 0x7b0b8431, + 0x07bcf1c1, + 0xc52c0707, + 0x8b09acf4, + 0x93fb5d7e, + 0x04050ff0, + 0x07fb2d7e, + 0x091d0b17, + 0xb8f1c584, + 0x02884fe6, + 0xd533db07, + 0xd42b4b87, + 0xdc0b2027, + 0xfcc5c70b, + 0xb0f2c5a8, + 0x93a0f2c5, + 0x04071ff6, + 0xf9a0f3c1, + 0x0464a133, + 0x9cf3c500, + 0x02473fe6, + 0xc19cf2c1, + 0x4d079cf3, + 0x339cf1c1, + 0x33353323, + 0x0b322b48, + 0x98fdc514, + 0x0b9cf1c5, + 0xa8f2c1d3, + 0x24035027, + 0xc1ccf2c5, + 0x4587acf3, + 0x4201430b, + 0xa183a207, + 0x01ccaff6, + 0xfc7af153, + 0x13014f07, + 0x013c4c03, + 0x05240321, + 0xa8440341, + 0x3cf289f3, + 0xc13ef389, + 0xf09340f1, + 0x8d040478, + 0xf38d24f2, + 0xfa667e26, + 0x0fe6b007, + 0xbb1101b8, + 0xafe6fba5, + 0x84290124, + 0x023881d1, + 0x0530fdc5, + 0x934123f1, + 0x04044ff3, + 0x019345ee, + 0x022c33b9, + 0xf2c18409, + 0x08f39da0, + 0xf3934123, + 0xee040438, + 0xb9017524, + 0x07022e34, + 0x9d16070f, + 0xd47e09f4, + 0x3ef489f9, + 0x07674fc6, + 0x23b507c0, + 0x0466bccf, + 0x27b10300, + 0x0df993a0, + 0x2e1e0404, + 0xa586b103, + 0xa908f399, + 0xce022c94, + 0x94d11834, + 0x4f830238, + 0xf7ffffff, + 0x9c7ef405, + 0x23c007f9, + 0x0466bccf, + 0x3ef48900, + 0x4ac2a103, + 0x0b070725, + 0x0716070d, + 0xb7bdbe2c, + 0x07842900, + 0x0741230f, + 0xcedc0b16, + 0x93b9bbb4, + 0xf39d0230, + 0x1eb21e08, + 0x30f4c1ff, + 0x4d1b3027, + 0xf4c1f4b5, + 0x34f3c5b0, + 0xb638f4c5, + 0xc11f075d, + 0x1c03ccf0, + 0x182c2724, + 0x00b782be, + 0x293ef489, + 0xea540b82, + 0x93fee252, + 0x040387f4, + 0x09a8f1c1, + 0x9cf4c143, + 0xf1c11405, + 0xc51103a0, + 0x31e2a0f1, + 0x428700fa, + 0xc1a8f3c1, + 0x3c03acf2, + 0xc5240b1c, + 0xf3c5acf2, + 0xfe7a5ea8, + 0x0798f0c1, + 0x03070b1f, + 0x2c27241c, + 0xb735be18, + 0x98f4c100, + 0xc5184c03, + 0xa91e98f4, + 0xc148fbc1, + 0x070744f1, + 0x2b070d0b, + 0x0730fdc5, + 0xf9747ecd, + 0x0b50fac1, + 0x4cf1c1cb, + 0x0c0b0707, + 0x637e2a07, + 0xb0f2c1f9, + 0x0760f9c1, + 0x30f4c1dc, + 0x0bb8f0c1, + 0xb0f3c1da, + 0x1b5cf1c1, + 0x07020b4d, + 0xc5f4b529, + 0x3f7e38f3, + 0xb0fcc1f9, + 0xc168fbc1, + 0xc90bb8f0, + 0x0b64f1c1, + 0x7e2b070c, + 0xf4c1f92a, + 0x1bcb0b38, + 0xb0fcc54c, + 0x5e34f4c5, + 0x1f07ff2b, + 0x02caf093, + 0x3c1c0304, + 0x5ef93f7e, + 0x34b9fe3d, + 0x8c5e0232, + 0x3033b9fe, + 0xfe6e5e02, + 0x02aef093, + 0xf8b37e04, + 0x1540f4c1, + 0xc104050d, + 0xb00740f1, + 0x07071c01, + 0x2c070d0b, + 0x00b67ebe, + 0x275edc0b, + 0xc54027fe, + 0xd25e98f4, + 0x9a4f27fd, + 0xd5cf0006, + 0x5e023884, + 0x3ea7fb24, + 0xc1fdefff, + 0x4dd86c34, + 0x070ffc6a, + 0xe8432723, + 0x6c23c1f4, + 0xfc6a3ddc, + 0xc8f1c1f5, + 0x81a4f2c1, + 0x4812c514, + 0xf0c144a3, + 0x7e1485c8, + 0xfd03f940, + 0xcc27f58e, + 0xc0f0c10c, + 0x01baf193, + 0xbe2c0701, + 0xc100b61f, + 0xbc27c8f4, + 0x484cc524, + 0x4efcc55e, + 0x590499fb, + 0x4487f0e3, + 0x692441f1, + 0x04c10004, + 0x5403894c, + 0xf105f415, + 0x3fe6d007, + 0x302700d9, + 0x691e33f9, + 0xd4990004, + 0x50d2895a, + 0x9308f39d, + 0x04068ff3, + 0x692044f9, + 0x33190004, + 0x9d09f49d, + 0x2fe60af3, + 0xd49900a2, + 0x9b4ff658, + 0xa70f0700, + 0xf9e8ff1e, + 0x07f77e7e, + 0x56d099b0, + 0x43334007, + 0xf16c4c03, + 0x02100043, + 0x183c33ff, + 0xc41d3c53, + 0xfc932934, + 0x07044d04, + 0x0e1d270c, + 0xaf72be0a, + 0x56d09902, + 0x43334007, + 0xf16c4c03, + 0x02100043, + 0x183c33ff, + 0xc01d3c53, + 0xbe03de34, + 0x07f9e900, + 0x2733e33b, + 0x2ea7361c, + 0xbef9e8ff, + 0x9902ae6d, + 0x4c0356d4, + 0xf143330d, + 0x02100043, + 0xe03cd8ff, + 0xb5fc9322, + 0x0c07044c, + 0x0a0e1d27, + 0x02af23be, + 0x0356d499, + 0x43330d4c, + 0x100043f1, + 0x3cdcff02, + 0xf0c3e5e0, + 0x1fa3fb8e, + 0x09000000, + 0xf1054027, + 0x5a5ef415, + 0x5b0399ff, + 0x4eff275e, + 0xc002c1fc, + 0x2ed1c107, + 0x23890114, + 0x834e0728, + 0x86112742, + 0x83102744, + 0x3380003d, + 0xa80dc117, + 0x24c13f26, + 0x5742d844, + 0x10003d27, + 0xa7a20499, + 0xf7ffff2e, + 0x4dab4183, + 0x43ab41ab, + 0x01c12425, + 0x9c0389ac, + 0xc5e421c5, + 0x3123802c, + 0x998423c5, + 0x0389a304, + 0x8824c59e, + 0x4123430b, + 0x998c24c5, + 0x0089a601, + 0xc5310ba4, + 0x3123a821, + 0xc5ac23c5, + 0x47275820, + 0x8e3424c5, + 0x00eddcfc, + 0x3027ab01, + 0xfe4eab1e, + 0x8fff3ea7, + 0xe33411fd, + 0x1508004d, + 0xff3ea734, + 0x3201fd4f, + 0xf49b4027, + 0x87e1270e, + 0x402ef522, + 0xa7ff02b0, + 0xfdcfff1e, + 0x30074227, + 0x234414c5, + 0x4232d038, + 0x3ea72127, + 0xbdfeffff, + 0x271ff932, + 0x0ef49b40, + 0xbe681ec5, + 0x2702ace7, + 0xff3ea720, + 0x32bdfeff, + 0x40271ff9, + 0xa70ef49b, + 0xfdcfff3e, + 0xc54434c5, + 0x2ea76434, + 0x11fd8fff, + 0x004da324, + 0x8e241508, + 0x1e2227fe, + 0xa7f84ebe, + 0xfeffff2e, + 0xd1092499, + 0x83014823, + 0x33d40743, + 0x2b4487d4, + 0x07bd07d4, + 0xb4be23c0, + 0x3fd6ffff, + 0xff4ea76a, + 0xd2f1ffff, + 0xff000054, + 0x062c4dd1, + 0x0104039d, + 0x07d22200, + 0x9120ead2, + 0x670dce00, + 0xac27ed07, + 0xff9ea74f, + 0xe02bffff, + 0x41834007, + 0x24073407, + 0x34332633, + 0x342b320b, + 0xc0053387, + 0xf9c43e23, + 0x072107ff, + 0x0338014a, + 0x03280534, + 0x99f4a824, + 0x4cc00a14, + 0x94d12810, + 0x401b0628, + 0x271f40c8, + 0x04c49d41, + 0x24d1f88e, + 0x41c00148, + 0x4824d144, + 0x6242c001, + 0x014824d1, + 0x8e1e43c0, + 0xf00103f8, + 0xcd05a7fe, + 0xf604b499, + 0x2700844f, + 0xff4ea731, + 0x43d5feff, + 0xf88e0148, + 0x1ffd24b9, + 0x45104cd8, + 0x24d54027, + 0xf88e0148, + 0xd0eed007, + 0xd31eff70, + 0x0054d4f1, + 0x0301ff00, + 0x008843e2, + 0xffffbea7, + 0x2cb4d1ff, + 0x2443c206, + 0x4ea73027, + 0xd5feffff, + 0x8e014843, + 0x9b4027f8, + 0xf49b0bf4, + 0x0e09270e, + 0xfe7c5ef8, + 0xf80e0827, + 0xa7fe755e, + 0xfff9cf0e, + 0x0394a0be, + 0x0054d3f1, + 0xc001ff00, + 0x062cb4d1, + 0xc2c604ca, + 0x0527c330, + 0x1efe557e, + 0xeaccbebc, + 0xff3ea700, + 0xb469ffff, + 0x010232a9, + 0x192024ce, + 0x033027b4, + 0x9bb41d41, + 0x4ea70ef3, + 0xa7fd4fff, + 0xfff9cf0e, + 0xbe3843c5, + 0x5e014514, + 0xbd25ff4f, + 0x23a9de1e, + 0x24a90144, + 0x43ee0142, + 0x4227ff2f, + 0x014824d5, + 0xf04ef88e, + 0xdf3bcf5b, + 0xfc4efe2b, + 0x25be0f07, + 0xfc0efff1, + 0xff0bf00e, + 0xcf5bf04e, + 0xfe2bdf3b, + 0x0f07fc4e, + 0xfff113be, + 0x1ea7ff1e, + 0xd1feffff, + 0xc4014814, + 0x14996142, + 0x83131109, + 0x33248743, + 0x87422b44, + 0x1833f133, + 0xf1ff000d, + 0x00005444, + 0x4334caff, + 0x149d4127, + 0x9b40270a, + 0x4ea70ef4, + 0x27fdcfff, + 0x4012b931, + 0x6043c501, + 0x66091499, + 0x07438329, + 0x87243324, + 0xf9242b44, + 0x00005024, + 0xa74736ff, + 0xffffff4e, + 0x0a0443d1, + 0x005424f1, + 0x0127ff00, + 0x00274342, + 0x0127fe0b, + 0x2027fe0b, + 0x40273927, + 0x0a0824fd, + 0x2103ff00, + 0xfe0bf398, + 0xfe0b0127, + 0x4ea7fe4e, + 0x99feffff, + 0x1ea70944, + 0x83ffffff, + 0x87410343, + 0x2012d134, + 0x2b443306, + 0x4843f143, + 0xc6ff0000, + 0x1e402724, + 0x2c14d10d, + 0x0a212706, + 0x07202743, + 0x6be40742, + 0x27f1abef, + 0xc0041e20, + 0x26a62222, + 0x1ff824f9, + 0x4846ff01, + 0x44f14287, + 0xff023000, + 0x071644d8, + 0x03352742, + 0x10322b41, + 0x03312746, + 0xd8f3f021, + 0x031e0127, + 0x0e8b0027, + 0xfe8ef1eb, + 0xffbefe4e, + 0x4ea700c3, + 0x11feffff, + 0x05f09344, + 0x448700fd, + 0x0d1841f1, + 0x3dbeff00, + 0xfe0e00ba, + 0x00332a9e, + 0x0419fd4e, + 0x1f6bd007, + 0x1c464806, + 0x1856f393, + 0x93330105, + 0x04574ff4, + 0x1ebe4305, + 0x4bbe0071, + 0xfd0e004b, + 0x0361749e, + 0x31271806, + 0x19e6f493, + 0x05439d05, + 0x6334f393, + 0x29f49303, + 0x43050457, + 0x006794be, + 0x00294ebe, + 0xd41d4127, + 0xfb4efd8e, + 0xd007b107, + 0x0227c207, + 0xcf6b1027, + 0x03638bbe, + 0x4007bcd6, + 0x4fe64c8b, + 0xfc9300ce, + 0x990519a8, + 0x458605c4, + 0x006a0dbe, + 0xc5be0c07, + 0xc4990360, + 0x204c2454, + 0x007186be, + 0x3bbe051e, + 0xf4930073, + 0x99051984, + 0x45460544, + 0x03611dbe, + 0x0069e5be, + 0xd41d4027, + 0xb2e4fb8e, + 0xf093008e, + 0x93051968, + 0x0362b9f3, + 0x56aef493, + 0x54029904, + 0x2c244305, + 0x70eebe20, + 0xbe051e00, + 0x930073bf, + 0x051947fc, + 0xc554cb99, + 0xbdbe50c0, + 0x1007002a, + 0xedbe0b07, + 0x0c07006f, + 0x59beb127, + 0xcb9d0360, + 0x60c8be05, + 0x9d402703, + 0xc49d0dcb, + 0x4f19be04, + 0x1d422700, + 0xff4ea7d4, + 0x4301fd4f, + 0xf49b4027, + 0xff4ea70e, + 0x4499ffff, + 0x3b21270e, + 0xa724cb23, + 0xfd4fbf3e, + 0x41272138, + 0x21533405, + 0x22d63403, + 0x4ea73127, + 0xc5fdcfff, + 0xfb8e6043, + 0xe04f2ea7, + 0x082499fe, + 0x930f40ce, + 0x0518cff4, + 0x994443c1, + 0x34ce0924, + 0xff4ea718, + 0x4411fd4f, + 0x0508209d, + 0xb5f49324, + 0x44990518, + 0x09249d44, + 0xfe4efe0b, + 0x08c60f6b, + 0x18a2f493, + 0x05449905, + 0x3bbe4786, + 0xcdbe0360, + 0x0abe0049, + 0xf3930066, + 0x010455dc, + 0xd5f49333, + 0x43050516, + 0xfd4efe8e, + 0xeaff2ea7, + 0x053027fd, + 0x004f2723, + 0x150c0400, + 0x9bd00724, + 0xe0070ef3, + 0x03241c03, + 0x2ea724ec, + 0x1efdefff, + 0xc1f3e803, + 0x3327fc24, + 0x53184c33, + 0x44c01d4c, + 0x1f4ea7f1, + 0x4e05fde4, + 0x06923d27, + 0x20274315, + 0x4ea74235, + 0x05fde40f, + 0xa7431541, + 0xfdefff0e, + 0x4235e30b, + 0xf3e8031e, + 0x010404d1, + 0x4c333327, + 0x1d4c5318, + 0xa7f044c0, + 0xfde3ff4e, + 0x2d274e05, + 0x42150692, + 0x43353027, + 0x4ea7120b, + 0x05fde3ef, + 0x35421541, + 0x49f49343, + 0xdf440516, + 0xff000000, + 0x0ea74101, + 0x1effe3ff, + 0xa740010e, + 0xffe3ff1e, + 0xf3e8051e, + 0x2ea7061e, + 0xd1fdefff, + 0x27010424, + 0x184c3333, + 0xc01d4c53, + 0x4ea7e944, + 0x05fde3ff, + 0x002d2740, + 0x27421504, + 0xa7433530, + 0xfde3ef4e, + 0x42154105, + 0xfd8e4335, + 0x15f2f493, + 0xa7400105, + 0xffffff1e, + 0xa7ff155e, + 0xfdefff2e, + 0xf3e8031e, + 0x27fc24c1, + 0x6a4ddc33, + 0x051ef5fc, + 0x061ef3e8, + 0xefff2ea7, + 0x0424d1fd, + 0xdc332701, + 0xedfc6a4d, + 0xfc4efe0b, + 0xffffdea7, + 0x270227ff, + 0x20dcd110, + 0x612abe06, + 0x10d4b903, + 0x8631270a, + 0x533027c4, + 0xc3308b41, + 0xc6438b41, + 0x8e012744, + 0xff4ea7fc, + 0x4301fd4f, + 0x40270027, + 0x270ef49b, + 0x0ed49921, + 0x24cb233b, + 0x4fbf3ea7, + 0x272138fd, + 0x53340541, + 0xd6340321, + 0xa7312722, + 0xfdcfff4e, + 0x8e6043c5, + 0x27fe4efc, + 0xbe122702, + 0xa70360d4, + 0xffffff2e, + 0x0a1024b9, + 0x408b4153, + 0x01274138, + 0x4ea7fe8e, + 0x01fd4fff, + 0x27002743, + 0x0ef49b40, + 0x270e2499, + 0xcb233b21, + 0xbf3ea724, + 0x2138fd4f, + 0x34054127, + 0x34032153, + 0x312722d6, + 0xcfff4ea7, + 0x6043c5fd, + 0xfb4efe8e, + 0xffffdea7, + 0x10d499ff, + 0xfbab4f36, + 0xfc9bc027, + 0x0efc9b0d, + 0x7fff3ea7, + 0x273411fd, + 0x004ea301, + 0x34150400, + 0x00b2c7be, + 0x4fff4ea7, + 0x274201fd, + 0xd6f49331, + 0x431d0453, + 0x9d0fd29d, + 0x94be10d3, + 0xd4990004, + 0x0efc9b0f, + 0x44873127, + 0xb04043f5, + 0xfbebff02, + 0x14baf093, + 0x0e112705, + 0xfc429efb, + 0x4efb8eff, + 0x21c207fb, + 0x012211c3, + 0x07b107c4, + 0x37f09310, + 0x5dbe00f9, + 0xbf6b00b6, + 0xc231d027, + 0xf0931d07, + 0x0300f954, + 0xb64abed1, + 0xc4c40300, + 0x46ec0fdc, + 0xa7c027bc, + 0xfdbfffde, + 0x49e6d441, + 0x42f14c87, + 0x00016530, + 0xf0931c07, + 0xbe00f93e, + 0x4100b624, + 0x4bf093d1, + 0x19be00f9, + 0xd15100b6, + 0xf950f093, + 0xb60ebe00, + 0x45402700, + 0x03c103d4, + 0xc8c420dc, + 0x32f493c8, + 0x44190453, + 0xfb0e4506, + 0x00023a9e, + 0x959efb0e, + 0xfd4efffb, + 0x05260f6b, + 0xf930fd93, + 0x93061e00, + 0x00f934fd, + 0x0d072107, + 0x607e1127, + 0x271d07ff, + 0xb9089e01, + 0x27100700, + 0x4ed81e01, + 0xffeea7f9, + 0x1ea7ffff, + 0x99feffff, + 0x14992ae3, + 0x6ba00708, + 0x27342eaf, + 0xa7f98e01, + 0xffffd72e, + 0x44d62479, + 0xf98e0227, + 0x24792379, + 0x4f4b9307, + 0x400c3027, + 0x24193127, + 0x4383c307, + 0x40f14487, + 0xff00002c, + 0x0744e499, + 0x09149d20, + 0x6b091199, + 0x071383cf, + 0x334187d1, + 0x83d42bd4, + 0xde230f2c, + 0xa6ffffb4, + 0x24e399c8, + 0x4f4b4307, + 0xe29d402c, + 0x4e0e1e24, + 0x93032723, + 0x00f8b3f1, + 0x00b8819e, + 0x44c6d479, + 0xf98e0427, + 0x4ea7a666, + 0x27d07fff, + 0x31433531, + 0x27412044, + 0x07f98e08, + 0x10ec53e0, + 0x4107c966, + 0x43834123, + 0x44333487, + 0x44e9432b, + 0xff000052, + 0xd27d3027, + 0xd46dd35d, + 0xd23dd31d, + 0x2780ec38, + 0x04d49d41, + 0x9905de9d, + 0x202705d4, + 0x40084f4b, + 0xd4592127, + 0x4103e1c3, + 0xd45d3e07, + 0x4ea73183, + 0x07feffff, + 0x4143bdb2, + 0xc6bf6b01, + 0xff2ea7ba, + 0x23c1ffff, + 0x07c86640, + 0xc5485340, + 0x4f6b3c23, + 0x3ca744f6, + 0x0b031e20, + 0xff4ea734, + 0x43c5ffff, + 0x9d402740, + 0xd32504d4, + 0xffff4ea7, + 0x3c43d5fe, + 0xa7a93601, + 0xfeffff4e, + 0x1ffd44b9, + 0x271248dc, + 0xff4ea731, + 0x4335d07f, + 0x4327071e, + 0x061ef4e8, + 0x7fff3ea7, + 0xc43431d0, + 0x1ea7f141, + 0xb9feffff, + 0x76014114, + 0xa7312745, + 0xd07fff4e, + 0x29074345, + 0xc40f2c83, + 0x3ea71b21, + 0x99ffffff, + 0x41034434, + 0x2744349d, + 0x4014bd41, + 0xff4ea701, + 0x4255d07f, + 0x00e317be, + 0x1ea7d419, + 0x03ffffd7, + 0x79d41d41, + 0x0f4c8314, + 0x24074123, + 0x28362fab, + 0x41031419, + 0x1319141d, + 0x34ce1439, + 0x83141913, + 0xf1448743, + 0x00002c42, + 0x0f2c83ff, + 0xa7802ca3, + 0xffffd73e, + 0x3459327d, + 0x345d4103, + 0x402705e6, + 0xa70ef49b, + 0xfd4fff3e, + 0xe63834c5, + 0x100c27b4, + 0x0c27f98e, + 0x0bf98e20, + 0x19f293fe, + 0x23010512, + 0x937f0c03, + 0x05120bf4, + 0x0b7f0ce3, + 0x05440103, + 0x0b030720, + 0x4efe0b04, + 0xb5f093fe, + 0xb1be00f7, + 0x44be00b3, + 0x51be00bf, + 0xc0befff9, + 0x66be0009, + 0xfe0e000f, + 0x005b149e, + 0x3ea7fd4e, + 0xc1fd4fff, + 0x4d07683d, + 0xf00f4de3, + 0x01004fc0, + 0x93225663, + 0x00f7a1f0, + 0x00b37bbe, + 0xf7c3f093, + 0x021f2700, + 0xbe566371, + 0x0700b36c, + 0xd8f0931d, + 0x321e00f7, + 0xc17c32c1, + 0x4fd87434, + 0x20000000, + 0x3121d834, + 0xf770f093, + 0xb34abe00, + 0x0ff09300, + 0xf19300f8, + 0xbe00f837, + 0x9300b33c, + 0x00f832f0, + 0xf85af193, + 0xb32ebe00, + 0x93042700, + 0x00f7c0f1, + 0x00b6619e, + 0x7fff2ea7, + 0xa121a1d0, + 0x0c4c5324, + 0xc00f4c83, + 0xa1270f4c, + 0x5322a124, + 0x0f2c8328, + 0x831f23d0, + 0x930fff1d, + 0x00f829f0, + 0x42273227, + 0x00b2f3be, + 0xf1930427, + 0x1e00f853, + 0xa124a1c4, + 0x4efd8e24, + 0xff3ea7fe, + 0x4027ffff, + 0xbd0d3299, + 0x10063a34, + 0x87202724, + 0x5041f142, + 0x27000168, + 0xb6009e01, + 0x07fb4e00, + 0xf6bf6bb0, + 0x7e00a0bf, + 0xa4beff1c, + 0x3ea70023, + 0x27fff9cd, + 0x3d341d40, + 0xdf3ea734, + 0x051effff, + 0xf4e84627, + 0xd3563d01, + 0x4fff4ea7, + 0x274401fd, + 0x0400000e, + 0x4aa34433, + 0x77be3405, + 0xfc93002d, + 0x050510bc, + 0xdf0ea7c0, + 0xfcbeffff, + 0xc40100b6, + 0x012745b6, + 0xf80ef193, + 0xb5a09e00, + 0x4b0ea700, + 0x1227fff7, + 0x00ba8ebe, + 0x3ea74027, + 0x1dffffd7, + 0x7d343d34, + 0xffcea734, + 0xc49dffff, + 0x2ac49d25, + 0xc53ccdc5, + 0x5dbe40cd, + 0x4fbe002d, + 0x75befff7, + 0xbcbe0024, + 0xc0be0009, + 0x2dbe0049, + 0xcd9d004a, + 0x11cdbd44, + 0xbe0b070a, + 0x27000ff7, + 0xff4ea730, + 0x439dffff, + 0x9efb8e25, + 0x9e00482b, + 0x4e00480c, + 0xff4ea7fd, + 0x4499feff, + 0x83202709, + 0x33d40743, + 0x2b4487d4, + 0xb4de23d4, + 0x0ea7ffff, + 0x27ffffd7, + 0x4b047914, + 0x1940484f, + 0xce438304, + 0x21031824, + 0x34f13287, + 0xff000028, + 0x4ea32123, + 0xf5800000, + 0x00002834, + 0xf02103ff, + 0xb7bed8f1, + 0x412700e0, + 0x1904d49d, + 0x033027d4, + 0x9bd41d41, + 0x4ea70ef3, + 0xc5fd4fff, + 0xf39b3843, + 0xff4ea70e, + 0x4399ffff, + 0xbf2ea70e, + 0x3138fd4f, + 0x24054127, + 0x24033153, + 0xfd8e32d6, + 0xa0befe4e, + 0x37be0047, + 0xfe0e000f, + 0x00159c9e, + 0x0027fe4e, + 0x005325be, + 0xf09efe0e, + 0x8f9e000e, + 0xfd4e0048, + 0xd0070409, + 0x04274576, + 0xf717f193, + 0x500a1e00, + 0x93042749, + 0x00f73af1, + 0x00b4799e, + 0x4f580411, + 0xfffffffe, + 0xf1930427, + 0x1e00f74f, + 0x500429ec, + 0x2701004d, + 0x64f19304, + 0xdd1e00f7, + 0x00e01dbe, + 0xffd70ea7, + 0x190439ff, + 0xcc432b03, + 0x01393a43, + 0x0339d411, + 0xd229de09, + 0x83104c33, + 0x31030fec, + 0x2833e4ab, + 0x1383033d, + 0x1187e2ab, + 0x1ef50479, + 0xff00002c, + 0x46762127, + 0x070fec83, + 0x804fa34e, + 0x7dffffff, + 0x27031e04, + 0x9b402720, + 0x3ea70ef4, + 0xc5fd4fff, + 0x25963834, + 0xf1930127, + 0x5e00f728, + 0x3301ff78, + 0xf49b4027, + 0xff4ea70e, + 0x4499ffff, + 0x3b21270e, + 0xa724cb23, + 0xfd4fbf3e, + 0x41272138, + 0x21533405, + 0x340324c6, + 0xfd8ef31e, + 0xf293fe4e, + 0x270511ec, + 0xa7e02730, + 0xfffe730e, + 0x01221c27, + 0x004e8304, + 0x44d60300, + 0x191e3103, + 0x00004ec4, + 0x24191303, + 0x24214616, + 0xff004e83, + 0x004e04ff, + 0xe103ffff, + 0x03180c03, + 0x32d4102c, + 0x3634860c, + 0xccf1f0e5, + 0xfe8e0027, + 0xfe8e0127, + 0x0499fb4e, + 0x53d12710, + 0x3803c141, + 0xc207b107, + 0xd3abd43b, + 0xcf6bbf6b, + 0x2c271027, + 0x3b412711, + 0x034d8b41, + 0x994d8611, + 0xe4076804, + 0xef03e433, + 0x00058130, + 0x15ff4cc0, + 0x0188e3b9, + 0x0189e4b9, + 0x4c2b3b2b, + 0x0189e4bd, + 0x0188e3bd, + 0x07690499, + 0x03e433e4, + 0x058130ef, + 0xff4cc000, + 0x88e3b915, + 0x89e4b901, + 0x2b3b2b01, + 0x89e4bd4c, + 0x88e3bd01, + 0xf0020301, + 0xfb8ea8f2, + 0x1499fe4e, + 0xd8e10708, + 0x03993d41, + 0xff3cc070, + 0x0b34330f, + 0x8934b930, + 0xbd412301, + 0x99018934, + 0x120707e2, + 0x029d1433, + 0xb9100b70, + 0x07018914, + 0x03353332, + 0xbd233341, + 0x2b018914, + 0x9433f132, + 0xc5ff0001, + 0x03997403, + 0x09e39d70, + 0x067402c1, + 0x0b343326, + 0x8934b930, + 0xbd410301, + 0x07018934, + 0x4efe8e02, + 0x07d107fb, + 0xdf0ea7b0, + 0xffbeffff, + 0xd3c100b3, + 0x83012734, + 0x33330f3c, + 0x007c34f9, + 0x1d07ff00, + 0x34fd44a3, + 0xff00007c, + 0xc110d499, + 0x415338d3, + 0x1c03043b, + 0x2703ab68, + 0x11ec27c0, + 0x4c3b4127, + 0xc103408b, + 0x14194c46, + 0x24332407, + 0x4cc02b0b, + 0x23b915ff, + 0x24b90189, + 0x31030188, + 0x24bd4103, + 0x23bd0188, + 0x14390189, + 0x24332407, + 0x4cc02b0b, + 0x23b915ff, + 0x24b90189, + 0x31030188, + 0x24bd4103, + 0x23bd0188, + 0x12030189, + 0x99b2fef0, + 0x4cc007d4, + 0x340731ff, + 0x43333533, + 0x34f1342b, + 0xff00018c, + 0x00004ee3, + 0x004ea303, + 0x34f50200, + 0xff00018c, + 0x9944d4c1, + 0x34f534dd, + 0xff000194, + 0x018c3dfd, + 0x0ea7ff00, + 0x0effffdf, + 0xb31d9efb, + 0x07f94e00, + 0x0f4c8340, + 0x24873407, + 0x322b3533, + 0xd333d307, + 0xdf03d32b, + 0x00058560, + 0xdc99a407, + 0x07a33307, + 0xa7ba0790, + 0xffffdf0e, + 0xff84be23, + 0xb30cbeff, + 0xffccc000, + 0x074c071c, + 0x3343333c, + 0xf1342b35, + 0x00018c34, + 0x004ea3ff, + 0x34f50300, + 0xff00018c, + 0x007ca4f9, + 0x44d8ff00, + 0x270d070a, + 0x7e212711, + 0xccc0fdf4, + 0x4c073eff, + 0x43333c07, + 0x342b3533, + 0x019434f1, + 0x49a6ff00, + 0xd3c14c07, + 0x03443350, + 0x0581304f, + 0x8c43d500, + 0x58d39901, + 0x018a43bd, + 0xbd5ad399, + 0xf9019043, + 0x000080aa, + 0x8b4abdff, + 0x99281e01, + 0x488604b4, + 0x9950d0c1, + 0x21275ad1, + 0x002895be, + 0x9950d0c1, + 0xd19904b2, + 0x23040358, + 0x2884be21, + 0x9d402700, + 0xb29904b4, + 0x54d0c105, + 0xbe59d199, + 0x27002872, + 0x05b29d20, + 0xc009d399, + 0x3313ff3c, + 0x303f0334, + 0xb9000581, + 0x23018934, + 0x8934bd41, + 0x1db45901, + 0x5d4123b2, + 0xffcea7b4, + 0xc4b9ffff, + 0x91030100, + 0xc4bd4123, + 0xd4c10100, + 0xfcc9c5ac, + 0xf1934319, + 0xd1050d54, + 0x27042812, + 0xcb433b41, + 0xd5302742, + 0xc5042814, + 0x0ea7acd3, + 0xbeffffdf, + 0x9900b1e3, + 0x0ea70ec1, + 0x0efff9cd, + 0xb5119ef9, + 0x07fd4e00, + 0x0fdc83d0, + 0x0ea7d333, + 0xbeffffdf, + 0xf900b1e6, + 0x00007cd4, + 0x104c3cff, + 0xfd104ca3, + 0x00007cd4, + 0xdf0ea7ff, + 0xa8beffff, + 0x4ea700b1, + 0x99ffffff, + 0x0ea70e41, + 0x0efff9cd, + 0xb4d19efd, + 0x23f74e00, + 0x273f07f3, + 0x0c4c2720, + 0x34033205, + 0xfd93f4c8, + 0xa7050e5c, + 0xffffdf0e, + 0x97be7d07, + 0xbea700b1, + 0x27fffe6f, + 0x23802790, + 0xab07407c, + 0xa401a423, + 0x00004ed8, + 0xd4192303, + 0xd3994806, + 0xff3cc009, + 0x0b4f0709, + 0x1d412734, + 0x0ad39934, + 0x09ff3cc0, + 0x310b1f07, + 0x341d4127, + 0x4e83a401, + 0xe4030000, + 0x0300004e, + 0xdc390089, + 0xb411c976, + 0xd47948e6, + 0xd01147e6, + 0x2708d199, + 0x2744be21, + 0x79d01100, + 0x03d159d2, + 0xbe212304, + 0x27002736, + 0x15d47d40, + 0x199127bc, + 0xa7c9d6dc, + 0x0bd39940, + 0x9d0ad49d, + 0x35a609d4, + 0xc7beb021, + 0x40270027, + 0x990bd49d, + 0x45a60cd4, + 0xb7beb001, + 0x40270027, + 0x050cd49d, + 0x09bc25bc, + 0x012916d2, + 0xe33707a4, + 0x0300004e, + 0xb28da405, + 0x9340270e, + 0x050d93f2, + 0x2b0cb48d, + 0x2e341927, + 0x1d40a784, + 0x98310334, + 0x038103f2, + 0xbc0310dc, + 0x228ce418, + 0xd027ff32, + 0x4d0b4f07, + 0x46964419, + 0x66be0d07, + 0x09ab0009, + 0x04864027, + 0x94074127, + 0xd1039f6b, + 0xe130dcc4, + 0xffdf0ea7, + 0xb06dbeff, + 0xa7966600, + 0xffffff4e, + 0xa70e4199, + 0xfff9cd0e, + 0x00b396be, + 0xf78ef303, + 0x0499f84e, + 0xe6c00705, + 0x9900bf4f, + 0x38070708, + 0x3f033433, + 0x00058130, + 0x019134b9, + 0xa9ff4ce4, + 0x923ab900, + 0xfface401, + 0x967e00a0, + 0x22cb89fe, + 0x9924cd89, + 0xbc0306c4, + 0x0fdc030f, + 0xd473b473, + 0xd10344c6, + 0x0b07d153, + 0x99be1d07, + 0x90070007, + 0x2dff0cc0, + 0xa606c499, + 0x04c4994b, + 0xbe0b41d8, + 0x07000677, + 0x1ed027ca, + 0x2944dc36, + 0x1d070b07, + 0x000773be, + 0x0cc4c007, + 0x09070bff, + 0x0008b4be, + 0x471e4027, + 0x50be0907, + 0xd0070006, + 0x48be0c07, + 0x0b1e0006, + 0x000642be, + 0xca07d007, + 0x48070027, + 0x44333807, + 0x81304f03, + 0x35330005, + 0x49bd8333, + 0x382b0191, + 0x01983df5, + 0x4cbdff00, + 0x41270192, + 0x019030f5, + 0x031eff00, + 0x04074127, + 0xfa4ef88e, + 0xffff4ea7, + 0xfc4cc1ff, + 0x01004bb9, + 0x241ebc0b, + 0x007cd4f9, + 0x4c83ff00, + 0x0e42c422, + 0xd4fd4127, + 0xff00007e, + 0x427e0c07, + 0xfd4027fc, + 0x00007cd4, + 0x07c103ff, + 0x0fdc83dc, + 0xcbcad333, + 0x21f493d4, + 0x2407050c, + 0x021f2d03, + 0x2ce33407, + 0x7f3ce37f, + 0x3c033419, + 0xf932c280, + 0x0a7efd93, + 0x70d39905, + 0x19ff3cc0, + 0x3f033433, + 0x000582b8, + 0x41233439, + 0x40a7343d, + 0x2770d49d, + 0x74d4c540, + 0xa7fd747e, + 0xffffdf0e, + 0x00af21be, + 0xa744dcc1, + 0xffffff4e, + 0x43d53027, + 0x43bd0cb0, + 0x2d270100, + 0x4cc50330, + 0x244cd5fc, + 0x730ea706, + 0x1027fffe, + 0x00a195be, + 0x3d033d07, + 0x20270188, + 0x05884c27, + 0xc8340332, + 0xa6f493f4, + 0xfb93050b, + 0x27050a10, + 0xa0a7223c, + 0x4a3d4a1d, + 0x4c03db07, + 0xc1f39010, + 0x46a63cb4, + 0x933bb199, + 0x050a2ff0, + 0xc7be2127, + 0x40270024, + 0xbe3cb4c5, + 0x07000787, + 0x1a2ebe0c, + 0xa7402700, + 0xffffdf0e, + 0x9d44bcc5, + 0xb4c570ba, + 0x9efa0e74, + 0x4e00ae73, + 0x93f523fa, + 0x00f0eff0, + 0x00a9dbbe, + 0xf0fff093, + 0xa9d2be00, + 0x72cea700, + 0xfd93fffe, + 0x27050b31, + 0x23bc07a0, + 0xd8be01b1, + 0x030000ee, + 0x19d0594b, + 0x19d123d3, + 0x99d103d4, + 0xd19908d2, + 0x15f20509, + 0x39b201f1, + 0x122c53d1, + 0xf2252183, + 0xec53c219, + 0xc1f23510, + 0xf05507c2, + 0xf065013b, + 0xc2c1f245, + 0x751a070b, + 0xc12e07f2, + 0x238303ce, + 0xf0e8f093, + 0xbefe8500, + 0x0300a970, + 0x10dc03a1, + 0xc418cc03, + 0x939f22ac, + 0x00f109f0, + 0x00a95bbe, + 0xffffcea7, + 0x00c1b9ff, + 0xfcc2c101, + 0xf108f093, + 0xa946be00, + 0x15f09300, + 0x3dbe00f1, + 0xcbc100a9, + 0x00cab9fc, + 0x5eab0b01, + 0x24f90097, + 0xff00007e, + 0x3407b103, + 0x24f94596, + 0xff00007c, + 0x00814fe6, + 0x007f2ef9, + 0x2cf9ff00, + 0xff000083, + 0xf907d499, + 0x00007c22, + 0x15fe05ff, + 0x05de99fc, + 0xdec1fe25, + 0x99fe3538, + 0xfe4568de, + 0x5569de99, + 0x6ade99fe, + 0xde99fe65, + 0x99fe756b, + 0xfe856cde, + 0x956dde99, + 0x6ede99fe, + 0xde99fea5, + 0x99feb56f, + 0xfec570de, + 0x71de9930, + 0x9934fec5, + 0xfec572de, + 0x73de9938, + 0x993cfec5, + 0xfec574de, + 0x75de9940, + 0x9944fec5, + 0xfec576de, + 0x77de9948, + 0xbe4cfec5, + 0x0700a89c, + 0x0f4c834b, + 0x24873407, + 0x322b3533, + 0xd333d307, + 0x2407d32b, + 0x8560df03, + 0x23330005, + 0xf0931b07, + 0xea00f08a, + 0x03ff45ba, + 0x93fa8ef5, + 0x05084bf4, + 0x439d30a7, + 0xc5302770, + 0x4d037443, + 0x24070188, + 0x021f2d03, + 0x2ce33407, + 0x7f3ce37f, + 0x3c033419, + 0xf932c280, + 0x09b3f493, + 0x222c2705, + 0x431d30a7, + 0x4c03433d, + 0xa7f2a010, + 0xffffff4e, + 0x010143bd, + 0xfc4efe0b, + 0xfcabd007, + 0x0ea7c566, + 0xbeffffdf, + 0xa700acc6, + 0xffffff3e, + 0x22fc34c1, + 0x3fdc274d, + 0x33b9181e, + 0x4d1b0100, + 0xd027433a, + 0xdc830c1e, + 0xf9d3330f, + 0x00007cdd, + 0xa7c566ff, + 0xffffdf0e, + 0x00ac72be, + 0x0d07fceb, + 0xf54efc8e, + 0x4f6bf063, + 0x0ea77007, + 0x07ffffdf, + 0x07b30791, + 0xc1f40562, + 0xfac130f5, + 0xac70be34, + 0x83260700, + 0x23330f2c, + 0x4027c207, + 0xce23bf6b, + 0x27ffff84, + 0x7e23fd33, + 0xfdff0000, + 0x00007f2b, + 0x8224fdff, + 0x03ff0000, + 0x99c43dc6, + 0x94993798, + 0x231b070c, + 0x998183c6, + 0x44d6077d, + 0x00ca8fe6, + 0x007f21fd, + 0xdce4ff00, + 0xbe00bfff, + 0xc6fff6ec, + 0xa7302708, + 0xfffe730e, + 0x01221c27, + 0x180c0302, + 0x00002e83, + 0x03250603, + 0x1ef17831, + 0x6bd30709, + 0xffdcc4df, + 0xdf0ea70f, + 0xd0beffff, + 0x072700ab, + 0x0701265e, + 0x333d074d, + 0x2b353343, + 0x8c34f134, + 0xf5ff0001, + 0x00019432, + 0x004ee3ff, + 0x4ea30300, + 0xf5010000, + 0x00018c34, + 0x047299ff, + 0x10274d07, + 0x32fd4433, + 0xff00018d, + 0x81304f03, + 0x20a70005, + 0x019831f5, + 0x42bdff00, + 0x42bd0192, + 0x34f10191, + 0xff00018c, + 0x019031f5, + 0x4ee3ff00, + 0xf5040000, + 0x00018c34, + 0x309489ff, + 0x019c34ed, + 0x34e9ff00, + 0xff00019c, + 0x03329289, + 0x44530f4c, + 0x019e32ed, + 0x34edff00, + 0xff0001a0, + 0x4d1df4b1, + 0x7d9d4a07, + 0x1d4b0b07, + 0xdcc4194d, + 0x00271142, + 0xf9be1607, + 0x08460016, + 0x42a3c419, + 0x5401c41d, + 0xf4934696, + 0x99050670, + 0x16072640, + 0xb6be2027, + 0x50050147, + 0x45f65401, + 0xffdf0ea7, + 0xab01beff, + 0x1e082700, + 0x9d412757, + 0x402704c4, + 0x9905c49d, + 0x44c60c94, + 0x4496f401, + 0x3d078646, + 0x33334d07, + 0x432b4533, + 0x019445f5, + 0xc459ff00, + 0xc45d4123, + 0xb6369499, + 0x04749946, + 0xc30944dc, + 0x1dab0bb1, + 0x990e1ead, + 0x45561674, + 0xab0bb1c3, + 0xa41d40a7, + 0xffdf0ea7, + 0xaaa9beff, + 0x43002700, + 0x4ef58ef0, + 0xa7a007fa, + 0xffffdf0e, + 0x00aab9be, + 0x001dd1be, + 0xffff4ea7, + 0x094499fe, + 0x34874383, + 0x432b4433, + 0x004d44f9, + 0x4403ff00, + 0xa4ca400b, + 0xdf0ea70e, + 0x6cbeffff, + 0x0b2700aa, + 0x2a07fa8e, + 0x070f2c83, + 0xf9433342, + 0x00007c43, + 0x23c407ff, + 0xffff84ce, + 0x00ac3ff6, + 0x45334207, + 0x432b3287, + 0xe333e407, + 0xef03e42b, + 0x00058560, + 0xc5ace4c1, + 0x46e634ea, + 0xf2934119, + 0xd1050580, + 0x27042823, + 0xcb413b41, + 0x2824d543, + 0x6df49304, + 0x43d10505, + 0x4bd1042c, + 0x00270428, + 0x051e3bab, + 0x01033153, + 0xd183d307, + 0x4007d316, + 0x44333007, + 0x342b3633, + 0xf4932127, + 0x010515d8, + 0x3b302b41, + 0xff4ea720, + 0x4011fd4f, + 0xf4933333, + 0xab050530, + 0x2842d52b, + 0xc5130b04, + 0xe1c5e410, + 0xa74127ac, + 0x27c41d30, + 0x9dc37d40, + 0xc43d05cd, + 0x9d04cd9d, + 0x3ea707e3, + 0xb9ffffff, + 0xb6010034, + 0xfc3ac544, + 0x34bd4103, + 0x0ea70100, + 0xbeffffdf, + 0x2700a99b, + 0x93fa8e00, + 0x05034ff2, + 0x19303c27, + 0x24280324, + 0x0b012741, + 0x27f398fe, + 0x6bfe0b00, + 0xf103330f, + 0x057f9c00, + 0x93fe0b00, + 0x05032bf3, + 0x019034a9, + 0x34a9404e, + 0x00270192, + 0x0127140e, + 0xfe0b0f6b, + 0xfe93fe4e, + 0xd1050310, + 0xce0184e4, + 0xe4d11040, + 0x41ce0180, + 0x07020709, + 0x1ecd3e13, + 0x6b012703, + 0x4efe8e0f, + 0xedfd93fd, + 0xd0d10502, + 0x0986018c, + 0x00a788be, + 0x2c274027, + 0x8cd4d560, + 0x273d0701, + 0x05420710, + 0x03212331, + 0x93f4b834, + 0x0502c7f3, + 0x32ad4027, + 0x34ad0192, + 0xfd8e0190, + 0xf393fb4e, + 0xd10502b4, + 0x07018434, + 0x07b107c0, + 0x0d40ced2, + 0x018034d1, + 0x34d1412e, + 0x240e0188, + 0xf493a63e, + 0xd5050294, + 0xd501884d, + 0xd501844c, + 0x8e01804b, + 0x93fc4efb, + 0x05027ffc, + 0x018cced1, + 0xc1d1f063, + 0xc2d10180, + 0xc3a90184, + 0xc4a90190, + 0xf0930192, + 0x0500ec9b, + 0xa416befe, + 0xdbf09300, + 0x0dbe00ec, + 0xd02700a4, + 0xc311c219, + 0xf0931d07, + 0x0300ecea, + 0xa3fabed1, + 0xc4c80300, + 0x93ea30dc, + 0x00ececf0, + 0xfc0ef043, + 0x00a3e79e, + 0xfd93fb4e, + 0xa9050228, + 0x070190d4, + 0x2ec107b0, + 0x92d4a940, + 0x7e144e01, + 0xdcadff23, + 0xdbad0192, + 0xf3930190, + 0xd1050208, + 0xf6018c34, + 0xd100ef4f, + 0xa901883d, + 0xd1019234, + 0xa9018032, + 0xd8019030, + 0xe40711d3, + 0xe8030703, + 0xe7e307e3, + 0x10001d27, + 0xe407081e, + 0x1c27e103, + 0x83420780, + 0x202cd842, + 0x2745060f, + 0x1e02903d, + 0xe03d2713, + 0x060d1e01, + 0x003d2745, + 0x27051e02, + 0xd801803d, + 0x43070dd1, + 0xe67f4c83, + 0x803c0344, + 0x2e07342b, + 0x2433209b, + 0x42071123, + 0x1103418b, + 0x210b44c6, + 0x4307242b, + 0x3407409b, + 0x3c831e07, + 0xd611237f, + 0x1e040734, + 0x804c030b, + 0x032b0407, + 0x07804c23, + 0x9b312b3e, + 0x83430734, + 0x44e67f4c, + 0x2b803c03, + 0x9bd00734, + 0x93d20bd1, + 0x050157fc, + 0xc4d1d30b, + 0x0d070184, + 0x9b200c03, + 0x27100704, + 0xa779be21, + 0x271c0700, + 0xd5bc07e0, + 0x1e018cc0, + 0x07e10318, + 0x0324e630, + 0x322b203c, + 0x03074227, + 0x1315141d, + 0x18030d0b, + 0x0184b4d1, + 0x2c832007, + 0xdee4ca1f, + 0x010ef493, + 0x8443d105, + 0x03002701, + 0xf9181e31, + 0x057f9824, + 0x0d42c400, + 0x0f6b4127, + 0x7f9824fd, + 0xfb8e0005, + 0x20070103, + 0xf3102333, + 0x8eff0c27, + 0x330f6bfb, + 0x980f0303, + 0x1900057f, + 0x27412004, + 0x27fe0b00, + 0x27041d42, + 0x4efe0b01, + 0x07d027fd, + 0x3ed1030d, + 0x30dcc4dd, + 0x93fd8ef7, + 0x05024bf2, + 0xa74420c1, + 0xffffff3e, + 0x062830d5, + 0x062834d1, + 0x34d51027, + 0x40a7062c, + 0x010934bd, + 0x34ad4027, + 0x219d010a, + 0x0430d506, + 0x08219d0a, + 0xf393fe0b, + 0x99050218, + 0x10270432, + 0x402722e3, + 0x03fc34d5, + 0x9d06319d, + 0x319d0432, + 0x4efe0b08, + 0xd60f6bfe, + 0x3ea76f0f, + 0xd5ffffff, + 0xd5062830, + 0xa7062c30, + 0xfff9cf4e, + 0x403d401d, + 0x31ad1027, + 0x4c270102, + 0x0834bd0f, + 0xbd40a701, + 0x93010934, + 0x0501cbf2, + 0x010a31ad, + 0x249d4027, + 0x06209d08, + 0xd520ec27, + 0xd50a0430, + 0xbd062030, + 0x270d1030, + 0xf33ea720, + 0x4e07fffe, + 0xe1233205, + 0xf4b83403, + 0x3ea740a7, + 0x05fffe7b, + 0x91f49334, + 0x4ed50501, + 0xfe8e03fc, + 0xffff3ea7, + 0x253499ff, + 0x40274224, + 0x010a34ad, + 0xf54efe8e, + 0xffff3ea7, + 0x273499ff, + 0x01274fe6, + 0x0166f493, + 0x08449905, + 0x011b4ff6, + 0x062830d1, + 0x062c39d1, + 0x01023ea9, + 0x34a9902b, + 0x19070104, + 0x1103e42b, + 0x4389141e, + 0xb04489b2, + 0x4e2b430b, + 0x41cc4f8b, + 0x2301031f, + 0x83400791, + 0x07340741, + 0x33343324, + 0x2b320b26, + 0x23438734, + 0xfff9c44e, + 0xa7d4f1f0, + 0xffffff4e, + 0x70278407, + 0x0106f693, + 0xff5ea705, + 0x40d5fd4f, + 0xad5e0628, + 0x2c8ad100, + 0x076b1906, + 0x0f4c834a, + 0xe183ea07, + 0x15331407, + 0xce072e07, + 0x142b4487, + 0x2433c633, + 0xd1072c0b, + 0xd3332e2b, + 0xc287d12b, + 0xf9c4ce23, + 0x60df03ff, + 0x07000585, + 0x072c073a, + 0x27b5461d, + 0x30c4ad40, + 0xbd641d01, + 0xbe0d118a, + 0x930032d1, + 0x0500abf2, + 0x11482389, + 0xb2c38d54, + 0x0d0884d5, + 0x0d1080bd, + 0x864f04cc, + 0x1403c407, + 0x062c84d1, + 0xf9cf0ea7, + 0xd54103ff, + 0xbe062c84, + 0x27012a18, + 0x07331e71, + 0xd541034a, + 0x27062c84, + 0x0ef49b40, + 0x892ed489, + 0x0ea74823, + 0x0bfff9cf, + 0x48248d43, + 0x0129f3be, + 0x641d4127, + 0x71279103, + 0x004ef093, + 0x4e92f005, + 0x8e0707ff, + 0x8e0027f5, + 0x93fb4ef5, + 0x05003bfd, + 0x1078d4d1, + 0xb107c007, + 0x0c2745b6, + 0x1b40be80, + 0x78d0d500, + 0x78d0d110, + 0x073c0710, + 0x801c274b, + 0xe952f293, + 0x99d9be00, + 0x78d0d100, + 0x9efb0e10, + 0x9e001ed1, + 0x4e001ecd, + 0xfdfd93fd, + 0xd3c104ff, + 0x78d4c144, + 0xd499432e, + 0xbe46267c, + 0x27001e6a, + 0x7cd49d40, + 0xc544d4c1, + 0xfd8e78d4, + 0x0035c69e, + 0xd007fd4e, + 0x2c271007, + 0x75f09350, + 0xe3be0503, + 0x08060096, + 0xf3930d07, + 0x27050368, + 0x0201144c, + 0x32050403, + 0xf4a83403, + 0xf4933127, + 0x9d04ffac, + 0xfd8e0a43, + 0x699e04c6, + 0x010700a3, + 0x1e272027, + 0x9e02a000, + 0x4e00a433, + 0xf788befe, + 0x2704d6ff, + 0x53fe8e01, + 0x8e018305, + 0x93fe4efe, + 0x0500c3f4, + 0x2c032407, + 0xe334073f, + 0x3ce37f2c, + 0x0334197f, + 0x32c2803c, + 0x101c27f9, + 0x00a6f393, + 0x0720a705, + 0x23320541, + 0xb8340311, + 0x4df493f4, + 0x202704ff, + 0x439d30a7, + 0x8441c566, + 0x429d423d, + 0x0c419d0b, + 0x421d425d, + 0x04304d03, + 0x1e7f4ce3, + 0x0cf49b07, + 0xd0804c03, + 0x0591a04f, + 0x4027f400, + 0x930ef49b, + 0x050347f0, + 0x0c401d27, + 0x00309bbe, + 0x0012f493, + 0x03240705, + 0x34073f2c, + 0xe37f2ce3, + 0x34197f3c, + 0xc2803c03, + 0xf393f932, + 0x2704fffc, + 0x0d402728, + 0xb8380334, + 0xc43c23f2, + 0x2c032307, + 0x7f2ce37f, + 0x197f3ce3, + 0x803c0334, + 0x93f932c2, + 0x04ff53f3, + 0x4c272027, + 0x03320520, + 0xa7f4c834, + 0xfffb430e, + 0x0cbe1827, + 0x0ea700a7, + 0x27fffaf3, + 0xa701be14, + 0xa30ea700, + 0x1027fffa, + 0x0e802c27, + 0x96049efe, + 0xc1f54e00, + 0xf1a33414, + 0xdfff3ea7, + 0x27f445fd, + 0x2000004e, + 0x020834d5, + 0x34d54027, + 0x4ea70208, + 0x11fd4fff, + 0xac14c143, + 0x43c5f055, + 0x69f493ac, + 0x449904fe, + 0xe0b10754, + 0x012b204c, + 0x50073027, + 0x195ef335, + 0x34bdc101, + 0x8926b889, + 0x52a928b4, + 0x849b010c, + 0x071cdc33, + 0x0859d132, + 0x038d0b01, + 0x03051e31, + 0xf0212398, + 0x0c1e03f3, + 0x4dcb9401, + 0x00004fd4, + 0x07ed1000, + 0x03a90762, + 0x07a82361, + 0xf0a8037d, + 0x402709f6, + 0xf425c807, + 0xac01271e, + 0x4707a311, + 0x4ccbf325, + 0x00004f30, + 0xc8071000, + 0xf321131e, + 0x8334b4c1, + 0xffffff3f, + 0x1c4c330f, + 0xf32534ab, + 0x4d2b4c07, + 0xcc5e4fc6, + 0x3f074340, + 0x1d070b07, + 0x34032f07, + 0x034f04be, + 0xc11a8dc2, + 0x00874cb4, + 0x0401040b, + 0xf4014616, + 0x432bf311, + 0xf4053487, + 0x030531a3, + 0x0b073f07, + 0x2f071c07, + 0xdabe3403, + 0xf411034e, + 0xd42bdc07, + 0xd7077d02, + 0x3c072d07, + 0x2f83f131, + 0x0fffffff, + 0x3f830b07, + 0x0fffffff, + 0x0045d1be, + 0xfd218c4e, + 0x625e7c07, + 0x2b3a07ff, + 0xa6337339, + 0x0c54a939, + 0x2b260701, + 0xad210343, + 0x1e010c54, + 0x01a4111a, + 0x059415a3, + 0xd4a80393, + 0x510a104c, + 0x0b4333f3, + 0x8c49c543, + 0xf2209803, + 0x5803f331, + 0xf3353103, + 0x310db499, + 0xe234f2f3, + 0xa7fd41fe, + 0xffffdf0e, + 0x330fdc83, + 0xa1f4bed3, + 0x7cd3f900, + 0x99ff0000, + 0x2307b9b4, + 0x412428a3, + 0x2ca32307, + 0x7ed4f948, + 0xfdff0000, + 0x00007cd2, + 0xfd4123ff, + 0x00007ed4, + 0xdf0ea7ff, + 0xa0beffff, + 0xb0c100a1, + 0x55e3be34, + 0xff4ea703, + 0x4301fd4f, + 0xf49b4027, + 0xff4ea70e, + 0x4499ffff, + 0x3b21270e, + 0xa724cb23, + 0xfd4fbf3e, + 0x41272138, + 0x21533405, + 0x22d63403, + 0x3ea74127, + 0xc5fdcfff, + 0xb4996034, + 0xc144e612, + 0x410430b4, + 0xfffb35be, + 0xf58ef183, + 0xfb93fa4e, + 0x1904fca0, + 0xe81fe6b1, + 0x44bdc100, + 0x20274027, + 0xb49d30a7, + 0x4ab38d0c, + 0xb49db265, + 0x4cb2c50b, + 0x000fdf83, + 0xd04c8000, + 0xdfa3d123, + 0xfffffff0, + 0x11c4d103, + 0x874d076b, + 0x2b45333d, + 0x33340743, + 0x07342b33, + 0x60af03a3, + 0x07000585, + 0x070b07c3, + 0x2e4cbe1a, + 0x30cf0300, + 0xbe000581, + 0xbe00a350, + 0xbe00a154, + 0xb900a143, + 0x36043cc4, + 0x071a0745, + 0xfd977e0b, + 0x0437c3b9, + 0x24ff3cc0, + 0x0435c4b9, + 0xb39d47e6, + 0x34c3b966, + 0x9d112704, + 0xc4b967b3, + 0x44960446, + 0x41071027, + 0x43ab4633, + 0x0767b49d, + 0x333d874d, + 0x07432b45, + 0x2b333334, + 0x303f0334, + 0xb9000581, + 0xb9044634, + 0x27043432, + 0x27449611, + 0x33410710, + 0x9342ab46, + 0x04fbd7f2, + 0xb95a249d, + 0x27044034, + 0x5b249d10, + 0x043534b9, + 0x11274486, + 0x274423c1, + 0x1d310340, + 0x5c219d24, + 0x8e4423c5, + 0x93fe4efa, + 0x04fbabf3, + 0x41443419, + 0x341d4227, + 0xbefefb7e, + 0x0efff0c2, + 0xfc175efe, + 0xd207f74e, + 0x80074207, + 0x2027b107, + 0x42053827, + 0xf3c84403, + 0x2712b489, + 0x89d40d31, + 0xd12d14b1, + 0x3b34b499, + 0x1ed39d34, + 0x89058499, + 0x44c632b9, + 0x91539103, + 0x274b8499, + 0x27420430, + 0x4884c131, + 0x4e583f6b, + 0x07ffff00, + 0x21ad03a3, + 0x270b1e80, + 0x273486a1, + 0x02ad13a0, + 0x30b38980, + 0xec03e907, + 0x0f3c030f, + 0xe4533453, + 0x37037a07, + 0x4a07e803, + 0xe3207c83, + 0x83e7e337, + 0x6676c642, + 0x902d2745, + 0x104c2702, + 0x2d27181e, + 0x4c2701e0, + 0x060f1e60, + 0x002d2745, + 0x270c1e02, + 0x1e01802d, + 0x802c0306, + 0x1307242b, + 0x1e9b1433, + 0x4d834107, + 0x45060fff, + 0x10001d03, + 0xc207142b, + 0x2c47c39b, + 0x42070e07, + 0x4c830153, + 0xe601237f, + 0x802c0344, + 0x4047242b, + 0x342b3e07, + 0x43073c9b, + 0xe67f4c83, + 0x803c0344, + 0xb489342b, + 0x0b209b30, + 0x0f4c0321, + 0x230b4453, + 0xd48dd215, + 0x0584990c, + 0x00a54ff6, + 0x0730b389, + 0x03e103e9, + 0x53317331, + 0x0f3c03e1, + 0x530fec03, + 0x03e45334, + 0x07e80337, + 0xe337e34a, + 0xc64283e7, + 0x27456676, + 0x2702902d, + 0x181e104c, + 0x01e02d27, + 0x1e604c27, + 0x2745060f, + 0x1e02002d, + 0x802d270c, + 0x03061e01, + 0x242b802c, + 0x14331307, + 0x41071e9b, + 0x0fff4d83, + 0x1d034506, + 0x142b1000, + 0xc39bc207, + 0x0e072c47, + 0x01534207, + 0x237f4c83, + 0x0344e601, + 0x242b802c, + 0x3e074047, + 0x3c9b342b, + 0x4c834307, + 0x0344e67f, + 0x342b803c, + 0x9b30b489, + 0x73410320, + 0x03210b41, + 0x230b0f4c, + 0xd2254453, + 0x890ed48d, + 0xd48d2884, + 0x07839910, + 0x0b2a8489, + 0x12d48d43, + 0x8932b189, + 0xdcbe30b0, + 0x2ea70032, + 0xa9ffffff, + 0x550d3e23, + 0xa93746d0, + 0x860d4024, + 0x0ad40946, + 0x18d48d34, + 0x0d4024a9, + 0x430ad329, + 0x8e1ad38d, + 0x93f54ef7, + 0x04f9affb, + 0xa744b3c1, + 0xffffff4e, + 0x449913a5, + 0x07f0e326, + 0x07700791, + 0x27422082, + 0xa25e145c, + 0x08b49908, + 0x5c274506, + 0x08975e11, + 0xbe44b0c1, + 0x07fff38b, + 0x8a0ff650, + 0x44b4c108, + 0x070f4c83, + 0x87353334, + 0x07342b44, + 0x2bd333d3, + 0x60df03d3, + 0xc1000585, + 0x60d5acd6, + 0xb499011c, + 0x204c2054, + 0x08be0d07, + 0xb4990053, + 0xc94fe60a, + 0x0a949903, + 0xc1104ce0, + 0xa9b4b903, + 0xf1b2b903, + 0xf9fa9303, + 0xb1b903e1, + 0xa50503f2, + 0xb3b9a515, + 0x410303aa, + 0xb0b92803, + 0x180303f3, + 0x5d04a49d, + 0xadb4b9a2, + 0xf4b2b903, + 0x7d310303, + 0x1d1b07a1, + 0x05a39da4, + 0xa29da03d, + 0x201d0306, + 0x07282704, + 0x900cbe0a, + 0x07c00700, + 0x0319070b, + 0x9303a80d, + 0x03e18bf2, + 0x07fd4b7e, + 0x81f0931b, + 0x1d0303e1, + 0x2c270400, + 0x8fe8be20, + 0x96412700, + 0xab4027c4, + 0xd8bea940, + 0x6cb3c103, + 0x44962127, + 0x10272027, + 0x11273e0e, + 0xb909b399, + 0xab03a8b4, + 0x0e102721, + 0x07112734, + 0xe641ab42, + 0xc101314f, + 0x012344b0, + 0x16f9027e, + 0x0f5c2705, + 0xbe079c5e, + 0x59ffeba1, + 0xa8b0b9a4, + 0x27493003, + 0x790b1e21, + 0x103027a4, + 0x07312749, + 0x35f49323, + 0x443903e1, + 0x42043027, + 0x13073127, + 0x25461f6b, + 0xbd03b107, + 0x0b1e8021, + 0x1486b127, + 0xbd13b027, + 0x4ea78002, + 0x99feffff, + 0x43830944, + 0x44333487, + 0xf393432b, + 0xf903e100, + 0x00004d4d, + 0x933319ff, + 0x04f82bf4, + 0x0b6841c1, + 0x964127d0, + 0x83402734, + 0x3b01001d, + 0x0e9289d4, + 0x27109389, + 0x271496c1, + 0x070d07c0, + 0xbecc471b, + 0x86fff358, + 0xeb17be07, + 0xf311beff, + 0x270506ff, + 0x025e105c, + 0x070d0707, + 0xbe2c071b, + 0x93fff398, + 0x04f7e3fd, + 0x03d8d4a9, + 0xe0a2fc93, + 0x6cd4c503, + 0xc011c401, + 0x0420d4d5, + 0x03a8d4b9, + 0x20a73027, + 0x9d09d49d, + 0xd29d5cd3, + 0x24d0d566, + 0x5ad39d04, + 0x995bd29d, + 0x03532690, + 0x8bbe0183, + 0x64d10039, + 0x4586011c, + 0x0d030607, + 0x2bbe011c, + 0x2d070038, + 0x19070d07, + 0x04002d03, + 0x03a80d03, + 0x07fbf37e, + 0x000d030d, + 0x1521be04, + 0xbe0c0700, + 0x27001578, + 0x115c2741, + 0x5e08d49d, + 0xb0b9067d, + 0x402703a9, + 0x9d0ab49d, + 0xb4b935b0, + 0xb0b903aa, + 0xb49d03ab, + 0x37b09d36, + 0x03afb4b9, + 0x03b0b0b9, + 0x9d38b49d, + 0xb4b939b0, + 0xb0d103b1, + 0xb1a903e8, + 0xb3b903d4, + 0x2e0703b2, + 0xc53ab49d, + 0x219b40b0, + 0x410736c6, + 0x48333107, + 0x432b3433, + 0xc20bc447, + 0xb445420b, + 0x42070e1e, + 0x07384c03, + 0x45c153c4, + 0x93c40bb4, + 0x04f703f4, + 0x03e84ed1, + 0x03e440d1, + 0x03da41a9, + 0x03d442a9, + 0x03dc43d1, + 0x219be00b, + 0xed033387, + 0xe30b07f8, + 0x03e041a9, + 0x31533207, + 0xe10b320b, + 0x550c2c27, + 0x03031e43, + 0x3b412721, + 0xf84cca42, + 0xf6c2f493, + 0x9d415104, + 0x23072442, + 0x21071302, + 0x1e0c3c27, + 0x27310303, + 0xca433b41, + 0xf493f842, + 0x2704f6a4, + 0x439d0c2c, + 0x03031e25, + 0x3b412721, + 0xf84eca42, + 0xf68ef193, + 0x24149904, + 0x1426129d, + 0x4c270c4c, + 0x2510990c, + 0x1424149d, + 0x0c270c0c, + 0xbe13a90c, + 0xc012a903, + 0xf314b903, + 0x03239b03, + 0x2303ff2d, + 0x9d2a5342, + 0x4f6b2510, + 0x42343247, + 0x051e2307, + 0x2153230b, + 0xf64afb93, + 0xb8b4b904, + 0xf1b3b903, + 0x27453603, + 0xb4bd104c, + 0x420703b8, + 0x43534703, + 0xb099439b, + 0xb8b3b924, + 0x27420b03, + 0x3b439b21, + 0x53e20720, + 0x274a3345, + 0x25b19932, + 0xe40be123, + 0x413b4307, + 0x2013303b, + 0xe28b430b, + 0xe4074e02, + 0x00271e07, + 0x000686be, + 0x03e2b3a9, + 0x7fff4ea7, + 0xd4bca9d0, + 0x27428103, + 0x28b38d40, + 0x9b34b49d, + 0x272c2ac3, + 0x34b49d41, + 0xc230b4c1, + 0xb0b10dc4, + 0x297e1c07, + 0xc5b0b5f6, + 0x4ea730bc, + 0xc1fd4fff, + 0x4e3c7444, + 0x27100000, + 0x27031e30, + 0xab434731, + 0x1041c043, + 0x42c04150, + 0x0d43c00b, + 0x3c27101e, + 0x270d1e40, + 0x081e903c, + 0x1e503c27, + 0x93ff1e03, + 0x04f58ff4, + 0x107443ad, + 0xf586f493, + 0xac42b904, + 0x07429d03, + 0xf57afc93, + 0x2740a704, + 0x4ac48d30, + 0x994cc3c5, + 0x41d82694, + 0x9d40270e, + 0x40a75ac4, + 0x9d5bc49d, + 0x94995cc3, + 0x104cc00a, + 0x030c0741, + 0x0703a80d, + 0xd1f29319, + 0xb17e03dd, + 0x931c07f9, + 0x03ddc7f0, + 0x04001d03, + 0xbe202c27, + 0xc6008c4e, + 0x07412707, + 0xbbd49d0c, + 0x04000d03, + 0xddaaf393, + 0x01482703, + 0x05340332, + 0xa8040302, + 0x034607f4, + 0xf293fc4c, + 0x2704f90c, + 0x01382718, + 0x05112320, + 0x03240340, + 0x93f39844, + 0x04f4f7f0, + 0x042002d1, + 0xd1f462c5, + 0xc5042403, + 0xd489f863, + 0x0e048d2a, + 0x027d7259, + 0x8d129389, + 0x94891ad3, + 0x1cd48d14, + 0x8d169289, + 0x93891ed2, + 0x20d38d18, + 0x8d309489, + 0x928922d4, + 0x24d28d32, + 0x9d350399, + 0x94990fd3, + 0x96302736, + 0x9d312744, + 0x049906d3, + 0x0cd19d38, + 0x27b8d49d, + 0x0bd49d40, + 0xd2c59281, + 0xc593915c, + 0x94a160d3, + 0x9964d4c5, + 0xd29d0a92, + 0x0c939904, + 0x5105d39d, + 0x3cd4c574, + 0xd2c592b1, + 0x0b939938, + 0x470a9499, + 0x0b418333, + 0x6b430734, + 0x10d49d4f, + 0xdc5a0199, + 0x9951401c, + 0x24d804d2, + 0x5b03994b, + 0x43ce41c3, + 0xcb410720, + 0xc4458342, + 0x03991741, + 0x05d4995c, + 0x340e2027, + 0x42072127, + 0x340741c3, + 0x031e3f6b, + 0xf4933027, + 0x9904f428, + 0x3f6b5c44, + 0x34d64666, + 0x081e4027, + 0x8362d499, + 0x0741c341, + 0x073f6b34, + 0x27031e43, + 0x16d49d40, + 0xd49d4027, + 0x217399b9, + 0xbe13d39d, + 0x93003fc6, + 0x04f3f3f4, + 0x107444a9, + 0xc504d399, + 0xd1c5b0d0, + 0xbcd48db4, + 0x27203c3c, + 0x07121ea0, + 0x837a6143, + 0xd49ddf4c, + 0x9d422704, + 0xa103b9d4, + 0xf3c6f493, + 0x664e9904, + 0x7effecc0, + 0xc004d499, + 0xc177104c, + 0x202738d0, + 0x101e3007, + 0x24f93138, + 0x00058278, + 0x5b0d4ece, + 0x07210331, + 0xb6118312, + 0xc4051e31, + 0x9935ff2c, + 0x21270b94, + 0x20ab243b, + 0xffff2ed4, + 0x30273501, + 0x27111c27, + 0x8b433b41, + 0x03450642, + 0x1ef19831, + 0x6df49322, + 0x449904f3, + 0x83234767, + 0xc0240b41, + 0x0713ff2c, + 0x27315332, + 0xab433b41, + 0x38d4c540, + 0x2c27131e, + 0x9330a7ff, + 0x04f347f4, + 0x1e66439d, + 0xff2c2704, + 0x99bad29d, + 0x40a73790, + 0x9d08d09d, + 0x929909d4, + 0x11d29d38, + 0x42247459, + 0x161e4027, + 0xf31ef493, + 0x54449904, + 0x4c043027, + 0x07312720, + 0x6b41c343, + 0x12d49d4f, + 0xf306fb93, + 0x28b38904, + 0xd38db2b1, + 0x1094892c, + 0x8da8d2c5, + 0x90892e74, + 0x8d11270e, + 0xd3992c70, + 0x1c739d04, + 0x31279411, + 0x10274104, + 0x313b1213, + 0xd499e307, + 0x53ef6b04, + 0x32928942, + 0x41833e07, + 0x245b3433, + 0x41234307, + 0x428b240b, + 0x2bb8d099, + 0x02402734, + 0x0b412703, + 0x07140320, + 0x23315b32, + 0x17d49d14, + 0x9d14de9d, + 0xb49915d1, + 0x2ed38d0b, + 0x4ff6cb07, + 0xb2c10099, + 0x10d39944, + 0x9934d2c5, + 0x102707b4, + 0x11274486, + 0xec07d703, + 0xd723fd05, + 0x0148ed03, + 0xcc034107, + 0x070d0718, + 0x25fc1519, + 0xeaa8befe, + 0x0704e6ff, + 0x016f5e50, + 0xd4c5b461, + 0x68dc0344, + 0xd0033d07, + 0x41272d07, + 0x9d7f3ce3, + 0x2ce30bb4, + 0x68dc237f, + 0x3c033419, + 0xf932c280, + 0x0c030d07, + 0x79f19368, + 0x2c2704f3, + 0x4951be40, + 0x23a70603, + 0x6b4a07a1, + 0xbad49d4f, + 0x44994d0b, + 0x15f39368, + 0x349d04f2, + 0xbad39966, + 0x0eff3cc0, + 0xf206f493, + 0x66449904, + 0x349d3d0b, + 0x10908968, + 0xf1f6fa93, + 0x28d08d04, + 0xc10e9289, + 0xd28d44db, + 0x07737926, + 0x0dd39d0b, + 0x07047499, + 0x0ed49d19, + 0x890e9289, + 0xa3c11094, + 0x9b9c0140, + 0x87c30b42, + 0x0b280744, + 0x48e9bec4, + 0x07980103, + 0x0b4c0b4b, + 0x50d4c58b, + 0x994cd8c5, + 0xcd0324a0, + 0xd09d03fc, + 0x26a29958, + 0xd29d3b07, + 0x95a0615a, + 0x053c0b74, + 0x54d3c540, + 0x0325a299, + 0x9d03fccd, + 0xdcc559d2, + 0x9973a548, + 0xa4d15ad0, + 0x918903e4, + 0x1092890e, + 0x4c0b3127, + 0x342b303b, + 0x219bb40b, + 0x08072287, + 0xab751027, + 0xcbbea385, + 0xc0270088, + 0x990efc9b, + 0x45f60ca4, + 0x1d070a07, + 0xffe212be, + 0xa49d4127, + 0x34d3c10c, + 0x6544d4c1, + 0x3074c573, + 0x993478c5, + 0x799d0899, + 0x24a0991d, + 0x991f709d, + 0x729d25a2, + 0x99a34120, + 0x732534a0, + 0xd09da451, + 0x99743518, + 0x42e304a4, + 0x2704a49d, + 0xc5a41d41, + 0x93be30dc, + 0xffbeffef, + 0x4ea70097, + 0x11fd4fff, + 0xc06cc544, + 0xc5e864c5, + 0x6cc5a86c, + 0xc30507b0, + 0x4ef58ef0, + 0xe5f493fd, + 0x449904f0, + 0x3cf9e304, + 0xbe415842, + 0x27ffef62, + 0x074b1ed0, + 0x3c3c033f, + 0x4c272027, + 0x03320518, + 0x07f4c834, + 0x2720273f, + 0x32050f4c, + 0xf4c83403, + 0x273c4c27, + 0x0f07603c, + 0x073cf38d, + 0x103c2724, + 0x1f07040b, + 0x050af39d, + 0xf6e77ef4, + 0x05f6d007, + 0x27f3ef7e, + 0x8df49331, + 0x439d04f0, + 0xc30d0704, + 0x4efd8ef9, + 0xdf0ea7fc, + 0x47beffff, + 0x0d270095, + 0x87be3428, + 0xfc93000b, + 0x05050100, + 0xdf0ea7c0, + 0x0cbeffff, + 0x20270095, + 0x071d1c27, + 0x33320742, + 0x2b363344, + 0x01322b34, + 0x0b3333c4, + 0x03321d34, + 0x93f13821, + 0x04f03ffc, + 0x30274027, + 0xa70dc49d, + 0x44c3c540, + 0xc53cc3c5, + 0xaa7e78c4, + 0x0c4c27f0, + 0x40000d27, + 0x10072027, + 0x9d26c49d, + 0xc49d24c4, + 0x94b1be25, + 0x27202700, + 0x33420738, + 0xd040f543, + 0x03ff0004, + 0x000d0321, + 0xa7f36808, + 0xfd4fff4e, + 0x936843c1, + 0x04efeff2, + 0x3c331027, + 0x9d40a710, + 0x249d5c21, + 0x5a219d5b, + 0x241c3c53, + 0x004d2735, + 0x27051e10, + 0x9320004d, + 0x04efcbfc, + 0x1072c4ad, + 0x1070c4ad, + 0x5bbe0c07, + 0x40270049, + 0x9d60c4c5, + 0xfc8e5dc4, + 0xfe4efe0b, + 0xfa1f1ea7, + 0x0c2c27ff, + 0x3c27e027, + 0x03140910, + 0x0b423b12, + 0x982103e4, + 0x234ea7f3, + 0x40a1fffa, + 0xfe8e0e2b, + 0xfe0b0127, + 0xfa233ea7, + 0x3434c1ff, + 0x30c5040e, + 0x4efe0b34, + 0x23eea7fb, + 0xe4c1fffa, + 0xc6d10734, + 0x1ed40744, + 0xff4ea73c, + 0x4499feff, + 0x24e29909, + 0x34874383, + 0x432b4433, + 0x004d41f9, + 0x2803ff00, + 0x1d9b1203, + 0x100b4127, + 0xe3a1423b, + 0x3102140b, + 0xd1071307, + 0x00011f10, + 0xdf271000, + 0x10000000, + 0xfa23bea7, + 0xc2b4a1ff, + 0x0ea730d4, + 0xbeffffdf, + 0xc30093cc, + 0x6bc00701, + 0xa7c566cf, + 0xffffdf0e, + 0x0093d5be, + 0x1d070b07, + 0x00090dbe, + 0x0ea7c5a6, + 0x0effffdf, + 0x939d9efb, + 0x4efb8e00, + 0x000e27fb, + 0x26be0200, + 0xbea70007, + 0x27fffa23, + 0x24b49d48, + 0x1e27b005, + 0x07020000, + 0x0845be0b, + 0x24bc9900, + 0xc6030b07, + 0xb9be1c07, + 0x41270004, + 0xb4b54c3b, + 0x0230fb8e, + 0xd81ef093, + 0x93fe0b00, + 0x04eeabf3, + 0x309d4027, + 0xc500275d, + 0xfe0b6034, + 0xf0930230, + 0x0b00d82a, + 0x29f393fe, + 0x402704ff, + 0x04c6341d, + 0x341d4127, + 0xfe0b0027, + 0xff16f493, + 0x0b401904, + 0xff4ea7fe, + 0x40d5ffff, + 0x08060a14, + 0xafff2ea7, + 0xa72441fd, + 0xfd7fff3e, + 0x2405400b, + 0x4ce33421, + 0x11342510, + 0x104ca334, + 0x3ea70b1e, + 0x11fd7fff, + 0x104ce334, + 0x34150027, + 0xf493fe0b, + 0xc504ee3c, + 0x07536840, + 0x4ea70183, + 0x9dffffff, + 0x00274540, + 0x4007fe0b, + 0x42d04123, + 0x1104c014, + 0x400e08c0, + 0x0c20100c, + 0xc8f09320, + 0xfe0b00d7, + 0xee0af493, + 0x56449904, + 0x4596408b, + 0x93200c20, + 0x00d7d6f0, + 0xf493fe0b, + 0x9d04edf4, + 0x00275440, + 0x0230fe0b, + 0xd7e9f093, + 0x93fe0b00, + 0x04eddff3, + 0x890d01c4, + 0x00270e34, + 0x348d42a3, + 0x89fe0b0e, + 0x00270e34, + 0x348d42e3, + 0x30fe0b0e, + 0xf2f49302, + 0x141e00d7, + 0xfe4ef393, + 0x27051604, + 0x1e301540, + 0x1540a707, + 0x07402734, + 0x93fe0b04, + 0x04fe37f4, + 0xfe0b4011, + 0xfe2ef393, + 0x05402704, + 0x1540a734, + 0x1d412734, + 0x4efe0b34, + 0x930230fe, + 0x00d7e1f0, + 0x4127fe8e, + 0x40270496, + 0xaebe0407, + 0x00270008, + 0xfe4efe8e, + 0xfffde3be, + 0xfe8e0027, + 0x47c00401, + 0x1848d456, + 0x542f44c0, + 0x4241c045, + 0x009d42e4, + 0x45c02d1e, + 0x9446e425, + 0xc02e1e00, + 0x54252a4c, + 0x48c02b4c, + 0x8449e437, + 0xc0281e00, + 0xc432394c, + 0x1e79454c, + 0x1e001150, + 0x5e00119f, + 0x0011fe6a, + 0x11fe7f5e, + 0xfe9f5e00, + 0xd35e0011, + 0x5e0011fe, + 0x0011fee6, + 0x00119d1e, + 0x11ff195e, + 0xff3d5e00, + 0x4fff4ea7, + 0x7444c1fd, + 0x00004fd8, + 0x49242000, + 0xff4ea703, + 0x43adffff, + 0x00690d3e, + 0x40ad2027, + 0x2c1e0d40, + 0x4fff4ea7, + 0x7444c1fd, + 0x00004f3c, + 0xf2932000, + 0x1e00d75b, + 0xa7302717, + 0xffffff4e, + 0xd77af293, + 0x4643bd00, + 0x9e051e0d, + 0x07004664, + 0x4efe0b02, + 0xa7d007fd, + 0xffffdf0e, + 0x00916dbe, + 0x6108d099, + 0xbe2027d1, + 0x45012de5, + 0x110706d0, + 0x19d201d3, + 0x0b448734, + 0x31400542, + 0x19d455d4, + 0x1d410334, + 0xdf0ea734, + 0x1cbeffff, + 0xd4410091, + 0x44960027, + 0x01c30127, + 0xfd8e0183, + 0x0451fb4e, + 0xd207c007, + 0x2422b107, + 0x0be6aa3e, + 0xe41f4ea7, + 0x154b05fd, + 0x27c2414d, + 0xa7433530, + 0xfde40f4e, + 0x4d154205, + 0xefff2ea7, + 0x1e4335fd, + 0xc1f3e803, + 0x3327fc24, + 0xfc6a4ddc, + 0x51c341f5, + 0x2b3d0bc4, + 0x5503074d, + 0x450d2bc4, + 0x4efb8ec3, + 0x070e51fa, + 0x07c307b0, + 0x07a107d2, + 0x073e0243, + 0x51d4154e, + 0x154496b4, + 0x3ed211dc, + 0xa6d00594, + 0x07d41108, + 0x35242b2c, + 0x272516d2, + 0x8ed22501, + 0x0b1a07fa, + 0x7e0b0714, + 0xd025ff78, + 0x04964127, + 0x04074027, + 0xf54efa8e, + 0xa33414c1, + 0x99b407fc, + 0xbc835812, + 0xc5d1270f, + 0xb333c4f0, + 0x323b3d07, + 0x9107c027, + 0xff84be23, + 0x5011c1ff, + 0x9dc4f8c1, + 0xf2c108f2, + 0x35b403c4, + 0x55f465f3, + 0x150f07fc, + 0x23f105fb, + 0x03fc45b4, + 0x2a61188c, + 0xe6feda7e, + 0x9901370f, + 0x93c15994, + 0xa5d43b54, + 0x30fcc5fd, + 0x0724f49d, + 0x3494c10f, + 0x0c03b503, + 0x75fb851c, + 0xb5b523f3, + 0x34f4c5fc, + 0xe6feae7e, + 0x07010b0f, + 0x0b3f0778, + 0x383c037a, + 0x4c272027, + 0x03320520, + 0x27f4c834, + 0xff3d2720, + 0xbcf2c5ff, + 0xc5b8f3c5, + 0xd75ec0f2, + 0xd6740100, + 0x1e602744, + 0x53640707, + 0x07680b68, + 0x27a403a7, + 0x00ae5e50, + 0x4c54f451, + 0x7e0f0738, + 0x0fe6fe63, + 0xfd4100c0, + 0xdc03f451, + 0x384c2338, + 0xf455fd45, + 0xe638dc23, + 0x03a60754, + 0xac09186c, + 0xceb8f4c1, + 0xc2032b4c, + 0x4fab4c07, + 0x1f07c487, + 0xc2c1c10b, + 0xbcf2c538, + 0xa11126d6, + 0x180b0f07, + 0x697e1201, + 0x7d0fc6fe, + 0xc5bcf0c5, + 0xac0938c0, + 0xf2c1a309, + 0x29d30dbc, + 0x2da431a1, + 0x07d215d1, + 0x212d0718, + 0x07140ba3, + 0x7e28030f, + 0x0ec6fe8f, + 0x51c4f3c1, + 0x073141a4, + 0x41180b0f, + 0x0b2d07a3, + 0x202c0314, + 0x7e1c0c03, + 0x9489fe73, + 0xc0f1c126, + 0x9b4c93c1, + 0x87450b41, + 0x05430b44, + 0xc5d4294d, + 0x540bb8fc, + 0xfa269489, + 0xc1ff4f54, + 0x7c03c0f2, + 0xc521031c, + 0x9489c0f2, + 0xc0f3c128, + 0xff2334fa, + 0x3d1e0027, + 0xffdf0ea7, + 0x8f10beff, + 0x5090c100, + 0x9904b299, + 0x04035891, + 0x0bbe2123, + 0x91990005, + 0x5490c159, + 0xbe05b299, + 0x270004fe, + 0x05b49d40, + 0x0ea74127, + 0x9dffffdf, + 0xbcbe04b4, + 0x0427008e, + 0xf58efc83, + 0xb007f94e, + 0x4714bc23, + 0x094b0b41, + 0x07300742, + 0x240999d1, + 0x010724c6, + 0x4107241e, + 0xe4474103, + 0x1c270107, + 0x2beb0b1c, + 0x1d4c101d, + 0x01031127, + 0x2705f1f0, + 0x09531e30, + 0x66e203e2, + 0x23400722, + 0x493b0c4c, + 0xc4873301, + 0x4b071047, + 0x410b2123, + 0x420dc30b, + 0x20073287, + 0x12233c0b, + 0x2d2ba427, + 0xa93b1b0b, + 0x21033301, + 0xdfc40d0a, + 0xffffffff, + 0x1e21270b, + 0x2d412707, + 0x23ce0514, + 0x3be12701, + 0x0bca2be0, + 0x581223e3, + 0x8e0307f2, + 0xa3f54ef9, + 0x54f0c5f6, + 0x27240299, + 0xc5323b31, + 0x4f0750f2, + 0xf3c52007, + 0x58f1c54c, + 0xc5142c23, + 0x3c2740f4, + 0x40f1c110, + 0x14054027, + 0xf1c51403, + 0x07f38840, + 0x4cf2c172, + 0x21231027, + 0xf1c53a27, + 0x0dac2748, + 0xc560f2c5, + 0x788964f3, + 0x1a758918, + 0x00ea82f0, + 0xee4cf4c1, + 0xc100e345, + 0x4a0750f1, + 0x4c233a07, + 0x0c3c230d, + 0x313b413b, + 0x8754f1c1, + 0x0b120104, + 0x87a12335, + 0x27020bc3, + 0x3bb80731, + 0x0b40273a, + 0x07a103c2, + 0x27d00795, + 0xc5b10360, + 0xf4c55cf3, + 0x01511e44, + 0x071f070e, + 0x833a5b3e, + 0x43870f3c, + 0x4201410b, + 0xf4c12b26, + 0x06428b5c, + 0x07120745, + 0x07031e2e, + 0x5cf4c11e, + 0x41ce420b, + 0x44f4c11b, + 0x4203c205, + 0x2f073387, + 0xf4c5320b, + 0x27c40344, + 0x05910340, + 0x05091e34, + 0x1ed403de, + 0x034e0503, + 0xf0610304, + 0x3f0705fb, + 0xf2c1211e, + 0xa492ca60, + 0x38074607, + 0x362b4103, + 0x8496840a, + 0x04013127, + 0xd4050403, + 0xf3a8d403, + 0x3401dd1e, + 0xd4054546, + 0xd4034027, + 0xf2c13405, + 0xce340340, + 0xf3c1ed32, + 0x0aa3ce58, + 0x950e4127, + 0xf4c54027, + 0x44f4c148, + 0x1b1a798d, + 0x18748d48, + 0x0364f1c1, + 0xc51123a1, + 0x720364f1, + 0xff001ff6, + 0x8348f0c1, + 0xa7f58ef6, + 0xffffff3e, + 0x060834d1, + 0x34d5400b, + 0xfe0b0608, + 0x4ea7fe0b, + 0xb9ffffff, + 0xc1010042, + 0x3207fc40, + 0x4c834007, + 0x1e31030f, + 0x03402712, + 0x7c14fd01, + 0x07ff0000, + 0x83212340, + 0x14070f4c, + 0xf3f01333, + 0xf9091e03, + 0x00007e14, + 0xa74006ff, + 0xffffff4e, + 0x010042bd, + 0x0bfc40c5, + 0x07fc4efe, + 0x27b43ec0, + 0x270c0e41, + 0x8e040740, + 0x07fc4efc, + 0xffcf03c0, + 0x8303ffff, + 0x000000cf, + 0x271c07fc, + 0x163c2720, + 0x008ba3be, + 0xfa234ea7, + 0xc53027ff, + 0x43c5404c, + 0x3840c53c, + 0xfa4efc8e, + 0xdc23d007, + 0x0bc24714, + 0x14dc03cd, + 0x0924db99, + 0x3b4127ce, + 0x23ae074b, + 0x01a30b42, + 0x27a432d0, + 0x23fa8e01, + 0x2b3b0c2c, + 0x4e87e20b, + 0x2387040b, + 0x007e9abe, + 0x00274127, + 0xd49dca0d, + 0x4efa8e31, + 0x240399f7, + 0x433b4127, + 0x7407f063, + 0xd0070a01, + 0xb107f105, + 0x84877333, + 0x9027c007, + 0x0b07c249, + 0x22871a07, + 0x64be9103, + 0xa80b007e, + 0xc203b70b, + 0xe9109cc4, + 0x0124d499, + 0x03c407de, + 0x24d49d41, + 0xc603f401, + 0x0d07d405, + 0x2c071f07, + 0xfe053127, + 0x96ff6d7e, + 0x27d3b105, + 0x0b4c3b41, + 0x43d3b534, + 0x4ef78ef0, + 0xe7f093fa, + 0x05be00d1, + 0xf0930087, + 0xbe00d1e7, + 0xa70086fc, + 0xfffa1fbe, + 0x270cdc27, + 0x07b209a0, + 0x3bc2071d, + 0xf1f093cd, + 0x3c0700d1, + 0xddbeb203, + 0xac0b0086, + 0xbfc4d103, + 0xff000600, + 0x23cea7e1, + 0xc189fffa, + 0xf6f09332, + 0xc1be00d1, + 0xc1a10086, + 0x2107c3b1, + 0xf0934a07, + 0x2b00d1fd, + 0x9efa0e2a, + 0x4e0086ac, + 0x3808c1f6, + 0x993c0cc1, + 0xd007240e, + 0x7027b107, + 0x6c279027, + 0x1c3c270c, + 0x362b0607, + 0x0103031e, + 0x4c072227, + 0x405b203b, + 0x415c2c0b, + 0x1e03f3f0, + 0xeb2bc204, + 0x4c234007, + 0x0b24470c, + 0x3b21492d, + 0x01410b4e, + 0x0b4487d3, + 0x0b380743, + 0x05a1273c, + 0x07110343, + 0x3b3e074a, + 0x03214d40, + 0x0ac40b37, + 0x02712703, + 0x07910719, + 0x234e3b4a, + 0x1494da42, + 0x13077666, + 0x097e0d07, + 0x071007fc, + 0xfeb97e0d, + 0xca24de99, + 0xd4a190cb, + 0xc53cd3c1, + 0x432b3cdb, + 0xd4a54b0b, + 0xfa4ef68e, + 0xc13c02c1, + 0xd1074003, + 0xdd0304a1, + 0xdde30fff, + 0x322b0fff, + 0xd42ba007, + 0x663800c1, + 0x02bd0737, + 0x07b307d3, + 0x07c20bcb, + 0x898ebe1c, + 0x070a0700, + 0xff357e1c, + 0xd606db2b, + 0xf67e0d07, + 0x070a07fd, + 0x5efa0e1d, + 0xfa8eff23, + 0x0499fa4e, + 0x07d00731, + 0x07b307a2, + 0x7e46c6c1, + 0x0526fc1d, + 0x1c070d07, + 0x27fb877e, + 0x31d49d40, + 0xc05e0fd6, + 0x0a070bb2, + 0x66fdb07e, + 0x4fb3c00e, + 0x4c234c47, + 0x24d29914, + 0x31274d0b, + 0x4409323b, + 0x34223123, + 0x111e3c07, + 0x47034207, + 0x3c07c442, + 0x051e3103, + 0x38033207, + 0x433b4127, + 0x3407d1a1, + 0x130b3123, + 0x140b13eb, + 0x4b7e0d07, + 0x32d489ff, + 0x41030d07, + 0xd48d1c07, + 0x5efa0e32, + 0x0027fb24, + 0xfa4efa8e, + 0xa007d207, + 0x2a46b107, + 0x1a073d07, + 0x0ea72b07, + 0x7efffa23, + 0x07a6fd7e, + 0xfa23cea7, + 0x24c099ff, + 0x10272227, + 0x4ebe0703, + 0x10070126, + 0xa47e0c07, + 0x27d61efd, + 0x0ef49b40, + 0x4007fa8e, + 0x1e0c0c27, + 0x27010303, + 0xca203b21, + 0x3ea7f824, + 0xd1ffffff, + 0x27060834, + 0xd5420b10, + 0x27060834, + 0x26179e22, + 0xff4ea701, + 0x40bdffff, + 0xfe0b0d14, + 0xffff2ea7, + 0xbd3027ff, + 0xa70d1423, + 0x15f49310, + 0x419d04f6, + 0x26239d43, + 0x0b27239d, + 0xff4ea7fe, + 0x4201fd4f, + 0xd436f393, + 0xd24d2703, + 0x27340507, + 0x34150c4c, + 0x30354027, + 0x03073225, + 0x539e3445, + 0xfd4e007f, + 0xffff4ea7, + 0x1444b9ff, + 0xa6d0070d, + 0x05f09345, + 0x1d0700d0, + 0x00847fbe, + 0xd3fef493, + 0xe23d2703, + 0x07430507, + 0x15342704, + 0x0e4d2543, + 0x7f209efd, + 0xa7fe4e00, + 0xffffff4e, + 0x0d1444b9, + 0xf0934566, + 0xbe00cffa, + 0x0e008450, + 0xd24d9efe, + 0xa7fd4eff, + 0xffffff4e, + 0x0d1444b9, + 0x4666d007, + 0x02890131, + 0x0803890a, + 0xcfe5f093, + 0x842abe00, + 0x030d0700, + 0xd2ccbe08, + 0x69f393ff, + 0x349904f5, + 0x9d410343, + 0xfd8e4334, + 0x4ea7fb4e, + 0xb9ffffff, + 0x230d1444, + 0x07b007f1, + 0x934566d1, + 0x00cfdcf0, + 0x0083f7be, + 0xf1930f07, + 0x2700cfe9, + 0x04be102c, + 0xd4f6007b, + 0xcfdafd93, + 0x61fc9300, + 0x4d2703d3, + 0xc40507e1, + 0x15844c27, + 0x07cb25c4, + 0x7d8cbe0d, + 0x03200700, + 0x0ccc0321, + 0x43273f07, + 0x34033101, + 0xc403c105, + 0x3459f4a8, + 0x1d073309, + 0xc30dc45d, + 0xd345f093, + 0x7abdbe03, + 0x21f09300, + 0x53be03d3, + 0xf103007e, + 0xfc4efb8e, + 0xffffcea7, + 0x14c4b9ff, + 0x26d0070d, + 0x21011146, + 0x93033102, + 0x00cf84f0, + 0x008377be, + 0xa626c499, + 0x93042745, + 0x00cfaef1, + 0x0086a59e, + 0x08030d07, + 0xfff5dfbe, + 0xdd211007, + 0xc4b90956, + 0x45660d14, + 0xcfc7f093, + 0x834abe00, + 0xc9f49300, + 0x3d2703d2, + 0x430507d3, + 0x34270407, + 0x4d254315, + 0xeb9efc0e, + 0x0d07007d, + 0x195efc0e, + 0xa7fe4eff, + 0xffffff4e, + 0x0d1444b9, + 0xf0934566, + 0xbe00cfac, + 0x93008314, + 0x04f4a3f3, + 0x45b63419, + 0xf1930427, + 0x9e00cfab, + 0x2700863e, + 0x8e341d40, + 0xa7fd4efe, + 0xffffff4e, + 0x0d1444b9, + 0x45e6d007, + 0x02210111, + 0xcfa9f093, + 0x82debe00, + 0x10d02100, + 0x0000000f, + 0x010f5070, + 0x27f00000, + 0xcff19304, + 0x039e00cf, + 0x3ea70086, + 0x27fffe6f, + 0x221c2720, + 0x34013423, + 0x4ed83403, + 0x23030000, + 0x40ce3421, + 0x2724330d, + 0xc324fd41, + 0x8e000582, + 0xce3401fd, + 0x24330d40, + 0x24fd4127, + 0x000582c4, + 0x2103fd8e, + 0xf0183c03, + 0xfd0ecbf1, + 0x4efde95e, + 0xff4ea7fc, + 0x44b9ffff, + 0xf0e30d14, + 0x4826d007, + 0x89180e89, + 0x01091a0c, + 0x03110229, + 0xfe150421, + 0xde51fc25, + 0xcf8cf093, + 0xbefe0500, + 0x93008250, + 0x03d1cff4, + 0x07de3d27, + 0x3c274305, + 0x07431520, + 0x2748030d, + 0x03020138, + 0x03420504, + 0x93f3a844, + 0x03d1aff0, + 0xfc0ef0c3, + 0x007cdd9e, + 0x4ea7fc4e, + 0xb9ffffff, + 0x070d1444, + 0x0145e6d0, + 0x93021101, + 0x00cfb0f0, + 0x008207be, + 0xd186fc93, + 0x270c0703, + 0x0507df4d, + 0x271d07c4, + 0x03282748, + 0xbec41508, + 0x07007907, + 0x9efc0e0c, + 0x4e007c9e, + 0xff4ea7fb, + 0x44b9ffff, + 0xb0070d14, + 0x45e6d107, + 0x2d070101, + 0xcf96f093, + 0x81c6be00, + 0x45fc9300, + 0x0c0703d1, + 0x0bbb4d27, + 0x2d071b07, + 0xc4050803, + 0xc8becd15, + 0x0c070078, + 0x5f9efb0e, + 0xfc4e007c, + 0xffff4ea7, + 0x1444b9ff, + 0xa6d0070d, + 0x84f09345, + 0x1d0700cf, + 0x00818bbe, + 0xd10afc93, + 0xe04d2703, + 0x27c40507, + 0xc415844c, + 0xc4254127, + 0x33be0d07, + 0x0103007b, + 0x0c072007, + 0x0c031d07, + 0x787dbe0c, + 0x0e0c0700, + 0x7c149efc, + 0xa7fc4e00, + 0xffffff4e, + 0x0d1444b9, + 0x45a6d007, + 0xcf52f093, + 0xbe1d0700, + 0x93008140, + 0x03d0bffc, + 0x07e04d27, + 0x4c27c405, + 0x27c41584, + 0x07c42542, + 0x7ae8be0d, + 0x07010300, + 0x070c0720, + 0x0c0c031d, + 0x007832be, + 0xfc0e0c07, + 0x007bc99e, + 0x4ea7fe4e, + 0xb9ffffff, + 0x660d1444, + 0x28f09345, + 0xf9be00cf, + 0x4ea70080, + 0x01fd4fff, + 0x71f39342, + 0x4d2703d0, + 0x340507d1, + 0x44270307, + 0x32253415, + 0x939efe0e, + 0xfd4e007b, + 0xffff4ea7, + 0x1444b9ff, + 0x6bd0070d, + 0x934566df, + 0x00cf03f0, + 0x0080bfbe, + 0xd03ef493, + 0xd43d2703, + 0x07430507, + 0x15342704, + 0x0e4d2543, + 0x7b609efd, + 0xa7fb4e00, + 0xffffffce, + 0x0d14c4b9, + 0xf4934806, + 0x1904f228, + 0xd1f49341, + 0x420104f1, + 0xf1cef493, + 0x93430104, + 0x00ced5f0, + 0x00807bbe, + 0x0d14c4b9, + 0x1f274ce6, + 0x1007a000, + 0x90000f27, + 0x61be1007, + 0xb007007c, + 0xc0001f27, + 0x0f271007, + 0x1007b000, + 0x007c4fbe, + 0x1f27c007, + 0x1007e000, + 0xd0000f27, + 0x3dbe1007, + 0x3007007c, + 0x2c071b07, + 0xcec6f093, + 0x9efb0e00, + 0x8e008030, + 0xa7fb4efb, + 0xffffffce, + 0x0d14c4b9, + 0x7a7e44a6, + 0xadfb93ff, + 0xbd1904f1, + 0xc4b9d996, + 0x45e60d14, + 0xced4f093, + 0xdd1d2700, + 0x8002be07, + 0x81f49300, + 0x3d2703cf, + 0x040707dd, + 0x4d154305, + 0x007aa9be, + 0xb41d4127, + 0xfd4efb8e, + 0xffff4ea7, + 0x1444b9ff, + 0x66d0070d, + 0xb9f09345, + 0xd1be00ce, + 0xf493007f, + 0x2703cf50, + 0x0507e03d, + 0x25332743, + 0x0c4c0343, + 0x2c032407, + 0xe334074f, + 0x3ce37f2c, + 0x0334197f, + 0x32c2803c, + 0x29f393f9, + 0xd76603cf, + 0x15544c27, + 0x030d0734, + 0x4c270c3c, + 0x03010114, + 0x03310504, + 0x1ef4a834, + 0x15442713, + 0x03202734, + 0x4c270c3c, + 0x03320514, + 0x93f4c834, + 0x03cef7f0, + 0x279efd0e, + 0xfb4e007a, + 0xd1070fab, + 0x1207f0a3, + 0x0de42307, + 0x014f0bb9, + 0xffffcea7, + 0x14c4b9ff, + 0x9347260d, + 0x04f08ff4, + 0xf4934301, + 0x0104f08c, + 0x34f09344, + 0x39be00ce, + 0xc4b9007f, + 0x46660d14, + 0xd201d111, + 0xd421d331, + 0xce53f093, + 0x7f22be00, + 0x14c4b900, + 0x4149260d, + 0x77f093d2, + 0xe20700ce, + 0x42073207, + 0x530cec53, + 0x104c5333, + 0xe1831207, + 0x21832253, + 0x41833183, + 0xf5befe05, + 0xc4b9007e, + 0x46860d14, + 0x8918d189, + 0xd38916d2, + 0x77f09314, + 0xddbe00ce, + 0xc4b9007e, + 0x46260d14, + 0x8944d189, + 0xf09346d2, + 0xbe00ce83, + 0x89007ec8, + 0xc3b918d4, + 0x4f8b0d14, + 0xe64b40cc, + 0x81d17135, + 0x82f093d2, + 0xadbe00ce, + 0xc4b9007e, + 0x45e60d14, + 0xd2a1d191, + 0xce8af093, + 0x7e9abe00, + 0x14c4b900, + 0xc147860d, + 0xd18934de, + 0x2ed2892c, + 0x8930d389, + 0xf09332d4, + 0x0500ce7e, + 0x7e7abefe, + 0xf0d49100, + 0x1e01ed44, + 0x7136265c, + 0x91d281d1, + 0xbaf093d3, + 0x61be00ce, + 0xc4b9007e, + 0x46460d14, + 0xd2b1d1a1, + 0x9330d3c1, + 0x00cec8f0, + 0x007e4bbe, + 0x0d14c4b9, + 0xd1c14686, + 0x38d2c134, + 0x933cd3c1, + 0x00ced4f0, + 0x007e33be, + 0x0d14c4b9, + 0xd1894626, + 0x42d28940, + 0xced7f093, + 0x7e1ebe00, + 0x34d4c100, + 0x019044e8, + 0x0d14c4b9, + 0x685ed371, + 0xba0de401, + 0xa700ae0b, + 0xffffffbe, + 0x0d14b4b9, + 0xf4934726, + 0x0104ef3c, + 0x39f49343, + 0x440104ef, + 0xceaef093, + 0x7de6be00, + 0x14b4b900, + 0x1146660d, + 0x31d201d1, + 0x93d421d3, + 0x00cd00f0, + 0x007dcfbe, + 0x0d14b4b9, + 0xd34149e6, + 0xcec0f093, + 0x07e30700, + 0x072307c3, + 0x14ec5313, + 0x5310cc53, + 0x8334532a, + 0x07c183e1, + 0x83218341, + 0x05418331, + 0xbefc15fe, + 0xb9007d9c, + 0x660d14b4, + 0x51d18146, + 0x71d361d2, + 0xcbf093d4, + 0x85be00ce, + 0xd471007d, + 0x00f844f0, + 0x0d14b4b9, + 0xd181d361, + 0x00ec4fe6, + 0x3479310b, + 0x32393119, + 0xf0933359, + 0x8300cd9c, + 0x9efb0ef0, + 0xc4007d5c, + 0x180bbb0d, + 0xffff4ea7, + 0x1444b9ff, + 0xc34fe60d, + 0x93d30100, + 0x00ceaef0, + 0xe400b15e, + 0x990bbc0d, + 0xffcea700, + 0xc4b9ffff, + 0x47260d14, + 0xee6ef493, + 0x93430104, + 0x04ee6bf4, + 0xf0934401, + 0xbe00ceac, + 0xb9007d18, + 0x660d14c4, + 0x01d11146, + 0x21d331d2, + 0x32f093d4, + 0x01be00cc, + 0xc4b9007d, + 0x46260d14, + 0x8918d189, + 0xf0931ad2, + 0xbe00ceb8, + 0x89007cec, + 0x44d01ad4, + 0x14c4b91c, + 0x9946e60d, + 0xd29920d1, + 0x22d39921, + 0x9323d499, + 0x00ceb4f0, + 0x007ccbbe, + 0xffffcea7, + 0x14c4b9ff, + 0x4145e60d, + 0x93d251d1, + 0x00cec4f0, + 0x007cb3be, + 0x44d0d451, + 0x14c4b926, + 0xe6d3410d, + 0xff345e47, + 0xffff4ea7, + 0x1444b9ff, + 0x0746260d, + 0xc5f09330, + 0xf08300ce, + 0x899efb0e, + 0xf083007c, + 0xfb4efb8e, + 0x4b86f493, + 0x0a438906, + 0x07084489, + 0x2eb107c0, + 0x8e002743, + 0x7779befb, + 0xadf39300, + 0x340104ed, + 0x400bd007, + 0x07c63405, + 0xffff4ea7, + 0x1444b9ff, + 0x0946660d, + 0x931b07c0, + 0x00cebbf2, + 0xcebaf393, + 0xfcd47e00, + 0xd4860d07, + 0xfb8e0127, + 0xf293fc4e, + 0x0104ed78, + 0xff3ea724, + 0xf063ffff, + 0x33b94123, + 0xf0050d14, + 0xd1072405, + 0x3626fc09, + 0xf2930c07, + 0x9300ce8f, + 0x00ce83f3, + 0x0dfc9d7e, + 0xd64d27fc, + 0x81fc9307, + 0xf00103cb, + 0x4027c405, + 0xc4151d07, + 0x007677be, + 0xf0430c07, + 0x9f9efc0e, + 0xf0630076, + 0x0bb94d27, + 0x4c27f40d, + 0x07f42d48, + 0x43f00110, + 0x4e9a1ef0, + 0x05f063fc, + 0x07fc09f0, + 0xbbcdc0d1, + 0xf3930c0b, + 0x0104ed00, + 0x05412334, + 0xff4ea734, + 0x44b9ffff, + 0x46260d14, + 0xf2930c07, + 0x9300ce23, + 0x00ce26f3, + 0x0dfc317e, + 0xd54d27fc, + 0x15fc9307, + 0xf00103cb, + 0x4027c405, + 0xc4151d07, + 0x007624be, + 0xf0430c07, + 0x339efc0e, + 0xfb4e0076, + 0x4a7af493, + 0x49436906, + 0x07c00744, + 0x27432eb1, + 0xbefb8e00, + 0x9300788d, + 0x04ec9ff4, + 0x4201d007, + 0x302704d6, + 0xc409131e, + 0x4d043027, + 0x31270bbb, + 0x41c34307, + 0x3f6b3407, + 0xf493320b, + 0x0504ec7c, + 0xa7d7c643, + 0xffffff4e, + 0x0d1444b9, + 0xc0094666, + 0xf2931b07, + 0x9300cd94, + 0x00cda2f3, + 0x07fbad7e, + 0x27d4860d, + 0x4efb8e01, + 0xff3ea7f9, + 0x34b9feff, + 0x4cf81ffd, + 0xa700ee10, + 0xffffff4e, + 0x99444499, + 0x432b0933, + 0x41e84f4b, + 0xec5e00db, + 0x83130700, + 0x03133317, + 0x05929c1f, + 0x25f49300, + 0x4d9904ec, + 0xa7c40744, + 0xffffff9e, + 0xffd7aea7, + 0x992b1eff, + 0x449642c4, + 0xc499d123, + 0x07410340, + 0x273f6b34, + 0x42c49d40, + 0x2e40c39d, + 0x1e1027b3, + 0x83130767, + 0x03133317, + 0x05929c1f, + 0x011f4600, + 0xed4fc414, + 0x5000009c, + 0x9399a479, + 0x274f4b44, + 0x27400c20, + 0x2b430721, + 0x6b240742, + 0x0723232f, + 0x030f6b02, + 0xf9111e23, + 0x00004f34, + 0x0744c6ff, + 0x07181e30, + 0x070f6b0e, + 0x87338330, + 0x33e00743, + 0x03342b34, + 0xe020cee1, + 0x14993207, + 0x07342b04, + 0xec4f4b43, + 0x93ff7e41, + 0x04eb8bf2, + 0x06442d9d, + 0x42249919, + 0x41274876, + 0xa742249d, + 0xfeffff4e, + 0x01094499, + 0x04149d13, + 0x9ced3f04, + 0xd1230000, + 0x01442d9d, + 0x93f48b14, + 0x04eb5bf4, + 0x99404399, + 0x00274144, + 0x271934ce, + 0x93f98e01, + 0x04eb47f4, + 0x99404399, + 0xb3ee414b, + 0x1027ff09, + 0x8eff105e, + 0xa7fd4ef9, + 0xffffffde, + 0x0d14d4b9, + 0x46c6f063, + 0xd9b6f493, + 0x08429904, + 0x9326d199, + 0x00cc58f0, + 0x0079c7be, + 0xc426d499, + 0xf4931642, + 0x9904d99c, + 0x45b60844, + 0xf1930427, + 0x9e00cc6f, + 0xbe007cea, + 0x07ffc840, + 0x51f1930f, + 0x1b7e03c2, + 0xc6d007fd, + 0x93f00105, + 0x03c243f1, + 0x1efd5b7e, + 0xff4ea7e7, + 0x44b9ffff, + 0x45660d14, + 0xcc8cf093, + 0x797abe00, + 0xf9f49300, + 0x3d2703c8, + 0x040707d8, + 0x4d154305, + 0x007421be, + 0xeaaef293, + 0x40249904, + 0x41033027, + 0x9d42239d, + 0x447e4024, + 0x8ef043fe, + 0x63fd4efd, + 0xf5f193f0, + 0x0f0703c1, + 0x07fdc97e, + 0xe9f193d0, + 0x052603c1, + 0x647ef001, + 0xa7e71efd, + 0xffffff4e, + 0x0d1444b9, + 0xf0934566, + 0xbe00cc46, + 0x9300791c, + 0x03c89bf4, + 0x07d73d27, + 0x43050407, + 0xc3be4d15, + 0xf2930073, + 0x9904ea50, + 0x30274024, + 0x239d4103, + 0x40249d42, + 0x43fde67e, + 0x4efd8ef0, + 0xffdea7fd, + 0xd4b9ffff, + 0x45660d14, + 0xcc1bf093, + 0x78dabe00, + 0x26d49900, + 0x042745a6, + 0xcc21f193, + 0x7c089e00, + 0xc76cbe00, + 0x5efd0eff, + 0xfd4eff75, + 0xffffdea7, + 0x14d4b9ff, + 0x9345660d, + 0x00cc32f0, + 0x0078abbe, + 0x9926d299, + 0x244e27d4, + 0xf1930827, + 0x1e00cc2c, + 0xff4ea722, + 0x4499feff, + 0x87438309, + 0x2b443334, + 0x4d44f943, + 0x23ff0000, + 0x27485041, + 0x4cf19308, + 0xb39e00cc, + 0x4227007b, + 0xc427d49d, + 0xf4931822, + 0x9904e9b4, + 0x20274043, + 0x429d3103, + 0x40439d42, + 0x485efd0e, + 0x4efd8efd, + 0xffdea7fd, + 0xd4b9ffff, + 0x45660d14, + 0xcc2af093, + 0x783ebe00, + 0x26d29900, + 0x4e27d499, + 0x93082724, + 0x00cc26f1, + 0x007b699e, + 0xd49d4027, + 0x9326f627, + 0x04e96bf3, + 0x9d403499, + 0x41034232, + 0x0e40349d, + 0xfd015efd, + 0xfb4efd8e, + 0xffff4ea7, + 0x1444b9ff, + 0xa6d0070d, + 0x35f09345, + 0x1d0700cc, + 0x0077f3be, + 0x75bed516, + 0x071effc6, + 0x0cbed204, + 0xcea7ffc4, + 0x27ffffff, + 0x14c4b9b0, + 0x34cbbd0d, + 0x9345a606, + 0x00cc1ff0, + 0xc9be1d07, + 0xf3930077, + 0x9d03c748, + 0x4d2727cd, + 0x340507db, + 0x34154427, + 0x03073d25, + 0xbe26cd9d, + 0x93007266, + 0x04e8f3f3, + 0x9d403499, + 0x4103423b, + 0x0e40349d, + 0xfc895efb, + 0xdea7fb4e, + 0xb9ffffff, + 0x660d14d4, + 0x22f09345, + 0x81be00cc, + 0x4ea70077, + 0x91d07fff, + 0x104c5c44, + 0xf1930427, + 0x9e00cc1c, + 0xbe007aaa, + 0x93ffc3af, + 0x04e8abf4, + 0xf4934201, + 0x0104e8a0, + 0x3bf09341, + 0x51be00cc, + 0x1f270077, + 0x1007a000, + 0x90000f27, + 0x3dbe1007, + 0xb0070073, + 0xc0001f27, + 0x0f271007, + 0x1007b000, + 0x00732bbe, + 0x1f27c007, + 0x1007e000, + 0xd0000f27, + 0x19be1007, + 0x30070073, + 0x2c071b07, + 0xcc1ef093, + 0x770ebe00, + 0xbd412700, + 0xa70a11d4, + 0xfd4fff4e, + 0x40274301, + 0x270ef49b, + 0x0ed499c1, + 0xc4cbc33b, + 0x4fbf3ea7, + 0x27c138fd, + 0x53340541, + 0x03c4c6c1, + 0x27f31e34, + 0x7d78414f, + 0xa7f4e801, + 0xffffff4e, + 0x0d1444b9, + 0xf09345e6, + 0x2700c592, + 0xbe07dc1d, + 0x930076c0, + 0x03c63ff4, + 0x07dc3d27, + 0x43050407, + 0xfb0e4c15, + 0x0071659e, + 0xdea7fd4e, + 0xb9ffffff, + 0x660d14d4, + 0xdcf09345, + 0x95be00cb, + 0xd4b90076, + 0x45e60d14, + 0xc554f093, + 0xd91d2700, + 0x7682be07, + 0x01f49300, + 0x3d2703c6, + 0x430507d9, + 0x30270407, + 0xfd0e4315, + 0x0071259e, + 0xdea7fc4e, + 0xb9ffffff, + 0x210d14d4, + 0x1145e60c, + 0x932c0701, + 0x00cba5f0, + 0x00764fbe, + 0x4027c5d6, + 0x0d38dcd5, + 0x0d3cd4ad, + 0xc6d4371e, + 0x38d4d134, + 0x3cdcad0d, + 0x2749760d, + 0x100000cf, + 0x804f2710, + 0xd5101000, + 0x070d38d4, + 0x2710270c, + 0x63be802c, + 0x4f27006d, + 0x11223356, + 0x2740c4c5, + 0x0ef49b40, + 0xffff4ea7, + 0x1444b9ff, + 0x9345e60d, + 0x00c4c5f0, + 0x07e31d27, + 0x0075f3be, + 0xc572f493, + 0xe33d2703, + 0x07430507, + 0x15302704, + 0x9efc0e43, + 0x4e007096, + 0xffbea7fb, + 0xb4b9ffff, + 0xc0070d14, + 0x45a60d01, + 0xcb45f093, + 0xbe1d0700, + 0xe00075c0, + 0x1c03eedd, + 0xefddd401, + 0xddc02503, + 0x547a03eb, + 0xc003ecdd, + 0x4503e9dd, + 0x03eadde4, + 0x531e012e, + 0x03ecddc0, + 0xeddde47a, + 0x5e012103, + 0xdde00088, + 0x00fe03f2, + 0x03f3dd54, + 0x03f0dde0, + 0xdde400e8, + 0x010803f1, + 0xe000e45e, + 0xec03f4dd, + 0xf4ddf000, + 0xe400f203, + 0xf303f5dd, + 0x00e25e00, + 0xe6aaf393, + 0x41309904, + 0xfc98f453, + 0x27832007, + 0x230b2333, + 0xf393631e, + 0x9904e694, + 0xf4534130, + 0x2007fcef, + 0x23332783, + 0x4d1e230b, + 0xe67ef393, + 0x41309904, + 0xfc3df453, + 0x27832007, + 0x230b2333, + 0xf393371e, + 0x9904e668, + 0xf4534130, + 0x2007fb2d, + 0x23332783, + 0x211e230b, + 0xe652f393, + 0x44349904, + 0x00974ff6, + 0x27413099, + 0x83200741, + 0x9d233327, + 0x230b4434, + 0xf087f453, + 0x31992405, + 0xff3ea743, + 0x219dfeff, + 0x44b49904, + 0x2b093399, + 0xcc4f4b43, + 0x4ea71141, + 0x79ffffd7, + 0x07453644, + 0x9d410341, + 0xf3930424, + 0x0704e608, + 0x99410340, + 0x4f6b4032, + 0x2b41349d, + 0xd04f6b42, + 0x04274049, + 0xca2cf193, + 0x0e331e00, + 0xfdf25efb, + 0x015efb0e, + 0x0e0c07fd, + 0xf0475efb, + 0xfb0e0c07, + 0x0ef0f55e, + 0xf15b5efb, + 0xfb0e0c07, + 0x07fe135e, + 0x5efb0e0c, + 0x0427f17d, + 0xca11f193, + 0x77a89e00, + 0x4efb8e00, + 0xff4ea7fe, + 0x4491d07f, + 0x27104c5c, + 0x12f19306, + 0x101e00ca, + 0xc13803c1, + 0x304c3402, + 0xf1930627, + 0x9e00ca32, + 0x5200777e, + 0x93062732, + 0x00ca63f1, + 0x0471f21e, + 0x00004f30, + 0x420b7000, + 0x00014f50, + 0x0627f000, + 0xca89f193, + 0x81d91e00, + 0x91471604, + 0xa1469604, + 0xb1461604, + 0xc1459604, + 0x44f63004, + 0x663c04c1, + 0x93062745, + 0x00ca90f1, + 0xfe8eb61e, + 0x0289fb4e, + 0x07f1a318, + 0x832144d0, + 0x5efb0ef1, + 0x2dc0ff7f, + 0xd4591102, + 0x2711032d, + 0x01822dc0, + 0x832d544f, + 0x022dc001, + 0x2dc44601, + 0x1e380121, + 0x812dc03f, + 0x2dc03a02, + 0xc4350301, + 0x2702012d, + 0x2dd42e1e, + 0xd4128003, + 0x2480012d, + 0x11212dc0, + 0x012dc41f, + 0x181e1112, + 0x7fdf2d03, + 0x4fab4207, + 0x7fdf2d23, + 0x06274250, + 0xca39f193, + 0x071c1e00, + 0x0fcc53c2, + 0x4ea7c746, + 0xc1fd4fff, + 0x4e5c7444, + 0x27020000, + 0x45f19304, + 0xa79e00ca, + 0x2dc40076, + 0xa7170281, + 0xfd4fff4e, + 0x5c7444c1, + 0x1000004e, + 0xf1930427, + 0x1e00ca4e, + 0x301459e2, + 0x1eb12749, + 0x2714790b, + 0x27491030, + 0x19b30731, + 0x39302714, + 0x27448611, + 0x07de4131, + 0x6b4e0703, + 0xa641830f, + 0x2746d605, + 0x4cf19306, + 0xaf1e00ca, + 0x06274566, + 0xca69f193, + 0x58a41e00, + 0x270300ed, + 0x87f19306, + 0x971e00ca, + 0x12004127, + 0x14074027, + 0x011bcfe6, + 0x4c334207, + 0x53b64618, + 0x42c01c4c, + 0x9306271a, + 0x00ca8cf1, + 0x53ff755e, + 0x45861c4c, + 0xf1930627, + 0x5e00cac6, + 0x4207ff66, + 0x15e64783, + 0x271742c0, + 0xfbf19306, + 0x535e00ca, + 0x274140ff, + 0x22f19306, + 0x475e00cb, + 0x30ec58ff, + 0xf1930627, + 0x5e00cb48, + 0x4e07ff3a, + 0xc6c04c83, + 0x274b6605, + 0x61f19306, + 0x275e00cb, + 0x504653ff, + 0x93062742, + 0x00cb89f1, + 0xc4ff195e, + 0xd4811f41, + 0x4f30d3a1, + 0x70000000, + 0x4f50430b, + 0xf0000001, + 0xf1930627, + 0x5e00cb9f, + 0x3d46fefa, + 0xd391d471, + 0x00004f30, + 0x430b7000, + 0x00014f50, + 0x0627f000, + 0xcbe4f193, + 0xfedc5e00, + 0x06273596, + 0xcc04f193, + 0xfed05e00, + 0xd4810b86, + 0x4f30d3a1, + 0x70000000, + 0x4f50430b, + 0xf0000001, + 0xf1930627, + 0x5e00cc0c, + 0x3596feb2, + 0xf1930627, + 0x5e00cb88, + 0xd389fea6, + 0x32d48930, + 0x0627344e, + 0xcc29f193, + 0xfe945e00, + 0x0734d0c1, + 0x44438340, + 0x93062742, + 0x00cc61f1, + 0xf8fe815e, + 0x27021104, + 0x7af19306, + 0x735e00cc, + 0x822d20fe, + 0x022d0001, + 0x022d2411, + 0x1e412701, + 0x6b402703, + 0x6615d64f, + 0x93062746, + 0x00cc8ef1, + 0xe6fe515e, + 0x30ecfc44, + 0x4e0701d4, + 0x50c04c83, + 0x0627814c, + 0xcca2f193, + 0xfe385e00, + 0x9640d489, + 0x93062745, + 0x00ccbaf1, + 0x89fe295e, + 0x359642d3, + 0xf1930627, + 0x5e00ccd7, + 0xbe07fe1a, + 0x0407b183, + 0xb5e61307, + 0x0310ec58, + 0x1e015301, + 0x53110305, + 0x012dc011, + 0x2dd46403, + 0xe02e0302, + 0xb801212d, + 0x222d5400, + 0x022de001, + 0xe400b601, + 0xc801042d, + 0x00b15e00, + 0x02012dc0, + 0x812de073, + 0xe4008202, + 0xb401822d, + 0x009d5e00, + 0x11212de0, + 0x2dd4008b, + 0xe0151122, + 0x8811022d, + 0x042de000, + 0xe4008611, + 0x9403212d, + 0xc02f1e00, + 0x7821042d, + 0x31042dc0, + 0x012de473, + 0x1e008212, + 0x07400733, + 0x03410331, + 0x53415331, + 0x25c32731, + 0x05f355f4, + 0x35f415f0, + 0x1ef345f1, + 0x0341076d, + 0x47415341, + 0x05c32730, + 0x55f025f3, + 0x35f015f4, + 0x35491ef1, + 0x531103f1, + 0x27402711, + 0x45f015c2, + 0x05f455f1, + 0x35151ef0, + 0x471103f1, + 0x27115330, + 0x15c22740, + 0x55f145f3, + 0x25f305f4, + 0x032b1ef4, + 0x53308711, + 0x47071e11, + 0x87031e30, + 0x27402730, + 0x35f305c1, + 0x15f455f1, + 0x45f425f4, + 0x270b1ef4, + 0xfdf19306, + 0x135e00cb, + 0x070d07fd, + 0x27e027df, + 0x0cdc0310, + 0x0761cec2, + 0x01410b4f, + 0x3404c142, + 0x06272452, + 0xcc02f193, + 0xfcf05e00, + 0x410b4d07, + 0x04714301, + 0x4f30329b, + 0x70000000, + 0x4f50430b, + 0xf0000001, + 0xf1930627, + 0x5e00cc0a, + 0x04a1fcce, + 0x4f30b766, + 0x70000000, + 0x4fd0430b, + 0xf0000001, + 0x93062738, + 0x00cc1af1, + 0xa6fcb15e, + 0x93062749, + 0x00cc3bf1, + 0x71fca55e, + 0xa144d604, + 0x27458604, + 0x5df19306, + 0x935e00cc, + 0x3404c1fc, + 0x06274586, + 0xcc76f193, + 0xfc845e00, + 0x1403e103, + 0xe3c00403, + 0xff725e0e, + 0xf1930627, + 0x5e00cc87, + 0xf183fc6e, + 0xfe4efb8e, + 0x10272007, + 0xcc99f093, + 0xb955be00, + 0xff3ea7ff, + 0x4127ffff, + 0x0a1134bd, + 0x4fff4ea7, + 0x274201fd, + 0x0ef49b40, + 0x270e3499, + 0xcb323b31, + 0xbf2ea734, + 0x3138fd4f, + 0x24054127, + 0x24033153, + 0x4f2732d6, + 0x017d7841, + 0xfe8ef4e8, + 0xfe0bfe0b, + 0xb007fb4e, + 0x93121f9b, + 0x00cc57f0, + 0x006f77be, + 0xf093b111, + 0xbe00cc64, + 0x21006f6c, + 0x6bf093b1, + 0x61be00cc, + 0xb101006f, + 0xcc72f093, + 0x6f56be00, + 0x07c02700, + 0x07d231db, + 0x73f0931c, + 0xc10300cc, + 0x006f43be, + 0xccc4d403, + 0x0b07ec0f, + 0x6e9efb0e, + 0xf94effb9, + 0xb107a007, + 0x9c27c207, + 0x071c1e40, + 0x41cc10dc, + 0x1d07d907, + 0x032797be, + 0x1d070a07, + 0x032779be, + 0xbd0bcd2b, + 0x0b07ad0b, + 0xf98ec076, + 0x45334007, + 0x402b0333, + 0x018c40f9, + 0x0c83ff00, + 0x2303330f, + 0xffff7e0e, + 0x0347a89e, + 0xb88ef293, + 0xf33ea703, + 0x4c27fefd, + 0x03310130, + 0x03210534, + 0x27f4a824, + 0x0ef49b40, + 0x2ea7fe0b, + 0x93fefdf3, + 0x03b86bf3, + 0x01304c27, + 0x05340331, + 0xa8240321, + 0x9b4027f4, + 0xfe0b0ef4, + 0xeb073ea7, + 0x054027fd, + 0x004f2734, + 0x15158200, + 0x9b402734, + 0xfe0b0ef4, + 0xbea7f84e, + 0x07fdeb07, + 0x27c02780, + 0xa1071f0c, + 0x00009f27, + 0x66be1582, + 0xbc050327, + 0x4027b915, + 0xa70ef49b, + 0xfde41f3e, + 0x34054427, + 0x4ea73a15, + 0x35fde40f, + 0x1548053c, + 0x1f0c274a, + 0x3ebe4c35, + 0xbc050327, + 0x4027b915, + 0x8e0ef49b, + 0x040399f8, + 0x35a64007, + 0x400936c0, + 0x2738203a, + 0x27031e00, + 0x06449904, + 0x35064586, + 0x3a003720, + 0x08a33804, + 0xfc4efe0b, + 0xc007d107, + 0x032c9abe, + 0xd4990516, + 0x104c4404, + 0xd49d4127, + 0x04c49d0b, + 0x032cb9be, + 0x8e40d0c5, + 0x63f84efc, + 0x079007f0, + 0x070307d2, + 0xbeb107a3, + 0x07031c36, + 0x07348330, + 0x9c3fe6c0, + 0x04b89900, + 0x94108ce4, + 0x200cfc00, + 0xbea7008f, + 0xd1ffffff, + 0xf60620b4, + 0xf8038c4f, + 0xa7038808, + 0xfeffffce, + 0x1ffdc4b9, + 0x7a104cf8, + 0x230a0703, + 0xce01be01, + 0x6e0fe6ff, + 0xbe002703, + 0xd1000f6a, + 0xd1013cc3, + 0xe20a04b4, + 0x93035c34, + 0x03b7fffc, + 0x1c070f07, + 0xfff10dbe, + 0x082704f6, + 0x41034e5e, + 0xa30c07c4, + 0x0140004e, + 0x97bec445, + 0x9499fff1, + 0x2741245d, + 0xed88be00, + 0xbe0a07ff, + 0x27ffbed9, + 0x0ad89d40, + 0x27b0d48d, + 0x04949d42, + 0x0a04b4d1, + 0x41030327, + 0x0a04b4d5, + 0x9903125e, + 0x452612b4, + 0x05273576, + 0xf803065e, + 0x990300c8, + 0x4626bbb4, + 0x03acb0c1, + 0xb0befc0c, + 0x4027ffea, + 0xc1bbb49d, + 0x471630b4, + 0x1b070d07, + 0x00080abe, + 0x0c270516, + 0x02d95e0c, + 0xc528d489, + 0xd48930b4, + 0xf8412428, + 0x1e02c8c8, + 0x004d8307, + 0x0745f680, + 0xc12ebe0b, + 0x270616ff, + 0x02b55e0b, + 0xc605b499, + 0xbfdfbe44, + 0xffcea7ff, + 0xc4d1ffff, + 0xb1c10620, + 0xc5410344, + 0xc4d558d1, + 0x1b070620, + 0xccaaf093, + 0xbd06be04, + 0x5cd0c5ff, + 0x9d11b299, + 0xb39960d2, + 0x61d39d13, + 0x8904b499, + 0xd49d28d3, + 0x07b1990a, + 0xd4d54027, + 0xd4d50108, + 0x4307010c, + 0x830bd19d, + 0xe680004d, + 0x0700d44f, + 0xfe477e0b, + 0xb289d381, + 0xc130ab1e, + 0xd38544d4, + 0x1c3cd28d, + 0xc03cd841, + 0x0ad3991b, + 0xdc389099, + 0x43070e34, + 0x4a404a83, + 0xa606b499, + 0x47377647, + 0x99161e00, + 0xb3990ad4, + 0x27448306, + 0x27448611, + 0x99912b10, + 0x033b3a90, + 0xc120b489, + 0x400b44d3, + 0x893ed48d, + 0x3c831ab2, + 0x26d28d20, + 0x811cb489, + 0x24d48dd2, + 0x0322b489, + 0x44530f4c, + 0x37e62158, + 0x1e40d48d, + 0x8d370616, + 0x2cd840d4, + 0xb48910c0, + 0x73410322, + 0x0f4c0341, + 0xd48d4453, + 0x05b49942, + 0xb49949e6, + 0x07d1b107, + 0x33353334, + 0xf5342b43, + 0x00019831, + 0x30d4c1ff, + 0x34f5d281, + 0xff000190, + 0xa340d189, + 0xed80002d, + 0x0001a031, + 0x81d285ff, + 0xc04c83d4, + 0x00f34fe6, + 0xd4d54653, + 0xea5e010c, + 0xe631e000, + 0xc0b1c100, + 0x891ab289, + 0x1cf81cb3, + 0x8100920e, + 0x83a307d4, + 0x4653c04c, + 0xd4d59207, + 0xa45b010c, + 0x1cd8945b, + 0x18d86a0c, + 0x3ec4a921, + 0x0724020d, + 0xff4ea724, + 0x43a9ffff, + 0xb4890d40, + 0x0743221c, + 0x07031e03, + 0x07920704, + 0x1e14d8a0, + 0xffffcea7, + 0x42c1a9ff, + 0xbe09070d, + 0xa900994d, + 0x070d44c1, + 0xbe0a0790, + 0x07009941, + 0x83d481a0, + 0xa3344741, + 0x073f0b31, + 0x03938b24, + 0x5b490721, + 0xd6a38b42, + 0x3b912744, + 0x5b4a0792, + 0x2744d642, + 0x81a23ba1, + 0x072907d4, + 0xe321e33a, + 0x07413831, + 0x8933e33a, + 0x4d0028d4, + 0x4d240121, + 0x21e31121, + 0xd48131e3, + 0x8d104c58, + 0xd28d26d3, + 0x8d071e24, + 0xd38d26d2, + 0x07dc8124, + 0x834c070b, + 0x4453304c, + 0x33333407, + 0x342b4447, + 0x44334307, + 0xd4d5432b, + 0x967e0108, + 0x85c0abfc, + 0x38b2c1dc, + 0x99acd2c5, + 0xd39dbab3, + 0xb8b49962, + 0x9d28d389, + 0x3140b6d4, + 0x8d2eb189, + 0x091eb0d1, + 0xd48d4127, + 0x2eb38db0, + 0x9d14b299, + 0xb399b4d2, + 0xb5d39d15, + 0xc118b299, + 0xb189a8b4, + 0x63d29d2c, + 0x1534b3c1, + 0x07d335d4, + 0x8d3d074b, + 0x3c0308d1, + 0x684c03b8, + 0x01102c27, + 0x05440341, + 0xa8340331, + 0x5cb2c1f2, + 0xd2c50027, + 0x60b3c1f8, + 0xc1fcd3c5, + 0xd4d564b4, + 0xb1c10100, + 0x3df49330, + 0xd1d504ca, + 0xb2890104, + 0x6844c1bc, + 0xd5c0bb99, + 0xad0114d4, + 0xbd0138d2, + 0x1e013adb, + 0x1e072707, + 0x43062703, + 0x93f88ef0, + 0x04e777f3, + 0xc59031c5, + 0x04e68c30, + 0x349d4127, + 0x4efe0b99, + 0xfdf393fe, + 0x349904c9, + 0x1f41c454, + 0x66053499, + 0xa7312747, + 0xffffff4e, + 0x0cb543bd, + 0x0013fdbe, + 0xf4933027, + 0x9d04e740, + 0xfe8e9943, + 0xffff4ea7, + 0xb544b9ff, + 0x9346060c, + 0x04e72bf4, + 0x04984499, + 0x13d89e42, + 0x9efe0b00, + 0x4e0012a3, + 0x1f08befe, + 0x1299be03, + 0x148fbe00, + 0x9efe0e00, + 0x63001432, + 0xba4d27f0, + 0x27f40d0b, + 0xf42d284c, + 0xf0011007, + 0xe09ef043, + 0xf94effed, + 0xffff3ea7, + 0xfd34b9fe, + 0xcf48fc1f, + 0x09349900, + 0x34874383, + 0x432b4433, + 0x004d4bf9, + 0xbfe6ff00, + 0x4ea700ba, + 0xb9ffffff, + 0xb90a2a43, + 0x070a2b42, + 0x07322bc4, + 0x27df6bd3, + 0xb1f99300, + 0xfa9304e6, + 0x5e04c948, + 0x23f90087, + 0xff000a20, + 0x0a1824f9, + 0x3d1bff00, + 0x4f4b4d1b, + 0x3c5c2103, + 0x27412c80, + 0x00051e20, + 0xb92127f1, + 0xa60cb5c4, + 0x2bc3b945, + 0x9a94990a, + 0x2027430a, + 0x2605a499, + 0x29c4b947, + 0x28c3b90a, + 0xdc4d1b0a, + 0x070a804c, + 0x4b432b4d, + 0x4941c84f, + 0x4d072d06, + 0x070f4c83, + 0x33033304, + 0x23040b45, + 0xfff5d40e, + 0x04610371, + 0x0465430b, + 0x04754027, + 0xb9ff327e, + 0x070a2bc4, + 0x2331033d, + 0xbdd30741, + 0x6b0a2bc4, + 0xb90127df, + 0xce0a2ac4, + 0x1b070b4d, + 0x11032027, + 0x00278a1e, + 0xfd4ef98e, + 0xa7ff1d7e, + 0xffffffde, + 0xd4b92c1e, + 0x41230a2a, + 0x0a2ad4bd, + 0x0a2ad0b9, + 0x070f0c83, + 0x33453340, + 0x23040b03, + 0xfff5d40e, + 0xb9fede7e, + 0x230a2bd4, + 0x2bd4bd41, + 0x2bd4b90a, + 0xcf4fd60a, + 0x1ea72027, + 0x27ffffff, + 0x2a14b938, + 0x1824fd0a, + 0xfdff000a, + 0x000a2024, + 0x582103ff, + 0x2914bdf3, + 0x2814bd0a, + 0x4efd8e0a, + 0x12ecbefe, + 0xa7202700, + 0xffffff1e, + 0x40273827, + 0x0a1824fd, + 0x2103ff00, + 0x14bdf398, + 0x14bd0a2b, + 0x14bd0a28, + 0xfe8e0a2a, + 0xdacaf493, + 0x0b400104, + 0x99fd4efe, + 0x2007090d, + 0xe0273d07, + 0x0a1e3103, + 0x030c2499, + 0x03144e21, + 0x8ef3a0e1, + 0x0cec03fd, + 0x30074d07, + 0x3e0b4123, + 0x9d0cec23, + 0x091e0904, + 0xe1033439, + 0x3103341d, + 0xca090499, + 0xfd8ef3e4, + 0xda82f493, + 0x27202704, + 0x9d30a710, + 0x429d0b42, + 0x0a429d09, + 0x439d2407, + 0x5041d508, + 0xd541150a, + 0x030a5441, + 0x3c272c2c, + 0x1d402719, + 0x682c0324, + 0xfe0bf3b0, + 0xf493fc4e, + 0xd104c79c, + 0x2703f84d, + 0x223c2710, + 0x213b2127, + 0x4d8b4207, + 0xf4934d96, + 0x0104d818, + 0x0731074e, + 0x33463341, + 0x0b340b33, + 0x983d033e, + 0x124c272a, + 0x04030c01, + 0x34033c05, + 0x3107f4a8, + 0x46334107, + 0x340b3333, + 0x34d13e0b, + 0x2dab2aa8, + 0xfc0e4ee3, + 0xa834d501, + 0x45f4932a, + 0x42d504c7, + 0xfc8e03f8, + 0xf3f01103, + 0xa7fc8ea8, + 0xfffe6f3e, + 0x23221c27, + 0x03340134, + 0x004ed834, + 0x21130300, + 0x7124e632, + 0x1424ce04, + 0x24e63201, + 0x24ce0481, + 0x183c030b, + 0x27ddf1f0, + 0x27fe0b00, + 0xabfe0b01, + 0x9b1fab0f, + 0x53010710, + 0x47010b01, + 0x000e0300, + 0xfe0b0100, + 0x0c41fc4e, + 0x2c07dc07, + 0x8318dc53, + 0xfe00002e, + 0x03112c53, + 0x302103d1, + 0x1e0127d2, + 0x14012707, + 0xa7002722, + 0xffffff3e, + 0x0d3e34a9, + 0xef6be007, + 0x34a94546, + 0x01270d40, + 0x00274496, + 0x4fff4ea7, + 0x7443c1fd, + 0x14c54127, + 0xdc0f6bc0, + 0x0000003f, + 0xe4b67820, + 0x27730fc6, + 0x4df19304, + 0x0c1e00c4, + 0x0706e496, + 0xf1930427, + 0x9e00c46e, + 0x060069de, + 0x93042706, + 0x00c4bef1, + 0x4227f21e, + 0x26c014c5, + 0xd0d214e7, + 0x3ea71322, + 0x27ffffff, + 0x4432ad44, + 0xc014c50d, + 0x0d423dad, + 0x2ea706c6, + 0x27ffffff, + 0xad482731, + 0xc50d4423, + 0x23adc014, + 0x14c10d42, + 0x0c4cd8c0, + 0x1a14891e, + 0x14894230, + 0x1342d41c, + 0xf1930427, + 0x1e00c4bb, + 0xc0ccdca3, + 0xa0efd694, + 0xfc8ec71e, + 0x4d27f063, + 0x03410bb9, + 0x4c27f40d, + 0x07f42d48, + 0x003da310, + 0x45f00110, + 0x9ef04313, + 0x4effe9e8, + 0x07f063fb, + 0x07b107d0, + 0xbdf1930f, + 0x87be03b0, + 0x0fe6ffe9, + 0xf40900ed, + 0x0bb94dc4, + 0xe4f42975, + 0x00d5484c, + 0xc004d499, + 0xc110104c, + 0xf093acd1, + 0x0303b098, + 0xedbef41c, + 0xf493fff1, + 0x0104d86c, + 0x85f39344, + 0x498603b0, + 0x80004dd8, + 0x18348913, + 0x80004d83, + 0x062747d6, + 0xc475f193, + 0xc4101e00, + 0x34891141, + 0x27414018, + 0x9af19306, + 0xe79e00c4, + 0x33890068, + 0x31f49318, + 0x0b0704d8, + 0x93100c03, + 0x03b047f1, + 0x05482c27, + 0x1cc8be43, + 0x1e012703, + 0xbc4dc473, + 0xfc93620b, + 0x8903b030, + 0xf3291ac4, + 0x4e204c03, + 0x93062734, + 0x00c49bf1, + 0xc489c11e, + 0x3a42c418, + 0x0130b4a9, + 0x06274566, + 0xc4bcf193, + 0x07ac1e00, + 0x180d030b, + 0x271c0701, + 0x83be202c, + 0xd499031c, + 0x2a44d804, + 0xd616d499, + 0x931c0748, + 0x03b1d7f0, + 0xbe202c27, + 0x1e031c6a, + 0x93062715, + 0x00c4dbf1, + 0x27ff795e, + 0x10f19306, + 0x6f5e00c5, + 0x430027ff, + 0x4efb8ef0, + 0x998107f5, + 0xf2630411, + 0xf1651483, + 0xf393f261, + 0x0704d790, + 0x03900750, + 0x3101105c, + 0x32992826, + 0xc82f4b08, + 0x32071820, + 0x34334287, + 0x320b342b, + 0x3f033333, + 0x000593e0, + 0x162c3499, + 0x55302746, + 0x89f293f3, + 0x3c2704d7, + 0xc0591e19, + 0x8499f011, + 0x03418616, + 0x4507443c, + 0x01121c27, + 0x05340330, + 0xa8440340, + 0x874207f1, + 0x2b443332, + 0x93420b43, + 0x04d72ff3, + 0x433320a7, + 0x0b08329d, + 0x2b439943, + 0x31030507, + 0x072b439d, + 0xfd7a7e18, + 0x0d030907, + 0xf1930118, + 0x2703b11c, + 0xafbe202c, + 0x7127031b, + 0x1904db5e, + 0x682c0324, + 0x04bd4ff6, + 0x3907f151, + 0x41876107, + 0x642b6433, + 0x6333610b, + 0x93e06f03, + 0x26070005, + 0x03442c03, + 0x7027103c, + 0xf385f275, + 0x0703b85e, + 0x7e180705, + 0x8499fd2c, + 0x104ce004, + 0xf4930351, + 0x0104d6bc, + 0x013d4043, + 0x213d2080, + 0x023d0080, + 0x223de480, + 0x99020a80, + 0x8c890680, + 0x07f01524, + 0x0305461c, + 0x531c07c1, + 0x89c12311, + 0x74d64097, + 0x0a1e4027, + 0x534494c1, + 0xc3418345, + 0x254f6b41, + 0x228e89f4, + 0x4e0744d6, + 0x4707051e, + 0x9ac14433, + 0x07240744, + 0x831a0741, + 0x0f2c0313, + 0x450f4c03, + 0x532453f1, + 0x07164644, + 0x032703d4, + 0xe327e3d8, + 0x000d27d7, + 0x07081e10, + 0x27d103d4, + 0x4307800c, + 0x3cd84283, + 0x45060f20, + 0x02901d27, + 0x1d27131e, + 0x0d1e01e0, + 0x1d274506, + 0x051e0200, + 0x01801d27, + 0x31833a07, + 0x35c6f335, + 0x4c834107, + 0x0344e67f, + 0x142b801c, + 0x3d9b3207, + 0x01233433, + 0x408b4307, + 0x44c60103, + 0x342b300b, + 0x029b0107, + 0x20471d07, + 0x42071103, + 0x4c831153, + 0xe611237f, + 0x802c0344, + 0x4147242b, + 0x409b4d1b, + 0x0c830407, + 0x0304e67f, + 0x402b804c, + 0xb19bb207, + 0x0b0fec03, + 0x07b40bb3, + 0x1144534e, + 0x23f405f0, + 0x05260fec, + 0x34072b07, + 0x8100da5e, + 0xc04c5c94, + 0x30272027, + 0x0700ce5e, + 0x03f121de, + 0xd6d173d1, + 0x1e2d0714, + 0x42928906, + 0x93892433, + 0xe3a81828, + 0xac38303c, + 0xa337e310, + 0x034c0731, + 0x41417341, + 0x0f2c03f0, + 0x530f4c03, + 0x46445324, + 0x03e40706, + 0xe3e80327, + 0x27e7e327, + 0x1e10000d, + 0x03e40708, + 0x800c27e1, + 0x42834307, + 0x0f203cd8, + 0x1d274506, + 0x131e0290, + 0x01e01d27, + 0x45060d1e, + 0x02001d27, + 0x1d27051e, + 0xf3310180, + 0x410735c6, + 0xe67f4c83, + 0x801c0344, + 0x3207142b, + 0x34333e9b, + 0x43070123, + 0x0103408b, + 0x300b44c6, + 0x0107342b, + 0x1e07029b, + 0x11032047, + 0x11534207, + 0x237f4c83, + 0x0344e611, + 0x242b802c, + 0x4e1b4147, + 0x0407409b, + 0xe67f0c83, + 0x804c0304, + 0x219b402b, + 0x3d07230b, + 0x0b0f3c03, + 0x01345324, + 0x274722f4, + 0x89121e30, + 0x10274294, + 0x11273402, + 0x41c34107, + 0x3f6b3407, + 0xea3494c1, + 0xc1013b4b, + 0x42ea3894, + 0xf0210134, + 0x01370fe6, + 0x01333ff6, + 0xc401275e, + 0x80891b31, + 0x24818922, + 0xc1fae27e, + 0x40fa4494, + 0x40270114, + 0x94c57127, + 0x01155e48, + 0x84899781, + 0x83a7071c, + 0x808910ac, + 0x07a5061a, + 0x1ed00734, + 0x07300705, + 0xc084c1d4, + 0xcf0e4cf8, + 0x0c4cf800, + 0x48d800a4, + 0xa7a88651, + 0xffffff4e, + 0x0d4043a9, + 0x221c8489, + 0x1e230743, + 0xa7240703, + 0xffffff4e, + 0x0d3e43a9, + 0x1e1a8489, + 0xff4ea721, + 0x43a9ffff, + 0x84890d3e, + 0x0743221a, + 0x07031e23, + 0xff4ea724, + 0x43a9ffff, + 0x84890d40, + 0x0743221c, + 0x07031e03, + 0x1eb20704, + 0xff4ea726, + 0x4ca9ffff, + 0x41a90d42, + 0x4c070d44, + 0xc107a4d6, + 0x03071407, + 0x008f48be, + 0x1c07b007, + 0x3ebe0d07, + 0x4707008f, + 0x34474183, + 0x3f0b31a3, + 0x14072b07, + 0x1103238b, + 0x415b4207, + 0x44d6038b, + 0x213b2127, + 0x415b4007, + 0x012746f6, + 0x101e013b, + 0x4c834707, + 0x074653c0, + 0x5b23070d, + 0x07245b04, + 0xe3d00732, + 0xd8d1e331, + 0xa5060d71, + 0x33e33207, + 0xd007051e, + 0x9489d3e3, + 0x214d0028, + 0x214d2401, + 0xe331e311, + 0x509489d1, + 0x9489432a, + 0x0ad4c252, + 0xad7e0507, + 0x1e7027fa, + 0xa7712759, + 0x69f19340, + 0xf26104d3, + 0xe608149d, + 0x9df35124, + 0x83c10813, + 0xb484c1b0, + 0x65289289, + 0x83947593, + 0x0680002d, + 0x40948926, + 0x94c14576, + 0x204ca344, + 0x714494c5, + 0x27f481f3, + 0x4001122c, + 0x30054403, + 0xf2a83403, + 0x40273127, + 0x9d2c639d, + 0x639d2964, + 0xf57ff62b, + 0x15f29300, + 0x240104d3, + 0x80004dfc, + 0xf39300e1, + 0xd104c058, + 0x2703f832, + 0x223c2710, + 0xd13bd127, + 0x428b4d07, + 0x41074a46, + 0x13334633, + 0xf493140b, + 0x0104d0cc, + 0x981d0344, + 0x07140b2a, + 0x482c2705, + 0x031781be, + 0xc022f093, + 0xf804d104, + 0xd54deb03, + 0x5e03f804, + 0x1103fbf7, + 0x07c2f3f0, + 0x7e190708, + 0x0ff6fa0f, + 0x8d5efbe7, + 0xfdf09300, + 0x04d104bf, + 0xb12703f8, + 0xf193bc3b, + 0x8b04d084, + 0xc613014b, + 0x074c074a, + 0x334633dc, + 0x03d40bd3, + 0x0b2a98dd, + 0x7e0d07d3, + 0x07f6f89f, + 0x07482c27, + 0xbe05071d, + 0x93031722, + 0x04bfc3f2, + 0x03f824d1, + 0x24d54beb, + 0x985e03f8, + 0xc0c103fb, + 0x1e1122cc, + 0x7e0507ad, + 0x0fe6f873, + 0x0507fb87, + 0x07f7ff7e, + 0x7e080719, + 0x0176f99f, + 0xaabea103, + 0xa2c0ffb2, + 0x51111e18, + 0x554103f4, + 0x34f3f8f4, + 0x1e7027fb, + 0x27a02708, + 0xff775ec0, + 0xf2430707, + 0xf74ef58e, + 0xd007a007, + 0xdc72f893, + 0x1e702704, + 0x03db1142, + 0xe6d02171, + 0x078201ba, + 0x03ca0790, + 0x059e389f, + 0xcec00b00, + 0x19070bb2, + 0x5bbe0c07, + 0x07860056, + 0x0c071b07, + 0xffdd76be, + 0x0907d411, + 0xd2118405, + 0x1c07d421, + 0x60be8415, + 0xd8030056, + 0xa4018803, + 0x93bb74ca, + 0x04d1c7fd, + 0x9909d299, + 0x24ce0ad4, + 0xd1f3931d, + 0x4c2703aa, + 0x05212313, + 0x27030734, + 0xbe321518, + 0x99ffdd37, + 0xd49d09d4, + 0x4ef78e0a, + 0x090499f9, + 0x400bc007, + 0x070b4b99, + 0x333b874b, + 0x0b432b44, + 0x0743334b, + 0x99d00bd4, + 0x94072dd3, + 0xc1449c03, + 0x36e68cda, + 0x0b54d4c1, + 0x0c4ce309, + 0x7e54d4c5, + 0x4027f718, + 0x1e2dd49d, + 0x030a0712, + 0x7e011c0d, + 0x0c07ff3a, + 0xdfbe090b, + 0xa946ffe2, + 0xa1193b07, + 0xf0934b87, + 0x3304be94, + 0xd1342b34, + 0x27042c02, + 0x3b3b0b41, + 0x3342cb41, + 0xd53c0b33, + 0x27042c04, + 0x8c34c540, + 0x0109c499, + 0x9d4123c3, + 0x31c009c4, + 0x873b072b, + 0x2b34334b, + 0x333b0b34, + 0x993c0b33, + 0x46262a34, + 0x272e3299, + 0x3bc31141, + 0x1534ab42, + 0x99091ec3, + 0x41230bc4, + 0x070bc49d, + 0x333b874b, + 0x0b432b44, + 0x0b43334b, + 0x9d30274c, + 0xc4d12c43, + 0x41030a54, + 0x0a54c4d5, + 0xfa4ef98e, + 0x0be60f6b, + 0xd0c6f393, + 0xc0340104, + 0x31993441, + 0x03030709, + 0x102b0c0c, + 0x93ed1f03, + 0x191e0005, + 0x01030319, + 0x23874307, + 0x422b4433, + 0x4333430b, + 0x43fd3127, + 0x0005940d, + 0x061ef128, + 0x1efef27e, + 0x89fd9306, + 0xd49904d0, + 0x360d0709, + 0x93c02742, + 0x04ce5ffa, + 0xbdc6fb93, + 0xf8b4d104, + 0x3bd12703, + 0x014d8bdc, + 0x074806a0, + 0x333c074c, + 0x0b433336, + 0x984d0343, + 0xbe040b2a, + 0xd1ffe1e2, + 0xeb03f8b4, + 0xf8b4d54d, + 0xc4c10303, + 0x93cf22cc, + 0x04d06bfc, + 0xc419d027, + 0x0d074786, + 0x04334d87, + 0x0d0b042b, + 0x0f030333, + 0x00059424, + 0xffe1b1be, + 0xc41d4027, + 0xcc03d103, + 0x19dcc468, + 0x933027da, + 0x04d00ff4, + 0xfa8e4305, + 0x4ea7f54e, + 0x93ffffff, + 0x04cffff2, + 0x43d12701, + 0xa0070620, + 0x09c13123, + 0x630707ac, + 0x2043d5f0, + 0x602c0306, + 0x0d23b027, + 0x1c278021, + 0x91230119, + 0x682c0394, + 0xb103342e, + 0x3b07f190, + 0x34334b87, + 0x3b0b342b, + 0x34f13333, + 0x00059434, + 0x0e0c4cdc, + 0x43079361, + 0x240c4c83, + 0x6532a348, + 0x874b0793, + 0x2b44333b, + 0x334b0b43, + 0xe04f0343, + 0xc1000593, + 0x93615442, + 0xab444c03, + 0x07936532, + 0x27380339, + 0x3101122c, + 0x41053403, + 0xf2a84403, + 0x3b874b07, + 0x432b4433, + 0xa3994b0b, + 0x03433310, + 0x0593e04f, + 0x9d315300, + 0xa3992e43, + 0x2a439d05, + 0x24209489, + 0x1e202741, + 0x13a29904, + 0x3b874b07, + 0x432b4433, + 0x43334b0b, + 0x940d42fd, + 0xad990005, + 0x60a48962, + 0x585ca0c1, + 0x270027d4, + 0x07031ec0, + 0x16a499c4, + 0x29364f76, + 0x3b874b07, + 0x432b4433, + 0x43334b0b, + 0x946c49f5, + 0xf1930005, + 0x1904bc60, + 0x2c12d193, + 0x3b412704, + 0xd542ab43, + 0x07042c14, + 0x333b874b, + 0x0b432b44, + 0x04a1994b, + 0x4f034333, + 0x000593e0, + 0xc128419d, + 0x40c534a3, + 0x3c43c538, + 0x43c530a7, + 0x04a49940, + 0xe35644d8, + 0xc4521ed2, + 0x4b072a71, + 0x44333b87, + 0x4b0b432b, + 0x49f54333, + 0x0005946c, + 0xf2939419, + 0x0704bc04, + 0x2c23d117, + 0x07143b04, + 0xd543ab41, + 0x07042c24, + 0x334b873b, + 0x0b342b34, + 0x0333333b, + 0x0593e03f, + 0x3834c100, + 0x30c54012, + 0x34a4c138, + 0x274034c5, + 0x28349d40, + 0x3b874b07, + 0x432b4433, + 0x43334b0b, + 0xf893e027, + 0x2704ce6c, + 0x27d49651, + 0x836d0750, + 0x104ced68, + 0x1e000594, + 0xece0f955, + 0x27000593, + 0x872007c0, + 0x2b243340, + 0x33200b24, + 0xe02f0323, + 0x99000593, + 0x46662a24, + 0xc12e2499, + 0x143b3ca3, + 0x1486138b, + 0x2c9dc127, + 0x2484012a, + 0x05112741, + 0x874007f1, + 0x2b443330, + 0x01400b43, + 0x034333f3, + 0x0593e04f, + 0x29439d00, + 0x032d469d, + 0x098499e1, + 0x1127f505, + 0x01a3e4da, + 0x2f41c084, + 0xa2c18e11, + 0x274e073c, + 0x1e42eb30, + 0x07418b03, + 0x23140703, + 0x030f6b11, + 0x93429631, + 0x04cdd7f3, + 0x8b0b3499, + 0x9d402b2e, + 0x32150b34, + 0x4027061e, + 0x070b849d, + 0x334b873b, + 0x0b342b34, + 0x0333333b, + 0x0593e03f, + 0x2b349900, + 0x349d4123, + 0x24d21c2b, + 0x9d412771, + 0xcb072934, + 0xc4334b87, + 0xcb0bc42b, + 0xcf03c333, + 0x000593e0, + 0x9954c4c1, + 0x84072dc3, + 0x00008e83, + 0xc548cb01, + 0xfd9354c4, + 0x9604cd78, + 0x50d4d139, + 0x030d070a, + 0x50d4d541, + 0x7e1b070a, + 0xd4d1f2a1, + 0x61270a50, + 0x9934c4c5, + 0xccc109d0, + 0x07100738, + 0x03e027db, + 0xe37f1e11, + 0xc4c50c4c, + 0x09d49954, + 0x46166027, + 0x4e589461, + 0x27010000, + 0x2cc49d41, + 0xcb07201e, + 0xc4334b87, + 0xcb0bc42b, + 0x0c07c333, + 0x94240f03, + 0xc97e0005, + 0xfd4027f2, + 0x05940cc4, + 0x873b0700, + 0x2b34334b, + 0x333b0b34, + 0x93402733, + 0x04ccfff0, + 0x34fd1b07, + 0x0005940d, + 0x1ef2307e, + 0xece4f950, + 0x07000593, + 0x33348724, + 0x0b232b24, + 0x03233324, + 0x0593e02f, + 0x29249900, + 0x24c14596, + 0x034c3238, + 0xdaf1f0e1, + 0xccc6f493, + 0x07300704, + 0x0731032e, + 0xec2f0314, + 0x9d000593, + 0x0b1e0943, + 0xe1032419, + 0x21032d1d, + 0x1499d407, + 0xf1e4ca09, + 0x4b873b07, + 0x342b3433, + 0x33333b0b, + 0x93e03f03, + 0x34990005, + 0x89f1932a, + 0x449604cc, + 0xa4996826, + 0xc0479616, + 0x14991871, + 0x9d41030b, + 0x65f60b14, + 0x112e3499, + 0x3b312712, + 0x1532ab34, + 0x938d0613, + 0x04cc5ff4, + 0x070c4399, + 0x87430704, + 0x2b443323, + 0x33430b42, + 0xc1400b43, + 0x10275443, + 0x48c583ab, + 0xf91d1e54, + 0x0593ec13, + 0x07110300, + 0x33238743, + 0x0b422b44, + 0x27433343, + 0x0943fd31, + 0x99000594, + 0x14da0904, + 0xb9a499df, + 0xf0934a06, + 0x9904cc14, + 0x48c60904, + 0x93eb43f9, + 0x43070005, + 0x44332387, + 0x430b422b, + 0x44f94333, + 0x0005940b, + 0x547e4596, + 0x7e061efa, + 0x061efa4f, + 0xcbe6fd93, + 0x09d49904, + 0x49860d07, + 0x93eb44f9, + 0x24070005, + 0x24333487, + 0x240b232b, + 0x2f032333, + 0x000593e0, + 0xe6292499, + 0x2b249945, + 0x1ecd4fc6, + 0xfa197e06, + 0xfd930b1e, + 0x9304cbb0, + 0x04b8fbfa, + 0x2609dc99, + 0xcb51becc, + 0x120ccaff, + 0x990bd399, + 0x434a37a4, + 0x9909d399, + 0x34c235a4, + 0x09d49928, + 0xf908d299, + 0x0593eb44, + 0x072f4b00, + 0x33348714, + 0x0b132b14, + 0x330d0714, + 0xf9242e13, + 0x05940b14, + 0xae4fc600, + 0xcb62f493, + 0x09449904, + 0x6bf64c36, + 0x4ed89461, + 0x36010000, + 0x4b870b07, + 0x042b0433, + 0x03330b0b, + 0xcf03c007, + 0x000593e0, + 0xc62cc499, + 0x54c4c147, + 0x94240f03, + 0x4ea30005, + 0xe3014000, + 0x54c4c544, + 0xffdcb1be, + 0xc49d4027, + 0x8ef0432c, + 0x63fc4ef5, + 0x3dfe93f1, + 0x002704cb, + 0x1c272027, + 0x27e41919, + 0x03303b31, + 0x010368ec, + 0x23ab4486, + 0xfc93f170, + 0x9904caf4, + 0xc39909c1, + 0x93c4110b, + 0x00b8a6f0, + 0x005853be, + 0x3e1ed027, + 0x93ecd2f9, + 0xd1030005, + 0x42873207, + 0x342b3433, + 0x3333320b, + 0x93e03f03, + 0x3e990005, + 0x2934992b, + 0x3e99fe05, + 0x99fe152c, + 0xfe252d3e, + 0x352a3e99, + 0x2e3e99fe, + 0x33c1fe45, + 0x5812be38, + 0x09c49900, + 0xf0931d07, + 0xda00b8a0, + 0xf143b7d4, + 0xfb4efc8e, + 0x07b90499, + 0x07b107d0, + 0x274616c2, + 0xb9049d41, + 0xb8eef093, + 0xb7c5be00, + 0xc1c5e6ff, + 0x3b874cd2, + 0x320b4c87, + 0x340541a3, + 0xf74efb8e, + 0xa30d0499, + 0x07b007f0, + 0x07c20781, + 0x2744d693, + 0xc17e1ea0, + 0xac03440a, + 0x07761e48, + 0x0737072f, + 0xbe1c070b, + 0x010308c1, + 0x07f411f2, + 0x2b242b39, + 0x07f2053c, + 0x073202d3, + 0x1ead46d2, + 0x23110337, + 0x03f3f0d1, + 0x2419321e, + 0x84ce2103, + 0x0b2a07f1, + 0x07c10721, + 0x030a1e3d, + 0xf0d123c1, + 0x081e03f3, + 0x21032419, + 0xcef148ce, + 0x2c070c1c, + 0x212b0b07, + 0x07ff617e, + 0x07d4d61c, + 0x071a1ec1, + 0x07210b2a, + 0x07c41e3d, + 0x072d0710, + 0xff487e0b, + 0x051ecd0b, + 0x74037f07, + 0x8385c9ca, + 0xa7f78ef0, + 0xffffff4e, + 0x0cb543b9, + 0xd46ef493, + 0x98439d04, + 0x011a32e4, + 0xefff3ea7, + 0xd54027fd, + 0xd50e1034, + 0xa70e1434, + 0xfd7fff2e, + 0x4ee32411, + 0x15020000, + 0xd5432724, + 0xa7024434, + 0xfbffff2e, + 0x063834d1, + 0x24314566, + 0x00004fd8, + 0xa7f20100, + 0xfbffff1e, + 0x12d14027, + 0x14d50218, + 0x13d10218, + 0xf4930210, + 0xc504d418, + 0x20289443, + 0x0b1e1027, + 0x021811d1, + 0xffff1f83, + 0x3ea70fff, + 0x27fdefff, + 0x4034d543, + 0x4034c102, + 0xa7fb48dc, + 0xfdefff2e, + 0xdc4024c1, + 0xf908004d, + 0x24d54427, + 0x24d50240, + 0x30270244, + 0x063823d5, + 0xebbf2ea7, + 0x272305fd, + 0x0400004f, + 0x9b241508, + 0xf0930ef3, + 0xc104d3c0, + 0x03998004, + 0xc5412b9a, + 0x18468004, + 0xffff4ea7, + 0x2a44b9ff, + 0x83432b0a, + 0x43330f4c, + 0x4301400b, + 0x312b4211, + 0x4115120b, + 0x3a1e4305, + 0xffff2ea7, + 0x2a24b9ff, + 0x2b3a060a, + 0x0f4c8343, + 0x44f14333, + 0x00059e98, + 0x43074836, + 0x049d4123, + 0xbd41279a, + 0x99063524, + 0x40270f23, + 0x270ef49b, + 0xf5338741, + 0x02b04034, + 0xa73127ff, + 0xffffff4e, + 0x0cb543bd, + 0xfe4efe0b, + 0xffff0ea7, + 0xb504b9ff, + 0x6541c40c, + 0xd33afe93, + 0x90e4c104, + 0x03b945b6, + 0x04b90cb6, + 0x43ce0cb7, + 0xbf3ea750, + 0x1027fdeb, + 0x4f273105, + 0x08040000, + 0x42273415, + 0x0cb504bd, + 0xc10ef19b, + 0xe4c18ce2, + 0xff3ea794, + 0x32d5fbff, + 0x48a30214, + 0x021034d5, + 0x7fff2ea7, + 0xe32421fd, + 0x0200004e, + 0x23112425, + 0x04bd4027, + 0x3ea30cb4, + 0x9d020000, + 0x231599e1, + 0xfe4efe8e, + 0x93fe5a7e, + 0x04d2cff4, + 0x30272027, + 0xc59a439d, + 0x42c59442, + 0x8442c580, + 0x3ea7fe8e, + 0x27ffffff, + 0x271c2740, + 0x0cb734bd, + 0x0cb634bd, + 0xf3932027, + 0x0704d2a4, + 0x23320541, + 0xb8340311, + 0xa73027f4, + 0xffffff4e, + 0xd28ef293, + 0xb543bd04, + 0x8421c50c, + 0x0b8021c5, + 0xff3ea7fe, + 0x4027ffff, + 0x0cb434bd, + 0x0cb734bd, + 0x0cb634bd, + 0xf49b4027, + 0xa7fe0b0e, + 0xffffff3e, + 0x0cb530b9, + 0xf29309e6, + 0xc104d258, + 0x44f69024, + 0x06992499, + 0xb631b948, + 0xb732b90c, + 0xb901200c, + 0x060cb434, + 0x2b410746, + 0x134f6b42, + 0x4910104c, + 0x0bfee55e, + 0xa80499fe, + 0x4ea74626, + 0xc5fff5d7, + 0x41033804, + 0x0b3404c5, + 0xff4ea7fe, + 0x4411feff, + 0xf5e04e23, + 0x3404c5ff, + 0x04c54823, + 0x27fe0b38, + 0x0ef39b30, + 0xf49b4027, + 0x2bf49b2a, + 0x9b22f49b, + 0x039d23f4, + 0x4c049da9, + 0xc55003c5, + 0x03c55403, + 0x4403c590, + 0xc54803c5, + 0x03c5a003, + 0x4003c53c, + 0x9d4d039d, + 0x039d8b03, + 0x8a039d8c, + 0x3ea7fe0b, + 0x27fdeaff, + 0x27340540, + 0x0400004f, + 0x2734150c, + 0x0ef49b40, + 0x9b2bf29b, + 0xf29b22f2, + 0x23f29b2a, + 0x9b1c1ca3, + 0xfe0b20f1, + 0xfc4efe0b, + 0xf18af293, + 0x502ec103, + 0x334023c1, + 0x2b4307e3, + 0x0740084e, + 0x312d99e3, + 0x07302499, + 0x074d1bc2, + 0x1e2f6b24, + 0x41043117, + 0x0b210703, + 0x1b433343, + 0x4c2f6b4e, + 0x01011140, + 0x07fc8e00, + 0x07418342, + 0x33053304, + 0x07042b43, + 0x8c0f0312, + 0x030004be, + 0xd2d2ce11, + 0xc1d0c0c1, + 0xfc8ed4c1, + 0xf12ef393, + 0xaa349903, + 0x42230f6b, + 0x6bb0309d, + 0x0f4c144f, + 0x30c50027, + 0x93fe0bbc, + 0x03f113f4, + 0x0bcc40c1, + 0x28fb4efe, + 0x2720010d, + 0x1e20000d, + 0x03000c05, + 0x73d00707, + 0x23bd07d3, + 0xf1f493b8, + 0x0b0703f0, + 0x41c10fab, + 0x070833b4, + 0x1ee027c4, + 0x2fe4c47c, + 0x3f9b19d6, + 0x27b1c823, + 0xabbcc499, + 0x2df49b40, + 0x9b2d4f9b, + 0xe32b23ef, + 0xe403e373, + 0xc1214f9b, + 0x438bbcc3, + 0x11274486, + 0x0427ed3a, + 0x2f9b641e, + 0xbcc3c124, + 0xd8182c53, + 0x21c40d32, + 0x9b12440a, + 0x4827244f, + 0x3cd8151e, + 0x42071610, + 0xd4804c23, + 0x12c40e44, + 0x244f9b0b, + 0xf49b4627, + 0x18211e25, + 0x17a6403c, + 0x27244f9b, + 0x25f49b48, + 0x102724c6, + 0x1214051e, + 0xe1031103, + 0x2783edda, + 0x9b131e03, + 0xf293214f, + 0xc103f058, + 0x0027bc23, + 0x24c5438b, + 0x49f493cc, + 0x41c503f0, + 0x4efb8eb4, + 0x07d007fb, + 0x272f6bb1, + 0x0000ff4f, + 0x21f49b40, + 0xfd7e0207, + 0x29fc93fe, + 0x402703f0, + 0xc5c8c4c5, + 0xd726c4c4, + 0x1b070d07, + 0xffb2dfbe, + 0xd8334d07, + 0xdc534f6b, + 0xc4c4c518, + 0xc1c8cdc5, + 0x4dd494c4, + 0x36198000, + 0x000d2746, + 0x27100780, + 0x5735be20, + 0x98c0c500, + 0x80004d27, + 0x8e94c4c5, + 0x93fb4efb, + 0x03efdffb, + 0x998cb399, + 0x0b078ab4, + 0xb49d43ab, + 0x71f4938c, + 0x4c0104d0, + 0x031067be, + 0xd5204f9b, + 0x9b2000c4, + 0xc4d5234f, + 0x4f9b2004, + 0x31f39322, + 0xc4d504d1, + 0x4c272008, + 0x03b20136, + 0x033205b4, + 0x8ef4a834, + 0x93fc4efb, + 0x03ef97fc, + 0x0d274127, + 0xc49d2080, + 0x9e77bea8, + 0x29f493ff, + 0x400504d0, + 0x5a7e0c07, + 0x7e0c07fd, + 0x0c07fd7f, + 0x20271027, + 0xa7fdb57e, + 0xc49d7f4c, + 0xf74c27b0, + 0xc4c53027, + 0xc540a7ac, + 0xc49d9cc3, + 0xbcc3c5aa, + 0xc5c0c3c5, + 0xfc8eb8c3, + 0x93234f9b, + 0x03ef47f3, + 0x34c54123, + 0x4efe0b40, + 0x39f493fe, + 0x43c103ef, + 0x4c429940, + 0x432b4007, + 0x40282452, + 0x031ee027, + 0xf193e207, + 0xc103ef20, + 0x20075013, + 0x33332e2b, + 0x432b4207, + 0xe007404c, + 0x2307e32b, + 0x9d4412c5, + 0xfe8e4e1e, + 0x0399fd4e, + 0x83d0078a, + 0x2734d637, + 0x99fd8e00, + 0x4fa38b04, + 0xffffffa0, + 0x049d43ab, + 0x230f9b8b, + 0x3e40d0c5, + 0xbe0d079f, + 0x99030f42, + 0x00278bd4, + 0x01274618, + 0xfd4efd8e, + 0x9e4af493, + 0x99410103, + 0xd4070442, + 0x4f9be927, + 0x203c2724, + 0x435b322b, + 0x410b4447, + 0x33e33407, + 0x000030f1, + 0x4238ff06, + 0x1e100c53, + 0x070fab03, + 0x0c3c5330, + 0x41273536, + 0x1e05d49d, + 0x06d49924, + 0x3cd047a6, + 0xf29b180c, + 0x53400725, + 0xf84d8341, + 0x0b20071f, + 0x0f2c8314, + 0x1eb4fef0, + 0x25f39b04, + 0x0fff0d83, + 0xfb4efd8e, + 0xffff4ea7, + 0x380cc1ff, + 0x0a2a4bb9, + 0x0027d007, + 0x07009d5e, + 0x31d09943, + 0x070f4c83, + 0x330183e4, + 0x0be33345, + 0x072007e4, + 0xd4ee2330, + 0x2333fff5, + 0x322b3533, + 0x3d0be171, + 0xe481e261, + 0xe1413135, + 0x2107420b, + 0x2c833425, + 0x96312780, + 0x07302724, + 0x38263323, + 0x1e27a311, + 0x101c3815, + 0x0e1e23a3, + 0x04001d38, + 0x061e21a3, + 0x2ca3100c, + 0x33400780, + 0x2b033345, + 0x9d4d0b40, + 0xd1c11442, + 0x45403154, + 0x9dc31941, + 0xd3c11543, + 0x31e12154, + 0x05300be2, + 0xc5421541, + 0xc41954d3, + 0x41030127, + 0xd499c41d, + 0x30d39931, + 0x31034103, + 0x9d31d49d, + 0xd49930d3, + 0x0c42d430, + 0x4307c319, + 0x4cfc4b2b, + 0x8eff5680, + 0x99fa4efb, + 0x03993104, + 0x340bc130, + 0xe407432b, + 0xef6bd107, + 0x411ea027, + 0x32413131, + 0x2333210b, + 0x4d2b4207, + 0x34994128, + 0x204cd814, + 0x14349946, + 0x17104cdc, + 0xb60e44d8, + 0x99d24e15, + 0x4e1b3204, + 0x2f804cd8, + 0x4103b419, + 0x0499b41d, + 0x23ec0730, + 0x9def6b41, + 0xa1273004, + 0x41834e07, + 0x35333407, + 0x342b4333, + 0x07310499, + 0x03300bce, + 0xa9e4cec1, + 0x3441051e, + 0x04c1041e, + 0x5004c554, + 0x3ea7a7e6, + 0x27ffffff, + 0x3534bd41, + 0x0f339906, + 0xf49b4027, + 0x8741270e, + 0x4034f533, + 0x99ff02b0, + 0x02993104, + 0x32039930, + 0x4f6b422b, + 0x3c18342b, + 0x32049d80, + 0xfd4efa8e, + 0xeceaf093, + 0x0d86be03, + 0xe1fd9303, + 0xd1c103ec, + 0x030d0754, + 0x7e133311, + 0x0d07ff35, + 0xf6fe6d7e, + 0xc9f09301, + 0xcc7e03ec, + 0xa4d1c1fa, + 0xecbef093, + 0x0e202703, + 0xfafc5efd, + 0xb007fb4e, + 0xc1070107, + 0x07fd6e7e, + 0x7e1c070b, + 0x0b07ff05, + 0x3b5efb0e, + 0x99f84efe, + 0x1e218904, + 0x94074383, + 0x44879433, + 0x1d31942b, + 0xe30bb907, + 0xbec5b00b, + 0x07d32b58, + 0x07a107c0, + 0x102f6b43, + 0x000001df, + 0x00df2701, + 0x9d010000, + 0xbdc560b2, + 0x0ba3315c, + 0x0e80274d, + 0xa7812743, + 0xfde3ff2e, + 0xa411a301, + 0xb89d2e05, + 0xd0c3c561, + 0x15d4c4c5, + 0x35e0272d, + 0xef3ea72e, + 0x4c27fde3, + 0x1534050f, + 0x61b4993d, + 0x44c63e35, + 0x030c16be, + 0x9989c499, + 0x290788c3, + 0x07582c03, + 0x0341030c, + 0x9d020b31, + 0xc39d89c4, + 0x4ef88e88, + 0x23cf9bfc, + 0xec06f093, + 0x3c01c103, + 0xa2be2027, + 0x4f9b030e, + 0x4e002723, + 0x2701274c, + 0x25f49b48, + 0xfd4efc8e, + 0x0401d007, + 0x2b233f9b, + 0x7240c843, + 0x24090399, + 0x7bf29331, + 0x0d1e0311, + 0xf2533224, + 0x051e03a7, + 0x0211f253, + 0xebc2f493, + 0xaa439d03, + 0x999c42c5, + 0x857e08d0, + 0x0ad099fa, + 0x030cacbe, + 0x0120f09b, + 0x0fd4bed0, + 0xf802c003, + 0xeb9ef393, + 0x8a349903, + 0x41d8d211, + 0x9033c10e, + 0x33334207, + 0x4108432b, + 0xf4932307, + 0xc503eb84, + 0xdd993c42, + 0x9d30270b, + 0x439d8b4d, + 0x230f9b8c, + 0x305efd0e, + 0x93fd8efc, + 0x03eb67f4, + 0x9e4040c1, + 0x4e030ff7, + 0x310499f5, + 0xc1300399, + 0x432b9802, + 0xf0a3c407, + 0xcf6bd007, + 0x8027b207, + 0x50279027, + 0x6ea7a027, + 0xa7fde41f, + 0xfde40f7e, + 0xf115f205, + 0x0700a05e, + 0x07e183ec, + 0x333e074e, + 0x2b353343, + 0x313d0b34, + 0x11344130, + 0x07400bf1, + 0x2b233324, + 0x73270321, + 0x07200223, + 0xd6332120, + 0x2b5407a4, + 0xc11a0752, + 0x120b94d4, + 0x0b6e41ca, + 0xce022b03, + 0x24d6280b, + 0xf3e8241e, + 0xefff3ea7, + 0xfc34c1fd, + 0x4c333327, + 0x1d4c5318, + 0x05ec44c0, + 0x27621560, + 0x05643540, + 0x3572157b, + 0x333e0774, + 0x2be33335, + 0x993d0b3e, + 0x48071430, + 0xab200ca3, + 0x14309d49, + 0x380144d6, + 0x40073911, + 0x45664783, + 0xcca3c407, + 0x1ea10710, + 0x034c071d, + 0x0bc40741, + 0x07cf6bb2, + 0x31d499a1, + 0xff5dc4ee, + 0x1e10cc27, + 0x1ef3e805, + 0xff2ea706, + 0x24c1fdef, + 0xdc3327fc, + 0xeefc6a4d, + 0x0d07f111, + 0x99fccc7e, + 0xd39931d4, + 0x07432b30, + 0x9d2f6b24, + 0xa4d632d2, + 0x3e1e0027, + 0x21832123, + 0x12074207, + 0x15334333, + 0x1d0b142b, + 0x149d4027, + 0x141c9d15, + 0x1a35f401, + 0x18051545, + 0x14251915, + 0xc530d499, + 0x410390d5, + 0xc530d49d, + 0x0d0750d5, + 0x827e3027, + 0x330011fd, + 0x8ef08303, + 0xc1f84ef5, + 0xc007440d, + 0xa2079107, + 0x8027d7e3, + 0xa1be0c07, + 0x0c07030a, + 0x9c7e1d07, + 0x8ac499fe, + 0x4576b007, + 0x8b7e0c07, + 0x964127fb, + 0x22402704, + 0xd68b07b8, + 0xb4f6db4f, + 0x3350cdc1, + 0xbe0c07d3, + 0x0b030bf1, + 0x071b07b0, + 0x0a4ebe0d, + 0x2b490703, + 0x27a4124d, + 0x070907a0, + 0x9ef80e1a, + 0x4e0309c5, + 0xb1f493fa, + 0x439903e9, + 0x3c0ac14c, + 0x274d439d, + 0x9dc00730, + 0xd4074c43, + 0x9940d4c1, + 0x4a1b4cd3, + 0x20273432, + 0x2307400c, + 0x1a070d07, + 0x030c2cbe, + 0x0344b007, + 0xc5234f9b, + 0x391e40d4, + 0x7e230f9b, + 0xd1c1fa37, + 0x7e0d0744, + 0xd499fbcd, + 0x1b41c4aa, + 0xc1234f9b, + 0x432b40d3, + 0x00014f50, + 0x4f9b7000, + 0x004f0323, + 0xc5f00000, + 0x0d0740d4, + 0xe37eb424, + 0xa50fd6fa, + 0xe93efd93, + 0x4dd49903, + 0xe04cd49d, + 0xc4010ab4, + 0xc3991bb2, + 0x8ac4998b, + 0x83203ca3, + 0x0734ab47, + 0x8bc39d0c, + 0x030985be, + 0xfa8e0227, + 0x9daac399, + 0x40274dd4, + 0xd49d0027, + 0xbeb3474c, + 0x9b030ce9, + 0xc07e230f, + 0xbe0b07f9, + 0x99030e08, + 0xd49d4dd4, + 0x9d0bea4c, + 0x24df9b00, + 0xdc534827, + 0x25f49b18, + 0x9b2fb9d0, + 0xf49b243f, + 0x183c5325, + 0xd3ab3833, + 0x1e11bcd0, + 0x27244f9b, + 0x25f39b38, + 0x9b242f9b, + 0x4c5325f3, + 0x104c3318, + 0xffff2ee3, + 0xab42abff, + 0x9d4027d4, + 0x4d078bc4, + 0x4fd44123, + 0x0fffffff, + 0x234f9b2a, + 0xc4c50407, + 0xf9597e40, + 0x3340c4c1, + 0xc1d40bd3, + 0xcdc5c0c0, + 0x0c6bbe3c, + 0x8bc49903, + 0x4ca30027, + 0x8bc49d10, + 0x4f9bfa8e, + 0x40c4c523, + 0xe86ef493, + 0x4042c103, + 0x9b224f9b, + 0xc399231f, + 0x03412b8b, + 0xffff002f, + 0xa3242b7f, + 0x1e1e403c, + 0xd88ac499, + 0x2f9b2246, + 0x8bc39923, + 0xe38ac499, + 0x203ca307, + 0xc2c54783, + 0x0b34ab40, + 0x9d022720, + 0xc2c58bc3, + 0x27fa8e3c, + 0x4efa8e04, + 0x21f393fa, + 0x349903e8, + 0x9dd0074c, + 0x40274d34, + 0x994c349d, + 0x4f4b8b04, + 0xb427402c, + 0xa307701e, + 0xdc99b027, + 0x3ca3c18a, + 0xce234f9b, + 0xd1c10e34, + 0x270d073c, + 0x0a93be20, + 0x9bb00703, + 0xa87e230f, + 0x44d1c1f8, + 0x3e7e0d07, + 0x440d07fa, + 0xf9747eb4, + 0xcf1e0ba6, + 0xa4c1c636, + 0x233f9b3c, + 0x412c432b, + 0xa38adc99, + 0x8bd499c1, + 0x37833c07, + 0xab204ca3, + 0x8bd49d43, + 0x17be0d07, + 0xc6180308, + 0xd499b227, + 0x804fa38b, + 0x9dffffff, + 0xb2c08bd4, + 0x8bd4996d, + 0x40cc4f4b, + 0xbe01275a, + 0x99030c9c, + 0x44d630d4, + 0x4b1eb427, + 0x99234f9b, + 0xd4c58ad3, + 0xc1315840, + 0x433390d4, + 0xf493191e, + 0xc103e76c, + 0x3f9b4044, + 0x232f9b22, + 0x4f03322b, + 0x7fffff00, + 0xd4c5432b, + 0x104c273c, + 0xb68bd49d, + 0x7e0d0706, + 0x05c6f848, + 0x0744d1c1, + 0x7eb2270d, + 0x031ef99d, + 0xf493b027, + 0x9903e734, + 0x439d4d43, + 0x8e0b074c, + 0x9bfa4efa, + 0xfa9323bf, + 0x8303e720, + 0x3cacc1b7, + 0x27234f9b, + 0xc42b1fdc, + 0x4f9bdb2b, + 0x233f9b22, + 0xd4d2432b, + 0xbe0d0718, + 0xd2030c10, + 0xa4c10fd0, + 0x233f9b3c, + 0x4032432b, + 0x031ea427, + 0x0027a027, + 0x030accbe, + 0x9324df9b, + 0x03e6dff4, + 0xbec040c1, + 0x2c030abd, + 0x8e0127c1, + 0x032d07fa, + 0x0000002f, + 0x20cccc80, + 0x203c270c, + 0x40a73c2b, + 0x248b433b, + 0x4207b103, + 0x44c64b5b, + 0xfa8e0027, + 0xa4860127, + 0xfa8e0027, + 0xb107fb4e, + 0xbf6bd007, + 0x60200cc0, + 0xf4930124, + 0x1e030c3a, + 0x5302240d, + 0x1efe66f4, + 0xd0f45305, + 0x81fc93fc, + 0xc09903e6, + 0x9cc4c5b0, + 0x7eaacd9d, + 0x4027f544, + 0x203cc4c5, + 0x314c27d2, + 0x4ca7041e, + 0x8bc49d7f, + 0xf493b646, + 0xc103e65c, + 0x0c83ac40, + 0x100ca30f, + 0x0c27041e, + 0x0747be18, + 0x45f49303, + 0x40c103e6, + 0x9efb0ec0, + 0x8e030a21, + 0x93fc4efb, + 0x04c6d7f4, + 0xf2934c01, + 0x9303e62c, + 0x04c7a7f3, + 0x01364c27, + 0x05340331, + 0xa8240321, + 0x15fd93f4, + 0x412703e6, + 0x07a8d49d, + 0xf3e77e0d, + 0x2000c1d1, + 0x2004c2d1, + 0x437e0d07, + 0x8ad499f4, + 0xc3d14758, + 0xc4d12004, + 0x34ce2008, + 0x30d49928, + 0x0d0744f6, + 0xd1f7817e, + 0xc12004c1, + 0xd29940d4, + 0x32411b4c, + 0x27400824, + 0xcdf09320, + 0xfc0e03e5, + 0x03086c9e, + 0xfe0bfc8e, + 0x954af393, + 0x1d402703, + 0xbd412734, + 0x27010034, + 0x59f41300, + 0xfe0b3415, + 0xfc93fc4e, + 0x11039530, + 0x07dc07c4, + 0xd6f48b0c, + 0x86c41904, + 0x1d402742, + 0x0bfc8ec4, + 0x27fe0bfe, + 0x11f49331, + 0x431d0395, + 0xf063fe0b, + 0x0bba4d27, + 0x4c27f40d, + 0x07f42d28, + 0x03f00110, + 0x9ef04318, + 0x93ffcc5f, + 0x0394eff0, + 0x4f000411, + 0x0000d938, + 0xfe0bd91e, + 0x1007fd4e, + 0xd007f063, + 0x0f071803, + 0xffcc95be, + 0x042704d6, + 0xf4091e1e, + 0x0bba4d24, + 0x4c40f429, + 0x93062728, + 0x00a90ef1, + 0x004b2d9e, + 0x1509f413, + 0x430027d4, + 0x4efd8ef0, + 0xb90da1fc, + 0x23010004, + 0x03c007f6, + 0x45c618dc, + 0xbfbe0d07, + 0x40270000, + 0x0100c4bd, + 0x20273f07, + 0x05184c27, + 0xc8340332, + 0x07d201f4, + 0xbe0f071d, + 0x16ffaddd, + 0x89f4930a, + 0x44c104a7, + 0x0f4c8344, + 0x35333407, + 0x342b4487, + 0x43334307, + 0x3ea7432b, + 0xf1fd4fff, + 0x05860c44, + 0xc5331100, + 0xf413a843, + 0x03c41507, + 0x4efc8ef6, + 0x55f493fd, + 0x43c104a7, + 0x83d00744, + 0x00000f3f, + 0x4c00a180, + 0xa3312330, + 0xfffff03f, + 0x073103ff, + 0x87453343, + 0x07432b33, + 0x2b133314, + 0x601f0314, + 0xbe000585, + 0xc0ffbb5a, + 0x79be1b04, + 0xd461ffaa, + 0xf4134138, + 0x53051e12, + 0x07ff17f4, + 0x7ed4150d, + 0x0027fee6, + 0xfd4efd8e, + 0x14bed007, + 0x0556ffb6, + 0xfefef453, + 0x0227d415, + 0xfc4efd8e, + 0x3f07f523, + 0x4c272027, + 0x03320514, + 0x99f4c834, + 0x02893604, + 0x8941130e, + 0x14071003, + 0xd2071f6b, + 0x8d05f19d, + 0xf28d2ef3, + 0xa6d39b2c, + 0x504d2715, + 0x8d362701, + 0x091e3af4, + 0x8dac4c27, + 0x33273af4, + 0x4387329b, + 0x2740f4c5, + 0x4c27902c, + 0x193d2710, + 0x3bed0702, + 0x1d313b21, + 0x271427f4, + 0xe8ed03c1, + 0x270f0703, + 0x8df43d40, + 0xf38d38fe, + 0x30f28d32, + 0x9d07f19d, + 0xfdc54bfc, + 0x04fc9d34, + 0x9d09f19d, + 0x91be08f1, + 0xf503ffa6, + 0x3127fc8e, + 0x9d1f4c27, + 0x039d5604, + 0x55039d54, + 0xfe0bfe0b, + 0xfe0bfe0b, + 0xa7cef093, + 0x93fe0b00, + 0x04c5f7f4, + 0xc16443c1, + 0x3fe6ac02, + 0x349900a9, + 0xa24fe626, + 0x2634b900, + 0x9a4fe601, + 0xd5402700, + 0x27012824, + 0x1c24d541, + 0x0f4c2701, + 0x013024d5, + 0xd5484c27, + 0x27012024, + 0x24d5144c, + 0x42070124, + 0x01344d03, + 0x3c271027, + 0x03410511, + 0x27f3c844, + 0xbd402712, + 0xbd013824, + 0xbd013921, + 0xbd013a21, + 0x93013b21, + 0x04c593f4, + 0xb96443c1, + 0xc6012634, + 0x2734b94c, + 0xbd450601, + 0x1e013821, + 0x2834b90d, + 0x27450601, + 0x3824bd41, + 0x6df19301, + 0x13c104c5, + 0x2834b964, + 0xb9480601, + 0xbd012933, + 0xc1013923, + 0x44b96414, + 0x24bd012a, + 0x14c1013a, + 0x2b44b964, + 0x3b24bd01, + 0x4efe0b01, + 0x072227fc, + 0xa71327c0, + 0xfe00fe0e, + 0xfff29abe, + 0xd2be0127, + 0xf2930303, + 0x2704c528, + 0x204c2730, + 0x9d11249d, + 0x40271523, + 0x9d10239d, + 0x24c51423, + 0x0dc39940, + 0x01004d27, + 0xf612248d, + 0x6823c538, + 0x036423c5, + 0x2704b82d, + 0x4027203c, + 0x2d03241d, + 0xf3a80130, + 0x01003d27, + 0x241d4027, + 0x01202d03, + 0xf393f3a8, + 0x2704c690, + 0xb44c2720, + 0x34033205, + 0xf393f4c8, + 0x2704c558, + 0x184c2720, + 0x34033205, + 0xfc93f4c8, + 0x2704c4bc, + 0x8d01284d, + 0x40278cc4, + 0x07f0c49d, + 0x38f4930c, + 0xc4c50000, + 0xa80d036c, + 0x1b98be04, + 0x030c0700, + 0x014ab80e, + 0x001261be, + 0x0c030c07, + 0x4efc8e8c, + 0xbed007fd, + 0xc6ffb3e7, + 0x8e042704, + 0x08f413fd, + 0xd4c50227, + 0x4efd8e6c, + 0xbed007fd, + 0x960303b5, + 0xfef49305, + 0xd4c50309, + 0x20fd8e6c, + 0x8e042702, + 0xbe0d07fd, + 0xbe001070, + 0x4603033b, + 0xc0f41305, + 0x276cd4c5, + 0x07fd8e00, + 0x93352720, + 0x00a82bf0, + 0x244e0419, + 0xf3b80203, + 0xfe0b0027, + 0x4107f54e, + 0xd1874433, + 0x9007d40b, + 0xf663d12b, + 0x04b89d03, + 0xd90bd433, + 0x235cf1c5, + 0x0704b89d, + 0x2720273f, + 0x3205144c, + 0xf4c83403, + 0xbc3ed039, + 0xf0930536, + 0x1e00a62d, + 0x59003964, + 0x272027de, + 0x2b372714, + 0x3b412732, + 0x464e8b43, + 0x7c24f945, + 0x8b000183, + 0x38210304, + 0x9d4027f1, + 0x909d04f4, + 0x270438f3, + 0x04f49d41, + 0x4c834007, + 0x2744e680, + 0x0af49d47, + 0xf493d379, + 0xc500a650, + 0x0a1e54f4, + 0x0354f0c1, + 0xf0c5100c, + 0x54f1c154, + 0x43ca1419, + 0x04dc99f0, + 0x930fc2d0, + 0x00a5dcf0, + 0xffa3d6be, + 0x7f5e0127, + 0x14db8902, + 0x891cd489, + 0x5b071eda, + 0x54334c3b, + 0x2427ac3b, + 0x3507a40b, + 0x2b4d929d, + 0x24f38d3a, + 0x8d16f58d, + 0xf37528f4, + 0x8d4c929d, + 0x9b8d2a93, + 0x2e948d26, + 0x9948958d, + 0xd69918d4, + 0x9d411319, + 0xf4c505f4, + 0xc43c2758, + 0x02854d27, + 0x463b363b, + 0x8d05f299, + 0xf38d2cfb, + 0x32f48d30, + 0xc62cfe89, + 0x1e162724, + 0xc1132703, + 0xd28958f4, + 0x20d38916, + 0x0b22d789, + 0x58f0c14c, + 0x743b343b, + 0x403b4207, + 0x8407b49b, + 0xfbc58433, + 0x0b1e9b50, + 0xc1080773, + 0x072b50fe, + 0xb007465b, + 0xf48de65b, + 0x7e928d60, + 0x8d30938d, + 0x988d2c9b, + 0x8521874a, + 0x931e07f0, + 0x04a323f4, + 0x0360f089, + 0xa903081d, + 0xc510704c, + 0xf88d40f2, + 0x26fb8d18, + 0x8d2af38d, + 0xf18d2ef0, + 0x34fec538, + 0xa90cc5ca, + 0x2a107244, + 0xca5a0248, + 0x05070c78, + 0xaebe1807, + 0x115effa2, + 0x3065c6ff, + 0x9308015d, + 0x00a4faf0, + 0xc1feff5e, + 0x9dc55cf1, + 0x11919d64, + 0x9911d499, + 0x212712d1, + 0x3d070907, + 0x0e03243b, + 0x03014ab8, + 0xfabe2c3c, + 0xd2990014, + 0x7d929d11, + 0x9d1ad399, + 0xd499f193, + 0x7c949d18, + 0x9d18d099, + 0xd1994e90, + 0xec919d04, + 0x9d04d299, + 0xd3794bf2, + 0x9955939d, + 0x949d18d4, + 0x05d099fc, + 0x9957909d, + 0x919d05d1, + 0x06d299fd, + 0x99fe929d, + 0x939d06d3, + 0x05d49958, + 0x9949f49d, + 0x4c2706d0, + 0x4af09d44, + 0x1e84948d, + 0x54f1c10a, + 0xc5101c03, + 0xf2c154f1, + 0x40241954, + 0x2411ff4c, + 0xca50f3c1, + 0xf4c1e843, + 0x50f1c154, + 0x00874021, + 0x007040be, + 0x27110c10, + 0xd499100c, + 0x02200724, + 0xb9240704, + 0xc6012ed4, + 0x2fd0b944, + 0x2cd19901, + 0x9987919d, + 0x41c02cd4, + 0xc0413010, + 0x111e1542, + 0x9d30d399, + 0x0d1e8a93, + 0x9d30d499, + 0x051e8a94, + 0x2027ff1e, + 0xd499f23d, + 0x27449612, + 0x19f41d41, + 0x074002f4, + 0x7d442704, + 0xc1f05df0, + 0xf49d58f0, + 0x07f49d09, + 0x0608f49d, + 0x504d2705, + 0x11101e01, + 0x004e38d4, + 0x4c27ffff, + 0x27041ef4, + 0xf48dc44c, + 0x9dd1393a, + 0xd2790ef1, + 0x990ff29d, + 0x4ce626d4, + 0x012cd3b9, + 0xb90bf39d, + 0x9d012dd4, + 0xd0b90cf4, + 0xf09d012b, + 0x20d4b90d, + 0xff4cc401, + 0x22d1a911, + 0x12f18d01, + 0x0124dda9, + 0x1e14fd8d, + 0x114cd41e, + 0x0344471a, + 0x0184b04f, + 0x19433900, + 0x14f38d44, + 0x1e12f48d, + 0x9d422706, + 0x0f070df4, + 0xffa183be, + 0xf6430027, + 0xfc4ef58e, + 0x0328df9b, + 0x21dc30d1, + 0xfc8e0127, + 0x27244f9b, + 0x25f49b44, + 0x9b243f9b, + 0xc02725f4, + 0x66be131e, + 0x62be0308, + 0x4f9b0308, + 0x9b412724, + 0xc10325f4, + 0x9becdcce, + 0x4527244f, + 0x9b25f49b, + 0xf49b243f, + 0x243f9b25, + 0x9b25f49b, + 0xf49b243f, + 0x8e002725, + 0x63f94efc, + 0x070130ff, + 0x24df9b90, + 0xf49b4827, + 0x243f9b25, + 0x9b25f49b, + 0xf49b24cf, + 0x28af9b25, + 0x2d20acec, + 0x35f09305, + 0x02c103de, + 0x231f9b3c, + 0x07223f9b, + 0x08422b43, + 0x07320740, + 0xc8432b41, + 0x04c11341, + 0xe4411b3c, + 0xbe050b48, + 0x26fff203, + 0x05025e06, + 0xc1214f9b, + 0x438bbc03, + 0x04f64ff6, + 0x2c532d07, + 0x273f0718, + 0x4c4c2710, + 0x34033105, + 0x3c07f4c8, + 0x27183c53, + 0x5d020740, + 0x3df37df4, + 0xfbf17ef2, + 0x4a070c56, + 0x3a874433, + 0x3a2b340b, + 0x34334127, + 0x4307f41d, + 0x44b9490b, + 0x45c604b8, + 0xa05ef493, + 0x0e448904, + 0x049e42fc, + 0x4d034307, + 0x490b04b8, + 0x3c272f07, + 0x0321014c, + 0x03410524, + 0x5ef3a844, + 0x00390484, + 0xc6400c83, + 0x4f9b7c0f, + 0x9d4f6b28, + 0x42f404f4, + 0x4f9b0478, + 0x05f49d28, + 0x9d284f9b, + 0x3f9b06f4, + 0x9b412724, + 0x3c5325f4, + 0x07f39d1f, + 0x045a3ff6, + 0x9b243f9b, + 0x3c5325f4, + 0x08f39d1f, + 0xbf073ec6, + 0xb903df07, + 0x27e0dc23, + 0x243f9bc0, + 0xf49b4127, + 0x1f3c5325, + 0x37e6b31d, + 0x44334c07, + 0x07404c03, + 0x27040b0f, + 0xc628101c, + 0x1c270d07, + 0x0516be40, + 0x1b0ff600, + 0x03c10304, + 0x40dc03b1, + 0x1e14c8c0, + 0x9d4127c9, + 0xf09d04f4, + 0x05f09d08, + 0x9d06f09d, + 0x4f9b07f0, + 0xf4440328, + 0x03ee114c, + 0x9b11f49d, + 0x43f4284f, + 0xf49d03e4, + 0x9b47562c, + 0x3cf4283f, + 0x0303d70d, + 0x273f6b34, + 0xc5433b41, + 0xf39d34f4, + 0xc44f1e30, + 0x3f9b4c41, + 0x25f49b24, + 0x9d1f3c53, + 0x64be30f3, + 0xf0c50306, + 0x065dbe34, + 0x38f0c503, + 0xf428cf9b, + 0xa10100cd, + 0xc5402703, + 0xfc9d3cf4, + 0x87c80631, + 0x2710070c, + 0x43ddbe20, + 0x3cf0c500, + 0xb027d007, + 0x030632be, + 0xb103d005, + 0xcbced403, + 0x284f9bf4, + 0xf49d4f6b, + 0x114cf412, + 0x4f9b036c, + 0x9b312724, + 0x4c5325f3, + 0x2df49d1f, + 0x03284f9b, + 0x14f48d41, + 0x03284f9b, + 0x16f48d41, + 0x9b244f9b, + 0x4c5325f3, + 0x18f49d1f, + 0x3f9b4656, + 0x9b412724, + 0x3c5325f4, + 0x19f39d1f, + 0x4027061e, + 0x9b19f49d, + 0x3127244f, + 0x5325f39b, + 0xf49d1f4c, + 0x242f9b1a, + 0x5325f39b, + 0xf29d1f2c, + 0x9b27861b, + 0xf48d284f, + 0x284f9b1c, + 0x9b1ef48d, + 0xf48d284f, + 0x284f9b20, + 0x1e22f48d, + 0x8d40270f, + 0xf48d1ef2, + 0x1cf48d22, + 0x8920f48d, + 0xf38916f4, + 0xe9f09314, + 0x439b03db, + 0x02c1f4a5, + 0x231f9b3c, + 0x07223f9b, + 0x08422b43, + 0x07320740, + 0xc8432b41, + 0x04c11341, + 0xe4411b3c, + 0xbe02bb48, + 0x26ffefb3, + 0x02b25e06, + 0xc1214f9b, + 0x438bbc03, + 0x02a64ff6, + 0x9d104c27, + 0x3f9b24f4, + 0x9b412724, + 0x3c5325f4, + 0x26f39d1f, + 0x01eb3fe6, + 0xf4d54027, + 0xf4d5012c, + 0xf4d50120, + 0xf4d50124, + 0x3f9b0128, + 0x9b412724, + 0x30cc25f4, + 0x243f9b2f, + 0x3c534827, + 0x25f49b18, + 0x0120f3bd, + 0x1cff3cc4, + 0x27244f9b, + 0xf39b103c, + 0xad435b25, + 0x9b0122f4, + 0xf39b244f, + 0xad435b25, + 0x9b0124f4, + 0x4127243f, + 0x4c25f49b, + 0x244f9b30, + 0xf49b4127, + 0x243f9b25, + 0x3c534127, + 0x25f49b1f, + 0x0126f3bd, + 0x9b603fc6, + 0x4327244f, + 0x9b25f49b, + 0x3127244f, + 0x5325f39b, + 0xf4bd1f4c, + 0x4f9b0127, + 0x1f4c5324, + 0xbd25f39b, + 0xa60128f4, + 0x244f9b49, + 0xf39b3827, + 0x184c5325, + 0x0129f4bd, + 0x9b244f9b, + 0x4c5325f3, + 0x2af4bd18, + 0x244f9b01, + 0x5325f39b, + 0xf4bd184c, + 0x0f1e012b, + 0xf4bd4227, + 0xf4bd012b, + 0xf4bd0129, + 0x3f9b012a, + 0x9b412724, + 0x30cc25f4, + 0x284f9b0f, + 0x012cf4bd, + 0xbd284f9b, + 0x9b012df4, + 0x4127243f, + 0xcc25f49b, + 0x4f9b1830, + 0x204c2724, + 0x9b25f49b, + 0xf49b243f, + 0x244f9b25, + 0xf49b4127, + 0x24cf9b25, + 0xcc534127, + 0x25f49b1f, + 0x0f07c5c6, + 0x01300d03, + 0xd6fbc97e, + 0xdf9b660f, + 0x53412724, + 0xf49b1fdc, + 0x07d5a625, + 0x300d030f, + 0xfbb07e01, + 0xc4960df6, + 0x4f9bd546, + 0x9b412724, + 0x4f9b25f4, + 0x9b412724, + 0x3f9b25f4, + 0x1f3c5324, + 0xbd25f49b, + 0x46012ef3, + 0x244f9b39, + 0xf49b4127, + 0x284f9b25, + 0x9b284f9b, + 0x4f9b284f, + 0x284f9b28, + 0x27114c30, + 0x9d0d1e01, + 0x4f9b24f4, + 0x2ff4bd28, + 0x9b002701, + 0x3f9b224f, + 0xcc432b23, + 0xf4931440, + 0xc103da00, + 0x3f9b3c44, + 0x28432b23, + 0x1ed12741, + 0x36d0273c, + 0xe9f0930b, + 0x02c103d9, + 0x231f9b3c, + 0x07223f9b, + 0x08422b43, + 0x07320740, + 0xc8432b41, + 0x04c11141, + 0xc4411b3c, + 0xb8be1348, + 0x06e6ffed, + 0x4f9b0b1e, + 0xbc03c121, + 0x4566438b, + 0xf49d4027, + 0xa5dff626, + 0x333a0700, + 0x0b4a8734, + 0x334a2b43, + 0xb84d0344, + 0x0bd90704, + 0x233127d4, + 0x1d04b84d, + 0xb9490bf3, + 0xc604b844, + 0xf4935e4f, + 0x89049c28, + 0x42dc0e44, + 0x11949928, + 0x2735a4ce, + 0x271027e0, + 0x4f074c0c, + 0x410b3d07, + 0x4201310b, + 0x14033401, + 0xecd0242e, + 0x051e0d4c, + 0xf028e103, + 0xf41d4027, + 0x4c270e1e, + 0x11949d20, + 0x01004d27, + 0x1912948d, + 0x0746c6f4, + 0x8734333a, + 0x2b430b4a, + 0x0b44334a, + 0xbd302749, + 0x1904b843, + 0x074666f4, + 0x272f073d, + 0x20014c4c, + 0x30052403, + 0xf4a83403, + 0xb3be0907, + 0x071e0300, + 0x031e0127, + 0xff430427, + 0xf98e0130, + 0x03c1f54e, + 0x5e0499bc, + 0xf0a3a307, + 0xac03b007, + 0xd94fe648, + 0x23930700, + 0xd027d89c, + 0x9f4ef593, + 0x406c2700, + 0x9f36f793, + 0x108c2700, + 0x0764b3c1, + 0x99430b4d, + 0x44d60944, + 0x061ee027, + 0xec03e307, + 0x68b3c140, + 0x86343499, + 0x0b4d0747, + 0x35449943, + 0xe3074526, + 0x1e3dec03, + 0xe0d4f90b, + 0x4b000184, + 0xc6404c4f, + 0x1e1d07e4, + 0xe0d4f915, + 0x4b000184, + 0x07404c4f, + 0x1ee0271d, + 0x07140705, + 0x11d6ccea, + 0x14330d07, + 0x0a0b0433, + 0xc7071e0b, + 0x171e2807, + 0xed230d07, + 0x16330120, + 0x1e0b0633, + 0xed03090b, + 0xc5070120, + 0xe4c62607, + 0x45561419, + 0x41f14d87, + 0x00018538, + 0x072caece, + 0x03e02732, + 0x1120cc31, + 0x0d1e3127, + 0x2419f201, + 0x400bf211, + 0x421d2219, + 0x21074c07, + 0x2e0b4e0b, + 0xf215f405, + 0xf318e103, + 0xfcbe051e, + 0xd1030031, + 0xff42d8e4, + 0xf58ef083, + 0x2107fc4e, + 0xc827d107, + 0x2103e027, + 0x272510cc, + 0x9b211e21, + 0x3407294f, + 0x10074c0b, + 0x3c03c407, + 0x6b1e0b80, + 0x003d30cf, + 0x8e012701, + 0x1dc526fc, + 0xf0e1031c, + 0xe736def2, + 0x4d073027, + 0x0e0b4e2b, + 0xde1a4103, + 0x0000dfc4, + 0x27138000, + 0x070f1e41, + 0x23400b4e, + 0x1e431941, + 0x03031de2, + 0x27f4c801, + 0x4efc8e00, + 0x07c107f8, + 0x001df4d0, + 0x07016501, + 0x334107a1, + 0x0ba53348, + 0xb8dd03a4, + 0x19ad0b2a, + 0xb8dd23a4, + 0x4b4fe62a, + 0x03a43901, + 0x0704b8dd, + 0x33848734, + 0x2b830b34, + 0x0b843384, + 0x2384198d, + 0xe604b8dd, + 0x99012d4f, + 0x450614d4, + 0x319ef80e, + 0xf0930006, + 0xc103d75c, + 0x1f9b3c02, + 0x223f9b23, + 0x422b4307, + 0x32074008, + 0x432b4107, + 0xc11341c8, + 0x411b3c04, + 0x010048e4, + 0xffeb2abe, + 0xf75e0626, + 0x214f9b00, + 0x8bbc03c1, + 0xeb4ff643, + 0x99a13900, + 0x144e11d4, + 0x45be0d07, + 0x0ff6fff5, + 0xdc8d00dc, + 0x68dac512, + 0x9d30a499, + 0xa499f4d4, + 0xf9d49d2e, + 0x9d33a499, + 0xa479fad4, + 0x9988d49d, + 0xd49d31a4, + 0x28a49989, + 0x9974d49d, + 0xd49d29a4, + 0x2aa49975, + 0x9976d49d, + 0xd49d2ba4, + 0x9da45977, + 0xa499edd4, + 0x78d49d2c, + 0x9d2fa499, + 0xa4997ad4, + 0x7bd49d04, + 0x9d32a499, + 0xa499f0d4, + 0x994b4604, + 0x43d005a4, + 0x3046d433, + 0x89148489, + 0xab89168c, + 0x07c49b0a, + 0xbe0c071b, + 0x07006749, + 0x071b0790, + 0x6739be0c, + 0x03048600, + 0x27090791, + 0x73051e40, + 0x96410301, + 0x27031e03, + 0x79d49d40, + 0x9d2ea499, + 0xa4995bd4, + 0x5cd49d33, + 0xd49da459, + 0x2aa49956, + 0x9959d49d, + 0xd49d2ba4, + 0x30a4995a, + 0x995dd49d, + 0x457634a4, + 0xd6088499, + 0x1e002744, + 0x27002705, + 0x5ed49d42, + 0x0127f88e, + 0x0427f88e, + 0xfd4ef88e, + 0x07040499, + 0x994686d0, + 0x46c40504, + 0x4600310d, + 0x3bd3be05, + 0x35402700, + 0x1d4027d4, + 0x4efd8ed4, + 0x24ff63f5, + 0x07700701, + 0x2720273f, + 0x3205484c, + 0xf4c83403, + 0xf4288f9b, + 0xab01008d, + 0x284f9b03, + 0x3f6b3407, + 0x3cf4f33d, + 0x07039d20, + 0x87443343, + 0x2bb40bb3, + 0xb87d03b3, + 0x0bb43304, + 0x23b419b7, + 0xe404b87d, + 0x9b038141, + 0x3127244f, + 0x5325f39b, + 0xf45d1f4c, + 0x9b244f9b, + 0x4c5325f3, + 0x9bf47d1f, + 0xfc9d28cf, + 0x5fc8f404, + 0xbdcfe603, + 0x00b43900, + 0x4ce4424c, + 0x9b035158, + 0xf49d284f, + 0x1542c005, + 0x47464354, + 0x034041e4, + 0xd0009f5e, + 0x46e43b46, + 0x4d1e0336, + 0x2c071f07, + 0x141e1803, + 0x2f073c07, + 0x28033103, + 0x0d284f9b, + 0xb0220324, + 0x9b7a1ef3, + 0x140d284f, + 0xab284f9b, + 0x8d13094f, + 0x12031014, + 0x030443ea, + 0x611ef240, + 0x27243f9b, + 0x25f49b41, + 0x9d1f3c53, + 0x4f9b08f3, + 0x8d410328, + 0x491e0af4, + 0x0328df9b, + 0x071d07d1, + 0x8d20270d, + 0x68be08fd, + 0xa007003c, + 0x11274227, + 0x051ef035, + 0x44471103, + 0x07fa4cc2, + 0x20ec270d, + 0x20270103, + 0x171ee12b, + 0x9b244f9b, + 0x4e5b25f1, + 0x4f6b3a07, + 0x341d320b, + 0x02a4c4ea, + 0xf0382103, + 0x03284f9b, + 0x9d4f6b41, + 0x4cf428f4, + 0x9b029121, + 0x4103284f, + 0xf49d4f6b, + 0x214cf429, + 0x3f9b0282, + 0x9b412724, + 0x3c5325f4, + 0x2af39d1f, + 0x27243f9b, + 0x25f49b42, + 0x9d1e3c53, + 0x33f42bf3, + 0xb4990262, + 0x33340705, + 0x2b444733, + 0x294f9b34, + 0x0b1a3c03, + 0x9d4f6b43, + 0x3c032cf4, + 0x4334fa19, + 0x294f9b02, + 0x6b1a4c03, + 0x2df49d4f, + 0x33344cf4, + 0x294f9b02, + 0x9b2ef49d, + 0x3127244f, + 0x5325f39b, + 0xf49d1f4c, + 0x244f9b2f, + 0x5325f39b, + 0xf49d1f4c, + 0x244f9b30, + 0x9325f39b, + 0x03d457f0, + 0x9d1f4c53, + 0x02c131f4, + 0x231f9b3c, + 0x07223f9b, + 0x08422b43, + 0x07320740, + 0xc8432b41, + 0x04c11341, + 0xe4411b3c, + 0xbe01e548, + 0x26ffe81f, + 0x01dc5e06, + 0xc1214f9b, + 0x438bbc03, + 0x01d04ff6, + 0xfabe0027, + 0xaf9b02f7, + 0x23cf9b24, + 0xd40afb93, + 0xc0b0c103, + 0xe6bec783, + 0xdc2702f7, + 0x9bdc2b1f, + 0x3f9b224f, + 0xd2432b23, + 0x0d0716d4, + 0x02f8fbbe, + 0xc10dd0d2, + 0x3f9b3cb4, + 0xfa432b23, + 0x07019104, + 0xd5f4932a, + 0x2f0303d3, + 0x80000000, + 0x9b3c43c1, + 0x342b234f, + 0x0a203ccc, + 0xa7203c13, + 0x8b433b40, + 0x07c10324, + 0xf64c5b42, + 0x5e017a4f, + 0x3f9b0166, + 0x9b412724, + 0x3c5325f4, + 0x06b31d1f, + 0x070c0738, + 0x0b04331f, + 0x3d0c0301, + 0x28101c27, + 0x270d07c6, + 0x757e401c, + 0xf6a007fb, + 0x0301770f, + 0x03b103c1, + 0xf49940dc, + 0x03444732, + 0xc3c4da46, + 0x6b294f9b, + 0x33f49d4f, + 0x6b0c4c03, + 0x194cf44f, + 0x0707010e, + 0x02fadfbe, + 0x0ff6a007, + 0xf0930148, + 0x2703d34c, + 0xc1f41d41, + 0x1f9b3c02, + 0x223f9b23, + 0x422b4307, + 0x32074008, + 0x432b4107, + 0xc11341c8, + 0x411b3c04, + 0x00dc48e4, + 0xffe716be, + 0xd35e0626, + 0x214f9b00, + 0x8bbc03c1, + 0xc74ff643, + 0x07480700, + 0x33383338, + 0x03430b45, + 0x072ab84d, + 0xb82d2324, + 0xb9270b2a, + 0x072ab823, + 0xe6940b97, + 0x93008a3f, + 0x04958ff4, + 0xdc0e4489, + 0x74896742, + 0x6f84ce12, + 0x9904f499, + 0xf83105f5, + 0xd508f689, + 0x070120f4, + 0x27b027c2, + 0x073f07d0, + 0x0b3d0be9, + 0xc4d403ed, + 0xf1d12db3, + 0x19060120, + 0x662456c4, + 0xbcc4b988, + 0xb947a62a, + 0xc42abdc4, + 0xc4d11546, + 0x08072ac4, + 0x26071407, + 0x53be4546, + 0x0606002c, + 0x33011a1e, + 0x342ee401, + 0x1048bcd0, + 0xb103071e, + 0xb648bcc4, + 0x437e0f07, + 0x27081efc, + 0x8d01004d, + 0xf4191274, + 0x090744e6, + 0x19fc317e, + 0x074f66f4, + 0x273f0709, + 0x3201484c, + 0x02053403, + 0xf4a80403, + 0xa127471e, + 0xa427431e, + 0xf2993f1e, + 0x9d40272e, + 0xf49d34f4, + 0x33f29d32, + 0x9bfedd5e, + 0x3127244f, + 0x5325f39b, + 0xf49d1f4c, + 0x244f9b32, + 0x5325f39b, + 0xf49d1f4c, + 0xad4fe634, + 0x07bf07fe, + 0x35bc03df, + 0x27e3dc23, + 0xfe945ec0, + 0xff430a07, + 0xf58e0124, + 0x387404c1, + 0xff00004f, + 0xd02d27ff, + 0x27041e02, + 0x4007d02c, + 0x01b44d03, + 0x27cc04c5, + 0xd7f49331, + 0x039d02fb, + 0xb402d515, + 0x6c04c501, + 0xfe0b0327, + 0xc007fc4e, + 0x4ab8ce03, + 0xbe0c0701, + 0x9b000afa, + 0xd4d428df, + 0x15d2d42c, + 0x02fb90be, + 0x11031007, + 0xd4960c07, + 0x7abe1013, + 0xe41e0005, + 0x0027d220, + 0x76befc8e, + 0x100702fb, + 0x88be0c07, + 0xd01e0005, + 0xfc8e0127, + 0x0499fd4e, + 0x66d00714, + 0x9782be4e, + 0x14d499ff, + 0x991e42c4, + 0x44d616d4, + 0x081e1027, + 0x1e031d07, + 0x07014c4c, + 0xb80e030d, + 0x71be014a, + 0x1c1e0005, + 0x4d073d07, + 0x4ab83e03, + 0xe04e0301, + 0x2c27014d, + 0x03410165, + 0x03310544, + 0x07f2a834, + 0xa80d030d, + 0x0a98be04, + 0x9d402700, + 0xfd8e14d4, + 0xfe93fd4e, + 0x0703d12c, + 0x3ce2c1d0, + 0x9b231f9b, + 0x4307223f, + 0x4008422b, + 0x41073207, + 0x41c8432b, + 0x3ce4c111, + 0x48c4411b, + 0xe4f9be1c, + 0x1e05c6ff, + 0x214f9b14, + 0x8bbce3c1, + 0x07457643, + 0xff667e0d, + 0xfd8e0227, + 0xfd8e0427, + 0x1f6b2f6b, + 0x04192103, + 0x1407011d, + 0xf2a80103, + 0x1f6bfe0b, + 0x04190a1e, + 0x030f14ce, + 0x6b230701, + 0x2332072f, + 0x0b223631, + 0x0f22d0fe, + 0x2f6b2223, + 0x04392103, + 0x0103041d, + 0xfe0bf2b8, + 0x0499fd4e, + 0x99200708, + 0x43003003, + 0x2d891153, + 0x07e30722, + 0x8be10332, + 0x323c03d1, + 0x3019171e, + 0x04333103, + 0x420b4007, + 0x4e904489, + 0x840c03d4, + 0xfd8e020b, + 0x0027fe38, + 0x0499fd8e, + 0x27432408, + 0x04fe0b03, + 0x8311c341, + 0x86012711, + 0x13002714, + 0x4efe0b02, + 0x99b007f9, + 0xd0073009, + 0xbc03a107, + 0x1ec02743, + 0x0744191c, + 0x0744330d, + 0x033d0b34, + 0x3199844c, + 0xbe040b85, + 0xd2030458, + 0xc1030a0a, + 0x4c0b4b07, + 0x07dfc9ce, + 0x4ef98e0c, + 0x310399fe, + 0xe0072007, + 0x2c033103, + 0x19171e54, + 0x33210320, + 0x0b400704, + 0x9244994e, + 0x0c03414e, + 0x8e0e0b84, + 0x27f338fe, + 0x99fe8e00, + 0x43000804, + 0xcc1e1153, + 0x45d61439, + 0x03011219, + 0x423b4127, + 0x030534eb, + 0x4027fe0b, + 0x04050415, + 0xf54efe0b, + 0x07680499, + 0x61a107d0, + 0x06171905, + 0xf641e445, + 0x21461e00, + 0x7cd3c110, + 0xc170d2c1, + 0x30d280d1, + 0x2b42070e, + 0xda417330, + 0x120b1234, + 0x03d20e1e, + 0x1b42070b, + 0x12417330, + 0x07122b34, + 0x20200b21, + 0x1e320773, + 0x0ba33105, + 0xe6a43932, + 0xc500e74f, + 0xd0c580d1, + 0x00de5e7c, + 0x12491459, + 0x896d0999, + 0x44c62201, + 0x141ec027, + 0xc17c0489, + 0x42d28003, + 0x03c30709, + 0x1ec10bc1, + 0xc5c30703, + 0xd28d80dc, + 0x2794d67c, + 0x07051eb0, + 0x39b20bbc, + 0xc864f6a6, + 0xb12320b1, + 0x071bb1c8, + 0x07c123cb, + 0xbe19070c, + 0x07005fdd, + 0x07190780, + 0x5fcdbe0c, + 0x1ec00700, + 0x27802705, + 0x031907c0, + 0x27e02711, + 0xc10a1e20, + 0x340b78d4, + 0xe40b3401, + 0x21033287, + 0xb12cf180, + 0x191e0027, + 0x089b0e07, + 0x0c1e2027, + 0x0378d4c1, + 0x01340b21, + 0x87040b34, + 0xf12cd232, + 0xd4c164f6, + 0x21040b70, + 0x74d3c1a2, + 0x320b200b, + 0x313673c4, + 0x1e340ba4, + 0x89145932, + 0x11492203, + 0x20274506, + 0x191e0027, + 0xc17c0489, + 0x41328000, + 0x030b0103, + 0xa3394007, + 0x2447410b, + 0x21233496, + 0xc57cd18d, + 0x320780d0, + 0x52157220, + 0x53257100, + 0xfe4ef58e, + 0x02011007, + 0x27200399, + 0x3be12700, + 0x8b4e07e0, + 0x03452642, + 0xf203d201, + 0x2007ff1e, + 0x2c032433, + 0x23420784, + 0x410b844c, + 0x439d30a7, + 0x9d302792, + 0x439d8440, + 0x07141185, + 0xeb020b01, + 0x6514154e, + 0x4efe8e10, + 0x080c99f5, + 0xac07b007, + 0xd1077c07, + 0xa3c36207, + 0x04997123, + 0x0734d630, + 0x99081e24, + 0xcc873102, + 0x5707aa87, + 0x90278027, + 0x320751c3, + 0xe607382b, + 0xe80b3103, + 0x28b6280a, + 0x201e3127, + 0x8103e119, + 0x44334107, + 0x44994b0b, + 0x8be10385, + 0x4745c64c, + 0x0b0d0741, + 0x1d010347, + 0xf0251ed4, + 0x1e1edff3, + 0x9103e119, + 0x44334107, + 0x44994b0b, + 0x8be10385, + 0x4747c64a, + 0x1d450b41, + 0x1e010304, + 0x070d0716, + 0x07392b32, + 0x0b3103e6, + 0x96290ae9, + 0xf0312724, + 0x0d2ecff3, + 0x931ed007, + 0x2102f58e, + 0x3c272107, + 0x2b020b21, + 0x212cd032, + 0x1e31270b, + 0x1d40a707, + 0xb8010304, + 0x4efe0bf3, + 0x080499fb, + 0xc0072007, + 0xb107d007, + 0x03322c03, + 0x43c454cc, + 0xbe302715, + 0x070301b3, + 0x072c0710, + 0xbe31270d, + 0x1e0301a7, + 0x7e302711, + 0x1007ff1b, + 0x0d072c07, + 0x107e3127, + 0x2b1007ff, + 0x270b071b, + 0xfb0e202c, + 0x31079d1e, + 0x14331153, + 0x3183100b, + 0x03851499, + 0x86348b31, + 0x07312734, + 0x4efe0b03, + 0x07f123f5, + 0x07006180, + 0x07f32551, + 0xbe920712, + 0x15030148, + 0x279344f0, + 0xf305103c, + 0x4c27061e, + 0x07f40520, + 0x0733c339, + 0x35b02775, + 0x088499f3, + 0xc43043c4, + 0x84991293, + 0x247c190b, + 0x1e3b0741, + 0x273b4703, + 0x07261ea3, + 0x0b41534b, + 0xdc4c1945, + 0xa90709b1, + 0x69073b07, + 0xfa31151e, + 0x69073b07, + 0x7c190d1e, + 0xac073b07, + 0xa103a183, + 0xccc06027, + 0xc1533bff, + 0x4c07c433, + 0x07844c03, + 0x330807d3, + 0x07040bd3, + 0x00d2be1a, + 0x11f42103, + 0x47d40bf3, + 0x1b4d0b46, + 0x0b400d03, + 0x85c499c8, + 0x45d64a8b, + 0x2706d399, + 0xab463b41, + 0x06d39d34, + 0xb103f401, + 0xb4ee7103, + 0xf103ff79, + 0xf94ef58e, + 0x99290b99, + 0xa0072804, + 0x4bc20091, + 0x07d4073b, + 0x0bdb2b90, + 0x2714f69b, + 0x161effcc, + 0xc4471419, + 0xc1032204, + 0x2d071c07, + 0x1f6b0907, + 0x737e2f6b, + 0x07d123fb, + 0x072d071c, + 0x6b1f6b09, + 0xfb527e2f, + 0x41034b07, + 0x8e29a49d, + 0xb1fa4ef9, + 0x0bb0070c, + 0xb51c07c1, + 0xfb767e0c, + 0x1c07a007, + 0xa77e0b07, + 0x072007fb, + 0x0e0b071a, + 0x4e941efa, + 0x07b007fa, + 0xfc117ec1, + 0x1c07a007, + 0x8b7e0b07, + 0x072007fb, + 0x0e0b071a, + 0xff785efa, + 0x0499fc4e, + 0x61d0071c, + 0x274f460c, + 0x09039940, + 0xf621049d, + 0x1c039d34, + 0x1bc6fc8e, + 0x3c274007, + 0x03120165, + 0x03420514, + 0x99f3a844, + 0xdc6521d4, + 0xd1994786, + 0xbe0c0708, + 0x1102ffdc, + 0x2bc221c3, + 0x27202b30, + 0x0cc48d40, + 0xc225c315, + 0xd301c219, + 0x423b4127, + 0xd30534ab, + 0x270ccc89, + 0x1edc8d40, + 0x8e1cd49d, + 0x07fe4efc, + 0x27410730, + 0x4e01652c, + 0x3e054403, + 0xf2a83403, + 0x30071461, + 0x2b841c03, + 0x843c0341, + 0x4027340b, + 0x6521049d, + 0x4efe8e03, + 0x01b007fb, + 0x03d0070c, + 0x141e84bc, + 0x270cc1d8, + 0x07b43d40, + 0x7e0d071b, + 0xc153fb5c, + 0xb610bc03, + 0x273027c1, + 0x31d39d40, + 0x9d80dcc5, + 0xdc0530d4, + 0xc51ed38d, + 0xfb8e7cdc, + 0xc007fc4e, + 0x4127c23e, + 0x8e21c49d, + 0x07fa4efc, + 0x07c107d0, + 0x3ea307b2, + 0x8d40a7af, + 0x40270cd4, + 0xd49dd465, + 0x27c4961c, + 0x234b07c1, + 0x22d48d41, + 0xdc9d4d07, + 0x033a0720, + 0x2527684c, + 0x34033101, + 0x44034105, + 0x4027f2a8, + 0x8e21d49d, + 0x39f94efa, + 0x8b420719, + 0x07c10749, + 0x07b007a2, + 0x194626d3, + 0x93230711, + 0x00927cf0, + 0x81be3a07, + 0x3d07002d, + 0xc39d3f6b, + 0x0c9cdc0e, + 0x31bd9930, + 0xed070b07, + 0x0c03c119, + 0x032d0754, + 0x19101ee1, + 0x0b443304, + 0x9244994b, + 0x01033452, + 0xfe702123, + 0xa17e2f6b, + 0x034d07f9, + 0x31b49d41, + 0x49ab4a07, + 0xf98ec43d, + 0x1a39f84e, + 0x4a8b4207, + 0xb207d107, + 0x0899c007, + 0x76191931, + 0x6ef09345, + 0x21be0092, + 0x4a07002d, + 0xd43d4beb, + 0x140c4cdc, + 0x19070c07, + 0x07540c03, + 0xf9707e28, + 0x41234807, + 0x8e31c49d, + 0x07fa4ef8, + 0x7ea107c0, + 0xd007fa13, + 0x06a6cb61, + 0x07110bce, + 0x271d070c, + 0xa93e0c2c, + 0x1d070c07, + 0x99fa2f7e, + 0x0c0708c2, + 0x22871b07, + 0xfa0e3a07, + 0x4eff305e, + 0x07c007fb, + 0x0b231eb1, + 0x5344994c, + 0xd4074433, + 0xdc034c0b, + 0x92449984, + 0x1d07dc0b, + 0x7e164bca, + 0x0c07ff70, + 0xf57e1d07, + 0x31c499f9, + 0x2c270c07, + 0xd44fd60c, + 0xfb4efb8e, + 0xb007d107, + 0x99f9d67e, + 0xc00708b4, + 0x2c274324, + 0x040d1e0c, + 0x38d1c341, + 0x1e2827d1, + 0x46242703, + 0x070b07c6, + 0xff327e1c, + 0x1c070b07, + 0xb55efb0e, + 0x4efb8ef9, + 0x071939f8, + 0x07498b42, + 0x07a207d1, + 0x300b99c0, + 0x45761819, + 0x91b4f093, + 0x2c46be00, + 0xeb490700, + 0xdcd43d4a, + 0x0c072043, + 0x07320c03, + 0x7e2b0718, + 0x0c07f896, + 0x0c031807, + 0x7e2b0743, + 0x4b07f88a, + 0xc49d4123, + 0x4ef88e30, + 0x990461f9, + 0xd0070803, + 0x4c899207, + 0x4733200c, + 0x2bc103cc, + 0x7e1c07c1, + 0x1c07f890, + 0x0d07b007, + 0x07f8c17e, + 0x071907a0, + 0xf9097e0d, + 0x06c6c007, + 0x07120bce, + 0x271c070d, + 0xa17e0c2c, + 0x070d07fe, + 0xf9267e1c, + 0x2a07b846, + 0x1b070d07, + 0x87ff6a7e, + 0x0739072a, + 0x7e1b070d, + 0xb219fe21, + 0x4127d301, + 0x34ab423b, + 0xf98ed305, + 0x0299fc4e, + 0x30019931, + 0x03994207, + 0x07410b20, + 0x3543cac0, + 0x100b16e6, + 0x27311d99, + 0x03d43323, + 0xd00b84dc, + 0x287e1d07, + 0x0b151eff, + 0x532d9920, + 0x330c2c27, + 0x84dc03d4, + 0x1d07d00b, + 0x07fe377e, + 0x0e1d070c, + 0xf8ba5efc, + 0xf94efc8e, + 0xc1071a39, + 0xd0079207, + 0xa3dc1b19, + 0x07a63e12, + 0x30d2990d, + 0x07320c03, + 0xf79e7e1b, + 0x0299141e, + 0x031b0730, + 0xa37e430c, + 0x30d499f7, + 0xd49d4123, + 0xab190730, + 0x07c13d1a, + 0xfc8abe0c, + 0x07100702, + 0xf8057e0d, + 0x0730d299, + 0x2b0d0740, + 0x430c0324, + 0x1b07040b, + 0x617e2f6b, + 0x30d499f7, + 0xd49d4103, + 0x4ef98e30, + 0x998207f5, + 0xf1e30a22, + 0x651c0799, + 0x07c007f2, + 0xf60961a1, + 0x5901217f, + 0x7e44e614, + 0x9027fcbf, + 0xc499a249, + 0x89f24569, + 0xc38922c2, + 0xe6f2551e, + 0x41008b4f, + 0x8b032bf0, + 0x8102f002, + 0x20cd9900, + 0x0331c499, + 0x2bb007d1, + 0xcab123d4, + 0x0b070dbd, + 0x90be1d07, + 0xb0070058, + 0x4127bd0b, + 0xf43df735, + 0x4027f725, + 0xf45df741, + 0xf41d4327, + 0x0c077b2b, + 0x51f9397e, + 0x68c499f6, + 0xf64d678b, + 0xd0075127, + 0x45267103, + 0x1f070c07, + 0x27f7e17e, + 0xd419103c, + 0xc311d35d, + 0x243b2507, + 0xc31532ab, + 0x070cd68d, + 0x271d070c, + 0xfef47e23, + 0xc401d319, + 0x45ab533b, + 0xfbf0c405, + 0x23f441ba, + 0x1ec48d41, + 0x94899686, + 0xcef2410c, + 0xa4190b42, + 0x0b08c399, + 0x1343c043, + 0xd77e0c07, + 0x49f461f8, + 0x07045da3, + 0x0c038d90, + 0xa201c065, + 0xc2251a07, + 0x0c07a311, + 0xa421c335, + 0xaa31c445, + 0x737eca55, + 0x08c199f7, + 0xcd9dd127, + 0xbe09071c, + 0x8902fb5c, + 0x40270c92, + 0x828d8085, + 0x26849d24, + 0xa60ac499, + 0x268d9d44, + 0x4468c499, + 0x26849942, + 0x849d42a3, + 0x9d991926, + 0xc4010b89, + 0x43ebc311, + 0xf1c384b5, + 0xfb4ef58e, + 0x03990461, + 0x89b00708, + 0x33200c4c, + 0xc103cc47, + 0x1c07c12b, + 0x07f63f7e, + 0x071c07d0, + 0xf6707e0b, + 0x2007d686, + 0x0b071d07, + 0x07fd3a7e, + 0x0e1d070b, + 0xf6e25efb, + 0x0461fb8e, + 0x9d080399, + 0x01952802, + 0x200c4289, + 0x03224733, + 0x9d402721, + 0x02b52904, + 0x3027fe0b, + 0x03254027, + 0x0315041d, + 0x4027fe0b, + 0xfe0b041d, + 0x04254027, + 0xfe0b0415, + 0xc6140499, + 0xf55e9e44, + 0xee2c9eff, + 0x14049902, + 0x519e44c6, + 0x1f9efff5, + 0xf04e02ee, + 0xdf3bcf5b, + 0xfc4efe2b, + 0xadbe0f07, + 0xff1effb9, + 0xff1eff1e, + 0x02a9f84e, + 0x40270104, + 0x016603b9, + 0x6d12028d, + 0x07044d04, + 0x6c02a9d0, + 0x823ae001, + 0x6a04a902, + 0x1745f001, + 0x27e12702, + 0x9cd39d30, + 0x139ad28d, + 0xf5f293e0, + 0x2eb503dc, + 0xd48d1027, + 0x05f093ea, + 0x019d03da, + 0xc5412790, + 0x32273024, + 0x23c54327, + 0x8824c55c, + 0x039d3027, + 0x1521050c, + 0x5821c521, + 0x9d8421c5, + 0x019d3801, + 0xa1d3b964, + 0xc9f49301, + 0x431d03d9, + 0x0166d3b9, + 0xd9a6f493, + 0x27410503, + 0xf43ae020, + 0xb2f49301, + 0x421d03d9, + 0xb99cd399, + 0x8301a2d4, + 0xe6b38731, + 0xd100a84f, + 0x990150dc, + 0x1c0746c4, + 0xc4461c03, + 0x2c271142, + 0xe832071a, + 0xc01419f3, + 0xdcd1f842, + 0xac070150, + 0x2748ac03, + 0x0ea7602c, + 0x07e8ffff, + 0x1f79be1a, + 0x032c0700, + 0xe027a82c, + 0xff9f9ea7, + 0x5fcea7e8, + 0x0227e8ff, + 0x0e2b1907, + 0xe1032301, + 0x24211305, + 0x23411415, + 0x24611325, + 0x23111435, + 0x24311345, + 0x23511455, + 0x24711365, + 0x23811475, + 0x24a11385, + 0x23c11495, + 0xc113a530, + 0x14b53824, + 0x13c52391, + 0xc524b130, + 0x23c13414, + 0x3813c534, + 0x073c24c1, + 0x0326332e, + 0x14c5602c, + 0x072a0b3c, + 0x30f0f81c, + 0x00bda301, + 0x9ad4b901, + 0xfa4fe601, + 0x278b0700, + 0x0000003f, + 0x008ea330, + 0xd4d10200, + 0x2c270160, + 0xab83ab30, + 0xfa41e082, + 0x9fd2b900, + 0xa0d1b901, + 0x932f4b01, + 0x03d8cbf4, + 0x2f031f4b, + 0x0003faec, + 0xf393e0a7, + 0x0303d8c0, + 0x03faec1f, + 0x93420500, + 0x03d8a3f4, + 0xfb9300a7, + 0x9303d890, + 0x03d88ffa, + 0xd88ef993, + 0x05c02703, + 0x934e0d31, + 0x03d88bf3, + 0xd880f493, + 0x3da02d03, + 0x054e0d9c, + 0x0db02d30, + 0x1da00db0, + 0xff0ea79c, + 0x0805ebff, + 0x019bd3b9, + 0x019cd1b9, + 0x21074307, + 0x830f4c83, + 0x44330f2c, + 0x38032833, + 0x3c8342ab, + 0x3318030f, + 0x4fa30c3c, + 0x53100001, + 0xab0f1c83, + 0x101c3343, + 0x041541ab, + 0x0160d3d1, + 0xd48d4027, + 0x7531c0f4, + 0xc69cd499, + 0x4c27654f, + 0xecd48d40, + 0x89103c27, + 0x2027ecd4, + 0x4d834533, + 0x34ab3f00, + 0xffff4ea7, + 0x5c43c5eb, + 0xffff3ea7, + 0xe832d5fe, + 0x0ef29b1d, + 0xe027f88e, + 0xea5e3027, + 0x278b07fd, + 0x0000003f, + 0x008ea320, + 0xd4d10200, + 0x2c270160, + 0xab83ab40, + 0x0a41e482, + 0xa1d4b9ff, + 0x33418301, + 0x84ab1a4c, + 0xf6ff585e, + 0x5efe77ef, + 0x4c27fe6e, + 0x279b1e20, + 0xfe0b5e21, + 0x020cd4d1, + 0xb92844d8, + 0x27019bd4, + 0x0800183e, + 0xd4b94956, + 0x4896019c, + 0x8d284c27, + 0x7c5eecd4, + 0x6a04a9ff, + 0x27224701, + 0x5e3127e0, + 0xd4b9fd81, + 0x3e27019b, + 0xc6088098, + 0x4c27d94f, + 0xecd48d30, + 0x4eff5a5e, + 0x27c007fc, + 0xedf09313, + 0x5dbe008b, + 0xc1110026, + 0x8bfaf093, + 0x2652be00, + 0x93c12100, + 0x008c01f0, + 0x002647be, + 0xf093c101, + 0xbe008c08, + 0x3100263c, + 0x0ff093c2, + 0x1027008c, + 0x00262fbe, + 0xf093c241, + 0x27008c02, + 0x2622be11, + 0x93c25100, + 0x008bf5f0, + 0x15be1227, + 0xc2610026, + 0x8be8f093, + 0xbe132700, + 0x71002608, + 0xdbf093c2, + 0x1427008b, + 0x0025fbbe, + 0xf093c281, + 0x27008bce, + 0x25eebe15, + 0x93c29100, + 0x008bc1f0, + 0xe1be1627, + 0xc2a10025, + 0x8bb4f093, + 0xbe172700, + 0xb10025d4, + 0xa7f093c2, + 0x1827008b, + 0x0025c7be, + 0x9330c2c1, + 0x008b99f0, + 0xb9be1927, + 0xc2c10025, + 0x8bf09334, + 0x1a27008b, + 0x0025abbe, + 0x9338c2c1, + 0x008b7df0, + 0x9dbe1b27, + 0xc2c10025, + 0x6ff0933c, + 0x1c27008b, + 0x258ebe0c, + 0x40c2c100, + 0x8b60f093, + 0x0d1c2700, + 0x00257fbe, + 0x9344c2c1, + 0x008b51f0, + 0xbe0e1c27, + 0x1e002570, + 0x5bf04eff, + 0x2bdf3bcf, + 0x07fc4efe, + 0xfc32be0f, + 0x0efc0eff, + 0x4eff0bf0, + 0x3bcf5bf0, + 0x4efe2bdf, + 0xbe0f07fc, + 0x1efffedf, + 0x1eff1eff, + 0x23fe0bff, + 0x4127180c, + 0x40270410, + 0xfe0b0407, + 0xd00c0c54, + 0x06271d06, + 0x0cc0fe0b, + 0x0cd02312, + 0x0cc01b12, + 0x0cd0f114, + 0x0cc01314, + 0x00a70f15, + 0x04d4fe0b, + 0x0901d00c, + 0xfe0b0427, + 0xfe0b0727, + 0xfe0b0527, + 0x1e160c10, + 0x3b4127c8, + 0x004e3840, + 0x06273380, + 0x4ed8fe0b, + 0xec0c7e00, + 0xfe0b0527, + 0x0c30fd4e, + 0x1ed0a712, + 0x3b41270d, + 0xbc4ed840, + 0x2709036d, + 0x2bce3ed0, + 0xd8fd8e0d, + 0xe692434d, + 0xc13ed127, + 0xfd8e0d2b, + 0x853efe4e, + 0xfe8e0123, + 0xb007fb4e, + 0xf0931427, + 0xbe008adb, + 0x110024a4, + 0xe8f093b1, + 0x99be008a, + 0xb1210024, + 0x8aeff093, + 0x248ebe00, + 0x93b10100, + 0x008af6f0, + 0x002483be, + 0xf093b231, + 0x27008afd, + 0x2476be10, + 0x03db0700, + 0x31c127d4, + 0x931c07d2, + 0x008ae8f0, + 0x61bec103, + 0xd4030024, + 0xec0fccc4, + 0xfb0e0b07, + 0x4eff125e, + 0xea09b9f5, + 0x07f96301, + 0xe04027d0, + 0x2312399a, + 0xa8d49d96, + 0x4f6b4907, + 0x30279603, + 0x31274214, + 0x4f6b4307, + 0xb9a9d49d, + 0xb90214d8, + 0xa90215d7, + 0x860212da, + 0xa9a15344, + 0x270210de, + 0x32d2b941, + 0xa9340702, + 0x0701f0d0, + 0x07c423c8, + 0x3b383b1e, + 0xa9212347, + 0x0b01eedb, + 0x230c3b2a, + 0x23312311, + 0x0b3e0b41, + 0x07e2074a, + 0x07bc3ba1, + 0x5b385bc0, + 0x53e75b47, + 0xab2553a5, + 0x99185bcf, + 0xd38da8d0, + 0x9ed48d9c, + 0x8da2d18d, + 0xda8da0de, + 0xa4d28da6, + 0x8d98db8d, + 0x04e69adc, + 0xd48d4c47, + 0xd140279a, + 0xbd01e4d3, + 0xe002cfd4, + 0x07110631, + 0xe04d034d, + 0x43429901, + 0x02bad2bd, + 0xbd444499, + 0xf602bbd4, + 0xb9017e9f, + 0xe60216d4, + 0x2705344f, + 0xd3ad803c, + 0xd3b9014c, + 0x4c270232, + 0x4ad4ad2c, + 0xb9d3bd01, + 0x27b22702, + 0x279127a2, + 0xc9f19330, + 0xf29303f6, + 0x2703f6cc, + 0x15241d40, + 0x05233d13, + 0xc5f49313, + 0x20a703f6, + 0xf6aaf193, + 0xb5f09303, + 0xfe9303f6, + 0xd103f6b8, + 0x050228dc, + 0x2d402743, + 0x2d120d12, + 0x2d040de2, + 0x27e20d03, + 0x27202700, + 0x3207221c, + 0x41273153, + 0x4c8b433b, + 0x20fd4546, + 0x0004f4cc, + 0x21030103, + 0xd4b9f138, + 0xd39902b9, + 0x164c33a8, + 0x00004f83, + 0x32a30700, + 0xac3334ab, + 0x333aab0e, + 0x39ab129c, + 0xab15bc33, + 0xff2ea73b, + 0x2305e7ff, + 0x02bbd4b9, + 0x02bad3b9, + 0x833f4c83, + 0x46333f3c, + 0x241543ab, + 0x0290d3d1, + 0x00ae34f8, + 0x30012d27, + 0x0220d4b9, + 0x021fd3b9, + 0x33834383, + 0x47333533, + 0x42ab43ab, + 0xffff3ea7, + 0x5034c5e7, + 0x01a4d4a9, + 0x80004d83, + 0xd4d14606, + 0x41f801c0, + 0x40270435, + 0x02cfd4bd, + 0xd8d14027, + 0xd4bd0288, + 0xf8c50338, + 0xa7302738, + 0xfddfff4e, + 0x02b6deb9, + 0xb9c443c5, + 0xc50216d2, + 0x24f654f3, + 0xfbc5b127, + 0xeadcb954, + 0x54f0c101, + 0xc183c253, + 0x0648fcc5, + 0x48f2c109, + 0xf2c521c3, + 0xd1f2353c, + 0xb90284d4, + 0xe002b9d1, + 0x115b5a4c, + 0x155b4cd4, + 0x03d44ff6, + 0xf3c53027, + 0x27481e30, + 0x3cf1c510, + 0xdc1ef135, + 0x36b44cc0, + 0x010e4de0, + 0xff1e1141, + 0x10012d27, + 0xe4ff535e, + 0xb9fe8a9a, + 0x270232d4, + 0x4447503c, + 0x02b9d4bd, + 0x4d27b427, + 0xa4270100, + 0xd3ad9227, + 0xd4ad014a, + 0x845e014c, + 0xc58227fe, + 0xf0c130f8, + 0x12d4a948, + 0x31c10702, + 0x03407bf2, + 0xd2bd0fcc, + 0xc40b02b8, + 0x0210d3a9, + 0xf4c1c473, + 0x7cfcc53c, + 0x2640f3c5, + 0xe3c10345, + 0x7cfcc5c1, + 0x01f2d9a9, + 0x01f4d5a9, + 0x0738fbc1, + 0x66850729, + 0x073127b7, + 0x54fcc14b, + 0x23074103, + 0x4c0b243b, + 0x2013343b, + 0x538b3013, + 0xd0a9298b, + 0xd4a901f8, + 0xf0c501f6, + 0x48f3c184, + 0x3b84f7c1, + 0x4cf4c513, + 0x0280d0d1, + 0x710b420b, + 0xf4c56507, + 0xe0670b50, + 0x4201210d, + 0x210de007, + 0xc1073c11, + 0xc8263cfc, + 0xe630f2c1, + 0xe00e582f, + 0xc10e5422, + 0xf4c14cf3, + 0x03330350, + 0xe333e343, + 0x4cf3c543, + 0x2750f4c5, + 0x0cec1840, + 0x34074127, + 0x0de03f6b, + 0x130f1102, + 0x11030df4, + 0x0de00725, + 0x0e460182, + 0x01830df4, + 0x0de00e28, + 0x15940102, + 0x01210de0, + 0x4027154c, + 0x9df5d49d, + 0x2127f4d4, + 0x3027f325, + 0xf2c5f2a5, + 0x5cf3c558, + 0xc560f3c5, + 0xf3c534f3, + 0x78f3c564, + 0xc568f3c5, + 0xf3c56cf3, + 0xbdf42170, + 0xe602d0d2, + 0xc106cc4f, + 0xbff684fb, + 0x125306c0, + 0x4fab4107, + 0xad38fcc1, + 0xe60326d4, + 0x073127ca, + 0x54fec14c, + 0x23074103, + 0x4e0b243b, + 0xc150f0c1, + 0x343b4cf1, + 0x2fa32013, + 0xffff0000, + 0x3fa33013, + 0xffff0000, + 0x128b028b, + 0x8b50f0c5, + 0x4cf1c563, + 0xf221738b, + 0x026e2fe6, + 0xb984f3c1, + 0x270216d4, + 0xc5f365b0, + 0xfcc174fb, + 0x2744f64c, + 0x74fec5e1, + 0xffffbea7, + 0x46b0b9ff, + 0xb948270d, + 0x0702b6da, + 0x38d0bd79, + 0xbd980703, + 0x830339d4, + 0x83fffe7d, + 0xfcfffe9d, + 0x270f8aa4, + 0xd8b02700, + 0x2ea724a8, + 0x07ffffff, + 0x3e23a947, + 0x124f8b0d, + 0x07430743, + 0x4023a909, + 0x8bb4070d, + 0x12bfab0f, + 0xab030703, + 0x74f1c10f, + 0x4774f2c1, + 0xa3810711, + 0xff8dc381, + 0x8b4807ff, + 0x2721034b, + 0x3bb40731, + 0x23bf8b32, + 0x88f1c521, + 0xc58cfbc5, + 0x088b74f2, + 0x070c3bd2, + 0x074fab43, + 0xc5ef8be4, + 0x10078cfe, + 0xf1c51f8b, + 0x0c31d280, + 0x0fab0307, + 0x2f8b2007, + 0x6d80f2c5, + 0x2df44df0, + 0x01f70df9, + 0x07f111f0, + 0x033d072d, + 0x0303303d, + 0xbe032c2d, + 0x27030de6, + 0x38d3b940, + 0x36d4ad03, + 0x34d4ad03, + 0x10dba903, + 0x12dea902, + 0x30d9d102, + 0xc73ff603, + 0x2cd7d10e, + 0x009d2303, + 0x007d2301, + 0x07a90701, + 0x03a15367, + 0x5301009d, + 0x007d0361, + 0x04012701, + 0x07002732, + 0xb94f8b4e, + 0x2b0339d1, + 0xc2413b40, + 0x2407144a, + 0xd4a93a07, + 0x390b0336, + 0xd4ad4103, + 0x32ca0336, + 0x009d04f2, + 0x36dead01, + 0x8b4b0703, + 0x3b402b4f, + 0x1446c241, + 0x36072407, + 0x0334d4a9, + 0x4103370b, + 0x0334d4ad, + 0x04f232ca, + 0xad01007d, + 0xc10334db, + 0xd3a984fb, + 0xd2a90334, + 0xb50b0336, + 0x288b4807, + 0xb02b438b, + 0x0334d4ad, + 0x0336d2ad, + 0xbae2b13b, + 0xf5c10e2d, + 0xe2513b84, + 0x0713325a, + 0x27390b3a, + 0x1ab3e281, + 0x07390b0e, + 0x07492b43, + 0xca8103a8, + 0x9d00f045, + 0xfa650100, + 0x1b50f3c1, + 0xe2013b03, + 0xc105b106, + 0x413b4cf4, + 0x46e21407, + 0xb60712fa, + 0x9127b70b, + 0x059c0be2, + 0x4b07b70b, + 0xa907472b, + 0x41ca9103, + 0x007d00f0, + 0xc1ca0701, + 0xf36188f4, + 0x4f0b41a3, + 0x4c8b348b, + 0x12c730e8, + 0x40e80407, + 0x420712bc, + 0xc180f2c1, + 0x4f8b8cf1, + 0x100b230b, + 0x12a042fa, + 0x0334daa9, + 0xa1faaf8b, + 0x30081288, + 0x273c24d2, + 0x38f19304, + 0xa39e0085, + 0x475e0021, + 0x9cd4d1fc, + 0xc04cf801, + 0xc35efbcc, + 0x32d4b9fb, + 0x503c2702, + 0xd4bd4447, + 0xb22702b9, + 0x27e04c27, + 0xad9227a4, + 0xad014ad3, + 0x5e014cd4, + 0xa1dafacb, + 0x74f8c1c3, + 0x487b6207, + 0xd4ad7307, + 0x687b0336, + 0xc54cf0c5, + 0x787b50f1, + 0xe654fbc1, + 0xc10198bf, + 0x518330f5, + 0x01945fe6, + 0x01c0d4d1, + 0x01c4d3d1, + 0x01c8d2d1, + 0x33474447, + 0xf4752247, + 0xf295f385, + 0x0230d1b9, + 0x3330f2c1, + 0x44f1c514, + 0x04c921e0, + 0x032121f4, + 0x3fe6f321, + 0xf8c10f5b, + 0xf4d3994c, + 0x714cf4c1, + 0xc58103f9, + 0x979b4cf8, + 0x7103433b, + 0x34071807, + 0xd4992707, + 0xc11153f5, + 0xfc914cfe, + 0x2153fa81, + 0xb43bb107, + 0xa29bc29b, + 0xd8b9e123, + 0x930b02b8, + 0xc10bab0b, + 0xfec57123, + 0xe65f6b4c, + 0x2702dc5f, + 0xfbc1103c, + 0x0743076c, + 0x034b3b28, + 0x60fec121, + 0x427b1407, + 0x4e3b187b, + 0xd1d5327b, + 0xd4d502ec, + 0xd3d502f0, + 0xfb2102f4, + 0xfec1b876, + 0xecd4d138, + 0xf0d3d102, + 0xf4d2d102, + 0x5b4e5b02, + 0xd52e5b3e, + 0xd502ecd4, + 0xd502f0d3, + 0xc102f4d2, + 0x428330f4, + 0xd4d14806, + 0xd3d102ec, + 0xd2d102f0, + 0x401302f4, + 0x20133013, + 0x02ecd4d5, + 0x02f0d3d5, + 0x02f4d2d5, + 0xf654f0c1, + 0xd1028c0f, + 0xd101a8d4, + 0xd101acd3, + 0x2b01b0d2, + 0x2b3a2b49, + 0xd5f1212c, + 0xd502d4d4, + 0xd502d8d3, + 0xd502dcd2, + 0xd502e0d0, + 0xd502e4d0, + 0xad02e8d0, + 0xad0322d7, + 0xc60324d6, + 0x03710316, + 0x07470761, + 0x53415336, + 0x28d4ad31, + 0x2ad3ad03, + 0x7cfec103, + 0x01ecd4b9, + 0x0320dead, + 0x012744e6, + 0xc15cf0c5, + 0xf1c140f6, + 0x0f6c0378, + 0x1ff66473, + 0x760701e8, + 0xe65cf2c1, + 0xb901662f, + 0xf6021fd4, + 0xb90a964f, + 0xf60220d4, + 0xc10a8e4f, + 0x0fe664f0, + 0xd8b91076, + 0x1d270187, + 0x4d270200, + 0x8b5e8002, + 0x30f5c10a, + 0xdcd15183, + 0xfc7501c0, + 0x01c4ded1, + 0xd0d1fe85, + 0xf09501c8, + 0xd1fe735e, + 0xf80290d4, + 0x2501004d, + 0xbed0a90b, + 0x7cf2c101, + 0x073cf3c1, + 0x03443347, + 0x07435b21, + 0x03b20730, + 0xac037f1c, + 0x3321237f, + 0x7f1ce334, + 0x537face3, + 0x7cf2c5b1, + 0x02fcd4d5, + 0x0308d3d5, + 0x3ea74027, + 0xd5fddfff, + 0xd101f034, + 0xf80290d2, + 0x9201002d, + 0x0777030a, + 0x039707c0, + 0xe397e3c7, + 0x074907c7, + 0x0748230a, + 0x0703333c, + 0x23433321, + 0x9b419b38, + 0x33a63330, + 0xd1163323, + 0xd501c0de, + 0xd50300d2, + 0xd50310d1, + 0xd50314d4, + 0xd50318da, + 0xd5031cd3, + 0x23030cd0, + 0x6ee2f877, + 0x7cf0c10a, + 0x033cf1c1, + 0x03015bb7, + 0x33943307, + 0xc507e3c4, + 0xb7e37cf0, + 0x10001d27, + 0x0fff2da7, + 0x02fcd9d5, + 0x0308dcd5, + 0x863cf3c1, + 0x00d4d135, + 0xd5415303, + 0xd10300d4, + 0xc102fcd4, + 0xd3d17cfc, + 0xc49b0308, + 0x41234107, + 0xb39bc40b, + 0x0b7cfcc5, + 0x8b428b4b, + 0xead3b9c2, + 0xf8dcd501, + 0x04d4d502, + 0x7537e003, + 0x78f0c10d, + 0x0a5b0fe6, + 0x01acd3d1, + 0xdfff4ea7, + 0xa8d1d1fd, + 0xb443d501, + 0xff3ea701, + 0x4027fddf, + 0x019834d5, + 0xa7e831c5, + 0xfddfff4e, + 0x1578f1c1, + 0x691fc646, + 0x01c0d4d1, + 0x076242dc, + 0xa7343337, + 0xfddfff4e, + 0xd54cf2c1, + 0xc101b043, + 0x42d550f3, + 0x43d5014c, + 0xf4c10154, + 0x404ce044, + 0x002701e5, + 0xfbc156e6, + 0x81f87154, + 0x7bfe91fc, + 0x7bcb7b8b, + 0x85f875eb, + 0xc1fe95fc, + 0x1ff630f1, + 0xf2210706, + 0x029a2fe6, + 0xf654f3c1, + 0xc107b93f, + 0x4ce044f4, + 0x7e0ab220, + 0xd0c5f5a0, + 0x07055eac, + 0xa01e3027, + 0x01bcd7a9, + 0xe0fe175e, + 0xe0013c22, + 0x1e00d723, + 0xc14427ff, + 0x332770f0, + 0x482b382b, + 0xf291f171, + 0x402bf881, + 0x233b143b, + 0xd1d5833b, + 0xd8d502ec, + 0xd2d502f0, + 0x275e02f4, + 0x48f2c1fd, + 0x09ea2ff6, + 0x3fe6f321, + 0xd2d10d20, + 0xded101b0, + 0xd4d101bc, + 0xd3d101a8, + 0xd1d101ac, + 0xd0d101b4, + 0xd7ad01b8, + 0xd6ad0322, + 0x71030324, + 0xec2b6103, + 0xb6072c2b, + 0x192bc707, + 0x492b0a2b, + 0xc1533a2b, + 0xd4d5b153, + 0xd3d502d4, + 0xd2d502d8, + 0xd1d502dc, + 0xd0d502e0, + 0xded502e4, + 0xdcad02e8, + 0xdbad0328, + 0x5a5e032a, + 0xc12158fd, + 0xb12350fb, + 0xf850fbc5, + 0x23f8ba51, + 0xf8b55e61, + 0x455e4027, + 0xf971cef9, + 0x42534707, + 0x395e4fab, + 0x010de0f9, + 0xf4015480, + 0x3880020d, + 0x210de001, + 0xe40e2f11, + 0xdf12010d, + 0xa50a27f8, + 0x0d215ef0, + 0xefe6fe21, + 0xd1990a33, + 0x54f2c1f4, + 0xf0713607, + 0x3b4cf8c1, + 0x7b610331, + 0x07130702, + 0x99f381c6, + 0x089bf5d4, + 0x8103c153, + 0x074cf8c5, + 0x7be807bc, + 0x54f8c132, + 0xb43bf291, + 0xe153a127, + 0xab2b287b, + 0xfbc19127, + 0x2b2e9b4c, + 0x133e9b91, + 0xb8d8b9c1, + 0x0bb12302, + 0x0ba30b90, + 0xc56123c2, + 0xee5e4cfb, + 0xe6f221fb, + 0xc10a5b2f, + 0xd19950f8, + 0x50f3c1f4, + 0xf8c58103, + 0x07313b50, + 0x07015308, + 0x99fc7113, + 0x4607f5d3, + 0xb0072607, + 0x21234103, + 0x2c9bb33b, + 0xc1274153, + 0xfe91f381, + 0xc02b4123, + 0xf0c19127, + 0x9ba12750, + 0x2b912b34, + 0xb94e9bab, + 0x2302b8d8, + 0x2b922b01, + 0xc5c42ba3, + 0x925e50f0, + 0x5e0927fb, + 0xa0a7fe1c, + 0x21fa705e, + 0xfa0fe6f0, + 0x50f1c108, + 0x2354f2c1, + 0x50f1c511, + 0xf3c1f171, + 0x9b127b50, + 0xc5310313, + 0xd39950f3, + 0x3b9707f4, + 0x50f4c193, + 0x7103f381, + 0x327be707, + 0x0354f8c1, + 0x53f29141, + 0x994153e1, + 0x4123f5d0, + 0xae07287b, + 0xa03b249b, + 0xce07349b, + 0x02b8d8b9, + 0xa32b912b, + 0x7123c22b, + 0xc0fb2c5e, + 0x1280210d, + 0x80220d00, + 0x80020de4, + 0x0127f7a6, + 0x1e64f0c5, + 0xc5b02706, + 0xf2c164fb, + 0xd12a8638, + 0x2701acd3, + 0x27b127c0, + 0xff4ea720, + 0xfba5fddf, + 0xc558fcc5, + 0xfbc55cfb, + 0x34fcc560, + 0xc578fbc5, + 0xfcc568fc, + 0x70fcc56c, + 0x43d5f225, + 0x8e5e01e0, + 0x274027f7, + 0xc5f3a531, + 0xf3c558f4, + 0x60f3c55c, + 0xc534f4c5, + 0xf4c578f3, + 0x6cf4c568, + 0x2570f4c5, + 0xf76b5ef2, + 0x7e0c0c27, + 0x8007f314, + 0xc50ccc27, + 0xd5b9acd0, + 0xa1270231, + 0xa0275200, + 0xb1e0fba1, + 0xb4e00445, + 0x70270441, + 0xecf4fea1, + 0x27050311, + 0xf84e3b41, + 0x0118004e, + 0xb12704f8, + 0xd07ef0a1, + 0xe6f0b5f2, + 0x0703d90f, + 0xf3067e0c, + 0xf0c19007, + 0xc1f13138, + 0x9a0b34f2, + 0x3027902b, + 0xc247912b, + 0x1227081b, + 0xf345f355, + 0x2027e027, + 0x3027f4a1, + 0x140f4c23, + 0x0b312742, + 0x0bbc0bb3, + 0x0b4127b1, + 0x07372bb0, + 0x07300b14, + 0xc11b3b84, + 0x833b34fb, + 0xbff63807, + 0xf69104ab, + 0xf771fb81, + 0xe030fcc1, + 0xf40ba4c1, + 0x910490c1, + 0x71fc81f2, + 0xb1a307f0, + 0x97eff6fe, + 0x078b0704, + 0x51fb4146, + 0x138013fe, + 0x3b8b3b40, + 0x0b830b4e, + 0x13a7074a, + 0x0ba93ba0, + 0xffbea7a1, + 0xb0d5fddf, + 0xbcd50108, + 0xf021010c, + 0x0110b2d5, + 0xbad505d6, + 0xb8d50114, + 0xb4d50118, + 0xf1a1011c, + 0xdfff4ea7, + 0x30f2c1fd, + 0xd51f1c83, + 0xd5010041, + 0xc1010442, + 0xf2c138f3, + 0x54f8c148, + 0xd558fbc1, + 0x33016043, + 0xab488723, + 0xc13b4724, + 0xd4d15cfc, + 0x23ab01e4, + 0x41e02cab, + 0x302703de, + 0x0290d1d1, + 0x410723ab, + 0x01a4d3a9, + 0x46334183, + 0x24ab3f8b, + 0x037530e8, + 0x1df83027, + 0x03a90100, + 0x2364f1c1, + 0x0e1c3351, + 0x00001ea3, + 0xab573304, + 0xf612ab15, + 0xa903703f, + 0xe002acd4, + 0x21033842, + 0xa3e506fe, + 0x0000001f, + 0xff4ea701, + 0x41c5fddf, + 0xff3ea7b4, + 0x4327fdef, + 0x02e034d5, + 0xdce034c1, + 0x1ea7fb48, + 0xc1fdefff, + 0x4ddce014, + 0x27f90800, + 0xe014d544, + 0xe414d502, + 0xd5302702, + 0xa7064013, + 0xfdeb1f2e, + 0x4f272305, + 0x14c20000, + 0xf39b2415, + 0xd543270e, + 0xa702e814, + 0xfdefff3e, + 0xdce834c1, + 0xeea7fb48, + 0xc1fdefff, + 0x4ddce8e4, + 0x27f90800, + 0xe8e4d544, + 0xece4d502, + 0xd5102702, + 0xa70644e1, + 0xfdeb173e, + 0x4f273105, + 0x15020000, + 0xf19b3415, + 0x6f2ea70e, + 0x4c27fde4, + 0x15240510, + 0x000f2721, + 0x35200000, + 0x4f3ea720, + 0x4103fde4, + 0x31153405, + 0x30354327, + 0x02d0e4d5, + 0xefff3ea7, + 0xd034c1fd, + 0xa7fb48dc, + 0xfdefff0e, + 0xdcd004c1, + 0xf908004d, + 0x01d51427, + 0x01d502d0, + 0x302702d4, + 0x067003d5, + 0xeb2f2ea7, + 0x272305fd, + 0x0500004e, + 0xf39b2415, + 0xd801d50e, + 0x7403d502, + 0xd5432706, + 0xa702dc04, + 0xfdefff3e, + 0xdcdc34c1, + 0xdea7fb48, + 0xc1fdefff, + 0x4ddcdcd4, + 0x27f90800, + 0xdcded5e4, + 0x273ea702, + 0x1027fdeb, + 0x4f273105, + 0x02050000, + 0xf19b3415, + 0xaf2ea70e, + 0x4c27fde4, + 0x1524051c, + 0x000f2721, + 0x35a00000, + 0x9f3ea720, + 0x4103fde4, + 0x31153405, + 0xded53035, + 0xd1d50308, + 0x43270648, + 0x030cd4d5, + 0xefff3ea7, + 0x0c34d1fd, + 0xfa48dc01, + 0xefff0ea7, + 0x0c04d1fd, + 0x004ddc01, + 0x1427f808, + 0x030c01d5, + 0xeaf73ea7, + 0x052027fd, + 0x004f2732, + 0x1515c200, + 0x0ef29b34, + 0xe3df3ea7, + 0x124c27fd, + 0x32153405, + 0x00004f27, + 0x3435a000, + 0x031001d5, + 0x064c02d5, + 0x04d54327, + 0x3ea70314, + 0xd1fdefff, + 0xdc011434, + 0x1ea7fa48, + 0xd1fdefff, + 0xdc011414, + 0xf808004d, + 0x14d54427, + 0x2ea70314, + 0x27fdeaef, + 0x27230530, + 0x0200004f, + 0x9b241516, + 0x2ea70ef3, + 0x27fde3bf, + 0x2405134c, + 0x4f272315, + 0xa0000000, + 0x24353327, + 0x031813d5, + 0xefff3ea7, + 0x1834d1fd, + 0xfa48dc01, + 0xefff0ea7, + 0x1804d1fd, + 0x004ddc01, + 0x1427f808, + 0x031801d5, + 0x031c01d5, + 0x02d52027, + 0x3ea706e8, + 0x05fdeae7, + 0x004f2732, + 0x15118300, + 0x0ef29b34, + 0xe38f3ea7, + 0x3a4c27fd, + 0x32153405, + 0x00004f27, + 0x3435a000, + 0x032001d5, + 0x06ec02d5, + 0x04d54327, + 0x3ea70324, + 0xd1fdefff, + 0xdc012434, + 0x3ea7fa48, + 0xd1fdefff, + 0xdc012434, + 0xf808004d, + 0x34d54427, + 0x2ea70324, + 0x27fdeadf, + 0x27230530, + 0x0300004f, + 0x9b241512, + 0x2ea70ef3, + 0x27fde37f, + 0x24053b4c, + 0x4f272315, + 0xa0000000, + 0x2435f943, + 0x0c07f58e, + 0xc1ef2f7e, + 0x900738fe, + 0x0c07ea1b, + 0x3d7efe45, + 0x0bf141ef, + 0x07100b9a, + 0x7ef1450c, + 0xf241ef58, + 0xf4c1f331, + 0x45232b38, + 0x1b2407f2, + 0x41040720, + 0xc1081bfe, + 0x942b34f8, + 0x932bfe55, + 0xe207c847, + 0x095e1027, + 0x5e7127fc, + 0xc007fbc0, + 0xad7e0c07, + 0xc5fb21ee, + 0x8007acd0, + 0xfb98bfe6, + 0xe030fcc1, + 0xf4052ac1, + 0x71009bc1, + 0xff4ea7fe, + 0xf081fddf, + 0x01084ed5, + 0x40d5f191, + 0x41d5010c, + 0xd5b90110, + 0x4f5e0231, + 0xf2d4a9fc, + 0x001ea301, + 0x4cf81000, + 0xa3fcbe1f, + 0x2000001e, + 0xd1fcb65e, + 0x2701c0d4, + 0x8d42fc31, + 0xc11507fc, + 0x112364fe, + 0xec331733, + 0xab1eab0e, + 0x9cd4d112, + 0xc04cf801, + 0xd4d1fc8b, + 0x1da301c0, + 0x48fc8000, + 0x4cf80746, + 0xa3fc7a10, + 0x0100001e, + 0x07fc725e, + 0x64f3c115, + 0x17331123, + 0xab0e3c33, + 0x5e12ab13, + 0xd4b9fc5f, + 0xd3b9021f, + 0x43830220, + 0x33834a33, + 0x3c3324ab, + 0xfc125e0c, + 0x06f3c2e0, + 0x06dcc3e0, + 0xcc27ff1e, + 0xff3e5e0c, + 0x095eb027, + 0x33c2e0fb, + 0x20c3e006, + 0x71ff1e06, + 0x7360a7f7, + 0x5eb0a771, + 0x4027fb54, + 0x7a5e8027, + 0x037303fb, + 0xe373e363, + 0xf1b95e63, + 0x02010de0, + 0x0de40627, + 0xf1dc0281, + 0x270f0c27, + 0xc5f0a520, + 0x0b1e64f2, + 0x2710cc27, + 0xc5fca5e1, + 0x402764fe, + 0x3127f325, + 0xc558f3c5, + 0xf3c55cf4, + 0x34f4c560, + 0xc578f4c5, + 0xf3c568f4, + 0x70f4c56c, + 0x41273227, + 0xd49d2127, + 0xf5d39df4, + 0x07f1c45e, + 0xe04d034d, + 0x43409901, + 0x0232d1b9, + 0x02bad0bd, + 0xb9444499, + 0xbd021fd3, + 0xbd02bbd4, + 0xf602b9d1, + 0xb902463f, + 0xf60220d4, + 0x27023e4f, + 0x3c27344c, + 0x4ad4ad90, + 0x4cd3ad01, + 0xb9d4b901, + 0xff2ea702, + 0x4c33e7ff, + 0x004f8316, + 0xa3070000, + 0x8480024f, + 0xb9240590, + 0xb902bbd3, + 0x8302bad4, + 0x4c833f3c, + 0xab36333f, + 0xd1231534, + 0xf80290d4, + 0x27020b44, + 0xb930012d, + 0xb9021fd4, + 0x830220d3, + 0x33338343, + 0xab453337, + 0x004da343, + 0xa742ab40, + 0xe7ffff3e, + 0x5e5034c5, + 0x4127ef68, + 0xc1edc65e, + 0x3ff664f3, + 0xd8b90096, + 0x1d270187, + 0x4d2701e0, + 0xd2d18021, + 0x281801c0, + 0x38304ce3, + 0x47e3102c, + 0x4cf841a3, + 0xf8009620, + 0x27008b42, + 0xc10290ad, + 0x4fe678f4, + 0x21f8f56f, + 0xfbc103e8, + 0xbed0a97c, + 0xc5b10301, + 0xfec17cfb, + 0xc147077c, + 0x44333cfc, + 0x1c033007, + 0x7fac037f, + 0x34334c5b, + 0xd4d5e123, + 0xd3d502fc, + 0x1ce30308, + 0x7face37f, + 0xfec5b153, + 0x5222dc7c, + 0x0308d3d1, + 0xdfff4ea7, + 0xf043d5fd, + 0x7221fc01, + 0x9b179bf5, + 0x00d1d5a0, + 0x7f2ca703, + 0xd5801c27, + 0x5e030cda, + 0xd8b9f5cc, + 0x1d270187, + 0x4d270290, + 0x6b5e8022, + 0x001d27ff, + 0xff2da710, + 0xf5b25e0f, + 0x01e0ad27, + 0xd8ff765e, + 0xad270c42, + 0x6c5e0200, + 0x1e3027ff, + 0x80ad27b0, + 0xff615e01, + 0xa97cf4c1, + 0x0301bed0, + 0x7cf4c541, + 0x073cfbc1, + 0x5b443347, + 0x7cfcc14b, + 0x077cfbc1, + 0x33c12330, + 0xc5b15334, + 0xd4d57cfc, + 0xd3d502fc, + 0xe15e0308, + 0x334807f4, + 0x2b833345, + 0x9042f148, + 0xf1ff0001, + 0x00019841, + 0xff3ea7ff, + 0x32d5fddf, + 0x9a5e01b4, + 0xc54127f5, + 0xf75e30f4, + 0xc5b327ee, + 0xef5e30fb, + 0x5ea0a7ee, + 0x3100f1f2, + 0x03ca32e0, + 0x032cd7d1, + 0xa0276027, + 0xa9f1485e, + 0x070d42b1, + 0xbe0f8b07, + 0xa9003e6a, + 0x070d44b1, + 0x8b0907b0, + 0x3e5cbe0f, + 0xabbfab00, + 0xf05d5e0f, + 0x01ead4b9, + 0x037d46e0, + 0xbfe6fb21, + 0xd0a902e7, + 0xd3d10326, + 0xd2d101b4, + 0xd1d101b8, + 0xd7ad01bc, + 0xd6ad0322, + 0x71030324, + 0x1c2b6103, + 0xc607e707, + 0x392b4027, + 0xe1532a2b, + 0x0153c153, + 0x02d4d3d5, + 0x02d8d2d5, + 0x02dcd1d5, + 0x02e8d4d5, + 0x0328dead, + 0x032adcad, + 0x0326d0ad, + 0x02e0d4d5, + 0x02e4d4d5, + 0x27f3705e, + 0x3c273c4c, + 0x4ad4adb8, + 0x4cd3ad01, + 0xfdc35e01, + 0x10012d27, + 0x27fdf65e, + 0x4c5e0c0c, + 0x54f3c1f5, + 0xc170f1c1, + 0x130b50f4, + 0xf3c1e707, + 0xc1710344, + 0x07076cfb, + 0x01534103, + 0xfcc14153, + 0x2b315360, + 0x07eb3b34, + 0x54f4c120, + 0x8154fbc1, + 0x712c3bfa, + 0x54fcc1f9, + 0xf8c1245b, + 0xc1ab7b50, + 0xfb9144f4, + 0xf1c1917b, + 0x7b482b6c, + 0x9b949bbc, + 0x9bec5bb3, + 0x5b213ba3, + 0xb8d8b90c, + 0x0b9e0b02, + 0x23b00ba2, + 0x38f0c171, + 0x907bcb07, + 0xc07ba07b, + 0xc1f2185e, + 0xf3c16cfc, + 0x54f0c144, + 0xf4c1e607, + 0x3b3c3b70, + 0xb9fc71ec, + 0xc102b8d8, + 0x400b4cfb, + 0x16076103, + 0x9307c47b, + 0x5360f4c1, + 0x9b985b11, + 0x078103cb, + 0xc5b103a3, + 0x21074cfb, + 0x243ba85b, + 0xf4c1a43b, + 0x44fbc14c, + 0xf3c14153, + 0x5b205b54, + 0x90f4c5e0, + 0x816cf0c1, + 0x538123f4, + 0x5b203bb1, + 0x5b437b13, + 0xc1f391b8, + 0xb12b54f0, + 0x2b90f1c1, + 0xc1307ba2, + 0x9e2b4cf2, + 0x419b319b, + 0x9c0b2123, + 0xb30ba40b, + 0xf2c56123, + 0xff6b5e4c, + 0xc150f2c1, + 0xf3c144f1, + 0x03122b54, + 0x50f2c521, + 0xf4c1e207, + 0x44f2c170, + 0x2153f071, + 0xe153430b, + 0x3207047b, + 0x0760f4c1, + 0x6cf8c1b2, + 0xbe2b3e2b, + 0xfec1f971, + 0x3bfa8138, + 0x3b183b34, + 0x3b9e3b38, + 0x54f2c1ae, + 0x8138f8c1, + 0x9bfe91f4, + 0x03427b06, + 0x91e83b61, + 0x54f8c1f2, + 0xc153c607, + 0x2c9b287b, + 0xfcc14c9b, + 0x0b910b50, + 0xb9be0ba3, + 0x2302b8d8, + 0x2b902bc1, + 0x23b22ba4, + 0x50fcc561, + 0x71feec5e, + 0xa7f381f2, + 0xfddfff4e, + 0xf8912013, + 0x0231d5b9, + 0x42d53013, + 0x43d50108, + 0x8013010c, + 0x011048d5, + 0xc1f7255e, + 0xf4c154f0, + 0x68f2c170, + 0xf1c1f971, + 0x0b400b6c, + 0xc1947b12, + 0xf1c54cf4, + 0xc1410368, + 0xf3c14cf1, + 0x4cf4c568, + 0x2407979b, + 0xf8c17103, + 0xc1fa8160, + 0xfb916cf4, + 0x2153133b, + 0x31533707, + 0xfec1480b, + 0x7ba07b4c, + 0x9bc207b0, + 0x3ba39bb3, + 0xb8d8b9c4, + 0x0be12302, + 0x0bac0b91, + 0xc57123b2, + 0x665e4cfe, + 0x0ccc27fe, + 0x0027fca5, + 0x2127e127, + 0xfec5f325, + 0x5cf0c558, + 0xc560fec5, + 0xfec534f0, + 0x78f0c564, + 0xc568fec5, + 0xf0c56cf0, + 0xed135e70, + 0x6678fec1, + 0xacd1d1ea, + 0xf29b5e01, + 0xc17cf3c1, + 0x47073cfb, + 0x01bed0a9, + 0x44333103, + 0xb3074b5b, + 0xf3c53123, + 0x3330077c, + 0xd5b15334, + 0xd502fcd4, + 0x5e0308d3, + 0x4807fc29, + 0x83334533, + 0x41f1482b, + 0xff000190, + 0xd1f2605e, + 0xa901bcd2, + 0xd10326d1, + 0xd101b4d4, + 0x2b01b8d3, + 0x2107072c, + 0x2be607fc, + 0x533a2b49, + 0x53e15301, + 0xd4d4d511, + 0xd8d3d502, + 0xdcd2d502, + 0x22d0ad02, + 0x24dead03, + 0x26d1ad03, + 0xe0dcd503, + 0xe4dcd502, + 0xe8dcd502, + 0xf0975e02, + 0x01a8d4d1, + 0x01acd3d1, + 0x01b0d2d1, + 0x01b4d1d1, + 0x01b8d0d1, + 0x01bcded1, + 0x0a2b192b, + 0x492bec2b, + 0x2c2b3a2b, + 0x02d4d4d5, + 0x02d8d3d5, + 0x02dcd2d5, + 0x02e0d1d5, + 0x02e4d0d5, + 0x02e8ded5, + 0x0322d7ad, + 0x0324d6ad, + 0x21f0505e, + 0x824fe6f4, + 0x26d0a900, + 0xa8d3d103, + 0xacd2d101, + 0xb0d1d101, + 0xfc845e01, + 0x032cd7d1, + 0x6707a907, + 0x6153a153, + 0x27ed7c5e, + 0x278027a0, + 0x81f29140, + 0x5ef071fc, + 0xa307f569, + 0xfc81f071, + 0xa013f291, + 0xc0130013, + 0x70132013, + 0x6013b013, + 0x3a071013, + 0x27f52a5e, + 0x25fea5e2, + 0x272127f3, + 0x5cf3c530, + 0xc534f3c5, + 0xf3c564f3, + 0x68f3c578, + 0xc56cf3c5, + 0xf2c570f3, + 0x60f2c558, + 0x31274027, + 0x9df4d49d, + 0xb65ef5d3, + 0x26d1a9eb, + 0xa8d4d103, + 0xacd3d101, + 0xb0d2d101, + 0x07f82101, + 0x2be60707, + 0x2b3a2b49, + 0x5301532c, + 0xd51153e1, + 0xd502d4d4, + 0xd502d8d3, + 0xad02dcd2, + 0xad0322d0, + 0xad0324de, + 0xd50326d1, + 0xd502e0d8, + 0xd502e4d8, + 0x5e02e8d8, + 0xd5b9ef81, + 0xf2910231, + 0xf071fc81, + 0x80274027, + 0xbe5ea027, + 0x81f071f4, + 0xb9f291fc, + 0x130231d5, + 0x13c01300, + 0x27402720, + 0x5ea02780, + 0x1ea3f4a5, + 0x5e020000, + 0xd8b9f8b6, + 0x1d270187, + 0x4d270180, + 0x175e8001, + 0x07a707fa, + 0x1346078b, + 0x130103a0, + 0x13210380, + 0x3be10340, + 0x3b823ba0, + 0xff035e4e, + 0x1b8cf0c1, + 0x7800e80a, + 0x5e1a07ed, + 0xf3c1ed6e, + 0x1b240780, + 0xed5a5e34, + 0x435e0027, + 0x5e3027ed, + 0xa027ed38, + 0x27ed1c5e, + 0xece45ea0, + 0x41273af6, + 0x01210d04, + 0xc0274027, + 0x4c03b127, + 0x27e2270d, + 0xc5f4a521, + 0xfcc558fb, + 0x60fbc55c, + 0xc534fbc5, + 0xfcc564fc, + 0x68fcc578, + 0xc56cfec5, + 0xfc2570fb, + 0x27eaac5e, + 0x19f19304, + 0xbf9e0072, + 0xbb27000e, + 0x635efba5, + 0x99fc4efd, + 0xd1072604, + 0x1aff4cc0, + 0x35333407, + 0x342b4333, + 0x018c34f1, + 0x4ea3ff00, + 0xf5040000, + 0x00018c34, + 0x072d07ff, + 0x3347334d, + 0x23240b25, + 0xfff73c2e, + 0x07121c27, + 0x03030142, + 0x01e10744, + 0x0511233c, + 0x0334034c, + 0xa7fe9844, + 0xfddfff3e, + 0x08004d27, + 0x020834d5, + 0x020831d5, + 0x4fff4ea7, + 0x114311fd, + 0xc5420700, + 0x4c036823, + 0x01382774, + 0x05040302, + 0xa8440342, + 0xff3ea7f3, + 0x34d1fdef, + 0x4dd8010c, + 0x0710fc6a, + 0xe8432723, + 0x0c23d1f4, + 0x6a3ddc01, + 0x3ea7f4fc, + 0xd1fdefff, + 0xd8011434, + 0x10fc6a4d, + 0x43272307, + 0x23d1f4e8, + 0x3ddc0114, + 0x27f4fc6a, + 0xb8d4fd42, + 0xa7ff0008, + 0xffffff2e, + 0x24bd4127, + 0x23990638, + 0x9b40270f, + 0x41270ef4, + 0x34f53387, + 0xff02b040, + 0xfa4efc8e, + 0x018602b9, + 0x01f20ea9, + 0x02bc04a9, + 0xa007c207, + 0x0447c483, + 0xabd1e553, + 0xa3a902a4, + 0xc90601f4, + 0x46534307, + 0x42234447, + 0x276514c2, + 0xff4ea730, + 0x43d5fddf, + 0xa0b90208, + 0x0e7602d0, + 0xdfff4ea7, + 0xe440c5fd, + 0xd307fa8e, + 0x4d47d553, + 0x28d84223, + 0xab41ea79, + 0x53300700, + 0x073e9b31, + 0xcf2ea743, + 0x4b0bfde3, + 0x2e152405, + 0xbd0bde9b, + 0x4ea72c35, + 0x0bfde3af, + 0x1543053b, + 0x3533274e, + 0xd0a0b94c, + 0xff4ea702, + 0x43d5fddf, + 0x0fc60208, + 0xfcfa8eb0, + 0x27009821, + 0x0b400720, + 0xa74e9b2b, + 0xfde3cf3e, + 0x3405420b, + 0x01033e15, + 0x10270e9b, + 0x4ea73135, + 0x0bfde3af, + 0x15420520, + 0x3533274e, + 0xff4ea741, + 0x43d5fddf, + 0x6f5e0208, + 0x9b2007ff, + 0xc22b0b2e, + 0x4ea73941, + 0x05fde3cf, + 0x034e1542, + 0x270e9b01, + 0x0b423520, + 0xaf4ea70b, + 0x4005fde3, + 0x33274e15, + 0x4ea74235, + 0xd5fddfff, + 0x5e020843, + 0x4ea7ff3a, + 0xd5fddfff, + 0x5e02084c, + 0x41eeff2e, + 0x3ea7ff1f, + 0x05fde3cf, + 0x273e1532, + 0x27343540, + 0xff4ea721, + 0x42d5fddf, + 0x0f5e0208, + 0x532307ff, + 0x5e2e9b25, + 0xfe4eff65, + 0x01e40ed1, + 0xf493ea16, + 0x1102f628, + 0x91f39341, + 0xf49303dc, + 0x1502f634, + 0x113e053e, + 0x41f49342, + 0x1e1502f6, + 0x43111e05, + 0x2e052e15, + 0x3e053e15, + 0x01e40ed1, + 0x02ce0ebd, + 0xf04efe8e, + 0xdf3bcf5b, + 0xfc4efe2b, + 0xdebe0f07, + 0xfc0effe3, + 0xff0bf00e, + 0xcf5bf04e, + 0xfe2bdf3b, + 0x0f07fc4e, + 0xffe45bbe, + 0x2103ff1e, + 0x0319181e, + 0x01031419, + 0x34ce1103, + 0x2301230d, + 0x19001911, + 0x0b042b14, + 0x27f230fe, + 0x4efe0b00, + 0xab4107fe, + 0xd8300740, + 0x151e0f43, + 0x24231e01, + 0x14033e05, + 0x071e3403, + 0x42534207, + 0xf4584103, + 0x14192586, + 0x341d1103, + 0xf2a83103, + 0xfd4efe8e, + 0x03dce007, + 0x2624d029, + 0x3f6b3107, + 0x48334307, + 0x320743ab, + 0x3423e407, + 0xec333253, + 0x03e4ab10, + 0x05400731, + 0x0324234e, + 0x07f3b844, + 0x272103e4, + 0x1d031e40, + 0x0b3e0731, + 0xa8410334, + 0x00fd8ef2, + 0x04110321, + 0x04014342, + 0x411d430b, + 0x41030421, + 0xfe0b0425, + 0x00000030, + 0xf2e3f54e, + 0x5f079307, + 0xb0273f07, + 0x3a037027, + 0x82074027, + 0x5c036027, + 0x95fb850c, + 0x05f3a5f7, + 0x25f115f0, + 0x01c85ef4, + 0x1c40b7b6, + 0x3e0f0725, + 0x01ba5eb8, + 0x40276807, + 0x61237027, + 0xf485b127, + 0xa95ef795, + 0x301c2301, + 0x4f6b4107, + 0xd4301c03, + 0x7536184a, + 0x27301c24, + 0x47f38531, + 0x0b733347, + 0x301c2374, + 0x855e710b, + 0x6c1ce001, + 0x1cd40180, + 0x1ce0206d, + 0x54010663, + 0x1ce0641c, + 0xe4015a25, + 0x01632d1c, + 0x1cc0261e, + 0x1ce42964, + 0x1e015869, + 0x731ce022, + 0x1c3400f6, + 0x701ce474, + 0x131e0149, + 0x0f751cc0, + 0x3e781ce4, + 0x27081e01, + 0x5ef49541, + 0x9001013c, + 0xc4641c00, + 0xcc0a691c, + 0x00130b00, + 0x071eb127, + 0x2b751cc4, + 0xd007b027, + 0x0d07a027, + 0x6cbe1a27, + 0x00f90035, + 0x0001885c, + 0x4a0b4507, + 0x1a27401d, + 0x5ebe0d07, + 0xd0070035, + 0x07e6a103, + 0xa027dd1e, + 0x4c834007, + 0xf935070f, + 0x01886844, + 0x1d3a0b00, + 0x03045334, + 0x270176a1, + 0x91c707b0, + 0x2bca2bf3, + 0x813a76cb, + 0x6647a6f4, + 0x270f07b7, + 0xc57e2d1c, + 0x1eb027fe, + 0x96f3810e, + 0x071d0734, + 0xfeb67e0f, + 0xdc27041e, + 0x07c12320, + 0xbdf3534c, + 0x014103fe, + 0xe241cc31, + 0x0f07b546, + 0x7e2d1c27, + 0xda07fe98, + 0xd50bd123, + 0xd139061e, + 0xa1fe8b7e, + 0x07d123f4, + 0xf3d4ce0f, + 0x061edc07, + 0x23fe7b7e, + 0x270f07d1, + 0xd1cc201c, + 0x01591ef4, + 0x03c90791, + 0x7e0f07c4, + 0x9c07fe64, + 0x9d01611e, + 0xb02774d6, + 0x0d070b1e, + 0x000089be, + 0xb02bb707, + 0x34e6f391, + 0x457e171e, + 0x07b123fe, + 0x0741034b, + 0x201c270f, + 0x1ef041cc, + 0xfe327e04, + 0x0f07d419, + 0xd1031407, + 0xdb0742b6, + 0x217e061e, + 0x07d123fe, + 0x201c270f, + 0x03f4d1cc, + 0x07141e94, + 0xfe0e7e0f, + 0x61190d1e, + 0x057e6103, + 0xc20f07fe, + 0xb027f568, + 0x81198103, + 0xfe361ff6, + 0x10270f07, + 0x21fdef7e, + 0x23f2c3f0, + 0xa3f58e01, + 0x15f305f0, + 0x63fe4ef4, + 0x033f07f0, + 0x7ef30538, + 0xf043fdec, + 0xf083fe0e, + 0x3007fe0b, + 0x01030419, + 0x032b4396, + 0xfb4efe0b, + 0xeea7f063, + 0x05fd4fff, + 0x07c007f2, + 0x01b307d1, + 0x123f9be4, + 0x44334103, + 0xab38e2c1, + 0x1023ce34, + 0xffe30ea7, + 0x0ab8beff, + 0xe8101e00, + 0xa7061ef3, + 0xffffe32e, + 0x36272401, + 0xf1294276, + 0x1303d409, + 0x12732407, + 0x03fc4d10, + 0x0107ff1e, + 0xc4090103, + 0x322b3407, + 0x03fc4d10, + 0x310cff1e, + 0x03fc3d03, + 0x87ec30da, + 0x104c0342, + 0x4d0bf301, + 0x21034305, + 0x03fc2d04, + 0x01072027, + 0x01033b07, + 0x3401111e, + 0x14052103, + 0x2d103403, + 0x2d2303fc, + 0x128703fc, + 0x0b101c03, + 0x0df0301d, + 0xe30ea7d2, + 0x0401ffff, + 0x18be44c6, + 0x4027000a, + 0x270ef49b, + 0xff4ea731, + 0xf043fd4f, + 0xfb8e43a5, + 0xf005f063, + 0x20073107, + 0xe0001f27, + 0x0f271007, + 0x1007d000, + 0x2f5ef043, + 0x05f063ff, + 0x073107f0, + 0x001f2720, + 0x271007c0, + 0x07b0000f, + 0x5ef04310, + 0x0409ff16, + 0xf40df063, + 0x30070449, + 0xf201f42d, + 0x0f273803, + 0x10079000, + 0xa0001f27, + 0xf0431007, + 0x4efef55e, + 0x07a007fa, + 0xbeb10701, + 0x07fffede, + 0x49fc9330, + 0x35030353, + 0x0c072307, + 0x07da4d27, + 0x24231b07, + 0x050c0c03, + 0x15ca25c4, + 0xfc15bec3, + 0x3e0c07ff, + 0x4eff1eae, + 0xf5f493f7, + 0x438905d3, + 0x0a428908, + 0x322b8007, + 0x300c7107, + 0x03fc3d03, + 0x002734d6, + 0x4287f78e, + 0xd0124ce9, + 0x93071007, + 0xac07c303, + 0x9123b207, + 0xb103a273, + 0x4de9c323, + 0x1007d010, + 0x270ca9d2, + 0xd5f19308, + 0x843e006b, + 0x8c2da907, + 0x84298d0d, + 0x0bb9dd24, + 0x89484ce4, + 0x24141e00, + 0xc40bbadd, + 0x1e7e284c, + 0xbbdd000a, + 0xbcddc40b, + 0x8329730b, + 0x370b2707, + 0x2ce33123, + 0x7f3ce37f, + 0x2c032419, + 0xf923c280, + 0x2a07a7c6, + 0xbd103707, + 0xbd2303fc, + 0x4b8703fc, + 0xd01044f1, + 0xb1031007, + 0x34033405, + 0xbd10f238, + 0xbd2303fc, + 0xf39303fc, + 0x8d05d34c, + 0x3f270a3b, + 0x1007e000, + 0x80093b2d, + 0x0bb90dc4, + 0x2774410e, + 0x0e4ee301, + 0x744501fc, + 0x0d40f78e, + 0x06270bbc, + 0x6b59f193, + 0xfef17e00, + 0xf78e0127, + 0xf1930627, + 0x7e006b8a, + 0x831efee3, + 0x14290329, + 0x03fc3d10, + 0x4d10ff1e, + 0xff1e03fc, + 0x042b0307, + 0x0d03000c, + 0xfe0b03fc, + 0x90004f27, + 0x44291007, + 0x34070f6b, + 0x03fc4d10, + 0x03fc3d23, + 0xb0004f27, + 0x44291007, + 0xd2d2f293, + 0x07230d05, + 0xfc4d1034, + 0xfc3d2303, + 0x004f2703, + 0x291007d0, + 0x10234d44, + 0x2303fc4d, + 0x8d03fc4d, + 0x0ba60824, + 0xa0004f27, + 0x44291007, + 0x4d103407, + 0x3d2303fc, + 0x4f2703fc, + 0x1007c000, + 0x232d4429, + 0x4d103407, + 0x3d2303fc, + 0x4f2703fc, + 0x1007e000, + 0x236d4429, + 0x03fc4d10, + 0x03fc4d23, + 0x0b0a248d, + 0x93f84efe, + 0x05d26bf4, + 0x42294309, + 0x322b9007, + 0x3d03300c, + 0x34d603fc, + 0xf88e0027, + 0x4de94287, + 0x10079012, + 0xd303a307, + 0xc207bd07, + 0xb273a123, + 0xd323c103, + 0x901048e9, + 0xbad21007, + 0x9308270d, + 0x006a4ff1, + 0x07fdfe7e, + 0x159805ba, + 0xc5dc509d, + 0xf1930827, + 0x7e006ac3, + 0xb806fdeb, + 0x08030907, + 0xcd103b07, + 0xcd2303fc, + 0x4c8703fc, + 0x901044f1, + 0xc1031007, + 0x04030405, + 0xcd10f338, + 0xcd2303fc, + 0xf39303fc, + 0x2d05d1ec, + 0x003f273c, + 0x271007a0, + 0x8e3c2d01, + 0x93f74ef8, + 0x05d1d7f4, + 0x42694349, + 0x322b9007, + 0x300c7107, + 0x03fc3d03, + 0x002734d6, + 0x4287f78e, + 0xb0124ce9, + 0xa3071007, + 0x8c07c303, + 0xa123b207, + 0xb1038273, + 0x4de9c323, + 0x1007b010, + 0x270d8ad2, + 0xb9f19308, + 0x687e0069, + 0x2d8a07fd, + 0x299d0d9c, + 0xb9dd2494, + 0x484cc40b, + 0x24141e74, + 0xc40bbadd, + 0x1e6a284c, + 0xbbdd000a, + 0xbcddc40b, + 0x94295f0b, + 0x27f94c50, + 0x27f19308, + 0x347e006a, + 0x079029fd, + 0x23070b37, + 0x7f3ce301, + 0x197f0ce3, + 0x803c0334, + 0xc6f930c2, + 0x07170787, + 0xfcbd1038, + 0xfcbd2303, + 0xf14b8703, + 0x07b01044, + 0x05b10310, + 0x38140314, + 0xfcbd10f3, + 0xfcbd2303, + 0x21f39303, + 0x3b6d05d1, + 0xc0003f27, + 0x01271007, + 0xf78e3b2d, + 0xf1930627, + 0x7e0069e8, + 0x971efcdb, + 0x4fff2ea7, + 0x9b2401fd, + 0x4103123f, + 0x22c14433, + 0x2734ab38, + 0x27320e00, + 0xe3fe0b01, + 0x15f205f0, + 0x4ef425f3, + 0xff3ea7fa, + 0x34a9ffff, + 0xf0630d3c, + 0xa107d007, + 0x00ad4fe6, + 0x00a940fa, + 0x0d3834d1, + 0x00a14fe6, + 0x07e6bb3e, + 0xa7122f9b, + 0xfd4fff4e, + 0x1ea74301, + 0x33ffffe7, + 0xd6140134, + 0xab38a343, + 0x1e130532, + 0xe70ea70a, + 0x3fbeffff, + 0xcf270006, + 0x10100000, + 0xa744cbc1, + 0xffffff4e, + 0x0d3840d1, + 0x4fff4ea7, + 0x074401fd, + 0x0b37333b, + 0x304c0303, + 0x4f9b041d, + 0x28ddf912, + 0x0300018a, + 0x043d304c, + 0x4c273f07, + 0x7d0d5d20, + 0x183c0304, + 0x2a070403, + 0x057b1c27, + 0xf8eabef3, + 0xa6d007ff, + 0x48c4c107, + 0x41033b07, + 0xc148c4c5, + 0x310348c4, + 0x0fff3d10, + 0xc3c53027, + 0x44c4c144, + 0xffe70ea7, + 0x05a9beff, + 0x27031e00, + 0x430d07d0, + 0xc3fa0ef0, + 0x4efe0bf0, + 0x073401fa, + 0x07b107c3, + 0xff4fc4a2, + 0x27ffffff, + 0x2d271007, + 0x02270601, + 0x01a43d27, + 0xfef3e5be, + 0x00ccd007, + 0x060d2710, + 0xf3d8be01, + 0x0df493fe, + 0x40050353, + 0xc101cd05, + 0xffff1fc0, + 0x071dffff, + 0x273a072b, + 0xf3bcbe05, + 0x1000ccfe, + 0x01060d27, + 0xfef3b1be, + 0x52e6f493, + 0x8e400503, + 0xbefe4efa, + 0x270007b6, + 0x07f0002f, + 0xe33d2710, + 0x07051e04, + 0x01f4e843, + 0xf842c424, + 0xbd9efe0e, + 0xfb4e0007, + 0xfb9bb027, + 0x00cf270e, + 0x271007f0, + 0x27c30531, + 0x0ef49b40, + 0x4fff4ea7, + 0x3e43a5fd, + 0x05c031c1, + 0x4efb8ecb, + 0x9bc027fb, + 0xbf270efc, + 0x1007f000, + 0xb3053127, + 0xf49b4027, + 0xff4ea70e, + 0x43a5fd4f, + 0xbc059c3e, + 0xfe4efb8e, + 0xffe70ea7, + 0x04c3beff, + 0x27302700, + 0x07f0004f, + 0x8e430510, + 0x7efe4efe, + 0x07e6fe30, + 0xa7122f9b, + 0xfd4fff4e, + 0x1ea74301, + 0x33ffffe7, + 0xd6140134, + 0xab38a343, + 0x8e130532, + 0xe70ea7fe, + 0xfe0effff, + 0x0004b19e, + 0xf105f123, + 0xf325f215, + 0xfb4ef435, + 0x7fff4ea7, + 0x634491d0, + 0xf8b007f0, + 0x008b104c, + 0xe57efdab, + 0x9b07e6fd, + 0x4ea7122f, + 0x01fd4fff, + 0xe71ea743, + 0x3433ffff, + 0x43d61401, + 0x32ab38a3, + 0x0a1e1305, + 0xffe70ea7, + 0x0468beff, + 0xff4ea700, + 0x4401fd4f, + 0xf000cf27, + 0x4c031007, + 0x203c2730, + 0x9d0cc49d, + 0x4f9b0dc3, + 0x0fc39d12, + 0x07304c03, + 0x143c033f, + 0x1d272b07, + 0xc49d03f0, + 0x100f270e, + 0x051007f0, + 0xf722bef3, + 0x154127ff, + 0x0c0f27c4, + 0xbe1007f0, + 0x03fff932, + 0x7ec02501, + 0x0ea7feff, + 0xbeffffe7, + 0xeb0003eb, + 0x0ef043fd, + 0x0bf103fb, + 0x27f84efe, + 0x1000004f, + 0xc14a0110, + 0x49c14048, + 0x484cc144, + 0xdc07ca2a, + 0xdc07051e, + 0xbea7d123, + 0xd1ffffff, + 0x2b0d38b4, + 0x934556da, + 0x006734f0, + 0xd1ff237e, + 0x930d38b1, + 0x00674ef0, + 0xc4ff177e, + 0x2233568f, + 0x9dd45711, + 0x26520fff, + 0x072907de, + 0x9318073c, + 0x006754f0, + 0x9b074a07, + 0x07fef77e, + 0x1eca07bd, + 0x2cd1be1f, + 0x3894d100, + 0x3320070d, + 0x19240b27, + 0x07458624, + 0x60f0931c, + 0xd57e0067, + 0x23c103fe, + 0x270c07b1, + 0xc40fff1d, + 0xffffffbf, + 0xda0bd4ff, + 0x00004f27, + 0x4d051010, + 0x4ea7f88e, + 0xd1ffffff, + 0xc60d3844, + 0x004f2747, + 0x01101000, + 0x01440341, + 0x01440342, + 0x01440343, + 0x26f09344, + 0x915e0067, + 0x4efe0bfe, + 0x634207f5, + 0x074013f5, + 0x076107a2, + 0x07524780, + 0xc5702791, + 0x351e50f4, + 0xd103b309, + 0xfff816be, + 0xb203c00b, + 0x1c270c07, + 0x20f29350, + 0xad0e0067, + 0x27e6d9ce, + 0x07c41d40, + 0x16f09317, + 0x2f070067, + 0xc1fe4b7e, + 0x7a0b50f4, + 0x850b940b, + 0x070967c2, + 0x07d027b8, + 0x43ce1ecf, + 0x4ef58ef5, + 0x236207f5, + 0x077107f5, + 0x13500792, + 0x27a10760, + 0x19301e80, + 0xbed103b3, + 0x0bfff7bf, + 0x07b103c0, + 0x501c270c, + 0x66d7f293, + 0xce9d0e00, + 0x4027e6da, + 0xc41d1807, + 0x66bff093, + 0x7e2f0700, + 0x890bfdf4, + 0x78c2a60b, + 0x0bb8070b, + 0x07d027b5, + 0x03d11ecf, + 0x4ef58ef5, + 0x07b007f9, + 0x07a207d1, + 0x7efcab93, + 0x07e6fbd4, + 0xa7122f9b, + 0xfd4fff4e, + 0x1ea74301, + 0x33ffffe7, + 0xd6140134, + 0xab38a343, + 0x1e130532, + 0xe70ea70a, + 0x57beffff, + 0x4f270002, + 0x1007f000, + 0x43153227, + 0x4d453a03, + 0x4a9d4325, + 0x15499d14, + 0xff7e4b35, + 0xa7d007fc, + 0xffffe70e, + 0x00020ebe, + 0xd5c6fceb, + 0x0d272b07, + 0x1d070202, + 0xfef069be, + 0xf98e0d07, + 0xc007fb4e, + 0xfdabb107, + 0xe6fb677e, + 0x122f9b07, + 0x4fff4ea7, + 0xa74301fd, + 0xffffe71e, + 0x14013433, + 0x38a343d6, + 0x130532ab, + 0x0ea70a1e, + 0xbeffffe7, + 0x270001ea, + 0x07f0003f, + 0x15432710, + 0x35482734, + 0x4534253c, + 0xfc987e3b, + 0x0ea7c007, + 0xbeffffe7, + 0xeb0001a7, + 0x8e0c07fd, + 0x07fc4efb, + 0xab0d66d0, + 0xfb0e7efc, + 0x2f9b07e6, + 0xff4ea712, + 0x4301fd4f, + 0xffe71ea7, + 0x013433ff, + 0xa343d614, + 0x0532ab38, + 0xa70a1e13, + 0xffffe70e, + 0x000191be, + 0xf0004f27, + 0x34271007, + 0x43254315, + 0x687e4d35, + 0xe70ea7fc, + 0x54beffff, + 0xfceb0001, + 0xfc4efc8e, + 0xd107f123, + 0xf193c007, + 0x07006596, + 0x102c270f, + 0xfff3cabe, + 0xfd93d4f6, + 0x07007573, + 0xf664be0d, + 0x21f393ff, + 0x2007034c, + 0x07da4d27, + 0x0c03e307, + 0x15340514, + 0x033c2530, + 0x0cec0321, + 0x43273f07, + 0x34033101, + 0xe403e105, + 0x3459f4a8, + 0x1d073309, + 0x4c0df093, + 0x0de45d03, + 0xf381bee3, + 0xe5f093ff, + 0x17be034b, + 0xff1efff7, + 0x4ea7fc4e, + 0xb9ffffff, + 0x070d1444, + 0xe6c107d0, + 0x33f09345, + 0x1d070065, + 0x3dbe2c07, + 0x0d07fffc, + 0xc9be1c07, + 0x0596fffe, + 0xf1930227, + 0x5e00653a, + 0xfc8eff66, + 0x8ea7f84e, + 0xb9ffffff, + 0x070d1484, + 0x07b10790, + 0x66d307a2, + 0x2af09346, + 0x19070065, + 0x3a072b07, + 0x01be4d07, + 0xcd07fffc, + 0xc227d214, + 0x1b070907, + 0x3c072a07, + 0xfffe12be, + 0x0d1484b9, + 0x45a6d007, + 0x6532f093, + 0xbe1d0700, + 0x76fffbdc, + 0x930227d5, + 0x00653af1, + 0x4127121e, + 0x41234c3b, + 0x45864d8b, + 0xf1930127, + 0x5e006535, + 0xa796fefa, + 0x0000df50, + 0x4d072000, + 0x4fd04b0b, + 0x70000001, + 0x93012723, + 0x00653df1, + 0xdf50e21e, + 0x70000000, + 0x4b0b4d07, + 0x00014f50, + 0x0127f000, + 0x6553f193, + 0x07c91e00, + 0x27f88e0d, + 0x595e0c3c, + 0x054027ff, + 0x27fe0b04, + 0x0ef49b40, + 0xfe0b0405, + 0x3f9b0201, + 0xff4ea712, + 0x4401fd4f, + 0x44330027, + 0x43ab48a3, + 0x0127420e, + 0xfa4efe0b, + 0x3f9bc007, + 0xff4ea712, + 0x4d01fd4f, + 0xd433a407, + 0xd3abd8a3, + 0xf4e8031e, + 0x4627cb01, + 0x37beb356, + 0xc401002a, + 0x44963027, + 0xf39bcd05, + 0x38abc50e, + 0xd4cec401, + 0x27fa8ee4, + 0xff4ea730, + 0x43d5feff, + 0xfe0b0138, + 0x07124f9b, + 0x33348724, + 0xf1232b25, + 0x01001421, + 0x103f9bff, + 0x310b4103, + 0x45331487, + 0x001423f5, + 0x412bff01, + 0x4fff3ea7, + 0xf13311fd, + 0x01000044, + 0x2b1207ff, + 0x2023f534, + 0x23ff0100, + 0xfefff41e, + 0xff682e23, + 0x014727fe, + 0x05140313, + 0xa8240323, + 0xa7fe0bf4, + 0xfd4fff4e, + 0xffff3ea7, + 0x914181fe, + 0x2832d144, + 0x3030d101, + 0x33133301, + 0x1b211b43, + 0x3034d504, + 0x2432d501, + 0x2831d501, + 0x2c30d501, + 0x0bfe0b01, + 0x93fe0bfe, + 0x034c83f4, + 0xfe0b4075, + 0x45334007, + 0x402b0087, + 0x000c41f5, + 0x41f5ff01, + 0x00047228, + 0x4007fe0b, + 0x00874533, + 0x41f5402b, + 0xff010010, + 0x722c41f5, + 0xfe0b0004, + 0x05334087, + 0x0e23042b, + 0x0bfeff68, + 0x27fc4efe, + 0x2c078ccc, + 0xfff31ea7, + 0x0df093fe, + 0x4cbe034b, + 0x2c07fff1, + 0xff671ea7, + 0x89f093fe, + 0x3cbe034b, + 0xf093fff1, + 0xa7034c0c, + 0xfefedb1e, + 0x0e102c27, + 0xf1299efc, + 0x93fe4eff, + 0x034adbf4, + 0x4ff64419, + 0xf49300a2, + 0x07034ad4, + 0x8b2c0324, + 0x2ce33407, + 0x7f3ce37f, + 0x3c033419, + 0xf932c280, + 0x4abaf393, + 0x27202703, + 0x3205234c, + 0xf4c83403, + 0x4b36f493, + 0x03240703, + 0x34078b2c, + 0xe37f2ce3, + 0x34197f3c, + 0xc2803c03, + 0x3c27f932, + 0x19f29323, + 0x1027034b, + 0x21054307, + 0x24033123, + 0xf493f4b8, + 0x35034b94, + 0x15430543, + 0x27432543, + 0x95f39320, + 0x4a27034b, + 0x34033205, + 0x3027f4c8, + 0x40272527, + 0x72b834f5, + 0x34f50004, + 0x00047228, + 0x722c34f5, + 0x34f50004, + 0x000472b4, + 0x001c3c03, + 0x933127f2, + 0x034a37f4, + 0xf193431d, + 0x27034ac0, + 0x0ea78c2c, + 0xbefeff67, + 0x93fff06b, + 0x034a23f1, + 0xa78c2c27, + 0xfefff30e, + 0xfff05abe, + 0x4b2af193, + 0x102c2703, + 0xfedb0ea7, + 0xf049befe, + 0x5efe0eff, + 0x4ea7fe6f, + 0x11fd4fff, + 0xff4ea743, + 0x43d5feff, + 0xfe0b0134, + 0xffff3ea7, + 0xff4ea7fe, + 0x4111fd4f, + 0x013834d1, + 0x013432d1, + 0x422b410b, + 0x013834d5, + 0x4f9bfe0b, + 0x33340712, + 0x2b448735, + 0xff4ea734, + 0x4211fd4f, + 0x002434f1, + 0x422bff01, + 0x002434f5, + 0xfe0bff01, + 0x07124f9b, + 0x87253324, + 0xa7242b44, + 0xfd4fff4e, + 0x23f14411, + 0xff010024, + 0x24f5430b, + 0xff010024, + 0xf293fe0b, + 0xa7034ab0, + 0xfeff673e, + 0x31014727, + 0x21053403, + 0xf4a82403, + 0xffff4ea7, + 0x3844d1fe, + 0x91f39301, + 0x3495034a, + 0x32014a27, + 0x02053403, + 0xf4a80403, + 0x3ea7fe0b, + 0x9dffffff, + 0x41270d30, + 0x063a34bd, + 0x270f3399, + 0x0ef49b40, + 0x33874127, + 0xb04034f5, + 0xff1eff02, + 0xc007fc4e, + 0x00275dbe, + 0x4fff1ea7, + 0x01c319fd, + 0x3b412712, + 0x1d34eb42, + 0x9b4027c3, + 0x14c50ef4, + 0x4efc8e38, + 0x07c007fb, + 0x270ebeb1, + 0x27c21900, + 0x1d2bab40, + 0xe6c43dc2, + 0x9b402705, + 0x3ea70ef4, + 0xc5fd4fff, + 0x40273834, + 0xa70ef49b, + 0xffffff4e, + 0xa70e4399, + 0xfd4fbf1e, + 0x3138328b, + 0x14054127, + 0x14033153, + 0xfb8e32d6, + 0x990d0499, + 0x23070c03, + 0x340744c6, + 0x0399041e, + 0x2343070e, + 0x99400b41, + 0x00990444, + 0x1b45960e, + 0x07302832, + 0x0bfe0b03, + 0x4efe0b03, + 0x07b027fb, + 0x0c0b9dc0, + 0x070ec19d, + 0x0d0b9d21, + 0x04031027, + 0xffeefdbe, + 0xcb3dcb1d, + 0xc203cb5d, + 0xfb8ecb3d, + 0xd007fc4e, + 0x07fbcc27, + 0x81a3be0d, + 0x07004c00, + 0x1ef4e84c, + 0x4efc8ef3, + 0x27d007fc, + 0x0d07fbcc, + 0x00818cbe, + 0x4c07004c, + 0xf31ef4e8, + 0x1f6bfc8e, + 0xf0931536, + 0x0b006167, + 0xf14087fe, + 0x01993c40, + 0x34048600, + 0x28f09314, + 0xfe0b0070, + 0x400b4187, + 0x01104c23, + 0x4efe0b40, + 0x4cf093fd, + 0x45be0061, + 0xdea7fff7, + 0x07fddd83, + 0x001e031d, + 0xd301fde0, + 0xd4032107, + 0x6152f093, + 0xbe125300, + 0xc4fff728, + 0x0222a0df, + 0xfd8ee2ff, + 0x0087f74e, + 0x99580af1, + 0x0bf10001, + 0x0001993c, + 0xf093c107, + 0x07006144, + 0x2772071a, + 0xf6febe80, + 0x1e9027ff, + 0x03cd011c, + 0x66c40391, + 0x93b201d6, + 0x006137f0, + 0x3d071a07, + 0xfff6e3be, + 0xb4038d0b, + 0x07e397ce, + 0x9328071a, + 0x00612ef0, + 0xcd9ef70e, + 0xfa4efff6, + 0x23082a99, + 0x87d207f1, + 0xf1ac8631, + 0x01993c33, + 0x34348600, + 0x7cf393a4, + 0x0a1e006f, + 0x430b4a87, + 0x01104c23, + 0x09de9943, + 0xdb69dc49, + 0xfe054187, + 0xfb25fc15, + 0x995842f1, + 0xdd010001, + 0x4a071007, + 0x60fcf093, + 0xbefd3500, + 0x1efff680, + 0x09249922, + 0xde492c69, + 0x995832f1, + 0x10070001, + 0x6151f393, + 0x17f09300, + 0xfe050061, + 0x5dbefc15, + 0xf103fff6, + 0xfc4efa8e, + 0xffffcea7, + 0x93c101f7, + 0x006142f0, + 0xfff647be, + 0xf093c121, + 0xbe006155, + 0xc1fff63c, + 0xf09348c1, + 0xbe006167, + 0xc1fff630, + 0xf09344c1, + 0xbe006179, + 0xa7fff624, + 0xefffffce, + 0xf093c181, + 0xbe006187, + 0xa1fff614, + 0x9af093c1, + 0x09be0061, + 0xcea7fff6, + 0x21ebffff, + 0xa8f093c1, + 0xf9be0061, + 0xc1c1fff5, + 0xbaf09364, + 0xcea70061, + 0xbee7ffff, + 0x01fff5e8, + 0xc8f093c1, + 0xddbe0061, + 0xc1c1fff5, + 0xdaf09350, + 0xd1be0061, + 0xc121fff5, + 0x61edf093, + 0xf5c6be00, + 0x54c1c1ff, + 0x61fff093, + 0xf5babe00, + 0x58c1c1ff, + 0x6211f093, + 0xf5aebe00, + 0x5cc1c1ff, + 0x6223f093, + 0xf5a2be00, + 0xffcea7ff, + 0xc1d1fbff, + 0xf0930628, + 0xbe00622f, + 0xd1fff590, + 0x930130c1, + 0x006249f0, + 0xfff583be, + 0x0208c1d1, + 0x6263f093, + 0xf576be00, + 0x20c1d1ff, + 0x7df09304, + 0x69be0062, + 0xc1d1fff5, + 0xf0930468, + 0xa7006297, + 0xfeffffce, + 0xfff557be, + 0x0148c1d1, + 0x0148c2d1, + 0x62a8f093, + 0x03228700, + 0x01992c2f, + 0xf53ebe00, + 0x40c1b9ff, + 0xb4f09301, + 0x31be0062, + 0xc199fff5, + 0xc4f09309, + 0x25be0062, + 0xc1b9fff5, + 0xf0931ffd, + 0xbe0062d3, + 0xd1fff518, + 0x931de4c1, + 0x0062e2f0, + 0xfff50bbe, + 0x1de8c1d1, + 0x62f1f093, + 0xf4febe00, + 0xecc1d1ff, + 0x00f0931d, + 0xf1be0063, + 0xc1a9fff4, + 0xf0930144, + 0xbe00630f, + 0xa9fff4e4, + 0x930142c1, + 0x00632af0, + 0xfff4d7be, + 0xefff4ea7, + 0x0041d1fd, + 0x3bf0930f, + 0xc5be0063, + 0x18befff4, + 0x707e0003, + 0xff4ea7fd, + 0x4c01fd4f, + 0x1c074211, + 0x633ef093, + 0xf4aabe00, + 0x270c07ff, + 0x4f2ea710, + 0xd37efee0, + 0x270c07fd, + 0x432ea711, + 0xc77efee0, + 0x270c07fd, + 0x372ea713, + 0xbb7efee0, + 0x270c07fd, + 0x1f2ea714, + 0xaf7efee0, + 0x270c07fd, + 0x132ea715, + 0xfc0efee0, + 0x4efda15e, + 0xffcea7fa, + 0xc1c1fd4f, + 0x93f1236c, + 0x006319f0, + 0xfff457be, + 0x000b3abe, + 0xf0931007, + 0xbe006331, + 0xa7fff448, + 0xffffffde, + 0x9311d199, + 0x006347f0, + 0xfff437be, + 0xc211cb01, + 0xf0931b07, + 0xbe00635f, + 0x07fff428, + 0xa716270b, + 0xfff2f72e, + 0xa7fd517e, + 0xfffffb0e, + 0x4ea70a19, + 0x03fffffe, + 0x19421901, + 0x0341030b, + 0x19431901, + 0x0341030c, + 0x190e1901, + 0x93d11944, + 0x006354f0, + 0xfa05fe35, + 0xfc25fb15, + 0xfff3e7be, + 0x930fd199, + 0x006383f0, + 0xfff3dbbe, + 0x9310d199, + 0x00639ef0, + 0xfff3cfbe, + 0x0638d2d1, + 0x063cd3d1, + 0x0634d1d1, + 0x63b0f093, + 0xf3babe00, + 0x20d1d1ff, + 0xd6f09306, + 0xadbe0063, + 0xd1d1fff3, + 0xf0930628, + 0xbe0063f0, + 0xd1fff3a0, + 0x93062cd1, + 0x00640af0, + 0xfff393be, + 0x9327d199, + 0x006425f0, + 0xfff387be, + 0x9326d199, + 0x006440f0, + 0xfff37bbe, + 0x0a04d1d1, + 0x645af093, + 0xf36ebe00, + 0x02d1a9ff, + 0x74f09301, + 0x1c830064, + 0xf35ebe0f, + 0x08d1b9ff, + 0x8bf09301, + 0x51be0064, + 0xd1b9fff3, + 0xf0930109, + 0xbe0064a5, + 0xa9fff344, + 0x93010ad1, + 0x0064bff0, + 0xfff337be, + 0x64ddf093, + 0xf32ebe00, + 0x0cd199ff, + 0x64e2f093, + 0xf322be00, + 0x2ad199ff, + 0x64fdf093, + 0xf316be00, + 0x12d199ff, + 0x6518f093, + 0xf30abe00, + 0x44d199ff, + 0x6533f093, + 0xf2febe00, + 0x3cd1c1ff, + 0x654ef093, + 0xf2f2be00, + 0x40d1c1ff, + 0x6569f093, + 0xf2e6be00, + 0x24d1d1ff, + 0x83f09306, + 0xd9be0065, + 0xf093fff2, + 0xbe0065a1, + 0xa7fff2d0, + 0xfffb430e, + 0xfffad3be, + 0xf0931007, + 0xbe0065a1, + 0xa7fff2bc, + 0xfffaf30e, + 0xfffabfbe, + 0xf0931007, + 0xbe0065bc, + 0xa7fff2a8, + 0xfeffff4e, + 0x93094c99, + 0x0065daf0, + 0xbc07c383, + 0xb4334c87, + 0xb1f9b42b, + 0xff000050, + 0xffb8be23, + 0xf282beff, + 0x39b403ff, + 0xe0f093b1, + 0x75be0065, + 0xb159fff2, + 0x65fdf093, + 0xf26abe00, + 0x87c103ff, + 0x2bc4334c, + 0x48c1f1c4, + 0x93ff0000, + 0x00660ef0, + 0xfff253be, + 0x662df093, + 0xf24abe00, + 0x28d1b9ff, + 0x2ad2b90a, + 0x2bd3b90a, + 0x30f0930a, + 0x35be0066, + 0xba39fff2, + 0xa827a910, + 0x6650f093, + 0xf226be00, + 0x2ad4b9ff, + 0x2bd3b90a, + 0x1e432b0a, + 0x931c0746, + 0x00664df0, + 0xbe0f1c83, + 0xb9fff20c, + 0x930a28d4, + 0x006649f0, + 0x4c0e1127, + 0xf9be1027, + 0xb027fff1, + 0xb4f9131e, + 0xff000a18, + 0xb1032127, + 0x20274c0e, + 0xfff1e3be, + 0xf0931b07, + 0xce00662d, + 0x4c07e5ba, + 0xc4074103, + 0x0a2ad4b9, + 0xc4cecf6b, + 0x1ec027b1, + 0x18c2f90d, + 0x03ff000a, + 0xf1babec1, + 0x931c07ff, + 0x006611f0, + 0x03ebcace, + 0x4efa8ef1, + 0x93f4e3f6, + 0x0069c7f0, + 0xfff19fbe, + 0xd0277127, + 0x44f14d87, + 0xff021000, + 0xf4953787, + 0x100034f1, + 0xf4a5ff02, + 0x4c3cf491, + 0x1e40a7e0, + 0x334d070b, + 0x0c44f144, + 0xb5ff0218, + 0x3cf4a1f4, + 0x40a7e04c, + 0x47070b1e, + 0x44f14433, + 0xff02180c, + 0x3030f4c5, + 0x402738dc, + 0x4d87091e, + 0x160044f1, + 0xf4c5ff02, + 0x387c3034, + 0x091e4027, + 0x44f14787, + 0xff021600, + 0x2738f4c5, + 0x3cf4c540, + 0xc540f4c5, + 0xf4c544f4, + 0x33f4b148, + 0x1f4c5345, + 0xc13cf4c5, + 0x453330f4, + 0xc51f4c53, + 0xf4b140f4, + 0x4c534833, + 0x44f4c518, + 0x3330f4c1, + 0x184c5348, + 0x9148f4c5, + 0xb1f3a1f2, + 0x004f38f4, + 0xa7200000, + 0x070b1e10, + 0xf144334d, + 0x02180441, + 0x30f4c1ff, + 0x00004f38, + 0x60a72000, + 0x47070b1e, + 0x46f14433, + 0xff021804, + 0x073cfec1, + 0x40fcc141, + 0xfbc11d07, + 0x48fac144, + 0xc134f9c1, + 0xfd5538f8, + 0xd2031153, + 0x6921f093, + 0x05f77500, + 0x25fe15f6, + 0x45fb35fc, + 0x85f965fa, + 0xbe7203f8, + 0xe4fff098, + 0xfefa50dc, + 0x694af093, + 0xf08abe00, + 0xa7c027ff, + 0xffe3ffbe, + 0x1c072c07, + 0xf0932703, + 0xbe006944, + 0x070002cc, + 0x48f0931b, + 0x28270069, + 0x41273827, + 0x96bec803, + 0xbc030000, + 0x20ccc420, + 0x8ef4c3d8, + 0x9bfd4ef6, + 0x4d8712df, + 0x9aec4ef1, + 0x43f10001, + 0x00047400, + 0x07801c27, + 0x0b132b2e, + 0x03041923, + 0x03241d01, + 0x98448621, + 0x232e2bf1, + 0x87420721, + 0xf54f6b3d, + 0x04740034, + 0x23fd8e00, + 0x15f105f1, + 0x35f325f2, + 0x63fe4ef4, + 0x072f07f0, + 0x27280310, + 0x0501070d, + 0xe2f4bef2, + 0x0ef043fe, + 0x0bf103fe, + 0x124f9bfe, + 0x24074487, + 0x74002f03, + 0x41f10004, + 0x00019aec, + 0x30272401, + 0x431d410b, + 0xf0934027, + 0x0500589d, + 0xefce9e24, + 0xa3f54eff, + 0x07f005f0, + 0x07f31591, + 0x124f9ba4, + 0x34074487, + 0x74003f03, + 0x45f10004, + 0x00019aec, + 0x72873601, + 0x231e8307, + 0xc103b301, + 0xffe946be, + 0xb403d00b, + 0x0507f411, + 0x1c270d0b, + 0xcef2010c, + 0x8d05e7c4, + 0x923e970b, + 0xa546a123, + 0xd607b907, + 0xe11ec027, + 0xf58ef083, + 0x87124f9b, + 0x584f0344, + 0x01000442, + 0x35014543, + 0x0b400503, + 0x63fa4efe, + 0x121f9bf0, + 0x4df14187, + 0x00044258, + 0x682ef093, + 0xef4abe00, + 0x012e1eff, + 0x07da11db, + 0xbe0a071b, + 0x41001d25, + 0x07de21dc, + 0x071c0740, + 0x933a072b, + 0x006855f0, + 0x25befe05, + 0x4027ffef, + 0xd405d425, + 0xdd31d415, + 0x4fd6d431, + 0x8ef043cf, + 0x07fc4efa, + 0x9b4307e1, + 0xf39312cf, + 0xf90068b4, + 0x011fa8cd, + 0x1721c8ff, + 0x10073201, + 0x3e072d2b, + 0xf093d103, + 0x7e006836, + 0xdf6bfecf, + 0x3201151e, + 0xdf6bd123, + 0x2d2b1007, + 0xf0933e07, + 0x7e00682f, + 0xcdfdfeb7, + 0xff011fa8, + 0xfc4efc8e, + 0x4307e107, + 0x9312cf9b, + 0x00686bf3, + 0x1fa8cdf9, + 0x21c8ff01, + 0x07320118, + 0x072d2b10, + 0x93d1033e, + 0x00680cf0, + 0xffee9fbe, + 0x161edf6b, + 0xd1233201, + 0x1007df6b, + 0x3e072d2b, + 0x67e5f093, + 0xee86be00, + 0xa8cdfdff, + 0x8eff011f, + 0x05f0e3fc, + 0x25f315f2, + 0x63fa4ef4, + 0x07a007f0, + 0x12cf9b21, + 0x4bf14c87, + 0x00019aec, + 0x3c033f07, + 0x7f1c2718, + 0xf3050b07, + 0xffe5f7be, + 0x67fef493, + 0xa8c3f900, + 0x01ff011f, + 0x2b1a0742, + 0xb0f09323, + 0x3b070067, + 0x43fe1e7e, + 0xc3fa0ef0, + 0xe3fe0bf0, + 0x15f205f0, + 0x4ef425f3, + 0x07f063fa, + 0x9b2107a0, + 0x4c8712cf, + 0x9aec4bf1, + 0x3f070001, + 0x27183c03, + 0x0b077f1c, + 0xa9bef305, + 0xf493ffe5, + 0xf90067b0, + 0x011fa8c3, + 0x074201ff, + 0x93232b1a, + 0x006762f0, + 0xe9be3b07, + 0xf043ffed, + 0xf0c3fa0e, + 0x4f9bfe0b, + 0x07448712, + 0x002f0324, + 0xf1000474, + 0x019aec41, + 0x27240100, + 0x1d410b30, + 0x93402743, + 0x005688f0, + 0xa05e2405, + 0x124f9bfd, + 0x44873027, + 0x740043f5, + 0xfe0b0004, + 0xf105f123, + 0xf325f215, + 0xfa4ef435, + 0x2007f063, + 0x87124f9b, + 0xf1b40744, + 0x019aec4a, + 0x00bf0300, + 0x01000474, + 0x070a07bc, + 0x7f1c273f, + 0x3c031c2b, + 0x050c0b18, + 0xe516bef3, + 0x43c00bff, + 0x050a07f0, + 0x03fa0ebc, + 0x07fe0bf1, + 0xd7f09310, + 0xb11e0066, + 0xf0931007, + 0x1e0066d5, + 0x124f9ba8, + 0x24074487, + 0x74002f03, + 0x23010004, + 0x9aec44f1, + 0x430b0001, + 0x2401401d, + 0x24054103, + 0xfc4efe0b, + 0x2f9b3007, + 0xd5f49312, + 0x41010066, + 0x24f9c287, + 0xff011fa8, + 0x9aecc0f1, + 0x411b0001, + 0x6683f293, + 0x7f1c2700, + 0xffe6aebe, + 0x7400c0f5, + 0xfc8e0004, + 0x3007fa4e, + 0x2f9ba107, + 0xa1f49312, + 0x41010066, + 0x24f9c287, + 0xff011fa8, + 0x9aecc0f1, + 0x411b0001, + 0x664ff293, + 0x7f1c2700, + 0xffe67abe, + 0xcf03b007, + 0x00047400, + 0xcb050a07, + 0x7efc707e, + 0xcb05fccd, + 0x4f9bfa8e, + 0x07448712, + 0x002f0324, + 0x01000474, + 0xec44f123, + 0x0b00019a, + 0x203c2743, + 0x2401431d, + 0x24054103, + 0xfd4efe0b, + 0x3107d007, + 0x87124f9b, + 0x0042f144, + 0x07000474, + 0x07322b04, + 0x033103e4, + 0x019aec0f, + 0xd6120a00, + 0x1e312715, + 0x0b040109, + 0x034d1d42, + 0xf5f3a821, + 0x047400e2, + 0x4efd8e00, + 0x07b007f8, + 0x9b8207d1, + 0x4487124f, + 0xa4079407, + 0x9aec9f03, + 0xaf030001, + 0x00047400, + 0xac01171e, + 0x9401b319, + 0x3f4b0c07, + 0xd8be040b, + 0xc00bffe5, + 0xb103ac05, + 0x1727d123, + 0xdfc42807, + 0xffffffff, + 0x4ef88ede, + 0x07b007f8, + 0x9b8207d1, + 0x4487124f, + 0xa4079407, + 0x9aec9f03, + 0xaf030001, + 0x00047400, + 0xac01151e, + 0xb3199401, + 0x040b0c07, + 0xffe596be, + 0xac05c00b, + 0xd123b103, + 0x28071727, + 0xffffdfc4, + 0x8ee0ffff, + 0x07f94ef8, + 0x9bd107b0, + 0x4487124f, + 0xa4079407, + 0x9aec9f03, + 0xaf030001, + 0x00047400, + 0xac01171e, + 0x9401b309, + 0x3f8b0c07, + 0x54be040b, + 0xc00bffe5, + 0xb203ac05, + 0x1627d123, + 0x6522f293, + 0xffdfc400, + 0xdbffffff, + 0xf94ef98e, + 0xd107b007, + 0x87124f9b, + 0x07940744, + 0xec9f03a4, + 0x0300019a, + 0x047400af, + 0x01151e00, + 0x099401ac, + 0x0b0c07b3, + 0xe511be04, + 0x05c00bff, + 0x23b203ac, + 0x931527d1, + 0x0064e4f2, + 0xffffdfc4, + 0x8eddffff, + 0x07f94ef9, + 0x9bd107b0, + 0x4487124f, + 0xa4079407, + 0x9aec9f03, + 0xaf030001, + 0x00047400, + 0xac01151e, + 0xb3019401, + 0x040b0c07, + 0xffe4cebe, + 0xac05c00b, + 0xd123b403, + 0x930c1c27, + 0x00649bf2, + 0xffffdfc4, + 0x8edcffff, + 0x07f94ef9, + 0x9bd107b0, + 0x4487124f, + 0xa4079407, + 0x9aec9f03, + 0xaf030001, + 0x00047400, + 0xac01151e, + 0xb3019401, + 0x040b0c07, + 0xffe48abe, + 0xac05c00b, + 0xd123b403, + 0xf2931a27, + 0xc4006463, + 0xffffffdf, + 0xf98eddff, + 0x9007f64e, + 0xb207c107, + 0x87124f9b, + 0x03340744, + 0x0474003f, + 0xec46f100, + 0x0100019a, + 0x1e830737, + 0x07cb0230, + 0x27d707cb, + 0x190b1ea0, + 0xbea10343, + 0x0bffe43f, + 0x074907d0, + 0x0b4a0b06, + 0x9314270d, + 0x00641cf2, + 0x05e5cace, + 0x2b9c0b8d, + 0xfa877ebc, + 0x8ecfbfd6, + 0x07f64ef6, + 0x07b10780, + 0x124f9ba2, + 0x34074487, + 0x74003f03, + 0x46f10004, + 0x00019aec, + 0x73073c01, + 0xba02321e, + 0xd807ba07, + 0x0d1e9027, + 0x9103d309, + 0xffe3eabe, + 0xd203c00b, + 0x0c0b0607, + 0xf2931627, + 0xce0063bd, + 0x4b47e7b9, + 0x840b7c05, + 0x327eab2b, + 0xd6c027fa, + 0xf68ecdaf, + 0x8007f64e, + 0xa207b107, + 0x87124f9b, + 0x03340744, + 0x0474003f, + 0xec46f100, + 0x0100019a, + 0x1e73073c, + 0x07ba0232, + 0x27d807ba, + 0x010d1e90, + 0xbe9103d3, + 0x0bffe393, + 0x07d403c0, + 0x270c0b06, + 0x6cf2931a, + 0xb9ce0063, + 0x054b87e7, + 0x2b840b7c, + 0xf9db7eab, + 0xafd6c027, + 0x4ef68ecd, + 0x05f063f5, + 0x07a107f0, + 0x07630752, + 0x124f9bb4, + 0x34074487, + 0x74003f03, + 0x47f10004, + 0x00019aec, + 0x93073801, + 0x4319231e, + 0x40bed103, + 0xc00bffe3, + 0x07074a07, + 0x0c0b4d0b, + 0xf2011827, + 0x05e8d6ce, + 0x7ea50b9c, + 0xb123f98d, + 0xc807b506, + 0xe11ed027, + 0xf58ef043, + 0xf0a3f54e, + 0x9107f005, + 0xa407f315, + 0x87124f9b, + 0x03340744, + 0x0474003f, + 0xec45f100, + 0x0100019a, + 0x07724736, + 0x09231e83, + 0xbec103b3, + 0x0bffe2eb, + 0x11b203d0, + 0x0b0507f4, + 0x0118270d, + 0xe8c4cef2, + 0x970b8d05, + 0x23f9387e, + 0x07a546a1, + 0x27d607b9, + 0x83e11ec0, + 0x27f58ef0, + 0x4304d10f, + 0x01fe0b2c, + 0x1342d004, + 0x32b01301, + 0x204944c0, + 0xc042a434, + 0x14113c32, + 0x112745c6, + 0xfe0b0107, + 0x04113284, + 0x10a742c6, + 0xfe0b0107, + 0x14110311, + 0x3106344e, + 0xf11e10a7, + 0x14210221, + 0x7af442da, + 0x31043124, + 0xeb04ca10, + 0x3fd60442, + 0x1e10a7ce, + 0x071027d8, + 0xc4fe0b01, + 0x1111c934, + 0x142b0411, + 0xfb4ebb1e, + 0x32d00301, + 0xd014012f, + 0x34e02842, + 0x44c000fb, + 0x2242c421, + 0x051d32c4, + 0x15041123, + 0x25042124, + 0x35043124, + 0x11031124, + 0x8b020714, + 0x8e241543, + 0x8e0107fb, + 0xfa32c0fb, + 0x14210c21, + 0xe42bec07, + 0x13310b31, + 0xe0c8de07, + 0x20ecc867, + 0x8c4cfa4c, + 0x27c40700, + 0x110011b0, + 0x7404ce14, + 0x3b2b0f66, + 0x277e30c8, + 0x25241540, + 0x3123352c, + 0x23410721, + 0xff4fd441, + 0x163fffff, + 0x11472321, + 0x41073123, + 0x23252135, + 0x4fd04123, + 0x3fffffff, + 0x054327ee, + 0x2810c824, + 0xfb8e0207, + 0x2752d1c8, + 0x234e3b41, + 0x27438b41, + 0x274486d0, + 0xab3e5bd1, + 0x13a71e3d, + 0x20eccce0, + 0x1be21e99, + 0x21a61e3b, + 0x53310724, + 0xab118331, + 0x07410313, + 0x25213502, + 0x07fb8e24, + 0x15130b1b, + 0x352c2520, + 0x27b31e21, + 0xff775e30, + 0x41273013, + 0x2c252415, + 0x801e2335, + 0xff67dfe6, + 0x4e3b4127, + 0x4b8b4123, + 0xd027ce0b, + 0xd1274486, + 0xbdabbe5b, + 0xe4ff505e, + 0x11ff2a44, + 0xee041113, + 0x93ff2234, + 0x00615ff0, + 0x0001fb8e, + 0x40073007, + 0x53173c53, + 0x20071f4c, + 0x3f6b1415, + 0xffff2e83, + 0xc639d67f, + 0xa7432728, + 0x14057d3c, + 0x13254207, + 0x4f744733, + 0x40000000, + 0x31234447, + 0x00004fd0, + 0x25f64000, + 0x0b143513, + 0x054227fe, + 0xc0fe0b14, + 0x3316ff3c, + 0x7f3c2327, + 0x00002fa3, + 0x43274000, + 0x13251235, + 0xfe0b1405, + 0x44272516, + 0xfe0b1405, + 0x00000e83, + 0x27054610, + 0x35140541, + 0x05fe0b12, + 0x4ef91e10, + 0x07f163f5, + 0x03f0051f, + 0x7e0f0714, + 0xf341ff7a, + 0x23074027, + 0xf0112253, + 0xf12142ab, + 0x3c33f231, + 0x0c79be1e, + 0x43510700, + 0x4ef58ef1, + 0x07f2a3fb, + 0x05b803bf, + 0x07f115f0, + 0x7e1b070f, + 0xcf07ff4a, + 0x0718cc03, + 0x0704030f, + 0xff3c7e1c, + 0x1c070b07, + 0x83fdba7e, + 0x01fb8ef2, + 0x11033104, + 0x6442d002, + 0x005744c0, + 0x2735f642, + 0xab002740, + 0x1f2c3304, + 0xfe0b02ab, + 0x0fc80021, + 0xffffff82, + 0x800ccc5b, + 0x83430739, + 0x0c037f4c, + 0x404cc07f, + 0x3f3c031e, + 0x072130c8, + 0x6b475343, + 0xff4e830f, + 0x0c337fff, + 0x3304ab17, + 0x02ab1f2c, + 0x3cd8fe0b, + 0x3c03e380, + 0x53de1e40, + 0x1e010331, + 0x274027db, + 0x8000000f, + 0x07a91e7f, + 0x004ea343, + 0x4e831000, + 0x277fffff, + 0x8000000f, + 0x13951e7f, + 0xffff820f, + 0x1a0cccff, + 0x3b412753, + 0x8b412340, + 0x86102743, + 0x5b112744, + 0xab030730, + 0x83400701, + 0x4cc07f4c, + 0x40073c40, + 0x073f4c03, + 0x27375334, + 0x004fd001, + 0x20400000, + 0x4e834307, + 0x337fffff, + 0x505e170c, + 0x034007ff, + 0x3407404c, + 0x01273753, + 0x00004fd4, + 0x27e24000, + 0x27de1e00, + 0x1e302700, + 0x800cdcd8, + 0x533007e1, + 0x14412737, + 0x0000000f, + 0x07402740, + 0x4ec21e04, + 0x05f123fe, + 0x150f07f0, + 0x35f225f1, + 0xfef97ef3, + 0xfe8ef103, + 0xf163fd4e, + 0xd403df07, + 0x1d07f005, + 0x137e0f07, + 0x27f421fe, + 0x27449630, + 0x250d0731, + 0xfed57ef3, + 0xfd8ef143, + 0xf2a3fc4e, + 0xc803cf07, + 0xf115f005, + 0x1c070f07, + 0x07fded7e, + 0x18dc03df, + 0x04030f07, + 0xdf7e1d07, + 0xd0f221fd, + 0xf1611622, + 0x008112f0, + 0xf371f431, + 0xf43543cb, + 0x22c42400, + 0x07126e18, + 0xfe917e0c, + 0xfc8ef283, + 0x5f12f093, + 0xfe857e00, + 0xfc8ef283, + 0xc05d14c0, + 0xf2413912, + 0xf351f481, + 0xf191242b, + 0x1342f245, + 0xf2452123, + 0x2f273347, + 0x40000000, + 0x4c270027, + 0xab312a1f, + 0x53312b02, + 0x98334721, + 0x834007f4, + 0x4cc07f4c, + 0xf0551240, + 0x4427ae1e, + 0xf4250c07, + 0x83fe3a7e, + 0xdcfc8ef2, + 0x66ec800c, + 0x400c0331, + 0x557f0ce3, + 0x07911ef0, + 0x278f1e0d, + 0x450c0740, + 0x1ef455f4, + 0xa3fc4e85, + 0x03cf07f3, + 0x15f005c8, + 0x070f07f1, + 0xfd347e1c, + 0xdc03df07, + 0x030f0718, + 0x7e1d0704, + 0xf421fd26, + 0xf3614290, + 0xe02432d0, + 0xe000dc44, + 0xc400cc34, + 0xf3311642, + 0x2027f471, + 0x2127340e, + 0xf2350c07, + 0x83fdd27e, + 0xc4fc8ef3, + 0xf3311632, + 0x2027f471, + 0x2127340e, + 0xf2750d07, + 0x83fdba7e, + 0x51fc8ef3, + 0x27f091f2, + 0xbe102730, + 0x8100129f, + 0x07f441f3, + 0x03430bd1, + 0xc5302742, + 0xf3b530f4, + 0xf331f471, + 0x342e2107, + 0xf4b54127, + 0x20cc3d07, + 0x30f4c11a, + 0x41032153, + 0x01533138, + 0x00000fa3, + 0x32078000, + 0xc5ee20c8, + 0x2fd430f4, + 0x40000000, + 0x30f4c123, + 0x0047091e, + 0x00002fb4, + 0x22474000, + 0x00cc4123, + 0x4721a3f2, + 0x002fd000, + 0xef400000, + 0x0730f4c5, + 0x7f4c8342, + 0x14404cc0, + 0x43270f07, + 0xc5280c03, + 0xf4a534f2, + 0x83fd2e7e, + 0xdcfc8ef3, + 0x26ea802c, + 0x402c0301, + 0x1e7f2ce3, + 0x4f42e4e0, + 0x9df093ff, + 0x3d5e005d, + 0x2b32e4ff, + 0x91f093ff, + 0x315e005d, + 0xa3fb4eff, + 0x03bf07f3, + 0x15f005b8, + 0x070f07f1, + 0xfc207e1b, + 0xcc03cf07, + 0x030f0718, + 0x7e1c0704, + 0xf471fc12, + 0x41c32f07, + 0x2c031c07, + 0x750b0728, + 0xfae47ef4, + 0x83fcce7e, + 0x4efb8ef3, + 0x07f3a3fb, + 0x05b803bf, + 0x07f115f0, + 0x7e1b070f, + 0xcf07fbe6, + 0x0718cc03, + 0x0704030f, + 0xfbd87e1c, + 0x1c072f07, + 0x07282c03, + 0xfab07e0b, + 0x83fc9a7e, + 0x4efb8ef3, + 0x27f123fc, + 0x27f40543, + 0x270008c1, + 0x270636c0, + 0x07f40542, + 0x7efc150f, + 0xf103fc7b, + 0xc876fc8e, + 0x4c27d007, + 0x250d071e, + 0xbefd35f4, + 0x230011b3, + 0xe001c801, + 0x3b1e4c27, + 0x35402bd0, + 0x1ef425fd, + 0x000f40d3, + 0x07800000, + 0x1ed013d0, + 0x000f27d6, + 0x1ecf0000, + 0xa3fc4ec6, + 0x03cf07f2, + 0x15f005c8, + 0x070f07f1, + 0xfb5c7e1c, + 0xdc03df07, + 0x030f0718, + 0x7e1d0704, + 0xf421fb4e, + 0x611042d0, + 0x074290f4, + 0x7e1d070c, + 0xf283f9c3, + 0x0127fc8e, + 0xfe4ef91e, + 0x1f07f163, + 0x1403f005, + 0x277e0f07, + 0x44f411fb, + 0x43002742, + 0xd0fe8ef1, + 0x4440f842, + 0x40c8f431, + 0x1f4c88f1, + 0x47c6f421, + 0x00000f27, + 0xf1438000, + 0xf041fe8e, + 0x4c13f321, + 0xc6045b1e, + 0x0013d63f, + 0xfe8ef143, + 0xffff0f27, + 0xf1437fff, + 0xfe4efe8e, + 0xf115f2a3, + 0xf0051f07, + 0x0f071803, + 0x07fad57e, + 0x031f070f, + 0x181c0304, + 0x21fac97e, + 0x614290f4, + 0x300027f4, + 0x8ef28342, + 0x830127fe, + 0x4efe8ef2, + 0x07f2a3fc, + 0x05c803cf, + 0x07f115f0, + 0x7e1c070f, + 0xdf07faa2, + 0x0718dc03, + 0x0704030f, + 0xfa947e1d, + 0x42d0f421, + 0x90f46110, + 0x070c0742, + 0xf9097e1d, + 0xfc8ef283, + 0xf91e0127, + 0xf2a3fc4e, + 0xc803cf07, + 0xf115f005, + 0x1c070f07, + 0x07fa697e, + 0x18dc03df, + 0x04030f07, + 0x5b7e1d07, + 0xd0f421fa, + 0xf4611042, + 0x0c074290, + 0xd07e1d07, + 0x8ef283f8, + 0x1e0127fc, + 0xa3fc4ef9, + 0x03cf07f2, + 0x15f005c8, + 0x070f07f1, + 0xfa307e1c, + 0xdc03df07, + 0x030f0718, + 0x7e1d0704, + 0xf421fa22, + 0x611042d0, + 0x074290f4, + 0x7e1d070c, + 0xf283f897, + 0x00a7fc8e, + 0xfc4ef91e, + 0xcf07f2a3, + 0xf005c803, + 0x0f07f115, + 0xf77e1c07, + 0x03df07f9, + 0x0f0718dc, + 0x1d070403, + 0x21f9e97e, + 0x1042d0f4, + 0x4290f461, + 0x1d070c07, + 0x83f85e7e, + 0xa7fc8ef2, + 0x4ef91e00, + 0x07f2a3fc, + 0x05c803cf, + 0x07f115f0, + 0x7e1c070f, + 0xdf07f9be, + 0x0718dc03, + 0x0704030f, + 0xf9b07e1d, + 0x42d0f421, + 0x90f46110, + 0x070c0742, + 0xf8257e1d, + 0xfc8ef283, + 0xf91e0127, + 0xf123fd4e, + 0x0676d007, + 0xf4054227, + 0x40270f07, + 0x547ef415, + 0x8ef103fa, + 0x274327fd, + 0xf4051e3c, + 0xf035f325, + 0x000f8ebe, + 0x00c80123, + 0xdd0fc61c, + 0x2b1e4c27, + 0x25d03b40, + 0x270f07f4, + 0x15fd3540, + 0xfa257ef4, + 0xfd8ef103, + 0x20132007, + 0x423b4127, + 0x4d8b4123, + 0x46363027, + 0x4c27d25b, + 0x2b3dab1e, + 0x25f33540, + 0x27a61ef4, + 0x4eee1e31, + 0xd00401fd, + 0x13011342, + 0x44c032b0, + 0xa434205d, + 0x4832c042, + 0x45c61411, + 0x01071127, + 0x3284fd8e, + 0x42c60411, + 0x010710a7, + 0x0311fd8e, + 0x344e1411, + 0x10a73106, + 0x0221f11e, + 0x42da1421, + 0x1524daf4, + 0x0e410d31, + 0x11411031, + 0xcee61eca, + 0xe12a141e, + 0x0d42e16e, + 0xa7c23fd6, + 0x27cc1e10, + 0x8e010710, + 0xebd0c2fd, + 0x1ecc3fd6, + 0xb534c4b0, + 0x04111111, + 0xa71e142b, + 0xf1a3f54e, + 0x60275027, + 0xf5350301, + 0xc007f645, + 0xb2077107, + 0x90278027, + 0x012f32d0, + 0x7d42f014, + 0x4b34e001, + 0x7544e002, + 0x2442c401, + 0x071b32c4, + 0x27400732, + 0x03410125, + 0x03310544, + 0x11f2a834, + 0x077411c3, + 0x15438bcb, + 0x830c07b4, + 0xe0f58ef1, + 0x21014b32, + 0x2514210e, + 0x310341fe, + 0x15ae0702, + 0x2bf205f3, + 0x411d31a4, + 0xe83a071e, + 0xcc00dfa0, + 0xe84c40ac, + 0x07017c31, + 0x203c233a, + 0x5027f355, + 0x30e86027, + 0x412701dc, + 0x133b1407, + 0x02072127, + 0x30a70a3b, + 0x300b40a7, + 0x3d8b414b, + 0x34ab4e8b, + 0x512734c6, + 0xf4516027, + 0x01a440e8, + 0x845b8e07, + 0x9a5b9e07, + 0xe607d507, + 0xe9abd8ab, + 0xf321111e, + 0x010643fa, + 0x20271027, + 0xf105f425, + 0xc011f215, + 0x04ee7411, + 0x0fe600db, + 0xf30100cc, + 0x1d07f411, + 0x132b2e07, + 0x20e8246b, + 0x402700f2, + 0xf421b415, + 0xb425b135, + 0xbc31b245, + 0x30a7bd41, + 0x3c0b40a7, + 0x4fd44d4b, + 0x10000000, + 0xff4fe031, + 0xc00fffff, + 0x07b12100, + 0x1f4c534c, + 0x34ab3d47, + 0xb3452c47, + 0xbc31b235, + 0x1123bd41, + 0x40a730a7, + 0x3c0bb125, + 0x4fd04d4b, + 0x10000000, + 0x0543271e, + 0x00dfd4b4, + 0x2c200000, + 0x0c07cb07, + 0xf58ef183, + 0xaceca013, + 0x5eff6d40, + 0x4fc4ff1f, + 0x0fffffff, + 0xff3fd0b7, + 0xb0ffffff, + 0xb4054327, + 0x0000dfd0, + 0x07d62000, + 0x330d073c, + 0x20271f0c, + 0x4d073153, + 0x1c07be21, + 0x415330ab, + 0x04ab0207, + 0xcb071183, + 0x13abe103, + 0xf183b045, + 0xb1350c07, + 0xf58ebe25, + 0x0c07c707, + 0xf58ef183, + 0xf211f101, + 0x2e6b1d2b, + 0x01ff395e, + 0x15f211f1, + 0x4b1d0bb0, + 0x21d2072e, + 0x25c107f2, + 0x45bc35b2, + 0xff735ebd, + 0xe027d027, + 0xf4ff015e, + 0xffffff3f, + 0x5eff64ff, + 0xfd21ff39, + 0x40273027, + 0x426b312b, + 0xb2152127, + 0xb335bd25, + 0x075eb445, + 0xdb3fe6ff, + 0x07f321fe, + 0x202c232a, + 0xf2553a0b, + 0x0027f325, + 0x20e81027, + 0x41270091, + 0x623b6407, + 0x52072127, + 0xf2015a3b, + 0x40a730a7, + 0x464b350b, + 0xf211328b, + 0x34ab428b, + 0x012734c6, + 0xf3511027, + 0x115030c8, + 0x35435bf4, + 0x31f311f4, + 0x073a5bf4, + 0xab40ab23, + 0x05f34521, + 0x5ef215f4, + 0x4c27fe82, + 0x074a2b20, + 0x3b8d071e, + 0xab8a5b14, + 0xfe525e81, + 0x27203c27, + 0x073a2b41, + 0x5e135b14, + 0x44e4fe20, + 0x1311fdd9, + 0x34ee0411, + 0xfc93fdd1, + 0x5e0057a4, + 0x4c27fdc9, + 0x01f21120, + 0x3b4a2bf3, + 0x073a5b24, + 0xab230742, + 0x1ef23524, + 0x203c27a1, + 0x3a2b4127, + 0x635b6407, + 0x4eff6b5e, + 0x010a11f8, + 0x07ba0709, + 0x1fbc533a, + 0x83143c53, + 0x070307b1, + 0x831b15ea, + 0x2707ff0d, + 0x078107c0, + 0xffee83d9, + 0x0e160fff, + 0x4eab4907, + 0x42274516, + 0xf88e1405, + 0x3da74327, + 0x140503fd, + 0x49071325, + 0x4c531e07, + 0x07183318, + 0x3314ab09, + 0x001fd408, + 0x1d100000, + 0x2007e307, + 0x2c534147, + 0x4742ab1f, + 0x07030730, + 0xd0e12314, + 0x0000004f, + 0x8e25e910, + 0x81458035, + 0x0dc0f88e, + 0x072807ff, + 0x534e0729, + 0x4833182c, + 0x240742ab, + 0x00002fa3, + 0x39071000, + 0x0d233833, + 0x124503ff, + 0x10252327, + 0x13351205, + 0x4907f88e, + 0x45164eab, + 0x14054427, + 0x4e07f88e, + 0x4e833027, + 0xab080000, + 0x27358634, + 0x35140541, + 0x8e8e458d, + 0x1e1305f8, + 0xe3f54ef7, + 0x075107f1, + 0x0340071f, + 0x050f0718, + 0x7ef515f4, + 0xf351ff23, + 0x1307f461, + 0xffff1f83, + 0x20273fff, + 0x3c530487, + 0xab12ab1e, + 0xa3148630, + 0x31f02131, + 0xbef241f1, + 0xc3fff6d7, + 0x4ef58ef1, + 0x07f3a3f5, + 0x10ac03af, + 0xb007c107, + 0x0f071a07, + 0xf225f335, + 0xfc155307, + 0xcf07fb05, + 0x03feda7e, + 0x0f0724cc, + 0x1c070803, + 0x07fece7e, + 0x7e1c070a, + 0xf383fbab, + 0xf64ef58e, + 0x90270401, + 0x0d31a027, + 0x08110e41, + 0x00c942f0, + 0x00ba44e0, + 0x4d074240, + 0x47f64eab, + 0x10270027, + 0x31833807, + 0x4c334307, + 0x0730271f, + 0xabc107b0, + 0x07c4abb3, + 0x8e1c070b, + 0xe80021f6, + 0xfffc020f, + 0xec00b1ff, + 0x8504000d, + 0x6b3d0700, + 0x0340273f, + 0xc003ff0d, + 0x2756803c, + 0x40277f3c, + 0xe44bd30b, + 0x0000efd0, + 0x07162000, + 0x073d072e, + 0x1f2c334e, + 0x32ab3153, + 0xd3074153, + 0x0103e407, + 0x4e072007, + 0x1e070d07, + 0x07ff2d83, + 0x32071853, + 0x53184c33, + 0x0704ab08, + 0x143c33e1, + 0xd0072027, + 0xffffee83, + 0x0702070f, + 0xab0dab13, + 0xff765e1e, + 0x07a94fd6, + 0x003d833d, + 0xc634ab01, + 0x3c27a73f, + 0x0b402780, + 0xd0e44bd3, + 0x000000ef, + 0x9c1eb320, + 0x1f270027, + 0x7ff00000, + 0x07ff4b5e, + 0x004ea34e, + 0xe4070800, + 0xffffee83, + 0x071e070f, + 0x001fa30d, + 0x5e7ff000, + 0x0f13ff30, + 0xfffffc02, + 0xba390cec, + 0x23100700, + 0x6027201c, + 0x10e87027, + 0x412700b5, + 0xc13bc407, + 0xb2072127, + 0x30a7b03b, + 0x3b0b40a7, + 0x3d8b4c4b, + 0x34ab4e8b, + 0x612734c6, + 0x10e87027, + 0x9e07009f, + 0xd607915b, + 0xae07d9ab, + 0xa05b3d07, + 0x3f6be707, + 0x4027eaab, + 0x44803cc0, + 0x277f3c27, + 0x4b3d0b40, + 0x3324074e, + 0xc127182c, + 0x00004f14, + 0xc0271000, + 0x08530307, + 0x02ab1407, + 0x3c071853, + 0x07ff3d83, + 0xe1074307, + 0x27144c33, + 0x83d00730, + 0x0fffffee, + 0x14070307, + 0x1eab0dab, + 0xd6fe975e, + 0x3d07bb4f, + 0x01003d83, + 0x34ab4027, + 0x4e073cb6, + 0x27184c33, + 0x00ef14c1, + 0x27100000, + 0x530d07c0, + 0xab1e0708, + 0x1e185304, + 0x27c027b6, + 0x1e102700, + 0x203c27ae, + 0x302b4127, + 0xc35bc407, + 0x27ff475e, + 0x402b204c, + 0x9d073e07, + 0x905b343b, + 0x575e93ab, + 0x803c27ff, + 0x4eff6a5e, + 0x05f163f5, + 0x150f07f0, + 0x35f225f1, + 0x7ef445f3, + 0x5107fe0a, + 0xf58ef143, + 0xf1e3f54e, + 0xd803df07, + 0x51074007, + 0x1d070f07, + 0xf515f405, + 0x31fcae7e, + 0x963027f4, + 0x07312744, + 0x7ef3350d, + 0x5107fdde, + 0xf58ef1c3, + 0xf3e3f54e, + 0x1f07c107, + 0x1c03b007, + 0x250f0710, + 0x15f335f2, + 0x7efb05fc, + 0xdf07fc7f, + 0x0724dc03, + 0x0708030f, + 0xfc717e1d, + 0x22d0f241, + 0xf0f19116, + 0x51010912, + 0xcbf3a1f4, + 0x00f45543, + 0x1f22c424, + 0x0f0712ae, + 0x7e100c03, + 0x5107fd8e, + 0xf58ef3c3, + 0x53bef093, + 0xfd807e00, + 0xf3c35107, + 0x14e0f58e, + 0x12c000df, + 0xb1f1617f, + 0x2bfc81f4, + 0x34f8c114, + 0xfb71f165, + 0xea30f7c1, + 0xce0084c8, + 0x4c277d8c, + 0x2790273d, + 0x000000af, + 0x27502710, + 0x38f4c560, + 0xe607d507, + 0xd9ab4a07, + 0x4c33eaab, + 0xcec88a1f, + 0x5d07548c, + 0xb72b6e07, + 0x2907c86b, + 0x24ab2153, + 0x4c534b07, + 0xab1c471f, + 0x38f4c114, + 0x41233a07, + 0x0b473153, + 0x0738f4c5, + 0x07a30792, + 0xd6c107b0, + 0x3507bf4f, + 0x40273f6b, + 0x38803cc0, + 0xf685f575, + 0x07ff615e, + 0x0344270f, + 0xf445100c, + 0x07fce97e, + 0x8ef3c351, + 0xb3b7caf5, + 0x7bc2a91e, + 0x472b0782, + 0x1f2c534c, + 0x3b4742ab, + 0xb3071123, + 0xf165c407, + 0xd6ff6d5e, + 0x3507c74f, + 0x01003d83, + 0x3fd634ab, + 0xab4007bc, + 0xb54fc641, + 0x27803c27, + 0x4b350b40, + 0xe3530746, + 0x6407ff5c, + 0x0d07a31e, + 0x07ff0a5e, + 0x2730270f, + 0x03202740, + 0xf375100c, + 0xf265f485, + 0x4efef65e, + 0x07f5e3f5, + 0x10ac03af, + 0xc107b007, + 0x1a070f07, + 0xf225f335, + 0xfb05fc15, + 0x07fb2a7e, + 0x24dc03df, + 0x08030f07, + 0x1c7e1d07, + 0x90f441fb, + 0xd0f39142, + 0x44e02632, + 0x34e001f3, + 0x42c401e3, + 0xa1f35118, + 0x0e2027f4, + 0x07212734, + 0x7ef2550a, + 0x5107fc36, + 0xf58ef5c3, + 0x511832c4, + 0x27f4a1f3, + 0x27340e20, + 0xa50d0721, + 0xfc1c7ef2, + 0xf5c35107, + 0xfbc1f58e, + 0x27f77130, + 0x076027a0, + 0x34fcc12b, + 0x1a073607, + 0x94be0707, + 0x5b070006, + 0xbc073027, + 0xc54cfbc5, + 0xf0c550f3, + 0x58f1c554, + 0xc14cf0c1, + 0x3a0750f1, + 0x2707f881, + 0x000672be, + 0x9007c027, + 0x2507a107, + 0x08073607, + 0x60be1c07, + 0xd0070006, + 0xd90be107, + 0xb807ea4b, + 0x00fdeaea, + 0x00f5aeee, + 0xf3c11027, + 0x58f4c154, + 0xad079107, + 0xa44b930b, + 0x80277027, + 0x00f9a4ea, + 0xee58f4c1, + 0xc1012c4a, + 0xf2c150f3, + 0x070b074c, + 0xbebe071c, + 0xb100061f, + 0x27f461f3, + 0x03430bc0, + 0xc5302744, + 0xf3c540f4, + 0x51f4a13c, + 0x4bb00bf3, + 0x4bb70bc1, + 0x27342ec8, + 0x3cf4c541, + 0x0000cfd0, + 0xc13f2000, + 0x4c0740fe, + 0x4c331b07, + 0x0711531f, + 0xab0a072c, + 0x33215314, + 0xe1031f0c, + 0x0715b1d8, + 0x534a0739, + 0xab415331, + 0x07a40730, + 0x00afa393, + 0x07800000, + 0xd4c207b1, + 0x0000002f, + 0xfec5c920, + 0x00cfd440, + 0x31100000, + 0x0740fec1, + 0x1f4c5349, + 0x1a472b07, + 0x2c5314ab, + 0xab4c471f, + 0x473b4742, + 0x07b30709, + 0xc8e123c4, + 0x900759a0, + 0xcfd0a107, + 0x10000000, + 0x40fec5d7, + 0x3f6b3b07, + 0x3cc04027, + 0x0f074980, + 0x0c034327, + 0x44fbc538, + 0xc548fcc5, + 0xcb7e38f4, + 0xc35107fa, + 0xe2f58ef5, + 0x27ff0b9d, + 0x54f3c110, + 0x0758f4c1, + 0x0bad0791, + 0x27a44b93, + 0xe2812770, + 0x27ff0b4a, + 0x0b402731, + 0x5e844b73, + 0x31a3ff07, + 0xc407b307, + 0x4fd6a11e, + 0x833b07b6, + 0xab01003d, + 0xab3fd634, + 0x4aab4907, + 0x27a44fc6, + 0x4027803c, + 0x4c4b3b0b, + 0xbce3b307, + 0x1ec407ff, + 0xd439e292, + 0xe4c11efe, + 0x93fe3a42, + 0x00509bf0, + 0xe4fe265e, + 0x93fe1432, + 0x00508ff0, + 0x4efe1a5e, + 0x07f4e3f5, + 0x10ac03af, + 0xb007c107, + 0x0f071a07, + 0xf225f335, + 0xfb05fc15, + 0xf47ecf07, + 0x24cc03f8, + 0x08030f07, + 0xe87e1c07, + 0x07f4a1f8, + 0x0741c32f, + 0x382c031c, + 0xf4a50a07, + 0x7ef62f7e, + 0x5107fa12, + 0xf58ef4c3, + 0xf4e3f54e, + 0xac03af07, + 0x07c10710, + 0x071a07b0, + 0x25f3350f, + 0x05fc15f2, + 0x7ecf07fb, + 0xcc03f8af, + 0x030f0724, + 0x7e1c0708, + 0x2f07f8a3, + 0x2c031c07, + 0x7e0a0738, + 0xd37ef5f0, + 0xc35107f9, + 0x4ef58ef4, + 0x27f163fb, + 0x27f40543, + 0x270008b1, + 0x270736b0, + 0x07f40542, + 0x7efb150f, + 0x3007f9b2, + 0x03074107, + 0xf1431407, + 0xbb36fb8e, + 0x04074007, + 0xc407d027, + 0x253c4c27, + 0x45f035f4, + 0x047dbefd, + 0x03100700, + 0x11c81d1c, + 0xc80323cf, + 0x4c072300, + 0xf445403b, + 0x3c274c07, + 0x2b413b3c, + 0x25f43531, + 0xc0b51ef3, + 0x0000000f, + 0x40071a80, + 0xbf1e4013, + 0x2b204c27, + 0x072c0741, + 0x3b245b3d, + 0x4532ab31, + 0x27d21ef3, + 0x004f2730, + 0x1ec1e000, + 0xa3f54e96, + 0x03df07f3, + 0x400710dc, + 0x0f075107, + 0xf4051d07, + 0xf335c307, + 0xf515f225, + 0xe47ebf07, + 0x24bc03f7, + 0x08030f07, + 0xd87e1b07, + 0xd0f441f7, + 0xf4911042, + 0x0d074290, + 0xac7e1b07, + 0x8ef383f4, + 0x1e0127f5, + 0xe3f54ef9, + 0x075107f1, + 0x0340071f, + 0x050f0718, + 0x7ef515f4, + 0xf421f7ab, + 0x00274244, + 0xf58ef1c3, + 0x40f842d0, + 0xc8f44144, + 0x4c88f140, + 0x46f4311f, + 0x000f2749, + 0xc3800000, + 0x27f58ef1, + 0xe42b3cec, + 0x4c234e07, + 0x1c40c820, + 0x0207f261, + 0xf431045b, + 0x13ca4fc6, + 0x8ef1c300, + 0xff0f27f5, + 0xc37fffff, + 0x61f58ef1, + 0x204c27f2, + 0x32074e2b, + 0x4307343b, + 0x0307f351, + 0x04ab0e5b, + 0xf54ed51e, + 0x5107f3a3, + 0x40071f07, + 0x07101c03, + 0x07f4050f, + 0x35c307b2, + 0x15f225f3, + 0xf7297ef5, + 0x1f070f07, + 0x1c030803, + 0xf71d7e24, + 0x4290f441, + 0x0027f491, + 0xf3834230, + 0x0127f58e, + 0xf58ef383, + 0xf3a3f54e, + 0xdc03df07, + 0x07400710, + 0x070f0751, + 0x07f4051d, + 0x25f335c3, + 0x07f515f2, + 0xf6e97ebf, + 0x0724bc03, + 0x0708030f, + 0xf6dd7e1b, + 0x42d0f441, + 0x90f49110, + 0x070d0742, + 0xf3b17e1b, + 0xf58ef383, + 0xf91e0127, + 0xf3a3f54e, + 0xdc03df07, + 0x07400710, + 0x070f0751, + 0x07f4051d, + 0x25f335c3, + 0x07f515f2, + 0xf6a57ebf, + 0x0724bc03, + 0x0708030f, + 0xf6997e1b, + 0x42d0f441, + 0x90f49110, + 0x070d0742, + 0xf36d7e1b, + 0xf58ef383, + 0xf91e0127, + 0xf3a3f54e, + 0xdc03df07, + 0x07400710, + 0x070f0751, + 0x07f4051d, + 0x25f335c3, + 0x07f515f2, + 0xf6617ebf, + 0x0724bc03, + 0x0708030f, + 0xf6557e1b, + 0x42d0f441, + 0x90f49110, + 0x070d0742, + 0xf3297e1b, + 0xf58ef383, + 0xf91e00a7, + 0xf3a3f54e, + 0xdc03df07, + 0x07400710, + 0x070f0751, + 0x07f4051d, + 0x25f335c3, + 0x07f515f2, + 0xf61d7ebf, + 0x0724bc03, + 0x0708030f, + 0xf6117e1b, + 0x42d0f441, + 0x90f49110, + 0x070d0742, + 0xf2e57e1b, + 0xf58ef383, + 0xf91e00a7, + 0xf3a3f54e, + 0xdc03df07, + 0x07400710, + 0x070f0751, + 0x07f4051d, + 0x25f335c3, + 0x07f515f2, + 0xf5d97ebf, + 0x0724bc03, + 0x0708030f, + 0xf5cd7e1b, + 0x42d0f441, + 0x90f49110, + 0x070d0742, + 0xf2a17e1b, + 0xf58ef383, + 0xf91e0127, + 0xf163f54e, + 0xb027a027, + 0x90278027, + 0x422706b6, + 0x0f07f405, + 0xf4154027, + 0x07f6d97e, + 0x8ef14351, + 0x27d027f5, + 0x3c3c2743, + 0xf405c007, + 0xf035f325, + 0xacbefd45, + 0x10070001, + 0xc81d1c03, + 0x1fc62c10, + 0xe80323d2, + 0x07008200, + 0x45403b4c, + 0x3b4c07f4, + 0x3c3c2741, + 0x312bf435, + 0x40270f07, + 0xf415f325, + 0x07f6917e, + 0x8ef14351, + 0x13e107f5, + 0x230e07e0, + 0x6027200c, + 0x00c87027, + 0x07412742, + 0x27b03bb4, + 0x3ba20721, + 0xa730a7ae, + 0x4b3a0b40, + 0x8b3c8b4b, + 0xc634ab4d, + 0x27612734, + 0x4000c870, + 0x805b8d07, + 0x9e5b9d07, + 0x2c274707, + 0xab36073c, + 0xab212b49, + 0x45f33538, + 0x5ef225f4, + 0x3c27ff5a, + 0x2b412720, + 0x5bb4073e, + 0x27b91eb3, + 0x412b204c, + 0x3d072c07, + 0x313b245b, + 0xf34532ab, + 0x27ff745e, + 0x4e2b204c, + 0x8c073d07, + 0x8e5b343b, + 0xb51e83ab, + 0x0088fe4e, + 0x1013100c, + 0xfe0e2127, + 0x00004e9e, + 0x10680013, + 0x44be2127, + 0x00130000, + 0x1013fe8e, + 0xfd4ef31e, + 0x271200c8, + 0x1410c8d0, + 0x2cbe2027, + 0xd4860000, + 0xfd8e0013, + 0xd1270013, + 0x13ee10cc, + 0xd6412710, + 0x1ed407d4, + 0x074027e4, + 0x27de1ed4, + 0x00099e21, + 0x9e202700, + 0x4e000003, + 0x3601c2fe, + 0x273310c8, + 0x203c2741, + 0x44471147, + 0xf02101c2, + 0x302707f3, + 0xfe8e26e6, + 0x27ee10cc, + 0x2b012a30, + 0x5334ab01, + 0xd6115341, + 0x0721b642, + 0x66fe8e03, + 0x1e302740, + 0x274127e9, + 0x4ee31e30, + 0x074207f6, + 0x07930782, + 0x533007a2, + 0x4fab102c, + 0xe2073fab, + 0x6007e39b, + 0xb0077107, + 0x0c531407, + 0x9b349b10, + 0x0b430710, + 0x104c53e1, + 0x209be40b, + 0x2e031e02, + 0x07010000, + 0x33b99b4e, + 0xa79b10ec, + 0x07104c53, + 0x073fabd2, + 0x0bba0bce, + 0x07c30bd4, + 0x0b0c071b, + 0xd4f68e1d, + 0x0100000e, + 0x000dd417, + 0x30273a01, + 0x00f9035b, + 0x00019b38, + 0x1b204c27, + 0xb0fe0b04, + 0x0000000f, + 0x183c2701, + 0x00f9035b, + 0x00019b38, + 0x041b4827, + 0x4c27fe0b, + 0x5b340710, + 0x3800f903, + 0x1b00019b, + 0x27fe0b04, + 0xf9035b38, + 0x019b3800, + 0x184c2700, + 0xfe0b041b, + 0x4fff1ea7, + 0x9b1401fd, + 0x4103122f, + 0x13c14433, + 0x2e24ab38, + 0x0b002732, + 0xc5f3abfe, + 0x14c13812, + 0xf842ce38, + 0x0127f3eb, + 0xfe4efe0b, + 0x0576d33e, + 0x0e200c27, + 0x00059efe, + 0x4efe8e00, + 0xbeb007fb, + 0x07fec3df, + 0x931007d0, + 0x004bc3f0, + 0xffd0d7be, + 0xc027d746, + 0xd2010b1e, + 0xc9bec103, + 0xd403ffd0, + 0xf0931c07, + 0xda004bb5, + 0xfb8eedcb, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x0001aab2, + 0x000056f2, + 0x000056f2, + 0x000056f2, + 0x42746e49, + 0x0a3a6675, + 0x6c202000, + 0x5f32676f, + 0x65676170, + 0x7a69735f, + 0x20202065, + 0x5f6d756e, + 0x65676170, + 0x66282073, + 0x29656572, + 0x2020000a, + 0x30252020, + 0x20206432, + 0x20202020, + 0x20202020, + 0x35252020, + 0x28202064, + 0x62206425, + 0x73657479, + 0x55000a29, + 0x6f6c626e, + 0x6e696b63, + 0x65722067, + 0x657a6973, + 0x25203a73, + 0x54000a64, + 0x6c61746f, + 0x6c6c6120, + 0x7461636f, + 0x25206465, + 0x28206438, + 0x64657375, + 0x2c642520, + 0x666e7520, + 0x61656572, + 0x20656c62, + 0x202c6425, + 0x65657266, + 0x29642520, + 0x2a2a000a, + 0x52202a2a, + 0x25435341, + 0x42412064, + 0x2054524f, + 0x2a2a2a2a, + 0x2020000a, + 0x20204350, + 0x203d2020, + 0x30257830, + 0x000a7838, + 0x52532020, + 0x20202020, + 0x7830203d, + 0x78383025, + 0x2020000a, + 0x20524146, + 0x203d2020, + 0x30257830, + 0x000a7838, + 0x5b522020, + 0x5d643225, + 0x30203d20, + 0x38302578, + 0x00000a78, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x3602f114, + 0xf1144a03, + 0x4a033602, + 0x68e97fe4, + 0x36ff35fa, + 0x21173307, + 0x00150217, + 0x31000901, + 0x390576db, + 0x41f54ef3, + 0x310c3e01, + 0x321149fc, + 0x2b094012, + 0x431a001d, + 0x68095a10, + 0x68ec7fd2, + 0x4ef34301, + 0x3e0141f5, + 0x5fef56fa, + 0x2d093dfa, + 0x51fa45fd, + 0x370660f5, + 0x56fb4307, + 0x3a005802, + 0x5ef64cfd, + 0x45043605, + 0x580051fd, + 0x4afb43f9, + 0x50fb4afc, + 0x3a0148f9, + 0x3f002900, + 0x3f003f00, + 0x560453f7, + 0x48f96100, + 0x3e03290d, + 0x4efc2d00, + 0x7ee560fd, + 0x65e762e4, + 0x52e443e9, + 0x53f05eec, + 0x5beb6eea, + 0x5df366ee, + 0x280c7fe3, + 0x3b0e330b, + 0x2cfe4cfa, + 0x34002d00, + 0x3bfe40fd, + 0x4bfc46fc, + 0x18034df7, + 0x30002a00, + 0x3bfa3700, + 0x53f447f9, + 0x1dfd3a01, + 0x260124ff, + 0x37fa2b02, + 0x40003a00, + 0x1dfc4600, + 0x2a071f05, + 0x3afe3b01, + 0x51fd48fd, + 0x05083a00, + 0x120e0e0a, + 0x28021b0d, + 0x46fd3a00, + 0x23f942fa, + 0x2df82af9, + 0x38f430fb, + 0x3efb3cfa, + 0x77e257f5, + 0xf11461f5, + 0x4cf842f8, + 0xf114f114, + 0x66ef52f8, + 0x5af64afd, + 0x55f84ffa, + 0xf114f114, + 0x59fb5cf9, + 0x6cf360f9, + 0x1c0b55fe, + 0x28024efa, + 0x2c034bff, + 0x31004df9, + 0x2e003602, + 0x2c023205, + 0x330244fd, + 0x2f003201, + 0x27042a06, + 0x3e0251fc, + 0x2e063f01, + 0x360046fc, + 0x36034300, + 0x3a023902, + 0x3f044cfe, + 0xf114f114, + 0xf114f114, + 0xf114f114, + 0x41ff2efd, + 0x5df739ff, + 0x3306230b, + 0x39064004, + 0x35073d01, + 0x3406230b, + 0x37061912, + 0x2d0b180c, + 0x240e1d0d, + 0x3508240d, + 0x52ff5df6, + 0x370749f9, + 0x4efd49fe, + 0x2e0f2e0d, + 0x1f163109, + 0x54ff64f9, + 0x5cf74afd, + 0x7ee957f8, + 0x07193509, + 0xf91e3502, + 0x031c3505, + 0x041c3dfe, + 0x00203800, + 0xff223800, + 0x061e3ff3, + 0x061e3cfb, + 0x09203eff, + 0x131f3904, + 0x1b1a45fa, + 0x1e1a3904, + 0x1425270e, + 0x221c3304, + 0x4611440d, + 0xf114f114, + 0xf114f114, + 0xf114f114, + 0x3c063605, + 0x45063b06, + 0x43014003, + 0x3b053d01, + 0x43093f09, + 0xf114f114, + 0xf114f114, + 0xf114f114, + 0x440030ff, + 0x58f845fc, + 0x1e103207, + 0x20122710, + 0x23122c05, + 0x1d163404, + 0x1f18300b, + 0x26173cfb, + 0x2b123bff, + 0x29143b00, + 0x3f0b2116, + 0x3b092c05, + 0x40092b0e, + 0x5eff4eff, + 0x59fe3c00, + 0x6cf74509, + 0x47f94ffc, + 0x46f745fb, + 0x44f642f8, + 0xf71afe09, + 0x45f449ed, + 0x43f146f0, + 0x46ed3eec, + 0xf927f721, + 0x41ea42f0, + 0xfe293fec, + 0x0931032d, + 0x3b241b2d, + 0xf114f114, + 0xf114f114, + 0xf114f114, + 0xf114f114, + 0x0b0e6af3, + 0x0e0b6af0, + 0x0b0957f6, + 0x0b1272eb, + 0x09156eee, + 0xfe1762f2, + 0xf1206eea, + 0xf1206aeb, + 0xeb2267ee, + 0xe9276beb, + 0xdf2a6ce9, + 0xe12970e6, + 0xe42e60f6, + 0xf4265ff4, + 0x1d155bfb, + 0xf114f114, + 0xe82d5df7, + 0xd3355eea, + 0xe63056fb, + 0xd5414309, + 0xed2b50fc, + 0xf62755f6, + 0x091e46ff, + 0x1a123c07, + 0x1b143a09, + 0x39003d05, + 0x52f2320c, + 0x4bfb320f, + 0x61ed3112, + 0x7ddd3611, + 0xf114f114, + 0xf114f114, + 0x001b290a, + 0x001c2e07, + 0xfc1f33ff, + 0x061b3107, + 0x08223408, + 0x0a1e2909, + 0x16182f06, + 0x13213702, + 0x2016290d, + 0x1f1a2c0a, + 0x29153206, + 0x2c1a3505, + 0x2f17310d, + 0x41103f04, + 0x470e4006, + 0xf114f114, + 0x3c0845fe, + 0x3f063bfe, + 0x41114606, + 0xf114f114, + 0x18152c0a, + 0x14171f09, + 0x171a2b0c, + 0x201b3503, + 0x171c220e, + 0x181c260a, + 0x281734fd, + 0x2018280d, + 0x1d1c2011, + 0x2a172c07, + 0x39132607, + 0x3516320d, + 0x3d16390a, + 0x560b2b1a, + 0xf114f114, + 0xf114f114, + 0x51fa55fb, + 0x51f94df6, + 0x49ee50ef, + 0xf221f315, + 0x53f64afc, + 0x43f747f7, + 0x42f83dff, + 0xfe2ef927, + 0x3b0042f2, + 0x02333b02, + 0x113d063c, + 0x3e2a2237, + 0xf114f114, + 0xf114f114, + 0xf114f114, + 0xf114f114, + 0x3602f114, + 0xf1144a03, + 0x4a033602, + 0x68e97fe4, + 0x36ff35fa, + 0x19163307, + 0x00100022, + 0x290409fe, + 0x410276e3, + 0x4ff347fa, + 0x32093405, + 0x360a46fd, + 0x1613221a, + 0x02390028, + 0x451a2429, + 0x65f17fd3, + 0x47fa4cfc, + 0x34054ff3, + 0x5af34506, + 0x2b083400, + 0x52fb45fe, + 0x3b0260f6, + 0x57fd4b02, + 0x380164fd, + 0x55fa4afd, + 0x51fd3b00, + 0x5ffb56f9, + 0x4dff42ff, + 0x56fe4601, + 0x3d0048fb, + 0x3f002900, + 0x3f003f00, + 0x560453f7, + 0x48f96100, + 0x3e03290d, + 0x33070f0d, + 0x7fd95002, + 0x60ef5bee, + 0x62dd51e6, + 0x61e966e8, + 0x63e877e5, + 0x66ee6eeb, + 0x20197fdc, + 0x36153115, + 0x47f170e9, + 0x35003df9, + 0x4df542fb, + 0x54f750f7, + 0x27fd65eb, + 0x3df935fb, + 0x4df14bf5, + 0x6be75bef, + 0x2cf64cf5, + 0x39f634f6, + 0x48f03af7, + 0x45fc45f9, + 0x22f74202, + 0x1f0b2001, + 0x37fe3405, + 0x490043fe, + 0x04073403, + 0x0811080a, + 0x25031310, + 0x49fb3dff, + 0x180047fb, + 0x2afe24ff, + 0x39f734fe, + 0x41fc3ffa, + 0x7ae46fe7, + 0xf11459f8, + 0x52f943fc, + 0xf114f114, + 0x7fde57f6, + 0x56f74afb, + 0x4efc46ff, + 0xf114f114, + 0x59fb5000, + 0x5cfc5ef9, + 0x2d0467f3, + 0x1c0a5bf3, + 0x1f0a59f7, + 0xf5215cf2, + 0xd5344cf8, + 0x0f1257f4, + 0x001c6ee9, + 0xea2369e8, + 0xe7264ef6, + 0x002270ec, + 0xee2763ef, + 0xf4207fb2, + 0xa2667fba, + 0x00007fce, + 0xf1387fd2, + 0xf114f114, + 0xf114f114, + 0xf114f114, + 0x41002700, + 0x7fdd54f1, + 0xfc2142fc, + 0x0a1d4efb, + 0xfb2547fc, + 0xe33348f8, + 0xf7273b02, + 0xde3437ff, + 0xc64546f9, + 0xc1434bfa, + 0xfb2c59f8, + 0x072077de, + 0xe3374bfd, + 0x01201420, + 0x0000161e, + 0x241b7fd4, + 0x68f449fe, + 0x7fe15bf7, + 0xe7213600, + 0xe2223dfb, + 0xe4243a00, + 0xe4263cff, + 0xe5263dfd, + 0xee2243f8, + 0xf02354e7, + 0xf2224af2, + 0xf82041fb, + 0xfa253405, + 0x00233902, + 0x0a1e3d00, + 0x121c45f7, + 0x191a46f5, + 0x291d3712, + 0xf114f114, + 0xf114f114, + 0xf114f114, + 0x38073703, + 0x3d083707, + 0x4b0047fc, + 0x48023a00, + 0x4d083d07, + 0xf114f114, + 0xf114f114, + 0xf114f114, + 0x440035fd, + 0x58f74af9, + 0x230e2909, + 0x1f121912, + 0x23112009, + 0x1e152b05, + 0x2d112f09, + 0x2a142c00, + 0x2d123300, + 0x1a1b2e02, + 0x36102613, + 0x420742fc, + 0x3810260f, + 0x490b2a0c, + 0x430a2209, + 0x74f65900, + 0x51fa55fb, + 0x51f94df6, + 0x49ee50ef, + 0xf320f611, + 0x53f64afc, + 0x43f747f7, + 0x42f83dff, + 0xfb31f72a, + 0x3b0042f2, + 0x00353b02, + 0x0a440340, + 0x392f1b42, + 0xf114f114, + 0xf114f114, + 0xf114f114, + 0xf114f114, + 0xfa137eeb, + 0xfa127ce9, + 0x000e6eec, + 0xf41a7ee6, + 0xf01f7ce7, + 0xe72169ef, + 0xea2179e5, + 0xe42575e5, + 0xe22766ef, + 0xe22a75e6, + 0xd62f74e5, + 0xdc2d7adf, + 0xde315ff6, + 0xef2964f2, + 0x09205ff8, + 0xf114f114, + 0xb9456fef, + 0xc13f72e4, + 0xc04259fa, + 0xb64d50fe, + 0xd93652fc, + 0xdd3455f7, + 0xf62951f8, + 0x002448ff, + 0xff284005, + 0x0e1e4301, + 0x1a1c3809, + 0x25174500, + 0x370c4501, + 0x410b4507, + 0xf114f114, + 0xf114f114, + 0xdf2545f9, + 0xdc2743fa, + 0xdb284df0, + 0xe22640fe, + 0xdf2e3d02, + 0xe22a43fa, + 0xe82840fd, + 0xe3313902, + 0xf42641fd, + 0xf62842fd, + 0xfd263e00, + 0xfb2e3309, + 0x141f42ff, + 0x1e1d47fe, + 0x2c194bfe, + 0xf114f114, + 0x300c46ff, + 0x310b48f7, + 0x2d1a3c0e, + 0xf114f114, + 0x16162510, + 0x16172f00, + 0x151b2312, + 0x1421250b, + 0x1c1a290c, + 0x181e290a, + 0x221b3002, + 0x2a12290c, + 0x2719290d, + 0x32123b00, + 0x460c3203, + 0x36152813, + 0x470e4203, + 0x530b3212, + 0xf114f114, + 0xf114f114, + 0x4cfd51fd, + 0x4efa48f9, + 0x44f248f4, + 0xf320f611, + 0x4cfa46fd, + 0x3efb42fb, + 0x3dfc3900, + 0xfb31f72a, + 0x36013cf7, + 0x00353a02, + 0x0a440340, + 0x392f1b42, + 0xf114f114, + 0xf114f114, + 0xf114f114, + 0xf114f114, + 0x3602f114, + 0xf1144a03, + 0x4a033602, + 0x68e97fe4, + 0x36ff35fa, + 0x101d3307, + 0x000e0019, + 0x3efd33f6, + 0x101a63e5, + 0x66e855fc, + 0x39063905, + 0x390e49ef, + 0x0a142814, + 0x0036001d, + 0x610c2a25, + 0x75ea7fe0, + 0x55fc4afe, + 0x390566e8, + 0x58f25dfa, + 0x37042cfa, + 0x67f159f5, + 0x391374eb, + 0x54043a14, + 0x3f016006, + 0x6af355fb, + 0x4b063f05, + 0x65ff5afd, + 0x4ffc3703, + 0x61f44bfe, + 0x3c0132f9, + 0x3f002900, + 0x3f003f00, + 0x560453f7, + 0x48f96100, + 0x3e03290d, + 0x58f72207, + 0x7fdc7fec, + 0x5ff25bef, + 0x56e754e7, + 0x5bef59f4, + 0x4cf27fe1, + 0x5af367ee, + 0x21157fdb, + 0x3d113213, + 0x52ea73e8, + 0x35003ef7, + 0x55f23b00, + 0x5ef359f3, + 0x39f264eb, + 0x47f543f4, + 0x55eb4df6, + 0x68e958f0, + 0x30f852f6, + 0x42f83df8, + 0x4bf246f9, + 0x53f74ff6, + 0x45ea4ffc, + 0x3afe4bf0, + 0x4ef33a01, + 0x51fc53f7, + 0x26fa51f3, + 0x3afa3ef3, + 0x49f03bfe, + 0x56f34cf6, + 0x25f947f7, + 0x31f52cf8, + 0x3bf438f6, + 0x43f73ff8, + 0x7fdb62f1, + 0xf11463f3, + 0x4ff644fa, + 0xf114f114, + 0x7fe35cf5, + 0x6cee5cf4, + 0x57f653f7, + 0xf114f114, + 0x4c05500b, + 0x4e055402, + 0x270456fc, + 0x2a0058f4, + 0x220752fb, + 0x1d0b48fd, + 0x1f0843fc, + 0x250648f8, + 0x2a0759f0, + 0x280345f7, + 0x21083bff, + 0x2b0d4205, + 0x240d3904, + 0x2f0447fc, + 0x370347fe, + 0x3a023a02, + 0x3c064aff, + 0xf114f114, + 0xf114f114, + 0xf114f114, + 0x3d0437fa, + 0x7fdb53f2, + 0x2c082cfc, + 0x2c0b45ff, + 0x2a0e3e00, + 0x300733f9, + 0x38042ffc, + 0x34042afa, + 0x250d29fd, + 0x310935fa, + 0x3a134c08, + 0x300a4ef7, + 0x2d0c53f5, + 0x45003409, + 0x21144300, + 0x3f085afb, + 0x68f54ffb, + 0x7fe25bf5, + 0xee234301, + 0xe72148f1, + 0xfd1c4bfb, + 0x0a1850f8, + 0x001b53eb, + 0xf22240eb, + 0xd4341ff3, + 0xe82740e7, + 0x11135ee3, + 0x191f4b09, + 0x1d243f11, + 0x21184af8, + 0x0f2223fb, + 0x141e1bfe, + 0x49165b0d, + 0xf114f114, + 0xf114f114, + 0xf114f114, + 0x4ffe4100, + 0x5cfc4800, + 0x22144103, + 0x1f1345f9, + 0x2c1b4d08, + 0xf114f114, + 0xf114f114, + 0xf114f114, + 0x440338fa, + 0x62f347f8, + 0x101342f6, + 0x240f3e03, + 0x240f44fd, + 0x1c1551ec, + 0x15191e00, + 0x141e0701, + 0x0c1f17fd, + 0x101b4aeb, + 0x2a184210, + 0x5d007ce9, + 0x380e2511, + 0x390fee2c, + 0x261ade32, + 0x7fe87fea, + 0x4af84efd, + 0x48f648f7, + 0x47f44bee, + 0xf61efe09, + 0x46fb3ff5, + 0x48f24bef, + 0x35f843f0, + 0xff21fc1f, + 0x34f73bf2, + 0x072144f5, + 0x17250c1f, + 0x4014261f, + 0xf114f114, + 0xf114f114, + 0xf114f114, + 0xf114f114, + 0xf3117fea, + 0xf7107fe7, + 0xf41178e7, + 0xeb1b7fe5, + 0xe22572ed, + 0xd82975e9, + 0xd72a76e7, + 0xd13075e6, + 0xe02771e8, + 0xd82e76e4, + 0xcd3478e1, + 0xd72e7cdb, + 0xd9345ef6, + 0xed2b66f1, + 0x0b2063f6, + 0xf114f114, + 0xc93d6af3, + 0xd2387fce, + 0xce3e5cfb, + 0xbd513911, + 0xec2d56fb, + 0xfe235ef3, + 0x0f1c5bf4, + 0x01224dfe, + 0x01274700, + 0x111e49ff, + 0x26144004, + 0x2d1251f9, + 0x360f4005, + 0x4f00390f, + 0xf114f114, + 0xf114f114, + 0xf0244301, + 0xf2254400, + 0xef2543f6, + 0x01204401, + 0x0f224d00, + 0x0f1d4002, + 0x19184400, + 0x16224efb, + 0x101f3707, + 0x12233b05, + 0x1c1f4102, + 0x2921360e, + 0x1c242c0f, + 0x2f1b3c05, + 0x3e154602, + 0xf114f114, + 0x1f124cfe, + 0x1a1356ee, + 0x1824460c, + 0xf114f114, + 0x17184005, + 0x101b46f4, + 0x1e18370b, + 0x1d1f3805, + 0x29164500, + 0x2a164102, + 0x3c104afa, + 0x340f3605, + 0x3c0e3607, + 0x4e034cfa, + 0x7bf052f5, + 0x35154dfe, + 0x38164dfe, + 0x3d192a19, + 0xf114f114, + 0xf114f114, + 0x4af84efd, + 0x48f648f7, + 0x47f44bee, + 0xf61efe09, + 0x46fb3ff5, + 0x48f24bef, + 0x35f843f0, + 0xff21fc1f, + 0x34f73bf2, + 0x072144f5, + 0x17250c1f, + 0x4014261f, + 0xf114f114, + 0xf114f114, + 0xf114f114, + 0xf114f114, + 0x3602f114, + 0xf1144a03, + 0x4a033602, + 0x68e97fe4, + 0x36ff35fa, + 0x00003307, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x3f002900, + 0x3f003f00, + 0x560453f7, + 0x48f96100, + 0x3e03290d, + 0x37010b00, + 0x7fef4500, + 0x520066f3, + 0x6beb4af9, + 0x7fe17fe5, + 0x5fee7fe8, + 0x72eb7fe5, + 0x151f7fe2, + 0x32191f1f, + 0x2afa47fd, + 0x36fd32fb, + 0x3a003efe, + 0x48fe3f01, + 0x1bfb43fb, + 0x2cfe27fd, + 0x40f02e00, + 0x4ef644f8, + 0x37f15cf4, + 0x3efa3cf6, + 0x49f441fc, + 0x50f94cf8, + 0x54ec61f5, + 0x49fa4ff5, + 0x56f34afc, + 0x61f560f3, + 0x21fb4ef8, + 0x35fe30fc, + 0x47f33efd, + 0x56f44ff6, + 0x17ff4bfd, + 0x2b012201, + 0x37fe3600, + 0x40013d00, + 0x56f64dfa, + 0xf11475ed, + 0x5cf74400, + 0xf114f114, + 0x5bf74aff, + 0x6eef58f7, + 0x61f25af3, + 0xf114f114, + 0x73f47bef, + 0x73f57af0, + 0x00185df9, + 0x090f57f5, + 0x19084dfd, + 0x120d47fb, + 0x090f3ffc, + 0x130d44fc, + 0x250a54f4, + 0x120c3ef9, + 0x1d0641f9, + 0x21143d08, + 0x1e0f3805, + 0x2d0442fe, + 0x3a014001, + 0x3e003d00, + 0x3d074efe, + 0xf114f114, + 0xf114f114, + 0xf114f114, + 0x44fe3ff4, + 0x68f354f1, + 0x260c3201, + 0x2d0b3407, + 0x270f230a, + 0x2a0b2c00, + 0x2c0d260b, + 0x2d102d01, + 0x290c2e00, + 0x310a2c05, + 0x221e111f, + 0x2a123301, + 0x370a3207, + 0x3311131c, + 0x2e112110, + 0x59003e0e, + 0x5df846fd, + 0x7fe25af6, + 0xed1a6cf3, + 0xef1664f1, + 0xef1a65f3, + 0xe71e5bf3, + 0xec1c5ef4, + 0xe92158f6, + 0xe52554f0, + 0xe92156f6, + 0xe42853f9, + 0xef2657f3, + 0xf5215eed, + 0xf1284601, + 0xfa294800, + 0x01264afb, + 0x11293b12, + 0xf114f114, + 0xf114f114, + 0xf114f114, + 0x61fa4aff, + 0x7fec5bf9, + 0xfa1e66f8, + 0x031b64f1, + 0x161a5f00, + 0xf114f114, + 0xf114f114, + 0xf114f114, + 0x52fb38fc, + 0x7dea4cf9, + 0xf0254bfc, + 0xfc234802, + 0xf8264bf5, + 0xfd2647fd, + 0x03252e0f, + 0x052645f3, + 0x002a3e00, + 0x10234100, + 0x16272515, + 0x300e48f1, + 0x251b3909, + 0x3c153610, + 0x440c3e00, + 0x6102480c, + 0x70ec78ef, + 0x55f572ee, + 0x59f25cf1, + 0xf31af317, + 0x51f147e6, + 0x440050f2, + 0x38e846f2, + 0xf231f128, + 0x32e844e9, + 0x032c4af5, + 0x222c062d, + 0x52133621, + 0xf114f114, + 0xf114f114, + 0xf114f114, + 0xf114f114, + 0x060f5dfa, + 0x130654fa, + 0x10074ff8, + 0x0e0c4200, + 0x0d1247ff, + 0x0b0d3e00, + 0x0f0d3cfe, + 0x100f3bfe, + 0x170c4bfb, + 0x170d3efd, + 0x140f3afc, + 0x1a0e42f7, + 0x2c0e4fff, + 0x28114700, + 0x2f114403, + 0xf114f114, + 0x11182c0a, + 0x15153ef9, + 0x1619240f, + 0x1b1f280e, + 0x1d161b10, + 0x23131d0c, + 0x320e2c01, + 0x390a2414, + 0x3f072012, + 0x4dfe2a05, + 0x52fc3001, + 0x5efd3e0a, + 0x45092e11, + 0x6df44009, + 0xf114f114, + 0xf114f114, + 0xdd2468f4, + 0xde2461f5, + 0xe62060f0, + 0xe22558f9, + 0xe02c55f8, + 0xee2255f9, + 0xf12255f7, + 0xf12858f3, + 0xf9214204, + 0xfb234dfd, + 0x00214cfd, + 0x02264cfa, + 0x0d213a0a, + 0x23174cff, + 0x3a0d53ff, + 0xf114f114, + 0xfd1d63f9, + 0x001a5ff2, + 0x1e165f02, + 0xf114f114, + 0xf91f4c00, + 0xf1234afb, + 0xfd224600, + 0x03224bf5, + 0xff244401, + 0x05224100, + 0x0b2049f2, + 0x05233e03, + 0x0c223e04, + 0x0b2744ff, + 0x1d1e4bf3, + 0x1a22370b, + 0x271d4005, + 0x4213460c, + 0xf114f114, + 0xf114f114, + 0x61f36af2, + 0x5af45af1, + 0x49f658ee, + 0xf518f615, + 0x56f24ff7, + 0x46f649f6, + 0x42fb45f6, + 0xff1cf81c, + 0x3afb40f7, + 0x031d3b02, + 0x1423091d, + 0x430e241d, + 0xf114f114, + 0xf114f114, + 0xf114f114, + 0xf114f114, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x2a2a2a2a, + 0x53415220, + 0x20642543, + 0x524f4241, + 0x2a2a2054, + 0x000a2a2a, + 0x43502020, + 0x20202020, + 0x7830203d, + 0x78383025, + 0x2020000a, + 0x20205253, + 0x203d2020, + 0x30257830, + 0x000a7838, + 0x41462020, + 0x20202052, + 0x7830203d, + 0x78383025, + 0x2020000a, + 0x32255b52, + 0x3d205d64, + 0x25783020, + 0x0a783830, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x000065e8, + 0x000065e8, + 0x000065e8, + 0x000065e8, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x20000010, + 0x804000c0, + 0x03008001, + 0x00060100, + 0x80ff080f, + 0xff080f80, + 0x080f8080, + 0x0f8080ff, + 0x8080ff08, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x20000010, + 0x00400080, + 0x02008001, + 0x00040100, + 0x00ff200f, + 0x200f0802, + 0x080200ff, + 0x00ff200f, + 0x200f0802, + 0x080200ff, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x4649424d, + 0x34363248, + 0x00000000, + 0x7478656e, + 0x6369705f, + 0x5f6f745f, + 0x73726170, + 0x20202065, + 0x75252020, + 0x2a2a000a, + 0x25202a2a, + 0x2a2a2073, + 0x50202a2a, + 0x30203a43, + 0x20782578, + 0x52532020, + 0x7830203a, + 0x20207825, + 0x52414620, + 0x7830203a, + 0x000a7825, + 0x255b5220, + 0x205d6432, + 0x7830203d, + 0x78383025, + 0x6d20000a, + 0x65747361, + 0x25232072, + 0x73252064, + 0x6f626120, + 0x64657472, + 0x2020000a, + 0x55414620, + 0x203a544c, + 0x78257830, + 0x2020000a, + 0x44414620, + 0x203a5244, + 0x78257830, + 0x4152000a, + 0x41204353, + 0x54524f42, + 0x554d4d00, + 0x4f424120, + 0x57005452, + 0x68637461, + 0x00676f64, + 0x616e7944, + 0x2063696d, + 0x6e616863, + 0x69206567, + 0x6874206e, + 0x756e2065, + 0x7265626d, + 0x20666f20, + 0x65726f63, + 0x73692073, + 0x746f6e20, + 0x70757320, + 0x74726f70, + 0x52006465, + 0x30435341, + 0x53415200, + 0x52003143, + 0x32435341, + 0x53415200, + 0x52003343, + 0x34435341, + 0x4d445300, + 0x44560041, + 0x5200414d, + 0x00004645, + 0x0003f9c7, + 0x0000f812, + 0x0000f812, + 0x0000f812, + 0x000164f3, + 0x000164f9, + 0x000164ff, + 0x00016505, + 0x0001650b, + 0x00016511, + 0x00016516, + 0x0001651b, + 0x45444956, + 0x5746204f, + 0x41545320, + 0x44204554, + 0x20504d55, + 0x6f636544, + 0x3d726564, + 0x34363248, + 0x6946000a, + 0x61776d72, + 0x76206572, + 0x69737265, + 0x64206e6f, + 0x2073656f, + 0x20746f6e, + 0x6374616d, + 0x61682068, + 0x61776472, + 0x0a216572, + 0x72694600, + 0x7261776d, + 0x6f632065, + 0x6c69706d, + 0x66206465, + 0x7620726f, + 0x69737265, + 0x30206e6f, + 0x38302578, + 0x48000a78, + 0x77647261, + 0x20657261, + 0x6f706572, + 0x20737472, + 0x20202020, + 0x72657620, + 0x6e6f6973, + 0x25783020, + 0x0a783830, + 0x72694600, + 0x7261776d, + 0x65762065, + 0x6f697372, + 0x6f64206e, + 0x6e207365, + 0x6d20746f, + 0x68637461, + 0x72616820, + 0x72617764, + 0x65762065, + 0x6f697372, + 0x6946006e, + 0x61776d72, + 0x63206572, + 0x69706d6f, + 0x2064656c, + 0x20726f66, + 0x70207325, + 0x69636572, + 0x6e6f6973, + 0x6c736420, + 0x646f6d20, + 0x6c000a65, + 0x4800776f, + 0x77647261, + 0x20657261, + 0x6f706572, + 0x20737472, + 0x20202020, + 0x20732520, + 0x63657270, + 0x6f697369, + 0x7364206e, + 0x6f6d206c, + 0x000a6564, + 0x68676968, + 0x454c0020, + 0x5254435f, + 0x78253a4c, + 0x434e202c, + 0x5345524f, + 0x2c78253a, + 0x43494c20, + 0x524f435f, + 0x554e5f45, + 0x64253a4d, + 0x5748202c, + 0x524f435f, + 0x554e5f45, + 0x64253a4d, + 0x69000a20, + 0x6c61766e, + 0x68206469, + 0x77647261, + 0x20657261, + 0x65726f63, + 0x6d756e20, + 0x73726562, + 0x756e203a, + 0x7265626d, + 0x20666f20, + 0x64726168, + 0x20657261, + 0x65726f63, + 0x20736920, + 0x656c6c69, + 0x006c6167, + 0x69206f4e, + 0x7562746e, + 0x70732066, + 0x20656361, + 0x20726f66, + 0x7473616d, + 0x73207265, + 0x20657661, + 0x61657261, + 0x626f4a00, + 0x73656d20, + 0x65676173, + 0x754e203a, + 0x7265626d, + 0x20666f20, + 0x65726f63, + 0x61632073, + 0x6f6e206e, + 0x65622074, + 0x72657a20, + 0x4a002e6f, + 0x6d20626f, + 0x61737365, + 0x203a6567, + 0x626d754e, + 0x6f207265, + 0x6f632066, + 0x20736572, + 0x206f6f74, + 0x6772616c, + 0x4a002e65, + 0x6d20626f, + 0x61737365, + 0x203a6567, + 0x75736e55, + 0x726f7070, + 0x20646574, + 0x67616c66, + 0x65732073, + 0x4a002e74, + 0x6d20626f, + 0x61737365, + 0x203a6567, + 0x626d754e, + 0x6f207265, + 0x72662066, + 0x73656d61, + 0x6f6f7420, + 0x72616c20, + 0x002e6567, + 0x73206f6e, + 0x65636170, + 0x206e6920, + 0x20626f6a, + 0x75657571, + 0x41460065, + 0x5f4c4154, + 0x4f525245, + 0x4e555f52, + 0x49464544, + 0x0044454e, + 0x41544146, + 0x52455f4c, + 0x5f524f52, + 0x43424641, + 0x504e495f, + 0x435f5455, + 0x5552524f, + 0x46005450, + 0x4c415441, + 0x5252455f, + 0x415f524f, + 0x5f434246, + 0x5f464552, + 0x52524f43, + 0x00545055, + 0x41544146, + 0x52455f4c, + 0x5f524f52, + 0x4449534c, + 0x5254435f, + 0x414d5f4c, + 0x524f4358, + 0x4f4e5f45, + 0x45535f54, + 0x00000054, + 0x000167d6, + 0x000167ec, + 0x0001680b, + 0x00016828, + 0x65666552, + 0x636e6572, + 0x69702065, + 0x72757463, + 0x61742065, + 0x0a656c62, + 0x20646900, + 0x73203a20, + 0x75206174, + 0x72206573, + 0x70206665, + 0x70203179, + 0x63203279, + 0x6620706d, + 0x6d20746d, + 0x705f6962, + 0x20207274, + 0x5f69626d, + 0x65676170, + 0x69732873, + 0x2029657a, + 0x72747020, + 0x706f7420, + 0x746f623a, + 0x3325000a, + 0x203a2064, + 0x20643325, + 0x20643325, + 0x20643325, + 0x20643325, + 0x20643325, + 0x20643325, + 0x20643325, + 0x20207025, + 0x64362520, + 0x29642528, + 0x25202020, + 0x70253a70, + 0x694c000a, + 0x70206576, + 0x75746369, + 0x74206572, + 0x656c6261, + 0x754e000a, + 0x203a206d, + 0x20206425, + 0x646c4f20, + 0x20747365, + 0x000a6425, + 0x20786469, + 0x7473203a, + 0x73752061, + 0x69702065, + 0x20646963, + 0x69666572, + 0x696c2064, + 0x7973656e, + 0x7220636e, + 0x20206665, + 0x6576696c, + 0x73666572, + 0x20202020, + 0x66657220, + 0x63697032, + 0x3325000a, + 0x203a2064, + 0x20643325, + 0x20643325, + 0x33252020, + 0x20202064, + 0x20643325, + 0x36252020, + 0x33252064, + 0x30202064, + 0x38302578, + 0x33252078, + 0x33252064, + 0x33252064, + 0x33252064, + 0x33252064, + 0x33252064, + 0x33252064, + 0x33252064, + 0x33252064, + 0x33252064, + 0x33252064, + 0x33252064, + 0x33252064, + 0x33252064, + 0x33252064, + 0x33252064, + 0x50000a64, + 0x61766972, + 0x72206574, + 0x61626665, + 0x203a6b6e, + 0x6f6c6f63, + 0x78302072, + 0x6d207825, + 0x625f7861, + 0x65666675, + 0x25207372, + 0x626d2075, + 0x75252077, + 0x68626d20, + 0x20752520, + 0x65736162, + 0x6464615f, + 0x78302072, + 0x78383025, + 0x2020000a, + 0x78646920, + 0x61747320, + 0x66657220, + 0x6464615f, + 0x20202072, + 0x2077626d, + 0x68626d20, + 0x2020000a, + 0x75332520, + 0x75332520, + 0x25783020, + 0x0a783830, + 0x6e652800, + 0x666f2064, + 0x69727020, + 0x65746176, + 0x66657220, + 0x6b6e6162, + 0x6d756420, + 0x000a2970, + 0x75736e55, + 0x726f7070, + 0x20646574, + 0x6f736572, + 0x6974756c, + 0x203a6e6f, + 0x2064255b, + 0x64252078, + 0x6f63005d, + 0x70757272, + 0x6c732074, + 0x00656369, + 0x2d746573, + 0x2074706f, + 0x666f7270, + 0x6e696c69, + 0x61203a67, + 0x6d206772, + 0x20747375, + 0x30206562, + 0x20726f20, + 0x65730031, + 0x706f2d74, + 0x73652074, + 0x69706163, + 0x203a676e, + 0x20677261, + 0x7473756d, + 0x20656220, + 0x726f2030, + 0x73003120, + 0x6f2d7465, + 0x6e207470, + 0x20756c61, + 0x6d726f66, + 0x203a7461, + 0x6e6b6e55, + 0x206e776f, + 0x6d726f66, + 0x73007461, + 0x6f2d7465, + 0x6e207470, + 0x20756c61, + 0x6d726f66, + 0x203a7461, + 0x75736e55, + 0x726f7070, + 0x20646574, + 0x6d726f66, + 0x73007461, + 0x6f2d7465, + 0x69207470, + 0x726f6e67, + 0x74732065, + 0x6d616572, + 0x61656820, + 0x73726564, + 0x7261203a, + 0x756d2067, + 0x62207473, + 0x20302065, + 0x3120726f, + 0x74657300, + 0x74706f2d, + 0x61726620, + 0x7220656d, + 0x64726f65, + 0x6e697265, + 0x61203a67, + 0x6d206772, + 0x20747375, + 0x30206562, + 0x20726f20, + 0x65730031, + 0x706f2d74, + 0x6f682074, + 0x70207473, + 0x6f746f72, + 0x206c6f63, + 0x6e697270, + 0x203a7374, + 0x20677261, + 0x7473756d, + 0x20656220, + 0x726f2030, + 0x46003120, + 0x6978656c, + 0x20656c62, + 0x6e776f64, + 0x6c616373, + 0x6f6e2065, + 0x75732074, + 0x726f7070, + 0x20646574, + 0x68207962, + 0x77647261, + 0x00657261, + 0x5f6c7364, + 0x5f736f70, + 0x65646f6d, + 0x6c6e6f20, + 0x76612079, + 0x616c6961, + 0x20656c62, + 0x68206e69, + 0x20686769, + 0x63657270, + 0x6f697369, + 0x6f64206e, + 0x63736e77, + 0x20656c61, + 0x65646f6d, + 0x6e49002e, + 0x66754274, + 0x20000a3a, + 0x676f6c20, + 0x61705f32, + 0x735f6567, + 0x20657a69, + 0x756e2020, + 0x61705f6d, + 0x20736567, + 0x65726628, + 0x000a2965, + 0x20202020, + 0x64323025, + 0x20202020, + 0x20202020, + 0x20202020, + 0x20643525, + 0x64252820, + 0x74796220, + 0x0a297365, + 0x626e5500, + 0x6b636f6c, + 0x20676e69, + 0x69736572, + 0x3a73657a, + 0x0a642520, + 0x746f5400, + 0x61206c61, + 0x636f6c6c, + 0x64657461, + 0x64382520, + 0x73752820, + 0x25206465, + 0x75202c64, + 0x6572666e, + 0x6c626165, + 0x64252065, + 0x7266202c, + 0x25206565, + 0x000a2964, + 0x646e6553, + 0x20676e69, + 0x20666572, + 0x6d617266, + 0x6e752065, + 0x64657375, + 0x64646120, + 0x73736572, + 0x78383025, + 0x6552000a, + 0x76696563, + 0x53206465, + 0x43544957, + 0x52000a48, + 0x69656365, + 0x20646576, + 0x20424f4a, + 0x67616c66, + 0x75253d73, + 0x61726620, + 0x3d73656d, + 0x63207525, + 0x7365726f, + 0x0a75253d, + 0x54455300, + 0x54504f5f, + 0x204e4f49, + 0x6c696166, + 0x203a6465, + 0x000a7325, + 0x2f355600, + 0x482d3756, + 0x44343632, + 0x203a4345, + 0x63655200, + 0x65766569, + 0x45532064, + 0x504f5f54, + 0x4e4f4954, + 0x74616420, + 0x69735f61, + 0x2520657a, + 0x706f2075, + 0x6e695f74, + 0x20786564, + 0x61207525, + 0x30206772, + 0x38302578, + 0x53000a78, + 0x69737365, + 0x6f206e6f, + 0x6f697470, + 0x6320736e, + 0x6f206e61, + 0x20796c6e, + 0x63206562, + 0x676e6168, + 0x69206465, + 0x5453206e, + 0x4550504f, + 0x74732044, + 0x2e657461, + 0x54455300, + 0x54504f5f, + 0x204e4f49, + 0x202c4b4f, + 0x666e6f63, + 0x696d7269, + 0x000a676e, + 0x65636552, + 0x64657669, + 0x4c444920, + 0x43415f45, + 0x47000a4b, + 0x4920746f, + 0x5f454c44, + 0x204b4341, + 0x68746977, + 0x2074756f, + 0x746e6573, + 0x4c444920, + 0x52002e45, + 0x69656365, + 0x20646576, + 0x454c4552, + 0x5f455341, + 0x5f464552, + 0x4d415246, + 0x61642045, + 0x735f6174, + 0x20657a69, + 0x62207525, + 0x65666675, + 0x64615f72, + 0x73657264, + 0x78302073, + 0x78383025, + 0x6572000a, + 0x7361656c, + 0x65722065, + 0x72662066, + 0x3a656d61, + 0x64646120, + 0x73736572, + 0x746f6e20, + 0x206e6920, + 0x696c6176, + 0x65722064, + 0x6e6f6967, + 0x6553002e, + 0x6e69646e, + 0x72662067, + 0x5f656d61, + 0x6f6c6c61, + 0x61705f63, + 0x736d6172, + 0x2077203a, + 0x68207525, + 0x20752520, + 0x63626661, + 0x20752520, + 0x6d207525, + 0x25206962, + 0x6f642075, + 0x63736e77, + 0x64656c61, + 0x6172665f, + 0x775f656d, + 0x68746469, + 0x2c75253d, + 0x6e776f64, + 0x6c616373, + 0x665f6465, + 0x656d6172, + 0x6965685f, + 0x3d746867, + 0x0a2e7525, + 0x6e655300, + 0x676e6964, + 0x71657320, + 0x636e6575, + 0x61705f65, + 0x736d6172, + 0x7830203a, + 0x38302520, + 0x30252078, + 0x000a7838, + 0x646e6553, + 0x20676e69, + 0x66667562, + 0x705f7265, + 0x6d617261, + 0x70797420, + 0x75252065, + 0x7a697320, + 0x7a252065, + 0x53000a75, + 0x20646e65, + 0x65727473, + 0x63206d61, + 0x7572726f, + 0x203a7470, + 0x000a7325, + 0x646e6553, + 0x72747320, + 0x206d6165, + 0x20746f6e, + 0x70707573, + 0x6574726f, + 0x25203a64, + 0x53000a73, + 0x69646e65, + 0x5320676e, + 0x43544957, + 0x5f444548, + 0x000a4e49, + 0x646e6553, + 0x20676e69, + 0x5f424f4a, + 0x55514544, + 0x44455545, + 0x4449000a, + 0x2820454c, + 0x656c6469, + 0x6e65735f, + 0x6f745f74, + 0x736f685f, + 0x75252074, + 0x6e69202c, + 0x5f667562, + 0x20746e63, + 0x202c7525, + 0x6274756f, + 0x635f6675, + 0x2520746e, + 0x000a2975, + 0x61202020, + 0x6c696176, + 0x726f7720, + 0x69207364, + 0x6f63206e, + 0x71206d6d, + 0x65756575, + 0x6d203a73, + 0x25206773, + 0x6e692075, + 0x20667562, + 0x6f207525, + 0x75627475, + 0x75252066, + 0x6573000a, + 0x6e69646e, + 0x65722067, + 0x6e6f7073, + 0x63206573, + 0x2065646f, + 0x000a6425, + 0x646e6553, + 0x20676e69, + 0x434f5250, + 0x45535345, + 0x25000a44, + 0x73252073, + 0x65766d20, + 0x66756220, + 0x20726566, + 0x6d617266, + 0x69282065, + 0x6675626e, + 0x746e635f, + 0x2c752520, + 0x74756f20, + 0x5f667562, + 0x20746e63, + 0x0a297525, + 0x20202000, + 0x736f6820, + 0x61685f74, + 0x656c646e, + 0x25783020, + 0x25783830, + 0x20783830, + 0x72657375, + 0x7461645f, + 0x61745f61, + 0x78302067, + 0x78383025, + 0x78383025, + 0x2020000a, + 0x72662020, + 0x5f656d61, + 0x67616c66, + 0x78302073, + 0x78383025, + 0x706f7420, + 0x20752520, + 0x20746f62, + 0x65207525, + 0x2520736f, + 0x65722075, + 0x7525206a, + 0x2020000a, + 0x6f662020, + 0x74616d72, + 0x25783020, + 0x20783430, + 0x69736976, + 0x20656c62, + 0x25787525, + 0x20000a75, + 0x6d202020, + 0x5f696e69, + 0x6d617266, + 0x20795f65, + 0x2d752528, + 0x0a297525, + 0x20202000, + 0x616c7020, + 0x2073656e, + 0x30257830, + 0x202c7838, + 0x30257830, + 0x000a7838, + 0x20202020, + 0x657a6973, + 0x75252073, + 0x7525202c, + 0x2020000a, + 0x72632020, + 0x2078706f, + 0x63207525, + 0x79706f72, + 0x20752520, + 0x63626661, + 0x735f775f, + 0x75252062, + 0x20752520, + 0x63626661, + 0x7261705f, + 0x20736d61, + 0x30257830, + 0x000a7838, + 0x20202020, + 0x6b656570, + 0x25783020, + 0x25783230, + 0x25783230, + 0x25783230, + 0x0a783230, + 0x20202000, + 0x616c7020, + 0x745f656e, + 0x3020706f, + 0x38302578, + 0x78302078, + 0x78383025, + 0x25783020, + 0x0a783830, + 0x20202000, + 0x616c7020, + 0x625f656e, + 0x3020746f, + 0x38302578, + 0x78302078, + 0x78383025, + 0x25783020, + 0x0a783830, + 0x20202000, + 0x72747320, + 0x73656469, + 0x25202020, + 0x64252064, + 0x0a642520, + 0x20202000, + 0x78616d20, + 0x78752520, + 0x000a7525, + 0x25207325, + 0x766d2073, + 0x75622065, + 0x72656666, + 0x74696220, + 0x65727473, + 0x28206d61, + 0x75626e69, + 0x6e635f66, + 0x75252074, + 0x756f202c, + 0x66756274, + 0x746e635f, + 0x29752520, + 0x2020000a, + 0x69622020, + 0x72747374, + 0x5f6d6165, + 0x67616c66, + 0x78302073, + 0x78383025, + 0x736f6520, + 0x75252066, + 0x666f6520, + 0x20752520, + 0x20736f65, + 0x65207525, + 0x7362666f, + 0x20752520, + 0x74617473, + 0x75252073, + 0x2020000a, + 0x64612020, + 0x30207264, + 0x38302578, + 0x6c612078, + 0x20636f6c, + 0x6f207525, + 0x25206666, + 0x69662075, + 0x25206c6c, + 0x25000a75, + 0x73252073, + 0x65766d20, + 0x66756220, + 0x20726566, + 0x61726170, + 0x6574656d, + 0x74202c72, + 0x20657079, + 0x000a7525, + 0x25207325, + 0x766d2073, + 0x75622065, + 0x72656666, + 0x6e656720, + 0x6c617265, + 0x6e692820, + 0x5f667562, + 0x20746e63, + 0x202c7525, + 0x6274756f, + 0x635f6675, + 0x2520746e, + 0x000a2975, + 0x20202020, + 0x65707974, + 0x2c752520, + 0x6e6f6320, + 0x5f676966, + 0x657a6973, + 0x0a752520, + 0x20202000, + 0x6e6f6320, + 0x20676966, + 0x30257830, + 0x30207832, + 0x32302578, + 0x78302078, + 0x78323025, + 0x25783020, + 0x0a783230, + 0x20202000, + 0x66756220, + 0x5f726566, + 0x20727470, + 0x30257830, + 0x202c7838, + 0x66667562, + 0x735f7265, + 0x20657a69, + 0x000a7525, + 0x74736f48, + 0x69727020, + 0x6220746e, + 0x65666675, + 0x52452072, + 0x2e524f52, + 0x20732520, + 0x6d207325, + 0x62206576, + 0x65666675, + 0x69772072, + 0x75206874, + 0x6f6e6b6e, + 0x63206e77, + 0x2065646f, + 0x000a7525, + 0x00746f47, + 0x5054554f, + 0x53005455, + 0x69646e65, + 0x4900676e, + 0x5455504e, + 0x63655200, + 0x65766965, + 0x554f2064, + 0x54555054, + 0x554c465f, + 0x73204853, + 0x65746174, + 0x20752520, + 0x7074756f, + 0x625f7475, + 0x6b636f6c, + 0x25206465, + 0x4f000a75, + 0x75707475, + 0x6c662074, + 0x20687375, + 0x796c6e6f, + 0x6c6c6120, + 0x6465776f, + 0x65687720, + 0x7473206e, + 0x6570706f, + 0x6f202c64, + 0x66612072, + 0x20726574, + 0x70736572, + 0x65736e6f, + 0x45535f20, + 0x4e455551, + 0x505f4543, + 0x4d415241, + 0x52455445, + 0x65530053, + 0x6e69646e, + 0x554f2067, + 0x54555054, + 0x554c465f, + 0x44454853, + 0x6553000a, + 0x6e69646e, + 0x4e492067, + 0x5f545550, + 0x53554c46, + 0x0a444548, + 0x63655200, + 0x65766965, + 0x4e492064, + 0x5f545550, + 0x53554c46, + 0x49000a48, + 0x5455504e, + 0x554c465f, + 0x6f204853, + 0x20796c6e, + 0x6f6c6c61, + 0x20646577, + 0x6e656877, + 0x206e6920, + 0x504f5453, + 0x20444550, + 0x74617473, + 0x52002e65, + 0x69656365, + 0x20646576, + 0x000a4f47, + 0x5f45564d, + 0x55514552, + 0x5f545345, + 0x45444f43, + 0x3a4f475f, + 0x70204120, + 0x69766572, + 0x2073756f, + 0x74617473, + 0x72742065, + 0x69736e61, + 0x6e6f6974, + 0x20736920, + 0x6c697473, + 0x6570206c, + 0x6e69646e, + 0x4e002e67, + 0x6f6a206f, + 0x6e692062, + 0x626f6a20, + 0x65757120, + 0x002e6575, + 0x65636552, + 0x64657669, + 0x4f545320, + 0x4d000a50, + 0x525f4556, + 0x45555145, + 0x435f5453, + 0x5f45444f, + 0x504f5453, + 0x2041203a, + 0x76657270, + 0x73756f69, + 0x61747320, + 0x74206574, + 0x736e6172, + 0x6f697469, + 0x7369206e, + 0x69747320, + 0x70206c6c, + 0x69646e65, + 0x002e676e, + 0x6e616843, + 0x73206567, + 0x65746174, + 0x206f7420, + 0x000a6425, + 0x646e6553, + 0x20676e69, + 0x54415453, + 0x48435f45, + 0x45474e41, + 0x77656e20, + 0x6174735f, + 0x253d6574, + 0x53000a75, + 0x65746174, + 0x61686320, + 0x2065676e, + 0x646e6570, + 0x20676e69, + 0x74617473, + 0x64253d65, + 0x6e657020, + 0x676e6964, + 0x0a64253d, + 0x63655200, + 0x65766965, + 0x55442064, + 0x000a504d, + 0x5f45564d, + 0x55514552, + 0x5f545345, + 0x45444f43, + 0x4d55445f, + 0x6f6e2050, + 0x6c612074, + 0x65776f6c, + 0x6f662064, + 0x72702072, + 0x6365746f, + 0x20646574, + 0x73736573, + 0x736e6f69, + 0x626e002e, + 0x75622072, + 0x72656666, + 0x65682073, + 0x203a646c, + 0x69207525, + 0x7475706e, + 0x20752520, + 0x7074756f, + 0x000a7475, + 0x69617661, + 0x6f77206c, + 0x20736472, + 0x63206e69, + 0x206d6d6f, + 0x75657571, + 0x203a7365, + 0x2067736d, + 0x69207525, + 0x6675626e, + 0x20752520, + 0x6274756f, + 0x25206675, + 0x52000a75, + 0x69656365, + 0x20646576, + 0x474e4950, + 0x6552000a, + 0x76696563, + 0x44206465, + 0x47554245, + 0x736d202c, + 0x643e2d67, + 0x5f617461, + 0x657a6973, + 0x2c64253d, + 0x76656c20, + 0x253d6c65, + 0x63000a64, + 0x2065646f, + 0x6425203d, + 0x7254000a, + 0x69736e61, + 0x6e6f6974, + 0x46494620, + 0x766f204f, + 0x6c667265, + 0x5500776f, + 0x7075736e, + 0x74726f70, + 0x6d206465, + 0x61737365, + 0x63206567, + 0x2e65646f, + 0x69424d00, + 0x206f666e, + 0x7074756f, + 0x6e207475, + 0x6120746f, + 0x776f6c6c, + 0x66206465, + 0x7020726f, + 0x65746f72, + 0x64657463, + 0x73657320, + 0x6e6f6973, + 0x6142002e, + 0x424d2064, + 0x6f666e69, + 0x74756f20, + 0x3b747570, + 0x78616d20, + 0x7a69735f, + 0x73282065, + 0x64697274, + 0x5d305b65, + 0x756d2029, + 0x62207473, + 0x6f6e2065, + 0x656e2d6e, + 0x69746167, + 0x000a6576, + 0x20646142, + 0x6e69424d, + 0x6f206f66, + 0x75707475, + 0x75203b74, + 0x5f646573, + 0x657a6973, + 0x73756d20, + 0x6f6e2074, + 0x65622074, + 0x72616c20, + 0x20726567, + 0x6e616874, + 0x78616d20, + 0x7a69735f, + 0x4d000a65, + 0x666e6942, + 0x756f206f, + 0x74757074, + 0x66756220, + 0x20726566, + 0x20736168, + 0x656c6c69, + 0x206c6167, + 0x61636f6c, + 0x6e6f6974, + 0x64614200, + 0x69424d20, + 0x206f666e, + 0x7074756f, + 0x62207475, + 0x65666675, + 0x4e002e72, + 0x7573206f, + 0x726f7070, + 0x6f662074, + 0x68742072, + 0x62207369, + 0x65666675, + 0x6f632072, + 0x20726f6c, + 0x6d726f66, + 0x002e7461, + 0x64726168, + 0x65726177, + 0x656f6420, + 0x6f6e2073, + 0x75732074, + 0x726f7070, + 0x46412074, + 0x6f204342, + 0x75707475, + 0x61680074, + 0x61776472, + 0x64206572, + 0x2073656f, + 0x20746f6e, + 0x70707573, + 0x2074726f, + 0x5f45564d, + 0x4d524f46, + 0x595f5441, + 0x32345655, + 0x30505f30, + 0x54003031, + 0x20736968, + 0x65727473, + 0x6e206d61, + 0x73646565, + 0x206e6120, + 0x65746e69, + 0x63616c72, + 0x62206465, + 0x65666675, + 0x54002e72, + 0x20736968, + 0x65727473, + 0x6e206d61, + 0x73646565, + 0x6e206120, + 0x692d6e6f, + 0x7265746e, + 0x6563616c, + 0x75622064, + 0x72656666, + 0x694d002e, + 0x726f7272, + 0x20676e69, + 0x6e207369, + 0x7320746f, + 0x6f707075, + 0x64657472, + 0x726f6620, + 0x63656420, + 0x2e65646f, + 0x74694200, + 0x74706564, + 0x666f2068, + 0x42464120, + 0x756f2043, + 0x74757074, + 0x66756220, + 0x20726566, + 0x7473756d, + 0x20656220, + 0x622d3031, + 0x62207469, + 0x75616365, + 0x6f206573, + 0x65642066, + 0x65646f63, + 0x74732064, + 0x6d616572, + 0x6942002e, + 0x70656474, + 0x6f206874, + 0x46412066, + 0x6f204342, + 0x75707475, + 0x75622074, + 0x72656666, + 0x73756d20, + 0x65622074, + 0x622d3820, + 0x62207469, + 0x75616365, + 0x6f206573, + 0x65642066, + 0x65646f63, + 0x74732064, + 0x6d616572, + 0x4641002e, + 0x66204342, + 0x616d726f, + 0x756d2074, + 0x62207473, + 0x3a342065, + 0x20323a32, + 0x636e6973, + 0x65642065, + 0x65646f63, + 0x74732064, + 0x6d616572, + 0x2e736920, + 0x42464100, + 0x6f662043, + 0x74616d72, + 0x73756d20, + 0x65622074, + 0x323a3420, + 0x7320303a, + 0x65636e69, + 0x63656420, + 0x6465646f, + 0x72747320, + 0x206d6165, + 0x002e7369, + 0x61746f52, + 0x6e6f6974, + 0x20736920, + 0x20746f6e, + 0x70707573, + 0x6574726f, + 0x6f662064, + 0x46412072, + 0x62204342, + 0x65666675, + 0x002e7372, + 0x43424641, + 0x776f6420, + 0x6163736e, + 0x676e696c, + 0x746f6e20, + 0x70757320, + 0x74726f70, + 0x66206465, + 0x6920726f, + 0x7265746e, + 0x6563616c, + 0x74732064, + 0x6d616572, + 0x6e490073, + 0x696c6176, + 0x63732064, + 0x6e696c61, + 0x65732067, + 0x6f662074, + 0x46412072, + 0x62204342, + 0x65666675, + 0x6d202c72, + 0x20747375, + 0x30206562, + 0x20726f20, + 0x46002e31, + 0x6420726f, + 0x736e776f, + 0x696c6163, + 0x202c676e, + 0x43424641, + 0x616c7020, + 0x3120656e, + 0x20736920, + 0x20746f6e, + 0x76206e69, + 0x64696c61, + 0x6d656d20, + 0x2079726f, + 0x69676572, + 0x002e6e6f, + 0x43424641, + 0x616c7020, + 0x3120656e, + 0x7a697320, + 0x68732065, + 0x646c756f, + 0x746f6e20, + 0x20656220, + 0x6f72657a, + 0x4641002e, + 0x70204342, + 0x656e616c, + 0x69203020, + 0x6f6e2073, + 0x6e692074, + 0x6c617620, + 0x6d206469, + 0x726f6d65, + 0x65722079, + 0x6e6f6967, + 0x4641002e, + 0x70204342, + 0x656e616c, + 0x73203020, + 0x20657a69, + 0x756f6873, + 0x6e20646c, + 0x6220746f, + 0x657a2065, + 0x002e6f72, + 0x20726f46, + 0x65746e69, + 0x63616c72, + 0x41202c65, + 0x20434246, + 0x6e616c70, + 0x20312065, + 0x6e207369, + 0x6920746f, + 0x6176206e, + 0x2064696c, + 0x6f6d656d, + 0x72207972, + 0x6f696765, + 0x46002e6e, + 0x6920726f, + 0x7265746e, + 0x6563616c, + 0x6661202c, + 0x775f6362, + 0x68746469, + 0x5f6e695f, + 0x65707573, + 0x6f6c6272, + 0x20736b63, + 0x7473756d, + 0x20656220, + 0x20656874, + 0x656d6173, + 0x726f6620, + 0x746f6220, + 0x6c702068, + 0x73656e61, + 0x4641002e, + 0x74204342, + 0x64656c69, + 0x61656820, + 0x20726564, + 0x75716572, + 0x73657269, + 0x6c697420, + 0x62206465, + 0x2e79646f, + 0x42464100, + 0x32332043, + 0x73203878, + 0x72657075, + 0x636f6c62, + 0x6e20736b, + 0x7320746f, + 0x6f707075, + 0x64657472, + 0x726f6620, + 0x63656420, + 0x2065646f, + 0x7074756f, + 0x43007475, + 0x6e206e61, + 0x7520746f, + 0x34206573, + 0x323a323a, + 0x66756220, + 0x20726566, + 0x73206669, + 0x61657274, + 0x7369206d, + 0x323a3420, + 0x002e303a, + 0x61766e49, + 0x2064696c, + 0x6c616373, + 0x20676e69, + 0x20746573, + 0x20726f66, + 0x6e616c70, + 0x62207261, + 0x65666675, + 0x6d002e72, + 0x665f7861, + 0x656d6172, + 0x6469775f, + 0x73206874, + 0x6c756f68, + 0x65622064, + 0x72616c20, + 0x20726567, + 0x6e616874, + 0x72657a20, + 0x6d002e6f, + 0x665f7861, + 0x656d6172, + 0x6965685f, + 0x20746867, + 0x756f6873, + 0x6220646c, + 0x616c2065, + 0x72656772, + 0x61687420, + 0x657a206e, + 0x002e6f72, + 0x75736e55, + 0x726f7070, + 0x20646574, + 0x6e616c70, + 0x62207261, + 0x65666675, + 0x6f632072, + 0x20726f6c, + 0x6d726f66, + 0x002e7461, + 0x69727453, + 0x74206564, + 0x73206f6f, + 0x6c6c616d, + 0x206f7420, + 0x646c6f68, + 0x78616d20, + 0x6172665f, + 0x775f656d, + 0x68746469, + 0x6c70002e, + 0x5f656e61, + 0x20706f74, + 0x7473756d, + 0x20656220, + 0x6d206e69, + 0x726f6d65, + 0x65722079, + 0x6e6f6967, + 0x41524620, + 0x5542454d, + 0x70002e46, + 0x656e616c, + 0x746f625f, + 0x73756d20, + 0x65622074, + 0x206e6920, + 0x6f6d656d, + 0x72207972, + 0x6f696765, + 0x5246206e, + 0x42454d41, + 0x002e4655, + 0x6e616c70, + 0x6f625f65, + 0x68732074, + 0x646c756f, + 0x20656220, + 0x6f72657a, + 0x726f6620, + 0x6e6f6e20, + 0x746e692d, + 0x616c7265, + 0x20646563, + 0x65727473, + 0x002e6d61, + 0x72646441, + 0x20737365, + 0x7520666f, + 0x6573756e, + 0x6c702064, + 0x20656e61, + 0x756f6873, + 0x6220646c, + 0x657a2065, + 0x002e6f72, + 0x69727453, + 0x6f206564, + 0x6e752066, + 0x64657375, + 0x616c7020, + 0x7320656e, + 0x6c756f68, + 0x65622064, + 0x72657a20, + 0x52002e6f, + 0x7461746f, + 0x206e6f69, + 0x206e6163, + 0x20746f6e, + 0x64206562, + 0x20656e6f, + 0x20726f66, + 0x3a323a34, + 0x57002e32, + 0x48435441, + 0x20474f44, + 0x00717269, + 0x2a2a2a2a, + 0x53415220, + 0x20642543, + 0x524f4241, + 0x2a2a2054, + 0x000a2a2a, + 0x43502020, + 0x20202020, + 0x7830203d, + 0x78383025, + 0x2020000a, + 0x20205253, + 0x203d2020, + 0x30257830, + 0x000a7838, + 0x41462020, + 0x20202052, + 0x7830203d, + 0x78383025, + 0x2020000a, + 0x32255b52, + 0x3d205d64, + 0x25783020, + 0x0a783830, + 0x766e4900, + 0x64696c61, + 0x66756220, + 0x20726566, + 0x4d206e69, + 0x435f4556, + 0x5f4d4d4f, + 0x5f465542, + 0x5f514e49, + 0x52444441, + 0x78652820, + 0x74636570, + 0x6d206465, + 0x625f6576, + 0x65666675, + 0x69625f72, + 0x72747374, + 0x296d6165, + 0x6e49002e, + 0x696c6176, + 0x6e692064, + 0x20747570, + 0x66667562, + 0x002e7265, + 0x78656c46, + 0x656c6269, + 0x776f6420, + 0x6163736e, + 0x6e20656c, + 0x7320746f, + 0x6f707075, + 0x64657472, + 0x20796220, + 0x64726168, + 0x65726177, + 0x6143002e, + 0x6f6e206e, + 0x73752074, + 0x2d2d2065, + 0x6e776f64, + 0x6163735f, + 0x5820656c, + 0x74697720, + 0x2d2d2068, + 0x5f6c7364, + 0x69746172, + 0x6f685f6f, + 0x65762f72, + 0x6e612072, + 0x73642064, + 0x72665f6c, + 0x5f656d61, + 0x74646977, + 0x65682f68, + 0x74686769, + 0x20746120, + 0x656d6173, + 0x6d697420, + 0x43002e65, + 0x6e206e61, + 0x7520746f, + 0x2d206573, + 0x6c73642d, + 0x7461725f, + 0x685f6f69, + 0x762f726f, + 0x58207265, + 0x74697720, + 0x73642068, + 0x72665f6c, + 0x5f656d61, + 0x74646977, + 0x65682f68, + 0x74686769, + 0x20746120, + 0x656d6173, + 0x6d697420, + 0x66002e65, + 0x6978656c, + 0x20656c62, + 0x6e776f64, + 0x6c616373, + 0x20676e69, + 0x75736e75, + 0x726f7070, + 0x20646574, + 0x75706e69, + 0x65722074, + 0x756c6f73, + 0x6e6f6974, + 0x61687420, + 0x656c2074, + 0x74207373, + 0x206e6168, + 0x41002e32, + 0x2c434246, + 0x20726f20, + 0x2c746f6e, + 0x73756d20, + 0x65622074, + 0x65737520, + 0x6f632064, + 0x7369736e, + 0x746e6574, + 0x6420796c, + 0x6e697275, + 0x65642067, + 0x65646f63, + 0x49424d00, + 0x204f464e, + 0x7074756f, + 0x202c7475, + 0x6e20726f, + 0x202c746f, + 0x7473756d, + 0x20656220, + 0x64657375, + 0x6e6f6320, + 0x74736973, + 0x6c746e65, + 0x75642079, + 0x676e6972, + 0x63656420, + 0x0065646f, + 0x61766e49, + 0x2064696c, + 0x5f65766d, + 0x66667562, + 0x675f7265, + 0x72656e65, + 0x69206c61, + 0x564d206e, + 0x4f435f45, + 0x425f4d4d, + 0x4f5f4655, + 0x5f515455, + 0x52444441, + 0x6950002e, + 0x70206570, + 0x75746369, + 0x6a206572, + 0x6120626f, + 0x6165726c, + 0x68207964, + 0x61207361, + 0x564d206e, + 0x55425f45, + 0x52454646, + 0x444f435f, + 0x45475f45, + 0x4152454e, + 0x6568204c, + 0x72656461, + 0x73736120, + 0x6169636f, + 0x20646574, + 0x68746977, + 0x00746920, + 0x75736e55, + 0x726f7070, + 0x20646574, + 0x65707974, + 0x20666f20, + 0x5f65766d, + 0x66667562, + 0x675f7265, + 0x72656e65, + 0x62206c61, + 0x65666675, + 0x6e692072, + 0x74756f20, + 0x20747570, + 0x75657571, + 0x49002e65, + 0x6c61766e, + 0x62206469, + 0x65666675, + 0x6e692072, + 0x45564d20, + 0x4d4f435f, + 0x55425f4d, + 0x554f5f46, + 0x415f5154, + 0x20524444, + 0x70786528, + 0x65746365, + 0x766d2064, + 0x75625f65, + 0x72656666, + 0x6172665f, + 0x6f20656d, + 0x766d2072, + 0x75625f65, + 0x72656666, + 0x6e65675f, + 0x6c617265, + 0x44002e29, + 0x203a4250, + 0x5f6d756e, + 0x6d617266, + 0x253d7365, + 0x73752064, + 0x3d656761, + 0x30257830, + 0x64207838, + 0x665f6270, + 0x6e6c6c75, + 0x3d737365, + 0x6c206425, + 0x5f657669, + 0x5f666572, + 0x70736964, + 0x73616d5f, + 0x78303d6b, + 0x000a7825, + 0x3a425044, + 0x64322520, + 0x6469203a, + 0x32253d78, + 0x69642064, + 0x616c7073, + 0x726f5f79, + 0x3d726564, + 0x20643625, + 0x73756c66, + 0x64253d68, + 0x6e657020, + 0x676e6964, + 0x2064253d, + 0x66667562, + 0x755f7265, + 0x3d646573, + 0x6e206425, + 0x756f5f6f, + 0x74757074, + 0x2064253d, + 0x725f7369, + 0x253d6665, + 0x61742064, + 0x74656772, + 0x3d64695f, + 0x000a6425, + 0x7373696d, + 0x20676e69, + 0x74726170, + 0x666f2073, + 0x61726620, + 0x4900656d, + 0x6c61766e, + 0x62206469, + 0x65666675, + 0x6e692072, + 0x45564d20, + 0x4d4f435f, + 0x55425f4d, + 0x4e495f46, + 0x44415f51, + 0x28205244, + 0x65707865, + 0x64657463, + 0x65766d20, + 0x6675625f, + 0x5f726566, + 0x73746962, + 0x61657274, + 0x002e296d, + 0x2d746573, + 0x2074706f, + 0x34363268, + 0x3a636564, + 0x736e5520, + 0x6f707075, + 0x64657472, + 0x74706f20, + 0x006e6f69, + 0x64616568, + 0x70207265, + 0x65737261, + 0x72726520, + 0x202c726f, + 0x3a434950, + 0x5d64255b, + 0x5244492c, + 0x64255b3a, + 0x52462c5d, + 0x3a454d41, + 0x5d64255b, + 0x5444552c, + 0x2578305b, + 0x25783830, + 0x5d783830, + 0x736e7500, + 0x6f707075, + 0x64657472, + 0x6f727020, + 0x656c6966, + 0x736e7500, + 0x6f707075, + 0x64657472, + 0x72686320, + 0x5f616d6f, + 0x6d726f66, + 0x695f7461, + 0x55006364, + 0x7075736e, + 0x74726f70, + 0x6d206465, + 0x66666162, + 0x72747320, + 0x206d6165, + 0x68746977, + 0x64697720, + 0x6f206874, + 0x20726576, + 0x38343032, + 0x00000000, + 0x01270723, + 0x0000000a, + 0x00000063, + 0x00000063, + 0x0000000e, + 0x0000000b, + 0x0000018c, + 0x000000e1, + 0x00000014, + 0x0000000c, + 0x0000018c, + 0x00000252, + 0x00000028, + 0x0000000d, + 0x0000018c, + 0x00000252, + 0x00000050, + 0x00000014, + 0x0000018c, + 0x00000252, + 0x00000050, + 0x00000015, + 0x00000318, + 0x000004a4, + 0x000000a0, + 0x00000016, + 0x00000654, + 0x000007e9, + 0x000000a0, + 0x0000001e, + 0x00000654, + 0x000007e9, + 0x00000190, + 0x0000001f, + 0x00000e10, + 0x00001194, + 0x00000230, + 0x00000020, + 0x00001400, + 0x00001400, + 0x00000320, + 0x00000028, + 0x00002000, + 0x00002000, + 0x000003e8, + 0x00000029, + 0x00002000, + 0x00002000, + 0x000009c4, + 0x0000002a, + 0x00002200, + 0x00002200, + 0x000009c4, + 0x00000032, + 0x00005640, + 0x00006bd0, + 0x00001518, + 0x00000033, + 0x00009000, + 0x0000b400, + 0x00002580, + 0x0000003c, + 0x00022000, + 0x0002a800, + 0x00002580, + 0x0000003d, + 0x00022000, + 0x0002a800, + 0x00004b00, + 0x0000003e, + 0x00022000, + 0x0002a800, + 0x00007d00, + 0x000000ff, + 0x00022000, + 0x0002a800, + 0x00007d00, + 0x01010000, + 0x0b0a0b0c, + 0x21280b10, + 0x0b140b18, + 0x21500b20, + 0x0b0f0b12, + 0x63a02140, + 0x02030304, + 0x00000102, + 0x074da342, + 0x47642758, + 0x0000476e, + 0xff0100ff, + 0xffff0403, + 0x08040100, + 0x06030205, + 0x0a0d0c09, + 0x0f0e0b07, + 0x10080100, + 0x0a030209, + 0x19201811, + 0x05040b12, + 0x211a130c, + 0x22293028, + 0x060d141b, + 0x1c150e07, + 0x38312a23, + 0x242b3239, + 0x170f161d, + 0x332c251e, + 0x2d343b3a, + 0x2e271f26, + 0x363d3c35, + 0x3f3e372f, + 0x00018558, + 0x00018558, + 0x00018558, + 0x00018568, + 0x00018568, + 0x00018568, + 0x00018578, + 0x000185b8, + 0x140d0d06, + 0x1c1c1414, + 0x20201c1c, + 0x2a252520, + 0x140e0e0a, + 0x18181414, + 0x1b1b1818, + 0x221e1e1b, + 0x0d0a0a06, + 0x10100d0b, + 0x12121010, + 0x17121212, + 0x17171717, + 0x19191917, + 0x19191919, + 0x1b1b1b1b, + 0x1b1b1b1b, + 0x1d1d1d1d, + 0x1f1d1d1d, + 0x1f1f1f1f, + 0x2121211f, + 0x24242121, + 0x26262424, + 0x2a282826, + 0x0f0d0d09, + 0x11110f0d, + 0x13131111, + 0x15131313, + 0x15151515, + 0x16161615, + 0x16161616, + 0x18181818, + 0x18181818, + 0x19191919, + 0x1b191919, + 0x1b1b1b1b, + 0x1c1c1c1b, + 0x1e1e1c1c, + 0x20201e1e, + 0x23212120, + 0x75736e75, + 0x726f7070, + 0x20646574, + 0x5f746962, + 0x74706564, + 0x6f740068, + 0x6977206f, + 0x70206564, + 0x75746369, + 0x202c6572, + 0x5f73626d, + 0x5f726570, + 0x656e696c, + 0x4d203e20, + 0x575f5841, + 0x48544449, + 0x53424d5f, + 0x00000000, + 0x01000201, + 0x6e6f4c00, + 0x65742067, + 0x70206d72, + 0x75746369, + 0x69206572, + 0x7865646e, + 0x2064253d, + 0x676e6f4c, + 0x6d726554, + 0x6d617246, + 0x78644965, + 0x2064253d, + 0x6b73616d, + 0x6164253d, + 0x6165726c, + 0x6d207964, + 0x656b7261, + 0x6f662064, + 0x65722072, + 0x65726566, + 0x0a65636e, + 0x72615700, + 0x676e696e, + 0x70202d20, + 0x75746369, + 0x6e206572, + 0x6c20746f, + 0x20676e6f, + 0x6d726574, + 0x6157000a, + 0x6e696e72, + 0x202d2067, + 0x74636970, + 0x20657275, + 0x20746f6e, + 0x726f6873, + 0x65742074, + 0x000a6d72, + 0x2a2a2a2a, + 0x53415220, + 0x20642543, + 0x524f4241, + 0x2a2a2054, + 0x000a2a2a, + 0x43502020, + 0x20202020, + 0x7830203d, + 0x78383025, + 0x2020000a, + 0x20205253, + 0x203d2020, + 0x30257830, + 0x000a7838, + 0x41462020, + 0x20202052, + 0x7830203d, + 0x78383025, + 0x2020000a, + 0x32255b52, + 0x3d205d64, + 0x25783020, + 0x0a783830, + 0x73657200, + 0x61756469, + 0x3020736c, + 0x20702578, + 0x78257830, + 0x0000000a, + 0x0000fbfb, + 0x0000fbfb, + 0x0000fbfb, + 0x0000fbfb, + 0x75736e55, + 0x726f7070, + 0x20646574, + 0x6e776f64, + 0x6c616373, + 0x20676e69, + 0x69746172, + 0x2a00216f, + 0x202a2a2a, + 0x43534152, + 0x41206425, + 0x54524f42, + 0x2a2a2a20, + 0x20000a2a, + 0x20435020, + 0x3d202020, + 0x25783020, + 0x0a783830, + 0x53202000, + 0x20202052, + 0x30203d20, + 0x38302578, + 0x20000a78, + 0x52414620, + 0x3d202020, + 0x25783020, + 0x0a783830, + 0x52202000, + 0x6432255b, + 0x203d205d, + 0x30257830, + 0x000a7838, + 0x78656c46, + 0x656c6269, + 0x776f4420, + 0x6163736e, + 0x676e696c, + 0x656f6420, + 0x6f6e2073, + 0x75732074, + 0x726f7070, + 0x69742074, + 0x2064656c, + 0x7074756f, + 0x66207475, + 0x616d726f, + 0x46002e74, + 0x2078656c, + 0x206c7364, + 0x706f7263, + 0x72726520, + 0x6f20726f, + 0x72756363, + 0x2c646572, + 0x656c7020, + 0x20657361, + 0x20786966, + 0x00217469, + 0x00011838, + 0x00011838, + 0x00011838, + 0x00011838, + 0x33323130, + 0x37363534, + 0x00003938, + 0x33323130, + 0x37363534, + 0x62613938, + 0x66656463, + 0x72726f43, + 0x65747075, + 0x6e692064, + 0x20747570, + 0x75657571, + 0x4f002e65, + 0x20796c6e, + 0x5f45564d, + 0x46465542, + 0x435f5245, + 0x5f45444f, + 0x4d415246, + 0x726f2045, + 0x45564d20, + 0x4655425f, + 0x5f524546, + 0x45444f43, + 0x4e45475f, + 0x4c415245, + 0x6c6c6120, + 0x6465776f, + 0x6e49002e, + 0x696c6176, + 0x75622064, + 0x72656666, + 0x61656820, + 0x20726564, + 0x4d206e69, + 0x435f4556, + 0x5f4d4d4f, + 0x5f465542, + 0x5154554f, + 0x4444415f, + 0x54002e52, + 0x6c206f6f, + 0x65677261, + 0x71657220, + 0x74736575, + 0x73656d20, + 0x65676173, + 0x6f54002e, + 0x616c206f, + 0x20656772, + 0x66667562, + 0x6d207265, + 0x61737365, + 0x002e6567, + 0x61766e49, + 0x2064696c, + 0x66667562, + 0x69207265, + 0x564d206e, + 0x4f435f45, + 0x425f4d4d, + 0x495f4655, + 0x415f514e, + 0x2e524444, + 0x45564d00, + 0x723a5052, + 0x705f6d61, + 0x746e6972, + 0x20667562, + 0x6e207369, + 0x6120746f, + 0x6c696176, + 0x656c6261, + 0x4d000a2e, + 0x50524556, + 0x6172203a, + 0x72705f6d, + 0x66746e69, + 0x6d75645f, + 0x72662070, + 0x30206d6f, + 0x0a702578, + 0x54505200, + 0x504d5544, + 0x616c663a, + 0x78253d67, + 0x6e69202c, + 0x3d786564, + 0x202c7525, + 0x635f7277, + 0x253d746e, + 0x72202c75, + 0x6e635f64, + 0x75253d74, + 0x46000a2e, + 0x75252d57, + 0x7325203a, + 0x45564d00, + 0x663a5052, + 0x3d67616c, + 0x202c7825, + 0x3d786469, + 0x202c7525, + 0x635f7277, + 0x253d746e, + 0x72202c75, + 0x6e635f64, + 0x75253d74, + 0x20000a2e, + 0x78343025, + 0x78382500, + 0x0a73253a, + 0x30252000, + 0x00007832, + 0x1007f000, + 0x49574558, + 0x35565644, + 0x2d37562f, + 0x34363248, + 0x3a434544, + 0x65720020, + 0x657a6973, + 0x7470203a, + 0x78302072, + 0x78383025, + 0x77656e20, + 0x7a69735f, + 0x75252065, + 0x766d000a, + 0x656d5f65, + 0x65725f6d, + 0x657a6973, + 0x6c616d00, + 0x3a636f6c, + 0x7a697320, + 0x75252065, + 0x616d202c, + 0x75252078, + 0x6572202c, + 0x6e6f6967, + 0x2c752520, + 0x676f6c20, + 0x6c615f32, + 0x206e6769, + 0x000a7525, + 0x6c6c616d, + 0x203a636f, + 0x75746572, + 0x64656e72, + 0x25783020, + 0x6d000a70, + 0x6d5f6576, + 0x615f6d65, + 0x636f6c6c, + 0x6c6c4100, + 0x7461636f, + 0x6d206465, + 0x726f6d65, + 0x61682079, + 0x72772073, + 0x20676e6f, + 0x67696c61, + 0x6e656d6e, + 0x78450074, + 0x74636570, + 0x61206465, + 0x636f6c6c, + 0x64657461, + 0x6d656d20, + 0x2079726f, + 0x50206e69, + 0x45544f52, + 0x44455443, + 0x67657220, + 0x2e6e6f69, + 0x70784500, + 0x65746365, + 0x6c612064, + 0x61636f6c, + 0x20646574, + 0x6f6d656d, + 0x69207972, + 0x5246206e, + 0x42454d41, + 0x72204655, + 0x6f696765, + 0x6e002e6e, + 0x7720746f, + 0x69746961, + 0x3d00676e, + 0x3d3d3d3d, + 0x3d3d3d3d, + 0x4d44563d, + 0x45525f41, + 0x55445f47, + 0x3d3d504d, + 0x3d3d3d3d, + 0x000a3d3d, + 0x64343025, + 0x25783028, + 0x29783430, + 0x20202020, + 0x30257830, + 0x000a7838, + 0x69207325, + 0x5f656c64, + 0x6c637963, + 0x000a7365, + 0x25207325, + 0x7338312d, + 0x35312520, + 0x25000a64, + 0x6f542073, + 0x5f6c6174, + 0x656c6469, + 0x20202020, + 0x20202020, + 0x64353125, + 0x6f63000a, + 0x25206572, + 0x73252064, + 0x322d2520, + 0x63207330, + 0x3d65646f, + 0x20643325, + 0x3d636970, + 0x20643325, + 0x5b736f70, + 0x3d5d7570, + 0x64332528, + 0x6433252c, + 0x6c632029, + 0x64253d6b, + 0x6f63000a, + 0x25206572, + 0x73252064, + 0x322d2520, + 0x20207330, + 0x20202020, + 0x20202020, + 0x3d636970, + 0x20643325, + 0x5b736f70, + 0x3d5d7570, + 0x64332528, + 0x6433252c, + 0x6e000a29, + 0x7320746f, + 0x77207465, + 0x69746961, + 0x5300676e, + 0x525f434f, + 0x532e4645, + 0x55544154, + 0x20202053, + 0x20202020, + 0x30202020, + 0x0a782578, + 0x434f5300, + 0x4645525f, + 0x4e4f432e, + 0x20474946, + 0x20202020, + 0x20202020, + 0x25783020, + 0x53000a78, + 0x525f434f, + 0x4c2e4645, + 0x52455649, + 0x20204645, + 0x20202020, + 0x30202020, + 0x0a782578, + 0x434f5300, + 0x4645525f, + 0x4f54532e, + 0x53414d50, + 0x2020204b, + 0x20202020, + 0x25783020, + 0x53000a78, + 0x4d5f434f, + 0x54532e43, + 0x20545241, + 0x20202020, + 0x20202020, + 0x30202020, + 0x0a782578, + 0x434f5300, + 0x2e434d5f, + 0x54415453, + 0x20205355, + 0x20202020, + 0x20202020, + 0x25783020, + 0x53000a78, + 0x545f434f, + 0x532e4652, + 0x55544154, + 0x20202053, + 0x20202020, + 0x30202020, + 0x0a782578, + 0x434f5300, + 0x4652545f, + 0x4742442e, + 0x54415453, + 0x20205355, + 0x20202020, + 0x25783020, + 0x53000a78, + 0x445f434f, + 0x432e4c42, + 0x204c5254, + 0x20202020, + 0x20202020, + 0x30202020, + 0x0a782578, + 0x434f5300, + 0x4c42445f, + 0x5254432e, + 0x2020314c, + 0x20202020, + 0x20202020, + 0x25783020, + 0x53000a78, + 0x445f434f, + 0x532e4c42, + 0x55544154, + 0x20202053, + 0x20202020, + 0x30202020, + 0x0a782578, + 0x434f5300, + 0x4c42445f, + 0x4154532e, + 0x31535554, + 0x20202020, + 0x20202020, + 0x25783020, + 0x53000a78, + 0x445f434f, + 0x532e4c42, + 0x55544154, + 0x20203253, + 0x20202020, + 0x30202020, + 0x0a782578, + 0x434f5300, + 0x4c42445f, + 0x4154532e, + 0x33535554, + 0x20202020, + 0x20202020, + 0x25783020, + 0x53000a78, + 0x425f434f, + 0x54535449, + 0x4d414552, + 0x4243412e, + 0x532e4441, + 0x55544154, + 0x20202053, + 0x20202020, + 0x78257830, + 0x4f53000a, + 0x49425f43, + 0x52545354, + 0x2e4d4145, + 0x4942444d, + 0x56415354, + 0x204c4941, + 0x20202020, + 0x30202020, + 0x0a782578, + 0x434f5300, + 0x5449425f, + 0x45525453, + 0x442e4d41, + 0x435f4645, + 0x204c5254, + 0x20202020, + 0x20202020, + 0x78302020, + 0x000a7825, + 0x5f434f53, + 0x53544942, + 0x41455254, + 0x4d482e4d, + 0x45525056, + 0x54532e44, + 0x53555441, + 0x20202020, + 0x25783020, + 0x53000a78, + 0x425f434f, + 0x54535449, + 0x4d414552, + 0x4143482e, + 0x2e444142, + 0x54415453, + 0x20205355, + 0x20202020, + 0x78257830, + 0x4853000a, + 0x44455241, + 0x4d41525f, + 0x7069702e, + 0x74735f65, + 0x20657461, + 0x75252020, + 0x73252820, + 0x53000a29, + 0x45524148, + 0x41525f44, + 0x73692e4d, + 0x73616c5f, + 0x6f635f74, + 0x25206572, + 0x53000a75, + 0x45524148, + 0x41525f44, + 0x6f6a2e4d, + 0x68705f62, + 0x20657361, + 0x25202020, + 0x53000a75, + 0x45524148, + 0x41525f44, + 0x6f6a2e4d, + 0x74735f62, + 0x20657461, + 0x25202020, + 0x53000a78, + 0x45524148, + 0x41525f44, + 0x756f2e4d, + 0x626d5f74, + 0x20202020, + 0x25202020, + 0x53000a75, + 0x45524148, + 0x41525f44, + 0x72742e4d, + 0x66736e61, + 0x5f6d726f, + 0x2520626d, + 0x53000a75, + 0x45524148, + 0x41525f44, + 0x616c2e4d, + 0x6d5f7473, + 0x666e6962, + 0x2520206f, + 0x53000a75, + 0x45524148, + 0x41525f44, + 0x756f2e4d, + 0x74757074, + 0x7274735f, + 0x73657069, + 0x6d6f635f, + 0x74656c70, + 0x25206465, + 0x53000a75, + 0x45524148, + 0x41525f44, + 0x72612e4d, + 0x735f7165, + 0x70697274, + 0x695f7365, + 0x65757373, + 0x75252064, + 0x4453000a, + 0x462e414d, + 0x544c5541, + 0x20202020, + 0x20202020, + 0x20202020, + 0x78302020, + 0x000a7825, + 0x74617453, + 0x6f207375, + 0x6c622066, + 0x656b636f, + 0x61742064, + 0x20736b73, + 0x20726f66, + 0x65726f63, + 0x3a752520, + 0x6b6c6320, + 0x2075253d, + 0x4f53000a, + 0x59535f43, + 0x52544353, + 0x56532e4c, + 0x5645524e, + 0x20202020, + 0x20202020, + 0x20202020, + 0x20202020, + 0x0a782520, + 0x5f574600, + 0x20564552, + 0x20202020, + 0x20202020, + 0x20202020, + 0x20202020, + 0x20202020, + 0x20202020, + 0x20202020, + 0x000a7825, + 0x53534553, + 0x5f4e4f49, + 0x2e4d4152, + 0x69746361, + 0x635f6576, + 0x7365726f, + 0x20202020, + 0x20202020, + 0x25202020, + 0x46000a75, + 0x776d7269, + 0x20657261, + 0x74617473, + 0x6f207375, + 0x616d2066, + 0x72657473, + 0x6f632820, + 0x25206572, + 0x203a2964, + 0x3d6b6c63, + 0x0a206425, + 0x53455300, + 0x4e4f4953, + 0x4d41525f, + 0x7269662e, + 0x7261776d, + 0x695f7365, + 0x73755f6e, + 0x20202065, + 0x20202020, + 0x202c6425, + 0x202c6425, + 0x202c6425, + 0x202c6425, + 0x202c6425, + 0x202c6425, + 0x202c6425, + 0x000a6425, + 0x53534553, + 0x5f4e4f49, + 0x2e4d4152, + 0x7473616d, + 0x635f7265, + 0x2065726f, + 0x20202020, + 0x20202020, + 0x25202020, + 0x53000a75, + 0x49535345, + 0x525f4e4f, + 0x6d2e4d41, + 0x65747361, + 0x6c615f72, + 0x61636f6c, + 0x20646574, + 0x20202020, + 0x64252020, + 0x4553000a, + 0x4f495353, + 0x41525f4e, + 0x616d2e4d, + 0x72657473, + 0x6769735f, + 0x736c616e, + 0x20202020, + 0x20202020, + 0x38302520, + 0x30252078, + 0x25207838, + 0x0a783830, + 0x53455300, + 0x4e4f4953, + 0x4d41525f, + 0x6369702e, + 0x65727574, + 0x6e695f73, + 0x7069705f, + 0x20202065, + 0x20202020, + 0x000a6425, + 0x53534553, + 0x5f4e4f49, + 0x2e4d4152, + 0x65706970, + 0x6369705f, + 0x6961745f, + 0x2020206c, + 0x20202020, + 0x25202020, + 0x53000a75, + 0x49535345, + 0x525f4e4f, + 0x702e4d41, + 0x5f657069, + 0x5f636970, + 0x64616568, + 0x20202020, + 0x20202020, + 0x75252020, + 0x4553000a, + 0x4f495353, + 0x41525f4e, + 0x65702e4d, + 0x6e69646e, + 0x74735f67, + 0x20657461, + 0x20202020, + 0x20202020, + 0x0a752520, + 0x53455300, + 0x4e4f4953, + 0x4d41525f, + 0x7365732e, + 0x6e6f6973, + 0x6174735f, + 0x20206574, + 0x20202020, + 0x20202020, + 0x000a7525, + 0x53534553, + 0x5f4e4f49, + 0x2e4d4152, + 0x706d6f63, + 0x6574656c, + 0x69705f64, + 0x72757463, + 0x20207365, + 0x25202020, + 0x53000a75, + 0x49535345, + 0x525f4e4f, + 0x6c2e4d41, + 0x5f657669, + 0x69727473, + 0x685f6570, + 0x20646165, + 0x20202020, + 0x75252020, + 0x4553000a, + 0x4f495353, + 0x41525f4e, + 0x696c2e4d, + 0x735f6576, + 0x70697274, + 0x61745f65, + 0x692e6c69, + 0x7865646e, + 0x0a752520, + 0x53455300, + 0x4e4f4953, + 0x4d41525f, + 0x76696c2e, + 0x74735f65, + 0x65706972, + 0x6961745f, + 0x69702e6c, + 0x20646963, + 0x000a7525, + 0x53534553, + 0x5f4e4f49, + 0x2e4d4152, + 0x6576696c, + 0x7274735f, + 0x5f657069, + 0x6c696174, + 0x6665722e, + 0x25202079, + 0x2d000a75, + 0x7773202d, + 0x68637469, + 0x20676e69, + 0x000a2d2d, + 0x53534553, + 0x5f4e4f49, + 0x2e4d4152, + 0x7478656e, + 0x6f6f625f, + 0x6f745f74, + 0x206e656b, + 0x20202020, + 0x25202020, + 0x53000a75, + 0x49535345, + 0x525f4e4f, + 0x6a2e4d41, + 0x715f626f, + 0x65756575, + 0x6b6f742e, + 0x20206e65, + 0x20202020, + 0x75252020, + 0x4553000a, + 0x4f495353, + 0x41525f4e, + 0x6f6a2e4d, + 0x63615f62, + 0x65766974, + 0x20202020, + 0x20202020, + 0x20202020, + 0x0a752520, + 0x53455300, + 0x4e4f4953, + 0x4d41525f, + 0x626f6a2e, + 0x6168705f, + 0x635f6573, + 0x746e756f, + 0x20207265, + 0x20202020, + 0x000a7525, + 0x53534553, + 0x5f4e4f49, + 0x2e4d4152, + 0x5f626f6a, + 0x72617473, + 0x69705f74, + 0x20202063, + 0x20202020, + 0x25202020, + 0x53000a75, + 0x49535345, + 0x525f4e4f, + 0x6a2e4d41, + 0x655f626f, + 0x705f646e, + 0x20206369, + 0x20202020, + 0x20202020, + 0x75252020, + 0x4553000a, + 0x4f495353, + 0x41525f4e, + 0x74732e4d, + 0x6d616572, + 0x6369705f, + 0x6165685f, + 0x20202064, + 0x20202020, + 0x0a752520, + 0x202d2d00, + 0x63696c73, + 0x75712065, + 0x73657565, + 0x0a2d2d20, + 0x53455300, + 0x4e4f4953, + 0x4d41525f, + 0x6669662e, + 0x6c735f6f, + 0x5f656369, + 0x20626f6a, + 0x20202020, + 0x20202020, + 0x65206425, + 0x6972746e, + 0x000a7365, + 0x53534553, + 0x5f4e4f49, + 0x2e4d4152, + 0x6f666966, + 0x696c735f, + 0x635f6563, + 0x6c706d6f, + 0x20657465, + 0x25202020, + 0x6e652064, + 0x65697274, + 0x6c000a73, + 0x5f657669, + 0x2d626f6a, + 0x6977733e, + 0x5f686374, + 0x75716572, + 0x20747365, + 0x20202020, + 0x20202020, + 0x25202020, + 0x6c000a75, + 0x5f657669, + 0x2d626f6a, + 0x7165723e, + 0x74736575, + 0x6e5f6465, + 0x65626d75, + 0x666f5f72, + 0x726f635f, + 0x25207365, + 0x6c000a75, + 0x5f657669, + 0x2d626f6a, + 0x726f633e, + 0x625f7365, + 0x65746f6f, + 0x20202064, + 0x20202020, + 0x20202020, + 0x25202020, + 0x6c000a75, + 0x5f657669, + 0x2d626f6a, + 0x7069703e, + 0x77735f65, + 0x68637469, + 0x20202020, + 0x20202020, + 0x20202020, + 0x25202020, + 0x69000a75, + 0x7475706e, + 0x66756220, + 0x73726566, + 0x61747320, + 0x3a737574, + 0x73000a2d, + 0x61657274, + 0x65685f6d, + 0x253a6461, + 0x616d2075, + 0x72657473, + 0x6165685f, + 0x75253a64, + 0x73616d20, + 0x5f726574, + 0x69617661, + 0x75253a6c, + 0x7562000a, + 0x72656666, + 0x63636f20, + 0x6e617075, + 0x2d3a7963, + 0x7562000a, + 0x64695f66, + 0x75252078, + 0x7473000a, + 0x6d616572, + 0x0a642520, + 0x726f6300, + 0x75255b65, + 0x6425205d, + 0x6f63000a, + 0x685f6572, + 0x5b646165, + 0x205d7525, + 0x000a7525, + 0x45525453, + 0x53004d41, + 0x4543494c, + 0x434d0020, + 0x20202020, + 0x45524100, + 0x00202051, + 0x4e415254, + 0x4f002053, + 0x55505455, + 0x49500054, + 0x20514550, + 0x49415700, + 0x564f0054, + 0x55525245, + 0x5331004e, + 0x47415054, + 0x49500045, + 0x00444943, + 0x42544e49, + 0x4c004655, + 0x50455649, + 0x45535241, + 0x494c0044, + 0x4f434556, + 0x5000504d, + 0x4e494349, + 0x00584544, + 0x004c414e, + 0x49504e49, + 0x4e450043, + 0x54554f43, + 0x00465542, + 0x56455250, + 0x00514553, + 0x42464552, + 0x5f4b4e41, + 0x45534552, + 0x554f0054, + 0x54555054, + 0x554c465f, + 0x43004853, + 0x5044524c, + 0x4e450042, + 0x45445f43, + 0x49505f50, + 0x55520043, + 0x54535f4e, + 0x00455441, + 0x43494c53, + 0x49465f45, + 0x4c004f46, + 0x5f455649, + 0x43494c53, + 0x45440045, + 0x55455551, + 0x4e450045, + 0x55455551, + 0x4f430045, + 0x4552004c, + 0x55444953, + 0x42004c41, + 0x4e455449, + 0x51455343, + 0x54494200, + 0x42434e45, + 0x45004655, + 0x424d434e, + 0x4f464e49, + 0x42414300, + 0x49424341, + 0x48005354, + 0x5250564d, + 0x52004445, + 0x4f4f4245, + 0x00444554, + 0x424f5250, + 0x4f430053, + 0x53544e55, + 0x39505600, + 0x50004342, + 0x5f564552, + 0x4d415246, + 0x58450045, + 0x46554254, + 0x00524546, + 0x45504950, + 0x50570044, + 0x50570030, + 0x4e450031, + 0x54535f44, + 0x45504952, + 0x49424d00, + 0x5f4f464e, + 0x44414548, + 0x52005245, + 0x52464645, + 0x00454d41, + 0x4556494c, + 0x544f4c53, + 0x424f4a00, + 0x49575300, + 0x00484354, + 0x49464552, + 0x00454c44, + 0x53464552, + 0x00544f4c, + 0x53464552, + 0x50495254, + 0x46455200, + 0x49525453, + 0x52004550, + 0x424d4645, + 0x4d445349, + 0x49500041, + 0x52444550, + 0x004e4941, + 0x5f514e45, + 0x43494c53, + 0x4e450045, + 0x424d5f51, + 0x0057525f, + 0x5f514e45, + 0x575f424d, + 0x514e4500, + 0x4152465f, + 0x4500454d, + 0x575f514e, + 0x4e450050, + 0x54535f51, + 0x00504952, + 0x49415244, + 0x54535f4e, + 0x45504952, + 0x49424d00, + 0x4745525f, + 0x45545349, + 0x434d0052, + 0x52415000, + 0x4f434553, + 0x4a00504d, + 0x4c53424f, + 0x4d00544f, + 0x4f525f43, + 0x4d003057, + 0x4f525f43, + 0x44003157, + 0x4e494152, + 0x5045445f, + 0x49525453, + 0x44004550, + 0x54535045, + 0x45504952, + 0x4154535f, + 0x48005452, + 0x56415f57, + 0x004c4941, + 0x495f5748, + 0x00454c44, + 0x5f444e42, + 0x0052474d, + 0x5f4c4244, + 0x544f4c53, + 0x574f5200, + 0x4c5f4e49, + 0x0044414f, + 0x4f574f52, + 0x535f5455, + 0x45524f54, + 0x574f5200, + 0x4c525443, + 0x414f4c5f, + 0x49430044, + 0x46554252, + 0x45525000, + 0x52545356, + 0x00455049, + 0x43434950, + 0x00504d4f, + 0x00465254, + 0x5f4c4244, + 0x0052444c, + 0x414d4456, + 0x49525453, + 0x56004550, + 0x53414d44, + 0x00544f4c, + 0x49525453, + 0x435f4550, + 0x00504d4f, + 0x49584950, + 0x4f4c5f4e, + 0x52004441, + 0x535f574f, + 0x45524f54, + 0x564d5300, + 0x49424d5f, + 0x004f464e, + 0x5f4c4244, + 0x54005342, + 0x535f4652, + 0x45524f54, + 0x4d4f435f, + 0x46525400, + 0x5254535f, + 0x43455049, + 0x00504d4f, + 0x4c525443, + 0x45504f00, + 0x4f45004e, + 0x4f450053, + 0x55425f53, + 0x45520046, + 0x4544524f, + 0x52460052, + 0x53454d41, + 0x00455a49, + 0x53594850, + 0x00004449, + 0x004e5552, + 0x00424a50, + 0x00545753, + 0x00424a43, + 0x00044080, + 0x000440cc, + 0x00044118, + 0x00044138, + 0x0004419c, + 0x000441e8, + 0x00044234, + 0x000195c0, + 0x000195c7, + 0x000195ce, + 0x000195d5, + 0x000195dc, + 0x000195e3, + 0x000195ea, + 0x44532020, + 0x2020414d, + 0x61747320, + 0x30737574, + 0x20202020, + 0x74617473, + 0x20317375, + 0x207c2020, + 0x6c637273, + 0x20206e65, + 0x6c747364, + 0x7c206e65, + 0x70747320, + 0x7c206e65, + 0x70747320, + 0x7c206469, + 0x76656420, + 0x65702023, + 0x6e69646e, + 0x20000a67, + 0x32255b20, + 0x20205d64, + 0x78383025, + 0x25202020, + 0x20783830, + 0x207c2020, + 0x20643625, + 0x64362520, + 0x25207c20, + 0x25206432, + 0x7c206432, + 0x78322520, + 0x78322520, + 0x23207c20, + 0x25206425, + 0x20202c64, + 0x20642523, + 0x000a6425, + 0x414d4453, + 0x50545320, + 0x4d415220, + 0x000a203a, + 0x20202020, + 0x2d643225, + 0x20643225, + 0x2000203a, + 0x00643725, + 0x43534152, + 0x6425203a, + 0x2d2d2d20, + 0x2d2d2d2d, + 0x2d2d2d2d, + 0x2d2d2d2d, + 0x7566202d, + 0x6974636e, + 0x2d206e6f, + 0x6163202d, + 0x20736c6c, + 0x63202d2d, + 0x656c6379, + 0x202d2073, + 0x72657661, + 0x20656761, + 0x2d2d2d2d, + 0x78616d20, + 0x252c000a, + 0x2c733333, + 0x25202020, + 0x202c6434, + 0x75372520, + 0x2520202c, + 0x202c7537, + 0x75372520, + 0x7325000a, + 0x255b7325, + 0x78302073, + 0x78383025, + 0x25000a5d, + 0x5b732573, + 0x2073252f, + 0x0a5d6425, + 0x25732500, + 0x73255b73, + 0x25000a5d, + 0x25732573, + 0x78300073, + 0x78383025, + 0x00642500, + 0x202c6425, + 0x34302500, + 0x25002078, + 0x20783830, + 0x32302500, + 0x00002078, + 0x00047428, + 0x000474a8, + 0x00047528, + 0x000475a8, + 0x00047628, + 0x00019b13, + 0x09090909, + 0x09090909, + 0x09090909, + 0x00090909, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x02020100, + 0x03030303, + 0x04040404, + 0x04040404, + 0x05050505, + 0x05050505, + 0x05050505, + 0x05050505, + 0x06060606, + 0x06060606, + 0x06060606, + 0x06060606, + 0x06060606, + 0x06060606, + 0x06060606, + 0x06060606, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x63617453, + 0x7461206b, + 0x0a702520, + 0x61747300, + 0x25206b63, + 0x3d206434, + 0x25783020, + 0x0a783830, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x01010100, + 0x00000203, + 0x04030105, + 0xfe0bf2c8, + 0x25862253, + 0x14031401, + 0x04030405, + 0xfe0bf2a8, + 0x01f50533, + 0xff021800, + 0x180403f5, + 0x4027ff02, + 0xe8000e23, + 0x030435fd, + 0xfde8000e, + 0x181002f5, + 0x03f5ff02, + 0xff021814, + 0xe7f00e23, + 0x0b0435fd, + 0x07fc4efe, + 0x334327d0, + 0x07e30703, + 0x0004f53d, + 0x07ff0212, + 0x070d47c1, + 0xf1333312, + 0x02100034, + 0xf848dcff, + 0x24f12087, + 0xff021000, + 0x08004ddc, + 0x033427f6, + 0x0023f501, + 0x87ff0212, + 0x0043f540, + 0x23ff0212, + 0x273c87e6, + 0x0034f540, + 0x83ff0216, + 0x3d070fec, + 0x330e1c33, + 0x001f8333, + 0x333ff000, + 0xe1ab10ec, + 0x140034f5, + 0x3ef5ff02, + 0xff021404, + 0x8e0ef49b, + 0x07f64efc, + 0x079107b2, + 0x406c27a0, + 0xf72ef893, + 0xff7ea702, + 0x451efdef, + 0xbc10cb07, + 0x01c60741, + 0x33d40784, + 0x0541c3d6, + 0x74de2384, + 0x7411fefe, + 0x53184c33, + 0x42cc1d4c, + 0x032c07f6, + 0x0723e323, + 0x7e19070d, + 0x4027ff08, + 0x270ef49b, + 0x072a0700, + 0x7e3c071d, + 0xac0bff08, + 0x9c0bbc2b, + 0x8ebabfd6, + 0xff2ea7f6, + 0x031efdef, + 0x2411f3e8, + 0x4ddc3327, + 0x0bf6fc6a, + 0x07fb4efe, + 0x3ec007b1, + 0x070c07e5, + 0xb31ea72b, + 0xfb0efefe, + 0x4efec35e, + 0x07c007fb, + 0x07cf3eb1, + 0x273b071c, + 0xb32ea700, + 0xfb0efefe, + 0x27febb5e, + 0x0000114f, + 0xa0f49b10, + 0x01f50533, + 0xff021800, + 0x180402f5, + 0x3027ff02, + 0xe8000e23, + 0x270335fd, + 0x0e03234c, + 0xf5fde800, + 0x02181004, + 0x1402f5ff, + 0x23ff0218, + 0xfde7f00e, + 0xfe0b0335, + 0x330f0c83, + 0x7e0e2303, + 0x0439ffff, + 0x959e44c6, + 0xfe0b000c, + 0x04030333, + 0xf3e8031e, + 0x100004f1, + 0x3327ff02, + 0xfc6a4ddc, + 0x33fe0bf2, + 0xf5432705, + 0x02180004, + 0x0402f5ff, + 0x27ff0218, + 0x000e2340, + 0x0435fde8, + 0xe8000e03, + 0x1001f5fd, + 0xf5ff0218, + 0x02181402, + 0xf00e23ff, + 0x0435fde7, + 0xfe4efe0b, + 0x000777be, + 0x302706f6, + 0xffff4ea7, + 0xc443bdfe, + 0x0af3131f, + 0xf5eaf493, + 0x8e430502, + 0xbefe4efe, + 0xf60005e5, + 0xa7302706, + 0xfeffff4e, + 0x1fc443bd, + 0x930af313, + 0x02f5cbf4, + 0xfe8e4305, + 0x00befe4e, + 0x04cc0009, + 0xa730271b, + 0xfeffff4e, + 0x1fc443bd, + 0x130d03c4, + 0xf493a9f3, + 0x0502f5a8, + 0x8e002743, + 0xa7fc4efe, + 0xffffff4e, + 0xc6274d99, + 0x1e0027d4, + 0x8a70be05, + 0xff4ea7fe, + 0x4411feff, + 0x0a0843f9, + 0xc407ff00, + 0xce233f4b, + 0x2efff5f8, + 0x1e0027d3, + 0x07300710, + 0xef0ea72d, + 0x1c07fff5, + 0xfe8af0be, + 0x07e6c119, + 0xffff3ea7, + 0xbd4127ff, + 0x99063434, + 0x40270f33, + 0x270ef49b, + 0xf5338741, + 0x02b04034, + 0x27123cff, + 0x93fc8e00, + 0x02f537fc, + 0xffffdea7, + 0x8bc001fe, + 0x990536f0, + 0x47760ad4, + 0x04c8f41e, + 0x8af5be15, + 0xff4ea7fe, + 0x4499feff, + 0x1601270a, + 0x1e002745, + 0x27012703, + 0xff4ea730, + 0x439dfeff, + 0x99fc8e0a, + 0x47d81414, + 0x8a049d1b, + 0x13311441, + 0x0b3c02c1, + 0x33430734, + 0x9003c543, + 0x2108242b, + 0x0b3c04c5, + 0x2b4007fe, + 0x63f49b41, + 0x20071686, + 0x4f9b2803, + 0x4e382763, + 0x9b242e04, + 0xf31e65f3, + 0x007f4f27, + 0xf49b4000, + 0xa7fe0b61, + 0xfdefff4e, + 0x333c42c1, + 0x2c53182c, + 0x991b1e1d, + 0x31c48904, + 0x83412312, + 0x33348743, + 0x0b432b44, + 0x61449940, + 0x019d45e6, + 0x88039988, + 0x11231307, + 0x0bdd23ca, + 0x07fd4efe, + 0x99c53ed0, + 0x45f688d4, + 0x9b623f9b, + 0x432e634f, + 0xd49d4027, + 0x9bfd8e8a, + 0xf09b6af0, + 0x9b100b6b, + 0xf09b62f1, + 0x604f9b63, + 0x9b104ca3, + 0xf09b60f4, + 0x9bfe0b63, + 0x4ce3604f, + 0x60f49b10, + 0xa76b4f9b, + 0xfdefff3e, + 0x34d54327, + 0x34c10238, + 0xfb48dc38, + 0xefff3ea7, + 0x3834c1fd, + 0x08004ddc, + 0xd54427f9, + 0xd5023834, + 0x27023c34, + 0x6832d520, + 0xc73ea706, + 0x3205fdeb, + 0x00004f27, + 0x34150704, + 0x990ef29b, + 0x45468804, + 0x029d4027, + 0x89049d88, + 0x0c5cfe0b, + 0xedf49310, + 0x41c102f3, + 0x07183cac, + 0x0f1c8310, + 0x4c834107, + 0x2743330f, + 0x0201002f, + 0x6b247b80, + 0x9641272f, + 0x93402724, + 0x02f3c7f3, + 0x31c54533, + 0x4c349dac, + 0x9bc032c5, + 0x34c1600f, + 0x830ce3c0, + 0xfe0b04ab, + 0xf3aaf493, + 0x8b409902, + 0x01830253, + 0x4f9bfe0b, + 0x13478363, + 0x9b480048, + 0xfe0b65f4, + 0x93630f9b, + 0x02f38bf4, + 0x075043c1, + 0x2b433343, + 0x0b037304, + 0x1efe0b03, + 0x674f9be8, + 0x30640f9b, + 0x00a7204c, + 0x4103fe0b, + 0x2365f49b, + 0x1f4c1341, + 0x0123045b, + 0xfc4efe0b, + 0x07300499, + 0x2744d6d0, + 0x27781ec0, + 0xa66c1ec0, + 0x89d4994a, + 0x43834123, + 0x34333407, + 0x342b4487, + 0x34993d0b, + 0x9947f661, + 0x3ec16030, + 0x07400758, + 0x33433310, + 0x0b142b15, + 0xc114211d, + 0xe42b5c33, + 0x271ee30b, + 0xdc8ad499, + 0xd4993941, + 0x31d29932, + 0x01830407, + 0x10073007, + 0x15333333, + 0x3407132b, + 0x24ce3103, + 0x32d39d1e, + 0x20071d0b, + 0x0d073e07, + 0xfe94debe, + 0x43330411, + 0xd499c40b, + 0xc8e02788, + 0x0c078e42, + 0xf54efc8e, + 0x0107d007, + 0x72078107, + 0x5f9b022b, + 0x1850ce63, + 0x076c3f9b, + 0x604c0342, + 0x070d34da, + 0x7e120701, + 0xd027fdd1, + 0xc101155e, + 0xa00750d3, + 0x3333a7e3, + 0x432b4a07, + 0x071240cc, + 0x07a7e3a8, + 0x2c432b4a, + 0x5ed12740, + 0x702700f6, + 0x387e0d07, + 0x31de99fe, + 0x2730d499, + 0x9d4e1b30, + 0x94078ad3, + 0x29079f6b, + 0x42072183, + 0x4333c207, + 0x6907c533, + 0x6103c42b, + 0x9ececd0b, + 0x41c13150, + 0x331333c4, + 0x07b10743, + 0x14c3990a, + 0x042bb40b, + 0x4b2b4507, + 0x072d37d8, + 0x083b2b38, + 0xc818d640, + 0x0d072230, + 0x307e1c07, + 0x034907fd, + 0x32d49d41, + 0x0714c499, + 0x274483ab, + 0x274486d1, + 0x27d203d0, + 0x08721e10, + 0x0901da00, + 0x991e9607, + 0xc0270027, + 0x0754d3c1, + 0x2b33334a, + 0x2c40c843, + 0x070938ce, + 0x271027a3, + 0xc14e1ed4, + 0x4ea738d2, + 0xb9ffffff, + 0x190a2a43, + 0x07344e24, + 0xbe18070d, + 0x07fe93b9, + 0x27a72ba8, + 0x412c1e10, + 0x733007c4, + 0x07430b33, + 0x90d4c51c, + 0x0732d99d, + 0x93b5be0d, + 0x32d499fe, + 0x41030c11, + 0x0732d49d, + 0xfe547e0d, + 0x1007c333, + 0xd0271c0b, + 0x387e0a07, + 0x07d536fd, + 0x7e170708, + 0x0d07fcb9, + 0x3f9bf58e, + 0x8df29360, + 0x24c102f1, + 0xc14858ac, + 0x0ce3c024, + 0x0704ab83, + 0x104c8343, + 0xab0c4ca3, + 0xc634cb40, + 0x60f49b38, + 0x1e833cd8, + 0xd8631f9b, + 0xc10d834c, + 0x22994024, + 0x32411b4c, + 0x27400824, + 0x51f09320, + 0x7b5e02f1, + 0x4efe0bfe, + 0x93b007fb, + 0x02f143fd, + 0x9940d4c1, + 0x4b1b4cd2, + 0x40082432, + 0x0d072027, + 0x5b7e1b07, + 0x44c007fe, + 0x634f9b03, + 0x1e40d4c5, + 0x630f9be0, + 0x0017bebe, + 0x0744d1c1, + 0x9204be0d, + 0xaad499fe, + 0x9b1b41c4, + 0xd3c1634f, + 0x50432b40, + 0x0000014f, + 0x634f9b70, + 0x00004f03, + 0xd4c5f000, + 0x07c44440, + 0x9119be0d, + 0xa50fd6fe, + 0xfb8e0c07, + 0x0499fe4e, + 0xdce0078a, + 0x03994041, + 0x32049931, + 0x9b3734ce, + 0x3f9b624f, + 0xcc432b63, + 0x9b20604c, + 0xf493631f, + 0xc102f0bc, + 0x42994043, + 0x2b41074c, + 0x08243243, + 0x07202740, + 0x5efe0e0e, + 0x477efdd2, + 0x624f9bfd, + 0xf49b400b, + 0x4efe8e62, + 0x9ba007f9, + 0xbf9b639f, + 0x63cf9b62, + 0xf086fd93, + 0x44d1c102, + 0xdac50d07, + 0x916cbe48, + 0xbe0d07fe, + 0x99fe90a3, + 0x41588ad4, + 0x0c2b0b07, + 0xd4c1f98e, + 0x4cd29940, + 0x2452491b, + 0xd0274028, + 0xd207031e, + 0xf052f093, + 0xfb957e02, + 0xf04af093, + 0xff667e02, + 0x9b624f9b, + 0x432b633f, + 0x9331a4d2, + 0x02f037f0, + 0xdc8a0499, + 0x04992641, + 0x99484630, + 0x41233104, + 0x34074183, + 0x43333533, + 0x34f9342b, + 0x0004949c, + 0x07104c5c, + 0xbe2d0719, + 0x9bfe9535, + 0x4f9b620f, + 0x8e042b63, + 0x93f84ef9, + 0x02f0d3f4, + 0xd1184a99, + 0xf602144d, + 0xa70119af, + 0xffffff4e, + 0xfb430ea7, + 0xac4cd1ff, + 0x0665be0c, + 0xc4b00700, + 0xffffff0f, + 0x0c070bff, + 0xfe9bc1be, + 0xf88e0527, + 0x33333007, + 0x4fff4ea7, + 0x110027fd, + 0xd03cf148, + 0xf1ff0004, + 0x0004cc39, + 0xf95ebeff, + 0xff3ea7ff, + 0x3a05fdeb, + 0x00004f27, + 0x34151282, + 0xf49b4027, + 0x0700270e, + 0xbe1c0729, + 0x93fff8ef, + 0x02ef83f3, + 0xf769f293, + 0x7f3ce302, + 0x197f2ce3, + 0x803c0334, + 0x07f932c2, + 0x49f493c9, + 0xc25302f0, + 0x021442d1, + 0x4f9b3c07, + 0x232405ae, + 0xa02403c1, + 0xfda027f3, + 0x0004c0ba, + 0x434ea7ff, + 0x4479fffb, + 0x0ea74566, + 0xbefffb41, + 0xa7000584, + 0xfd4fff4e, + 0xf012f193, + 0xd1430102, + 0x27021410, + 0x18149d41, + 0x011b1abd, + 0x029818d5, + 0x029213bd, + 0x14210261, + 0x6b3924ce, + 0xff4ea72f, + 0x2c33feff, + 0xa343110c, + 0x1000002e, + 0xdfff4ea7, + 0x0842d5fd, + 0x084cd502, + 0x761c9d02, + 0x614a1c9d, + 0xf5338700, + 0x000d1830, + 0xa73127ff, + 0xfdcfff4e, + 0xd16843c5, + 0x03021410, + 0x01be4c0c, + 0xfc93fe92, + 0x2102efac, + 0x4ed461c3, + 0xbe0d0734, + 0xf6fe9b40, + 0x44d4990a, + 0xc4bd0027, + 0xd4990290, + 0x23433344, + 0xfffaa44e, + 0x0208c4d5, + 0x9d3dd499, + 0xd4c11bc4, + 0x27c43538, + 0x6bc4bd40, + 0x9d432702, + 0xd4c118c4, + 0x8d444940, + 0xf88e34c4, + 0xfd93fc4e, + 0x9902ef60, + 0x44d618d4, + 0xfc8e0027, + 0x00e444e4, + 0xdc29d469, + 0xd231d309, + 0xc32bc40b, + 0x2c0b242b, + 0x0294d2d5, + 0xd12fc4c2, + 0x070208d4, + 0x05310332, + 0xca441143, + 0x4c5e2043, + 0x89124901, + 0x13a12e14, + 0x2c0b249b, + 0x230b2287, + 0x1ea70b27, + 0x27fee077, + 0xf64ebe34, + 0x1551beff, + 0xa5f49300, + 0xfd9302f1, + 0x2102ef00, + 0x0d402743, + 0x20dc8dd4, + 0xf38b0027, + 0x061cd499, + 0xbe0d0745, + 0x070005b2, + 0x380c030d, + 0x001886be, + 0x0c030d07, + 0x187dbe64, + 0xf717be00, + 0x05f093ff, + 0x3cbe02ef, + 0xf093001b, + 0xbe02ef28, + 0x93001b33, + 0x02eebbfd, + 0x79bed021, + 0xd3d1fff7, + 0x32990214, + 0x0434993d, + 0xb91e42c2, + 0x66011bd4, + 0x3833c145, + 0x0294d3d5, + 0x42070f1e, + 0x349d4103, + 0x2700273d, + 0x00a85e41, + 0x4fff4ea7, + 0x934311fd, + 0x02ee7ff4, + 0x029c43d5, + 0x011b43b9, + 0x029343bd, + 0x43c4211e, + 0x030d071e, + 0x0cbe380c, + 0x0d070018, + 0xbe640c03, + 0xd1001803, + 0xc10214d4, + 0xd4d53844, + 0xfd930294, + 0x2702ee4c, + 0xf30ea7c2, + 0xdc9dfffa, + 0x0437be18, + 0x27002c00, + 0xd1fc8e06, + 0x070290d3, + 0xf5443340, + 0x00051c43, + 0x94d3d1ff, + 0x2043f502, + 0xd1ff0005, + 0xf50298d3, + 0x00052443, + 0x9cd3d1ff, + 0x2843f502, + 0xa7ff0005, + 0xffffff3e, + 0x05100cfd, + 0x4127ff00, + 0x063634bd, + 0x270f3399, + 0x0ef49b40, + 0x33874127, + 0xb04034f5, + 0x0027ff02, + 0xd49d4027, + 0x93fc8e18, + 0x02eddbf1, + 0x011c14a9, + 0x430b1369, + 0xfec34ce2, + 0x07fea45e, + 0x1e048930, + 0x8bb00089, + 0x0704020f, + 0xec328904, + 0x2f8b4007, + 0x42070202, + 0x342d3029, + 0x300d041b, + 0xf413fe0b, + 0x27040524, + 0x4efe0b03, + 0x51fd93fc, + 0xcea702f0, + 0x01feffff, + 0x8b0d07d4, + 0x9904f6f4, + 0x42a60ac4, + 0xfe0bfc8e, + 0x0389fd4e, + 0x27202730, + 0x3203ad40, + 0xbdd00701, + 0xad013104, + 0x27012c02, + 0x61f39b30, + 0x264c0499, + 0x1403d546, + 0x3902bd02, + 0x1803d502, + 0x00cf5e02, + 0x230bf493, + 0xcc04d500, + 0x6bf49303, + 0x04d50023, + 0x039903d0, + 0xc8f49369, + 0x04d50023, + 0x352603d4, + 0x0262f493, + 0x93061e00, + 0x0001ebf4, + 0xd520d399, + 0x2303d8d4, + 0xbd40a736, + 0x6b03b5d4, + 0x6fd1993f, + 0xd470d299, + 0x41271532, + 0x03bcd4bd, + 0x08004d27, + 0x0294d4d5, + 0x0318d1bd, + 0x4027151e, + 0xd4bd3147, + 0x402703bc, + 0xd4d52247, + 0xd3bd0294, + 0xd3990318, + 0x6dd4996e, + 0x0296d3bd, + 0x0324d2bd, + 0x6669d399, + 0xedf49348, + 0xd4d50090, + 0xf49303c8, + 0xd50021c7, + 0x6603dcd4, + 0xd9f49335, + 0xd4d500d0, + 0x302703c8, + 0xf493231e, + 0xd50010cc, + 0x9303c8d4, + 0x0021a2f4, + 0x03dcd4d5, + 0xf4933566, + 0xd50050b8, + 0x9303c8d4, + 0xfea963f3, + 0xec8af493, + 0x0843d502, + 0xa7322701, + 0xfbffff4e, + 0x43d50d07, + 0x48be0404, + 0x0c96fea3, + 0x4665d499, + 0x0e0d0745, + 0x05079efd, + 0x622f9b01, + 0x2b634f9b, + 0x2321cc24, + 0xeb7ef493, + 0x3c44c102, + 0x2b633f9b, + 0x1342d243, + 0xbe630f9b, + 0x2700120f, + 0xfad1be01, + 0x9b010cff, + 0x0d07634f, + 0x129efd0e, + 0xfd8efea4, + 0x27643f9b, + 0x173c5349, + 0x1065f49b, + 0x2701fe3d, + 0x103c3330, + 0x01fe3da3, + 0x0bc4f39b, + 0x99fc4efe, + 0x0e997502, + 0x33d00776, + 0x030e8723, + 0x0c03402c, + 0x633f9b20, + 0x35863783, + 0x27644f9b, + 0x9b432b48, + 0x4f9b65f4, + 0xa743a6a2, + 0xfbffff3e, + 0x042034d1, + 0x9bfa42d8, + 0x41c0b14f, + 0x104f27fb, + 0x9b050000, + 0x40a7a0f4, + 0x99b2f49b, + 0x150664d1, + 0x420b4007, + 0x4207031e, + 0x2c273407, + 0x644f9b20, + 0x9b65f29b, + 0xf3a0b2f4, + 0xe2c41dd6, + 0xbe15273b, + 0x27ffa546, + 0x200802ef, + 0x081e2780, + 0x2f278020, + 0x02008020, + 0x00803f27, + 0x4f270802, + 0x20080200, + 0x0127010c, + 0x9bb2fe9b, + 0xf29bb2f1, + 0xb2f39bb2, + 0x70b2f49b, + 0x27101ef0, + 0x8080804f, + 0x27010c80, + 0xb2f49b01, + 0x4f9bf0d0, + 0xfb41c0b3, + 0x4665d499, + 0x114f2745, + 0x1e200000, + 0x114f2707, + 0x9b100000, + 0xfc8ea0f4, + 0x1187fb4e, + 0x14f1b007, + 0x0001c608, + 0x03b000d1, + 0x9b90f49b, + 0xdf9b881f, + 0x8acf9b89, + 0x078bef9b, + 0x2b41073c, + 0xab3e2b4d, + 0x072d0734, + 0x2b2e2b41, + 0x2624ab4c, + 0x07266638, + 0x104c2340, + 0x41350327, + 0x4c154d25, + 0x231e4e05, + 0x48234007, + 0x41150227, + 0x171e4d05, + 0x400725c6, + 0x01274823, + 0x4c054115, + 0x4007091e, + 0x41054423, + 0xb4d50027, + 0xfb8e03b0, + 0x13f11187, + 0x0001c5f8, + 0x03b004d1, + 0x2390f39b, + 0x883f9b44, + 0x04d54305, + 0x002703b0, + 0xf04efe0b, + 0xdf3bcf5b, + 0xfc4efe2b, + 0x72be0f07, + 0xfc0efe7c, + 0xff0bf00e, + 0xc007fc4e, + 0xffa55fbe, + 0xc419c339, + 0x43ab1307, + 0x4027c41d, + 0x05e6c43d, + 0xf49b4027, + 0xff3ea70e, + 0x34c5fd4f, + 0x9b402738, + 0x4ea70ef4, + 0x99ffffff, + 0x2ea70e43, + 0x8bfd4fbf, + 0x27313831, + 0x53240541, + 0xd6240331, + 0x4efc8e32, + 0xbed007fd, + 0x99ffa542, + 0x44b60cd4, + 0x070ed499, + 0x07012304, + 0x993d0b30, + 0x42c40434, + 0x9d41270b, + 0xd09d0434, + 0xa7141e0c, + 0xfd4fff4e, + 0x4301d239, + 0x433b4127, + 0xd43d42ab, + 0x402700a7, + 0xa70ef49b, + 0xfd4fff3e, + 0x8e3834c5, + 0x07fd4efd, + 0xa4f8bed0, + 0x0dd499ff, + 0xd49944b6, + 0x2304070e, + 0x0b300701, + 0x0434993d, + 0x41274596, + 0x9d04349d, + 0x181e0dd0, + 0x22032d07, + 0x4fff4ea7, + 0x012139fd, + 0x3b412743, + 0x3d41ab43, + 0x2700a724, + 0x0ef49b40, + 0x4fff3ea7, + 0x3834c5fd, + 0x0000fd8e, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x0189fb4e, + 0x0702212e, + 0x87483341, + 0x071433b1, + 0x03141bc0, + 0x0dbe380c, + 0x4027fe9d, + 0x0112cbad, + 0x010cc0d5, + 0x0110c4ad, + 0xfb4efb8e, + 0x01100ca9, + 0x011203a9, + 0x2c874c07, + 0x010c0dd1, + 0x3c2b4633, + 0x03ad422b, + 0xd42b0112, + 0xc103b007, + 0xfff158be, + 0xb449161e, + 0x249bd309, + 0xb3a1230b, + 0xd4034287, + 0x4d05430b, + 0x8938dc03, + 0xfc282eb2, + 0xb3ad3027, + 0xb4a90110, + 0x32070112, + 0x344a3153, + 0xfb0e0b07, + 0x8eff7f5e, + 0xb804d1fb, + 0x3202a903, + 0xd5480301, + 0xb903b804, + 0x2303bc03, + 0x94f39b48, + 0x44214331, + 0x420725c6, + 0x04ad4123, + 0x30a70132, + 0xf49b40a7, + 0xddf39bdb, + 0x04d1fe0b, + 0x03a903b8, + 0x48030132, + 0x03b804d5, + 0x43073546, + 0x04ad4123, + 0x04b90132, + 0xf49b03bc, + 0x4efe0b94, + 0xc004b9fd, + 0xd0d00702, + 0x0323404c, + 0x2702c40d, + 0xcebe401c, + 0xd0c1fff0, + 0x401c2780, + 0xd0c5010b, + 0xf0d5be80, + 0xbd4027ff, + 0x2702c0d4, + 0xb94d0b40, + 0x9902c443, + 0xd2b940d4, + 0x43ce0131, + 0xbe2bf654, + 0xf6001067, + 0x2700d70f, + 0x30d3b941, + 0x31d4bd01, + 0x9b396601, + 0xfcbe630f, + 0x4f9b000d, + 0x633f9b62, + 0x4dcc432b, + 0x271010aa, + 0xbe10aa0d, + 0x0cfff6af, + 0x9b10aa0d, + 0x0d07634f, + 0xfe9f7dbe, + 0x02c0d4b9, + 0x0304d3d1, + 0xd4bd4103, + 0x0d0702c0, + 0xfd8ef38b, + 0x3cbe2c86, + 0x4f27000e, + 0x10000001, + 0x27a0f49b, + 0x30d3b940, + 0x31d4bd01, + 0x9b396601, + 0xa4be630f, + 0x4f9b000d, + 0x633f9b62, + 0x4dcc432b, + 0x271010aa, + 0xbe10aa0d, + 0x0cfff657, + 0x9b10aa0d, + 0x0d07634f, + 0xfe9f25be, + 0x02c0d4b9, + 0x41033127, + 0x02c0d4bd, + 0x27b0f39b, + 0xf49b1b4c, + 0x004f2790, + 0x9bfc0000, + 0xd4d193f4, + 0x30a703b8, + 0xd4d54803, + 0x482303b8, + 0x43254335, + 0x0132d4a9, + 0x9bdaf39b, + 0x44d6dcf3, + 0xfd8e0027, + 0xd4ad4123, + 0x00270132, + 0xfc4efd8e, + 0x012c0ca9, + 0xc2d4d007, + 0x85f49335, + 0x44c102e6, + 0x633f9b3c, + 0x4c28432b, + 0x644f9b20, + 0x01004f2c, + 0x3dbe8000, + 0x0af6fe8f, + 0xd4ad4027, + 0xc856012c, + 0xad684f9b, + 0x26012cd4, + 0x1e0d0747, + 0x234c0709, + 0x2c04ad41, + 0xfe787e01, + 0xfc0e0d07, + 0x0004129e, + 0x3a7e0d07, + 0x0e0d07fe, + 0x08099efc, + 0x8e022700, + 0x93fd4efc, + 0x02e62bf4, + 0x44c1d007, + 0x633f9b3c, + 0x4c28432b, + 0x644f9b20, + 0x01004f2c, + 0xe1be8000, + 0x05f6fe8e, + 0x067e0d07, + 0x0e0d07fe, + 0x09009efd, + 0x8e022700, + 0x000000fd, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x02011000, + 0x03200804, + 0x0f0c0a05, + 0x0d0b072f, + 0x1f09060e, + 0x2c2a2523, + 0x28242221, + 0x2e2d2b27, + 0x18141211, + 0x1c1a1513, + 0x1e1d1b17, + 0x29261916, + 0x04020100, + 0x0a050308, + 0x0b070f0c, + 0x09060e0d, + 0x000f1f2f, + 0x1e1d1b17, + 0x0e0d0b07, + 0x2e2d2b27, + 0x0a050310, + 0x1a15130c, + 0x2a25231c, + 0x0402012c, + 0x14121108, + 0x16090618, + 0x22212019, + 0x29262824, + 0x0b07000f, + 0x05030e0d, + 0x02010c0a, + 0x09060804, + 0x21071333, + 0xec002e23, + 0x9b40a7f9, + 0xf49bdaf4, + 0x670399dc, + 0x029c04d5, + 0x029804d5, + 0x04a93826, + 0x44c60132, + 0x0a1e1027, + 0x140011f1, + 0x1c53ff06, + 0x3341071f, + 0x9404ad4b, + 0xbc01bd02, + 0xd5282303, + 0x0b03b802, + 0xb802d1fe, + 0xde4f9b03, + 0x9bfb40cc, + 0x4fd8de4f, + 0x7fffffff, + 0x644f9b12, + 0x9b204c27, + 0x412765f4, + 0x03b604bd, + 0x4f9bfe0b, + 0x2743a6a2, + 0xa2f49b42, + 0x012e04a9, + 0xc3b4f49b, + 0xad01004d, + 0x9b012e04, + 0x3f9bdff4, + 0xbc04b9db, + 0x1f4c3303, + 0x230534ab, + 0x15dd4f9b, + 0xb9fe0b24, + 0xd103bc03, + 0x3303b802, + 0x40271f3c, + 0x23052415, + 0x9bdaf49b, + 0xfe0bdcf4, + 0x04b9fb4e, + 0xb12703bc, + 0xd007e007, + 0xb42bc107, + 0x0328ed03, + 0x0310dd03, + 0xde150c07, + 0xd4990783, + 0x7b0e8608, + 0x2143d04b, + 0x4f9b3007, + 0xd04b3b68, + 0x9b0e204c, + 0x4c27644f, + 0x65f49b20, + 0xfb8e0127, + 0xe103e41d, + 0x2e1ef318, + 0x071d42c4, + 0x9b20071e, + 0x4127643f, + 0x2765f49b, + 0x27300c41, + 0x1d4b3b40, + 0x48110314, + 0x070d1ef2, + 0x2730072e, + 0x03241d40, + 0x0bf3b821, + 0xe6c853e0, + 0x0cdc03c4, + 0x00279b1e, + 0x17e6fb8e, + 0x9b0e2c03, + 0x4f9b693f, + 0x83423b69, + 0x833fff3d, + 0xffffff4f, + 0x0543ab03, + 0x28040304, + 0x4efe0bf1, + 0xb803d1fd, + 0x07402703, + 0x053415d0, + 0xdaf49b34, + 0x99dcf49b, + 0x04bd4903, + 0x32c403b6, + 0x001f2711, + 0x27018000, + 0xbe312720, + 0x1e001a07, + 0x1bb8be05, + 0x7e0d0700, + 0xd0b9ff0f, + 0x0f4b03b6, + 0xf94efd8e, + 0x24f6d007, + 0x1e0dac27, + 0x27a42703, + 0x27c027b0, + 0x9be42790, + 0x3487684f, + 0x310b0407, + 0xa4e2020b, + 0xb2530120, + 0x912704d6, + 0x3429091e, + 0xc40b3309, + 0xfef0b3ab, + 0x2624c4df, + 0x40273d07, + 0x03283d03, + 0xd578d2c1, + 0xbd0314d3, + 0xbd032bd4, + 0xbd0328d4, + 0xbd0329d4, + 0xdc032ad4, + 0xe55e1321, + 0x071c0700, + 0x071d830d, + 0xfeb67e07, + 0x00d60ff6, + 0x3c07c353, + 0x871f3c83, + 0x07c85343, + 0x304d030d, + 0x1fcc8303, + 0x4d0bc30b, + 0x03300d03, + 0x03bcd2b9, + 0x031cd4d5, + 0x0310d0d5, + 0x077e1c07, + 0x683f9bff, + 0xe664d499, + 0x303cf445, + 0x32f9009c, + 0x0001b080, + 0x3cf40c1e, + 0xf9008f10, + 0x01b0b032, + 0x991c0700, + 0x110368d4, + 0x46181c33, + 0x0f2cd848, + 0x00bdd41d, + 0x94e61801, + 0x4669d499, + 0x643f9b46, + 0xf49b4127, + 0x1f3c5365, + 0xab0c3c33, + 0xbd402713, + 0x2603b6d4, + 0x693f9b2b, + 0x4c034307, + 0x344cd41a, + 0xd9f29b48, + 0x0296d4b9, + 0x4c28430b, + 0x344c2334, + 0x400c061e, + 0x07344c03, + 0x96d4bd0d, + 0x072b0702, + 0x18d5be39, + 0x7e0d0700, + 0x151efd8d, + 0x1ea30d07, + 0x07800000, + 0xbe39072b, + 0x070018bf, + 0xfdcd7e0d, + 0x03b6d0b9, + 0xf98e0f4b, + 0xf98e0127, + 0xc107fb4e, + 0x0710cc53, + 0x831c07b1, + 0x0707071d, + 0xfdc67ed0, + 0x00c40ff6, + 0x37833c07, + 0x4387cb07, + 0x0718cc53, + 0x304d030d, + 0x0bc78303, + 0x034d0bc3, + 0xb903300d, + 0xd503bcd2, + 0xd5031cd4, + 0x070310d0, + 0xfe187e1c, + 0x99683f9b, + 0x45e664d4, + 0x8b303cf4, + 0x8032f900, + 0x1e0001b0, + 0x103cd40b, + 0xb032f97e, + 0x070001b0, + 0x9911031c, + 0x1c3368d4, + 0xabbfab18, + 0xd846c61b, + 0x9b110f2c, + 0x4127643f, + 0x5365f49b, + 0x3c331f3c, + 0x2713ab0c, + 0xb6d4bd40, + 0x9b2aa603, + 0x4307693f, + 0xd41a4c03, + 0x9b40344c, + 0xd4b9d9f2, + 0x430b0296, + 0x23344c28, + 0x061e344c, + 0x4c03400c, + 0xbd0d0734, + 0xbe0296d4, + 0x07001a24, + 0xfcab7e0d, + 0x0d07111e, + 0x00001ea3, + 0x1a12be80, + 0x7e0d0700, + 0xd0b9fcef, + 0x0f4b03b6, + 0x0127fb8e, + 0xfd4efb8e, + 0x07680499, + 0x9b45a6d0, + 0x4127643f, + 0xc865f49b, + 0x1f9b4530, + 0x724f9b72, + 0x9b723f9b, + 0x3c33722f, + 0x0b483310, + 0x33410b43, + 0x420b182c, + 0x0308d4d5, + 0x9b721f9b, + 0x3f9b724f, + 0x722f9b72, + 0x3c334833, + 0x0b430b10, + 0x182c3341, + 0x1f27420b, + 0x03000300, + 0x030cd4d5, + 0x3f9b151e, + 0x724f9b72, + 0x430b4833, + 0x030804d5, + 0x12001f27, + 0xd4990200, + 0x9b476664, + 0x44d4684f, + 0x683f9b74, + 0x6d303cd4, + 0x33f94433, + 0x0001b0c0, + 0x0e1e14ab, + 0xd4684f9b, + 0xf95a104c, + 0x01b0f043, + 0xbd402700, + 0xa603b6d4, + 0x692f9b3a, + 0x4c034207, + 0x344cd41a, + 0xd9f39b40, + 0x0296d4b9, + 0x4c28420b, + 0x344c2334, + 0x400c061e, + 0x07344c03, + 0x96d4bd0d, + 0x19d5be02, + 0x7e0d0700, + 0x111efbbd, + 0x1ea30d07, + 0xbe800000, + 0x070019c3, + 0xfc017e0d, + 0x03b6d0b9, + 0xfd8e0f4b, + 0xfd8e0127, + 0xb027fb4e, + 0x03b60bbd, + 0x1cd4d007, + 0x04996218, + 0x2744d664, + 0x9b081e00, + 0x04f4680f, + 0x1c340093, + 0x403c270c, + 0x1c23071e, + 0x4f3c270c, + 0x07692f9b, + 0x1a4c0342, + 0x78344cd4, + 0x42534107, + 0x43ab4433, + 0xb9d9f49b, + 0x0b0296d3, + 0x343c2832, + 0x1e343c23, + 0x03300c06, + 0x1383343c, + 0x11870433, + 0xd3bd10ab, + 0x0d070296, + 0x0014e7be, + 0x327e0d07, + 0xbe391efb, + 0x07fff339, + 0x96dcb90d, + 0x801c2702, + 0x0296dbbd, + 0x0014cbbe, + 0x03bcd3b9, + 0x03b8d2d1, + 0xbd1f3c33, + 0xa30296dc, + 0x0842103e, + 0x42104e27, + 0x15230508, + 0xdaf49b24, + 0xb9dcf49b, + 0x4b03b6d0, + 0x27fb8e0f, + 0x4efb8e01, + 0x9bd007fd, + 0x0499682f, + 0xe242e449, + 0xb62ff600, + 0x683f9b00, + 0x0d303cd0, + 0x27644f9b, + 0xf49b204c, + 0x009f5e65, + 0x46640499, + 0x8033f945, + 0x1e0001b0, + 0x103cf40c, + 0x33f9008d, + 0x0001b0b0, + 0x2668d499, + 0x0f3cd848, + 0x69d4991c, + 0x1f9b4706, + 0x9b412764, + 0x1c5365f4, + 0x0c1c331f, + 0x00001fa3, + 0x071e0100, + 0x00001f27, + 0x40270100, + 0x03b6d4bd, + 0x2f9b3b26, + 0x03420769, + 0x4cd41a4c, + 0xf39b4834, + 0x96d4b9d9, + 0x28420b02, + 0x4c23344c, + 0x0c061e34, + 0x344c0340, + 0xd4bd0d07, + 0x20270296, + 0x90be3127, + 0x0d070015, + 0x1efa487e, + 0xa30d0715, + 0x8000001e, + 0x31272027, + 0x00157abe, + 0x887e0d07, + 0xb6d0b9fa, + 0x8e0f4b03, + 0x8e0127fd, + 0x162c54fd, + 0x41f14287, + 0x0001c318, + 0x2c44271e, + 0x3df19316, + 0x2027000c, + 0x2cc0271e, + 0x2cd42a17, + 0x12073831, + 0x1e181c23, + 0x0e23d42c, + 0x41f14287, + 0x0001c300, + 0x855efd0e, + 0x932554fc, + 0x000baff1, + 0x335efd0e, + 0x0e2524fb, + 0xfd505efd, + 0x0a1f2cd4, + 0x16231207, + 0x315efd0e, + 0x644f9bfe, + 0x9b204c27, + 0x012765f4, + 0x1f9bfd8e, + 0x5e14b668, + 0x1c34fd2e, + 0x5e11231a, + 0x4f9bfe14, + 0x204c2764, + 0x2765f49b, + 0x4efe0b01, + 0xbed007f7, + 0x070005d7, + 0x0704e610, + 0x010c5e0d, + 0xd4bd4127, + 0x40270131, + 0x0130d4bd, + 0x00014f27, + 0xf49b1000, + 0xbdfb93a0, + 0xf99302dc, + 0x9302dd90, + 0x02e02bf7, + 0x270c8c27, + 0xd4b91eac, + 0xd3990130, + 0x274b7667, + 0x3b10aacd, + 0x622f9bc3, + 0x2b634f9b, + 0x68c2d224, + 0x9b3cb4c1, + 0x432b633f, + 0x9b5d42d2, + 0x24be630f, + 0x0c070003, + 0xffebe6be, + 0xc14dc0d2, + 0x3f9b3cb4, + 0xd2432b63, + 0x311e4240, + 0x4103430b, + 0xd4bd4f6b, + 0x48d00130, + 0x630f9b33, + 0x0002fabe, + 0x9b624f9b, + 0x432b633f, + 0x10aa4dcc, + 0xaa0d2710, + 0xebadbe10, + 0xaa0d0cff, + 0x634f9b10, + 0x7bbe0d07, + 0xd499fe94, + 0xbd410367, + 0xd10130d4, + 0x070210d4, + 0x07f48b0d, + 0x624f9bc0, + 0x2b633f9b, + 0x1341cc43, + 0x0130d4b9, + 0xc12744d6, + 0x0d073d1e, + 0x6b9ef70e, + 0x0a96fe96, + 0x9b3cb2c1, + 0x3f9b631f, + 0x2b430762, + 0x07400842, + 0x2b410732, + 0x1141c843, + 0x1b3cb4c1, + 0x1348c441, + 0xfe7ee4be, + 0x0b1e0706, + 0xc1614f9b, + 0x438bbcb3, + 0x0d074586, + 0xf70e1c07, + 0xfe98549e, + 0x94b99009, + 0x01230206, + 0x45f6900d, + 0x8694f89b, + 0x94fa9b05, + 0x1e94fa9b, + 0x11051609, + 0x8b090774, + 0xf701ecf4, + 0x2704d6fe, + 0x93f78e04, + 0x02dc6ffc, + 0xc329c469, + 0x430bc209, + 0x0d07424e, + 0xfd7e1027, + 0x02a1bef7, + 0xbd402700, + 0x490131d4, + 0x32d489c3, + 0x00274322, + 0x0d07f78e, + 0x9b9ef70e, + 0x0000ffee, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x0dd1f94e, + 0x140103b0, + 0x9c27c107, + 0x41ac2780, + 0x2321bc27, + 0x07d201d4, + 0x53420714, + 0x1f6b1a4c, + 0x2f40400b, + 0xffffffff, + 0x02144eb9, + 0x1420ecd0, + 0x04c1081e, + 0x5c202778, + 0xbd412741, + 0x8e03b604, + 0x07e027f9, + 0xfe4c834e, + 0x4489400b, + 0xff2f8384, + 0x8b03ffff, + 0x88f29b4f, + 0x9b8cf49b, + 0xfa9b8df9, + 0x883f9b91, + 0x9b86f39b, + 0x4e0788f2, + 0xab1a4c33, + 0x90f19b43, + 0x9b93f49b, + 0xfb9bb0f4, + 0x8b4f9b91, + 0x9b401c03, + 0xf49b90f1, + 0xb0f49b93, + 0xc401c403, + 0x01004df4, + 0x0dd5ff7f, + 0xf98e03b0, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0xd007fb4e, + 0x0ea7b107, + 0x07fffa23, + 0xbec2071d, + 0x36fe6f96, + 0x071d0706, + 0xa73c072b, + 0xfffa230e, + 0xfe73e5be, + 0xf49b4027, + 0x4efb8e0e, + 0x59f493fe, + 0x43c102d9, + 0x4c429940, + 0x432b4007, + 0x40282452, + 0x031ee027, + 0xf193e207, + 0xc102d940, + 0x20075013, + 0x33332e2b, + 0x432b4207, + 0xe007404c, + 0x2307e32b, + 0x9d4412c5, + 0xfe8e4e1e, + 0x1499fb4e, + 0x07e30710, + 0x5bc307b2, + 0x07245be4, + 0x51cb2bd1, + 0x27e24e11, + 0x1ee02730, + 0x87e1830d, + 0x8b4d0b4e, + 0x2b4e6131, + 0x872183c3, + 0x614d0b42, + 0x0b1b8b44, + 0x05033541, + 0x250c1504, + 0x4efb8e0e, + 0xb5f293f9, + 0x249902d9, + 0xe6f3e319, + 0x2901c64f, + 0x092d6924, + 0x89d40b23, + 0xd32b2024, + 0x45164d1b, + 0x5e19249d, + 0x23c101af, + 0x34228930, + 0xf325f46d, + 0x4f9bf24d, + 0x9b43a6a2, + 0xa487244f, + 0x9325cf9b, + 0x02d977fb, + 0x073cb2c1, + 0x031b070f, + 0x1c030c0c, + 0x7e3a0738, + 0xb2c1ff6c, + 0x07cc8768, + 0x071b070f, + 0x240c033c, + 0x7e641c03, + 0xb499ff58, + 0x77b3994b, + 0xc11ef48d, + 0xf38d3cb4, + 0xc1f48536, + 0xb4a968b3, + 0xb2990118, + 0x38f3c51c, + 0x861cf48d, + 0x20b38929, + 0x010cb0d1, + 0x2c271f07, + 0xbef30d3c, + 0xd1ffe101, + 0xa9010cb3, + 0x030110b4, + 0x41033c3c, + 0x0110b4ad, + 0x010cb3d5, + 0x2700fe5e, + 0xa0f49b41, + 0xb369b431, + 0x0208b2d1, + 0x4d0b432b, + 0x23112405, + 0x00e534ea, + 0x0700ee5e, + 0x013007ae, + 0xb0f49b34, + 0x31ce3403, + 0x03ea07f7, + 0x4e0738ec, + 0x42424acb, + 0x428b4e07, + 0xf4934076, + 0x9902d8c4, + 0x3a074844, + 0x4307345b, + 0x44874183, + 0x95604f03, + 0x92070004, + 0x8b504dc1, + 0xb14f9b9a, + 0x93fb41c0, + 0x02d89ff3, + 0x27383499, + 0xf5433325, + 0x02120042, + 0x643499ff, + 0xefffaea7, + 0xf54333fd, + 0x02120042, + 0xe8031eff, + 0x5ca4c1f3, + 0x4c333327, + 0x1d4c5318, + 0x42c84413, + 0x69f093ef, + 0xbea702d8, + 0x49feffff, + 0x2e038904, + 0x1f84bcb9, + 0x9b200189, + 0x83140b43, + 0x0b04a1c3, + 0x87e423d9, + 0xd511872c, + 0xf50968ae, + 0x011f742d, + 0x27140bff, + 0x0efe9be0, + 0xa74b0499, + 0xfde69f3e, + 0xe08c2e23, + 0x333205fe, + 0x2427104c, + 0x00004fa3, + 0x32150400, + 0x4ea73435, + 0x05fde68f, + 0x03421541, + 0xbd4e35c1, + 0x271f84bc, + 0x01f49330, + 0x439d02d8, + 0x93151e19, + 0x02d7f7f4, + 0x1f070f07, + 0x034c42c1, + 0x3c1c0304, + 0xc3ff045e, + 0x4ef98ef3, + 0xddf093fe, + 0x040902d7, + 0xf4934636, + 0x1102da74, + 0xd6f48b44, + 0x8e072704, + 0xc5f193fe, + 0x149902d7, + 0x2744c619, + 0x69fe8e00, + 0x09132914, + 0x2b430b12, + 0x20148d42, + 0xc0b14f9b, + 0x4f9bfb41, + 0xa1f09324, + 0x03c102d7, + 0xc1448740, + 0x342b4402, + 0xc23c04c5, + 0x01211223, + 0x0c032027, + 0x043cbe38, + 0x2704d600, + 0x9bfe8e08, + 0xf093254f, + 0xc102d778, + 0x44876c03, + 0x2b7002c1, + 0x6804c534, + 0x211223c2, + 0x03202701, + 0x13be640c, + 0x04d60004, + 0xfe8e0927, + 0xd752f093, + 0x1c049902, + 0x04694956, + 0x31200289, + 0xd1242b03, + 0x0b020804, + 0x11420523, + 0x244f9b41, + 0x44873027, + 0x011803ad, + 0x011404d5, + 0x01272122, + 0x3127fe8e, + 0xd71ef493, + 0x9d002702, + 0xfe8e1943, + 0x0499fd4e, + 0x27412412, + 0x39fd8e00, + 0x9be5360e, + 0x4144b14f, + 0x4f9bfa1e, + 0x1943a6a2, + 0x07432702, + 0xf5333332, + 0x02120034, + 0x0031f1ff, + 0x47ff0210, + 0x181c33d2, + 0xd61d1c53, + 0x1e002714, + 0x8725331c, + 0x0423f14e, + 0x99ff0218, + 0x40f11002, + 0xff021600, + 0x030b1123, + 0x010b123b, + 0x42273d87, + 0x120034f5, + 0xfd8eff02, + 0x14470419, + 0x31871103, + 0x34f54327, + 0xff021200, + 0x100032f1, + 0x2c33ff02, + 0x1d2c5318, + 0x410726a6, + 0x03994433, + 0x0444f110, + 0x23ff0218, + 0x0b233b21, + 0x27318724, + 0x0034f542, + 0x21ff0212, + 0x0034f100, + 0xdcff0210, + 0x3187f848, + 0x100034f1, + 0x4ddcff02, + 0x2bf60800, + 0x4efe0b02, + 0x120499fb, + 0x42e4d007, + 0x041900a0, + 0x43333527, + 0x120043f5, + 0x031eff02, + 0xd419f3e8, + 0x43333b27, + 0x10004bf1, + 0xbd83ff02, + 0xb1d6fc0a, + 0xdc210d07, + 0x19ff137e, + 0x2bd239de, + 0x074127c0, + 0x12d49d3e, + 0x3333dc25, + 0x1e474427, + 0x120034f5, + 0x2287ff02, + 0x2bf51103, + 0xff021600, + 0x43273187, + 0x34f5d029, + 0xff021200, + 0x100034f1, + 0x48dcff02, + 0xf12187f8, + 0x02100024, + 0x004ddcff, + 0x4007f608, + 0x4a033427, + 0x120023f5, + 0x4c83ff02, + 0x532e070f, + 0x33233306, + 0x3027140c, + 0xab104c33, + 0x0023f540, + 0xf5ff0214, + 0x02140424, + 0x0ef39bff, + 0xfe4efb8e, + 0x41834107, + 0x87110399, + 0x2b400b44, + 0xd84e6131, + 0x9119803c, + 0x19028101, + 0x0b438713, + 0x034e0542, + 0x99131d31, + 0x41031104, + 0x8e11049d, + 0x21fd4efe, + 0x1ee0070d, + 0x10e49970, + 0x245b2d07, + 0x41834207, + 0xe319e251, + 0x4e0b4487, + 0x12074061, + 0x35334d07, + 0x3c03428b, + 0x2b110310, + 0x083df514, + 0x0bff0218, + 0x39e41904, + 0x994533e3, + 0x43f513e2, + 0xff021800, + 0x180441f5, + 0x3027ff02, + 0xe8004e23, + 0x034335fd, + 0xfde8004e, + 0x181040f5, + 0x2c33ff02, + 0x002fa310, + 0xf5040000, + 0x02181441, + 0xf04e23ff, + 0x4235fde7, + 0xed25d10b, + 0xd4cee4a1, + 0x9d42278d, + 0xfd8e12e4, + 0x30070419, + 0x41274924, + 0x99a2f49b, + 0x44a61234, + 0x0bff6c5e, + 0x390419fe, + 0xf5453300, + 0x02180041, + 0x0442f5ff, + 0x27ff0218, + 0x004e2330, + 0x4335fde8, + 0xe8004e03, + 0x1040f5fd, + 0xf5ff0218, + 0x02181442, + 0xf04e23ff, + 0x4335fde7, + 0xfc4efe0b, + 0x0019d007, + 0x30074327, + 0x20073333, + 0xdc39d129, + 0x34f52333, + 0xff021200, + 0x24f13047, + 0xff021000, + 0x87f848dc, + 0x00e4f1e3, + 0xdcff0210, + 0xf608004d, + 0x31032427, + 0x1200e2f5, + 0x3387ff02, + 0x32f54107, + 0xff021200, + 0x2c874a03, + 0x23f53027, + 0xff021600, + 0x070f4c83, + 0x33165320, + 0x141c3323, + 0xab104c33, + 0x0023f541, + 0xf5ff0214, + 0x02140424, + 0x0ef39bff, + 0xd3554027, + 0x3504d49d, + 0x4efc8ed3, + 0x990319fa, + 0x33330404, + 0xc427a207, + 0xb107d007, + 0xc42baf6b, + 0x34f13403, + 0xff021000, + 0x53184c33, + 0x44131d4c, + 0x31f04cda, + 0x212566d2, + 0x7e0d07d1, + 0xc123ff1d, + 0x2566d251, + 0x0d07d141, + 0x23ff107e, + 0x074d07c1, + 0x2748031b, + 0x013627b6, + 0x05b12312, + 0x03140342, + 0xe6f39844, + 0x26d231c6, + 0x21a5e626, + 0x7e0d07d1, + 0xc127fee9, + 0x031edb35, + 0xdc9dc127, + 0x4efa8e04, + 0xff4ea7fa, + 0x4d01fd4f, + 0xd433c007, + 0xa407d8a3, + 0xf4e8031e, + 0x4627cb01, + 0x9bbeb356, + 0xc401ff8e, + 0x44963027, + 0xf39bcd05, + 0x38abc50e, + 0xd4cec401, + 0x4efa8ee4, + 0x990d21fb, + 0x0c991004, + 0x5bd12311, + 0x2b4c07d4, + 0xd8b0074d, + 0xa72a804c, + 0xffffdf0e, + 0xdf6bae3e, + 0xc4070a1e, + 0x1c07cf6b, + 0x07fdb57e, + 0x0741034c, + 0xefdcce0b, + 0xf49b4027, + 0xdf3ea70e, + 0x3405ffff, + 0xf94efb8e, + 0x0ea7d007, + 0x07ffffdf, + 0xa1c107b2, + 0x10da99d9, + 0x99ff767e, + 0x2b0710d0, + 0xcdbe1c07, + 0xb007fff8, + 0x40270656, + 0xa70ef49b, + 0xffffdf4e, + 0x4b050027, + 0xc907f98e, + 0x1c07ca5b, + 0x12230d07, + 0x27fd5d7e, + 0x0ef49b40, + 0xffdf3ea7, + 0x993405ff, + 0xd3a110d2, + 0x4127c183, + 0xcc87423b, + 0xcd0b340b, + 0xcb650d07, + 0x667ed3a5, + 0x8e0127fd, + 0x07fb4ef9, + 0xa7b107d0, + 0xfffa230e, + 0xc2071d07, + 0xfed497be, + 0x1d070636, + 0x3c072b07, + 0xfa230ea7, + 0xd8e6beff, + 0x9b4027fe, + 0xfb8e0ef4, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00090401, + 0x00120505, + 0x00120525, + 0x00090040, + 0x00114040, + 0x00118040, + 0x0021c040, + 0x00090401, + 0x09000402, + 0x09090403, + 0x00120505, + 0x00120525, + 0x1200050a, + 0x1200052a, + 0x09090509, + 0x09090529, + 0x09090506, + 0x09090526, + 0x0912050d, + 0x0912052d, + 0x1209050e, + 0x1209052e, + 0x09120507, + 0x09120527, + 0x1209050b, + 0x1209052b, + 0x1212050f, + 0x1212052f, + 0x00000000, + 0x00090040, + 0x09000080, + 0x090900c0, + 0x00114040, + 0x00118040, + 0x11004080, + 0x11008080, + 0x111140c0, + 0x111180c0, + 0x0021c040, + 0x2100c080, + 0x2121c0c0, + 0x0001c414, + 0x0001c43c, + 0x0001c448, + 0x0001c454, + 0x0001c618, + 0x0001c638, + 0x0001c668, + 0x0001c698, + 0x0001c620, + 0x0001c644, + 0x0001c674, + 0x0001c6ac, + 0x0001c628, + 0x0001c650, + 0x0001c680, + 0x0001c6c0, + 0x0001c630, + 0x0001c65c, + 0x0001c68c, + 0x0001c6d4, + 0x34343434, + 0x36363334, + 0x34343534, + 0x34343534, + 0x34343434, + 0x34343334, + 0x34343434, + 0x34343434, + 0x4bf3101b, + 0x0000001b, + 0x4bf3100b, + 0x0000000b, + 0x3fc4922b, + 0x0000002b, + 0x4beb1019, + 0x00000019, + 0x4cf3411d, + 0x0000001d, + 0x4bf3100b, + 0x3fc4922b, + 0x0000001b, + 0x4beb1019, + 0x4cf3411d, + 0x0000001b, + 0x4beb1009, + 0x4cf3410d, + 0x48989229, + 0x3f94c92d, + 0x0000001b, + 0x20031009, + 0x2003410d, + 0x20009229, + 0x2000c92d, + 0x20031000, + 0x20032002, + 0x20001110, + 0x20002412, + 0x20034104, + 0x20036206, + 0x20004514, + 0x20006616, + 0x20009220, + 0x2000a822, + 0x20011330, + 0x20012c32, + 0x2000c924, + 0x2000ea26, + 0x20014d34, + 0x20016e36, + 0x31313030, + 0x31303030, + 0x31333030, + 0x33323232, + 0x31303030, + 0x31303030, + 0x31333030, + 0x33323232, + 0x31353030, + 0x31353030, + 0x31373636, + 0x37323232, + 0x35343434, + 0x35343434, + 0x37343434, + 0x37373636, + 0x31313030, + 0x31303030, + 0x31333030, + 0x32323232, + 0x31303030, + 0x31303030, + 0x31333030, + 0x32323232, + 0x31353030, + 0x31353030, + 0x31373636, + 0x32323232, + 0x35343434, + 0x35343434, + 0x37343434, + 0x32323232, + 0x31313030, + 0x31303030, + 0x31333030, + 0x31323232, + 0x31303030, + 0x31303030, + 0x31333030, + 0x31323232, + 0x31353030, + 0x31353030, + 0x31373636, + 0x31323232, + 0x31343434, + 0x31343434, + 0x31343434, + 0x31373636, + 0x31313030, + 0x31303030, + 0x31333030, + 0x33323232, + 0x31303030, + 0x31303030, + 0x31333030, + 0x33323232, + 0x31353030, + 0x31353030, + 0x31373636, + 0x37323232, + 0x34343434, + 0x34343434, + 0x34343434, + 0x34343434, + 0x30303030, + 0x31303030, + 0x31333030, + 0x33323230, + 0x30303030, + 0x31303030, + 0x31333030, + 0x33323230, + 0x30303030, + 0x31353030, + 0x31373630, + 0x37323230, + 0x30303030, + 0x35343430, + 0x37343430, + 0x37373630, + 0x90000009, + 0x9000030d, + 0x90000c29, + 0x90000f2d, + 0xc2902009, + 0xc398620d, + 0xc6b12829, + 0xc7b96a2d, + 0x4beb1009, + 0x00000009, + 0x4cf3410d, + 0x0000000d, + 0x48989229, + 0x00000029, + 0x3f94c92d, + 0x0000002d, + 0x4beb1001, + 0x3fc01111, + 0x00000009, + 0x4cf34105, + 0x3f844515, + 0x0000000d, + 0x48989221, + 0x3fc91331, + 0x00000029, + 0x3f94c925, + 0x3fa54d35, + 0x0000002d, + 0x4be71008, + 0x4c6b200a, + 0x00000009, + 0x4cef410c, + 0x4d73620e, + 0x0000000d, + 0x48949228, + 0x4218a82a, + 0x00000029, + 0x429cc92c, + 0x3f98ea2e, + 0x0000002d, + 0x4be71000, + 0x4c6b2002, + 0x48041110, + 0x3f802412, + 0x00000009, + 0x4cef4104, + 0x4d736206, + 0x408c4514, + 0x3f886616, + 0x0000000d, + 0x48949220, + 0x4218a822, + 0x49251330, + 0x3fa12c32, + 0x00000029, + 0x429cc924, + 0x3f98ea26, + 0x44ad4d34, + 0x3fa96e36, + 0x0000002d, + 0x0349fa4e, + 0xb007f1a3, + 0x14863183, + 0x430731c3, + 0x44330387, + 0xbcc1040b, + 0xa00d034c, + 0x0b0b0b01, + 0x271230cf, + 0x061e104c, + 0x4c034187, + 0x01400b0c, + 0x0b41874e, + 0x212e0740, + 0xc42c8b4a, + 0x43072913, + 0x348741c3, + 0x340b4433, + 0x3d030431, + 0x3b0b01a0, + 0x3d01421b, + 0x41483a11, + 0x2d07ed07, + 0x3e210d1e, + 0x2c8b2e07, + 0xbdd1051e, + 0x420701cc, + 0x402c4d2b, + 0x051e2a07, + 0x2e07d20e, + 0xb2d53207, + 0x3d2b01cc, + 0x073431c8, + 0x38cc03cb, + 0x0c07a307, + 0x39bead0b, + 0x0a2bfff7, + 0x0c07002c, + 0xfe81f1be, + 0x2d071c07, + 0x3a070f07, + 0xfff3dbbe, + 0x0d030b07, + 0x1f070174, + 0x90be2127, + 0xf183fff9, + 0xf84efa8e, + 0x41873107, + 0x342b3633, + 0x3489300b, + 0x8ba107b0, + 0xc6b0074f, + 0x1d049949, + 0x27154ac4, + 0xf39b133c, + 0x004f2794, + 0x9b900000, + 0xf39b90f4, + 0x27101e94, + 0x0000004f, + 0x90f49b90, + 0x0f004f27, + 0xf49b9000, + 0x874a0790, + 0x2b46333a, + 0x03940743, + 0xc407909c, + 0x80279b0b, + 0xc489cb0b, + 0x2eb389b0, + 0x433a4f8b, + 0xc48d4027, + 0xb2c389b0, + 0xc1c13946, + 0xb8c4c1bc, + 0xceb0c38d, + 0x17461b14, + 0x0108b4d1, + 0xb0d14686, + 0x2a070214, + 0xc4c1f48b, + 0xc58127bc, + 0x031eb8c4, + 0xc2898127, + 0x072586b0, + 0x2eb38942, + 0x43da4f8b, + 0x8d402728, + 0xb489b2c4, + 0xb4c2892c, + 0x42f24447, + 0xc3990087, + 0x2eb489b6, + 0x4487237b, + 0x9bc8c3c1, + 0xc5340b42, + 0x041ec4c3, + 0x89b2c28d, + 0xc3c1b2c4, + 0x0b4487c4, + 0xd64d0143, + 0xb7c099d7, + 0xfe6026be, + 0xc1b2c489, + 0x4487c4c3, + 0x4d01430b, + 0x4027d536, + 0x1eb2c48d, + 0x0bd1d843, + 0x0b071d07, + 0xfe7b83be, + 0xb499d007, + 0x031d071d, + 0x00202718, + 0x0721274a, + 0xf875be09, + 0x89d429ff, + 0xdd11b2c3, + 0x3fab340b, + 0x89b2c38d, + 0xcdc52eb4, + 0x89344abc, + 0x4203b4c4, + 0xe6b4c48d, + 0x07ff218f, + 0x334a870a, + 0x07042b06, + 0x894b0b40, + 0x46d6b244, + 0x4c034007, + 0x0b0b0790, + 0x1df19304, + 0x2027ff89, + 0xfff82ebe, + 0xf88e0807, + 0x0489f84e, + 0x8b0329b0, + 0x2ed0074f, + 0x1ec12734, + 0x7e102708, + 0xc007fe8a, + 0x29ecd489, + 0x2e4f8bd3, + 0x1e012734, + 0x270d0708, + 0xfe747e11, + 0x05e6c626, + 0x4566d429, + 0x9b1e4c27, + 0xf49b94f4, + 0x89d32994, + 0x43ce1ed4, + 0x004f276d, + 0x9b100017, + 0xd44990f4, + 0x41838d07, + 0x4433b487, + 0xbd03b40b, + 0xd9b901a0, + 0xbd0b01c8, + 0x07388c03, + 0xb9a103a9, + 0x07011ad4, + 0x7693839a, + 0xc1080746, + 0xcdbe40dc, + 0x4a87fff4, + 0x4b0bc02b, + 0x0d074c05, + 0x597e1907, + 0x034947fd, + 0x0701944d, + 0x23240b2d, + 0x0b01944d, + 0x9443a94d, + 0xce242901, + 0xd9bdc234, + 0x222901c8, + 0x461ed28d, + 0x0e0d0735, + 0xdddd9ef8, + 0xf1e9beff, + 0x1cd499ff, + 0x0d074506, + 0xffe261be, + 0x0c030d07, + 0x40dcc138, + 0xfff477be, + 0x413cd449, + 0x01b44d27, + 0x4d27051e, + 0x4d0b01a0, + 0x4c05c02b, + 0xf49b4027, + 0x84f49b82, + 0x8985f49b, + 0xd18916d4, + 0xab4a3314, + 0x81f49b41, + 0x4a334107, + 0xa383f49b, + 0x0000004f, + 0x82f49b80, + 0xc6c0d4c1, + 0x004f2746, + 0x9b800000, + 0xd49984f4, + 0x274224b6, + 0xf49b124c, + 0xfcd4c194, + 0x4f274566, + 0x80000000, + 0x4985f49b, + 0xa9d331d4, + 0x03011cd2, + 0x27320b41, + 0x12d18d20, + 0xd335d44d, + 0xd28dd22d, + 0xbe0d0714, + 0xa7ffdd3f, + 0x27f88e00, + 0x4efe0b03, + 0xbc03b9fc, + 0x03c00703, + 0xef273e3c, + 0x4bf3101b, + 0x9b1a3c33, + 0x2f9b90fe, + 0x894f9b88, + 0x028a1f9b, + 0x02420742, + 0x8b410741, + 0x86f49b43, + 0x9b90fe9b, + 0x44f9874f, + 0x0001c4b8, + 0x9b91f49b, + 0xef278bdf, + 0x4bf3105b, + 0x9b90fe9b, + 0x4f9b882f, + 0x8a1f9b89, + 0x42074202, + 0x41074102, + 0xf39b348b, + 0x90fe9b86, + 0xf9874f9b, + 0x01c4b844, + 0x91f49b00, + 0xcc8b4f9b, + 0x404c0dd0, + 0x4027d027, + 0x02270b1e, + 0x402c091e, + 0x031e0127, + 0xc4d50327, + 0xcdd50218, + 0xfc8e0214, + 0x029404d1, + 0x00024fa3, + 0x41ab0100, + 0x27b0f49b, + 0xf49b1b4c, + 0x023f2790, + 0x9bf80000, + 0x4c2793f3, + 0x90f49b5b, + 0x0b93f39b, + 0xd1fc4efe, + 0xc1031404, + 0x4d197803, + 0x04d54103, + 0x3d5b0314, + 0x03c00cd1, + 0x03100ed1, + 0x315c1201, + 0x04bd4127, + 0xfc8e03b6, + 0x3c333d07, + 0x03e4011a, + 0x9b43abe4, + 0xf29b86f4, + 0x01140390, + 0x874f9b12, + 0x44194c0b, + 0x9b91f49b, + 0xf49b8b4f, + 0xb0f49b93, + 0x01002dd4, + 0x100ed5d9, + 0x402c0303, + 0x2790f29b, + 0x0000004f, + 0x93f49bf4, + 0xfc4efc8e, + 0x032004d1, + 0x197c03c1, + 0xd541034d, + 0x5b032004, + 0xc00cd13d, + 0x1c0ed103, + 0x5c120103, + 0xbd412731, + 0x8e03b604, + 0x333d07fc, + 0xe4011a3c, + 0x43abe403, + 0x0386f49b, + 0xf29b402c, + 0x01140390, + 0x874f9b12, + 0x44194c0b, + 0x9b91f49b, + 0xf49b8b4f, + 0xb0f49b93, + 0x01002dd4, + 0x1c0ed5d6, + 0x90f29b03, + 0x00004f27, + 0xf49bf400, + 0x4efc8e93, + 0x1404d1fb, + 0x2003d103, + 0x034c1903, + 0x1404d541, + 0x7804c103, + 0x31033d19, + 0x032003d5, + 0x0bd14c5b, + 0x0ed103c0, + 0x02d10310, + 0x1301031c, + 0x04c14158, + 0x5c4d5b7c, + 0xbd412741, + 0x8e03b604, + 0x1acc33fb, + 0x011adc33, + 0xabe403e4, + 0x86f49b4c, + 0x9b90f39b, + 0x4b0b874f, + 0xf49b4419, + 0x8b4f9b91, + 0x9b93f49b, + 0x2401b0f4, + 0x4dab2403, + 0x0386f49b, + 0xf39b403c, + 0x01140390, + 0x874f9b13, + 0x44194b0b, + 0x9b91f49b, + 0xf49b8b4f, + 0xb0f49b93, + 0x01003dd4, + 0x1c02d5b7, + 0x100ed503, + 0x4efb8e03, + 0x940dd1f7, + 0x07f12302, + 0xaba307c0, + 0xe69207d1, + 0x27014c3f, + 0x05422731, + 0x277007f3, + 0xb07d0334, + 0x35f42503, + 0xd5f415f3, + 0x2703b007, + 0x27b027a0, + 0x5b490780, + 0x2543dc4b, + 0x03d8c4d1, + 0x11731b07, + 0xf48b0c07, + 0x3f074087, + 0x430bb803, + 0x0b3b4301, + 0xb8234127, + 0x90ab4b3b, + 0x830ba4ab, + 0xb8c4b203, + 0xdcc4d1d1, + 0xb0c7d503, + 0x8b0c0703, + 0xc4b007f4, + 0x4a470903, + 0x8847a4ab, + 0x0204051e, + 0x9ff6aa47, + 0xc4d100d8, + 0x442303b0, + 0x44234201, + 0x44234001, + 0x44234301, + 0x12074401, + 0x202b132b, + 0x042b342b, + 0x01ab32ab, + 0x76753fd6, + 0xa31d0709, + 0xab04001d, + 0x03b3241b, + 0x0000001f, + 0x03071e02, + 0x0000001f, + 0xb0f19b01, + 0x03c8c4d1, + 0xf1930c07, + 0x5efff6c0, + 0x1d070084, + 0x05001da3, + 0x4b871bab, + 0xb32414ab, + 0x00001f03, + 0x071e0400, + 0x00001f03, + 0xf19b0200, + 0xc8c4d1b0, + 0x930c0703, + 0xfff69bf1, + 0xc4d1f48b, + 0xb32403b0, + 0x031e4823, + 0xc4d54423, + 0xc4d103b0, + 0x0c0703c8, + 0xf686f193, + 0xb63a1eff, + 0xa31d070b, + 0xab05201d, + 0xab4b871b, + 0x03b32414, + 0x0000001f, + 0x03071e04, + 0x0000001f, + 0xb0f19b02, + 0x03c8c4d1, + 0xf1930c07, + 0x8bfff660, + 0xc8c4d1f4, + 0x930c0703, + 0xfff65bf1, + 0x5b1ef48b, + 0x0b188c33, + 0xab3a07d8, + 0x009dd439, + 0xdda30c01, + 0xd3ab0600, + 0x1eb0fd9b, + 0x00df030d, + 0x9b010047, + 0xf39bb0fd, + 0xb1f493b0, + 0xc4d5fff6, + 0xfd9303c0, + 0x07fff5a4, + 0x83390749, + 0x87365343, + 0x0c3c8344, + 0x4c0b3d0b, + 0x03c844d1, + 0xdc033101, + 0x8b0c0710, + 0xc49253f4, + 0x01c3f4df, + 0xf103da00, + 0x04d1f78e, + 0x4fa30294, + 0x02800481, + 0x27b0f49b, + 0x86f49b40, + 0x101b4f27, + 0xf49b4bf3, + 0x871f9b90, + 0x9b882f9b, + 0x04b9893f, + 0x476603bc, + 0x40002dc0, + 0x002fc033, + 0x2c03ffc0, + 0x40003dc0, + 0x003f4427, + 0x1e03ffc0, + 0xff2f831f, + 0x83fbffff, + 0xffffff3f, + 0x062646fb, + 0xb814f936, + 0x9b0001c5, + 0x4f9b91f4, + 0x27031e8b, + 0x93f49b40, + 0x27b0f49b, + 0xf49b5b4c, + 0x004f2790, + 0x9bf40000, + 0xfe0b93f4, + 0x04d1fb4e, + 0xd0070294, + 0xf49b41ab, + 0x004ddcb0, + 0x43831b01, + 0x400b4487, + 0x03c843d1, + 0xf53ef193, + 0xddf493ff, + 0x04d5fff5, + 0x701e03c0, + 0xc4073407, + 0xfb933383, + 0x53fff64c, + 0x204cdcc2, + 0x0b438732, + 0xc843d140, + 0xf9f49303, + 0x04d5fff5, + 0xf19303c0, + 0x8bfff514, + 0x87c383f3, + 0xd14d0b4c, + 0xd503c844, + 0x0703c0db, + 0x05f1930d, + 0xf48bfff5, + 0x4387fb8e, + 0x44d1400b, + 0x0bd503c8, + 0xf19303c0, + 0x8bfff4f8, + 0x87c383f4, + 0xd14d0b4c, + 0x9303c843, + 0xfff633f4, + 0x03c0d4d5, + 0xf1930d07, + 0x8bfff4e4, + 0x4efb8ef3, + 0x9403d1fd, + 0x9b31ab02, + 0x4027b0f3, + 0x2786f49b, + 0x8af49b42, + 0x276c0499, + 0x27449621, + 0x802c0320, + 0x10003dd8, + 0x0800d135, + 0xe5fe9303, + 0x1427fff4, + 0xf09be401, + 0x90f49b86, + 0xe4033007, + 0x4f9b3453, + 0x91f29b87, + 0x9b8b4f9b, + 0x040793f4, + 0xab0c0c33, + 0xddf1f003, + 0x1eb0f09b, + 0x080d035c, + 0xc1fd9303, + 0x0301fff4, + 0x04031d07, + 0x1401e427, + 0x9b86f39b, + 0x345390f4, + 0x9b874f9b, + 0x4f9b91f2, + 0x93f49b8b, + 0xab1c4c33, + 0x9b131143, + 0xf39b86f4, + 0x03340790, + 0x9b345318, + 0xf29b874f, + 0x8b4f9b91, + 0x3393f49b, + 0x34ab1c4c, + 0x03c4fef0, + 0xf39b20dc, + 0xb8dfc4b0, + 0xaf0001c4, + 0x9b5b4c27, + 0x4f2790f4, + 0xf8000002, + 0x8e93f49b, + 0x000000fd, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x0bd1f84e, + 0xc00703b8, + 0x0bd5b803, + 0xdf9b03b8, + 0x53412764, + 0xf49b1fdc, + 0x94fd9b65, + 0xfd9bd203, + 0xb9402794, + 0xbd03bc03, + 0x2303b404, + 0xb53deed2, + 0x9801d100, + 0x9c00d102, + 0x07e10702, + 0x07900781, + 0x1fec83a0, + 0x9c838553, + 0x00ad831f, + 0x9bdc067c, + 0x2f9bda3f, + 0x330807dc, + 0x83430725, + 0xab03e00d, + 0x0712070e, + 0xab4a33ea, + 0x004d83e9, + 0xe01d837c, + 0xab353303, + 0x83e1ab04, + 0x0f80003e, + 0x80002e83, + 0xab03ab0f, + 0xdaf09be2, + 0x1edcfe9b, + 0x33310742, + 0x003d8335, + 0x073eab7c, + 0x332a0743, + 0xab29ab45, + 0xdaf49b43, + 0x45334207, + 0xf49b42ab, + 0x533007dc, + 0x8348071a, + 0x4d831f1c, + 0x35537c00, + 0x3d8341ab, + 0x04077c1f, + 0x0533e307, + 0x04abe533, + 0x4d07e3ab, + 0xc0d54b33, + 0xced502a0, + 0xc4ad02a4, + 0xcdbd0294, + 0x1d1e03bc, + 0xd5da4f9b, + 0x9b02a004, + 0x04d5dc4f, + 0x04d102a4, + 0xf49b0298, + 0x9c04d1da, + 0xdcf49b02, + 0x0132c3a9, + 0x40a73686, + 0x20a73123, + 0xc3ad10a7, + 0xb4350132, + 0x0d1eb425, + 0xb401d4c6, + 0xb8034008, + 0xb201b111, + 0x9bdbf29b, + 0xf88eddf1, + 0x03b802d1, + 0x03bc04b9, + 0x38033207, + 0x03b803d5, + 0x9b104c03, + 0x04b994f4, + 0x4c0303bc, + 0x94f49b12, + 0x04bd4127, + 0x4f9b03b4, + 0x9804d5da, + 0xdc4f9b02, + 0x029c04d5, + 0x02a004d1, + 0xd1daf49b, + 0x9b02a404, + 0x04b9dcf4, + 0x449603bc, + 0x34013207, + 0x11dbf49b, + 0xddf49b34, + 0xfd4efe0b, + 0xa702f493, + 0xc1d00702, + 0x3f9b3c44, + 0x28432b63, + 0x4f9b204c, + 0x004fcc64, + 0x0b800001, + 0xfe4fb7be, + 0x022704c6, + 0x0d07fd8e, + 0x07fe537e, + 0xc9d4be0d, + 0x0708b6ff, + 0xff727e0d, + 0xc7be0d07, + 0x0716ffc9, + 0x9b0c4c27, + 0xd4b994f4, + 0x4c0303bc, + 0x94f49b10, + 0x9b124c27, + 0xfd8e94f4, + 0x0ca9fc4e, + 0xd007012c, + 0x932cc2d4, + 0x02a69ff4, + 0x9b3c44c1, + 0x432b633f, + 0x9b204c28, + 0x4fcc644f, + 0x80000100, + 0x4f56be0b, + 0x2704c6fe, + 0x96fc8e02, + 0x68cf9bcb, + 0xc3d0c103, + 0xb8d1d133, + 0x32d3a903, + 0x03210701, + 0xb8d2d528, + 0xbcd4b903, + 0x94f49b03, + 0xf49b4203, + 0xbd402794, + 0xa603b4d4, + 0x4540a736, + 0x35312314, + 0x32d3ad24, + 0x07061e01, + 0xfdb67e0d, + 0x070bc1c0, + 0xbec2230d, + 0x1effc403, + 0xbe0d070a, + 0x9bffc7ff, + 0x0a7668cf, + 0xc57e0d07, + 0x2cdcadfe, + 0x07c54601, + 0xc3e5be0d, + 0x07071eff, + 0xc7e1be0d, + 0x270716ff, + 0xf49b0c4c, + 0xbcd4b994, + 0x104c0303, + 0x2794f49b, + 0xf49b124c, + 0x00fc8e94, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00049560, + 0xf493f54e, + 0x6902a4d8, + 0xb9432946, + 0x09013102, + 0x63630b44, + 0x2bd007f0, + 0xe22ff664, + 0x3400d100, + 0x30d48902, + 0x242b2007, + 0x112764c6, + 0x1027210c, + 0x462e4123, + 0x2f0c3127, + 0xffffffff, + 0x41273027, + 0x4027200c, + 0x33874447, + 0x43ab41ab, + 0x20273027, + 0x023ad3bd, + 0xd3bd3127, + 0xd4d5023d, + 0xd2d50228, + 0xd2d50294, + 0xd2d50220, + 0xd2bd0224, + 0xd2bd023b, + 0xd6d5023c, + 0xd2d50230, + 0xd2d503f4, + 0xd2d5022c, + 0x4f9b0290, + 0xfb40ccc1, + 0x4665d499, + 0x2704d648, + 0x9b081e40, + 0x4d83cf4f, + 0xf49b0200, + 0x9b4027cf, + 0xf49bd0f4, + 0xd2f49bd1, + 0x1ed3f49b, + 0x9b40a709, + 0xf49bdaf4, + 0x65d499dc, + 0x45334183, + 0xf49b41a3, + 0xff0ea7c0, + 0x04d1fbff, + 0x42d80420, + 0x49d499fa, + 0x996dd399, + 0x438369d1, + 0xd2993183, + 0x154c336c, + 0x43ab3833, + 0x42a31183, + 0x21831933, + 0x2c3341ab, + 0xd542ab10, + 0x27040404, + 0x31d4bd41, + 0xcbfdbe01, + 0xecf005ff, + 0x27079504, + 0x30d4bd40, + 0x5c0ff601, + 0x65d49907, + 0x4f274546, + 0x20000001, + 0x4f27071e, + 0x10000001, + 0x27a0f49b, + 0x93902751, + 0x02a3aff0, + 0x04290869, + 0xd2d10309, + 0x840b022c, + 0xd789832b, + 0x96b90730, + 0xd1b12724, + 0x830228d4, + 0x3544c446, + 0xffff1ea7, + 0x2014d1fb, + 0xf542d804, + 0xccc14f9b, + 0x4f9bfb40, + 0x1c4c33c0, + 0xffff2ea7, + 0x1e4c53fb, + 0x040423d1, + 0x43834103, + 0x3de34b33, + 0x43ab1800, + 0x040424d5, + 0x022cd2d1, + 0x0228d4d1, + 0x32833207, + 0x34ce4283, + 0x333b072b, + 0x0ea70c3c, + 0xd1fbffff, + 0x53042004, + 0xc4418341, + 0x3ea3f141, + 0xd5010022, + 0xa3042403, + 0x2cd2d522, + 0x90d4d502, + 0xd1b90702, + 0xd10228d3, + 0x83022cd4, + 0xce448334, + 0x1ea74934, + 0xd1fbffff, + 0x07041814, + 0xc63fab34, + 0x1e4307b4, + 0x53433308, + 0x430b194c, + 0x0294d4d5, + 0xd4d54227, + 0x2ea70290, + 0xd1fbffff, + 0xd8042024, + 0xbc33f542, + 0x22bea30c, + 0x2bd50200, + 0xd4d10424, + 0xb907022c, + 0xd4d544a3, + 0x3ea7022c, + 0xd1fbffff, + 0xd8042034, + 0xd4b9f542, + 0x4d060239, + 0x07203c27, + 0x2b29071d, + 0x5010a939, + 0xed424702, + 0x060b8040, + 0x032103ff, + 0xd1f36812, + 0xa70240d1, + 0xf9ffff0e, + 0x0bc001d5, + 0x0244d2d1, + 0x0bc402d5, + 0x0248d3d1, + 0x0bc803d5, + 0x024cd4d1, + 0x0bcc04d5, + 0xd4bd4027, + 0xd4990239, + 0x28d3d165, + 0xfb4fe602, + 0x27323800, + 0x27031ec3, + 0x3ad4b9c1, + 0x9b454602, + 0x40c8c14f, + 0x9bf91e0d, + 0x40ccc14f, + 0x1e4907fb, + 0x004ffc11, + 0xce100000, + 0x004ffc00, + 0xc6400000, + 0x004fd800, + 0x29200000, + 0x1abe0d07, + 0x4127ffb6, + 0x023cd4bd, + 0xffb5f3be, + 0x01fe0d27, + 0x9bc5f09b, + 0x1127c54f, + 0x10274496, + 0x023bd1bd, + 0x00971ff6, + 0x9b623f9b, + 0x342b634f, + 0x14003dec, + 0x30e80597, + 0xd4b90085, + 0x4d560130, + 0x9b622f9b, + 0x242b634f, + 0x14002dec, + 0xf393057f, + 0xc102a104, + 0x3f9b3c34, + 0xf2432b63, + 0x9b056e42, + 0x94be630f, + 0x0d27ffc7, + 0x54be1400, + 0x0decffb0, + 0x05591400, + 0xa0def193, + 0x3c14c102, + 0x2b633f9b, + 0x4840f243, + 0x05395e05, + 0x4f6b4103, + 0x0130d4bd, + 0x053944f0, + 0xbe630f9b, + 0x9bffc75f, + 0x3f9b624f, + 0xec432b63, + 0x1814004d, + 0x000d2705, + 0xb011be14, + 0x000decff, + 0x9b050a14, + 0x045e634f, + 0x5e490705, + 0x32380177, + 0x031ea327, + 0xd4b9a127, + 0x4e86023a, + 0xa6a24f9b, + 0xc1cf9b43, + 0xdcfbc0cc, + 0x000000cf, + 0xd3a92f20, + 0x4307012e, + 0x40004da3, + 0x0224d4d5, + 0x0000cfdc, + 0x07100400, + 0x004dc343, + 0x2ed4ad01, + 0xdff49b01, + 0x2d27251e, + 0xd2d56000, + 0x1b1e0224, + 0x0abe0d07, + 0x4127ffb5, + 0x023cd4bd, + 0x0224d9d5, + 0x4f9b091e, + 0xfb40ccc1, + 0xcffc091e, + 0x40000000, + 0x3f9b0103, + 0x634f9b62, + 0x3dec342b, + 0x04a11400, + 0x00f130e8, + 0x0130d4b9, + 0x2f9b4d56, + 0x634f9b62, + 0x2dec242b, + 0x04891400, + 0x9ffaf393, + 0x3c34c102, + 0x2b633f9b, + 0x7842f243, + 0x630f9b04, + 0xffc68abe, + 0x14000d27, + 0xffaf4abe, + 0x14000dec, + 0xf1930463, + 0xc1029fd4, + 0x3f9b3c14, + 0xf2432b63, + 0x5e045240, + 0x41030443, + 0xd4bd4f6b, + 0x44f00130, + 0x0f9b0443, + 0xc655be63, + 0x624f9bff, + 0x2b633f9b, + 0x004dec43, + 0x27042214, + 0xbe14000d, + 0xecffaf07, + 0x1414000d, + 0x634f9b04, + 0x93040e5e, + 0x029f8bf2, + 0x9b3c24c1, + 0x432b633f, + 0x9b204c28, + 0x4fcc644f, + 0x80000100, + 0x4842be11, + 0x270586fe, + 0xbd390740, + 0x1e023ad4, + 0x49d49945, + 0xd3a948c6, + 0x32d4012c, + 0xad402714, + 0xf6012cd4, + 0x684f9b36, + 0x012cd4ad, + 0x091e45c6, + 0x41234307, + 0x012cd4ad, + 0xfa9ba4a3, + 0x24d4d1c1, + 0x2745c602, + 0xa2f49b42, + 0x0224d4d1, + 0x27b4f49b, + 0x07031e31, + 0x6b430739, + 0x0745364f, + 0x5e7f6b79, + 0xd3d100d6, + 0x36e60220, + 0x4c334307, + 0x1e4c530e, + 0x0290d4d5, + 0xffff4ea7, + 0x2443d5fb, + 0x28ded104, + 0x3dd2b902, + 0x0b4e0702, + 0x8332074f, + 0x33020747, + 0x4c331b3c, + 0xc343ab18, + 0x333e0701, + 0xab083339, + 0x33370703, + 0x0e2c3344, + 0x04ab3123, + 0x80222da3, + 0x830e4907, + 0x14074127, + 0xab0d1c33, + 0x34d4d112, + 0x2cd2d102, + 0x3310ab02, + 0xd0890cbc, + 0xab3e0730, + 0x5331531b, + 0xd5420321, + 0xd50220d1, + 0xd50228d3, + 0x2b022cd2, + 0x1f40c840, + 0x482b4007, + 0x41c84223, + 0xa334a316, + 0x001ea324, + 0xd3d50300, + 0xd2d50228, + 0xd1d5022c, + 0x40270220, + 0xd3bd3127, + 0xd4bd023a, + 0xd4bd023c, + 0x0ea7023d, + 0xb9feffff, + 0x271df004, + 0x0f41c471, + 0x9f26f193, + 0x1810d102, + 0xc0f08b02, + 0x6807f301, + 0xf2935907, + 0x09029f14, + 0xf6410024, + 0x9b01d67f, + 0xc0ccc1cf, + 0x3ad4b9fb, + 0x07449602, + 0x21f393c9, + 0x32c1029e, + 0x631f9b3c, + 0x07623f9b, + 0x08422b43, + 0x07320740, + 0xc8432b41, + 0xf0931641, + 0xc1029e04, + 0x411b3c04, + 0xbe1f48c4, + 0x66fe40fd, + 0x9b171e06, + 0xf193614f, + 0xc1029dec, + 0x438bbc13, + 0xcfd84536, + 0x40000000, + 0x27402714, + 0x3ad4bd51, + 0x20d9d502, + 0x24d9d502, + 0x011f5e02, + 0xb0ccbc87, + 0x3cd4b932, + 0x0749b602, + 0xb283be0d, + 0x99a127ff, + 0xdabd65d4, + 0x4786023c, + 0xffb257be, + 0x01fe2d27, + 0x9bc5f29b, + 0x4027c53f, + 0x023bd4bd, + 0xdabd34c6, + 0xd499023b, + 0xb94d5665, + 0x26023ad4, + 0x3cb0c849, + 0x0000cfdc, + 0xa90f0400, + 0xa3012ed4, + 0xd540004d, + 0x1e0224d4, + 0x003d2709, + 0x24d3d560, + 0xa24f9b02, + 0x0c1e43a6, + 0x0224d4d1, + 0x4f9b4666, + 0x2743a6a2, + 0xa2f49b42, + 0x0224d4d1, + 0xd5b4f49b, + 0xd10224d9, + 0x260220d3, + 0x2cd4d13a, + 0x003ee302, + 0x44e30300, + 0x0220d3d5, + 0x022cd4d5, + 0x0290d9d5, + 0xffff0ea7, + 0x2004d1fb, + 0xf542d804, + 0x0220d4d1, + 0x042404d5, + 0x0220d9d5, + 0xffff1ea7, + 0x2014d1fb, + 0xf542d804, + 0x2665d499, + 0xb94c0747, + 0x33023bd3, + 0x1f4c5343, + 0x302743ab, + 0x31274486, + 0x2e1e4307, + 0x012cd4a9, + 0x932542d4, + 0x029cdff2, + 0x9b3c24c1, + 0x432b633f, + 0x9b204c28, + 0x4fcc644f, + 0x80000100, + 0x4596be0b, + 0x2704c6fe, + 0x07031e41, + 0x274f6b49, + 0x27449651, + 0xbd402750, + 0x47023ad4, + 0x30d4b955, + 0x9b4c8601, + 0x3f9b624f, + 0xcc432b63, + 0xf2933840, + 0xc1029c98, + 0x4f9b3c23, + 0xf434ee63, + 0x62cf9b00, + 0x994424c1, + 0x040b4e20, + 0xffab36be, + 0xfe4bfbbe, + 0x10270d07, + 0xfe5dcabe, + 0x2b624f9b, + 0xff41ec4c, + 0x1e342700, + 0x2774d659, + 0xe0491e01, + 0xd1008151, + 0x930234d4, + 0x029d2bf1, + 0xd4d54103, + 0xf4930234, + 0x09029d20, + 0x0644b940, + 0x0d012302, + 0x2746b610, + 0xf49b0c4c, + 0x2705e694, + 0xf49b1e4c, + 0x94f49b94, + 0x0636121e, + 0x9f9af493, + 0x15f25302, + 0x014411f8, + 0xf6f48b20, + 0x3801ec55, + 0x270596f9, + 0x5ef30537, + 0x51c0009e, + 0x8946072a, + 0x410330d3, + 0xbe1843ce, + 0x27ffc317, + 0xff3ea740, + 0x34d5fbff, + 0xd4d50418, + 0xd4d50294, + 0x40270290, + 0x0131d4bd, + 0x4127071e, + 0x0238d4bd, + 0x0238d4b9, + 0xf4934726, + 0xc1029bcc, + 0x40994443, + 0xbe030b4e, + 0xbeffaa77, + 0x1efe4590, + 0x0e52c011, + 0x9c8af493, + 0x89434902, + 0x43ce32d4, + 0x430d070b, + 0x9ef50ef0, + 0x05ffaed2, + 0x27301ef5, + 0x07bc1e51, + 0x5af3be0d, + 0xbd4127fe, + 0x9b0130d4, + 0x4127c1fc, + 0x07fc665e, + 0x5adfbe0d, + 0xbd4127fe, + 0xa90130d4, + 0xf4012cd4, + 0x5efc0c42, + 0xf001fbdf, + 0xf58ef043, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x04d1fc4e, + 0x03b903b0, + 0x442303bc, + 0x42011c19, + 0x03b004d5, + 0x03b401b9, + 0x00983fe6, + 0xffff2fc0, + 0x9925ffff, + 0x32074304, + 0x361a3c53, + 0x834c4745, + 0x051e404c, + 0x46334107, + 0x400b430b, + 0x02144db9, + 0x0f20dcd0, + 0xc100975e, + 0x41f87804, + 0x20270090, + 0x3207d027, + 0x00003f83, + 0x3b530200, + 0xe307320b, + 0xbfffef83, + 0x230703ff, + 0x15334e07, + 0x2f831d0b, + 0x02000000, + 0x42ab4153, + 0x200b2147, + 0x3fff3d83, + 0x3fff4de3, + 0x238943ab, + 0x9b3f8ba4, + 0xf39b88f4, + 0x804c278c, + 0x278df49b, + 0xf49b414c, + 0x884f9b91, + 0x3f833407, + 0x03ffc000, + 0x3f83340b, + 0x03ffffff, + 0x2fc05f1e, + 0xffffffff, + 0x4304991f, + 0x43043027, + 0x36333127, + 0x4c534207, + 0x0b300b1a, + 0x1434b934, + 0x204cd002, + 0xc1061e14, + 0x415c7804, + 0x04bd4127, + 0xfc8e03b6, + 0x40272027, + 0xd1e3d407, + 0x04890d0b, + 0x83e20784, + 0xffffffef, + 0x9b4f8b03, + 0xf49b88fe, + 0x804c278c, + 0x278df49b, + 0xf49b414c, + 0x883f9b91, + 0x9b86f39b, + 0x4d0788fe, + 0xab1a4c33, + 0x90fc9b43, + 0x9b93f49b, + 0x4c27b0f4, + 0x91f49b21, + 0x038b4f9b, + 0xfc9b40cc, + 0x93f49b90, + 0x8eb0f49b, + 0x000000fc, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x0d19fd4e, + 0x2d070339, + 0xed474427, + 0x24f52333, + 0xff021200, + 0x40273387, + 0x34f5e103, + 0xff021600, + 0x3e870129, + 0x34f54327, + 0xff021200, + 0x100034f1, + 0x48dcff02, + 0xf12e87f8, + 0x02100024, + 0x004ddcff, + 0x4107f608, + 0x4a033427, + 0x120023f5, + 0x4c83ff02, + 0x532d070f, + 0x33233316, + 0x3027141c, + 0xab104c33, + 0x0023f541, + 0xf5ff0214, + 0x02140424, + 0x0ef39bff, + 0xfd4efd8e, + 0xd107e007, + 0xe4915e1e, + 0x180834f5, + 0xe499ff02, + 0x99e07104, + 0x453305e3, + 0xe299e161, + 0xf50d2b20, + 0x02180043, + 0xf51d0bff, + 0x02180440, + 0x233027ff, + 0xfde8004e, + 0x4e034335, + 0xf5fde800, + 0x02181041, + 0x102c33ff, + 0x181440f5, + 0x2fa3ff02, + 0x04000000, + 0xe7f04e23, + 0x914235fd, + 0x0be471e3, + 0x954d2b43, + 0x99d027e4, + 0x344704e4, + 0x44f14333, + 0xff021000, + 0x4c333103, + 0x1d4c5318, + 0x42c83433, + 0x99fd8e8a, + 0x35270404, + 0x43f54333, + 0xff021200, + 0xf3e8031e, + 0x27040499, + 0xf1433333, + 0x02100044, + 0x0a4ddcff, + 0xfe0bedfc, + 0x025e03a9, + 0x01a90469, + 0x342b0204, + 0x31022007, + 0x20293107, + 0x031b232d, + 0xfe0b200d, + 0xe107fe4e, + 0x01713c1e, + 0x1e2b04a1, + 0x180834f5, + 0x0419ff02, + 0x02990361, + 0x0b453320, + 0x0043f53e, + 0x33ff0218, + 0x2fa3102c, + 0x04000000, + 0x180441f5, + 0x4e23ff02, + 0x35fde800, + 0x2704a142, + 0xa5410be0, + 0x07031904, + 0xf1433343, + 0x02100044, + 0x333533ff, + 0x4c53184c, + 0xaf42c81d, + 0xfc4efe8e, + 0x90cef493, + 0x8844d102, + 0x29c00702, + 0x86026901, + 0xa9420746, + 0x0b025e03, + 0x4ed12741, + 0x0622be43, + 0x27031e00, + 0xa9c329d0, + 0x42011cc4, + 0x0e0c0743, + 0xff565efc, + 0xd1264f9b, + 0xd101ecc2, + 0x8701f4c3, + 0x02322b44, + 0x2b322b34, + 0xdcc3d143, + 0xdcc4d501, + 0xd8c3d501, + 0xb6c1be01, + 0x1bc4b9ff, + 0x5e4fd601, + 0xc231c449, + 0xc3a94103, + 0xc44d011c, + 0x4027230b, + 0xc389c149, + 0x35c42d10, + 0x4231cac2, + 0x097e0c07, + 0xa7d786ff, + 0xfeffff4e, + 0x1df044b9, + 0x930f41c4, + 0x02903ffd, + 0x0218d0d1, + 0x01c0f08b, + 0xd4c4b9f8, + 0x03352701, + 0x3301d0cd, + 0x07102743, + 0x0043f50c, + 0x7eff0212, + 0x0c07fef0, + 0x277e1027, + 0x8e00a7fe, + 0x07f94efc, + 0xd40d03d0, + 0x29b10701, + 0xfda27ed9, + 0x01d2d2a9, + 0x01d0d0b9, + 0x01d1d1b9, + 0x3c833207, + 0xc02d833f, + 0x975bbeff, + 0x6f3ea7ff, + 0x4c27fde7, + 0x27340516, + 0x27341540, + 0x0000004f, + 0xd13435a0, + 0xc001d8dc, + 0xb2c00ab1, + 0x2710271b, + 0xd1191ec0, + 0xd10200d4, + 0x0b01ecd3, + 0xfcd1d1c4, + 0x2bc34a01, + 0xd1051ec3, + 0x0701dcd1, + 0x2c3c2b31, + 0xecd4d130, + 0x07340b01, + 0xd54c0b43, + 0xd501f4d4, + 0x5301f8dc, + 0x26f49b42, + 0x01f0d4b9, + 0x01f4d3d1, + 0x4487ad07, + 0x01d0ad03, + 0x1c0043f5, + 0x0a07ff00, + 0x27fd857e, + 0x1ad4bd41, + 0x1cd4a901, + 0x0d302701, + 0xadd32dd3, + 0x070204d4, + 0xfe127e0d, + 0xf49305b6, + 0xd1028f54, + 0xd6028844, + 0x1eb02744, + 0xbe0d071c, + 0xc60004b4, + 0x09f31e07, + 0x23b103d4, + 0x0d4fab41, + 0x7e44f6d4, + 0x0566fe5e, + 0xb9ce0d07, + 0x1eb027eb, + 0x93b72703, + 0x028f1ff4, + 0x44294209, + 0xd3bd3027, + 0x422b011a, + 0x0a07944e, + 0xdd7e1c07, + 0x8e0b07fd, + 0x63f94ef9, + 0x1404d1f0, + 0x07f20502, + 0x464199c1, + 0xb307d007, + 0xfa09f929, + 0x0005b2be, + 0xa910c389, + 0xc1011cd4, + 0x439b40cc, + 0x14472027, + 0x6930dcc5, + 0x00d2d5d4, + 0xfcd2d502, + 0xecd1d501, + 0x9bb21901, + 0x11c34734, + 0xd52cd6b4, + 0xd501dcd2, + 0x1601d8d2, + 0xe0d0d14a, + 0x0705a601, + 0xe4d3d14c, + 0xc2410b01, + 0xd2891443, + 0x031d072e, + 0x2701e41d, + 0x4197be30, + 0xe0d0d5fe, + 0xe0d3d101, + 0xe8d3d501, + 0xd51d1e01, + 0x4101e8d4, + 0xe4d4d5b4, + 0x21111e01, + 0xe8d4d5b3, + 0xd8d3d501, + 0xd5b43101, + 0xd101dcd4, + 0x0701e8d4, + 0xd54c0b0d, + 0x1901e8d4, + 0xfe4b7eb1, + 0xd36905c6, + 0x3a1b4027, + 0xd40dd94d, + 0xf043d32d, + 0xfc4ef98e, + 0xfc930936, + 0xa9028e40, + 0xb901d2c2, + 0x0701d0c0, + 0xd1c1b932, + 0x3f3c8301, + 0xffc02d83, + 0xff9598be, + 0x0d030c07, + 0xb07e01d0, + 0xedf093fc, + 0xfc0e028f, + 0x4efbb35e, + 0x079307f7, + 0xabf063c0, + 0x8800d19f, + 0x07f40502, + 0x07190781, + 0x09f729b2, + 0xa496befa, + 0x8cc3d100, + 0x2ec48902, + 0x44874b9b, + 0xf043340b, + 0x0278caad, + 0x0260c0ad, + 0x0266c8ad, + 0x0280c3d5, + 0x026cc9ad, + 0x027ac7ad, + 0x0264c0ad, + 0x0262cbad, + 0xfd4ef78e, + 0x8dbefd93, + 0x62d3a902, + 0x7ad4a902, + 0x3334ca02, + 0x026bd4b9, + 0xd11d41c4, + 0xa90274d4, + 0xa90270d1, + 0xa90272d2, + 0x07026ed3, + 0x27853e0d, + 0x6bd4bd42, + 0x27101e02, + 0xff4ea733, + 0x0327feff, + 0x1df043bd, + 0xf493fd8e, + 0xa9028d7c, + 0xd1026043, + 0x87028044, + 0xa7340b33, + 0xfeffff2e, + 0x24bd4027, + 0x23d51df0, + 0x40271df4, + 0xa70ef49b, + 0xfdefff2e, + 0xf3e8031e, + 0x276424c1, + 0x184c3333, + 0x131d4c53, + 0xef42c844, + 0xffff4ea7, + 0xf441d1fe, + 0x0c0c271d, + 0xe2072ea7, + 0xbe3427fe, + 0x27ff946c, + 0x1ea70c0c, + 0xa7fee072, + 0xfee20f2e, + 0x59be3127, + 0xf353ff94, + 0xf49301df, + 0x27028d10, + 0x1843d500, + 0x4efd8e02, + 0x01f193fb, + 0x1eb9028d, + 0xe383026a, + 0x44334e07, + 0x978444f9, + 0x43830004, + 0x271041c4, + 0xff4ea732, + 0x0227feff, + 0x1df043bd, + 0x14b9fb8e, + 0x2ea7027c, + 0x33fee203, + 0xf1440343, + 0x02100044, + 0x332351ff, + 0x0127184c, + 0x00273486, + 0x4c533007, + 0x1332131d, + 0x27343244, + 0x31fb8e00, + 0x072c2120, + 0x1ed207b1, + 0x7c14b960, + 0x33d37102, + 0x0843f545, + 0xb9ff0218, + 0x89027c14, + 0x45331ad3, + 0x3c042127, + 0x6b2027ff, + 0x7d11b93f, + 0x103c3302, + 0x18004cf5, + 0x2c33ff02, + 0xf523ab1a, + 0x02180440, + 0x004e23ff, + 0x4235fde8, + 0xe8004e03, + 0x1041f5fd, + 0xf5ff0218, + 0x02181440, + 0x233027ff, + 0xfde7f04e, + 0xdc414335, + 0xd355d051, + 0x0fd61b07, + 0x27e4339d, + 0x85e4fd41, + 0xb9000497, + 0x53026ab4, + 0x03fe6df3, + 0xd5012741, + 0xbd0218b3, + 0x8e026ab4, + 0x93fa4efb, + 0x028c1bfd, + 0xe203eea7, + 0x60d1a9fe, + 0xa9ec2902, + 0x0b0266d2, + 0x112cdac1, + 0xfe40f453, + 0xd4d50127, + 0xdcad0218, + 0xfa8e0260, + 0x0269dbb9, + 0x0268d4b9, + 0x4f6b4b1b, + 0x00a244f4, + 0x43834b07, + 0x04330407, + 0x3f033007, + 0x00049560, + 0x021c31ad, + 0xd1a9212b, + 0x41030262, + 0x021e31ad, + 0x025dd1b9, + 0x31bda027, + 0xee110224, + 0x32ad4433, + 0x3abd0222, + 0x3cad0225, + 0x0f030220, + 0x0004977c, + 0x97784ef5, + 0xbdbe0004, + 0xd38900a3, + 0x78d4a92e, + 0x12230702, + 0xbd240734, + 0x32025dda, + 0xbd4127c2, + 0xda025dd4, + 0xd4a923c2, + 0xd2d10262, + 0x41030280, + 0xd4ad3387, + 0xd4a90262, + 0x230b026c, + 0x0264dca9, + 0x0280d2d5, + 0x0266d4ad, + 0x31033b07, + 0xfe51f453, + 0xd4d50127, + 0xdcad0218, + 0xd3bd0260, + 0xfa8e0269, + 0x4ea73227, + 0x27feffff, + 0xf043bd00, + 0x4efa8e1d, + 0xffcea7fc, + 0xc1d1feff, + 0x19361df8, + 0x8b26fd93, + 0x84d0b902, + 0x1e65be02, + 0xf4c4d1fe, + 0x9641011d, + 0x4ff45316, + 0x18d4d5fd, + 0x27012702, + 0x5cd4bd41, + 0x93fc8e02, + 0x028afff0, + 0x31074027, + 0x025c04bd, + 0x3db63183, + 0xffff4ea7, + 0xf043bdfe, + 0x9b40271d, + 0x2ea70ef4, + 0x1efdefff, + 0xc1f3e803, + 0x33276424, + 0x53184c33, + 0x44131d4c, + 0x27ef42c8, + 0x2ea70c0c, + 0x27fee203, + 0xfdbe383c, + 0x0c27ff91, + 0x721ea70c, + 0x2ea7fee0, + 0x27fee20f, + 0x91eabe31, + 0xbe051eff, + 0x53fe3ffa, + 0x93fe80f3, + 0x028a9bf4, + 0x43d50027, + 0xfc8e0218, + 0x08a9f54e, + 0x0469011c, + 0x02680bb9, + 0x025e09a9, + 0x840bc007, + 0xffff7ea7, + 0xff5ea7fe, + 0xf693fdef, + 0x07028a70, + 0xdaa383ab, + 0x3ea71798, + 0xb9feffff, + 0x241df034, + 0xbd412742, + 0x691df034, + 0x01115ec0, + 0xd433da07, + 0xc3b9dc0b, + 0x3b2e0269, + 0x0225d4b9, + 0x74b94b36, + 0x44c61df0, + 0xf3e80f1e, + 0x276454c1, + 0x6a4ddc33, + 0x131ef5fc, + 0x41274244, + 0x1df074bd, + 0x4344091e, + 0x0127b32e, + 0x74b9f58e, + 0x41441df0, + 0x021860d1, + 0x01c0f08b, + 0x69c4b9f8, + 0x0cb4ce02, + 0x025cc4b9, + 0x27b04fc6, + 0xa9f58e00, + 0x49021ed3, + 0x3443cec4, + 0x0225d4b9, + 0xd4b949f6, + 0x41d80224, + 0x7ec2a996, + 0x7cc0b902, + 0xb9320702, + 0x83027dc1, + 0x2d833f3c, + 0x3abeffc0, + 0xd4b9ff91, + 0x41c30224, + 0x0224d4bd, + 0x07ff715e, + 0x0b14331a, + 0x1c12a91c, + 0x1c92d202, + 0x022211a9, + 0x11c81f8b, + 0x034a0711, + 0x0b443341, + 0x1840d14c, + 0xa220be02, + 0x07290700, + 0x0741034a, + 0x334433da, + 0x0b4c0bd4, + 0x1840d1dc, + 0x20d3a902, + 0xbe190702, + 0x1200a109, + 0xce080708, + 0x4b070d90, + 0xb4074103, + 0x4127bf6b, + 0xd4a9181e, + 0x403a021c, + 0x0224d4b9, + 0x070944d8, + 0x0741034b, + 0x27bf6bb4, + 0x68cbbd40, + 0xf6900702, + 0xadfed64f, + 0x27025ec0, + 0x4ef58e01, + 0xb94027fd, + 0x6b026b03, + 0x6b04bd1f, + 0x07f06302, + 0xff1cc4d0, + 0xff4d2730, + 0xad20277f, + 0xa7025e04, + 0x8404bd40, + 0x8802d502, + 0xa7322702, + 0xfeffff4e, + 0x8906f193, + 0xf043bd02, + 0x1812d51d, + 0x6b12bd02, + 0x00d55e02, + 0x028404b9, + 0x2307412e, + 0x3107231e, + 0x33334107, + 0x432b4533, + 0x019444f1, + 0x01bdff00, + 0x43010284, + 0x028804d5, + 0x04d5430b, + 0x2027028c, + 0x0288d4d1, + 0x00a14fe6, + 0xd469d329, + 0x3407430b, + 0xd3ad3fab, + 0x22c4025e, + 0x70d4a910, + 0xa9434e02, + 0x490272d3, + 0x6634ced4, + 0x027ed2a9, + 0x027cd0b9, + 0x027dd1b9, + 0x3c833207, + 0xc02d833f, + 0x8ffbbeff, + 0xa9d369ff, + 0x89011cd2, + 0x230b10d4, + 0xf20d4103, + 0xd1a9f42d, + 0xd249025e, + 0x0d07f401, + 0x27fa5a7e, + 0xff4ea720, + 0xd2bdfeff, + 0xd2bd025c, + 0x1127025d, + 0x1df041bd, + 0x8852f393, + 0x8bf45302, + 0x6a32bdfa, + 0x1834d502, + 0x6832bd02, + 0x6932bd02, + 0xff4ea702, + 0x44b9feff, + 0x41c41df0, + 0x2dfd930f, + 0xd0d10288, + 0xf08b0218, + 0x43f801c0, + 0x00fd8ef0, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00023088, + 0xd007f54e, + 0xff9176be, + 0x04e61007, + 0xaf5e0d07, + 0xbd412701, + 0x270131d4, + 0x30d4bd40, + 0xb6d0bd01, + 0x014f2703, + 0x9b200000, + 0xfb93a0f4, + 0x27026858, + 0x0400005e, + 0x40006d27, + 0x01fe7d27, + 0x691ef993, + 0x0c8c2702, + 0xb91eac27, + 0x760130d4, + 0x622f9b4b, + 0x2b634f9b, + 0xaa2dcc24, + 0xb4c16710, + 0x633f9b3c, + 0x42d2432b, + 0x630f9b5c, + 0xff8ebebe, + 0x10aa0d27, + 0xff777ebe, + 0x10aa0dcc, + 0x3cb4c148, + 0x2b633f9b, + 0x3d40d243, + 0x41032f1e, + 0xd4bd4f6b, + 0x48d00130, + 0x630f9b30, + 0xff8e92be, + 0x9b624f9b, + 0x432b633f, + 0x10aa4dcc, + 0xaa0d2710, + 0x7745be10, + 0xaa0d0cff, + 0x634f9b10, + 0xd2be0d07, + 0x4127fe22, + 0x0130d4bd, + 0x03b8d2d1, + 0x0132d4a9, + 0xd5142c03, + 0xc603b8d2, + 0x29f35345, + 0x014123ff, + 0x32d4ad32, + 0x9b240901, + 0xf59bd4f4, + 0xbcd4b9ca, + 0x94f49b03, + 0x46ca4f9b, + 0xbe0d0745, + 0x1e000608, + 0xcaf69b25, + 0x24112041, + 0x22312321, + 0x9bca1f9b, + 0xf39bd5f4, + 0xd7f29bd6, + 0xf1d8f09b, + 0x02309c14, + 0x8b0d0700, + 0xc5f79bf4, + 0xb9c5cf9b, + 0x860130d4, + 0x624f9b46, + 0x2b633f9b, + 0x07404c43, + 0x9ef50e0d, + 0xb9fe23a8, + 0x4b03b6d4, + 0xc14a964f, + 0x1f9b3cb2, + 0x623f9b63, + 0x422b4307, + 0x32074008, + 0x432b4107, + 0xc11141c8, + 0x411b3cb4, + 0xbe1348c4, + 0x06fe0a25, + 0x9b0b1e07, + 0xb3c1614f, + 0x86438bbc, + 0xb6d1b945, + 0x4b0d0703, + 0x09401e1f, + 0x0694b990, + 0x0d012302, + 0x9b45f690, + 0x058694f8, + 0x9b94fa9b, + 0x0e1e94fa, + 0xf39305b6, + 0x11026a60, + 0x8b090734, + 0x0f01ccf4, + 0xc7460496, + 0x1c070d07, + 0x949ef50e, + 0xcfe60005, + 0x0d07fe8f, + 0xf50e1227, + 0xfe23509e, + 0xf58e0727, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x14120a06, + 0x00002321, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x0002338e, + 0x0002341f, + 0x00023492, + 0x00023658, + 0x000231c0, + 0x000235f0, + 0x00000000, + 0xe287fd4e, + 0xe20b2433, + 0x07670499, + 0xbc03b9de, + 0x00de2303, + 0x4886f9f6, + 0x013204a9, + 0x202744c6, + 0xe2e90b1e, + 0xff060a00, + 0x21832753, + 0x4b334207, + 0x029404ad, + 0x03bc02bd, + 0x3733051e, + 0xf19b13ab, + 0x9b4027cf, + 0xf49bd0f4, + 0xd2f49bd1, + 0x23d3f49b, + 0x0dd514dc, + 0x01ad03b8, + 0x04d50298, + 0x04d502a8, + 0x04d5029c, + 0x04d502a0, + 0xfd8e02a4, + 0x9b804c27, + 0x4f9bcaf4, + 0x2743a6a2, + 0xa2f49b42, + 0x9bca3f9b, + 0x04b9cef1, + 0x340b0296, + 0x23343c28, + 0x061e343c, + 0x3c03300c, + 0x9603bd34, + 0xd1fe0b02, + 0x9b03b803, + 0x41d8c64f, + 0x27402cfb, + 0xb604bd41, + 0xd44f9b03, + 0x4f9b340d, + 0x9b3415d5, + 0x3425d64f, + 0x35d74f9b, + 0xd84f9b34, + 0xfe0b3445, + 0x03b803d1, + 0xe3d44f9b, + 0x41a30e4c, + 0x4f9b340d, + 0x0e4ce3d5, + 0x4f9b3415, + 0x0e4ce3d6, + 0x4f9b3425, + 0x0e4ce3d7, + 0x4f9b3435, + 0x0e4ce3d8, + 0x4f9b3445, + 0x27402cc6, + 0xb604bd41, + 0x9b412703, + 0xfe0bcbf4, + 0xc007fa4e, + 0x87cd4f9b, + 0x1c4bf144, + 0xd80001c3, + 0x180100bd, + 0x45534b07, + 0x41034183, + 0xab074487, + 0xc3a44ef1, + 0xac830001, + 0x930c1e0f, + 0xff91b7f4, + 0x4e01ab07, + 0x4b07a383, + 0x00004fa3, + 0xf49b8000, + 0x074c07cd, + 0x284d033c, + 0x2c3d0303, + 0x14c4d503, + 0x20c3d503, + 0xca4f9b03, + 0x0328c4d5, + 0x07cd4f9b, + 0x301d031c, + 0x2cc4d503, + 0x10c1d503, + 0x07e30103, + 0x270e07da, + 0x9b252620, + 0x1405ca4f, + 0xd1581403, + 0x27ccf39b, + 0x6b081e21, + 0xccf39b3f, + 0x04032027, + 0xd2530301, + 0x01003dd4, + 0x0b4287dd, + 0x1cc4d541, + 0x07e40103, + 0x403ca334, + 0x4f9b2526, + 0x031405ca, + 0x9ba25814, + 0x2127ccf3, + 0x3f6b081e, + 0x27ccf39b, + 0x01e40320, + 0xd4a253e4, + 0xd801004d, + 0x4f9b2526, + 0x031405ca, + 0x30cd0314, + 0x2bd10703, + 0x03d273dc, + 0x33bfabd1, + 0xdbab18dc, + 0x0330cd23, + 0x00001e27, + 0xcaf19b02, + 0x34ca3f9b, + 0x1e27403c, + 0x1e040000, + 0x00dda308, + 0x3f3c8310, + 0x9b204c27, + 0x3706cbf4, + 0x0c0713ab, + 0x07fe4f7e, + 0xbe1d070c, + 0x07ff9bdc, + 0x5efa0e0c, + 0x4c27fe6f, + 0xcbf49b80, + 0x0c071d07, + 0x00001ea3, + 0x9bc2be80, + 0x0e0c07ff, + 0xfe825efa, + 0x03bc04b9, + 0x03b802d1, + 0x31274733, + 0x240d41a3, + 0x23152345, + 0x23352325, + 0x03bc04b9, + 0x41a34733, + 0x9bcff49b, + 0xf39bd0f3, + 0xd2f39bd1, + 0xb9d3f39b, + 0x9b03bc04, + 0x049994f4, + 0x27424449, + 0x8000001f, + 0x9e202701, + 0x9eff9943, + 0x4eff9af6, + 0x07d007fb, + 0x8855beb1, + 0xbd4027ff, + 0x930131d4, + 0x026203fc, + 0xc329c469, + 0x430bc209, + 0x9b0f42ce, + 0x2027cf1f, + 0x02001d83, + 0x417e0d07, + 0x49b536fd, + 0x32d489c3, + 0x0d07344a, + 0x339efb0e, + 0x0027ff74, + 0xfc4efb8e, + 0x4227d007, + 0x9bcaf49b, + 0xf49bca3f, + 0x0803adca, + 0xca3f9b03, + 0xadcaf49b, + 0x9b030a03, + 0xf49bca3f, + 0x0c03adca, + 0xca4f9b03, + 0xad640399, + 0x56030e04, + 0x00cf2735, + 0x1e030003, + 0x9b442711, + 0xcf9bcaf4, + 0xa3c433ca, + 0x000300cf, + 0x004e2703, + 0xf49b0100, + 0xca1f9bca, + 0x9b1e4c27, + 0x1766cbf4, + 0x1ea30d07, + 0x7e050000, + 0x0d07fd30, + 0x5cbe1c07, + 0x0d07ff9b, + 0x505efc0e, + 0x804c27fd, + 0x07cbf49b, + 0xa30d071c, + 0x8000001e, + 0xff9b42be, + 0xfc0e0d07, + 0x4efd635e, + 0x27d007fc, + 0xcaf49b42, + 0x99ca4f9b, + 0x04d56403, + 0x35560308, + 0x1200cf27, + 0x111e0200, + 0xf49b4427, + 0xcacf9bca, + 0xcfa3c433, + 0x02001200, + 0x00004e27, + 0xcaf49b01, + 0x27ca1f9b, + 0xf49b1e4c, + 0x071766cb, + 0x001ea30d, + 0xbd7e0300, + 0x070d07fc, + 0x9ae9be1c, + 0x0e0d07ff, + 0xfcdd5efc, + 0x9b804c27, + 0x1c07cbf4, + 0x1ea30d07, + 0xbe800000, + 0x07ff9acf, + 0x5efc0e0d, + 0xfa4efcf0, + 0x4d27d007, + 0xf49b01fe, + 0xc54f9bc5, + 0x01034ff6, + 0x47490499, + 0x804f0344, + 0x19000230, + 0x07403943, + 0x9b210323, + 0x4f9bc5f3, + 0x9b41a3d0, + 0x4f9bd0f4, + 0x9b41a3d2, + 0x4f9bd2f4, + 0x9b41a3d5, + 0x4f9bd5f4, + 0x9b41a3d7, + 0x4f9bd7f4, + 0x2744d6c5, + 0x9b241e10, + 0x41c3d04f, + 0x9bd0f49b, + 0x41c3d24f, + 0x9bd2f49b, + 0x41c3d54f, + 0x9bd5f49b, + 0x41c3d74f, + 0x27d7f49b, + 0xf29b0f1c, + 0x022203c5, + 0x9b200720, + 0x4ce3cf4f, + 0xcff49b30, + 0xe3d44f9b, + 0xf49b304c, + 0xcf4f9bd4, + 0x18004de3, + 0x9bcff49b, + 0x4de3d44f, + 0xf49b1800, + 0x64d499d4, + 0x4f9b48e6, + 0x234846c5, + 0xc5f29b21, + 0x4f9b2103, + 0xcf3f9bc5, + 0x44334103, + 0xf39b34ab, + 0xd43f9bcf, + 0xf39b34ab, + 0x9b14abd4, + 0xaf9bc5f2, + 0xc5f09bc5, + 0x99c5bf9b, + 0x44d664d4, + 0x091ec027, + 0xf49b4427, + 0xcacf9bca, + 0x9b1e4c27, + 0x0d07cbf4, + 0x00001ea3, + 0xfb9a7e01, + 0x4bab4a47, + 0x4487c433, + 0x0d071c07, + 0x59be14ab, + 0x0d07ff95, + 0xb05efa0e, + 0xb80cd1fb, + 0x73a7be03, + 0xb94027ff, + 0x070296db, + 0x96d4bd0d, + 0x801c2702, + 0xff9537be, + 0x03bcd4b9, + 0x0296dbbd, + 0x4d034733, + 0xf49b016f, + 0x27c40dcf, + 0xf49b0e4c, + 0xd1f49bd0, + 0x9bd2f49b, + 0xc445d3f4, + 0xc425c415, + 0xfa0ec435, + 0xff73479e, + 0xd007fc4e, + 0x9b3e4c27, + 0x4e27cbf4, + 0x9b020000, + 0x1f9bcaf4, + 0x401c54ca, + 0x00004e27, + 0x00cf2704, + 0x1e010000, + 0x3f1c830a, + 0x1000cf27, + 0x17860100, + 0x0d0714ab, + 0x07faff7e, + 0x271c070d, + 0xbe312720, + 0x07ff9657, + 0x5efc0e0d, + 0x4c27fb1b, + 0xcbf49b80, + 0x0d071c07, + 0x00001ea3, + 0x27202780, + 0x9639be31, + 0x0e0d07ff, + 0xfb2a5efc, + 0xb007fa4e, + 0x80004d27, + 0x9bcaf49b, + 0xf49bca1f, + 0xca2f9bca, + 0x9bcaf49b, + 0xf49bca3f, + 0xca4f9bca, + 0x3433c287, + 0xc1abc3ab, + 0xc4ab4633, + 0x0000ce34, + 0x1ea02701, + 0x27cfab05, + 0x6b4c07a1, + 0x004f034f, + 0x9b800000, + 0x4b07cdf4, + 0x4d033b07, + 0x3d030328, + 0xb4d5032c, + 0xb3d50314, + 0x4f9b0320, + 0x28b4d5ca, + 0xcd4f9b03, + 0x1d031b07, + 0xb4d50330, + 0xb1d5032c, + 0xf4930310, + 0xd8ff8ce8, + 0x4c0721c1, + 0x4c834653, + 0xb442f10c, + 0x010001c3, + 0xccf39b23, + 0x23012403, + 0x01003df4, + 0x01270279, + 0x44010a1e, + 0xf49b4411, + 0xd80027cc, + 0x4c0729c4, + 0x4c834853, + 0xc442f10c, + 0x010001c3, + 0x9b052623, + 0x1405ca4f, + 0xf39b1403, + 0x012403cc, + 0x003dd423, + 0x0127ee01, + 0xf493181e, + 0x41ff8c8c, + 0x26431144, + 0xca4f9b05, + 0x14031405, + 0x27ccf39b, + 0x10ccd800, + 0x534c0729, + 0x0c4c834a, + 0xc3d442f1, + 0x23010001, + 0x4f9b0526, + 0x031405ca, + 0xccf39b14, + 0x23012403, + 0x01003dd4, + 0x1e0127ee, + 0x49f49318, + 0x4481ff8c, + 0x05264311, + 0x05ca4f9b, + 0x9b140314, + 0x0027ccf3, + 0x2a40ccd8, + 0x4c534c07, + 0x0c4c830c, + 0xc3e442f1, + 0x23010001, + 0x4f9b0526, + 0x031405ca, + 0xccf39b14, + 0x23012403, + 0x01003dd4, + 0x1e0127ee, + 0x05f49319, + 0x44c1ff8c, + 0x26431130, + 0xca4f9b05, + 0x14031405, + 0x27ccf39b, + 0x0b408700, + 0x1cb4d541, + 0xe5f49303, + 0xc2d8ff8b, + 0x534c072c, + 0x0c4c8346, + 0xc3b442f1, + 0x23010001, + 0x4f9b0526, + 0x031405ca, + 0x403ca314, + 0x03ccf39b, + 0xd4230124, + 0xeb01003d, + 0x161e0127, + 0x43114401, + 0x4f9b0526, + 0x031405ca, + 0x403ca314, + 0x27ccf39b, + 0x2cc8d800, + 0x48534c07, + 0xf10c4c83, + 0x01c3c442, + 0x26230100, + 0xca4f9b05, + 0x14031405, + 0x9b403ca3, + 0x2403ccf3, + 0x3dd42301, + 0x27eb0100, + 0x931b1e01, + 0xff8b6ff4, + 0x43114441, + 0x4f9b0526, + 0x031405ca, + 0x403ca314, + 0x27ccf39b, + 0x20ccd800, + 0x534c072c, + 0x0c4c834a, + 0xc3d442f1, + 0x23010001, + 0x4f9b0526, + 0x031405ca, + 0x403ca314, + 0x03ccf39b, + 0xd4230124, + 0xeb01003d, + 0x1b1e0127, + 0x8b26f493, + 0x114481ff, + 0x9b052643, + 0x1405ca4f, + 0x3ca31403, + 0xccf39b40, + 0xccd80027, + 0x4c072b80, + 0x830c4c53, + 0x42f10c4c, + 0x0001c3e4, + 0x05262301, + 0x05ca4f9b, + 0xa3140314, + 0xf39b403c, + 0x012403cc, + 0x003dd423, + 0x1c1eeb01, + 0x8adef493, + 0x3044c1ff, + 0x05264311, + 0x05ca4f9b, + 0xa3140314, + 0xf39b403c, + 0x9b081ecc, + 0x1405ca4f, + 0xbd031403, + 0xd1070330, + 0xd273db2b, + 0xbd23d103, + 0xdc330330, + 0x001e2718, + 0xf19b0200, + 0xca3f9bca, + 0x27403c34, + 0x0400001e, + 0xdda3081e, + 0x3c831000, + 0x204c273f, + 0x86cbf49b, + 0x0713ab37, + 0xf7f27e0b, + 0x1d070b07, + 0x3a072c07, + 0xff934abe, + 0xfa0e0b07, + 0x27f80e5e, + 0xf49b804c, + 0x071d07cb, + 0x001ea30b, + 0x2c078000, + 0x2cbe3a07, + 0x0b07ff93, + 0x1d5efa0e, + 0xca4f9bf8, + 0x14031405, + 0x00fd745e, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x0dd1fc4e, + 0xcf2703b0, + 0xf4000000, + 0x236a0499, + 0xd1d301d4, + 0xd1021402, + 0xa602180e, + 0xff3f834b, + 0xd47fffff, + 0x0000003f, + 0x43072f04, + 0x73124c33, + 0x4103124c, + 0x072243d4, + 0x73463343, + 0x4fc8144c, + 0xffffffff, + 0x1142cc14, + 0x00002f14, + 0x20270400, + 0x0000ef14, + 0xe0270400, + 0xf49b1419, + 0x9b204890, + 0xf29b93f2, + 0x9b041eb0, + 0x4c0393fc, + 0x90f49b40, + 0xfe9be048, + 0xb0fe9b93, + 0xfc9b041e, + 0x01140393, + 0x004dd414, + 0x0dd58701, + 0xfc8e03b0, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0xd007f54e, + 0xff517abe, + 0x04e61007, + 0x665e0d07, + 0xbd412704, + 0x270131d4, + 0x30d4bd40, + 0xb6d0bd01, + 0x014f2703, + 0x9b200000, + 0xf893a0f4, + 0x2702285c, + 0x0400009e, + 0x930c5c27, + 0x022927f6, + 0xb91e7c27, + 0x760130d4, + 0x622f9b4b, + 0x2b634f9b, + 0x542dcc24, + 0x84c16721, + 0x633f9b3c, + 0x42d2432b, + 0x630f9b5c, + 0xff4ecabe, + 0x21540d27, + 0xff378abe, + 0x21540dcc, + 0x3c84c148, + 0x2b633f9b, + 0x3d40d243, + 0x42032f1e, + 0xd4bd4f6b, + 0x48d00130, + 0x630f9b30, + 0xff4e9ebe, + 0x9b624f9b, + 0x432b633f, + 0x10aa4dcc, + 0xaa0d2710, + 0x3751be10, + 0xaa0d0cff, + 0x634f9b10, + 0xdebe0d07, + 0x4227fde2, + 0x0130d4bd, + 0x03b8d2d1, + 0x0132d3a9, + 0x1c031207, + 0xb8d1d514, + 0xbcdcb903, + 0xcfef9b03, + 0x0298d4a9, + 0x4de3be07, + 0xbd830280, + 0xb4ab0280, + 0x07cffb9b, + 0x280c0302, + 0x43073ee6, + 0xd4ad4123, + 0x40270132, + 0x9bd4f49b, + 0xf49bd5f4, + 0xd7f49bd6, + 0x27d8f49b, + 0x3024c530, + 0x044524b5, + 0x3528238d, + 0xcaf99b04, + 0xd6ca3f9b, + 0x1ea02734, + 0xcffe9b17, + 0x4027c4e6, + 0x9bd4f49b, + 0xaf9bcaf9, + 0xeca30bca, + 0x270083a2, + 0x9b01003d, + 0xcf9bcaf3, + 0x89761eca, + 0xc5062823, + 0x89803c18, + 0xf39b1423, + 0xcaf99bd4, + 0xd6ca2f9b, + 0x1ea02724, + 0xcffe9b16, + 0x0409c4e6, + 0x9bd4f49b, + 0xaf9bcaf9, + 0xcca20bca, + 0x4b0747a2, + 0x9b404ca3, + 0x0409cff4, + 0x9b404ca3, + 0x4d27d4f4, + 0xf49b0100, + 0xca2f9bca, + 0x3cd82626, + 0x14090c80, + 0x9b404ca3, + 0x1c23d4f4, + 0x07310714, + 0x143c03c2, + 0xf49b1461, + 0x9b1471d5, + 0x3431d6f4, + 0x41d7f49b, + 0xd8f49b34, + 0x0394fc9b, + 0x94fc9bc2, + 0xd3b94027, + 0xd4bd03bc, + 0xc22303b4, + 0x00af3cee, + 0x029cd1d1, + 0x02a0d3d1, + 0xd4d1ca26, + 0x030702a4, + 0x83304ce3, + 0x04ab300c, + 0xef9b2107, + 0xd24f9bd0, + 0x9b304ce3, + 0x1c83d11f, + 0x9b14ab30, + 0xf09bd0f2, + 0xd2fe9bd1, + 0x1ed3f19b, + 0xe3210753, + 0xab278337, + 0xd0f19b23, + 0x31074207, + 0x83303ce3, + 0x43ab304c, + 0x07d1f49b, + 0x301c8342, + 0xab304ce3, + 0xd2f49b41, + 0xd1d3f29b, + 0xd102a4d2, + 0x0702a8d4, + 0x8347e312, + 0x0714ab17, + 0x07010732, + 0xe34207e1, + 0x0c83303c, + 0x30ece330, + 0xab304c83, + 0x07e4ab03, + 0xad4b334c, + 0xd502acdb, + 0xd502b0d2, + 0xd502b4d0, + 0xd502b8de, + 0xad02bcd1, + 0xbd0294d4, + 0x1e03bcdc, + 0xacdead3d, + 0xd04f9b02, + 0x02b0d4d5, + 0xd5d14f9b, + 0x9b02b4d4, + 0xd4d5d24f, + 0x4f9b02b8, + 0xbcd4d5d3, + 0x9cd4d102, + 0xd0f49b02, + 0x02a0d4d1, + 0xd1d1f49b, + 0x9b02a4d4, + 0xd4d1d2f4, + 0xf49b02a8, + 0x07a546d3, + 0xc446be0d, + 0x27151eff, + 0x9b40003d, + 0x4f9bcaf3, + 0x9c44f1ca, + 0x07000230, + 0xb9f48b0d, + 0xf603b6d1, + 0xd100e61f, + 0xb903b8db, + 0x0703bcd4, + 0x14cc03cb, + 0x03b8dcd5, + 0x9b104c03, + 0xd4b994f4, + 0x4c0303bc, + 0x94f49b12, + 0xd4bd4127, + 0x4f9b03b4, + 0xd02f9bcf, + 0x9bd11f9b, + 0xef9bd20f, + 0xacd3a9d3, + 0x98d4ad02, + 0x803de302, + 0x804d8302, + 0x9cd2d502, + 0xa0d1d502, + 0xa4d0d502, + 0xa8ded502, + 0x9b43ab02, + 0xd4d1cff4, + 0xf49b02b0, + 0xb4d4d1d0, + 0xd1f49b02, + 0x02b8d4d1, + 0xd1d2f49b, + 0x9b02bcd4, + 0xd4b9d3f4, + 0x451603bc, + 0xcb07b409, + 0xb489071e, + 0x804ca314, + 0x11d4f49b, + 0xd5f49bc4, + 0xf49bc421, + 0x9bc431d6, + 0xc441d7f4, + 0x07d8f49b, + 0x4c31233a, + 0xcaf99b30, + 0x1eca3f9b, + 0xcf4f9b13, + 0x9b404ca3, + 0x4f9bcff4, + 0x404ca3d4, + 0x46d4f49b, + 0xbe0d0735, + 0x1effc360, + 0x004d2715, + 0xcaf49b40, + 0xf1ca4f9b, + 0x02309c44, + 0x8b0d0700, + 0xb6d1b9f4, + 0x07150603, + 0x1ecf4bc1, + 0x94f59b16, + 0x03bcd4b9, + 0x9b104c03, + 0x3c2794f4, + 0x94f39b12, + 0x4d27c027, + 0xf49b01fe, + 0xc5bf9bc5, + 0x0130d4b9, + 0x4f9b4686, + 0x633f9b62, + 0x404c432b, + 0xf50e0d07, + 0xfde0eb9e, + 0x82c1ca96, + 0x631f9b3c, + 0x07623f9b, + 0x08422b43, + 0x07320740, + 0xc8432b41, + 0x84c11141, + 0xc4411b3c, + 0x6ebe1348, + 0x0686fdc7, + 0x4f9b0b1e, + 0xbc83c161, + 0x4506438b, + 0x1c070d07, + 0x6009401e, + 0x020664b9, + 0x600d0123, + 0xf59b45f6, + 0x9b058694, + 0xf79b94f7, + 0xb60e1e94, + 0xadf39305, + 0x34110227, + 0xf48b0607, + 0x960f01cc, + 0x07b74604, + 0x0e1b070d, + 0xc2e19ef5, + 0xd0bfe6ff, + 0x270d07fb, + 0x9ef50e12, + 0x27fde09d, + 0x00f58e07, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x04d1fd4e, + 0x039903b0, + 0x0144236a, + 0xb004d542, + 0x140ed103, + 0x180dd102, + 0x073de602, + 0xff0f8302, + 0xd47fffff, + 0x0000000f, + 0x20073f04, + 0x2c732633, + 0x843f9b14, + 0x43834307, + 0x5b144c03, + 0x73311834, + 0x33400721, + 0x4c73124c, + 0xd4410312, + 0x2fc81b43, + 0xffffffff, + 0x1122cc14, + 0x0000ef14, + 0xe0270400, + 0x0000df14, + 0xd0270400, + 0xf19b1119, + 0x9be04890, + 0xfe9b93fe, + 0x270a1eb0, + 0x0000004f, + 0x93f49bf4, + 0x9b401c03, + 0xd04890f1, + 0x9b93fd9b, + 0xfd8eb0fd, + 0x00004f27, + 0xf49bf400, + 0x00fd8e93, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0xe95ef493, + 0x0b406901, + 0x47fd4efe, + 0x07e00be3, + 0x07e123d3, + 0x7fece330, + 0x197f3ce3, + 0x803c0334, + 0x1e11e3ca, + 0x29211cf7, + 0x03040d14, + 0x03215314, + 0x07051e02, + 0x2731033d, + 0x8ef34841, + 0x23f74efd, + 0x07b307f1, + 0x07810770, + 0x273f07d2, + 0x4c270fec, + 0x033e1d10, + 0x27f4c831, + 0x07e42720, + 0x27320b3b, + 0x03340540, + 0x07fe9824, + 0x233207e2, + 0x0b4d07e1, + 0x5444194e, + 0x2f07104c, + 0x4e1d420b, + 0x9b07f360, + 0x03100c27, + 0x070e2b98, + 0x8743534e, + 0x834e0724, + 0x07d48747, + 0x194e0b47, + 0x07120744, + 0x0bce0bc8, + 0x07190b2b, + 0xd4e103ad, + 0x070f104c, + 0x19430b3f, + 0x3b230144, + 0x0534ab4d, + 0xd4c41923, + 0x070f104c, + 0x19420b2f, + 0x3b130144, + 0x0534ab4a, + 0xb8f0f013, + 0xf78ef103, + 0xffff3ea7, + 0x2034d1fb, + 0xfa42d804, + 0xeb36f493, + 0xf440d101, + 0x1834d103, + 0x0b008704, + 0x93fa4efe, + 0x01eb23f2, + 0xa307f063, + 0xc0442bc1, + 0x24d17901, + 0xd0070214, + 0xa77004ce, + 0xfeffffce, + 0x1df1c4b9, + 0x021420d5, + 0xc4d14746, + 0x40ce1e34, + 0xbe002712, + 0x27fef114, + 0xf1c4bd40, + 0xffdea71d, + 0xfc93f9ef, + 0xd101eae4, + 0x0e0218c4, + 0x2fbea7b4, + 0xd2c1f9ef, + 0x070c074c, + 0x500d031d, + 0x501c0302, + 0x7e203c27, + 0xc499feb5, + 0x20ce9943, + 0x2b071d07, + 0x3c070d07, + 0x03281c03, + 0x03080328, + 0x0502403d, + 0xfecb7efe, + 0xc4bd4127, + 0x0a070239, + 0xfa8ef043, + 0xf493fe4e, + 0x3101ea94, + 0x1444d101, + 0x5914ce02, + 0xa75611c0, + 0xfeffff3e, + 0x1df134b9, + 0x274a42c0, + 0xf134bd42, + 0x3431d51d, + 0x9b40271e, + 0x2ea70ef4, + 0x1efdefff, + 0x11f3e803, + 0x33332724, + 0x4c53184c, + 0xc844131d, + 0x0027f042, + 0xefff2ea7, + 0xd03c27f9, + 0xfeeecfbe, + 0x1ea70027, + 0xa7fee072, + 0xfee20e2e, + 0xfe0e3127, + 0xfeeebb9e, + 0x11c8fe8e, + 0xff4ea713, + 0x41d5fbff, + 0x3407042c, + 0x042034d1, + 0x0bfa42d8, + 0x13fb4efe, + 0xd007fcf4, + 0x0b990405, + 0x622f9b6e, + 0x2b634f9b, + 0x102ccc24, + 0x6dfc932f, + 0xc4c101e6, + 0x633f9b3c, + 0x42d2432b, + 0x630f9b1f, + 0xff0cfebe, + 0xbe100c27, + 0xccfef5bf, + 0xc10d100c, + 0x3f9b3cc4, + 0xfa432b63, + 0xbe01fd04, + 0x99fef2a2, + 0xd49964d3, + 0x33c38768, + 0x49d39944, + 0x9969d299, + 0xc4ab6fd1, + 0x2113c3ab, + 0x2770d499, + 0x27121431, + 0xab253330, + 0x273633c2, + 0x27421421, + 0x99420720, + 0xc3ab4cd2, + 0xc4ab4733, + 0x00822fe6, + 0x38be0d07, + 0xd499fda4, + 0x33344775, + 0x2b432b43, + 0x34bc10b4, + 0xd199b027, + 0xff2ea766, + 0x1a33fdef, + 0xf3e8031e, + 0x33272401, + 0x53184c33, + 0x44c01d4c, + 0xff2ea7f2, + 0x4027fdeb, + 0x3f272405, + 0x12820000, + 0xf49b2315, + 0x0300270e, + 0x01522c1f, + 0x002d2700, + 0xef0dbe04, + 0x75d499fe, + 0x836fd399, + 0xab493343, + 0x101027c4, + 0x99112732, + 0x202770d4, + 0x21274210, + 0x53be0d07, + 0xf493fda5, + 0x05ff4184, + 0x00895ed4, + 0xa766d199, + 0xfdefff2e, + 0x031e1a33, + 0x2401f3e8, + 0x4c333327, + 0x1d4c5318, + 0xa7f244c0, + 0xfdebff2e, + 0x24054027, + 0x00003f27, + 0x23151282, + 0x270ef49b, + 0x2c1f0300, + 0x27000152, + 0xbe04002d, + 0x93feeea3, + 0x01e617f4, + 0x42694329, + 0x230b4409, + 0x2b67d399, + 0xbd402724, + 0x3b03b4d4, + 0x270d0723, + 0x8152be10, + 0x20d499ff, + 0x4f6b4623, + 0xcda34214, + 0xd4990100, + 0x93452667, + 0xffbc83f4, + 0xf493061e, + 0x05ff7c80, + 0xd54027d4, + 0x270304d4, + 0xc3f49b47, + 0x27c9fc9b, + 0x9b01004d, + 0xcea7a0f4, + 0x27f97fff, + 0x4f9b80dc, + 0x072407ae, + 0x33140734, + 0x182c7328, + 0x1f4b3f8b, + 0x2b9b1b9b, + 0x4c733873, + 0x73147318, + 0x803f0324, + 0x030002b9, + 0x02b9804f, + 0x0b310b00, + 0x803e9942, + 0x9b804099, + 0x3207ae2f, + 0x42071207, + 0x1f4b3f8b, + 0x1b9b3873, + 0x14734833, + 0xb9803f03, + 0x4c730002, + 0x9b310b18, + 0x182c734b, + 0x33994473, + 0x802f0380, + 0x0b0002b9, + 0x33083324, + 0x2499103c, + 0xab03ab80, + 0x184c330e, + 0xc00504ab, + 0xfdf0c403, + 0x9b402782, + 0x4d270ef4, + 0xf49b0300, + 0x114f27a0, + 0x9b200000, + 0xf9bea0f4, + 0x0027fef8, + 0xc4c1fb8e, + 0x633f9b3c, + 0x4c28432b, + 0x0e0c2710, + 0x0d07fb8e, + 0x639efb0e, + 0x0000fef7, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x007c0000, + 0x7c000000, + 0x00000000, + 0x0000007c, + 0x00007c00, + 0x00007c00, + 0x7c7c0000, + 0x7c7c0000, + 0x0000007c, + 0x0000007c, + 0x007c7c00, + 0x007c7c00, + 0x7c7c7c00, + 0x7c7c7c00, + 0x7c7c7c7c, + 0x007c7c7c, + 0x7c7c7c7c, + 0x7c7c7c7c, + 0x7c7c7c7c, + 0x7c7c7c7c, + 0x7c7c7c7c, + 0x7c7c7c7c, + 0x7c7c7c7c, + 0x7c7c7c7c, + 0x7c7c7c7c, + 0x7c7c7c7c, + 0x7c7c7c7c, + 0x7c7c7c7c, + 0x7c7c7c7c, + 0x7c7c7c7c, + 0x7c7c7c7c, + 0x787a7c7c, + 0x70727476, + 0x686a6c6e, + 0x60626466, + 0x585a5c5e, + 0x50525456, + 0x484a4c4e, + 0x40424446, + 0x383a3c3e, + 0x30323436, + 0x282a2c2e, + 0x20222426, + 0x181a1c1e, + 0x10121416, + 0x080a0c0e, + 0x00020406, + 0x07050301, + 0x0f0d0b09, + 0x17151311, + 0x1f1d1b19, + 0x27252321, + 0x2f2d2b29, + 0x37353331, + 0x3f3d3b39, + 0x47454341, + 0x4f4d4b49, + 0x57555351, + 0x5f5d5b59, + 0x67656361, + 0x6f6d6b69, + 0x77757371, + 0x7d7d7b79, + 0x7d7d7d7d, + 0x7d7d7d7d, + 0x7d7d7d7d, + 0x7d7d7d7d, + 0x7d7d7d7d, + 0x7d7d7d7d, + 0x7d7d7d7d, + 0x7d7d7d7d, + 0x7d7d7d7d, + 0x7d7d7d7d, + 0x7d7d7d7d, + 0x7d7d7d7d, + 0x7d7d7d7d, + 0x7d7d7d7d, + 0x7d7d7d7d, + 0x7d7d7d7d, + 0x7d007d7d, + 0x7d7d7d7d, + 0x7d7d7d7d, + 0x7d7d7d7d, + 0x7d007d7d, + 0x007d007d, + 0x007d007d, + 0x007d007d, + 0x007d7d7d, + 0x7d007d00, + 0x00007d00, + 0x00007d00, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0xff0102cc, + 0x0004ac00, + 0x00000001, + 0x00000000, + 0x00000003, + 0x00000004, + 0xff011bc0, + 0x0004ac08, + 0x00000200, + 0x000001de, + 0x00000003, + 0x00000004, + 0xff011bcc, + 0x0004ac10, + 0x00000200, + 0x000001de, + 0x00000003, + 0x00000004, + 0xff011ba8, + 0x0004ac18, + 0x00000008, + 0x00000007, + 0x00000003, + 0x00000004, + 0xff011bb4, + 0x0004ac20, + 0x00000008, + 0x00000007, + 0x00000003, + 0x00000004, + 0xffff3ea7, + 0x200fa3f7, + 0xa5200002, + 0xb5402730, + 0x4efe0b34, + 0x6b1007fd, + 0x03d1871f, + 0x04ad94df, + 0x9b085300, + 0xd401103f, + 0x9c66f293, + 0x2b2e6101, + 0x9dd40543, + 0x249908e1, + 0xff3ea716, + 0xe49dfd4f, + 0x08248909, + 0x2499e44d, + 0x0a21890c, + 0x410b3211, + 0xe205e46d, + 0x402707f6, + 0x070ef49b, + 0x27ff8b00, + 0x05302740, + 0x08e39de4, + 0x01102f9b, + 0x05420bd4, + 0x07fd8ed4, + 0x03427340, + 0x1ef4e841, + 0x034007e3, + 0x45330d4c, + 0x180042f5, + 0x100bff02, + 0x180443f5, + 0x2027ff02, + 0xe8004e23, + 0x034235fd, + 0xfde8004e, + 0x181041f5, + 0x43f5ff02, + 0xff021814, + 0xe7f04e23, + 0x0b4235fd, + 0xff4ea7fe, + 0x40d5f7ff, + 0x22530100, + 0x340725c6, + 0x010834d1, + 0x14031405, + 0xfe0bf2a8, + 0x4ea7f84e, + 0x99ffffff, + 0x44d10a03, + 0xb0070108, + 0x076c3fc6, + 0x074853a4, + 0x539f6b94, + 0x030710ac, + 0xd027eb07, + 0xc0a78027, + 0x0758e299, + 0x33320742, + 0x2b353343, + 0xff2cc034, + 0x8c34f113, + 0x27ff0001, + 0xd81d3b11, + 0x0400004e, + 0x03c1eb26, + 0xf0e103d1, + 0xb441d7f0, + 0xb431842e, + 0xa7204cce, + 0xf7ffff4e, + 0xc5444cc5, + 0x00274848, + 0xbc35b845, + 0x92cef88e, + 0x338d07db, + 0x8aab108c, + 0x0427d21e, + 0xc027f88e, + 0xcf1e8027, + 0x4ea7fd4e, + 0x01f7ffff, + 0x07d00743, + 0x0d38dc01, + 0xfd8e16b6, + 0x10060e27, + 0xfea57e27, + 0x5d7e0d07, + 0x8e0276ff, + 0x5efd0efd, + 0xfc4efe97, + 0xefff3ea7, + 0x8834c1fd, + 0x4c33d007, + 0x1d4c5318, + 0x071944c4, + 0x270d07c3, + 0x27ba3e10, + 0xc1f4e843, + 0x3c3388c3, + 0x1d3c5318, + 0x8eeb34c0, + 0x87fd4efc, + 0x0b163341, + 0x4c43f141, + 0x030004ac, + 0x11024c0d, + 0x93bc3e3d, + 0x019977f4, + 0x32c14321, + 0x1721c068, + 0xe5df3ea7, + 0xd0dc03fd, + 0x02004d27, + 0x34153d05, + 0x34354027, + 0x3ea7fd8e, + 0x03fde5df, + 0x4d27d0dc, + 0x3d050100, + 0x40273415, + 0xfd8e3435, + 0xc007fc4e, + 0xffffdea7, + 0xdc0b1ef7, + 0x0d272241, + 0x047e640a, + 0xdcd401fe, + 0x48d81044, + 0x270c07ef, + 0xff367e10, + 0x44d8d401, + 0x9e0227f2, + 0x8efe15b2, + 0x000000fc, + 0x0003e81c, + 0x0003e80f, + 0x0003e81b, + 0x0003e807, + 0xf1a3f54e, + 0x9107a007, + 0xa469161e, + 0x450b4c2b, + 0x41c84f8b, + 0xd9f41362, + 0x0a074101, + 0xa7fef77e, + 0xffffff2e, + 0x010224a9, + 0x010423a9, + 0x9289c407, + 0x1b4307b2, + 0x07422b4c, + 0xb09d8964, + 0xd62b6fab, + 0xd123f305, + 0xffff3ea7, + 0x093499fe, + 0x019fd0e8, + 0x34074383, + 0x44873433, + 0x32f1342b, + 0xff000054, + 0x7307a401, + 0xffb47e23, + 0x8e24e2ff, + 0x09a49901, + 0xd608a599, + 0x9231954f, + 0xf235b127, + 0x74191207, + 0x990f1c83, + 0x13330473, + 0x31078307, + 0xff843e23, + 0x7c12f9ff, + 0x15ff0000, + 0x00f345f4, + 0x18b02782, + 0xb2a3402c, + 0x14f9b906, + 0xff00007d, + 0x231e4bce, + 0xff4ea7c1, + 0x43b9ffff, + 0x4c070108, + 0x030f4c83, + 0x53344ec1, + 0x01ff2ff2, + 0xff505e21, + 0x0131dfe6, + 0xffff2ea7, + 0xb93c07ff, + 0x83010824, + 0xf3550f3c, + 0x00b334ee, + 0xfe3c39be, + 0x2ea77459, + 0xa9ffffff, + 0x25010223, + 0xaf3ceef4, + 0x27b42700, + 0x9b402704, + 0x2ea70ef4, + 0x21fd4fff, + 0x3824c5f3, + 0xd608a39d, + 0x2ea75ebf, + 0xa9feffff, + 0x27014224, + 0xad4103e1, + 0x9d014224, + 0x3ea709ae, + 0x6dfd4fff, + 0x193211ac, + 0x899d2d94, + 0x9129b093, + 0x011092d5, + 0x4383f251, + 0x941d923d, + 0x31c0312b, + 0xa7d8d634, + 0xffffff3e, + 0x06373ebd, + 0x270f3299, + 0x0ef49b40, + 0x22873127, + 0xb04023f5, + 0x9431ff02, + 0x41037321, + 0xc87734ce, + 0x10072d05, + 0xe8001e03, + 0xfea05e03, + 0x2ea7f331, + 0x6bfddfff, + 0xa343873f, + 0xd504004d, + 0xd5020824, + 0x1e02082b, + 0x65f453b5, + 0x5e4101fe, + 0x04e0fe7e, + 0xf183fe7f, + 0x24a9f58e, + 0xf3010104, + 0xff4b43ee, + 0x54eef421, + 0x7419ff45, + 0x42eef211, + 0x6f26ff3d, + 0x2439f241, + 0x997bb4ce, + 0x4fd605a4, + 0x034c076e, + 0xff3ea741, + 0x34adffff, + 0xdad60102, + 0x0027b027, + 0x1a5e746d, + 0xa39419ff, + 0x1e941d44, + 0x27943183, + 0x83410302, + 0x8ea405f1, + 0x830227f5, + 0xfcf58ef1, + 0xf6fecf28, + 0x53fecb8f, + 0x01fdeff3, + 0xfe0c5e31, + 0x0027b027, + 0x99fee85e, + 0x4fd605a4, + 0xa18fc6a4, + 0x0ea7f331, + 0x25fff9cf, + 0x27741973, + 0x1d410331, + 0x05a39d74, + 0xfe955bbe, + 0xb227871e, + 0xbe5e0227, + 0x272b3dfe, + 0xff4ea730, + 0x43adffff, + 0x44a9010a, + 0x36070104, + 0x2ea7340b, + 0x27ffffff, + 0xad0427b4, + 0x5e010423, + 0xfa4efe99, + 0xd107a007, + 0xcea7b207, + 0x11fdcfff, + 0x01d101de, + 0x11d431e0, + 0x2b132112, + 0x0b340b40, + 0x1132ab24, + 0x483028e0, + 0xa7fa8e00, + 0x27f91e00, + 0x44c4c542, + 0x1b070a07, + 0x27fc777e, + 0x44c4c540, + 0x1e64c4c5, + 0x99f84ecb, + 0xd0075704, + 0x0c999107, + 0xa74ff656, + 0xa5fa9300, + 0x8ea7fffa, + 0x07fef457, + 0xffbea71a, + 0xf093f7ff, + 0x270199d0, + 0x933e122c, + 0x0100bcd5, + 0xd158d499, + 0x330108b3, + 0x43ab1f4c, + 0x0087c487, + 0x0b1acc53, + 0x07940508, + 0x070405ec, + 0x03e12319, + 0xd0040314, + 0x2c0723e2, + 0x21532323, + 0x2103db07, + 0x0108d3d1, + 0x1305e223, + 0xd4d10305, + 0x14150108, + 0x18030415, + 0xf2380803, + 0x4ea7e5e6, + 0xd1f7ffff, + 0x05010843, + 0x11030513, + 0x011311a1, + 0x0b3c0b12, + 0x0513152c, + 0xdaa43112, + 0xa4012a43, + 0xa3414205, + 0x33872127, + 0x306032f5, + 0xa451ff02, + 0x42f54487, + 0xff023060, + 0xfa93f88e, + 0xa7fffa18, + 0xfeec578e, + 0x21ff5a5e, + 0x0b432ba4, + 0x15302724, + 0x1e120513, + 0x000000ca, + 0x0000004f, + 0x0004afd4, + 0x00000024, + 0xff0108e8, + 0x000310e0, + 0x00000014, + 0x00000036, + 0xf223f54e, + 0xa0071f07, + 0x03101c03, + 0x45024c0d, + 0xc1f175f0, + 0xf041c0a4, + 0x49894229, + 0xb54399b0, + 0x2b994199, + 0x2b340392, + 0x142c2731, + 0xf982f193, + 0x3b9123ff, + 0xfe987e93, + 0x30074007, + 0x44333633, + 0xf213430b, + 0x2b2101a0, + 0xc1448740, + 0x4e23c0a2, + 0x07fee418, + 0x232d0131, + 0x034d0511, + 0x98440324, + 0xcdf093f3, + 0x03110194, + 0x31030401, + 0x03154103, + 0x31ec0405, + 0xf29309df, + 0x010194b8, + 0x333ea724, + 0x3405fefd, + 0x4ea7e127, + 0xc5fdcfff, + 0x20276c4e, + 0xc1704ec5, + 0x4027c0ab, + 0xa49d3127, + 0x0da39d0c, + 0x0710a29d, + 0x0cbd8969, + 0xa18d6fab, + 0x8da24d08, + 0xad8d0aa6, + 0x370ea716, + 0xa065fee0, + 0x9972b489, + 0x412399b2, + 0xb1990487, + 0xe024f0b4, + 0x74b38907, + 0x236eb499, + 0xe0323b24, + 0x07095d4a, + 0x1b423b49, + 0x0fa29d43, + 0x41074102, + 0x325b3407, + 0x13872007, + 0x2123132b, + 0x230b1103, + 0x430702a7, + 0xa26d4123, + 0x070ea49d, + 0x2a41e824, + 0x6b430709, + 0x0741230f, + 0x11309d3a, + 0xf4c03103, + 0x219d2a0b, + 0x0cbe8911, + 0x8d0ea499, + 0x4ce016ae, + 0x9305bbff, + 0x019437f0, + 0x890fa399, + 0x19071004, + 0x135b2487, + 0x129b0331, + 0x0107130b, + 0xe207020b, + 0x956efd93, + 0x99e00b01, + 0x5ea70ed3, + 0x93efffff, + 0x01940bfd, + 0x5ca12e0b, + 0x8de2d48d, + 0xd48d16d4, + 0x9ed48d5a, + 0x0120d2d5, + 0xc554d1c5, + 0xdec598d0, + 0x893103dc, + 0x3f6b72bd, + 0x8999b799, + 0xd39b74b8, + 0xc8b8abc1, + 0xc5071cc0, + 0xfe56fe53, + 0xe0014227, + 0x1c27c405, + 0xf9de7e1a, + 0xc4054027, + 0x30ccc3a1, + 0x234747e8, + 0xabd43b48, + 0xa7dbabdf, + 0xefffff4e, + 0xa3c14d85, + 0x0331e0b0, + 0x07812307, + 0xab2607e8, + 0x273a07ef, + 0xad102704, + 0xbd011e32, + 0x16012531, + 0xbd412725, + 0xbd012534, + 0x2e012631, + 0xbd4127e2, + 0x03012634, + 0x2103603c, + 0x99dbf0f0, + 0xabc10ca9, + 0x074907c0, + 0x33453369, + 0x03642b67, + 0x5a07cc6c, + 0x0b98b499, + 0xcc6c2356, + 0x0708a389, + 0x231a0b16, + 0xa9343b44, + 0xad012012, + 0xf6011c13, + 0x99041f2f, + 0xa34910a4, + 0x4ff6438b, + 0xa4c1056a, + 0x0841e0b0, + 0x87090706, + 0x550633e9, + 0xf1e00bfe, + 0x04ac88ec, + 0x01fe6500, + 0x038e07c1, + 0x04ac508f, + 0x8e1fe600, + 0x83e10707, + 0xd5eff6e1, + 0xc0a3c105, + 0x34c1fb61, + 0x50bf0368, + 0xe60004ac, + 0xa705614f, + 0xfde5bf4e, + 0x2c274105, + 0xa7421538, + 0xfde5af3e, + 0x4c274e35, + 0x15340524, + 0x07002732, + 0x7e3e351b, + 0xf361f849, + 0xac343f03, + 0x31890004, + 0x1634891e, + 0x2b1c3e89, + 0x16348d41, + 0x46072187, + 0x3e8d2c0b, + 0x654a0b14, + 0x2041ad38, + 0x5432c501, + 0x053f91e0, + 0x050491f4, + 0x93cefc93, + 0x278ea701, + 0xbea7fefd, + 0x11fefd17, + 0x11c40183, + 0xf4432bc2, + 0x0679104c, + 0x30e83207, + 0xf1610651, + 0x1f034307, + 0x0004ac34, + 0x45333387, + 0x1289432b, + 0x054b0b1e, + 0x3c1c0342, + 0x36274403, + 0x14031d01, + 0x44034d05, + 0xc301f3a8, + 0xc3053103, + 0xc4118305, + 0x4c834103, + 0x61c4150f, + 0x034127f0, + 0x04ac340f, + 0xff1ea700, + 0x0389fdcf, + 0x6c14c51c, + 0xae891607, + 0x271a0b08, + 0xfe3d0440, + 0xbd4127ff, + 0xc1012814, + 0x13a9c0a4, + 0x42890120, + 0x273e0b72, + 0x27320e40, + 0x2714bd41, + 0xcc138901, + 0xee1c0489, + 0x61025434, + 0x09102702, + 0x87042727, + 0x5834f131, + 0xee0004ad, + 0x03058d47, + 0x27f07811, + 0x87042730, + 0x5814f113, + 0xe00004ad, + 0xffffff4f, + 0x0305cbff, + 0x93f05831, + 0x0191c7fd, + 0x8914de89, + 0xdb8958dc, + 0xe0d8899c, + 0xcf8bef8b, + 0x8f8bbf8b, + 0x14274027, + 0x03f10487, + 0x0004ad58, + 0x3c2e3e4e, + 0x83ee3b0e, + 0x410305ac, + 0xb0a7f148, + 0x00cfdea7, + 0xe62211e5, + 0x9305212f, + 0x019187f1, + 0x43c11421, + 0xa03fe668, + 0xbf4ea704, + 0x4205fde5, + 0x15d02c27, + 0x35c02742, + 0xaf3ea74c, + 0x4c27fde5, + 0x15340524, + 0x07002732, + 0x7e3c351d, + 0xd199f6d1, + 0x0716e606, + 0x202c273d, + 0xe0083499, + 0x0279ff4c, + 0x028612e0, + 0xf2783103, + 0x47f54b87, + 0x0004ad58, + 0xe6a1a499, + 0x99038e4f, + 0x3fe606d3, + 0xfe610387, + 0xac50e4e9, + 0x4de00004, + 0x0379fffe, + 0x054131e0, + 0x07bda899, + 0x16cc33c8, + 0xa4c18926, + 0x6843c1c0, + 0x052631e0, + 0x2020cda3, + 0x991781c4, + 0x34074bd4, + 0x830f3c33, + 0x003e8347, + 0x4c333800, + 0xab34ab10, + 0x27f041c3, + 0xf7207e70, + 0x87bea499, + 0xd84cf544, + 0x9bff011b, + 0xa4990ef7, + 0xdf0ea7be, + 0x4487fde5, + 0xe4284e23, + 0x05c427fe, + 0x270c1504, + 0xa7073541, + 0xf7ffff1e, + 0x26e014c5, + 0x070a0785, + 0xf7177e19, + 0x99c0abc1, + 0x4ae06eb4, + 0xa49904cd, + 0x031b07be, + 0x9d438341, + 0xb399bea4, + 0x0fa499b5, + 0x2bb4b299, + 0xc6237b34, + 0x72075d2f, + 0xb9070507, + 0x91caf393, + 0xc034c101, + 0xe06843c1, + 0x2701ff31, + 0x07182720, + 0x214d0b42, + 0x0b32074e, + 0xa13e1530, + 0x95240344, + 0x49f15834, + 0x0db103d4, + 0x06de9904, + 0xd1990e5d, + 0x44019d48, + 0x9d49d299, + 0xd3994502, + 0x46039d4a, + 0x9d4bd499, + 0x049d4808, + 0x600c0347, + 0xc1aef7f0, + 0x14c1c0a1, + 0x6c4fd668, + 0x02c99ff6, + 0xf997bea7, + 0xa5fc93fe, + 0xf041fff4, + 0x07112c27, + 0xf9707e1c, + 0xf3534007, + 0x0633fa94, + 0x400b4433, + 0x30012607, + 0x0bcc2c03, + 0x072a0b4b, + 0x232d0130, + 0x034d0501, + 0x98440324, + 0x11c211f3, + 0x03230121, + 0x15310311, + 0x31230521, + 0x4141fac4, + 0x05c40104, + 0x27c34143, + 0xf5338721, + 0x02306032, + 0x87c451ff, + 0x6042f544, + 0x07ff0230, + 0x273a0b36, + 0x2434bd41, + 0xa5f09301, + 0x0421018f, + 0x43c1f161, + 0x4c1ef168, + 0x210004ac, + 0xe0e031ed, + 0x5302cd31, + 0x01fa13f4, + 0x03890743, + 0xb8070d8c, + 0xe409b533, + 0x2b077307, + 0xe171790b, + 0x2e23ec51, + 0x27fde800, + 0xfe4d0030, + 0x073127ff, + 0x073b0793, + 0x1a9c33b8, + 0xe7f03e23, + 0x1eb533fd, + 0x27ed4105, + 0x08b1f5c0, + 0x89ff0218, + 0x2d051ae4, + 0x4c334f6b, + 0x1549ab10, + 0x05243520, + 0x27301537, + 0x0b343540, + 0xd60c0710, + 0xa4c1d8cf, + 0x3241e0b0, + 0xc0abc102, + 0x2a0b2607, + 0x012024a9, + 0x2368b3c1, + 0x2024ad41, + 0x693fd601, + 0xf141a401, + 0xf48b0507, + 0x4a0b4607, + 0x43bd3027, + 0xa2490124, + 0x12cea169, + 0x8342076e, + 0x994a0b43, + 0x3f4b1143, + 0x20c8230b, + 0xee12daf1, + 0x42073207, + 0x42533383, + 0x9d08a48d, + 0xa24d0ca3, + 0x93fb5e5e, + 0x018ecbf0, + 0x44990421, + 0x08349d62, + 0xfd7e12e4, + 0xe4283499, + 0xfd76ff4c, + 0x8eb2fe93, + 0x99e42101, + 0x349d6244, + 0xfd665e28, + 0x012824b9, + 0x079a4fc6, + 0x44c1be05, + 0x0b4607fd, + 0xbd30274a, + 0x49012443, + 0xcea169a2, + 0xabc19421, + 0x0da39dc0, + 0xb41d4127, + 0x41c0a1c1, + 0xf57a7ef0, + 0xf9210fe6, + 0xf58ef203, + 0xe606d499, + 0x07fe164f, + 0x0540273f, + 0x03f47134, + 0xf643ce34, + 0x2d07fe01, + 0xc8271027, + 0xc0082499, + 0xf90fff4c, + 0x04afec44, + 0x3b415300, + 0x05e4ab41, + 0x102499fe, + 0x11ff4cc0, + 0xafec44f9, + 0xf3110004, + 0x413b4153, + 0xf31534ab, + 0xc0282499, + 0xf911ff4c, + 0x04afec44, + 0x53f32100, + 0xab413b41, + 0x99f32534, + 0x21033024, + 0x11ff4cc0, + 0xafec44f9, + 0xf3310004, + 0x413b4153, + 0xf33534ab, + 0xfcf01403, + 0x334b07a0, + 0x404ef544, + 0x11ff0a3f, + 0x444ef5fe, + 0x21ff0a3f, + 0x4841f5f1, + 0x31ff0a3f, + 0x4c42f5f2, + 0x5eff0a3f, + 0x3a07fd7b, + 0x3489360b, + 0x2413b9c0, + 0xad410301, + 0xe4012014, + 0x27fe9731, + 0x2414bd40, + 0xc0abc101, + 0xffff0ea7, + 0xe003c5f7, + 0x27fe835e, + 0x5e8027c0, + 0x92c0fcb9, + 0x5393c023, + 0xfd53ff1e, + 0x2107f818, + 0x0907d101, + 0x7e383c27, + 0x0907f2c5, + 0x2c271b07, + 0xf2f37e38, + 0x93faa95e, + 0x018eb7fc, + 0xf9978ea7, + 0x87bea7fe, + 0xd85efef9, + 0x9dfc93fa, + 0x8ea7018e, + 0xa7fefd1f, + 0xfefb57be, + 0x53fac65e, + 0x53f7dbf0, + 0x01f7dbf1, + 0x5e1c010b, + 0xfc93fd36, + 0xa7018e8c, + 0xfef98f8e, + 0xf7c7bea7, + 0xfaa55efe, + 0x2a070807, + 0xfd38b6be, + 0xa7fa595e, + 0xf7ffff2e, + 0x4cfc2401, + 0x27f9f010, + 0x3ea718cc, + 0x41f7ffff, + 0x403cc5f0, + 0x7e0c1c27, + 0x4827f320, + 0xffffdea7, + 0x40d4c5f7, + 0x3cfcd301, + 0x1ef9cc10, + 0x51fd61de, + 0x52d4e9fe, + 0xc10004ac, + 0xe4f5c0ab, + 0xff0800ec, + 0x53fdbf5e, + 0x01f763fe, + 0x270907e1, + 0x127ed03c, + 0x070907f2, + 0xd02c271d, + 0x5ef2407e, + 0xf253fb6e, + 0x2301f758, + 0x27fd345e, + 0x9d422b44, + 0xb3890fa4, + 0x2b143b74, + 0x3131e239, + 0x5e3107f8, + 0x3ea7f82c, + 0x01f7ffff, + 0x204cd834, + 0xff2ea750, + 0x4027f7ff, + 0x993824c5, + 0xa1c10fa3, + 0xc5933bc0, + 0xa4993c29, + 0x7213890e, + 0x4f6b4103, + 0x3d834a33, + 0x43ab03ff, + 0x5ee824c5, + 0xf293f8c9, + 0x21018c68, + 0xbe0d0721, + 0x5efd3860, + 0xd107fb20, + 0xd32bd433, + 0xd433d10b, + 0x0000de23, + 0xfb165ee5, + 0xbc27c307, + 0x27f04128, + 0xcbc50d1c, + 0xf2527e40, + 0xc4c54827, + 0xdcc30140, + 0x1e97203c, + 0xa74227e9, + 0xfdcfff2e, + 0x24c5f041, + 0x161c2744, + 0x27f2337e, + 0xff3ea740, + 0x34c5fdcf, + 0x6434c544, + 0xa7f97e5e, + 0xf9885e30, + 0xd433d307, + 0xd30bd12b, + 0xb307d433, + 0x0000de23, + 0xfa635ee5, + 0xd433d407, + 0xd40bd02b, + 0xb407d433, + 0x0000de23, + 0xfa4f5ee5, + 0x1010cda3, + 0x99fadb5e, + 0xc05ebca8, + 0x034907fa, + 0x33340741, + 0x2b453337, + 0x273a0b34, + 0x2434bd41, + 0x7ef04101, + 0xa499f1fa, + 0xdf2ea7be, + 0x4487fde5, + 0xe4284e23, + 0x152405fe, + 0x1627352c, + 0xc0abc185, + 0x07fb015e, + 0x7e19070a, + 0xabc1f205, + 0xfaf45ec0, + 0x312bc421, + 0x2015340b, + 0xb65e2305, + 0xff1ea7fb, + 0x1499feff, + 0x87438309, + 0x2b443324, + 0x5043f942, + 0xc0ff0000, + 0xb1072532, + 0x88100e27, + 0xf0357e13, + 0x1ff6c101, + 0xb499f84d, + 0x87438309, + 0x2b443324, + 0x5043f942, + 0xc4ff0000, + 0xf161df32, + 0xac4a14e9, + 0x14870004, + 0x2a5e11a3, + 0x5e2027f8, + 0x4907f6e4, + 0x423b3347, + 0x2b10ae9d, + 0x0fae9d34, + 0x31073102, + 0x21032007, + 0x13270127, + 0x2bf6a95e, + 0x05410343, + 0x5e011504, + 0x0000f61a, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0xd007fc4e, + 0x071adc53, + 0x07e153ed, + 0x93420b4e, + 0x018a9ff3, + 0x34194219, + 0x20f9c007, + 0x0004afec, + 0xed074210, + 0x30071401, + 0x331f3c83, + 0x4ca3103c, + 0x1fec8320, + 0xeb3343ab, + 0xffff3ea7, + 0x334eabf7, + 0xab34a508, + 0x8e3cb502, + 0x93fe4efc, + 0x018a63f4, + 0xe1074319, + 0x141aec53, + 0x33e15332, + 0x202ca308, + 0x00000e83, + 0x1fec831f, + 0xeb3320ab, + 0xffff4ea7, + 0xa5e2abf7, + 0x8e41b54e, + 0x000000fe, + 0x0004afd4, + 0xfb63f54e, + 0xd803df07, + 0xc0071d07, + 0xfff3d4be, + 0xf393c403, + 0x05018a14, + 0x11f5933c, + 0xcc03018a, + 0x235c0520, + 0xc39924cc, + 0x05f49348, + 0x431d018a, + 0xc489f921, + 0x52c28950, + 0xffff3ea7, + 0x3834c5f7, + 0x1c331907, + 0x3c32c510, + 0xffff4ea7, + 0x83a207fe, + 0xec49d5a1, + 0x1e1c531d, + 0xd618ac33, + 0x03cd0719, + 0xa78027c4, + 0xf7ffff3e, + 0x42f83401, + 0x4907040f, + 0x53154c33, + 0x44c01d4c, + 0x1945d02a, + 0x010e46e0, + 0xe07546d0, + 0x1e021947, + 0xc0f83111, + 0xcd070e12, + 0xd01ec803, + 0x42d44f26, + 0x07ff1e55, + 0x14cc03cf, + 0x8907c21e, + 0x8183ba07, + 0x0000bfa3, + 0x8fe62000, + 0xd90703bd, + 0xd283c001, + 0xd546fb05, + 0x0400afa3, + 0xfa052000, + 0x8962f493, + 0x07420101, + 0x7ec4031f, + 0xd826feb0, + 0x41a34b07, + 0xf405c001, + 0xbda38506, + 0xfb050401, + 0x1f075201, + 0x1efe977e, + 0xbe0a0707, + 0x43ffee08, + 0xf8f58efb, + 0x03a2209c, + 0xdfa3da07, + 0x30000000, + 0xa183a907, + 0x036aafe6, + 0xc001b907, + 0xfd05b283, + 0x4d07b546, + 0x04004da3, + 0xf393f405, + 0x01018908, + 0x031f0732, + 0xfe567ec4, + 0x4d07b7a6, + 0xc00141a3, + 0xa546f405, + 0x4da34d07, + 0xf4050401, + 0x1f075201, + 0x397ec403, + 0x534907fe, + 0x07a40742, + 0x83a183b4, + 0x01a7c6b2, + 0x46fd05c0, + 0xa34d07b5, + 0x0504004d, + 0xc1f493f4, + 0x42010188, + 0xc4031f07, + 0xe6fe0f7e, + 0x07ff7ebf, + 0x0141a34d, + 0xe6f405c0, + 0xa3ff63af, + 0x050401dd, + 0xff5a5efd, + 0xd907b907, + 0xd283b183, + 0xc001b7c6, + 0xd546fa05, + 0x4da34a07, + 0xf4050400, + 0x8882f393, + 0x07320101, + 0x7ec4031f, + 0xd7a6fdd0, + 0x41a34a07, + 0xf405c001, + 0x4a07b546, + 0x04014da3, + 0x5201f405, + 0xc4031f07, + 0x07fdb37e, + 0x07d253d9, + 0x83bd079d, + 0xc6b28391, + 0x05c00197, + 0x07b546fa, + 0x004da34a, + 0x93f40504, + 0x01883bf4, + 0x1f074201, + 0x897ec403, + 0x07b7a6fd, + 0x0141a34a, + 0x46f405c0, + 0xa34a0795, + 0x0504014d, + 0x075201f4, + 0x7ec4031f, + 0xd253fd6c, + 0xbd079d07, + 0xb2839183, + 0xc00197c6, + 0xb546fa05, + 0x4da34a07, + 0xf4050400, + 0x87f6f393, + 0x07320101, + 0x7ec4031f, + 0xb7a6fd44, + 0x41a34a07, + 0xf405c001, + 0x4a079546, + 0x04014da3, + 0x5201f405, + 0xc4031f07, + 0x07fd277e, + 0x0742534d, + 0x83d407b4, + 0xc6d283b1, + 0x05c001b7, + 0x07d546fa, + 0x004da34a, + 0x93f40504, + 0x0187aff4, + 0x1f074201, + 0xfd7ec403, + 0x6cdfe6fc, + 0xa34a07fe, + 0x05c00141, + 0x51bfe6f4, + 0x01ada3fe, + 0x5efa0504, + 0x3a07fe48, + 0x00003fa3, + 0xf3c51800, + 0x074a0790, + 0x014fa33a, + 0xa3180004, + 0x0004003f, + 0x94f4c518, + 0x0798f3c5, + 0xa33a074a, + 0x0000004f, + 0x013fa310, + 0xc5100004, + 0xf3c59cf4, + 0x074a07a0, + 0x004fa33a, + 0xa3100004, + 0x0000003f, + 0xa4f4c508, + 0x07a8f3c5, + 0xa33a074a, + 0x0004014f, + 0x003fa308, + 0x27080004, + 0xacf4c560, + 0x07b0f3c5, + 0x8e6ff698, + 0x53490700, + 0xf6438348, + 0x07b9074c, + 0x83b183d9, + 0x01b7c6d2, + 0x46fa05c0, + 0xa34a07d5, + 0x0504004d, + 0xfdf393f4, + 0x32010186, + 0xc4031f07, + 0x46fc4b7e, + 0xa34a07de, + 0x05c00141, + 0x07b546f4, + 0x014da34a, + 0x01f40504, + 0x031f0752, + 0xfc2e7ec4, + 0x41e0341e, + 0x42e000ad, + 0xd90701ae, + 0xd183b907, + 0xdf56b283, + 0xd67f7c27, + 0x8c2774bf, + 0x86dff67f, + 0x71bff601, + 0x5cdff601, + 0x47bff601, + 0x35dff601, + 0xcbbff601, + 0xe0610300, + 0x53fd6664, + 0x766fe692, + 0xff3ea7ff, + 0x3401f7ff, + 0xff6b42fc, + 0xf453d307, + 0x4001fc58, + 0xd4c54a27, + 0xbe1b2740, + 0x27ffec9c, + 0x40d4c548, + 0x32fcd301, + 0xe31eff4d, + 0x0190f4c1, + 0xe6f405c0, + 0x98f3c1b4, + 0xf493f305, + 0x01018658, + 0x7e1f0742, + 0x7007fba8, + 0xbfc6c403, + 0x90f4c18e, + 0x41a3c001, + 0xd4e6f415, + 0x1594f3c1, + 0x075201f3, + 0x7e14031f, + 0x8007fb88, + 0xdfe6c403, + 0xf65eff75, + 0x07b90700, + 0x83b183d9, + 0xc1be66d2, + 0xc001a8f4, + 0xd4e6f405, + 0x05b0f3c1, + 0x09f493f3, + 0x42010186, + 0x597e1f07, + 0x037007fb, + 0xc1db26c4, + 0xc001a8f4, + 0xf41541a3, + 0xf3c1b4e6, + 0x01f315ac, + 0x031f0752, + 0xfb3a7e14, + 0xc4038007, + 0xdfe6bf76, + 0xc101ff39, + 0x0807f211, + 0x6e7ec403, + 0xff2b5efb, + 0xd67f7c27, + 0x8c27cadf, + 0x1eb0a67f, + 0x83d9073b, + 0xfc605ed2, + 0xb283b907, + 0x07fcb35e, + 0x55fb93d3, + 0x4a270189, + 0x0740d4c5, + 0xbe1b270b, + 0x27ffebc0, + 0x40d4c548, + 0x32fcd301, + 0xe71efbd6, + 0xdfa3da07, + 0x28000000, + 0x01fc5f5e, + 0x07f201c1, + 0x7ec40307, + 0xdfe6fb19, + 0x9b1efed5, + 0xf201c101, + 0xc4030707, + 0x5efb087e, + 0xc101fec1, + 0x0807f211, + 0xfa7ec403, + 0xb2dfe6fa, + 0x01e21efe, + 0x07f201c1, + 0x7ec40307, + 0xbfe6fae9, + 0xdf1efe9d, + 0xf211c101, + 0xc4030807, + 0xe6fad87e, + 0x1efe88df, + 0x01c101df, + 0x030707f2, + 0xfac77ec4, + 0xfe73bfe6, + 0xb907df1e, + 0xb183d907, + 0xbcd6d283, + 0x967f7c27, + 0x7f8c27d8, + 0xc101b5a6, + 0x0707f211, + 0xa27ec403, + 0x5edfe6fa, + 0x01c101fe, + 0x030807f2, + 0xfa937ec4, + 0xc1fe505e, + 0xc0019cf4, + 0xf40541a3, + 0xf3c1b4e6, + 0x01f305a0, + 0x7e1f0752, + 0x8007fa30, + 0xc51ec403, + 0x019cf4c1, + 0xe6f415c0, + 0xa4f3c1d4, + 0xf493f315, + 0x010184c0, + 0x031f0742, + 0xfa0e7e14, + 0xc4037007, + 0x00009e1e, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0xe007fc4e, + 0x0b1aec53, + 0xe1f4932e, + 0x2c19016e, + 0xd0074301, + 0xafecc0f9, + 0x32c00004, + 0x83120138, + 0x4d071fec, + 0xeb333007, + 0x3320eca3, + 0x1f3c8346, + 0x3c33e2ab, + 0xab477310, + 0xffdd83e3, + 0xff3ea73f, + 0x4f83f7ff, + 0x03ffc000, + 0x4dab0833, + 0x0cab3ea5, + 0xfc8e34b5, + 0x01c31201, + 0x01002da3, + 0xc01e1205, + 0x4107fe4e, + 0xe1070833, + 0x83202ca3, + 0x1f00000e, + 0x1c534633, + 0x7320ab0f, + 0x001d8347, + 0xff3ea7f8, + 0xed83f7ff, + 0x21ab3fff, + 0xc0004f83, + 0x4eab03ff, + 0x34b532a5, + 0x0000fe8e, + 0x0004afd4, + 0xfb63f54e, + 0xd803df07, + 0xc0071d07, + 0xffd3b8be, + 0xf393c403, + 0x050169f8, + 0xf5f5933c, + 0xcc030169, + 0x235c0520, + 0xc39924cc, + 0xe9f49348, + 0x431d0169, + 0xc289f921, + 0x50c48952, + 0xffff3ea7, + 0x3834c5f7, + 0xa2071907, + 0x83101c33, + 0x3c32c5a1, + 0xffff4ea7, + 0x18ac33fe, + 0x1dec49d5, + 0xa31e1c53, + 0x19d680ac, + 0xc403cd07, + 0x3ea78027, + 0x01f7ffff, + 0x0f42f834, + 0x33490704, + 0x4c53154c, + 0x2a44c01d, + 0xe01945d0, + 0xd0010e46, + 0x47e07546, + 0x111e0219, + 0x12c0f831, + 0x03cd070e, + 0x26d01ec8, + 0x5542d44f, + 0xcf07ff1e, + 0x1e14cc03, + 0x078907c2, + 0xa38183ba, + 0x000000bf, + 0xbd8fe620, + 0x01d90703, + 0x05d283c0, + 0xa3d546fb, + 0x000400af, + 0x93fa0520, + 0x016943f4, + 0x1f074201, + 0x917ec403, + 0x07d826fe, + 0x0141a34b, + 0x06f405c0, + 0x01bda385, + 0x01fb0504, + 0x7e1f0752, + 0x071efe78, + 0xe9be0a07, + 0xfb43ffcd, + 0x9cf8f58e, + 0x0703a220, + 0x00dfa3da, + 0x07300000, + 0xe6a183a9, + 0x07036aaf, + 0x83c001b9, + 0x46fd05b2, + 0xa34d07b5, + 0x0504004d, + 0xe9f393f4, + 0x32010168, + 0xc4031f07, + 0xa6fe377e, + 0xa34d07b7, + 0x05c00141, + 0x07a546f4, + 0x014da34d, + 0x01f40504, + 0x031f0752, + 0xfe1a7ec4, + 0x42534907, + 0xb407a407, + 0xb283a183, + 0xc001a7c6, + 0xb546fd05, + 0x4da34d07, + 0xf4050400, + 0x68a2f493, + 0x07420101, + 0x7ec4031f, + 0xbfe6fdf0, + 0x4d07ff7e, + 0xc00141a3, + 0xafe6f405, + 0xdda3ff63, + 0xfd050401, + 0x07ff5a5e, + 0x83d907b9, + 0xc6d283b1, + 0x05c001b7, + 0x07d546fa, + 0x004da34a, + 0x93f40504, + 0x016863f3, + 0x1f073201, + 0xb17ec403, + 0x07d7a6fd, + 0x0141a34a, + 0x46f405c0, + 0xa34a07b5, + 0x0504014d, + 0x075201f4, + 0x7ec4031f, + 0xd907fd94, + 0x9d07d253, + 0x9183bd07, + 0x97c6b283, + 0xfa05c001, + 0x4a07b546, + 0x04004da3, + 0xf493f405, + 0x0101681c, + 0x031f0742, + 0xfd6a7ec4, + 0x4a07b7a6, + 0xc00141a3, + 0x9546f405, + 0x4da34a07, + 0xf4050401, + 0x1f075201, + 0x4d7ec403, + 0x07d253fd, + 0x83bd079d, + 0xc6b28391, + 0x05c00197, + 0x07b546fa, + 0x004da34a, + 0x93f40504, + 0x0167d7f3, + 0x1f073201, + 0x257ec403, + 0x07b7a6fd, + 0x0141a34a, + 0x46f405c0, + 0xa34a0795, + 0x0504014d, + 0x075201f4, + 0x7ec4031f, + 0x4d07fd08, + 0xb4074253, + 0xb183d407, + 0xb7c6d283, + 0xfa05c001, + 0x4a07d546, + 0x04004da3, + 0xf493f405, + 0x01016790, + 0x031f0742, + 0xfcde7ec4, + 0xfe6cdfe6, + 0x41a34a07, + 0xf405c001, + 0xfe51bfe6, + 0x0401ada3, + 0x485efa05, + 0xa33a07fe, + 0x0000003f, + 0x90f3c518, + 0x3a074a07, + 0x04014fa3, + 0x3fa31800, + 0x18000400, + 0xc594f4c5, + 0x4a0798f3, + 0x4fa33a07, + 0x10000000, + 0x04013fa3, + 0xf4c51000, + 0xa0f3c59c, + 0x3a074a07, + 0x04004fa3, + 0x3fa31000, + 0x08000000, + 0xc5a4f4c5, + 0x4a07a8f3, + 0x4fa33a07, + 0x08000401, + 0x04003fa3, + 0x60270800, + 0xc5acf4c5, + 0x9807b0f3, + 0x008e6ff6, + 0x48534907, + 0x4cf64383, + 0xd907b907, + 0xd283b183, + 0xc001b7c6, + 0xd546fa05, + 0x4da34a07, + 0xf4050400, + 0x66def393, + 0x07320101, + 0x7ec4031f, + 0xde46fc2c, + 0x41a34a07, + 0xf405c001, + 0x4a07b546, + 0x04014da3, + 0x5201f405, + 0xc4031f07, + 0x1efc0f7e, + 0xad41e034, + 0xae42e000, + 0x07d90701, + 0x83d183b9, + 0x27df56b2, + 0xbfd67f7c, + 0x7f8c2774, + 0x0186dff6, + 0x0171bff6, + 0x015cdff6, + 0x0147bff6, + 0x0135dff6, + 0x00cbbff6, + 0x64e06103, + 0x9253fd66, + 0xff766fe6, + 0xffff3ea7, + 0xfc3401f7, + 0x07ff6b42, + 0x55f453d3, + 0x274001fc, + 0x40d4c54a, + 0x7dbe1b27, + 0x4827ffcc, + 0x0140d4c5, + 0x4d32fcd3, + 0xc1e31eff, + 0xc00190f4, + 0xb4e6f405, + 0x0598f3c1, + 0x39f493f3, + 0x42010166, + 0x897e1f07, + 0x037007fb, + 0x8ebfc6c4, + 0x0190f4c1, + 0x1541a3c0, + 0xc1d4e6f4, + 0xf31594f3, + 0x1f075201, + 0x697e1403, + 0x038007fb, + 0x75dfe6c4, + 0x00f65eff, + 0xd907b907, + 0xd283b183, + 0xf4c1be66, + 0x05c001a8, + 0xc1d4e6f4, + 0xf305b0f3, + 0x65eaf493, + 0x07420101, + 0xfb3a7e1f, + 0xc4037007, + 0xf4c1db26, + 0xa3c001a8, + 0xe6f41541, + 0xacf3c1b4, + 0x5201f315, + 0x14031f07, + 0x07fb1b7e, + 0x76c40380, + 0x39dfe6bf, + 0x11c101ff, + 0x030807f2, + 0xfb667ec4, + 0x27ff2b5e, + 0xdfd67f7c, + 0x7f8c27ca, + 0x3b1eb0a6, + 0xd283d907, + 0x07fc605e, + 0x5eb283b9, + 0xd307fcb3, + 0x6936fb93, + 0xc54a2701, + 0x0b0740d4, + 0xa1be1b27, + 0x4827ffcb, + 0x0140d4c5, + 0xd632fcd3, + 0x07e71efb, + 0x00dfa3da, + 0x5e280000, + 0xc101fc5f, + 0x0707f201, + 0x117ec403, + 0xd5dfe6fb, + 0x019b1efe, + 0x07f201c1, + 0x7ec40307, + 0xc15efb00, + 0x11c101fe, + 0x030807f2, + 0xfaf27ec4, + 0xfeb2dfe6, + 0xc101e21e, + 0x0707f201, + 0xe17ec403, + 0x9dbfe6fa, + 0x01df1efe, + 0x07f211c1, + 0x7ec40308, + 0xdfe6fad0, + 0xdf1efe88, + 0xf201c101, + 0xc4030707, + 0xe6fabf7e, + 0x1efe73bf, + 0x07b907df, + 0x83b183d9, + 0x27bcd6d2, + 0xd8967f7c, + 0xa67f8c27, + 0x11c101b5, + 0x030707f2, + 0xfa9a7ec4, + 0xfe5edfe6, + 0xf201c101, + 0xc4030807, + 0x5efa8b7e, + 0xf4c1fe50, + 0xa3c0019c, + 0xe6f40541, + 0xa0f3c1b4, + 0x5201f305, + 0x117e1f07, + 0x038007fa, + 0xc1c51ec4, + 0xc0019cf4, + 0xd4e6f415, + 0x15a4f3c1, + 0xa1f493f3, + 0x42010164, + 0x14031f07, + 0x07f9ef7e, + 0x1ec40370, + 0x0000009e, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0xb007fa4e, + 0x011abc53, + 0x53eb0711, + 0x07d107e1, + 0x33420b4e, + 0x200718dc, + 0xdc532633, + 0x73c0071f, + 0x4a19142c, + 0x4107df66, + 0x07174c33, + 0x5331833b, + 0x43cb1f4c, + 0xa0f9a4cb, + 0x0004afec, + 0x01e32d7b, + 0xf49303ab, + 0x19014a6c, + 0x07321043, + 0x834007eb, + 0x4c331f4c, + 0x201ca310, + 0xab1fec83, + 0x33eb3314, + 0x4ea70e2c, + 0xabf7ffff, + 0xffcd831e, + 0x002f833f, + 0x3303ffc0, + 0xa52cab08, + 0xb50aab41, + 0xf9fa8e42, + 0x04afeca0, + 0x4ebc1e00, + 0x25f493fe, + 0x4319014a, + 0xec53e107, + 0x5332141a, + 0x074107e1, + 0x33463332, + 0x3c53183c, + 0x144c731f, + 0x437b0833, + 0x83202ca3, + 0x1f00000e, + 0xab1fec83, + 0x0e4c3320, + 0x3ea7eb33, + 0xabf7ffff, + 0x004f83e2, + 0x8303ffc0, + 0xab3fff1d, + 0xb53ea541, + 0x00fe8e34, + 0x0004afd4, + 0xfb63f54e, + 0xd803df07, + 0xc0071d07, + 0xffb378be, + 0xf393c403, + 0x050149b8, + 0xb5f5933c, + 0xcc030149, + 0x235c0520, + 0xc39924cc, + 0x93f92148, + 0x0149a7f4, + 0xc289431d, + 0x33390752, + 0x4ea7143c, + 0x07feffff, + 0x101c3319, + 0x49d50207, + 0x3c531dec, + 0x1e1c531f, + 0x8350ce89, + 0x07356601, + 0xa3383330, + 0x2153803c, + 0xffff4ea7, + 0x384ec5f7, + 0xbc33b007, + 0x3c42c518, + 0x19d6b3ab, + 0xc403cd07, + 0x3ea78027, + 0x01f7ffff, + 0x0f42f834, + 0x33490704, + 0x4c53154c, + 0x2a44c01d, + 0xe01945d0, + 0xd0010e46, + 0x47e07546, + 0x111e0219, + 0x12c0f831, + 0x03cd070e, + 0x26d01ec8, + 0x5542d44f, + 0xcf07ff1e, + 0x1e14cc03, + 0x078907c2, + 0xa38183ab, + 0x000000af, + 0xbd8fe620, + 0x01d90703, + 0x05d283c0, + 0xa3d546fa, + 0x000400bf, + 0x93fb0520, + 0x0148eff4, + 0x1f074201, + 0x3d7ec403, + 0x07d826fe, + 0x0141a34a, + 0x06f405c0, + 0x01ada385, + 0x01fa0504, + 0x7e1f0752, + 0x071efe24, + 0x95be0b07, + 0xfb43ffad, + 0x9cf8f58e, + 0x0703a220, + 0x00dfa3db, + 0x07300000, + 0xe6a183a9, + 0x07036aaf, + 0x83c001b9, + 0x46fd05b2, + 0xa34d07b5, + 0x0504004d, + 0x95f393f4, + 0x32010148, + 0xc4031f07, + 0xa6fde37e, + 0xa34d07b7, + 0x05c00141, + 0x07a546f4, + 0x014da34d, + 0x01f40504, + 0x031f0752, + 0xfdc67ec4, + 0x42534907, + 0xb407a407, + 0xb283a183, + 0xc001a7c6, + 0xb546fd05, + 0x4da34d07, + 0xf4050400, + 0x484ef493, + 0x07420101, + 0x7ec4031f, + 0xbfe6fd9c, + 0x4d07ff7e, + 0xc00141a3, + 0xafe6f405, + 0xdda3ff63, + 0xfd050401, + 0x07ff5a5e, + 0x83d907a9, + 0xc6d283a1, + 0x05c001a7, + 0x07d546fb, + 0x004da34b, + 0x93f40504, + 0x01480ff3, + 0x1f073201, + 0x5d7ec403, + 0x07d7a6fd, + 0x0141a34b, + 0x46f405c0, + 0xa34b07a5, + 0x0504014d, + 0x075201f4, + 0x7ec4031f, + 0xd907fd40, + 0x9d07d253, + 0x9183ad07, + 0x97c6a283, + 0xfb05c001, + 0x4b07a546, + 0x04004da3, + 0xf493f405, + 0x010147c8, + 0x031f0742, + 0xfd167ec4, + 0x4b07a7a6, + 0xc00141a3, + 0x9546f405, + 0x4da34b07, + 0xf4050401, + 0x1f075201, + 0xf97ec403, + 0x07d253fc, + 0x83ad079d, + 0xc6a28391, + 0x05c00197, + 0x07a546fb, + 0x004da34b, + 0x93f40504, + 0x014783f3, + 0x1f073201, + 0xd17ec403, + 0x07a7a6fc, + 0x0141a34b, + 0x46f405c0, + 0xa34b0795, + 0x0504014d, + 0x075201f4, + 0x7ec4031f, + 0x4d07fcb4, + 0xa4074253, + 0xa183d407, + 0xa7c6d283, + 0xfb05c001, + 0x4b07d546, + 0x04004da3, + 0xf493f405, + 0x0101473c, + 0x031f0742, + 0xfc8a7ec4, + 0xfe6cdfe6, + 0x41a34b07, + 0xf405c001, + 0xfe51afe6, + 0x0401bda3, + 0x485efb05, + 0xa33b07fe, + 0x0000003f, + 0x90f3c518, + 0x3b074b07, + 0x04014fa3, + 0x3fa31800, + 0x18000400, + 0xc594f4c5, + 0x4b0798f3, + 0x4fa33b07, + 0x10000000, + 0x04013fa3, + 0xf4c51000, + 0xa0f3c59c, + 0x3b074b07, + 0x04004fa3, + 0x3fa31000, + 0x08000000, + 0xc5a4f4c5, + 0x4b07a8f3, + 0x4fa33b07, + 0x08000401, + 0x04003fa3, + 0x60270800, + 0xc5acf4c5, + 0x9807b0f3, + 0x008e6ff6, + 0x48534907, + 0x4cf64383, + 0xd907a907, + 0xd283a183, + 0xc001a7c6, + 0xd546fb05, + 0x4da34b07, + 0xf4050400, + 0x468af393, + 0x07320101, + 0x7ec4031f, + 0xde46fbd8, + 0x41a34b07, + 0xf405c001, + 0x4b07a546, + 0x04014da3, + 0x5201f405, + 0xc4031f07, + 0x1efbbb7e, + 0xad41e034, + 0xae42e000, + 0x07d90701, + 0x83d183a9, + 0x27df56a2, + 0xafd67f7c, + 0x7f8c2774, + 0x0186dff6, + 0x0171aff6, + 0x015cdff6, + 0x0147aff6, + 0x0135dff6, + 0x00cbaff6, + 0x64e06103, + 0x9253fd66, + 0xff766fe6, + 0xffff3ea7, + 0xfc3401f7, + 0x07ff6b42, + 0x41f453d3, + 0x274001fc, + 0x40d4c54a, + 0x29be1b27, + 0x4827ffac, + 0x0140d4c5, + 0x4d32fcd3, + 0xc1e31eff, + 0xc00190f4, + 0xa4e6f405, + 0x0598f3c1, + 0xe5f493f3, + 0x42010145, + 0x357e1f07, + 0x037007fb, + 0x8eafc6c4, + 0x0190f4c1, + 0x1541a3c0, + 0xc1d4e6f4, + 0xf31594f3, + 0x1f075201, + 0x157e1403, + 0x038007fb, + 0x75dfe6c4, + 0x00f65eff, + 0xd907a907, + 0xd283a183, + 0xf4c1ae66, + 0x05c001a8, + 0xc1d4e6f4, + 0xf305b0f3, + 0x4596f493, + 0x07420101, + 0xfae67e1f, + 0xc4037007, + 0xf4c1db26, + 0xa3c001a8, + 0xe6f41541, + 0xacf3c1a4, + 0x5201f315, + 0x14031f07, + 0x07fac77e, + 0x76c40380, + 0x39dfe6af, + 0x11c101ff, + 0x030807f2, + 0xfb397ec4, + 0x27ff2b5e, + 0xdfd67f7c, + 0x7f8c27ca, + 0x3b1ea0a6, + 0xd283d907, + 0x07fc605e, + 0x5eb283b9, + 0xd307fcb3, + 0x48e2fa93, + 0xc54a2701, + 0x0a0740d4, + 0x4dbe1b27, + 0x4827ffab, + 0x0140d4c5, + 0xd632fcd3, + 0x07e71efb, + 0x00dfa3db, + 0x5e280000, + 0xc101fc5f, + 0x0707f201, + 0xe47ec403, + 0xd5dfe6fa, + 0x019b1efe, + 0x07f201c1, + 0x7ec40307, + 0xc15efad3, + 0x11c101fe, + 0x030807f2, + 0xfac57ec4, + 0xfeb2dfe6, + 0xc101e21e, + 0x0707f201, + 0xb47ec403, + 0x9dafe6fa, + 0x01df1efe, + 0x07f211c1, + 0x7ec40308, + 0xdfe6faa3, + 0xdf1efe88, + 0xf201c101, + 0xc4030707, + 0xe6fa927e, + 0x1efe73af, + 0x07a907df, + 0x83a183d9, + 0x27acd6d2, + 0xd8967f7c, + 0xa67f8c27, + 0x11c101a5, + 0x030707f2, + 0xfa6d7ec4, + 0xfe5edfe6, + 0xf201c101, + 0xc4030807, + 0x5efa5e7e, + 0xf4c1fe50, + 0xa3c0019c, + 0xe6f40541, + 0xa0f3c1a4, + 0x5201f305, + 0xbd7e1f07, + 0x038007f9, + 0xc1c51ec4, + 0xc0019cf4, + 0xd4e6f415, + 0x15a4f3c1, + 0x4df493f3, + 0x42010144, + 0x14031f07, + 0x07f99b7e, + 0x1ec40370, + 0x0000009e, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x071e03dc, + 0xab483341, + 0x07140741, + 0x101c3332, + 0x14ab3253, + 0x071e3103, + 0x24230105, + 0xf3b80403, + 0x011d2506, + 0xf2c80103, + 0x0000fe0b, + 0xf652f393, + 0x44340100, + 0x03ca864f, + 0xfff45300, + 0x0b340501, + 0x3a4fc4fe, + 0x130003ca, + 0x023cf453, + 0x30273405, + 0xb8def493, + 0x06439d01, + 0xff1efe0b, + 0xa7233f9b, + 0xffffff2e, + 0x0cac24d1, + 0x1027432e, + 0x23d5071e, + 0x11270cac, + 0xf616f493, + 0x4843c100, + 0x04003d14, + 0x04003d27, + 0xffff2ea7, + 0xb024d1ff, + 0xd5342e0c, + 0x270cb023, + 0x4400c111, + 0x062424d1, + 0x20d5042e, + 0x031e0624, + 0x0ea715e6, + 0x39fffb43, + 0x9e44c604, + 0x0bfde218, + 0xbefe4efe, + 0x93fd5f72, + 0x01b873f4, + 0x24544499, + 0xfe0e204c, + 0xfd10389e, + 0x0f9efe0e, + 0xfe4efd12, + 0xb85af493, + 0x54449901, + 0xbe204c24, + 0x1efd101f, + 0x11fabe05, + 0x9efe0efd, + 0x4efd5f50, + 0x9d4127fe, + 0xdb3e0604, + 0xfe8e0427, + 0xf587f493, + 0x27421900, + 0xff4ea731, + 0x439dfeff, + 0x9326a60b, + 0x01b81ff4, + 0x04544499, + 0xe89e204c, + 0xe99efd0f, + 0xfe0b001c, + 0xf493fc4e, + 0x1900f55d, + 0xff3ea744, + 0x3199ffff, + 0x26329927, + 0x34d145c6, + 0x47560634, + 0x063834d1, + 0x34994696, + 0x4e45e610, + 0xff4ea721, + 0x44d1feff, + 0x44860148, + 0xdea7a33e, + 0xa7fff9cf, + 0xfd4fffce, + 0xc301d419, + 0x41dc437b, + 0xcd4ea70f, + 0x4419fff9, + 0x437bc301, + 0xbe2e41d8, + 0x19fd86b0, + 0x7bc301d4, + 0x1741d843, + 0x2127d319, + 0x1207c401, + 0x31eb143b, + 0x4ea7d31d, + 0xc5fdcfff, + 0x05466442, + 0xf49b4027, + 0x38c4c50e, + 0x4ea73127, + 0xc5fdcfff, + 0xfc8e6043, + 0xf4933127, + 0x9d01b778, + 0x3d5e6443, + 0xa7fc4eff, + 0xffffff4e, + 0xc6274d99, + 0x1e0027d4, + 0x9cb2be05, + 0xaef493fc, + 0x441900f4, + 0xcea747c6, + 0x19fff5ef, + 0xce4f4bc4, + 0x20070b4d, + 0x0c071d07, + 0xfc9d79be, + 0x4f4bc419, + 0x0027423c, + 0xfc93fc8e, + 0xa700f480, + 0xfeffffde, + 0xf08bc001, + 0xd4990536, + 0x1e47760b, + 0x1504c8f4, + 0xfc9e3bbe, + 0xffff4ea7, + 0x0b4499fe, + 0x45160127, + 0x031e0027, + 0x30270127, + 0xffff4ea7, + 0x0b439dfe, + 0xfb4efc8e, + 0xb6f2fc93, + 0x9db02701, + 0x4fbe65cb, + 0xd0070008, + 0x0d7e0c07, + 0x2ad4ccfe, + 0xffff4ea7, + 0xb84bbdfe, + 0x7ed4f61f, + 0x1f1efdcc, + 0x1e1cd1c4, + 0xbe0d070e, + 0x07fc9de8, + 0x5efb0e0c, + 0xb57efe7b, + 0x1ed027fd, + 0x05c49906, + 0x0d074136, + 0xfc4efb8e, + 0xb6a6f493, + 0x99302701, + 0x439d5442, + 0x202c2465, + 0xfd0e4bbe, + 0x4bbe051e, + 0xd007001b, + 0x271804cc, + 0xff4ea730, + 0x43bdfeff, + 0x03441fb8, + 0x27fd777e, + 0xc4461ed0, + 0xf0934302, + 0x0701b670, + 0xfd967ec0, + 0xd605c499, + 0xff4ea748, + 0x4411feff, + 0xffff3ea7, + 0x2433d1ff, + 0xf5448706, + 0x000d1843, + 0xa73127ff, + 0xfdcfff4e, + 0x1e6843c5, + 0x07d42810, + 0x9d5ebe0d, + 0x0e0c07fc, + 0xfdf15efc, + 0xfc8e0d07, + 0xffff4ea7, + 0x094499fe, + 0x43832027, + 0x44333487, + 0x43f9432b, + 0xff00004d, + 0x131e3103, + 0x0a0824f9, + 0x4f4bff00, + 0x142e408b, + 0xfe0b0027, + 0xf3582103, + 0xfe0b0127, + 0x4ea7fc4e, + 0x01fd7fff, + 0x58c0074d, + 0x070027d8, + 0xa01cbe1c, + 0x00ded8fc, + 0x93260400, + 0x00f330f4, + 0x31274219, + 0xf326f493, + 0xa6431d00, + 0xa7302726, + 0xfd4fff4e, + 0x43b50027, + 0xfd51f7be, + 0xfffe3fbe, + 0x0000ded8, + 0x31273f80, + 0xf302f493, + 0xa7431d00, + 0xfd4fff4e, + 0x4ea74301, + 0x87ffffff, + 0x1142b933, + 0xf540270a, + 0x02b04034, + 0x9326e6ff, + 0x00f2e0f4, + 0x45064419, + 0xfca1eabe, + 0x45be051e, + 0xff1efc9b, + 0xfffd6bbe, + 0x0000ded8, + 0xf4931702, + 0x1900f2c1, + 0x2745e644, + 0xb5f49331, + 0x431d00f2, + 0x0010e0be, + 0x1b10dcd8, + 0x4ea73127, + 0x07fdafff, + 0xbe43550c, + 0x27fce596, + 0xc4f19309, + 0x9b9efd98, + 0x4ea7fd58, + 0xd1ffffff, + 0xa60a1442, + 0xff3ea725, + 0x3441fdaf, + 0x3405420b, + 0xf54efc8e, + 0xffff5ea7, + 0x6ef993ff, + 0xf69300f2, + 0xa701b514, + 0xfeffffbe, + 0xcfffaea7, + 0xef7ea7fd, + 0x53d1fff5, + 0x35a60a14, + 0xafff2ea7, + 0x0b2441fd, + 0x99240543, + 0x47161054, + 0xffeb0ea7, + 0x59b4beff, + 0x9e2cbefd, + 0xeb0ea7fc, + 0x84beffff, + 0x9419fd59, + 0xc02744d6, + 0x68be171e, + 0x40270002, + 0x2764649d, + 0x270496c1, + 0x2704e6c0, + 0x65649d41, + 0x1ffdb4b9, + 0x532f4cd8, + 0x0cbe0027, + 0xb4b9fc9f, + 0xd0070140, + 0x0c5845a6, + 0x83045330, + 0xd3e4be01, + 0x832d07fc, + 0x2676102c, + 0x4c834d07, + 0x274cab25, + 0x27448600, + 0x6bc00701, + 0x833d07cf, + 0x3556303c, + 0x1ffdb4b9, + 0x130f4cd8, + 0x1ffdbdbd, + 0x24e635c6, + 0xa4c54127, + 0xc5412764, + 0xb2b960a4, + 0x2cd81ffd, + 0xb4992f30, + 0x87438309, + 0x2b443334, + 0x5044f943, + 0xa6ff0000, + 0x48b4d147, + 0xc5412401, + 0x111e64a4, + 0x42544223, + 0xe6265499, + 0xfc01c84f, + 0x01c3202c, + 0x1ffdb4b9, + 0x1d104cd8, + 0x46469419, + 0xfffcacbe, + 0x40270cab, + 0x41270486, + 0xcf6bc407, + 0xfc98d5be, + 0x019f0ff6, + 0xc5b6b811, + 0xf152f393, + 0x27341900, + 0x27448631, + 0x07941930, + 0x66df6bd3, + 0x6564994c, + 0x45a67c19, + 0x96056499, + 0x992ebe45, + 0x2704d6fc, + 0x27031e41, + 0x64619940, + 0xf610c2d8, + 0x04649945, + 0x43183027, + 0x23073127, + 0x2127031e, + 0x41c34107, + 0x30274d8b, + 0x31274486, + 0xdf6bd307, + 0xdfe6d28b, + 0x94190135, + 0x74194506, + 0x741d41a3, + 0xf49b4027, + 0xe9f2930e, + 0x241900f0, + 0x54d14656, + 0x45960620, + 0x1ffdb3b9, + 0x31833453, + 0x3027031e, + 0xd3079419, + 0x4a06df6b, + 0x11270127, + 0xe6fd437e, + 0xd8741907, + 0x3ea71941, + 0xd1fbffff, + 0x27021034, + 0x104c1c30, + 0x43073127, + 0x4f6b41c3, + 0x4027031e, + 0x30274d8b, + 0x84f90b1e, + 0xff000a08, + 0x4d8b3027, + 0x31274486, + 0x4f6b4307, + 0x941947c6, + 0x22be4506, + 0x131efcd3, + 0x270f5499, + 0x0ef39b30, + 0x44873127, + 0xb04043f5, + 0x2ea7ff02, + 0xd1fbffff, + 0xab021024, + 0x5df393fd, + 0x341900f0, + 0xbe7e4fd6, + 0x27fd5a2a, + 0xc0041e20, + 0x24f92022, + 0xff011ff8, + 0x428747c6, + 0x300044f1, + 0x44d8ff02, + 0x27420712, + 0x2b410335, + 0x27461032, + 0xf0210331, + 0xa2c1daf3, + 0x07302748, + 0xc544a342, + 0xf39b48a4, + 0x8b00070e, + 0x48a2c5ff, + 0xd168a3c5, + 0xa70a1452, + 0xfd4fff4e, + 0xa66443c5, + 0xff3ea728, + 0x3441fdaf, + 0x7fff3ea7, + 0xa7420bfd, + 0xfdafff2e, + 0x34212405, + 0x25104ce3, + 0xa3341134, + 0x3415104c, + 0xfd59d3be, + 0x9419fdeb, + 0x74194506, + 0x741d41e3, + 0xf49b4027, + 0x9340270e, + 0x00efc3f3, + 0x675e341d, + 0x4ef58efd, + 0x08f9befa, + 0xff4ea700, + 0x44b9feff, + 0xd0071ffd, + 0xbe2f4c1c, + 0xa70008a7, + 0xffffff4e, + 0x99264399, + 0x3224274a, + 0x0d1eb127, + 0xa200b127, + 0xb4d6b027, + 0x181e0027, + 0xb22ef493, + 0x54449901, + 0x4c043027, + 0x07312720, + 0x0741c343, + 0xbe0f6b04, + 0xa7000bb4, + 0xffffff2e, + 0xd4964127, + 0x40ab4027, + 0x063623b9, + 0x4496c127, + 0x3706c027, + 0x24bd4027, + 0x4bbe0636, + 0x0cab0007, + 0x04864027, + 0xc4074127, + 0xdea7cf6b, + 0xb9ffffff, + 0xc6063ad4, + 0x9f19be44, + 0x3bd4b9fc, + 0x27460606, + 0xcdf49330, + 0x439d01b1, + 0x3bd3bd06, + 0x27b4c606, + 0x27a49601, + 0xff3ea700, + 0x34b9ffff, + 0x45060637, + 0x34bd4027, + 0x34be0637, + 0x0cab0000, + 0x04864027, + 0x04074127, + 0x4ea7fa8e, + 0xc1ffffff, + 0x44b9fc43, + 0x03ca0100, + 0xc2430b13, + 0x0c830e40, + 0xf903330f, + 0x00007c00, + 0x27fe0bff, + 0x4efe0b00, + 0x71f493f5, + 0xf0e301b1, + 0x44990f6b, + 0xe6f02508, + 0x5e002744, + 0x3ea70291, + 0xb9ffffff, + 0x36063834, + 0x15002745, + 0x00b85ef0, + 0xc0274027, + 0xbd28ac27, + 0x5e063834, + 0xcd070095, + 0x47334d07, + 0xc40bc533, + 0x08c4c0f1, + 0xbc07ff00, + 0xfca404be, + 0x08c4c4f1, + 0xbe23ff00, + 0x83fff73c, + 0x34070f4c, + 0x44873533, + 0x4307342b, + 0x432b4333, + 0x860c43f1, + 0x1b070005, + 0x2a074307, + 0x10014403, + 0x40051403, + 0xf2a84403, + 0xc564b1c1, + 0xb4c1b431, + 0xb834c568, + 0xc56cb0c1, + 0xb1c1bc30, + 0xdc31c570, + 0x8352b489, + 0x34c50f4c, + 0x54b4c1c4, + 0xc1d434c5, + 0x3bc55cbb, + 0xfd4027d8, + 0x0008b8d4, + 0x4b4ea7ff, + 0x4479fff7, + 0x0ea74566, + 0xbefff749, + 0x27fdda48, + 0x4b0ea7c1, + 0x84befff7, + 0xd007fdda, + 0xffff0fe4, + 0xff5cffff, + 0x4ea7fc15, + 0xd1ffffff, + 0x930a0448, + 0x01b08bf5, + 0x98e2f693, + 0xd1f79300, + 0x08070098, + 0xfffee1be, + 0x4c834007, + 0x184ce418, + 0xc0070160, + 0xf620cc83, + 0x070157cf, + 0x0f4c8348, + 0x35333407, + 0x342b4487, + 0x93339307, + 0x9f03932b, + 0x00058560, + 0x99119499, + 0x9dc10493, + 0xab4733ac, + 0xa4d39d34, + 0xd14094c1, + 0x2b03fc53, + 0xc5433343, + 0x90c1c8d4, + 0xfc50d540, + 0xc078be03, + 0x0b9499fc, + 0xc5ccd0c5, + 0x4566d0dc, + 0x4ea3d461, + 0x65010000, + 0xb99499d4, + 0xd4614546, + 0x20004da3, + 0xd489d465, + 0xc442e490, + 0x04949900, + 0x271d44d8, + 0x28649d41, + 0xf6169499, + 0x98d1c148, + 0xd4c17105, + 0xc174159c, + 0x7025a0d0, + 0x3800a25e, + 0x1e412748, + 0x9d402703, + 0x40272864, + 0x74057425, + 0x4d077415, + 0x4c033607, + 0x01282778, + 0x05440341, + 0xa8340331, + 0x0c1c27f2, + 0x891a618d, + 0x9c891a94, + 0x5345531c, + 0x24648dc5, + 0x11266c8d, + 0xc1c49b73, + 0xac079cd0, + 0xa153030b, + 0x0a0b1c07, + 0xfd7d94be, + 0xd4c17321, + 0x0bb007a0, + 0x07040743, + 0xbe0a0b1c, + 0xc1fd7d81, + 0x730198d4, + 0x430b2007, + 0xbd830407, + 0x2c3303ff, + 0x0b1c0716, + 0x0cbc330a, + 0x62beb2ab, + 0x4d27fd7d, + 0x1c270bbc, + 0x2df40d2c, + 0x834007f1, + 0x010fff4d, + 0x07b4abf0, + 0xbe6b8516, + 0x07fcd328, + 0xf1debe09, + 0x5d5499fc, + 0x0d074144, + 0xbea40c03, + 0x99fccf62, + 0x44e60b94, + 0x549d4227, + 0xbe080704, + 0x03fca0a9, + 0xfe945e81, + 0xffff3ea7, + 0x0434d1ff, + 0x1e48ce0a, + 0x0a0438d5, + 0xf49b4027, + 0x0e33990e, + 0x4fbf2ea7, + 0x273138fd, + 0x53240541, + 0xd6240331, + 0x86f42132, + 0xad6cbe46, + 0x27f111fc, + 0x8601ab40, + 0x6b412704, + 0x11f4154f, + 0x8ef0c3f0, + 0x89fc4ef5, + 0x0489280e, + 0x83d10726, + 0xffffffdf, + 0x07e49b0f, + 0x09decac3, + 0x24054027, + 0x0f1e3405, + 0x14072405, + 0xa8be0d07, + 0xc005fd7c, + 0x0e07ed07, + 0xf54efc8e, + 0xae96f393, + 0x4439c101, + 0x9f83f163, + 0x8000000f, + 0x4c5037c1, + 0xa3912390, + 0xfffff09f, + 0x399103ff, + 0x2e4ff634, + 0x30345902, + 0x0c27104c, + 0x03bc5e16, + 0x278431c1, + 0x27f32530, + 0xf421102c, + 0x343b3127, + 0x418b4307, + 0x43074616, + 0xf39341ab, + 0xc501ae4c, + 0x0a1e8434, + 0x3103f321, + 0xf2f0f325, + 0xc1f121de, + 0x719d4072, + 0x99390744, + 0x49870622, + 0x342b3533, + 0x0745729d, + 0x21f29343, + 0x2dc101ae, + 0x2b433344, + 0x3873c143, + 0x333c7199, + 0x420b1cdc, + 0xf621d3ab, + 0x43a9f135, + 0x1d070458, + 0x045644a9, + 0x1f836333, + 0x0fffffff, + 0x439bfc31, + 0x055c61f5, + 0x64f5ff00, + 0xff000560, + 0xc20bc333, + 0xa94422c1, + 0xa9010ccb, + 0x45010ec4, + 0xb862f5f1, + 0xda000581, + 0x473632b4, + 0x27800c27, + 0x0100001e, + 0x5cbe2027, + 0xac27fd52, + 0x08c0d510, + 0x070f1e01, + 0x08c0d114, + 0x47143301, + 0x516ebea4, + 0x33f431fd, + 0x3e4aed43, + 0x31000582, + 0x333b07f4, + 0x3844f143, + 0x33000582, + 0x93340b33, + 0x01ad87f4, + 0x40791b07, + 0x11033823, + 0x58035307, + 0x1e03f1f0, + 0x073a011f, + 0x074acb4d, + 0x1c4c532d, + 0x2a2b3811, + 0x20cc46f6, + 0x23b12313, + 0xfa0fe638, + 0x27da1e00, + 0x008f27a0, + 0x31800000, + 0xe94333f4, + 0x05823c44, + 0x134bd200, + 0x4dee5401, + 0x4f8300dd, + 0x0fffffff, + 0x056064f5, + 0x4d07ff00, + 0x071c4c53, + 0x87353334, + 0x07342b44, + 0x2bc333c3, + 0x070c07c3, + 0x600f033f, + 0x07000585, + 0x032f071d, + 0xfe3f7e34, + 0x4606f411, + 0x85acc4f1, + 0x30870005, + 0x4027340b, + 0x8cf43405, + 0x07022810, + 0x534dcb4a, + 0x4ff61c4c, + 0x4807021d, + 0x4333f141, + 0x056041f5, + 0x44f1ff00, + 0xff00055c, + 0x020741e2, + 0x701e0527, + 0x21012411, + 0x31053415, + 0x4c342823, + 0xf5433310, + 0x0581bc43, + 0xca382300, + 0x4907e753, + 0x3987f131, + 0x432b4533, + 0x13333407, + 0x81301f03, + 0x33330005, + 0x010c12a9, + 0xf421342b, + 0x54152103, + 0x12ad4333, + 0x45f5010c, + 0x000581bc, + 0x3f035d05, + 0x00058130, + 0x34b9f425, + 0xf293043c, + 0x0301ac74, + 0x3c34bd41, + 0x27245904, + 0x3d410331, + 0x1e245d23, + 0x93012719, + 0x01ac5bf2, + 0x23c1f121, + 0x3b412784, + 0xc534eb41, + 0x9b5e8423, + 0x1f0c2701, + 0x00054cbe, + 0xeb074ea7, + 0x053027fd, + 0x002f2743, + 0x15158200, + 0x0ef39b42, + 0xac2afb93, + 0xe4b63901, + 0xc100df61, + 0xb3814074, + 0x83c24801, + 0x44bcc156, + 0xffdf0ea7, + 0x50dcbeff, + 0x83dc07fd, + 0xb0990fdc, + 0x07d33324, + 0xf920271c, + 0x000080da, + 0xed47beff, + 0x86c007fd, + 0x87749106, + 0x07340b3a, + 0x0330054a, + 0x80d4fd41, + 0xa7ff0000, + 0xffffdf0e, + 0xfd5082be, + 0x0627c4f6, + 0x9901215e, + 0x460724b3, + 0xb485433b, + 0x7cc1bc75, + 0xbdf29340, + 0x238901ab, + 0x71c4494a, + 0x3f34ce2d, + 0x28071d07, + 0xbe1f0c27, + 0x070004c8, + 0xa72c0738, + 0xf7ffff1e, + 0x24013253, + 0x14d52403, + 0xf3a80118, + 0xab8ef493, + 0x81437101, + 0x0bcc4942, + 0xc5282b38, + 0x4dc5407d, + 0x8543754c, + 0x4a4c8d42, + 0x22c1071e, + 0x4072c54c, + 0x39874907, + 0x432b4533, + 0x13331407, + 0x1f03142b, + 0x00058560, + 0xab56f093, + 0xbe270701, + 0x270004a3, + 0x49f49332, + 0x433d01ab, + 0xfb430ea7, + 0xd567beff, + 0x24d007fd, + 0xffffff0f, + 0x150c27ff, + 0x0700815e, + 0x337c0940, + 0xd041f143, + 0x07ff0004, + 0x1f0c272c, + 0x39beb407, + 0xbe230004, + 0x53fffb34, + 0xa73707c2, + 0xf7ffff2e, + 0x34033401, + 0x011824d5, + 0x0c27fca8, + 0x0403be1f, + 0x93740900, + 0x01aaf3fc, + 0xc3c1b405, + 0x5873c568, + 0xd4fd4227, + 0xff0004c0, + 0xfb430ea7, + 0xc60439ff, + 0xd46ebe44, + 0x274027fd, + 0x1ec43d00, + 0x33f4311e, + 0x304f0343, + 0xa9000581, + 0xd1010c43, + 0x33010844, + 0x07340b33, + 0x5e282323, + 0xf143fdfb, + 0xf84ef58e, + 0x8ea7d027, + 0x93fd4fff, + 0x01aa9ffa, + 0xd127031e, + 0xfaf30ea7, + 0xd471beff, + 0xe0b007fd, + 0xffffff0f, + 0x0700daff, + 0xf9143310, + 0x00051c1d, + 0x2013f1ff, + 0x07ff0005, + 0x0343334d, + 0x0581304f, + 0x8c40c100, + 0x00003f03, + 0x03158000, + 0x078849c1, + 0x834907e1, + 0x34070f4c, + 0x44873533, + 0xc307342b, + 0xc32bc333, + 0x8560cf03, + 0xc2c10005, + 0xe4ee23ac, + 0x24c1fffa, + 0x2413f1a8, + 0xc6ff0005, + 0x4c431b44, + 0xa823c540, + 0x051e14f9, + 0x24c5ff00, + 0x5c0401c0, + 0x3cfff04d, + 0xff00004f, + 0xc584110f, + 0xe479e024, + 0xc49946a6, + 0x274616b9, + 0xb9c49d41, + 0x935cf093, + 0xa9f9befd, + 0x84a3c1fc, + 0x4d3b4127, + 0xa3c534eb, + 0x0ccd9984, + 0xcd9dd123, + 0x23a4590c, + 0x27a45d41, + 0x10b4fd40, + 0xa7ff0005, + 0xfffaf34e, + 0x45664479, + 0xfaf10ea7, + 0xd35ebeff, + 0x27dff6fd, + 0x44a4c1ff, + 0xff2049ee, + 0x0a071c07, + 0xfcab1cbe, + 0x07ff155e, + 0x4ef88e0d, + 0xff4ea7fd, + 0x4d99ffff, + 0x26419927, + 0xb92f1dce, + 0xa60d1444, + 0x24f09345, + 0x2d07fd9e, + 0xfd49abbe, + 0xbe0bd2c4, + 0xc6fc927d, + 0x1e022706, + 0xbed6160b, + 0x46fc9212, + 0x0e002705, + 0xd1849efd, + 0x4efd8efc, + 0x8df493fd, + 0x43290318, + 0x34ce4409, + 0xf9f49335, + 0x240701b9, + 0x07c32c03, + 0x7f2ce334, + 0x197f3ce3, + 0x803c0334, + 0x27f932c2, + 0xddf093d0, + 0xf2be01b9, + 0x0626fd45, + 0xb9d2f093, + 0xd375be01, + 0x1ed127fc, + 0x93d027e9, + 0x01ba8ff4, + 0x99404399, + 0x34ce4144, + 0xce29be11, + 0x270dabfc, + 0x27048640, + 0x6bd40741, + 0x8e0d07df, + 0x1e03dcfd, + 0x48334107, + 0x140741ab, + 0x1c333207, + 0xab325310, + 0x1e310314, + 0x23010507, + 0xb8040324, + 0x1d2506f3, + 0xc8010301, + 0x07fe0bf2, + 0xd840ab41, + 0x151e0f43, + 0x24231301, + 0x14030305, + 0x071e0403, + 0x42534207, + 0xf4584103, + 0x14192586, + 0x041d1103, + 0xf2a80103, + 0x0105fe0b, + 0xf2c80403, + 0x2253fe0b, + 0x14012586, + 0x04051403, + 0xf2a80403, + 0x0533fe0b, + 0x180001f5, + 0x03f5ff02, + 0xff021804, + 0x0e234027, + 0x35fde800, + 0x000e0304, + 0x02f5fde8, + 0xff021810, + 0x181403f5, + 0x0e23ff02, + 0x35fde7f0, + 0x4efe0b04, + 0x27d007fc, + 0x07033343, + 0xf53d07e3, + 0x02120004, + 0x47c107ff, + 0x3312070d, + 0x0034f133, + 0xdcff0210, + 0x2087f848, + 0x100024f1, + 0x4ddcff02, + 0x27f60800, + 0xf5010334, + 0x02120023, + 0xf54087ff, + 0x02120043, + 0x87e623ff, + 0xf540273c, + 0x02160034, + 0x0fec83ff, + 0x1c333d07, + 0x8333330e, + 0xf000001f, + 0x10ec333f, + 0x34f5e1ab, + 0xff021400, + 0x14043ef5, + 0xf49bff02, + 0x4efc8e0e, + 0x07b207f6, + 0x27a00791, + 0xf893406c, + 0xa700e53c, + 0xfdefff7e, + 0xcb07471e, + 0x0741bc10, + 0x078401c6, + 0xc3d633d4, + 0x23840541, + 0xfefdb4de, + 0x33fc74c1, + 0x4c53184c, + 0xf542cc1d, + 0x23032c07, + 0x0d0723e3, + 0x077e1907, + 0x9b4027ff, + 0x0c270ef4, + 0x072a071f, + 0x7e3c071d, + 0xac0bff06, + 0x9c0bbc2b, + 0x8eb8bfd6, + 0xff2ea7f6, + 0x031efdef, + 0x24c1f3e8, + 0xdc3327fc, + 0xf5fc6a4d, + 0xfb4efe0b, + 0xc007b107, + 0x0c07e43e, + 0x1ea72b07, + 0x0efefdf3, + 0xfec05efb, + 0xc007fb4e, + 0xce3eb107, + 0x3b071c07, + 0xa71f0c27, + 0xfefdf32e, + 0xb75efb0e, + 0x114f27fe, + 0xfb100000, + 0xffff40f4, + 0xf505333f, + 0x02180001, + 0x0402f5ff, + 0x27ff0218, + 0x000e2330, + 0x0335fde8, + 0x03234c27, + 0xfde8000e, + 0x181004f5, + 0x02f5ff02, + 0xff021814, + 0xe7f00e23, + 0x0b0335fd, + 0x0f0c83fe, + 0x0e230333, + 0x39ffff7e, + 0x9e44c604, + 0x0bfdd094, + 0x030333fe, + 0xe8031e04, + 0x0004f1f3, + 0x27ff0210, + 0x6a4ddc33, + 0xfe0bf2fc, + 0x43270533, + 0x180004f5, + 0x02f5ff02, + 0xff021804, + 0x0e234027, + 0x35fde800, + 0x000e0304, + 0x01f5fde8, + 0xff021810, + 0x181402f5, + 0x0e23ff02, + 0x35fde7f0, + 0x4efe0b04, + 0x07c007fc, + 0x03d20702, + 0x75be4c0c, + 0x40a70005, + 0x9d45d399, + 0xd49d47d4, + 0x1a32c446, + 0xc03ed499, + 0x4713ff4c, + 0xb94c0b44, + 0x9d014843, + 0x44b946d3, + 0xd49d0149, + 0x00fc8e47, + 0x00000001, + 0x00000000, + 0x00000001, + 0xff02b040, + 0x0f6bf54e, + 0x0fe6f063, + 0xdea70184, + 0xb9ffffff, + 0x460635d4, + 0xdcc4be46, + 0x270586fc, + 0xbd612740, + 0x1e0635d4, + 0x27602703, + 0xffcea7d0, + 0x7027ffff, + 0xc396f993, + 0xff8ea701, + 0x5ea7fd7f, + 0xb9fdcfff, + 0xf40a2bc4, + 0x0122104c, + 0x0cb5c4b9, + 0x94994606, + 0x9df1139a, + 0x4c501a01, + 0x010e5e10, + 0x0196f213, + 0x930f072a, + 0x01b7b7f1, + 0xfccaa5be, + 0x00fa0fe6, + 0x4d24f409, + 0xf4290bba, + 0xfb284ce0, + 0x93062700, + 0xfda340f1, + 0x4307311e, + 0x3707400b, + 0x00014f30, + 0xf4537000, + 0x4319ff64, + 0x41c34307, + 0x2f6b2407, + 0xb77af193, + 0x61147101, + 0x0a430b13, + 0x2725b604, + 0x57f19306, + 0x0b9efda3, + 0xc0b9fd49, + 0xfbab0a2a, + 0xdc83d007, + 0x073d070f, + 0x3345334d, + 0x23340b33, + 0xfff5d43e, + 0x4a272107, + 0x24032101, + 0x34033105, + 0xc2b9f4a8, + 0xf3930a2b, + 0x8101b734, + 0x0731613e, + 0x0333714d, + 0x33210301, + 0x2ac0bd43, + 0x2bc2bd0a, + 0x944f030a, + 0x0b00059e, + 0x0543151e, + 0x9a949941, + 0x41033027, + 0x9b9a949d, + 0xa6260ef3, + 0x0cb5c4b9, + 0x84114244, + 0x00004ea3, + 0xeb841502, + 0xff2ea7fb, + 0x4027fd4f, + 0xf49b2301, + 0x9921270e, + 0x233b0ec4, + 0xf45324cb, + 0x4301feb8, + 0x41272138, + 0x21533405, + 0x340324c6, + 0x4127f31e, + 0x276054c5, + 0x05f493d1, + 0x479d01a5, + 0xfed95e06, + 0x46ab4d07, + 0x44860027, + 0x0f6b0127, + 0xf493171e, + 0x8101b6a4, + 0xf4405143, + 0x0000003f, + 0x27ff0120, + 0xff165e20, + 0xf58ef043, + 0x4ea7fb4e, + 0xb9ffffff, + 0xb90cb64c, + 0x070cb743, + 0x1eb407d2, + 0xb844f122, + 0x07ff000c, + 0x2b14053e, + 0xc83f6b40, + 0x22f90d40, + 0xff000cf8, + 0xd21d0127, + 0xb3bdfb8e, + 0x23070cb7, + 0x070f2c83, + 0x034287e3, + 0xd2c3cee1, + 0xfb8e0027, + 0xffff3ea7, + 0xb734b9ff, + 0xbd41030c, + 0x0b0cb734, + 0xa7f94efe, + 0xfbffff3e, + 0x02183ad1, + 0x9a073431, + 0x3c1f9c53, + 0x0000004f, + 0x1ee02701, + 0x103ed105, + 0x9395b602, + 0x01c1bbf4, + 0xc58043c1, + 0x4e078443, + 0x43e44383, + 0xbea7009a, + 0xb9ffffff, + 0xb90cb6b1, + 0x070cb7b4, + 0x07411b0e, + 0x272f6b24, + 0xfd93104c, + 0x3301c190, + 0x422b1d0c, + 0xc11f0c53, + 0xc02780d3, + 0xc1274210, + 0x2b102cd4, + 0x4f834a07, + 0x0fffffff, + 0x2c832107, + 0x33342b0f, + 0x03428733, + 0xb843f511, + 0xfdff000c, + 0x000cf820, + 0xb6b1bdff, + 0x9b40270c, + 0xc5160ef4, + 0xb4bd4127, + 0xd4c10cb4, + 0x90d3c188, + 0x305b4103, + 0x8b88d4c5, + 0xe335e63c, + 0xa7e8a3e3, + 0xfbffff4e, + 0x02104ed5, + 0xb4bd4127, + 0x3616063b, + 0xfceca6be, + 0xe394d4c1, + 0x94d4c543, + 0x9ff6f98e, + 0xf39300f1, + 0xa701c10c, + 0xffffff4e, + 0x0a2a4db9, + 0x99803bc1, + 0xa0279a34, + 0x2300815e, + 0x07e21141, + 0x031f6b14, + 0xc6e00141, + 0xc49d6d2f, + 0x10d2079a, + 0x0000012f, + 0x00df2701, + 0x07010000, + 0x833d0710, + 0xa7370317, + 0xfde6ff4e, + 0x07e3310b, + 0x37e34005, + 0x00274315, + 0x2ea74035, + 0x27fde6ef, + 0x24050e4c, + 0x4d072315, + 0xffff4f83, + 0x4fa30fff, + 0x80000000, + 0x351c1c33, + 0xa741ab20, + 0xfbffff3e, + 0x021834d5, + 0x0180c4c1, + 0xc54d0be3, + 0xe41180c4, + 0x4d2b3d0b, + 0xe305e415, + 0x41071d1e, + 0xed07a127, + 0xec83e42b, + 0x03e3330f, + 0x059e94ef, + 0xf6c30700, + 0x9dff6e4f, + 0xf4939a34, + 0xc101c05c, + 0xb4ce8044, + 0xff3ea70f, + 0x3411fd7f, + 0x00004ee3, + 0x26341502, + 0xff3ea7a8, + 0x4127ffff, + 0x063534bd, + 0x270f3399, + 0x0ef49b40, + 0x33874127, + 0xb04034f5, + 0xf98eff02, + 0xf49b4027, + 0x99f98e0e, + 0x47d81414, + 0x8a049d1b, + 0x13311441, + 0x0b3c02c1, + 0x33430734, + 0x9003c543, + 0x2108242b, + 0x0b3c04c5, + 0x2b4007fe, + 0x23f49b41, + 0x20071686, + 0x4f9b2803, + 0x4e382723, + 0x9b242e04, + 0xf31e25f3, + 0x007f4f27, + 0xf49b4000, + 0xa7fe0b21, + 0xfdefff4e, + 0x010442d1, + 0x53182c33, + 0x1b1e1d2c, + 0xc4890499, + 0x41231231, + 0x34874383, + 0x432b4433, + 0x4499400b, + 0x9d45e661, + 0x03998801, + 0x23130788, + 0xdd23ca11, + 0xfd4efe0b, + 0xc43ed007, + 0xf688d499, + 0x223f9b45, + 0x2e234f9b, + 0x9d402743, + 0xfd8e8ad4, + 0x9b2af09b, + 0x100b2bf0, + 0x9b22f19b, + 0x4f9b23f0, + 0x104ca320, + 0x9b20f49b, + 0xfe0b23f0, + 0xe3204f9b, + 0xf49b104c, + 0x2b4f9b20, + 0xefff3ea7, + 0xd54327fd, + 0xd1030034, + 0xdc010034, + 0x3ea7fa48, + 0xd1fdefff, + 0xdc010034, + 0xf808004d, + 0x34d54427, + 0x34d50300, + 0x20270304, + 0x063c32d5, + 0xeaff3ea7, + 0x273205fd, + 0x0400004f, + 0x9b34150c, + 0x04990ef2, + 0x27454688, + 0x88029d40, + 0x0b89049d, + 0x100c5cfe, + 0xdefef493, + 0xac41c100, + 0x1007183c, + 0x070f1c83, + 0x0f4c8341, + 0x2f274333, + 0x80020100, + 0x2f6b247b, + 0x24964127, + 0xf3934027, + 0x3300ded8, + 0xac31c545, + 0xc54c349d, + 0x0f9bc032, + 0xc034c120, + 0xab830ce3, + 0x93fe0b04, + 0x00debbf4, + 0x538b4099, + 0x0b018302, + 0x234f9bfe, + 0x48134783, + 0xf49b4800, + 0x9bfe0b25, + 0xf493230f, + 0xc100de9c, + 0x43075043, + 0x042b4333, + 0x030b0373, + 0xe81efe0b, + 0x05234f9b, + 0x81f49304, + 0x43c100de, + 0x9903153c, + 0x039db043, + 0xaa439908, + 0x9909039d, + 0x039dac43, + 0x8b44990a, + 0x0b0b049d, + 0x93fe4efe, + 0x00de5bf2, + 0x9b4023c1, + 0x34ce234f, + 0x8b24990f, + 0xa3104c38, + 0x249d204c, + 0x93933e8b, + 0x00de3ff0, + 0x998c0499, + 0x43ab8a03, + 0x278a049d, + 0x8c049d40, + 0x9b223f9b, + 0x43ce234f, + 0xef22be0b, + 0x2704c6fc, + 0x93fe8e02, + 0x00de17f0, + 0x838b0499, + 0x4c24f04c, + 0x8e002710, + 0x9c04c1fe, + 0xfe8ef48b, + 0x9b274f9b, + 0x4c30240f, + 0x0b00a720, + 0x9b4103fe, + 0x412325f4, + 0x5b1f4c13, + 0x0b012304, + 0x99fc4efe, + 0xd0073004, + 0xc02744d6, + 0xc027781e, + 0x4aa66c1e, + 0x2389d499, + 0x07438341, + 0x87343334, + 0x0b342b44, + 0x6134993d, + 0x309947f6, + 0x583ec160, + 0x10074007, + 0x15334333, + 0x1d0b142b, + 0x33c11421, + 0x0be42b5c, + 0x99271ee3, + 0x41dc8ad4, + 0x32d49939, + 0x0731d299, + 0x07018304, + 0x33100730, + 0x2b153333, + 0x03340713, + 0x1e24ce31, + 0x0b32d39d, + 0x0720071d, + 0xbe0d073e, + 0x11fcf0d5, + 0x0b433304, + 0x88d499c4, + 0x42c8e027, + 0x8e0c078e, + 0x07f54efc, + 0x070107d0, + 0x2b720781, + 0x235f9b02, + 0x9b1850ce, + 0x42072c3f, + 0xda604c03, + 0x01070d34, + 0x467e1207, + 0x5ed027fd, + 0xd3c10115, + 0xe3a00750, + 0x073333a7, + 0xcc432b4a, + 0xa8071240, + 0x4a07a7e3, + 0x402c432b, + 0xf65ed127, + 0x07702700, + 0xfdae7e0d, + 0x9931de99, + 0x302730d4, + 0xd39d4e1b, + 0x6b94078a, + 0x8329079f, + 0x07420721, + 0x334333c2, + 0x2b6907c5, + 0x0b6103c4, + 0x509ececd, + 0xc441c131, + 0x43331333, + 0x0a07b107, + 0x0b14c399, + 0x07042bb4, + 0xd84b2b45, + 0x38072d37, + 0x40083b2b, + 0x30c818d6, + 0x070d0722, + 0xfca57e1c, + 0x41034907, + 0x9932d49d, + 0xab0714c4, + 0xd1274483, + 0xd0274486, + 0x1027d203, + 0x0008721e, + 0x070901da, + 0x27991e96, + 0xc1c02700, + 0x4a0754d3, + 0x432b3333, + 0xce2c40c8, + 0xa3070938, + 0xd4271027, + 0xd2c14e1e, + 0xff4ea738, + 0x43b9ffff, + 0x24190a2a, + 0x0d07344e, + 0xb1be1807, + 0xa807fcef, + 0x1027a72b, + 0xc4412c1e, + 0x33733007, + 0x1c07430b, + 0x9d90d4c5, + 0x0d0732d9, + 0xfcefacbe, + 0x1132d499, + 0x9d41030c, + 0x0d0732d4, + 0x33fe547e, + 0x0b1007c3, + 0x07d0271c, + 0xfcae7e0a, + 0x0807d536, + 0x2e7e1707, + 0x8e0d07fc, + 0x203f9bf5, + 0xdc16f293, + 0xac24c100, + 0x24c14858, + 0x830ce3c0, + 0x430704ab, + 0xa3104c83, + 0x40ab0c4c, + 0x38c634cb, + 0xd820f49b, + 0x9b1e833c, + 0x4cd8231f, + 0x24c10d83, + 0x4c229940, + 0x2432411b, + 0x20274008, + 0xdbdaf093, + 0xfe7b5e00, + 0xfb4efe0b, + 0xfd93b007, + 0xc100dbcc, + 0xd29940d4, + 0x324b1b4c, + 0x27400824, + 0x070d0720, + 0xfe5b7e1b, + 0x0344c007, + 0xc5234f9b, + 0xe01e40d4, + 0xbe230f9b, + 0xc1fcec67, + 0x0d0744d1, + 0xfcedfcbe, + 0xc4aad499, + 0x4f9b1b41, + 0x40d3c123, + 0x4f50432b, + 0x70000001, + 0x03234f9b, + 0x0000004f, + 0x40d4c5f0, + 0x0d07c444, + 0xfced11be, + 0x07a50fd6, + 0x4efb8e0c, + 0x93d007fd, + 0x00db63f0, + 0xfcecfdbe, + 0xdb5af493, + 0x4043c100, + 0x074c4299, + 0x32432b4d, + 0x27400824, + 0x931d0720, + 0x00db43f0, + 0xe25efd0e, + 0x99fe4efd, + 0xe0078a04, + 0x994041dc, + 0x04993103, + 0x3734ce32, + 0x9b224f9b, + 0x432b233f, + 0x20604ccc, + 0x93231f9b, + 0x00db17f4, + 0x994043c1, + 0x41074c42, + 0x2432432b, + 0x20274008, + 0xfe0e0e07, + 0x7efda45e, + 0x4f9bfd19, + 0x9b400b22, + 0xfe8e22f4, + 0xa007f94e, + 0x9b239f9b, + 0xcf9b22bf, + 0xe1fd9323, + 0xd1c100da, + 0xc50d0744, + 0x36be48da, + 0x0d07fced, + 0xfcec6dbe, + 0x588ad499, + 0x2b0b0741, + 0xc1f98e0c, + 0xd29940d4, + 0x52491b4c, + 0x27402824, + 0x07031ed0, + 0xadf093d2, + 0xdc7e00da, + 0xa5f093fa, + 0x667e00da, + 0x224f9bff, + 0x2b233f9b, + 0x31a4d243, + 0xda92f093, + 0x8a049900, + 0x992641dc, + 0x48463004, + 0x23310499, + 0x07418341, + 0x33353334, + 0xf9342b43, + 0x04bea034, + 0x104c5c00, + 0x2d071907, + 0xfcf054be, + 0x9b220f9b, + 0x042b234f, + 0xf54ef98e, + 0xda56f493, + 0x4c439900, + 0x439df0a3, + 0x276f074d, + 0x4c439d30, + 0xb407c007, + 0xffff5ea7, + 0x936403ff, + 0x01ba3ff7, + 0x99108c27, + 0x4fe6a8c4, + 0x54b9015c, + 0x4fe60cb5, + 0xf9ab0154, + 0x07230f9b, + 0xbe2f0716, + 0x26fff7e8, + 0xc4c4c10c, + 0x19804c24, + 0xc145c6f4, + 0x4cc4c8c4, + 0xf4191480, + 0x110f41c4, + 0x7e0223f0, + 0xd007fe26, + 0x1eccc8c5, + 0x7ef0110d, + 0x4227fe1a, + 0xc4c5d007, + 0x91dff6cc, + 0xf7f6be00, + 0xe77dbeff, + 0x00865efc, + 0xfce776be, + 0x338474c1, + 0x9bf41543, + 0x432b233f, + 0x116b40c8, + 0x40b4c1fa, + 0x1b4cb299, + 0x0824324a, + 0x07202740, + 0x7e1a070b, + 0xd007fc51, + 0x9b0b03c4, + 0xd227234f, + 0x1e40b4c5, + 0x230f9b4c, + 0xfcea5abe, + 0x0744b1c1, + 0xebefbe0b, + 0xaab499fc, + 0x9b1b41c4, + 0xb3c1234f, + 0x50432b40, + 0x0000014f, + 0x234f9b70, + 0x00004f03, + 0xb4c5f000, + 0x0bd4c440, + 0x03be0b07, + 0x05a6fceb, + 0xd4e6a01e, + 0x1e0ad4c4, + 0x27d42703, + 0x8bc49d40, + 0x181ef9eb, + 0xfc8ac499, + 0x27009046, + 0x9dd42740, + 0x8a5e8bc4, + 0xe82fbe00, + 0xe0d007fc, + 0xc4ff02d3, + 0xc49910d2, + 0x830c078a, + 0x8bc49d47, + 0x1ef98d7e, + 0x6adfd66d, + 0x99234f9b, + 0xc4c58ac3, + 0xc1315840, + 0x433390c4, + 0xf493191e, + 0xc100d908, + 0x3f9b4044, + 0x232f9b22, + 0x4f03322b, + 0x7fffff00, + 0xc4c5432b, + 0xc0c0c13c, + 0x9d104c27, + 0xca7e8bc4, + 0xbcc4c1fc, + 0x00004fa3, + 0xf49b4000, + 0xc5402721, + 0x1e1eb4c4, + 0xb27e0027, + 0x230f9bfc, + 0xfce98abe, + 0x20000d27, + 0xd6fdcf7e, + 0x6d5e800f, + 0x1ed227ff, + 0xb1f49386, + 0x439900d8, + 0x830d074d, + 0x4c439df0, + 0xfc4ef58e, + 0xbaf6fc93, + 0x6cc4c101, + 0x0c07dc07, + 0x04f6f48b, + 0x4610c499, + 0x9d402742, + 0xfc8e10c4, + 0xf4933127, + 0x9d01bad8, + 0xfe0b1043, + 0x3f9b2007, + 0x9b412724, + 0x012725f4, + 0x0027300c, + 0xf64df493, + 0x6c24c5fc, + 0xfd4efe0b, + 0xd85afe93, + 0xc1d00700, + 0x1f9b3ce2, + 0x223f9b23, + 0x422b4307, + 0x32074008, + 0x432b4107, + 0xc11141c8, + 0x411b3ce4, + 0xbe2348c4, + 0xc6fcec27, + 0x9b1b1e05, + 0xe3c1214f, + 0x56438bbc, + 0xe8d6be46, + 0x04f493fc, + 0x0027fcf6, + 0x8e6cd4c5, + 0x8e0427fd, + 0xe3f64efd, + 0x9bd007f0, + 0xc8be230f, + 0x4f9bfce8, + 0x233f9b22, + 0x4dcc432b, + 0x27103000, + 0xbe30000d, + 0x0cfffd00, + 0x9b30000d, + 0x3f9b234f, + 0x9b412724, + 0x30c825f4, + 0x241f9b63, + 0x1c534227, + 0x25f49b1e, + 0x27242f9b, + 0x1b2c5345, + 0xc025f49b, + 0x27543b26, + 0xc42621c0, + 0x211e3b25, + 0x301228c0, + 0x3129c428, + 0x1aa61f1e, + 0x4ebe0d07, + 0x091efcf9, + 0x0d071966, + 0xfd018abe, + 0x221eb007, + 0xa6be0d07, + 0xf51e0001, + 0xf9be0d07, + 0xed1efd10, + 0xfebe0d07, + 0xe51efd10, + 0x1f7e0d07, + 0x27de1eff, + 0x75f093b1, + 0x02c100d7, + 0x231f9b3c, + 0x07223f9b, + 0x08422b43, + 0x07320740, + 0xc8432b41, + 0x04c11141, + 0xc4411b3c, + 0x44be1348, + 0x0606fceb, + 0x4f9b0b1e, + 0xbc03c121, + 0x4486438b, + 0x4f9bb127, + 0x233f9b22, + 0x40cc432b, + 0x31f49315, + 0x44c100d7, + 0x233f9b3c, + 0x4128432b, + 0x1e0cbc27, + 0xbabfe609, + 0xb6b3e000, + 0x15f49300, + 0x43c100d7, + 0x4e409944, + 0x37be030b, + 0xb2e0fffb, + 0xb4c8009f, + 0xf841be14, + 0x530536ff, + 0x5efee8f4, + 0x0d07008a, + 0xfd0563be, + 0x998ef693, + 0x7864d101, + 0x2745b610, + 0x97be800c, + 0x60d5fcb4, + 0x68d11078, + 0x6ac11078, + 0x49d96944, + 0xe53cbed7, + 0xbec107fc, + 0x25fce536, + 0x074907f0, + 0x05f293bc, + 0x3a07fd9b, + 0x1c270807, + 0x15f70580, + 0x3315befb, + 0x89d269fd, + 0xc0278064, + 0x6389424e, + 0xced4497e, + 0x41270e34, + 0x9d80628d, + 0xd4497c64, + 0x937e648d, + 0x01992bf4, + 0x107840d1, + 0xfc9922be, + 0x1b7e0d07, + 0xf7b9befe, + 0x2705c6ff, + 0x3cf493b0, + 0xd4c5fcf4, + 0x27031e6c, + 0xc30b07b0, + 0x9bf68ef0, + 0x3f9b274f, + 0x204cd024, + 0x9b412717, + 0x4f9b25f4, + 0x204c2724, + 0x2725f49b, + 0x0000000f, + 0x03fe0b80, + 0x25f49b41, + 0x4c134123, + 0x07345b1f, + 0x18015303, + 0x0b001331, + 0x274f9bfe, + 0x30240f9b, + 0x00a7204c, + 0x4103fe0b, + 0x2325f49b, + 0x1f4c1341, + 0x0123045b, + 0xfd4efe0b, + 0xa7bed007, + 0x0636fffd, + 0x01b8d4a9, + 0x41033027, + 0xad15d39d, + 0x8e01b8d4, + 0x23f54efd, + 0x55d007f2, + 0xbec207f1, + 0x45ffffbd, + 0x284f9bf0, + 0x09ea4af4, + 0x45234510, + 0x4200c524, + 0x09de44e4, + 0x864046f9, + 0xd6bd0001, + 0x1f9b01ba, + 0x12d48928, + 0x0d07144e, + 0xfcfe0abe, + 0x09cf0ff6, + 0xd67cd499, + 0x1e302744, + 0x7bd49912, + 0x44863027, + 0x43073127, + 0x340741c3, + 0xd4993f6b, + 0x9dd37df3, + 0x467b86d3, + 0x099a41f8, + 0x9b7dd499, + 0x3c27242f, + 0x5b342b20, + 0x25f49b23, + 0x244ed449, + 0xf614d499, + 0x4d00cb4f, + 0x7cd499d2, + 0x3f9b4756, + 0x9b412724, + 0x30cc25f4, + 0x248f9b0e, + 0x5325f49b, + 0x81031f8c, + 0x8327031e, + 0x9b2dc5c4, + 0x2dc4282f, + 0x9b14ffff, + 0x4c27243f, + 0x25f49b11, + 0xe40f3c53, + 0x0100003e, + 0xf1410940, + 0xd4b916b6, + 0x45e604a6, + 0x4614d499, + 0x277a1e45, + 0x1e202730, + 0x19312703, + 0x1784ced4, + 0x43ced459, + 0xced46912, + 0xf1510d42, + 0x14c6d439, + 0x121e44c6, + 0xd4994626, + 0x5d4e7614, + 0x6dd81dd3, + 0x3df251d2, + 0x87d499d2, + 0xd49946f6, + 0x24cf9b8a, + 0x9925f49b, + 0x4c1388d3, + 0x26c45b20, + 0xc4141e38, + 0xd4991941, + 0xbe46b68a, + 0x99fffe6b, + 0xc00788d4, + 0x83444586, + 0xfffe5ebe, + 0xc027051e, + 0xd4210027, + 0xd431c42e, + 0x991404ce, + 0x458614d4, + 0xf2030d07, + 0x6d9ef50e, + 0xdc25fd03, + 0xd499d035, + 0x9b462689, + 0x4586284f, + 0xf2030d07, + 0x279ef50e, + 0xf093fffc, + 0xc100d480, + 0x1f9b3c02, + 0x223f9b23, + 0x422b4307, + 0x32074008, + 0x432b4107, + 0xc11341c8, + 0x411b3c04, + 0x087248e4, + 0xfce84ebe, + 0x695e0626, + 0x214f9b08, + 0x8bbc03c1, + 0x5d4ff643, + 0x86d49908, + 0x2764d2c1, + 0x27410031, + 0x05249930, + 0x342a3347, + 0x22062499, + 0x99f09343, + 0x015efd9b, + 0x14d49907, + 0x009a4ff6, + 0xd49dd319, + 0x7ed189ef, + 0x991a33c4, + 0x45661924, + 0x3a274127, + 0x1eefd49d, + 0x7cd4990e, + 0x11474496, + 0x031e3027, + 0xd39d3503, + 0x28d18d22, + 0x4de0de03, + 0x033d0701, + 0x070193dd, + 0x7f3ce32d, + 0x237f2ce3, + 0x014f73de, + 0x3c033419, + 0xf932c280, + 0x0765cc27, + 0x034d073d, + 0x014de03e, + 0x4ab84e03, + 0x012c0701, + 0x05c12341, + 0x03440331, + 0x07f29834, + 0x032d070d, + 0x0e03182c, + 0x07014ab8, + 0x0b69be1d, + 0x44d2c1fd, + 0x41273027, + 0x0484dcbd, + 0x0485d3bd, + 0x9da0d2c5, + 0xd39d14d4, + 0x80d2c516, + 0x9b1162c4, + 0x4127243f, + 0x5325f49b, + 0xd39d1f3c, + 0xd6071ef5, + 0x1ea02764, + 0x243f9b2f, + 0xf49b4127, + 0x1a30cc25, + 0x0328af9b, + 0x21acf4a1, + 0x62c4076c, + 0x28bf9b17, + 0xbcd0b103, + 0x5d5e1021, + 0x74da9907, + 0xdb996224, + 0x27031e75, + 0xf7da9db0, + 0xc0f8db9d, + 0x4c270c62, + 0xcbd49d10, + 0xd49d40a7, + 0x039d07ca, + 0x0701bc9d, + 0xff1c2709, + 0xbe202c27, + 0x07ffecbd, + 0xdc2d032d, + 0x07f23501, + 0xff1c2702, + 0xbe202c27, + 0x20ffeca9, + 0x5662e461, + 0xb95d1e01, + 0x360484d4, + 0x070d0747, + 0xb80e031d, + 0x1d03014a, + 0x54be0486, + 0x4127fd05, + 0x0484d4bd, + 0x09071d07, + 0x04861d03, + 0xa0be2a07, + 0x3f9bffec, + 0x9b412724, + 0x30cc25f4, + 0x070d070f, + 0xbe2a0719, + 0xf6fd00f0, + 0xc106d80f, + 0x2a0780d3, + 0x18070907, + 0x00071dbe, + 0x0100d0d5, + 0x00fb0ff6, + 0x0706b35e, + 0xb8ce03cd, + 0xf231014a, + 0x19070c07, + 0x4b073a07, + 0x0009a7be, + 0x27243f9b, + 0x25f49b41, + 0x070f30cc, + 0x0719070d, + 0x00aabe2a, + 0x920ff6fd, + 0x243f9b06, + 0xf49b4127, + 0x0f30cc25, + 0x0d07f131, + 0x91be2b07, + 0x0ff6fd00, + 0xd3c10679, + 0x072a0780, + 0xbe090718, + 0xd50006be, + 0xc10100d0, + 0xf03180d3, + 0x18072b07, + 0x0006adbe, + 0x0100d4d1, + 0x0104d0d5, + 0x06424fe6, + 0x063e01f8, + 0x01dcd1b9, + 0x41070c07, + 0xd49d4153, + 0x06c9beca, + 0x9d0f6b00, + 0x0ce0cbd0, + 0x99062310, + 0x4626f5d4, + 0x01dcd1b9, + 0xb7be0c07, + 0xd09dfd04, + 0xb9531ef2, + 0xc401dcd2, + 0x4d073c83, + 0x010c4d03, + 0x19070c07, + 0x4dbe3327, + 0xd4990007, + 0xb94b06ef, + 0x0701dcd2, + 0x2c4d034d, + 0x070c0701, + 0xbe312719, + 0x07000734, + 0xdcd2b94d, + 0x070c0701, + 0x03322719, + 0x1e016c4d, + 0x074d070d, + 0x0719070c, + 0x2c4d0338, + 0x0712be01, + 0x86d49900, + 0xc65e41c4, + 0x03bd0767, + 0x014ab8be, + 0x0b072d07, + 0x2d031907, + 0x1dbe0204, + 0xc0070008, + 0x1e1462c4, + 0x273d0719, + 0x4027102c, + 0x020434d5, + 0xf2a83403, + 0x3d07c027, + 0x1e102c27, + 0x07f13116, + 0x030b072d, + 0xbe02442d, + 0x330007f0, + 0xc0ab100c, + 0x40270b1e, + 0x024434d5, + 0xf2a83403, + 0x01acdcd5, + 0x0200dcd5, + 0xd3c14027, + 0xffd4bd74, + 0x003fd801, + 0x11ffff00, + 0x0d030d07, + 0x10270284, + 0x02002d27, + 0xfd2b39be, + 0x8676d499, + 0x99614044, + 0x41e477d4, + 0x62e400e8, + 0x2f9b00e4, + 0xf4f20528, + 0x99051f28, + 0x4027ecd3, + 0x3516f415, + 0xf3253127, + 0x4f9b0e1e, + 0x0948f428, + 0x27f41505, + 0x11f42543, + 0x832783f4, + 0xab443347, + 0xffd4bd42, + 0x27ad0701, + 0xf7ac9970, + 0x27071707, + 0x24331533, + 0xc1035027, + 0xf275f165, + 0x9900855e, + 0x412486d4, + 0x031ef271, + 0x250bf261, + 0x2d032333, + 0x2d0b0284, + 0xe027b027, + 0x2111e2c0, + 0x2e3ec2f3, + 0x2724bf9b, + 0x1fbc5341, + 0x8625f49b, + 0x291f9bb8, + 0x07293f9b, + 0x804c0341, + 0x01004df4, + 0x4307049c, + 0x07804c03, + 0x004dd003, + 0x8d5e1a01, + 0x27b02704, + 0x27e49641, + 0x871f0740, + 0x01410b44, + 0x3b112744, + 0xc4002714, + 0x990d801c, + 0x41270623, + 0x34ab4e3b, + 0x0706239d, + 0x7d4e0b42, + 0x03411d40, + 0x99e3c4e1, + 0xfcf85103, + 0xd4b9ff7b, + 0x424401ba, + 0xa1037103, + 0xff5772e4, + 0xe477d499, + 0xc4008342, + 0xd4997f62, + 0x033d0786, + 0x4402843d, + 0x03cd0741, + 0x1e0304cd, + 0x03cd0707, + 0x070384cd, + 0x554c27ad, + 0x4ab8ae03, + 0xffd4bd01, + 0x070a0701, + 0xbe280719, + 0x31fd02c7, + 0x070a07f1, + 0xbe3c0728, + 0x99fd02bb, + 0x4bc6efd4, + 0xbd03bd07, + 0x0a070284, + 0x21271907, + 0xa4be3b07, + 0xcd07fd02, + 0x0384cd03, + 0x2127f131, + 0x0a073c07, + 0xfd0292be, + 0x19070a07, + 0x22273b07, + 0xfd0286be, + 0x0a07f131, + 0x22273c07, + 0xfd027abe, + 0x3fe6f351, + 0xd499018c, + 0x5041e414, + 0x27bd0701, + 0x4cbe0340, + 0x1d07014c, + 0x0716d49d, + 0xb81e030b, + 0xfebe014a, + 0xd459fd03, + 0x4f9b4846, + 0x9b412724, + 0x3f9b25f4, + 0x25f49b24, + 0x00ee30ec, + 0x0716d49d, + 0xbe10270b, + 0x5efd052d, + 0x3f9b00e0, + 0x9b412724, + 0x30ec25f4, + 0xd49d00d4, + 0x27702716, + 0x27902740, + 0x9ba02780, + 0xc7f428cf, + 0xc3c00354, + 0xc0c45431, + 0xc2d411c1, + 0xc0761e1e, + 0xc5d04cc5, + 0x59c6c037, + 0x02be691e, + 0x0103fff9, + 0x0b071007, + 0xfd081dbe, + 0x1f9b1d1e, + 0xbe0b0728, + 0x1efd0542, + 0xf8e7be12, + 0x9b0103ff, + 0x1007282f, + 0xacbe0b07, + 0xa127fd05, + 0xf603135e, + 0x9b03077f, + 0x0b07281f, + 0xfd04e6be, + 0x015e7127, + 0xf59ff603, + 0xf146e002, + 0xbe0b0702, + 0x27fd03b4, + 0x02ee5e91, + 0x02e28ff6, + 0x07281f9b, + 0x048fbe0b, + 0x5e8127fd, + 0xff1e02dc, + 0x91e0a104, + 0xd1e102cc, + 0xd9014c64, + 0x014c54d4, + 0x44871339, + 0xd2e1438b, + 0x46014c4c, + 0x27131945, + 0xab433b41, + 0x6cd4d924, + 0x3127014c, + 0x343b4103, + 0x41034207, + 0x0b07432e, + 0xfd059bbe, + 0x4c64d1e1, + 0x54d2d901, + 0x1339014c, + 0x438b4287, + 0x0b0745b6, + 0xfd05cdbe, + 0xd49d4127, + 0x16d49916, + 0xd3e14d06, + 0xe1014c50, + 0x014c4cd4, + 0xd4c543eb, + 0x59361ea0, + 0x9b4586d4, + 0x4227244f, + 0x1e25f49b, + 0x243f9b28, + 0xf49b4127, + 0x1d30cc25, + 0xf428cf9b, + 0x000243c7, + 0xbec304c1, + 0x07fff805, + 0x1042234c, + 0x9bc60443, + 0xc0d6284f, + 0x86edd499, + 0x9b654645, + 0x3330283f, + 0x27021f5e, + 0x64d4c133, + 0x99eed39d, + 0xd2990544, + 0x33340778, + 0x2b444733, + 0x294f9b34, + 0x2f6b240b, + 0xfa333c03, + 0x2701fb32, + 0x7ad39940, + 0xbdf6d29d, + 0xbd01b0d4, + 0xbd01fcd4, + 0xbd01fdd4, + 0x9d01fed4, + 0xd4bdfbd4, + 0x3a2601b1, + 0xf4283f9b, + 0x9d01d333, + 0xd3bdfbd3, + 0x31c001fc, + 0x294f9b1f, + 0x01fdd4bd, + 0xbd294f9b, + 0xb901fed4, + 0xb901fed1, + 0xbd01fdd4, + 0xbd01b0d1, + 0x9901b1d4, + 0x34d679d3, + 0x0e1eb027, + 0x2724bf9b, + 0x432b204c, + 0xf39bb45b, + 0x81f09325, + 0x02c100cd, + 0x231f9b3c, + 0x07223f9b, + 0x08422b43, + 0x07320740, + 0xc8432b41, + 0x04c11341, + 0xe4411b3c, + 0xbe017348, + 0x26fce14f, + 0x016a5e06, + 0xc1214f9b, + 0x438bbc03, + 0x015e4ff6, + 0xe014d499, + 0x2700ef42, + 0xefd39940, + 0x04a6d4bd, + 0x8626d489, + 0x50444734, + 0x9302014d, + 0xfd94adf0, + 0xfc8fc6be, + 0x9901335e, + 0x45865ed4, + 0x277bd499, + 0x5e44e6c1, + 0xc0270124, + 0x2786d399, + 0xd465484c, + 0x75d4d39d, + 0x27c506d3, + 0x6501284d, + 0xf3d499d4, + 0x21204cd8, + 0x067bd499, + 0x64d3c147, + 0xd49d4227, + 0x6134a18e, + 0xe34303d3, + 0x65340b43, + 0x27061ed3, + 0x8ed49d41, + 0x897bd299, + 0xd45984d3, + 0x8d8fd29d, + 0x44c69cd3, + 0x0d1e3027, + 0x01bad4b9, + 0x42043127, + 0x32133027, + 0xd39dd439, + 0x86302720, + 0x99312744, + 0xd39d16d4, + 0xd9462624, + 0x014c6dd4, + 0xd4994546, + 0x9d45a33e, + 0x0d073ed4, + 0x0c031d07, + 0x181c038c, + 0xbe482c27, + 0xf6fc9575, + 0x07009c0f, + 0xf37abe0d, + 0xc1c5e6fc, + 0x4127bcd3, + 0x2746349d, + 0x0ef49b40, + 0x03bcd4c1, + 0xd4c5484c, + 0xad402760, + 0x2701b8d4, + 0x14d49d42, + 0x89b8d489, + 0xf141bad3, + 0xd1c5439b, + 0x5541c2c4, + 0xd4993027, + 0x08d3d57b, + 0xc8d39d01, + 0xd2c148e6, + 0x68d3c164, + 0x0760d1c1, + 0x034b070d, + 0xbe04a80d, + 0x41000484, + 0x60d4c1f2, + 0x4319420b, + 0x0108d4d5, + 0x07c8d39d, + 0xfa0ebe0d, + 0x2603c4fc, + 0x04a6d4b9, + 0xd4bd4616, + 0xf44104a6, + 0x41274516, + 0x04a6d4bd, + 0x0e1e0327, + 0x0a1e0127, + 0x061e0427, + 0x9c5e4c07, + 0x8ef203fc, + 0x000000f5, + 0x00110421, + 0x04d21344, + 0x0b040709, + 0x071218fe, + 0x4efe0b04, + 0x99d007fd, + 0x010730d4, + 0x132734d6, + 0xd499211e, + 0x0c1c2731, + 0x2e19191e, + 0x4e072103, + 0x4d0b4433, + 0xce854499, + 0x4e470d41, + 0x0103041d, + 0x3407051e, + 0xf3083103, + 0xfc4efd8e, + 0xc307d107, + 0x30272103, + 0x291e1027, + 0xec070419, + 0xe45b4153, + 0x5c114c14, + 0x1d40a7e1, + 0x27121e04, + 0xc4413b41, + 0x414709d3, + 0xe43bed07, + 0x34ab4e07, + 0x01031103, + 0x07d6f2f0, + 0x4efc8e03, + 0x993007fc, + 0x0d61080c, + 0x94221cf4, + 0x53210700, + 0x33e20721, + 0x99e00be4, + 0x4ce086e4, + 0x07008210, + 0x51c3c404, + 0xd4114e06, + 0x2412d221, + 0xe4c12407, + 0x8ce3c188, + 0x142b1207, + 0x432b4207, + 0x100c3027, + 0x400c1013, + 0x141a4013, + 0x3f6b3127, + 0x31c40a44, + 0x8e0b2752, + 0xc4d459fc, + 0xe499144a, + 0x334ad885, + 0x273045d8, + 0x27348601, + 0x8e031300, + 0x85e499fc, + 0x121e37e6, + 0x42d44623, + 0x3342072a, + 0x0b11d844, + 0x4499430b, + 0x104adc85, + 0x430b091e, + 0xdc854499, + 0x0c270a45, + 0x27fc8e10, + 0x27fc8e07, + 0x27fc8e06, + 0xfc8e100c, + 0x0000007f, + 0xffffff80, + 0xfffffc00, + 0x000003ff, + 0x00000100, + 0xf123f54e, + 0x00619007, + 0xd407f125, + 0xb3071307, + 0xad7ec207, + 0x99f015fe, + 0x53240895, + 0x071e1b07, + 0x11831c07, + 0xc1531103, + 0xcc03c433, + 0x0b090784, + 0xfe8e7e0c, + 0xb3446007, + 0x05103c27, + 0x27061ef3, + 0xf405204c, + 0x33c33b07, + 0x8d07fa21, + 0xf3357027, + 0x441d53c4, + 0x27ac19b3, + 0x071d1ed3, + 0x53f32147, + 0x19430b41, + 0x07713c4c, + 0x310d1edb, + 0x19091efd, + 0x83dc07ac, + 0x24d103d1, + 0x0027ffcc, + 0x5300925e, + 0x07c433c1, + 0x844c034c, + 0x040b0907, + 0xc90b1d07, + 0x99fe2f7e, + 0x4d8b85c4, + 0xce6f4fc6, + 0xfd116c06, + 0xd02b1607, + 0xdc48102b, + 0x41f45380, + 0x1e4d01ff, + 0x80df2c0d, + 0x53ffffff, + 0x01ff37f3, + 0x801c483d, + 0xff2af453, + 0x0d1e4101, + 0xff801f2c, + 0xf353ffff, + 0x3101ff20, + 0x0c530107, + 0x73010b1f, + 0x13000c01, + 0x000d0300, + 0x5a30be40, + 0x030d9bfd, + 0x0673200c, + 0xfc000f2c, + 0xf453ffff, + 0x121efefc, + 0x04000dc8, + 0xf5f3530f, + 0x1e3001fe, + 0xf1f45307, + 0x014001fe, + 0x03800df3, + 0x03820371, + 0x3573eea1, + 0x8ef103ff, + 0x000000f5, + 0xffffff80, + 0xa007f54e, + 0x61070061, + 0xc2071327, + 0x07fd8b7e, + 0x27bc0770, + 0x27902780, + 0x46077f5c, + 0x4d19490b, + 0xdc50d153, + 0x05402712, + 0x07561eb4, + 0x0344334d, + 0x0a07844c, + 0x1327040b, + 0x07fd5f7e, + 0x28c02bc7, + 0xc50780cc, + 0xcf2c0c1e, + 0xffffff80, + 0x01aef413, + 0x0bd4334c, + 0x85d499da, + 0x4127435c, + 0x84ab493b, + 0x0c530c07, + 0x730c0b1f, + 0x13000c01, + 0x031c0700, + 0xbe40000d, + 0x33fd597a, + 0xcfab100c, + 0xbc05c0ab, + 0xb4039103, + 0x93109cc4, + 0xf58e0807, + 0x0999f54e, + 0x61d00708, + 0x07f22300, + 0x07190781, + 0x076307a2, + 0xfcf67e54, + 0x1b07b007, + 0x7d070d07, + 0x99437c03, + 0x68be30dc, + 0x2707fcf8, + 0x1f07200b, + 0x32074007, + 0x03101c03, + 0x19071e41, + 0x031e1d3e, + 0xa8312311, + 0x2b4c07f4, + 0x0a410340, + 0x27c5d6c0, + 0x19091e41, + 0x1d210323, + 0xa8110313, + 0x1293c4f4, + 0x0000bfc0, + 0x070b8000, + 0x0711231b, + 0xf821be0d, + 0x072707fc, + 0x2b200b4c, + 0x07410340, + 0x0a1f0732, + 0x27c5d6c0, + 0x19091e41, + 0x1d31033e, + 0xa811031e, + 0x1e0103f4, + 0x1d231907, + 0x23110313, + 0x07f0a821, + 0x03cd077f, + 0xcc03107c, + 0x3393c454, + 0x2f071807, + 0x0d073027, + 0x07fc6a7e, + 0x072c0710, + 0x7e31270d, + 0x2707fc5f, + 0xb0071a07, + 0x0d073027, + 0x07fc527e, + 0x072c0710, + 0x2b31270d, + 0xfc457eb8, + 0x3027351e, + 0x2f071807, + 0xb4be0d07, + 0x1007fcf9, + 0x31272c07, + 0xa8be0d07, + 0xb007fcf9, + 0x30272707, + 0x0d071a07, + 0xfcf99abe, + 0x2c071007, + 0x31270d07, + 0x8cbeb82b, + 0xd007fcf9, + 0xd2d0da2b, + 0x15dbce18, + 0x1a070807, + 0x83be2d07, + 0x0556fd21, + 0xae39a419, + 0xae1da43d, + 0x1b070807, + 0xffbe2607, + 0x0a07fcf9, + 0x25071d07, + 0xfcf9f5be, + 0xf58ef203, + 0xd007f54e, + 0x81070019, + 0x1407f123, + 0x02c90ff6, + 0x15053499, + 0x23d325d2, + 0x3022a143, + 0x1e302743, + 0x0a33890a, + 0x3202319b, + 0x3fab3207, + 0x23d8d32d, + 0x0b23e309, + 0x05402728, + 0x99d12124, + 0x12990414, + 0x1941c405, + 0x44234207, + 0x991242d4, + 0x45860814, + 0x44a1d411, + 0xd435432b, + 0xd335031e, + 0x014123e0, + 0x21c02454, + 0x1922d472, + 0x25c01c1e, + 0x1a25d00d, + 0x025f26e4, + 0x4d5e3027, + 0x27e02702, + 0x022a5e10, + 0x995e3027, + 0x1e102700, + 0x2718074a, + 0x01e35e30, + 0x21032c1d, + 0xe307d421, + 0x40894b0b, + 0xdae10b08, + 0xd4110a03, + 0x44a13103, + 0x03e6e4ca, + 0x03100b11, + 0x99d421c1, + 0x4cda0444, + 0xa1d41112, + 0x0b41c244, + 0x210b2807, + 0xbc473027, + 0xd411cb1e, + 0x41e244a1, + 0xc0270203, + 0xd421dc1e, + 0x4099d311, + 0x16328904, + 0xc0070103, + 0x03143b89, + 0x53e02721, + 0x3c211ec1, + 0x1e3027e1, + 0x073c0703, + 0x0318074b, + 0x1d0b1e41, + 0x03310313, + 0x27300e11, + 0x03f49830, + 0xf08107e1, + 0xc05edef2, + 0x04cc9901, + 0x2c1d3103, + 0x2807d411, + 0x230b44a1, + 0x34cadc21, + 0x04c999ed, + 0xd321661e, + 0xc947d411, + 0x4b89c30b, + 0x08ca8914, + 0x0a071b07, + 0xfd570cbe, + 0x1b076007, + 0xfcbe0a07, + 0xcc89fd56, + 0x07700718, + 0xbe0c071b, + 0x07fd56f5, + 0x071b07a0, + 0x56e5be0c, + 0xab6fabfd, + 0xabafab7f, + 0x1e10270f, + 0x89d41119, + 0x4e9b1444, + 0x380b340b, + 0x3207391d, + 0x2103370b, + 0x03eb30d2, + 0x0be10711, + 0x27ae3ae6, + 0x23ec1e20, + 0xff9fc491, + 0x93ffffff, + 0x1101365e, + 0xa1d321d4, + 0x083e9942, + 0x89144a89, + 0x21031640, + 0x051e3027, + 0x141d4127, + 0x130b1807, + 0xf2983103, + 0xc007d329, + 0x4e47ba07, + 0xbe2b0123, + 0xf305ce2b, + 0xb1533127, + 0x342bc153, + 0xf0255407, + 0x0e074a07, + 0x1b074123, + 0x01232c07, + 0x6b075123, + 0x90277c07, + 0xf435f315, + 0x32075d1e, + 0x310b3a9b, + 0x3419380b, + 0x40274144, + 0x9103341d, + 0xce0e00cc, + 0x14861e61, + 0xe5071123, + 0x101e6107, + 0xb1ce0666, + 0x02f3310f, + 0x11110331, + 0x27b107fe, + 0xcc281e00, + 0x72ce0ee0, + 0x2324861e, + 0x07f01121, + 0x66101e72, + 0x0fc2cee6, + 0x4202f421, + 0x05072103, + 0xe027c207, + 0x100b051e, + 0xf3012e0b, + 0x1ea093ca, + 0x21d4317b, + 0x994342dc, + 0x1c1d08cc, + 0xc499081e, + 0x1d411308, + 0x03310314, + 0xa1d41111, + 0xe234ca44, + 0xd4315a1e, + 0x21143389, + 0x0c4ec2dc, + 0xcc99329b, + 0x1d300b08, + 0x990c1e3c, + 0x329b08c4, + 0x4113300b, + 0xe103341d, + 0xd3112103, + 0xda163489, + 0x1103d524, + 0x4489d411, + 0x2441d214, + 0x20270107, + 0xe71e080b, + 0x4431d421, + 0x4419430b, + 0x241d3103, + 0x2807d411, + 0x230b44a1, + 0x1eea34ca, + 0x27ff1e03, + 0x03d41d41, + 0x4ef58ef1, + 0x3bcf5bf0, + 0x4efe2bdf, + 0xbe0f07fc, + 0x0effd164, + 0x0bf00efc, + 0x004f27ff, + 0x29100790, + 0x004f2743, + 0x291007a0, + 0xfc3d1044, + 0x10ff1e03, + 0x1e03fc4d, + 0x2b0307ff, + 0x03000c04, + 0x2703fc0d, + 0x27010c41, + 0x0b040740, + 0x07fc4efe, + 0x5644bec0, + 0xff1ea7fd, + 0xc239fd4f, + 0x41271301, + 0x42ab433b, + 0x4027c43d, + 0xc50ef49b, + 0xfc8e3814, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0xff011bc0, + 0x0004d228, + 0x00000200, + 0x000001de, + 0x00000001, + 0x00000000, + 0xff011bcc, + 0x0004d230, + 0x00000200, + 0x000001de, + 0x00000001, + 0x00000000, + 0xff011ba8, + 0x0004d238, + 0x00000008, + 0x00000007, + 0x00000001, + 0x00000000, + 0xff011bb4, + 0x0004d240, + 0x00000008, + 0x00000007, + 0x00000001, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x03020100, + 0x11100504, + 0x15141312, + 0x23222120, + 0x31302524, + 0x35343332, + 0x43424140, + 0x50454544, + 0x53525251, + 0x55555454, + 0x61616060, + 0x62626261, + 0x63636363, + 0x63636363, + 0x63636363, + 0x63636363, + 0x03020100, + 0x11100504, + 0x15141312, + 0x23222120, + 0x31302524, + 0x35343332, + 0x43424140, + 0x51504544, + 0x55545352, + 0x63626160, + 0x71706564, + 0x75747372, + 0x83828180, + 0x0489fd4e, + 0xe40d89e8, + 0x4fab410b, + 0x99e8048d, + 0x4d2be70e, + 0x1fab1407, + 0x3ea7eaa6, + 0xc1fdefff, + 0x1e2bcc34, + 0x11e04cd8, + 0x076615d0, + 0xe8432723, + 0xcc23c1f4, + 0xf6e03cdc, + 0x4d0b4e07, + 0x039d3027, + 0xe4048de7, + 0xffff3ea7, + 0x9634adfe, + 0x0718061f, + 0x3915d441, + 0x9ddc01c1, + 0x2407e704, + 0xe4cfeea7, + 0x9e0489fd, + 0x40484f8b, + 0x01c5f2b0, + 0xc1fd8edc, + 0x0389bc04, + 0x03410bec, + 0xe4050c4c, + 0x3027e315, + 0x35a00489, + 0xf0140be3, + 0xdf1ed8f2, + 0xc51e4427, + 0xfd4efd8e, + 0x1f6b1007, + 0xdf03d187, + 0x0004d324, + 0x3f9b0853, + 0x93d40110, + 0x00d713f2, + 0x432b2e51, + 0xe19dd405, + 0x12249908, + 0x4fff3ea7, + 0x09e49dfd, + 0xe44d2449, + 0x69082499, + 0x0b321121, + 0x05e46d41, + 0x2707f6e2, + 0x0ef49b40, + 0xff8b0007, + 0x30274027, + 0xe39de405, + 0x102f9b08, + 0x420bd401, + 0xfd8ed405, + 0x42734007, + 0xf4e84103, + 0xfa4ee31e, + 0xc0e60499, + 0x14071343, + 0x00e342e0, + 0xf62244c0, + 0xc1014c4f, + 0x471ea402, + 0xefff4ea7, + 0xc043c1fd, + 0xa2e03cfc, + 0x9d442700, + 0x0489e604, + 0xe0048dc0, + 0xefff4ea7, + 0x9c43c1fd, + 0x18e03cfc, + 0xc0038901, + 0x049d4027, + 0xc4038dca, + 0xffff4ea7, + 0x9243adfe, + 0xa402c11f, + 0x27a20489, + 0xc5240b10, + 0x04c1a402, + 0x1242c2a8, + 0x0ba20e89, + 0x07e402e2, + 0xd004c1e4, + 0xe3c24301, + 0xe6049953, + 0x144e2027, + 0x4ea73127, + 0xc5fdcfff, + 0x029d7043, + 0x3a13c4e6, + 0x8b9e0489, + 0x3240cc4f, + 0x89c00c89, + 0x0ec1e001, + 0xffdea7a4, + 0x04c1fde4, + 0xec0389b8, + 0x4c034e0b, + 0x15d4050c, + 0x033107d3, + 0xa0028931, + 0x13074027, + 0x1fabd435, + 0xc1cee20b, + 0x99fa8ede, + 0x4ff6cc04, + 0x018900a2, + 0xc00389a0, + 0x210b210b, + 0x412b4207, + 0x4eca3103, + 0xc0038df6, + 0xffff4ea7, + 0x9043adfe, + 0xff3ea71f, + 0x34a9feff, + 0x0b891f94, + 0xc40389c0, + 0x4f8b4b1b, + 0x61114ccc, + 0x07a40ec1, + 0x9fcea713, + 0xac27fde5, + 0x8fdea70c, + 0x04c1fde5, + 0x054e0bb8, + 0x07ca15c4, + 0x0f4c8341, + 0x44333487, + 0x2027432b, + 0x4e23c235, + 0x05fee2dc, + 0x07da15d4, + 0x89410341, + 0x1407a003, + 0x1fabd235, + 0xb1cee30b, + 0xe60499ce, + 0x23271327, + 0x99ff295e, + 0x1427e604, + 0x1f5e2427, + 0x6b2407ff, + 0xff245e2f, + 0x27e60499, + 0x5e222712, + 0x3ea7ff0e, + 0x11d07fff, + 0x57e4e234, + 0x5e3e25ff, + 0x0000fef9, + 0x0004d554, + 0x0004d2f0, + 0xff010668, + 0x0000ffff, + 0x0004d200, + 0xff0102d8, + 0xff0102e8, + 0x0004d208, + 0xff0102e0, + 0xff0104a8, + 0x0004d210, + 0xff010678, + 0xd007f54e, + 0xd7edf193, + 0xe9f09300, + 0x2d0700cf, + 0x0ce3f3e3, + 0x7f1ce37f, + 0xc5f82c03, + 0xf1c530f0, + 0xa7f2a534, + 0xffffff4e, + 0x0a1443d1, + 0x0cf93fe6, + 0x6fff3ea7, + 0xa33411fd, + 0x3415104c, + 0xd3d6fe93, + 0x331ea700, + 0x1401fefd, + 0xe211e301, + 0x41e8432b, + 0x20e80d67, + 0x42070d0f, + 0x36333207, + 0x430b4433, + 0x4487422b, + 0xa14f1c27, + 0x184e23f3, + 0x2107fee4, + 0x11234e01, + 0x44033e05, + 0xf2983403, + 0xd396f293, + 0x11240100, + 0x93410322, + 0x00d38bf3, + 0x34052103, + 0x41233215, + 0x0d8f21ec, + 0x4ea73301, + 0x15fefd33, + 0x89212743, + 0xd3a9fad1, + 0x4ea701a8, + 0xc5fdcfff, + 0x312b6442, + 0x23f8d199, + 0x98d38d31, + 0x1bb61183, + 0x0160d3d1, + 0xce9dd499, + 0x31e41e34, + 0xf4930c6a, + 0x9300d33c, + 0x00d32ffe, + 0xe1054115, + 0x4105e115, + 0x0160d1b9, + 0x079dd19d, + 0xf932be0d, + 0x30f3c1fc, + 0x1934f2c1, + 0x803c0334, + 0x89f632c2, + 0xd4b998db, + 0xd1b901ad, + 0xb43b0191, + 0x0c0e14f0, + 0x016cd7a9, + 0x37071423, + 0x1403313b, + 0x03072b07, + 0x0fab2fab, + 0x402b4207, + 0xd6b94fab, + 0xd48d0166, + 0xda6ae09e, + 0xe84f8b0c, + 0x270bdc40, + 0xf0c12790, + 0x230bc914, + 0x5b0b0714, + 0xa7140301, + 0xfee01f3e, + 0x016adaa9, + 0xd3a9d355, + 0x40270104, + 0x81272027, + 0xd29da123, + 0x0cd49d08, + 0xd44dd40d, + 0xd89dd06d, + 0x12d38d09, + 0xd2b9ea87, + 0xa10301ac, + 0x0b7614f0, + 0x41073c07, + 0x4423370b, + 0x6ae0343b, + 0x043b0cad, + 0xd49d302b, + 0x0732020b, + 0x87345b32, + 0x2b2e0713, + 0x03212313, + 0xa7230b11, + 0x23430702, + 0x9dd22d41, + 0x41e80ad4, + 0x0f6b0c80, + 0x2d073123, + 0x030d209d, + 0x0bf3c021, + 0x0df0534d, + 0x0d419dfe, + 0x4b050401, + 0x032c4c03, + 0x044fc4b1, + 0xf30004d6, + 0xa9f9d499, + 0x070100d2, + 0x83412334, + 0x33330f4c, + 0x00274333, + 0x3e23a29b, + 0x23fffef4, + 0xfffef44e, + 0xdeb91247, + 0xd3c5015b, + 0xd0d4c5d4, + 0xc5a2d18d, + 0xd09da8da, + 0xa0d28dcd, + 0xe6ccd09d, + 0xa70acfef, + 0xfeffff4e, + 0x014143b9, + 0x0ac23fe6, + 0xa7fad489, + 0xdfffff3e, + 0x01a8d2a9, + 0xc5bcd3c5, + 0x4103b8d3, + 0x4127422e, + 0x99ccd49d, + 0x4438f8d4, + 0xd49d4127, + 0x273027cd, + 0xdcd3c540, + 0xc5e6d49d, + 0xd3c5a4d3, + 0xacd3c5b0, + 0xc5b4d3c5, + 0x0d07d8d3, + 0x27fbe97e, + 0x0000004f, + 0x90d3b980, + 0xf0d4c501, + 0x0b6b36e0, + 0x89f6d489, + 0x432bf4d3, + 0x47334783, + 0x00004fa3, + 0xd4c58000, + 0x45f353f0, + 0xf9f193fd, + 0xf29300d1, + 0x0100d220, + 0xc1f79335, + 0xf11500d1, + 0xd499f205, + 0xd84fe609, + 0x90d2b903, + 0x08d49901, + 0x2f6b2423, + 0x423bf485, + 0x14873407, + 0x312b3433, + 0x342bdc49, + 0xb9f4d189, + 0x870191d4, + 0x033c07a3, + 0x04d550af, + 0x0b323b00, + 0x4146e01c, + 0x81ae4907, + 0x0da305f0, + 0x0a709d73, + 0x7c4d7e2d, + 0x07f6d499, + 0x83340b20, + 0x9d432737, + 0x739d0c74, + 0xf0d3c10b, + 0x830f1c83, + 0xab418723, + 0x4524ab23, + 0x0ad49972, + 0x2da3402e, + 0x72450440, + 0xd2a97409, + 0x4f8b016e, + 0x242b4433, + 0x27412c10, + 0x7429402c, + 0x0170d3a9, + 0x44334f8b, + 0x342b2703, + 0x3c102353, + 0x403c2741, + 0x33533703, + 0x74412123, + 0x31232783, + 0x37832b33, + 0x3c3324ab, + 0x8123ab14, + 0xf67245f1, + 0x8904ad1f, + 0x4207ead2, + 0x4ce24123, + 0x1ea704a5, + 0xa9feffff, + 0x891f9214, + 0xc103c8d3, + 0x4fab432b, + 0x0720c4ca, + 0x110d27b1, + 0xfa5c7e64, + 0xbf7e0d07, + 0x92b4a9fa, + 0xc8d3891f, + 0x4fab432b, + 0x89e74cc2, + 0xfe93ead2, + 0x0100d098, + 0x03d349e4, + 0xeae40541, + 0x2704fe32, + 0x0c749d41, + 0x0fe6f081, + 0x74990507, + 0xc043e40c, + 0x60d4d102, + 0x0041e001, + 0xf6f18105, + 0xa70aa51f, + 0xfef457be, + 0xf89afc93, + 0x01c211ff, + 0x012101c3, + 0x2b231134, + 0xa541e841, + 0xa730e80a, + 0x0b33870a, + 0x7534013b, + 0xe640e8f3, + 0x11fe930a, + 0xaa8900d1, + 0x60e4d108, + 0x087a8d01, + 0x022141e0, + 0xf193f071, + 0x0100d044, + 0x41f2930e, + 0x4e0700d0, + 0x4a331001, + 0x4c532101, + 0xf9040b1a, + 0x03fb2c43, + 0x19140b00, + 0x33141902, + 0x43ab103c, + 0x42ab2833, + 0xedf87465, + 0x05c91000, + 0x0f001f27, + 0xee180200, + 0xa3800000, + 0x0000001f, + 0x93730920, + 0x00d0b3f0, + 0x04898307, + 0x038f8bc8, + 0x53ce0781, + 0x83480bcb, + 0xc1830f4c, + 0xf3452407, + 0x3c333c07, + 0x2924331b, + 0xab448770, + 0x07242b13, + 0x556207a0, + 0x89a18371, + 0x6e230879, + 0xe6fee2dc, + 0x0706e22f, + 0x0c2c2326, + 0xf393f235, + 0x1900cfb1, + 0xe6f35533, + 0x0704ee3f, + 0x544f034a, + 0xb50004d2, + 0x254119f4, + 0xe61ceef1, + 0xc9cff604, + 0xeaafe606, + 0x79f39306, + 0x322900cf, + 0x4f8b4007, + 0x04e541e8, + 0x3fe6f351, + 0x41e00549, + 0xf09306f0, + 0x1900cf70, + 0xca4fe604, + 0x070a0706, + 0xc301834c, + 0x3340cb41, + 0x07f13144, + 0x213f6b34, + 0xffbd2711, + 0x65b33bff, + 0x5b1b8bf1, + 0xe604c613, + 0x9302d2cf, + 0x00cffbf4, + 0xeaea4489, + 0x53074a84, + 0x01fabbf3, + 0x61057638, + 0x25f493f0, + 0x400500cf, + 0xbfabb107, + 0xcf0ef093, + 0x29030900, + 0xf6f04104, + 0x2704d70f, + 0x07ffff2d, + 0x27420732, + 0x0e012760, + 0x27002739, + 0x27490e31, + 0x27430730, + 0x27290e31, + 0x0e212730, + 0x07202719, + 0x190c3312, + 0x331a4c33, + 0x1c33183c, + 0x0e89ee1b, + 0xab202702, + 0xab43ab40, + 0xab42ab41, + 0xd8748546, + 0x0e0400ed, + 0xcec6f393, + 0xc6341900, + 0xff9d2744, + 0xe6f451ff, + 0x07042f4f, + 0xe611831a, + 0x9305331f, + 0x00cea1f2, + 0xce9ef493, + 0x09230900, + 0x89f09344, + 0xf29300ce, + 0x2d00ce88, + 0x2d230d0b, + 0x93040d29, + 0x00ce8bf0, + 0x0419f2b1, + 0x4fe62c1d, + 0xf33104f9, + 0x44334107, + 0x4f6b3221, + 0xffff3da7, + 0x345b0907, + 0x328b043b, + 0xf2314007, + 0x242543ab, + 0x1546c596, + 0xffff4de3, + 0x242549ab, + 0x4c334e07, + 0x1d4c5315, + 0x03e443e0, + 0x04ae44f4, + 0x04d74fe6, + 0x811942c4, + 0x12ec3374, + 0x0aaa4da3, + 0x0000ee83, + 0x854eabc0, + 0x11f47174, + 0xd1749544, + 0xe00160d4, + 0x7102e341, + 0x01f281f1, + 0x53148714, + 0x2ff61a1c, + 0xf3930293, + 0x11fff62c, + 0x01343130, + 0x0b031102, + 0x05310b21, + 0x93031502, + 0xfff617f1, + 0x079843fa, + 0x13011451, + 0x44874103, + 0x4205430b, + 0x41271341, + 0x34f53387, + 0xff023060, + 0xe00c7499, + 0xa7029e43, + 0xebffff3e, + 0x41dc3421, + 0x27c30716, + 0x27c43541, + 0x4f7e0f0c, + 0x354027f7, + 0xd8c321c4, + 0xfe93ee31, + 0xd100ce6c, + 0xe40160e4, + 0x99013d41, + 0xd4d10c52, + 0x4fe60160, + 0x282600a7, + 0xffff2ea7, + 0xe824d1fe, + 0x75f1931d, + 0x130100cd, + 0x24d54103, + 0x31231de8, + 0x40271305, + 0x990c549d, + 0x4ff609d4, + 0xf211016e, + 0x660c2499, + 0x60d4d148, + 0x9947b601, + 0x22990b24, + 0x0b44470a, + 0xf9c40742, + 0x011f9843, + 0x68ce23ff, + 0x3ff6fee0, + 0x749906b4, + 0xa842f00c, + 0xfdfe9305, + 0xe4d100cd, + 0x41c00160, + 0xa7735121, + 0xebffff2e, + 0x74612355, + 0x73712465, + 0x74812375, + 0x913824c5, + 0x3c23c573, + 0x24c574a1, + 0x93724140, + 0x00ccfbf0, + 0x4ea70301, + 0x45ebffff, + 0x5431c842, + 0xf1114507, + 0xf715f501, + 0xf1057407, + 0xe6fb495e, + 0x99ff7a2f, + 0x53990b54, + 0x0b44470a, + 0xfd312743, + 0x011f9843, + 0xa74127ff, + 0xfdcfff0e, + 0x997004c5, + 0x375e0c52, + 0x06f251ff, + 0xf6c4d625, + 0x27fdecaf, + 0x0000002f, + 0xfde55e10, + 0x10270d07, + 0x27f5b77e, + 0x89f4e843, + 0xd489e4d3, + 0xed43cee8, + 0x89ead089, + 0xd389f6d4, + 0x6ad1a9c8, + 0xe2d28901, + 0x400b310b, + 0xd38d4103, + 0x9ed389c8, + 0x41e3200b, + 0x8de2d28d, + 0x3f8bf6d4, + 0xf84d30ec, + 0x0bf4d489, + 0xf4d48d40, + 0x27f8425e, + 0x5effff8d, + 0x5299fd48, + 0xc323e40c, + 0xff4ea7fe, + 0x5399ebff, + 0x4841c10a, + 0xf60b5499, + 0x8700a33f, + 0x6841f544, + 0x5eff010b, + 0xd289fea6, + 0x8f21e4ea, + 0xf6f381fb, + 0xa7fb893f, + 0xfeffff1e, + 0x1f9214a9, + 0x2bc8d389, + 0xea4fab43, + 0x07fb75c4, + 0x110d27b1, + 0xf5b07e64, + 0x137e0d07, + 0x92b4a9f6, + 0xc8d3891f, + 0x4fab432b, + 0x5ee74cc2, + 0xd209fb53, + 0x12eed129, + 0x4207060c, + 0x4d0b4383, + 0x4b0d4399, + 0xc8230b3f, + 0x12daf120, + 0x073207ee, + 0x53338342, + 0x9dd44d42, + 0xd20d08d3, + 0x160a7299, + 0xead48927, + 0x41237349, + 0x890d43d2, + 0xd1899ed4, + 0xe84f8be2, + 0x99042b40, + 0x42ee0ad4, + 0x0d07fe4a, + 0xb57e1127, + 0xfe405ef4, + 0x41f54487, + 0xff010b88, + 0x99fe055e, + 0xd36908d4, + 0x0b9ad289, + 0xf824e243, + 0xf6f081fa, + 0x07fafd0f, + 0xf5887e0d, + 0xa7faf55e, + 0x8d302740, + 0xf37508a4, + 0x93fb285e, + 0xfff3b3f2, + 0x24312011, + 0x02010311, + 0x210b310b, + 0x03150205, + 0xf39ef193, + 0x0d34d2ff, + 0x240b1421, + 0x4027232b, + 0x02050415, + 0x13011451, + 0x44874103, + 0x4205430b, + 0x41271341, + 0x34f53387, + 0xff023060, + 0xe40c7499, + 0x99fd6643, + 0x30279cd4, + 0x31274486, + 0x6b0a7a99, + 0x954a073f, + 0x874433f3, + 0x2b432b3a, + 0x87f3914a, + 0x50cf03c4, + 0xc60004d5, + 0x21aff634, + 0x27c43105, + 0x27449630, + 0x07c44131, + 0xe66f6b63, + 0xe601ac4f, + 0x0701506f, + 0x14bc03ba, + 0xab478b07, + 0xce618333, + 0x100084f1, + 0x0d27ff02, + 0xefe6100b, + 0xc1510129, + 0x53184c33, + 0x1ff01d4c, + 0x10000000, + 0xc981052d, + 0x9ff64413, + 0x4ff605f9, + 0x4f7e00dc, + 0x07d01ef4, + 0x544f034a, + 0xb50004d2, + 0x47f1b1f4, + 0xe911194a, + 0x04d24c42, + 0x25400700, + 0xec4f8bf1, + 0x51fb1f41, + 0x1e4fe6f4, + 0xff1d2702, + 0x078107ff, + 0xfb6a5eb1, + 0x4a47f3b1, + 0xd24c4bed, + 0x3c1d0004, + 0xd25049ed, + 0xf3310004, + 0x4c334e07, + 0x53392515, + 0x43e41d4c, + 0x7481fc20, + 0x8312ec33, + 0xc00000ee, + 0x0aff4da3, + 0xfe714eab, + 0xee117485, + 0x7e95f071, + 0x70a50021, + 0x27fc225e, + 0x000fff1f, + 0xfa385e02, + 0x6c33f621, + 0xfb2f5e1d, + 0xbe5e1383, + 0xe9f193f8, + 0x148900ca, + 0x21f331ea, + 0x5248e231, + 0x07682101, + 0x47bfabb1, + 0x5044e94a, + 0x070004d2, + 0xfaf75e34, + 0x43334b07, + 0x44f1ce61, + 0xff021000, + 0xc151eda6, + 0x00001ff0, + 0x04571000, + 0x81184c33, + 0x1d4c53c9, + 0x9ff64413, + 0x4be60581, + 0xa433c4a1, + 0x1808a4f5, + 0xc489ff02, + 0x07c25126, + 0x6b35333b, + 0x0032f54f, + 0x33ff0218, + 0x3ef5104c, + 0xff021804, + 0x00004fa3, + 0x3e230400, + 0x35fde800, + 0x31c34134, + 0x27430bc4, + 0x45c43530, + 0xf6f391c3, + 0x31fbd23f, + 0x354123c4, + 0xfbc95ec4, + 0xfb7148f4, + 0x4fa37481, + 0x40000000, + 0x645e7485, + 0x0f1ff6fb, + 0x2dcff6ff, + 0xff085efb, + 0xc972f093, + 0x6bf29300, + 0x0b0d00c9, + 0xe05e290d, + 0x80ecf8fa, + 0x748100fc, + 0x4fa37351, + 0x40000555, + 0xf0003f83, + 0x7485fdff, + 0x2c5e7355, + 0x9ba1e0fb, + 0x65a1f401, + 0xd1f05301, + 0xd1f153f4, + 0xd1f253f4, + 0x010b01f4, + 0xe6290118, + 0x01012f6f, + 0x11b40183, + 0x3034eeb2, + 0xe8420703, + 0x07039140, + 0x87353334, + 0x07342b44, + 0x03390b4c, + 0x2727104c, + 0x34033001, + 0x44034005, + 0xb401f2a8, + 0xb4054103, + 0xb3118415, + 0x3c833103, + 0x27b3150f, + 0xa7ba0741, + 0xfdcfff2e, + 0xc514bc03, + 0xab476424, + 0xfed66fe6, + 0x83338b07, + 0xa7fdf15e, + 0xfee2271e, + 0x1f5ef135, + 0xff8d27f9, + 0xfead5eff, + 0xf1933027, + 0x1900c8c4, + 0x4c32e914, + 0xe60004d2, + 0xe6f9334f, + 0xf6f92fcf, + 0x93f92baf, + 0x00c8a7f3, + 0x215e3209, + 0x1e3227f9, + 0x21f331da, + 0xe6a4c631, + 0x93fc26cf, + 0x00c94ff0, + 0xe2ea0489, + 0x21fc1a48, + 0xf9625e68, + 0xf910cfe6, + 0xffff1d27, + 0x555e8107, + 0xff1d27f9, + 0x078107ff, + 0xfe555eb1, + 0x4c334e07, + 0x1e4c531c, + 0xecf87495, + 0xe000a940, + 0x09025b42, + 0x8b002774, + 0x2741084f, + 0x27742901, + 0x084f8b20, + 0x07212741, + 0x81300740, + 0x1a3c3371, + 0xab194c33, + 0xab320743, + 0x1b3c3314, + 0x13ab208b, + 0xab182c33, + 0x51718512, + 0x12ec3374, + 0x3fa33107, + 0x40000aaa, + 0x0000ee83, + 0xa33eabc0, + 0x0000004f, + 0x85745501, + 0xf9e15e73, + 0xb4018301, + 0x34eeb211, + 0x4207032c, + 0xffff4fe0, + 0xfe4bffff, + 0x21fece5e, + 0x5b8b8b68, + 0xf8b75e83, + 0x0017a2c0, + 0x93ff1ea3, + 0x00c793fb, + 0xf98f8ea7, + 0xc79ea7fe, + 0x985efef7, + 0x6df053fe, + 0x49f153f3, + 0x69f253f3, + 0x010b01f3, + 0x5e290118, + 0x7181fe83, + 0xf3538e1e, + 0xf453f348, + 0xfe53f348, + 0x3b01f348, + 0xe9014801, + 0x27fe6a5e, + 0xfa855e20, + 0x310b3103, + 0x07e0d489, + 0x2bcfabc3, + 0xec4f8b4c, + 0x07fbc641, + 0xf17c7e0d, + 0x2be0d489, + 0xc84f8b4c, + 0x7299f241, + 0xfbb15e0a, + 0xc5fcd4c1, + 0xd4c5bcd4, + 0xf55b5eb8, + 0x412b4427, + 0x243b3707, + 0xd49d302b, + 0x9832e20b, + 0x5e3207f4, + 0x4427f493, + 0x0b07412b, + 0x385e043b, + 0x279027f4, + 0xf4255ec0, + 0x016cd7a9, + 0x412b4427, + 0x347b3707, + 0xa7f3f35e, + 0xfd6fff3e, + 0x4ce33411, + 0x5e341510, + 0xf093f308, + 0x11ffef54, + 0xddf29304, + 0xfe9300c6, + 0x05ffef60, + 0x11211521, + 0x6df093e3, + 0x4115ffef, + 0x02114105, + 0x31053115, + 0x21052115, + 0x27f37f5e, + 0x0bf49b40, + 0xa70ef49b, + 0xfdcfffbe, + 0xaea79107, + 0x27feffff, + 0x4cb4c548, + 0xa3bd3227, + 0xc0271ffb, + 0x270efc9b, + 0x68b4c541, + 0x577e0527, + 0xbd4027f0, + 0x9b1ffba4, + 0xbcc50efc, + 0x6cbcc54c, + 0xc672f093, + 0x01940100, + 0x2b021103, + 0xa7410c43, + 0xa320ec20, + 0xa7c11ef2, + 0xf2985e20, + 0x3ea74827, + 0xc5fdcfff, + 0x0c274c34, + 0xf01c7e12, + 0x4ea73027, + 0xc5fdcfff, + 0x43c54c43, + 0xe6c4196c, + 0x1ef92d4f, + 0x04d4d1dc, + 0xead38901, + 0x438b4183, + 0x4fa34733, + 0x80000000, + 0x5ef0d4c5, + 0x1421f495, + 0x240bfe81, + 0x0e15232b, + 0x5d5e0205, + 0x2b3047f8, + 0xab420723, + 0x9ed48d4f, + 0x40e84f8b, + 0x0103fef9, + 0xcfabc007, + 0x185e9127, + 0x2b4203f3, + 0x15340542, + 0xf26a5e31, + 0x8c5e4027, + 0x539ff6f3, + 0x47043bf3, + 0x0cd89d33, + 0xd89d302b, + 0x0732020b, + 0x032e0732, + 0x27012721, + 0xf3535e13, + 0x71851027, + 0xa7fdd65e, + 0xfcd15e40, + 0xd49d4027, + 0xfa125e09, + 0xc8dafe93, + 0x23e43100, + 0x5ee43541, + 0xfc93f80f, + 0x11ffee14, + 0x01c301c2, + 0xa7340121, + 0xfeec57be, + 0x2311412b, + 0xf55f41ec, + 0x30ec30a7, + 0x4827f55d, + 0xcfff2ea7, + 0x4c24c5fd, + 0x437e0827, + 0xa74027ef, + 0xfdcfff3e, + 0xc54c34c5, + 0x2a5e6c34, + 0x932e07f5, + 0xfd7a78f0, + 0xfd1487be, + 0x4827ff1e, + 0xcfff3ea7, + 0x4c34c5fd, + 0x177e0b27, + 0xa74027ef, + 0xfdcfffee, + 0xc54ce4c5, + 0x445e6ce4, + 0xf6f481fc, + 0x5300924f, + 0x01f0effe, + 0xb5fc93eb, + 0xc211ffed, + 0x2101c301, + 0x23113401, + 0x410c412b, + 0x30c830a7, + 0x33430754, + 0x0b343346, + 0x093b0b34, + 0x01c11130, + 0x03131112, + 0x05310321, + 0x31131512, + 0x0d34d2c4, + 0x240bc421, + 0x4027232b, + 0x12051415, + 0xc301c451, + 0x44874103, + 0x4205430b, + 0x4127c341, + 0x34f53387, + 0xff023060, + 0x9908a08d, + 0x4fe69cd4, + 0xa08df4ad, + 0xf4a75e34, + 0x1ea74827, + 0xc5fdcfff, + 0x0a274c14, + 0x27ee817e, + 0xff2ea740, + 0x24c5fdcf, + 0x6c24c54c, + 0x93ff7d5e, + 0xffed43fc, + 0xf717bea7, + 0xff705efe, + 0xd55e40a7, + 0x0b42f0fc, + 0x07c4a1fa, + 0xf504330a, + 0x02180804, + 0x26c489ff, + 0x2b07c351, + 0x4f6b2533, + 0x180023f5, + 0x1207ff02, + 0xa3104c33, + 0x0000004f, + 0x042ef504, + 0x23ff0218, + 0xfde8001e, + 0xc3a11435, + 0x0ef5e30b, + 0xff021808, + 0x7126c489, + 0xf54f6bc3, + 0x02180023, + 0x104c33ff, + 0x180429f5, + 0x4fa3ff02, + 0x04000000, + 0xb65e1435, + 0x9e42d4fa, + 0x00fabc5e, + 0xff011bc0, + 0x0004f488, + 0x00000200, + 0x000001de, + 0x00000001, + 0x00000001, + 0xff011bcc, + 0x0004f490, + 0x00000200, + 0x000001de, + 0x00000001, + 0x00000001, + 0xff011ba8, + 0x0004f498, + 0x00000008, + 0x00000007, + 0x00000001, + 0x00000001, + 0xff011bb4, + 0x0004f4a0, + 0x00000008, + 0x00000007, + 0x00000001, + 0x00000001, + 0x4007fb4e, + 0x6b174c53, + 0x07c0074f, + 0xc0d027b1, + 0x0741ff4c, + 0xff3e8330, + 0x4ba67fff, + 0x0c230407, + 0x1f0ccc77, + 0x003ea32f, + 0x13078000, + 0x01e82027, + 0x4c23008c, + 0x6940c897, + 0xe43be307, + 0xd03bd107, + 0x2d074e07, + 0x49333e07, + 0x73172c53, + 0x24ab173c, + 0x272831c8, + 0x27fb8e00, + 0x773c2720, + 0x07574c27, + 0x07d47bd2, + 0x07e37be2, + 0x072d074e, + 0x5349333e, + 0x3c73172c, + 0xcc24ab17, + 0x3536da31, + 0xba602fd4, + 0xc8d10ccc, + 0xffffff3f, + 0x3fc0caff, + 0xffffffff, + 0x07b2051f, + 0x21c0cc42, + 0x01274013, + 0xfb8eb405, + 0x2b204c27, + 0x5be20740, + 0xabe03b34, + 0xd08e1ee3, + 0x0000002f, + 0xda1e9e80, + 0xfb8e0127, + 0x30133007, + 0x4c234307, + 0x9840cc20, + 0x2b204c27, + 0x07020743, + 0x5b043bd1, + 0x1ed0abd3, + 0x930a968b, + 0xfffef3f0, + 0x21010211, + 0x11032311, + 0x21053103, + 0x04312315, + 0x512243da, + 0x03030104, + 0x0b448741, + 0x41410543, + 0x87412703, + 0x6034f533, + 0x0bff0230, + 0xd9f093fe, + 0xcd1efffe, + 0x140b0421, + 0x4027132b, + 0x21052415, + 0xf84ed21e, + 0xf005f0a3, + 0x8207f009, + 0x93070f8b, + 0x64bef115, + 0xc007fd2e, + 0x0f8bf049, + 0xfd2e5abe, + 0x0c071007, + 0xfd2c17be, + 0xf029b007, + 0x0f8bab07, + 0xfd2e46be, + 0xf069c007, + 0x3cbe0f8b, + 0x1007fd2e, + 0xf9be0c07, + 0xdf27fd2b, + 0x44800000, + 0x1d07c007, + 0xbc070b07, + 0xfd2fddbe, + 0x272201c8, + 0x071907d0, + 0xfe7e7e0b, + 0x1807c007, + 0x757e0a07, + 0xb60c8bfe, + 0x93042708, + 0xfd776ff1, + 0xfd14959e, + 0x0c071d07, + 0xafbed027, + 0x0108fd2f, + 0x4d07d127, + 0xd40741c3, + 0xca1edf6b, + 0x83dbdfc6, + 0x4ef88ef0, + 0xff4ea7fc, + 0x4ed1fdef, + 0xd1070118, + 0x8918ec33, + 0x0389b602, + 0x1dec53b2, + 0xcea7d103, + 0x22fde39f, + 0xf0e41432, + 0xfc8e03fd, + 0x07bc0489, + 0xc2122b14, + 0x04893b42, + 0x071402c0, + 0xcc04c114, + 0x0bdc0389, + 0x05230b24, + 0x89c115c2, + 0x0389c002, + 0xb20489b6, + 0x420b320b, + 0x8dc80189, + 0x048db603, + 0x271103b2, + 0xb6028940, + 0x35b20389, + 0xc8018dc4, + 0x41034e07, + 0xef6be407, + 0xfe4eaa1e, + 0x02bc04a9, + 0x13534926, + 0x0e893107, + 0xd402c1c8, + 0x24113fab, + 0x1fab1407, + 0x42f813c2, + 0x0e1027e1, + 0xff655efe, + 0x1fab1e2b, + 0x5c5efe0e, + 0x03fe8eff, + 0x05331c0c, + 0x180001f5, + 0x02f5ff02, + 0xff021804, + 0x0e234027, + 0x35fde800, + 0x4efe0b04, + 0x0dfe93f7, + 0xe49900e4, + 0x07f423a9, + 0xce4fe671, + 0x27b12700, + 0x9007208c, + 0x9403a007, + 0xc027d027, + 0xf624ac03, + 0x0700b3cf, + 0x332c0709, + 0x0b4f0725, + 0x07102724, + 0x0b400738, + 0x03441941, + 0x224c1411, + 0xf4cc4df9, + 0x2d1d0004, + 0xf3402b0b, + 0xc2c4c103, + 0xff3ea7d3, + 0x3421e7ff, + 0x074f42dc, + 0x13dc27c3, + 0x4fff0ea7, + 0x103f9bfd, + 0x5154e4c1, + 0xc5432be2, + 0x2d9d54e4, + 0x12e49908, + 0x4909249d, + 0x4d0111e4, + 0x08e49924, + 0x2105e369, + 0x246d430b, + 0xf4e84327, + 0x40273027, + 0x249d2305, + 0x103f9b08, + 0x2154e4c1, + 0xc5340bc2, + 0x22d854e3, + 0x87df07bd, + 0x03ef0717, + 0xe40140dc, + 0x14f50427, + 0xff18002c, + 0x40072727, + 0x43014e0b, + 0x13f50403, + 0xff18002c, + 0xec03f278, + 0xdfedce20, + 0xf78ef403, + 0x4e5e0a07, + 0x27b227ff, + 0x335e108c, + 0x1e0389ff, + 0xe326f493, + 0x20028900, + 0x41a93103, + 0x21030210, + 0x24333433, + 0x021244a9, + 0x271913c2, + 0x2024ca30, + 0x012924ce, + 0x002f2704, + 0xab100000, + 0x0532ab34, + 0xcefe0b03, + 0x3f272613, + 0x04000000, + 0x01e242c2, + 0xab202704, + 0x0532ab34, + 0x01fe0b03, + 0x002f2704, + 0xab300000, + 0x0532ab34, + 0x27fe0b03, + 0x0000003f, + 0x4ebb1e0c, + 0x3ed007fd, + 0xbdf49395, + 0x43d100e2, + 0x34d80290, + 0x25402721, + 0x27d415d4, + 0x20d38940, + 0xd435d465, + 0xd455d445, + 0xd4013576, + 0x00004ea3, + 0x8ed40504, + 0x2540a7fd, + 0x1ed415d4, + 0x89f293df, + 0x24d100e2, + 0x41c001e4, + 0xa8249935, + 0x038949e6, + 0x9a248920, + 0x892543c2, + 0x23a91e04, + 0x41230120, + 0x4c83430b, + 0x3324870f, + 0xf9422b44, + 0x011d2843, + 0x013546ff, + 0x004da304, + 0x0b040502, + 0xff1f5efe, + 0xc107fc4e, + 0xcf6bd007, + 0xe38ef093, + 0x00ad7e00, + 0x2ea7c7a6, + 0xa9feffff, + 0xa9014223, + 0xce014424, + 0x30277834, + 0x1ffc23bd, + 0xf49b4027, + 0x6b1d070e, + 0x0301871f, + 0x04f4f80f, + 0x9bd85300, + 0x0401103f, + 0xe206f293, + 0x2b2e5100, + 0x9d040543, + 0x249908e1, + 0xff3ea712, + 0xe49dfd4f, + 0x4d244909, + 0x082499e4, + 0x32112169, + 0xe46d410b, + 0xdcf6e205, + 0xf49b4027, + 0x8b00070e, + 0x272027ff, + 0x08e49d40, + 0x3f9be205, + 0x0b040110, + 0x06040543, + 0xff3ea7c6, + 0x32bdfeff, + 0x40271ffc, + 0x8e0ef49b, + 0xbd3227fc, + 0x271ffc23, + 0x0ef49b40, + 0x4ea73127, + 0xc5fdcfff, + 0x7e5e6843, + 0x734d07ff, + 0xe8410342, + 0x4ebb1ef4, + 0x250499f9, + 0x4fe6c007, + 0x1ea700a5, + 0xd1fddfff, + 0xe601c014, + 0xd100944f, + 0x71020c13, + 0xd1032502, + 0x99021014, + 0x0435270d, + 0x021413d1, + 0x03454027, + 0x01a811d1, + 0xffff3ea7, + 0x9d210bff, + 0x02752504, + 0x34b9d123, + 0xdc830108, + 0x68d4ee0f, + 0x27d33301, + 0x20c38940, + 0x010cd4f5, + 0x2ea7ff00, + 0x56ffffff, + 0x0124b93e, + 0xff4ce001, + 0x24b90131, + 0xb4070101, + 0x4b07db07, + 0xd5334733, + 0xde23d40b, + 0x07fff73c, + 0x2720274d, + 0x4205283c, + 0xf3c84403, + 0xd2c1c451, + 0x61d40550, + 0xff4ea7c1, + 0xd1c5fd4f, + 0x33430164, + 0x23ab103c, + 0x1e50d2c5, + 0x8e00271c, + 0x8e0127f9, + 0x0124b9f9, + 0x07d40701, + 0x33d533b4, + 0x23d40b47, + 0xfff73cde, + 0x2d071c07, + 0x2c031803, + 0x01032794, + 0x03130124, + 0x05430b14, + 0x88240324, + 0xffaea7f0, + 0xae81fd4f, + 0xffff9ea7, + 0xd1a091fe, + 0xd1012894, + 0x33013093, + 0xc1e33303, + 0xd1c154d2, + 0x1b301b5c, + 0x0b240b4e, + 0x3090d513, + 0x289ed501, + 0x54d2c501, + 0x715cd1c5, + 0x70d4c1c3, + 0x0b50d2c1, + 0x70d4c543, + 0x0127a301, + 0x02ab033b, + 0xc522c499, + 0x4c5650d0, + 0x9920c189, + 0x110329c4, + 0x992ac399, + 0x143b28c2, + 0x2506132b, + 0x1da31153, + 0xc4998000, + 0x27c39926, + 0x92a94833, + 0x43ab0144, + 0xab101c33, + 0xff3ea741, + 0x2103ffff, + 0x010834d5, + 0x92ad0127, + 0xf98e0144, + 0x1b07a401, + 0xab144c33, + 0x50d0c504, + 0xf6be0c07, + 0x30a7fd00, + 0xffff4ea7, + 0x0143bdff, + 0x27a21e01, + 0x03e8070e, + 0xad7e1027, + 0x4b0ea7fd, + 0x56befff7, + 0xb007fd96, + 0xa7e900c8, + 0xffffff4e, + 0x010140bd, + 0x07febf5e, + 0x060d27b3, + 0x7e102764, + 0xb4b9fd88, + 0x4dee0108, + 0xee1efe89, + 0xc007f84e, + 0xdfffbea7, + 0x108c27fd, + 0xdfb6fd93, + 0x0c9c2700, + 0x4fffaea7, + 0xc5471efd, + 0x2f9b30b8, + 0x38d4c110, + 0x422bd351, + 0x9d38d4c5, + 0xd4990839, + 0x09349d12, + 0xa111d449, + 0xd499344d, + 0x05d26908, + 0x6d420b31, + 0x9b402734, + 0x00070ef4, + 0x349dff8b, + 0x9b300508, + 0xd3c1104f, + 0x30b0c538, + 0xd4c5430b, + 0x7e0c0738, + 0x0fc6fdd3, + 0x4ef88eb3, + 0xffcea7fc, + 0x4c27fdcf, + 0x50c4c510, + 0x017e1f6b, + 0xc54027fd, + 0xc4c550c4, + 0x4efc8e70, + 0x96c107fb, + 0x97bea709, + 0xfd93fef9, + 0x11fff870, + 0x01d301d2, + 0x11340121, + 0xc8412b23, + 0x30c81e41, + 0x3343071f, + 0x0b343346, + 0x053b0b34, + 0xa7fb8ec3, + 0xfef717be, + 0xf85efd93, + 0xa7d51eff, + 0x27e01e30, + 0x10270e0c, + 0xc81e9e3e, + 0xfc93fb4e, + 0x0700def0, + 0xffdea7bc, + 0xbd03e7ff, + 0xd3210150, + 0x40273158, + 0xfb8ed435, + 0x02b6c4b9, + 0x10270b27, + 0xb90c4c38, + 0x7602d0c4, + 0x35412745, + 0xfc7a7ed4, + 0x0b07dd1e, + 0x1efef77e, + 0xa7fc4ed6, + 0xfeffff4e, + 0x1f9043a9, + 0x011804a9, + 0x2bfc0ec1, + 0xc83f8b34, + 0x01d11631, + 0x1ec20100, + 0xf802890f, + 0x04ad4103, + 0xe20b0118, + 0xc55ef3f0, + 0x4ea7fc0e, + 0xd1fdefff, + 0xc1013001, + 0xe1c2d044, + 0x184c334a, + 0xd41d4c53, + 0xd4274144, + 0xcea7d42b, + 0xd1fde4bf, + 0xc2013404, + 0x04d11941, + 0x03a90110, + 0x410b014a, + 0x02a9430b, + 0xc405014c, + 0x4027c215, + 0x04a9c435, + 0x03890140, + 0x0b4103f8, + 0x4004ad13, + 0x3001d501, + 0xf0e10201, + 0xfc8ecafd, + 0xa9a11ec2, + 0x1e011804, + 0xa9fd4e90, + 0x07017e04, + 0xc61f6b12, + 0x4ea77b4f, + 0xd1fdefff, + 0x8901244d, + 0xdc33c603, + 0xca048918, + 0x2b1ddc53, + 0xc402893d, + 0x11c3430b, + 0x0bd803c1, + 0x894fab21, + 0x0e89b801, + 0x8d3415b4, + 0x048dc402, + 0x47e1c2ca, + 0x0489dcd6, + 0x2741c2bc, + 0x03892407, + 0x02212bc0, + 0xc1230723, + 0x0389d004, + 0x0b140bdc, + 0x6f4ea713, + 0x4105fde3, + 0x01894215, + 0xb40e89b8, + 0x04894d35, + 0x072e07c0, + 0x0bd12731, + 0x8d340b24, + 0x028db803, + 0xc60d8db4, + 0xdfabfd8e, + 0x1ec60d8d, + 0xa9f74ef8, + 0xa7014809, + 0xfdefff8e, + 0x7907910b, + 0x07ad7fab, + 0xaea70148, + 0xc1fde48f, + 0x03b9dc8c, + 0xcc330146, + 0x1dcc5318, + 0x04a93c2b, + 0x35060142, + 0x04ad430b, + 0x34070142, + 0x43073c0b, + 0x47ce4fab, + 0x4dc4d462, + 0x4907e307, + 0x432b3103, + 0xbfabb407, + 0xb30bd427, + 0x01d1dc2b, + 0x04d10138, + 0xc103013c, + 0xd11941c2, + 0xa9011404, + 0x0b014a03, + 0xa9430b41, + 0x05014c02, + 0x27a215a4, + 0x89a43540, + 0xe103f804, + 0x04d5410b, + 0x4e070138, + 0xbece4fab, + 0xc7fdf016, + 0x0cbd471b, + 0x4fab0146, + 0x270c45d0, + 0x5ef4e843, + 0x0cbdff7b, + 0x4ea70146, + 0xa9feffff, + 0xa91f9643, + 0x07014202, + 0xfc422b43, + 0xe980004d, + 0xa7820700, + 0xfdefff4e, + 0xb9f441c1, + 0x33012304, + 0x1c53181c, + 0xa9412b1d, + 0x66011e02, + 0xa7240b47, + 0xfeffff4e, + 0x1f9442ad, + 0x011e02ad, + 0x4ea73127, + 0xc5fdcfff, + 0x32076c43, + 0x4307310b, + 0x47ce4fab, + 0x5814d45b, + 0xe103e307, + 0xd9079e2b, + 0xc107dfab, + 0xd103e123, + 0xe43faea7, + 0x0c9c27fd, + 0xe42fbea7, + 0x834e07fd, + 0x34870f4c, + 0x432b4433, + 0x010c01d1, + 0xe2dc4e23, + 0x1003d1fe, + 0x03a40501, + 0x15310bc1, + 0x352027a9, + 0x15b305a2, + 0xf80489b9, + 0x410bb235, + 0x010c04d5, + 0xfdf0e103, + 0xa91c0748, + 0xbd011a02, + 0xce012301, + 0x0ca94128, + 0x2cce011e, + 0x0401d13a, + 0xf80d8901, + 0x012c0ed1, + 0x7fffbea7, + 0x072103d0, + 0x2504b932, + 0x0b3fab01, + 0x8623071d, + 0x05b10544, + 0xce380ee1, + 0x03ade8c3, + 0x01d5011a, + 0xf78e0104, + 0xff7fc4e4, + 0xf78eb41e, + 0x185e8307, + 0x000000ff, + 0x0004f4f0, + 0x0004f4bc, + 0x00aafafa, + 0x00ffffff, + 0x00ccffcc, + 0xff011dd8, + 0xf423f54e, + 0xd0072f07, + 0x10272403, + 0x4a273a27, + 0x31232105, + 0xf4b82403, + 0x1d031d07, + 0xf3350150, + 0xf1c5f325, + 0x14d4b93c, + 0x99de4902, + 0x442308d1, + 0xdb694f6b, + 0xa1077e07, + 0xd889743b, + 0x0ba43b98, + 0x9ad089b1, + 0x74863127, + 0xb43b3027, + 0x27103c33, + 0x27780e21, + 0xa39a0720, + 0xab20009d, + 0x112c3393, + 0x0b0e4127, + 0x92ab4027, + 0x270f4c33, + 0x27780e31, + 0x3394ab30, + 0x41270e3c, + 0x40270b0e, + 0x4c3393ab, + 0x26f19d0e, + 0x8d20fe8d, + 0xfb8d22f7, + 0x27fa9d24, + 0xac5694ab, + 0xc123c807, + 0xce07ce02, + 0xffff2ea7, + 0x9224a9fe, + 0x20d3a91f, + 0xab432b01, + 0x25c4ca4f, + 0x0c271027, + 0xfbc17e16, + 0x5e7e0d07, + 0xff3ea7fc, + 0x34a9feff, + 0xd3a91f92, + 0x432b0120, + 0x4cc24fab, + 0x98d889e0, + 0x044a7fe6, + 0xf489a576, + 0xa344c624, + 0xd108009d, + 0x86013cd4, + 0x30d4b945, + 0xee412302, + 0xe203994a, + 0xe603a487, + 0x890666af, + 0x3bee9ad3, + 0xd4d1066b, + 0x41c001e4, + 0xc0d3d120, + 0x22f48902, + 0x0b27f299, + 0x47478343, + 0xf9420b44, + 0x011f9843, + 0xba31e4ff, + 0x9ad38908, + 0x06453bee, + 0x089e7fe6, + 0xfeb6f053, + 0x4a070501, + 0x01e453d1, + 0x41b94d0b, + 0x31c002cc, + 0x1cac035a, + 0x33333a07, + 0x100034f1, + 0xac23ff02, + 0xe04cd81c, + 0x27230711, + 0xf1f4e843, + 0x02100023, + 0xe03cdcff, + 0xf2aff6f3, + 0x71fe9304, + 0xe011fff3, + 0x0201e431, + 0x210b0311, + 0x0205310b, + 0x43fa0315, + 0xe4510889, + 0x4103e301, + 0x430b4487, + 0xe3414205, + 0x33874127, + 0x306034f5, + 0xd4d1ff02, + 0x41e001e4, + 0xafe605e9, + 0xfc93048b, + 0xa7fff34c, + 0xfeec57be, + 0xc301c211, + 0x34012101, + 0x412b2311, + 0x048b41e8, + 0x048d30e8, + 0x01e4d4d1, + 0x6b0b6387, + 0x013541c0, + 0xc0d2d164, + 0x534a3302, + 0xf49d1a4c, + 0x0b630128, + 0x53338772, + 0xf39d1a3c, + 0x07ad0b29, + 0xcca3bd47, + 0x9d478302, + 0x63012af4, + 0xf49d4027, + 0x003dfc2b, + 0xd1072f08, + 0x1501e454, + 0x8a41e0f9, + 0xbdf29305, + 0x249900d9, + 0x0d4fe6a8, + 0x27f89903, + 0x992bf799, + 0x8ff62af4, + 0x448706f0, + 0x0b684bf1, + 0x54a9ff01, + 0xf3890120, + 0x83430b22, + 0xc4070f4c, + 0x4487c433, + 0xce23c42b, + 0xe6fee2dc, + 0x2705d27f, + 0x24f48930, + 0x4234f3b5, + 0xf4b54127, + 0x40e86401, + 0xf35305d4, + 0xf493fd88, + 0x0100d928, + 0x38f4c53a, + 0x4ff6a419, + 0xf489055f, + 0xd34ff622, + 0x71f05306, + 0xb10901fd, + 0xbe2fe6f2, + 0x6df35306, + 0xd13a01fd, + 0xf8029054, + 0x93056344, + 0x00d90bf6, + 0xc2996e01, + 0x24cfe007, + 0x6fff011d, + 0x230c0705, + 0xf4110c0c, + 0x39333707, + 0xf41543ab, + 0xfa35f925, + 0x33040499, + 0x4183102c, + 0x07184c33, + 0xab42ab3b, + 0x4543ab3f, + 0x06c399f4, + 0x9905c499, + 0x3c830601, + 0x3f4c833f, + 0x9928f299, + 0x4c330500, + 0xab36330c, + 0x3f2c8334, + 0xab3f1c83, + 0x121c3332, + 0x333f0c83, + 0xf4c1180c, + 0xab31ab38, + 0x8df09330, + 0x420900d8, + 0x48470001, + 0xfe65f355, + 0x42edf075, + 0x0004f4c8, + 0x013481e0, + 0x01307fe6, + 0x01328ff6, + 0xd876f493, + 0x994b0d00, + 0xbd8307c3, + 0xba53cc00, + 0x07333ce3, + 0x9d43ab4b, + 0xf19907c4, + 0x06c19d28, + 0x029054d1, + 0x40274458, + 0xf425f435, + 0x01e4d4d1, + 0xf3994140, + 0x0ad49926, + 0x044334ee, + 0x3627f499, + 0x14d4b94f, + 0x98d38902, + 0xf2894423, + 0xc2345b20, + 0xd4a92632, + 0xd3a90144, + 0x420b0140, + 0xcfabc407, + 0x3f8b3c2b, + 0x071131cc, + 0xf9877e0d, + 0x0140d4a9, + 0x4f8b4c2b, + 0xb9f141c8, + 0xd802b6d4, + 0x991a0c4c, + 0xf189b1d4, + 0x8b412322, + 0xb945f641, + 0x2602d0d4, + 0x98d48945, + 0x061714ea, + 0x9926f399, + 0x43ce0ad4, + 0x22f1892a, + 0xc298d489, + 0xd4b92141, + 0x4cd802b6, + 0xd499120c, + 0x8b4123b1, + 0xb9455641, + 0xf602d0d4, + 0x0706314f, + 0x7e11270d, + 0xe97efa4d, + 0xe6f311f8, + 0xa7f22137, + 0xe7ffff4e, + 0xf0314255, + 0xf1414065, + 0xf2514175, + 0xf0614285, + 0xf1714095, + 0xcea741a5, + 0x45e7ffff, + 0x75d4b9c3, + 0x624ff601, + 0x29d20902, + 0x6812eed1, + 0x83420702, + 0x994d0b43, + 0x3f4b0d43, + 0x20c8230b, + 0xee12daf1, + 0x42073207, + 0x42533383, + 0xd39dd44d, + 0x5ed20d08, + 0xc20dfbd5, + 0xfed28fe6, + 0xd746f493, + 0x99410900, + 0x3b0707c2, + 0xcc00bd83, + 0x53103c33, + 0x8331abb8, + 0x4b07332c, + 0x42ab6305, + 0x9907c49d, + 0xc29d28f2, + 0x2bf39905, + 0x5e04c39d, + 0xf489fec0, + 0x644fe622, + 0x009da3fc, + 0x6078ea10, + 0x9ad489fc, + 0xcde3c907, + 0x4bee0800, + 0xf493058f, + 0xd100d728, + 0x0701e443, + 0xb94d0b4a, + 0xc002cc40, + 0xac035a31, + 0x333a071c, + 0x0034f133, + 0x23ff0210, + 0x4cd81cac, + 0x230711e0, + 0xf4e84327, + 0x100023f1, + 0x3cdcff02, + 0xafe6f3e0, + 0xfe930507, + 0x11fff014, + 0x01e431e1, + 0x0b131112, + 0x05300b20, + 0xfa131512, + 0x51052b43, + 0x03e301e4, + 0x0b448741, + 0x41420543, + 0x874127e3, + 0x6034f533, + 0x07ff0230, + 0x0340270f, + 0x15f47504, + 0x025f5efc, + 0x00009ea3, + 0xfbb25e01, + 0xd6a6f093, + 0x2004a900, + 0x22f38901, + 0x0b27fb99, + 0x0f4c8343, + 0xc4077b47, + 0xf4b071e9, + 0x44870004, + 0xc42bc433, + 0x2330f1c5, + 0xfee2dcce, + 0xf62af499, + 0x870337bf, + 0x6849f144, + 0x01ff010b, + 0x3740e864, + 0x074b8703, + 0xbcaf03ab, + 0xc50004f4, + 0xa41934f4, + 0x037f4ff6, + 0xf622f489, + 0x5303bb4f, + 0x01fa6bf0, + 0x24f48908, + 0x039d4fe6, + 0xfa62f353, + 0x54d13a01, + 0x44d80290, + 0x24cfe07a, + 0x87ff011d, + 0x232c0700, + 0xf8250c2c, + 0xc499fa35, + 0x33390707, + 0x3fab104c, + 0xf34534ab, + 0x99052299, + 0xf39905c4, + 0x3f2c8328, + 0x333f4c83, + 0x4633122c, + 0x3c8342ab, + 0x5543ab3f, + 0x34f4c1f4, + 0x44f11707, + 0x0004f4b4, + 0xf4c01f03, + 0x12090004, + 0x9d83190d, + 0xf475cc00, + 0xf2654907, + 0xc49d4a53, + 0x30f0c107, + 0x70ed4027, + 0x0004f4c8, + 0xc49dc00d, + 0x28f19904, + 0x5e05c19d, + 0xf299fd34, + 0x070b0729, + 0x7e228716, + 0xcfe4f183, + 0xff011d24, + 0xf353ff7d, + 0x3201f9d0, + 0x93ff795e, + 0xffeeabfc, + 0xc301c211, + 0x34012101, + 0xf457bea7, + 0x11412bfe, + 0x7941ec23, + 0xec30a7fb, + 0x27fb7730, + 0x7e102709, + 0x595ef61f, + 0x99fe93fb, + 0xe011ffee, + 0x0201e431, + 0x210b0311, + 0x0205310b, + 0x34f20315, + 0xe421fb12, + 0x232b240b, + 0x04154027, + 0x035e0205, + 0x3cf0c1fb, + 0x09f3ba7e, + 0xeed129d2, + 0x27fd9c21, + 0x9dbc0740, + 0xc42709d4, + 0x27f63f7e, + 0xb0b44540, + 0xf6367efc, + 0x011ad3a9, + 0x0148d4a9, + 0x071734ce, + 0x7e10270d, + 0x4327f785, + 0xd3a9f4e8, + 0xd4a9011a, + 0x43ce0148, + 0x14d3b9eb, + 0x98d28902, + 0x012cdcd1, + 0x0120d1a9, + 0x0144d0a9, + 0x342340a7, + 0x01eedea9, + 0x235bc405, + 0x020b1e0b, + 0x02b6d4b9, + 0x0120d1ad, + 0x0144d0ad, + 0x4f0c4cd8, + 0x02d0d4b9, + 0x471e45b6, + 0x10270d07, + 0xa27e2127, + 0xc4d489f6, + 0xcecad289, + 0xd4a9ef42, + 0x48c602bc, + 0x89b6d389, + 0x34cabcd4, + 0x891a1e0c, + 0xd489b6d3, + 0x0e43c2bc, + 0x11270d07, + 0xa9efc67e, + 0x9602bcd4, + 0xcad28941, + 0xa7d8d3c1, + 0x8d341540, + 0xd4d1c4d2, + 0xd38902c0, + 0x0b410398, + 0x0341e343, + 0xc0d4d5f4, + 0x07f58e02, + 0xf5b77e0d, + 0xee9ad389, + 0xf8f999b3, + 0xa3f99531, + 0x2704009d, + 0x030f0740, + 0x15f47504, + 0x35f425f9, + 0x55f445f4, + 0x7ef465f4, + 0xc95ef1bd, + 0xe454d1fb, + 0x27f91501, + 0x7a41e460, + 0x070f07fa, + 0x7e040316, + 0xb15ef16b, + 0x22f289fb, + 0xfbba2fe6, + 0x02c0d4d1, + 0x41233027, + 0x4783420b, + 0x43fd4447, + 0xff011f98, + 0x1f9943fd, + 0x3127ff01, + 0xcfff4ea7, + 0x6c43c5fd, + 0xe0fb935e, + 0x8901ce41, + 0x4ff622f4, + 0xf053017b, + 0x0901f810, + 0x0fe6f0b1, + 0x54d1018a, + 0xf1530290, + 0x1a01f808, + 0xfaa144fc, + 0x0729f299, + 0x27228716, + 0xefa17e00, + 0xd39ef693, + 0x996e0100, + 0xcfe407c2, + 0xff011d24, + 0xf153fa95, + 0x1001f7e4, + 0x27fa915e, + 0x24f48900, + 0x4ff6f0b5, + 0x1127fa34, + 0xf1b56401, + 0xfa3040ec, + 0x1f070027, + 0x01f45a7e, + 0x5df293f0, + 0x039900d3, + 0x49f19344, + 0x231d00d3, + 0x99460499, + 0x4c834503, + 0x1f3c831f, + 0x43ab4533, + 0xf1931309, + 0x0500d334, + 0x93020914, + 0x00d327f1, + 0xf77ef453, + 0x0138f1c5, + 0x1123ce4a, + 0x447e1027, + 0x93f401ef, + 0x00d30ff2, + 0x240d4409, + 0x8e7e0807, + 0xf9e25eed, + 0x49f14487, + 0xff010b88, + 0x40ec6401, + 0x0b07fccd, + 0xf07e1f07, + 0x07f001f3, + 0x440299ab, + 0xf4bcaf03, + 0xa21d0004, + 0x99460499, + 0x4c834503, + 0x1f3c831f, + 0x43ab4533, + 0xf3c53b87, + 0x03870734, + 0x04f4b08f, + 0xc1010900, + 0x830934f2, + 0xf530f1c5, + 0x04f4b424, + 0x0b13ce00, + 0xd87e1b07, + 0x30f3c1ee, + 0x0b07830d, + 0x19ed287e, + 0x854fe6a4, + 0xaf41e0fc, + 0x22f48900, + 0x00834ff6, + 0xf6eaf453, + 0xf4894801, + 0x5346d624, + 0x01f6e7f3, + 0xfc805e3a, + 0x4bf14487, + 0xff010b88, + 0x09f9115e, + 0x30f0c1c4, + 0x537004ce, + 0x01f6cbf2, + 0xfc645e2a, + 0xf49d4127, + 0xf8cd5e2b, + 0xf6b6f153, + 0x465e1801, + 0xadf453fc, + 0x5e4a01f6, + 0xf153f943, + 0x1901f6a4, + 0xc1f92e5e, + 0xf29338f1, + 0x0900d24c, + 0xce242913, + 0xf0b15534, + 0xf686f453, + 0x0ff64901, + 0xf2c1fe7a, + 0x09c40938, + 0x3634ce23, + 0xf67af453, + 0x0c5e4a01, + 0xc874e9f9, + 0xc10004f4, + 0x04ce30f0, + 0x5df25333, + 0x5e2801f6, + 0xf153ff72, + 0x1a01f658, + 0x27fbf55e, + 0x5ea02790, + 0x8027f8e7, + 0xe75ea027, + 0x41f353fb, + 0x5e3a01f6, + 0xf353f8d7, + 0x3901f638, + 0x53fe235e, + 0x01f62ff1, + 0xff405e18, + 0xf61af153, + 0xcb5e1501, + 0x7e0d07f7, + 0xe55eed9a, + 0x270827f9, + 0xf2957e10, + 0x93f7245e, + 0xffeaf7fe, + 0xe431e111, + 0x13111201, + 0x300b200b, + 0x13151205, + 0xfafd34f2, + 0x1a15e421, + 0x232b240b, + 0xf05e1205, + 0x15e421fa, + 0x2b240b0a, + 0x5e020523, + 0x0d07f76e, + 0x8e7e2027, + 0xf9c95ef3, + 0x240be421, + 0x4027232b, + 0x12051415, + 0xa3faca5e, + 0x5e0400cd, + 0x0000fadb, + 0x0000004f, + 0x00000001, + 0x00000000, + 0x00020000, + 0x07f54e00, + 0x071d07d0, + 0x073d072d, + 0x03f7234d, + 0x0301500d, + 0x03017c1d, + 0x0302d42d, + 0x03018c3d, + 0xc502944d, + 0xf1c568f0, + 0x58f2c54c, + 0xc550f3c5, + 0xbea748f4, + 0xd1ffffff, + 0xe60a14b4, + 0xa709bc4f, + 0xfd5fffce, + 0x4ca3c411, + 0x93c41510, + 0x00d0c7f1, + 0xfd330ea7, + 0x010401fe, + 0x2b121113, + 0xf541e843, + 0x1220e80b, + 0x0742070c, + 0x33363332, + 0x2b430b44, + 0x7dfc5342, + 0x014487ff, + 0x184e23c1, + 0xf2c1fee4, + 0x40f4c54c, + 0x41073407, + 0x11233e01, + 0x34032e05, + 0xf4982403, + 0xd07ef293, + 0x11240100, + 0x03410323, + 0x15240531, + 0xec412323, + 0x930bc131, + 0x00d067f3, + 0xbea73401, + 0x25fefd33, + 0x7edca9b4, + 0x2cd3a901, + 0xa7412702, + 0xfdcfffee, + 0xc55cfcc5, + 0x3c2b64e4, + 0xd4b93123, + 0xd3ad017c, + 0x41f802bc, + 0xd4b9092c, + 0x4cf802b6, + 0xb9090a0c, + 0xe602d0d8, + 0xa909488f, + 0xa902bcd2, + 0xc50336de, + 0xd3b960f2, + 0x21030231, + 0xc130f3c5, + 0xd3b930fb, + 0xf26502b8, + 0xd4b92b3b, + 0xf2650230, + 0x02b9dcb9, + 0xf265237b, + 0xb934fcc5, + 0x610339d1, + 0x35c37bf0, + 0x33c13bfe, + 0x38d2b944, + 0xa5437b03, + 0x60fbc1fc, + 0x31270433, + 0x0334dca9, + 0x313b013b, + 0xf395f065, + 0xfc25fbb5, + 0xf0c13e07, + 0x16deb95c, + 0x30dbd102, + 0x38fec503, + 0xc53cf0c5, + 0x4fab64fb, + 0x0af32ff6, + 0xab07fc91, + 0xa153ac2b, + 0xe030fec1, + 0x270b61e2, + 0x61f07500, + 0x2b413bf7, + 0x232ff674, + 0x64f9c10b, + 0x9c2bfc91, + 0x40279153, + 0x7ff6f405, + 0xd48d08b1, + 0xeed78de8, + 0x8be8d489, + 0x124f8b3f, + 0xa9430743, + 0x8d0336db, + 0xbf8be8d4, + 0x07eed489, + 0x54fbc53b, + 0x31734f8b, + 0x43074312, + 0x89eed48d, + 0xd589eedc, + 0x64f4c1e8, + 0x0764fec1, + 0x9b459b3c, + 0x0b01273e, + 0x0b013b4a, + 0xc51027a3, + 0xd4c544fc, + 0xe4dac5e0, + 0x156cf0c5, + 0x85cd07fd, + 0xe6f281f1, + 0xc1084a2f, + 0xf381e4d8, + 0x34964127, + 0xf2614027, + 0xf371fe91, + 0x347b247b, + 0x6e07b207, + 0x621bb32b, + 0xf281f3a1, + 0xbe2b345b, + 0x632b2f6b, + 0xa807b32b, + 0x08af2fe6, + 0x8144f4c1, + 0xc17407f0, + 0x7fab54f4, + 0x1027407b, + 0x9407472b, + 0x9df0c19d, + 0x9fabf2c1, + 0xd133b8c2, + 0x070330d1, + 0xbe082b0b, + 0xc1fd297d, + 0x0f6b64f4, + 0xc09d409b, + 0x4a480bf0, + 0x2340074b, + 0xf0c49d41, + 0xc1f0c499, + 0x410364fa, + 0xa49b4f6b, + 0xc49da80b, + 0x994907f0, + 0x4f8bf0c3, + 0x43074312, + 0x942b4f6b, + 0xc49db907, + 0xe2bfabf0, + 0xe606d56a, + 0xd106d1bf, + 0x070330d1, + 0xbe0a2b06, + 0xc1fd292d, + 0x0f6b64f4, + 0x4a0b409b, + 0x4af2c09d, + 0x23400746, + 0xf2c49d41, + 0x27f2c499, + 0x9d410310, + 0x4b07f2c4, + 0x8bf2c399, + 0x0743124f, + 0xf0c29943, + 0x720b4f6b, + 0x0bf2c49d, + 0x11370774, + 0xc13fabf4, + 0xfec164fb, + 0xea438d6c, + 0x07c2beee, + 0x0338d4b9, + 0x07ba42e0, + 0xf111f081, + 0x12030103, + 0xf115f085, + 0x02e4c103, + 0xd4d1feed, + 0x3ea7032c, + 0xd5fddfff, + 0xd1022c34, + 0xc10330d3, + 0xcea734f2, + 0xd5fddfff, + 0x530230c3, + 0x34f2c522, + 0xc1e0d2c1, + 0xc2d530fb, + 0xd3c1023c, + 0xd5f4b1e4, + 0xb90240c3, + 0xc102b8d2, + 0x4b3b34fe, + 0x4433e27b, + 0xe783425b, + 0x3344f0c1, + 0x4d8310ec, + 0x5d833fff, + 0xfec53fff, + 0xff0d8334, + 0x33e4ab1f, + 0xced5105c, + 0x50ab0234, + 0x0238c5d5, + 0x99f2d499, + 0xf1c1f1d2, + 0x38fbc140, + 0x833f4c83, + 0x13891f2c, + 0xf0de9996, + 0x33f3d099, + 0x102c3348, + 0xb4861127, + 0xfcc11027, + 0x8342ab40, + 0x317b3fec, + 0x0c834eab, + 0x89fe311f, + 0x0c3394c2, + 0xff3d8318, + 0xabf1213f, + 0xff2d8340, + 0xff0ea73f, + 0x3c33fddf, + 0xffed8310, + 0x4404d53f, + 0x3332ab02, + 0x1d8310ec, + 0x03d53fff, + 0xfe350224, + 0xe1abf3b1, + 0x02280ed5, + 0x0338d2b9, + 0x34864127, + 0xfbc14027, + 0x184c333c, + 0x31272383, + 0x3027b486, + 0x3c3342ab, + 0xd543ab19, + 0xb9022004, + 0xc10231d4, + 0xd3b960f6, + 0x643b0232, + 0x05403ff6, + 0x01f0d1a9, + 0xc0279027, + 0xd2b9e027, + 0x24f00215, + 0x242305c0, + 0x025b0607, + 0xd3a92403, + 0x402701ee, + 0xd49d3123, + 0x4dd40d0c, + 0x88d4a9d4, + 0xa73e0b01, + 0xfee013be, + 0xe027a127, + 0xd06ddb55, + 0x9d08de9d, + 0xd48d09da, + 0xb9338712, + 0xf00230db, + 0xb9056b24, + 0x0b01ead4, + 0x3b24231c, + 0x9d4ae012, + 0x07023b07, + 0x9d402b41, + 0x4b020bd2, + 0x425b4b07, + 0xe2872407, + 0x3123e22b, + 0x320be103, + 0x420702a7, + 0xd32d4123, + 0x070ad49d, + 0x6c41e814, + 0x6b420707, + 0x0741230f, + 0x0d309d3d, + 0xf4c03103, + 0xd5b91d0b, + 0x1e9d02cf, + 0x105fe60d, + 0x0c61e805, + 0x23760705, + 0xa4d4a971, + 0xe84f8b01, + 0x2704df40, + 0x90d4d1c0, + 0xf8fc4502, + 0xdd01004d, + 0xb8d3b904, + 0x7b470702, + 0x73240743, + 0x07020721, + 0x07028334, + 0x073283e2, + 0x87838714, + 0x07340790, + 0x83e18302, + 0x47114711, + 0x830483ee, + 0xd1810b34, + 0x0b02fcdc, + 0x3333339e, + 0x08d1d103, + 0x0b830b03, + 0xe327e390, + 0x9b4c9b47, + 0x33843321, + 0x0b840b94, + 0x0cd4d192, + 0x00dad103, + 0x53cb0703, + 0x9bc49bc1, + 0x60fec1ab, + 0x037fac03, + 0xd0a97fcc, + 0xace30320, + 0x7fcce37f, + 0x02f8d4d1, + 0x0304d3d1, + 0xae9bce9b, + 0xa40b062b, + 0x0b12c30b, + 0xf1c10b07, + 0x081fe65c, + 0x8df25304, + 0xb9d1b9fa, + 0x272e0102, + 0x726fe640, + 0xe6302701, + 0xe6015cef, + 0x5301546f, + 0x01fa77fb, + 0x831253b2, + 0xab14ab17, + 0xffeea713, + 0x12abfddf, + 0x01d4e1d5, + 0xf041e025, + 0x013c0ff6, + 0x01ecd4b9, + 0x00914fe6, + 0x0290d4d1, + 0x01004dd8, + 0x9cd4d151, + 0xb8d0b901, + 0x14dbd102, + 0xc04cd803, + 0x73270720, + 0x5e20e821, + 0x1cd4d106, + 0xd1237303, + 0x9b0318d3, + 0xff1ea724, + 0xc20bfddf, + 0x01f413d5, + 0x103b1827, + 0xafbe0707, + 0x2ea7fd25, + 0x27fddfff, + 0xd824d544, + 0x10d3d101, + 0x0bb09b03, + 0xbc23d5ab, + 0x27562601, + 0x27648641, + 0xff3ea740, + 0x34d5fddf, + 0xf4410198, + 0xd4d146c6, + 0x4c58019c, + 0xffbea7c0, + 0xb9d5fddf, + 0xbcd501e4, + 0xcea701e8, + 0xd5fddfff, + 0xd5019cca, + 0xb901acc8, + 0x8302b6da, + 0xafe60cac, + 0xd8b900b1, + 0x8fe602d0, + 0xd4d100a9, + 0xd3d10284, + 0xdcd101c0, + 0x4ce001c4, + 0xf405d15a, + 0x048c5b4c, + 0x04864ff6, + 0x89e8d089, + 0xde89ead2, + 0x894007ee, + 0x422becd1, + 0x3e07439b, + 0xdfffbea7, + 0xd5312bfd, + 0x9b0114b4, + 0x18b3d53c, + 0x2b202b01, + 0x1cb3d51e, + 0x1921c801, + 0x0324d3a9, + 0x0322d4a9, + 0x402b302b, + 0x32073212, + 0x047240e8, + 0x045b43fa, + 0x0027c027, + 0xa91911c8, + 0xa9032ad3, + 0x2b0328d4, + 0x124e2b3e, + 0xe8310731, + 0xfa044e40, + 0x27044343, + 0x1e402720, + 0xac5fe635, + 0x5e2027fe, + 0xd4d1fead, + 0x41fc01c0, + 0x1e5efed1, + 0xc33507ff, + 0x33318331, + 0x885e103c, + 0x22dca9fe, + 0x24d0a903, + 0x33460703, + 0x2b042b44, + 0x272027c4, + 0xffeea740, + 0xecd5fddf, + 0xe0d50150, + 0xe2d50158, + 0xe4d50144, + 0x6fe60148, + 0x3027022b, + 0xdfff0ea7, + 0xacd4a9fd, + 0x6403d502, + 0xee42e001, + 0xa7732703, + 0xfddf231e, + 0x02d0d8b9, + 0x5558fbc1, + 0x615707f1, + 0x06369bb3, + 0xd18bc6ac, + 0xd10284d4, + 0xd101c0da, + 0x8901c4d9, + 0xd089e8d3, + 0xead189ee, + 0x89f4de99, + 0xdc99ecd2, + 0x5a4ce0f5, + 0x4cf4036a, + 0xe601c85b, + 0x1e036a4f, + 0x9b4007ff, + 0x13499b3a, + 0x00401330, + 0x31340773, + 0x0bf251b4, + 0xa824c543, + 0xb4018506, + 0x2405430b, + 0xf5f87123, + 0xd4b90178, + 0xd1a9017d, + 0x34070184, + 0x4c834123, + 0xeed2a90f, + 0x33333301, + 0x9be02743, + 0xf43e2321, + 0x4e23fffe, + 0x47fffef4, + 0xb9b02701, + 0xd501dfdc, + 0xd502c4d7, + 0xd5012cd3, + 0x8d0128d4, + 0xd2d5fad0, + 0xdebd0100, + 0xdead0125, + 0xd18d02cc, + 0x24dbbdf8, + 0x37cfe601, + 0xff4ea701, + 0x43b9feff, + 0x3fe60141, + 0xdea9012a, + 0x4ea7017e, + 0x07dfffff, + 0x2cd2a93e, + 0x14d4d502, + 0x10d4d501, + 0xee310301, + 0xb903e123, + 0x38017cd4, + 0xbd412744, + 0xb90125d4, + 0x890214d3, + 0x402798d0, + 0xd2893423, + 0x7bd169f8, + 0x38d4d503, + 0xfcd4c501, + 0x0108d4d5, + 0x0104d4d5, + 0x010cd4d5, + 0x0130d4d5, + 0x1fe6029b, + 0x400703a1, + 0x0304efe6, + 0x0134d4d5, + 0x013cd0d5, + 0x627e0d07, + 0xb6d4b9ea, + 0x0c4c3802, + 0x02d0d4b9, + 0x02ed4ff6, + 0x357e0d07, + 0x68f0c1ed, + 0x27e93b7e, + 0x75d4bd41, + 0x50d3d101, + 0x50f4c101, + 0x01122c27, + 0x05440340, + 0xa8340330, + 0x88d2d1f2, + 0x7dd1b901, + 0x8cd3d101, + 0x87dbb902, + 0xbcdca901, + 0xb8deb902, + 0x31d0b902, + 0x7ed4a902, + 0x64d2d501, + 0x77d1bd01, + 0x35f25301, + 0x68d3d5f7, + 0x76dbbd01, + 0x70dcad01, + 0x78debd01, + 0x79d0bd01, + 0x96211901, + 0xb9112744, + 0x890230d3, + 0xd2d198d4, + 0x439b0154, + 0xd3b94433, + 0xd4d502cf, + 0xf4c1016c, + 0x7ad3bd48, + 0x72d1bd01, + 0x01382701, + 0x0544034b, + 0xa824032b, + 0xf71c5ef3, + 0x02b6dab9, + 0xb403f451, + 0xac834403, + 0x5ef4550c, + 0xd4d1fe1f, + 0xdea90180, + 0xd4d5017e, + 0xd4d50114, + 0xf05e0110, + 0xb44ce0fe, + 0x4de0fe3d, + 0x01b4010e, + 0xa9fe325e, + 0x5e0326d3, + 0xd489fdd4, + 0x5946ee9a, + 0xf0d1a903, + 0x27902701, + 0x5ee127c1, + 0xf253faba, + 0x2101f68c, + 0xb9f9555e, + 0x2701ead4, + 0xb9d1b9e1, + 0x12d3a902, + 0x18202702, + 0x7b212744, + 0x07230732, + 0xb8d3b946, + 0x33210b02, + 0xc6242b44, + 0xe3230334, + 0x33400723, + 0x33422b44, + 0x004d8346, + 0xfbcf5e03, + 0x01c0d4d1, + 0xf3453127, + 0xfb2742fc, + 0x02fcd8d1, + 0x0308d4d1, + 0x91739707, + 0x879b949b, + 0x07fb645e, + 0xfaf75e76, + 0x422b4427, + 0x2107cb07, + 0xd49d202b, + 0xe2c43b0b, + 0x07faa52c, + 0xfaa05e2c, + 0x422b4427, + 0x043b0607, + 0xa9fa415e, + 0xc502bcdc, + 0x0c5e60fc, + 0xffeea7fa, + 0xe411fd5f, + 0x15104ce3, + 0xf6455ee4, + 0x7e68f0c1, + 0xd3b9e7b4, + 0xd4d102ce, + 0x342e01e4, + 0x5fbe0d07, + 0x0d07fcea, + 0xfccf72be, + 0x017ed0a9, + 0x0188d1a9, + 0x8d5cf0c5, + 0xab5e12d1, + 0xbcdea9f6, + 0x60fec502, + 0xc1f9c65e, + 0xb75ee0d8, + 0x278f07f7, + 0x64f1c160, + 0x64964127, + 0xb7074027, + 0xfe91fca1, + 0xc45bb45b, + 0xc90bbe2b, + 0x61030b07, + 0xbcc20c2b, + 0x2163be1c, + 0x64f4c1fd, + 0x409b0fab, + 0x4c0b800d, + 0x4b0a0123, + 0x8409800d, + 0x840d4103, + 0x62c48203, + 0xbcd1a9c1, + 0xa9f20902, + 0xc5017ed0, + 0xf0c560f1, + 0xe8d28d5c, + 0xd3a9f429, + 0xd1b90336, + 0xd48d0339, + 0xf6f25eee, + 0xf65cf0c1, + 0xc1f8430f, + 0xfb8154f4, + 0x43f24b7b, + 0x4307f838, + 0x4103fe11, + 0xe6eae48d, + 0x0702021f, + 0x9d410342, + 0x215ef0c4, + 0x5e4507f8, + 0x4007f753, + 0x4c3b3e3b, + 0x07fca65e, + 0x9b3a9b40, + 0xfc9d5e49, + 0x4cc0ff1e, + 0x4de042b4, + 0x0138010e, + 0x1e3bf31e, + 0x31272c3b, + 0x312b4127, + 0x805e422b, + 0x07c407fc, + 0xfba65e03, + 0x43072407, + 0x27fbf45e, + 0xfbb15e40, + 0x8d5e4027, + 0x070d07fb, + 0xe820be16, + 0xb6dab9fc, + 0x0cac8302, + 0x89fc045e, + 0xd289e8d0, + 0xeede89ea, + 0x2becd189, + 0xff4ea720, + 0x329bfddf, + 0x43d51e2b, + 0x41070114, + 0xbea74c9b, + 0xd5fddfff, + 0xd50118b4, + 0x5e011cb4, + 0x0027fb35, + 0xa7fcfb5e, + 0xd1fc9330, + 0xc31500c5, + 0x017dd4b9, + 0x02bcd2a9, + 0x41233407, + 0x330f4c83, + 0x23433333, + 0xfffef43e, + 0xfef44e23, + 0xd8d3c5ff, + 0xb6d4d4c5, + 0xd4dcc524, + 0x02b4dea9, + 0x8da6d089, + 0xd389bede, + 0x070103be, + 0x9b442720, + 0xb0d49d23, + 0x48273387, + 0x8dc0d38d, + 0xd49dbcd2, + 0x270303b1, + 0x1fd8be14, + 0xc0d389fd, + 0x2ea74027, + 0x8dd17fff, + 0xd38dbad0, + 0xdcd48db4, + 0x8dd0d2c5, + 0xd48dc4d4, + 0xc8d48dc2, + 0x8dcad48d, + 0xd48db6d4, + 0xb2d38db8, + 0xc5c6d48d, + 0x855eccd2, + 0x5e4027fc, + 0x4127fc60, + 0x0124d4bd, + 0x27fc1a5e, + 0xf8a25e10, + 0xf8639ff6, + 0x2147023b, + 0x2b0cda9d, + 0x0bda9d20, + 0x2b072b02, + 0x01273103, + 0x675ee327, + 0x5e2703f8, + 0x4027f9a1, + 0xdfffcea7, + 0xe8d089fd, + 0x89eede89, + 0xd189ead2, + 0x14c4d5ec, + 0x18c4d501, + 0x2b202b01, + 0x1cc4d51e, + 0xfa435e01, + 0x0a5e20a7, + 0x202100f4, + 0x5ea02722, + 0xfac1f510, + 0x5ea15364, + 0x4203f508, + 0x2405432b, + 0x385e2115, + 0x68f0c1f4, + 0x27e5477e, + 0x0bf49b40, + 0x270ef49b, + 0x7e112705, + 0x2ea7e5a3, + 0x93fefd33, + 0x00c483fb, + 0xb3012401, + 0x432bb211, + 0x20a7410c, + 0x5ee120c8, + 0x2100f3c1, + 0x273722c0, + 0xf4e05e90, + 0x01ead4b9, + 0xfca34ae4, + 0x01f0d1a9, + 0x11039127, + 0xcfabc107, + 0xe1271123, + 0x99f7555e, + 0x4103f2c4, + 0x5ef2c49d, + 0xb407f620, + 0xb13bb153, + 0x9c5efb75, + 0x64f9c1f4, + 0xa75e9153, + 0x000000f4, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00004488, + 0x0001c904, + 0x000044dc, + 0x0000454e, + 0x000045a3, + 0x000046f2, + 0x0000489c, + 0x0002048e, + 0x0002071a, + 0x0000480a, + 0x00020551, + 0x0002065d, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x000195f1, + 0x000195f6, + 0x000195fe, + 0x00019606, + 0x0001960c, + 0x00019613, + 0x0001961e, + 0x00019627, + 0x00019630, + 0x00019634, + 0x0001963a, + 0x00019644, + 0x0001964c, + 0x0001965a, + 0x00019667, + 0x0001966e, + 0x0001967a, + 0x00019684, + 0x0001968f, + 0x000195f1, + 0x0001969a, + 0x000196a2, + 0x000196aa, + 0x000196ce, + 0x000196ae, + 0x000195fe, + 0x000196b7, + 0x000196c1, + 0x000196cb, + 0x000196d5, + 0x000196df, + 0x000196e7, + 0x000196f0, + 0x000196f6, + 0x000196fd, + 0x00019703, + 0x0001970e, + 0x00019718, + 0x000195f1, + 0x0001969a, + 0x0001971e, + 0x00019722, + 0x00019726, + 0x00019694, + 0x000196ce, + 0x00019731, + 0x000195f1, + 0x0001969a, + 0x0001973f, + 0x00019748, + 0x00019751, + 0x00019755, + 0x0001975c, + 0x00019764, + 0x0001976c, + 0x00019775, + 0x0001977f, + 0x0001978a, + 0x000196ce, + 0x00019794, + 0x0001979e, + 0x000197a8, + 0x000197b1, + 0x000197bb, + 0x000197c2, + 0x000197cc, + 0x00019731, + 0x000197d9, + 0x000197e6, + 0x000197e9, + 0x000197f3, + 0x000195f1, + 0x0001969a, + 0x000197fb, + 0x00019803, + 0x000196ce, + 0x00019731, + 0x00019694, + 0x0001976f, + 0x00019811, + 0x0001980b, + 0x0001981b, + 0x0001982b, + 0x00019834, + 0x0001983c, + 0x00019844, + 0x0001984d, + 0x00019858, + 0x00019865, + 0x00019872, + 0x000195f1, + 0x0001969a, + 0x00019879, + 0x00019884, + 0x0001988c, + 0x000196ce, + 0x00019731, + 0x00019890, + 0x00019898, + 0x000198a3, + 0x00019694, + 0x000198ac, + 0x000198b8, + 0x000198c3, + 0x000198cd, + 0x000198d8, + 0x000198df, + 0x000198ed, + 0x000198fc, + 0x000195f1, + 0x00019901, + 0x000197e9, + 0x00019906, + 0x0001990a, + 0x00019912, + 0x0001991a, + 0x00019924, + 0x000196c7, + 0x00047414, + 0x00047414, + 0x00047414, + 0x00047414, + 0x00047414, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, +}; +const int fw_h264dec_size = 271104; diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/fw_h264enc.c b/src/little/linux/drivers/media/platform/canaan-vpu/fw_h264enc.c new file mode 100755 index 000000000..53428d6e9 --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/fw_h264enc.c @@ -0,0 +1,90371 @@ +const unsigned int fw_h264enc[] __attribute__ ((aligned (0x1000))) = { +0x0000eb5e, +0x02020305, +0x33363635, +0x32303137, +0x36322e48, +0x50422034, +0x2f504d2f, +0x45205048, +0x646f636e, +0x00007265, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x34363248, +0x20434e45, +0x31313734, +0x33646530, +0x30703172, +0x6530302d, +0x00306361, +0x00000000, +0x00058400, +0x0005a000, +0x00000015, +0x001f8f33, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00069000, +0x00005aa8, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x01a70d27, +0x6ea7f07b, +0x53fdcfff, +0x530207f0, +0x950183f1, +0x2760a561, +0x15602501, +0x25002760, +0x9b601560, +0x6ea70ef0, +0x01fd4fff, +0x33110361, +0xc511a314, +0x60c13861, +0xf810ce38, +0xffff1ea7, +0x213127ff, +0x99240714, +0x6c402416, +0x27659680, +0x169d806c, +0x27612724, +0x0e210330, +0x07202762, +0x19520b51, +0xce0b6650, +0x3826f042, +0x139d3327, +0xbd31270d, +0x2706aa13, +0x0ef09b00, +0xa70f1099, +0xfd4fff6e, +0x600b0233, +0x274063c5, +0x0ef39b30, +0x4fff6ea7, +0x3863c5fd, +0x10000d27, +0x871ef0e8, +0x01271225, +0x1399501d, +0x0353070c, +0x0c139d31, +0x2c333207, +0x04f29b18, +0x0ea721a3, +0x05feffff, +0x9b202702, +0x03150ef2, +0x2708059d, +0x9302000d, +0x05dbc3f1, +0x04002d27, +0x0706f09b, +0xb5f193f1, +0x1001059a, +0x01270b36, +0xf0931005, +0x93059028, +0x058e23f3, +0x011e03c2, +0x803c0331, +0x93f930ca, +0x058e13f3, +0x800ef293, +0x03210105, +0x03310524, +0xf630ca34, +0x00024ebe, +0xf09b0027, +0x0276be0b, +0x27012700, +0x06f09b10, +0xfd1eff8b, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x01a70d27, +0x6ea7f07b, +0x93feffff, +0x00028cf1, +0x937f1ce3, +0x0015b2f2, +0x05b66001, +0x9bfa21d2, +0x1c030ff1, +0xe3f21e80, +0x04f09b01, +0x02000d27, +0xe64ef193, +0x012d2705, +0x06f09b20, +0x7dbef107, +0xff8b0002, +0x0000fd1e, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x01a70d27, +0x6ea7f07b, +0x93feffff, +0x00153af1, +0x937f1ce3, +0x001a04f2, +0x05b66001, +0x9bfa21d2, +0x1c030ff1, +0xe3f21e80, +0x04f09b01, +0x02000d27, +0x1bcef193, +0x022d2706, +0x06f09b20, +0x08bef107, +0xff8b0015, +0x0000fd1e, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x01a70d27, +0x6ea7f07b, +0x93feffff, +0x00198cf1, +0x937f1ce3, +0x001bdaf2, +0x05b66001, +0x9bfa21d2, +0x1c030ff1, +0xe3f21e80, +0x04f09b01, +0x02000d27, +0x344ef193, +0x032d2706, +0x06f09b20, +0x5abef107, +0xff8b0019, +0x0000fd1e, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x01a70d27, +0x6ea7f07b, +0x93feffff, +0x001b62f1, +0x937f1ce3, +0x001c36f2, +0x05b66001, +0x9bfa21d2, +0x1c030ff1, +0xe3f21e80, +0x04f09b01, +0x02000d27, +0x3fcef193, +0x042d2706, +0x06f09b20, +0x30bef107, +0xff8b001b, +0xf09bfd1e, +0x07fe0b06, +0x4efe0b0f, +0x25fd93f5, +0xd0010000, +0xf08b0506, +0xf71ed403, +0xf54ef58e, +0x0016fd93, +0x06d00100, +0x03f08b05, +0x8ef71ed4, +0x000000f5, +0x00000000, +0x00000000, +0xf4abfa4e, +0x4b7af493, +0xa7f41b01, +0xfd9fff3e, +0x04024d27, +0x34153425, +0x001d36be, +0xffff0ea7, +0xff1ea7ff, +0x031efd4f, +0x0499f2e8, +0x2713010e, +0xd8437b26, +0xaea7f341, +0x11feffff, +0x1834f9a3, +0xe3ff000e, +0x1834fd41, +0xa7ff000e, +0xfdcfffbe, +0xf093c127, +0x27058d2c, +0x64bcc510, +0x001dd2be, +0xfcebf4ab, +0x001b94be, +0x0027f4ab, +0x001db0be, +0xf49b4027, +0x0ef49b0b, +0xa3bd3227, +0xbcc51e94, +0x0ef49b40, +0x9fff3ea7, +0x64bcc5fd, +0x40273415, +0x070ef49b, +0x1eff8b00, +0x000000f6, +0x00069b1c, +0x0005a8b8, +0x00001000, +0x00000fff, +0x00000180, +0x000001e0, +0x00000080, +0x0000007f, +0xf1a3f54e, +0x85eef493, +0xa7f41b01, +0xffffff3e, +0x96113499, +0x12349946, +0xf49345f6, +0x190685c0, +0xbe34d643, +0x270115c3, +0x4ea70f3c, +0x35fdbfff, +0x5f2c2743, +0x4fff4ea7, +0x3442c5fd, +0xa7b63c27, +0xfdefff4e, +0x0f0443d5, +0x011bd9be, +0x8fff2ea7, +0x0a4e27fd, +0x24158000, +0x23253227, +0xeaf71ea7, +0x054027fd, +0x003f2714, +0x1512c200, +0x0ef49b13, +0xffff2ea7, +0x112499ff, +0x0e8c4ff6, +0xf6122499, +0x930e854f, +0x068557f4, +0x35464319, +0xf8242499, +0x0e797f4c, +0x1ea7d127, +0x99ffffff, +0xcea71114, +0x03feffff, +0x11149d41, +0xc3d53327, +0x0ea70148, +0x01fd4fff, +0x07b12703, +0x07233b2b, +0x993f6b32, +0x43070e12, +0x149d42ab, +0x3c03c50e, +0xf49b4027, +0xbe01270e, +0xbd007d90, +0xd81e99c0, +0x3814300c, +0x4ea7100c, +0xc5fdcfff, +0x4ea7684b, +0xc5fdcfff, +0xdfe6604b, +0x0ea70e08, +0xd1ffffff, +0x060e2404, +0xff1ea748, +0x1341fdaf, +0x8fff2ea7, +0x05340bfd, +0xe3242113, +0x2425104c, +0x3ca32311, +0x93231510, +0x0684bbfa, +0x4fe6a419, +0x04990e63, +0x9b42e025, +0xadf29311, +0xf2550684, +0x3027a219, +0xffff4ea7, +0x25439dff, +0x11722fe6, +0xffff4ea7, +0x2c43b9ff, +0x8c3ff615, +0xff4ea711, +0x4101fd4f, +0x973af293, +0xd14d2705, +0x07342707, +0x15240502, +0xbe212523, +0x27010f9a, +0x0ef49b40, +0xffffdea7, +0xff3ea7fe, +0xd2b9fd4f, +0x34c50140, +0x1e2ff638, +0xeb0ea711, +0x48beffff, +0x33be0119, +0x0ea70099, +0xbeffffeb, +0xab011918, +0xeb4127f3, +0xff4ea7f4, +0x43d1ffff, +0x35a60e24, +0xafffbea7, +0x0bb441fd, +0xa7b40543, +0xffffff0e, +0xe6100499, +0x9304a14f, +0x05e203f1, +0x4ff61419, +0x9027023d, +0xffffbea7, +0x99b4b9fe, +0x2f4cfc1e, +0x2ea701e7, +0xb9feffff, +0xd81e9921, +0x9929301c, +0x43830924, +0x44332487, +0x43f9422b, +0xff000050, +0x4ea736e6, +0xd1feffff, +0xe0014843, +0x07088531, +0xf0422343, +0xa7088f42, +0xfeffff0e, +0x1e9904b9, +0x5c104cd8, +0xe1a6f193, +0xe6141905, +0xff2ea74c, +0x2d99ffff, +0x1fdfe627, +0x93002708, +0x05e18ff3, +0x48063419, +0xf1dfcea7, +0x07c319ff, +0xce4f4b43, +0x20070d4d, +0x0c071d07, +0x004098be, +0x32fcc319, +0x30270126, +0x49ab4307, +0x44863027, +0x93073127, +0x3ea79f6b, +0xd1feffff, +0xe0014834, +0xa70ad842, +0xfeffffbe, +0x9fe6ba11, +0xd0270128, +0xe136f993, +0x39f09305, +0x0b1905e1, +0xf151bb46, +0xf1df4ea7, +0x651399ff, +0x3ff64c19, +0x012703d7, +0x4399f451, +0x0fc2d864, +0xf09305d6, +0x99068324, +0x43f80404, +0x430700a2, +0x4d8b41c3, +0x44863027, +0xd3073127, +0xdfe6d183, +0xb5a6008e, +0xf1df3ea7, +0xa33419ff, +0x27341d41, +0x0ef49b40, +0x3ff69319, +0x1ea700d6, +0xd1ffffff, +0xf6069014, +0xa700c94f, +0xfeffff2e, +0x1e992db9, +0xd183d453, +0xe0c2f393, +0x563c1905, +0x18a4f9cf, +0x27ff000e, +0xd64d8b30, +0x4307654f, +0x47a64f6b, +0x0777cff6, +0xffffbea7, +0x0fb499ff, +0xf39b3027, +0x8731270e, +0x4043f544, +0xabff02b0, +0xe69419fd, +0xeb066c4f, +0x81fb93fd, +0xb41905e0, +0x3ea745a6, +0x19fff1df, +0x1d41e334, +0x9b402734, +0x40270ef4, +0x3e5e941d, +0x270127fe, +0x118bbe11, +0xcc0fc603, +0xf1df3ea7, +0x273419ff, +0xc64d8b30, +0x31279d4f, +0xfd93991e, +0x0105e040, +0xf6f08bd0, +0xa709e00f, +0xfeffffbe, +0x060bb499, +0x07412742, +0xff2ea734, +0x4027feff, +0x249d3f6b, +0xfeb65e0b, +0xe012f993, +0x27941905, +0xd64fe6d1, +0x5ed027fe, +0xd027fed1, +0x27ff435e, +0x7a96be00, +0x40b4b900, +0xf6d00701, +0x0702c04f, +0x83b007c0, +0xbc8310cc, +0x07c67630, +0x254c834d, +0x302749ab, +0x31274486, +0x9f6b9307, +0x0551bff6, +0xffff0ea7, +0x9904b9fe, +0x0f4cf81e, +0x0dbdfdde, +0xd75e1e99, +0x158abefd, +0xff2ea703, +0x24b9feff, +0x91271e99, +0x90270496, +0x1d2f4cf8, +0xff3ea706, +0x3499ffff, +0x27379926, +0x025e42e0, +0x025a72e0, +0x40278027, +0xffffbea7, +0xa9b4bdff, +0xb302be06, +0xa70e5601, +0xffffff0e, +0x0e2c03b9, +0x0e2f04b9, +0xd407431b, +0xdcd4df6b, +0xb3073a10, +0x111ea027, +0xc49d4027, +0x03d10356, +0xf4a127b1, +0x05fc10dc, +0x4c834b07, +0x87c4070f, +0x2bc43334, +0x33c42bc3, +0xd0ce23c3, +0x0c07fff1, +0x00baaebe, +0xf6d20fd6, +0x2705d9af, +0x2749ab40, +0x27448630, +0xff2ea731, +0x24b9ffff, +0x3f6b06a6, +0x4fe6f345, +0x40270134, +0x24bdd027, +0x0ea706a6, +0xbefffaa3, +0xa701b6f7, +0xfd4fff6e, +0x0fe0e007, +0xffffffff, +0x40070106, +0x43332007, +0x242b2533, +0x056c2af9, +0x23f1ff00, +0xff000570, +0x43334a07, +0x9b1c4f03, +0x4dc10006, +0x003f0388, +0x15800000, +0x8449c1d3, +0x1907b207, +0x070f1c83, +0x33c10741, +0x2bca3347, +0x48cf03c4, +0xc10006ab, +0xbe23d4c3, +0xc1fffa94, +0x4ff65034, +0x24f10123, +0xff000574, +0xf95034c5, +0x00056e24, +0x6834c5ff, +0x4d5cd401, +0x4f3cfff0, +0x0fff0000, +0x34c56411, +0x07410788, +0x33383331, +0x93430b44, +0x06c8dff0, +0x412b0201, +0x420b4487, +0x11b041d1, +0x40d1b241, +0xb38911b4, +0x0b210b14, +0xd5f15130, +0xd511b443, +0xc111b042, +0x41278013, +0x34eb4a3b, +0x998013c5, +0xd1230ccd, +0x590ccd9d, +0x5d412314, +0xfd402714, +0x000560e4, +0xa33ea7ff, +0x3479fffa, +0x00954ff6, +0xf293d736, +0xc106802c, +0x49ce4424, +0x21f3530d, +0x073001fa, +0x7aafbe1c, +0xa7d12700, +0xfffaa30e, +0x01b5eebe, +0x0fe4e007, +0xffffffff, +0xf441fefe, +0x4dab3027, +0x31274486, +0xf3453f6b, +0xffffbea7, +0xaab4b9ff, +0x2c4ff606, +0xaf8ff609, +0x35002700, +0xff2ea7f0, +0x24b9ffff, +0x450606a7, +0x24bd4027, +0xf35106a7, +0xe6083499, +0x27009c4f, +0x27f44100, +0x8640ab30, +0x51312744, +0x6b4027f2, +0x64249d3f, +0x3fe69307, +0x4127fba4, +0x7fa6f393, +0x65349d06, +0xa7fb975e, +0xfffaa10e, +0x01b52fbe, +0xf1ff635e, +0x00057420, +0xec401bff, +0xc5fee740, +0x24f95030, +0xff00056e, +0x5e6834c5, +0x0ea7fed8, +0xbeffffeb, +0xbe01146b, +0xa7009456, +0xffffeb0e, +0x01143bbe, +0x93fb4a5e, +0x067f5bf2, +0xe6052499, +0x2703be4f, +0xfc1e5e00, +0xa75e8127, +0x83b007fd, +0xbff630bc, +0xc0070482, +0x5e10cc83, +0x1127fd3d, +0x10277496, +0x4e5ef135, +0xffbea7ff, +0xb4b9ffff, +0x4ff606a8, +0x00270474, +0x2ea7f025, +0xd1ffffff, +0x150e1422, +0x00d95ef2, +0xd8879807, +0xd90b9433, +0x13c2d3f9, +0x639dff00, +0xc4dbf14d, +0xe9ff0013, +0x0013c8d1, +0x946bc5ff, +0x13c4d0f1, +0x618dff00, +0x3374be98, +0x2d7fbe01, +0x07402701, +0x005f27b0, +0x073fe000, +0xe9350724, +0x0013c8da, +0xbe0b07ff, +0x07013e12, +0x070a07b0, +0x334cbec1, +0x2d57be01, +0x07400701, +0x07240731, +0xbe0b071c, +0x07013a2a, +0xbe040740, +0x9d011f3b, +0x40279a60, +0xd4edc027, +0xff0013c8, +0x13c4dcf5, +0x3ebeff00, +0x4807003e, +0x940b4833, +0xc6daf393, +0x2b320106, +0xc5498798, +0x420b7460, +0x11b043d1, +0x33786cc5, +0x7063c533, +0x36047499, +0x05749945, +0x00854ff6, +0x3499f351, +0x7141c05d, +0x860b7499, +0x93422745, +0x067e47fb, +0x1104b49d, +0x825dbef0, +0x03f01100, +0x11f01501, +0x0d95bef0, +0x83400703, +0x4ce4184c, +0xfc01b418, +0x01af200c, +0x8c83f811, +0x0748070f, +0x33473378, +0x03742b7a, +0x06ab487f, +0x11749900, +0x33047399, +0xd476c147, +0x639d34ab, +0x5f74b94c, +0xe94ff602, +0x9274b9fe, +0x27980702, +0x943314dc, +0x649dd89b, +0xfee75e4d, +0x0c030607, +0xa805be4c, +0xbe861e00, +0xe6003db5, +0x93ff770f, +0x067c2ff4, +0x99084399, +0x31030944, +0x17831307, +0x14ee3123, +0x729906f0, +0xb5f05307, +0x11fb93f7, +0x0401067c, +0xfd08b19d, +0x06998032, +0x27102700, +0x053a27ca, +0x03c12341, +0x87f3b844, +0x0b243342, +0xd844f142, +0x93ff0003, +0x058b1ff0, +0x7ea90405, +0x71b90232, +0x7da90343, +0x4e070230, +0x70d1410b, +0x73a90220, +0x72a90212, +0xdc030214, +0x0f4c030f, +0x8af6fb93, +0x53445305, +0x15b085d4, +0x45b225b3, +0x65bc55b4, +0xb9bd35b1, +0xd1023f74, +0x03035c73, +0x24b48d48, +0x5324b489, +0x03318338, +0x01270fec, +0x00274a00, +0xb38d4007, +0x33e45326, +0x9e3fe645, +0x531d0701, +0x53f71ff2, +0x03f71ffb, +0x01e80317, +0xe3b0012d, +0x27e7e317, +0x5c4fe631, +0x11fb5301, +0xc6b401f7, +0x83340735, +0x34e67f3c, +0x2b804c03, +0x9b210743, +0x0724332e, +0xc6308b32, +0x2b2d0b34, +0x9b040723, +0x07304701, +0x0711031e, +0x83115343, +0x11237f4c, +0x3c0344e6, +0x47342b80, +0x9be42b41, +0x834e07e0, +0x44e67f4c, +0x2b80ec03, +0x0b319be4, +0xadf15332, +0x933e0bf6, +0x058a3ff2, +0x23751001, +0x00b216be, +0xa7fe3f5e, +0xfeffff4e, +0x1e994dbd, +0x3127c586, +0xcfff4ea7, +0x6843c5fd, +0x4ea73127, +0xc5fdcfff, +0x7b5e6043, +0xff1ea7f8, +0x14d1ffff, +0xf2110e14, +0xa72e24ce, +0xfff95f0e, +0x0e1412d5, +0x01b1f3be, +0xf49b4027, +0xff4ea70e, +0x4399ffff, +0xbf2ea70e, +0x3138fd4f, +0x24054127, +0x34c63153, +0xf31e2403, +0xbff6fb31, +0xf0210161, +0x6a5e0f6b, +0x1381befc, +0xf9202701, +0x011e9424, +0x8747e6ff, +0x0043f142, +0xd8ff0230, +0x21031334, +0xc40e25d4, +0x2227e621, +0x1e9424f9, +0x40b6ff01, +0xcfff3ea7, +0x4431c1fd, +0x41072027, +0x34c542a3, +0x0ef29b44, +0xff8b0007, +0xc54431c5, +0x0ea76432, +0xd1ffffff, +0xa70e2401, +0xfd4fff4e, +0xa66442c5, +0xff2ea718, +0x2341fdaf, +0xafff4ea7, +0xa7310bfd, +0xfd8fff2e, +0x24214305, +0x25104ce3, +0xa3231124, +0x2315103c, +0x011324be, +0x53f9125e, +0x01f5b3f2, +0xfea55e24, +0x030f11be, +0xbef9e05e, +0x27003244, +0x27048631, +0x5e030730, +0x75bef858, +0xe05e0032, +0x95fb53f7, +0x95f253f5, +0x011d07f5, +0x03bd0120, +0x5e3027e1, +0x0ea7fe69, +0x39fff1d7, +0xff1ea704, +0x1bbdffff, +0x44f60e2c, +0x165e4127, +0xb0eabefa, +0x5e412701, +0x4ea7fa0d, +0xc5fdcfff, +0x7c5e6843, +0xbd0cbef7, +0xf89d5e00, +0xffffbea7, +0x26b499ff, +0x1cf844e6, +0xa7f76620, +0xfd8fffde, +0x4c83d411, +0xbed41518, +0xa7011126, +0xfeffff4e, +0x014143b9, +0x31273566, +0x7fff4ea7, +0x934345d0, +0x05d8f3f0, +0x4ff60419, +0xf1ab044b, +0x24f92027, +0xff011e94, +0x043842f0, +0x43f14287, +0xff023000, +0x042c34f8, +0x25f42103, +0x21c4028c, +0x1e2227e2, +0x827ebede, +0x27f12100, +0x8601ab40, +0x6b412704, +0x5ef4254f, +0xc007fe8e, +0x0710cc83, +0x27c4860c, +0x417dbe01, +0xf8b35e00, +0x1ea74027, +0xbdffffff, +0xbe06a814, +0x0700b55c, +0x8b0ea7d0, +0x74befff2, +0x9c2701b0, +0xbc8d2712, +0x207c270b, +0x0fe0a007, +0xffffffff, +0xca070192, +0x46334a07, +0xc40bc333, +0x0d84c0f1, +0xdc07ff00, +0xf27cde23, +0x3710beff, +0x84c4f100, +0x07ff000d, +0x0f4c831d, +0x3a333407, +0x342b4733, +0xac1c32f1, +0x39070006, +0x44034207, +0x14031b01, +0x44034b05, +0xd171f3a8, +0xc292f093, +0x5c21c506, +0x0e01d381, +0x916023c5, +0x6424c5d4, +0x2bc5dba1, +0x0ad48984, +0xc50f4c83, +0xd1316c24, +0x517c21c5, +0xc51d07d3, +0xd3018023, +0x832c1c03, +0x43070f3c, +0x28332307, +0x420b4433, +0x2487432b, +0xd4a13207, +0x34d53e0b, +0x3d0311dc, +0x472711b8, +0x14031b01, +0x34033b05, +0x1ea7f4a8, +0xd1ffffff, +0x07184810, +0x0b011132, +0x0341073e, +0xe434ad41, +0x1741c811, +0x3d033207, +0x3e0b11e8, +0x2bd12007, +0x24030108, +0x34033b05, +0x1ea7f498, +0xd1ffffff, +0x51069013, +0x013123f2, +0xdc2bb9dc, +0xdd2db902, +0x9013d502, +0xe824d106, +0xfe4cee02, +0x85f39300, +0x34d10679, +0x4cee0498, +0xc02700d8, +0x32d8c301, +0xba31f820, +0xe3430700, +0xf8c30532, +0x00a3104c, +0x40273027, +0x01acc4bd, +0x01adc3bd, +0x01a8c3d5, +0x018cc4b9, +0x01784fd6, +0x0541a3c4, +0x0edbcec4, +0x4d07291e, +0xd4074103, +0xbdcedf6b, +0x834d071e, +0x33340741, +0x2b443336, +0x33230734, +0xf1320b23, +0x069dfc34, +0xdb41dc00, +0xf051bd07, +0x02dd0bbd, +0xa4fd4027, +0xff000d78, +0xf28b3ea7, +0x563479ff, +0xa7d12748, +0xfff28b0e, +0x01aedabe, +0x0fe4a007, +0xffffffff, +0x1127fe72, +0x1027d496, +0xcb5ef125, +0x890ea7f9, +0x75befff2, +0xd12701ae, +0xf80dd61e, +0x1c07f72d, +0x1d03f001, +0x17be016c, +0x785e00b3, +0x030c07ff, +0x64be0c0c, +0x655e00b3, +0xb372beff, +0x01f45100, +0xdc4bb9c3, +0xdd4db902, +0xff375e02, +0x43073127, +0x34334633, +0xc407432b, +0xc40bc333, +0x9dfccf03, +0x155e0006, +0x1e3027ff, +0xa73127e6, +0xfeffff4e, +0x270a439d, +0x0ef49b40, +0x4ea73127, +0xc5fdcfff, +0x445e6043, +0x2a04e8fd, +0x2f1abef6, +0xff0ea700, +0x0499feff, +0x9611270b, +0x07102744, +0xf6155e41, +0xf1eb4127, +0x01af4fe6, +0x013cb3be, +0xffff3ea7, +0x263461ff, +0xa7c30747, +0xfd4fffde, +0xf49b4027, +0x38d4c50e, +0x013c97be, +0x4256c461, +0xffff0ea7, +0x090399fe, +0x4fffbea7, +0xa7b201fd, +0xffffffee, +0x990ee199, +0x338311ed, +0x423b4127, +0x14eb2307, +0x3387d123, +0xe19d2433, +0x9d232b0e, +0x24f911ed, +0xff000050, +0x24f9c407, +0xff00004f, +0x24fd4123, +0xff00004f, +0x00dddff6, +0x99090399, +0x432b44e4, +0x41e84f4b, +0xc58600cf, +0x0698e4d1, +0xc525ec9d, +0xf49340e4, +0x010677b0, +0x07402741, +0x0ce49d0e, +0x9d2ae49d, +0xe6be12ed, +0xb101002f, +0x8a5af293, +0xd24d2705, +0x0c3c2707, +0x24050207, +0x21252315, +0x2d452c35, +0x0102b5be, +0xd576f193, +0xb6141905, +0x9b40274b, +0xf49b0bf4, +0xff2ea70e, +0x2111feff, +0xbd104c27, +0x271e6c24, +0x0013fd30, +0x27ff0000, +0x0ef49b40, +0xffff3ea7, +0x123499ff, +0x00f64fe6, +0x4ea73127, +0xc5fd4fff, +0xff1e3043, +0xffff1ea7, +0xd61251ff, +0x93402723, +0x05d527f3, +0x3027341d, +0x9b0bf39b, +0x4ea70ef3, +0x9dfd4fff, +0x129d1012, +0x9b42010f, +0x31270ef3, +0x3b0e1499, +0xa734cb32, +0xfd4fbf2e, +0x41273138, +0x31532405, +0x038b3fc6, +0xa7f21e24, +0xffffffce, +0xa70ec199, +0xfff95d0e, +0x010f03be, +0xc49d4127, +0xff5e5e12, +0x76e2f393, +0x5ef35506, +0xd027f26f, +0xbef18d5e, +0xbe002fb4, +0x27006d5d, +0xf1805ed1, +0xf1930827, +0x9e016f7f, +0xbe010a4b, +0x5e003028, +0x4027f6d1, +0x27fe655e, +0x2e05be01, +0x11f3ab00, +0x004ee3d4, +0xd4150400, +0xa35ef3eb, +0xa73127fb, +0xfdcfff4e, +0xab6043c5, +0xf92027f1, +0x011e9424, +0x2542d0ff, +0x43f14287, +0xff023000, +0x031a34d8, +0xc4255421, +0x2227e621, +0x4127e21e, +0x4ff6f1eb, +0x4327fe20, +0xd01ef4e8, +0xf11e4027, +0x006ce8be, +0xbeff075e, +0xbe002fe2, +0xa700a047, +0xfff95d3e, +0x341d4027, +0x3ea7343d, +0x01ffffdf, +0x07458634, +0xe8462723, +0x562301f4, +0xff3ea733, +0x3401fd4f, +0xffdfbea7, +0xa34433ff, +0x27b40549, +0xbe20000d, +0x93008913, +0x06be73fc, +0x0b07c005, +0x010ae3be, +0x4fe6c401, +0x0ea7030f, +0x27fff28b, +0x0e7ebe12, +0xa7002701, +0xffffd74e, +0x403d401d, +0x2ea7407d, +0x27ffffff, +0x2a209d40, +0xf1d7eea7, +0x93e41dff, +0x067513f3, +0x319d10a7, +0x1824bd43, +0x25209d0e, +0x24c5e43d, +0x4024c53c, +0x9d26249d, +0x24bd2724, +0x3827152c, +0x40272127, +0x0e1824fd, +0x2103ff00, +0xfe93f398, +0x2706752c, +0x3e071b0c, +0x4007d027, +0x01233d05, +0xf4b83403, +0xcea74027, +0xc1fd4fff, +0x3c2774c1, +0x27e43da2, +0x2127464c, +0xe445e335, +0x4d273227, +0xe35d07c8, +0xe29de425, +0x55e09d2e, +0xe015e21d, +0x9d1be29d, +0xe09d1ae0, +0x6f10e81c, +0x9d412702, +0x202730e4, +0x754ef093, +0x9d40a706, +0x02c57004, +0x840d0374, +0x51f05501, +0x03fd51f3, +0xf355ff3c, +0x27330c27, +0x9d322740, +0xe09d60e4, +0x58e39d63, +0x9d59e29d, +0xe29d61e0, +0x44e29d62, +0x9d2fe29d, +0xe29d64e2, +0x65e29d66, +0xe48d4127, +0x51f45146, +0x2310a7f3, +0xe302834d, +0xe18d7fdc, +0x34e2c55e, +0xc538e2c5, +0xe2c53ce2, +0x5ae18d40, +0xc55ce18d, +0xe2c568e2, +0x4ce2c550, +0xe354e29d, +0xf4557f3c, +0xdc03d419, +0xf9d3c280, +0x7657f493, +0x102c2706, +0x431d30a7, +0x4c03433d, +0xa7f2a010, +0xffffff4e, +0x010143bd, +0x22be0027, +0xd0070042, +0xbe330c27, +0x93004219, +0x06c167fb, +0x9d272b07, +0x8e27fa00, +0x271e0000, +0x6c271e7c, +0x1b1c271d, +0x40275b07, +0xc0a7e027, +0x24053127, +0x9d18239d, +0x29950c24, +0x2d2528b5, +0x2d552015, +0x278d2045, +0x1e268d1c, +0x9d202e8d, +0x219d1921, +0x1b219d1a, +0x03302cc5, +0x2fc4342c, +0x0006e84c, +0xd53207c6, +0x9d01745c, +0x3d03685e, +0x20270238, +0x32054627, +0xf4c83403, +0x93232c27, +0x06c19ff3, +0x42071027, +0x21233105, +0xf4b83403, +0x4027f151, +0x02dc14bd, +0x12bd40a7, +0xb4d502dd, +0x3ea702b4, +0x27ffffff, +0x32d5520c, +0xb2d51558, +0xf3930134, +0x27058378, +0x05400720, +0x03012332, +0xa7f4b834, +0xffffff4e, +0x43bd3027, +0x40bd0e2c, +0x42bd0e2f, +0x42bd0e2e, +0xf1510e2d, +0x184442bd, +0x02d012bd, +0x2744429d, +0x2142bd10, +0xadf2510e, +0xd5184641, +0x9d166840, +0x219d0821, +0x9840d506, +0x9c40d506, +0x5f3ea706, +0x311dfff9, +0x40ad313d, +0x3c270102, +0x0843bd0f, +0xbd20a701, +0x27010942, +0x40adb0ec, +0x40d5010a, +0x40d50e14, +0x41bd0690, +0x3ea71528, +0x27fffef3, +0x054e0720, +0x03e12332, +0xa7f4b834, +0x5f1ea720, +0x3ea7fffc, +0x15ffffff, +0xbd402712, +0xd5167834, +0x0516743e, +0x6c3ed512, +0x703ed516, +0x27212716, +0x4027113c, +0x167824fd, +0x2103ff00, +0x915ef398, +0x99d0b9ee, +0x8304531e, +0x39f9be01, +0xeed75e00, +0x199c0d27, +0x002c71be, +0x7312f493, +0x5e400506, +0xf193ee80, +0x55067314, +0x274027f1, +0x25049d30, +0x010a03ad, +0x93ee6b5e, +0x016ba5f0, +0x010348be, +0x27ee6c5e, +0x72f19301, +0x789e016b, +0xc4c10106, +0x004ef874, +0xfd8b0100, +0x7266f493, +0x304d9d06, +0x4efd855e, +0x05f493fd, +0xf41b017a, +0x7fff3ea7, +0x024e27fd, +0x3425382a, +0xf2ab3415, +0xf1eb1127, +0xffff2ea7, +0x05e827eb, +0x004f272e, +0x15030000, +0xa23e2724, +0x23c50880, +0xff0ea75c, +0x4227e7ff, +0x20270405, +0xfd0b4ea7, +0x934225fe, +0x06066ff3, +0x01c53215, +0x15420550, +0x69fd9342, +0x32050606, +0x0208d2d5, +0x020cd2d5, +0xa70ef29b, +0xfdcfff3e, +0xeacaf493, +0x3534b5ff, +0x93323531, +0xffeb3ff4, +0x453034c5, +0xa7324531, +0xfddfff1e, +0x14c54727, +0x5412c550, +0x20004d27, +0x275814c5, +0xc530003d, +0x0ea75c13, +0xc5f3ffff, +0x02c5540e, +0xff4ea754, +0x4215efff, +0x4ea73027, +0xadfeffff, +0xa71e3843, +0xfdeb771e, +0x4f271205, +0x0c030000, +0x3ea71415, +0xa7fefcff, +0xfef59f4e, +0x01a8d3d5, +0xf29bd445, +0xff3ea70e, +0x4327fdef, +0x024034d5, +0x04c10307, +0xfb48dc40, +0x01d51427, +0x01d50240, +0x20270244, +0x06c002d5, +0xebbf3ea7, +0x273205fd, +0x8300004f, +0x9b34150a, +0x3ea70ef2, +0x27fde6ef, +0x3405304c, +0x4f273215, +0xa0000000, +0x01d53435, +0x02d50248, +0x432706c4, +0x024c04d5, +0xefff1ea7, +0x4c14c1fd, +0x27fb48dc, +0x4c14d544, +0xb72ea702, +0x3027fdeb, +0x4f272305, +0x0b030000, +0xf39b2415, +0xdf2ea70e, +0x4c27fde6, +0x15240531, +0x004f2723, +0x35a00000, +0xd5332724, +0xa7027013, +0xfdefff1e, +0xdc7014c1, +0x4427fb48, +0x027014d5, +0x027414d5, +0x13d53027, +0x2ea706d0, +0x05fdeb8f, +0x004f2723, +0x15108200, +0x0ef39b24, +0x14d54327, +0x1ea70278, +0xc1fdefff, +0x48dc7814, +0xd54427fb, +0xd5027814, +0x27027c14, +0xd413d530, +0x872ea706, +0x2305fdeb, +0x00004f27, +0x241510c2, +0x270ef39b, +0x5014d543, +0xff0ea702, +0x04c1fdef, +0xfb48dc50, +0x01d51427, +0x01d50250, +0x20270254, +0x065402d5, +0xebaf3ea7, +0x273205fd, +0x8300004f, +0x9b34150b, +0x3ea70ef2, +0x27fde6af, +0x3405154c, +0x4f273215, +0xa0000000, +0x01d53435, +0x02d50258, +0x43270650, +0x025c04d5, +0xefff1ea7, +0x5c14c1fd, +0x27fb48dc, +0x5c14d544, +0xa72ea702, +0x3027fdeb, +0x4f272305, +0x0fc20000, +0xf39b2415, +0x9f2ea70e, +0x4c27fde6, +0x15240514, +0x004f2723, +0x35a00000, +0xd5332724, +0xa7026013, +0xfdefff0e, +0xdc6004c1, +0x1427fb48, +0x026001d5, +0x026401d5, +0x02d52027, +0x3ea706cc, +0x05fdeb9f, +0x004f2732, +0x15100200, +0x0ef29b34, +0xe66f3ea7, +0x334c27fd, +0x32153405, +0x00004f27, +0x3435a000, +0x026801d5, +0x06c802d5, +0x04d54327, +0x1ea7026c, +0xc1fdefff, +0x48dc6c14, +0xd54427fb, +0xa7026c14, +0xfdeb972e, +0x23053027, +0x00004f27, +0x24151042, +0xa70ef39b, +0xfde65f2e, +0x05324c27, +0x27231524, +0x0000004f, +0x272435a0, +0x0013d533, +0xff2ea703, +0x24d1fdef, +0x48dc0100, +0xd54427fa, +0xd5030024, +0x27030424, +0x9423d530, +0xff2ea706, +0x2305fdea, +0x00004f27, +0x24151340, +0xa70ef39b, +0xfde3ef2e, +0x05254c27, +0x93231524, +0x036807f1, +0x00004f27, +0x1ce3a000, +0xff0ea77f, +0x2435feff, +0x014804d1, +0x43c03627, +0x4a1ff418, +0xb40003a7, +0x0ff19b00, +0x014804d1, +0x27801c03, +0xea43c436, +0x4fff3ea7, +0x7434c1fd, +0x009e40e8, +0xf6374ea7, +0xa72027fe, +0xfeffffee, +0x0148e0d1, +0xad09429d, +0xa70142e2, +0xacd4d510, +0x9d302701, +0x41450443, +0x3505429d, +0x0a429d41, +0x429d426d, +0x0e03c008, +0x46272e07, +0x23d1f4e8, +0x33c40148, +0xff4ea7f6, +0xf393ffff, +0xd1060418, +0x07069842, +0x971c0313, +0xf6374ea7, +0xe34205fe, +0x3ce37f1c, +0x0334197f, +0x31c2803c, +0x262c27f9, +0x03f2f393, +0x07102706, +0x23310542, +0xb8340321, +0x8f4ea7f4, +0xf093fee1, +0xc50602cc, +0xd4d598d2, +0xd2c50124, +0x78aebe9c, +0xe8ff1e03, +0xff3a5ef3, +0xf87434c1, +0x0100004e, +0x4ea7ff5c, +0x27ebffff, +0xfffaf33e, +0x010043d5, +0xb9a02e27, +0x0442d5ff, +0x963d2701, +0x0843d5af, +0xf32e2701, +0x42d5f3f3, +0x3e27010c, +0xd5a0a0a0, +0x27011043, +0x9696962e, +0x011442d5, +0xeedb3e27, +0x1843d5e3, +0x551e2701, +0x41d55555, +0x3d27011c, +0x43d55555, +0x2e270120, +0xd5dbdbdb, +0xd5012442, +0x27012841, +0x4b4b4b3e, +0x012c43d5, +0x0c182e27, +0x3042d51c, +0xd5102701, +0x27013441, +0xd5060c3d, +0x27013843, +0x1818182e, +0x013c42d5, +0x014041d5, +0x014441d5, +0x06023e27, +0x4843d502, +0x4c41d501, +0x033d2701, +0x5043d507, +0x022e2701, +0x42d50202, +0x41d50154, +0x41d50158, +0xa15e015c, +0x93f94efe, +0x0618e3f3, +0x1f31f293, +0x7f3ce306, +0x197f2ce3, +0x803c0334, +0x93f932c2, +0x0175b3f4, +0x3ea7f41b, +0x27fd6fff, +0x2560024d, +0xab341534, +0xeb4127f2, +0x31f093f4, +0x4027061b, +0x3ea7e007, +0x35ebffff, +0xa1f29334, +0xf993061a, +0x93061e40, +0x061b0ff1, +0x01dfed03, +0x14152415, +0x94c52405, +0x9c94c598, +0xece31405, +0x7f0ce37f, +0x0c030419, +0xf90ec280, +0x1af2f393, +0x27202706, +0x3205784c, +0xf4c83403, +0x1cc2fa93, +0x033a0706, +0x07013fad, +0x7f3ce32a, +0x237f2ce3, +0x19013fad, +0x803c0334, +0x27f932c2, +0xf39350dc, +0x27061ca0, +0x054d0720, +0x03d12332, +0x93f4b834, +0x061dcffe, +0xeb1db227, +0x1c92f093, +0x161c2706, +0x3d272a27, +0x49273200, +0xacc5c127, +0xbead05a0, +0x9300e900, +0x061cbff0, +0x27141c27, +0x3d272c2c, +0x48274700, +0x00e8ebbe, +0xe973cea7, +0xfdf093ff, +0x1c27061c, +0x272b2717, +0x2734003d, +0x4cacc549, +0xbe94adc5, +0x9300e8cc, +0x061d2bf0, +0x27151c27, +0x3d272d2c, +0x48274800, +0xd5ecacc5, +0xbe0134ad, +0x9300e8b0, +0x061dfff0, +0x27231c27, +0x3d273c2c, +0x4a271000, +0x00e89bbe, +0x1deef093, +0x241c2706, +0x273d2c27, +0x2714003d, +0xe886be4a, +0xddf09300, +0x1c27061d, +0x3e2c2725, +0x18003d27, +0x71be4a27, +0xf09300e8, +0x27061dcc, +0x2c27261c, +0x003d273f, +0xbe4a271c, +0xa700e85c, +0xfdeb3f3e, +0x4f273d05, +0x0d830000, +0x9dc53415, +0x849dc580, +0x75949dc5, +0x559d459d, +0x279d659d, +0x0ef19b10, +0x3d053803, +0x00004f27, +0x34150e03, +0xa70ef19b, +0xfde4ef2e, +0x051f4c27, +0x272d1524, +0x0000000f, +0xa72035a0, +0xfde4df3e, +0x34054103, +0x2ea73d15, +0x35fdeb2f, +0x272d0530, +0x8300004f, +0x9b24150e, +0x20270ef1, +0xffff4ea7, +0x3a42adfe, +0x7f3ea71e, +0x3219fee2, +0xe1ff4ea7, +0xa74219fe, +0xfee26b3e, +0xec274027, +0x6e949d26, +0x278893c5, +0x054e0720, +0x03e12332, +0xa7f4b834, +0xfeffff2e, +0x21ad1027, +0x40271e42, +0x02d424bd, +0xe1833ea7, +0x6b4ea7fe, +0x21adfee2, +0x43551e3c, +0x1c4ef093, +0x9b4ea706, +0x21adfef9, +0x94c51e3e, +0x902ed58c, +0x9ef90e1d, +0x4e049487, +0x93f4a3fd, +0x01740bf4, +0x3ea7f41b, +0x27fd5fff, +0x9382024d, +0x062483fd, +0x2d073425, +0x1597dc03, +0xe33d0734, +0x3ce37f2c, +0x97dc237f, +0x2c032419, +0xf923c280, +0x9326ec27, +0x06245ff3, +0x4e072027, +0xe1233205, +0xf4b83403, +0xeb072ea7, +0x272e05fd, +0x0300004f, +0x9324150f, +0x062437f1, +0xe1773ea7, +0x15d355fe, +0x271e051e, +0x0ef49b40, +0x2127f3ab, +0x4ea7f2eb, +0xc5fddfff, +0x4ec5c44e, +0x003d27c8, +0xcc43c520, +0x015c42d5, +0xffff3ea7, +0x343ed5fe, +0xff4ea71e, +0x4e35e7ff, +0xd4bd4027, +0x302704a0, +0xf0934f07, +0x8d0623f4, +0xdeadd2d3, +0xd4d50100, +0xded50108, +0xded50498, +0xded5049c, +0xde8d04f4, +0xd6de8dd4, +0x8dd8de8d, +0xde8ddade, +0xfade8df8, +0xbefcde8d, +0x83054294, +0x1efd8ef4, +0xa7fc4eff, +0xfd9fff4e, +0xc0074d01, +0xbe12d2d8, +0xa7019662, +0xfdcfff3e, +0x34c54027, +0x6034c540, +0x0710dc58, +0x9efc0e0c, +0x8e000836, +0xa7fa4efc, +0xffffffae, +0x9fffbea7, +0xffdea7fd, +0xcea7feff, +0xd1fdcfff, +0x260e24a4, +0xa3b41145, +0x061e104c, +0x4ce3b411, +0xb9b41510, +0x3c1e99d4, +0x0027104c, +0xd4d1151e, +0x42e00148, +0xaebe0095, +0x4127018c, +0x40270496, +0xd4110407, +0x0e1844f9, +0x4f4bff00, +0xd4b9423c, +0x4c3c1e99, +0x99d4b910, +0x204cd81e, +0x09d49914, +0x34874383, +0x432b4433, +0x005044f9, +0x4f76ff00, +0x119d0fd6, +0x1834f9d3, +0xa3ff000e, +0x1834fd41, +0x27ff000e, +0x64c2c521, +0xab40c2c5, +0xbd4127f1, +0x271e94d4, +0x0ef39b30, +0x9b64c2c5, +0x00070ef3, +0x4027ff8b, +0x1e94d4bd, +0xeb0ef39b, +0x40c0c5f1, +0xc0c5d311, +0x1834f960, +0xe3ff000e, +0x1834fd41, +0xc5ff000e, +0x485e64c2, +0x4efa8eff, +0x07a007f9, +0x27c207b1, +0x1c1e409c, +0xcc10dc07, +0x07d90741, +0x8aedbe1d, +0x070a0701, +0x8acfbe1d, +0x0bcd2b01, +0x07ad0bbd, +0x8ec0760b, +0x334087f9, +0xf9400b04, +0x0003cc40, +0x0f0c83ff, +0x0e230333, +0x9effff7e, +0x930302e6, +0x05706ff2, +0xfeb33ea7, +0x304c27fe, +0x34033101, +0x24032105, +0x4027f4a8, +0x0b0ef49b, +0xb32ea7fe, +0xf393fefe, +0x2705704c, +0x3101304c, +0x21053403, +0xf4a82403, +0xf49b4027, +0xa7fe0b0e, +0xfdebff3e, +0x34054027, +0x00004f27, +0x34150f82, +0xf49b4027, +0x4efe0b0e, +0xffbea7f8, +0x8007fdeb, +0x0027c027, +0x9f27a107, +0x0f820000, +0x018abbbe, +0xb915bc05, +0xf49b4027, +0xff3ea70e, +0x4427fde7, +0x3a153405, +0xe7ef4ea7, +0x053c35fd, +0x274a1548, +0xbe4c3500, +0x05018a94, +0x27b915bc, +0x0ef49b40, +0x0027f88e, +0xfd4efe0b, +0xffff4ea7, +0x094499fe, +0xffff1ea7, +0x034383ff, +0xd1348741, +0x33069012, +0xf1432b44, +0x00004843, +0x2724c6ff, +0xd10d1e40, +0x27069c14, +0x27430a21, +0x07420720, +0xabdf6bd4, +0x273027fe, +0xc0151e25, +0x34f91231, +0xff011e94, +0x14f146a6, +0xff023000, +0x030b44d8, +0x28138731, +0x1e0127f2, +0x8b002703, +0x8efeeb0d, +0x6bfe4efd, +0xbe05960f, +0x0e0010aa, +0x06529efe, +0x4efe8e00, +0x070419fd, +0xc61f6bd0, +0xbe185645, +0x0e0006cd, +0x0f659efd, +0x93165600, +0x018a58f3, +0xbab6f493, +0xbe430505, +0x270006c1, +0x8ed41d41, +0x07fd4efd, +0x563f6bd1, +0xbe3a2626, +0xbe000616, +0x27000e18, +0x1e402701, +0x1f22c41e, +0x4f4b0419, +0x00274220, +0xf493fd8e, +0x93018a1d, +0x05ba7bf3, +0x01273405, +0xd41d4227, +0x0027fd8e, +0xfc4efd8e, +0xba6af493, +0x294e6905, +0xa7dea743, +0x4209fee1, +0x0b08d199, +0x2bc007e3, +0x214049e2, +0x10c1ce42, +0xce09d499, +0xd4490a42, +0xd469e42e, +0xa71904ce, +0xfd4fff4e, +0x4ea74311, +0x05fee1a7, +0x084c9d43, +0x4d09429d, +0x8e406d4e, +0x07f94efc, +0x14bc23b0, +0x4b0b4147, +0x30074209, +0x0999d107, +0x0724c624, +0x07241e01, +0x47410341, +0x270107e4, +0xeb0b1c1c, +0x4c101d2b, +0x0311271d, +0x05f1f001, +0x531e3027, +0xe203e209, +0x40072266, +0x3b0c4c23, +0x87330149, +0x071047c4, +0x0b21234b, +0x0dc30b41, +0x07328742, +0x233c0b20, +0x2ba42712, +0x3b1b0b2d, +0x033301a9, +0xc40d0a21, +0xffffffdf, +0x21270bff, +0x4127071e, +0xce05142d, +0xe1270123, +0xca2be03b, +0x1223e30b, +0x0307f258, +0xf54ef98e, +0xf0c5f6a3, +0x24029954, +0x323b3127, +0x0750f2c5, +0xc520074f, +0xf1c54cf3, +0x142c2358, +0x2740f4c5, +0xf1c1103c, +0x05402740, +0xc5140314, +0xf38840f1, +0xf2c17207, +0x2310274c, +0xc53a2721, +0xac2748f1, +0x60f2c50d, +0x8964f3c5, +0x75891878, +0xea82f01a, +0x4cf4c100, +0x00e345ee, +0x0750f1c1, +0x233a074a, +0x3c230d4c, +0x3b413b0c, +0x54f1c131, +0x12010487, +0xa123350b, +0x020bc387, +0xb8073127, +0x40273a3b, +0xa103c20b, +0xd0079507, +0xb1036027, +0xc55cf3c5, +0x511e44f4, +0x1f070e01, +0x3a5b3e07, +0x870f3c83, +0x01410b43, +0xc12b2642, +0x428b5cf4, +0x12074506, +0x031e2e07, +0xf4c11e07, +0xce420b5c, +0xf4c11b41, +0x03c20544, +0x07338742, +0xc5320b2f, +0xc40344f4, +0x91034027, +0x091e3405, +0xd403de05, +0x4e05031e, +0x61030403, +0x0705fbf0, +0xc1211e3f, +0x92ca60f2, +0x074607a4, +0x2b410338, +0x96840a36, +0x01312784, +0x05040304, +0xa8d403d4, +0x01dd1ef3, +0x05454634, +0x034027d4, +0xc13405d4, +0x340340f2, +0xc1ed32ce, +0xa3ce58f3, +0x0e41270a, +0xc5402795, +0xf4c148f4, +0x1a798d44, +0x748d481b, +0x64f1c118, +0x1123a103, +0x0364f1c5, +0x001ff672, +0x48f0c1ff, +0xf58ef683, +0xffff3ea7, +0x7834d1ff, +0xd5400b06, +0x0b067834, +0xa7fe0bfe, +0xffffff4e, +0x010042b9, +0x07fc40c1, +0x83400732, +0x31030f4c, +0x4027121e, +0x14fd0103, +0xff00007c, +0x21234007, +0x070f4c83, +0xf0133314, +0x091e03f3, +0x007e14f9, +0x4006ff00, +0xffff4ea7, +0x0042bdff, +0xfc40c501, +0xfc4efe0b, +0xb43ec007, +0x0c0e4127, +0x04074027, +0xfc4efc8e, +0xcf03c007, +0x03ffffff, +0x0000cf83, +0x1c07fc00, +0x3c272027, +0xf97fbe16, +0xb34ea700, +0x3027fff9, +0xc5404cc5, +0x40c53c43, +0x4efc8e38, +0x23d007fa, +0xc24714dc, +0xdc03cd0b, +0x24db9914, +0x4127ce09, +0xae074b3b, +0xa30b4223, +0xa432d001, +0xfa8e0127, +0x3b0c2c23, +0x87e20b2b, +0x87040b4e, +0xec98be23, +0x27412700, +0x9dca0d00, +0xfa8e31d4, +0x0399f74e, +0x3b412724, +0x07f06343, +0x070a0174, +0x07f105d0, +0x877333b1, +0x27c00784, +0x07c24990, +0x871a070b, +0xbe910322, +0x0b00ec62, +0x03b70ba8, +0x109cc4c2, +0x24d499e9, +0xc407de01, +0xd49d4103, +0x03f40124, +0x07d405c6, +0x071f070d, +0x0531272c, +0xff6d7efe, +0xd3b10596, +0x4c3b4127, +0xd3b5340b, +0xf78ef043, +0xf093fa4e, +0xbe01298c, +0x9300f4e1, +0x01298cf0, +0x00f4d8be, +0xf9afbea7, +0x0cdc27ff, +0xb209a027, +0xc2071d07, +0xf093cd3b, +0x07012996, +0xbeb2033c, +0x0b00f4b9, +0xc4d103ac, +0x000670bf, +0xcea7e1ff, +0x89fff9b3, +0xf09332c1, +0xbe01299b, +0xa100f49d, +0x07c3b1c1, +0x934a0721, +0x0129a2f0, +0xfa0e2a2b, +0x00f4889e, +0x08c1f64e, +0x3c0cc138, +0x07240e99, +0x27b107d0, +0x27702790, +0x3c270c6c, +0x2b06071c, +0x03031e36, +0x07222701, +0x5b203b4c, +0x5c2c0b40, +0x03f3f041, +0x2bc2041e, +0x234007eb, +0x24470c4c, +0x21492d0b, +0x410b4e3b, +0x4487d301, +0x3807430b, +0xa1273c0b, +0x11034305, +0x3e074a07, +0x214d403b, +0xc40b3703, +0x7127030a, +0x91071902, +0x4e3b4a07, +0x94da4223, +0x07766614, +0x7e0d0713, +0x1007fc09, +0xb97e0d07, +0x24de99fe, +0xa190cbca, +0x3cd3c1d4, +0x2b3cdbc5, +0xa54b0b43, +0x4ef68ed4, +0x3c02c1fa, +0x074003c1, +0x0304a1d1, +0xe30fffdd, +0x2b0fffdd, +0x2ba00732, +0x3800c1d4, +0xbd073766, +0xb307d302, +0xc20bcb07, +0x6abe1c07, +0x0a0700f7, +0x357e1c07, +0x06db2bff, +0x7e0d07d6, +0x0a07fdf6, +0xfa0e1d07, +0x8eff235e, +0x99fa4efa, +0xd0073104, +0xb307a207, +0x46c6c107, +0x26fc1d7e, +0x070d0705, +0xfb877e1c, +0xd49d4027, +0x5e0fd631, +0x070bb2c0, +0xfdb07e0a, +0xb3c00e66, +0x234c474f, +0xd299144c, +0x274d0b24, +0x09323b31, +0x22312344, +0x1e3c0734, +0x03420711, +0x07c44247, +0x1e31033c, +0x03320705, +0x3b412738, +0x07d1a143, +0x0b312334, +0x0b13eb13, +0x7e0d0714, +0xd489ff4b, +0x030d0732, +0x8d1c0741, +0xfa0e32d4, +0x27fb245e, +0x4efa8e00, +0x07d207fa, +0x46b107a0, +0x073d072a, +0xa72b071a, +0xfff9b30e, +0xa6fd7e7e, +0xb3cea707, +0xc099fff9, +0x27222724, +0xbe070310, +0x07047710, +0x7e0c0710, +0xd61efda4, +0xf49b4027, +0x07fa8e0e, +0x0c0c2740, +0x0103031e, +0x203b2127, +0xa7f824ca, +0xffffff3e, +0x067834d1, +0x420b1027, +0x067834d5, +0xd99e2227, +0xfb4e0476, +0x1f9bb007, +0xfff09312, +0xb2be0127, +0xb11100f2, +0x280cf093, +0xf2a7be01, +0x93b12100, +0x012813f0, +0x00f29cbe, +0xf093b101, +0xbe01281a, +0x2700f291, +0x31db07c0, +0x931c07d2, +0x01281bf0, +0x7ebec103, +0xd40300f2, +0xec0fccc4, +0xfb0e0b07, +0xfff7529e, +0xfd4efe0b, +0xb486fd93, +0x0fd49905, +0x0d074686, +0xbe140c03, +0x0701851f, +0x100c030d, +0x018516be, +0x40a73027, +0x250fd39d, +0x0ed39dd4, +0xfd4efd8e, +0x12110419, +0xe103e447, +0x43273e87, +0x10310d39, +0x120034f5, +0x31f1ff02, +0xff021000, +0x1c33200b, +0x1d1c5318, +0x4e071786, +0x43f14433, +0xff021804, +0x44f14d87, +0xff021600, +0x242b232b, +0x202b1100, +0x0c1edcc4, +0x53a04f9b, +0x4c83144c, +0x87242b0c, +0x0742273e, +0x0034f502, +0x8eff0212, +0xbefe4efd, +0x0e01847b, +0x8c869efe, +0x27fc4e01, +0x21f49b40, +0xb3eaf393, +0x27202705, +0x32051f4c, +0xf4c83403, +0xb3dafc93, +0x9d402705, +0xeebe0ec4, +0x42270006, +0x2710c49d, +0x8d20094d, +0x4c2716c4, +0x15c49d23, +0xc49d4127, +0x8d4a2714, +0x4c2712c4, +0x60c0c51e, +0x0e11c49d, +0x84259efc, +0x93f54e01, +0x05b39ffe, +0x4960e8c1, +0x0ce489e3, +0x5007f6a3, +0xea3081c1, +0x0702c734, +0xbe202718, +0xf6018b6c, +0x5102f10f, +0x3083c182, +0xf3c58db1, +0x81f20544, +0x159027d4, +0x27d291f4, +0x25ffff6d, +0xc1d3a1f2, +0xf33544f2, +0x0710d489, +0x03b407c2, +0xc50487b1, +0xf9c540f2, +0x01361e50, +0x514f6bc2, +0x50f4c523, +0x2a092431, +0x4c03430b, +0xa1040b18, +0x3023c12e, +0x24116a4e, +0x040b4401, +0x3e0b2429, +0x140b930b, +0xf4c16a07, +0xda410350, +0xc403ce17, +0x1e03fbf0, +0x0ed7890e, +0x27ff4c27, +0x50f4c510, +0xd401e51e, +0x400bf955, +0xd101f445, +0x140b0507, +0x0b241c03, +0x8a9cbe19, +0x5b0ff601, +0xbe050702, +0x5100025a, +0x2744c684, +0x07141eb0, +0x61f19305, +0x2c270126, +0xbe30270c, +0x2700050d, +0x3b070cbc, +0x1f070507, +0xbe182c27, +0xb10004fd, +0x18bc0381, +0x3b071c01, +0x05072c07, +0x0004ecbe, +0x012a8389, +0x872307d9, +0x2b253343, +0xc1bc0b24, +0xfbc550f4, +0x36920b54, +0xc5302745, +0x131e34f3, +0xc550f4c1, +0x439b34f9, +0x35333407, +0x342b4333, +0x6207930b, +0xc150f4c1, +0x433350f2, +0x242b2533, +0xc14cf2c5, +0x2f0754f3, +0x27182c03, +0x0b240340, +0xffed2763, +0x58f4c5ff, +0xc538f4c5, +0xf2c55cf4, +0x00995e64, +0x0148f4c1, +0xceab094a, +0xa4110abe, +0x0138f9c5, +0xc1940b44, +0xfb8d60f4, +0xc1f4651c, +0xf48538f4, +0xac51a431, +0xc40bf9a5, +0xa4a1fc95, +0x0b30adc1, +0x58f4c1d4, +0xf4c5fdb5, +0x8da42930, +0x76361ef4, +0x000444be, +0x0354f2c1, +0xf2c51c2c, +0xc1121e54, +0x360764f1, +0x2c270507, +0x186c0318, +0x000428be, +0x2958f3c1, +0x0b3d0ba4, +0x58f3c59c, +0xeb07740b, +0x07288489, +0x54f3c11f, +0x1c030507, +0x1c2c2718, +0xff7e74fa, +0xc134f4c1, +0xf2c15cf3, +0x0b31034c, +0x34f4c542, +0x895cf3c5, +0xf2c12a84, +0x1124da5c, +0x0744f7c1, +0xff3d27d6, +0xc56027ff, +0x7e1e3cf3, +0xc15cf4c1, +0x448744f3, +0x0b34f2c1, +0x50f4c134, +0x24ab2833, +0xf3c57027, +0x60f2c548, +0x7a01a31e, +0x093cf2c1, +0x1e24cea4, +0x1c01a111, +0x24be2c07, +0x3b070003, +0x1a070507, +0x9abe2227, +0xa3090003, +0xf3c5dc0b, +0x21ac313c, +0x073d07a1, +0xbe05072c, +0x51000303, +0x41cd0bab, +0x070507a1, +0xbe3c072b, +0x290002f3, +0x0bdc07a4, +0x89940bdb, +0xbd072884, +0x05073d07, +0x94dab403, +0x036103a6, +0x2a848974, +0x7027643a, +0x9027411e, +0xf4c1e21e, +0xa14c0140, +0x07c191cb, +0x02bdbe2b, +0x30cac100, +0xc1b1bd0b, +0x2a070507, +0xacbe3b07, +0xc4290002, +0xda0bdb07, +0x8489940b, +0x073d0728, +0xcf94da05, +0x0340f2c1, +0xc5240371, +0x848940f2, +0x3147d22a, +0xe31e9027, +0x210b2387, +0x46f62401, +0x0c838051, +0x2303330f, +0xffff7e0e, +0x02f79dbe, +0x1e0d0c27, +0xc124011a, +0x31033c88, +0x48150027, +0x0b1ee34d, +0x11270507, +0x0188dcbe, +0xf6830327, +0xfc4ef58e, +0x70bec007, +0xc0510185, +0xfd4efc8e, +0x07040499, +0xbe4806d0, +0x3901855f, +0x9b45d6d4, +0xd475304f, +0x85314f9b, +0x9bfd8ed4, +0xd475484f, +0x85494f9b, +0x4efd8ed4, +0xffcea7f9, +0xc4d1ffff, +0xb0070680, +0x91070999, +0x2744d60d, +0xa7331ea1, +0xffffdf0e, +0x00f2c6be, +0x0680c4d1, +0x0674c3d1, +0x20274487, +0x21273402, +0x1845c2bd, +0x1845c4b9, +0xa32744c6, +0xa127031e, +0xffdf0ea7, +0xf27abeff, +0xf6d4a100, +0xdf0ea749, +0x90beffff, +0xb16100f2, +0x070c0c27, +0x71eebe2a, +0xa7c00704, +0xffffdf0e, +0x00f257be, +0xcc05cde6, +0xa52cd499, +0x9d4103dc, +0x0ea72cd4, +0xbeffffdf, +0x6100f263, +0x070907b1, +0x71c2be2a, +0x2cd49904, +0x4487d3a1, +0xc007430b, +0x0ea74005, +0xbeffffdf, +0x0600f220, +0x2cd499c7, +0x41033127, +0x412cd49d, +0x0b393bb4, +0x45002743, +0x27f98eb4, +0xf98e150c, +0x0499f84e, +0x07820705, +0x6ba107b0, +0x404ff68f, +0xff9ea701, +0x1499ffff, +0x391c9955, +0x0e2e9db9, +0x4d07c40b, +0x4f6b4c2b, +0x0ea74766, +0xbefff1d5, +0xb902f652, +0x070e2e9d, +0x6b4c2b4d, +0x2744c64f, +0xa7f88e0b, +0xffffffce, +0x0e2cc4b9, +0xa729d4ce, +0xfff1d70e, +0x02f62dbe, +0x0e2cc4b9, +0x9119d4ce, +0xe33027c4, +0x04ffff4d, +0x0200004e, +0x0c273127, +0x44c3bd0c, +0xa7f88e18, +0xffffff3e, +0x184434b9, +0x0c2744e6, +0x07f88e0c, +0xbd41034d, +0xa70e2e34, +0xfff1d50e, +0x44c60439, +0x019227be, +0x4c834d07, +0x8724070f, +0x2b243334, +0x33242b23, +0xd02e2323, +0xb295fff1, +0x0794a499, +0x54249d3a, +0x3c03b491, +0x304c0370, +0x19270927, +0x01233e01, +0x34034e05, +0xf1984403, +0x23512481, +0x33e3b425, +0xb89d4127, +0x05b49d06, +0xb055b335, +0xae99b045, +0x07be9d1c, +0xb465a451, +0x9d1cae99, +0xa4c12d2e, +0x40a3c144, +0xa4c12435, +0x45232548, +0x95ae9924, +0x99552e9d, +0x46561aa4, +0x9960a499, +0x44d619a3, +0x32004127, +0x430b4027, +0x9924249d, +0x473639a4, +0xb41d4627, +0xb43d4927, +0x2706b399, +0x2d040a4d, +0x103cc4b4, +0x1e031e0f, +0x27b451ff, +0x55440300, +0x27f88eb4, +0x4ef88e00, +0x070451f7, +0x63320bc3, +0x07a007f0, +0xc2b107d2, +0x03554634, +0x0a07421e, +0x2f071c07, +0x018419be, +0x4d07f301, +0x4307d302, +0x031ef405, +0x7411f3e8, +0x4c333327, +0x1d4c5318, +0x41c84413, +0x05f301f0, +0x2783158b, +0x05843540, +0x35931590, +0x0bf40194, +0x0bd42bb4, +0xa7101ec4, +0xfdefff7e, +0xe7ff8ea7, +0xef9ea7fd, +0xdfd6fde7, +0xe8051eae, +0xa7061ef3, +0xfdefff2e, +0x33272411, +0xfc6a4ddc, +0x8ef043ef, +0x51fa4ef7, +0x0bc30704, +0x07f06332, +0x07d207a0, +0x2334c2b1, +0x1f1e0355, +0x01839dbe, +0x1b07f301, +0xd3024d07, +0x24074307, +0xf9bef405, +0xf401017a, +0xd42bb40b, +0x1c07c40b, +0x0a072f07, +0x43dadfd6, +0x4efa8ef0, +0x040499fb, +0x4a86d007, +0x01825ebe, +0xdb91c027, +0xbc75dc55, +0xd151bc65, +0x97be0d07, +0xf2930183, +0x5105ad5c, +0x7423c1d4, +0x24c5430b, +0x9d412774, +0x402756b4, +0x9d05dc9d, +0xfb8e04d4, +0xc6040499, +0x71043947, +0x9b459603, +0x048130f3, +0x1e31f49b, +0x48f39b09, +0xf49b0481, +0x837a9e49, +0x4efe0b01, +0x07c007fb, +0x8201beb1, +0x07c45101, +0x554b0b0c, +0x9efb0ec4, +0x4e018360, +0x9bd007fc, +0xc1d848cf, +0xbe0d07fb, +0x51018190, +0x17cc33d4, +0x4333402b, +0x071bcc53, +0x8e0c0b04, +0x93fc4efc, +0x05ad5ffd, +0x26094d27, +0x625afc93, +0x6ad4ad05, +0xbd412702, +0x010269d4, +0xbd4527c3, +0x160268d4, +0x000d2736, +0x27100708, +0xef16be20, +0x93c00500, +0x05ad2bfc, +0x4616c401, +0x18180d27, +0x20271007, +0x00eeffbe, +0x0d07c005, +0xf4933027, +0x030185cc, +0xd4052c0c, +0x9d09d39d, +0xfc8e08d3, +0xf093fe4e, +0xbe05ad04, +0x0efffeff, +0x4e931efe, +0x07d007fc, +0x07c403c0, +0x030c071d, +0x20272c1c, +0x01844bbe, +0x0c070676, +0xa2be1127, +0xf4930184, +0x0501858c, +0x8e0327d4, +0x07f94efc, +0x99a007d0, +0xa4034902, +0x0a071d07, +0xbe2c1c03, +0x07018420, +0xb70ff690, +0x270a0700, +0xbe02001d, +0x070183d6, +0xa70ff690, +0xc4d49900, +0x070e41d8, +0x03b3be0d, +0xc4d49900, +0x2f1e41e3, +0x070e42d8, +0x06c7be0d, +0xc4d49900, +0x1f1e42e3, +0x070e44d8, +0x0e69be0d, +0xc4d49900, +0x0f1e44e3, +0x070f48d8, +0x0dfcbe0d, +0xc4d49900, +0xd49d48e3, +0xc4d499c4, +0xd4994506, +0x4b41c049, +0xa181d499, +0x9d4103d3, +0x4d2781d4, +0x34450480, +0xabbefb93, +0x890a0705, +0xb0be78bc, +0x0353fffe, +0x1127c00b, +0xbc8d0a07, +0x83efbe78, +0xff3ea701, +0x4127ffff, +0x06a934bd, +0x270f3399, +0x0ef49b40, +0x33874127, +0xb04034f5, +0xd499ff02, +0x934536c4, +0x018580f4, +0x0907d405, +0xfd4ef98e, +0x0403d007, +0xfff7ccbe, +0xf4930324, +0x050184a0, +0x4efd8ed4, +0xe1f493fe, +0x44010560, +0x3f1e4516, +0x061ef3e8, +0xefff2ea7, +0x272401fd, +0x184c3333, +0xc01d4c53, +0xf493eb44, +0x010560c0, +0xff4ea743, +0x4305fde7, +0x08001d27, +0x20274115, +0x3ea74235, +0xa7fde7ef, +0xf9f7ff4e, +0x31153405, +0xf4933235, +0xb905ab94, +0x16027444, +0x001d2745, +0x93141e08, +0x05ae5ff4, +0x07204489, +0x87143314, +0x03142b44, +0xf493181c, +0x0105ab6c, +0x1e451644, +0x1ef3e83b, +0xff2ea706, +0x2401fdef, +0x4c333327, +0x1d4c5318, +0x93eb44c0, +0x05ab4bf4, +0x4ea74301, +0x05fde7ff, +0x27411543, +0xa7423520, +0xfde7ef3e, +0xe7ff4ea7, +0x153405f9, +0xbe323531, +0x93017b2b, +0x05ab27f4, +0xc6d14499, +0x004d274d, +0xa0f49b01, +0x7fff2ea7, +0x19f193f9, +0x3c270560, +0x1024f180, +0x0500ff23, +0x98240324, +0x9b4027f3, +0x4d270ef4, +0xf49b0500, +0x9b4427a0, +0x14d1b8f4, +0xf49b0204, +0x0014d1bb, +0xbef49b02, +0x020814d1, +0x1ebaf49b, +0x1ef3e805, +0xff2ea706, +0x2411fdef, +0x4ddc3327, +0x93effc6a, +0x05aac7f0, +0xfd9efe0e, +0xfe4efffc, +0xf49b4427, +0xb5f49321, +0x4401055f, +0x3f1e4516, +0x061ef3e8, +0xefff2ea7, +0x272401fd, +0x184c3333, +0xc01d4c53, +0x3ea7eb44, +0xa7fde7ff, +0xf9f7ff4e, +0x1d273405, +0xf4930800, +0x01055f84, +0x27311540, +0xa7323520, +0xfde7ef4e, +0x41154005, +0xf4934235, +0xb905aa68, +0x93027443, +0x05aa5bf4, +0x01274401, +0x00273486, +0x4c060b33, +0x3b1e0516, +0x061ef3e8, +0xefff2ea7, +0x272401fd, +0x184c3333, +0xc01d4c53, +0x3ea7eb44, +0xa7fde7ff, +0xf9e7ff4e, +0xf4933405, +0x0105aa24, +0x27301541, +0xa7323520, +0xfde7ef4e, +0x40154105, +0xf4934235, +0x9905aa10, +0x4fc6d144, +0x0df49375, +0x2407055f, +0x020b2d03, +0x2ce33407, +0x7f3ce37f, +0x3c033419, +0xf932c280, +0xd8b84f9b, +0xf940004d, +0x9b204c27, +0x4f9bb8f4, +0x004dd8b8, +0x4f9bf940, +0xd9f393bb, +0x34d5055e, +0x4f9b0204, +0x0034d5be, +0xba4f9b02, +0x020834d5, +0x01004d27, +0xa7a0f49b, +0xf97fff3e, +0x01802c27, +0x1034f534, +0x0300ff23, +0x27f29834, +0x0ef49b40, +0x05004d27, +0x1ea0f49b, +0x384f9b07, +0x9bfb41d8, +0x41d8484f, +0x89f093fb, +0x83be05a9, +0x4027fff8, +0xa721f49b, +0xfdefff2e, +0xf3e8031e, +0x33272411, +0xfc6a4ddc, +0x65f493f6, +0x44b905a9, +0x45160274, +0xf3e8fe8e, +0x2ea7061e, +0xc1fdefff, +0x33273c24, +0xfc6a4ddc, +0x4efe8eee, +0x07b007fa, +0x9ba207d1, +0x41d8484f, +0x484f9bfb, +0xf49b42e3, +0x49b49948, +0x931f41c4, +0x05ab9ffc, +0x0827c401, +0xf48b1027, +0x0c27c401, +0x8b102710, +0x27c401f4, +0x8b112708, +0x81f493f4, +0xd53305ab, +0x44011a07, +0x08271dab, +0x4f9bf48b, +0xfb41d848, +0x99484f9b, +0x42e37ab3, +0x43ab3347, +0x8e48f49b, +0x89f54efa, +0xf0635404, +0x05580bc1, +0xe00989f4, +0xb489f801, +0x0f9c0312, +0xc114b289, +0x9473f007, +0x03c18433, +0xe80ec1f4, +0xc1f80cc1, +0x05c1e406, +0x07842bec, +0x33d00749, +0x27722b44, +0x0b272713, +0x0b8e0b63, +0x7e5c0b74, +0xfc93ff57, +0x9905ab10, +0xc401cdd1, +0xf48b0827, +0x01ced199, +0x8b0827c4, +0x99c401f4, +0x0827cfd1, +0x6153f48b, +0x51538153, +0xd4997153, +0x41f49bcc, +0x00cdd499, +0x4cc4644c, +0x4127226e, +0x9941f49b, +0xf49b3fb4, +0x40b49941, +0x0141f49b, +0x270127c4, +0x01f48b10, +0x270127c4, +0xb9f48b10, +0xd6011dd4, +0x1e202744, +0xdcd4990c, +0x44862127, +0x21032027, +0xbd80d499, +0x240275d2, +0x1ea42743, +0xd9d4990c, +0x4486a127, +0xa213a027, +0x23fcd399, +0x6b430731, +0x1431034f, +0x04a10348, +0xb9a10336, +0x86011cd4, +0x27a10344, +0x41f49b44, +0xf641f29b, +0x41f49b24, +0x21c43c1e, +0x80d39939, +0xaa5af493, +0xd9db9905, +0xc1274401, +0xc0273304, +0x11270127, +0x1027b100, +0x4b07f48b, +0x4013c213, +0x2742f49b, +0x42f49b40, +0x0341fc9b, +0x42fb9bb1, +0xf49bc210, +0x41fa9b42, +0xaa22fc93, +0x27c40105, +0x8b102701, +0x23f401f4, +0x41f49b41, +0xf99b9123, +0x27c40141, +0x8b112701, +0x27c401f4, +0x8b112701, +0x166656f4, +0x9655d686, +0x27c40175, +0x8b102701, +0x931a1ef4, +0x05a9e7f4, +0x01274401, +0xf48b1127, +0x9b41f69b, +0xf59b41f8, +0x41f79b41, +0x0134d4d1, +0x4ce31027, +0x004f00ff, +0x27020202, +0x34d4b911, +0x6bb10701, +0x041027bf, +0x07112742, +0xc69f6b91, +0x1e3127b4, +0x93390703, +0x05a9a3fc, +0x0127c401, +0xa3071127, +0x8bc8d8c1, +0x5ad4b9f4, +0x46af6b01, +0x27c4014a, +0x8b112701, +0xb9c401f4, +0x27015bd1, +0xb9f48b08, +0xc4015bd4, +0xa91fff4c, +0x01015ed1, +0x100c27c4, +0xc401f48b, +0x0160d1a9, +0x1e100c27, +0x27c40107, +0x8b102701, +0x51fc93f4, +0xc40105a9, +0x10270127, +0xc401f48b, +0x1a070127, +0xab86f48b, +0x0159d1b9, +0x0327c401, +0xc401f48b, +0x01271907, +0xc401f48b, +0x1b070127, +0xb806f48b, +0x0135d1b9, +0x0827c401, +0xd1b9f48b, +0xc4010136, +0xf48b0827, +0xd1b9c401, +0x08270137, +0xfa93f48b, +0x0105a900, +0x270127a4, +0xb9f48b10, +0x66015cd4, +0x27a4014a, +0x8b112701, +0x66d1a9f4, +0x27a40101, +0xf48b100c, +0x0164d1a9, +0x0c27a401, +0xa9f48b10, +0x01016ad1, +0x100c27a4, +0xd1a9f48b, +0xa4010168, +0xc027491e, +0x4c534807, +0x10cc3310, +0xc4abb807, +0xbc33a301, +0x334c0710, +0x0127104c, +0xbc531127, +0x8bb4ab10, +0x27a401f3, +0x1027100c, +0xa401f48b, +0x27100c27, +0x8b80001d, +0x27a401f4, +0x1b07100c, +0xf48b105b, +0xa4011b07, +0x0c271fab, +0x01f48b10, +0x270127a4, +0x93f48b11, +0x05a867fc, +0x0127c401, +0xf48b1027, +0x0127c401, +0xf48b1027, +0x0127c401, +0xf48b1027, +0x0127c401, +0xf48b1027, +0xa846f493, +0x8b440105, +0x8ef043f4, +0x99fb4ef5, +0xb007d104, +0x4486c027, +0x1327c127, +0x687e2827, +0xd0b499fc, +0x9941f49b, +0xf49bccb4, +0x15fd9341, +0xd40105a8, +0x01271c07, +0xd401f48b, +0x10270127, +0xc027f48b, +0x9b41fc9b, +0xfc9b41fc, +0x27d40141, +0x8b102701, +0x27d401f4, +0x8b102702, +0x42fc9bf4, +0x9b42fc9b, +0xd40142fc, +0x11270127, +0xb199f48b, +0x27d401d3, +0x01f48b01, +0x270127d4, +0x99f48b10, +0x4c00cdb4, +0x6e4cc464, +0xd2b19917, +0x0127d401, +0xd401f48b, +0x10270127, +0x4027f48b, +0x9342f49b, +0x05a7a7f4, +0xf48b4401, +0xf54efb8e, +0x077d0299, +0x450499b0, +0x275808c1, +0x27248651, +0x2744c650, +0x81111e70, +0x86302784, +0x07312744, +0x0741c343, +0xc17f6b74, +0xb69960bd, +0xd9b999d7, +0xa7277506, +0x4f1e2527, +0x26275e46, +0x10270b07, +0x93fb9a7e, +0x05a753fc, +0x0827c401, +0xf48b1627, +0x0827c401, +0xf48b1127, +0xf49b4027, +0x27c40141, +0x8b112701, +0x27c401f4, +0x8b102701, +0x27c401f4, +0x8b102702, +0x25fc93f4, +0xc40105a7, +0xf48ba727, +0xf48bc401, +0x13272127, +0x21442e1e, +0x1227a527, +0xb499261e, +0x994786dc, +0x434480b4, +0xe3d8b4c1, +0xc0ffff4d, +0x0300004e, +0x27a62709, +0x1e102721, +0x27a62707, +0x07112721, +0xfb217e0b, +0xffffdd34, +0x5e41fd9b, +0x3d0700a4, +0x3e543103, +0x07010000, +0x1e102743, +0x53430709, +0x1c27104c, +0x004d3010, +0xa3485301, +0x104c3018, +0x14a34453, +0x42534430, +0x421012a3, +0x210711a3, +0x530f2c03, +0x3be12724, +0x072103e1, +0x10dc2701, +0xfff11fcc, +0x271affff, +0x07161e21, +0x110c0840, +0x41234d07, +0x330f4c83, +0xf49b104c, +0x100c2340, +0x0307f240, +0x4d270e2b, +0xf49b8000, +0x10ec2740, +0x21072c1e, +0x07111c08, +0x07122b2e, +0x104c2730, +0x315b422b, +0x343b2123, +0x330f2c83, +0x3fab102c, +0xf39b32ab, +0x3b412740, +0x8b412341, +0xd311cc04, +0x9941fa9b, +0xf49bd0b4, +0x25fd9341, +0xd40105a6, +0x27deb199, +0x06f48b08, +0xd6b09976, +0xffff1d27, +0x0113fdbe, +0xb941f09b, +0x960275b4, +0x83818147, +0x0000ff1f, +0x23104c80, +0x001fa311, +0x03ffffff, +0x27d40111, +0x99f48b08, +0x4986dcb4, +0xd0d9b499, +0xb4992542, +0x2742207d, +0x99191e40, +0x43c480b4, +0xdab49910, +0x990a43c4, +0x4447dbb4, +0x041e4223, +0x9bdbb499, +0x7b6642f4, +0xa5b6fc93, +0x27c40105, +0x8b102701, +0xfcb399f4, +0x43073123, +0x31034f6b, +0xc01142d0, +0x34440e33, +0x0100b4d1, +0x0d1e4124, +0x010a35c4, +0x270127c4, +0x042e5e11, +0x255ec401, +0x1a5ff604, +0x7db49904, +0x930e42c4, +0x05a573f4, +0x01274401, +0xf48b1127, +0xa566fa93, +0x27a40105, +0x8b102701, +0xfcb499f4, +0x991241c4, +0x41e47db4, +0xb49901c3, +0xbc41e490, +0x00d05e01, +0x995442c4, +0x41e47db4, +0x808101af, +0x0100b1d1, +0x011370be, +0xb4b90224, +0x4556011c, +0x0090b499, +0x2041c442, +0xa51ef493, +0x27440105, +0x8b112701, +0x9b4227f4, +0x402741f4, +0x2741f49b, +0x41f49b43, +0xb901ab5e, +0xe6011cb4, +0xfc016e4f, +0xe0016a01, +0x5e016602, +0x43c400ac, +0xd183811b, +0x070100b4, +0x07110319, +0x0b149b09, +0x1317be03, +0x480ff601, +0xc45c1e01, +0x83813844, +0x013d31e0, +0x0100b4d1, +0x11031907, +0x149b0907, +0xf6be030b, +0x0c060112, +0xa4010124, +0x02e40d1e, +0x92f00147, +0xa4010143, +0x11270127, +0x4027f48b, +0x1e41f49b, +0x2f45c48c, +0x8c81d907, +0x0100b4d1, +0x1d07d103, +0x0c07149b, +0x0112c0be, +0xb39905f6, +0xd9b499da, +0xa401432e, +0xf2ff5a5e, +0xe6010adc, +0x5e0106cf, +0x46c4ff48, +0x00bcd149, +0x03190701, +0x9b808111, +0x1293be1c, +0xc4087601, +0xb39910c2, +0xd9b499da, +0x00e143ee, +0xcc5ea401, +0x0dc3c400, +0x99dab399, +0x43eed9b4, +0x3e1e00cf, +0x00c9c4f0, +0x00c50ff6, +0x99dab399, +0x43eed9b4, +0xfd5e00bb, +0x3547c4fe, +0x04e08081, +0x19070087, +0x0100b4d1, +0x08c41103, +0x27149b69, +0x123fbe08, +0x700fd601, +0x99dab399, +0x43ced9b4, +0x27a40167, +0x8b112701, +0x9b4027f4, +0x331e41f4, +0xd15548c4, +0xc40100b4, +0x19073342, +0x80811103, +0x0ebe1147, +0x0c360112, +0x99dab399, +0x43ced9b4, +0x27a40137, +0x8b112701, +0x9b4027f4, +0x848141f4, +0x42274824, +0x27fea35e, +0xfe9e5e43, +0x071943d0, +0x03808119, +0xbe149b11, +0x960111d9, +0xdab39905, +0xeed9b499, +0x99ff1934, +0x43c480b4, +0x7db49923, +0x991d41c4, +0x4736ddb4, +0xa37af493, +0x27440105, +0x8b112701, +0x9b4027f4, +0x412741f4, +0x93fe5b5e, +0x05a363f4, +0x01274401, +0xf48b1027, +0xc47db499, +0xb4997d42, +0x4044c4fc, +0x31c08381, +0x00b4d165, +0x03190701, +0x9b090711, +0xbe030b14, +0x44011175, +0x31f49301, +0x440105a3, +0xf3930d1e, +0xc405a328, +0x34011202, +0x11270127, +0x4027f48b, +0x2741f49b, +0x01251e41, +0xc4321e34, +0x49072845, +0x41038381, +0xc61f43d2, +0xfdf49337, +0x440105a2, +0x11270127, +0x4027f48b, +0x9b41f49b, +0x432741f4, +0x1e41f49b, +0xe1f4930e, +0x440105a2, +0x10270127, +0xb499f48b, +0x1b41c07d, +0xe6dcb499, +0xd8b4c146, +0xffff4de3, +0x00004ee4, +0x99016903, +0x43e480b4, +0xb4990162, +0x2042c4fc, +0xe490b499, +0x81014841, +0x424fe684, +0xa1f49301, +0x440105a2, +0x11270127, +0x4627f48b, +0xc401235e, +0x92d07344, +0x8109073a, +0x00b3d184, +0x07910301, +0x9b040b19, +0x10b7be13, +0x1202e401, +0x71f49301, +0x440105a2, +0x11270127, +0x4227f48b, +0x2741f49b, +0x41f39b30, +0xf49b4327, +0x5e412741, +0x91e400bd, +0x808100ed, +0x0100b1d1, +0x11470103, +0x011080be, +0x00db01e4, +0xa23af493, +0x27440105, +0x27f48b11, +0x41f49b42, +0xf49b4027, +0x9b332741, +0xf49b41f3, +0x00b35e41, +0xd14246c4, +0xf00100b4, +0x0700b044, +0x81c103c9, +0x9b1c0780, +0x0ff4be14, +0x0b4c4701, +0x93d0074c, +0x05a1fbf3, +0x011a40ce, +0x27012734, +0x81f48b11, +0x724dce84, +0xf49b4227, +0x9b402741, +0x661e41f4, +0x7d1e3401, +0xd14a48c4, +0xd00100b4, +0xc9076c43, +0xc1038d81, +0x149b1c07, +0xafbe0d07, +0xcc47010f, +0x9357c0ce, +0x05a1b7f3, +0x3401d824, +0x3401321e, +0x11270127, +0x4227f48b, +0x2741f49b, +0x41f39b30, +0xf49b4327, +0x41f49b41, +0x9b41f39b, +0x371e41f3, +0x812747c4, +0x2248c484, +0xa182f493, +0x27440105, +0x8b112701, +0x9b4327f4, +0x422741f4, +0x2741f49b, +0x41f49b40, +0x1e41f49b, +0x61f4930e, +0x440105a1, +0x10270127, +0xb499f48b, +0x164546d1, +0xd5b49955, +0x2341f49b, +0xf69b1a6c, +0xd8b49942, +0x402745e6, +0x9b41f49b, +0xf49b42f4, +0x27061e42, +0x41f49b41, +0xfc930b07, +0x03059e30, +0x78cb8904, +0xfff122be, +0xb00b0353, +0x8e78cb8d, +0x07fc4ef5, +0x0dfc93d0, +0x081e05a1, +0xdc234401, +0x27f48bff, +0xff1c2708, +0xdccc4c07, +0xc401efff, +0xf48b1d07, +0xfc4efc8e, +0xd63ec107, +0xfc0e0c07, +0xf94ed01e, +0x26271027, +0x1cbea007, +0xa1b9fff5, +0x05270262, +0x3e101c03, +0x07ba07de, +0x93c027da, +0x05a0c3f9, +0x0175d1b9, +0x08279401, +0xf48bc103, +0xccc4d103, +0xd027ef10, +0xa0aafc93, +0x010b1e05, +0x84b1b9c4, +0x8bd10301, +0x62a4b9f4, +0x03082702, +0xecd4dab1, +0xa092f493, +0x8b440105, +0x4ef98ef4, +0x27b007f8, +0xbe262710, +0xd1fff4bf, +0xb90124bc, +0x070128b9, +0xb9a183ac, +0x160129b8, +0x279520a5, +0x27031e16, +0x2d0c2714, +0x27ff6d7e, +0x41f49b40, +0xa052fd93, +0x27d40105, +0x8b102701, +0x27d401f4, +0x8b190707, +0x27d401f4, +0x8b1a0701, +0x07d401f4, +0x8b062718, +0x01c153f4, +0x831c07d4, +0x8b012711, +0x01c153f4, +0x831c07d4, +0x8b012711, +0x01c153f4, +0x831c07d4, +0x8b012711, +0x01c153f4, +0x831c07d4, +0x8b012711, +0x27d401f4, +0x8b102701, +0x27d401f4, +0x8b102701, +0xc0a9b6f4, +0xb1b92995, +0xd401012a, +0xf48b0427, +0x012bb1b9, +0x0427d401, +0xb1b9f48b, +0xd401012c, +0xf48b0427, +0x012db1b9, +0x0427d401, +0xfc93f48b, +0x01059fc0, +0x270827c4, +0x27f48b10, +0x41f49b41, +0x0127c401, +0xfc931027, +0x8b059fac, +0x8bc401f4, +0x8bc401f4, +0x27f88ef4, +0x402b104c, +0x143b0123, +0x330f0c83, +0x1fab100c, +0xf19b10ab, +0x07fe0b40, +0x1e310330, +0xfa4da308, +0xbcf49b03, +0x41070123, +0x4183405b, +0xfe0bf370, +0xf3930f6b, +0x93059f64, +0x059f63f2, +0xf4130586, +0x133405d7, +0x091e4df4, +0x05b5f413, +0x05f41334, +0xfe0b2405, +0x80004d27, +0x2740f49b, +0x1e02203d, +0x22f39b10, +0xf49b4027, +0x8b00070e, +0x22f49bff, +0xd8484f9b, +0x4f9bec41, +0x174c3348, +0x131b4c53, +0xa6478348, +0x83412345, +0x4c330f4c, +0x40f49b10, +0x4d27fe0b, +0xf49b03fb, +0x403d27bc, +0x9b101e02, +0x402722f3, +0x070ef49b, +0x9bff8b00, +0x4f9b22f4, +0xec41d848, +0x33484f9b, +0x4c53174c, +0x8348131b, +0x0345e647, +0xfa3d2741, +0x9b041e03, +0xf4d0bcf3, +0xf04efe0b, +0xdf3bcf5b, +0xfc4efe2b, +0xe3be0f07, +0xff1effe6, +0xfe0b0127, +0xd007fd4e, +0x0886f73e, +0xe1b32ea7, +0x082499fe, +0x931a4dce, +0x064937f1, +0x4fff4ea7, +0x9d4311fd, +0x1199082d, +0x9d230544, +0xfd8e0921, +0x491ef193, +0x09239906, +0xce4414c1, +0xfd8edf43, +0xffff3ea7, +0x093499fe, +0xffff1ea7, +0x034383ff, +0xd1348741, +0x33069012, +0xf1432b44, +0x00004843, +0xd12b16ff, +0x27069c14, +0x2e34c201, +0x2027f1ab, +0x24f92846, +0xff011e94, +0x42874926, +0x300043f1, +0x34d8ff02, +0x5021031d, +0xeb018325, +0xc4fe0bf1, +0x2103df21, +0x1eda21c4, +0xab0027fa, +0x1e2027f1, +0xeb0027d0, +0x4efe0bf1, +0x860f6bfe, +0xa1f49305, +0x43990648, +0x8e349605, +0xff467efe, +0x4fbe0366, +0xf29302d7, +0xa7055650, +0xfefdf33e, +0x01304c27, +0x05340331, +0xa8240321, +0x9b4027f4, +0xf3930ef4, +0x0105a65c, +0x61f49333, +0x43050648, +0xfa4efe8e, +0x1e62f093, +0xd8a7be01, +0x62f09300, +0x9ebe011e, +0x4ea700d8, +0x49fff9b3, +0x77f09342, +0xa207011e, +0x270cac33, +0x3a070c1c, +0x00d884be, +0xf9adbea7, +0x0ddc27ff, +0x1d07b209, +0xcd3bc207, +0x1e54f093, +0x033c0701, +0xd867beb2, +0x03ac0b00, +0x70bfc4d1, +0xe1ff0006, +0xf9b3cea7, +0x32c189ff, +0x1e59f093, +0xd84bbe01, +0xb1c1a100, +0x072107c3, +0x60f0934a, +0x2a2b011e, +0x369efa0e, +0xfe4e00d8, +0x00e1a9be, +0xffff3ea7, +0x933411fe, +0x011e7df0, +0x41f14487, +0xff001530, +0x00d818be, +0x635efe0e, +0xa7fe4eff, +0xfdebef2e, +0x23053027, +0x00004e27, +0x07241504, +0x0ef39be1, +0xefff3ea7, +0x0c34d1fd, +0x240c0301, +0x53184c33, +0xec031d4c, +0x1444c424, +0x43272307, +0x23d1f4e8, +0x3c33010c, +0x1d3c5318, +0xa7f034c0, +0xfde3df3e, +0x1d273005, +0x31150cbc, +0x32352027, +0xe3cf4ea7, +0x154e05fd, +0xff3ea741, +0x4235fdef, +0x4c333451, +0x1d4c5318, +0x071244c4, +0xe8432723, +0x332351f4, +0x3c53183c, +0xf234c01d, +0xe7bf4ea7, +0xbc0d03fd, +0x2740050c, +0x150cbc2d, +0x35302742, +0xa7e20b43, +0xfde7af4e, +0x42154e05, +0xfe8e4335, +0x4712f493, +0xa7400106, +0xffffff1e, +0x4eff505e, +0xffdea7fc, +0x0227ffff, +0xdcd11027, +0x1ebe0690, +0xd4b902d6, +0x31270e20, +0x3027c486, +0x308b4153, +0x438b41c3, +0x012744c6, +0x4ea7fc8e, +0x01fd4fff, +0x27002742, +0x0ef49b40, +0xd3991127, +0xcb123b0e, +0xbf3ea713, +0x1138fd4f, +0x34054127, +0x34031153, +0x312712d6, +0xcfff4ea7, +0x6043c5fd, +0xf193fc8e, +0x01068f14, +0x7f0c0313, +0x8f06f493, +0x7f0ce306, +0x4201030b, +0x03071005, +0xfe0b020b, +0x3ea7fe4e, +0x27ffffff, +0x0d329940, +0x06aa34bd, +0x20272410, +0x41f14287, +0x00019b60, +0x009e0127, +0xfd4e00da, +0x4fff3ea7, +0x683dc1fd, +0x4de34d07, +0x4fc4f00f, +0x56630100, +0x7434c14d, +0x00004ed8, +0x2ea77201, +0xa1d07fff, +0x5324a121, +0x4c830c4c, +0x0f4cc00f, +0xa124a10f, +0x83285322, +0x23d40f2c, +0xa1fd8e09, +0x8e23a124, +0xff1d83fd, +0xb0f0930f, +0x3227011d, +0x6abe4227, +0x042700d6, +0x1ddaf193, +0xd99d9e01, +0xcdf09300, +0x56be011c, +0xf09300d6, +0x27011cef, +0x6371021f, +0xd647be56, +0x931d0700, +0x011d04f0, +0x00d63cbe, +0xf1930427, +0x9e011d1f, +0x2700d96f, +0x45f19304, +0x649e011d, +0xfa4e00d9, +0xf093f523, +0xbe011dd5, +0x9300d619, +0x011de5f0, +0x00d610be, +0x4743fb93, +0x32dea706, +0xa027fffc, +0xa1030d1e, +0x0310bc03, +0xacc014dc, +0xed076210, +0xec01e123, +0x0000ced8, +0xb059e903, +0xb123b319, +0xb103b419, +0x9908b299, +0xf20509b1, +0xe201f115, +0x2c53be39, +0x25218312, +0x53d119f2, +0xf13510cc, +0x5507d2c1, +0x450e3bf0, +0xc1f065f2, +0x2c070bde, +0x23831a07, +0x1dc5f093, +0x03c02701, +0x85fe75a1, +0x10bc03fc, +0x00d59cbe, +0xc414dc03, +0x93a010ac, +0x011de2f0, +0x00d58cbe, +0xffffcea7, +0x00c1b9ff, +0xfcc2c101, +0x1de1f093, +0xd577be01, +0xeef09300, +0x6ebe011d, +0xc1c100d5, +0x00cab9fc, +0xe2a10b01, +0x0700c4a1, +0x00a35ed1, +0x007c21f9, +0x1fe6ff00, +0xe4070094, +0x4733ea33, +0x007f23f9, +0xe42bff00, +0x008322f9, +0xef03ff00, +0x0006ab48, +0x1507e499, +0x99f305f2, +0x210705e3, +0xe3c1f325, +0x99f33538, +0x300790e1, +0xe099f145, +0x551d0791, +0x92ec99f0, +0x1dc9f093, +0x99fc6501, +0xfb7593eb, +0x8594ec99, +0x95eb99fc, +0xec99fb95, +0x99fca596, +0xfbb597eb, +0xc598ec99, +0xeb9930fc, +0x34fbc599, +0xc59aec99, +0xeb9938fc, +0x3cfbc59b, +0xc59cec99, +0xeb9940fc, +0x44fbc59d, +0xc59eec99, +0xeb9948fc, +0x4cfbc59f, +0x00d4c0be, +0xadced103, +0x834d071d, +0x24070f4c, +0x20f92333, +0xff00007e, +0xff4e0fe6, +0x007c21f9, +0x4f5eff00, +0x8ef503ff, +0x93fc4efa, +0x068caffc, +0xc160cec1, +0xc2c154c1, +0x64c38958, +0x6366c489, +0x93fe05f0, +0x011da3f0, +0x00d478be, +0x1de5f093, +0xd46fbe01, +0x11c21900, +0xf8f093c3, +0x1027011d, +0x00d460be, +0x270ccc03, +0x11c219d1, +0x931d07c3, +0x011de2f0, +0x4abed103, +0xcc0300d4, +0xead7c40c, +0x1de4f093, +0x0ef04301, +0xd4379efc, +0x93fe4e00, +0x011df4f0, +0x00d42cbe, +0x00dfd2be, +0x7efbf17e, +0xfe0efdfe, +0xfb4e841e, +0x27100499, +0xc14153d1, +0xb1073803, +0xd43bc207, +0xbf6bd3ab, +0x1027cf6b, +0x27112c27, +0x8b413b41, +0x8611034d, +0x9004994d, +0xe433e407, +0x9b1cef03, +0x4cc00006, +0xe3b915ff, +0xe4b90184, +0x3b2b0185, +0xe4bd4c2b, +0xe3bd0185, +0x04990184, +0x33e40791, +0x1cef03e4, +0xc000069b, +0xb915ff4c, +0xb90184e3, +0x2b0185e4, +0xbd4c2b3b, +0xbd0185e4, +0x030184e3, +0xa8f2f002, +0xfc4efb8e, +0xdc83d007, +0xa7cd070f, +0xffffdf0e, +0x40bec333, +0xc4f900d8, +0xff00007c, +0x1f104cdc, +0x0a330d07, +0x0d2bd733, +0xfd104ca3, +0x00007cc4, +0x480f03ff, +0x270006ab, +0x7e202711, +0x0ea7ff4e, +0xbeffffdf, +0xa700d7ec, +0xffffff4e, +0xa70e4199, +0xfff95d0e, +0x159efc0e, +0xf49300db, +0x89068fc4, +0xfe0b5440, +0x427af493, +0x0b405906, +0x07fa4efe, +0x07d007c1, +0x27f463b2, +0x6b102702, +0xd1f7bebf, +0x07c5d602, +0xf64b8b40, +0x4301184f, +0xc4fa8ef4, +0xf193fac2, +0x07068ba8, +0xdbf39321, +0x1d0302d3, +0xf49303d3, +0x0505a0a0, +0xe3310743, +0x3ce37f2c, +0xd31d237f, +0x03241903, +0x23c2802c, +0x7df393f9, +0x2027068b, +0x05f54c27, +0xc8340332, +0x3c4d27f4, +0x8d312702, +0x139d0814, +0x072027b2, +0x114c273f, +0x34033205, +0x4227f4c8, +0x9d05f49d, +0xf49d07f4, +0x55f29306, +0x3f07068c, +0x01114c27, +0x05340330, +0xa8240320, +0xd04c27f4, +0xd5483c27, +0xd502f414, +0xa702ac13, +0x21f39320, +0x4827068e, +0x34033205, +0xf393f4c8, +0xa7068e34, +0x27a82720, +0x23320548, +0xb83403a1, +0x934027f4, +0x06421ffc, +0x024714bd, +0x94f4f393, +0xfdf49300, +0x0c07068a, +0x1315b127, +0xbe50c4c5, +0x9d02d0d7, +0xbbbe05cb, +0xcb9d02d0, +0x04ca9d0d, +0xd41d4227, +0x4fff3ea7, +0x273201fd, +0x0ef49b40, +0xffff3ea7, +0x0e3499ff, +0x323b3127, +0x2ea734cb, +0x38fd4fbf, +0x05412731, +0x03315324, +0x2732d624, +0xff4ea731, +0xf443fdcf, +0x8e6043c5, +0xb5fc93fa, +0xc4990641, +0x27473605, +0xa7d21d20, +0xffffff3e, +0xf4434027, +0x184634ad, +0x184432bd, +0x457efa8e, +0x070686f8, +0xd061be0c, +0x05c49902, +0xbed94fc6, +0x1e02d042, +0xd04dbed3, +0x6be91e02, +0x3330070f, +0x2b008734, +0x843f0330, +0x190006e3, +0x0941c434, +0x01274227, +0xfe0b341d, +0xfe0b0027, +0xfc4efe0b, +0xfcabd007, +0x3ea7cb76, +0xc1ffffff, +0x4dc2fc34, +0x3fdc2715, +0x0ea7c566, +0xbeffffdf, +0xeb00d610, +0x8e0d07fc, +0x0033b9fc, +0xd24d1b01, +0xdc830e34, +0xf9d3330f, +0x00007cdd, +0x27da1eff, +0xa7d61ed0, +0xffffdf0e, +0x00d60abe, +0x4ea7bd1e, +0xb9ffffff, +0xc1010041, +0x1926fc40, +0x3c833007, +0xf933330f, +0x00007e34, +0x074756ff, +0x03402721, +0x7c34fd01, +0x07ff0000, +0x0f3c8330, +0x11233333, +0xa70ff2f0, +0xffffff4e, +0x010041bd, +0x0bfc40c5, +0x7e34f9fe, +0xc6ff0000, +0x4ea7d44f, +0xbdffffff, +0xc5010041, +0xfe0bfc40, +0xf1932fab, +0x03068914, +0x14890f2c, +0xab247364, +0x27242e3f, +0x07fe0b01, +0x0f4c0343, +0x73661389, +0x0e002744, +0x0b012734, +0x93fd4efe, +0x0688ebfd, +0x8660d0c1, +0xd3b4be08, +0x27402700, +0xd4c5152c, +0x273d0760, +0x05420710, +0x03212331, +0x27f4b834, +0x66d28d40, +0x8e64d48d, +0xddf493fd, +0x4099063f, +0x0b0f4b64, +0xb34ea7fe, +0x4149fff9, +0xf9ad0ea7, +0x0c1c33ff, +0x270d2c27, +0x04090f3c, +0x423b0203, +0x2103140b, +0x4ea7f398, +0xa1fff9b3, +0x0b012b40, +0xa5f493fe, +0x4099063f, +0xc6fe0b14, +0xd4079e04, +0x27010700, +0x201e2720, +0xd19e03d7, +0xfd4e00d4, +0x1007d007, +0x934c2c27, +0x06427bf0, +0x00c75cbe, +0x0d070806, +0x426ef393, +0x134c2706, +0x04030201, +0x34033205, +0x3127f4a8, +0x3fd6f493, +0x0a439d06, +0xf493fd8e, +0x99063f54, +0xfe0b5440, +0x3f4af493, +0x5040c106, +0xf493fe0b, +0xc1063f40, +0xfe0b4c40, +0x8c76f493, +0xb443d106, +0xff3f0402, +0xfdffffff, +0x06e7fd01, +0x0b002700, +0x1df493fe, +0x4021063f, +0xf493fe0b, +0x11063f14, +0x93fe0b40, +0x063f0bf4, +0x0b444099, +0x01f493fe, +0x4041063f, +0xf94efe0b, +0xc107a007, +0x4714ac23, +0x091a0b11, +0x99d00713, +0x3e662409, +0x40070c07, +0x3b0c4c23, +0x23d20149, +0x0be48731, +0x0b4387e2, +0x01130d4e, +0x320cc24b, +0x493b4427, +0x30072047, +0x22231e07, +0xe007d407, +0x142b3123, +0xd0132a0b, +0x3ccaec2b, +0x27012341, +0x0b403b41, +0x0d31274b, +0x23140523, +0x581d0b22, +0x8e0b07fe, +0x034c07f9, +0x27244741, +0x0c071cec, +0xec2b2a0b, +0x1a1d4cd4, +0x01031207, +0xfef02203, +0x07b02707, +0x09f98e0b, +0x1e31e613, +0x1ee1278a, +0x1ee127bd, +0x930230e4, +0x01190af0, +0xf393fe0b, +0x27063ed0, +0x5d309d40, +0x34c50027, +0x30fe0b60, +0x16f09302, +0xfe0b0119, +0x3e3ef393, +0x1d402706, +0x2704c634, +0x27341d41, +0xa7fe0b00, +0xffffff4e, +0x0e2440d5, +0x1ea70886, +0x41fdafff, +0xff2ea713, +0x300bfd8f, +0x24211305, +0x4ce30027, +0x11242510, +0x103ca323, +0xfe0b2315, +0x8fff3ea7, +0x273411fd, +0x104ce300, +0xfe0b3415, +0x3e66f493, +0x6840c506, +0x01830753, +0xffff4ea7, +0x45409dff, +0xfe0b0027, +0x41234007, +0xc01442d0, +0x08c01104, +0x100c400e, +0x93200c20, +0x0118b9f0, +0xf393fe0b, +0x99063e34, +0x408b5634, +0xf0934536, +0x0b0118ca, +0x54309dfe, +0xfe0b0027, +0xf9b33ea7, +0x3434c1ff, +0x30c5040e, +0x0b002734, +0x930230fe, +0x0118d1f0, +0x4ea7fe0b, +0x91d07fff, +0x103c3c43, +0x18eef093, +0x93fe0b01, +0x063d77f3, +0x349d4027, +0x2704e614, +0x14349d41, +0xfe0b0027, +0x02490469, +0xc03042ce, +0x2a201928, +0x1937f093, +0xa7fe0b01, +0xfd4fff4e, +0xd87443c1, +0x0000003f, +0xf393eb01, +0x27063d40, +0x9d002741, +0x349d1732, +0x16329d15, +0xf093fe0b, +0x0b0118dc, +0x930120fe, +0x011936f0, +0xf393fe0b, +0x9d063d1c, +0x41271930, +0x349d0027, +0x27fe0b18, +0x10fe0b01, +0x0100000e, +0xffff0d27, +0x3cfef493, +0x27401506, +0x30fe0b00, +0x38f09302, +0xfe0b0119, +0x3ceaf493, +0x27403d06, +0x11fe0b00, +0x54032102, +0x3cd0a32c, +0xf0930f47, +0x0b01196c, +0x3ef093fe, +0xfe0b0119, +0x3cc6f493, +0x45002706, +0x0b423543, +0x000d3cfe, +0x74f09307, +0xfe0b0119, +0x93c80c3c, +0x011993f0, +0x0027fe0b, +0xfc4efe0b, +0x3c9efc93, +0x21d00706, +0xc8dd83c4, +0x07d4ab07, +0x86d33e0d, +0x25fc8e04, +0x4efc8ecd, +0x81fc93fc, +0xcd21063c, +0x0d07d0eb, +0x0486bc3e, +0xcd25fc8e, +0x0430fc8e, +0x197bf093, +0x93fe0b01, +0x063c63f3, +0x309d4127, +0x9d00271b, +0xfe0b1a34, +0x3c52f493, +0x2e409906, +0xf493fe0b, +0x99063c48, +0xfe0b2f40, +0x3c3ef493, +0x5c408906, +0xf493fe0b, +0x89063c34, +0xfe0b5a40, +0x3c2af493, +0x5e408906, +0xf493fe0b, +0x89063c20, +0xfe0b5640, +0xf0930230, +0x0b01194a, +0x963127fe, +0xa7302704, +0xffffff4e, +0x43bd0027, +0xfe0b152c, +0x893af393, +0x52348906, +0x4127044e, +0x8d69349d, +0x00275230, +0xf393fe0b, +0x89068924, +0x044e5034, +0x349d4127, +0x50308d69, +0xfe0b0027, +0x890ef393, +0x54348906, +0x4127044e, +0x8d69349d, +0x00275430, +0xf493fe0b, +0x890688f8, +0xfe0b5240, +0x4c27fd4e, +0x07407b3e, +0x1841d8d0, +0xc04504c0, +0x01c05705, +0x1303c02d, +0x3b96f493, +0x5d002706, +0x93fd8e4d, +0x0118f2f0, +0xb53efd8e, +0x0fabc93e, +0x01030087, +0x00000ed0, +0xf0931501, +0x8e011918, +0xf8e87efd, +0x93d206c8, +0x0118f1f0, +0x7b7efd8e, +0x93c61eff, +0x063b5bf4, +0x31272227, +0x429d0027, +0x65439d44, +0xfd8e425d, +0x3b46f493, +0x27312706, +0x9d002722, +0x425d5443, +0xf54efd8e, +0xf0c5f6e3, +0x24029958, +0x4f073127, +0xe007323b, +0xc5404c03, +0xf3c554f2, +0x5cf1c54c, +0x0714ec23, +0x68f4c52f, +0x27103c27, +0x03240540, +0xc1f3b824, +0x20274cf3, +0x4a273123, +0xc540fec5, +0x6c2748f2, +0x60f3c50d, +0xc164f4c5, +0x238940f2, +0x1827891a, +0xf050f3c5, +0xc100b172, +0x34ee4cf4, +0xf2c100aa, +0x23460754, +0x423b0d4c, +0x8758f2c1, +0x0b230104, +0x007fe603, +0x50f4c101, +0xe260f2c1, +0x07010324, +0x54f2c146, +0x3b0c4c23, +0x50f2c142, +0x420b6123, +0x81275487, +0x3027530b, +0xa207863b, +0x10076103, +0x2744f3c5, +0x01c70790, +0x073f0702, +0x83465b42, +0xd4870f4c, +0x34013d0b, +0xe48be807, +0x00854fe6, +0x3207b407, +0x3407e4d6, +0x4307b207, +0x4bce480b, +0x03120577, +0x03040314, +0x48fcf091, +0x34013f07, +0x14054546, +0x14034027, +0xf2c13405, +0xce340368, +0xf3c1ed32, +0x6936ce5c, +0xc144f4c1, +0x471b40f3, +0x8d18348d, +0xf4c11a3a, +0x64f2c140, +0x21234203, +0xc540f4c5, +0x610364f2, +0xff2d2ff6, +0xc348f0c1, +0xc1f58ef6, +0xa4ea60f4, +0x4907ff7f, +0x41033707, +0x74ca392b, +0x017ee658, +0x05040302, +0xa8140312, +0x059a1ef3, +0xc18f1e32, +0x4f0744f2, +0xd40b5305, +0x40272203, +0xa1035403, +0x0544f2c5, +0xff775ed4, +0x2750f2c1, +0xc52a2e41, +0x8d1e48f4, +0xf4c54027, +0xc1861e48, +0x302750fa, +0xf3c51007, +0xff5e5e44, +0x2750fac1, +0xc5100790, +0x9f1e44f9, +0xa81e3127, +0xc007fc4e, +0x27f90d7e, +0x270c0e41, +0x8e040740, +0x07fc4efc, +0xffcf03c0, +0x8303ffff, +0x000000cf, +0x271c07fc, +0x163c2720, +0x00ce1cbe, +0xf9b34ea7, +0xc53027ff, +0x43c5404c, +0x3840c53c, +0xfa4efc8e, +0xdc23d007, +0x0bc24714, +0x14dc03cd, +0x0924de99, +0x3b4127c0, +0x0bb0074e, +0x074223b3, +0x32d301a3, +0x8e0127b4, +0x0c2c23fa, +0x020b2e3b, +0x030b0087, +0x33be2a87, +0x412700c1, +0xcb0d0027, +0x8e31d49d, +0x99f74efa, +0x41272403, +0xf063433b, +0x0b018407, +0xf1057007, +0x8333d107, +0xc0079487, +0xc249a027, +0x1b070d07, +0xa1032287, +0x00c0fdbe, +0xd80bb90b, +0xacc4c203, +0x7499e910, +0x077c0124, +0x9d4103d4, +0xf4012474, +0x7405d603, +0x1f070707, +0x31272d07, +0x6b7efc05, +0xb10596ff, +0x3b412773, +0xb5340b4d, +0x8ef04373, +0x4efe0bf7, +0xff4ea7fd, +0x43b9ffff, +0xd007152c, +0x3776df6b, +0x4bdaf493, +0xd43d2705, +0x07242707, +0x15430504, +0x0e4d2542, +0xc4389efd, +0x58f09300, +0x52be0116, +0xdd1e00c9, +0xf493f54e, +0xd10638fc, +0x0702d44a, +0x3cab71d0, +0x8e0027b4, +0x24ac89f5, +0x0c071b07, +0x93fb5e7e, +0x063867f6, +0x07156499, +0x604fc650, +0x99166799, +0x78231768, +0xbcd88823, +0xa9894a10, +0x20ab8922, +0x2e20d489, +0x22d489b4, +0x936c49ce, +0x05482ff4, +0xdb8d4c79, +0x22d98d20, +0x9d47d59d, +0xd89d45d7, +0xf5aa7e46, +0x9d22d489, +0xdc9d49d0, +0x1a639944, +0x4d140127, +0x002702d0, +0x34b60047, +0x27fb9d7e, +0x89f58e01, +0xab8920a9, +0xc0b61e22, +0x120321cd, +0x0322cdd4, +0x82cd2055, +0x81cd0001, +0x21cd4402, +0xff4ea701, +0x43c1fd4f, +0x003fdc74, +0x51010000, +0x80277027, +0xd499811e, +0x9054ce47, +0xce45d499, +0xd4998a74, +0x8484ce46, +0x7e49dc99, +0xc0eef540, +0xf393ff7b, +0x390547a8, +0x364fe634, +0x993c79ff, +0xc4ee44d4, +0x2a5eff6e, +0x21cdc0ff, +0xcdd0b411, +0x03be1121, +0x077fdfcd, +0xd44fab4c, +0xa21eb342, +0x82277227, +0x4eff315e, +0x6b1f6bfe, +0xa716260f, +0xffffff3e, +0x166c34d1, +0x34d54103, +0x0786166c, +0xffff4ea7, +0x6c40d1ff, +0x121c2716, +0x72be0123, +0x442700fb, +0x167804fd, +0x0027ff00, +0xf493fe8e, +0x89068488, +0xfe0b5040, +0x011000d1, +0x83190c53, +0x4efe0b01, +0x2204c4fe, +0x41071111, +0x4fd44123, +0x10000000, +0x1024d120, +0x0c21d501, +0x004fa301, +0xd5800000, +0x8e011024, +0x930627fe, +0x0114e8f1, +0x00cb0a9e, +0x1505f193, +0xcb019e01, +0x07f94e00, +0xc4b207c1, +0x01730c0c, +0x1102071d, +0x3e19211a, +0x660a76a8, +0x3dd4c0da, +0x4d234a07, +0x4fd403e8, +0x3b9ac619, +0xd1c30160, +0xc50110b4, +0xc311ecb3, +0x00004fa3, +0xb3c51000, +0xd5cc21f0, +0xc50110b4, +0xf98ef4bc, +0xafc6d956, +0x930427dd, +0x011544f1, +0x00caaa9e, +0x4d234907, +0x4f1403e8, +0x3b9ac619, +0x27b6a9c2, +0x65f19304, +0x909e0115, +0x062700ca, +0x14d5f193, +0xca859e01, +0x93062700, +0x0114a2f1, +0x00ca7a9e, +0xf1930427, +0x9e01156e, +0x4e00ca6f, +0x1a04c4fe, +0x11c81111, +0x1024d120, +0x0821d501, +0x004fa301, +0xd5400000, +0x8e011024, +0x930627fe, +0x01156ff1, +0x00ca469e, +0xf1930627, +0x9e0115a0, +0x4e00ca3b, +0x0c0cc4fe, +0xa5f49322, +0x43c10636, +0x93389644, +0x054617f4, +0x431d3127, +0x43151301, +0x43251311, +0x41351121, +0x0627fe8e, +0x1598f193, +0xca099e01, +0x93062700, +0x0115b9f1, +0x00c9fe9e, +0x0cc4fe4e, +0xf2932444, +0x270545e4, +0x3d320741, +0x103c0324, +0x01114c27, +0x05140310, +0xa8340330, +0x032479f4, +0x8e247d41, +0x930627fe, +0x0115c6f1, +0x00c9ca9e, +0x2007fe4e, +0x15f40cc4, +0x45aef393, +0x27030705, +0x03345d41, +0xafbe540c, +0xfe8e00bd, +0xf1930627, +0x9e0115d0, +0x4e00c9a3, +0x7ed007fd, +0x0876f312, +0x0110d4d1, +0x4fa32027, +0x04000000, +0x0110d4d5, +0xf4933027, +0xd50635f8, +0xd5064442, +0x8e064843, +0x930627fd, +0x0115cef1, +0x00c96e9e, +0xc107fc4e, +0x04c4d207, +0xf2d87e29, +0xd4d10a16, +0xcc010114, +0xd5104ca3, +0x270114d4, +0xc1f49320, +0x30270635, +0xd5d0dcc5, +0xd5064442, +0x8e064843, +0x930627fc, +0x0115c6f1, +0x00c9329e, +0xf1930627, +0x9e0115ea, +0x4e00c927, +0x07c107fc, +0x1804c4d2, +0xf6f2917e, +0x14d4d107, +0xa3cc0101, +0xdcc5204c, +0x14d4d5d4, +0x27fc8e01, +0x90f19306, +0xfc9e0115, +0x062700c8, +0x15b4f193, +0xc8f19e01, +0xc4fe4e00, +0x310f140c, +0xbd412711, +0xd5015024, +0x8e014821, +0x930627fe, +0x0115d5f1, +0x00c8d29e, +0xe007fe4e, +0xe4540207, +0xf1930627, +0x9e0115ea, +0x1900c8bf, +0x87420712, +0x2b443332, +0xca440343, +0x2cd4e7e4, +0x03d14a11, +0x3f380110, +0x01000000, +0x4cc00419, +0x412745ff, +0x40272496, +0x83184c33, +0xffffff3f, +0xd534abfe, +0x19011003, +0x19031d13, +0x9d133914, +0x14190404, +0x9605039d, +0x87fe8e44, +0x1b443324, +0x03080324, +0x9efe0e14, +0x2700bc62, +0xa9f19306, +0x589e0115, +0x062700c8, +0x15d7f193, +0xc84d9e01, +0x54fe4e00, +0x93062704, +0x01161af1, +0x00c83e9e, +0x43071319, +0x44034333, +0xd4eb04ca, +0x38864133, +0x0107e307, +0x04490369, +0x06274342, +0x1667f193, +0xc8199e01, +0x0a038900, +0xca080489, +0x0803ed34, +0x24d1fe08, +0x02070110, +0x00004fa3, +0x24d50800, +0x0c030110, +0x142c27d8, +0x00bbf1be, +0x0627fe8e, +0x15f1f193, +0xc7e59e01, +0xe6fe4e00, +0x40141904, +0x0627ff4c, +0x1653f193, +0xc7d19e01, +0xf308d000, +0x011020d1, +0x00000fd8, +0x19130100, +0x54460624, +0x0627114c, +0x1672f193, +0xc7b19e01, +0x1d40a700, +0xc4131924, +0xa325ff3c, +0x0000000f, +0x1020d501, +0x04149901, +0x9904249d, +0x249d0514, +0x06149905, +0x9906249d, +0x219d0711, +0x27fe8e07, +0x9cf19306, +0x789e0116, +0xfd4e00c7, +0x1007e107, +0x4c20ecd0, +0x4e860441, +0x4f660451, +0xc61a0489, +0x04895f4f, +0x27414018, +0xc2f19306, +0x509e0117, +0x24b900c7, +0x4eb60138, +0x32074127, +0x013824bd, +0x01183d03, +0x08274007, +0x44034d01, +0x34033d05, +0x0e07f0a8, +0x03200c23, +0xfd0e201c, +0x27ff405e, +0x81f19306, +0x189e0116, +0x062700c7, +0x16a9f193, +0xc70d9e01, +0x93062700, +0x0116caf1, +0x00c7029e, +0xf1930627, +0x9e0116e8, +0x2700c6f7, +0x06f19306, +0xec9e0117, +0xfd4e00c6, +0xec03e007, +0xa70d0354, +0x07200701, +0x7f2ce33e, +0x01a70d23, +0x197f3ce3, +0x803c0334, +0x07f932c2, +0x2741073e, +0x4e01552c, +0x3e054403, +0xf2a83403, +0x016703b9, +0x3ae63183, +0x01101ed1, +0x011414d1, +0x2f832e07, +0x03ffffff, +0x273f4ce3, +0x1414d530, +0x5013bd01, +0x1012d501, +0x002f3801, +0x19010000, +0xff4cc014, +0xbd402713, +0x8e013814, +0x9d4027fd, +0x039d5404, +0x89c21e58, +0x03892202, +0x03047120, +0x3c031f2c, +0x580d991f, +0x35732573, +0xd8590099, +0x0721104c, +0xce41034d, +0x40072d43, +0x42ce4103, +0xffef831b, +0x2702ffff, +0x101ed540, +0x3814bd01, +0x07fd8e01, +0x07230742, +0x27d91e34, +0x30f19306, +0x249e0117, +0x062700c6, +0x16caf193, +0xc6199e01, +0x4efe0b00, +0x07c107fc, +0x6c08c4d2, +0xc57e0207, +0x6f0fd6fa, +0x00c8c011, +0x340ccc5b, +0x01e33e1c, +0x0d1cc0c1, +0x0e1cc01f, +0x0c1cc02b, +0x93062737, +0x0117bbf1, +0x00c5e29e, +0x3e330c27, +0xc4c101c5, +0xd1e30d1c, +0xbd0114d4, +0xa30111d0, +0x14d4d542, +0xd1fc8e01, +0xbd0114d4, +0xa30112d0, +0x14d4d544, +0xd1fc8e01, +0xbd0114d4, +0xa30110d0, +0x14d4d541, +0x27fc8e01, +0x27a71e00, +0x00f19306, +0x989e0117, +0x062700c5, +0x1720f193, +0xc58d9e01, +0x07fc4e00, +0xc4c207d1, +0x02074e08, +0x76fa3b7e, +0xc8d0010e, +0x0ccc3e00, +0xdd112e34, +0xcc31d0c8, +0xca2034dc, +0x4e7e48d0, +0x00c0d5ff, +0x7e0d0701, +0xc4d1ff45, +0xc0d50114, +0x48a30104, +0x0114c4d5, +0xdc27fc8e, +0x11dd1e33, +0x330c27dd, +0x27d1d0cc, +0x27d11ed0, +0x27c41e00, +0x24f19306, +0x2c9e0117, +0x062700c5, +0x174bf193, +0xc5219e01, +0x93042700, +0x011791f1, +0x00c5169e, +0xd107fc4e, +0x08c4c207, +0x7e020750, +0x0eb6f9c4, +0x00c8d001, +0x340ccc40, +0xc8dd1130, +0xdccc33d0, +0xd0ca2234, +0xfed77e4a, +0x07f8c0c5, +0xfecf7e0d, +0x0110c4d1, +0xa3fcc0c5, +0x0000004f, +0x10c4d520, +0x27fc8e01, +0xdb1e33dc, +0x0c27dd11, +0xcfd0cc33, +0xcf1ed027, +0xc21e0027, +0xf1930627, +0x9e01176a, +0x2700c4b3, +0xd2f19306, +0xa89e0116, +0x042700c4, +0x1782f193, +0xc49d9e01, +0xc4fe4e00, +0x14114c08, +0x015242d4, +0xfe3dc013, +0x24d127ff, +0x4fa30110, +0x02000000, +0x011024d5, +0x072b30c8, +0x343ccc43, +0xc511110b, +0x21c5c824, +0x27fe8ecc, +0xf21e334c, +0x011024d1, +0xffff4f83, +0x24d5fdff, +0x11110110, +0x8ecc21c5, +0x1e4027fe, +0x930627d9, +0x01175ff1, +0x00c4429e, +0xf1930627, +0x9e011775, +0x4e00c437, +0xf03007fe, +0x0100ec14, +0x23010704, +0x124ce004, +0x4cd00081, +0x4ce02313, +0xd400a119, +0xe0321a4c, +0x00b1154c, +0xa5174ce0, +0x144cc000, +0x9306275c, +0x011792f1, +0x00c3fe9e, +0xd4674ac0, +0x43c02d4b, +0x6749c071, +0x07e742c4, +0x0e140313, +0xff4b5efe, +0x701b4cc0, +0x281b4cd0, +0x8d1c4ce0, +0x1d4cc400, +0x031307cd, +0x5efe0e14, +0x4cc0fadd, +0x4cd02b0f, +0x4cc46b10, +0x1307b810, +0xfe0e1403, +0x07f97e5e, +0x0e140313, +0xf9e65efe, +0x14031307, +0x5a5efe0e, +0x0e0207fb, +0xf9fd5efe, +0x14031307, +0x995efe0e, +0x031307f9, +0x5efe0e14, +0x1307f88d, +0x4c5efe0e, +0x031307f8, +0x5efe0e14, +0x1307faac, +0xfe0e1403, +0x07fde85e, +0x0e140313, +0xf9fe5efe, +0xfe0e1307, +0x07f8f65e, +0x0e140313, +0xfe465efe, +0x4e0c4cf0, +0x0e1307ff, +0xfd395efe, +0x14031307, +0x205efe0e, +0x930627fa, +0x0116adf1, +0x00c33a9e, +0xe7e40f03, +0x04990006, +0x0e14ce4d, +0x274d019d, +0x61f49331, +0x439d067c, +0x0b002769, +0xd1fc4efe, +0x07011003, +0x1c30ccd0, +0x7c4af293, +0x0c01d106, +0x6024c101, +0x270d14ce, +0x69249d41, +0xd16021c5, +0xd8011003, +0x0000003f, +0xd3c14f10, +0x2331e0ec, +0x21fc9301, +0xc4c1067c, +0x27344e34, +0x34c3c541, +0xc169c49d, +0xc4c1f0d3, +0x27344e58, +0x58c3c541, +0xc169c49d, +0xc4c1f4d3, +0xdb34ee5c, +0x33030700, +0x27032b03, +0xc51a2741, +0xc49d5cc3, +0xf2c5be69, +0x58c0c500, +0x0110d3d1, +0x00003fd8, +0x931e2000, +0x067bd3f3, +0xc1fcd2c1, +0xd1c13834, +0xae24eef8, +0x9d412700, +0x32c56934, +0x3c31c538, +0x0114d4d1, +0x932248d8, +0x067baff3, +0x0104d2d1, +0xd14434c1, +0xce0100d1, +0x41276b24, +0xc569349d, +0x31c54432, +0x40349d48, +0x0110d4d1, +0x00004fd8, +0x93174000, +0x067b83f3, +0x0108d2d1, +0x4e6434c1, +0x9d412724, +0x32c56934, +0x14d4d164, +0x2341dc01, +0x44dc423c, +0xb9fc8e13, +0x270111d1, +0xfee67e01, +0x0114d4d1, +0xb9ef44d8, +0x270112d1, +0x5efc0e02, +0xd1b9fed4, +0x00270110, +0xd1fecb7e, +0xd80114d4, +0xd41ed142, +0xce4834c1, +0x41279f14, +0xc569349d, +0x31c54432, +0x40349d48, +0xd3d18f1e, +0x3d5e0110, +0x3c34c1ff, +0xff5a14ee, +0x349d4127, +0x3832c569, +0x5e3c31c5, +0xfc93ff4c, +0xc1067b00, +0x322734c4, +0xfedd43ee, +0x4efee25e, +0x079007f6, +0x810207d1, +0x752fc694, +0x6e27b407, +0xa7fffffc, +0xfdefffae, +0xe3df7ea7, +0xcf8ea7fd, +0x9299fde3, +0x5b4d072d, +0x3b312742, +0xa1410332, +0x87312392, +0x07420b44, +0x032307cd, +0x07c38b21, +0x012c2be0, +0xfd0e1041, +0xe607ffff, +0x0709e2c2, +0x27051ee2, +0xd1f3e833, +0x33010ca4, +0x4c53184c, +0xc844131d, +0x1c0bee41, +0x7e157105, +0x74354027, +0x8e158b05, +0x0e2b8435, +0xbe0b0506, +0xa31ede0b, +0xefff3ea7, +0x0c34d1fd, +0x6a4dd801, +0x230710fc, +0xf4e84327, +0x010c23d1, +0xfc6a3ddc, +0x654027f4, +0x27f68e94, +0x4503b940, +0xa0049d02, +0x04993556, +0x9d4103b2, +0xf453b204, +0x04152a19, +0xfe0b0027, +0xd007f54e, +0x6d7ef0a3, +0x80d4a9ea, +0x82d3a902, +0x0f4c0302, +0x830f3c03, +0x01fff04e, +0xfff03e83, +0x74d4ad01, +0x76d3ad02, +0x74d2a902, +0x76d3a902, +0x53442702, +0x07345324, +0x68d4bdbd, +0x88d2ad02, +0x8ad3ad02, +0x66d4bd02, +0x67d4bd02, +0x03600702, +0xe00260bd, +0x7e033f03, +0x4127ea12, +0x40270108, +0xd4bd4213, +0x7c7e0260, +0xd8d09ded, +0x2c82f793, +0x46748906, +0xc5d8d399, +0x39d4dcd4, +0x4b430719, +0x3b31274f, +0x543df834, +0xb902cb01, +0x030260d4, +0x60d4bd42, +0x88d1a902, +0x8ad2a902, +0x65709902, +0x1933219b, +0xd5904c27, +0xb902a0d1, +0xad0260d1, +0x27028cd4, +0x2703103d, +0xd09d484c, +0x8ed3adf8, +0x90d2d502, +0x94d4ad02, +0x62d1bd02, +0x44b4c102, +0xff004ef8, +0x270274ff, +0xad01e44d, +0x270296d4, +0xa7dcbdc1, +0x7e0b0702, +0x4c27ec7e, +0x8ad2a948, +0xacd4d502, +0x74d0a902, +0x80d4a902, +0x76d1a902, +0x88daa902, +0x82d5a902, +0xbd342702, +0xad02e2dc, +0xad02bcd2, +0xbd02bed4, +0xad02e1d3, +0xad02bada, +0xad02c0d5, +0xad02dcd0, +0xbd02ded1, +0x7e02e0d3, +0xd09de93a, +0xf9f293b5, +0x22c10678, +0xb5dc9960, +0x9da4d2c5, +0x7499b6dc, +0xf9d49d58, +0x62244696, +0xa6b6d499, +0x93042745, +0x01135df1, +0x00bf969e, +0xf0ef597e, +0x0200340c, +0xd49d4027, +0xef427efa, +0x06340cf4, +0x9d412702, +0xd49dfdd0, +0xef467efc, +0x03340cf4, +0x9d412702, +0xd49dffd0, +0x0063e0fe, +0x86312702, +0x133027c4, +0x44b4c132, +0xff004e58, +0x934427ff, +0x06787bf0, +0xf1930405, +0x11067874, +0x07810719, +0x204c2349, +0x01004df4, +0x1001021b, +0xd4bd4f6b, +0xd0bd02e9, +0xf09302e8, +0x99067854, +0xd1b90d00, +0xd2b902a5, +0xd0bd02a6, +0xd2bd02ea, +0xd1bd02ec, +0x73c102eb, +0xc5212734, +0x74c1c0d3, +0xa9d3b938, +0xc4d4c502, +0x273c70c1, +0xc8d0c540, +0x9d4071c1, +0xd2bd5cd3, +0x70190244, +0xd5ccd1c5, +0xd50250d4, +0xb9024cd4, +0xb902ead1, +0x9902e9d4, +0xd58db6d3, +0x56d09dbc, +0x9dadd19d, +0x3546abd4, +0x027361e0, +0x026f63e0, +0xd49d4027, +0x9d4327b8, +0xfb93a0d4, +0x99062b24, +0xf19354b4, +0x27053a98, +0x27410031, +0x9d321330, +0x14195ed3, +0xb4994906, +0x07414054, +0x9d410343, +0xd4995ed4, +0x9d44a3a0, +0x1011a0d4, +0x0100d0d5, +0xd2d51221, +0x13310104, +0x0108d3d5, +0x47461439, +0x4d034d07, +0xf293010c, +0x27053a64, +0x2001113c, +0x40052403, +0xf3a84403, +0x49e61459, +0x4054b499, +0x5ed49941, +0xd49d4103, +0xa0d4995e, +0x48a33d07, +0x03a0d49d, +0x9301503d, +0x053a77f2, +0x013d4c27, +0x05240321, +0xa8340331, +0x667499f4, +0x4fe64f4b, +0xf49300c5, +0x99062a14, +0xf1936843, +0x9d06773c, +0xd39dacd3, +0x231401a8, +0xc742f043, +0x000d2700, +0xed717e02, +0x02930ff6, +0xf8ead07e, +0x7102000d, +0x93302701, +0x067713f2, +0x42e02411, +0xd499017c, +0x9345a6b5, +0x067703f0, +0x41e00401, +0xc0270275, +0x9daad39d, +0xa27eaedc, +0x000d38ea, +0x9d412702, +0xb3c1aed4, +0xc6348368, +0xdc9d7e3f, +0x8ef083b4, +0xac4d27f5, +0x96d4ad01, +0xfd8d5e02, +0x3eaa3cf8, +0x60d4b9fd, +0xbd410302, +0x5e0260d4, +0x4127fd31, +0x7efad49d, +0xd09ded4e, +0xed3e7efb, +0xfe340cf0, +0x9d4027fd, +0x457efcd4, +0x340cf0ed, +0x4027fe01, +0xe4fed49d, +0x27fe0463, +0xfe075e34, +0xd4bd4327, +0xcb5e0260, +0xa8d499fc, +0xc3acd399, +0x9d31c341, +0xd39da8d4, +0x71f193ac, +0x14010676, +0x42f44323, +0x3027ff3d, +0x93ff595e, +0x06728bf4, +0x024744b9, +0x00cc4fe6, +0x00fa42e0, +0xd39df083, +0x07f58eb4, +0x0fcc03c5, +0xca9bc473, +0xf3053c9b, +0x93ea087e, +0x067647f2, +0xdbc1f015, +0x5820c1a4, +0x03e81d27, +0x00ed16be, +0xffffbd03, +0xbc53a007, +0x9b800110, +0xbdf293bc, +0xe0270129, +0xc0141c27, +0x03c05104, +0xca230156, +0x24111a3a, +0x21154cca, +0x104bca24, +0xf3012431, +0x2489434a, +0xe2f31110, +0x03011a34, +0x142c03e1, +0x07d5f1f0, +0x0794024e, +0x174ae049, +0x604bd401, +0x00bf45e0, +0x009246f0, +0x00b147e0, +0x00a747f0, +0x009d48e0, +0x009349e0, +0x2401611e, +0x340b3447, +0x2401ae1e, +0x32533407, +0xa41e340b, +0x75a6f493, +0x0d439906, +0xf29337f6, +0x1106759c, +0xe03c2724, +0xfe8842e4, +0x5e103ca3, +0x4127fe82, +0xd49df083, +0x27f58eb4, +0x685e403c, +0xb8d29dfe, +0xc0fd945e, +0xd4410f4c, +0xe01c104c, +0x00870c4c, +0x8e0c4cf0, +0x0d4ce000, +0x4cc00083, +0xff1e720e, +0x5eb4d49d, +0x4ce0fe79, +0xf400a912, +0x009a134c, +0x8f104ce0, +0x114ce000, +0xe31e0084, +0xd43a42c0, +0x41c02f43, +0x27d81e27, +0xcf5e324c, +0x1e4c27fc, +0x27fcc95e, +0xc35e164c, +0x144c27fc, +0x27fcbd5e, +0xb75e154c, +0x0d4c27fc, +0x27fcb15e, +0xfcac5e4a, +0xc01843c0, +0xa71e0f44, +0x43234007, +0x276642d0, +0xfc965e4b, +0x5e0c4c27, +0x4b27fc92, +0x27fc8d5e, +0x875e2a4c, +0x284c27fc, +0x27fc815e, +0x7b5e294c, +0x204c27fc, +0x87fc755e, +0x0be4334e, +0x8e44f94e, +0x5e00019b, +0x4c27fee5, +0xfc605e1f, +0x5e344c27, +0x4c27fc5a, +0xfc545e33, +0x13134cc0, +0x5e144c40, +0x4c27ff4e, +0xfc445e3c, +0x5e3e4c27, +0x4c27fc3e, +0xfc385e3d, +0x315e4927, +0x271007fc, +0xbb5d9e04, +0x93042700, +0x010f4af1, +0x00bb529e, +0xf64efe0b, +0xa3880ec1, +0x276027f0, +0x07b30770, +0x15f605de, +0x07a207f7, +0x07840791, +0x1fdc73ce, +0xc17802c1, +0xb1e07c03, +0x0b0700b2, +0x10070123, +0xbe1f1c73, +0x0700c7d3, +0xbe2c073d, +0x0700c864, +0x1f4c7348, +0xe407d807, +0xe14bd00b, +0x00a9a1e8, +0x1a070907, +0x21078027, +0x41073007, +0x531f2c33, +0x7332ab31, +0x07030741, +0xcc810314, +0x4536e941, +0x00003fd4, +0x07e08000, +0x533d872d, +0x4e871e2c, +0x230742ab, +0x871e2c53, +0x8712ab14, +0x4b030b03, +0x53e00714, +0xc1871eec, +0x3b072b07, +0xb087ceab, +0x0b1f3c73, +0xbe1c4b0b, +0x0700c7f8, +0x203c2338, +0x076330c8, +0x07637b61, +0xc8787b71, +0x4a074130, +0xf405437b, +0x387b3a07, +0xf201f315, +0x0607f311, +0xcdbe1707, +0xf08300c7, +0x0e07f68e, +0x10070103, +0xbe1f1c73, +0x0700c723, +0xbe2c073d, +0x0700c7b4, +0xece107d0, +0xe6ff5ba1, +0x5e8027a9, +0x4c27ff7b, +0x07482b20, +0x3b39072a, +0x07385b24, +0xab230742, +0x1ef20524, +0x204c27b0, +0x2107482b, +0x243b6007, +0x62ab685b, +0x9ff4921e, +0x80000000, +0x8027ff24, +0x4eff465e, +0x6bb107fb, +0x51fc93bf, +0x0df90673, +0x0006e7fd, +0x02c00140, +0x8e0d0726, +0xa0c4b9fb, +0xb9430602, +0x9902a3c0, +0x0f4b19c4, +0x00c8040b, +0xc8d0072f, +0x27e3340c, +0x0d0733dc, +0x617efb8e, +0x19c399e3, +0xc01f01c0, +0x02c41a03, +0xa1c4b9cd, +0xc64fc602, +0x02a4c0b9, +0x030b0f4b, +0x27d300cc, +0x56b71ed0, +0xa2c4b9b1, +0xae4fc602, +0x02a5c0b9, +0x030b0f4b, +0x27bb00cc, +0x009f1ed0, +0x00000064, +0xf793f54e, +0x010672d8, +0x07f2a37c, +0xb9c736a0, +0xb9020800, +0x7e0359a1, +0xa0bdff6b, +0xacd50292, +0xf283026c, +0x00b9f58e, +0xa1b90208, +0x547e0359, +0xbd4127ff, +0xbd0293a0, +0x930294a4, +0x0625d7f3, +0xd14433c1, +0xd10364a1, +0x75017474, +0x6071d5f3, +0xcf34ce02, +0x017473d5, +0x0208a2b9, +0x22e0f265, +0x74d107c3, +0x73d10288, +0x72990284, +0xd5439b71, +0x9301cc74, +0x067267f1, +0x40272786, +0x31272027, +0x021a14bd, +0x021813bd, +0x01c812d5, +0x021914bd, +0x01c412d5, +0x01d01cd1, +0x7120c1c8, +0xbe1c07f0, +0xf600e8c6, +0x7e03630f, +0x0ceeedaa, +0x3027035c, +0x73d54027, +0x74d501d4, +0x749901d8, +0x1dfd9371, +0x4ff60672, +0x8b7e06e8, +0x87fe61ed, +0x8c43f14e, +0xc10006e9, +0x3ce07cd4, +0xd1072c33, +0xe80188d3, +0x61033731, +0x3d2fe6f2, +0x6c74c103, +0x037542e0, +0x01a474b9, +0x71e6f393, +0x99452606, +0x4ff67134, +0x4027069b, +0x7e72749d, +0x05e6e20e, +0x01a674b9, +0x71caf393, +0x754ff606, +0x9d402706, +0xc37e7474, +0xb905e6e8, +0x9301a574, +0x0671b3f3, +0x064f4ff6, +0x749d4027, +0x3474d173, +0xa1fd9301, +0x41e00671, +0xf2610585, +0x0359abb9, +0x44f94287, +0x0006e98c, +0x0292a4bd, +0x023cddb9, +0x0321adbd, +0x05de2fe6, +0xd5a073c1, +0xc10280a3, +0xa4d5a474, +0x4ea70284, +0x99feffff, +0xd17e094c, +0x87c383e7, +0x2bc4334c, +0x4dcef9c4, +0x12ff0000, +0x71e0070e, +0x23f471f1, +0x7c72d112, +0x23412b01, +0x99429b41, +0x70d1707d, +0xe4d20184, +0x0b32470e, +0x2b430732, +0xda112342, +0xf471f64e, +0x4d2b4103, +0x40070412, +0x031eaebd, +0x0254a4d5, +0x0258a1d5, +0x01987ed1, +0x0260aed5, +0x01a871b9, +0x0297a1bd, +0x019c72d1, +0x01a473b9, +0x0264a2d5, +0x01ac74b9, +0x029aa3bd, +0x0298a4bd, +0x01a07ed1, +0x01a571b9, +0x0268aed5, +0x01b072b9, +0x029ba1bd, +0x0299a2bd, +0xb97c73c1, +0xd501a672, +0xc10278a3, +0x73d18074, +0xa4d501b4, +0x71c1027c, +0x787ea930, +0xb874d101, +0x74a1d501, +0xa8a3d502, +0x8873d102, +0x8caead01, +0xaca4d502, +0x9ca2bd02, +0x70a3d502, +0xbc74d102, +0x2073d101, +0xb0a4d502, +0xc07ed102, +0x2474d101, +0xbcaed502, +0xc471d102, +0xb4a3d501, +0xc0a1d502, +0xc872d102, +0xb8a4d501, +0xc4a2d502, +0xcc73d102, +0x61f19301, +0xa3d50670, +0x74b902c8, +0xa4bd0218, +0x73d102cc, +0x74d101d4, +0x7ed101d8, +0xa3d501d0, +0xa4d502d4, +0xaed502d8, +0xf39302d0, +0x07067214, +0xd532014a, +0x1102dc42, +0xe04ed53e, +0xd5322102, +0x3102e442, +0xe84ed53e, +0x03324102, +0x42d5143c, +0x4c0302ec, +0xfc3fc414, +0xd60006e9, +0x018c13d1, +0x0248a3d5, +0x019014d1, +0xa4d5f361, +0x1ed1024c, +0xaed50194, +0x3ff60250, +0x1499047c, +0x95a4bd86, +0x87129902, +0x0296a2bd, +0x23eb517e, +0x000d0801, +0xff0c2701, +0x025ca0bd, +0x018074d1, +0x6fc6fc93, +0x004d1006, +0xff4c2701, +0x025da4bd, +0xbd89c199, +0x89025ea1, +0x4ff620c4, +0xc2d104bc, +0xc4990258, +0x88a2d571, +0x5cc3d102, +0x8ea4bd02, +0x2ca3d502, +0x60ceb903, +0xa4aebd01, +0x64c1b902, +0xa5a1bd01, +0x68c2b902, +0xa6a2bd01, +0x72c39902, +0x0134ced1, +0x028fa3bd, +0x1973c499, +0x90a4bdc3, +0x74c19902, +0xbd6cc2c1, +0x61025fa3, +0xa0aed5f4, +0x91a1bd02, +0x6ca2d502, +0xbf4ff602, +0x9cccb903, +0x20acbd02, +0x9471d103, +0xff4ea702, +0xa1d5ffff, +0x72d10324, +0x1c270298, +0x28a2d512, +0x7440d103, +0xbe012316, +0xf900e5fd, +0x00167804, +0x19f193ff, +0x4586066f, +0x018014d1, +0x14d54103, +0x14d10180, +0x30270180, +0x139d4123, +0x7812c171, +0x14d5f371, +0x23ee0180, +0x7499040e, +0x88709989, +0x6eeaf393, +0x2b04e206, +0x8034d1fc, +0x234ff601, +0x9df283fc, +0xf58e8930, +0xeeea497e, +0x61fcadc0, +0xa74ff6f4, +0xfc985efc, +0x1ff6f161, +0x4027fccd, +0x023c74bd, +0xd1ea2d7e, +0x93018074, +0x066eaff2, +0x04c246c6, +0x88239912, +0x30ea4007, +0x4cf404aa, +0x9d049c3d, +0x40278924, +0x74d53027, +0x202701b8, +0xd56c74c1, +0xd5018070, +0xd501b473, +0xe401bc72, +0x93fc8f42, +0x066e77f4, +0x71704399, +0x55432bf4, +0x0f4c83f4, +0x24073407, +0x34332833, +0x342b320b, +0x69eef293, +0x87220106, +0x0b430733, +0x95f24542, +0xac4eb9f3, +0xb044d111, +0x33fe1511, +0xe0f40543, +0x9109c2e2, +0x0bf241f4, +0xb84ed142, +0xbc4cd111, +0x01edf011, +0xf4037c10, +0x010001ee, +0xdd2703c6, +0x0d2711fd, +0x1027033a, +0x2e073e07, +0xbe1f3c73, +0x2700c187, +0x4027803c, +0x414b300b, +0x1d072407, +0x53182c33, +0xab1c0b38, +0x11130b32, +0x878107f3, +0x703bf133, +0x850006e9, +0x27db07f3, +0x73cb0790, +0x1ff61fdc, +0x0b070644, +0x31071d07, +0x34ab4027, +0xc0073496, +0xf4116c07, +0x61736b0b, +0x06654ff6, +0xfe41f491, +0x4dd14e0b, +0x7dd511c0, +0x3027021c, +0x39ea4d47, +0x39ee0632, +0x4027062a, +0x08ee49ea, +0x08e649ee, +0x30274d07, +0x39ea4153, +0x39ee0936, +0x0d07092e, +0x64be1a27, +0x402700e4, +0x0bd949ea, +0x0bd149ee, +0xf381f411, +0x430b4433, +0xe7e44f03, +0x43d10006, +0xc30b01ec, +0x4cd5c173, +0x6de801ec, +0x06970401, +0x04006d27, +0xfc81f441, +0xcf03fb91, +0x0006e7e4, +0x74d1b40b, +0xc6d50290, +0xb2d1018c, +0x140711cc, +0x04073027, +0xbe1f1c73, +0xd100c0ab, +0x07028c74, +0x73240734, +0x9cbe1f3c, +0xfe0100c0, +0xced53007, +0xb2b90198, +0xe10711d0, +0xec334107, +0x103c5310, +0x01a8c2d5, +0x20273eab, +0x27104c53, +0x0b80001d, +0x07424b31, +0x102c3324, +0xab103c53, +0x25700132, +0xe5fd93f3, +0x04e0066c, +0xfe1102f3, +0x038feff6, +0xffff4ea7, +0x4845d1ff, +0x03350718, +0x0705075d, +0x7f3ce325, +0x237f2ce3, +0x1905075d, +0x803c0334, +0x91f932c2, +0x0bf141f4, +0xe444a941, +0x054fe611, +0x41fc9107, +0xe8cd03f3, +0x07c30b11, +0x272c0714, +0x01902780, +0x0b402723, +0x03944b83, +0x91f19824, +0x27fe41f6, +0x076e0b10, +0x35b027d5, +0x28251ef1, +0xf253650c, +0x2301f994, +0x4f6b4307, +0x3108d49d, +0xe464a9fe, +0x03e30b11, +0x03fe35b1, +0xf2d103c4, +0x0106b74b, +0x074027c1, +0x53318701, +0x40ab1e0c, +0x2c532307, +0xab14871e, +0x0b038712, +0x07144b03, +0x1e2c5320, +0x42ab4187, +0x030b3087, +0x2807144b, +0x39be3907, +0x300700c0, +0x27a501cc, +0x1e412731, +0xf6f161ac, +0xd1017a1f, +0xf60198dc, +0x2701becf, +0x6473d1e0, +0x6c72d101, +0x2b430701, +0xf9f19342, +0x400c066b, +0x41734013, +0x43274408, +0x40132312, +0x016012d1, +0x240b342b, +0x13d54307, +0x12d50164, +0x41230160, +0x4203245a, +0x42074212, +0x73994e0b, +0x6074d586, +0x87729901, +0x3407435a, +0x32074212, +0x01a872b9, +0x016073d5, +0x0292a2bd, +0x023c73b9, +0x0359abb9, +0x0321a3bd, +0x011f4d27, +0xd5e43c27, +0xd50280a4, +0x5e0284a3, +0xfe61fa22, +0xe651e1c0, +0xb900c5bf, +0x4b029dc3, +0x9c74b93f, +0x1b4f4b02, +0x20a4bd43, +0xfc2f5e03, +0xbd841e99, +0x990295ae, +0xa1bd8511, +0x855e0296, +0x713499fb, +0xf9ae4fe6, +0x349d4127, +0xf9ab5e73, +0xe6733499, +0x27f9884f, +0x74349d41, +0x27f9855e, +0x72349d41, +0x27f9665e, +0x20a4bd40, +0xfbef5e03, +0x30274027, +0xd4d5c027, +0xd4d5022c, +0xd3d50238, +0xd3d50228, +0xdcd50234, +0x8b7e0230, +0xc11007e6, +0x30277cd2, +0xbe1f1c73, +0x2700be83, +0x3cd4bd40, +0x20d0d502, +0x24d1d502, +0xc0dcd502, +0xf8f95e01, +0xbddb337e, +0x5e031fa0, +0x14c1fb3e, +0xef41e46c, +0xc54227fb, +0xe75e6c14, +0xd1049bfb, +0x470188d3, +0xd034f240, +0xbd4127f8, +0x5e023cd4, +0xc3b9f8cb, +0x3f4b029e, +0x7eff3c5e, +0x02e4dafc, +0x3127f83a, +0x335ef365, +0x01edd0f8, +0xdd274101, +0x0d27017c, +0x10270443, +0xd1fc875e, +0x990168d3, +0xd09984d4, +0x07345a85, +0x07031240, +0xd5fe6143, +0x87016874, +0x8c44f94e, +0xb90006e9, +0xbd0359ab, +0xb90292a4, +0xbd023c71, +0x5e0321a1, +0xdc27f8ec, +0x9f0d271f, +0x5e102705, +0xdd27fc48, +0x0d27da1e, +0x10270272, +0xd1fc3b5e, +0xe40130d4, +0xfe3d1e4c, +0x07e5b97e, +0x4cd1d130, +0x50d2d101, +0x070d0701, +0xa80c034c, +0xd1f5a57e, +0xfa013cd4, +0xd1090940, +0x270138d4, +0x27041230, +0xd1e30731, +0xfa014474, +0x9308fa04, +0x066a0ff4, +0x014043d1, +0xfdff30f2, +0xfa5ee0a7, +0x3c4c27fd, +0x5e89249d, +0x4307fb62, +0x583d4cf0, +0x11ef1efb, +0x1211e0f1, +0xd074d106, +0x93fe5101, +0x0669dff3, +0xd10de4d2, +0x16013434, +0xd5412745, +0x7e013434, +0xfd93e542, +0x070669c8, +0x9874d130, +0x4c71d101, +0x5072d101, +0x030d0701, +0x277ea80c, +0x3474d1f5, +0x5c70d501, +0x9141e001, +0xacd2d105, +0xa8d3d101, +0x64d2d501, +0x60d3d501, +0x6073d101, +0x86749901, +0x5a877299, +0x12420734, +0xd1430723, +0x99016473, +0x74d5847d, +0x74990160, +0x073d5a85, +0x074312d4, +0xd5f411d3, +0xe401647d, +0x7efc8541, +0x1007e4d6, +0x32bef051, +0x012400e0, +0x6952f493, +0x6c4dd506, +0x307dd101, +0xe4bc7e02, +0x04170dee, +0x2ff6f211, +0x40270186, +0x74d53027, +0x74d50238, +0x73d501b8, +0x72d50234, +0x73d50230, +0x72d501b4, +0xf79301bc, +0xd106691c, +0x0301c074, +0x27440841, +0xd5f31143, +0xd501c074, +0xd501c473, +0xd101c873, +0xc801d07d, +0xf05120d1, +0x7fbe1d07, +0x0ff600df, +0x637e012a, +0x230deee4, +0x27302701, +0xd473d540, +0xd874d501, +0xd473d101, +0xd874d101, +0x27fd0101, +0x4b3d0be0, +0xbc72d14e, +0xd473d501, +0xd874d501, +0xbdf99301, +0x20c80668, +0xb493d11b, +0xb894d101, +0x0b210301, +0xd54e4b3d, +0xd501b493, +0xd501b894, +0xd101bc92, +0xd102349b, +0xc102389c, +0x90d17c93, +0x91d10230, +0x92d10228, +0x4027022c, +0xce4bbd0b, +0xe46bd32b, +0xe24bd10b, +0x98890103, +0x349bd520, +0x389cd502, +0x3090d502, +0x289dd502, +0x2c9ed502, +0xc48ff602, +0xdbd87e02, +0xbf7ed007, +0xf604c6db, +0x2703bcdf, +0x8c749d40, +0x4ff6f411, +0x1d27018c, +0x2c27011f, +0xa074c1e4, +0x03a473c1, +0x0b310341, +0x53320b41, +0xd1315341, +0x51018472, +0xa074c5f1, +0xfaa473c5, +0x93f62f12, +0x066817f4, +0x01d04dd1, +0x071dd1c8, +0xbe1d0701, +0xf600de92, +0x7e03390f, +0x0deee376, +0x74c10332, +0xd5437330, +0xd1018874, +0x01018874, +0x7c73c1fe, +0x432b4e0b, +0x018874d5, +0x4f083407, +0x40000000, +0xffff3f27, +0xf4933fff, +0xd50667d0, +0x5e018843, +0x3b7ef5dc, +0xe6d0eee3, +0xf6f111fe, +0x5efee01f, +0x73d1fed1, +0xf29301c4, +0xe80667b0, +0xd1feaa30, +0x2101c824, +0x0b4103fe, +0xc824d53e, +0xc423d501, +0xfe955e01, +0x1027f001, +0x4c534007, +0xab183318, +0x07280714, +0xbe083339, +0x5e00c39d, +0x84e2f9aa, +0xf411f9d6, +0x4433f381, +0x4f03430b, +0x0006e7e4, +0x01dc43d1, +0xc173c30b, +0x01dc4cd5, +0x11f9fd5e, +0x55f593f1, +0x7dd10667, +0x11e4021c, +0x4c07f99e, +0x40e84b2b, +0x0487061a, +0x040b4433, +0x040b4087, +0xe1be1b07, +0xb00700dd, +0x1c270d07, +0x310c0332, +0x00de06be, +0xf241f491, +0x420b0d1b, +0x11c443d1, +0xcc1d03c2, +0xb91928bc, +0x03021954, +0x6b340741, +0x273b083f, +0xbd40273a, +0xbd021a54, +0xe8021953, +0x052a29bc, +0x021a74b9, +0x66eef293, +0x07410306, +0x083f6b34, +0x273a273b, +0x1924bd40, +0x1a23bd02, +0x1a74b902, +0xd1f39302, +0x46f40666, +0x3dd10516, +0x175e021c, +0x406cecf9, +0x6c27f96c, +0xf9665e40, +0xcf6bfc21, +0xbe47fe11, +0xe872b4e9, +0x4de00006, +0x01ecffff, +0x01e84cee, +0xe407f181, +0xe87810f1, +0x2c070006, +0x02274ce2, +0xf0013007, +0x41034207, +0x1d27d027, +0x2e1b011f, +0x05c9e4ea, +0x05c5efe6, +0x4c034307, +0x003ee880, +0x00be0800, +0x419b4873, +0xd1033407, +0x03e2f248, +0x3fe60594, +0xe0270590, +0x1d272027, +0x4307011f, +0xc8804c03, +0x0800003e, +0x73210379, +0x07419b48, +0x7e2dce34, +0x41160402, +0x41534d07, +0xe1032402, +0x4f6b4e07, +0x018c749d, +0x99fe81f1, +0xbced8c72, +0x0006e872, +0xe878e1f5, +0x749d0006, +0xcf2fe68d, +0x1f4d27fd, +0xe43c2701, +0x13070407, +0x00004ec8, +0x4c032708, +0x9b487380, +0x003ec840, +0x03110800, +0x3873803c, +0xf218319b, +0x23071407, +0x9bfda85e, +0x803c0331, +0xef1e3873, +0x4c03409b, +0x1e487380, +0x9b4307d9, +0x804c0341, +0x21034873, +0xd2ce3407, +0x8504c284, +0x2027e103, +0xff7ce6e4, +0x851e4627, +0x419b4307, +0x73804c03, +0xff3e5e48, +0xf2352027, +0x5105f131, +0x7efc505e, +0x0120d5dc, +0xe4d5d77e, +0x11fd3403, +0x1522e0f2, +0x9c7cd104, +0x27d02701, +0x071027b0, +0xf1418728, +0x06ea2443, +0x0b110300, +0x07f288b3, +0x533d074c, +0x0807184c, +0x2c073833, +0x283334ab, +0x10270103, +0x00b8d2be, +0x30272b07, +0x3d4b2c0b, +0x00c168be, +0x01000dec, +0x0d270123, +0x73d10100, +0x43470258, +0x040b430b, +0x70d50273, +0xd25e0258, +0x29f493fc, +0x42c10665, +0x271d077c, +0x730d0730, +0x94be1f1c, +0x2c2700b8, +0x07302714, +0xbe610750, +0x9300b920, +0x066507fe, +0x022cecd1, +0x91078007, +0x0228ebd1, +0x036ec1e8, +0xdb074c07, +0x4c33ec07, +0x73d1531f, +0xfad4abe1, +0xee00aa9e, +0x0700a29e, +0x2b460735, +0xd54e6b3d, +0xd5022073, +0x5e022474, +0x3f7efb8c, +0xd4d0eee0, +0xf6f211fc, +0x5efcce2f, +0x7499fcc2, +0xfe8a5e8d, +0xf71a8de2, +0xfe81f411, +0x4e0b4433, +0xe7e44f03, +0x43d10006, +0xc30b01e0, +0x4cd5c173, +0x375e01e0, +0xd8067ef7, +0x6007f411, +0x02014ff6, +0x7ed5fe51, +0xf4010264, +0x028074d5, +0x7efc2e5e, +0x02e4d4bc, +0x1127f63b, +0x345ef115, +0x44c4e2f6, +0x07f30103, +0x5eec0724, +0x84e2fdd4, +0xf411f6d2, +0x4433f181, +0x4f03410b, +0x0006e7e4, +0x01e443d1, +0xc173c30b, +0x01e44cd5, +0xe2f6e15e, +0x07ff5ed8, +0x2b460735, +0x93496b38, +0x06642ff1, +0x022013d5, +0x022414d5, +0xe8fae35e, +0xdf04010d, +0x000d27fe, +0xfed85e04, +0x0148d4d1, +0x02d304f2, +0x74d10127, +0xf1930170, +0xf6066404, +0xd102b74f, +0xd1016414, +0x0b016c12, +0x6414d540, +0x072a2301, +0x07241234, +0x70149932, +0x016413d5, +0x14d54153, +0x465e0170, +0x30d4d1fa, +0x1e4ce801, +0xd0d1027f, +0xdbd1012c, +0x20870120, +0xe88c21f1, +0xdcd10006, +0x41070124, +0x4c733107, +0x6bb32b1f, +0x270103c4, +0xdbd51e1c, +0xdcd50120, +0x2bbe0124, +0xd0d500da, +0xfc01012c, +0x012874d1, +0x012072d1, +0x012473d1, +0xdc73dc07, +0x0b04071f, +0x873d4b2c, +0x27010344, +0x4cf51e1c, +0x0006e88c, +0x012072d5, +0x012473d5, +0x00d9f5be, +0x013074d1, +0x012870d5, +0x635ef693, +0x1e4ce806, +0x2c07f971, +0x2c534d07, +0x0743331d, +0x3342ab3c, +0x07830733, +0x6b8c2b94, +0xd5e0079d, +0xd5012068, +0x23012469, +0x76e0e8e1, +0xf12e8702, +0x06e88c21, +0x07be0700, +0x2b233321, +0x73420721, +0xc2071f4c, +0xc80bd407, +0xb123d94b, +0x01206cd5, +0x01246dd5, +0x0245b0e8, +0x21f12b87, +0x0006e88c, +0x2147eb07, +0x4207210b, +0x071f4c73, +0x0b140702, +0x231d4b0c, +0x2060d5e1, +0x2461d501, +0x16e0e801, +0xf14e8702, +0x06e88c42, +0x47db2700, +0x07320b32, +0x1f4c7343, +0x414b300b, +0x012063d5, +0x012464d5, +0xe0c8e123, +0xf14e872a, +0x06e88c40, +0x2071d100, +0x2472d101, +0x07400701, +0x1f4c7330, +0x424b310b, +0x012073d5, +0x012474d5, +0x5ed6fdf0, +0xec03f8a9, +0x07d31e1e, +0x6474d1c0, +0x51cd0b02, +0x2b3c07f0, +0x93312304, +0x066277fb, +0xfdf003e2, +0x1c070c2b, +0x00d944be, +0xfde4d0e2, +0x027cb4b9, +0x3487f101, +0x4f6b4103, +0xea4c31f5, +0xb4bd0006, +0x482a027c, +0xb4bd4027, +0xb8d1027c, +0x0d070280, +0xd0279027, +0x42872027, +0xea4c43f1, +0x21030006, +0xf088d30b, +0x19074807, +0x33184c53, +0x07080718, +0x2714ab2c, +0xbe083330, +0x0700b593, +0x07c107b0, +0x07390728, +0xbe102706, +0x0700b583, +0x0b30272d, +0x07314b20, +0xbe1c070b, +0x9300be15, +0x0661f3f2, +0x01010d08, +0x01000d27, +0x025c24d1, +0x3447fc21, +0x030b340b, +0x40270273, +0x249dcf6b, +0x5c20d58c, +0xfb1a5e02, +0x021974b9, +0xfaef46f0, +0xf4933027, +0xbd0661c0, +0x5e021843, +0x3dd1fae1, +0x4127021c, +0x021834bd, +0xe2f3fd5e, +0x11f42f80, +0x33f281f4, +0x03420b44, +0x06e7e44f, +0xe843d100, +0x73c30b01, +0xe84cd5c1, +0xf42c5e01, +0xb1f4c4d6, +0x4b07fc90, +0x4fd64cab, +0x27d02768, +0xfc995ee0, +0x025494b9, +0x3487fe01, +0x4f6b4103, +0xea243ef5, +0x94bd0006, +0x48ea0254, +0x4027fbd5, +0x025494bd, +0x03fbcc5e, +0x30d4d541, +0xfdb05e01, +0xf7b341e8, +0x14d54123, +0xaa5e0170, +0x40d4d1f7, +0x12112701, +0x07102740, +0x5e012301, +0x4013fd22, +0x01f9e55e, +0x5ed027f3, +0xe227fabe, +0xa7f7025e, +0xf50f5ee1, +0x4c734c07, +0x5314071f, +0x20271f1c, +0x2c4b1b0b, +0x31070207, +0x0c334207, +0x2731531f, +0xab202710, +0x2b417330, +0x07296b18, +0x3ae407d3, +0x0842ee42, +0x0413e2fc, +0x073807fc, +0x4b350b49, +0x2073d546, +0x2474d502, +0xf78e5e02, +0x9d5e4027, +0x1eec03fa, +0x03fde85e, +0xb95e1ebc, +0x1eec03fd, +0x27fd885e, +0xfa3a5e21, +0xc027fa4e, +0xc833b107, +0x33181c53, +0x9bc1abb8, +0x07d00723, +0x270b07a4, +0xbe1c0730, +0x6b00bcb1, +0x96b007af, +0x872d07aa, +0x2b24334d, +0x332d0b24, +0x0c2f0324, +0x0700019d, +0x27002712, +0x141133ec, +0x14031201, +0x3407420b, +0x0b1f3c53, +0x3a317334, +0x4001033b, +0x07fa8efe, +0x334d872d, +0x0b242b24, +0x0324332d, +0x019f7c2f, +0x4ecd1e00, +0xc5f563f5, +0xf09930f0, +0x39fd937c, +0x4f6b0660, +0xc540f4c5, +0xd48944f0, +0x50d0891c, +0xf045f435, +0x891ed489, +0xf2c552d0, +0x51f29338, +0xf4550613, +0x22c1f065, +0x20d48944, +0xc554d089, +0xf2253cf3, +0x7534f1c5, +0x99f085f4, +0xdec118d4, +0x99f49564, +0xd3014cd0, +0xd2c1f0a5, +0x8ae0e834, +0x30d4c106, +0x4eee1027, +0x4107067c, +0x140741c3, +0xd0c11f6b, +0x68d4993c, +0x2150f0c5, +0xc1d811de, +0xd79938dc, +0x40db990c, +0xdac1d651, +0xc1d54148, +0x4ff644d9, +0x412705d3, +0x06e323ee, +0x2407f021, +0x0ff64127, +0xf33105f8, +0x42abf041, +0x03ee2127, +0xf351065c, +0x42abf061, +0x03ee2127, +0xf371065e, +0x42abf081, +0x03ee2127, +0xf3910660, +0x42abf0a1, +0x03ee2127, +0xf3c10662, +0xab42ab50, +0xee212714, +0x2706913e, +0xc51fe641, +0x2742ab05, +0x588cee31, +0x2743ab06, +0x5a7bee21, +0x2742ab06, +0x5c6aee31, +0x2743ab06, +0x5e59ee21, +0x2742ab06, +0x884ff630, +0x84d4d105, +0x30f0c102, +0x04eef305, +0x21270564, +0xf2c1f2b5, +0x30f3c134, +0x0288d2d5, +0x0284d3d5, +0x5f16fd93, +0x0d1c2706, +0x2d073d07, +0x07343c03, +0x23300141, +0x03200511, +0x98240334, +0x20d289f4, +0xf2154027, +0x029cd1bd, +0x029ed4bd, +0xbd69d49d, +0x93029dd4, +0x065ee3fc, +0x055a2ff6, +0xc4bd4327, +0xd4b9029c, +0xfc9302a0, +0x46065ed0, +0xa3c3b945, +0x9cc3bd02, +0xa1c4b902, +0xb9454602, +0xbd02a4c4, +0xb9029dc4, +0x4602a2c4, +0xa5c0b945, +0x9ec0bd02, +0xb9302702, +0xd502a6c4, +0x460294c3, +0xa8c2d145, +0x94c2d502, +0xacc4b902, +0x98c3d502, +0xd1454602, +0xd502b0c3, +0x7e0298c3, +0x0506d4f6, +0xc4bd4027, +0xf4c1029c, +0xc14d7630, +0x0cd634f0, +0x4027c005, +0x02b4d2d1, +0x936cd4c5, +0x065e5ff3, +0xffff2fc0, +0x272affff, +0x19329d41, +0x02a234bd, +0x029e32b9, +0x02a034bd, +0x02a134bd, +0x029d30b9, +0x029c34b9, +0x02a532bd, +0x02a334bd, +0x02a430bd, +0xf58ef543, +0xf493d801, +0xc6065e24, +0x47b1b58f, +0x30274291, +0xa0279707, +0x00002f30, +0x2f274000, +0x3fffffff, +0x42073027, +0x02071307, +0x33104c53, +0x14ab101c, +0x07100c33, +0xbe3a0729, +0xf000ba0d, +0x27049111, +0xffffff0f, +0xc5dba13f, +0xc0277cd0, +0xbff45007, +0x40000000, +0x4b070445, +0x4c531c07, +0x101c3310, +0x29070b07, +0x0c3314ab, +0xbe3a0710, +0xc100b9d9, +0xd0c530d2, +0x1820e880, +0xd825fa05, +0x73420706, +0x32071f4c, +0x045741f0, +0xffff3f27, +0xf0933fff, +0xc10610d0, +0x6307440b, +0xd3c56373, +0x88d6d530, +0x84dbd501, +0xe0c30701, +0x0704d784, +0xbe15070c, +0xe800d457, +0x08052b01, +0x2701000d, +0xf493ff0c, +0x9d065d68, +0xd2998840, +0x89d29d88, +0xa7d3c77e, +0xfeffff4e, +0x6b094399, +0x8733830f, +0x2b343343, +0x4d34f934, +0x99ff0000, +0x400218d1, +0x04e00407, +0x03e0048b, +0x012304dc, +0x4f6b4007, +0x42f00103, +0x04be0574, +0x010300d4, +0x2f6b2007, +0x0144f3c1, +0x70d29df4, +0xf19343ab, +0x27065d10, +0x27448630, +0xabf4b131, +0x134fe643, +0x38f4c103, +0x43330c07, +0x14d5460b, +0x01730188, +0x062404f2, +0x3027b123, +0x4127b20b, +0x01002d27, +0x12d50027, +0x14c50194, +0x781bc56c, +0x9d71149d, +0x139d7413, +0x73139d72, +0x018c12d5, +0x019012d5, +0x40873007, +0x430b3433, +0xe7e44f03, +0x30270006, +0x01ec43d5, +0x01dc43d5, +0x01e043d5, +0x01e443d5, +0x01e843d5, +0x03c40103, +0x40f0c1d8, +0x6127d421, +0x60270496, +0x5c8af293, +0xec40e806, +0x11140704, +0x84219d24, +0x27344c08, +0x3407334c, +0x9d0c2499, +0x4fe68523, +0x23510429, +0x049a30e8, +0x239d2441, +0x344cec86, +0x249d0470, +0x004d2787, +0x5cd4d501, +0x58d4d502, +0x49fc9302, +0xbb7e065c, +0x2f02e8d7, +0xf6f21105, +0xd1048c2f, +0x070294d4, +0xe84a26a5, +0x08046841, +0x4c27654c, +0x07c40764, +0x1fcc73b4, +0x07d7957e, +0x27209b25, +0x070b0730, +0xaf8dbe1c, +0x642c2700, +0x1dbe3027, +0x501200b0, +0xd4d1a007, +0x1a070258, +0x24073407, +0x3c730a07, +0x1f1c731f, +0x00af6abe, +0x27807c27, +0x4b070b80, +0x07410718, +0x184c33b0, +0xb4abb853, +0xc130f2c1, +0x460734f3, +0x1b070127, +0x99fb1b7e, +0xe00784d4, +0x5bc2fa93, +0x07401206, +0x85a499e4, +0xe407e412, +0x0188a0d1, +0xd130a1c1, +0x2b0294a9, +0x73210710, +0x42071f2c, +0x0c530107, +0x07473319, +0x3340ab31, +0x4b370b37, +0x33240748, +0x3853182c, +0x019cabd5, +0x01acaed5, +0xa30732ab, +0x91e89d46, +0x490703bd, +0x27659c08, +0xc407644c, +0xcc73b407, +0xd6dc7e1f, +0x277cd4c1, +0x07409b30, +0x070b0724, +0xaed1be1c, +0x27302700, +0x61be642c, +0xd4d100af, +0x30070298, +0x033345d6, +0x1a27030b, +0x00d1e7be, +0xa3123007, +0xf2c1a307, +0x34f3c130, +0x1a074607, +0x757e0027, +0x7cd4c1fa, +0x0258ded1, +0x3e071407, +0x04072e07, +0x731f3c73, +0x88be1f1c, +0x3c2700ae, +0x0b402780, +0x07414b30, +0x182c3324, +0x32ab3853, +0xf2c11307, +0x34f3c130, +0x01274607, +0x07fa3b7e, +0xd65c7ec0, +0x15190ccc, +0x0c271007, +0xd186be1e, +0x1500e800, +0x100cec03, +0xc00b02f6, +0x03030c07, +0xd586d499, +0x0701acd0, +0xbdf29330, +0x4012065a, +0x24993407, +0x07341287, +0x84249934, +0x40121207, +0x14990407, +0x07041285, +0xa823d504, +0xac20d501, +0x982ad501, +0x9cded101, +0xe43c2701, +0xd3c52e07, +0xacd3d1a4, +0xa7215301, +0x1f4d27c0, +0x84d1d101, +0xd5b02702, +0xd50250d2, +0xd501a0de, +0xd501b0d3, +0xd50240d2, +0xd50244d2, +0xd50248d2, +0x8d024cd2, +0xd4c58edc, +0x92dc8da0, +0x2790dc8d, +0x0100000e, +0xbd8ddb9d, +0xbe0254db, +0xc100d11f, +0xd1d134f4, +0x41030288, +0x028cd0d5, +0x00000e27, +0x34f4c501, +0x00d106be, +0xd534f2c1, +0x530290d0, +0x7cd2d521, +0xd58c7e01, +0xdc894027, +0x80d0d52e, +0xd0d4d501, +0xd57c7e01, +0x0ce8c012, +0xd502191e, +0x0101d0d0, +0xf5f193d4, +0x44e00659, +0xf4c101c1, +0x33f5433c, +0x78d4d543, +0x93f58e01, +0x0659dff4, +0x439d3027, +0x05412768, +0x30f0c1f4, +0x0284d4d1, +0xfaa040ee, +0x59c6f493, +0x8843d106, +0x34f0c102, +0x030e4027, +0xf4b54127, +0x27fa8d5e, +0xfa775e31, +0xf041f331, +0x42ab4027, +0x30ee2127, +0x611efa0a, +0x42ab4027, +0xc8ee3127, +0x905efa3d, +0xffbf2700, +0x273fffff, +0xfbb45ec0, +0xe0c9c77e, +0xe0faa302, +0x2700bf01, +0x9ec4bd47, +0x27322702, +0x9cc3bd45, +0x9dc4bd02, +0xfa905e02, +0x835e1127, +0x5e1027f9, +0x1ff6f986, +0x0ff0fb75, +0x40000000, +0x645efb6d, +0xaf4ff6fb, +0x002ff0fb, +0xa7400000, +0xfb9e5efb, +0xf061f351, +0x42ab2027, +0x30ee2127, +0xf371f9a6, +0x2027f081, +0x212742ab, +0xf9a430ee, +0xf0a1f391, +0x42ab2027, +0x30ee2127, +0x2027f9a2, +0xab50f3c1, +0x2714ab42, +0xa0e3ee21, +0x272c1ef9, +0x2743ab30, +0xaab7ee21, +0xab2027f9, +0xee312742, +0x27f9a8a6, +0x2743ab30, +0xa695ee21, +0xab2027f9, +0xe6302742, +0x5ef9a44f, +0x2027ff27, +0x1ff64127, +0x315ef971, +0x27f021ff, +0x27240740, +0x1f0fe641, +0xff125ef9, +0x32274527, +0x029ec4bd, +0x029cc3bd, +0x27f9d95e, +0xfb8e5e27, +0x8c538707, +0x1e8cd410, +0x88d89d4d, +0xe0fb395e, +0xe0010384, +0x2700bf82, +0x10271e0c, +0x30272507, +0x00ac02be, +0x15d61134, +0x00000f10, +0x0f274000, +0x3fffffff, +0x0baaf393, +0x443bc106, +0x63736007, +0xd0c5c007, +0x88d6d530, +0x84dbd501, +0xfadd5e01, +0x395e2527, +0x070c07fb, +0xcf2dbe15, +0x0f01cc00, +0xdb5e0127, +0x87239dfa, +0x5e86219d, +0x0ce8fbe5, +0x27facd79, +0xc75e780c, +0x643c27fa, +0xd5504c27, +0x27013813, +0x14d53c3c, +0x13d50148, +0x4c270140, +0x8013c16e, +0x14d52027, +0x4c27013c, +0x6c12d51e, +0x4414d501, +0x3412d501, +0x4c13d501, +0x5012d501, +0x5c12d501, +0x7012d501, +0xfe005e01, +0x5e334c27, +0xf493fb8e, +0xd50657e4, +0x5e01d04c, +0x0c27fde3, +0xfd085e0f, +0x27780c27, +0xff425e10, +0x655e3027, +0x27b127fb, +0xfba25ec0, +0xef5e0027, +0x27b127fc, +0xfc4f5ec0, +0x955e2427, +0xc7f27efa, +0x00ca01e0, +0xfb6d03e4, +0x02004d27, +0x0258c4d5, +0x27fb625e, +0xfb135e40, +0x8c538707, +0x27b00710, +0x104807c0, +0x4c271f8c, +0x2724071e, +0x070b0730, +0xaaf5be1c, +0x07900700, +0x161134a1, +0x000f3016, +0x27400000, +0xffffff9f, +0x27a0273f, +0x07240740, +0x1d0c5305, +0x15072333, +0x133320ab, +0x42070107, +0x331c0c53, +0xab310744, +0x2b343340, +0xca426b31, +0x4ace234a, +0x6df2931d, +0x2bc1060a, +0x73690744, +0xc5c90763, +0xd6d530d9, +0xdbd50188, +0x7a5e0184, +0xe293c2fe, +0xa4079307, +0xf2c1dc1e, +0x34f3c130, +0x00274607, +0x557e1507, +0x86c499f6, +0x04074012, +0x1287c499, +0x27040704, +0xacc4d540, +0x98c5d501, +0xa8c0d501, +0x9cc4d501, +0xfc4f5e01, +0x01554d27, +0x0258c4d5, +0x27fa9e5e, +0xbcf19304, +0x909e00f1, +0x10d5009d, +0xd95e0188, +0x63fb4ef9, +0x28fe99f0, +0x072cfc99, +0x07df6bd4, +0x99fc054e, +0xfc9918fb, +0xf6657e14, +0x7134dc54, +0x363419f3, +0x9df2934e, +0x40270656, +0x01a424bd, +0x8134cc54, +0xb6e419fe, +0xbd402749, +0x5401a524, +0xf39134bc, +0x45963419, +0xf0434027, +0x01a624bd, +0x4027fb8e, +0xf043341d, +0x23bd3127, +0x2bd501a6, +0xfb8e01b0, +0xe41d4027, +0x2cd54127, +0x24bd01ac, +0xcc1e01a5, +0x341d4027, +0x564af293, +0xd5412706, +0xbd01a82d, +0x1e01a424, +0xff3ea7a8, +0x34d1fdef, +0x4dd8010c, +0x0710fc6a, +0xe8432723, +0x0c23d1f4, +0x6a3ddc01, +0x3ea7f4fc, +0x51fdefff, +0x6a4dd834, +0x23070efc, +0xf4e84327, +0x3ddc2351, +0x0bf6fc6a, +0x27fe4efe, +0xbe122702, +0xa7029851, +0xffffff3e, +0x0e2034b9, +0x408b4153, +0x01274138, +0x4ea7fe8e, +0x01fd4fff, +0x27002742, +0x0ef49b40, +0x33991127, +0xcb123b0e, +0xbf3ea713, +0x1138fd4f, +0x34054127, +0x34031153, +0x312712d6, +0xcfff4ea7, +0x6043c5fd, +0xfb4efe8e, +0xc321c207, +0x2211c401, +0x1007b107, +0xf0a7f093, +0x9923be00, +0x93c23100, +0x00f0caf0, +0x16be1027, +0xbf6b0099, +0xd127c403, +0x1d07c231, +0xf0b5f093, +0xbed10300, +0x03009901, +0x0fdcc4c4, +0x27bd86ec, +0xffdea7c0, +0x091efdbf, +0xdc03c103, +0x3ac8c020, +0x42c6d441, +0x42f14c87, +0x00019b40, +0xf0931c07, +0xbe00f095, +0x410098d1, +0xa2f093d1, +0xc6be00f0, +0xd1510098, +0xf0a7f093, +0x98bbbe00, +0x45402700, +0x03c103d4, +0xc8c420dc, +0x4df493c8, +0x43190566, +0xfb0e34e6, +0x0ec46c5e, +0xc0685efb, +0x2007fe4e, +0xf0931027, +0x7e00f089, +0x2ea7ff56, +0x27ffffff, +0xff3ea741, +0x24bdfd4f, +0x31010e21, +0xf49b4027, +0x0e23990e, +0x213b2127, +0x3ea723cb, +0x38fd4fbf, +0x05412721, +0x03215334, +0x2722d634, +0x7d78414f, +0x8ef4e801, +0x6bfd4efe, +0x9307060f, +0x00f04dfd, +0x0d072107, +0x077e1127, +0x271d07ff, +0x9b759e01, +0x42fd9300, +0xe91e00f0, +0x01271007, +0xfb4ed81e, +0x1127b007, +0xf039f093, +0x981bbe00, +0x93b11100, +0x00f046f0, +0x009810be, +0xf093b121, +0xbe00f04d, +0x01009805, +0x54f093b1, +0xfabe00f0, +0xb2310097, +0xf05bf093, +0xbe102700, +0x070097ed, +0x27d403db, +0x07d231c1, +0x46f0931c, +0xc10300f0, +0x0097d8be, +0xccc4d403, +0x0b07ec0f, +0x9d1efb0e, +0xeea7f94e, +0xa7ffffff, +0xfeffff1e, +0x992ae399, +0xa0070814, +0x43eeaf6b, +0x2ea7018e, +0x79ffffd7, +0x2744d624, +0x79f98e02, +0x07247923, +0x274f4b93, +0x7740e830, +0x07241901, +0x87438303, +0x2c4cf144, +0x99ff0000, +0xbc0744e4, +0x9909149d, +0x0f6b0911, +0xd1071383, +0xd4334187, +0xbc83d42b, +0xb4de230f, +0x0ff6ffff, +0xa6260151, +0x7fff4ea7, +0x353127d0, +0xe4423143, +0x07012d21, +0x10ec53ec, +0x01590ff6, +0x2705d499, +0x084f4b20, +0x59212740, +0x03e1c3d4, +0x5d3e0741, +0xa73183d4, +0xfeffff4e, +0x43bdb207, +0xbf6b0141, +0x3ea7bac6, +0xc1ffffff, +0x08664032, +0x48534c07, +0x6b3c32c5, +0xf44fe64f, +0xa7240b00, +0xffffff4e, +0xa74042c5, +0x4027203c, +0xd49dd325, +0xff4ea704, +0x42d5feff, +0xa976013c, +0xffff4ea7, +0x9943b9fe, +0x27385c1e, +0xff4ea731, +0x4335d07f, +0x7fff3ea7, +0xc03431d0, +0x23070c41, +0xf4e84327, +0x31c42331, +0xff0ea7f8, +0x04b9feff, +0x45760141, +0x4ea73127, +0x45d07fff, +0x83190743, +0x11c40f1c, +0xff2ea71b, +0x2499ffff, +0x03312744, +0x44249d41, +0x7fff4ea7, +0x4003bdd0, +0xbe415501, +0x1900ca82, +0xd71ea7d3, +0x3103ffff, +0x1479d31d, +0x230f4c83, +0xab240741, +0x6b28e62f, +0xd73ea72f, +0x327dffff, +0x41033459, +0x05e6345d, +0xf49b4027, +0xff3ea70e, +0x34c5fd4f, +0x27b90638, +0xf98e100c, +0x41031419, +0x1319141d, +0x34ce1439, +0x8314194b, +0xf1448743, +0x00002c42, +0x0f2c83ff, +0x1e802ca3, +0x200c27bd, +0x0827f98e, +0x0127f98e, +0x3127f98e, +0xa7fe885e, +0x0c5e202c, +0x14e4d1ff, +0x24e3990e, +0x0740e4c5, +0xcc4f4b43, +0xeb9d3e40, +0xe6d47924, +0x27fe994f, +0x27f98e04, +0x07831e20, +0x83412341, +0x33348743, +0xe9432b44, +0x00005244, +0x7d3027ff, +0x6dd35ddb, +0x3dd31dd4, +0x80ec38db, +0xd49d4127, +0x05de9d04, +0xcefe7f5e, +0x0327c43b, +0xee43f193, +0x98f99e00, +0xa7f64e00, +0xfddfff2e, +0x00004e27, +0x3416c120, +0x24d53027, +0x23d50208, +0x4ea70208, +0x11fd4fff, +0xd413c142, +0x7007a107, +0x075432c5, +0xc1802790, +0xac8934a0, +0x28a48926, +0x01089ba9, +0x0c33c49b, +0x07c00b1c, +0x049ed12b, +0x01b6e601, +0xd040cbe4, +0x0000004f, +0x3b070b10, +0x2123e803, +0x00c6f3f8, +0xd103d207, +0x28232e07, +0x28031d07, +0xf1f8d123, +0x420700c3, +0x43734e2b, +0x4b1b4886, +0x010894ad, +0x3d07d786, +0x21012411, +0xe105e415, +0x4c542803, +0x0b433310, +0x884ec547, +0xf338e803, +0x030da499, +0xd2980381, +0xc6078a84, +0xffdf0ea7, +0x0fcc83ff, +0x0099b6be, +0xc3f9c333, +0xff00007c, +0x007ec4f9, +0x38a3ff00, +0xc4fd4123, +0xff00007e, +0xffdf0ea7, +0x7cc3fdff, +0xbeff0000, +0xc100996c, +0x0c8334a0, +0x2303330f, +0xffff7e0e, +0x4fd60439, +0xff3ea75e, +0x3201fd4f, +0xf49b4027, +0xff3ea70e, +0x3499ffff, +0x3b31270e, +0xa734cb32, +0xfd4fbf2e, +0x41273138, +0x31532405, +0x32d62403, +0x4ea73127, +0xc5fdcfff, +0xf68e6043, +0x40cbe401, +0x00004ff4, +0xff2a1000, +0x01ff2f5e, +0xcb400723, +0xf4030743, +0x0000004f, +0xeeff3110, +0x5eff25c3, +0xb9beff2a, +0x9e1e0139, +0xfd93fc4e, +0x19060418, +0x680fc6d0, +0x2744d1c1, +0xa7202740, +0x0cd49d30, +0x654ad38d, +0x0bd49dd2, +0x834cd2c5, +0x00000f1f, +0x6110c880, +0x276a01c0, +0x9b0380cd, +0x033c07c1, +0x069b1c3f, +0x4232b900, +0x3031b910, +0x26412710, +0xab46332c, +0x5ad49d41, +0x103c34b9, +0x03c6f293, +0x5bd49d06, +0x103134b9, +0x46761027, +0x274423c1, +0x1d310340, +0x5c219d24, +0x8e4423c5, +0x4423c1fc, +0x31031127, +0x241d4027, +0xc55c219d, +0xec1e4423, +0xbe1e4027, +0x1fa31123, +0xfffffff0, +0x951e1103, +0xca33c107, +0xc12b1733, +0x009ab4be, +0x0098b8be, +0x0098a7be, +0xab54c4f9, +0x4fd60006, +0x071c0781, +0x481f030d, +0x7e0006ab, +0x725efdf1, +0x07fc4eff, +0xff367ec0, +0x0254c4d1, +0x5628f353, +0x00274103, +0xc4d5c315, +0xfc8e0254, +0xc007fc4e, +0x00000f30, +0xf0934000, +0x8e00ec38, +0xc02c7efc, +0xdc070fab, +0xdfab0103, +0xd103d09b, +0x0000de30, +0x40f09301, +0xfc8e00ec, +0x997e0c07, +0x7e0d07c6, +0x0027c6aa, +0xfc4efc8e, +0x097ec007, +0x1002c0c0, +0x202903c0, +0x62f09301, +0xfc8e00ec, +0x07f7c6d4, +0x7edfabdc, +0x0fabc6b2, +0xd09bd103, +0xded0d103, +0x12010000, +0xec20f093, +0xc0fc8e00, +0xf093e2c3, +0x8e00ec39, +0x7e0c07fc, +0x0d07c678, +0x27c65d7e, +0x00fc8e00, +0x00001000, +0x08000000, +0x0000000f, +0x07c1f54e, +0x3c0dc138, +0x07240a99, +0x27c107b0, +0x27502780, +0xddfc0c6c, +0x00a41000, +0x4d034d07, +0xc4ea2000, +0x3c27009a, +0x2b06071b, +0x27010336, +0x3b4d0722, +0x0b405b20, +0x5b41dc2d, +0x2755f3f0, +0x4a3b0f4c, +0xf4139487, +0x134e01b0, +0x4201aff4, +0x2b0b2247, +0xb3012149, +0x490b4187, +0x3707430b, +0x11033d0b, +0x3a074305, +0x3703214d, +0x030ade0b, +0x18025127, +0x41278107, +0x42234a3b, +0x5936841a, +0xa194dcca, +0x3cb3c1b4, +0x2b3cbcc5, +0xa54c0b43, +0xc2f58eb4, +0x2007982c, +0x070c2c23, +0x274a3b42, +0x3b9487e1, +0x07aa1ee0, +0x7e0b0713, +0x1007c28a, +0x5a7e0b07, +0x24ba99c8, +0xff5cdcea, +0xf453c61e, +0x4e01ff34, +0x20270607, +0x851e9027, +0x02c1fa4e, +0x4003c13c, +0x04a1d107, +0x0fffdd03, +0x0fffdde3, +0xb007322b, +0x00c1d42b, +0xd634d638, +0x07fa8ed7, +0x243dcaad, +0xc20bca07, +0xa2be1c07, +0x0b070095, +0xfd7e1c07, +0xc6da2bfe, +0x7e0d07d0, +0x0b07c791, +0xfa0e1d07, +0x07feeb5e, +0x0bca07a3, +0xbe1c07c2, +0x0700957d, +0x7e1c070b, +0xda2bfed8, +0xfa4eda1e, +0x07310499, +0x07a207d0, +0x56c107b3, +0x0cb2c04f, +0x497e0a07, +0x5d0fc6c7, +0x475ab3c0, +0x144c234c, +0x0b24d199, +0x3b31274d, +0x23420931, +0x2932c231, +0x41273c07, +0xd1a1433b, +0x31233407, +0x13eb130b, +0x0d07140b, +0x89ff577e, +0x0d0732d4, +0x1c074103, +0x0e32d48d, +0xc1b05efa, +0x47034107, +0x071ac4c2, +0x1e31033c, +0xc5647ece, +0x402706d6, +0xc431d49d, +0xa81e9fb2, +0xfa8e0027, +0x38033107, +0x0d07b51e, +0x837e1c07, +0x9d4027c1, +0x0fc631d4, +0x4efa8e81, +0xa7d007fd, +0xffffdf0e, +0x0095dabe, +0x6108d099, +0xbe2027d1, +0x45041563, +0x110706d0, +0x19d201d3, +0x0b448734, +0x31400542, +0x19d455d4, +0x1d410334, +0xdf0ea734, +0x89beffff, +0xd4410095, +0x44960027, +0x01c30127, +0xfd8e0183, +0x0451fb4e, +0xd207c007, +0x42cab107, +0xdf3ea74a, +0x3b05fde3, +0xc1413d15, +0x32352027, +0xe3cf4ea7, +0x154105fd, +0xff3ea74d, +0x4235fdef, +0x010c34d1, +0xfc6a4dd8, +0x27230710, +0xd1f4e843, +0xdc010c23, +0xf4fc6a3d, +0xc451c341, +0x03073d0b, +0x0d2b4d2b, +0xc345c455, +0x607efb8e, +0xb20fd6ff, +0xfa4efb8e, +0xb0070e51, +0xd207c307, +0x4307a107, +0x4e073e02, +0xb451d415, +0xdc154496, +0x853ed211, +0x08a6d005, +0x2c07d411, +0xd235242b, +0x01272516, +0xfa8ed225, +0x140b1a07, +0x697e0b07, +0x27d025ff, +0x27049641, +0x8e040740, +0x07fa4efa, +0x07a007d2, +0x8e27b6b1, +0xb3cea7fa, +0xc099fff9, +0x27102724, +0xbe070322, +0x0704146f, +0x7e0c0710, +0x3d07c63d, +0x2b071a07, +0xf9b30ea7, +0xc5ec7eff, +0x27d70fd6, +0x0ef49b40, +0xf54efa8e, +0x073412c1, +0x83d207c1, +0x11990fdc, +0x27d33358, +0x23fd23b1, +0xffff84de, +0x70073b07, +0xf265d403, +0xc2c1313b, +0x35a02750, +0x154027f3, +0x08f19dfd, +0x6707fa55, +0xd4230f07, +0xf205f445, +0x61186c03, +0xfe917e79, +0x0ea70c16, +0xbeffffdf, +0xc100946b, +0xd29950c0, +0x58c19904, +0x21230403, +0x99ff647e, +0xc0c159c1, +0x05d29954, +0x27ff587e, +0xa7312740, +0xffffdf0e, +0x9d05d49d, +0x19be04d3, +0x04270094, +0xf58efd03, +0xc159c499, +0xb43b54c3, +0xfac5fba5, +0x24f49d30, +0x0f07d503, +0x8534c4c1, +0x1c0c03fd, +0xf375d523, +0xf4c5fab5, +0xfe297e34, +0x07980fc6, +0x383c033f, +0x4c272027, +0x03320520, +0x89f4c834, +0x2fe628c2, +0x30270113, +0x1d27960b, +0xc489ffff, +0xbcf9c526, +0xc5c0f3c5, +0xf3c5c4f1, +0xbcf1c1c8, +0x34c61301, +0x360b3853, +0xe6ccf3c5, +0xc100d34f, +0xf4c1bcf8, +0xc4f9c1c8, +0x84034487, +0xf4c55027, +0x008a5eb8, +0xac23fb41, +0x40bc0340, +0xfa55fb45, +0xa640bc23, +0xccf8c155, +0x1c031807, +0xccf1c518, +0xfac58a09, +0x189acec4, +0x4a07a203, +0x94874fab, +0x920b2f07, +0x233893c1, +0xc0f3c5a2, +0x0d633fc6, +0xc18129ba, +0x8431c0f2, +0xb215b12d, +0x2b071607, +0x140b8321, +0x28030f07, +0xe6fe217e, +0x41fee90f, +0x0b845171, +0x07834116, +0x0b2b070f, +0x242c0314, +0x7e1c0c03, +0xf3c1fe06, +0x4cc4c1b8, +0x4b05430b, +0xc489b329, +0xd2530b26, +0x9a073445, +0xacf4fa51, +0x07ff7340, +0xfd3d7e0f, +0xfeac0fe6, +0x655efa51, +0x078111ff, +0x01160b0f, +0xfd727e12, +0xfe980fe6, +0xf0c58a09, +0x3890c5c0, +0x1ec4fac5, +0x28c28983, +0x03c8f1c1, +0xc8f1c511, +0xc10d21d2, +0x3c03bcf3, +0xbcf3c51c, +0x27ff085e, +0xfea65e00, +0xf063fd4e, +0xffdf0ea7, +0x92d1beff, +0xa72f0700, +0xffe9730e, +0x3f072303, +0x2ce3f005, +0x7f3ce37f, +0x3c033419, +0xf932c280, +0xe9730ea7, +0xb404b9ff, +0x274bc601, +0x1ed02730, +0x07f00110, +0xb404b93d, +0x07310301, +0x2843d2d3, +0x34b9300b, +0x42d80164, +0x994d87e9, +0x040b4231, +0x8a7e2127, +0x99f301fd, +0x41234034, +0x0140349d, +0x400499f0, +0x27cd4fd6, +0xb82d2710, +0x730ea701, +0x1ebeffe9, +0x0ea70085, +0xbeffffdf, +0x43009234, +0x4efd8ef0, +0x95f493f9, +0x240705fe, +0x073f2c03, +0xe3f06334, +0x3ce37f2c, +0x0334197f, +0x32c2803c, +0x100c27f9, +0xfe76f393, +0x0720a705, +0x23320540, +0xb8340301, +0x21fd93f4, +0x302705fd, +0x49e2f193, +0xa7212706, +0x68129d40, +0xc566d49d, +0xd33d80d0, +0x9d0bd39d, +0xd35d0cd0, +0x129dd31d, +0x039d0769, +0x07102c9d, +0xe33d0749, +0x3d037f4c, +0x4f54482c, +0x0006e348, +0x030cf49b, +0x43ca804c, +0x9bc027f8, +0xbea70efc, +0x27fdeaf7, +0x27be210c, +0xaf27028d, +0x12c20000, +0xba15bc05, +0xa70efc9b, +0xfde3df3e, +0x34054427, +0x38002d27, +0x4ea73215, +0x35fde3cf, +0x1549053c, +0x210c2742, +0xf7be4c35, +0xbc05028c, +0xfc9bba15, +0x24dcd50e, +0x91f49310, +0x240705fd, +0x073f2c03, +0x7f2ce334, +0x197f3ce3, +0x803c0334, +0x93f932c2, +0x05fd7bf2, +0x40273827, +0x2803240d, +0x2c23f3b8, +0x031207c4, +0x32077f1c, +0xe37f1ce3, +0x34197f3c, +0xc2803c03, +0xf393f931, +0x2705fcd0, +0x204c2720, +0x34033205, +0x0ea7f4c8, +0x27fffaf3, +0x94babe18, +0xa30ea700, +0x1427fffa, +0x0094afbe, +0x27802c27, +0x330ea710, +0xd6befffa, +0x397e0083, +0x032f07fe, +0xaf4ea723, +0x3f07ffe7, +0x2ce3f405, +0x7f3ce37f, +0x3c033419, +0xf932c280, +0xe7af4ea7, +0xc64001ff, +0x8f2cbe04, +0x27f30100, +0x25f04340, +0x15340534, +0x4ef98e34, +0x834007f7, +0x34070f4c, +0x3733a407, +0xa32baa33, +0x70079407, +0xab48af03, +0x0ea70006, +0x33ffffdf, +0x07a89993, +0x0090b6be, +0xff849e23, +0x36fd93ff, +0xcea705fd, +0x27fffc2b, +0x030e1e30, +0xdc0314cc, +0x14cfc010, +0x32ff0005, +0xc401c823, +0x4e83c803, +0xc4030000, +0x0300004e, +0x16db19e3, +0xc6c401b0, +0xd459da4f, +0x00ef4ff6, +0xcc03cb05, +0x03312714, +0xcfc410dc, +0xff000514, +0x153ff6d0, +0xff8cc001, +0x8728071a, +0x0b243348, +0xcc43f142, +0xa3ff0003, +0x0300003e, +0x03cc43f5, +0x9419ff00, +0x00d744fc, +0xe0ff8ce0, +0x33280700, +0x0b488724, +0xd443f142, +0xe6ff0003, +0xc100ce3f, +0x420750a3, +0x9b1c4f03, +0x43d50006, +0xa3990188, +0x15fd9358, +0x43bd05fb, +0xa3990186, +0x8c43bd5a, +0x04939901, +0x018743bd, +0xc1059299, +0xa19954a0, +0xfafb7e59, +0x929d2027, +0x09a39905, +0x13ff3cc0, +0x3f033433, +0x00069b1c, +0x018534b9, +0x34bd4123, +0x94590185, +0x4123921d, +0xcea7945d, +0xb9ffffff, +0x030100c4, +0xbd412371, +0xc10100c4, +0xc7c5d4a3, +0xd13219fc, +0x271024d1, +0xcb423b41, +0xc5302741, +0x0ea7d4a3, +0xd5ffffdf, +0xbe1024d4, +0x99008f74, +0x0ea70ec1, +0x0efff95d, +0x92a29ef7, +0x03d0c100, +0x2707d199, +0xfa877e21, +0x5903d0c1, +0x03d139d2, +0x7e212304, +0x4027fa79, +0xf55ed45d, +0x270a07fe, +0x7e212710, +0x8ce4b696, +0x99ff24ff, +0x47d60494, +0xfa56fd93, +0xff525e05, +0xffff4ea7, +0x0e4199ff, +0xf95d0ea7, +0x9256beff, +0xfedb5e00, +0x9950a0c1, +0x21275aa1, +0xc1fa387e, +0x929950a0, +0x58a19904, +0x21230403, +0x27fa287e, +0x1dfd9340, +0x949d05fa, +0xff165e04, +0xfc93f74e, +0xa305fb94, +0x274027f0, +0xdf0ea730, +0x7c07ffff, +0xf34df405, +0xa706f49d, +0xfffc2bae, +0x008eeebe, +0xd0278027, +0x1e407c23, +0x03d1030e, +0xac0310cc, +0x10dce014, +0xba070094, +0xb401b823, +0x00004ed8, +0xc4192303, +0xc3994886, +0xff3cc009, +0x0b4f0709, +0x1d412734, +0x0ac39934, +0x09ff3cc0, +0x340b4f07, +0x341d4127, +0x45d6c419, +0xc39d30a7, +0x09c39d0a, +0xa4154027, +0x4e83b401, +0xc4030000, +0x0300004e, +0x16c939a9, +0x86a40196, +0xf6c47945, +0x0500884f, +0x098127a9, +0x923fd6c3, +0x2707b401, +0x00004ee3, +0x8db40503, +0x40270aa3, +0xfaeaf393, +0x08a48d05, +0x2419372b, +0x03594dce, +0x03f3b021, +0x10cc03d1, +0xe414ac03, +0xff7010dc, +0x061ed027, +0xd7c0d103, +0x0b4f071f, +0xb643194d, +0x7e0d0732, +0x08abb7bb, +0x04864027, +0x84074127, +0x8f6bd103, +0xa7e3d7c4, +0xffffdf0e, +0x008df3be, +0x4ea78666, +0x99ffffff, +0x0ea70e41, +0xbefff95d, +0x8300911c, +0xa7f78ef0, +0x1e241d40, +0x99c011a3, +0x212708c1, +0x11f8f87e, +0x59c279c0, +0x230403c1, +0xf8eb7e21, +0xc47d4027, +0x4eff5e5e, +0xc1d007fb, +0x1d07f400, +0x07f9157e, +0x0704c6b0, +0xa7fb8e0b, +0xffffffce, +0x0690c4d1, +0xf28b0ea7, +0xd54103ff, +0xbe0690c4, +0xc8012edd, +0x40073b00, +0x36333007, +0x3334ddc1, +0xf5430b43, +0x000d844d, +0xfd4227ff, +0x000d7804, +0xfe7e7eff, +0xc4bd4127, +0xc39906a8, +0x9b40270f, +0x41270ef4, +0x0b073387, +0xb04034f5, +0xfb8eff02, +0x0000ff1e, +0x00000290, +0x000001e0, +0x00000200, +0x00000180, +0x00069ca0, +0xff0003cc, +0x00069ac2, +0x3ea7f54e, +0x99ffffff, +0xf3632734, +0x04884fe6, +0xf842f993, +0x08949905, +0x047c4ff6, +0x069830d1, +0x069c3ad1, +0x010234a9, +0x010433a9, +0x1407a02b, +0xab66e307, +0x41834007, +0x25332407, +0x242b4487, +0x35333207, +0x3e23322b, +0xa9fff954, +0xa9030a32, +0x2b030834, +0x0be1071e, +0x2befab42, +0xec4f8b4e, +0x07042841, +0x2301031a, +0xf5f1f8a1, +0xff4ea703, +0x40d5ffff, +0xa0270698, +0xf0a50027, +0xffff7ea7, +0x39f593ff, +0x78d10640, +0x4807069c, +0x34074183, +0x44873533, +0xd307342b, +0xd32bd533, +0x152978bd, +0xde230807, +0xbefff954, +0xf802870f, +0x07061704, +0x0f4c8348, +0xca33c407, +0xc42b4733, +0xab48cf03, +0xc1990006, +0x101ce004, +0xc4c10620, +0x4341e030, +0x34c3a906, +0x10c4a903, +0x4092d102, +0x1134ca06, +0x0e2d73b9, +0x432b4207, +0x4f4b4223, +0x066041ec, +0x4605c499, +0x07c39947, +0x3433f395, +0x3f03f3b5, +0x00069b1c, +0x018d34b9, +0x93ff4ce0, +0x99153603, +0x4ff605c4, +0x3d070516, +0x3c034c07, +0xd84c034c, +0x01122c27, +0x0544034b, +0xa834033b, +0x27c101f2, +0x05312742, +0x25d4bdd1, +0x26d3bd03, +0x17c39903, +0xc12cc489, +0xcbc1d0c2, +0x1dd3bd34, +0x12d4ad03, +0x073d0703, +0x5cd2d54c, +0xa4dbd502, +0x7c3d0302, +0x204d0301, +0x322c2701, +0x44034001, +0x34033005, +0xc2d1f2a8, +0x3d0701e8, +0xd2d54c07, +0x3d030244, +0x4d030248, +0x242701ec, +0x44034b01, +0x34033b05, +0x4409f2a8, +0xc1c1340d, +0x60d1d544, +0x07c29902, +0x0320d2bd, +0xd530c3c1, +0xb902a8d3, +0xbd035ac4, +0x890324d4, +0xc1c12ecb, +0x08dbad4c, +0x26c08903, +0x0264d1d5, +0x0304d0ad, +0x0728c289, +0xad1c070d, +0x030306d2, +0x2702c40d, +0x1c03402c, +0x85febe90, +0x3c93c102, +0xd3d54c07, +0x3d070274, +0x4d033403, +0x2c270200, +0x034b0112, +0x033b0544, +0xa9f2a834, +0xad0330c1, +0xa9030cd1, +0xad0332c2, +0x7e030ed2, +0x0fabb6b6, +0x030ed0ad, +0x03e50ff6, +0x0334c4a9, +0xd4ad3d07, +0x4c070310, +0x03943c03, +0x2702484d, +0x4b013a2c, +0x3b054403, +0xf2a83403, +0x0342c4b9, +0x44863027, +0x94c13127, +0x16d3bd50, +0x54449903, +0x0317d4bd, +0x0338c1b9, +0x0318d1bd, +0x0339c2b9, +0x0319d2bd, +0x033cc3d1, +0x02c0d3d5, +0x0340c4b9, +0x031ad4bd, +0x0343cbb9, +0x031bdbbd, +0x034cc0d1, +0x02b8d0d5, +0x0350c1d1, +0x02bcd1d5, +0xd550c2c1, +0xc10268d2, +0xd3d554c3, +0xc4c1026c, +0x70d4d558, +0xb55b7e02, +0xd0bd0f6b, +0x07c60344, +0xd5685bc1, +0xc10334db, +0xd0d55850, +0x51c10338, +0x3cd1d570, +0x7452c103, +0x0340d2d5, +0x4c073d07, +0x02783d03, +0x275c4c03, +0x034b0129, +0x033b0544, +0x99f2a834, +0xd1bd80c1, +0xc2b9029c, +0xd2bd0354, +0xc399031c, +0x21d3bd18, +0x05c49903, +0x031ed4bd, +0x0359cbb9, +0x031fdbbd, +0x0356c0b9, +0xbd38c1c1, +0xd50327d0, +0xb902acd1, +0x930355c2, +0x05f4c3fb, +0x0328d2bd, +0xe61cb499, +0x5303004f, +0x01fcd3f3, +0xa0d4d534, +0x57c4b902, +0x29d4bd03, +0x5cc0d103, +0xb0d0d503, +0x1bb19902, +0x0322d1bd, +0x0358c2b9, +0x0323d2bd, +0xbdb8417e, +0xb9032bd0, +0xa7037cc3, +0xfd4fff2e, +0x0360d3bd, +0xc130b399, +0xd3bd7424, +0x40e8032e, +0x3fe60282, +0xb49903e2, +0x2fd4bd60, +0x61b09903, +0x0330d0bd, +0xbd62b199, +0x990331d1, +0xdbbd63bb, +0xc4b90332, +0xd4bd0360, +0x4c060345, +0x036cc2d1, +0x0361c1b9, +0x0350d2d5, +0x0368c3d1, +0x0346d1bd, +0x034cd3d5, +0x0370c4d1, +0x0354d4d5, +0x0364cbd1, +0xdbd54027, +0xc0d10348, +0xd4bd0378, +0xd0d50347, +0xc2d1035c, +0xd2d50374, +0xc3b90358, +0xf293037d, +0xbd063d58, +0x990361d3, +0x3027b424, +0x31274486, +0x032cd3bd, +0x27ad2499, +0x27448600, +0xff4ea701, +0x92d1fd4f, +0x41110640, +0x069073d1, +0x03489489, +0x0ad4ad21, +0x2dd0bd03, +0x27310303, +0x9073d540, +0xb072d506, +0x2874bd13, +0x2071d515, +0x4092d515, +0x03480706, +0x9c74d541, +0x9b302706, +0xc4890ef3, +0x4893892e, +0xf95f0ea7, +0x8d430bff, +0xb1274894, +0x01299bbe, +0xfba5a103, +0xfc2ca2f0, +0x391ed127, +0x41834007, +0x25332407, +0x242b4487, +0x35333207, +0x3e23322b, +0xa9fff954, +0xa9030a32, +0x0b030834, +0x8b4e2b42, +0xde41e84f, +0xff4ea7fb, +0x40d5ffff, +0xa1e00698, +0xd027fbe4, +0xf3430d07, +0x34b9f58e, +0x4ce4018e, +0x7efc68ff, +0xc689f998, +0x24cb8922, +0x0306c499, +0xbc030f6c, +0x7364730f, +0x0344c6b4, +0xc1b153b1, +0xf4c534c4, +0x30f0c130, +0x83645489, +0x03330f0c, +0xf930f0c5, +0x00007f01, +0xeef185ff, +0x7e025546, +0x568db2e9, +0x665b8d64, +0xe66054c1, +0xc102704f, +0x46a65854, +0x35072407, +0x34191027, +0x015542e0, +0x3c031103, +0x7ef2900c, +0x0ff6b04a, +0x1ea70230, +0x99feffff, +0xc1890914, +0x8743832e, +0x2b443324, +0x4d43f942, +0x03ff0000, +0x1813e232, +0xdf0ea702, +0x18beffff, +0xf2c10088, +0x27402730, +0x7f2ef930, +0x05ff0000, +0x9df34df4, +0xf35306f4, +0xf453faa4, +0x3001faa4, +0x14014101, +0x00004ed8, +0x02192903, +0x049928c6, +0xff4cc009, +0x0bbf070b, +0x0b43194b, +0x99421d23, +0x4cc00a04, +0x2f070dff, +0x4319420b, +0x320b0219, +0x1c03431d, +0x100c0314, +0x050c1fc4, +0x27c4ff00, +0x07272710, +0x19410b4f, +0x0731e043, +0x88110301, +0xdf0ea7f2, +0x7dbeffff, +0x99890087, +0xff4ea748, +0x4211fd4f, +0x030ad9ad, +0xffff3ea7, +0xbd4b27ff, +0xa1152834, +0xd51b27fd, +0xe4152032, +0xa7fec313, +0xffffff3e, +0x069c34d1, +0xf95f0ea7, +0xd54103ff, +0xbe069c34, +0x5e012800, +0x24c1fea8, +0x004ef874, +0xfd780100, +0x89fd795e, +0xd3ad5893, +0x9489030c, +0xab410358, +0x58948d4f, +0x030ed3a9, +0xfc0643ee, +0xf4933027, +0x8d05f238, +0xf95e5843, +0x5e4027fb, +0x0a7efd05, +0xe70fe6b2, +0xdf0ea7fa, +0x18beffff, +0xc3990087, +0xdf0ea707, +0x3433ffff, +0x9ca03f03, +0x34190006, +0x341d4203, +0x0086dbbe, +0x81fac15e, +0xee4147fb, +0x07fea7b4, +0x33418731, +0x27342b34, +0xfdb10721, +0x06e38432, +0xe0bf6b00, +0xfe95ffbc, +0xf1b14b07, +0x44333b87, +0xf091432b, +0x9ca91bfd, +0x4f030006, +0x0006e384, +0x20874311, +0x23f5210b, +0xff0003d8, +0x24f54421, +0xff0003d0, +0x5e04c199, +0x4147fa65, +0xfef7e4ee, +0xbf6bb107, +0xffdf0ea7, +0x8672beff, +0xffbcc400, +0xfef05eb8, +0x25271527, +0xa7489989, +0xfd4fff4e, +0xd9ad4311, +0x4ea7030a, +0xbdffffff, +0xa1152842, +0x2043d5fd, +0xfeed5e15, +0x069074d1, +0x94994816, +0x61fc9304, +0x42dc05f1, +0x7e080714, +0xc499ae02, +0xa3122704, +0x9d222742, +0x0b1e04c4, +0x27271727, +0x1327b71e, +0x4ea72327, +0x89fd4fff, +0x43114899, +0x030ad9ad, +0xffff4ea7, +0xd5d127ff, +0xbd152043, +0x5e152842, +0x5489fe9f, +0xa8b4ee66, +0xfdae5efd, +0xe0ae1f7e, +0x27fdcd02, +0x5e2b271b, +0x1c27ff7c, +0x5e21070c, +0x0427ff74, +0xda8bf193, +0x84819e00, +0xb09b7e00, +0x0fe60f6b, +0x52c101b1, +0x5453c15c, +0x89645189, +0x23f86654, +0x1703025c, +0x17e34803, +0xed2747e3, +0x0d271000, +0x3cf80fff, +0xf8025220, +0x53025a32, +0x01f84ffb, +0x0d21d8b3, +0x2c832307, +0x0324e67f, +0x322b803c, +0x649b6107, +0x26076433, +0x24c6208b, +0x622b6e0b, +0x14072147, +0x1103239b, +0x02073107, +0x0c833153, +0xe631237f, +0x4701f40f, +0x53411b43, +0x802c0341, +0x0407202b, +0x1007030b, +0xf035029b, +0x2333f431, +0xf245460b, +0x2827f455, +0x89645489, +0x53c1665b, +0x23430358, +0x0343e331, +0x9b4153b1, +0x0bb15313, +0x33b49b12, +0x7051c5b6, +0xf151f031, +0xbc03fb65, +0x0b3103a0, +0x6850c5b1, +0x9b7456c5, +0xafd77eb3, +0x05460f6b, +0xf231f441, +0xb40b422b, +0x0b071b07, +0xe5be2127, +0x50c50084, +0x7eb00760, +0x0f6bafb9, +0x008a0fe6, +0xe65854c1, +0x27fcba4f, +0x75150730, +0x27f325f3, +0x834b07e0, +0x3b071f4c, +0x3c0344e6, +0x07342b20, +0x074e0b43, +0x1f2c8324, +0x4c0324e6, +0x15422b20, +0x83430714, +0x03077f4c, +0x0c0344e6, +0xc1042b80, +0xb0075854, +0xf0313607, +0x4123349b, +0x340b409b, +0xf421f241, +0x320b3b0b, +0x4307340b, +0xe67f4c83, +0x803c0344, +0x4227342b, +0x1325141d, +0xf221f071, +0x0103f361, +0x54c1230b, +0x25f07558, +0x0c1c03f2, +0x04cae60b, +0xfc245e8d, +0xe65854c1, +0x07fc324f, +0x1e102725, +0x0bfb6105, +0x833b07b0, +0x4b071f3c, +0x4c0334e6, +0x51432b20, +0x0b2415f0, +0x83400704, +0x44e67f4c, +0x2b800c03, +0x1d422704, +0x5854c124, +0x11032025, +0xca0c2c03, +0xdf5ecc14, +0x5c52c1fb, +0x895453c1, +0x54896450, +0x8d23f866, +0x03140700, +0xe3180307, +0x2717e307, +0x271000bd, +0xd80fffed, +0xf86b203c, +0x5300bc32, +0x01f69ff3, +0x0d21d834, +0x3c833407, +0x0334e67f, +0x432b804c, +0x319b3007, +0x23073433, +0x24c62e8b, +0x322b3b0b, +0xe09be407, +0x01072e47, +0x42070103, +0x4c830153, +0xe601237f, +0x802c0344, +0x4047242b, +0x4e9b411b, +0x1c831407, +0x0314e67f, +0x412b804c, +0x230b209b, +0xf255240b, +0x20276027, +0xf6351027, +0x495ef245, +0x5b32d8fe, +0xf63ef353, +0x961e3401, +0x11031407, +0x2780bc27, +0x7c5e7fec, +0x1b4347ff, +0x07415341, +0x07130b14, +0x35329b31, +0xfe125ef3, +0xec274103, +0x7f0c2780, +0xd8fdad5e, +0xfb531332, +0xb301f608, +0x53fdb05e, +0x01f5fbfb, +0xfda75eb3, +0xf5fafb53, +0x9e5eb301, +0xe9f353fd, +0x5e3401f5, +0xf353ff45, +0x3401f5e8, +0x4eff3c5e, +0x41fa93fa, +0xa41905ee, +0x012b41e0, +0xffff4ea7, +0x004bb9ff, +0xfc4cc101, +0xcbcabc0b, +0x273b1e10, +0x7cd4fd40, +0x03ff0000, +0x2ebccec1, +0xdc83dc07, +0xf9d3330f, +0x00007cd4, +0x224c83ff, +0x27e142c4, +0x7ed4fd41, +0x07ff0000, +0xf2197e0c, +0xd4fd4027, +0xff00007c, +0xcbcec103, +0x6df493d4, +0x240705ef, +0x07ff2c03, +0x7f2ce334, +0x197f3ce3, +0x803c0334, +0x99f932c2, +0xfd9370a3, +0xc005edcc, +0x3319ff3c, +0xa03f0334, +0x3900069c, +0x2320a734, +0x27343d41, +0x70d29d40, +0x7e74d4c5, +0x0ea7f398, +0xbeffffdf, +0xc100829f, +0x3ea744dc, +0x27ffffff, +0x0034bd40, +0x402d2701, +0xfc3cc501, +0x06943cd5, +0xfc330ea7, +0xbe1027ff, +0x07007539, +0x844d034d, +0x27202701, +0x4205403c, +0xf3c84403, +0xeef7f393, +0x65fd9305, +0x2c2705ed, +0x3d40a710, +0x03341d34, +0xf2a0103c, +0xd63cd4c1, +0x7e002749, +0xd127abd3, +0xd1030d07, +0xc4abca7e, +0x40a7f7d7, +0x0ea73027, +0xc5ffffdf, +0xa49d44ac, +0x74a3c570, +0x008203be, +0xd05efa0e, +0x3ad199ef, +0xed5af093, +0x7e212705, +0x4027ed1d, +0x1e3cd4c5, +0x1d4227c1, +0xe8ee7ea4, +0x4efecf5e, +0x010dd0fe, +0x2c272810, +0x2721030c, +0xcae23be1, +0x3ea7f8e0, +0xd1ffffff, +0x07067834, +0x27e40b02, +0xd5222710, +0x0e06783e, +0x01699efe, +0x0c2c2704, +0x1000ed27, +0xfb4edd1e, +0xb0070419, +0x44c61f6b, +0xfb8e1596, +0x41271b16, +0xfb8eb41d, +0xecaef393, +0x93330105, +0x054a9bf4, +0x2ea74305, +0x93fefdf3, +0x04fa67f3, +0x01304c27, +0x05340330, +0xa8240320, +0x9b4027f4, +0xfb0e0ef4, +0x027b5a9e, +0x7da4f293, +0x6df49302, +0x3127054a, +0xec7afd93, +0x9d420505, +0x0ea705d3, +0xbeffffdf, +0x27008167, +0x7e5a740d, +0xfc93ff5f, +0x050634bc, +0xdf0ea7c0, +0x2dbeffff, +0xc3010081, +0x341d4027, +0x4c034307, +0x2711279c, +0x411d1c2c, +0x4c031103, +0x07f2b09c, +0x732d0323, +0x6c3d035a, +0xff4ea755, +0x43d5ffff, +0x2ce31848, +0x7f3ce37f, +0x3c033419, +0xf932c280, +0xffff4ea7, +0x421d27ff, +0x4844d101, +0x07202718, +0x23420531, +0xb8440311, +0x1b2c27f3, +0xd3c530a7, +0xdad2bd78, +0xffcea70f, +0xc1d5ffff, +0xd2bd1858, +0xd2bd0fd8, +0x40270fd9, +0xc53cd1c5, +0xd1d544d1, +0xd49d1010, +0x18d1bd0d, +0x50c1d510, +0x54c1d518, +0xee717e18, +0x270c4c27, +0xb82d2710, +0x26d49d01, +0x9d24d49d, +0x0ea725d4, +0xbeffe973, +0x27007365, +0x2740000d, +0xbe100720, +0xd500806c, +0x270520c0, +0x000d0321, +0x07372708, +0xf5433342, +0x00052040, +0x032103ff, +0x6808000d, +0xff4ea7f3, +0x43c1fd4f, +0x33202768, +0x40a7103c, +0x9d5bd49d, +0xd29d5cd2, +0x1c3c535a, +0x274635c0, +0x9320000d, +0x063813f2, +0x4c271027, +0x27213513, +0x9dc127e1, +0x402756d4, +0x9d0c249d, +0x332754de, +0x9d0d2c9d, +0xde9d0e21, +0x9d212555, +0x41275dd1, +0xad60d1c5, +0x05482ed0, +0x2cd0ad23, +0x1d2c1548, +0xfe645eb4, +0x10000d27, +0xfb4eba1e, +0xffffdea7, +0x10d499ff, +0xfb8e4486, +0xc027fbab, +0x9b0dfc9b, +0x3ea70efc, +0x11fd8fff, +0xa3012734, +0x0400004e, +0x52be3415, +0x4ea70077, +0x01fd4fff, +0x9d212743, +0xf4930fd3, +0x1d0548cc, +0x10d29d42, +0x9b0fd499, +0x31270efc, +0x43f54487, +0xff02b040, +0xf093fbeb, +0x2705eabc, +0x5efb0e11, +0xfc4efdea, +0xf9b3eea7, +0x34e4c1ff, +0x4606d107, +0xcea7d407, +0xa1fff9b3, +0x484dcac4, +0x3ea7fc8e, +0x99feffff, +0xe2990934, +0x87438324, +0x2b443334, +0x4d41f943, +0x03ff0000, +0x9b120328, +0x0b41271d, +0xa1423b10, +0xca140be3, +0xd1074013, +0x00011fd0, +0xa7c01000, +0xfff9b3ce, +0xdf27c4a1, +0x10000000, +0xa7bad4c2, +0xffffdf0e, +0x007f30be, +0x0ea70976, +0xbeffffdf, +0x07007f3f, +0x7e1d070c, +0x0ea7e860, +0x0effffdf, +0x7f0a9efc, +0x07130700, +0x011ff0d1, +0x7f100000, +0x07bd1eff, +0x0e1d070c, +0xe83e5efc, +0x0000000c, +0x00060000, +0x00001000, +0xf393f54e, +0x0705ea08, +0x4433c1a1, +0x36c6f193, +0xc1f36306, +0xa3a56c14, +0xe9f2f793, +0xc5f0b505, +0x7cc130f2, +0x2542c444, +0x017414d1, +0x991e4cce, +0x0c1b7010, +0x83a8817e, +0x0c40180c, +0x130c2718, +0xf58ef343, +0xe9c6f093, +0x440cc105, +0xffdf0ea7, +0x7eb5beff, +0xa8ac7e00, +0xffff3ea7, +0x093499fe, +0x24874383, +0x422b4433, +0x004d43f9, +0x3403ff00, +0xc3ca300b, +0xdf0ea710, +0x69beffff, +0x0b27007e, +0xf58ef343, +0x2c832c07, +0x3342070f, +0x7c43f943, +0x07ff0000, +0x84ee23e4, +0x3ff6ffff, +0x020700a5, +0x27330a33, +0x0f03022b, +0x0006ab48, +0xc5d404c1, +0x46e6340c, +0xf1934419, +0xd105e954, +0x27102412, +0xcb343b31, +0x2413d532, +0x41f29310, +0x2dd105e9, +0x24d11024, +0x4dab1028, +0x127b41f8, +0x41532027, +0x41dc2103, +0x3b1127fa, +0x07420712, +0x33353332, +0x0b1dab43, +0x15f39343, +0x31d505e9, +0xf3931024, +0x01063168, +0xa7422b31, +0xfd4fff2e, +0x44872311, +0x13c5140b, +0xd401c58c, +0x20a73027, +0xe39d4127, +0x9de33d05, +0xe41d04e3, +0x029de27d, +0xff3ea707, +0x34b9ffff, +0x44b60100, +0x03fc3cc5, +0x0034bd41, +0xdf0ea701, +0x9dbeffff, +0xf493007d, +0xc105e8c0, +0x43994449, +0x8349070a, +0xd4070f4c, +0x4733da33, +0xdf03d42b, +0x0006ab48, +0x93d4d7c1, +0x05e89ffb, +0x3fe6f795, +0xa499033a, +0x104ce00a, +0xb1b90332, +0xf79302c9, +0x2704f2ec, +0x86b2b940, +0xcab0b902, +0x03740502, +0x03741518, +0x5d080321, +0x85b3b971, +0xcbb1b902, +0x05729d02, +0xb2b9707d, +0xb0b902cc, +0x31030288, +0x1b07713d, +0x1d04739d, +0x06729d70, +0x101c1d03, +0x07072827, +0x006facbe, +0xa189c007, +0x0ea08910, +0x8930a289, +0x817e32a3, +0x964127a7, +0xab4027c4, +0xb0b3a940, +0x6cb2c102, +0x44961127, +0x00271027, +0x0127230e, +0x0284b3b9, +0x0709b499, +0x2720ab21, +0x27340e10, +0xab420711, +0xa54fe641, +0x23090700, +0xa6a07e01, +0x0cf804e6, +0x7e11a720, +0x7459edd8, +0xe7e6f093, +0x8402b905, +0x7e49f002, +0x27743911, +0x274200c1, +0x21cd03c0, +0xcdf39380, +0x34c105e7, +0x2df99368, +0x4d830630, +0xb2070100, +0x275893c1, +0x27449681, +0x47b10380, +0x0ea08988, +0x8910a189, +0xae8930a2, +0x2f3bee32, +0xed8a7e11, +0x3002f293, +0x19372706, +0x1941e024, +0x0c2c0311, +0x94c1f3a0, +0xd54bee58, +0xa6fb7e10, +0xc55c98c5, +0x9cc5589b, +0x75f09354, +0x711105e7, +0x02b004a9, +0x02b97701, +0x01d50284, +0x04c51020, +0x1c07d56c, +0x09029d10, +0xe756f793, +0xb9402705, +0x9d028570, +0x74b90a74, +0x709d0286, +0x36749d35, +0x028a70b9, +0x028b74b9, +0xe736f393, +0x37709d05, +0xb938749d, +0xd1028c70, +0xa902c074, +0xa902ac32, +0xb902b031, +0x9d028d33, +0x74c53970, +0xe6129b40, +0x0704f43f, +0x33420732, +0x0b443338, +0x0b844743, +0x45810b41, +0x93402774, +0x05e6f7f7, +0xffdf0ea7, +0x5474bdff, +0x7be5be48, +0xff2ea700, +0x29d1ffff, +0xc7070680, +0x0f289ff6, +0x02b273a9, +0x02ac7ca9, +0xbd104c27, +0xbd184024, +0x9b184529, +0xdf0ea7c3, +0x95beffff, +0xf093007b, +0xd105e6b8, +0xd102c001, +0xa902bc04, +0x0b02b802, +0xf81d0314, +0xa9120b07, +0xd102ae03, +0x8702c402, +0xd50c5533, +0x0b485802, +0x018df013, +0x270fce10, +0x31030c3c, +0x433b4127, +0x6bf848ca, +0x79f7933f, +0x745105e6, +0x0724739d, +0x074c023c, +0x013df034, +0x270e9410, +0x21030c2c, +0x423b4127, +0x07f843ca, +0x934f6b42, +0x05e653f0, +0xf025049d, +0x7010011d, +0x0c3c270e, +0x41273103, +0x41ca433b, +0x6b4307f8, +0x35f1934f, +0x149d05e6, +0x24149926, +0x270c4c14, +0xf2930c4c, +0x9905e624, +0x249d2521, +0x0c1c1424, +0x930c1c27, +0x05e613f3, +0xe60ef793, +0x9a32a905, +0xcb74b902, +0x9833a902, +0x9b422302, +0xff2d0323, +0x25719d03, +0x2a534f6b, +0x0e3742f0, +0x320b3247, +0xf0933153, +0xb905e5e4, +0x07029302, +0xc901b9b0, +0x27259602, +0x04bd104c, +0x2c270293, +0x03430710, +0x9b435347, +0x99430b41, +0x429b24b0, +0x203b2127, +0x4553e207, +0x32274a33, +0x2325b199, +0x07e40be1, +0x3b413b43, +0x0b201330, +0x02e28b43, +0x07e4074e, +0x7e00271e, +0xbca9fade, +0xb2a902ac, +0xc30302ba, +0x7fff4ea7, +0x03c3e3d0, +0x274381c8, +0x28b28d40, +0x9b34b49d, +0x273c2ac2, +0x34b49d41, +0xea30b4c1, +0xb90d794c, +0x9d0287b1, +0x0d0707b1, +0xe55af293, +0x47dd0305, +0x03302702, +0xa702000d, +0x4c23c540, +0x074a248d, +0xe32d0730, +0xdd237f2c, +0x3ce30247, +0x0334197f, +0x32c2803c, +0x30f2c1f9, +0xb1be1a07, +0x1d070274, +0x01201d03, +0x11230d07, +0x07d80c03, +0xe3300721, +0x11037f2c, +0x197f3ce3, +0x803c0334, +0x93f932c2, +0x05e503f3, +0x02d439d1, +0x07122c27, +0x03300749, +0x47010c4c, +0x37054403, +0xf2a83403, +0xe4e6f293, +0xd420d105, +0x6703b902, +0xe6318301, +0x03025d3f, +0x0701e7dd, +0xe331072d, +0xdd237f2c, +0x3ce301e7, +0x0334197f, +0x32c2803c, +0x074007f9, +0x544c0331, +0x01322c27, +0x05440347, +0xa8340337, +0xa5f193f2, +0x14d105e4, +0x44d102d4, +0xd4d5017c, +0xd48901e8, +0xdf4d832a, +0x2ad48dff, +0x89a4bd7e, +0xd0bd14ab, +0xbcf40360, +0x27017f21, +0x60d4bd40, +0x61d4b903, +0x0a4fe603, +0x27462702, +0x09a49d10, +0xe608a499, +0x93015a4f, +0x05e45ff7, +0x02d473d1, +0x34d10027, +0x20270164, +0x00004f1c, +0x21270800, +0x41c34207, +0x4486418b, +0x40070127, +0xd4bd4f6b, +0x4fc601ec, +0x2c34b969, +0xedd4bd01, +0x5e4fc601, +0x2d071307, +0xa3890027, +0x3014a912, +0x07430201, +0xad455343, +0x8901ee24, +0x14a912a3, +0x43020132, +0x4c034307, +0xad45531f, +0x8901f024, +0x14a914a3, +0x43020134, +0x45534307, +0x01f224ad, +0xa914a389, +0x02013614, +0x03430743, +0x45531f4c, +0x01f424ad, +0x01edd3b9, +0x18030103, +0x03ca2803, +0xc9f093aa, +0x03d105e3, +0xc00702d4, +0x016434d1, +0x00004ff8, +0x01750200, +0x011c34b9, +0x3076f193, +0xa7202706, +0x1b149d30, +0x02b413d5, +0x02a312bd, +0xbd19149d, +0x9d02a012, +0x41271a14, +0x037dd4bd, +0x7608a399, +0x20d4b935, +0xff4ce001, +0xd1c101a7, +0xb19351e8, +0x079461f7, +0xc5285321, +0x31074073, +0xc5303c83, +0x21834474, +0x24c63453, +0x33833203, +0x49534107, +0x240e4183, +0xf0b134a3, +0x7e95039d, +0xd0d5a3b5, +0xf193033c, +0xb905e344, +0x89485411, +0xd1bdf0d4, +0xd4c5037c, +0x024de030, +0xf40b5011, +0xc711034d, +0x824de000, +0xf40a4801, +0x1201834d, +0x024de001, +0xf40b4a01, +0x1a01034d, +0x4b41e001, +0x27ff1e0c, +0xecd4bd40, +0xff375e01, +0xfe870fe6, +0xd5a3377e, +0x07036cd0, +0xa3387ec0, +0x1c031b07, +0xd515731f, +0x070368d0, +0x27021441, +0x07100202, +0x07c10b10, +0x70dcd504, +0x68d1d503, +0xa675be03, +0x64d0d500, +0x08a49903, +0xf29345d6, +0xc105e2c0, +0x23d54423, +0xf4934850, +0xd105e2b4, +0xd1485043, +0xd50370d1, +0xc10378d3, +0x41074440, +0x032b4123, +0x992d04c2, +0x492608a4, +0x32be012b, +0xd4d100a6, +0xd0d50368, +0x40c20374, +0xbd412717, +0x5e0361d4, +0x4027fe0d, +0x0120d4bd, +0x0124d3bd, +0x27fdd95e, +0x61d4bd40, +0x5e112703, +0x4de0fdfc, +0x098f3104, +0x31054df4, +0x4de000cd, +0x0bc91121, +0x11224df4, +0x4de000b2, +0x0bb71104, +0xb9ff385e, +0x27016431, +0xa28a7e00, +0x02d4c4d1, +0x41b90127, +0x7d7e0165, +0xd4c4d1a2, +0xb9022702, +0x7e016641, +0x8b5ea270, +0x034107fe, +0x8407404c, +0x840b8153, +0x125e7445, +0x814de0fb, +0xd4093202, +0x1902824d, +0x02014de0, +0xee5e0a34, +0x044de0fe, +0xe00a3601, +0x2a01214d, +0xfedf5e0a, +0x03014de0, +0x4de00b50, +0x0b440321, +0x93fed05e, +0x05e1d7f2, +0x02d423d1, +0x34d1c207, +0x4ff60120, +0x31b9fe4a, +0x00270164, +0xd1a20f7e, +0x2702d4c4, +0x6541b901, +0xa2027e01, +0x02d4c4d1, +0x41b90227, +0xf57e0166, +0xbd4027a1, +0x5e037dd4, +0x4de0fe1e, +0x0b191201, +0x21044de0, +0x825e0b0d, +0x024dc0fe, +0x4d341d80, +0x4de08003, +0x08b58001, +0xe0fe705e, +0x9480214d, +0x224de008, +0x5e088880, +0x4c27fe61, +0x5ad4bd15, +0xe9f99303, +0x943905e0, +0xd4894566, +0x104ca32a, +0x272ad48d, +0x40d4bd40, +0x0c929903, +0xe146f793, +0x38d2bd05, +0xa1c37e03, +0x0339d0bd, +0xe136f393, +0x6833c105, +0x0210d4a9, +0x035cd3d5, +0x0334d4ad, +0x89547799, +0xd7bdead4, +0xfb930337, +0x83062dd0, +0xbdb30141, +0xe00336d4, +0x34065f32, +0x0d31c033, +0x33e0ff1e, +0x34e00813, +0xf51e0809, +0xbd424c27, +0x990345d4, +0x45a60db4, +0x2da2f493, +0xe0430106, +0x9908bd31, +0xd1a90cb0, +0xd0bd020e, +0xb0210342, +0x0210dca9, +0x061b0fe6, +0x419b4c07, +0x061340e2, +0x010b0123, +0x00a466be, +0xd0ad0fab, +0x0cce0334, +0x0701030b, +0xad41e340, +0x930334d4, +0x06298bf4, +0x025f44b9, +0xd4bd0d07, +0xbb990359, +0x57dbbd0f, +0xba7e7e03, +0x8912a489, +0xf1932ad2, +0xb105e088, +0x0e128df3, +0x021cd4d5, +0x137d3359, +0x8d12a489, +0xa7891ad4, +0x6df49314, +0xd78d05e0, +0x16a0891c, +0x891ed08d, +0xf09318a1, +0x8d05e05c, +0xa28920d1, +0x22d28d30, +0x8d32a389, +0x449924d3, +0x9d302735, +0xa4990fd4, +0x27449636, +0x06d39d31, +0x27370799, +0x43d7bd40, +0x0cd49d03, +0x810bd49d, +0x84d1c5a1, +0xd2c5a291, +0xc5a3a188, +0xa4998cd3, +0x04d49d0a, +0x9d0ca799, +0xa1b105d7, +0xb13cd1c5, +0x38d2c5a2, +0x990ba399, +0x33470aa4, +0x340b4183, +0x4f6b4307, +0x9910d49d, +0x1cdc5a01, +0xd2992440, +0x1e24d804, +0xc35b0399, +0xd034ee41, +0x5c039907, +0x35664027, +0xd4994526, +0xc341838a, +0x1e4f6b41, +0x9d402703, +0xa39916d4, +0x9d40a737, +0xd49d08d3, +0x38a49909, +0xd49d3027, +0xb1f7b111, +0x4f7799f0, +0x0356d7bd, +0x42e00459, +0x430705da, +0xd49d41c3, +0x95f19312, +0x118905df, +0x8df2b128, +0xa3892cd1, +0x85f79310, +0x238d05df, +0x0ea4892a, +0x248d77b1, +0x04d09928, +0x9dd0d7c5, +0x30271820, +0xd499a315, +0x32a28904, +0x41834253, +0x2c03245b, +0x8342071f, +0xd3b91f4c, +0x4c130343, +0x4df09320, +0x102705df, +0x11273402, +0x4227230b, +0xd49d3127, +0x17d19d14, +0x0715d39d, +0x99455342, +0xd48d0b03, +0x463ff62e, +0x8d402702, +0xd38d62d4, +0x0ea18964, +0x02d402d1, +0xc162d18d, +0xa3894400, +0xa424b910, +0x34d0c501, +0xe664d38d, +0xb905e54f, +0x9d019c22, +0xf49380d2, +0x9905def8, +0xdbc10744, +0xdf0ea734, +0xd599ffff, +0xbef4a510, +0x070073df, +0x0f2c832b, +0x72072333, +0x7e234027, +0x27ffff84, +0x7e23fd33, +0xfdff0000, +0x00007f25, +0x8224fdff, +0x03ff0000, +0x99743d76, +0x150737a0, +0xa499f065, +0x6501830c, +0x997623f0, +0x449607d6, +0x21fd05a6, +0xff00007f, +0x09ff6ce0, +0x07d69d05, +0x9c6056fd, +0x74190006, +0x42a3423c, +0xf293741d, +0x6105de84, +0xe6c20724, +0x9904d74f, +0x2fe680d2, +0xd3890109, +0x64d48962, +0x056c21fc, +0x3027439b, +0xf3751487, +0x049d22fc, +0x04473027, +0x24fcf385, +0xd489053f, +0x1cd3891a, +0x030f4c03, +0x34730f3c, +0x349b4473, +0xb1078027, +0xb00bb303, +0xb3e3b30b, +0xcb0bcb47, +0x1000cd14, +0x1000cd27, +0xe7af4ea7, +0xe64001ff, +0x1105d00f, +0x30c4c244, +0x05c70fe6, +0x06be1c07, +0x40070072, +0x9ea74c26, +0x07ffe7af, +0x051b070c, +0xbe9c1594, +0xab00a1a3, +0x110c080f, +0x27100c27, +0x23403b41, +0x27942541, +0xafeea730, +0x2c27ffe7, +0x21112710, +0x3b4107e0, +0x8bc30743, +0x96cf6b40, +0x58310346, +0xdf0ea7f2, +0x9dbeffff, +0x08270072, +0x07f4335e, +0xc02f4b2c, +0xffffff2f, +0x123be8ff, +0x41eb4007, +0xe7af3ea7, +0x993425ff, +0x330180d1, +0x320b2b9b, +0x056f11f8, +0xd4c54307, +0x5f12fc68, +0xc5402705, +0x14fc6cd4, +0x3027054b, +0xd3c5f271, +0x34d4c170, +0xd2c5f381, +0x78d3c574, +0x9d7cd8c5, +0xd4c560dc, +0x2741275c, +0x04749d30, +0x9905739d, +0x44c60ca4, +0x04d6f0a1, +0x16a6f161, +0x46873607, +0x430b3433, +0xdd62f293, +0xd442f505, +0x59ff0003, +0x5d412374, +0x36a39974, +0x03853ff6, +0xfc04d499, +0xc3037744, +0x6056fd51, +0xa700069c, +0xffffdf0e, +0x0071f7be, +0xdd1af293, +0x07226105, +0x900c030d, +0x0744d2c5, +0x09f39320, +0xd00705dd, +0x2ce34127, +0x0b349d7f, +0x0790dc23, +0x03341932, +0x32c2803c, +0x31f193f9, +0x2c2705de, +0x6c6ebe40, +0x10a48902, +0xd48df0b1, +0x0ea78928, +0xdcd6f293, +0x26d78d05, +0xdbc10079, +0x0dd09d44, +0x0b07f1b1, +0x93041199, +0x05dcbff7, +0xc10ed19d, +0xac014023, +0xc110a489, +0xc30b30f2, +0x1a074487, +0x2dbec40b, +0xa901026c, +0x4c0b4b07, +0xd4c59b0b, +0x4cd9c550, +0xdc92f393, +0x24339905, +0xdc8af193, +0x58d39d05, +0x03267799, +0x9d03fccd, +0xf0b15ad7, +0x3b071161, +0x3c0b0485, +0xd3c54105, +0x69f29354, +0x229905dc, +0x9d4d0725, +0x039559d2, +0xcd033007, +0x3c0303fc, +0x5c4c0370, +0x47012927, +0x37054403, +0xf2a83403, +0xb180d299, +0x3df393f1, +0x129d05dc, +0x48dcc594, +0xd15ad299, +0x2702bc34, +0x3b4c0b31, +0x0b342b32, +0x10a289b4, +0xdc1ef493, +0x854b7505, +0x07268643, +0x27102729, +0x89240540, +0x110310a3, +0x13da2403, +0x9b4027f3, +0xd0b90ef4, +0xf7b10337, +0xdbf6f193, +0x1d709d05, +0xe60c1499, +0xb101504f, +0x34d2c1f1, +0x5544d3c1, +0x3019c512, +0xa49913b5, +0xd5f09308, +0x149d05db, +0x09a79919, +0x991a179d, +0x109d2400, +0xc1f1931b, +0x12d105db, +0x2df04858, +0x03a31001, +0x030c3c27, +0x3b412731, +0xf842ca43, +0x4f6b4307, +0x270c4c14, +0x4f6b0c4c, +0xf393f2b1, +0x9d05db98, +0x34411c24, +0xdb8ef793, +0x51242505, +0x3c23c177, +0xd4d52735, +0x2031034c, +0xdb7af193, +0x50d0d505, +0x08339903, +0xd3bdc107, +0x14c10354, +0x0f4c8344, +0x24073407, +0x34332833, +0xf293320b, +0x2b0623b4, +0x87240134, +0x08a29933, +0x32bd340b, +0xaa9911ac, +0xbd202709, +0x8911ad3a, +0x45532ad4, +0x34bd4183, +0xd49911af, +0xb432d505, +0xae34bd11, +0xd5f7b111, +0xc111b032, +0xd3c13c74, +0x28449930, +0x0355d4bd, +0x9d341099, +0x31c018d0, +0x9b7c7e66, +0xd0ad0fab, +0x07660332, +0xad58c189, +0x890330d1, +0x410358c4, +0xc48d4fab, +0x32d3a958, +0xce34ee03, +0xe5f29302, +0x249905da, +0xe3312704, +0x04249d42, +0x817e231d, +0x71f9bee2, +0xff4ea700, +0x4211fd4f, +0x3027f491, +0x43c50027, +0x9042c568, +0xc55043c5, +0x295e5843, +0x34dcadf1, +0xfa055e03, +0x5e4d4c27, +0x0d07f9b3, +0xc6e1c67e, +0x115e940f, +0xdf0ea7f1, +0x90beffff, +0xd2c1006f, +0x83012734, +0x23330f2c, +0x007c24f9, +0x1d07ff00, +0x24fd44a3, +0xff00007c, +0xc110d399, +0x315338d4, +0x1c03033b, +0x2704ab90, +0x11cc27e0, +0x4e3b4127, +0x4cc6408b, +0x4cc01419, +0x44331dff, +0x9b1c4f03, +0x42b90006, +0x43b90185, +0x21030184, +0x43bd3103, +0x42bd0184, +0x14390185, +0x1dff4cc0, +0x4f034433, +0x00069b1c, +0x018542b9, +0x018443b9, +0x31032103, +0x018443bd, +0x018542bd, +0x1203e103, +0x99aefcf0, +0x4cc007d4, +0x34872fff, +0x340b4433, +0x03cc34f1, +0x4ee3ff00, +0xa3030000, +0x0200004e, +0x03cc34f5, +0xd4c1ff00, +0x34d79944, +0x03d434f5, +0x37fdff00, +0xff0003cc, +0xffdf0ea7, +0x6eaebeff, +0x93412700, +0x05d9cff0, +0x5e0c049d, +0x3127fddf, +0x47fa255e, +0x85040744, +0xfb645ef4, +0xf616d499, +0xc3fc8e4f, +0xfd40a751, +0x069c6054, +0xfc815e00, +0x07262099, +0xbe20271b, +0x6503ee2b, +0x1c0ff6c0, +0xfbc75efb, +0xdb12f393, +0x27202705, +0x330ea7e0, +0x1c27fffc, +0x83040110, +0x0300004e, +0x21034836, +0x863722d4, +0x03ea9624, +0x3c03140c, +0xa7f12810, +0xffffdf0e, +0x006e37be, +0xcd5e0727, +0x004ec4ef, +0x19de0300, +0xd94fd634, +0x4e833421, +0xc4ffff00, +0xffff004e, +0x1ee103cc, +0xa71027c8, +0xfffc33ee, +0x01100c27, +0x002e83e2, +0x2fc60300, +0x03110365, +0xf07014ec, +0x9999ba1e, +0x80d99d55, +0x89fa1d5e, +0xd4891cd8, +0x0f8c031a, +0x730f4c03, +0x9b447384, +0x5e380784, +0x439bfac2, +0x10070487, +0x955ef075, +0x6e4c27fa, +0x27f7fa5e, +0xf45e644c, +0x164c27f7, +0x27f77c5e, +0x765e144c, +0x104c27f7, +0x27f7705e, +0x6a5e0f4c, +0x1b4c27f7, +0x27f7645e, +0x5e5e134c, +0x6b6107f7, +0xff6ce06f, +0x1607ff57, +0x36871433, +0x34f1310b, +0xff0003cc, +0x03d432f5, +0x4ee3ff00, +0xa3030000, +0x0100004e, +0x03cc34f5, +0xd499ff00, +0x1c1f0304, +0xfd00069b, +0x0003cd34, +0xf54027ff, +0x0003d834, +0xbd20a7ff, +0xbd018e12, +0xf1018d12, +0x0003cc34, +0x004ee3ff, +0x34f50400, +0xff0003cc, +0xed30a089, +0x0003dc30, +0x32a189ff, +0x03de31ed, +0xba5eff00, +0x270c07f9, +0xa000001e, +0x11be2027, +0x4007006d, +0x71fa335e, +0x0bf181f0, +0x5e310b30, +0xf471fab0, +0xa05e430b, +0x5e4027fa, +0x0427fa92, +0xc1f1f193, +0x6ba99e00, +0x8d402700, +0x2e5e58c4, +0x0c4c27fd, +0x07fc735e, +0x8342cb41, +0x2a41e445, +0x5c0399f8, +0x2705d499, +0x27340e20, +0xc3420721, +0x5e418341, +0xb0b1f81a, +0xd47e1c07, +0xc5b0b597, +0x7c5e30bc, +0x0c4c27f2, +0x27f6745e, +0x9e5e0c4c, +0x0c4c27f1, +0x27f17a5e, +0xf6635e4b, +0x5e5e4227, +0x0d4c27f6, +0x27f6585e, +0x525e184c, +0x5e3247f6, +0x2c7ef1ce, +0xae74a998, +0x27734102, +0x27049621, +0x3b439b20, +0x33040742, +0xbe1a2703, +0xa7009b3f, +0x07302740, +0xacc6a95f, +0x55f42502, +0x15f405f3, +0x45f335f4, +0x000e03f3, +0xb9070400, +0x5c03c027, +0x72cee90c, +0x0700019b, +0x9b4c0b45, +0xf04e05e6, +0x261001ed, +0x45f15301, +0x271301ed, +0x07310371, +0xca433b47, +0x3f6bf64e, +0x6f113cd0, +0x24271307, +0x200b213b, +0xffff2ee3, +0x002e3403, +0xf3530600, +0x3201ed20, +0x4c0b4f07, +0xc3f94205, +0x00019b70, +0xc4032942, +0xaa0cccc4, +0xf401b207, +0x01094be2, +0x4be2f411, +0xf42100ff, +0x00e64be2, +0xd706f493, +0x5443bd05, +0xff4ea748, +0x42b9ffff, +0xf7931845, +0x5505d6f4, +0x2721837e, +0xbdce0738, +0xd5184043, +0xbd06804b, +0x5e184542, +0x2e07f019, +0x47072253, +0x2e0b1307, +0x24d2433b, +0x07310386, +0x5e1f6b13, +0x4027ff7e, +0x27f5585e, +0x3e5e0c3c, +0x272027f0, +0xed8f5e11, +0xee5494c1, +0x93ef28c4, +0x061f0ff4, +0xee5c43c1, +0x5eef1c83, +0x4c27ef1c, +0xf52f5e11, +0x2a5e4127, +0x194c27f5, +0x27f5245e, +0x1e5e0e4c, +0x1a4c27f5, +0x27f5185e, +0xf5135e4a, +0x5e100c27, +0x94c1ece8, +0xcec4ee54, +0x7e3e07ee, +0x0fe695b8, +0xc25eeeed, +0xf47479ee, +0x93ee8049, +0x04e0bbf4, +0x32c04339, +0x01cd270e, +0xee7b5e80, +0x5e0f0c27, +0xcd27ecb8, +0x6e5e8002, +0x21f153ee, +0x012e07ec, +0x21f75313, +0x012253ec, +0x072e0b74, +0xff585e13, +0x33873227, +0x430b4f07, +0x33f94e31, +0x00019b70, +0x27ff0b5e, +0x27ec1e31, +0x4ee81e30, +0x000e27fb, +0xf67e0200, +0xb3bea79b, +0x4827fff9, +0x0524b49d, +0x001e27b0, +0x0b070200, +0x99d3437e, +0x0b0724bc, +0x1c07c603, +0x27966d7e, +0xb54c3b41, +0x4efb8eb4, +0xff4ea7fd, +0x43b9ffff, +0xd007152c, +0x93673fd6, +0x04e87bf1, +0x4d273327, +0x132507e0, +0x1c031405, +0x0331070c, +0x21074f1c, +0xe37f3ce3, +0x1c237f2c, +0x0334195b, +0x32c2803c, +0x27d8c6f9, +0x1415544c, +0xf3930d07, +0x2704e854, +0x0101144c, +0x31050403, +0xf4a83403, +0xe836f093, +0x9efd0e04, +0x270060a2, +0x93141544, +0x04e833f3, +0x4c272027, +0x03320514, +0x1ef4c834, +0x5ef093e0, +0xa6be00bf, +0x901e0065, +0x4ea7fd4e, +0xb9ffffff, +0xf6152c43, +0xa700893f, +0xfeffff3e, +0x27093499, +0x07438310, +0x87d433d4, +0x23d42b44, +0xffffb4de, +0xffd70ea7, +0x070479ff, +0x4b310331, +0x4823874f, +0x83041940, +0x5114ce43, +0x002824f1, +0x4ea3ff00, +0xf5800000, +0x00002824, +0xc41307ff, +0x69bed834, +0x31270099, +0x1904d39d, +0x033027d4, +0x9bd41d41, +0x4ea70ef3, +0xc5fd4fff, +0xf39b3843, +0xff4ea70e, +0x4399ffff, +0xbf2ea70e, +0x3138fd4f, +0x24054127, +0x24033153, +0xfd8e32d6, +0x31033107, +0xf093bc1e, +0xbe00bed0, +0x5e006505, +0xfd4eff6f, +0xffff4ea7, +0x2c43b9ff, +0xf6d00715, +0x8900ec3f, +0x4fe608d4, +0x49f400da, +0xd43100cb, +0xfffe4ffc, +0x00b6ffff, +0xf40ad489, +0xa201004d, +0x98eebe00, +0xd70ea700, +0x0439ffff, +0x432b0319, +0x397143cc, +0x08de8901, +0x0339d431, +0x330ad289, +0x3103104c, +0xab0fec83, +0x33033de4, +0xab138328, +0x791187e2, +0x2c1ef504, +0x27ff0000, +0x8345f631, +0x4e070fec, +0xff804fa3, +0x047dffff, +0xf49b4027, +0xff2ea70e, +0x24c5fd4f, +0x013ba638, +0x9b402722, +0x3ea70ef4, +0x99ffffff, +0x31270e34, +0x34cb323b, +0x4fbf2ea7, +0x273138fd, +0x53240541, +0x03354631, +0x27f31e24, +0x93c61e30, +0x05d337f3, +0x03433499, +0x43349d41, +0x0127fd8e, +0xbedcf193, +0x67719e00, +0x93042700, +0x00bea8f1, +0x0067669e, +0xf1930427, +0x9e00be79, +0x2700675b, +0x46f19304, +0x509e00be, +0x04270067, +0xbe0df193, +0x67459e00, +0x89013100, +0x03890a02, +0xd2f09308, +0xf6be00bd, +0x045e0063, +0xa7fb4eff, +0xffffff4e, +0x152c43b9, +0xb007f123, +0x3fd6d107, +0x930f0765, +0x00beabf1, +0xbe102c27, +0xe6005b0e, +0x35fc93dd, +0x4d2704e6, +0x3c2707e1, +0x15c40584, +0x07cb25c3, +0x5d9cbe0d, +0x03200700, +0x0ccc0321, +0x43273f07, +0x34033101, +0xc403c105, +0x3459f4a8, +0x1d073309, +0xc30dc45d, +0xe619f093, +0x5accbe04, +0xf5f09300, +0x63be04e5, +0xf103005e, +0xfd93fb8e, +0x1e00be4f, +0x31f093ad, +0x72be00be, +0x921e0063, +0xcea7fa4e, +0xb9ffffff, +0x23152cc4, +0xf6d007f8, +0x9905314f, +0x4ff626c4, +0xdc21051f, +0x08030d07, +0x1a3fcce0, +0x40ccd003, +0x4ecce042, +0xccd0032c, +0xcce0774f, +0xf002af56, +0x010757cc, +0x2159cce0, +0x5accf403, +0xcce0032b, +0xe001a757, +0x016b58cc, +0x091bcce0, +0x1cccf406, +0xc3e0054d, +0xcce005e7, +0x93018114, +0x00c193f1, +0xcce0381e, +0xd002df23, +0xe06024cc, +0x02422dcc, +0xa92eccf0, +0x32cce000, +0xccf401e5, +0xe003b333, +0x01a92ecc, +0xc12fccc4, +0x4007d031, +0xf0334c03, +0x0109674c, +0xbea0f193, +0x7e0c0700, +0x791efed9, +0x5247cce0, +0x48ccf002, +0xcce000b4, +0xf4016e4a, +0x034f4bcc, +0x5448cce0, +0x49ccc401, +0xf0d3318c, +0x93052d32, +0x00c099f1, +0xcce0d01e, +0xf0020310, +0x00ad11cc, +0xa613cce0, +0x14ccf401, +0xcce00391, +0xe401e311, +0xff6212cc, +0x057ed031, +0x07dc2196, +0xa61fd610, +0xffff4ea7, +0x2c43b9ff, +0x4d3ff615, +0xcdf49304, +0x3d2704e4, +0x242707d3, +0x43050407, +0x4c254215, +0x005d2dbe, +0xfa8ef803, +0xf227cce0, +0x28ccf401, +0xcce00282, +0xe400d824, +0xff1a26cc, +0x21940b7e, +0x1e1007dc, +0x51cce0b9, +0xccf40164, +0xe0035d52, +0x01524fcc, +0xfd50cce4, +0x0cd399fe, +0xd14ef493, +0x60439d05, +0x991edc21, +0xa442cce0, +0x43ccf401, +0xcce0037f, +0xe4012040, +0xfeda41cc, +0xf493d231, +0xc505d12c, +0xdc214042, +0xe0ff775e, +0xf4019cc4, +0xe0024ec5, +0xe401a0c1, +0x31febbc2, +0x92c57ed0, +0x1007dc21, +0x7eff585e, +0x2007a9b8, +0x42072f6b, +0x04ce4f4b, +0xb7f1931b, +0xea5e00bd, +0x93d331fe, +0x05d0ebf4, +0xc546438d, +0xdc214843, +0x93ff335e, +0x061e1bf4, +0x439d3127, +0xa542bd69, +0xa243bd02, +0x5edc2102, +0xd331ff1c, +0x051332f0, +0xc078f193, +0xfeb35e00, +0xf493d231, +0x27061df4, +0xb042d531, +0x69439d02, +0x02ac43bd, +0xf55edc21, +0x93bd7efe, +0x1007dc21, +0x99fee85e, +0xf4930cd3, +0x9d05d090, +0xdc215843, +0x89fedb5e, +0xf4930cd2, +0x8d05d080, +0xdc215a42, +0x31fecb5e, +0x034007d0, +0x4cf4334c, +0x7efe5f67, +0x2007a91c, +0x42072f6b, +0x40ee4f4b, +0xf493ff65, +0x27061d98, +0x69439d31, +0x02a442bd, +0x02a143bd, +0x995edc21, +0x41fc93fe, +0x0c0705d0, +0x0c031d07, +0x0c1c031e, +0xbe102c27, +0x27005832, +0x1cc49d41, +0x795edc21, +0x7ed031fe, +0xdc219317, +0x6a5e1007, +0x93d331fe, +0x05d013f4, +0x213c43c5, +0xfe5e5edc, +0xbc1ef193, +0xfdfb5e00, +0x930cd299, +0x05cffbf4, +0x2161429d, +0xfe465edc, +0x4007d031, +0xf0334c03, +0x0315674c, +0xbc2cf193, +0xfdd75e00, +0x4f7ed031, +0x07dc21cd, +0xfe235e10, +0x097ed031, +0x07dc21cd, +0xfe175e10, +0xf493d231, +0x27061d00, +0xa842d531, +0x69439d02, +0x02a643bd, +0x015edc21, +0xf0d331fe, +0x93027438, +0x00bde0f1, +0x31fd985e, +0x8239f0d3, +0x41f19302, +0x8a5e00bd, +0x7ed031fd, +0xdc219265, +0xd65e1007, +0x7ed031fd, +0xdc219368, +0xca5e1007, +0x7ed031fd, +0xdc21919c, +0xbe5e1007, +0x93d231fd, +0x05cf67f4, +0x213842c5, +0xfdb25edc, +0x647ed031, +0x07dc2192, +0xfda35e10, +0xbfb1f193, +0xfd435e00, +0x3cf0d331, +0x93021f20, +0x00bc4df1, +0xc0fd345e, +0xd01e5bcc, +0xe4295bcc, +0xfcd65ccc, +0xf293d431, +0x2705cf28, +0x6824c531, +0x2166239d, +0xfd6e5edc, +0xf493d231, +0xc505cf14, +0xdc215042, +0x31fd5f5e, +0x05f493d3, +0x43c505cf, +0x5edc214c, +0xccc0fd50, +0xccd01629, +0xcce41a29, +0x31fc972a, +0x90bd7ed0, +0x1007dc21, +0x93fd345e, +0x00bc1bf1, +0x31fcd45e, +0x92687ed0, +0x1007dc21, +0xc0fd205e, +0xc6d014c6, +0x6dc9e41d, +0x7ed031fc, +0xdc21911c, +0x0a5e1007, +0x7ed031fd, +0xdc2190c4, +0xfe5e1007, +0x7ed031fc, +0xdc219045, +0xf25e1007, +0x4ccc40fc, +0x194dccd0, +0xbd82f193, +0xfc8b5e00, +0x930cd289, +0x05ce8bf4, +0x215e428d, +0xfcd65edc, +0x930cd389, +0x05ce7bf4, +0x215c438d, +0xfcc65edc, +0x1c38ccc0, +0x273eccc0, +0x0d33cce4, +0x07d331fc, +0xf0412343, +0x93011348, +0x00bbb2f1, +0x31fc4c5e, +0x340cf0d0, +0xf1930165, +0x5e00bb32, +0xd331fc3d, +0xce3ef493, +0x3443c505, +0x895edc21, +0x1accc0fc, +0x22ccc016, +0x19cce41e, +0xd031fbd0, +0x2191817e, +0x5e1007dc, +0xd031fc6d, +0x2191927e, +0x5e1007dc, +0xd031fc61, +0x2190787e, +0x5e1007dc, +0xccc0fc55, +0xccd02253, +0xcce42e53, +0x93fb9f54, +0x05cdf3f2, +0x31442499, +0x704fc6d3, +0x936d3fc6, +0x00bd06f1, +0x99fbd85e, +0xf4930cd2, +0x9d05cdd8, +0xdc216342, +0x99fc235e, +0xf4930cd3, +0x9d05cdc8, +0xdc216243, +0xc0fc135e, +0xd01d44cc, +0xe42744cc, +0xfb5a46cc, +0x39f4d331, +0xf493023f, +0x8d05cda8, +0xdc215643, +0x31fbf35e, +0xff32f0d3, +0x15f19300, +0x8a5e00bb, +0x8df293fb, +0x249905cd, +0x4bd33164, +0x934d064f, +0x00bb8df1, +0x9dfb745e, +0xdc216423, +0x27fbc75e, +0x4ff19304, +0x6c9e00b9, +0x01110061, +0x03310221, +0xb906f093, +0x5e1fbe00, +0xfac15e00, +0xbd9af093, +0x5e13be00, +0xfbab5e00, +0xcd46f493, +0x2e439d05, +0x915edc21, +0x46238dfb, +0x895edc21, +0x933783fb, +0x05cd2ff4, +0x2155439d, +0xfb7a5edc, +0xcd22f493, +0x2f439d05, +0x6d5edc21, +0x15f293fb, +0x249905cd, +0x664f4b64, +0xeaf1934e, +0xfe5e00ba, +0x2bcce0fa, +0xccc0008e, +0xcce4792c, +0x31fab21c, +0x21f493d3, +0x4325061a, +0x3d5edc21, +0x9ad37efb, +0x1a22f393, +0x9d412706, +0x30d56934, +0xdc2102b4, +0x7efb275e, +0x2007a584, +0x42072f6b, +0x04ee4f4b, +0xf1930086, +0x5e00b932, +0x239dfab5, +0x5edc2144, +0xf293fb08, +0x2705ccb0, +0x59249d40, +0xfe313fe6, +0x249d4127, +0x5edc2159, +0xf293faf0, +0x2705cc98, +0x30249d40, +0xfe193fe6, +0x249d4127, +0x5edc2130, +0xd299fad8, +0xadf4930c, +0x429d0619, +0x5edc210f, +0xd331fac8, +0x934733d0, +0x00bc80f1, +0x89fa605e, +0xda890cdb, +0x07b1230e, +0x034fab4b, +0x3b44d0b1, +0xbbccf193, +0xfa475e00, +0x32f0d331, +0xf1930081, +0x5e00bc2b, +0xf493fa39, +0x2706197c, +0x69439d31, +0x02a342bd, +0x02a043bd, +0x7d5edc21, +0x55f493fa, +0x439d0619, +0x5edc210e, +0xa123fa70, +0x4fab4a07, +0x4cd0a103, +0xac231714, +0xab4a0720, +0x20ac034f, +0x01004d30, +0xbb99f193, +0xf9f35e00, +0x4b07b323, +0xb3034fab, +0x277642d0, +0x7e02000d, +0x10078f63, +0x008f1ff6, +0x9347b1c0, +0x06190bfc, +0xc49d4127, +0x46a3d00d, +0xcb05ca15, +0x1d5edc21, +0xf5f293fa, +0x40270618, +0xe60d249d, +0x27fd463f, +0x0d249d41, +0x055edc21, +0xddf293fa, +0x40270618, +0xe60c249d, +0x27fd2e3f, +0x0c249d41, +0xed5edc21, +0xc5fc93f9, +0x40270618, +0x1e0dc49d, +0x8c877eb9, +0xb5410cc8, +0x93403c27, +0x05cb7ff4, +0xa91e4345, +0x02000d27, +0x078ed17e, +0x078a1e10, +0x801c2743, +0xf2930f07, +0x2700b9d3, +0x55edbe38, +0x07032700, +0x5f599e1f, +0x5edc2100, +0xfe4ef949, +0xffff4ea7, +0x2c43b9ff, +0x93379615, +0x05cb3bf3, +0x45063419, +0x341d4027, +0x0427fe8e, +0xbbdaf193, +0x5f2d9e00, +0xbef09300, +0xe6be00bb, +0xdc1e005b, +0xdea7fc4e, +0xb9ffffff, +0x21152cd4, +0x694fd60c, +0x4027c9f6, +0x1550dcd5, +0x1554d4ad, +0xffff4ea7, +0x2c43b9ff, +0x603fd615, +0xde22f493, +0xe33d2704, +0x07202707, +0x15430504, +0x9efc0e42, +0xd4005682, +0xd4d1dbc6, +0xdcad1550, +0x4fd61554, +0x00cf27d0, +0x27101000, +0x1000804f, +0x50d4d510, +0x270c0715, +0x802c2710, +0x0052e8be, +0x33563f27, +0xc3c51122, +0x9b402740, +0xa51e0ef4, +0x2c070111, +0xbb6af093, +0x5b5fbe00, +0x938a1e00, +0x00bb8cf0, +0x07e31d27, +0x005b50be, +0xfb4e931e, +0xffffcea7, +0x2cc4b9ff, +0x8e449615, +0x71f493fb, +0x411905ca, +0xca1af393, +0x19f49305, +0x320105ca, +0xf0934301, +0xbe00bb73, +0xb9005b21, +0xc6152cc4, +0x1f27da4f, +0x1007a000, +0x90000f27, +0x06be1007, +0xb0070057, +0xc0001f27, +0x0f271007, +0x1007b000, +0x0056f4be, +0x1f27c007, +0x1007e000, +0xd0000f27, +0xe2be1007, +0x30070056, +0x2c071b07, +0xbb63f093, +0x9efb0e00, +0x4e005ad5, +0xff4ea7fd, +0x43b9ffff, +0xd007152c, +0xf2933a56, +0x2704dd2c, +0x0507e04d, +0x2c3c2724, +0x24254427, +0x0d072315, +0x270c2c03, +0x0303014a, +0x03230504, +0x93f4a824, +0x04dd07f0, +0x739efd0e, +0xf0930055, +0xbe00bb53, +0x1e005a8d, +0xabfb4ec6, +0xa3d1070f, +0x071207f0, +0xb90dc0e3, +0x0de0670b, +0x008d0bba, +0x0bbb0de0, +0x0dc000bd, +0xa7120bbc, +0xffffff4e, +0x152c43b9, +0x00f63ff6, +0xfb8ef083, +0xffffcea7, +0x2cc4b9ff, +0x064ff615, +0x1ad48901, +0x00b144f4, +0xffffcea7, +0x2cc4b9ff, +0xe24ff615, +0xd0d45100, +0xc4b9d744, +0xd341152c, +0x79ce4fc6, +0x39311934, +0x93335932, +0x00bc31f0, +0xfb0ef083, +0x005a149e, +0xffffbea7, +0x2cb3b9ff, +0x0e3ff615, +0x18d48901, +0x40e84f8b, +0x3ff6008b, +0xd4c1021d, +0x9944c834, +0x152cb4b9, +0x4fc6d371, +0xa7c11e90, +0xffffffbe, +0x152cb4b9, +0x017c4ff6, +0x44f0d471, +0xb4b9ff7c, +0xd361152c, +0x4fe6d081, +0x030bff70, +0x01190479, +0x03590239, +0xf093f083, +0x0e00bbce, +0x59b39efb, +0xff4ea700, +0x43b9ffff, +0x3fe6152c, +0xd301ff4c, +0xf0932e07, +0x8300bce5, +0x9efb0ef0, +0xb9005995, +0xe6152cc4, +0x99ff4b4f, +0xd29920d1, +0x22d39921, +0x9323d499, +0x00bd3ef0, +0x005978be, +0xf6ff335e, +0x9101ef3f, +0x1144f0d4, +0xff765eff, +0x2e073007, +0xbd70f093, +0x0ef08300, +0x59579efb, +0x51d14100, +0x38f093d2, +0x4abe00bd, +0x125e0059, +0x29f493ff, +0xf29305c8, +0x0105c828, +0x93240143, +0x00bca1f0, +0x2ebe2e07, +0xc4b90059, +0x4fe6152c, +0xd421fedd, +0xd201d111, +0xf093d331, +0xbe00ba23, +0xb9005915, +0xe6152cc4, +0x89fec44f, +0xd28918d1, +0xa7f0931a, +0xfebe00bc, +0xb25e0058, +0xddf493fe, +0xf29305c7, +0x0105c7dc, +0x93240143, +0x00b9bcf0, +0xe2be2e07, +0xb3b90058, +0x3fe6152c, +0xd331fed5, +0xd201d111, +0xf093d421, +0xbe00b9d7, +0xb90058c9, +0xe6152cb3, +0x41febc3f, +0xf9f093d2, +0xc20700b9, +0x42073207, +0x070ccc53, +0x53335312, +0x2253104c, +0x3183c183, +0x41832183, +0x9abefc05, +0xb3b90058, +0x3fe6152c, +0xd389fe8d, +0x18d18914, +0x9316d289, +0x00b9f7f0, +0x005880be, +0x152cb3b9, +0xfe733fe6, +0x8944d189, +0xf09346d2, +0xbe00ba01, +0xb9005869, +0x5e152cb3, +0xf493fe5d, +0x9305c744, +0x05c743f2, +0x24014301, +0xbaf0f093, +0xbe2e0700, +0xb9005849, +0xe6152cb4, +0x21fe674f, +0x01d111d4, +0x93d331d2, +0x00b93ef0, +0x005830be, +0x152cb4b9, +0xfe4e4fe6, +0xf093d341, +0x0700bafc, +0x07c307e3, +0x53230713, +0xcc5314ec, +0x07e18310, +0x532a5341, +0x83c18334, +0x83218341, +0x15fe0531, +0x57fbbefc, +0x2cb4b900, +0x194fe615, +0x51d181fe, +0x71d361d2, +0x05f093d4, +0xe2be00bb, +0x055e0057, +0x71d391fe, +0x93d281d1, +0x00ba06f0, +0x0057d0be, +0x152cb3b9, +0xfdd03fe6, +0xa130d3c1, +0x93d2b1d1, +0x00ba12f0, +0x0057b8be, +0x152cb3b9, +0xfdb83fe6, +0xc13cd3c1, +0xd2c134d1, +0x1cf09338, +0x9ebe00ba, +0xb3b90057, +0x3fe6152c, +0xd189fd9e, +0x42d28940, +0xba1df093, +0x5787be00, +0xfd8c5e00, +0xd281d171, +0xb929f093, +0x5777be00, +0x2cb3b900, +0x003fe615, +0xa1d191fe, +0x2ff093d2, +0x62be00b9, +0xb3b90057, +0x3fe6152c, +0xdec1fdeb, +0x2cd18934, +0x892ed289, +0xd48930d3, +0x21f09332, +0xfe0500b9, +0x005740be, +0x4efdce5e, +0x69f493fb, +0x42890616, +0x0843890a, +0xb107c007, +0x0027322e, +0x54befb8e, +0xf3930052, +0x0105c608, +0x0bd00734, +0x56340540, +0x860d0705, +0x8e0127d4, +0xff4ea7fb, +0x43b9ffff, +0x31e6152c, +0x1b07c009, +0xbb48f293, +0x47f39300, +0x667e00bb, +0x4edb1efc, +0x07f063fd, +0x39f193d0, +0x0f0704d3, +0x0726a23e, +0x4d24f409, +0xf4290bba, +0x14284cc0, +0xf1930627, +0x9e00bb3c, +0x85005a03, +0x430027d0, +0x93fd8ef0, +0x04d30ff2, +0x21512481, +0x00004fd4, +0x27182000, +0x71236100, +0x0a430b24, +0x2707d614, +0xf6f19306, +0xd49e00ba, +0x410b0059, +0x4fd03027, +0x70000001, +0x6b03071e, +0x07db1e0f, +0xd5f3930d, +0x4a2704d2, +0x34033201, +0x04030205, +0x0127f4a8, +0x3127ae1e, +0xfb4ee01e, +0xc54ef493, +0xa7430105, +0xffffffbe, +0x3123f063, +0x152cb2b9, +0x4305f005, +0xfc09d107, +0xfc0d2b36, +0x4d27f001, +0xfc9307d6, +0x2704d8a8, +0x07c40530, +0xbec3151d, +0x070050dc, +0x5108be0c, +0xd8d44100, +0x710f114c, +0xb94586d4, +0x030e2db4, +0x2db4bd41, +0x8ef0430e, +0x930c07fb, +0x00bac9f2, +0xba5cf393, +0xfb7b7e00, +0xfc4eb91e, +0xf005f063, +0xd107fc09, +0x0bbbcdc0, +0xd5f3930c, +0x340105c4, +0x34054123, +0xffff4ea7, +0x2c43b9ff, +0x0d38b615, +0x93f001fc, +0x04d83ffc, +0x07d54d27, +0x1d073027, +0xc315c405, +0x005088be, +0xf0430c07, +0x979efc0e, +0x0c070050, +0xba70f293, +0x73f39300, +0x227e00ba, +0x63cd1efb, +0xb94d27f0, +0x483c270b, +0xf32df40d, +0xf0011007, +0x931ef043, +0xf493f54e, +0xb905c540, +0xb902dd49, +0xee02dc46, +0x0700f569, +0x07218329, +0x33420732, +0x2b463334, +0x33d40743, +0x07d40bd3, +0xfcaf03ad, +0x0100069d, +0x103cf8a3, +0xe02700d2, +0xcbe9c247, +0xff001564, +0x1560c4e9, +0xc8e9ff00, +0xff00155c, +0x47a6b7e6, +0x1d078806, +0x9b1c1f03, +0x12b90006, +0x14b9048d, +0x4242048c, +0x43834307, +0xca6542c0, +0xa3015eb8, +0x072b32d8, +0x1c2f032d, +0xd100069b, +0x2702e024, +0x2742e310, +0xe024d530, +0x8d21bd02, +0x8c23bd04, +0xed402704, +0x00155cc4, +0x8821d5ff, +0x03490704, +0x6b940741, +0x2469ce9f, +0x21832907, +0x42073207, +0x46333433, +0xd407432b, +0xd40bd333, +0xaf03ad07, +0x00069dfc, +0x3cfca301, +0x07ff6f10, +0xd1f58e0e, +0x07048815, +0x07420771, +0x33363332, +0x0b430b43, +0x46438945, +0xb3ca0407, +0xff017e83, +0x048d74b9, +0x048c73b9, +0x24074103, +0x72bd2f6b, +0xe127048d, +0x5ed323ca, +0x0027ff67, +0xfb4ef58e, +0x13b6f493, +0x49426906, +0x07d00743, +0x27322eb1, +0xbefb8e00, +0x0700519e, +0x0907e6c0, +0xbb0dc0d0, +0xf3930c0b, +0x0105c348, +0x05410334, +0xff4ea734, +0x43b9ffff, +0x3596152c, +0xc4c60c07, +0xfb8e0127, +0x1b07fb8e, +0xb890f293, +0xfff39300, +0xae7e00b8, +0x4ee61ef9, +0xff3ea7f8, +0x34b9feff, +0x4cf81e99, +0xa700d510, +0xffffff1e, +0x99093399, +0x432b4414, +0x41e84f4b, +0xfb9300c2, +0x9905c2fc, +0xb29941bc, +0x2b4c0740, +0x6b340742, +0x393fe63f, +0x83e20701, +0x03e333e7, +0x069a58ef, +0x44bd9900, +0x008fefe6, +0x4fe4e401, +0x0000c5c8, +0x910700b1, +0xffd7aea7, +0x798b07ff, +0x449399a4, +0x20274f4b, +0x010140e8, +0x422b4307, +0x0f6b0407, +0x10070323, +0x03031f6b, +0x077b01ce, +0x87438341, +0x2b443324, +0x4f43f942, +0xf6ff0000, +0x03410737, +0x6b140741, +0x8331071f, +0x33438733, +0xce342b34, +0x34f95401, +0xff00004f, +0xe49940a6, +0x2b310704, +0xc83f4b34, +0xb4994c31, +0x96280742, +0x99d12344, +0x30274024, +0x14074103, +0x239d1f6b, +0x40219d42, +0x2747c1ce, +0x44bd9d30, +0x36f60027, +0xf493f88e, +0x9905c23c, +0x43994042, +0x6b322b41, +0xa600273f, +0x8e012731, +0x04e499f8, +0x342b3007, +0x31cc3f4b, +0x42b499b6, +0xa644bd9d, +0x11f49349, +0x429905c2, +0x2b3c0740, +0x1e3f6b32, +0x83e107d5, +0x03e333e7, +0x069a58ef, +0x01ee8600, +0xc84fe0e4, +0x2c0000c5, +0x448d9dff, +0xb49d4127, +0xff4ea742, +0x4499feff, +0x9de30109, +0xfc9304e4, +0xc005c1d4, +0x00c5c83f, +0xcd9d2400, +0x8be40144, +0x40c399f4, +0x2b41c499, +0x6b340743, +0x27871e3f, +0xfefe5e21, +0x9d44bd99, +0x655e44bd, +0x1ed123ff, +0x2b4c07da, +0x6b340741, +0xff535e3f, +0xdea7f84e, +0xb9ffffff, +0xa3152cd4, +0x4c4ff6f0, +0x49f89301, +0xd49905c2, +0x2e42e026, +0xf3aabe01, +0xff4ea700, +0x4bb9ffff, +0x4cb90e2c, +0xbcce0e2f, +0xba9d2759, +0x28ac270b, +0x4c070c1e, +0xc4074103, +0xbccecf6b, +0x833c0745, +0x43070f3c, +0x44332387, +0x432b422b, +0x04074333, +0xde23d407, +0x23fff1d0, +0xfff1a80e, +0x00f31fbe, +0x4fc6d481, +0x754027ce, +0x0dd465d4, +0x01fa2df9, +0x7e1d07f0, +0x4c07fbc6, +0xc4074103, +0xcbcecf6b, +0xff2ea7bd, +0x2bbdffff, +0x2bbd0e2f, +0x81c10e2e, +0x9d302744, +0x839d0683, +0xd08bbd08, +0x9821d502, +0x9824d106, +0xd530a706, +0x07069c24, +0x0923bddf, +0x03402701, +0x0a24add4, +0x1421d501, +0x110b1e0e, +0x15f193f0, +0x737e04d0, +0x930d07fb, +0x04d00bf1, +0x07fa967e, +0xa70156c0, +0xffffffde, +0x152cd4b9, +0x00884ff6, +0xd426f493, +0xd83d2704, +0x05040707, +0xbe4c1543, +0x93004c8a, +0x05c097f2, +0x27402499, +0x9d410330, +0x249d4223, +0xfd657e40, +0x064088b9, +0xd8bd1d07, +0xdcbd0e2d, +0x21271678, +0x27113c27, +0x7824fd40, +0x03ff0016, +0x27f39821, +0xd5f08340, +0xd5166814, +0xd5167414, +0xd5167014, +0x8e166c14, +0x088499f8, +0xfecf4ff6, +0xf1930427, +0x9e00b652, +0x9300548f, +0x05c0fff8, +0x9926d199, +0xf0930882, +0xbe00b60c, +0x5e00513d, +0xf093fea6, +0xbe00b681, +0x5e005131, +0xfd4eff70, +0x061ef063, +0x237ef001, +0x55f193fb, +0x0f0704cf, +0x07fc917e, +0x49f193d0, +0x015604cf, +0xffff4ea7, +0x2c43b9ff, +0x9339d615, +0x04d36bf4, +0x07d73d27, +0x43050407, +0xcfbe4d15, +0xf293004b, +0x9905bfdc, +0x30274024, +0x239d4103, +0x40249d42, +0x43fcaa7e, +0x93fd8ef0, +0x00b638f0, +0x0050d0be, +0xfb4eca1e, +0xffffdea7, +0x2cd4b9ff, +0xf6f06315, +0x9900e74f, +0x4ff626d4, +0xfc9300ec, +0x7e05c064, +0xcbb9fb1c, +0xcdb902dc, +0xdbce02dd, +0x073d1e0e, +0x0741034d, +0xcedf6bd4, +0x4d0732bd, +0x34074183, +0x44333633, +0x0307342b, +0x030b0333, +0x9dfc04f1, +0x43830006, +0x03d942c4, +0x069e080f, +0xfac97e00, +0x41034d07, +0xdf6bd407, +0xb9d0dbce, +0xc60ec5c4, +0x07d02748, +0x330d073d, +0x2b063334, +0x33400703, +0x03040b43, +0x06a17c0f, +0xfa9d7e00, +0x0ec5c4b9, +0xd4dad103, +0x273027df, +0xd5202740, +0xd10648c3, +0x2702d4c1, +0x44c2d530, +0xddc4bd06, +0xd8c3d502, +0xc5c4bd02, +0xdcc4bd0e, +0x2115e602, +0xff3ea714, +0x4103ffff, +0x155834d5, +0xf1930f07, +0x7e04ca20, +0x07e6fb76, +0x4dc0f409, +0x01ee0bbb, +0x0df193f0, +0xeb7e04ca, +0x930f07f9, +0x04ca03f1, +0xb6fb597e, +0xfeb07e00, +0xfb8ef043, +0xb54ef093, +0x4fcfbe00, +0xff115e00, +0xf1930427, +0x9e00b556, +0x4e0052ff, +0xffdea7fd, +0xd4b9ffff, +0x4e36152c, +0x9926d199, +0x41ce27d4, +0xff3ea73c, +0x3499feff, +0x87438309, +0x2b443324, +0x4d43f942, +0x23ff0000, +0x3738d431, +0xd49d4227, +0x8e120027, +0x71f493fd, +0x439905be, +0x03202740, +0x42429d31, +0x0e40439d, +0xfb3d5efd, +0xf1930827, +0x9e00b537, +0x930052a3, +0x00b521f0, +0x004f5cbe, +0x0827a71e, +0xb564f193, +0x528d9e00, +0xa7fd4e00, +0xffffffde, +0x152cd4b9, +0xd2994a96, +0x27d49926, +0x271f42ce, +0x27d49d40, +0xfd8e2486, +0xbe1af393, +0x40349905, +0x0342329d, +0x40349d41, +0xe85efd0e, +0x930827fa, +0x00b549f1, +0x00524e9e, +0xb531f093, +0x4f07be00, +0x4ec41e00, +0xffcea7fb, +0xc4b9ffff, +0xd007152c, +0xdc064f96, +0xc4b9b027, +0xcbbd152c, +0x4f7606a4, +0xd14ef293, +0x27cd9d04, +0x07db4d27, +0x24053427, +0x2d252315, +0xcd9d0207, +0x49a8be26, +0xb5f39300, +0x349905bd, +0x423b9d40, +0x349d4103, +0x5efb0e40, +0xf493fa83, +0x9905be64, +0x20270443, +0x439d32e3, +0x08429d04, +0x7e064d9d, +0xa91ed00b, +0xb511f093, +0xbe1d0700, +0x1e004e91, +0x18f0939a, +0x1d0700b5, +0x004e84be, +0xfb4e9b1e, +0xffffcea7, +0x2cc4b9ff, +0x93499615, +0x05bda7fb, +0xd486bd19, +0xc4b9fb8e, +0x4816152c, +0xd0caf493, +0xdd3d2704, +0x05040707, +0xbe4d1543, +0x2700492e, +0x8eb41d41, +0xf2fc7efb, +0xf093d21e, +0x2700ae75, +0xbe07dd1d, +0x1e004e39, +0xa7fb4ed4, +0xffffffde, +0x152cd4b9, +0x00c24ff6, +0x7fff4ea7, +0xf84391d0, +0x00d1103c, +0xff79e4be, +0xbcfef493, +0xf5f39305, +0x420105bc, +0xf0933101, +0xbe00b529, +0x27004e01, +0x07a0001f, +0x000f2710, +0xbe100790, +0x070049ed, +0x001f27b0, +0x271007c0, +0x07b0000f, +0x49dbbe10, +0x27c00700, +0x07e0001f, +0x000f2710, +0xbe1007d0, +0x070049c9, +0x072c0730, +0x0cf0931b, +0xbebe00b5, +0x4127004d, +0x4fff3ea7, +0x21d4bdfd, +0x2732010e, +0x0ef49b40, +0xd399c127, +0xcbc23b0e, +0xbf3ea7c3, +0xc138fd4f, +0x34054127, +0xc4c6c153, +0xf31e3403, +0x78414f27, +0xf4e8017d, +0xffff3ea7, +0x2c34b9ff, +0x93487615, +0x04cfe3f4, +0x07dc3d27, +0x43050407, +0xfb0e4c15, +0x0048459e, +0xb43ef093, +0x4d5fbe00, +0xff365e00, +0xad8bf093, +0xdc1d2700, +0x4d4fbe07, +0x27d11e00, +0x30f19304, +0x809e00b4, +0xfc4e0050, +0xffff4ea7, +0x2c43b9ff, +0xbe397615, +0x16ff7cc5, +0xff4ea70a, +0x43b9ffff, +0x3fd6152c, +0x89f49374, +0x3d2704cf, +0x202707d9, +0x43050407, +0xfc0e4215, +0x0047e99e, +0xb488f093, +0x4d03be00, +0x93cd1e00, +0x05bb13f2, +0x99092399, +0x34ce0824, +0x03430764, +0xf9478341, +0x0699803c, +0x09249d00, +0xffdf0ea7, +0x5189beff, +0x333c0700, +0x0bcc8734, +0xccc4f1c3, +0xd8ff0003, +0x0300004e, +0x03c3070d, +0x069ca0cf, +0xb6c41900, +0x93082747, +0x00b46ff1, +0x004fee9e, +0xacdff093, +0xd91d2700, +0x4ca3be07, +0xff7f5e00, +0x0ea74223, +0x1dffffdf, +0x511ebec4, +0xff635e00, +0xf1930827, +0x9e00b419, +0x4e004fc3, +0xffbea7fb, +0xb4b9ffff, +0xc007152c, +0x4ff60d01, +0xdde0013a, +0x00e903ee, +0x03efddd0, +0xf2dde024, +0xf400e303, +0x8d03f3dd, +0xf0dde000, +0xe0011803, +0x0b03f1dd, +0x93042701, +0x00b462f1, +0x004f829e, +0x03ebdde0, +0xddd000c7, +0xe07d03ec, +0xd303ecdd, +0xedddc400, +0xfd93e003, +0x9905bb18, +0x4e9644d4, +0x2741de99, +0x831e0741, +0x9d133317, +0x1d0b44d4, +0xe66ef453, +0xd0991405, +0xff3ea743, +0x109dfeff, +0x44b49904, +0x2b093299, +0xcc4f4b42, +0x4ea71141, +0x79ffffd7, +0x07353643, +0x9d410340, +0x4e070414, +0xd3994103, +0x9d4f6b40, +0x432b41d4, +0x49f44f6b, +0xfb8e00a8, +0x03f4dde0, +0xdde40081, +0xff7703f5, +0xfb0e0c07, +0xc0efdb5e, +0x1d03e9dd, +0x03eadde4, +0xfd93ff65, +0x9905ba9c, +0xf45341de, +0x1e07fc59, +0x13331783, +0x8d1e1d0b, +0xba86fd93, +0x41de9905, +0xfbd1f453, +0x17831e07, +0x1d0b1333, +0x0eff775e, +0xfe405efb, +0xfb0e0c07, +0x93e80b5e, +0x05ba63fd, +0x5341de99, +0x07faa1f4, +0x3317831e, +0x5e1d0b13, +0xfd93ff54, +0x9905ba4c, +0xf45341de, +0x1e07f8ac, +0x13331783, +0x3d5e1d0b, +0x5efb0eff, +0x0c07ef32, +0x3f5efb0e, +0x5efb0ee6, +0xf093fd05, +0x0700b32b, +0x4b2fbe1d, +0xfebc5e00, +0xf1930427, +0x9e00b326, +0x4e004e5f, +0xff4ea7fe, +0x4391d07f, +0x4e103cd8, +0x03c10471, +0x3802c134, +0x00004fd0, +0x0b347000, +0x014fd443, +0x2bf00000, +0x813e32ca, +0x91475604, +0xa146d604, +0xb1465604, +0xc145d604, +0x45363004, +0x963c04c1, +0x27fe8e44, +0x1cf19306, +0x109e00b4, +0x0627004e, +0xb392f193, +0x4e059e00, +0x93062700, +0x00b357f1, +0x004dfa9e, +0xf1930627, +0x9e00b3a5, +0x00004def, +0x00000012, +0x0000006c, +0x07b9f54e, +0xd00702dc, +0x02dd00b9, +0x4007f563, +0xf0c5471b, +0xbe840738, +0xc1ff774c, +0xf0b544d1, +0x1fe68f6b, +0x11230459, +0x4f834107, +0x80000003, +0x40e81103, +0x448708e4, +0xabe044f1, +0x31070005, +0x00033f83, +0xf4a58000, +0x078130e8, +0x4387f1a1, +0x41f5f2b1, +0x0005abe0, +0x03ea22e4, +0xf3953027, +0x02d8d4d1, +0x82f4f485, +0xf2910137, +0x0d07ed07, +0x3d071d07, +0xed034d07, +0x0d030804, +0x1d030654, +0x21030ec8, +0x02e03d03, +0x04a44d03, +0xc53cfec5, +0xf1c540f0, +0x48f2c544, +0xc54cf3c5, +0xd4b950f4, +0x4fe60ec6, +0xd4b90113, +0x4fe60ec5, +0xd4b9010b, +0x45060ec7, +0xd4bd4127, +0x47070ec4, +0x34074183, +0x44333633, +0xd2b9342b, +0xc3070ec4, +0xc30bc333, +0x1c073207, +0x36332433, +0x322b1d0b, +0x02e014d1, +0xe333e307, +0x2407e30b, +0x0e0721e3, +0x02e012d5, +0x03d10d0b, +0x43e30654, +0x43ab3283, +0x02e014d5, +0x065403d1, +0x348344e3, +0x14d543ab, +0xd3b902e0, +0x48e30ec7, +0x33333183, +0x14d543ab, +0x00d102e0, +0xcd030658, +0x10d502ec, +0xf05302e4, +0xed03fecc, +0x2d070660, +0x04013d07, +0x3e0b2c0b, +0x02eccd23, +0x0660ed23, +0x34033101, +0x24032105, +0x3e07f4a8, +0x4d034c07, +0x3d0302e0, +0x0d0706a8, +0x040b1d07, +0x977e130b, +0xc7d4b985, +0x8e4ff60e, +0xc4d4b900, +0xbd41030e, +0xb90ec4d4, +0x230ec5d4, +0x6b340741, +0xc5d3bd3f, +0x2735960e, +0xc6d4bd40, +0xc4d3bd0e, +0x0340270e, +0xc7d4bd81, +0xf071030e, +0x81ff0182, +0x38f3c1f4, +0x02dcd7bd, +0x4f6b432b, +0x029f48ea, +0x430d0c27, +0x07f58ef5, +0x49f1930f, +0x5f7e04c4, +0xdc0fc6f4, +0x4dc0f409, +0xc01e0bb9, +0x490bbb4d, +0x0bbc4dc4, +0xc1f1291a, +0xf09344f2, +0x7e04c428, +0x82f0848e, +0xb81efeba, +0x4cc0f429, +0x06273f48, +0xb758f193, +0x4bed9e00, +0xbd412700, +0x530ec4d4, +0xc1fdfbf1, +0xf3c13cf2, +0x01140140, +0x0534033e, +0xa824032e, +0xff615ef4, +0xf2c1f129, +0xe5f09344, +0x8c7e04c3, +0x7782f087, +0xff755efe, +0xc3d6f193, +0xfc134104, +0xeb08003d, +0xc9fe9301, +0xd1d104c3, +0xd0d10648, +0xe4890644, +0x34f1c514, +0x0730f0c5, +0xb14ff61e, +0xadf09301, +0x048904c3, +0xe6500744, +0x2300df4f, +0x83670771, +0x07360761, +0x33343346, +0x07432b46, +0x0ba333a4, +0x0b3a07a4, +0x8c3bb93d, +0x03710304, +0x6bcb07b1, +0x8c3cbdcf, +0xd1b12304, +0xbe048839, +0xeaff7b2a, +0x0700a50c, +0x334b072b, +0x0b233346, +0x51fe5324, +0x01290bfd, +0x071507e4, +0x03100132, +0x03300514, +0x93f4a834, +0x04c347f0, +0x04411a07, +0x13d11d0b, +0x4e8302fc, +0xab010000, +0xfc14d543, +0x89034102, +0x3d834620, +0x43ab2000, +0x02fc14d5, +0xa93f0c38, +0xee030014, +0x89018e40, +0x46074423, +0x4b0b4333, +0x87103c33, +0xf530ab44, +0x00156843, +0xf52171ff, +0x0015a841, +0x272381ff, +0xe843f510, +0x91ff0015, +0xf5364722, +0x00162842, +0x6030edff, +0x93ff0015, +0x04c2dbf4, +0x0c534041, +0xbe01830d, +0xf0ff7f2b, +0x5efd6582, +0xff1efe63, +0x07180c89, +0x7bc1e0a0, +0xc00b4109, +0x201102cd, +0x1103cdf4, +0xcdc00450, +0xf4150182, +0xa80183cd, +0x04cd2006, +0x21cd0001, +0x02cde401, +0x0706b801, +0x0f1c531c, +0x4ea71626, +0xc1fd4fff, +0x3ef87443, +0x34800000, +0xff4ea709, +0x43c1fd4f, +0x003f5c74, +0x40010000, +0x200121cd, +0xfc1121cd, +0x092af0cc, +0x0281cde0, +0xb1fc04a8, +0xb2fc092b, +0xb8fc093d, +0xb4f808a4, +0xa98900d4, +0xa49fe616, +0x14a38908, +0x08c93fe6, +0xb692f293, +0x2c24a905, +0xc749ea48, +0x2e24a908, +0xca43ea48, +0xff1fe608, +0x30bcfc03, +0xbcfc08fe, +0xfc0930c0, +0x1f0300bd, +0x91a47109, +0x004ff4a3, +0x44700000, +0x93062706, +0x00b26df1, +0x0049e29e, +0x24832307, +0xfe4b2ff6, +0x30271441, +0x20004de3, +0x138d1445, +0x46128d14, +0x5e44128d, +0xd2d1fe35, +0xd4c10f98, +0x83210344, +0x0000034f, +0xe8f2a580, +0xa104f040, +0xf54487fe, +0x05abe04e, +0xfdf75e00, +0xff7315be, +0x155ef095, +0x07f381fc, +0x0731830d, +0x33263323, +0x07232b34, +0x0b433342, +0xe04d0342, +0x0b3d0702, +0x544c0334, +0xd3d5040b, +0x567e02d4, +0x43002786, +0x1ef58ef5, +0x7e18beff, +0xa53027ff, +0xfbc65ef0, +0x0000bef8, +0x93081f01, +0x04c173fe, +0x8918e489, +0x4f8b12ec, +0x40e8c183, +0xf2c10533, +0x30f0c148, +0x2734f1c1, +0x5a78be30, +0xc601ab00, +0x5acfe604, +0x83470703, +0x33340741, +0x2b443336, +0x33130734, +0x03130b13, +0x0702e01d, +0xe03d2331, +0xd13d0b02, +0x0702e034, +0xa347e39d, +0xe034d542, +0x44d2d102, +0x48d4d106, +0xab710306, +0x0b810324, +0x91250691, +0xa00ff6f0, +0x03390703, +0xf2290c3c, +0xc0fefc93, +0x07030704, +0xbef3751c, +0xc1003cd2, +0x090744f1, +0xc181e17e, +0xe0274cf2, +0x2473291b, +0x44334207, +0x340b3287, +0x4307322b, +0x432b4933, +0xbc33b407, +0x13b40b12, +0xed6b47b0, +0x0015646e, +0x209489ff, +0x155c64ed, +0xc0c1ff00, +0x5a0ff644, +0x14c48901, +0xc4414576, +0x00004ef8, +0x01014c01, +0x20918994, +0x27104ce3, +0x052b0730, +0xac93bd94, +0xad9ebd01, +0xf5253301, +0x00156821, +0xa890d5ff, +0xf5ce7101, +0x0015a82e, +0xf5c081ff, +0x0015e820, +0xedc391ff, +0x00156061, +0x2823f5ff, +0x41ff0016, +0x531127c0, +0x01830d0c, +0xff7cb2be, +0xffff1ea7, +0x7010d1ff, +0x3df25316, +0x232101fa, +0x7837be01, +0x7804f900, +0xe0ff0016, +0xe0019a42, +0xd1041b41, +0xe00644d4, +0xffffff4f, +0xbe03d5ff, +0x26ff7421, +0xff4ea708, +0x40d1ffff, +0xfe531670, +0xe101fa08, +0x02be0123, +0x04f90078, +0xff001678, +0x02f241e0, +0xbffef093, +0x07044104, +0x004dd8b0, +0x40270f04, +0xd3d53027, +0xd4d50644, +0x04410648, +0x08004dfc, +0xdcd1016d, +0xd4d10644, +0x4cab0648, +0x01444ff6, +0xbfcef193, +0x16118904, +0xbfc6f293, +0x4ed1ad04, +0x14228906, +0xbfbaf393, +0x4cd2ad04, +0x18338906, +0xffff4ea7, +0x539c15ff, +0xd1f99bfe, +0x01167040, +0x50d3ade1, +0x778fbe06, +0x7804f900, +0xe0ff0016, +0xd1028e44, +0xd10644d0, +0xa10648d1, +0x27b127f2, +0x0b3027c0, +0xbe1c4b0b, +0xa700589a, +0xffffff2e, +0x167024d1, +0x0644d0d5, +0xd1d54103, +0x24d50648, +0x82f01670, +0xf45ef9f6, +0x939401fa, +0x05fc87f5, +0x05104ca3, +0x7704be94, +0x075401ff, +0xa34fe6a0, +0x072a0701, +0x3346334a, +0x0b530123, +0x532b9b24, +0x0bf923fe, +0x01f07123, +0xa892d5e4, +0x01320701, +0x05040301, +0xa8340331, +0x274127f4, +0xac94bd30, +0xad93bd01, +0x46218901, +0x893f1c38, +0x41ee2094, +0x248900d4, +0x333b0744, +0x3533104c, +0x34f541ab, +0xff001568, +0xfe932071, +0xf504bee8, +0x0015a830, +0xf52481ff, +0x0015e834, +0xed2291ff, +0x00156061, +0x2832f5ff, +0x41ff0016, +0x531127e0, +0x01830d0c, +0xff7b1abe, +0xffff1ea7, +0x7010d1ff, +0xa5f25316, +0x232101f8, +0x769fbe01, +0x7804f900, +0xe4ff0016, +0x27fe6a42, +0xd5402730, +0xd50644d3, +0x5e0648d4, +0x5cbefe6b, +0x0fe6ff73, +0xd3d1feb8, +0xb451064c, +0xb389434e, +0x50d4a918, +0xa534ee06, +0xd53027fe, +0xd10644d3, +0x270644dc, +0x48d4d540, +0xfe925e06, +0x3104cde0, +0xcdf4fbc7, +0x02723105, +0x1121cde0, +0xcdf0fbbb, +0x03001122, +0x1201cde0, +0xcde4fbaf, +0x025f2104, +0x23fba65e, +0xfc3fa331, +0x03ffffff, +0xf8765e31, +0xbcfcff1e, +0x070461c0, +0xbe1b070c, +0xe4ff74ef, +0xc0014902, +0x120182cd, +0x1102cdc0, +0x02cd400d, +0x834c0701, +0xb144e447, +0x30bcf803, +0x0627012e, +0xaf63f193, +0x45d59e00, +0xc5d4b900, +0x079d070e, +0x33363334, +0x07342b44, +0x0b233323, +0x542d0323, +0x23120706, +0x0b06541d, +0x5413d11d, +0xa3920b06, +0xd534e332, +0xb9065413, +0x030ec5d4, +0xc5d4bd41, +0xfcb35e0e, +0x4fff4ea7, +0x7443c1fd, +0x00003efc, +0x27fb4d10, +0x26f19304, +0x809e00ac, +0x02d00045, +0x07c00731, +0xa7473340, +0xffffdf0e, +0xc40bc433, +0x0046dabe, +0xd47e0c07, +0xa75005c4, +0xffffdf0e, +0x0046a7be, +0x2c075001, +0x7ebe1027, +0x2e5e0039, +0xb9ff1efe, +0xe60ec5d1, +0x07fc5c1f, +0x33410731, +0x2b463334, +0x93240743, +0x04bd53fe, +0xf0c12333, +0x0be34150, +0xf8200b24, +0x06022c34, +0xe34307c7, +0x0100004e, +0x2371e445, +0x00003ea3, +0xb9237501, +0x270ec5d1, +0xbd312740, +0xbd0ec4d4, +0xe00ec6d3, +0x2701da13, +0xc7d2bd20, +0xfc0b5e0e, +0x40273027, +0x0644d3d5, +0x0648d4d5, +0xd1fd035e, +0xab0648d4, +0x254ff64c, +0xfd422701, +0x00167804, +0xfd615eff, +0x4fa34123, +0xfffffffc, +0x135e4103, +0xa34123f7, +0xfffffc4f, +0x5e4103ff, +0xa189fb07, +0xc81fe640, +0x42a08903, +0x03b60fe6, +0x0301cde0, +0xcdf402a2, +0x013f0302, +0x0121cde0, +0xcdf40182, +0x02470122, +0x0102cde0, +0xcde402c0, +0x01440104, +0x31874027, +0xf315b127, +0xf465f045, +0xf435f425, +0xaf07f455, +0xbc8af293, +0x27e02704, +0xe2a403c0, +0x0701d0be, +0x014c0b4a, +0x3423c140, +0x02d830fa, +0x4c034f07, +0x0b237110, +0xf444014c, +0x0000003f, +0x2701dc70, +0x91f19306, +0x349e00ae, +0xd4d10044, +0x4fe40648, +0xffffffff, +0xf3a1fc23, +0x31234027, +0x0644d3d5, +0xd4d53103, +0xf3a50648, +0x89fc0e5e, +0xe18916e2, +0x2ce38914, +0x0b2ee489, +0x8d410b32, +0xe38d14e4, +0xfab85e16, +0x0644d3d1, +0x0648d4d1, +0x20a710a7, +0x424b310b, +0x0644d3d5, +0x0648d4d5, +0xe0fbce5e, +0x640281cd, +0x82cdf0f9, +0xe000a002, +0x580301cd, +0x21cd24f9, +0xf9515e03, +0x8001cdd4, +0x93062751, +0x00a9dbf1, +0x0043b69e, +0x04fd4127, +0xff001678, +0x0bfc3e5e, +0x014ff443, +0xb6f00000, +0xe43fe6f9, +0xf6a48102, +0xa102d34f, +0xf64ff6a4, +0x34a4c101, +0xfa3544fc, +0x4c034907, +0x30a3890f, +0x43e24453, +0x0627fa27, +0xaca1f193, +0x43719e00, +0x03cdf000, +0x07f8f680, +0xdf4d034c, +0xf04fab7f, +0x1ef8ea42, +0x21cdc09d, +0xcdf44511, +0x01291122, +0x1102cde0, +0xcde00184, +0xfec61104, +0x0321cde0, +0x0627015f, +0xad40f193, +0x43359e00, +0x01cde400, +0x5eff7002, +0xcde4f8b7, +0xff671104, +0xb1f8ae5e, +0x2413e4f1, +0xbd2127fe, +0x5e0ec7d2, +0x4007fa2d, +0x30274103, +0x21874153, +0xf215b127, +0xf365f445, +0xf335f325, +0x8b5ef355, +0x531e07fe, +0x01f507fe, +0xc5f393e4, +0x100104ba, +0x30051403, +0xf4a83403, +0xfe530207, +0x0c03f4f0, +0x93e4010c, +0x04baf3f1, +0x3e013007, +0x1e053403, +0xf4a81403, +0xf0533007, +0x0401f4d4, +0xba92f193, +0x031e0104, +0x033e0514, +0x71f4a834, +0xa3312724, +0x0100004e, +0x20272475, +0xd4bd4027, +0xd3bd0ec4, +0xd2bd0ec6, +0xaa5e0ec7, +0xf62471f9, +0xa101274f, +0x214ff624, +0x3424c101, +0x010f4ff6, +0xc403e103, +0xe3e42403, +0x91e2fe13, +0x0627f91b, +0xad72f193, +0x42659e00, +0x0b409b00, +0x014ff443, +0x1cf00000, +0xc624a1fe, +0x0627d74f, +0xacd3f193, +0x42499e00, +0x01cdc000, +0xcdc02c02, +0xe47d0281, +0xfb0182cd, +0xfdb65efe, +0xf1930627, +0x9e00adef, +0xe000422b, +0xa52104cd, +0x04cde0fd, +0xe4fd9f31, +0xdb1201cd, +0x034007fe, +0x53302741, +0x55b22741, +0x15f365f4, +0x35f125f1, +0x5ef045f3, +0x3007fd92, +0x31034107, +0x41534103, +0xb3273153, +0xf365f435, +0xf425f115, +0xf355f045, +0x07fd755e, +0x53410340, +0x27314741, +0x65f315b3, +0x35f125f4, +0x55f045f1, +0xfd5c5ef4, +0x31474027, +0x07fd475e, +0x47410340, +0x53202731, +0x25b22741, +0x65f455f3, +0x35f315f2, +0x5ef045f2, +0x0627fd3a, +0xab03f193, +0x419d9e00, +0x93062700, +0x00aaa0f1, +0x0041929e, +0xf1930627, +0x9e00a8dc, +0x27004187, +0x0bf19306, +0x7c9e00a9, +0x06270041, +0xaba4f193, +0x41719e00, +0x93062700, +0x00ac4cf1, +0x0041669e, +0xf1930627, +0x9e00ac19, +0x2700415b, +0x02f19306, +0x509e00a9, +0x06270041, +0xa91bf193, +0x41459e00, +0x93062700, +0x00a92ef1, +0x00413a9e, +0xf1930627, +0x9e00ac6e, +0x2700412f, +0x72f19304, +0x249e00a7, +0xc47e0041, +0xf7c95ef2, +0xf1930427, +0x9e00a786, +0x27004113, +0xdff19306, +0x089e00a7, +0x06270041, +0xa910f193, +0x40fd9e00, +0x93062700, +0x00a80ff1, +0x0040f29e, +0xf1930627, +0x9e00aac5, +0x270040e7, +0x8ef19306, +0xdc9e00aa, +0x06270040, +0xa931f193, +0x40d19e00, +0x93062700, +0x00a900f1, +0x0040c69e, +0xf1930627, +0x9e00a998, +0x270040bb, +0x67f19306, +0xb09e00a9, +0xf54e0040, +0xd007f363, +0xad1af093, +0xf2be7e05, +0x0ff6f0a5, +0xf29302de, +0xd105ad0c, +0xd102d429, +0xd8016894, +0xd11c104c, +0xf001249b, +0x000000bf, +0x27080d40, +0xc53027c0, +0xdcd530fc, +0xd3d5024c, +0x40270258, +0x02b5d4bd, +0xac62f293, +0x59249905, +0x0d030d07, +0x4ff60260, +0xc9be02a0, +0x0ff6ff73, +0xd09d02ba, +0xff1ea75e, +0x14d1ffff, +0xf3931668, +0x0305f97c, +0x69329941, +0x166814d5, +0x02bd2ff6, +0x016494d1, +0x00004f38, +0xc0270400, +0x024cdcd5, +0xb5f8d399, +0x323fe6f3, +0x99402703, +0xf495d8da, +0xff6985be, +0x4bbe5007, +0x9007ff70, +0xff6983be, +0x033e02e0, +0xac6ef293, +0xd424d105, +0x56441102, +0x58d4d545, +0x4cd4d502, +0xff4ea702, +0x40d1ffff, +0x1c271674, +0xbe012312, +0xf9006fed, +0x00167804, +0xb142e0ff, +0x4a41e006, +0xf6f3b107, +0xf602a53f, +0x270384af, +0x6cd49d40, +0x0653a1e0, +0x06a8a2e0, +0x2fe6f2b1, +0xa2e0031f, +0xa5e003c6, +0xa6e0079b, +0xa7e0038c, +0xa8e00936, +0xf4b10b3d, +0xa2e044c6, +0x30270ac1, +0x0258d4b9, +0x4123f385, +0x71037407, +0x71834183, +0xd0d1f475, +0x0fe60250, +0xf2930419, +0xd105abe4, +0x0102d424, +0x83935349, +0x1703e091, +0x4ad3a907, +0x07422702, +0x2b310325, +0x45d4bd20, +0x5ed1b902, +0xad402702, +0x9d0248d3, +0xd49db7d2, +0xae1fe6b9, +0x989fe605, +0xa9f27107, +0x470248d6, +0xbd324747, +0xbd02fcd4, +0xad031cd3, +0x23024ad6, +0x50d0d501, +0x8df29302, +0x24d105ab, +0x302702d4, +0xd3c54871, +0xd0d3c5d4, +0x93384289, +0x05ab77fc, +0x89d0d2c5, +0xd4a93a43, +0xf2810282, +0x02c0d4ad, +0xf6d4d3c5, +0xb904442f, +0xe00245db, +0xd10360b2, +0x070258d3, +0x30f3c543, +0xd4bd4183, +0x5fe602b7, +0xb5960644, +0x02d4c4d1, +0x3fe64311, +0x73be08b5, +0x1007ff73, +0x0254d0d1, +0x006eccbe, +0xd0d5050b, +0xa1e002cc, +0xa2e007d0, +0xa5e007eb, +0xa6e00a17, +0xa7e00aa7, +0xa8e00b8a, +0xb2e00959, +0xc1270334, +0x025fdcbd, +0xff6ae0be, +0x048e0fe6, +0xd4bd4127, +0x848302b8, +0x84864127, +0x44334027, +0x02b6d4bd, +0x02d0d6ad, +0x02b4dbbd, +0xb1e0ba66, +0xd4b90632, +0x4fe6025e, +0x9ff60425, +0xd2990421, +0xe521e0b7, +0xe6a8e008, +0x27f3710b, +0xa3433b41, +0xd4d51c4c, +0xb2c402d8, +0x26f4811a, +0x93141e48, +0x05aaa7f2, +0x02d424d1, +0x3ff64311, +0xdbd504b8, +0xd4d102d8, +0x41030258, +0x0258d4d5, +0x3127a123, +0x3027b200, +0xf73af493, +0x0c449905, +0xd49d2d07, +0x034027af, +0xad02f42d, +0x0702f8d4, +0x57d39d4a, +0x02fadbbd, +0x6b44d2c5, +0x3842f04f, +0xffbea705, +0xbcd1ffff, +0x1c271674, +0x230c0712, +0x6debbe02, +0xfd402700, +0x00167804, +0x93c103ff, +0x023d83f4, +0x1674bcd5, +0xf0a1d415, +0xf58ef343, +0xff712bbe, +0xa77d0fc6, +0xffffff4e, +0x166840d1, +0x23121c27, +0x6db7be01, +0x7804f900, +0xc0ff0016, +0x0d077142, +0xff7c9fbe, +0xffff1ea7, +0x6814d1ff, +0xc1f39316, +0x410305f6, +0xd5693299, +0xe6166814, +0xa9fd472f, +0xa90288d0, +0x99028ad1, +0xde99fbd4, +0xffdb99fd, +0xf68ef293, +0xfadc0305, +0x250d2c99, +0x35d203fd, +0xc3d203fd, +0x45fe05c1, +0x27e027fd, +0x3827222c, +0x15fedc23, +0x65fc55fb, +0x9fb37efe, +0x93fd075e, +0x05a9a7f3, +0x02d434d1, +0x3fe64311, +0x4027ff77, +0x5e5ed49d, +0xf3b1fcd5, +0xfd5d31e4, +0xfd59afe6, +0x024cd4d1, +0xfd514fe6, +0xa97ef293, +0xd424d105, +0xdcd1c102, +0x0c074c11, +0x006d10be, +0x00d90fe6, +0x0acdc1fc, +0xd4bd4127, +0x2c5e02b5, +0xd8da99fd, +0x4a07a123, +0xa1034f6b, +0x05a042f0, +0xf4954027, +0xff6649be, +0x0fbe5007, +0x9007ff6d, +0xff6647be, +0xfcc602e4, +0xfcc25fe6, +0x0916a3e0, +0x06f7a4e0, +0x0258dcd1, +0x0c071327, +0xbebe0123, +0x0f6b006c, +0x0c07f075, +0x13270223, +0x006cb0be, +0x31277007, +0xf3857f6b, +0xe4fd155e, +0x93fce5a2, +0x05a8fbf2, +0x02d424d1, +0xcfe64c11, +0x4ea7fce6, +0xd1ffffff, +0x27167440, +0x0123121c, +0x006c80be, +0x167804f9, +0x41e0ff00, +0xf4b10714, +0x09744fe6, +0x0258d0b9, +0x03d2d4b9, +0x242b2007, +0x21832123, +0x7007f275, +0x71834027, +0xc35ef485, +0x4cd4d1fc, +0x784fe602, +0xa5f293fc, +0x24d105a8, +0xd1c102d4, +0xbe4011dc, +0xf6006c39, +0x27fc620f, +0xb5d4bd44, +0xfc595e02, +0xa886f393, +0xd434d105, +0x11150702, +0xce110340, +0xd4c10e01, +0xbe149bdc, +0xf6006c11, +0xd106100f, +0xb90258d7, +0x2703c8d4, +0x75718320, +0x5ef285f4, +0xf393fc6a, +0xd105a854, +0xc102d434, +0x4c11dcd1, +0xe6be0c07, +0x01fc006b, +0x02e0ff4e, +0xcfe6ff4a, +0x4ea7fc2e, +0xd1ffffff, +0x27167440, +0x0123121c, +0x006bc8be, +0x167804f9, +0x4596ff00, +0x03d2d4a9, +0xd4ad4103, +0xd4b903d2, +0xd3b90258, +0x740703d2, +0x4123432b, +0xf4754183, +0x40277183, +0x0b5ef485, +0x5ed4b9fc, +0x5c4fe602, +0x86412705, +0x03402794, +0xb7d4bd42, +0xe1f29302, +0x24d105a7, +0x441102d4, +0x02ccd4d5, +0xcd5ec907, +0x4cdcd1fc, +0x62cfe602, +0xd5f47101, +0x470250d5, +0xbd412734, +0xa70245d4, +0x1cd4bd40, +0xfcd3bd03, +0xff4ea702, +0x40d1ffff, +0x1c271674, +0xbe012312, +0xf9006b41, +0x00167804, +0x8941e0ff, +0x4ad4a906, +0xad410302, +0x270248d4, +0xb7d49d40, +0xa782f293, +0xd423d105, +0x48d6a902, +0xa9321102, +0xad025cd1, +0xbd024ad6, +0xca025ed4, +0x41070d12, +0xd4ad4123, +0xd1a9025c, +0xf493025c, +0xd105a758, +0x0702d443, +0x233349bc, +0x5cd3adc1, +0x4cdcd502, +0x86312702, +0xa7302714, +0xffffff4e, +0x167440d1, +0x27b9d39d, +0xcebe121c, +0x04f9006a, +0xff001678, +0x049641e0, +0x8e5e9027, +0x58d0d1fb, +0xbe132702, +0x27006ab5, +0xb7d0bd31, +0xb8d3bd02, +0xd4c4d102, +0x5fd3bd02, +0xd5441102, +0xe002ccd4, +0x200240a3, +0x45dbb9a4, +0xfbfc5e02, +0x44274596, +0x02b7d4bd, +0x03c7dabd, +0xd1dcdcc1, +0x0302ccdb, +0x07c59b51, +0x0b51230b, +0xbe1c0705, +0xd6006a6d, +0x0b07d40f, +0x68be1c07, +0x0183006a, +0x0245dbb9, +0xd0bd0303, +0xd0bd03c7, +0xbb5e02b7, +0xd1a3e0fb, +0x23a4c002, +0x02caa5e0, +0xe01ca6c0, +0xe0077ca7, +0x2707dba8, +0x07f27141, +0x3b373b34, +0xd534ab42, +0x5e02d8d3, +0x4127fbd2, +0x3407f271, +0x473b323b, +0x3ca334ab, +0xd8d3d518, +0xfbbc5e02, +0x735e4c07, +0x65f393fb, +0x34d105a6, +0x302702d4, +0xd3bd4211, +0xd9d50245, +0x2ff6024c, +0x40270226, +0x0248d4ad, +0x024ad0ad, +0x30a74027, +0x031cd3bd, +0x02fcd3bd, +0x9db7d49d, +0xf293b6d5, +0xd105a630, +0xbd02d423, +0x49025ed4, +0xb9d49d33, +0x025cd3ad, +0x3506f3b1, +0xd4ad4027, +0xd6a903d2, +0x40270248, +0xd4d59027, +0x765e0258, +0xe6f381fa, +0x7102123f, +0x48d6a9f2, +0x47424702, +0xfcd4bd37, +0x1cd3bd02, +0x4ad6ad03, +0xfa515e02, +0x4127f371, +0xd4d5433b, +0x435e02d8, +0xd5f393fb, +0x34d105a5, +0x421102d4, +0xf9a62fe6, +0x061221e0, +0x07e0d1c1, +0xdcd3c142, +0x340e412b, +0xf99221ee, +0xd49d4127, +0xadf3936c, +0x34d105a5, +0xd7d102d4, +0x44110258, +0x30272227, +0xf2757183, +0xd4c5f385, +0xf9a45ee0, +0x2027c027, +0xd530fcc5, +0xd5024cdc, +0x5e0258d2, +0xf393f945, +0xd105a57c, +0x1102d434, +0xaecff64c, +0xe0d3c101, +0x31c03013, +0xdcd1c114, +0x02be0c07, +0x02e40069, +0xf4b1f938, +0xfc644fe6, +0xffff4ea7, +0x7440d1ff, +0x121c2716, +0xe6be0123, +0x04f90068, +0xff001678, +0x05a241e0, +0x03c4d3b9, +0xd7d1f375, +0x40270258, +0xf4857183, +0xb1f9395e, +0xc62ff6f2, +0xe6f391fa, +0xc1fac03f, +0xf493ecd3, +0x8d05a49c, +0x4e274643, +0xc5010000, +0xd3c5e8d4, +0xfaa75edc, +0x02d4c4d1, +0xd4d54411, +0xd35e02cc, +0x58d4d1f9, +0xd5412302, +0x5e0258d4, +0xe7bef8ad, +0xc007ff61, +0x4b07cfab, +0x4fabc103, +0xc103c49b, +0x0000cef4, +0x07f7de01, +0x6856be0b, +0xbe0c07ff, +0x5eff6866, +0xd9bdf7cf, +0xe65e025e, +0xc24ff6f8, +0x45dbb9fd, +0xbd432702, +0x5e02b7d4, +0xa1e0f9b6, +0xa2e0047d, +0xa3e00256, +0xa5e0056e, +0xa6e005cd, +0xa7e00604, +0xa8e0065e, +0xf271069e, +0x423b4b07, +0x02d8d4d5, +0x93f9e95e, +0x05a47bf2, +0x02d424d1, +0x4b11c507, +0xbccec103, +0xdcd4c131, +0x0b071c07, +0x02be149b, +0x08660068, +0x04b7cbe2, +0x03cbd4b9, +0xbfe64726, +0xd2d104ad, +0x73270258, +0x21832123, +0xf2753027, +0x4f5ef385, +0x58d7d1f8, +0x27332702, +0x75718340, +0x5ef485f3, +0xd4a9f83e, +0xd5d5024a, +0x41030250, +0x024ad4ad, +0x0248d4ad, +0x99fdd35e, +0x41e0b7d4, +0xf2710439, +0x3427a723, +0xd3bd4247, +0x3a0702fc, +0x031cd4bd, +0xa7033f6b, +0x02c632f0, +0x0248d6a9, +0x71f85a5e, +0x48d6a9f2, +0x47474702, +0xfcd4bd32, +0x1cd3bd02, +0xf8455e03, +0xf2714127, +0x323b3407, +0x34ab473b, +0xd3d538a3, +0x135e02d8, +0xe0d2c1f9, +0xd4c13c07, +0xee322bdc, +0xeefe6334, +0x5efe49c2, +0x94d1fe5c, +0x4cfc0168, +0x93012d20, +0x05a3a3f2, +0x02d424d1, +0x11e8dcc1, +0xab2c0743, +0x8823ee2f, +0x95402704, +0xff4ea7f4, +0x40d1ffff, +0x1c271674, +0xbe012312, +0xf900671d, +0x00167804, +0xe24ff6ff, +0xdcd2c103, +0xd1e4d2c5, +0xf8016894, +0xf6de204c, +0xff6b9dbe, +0xf6d6c0ea, +0xdcc5c127, +0xf6ce5ee8, +0x02ccd4d1, +0xf8404ff6, +0x42275027, +0xd4bd3127, +0xd39d02b7, +0xe0d5c56c, +0xf830b2e4, +0xd1fb5f5e, +0xc102ccdc, +0x4c07e0d5, +0x41e0452b, +0x42e0015c, +0xcfe601f9, +0x4c070292, +0x2bdcd3c1, +0x6b34ee45, +0x8d5cee04, +0xbdf27104, +0xb103c6d2, +0xf73fe6f3, +0xdcd1c1f7, +0x9abe0c07, +0x0fe60066, +0xf2c1f7ea, +0xd2d4b930, +0x07242b03, +0xbd318332, +0xe402b7d3, +0x5ef7d9b2, +0xf293fb08, +0xd105a2d8, +0x1102d424, +0xcbcfe64c, +0xdcd4c1f6, +0x11031507, +0x0c07149b, +0x006660be, +0x019b0fe6, +0x03cfd4b9, +0x01934fe6, +0x030bc4f4, +0x0258d3d1, +0xf3754027, +0x03ccd7b9, +0x31833123, +0xf485f375, +0x27f6a95e, +0xb7d4bd42, +0xfaab5e02, +0xdbd59027, +0xf65e024c, +0xd50027f6, +0x5e02ccd0, +0xf293f75a, +0xd105a278, +0x1102d424, +0x03412743, +0xe8d3c531, +0x012893d1, +0xc5f0d49d, +0xb85eecd3, +0xc9d3b9fe, +0x75402703, +0xcad7b9f3, +0x5ef48503, +0xf271f65e, +0x03c4d4b9, +0x323b3b07, +0x243b2b07, +0xd3d532ab, +0x9f5e02d8, +0x31f293f7, +0x24d105a2, +0x431102d4, +0x03d931e0, +0x041432e0, +0x07dcd4c1, +0x07110315, +0x0b149b05, +0x65b3be03, +0x6002f000, +0x4102e004, +0x58dcd104, +0x07132702, +0xbe01230c, +0x6b00659d, +0x07f0750f, +0x2702230c, +0x658fbe13, +0x27700700, +0x857f6b21, +0xf5f45ef2, +0x03bca8e0, +0x4207f371, +0x233b473b, +0x4ca342ab, +0xd8d4d51c, +0xf7185e02, +0xd49d4227, +0xfea45e6c, +0x03c6d3b9, +0x0258d0b9, +0xfb5ef375, +0x27b6d6f8, +0xbd402735, +0xbd03ccd3, +0xbd03cdd4, +0xbd02b7d3, +0x0703cfdb, +0xdcd4c1c5, +0xd5d1c103, +0xc49b02cc, +0x1c070507, +0x00652cbe, +0x050708d6, +0x28be1c07, +0x01830065, +0xd0bd0403, +0xd0bd03cc, +0xf39302b7, +0xd105a170, +0x9902d434, +0xd4bd0444, +0xb1e403cd, +0xf293f656, +0xd105a15c, +0xb902d424, +0x9902b7d3, +0xd3bd0444, +0xd4bd03d0, +0x3f5e03cf, +0x58d4d1f6, +0xd2d3b902, +0x2b202703, +0x854f6b43, +0xf5385ef2, +0x0248d6a9, +0x945e7227, +0x9d4427f5, +0x035e6cd4, +0x58d7d1fe, +0xccd4b902, +0x83202703, +0x85f47571, +0xf5205ef2, +0x024ad2a9, +0x0248d2ad, +0x76f97a5e, +0xbd4327b7, +0x9302b7d4, +0x05a0f7f4, +0x02d443d1, +0xbd043399, +0x5e03cbd3, +0xb1e4f5e2, +0xf293f5da, +0xd105a0e0, +0x9902d424, +0xd4bd0444, +0xcb5e03cb, +0xcdf393f5, +0x34d105a0, +0xb50702d4, +0x11dcd3c1, +0x07b1034c, +0x07139b1b, +0x6457be0c, +0x920fc600, +0x03cfd4b9, +0xea8b4fc6, +0xb9fdfbcb, +0xe203cdd0, +0xd102c10c, +0xb90258d7, +0x2703ccd2, +0x75718330, +0x5ef385f2, +0x3227f49e, +0xd3bd4127, +0xd49d02b7, +0xb7d4b96c, +0xc4d3bd02, +0xc5d4bd03, +0xe0dcc503, +0x07fd645e, +0xdcd4c1c5, +0xd5d1c103, +0xc49b02cc, +0x1c070507, +0x0063fcbe, +0x050706d6, +0xf8be1c07, +0x01830063, +0xd0bd0303, +0xd0bd03c8, +0xb2f402b7, +0xd3b9f536, +0xd4b903c9, +0xd3bd02b7, +0xd4bd03ca, +0xb2e403c9, +0x555ef526, +0x07f371f8, +0xa3433b4a, +0xd8d4d544, +0xf5845e02, +0xa016f293, +0xd424d105, +0xdcd3c102, +0x15074c11, +0x05071103, +0x0c0b139b, +0x0063a0be, +0x00b10fe6, +0x00adc1e0, +0xf6cac2e4, +0x0258d0d1, +0x01231327, +0x006388be, +0x21270f6b, +0xf0757327, +0xeb5ef285, +0x47a723f3, +0xfcd4bd47, +0x07342702, +0x1cd3bd4a, +0x034f6b03, +0xcd42f4a7, +0x48d6a9fb, +0x75322702, +0xf4215ef3, +0x0258d7d1, +0x20274227, +0xf4757183, +0xb75ef285, +0x58d4b9f3, +0x85202702, +0xf3a05ef2, +0x03c6d2b9, +0x5f5ef275, +0xe4d3c1fa, +0x5edcd3c5, +0xb6b6fc1f, +0x40273427, +0x03ccd3bd, +0x03cfd4bd, +0x02b7d3bd, +0xe4f46d5e, +0x93f465b1, +0x059f6bf2, +0x02d424d1, +0xbd044499, +0x5e03cfd4, +0xd0b9f456, +0x01230258, +0x31833007, +0xf3750103, +0xd1f6915e, +0x270258d0, +0xbe022313, +0x070062e1, +0x27332770, +0x757f6b41, +0x5ef485f3, +0xf371f342, +0x433b4b07, +0xd4d548a3, +0x8b5e02d8, +0x714127f4, +0x3b3407f2, +0xab473b32, +0x103ca334, +0x02d8d3d5, +0x99f4595e, +0x4fe6f0d4, +0xd3c1fb75, +0x6e23eee0, +0x8ca1e0fb, +0x66a2e401, +0xecd4c1fb, +0xfb5f42f0, +0x3127232b, +0x4027f395, +0x9ddcd2c5, +0x525ef0d4, +0x27f271fb, +0xa3423b41, +0xd4d53c4c, +0x1b5e02d8, +0x07f271f4, +0xa3423b4b, +0xd8d4d548, +0xf4285e02, +0xf2714127, +0x323b3407, +0x34ab473b, +0xd5303ca3, +0x5e02d8d3, +0xd4b9f3f6, +0x42e403c5, +0x3327fe16, +0x27fe135e, +0xb5d4bd45, +0xf2615e02, +0x4b07f371, +0x4ca3433b, +0xd8d4d518, +0xf3ec5e02, +0xffff4ea7, +0x7440d1ff, +0x121c2716, +0x12be0123, +0x04f90062, +0xff001678, +0xfb5b4fe6, +0x03c4d3b9, +0xd3bd4127, +0xd5c503c5, +0x6cd49de0, +0x02b7d3bd, +0xd1fb445e, +0x270258d0, +0xbe022313, +0x070061e5, +0x27342770, +0x757f6b41, +0x5ef485f3, +0xf271f246, +0x423b4b07, +0xd5104ca3, +0x5e02d8d4, +0xf371f38e, +0x473b4207, +0x42ab233b, +0xd53c4ca3, +0x5e02d8d4, +0xd4c1f35e, +0xa641e0dc, +0x58d0d100, +0x23132702, +0x619fbe01, +0x270f6b00, +0x75742741, +0x5ef485f0, +0xf371f202, +0x433b4b07, +0xd5304ca3, +0x5e02d8d4, +0xc4c2f34a, +0x58d7d14c, +0xd0d4b902, +0x83202703, +0x85f47571, +0xf1dc5ef2, +0x0258d0d1, +0x01231327, +0x006160be, +0x03c7d7b9, +0x41270f6b, +0xf485f075, +0xd1f1c15e, +0x270258d0, +0xbe022313, +0xb9006145, +0x0703c7d2, +0x6b312770, +0x85f2757f, +0xf1a45ef3, +0x04c00c1b, +0x4602c036, +0xf18401e4, +0x0258d4d1, +0xf4752027, +0x03ccd7b9, +0x41834123, +0xf285f475, +0xc1f1815e, +0x4ff6ecd4, +0xd65efe7c, +0x272327f9, +0x75742731, +0x5ef385f2, +0xd7d1f16a, +0xd3b90258, +0x402703cc, +0xf3757183, +0x575ef485, +0x58d2d1f1, +0xb9f27502, +0x5e03ccd7, +0xfc4ef8f0, +0xf093c007, +0x7e059d30, +0xf493e2d4, +0x27022da2, +0x8ec41500, +0x5bf04efc, +0x2bdf3bcf, +0x07fc4efe, +0x9538be0f, +0x00ff1eff, +0xff1eff1e, +0x2d89fd4e, +0x07ed0752, +0x160dc23d, +0x031014a9, +0x3407430b, +0x238d3fab, +0xcae30752, +0x2d89ef30, +0x5d402752, +0x140ece24, +0x41034007, +0x4dce3027, +0x59237d18, +0x2a12bd22, +0x27fd8e03, +0x07245d41, +0x27410340, +0xead4ce30, +0x237d3127, +0x12bd2259, +0xfd8e032a, +0x03d1fa4e, +0xc00701a8, +0x024934b9, +0xd207b107, +0x008e4fe6, +0x1407e307, +0xe4a9a027, +0xb4ca024e, +0x50e4a943, +0x3c4bc202, +0x024ce4a9, +0xe3d4c3c1, +0x1f3c0343, +0x35534303, +0x024ae2a9, +0x4123432a, +0x89fc34c2, +0x020750c3, +0x2a8703e3, +0x2d0b3123, +0x30073012, +0xc389232d, +0x12312350, +0x4d430743, +0x03a10324, +0xb3f1f0e8, +0x8924a2c8, +0xd24908d1, +0x073812ca, +0x03d36942, +0xdad02941, +0x43072543, +0x2d4403ca, +0xca4107d4, +0xd44d3512, +0xa1c4a123, +0x49d42912, +0x27d46dd3, +0x08d38d41, +0xfa8ed41d, +0x4a07a027, +0xd41d4f6b, +0xd14dfa8e, +0x2908d28d, +0x49d369d4, +0x08d189d2, +0xd46dd32d, +0x4207b61e, +0xd44da123, +0x4007c91e, +0x4107d42d, +0x1ebc21c2, +0xa7f84eee, +0xffffff4e, +0xd10a0399, +0x07010844, +0x6a3fc6b0, +0x4853a407, +0x9f6b9407, +0x0710ac53, +0x27eb0703, +0x27c0a780, +0x58e299d0, +0x32874207, +0x340b4433, +0x13ff2cc0, +0x03cc34f1, +0x1127ff00, +0x4ed81d3b, +0x26040000, +0xd103c1eb, +0xf0f0e103, +0x2eb441d9, +0xceb43184, +0x4ea7204c, +0xc5f7ffff, +0x48c5444c, +0x45002748, +0x8ebc35b8, +0xdb92cef8, +0x8c338d07, +0x1e8aab10, +0x8e0427d2, +0x27c027f8, +0x4ecf1e80, +0xff3ea7fe, +0x4027ffff, +0x150034d5, +0x14f834d5, +0x14fc34d5, +0x03080ea9, +0x016a02b9, +0x322b3e07, +0x3e0b2307, +0x4e2b4307, +0x07f641c8, +0x0708330e, +0x530cbe12, +0xff4ea702, +0x40d5ffff, +0xfe8e13b4, +0x00000180, +0x00000100, +0x00000080, +0x0499f54e, +0x07faa3da, +0x514ff660, +0x0c609908, +0x016b64b9, +0xe090f0c5, +0xc1063d42, +0x67c1ac62, +0xa464c1a0, +0x6399f215, +0xc1f31de3, +0xf025b060, +0x3de46199, +0xb462c1f1, +0x6399f235, +0xc1f35de5, +0xf0c5bc60, +0xd547fa8c, +0x83470700, +0x34870f4c, +0x340b4433, +0x13c13df9, +0x6cd1ff00, +0x9d870114, +0x13b83af1, +0x4907ff00, +0xec483e23, +0x47460bff, +0x78f3c55c, +0xe29448c1, +0x07024fa5, +0x0bb433bd, +0x0b4b07b9, +0x2843d146, +0xe0310801, +0xc2022ed1, +0x4b070fac, +0x43d1460b, +0x3108012c, +0x0262d1e0, +0x41534c07, +0x070fa4c2, +0xd1460b4b, +0x08013043, +0x5ad1e031, +0x270c0702, +0x526bbe1a, +0x0fa0c202, +0x460b4b07, +0x013443d1, +0xd1e03108, +0xb60b024e, +0x0138b4d1, +0x020541e8, +0x01f6d1e0, +0x1a070807, +0xbed86b89, +0x070254f7, +0x02200b2b, +0x072b07b2, +0xc144034f, +0x940b78f0, +0x05c464c1, +0x09039992, +0x1f07421b, +0x0b0a0299, +0xc1321d31, +0x62c18cf3, +0x03340ba4, +0x8cf3c571, +0xff2f72f2, +0x02a465d1, +0x030863a9, +0x472b4507, +0x016a61b9, +0x57f2349b, +0x430701f7, +0x42e8412b, +0x623905af, +0xffff0ea7, +0x23212bff, +0x0803b921, +0x83470701, +0x2c830f4c, +0x2ba4870f, +0x0b443332, +0x0f3c83a4, +0xec48ae23, +0x8639f4ff, +0x09ad9908, +0x32874207, +0x432b4433, +0x422b9d87, +0x14f891f1, +0x4487ff00, +0x011443f1, +0x48f1ff00, +0xff000118, +0x23071586, +0x4187280b, +0x061b24ea, +0xffff4ea7, +0xb444d1ff, +0x07130713, +0x7cf4c504, +0x025436be, +0xf474f0c5, +0x8310010d, +0x74f3c106, +0x01013df0, +0x4d27087f, +0x0d27017c, +0x10270443, +0xb584f4c5, +0x30f1c5f0, +0x6bd14907, +0x460b0114, +0x479444c1, +0xc5a5013b, +0xf4c59cf3, +0x4c53e280, +0x33cd0708, +0x07c90bc4, +0xd1460b4c, +0x08012843, +0x57d1e031, +0x0f5bc206, +0x460b4c07, +0x012c43d1, +0xd1e03108, +0x4b0709ac, +0x54c24153, +0x0b4c070f, +0x3043d146, +0xe0310801, +0x070981d1, +0xbe1a270b, +0xc2025101, +0x4c070f50, +0x43d1460b, +0x31080134, +0x0973d1e0, +0xc4d1c60b, +0x41e80138, +0xd1e00829, +0xf2c10807, +0x07f0b174, +0x30f1c132, +0xbe1f3c73, +0x27025024, +0xc02780bc, +0xc14bb00b, +0x077cf0c1, +0x5375be18, +0x84f2c102, +0x200b4c07, +0x53184c33, +0x07b4abb8, +0x80f0c112, +0x5cbe1b0b, +0x6c890253, +0x03df07d8, +0x0bd90bd4, +0x07c0020c, +0x99d0050c, +0x3f0709a4, +0x0b0aaa99, +0xc14a1d43, +0xf1c1c464, +0xa465d18c, +0x0b142b02, +0xc5710310, +0xf1c598f4, +0x3675fa8c, +0xb9731e04, +0xf6011864, +0x07fdce4f, +0xfe165e83, +0x9b14bc27, +0xfdc15ebd, +0x011863b9, +0x840735f6, +0xe4fe035e, +0xb9fdffd1, +0xe4011863, +0x07fdf731, +0x0b43334c, +0xef4aea4c, +0xe24c8703, +0x5304dca4, +0x01fcfff2, +0xfdde5e28, +0x011864b9, +0xfd9a4ff6, +0xd15e8307, +0x1864b9fd, +0xa24ff601, +0x5e8307fd, +0x64b9fdc4, +0x4ff60118, +0x8307fdae, +0xc1fdb75e, +0xf2c5c462, +0xc064c198, +0x011c60d1, +0x078cf2c1, +0x68f4c514, +0x2b6cf0c5, +0x6301e812, +0x99200703, +0xf0c5a860, +0xc501033c, +0x02fa94f0, +0xf3c10201, +0x07039b98, +0x68f4c1d0, +0x14071412, +0x02ad11e8, +0xbecd0c27, +0x0702526f, +0x7060d1c0, +0x70f0c501, +0x02550ff6, +0xad071027, +0x3c07b027, +0xf145fd55, +0xe888f3c5, +0xc1027e31, +0x0ff690f0, +0xf1c101f6, +0x981ff63c, +0x68f9c100, +0x68991127, +0x279353a9, +0x270027d0, +0x34f1c520, +0x99ab6799, +0x74e0aa61, +0x73e001f4, +0xf3c103d5, +0x98fcc18c, +0x092b031b, +0xc22b1f6b, +0x024f25be, +0x2b6cf4c1, +0xa641e8c0, +0x73d9f003, +0x6bd15302, +0xe05d02df, +0xc1040773, +0x825398f8, +0x02e6d5ea, +0x016b64b9, +0x022241e0, +0x021e43e0, +0x034564b9, +0x4ff6dc07, +0xf0c10237, +0xc50d1288, +0xf1c188fd, +0xc5811288, +0x64c188f8, +0x0060d1fc, +0x0461d101, +0xf46dc101, +0x48f86ec1, +0x6cf2c141, +0xee34f3c1, +0xc102fc23, +0x4f0790f3, +0x4719430b, +0x41e8f441, +0x34070283, +0x27654c08, +0x4307643c, +0x13074223, +0x03079407, +0x071f1c73, +0x1f9c7384, +0x3b072a07, +0x024e17be, +0x27642c27, +0x3786be30, +0x33400700, +0x27040b44, +0x7bbe141c, +0x00e8024e, +0xf151023f, +0x124cf0c5, +0x4cf1c501, +0xc5da6299, +0x2ff640f2, +0x649903d2, +0x324fe6dc, +0xe16d9904, +0x5ae26c99, +0x12dc077d, +0xc1d707c7, +0x2df640f2, +0x016a63b9, +0x030864a9, +0x394343c2, +0x2b150764, +0x83412343, +0x34070f4c, +0x11232487, +0x322b3433, +0x2b0f1c83, +0x33218734, +0x0b338714, +0xc121f921, +0xf1ff0013, +0x00011830, +0x1434f1ff, +0x87ff0001, +0xf5400b11, +0x0014f814, +0xa465d1ff, +0x83450702, +0x24870f4c, +0x240b4433, +0x23f53027, +0xff0013b8, +0x02a464d1, +0x1e231207, +0xd6ffec48, +0x64c1664f, +0x333447c4, +0xf5340b43, +0x0013bc23, +0x7064d1ff, +0xc1456601, +0x23f588f3, +0xff0013bc, +0x9d0a1d9d, +0xf0c1081d, +0x09109d90, +0x4ea70576, +0xd5ffffff, +0x07184c4d, +0x8efa830d, +0x68f0c1f5, +0x538cf4c1, +0x27041b03, +0xbe03331a, +0xc1024d8e, +0xf2c198f1, +0x98f3c194, +0xd107129b, +0x31f2102b, +0x1307fde5, +0xc1fde05e, +0x24f588f4, +0xff0013bc, +0xf9c1af1e, +0x3cf2c168, +0x2ff69353, +0x312700ce, +0xc5a96899, +0x679934f3, +0x27d027ab, +0xaa619900, +0xfe1074e4, +0xc168f3c1, +0x31538cf4, +0x071043d2, +0x0b417343, +0x8cf3c143, +0x34121153, +0x11ec1153, +0x1127fdf6, +0x45fdf15e, +0xd301e8f0, +0xec400701, +0x00f4650c, +0x04071407, +0x271f1c73, +0x072d07b0, +0x4c8ebe3b, +0x27302702, +0xfdbe642c, +0x64d10035, +0xad070174, +0x4fe63007, +0xfd550086, +0xec88f3c5, +0x27fd8631, +0x88f4c541, +0x27fd7e5e, +0xfd5b5ec1, +0x07d469c1, +0xc3c1e81c, +0xbe090701, +0x07024fb7, +0x071807d0, +0x4fadbe09, +0x4564b902, +0xe6800703, +0x07fdcd4f, +0x7860d11c, +0xa4c1e801, +0x4f95be01, +0x5ed00702, +0xf8c1fdba, +0x5e825398, +0x02e4fd9c, +0x1127f9c3, +0x5e90f1c5, +0xf011f9bb, +0x0798f4c1, +0xbe042b12, +0xe8024c86, +0x9900b700, +0xf1c1a968, +0x3cfdc194, +0x089b2007, +0x5e34f1c5, +0x0433fd2c, +0x1c27030b, +0x4c64be14, +0xe8fd5502, +0x12008e00, +0x070d070d, +0xe90cf230, +0x5e3c07fc, +0x6399fce4, +0x98f4c1a8, +0x033cf3c5, +0x07439b31, +0x94f3c5d4, +0x27fca45e, +0x4cf0c500, +0x27fdc75e, +0xa7102701, +0x5e90a780, +0x4c27fd90, +0xff0a5e64, +0xfd1a73e4, +0x5ec88c27, +0xf153fd14, +0x1801f914, +0xc1f9f75e, +0xf2c5c462, +0x07470798, +0x2b410315, +0x5d54fa17, +0x005fe007, +0x55800000, +0x83470707, +0x24870f4c, +0x240b4433, +0x13c123f9, +0x7103ff00, +0x22f93556, +0xff0013c2, +0xf100f21d, +0x27fc0c5e, +0xff755e00, +0x485e0027, +0x0473e4ff, +0xd01efafd, +0xc81eee00, +0x6cf2c100, +0x1e6b0d2b, +0x3207242b, +0xbe1f3c73, +0x070034a8, +0xe401e8d0, +0x1864b9fc, +0xbd4ff601, +0xbe1a2700, +0x07024b96, +0x88f1c14d, +0x145a402b, +0x41070d0b, +0x00bf01fa, +0xf288f4c5, +0xc5fcbe84, +0xb85e88f8, +0x98f8c1fc, +0xd9f08253, +0xd153fc6c, +0x5de2df6b, +0x455efc64, +0x68f3c1ff, +0x538cf4c1, +0x1c34fa31, +0x2794f2fe, +0x5e1153fe, +0x0127fe22, +0x385e1027, +0x534107fe, +0xe124e242, +0x073207f9, +0x033833df, +0x07d90bd4, +0x4b63be03, +0xbed10102, +0x89024e13, +0xbe5ed86c, +0x0b4507fa, +0x05a4e24c, +0x21f353f9, +0x5e3801f8, +0x1127f8fc, +0x27fe3c5e, +0xfe5b5e11, +0x078cf0c1, +0xbe091b18, +0xc1024afe, +0xc00b98fc, +0xe2fbea5e, +0xc1ff38d0, +0x2ce888f2, +0x27ff30c9, +0xf3c5c83c, +0xff275e88, +0xdbbe1527, +0x4d07024a, +0x2b88f2c1, +0x4d24fa40, +0x070d0bff, +0x4520f242, +0x5e4007ff, +0x0ef4ff40, +0x62010001, +0xfd4d2702, +0x3a0d2711, +0xc5102703, +0xf0b584f4, +0x5e30f1c5, +0x64b9f980, +0x4ff60118, +0xf3c5f9a5, +0xf9ec5e80, +0x5ef7567e, +0x6399f7ad, +0x38f3c5ab, +0x99e16d99, +0xf7a5e26c, +0x016d64b9, +0xf4c145e6, +0x39454690, +0x12f0a1f4, +0xc1f4a540, +0x1a2670f1, +0x9640f2c1, +0x90f3c129, +0x64d138f6, +0x48360174, +0xc188f4c1, +0x04ee4cf0, +0xf21102b1, +0x654cf3c1, +0xc823f2f2, +0xa1470701, +0x124103f0, +0xc1f4a540, +0x34e038f3, +0xf1a10143, +0x011cd1f2, +0xd85e7d07, +0xdd6499fb, +0xfbcb4ff6, +0xf690f4c1, +0x3905584f, +0x6cf1c1f0, +0x8594f2c1, +0xa812eef0, +0x0864d104, +0x8c42e801, +0x3cf1c104, +0x048519f0, +0xf281f319, +0x31e8322b, +0x64b905e5, +0x3173016c, +0x242b4f4b, +0x3c27230b, +0x95f27533, +0xab6499f3, +0xe038f4c5, +0xc105b944, +0x15c670f1, +0x017464d1, +0x019c41e0, +0x01844fe6, +0xc1e16d99, +0x23e038f2, +0x64b9029b, +0x46460345, +0x034664b9, +0xf2714586, +0x32faf381, +0xf39505ba, +0x6c99f071, +0x82d0f2e2, +0x91fda501, +0x6fd2f2f2, +0xc12d0701, +0x32e038f3, +0xf1c10229, +0x4412c090, +0x0790f3c1, +0xc143870f, +0x400b6cf1, +0x11e84011, +0x3ff6020c, +0xf3210208, +0x34e2f411, +0xf4810200, +0x32070307, +0x2312f2a1, +0x61c13207, +0xd062c1cc, +0xc164f1c5, +0xf2c588f1, +0x5d01e260, +0x3743fa01, +0xa1f3a501, +0xad17eef1, +0xecf1a101, +0xfeb6191c, +0xe490f2c1, +0xb9feaf21, +0xe4011864, +0x81fea741, +0x124123f4, +0xa14d07d4, +0x9943f2f3, +0x5ef4a5fe, +0xf7a1fe94, +0xfabd7cf2, +0xb85e7c07, +0x0d1c27fa, +0xf3e83107, +0x010804b9, +0x4c83422b, +0x6a49f00f, +0xc1ee1ef7, +0x41e4ec64, +0xf4c1feba, +0x99460b90, +0xf4a5f044, +0xe490f4c1, +0x39fea941, +0x07f0a1f3, +0xda432343, +0x33030904, +0x03124007, +0xf4a54307, +0x27fe915e, +0xcd9b14cc, +0x27f7c45e, +0x2d271f1c, +0x3027059f, +0xb584f1c5, +0x30f3c5f2, +0xb9f7835e, +0x86011863, +0xf331e436, +0x334b07f7, +0xe24b0b43, +0x27016254, +0xc501804d, +0xdf5e80f4, +0xdbd1e4f7, +0x1863b9f7, +0x07df1e01, +0x073b072a, +0xbe190708, +0x270247fc, +0x3027642c, +0x00316bbe, +0x10f2f161, +0xf2a1fe2b, +0xfe2572f2, +0x205ef7a5, +0x1e1d27fe, +0x722d27da, +0xc5302702, +0xf2b584f1, +0x5e30f3c5, +0xf411f720, +0xf24cf2c1, +0x99fe7742, +0x3c27e16d, +0x5ef39533, +0x6d99fe6f, +0x5efd75e1, +0xf291fe67, +0xfe912cf2, +0x8c5e2c07, +0xa5f171fe, +0x7c1cf2f1, +0x5efca5fe, +0x1007fe77, +0xc560f0c1, +0xf4c5a0f3, +0x4aedbea4, +0x88f2c102, +0xc1a0f3c1, +0x02c2a4f4, +0x1534ce18, +0xdf1e4103, +0xc288f1c1, +0xf2a13c10, +0x071324da, +0xfe9b5e32, +0xf4a13407, +0xfe9343f2, +0x8e5e3407, +0xc11007fe, +0xf3c564f0, +0xa4f4c5a0, +0x024aaebe, +0xc188f1c1, +0xf4c1a0f3, +0x1010c2a4, +0x24cef2a1, +0x1e41230b, +0x12f0a1dd, +0xf2400704, +0x1efe6034, +0xa14707cc, +0xf24223f1, +0xa5fd4941, +0xfd445ef4, +0x0790f2c1, +0x0b42873f, +0xc1421143, +0xf4c18cf3, +0x0b342b98, +0x3e30ec32, +0x230707fe, +0xf2f0a501, +0xa5fe34d0, +0xfe2f5efd, +0x035e4707, +0x90f4c1fe, +0xfdd44ff6, +0xe63cf0c1, +0x5efdd30f, +0x64b9fe13, +0x4fe60118, +0x785efcb2, +0x1864b9f6, +0x894ff601, +0xfca45ef6, +0x011864b9, +0xfc9c4fe6, +0x87f64d5e, +0x4854e24b, +0x000d2703, +0x80f0c501, +0xc1f6795e, +0x31e090f3, +0xf2c1038e, +0x5b21e86c, +0x68f0c1fd, +0x538cf3c1, +0x3630f203, +0x90f4c103, +0x01054ff6, +0xd43cf0c1, +0xf4190b08, +0x4103f171, +0xf4754112, +0xf291f171, +0xf3711232, +0xf0c1f395, +0x2701e490, +0x3cf3c1fd, +0xc15539d0, +0xf0c16cf2, +0x73320798, +0x10271f3c, +0x024653be, +0x31072007, +0x012060d1, +0x012461d1, +0xc544f0c5, +0x31fa48f1, +0xf1c10120, +0x1513ee48, +0x07420701, +0x1d4c5313, +0x13330207, +0x033314ab, +0x134b020b, +0x30272a27, +0x002f93be, +0xfa48f2c1, +0xee00ea12, +0xd100df12, +0xd1010061, +0xc5010462, +0xf2c550f1, +0x27010754, +0x27120730, +0x2f6ebe2a, +0x98f3c100, +0xc58cf4c1, +0x61c15cf1, +0x0b2347bc, +0x0b141b23, +0x73410712, +0x21071f4c, +0xf0c53407, +0xf861c158, +0xc1f460c1, +0x200bfc64, +0x41c8314b, +0x6cf4c127, +0xf4c14876, +0x1a41fa54, +0x0f14ee03, +0x54f4c103, +0x02f343fa, +0x02e834ee, +0xfa54f4c1, +0xee02b414, +0xc102a914, +0x41533cf4, +0xfc5445e2, +0xf181f081, +0x11030123, +0xf195f075, +0xc1fc455e, +0x21e490f2, +0xf481ff08, +0x4323f371, +0xf4754312, +0xf091f481, +0x04124a03, +0xf1c1f495, +0x94f2c16c, +0xfeea21ee, +0x45075123, +0x870f4c83, +0x0b443334, +0xc132f934, +0x03ff0013, +0xd12ff651, +0x91f419fe, +0x124a03f3, +0x71f49534, +0xf2f091f4, +0x75fed040, +0xfecb5ef0, +0xe244f4c1, +0x81ff1e40, +0x750123f0, +0xff155ef0, +0xfeeb02e2, +0x4c0cf481, +0x234c2723, +0x4212f271, +0xf371f475, +0x34f2f491, +0xf475fefb, +0xb9fef65e, +0x81016c64, +0x2b4f4bf2, +0x333c2724, +0xf395f275, +0xd1fb885e, +0xe8011061, +0xd1009711, +0xbe010c60, +0x8102455a, +0x070312f3, +0x0864d103, +0x6f42c801, +0x64b9f219, +0x3207016c, +0x302b4f4b, +0x3fcc042b, +0xfffffffb, +0x07430b39, +0x1f1c5314, +0x1173140b, +0x4207100b, +0x4323f175, +0xf4754112, +0xf081f471, +0xf0754012, +0xfff73fcc, +0x2725ffff, +0xf195331c, +0xf471f391, +0xfb2343f2, +0x1e5ef375, +0x754207fb, +0x124323f0, +0x71f47540, +0x12f381f1, +0x03f37513, +0xc8f29523, +0x27da342c, +0xf295332c, +0x64b9d31e, +0x4f4b016c, +0xf075042b, +0x95330c27, +0xfaeb5ef0, +0x765ef081, +0x90f4c1ff, +0x392741c0, +0x331c27f3, +0x64b9f385, +0x4f4b016c, +0x6099f475, +0xc5430bab, +0x6d9938f0, +0x95f475e1, +0xfadd5ef1, +0xaa5e1127, +0x075123f8, +0x0f4c8345, +0x44333487, +0x32f9340b, +0xff0013c1, +0x2f265103, +0x4027f339, +0x03230307, +0xf075f385, +0xf4754012, +0xc5ab6199, +0x12c038f1, +0x3414c037, +0x95334c27, +0x105cf0f4, +0x64b9fa98, +0x4fe6032b, +0x4307fa90, +0x4103f191, +0xf4951412, +0xfa822ff6, +0x43e2f419, +0xf291fa7c, +0x24f24103, +0xf495fa74, +0x07fa6f5e, +0x95030303, +0x19cb1ef0, +0xcaf339f4, +0x4027a734, +0xf419a31e, +0x4323f071, +0xfa4140f2, +0x3c5ef475, +0x6c62b9fa, +0x4bf08101, +0x07320b2f, +0x1f4c5343, +0x4173430b, +0x040b022b, +0x75331c27, +0x5ef195f0, +0xf481fa11, +0xf495f475, +0xc1fa435e, +0x4b0b9cf4, +0xf33454e2, +0xc5801c27, +0x2b5e80f1, +0x8cf4c1f3, +0xfce804f2, +0xc16cf3c1, +0x34d294f4, +0x90f0c11b, +0xf41906f6, +0x1412f191, +0xf171f495, +0x12f2f291, +0xf275fcca, +0xc1fcc55e, +0x21c490f2, +0x81f391ee, +0x953412f4, +0x71f481f4, +0xd24323f0, +0xf475dd04, +0xf4c1d91e, +0x0441e86c, +0x98f4c1fd, +0x5388f0c1, +0x6a40ee42, +0x71f419fc, +0x6241f2f1, +0x5ef475fc, +0xf3c1fc5d, +0x5430e250, +0x50f2c1fd, +0x2b54f3c1, +0x07316b20, +0x5cf3c113, +0x135a0207, +0xfd3d31ee, +0xe258f2c1, +0x81fd3620, +0x23f481f3, +0x75410331, +0x5ef495f3, +0xf4c1fd27, +0x1524e250, +0x81f071fd, +0x751012f1, +0x91f271f1, +0x1023f2f3, +0x5ef375fd, +0xf4c1fd0b, +0xee04e250, +0x0cf481fc, +0x4c27234c, +0x12f07123, +0x71f47540, +0xf2f291f1, +0x75fcee12, +0xfce95ef2, +0x06d1f54e, +0x4ea701a8, +0x07ffffff, +0xa46ad190, +0x5840d102, +0x2bf06315, +0x05a183a0, +0x07ca47f2, +0x0125332a, +0x5cc4e9f8, +0x07ff0015, +0x075107b2, +0xb9843373, +0x23032561, +0xffea98be, +0x23f14586, +0xff001568, +0x008b34ee, +0xc3e9fd01, +0xff001560, +0xd433d10b, +0xe929d3c2, +0x00155cc4, +0x1e344aff, +0x5cc4e91f, +0xc2ff0015, +0x0d271243, +0x95be641a, +0xc3e90224, +0xff001560, +0xd1e73dca, +0x0101a896, +0xab4007b0, +0x0484ea4f, +0x07b01102, +0xea4fab40, +0x21023b84, +0xab4007b0, +0x3584ea4f, +0x07b03102, +0xea4fab40, +0x41022f84, +0xab4007b0, +0x2984ea4f, +0x07b05102, +0xea4fab40, +0x61022384, +0xab4007b0, +0x1d84ea4f, +0x07b07102, +0xea4fab40, +0x1e021784, +0x60c4e9ff, +0xeeff0015, +0xc1ff6f43, +0x9ec1b09d, +0xc09cc1b8, +0xc1b494c1, +0x92c1bc93, +0x9bd59bc4, +0x0bc59be5, +0x0be30bd4, +0xd094c1c2, +0x2b646389, +0xff2ea748, +0x24d5fddf, +0x3d8301c8, +0x3fe68000, +0x25d50155, +0x64b901fc, +0x4cc00320, +0x94891dff, +0x03f10150, +0x9b43e343, +0xd892c141, +0x41534533, +0x3ea7420b, +0xc5fddfff, +0x37077434, +0x07137c03, +0x7f3ce327, +0x237f2ce3, +0x3419137c, +0xc2803c03, +0x4707f932, +0x35272027, +0x44034205, +0x93d1f3c8, +0x34b901a8, +0x4fe60248, +0x34b900e4, +0x4cc00320, +0x928955ff, +0xff3ea750, +0x2303fdef, +0xe38834c1, +0x33f10123, +0x184c3325, +0x4c53129b, +0xc111531d, +0x9ec1c890, +0x1344c4d8, +0x4327d307, +0xd3c1f4e8, +0x183c3388, +0xc01d3c53, +0x4ea7f134, +0x0bfde5df, +0x15400501, +0x35302742, +0xa71e0b43, +0xfde5cf4e, +0x42154105, +0xfd014335, +0xd1532707, +0x1d070907, +0x997e2a03, +0x07d5a6ec, +0x0711231d, +0x7e270709, +0x94c1ec8c, +0x004da3dc, +0xdc94c520, +0xc60a7399, +0x74897d3f, +0x0c72890e, +0x83127389, +0x890fff4d, +0x2d831071, +0x4c330fff, +0xff3d8310, +0x3342ab0f, +0x2ea7103c, +0x83fddfff, +0xd50fff1d, +0xab020024, +0x0423d531, +0xa894d102, +0x2043b901, +0xff3cc003, +0xff3ea71c, +0x34c1fdef, +0x6a4dd88c, +0x23070ffc, +0xf4e84327, +0xdc8c23c1, +0xf5fc6a3d, +0x01a893d1, +0x83643489, +0x5680004d, +0xff4ea745, +0x4cc5fddf, +0x8ef043e4, +0xdc2dc5f5, +0x5ee02ec5, +0x9489feaa, +0x27440850, +0xff4d8343, +0x104c330f, +0xdfff3ea7, +0x0034d5fd, +0x0434d502, +0x279b1e02, +0x2561b940, +0x33a33303, +0x100c5314, +0x96bea40b, +0x4a870240, +0xc1b09dc1, +0x9cc1b89e, +0xf1051bc0, +0x00162841, +0xa843f1ff, +0xf1ff0015, +0x0015e842, +0x9bc09bff, +0x0be09bd0, +0x0be20bd3, +0xfe2f5ec1, +0xbe1e4127, +0xba1e4227, +0xb61e4327, +0xb21e4427, +0xae1e4527, +0xaa1e4627, +0xa61e4727, +0x3ea7fe4e, +0x11fd7fff, +0x004de334, +0xa7341508, +0xfd4fff3e, +0x40273201, +0x270ef49b, +0xf52287e1, +0x02b0402e, +0xff1ea7ff, +0x4427fdcf, +0x14c53007, +0xd0382348, +0x21274232, +0xffff3ea7, +0x9632bdfe, +0x9b40271e, +0x1ec50ef4, +0x21d2be64, +0xa7202702, +0xfeffff3e, +0x1e9632bd, +0xf49b4027, +0xff3ea70e, +0x34c5fdcf, +0x6834c548, +0x7fff2ea7, +0xa32411fd, +0x1508004d, +0x27fe8e24, +0x4ebe1e22, +0xa813d1fd, +0x99d00701, +0x02070c34, +0xe06a4fc6, +0x99008b41, +0x4fd61034, +0xbe162768, +0xe8023fb1, +0xcc008302, +0x30076305, +0x35334087, +0x300b342b, +0x432b4387, +0x2c274447, +0x073d07d3, +0x833b330d, +0x029b7f0c, +0x9b123c53, +0x800c0334, +0x53803c03, +0x10385308, +0x0c27800c, +0x7f0c837f, +0x0000df83, +0x430701e0, +0x3d100dab, +0x4d274000, +0x4d833fff, +0x47333fff, +0xfd8e04ab, +0x27924c27, +0xba1ec12c, +0x27ae4c27, +0xb21ed32c, +0x30070427, +0x35334087, +0x300b342b, +0x432b4387, +0x9b1e4447, +0x27ba4c27, +0x961eda2c, +0x015c4d27, +0x14d18d1e, +0x100701a8, +0xd10c4299, +0x7602a043, +0x0932292c, +0x07410733, +0x834b3301, +0x029b7f0c, +0x9b124c53, +0x800c0343, +0x53804c03, +0x10485308, +0x0c27800c, +0x7f0c837f, +0x00001f83, +0x01ab01e0, +0x40004d10, +0x3fff4d27, +0x3fff4d83, +0x04ab4733, +0x21c0fe0b, +0x10449916, +0x32894546, +0x0833890a, +0x3289b41e, +0x0c33890e, +0x3269ac1e, +0xa61e3349, +0x01a814d1, +0x42991007, +0xa043d10c, +0x292c7602, +0x07330932, +0x33010741, +0x7f0c834b, +0x4c53029b, +0x03439b12, +0x4c03800c, +0x53085380, +0x800c1048, +0x837f0c27, +0x1f837f0c, +0x01e00000, +0x4d1001ab, +0x4d274000, +0x4d833fff, +0x47333fff, +0xfe0b04ab, +0x991621c0, +0x45461044, +0x890a3289, +0xb41e0833, +0x890e3289, +0xac1e0c33, +0x33493269, +0xfc4ea61e, +0x1227c007, +0x8cfef093, +0x1677be00, +0x93c11100, +0x008d0bf0, +0x00166cbe, +0xf093c121, +0xbe008d12, +0x01001661, +0x19f093c1, +0x56be008d, +0xc2310016, +0x8d20f093, +0xbe102700, +0x41001649, +0x13f093c2, +0x1127008d, +0x00163cbe, +0xf093c251, +0x27008d06, +0x162fbe12, +0x93c26100, +0x008cf9f0, +0x22be1327, +0xc2710016, +0x8cecf093, +0xbe142700, +0x81001615, +0xdff093c2, +0x1527008c, +0x001608be, +0xf093c291, +0x27008cd2, +0x15fbbe16, +0x93c2a100, +0x008cc5f0, +0xeebe1727, +0xc2b10015, +0x8cb8f093, +0xbe182700, +0xc10015e1, +0xf09330c2, +0x27008caa, +0x15d3be19, +0x34c2c100, +0x8c9cf093, +0xbe1a2700, +0xc10015c5, +0xf09338c2, +0x27008c8e, +0x15b7be1b, +0x3cc2c100, +0x8c80f093, +0x0c1c2700, +0x0015a8be, +0x9340c2c1, +0x008c71f0, +0xbe0d1c27, +0xc1001599, +0xf09344c2, +0x27008c62, +0x8abe0e1c, +0xff1e0015, +0x0199fa4e, +0xbed0070c, +0x270244c8, +0x27302740, +0x0dd49db0, +0xa7a0d3c5, +0xfeffffae, +0xc1a0d2c1, +0x32c2a4d3, +0xa8d4c137, +0xd4c5420b, +0xc5430aa0, +0xdcc1a0d3, +0xa0d3c1f4, +0x34c2c411, +0x0cd1991f, +0x92be0d07, +0xd0d10224, +0x1e2701ac, +0xbe01f40c, +0x11021f3c, +0xa0d4c1c3, +0xc1e334ca, +0xd3c1f8d2, +0x0b2411a8, +0x48241543, +0x38a4a9b8, +0xad41031e, +0xd11e38a4, +0x0301a8d3, +0x123489b1, +0xb4da4803, +0xff2ea79c, +0x23a9feff, +0x24a90144, +0x34ce0142, +0xd1c2071a, +0x2701acd0, +0xbe64181d, +0xa9021ef0, +0xa90144c3, +0xce0142c4, +0x4027ea43, +0x8e0ef49b, +0x5bf04efa, +0x2bdf3bcf, +0x07fc4efe, +0xe76ebe0f, +0x0efc0eff, +0x4eff0bf0, +0x3bcf5bf0, +0x4efe2bdf, +0xbe0f07fc, +0x1efffe2e, +0x07fb4eff, +0xfd89beb0, +0x07d007fe, +0x95f09310, +0x9abe008b, +0xd7460014, +0x0b1ec027, +0xc103d201, +0x00148cbe, +0x1c07d403, +0x8b87f093, +0xedcbda00, +0x0000fb8e, +0xe407fe4e, +0xe30b4623, +0x330f4c83, +0x023d0e3c, +0x3f83011d, +0x3ff00000, +0x20271333, +0xab104c33, +0x0012f543, +0xf5ff0214, +0x02140414, +0x270e2dff, +0x0ef49b40, +0xff1efe8e, +0xf94eff1e, +0xc107a007, +0x4714ac23, +0x091a0b11, +0x99d00713, +0x3e662409, +0x40070c07, +0x3b0c4c23, +0x23d20149, +0x0be48731, +0x0b4387e2, +0x01130d4e, +0x320cc24b, +0x493b4427, +0x30072047, +0x22231e07, +0xe007d407, +0x142b3123, +0xd0132a0b, +0x3ccaec2b, +0x27012341, +0x0b403b41, +0x0d31274b, +0x23140523, +0x581d0b22, +0x8e0b07fe, +0x034c07f9, +0x27244741, +0x0c071cec, +0xec2b2a0b, +0x1a1d4cd4, +0x01031207, +0xfef02203, +0x07b02707, +0x09f98e0b, +0x1e31e613, +0x1ee1278a, +0x1ee127bd, +0xe3f54ee4, +0x58f0c5f6, +0x27240299, +0x3b4f0731, +0x03e00732, +0xf2c5404c, +0x4cf3c554, +0x235cf1c5, +0x2f0714ec, +0x2768f4c5, +0x4027103c, +0x24032405, +0xf3c1f3b8, +0x2320274c, +0xc54a2731, +0xf2c540fe, +0x0d6c2748, +0xc560f3c5, +0xf2c164f4, +0x1a238940, +0xc5182789, +0x72f050f3, +0xf4c100b1, +0xaa34ee4c, +0x54f2c100, +0x4c234607, +0xc1423b0d, +0x048758f2, +0x030b2301, +0x01007fe6, +0xc150f4c1, +0x24e260f2, +0x46070103, +0x2354f2c1, +0x423b0c4c, +0x2350f2c1, +0x87420b61, +0x0b812754, +0x3b302753, +0x03a20786, +0xc5100761, +0x902744f3, +0x0201c707, +0x42073f07, +0x4c83465b, +0x0bd4870f, +0x0734013d, +0xe6e48be8, +0x0700854f, +0xd63207b4, +0x073407e4, +0x0b4307b2, +0x774bce48, +0x14031205, +0x91030403, +0x0748fcf0, +0x4634013f, +0x27140545, +0x05140340, +0x68f2c134, +0x32ce3403, +0x5cf3c1ed, +0xc16936ce, +0xf3c144f4, +0x8d471b40, +0x3a8d1834, +0x40f4c11a, +0x0364f2c1, +0xc5212342, +0xf2c540f4, +0xf6610364, +0xc1ff2d2f, +0xf6c348f0, +0xf4c1f58e, +0x7fa4ea60, +0x074907ff, +0x2b410337, +0x5874ca39, +0x02017ee6, +0x12050403, +0xf3a81403, +0x32059a1e, +0xf2c18f1e, +0x054f0744, +0x03d40b53, +0x03402722, +0xc5a10354, +0xd40544f2, +0xc1ff775e, +0x412750f2, +0xf4c52a2e, +0x278d1e48, +0x48f4c540, +0xfac1861e, +0x07302750, +0x44f3c510, +0xc1ff5e5e, +0x902750fa, +0xf9c51007, +0x279f1e44, +0xa7a81e31, +0xffffff4e, +0x010041b9, +0x26fc40c1, +0x83300719, +0x33330f3c, +0x007e34f9, +0x4756ff00, +0x40272107, +0x34fd0103, +0xff00007c, +0x3c833007, +0x2333330f, +0x0ff2f011, +0xffff4ea7, +0x0041bdff, +0xfc40c501, +0x34f9fe0b, +0xff00007e, +0xa7d44fc6, +0xffffff4e, +0x010041bd, +0x0bfc40c5, +0x07fc4efe, +0x27a13ec0, +0x270c0e41, +0x8e040740, +0x07fa4efc, +0x14dc23d0, +0xcd0bc247, +0x9914dc03, +0xc00924de, +0x4e3b4127, +0xb30bb007, +0xa3074223, +0xb432d301, +0xfa8e0127, +0x3b0c2c23, +0x87020b2e, +0x87030b00, +0x08b4be2a, +0x27412700, +0x9dcb0d00, +0xfa8e31d4, +0x0399f74e, +0x3b412724, +0x07f06343, +0x070b0184, +0x07f10570, +0x878333d1, +0x27c00794, +0x07c249a0, +0x871b070d, +0xbea10322, +0x0b00087e, +0x03d80bb9, +0x10acc4c2, +0x247499e9, +0xd4077c01, +0x749d4103, +0x03f40124, +0x077405d6, +0x071f0707, +0x0531272d, +0xff6b7efc, +0x73b10596, +0x4d3b4127, +0x73b5340b, +0xf78ef043, +0xb007fb4e, +0xf0931327, +0xbe008818, +0x110010f9, +0x25f093b1, +0xeebe0088, +0xb1210010, +0x882cf093, +0x10e3be00, +0x93b10100, +0x008833f0, +0x0010d8be, +0xf093b231, +0x2700883a, +0x10cbbe10, +0x03db0700, +0x31c127d4, +0x931c07d2, +0x008825f0, +0xb6bec103, +0xd4030010, +0xec0fccc4, +0xfb0e0b07, +0x00fc675e, +0x00001000, +0x08000000, +0x0000000f, +0x07c1f54e, +0x3c0dc138, +0x07240a99, +0x27c107b0, +0x27502780, +0xddfc0c6c, +0x00a41000, +0x4d034d07, +0xc4ea2000, +0x3c27009a, +0x2b06071b, +0x27010336, +0x3b4d0722, +0x0b405b20, +0x5b41dc2d, +0x2755f3f0, +0x4a3b0f4c, +0xf4139487, +0x134e01b0, +0x4201aff4, +0x2b0b2247, +0xb3012149, +0x490b4187, +0x3707430b, +0x11033d0b, +0x3a074305, +0x3703214d, +0x030ade0b, +0x18025127, +0x41278107, +0x42234a3b, +0x5936841a, +0xa194dcca, +0x3cb3c1b4, +0x2b3cbcc5, +0xa54c0b43, +0xc2f58eb4, +0x2007982c, +0x070c2c23, +0x274a3b42, +0x3b9487e1, +0x07aa1ee0, +0x7e0b0713, +0x1007fbae, +0x7d7e0b07, +0x24ba99fe, +0xff5cdcea, +0xf453c61e, +0x4e01ff34, +0x20270607, +0x851e9027, +0x02c1fa4e, +0x4003c13c, +0x04a1d107, +0x0fffdd03, +0x0fffdde3, +0xb007322b, +0x00c1d42b, +0xd634d638, +0x07fa8ed7, +0x503dcaad, +0xc20bca07, +0x46be1c07, +0x0b070013, +0xfd7e1c07, +0xc6da2bfe, +0xffdf03d0, +0x0703ffff, +0x00cf83cd, +0x03fc0000, +0x000001df, +0x071c07fc, +0x2720270d, +0x4ebe163c, +0x3ea70013, +0xc5fff9b3, +0x40273830, +0x0b071d07, +0xc5403cc5, +0xfa0e3c34, +0x07febf5e, +0x0bca07a3, +0xbe1c07c2, +0x070012f5, +0x7e1c070b, +0xda2bfeac, +0xfa4eae1e, +0x07310499, +0x07a207d0, +0x56c107b3, +0x0cb2c04f, +0x6e7e0a07, +0x5d0fc6fd, +0x475ab3c0, +0x144c234c, +0x0b24d199, +0x3b31274d, +0x23420931, +0x2932c231, +0x41273c07, +0xd1a1433b, +0x31233407, +0x13eb130b, +0x0d07140b, +0x89ff2b7e, +0x0d0732d4, +0x1c074103, +0x0e32d48d, +0xfaa85efa, +0x47034107, +0x071ac4c2, +0x1e31033c, +0xfb2f7ece, +0x402706d6, +0xc431d49d, +0xa81e9fb2, +0xfa8e0027, +0x38033107, +0x0d07b51e, +0x7b7e1c07, +0x9d4027fa, +0x0fc631d4, +0x4efa8e81, +0x07d207fa, +0xb6b107a0, +0xa7fa8e27, +0xfff9b3ce, +0x2724c099, +0x03222710, +0x9ccdbe07, +0x07100703, +0xfd227e0c, +0x1a073d07, +0x0ea72b07, +0x7efff9b3, +0x0fd6fcd1, +0x9b4027d7, +0xfa8e0ef4, +0x04a1fb4e, +0xd007f063, +0x14ceb107, +0x1001992c, +0xc15bcb07, +0xcc87c183, +0xc461cd0b, +0x0f072127, +0xa03ef405, +0xa110d199, +0x3b4127d2, +0x27242b41, +0xa5c36530, +0xd9b2ced2, +0xfb8ef043, +0xcf5bf04e, +0xfe2bdf3b, +0x0f07fc4e, +0xfff9e5be, +0xf00efc0e, +0xf04eff0b, +0xdf3bcf5b, +0xfc4efe2b, +0x0dbe0f07, +0xff1efffd, +0xb007fb4e, +0xfef6eabe, +0x1007d007, +0x858ef093, +0x0dfbbe00, +0x27d74600, +0x010b1ec0, +0xbec103d2, +0x03000ded, +0x931c07d4, +0x008580f0, +0x8eedcbda, +0x1eff1efb, +0x99fa4eff, +0xc1071e04, +0x18ff4cc0, +0x44333487, +0x34f1340b, +0xff0003cc, +0x00004ea3, +0xcc34f504, +0x99ff0003, +0x0a311f04, +0x070f4c83, +0x33248734, +0x2b322b34, +0xf1338734, +0x00011434, +0x183bf1ff, +0xd0ff0001, +0x1410014d, +0x00014ef4, +0x27009f01, +0x2711fddd, +0x27033a0d, +0xf0111e10, +0x9a01014d, +0x7cdd2700, +0x430d2701, +0x07102704, +0x73240734, +0xc9be1f3c, +0x3c27045b, +0x0b402780, +0x07414b30, +0x8304072a, +0x0c330f2c, +0xab385318, +0x87db0b30, +0x0b243312, +0xf5d30b12, +0x0013b81d, +0xff2ea7ff, +0x4d27fddf, +0x24d50800, +0x10270208, +0x020821d5, +0x4fff3ea7, +0x073211fd, +0x333c074c, +0x0b433336, +0xa442f543, +0x27ff000d, +0x78c4fd42, +0xa7ff000d, +0xffffff2e, +0x24bd4127, +0x239906a8, +0x0ef19b0f, +0x33874127, +0xb04034f5, +0xfa8eff02, +0xda1edd27, +0x02720d27, +0x745e1027, +0x1fdc27ff, +0x059f0d27, +0x685e1027, +0xa73027ff, +0xfddfff4e, +0xb9b443c5, +0xa9016404, +0x23014003, +0x8d343b44, +0xfe0b9a03, +0xb007fb4e, +0xf0931427, +0xbe008464, +0x11000cad, +0x71f093b1, +0xa2be0084, +0xb121000c, +0x8478f093, +0x0c97be00, +0x93b10100, +0x00847ff0, +0x000c8cbe, +0xf093b231, +0x27008486, +0x0c7fbe10, +0x03db0700, +0x31c127d4, +0x931c07d2, +0x008471f0, +0x6abec103, +0xd403000c, +0xec0fccc4, +0xfb0e0b07, +0x4efe825e, +0x3a04b9f8, +0x27d00701, +0xb64ae030, +0x9d462302, +0x4f6ba8d3, +0x42143027, +0x43073127, +0xd49d4f6b, +0x64d8b9a9, +0x65d9b901, +0x62daa901, +0x53448601, +0x60dca9a1, +0xb9412701, +0x070447d2, +0x40d0a934, +0x23b80701, +0x3b1c07b4, +0x23493b38, +0x3edea921, +0x3b2a0b01, +0x2311230b, +0x0b412331, +0x074a0b3c, +0x3ba107c2, +0x5bb007eb, +0x5b495b38, +0x53a553c9, +0x5bbfab25, +0xa8d09918, +0x8d9cd38d, +0xd18d9ed4, +0xa0dc8da2, +0x8da6da8d, +0xde8da4d2, +0x9adb8d98, +0x4b4704e6, +0x279ad48d, +0xbd3d0740, +0x0304afd4, +0x9901303d, +0xd4bd4334, +0x33990492, +0x6fd4b944, +0x93d3bd01, +0x47d3b904, +0x91d3bd04, +0xb9455604, +0xe60170d4, +0x2701eb4f, +0x3c27744c, +0x02d4adb8, +0x04d3ad01, +0x91d4b901, +0xff0ea704, +0x4c33e7ff, +0x004f8316, +0xa3070000, +0x8480024e, +0xd3b90405, +0xd1b90493, +0xd4b90138, +0x3c830492, +0x0021273f, +0x83202712, +0x36333f4c, +0x2c3334ab, +0x1532ab0c, +0xdcd4d103, +0xdc44f803, +0x111d2700, +0x6fd4b930, +0x70d3b901, +0x83438301, +0x33373333, +0xa343ab45, +0xa940004d, +0xab0190d2, +0xff3ea741, +0x34c5e7ff, +0x002d8350, +0xd1260680, +0xf801acd4, +0x27013e41, +0xafd4bd40, +0xa7402704, +0xfddfff2e, +0xb9c424c5, +0xa90491d4, +0xa90162d0, +0x0b0160de, +0x0f0c0304, +0x40270473, +0x013cd3b9, +0xbd0fec03, +0xad0490d4, +0x7304ecd0, +0x733fc6e4, +0x016fd4b9, +0x010f4fe6, +0x044cdcb9, +0x01e02d27, +0x03dcd3d1, +0x01003d83, +0x2c033506, +0x7f2ce37f, +0x44334e07, +0x04dcd4d5, +0x01143fe6, +0xbe07e703, +0x4b07b7e3, +0x32074823, +0x429b4333, +0x26333333, +0x01acd1d1, +0x04e0d3d5, +0x04e4d2d5, +0x04e8d4d5, +0x12f8e723, +0x07030167, +0x07e3b433, +0x10003d27, +0x0fff2da7, +0x04dcdbd5, +0x2700e15e, +0x5e10111d, +0x2e15ff25, +0x01b023d5, +0xefff3ea7, +0xd54327fd, +0x0702d834, +0xd804c103, +0x27fb48dc, +0xd801d514, +0xdc01d502, +0xd5302702, +0xa7067003, +0xfdeb272e, +0x4f272305, +0x02040000, +0xf39b2415, +0xe001d50e, +0x7403d502, +0xd5432706, +0xa702e404, +0xfdefff3e, +0xdce434c1, +0x4427fb48, +0x02e434d5, +0x3ea71027, +0x05fdeb1f, +0x004f2731, +0x15030400, +0x0ef19b34, +0xe48f2ea7, +0x1c4c27fd, +0x21152405, +0x00000f27, +0x2035a000, +0xe47f3ea7, +0x054103fd, +0x35311534, +0xd1f88e30, +0xf80188d4, +0xfec3c04c, +0xd4bd4027, +0xba5e04af, +0x70d4b9fe, +0xed4ff601, +0x4cdcb9fe, +0x802d2704, +0xfeea5e01, +0x276c4c27, +0xd4ad903c, +0xd3ad0102, +0x165e0104, +0x5e3127fe, +0x2e9bfd49, +0x04e0d2d5, +0xa7803c27, +0xd4d17f2c, +0x312304dc, +0x300b049b, +0xc4334c87, +0x4c0b328b, +0x04d8d3d5, +0xdfff0ea7, +0xd843f1fd, +0x27ff0003, +0x9802d520, +0xe803c501, +0x02d50e15, +0xd4b901b0, +0x4fe6013c, +0x02c5fef8, +0xd54127fc, +0xd1010004, +0xb903dcd2, +0x07016fd4, +0x70d3b912, +0x33118301, +0xa3438316, +0x834a3311, +0x3314ab33, +0x13ab0c3c, +0x01002d18, +0x00001ea3, +0xb401c504, +0x27febf5e, +0xa710003d, +0x1e0fff2d, +0x5bf04e86, +0x2bdf3bcf, +0x07fc4efe, +0xfb23be0f, +0x0efc0eff, +0x4eff0bf0, +0x3bcf5bf0, +0x4efe2bdf, +0xbe0f07fc, +0x1efffc30, +0x1e2103ff, +0x19031918, +0x03010314, +0x0d34ce11, +0x11230123, +0x14190019, +0xfe0b042b, +0x0027f230, +0xfe4efe0b, +0x40ab4107, +0x43d83007, +0x01151e0f, +0x0524231e, +0x0314033e, +0x07071e34, +0x03425342, +0x86f45841, +0x03141925, +0x03341d11, +0x8ef2a831, +0x07fd4efe, +0x2903dce0, +0x072624d0, +0x073f6b31, +0xab483343, +0x07320743, +0x533423e4, +0x10ec3332, +0x3103e4ab, +0x4e054007, +0x44032423, +0xe407f3b8, +0x40272103, +0x311d031e, +0x340b3e07, +0xf2a84103, +0x0000fd8e, +0x04110321, +0x04014342, +0x411d430b, +0x41030421, +0xfe0b0425, +0x00000030, +0xf2e3f54e, +0x5f079307, +0xb0273f07, +0x3a037027, +0x82074027, +0x5c036027, +0x95fb850c, +0x05f3a5f7, +0x25f115f0, +0x01c85ef4, +0x1c40b7b6, +0x3e0f0725, +0x01ba5eb8, +0x40276807, +0x61237027, +0xf485b127, +0xa95ef795, +0x301c2301, +0x4f6b4107, +0xd4301c03, +0x7536184a, +0x27301c24, +0x47f38531, +0x0b733347, +0x301c2374, +0x855e710b, +0x6c1ce001, +0x1cd40180, +0x1ce0206d, +0x54010663, +0x1ce0641c, +0xe4015a25, +0x01632d1c, +0x1cc0261e, +0x1ce42964, +0x1e015869, +0x731ce022, +0x1c3400f6, +0x701ce474, +0x131e0149, +0x0f751cc0, +0x3e781ce4, +0x27081e01, +0x5ef49541, +0x9001013c, +0xc4641c00, +0xcc0a691c, +0x00130b00, +0x071eb127, +0x2b751cc4, +0xd007b027, +0x0d07a027, +0xbabe1a27, +0x00f9003a, +0x0001a460, +0x4a0b4507, +0x1a27401d, +0xacbe0d07, +0xd007003a, +0x07e6a103, +0xa027dd1e, +0x4c834007, +0xf935070f, +0x01a46c44, +0x1d3a0b00, +0x03045334, +0x270176a1, +0x91c707b0, +0x2bca2bf3, +0x813a76cb, +0x6647a6f4, +0x270f07b7, +0xc57e2d1c, +0x1eb027fe, +0x96f3810e, +0x071d0734, +0xfeb67e0f, +0xdc27041e, +0x07c12320, +0xbdf3534c, +0x014103fe, +0xe241cc31, +0x0f07b546, +0x7e2d1c27, +0xda07fe98, +0xd50bd123, +0xd139061e, +0xa1fe8b7e, +0x07d123f4, +0xf3d4ce0f, +0x061edc07, +0x23fe7b7e, +0x270f07d1, +0xd1cc201c, +0x01591ef4, +0x03c90791, +0x7e0f07c4, +0x9c07fe64, +0x9d01611e, +0xb02774d6, +0x0d070b1e, +0x000089be, +0xb02bb707, +0x34e6f391, +0x457e171e, +0x07b123fe, +0x0741034b, +0x201c270f, +0x1ef041cc, +0xfe327e04, +0x0f07d419, +0xd1031407, +0xdb0742b6, +0x217e061e, +0x07d123fe, +0x201c270f, +0x03f4d1cc, +0x07141e94, +0xfe0e7e0f, +0x61190d1e, +0x057e6103, +0xc20f07fe, +0xb027f568, +0x81198103, +0xfe361ff6, +0x10270f07, +0x21fdef7e, +0x23f2c3f0, +0xa3f58e01, +0x15f305f0, +0x63fe4ef4, +0x033f07f0, +0x7ef30538, +0xf043fdec, +0xf083fe0e, +0x3007fe0b, +0x01030419, +0x032b4396, +0xfb4efe0b, +0xeea7f063, +0x05fd4fff, +0x07c007f2, +0x01b307d1, +0x123f9be4, +0x44334103, +0xab38e2c1, +0x1023ce34, +0xffe30ea7, +0x0a95beff, +0xe8101e00, +0xa7061ef3, +0xffffe32e, +0x36272401, +0xf1294276, +0x1303d409, +0x12732407, +0x03fc4d10, +0x0107ff1e, +0xc4090103, +0x322b3407, +0x03fc4d10, +0x310cff1e, +0x03fc3d03, +0x87ec30da, +0x104c0342, +0x4d0bf301, +0x21034305, +0x03fc2d04, +0x01072027, +0x01033b07, +0x3401111e, +0x14052103, +0x2d103403, +0x2d2303fc, +0x128703fc, +0x0b101c03, +0x0df0301d, +0xe30ea7d2, +0x0401ffff, +0xf5be44c6, +0x40270009, +0x270ef49b, +0xff4ea731, +0xf043fd4f, +0xfb8e43a5, +0xf005f063, +0x20073107, +0xe0001f27, +0x0f271007, +0x1007d000, +0x2f5ef043, +0x05f063ff, +0x073107f0, +0x001f2720, +0x271007c0, +0x07b0000f, +0x5ef04310, +0x0409ff16, +0xf40df063, +0x30070449, +0xf201f42d, +0x0f273803, +0x10079000, +0xa0001f27, +0xf0431007, +0x4efef55e, +0x07a007fa, +0xbeb10701, +0x07fffede, +0x0dfc9330, +0x35030486, +0x0c072307, +0x07da4d27, +0x24231b07, +0x050c0c03, +0x15ca25c4, +0xfc14bec3, +0x3e0c07ff, +0x4eff1eae, +0xfdf493f7, +0x438905c3, +0x0a428908, +0x322b8007, +0x300c7107, +0x03fc3d03, +0x002734d6, +0x4287f78e, +0xd0124ce9, +0x93071007, +0xac07c303, +0x9123b207, +0xb103a273, +0x4de9c323, +0x1007d010, +0x270ca9d2, +0x9df19308, +0x843e007d, +0x8c2da907, +0x84298d0d, +0x0bb9dd24, +0x66484cc4, +0xdd24141e, +0x4cc40bba, +0x0a1e5c28, +0x0bbbdd00, +0x0bbcddc4, +0x07802951, +0x23070b37, +0x7f3ce301, +0x197f0ce3, +0x803c0334, +0xc6f930c2, +0x071707a7, +0xfcbd103a, +0xfcbd2303, +0xf14b8703, +0x07d01044, +0x05b10310, +0x38140314, +0xfcbd10f3, +0xfcbd2303, +0x55f39303, +0x3b8d05c3, +0x003f270a, +0x271007e0, +0x8e3b2d01, +0x930627f7, +0x007d36f1, +0x1eff067e, +0x290329a5, +0xfc3d1014, +0x10ff1e03, +0x1e03fc4d, +0x2b0307ff, +0x03000c04, +0x0b03fc0d, +0x004f27fe, +0x29100790, +0x070f6b44, +0xfc4d1034, +0xfc3d2303, +0x004f2703, +0x291007b0, +0xfdf29344, +0x230d05c2, +0x4d103407, +0x3d2303fc, +0x4f2703fc, +0x1007d000, +0x234d4429, +0x03fc4d10, +0x03fc4d23, +0xa608248d, +0x004f270b, +0x291007a0, +0x10340744, +0x2303fc4d, +0x2703fc3d, +0x07c0004f, +0x2d442910, +0x10340723, +0x2303fc4d, +0x2703fc3d, +0x07e0004f, +0x6d442910, +0xfc4d1023, +0xfc4d2303, +0x0a248d03, +0xf84efe0b, +0xc296f493, +0x29430905, +0x2b900742, +0x03300c32, +0xd603fc3d, +0x8e002734, +0xe94287f8, +0x0790124d, +0x03a30710, +0x07bd07d3, +0x73a123c2, +0x23c103b2, +0x1048e9d3, +0xd2100790, +0x08270dba, +0x7c3af193, +0xfe217e00, +0x9805ba07, +0xdc509d15, +0x930827c5, +0x007c6ff1, +0x06fe0e7e, +0x030907b8, +0x103b0708, +0x2303fccd, +0x8703fccd, +0x1044f14c, +0x03100790, +0x030405c1, +0x10f33804, +0x2303fccd, +0x9303fccd, +0x05c217f3, +0x3f273c2d, +0x1007a000, +0x3c2d0127, +0xf74ef88e, +0xc202f493, +0x69434905, +0x2b900742, +0x0c710732, +0xfc3d0330, +0x2734d603, +0x87f78e00, +0x124ce942, +0x071007b0, +0x07c303a3, +0x23b2078c, +0x038273a1, +0xe9c323b1, +0x07b0104d, +0x0d8ad210, +0xf1930827, +0x7e007ba4, +0x8a07fd8b, +0x9d0d9c2d, +0xdd249429, +0x4cc40bb9, +0x141e7448, +0x0bbadd24, +0x6a284cc4, +0xdd000a1e, +0xddc40bbb, +0x295f0bbc, +0xf94c5094, +0xf1930827, +0x7e007bd3, +0x9029fd57, +0x070b3707, +0x3ce30123, +0x7f0ce37f, +0x3c033419, +0xf930c280, +0x170787c6, +0xbd103807, +0xbd2303fc, +0x4b8703fc, +0xb01044f1, +0xb1031007, +0x14031405, +0xbd10f338, +0xbd2303fc, +0xf39303fc, +0x6d05c14c, +0x003f273b, +0x271007c0, +0x8e3b2d01, +0x930627f7, +0x007b94f1, +0x1efcfe7e, +0xff2ea797, +0x2401fd4f, +0x03123f9b, +0xc1443341, +0x34ab3822, +0x320e0027, +0xfe0b0127, +0xf205f0e3, +0xf425f315, +0x3ea7fa4e, +0xa9ffffff, +0x63155434, +0x07d007f0, +0xad4fe6a1, +0xa940fa00, +0x5034d100, +0xa14fe615, +0xe6bb3e00, +0x122f9b07, +0x4fff4ea7, +0xa74301fd, +0xffffe71e, +0x14013433, +0x38a343d6, +0x130532ab, +0x0ea70a1e, +0xbeffffe7, +0x2700063f, +0x100000cf, +0x44cbc110, +0xffff4ea7, +0x5040d1ff, +0xff4ea715, +0x4401fd4f, +0x37333b07, +0x4c03030b, +0x9b041d30, +0xddf9124f, +0x0001a5ec, +0x3d304c03, +0x273f0704, +0x0d5d204c, +0x3c03047d, +0x07040318, +0x7b1c272a, +0x0dbef305, +0xd007fff9, +0xc4c107a6, +0x033b0748, +0x48c4c541, +0x0348c4c1, +0xff3d1031, +0xc530270f, +0xc4c144c3, +0xe70ea744, +0xa9beffff, +0x031e0005, +0x0d07d027, +0xfa0ef043, +0xfe0bf0c3, +0x3401fa4e, +0xb107c307, +0x4fc4a207, +0xffffffff, +0x27100727, +0x2706012d, +0xa43d2702, +0xe9ccbe01, +0xccd007fe, +0x0d271000, +0xbfbe0106, +0xf493fee9, +0x050485f4, +0x01cd0540, +0xff1fc0c1, +0x1dffffff, +0x3a072b07, +0xa3be0527, +0x00ccfee9, +0x060d2710, +0xe998be01, +0xcdf493fe, +0x40050485, +0xfe4efa8e, +0x0007b6be, +0xf0002f27, +0x3d271007, +0x051e04e3, +0xf4e84307, +0x42c42401, +0x9efe0ef8, +0x4e0007bd, +0x9bb027fb, +0xcf270efb, +0x1007f000, +0xc3053127, +0xf49b4027, +0xff4ea70e, +0x43a5fd4f, +0xc031c13e, +0xfb8ecb05, +0xc027fb4e, +0x270efc9b, +0x07f000bf, +0x05312710, +0x9b4027b3, +0x4ea70ef4, +0xa5fd4fff, +0x059c3e43, +0x4efb8ebc, +0xe70ea7fe, +0xc3beffff, +0x30270004, +0xf0004f27, +0x43051007, +0xfe4efe8e, +0xe6fe307e, +0x122f9b07, +0x4fff4ea7, +0xa74301fd, +0xffffe71e, +0x14013433, +0x38a343d6, +0x130532ab, +0x0ea7fe8e, +0x0effffe7, +0x04b19efe, +0x05f12300, +0x25f215f1, +0x4ef435f3, +0xff4ea7fb, +0x4491d07f, +0xb007f063, +0x8b104cf8, +0x7efdab00, +0x07e6fde5, +0xa7122f9b, +0xfd4fff4e, +0x1ea74301, +0x33ffffe7, +0xd6140134, +0xab38a343, +0x1e130532, +0xe70ea70a, +0x68beffff, +0x4ea70004, +0x01fd4fff, +0x00cf2744, +0x031007f0, +0x3c27304c, +0x0cc49d20, +0x9b0dc39d, +0xc39d124f, +0x304c030f, +0x3c033f07, +0x272b0714, +0x9d03f01d, +0x0f270ec4, +0x1007f010, +0x45bef305, +0x4127fff7, +0x0f27c415, +0x1007f00c, +0xfff955be, +0xc0250103, +0xa7feff7e, +0xffffe70e, +0x0003ebbe, +0xf043fdeb, +0xf103fb0e, +0xf84efe0b, +0x00004f27, +0x4a011010, +0xc14048c1, +0x4cc14449, +0x07ca2a48, +0x07051edc, +0xa7d123dc, +0xffffffbe, +0x1550b4d1, +0x4556da2b, +0x78e0f093, +0xff237e00, +0x1550b1d1, +0x78faf093, +0xff177e00, +0x33568fc4, +0xd4571122, +0x520fff9d, +0x2907de26, +0x18073c07, +0x7900f093, +0x074a0700, +0xfef77e9b, +0xbd07ca07, +0x42be1f1e, +0x94d10032, +0x20071550, +0x240b2733, +0x45862419, +0xf0931c07, +0x7e00790c, +0xc103fed5, +0x0c07b123, +0x0fff1d27, +0xffffbfc4, +0x0bd4ffff, +0x004f27da, +0x05101000, +0xa7f88e4d, +0xffffff4e, +0x155044d1, +0x4f2747c6, +0x10100000, +0x44034101, +0x44034201, +0x44034301, +0xf0934401, +0x5e0078d2, +0xfe0bfe91, +0x4207f54e, +0x4013f563, +0x6107a207, +0x52478007, +0x70279107, +0x1e50f4c5, +0x03b30935, +0xf839bed1, +0x03c00bff, +0x270c07b2, +0xf293501c, +0x0e0078cc, +0xe6d9cead, +0xc41d4027, +0xf0931707, +0x070078c2, +0xfe4b7e2f, +0x0b50f4c1, +0x0b940b7a, +0x0967c285, +0xd027b807, +0xce1ecf07, +0xf58ef543, +0x6207f54e, +0x7107f523, +0x50079207, +0xa1076013, +0x301e8027, +0xd103b319, +0xfff7e2be, +0xb103c00b, +0x1c270c07, +0x83f29350, +0x9d0e0078, +0x27e6dace, +0x1d180740, +0x6bf093c4, +0x2f070078, +0x0bfdf47e, +0xc2a60b89, +0xb8070b78, +0xd027b50b, +0xd11ecf07, +0xf58ef503, +0xb007f94e, +0xa207d107, +0xfcab9307, +0xe6fbd47e, +0x122f9b07, +0x4fff4ea7, +0xa74301fd, +0xffffe71e, +0x14013433, +0x38a343d6, +0x130532ab, +0x0ea70a1e, +0xbeffffe7, +0x27000257, +0x07f0004f, +0x15322710, +0x453a0343, +0x9d43254d, +0x499d144a, +0x7e4b3515, +0xd007fcff, +0xffe70ea7, +0x020ebeff, +0xc6fceb00, +0x272b07d5, +0x0702020d, +0xe650be1d, +0x8e0d07fe, +0x07fb4ef9, +0xabb107c0, +0xfb677efd, +0x2f9b07e6, +0xff4ea712, +0x4301fd4f, +0xffe71ea7, +0x013433ff, +0xa343d614, +0x0532ab38, +0xa70a1e13, +0xffffe70e, +0x0001eabe, +0xf0003f27, +0x43271007, +0x48273415, +0x34253c35, +0x987e3b45, +0xa7c007fc, +0xffffe70e, +0x0001a7be, +0x0c07fdeb, +0xfc4efb8e, +0x0d66d007, +0x0e7efcab, +0x9b07e6fb, +0x4ea7122f, +0x01fd4fff, +0xe71ea743, +0x3433ffff, +0x43d61401, +0x32ab38a3, +0x0a1e1305, +0xffe70ea7, +0x0191beff, +0x004f2700, +0x271007f0, +0x25431534, +0x7e4d3543, +0x0ea7fc68, +0xbeffffe7, +0xeb000154, +0x4efc8efc, +0x07f123fc, +0x93c007d1, +0x007741f1, +0x2c270f07, +0xf3ecbe10, +0x93d4f6ff, +0x007dcefd, +0x87be0d07, +0xf393fff6, +0x07047f08, +0xda4d2720, +0x03e30707, +0x3405140c, +0x3c253015, +0xec032103, +0x273f070c, +0x03310143, +0x03e10534, +0x59f4a8e4, +0x07330934, +0xf4f0931d, +0xe45d047e, +0xa3bee30d, +0xf093fff3, +0xbe047ecc, +0x1efff73a, +0xa7fc4eff, +0xffffff4e, +0x152c44b9, +0xc107d007, +0xf09345e6, +0x070076de, +0xbe2c071d, +0x07fffc3d, +0xbe1c070d, +0x96fffec9, +0x93022705, +0x0076e5f1, +0x8eff665e, +0xa7f84efc, +0xffffff8e, +0x152c84b9, +0xb1079007, +0xd307a207, +0xf0934666, +0x070076d5, +0x072b0719, +0xbe4d073a, +0x07fffc01, +0x27d214cd, +0x070907c2, +0x072a071b, +0xfe12be3c, +0x2c84b9ff, +0xa6d00715, +0xddf09345, +0x1d070076, +0xfffbdcbe, +0x0227d576, +0x76e5f193, +0x27121e00, +0x234c3b41, +0x864d8b41, +0x93012745, +0x0076e0f1, +0x96fefa5e, +0x00df50a7, +0x07200000, +0xd04b0b4d, +0x0000014f, +0x01272370, +0x76e8f193, +0x50e21e00, +0x000000df, +0x0b4d0770, +0x014f504b, +0x27f00000, +0xfef19301, +0xc91e0076, +0xf88e0d07, +0x5e0c3c27, +0x4027ff59, +0xfe0b0405, +0xf49b4027, +0x0b04050e, +0x9b0201fe, +0x4ea7123f, +0x01fd4fff, +0x33002744, +0xab48a344, +0x27420e43, +0x4efe0b01, +0x9bc007fa, +0x4ea7123f, +0x01fd4fff, +0x33a4074d, +0xabd8a3d4, +0xe8031ed3, +0x27cb01f4, +0xbeb35646, +0x01002f50, +0x963027c4, +0x9bcd0544, +0xabc50ef3, +0xcec40138, +0xfa8ee4d4, +0x4ea73027, +0xd5feffff, +0x0b013843, +0x124f9bfe, +0x34872407, +0x232b2533, +0x001421f1, +0x3f9bff01, +0x0b410310, +0x33148731, +0x1423f545, +0x2bff0100, +0xff3ea741, +0x3311fd4f, +0x000044f1, +0x1207ff01, +0x23f5342b, +0xff010020, +0xfff41e23, +0x682e23fe, +0x4727feff, +0x14031301, +0x24032305, +0xfe0bf4a8, +0x4fff4ea7, +0xff3ea7fd, +0x4181feff, +0x32d14491, +0x30d10128, +0x13330130, +0x211b4333, +0x34d5041b, +0x32d50130, +0x31d50124, +0x30d50128, +0xfe0b012c, +0xfe0bfe0b, +0x7f6af493, +0x0b407504, +0x334007fe, +0x2b008745, +0x0c41f540, +0xf5ff0100, +0x05af2841, +0x07fe0b00, +0x87453340, +0xf5402b00, +0x01001041, +0x2c41f5ff, +0x0b0005af, +0x334087fe, +0x23042b05, +0xfeff680e, +0xfc4efe0b, +0x078ccc27, +0xf31ea72c, +0xf093feff, +0xbe047df4, +0x07fff16e, +0x671ea72c, +0xf093feff, +0xbe047e70, +0x93fff15e, +0x047ef3f0, +0xfedb1ea7, +0x102c27fe, +0x4b9efc0e, +0xfe4efff1, +0x7dc2f493, +0xf6441904, +0x9300a24f, +0x047dbbf4, +0x2c032407, +0xe334078b, +0x3ce37f2c, +0x0334197f, +0x32c2803c, +0xa1f393f9, +0x2027047d, +0x05234c27, +0xc8340332, +0x1df493f4, +0x2407047e, +0x078b2c03, +0x7f2ce334, +0x197f3ce3, +0x803c0334, +0x27f932c2, +0xf293233c, +0x27047e00, +0x05430710, +0x03312321, +0x93f4b824, +0x047e7bf4, +0x43054335, +0x43254315, +0xf3932027, +0x27047e7c, +0x0332054a, +0x27f4c834, +0x27252730, +0xb834f540, +0xf50005af, +0x05af2834, +0x2c34f500, +0xf50005af, +0x05afb434, +0x1c3c0300, +0x3127f200, +0x7d1ef493, +0x93431d04, +0x047da7f1, +0xa78c2c27, +0xfeff670e, +0xfff08dbe, +0x7d0af193, +0x8c2c2704, +0xfff30ea7, +0xf07cbefe, +0x11f193ff, +0x2c27047e, +0xdb0ea710, +0x6bbefefe, +0xfe0efff0, +0xa7fe6f5e, +0xfd4fff4e, +0x4ea74311, +0xd5feffff, +0x0b013443, +0xff3ea7fe, +0x4ea7feff, +0x11fd4fff, +0x3834d141, +0x3432d101, +0x2b410b01, +0x3834d542, +0x9bfe0b01, +0x3407124f, +0x44873533, +0x4ea7342b, +0x11fd4fff, +0x2434f142, +0x2bff0100, +0x2434f542, +0x0bff0100, +0x124f9bfe, +0x25332407, +0x242b4487, +0x4fff4ea7, +0xf14411fd, +0x01002423, +0xf5430bff, +0x01002424, +0x93fe0bff, +0x047d97f2, +0xff673ea7, +0x014727fe, +0x05340331, +0xa8240321, +0xff4ea7f4, +0x44d1feff, +0xf3930138, +0x95047d78, +0x014a2734, +0x05340332, +0xa8040302, +0xa7fe0bf4, +0xffffff3e, +0x270d309d, +0xaa34bd41, +0x0f339906, +0xf49b4027, +0x8741270e, +0x4034f533, +0x1eff02b0, +0x07fc4eff, +0x2c76bec0, +0xff1ea700, +0xc319fd4f, +0x41271201, +0x34eb423b, +0x4027c31d, +0xc50ef49b, +0xfc8e3814, +0xc007fb4e, +0x27beb107, +0xc219002c, +0x2bab4027, +0xc43dc21d, +0x402705e6, +0xa70ef49b, +0xfd4fff3e, +0x273834c5, +0x0ef49b40, +0xffff4ea7, +0x0e4399ff, +0x4fbf1ea7, +0x38328bfd, +0x05412731, +0x03315314, +0x8e32d614, +0x0d0499fb, +0x070c0399, +0x0744c623, +0x99041e34, +0x43070e03, +0x400b4123, +0x99044499, +0x45960e00, +0x3028321b, +0xfe0b0307, +0xfe0b030b, +0xb027fb4e, +0x0b9dc007, +0x0ec19d0c, +0x0b9d2107, +0x0310270d, +0xef1fbe04, +0x3dcb1dff, +0x03cb5dcb, +0x8ecb3dc2, +0x07fc4efb, +0xfbcc27d0, +0x76be0d07, +0x004c009d, +0xf4e84c07, +0xfc8ef31e, +0xd007fc4e, +0x07fbcc27, +0x9d5fbe0d, +0x07004c00, +0x1ef4e84c, +0x6bfc8ef3, +0x9315361f, +0x007312f0, +0x4087fe0b, +0xb67840f1, +0x04860001, +0xf0931434, +0x0b007883, +0x0b4187fe, +0x104c2340, +0xfe0b4001, +0x0087f74e, +0xb6940af1, +0x0bf10001, +0x0001b678, +0xf093c107, +0x070072e7, +0x2772071a, +0xf72fbe90, +0x1e8027ff, +0x03cd011c, +0x66c40391, +0x93b201d6, +0x0072daf0, +0x3d071a07, +0xfff714be, +0xb4038d0b, +0x07e397ce, +0x9328071a, +0x0072d1f0, +0xfe9ef70e, +0xfa4efff6, +0x23082a99, +0x87d207f1, +0xf1ac8631, +0x01b67833, +0x34348600, +0x08f393a4, +0x0a1e0078, +0x430b4a87, +0x01104c23, +0x09de9943, +0xdb69dc49, +0xfe054187, +0xfb25fc15, +0xb69442f1, +0xdd010001, +0x4a071007, +0x729ff093, +0xbefd3500, +0x1efff6b1, +0x09249922, +0xde492c69, +0xb69432f1, +0x10070001, +0x72f4f393, +0xbaf09300, +0xfe050072, +0x8ebefc15, +0xf103fff6, +0xfc4efa8e, +0xffffcea7, +0x63c101f7, +0xe3f093f0, +0x76be0072, +0xc121fff6, +0x72f6f093, +0xf66bbe00, +0x48c1c1ff, +0x7308f093, +0xf65fbe00, +0x44c1c1ff, +0x731af093, +0xf653be00, +0xffcea7ff, +0xc181efff, +0x7328f093, +0xf643be00, +0x93c1a1ff, +0x00733bf0, +0xfff638be, +0xffffcea7, +0x93c121eb, +0x007349f0, +0xfff628be, +0x9364c1c1, +0x00735bf0, +0xfff61cbe, +0xffffcea7, +0x93c101e7, +0x007369f0, +0xfff60cbe, +0x9350c1c1, +0x00737bf0, +0xfff600be, +0xf093c121, +0xbe00738e, +0xc1fff5f5, +0xf09354c1, +0xbe0073a0, +0xc1fff5e9, +0xf09358c1, +0xbe0073b2, +0xc1fff5dd, +0xf0935cc1, +0xbe0073c4, +0xa7fff5d1, +0xfbffffce, +0x0628c1d1, +0x73d0f093, +0xf5bfbe00, +0x30c1d1ff, +0xeaf09301, +0xb2be0073, +0xc1d1fff5, +0xf0930208, +0xbe007404, +0xd1fff5a5, +0x930420c1, +0x00741ef0, +0xfff598be, +0x0468c1d1, +0x7438f093, +0xf58bbe00, +0xff4ea7ff, +0x41c1f3ff, +0x4ef09334, +0x7abe0074, +0xcea7fff5, +0x31fddfff, +0x5cf093c1, +0x6abe0074, +0xc1c1fff5, +0x4cc2c148, +0xc16cc3c1, +0xcec170c4, +0x62f09340, +0xfe050074, +0xfff550be, +0xffffcea7, +0x48c1d1fe, +0x48c2d101, +0x81f09301, +0x22870074, +0xb6682f03, +0x32be0001, +0xc1b9fff5, +0xf0930140, +0xbe00748d, +0x99fff525, +0xf09309c1, +0xbe00749d, +0xb9fff519, +0x931e99c1, +0x0074acf0, +0xfff50cbe, +0x0144c1a9, +0x74bbf093, +0xf4ffbe00, +0x42c1a9ff, +0xd6f09301, +0xf2be0074, +0x4ea7fff4, +0xd1fdefff, +0x930f0041, +0x0074e7f0, +0xfff4e0be, +0x0003d7be, +0x4fff4ea7, +0x114c01fd, +0x931c0742, +0x0074edf0, +0xfff4c8be, +0x10270c07, +0xe1b32ea7, +0xfdc07efe, +0x11270c07, +0xe1a72ea7, +0xfdb47efe, +0x13270c07, +0xe18f2ea7, +0xfda87efe, +0x14270c07, +0xe1832ea7, +0xfd9c7efe, +0x15270c07, +0xe1772ea7, +0xfd907efe, +0xffffcea7, +0x08c1d1ff, +0x10c2d115, +0x0cc3d115, +0x1cc4d115, +0xc1f09315, +0x6ebe0074, +0xc2d1fff4, +0xc1d11518, +0xf0931514, +0x430074d2, +0x9efc0ef0, +0x4efff459, +0xffbea7f8, +0xb1c1fd4f, +0x93f1236c, +0x0074ccf0, +0xfff444be, +0x00042ebe, +0xf0931007, +0xa70074e4, +0xffffffce, +0xfff430be, +0x9311c199, +0x0074faf0, +0xfff424be, +0xb211ba01, +0xf0931a07, +0xbe007512, +0x07fff415, +0xa716270a, +0xffeadf2e, +0xa7fd0d7e, +0xfffffb0e, +0x01030919, +0x4ea70a19, +0x03fffffe, +0x19421901, +0x0341030b, +0x190e1901, +0x19410343, +0x93c11944, +0x007507f0, +0xf905fe35, +0xfb25fa15, +0xfff3d4be, +0x930fc199, +0x007536f0, +0xfff3c8be, +0x9310c199, +0x007551f0, +0xfff3bcbe, +0x06a8c2d1, +0x06acc3d1, +0x06a4c1d1, +0x7563f093, +0xf3a7be00, +0x90c1d1ff, +0x89f09306, +0x9abe0075, +0xc1d1fff3, +0xf0930698, +0xbe0075a3, +0xd1fff38d, +0x93069cc1, +0x0075bdf0, +0xfff380be, +0x9327c199, +0x0075d8f0, +0xfff374be, +0x9326c199, +0x0075f3f0, +0xfff368be, +0x0e14c1d1, +0x760df093, +0xf35bbe00, +0x2dc1b9ff, +0x27f0930e, +0x4ebe0076, +0xc1b9fff3, +0xf0930e2c, +0xbe007644, +0xd1fff341, +0x9313b0c1, +0x007661f0, +0xfff334be, +0x0102c1a9, +0x767ef093, +0x0f1c8300, +0xfff324be, +0x0108c1b9, +0x7695f093, +0xf317be00, +0x09c1b9ff, +0xaff09301, +0x0abe0076, +0xc1a9fff3, +0xf093010a, +0xbe0076c9, +0xd1fff2fd, +0x931858c1, +0x0076e3f0, +0xfff2f0be, +0x1844c1b9, +0x7703f093, +0xf2e3be00, +0x45c1b9ff, +0x1df09318, +0xcea70077, +0xbeffe973, +0xb9fff2d1, +0x9301b4c1, +0x007732f0, +0xfff2c4be, +0x9340c199, +0x00774bf0, +0xb6be8c07, +0xc027fff2, +0x14f9661e, +0xff0017f0, +0x180030f1, +0x32f1ff00, +0xff0016e0, +0x172033f1, +0x42d8ff00, +0x2bb30749, +0xcad027b2, +0xb0070923, +0xb22bb103, +0x4187d307, +0x180043f1, +0xeb07ff00, +0xed0b3103, +0x172049f1, +0x42f1ff00, +0xff00168c, +0x771bf093, +0xe044f100, +0x27ff0016, +0x27e30ea0, +0x053a07a1, +0x25fb15f9, +0xf24fbefd, +0x07c103ff, +0x4084991c, +0x31871f6b, +0xa79014ca, +0xffffffce, +0x0e2ec1b9, +0x7736f093, +0xf22fbe00, +0x2fc1b9ff, +0x50f0930e, +0x22be0077, +0xc1b9fff2, +0xf0930e2c, +0xbe00776a, +0x93fff215, +0x007788f0, +0xfff20cbe, +0x930cc199, +0x00778df0, +0xfff200be, +0x932ac199, +0x0077a8f0, +0xfff1f4be, +0x9312c199, +0x0077c3f0, +0xfff1e8be, +0x9344c199, +0x0077def0, +0xfff1dcbe, +0x933cc1c1, +0x0077f9f0, +0xfff1d0be, +0x9340c1c1, +0x007814f0, +0xfff1c4be, +0x0694c1d1, +0x782ef093, +0xf1b7be00, +0x4cf093ff, +0xaebe0078, +0x0ea7fff1, +0xbefffaf3, +0x07fff9b1, +0x4cf09310, +0x9abe0078, +0x0ea7fff1, +0xbefffaa3, +0x07fff99d, +0x67f09310, +0x86be0078, +0xc027fff1, +0x3c874c07, +0x432b4433, +0x44874c2b, +0x011042f1, +0x1c07ff00, +0x7877f093, +0xbec10300, +0xc4fff165, +0xa7de10cc, +0xfeffff4e, +0x93094b99, +0x00787cf0, +0xcb07b383, +0xc4334b87, +0xc1f9c42b, +0xff000050, +0xffb8ce23, +0xf13bbeff, +0x39c403ff, +0x82f093c1, +0x2ebe0078, +0xc159fff1, +0x789ff093, +0xf123be00, +0x87b103ff, +0x2bb4334b, +0x48b1f1b4, +0x93ff0000, +0x0078b0f0, +0xf80ef103, +0xfff1089e, +0xf4e3f64e, +0x7c46f093, +0xf0fbbe00, +0x277127ff, +0xf14d87d0, +0x02100044, +0x953787ff, +0x0034f1f4, +0xa5ff0210, +0x3cf491f4, +0x40a7e04c, +0x4d070b1e, +0x44f14433, +0xff02180c, +0xf4a1f4b5, +0xa7e04c3c, +0x070b1e40, +0xf1443347, +0x02180c44, +0x30f4c5ff, +0x2738dc30, +0x87091e40, +0x0044f14d, +0xc5ff0216, +0x7c3034f4, +0x1e402738, +0xf1478709, +0x02160044, +0x38f4c5ff, +0xf4c54027, +0x40f4c53c, +0xc544f4c5, +0xf29148f4, +0xf4b1f3a1, +0x00004f38, +0x10a72000, +0x4d070b1e, +0x41f14433, +0xff021804, +0x3830f4c1, +0x0000004f, +0x1e60a720, +0x3347070b, +0x0446f144, +0xc1ff0218, +0x41073cfe, +0x0740fcc1, +0x44fbc11d, +0xc148fac1, +0xf8c134f9, +0x53fd5538, +0x93d20311, +0x007bcaf0, +0xf605f775, +0xfc25fe15, +0xfa45fb35, +0xf885f965, +0x1ebe7203, +0xdce4fff0, +0xc3ff2450, +0x27f68ef4, +0x110ed30f, +0x4efe0b47, +0x074207f6, +0x07930782, +0x533007a2, +0x4fab102c, +0xe2073fab, +0x6007e39b, +0xb0077107, +0x0c531407, +0x9b349b10, +0x0b430710, +0x104c53e1, +0x209be40b, +0x2e031e02, +0x07010000, +0x33b99b4e, +0xa79b10ec, +0x07104c53, +0x073fabd2, +0x0bba0bce, +0x07c30bd4, +0x0b0c071b, +0x4ef68e1d, +0x27c027f5, +0xe00000df, +0x072c0741, +0x07a0073d, +0x20ecbeb1, +0x1f00c800, +0x3d072027, +0x0a071b07, +0x001e4cbe, +0x04074007, +0x94be5107, +0x0f03001f, +0x80000000, +0x1b07f58e, +0x84be0a07, +0xf58e001f, +0xf1a3f54e, +0xc307b207, +0xe307d207, +0x01bd10e8, +0xf3553027, +0x01c9c0e8, +0xbd07a107, +0xeff65007, +0xd1e200ac, +0xdef400cc, +0xe4010000, +0x00ddf401, +0x2703a001, +0x202c2740, +0x345b3b07, +0xb76c33f9, +0x12070001, +0x16e6132b, +0x07204c27, +0x07412b25, +0x3b245b3a, +0xaba20731, +0x3b513ba3, +0x539b07b1, +0x1907109c, +0x64be0a07, +0x80070022, +0x0a071907, +0x002254be, +0x4507ab07, +0xab100c33, +0x104c53af, +0x04abc807, +0xc062ca9b, +0x81230b0b, +0x0cea0b0a, +0xc01b0354, +0x0c071907, +0x002232be, +0x1907d007, +0x22be0c07, +0x45070022, +0xab100c33, +0xabed074f, +0x82ea9b04, +0x230b0be0, +0x020b2ad1, +0x07d123e0, +0x104c3348, +0x04ab0d07, +0x0b1e4027, +0xe1e22e07, +0x002700ca, +0xf3514027, +0x74076007, +0x35c61407, +0x40273027, +0x416b302b, +0x14070307, +0xf58ef183, +0x0127d596, +0xd4be1027, +0xb0070021, +0x0000bef0, +0xf400f301, +0x000000bf, +0x2702b001, +0x4207102c, +0x345b3b07, +0xb76c33f9, +0x82070001, +0x8ff6832b, +0x4b0701dc, +0x9b07ca07, +0xcb2b4fab, +0x35109c53, +0x078127f4, +0xbe0c0719, +0x07002193, +0x071907a0, +0x2183be0c, +0x31450700, +0x100c33fc, +0xab104c53, +0x62ca9b04, +0x230b0bc0, +0xea0b0aa1, +0x1b028e0c, +0x071907c0, +0x2165be0c, +0x07d00700, +0xbe0c0719, +0x07002155, +0x33fe3145, +0x4fab100c, +0xed9b04ab, +0x0b0be082, +0x0b2ad123, +0xd123e002, +0x4c334a07, +0xab0d0710, +0x5e480704, +0xeed0ff3e, +0x63010000, +0x0000eff4, +0x021b0100, +0x07101c27, +0x5b320741, +0x6c33f934, +0x070001b7, +0xd6832b81, +0x2a0a628f, +0xff105bea, +0x40270127, +0x27ff0d5e, +0x2b402730, +0x07416b30, +0x5540a714, +0xec0307f4, +0x27fe3bc0, +0x27d30730, +0x07f35140, +0x2b3f0be4, +0x55ec6bdb, +0xfe265ef3, +0x0100bdf4, +0x402701d1, +0x5e202c27, +0xedf4ff10, +0x01a30100, +0x1c274027, +0xf49f1e20, +0x000000df, +0x27019c01, +0x4207102c, +0x27fe1b5e, +0x382b203c, +0x435b4b07, +0x9407283b, +0xca0792ab, +0xd9074a07, +0xc35b2507, +0x3b10dc53, +0xab235b48, +0x071d0724, +0xbef2150c, +0x45002083, +0x071d07f0, +0x2073be0c, +0x07f41100, +0x33fc41a9, +0xafab100c, +0x3b104c53, +0x9b04abb8, +0xc2fb05ca, +0xf44113c0, +0x4123090b, +0x096af445, +0x4123c042, +0x090bf445, +0x1d07c01b, +0x44be0c07, +0xb0070020, +0x0c071d07, +0x002034be, +0x0c33f411, +0x074fab10, +0x9bd4abd0, +0x0bad42ab, +0xe2b123d9, +0x4101309d, +0x33fc01f4, +0xb4ab104c, +0xf401eb07, +0x0710ec53, +0xab4fab1b, +0x530e071f, +0x210710cc, +0x149b049b, +0x30072c9b, +0x320b4107, +0x07104c53, +0x2b340b2d, +0x02ec9b2a, +0x00ee0303, +0x43070100, +0x0b104c53, +0xb12eeae4, +0x9a2eee00, +0x270b0700, +0xfddc5e40, +0x4c27b83b, +0x07482b20, +0x073a07ca, +0x5b25079b, +0x3b245bc4, +0x109c5338, +0x190723ab, +0xf2250c07, +0x001faebe, +0x1907a007, +0x9ebe0c07, +0x3b07001f, +0x3fabf421, +0x53100c33, +0xc307104c, +0x40abf335, +0xc4a2ca9b, +0xa1234b0b, +0xc4224b4a, +0x4b0ba123, +0x1907c41b, +0x78be0c07, +0xd007001f, +0x0c071907, +0x001f68be, +0xf231f421, +0xab100c33, +0x9b04ab4f, +0x0b20a22d, +0x4ad1230b, +0x2320220b, +0x070b0bd1, +0x104c334a, +0xc007583b, +0xc22b8d07, +0xa85e84ab, +0x074307fd, +0x104c3331, +0x25073fab, +0x430b283b, +0xff5742e2, +0x01230b07, +0x2f5e4027, +0x274827fd, +0xfe5e181c, +0x184c27fd, +0x815e2827, +0x184c27fc, +0x515e2827, +0x184c27fd, +0xe65e1827, +0x274827fd, +0x415e182c, +0x274827fd, +0x615e182c, +0xd0ade2fc, +0x23d90bfe, +0xfec95eb1, +0x0b0b8123, +0x23fca95e, +0x5e0b0ba1, +0xf54efd6f, +0xb207f2e3, +0xd207c307, +0x10e8e307, +0x202701ab, +0xc0e8f2a5, +0xbd070194, +0xa1077007, +0xe265efd6, +0xf000e0d1, +0x010000de, +0xdff401b0, +0x01000000, +0x2c27039a, +0x07420710, +0xf9045b0b, +0x01b76c03, +0x2b420700, +0xad4ff643, +0x75102701, +0x53db07f1, +0x1d0710dc, +0x80be0a07, +0xc007001e, +0x0a071d07, +0x001e70be, +0x47076b07, +0x0c336fab, +0x104c5310, +0x04abc69b, +0x0b0bc062, +0xc0020b2a, +0xc01b0b0b, +0x0700ef5e, +0x26e1c2ce, +0x91078007, +0xf115f005, +0x1fc6f1a1, +0x11f00165, +0x273027f1, +0x6b302b40, +0x07030741, +0x15f30514, +0x8ef2c3f4, +0x00eef0f5, +0x01340100, +0x0000eff4, +0x03180100, +0x07102c27, +0x5b3c0742, +0x6c33f934, +0x070001b7, +0xf6d32bd2, +0x0a013ddf, +0x157bcaca, +0x3a072707, +0x3c2b2b2b, +0x27e24127, +0xa307030e, +0x7207a42b, +0xf705f1a1, +0x8707fa15, +0x1fd69a07, +0x11f0019d, +0x8ef2c3f1, +0x27d596f5, +0xbe102701, +0x07001dcf, +0x00bef0b0, +0x00b80100, +0x0000bff4, +0x02c00100, +0x07102c27, +0x5b0b0742, +0x6c03f904, +0x070001b7, +0xf6532b52, +0x0701d95f, +0x07db07ca, +0x2b10276b, +0x10dc53cb, +0xf1756fab, +0x0c071d07, +0x001d8ebe, +0x1d07a007, +0x7ebe0c07, +0x4707001d, +0x53100c33, +0xa69b104c, +0xa04204ab, +0x0b0a0b0b, +0x02910aea, +0xca2bc007, +0x0c071d07, +0x001d62be, +0x1d07a007, +0x52be0c07, +0x4707001d, +0xab100c33, +0xaba69b4f, +0x0ba06204, +0x020b2a0b, +0x2b0b0ba0, +0x07f1710a, +0x27815b80, +0x15f80590, +0xfeea5ef9, +0x40273027, +0xe407d307, +0xec6bdb2b, +0x27fe615e, +0x2b402730, +0x07416b30, +0xa7140703, +0x5ef3a530, +0xbdf4fe4a, +0x021c0100, +0x2c274027, +0xff4b5e20, +0x0100ddf4, +0x40270206, +0x5e202c27, +0xedf4fe53, +0x01d80100, +0x2c274027, +0xfecf5e20, +0x2707f475, +0x5b204c13, +0x07f47124, +0x07343b3a, +0x3ba3aba2, +0x5e743bb4, +0x4c27fe41, +0x254d2b20, +0x07f021f4, +0x07405b4b, +0x073d3b3c, +0x0753ab54, +0x07ca0747, +0x5b3a0765, +0x533d3bc0, +0x405b106c, +0x160743ab, +0xf4550c07, +0x001c9abe, +0x1607f095, +0x8abe0c07, +0xf451001c, +0xfc911507, +0x0c331fab, +0x104c5310, +0x7d3bbd3b, +0x04abf185, +0xfb35c19b, +0xc0c2f745, +0x0bf29113, +0x95212305, +0x42056af2, +0x952123c0, +0x1b050bf2, +0x071607c0, +0x1c55be0c, +0x07a00700, +0xbe0c0716, +0x51001c45, +0x100c33f4, +0x4fabf781, +0xb4abb007, +0x7b427a9b, +0xa123b50b, +0x015a5be2, +0x3a07f491, +0xab104c33, +0x31c30734, +0x533fabf4, +0xfe3110cc, +0xa3074fab, +0xec530c07, +0x9b130710, +0x9ba49b04, +0x0720071e, +0x53210b4a, +0x1b07104c, +0x240b3c07, +0x3e9b172b, +0x3e030202, +0x07010000, +0x104c5342, +0x32070307, +0x3c33040b, +0xab4a0710, +0x0b23074f, +0x8910ea24, +0x0801ee00, +0x5e011b01, +0xb53b0095, +0x4c134507, +0x07ca0720, +0x07db073a, +0x53c45b27, +0x245b10dc, +0x23ab353b, +0x0c071d07, +0xf575f265, +0x001baabe, +0x1d07a007, +0x9abe0c07, +0xf461001b, +0x6fab6b07, +0x53100c33, +0xa69b104c, +0xa46240ab, +0x4b2a4b0b, +0x4b0ba402, +0xca2bc407, +0x0c071d07, +0x001b7abe, +0x1d07a007, +0x6abe0c07, +0xf461001b, +0xab100c33, +0xaba69b4f, +0x0ba06204, +0x020b2a0b, +0x070b0ba0, +0x2b753bc0, +0xfdbe5eca, +0x3007f431, +0x352b421b, +0x42c20127, +0x07302b63, +0x07032b01, +0x41f44124, +0x27422bf1, +0x27140a31, +0x21301b30, +0x074d5bf0, +0x07203b23, +0xab930784, +0x059d5b82, +0x5ef915f8, +0x4827fcd0, +0x5e182c27, +0x4c27fcf9, +0x5e282718, +0x4c27fc67, +0x5e282718, +0x4c27fce9, +0x5e282718, +0x4827fd41, +0x5e182c27, +0x4827fc4f, +0x5e182c27, +0x4027fd31, +0x27fcf15e, +0x0b9b1e00, +0xfd6e5e0b, +0xfea67be2, +0xb50ba123, +0x41fe9f5e, +0x7932eaf3, +0x1e0027ff, +0x63f54e89, +0x07f035f1, +0xf6d207b1, +0xe200b83f, +0xf400f621, +0x0100002e, +0x2df401c8, +0x037a0100, +0x2c274027, +0x5b3d0720, +0x6c33f934, +0x070001b7, +0x66e32be2, +0x27f231e7, +0x4e2b204c, +0xf431245b, +0x3e3b3b07, +0x4e3bb207, +0xf435b3ab, +0xad07de3b, +0x0710ac53, +0xbe0b071a, +0x07001a6b, +0x071a0790, +0x1a5bbe0b, +0x07f43100, +0x100c336d, +0x4c536fab, +0xabc90710, +0x62c69b04, +0x230d0bc0, +0xea0d0a91, +0x1b033a0c, +0x071a07c0, +0x1a39be0c, +0x07b00700, +0xbe0c071a, +0x31001a29, +0x100c33f4, +0x3b074fab, +0x369b04ab, +0x0d0b3082, +0x0d2ab123, +0xb1233002, +0x4c334907, +0xab0b0710, +0x07402704, +0x07700714, +0x8ef14384, +0xea2307f5, +0xf000fb13, +0x0100003e, +0x3ff400e6, +0x01000000, +0x1c2702a8, +0x07410710, +0xf9345b32, +0x01b76c33, +0x2b610700, +0x016ff663, +0x312b2a01, +0xcd4deaf4, +0x27012700, +0x07140740, +0x43840770, +0x96f58ef1, +0x27012725, +0x19b5be10, +0xf0d00700, +0x010000de, +0xdff400ba, +0x01000000, +0x2c270270, +0x07420710, +0xf9345b3d, +0x01b76c33, +0x2b920700, +0x939ff693, +0x07cb0701, +0x2b6d07ad, +0x10ac53cd, +0x51276fab, +0x0c071a07, +0x001976be, +0x1a079007, +0x66be0c07, +0xf4310019, +0x53100c33, +0xc907104c, +0xc69b04ab, +0x0d0bc062, +0x0d0a9123, +0x02500cea, +0x1a07c01b, +0x48be0c07, +0xb0070019, +0x0c071a07, +0x001938be, +0x0c33f431, +0x074fab10, +0x9b04ab3b, +0x0b308236, +0x2ab1230d, +0x2330020d, +0x334907b1, +0x0b07104c, +0x450704ab, +0x70071407, +0xf1438407, +0x3df4f58e, +0x01ce0100, +0x1c274027, +0xff1d5e20, +0x40270027, +0x70071407, +0xf1438407, +0xddf4f58e, +0x01ca0100, +0x2c274027, +0xff495e20, +0x00002ff4, +0x01c20100, +0x07102c27, +0xfe375e42, +0x2b203c27, +0x5b4d0736, +0x07263b43, +0x31a2aba4, +0x07cb07f2, +0x5b4b079a, +0x3b235bc3, +0x109c5346, +0x190724ab, +0xf2150c07, +0x0018aabe, +0x19075007, +0x9abe0c07, +0x3a070018, +0x3fabf411, +0x53100c33, +0xc307104c, +0xf345d63b, +0xc59b04ab, +0xc0a2fd05, +0x51230a0b, +0xc0220a4a, +0x0a0b5123, +0x1907c01b, +0x70be0c07, +0xb0070018, +0x0c071907, +0x001860be, +0x0c33f411, +0xabf94110, +0xabd0074f, +0x429b9bd4, +0x23da0b9d, +0x39ade2b1, +0x33450701, +0xb4ab104c, +0xf401eb07, +0x0110ec53, +0xab1b07fc, +0x071fab4f, +0x10cc530e, +0x049b2107, +0x2c9b149b, +0x41073007, +0x4c53320b, +0x0b2d0710, +0x9b292b34, +0x030302ec, +0x010000ee, +0x4c534307, +0xeae40b10, +0xee00b32e, +0x07009c2e, +0x5e40270b, +0xd93bfe35, +0x31204c27, +0x07492bf2, +0x07ad07cb, +0x5bc45b3b, +0x53393b24, +0x23ab10ac, +0x0c071a07, +0xd8bef225, +0x50070017, +0x0c071a07, +0x0017c8be, +0x6d07f421, +0xab100c33, +0x104c536f, +0x40abc507, +0xc4a2c69b, +0x51234d0b, +0xc4224d4a, +0x4d0b5123, +0x1a07c41b, +0xa4be0c07, +0xb0070017, +0x0c071a07, +0x001794be, +0x0c33f421, +0x074fab10, +0x9b04ab2b, +0x0b20a226, +0x4ab1230d, +0x2320220d, +0x070d0bb1, +0x33f33145, +0xc007104c, +0x393b5b07, +0x54abc22b, +0xed5ef335, +0x314307fd, +0x333107f2, +0x3fab104c, +0x430b263b, +0xff5542e2, +0x01230b07, +0x14074027, +0x84077007, +0xf58ef143, +0x27184c27, +0xfd595e18, +0x1c274827, +0xfd515e18, +0x27184c27, +0xfd915e28, +0x2c274827, +0xfc875e18, +0x2c274827, +0xfd815e18, +0x27184c27, +0xfc775e28, +0xfec79de2, +0xb123da0b, +0x23fec05e, +0x5e0d0b91, +0x9123fcc3, +0xad5e0d0b, +0xd00401fd, +0x13011342, +0x44c032b0, +0xa4342049, +0x3c32c042, +0x45c61411, +0x01071127, +0x3284fe0b, +0x42c60411, +0x010710a7, +0x0311fe0b, +0x344e1411, +0x10a73106, +0x0221f11e, +0x42da1421, +0x31247af4, +0xca103104, +0x0442eb04, +0xa7ce3fd6, +0x27d81e10, +0x0b010710, +0xc934c4fe, +0x04111111, +0xbb1e142b, +0x0301fb4e, +0x012f32d0, +0x2842d014, +0x00fb34e0, +0xc42144c0, +0x32c42242, +0x1123051d, +0x21241504, +0x31242504, +0x11243504, +0x07141103, +0x15438b02, +0x07fb8e24, +0xc0fb8e01, +0x0c21fa32, +0xec071421, +0x0b31e42b, +0xde071331, +0xc867e0c8, +0xfa4c20ec, +0x07008c4c, +0x11b027c4, +0xce141100, +0x0f667404, +0x30c83b2b, +0x1540277e, +0x352c2524, +0x07213123, +0xd4412341, +0xffffff4f, +0x2321163f, +0x31231147, +0x21354107, +0x41232325, +0xffff4fd0, +0x27ee3fff, +0xc8240543, +0x02072810, +0xd1c8fb8e, +0x3b412752, +0x8b41234e, +0x86d02743, +0x5bd12744, +0x1e3dab3e, +0xcce013a7, +0x1e9920ec, +0x1e3b1be2, +0x072421a6, +0x83315331, +0x0313ab11, +0x35020741, +0x8e242521, +0x0b1b07fb, +0x25201513, +0x1e21352c, +0x5e3027b3, +0x3013ff77, +0x24154127, +0x23352c25, +0xdfe6801e, +0x4127ff67, +0x41234e3b, +0xce0b4b8b, +0x4486d027, +0xbe5bd127, +0x505ebdab, +0x2a44e4ff, +0x111311ff, +0x2234ee04, +0x09f093ff, +0xfb8e006e, +0x30070001, +0x3c534007, +0x1f4c5317, +0x14152007, +0x2e833f6b, +0xd67fffff, +0x2728c639, +0x7d3ca743, +0x42071405, +0x47331325, +0x00004f74, +0x44474000, +0x4fd03123, +0x40000000, +0x351325f6, +0x27fe0b14, +0x0b140542, +0xff3cc0fe, +0x23273316, +0x2fa37f3c, +0x40000000, +0x12354327, +0x14051325, +0x2516fe0b, +0x14054427, +0x0e83fe0b, +0x46100000, +0x05412705, +0x0b123514, +0x1e1005fe, +0x63f54ef9, +0x051f07f1, +0x071403f0, +0xff7a7e0f, +0x4027f341, +0x22532307, +0x42abf011, +0xf231f121, +0xbe1e3c33, +0x07000c79, +0x8ef14351, +0xa3fb4ef5, +0x03bf07f2, +0x15f005b8, +0x070f07f1, +0xff4a7e1b, +0xcc03cf07, +0x030f0718, +0x7e1c0704, +0x0b07ff3c, +0xba7e1c07, +0x8ef283fd, +0x310401fb, +0xd0021103, +0x44c06442, +0xf6420057, +0x27402735, +0x3304ab00, +0x02ab1f2c, +0x0021fe0b, +0xff820fc8, +0xcc5bffff, +0x0739800c, +0x7f4c8343, +0xc07f0c03, +0x031e404c, +0x30c83f3c, +0x53430721, +0x830f6b47, +0x7fffff4e, +0xab170c33, +0x1f2c3304, +0xfe0b02ab, +0xe3803cd8, +0x1e403c03, +0x033153de, +0x27db1e01, +0x000f2740, +0x1e7f8000, +0xa34307a9, +0x1000004e, +0xffff4e83, +0x000f277f, +0x1e7f8000, +0x820f1395, +0xccffffff, +0x27531a0c, +0x23403b41, +0x27438b41, +0x27448610, +0x07305b11, +0x0701ab03, +0x7f4c8340, +0x3c404cc0, +0x4c034007, +0x5334073f, +0xd0012737, +0x0000004f, +0x43072040, +0xffff4e83, +0x170c337f, +0x07ff505e, +0x404c0340, +0x37533407, +0x4fd40127, +0x40000000, +0x1e0027e2, +0x270027de, +0xdcd81e30, +0x07e1800c, +0x27375330, +0x000f1441, +0x27400000, +0x1e040740, +0x23fe4ec2, +0x07f005f1, +0x25f1150f, +0x7ef335f2, +0xf103fef9, +0xfd4efe8e, +0xdf07f163, +0xf005d403, +0x0f071d07, +0x21fe137e, +0x963027f4, +0x07312744, +0x7ef3250d, +0xf143fed5, +0xfc4efd8e, +0xcf07f2a3, +0xf005c803, +0x0f07f115, +0xed7e1c07, +0x03df07fd, +0x0f0718dc, +0x1d070403, +0x21fddf7e, +0x1622d0f2, +0x12f0f161, +0xf4310081, +0x43cbf371, +0x2400f435, +0x6e1822c4, +0x7e0c0712, +0xf283fe91, +0xf093fc8e, +0x7e006bbc, +0xf283fe85, +0x14c0fc8e, +0x3912c05d, +0xf481f241, +0x242bf351, +0xf245f191, +0x21231342, +0x3347f245, +0x00002f27, +0x00274000, +0x2a1f4c27, +0x2b02ab31, +0x47215331, +0x07f49833, +0x7f4c8340, +0x12404cc0, +0xae1ef055, +0x0c074427, +0x3a7ef425, +0x8ef283fe, +0x800cdcfc, +0x033166ec, +0x0ce3400c, +0x1ef0557f, +0x1e0d0791, +0x0740278f, +0x55f4450c, +0x4e851ef4, +0x07f3a3fc, +0x05c803cf, +0x07f115f0, +0x7e1c070f, +0xdf07fd34, +0x0718dc03, +0x0704030f, +0xfd267e1d, +0x4290f421, +0x32d0f361, +0xdc44e024, +0xcc34e000, +0x1642c400, +0xf471f331, +0x340e2027, +0x0c072127, +0xd27ef235, +0x8ef383fd, +0x1632c4fc, +0xf471f331, +0x340e2027, +0x0d072127, +0xba7ef275, +0x8ef383fd, +0x91f251fc, +0x273027f0, +0xeef5be10, +0x41f381ff, +0x0bd107f4, +0x27420343, +0x30f4c530, +0xf471f3b5, +0x2107f331, +0x4127342e, +0x3d07f4b5, +0xc11a20cc, +0x215330f4, +0x31384103, +0x0fa30153, +0x80000000, +0x20c83207, +0x30f4c5ee, +0x00002fd4, +0xc1234000, +0x091e30f4, +0x2fb40047, +0x40000000, +0x41232247, +0xa3f200cc, +0xd0004721, +0x0000002f, +0xf4c5ef40, +0x83420730, +0x4cc07f4c, +0x0f071440, +0x0c034327, +0x34f2c528, +0x2e7ef4a5, +0x8ef383fd, +0x802cdcfc, +0x030126ea, +0x2ce3402c, +0xe4e01e7f, +0x93ff4f42, +0x006a47f0, +0xe4ff3d5e, +0x93ff2b32, +0x006a3bf0, +0x4eff315e, +0x07f3a3fb, +0x05b803bf, +0x07f115f0, +0x7e1b070f, +0xcf07fc20, +0x0718cc03, +0x0704030f, +0xfc127e1c, +0x2f07f471, +0x1c0741c3, +0x07282c03, +0x7ef4750b, +0xce7efae4, +0x8ef383fc, +0xa3fb4efb, +0x03bf07f3, +0x15f005b8, +0x070f07f1, +0xfbe67e1b, +0xcc03cf07, +0x030f0718, +0x7e1c0704, +0x2f07fbd8, +0x2c031c07, +0x7e0b0728, +0x9a7efab0, +0x8ef383fc, +0x23fc4efb, +0x054327f1, +0x08c127f4, +0x36c02700, +0x05422706, +0x150f07f4, +0xfc7b7efc, +0xfc8ef103, +0xd007c876, +0x071e4c27, +0x35f4250d, +0x115bbefd, +0xc8012300, +0x4c27e001, +0x2bd03b1e, +0x25fd3540, +0x40d31ef4, +0x0000000f, +0x13d00780, +0x27d61ed0, +0x0000000f, +0x4ec61ecf, +0x07f2a3fc, +0x05c803cf, +0x07f115f0, +0x7e1c070f, +0xdf07fb5c, +0x0718dc03, +0x0704030f, +0xfb4e7e1d, +0x42d0f421, +0x90f46110, +0x070c0742, +0xf9c37e1d, +0xfc8ef283, +0xf91e0127, +0xf163fe4e, +0xf0051f07, +0x0f071403, +0x11fb277e, +0x274244f4, +0x8ef14300, +0xf842d0fe, +0xf4314440, +0x88f140c8, +0xf4211f4c, +0x0f2747c6, +0x80000000, +0xfe8ef143, +0xf321f041, +0x5b1e4c13, +0xd63fc604, +0xf1430013, +0x0f27fe8e, +0x7fffffff, +0xfe8ef143, +0xf2a3fe4e, +0x1f07f115, +0x1803f005, +0xd57e0f07, +0x070f07fa, +0x0304031f, +0xc97e181c, +0x90f421fa, +0x27f46142, +0x83423000, +0x27fe8ef2, +0x8ef28301, +0xa3fc4efe, +0x03cf07f2, +0x15f005c8, +0x070f07f1, +0xfaa27e1c, +0xdc03df07, +0x030f0718, +0x7e1d0704, +0xf421fa94, +0x611042d0, +0x074290f4, +0x7e1d070c, +0xf283f909, +0x0127fc8e, +0xfc4ef91e, +0xcf07f2a3, +0xf005c803, +0x0f07f115, +0x697e1c07, +0x03df07fa, +0x0f0718dc, +0x1d070403, +0x21fa5b7e, +0x1042d0f4, +0x4290f461, +0x1d070c07, +0x83f8d07e, +0x27fc8ef2, +0x4ef91e01, +0x07f2a3fc, +0x05c803cf, +0x07f115f0, +0x7e1c070f, +0xdf07fa30, +0x0718dc03, +0x0704030f, +0xfa227e1d, +0x42d0f421, +0x90f46110, +0x070c0742, +0xf8977e1d, +0xfc8ef283, +0xf91e00a7, +0xf2a3fc4e, +0xc803cf07, +0xf115f005, +0x1c070f07, +0x07f9f77e, +0x18dc03df, +0x04030f07, +0xe97e1d07, +0xd0f421f9, +0xf4611042, +0x0c074290, +0x5e7e1d07, +0x8ef283f8, +0x1e00a7fc, +0xa3fc4ef9, +0x03cf07f2, +0x15f005c8, +0x070f07f1, +0xf9be7e1c, +0xdc03df07, +0x030f0718, +0x7e1d0704, +0xf421f9b0, +0x611042d0, +0x074290f4, +0x7e1d070c, +0xf283f825, +0x0127fc8e, +0xfd4ef91e, +0xd007f123, +0x42270676, +0x0f07f405, +0xf4154027, +0x03fa547e, +0x27fd8ef1, +0x1e3c2743, +0xf325f405, +0x36bef035, +0x0123000f, +0xc61c00c8, +0x4c27dd0f, +0x3b402b1e, +0x07f425d0, +0x3540270f, +0x7ef415fd, +0xf103fa25, +0x2007fd8e, +0x41272013, +0x4123423b, +0x30274d8b, +0xd25b4636, +0xab1e4c27, +0x35402b3d, +0x1ef425f3, +0x1e3127a6, +0x01fd4eee, +0x1342d004, +0x32b01301, +0x205d44c0, +0xc042a434, +0x14114832, +0x112745c6, +0xfd8e0107, +0x04113284, +0x10a742c6, +0xfd8e0107, +0x14110311, +0x3106344e, +0xf11e10a7, +0x14210221, +0xdaf442da, +0x0d311524, +0x10310e41, +0x1eca1141, +0x141ecee6, +0xe16ee12a, +0x3fd60d42, +0x1e10a7c2, +0x071027cc, +0xc2fd8e01, +0x3fd6ebd0, +0xc4b01ecc, +0x1111b534, +0x142b0411, +0xf54ea71e, +0x5027f1a3, +0x03016027, +0xf645f535, +0x7107c007, +0x8027b207, +0x32d09027, +0xf014012f, +0xe0017d42, +0xe0024b34, +0xc4017544, +0x32c42442, +0x0732071b, +0x01252740, +0x05440341, +0xa8340331, +0x11c311f2, +0x8bcb0774, +0x07b41543, +0x8ef1830c, +0x4b32e0f5, +0x210e2101, +0x41fe2514, +0x07023103, +0x05f315ae, +0x31a42bf2, +0x071e411d, +0xdfa0e83a, +0x40accc00, +0x7c31e84c, +0x233a0701, +0xf355203c, +0x60275027, +0x01dc30e8, +0x14074127, +0x2127133b, +0x0a3b0207, +0x40a730a7, +0x414b300b, +0x4e8b3d8b, +0x34c634ab, +0x60275127, +0x40e8f451, +0x8e0701a4, +0x9e07845b, +0xd5079a5b, +0xd8abe607, +0x111ee9ab, +0x43faf321, +0x10270106, +0xf4252027, +0xf215f105, +0x7411c011, +0x00db04ee, +0x00cc0fe6, +0xf411f301, +0x2e071d07, +0x246b132b, +0x00f220e8, +0xb4154027, +0xb135f421, +0xb245b425, +0xbd41bc31, +0x40a730a7, +0x4d4b3c0b, +0x00004fd4, +0xe0311000, +0xffffff4f, +0x2100c00f, +0x534c07b1, +0x3d471f4c, +0x2c4734ab, +0xb235b345, +0xbd41bc31, +0x30a71123, +0xb12540a7, +0x4d4b3c0b, +0x00004fd0, +0x271e1000, +0xd4b40543, +0x000000df, +0xcb072c20, +0xf1830c07, +0xa013f58e, +0x6d40acec, +0xff1f5eff, +0xffff4fc4, +0xd0b70fff, +0xffffff3f, +0x4327b0ff, +0xdfd0b405, +0x20000000, +0x073c07d6, +0x1f0c330d, +0x31532027, +0xbe214d07, +0x30ab1c07, +0x02074153, +0x118304ab, +0xe103cb07, +0xb04513ab, +0x0c07f183, +0xbe25b135, +0xc707f58e, +0xf1830c07, +0xf101f58e, +0x1d2bf211, +0x395e2e6b, +0x11f101ff, +0x0bb015f2, +0x072e4b1d, +0x07f221d2, +0x35b225c1, +0x5ebd45bc, +0xd027ff73, +0x015ee027, +0xff3ff4ff, +0x64ffffff, +0xff395eff, +0x3027fd21, +0x312b4027, +0x2127426b, +0xbd25b215, +0xb445b335, +0xe6ff075e, +0x21fedb3f, +0x232a07f3, +0x3a0b202c, +0xf325f255, +0x10270027, +0x009120e8, +0x64074127, +0x2127623b, +0x5a3b5207, +0x30a7f201, +0x350b40a7, +0x328b464b, +0x428bf211, +0x34c634ab, +0x10270127, +0x30c8f351, +0x5bf41150, +0x11f43543, +0x5bf431f3, +0xab23073a, +0x4521ab40, +0x15f405f3, +0xfe825ef2, +0x2b204c27, +0x071e074a, +0x5b143b8d, +0x5e81ab8a, +0x3c27fe52, +0x2b412720, +0x5b14073a, +0xfe205e13, +0xfdd944e4, +0x04111311, +0xfdd134ee, +0x644efc93, +0xfdc95e00, +0x11204c27, +0x2bf301f2, +0x5b243b4a, +0x0742073a, +0x3524ab23, +0x27a11ef2, +0x4127203c, +0x64073a2b, +0x6b5e635b, +0x11f84eff, +0x0709010a, +0x533a07ba, +0x3c531fbc, +0x07b18314, +0x15ea0703, +0xff0d831b, +0x07c02707, +0x83d90781, +0x0fffffee, +0x49070e16, +0x45164eab, +0x14054227, +0x4327f88e, +0x03fd3da7, +0x13251405, +0x1e074907, +0x33184c53, +0xab090718, +0xd4083314, +0x0000001f, +0xe3071d10, +0x41472007, +0xab1f2c53, +0x07304742, +0x23140703, +0x004fd0e1, +0xe9100000, +0x80358e25, +0xf88e8145, +0x07ff0dc0, +0x07290728, +0x182c534e, +0x42ab4833, +0x2fa32407, +0x10000000, +0x38333907, +0x03ff0d23, +0x23271245, +0x12051025, +0xf88e1335, +0x4eab4907, +0x44274516, +0xf88e1405, +0x30274e07, +0x00004e83, +0x8634ab08, +0x05412735, +0x458d3514, +0x05f88e8e, +0x4ef71e13, +0x07f1e3f5, +0x071f0751, +0x07180340, +0x15f4050f, +0xff237ef5, +0xf461f351, +0x1f831307, +0x3fffffff, +0x04872027, +0xab1e3c53, +0x8630ab12, +0x2131a314, +0x41f131f0, +0xf6d7bef2, +0x8ef1c3ff, +0xa3f54ef5, +0x03af07f3, +0xc10710ac, +0x1a07b007, +0xf3350f07, +0x5307f225, +0xfb05fc15, +0xda7ecf07, +0x24cc03fe, +0x08030f07, +0xce7e1c07, +0x070a07fe, +0xfbab7e1c, +0xf58ef383, +0x0401f64e, +0xa0279027, +0x0e410d31, +0x42f00811, +0x44e000c9, +0x424000ba, +0x4eab4d07, +0x002747f6, +0x38071027, +0x43073183, +0x271f4c33, +0x07b00730, +0xabb3abc1, +0x070b07c4, +0x21f68e1c, +0x020fe800, +0xb1fffffc, +0x000dec00, +0x07008504, +0x273f6b3d, +0xff0d0340, +0x803cc003, +0x7f3c2756, +0xd30b4027, +0xefd0e44b, +0x20000000, +0x072e0716, +0x334e073d, +0x31531f2c, +0x415332ab, +0xe407d307, +0x20070103, +0x0d074e07, +0x2d831e07, +0x185307ff, +0x4c333207, +0xab085318, +0x33e10704, +0x2027143c, +0xee83d007, +0x070fffff, +0xab130702, +0x5e1eab0d, +0x4fd6ff76, +0x833d07a9, +0xab01003d, +0xa73fc634, +0x27803c27, +0x4bd30b40, +0x00efd0e4, +0xb3200000, +0x00279c1e, +0x00001f27, +0x4b5e7ff0, +0xa34e07ff, +0x0800004e, +0xee83e407, +0x070fffff, +0xa30d071e, +0xf000001f, +0xff305e7f, +0xfc020f13, +0x0cecffff, +0x0700ba39, +0x201c2310, +0x70276027, +0x00b510e8, +0xc4074127, +0x2127c13b, +0xb03bb207, +0x40a730a7, +0x4c4b3b0b, +0x4e8b3d8b, +0x34c634ab, +0x70276127, +0x009f10e8, +0x915b9e07, +0xd9abd607, +0x3d07ae07, +0xe707a05b, +0xeaab3f6b, +0x3cc04027, +0x3c274480, +0x0b40277f, +0x074e4b3d, +0x182c3324, +0x4f14c127, +0x10000000, +0x0307c027, +0x14070853, +0x185302ab, +0x3d833c07, +0x430707ff, +0x4c33e107, +0x07302714, +0xffee83d0, +0x03070fff, +0x0dab1407, +0x975e1eab, +0xbb4fd6fe, +0x3d833d07, +0x40270100, +0x3cb634ab, +0x4c334e07, +0x14c12718, +0x000000ef, +0x07c02710, +0x0708530d, +0x5304ab1e, +0x27b61e18, +0x270027c0, +0x27ae1e10, +0x4127203c, +0xc407302b, +0x475ec35b, +0x204c27ff, +0x3e07402b, +0x343b9d07, +0x93ab905b, +0x27ff575e, +0x6a5e803c, +0x63f54eff, +0x07f005f1, +0x25f1150f, +0x45f335f2, +0xfe0a7ef4, +0xf1435107, +0xf54ef58e, +0xdf07f1e3, +0x4007d803, +0x0f075107, +0xf4051d07, +0xae7ef515, +0x27f431fc, +0x27449630, +0x350d0731, +0xfdde7ef3, +0xf1c35107, +0xf54ef58e, +0xc107f3e3, +0xb0071f07, +0x07101c03, +0x35f2250f, +0x05fc15f3, +0xfc7f7efb, +0xdc03df07, +0x030f0724, +0x7e1d0708, +0xf241fc71, +0x911622d0, +0x0912f0f1, +0xa1f45101, +0x5543cbf3, +0xc42400f4, +0x12ae1f22, +0x0c030f07, +0xfd8e7e10, +0xf3c35107, +0xf093f58e, +0x7e006068, +0x5107fd80, +0xf58ef3c3, +0x00df14e0, +0x617f12c0, +0x81f4b1f1, +0xc1142bfc, +0xf16534f8, +0xf7c1fb71, +0x84c8ea30, +0x7d8cce00, +0x273d4c27, +0x00af2790, +0x27100000, +0xc5602750, +0xd50738f4, +0x4a07e607, +0xeaabd9ab, +0x8a1f4c33, +0x548ccec8, +0x6e075d07, +0xc86bb72b, +0x21532907, +0x4b0724ab, +0x471f4c53, +0xc114ab1c, +0x3a0738f4, +0x31534123, +0xf4c50b47, +0x07920738, +0x07b007a3, +0xbf4fd6c1, +0x3f6b3507, +0x3cc04027, +0xf5753880, +0x615ef685, +0x270f07ff, +0x100c0344, +0xe97ef445, +0xc35107fc, +0xcaf58ef3, +0xa91eb3b7, +0x07827bc2, +0x534c472b, +0x42ab1f2c, +0x11233b47, +0xc407b307, +0x6d5ef165, +0xc74fd6ff, +0x3d833507, +0x34ab0100, +0x07bc3fd6, +0xc641ab40, +0x3c27b54f, +0x0b402780, +0x07464b35, +0xff5ce353, +0xa31e6407, +0x0a5e0d07, +0x270f07ff, +0x27402730, +0x100c0320, +0xf485f375, +0xf65ef265, +0xe3f54efe, +0x03af07f5, +0xb00710ac, +0x0f07c107, +0xf3351a07, +0xfc15f225, +0x2a7efb05, +0x03df07fb, +0x0f0724dc, +0x1d070803, +0x41fb1c7e, +0x914290f4, +0x2632d0f3, +0x01f344e0, +0x01e334e0, +0x511842c4, +0x27f4a1f3, +0x27340e20, +0x550a0721, +0xfc367ef2, +0xf5c35107, +0x32c4f58e, +0xa1f35118, +0x0e2027f4, +0x07212734, +0x7ef2a50d, +0x5107fc1c, +0xf58ef5c3, +0x7130fbc1, +0x27a027f7, +0xc12b0760, +0x360734fc, +0x07071a07, +0xffe2eabe, +0x30275b07, +0xfbc5bc07, +0x50f3c54c, +0xc554f0c5, +0xf0c158f1, +0x50f1c14c, +0xf8813a07, +0xc8be2707, +0xc027ffe2, +0xa1079007, +0x36072507, +0x1c070807, +0xffe2b6be, +0xe107d007, +0xea4bd90b, +0xeaeab807, +0xaeee00fd, +0x102700f5, +0xc154f3c1, +0x910758f4, +0x930bad07, +0x7027a44b, +0xa4ea8027, +0xf4c100f9, +0x2c4aee58, +0x50f3c101, +0x074cf2c1, +0x071c070b, +0xe275bebe, +0x61f3b1ff, +0x0bc027f4, +0x27440343, +0x40f4c530, +0xa13cf3c5, +0x0bf351f4, +0x0bc14bb0, +0x2ec84bb7, +0xc5412734, +0xcfd03cf4, +0x20000000, +0x40fec13f, +0x1b074c07, +0x531f4c33, +0x072c0711, +0x5314ab0a, +0x1f0c3321, +0xb1d8e103, +0x07390715, +0x5331534a, +0x0730ab41, +0xa39307a4, +0x000000af, +0x07b10780, +0x002fd4c2, +0xc9200000, +0xd440fec5, +0x000000cf, +0xfec13110, +0x53490740, +0x2b071f4c, +0x14ab1a47, +0x471f2c53, +0x4742ab4c, +0x0709473b, +0x23c407b3, +0x59a0c8e1, +0xa1079007, +0x0000cfd0, +0xc5d71000, +0x3b0740fe, +0x40273f6b, +0x49803cc0, +0x43270f07, +0xc5380c03, +0xfcc544fb, +0x38f4c548, +0x07facb7e, +0x8ef5c351, +0x0b9de2f5, +0xc11027ff, +0xf4c154f3, +0x07910758, +0x4b930bad, +0x277027a4, +0x0b4ae281, +0x273127ff, +0x4b730b40, +0xff075e84, +0xb30731a3, +0xa11ec407, +0x07b64fd6, +0x003d833b, +0xd634ab01, +0x4907ab3f, +0x4fc64aab, +0x803c27a4, +0x3b0b4027, +0xb3074c4b, +0x07ffbce3, +0xe2921ec4, +0x1efed439, +0x3a42e4c1, +0x45f093fe, +0x265e005d, +0x1432e4fe, +0x39f093fe, +0x1a5e005d, +0xe3f54efe, +0x03af07f4, +0xc10710ac, +0x1a07b007, +0xf3350f07, +0xfc15f225, +0xcf07fb05, +0x03f8f47e, +0x0f0724cc, +0x1c070803, +0xa1f8e87e, +0xc32f07f4, +0x031c0741, +0x0a07382c, +0x2f7ef4a5, +0xfa127ef6, +0xf4c35107, +0xf54ef58e, +0xaf07f4e3, +0x0710ac03, +0x07b007c1, +0x350f071a, +0x15f225f3, +0x07fb05fc, +0xf8af7ecf, +0x0724cc03, +0x0708030f, +0xf8a37e1c, +0x1c072f07, +0x07382c03, +0xf5f07e0a, +0x07f9d37e, +0x8ef4c351, +0x63fb4ef5, +0x054327f1, +0x08b127f4, +0x36b02700, +0x05422707, +0x150f07f4, +0xf9b27efb, +0x41073007, +0x14070307, +0xfb8ef143, +0x4007bb36, +0xd0270407, +0x4c27c407, +0x35f4253c, +0xbefd45f0, +0x07000425, +0x1d1c0310, +0x23cf11c8, +0x2300c803, +0x403b4c07, +0x4c07f445, +0x3b3c3c27, +0x35312b41, +0x1ef325f4, +0x000fc0b5, +0x1a800000, +0x40134007, +0x4c27bf1e, +0x07412b20, +0x5b3d072c, +0xab313b24, +0x1ef34532, +0x273027d2, +0xe000004f, +0x4e961ec1, +0x07f3a3f5, +0x10dc03df, +0x51074007, +0x1d070f07, +0xc307f405, +0xf225f335, +0xbf07f515, +0x03f7e47e, +0x0f0724bc, +0x1b070803, +0x41f7d87e, +0x1042d0f4, +0x4290f491, +0x1b070d07, +0x83f4ac7e, +0x27f58ef3, +0x4ef91e01, +0x07f1e3f5, +0x071f0751, +0x07180340, +0x15f4050f, +0xf7ab7ef5, +0x4244f421, +0xf1c30027, +0x42d0f58e, +0x414440f8, +0xf140c8f4, +0x311f4c88, +0x274946f4, +0x0000000f, +0x8ef1c380, +0x3cec27f5, +0x4e07e42b, +0xc8204c23, +0xf2611c40, +0x045b0207, +0x4fc6f431, +0xc30013ca, +0x27f58ef1, +0xffffff0f, +0x8ef1c37f, +0x27f261f5, +0x4e2b204c, +0x343b3207, +0xf3514307, +0x0e5b0307, +0xd51e04ab, +0xf3a3f54e, +0x1f075107, +0x1c034007, +0x050f0710, +0x07b207f4, +0x25f335c3, +0x7ef515f2, +0x0f07f729, +0x08031f07, +0x7e241c03, +0xf441f71d, +0xf4914290, +0x42300027, +0xf58ef383, +0xf3830127, +0xf54ef58e, +0xdf07f3a3, +0x0710dc03, +0x07510740, +0x051d070f, +0x35c307f4, +0x15f225f3, +0x7ebf07f5, +0xbc03f6e9, +0x030f0724, +0x7e1b0708, +0xf441f6dd, +0x911042d0, +0x074290f4, +0x7e1b070d, +0xf383f3b1, +0x0127f58e, +0xf54ef91e, +0xdf07f3a3, +0x0710dc03, +0x07510740, +0x051d070f, +0x35c307f4, +0x15f225f3, +0x7ebf07f5, +0xbc03f6a5, +0x030f0724, +0x7e1b0708, +0xf441f699, +0x911042d0, +0x074290f4, +0x7e1b070d, +0xf383f36d, +0x0127f58e, +0xf54ef91e, +0xdf07f3a3, +0x0710dc03, +0x07510740, +0x051d070f, +0x35c307f4, +0x15f225f3, +0x7ebf07f5, +0xbc03f661, +0x030f0724, +0x7e1b0708, +0xf441f655, +0x911042d0, +0x074290f4, +0x7e1b070d, +0xf383f329, +0x00a7f58e, +0xf54ef91e, +0xdf07f3a3, +0x0710dc03, +0x07510740, +0x051d070f, +0x35c307f4, +0x15f225f3, +0x7ebf07f5, +0xbc03f61d, +0x030f0724, +0x7e1b0708, +0xf441f611, +0x911042d0, +0x074290f4, +0x7e1b070d, +0xf383f2e5, +0x00a7f58e, +0xf54ef91e, +0xdf07f3a3, +0x0710dc03, +0x07510740, +0x051d070f, +0x35c307f4, +0x15f225f3, +0x7ebf07f5, +0xbc03f5d9, +0x030f0724, +0x7e1b0708, +0xf441f5cd, +0x911042d0, +0x074290f4, +0x7e1b070d, +0xf383f2a1, +0x0127f58e, +0xf54ef91e, +0xa027f163, +0x8027b027, +0x06b69027, +0xf4054227, +0x40270f07, +0xd97ef415, +0x435107f6, +0x27f58ef1, +0x274327d0, +0xc0073c3c, +0xf325f405, +0xfd45f035, +0x000154be, +0x1c031007, +0x2c10c81d, +0x23d21fc6, +0x8200e803, +0x3b4c0700, +0x07f44540, +0x27413b4c, +0xf4353c3c, +0x0f07312b, +0xf3254027, +0x917ef415, +0x435107f6, +0x07f58ef1, +0x07e013e1, +0x200c230e, +0x70276027, +0x274200c8, +0x3bb40741, +0x072127b0, +0xa7ae3ba2, +0x0b40a730, +0x8b4b4b3a, +0xab4d8b3c, +0x2734c634, +0xc8702761, +0x8d074000, +0x9d07805b, +0x47079e5b, +0x073c2c27, +0x2b49ab36, +0x3538ab21, +0x25f445f3, +0xff5a5ef2, +0x27203c27, +0x073e2b41, +0x1eb35bb4, +0x204c27b9, +0x2c07412b, +0x245b3d07, +0x32ab313b, +0x745ef345, +0x204c27ff, +0x3d074e2b, +0x343b8c07, +0x83ab8e5b, +0xfe4eb51e, +0x100c0088, +0x21271013, +0x4e9efe0e, +0x00130000, +0x21271068, +0x000044be, +0xfe8e0013, +0xf31e1013, +0x00c8fd4e, +0xc8d02712, +0x20271410, +0x00002cbe, +0x0013d486, +0x0013fd8e, +0x10ccd127, +0x271013ee, +0x07d4d641, +0x27e41ed4, +0x1ed40740, +0x9e2127de, +0x27000009, +0x00039e20, +0xc2fe4e00, +0x10c83601, +0x27412733, +0x1147203c, +0x01c24447, +0x07f3f021, +0x26e63027, +0x10ccfe8e, +0x2a3027ee, +0xab012b01, +0x53415334, +0xb642d611, +0x8e030721, +0x274066fe, +0x27e91e30, +0x1e302741, +0x000ed4e3, +0xd4170100, +0x3a01000d, +0x035b3027, +0xb76c00f9, +0x4c270001, +0x0b041b20, +0x000fb0fe, +0x27010000, +0x035b183c, +0xb76c00f9, +0x48270001, +0xfe0b041b, +0x07104c27, +0xf9035b34, +0x01b76c00, +0x0b041b00, +0x5b3827fe, +0x6c00f903, +0x270001b7, +0x041b184c, +0x1ea7fe0b, +0x01fd4fff, +0x122f9b14, +0x44334103, +0xab3813c1, +0x27322e24, +0xabfe0b00, +0x3812c5f3, +0xce3814c1, +0xf3ebf842, +0xfe0b0127, +0xd33efe4e, +0x0c270576, +0x9efe0e20, +0x8e000005, +0x07fb4efe, +0xb4adbeb0, +0x07d007fe, +0xc5f09310, +0xbebe0058, +0xd746ffcb, +0x0b1ec027, +0xc103d201, +0xffcbb0be, +0x1c07d403, +0x58b7f093, +0xedcbda00, +0x0000fb8e, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x0001cc2e, +0x000051ba, +0x000051ba, +0x000051ba, +0x42746e49, +0x0a3a6675, +0x6c202000, +0x5f32676f, +0x65676170, +0x7a69735f, +0x20202065, +0x5f6d756e, +0x65676170, +0x66282073, +0x29656572, +0x2020000a, +0x30252020, +0x20206432, +0x20202020, +0x20202020, +0x35252020, +0x28202064, +0x62206425, +0x73657479, +0x55000a29, +0x6f6c626e, +0x6e696b63, +0x65722067, +0x657a6973, +0x25203a73, +0x54000a64, +0x6c61746f, +0x6c6c6120, +0x7461636f, +0x25206465, +0x28206438, +0x64657375, +0x2c642520, +0x666e7520, +0x61656572, +0x20656c62, +0x202c6425, +0x65657266, +0x29642520, +0x2a2a000a, +0x52202a2a, +0x25435341, +0x42412064, +0x2054524f, +0x2a2a2a2a, +0x2020000a, +0x20204350, +0x203d2020, +0x30257830, +0x000a7838, +0x52532020, +0x20202020, +0x7830203d, +0x78383025, +0x2020000a, +0x20524146, +0x203d2020, +0x30257830, +0x000a7838, +0x5b522020, +0x5d643225, +0x30203d20, +0x38302578, +0x00000a78, +0x4649424d, +0x34363248, +0x00010001, +0x3602f114, +0xf1144a03, +0x4a033602, +0x68e97fe4, +0x36ff35fa, +0x21173307, +0x00150217, +0x31000901, +0x390576db, +0x41f54ef3, +0x310c3e01, +0x321149fc, +0x2b094012, +0x431a001d, +0x68095a10, +0x68ec7fd2, +0x4ef34301, +0x3e0141f5, +0x5fef56fa, +0x2d093dfa, +0x51fa45fd, +0x370660f5, +0x56fb4307, +0x3a005802, +0x5ef64cfd, +0x45043605, +0x580051fd, +0x4afb43f9, +0x50fb4afc, +0x3a0148f9, +0x3f002900, +0x3f003f00, +0x560453f7, +0x48f96100, +0x3e03290d, +0x4efc2d00, +0x7ee560fd, +0x65e762e4, +0x52e443e9, +0x53f05eec, +0x5beb6eea, +0x5df366ee, +0x280c7fe3, +0x3b0e330b, +0x2cfe4cfa, +0x34002d00, +0x3bfe40fd, +0x4bfc46fc, +0x18034df7, +0x30002a00, +0x3bfa3700, +0x53f447f9, +0x1dfd3a01, +0x260124ff, +0x37fa2b02, +0x40003a00, +0x1dfc4600, +0x2a071f05, +0x3afe3b01, +0x51fd48fd, +0x05083a00, +0x120e0e0a, +0x28021b0d, +0x46fd3a00, +0x23f942fa, +0x2df82af9, +0x38f430fb, +0x3efb3cfa, +0x66ef52f8, +0x77e257f5, +0x5af64afd, +0xf11461f5, +0x55f84ffa, +0x4cf842f8, +0xf114f114, +0xf114f114, +0x59fb5cf9, +0x6cf360f9, +0x1c0b55fe, +0x28024efa, +0x2c034bff, +0x31004df9, +0x2e003602, +0x2c023205, +0x330244fd, +0x2f003201, +0x27042a06, +0x3e0251fc, +0x2e063f01, +0x360046fc, +0x36034300, +0x3a023902, +0x3f044cfe, +0xf114f114, +0xf114f114, +0xf114f114, +0x41ff2efd, +0x5df739ff, +0x3306230b, +0x39064004, +0x35073d01, +0x3406230b, +0x37061912, +0x2d0b180c, +0x240e1d0d, +0x3508240d, +0x52ff5df6, +0x370749f9, +0x4efd49fe, +0x2e0f2e0d, +0x1f163109, +0x54ff64f9, +0x5cf74afd, +0x7ee957f8, +0x07193509, +0xf91e3502, +0x031c3505, +0x041c3dfe, +0x00203800, +0xff223800, +0x061e3ff3, +0x061e3cfb, +0x09203eff, +0x131f3904, +0x1b1a45fa, +0x1e1a3904, +0x1425270e, +0x221c3304, +0x4611440d, +0xf114f114, +0xf114f114, +0xf114f114, +0x3c063605, +0x45063b06, +0x43014003, +0x3b053d01, +0x43093f09, +0xf114f114, +0xf114f114, +0xf114f114, +0x440030ff, +0x58f845fc, +0x1e103207, +0x20122710, +0x23122c05, +0x1d163404, +0x1f18300b, +0x26173cfb, +0x2b123bff, +0x29143b00, +0x3f0b2116, +0x3b092c05, +0x40092b0e, +0x5eff4eff, +0x59fe3c00, +0x6cf74509, +0x47f94ffc, +0x46f745fb, +0x44f642f8, +0x45f449ed, +0x43f146f0, +0x46ed3eec, +0x41ea42f0, +0xf1143fec, +0xf71afe09, +0xf927f721, +0x032dfe29, +0x1b2d0931, +0xf1143b24, +0xf114f114, +0xf114f114, +0xf114f114, +0x0b0e6af3, +0x0e0b6af0, +0x0b0957f6, +0x0b1272eb, +0x09156eee, +0xfe1762f2, +0xf1206eea, +0xf1206aeb, +0xeb2267ee, +0xe9276beb, +0xdf2a6ce9, +0xe12970e6, +0xe42e60f6, +0xf4265ff4, +0x1d155bfb, +0xf114f114, +0xe82d5df7, +0xd3355eea, +0xe63056fb, +0xd5414309, +0xed2b50fc, +0xf62755f6, +0x091e46ff, +0x1a123c07, +0x1b143a09, +0x39003d05, +0x52f2320c, +0x4bfb320f, +0x61ed3112, +0x7ddd3611, +0xf114f114, +0xf114f114, +0x001b290a, +0x001c2e07, +0xfc1f33ff, +0x061b3107, +0x08223408, +0x0a1e2909, +0x16182f06, +0x13213702, +0x2016290d, +0x1f1a2c0a, +0x29153206, +0x2c1a3505, +0x2f17310d, +0x41103f04, +0x470e4006, +0xf114f114, +0x3c0845fe, +0x3f063bfe, +0x41114606, +0xf114f114, +0x18152c0a, +0x14171f09, +0x171a2b0c, +0x201b3503, +0x171c220e, +0x181c260a, +0x281734fd, +0x2018280d, +0x1d1c2011, +0x2a172c07, +0x39132607, +0x3516320d, +0x3d16390a, +0x560b2b1a, +0xf114f114, +0xf114f114, +0x51fa55fb, +0x51f94df6, +0x49ee50ef, +0x53f64afc, +0x43f747f7, +0x42f83dff, +0x3b0042f2, +0xf1143b02, +0xf221f315, +0xfe2ef927, +0x063c0233, +0x2237113d, +0xf1143e2a, +0xf114f114, +0xf114f114, +0xf1140000, +0x3602f114, +0xf1144a03, +0x4a033602, +0x68e97fe4, +0x36ff35fa, +0x19163307, +0x00100022, +0x290409fe, +0x410276e3, +0x4ff347fa, +0x32093405, +0x360a46fd, +0x1613221a, +0x02390028, +0x451a2429, +0x65f17fd3, +0x47fa4cfc, +0x34054ff3, +0x5af34506, +0x2b083400, +0x52fb45fe, +0x3b0260f6, +0x57fd4b02, +0x380164fd, +0x55fa4afd, +0x51fd3b00, +0x5ffb56f9, +0x4dff42ff, +0x56fe4601, +0x3d0048fb, +0x3f002900, +0x3f003f00, +0x560453f7, +0x48f96100, +0x3e03290d, +0x33070f0d, +0x7fd95002, +0x60ef5bee, +0x62dd51e6, +0x61e966e8, +0x63e877e5, +0x66ee6eeb, +0x20197fdc, +0x36153115, +0x47f170e9, +0x35003df9, +0x4df542fb, +0x54f750f7, +0x27fd65eb, +0x3df935fb, +0x4df14bf5, +0x6be75bef, +0x2cf64cf5, +0x39f634f6, +0x48f03af7, +0x45fc45f9, +0x22f74202, +0x1f0b2001, +0x37fe3405, +0x490043fe, +0x04073403, +0x0811080a, +0x25031310, +0x49fb3dff, +0x180047fb, +0x2afe24ff, +0x39f734fe, +0x41fc3ffa, +0x7fde57f6, +0x7ae46fe7, +0x56f74afb, +0xf11459f8, +0x4efc46ff, +0x52f943fc, +0xf114f114, +0xf114f114, +0x59fb5000, +0x5cfc5ef9, +0x2d0467f3, +0x1c0a5bf3, +0x1f0a59f7, +0xf5215cf2, +0xd5344cf8, +0x0f1257f4, +0x001c6ee9, +0xea2369e8, +0xe7264ef6, +0x002270ec, +0xee2763ef, +0xf4207fb2, +0xa2667fba, +0x00007fce, +0xf1387fd2, +0xf114f114, +0xf114f114, +0xf114f114, +0x41002700, +0x7fdd54f1, +0xfc2142fc, +0x0a1d4efb, +0xfb2547fc, +0xe33348f8, +0xf7273b02, +0xde3437ff, +0xc64546f9, +0xc1434bfa, +0xfb2c59f8, +0x072077de, +0xe3374bfd, +0x01201420, +0x0000161e, +0x241b7fd4, +0x68f449fe, +0x7fe15bf7, +0xe7213600, +0xe2223dfb, +0xe4243a00, +0xe4263cff, +0xe5263dfd, +0xee2243f8, +0xf02354e7, +0xf2224af2, +0xf82041fb, +0xfa253405, +0x00233902, +0x0a1e3d00, +0x121c45f7, +0x191a46f5, +0x291d3712, +0xf114f114, +0xf114f114, +0xf114f114, +0x38073703, +0x3d083707, +0x4b0047fc, +0x48023a00, +0x4d083d07, +0xf114f114, +0xf114f114, +0xf114f114, +0x440035fd, +0x58f74af9, +0x230e2909, +0x1f121912, +0x23112009, +0x1e152b05, +0x2d112f09, +0x2a142c00, +0x2d123300, +0x1a1b2e02, +0x36102613, +0x420742fc, +0x3810260f, +0x490b2a0c, +0x430a2209, +0x74f65900, +0x51fa55fb, +0x51f94df6, +0x49ee50ef, +0x53f64afc, +0x43f747f7, +0x42f83dff, +0x3b0042f2, +0xf1143b02, +0xf320f611, +0xfb31f72a, +0x03400035, +0x1b420a44, +0xf114392f, +0xf114f114, +0xf114f114, +0xf114f114, +0xfa137eeb, +0xfa127ce9, +0x000e6eec, +0xf41a7ee6, +0xf01f7ce7, +0xe72169ef, +0xea2179e5, +0xe42575e5, +0xe22766ef, +0xe22a75e6, +0xd62f74e5, +0xdc2d7adf, +0xde315ff6, +0xef2964f2, +0x09205ff8, +0xf114f114, +0xb9456fef, +0xc13f72e4, +0xc04259fa, +0xb64d50fe, +0xd93652fc, +0xdd3455f7, +0xf62951f8, +0x002448ff, +0xff284005, +0x0e1e4301, +0x1a1c3809, +0x25174500, +0x370c4501, +0x410b4507, +0xf114f114, +0xf114f114, +0xdf2545f9, +0xdc2743fa, +0xdb284df0, +0xe22640fe, +0xdf2e3d02, +0xe22a43fa, +0xe82840fd, +0xe3313902, +0xf42641fd, +0xf62842fd, +0xfd263e00, +0xfb2e3309, +0x141f42ff, +0x1e1d47fe, +0x2c194bfe, +0xf114f114, +0x300c46ff, +0x310b48f7, +0x2d1a3c0e, +0xf114f114, +0x16162510, +0x16172f00, +0x151b2312, +0x1421250b, +0x1c1a290c, +0x181e290a, +0x221b3002, +0x2a12290c, +0x2719290d, +0x32123b00, +0x460c3203, +0x36152813, +0x470e4203, +0x530b3212, +0xf114f114, +0xf114f114, +0x4cfd51fd, +0x4efa48f9, +0x44f248f4, +0x4cfa46fd, +0x3efb42fb, +0x3dfc3900, +0x36013cf7, +0xf1143a02, +0xf320f611, +0xfb31f72a, +0x03400035, +0x1b420a44, +0xf114392f, +0xf114f114, +0xf114f114, +0xf1140000, +0x3602f114, +0xf1144a03, +0x4a033602, +0x68e97fe4, +0x36ff35fa, +0x101d3307, +0x000e0019, +0x3efd33f6, +0x101a63e5, +0x66e855fc, +0x39063905, +0x390e49ef, +0x0a142814, +0x0036001d, +0x610c2a25, +0x75ea7fe0, +0x55fc4afe, +0x390566e8, +0x58f25dfa, +0x37042cfa, +0x67f159f5, +0x391374eb, +0x54043a14, +0x3f016006, +0x6af355fb, +0x4b063f05, +0x65ff5afd, +0x4ffc3703, +0x61f44bfe, +0x3c0132f9, +0x3f002900, +0x3f003f00, +0x560453f7, +0x48f96100, +0x3e03290d, +0x58f72207, +0x7fdc7fec, +0x5ff25bef, +0x56e754e7, +0x5bef59f4, +0x4cf27fe1, +0x5af367ee, +0x21157fdb, +0x3d113213, +0x52ea73e8, +0x35003ef7, +0x55f23b00, +0x5ef359f3, +0x39f264eb, +0x47f543f4, +0x55eb4df6, +0x68e958f0, +0x30f852f6, +0x42f83df8, +0x4bf246f9, +0x53f74ff6, +0x45ea4ffc, +0x3afe4bf0, +0x4ef33a01, +0x51fc53f7, +0x26fa51f3, +0x3afa3ef3, +0x49f03bfe, +0x56f34cf6, +0x25f947f7, +0x31f52cf8, +0x3bf438f6, +0x43f73ff8, +0x7fe35cf5, +0x7fdb62f1, +0x6cee5cf4, +0xf11463f3, +0x57f653f7, +0x4ff644fa, +0xf114f114, +0xf114f114, +0x4c05500b, +0x4e055402, +0x270456fc, +0x2a0058f4, +0x220752fb, +0x1d0b48fd, +0x1f0843fc, +0x250648f8, +0x2a0759f0, +0x280345f7, +0x21083bff, +0x2b0d4205, +0x240d3904, +0x2f0447fc, +0x370347fe, +0x3a023a02, +0x3c064aff, +0xf114f114, +0xf114f114, +0xf114f114, +0x3d0437fa, +0x7fdb53f2, +0x2c082cfc, +0x2c0b45ff, +0x2a0e3e00, +0x300733f9, +0x38042ffc, +0x34042afa, +0x250d29fd, +0x310935fa, +0x3a134c08, +0x300a4ef7, +0x2d0c53f5, +0x45003409, +0x21144300, +0x3f085afb, +0x68f54ffb, +0x7fe25bf5, +0xee234301, +0xe72148f1, +0xfd1c4bfb, +0x0a1850f8, +0x001b53eb, +0xf22240eb, +0xd4341ff3, +0xe82740e7, +0x11135ee3, +0x191f4b09, +0x1d243f11, +0x21184af8, +0x0f2223fb, +0x141e1bfe, +0x49165b0d, +0xf114f114, +0xf114f114, +0xf114f114, +0x4ffe4100, +0x5cfc4800, +0x22144103, +0x1f1345f9, +0x2c1b4d08, +0xf114f114, +0xf114f114, +0xf114f114, +0x440338fa, +0x62f347f8, +0x101342f6, +0x240f3e03, +0x240f44fd, +0x1c1551ec, +0x15191e00, +0x141e0701, +0x0c1f17fd, +0x101b4aeb, +0x2a184210, +0x5d007ce9, +0x380e2511, +0x390fee2c, +0x261ade32, +0x7fe87fea, +0x4af84efd, +0x48f648f7, +0x47f44bee, +0x46fb3ff5, +0x48f24bef, +0x35f843f0, +0x34f73bf2, +0xf11444f5, +0xf61efe09, +0xff21fc1f, +0x0c1f0721, +0x261f1725, +0xf1144014, +0xf114f114, +0xf114f114, +0xf114f114, +0xf3117fea, +0xf7107fe7, +0xf41178e7, +0xeb1b7fe5, +0xe22572ed, +0xd82975e9, +0xd72a76e7, +0xd13075e6, +0xe02771e8, +0xd82e76e4, +0xcd3478e1, +0xd72e7cdb, +0xd9345ef6, +0xed2b66f1, +0x0b2063f6, +0xf114f114, +0xc93d6af3, +0xd2387fce, +0xce3e5cfb, +0xbd513911, +0xec2d56fb, +0xfe235ef3, +0x0f1c5bf4, +0x01224dfe, +0x01274700, +0x111e49ff, +0x26144004, +0x2d1251f9, +0x360f4005, +0x4f00390f, +0xf114f114, +0xf114f114, +0xf0244301, +0xf2254400, +0xef2543f6, +0x01204401, +0x0f224d00, +0x0f1d4002, +0x19184400, +0x16224efb, +0x101f3707, +0x12233b05, +0x1c1f4102, +0x2921360e, +0x1c242c0f, +0x2f1b3c05, +0x3e154602, +0xf114f114, +0x1f124cfe, +0x1a1356ee, +0x1824460c, +0xf114f114, +0x17184005, +0x101b46f4, +0x1e18370b, +0x1d1f3805, +0x29164500, +0x2a164102, +0x3c104afa, +0x340f3605, +0x3c0e3607, +0x4e034cfa, +0x7bf052f5, +0x35154dfe, +0x38164dfe, +0x3d192a19, +0xf114f114, +0xf114f114, +0x4af84efd, +0x48f648f7, +0x47f44bee, +0x46fb3ff5, +0x48f24bef, +0x35f843f0, +0x34f73bf2, +0xf11444f5, +0xf61efe09, +0xff21fc1f, +0x0c1f0721, +0x261f1725, +0xf1144014, +0xf114f114, +0xf114f114, +0xf1140000, +0x3602f114, +0xf1144a03, +0x4a033602, +0x68e97fe4, +0x36ff35fa, +0x00003307, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x3f002900, +0x3f003f00, +0x560453f7, +0x48f96100, +0x3e03290d, +0x37010b00, +0x7fef4500, +0x520066f3, +0x6beb4af9, +0x7fe17fe5, +0x5fee7fe8, +0x72eb7fe5, +0x151f7fe2, +0x32191f1f, +0x2afa47fd, +0x36fd32fb, +0x3a003efe, +0x48fe3f01, +0x1bfb43fb, +0x2cfe27fd, +0x40f02e00, +0x4ef644f8, +0x37f15cf4, +0x3efa3cf6, +0x49f441fc, +0x50f94cf8, +0x54ec61f5, +0x49fa4ff5, +0x56f34afc, +0x61f560f3, +0x21fb4ef8, +0x35fe30fc, +0x47f33efd, +0x56f44ff6, +0x17ff4bfd, +0x2b012201, +0x37fe3600, +0x40013d00, +0x5bf74aff, +0x56f64dfa, +0x6eef58f7, +0xf11475ed, +0x61f25af3, +0x5cf74400, +0xf114f114, +0xf114f114, +0x73f47bef, +0x73f57af0, +0x00185df9, +0x090f57f5, +0x19084dfd, +0x120d47fb, +0x090f3ffc, +0x130d44fc, +0x250a54f4, +0x120c3ef9, +0x1d0641f9, +0x21143d08, +0x1e0f3805, +0x2d0442fe, +0x3a014001, +0x3e003d00, +0x3d074efe, +0xf114f114, +0xf114f114, +0xf114f114, +0x44fe3ff4, +0x68f354f1, +0x260c3201, +0x2d0b3407, +0x270f230a, +0x2a0b2c00, +0x2c0d260b, +0x2d102d01, +0x290c2e00, +0x310a2c05, +0x221e111f, +0x2a123301, +0x370a3207, +0x3311131c, +0x2e112110, +0x59003e0e, +0x5df846fd, +0x7fe25af6, +0xed1a6cf3, +0xef1664f1, +0xef1a65f3, +0xe71e5bf3, +0xec1c5ef4, +0xe92158f6, +0xe52554f0, +0xe92156f6, +0xe42853f9, +0xef2657f3, +0xf5215eed, +0xf1284601, +0xfa294800, +0x01264afb, +0x11293b12, +0xf114f114, +0xf114f114, +0xf114f114, +0x61fa4aff, +0x7fec5bf9, +0xfa1e66f8, +0x031b64f1, +0x161a5f00, +0xf114f114, +0xf114f114, +0xf114f114, +0x52fb38fc, +0x7dea4cf9, +0xf0254bfc, +0xfc234802, +0xf8264bf5, +0xfd2647fd, +0x03252e0f, +0x052645f3, +0x002a3e00, +0x10234100, +0x16272515, +0x300e48f1, +0x251b3909, +0x3c153610, +0x440c3e00, +0x6102480c, +0x70ec78ef, +0x55f572ee, +0x59f25cf1, +0x51f147e6, +0x440050f2, +0x38e846f2, +0x32e844e9, +0xf1144af5, +0xf31af317, +0xf231f128, +0x062d032c, +0x3621222c, +0xf1145213, +0xf114f114, +0xf114f114, +0xf114f114, +0x060f5dfa, +0x130654fa, +0x10074ff8, +0x0e0c4200, +0x0d1247ff, +0x0b0d3e00, +0x0f0d3cfe, +0x100f3bfe, +0x170c4bfb, +0x170d3efd, +0x140f3afc, +0x1a0e42f7, +0x2c0e4fff, +0x28114700, +0x2f114403, +0xf114f114, +0x11182c0a, +0x15153ef9, +0x1619240f, +0x1b1f280e, +0x1d161b10, +0x23131d0c, +0x320e2c01, +0x390a2414, +0x3f072012, +0x4dfe2a05, +0x52fc3001, +0x5efd3e0a, +0x45092e11, +0x6df44009, +0xf114f114, +0xf114f114, +0xdd2468f4, +0xde2461f5, +0xe62060f0, +0xe22558f9, +0xe02c55f8, +0xee2255f9, +0xf12255f7, +0xf12858f3, +0xf9214204, +0xfb234dfd, +0x00214cfd, +0x02264cfa, +0x0d213a0a, +0x23174cff, +0x3a0d53ff, +0xf114f114, +0xfd1d63f9, +0x001a5ff2, +0x1e165f02, +0xf114f114, +0xf91f4c00, +0xf1234afb, +0xfd224600, +0x03224bf5, +0xff244401, +0x05224100, +0x0b2049f2, +0x05233e03, +0x0c223e04, +0x0b2744ff, +0x1d1e4bf3, +0x1a22370b, +0x271d4005, +0x4213460c, +0xf114f114, +0xf114f114, +0x61f36af2, +0x5af45af1, +0x49f658ee, +0x56f24ff7, +0x46f649f6, +0x42fb45f6, +0x3afb40f7, +0xf1143b02, +0xf518f615, +0xff1cf81c, +0x091d031d, +0x241d1423, +0xf114430e, +0xf114f114, +0xf114f114, +0xf1140000, +0x42746e49, +0x0a3a6675, +0x6c202000, +0x5f32676f, +0x65676170, +0x7a69735f, +0x20202065, +0x5f6d756e, +0x65676170, +0x66282073, +0x29656572, +0x2020000a, +0x30252020, +0x20206432, +0x20202020, +0x20202020, +0x35252020, +0x28202064, +0x62206425, +0x73657479, +0x55000a29, +0x6f6c626e, +0x6e696b63, +0x65722067, +0x657a6973, +0x25203a73, +0x54000a64, +0x6c61746f, +0x6c6c6120, +0x7461636f, +0x25206465, +0x28206438, +0x64657375, +0x2c642520, +0x666e7520, +0x61656572, +0x20656c62, +0x202c6425, +0x65657266, +0x29642520, +0x656e000a, +0x705f7478, +0x745f6369, +0x61705f6f, +0x20657372, +0x20202020, +0x000a7525, +0x6d726946, +0x65726177, +0x72657620, +0x6e6f6973, +0x656f6420, +0x6f6e2073, +0x616d2074, +0x20686374, +0x64726168, +0x65726177, +0x46000a21, +0x776d7269, +0x20657261, +0x706d6f63, +0x64656c69, +0x726f6620, +0x72657620, +0x6e6f6973, +0x25783020, +0x0a783830, +0x72614800, +0x72617764, +0x65722065, +0x74726f70, +0x20202073, +0x76202020, +0x69737265, +0x30206e6f, +0x38302578, +0x46000a78, +0x776d7269, +0x20657261, +0x73726576, +0x206e6f69, +0x73656f64, +0x746f6e20, +0x74616d20, +0x68206863, +0x77647261, +0x20657261, +0x73726576, +0x006e6f69, +0x64726168, +0x65726177, +0x656f6420, +0x6f6e2073, +0x75732074, +0x726f7070, +0x6e652074, +0x69646f63, +0x4c00676e, +0x54435f45, +0x253a4c52, +0x4e202c78, +0x45524f43, +0x78253a53, +0x494c202c, +0x4f435f43, +0x4e5f4552, +0x253a4d55, +0x48202c64, +0x4f435f57, +0x4e5f4552, +0x253a4d55, +0x000a2064, +0x61766e69, +0x2064696c, +0x64726168, +0x65726177, +0x726f6320, +0x756e2065, +0x7265626d, +0x6e203a73, +0x65626d75, +0x666f2072, +0x72616820, +0x65726164, +0x726f6320, +0x73692065, +0x6c6c6920, +0x6c616765, +0x66655200, +0x6e657265, +0x70206563, +0x75746369, +0x74206572, +0x656c6261, +0x6469000a, +0x203a2020, +0x20617473, +0x20657375, +0x20666572, +0x20317970, +0x20327970, +0x20706d63, +0x20746d66, +0x5f69626d, +0x20727470, +0x69626d20, +0x6761705f, +0x73287365, +0x29657a69, +0x74702020, +0x6f742072, +0x6f623a70, +0x25000a74, +0x3a206433, +0x64332520, +0x64332520, +0x64332520, +0x64332520, +0x64332520, +0x64332520, +0x64332520, +0x20702520, +0x36252020, +0x64252864, +0x20202029, +0x253a7025, +0x4c000a70, +0x20657669, +0x74636970, +0x20657275, +0x6c626174, +0x4e000a65, +0x3a206d75, +0x20642520, +0x6c4f2020, +0x74736564, +0x0a642520, +0x78646900, +0x73203a20, +0x75206174, +0x70206573, +0x64696369, +0x66657220, +0x6c206469, +0x73656e69, +0x20636e79, +0x20666572, +0x76696c20, +0x66657265, +0x20202073, +0x65722020, +0x69703266, +0x25000a63, +0x3a206433, +0x64332520, +0x64332520, +0x25202020, +0x20206433, +0x64332520, +0x25202020, +0x25206436, +0x20206433, +0x30257830, +0x25207838, +0x25206433, +0x25206433, +0x25206433, +0x25206433, +0x25206433, +0x25206433, +0x25206433, +0x25206433, +0x25206433, +0x25206433, +0x25206433, +0x25206433, +0x25206433, +0x25206433, +0x25206433, +0x000a6433, +0x76697250, +0x20657461, +0x62666572, +0x3a6b6e61, +0x6c6f6320, +0x3020726f, +0x20782578, +0x5f78616d, +0x66667562, +0x20737265, +0x6d207525, +0x25207762, +0x626d2075, +0x75252068, +0x73616220, +0x64615f65, +0x30207264, +0x38302578, +0x20000a78, +0x64692020, +0x74732078, +0x65722061, +0x64615f66, +0x20207264, +0x77626d20, +0x626d2020, +0x20000a68, +0x33252020, +0x33252075, +0x78302075, +0x78383025, +0x6528000a, +0x6f20646e, +0x72702066, +0x74617669, +0x65722065, +0x6e616266, +0x7564206b, +0x0a29706d, +0x44495600, +0x46204f45, +0x54532057, +0x20455441, +0x504d5544, +0x636e4520, +0x7265646f, +0x3632483d, +0x73000a34, +0x6f2d7465, +0x70207470, +0x69666f72, +0x676e696c, +0x7261203a, +0x756d2067, +0x62207473, +0x20302065, +0x3120726f, +0x74657300, +0x74706f2d, +0x63736520, +0x6e697061, +0x61203a67, +0x6d206772, +0x20747375, +0x30206562, +0x20726f20, +0x65730031, +0x706f2d74, +0x616e2074, +0x6620756c, +0x616d726f, +0x55203a74, +0x6f6e6b6e, +0x66206e77, +0x616d726f, +0x65730074, +0x706f2d74, +0x616e2074, +0x6620756c, +0x616d726f, +0x55203a74, +0x7075736e, +0x74726f70, +0x66206465, +0x616d726f, +0x65730074, +0x706f2d74, +0x78652074, +0x65736f70, +0x66657220, +0x61726620, +0x3a73656d, +0x67726120, +0x73756d20, +0x65622074, +0x6f203020, +0x00312072, +0x2d746573, +0x2074706f, +0x6f707865, +0x72206573, +0x66206665, +0x656d6172, +0x4e203a73, +0x7320746f, +0x6f707075, +0x64657472, +0x726f6620, +0x6f727020, +0x74636574, +0x73206465, +0x69737365, +0x00736e6f, +0x2d746573, +0x2074706f, +0x66666964, +0x6e657265, +0x74732074, +0x6d616572, +0x74696220, +0x74706564, +0x6e207368, +0x7320746f, +0x6f707075, +0x64657472, +0x74657300, +0x74706f2d, +0x636e6520, +0x2065646f, +0x65727473, +0x62206d61, +0x65647469, +0x3a687470, +0x736e7520, +0x6f707075, +0x64657472, +0x6c617620, +0x73006575, +0x6f2d7465, +0x63207470, +0x6d6f7268, +0x6f665f61, +0x74616d72, +0x6863203b, +0x616d6f72, +0x726f6620, +0x2074616d, +0x20746f6e, +0x70707573, +0x6574726f, +0x73002e64, +0x6f2d7465, +0x6d207470, +0x666e6962, +0x756f206f, +0x74757074, +0x7261203a, +0x756d2067, +0x62207473, +0x20302065, +0x3120726f, +0x74657300, +0x74706f2d, +0x20766d20, +0x72616573, +0x72206863, +0x65676e61, +0x6e69203a, +0x696c6176, +0x20782064, +0x00677261, +0x2d746573, +0x2074706f, +0x7320766d, +0x63726165, +0x61722068, +0x3a65676e, +0x766e6920, +0x64696c61, +0x61207920, +0x73006772, +0x6f2d7465, +0x6d207470, +0x79742062, +0x203a6570, +0x61766e49, +0x2064696c, +0x72746e69, +0x65732061, +0x7463656c, +0x006e6f69, +0x2d746573, +0x2074706f, +0x7420626d, +0x3a657079, +0x766e4920, +0x64696c61, +0x746e6920, +0x73207265, +0x63656c65, +0x6e6f6974, +0x74657300, +0x74706f2d, +0x42475220, +0x206f7420, +0x3a565559, +0x736e7520, +0x6f707075, +0x64657472, +0x646f6d20, +0x65730065, +0x706f2d74, +0x6f682074, +0x70207473, +0x6f746f72, +0x206c6f63, +0x6e697270, +0x203a7374, +0x20677261, +0x7473756d, +0x20656220, +0x726f2030, +0x73003120, +0x6f2d7465, +0x47207470, +0x7420504f, +0x3a657079, +0x736e5520, +0x6f707075, +0x64657472, +0x70797420, +0x65730065, +0x706f2d74, +0x4f472074, +0x79742050, +0x203a6570, +0x61766e69, +0x0064696c, +0x2d746573, +0x2074706f, +0x20504f47, +0x65707974, +0x6e69203a, +0x696c6176, +0x4f472064, +0x69732050, +0x5300657a, +0x69646e65, +0x4a20676e, +0x445f424f, +0x45555145, +0x0a444555, +0x6f725700, +0x7320676e, +0x20657a69, +0x6220666f, +0x65666675, +0x61705f72, +0x5f6d6172, +0x6d617266, +0x61725f65, +0x73006574, +0x6f2d7465, +0x66207470, +0x656d6172, +0x74617220, +0x75203a65, +0x7075736e, +0x74726f70, +0x61206465, +0x57006772, +0x676e6f72, +0x7a697320, +0x666f2065, +0x66756220, +0x20726566, +0x61726170, +0x6172206d, +0x635f6574, +0x72746e6f, +0x42006c6f, +0x6b636f6c, +0x6e6f6320, +0x75676966, +0x69746172, +0x28206e6f, +0x20494f52, +0x5220726f, +0x2029776f, +0x6e6e6163, +0x7320746f, +0x51207465, +0x6f742050, +0x68746567, +0x77207265, +0x20687469, +0x65746172, +0x6e6f6320, +0x6c6f7274, +0x74657300, +0x74706f2d, +0x74696220, +0x74617220, +0x66203a65, +0x7420726f, +0x20657079, +0x2c46464f, +0x72617420, +0x20746567, +0x65746172, +0x6f687320, +0x20646c75, +0x7a206562, +0x006f7265, +0x2d746573, +0x2074706f, +0x20746962, +0x65746172, +0x6e75203a, +0x70707573, +0x6574726f, +0x616d2064, +0x69622078, +0x74617274, +0x65730065, +0x706f2d74, +0x69622074, +0x61722074, +0x203a6574, +0x75736e75, +0x726f7070, +0x20646574, +0x67726174, +0x72207465, +0x00657461, +0x6e6f7257, +0x69732067, +0x6f20657a, +0x75622066, +0x72656666, +0x72617020, +0x66206d61, +0x7220726f, +0x20657461, +0x746e6f63, +0x206c6f72, +0x20445248, +0x66667562, +0x73207265, +0x00657a69, +0x75736e55, +0x726f7070, +0x20646574, +0x20445248, +0x66667562, +0x73207265, +0x2c657a69, +0x73756d20, +0x65622074, +0x203d3e20, +0x6e450031, +0x65646f63, +0x72617020, +0x66206d61, +0x656d6172, +0x63617020, +0x676e696b, +0x6973203b, +0x7420657a, +0x73206f6f, +0x6c6c616d, +0x6e45002e, +0x65646f63, +0x72617020, +0x66206d61, +0x656d6172, +0x63617020, +0x676e696b, +0x6163203b, +0x6e6f206e, +0x6220796c, +0x65732065, +0x6f662074, +0x68742072, +0x69662065, +0x20747372, +0x6d617266, +0x45002e65, +0x646f636e, +0x61702065, +0x206d6172, +0x6f6c6f63, +0x64207275, +0x72637365, +0x69747069, +0x203b6e6f, +0x657a6973, +0x6f6f7420, +0x616d7320, +0x002e6c6c, +0x6f636e45, +0x70206564, +0x6d617261, +0x65737520, +0x61642072, +0x72206174, +0x73696765, +0x65726574, +0x73203a64, +0x20657a69, +0x206f6f74, +0x6c616d73, +0x45002e6c, +0x646f636e, +0x61702065, +0x206d6172, +0x20706f67, +0x65736572, +0x6e203a74, +0x7320746f, +0x6f707075, +0x64657472, +0x726f6620, +0x662d6220, +0x656d6172, +0x45002e73, +0x646f636e, +0x61702065, +0x206d6172, +0x65736572, +0x6f672074, +0x79642070, +0x696d616e, +0x73203a63, +0x20657a69, +0x77207369, +0x676e6f72, +0x6e45002e, +0x65646f63, +0x72617020, +0x67206d61, +0x7220706f, +0x74657365, +0x6e796420, +0x63696d61, +0x796c6c61, +0x6f6e203a, +0x75732074, +0x726f7070, +0x20646574, +0x20726f66, +0x72662d62, +0x73656d61, +0x6e45002e, +0x65646f63, +0x72617020, +0x65206d61, +0x7320636e, +0x73746174, +0x73203a20, +0x20657a69, +0x77207369, +0x676e6f72, +0x6e45002e, +0x65646f63, +0x72617020, +0x72206d61, +0x6f696765, +0x203a736e, +0x657a6973, +0x6f6f7420, +0x616d7320, +0x002e6c6c, +0x6f636e45, +0x70206564, +0x6d617261, +0x67657220, +0x736e6f69, +0x756e203a, +0x7265626d, +0x20666f20, +0x69676572, +0x20736e6f, +0x6e6e6163, +0x6520746f, +0x65656378, +0x36312064, +0x636e4500, +0x2065646f, +0x61726170, +0x6572206d, +0x6e6f6967, +0x63203a73, +0x6f6e6e61, +0x65622074, +0x65737520, +0x6f742064, +0x68746567, +0x77207265, +0x20687469, +0x20776f72, +0x65736162, +0x6c622064, +0x206b636f, +0x666e6f63, +0x72756769, +0x6f697461, +0x4500736e, +0x646f636e, +0x61702065, +0x206d6172, +0x6e616863, +0x72206567, +0x61746365, +0x656c676e, +0x73203a73, +0x20657a69, +0x206f6f74, +0x6c616d73, +0x45002e6c, +0x646f636e, +0x61702065, +0x206d6172, +0x6e616863, +0x72206567, +0x61746365, +0x656c676e, +0x6e203a73, +0x65626d75, +0x666f2072, +0x67657220, +0x736e6f69, +0x6e616320, +0x20746f6e, +0x65637865, +0x32206465, +0x636e4500, +0x2065646f, +0x61726170, +0x6863206d, +0x65676e61, +0x63657220, +0x676e6174, +0x3a73656c, +0x766e6920, +0x64696c61, +0x6f6f6320, +0x6e696472, +0x73657461, +0x45564d00, +0x4655425f, +0x5f524546, +0x454e4547, +0x5f4c4152, +0x45505954, +0x4f4c425f, +0x435f4b43, +0x49464e4f, +0x203a5347, +0x7373656d, +0x20656761, +0x657a6973, +0x6f6f7420, +0x616d7320, +0x002e6c6c, +0x5f45564d, +0x46465542, +0x475f5245, +0x52454e45, +0x545f4c41, +0x5f455059, +0x434f4c42, +0x4f435f4b, +0x4749464e, +0x6f722053, +0x75207377, +0x6d6f636e, +0x63203a70, +0x6f6e6e61, +0x65622074, +0x65737520, +0x6f742064, +0x68746567, +0x77207265, +0x20687469, +0x69676572, +0x6f2d6e6f, +0x6e692d66, +0x65726574, +0x4d007473, +0x425f4556, +0x45464655, +0x45475f52, +0x4152454e, +0x59545f4c, +0x425f4550, +0x4b434f4c, +0x4e4f435f, +0x53474946, +0x6e75203a, +0x70707573, +0x6574726f, +0x6c622064, +0x206b636f, +0x666e6f63, +0x74206769, +0x00657079, +0x5f45564d, +0x46465542, +0x475f5245, +0x52454e45, +0x203a4c41, +0x657a6973, +0x6f6f7420, +0x616d7320, +0x74206c6c, +0x6572206f, +0x68206461, +0x65646165, +0x4d002e72, +0x425f4556, +0x45464655, +0x45475f52, +0x4152454e, +0x62203a4c, +0x65666675, +0x6f702072, +0x65746e69, +0x73692072, +0x4c554e20, +0x4d002e4c, +0x425f4556, +0x45464655, +0x45475f52, +0x4152454e, +0x62203a4c, +0x65666675, +0x69732072, +0x6920657a, +0x657a2073, +0x002e6f72, +0x5f45564d, +0x46465542, +0x475f5245, +0x52454e45, +0x203a4c41, +0x666e6f63, +0x73206769, +0x20657a69, +0x7a207369, +0x2e6f7265, +0x45564d00, +0x4655425f, +0x5f524546, +0x454e4547, +0x5f4c4152, +0x45505954, +0x4f4c425f, +0x435f4b43, +0x49464e4f, +0x203a5347, +0x75622061, +0x72656666, +0x73616820, +0x726c6120, +0x79646165, +0x65656220, +0x6573206e, +0x6620746e, +0x7420726f, +0x20736968, +0x74636970, +0x2e657275, +0x45564d00, +0x4655425f, +0x5f524546, +0x454e4547, +0x3a4c4152, +0x736e7520, +0x6f707075, +0x64657472, +0x70797420, +0x6e692065, +0x45564d20, +0x4d4f435f, +0x55425f4d, +0x4e495f46, +0x44415f51, +0x002e5244, +0x5f45564d, +0x46465542, +0x475f5245, +0x52454e45, +0x545f4c41, +0x5f455059, +0x434f4c42, +0x4f435f4b, +0x4749464e, +0x6f722053, +0x75207377, +0x6d6f636e, +0x6e203a70, +0x6c6f635f, +0x6f642073, +0x6e207365, +0x6d20746f, +0x68637461, +0x65687420, +0x63697020, +0x65727574, +0x64697720, +0x4d006874, +0x425f4556, +0x45464655, +0x45475f52, +0x4152454e, +0x59545f4c, +0x425f4550, +0x4b434f4c, +0x4e4f435f, +0x53474946, +0x776f7220, +0x6e752073, +0x706d6f63, +0x5f6e203a, +0x73776f72, +0x656f6420, +0x6f6e2073, +0x616d2074, +0x20686374, +0x20656874, +0x74636970, +0x20657275, +0x67696568, +0x57007468, +0x676e6f72, +0x7a697320, +0x666f2065, +0x66756220, +0x20726566, +0x61726170, +0x6172206d, +0x63206574, +0x72746e6f, +0x71206c6f, +0x6c420070, +0x206b636f, +0x666e6f63, +0x72756769, +0x6f697461, +0x5228206e, +0x6f20494f, +0x6f522072, +0x63202977, +0x6f6e6e61, +0x65732074, +0x50512074, +0x676f7420, +0x65687465, +0x69772072, +0x51206874, +0x2c492050, +0x00422c50, +0x2d746573, +0x2074706f, +0x203a7071, +0x6e6b6e55, +0x206e776f, +0x6d617266, +0x79742065, +0x57006570, +0x676e6f72, +0x7a697320, +0x666f2065, +0x66756220, +0x20726566, +0x61726170, +0x6172206d, +0x635f6574, +0x72746e6f, +0x705f6c6f, +0x6d617261, +0x29492820, +0x6f6c4200, +0x63206b63, +0x69666e6f, +0x61727567, +0x6e6f6974, +0x4f522820, +0x726f2049, +0x776f5220, +0x61632029, +0x746f6e6e, +0x74657320, +0x20505120, +0x65676f74, +0x72656874, +0x74697720, +0x61722068, +0x63206574, +0x72746e6f, +0x70206c6f, +0x6d617261, +0x65730073, +0x706f2d74, +0x61722074, +0x63206574, +0x72746e6f, +0x70206c6f, +0x6d617261, +0x7071203a, +0x6e696d5f, +0x6e616320, +0x20746f6e, +0x65637865, +0x71206465, +0x616d5f70, +0x49282078, +0x72570029, +0x20676e6f, +0x657a6973, +0x20666f20, +0x66667562, +0x70207265, +0x6d617261, +0x74617220, +0x6f635f65, +0x6f72746e, +0x61705f6c, +0x006d6172, +0x2d746573, +0x2074706f, +0x65746172, +0x6e6f6320, +0x6c6f7274, +0x72617020, +0x203a6d61, +0x6d5f7071, +0x63206e69, +0x6f6e6e61, +0x78652074, +0x64656563, +0x5f707120, +0x0078616d, +0x6f636e45, +0x70206564, +0x6d617261, +0x3b707120, +0x7a697320, +0x6f742065, +0x6d73206f, +0x2e6c6c61, +0x636e4500, +0x2065646f, +0x61726170, +0x7065206d, +0x66695f72, +0x656d6172, +0x616e655f, +0x20656c62, +0x756c6176, +0x756d2065, +0x62207473, +0x20302065, +0x3120726f, +0x564d002e, +0x55425f45, +0x52454646, +0x5241505f, +0x73204d41, +0x20657a69, +0x206f6f74, +0x6c616d73, +0x55002e6c, +0x7075736e, +0x74726f70, +0x65206465, +0x646f636e, +0x61702065, +0x206d6172, +0x4d206e69, +0x435f4556, +0x5f4d4d4f, +0x5f465542, +0x5f514e49, +0x52444441, +0x6970002e, +0x726f5f63, +0x5f726564, +0x5f746e63, +0x65707974, +0x6e6f203a, +0x7320796c, +0x6f707075, +0x4c207472, +0x6f205044, +0x32482066, +0x6e203436, +0x6800776f, +0x65343632, +0x203a636e, +0x72662042, +0x20656d61, +0x20746f6e, +0x73736f70, +0x656c6269, +0x74697720, +0x61422068, +0x696c6573, +0x7020656e, +0x69666f72, +0x7400656c, +0x73206f6f, +0x6c6c616d, +0x44524820, +0x66756220, +0x20726566, +0x657a6973, +0x2a2a2a00, +0x7325202a, +0x2a2a2a20, +0x4350202a, +0x7830203a, +0x20207825, +0x3a525320, +0x25783020, +0x20202078, +0x3a524146, +0x25783020, +0x20000a78, +0x32255b52, +0x3d205d64, +0x25783020, +0x0a783830, +0x616d2000, +0x72657473, +0x64252320, +0x20732520, +0x726f6261, +0x0a646574, +0x20202000, +0x4c554146, +0x30203a54, +0x0a782578, +0x20202000, +0x44444146, +0x30203a52, +0x0a782578, +0x54415700, +0x4f444843, +0x72692047, +0x41520071, +0x41204353, +0x54524f42, +0x554d4d00, +0x4f424120, +0x2a005452, +0x202a2a2a, +0x43534152, +0x41206425, +0x54524f42, +0x2a2a2a20, +0x20000a2a, +0x20435020, +0x3d202020, +0x25783020, +0x0a783830, +0x53202000, +0x20202052, +0x30203d20, +0x38302578, +0x20000a78, +0x52414620, +0x3d202020, +0x25783020, +0x0a783830, +0x52202000, +0x6432255b, +0x203d205d, +0x30257830, +0x000a7838, +0x63746157, +0x676f6468, +0x6e794400, +0x63696d61, +0x61686320, +0x2065676e, +0x74206e69, +0x6e206568, +0x65626d75, +0x666f2072, +0x726f6320, +0x69207365, +0x6f6e2073, +0x75732074, +0x726f7070, +0x00646574, +0x2d746573, +0x2074706f, +0x72662070, +0x73656d61, +0x6e49203a, +0x696c6176, +0x72612064, +0x656d7567, +0x7300746e, +0x6f2d7465, +0x50207470, +0x61724620, +0x3a73656d, +0x766e6920, +0x64696c61, +0x504f4720, +0x7a697320, +0x65730065, +0x706f2d74, +0x20422074, +0x6d617246, +0x203a7365, +0x61766e69, +0x2064696c, +0x20504f47, +0x657a6973, +0x74657300, +0x74706f2d, +0x66204220, +0x656d6172, +0x4e203a73, +0x7320746f, +0x6f707075, +0x64657472, +0x206f6400, +0x20746f6e, +0x70707573, +0x2074726f, +0x465f454d, +0x435f454d, +0x43494255, +0x5345525f, +0x646e7520, +0x43207265, +0x49464e4f, +0x53414d47, +0x51455f4b, +0x73692049, +0x6c616620, +0x68006573, +0x65343632, +0x203a636e, +0x41424143, +0x6f6e2043, +0x6f702074, +0x62697373, +0x7720656c, +0x20687469, +0x65736142, +0x656e696c, +0x6f727020, +0x656c6966, +0x6e655300, +0x676e6964, +0x4f525020, +0x53534543, +0x000a4445, +0x65636552, +0x64657669, +0x49575320, +0x0a484354, +0x63655200, +0x65766965, +0x4f4a2064, +0x6c662042, +0x3d736761, +0x66207525, +0x656d6172, +0x75253d73, +0x726f6320, +0x253d7365, +0x4a000a75, +0x6d20626f, +0x61737365, +0x203a6567, +0x626d754e, +0x6f207265, +0x6f632066, +0x20736572, +0x206e6163, +0x20746f6e, +0x7a206562, +0x2e6f7265, +0x626f4a00, +0x73656d20, +0x65676173, +0x754e203a, +0x7265626d, +0x20666f20, +0x65726f63, +0x6f742073, +0x616c206f, +0x2e656772, +0x626f4a00, +0x73656d20, +0x65676173, +0x6e55203a, +0x70707573, +0x6574726f, +0x6c662064, +0x20736761, +0x2e746573, +0x626f4a00, +0x73656d20, +0x65676173, +0x754e203a, +0x7265626d, +0x20666f20, +0x6d617266, +0x74207365, +0x6c206f6f, +0x65677261, +0x6f6e002e, +0x61707320, +0x69206563, +0x6f6a206e, +0x75712062, +0x00657565, +0x5f544553, +0x4954504f, +0x66204e4f, +0x656c6961, +0x25203a64, +0x00000a73, +0x562f3556, +0x32482d37, +0x4e453436, +0x00203a43, +0x69636552, +0x64657665, +0x54455320, +0x54504f5f, +0x204e4f49, +0x61746164, +0x7a69735f, +0x75252065, +0x74706f20, +0x646e695f, +0x25207865, +0x72612075, +0x78302067, +0x78383025, +0x6553000a, +0x6f697373, +0x706f206e, +0x6e6f6974, +0x61632073, +0x6e6f206e, +0x6220796c, +0x68632065, +0x65676e61, +0x6e692064, +0x4f545320, +0x44455050, +0x61747320, +0x002e6574, +0x6d726946, +0x65726177, +0x20736920, +0x20746f6e, +0x70707573, +0x2074726f, +0x73696874, +0x74706f20, +0x206e6f69, +0x70692d2d, +0x6c616e65, +0x645f7974, +0x65730063, +0x706f2d74, +0x70712074, +0x6c65645f, +0x695f6174, +0x203a705f, +0x75736e55, +0x726f7070, +0x20646574, +0x756c6176, +0x65730065, +0x706f2d74, +0x70712074, +0x6c65645f, +0x695f6174, +0x203a705f, +0x756c6156, +0x6f742065, +0x6962206f, +0x65730067, +0x706f2d74, +0x70712074, +0x6c65645f, +0x695f6174, +0x725f625f, +0x203a6665, +0x75736e55, +0x726f7070, +0x20646574, +0x756c6176, +0x65730065, +0x706f2d74, +0x70712074, +0x6c65645f, +0x695f6174, +0x725f625f, +0x203a6665, +0x756c6156, +0x6f742065, +0x6962206f, +0x65730067, +0x706f2d74, +0x69662074, +0x20646578, +0x203a5051, +0x75736e75, +0x726f7070, +0x20646574, +0x756c6176, +0x6e650065, +0x656c6261, +0x7369765f, +0x3a6c6175, +0x67726120, +0x6e617220, +0x6d206567, +0x20747375, +0x66206562, +0x206d6f72, +0x6f742030, +0x00313320, +0x646e6162, +0x74646977, +0x696c2068, +0x3a74696d, +0x746f6e20, +0x70757320, +0x74726f70, +0x73006465, +0x6f2d7465, +0x6d207470, +0x6e5f7861, +0x635f6d75, +0x7365726f, +0x6e49203a, +0x696c6176, +0x61762064, +0x0065756c, +0x5f746573, +0x5f636e65, +0x5f656d66, +0x75636962, +0x5f636962, +0x3a736964, +0x67726120, +0x73756d20, +0x65622074, +0x6f203020, +0x00312072, +0x746c2d2d, +0x6f6d5f72, +0x6d206564, +0x20747375, +0x62206562, +0x656c2065, +0x74207373, +0x206e6168, +0x5f52544c, +0x45444f4d, +0x5055535f, +0x54524f50, +0x4d554e5f, +0x6c2d2d00, +0x6d5f7274, +0x2065646f, +0x206e6163, +0x20746f6e, +0x666e6f63, +0x77206769, +0x20687469, +0x65722d2d, +0x62725f66, +0x206e655f, +0x2d2d0031, +0x5f72746c, +0x69726570, +0x6320646f, +0x6e206e61, +0x6320746f, +0x69666e6f, +0x69772067, +0x2d206874, +0x6665722d, +0x5f62725f, +0x31206e65, +0x69616600, +0x6f74206c, +0x74657320, +0x636e6520, +0x6174735f, +0x6d5f7374, +0x3a65646f, +0x67726120, +0x73756d20, +0x65622074, +0x206e6920, +0x202c305b, +0x41005d37, +0x52455353, +0x25202854, +0x3d3e2064, +0x6e696d20, +0x72665f69, +0x5f656d61, +0x5f78616d, +0x6d676573, +0x73746e65, +0x202c2920, +0x206f6f74, +0x20676962, +0x696e696d, +0x6172665f, +0x6d5f656d, +0x735f7861, +0x656d6765, +0x2873746e, +0x20296425, +0x65730021, +0x6e655f74, +0x65735f63, +0x756d5f74, +0x5f69746c, +0x5f737073, +0x3a737070, +0x67726120, +0x73756d20, +0x65622074, +0x6f203020, +0x00312072, +0x6d726946, +0x65726177, +0x20736920, +0x20746f6e, +0x70707573, +0x2074726f, +0x73696874, +0x74706f20, +0x206e6f69, +0x70692d2d, +0x6c616e65, +0x615f7974, +0x6c75676e, +0x2d007261, +0x6665722d, +0x5f62725f, +0x31206e65, +0x6e616320, +0x746f6e20, +0x6e6f6320, +0x20676966, +0x68746977, +0x6c2d2d20, +0x6d5f7274, +0x0065646f, +0x2d746573, +0x2074706f, +0x34363268, +0x3a636e65, +0x736e5520, +0x6f707075, +0x64657472, +0x74706f20, +0x206e6f69, +0x65646e69, +0x65730078, +0x706f2d74, +0x55203a74, +0x7075736e, +0x74726f70, +0x41206465, +0x70204356, +0x69666f72, +0x7300656c, +0x6f2d7465, +0x203a7470, +0x75736e55, +0x726f7070, +0x20646574, +0x20435641, +0x6576656c, +0x6573006c, +0x706f2d74, +0x32682074, +0x6e653436, +0x63203a63, +0x74736e6f, +0x70692072, +0x20646572, +0x7473756d, +0x20656220, +0x726f2030, +0x73003120, +0x6f2d7465, +0x68207470, +0x65343632, +0x203a636e, +0x41424143, +0x6e652043, +0x656c6261, +0x756d2064, +0x62207473, +0x20302065, +0x3120726f, +0x74657300, +0x74706f2d, +0x36326820, +0x636e6534, +0x6163203a, +0x20636162, +0x74696e69, +0x63646920, +0x73756d20, +0x65622074, +0x202c3020, +0x6f202c31, +0x00322072, +0x5f544553, +0x4954504f, +0x4f204e4f, +0x63202c4b, +0x69666e6f, +0x6e696d72, +0x46000a67, +0x776d7269, +0x20657261, +0x6e207369, +0x7320746f, +0x6f707075, +0x74207472, +0x20736968, +0x6974706f, +0x2d206e6f, +0x6570692d, +0x746c616e, +0x6c705f79, +0x72616e61, +0x63655200, +0x65766965, +0x44492064, +0x415f454c, +0x000a4b43, +0x20746f47, +0x454c4449, +0x4b43415f, +0x74697720, +0x74756f68, +0x6e657320, +0x44492074, +0x002e454c, +0x65636552, +0x64657669, +0x42454420, +0x202c4755, +0x2d67736d, +0x7461643e, +0x69735f61, +0x253d657a, +0x6c202c64, +0x6c657665, +0x0a64253d, +0x6e657300, +0x676e6964, +0x73657220, +0x736e6f70, +0x6f632065, +0x25206564, +0x49000a64, +0x20454c44, +0x6c646928, +0x65735f65, +0x745f746e, +0x6f685f6f, +0x25207473, +0x69202c75, +0x6675626e, +0x746e635f, +0x2c752520, +0x74756f20, +0x5f667562, +0x20746e63, +0x0a297525, +0x20202000, +0x69617661, +0x6f77206c, +0x20736472, +0x63206e69, +0x206d6d6f, +0x75657571, +0x203a7365, +0x2067736d, +0x69207525, +0x6675626e, +0x20752520, +0x6274756f, +0x25206675, +0x53000a75, +0x69646e65, +0x5220676e, +0x52464645, +0x0a454d41, +0x20732500, +0x6d207325, +0x62206576, +0x65666675, +0x72662072, +0x20656d61, +0x626e6928, +0x635f6675, +0x2520746e, +0x6f202c75, +0x75627475, +0x6e635f66, +0x75252074, +0x20000a29, +0x68202020, +0x5f74736f, +0x646e6168, +0x3020656c, +0x38302578, +0x38302578, +0x73752078, +0x645f7265, +0x5f617461, +0x20676174, +0x30257830, +0x30257838, +0x000a7838, +0x20202020, +0x6d617266, +0x6c665f65, +0x20736761, +0x30257830, +0x74207838, +0x2520706f, +0x6f622075, +0x75252074, +0x736f6520, +0x20752520, +0x206a6572, +0x000a7525, +0x20202020, +0x6d726f66, +0x30207461, +0x34302578, +0x69762078, +0x6c626973, +0x75252065, +0x0a752578, +0x20202000, +0x6e696d20, +0x72665f69, +0x5f656d61, +0x25282079, +0x75252d75, +0x20000a29, +0x70202020, +0x656e616c, +0x78302073, +0x78383025, +0x7830202c, +0x78383025, +0x2020000a, +0x69732020, +0x2073657a, +0x202c7525, +0x000a7525, +0x20202020, +0x706f7263, +0x75252078, +0x6f726320, +0x25207970, +0x66612075, +0x775f6362, +0x2062735f, +0x25207525, +0x66612075, +0x705f6362, +0x6d617261, +0x78302073, +0x78383025, +0x2020000a, +0x65702020, +0x30206b65, +0x32302578, +0x32302578, +0x32302578, +0x32302578, +0x20000a78, +0x70202020, +0x656e616c, +0x706f745f, +0x25783020, +0x20783830, +0x30257830, +0x30207838, +0x38302578, +0x20000a78, +0x70202020, +0x656e616c, +0x746f625f, +0x25783020, +0x20783830, +0x30257830, +0x30207838, +0x38302578, +0x20000a78, +0x73202020, +0x64697274, +0x20207365, +0x20642520, +0x25206425, +0x20000a64, +0x6d202020, +0x25207861, +0x75257875, +0x7325000a, +0x20732520, +0x2065766d, +0x66667562, +0x62207265, +0x74737469, +0x6d616572, +0x6e692820, +0x5f667562, +0x20746e63, +0x202c7525, +0x6274756f, +0x635f6675, +0x2520746e, +0x000a2975, +0x20202020, +0x73746962, +0x61657274, +0x6c665f6d, +0x20736761, +0x30257830, +0x65207838, +0x2066736f, +0x65207525, +0x2520666f, +0x6f652075, +0x75252073, +0x666f6520, +0x25207362, +0x74732075, +0x20737461, +0x000a7525, +0x20202020, +0x72646461, +0x25783020, +0x20783830, +0x6f6c6c61, +0x75252063, +0x66666f20, +0x20752520, +0x6c6c6966, +0x0a752520, +0x20732500, +0x6d207325, +0x62206576, +0x65666675, +0x61702072, +0x656d6172, +0x2c726574, +0x70797420, +0x75252065, +0x7325000a, +0x20732520, +0x2065766d, +0x66667562, +0x67207265, +0x72656e65, +0x28206c61, +0x75626e69, +0x6e635f66, +0x75252074, +0x756f202c, +0x66756274, +0x746e635f, +0x29752520, +0x2020000a, +0x79742020, +0x25206570, +0x63202c75, +0x69666e6f, +0x69735f67, +0x2520657a, +0x20000a75, +0x63202020, +0x69666e6f, +0x78302067, +0x78323025, +0x25783020, +0x20783230, +0x30257830, +0x30207832, +0x32302578, +0x20000a78, +0x62202020, +0x65666675, +0x74705f72, +0x78302072, +0x78383025, +0x7562202c, +0x72656666, +0x7a69735f, +0x75252065, +0x6f48000a, +0x70207473, +0x746e6972, +0x66756220, +0x20726566, +0x4f525245, +0x25202e52, +0x73252073, +0x65766d20, +0x66756220, +0x20726566, +0x68746977, +0x6b6e7520, +0x6e776f6e, +0x646f6320, +0x75252065, +0x6f47000a, +0x554f0074, +0x54555054, +0x766e4900, +0x64696c61, +0x74756f20, +0x20747570, +0x66667562, +0x002e7265, +0x61766e49, +0x2064696c, +0x66667562, +0x69207265, +0x564d206e, +0x4f435f45, +0x425f4d4d, +0x4f5f4655, +0x5f515455, +0x52444441, +0x78652820, +0x74636570, +0x6d206465, +0x625f6576, +0x65666675, +0x69625f72, +0x72747374, +0x296d6165, +0x6553002e, +0x6e69646e, +0x4e490067, +0x00545550, +0x65636552, +0x64657669, +0x54554f20, +0x5f545550, +0x53554c46, +0x74732048, +0x20657461, +0x6f207525, +0x75707475, +0x6c625f74, +0x656b636f, +0x75252064, +0x754f000a, +0x74757074, +0x756c6620, +0x6f206873, +0x20796c6e, +0x6f6c6c61, +0x20646577, +0x6e656877, +0x6f747320, +0x64657070, +0x726f202c, +0x74666120, +0x72207265, +0x6f707365, +0x2065736e, +0x5145535f, +0x434e4555, +0x41505f45, +0x454d4152, +0x53524554, +0x6e655300, +0x676e6964, +0x54554f20, +0x5f545550, +0x53554c46, +0x0a444548, +0x6e655300, +0x676e6964, +0x504e4920, +0x465f5455, +0x4853554c, +0x000a4445, +0x65636552, +0x64657669, +0x504e4920, +0x465f5455, +0x4853554c, +0x4e49000a, +0x5f545550, +0x53554c46, +0x6e6f2048, +0x6120796c, +0x776f6c6c, +0x77206465, +0x206e6568, +0x53206e69, +0x50504f54, +0x73204445, +0x65746174, +0x6552002e, +0x76696563, +0x47206465, +0x4d000a4f, +0x525f4556, +0x45555145, +0x435f5453, +0x5f45444f, +0x203a4f47, +0x72702041, +0x6f697665, +0x73207375, +0x65746174, +0x61727420, +0x7469736e, +0x206e6f69, +0x73207369, +0x6c6c6974, +0x6e657020, +0x676e6964, +0x6f4e002e, +0x626f6a20, +0x206e6920, +0x20626f6a, +0x75657571, +0x52002e65, +0x69656365, +0x20646576, +0x504f5453, +0x564d000a, +0x45525f45, +0x53455551, +0x4f435f54, +0x535f4544, +0x3a504f54, +0x70204120, +0x69766572, +0x2073756f, +0x74617473, +0x72742065, +0x69736e61, +0x6e6f6974, +0x20736920, +0x6c697473, +0x6570206c, +0x6e69646e, +0x43002e67, +0x676e6168, +0x74732065, +0x20657461, +0x25206f74, +0x53000a64, +0x69646e65, +0x5320676e, +0x45544154, +0x4148435f, +0x2045474e, +0x5f77656e, +0x74617473, +0x75253d65, +0x7453000a, +0x20657461, +0x6e616863, +0x70206567, +0x69646e65, +0x7320676e, +0x65746174, +0x2064253d, +0x646e6570, +0x3d676e69, +0x000a6425, +0x65636552, +0x64657669, +0x4d554420, +0x4d000a50, +0x525f4556, +0x45555145, +0x435f5453, +0x5f45444f, +0x504d5544, +0x746f6e20, +0x6c6c6120, +0x6465776f, +0x726f6620, +0x6f727020, +0x74636574, +0x73206465, +0x69737365, +0x2e736e6f, +0x72626e00, +0x66756220, +0x73726566, +0x6c656820, +0x25203a64, +0x6e692075, +0x20747570, +0x6f207525, +0x75707475, +0x61000a74, +0x6c696176, +0x726f7720, +0x69207364, +0x6f63206e, +0x71206d6d, +0x65756575, +0x6d203a73, +0x25206773, +0x6e692075, +0x20667562, +0x6f207525, +0x75627475, +0x75252066, +0x6552000a, +0x76696563, +0x50206465, +0x0a474e49, +0x636e6500, +0x6665722d, +0x6172662d, +0x203a656d, +0x65206f6e, +0x736f7078, +0x66206465, +0x656d6172, +0x206f7420, +0x656c6572, +0x00657361, +0x6e697028, +0x69202967, +0x7265746e, +0x206c616e, +0x6f727265, +0x69772072, +0x72206874, +0x662d6665, +0x656d6172, +0x7478652d, +0x74636172, +0x206e6f69, +0x6863656d, +0x73696e61, +0x63002e6d, +0x2065646f, +0x6425203d, +0x7254000a, +0x69736e61, +0x6e6f6974, +0x46494620, +0x766f204f, +0x6c667265, +0x5500776f, +0x7075736e, +0x74726f70, +0x6d206465, +0x61737365, +0x63206567, +0x2e65646f, +0x206f4e00, +0x62746e69, +0x73206675, +0x65636170, +0x726f6620, +0x73616d20, +0x20726574, +0x65766173, +0x65726120, +0x65530061, +0x6e69646e, +0x57532067, +0x48435449, +0x495f4445, +0x65000a4e, +0x722d636e, +0x662d6665, +0x656d6172, +0x6f6e203a, +0x6e652074, +0x6867756f, +0x746e6920, +0x616e7265, +0x6c73206c, +0x0073746f, +0x6e69424d, +0x69206f66, +0x7475706e, +0x746f6e20, +0x6c6c6120, +0x6465776f, +0x726f6620, +0x6f727020, +0x74636574, +0x73206465, +0x69737365, +0x002e6e6f, +0x6e69424d, +0x69206f66, +0x7475706e, +0x66756220, +0x20726566, +0x20736168, +0x656c6c69, +0x206c6167, +0x61636f6c, +0x6e6f6974, +0x64614200, +0x69424d20, +0x206f666e, +0x75706e69, +0x75203b74, +0x5f646573, +0x657a6973, +0x74732820, +0x65646972, +0x295d315b, +0x73756d20, +0x6f6e2074, +0x65622074, +0x72616c20, +0x20726567, +0x6e616874, +0x78616d20, +0x7a69735f, +0x73282065, +0x64697274, +0x5d305b65, +0x42000a29, +0x4d206461, +0x666e6942, +0x6e69206f, +0x20747570, +0x66667562, +0x002e7265, +0x73206f4e, +0x6f707075, +0x66207472, +0x7420726f, +0x20736968, +0x66667562, +0x63207265, +0x726f6c6f, +0x726f6620, +0x2e74616d, +0x72616800, +0x72617764, +0x6f642065, +0x6e207365, +0x7320746f, +0x6f707075, +0x41207472, +0x20434246, +0x75706e69, +0x6e650074, +0x69646f63, +0x6e20676e, +0x7320746f, +0x6f707075, +0x64657472, +0x20666f20, +0x73696874, +0x2d303120, +0x20746962, +0x75706e69, +0x6f662074, +0x74616d72, +0x72616800, +0x72617764, +0x6f642065, +0x6e207365, +0x7320746f, +0x6f707075, +0x4d207472, +0x465f4556, +0x414d524f, +0x55595f54, +0x30323456, +0x3130505f, +0x564d0030, +0x55425f45, +0x52454646, +0x4152465f, +0x465f454d, +0x5f47414c, +0x45544e49, +0x43414c52, +0x65732045, +0x49203a74, +0x7265746e, +0x6563616c, +0x6e652064, +0x65646f63, +0x746f6e20, +0x70757320, +0x74726f70, +0x002e6465, +0x67616c46, +0x45564d20, +0x4655425f, +0x5f524546, +0x4d415246, +0x4c465f45, +0x425f4741, +0x465f544f, +0x54535249, +0x6f687320, +0x20646c75, +0x20746f6e, +0x73206562, +0x002e7465, +0x67616c46, +0x45564d20, +0x4655425f, +0x5f524546, +0x4d415246, +0x4c465f45, +0x425f4741, +0x505f544f, +0x45534552, +0x7320544e, +0x6c756f68, +0x6f6e2064, +0x65622074, +0x74657320, +0x754d002e, +0x68207473, +0x20657661, +0x69736976, +0x5f656c62, +0x6d617266, +0x69775f65, +0x20687464, +0x2e30203e, +0x73754d00, +0x61682074, +0x76206576, +0x62697369, +0x665f656c, +0x656d6172, +0x6965685f, +0x20746867, +0x2e30203e, +0x73697600, +0x656c6269, +0x6172665f, +0x775f656d, +0x68746469, +0x6f6f7420, +0x72616c20, +0x76006567, +0x62697369, +0x665f656c, +0x656d6172, +0x6965685f, +0x20746867, +0x206f6f74, +0x6772616c, +0x6f520065, +0x69746174, +0x6e206e6f, +0x7320746f, +0x6f707075, +0x64657472, +0x726f6620, +0x42464120, +0x6e692043, +0x2e747570, +0x61635300, +0x676e696c, +0x746f6e20, +0x70757320, +0x74726f70, +0x66206465, +0x4120726f, +0x20434246, +0x75706e69, +0x4d002e74, +0x6f727269, +0x676e6972, +0x20736920, +0x20746f6e, +0x70707573, +0x6574726f, +0x6f662064, +0x46412072, +0x69204342, +0x7475706e, +0x4641002e, +0x70204342, +0x656e616c, +0x69203020, +0x6f6e2073, +0x6e692074, +0x6c617620, +0x6d206469, +0x726f6d65, +0x65722079, +0x6e6f6967, +0x4641002e, +0x70204342, +0x656e616c, +0x73203020, +0x20657a69, +0x756f6873, +0x6e20646c, +0x6220746f, +0x657a2065, +0x002e6f72, +0x43424641, +0x746f6220, +0x206d6f74, +0x6e616c70, +0x6f702065, +0x65746e69, +0x68732072, +0x646c756f, +0x76616820, +0x65622065, +0x7a206e65, +0x2e6f7265, +0x42464100, +0x6c702043, +0x20656e61, +0x69732031, +0x7320657a, +0x6c756f68, +0x65622064, +0x72657a20, +0x41002e6f, +0x20434246, +0x75706e69, +0x5f203a74, +0x74646977, +0x6e695f68, +0x7075735f, +0x6c627265, +0x736b636f, +0x6f6f7420, +0x616d7320, +0x66206c6c, +0x6620726f, +0x656d6172, +0x61635300, +0x676e696c, +0x746f6e20, +0x70757320, +0x74726f70, +0x66206465, +0x7020726f, +0x616e616c, +0x6e692072, +0x2e747570, +0x746f5200, +0x6f697461, +0x6163206e, +0x6f6e206e, +0x65622074, +0x6e6f6420, +0x6f662065, +0x3a342072, +0x2e323a32, +0x78616d00, +0x6172665f, +0x775f656d, +0x68746469, +0x6f687320, +0x20646c75, +0x6c206562, +0x65677261, +0x68742072, +0x7a206e61, +0x2e6f7265, +0x78616d00, +0x6172665f, +0x685f656d, +0x68676965, +0x68732074, +0x646c756f, +0x20656220, +0x6772616c, +0x74207265, +0x206e6168, +0x6f72657a, +0x6e55002e, +0x70707573, +0x6574726f, +0x6c702064, +0x72616e61, +0x66756220, +0x20726566, +0x6f6c6f63, +0x6f662072, +0x74616d72, +0x7453002e, +0x65646972, +0x6f6f7420, +0x616d7320, +0x74206c6c, +0x6f68206f, +0x6d20646c, +0x665f7861, +0x656d6172, +0x6469775f, +0x002e6874, +0x6e616c70, +0x6f745f65, +0x756d2070, +0x62207473, +0x6e692065, +0x6d656d20, +0x2079726f, +0x69676572, +0x46206e6f, +0x454d4152, +0x2e465542, +0x616c7000, +0x625f656e, +0x7320746f, +0x6c756f68, +0x65622064, +0x72657a20, +0x6f66206f, +0x6f6e2072, +0x6e692d6e, +0x6c726574, +0x64656361, +0x72747320, +0x2e6d6165, +0x64644100, +0x73736572, +0x20666f20, +0x73756e75, +0x70206465, +0x656e616c, +0x6f687320, +0x20646c75, +0x7a206562, +0x2e6f7265, +0x72745300, +0x20656469, +0x7520666f, +0x6573756e, +0x6c702064, +0x20656e61, +0x756f6873, +0x6220646c, +0x657a2065, +0x002e6f72, +0x7473754d, +0x76616820, +0x69762065, +0x6c626973, +0x72665f65, +0x5f656d61, +0x74646977, +0x3d3c2068, +0x78616d20, +0x6172665f, +0x775f656d, +0x68746469, +0x545f002e, +0x505f504f, +0x45534552, +0x6f20544e, +0x455f2072, +0x4f5f444e, +0x54535f46, +0x4d414552, +0x73756d20, +0x65622074, +0x74657320, +0x6e49002e, +0x696c6176, +0x75622064, +0x72656666, +0x206e6920, +0x5f45564d, +0x4d4d4f43, +0x4655425f, +0x514e495f, +0x4444415f, +0x65282052, +0x63657078, +0x20646574, +0x5f65766d, +0x66667562, +0x665f7265, +0x656d6172, +0x20726f20, +0x5f65766d, +0x66667562, +0x705f7265, +0x6d617261, +0x34002e29, +0x2d203032, +0x3234203e, +0x6f632032, +0x7265766e, +0x6e6f6973, +0x746f6e20, +0x70757320, +0x74726f70, +0x002e6465, +0x43534152, +0x41520030, +0x00314353, +0x43534152, +0x41520032, +0x00334353, +0x43534152, +0x44530034, +0x5600414d, +0x00414d44, +0x00464552, +0x41544146, +0x52455f4c, +0x5f524f52, +0x45444e55, +0x454e4946, +0x41460044, +0x5f4c4154, +0x4f525245, +0x46415f52, +0x495f4342, +0x5455504e, +0x524f435f, +0x54505552, +0x54414600, +0x455f4c41, +0x524f5252, +0x4246415f, +0x45525f43, +0x4f435f46, +0x50555252, +0x41460054, +0x5f4c4154, +0x4f525245, +0x534c5f52, +0x435f4449, +0x5f4c5254, +0x4358414d, +0x5f45524f, +0x5f544f4e, +0x00544553, +0x00033430, +0x0000fdfd, +0x0000fdfd, +0x0000fdfd, +0x00019a8c, +0x00019a92, +0x00019a98, +0x00019a9e, +0x00019aa4, +0x00019aaa, +0x00019aaf, +0x00019ab4, +0x00019ab8, +0x00019ace, +0x00019aed, +0x00019b0a, +0x03100000, +0x026c000c, +0x01a4001e, +0x00000040, +0x00000063, +0x000005cd, +0x0000018c, +0x00010040, +0x00000080, +0x00000063, +0x000005cd, +0x0000018c, +0x00020040, +0x000000c0, +0x0000018c, +0x00000bb8, +0x00000384, +0x00030080, +0x00000180, +0x0000018c, +0x00001770, +0x00000948, +0x00040080, +0x00000300, +0x0000018c, +0x00002e68, +0x00000948, +0x00050080, +0x000007d0, +0x0000018c, +0x00002e68, +0x00000948, +0x00060080, +0x00000fa0, +0x00000318, +0x00004d58, +0x00001290, +0x00070100, +0x00000fa0, +0x00000654, +0x00004f1a, +0x00001fa4, +0x00080100, +0x00002710, +0x00000654, +0x00009e34, +0x00001fa4, +0x00090100, +0x000036b0, +0x00000e10, +0x0001a5e0, +0x00004650, +0x000a0200, +0x00004e20, +0x00001400, +0x00034bc0, +0x00005000, +0x000b0200, +0x00004e20, +0x00002000, +0x0003c000, +0x00008000, +0x000c0200, +0x0000c350, +0x00002000, +0x0003c000, +0x00008000, +0x000d0200, +0x0000c350, +0x00002200, +0x0007f800, +0x00008800, +0x000e0200, +0x00020f58, +0x00005640, +0x00090000, +0x0001af40, +0x000f0200, +0x0003a980, +0x00009000, +0x000f0000, +0x0002d000, +0x00100200, +0x0003a980, +0x00009000, +0x001fa400, +0x0002d000, +0x00110200, +0x0003a980, +0x00022000, +0x003fc000, +0x000aa000, +0x00122000, +0x00075300, +0x00022000, +0x007f8000, +0x000aa000, +0x00132000, +0x000c3500, +0x00022000, +0x00ff0000, +0x000aa000, +0x00142000, +0x0006d883, +0x00068843, +0x00063805, +0x0005e7c8, +0x000598df, +0x000549f6, +0x00050eca, +0x0004d39c, +0x00048dcf, +0x00044800, +0x000401d4, +0x0003bbac, +0x00038a2c, +0x000358ac, +0x00031b8f, +0x0002de73, +0x0002a605, +0x00026d9a, +0x0002460a, +0x00021e7b, +0x0001ef3b, +0x0001bffb, +0x000196d7, +0x00016db6, +0x0001510f, +0x0001346c, +0x0001140a, +0x0000f3ac, +0x0000da64, +0x0000c11c, +0x0000b1a1, +0x0000a229, +0x000091d7, +0x00008185, +0x00007521, +0x000068c0, +0x00005fdf, +0x00005700, +0x00004dfd, +0x000044fb, +0x00003d80, +0x00003605, +0x000030fb, +0x00002bf1, +0x000026b6, +0x0000217b, +0x00001dc5, +0x00001a12, +0x0000174f, +0x0000148d, +0x00001288, +0x00001083, +0x0048fc31, +0x0039695a, +0x002d2957, +0x00238678, +0x001bf1f8, +0x0015fb83, +0x00114ac0, +0x000d9a36, +0x000ab333, +0x00086abb, +0x00069ef8, +0x0005354f, +0x000418d2, +0x00033908, +0x000288fd, +0x0001fe83, +0x00019194, +0x00013be4, +0x0000f87d, +0x0000c378, +0x000099c3, +0x000078f3, +0x00005f24, +0x00004ad7, +0x00003adf, +0x00002e4f, +0x0000246e, +0x00001ca6, +0x0000168a, +0x000011bb, +0x00000df1, +0x00000af8, +0x000008a1, +0x000006c8, +0x00000557, +0x00000433, +0x0000034d, +0x00000297, +0x0000020a, +0x0000019a, +0x00000143, +0x000000fd, +0x000000c8, +0x0000009c, +0x0000007b, +0x00000061, +0x0000004a, +0x0000003b, +0x0000002e, +0x00000024, +0x0000001c, +0x00000017, +0x00059bae, +0x000552ae, +0x000509ae, +0x0004c0ae, +0x000478dc, +0x0004310a, +0x0003f188, +0x0003b208, +0x00037203, +0x00033200, +0x0002f34f, +0x0002b49f, +0x00027f2e, +0x000249bd, +0x00021714, +0x0001e46e, +0x0001b2c5, +0x0001811c, +0x00015a29, +0x00013336, +0x00010de9, +0x0000e89a, +0x0000caae, +0x0000acc3, +0x00009771, +0x0000821f, +0x00006d4d, +0x0000587b, +0x00004aca, +0x00003d17, +0x0000355c, +0x00002da1, +0x0000272c, +0x000020b3, +0x00001c3b, +0x000017c3, +0x000014bb, +0x000011b3, +0x00000f5f, +0x00000d0a, +0x00000b6c, +0x000009cd, +0x000008e4, +0x000007fd, +0x0000073b, +0x00000678, +0x000005fb, +0x0000057d, +0x00000521, +0x000004c8, +0x00000485, +0x00000443, +0x000734bd, +0x0006def6, +0x00068931, +0x0006336c, +0x0005e1cd, +0x0005902c, +0x00055269, +0x000514a6, +0x0004cb85, +0x00048266, +0x000438da, +0x0003ef4d, +0x0003bba6, +0x000387fd, +0x000347f8, +0x000307f1, +0x0002cd6c, +0x000292e6, +0x000269bd, +0x00024097, +0x00020ed2, +0x0001dd0d, +0x0001b16e, +0x000185cf, +0x0001675f, +0x000148ee, +0x000126f6, +0x000104fb, +0x0000ea64, +0x0000cfcf, +0x0000bf92, +0x0000af57, +0x00009e4d, +0x00008d45, +0x0000806c, +0x00007392, +0x00006a66, +0x00006138, +0x000057e9, +0x00004e9a, +0x000046cd, +0x00003f00, +0x000039a9, +0x00003454, +0x00002ec3, +0x00002931, +0x0000252e, +0x0000212c, +0x00001e14, +0x00001afd, +0x000018b3, +0x00001669, +0x00065fec, +0x00060f92, +0x0005bf38, +0x00056edf, +0x0005213d, +0x0004d39c, +0x00048f2c, +0x00044abd, +0x00040536, +0x0003bfae, +0x00037b80, +0x00033752, +0x0002fd78, +0x0002c39f, +0x00028c3d, +0x000254da, +0x00021e17, +0x0001e752, +0x0001bc4a, +0x00019143, +0x00016540, +0x0001393d, +0x0001153d, +0x0000f13b, +0x0000d700, +0x0000bcc5, +0x0000a2b3, +0x000088a1, +0x000075d7, +0x0000630d, +0x000057bb, +0x00004c6c, +0x00004273, +0x0000387b, +0x00003161, +0x00002a45, +0x0000255f, +0x00002076, +0x00001c76, +0x00001878, +0x00001576, +0x00001271, +0x00001085, +0x00000e9a, +0x00000cf1, +0x00000b48, +0x00000a31, +0x0000091a, +0x0000084d, +0x00000780, +0x00000717, +0x000006b1, +0x0006123d, +0x0005c39a, +0x000574f6, +0x00052652, +0x0004d9df, +0x00048d6e, +0x000448f1, +0x00040473, +0x0003bf64, +0x00037a54, +0x000336f1, +0x0002f38f, +0x0002ba0d, +0x0002808a, +0x00024a7d, +0x00021471, +0x0001df21, +0x0001a9d2, +0x00017f78, +0x0001551c, +0x00012c4a, +0x00010378, +0x0000e2c0, +0x0000c205, +0x0000aa94, +0x00009321, +0x00007c12, +0x00006500, +0x000055df, +0x000046bd, +0x00003e29, +0x00003594, +0x00002e61, +0x0000272c, +0x0000220f, +0x00001cf1, +0x0000196e, +0x000015ec, +0x0000133b, +0x0000108a, +0x00000ea6, +0x00000cc3, +0x00000bb8, +0x00000aae, +0x000009cf, +0x000008f1, +0x0000086c, +0x000007e6, +0x00000788, +0x00000726, +0x000006ec, +0x000006ae, +0x2a2a2a2a, +0x53415220, +0x20642543, +0x524f4241, +0x2a2a2054, +0x000a2a2a, +0x43502020, +0x20202020, +0x7830203d, +0x78383025, +0x2020000a, +0x20205253, +0x203d2020, +0x30257830, +0x000a7838, +0x41462020, +0x20202052, +0x7830203d, +0x78383025, +0x2020000a, +0x32255b52, +0x3d205d64, +0x25783020, +0x0a783830, +0x00000000, +0x000116ab, +0x000116ab, +0x000116ab, +0x000116ab, +0x63617453, +0x7461206b, +0x0a702520, +0x61747300, +0x25206b63, +0x3d206434, +0x25783020, +0x0a783830, +0x00000000, +0x2a2a2a2a, +0x53415220, +0x20642543, +0x524f4241, +0x2a2a2054, +0x000a2a2a, +0x43502020, +0x20202020, +0x7830203d, +0x78383025, +0x2020000a, +0x20205253, +0x203d2020, +0x30257830, +0x000a7838, +0x41462020, +0x20202052, +0x7830203d, +0x78383025, +0x2020000a, +0x32255b52, +0x3d205d64, +0x25783020, +0x0a783830, +0x00000000, +0x00011d4a, +0x00011d4a, +0x00011d4a, +0x00011d4a, +0x63617453, +0x7461206b, +0x0a702520, +0x61747300, +0x25206b63, +0x3d206434, +0x25783020, +0x0a783830, +0x00000000, +0x2a2a2a2a, +0x53415220, +0x20642543, +0x524f4241, +0x2a2a2054, +0x000a2a2a, +0x43502020, +0x20202020, +0x7830203d, +0x78383025, +0x2020000a, +0x20205253, +0x203d2020, +0x30257830, +0x000a7838, +0x41462020, +0x20202052, +0x7830203d, +0x78383025, +0x2020000a, +0x32255b52, +0x3d205d64, +0x25783020, +0x0a783830, +0x00000000, +0x00012273, +0x00012273, +0x00012273, +0x00012273, +0x000000a0, +0x000000b0, +0x000000d0, +0x000000e0, +0x00000100, +0x00000120, +0x00000140, +0x00000160, +0x000001a0, +0x000001c0, +0x00000200, +0x00000240, +0x00000280, +0x000002c0, +0x00000340, +0x00000380, +0x00000400, +0x00000480, +0x00000500, +0x00000580, +0x00000680, +0x00000700, +0x00000800, +0x00000900, +0x00000a00, +0x00000b00, +0x00000d00, +0x00000e00, +0x00001000, +0x00001200, +0x00001400, +0x00001600, +0x00001a00, +0x00001c00, +0x00002000, +0x00002400, +0x00002800, +0x00002c00, +0x00003400, +0x00003800, +0x00004000, +0x00004800, +0x00005000, +0x00005800, +0x00006800, +0x00007000, +0x00008000, +0x00009000, +0x0000a000, +0x0000b000, +0x0000d000, +0x0000e000, +0x33323130, +0x37363534, +0x00003938, +0x33323130, +0x37363534, +0x62613938, +0x66656463, +0x72726f43, +0x65747075, +0x6e692064, +0x20747570, +0x75657571, +0x49002e65, +0x6c61766e, +0x62206469, +0x65666675, +0x65682072, +0x72656461, +0x206e6920, +0x5f45564d, +0x4d4d4f43, +0x4655425f, +0x54554f5f, +0x44415f51, +0x002e5244, +0x206f6f54, +0x6772616c, +0x65722065, +0x73657571, +0x656d2074, +0x67617373, +0x54002e65, +0x6c206f6f, +0x65677261, +0x66756220, +0x20726566, +0x7373656d, +0x2e656761, +0x766e4900, +0x64696c61, +0x66756220, +0x20726566, +0x4d206e69, +0x435f4556, +0x5f4d4d4f, +0x5f465542, +0x5f514e49, +0x52444441, +0x564d002e, +0x3a505245, +0x5f6d6172, +0x6e697270, +0x66756274, +0x20736920, +0x20746f6e, +0x69617661, +0x6c62616c, +0x000a2e65, +0x5245564d, +0x72203a50, +0x705f6d61, +0x746e6972, +0x75645f66, +0x6620706d, +0x206d6f72, +0x70257830, +0x5052000a, +0x4d554454, +0x6c663a50, +0x253d6761, +0x69202c78, +0x7865646e, +0x2c75253d, +0x5f727720, +0x3d746e63, +0x202c7525, +0x635f6472, +0x253d746e, +0x000a2e75, +0x252d5746, +0x25203a75, +0x564d0073, +0x3a505245, +0x67616c66, +0x2c78253d, +0x78646920, +0x2c75253d, +0x5f727720, +0x3d746e63, +0x202c7525, +0x635f6472, +0x253d746e, +0x000a2e75, +0x34302520, +0x38250078, +0x73253a78, +0x2520000a, +0x00783230, +0x1007f000, +0x49574558, +0x35565644, +0x2d37562f, +0x34363248, +0x3a434e45, +0x65720020, +0x657a6973, +0x7470203a, +0x78302072, +0x78383025, +0x77656e20, +0x7a69735f, +0x75252065, +0x766d000a, +0x656d5f65, +0x65725f6d, +0x657a6973, +0x6c616d00, +0x3a636f6c, +0x7a697320, +0x75252065, +0x616d202c, +0x75252078, +0x6572202c, +0x6e6f6967, +0x2c752520, +0x676f6c20, +0x6c615f32, +0x206e6769, +0x000a7525, +0x6c6c616d, +0x203a636f, +0x75746572, +0x64656e72, +0x25783020, +0x6d000a70, +0x6d5f6576, +0x615f6d65, +0x636f6c6c, +0x6c6c4100, +0x7461636f, +0x6d206465, +0x726f6d65, +0x61682079, +0x72772073, +0x20676e6f, +0x67696c61, +0x6e656d6e, +0x78450074, +0x74636570, +0x61206465, +0x636f6c6c, +0x64657461, +0x6d656d20, +0x2079726f, +0x50206e69, +0x45544f52, +0x44455443, +0x67657220, +0x2e6e6f69, +0x70784500, +0x65746365, +0x6c612064, +0x61636f6c, +0x20646574, +0x6f6d656d, +0x69207972, +0x5246206e, +0x42454d41, +0x72204655, +0x6f696765, +0x6e002e6e, +0x7720746f, +0x69746961, +0x2500676e, +0x64692073, +0x635f656c, +0x656c6379, +0x25000a73, +0x2d252073, +0x20733831, +0x64353125, +0x7325000a, +0x746f5420, +0x695f6c61, +0x20656c64, +0x20202020, +0x25202020, +0x0a643531, +0x726f6300, +0x64252065, +0x20732520, +0x30322d25, +0x6f632073, +0x253d6564, +0x70206433, +0x253d6369, +0x70206433, +0x705b736f, +0x283d5d75, +0x2c643325, +0x29643325, +0x6b6c6320, +0x0a64253d, +0x726f6300, +0x64252065, +0x20732520, +0x30322d25, +0x20202073, +0x20202020, +0x70202020, +0x253d6369, +0x70206433, +0x705b736f, +0x283d5d75, +0x2c643325, +0x29643325, +0x6f6e000a, +0x65732074, +0x61772074, +0x6e697469, +0x4f530067, +0x45525f43, +0x54532e46, +0x53555441, +0x20202020, +0x20202020, +0x78302020, +0x000a7825, +0x5f434f53, +0x2e464552, +0x464e4f43, +0x20204749, +0x20202020, +0x20202020, +0x78257830, +0x4f53000a, +0x45525f43, +0x494c2e46, +0x45524556, +0x20202046, +0x20202020, +0x78302020, +0x000a7825, +0x5f434f53, +0x2e464552, +0x504f5453, +0x4b53414d, +0x20202020, +0x20202020, +0x78257830, +0x4f53000a, +0x434d5f43, +0x4154532e, +0x20205452, +0x20202020, +0x20202020, +0x78302020, +0x000a7825, +0x5f434f53, +0x532e434d, +0x55544154, +0x20202053, +0x20202020, +0x20202020, +0x78257830, +0x4f53000a, +0x52545f43, +0x54532e46, +0x53555441, +0x20202020, +0x20202020, +0x78302020, +0x000a7825, +0x5f434f53, +0x2e465254, +0x53474244, +0x55544154, +0x20202053, +0x20202020, +0x78257830, +0x4f53000a, +0x42445f43, +0x54432e4c, +0x20204c52, +0x20202020, +0x20202020, +0x78302020, +0x000a7825, +0x5f434f53, +0x2e4c4244, +0x4c525443, +0x20202031, +0x20202020, +0x20202020, +0x78257830, +0x4f53000a, +0x42445f43, +0x54532e4c, +0x53555441, +0x20202020, +0x20202020, +0x78302020, +0x000a7825, +0x5f434f53, +0x2e4c4244, +0x54415453, +0x20315355, +0x20202020, +0x20202020, +0x78257830, +0x4f53000a, +0x42445f43, +0x54532e4c, +0x53555441, +0x20202032, +0x20202020, +0x78302020, +0x000a7825, +0x5f434f53, +0x2e4c4244, +0x54415453, +0x20335355, +0x20202020, +0x20202020, +0x78257830, +0x4f53000a, +0x49425f43, +0x52545354, +0x2e4d4145, +0x41424341, +0x54532e44, +0x53555441, +0x20202020, +0x30202020, +0x0a782578, +0x434f5300, +0x5449425f, +0x45525453, +0x4d2e4d41, +0x54494244, +0x41564153, +0x20204c49, +0x20202020, +0x78302020, +0x000a7825, +0x5f434f53, +0x53544942, +0x41455254, +0x45442e4d, +0x54435f46, +0x20204c52, +0x20202020, +0x20202020, +0x25783020, +0x53000a78, +0x425f434f, +0x54535449, +0x4d414552, +0x564d482e, +0x44455250, +0x4154532e, +0x20535554, +0x20202020, +0x78257830, +0x4f53000a, +0x49425f43, +0x52545354, +0x2e4d4145, +0x42414348, +0x532e4441, +0x55544154, +0x20202053, +0x30202020, +0x0a782578, +0x434f5300, +0x2e454d5f, +0x54415453, +0x20205355, +0x20202020, +0x20202020, +0x25783020, +0x53000a78, +0x565f434f, +0x2e414d44, +0x5f515249, +0x54415453, +0x20205355, +0x30202020, +0x0a782578, +0x4f532000, +0x44565f43, +0x6520414d, +0x3d305f71, +0x64207825, +0x3d305f71, +0x65207825, +0x3d315f71, +0x64207825, +0x3d315f71, +0x73207825, +0x635f6372, +0x3d6c7274, +0x000a7825, +0x52414853, +0x525f4445, +0x702e4d41, +0x5f657069, +0x74617473, +0x20202065, +0x28207525, +0x0a297325, +0x41485300, +0x5f444552, +0x2e4d4152, +0x6c5f7369, +0x5f747361, +0x65726f63, +0x0a752520, +0x41485300, +0x5f444552, +0x2e4d4152, +0x5f626f6a, +0x73616870, +0x20202065, +0x0a752520, +0x41485300, +0x5f444552, +0x2e4d4152, +0x5f626f6a, +0x74617473, +0x20202065, +0x0a782520, +0x41485300, +0x5f444552, +0x2e4d4152, +0x7074756f, +0x735f7475, +0x70697274, +0x635f7365, +0x6c706d6f, +0x64657465, +0x0a752520, +0x41485300, +0x5f444552, +0x2e4d4152, +0x71657261, +0x7274735f, +0x73657069, +0x7373695f, +0x20646575, +0x000a7525, +0x414d4453, +0x5541462e, +0x2020544c, +0x20202020, +0x20202020, +0x20202020, +0x78257830, +0x7453000a, +0x73757461, +0x20666f20, +0x636f6c62, +0x2064656b, +0x6b736174, +0x6f662073, +0x6f632072, +0x25206572, +0x63203a75, +0x253d6b6c, +0x000a2075, +0x74617473, +0x25207375, +0x6f742078, +0x64252070, +0x746e6320, +0x20642520, +0x756e636d, +0x7825206d, +0x626d000a, +0x3d6d756e, +0x72207825, +0x766d656d, +0x0a78253d, +0x434f5300, +0x5359535f, +0x4c525443, +0x4e56532e, +0x20564552, +0x20202020, +0x20202020, +0x20202020, +0x20202020, +0x000a7825, +0x525f5746, +0x20205645, +0x20202020, +0x20202020, +0x20202020, +0x20202020, +0x20202020, +0x20202020, +0x25202020, +0x53000a78, +0x49535345, +0x525f4e4f, +0x612e4d41, +0x76697463, +0x6f635f65, +0x20736572, +0x20202020, +0x20202020, +0x75252020, +0x6946000a, +0x61776d72, +0x73206572, +0x75746174, +0x666f2073, +0x73616d20, +0x20726574, +0x726f6328, +0x64252065, +0x63203a29, +0x253d6b6c, +0x000a2064, +0x53534553, +0x5f4e4f49, +0x2e4d4152, +0x6d726966, +0x65726177, +0x6e695f73, +0x6573755f, +0x20202020, +0x25202020, +0x25202c64, +0x25202c64, +0x25202c64, +0x25202c64, +0x25202c64, +0x25202c64, +0x25202c64, +0x53000a64, +0x49535345, +0x525f4e4f, +0x6d2e4d41, +0x65747361, +0x6f635f72, +0x20206572, +0x20202020, +0x20202020, +0x75252020, +0x4553000a, +0x4f495353, +0x41525f4e, +0x616d2e4d, +0x72657473, +0x6c6c615f, +0x7461636f, +0x20206465, +0x20202020, +0x0a642520, +0x53455300, +0x4e4f4953, +0x4d41525f, +0x73616d2e, +0x5f726574, +0x6e676973, +0x20736c61, +0x20202020, +0x20202020, +0x78383025, +0x38302520, +0x30252078, +0x000a7838, +0x53534553, +0x5f4e4f49, +0x2e4d4152, +0x74636970, +0x73657275, +0x5f6e695f, +0x65706970, +0x20202020, +0x25202020, +0x53000a64, +0x49535345, +0x525f4e4f, +0x702e4d41, +0x5f657069, +0x5f636970, +0x6c696174, +0x20202020, +0x20202020, +0x75252020, +0x4553000a, +0x4f495353, +0x41525f4e, +0x69702e4d, +0x705f6570, +0x685f6369, +0x20646165, +0x20202020, +0x20202020, +0x0a752520, +0x53455300, +0x4e4f4953, +0x4d41525f, +0x6e65702e, +0x676e6964, +0x6174735f, +0x20206574, +0x20202020, +0x20202020, +0x000a7525, +0x53534553, +0x5f4e4f49, +0x2e4d4152, +0x73736573, +0x5f6e6f69, +0x74617473, +0x20202065, +0x20202020, +0x25202020, +0x53000a75, +0x49535345, +0x525f4e4f, +0x632e4d41, +0x6c706d6f, +0x64657465, +0x6369705f, +0x65727574, +0x20202073, +0x75252020, +0x4553000a, +0x4f495353, +0x41525f4e, +0x756f2e4d, +0x74757074, +0x6675625f, +0x5f726566, +0x64616568, +0x6172665f, +0x2020656d, +0x000a7525, +0x53534553, +0x5f4e4f49, +0x2e4d4152, +0x7074756f, +0x625f7475, +0x65666675, +0x65685f72, +0x20206461, +0x20202020, +0x75252020, +0x4553000a, +0x4f495353, +0x41525f4e, +0x69702e4d, +0x72757463, +0x695f7365, +0x65757373, +0x6f745f64, +0x7069705f, +0x20202065, +0x000a7525, +0x53534553, +0x5f4e4f49, +0x2e4d4152, +0x6576696c, +0x7274735f, +0x5f657069, +0x64616568, +0x20202020, +0x25202020, +0x53000a75, +0x49535345, +0x525f4e4f, +0x6c2e4d41, +0x5f657669, +0x69727473, +0x745f6570, +0x2e6c6961, +0x65646e69, +0x75252078, +0x4553000a, +0x4f495353, +0x41525f4e, +0x696c2e4d, +0x735f6576, +0x70697274, +0x61745f65, +0x702e6c69, +0x64696369, +0x0a752520, +0x53455300, +0x4e4f4953, +0x4d41525f, +0x76696c2e, +0x74735f65, +0x65706972, +0x6961745f, +0x65722e6c, +0x20207966, +0x000a7525, +0x53534553, +0x5f4e4f49, +0x2e4d4152, +0x5f636e65, +0x74617473, +0x74735f73, +0x6761726f, +0x6c732e65, +0x6d5f746f, +0x206b7361, +0x0a752520, +0x53455300, +0x4e4f4953, +0x4d41525f, +0x6f74732e, +0x6e697070, +0x6f6e5f67, +0x20626f5f, +0x20202020, +0x20202020, +0x000a7525, +0x53534553, +0x5f4e4f49, +0x2e4d4152, +0x5f736964, +0x725f6269, +0x7a697365, +0x20202065, +0x20202020, +0x25202020, +0x6d000a64, +0x725f7861, +0x64697365, +0x5f6c6175, +0x65676170, +0x20202073, +0x20202020, +0x20202020, +0x20202020, +0x000a6425, +0x65676170, +0x756f635f, +0x2020746e, +0x20202020, +0x20202020, +0x20202020, +0x20202020, +0x20202020, +0x0a642520, +0x61702000, +0x695f6567, +0x7865646e, +0x20642520, +0x65207025, +0x7974706d, +0x20642520, +0x695f7277, +0x25207864, +0x64722064, +0x7864695f, +0x20642520, +0x67617020, +0x65725f65, +0x30735f6d, +0x20642520, +0x65676170, +0x6d65725f, +0x2031735f, +0x000a6425, +0x53534553, +0x5f4e4f49, +0x2e4d4152, +0x7074756f, +0x625f7475, +0x65666675, +0x656e5f72, +0x20207478, +0x25202020, +0x53000a75, +0x49535345, +0x525f4e4f, +0x6f2e4d41, +0x75707475, +0x75625f74, +0x72656666, +0x6961745f, +0x2020206c, +0x75252020, +0x4553000a, +0x4f495353, +0x41525f4e, +0x756f2e4d, +0x74757074, +0x6675625f, +0x5f726566, +0x64616568, +0x20202020, +0x0a752520, +0x202d2d00, +0x74697773, +0x6e696863, +0x2d2d2067, +0x4553000a, +0x4f495353, +0x41525f4e, +0x656e2e4d, +0x625f7478, +0x5f746f6f, +0x656b6f74, +0x2020206e, +0x20202020, +0x0a752520, +0x53455300, +0x4e4f4953, +0x4d41525f, +0x626f6a2e, +0x6575715f, +0x742e6575, +0x6e656b6f, +0x20202020, +0x20202020, +0x000a7525, +0x53534553, +0x5f4e4f49, +0x2e4d4152, +0x5f626f6a, +0x69746361, +0x20206576, +0x20202020, +0x20202020, +0x25202020, +0x53000a75, +0x49535345, +0x525f4e4f, +0x6a2e4d41, +0x705f626f, +0x65736168, +0x756f635f, +0x7265746e, +0x20202020, +0x75252020, +0x4553000a, +0x4f495353, +0x41525f4e, +0x6f6a2e4d, +0x74735f62, +0x5f747261, +0x20636970, +0x20202020, +0x20202020, +0x0a752520, +0x53455300, +0x4e4f4953, +0x4d41525f, +0x626f6a2e, +0x646e655f, +0x6369705f, +0x20202020, +0x20202020, +0x20202020, +0x000a7525, +0x53534553, +0x5f4e4f49, +0x2e4d4152, +0x65727473, +0x705f6d61, +0x685f6369, +0x20646165, +0x20202020, +0x25202020, +0x2d000a75, +0x6c73202d, +0x20656369, +0x75657571, +0x2d207365, +0x53000a2d, +0x49535345, +0x525f4e4f, +0x662e4d41, +0x5f6f6669, +0x63696c73, +0x6f6a5f65, +0x20202062, +0x20202020, +0x64252020, +0x746e6520, +0x73656972, +0x4553000a, +0x4f495353, +0x41525f4e, +0x69662e4d, +0x735f6f66, +0x6563696c, +0x6d6f635f, +0x74656c70, +0x20202065, +0x20642520, +0x72746e65, +0x0a736569, +0x656d2000, +0x7274735f, +0x5f657069, +0x20736f70, +0x64253d69, +0x736f7020, +0x0a64253d, +0x76696c00, +0x6f6a5f65, +0x733e2d62, +0x63746977, +0x65725f68, +0x73657571, +0x20202074, +0x20202020, +0x20202020, +0x0a752520, +0x76696c00, +0x6f6a5f65, +0x723e2d62, +0x65757165, +0x64657473, +0x6d756e5f, +0x5f726562, +0x635f666f, +0x7365726f, +0x0a752520, +0x76696c00, +0x6f6a5f65, +0x633e2d62, +0x7365726f, +0x6f6f625f, +0x20646574, +0x20202020, +0x20202020, +0x20202020, +0x0a752520, +0x76696c00, +0x6f6a5f65, +0x703e2d62, +0x5f657069, +0x74697773, +0x20206863, +0x20202020, +0x20202020, +0x20202020, +0x0a752520, +0x52545300, +0x004d4145, +0x43494c53, +0x4d002045, +0x20202045, +0x41525400, +0x0020534e, +0x5054554f, +0x50005455, +0x51455049, +0x41570020, +0x4f005449, +0x52524556, +0x31004e55, +0x41505453, +0x50004547, +0x44494349, +0x544e4900, +0x00465542, +0x4556494c, +0x53524150, +0x4c004445, +0x43455649, +0x00504d4f, +0x49434950, +0x5845444e, +0x4c414e00, +0x504e4900, +0x45004349, +0x554f434e, +0x46554254, +0x45525000, +0x51455356, +0x46455200, +0x4b4e4142, +0x5345525f, +0x4f005445, +0x55505455, +0x4c465f54, +0x00485355, +0x44524c43, +0x45004250, +0x445f434e, +0x505f5045, +0x52004349, +0x535f4e55, +0x45544154, +0x494c5300, +0x465f4543, +0x004f4649, +0x4556494c, +0x494c535f, +0x44004543, +0x45555145, +0x45004555, +0x4555514e, +0x43004555, +0x52004c4f, +0x44495345, +0x004c4155, +0x45544942, +0x4553434e, +0x49420051, +0x434e4554, +0x00465542, +0x4d434e45, +0x464e4942, +0x4143004f, +0x42434142, +0x00535449, +0x50564d48, +0x00444552, +0x4f424552, +0x4445544f, +0x4f525000, +0x43005342, +0x544e554f, +0x50560053, +0x00434239, +0x56455250, +0x4152465f, +0x4500454d, +0x55425458, +0x52454646, +0x50495000, +0x52004445, +0x52464645, +0x00454d41, +0x4556494c, +0x544f4c53, +0x424f4a00, +0x49575300, +0x00484354, +0x49464552, +0x00454c44, +0x45504950, +0x49415244, +0x4f52004e, +0x46554257, +0x424f4a00, +0x544f4c53, +0x574f5200, +0x4e554f43, +0x00524554, +0x00465252, +0x414d4456, +0x00435253, +0x4e415254, +0x524f4653, +0x5252004d, +0x41524646, +0x4100454d, +0x00514552, +0x495f454d, +0x00454c44, +0x414d4456, +0x5254535f, +0x00455049, +0x4f4c4f43, +0x42520043, +0x465f4655, +0x4853554c, +0x444e4500, +0x4152465f, +0x5200454d, +0x54535f43, +0x4d005441, +0x5f494e49, +0x4d415246, +0x55425f45, +0x424d0046, +0x4f464e49, +0x004e495f, +0x4e49424d, +0x4f5f4f46, +0x52005455, +0x44495345, +0x5f4c4155, +0x0054554f, +0x52504f54, +0x4d00574f, +0x52540043, +0x51524946, +0x4d445300, +0x44005741, +0x54535045, +0x45504952, +0x4c424400, +0x4f4c535f, +0x424d0054, +0x51524949, +0x52494300, +0x00465542, +0x5249424d, +0x00444145, +0x56455250, +0x49525453, +0x50004550, +0x4f434349, +0x5400504d, +0x4d004652, +0x464e4942, +0x45485f4f, +0x52454441, +0x4c424400, +0x52444c5f, +0x4d445600, +0x52545341, +0x00455049, +0x414d4456, +0x544f4c53, +0x52545300, +0x5f455049, +0x504d4f43, +0x58495000, +0x4c5f4e49, +0x0044414f, +0x5f574f52, +0x524f5453, +0x4d530045, +0x424d5f56, +0x4f464e49, +0x4c424400, +0x0053425f, +0x5f465254, +0x524f5453, +0x4f435f45, +0x5254004d, +0x54535f46, +0x45504952, +0x504d4f43, +0x52544300, +0x504f004c, +0x50004e45, +0x45535241, +0x504d4f43, +0x534f4500, +0x534f4500, +0x4655425f, +0x4f455200, +0x52454452, +0x41524600, +0x4953454d, +0x5000455a, +0x49535948, +0x00000044, +0x004e5552, +0x00424a50, +0x00545753, +0x00424a43, +0x0005a000, +0x0005a04c, +0x00000000, +0x0005a098, +0x0005a0f4, +0x0005a130, +0x0005a17c, +0x0001b331, +0x0001b338, +0x00000000, +0x0001b33f, +0x0001b345, +0x0001b34c, +0x0001b353, +0x44532020, +0x2020414d, +0x61747320, +0x30737574, +0x20202020, +0x74617473, +0x20317375, +0x207c2020, +0x6c637273, +0x20206e65, +0x6c747364, +0x7c206e65, +0x70747320, +0x7c206e65, +0x70747320, +0x7c206469, +0x76656420, +0x65702023, +0x6e69646e, +0x20000a67, +0x32255b20, +0x20205d64, +0x78383025, +0x25202020, +0x20783830, +0x207c2020, +0x20643625, +0x64362520, +0x25207c20, +0x25206432, +0x7c206432, +0x78322520, +0x78322520, +0x23207c20, +0x25206425, +0x20202c64, +0x20642523, +0x000a6425, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x02020100, +0x03030303, +0x04040404, +0x04040404, +0x05050505, +0x05050505, +0x05050505, +0x05050505, +0x06060606, +0x06060606, +0x06060606, +0x06060606, +0x06060606, +0x06060606, +0x06060606, +0x06060606, +0x07070707, +0x07070707, +0x07070707, +0x07070707, +0x07070707, +0x07070707, +0x07070707, +0x07070707, +0x07070707, +0x07070707, +0x07070707, +0x07070707, +0x07070707, +0x07070707, +0x07070707, +0x07070707, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x63617453, +0x7461206b, +0x0a702520, +0x61747300, +0x25206b63, +0x3d206434, +0x25783020, +0x0a783830, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x80908090, +0x00100010, +0x81918191, +0x01110111, +0x85958595, +0x05150515, +0x85958595, +0x05150515, +0x80908090, +0x00100010, +0x81918191, +0x01110111, +0x85958595, +0x05150515, +0x85958595, +0x05150515, +0x00204060, +0x02224262, +0x0a2a4a6a, +0x0a2a4a6a, +0x00204060, +0x02224262, +0x0a2a4a6a, +0x0a2a4a6a, +0x01000000, +0x01010101, +0x01010101, +0x01010101, +0x01010101, +0x01010101, +0x01010101, +0x01010101, +0x02020201, +0x02020202, +0x02020202, +0x02020202, +0x02020202, +0x02020202, +0x02020202, +0x02020202, +0x00020202, +0x844e0920, +0x844e0924, +0x844e0922, +0x844e0926, +0x844e0921, +0x844e0925, +0x844e0923, +0x844e0927, +0x844e3fe8, +0x844e3fe8, +0x844e3fe8, +0x844e3fe8, +0x844e3fe8, +0x844e3fe8, +0x844e3fe8, +0x844e3fe8, +0x8401ffe0, +0x8400fff0, +0x8400dff8, +0x8400dffc, +0x00000000, +0x00004000, +0x00008000, +0x0000c000, +0x00001000, +0x00005000, +0x00009000, +0x0000d000, +0x00000100, +0x00004100, +0x00008100, +0x0000c100, +0x00001100, +0x00005100, +0x00009100, +0x0000d100, +0x849e0a60, +0x849e0068, +0x849e0a24, +0x849e002c, +0x849e0a42, +0x849e004a, +0x849e0a06, +0x849e000e, +0x849e0a61, +0x849e0069, +0x849e0a25, +0x849e002d, +0x849e0a43, +0x849e004b, +0x849e0a07, +0x849e000f, +0x815fff01, +0x815ff820, +0x815fc143, +0x80efc140, +0x80efc163, +0x80efc162, +0x80efc141, +0x80efc141, +0x824fffe0, +0x824ff960, +0x824ff961, +0x824e5368, +0x824e5369, +0x824e536a, +0x824e536b, +0x82429b78, +0x81bffba0, +0x81bffba1, +0x81b72db0, +0x83c7ffe0, +0x83c6fff0, +0x83c6dff8, +0x83c6dbfc, +0x83c6db7e, +0x83c1ffe0, +0x83c0bff0, +0x83c09ff8, +0x83c09bfc, +0x83c09b7e, +0x83c09b7f, +0x40ab4107, +0x1e0f43d8, +0x23130115, +0x03030524, +0x1e040314, +0x53420707, +0x58410342, +0x192586f4, +0x1d110314, +0xa8010304, +0x05fe0bf2, +0xc8040301, +0x53fe0bf2, +0x01258622, +0x05140314, +0xa8040304, +0x33fe0bf2, +0x0001f505, +0xf5ff0218, +0x02180403, +0x234027ff, +0xfde8000e, +0x0e030435, +0xf5fde800, +0x02181002, +0x1403f5ff, +0x23ff0218, +0xfde7f00e, +0xfe0b0435, +0xd007fc4e, +0x03334327, +0x1d07c107, +0x120004f5, +0xe307ff02, +0x13330d47, +0x100014f1, +0x48dcff02, +0x033427f8, +0x0013f501, +0x87ff0212, +0x0043f540, +0x23ff0212, +0x273c87e6, +0x0034f540, +0x83ff0216, +0x3d070fec, +0x330e2c33, +0x002f8333, +0x333ff000, +0xe2ab10ec, +0x140034f5, +0x3ef5ff02, +0xff021404, +0x8e0ef49b, +0x07f64efc, +0x079107b2, +0x406c27a0, +0x31aef893, +0xff7ea704, +0x451efdef, +0xbc10cb07, +0x01c60741, +0x33d40784, +0x0541c3d6, +0x74de2384, +0x7411fefe, +0x53184c33, +0x42cc1d4c, +0x032c07f6, +0x0723e323, +0x7e19070d, +0x4027ff17, +0x270ef49b, +0x072a0700, +0x7e3c071d, +0xac0bff17, +0x9c0bbc2b, +0x8ebabfd6, +0xff2ea7f6, +0x031efdef, +0x2411f3e8, +0x4ddc3327, +0x0bf6fc6a, +0x07fb4efe, +0x3ec007b1, +0x070c07e5, +0xb31ea72b, +0xfb0efefe, +0x4efed25e, +0x07c007fb, +0x07cf3eb1, +0x273b071c, +0xb32ea700, +0xfb0efefe, +0x27feca5e, +0x0000114f, +0xa0f49b10, +0x01f50533, +0xff021800, +0x180402f5, +0x3027ff02, +0xe8000e23, +0x270335fd, +0x0e03234c, +0xf5fde800, +0x02181004, +0x1402f5ff, +0x23ff0218, +0xfde7f00e, +0xfe0b0335, +0x330f0c83, +0x7e0e2303, +0x0439ffff, +0x019e44c6, +0xfe0b0014, +0x04030333, +0xf3e8031e, +0x100004f1, +0x3327ff02, +0xfc6a4ddc, +0x33fe0bf2, +0xf5432705, +0x02180004, +0x0402f5ff, +0x27ff0218, +0x000e2340, +0x0435fde8, +0xe8000e03, +0x1001f5fd, +0xf5ff0218, +0x02181402, +0xf00e23ff, +0x0435fde7, +0xfe4efe0b, +0x0002a4be, +0x302706f6, +0xffff4ea7, +0x6043bdfe, +0x0af3131e, +0x306af493, +0x8e430504, +0xbefe4efe, +0xf60002fa, +0xa7302706, +0xfeffff4e, +0x1e6043bd, +0x930af313, +0x04304bf4, +0xfe8e4305, +0x1cbefe4e, +0x04cc000b, +0xa730271b, +0xfeffff4e, +0x1e6043bd, +0x130d03c4, +0xf493a9f3, +0x05043028, +0x8e002743, +0xa7fc4efe, +0xffffff4e, +0xc6274d99, +0x1e0027d4, +0x74c0be05, +0xff4ea7fe, +0x4411feff, +0x0e1843f9, +0xc407ff00, +0xce233f4b, +0x2efff1e8, +0x1e0027d3, +0x07300710, +0xdf0ea72d, +0x1c07fff1, +0xfe753cbe, +0x07e6c119, +0xffff3ea7, +0xbd4127ff, +0x9906a434, +0x40270f33, +0x270ef49b, +0xf5338741, +0x02b04034, +0x27123cff, +0x93fc8e00, +0x042fb7fc, +0xffffdea7, +0x8bc001fe, +0x990536f0, +0x47760ad4, +0x04c8f41e, +0x7534be15, +0xff4ea7fe, +0x4499feff, +0x1601270a, +0x1e002745, +0x27012703, +0xff4ea730, +0x439dfeff, +0xa7fc8e0a, +0xfdebef3e, +0x32052027, +0x00004e27, +0x27341504, +0x0ef49b40, +0x32053823, +0x00004f27, +0x34150803, +0xf49b4027, +0x4efe0b0e, +0x390e19fd, +0x333e070d, +0x27012933, +0xf50e0743, +0x02120034, +0x470333ff, +0x0004f13e, +0xdcff0210, +0x2427f848, +0x02f53103, +0xff021200, +0x41073387, +0x120032f5, +0x4a03ff02, +0x30272d87, +0x160023f5, +0x4c83ff02, +0x532e070f, +0x33233316, +0x4c33141c, +0xf541ab10, +0x02140023, +0x0424f5ff, +0x9bff0214, +0xfd8e0ef3, +0xfe93fc4e, +0x99042ef0, +0xed995ce0, +0x2bd0ce5d, +0x8748e2c1, +0x50e4c13d, +0x172031f1, +0x420bff00, +0x180032f1, +0x410bff00, +0x34f5428b, +0xff001720, +0xd4fd4027, +0xff0017e0, +0x3087471e, +0xf148e1c1, +0x00172034, +0x0032f1ff, +0x0bff0018, +0x27428b41, +0x2034f5c0, +0xfdff0017, +0x0017e00c, +0x50e1c1ff, +0x4d871806, +0x172043f1, +0x42f1ff00, +0xff001800, +0x328b310b, +0x172043f5, +0xdcfdff00, +0xff0017e0, +0x2e72f493, +0x27434904, +0x27310320, +0x0f429d00, +0xfc8e434d, +0xf293fe4e, +0x29042e5c, +0x09236924, +0xa7340b21, +0xfd4fff4e, +0x312b4e11, +0xe1a74ea7, +0x08409dfe, +0x434d4e05, +0x22992349, +0x9d436d08, +0x08530942, +0x402705b6, +0x070ef49b, +0x1eff8b00, +0x73400709, +0xe8410342, +0xa74ea7f4, +0x3027fee1, +0x439d4305, +0x93fe8e08, +0x042e0bf1, +0x966c12c1, +0x08149928, +0xdfff3ea7, +0x0c4c33fd, +0x00004ea3, +0x0834d510, +0x0832d502, +0xff4ea702, +0x4411fd4f, +0x0b6c14c5, +0xa7fe4efe, +0xfffaa30e, +0x001194be, +0x0627002c, +0xf393fe8e, +0xc1042dcc, +0x31896034, +0x2844890c, +0xe0072007, +0xe5332333, +0xe22b419b, +0x236834c5, +0xfffa94ee, +0x27643c03, +0x03320146, +0x03e20534, +0x27f4a8e4, +0x6004fd42, +0xa7ff0005, +0xffffff3e, +0x34bd4127, +0x339906a6, +0x9b40270f, +0x41270ef4, +0x34f53387, +0xff02b040, +0x30270027, +0x2d72f493, +0x0e439d04, +0xfa4efe8e, +0x2d66fd93, +0x0edc9904, +0xf660dac1, +0xa700c5cf, +0xfffaf30e, +0x0010c6be, +0x0fc4b007, +0xffffffff, +0xff4ea727, +0x4411feff, +0xffff3ea7, +0x9433d1ff, +0xf5448706, +0x00153043, +0xa73127ff, +0xfdcfff4e, +0x43c50527, +0xa7fa8e64, +0xfd4fff4e, +0xdcc54401, +0x66d49d6c, +0x43334007, +0x2906f393, +0xd0f09304, +0x41f10430, +0xff000520, +0x051c42f1, +0x3ce3ff00, +0x7f0ce37f, +0x3c033419, +0xf930c280, +0x2ceafc93, +0x60c0c104, +0xfe70a6be, +0xb4fd4027, +0xff000510, +0xfaf34ea7, +0x664479ff, +0xf10ea745, +0xf5befffa, +0x4127000f, +0xcdc13027, +0x0ec49d60, +0xd499c32d, +0x104cc018, +0x28d18919, +0xbe34d0c1, +0xabff9de7, +0x89c04d0f, +0x040b4cd4, +0x1e0cc08d, +0x0cc38d06, +0xf393c34d, +0x27042c94, +0x0e349d44, +0x0027a451, +0xaa993425, +0x8d402750, +0x40277834, +0xc5643a9d, +0xfa8e7434, +0xd107fd4e, +0x12c21111, +0x0104193e, +0x0b4533d3, +0x39211b32, +0x0043f501, +0xf5ff0218, +0x02180442, +0x233027ff, +0xfde8004e, +0x4e034335, +0xf5fde800, +0x02181041, +0x1442f5ff, +0x27ff0218, +0xf04e2320, +0x4335fde7, +0x212b031e, +0xeba6de21, +0x1b26d131, +0xe20b0419, +0x211b4533, +0x4ef50139, +0xff021800, +0x180442f5, +0x3027ff02, +0xe8004e23, +0x034335fd, +0xfde8004e, +0x181041f5, +0x42f5ff02, +0xff021814, +0xe7f04e23, +0x8e4335fd, +0x93fd4efd, +0x042be7fd, +0x4960d2c1, +0x0cd489d3, +0x2a3020c1, +0x8e032734, +0x0fd499fd, +0x002744c6, +0x4387fd8e, +0x0001040b, +0x1c270ce6, +0xfa85be40, +0xfdad7eff, +0x0c030d07, +0x401c2720, +0xfffa60be, +0x0760d4c1, +0x3c44c10d, +0xd4951d07, +0x03100c03, +0x2027441c, +0x07ff237e, +0x031d070d, +0x1c03140c, +0x7e202728, +0x4127ff14, +0xd49d0027, +0x51fd8e0f, +0x0f0c8320, +0x0e230333, +0xbeffff7e, +0x2701725e, +0xfd8e0d0c, +0x4f9bfe4e, +0xfb41d848, +0x43270219, +0x33333207, +0x120034f5, +0x31f1ff02, +0xff021000, +0x1c33e247, +0x1d1c5318, +0x002714d6, +0x04391e1e, +0x44872533, +0x180423f1, +0x0299ff02, +0x0040f107, +0x23ff0216, +0x3b030b11, +0x87010b12, +0xf542273e, +0x02120034, +0x4efe8eff, +0x07d007fd, +0x19a63e0d, +0x473527d4, +0x33110314, +0x0043f543, +0x87ff0212, +0xf5432731, +0x02120034, +0x0032f1ff, +0x33ff0210, +0x2c53182c, +0x0726a61d, +0x99443341, +0x44f107d3, +0xff021804, +0x233b2123, +0x3187240b, +0x34f54227, +0xff021200, +0x100034f1, +0x48dcff02, +0xac20cef8, +0xd451d119, +0x422b3107, +0xd4553333, +0x34f13403, +0xff021000, +0x07f848dc, +0x33d23931, +0xf5442733, +0x02120034, +0x873107ff, +0x33402722, +0x0024f533, +0x03ff0216, +0x29432734, +0x0034f5d0, +0x07ff0212, +0x0024f123, +0xdcff0210, +0x4007f848, +0x4a033427, +0x120023f5, +0x4c83ff02, +0x5321070f, +0x33233306, +0x3027140c, +0xab104c33, +0x0023f540, +0xf5ff0214, +0x02140424, +0x0ef39bff, +0xfc4efd8e, +0xcf9bd007, +0xfbc1d848, +0x5317cc33, +0x40271bcc, +0x074af49b, +0xff157e0d, +0xd051c353, +0xc383c413, +0xd0550c2b, +0xfc4efc8e, +0xd33ec007, +0xc49d4027, +0x04c49d05, +0xfc4efc8e, +0x31070e31, +0xe1c2d207, +0x2b00210b, +0x05010be1, +0x91fc8e2e, +0x99412701, +0x3e2b2d12, +0x4123423b, +0xc38bc407, +0x4103325b, +0x310312a1, +0x33874c2b, +0x320bd405, +0x9ebe3001, +0x0c0bfe71, +0xfe4efc8e, +0x63060499, +0xc4e107f0, +0xd012104c, +0xe4230f14, +0x24271f07, +0xfe053027, +0xfe7bf0be, +0xfe8ef043, +0xd007fa4e, +0xd2390019, +0x33333007, +0x34f54427, +0xff021200, +0x22873007, +0x33334027, +0x160024f5, +0x3403ff02, +0xd2294327, +0x34f5f063, +0xff021200, +0x14f11307, +0xff021000, +0x07f848dc, +0x03342742, +0x0013f54a, +0x83ff0212, +0x30070f4c, +0x33332653, +0x27142c33, +0x104c33c0, +0x3cf542ab, +0xff021400, +0x140434f5, +0xfc9bff02, +0x31db510e, +0x624bc2d4, +0x4333d419, +0x100044f1, +0x4c33ff02, +0x1d4c5318, +0x074f44c0, +0x070d072f, +0xff147e1b, +0x2f10f201, +0x01000001, +0x00002f27, +0xd4190100, +0x4533d339, +0x43f5f205, +0xff021800, +0x180442f5, +0x4e23ff02, +0x35fde800, +0x004e034c, +0x40f5fde8, +0xff021810, +0x181442f5, +0x4e23ff02, +0x35fde7f0, +0x0bf4014c, +0xcad331b4, +0xd4417bb3, +0x07764fc6, +0x2bc30bc4, +0x00af27cb, +0x1e010000, +0xfeb47e4d, +0x1f10f101, +0x01000001, +0x1c021a07, +0xd4191c07, +0x4533d339, +0x43f5f105, +0xff021800, +0x180441f5, +0x2027ff02, +0xe8004e23, +0x034235fd, +0xfde8004e, +0x181040f5, +0x41f5ff02, +0xff021814, +0x4e23f301, +0x35fde7f0, +0x2bb30b42, +0x070d07c3, +0xa62f071b, +0x33d419c6, +0x0044f143, +0x33ff0210, +0x4c53184c, +0x9a44c41d, +0xdb55f043, +0xfc4efa8e, +0xc107d007, +0x22fce37e, +0x8e00270c, +0x7e0d07fc, +0xd151fd2b, +0x1c0bd431, +0x1027412a, +0x142b031e, +0x14cad441, +0x0715460b, +0x77d1be0d, +0x07044cfe, +0xfe767e0d, +0xfc8e0027, +0x2f6bfc4e, +0x7dbed007, +0xc007fe78, +0xd4990636, +0x27459604, +0x04d49d41, +0x557e0d07, +0x8e0c07fe, +0x49fd4efc, +0x6b42070d, +0xe3dad63f, +0x27043543, +0x06039d46, +0x4927041d, +0x043d3127, +0x27060299, +0x25040a4d, +0x9d0d5501, +0x042d0403, +0x0d450d95, +0x2405039d, +0x4427102c, +0xfd0e0455, +0x8efe135e, +0x99fa4efd, +0xb1070404, +0xbf6bd007, +0x677e4b46, +0x91d451fd, +0x75a027dc, +0x964127c4, +0x654027b4, +0x06b407ca, +0x07d15147, +0xfdc47e0d, +0x278af493, +0xc1d35104, +0x320b7442, +0x277443c5, +0x56cb9d40, +0x9d05da9d, +0xfa8e04d4, +0x27eef393, +0xd1349904, +0x442746e6, +0x99b8f49b, +0x44477a34, +0x2748f49b, +0x0000114f, +0x990f1e11, +0x44477a34, +0x2748f49b, +0x0000114f, +0xa0f49b14, +0x40004e27, +0xa3f49b01, +0xebe72ea7, +0x054027fd, +0x003f2724, +0x15088300, +0x0ef49b23, +0x24052803, +0x00003f27, +0x23150903, +0x030ef49b, +0x27240528, +0x8300003f, +0x9b231509, +0x2ea70ef4, +0x05fdebc7, +0x003f2724, +0x150a0300, +0x0ef49b23, +0x2772f493, +0xd3439904, +0x337d4499, +0x4c33103c, +0xa343ab15, +0x0003024f, +0xff3ea70c, +0x34d5fbff, +0x42270404, +0x043034d5, +0xfe0bfe0b, +0xb007fb4e, +0x89ff537e, +0xd40754b4, +0x4433d633, +0xd986d42b, +0xdc2afc93, +0x16c00103, +0x270d4706, +0x27c0001d, +0x6902be20, +0x210c1eff, +0x0f4dcec4, +0x1ebe1d47, +0xc005ff68, +0xcd250d0b, +0xb499c015, +0x894c66d1, +0x202754b4, +0x4c104203, +0x932127ab, +0x0429d3f3, +0x072a4c27, +0x74b2bd13, +0x20348d02, +0xd307e027, +0xd4890427, +0x074e9b20, +0x33248734, +0x23322b34, +0xf9e8003e, +0x144d1305, +0x1803e103, +0x071ef018, +0xb4bd4027, +0x40270274, +0xd57fb399, +0xd5026cb4, +0xc00270b4, +0x8719ff3c, +0x0b343343, +0xd444f143, +0x01ff0003, +0x70b4d543, +0xd5430b02, +0x99026cb4, +0x0027d1b4, +0x01274486, +0xfe899bbe, +0x2707f413, +0x8eb40500, +0x99fd4efb, +0xd0074404, +0x27104c44, +0x7cf49300, +0x1c1efe79, +0x58840489, +0x0027104c, +0x7a6cf493, +0x990d1efe, +0x45a6c404, +0xf4930027, +0x05fe7989, +0x99fd8ed4, +0x1d074902, +0x1c030403, +0xfdaabe2c, +0x2706f6ff, +0xd1d39940, +0x0277d4bd, +0xf41334e6, +0x13041e48, +0xd40505f4, +0xfc4efd8e, +0x95bec007, +0xd0070003, +0x1e1403c0, +0x22f39b2c, +0xf49b4027, +0x8b00070e, +0x22f49bff, +0x3d27051e, +0x4f9b0220, +0xe641d848, +0x04030c07, +0xbebe1127, +0xf453fffd, +0xc405fea8, +0xfc8e0d07, +0xc007fc4e, +0x00007fbe, +0x03c0d007, +0x9b2d1e14, +0x402722f3, +0x070ef49b, +0x9bff8b00, +0x041e22f4, +0x9b403c27, +0x4dd8b84f, +0x07e54000, +0x2704030c, +0xfd7fbe11, +0x69f453ff, +0x07c405fe, +0x4efc8e0d, +0x9b4427fc, +0xfd9321f4, +0xa70425a0, +0xfeffffce, +0x0d07d401, +0xc499f48b, +0xa644960a, +0x9b402702, +0xfc8e21f4, +0x2473209b, +0x212c210b, +0x071e2127, +0x277f2c08, +0x42477e2c, +0x077f4c23, +0x1f0c7304, +0xfe0b04cb, +0xf493f64e, +0x070424e0, +0x894849d0, +0x0cc1540b, +0xf8e7be60, +0xf67007ff, +0x0702bb0f, +0x2e489b4b, +0x5e31274c, +0xd4b90209, +0xd6c10277, +0xe24ff658, +0x7dd49901, +0x36d5d399, +0x41fb9345, +0x0b1effa4, +0xba33b307, +0x6120bf03, +0x0ea70001, +0x27f9e7ff, +0x002d2710, +0xd7d99908, +0xff59d8be, +0x0274d4b9, +0x00ce4fe6, +0x27def293, +0x93102704, +0x0427d3f0, +0x04893427, +0x0d419b20, +0x20048924, +0x42031103, +0x2803242d, +0x4027f358, +0xefff2ea7, +0x22049dfd, +0xf3e8031e, +0x273c24c1, +0x184c3333, +0xc01d4c53, +0x3ea7f144, +0x27fdebc7, +0x27320520, +0x0300004f, +0x9b34150a, +0x3ea70ef2, +0x27fde71f, +0x27340544, +0x9318180d, +0x04249bf4, +0x30154101, +0xe70f4ea7, +0x053235fd, +0xa7401541, +0xfdefff1e, +0x351a3c27, +0x07051e42, +0xc1f4e843, +0x4cdc3c14, +0x3ea7f6e0, +0xc1fdefff, +0x48dc3c34, +0xd54427fb, +0x27023834, +0x1034d540, +0xd5432706, +0xa7023c34, +0xfdefff3e, +0xdc3c34c1, +0x4427fb48, +0x023c34d5, +0xebc72ea7, +0x054027fd, +0x003f2724, +0x150a0300, +0x0ef49b23, +0xf4933027, +0x9d0426b0, +0x4d274743, +0xf49b0100, +0xffaea7a0, +0xb179f97f, +0x1f4bb059, +0x0f4b2907, +0x99fe8f7e, +0xc00705b1, +0x4b04b099, +0x4b29071f, +0xfe7e7e0f, +0x4007b139, +0x4c33b019, +0x071f4b10, +0x4bc83329, +0x7ec4ab0f, +0xb199fe68, +0x99c0ab07, +0x1f4b06b0, +0x29070f4b, +0x33fe577e, +0xc0ab180c, +0xa403ac05, +0xafc4b803, +0xff068200, +0x9b4027aa, +0x4d270ef4, +0xf49b0500, +0x9b4427a0, +0x4d27b8f4, +0xf49b01fe, +0x270d07bb, +0x0302001d, +0xfad4be04, +0xaf0ff6ff, +0xbe0d0700, +0x27fe7e7a, +0x1e02403d, +0x22f39b10, +0xf49b4027, +0x8b00070e, +0x22f49bff, +0xd8484f9b, +0x4f9bec41, +0x174c3348, +0x131b4c53, +0xc6478348, +0x07240747, +0x7f1c2734, +0x081e2103, +0x03fa4da3, +0x23bcf49b, +0x5b410731, +0x70418343, +0xd7d299f2, +0x273f6399, +0x0b439b46, +0xc5f49324, +0x429d0425, +0xbd412745, +0x270277d4, +0x7dd49930, +0xc454d189, +0xd2d11442, +0x2986026c, +0x420b4887, +0x28d64201, +0x8d5e7727, +0x0745d600, +0x070d0723, +0x070abe38, +0xc41a1e00, +0x23070d41, +0x38070d07, +0x0046fbbe, +0x20270b1e, +0x48070d07, +0x0086efbe, +0x70070428, +0xf3935f1e, +0x0704226c, +0x0c338948, +0xd0274103, +0xd127430e, +0x4da34d07, +0xf49b03fc, +0x1ed6b6bc, +0x22f39b38, +0xf49b4027, +0x8b00070e, +0x22f49bff, +0x3d27051e, +0x4f9b0240, +0xe641d848, +0x33484f9b, +0x4c53174c, +0x8348131b, +0x0345e647, +0xfa3d2741, +0x9b041e03, +0xf4d0bcf3, +0xfff323be, +0x7327d486, +0xf68e0707, +0xf493f94e, +0x07042208, +0x894949d0, +0x0cc1540b, +0xf60fbe60, +0xc4a007ff, +0xf4931803, +0x61042570, +0x9b44a644, +0xf49341f4, +0x010424e0, +0x1ef48b44, +0x7b0fd67e, +0x499b4b07, +0x31274c2e, +0xd4b94a1e, +0xdcc10277, +0x0746d658, +0x2704030d, +0xbe02001d, +0x76fff96a, +0xbe0d070e, +0x93fe7d12, +0x04252ff3, +0x4c272027, +0x03320512, +0x99f4c834, +0xc399d7d2, +0x9b46273f, +0x93240b43, +0x042513f4, +0x273c429d, +0x77d4bd41, +0xd1302702, +0xc6026cd2, +0x0b498725, +0xd6420142, +0x1ea72724, +0x54d18916, +0x49070d07, +0x00c65bbe, +0xa0070428, +0x6dbe051e, +0x0a07fff2, +0xf04ef98e, +0xdf3bcf5b, +0xfc4efe2b, +0x12be0f07, +0xfc0efe64, +0xff0bf00e, +0x0d99fb4e, +0x99c00704, +0xd496050b, +0x0ea7fb8e, +0xbeffffdf, +0xd0ff63bf, +0xc0010fd2, +0x1b072d07, +0x21230403, +0xfeceb8be, +0x1c27c001, +0xbe21270c, +0xa7fecead, +0xffffdf0e, +0xff6377be, +0xc4154027, +0xfb8ec405, +0x2ea7f54e, +0xb9ffffff, +0xa30e2c21, +0x2f25b9f2, +0xeef1650e, +0x0702ef15, +0x0f4c8345, +0x3487c407, +0xc32bc433, +0xc333c42b, +0xf1d0ce23, +0x56c499ff, +0x02d24fe6, +0xc871c741, +0xc699c961, +0x107c1855, +0x00007ea3, +0x51c48110, +0x254ff6c3, +0x24cd9903, +0xca210c07, +0xa0becb31, +0x0fe6ff07, +0xc3510356, +0xcb35ca25, +0xe324cd9d, +0x02d30733, +0x07d80738, +0x070c0719, +0xbead072d, +0x0bfe9ff3, +0x07c961a9, +0x0b49073d, +0xbf43e248, +0x2b430702, +0x2bd80749, +0x033d07d4, +0x0703ff3d, +0xe33a5327, +0x1004112e, +0xc2453fab, +0xc38dc475, +0xff3ea726, +0x3499ffff, +0x86b12726, +0xf6b02784, +0x9d02514f, +0x1d2754c4, +0x3c270bba, +0x2df10d28, +0x25c69df3, +0x1c07f001, +0xff07a9be, +0x0264dff6, +0x0c030c07, +0xfede7e28, +0xe654c499, +0xf802084f, +0x0203107c, +0x01ffbff6, +0xcb31c451, +0xca2143e3, +0xc1144c23, +0xf4554cc2, +0xfb45fa35, +0x9948c1c1, +0xc3c124cb, +0xc1620750, +0x610b3ccd, +0x630bfb25, +0x0305dfe6, +0x8330c4c1, +0xb4870f4c, +0xb40b4433, +0x2336c489, +0xffe7a4be, +0x8910b48d, +0xba8d38ca, +0x9b6fe612, +0xe3870701, +0x1000008e, +0x10007dfc, +0x3123018e, +0x11232123, +0xf285f375, +0x7027f195, +0x9cbe0c07, +0x0fe6ff06, +0x2607016e, +0x272bf351, +0x2302c181, +0xaea72307, +0xd1fdefff, +0x33010ca4, +0x4c53184c, +0xcc44131d, +0x33271941, +0x3ea7f3e8, +0xd1fdefff, +0x33010c34, +0x4c53184c, +0xc844131d, +0x4ea7e941, +0x05fde3df, +0x2742154d, +0xdfaea740, +0xa435fde3, +0xe3cf3ea7, +0x141c03fd, +0x32153105, +0xe3cfaea7, +0xc12123fd, +0xa4353cc3, +0xad0ba207, +0x3fe62103, +0xf4910185, +0x4dea430b, +0xd3ea017d, +0x4aea01c6, +0x42070233, +0x41272486, +0xc4c19407, +0xf6e20740, +0x27016f4f, +0x44c3c100, +0xf47136a6, +0x4dca430b, +0x7fd3ea0d, +0xfa4aea01, +0x1e120701, +0xa3102703, +0x0100008e, +0xc845720b, +0x48076742, +0x04114de3, +0x4127c445, +0x40270496, +0x31274447, +0x30271496, +0x338749ab, +0xb12543ab, +0xbe05b435, +0x1ea7b015, +0xd1fdefff, +0x81010c14, +0x184c33c1, +0x131d4c53, +0x1941cc44, +0xf3e83327, +0xefff3ea7, +0x0c34d1fd, +0x184c3301, +0x131d4c53, +0xe941c844, +0xe3df4ea7, +0x274b05fd, +0x4a1514ac, +0x43353027, +0xe3cf4ea7, +0x154105fd, +0xffaea74a, +0x4335fdef, +0x010ca4d1, +0xfc6a4dd8, +0xe8432713, +0xff1ea7f4, +0x13d1fdef, +0x3ddc010c, +0x21effc6a, +0x9d4027f3, +0xc46524c3, +0xf331f441, +0xd20bc435, +0x0bba4d27, +0x27142c03, +0xc27528ac, +0xf44dc325, +0xf011fa6d, +0xafbe1c07, +0x6702ff05, +0x10008df8, +0x4027fe84, +0x9954c49d, +0xbea734c3, +0x21ffe7af, +0x3b4127b2, +0x2542ab43, +0x034507b4, +0x6b540741, +0xff1ea75f, +0x15bdffff, +0xf3610e2f, +0xfd1553ee, +0xf2830027, +0xc499f58e, +0xaf4fe654, +0x834707fd, +0xe410104d, +0xfda4104c, +0xfda0bff6, +0x0097dfe6, +0x0bba4d27, +0x0d28bc27, +0x9dfb2df4, +0xf00125c6, +0x43be1c07, +0x4027ff05, +0xcd75c485, +0xc745ca65, +0xd027b91e, +0xc8753027, +0x575ec745, +0x27e027fd, +0x40c4c190, +0xfe954fe6, +0x340bf381, +0xfe8d3dea, +0xea28d4ca, +0x07009d3a, +0xfe835e02, +0x932a33e3, +0xf25e932b, +0x5ea027fc, +0x4acafd05, +0x86a3ea59, +0x2b1127fe, +0x5e1a0b13, +0x3acafe7f, +0x5ca4ea64, +0x2b0127fe, +0x5e0a0b04, +0x4acafe55, +0xaea3ca42, +0xe32be127, +0x4e07ea0b, +0x9407ec36, +0x0c27a41e, +0x8ef2830e, +0xba4d27f5, +0x27f40d0b, +0x470728ac, +0x4ce3fa2d, +0x9dc44511, +0xf00125c6, +0xa7be1c07, +0x015eff04, +0x2b1407fd, +0x5e110313, +0xe407fe2b, +0xe103e32b, +0xefc64e07, +0x074127c2, +0xff635e94, +0x042b0307, +0xf65e0103, +0x031407fd, +0x5e1d2b11, +0x0307fe07, +0x0d2b0103, +0x07fde45e, +0x2be103e4, +0xd64e07ed, +0x9407d4ef, +0xc1ff385e, +0xdff640cd, +0xcdc1fcf8, +0xfcf25e44, +0xc007fc4e, +0xff8ea5be, +0xc419c339, +0x43ab1307, +0x4027c41d, +0x05e6c43d, +0xf49b4027, +0xff3ea70e, +0x34c5fd4f, +0x9b402738, +0x4ea70ef4, +0x99ffffff, +0x2ea70e43, +0x8bfd4fbf, +0x27313831, +0x53240541, +0xd6240331, +0x4efc8e32, +0xbed007fd, +0x99ff8e88, +0x44b60cd4, +0x070ed499, +0x07012304, +0x993d0b30, +0x42c40434, +0x9d41270b, +0xd09d0434, +0xa7141e0c, +0xfd4fff4e, +0x4301d239, +0x433b4127, +0xd43d42ab, +0x402700a7, +0xa70ef49b, +0xfd4fff3e, +0x8e3834c5, +0x07fd4efd, +0x8e3ebed0, +0x0dd499ff, +0xd49944b6, +0x2304070e, +0x0b300701, +0x0434993d, +0x41274596, +0x9d04349d, +0x181e0dd0, +0x22032d07, +0x4fff4ea7, +0x012139fd, +0x3b412743, +0x3d41ab43, +0x2700a724, +0x0ef49b40, +0x4fff3ea7, +0x3834c5fd, +0x0000fd8e, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0xf2a3f54e, +0xd207f085, +0x1fabf281, +0x33542289, +0x6b040319, +0x45c307df, +0xf31cbef2, +0xe6e007ff, +0x5e042704, +0x31271410, +0x3027d496, +0x4027f375, +0x07b6f49b, +0x8721832c, +0xf1fd8142, +0x05a30043, +0xbdf09300, +0x4ea703d0, +0x21fde79f, +0x74ddb901, +0x15430502, +0xa7fd6541, +0xfde78f3e, +0x4c274e35, +0x15340516, +0x213e3531, +0x7f3ea701, +0x4103fde7, +0x340521c3, +0x22f12287, +0x0005a300, +0x4ea73115, +0x35fde76f, +0x1542053e, +0x714e3541, +0x27e546fe, +0x150f220d, +0x27071ef0, +0x1501221d, +0x41fd11f1, +0x00dde3f2, +0xe1f49303, +0x4499041d, +0x00dda345, +0xe3212410, +0xa30800dd, +0x072000dd, +0x19cc33c4, +0xffffaea7, +0x00be27fb, +0x101e4000, +0x2722fb9b, +0x55be0f0c, +0x4027ffec, +0xd122f49b, +0xd80420a4, +0xdcabeb41, +0x0424add5, +0xf49b4027, +0x93fd110e, +0x041debf3, +0x0800dde3, +0x34053415, +0xdda39027, +0xfe812000, +0xf935fd95, +0xee99f925, +0x79f293d2, +0x7ea7041d, +0x9df9e7f3, +0x085e122e, +0xe6f06111, +0x9301a80f, +0x041dbff2, +0x07222399, +0x833103d9, +0x33430733, +0xe844e943, +0xab0005f0, +0x0cd4cedf, +0x1622239d, +0x2744c635, +0x27031ea1, +0x95f493a0, +0x4299041d, +0x07f14122, +0xe9433342, +0x05f0e843, +0x03112300, +0xab430732, +0x3232234f, +0xab410741, +0x6ad4ce4f, +0x07673fc6, +0x83112312, +0x33210713, +0xe42f0323, +0x490005f0, +0x79f49323, +0xe307041a, +0x3387e433, +0x4c012001, +0x2ea7e32b, +0x1efdefff, +0xc1f3e803, +0x33273824, +0x53184c33, +0x44c01d4c, +0xe91333f1, +0x05f0ea14, +0x1f2ea700, +0x1407fde7, +0x44871433, +0x2005142b, +0x00272115, +0x20353c07, +0xe70f4ea7, +0x053e0bfd, +0x35411543, +0x05f19340, +0x1299041d, +0x33420722, +0x49410b43, +0xee406943, +0x41009ad3, +0x0b3d07f4, +0xf2420330, +0x41008e43, +0x201489f3, +0x302b3403, +0x42031307, +0x34071d2b, +0x3fab4107, +0x43024fab, +0xe2071307, +0xe383e103, +0x3e070223, +0xd00b3333, +0x19daf493, +0x07c10704, +0xf142010d, +0x05f0e43b, +0xabcfab00, +0xff1ea70f, +0x031efdef, +0x1401f3e8, +0x4c333327, +0x1d4c5318, +0x07f244c0, +0x33308740, +0x0b432b44, +0xa72c0742, +0xfde7ff3e, +0x24331c87, +0x3405212b, +0x10273215, +0x3ea73135, +0x05fde7ef, +0x0732153b, +0x0343334e, +0x05f0e44f, +0x6d313500, +0xc6404d4c, +0x234707ab, +0x41010c4c, +0xe7ff3ea7, +0x113105f9, +0x21321542, +0x01342544, +0xf34ea773, +0x4305f9e7, +0x4d157d11, +0x47257721, +0x121e7407, +0x2722f39b, +0x0ef49b40, +0xff8b0007, +0x1e22f49b, +0x003d2705, +0xb74f9b80, +0x9be640c8, +0xe907b71f, +0xfe05e103, +0xf241f001, +0xef83e107, +0x07ffffff, +0x40072042, +0xf49b4383, +0x074107b6, +0x83210731, +0x8301e04d, +0x831e003d, +0x01e0002e, +0x4496d127, +0x4d07d027, +0x34960127, +0x30070027, +0x2496d127, +0xf031d027, +0x0fab2d07, +0x4447f055, +0x23333387, +0x1c180027, +0xab01271e, +0xab43ab40, +0x001e5842, +0x1f3c0600, +0x07f80000, +0x1e104ca3, +0x00ef180a, +0xa307f800, +0x3ea7204c, +0xc1fbffff, +0x04076c3c, +0xf4930f6b, +0x9d041b2c, +0xec474440, +0x281fe0c8, +0x1e1027c0, +0x6c34c136, +0x14073027, +0x1c531a33, +0x004f181a, +0x27080000, +0x1e430731, +0x331c0712, +0x1a1c531a, +0xcf184027, +0x08000000, +0x4f6b4127, +0x4ea74546, +0xc1fbffff, +0xde076c44, +0x201ddc53, +0x1e4027d4, +0x334c0715, +0x4c53104c, +0x0030271e, +0x07312741, +0x6b41c343, +0xc5f2934f, +0x2399041a, +0x9b13ee45, +0x760db600, +0xf6f4514d, +0x2700884f, +0xf081104c, +0x9944249d, +0x2327d404, +0x2c03249b, +0x07311b1a, +0x133f4b42, +0x47435240, +0x1e340b42, +0x47323a07, +0x07342b42, +0x474f4b43, +0x23412824, +0x13031e21, +0x6b320720, +0x75f4933f, +0x0127041a, +0xf2813c1e, +0x2499311b, +0x9b2327d4, +0x1a2c0324, +0x3f4b4207, +0x43524013, +0x340b4247, +0x323a071e, +0x342b4247, +0x4f4b4307, +0x41282447, +0x031e2123, +0x32072013, +0xf4933f6b, +0x27041a38, +0x45419d00, +0x1e11439d, +0x27402711, +0x11249d00, +0x4027081e, +0x2711249d, +0x54d6e400, +0x331c0707, +0xb007101c, +0x071c1c53, +0xf608330c, +0x9305791f, +0x041a03fe, +0x2744e399, +0x53430723, +0x104c8341, +0xe49d43ab, +0x414c2744, +0x2713e49d, +0x0303034f, +0x49e29d03, +0xc54ce4c5, +0xe29d50e1, +0x34e1c546, +0xc538e1c5, +0xf3933ce1, +0x35041a00, +0x27002c31, +0x01285e41, +0x4c334c07, +0x1e4c5316, +0xe39d3027, +0x50e49d4c, +0x0100cdf8, +0x4ea70082, +0xc1fbffff, +0x73996c40, +0x05729904, +0x0754e499, +0x55e199d0, +0xb9603f03, +0xdc730001, +0x8b340b10, +0x602f030f, +0x070001b9, +0x83210b4d, +0x190fff4d, +0x33300731, +0x22190e4c, +0x3fff3d83, +0x1c3343ab, +0x3341ab1a, +0x42ab1c2c, +0x0f8be455, +0x0013000c, +0x0c300fab, +0x210c2721, +0x0f6b031e, +0x197ef493, +0x07401d04, +0x0c0f8b0d, +0xab001300, +0x210c300f, +0x1e210c27, +0x930f6b03, +0x041963fd, +0xcdf8d03d, +0x008a0200, +0xffff4ea7, +0x6c40c1fb, +0x1972fe93, +0x08739904, +0xe139e419, +0x07097299, +0x603f03e0, +0x730001b9, +0x340b10ec, +0x2f030f8b, +0x0001b960, +0x210b4e07, +0x0fff4d83, +0x30073119, +0x190e4c33, +0xff3d8322, +0x1a1c333f, +0x41ab43ab, +0xab1c2c33, +0xe9f19342, +0x14150418, +0x000c0f8b, +0x0fab0013, +0x27210c30, +0x031e210c, +0xf2930f6b, +0x5d0418f0, +0x8b0e0720, +0x13000c0f, +0x300fab00, +0x0c27210c, +0x6b031e21, +0xd7f3930f, +0x303d0418, +0x2ea74027, +0xc1fbffff, +0xeefc6c2e, +0x37800000, +0x334e0701, +0x4c53164c, +0x81f3931e, +0x349d0418, +0x9d402751, +0xedf84d34, +0x00860100, +0x936c20c1, +0x04189ffd, +0x19067499, +0x077399d2, +0x4f03d139, +0x0001b960, +0x420bd007, +0xb9603f03, +0xdc730001, +0x8b310b10, +0x0741190f, +0x8332194d, +0x070fff4d, +0x0e4c3330, +0x3fff3d83, +0xab1a1c33, +0x3341ab43, +0x42ab1c2c, +0x183af193, +0x8b142504, +0x13000c0f, +0x300fab00, +0x0c27210c, +0x6b031e21, +0x41f2930f, +0x209d0418, +0x8b0d0704, +0x13000c0f, +0x300fab00, +0x0c27210c, +0x6b031e21, +0x29f4930f, +0x403d0418, +0x0200edf8, +0x4ea70090, +0xc1fbffff, +0x73996c40, +0x0ffe930a, +0xfd930418, +0x39041808, +0x99d459e1, +0xe0070b72, +0xb9603f03, +0xec730001, +0x8b340b10, +0x602f030f, +0x070001b9, +0x83210b4e, +0x190fff4d, +0x33300731, +0x22190e4c, +0x3fff3d83, +0xab1a1c33, +0x3341ab43, +0x42ab1c2c, +0x17a6f193, +0x8b143504, +0x13000c0f, +0x300fab00, +0x0c27210c, +0x6b031e21, +0xadf2930f, +0x209d0417, +0x8b0e0706, +0x13000c0f, +0x300fab00, +0x0c27210c, +0x6b031e21, +0x97f3930f, +0x303d0417, +0x2ea74027, +0xc1fbffff, +0xeefc6c2e, +0x3a800000, +0x333e0701, +0xf193163c, +0x53041740, +0x40271e3c, +0x9d4e149d, +0xedf85213, +0x00860100, +0x175efd93, +0x6c20c104, +0x1299d419, +0x99d33956, +0xd0075711, +0xb9604f03, +0x420b0001, +0xb9603f03, +0xdc730001, +0x8b310b10, +0x0741190f, +0x8332194d, +0x070fff4d, +0x0e4c3330, +0x3fff3d83, +0xab1a1c33, +0x3341ab43, +0x42ab1c2c, +0x16f6f193, +0x8b144504, +0x13000c0f, +0x300fab00, +0x0c27210c, +0x6b031e21, +0xfdf2930f, +0x209d0416, +0x8b0d0708, +0x13000c0f, +0x300fab00, +0x0c27210c, +0x6b031e21, +0xe9f4930f, +0x403d0416, +0x0200edf8, +0x4ea70093, +0xc1fbffff, +0xf3936c40, +0x930416cc, +0x0416c9fd, +0xf1933259, +0x390416e6, +0x071419d3, +0x031139e0, +0x01b9602f, +0x603f0300, +0x730001b9, +0x240b10ec, +0x0f8b310b, +0x21194e07, +0x0fff4d83, +0x30073219, +0x830e4c33, +0x333fff3d, +0x43ab1a1c, +0x2c3341ab, +0x9342ab1c, +0x04165ff1, +0x0f8b1455, +0x0013000c, +0x0c300fab, +0x210c2721, +0x0f6b031e, +0x1666f293, +0x0a209d04, +0x0f8b0e07, +0x0013000c, +0x0c300fab, +0x210c2721, +0x0f6b031e, +0x1654f393, +0x27303d04, +0xff2ea740, +0x2ec1fbff, +0x00eefc6c, +0x013f8000, +0x3c333e07, +0xf9f19316, +0x3c530415, +0x9d40271e, +0x139d4f14, +0x00edf853, +0x93008801, +0x041617fd, +0x996c20c1, +0xd29904d4, +0x39139908, +0x1199d007, +0x604f033d, +0x0b0001b9, +0x603f0342, +0x730001b9, +0x310b10dc, +0x41190f8b, +0x32194d07, +0x0fff4d83, +0x4c333007, +0xff3d830e, +0x1a1c333f, +0x41ab43ab, +0xab1c2c33, +0xadf19342, +0x14650415, +0x000c0f8b, +0x0fab0013, +0x27210c30, +0x031e210c, +0xf2930f6b, +0x9d0415b4, +0x0d070c20, +0x000c0f8b, +0x0fab0013, +0x27210c30, +0x031e210c, +0xf4930f6b, +0x3d0415a4, +0x00edf840, +0xa703a402, +0xfbffff4e, +0x936c40c1, +0x041583f3, +0x1584fd93, +0x0a349904, +0x93063299, +0x04157dfe, +0xe139d339, +0x2f03e007, +0x0001b960, +0xb9603f03, +0xec730001, +0x0b240b10, +0x070f8b31, +0x8321194e, +0x190fff4d, +0x33300732, +0x3d830e4c, +0x1c333fff, +0xab43ab1a, +0x1c2c3341, +0xf19342ab, +0x75041514, +0x0c0f8b14, +0xab001300, +0x210c300f, +0x1e210c27, +0x930f6b03, +0x04151bf2, +0x070e209d, +0x0c0f8b0e, +0xab001300, +0x210c300f, +0x1e210c27, +0x930f6b03, +0x04150df3, +0x0e5e303d, +0x0a4fe603, +0x00ce1803, +0xb7464000, +0x14b6f393, +0x9d432704, +0x44274634, +0x2749349d, +0x349d404c, +0x01b55e13, +0x149ef493, +0x9d302704, +0x34271343, +0x5e46439d, +0x00e801a3, +0xcefc015c, +0x55400000, +0x81fe9301, +0xe3990414, +0x07202744, +0x83415343, +0x43ab104c, +0x2744e49d, +0x46e49d43, +0x9d414c27, +0x402713e4, +0xc54ce29d, +0xe29d34e4, +0x00cdf849, +0xa7008201, +0xfbffff4e, +0x996c40c1, +0x72990473, +0x54e49905, +0xe199d007, +0x603f0355, +0x730001b9, +0x340b10dc, +0x2f030f8b, +0x0001b960, +0x210b4d07, +0x0fff4d83, +0x30073119, +0x190e4c33, +0xff3d8322, +0x3343ab3f, +0x41ab1a1c, +0xab1c2c33, +0x8be45542, +0x13000c0f, +0x300fab00, +0x0c27210c, +0x6b031e21, +0x25fe930f, +0xe01d0414, +0x0f8b0d07, +0x0013000c, +0x0c300fab, +0x210c2721, +0x0f6b031e, +0x140af193, +0xf8103d04, +0x8a0200cd, +0xff4ea700, +0x40c1fbff, +0x0873996c, +0x1416fd93, +0x99d41904, +0xe0070972, +0x3f03d139, +0x0001b960, +0x0b10ec73, +0x030f8b34, +0x01b9602f, +0x0b4e0700, +0xff4d8321, +0x0731190f, +0x0e4c3330, +0x3d832219, +0x1c333fff, +0xab43ab1a, +0x1c2c3341, +0xf19342ab, +0x15041390, +0x0c0f8b14, +0xab001300, +0x210c300f, +0x1e210c27, +0x930f6b03, +0x041397f2, +0x0e07205d, +0x000c0f8b, +0x0fab0013, +0x27210c30, +0x031e210c, +0xf3930f6b, +0x3d04137e, +0x334c0730, +0x4c53164c, +0x39f3931e, +0x349d0413, +0x017b5e50, +0x0000ced8, +0xfd932640, +0x86041328, +0x404c27b6, +0x2713d49d, +0x46d49d43, +0xd49d4427, +0x27251e49, +0x13d49d40, +0xd49d4427, +0xcc191e46, +0xf3931600, +0x27041300, +0x349d404c, +0x9d432713, +0x44274634, +0x2749349d, +0x3df49330, +0x43050413, +0x40274315, +0x0704749d, +0x7d440347, +0x5d433d43, +0x08739d43, +0x437d4403, +0x435d433d, +0x0701105e, +0xc1fd933c, +0x3c830412, +0x57e0c83f, +0x0710d39d, +0xa710272d, +0xfbffffee, +0x34270d07, +0x0c0514d6, +0xe4c1061e, +0x0124056c, +0x53110324, +0x03240546, +0x93f34024, +0x04128ff2, +0x07442399, +0x83415343, +0x43ab104c, +0x2744249d, +0x46249d40, +0x27102399, +0x249d404c, +0xb63fe613, +0x444c2700, +0x5e13249d, +0x4c0700ad, +0x07104c33, +0x10d39d0c, +0x331e4c53, +0xde99140c, +0x4841c444, +0x4e072007, +0x531a2c53, +0x87210344, +0xd8240b44, +0x070c0fec, +0x0f4ca34e, +0x0344d49d, +0xd3990c2c, +0x07212344, +0x83415343, +0x43ab104c, +0x2744d49d, +0x46d49d41, +0x2710d399, +0xd29d414c, +0x13d49d48, +0x4c273ea6, +0xa74c1e45, +0xfbffff4e, +0xc16c42c1, +0x41c16c43, +0x334e076c, +0x83415336, +0x03f0003e, +0x0fc02d83, +0xab104c83, +0x534eab23, +0x1c331a0c, +0x8320ab0c, +0xfc00001e, +0x2744d49d, +0x9d21ab42, +0xd39946d4, +0x504c2710, +0xd49dd205, +0x27350613, +0xd49d544c, +0x41fe0113, +0x400ec2f0, +0x41034e07, +0xfd11042e, +0xfd91161e, +0xfc9b121e, +0x0f0c2722, +0xffe03bbe, +0xf49b4027, +0xa70b1e22, +0xfbffffbe, +0x0000ce27, +0x20b4d140, +0xdf41d804, +0x0000dfa3, +0xbdd5fe00, +0x40270424, +0x070ef49b, +0x83f17169, +0x69f49363, +0x68330411, +0x29444999, +0xa3173672, +0x1e7fff2d, +0x22f39b12, +0xf49b4027, +0x8b00070e, +0x22f49bff, +0x3d27051e, +0x4f9b0240, +0xe641d848, +0x37c6f331, +0x27ba3f9b, +0x9b03fc4d, +0x5307bcf4, +0xe30c7c23, +0x2dffff5d, +0x0352ab73, +0x091e0c7c, +0x5fa35207, +0x7fff0000, +0x1112f393, +0x46349904, +0x020241e0, +0x42e04130, +0x4e5e026a, +0x83743903, +0x47430343, +0xbcf49b44, +0x06123499, +0x53743946, +0x03438344, +0x4447554c, +0x01bcf49b, +0x83430733, +0x2082084e, +0x82084e24, +0x0f4f2720, +0x1e844e00, +0x83430740, +0x44870f4c, +0xb9a444f1, +0xf49b0001, +0x073653bc, +0x0f4c8343, +0x44f14487, +0x0001b9a4, +0x53bcf49b, +0x83430736, +0x44870f4c, +0xb9a444f1, +0xf49b0001, +0x833453bc, +0x34f13c3c, +0x0001b9a4, +0x93bcf49b, +0x041087f4, +0x43074311, +0x82084e83, +0x084e2420, +0x4f272082, +0x844e000f, +0x4307401e, +0x870f4c83, +0xa444f144, +0x9b0001b9, +0x3653bcf4, +0x4c834307, +0xf144870f, +0x01b9a444, +0xbcf49b00, +0x43073653, +0x870f4c83, +0xa444f144, +0x9b0001b9, +0x3453bcf4, +0xf13c3c83, +0x01b9a434, +0xbcf49b00, +0x102af493, +0x07432104, +0x084e8343, +0x4e242082, +0x27208208, +0x4e000f4f, +0x07401e84, +0x0f4c8343, +0x44f14487, +0x0001b9a4, +0x53bcf49b, +0x83430736, +0x44870f4c, +0xb9a444f1, +0xf49b0001, +0x073653bc, +0x0f4c8343, +0x44f14487, +0x0001b9a4, +0x53bcf49b, +0x3c3c8334, +0xb9a434f1, +0xf49b0001, +0xcdf493bc, +0x4331040f, +0x4e834307, +0x24208208, +0x2082084e, +0x000f4f27, +0x401e844e, +0x4c834307, +0xf144870f, +0x01b9a444, +0xbcf49b00, +0x43073653, +0x870f4c83, +0xa444f144, +0x9b0001b9, +0x3653bcf4, +0x4c834307, +0xf144870f, +0x01b9a444, +0xbcf49b00, +0x3c833453, +0xa434f13c, +0x9b0001b9, +0xf293bcf4, +0x99040f70, +0x74391023, +0x33f13387, +0x0001b9e4, +0x830f4c33, +0x0600004e, +0xf49b430b, +0x442499bc, +0x4c837319, +0x8734530f, +0xf1338744, +0x01ba3444, +0xf433f100, +0x0b0001b9, +0xbcf49b43, +0x23997419, +0x03438344, +0x34534d4c, +0x3fe64447, +0x41a30082, +0x27bcf49b, +0x0c7419d1, +0x53d02732, +0x03438342, +0x4447514c, +0x671e4dab, +0x9ca37439, +0x03438340, +0xa3444743, +0xbcf49b41, +0x03fc4d27, +0x99bcf49b, +0x42074832, +0x32074173, +0x327342cb, +0x44d843ab, +0x03420715, +0x104c0844, +0x4fa34403, +0x80605380, +0x1ebcf49b, +0x2324080e, +0x802fa324, +0x9b806e0b, +0xf493bcf2, +0x99040ebc, +0x74391043, +0x33f13387, +0x0001b9e4, +0x830f4c33, +0x0600004e, +0xf49b430b, +0x5e8907bc, +0x743900eb, +0x43838907, +0x6da34303, +0x44471000, +0x9b808ca3, +0x7439bcf4, +0x43834453, +0x47554c03, +0x9b41a344, +0x3301bcf4, +0x4e834307, +0x24208208, +0x2082084e, +0x000f4f27, +0x401e844e, +0x4c834307, +0xf144870f, +0x01b9a444, +0xbcf49b00, +0x43073653, +0x870f4c83, +0xa444f144, +0x9b0001b9, +0x3653bcf4, +0x4c834307, +0xf144870f, +0x01b9a444, +0xbcf49b00, +0x3c833453, +0xa434f13c, +0x9b0001b9, +0xf293bcf4, +0x99040e1c, +0x74391023, +0x33f13387, +0x0001b9e4, +0x830f4c33, +0x0600004e, +0xf49b430b, +0x442499bc, +0x4c837319, +0x8734530f, +0xf1338744, +0x01ba3444, +0xf433f100, +0x0b0001b9, +0xbcf49b43, +0x23997419, +0x03438344, +0x34534d4c, +0x37464447, +0xf49b41a3, +0x19e127bc, +0x27320c74, +0x834253e0, +0x514c0343, +0x4eab4447, +0x1ebcf49b, +0x93ff1e03, +0x040daffd, +0x99729fc6, +0xd29911dc, +0x27c53047, +0x07031e45, +0xf144874c, +0x01bad443, +0x96412700, +0x33402724, +0x430b114c, +0xd0bcf49b, +0x4c073ec5, +0xd4074523, +0xbd07df6b, +0xdb7faf27, +0x0c1e83c6, +0x07bcfa9b, +0x0745234d, +0x07df6bd4, +0xbe15270b, +0x87ff7b9b, +0x1b400b40, +0x6b45234c, +0xe1d4ce4f, +0x44f14d87, +0x0001bac0, +0x93bcf49b, +0x040d43f4, +0x9d114099, +0x191e4740, +0xd49d4027, +0x9b121e47, +0x402722f3, +0x070ef49b, +0x9bff8b00, +0x051e22f4, +0x02403d27, +0xd8484f9b, +0xf69be641, +0xbaf59bb4, +0x61b9f89b, +0x621fc6f1, +0x0d62f493, +0x22449904, +0x4103f251, +0x43334383, +0xf0e844e9, +0x42230005, +0x1e1542ce, +0x1ef3e805, +0xff2ea706, +0x2411fdef, +0x4ddc3327, +0x93effc6a, +0x040d33f4, +0x33224499, +0xe44f0343, +0x690005f0, +0x0b444943, +0x23f35143, +0x1643ce43, +0xf3e8051e, +0x2ea7061e, +0xc1fdefff, +0x33273c24, +0xfc6a4ddc, +0xa5f493ee, +0x4d99040c, +0x3d915313, +0x1341997d, +0x990c7399, +0x92f90d74, +0x0001b900, +0x99f99153, +0x0001b940, +0x410b320b, +0x749df221, +0x0c739d0d, +0xfe31791d, +0xe1032103, +0xf9012fab, +0xf225fe35, +0x210c7c03, +0xeef141f0, +0x1eeef410, +0x22fd9b12, +0xbe0f0c27, +0x27ffdaf4, +0x22f49b40, +0xcea70b1e, +0x27fbffff, +0x200000de, +0x0420c4d1, +0x1edf42d8, +0x22f39b12, +0xf49b4027, +0x8b00070e, +0x22f49bff, +0x3d27051e, +0x4f9b0240, +0xe641d848, +0x23ba4f9b, +0xf2610c7c, +0x2fe6742d, +0xf3930131, +0x99040c68, +0x41032234, +0x14074383, +0x13831123, +0x23332107, +0x0b22349d, +0x93234923, +0x04096bf4, +0xe433e307, +0x20013387, +0xe32b4d01, +0xefff2ea7, +0xe8031efd, +0x3824c1f3, +0x4c333327, +0x1d4c5318, +0x33f144c0, +0xea14e913, +0xa70005f0, +0xfde71f2e, +0x14331407, +0x142b4487, +0x21152005, +0x3d070027, +0x4ea72035, +0x0bfde70f, +0x1543053e, +0x35302741, +0xf5f19340, +0xf093040b, +0x27040bf4, +0x201489e4, +0x439b2307, +0x1489040d, +0x03238320, +0x9d042d42, +0x31032212, +0xfe200803, +0x01030207, +0x83201489, +0x33200703, +0x93420323, +0x0408dff3, +0xf0e42df1, +0xe4070005, +0xefab3101, +0xefff2ea7, +0xe8031efd, +0x272401f3, +0x184c3333, +0xc01d4c53, +0x4e07f244, +0xe7ff3ea7, +0x332e87fd, +0x05422b44, +0x27341531, +0xa7313510, +0xfde7ef2e, +0x24152d05, +0x43334007, +0xf0e44f03, +0x30270005, +0x434d4e6d, +0xf4932135, +0xa7040b68, +0xfdefff0e, +0x1e22439d, +0xc1f3e803, +0x33273c04, +0xfc6a4ddc, +0xe8051ef5, +0xa7061ef3, +0xfdefff2e, +0x33272411, +0xfc6a4ddc, +0x03f081ef, +0xbe02680d, +0x27ffd87f, +0xdf4ea735, +0x2ea7fded, +0x05fdefff, +0xe8031e43, +0x272481f3, +0x0a4ddc33, +0x4327f6fc, +0x021824d5, +0xefff0ea7, +0xdc0461fd, +0x1427fc48, +0x021801d5, +0x021c01d5, +0x03d53027, +0x2ea70658, +0x05fdebe7, +0x004f2723, +0x15088300, +0x0ef39b24, +0x022001d5, +0x065c03d5, +0x04d54327, +0x3ea70224, +0x91fdefff, +0xfc48dc34, +0x34d54427, +0x2ea70224, +0x27fdebdf, +0x27240540, +0x0300003f, +0x9b231509, +0x00270ef4, +0xf58ef283, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0xf2e3f54e, +0xd207f095, +0x1fabf291, +0x33542289, +0x6b040319, +0x45c307df, +0xb31cbef2, +0xe6e007ff, +0x5e042704, +0x312715b4, +0x3027d496, +0x4027f385, +0x07b6f49b, +0x8721832c, +0x0043f142, +0x930005a3, +0x0390bff0, +0xe79f4ea7, +0x050121fd, +0x15f39143, +0x7433b941, +0xa7f35502, +0xfde78f3e, +0x4c274e35, +0x15340516, +0x213e3531, +0x7f3ea701, +0x4103fde7, +0x340521c3, +0x22f12287, +0x0005a300, +0x4ea73115, +0x35fde76f, +0x1542053e, +0x814e3541, +0x274546f4, +0x650f22ed, +0x27071efe, +0x6501220d, +0x41fd61f0, +0x00dde3f1, +0xe1f49303, +0x449903dd, +0x00dda345, +0xe3112410, +0xa30800dd, +0x072000dd, +0x19cc33c4, +0xffffaea7, +0x00be27fb, +0x101e4000, +0x2722fb9b, +0x55be0f0c, +0x4027ffac, +0xd122f49b, +0xd80420a4, +0xdcabeb41, +0x0424add5, +0xf49b4027, +0x93fe610e, +0x03ddebf3, +0x0800ede3, +0x34053415, +0xeda39027, +0xf0912000, +0xdd82f293, +0x35fea503, +0x07f925f9, +0xd2009952, +0xe7f37ea7, +0x345c03f9, +0x5e12209d, +0xf15112a7, +0x01a81fe6, +0xddbaf293, +0x22239903, +0x3103d907, +0x43073383, +0x44e94333, +0x0005f0e8, +0xd4cedfab, +0x22239d0c, +0x44c63516, +0x031ea127, +0xf493a027, +0x9903dd90, +0xf1412242, +0x43334207, +0xf0e843e9, +0x11230005, +0x43073203, +0x32234fab, +0x41074132, +0xd4ce4fab, +0x673fc66a, +0x11231207, +0x21071383, +0x2f032333, +0x0005f0e4, +0xf4932349, +0x0703da74, +0x87e433e3, +0x01200133, +0xa7e32b4c, +0xfdefff2e, +0xf3e8031e, +0x273824c1, +0x184c3333, +0xc01d4c53, +0x1333f144, +0xf0ea14e9, +0x2ea70005, +0x07fde71f, +0x87143314, +0x05142b44, +0x27211520, +0x353c0700, +0x0f4ea720, +0x3e0bfde7, +0x41154305, +0xf1934035, +0x9903dd00, +0x42072212, +0x410b4333, +0x40694349, +0x009ad3ee, +0x3d07f441, +0x4203300b, +0x008e43f2, +0x1489f341, +0x2b340320, +0x03130730, +0x071d2b42, +0xab410734, +0x024fab3f, +0x07130743, +0x83e103e2, +0x070223e3, +0x0b33333e, +0xd5f493d0, +0xc10703d9, +0x42010d07, +0xf0e43bf1, +0xcfab0005, +0x1ea70fab, +0x1efdefff, +0x01f3e803, +0x33332714, +0x4c53184c, +0xf244c01d, +0x30874007, +0x432b4433, +0x2c07420b, +0xe7ff3ea7, +0x331c87fd, +0x05212b24, +0x27321534, +0xa7313510, +0xfde7ef3e, +0x32153b05, +0x43334e07, +0xf0e44f03, +0x31350005, +0x404d4c6d, +0x4707abc6, +0x010c4c23, +0xff3ea742, +0x3205f9e7, +0x3e154e11, +0x34254421, +0x4ea77001, +0x05f9e7f3, +0x15711140, +0x25772141, +0x1e740747, +0x22f39b12, +0xf49b4027, +0x8b00070e, +0x22f49bff, +0x3d27051e, +0x4f9b8000, +0xe640c8b7, +0x07b71f9b, +0x41210329, +0x05e107f3, +0xffef83f2, +0x4207ffff, +0x83420732, +0xb6f49b43, +0x31074107, +0x4d832107, +0x3d8301e0, +0x2e831e00, +0x2701e000, +0x27449601, +0x27400700, +0x27349601, +0x27300700, +0x27249601, +0x31200700, +0xab4447f0, +0x87f0150f, +0x27233333, +0x1e1c1800, +0x40ab0127, +0x42ab43ab, +0x00001e58, +0x001f3c06, +0xa307f800, +0x0a1e104c, +0x0000ef18, +0x4ca307f8, +0xff3ea720, +0x3cc1fbff, +0x6b04076c, +0x29f4930f, +0x409d03db, +0xc8ec4744, +0xc0281fe0, +0x361e1027, +0x276c34c1, +0x33140730, +0x1a1c531a, +0x00004f18, +0x31270800, +0x121e4307, +0x1a331c07, +0x271a1c53, +0x00cf1840, +0x27080000, +0x464f6b41, +0xff4ea745, +0x44c1fbff, +0x53de076c, +0xd4201ddc, +0x151e4027, +0x4c334c07, +0x1e4c5310, +0x41003027, +0x43073127, +0x4f6b41c3, +0xdac2f293, +0x45239903, +0x009b13ee, +0x4d760db6, +0x4ff6f411, +0x4c270088, +0x9df09110, +0x04994424, +0x9b2327d4, +0x1a2c0324, +0x4207311b, +0x40133f4b, +0x42474352, +0x071e340b, +0x4247323a, +0x4307342b, +0x24474f4b, +0x21234128, +0x2013031e, +0x3f6b3207, +0xda72f493, +0x1e012703, +0x1bf2913c, +0xd4249931, +0x249b2327, +0x071a2c03, +0x133f4b42, +0x47435240, +0x1e340b42, +0x47323a07, +0x07342b42, +0x474f4b43, +0x23412824, +0x13031e21, +0x6b320720, +0x35f4933f, +0x002703da, +0x9d45419d, +0x111e1143, +0x00274027, +0x1e11249d, +0x9d402708, +0x00271124, +0x06f0d6e4, +0x1c331c07, +0x53b00710, +0x0c071c1c, +0x1ff60833, +0xfe930525, +0x9903da00, +0x232744e3, +0x41534307, +0xab104c83, +0x44e49d43, +0x9d414c27, +0x4f2713e4, +0x03030303, +0xc549e29d, +0xe1c54ce4, +0x46e29d50, +0xc534e1c5, +0xe1c538e1, +0x2c51353c, +0x5e412700, +0x4c070118, +0x53164c33, +0x30271e4c, +0x9d4ce39d, +0xcdd850e4, +0xa7770100, +0xfbffff4e, +0x996c40c1, +0x72990473, +0x54e49905, +0xe199d007, +0x603f0355, +0x730001b9, +0x340b10dc, +0x2f030f8b, +0x0001b960, +0x210b4d07, +0x0fff4d83, +0x30073119, +0x190e4c33, +0xff3d8322, +0x3343ab3f, +0x41ab1a1c, +0xab1c2c33, +0x8be45542, +0x13000c0f, +0x300fab00, +0x0c27210c, +0x6b031e21, +0x07501d0f, +0x0c0f8b0d, +0xab001300, +0x210c300f, +0x1e210c27, +0x3d0f6b03, +0x00cdf850, +0xa7008502, +0xfbffff4e, +0x936c40c1, +0x03d97ffe, +0x19087399, +0x99e139e4, +0xe0070972, +0xb9603f03, +0xec730001, +0x8b340b10, +0x602f030f, +0x070001b9, +0x83210b4e, +0x190fff4d, +0x33300731, +0x22190e4c, +0x3fff3d83, +0xab1a1c33, +0x3341ab43, +0x42ab1c2c, +0xd8f6f193, +0x8b141503, +0x13000c0f, +0x300fab00, +0x0c27210c, +0x6b031e21, +0x07505d0f, +0x0c0f8b0e, +0xab001300, +0x210c300f, +0x1e210c27, +0x930f6b03, +0x03d8e9f2, +0x4027203d, +0xffff2ea7, +0x6c2ec1fb, +0x0000eefc, +0x07012280, +0x164c334e, +0x931e4c53, +0x03d893f3, +0x2751349d, +0x4d349d40, +0x0100edd8, +0x6c20c17b, +0x19067499, +0x07739952, +0xd0075139, +0xb9604f03, +0x420b0001, +0xb9603f03, +0xdc730001, +0x8b310b10, +0x0741190f, +0x8332194d, +0x070fff4d, +0xff3d8330, +0x0e4c333f, +0x1c3343ab, +0x3341ab1a, +0x42ab1c2c, +0xd852f393, +0x8b342503, +0x13000c0f, +0x300fab00, +0x0c27210c, +0x6b031e21, +0x04509d0f, +0x0f8b0d07, +0x0013000c, +0x0c300fab, +0x210c2721, +0x0f6b031e, +0xd846f493, +0xf8403d03, +0x860200ed, +0xff4ea700, +0x40c1fbff, +0x0a73996c, +0xd82cfe93, +0x59e13903, +0x0b729954, +0x3f03e007, +0x0001b960, +0x0b10ec73, +0x030f8b34, +0x01b9602f, +0x0b4e0700, +0xff4d8321, +0x0731190f, +0x0e4c3330, +0x3d832219, +0x1c333fff, +0xab43ab1a, +0x1c2c3341, +0xf19342ab, +0x3503d7c8, +0x0c0f8b14, +0xab001300, +0x210c300f, +0x1e210c27, +0x9d0f6b03, +0x0e070650, +0x000c0f8b, +0x0fab0013, +0x27210c30, +0x031e210c, +0xf2930f6b, +0x3d03d7be, +0xa7402720, +0xfbffff2e, +0xfc6c2ec1, +0x800000ee, +0x3e070125, +0x93163c33, +0x03d767f1, +0x271e3c53, +0x4e149d40, +0xd852139d, +0x7b0100ed, +0x196c20c1, +0x56129954, +0x11995339, +0x03d00757, +0x01b9604f, +0x03420b00, +0x01b9603f, +0x10dc7300, +0x0f8b310b, +0x4d074119, +0x4d833219, +0x30070fff, +0x3fff3d83, +0xab0e4c33, +0x1a1c3343, +0x2c3341ab, +0x9342ab1c, +0x03d723f3, +0x0f8b3445, +0x0013000c, +0x0c300fab, +0x210c2721, +0x0f6b031e, +0x0708509d, +0x0c0f8b0d, +0xab001300, +0x210c300f, +0x1e210c27, +0x930f6b03, +0x03d71bf4, +0xedf8403d, +0x00890200, +0xffff4ea7, +0x6c40c1fb, +0xd700fe93, +0x93e33903, +0x03d71df1, +0x14195259, +0x1139e007, +0xb9602f03, +0x3f030001, +0x0001b960, +0x0b10ec73, +0x8b310b24, +0x194e070f, +0xff4d8321, +0x0732190f, +0x0e4c3330, +0x3fff3d83, +0xab1a1c33, +0x3341ab43, +0x42ab1c2c, +0xd696f193, +0x8b145503, +0x13000c0f, +0x300fab00, +0x0c27210c, +0x6b031e21, +0x0a509d0f, +0x0f8b0e07, +0x0013000c, +0x0c300fab, +0x210c2721, +0x0f6b031e, +0xd690f293, +0x27203d03, +0xff2ea740, +0x2ec1fbff, +0x00eefc6c, +0x012a8000, +0x3c333e07, +0x35f19316, +0x3c5303d6, +0x9d40271e, +0x139d4f14, +0x00edd853, +0x20c17d01, +0x0454996c, +0x99085299, +0xd0073913, +0x033d1199, +0x01b9604f, +0x03420b00, +0x01b9603f, +0x10dc7300, +0x0f8b310b, +0x4d074119, +0x4d833219, +0x30070fff, +0x3fff3d83, +0xab0e4c33, +0x1a1c3343, +0x2c3341ab, +0x9342ab1c, +0x03d5eff3, +0x0f8b3465, +0x0013000c, +0x0c300fab, +0x210c2721, +0x0f6b031e, +0x070c509d, +0x0c0f8b0d, +0xab001300, +0x210c300f, +0x1e210c27, +0x930f6b03, +0x03d5ebf4, +0xedf8403d, +0x03f00200, +0xffff4ea7, +0x6c40c1fb, +0xd5d0fe93, +0x99e33903, +0xfe930652, +0x3903d5ca, +0x0a5499e1, +0x2f03e007, +0x0001b960, +0xb9603f03, +0xec730001, +0x0b240b10, +0x070f8b31, +0x8321194e, +0x190fff4d, +0x33300732, +0x3d830e4c, +0x1c333fff, +0xab43ab1a, +0x1c2c3341, +0xf19342ab, +0x7503d560, +0x0c0f8b14, +0xab001300, +0x210c300f, +0x1e210c27, +0x9d0f6b03, +0x0e070e50, +0x000c0f8b, +0x0fab0013, +0x27210c30, +0x031e210c, +0xf2930f6b, +0x3d03d55e, +0x03645e20, +0x03604fe6, +0x0000ce18, +0x93b74640, +0x03d507f3, +0x349d4327, +0x9d442746, +0x4c274934, +0x13349d40, +0x9301a55e, +0x03d4eff4, +0x439d3027, +0x9d342713, +0x935e4643, +0x4c00e801, +0x00cefc01, +0x01454000, +0xd4d2fe93, +0x44e39903, +0x43072027, +0x4c834153, +0x9d43ab10, +0x432744e4, +0x2746e49d, +0xe49d414c, +0x9d402713, +0xe4c54ce2, +0x49e29d34, +0x0100cdd8, +0xff4ea777, +0x40c1fbff, +0x0473996c, +0x99057299, +0xd00754e4, +0x0355e199, +0x01b9603f, +0x10dc7300, +0x0f8b340b, +0xb9602f03, +0x4d070001, +0x4d83210b, +0x31190fff, +0x4c333007, +0x8322190e, +0xab3fff3d, +0x1a1c3343, +0x2c3341ab, +0x5542ab1c, +0x0c0f8be4, +0xab001300, +0x210c300f, +0x1e210c27, +0x1d0f6b03, +0x8b0d0750, +0x13000c0f, +0x300fab00, +0x0c27210c, +0x6b031e21, +0xf8503d0f, +0x850200cd, +0xff4ea700, +0x40c1fbff, +0x75fe936c, +0x739903d4, +0x39e41908, +0x097299e1, +0x3f03e007, +0x0001b960, +0x0b10ec73, +0x030f8b34, +0x01b9602f, +0x0b4e0700, +0xff4d8321, +0x0731190f, +0x0e4c3330, +0x3d832219, +0x1c333fff, +0xab43ab1a, +0x1c2c3341, +0xf19342ab, +0x1503d3ec, +0x0c0f8b14, +0xab001300, +0x210c300f, +0x1e210c27, +0x5d0f6b03, +0x8b0e0750, +0x13000c0f, +0x300fab00, +0x0c27210c, +0x6b031e21, +0xdff2930f, +0x203d03d3, +0x4c334c07, +0x1e4c5316, +0xd39af393, +0x50349d03, +0xd801e15e, +0x400000ce, +0x89fd9326, +0xb68603d3, +0x9d404c27, +0x432713d4, +0x2746d49d, +0x49d49d44, +0x4027251e, +0x2713d49d, +0x46d49d44, +0x00cc191e, +0x61f39316, +0x4c2703d3, +0x13349d40, +0x349d4327, +0x9d442746, +0x30274934, +0xd39ef493, +0x15430503, +0x9d402743, +0x47070474, +0x437d4403, +0x435d433d, +0x0308739d, +0x3d437d44, +0x5e435d43, +0x2c070176, +0xd322fd93, +0x3f2c8303, +0x2779e0c8, +0x10d29d30, +0xc554d3c5, +0x402758d3, +0x0704749d, +0x7d440347, +0x5d433d43, +0x08739d43, +0x437d4403, +0x435d433d, +0x10272d07, +0xffffeea7, +0x270d07fb, +0x0514d634, +0xc1061e0c, +0x24056ce4, +0x11032401, +0x24054653, +0xf3402403, +0xd2cef293, +0x44239903, +0x41534307, +0xab104c83, +0x44249d43, +0x249d4027, +0x10239946, +0x9d414c27, +0x3fe61324, +0x4c2700fa, +0x13249d45, +0x0700f15e, +0x104c334c, +0x0710d29d, +0x072707ec, +0x1e4c5317, +0x0314ec33, +0xc4180324, +0x40276841, +0xc554d4c5, +0x302758d4, +0x7d04739d, +0x5d243d24, +0x08749d24, +0x143d147d, +0xd399145d, +0x072e0744, +0x1a2c5343, +0x21034453, +0x240b4487, +0x0c0f3cd8, +0x4ca34307, +0x44d49d0f, +0x990c2c03, +0x212344d3, +0x41534307, +0xab104c83, +0x44d49d43, +0xd49d4127, +0x10d39946, +0x9d414c27, +0xd49d48d2, +0x733fc613, +0x1e454c27, +0xc540276b, +0xd4c554d4, +0x9d302758, +0x247d0473, +0x245d243d, +0x7d08749d, +0x5d143d14, +0x44d09914, +0xffff4ea7, +0x6c42c1fb, +0xc16c43c1, +0x40076c41, +0x41533633, +0xf0003e83, +0xc02d8303, +0x104c830f, +0x40ab23ab, +0x331aec53, +0x2eab0c1c, +0x00001e83, +0x44d49dfc, +0x21ab4227, +0x9946d49d, +0x4c2710d3, +0x9dd20551, +0x350613d4, +0x9d554c27, +0xfe0113d4, +0x0ec2f041, +0x034e0740, +0x61042e41, +0xa1161efd, +0x9b121efd, +0x0c2722fc, +0xa036be0f, +0x9b4027ff, +0x0b1e22f4, +0xffffbea7, +0x00ce27fb, +0xb4d14000, +0x41d80420, +0x00dfa3df, +0xd5fe0000, +0x270424bd, +0x0ef49b40, +0x19079383, +0xf2811833, +0xd162f493, +0x29f17503, +0x44499976, +0x449927f6, +0x1843d446, +0x7fff6da3, +0xf39b121e, +0x9b402722, +0x00070ef4, +0xf49bff8b, +0x27051e22, +0x9b02403d, +0x41d8484f, +0x86f331e6, +0xba3f9b37, +0x03fc4d27, +0x23bcf49b, +0x732d0c7c, +0xffff3de3, +0x7c0363ab, +0x93111e0c, +0x03d10ff4, +0x14464499, +0x006fa343, +0x937fff00, +0x03d0fffd, +0xe046d499, +0x54028d42, +0xe0468643, +0x5e021341, +0x43e004d9, +0x44e00375, +0xce5e04c0, +0x53743904, +0x474b0346, +0xbcf49b44, +0x9b1d4c27, +0x4503bcf4, +0x99bcf49b, +0x460612d4, +0x44537439, +0x4c034383, +0x9b444755, +0xd301bcf4, +0x4e834307, +0x24208208, +0x2082084e, +0x000f4f27, +0x401e844e, +0x4c834307, +0xf144870f, +0x01b9a444, +0xbcf49b00, +0x43073653, +0x870f4c83, +0xa444f144, +0x9b0001b9, +0x3653bcf4, +0x4c834307, +0xf144870f, +0x01b9a444, +0xbcf49b00, +0x3c833453, +0xa434f13c, +0x9b0001b9, +0xf493bcf4, +0x1103d05c, +0x83430743, +0x2082084e, +0x82084e24, +0x0f4f2720, +0x1e844e00, +0x83430740, +0x44870f4c, +0xb9a444f1, +0xf49b0001, +0x073653bc, +0x0f4c8343, +0x44f14487, +0x0001b9a4, +0x53bcf49b, +0x83430736, +0x44870f4c, +0xb9a444f1, +0xf49b0001, +0x833453bc, +0x34f13c3c, +0x0001b9a4, +0x93bcf49b, +0x03cffff4, +0x43074321, +0x82084e83, +0x084e2420, +0x4f272082, +0x844e000f, +0x4307401e, +0x870f4c83, +0xa444f144, +0x9b0001b9, +0x3653bcf4, +0x4c834307, +0xf144870f, +0x01b9a444, +0xbcf49b00, +0x43073653, +0x870f4c83, +0xa444f144, +0x9b0001b9, +0x3453bcf4, +0xf13c3c83, +0x01b9a434, +0xbcf49b00, +0xcfa2f493, +0x07433103, +0x084e8343, +0x4e242082, +0x27208208, +0x4e000f4f, +0x07401e84, +0x0f4c8343, +0x44f14487, +0x0001b9a4, +0x53bcf49b, +0x83430736, +0x44870f4c, +0xb9a444f1, +0xf49b0001, +0x073653bc, +0x0f4c8343, +0x44f14487, +0x0001b9a4, +0x53bcf49b, +0x3c3c8334, +0xb9a434f1, +0xf49b0001, +0x45f293bc, +0x239903cf, +0x87743910, +0xe433f133, +0x330001b9, +0x4e830f4c, +0x0b060000, +0xbcf49b43, +0x19442499, +0x0f4c8373, +0x44873453, +0x44f13387, +0x0001ba34, +0xb9f433f1, +0x430b0001, +0x19bcf49b, +0x44239974, +0x4c034383, +0x4734534d, +0xd03fe644, +0x9b41a302, +0xe127bcf4, +0x320c7419, +0x4253e027, +0x4c034383, +0xab444751, +0x02b55e4e, +0x9ca37439, +0x03465340, +0x9b44474b, +0x4c27bcf4, +0xbcf49b1d, +0xf49b4603, +0xfc4d27bc, +0xbcf49b03, +0x0748d299, +0x07417342, +0x7342cb32, +0xd843ab32, +0x42071544, +0x4c084403, +0xa3440310, +0x1293604f, +0xbcf49b81, +0x24080e1e, +0x2fa32423, +0x811e5360, +0x93bcf29b, +0x03ce87f4, +0x39104399, +0xf1338774, +0x01b9e433, +0x0f4c3300, +0x00004e83, +0x5e430b06, +0x74390243, +0x4653f071, +0x10000da3, +0x4b03b907, +0x4447f075, +0x9b80bca3, +0x4c27bcf4, +0xbcf49b1d, +0xf49b4503, +0x537439bc, +0x03438344, +0x4447554c, +0xf49b41a3, +0x07d301bc, +0x084e8343, +0x4e242082, +0x27208208, +0x4e000f4f, +0x07401e84, +0x0f4c8343, +0x44f14487, +0x0001b9a4, +0x53bcf49b, +0x83430736, +0x44870f4c, +0xb9a444f1, +0xf49b0001, +0x073653bc, +0x0f4c8343, +0x44f14487, +0x0001b9a4, +0x53bcf49b, +0x3c3c8334, +0xb9a434f1, +0xf49b0001, +0xddf293bc, +0x239903cd, +0x87743910, +0xe433f133, +0x330001b9, +0x4e830f4c, +0x0b060000, +0xbcf49b43, +0x19442499, +0x0f4c8373, +0x44873453, +0x44f13387, +0x0001ba34, +0xb9f433f1, +0x430b0001, +0x19bcf49b, +0x44239974, +0x4c034383, +0x4734534d, +0xa3374644, +0xbcf49b41, +0x74191127, +0x1027320c, +0x43834253, +0x47514c03, +0x9b41ab44, +0x665ebcf4, +0x53743901, +0x474b0346, +0xbcf49b44, +0x8749d499, +0x8044f144, +0x9b0001ba, +0xd499bcf4, +0x3943c449, +0x874cd499, +0x7444f144, +0x9b0001ba, +0xd499bcf4, +0xf144874d, +0x01ba7444, +0xbcf49b00, +0x874ed499, +0x7444f144, +0x9b0001ba, +0xd499bcf4, +0xf144874f, +0x01ba7444, +0xbcf49b00, +0xf49bd451, +0x49d499bf, +0x43c044e6, +0x995a1e20, +0xd29934d3, +0x33430735, +0x43ab104c, +0x3c333207, +0x3343ab18, +0xc542ab28, +0x501e54d4, +0xf49bd471, +0x9bd491bf, +0xd4b1bff4, +0x99bff49b, +0xd39940d4, +0x41d09938, +0x333cde99, +0xd299104c, +0x3dd19939, +0x0c3334ab, +0xab4eab18, +0xab283330, +0xab183340, +0xc541ab32, +0x141e54d3, +0xf39bff1e, +0x9b402722, +0x00070ef4, +0xf49bff8b, +0x15061e22, +0x403c2774, +0xd8b84f9b, +0xe340004d, +0xcc92f293, +0x44249903, +0x4c837319, +0x8734530f, +0xf1338744, +0x01ba3444, +0xf433f100, +0x0b0001b9, +0xbcf49b43, +0x23997419, +0x03438344, +0x34534d4c, +0x37464447, +0xf49b41a3, +0x192127bc, +0x27320c74, +0x83425320, +0x514c0343, +0x42ab4447, +0x93bcf49b, +0x03cc43f3, +0x86123499, +0x44349949, +0x240f4cd8, +0x44537439, +0x4c034383, +0x9b444755, +0x141ebcf4, +0x46537439, +0x44474b03, +0xf49b41a3, +0x1e6fabbc, +0x07ff1e03, +0x0dfd93b9, +0x9fc603cc, +0x11dc9972, +0x3047d299, +0x1e4527c5, +0x874c0703, +0xd443f144, +0x270001ba, +0x27249641, +0x114c3340, +0xf49b430b, +0x3ec5d0bc, +0x45234c07, +0xdf6bd407, +0x8f27ad07, +0x83c6db7f, +0xf89b0c1e, +0x234d07bc, +0x6bd40745, +0x270a07df, +0x39f9be15, +0x0b4087ff, +0x234c1b40, +0xce4f6b45, +0x4d87e1d4, +0xbac044f1, +0xf49b0001, +0xa1f493bc, +0x439903cb, +0x47439d11, +0x4027191e, +0x1e47d49d, +0x22f39b12, +0xf49b4027, +0x8b00070e, +0x22f49bff, +0x3d27051e, +0x4f9b0240, +0xe641d848, +0xf49bf471, +0xbaf69bb4, +0x51b9fb9b, +0x62efc6fe, +0xcbbef493, +0x22449903, +0x4103f011, +0x43334383, +0xf0e844e9, +0x42230005, +0x1e1540ce, +0x1ef3e805, +0xff2ea706, +0x2411fdef, +0x4ddc3327, +0x93effc6a, +0x03cb8ff4, +0x11224499, +0x034333f1, +0x05f0e44f, +0x49436900, +0x23430b44, +0x1641ce43, +0xf3e8051e, +0x2ea7061e, +0xc1fdefff, +0x33273c24, +0xfc6a4ddc, +0x01f493ee, +0x429903cb, +0x3d915313, +0x13419972, +0x990c7399, +0x92f90d74, +0x0001b900, +0x99f99153, +0x0001b940, +0x410b320b, +0x749df221, +0x0c739d0d, +0xf331791d, +0x31032103, +0xf9012fab, +0xf225f335, +0x210c7c03, +0xeefe41f4, +0x1eed55e4, +0x22fd9b12, +0xbe0f0c27, +0x27ff9950, +0x22f49b40, +0xcea70b1e, +0x27fbffff, +0x200000de, +0x0420c4d1, +0x1edf42d8, +0x22f39b12, +0xf49b4027, +0x8b00070e, +0x22f49bff, +0x3d27051e, +0x4f9b0240, +0xe641d848, +0x23ba4f9b, +0xf0510c7c, +0x0fe6742d, +0xf3930131, +0x9903cac4, +0x41032234, +0x14074383, +0x13831123, +0x23332107, +0x0b22349d, +0x93234923, +0x03c7c7f4, +0xe433e307, +0x20013387, +0xe32b4d01, +0xefff2ea7, +0xe8031efd, +0x3824c1f3, +0x4c333327, +0x1d4c5318, +0x33f144c0, +0xea14e913, +0xa70005f0, +0xfde71f2e, +0x14331407, +0x142b4487, +0x21152005, +0x3d070027, +0x4ea72035, +0x0bfde70f, +0x1543053e, +0x35302741, +0x51f19340, +0xf09303ca, +0x2703ca50, +0x201489e4, +0x439b2307, +0x1489040d, +0x03238320, +0x9d042d42, +0x31032212, +0xfe200803, +0x01030207, +0x83201489, +0x33200703, +0x93420323, +0x03c73bf3, +0xf0e42df1, +0xe4070005, +0xefab3101, +0xefff2ea7, +0xe8031efd, +0x272401f3, +0x184c3333, +0xc01d4c53, +0x4e07f244, +0xe7ff3ea7, +0x332e87fd, +0x05422b44, +0x27341531, +0xa7313510, +0xfde7ef2e, +0x24152d05, +0x43334007, +0xf0e44f03, +0x30270005, +0x434d4e6d, +0xf4932135, +0xa703c9c4, +0xfdefff0e, +0x1e22439d, +0xc1f3e803, +0x33273c04, +0xfc6a4ddc, +0xe8051ef5, +0xa7061ef3, +0xfdefff2e, +0x33272411, +0xfc6a4ddc, +0x03f091ef, +0xbe02680d, +0x27ff96db, +0xdf4ea735, +0x2ea7fded, +0x05fdefff, +0xe8031e43, +0x272481f3, +0x0a4ddc33, +0x4327f6fc, +0x021824d5, +0xefff0ea7, +0xdc0461fd, +0x1427fc48, +0x021801d5, +0x021c01d5, +0x03d53027, +0x2ea70658, +0x05fdebe7, +0x004f2723, +0x15088300, +0x0ef39b24, +0x022001d5, +0x065c03d5, +0x04d54327, +0x3ea70224, +0x91fdefff, +0xfc48dc34, +0x34d54427, +0x2ea70224, +0x27fdebdf, +0x27240540, +0x0300003f, +0x9b231509, +0x00270ef4, +0xf58ef2c3, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0xf2e3f54e, +0xc207f095, +0x1fabf291, +0x33542289, +0x07040319, +0x45b307d4, +0x731cbef2, +0x07bf6bff, +0x2704e6e0, +0x17405e04, +0xf49b4027, +0x832d07b6, +0xf1428721, +0x05a30043, +0xc5f09300, +0x4ea70350, +0x21fde79f, +0x91430501, +0xb94115f3, +0x55027433, +0x8f3ea7f3, +0x4e35fde7, +0x05164c27, +0x35311534, +0xa701213e, +0xfde77f3e, +0x21c34103, +0x22873405, +0xa30022f1, +0x31150005, +0xe76f4ea7, +0x053e35fd, +0x35411542, +0x91c6464e, +0x031c07f0, +0x680d0318, +0xbe202702, +0xc6ff6e80, +0x274127b5, +0x850f22cd, +0x1efc65f4, +0x27e0270b, +0x8501220d, +0x61f065fe, +0xe3f141fd, +0x930300dd, +0x039dcff4, +0xa3454499, +0x241000dd, +0x00dde311, +0x00dda308, +0x33c40720, +0xaea719cc, +0x27fbffff, +0x400000be, +0xfb9b101e, +0x0f0c2722, +0xff6c43be, +0xf49b4027, +0x20a4d122, +0xeb41d804, +0xadd5dcab, +0x40270424, +0x610ef49b, +0xd9f393fc, +0xcde3039d, +0x34150800, +0x90273405, +0x2000cda3, +0xf293fe91, +0xa5039d70, +0x25f935fc, +0x995207f9, +0x7ea7d2ee, +0x03f9e7f3, +0x2e9d345c, +0x14235e12, +0x0fe6f051, +0xf29301a8, +0x99039da8, +0xd9072223, +0x33833103, +0x43334307, +0xf0e844e9, +0xdfab0005, +0x9d0cd4ce, +0x35162223, +0xa12744c6, +0xa027031e, +0x9d7ef493, +0x22429903, +0x4207f141, +0x43e94333, +0x0005f0e8, +0x32031123, +0x4fab4307, +0x41323223, +0x4fab4107, +0xc66ad4ce, +0x1207673f, +0x13831123, +0x23332107, +0xf0e42f03, +0x23490005, +0x9a62f493, +0x33e30703, +0x013387e4, +0x2b4c0120, +0xff2ea7e3, +0x031efdef, +0x24c1f3e8, +0x33332738, +0x4c53184c, +0xf144c01d, +0x14e91333, +0x0005f0ea, +0xe71f2ea7, +0x331407fd, +0x2b448714, +0x15200514, +0x07002721, +0xa720353c, +0xfde70f4e, +0x43053e0b, +0x40354115, +0x9ceef193, +0x22129903, +0x43334207, +0x4349410b, +0xd3ee4069, +0xf441009a, +0x300b3d07, +0x43f24203, +0xf341008e, +0x03201489, +0x07302b34, +0x2b420313, +0x0734071d, +0xab3fab41, +0x0743024f, +0x03e20713, +0x23e383e1, +0x333e0702, +0x93d00b33, +0x0399c3f4, +0x0d07c107, +0x3bf14201, +0x0005f0e4, +0x0fabcfab, +0xefff1ea7, +0xe8031efd, +0x271401f3, +0x184c3333, +0xc01d4c53, +0x4007f244, +0x44333087, +0x420b432b, +0x3ea72c07, +0x87fde7ff, +0x2b24331c, +0x15340521, +0x35102732, +0xef3ea731, +0x3b05fde7, +0x4e073215, +0x4f034333, +0x0005f0e4, +0x4c6d3135, +0xabc6404d, +0x4c234707, +0xa741010c, +0xf9e7ff3e, +0x42113105, +0x44213215, +0x73013425, +0xe7f34ea7, +0x114305f9, +0x214c157c, +0x07472577, +0x9b121e74, +0x402722f3, +0x070ef49b, +0x9bff8b00, +0x051e22f4, +0x80003d27, +0xc8b74f9b, +0x1f9be640, +0x03e907b7, +0x01fe05e1, +0x07f241f0, +0xffef83e1, +0x4207ffff, +0x83400720, +0xb6f49b43, +0x31074107, +0x4d832107, +0x3d8301e0, +0x2e831e00, +0x2701e000, +0x274496c1, +0x274c07c0, +0x27349601, +0x27300700, +0x272496c1, +0x07f031c0, +0x150fab2c, +0x874447f0, +0x27233333, +0x1e1c1800, +0x40ab0127, +0x42ab43ab, +0x00001e58, +0x001f3c06, +0xa307f800, +0x0a1e104c, +0x0000ef18, +0x4ca307f8, +0xff3ea720, +0x3cc1fbff, +0x6b04076c, +0x15f4930f, +0x409d039b, +0xc8ec4744, +0xc0281fe0, +0x361e1027, +0x276c34c1, +0x33140730, +0x1a1c531a, +0x00004f18, +0x31270800, +0x121e4307, +0x1a331c07, +0x271a1c53, +0x00cf1840, +0x27080000, +0x464f6b41, +0xff4ea745, +0x44c1fbff, +0x53de076c, +0xd4201ddc, +0x151e4027, +0x4c334c07, +0x1e4c5310, +0x41003027, +0x43073127, +0x4f6b41c3, +0x9aaef293, +0x45239903, +0x009b13ee, +0x4d760db6, +0x4ff6f411, +0x4c270088, +0x9df09110, +0x04994424, +0x9b2327d4, +0x1a2c0324, +0x4207311b, +0x40133f4b, +0x42474352, +0x071e340b, +0x4247323a, +0x4307342b, +0x24474f4b, +0x21234128, +0x2013031e, +0x3f6b3207, +0x9a5ef493, +0x1e012703, +0x1bf2913c, +0xd4249931, +0x249b2327, +0x071a2c03, +0x133f4b42, +0x47435240, +0x1e340b42, +0x47323a07, +0x07342b42, +0x474f4b43, +0x23412824, +0x13031e21, +0x6b320720, +0x21f4933f, +0x0027039a, +0x9d45419d, +0x111e1143, +0x00274027, +0x1e11249d, +0x9d402708, +0x00271124, +0x06f0d6e4, +0x1c331c07, +0x53b00710, +0x0c071c1c, +0x1ff60833, +0xfe930525, +0x990399ec, +0x232744e3, +0x41534307, +0xab104c83, +0x44e49d43, +0x9d414c27, +0x4f2713e4, +0x03030303, +0xc549e29d, +0xe1c54ce4, +0x46e29d50, +0xc534e1c5, +0xe1c538e1, +0x2c51353c, +0x5e412700, +0x4c070118, +0x53164c33, +0x30271e4c, +0x9d4ce39d, +0xcdd850e4, +0xa7770100, +0xfbffff4e, +0x996c40c1, +0x72990473, +0x54e49905, +0xe199d007, +0x603f0355, +0x730001b9, +0x340b10dc, +0x2f030f8b, +0x0001b960, +0x210b4d07, +0x0fff4d83, +0x30073119, +0x190e4c33, +0xff3d8322, +0x3343ab3f, +0x41ab1a1c, +0xab1c2c33, +0x8be45542, +0x13000c0f, +0x300fab00, +0x0c27210c, +0x6b031e21, +0x07501d0f, +0x0c0f8b0d, +0xab001300, +0x210c300f, +0x1e210c27, +0x3d0f6b03, +0x00cdf850, +0xa7008502, +0xfbffff4e, +0x936c40c1, +0x03996bfe, +0x19087399, +0x99e139e4, +0xe0070972, +0xb9603f03, +0xec730001, +0x8b340b10, +0x602f030f, +0x070001b9, +0x83210b4e, +0x190fff4d, +0x33300731, +0x22190e4c, +0x3fff3d83, +0xab1a1c33, +0x3341ab43, +0x42ab1c2c, +0x98e2f193, +0x8b141503, +0x13000c0f, +0x300fab00, +0x0c27210c, +0x6b031e21, +0x07505d0f, +0x0c0f8b0e, +0xab001300, +0x210c300f, +0x1e210c27, +0x930f6b03, +0x0398d5f2, +0x4027203d, +0xffff2ea7, +0x6c2ec1fb, +0x0000eefc, +0x07012280, +0x164c334e, +0x931e4c53, +0x03987ff3, +0x2751349d, +0x4d349d40, +0x0100edd8, +0x6c20c17b, +0x19067499, +0x07739952, +0xd0075139, +0xb9604f03, +0x420b0001, +0xb9603f03, +0xdc730001, +0x8b310b10, +0x0741190f, +0x8332194d, +0x070fff4d, +0xff3d8330, +0x0e4c333f, +0x1c3343ab, +0x3341ab1a, +0x42ab1c2c, +0x983ef393, +0x8b342503, +0x13000c0f, +0x300fab00, +0x0c27210c, +0x6b031e21, +0x04509d0f, +0x0f8b0d07, +0x0013000c, +0x0c300fab, +0x210c2721, +0x0f6b031e, +0x9832f493, +0xf8403d03, +0x860200ed, +0xff4ea700, +0x40c1fbff, +0x0a73996c, +0x9818fe93, +0x59e13903, +0x0b729954, +0x3f03e007, +0x0001b960, +0x0b10ec73, +0x030f8b34, +0x01b9602f, +0x0b4e0700, +0xff4d8321, +0x0731190f, +0x0e4c3330, +0x3d832219, +0x1c333fff, +0xab43ab1a, +0x1c2c3341, +0xf19342ab, +0x350397b4, +0x0c0f8b14, +0xab001300, +0x210c300f, +0x1e210c27, +0x9d0f6b03, +0x0e070650, +0x000c0f8b, +0x0fab0013, +0x27210c30, +0x031e210c, +0xf2930f6b, +0x3d0397aa, +0xa7402720, +0xfbffff2e, +0xfc6c2ec1, +0x800000ee, +0x3e070125, +0x93163c33, +0x039753f1, +0x271e3c53, +0x4e149d40, +0xd852139d, +0x7b0100ed, +0x196c20c1, +0x56129954, +0x11995339, +0x03d00757, +0x01b9604f, +0x03420b00, +0x01b9603f, +0x10dc7300, +0x0f8b310b, +0x4d074119, +0x4d833219, +0x30070fff, +0x3fff3d83, +0xab0e4c33, +0x1a1c3343, +0x2c3341ab, +0x9342ab1c, +0x03970ff3, +0x0f8b3445, +0x0013000c, +0x0c300fab, +0x210c2721, +0x0f6b031e, +0x0708509d, +0x0c0f8b0d, +0xab001300, +0x210c300f, +0x1e210c27, +0x930f6b03, +0x039707f4, +0xedf8403d, +0x00890200, +0xffff4ea7, +0x6c40c1fb, +0x96ecfe93, +0x93e33903, +0x039709f1, +0x14195259, +0x1139e007, +0xb9602f03, +0x3f030001, +0x0001b960, +0x0b10ec73, +0x8b310b24, +0x194e070f, +0xff4d8321, +0x0732190f, +0x0e4c3330, +0x3fff3d83, +0xab1a1c33, +0x3341ab43, +0x42ab1c2c, +0x9682f193, +0x8b145503, +0x13000c0f, +0x300fab00, +0x0c27210c, +0x6b031e21, +0x0a509d0f, +0x0f8b0e07, +0x0013000c, +0x0c300fab, +0x210c2721, +0x0f6b031e, +0x967cf293, +0x27203d03, +0xff2ea740, +0x2ec1fbff, +0x00eefc6c, +0x012a8000, +0x3c333e07, +0x21f19316, +0x3c530396, +0x9d40271e, +0x139d4f14, +0x00edd853, +0x20c17d01, +0x0454996c, +0x99085299, +0xd0073913, +0x033d1199, +0x01b9604f, +0x03420b00, +0x01b9603f, +0x10dc7300, +0x0f8b310b, +0x4d074119, +0x4d833219, +0x30070fff, +0x3fff3d83, +0xab0e4c33, +0x1a1c3343, +0x2c3341ab, +0x9342ab1c, +0x0395dbf3, +0x0f8b3465, +0x0013000c, +0x0c300fab, +0x210c2721, +0x0f6b031e, +0x070c509d, +0x0c0f8b0d, +0xab001300, +0x210c300f, +0x1e210c27, +0x930f6b03, +0x0395d7f4, +0xedf8403d, +0x03f00200, +0xffff4ea7, +0x6c40c1fb, +0x95bcfc93, +0x06529903, +0xfe93c339, +0x390395b6, +0x0a5499e1, +0x2f03e007, +0x0001b960, +0xb9603f03, +0xec730001, +0x0b240b10, +0x070f8b31, +0x8321194e, +0x190fff4d, +0x33300732, +0x3d830e4c, +0x1c333fff, +0xab43ab1a, +0x1c2c3341, +0xf19342ab, +0x7503954c, +0x0c0f8b14, +0xab001300, +0x210c300f, +0x1e210c27, +0x9d0f6b03, +0x0e070e50, +0x000c0f8b, +0x0fab0013, +0x27210c30, +0x031e210c, +0xf2930f6b, +0x3d03954a, +0x03645e20, +0x03604fe6, +0x0000ce18, +0x93b74640, +0x0394f3f3, +0x349d4327, +0x9d442746, +0x4c274934, +0x13349d40, +0x9301a55e, +0x0394dbf4, +0x439d3027, +0x9d342713, +0x935e4643, +0x4c00e801, +0x00cefc01, +0x01454000, +0x94befe93, +0x44e39903, +0x43072027, +0x4c834153, +0x9d43ab10, +0x432744e4, +0x2746e49d, +0xe49d414c, +0x9d402713, +0xe4c54ce2, +0x49e29d34, +0x0100cdd8, +0xff4ea777, +0x40c1fbff, +0x0473996c, +0x99057299, +0xd00754e4, +0x0355e199, +0x01b9603f, +0x10dc7300, +0x0f8b340b, +0xb9602f03, +0x4d070001, +0x4d83210b, +0x31190fff, +0x4c333007, +0x8322190e, +0xab3fff3d, +0x1a1c3343, +0x2c3341ab, +0x5542ab1c, +0x0c0f8be4, +0xab001300, +0x210c300f, +0x1e210c27, +0x1d0f6b03, +0x8b0d0750, +0x13000c0f, +0x300fab00, +0x0c27210c, +0x6b031e21, +0xf8503d0f, +0x850200cd, +0xff4ea700, +0x40c1fbff, +0x61fe936c, +0x73990394, +0x39e41908, +0x097299e1, +0x3f03e007, +0x0001b960, +0x0b10ec73, +0x030f8b34, +0x01b9602f, +0x0b4e0700, +0xff4d8321, +0x0731190f, +0x0e4c3330, +0x3d832219, +0x1c333fff, +0xab43ab1a, +0x1c2c3341, +0xf19342ab, +0x150393d8, +0x0c0f8b14, +0xab001300, +0x210c300f, +0x1e210c27, +0x5d0f6b03, +0x8b0e0750, +0x13000c0f, +0x300fab00, +0x0c27210c, +0x6b031e21, +0xcbf2930f, +0x203d0393, +0x4c334c07, +0x1e4c5316, +0x9386f393, +0x50349d03, +0xd801e15e, +0x400000ce, +0x75fd9326, +0xb6860393, +0x9d404c27, +0x432713d4, +0x2746d49d, +0x49d49d44, +0x4027251e, +0x2713d49d, +0x46d49d44, +0x00cc191e, +0x4df39316, +0x4c270393, +0x13349d40, +0x349d4327, +0x9d442746, +0x30274934, +0x938af493, +0x15430503, +0x9d402743, +0x47070474, +0x437d4403, +0x435d433d, +0x0308739d, +0x3d437d44, +0x5e435d43, +0x2c070176, +0x930efd93, +0x3f2c8303, +0x2779e0c8, +0x10d29d30, +0xc554d3c5, +0x402758d3, +0x0704749d, +0x7d440347, +0x5d433d43, +0x08739d43, +0x437d4403, +0x435d433d, +0x10272d07, +0xffffeea7, +0x270d07fb, +0x0514d634, +0xc1061e0c, +0x24056ce4, +0x11032401, +0x24054653, +0xf3402403, +0x92baf293, +0x44239903, +0x41534307, +0xab104c83, +0x44249d43, +0x249d4027, +0x10239946, +0x9d414c27, +0x3fe61324, +0x4c2700fa, +0x13249d45, +0x0700f15e, +0x104c334c, +0x0710d29d, +0x072707ec, +0x1e4c5317, +0x0314ec33, +0xc4180324, +0x40276841, +0xc554d4c5, +0x302758d4, +0x7d04739d, +0x5d243d24, +0x08749d24, +0x143d147d, +0xd399145d, +0x072e0744, +0x1a2c5343, +0x21034453, +0x240b4487, +0x0c0f3cd8, +0x4ca34307, +0x44d49d0f, +0x990c2c03, +0x212344d3, +0x41534307, +0xab104c83, +0x44d49d43, +0xd49d4127, +0x10d39946, +0x9d414c27, +0xd49d48d2, +0x733fc613, +0x1e454c27, +0xc540276b, +0xd4c554d4, +0x9d302758, +0x247d0473, +0x245d243d, +0x7d08749d, +0x5d143d14, +0x44d09914, +0xffff4ea7, +0x6c42c1fb, +0xc16c43c1, +0x40076c41, +0x41533633, +0xf0003e83, +0xc02d8303, +0x104c830f, +0x40ab23ab, +0x331aec53, +0x2eab0c1c, +0x00001e83, +0x44d49dfc, +0x21ab4227, +0x9946d49d, +0x4c2710d3, +0x9dd20551, +0x350613d4, +0x9d554c27, +0xfc0113d4, +0xecc2fe41, +0x034c0740, +0x614e2e41, +0xa1161efd, +0x9b121efd, +0x0c2722fc, +0x6022be0f, +0x9b4027ff, +0x0b1e22f4, +0xffffbea7, +0x00ce27fb, +0xb4d14000, +0x41d80420, +0x00dfa3df, +0xd5fe0000, +0x270424bd, +0x0ef49b40, +0x09079383, +0xf1810833, +0x914ef493, +0x29f07503, +0x44489976, +0x449917f6, +0x1843d446, +0x7fff6da3, +0xf39b121e, +0x9b402722, +0x00070ef4, +0xf49bff8b, +0x27051e22, +0x9b02403d, +0x41d8484f, +0x86f231e6, +0xba3f9b27, +0x03fc4d27, +0x23bcf49b, +0x732d0c7c, +0xffff3de3, +0x7c0363ab, +0x93111e0c, +0x0390fbf4, +0x14464499, +0x006fa343, +0x937fff00, +0x0390ebf2, +0xe0462499, +0x5402b342, +0xe0468643, +0x5e022641, +0x43e00653, +0x44e003ae, +0x485e0639, +0x53743906, +0x184c0346, +0xf49b4447, +0x837439bc, +0x1b4c0343, +0x41a34447, +0x27bcf49b, +0xb72dbd4f, +0xbcf49b81, +0x9b404c27, +0x2499bcf4, +0x39460612, +0x83445374, +0x554c0343, +0xf49b4447, +0x072301bc, +0x084e8343, +0x4e242082, +0x27208208, +0x4e000f4f, +0x07401e84, +0x0f4c8343, +0x44f14487, +0x0001b9a4, +0x53bcf49b, +0x83430736, +0x44870f4c, +0xb9a444f1, +0xf49b0001, +0x073653bc, +0x0f4c8343, +0x44f14487, +0x0001b9a4, +0x53bcf49b, +0x3c3c8334, +0xb9a434f1, +0xf49b0001, +0x35f493bc, +0x43110390, +0x4e834307, +0x24208208, +0x2082084e, +0x000f4f27, +0x401e844e, +0x4c834307, +0xf144870f, +0x01b9a444, +0xbcf49b00, +0x43073653, +0x870f4c83, +0xa444f144, +0x9b0001b9, +0x3653bcf4, +0x4c834307, +0xf144870f, +0x01b9a444, +0xbcf49b00, +0x3c833453, +0xa434f13c, +0x9b0001b9, +0xf493bcf4, +0x21038fd8, +0x83430743, +0x2082084e, +0x82084e24, +0x0f4f2720, +0x1e844e00, +0x83430740, +0x44870f4c, +0xb9a444f1, +0xf49b0001, +0x073653bc, +0x0f4c8343, +0x44f14487, +0x0001b9a4, +0x53bcf49b, +0x83430736, +0x44870f4c, +0xb9a444f1, +0xf49b0001, +0x833453bc, +0x34f13c3c, +0x0001b9a4, +0x93bcf49b, +0x038f7bf4, +0x43074331, +0x82084e83, +0x084e2420, +0x4f272082, +0x844e000f, +0x4307401e, +0x870f4c83, +0xa444f144, +0x9b0001b9, +0x3653bcf4, +0x4c834307, +0xf144870f, +0x01b9a444, +0xbcf49b00, +0x43073653, +0x870f4c83, +0xa444f144, +0x9b0001b9, +0x3453bcf4, +0xf13c3c83, +0x01b9a434, +0xbcf49b00, +0x8f1ef293, +0x10239903, +0x33877439, +0xb9e433f1, +0x4c330001, +0x004e830f, +0x430b0600, +0x99bcf49b, +0x73194424, +0x530f4c83, +0x87448734, +0x3444f133, +0xf10001ba, +0x01b9f433, +0x9b430b00, +0x7419bcf4, +0x83442399, +0x4d4c0343, +0x44473453, +0x04363fe6, +0xf49b41a3, +0x19c127bc, +0x27320c74, +0x834253c0, +0x514c0343, +0x4cab4447, +0x39041b5e, +0x408ca373, +0x46534307, +0x47184c03, +0xbcf49b44, +0x3c033383, +0xa333471b, +0xbcf39b31, +0x2dbd4f27, +0xf49b81b7, +0x414c27bc, +0x27bcf49b, +0x9b03fc4d, +0x2299bcf4, +0x73420748, +0xcb320741, +0xab327342, +0x1544d843, +0x44034207, +0x03104c08, +0x604fa344, +0x9b820293, +0x0e1ebcf4, +0x24232408, +0x53602fa3, +0xf29b820e, +0x4df493bc, +0x4399038e, +0x87743910, +0xe433f133, +0x330001b9, +0x4e830f4c, +0x0b060000, +0x03965e43, +0xfe717439, +0xeda34653, +0xb8071000, +0x75184c03, +0xa34447fe, +0xf49b80bc, +0x837439bc, +0x1b4c0343, +0x41a34447, +0x27bcf49b, +0xb72dbd4f, +0xbcf49b81, +0x9b404c27, +0x7439bcf4, +0x43834453, +0x47554c03, +0x9b41a344, +0x2301bcf4, +0x4e834307, +0x24208208, +0x2082084e, +0x000f4f27, +0x401e844e, +0x4c834307, +0xf144870f, +0x01b9a444, +0xbcf49b00, +0x43073653, +0x870f4c83, +0xa444f144, +0x9b0001b9, +0x3653bcf4, +0x4c834307, +0xf144870f, +0x01b9a444, +0xbcf49b00, +0x3c833453, +0xa434f13c, +0x9b0001b9, +0xf293bcf4, +0x99038d90, +0x74391023, +0x33f13387, +0x0001b9e4, +0x830f4c33, +0x0600004e, +0xf49b430b, +0x442499bc, +0x4c837319, +0x8734530f, +0xf1338744, +0x01ba3444, +0xf433f100, +0x0b0001b9, +0xbcf49b43, +0x23997419, +0x03438344, +0x34534d4c, +0x37464447, +0xf49b41a3, +0x190127bc, +0x27320c74, +0x83425300, +0x514c0343, +0x40ab4447, +0x5ebcf49b, +0x743902a7, +0x4c034653, +0x9b444718, +0x7439bcf4, +0x83492399, +0x1b4c0343, +0xe01e33c0, +0xf600b534, +0x4700b53f, +0x9b41a344, +0x2499bcf4, +0xf1448750, +0x01bab044, +0x00a25e00, +0x41a34447, +0x27bcf49b, +0xb72dbf4f, +0xbcf49b81, +0xc04c2499, +0x4c271443, +0xbcf49b49, +0x87502499, +0x9444f144, +0x1e0001ba, +0x484c2704, +0x93bcf49b, +0x038cbff3, +0xc04d3499, +0x4c271443, +0xbcf49b49, +0x87513499, +0x9444f144, +0x1e0001ba, +0x484c2704, +0x93bcf49b, +0x038c9bf3, +0xc04e3499, +0x4c271443, +0xbcf49b49, +0x87523499, +0x9444f144, +0x1e0001ba, +0x484c2704, +0x93bcf49b, +0x038c77f3, +0xc04f3499, +0x4c271443, +0xbcf49b49, +0x87533499, +0x9444f144, +0x1e0001ba, +0x484c270c, +0x4447071e, +0xff1e031e, +0x93bcf49b, +0x038c4bfd, +0xc049d499, +0x44e05843, +0x4ff6012e, +0xd4990117, +0x51413850, +0xbff49bd4, +0x9934d399, +0x430735d2, +0xab104c33, +0x33320743, +0x43ab183c, +0x42ab2833, +0x1554d4c5, +0x50d49974, +0xd4614238, +0x99bff49b, +0xd29936d3, +0x33430737, +0x43ab104c, +0x3c333207, +0x3343ab18, +0xc542ab28, +0xc45e58d4, +0x50d49900, +0xd4514138, +0x99bff49b, +0xcd0751d4, +0x381ccc03, +0x9bd47141, +0xd499bff4, +0x93415852, +0x038bdff1, +0xf49b1441, +0x53d499bf, +0xc4414138, +0x99bff49b, +0xd39940d4, +0x41d09938, +0x99104c33, +0xde9939d2, +0x3334ab3c, +0xd199180c, +0xab28333d, +0xab30ab4e, +0x3340ab32, +0xc541ab18, +0x741554d3, +0x0750d499, +0x3824232c, +0x9bd46142, +0xd499bff4, +0x033c0751, +0x81423834, +0xbff49bd4, +0x3852d499, +0x9b244142, +0xd499bff4, +0x41423853, +0xbff49b34, +0x9342d499, +0x038b91fc, +0x993ad399, +0xc23943d0, +0x99104c33, +0xfc933ede, +0xab038b82, +0x180c3334, +0x4eabc139, +0x283330ab, +0x40ab32ab, +0xd3c51833, +0x2541ab58, +0x1e141e74, +0x22f39bff, +0xf49b4027, +0x8b00070e, +0x22f49bff, +0x3c27041e, +0xb84f9b40, +0x40004dd8, +0x05f293e5, +0x2499038b, +0x83731944, +0x34530f4c, +0x33874487, +0xba3444f1, +0x33f10001, +0x0001b9f4, +0xf49b430b, +0x997419bc, +0x43834423, +0x534d4c03, +0x46444734, +0x9b41a337, +0xe127bcf4, +0x320c7419, +0x4253e027, +0x4c034383, +0xab444751, +0xbcf49b4e, +0x8ab6f393, +0x12349903, +0x349949a6, +0x0f4cd844, +0x53743925, +0x03438344, +0x4447554c, +0x1ebcf49b, +0x53743915, +0x184c0346, +0x41a34447, +0xabbcf49b, +0x1e031e6f, +0x93b807ff, +0x038a7ffd, +0x99728fc6, +0xd29911dc, +0x27c53047, +0x07031e45, +0xf144874c, +0x01bad443, +0x96412700, +0x33402724, +0x430b114c, +0xd0bcf49b, +0x4c073ec5, +0xd4074523, +0xad07df6b, +0xdb7f9f27, +0x0c1e83c6, +0x07bcf99b, +0x0745234d, +0x07df6bd4, +0xbe15270a, +0x87fef86b, +0x1b400b40, +0x6b45234c, +0xe1d4ce4f, +0x44f14d87, +0x0001bac0, +0x93bcf49b, +0x038a13f4, +0x9d114099, +0x191e4740, +0xd49d4027, +0x9b121e47, +0x402722f3, +0x070ef49b, +0x9bff8b00, +0x051e22f4, +0x02403d27, +0xd8484f9b, +0xf171e641, +0x9bb4f19b, +0xfb9bbaf6, +0xc6f251b9, +0xf493622f, +0x99038a30, +0xf3112244, +0x43834103, +0x44e94333, +0x0005f0e8, +0x43ce4223, +0xe8051e15, +0xa7061ef3, +0xfdefff2e, +0x33272411, +0xfc6a4ddc, +0x01f493ef, +0x4499038a, +0x33fc1122, +0xe44f0343, +0x690005f0, +0x0b444943, +0xce432343, +0x051e16c4, +0x061ef3e8, +0xefff2ea7, +0x3c24c1fd, +0x4ddc3327, +0x93eefc6a, +0x038973f4, +0x53134e99, +0x997e3d81, +0x73991341, +0x0d74990c, +0xb90082f9, +0x81530001, +0xb94088f9, +0x320b0001, +0xf221410b, +0x9d0d749d, +0x781d0c73, +0x2103f031, +0x2fab0103, +0xf035f901, +0x7c03f225, +0x41f1210c, +0xd921eef2, +0x9b121eeb, +0x0c2722fd, +0x57c2be0f, +0x9b4027ff, +0x0b1e22f4, +0xffffcea7, +0x00de27fb, +0xc4d12000, +0x42d80420, +0x9b121edf, +0x402722f3, +0x070ef49b, +0x9bff8b00, +0x051e22f4, +0x02403d27, +0xd8484f9b, +0x4f9be641, +0x0c7c23ba, +0x742df351, +0x01313fe6, +0x8936f393, +0x22349903, +0x43834103, +0x11231407, +0x21071383, +0x349d2333, +0x49230b22, +0x39f49323, +0xe3070386, +0x3387e433, +0x4d012001, +0x2ea7e32b, +0x1efdefff, +0xc1f3e803, +0x33273824, +0x53184c33, +0x44c01d4c, +0xe91333f1, +0x05f0ea14, +0x1f2ea700, +0x1407fde7, +0x44871433, +0x2005142b, +0x00272115, +0x20353d07, +0xe70f4ea7, +0x053e0bfd, +0x27411543, +0x93403530, +0x0388c3f1, +0x88c2f093, +0x89e42703, +0x23072014, +0x040d439b, +0x83201489, +0x2d420323, +0x22129d04, +0x08033103, +0x0207fe20, +0x14890103, +0x07038320, +0x03233320, +0xadf39342, +0x2df10385, +0x0005f0e4, +0x3101e407, +0x2ea7efab, +0x1efdefff, +0x01f3e803, +0x33332724, +0x4c53184c, +0xf244c01d, +0x3ea74e07, +0x87fde7ff, +0x2b44332e, +0x15310542, +0x35102734, +0xef2ea731, +0x2d05fde7, +0x40072415, +0x4f034333, +0x0005f0e4, +0x4e6d3027, +0x2135434d, +0x8836f493, +0xff0ea703, +0x439dfdef, +0xe8031e22, +0x3c04c1f3, +0x4ddc3327, +0x1ef5fc6a, +0x1ef3e805, +0xff2ea706, +0x2411fdef, +0x4ddc3327, +0x91effc6a, +0x680d03f0, +0x554dbe02, +0xa73527ff, +0xfdeddf4e, +0xefff2ea7, +0x1e4305fd, +0x81f3e803, +0xdc332724, +0xf6fc0a4d, +0x24d54327, +0x0ea70218, +0x61fdefff, +0xfc48dc04, +0x01d51427, +0x01d50218, +0x3027021c, +0x065803d5, +0xebe72ea7, +0x272305fd, +0x8300004f, +0x9b241508, +0x01d50ef3, +0x03d50220, +0x4327065c, +0x022404d5, +0xefff3ea7, +0xdc3491fd, +0x4427fc48, +0x022434d5, +0xebdf2ea7, +0x054027fd, +0x003f2724, +0x15090300, +0x0ef49b23, +0xf2c30027, +0x0000f58e, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x07030200, +0x0d110804, +0x0e091205, +0x0b100f0a, +0x24212001, +0x282c2522, +0x29262d23, +0x132b2a27, +0x14191806, +0x1c2e151a, +0x1d162f1b, +0x0c1f1e17, +0x111e1d03, +0x0825121f, +0x09132620, +0x020b0a14, +0x15222110, +0x04271623, +0x05172824, +0x01070618, +0x192b2a29, +0x0c2e1a2c, +0x0d1b2f2d, +0x000f0e1c, +0x06080400, +0x0e0c0a02, +0x00000010, +0x00170500, +0x0005f146, +0x0005f10c, +0xf0e3f54e, +0x19339007, +0x83070403, +0xc407b207, +0xff32adbe, +0xd0078f6b, +0x042704e6, +0x27048f5e, +0xb6f49b40, +0x21832c07, +0x87d29c99, +0x0041f142, +0x930005a3, +0x031053fe, +0x5e56f493, +0x9f3ea703, +0xe021fde7, +0x05164c9d, +0x27301531, +0x3d35164c, +0xe78f3ea7, +0x153405fd, +0x213d3530, +0x7f3ea7e1, +0x4103fde7, +0x340521c3, +0x22f12287, +0x0005a300, +0x4ea73115, +0x35fde76f, +0x1542053d, +0x464d3541, +0x071b07b6, +0x03180309, +0x2702680d, +0x2e0ebe20, +0x278546ff, +0x050f220d, +0x27071ef0, +0x0501222d, +0x89fd01f2, +0xdde35493, +0xf4930300, +0x99035de4, +0xdda33c44, +0x31241000, +0x0800dde3, +0x2000dda3, +0xcc33c407, +0xffaea719, +0xbe27fbff, +0x1e400000, +0x22fb9b10, +0xbe0f0c27, +0x27ff2bd8, +0x22f49b40, +0x0420a4d1, +0xabeb41d8, +0x24add5dc, +0x9b402704, +0xf7010ef4, +0x7de38833, +0xb0270800, +0x5d92fc93, +0x007da303, +0x036ea720, +0x5127f9e8, +0x8000ad27, +0xfb15f825, +0x9b02b75e, +0x402722fa, +0x070ef49b, +0x9bff8b00, +0x4f9b22f4, +0xec40c8b7, +0x07b71f9b, +0x5494898b, +0x8103e107, +0xffffef83, +0x485207ff, +0x43834807, +0x07b6f49b, +0x07310741, +0xe04d8321, +0x003d8301, +0x002e831e, +0x012701e0, +0x00274496, +0x01274007, +0x00273496, +0x01273007, +0x00272496, +0x44472007, +0x23333387, +0x1c180027, +0xab01271e, +0xab43ab40, +0x001e5842, +0x1f3c0600, +0x07f80000, +0x1e104ca3, +0x00ef180a, +0xa307f800, +0xf311204c, +0x0717c49d, +0x0709072e, +0xbe3fab1c, +0x89000304, +0x48d25494, +0x2e422351, +0x1efd014b, +0x1ed70719, +0x002e2715, +0xf29b4000, +0x0f0c2722, +0xff2ae3be, +0xf49b4027, +0xff3ea722, +0x34d1fbff, +0x41d80420, +0x00dfa3e1, +0xd5fe0000, +0x2704243d, +0x0ef49b40, +0x4d27141e, +0xf49b0220, +0x9b402722, +0x00070ef4, +0xf49bff8b, +0x484f9b22, +0xc6e841d8, +0x1ed02754, +0x39df9b09, +0x053a4f9b, +0xd8c40164, +0x2710804c, +0x61641540, +0x035127c4, +0x5ec46541, +0x94990196, +0x6145667d, +0x41f49bc4, +0xc4654027, +0x4c33c401, +0x1d4c5315, +0x00d043e0, +0x4fc64454, +0x9442e07c, +0x01275e00, +0x012347f4, +0x1c070907, +0x000638be, +0x443dc499, +0x7d949944, +0x1e3541c4, +0x164cc40b, +0x7d94992f, +0x532942c4, +0x01fd7ff0, +0x53f29303, +0x9199035c, +0x2b01277d, +0x19114423, +0x1e455634, +0x19124409, +0x27441034, +0x58310300, +0x27031ef2, +0x17c49901, +0x920044f9, +0xf49b0002, +0x16c49941, +0x00b64fe6, +0xf817c499, +0x00ae0f4c, +0x00aa0fe6, +0xf49b4027, +0x00a25e40, +0x9b3dc499, +0xc49941f4, +0x41f49b14, +0x4b15c499, +0x42f49b4f, +0x02001d27, +0x9900ad5e, +0xf49b3dc4, +0x40fa9b41, +0xfd0ef053, +0x34010301, +0x02004d38, +0x1e40fa9b, +0xc04d830f, +0xa3463303, +0x0300004e, +0x0340f49b, +0x1c3fc434, +0xdf0005f1, +0xc499411e, +0x41f49b3d, +0xe616c499, +0x9b402744, +0xf35340f4, +0x3201fcd4, +0x14272301, +0x43073653, +0x330f4c83, +0x38380c4c, +0x1e40fa9b, +0x004ea309, +0xf49b0300, +0x20365340, +0xc42403f1, +0x05f11c2f, +0xc499d700, +0x41f49b14, +0xf917c499, +0x02923044, +0x41f49b00, +0x4617c499, +0x15c49945, +0xf49b4f4b, +0x1e102742, +0x27ff1e16, +0x9b02200d, +0x402722f0, +0x070ef49b, +0x9bff8b00, +0x4f9b22f4, +0xe841d848, +0x4127f211, +0x40272496, +0xc3994733, +0x39fd9b17, +0xf29b6211, +0x83f0213a, +0x33473f3c, +0x31ab30ab, +0xf39b34ab, +0x33b38338, +0xb4fb9bb8, +0xf2115027, +0x21036403, +0xb807f215, +0x07549489, +0xfad403d6, +0x1efd51b4, +0x22fc9b12, +0xbe0f0c27, +0x27ff28d0, +0x22f49b40, +0xbea70b1e, +0x27fbffff, +0x200000ce, +0x0420b4d1, +0x1edf42d8, +0x22f39b12, +0xf49b4027, +0x8b00070e, +0x22f49bff, +0x3d27051e, +0x4f9b0220, +0xe641d848, +0x4f9b5536, +0x05d4233a, +0x030907d4, +0xbe02680d, +0x27ff278f, +0xdf4ea735, +0x2ea7fded, +0x05fdefff, +0xe8031e43, +0x272481f3, +0x0a4ddc33, +0x4327f6fc, +0x021824d5, +0xefff0ea7, +0xdc0461fd, +0x1427fc48, +0x021801d5, +0x021c01d5, +0x03d53027, +0x2ea70658, +0x05fdebe7, +0x004f2723, +0x15088300, +0x0ef39b24, +0x022001d5, +0x065c03d5, +0x04d54327, +0x3ea70224, +0x91fdefff, +0xfc48dc34, +0x34d54427, +0x2ea70224, +0x27fdebdf, +0x27240540, +0x0300003f, +0x9b231509, +0x00270ef4, +0xf58ef0c3, +0x4ea7f54e, +0xc1fbffff, +0xf1a36c4e, +0xc007be47, +0xb0c83fab, +0x27e0281f, +0xc1361e00, +0x20276c44, +0x0a330407, +0x181a0c53, +0x0000004f, +0x07212708, +0x07121e42, +0x530a330e, +0x40271a0c, +0x0000ef18, +0x41270800, +0x45464f6b, +0xffff4ea7, +0x6c44c1fb, +0xac53ab07, +0x27a4201d, +0x07171ed0, +0x104c334e, +0x271e4c53, +0x27410020, +0xc3420721, +0x6bd40741, +0x3c1299df, +0x993602ce, +0x47361714, +0x38b6d6f6, +0x30074127, +0xf455322b, +0x9d104c27, +0x139d1714, +0x070c1e15, +0x27422b40, +0x9df35530, +0x109d1514, +0x27131e3c, +0x9df45540, +0x0a1e1514, +0x00274027, +0x5515149d, +0xd4c499f0, +0x13992327, +0x03249b15, +0x42071a2c, +0x40133f4b, +0x42474352, +0x071e340b, +0x4247323a, +0x139d342b, +0x3ab0c815, +0x077dc499, +0x6c44f93e, +0x83000292, +0x149d3f3c, +0x004d273d, +0x14139d03, +0x31071405, +0xdea70027, +0x27fbffff, +0x1504d624, +0xc1061e1e, +0x34156cd4, +0x34030103, +0xce5ef270, +0x7ea4c402, +0x4e073e07, +0x333f3c83, +0x139d104c, +0x1e4c5314, +0x273a41c4, +0x99140540, +0x2e077dc4, +0x33171e99, +0x43f9142c, +0x0002926c, +0x071a2c53, +0x5321034e, +0x87230b44, +0xd8240b44, +0x070c0fec, +0x0f4ca34e, +0x0317149d, +0x129d0c2c, +0x027f5e3d, +0x02004d27, +0xc4991405, +0xf931077d, +0x02926c44, +0x9d002700, +0xdea73d14, +0x27fbffff, +0x1504d624, +0xc1061e1e, +0x34156cd4, +0x34030103, +0x4e5ef270, +0x7dcc9902, +0xfc05be07, +0xce07f001, +0x3317bc33, +0x4e0716cc, +0x531fbc53, +0x4c331fcc, +0x4601c410, +0xc01c4c53, +0x45341b44, +0x1e3943d4, +0x3447d428, +0x4c334e07, +0x53302712, +0x72271e4c, +0x5f1ef345, +0x149d4027, +0x004d273d, +0xf8140504, +0x400000ee, +0x6f1e00af, +0xf4454027, +0xf425f435, +0x44277427, +0x1e00915e, +0x1c4c53ff, +0x41d44334, +0xc06a1e10, +0x44f03a44, +0x47f40089, +0x091e0085, +0xf0350027, +0x661ef025, +0x4c334e07, +0x1e4c5312, +0x41043127, +0x43073027, +0x44030127, +0xf0457227, +0x149d3027, +0x004d273d, +0x25f33505, +0x474f1ef3, +0x9d4bab4c, +0x4d273d14, +0x14050400, +0x0000eed8, +0xf4511340, +0x70274d76, +0x04804d27, +0xf735f745, +0x2a1ef725, +0x0000eed8, +0x341e2a80, +0xee184027, +0x27400000, +0x274f6b41, +0x35f42501, +0x273027f0, +0x27f34574, +0x149d164c, +0x004d273d, +0x1e140506, +0x27ff1e19, +0x45712740, +0x25f435f4, +0x270b1ef4, +0x45012770, +0x25f035f7, +0x073027f7, +0x07f31567, +0xec6103a1, +0x2700f170, +0x00ec5e61, +0x44d6f411, +0x191ede07, +0xffff0ea7, +0x6c0dc1fb, +0xcd07bd07, +0x3317bc33, +0xbc5316cc, +0x1fcc531f, +0x3c333d07, +0x1c3c5310, +0x41234307, +0x270942d4, +0x35822730, +0x16171ef3, +0x00ded836, +0x27098000, +0x27c027b0, +0x27071e80, +0x27f43540, +0x27f01181, +0x07504790, +0xcc010308, +0x01275b80, +0x2907571e, +0x3287250b, +0x9746310b, +0xffff4ea7, +0x6c4ec1fb, +0xce07be07, +0x3317bc33, +0xbc5316cc, +0x1fcc531f, +0xb6a69103, +0xffff4ea7, +0x6c4ec1fb, +0x4c534e07, +0x1e348d10, +0x041c3e8d, +0x87210381, +0xa6310b32, +0xff4ea7c6, +0x4ec1fbff, +0x534e076c, +0x348d104c, +0x1c3e8d1e, +0x47a8f0f0, +0x9d4bab4c, +0x74c442a4, +0x013d0722, +0x123c33f0, +0x241e3c53, +0x3ea39d01, +0x8234111e, +0x1e3ea49d, +0x4731030a, +0x9d430b44, +0xf3113ea4, +0x3103a103, +0xf6f8f315, +0xf041ff14, +0x12990786, +0x43139942, +0x420b4247, +0x33f9340b, +0x0002925c, +0x0b3d1499, +0x3d149d43, +0x36e6f331, +0x44c6f421, +0x0526f051, +0x149d4027, +0x27071e3d, +0x0504804d, +0x8ef18314, +0x99fa4ef5, +0xf39b3d13, +0x7d049941, +0x070941c0, +0x07450343, +0xc03f6b34, +0x35543a34, +0x33f43706, +0x1a1e0176, +0x36f43934, +0xfa8e0085, +0x671b3ce4, +0x00a35e01, +0x891e1489, +0x905e1c13, +0x1e148900, +0x331c1389, +0x43ab104c, +0x8946f49b, +0x13892614, +0x99791e24, +0x13993f14, +0x104c333e, +0xf49b43ab, +0x41149945, +0x33401399, +0x43ab104c, +0x2745f49b, +0x27210700, +0x334007e4, +0x89410b43, +0x44891e43, +0x103c331c, +0x404734ab, +0x0346f39b, +0x99348741, +0x310b3e24, +0x34894606, +0x1c33891e, +0xab104c33, +0x46f49b43, +0x21030103, +0x8ecbfef0, +0x421299fa, +0x890f21d8, +0x13891e14, +0x104c331c, +0xf49b43ab, +0x1d22f846, +0x22148901, +0x33201389, +0x43ab104c, +0x8e46f49b, +0x3f1499fa, +0x333e1399, +0x43ab104c, +0x9945f49b, +0x13994114, +0x104c3340, +0xf49b43ab, +0x07a02745, +0x270107b1, +0x3e0499c4, +0xc01241c0, +0x44230f43, +0x31274f6b, +0x30274210, +0x031e4347, +0x24074127, +0xda47e027, +0x40cc2103, +0x1e212715, +0x1e348911, +0x331c3389, +0x43ab104c, +0x0346f49b, +0x0b4e07e1, +0x0b34874d, +0x03f22831, +0xf00103a1, +0xd027b8fc, +0xb399e427, +0x0732233e, +0x034f6b43, +0x27423432, +0x230f1e41, +0x6b430736, +0x1031274f, +0x47302742, +0x043d4743, +0x87310341, +0x1c2c0323, +0x210b0407, +0x40cc0103, +0x1e012713, +0x0924290f, +0x104c3323, +0xf49b43ab, +0x78240346, +0x03d103f0, +0xb3fef0b1, +0x1099fa8e, +0x0f01d842, +0x891e1489, +0x4c331c13, +0x9b43ab10, +0x129946f4, +0x0f21d843, +0x89261489, +0x4c332413, +0x9b43ab10, +0x02d846f4, +0x2214890f, +0x33201389, +0x43ab104c, +0xd846f49b, +0x14890f22, +0x2813892a, +0xab104c33, +0x46f49b43, +0x0000fa8e, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x071e03dc, +0xab483341, +0x07140741, +0x101c3332, +0x14ab3253, +0x071e3103, +0x24230105, +0xf3b80403, +0x011d2506, +0xf2c80103, +0xf393fe0b, +0x0102cf5c, +0x3a4f2034, +0xc000032c, +0x032f604f, +0xff1e0b00, +0x059ef453, +0xfe0b3405, +0x0270f453, +0x30273405, +0x714af493, +0x06439d03, +0x7a9efe0b, +0xfe4efe08, +0x049d4127, +0x27f43e06, +0x9efe8e04, +0xa7fe0857, +0xffffff2e, +0xd14403c1, +0xce069424, +0x23d50e34, +0x0ea70694, +0x39fffaf3, +0x0b449604, +0xa6a69efe, +0xf9f493fe, +0x431902ce, +0x4ea72127, +0x9dfeffff, +0x35260b42, +0xb9daf493, +0x0b421d03, +0x933127fe, +0x0370ebf4, +0x1e64439d, +0xa7fe4ed9, +0xfeffff4e, +0x83094399, +0x33438733, +0xf9342b34, +0x00004d33, +0xa73726ff, +0xffffff4e, +0x0e184eb9, +0xe08bef4b, +0x2719e1ce, +0xf0210320, +0x012705f3, +0x24f9fe8e, +0xff000e18, +0x408b4f4b, +0x27eb4ece, +0xa7fe8e00, +0xffffff4e, +0xb9fc43c1, +0xca010044, +0x430b1303, +0x830e40c2, +0x03330f0c, +0x007c00f9, +0xfe0bff00, +0xfe0b0027, +0x40ab4107, +0xd01843dc, +0x42071524, +0x42534423, +0x13014103, +0x03052423, +0x04031403, +0x2586f498, +0x11031419, +0x0103041d, +0xfe0bf2a8, +0x25862253, +0x14031401, +0x04030405, +0xfe0bf2a8, +0x01f50533, +0xff021800, +0x180403f5, +0x4027ff02, +0xe8000e23, +0x030435fd, +0xfde8000e, +0x181002f5, +0x03f5ff02, +0xff021814, +0xe7f00e23, +0x0b0435fd, +0x07f64efe, +0x5d2fc6b2, +0xa0079107, +0xcde2f793, +0x406c2702, +0xefff8ea7, +0x10db07fd, +0xd60741bc, +0xc4077401, +0x41c3c633, +0xce237405, +0xd1fefdb4, +0x33010c84, +0x4c53184c, +0xf442cc1d, +0x23032d07, +0x0c0723e3, +0x797e1907, +0x9b4027ff, +0x0c270ef4, +0x07bd2b21, +0x072a071c, +0xff767e3d, +0xad0bb506, +0xb61e9d0b, +0x0333f68e, +0x04f10403, +0xff021000, +0xfc6a4dd8, +0xe8432710, +0x0003f1f4, +0xdcff0210, +0xf2fc6a3d, +0xfc4efe0b, +0x6f82fe93, +0xd4e4d103, +0xd6100702, +0x3ff49345, +0x0c27fdd2, +0x8e14150d, +0xff3ea7fc, +0x32d1ffff, +0x44211558, +0x4183422b, +0x42e94447, +0xff00155c, +0x156043e9, +0x32caff00, +0xbd4127d5, +0xd1024604, +0x27025403, +0xd4ecd140, +0x3c04c502, +0x070f3c83, +0x33cd7103, +0x5337330a, +0x2b0725f4, +0x83141503, +0x012000de, +0xab480f03, +0xd7960006, +0x02d8e4d1, +0x032a0389, +0xd8e4d541, +0x103cd802, +0x27402722, +0x5e149d00, +0x04c1fc8e, +0xab2027e8, +0xe804c54d, +0x831ec389, +0x3603bd31, +0x0ef29b03, +0x0027cf1e, +0xf94efc8e, +0x6edef993, +0xbdfb9303, +0x402703b7, +0x0765949d, +0x07b411ab, +0x8b0a07da, +0xf6c007f4, +0x46a41906, +0xa7302742, +0xfeffff4e, +0x1e5443bd, +0x0c07b31d, +0x3027f98e, +0x04cca31d, +0xff4ea719, +0x43bdfeff, +0x03c41e54, +0xfd287e0a, +0x0c07c027, +0x02c4f98e, +0x8df093de, +0x5c7e036e, +0x059499fd, +0x4ea74916, +0x11feffff, +0xff2ea743, +0x24d1ffff, +0x33870694, +0x153034f5, +0x3127ff00, +0xcfff4ea7, +0xc50c07fd, +0xf98e6443, +0xf093c44c, +0x0e036e58, +0xfd145ef9, +0x01be0c07, +0xef1efd25, +0x4ea7fa4e, +0x01fd8fff, +0xfca0074b, +0xd8014db8, +0x040000be, +0x21f49315, +0x421902cc, +0xf4933127, +0x1d02cc10, +0x3e2ff643, +0x00bef801, +0x00cc8000, +0xf4932127, +0x1d02cbfc, +0xff3ea742, +0x3201fd4f, +0xffff1ea7, +0x272287ff, +0x2113b940, +0x4024f50e, +0xf6ff02b0, +0x9300f63f, +0x02cbdff4, +0x10994319, +0x26129927, +0x14d135c6, +0x463606a4, +0x06a814d1, +0x14994576, +0xee44c610, +0x7e010702, +0xdea7fcc1, +0xa7fff95f, +0xfd4fffce, +0xc301d419, +0x41dc437b, +0x5d4ea70f, +0x4319fff9, +0x327bc201, +0xbe5231d8, +0x19fe31ea, +0x7bc301d4, +0x1741d843, +0x2127d319, +0x1207c401, +0x31eb143b, +0x4ea7d31d, +0xc5fdcfff, +0x1ea76842, +0x19fff95d, +0x7bc30114, +0x1741d843, +0x21271319, +0xe207c401, +0x3eebe43b, +0x4ea7131d, +0xc5fdcfff, +0x05466c42, +0xf49b4027, +0x38c4c50e, +0x4ea73127, +0xc5fdcfff, +0xbe586043, +0x93020000, +0x02cb37f4, +0x37d64319, +0x2610bcdc, +0xffff4ea7, +0x2442d1ff, +0xa725a60e, +0xfdafff3e, +0x420b3441, +0xfa8e3405, +0xf4933127, +0x1d02cb08, +0x10bcd843, +0xa73127dc, +0xfdafff4e, +0x43550a07, +0xfd64bfbe, +0xf1930927, +0x9efe55cc, +0x93fe008b, +0x02caebf4, +0x39064319, +0xfd290cbe, +0x0027ff1e, +0xe6be1a07, +0xac5efd64, +0xa73027fe, +0xfd4fff4e, +0x43b50027, +0xfdf93cbe, +0x5efbe47e, +0xe7befeb1, +0xd91efd24, +0xffff4ea7, +0x4843d1fe, +0xf33fe601, +0xfeed5efe, +0xd007fd4e, +0x08031d07, +0x02ac1d03, +0xbe482c27, +0x36fd829c, +0x93d27107, +0x036c9ff4, +0x02d443d1, +0x0254d2d5, +0xfd0cf453, +0xd4153225, +0xfd4efd8e, +0xffff4ea7, +0x274d99ff, +0xce264199, +0x44b90c1d, +0x48b6152c, +0x8613d2c0, +0xbefd8ed4, +0x46fd255b, +0x0e002703, +0xadad9efd, +0x6323befd, +0x270186fd, +0x9efd0e02, +0x93fdad9f, +0xfe634df0, +0x96be2d07, +0xd11efdfc, +0xf493fd4e, +0x2903bbc0, +0xce430942, +0xd0272632, +0x6b6ef493, +0x40429903, +0x2e414399, +0x8e0d0732, +0xa83dbefd, +0x270dabfd, +0x27048640, +0x07d40741, +0x93fd8e0d, +0x036a7ff4, +0x2c032407, +0xe33407c3, +0x3ce37f2c, +0x0334197f, +0x32c2803c, +0x1ed027f9, +0x61f0930c, +0xb8be036a, +0xd127fdaf, +0x6a56f093, +0xf8c8be03, +0x1e0196fd, +0xff3ea7a8, +0x34d1fdef, +0x4dd8010c, +0x0710fc6a, +0xe8432723, +0x0c23d1f4, +0x6a3ddc01, +0xfe0bf4fc, +0xf693f54e, +0xc1036bb8, +0x4027446a, +0x8365649d, +0x00000faf, +0xc1f0a380, +0xa0e85069, +0x643902d0, +0x01194ff6, +0x4cf46459, +0xc1019610, +0x70278061, +0x27102c27, +0x07373b31, +0xe6418b43, +0x0302ec4f, +0xc1f27871, +0x979d3c94, +0x06449950, +0x949d1a07, +0xc14a0751, +0x4733446b, +0x93c11a33, +0x07142b34, +0x07f11547, +0x33433321, +0x95991cbc, +0x1c2f0338, +0xab00069b, +0xa9f405b3, +0x01105421, +0x5223a9f0, +0x834b0710, +0xffffff4f, +0xcc04f50f, +0x9bff0005, +0x07533331, +0xd003f585, +0x03ff0005, +0x069b1c8f, +0x8522b900, +0x4461c113, +0x01088da9, +0x010a8ca9, +0xf560929d, +0x069ba001, +0x4dcdf200, +0x205cf102, +0x0700069c, +0x0be333ed, +0x23da46ec, +0x07e301e8, +0x5343cb4b, +0xe8031c4c, +0x4b074876, +0x40cc432b, +0xd9f4931b, +0x4379036a, +0x2e073926, +0x07102c23, +0x23e2071d, +0xf8e803d1, +0x0701d9f1, +0x1c2f0325, +0xa900069b, +0xf2010823, +0x0100eb3d, +0xd3b4eee4, +0x8063c100, +0x473b4127, +0xf09334eb, +0xc5036aa0, +0x6c7e8063, +0xa73027f9, +0xfeffff4e, +0x1e5443bd, +0x27f9197e, +0x830d07d0, +0xe0f58ef0, +0xa7011c41, +0xfffaf30e, +0xfea0a0be, +0x0fe0d007, +0xffffffff, +0xc0070260, +0xc0f1c333, +0xff000520, +0x19079209, +0x7efa507e, +0x9409fe7d, +0x6a52fb93, +0x1cc4f503, +0xc1ff0005, +0x96c56866, +0xfd42275c, +0x000510d4, +0xf30ea7ff, +0x0439fffa, +0x016f4ff6, +0x0b07c027, +0xfc7ebc3d, +0xff4ea7f8, +0x4cbdfeff, +0xab7e1e54, +0x05b499f8, +0xd0274556, +0xf0830d07, +0xbdbef58e, +0x0296fd20, +0x27f8c57e, +0x830d07d0, +0x27f58ef0, +0xf09316dc, +0x7e0369f8, +0x6499f8c7, +0xd94fc605, +0x9dbe0d07, +0xf093fd20, +0x830369e4, +0x5ef50ef0, +0xf001f89e, +0xffff4f83, +0x2cd10fff, +0x04f50104, +0xff0005d0, +0x3c0b3333, +0x07253ec2, +0x07182313, +0x23031e21, +0x01241118, +0x05341520, +0x104c3430, +0x43f54333, +0x00069ba4, +0x31072823, +0x07e5e1ca, +0x1c3f0335, +0xa900069b, +0x11010834, +0x03f101f2, +0xa41ef541, +0xad00069b, +0x05010834, +0x03e715eb, +0x069b1c2f, +0x3824b900, +0xbd410310, +0x59103824, +0x03412763, +0x5d643d31, +0x3c9bc163, +0xb8016481, +0x695af793, +0xcc48ea03, +0x4a638900, +0xfc93b449, +0x7103694c, +0x8934ee6d, +0x071b0700, +0x7e28070d, +0xc471f931, +0xbb49c381, +0x382b480b, +0xc53c9dc5, +0xc4754ccd, +0xcb8dc385, +0x334a074a, +0x2ba7334a, +0x7244e94a, +0x990006ab, +0x948d0493, +0xd062b958, +0x55929d02, +0x02d064b9, +0x4103430b, +0x64bd4f6b, +0x929902d0, +0x0b322756, +0xbd633d42, +0x5e02d064, +0x2301fe6f, +0x43cb4b07, +0x4c530b07, +0x2b28231c, +0x184ff603, +0x0a00e8fe, +0xfe115efe, +0xafa3a123, +0xfffffff0, +0x275ea103, +0x9e5abefd, +0xfe8e5efe, +0xc54cccc1, +0x921e3c9c, +0x277dcfd6, +0x0100001e, +0x27800c27, +0xfd72be20, +0x101c27fd, +0x010480d5, +0x9c2651ed, +0x965e0006, +0xab4107fd, +0x8064c543, +0xc1fd125e, +0x0ea7447c, +0xbeffffdf, +0x07fdfd7b, +0x0fdc83dc, +0x33247099, +0x271c07d3, +0x80dbf920, +0xbeff0000, +0x07017cf7, +0x810d26c0, +0x0b4b8793, +0x053b0743, +0xfd310340, +0x000080d3, +0xdf0ea7ff, +0x21beffff, +0x7399fdfd, +0xc1412724, +0x433b3c9b, +0x7c757485, +0x07fee45e, +0x0480d11c, +0xbe143301, +0x47fdfc21, +0xab1c07cc, +0x2651ed1f, +0x5e00069c, +0x0ea7fd1d, +0xbeffffdf, +0x27fdfcec, +0xfe145ed6, +0x5e15dc27, +0xf94efe0e, +0x025404d1, +0x4c83d007, +0x33c4070f, +0x2b4733ca, +0x48cf03c4, +0xa90006ab, +0x8d0334c3, +0xc4895403, +0x104cf82a, +0x098900ea, +0x54098d32, +0xb48ef493, +0x0e449903, +0xd49d2027, +0x92c4b9b1, +0xb3d49d02, +0x0224c3a9, +0xd38d40a7, +0x45c3b9ba, +0x5bd49d03, +0x9da9d39d, +0xd49d43d2, +0x5ad49d42, +0x023fc4b9, +0xb9b0d49d, +0xc00355c3, +0x0710ff3c, +0x9d415343, +0x3c0b42d4, +0x9d903399, +0xd0b95bd3, +0x0fc60246, +0x46d2bd6f, +0xe8c4c102, +0x20004dd8, +0x20da9951, +0x1400bd27, +0x5110acc0, +0x893cd0c1, +0x0cbe30d1, +0xd489fe2b, +0xca400b54, +0x49071849, +0xf393402b, +0xb9fd39cf, +0x150336c2, +0x54d48dd3, +0xb610bca3, +0x45d4b92e, +0xa344b602, +0xac4420bc, +0x36c4b910, +0x104ca303, +0x0327b4ab, +0x8e50dbc5, +0x20da99f9, +0x0400bd27, +0xb110acc4, +0xd98d0027, +0x89b41e54, +0xd18930d4, +0x3cd3c154, +0x9ba0d299, +0x83340b41, +0xd09df02c, +0x3cd3c55e, +0x5ea0d29d, +0x0989ff79, +0xff1a5e32, +0xaa1eb1a3, +0xcf5bf04e, +0xfe2bdf3b, +0x0f07fc4e, +0xfff897be, +0xf00efc0e, +0x4f27ff0b, +0x10079000, +0x4f274329, +0x1007a000, +0x3d104429, +0xff1e03fc, +0x03fc4d10, +0x0307ff1e, +0x000c042b, +0x03fc0d03, +0x010c4127, +0x04074027, +0xfc4efe0b, +0x0dbec007, +0x1ea7fe2b, +0x39fd4fff, +0x271301c2, +0xab433b41, +0x27c43d42, +0x0ef49b40, +0x8e3814c5, +0x000000fc, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x1007fd4e, +0xd1871f6b, +0x3020df03, +0x08530006, +0x01103f9b, +0xf1f293d4, +0x2ed102f9, +0x432b0124, +0xe19dd405, +0x2224b908, +0xff3ea701, +0xe49dfd4f, +0x1424a909, +0xb9e44d01, +0xa9011824, +0x11011621, +0x6d410b32, +0xf6e205e4, +0x9b402707, +0x00070ef4, +0x4027ff8b, +0xe4053027, +0x9b08e39d, +0xd401102f, +0xd405420b, +0x4007fd8e, +0x41034273, +0xe31ef4e8, +0x4ea7fd4e, +0x01f7ffff, +0x07d00743, +0x0d38dc01, +0xfd8e16d6, +0x10060e27, +0xff767e27, +0xaabe0d07, +0x0256fdc9, +0xfd0efd8e, +0x4eff675e, +0xff3ea7f5, +0x34c1f3ff, +0xdcb00734, +0xd3072942, +0xffffcea7, +0xc54827f7, +0xb0d140c4, +0x422701ac, +0x2738d4c5, +0xad3e131c, +0xd3c53027, +0x40c3c538, +0xd834d4c1, +0xb489e042, +0x6eb3896c, +0x63475447, +0xa027cb07, +0xffffdea7, +0x207d27f7, +0xf14a8702, +0x0c001449, +0xd1d301ff, +0xd801acb8, +0x9fdc4332, +0x04000000, +0x27d7a51e, +0x03d4b540, +0xc4c103a1, +0x4127dca2, +0xffff3ea7, +0x552027f3, +0x04b29d34, +0xd5c5f58e, +0x3cd6c538, +0x0748c499, +0x1f4c833a, +0x83104c33, +0x204ca331, +0xd4a543ab, +0xcc1ed9b5, +0xd4c54a27, +0x27080740, +0xff2a7e1b, +0xd4c54827, +0xdcd30140, +0xe91ea932, +0xc007fc4e, +0xffffdea7, +0xdc0b1ef7, +0x0d272241, +0x997e640a, +0xdcd401fe, +0x48d81044, +0x270c07ef, +0xfefa7e10, +0x44d8d401, +0x9e0227f2, +0x8efdfc6b, +0x000000fc, +0x0003e80d, +0x0003e80b, +0x0003e807, +0xf1a3f54e, +0x9107a007, +0xa469161e, +0x460b4b2b, +0x41c84f8b, +0xddf41364, +0x0a074101, +0xa7febf7e, +0xffffff2e, +0x010224a9, +0x010423a9, +0x92a9b407, +0x4307030a, +0x422b4b1b, +0x9da97407, +0x7fab0308, +0xf305d72b, +0x3ea7d123, +0x99feffff, +0xd0e80934, +0x4383019b, +0x34333407, +0x342b4487, +0x005432f1, +0xa401ff00, +0x8e238307, +0xe2ffffb4, +0x99018c24, +0xa69909a4, +0x934fd608, +0x02a492d1, +0xf235c127, +0x84191207, +0x990f1c83, +0x13330483, +0x31075307, +0xff843e23, +0x7c12f9ff, +0x15ff0000, +0x00f345f4, +0x18c02752, +0xc2a3402c, +0x14f9c906, +0xff00007d, +0x231e4cce, +0xff4ea7b1, +0x43b9ffff, +0x4b070108, +0x030f4c83, +0x53344eb1, +0x01ff2ff2, +0xff4c5e21, +0xffff3ea7, +0xb92b07ff, +0x83010834, +0xf2550f2c, +0x00b224ee, +0x001af6be, +0x2ea78459, +0xa9ffffff, +0x25010223, +0xae3beef4, +0x27e42700, +0x9b402704, +0x2ea70ef4, +0x21fd4fff, +0x3824c5f3, +0xd608a39d, +0x2ea75def, +0xa9feffff, +0x27014224, +0xad4103c1, +0x9d014224, +0x3ea709ac, +0x11fd4fff, +0xa9ab6d32, +0x07030894, +0xb492d53d, +0xabf25102, +0x2b923d3f, +0xc0932d43, +0xd9163641, +0xffff3ea7, +0xa73cbdff, +0x0f329906, +0xf49b4027, +0x8731270e, +0x4023f522, +0xd1ff02b0, +0x2102a494, +0xce410383, +0x05c87634, +0x0310072d, +0x03e8001e, +0x31fea15e, +0xff2ea7f3, +0x3f6bfddf, +0x4da34387, +0x24d50400, +0x2ed50208, +0xb31e0208, +0xfe66f453, +0x7f5e4101, +0x8004e0fe, +0x8ef183fe, +0x0424a9f5, +0xeef30101, +0x21ff4c43, +0x4664eef4, +0x118419ff, +0x3e42eef2, +0x817fe6ff, +0x39f24100, +0xc3c4ee24, +0x05a49900, +0x00b54ff6, +0xf3318421, +0x272934ca, +0x27e22741, +0x05a49d02, +0x19ff1c5e, +0x1d44a394, +0xd1841e94, +0x2702a494, +0x83410302, +0x8ea405f1, +0x830227f5, +0xb6f58ef1, +0xff4ea7d9, +0x2ea7ffff, +0xd1feffff, +0xd10e1443, +0xc2013c24, +0x4b075143, +0x2ea74103, +0xadffffff, +0x27010224, +0x6d0027e0, +0xfed35e84, +0x41034b07, +0xffff3ea7, +0x27e027ff, +0x0234ad00, +0xfebf5e01, +0xf605a499, +0xe6ff7c4f, +0x31ff785f, +0x5f0ea7f3, +0x8325fff9, +0x31278419, +0x841d4103, +0xbe05a39d, +0x5efe97c0, +0xf331ff5d, +0xf95f0ea7, +0x253103ff, +0xbef33583, +0x31fe97ac, +0x05a499f2, +0xf2352123, +0x27944fc6, +0x5e0227e2, +0x2c3dfe75, +0x4ea73027, +0xadffffff, +0xa9010a43, +0x07010444, +0xa7340b37, +0xffffff2e, +0x0427e427, +0x010423ad, +0x4efe505e, +0x050199fb, +0x02893427, +0x99317b5c, +0x32120b04, +0x24073207, +0x43332533, +0x3fab242b, +0x23ad200b, +0x048901b4, +0xad432b5c, +0x7601b624, +0xb424a91e, +0x074da601, +0xa7c02712, +0xfde64fde, +0xa710bc27, +0xfde68fee, +0x01c012d1, +0x89f003c1, +0x320b6404, +0xd405430b, +0x0489db15, +0x0b202762, +0x89d23543, +0xe4055803, +0xe235e315, +0x01c013d1, +0xa95e0489, +0x0b01b412, +0xc014d543, +0xcac10301, +0xfb8ec7c2, +0x0489fb4e, +0x06d00746, +0xff3ea74d, +0x34c1fdef, +0x0b0b994c, +0x16e04cd8, +0xd0d1c307, +0x1e2701ac, +0x7e01f40c, +0xc4c1fb88, +0xe04cdc4c, +0xf8d1c1ee, +0x015ed289, +0x33420713, +0x1643c243, +0x32871401, +0x1405430b, +0x320b1211, +0x40271315, +0x8e46d48d, +0x330b07fb, +0x2bb33305, +0x0b30070b, +0xb834a93d, +0xad440301, +0xa901b834, +0x8901b833, +0x34024ad4, +0x40073407, +0x43ad4d0b, +0x200701b8, +0x01ba43a9, +0x01b844a9, +0x01b02d03, +0x43ca2d0b, +0x07c3074a, +0xa94d0b40, +0x0701bc43, +0x26e32bec, +0x892251e6, +0x3e075ed1, +0x410b2411, +0xf3b82415, +0xce4ad489, +0x2ea7294c, +0xa9feffff, +0x071e3824, +0xad4e0b30, +0x0b1e3824, +0xbc3cad3d, +0xa7312701, +0xfdcfff4e, +0x5e7043c5, +0xc407ff76, +0x1007b61e, +0x14a91d0b, +0x4cca01b8, +0xc414d1ce, +0x2730a701, +0xbd431521, +0x1e01b112, +0x07fb4ebe, +0x33c533c1, +0x07c12b13, +0xd14c0b40, +0x0701b443, +0x033fe6e0, +0xb9d40701, +0xf601b144, +0xa700f94f, +0xfdefff4e, +0xc16c41c1, +0x1c335c43, +0x183c3318, +0x531d3c53, +0xd2a91d1c, +0x131201b4, +0xd0a93107, +0x321b01b6, +0x3002b307, +0xd1a9b007, +0x4b0701ba, +0x4fab3fab, +0x432b042b, +0x240b310b, +0xd0ad3fab, +0xd2ad01b6, +0xd3ad01b4, +0xe48901ba, +0x0734024a, +0x0b4c0734, +0xa93fab4e, +0xad01b842, +0xe201ba43, +0x07009732, +0x0b3c07d2, +0xbc34a93e, +0x2b0d0701, +0x89066604, +0x32d15ee1, +0x300701c4, +0x410b2411, +0xf3b82415, +0xce4ae489, +0x3ea7744d, +0xa9feffff, +0x071e3834, +0xad400b1c, +0x0b1e3834, +0xbc1dad1e, +0xa7312701, +0xfdcfff4e, +0x01b212b9, +0xf67043c5, +0x07bca62c, +0x4fcea70b, +0xbc27fde6, +0x8fdea710, +0x12d1fde6, +0xe3c101c0, +0x64e489f0, +0x430b320b, +0xcb15c405, +0x2762e489, +0x35430b20, +0x58e389c2, +0xd315d405, +0x13d1d235, +0xe48901c0, +0xd5430b5e, +0xf001c014, +0xfb8ecdf0, +0x6a5ed307, +0x0b1c07ff, +0xb814a91e, +0x834dca01, +0x01c414d1, +0x212730a7, +0x12bd4315, +0x735e01b1, +0x000000ff, +0x000000ff, +0x00000033, +0xfaa3f54e, +0x03d14027, +0xf0c5010c, +0x35f44580, +0x84f1c5f4, +0x02b431e0, +0xf0c50127, +0x38f4c568, +0xc57cf4c5, +0xf4c534f4, +0x74f4c578, +0xc570f4c5, +0x80276cf4, +0x9027a027, +0x3ea7b027, +0xc1f3ffff, +0x41dc3434, +0xc1d30718, +0x1e2780fe, +0xd101f408, +0x7e01ace0, +0xd4c1f91c, +0xec41d834, +0xd180f0c1, +0x36010c02, +0x4103992d, +0x04893c06, +0xe04f8bfc, +0xfffffe4f, +0xc10bf0ff, +0x338384f4, +0xffff1ea7, +0xc13433f3, +0x149570fa, +0x4da34307, +0xa1fc2000, +0x4efc0863, +0x05020000, +0x68fdc10c, +0x4fa3d516, +0x08000000, +0x12051425, +0xf58efa83, +0xa77cfec1, +0xf3ffff4e, +0x9578f0c1, +0x34f1c14e, +0xc14040c5, +0x41c574f2, +0xe42fe644, +0x80f3c101, +0xe6413499, +0xc101da4f, +0x4ff66cf4, +0xfdc101e4, +0x00dea338, +0xfdc51800, +0x80f2c138, +0x01a822d1, +0x016d24b9, +0x8690f2c5, +0x80f3c145, +0xf6413499, +0xc108a54f, +0xd15870fd, +0x9980fec1, +0x4ff641e4, +0xf1c108a4, +0x001efc38, +0x08af0200, +0xd668f2c1, +0x38f3c125, +0x00003fa3, +0xf3c50800, +0x38f4c138, +0xffffdea7, +0x80fec1f3, +0xe4b9d425, +0x20270211, +0x21274486, +0x2790f0c1, +0x7c04b930, +0x27448601, +0xab420731, +0xa5458643, +0x58d9c5d8, +0xdbc5dab5, +0x80f1c17c, +0x1499fc41, +0xf6dc1504, +0x3108e04f, +0x90f3c1f1, +0xfac1d105, +0x9c34b980, +0xd4aec102, +0xf8d0a0c1, +0xa900b644, +0x070102a4, +0x0f2c0320, +0x028c3bd1, +0xa3a94447, +0x20e80100, +0x24730b16, +0xdfabd207, +0x0095d4f2, +0x2c032e07, +0x1e20e80f, +0x0724730f, +0x07efabe2, +0x9b33470e, +0xd2030b04, +0xf43118e3, +0x4c332b07, +0x53200b11, +0x241d1a4c, +0xa980f2c1, +0x47010023, +0x03430733, +0x0ee4d241, +0x3007f431, +0x3b0b4447, +0x3d1a4c53, +0x80f3c134, +0x010234a9, +0x41034447, +0x0aaed4f2, +0x010034a9, +0x34470e0b, +0x4118e3d2, +0x332b07f4, +0x4c53114c, +0x1d200b1a, +0x80f4c124, +0x010043a9, +0x43073347, +0xe4f24103, +0xf4410cb0, +0x44470b0b, +0x3d1a4c53, +0x80fac104, +0x01a8aad1, +0xc190fac5, +0x310790f0, +0x02a404d1, +0x83113c33, +0x04870f4c, +0x040b4433, +0x13c402f1, +0x3c53ff00, +0x0711471a, +0x53320b4c, +0x4c331a1c, +0xe9130b11, +0x0013c802, +0x1a4c53ff, +0x410b3c47, +0x0b1a3c53, +0xc1240334, +0x03f580f1, +0xff0013c4, +0x13c802ed, +0x1499ff00, +0x96302741, +0xc1312744, +0x430780f2, +0x249d41c3, +0x0223a904, +0x0024a901, +0x8dfa8301, +0x248d6e23, +0xc1f58e6c, +0xefe66cfe, +0xf0c1fe35, +0x41049980, +0xfe2b4fe6, +0xa338f1c1, +0x0200001e, +0x5e38f1c5, +0x0cb9fe1d, +0x40070106, +0x490b9c87, +0xe6984ac1, +0xa70fe7cf, +0xfddfffde, +0x3580bc27, +0x6cd4c1db, +0x8370d3c1, +0xffffff4f, +0xea30e87f, +0xe64aee05, +0x80f2c105, +0x0b84f1c1, +0x9824c129, +0x3407c183, +0x31034783, +0xc33314ab, +0x1cab4307, +0x839823c5, +0xffffff4f, +0x7cf1c5bf, +0x096448e0, +0xc180f4c1, +0x44d180fa, +0xf4c501a8, +0x41ac9990, +0x024840b9, +0xc433c383, +0x05bf0ff6, +0xfdc5d127, +0x64fdc568, +0xc55cfdc5, +0xa02760fd, +0xa990f4c1, +0xc6030e4b, +0x44a97cbf, +0x4fd6030c, +0x650fe668, +0x90fdc10b, +0x0249d4b9, +0xfec14ea6, +0x89140780, +0xeea950e0, +0x01230100, +0x24a92d07, +0x2da9024a, +0x43e3024c, +0x04123007, +0x3e0e3407, +0x072ae3d2, +0x0343e34d, +0x07401243, +0xd24e0e40, +0xf4c11b4e, +0x0243a980, +0x4e24a901, +0x42340e02, +0x5024a934, +0xa3430202, +0x020000ce, +0xf1f02803, +0x90fec1be, +0x030cebad, +0xa990f0c1, +0x23030c04, +0x0c04ad41, +0x80f1c103, +0x14893027, +0x0012a950, +0xc5412301, +0x24ee88f2, +0xf4c108aa, +0x88fec180, +0x27054d99, +0x27e48611, +0x90f0c110, +0x02d1e307, +0x43a902b0, +0x01070102, +0x49334d07, +0x0633ef6b, +0x4e0704ab, +0xf3c54733, +0x0704ab8c, +0x27248343, +0x27448631, +0x86412730, +0xab402724, +0xab433312, +0x330cab14, +0x34f1c538, +0xa4e603ab, +0x00000ea3, +0xd5eff618, +0x27a22707, +0x3cfac513, +0x07b7dff6, +0x270c3c27, +0x90fac122, +0x13ab10ab, +0x0345a4b9, +0xc638f1c5, +0xa4b95f4f, +0x4f460346, +0x0358a3d1, +0x0a363fe6, +0xc190fec1, +0xe1d18cf0, +0x41070348, +0x04ee439b, +0x04c20d33, +0x07310316, +0x23419b43, +0xc1404231, +0xdea338fd, +0xc5020000, +0xfec138fd, +0x4ce1d190, +0x23410703, +0x1943ce41, +0x0348e4d1, +0x9b8cf0c1, +0x42412341, +0x38f1c104, +0x00001ea3, +0x38f1c502, +0x0bce2fe6, +0xc18cf3c1, +0x4f0788fd, +0x3347a027, +0x470c4c03, +0x3cf0c1dd, +0xc5a0f2c5, +0xf4c544f3, +0x58fac540, +0xc578fac5, +0xe12798fd, +0x04f101e0, +0xc19cfec5, +0x1fe63cf1, +0xf2c100c4, +0x40f3c180, +0x8958fdc1, +0xfcc14a27, +0x58f5c158, +0x0b44f4c1, +0xc53a01d2, +0x712394fd, +0xb027c433, +0xd107540b, +0x2798f2c1, +0x962b0be1, +0xf6e02724, +0x2704fb5f, +0x0a312710, +0x07302727, +0xe6efe623, +0x64f4c104, +0xbfe644d6, +0x912704dd, +0x1fe60227, +0xf3c104ce, +0xc1353660, +0x4fe658f4, +0x312704c2, +0x2fe66827, +0xf4c10489, +0xd54fe65c, +0xf6412704, +0x2704823f, +0x824ff680, +0x074e0704, +0xc341c331, +0x47433331, +0xab902733, +0x842fe634, +0x861ff604, +0x2734a304, +0x3321c311, +0xc102ab25, +0x06ab78fe, +0x4b0713ab, +0x1c3b08ab, +0x443309ab, +0x043be1ab, +0xab78fec5, +0xf8b103a0, +0xc1042ffd, +0x1a0540f1, +0xc158f2c1, +0xf4c140f3, +0x032103a0, +0xc5412334, +0xf3c558f2, +0xa0f4c540, +0xff1d4ff6, +0x2780fac1, +0x90fdc130, +0x0234a3bd, +0x017cd4b9, +0x046d4ff6, +0xfec5e027, +0x70fec574, +0x276cfec5, +0x27a02780, +0xc1b02790, +0x24b980f2, +0x4fe60211, +0x24b90622, +0x4ff60234, +0xf3c1065f, +0x7c34b990, +0xff4ce001, +0x21b90653, +0xf4c10106, +0x0b318780, +0x9834c134, +0x2380fac1, +0x33478341, +0x004df145, +0xb9ff1b30, +0xd10210aa, +0x55010022, +0x044ef1fd, +0xc5ff1b30, +0xfe654cfa, +0x300840f1, +0x4e23ff1b, +0x75e4d000, +0x854331f0, +0x954a41f3, +0xa54d51fa, +0xb54e61fd, +0xc54471fe, +0x2fe630f4, +0x5027087c, +0xf5c51427, +0xc5d02748, +0x3507a4f1, +0x31834507, +0x23474153, +0x3f074433, +0x3c03240b, +0x39230b14, +0x042a9927, +0x19052399, +0x07070728, +0x0b4a07e7, +0x07480be3, +0x0b032b62, +0xe86103e4, +0x0708a200, +0xe84a2b48, +0x1207e240, +0xe8040740, +0x99089c00, +0x29990d23, +0x086b990c, +0x07082c99, +0x0b490713, +0x0b4c0b1b, +0x0b3b1b14, +0x7930e81e, +0x2b4c0708, +0xaf40e849, +0x07431207, +0x04649934, +0x40e84a1b, +0x4312079d, +0x48073407, +0x40e8472b, +0x23070867, +0x24074312, +0x3b2b3c07, +0x085430e8, +0x32124207, +0x24074307, +0x20070412, +0x070c6499, +0xe8342b39, +0x12076730, +0xc1320723, +0xfac148f4, +0x23430ba4, +0xc51353a1, +0xfac548f4, +0x03d10ba4, +0x3baff651, +0x80f0c1ff, +0x02110eb9, +0x4e07e123, +0xe1034f6b, +0x07a842f0, +0x09a0e3e0, +0x2780f4c1, +0xa84bd120, +0x4cf4c101, +0x40e8420b, +0x4c080a1f, +0x334c2734, +0xaf6ba407, +0x9d08fa9d, +0xfa9d0bfa, +0x0afa9d09, +0x0360b3b9, +0x1208f499, +0x08430734, +0x4c27344c, +0x08f49d33, +0x0360b3b9, +0x1209f499, +0x08430734, +0x4c27344c, +0x09f49d33, +0x0360b3b9, +0x120af499, +0x08430734, +0x4c27344c, +0x0af49d33, +0x0360b3b9, +0x120bf499, +0x08430734, +0x4c27344c, +0x0bf49d33, +0xfd99f631, +0x09f99908, +0xfc99f541, +0x0bf8990a, +0xc111e3d0, +0xe48980fe, +0x00e3a950, +0xee412301, +0xb909ff34, +0x070360b3, +0x073a124a, +0x344c0843, +0xc1334c27, +0x340790f0, +0x036002b9, +0x32072412, +0x2e343ce8, +0x33bc2707, +0x4c234b07, +0x80f1c10c, +0x1ad14487, +0x40f101a8, +0x00035454, +0x02a0a3d1, +0x0ab23ff6, +0x0780f2c1, +0x412499e0, +0xf67fec83, +0x27086d4f, +0x0000007f, +0xb91e4754, +0x06032ba4, +0x33418746, +0x10140b14, +0x2702001d, +0xf401ff1d, +0x086114bc, +0x4b072b07, +0x4c332453, +0x333b070f, +0x4e830e2c, +0x833c0000, +0x24ab3f3c, +0x4b073833, +0xf93fdc83, +0x0354f4ba, +0x144c3300, +0x833fcc83, +0xd9333f8c, +0x073f9c83, +0x198c33b0, +0xab199c33, +0x004f8323, +0x3303c000, +0xabb153c9, +0xabc8abd6, +0x8324abd9, +0x0fff80be, +0x8707e153, +0xc5ab9107, +0x80abbeab, +0x9d83a2ab, +0xfd3501ff, +0x5f5efc45, +0x80f2c1f7, +0xd1101c27, +0xa501ac20, +0xf0867edb, +0xd4a54027, +0x07f9f25e, +0x004ea343, +0x975e0220, +0xeaa4b9f7, +0xcd4fe601, +0x00a3a900, +0xeca1a901, +0xae13e201, +0x80f2c105, +0x01f024a9, +0x00b634ea, +0x01f224a9, +0x00ae43ea, +0x01ee22a9, +0x08a913ee, +0x2780fac1, +0xf0a4a910, +0x27430e01, +0xc3d10711, +0xc5d183d1, +0x23ee64fd, +0xf1c10887, +0xa9202780, +0x0e01f214, +0x07212743, +0x8341c342, +0x5cf4c541, +0xb980fac1, +0xe601e0a4, +0xa907464f, +0xea01e2a2, +0xa9072d32, +0xea01e4a4, +0xc1072543, +0xefe664fe, +0x23ee08a9, +0xfac10977, +0xa9202780, +0xee01e6a4, +0x07092e34, +0x83d1c3d2, +0x68fdc5d1, +0xa027e127, +0x5e60fec5, +0xf4c1f9b0, +0x004ea338, +0xf4c51800, +0xf7515e38, +0xa338f0c1, +0x0200000e, +0xc138f0c5, +0x1ef838f1, +0x55020000, +0x001ee3f7, +0xf1c51800, +0xf74a5e38, +0xa1271127, +0xc568f1c5, +0xf1c564f1, +0x60f1c55c, +0x27f96f5e, +0xfb0e5ee0, +0x395ec803, +0xe64027fb, +0x87fb823f, +0x824fe689, +0x079307fb, +0xc331074e, +0x3331c341, +0x33334743, +0xf634ab94, +0xa3fb802f, +0x801fe634, +0x7cefe6fb, +0x5e1027fb, +0x3027fb79, +0x3f5e6027, +0x279027fb, +0xfb245e00, +0x2794f0c1, +0x86045930, +0x07312744, +0x8311c313, +0xfaf75e11, +0xc1abbfd6, +0x285e9cf4, +0x7e0107fb, +0xf2c1ef4f, +0xa822d180, +0x90f2c501, +0x7df7125e, +0x3df31df3, +0x99f35df3, +0x362743d4, +0x9307349b, +0x0210a7b9, +0x49079f6b, +0xa49d470b, +0x1ba49d18, +0x9d1aa49d, +0x0a0719a4, +0x0c031d07, +0x88f2c118, +0x0248ddb9, +0x4754f0c5, +0x00dfe662, +0x4914b902, +0xf84fe602, +0x80f3c101, +0x8990f2c1, +0x04075031, +0xc0271123, +0x024a24a9, +0x024c2ea9, +0x310743e3, +0x34071412, +0x0e88f4c1, +0x2a43d234, +0x43e34e07, +0x41124303, +0xfac14107, +0xd24a0e88, +0xfec1184a, +0x4e24a980, +0x02e3a902, +0x42340e01, +0x5024a934, +0x27430202, +0xf02803c1, +0xfac1bbf0, +0x7ca4b990, +0xff4ce001, +0x4cf40485, +0xf601af11, +0xc103dddf, +0xf15380f0, +0x0dd1f4e8, +0x802701a8, +0xd4b91501, +0xa7070180, +0x4770f8c5, +0x53c807e8, +0x33f4cff0, +0x50fec5c4, +0x0e012027, +0x0027c80b, +0x031224da, +0xf302ec01, +0x27e50703, +0x80d4b920, +0xf042d201, +0x0780f3c1, +0x0b420b4c, +0x1c439943, +0x03cf3fe6, +0x42873207, +0x342b3433, +0x0790f4c1, +0xa9340b10, +0x0b018434, +0xb614ea16, +0x8634a903, +0xae41e201, +0x07210303, +0x33428732, +0x07342b34, +0xb91d0b13, +0xca01821b, +0xfac1b4eb, +0xbd412780, +0xc10234a4, +0x14d190fe, +0x3e0b0180, +0x018033a9, +0x00004ffc, +0x053f0200, +0x3fab370b, +0x0750f1c1, +0x0b100b4f, +0x8b421d41, +0xef30e83f, +0x343c2805, +0xf432f453, +0xa3074301, +0x6b54fdc1, +0x0b4a07af, +0x1d490b1d, +0x80fec114, +0x32874207, +0x01a8edd1, +0x432b4433, +0x43b94d0b, +0x31580183, +0xa370f1c1, +0x70f1c511, +0x0180d4b9, +0x465eeb07, +0x80f2c1ff, +0x07442499, +0x83215324, +0x03348743, +0xf83f5e21, +0x9980fec1, +0x140743e4, +0x11031153, +0x073cf1c5, +0x5e138314, +0x2099f820, +0x83f43118, +0x09333f0c, +0xd20704ab, +0x991ad499, +0xd2991bd3, +0x3f4c8319, +0x413f3c83, +0x3f2c83f1, +0x3c334933, +0x3343ab19, +0x02ab192c, +0xf03514ab, +0xd75ef145, +0x84f1c1f3, +0x00001ea3, +0x84f1c540, +0xc1f4065e, +0xf43180f2, +0x07182099, +0x3f0c83d2, +0x04ab0933, +0x3fc3b71e, +0x40000008, +0x5e9823c5, +0x3127f694, +0x27f7555e, +0xfe5c5ec0, +0x00004ee3, +0xf3f75e18, +0x01a83dd1, +0x5e90fdc5, +0x2c03f58b, +0xf4e85e0f, +0xd180fec1, +0x2701a8ed, +0xc5a70710, +0xf1c574f1, +0x6cf1c570, +0xf339f419, +0x02a634ee, +0xb980f2c1, +0x990331d4, +0x4f4b1823, +0x43073412, +0x0332d3b9, +0x43123f4b, +0xf3c14307, +0x18349d80, +0x9980f4c1, +0xd4b91943, +0x4f4b0331, +0x43073412, +0x0332d3b9, +0x43123f4b, +0xfac14307, +0x19a49d80, +0x0331d4b9, +0x4b1aa399, +0x0734124f, +0x32d3b943, +0x123f4b03, +0xc1430743, +0xe49d80fe, +0x31d4b91a, +0x1be39903, +0x34124f4b, +0xd3b94307, +0x3f4b0332, +0x43074312, +0x9d80f0c1, +0x03991b04, +0x60d4b918, +0x07341203, +0x344c0843, +0xc1334c27, +0x149d80f1, +0x19139918, +0x0360d4b9, +0x43073412, +0x27344c08, +0xf2c1334c, +0x19249d80, +0xb91a2399, +0x120360d4, +0x08430734, +0x4c27344c, +0x80f3c133, +0xc11a349d, +0x439980f4, +0x60d4b91b, +0x07341203, +0x344c0843, +0xc1334c27, +0xa49d80fa, +0x60d3b91b, +0x12470703, +0x08430737, +0x4c27344c, +0x90fec133, +0xe2b93407, +0x3f6b0360, +0x32072312, +0x91343ce8, +0x33cc2700, +0x4c234c07, +0xa0d3d10c, +0xf1448702, +0x03545440, +0x4f3ff600, +0x80f1c104, +0x1499e007, +0x7fec8341, +0x27784fd6, +0x0000009f, +0xb91e4754, +0xc6032bd4, +0x33418745, +0xf4140b14, +0xab02001d, +0x14ccd400, +0x072c0767, +0x3324534c, +0x3c070f4c, +0x830e2c33, +0x3c00004e, +0xab3f3c83, +0x07383324, +0x144c334c, +0x23abb007, +0x00004f83, +0xcaf903c0, +0x000354f4, +0x8907b153, +0xbe8324ab, +0x530fff80, +0xab9107e1, +0xab80abbe, +0xff9d83a2, +0xf7a95e01, +0xcf6bc307, +0x6d0cccf4, +0x5e4027ff, +0x42c4ff6d, +0x271e8771, +0x0000009f, +0x07851e2a, +0x534c072c, +0x07473324, +0x0e2c333c, +0x3f004d83, +0xab0f3c33, +0x003e8324, +0x981e3c00, +0x985e3013, +0x5e4013f8, +0x4013f862, +0x13f8505e, +0xf81d5e40, +0x0348a4d1, +0xe28cfdc1, +0x5ef6134d, +0x1d27f608, +0x525e01ff, +0xeea2a9ff, +0x6532e201, +0xfa4b5efa, +0x0000cea3, +0xf4f35e02, +0xd180fec1, +0xc501a8ee, +0x5c5e90fe, +0x009f27f3, +0x5e2a0000, +0xcff6ff15, +0xf0c1fc23, +0xa80dd180, +0xfdc95e01, +0xf7841ff6, +0xd580f0c1, +0xd5022001, +0x5e021801, +0xe2e0f776, +0x4d070367, +0x5348f2c1, +0x4042e244, +0xc1402703, +0x430b80f3, +0x021242b9, +0x01a83bd1, +0x465e2f4b, +0x80d4b9f8, +0x5e210301, +0x8103fc19, +0xfbed82e4, +0x2780f2c1, +0xa822d130, +0x74f3c501, +0xc590f2c5, +0x7d5e6cf3, +0x6bb307fd, +0x0cbcf4bf, +0x4027f8d0, +0x13f8d05e, +0xf75d5e00, +0x865e3013, +0x5e0027f7, +0x3013f763, +0x13f7ab5e, +0xf7985e40, +0x32eef259, +0xf479fd58, +0xfd5242ee, +0x4d5e7a07, +0x81a4b9fd, +0x8cfdc101, +0x016a4dea, +0x0180a4b9, +0xea88fec1, +0xa702064e, +0xf7ffff4e, +0xf0c13127, +0x0043d580, +0x0842d101, +0xa80dd101, +0xb9f21501, +0xd10361d3, +0xa601084b, +0x33420735, +0x1b4c7343, +0x3f6b3407, +0x0248d4b9, +0xcfe644c6, +0x31e4fceb, +0xfe11fce7, +0x0000effc, +0x02bd4000, +0x4c334e07, +0x1a4c731a, +0x470b3b07, +0x123f3c83, +0x08430734, +0x4c27344c, +0x071e0733, +0x141c33a4, +0xaf6b4b07, +0x331a1c73, +0xfa1d144c, +0x0b1a4c53, +0x07411217, +0x341c0814, +0x07331c27, +0x0e0c330e, +0x1f6b4b07, +0x331a0c73, +0xf13d0e4c, +0x0b1a4c53, +0x07401207, +0x340c0804, +0x07330c27, +0x334b073e, +0x730f6b38, +0x48331a3c, +0x4c53f05d, +0x12370b1a, +0x08340743, +0x3c27343c, +0xc52e8733, +0xf4c16cf2, +0x1fec536c, +0x6b74fec5, +0x1f4c533f, +0xf4c5e027, +0x70fec56c, +0xfec12307, +0x0b4a0780, +0x0b190b29, +0x9d490b09, +0xe19d18e4, +0x1ae09d19, +0x7d1be29d, +0xfc365ef3, +0x5e78f2c5, +0xfdc1f544, +0xe6d4a980, +0xa9342a01, +0xe201e8d4, +0x27f8ce34, +0x27302721, +0x68f2c5a0, +0x5e60f3c5, +0x42e4f298, +0x1e8700ed, +0x00007f27, +0x905e2a00, +0x0f2c03f7, +0x07f0e05e, +0x534b072b, +0x07473324, +0x0e2c333b, +0x3f004d83, +0xab0f3c33, +0x003e8324, +0x9f5e3c00, +0x81d4b9f7, +0xab340b01, +0xfabe5e3f, +0xd180f4c1, +0x5e01a84d, +0xf2c1fbbb, +0x80fac148, +0xa0d12253, +0x2ef0021c, +0xdd010000, +0x104c2700, +0x235b3407, +0x2df03207, +0x00c70100, +0x28271827, +0x3cf0325b, +0x2700b510, +0x5b2427c4, +0xa434f032, +0x27d22700, +0x80fac122, +0xabd114ab, +0x1cab01a8, +0xb4d1325b, +0x1dab02a4, +0x13ab3153, +0x00a14fe6, +0x00e201f2, +0x402b4107, +0x35333407, +0x342b4447, +0x00e330e8, +0x24732307, +0xfff92fcc, +0xa722ffff, +0x80fdc126, +0x0218d4d1, +0x0220d3d1, +0x3103410b, +0x0218d4d5, +0x0220d3d5, +0x27f5dc5e, +0xf5e65e40, +0x27df28c8, +0xc1db1e27, +0xadd180fa, +0x145e01a8, +0x007f27fb, +0x5e2a0000, +0x3027f6a5, +0xc1fa195e, +0x412738f1, +0x00001ea3, +0x38f1c502, +0x0347e4bd, +0x27f2d55e, +0x5cfec5e0, +0x27f78b5e, +0x64f4c540, +0x27f7695e, +0x5e2027d0, +0xc027ff5d, +0x4c5e2027, +0x271027ff, +0xff3a5e20, +0x30274027, +0x27ff255e, +0xff7f5e20, +0xa95ae489, +0x230102e3, +0xf843ee41, +0x20e1d1f5, +0xf01ff602, +0x1ce1d500, +0x80fec102, +0xe4d54027, +0xe4d50220, +0xdc5e0218, +0x271127f5, +0x68f1c5a0, +0x5e60f1c5, +0xf1c1f120, +0xc642be80, +0xfbab5efd, +0x075801ce, +0x87402b41, +0x0b453334, +0x2130ec34, +0x0f3c03ff, +0x07ff1b5e, +0xca43534d, +0x4d071124, +0x42224253, +0xb45e4227, +0x5e4327fc, +0x4127fcaf, +0x47fcaa5e, +0xc14d0b4d, +0x465348f1, +0xfc9b14e2, +0x44534d07, +0x07e814c2, +0xc243534d, +0x4d07d714, +0x14c24253, +0x5e4427d5, +0x20a7fc83, +0x99fee05e, +0x4fe6e0d4, +0xd799fd40, +0x80f1c1df, +0x470b4907, +0x9d18149d, +0x149d1b14, +0x19149d1a, +0x27fd275e, +0xf6d15e21, +0xdfffdea7, +0x352127fd, +0x48d4c1d2, +0x834cd3c1, +0xffffff4f, +0xee30087f, +0xc1f020a4, +0x1c2780f3, +0xac30d110, +0x7ed2a501, +0x4027e688, +0xd61ed4a5, +0xfdc587be, +0x27f54b5e, +0x68f2c520, +0xc1f69b5e, +0x20d180f2, +0x26be0218, +0xf3c10004, +0x1c30d580, +0xff035e02, +0x0499fa4e, +0x07d00741, +0x914ff6a1, +0x89b02702, +0x4f064ed4, +0xefff1ea7, +0x4014c1fd, +0xc15013c1, +0x3c336012, +0x182c3318, +0x531d3c53, +0x4c331d2c, +0x53320b18, +0x340b1d4c, +0xc1073a46, +0x01acd0d1, +0xf40c1e27, +0xe6167e01, +0xc140c4c1, +0xc2c150c3, +0x183c3360, +0x53184c33, +0x4c531d3c, +0x182c331d, +0x2c53340b, +0xd6320b1d, +0xa401d33f, +0x44030d07, +0x3d7ea405, +0x070d07ea, +0xec727e1b, +0xe641d499, +0x84dbc146, +0x0236d4a9, +0x01bfb4f2, +0xc188d2c1, +0x24eaacd4, +0xd4c10163, +0x42d39984, +0x31c34203, +0xc1a0d1c1, +0xd4c5a4d2, +0x42d39d84, +0xc13521c2, +0x410ba8d4, +0x0aa0d4c5, +0xa0d2c542, +0xc1f4dcc1, +0xc411a0d3, +0x991d34c2, +0x0d070cd1, +0xd1ead87e, +0x2701acd0, +0x01f40c1e, +0x11e5837e, +0xa0d4c1c3, +0x01e534ca, +0xacd4c1ae, +0x010b4ee2, +0xce07d419, +0xda89c403, +0xa748c64a, +0xd07fff3e, +0xd2893411, +0xc22c9b5e, +0x32251624, +0x24c23411, +0x2703070f, +0x31071a1c, +0x0411f3e8, +0x89f842ca, +0x1fe64ed1, +0xd29900d5, +0x692fc641, +0x023ad4a9, +0xc1624ec2, +0xd4c1f0d0, +0x60d389e8, +0x030b040b, +0x01ce22e0, +0x0740bc27, +0xa7312331, +0xfde6ff2e, +0xd4893383, +0x0b439b5e, +0x15240540, +0x0310272b, +0x83213531, +0x5ed48933, +0x400b439b, +0x2b152405, +0x21353103, +0xd4893383, +0x0b439b5e, +0x15240540, +0x3531032b, +0x89338321, +0x439b5ed4, +0x2405400b, +0x21352b15, +0x0756e8d0, +0x0341273a, +0x2b1c0738, +0x3b3cea4e, +0x83140b01, +0x1de6fe1c, +0xa7e8d2c1, +0xfde67fee, +0xa710cc27, +0xfde6bf0e, +0x89f0d3c1, +0x320b64d4, +0xe405430b, +0xd489ec15, +0x0b202762, +0x89e23543, +0x040558d3, +0x02350315, +0x89e8d2c1, +0x240b5ed4, +0xf0e8d2c5, +0xfa8ed3f1, +0xc15ed489, +0x4487e8d3, +0xd3c5340b, +0x99fa8ee8, +0xdec141d4, +0xecd1c1f0, +0xe060d089, +0x2700da42, +0xd4a940cc, +0x42e20238, +0xd49900d5, +0xce4ff605, +0x4ed38900, +0x100b1e0b, +0x00da3ff6, +0x24074427, +0xe6cf0ea7, +0xfd41f0fd, +0x15010500, +0x8940270c, +0x04355ed3, +0xf280130b, +0xc188d2c1, +0xa15eecd1, +0x42d39900, +0xdfff1ea7, +0x072307fd, +0x33493343, +0x03240b27, +0xc132002d, +0xb423e0dc, +0xc19c12c5, +0x4b078cd0, +0x8390dec1, +0x031fff4d, +0x94d2c5b2, +0xbd8340ab, +0x31831fff, +0xabac14c5, +0xc53633be, +0x3cabb01b, +0xc18c13c5, +0xd4c188d2, +0xff42e2ac, +0xff5d5efd, +0xdfff3ea7, +0x202c27fd, +0x34c13235, +0x6741dc8c, +0x023cd3a9, +0x9984d4c1, +0x432242d2, +0x0000be27, +0xfd515e80, +0xc394dbc1, +0xffbd8321, +0x83b4337f, +0x00bea321, +0x2c333000, +0x5eb2ab13, +0x1307fd37, +0x27fec45e, +0x275e80cc, +0x5ed389ff, +0x140b4387, +0x44272403, +0xc588d2c5, +0xd48decd1, +0xfd9c5e46, +0x33833123, +0x9b5ed489, +0x27140b43, +0xff1c5e41, +0x5e80bc27, +0xc307fe33, +0x0c27b207, +0x7ecba50f, +0x4027e2d0, +0xcb35c4a5, +0xd88cc4c1, +0xeb1e8341, +0x025e2127, +0xff1ea7ff, +0x1401fd4f, +0x03122f9b, +0xc1443341, +0x24ab3813, +0x0027322e, +0xf3abfe0b, +0xc13812c5, +0x42ce3814, +0x27f3ebf8, +0x4efe0b01, +0x76d33efe, +0x200c2705, +0x429efe0e, +0xfe8efdc4, +0x4207f64e, +0x93078207, +0x3007a207, +0xab102c53, +0x073fab4f, +0x07e39be2, +0x07710760, +0x531407b0, +0x349b100c, +0x4307109b, +0x4c53e10b, +0x9be40b10, +0x031e0220, +0x0100002e, +0xb99b4e07, +0x9b10ec33, +0x104c53a7, +0x3fabd207, +0xba0bce07, +0xc30bd40b, +0x0c071b07, +0xf68e1d0b, +0x0088fe4e, +0x1013100c, +0xfe0e2127, +0x00004e9e, +0x10680013, +0x44be2127, +0x00130000, +0x1013fe8e, +0xfd4ef31e, +0x271200c8, +0x1410c8d0, +0x2cbe2027, +0xd4860000, +0xfd8e0013, +0xd1270013, +0x13ee10cc, +0xd6412710, +0x1ed407d4, +0x074027e4, +0x27de1ed4, +0x00099e21, +0x9e202700, +0x4e000003, +0x3601c2fe, +0x273310c8, +0x203c2741, +0x44471147, +0xf02101c2, +0x302707f3, +0xfe8e26e6, +0x27ee10cc, +0x2b012a30, +0x5334ab01, +0xd6115341, +0x0721b642, +0x66fe8e03, +0x1e302740, +0x274127e9, +0x00e31e30, +0x00000000, +0x00000000, +0x00000000, +0x00000081, +0x00000081, +0x00000081, +0x00000081, +0x00000202, +0x00000202, +0x00000202, +0x00000202, +0x00000483, +0x00000483, +0x00000483, +0x00000804, +0x00000804, +0x00000804, +0x00000c85, +0x00001206, +0x00001206, +0x00001887, +0x00002008, +0x00002889, +0x0000320a, +0x00003c8b, +0x0000548d, +0x0000620e, +0x00008010, +0x0000a212, +0x0000c814, +0x00010897, +0x00013899, +0x0001a49d, +0x00020020, +0x00028824, +0x00032028, +0x0003f4ad, +0x000514b3, +0x000658b9, +0x00080040, +0x000a2048, +0x000cd0d1, +0x00102cdb, +0x00000000, +0x00000000, +0x00000000, +0x18101010, +0x30282420, +0x44403834, +0x59545049, +0x6f696460, +0x84807974, +0x99948f89, +0xafa9a4a0, +0xc4c0b9b4, +0xd9d4cfc9, +0x00000081, +0x00000081, +0x00000081, +0x00000081, +0x00000202, +0x00000202, +0x00000202, +0x00000202, +0x00000483, +0x00000483, +0x00000483, +0x00000804, +0x00000804, +0x00000804, +0x00000c85, +0x00001206, +0x00001206, +0x00001887, +0x00002008, +0x00002889, +0x0000320a, +0x00003c8b, +0x0000548d, +0x0000620e, +0x00008010, +0x0000a212, +0x0000c814, +0x00010897, +0x00013899, +0x0001a49d, +0x00020020, +0x00028824, +0x00032028, +0x0003f4ad, +0x000514b3, +0x000658b9, +0x00080040, +0x000a2048, +0x000cd0d1, +0x00102cdb, +0x00000000, +0x00000000, +0x00000000, +0x18101010, +0x30282420, +0x44403834, +0x59545049, +0x6f696460, +0x84807974, +0x99948f89, +0xafa9a4a0, +0xc4c0b9b4, +0xd9d4cfc9, +0x1ea7f54e, +0x99f7ffff, +0x02890503, +0xd540274c, +0xc1010014, +0x328b740d, +0x62273183, +0xa107c007, +0x632bf063, +0x9027d333, +0xefff0ea7, +0xff1ea7fd, +0xeea7fde5, +0x27fde5ef, +0x8ea724bc, +0x27fdeb7f, +0x0200005f, +0x407c2711, +0x338004c1, +0x4c53184c, +0x6244c01d, +0x2427c451, +0x14054d0b, +0x30271215, +0xeb051335, +0xe335e215, +0x0108a4d1, +0x4fc6f405, +0xd54327d8, +0xc1028004, +0x48dc8004, +0xd54427fb, +0xd5028004, +0x27028404, +0x9003d530, +0x15830506, +0x0ef39b85, +0xc241f401, +0x49071405, +0x420b4633, +0x13351715, +0xe715e405, +0x9103e335, +0x96ced403, +0x8ef04398, +0xe84327f5, +0x4e8e1ef4, +0x07c007fb, +0x73b00721, +0x2c731fcc, +0x073c071f, +0x07120701, +0xfc86be2b, +0x803c27ff, +0x300b4027, +0x2407414b, +0x53182c33, +0x0732ab38, +0x4efb8e03, +0x07f1a3f5, +0x07c207e1, +0xb91c46d0, +0xd0016a00, +0xd4395a02, +0x24070c07, +0x24333487, +0x242b232b, +0x2e232287, +0x9dfffef4, +0xd339282c, +0x3123f183, +0x070f3c83, +0x33138743, +0x2b412b44, +0xf1448743, +0x00013043, +0x953c0bff, +0xbef58e23, +0x39fda9a8, +0x07f183d4, +0x33248734, +0x2b322b34, +0x23338734, +0xfffef43e, +0x309d3095, +0xb9f58e28, +0x99016bd4, +0x42e00cd3, +0x3fd601a3, +0x70dbd19a, +0x9fbfe601, +0x74d4d101, +0x9741e001, +0xdbd49901, +0x99844fd6, +0x4ff6dcd4, +0xd499ff7e, +0x774ff6dd, +0x034007ff, +0x6fe4ea41, +0xa7d439ff, +0xffffff2e, +0x4123402b, +0x070f4c83, +0x33148734, +0xd1312b34, +0x2b184822, +0x07938734, +0x0332078e, +0x2b05072d, +0x06d1a980, +0xe3020703, +0x9e237f3c, +0xe3fffef4, +0x2d237f0c, +0x34190507, +0xc2803c03, +0x2001f930, +0x023901e8, +0x01e48fe6, +0x38071027, +0x03082499, +0x0b4f4b21, +0x33f3a014, +0xfc13be08, +0x216007ff, +0xf0973194, +0xb110014d, +0x014ef001, +0x019d0100, +0xda1ead27, +0x02720d27, +0x34071027, +0x3c732407, +0xfb3ebe1f, +0x803c27ff, +0x300b4027, +0x2407414b, +0x0b182c33, +0xab3853a7, +0x0b1a0732, +0x15060713, +0xfe817ef1, +0xd0c11007, +0x000d0c94, +0x000d2701, +0xfe717e01, +0x90916007, +0x08331807, +0xfffbb0be, +0x02a4d4d1, +0x011cd3d1, +0x870f4c83, +0x33700724, +0x03240b44, +0x4127807c, +0x40273108, +0x1e231207, +0x25ffec48, +0xf93487f1, +0x0013c124, +0x057853ff, +0xe5bfe6f4, +0xd94fe600, +0x27292700, +0x99f12139, +0x1499e1d9, +0x2bb40708, +0x079b12b2, +0x998307b9, +0x840be2d5, +0x85078512, +0xd3c1f221, +0xc12211cc, +0xf255d0d4, +0xf435f345, +0xda6a62c2, +0xb8075078, +0x4556f401, +0x41234c07, +0xb4074b12, +0x61c2f151, +0x56f2010d, +0x032c0725, +0x072b1221, +0x51f311b2, +0x013442f4, +0x071496f1, +0x07b95ab5, +0x07b5129b, +0x07f22195, +0x0a279dc9, +0xe4fdfd5e, +0x5efe5d32, +0xd4d1fdf6, +0x42f402a4, +0x625efdee, +0x07a707fe, +0x31100706, +0xfd9d7ef0, +0x01c2f151, +0x248ace27, +0xee1ea103, +0x26c2f251, +0x957bd22d, +0x0607a707, +0xf0411007, +0x51fd7e7e, +0x1130c2f3, +0x230eabce, +0xf2ee1ea1, +0x07ff7bab, +0xff765eba, +0xa8f2ba07, +0x6b5eff70, +0x077b12ff, +0x65b8f2b7, +0xff605eff, +0x3c272027, +0xff275e12, +0x13c021f9, +0xd499ff00, +0x2b9107e1, +0x07491293, +0x99b30794, +0xb10be2d4, +0xb407b412, +0x13bc2af1, +0xd5c1ff00, +0xd0d8c1cc, +0xda426ac2, +0x9b072a7b, +0x27ff585e, +0x2711fdad, +0x27033a0d, +0xfe645e10, +0x01014dd0, +0x7cad2770, +0x430d2701, +0x5e102704, +0x1027fe52, +0x07fe2a5e, +0x071607c7, +0xfced7e08, +0x0ac26007, +0x21bcce24, +0xee1ec103, +0xf22ba6c2, +0x07ff1879, +0x071607c7, +0xfcd17e05, +0xa0c26007, +0x0e9cce11, +0xee1ec123, +0xfeffc9f2, +0xfa5e9c07, +0xf29c07fe, +0x1efef4cb, +0x07791296, +0xea9bf297, +0x038c1efe, +0x33010711, +0xbe180707, +0x07fff9e9, +0xfdd55e60, +0x271fac27, +0x27059f0d, +0xfde45e10, +0x0499fe4e, +0x0c02990b, +0x049d41c3, +0x0b03990b, +0xe3071007, +0x3333e533, +0xed03e32b, +0x1e0b01b0, +0x310721c3, +0x9d171c03, +0x21070c02, +0x237f3ce3, +0xe301b0ed, +0x1c237f2c, +0x03341917, +0x32c2803c, +0x274107f9, +0x05362720, +0xc8440342, +0x740199f3, +0x300b3e07, +0xbdf804c1, +0xd501b031, +0x8901c434, +0x43335e04, +0x01c034d5, +0xfc4efe8e, +0xffff3ea7, +0x093499fe, +0x01a802d1, +0x34074383, +0x44873433, +0x3ef9342b, +0xff00004d, +0xa97401c1, +0x0b030824, +0x4e3cf91e, +0x07ff0000, +0x392399d0, +0x270e41c2, +0x07432b45, +0x4c038921, +0x234a243b, +0xd49d4027, +0xcefc8e06, +0x3007f7ec, +0x3d032147, +0x402701f4, +0xfdb5e3be, +0xa7e4d3c1, +0xfdbf3f4e, +0xd2c14325, +0xff4ea7dc, +0x3127fddf, +0x9d4042c5, +0xfc8e06d3, +0x0499f94e, +0x4c038905, +0x0ea79007, +0x8bfdefff, +0x8402c143, +0x12274183, +0x2dd8142b, +0x070ffc6a, +0xe8432720, +0x8423c1f4, +0xfc6a3ddc, +0x27c107f5, +0x2f0ea7a0, +0x9441fde6, +0x16331a07, +0x4321410b, +0x4231e007, +0x0510ec23, +0x15ba07e3, +0x34bc03e2, +0xed35d027, +0x02150b05, +0x0d359441, +0x4341410b, +0x41513646, +0xe30515c6, +0xed35e115, +0x01150b05, +0xa1030d35, +0xf0200c03, +0xf98ebdfc, +0x0499fa4e, +0x07d0070d, +0x274536c1, +0x0d049d41, +0x4107fa8e, +0x4333a107, +0xa42ba533, +0x300b3a07, +0x01b634a9, +0xb30747e6, +0x1c070d07, +0xffdfd8be, +0x01acd0d1, +0xf4171e27, +0xda82be01, +0xb6b4a9ff, +0xa740f601, +0xfdefff2e, +0xc16c23c1, +0x3c335c24, +0x184c3318, +0x531d4c53, +0x430b1d3c, +0xc2074906, +0x01acd0d1, +0xf4171e27, +0xda52be01, +0x6cc3c1ff, +0x335cc4c1, +0x4c33183c, +0x1d4c5318, +0x0b1d3c53, +0xdd4fd643, +0x4d0b4a07, +0x01ba42a9, +0x01b443a9, +0x3fab320b, +0x01ba43ad, +0x024ad489, +0x07340734, +0xab2d0b2a, +0xb124b93f, +0xba23ad01, +0xa94eb601, +0x0701b824, +0xb02d032a, +0xca2d0b01, +0xe3074743, +0x4d0b4a07, +0x01bc43a9, +0x032b0e07, +0x22510626, +0x075ed189, +0x0b241130, +0xb8241541, +0x4ad489f3, +0xa7264ece, +0xfeffff3e, +0x1e3834a9, +0x400bda0b, +0x1e3834ad, +0x01bcdead, +0x4ea73127, +0xc5fdcfff, +0xfa8e7043, +0xb91ee407, +0x1d0b1a07, +0x01b814a9, +0xd1d14eca, +0xa701c414, +0x15212730, +0xb112bd43, +0x00c11e01, +0x000000d9, +0x0000007e, +0x00003e00, +0x001f0000, +0x000001ff, +0x00000100, +0xd007f54e, +0x0110dd03, +0xdc031d07, +0x232d0797, +0xd101a7dd, +0x0701a800, +0x234d073d, +0x7f1ce3f2, +0x037f2ce3, +0x0301e03d, +0x3501f44d, +0x55f145f0, +0x65e007f2, +0x31f475f3, +0x29f341fa, +0x08aba9a4, +0x2bf05103, +0xc5b123b4, +0xe49974db, +0x139b0739, +0x19943b45, +0x803c0334, +0x27f930c2, +0x27402720, +0x1cd2bd31, +0x18d4bd01, +0x19d3bd01, +0xa9a90701, +0xab02a4e1, +0x10d2adaf, +0x14d2ad01, +0x16daad01, +0x22d1ad01, +0x8f2ea701, +0xd2d5fee1, +0xe4890124, +0x39e39912, +0x04874123, +0x0325e2b9, +0x02e134f0, +0x2314e489, +0xbd492b34, +0x3b011bd3, +0x07420243, +0x07435b42, +0x23200734, +0x23430721, +0x0b138741, +0xad132b23, +0xbd0112d2, +0x03011ad4, +0xe8040711, +0x070f5141, +0x07212323, +0xbd42a73d, +0x03011d34, +0x0bf2a831, +0x1d01bd0d, +0x07e13901, +0x2321070d, +0x0f2c8321, +0x42073107, +0xe287c187, +0x44333433, +0x3c2b4e2b, +0x312b422b, +0x44873387, +0xfef44e23, +0xf43e23ff, +0xd4c5fffe, +0xf8d3c5f4, +0x89fc4b7e, +0xdaad4cd4, +0x94ea0116, +0xdcd10243, +0xfa9301ac, +0xa702d1e0, +0xfefd0b0e, +0x0211a401, +0x40130321, +0x340b240b, +0xa21132ab, +0x0e2630e8, +0x0ee920e8, +0x32874207, +0x432b4533, +0x35333407, +0xf453342b, +0x4101fe88, +0x3e23f231, +0x07fef10c, +0x232a0141, +0x033a0511, +0x98340324, +0x95f293f4, +0x231102d1, +0x31032401, +0x23154103, +0x31ec2405, +0xf3930ea0, +0x0102d180, +0x0baea734, +0xa405fefd, +0x0ea73127, +0xc5fdcfff, +0xd4897003, +0x6c03c54c, +0x01e949e2, +0x075ad489, +0x8d3fab3b, +0x41234ed3, +0x2027ab47, +0x0e6534ee, +0x9d06d499, +0x4fe605d2, +0xf3610e98, +0x2527f471, +0x44034101, +0x34033105, +0x4027f2a8, +0x9d41d299, +0x2fe607d4, +0xdb8904e7, +0x074b074e, +0x0342233b, +0xff4d8333, +0xff3d831f, +0x104c331f, +0xc5103c33, +0xd3c58cd4, +0x6e22e090, +0x9925270e, +0x312705dc, +0x3027b486, +0x44334c07, +0x333324ab, +0xab4ed489, +0xe0d2c523, +0xd3894223, +0x4540e84c, +0x7331030e, +0x5d34f231, +0x50d2890e, +0x23e32303, +0x249b2533, +0xc1c8d4c1, +0x420bccd3, +0xdfff1ea7, +0xa814c5fd, +0x12c5230b, +0xff3ea7a4, +0x34a1efff, +0x8954de89, +0xd1c156d0, +0x1d40c874, +0x42272307, +0x30272405, +0x070ef39b, +0x05ff8b00, +0xcc24a123, +0xdb89ed40, +0x05dc994e, +0x30074147, +0x3310342b, +0x3e9b3227, +0x4ea73fab, +0x85efffff, +0x0bd39943, +0xded12027, +0x402701a8, +0x8d42d49d, +0x430746d2, +0x33334533, +0x2b18e189, +0x034d0b43, +0xe0891f1c, +0xb24cbd16, +0x27157301, +0x034427c0, +0xd4c51f0c, +0x04d29d84, +0xc588dcc5, +0xdcc5e8dc, +0xa0dcc5ec, +0x05731b2b, +0x11271110, +0x409b4107, +0x31a74123, +0x8dfed48d, +0xd1bdfcd3, +0xd0ad0107, +0xdcad0104, +0xdbad0100, +0xdcd50102, +0xe4b9010c, +0x4ce0017c, +0x2300a7ff, +0xf44f6b41, +0x00b9104c, +0x0180e4b9, +0x00b14fe6, +0x2e070a07, +0x10273d07, +0x2e1e0103, +0x018a24a9, +0x272e4ac2, +0x1c349d41, +0x018824a9, +0xa93604ca, +0xc2018a24, +0x41272f40, +0xb92d349d, +0x030180e4, +0x0c2c0311, +0x41d23103, +0x8824a977, +0xcd4ac201, +0x349d4027, +0x31d21e1c, +0x070907f1, +0x9eb2be2d, +0xfdb45efd, +0x349d4027, +0x27d11e2d, +0xbd432b44, +0x89011bd4, +0x243b14e3, +0x32e2392b, +0x3207fd25, +0x07fd205e, +0xb65abe0d, +0x27f031fd, +0xd1041d41, +0x3101acd0, +0xd6fabef1, +0xc60ff6ff, +0xa8ded10b, +0xfc815e01, +0x0180e4b9, +0x0244e2d1, +0x43334103, +0x3ea7b49b, +0x0bfde3ff, +0x153b05b2, +0x993c3534, +0x4fe641d4, +0xd19900ba, +0x5a11d840, +0x893edb99, +0x4b074ed3, +0xcb874433, +0x0ea7c40b, +0xf1ffffff, +0x0003ccc4, +0x0802d1ff, +0xdc330301, +0x0400004e, +0x07a34735, +0xbe171e90, +0xd1ffd504, +0xf1010894, +0x0003ccc3, +0xdc2407ff, +0x0400003e, +0x53420716, +0x6b320748, +0x120d274f, +0x103c5364, +0xdad9b4ce, +0xd199d63a, +0x5712d840, +0x893fdb99, +0x4b074ed3, +0xcb874433, +0x1ea7c40b, +0xf1ffffff, +0x0003ccc4, +0x0812d1ff, +0xdc330301, +0x0400004e, +0x07a34732, +0xbe171e91, +0xd1ffd4a8, +0xf1010894, +0x0003ccc3, +0xdc2407ff, +0x0400003e, +0x53420716, +0x6b320748, +0x120d274f, +0x103c5364, +0xdad9b4ce, +0xd4d1d63a, +0x43b901a8, +0x3ff60327, +0xd2c10bbe, +0xa4d3c1a0, +0xf4054027, +0xc13732c2, +0x420ba8d4, +0x0aa0d4c5, +0xa0d3c543, +0xc1f4dcc1, +0xc411a0d3, +0x991f34c2, +0x0d070cd1, +0xffda00be, +0x01acd0d1, +0xf40c1e27, +0xd4aabe01, +0xc1c311ff, +0x34caa0d4, +0xc1fe01e3, +0x4ee2acd4, +0xd41900d1, +0xc403ce07, +0xc64ada89, +0xff3ea748, +0x3411d07f, +0x9b5ed289, +0x1624c22c, +0x34113225, +0x070f24c2, +0x1a1c2703, +0xf3e83107, +0x42ca0411, +0x4ed089f8, +0x009b0fe6, +0xe641d199, +0x3ad4a91b, +0x374ec202, +0xc1f0d2c1, +0xd389e8d4, +0x0b240b60, +0x4312e023, +0x40bc270b, +0x31233007, +0x1ea73383, +0x27fde6ff, +0x5ed48904, +0x420b439b, +0x1b151405, +0x31034027, +0x33831435, +0xe8f0f050, +0x4a070b20, +0x48033127, +0x4c023e2b, +0x430b4c07, +0x46fe4c83, +0xe8d2c14c, +0x0ea71407, +0x27fde67f, +0xeea710cc, +0xc1fde6bf, +0xd489f0d3, +0x0b320b64, +0x15040543, +0x62d4890c, +0x430b2027, +0xd3890235, +0x15e40558, +0xc1e235e3, +0xd389e8d2, +0xc5230b5e, +0xf1f0e8d2, +0x4ed489d3, +0x1ea74f26, +0xc1fdefff, +0x13c14014, +0x6012c150, +0x33183c33, +0x3c53182c, +0x1d2c531d, +0x0b184c33, +0x1d4c5332, +0x3a66340b, +0xd0d1c107, +0x1e2701ac, +0xbe01f40c, +0xc1ffd390, +0xc3c140c4, +0x60c2c150, +0x33183c33, +0x3c53184c, +0x1d4c531d, +0x0b182c33, +0x1d2c5334, +0x3fd6320b, +0x99f401d2, +0x440341d3, +0x3fe6f405, +0xdcc100ea, +0x36d4a984, +0x4c4cda02, +0xa742d399, +0xfddfff0e, +0x43072307, +0x27334933, +0x2d03240b, +0xdec13200, +0xc5c423e0, +0xd1c19c02, +0xc14c078c, +0x4d8390d0, +0xc2031fff, +0xab94d2c5, +0xffcd8341, +0xff1ea71f, +0x3183fddf, +0xabac14c5, +0xab3633c0, +0xb01cc53e, +0xc18c13c5, +0xd4c188d1, +0x8b41e2ac, +0x41d49900, +0xc1f0d0c1, +0xde89ecd2, +0x6142e060, +0x40cc2709, +0x0238d4a9, +0x995c41c2, +0x4f1605d4, +0x0b4ed389, +0xf62e0b20, +0x2706b83f, +0xa7140744, +0xfde6cf0e, +0x11274114, +0x0c150205, +0xd3894027, +0x0b04355e, +0xc1f18023, +0xd2c188d1, +0x992b1eec, +0xd2c10bd3, +0x334307f8, +0x2b333345, +0x5cd38943, +0x43ad4d0b, +0xd38901b8, +0x4edb895e, +0x3305dc99, +0x5e231533, +0xd389fba9, +0x0b43875e, +0x27140324, +0x88d1c544, +0x8decd2c5, +0xd19946d4, +0xbe0d070c, +0xc1ffd7b9, +0xd39984d4, +0xc3420342, +0xa0d1c131, +0xc5a4d2c1, +0xd39d84d4, +0x3721c242, +0x0ba8d4c1, +0xa0d4c541, +0xd2c5420a, +0xf4dcc1a0, +0x11a0d3c1, +0x1f34c2c4, +0x070cd199, +0xd77fbe0d, +0xacd0d1ff, +0x0c1e2701, +0x29be01f4, +0xc311ffd2, +0xcaa0d4c1, +0xfe01e334, +0xe2acd4c1, +0x1900d14e, +0x03ce07d4, +0x4ada89c4, +0x3ea748c6, +0x11d07fff, +0x5ed28934, +0x24c22c9b, +0x11322516, +0x0f24c234, +0x1c270307, +0xe831071a, +0xca0411f3, +0xd089f842, +0x9b0fe64e, +0x41d19900, +0xd4a91be6, +0x4ec2023a, +0xf0d2c137, +0x89e8d4c1, +0x240b60d3, +0x12e0230b, +0xbc27081a, +0x23300740, +0xa7338331, +0xfde6ff1e, +0xd4890427, +0x0b439b5e, +0x15140542, +0x0340271b, +0x83143531, +0xf0f05033, +0x0707f7e8, +0x0331274a, +0x023e2b48, +0x0b4c074c, +0xfe4c8343, +0xd2c14c46, +0xa71407e8, +0xfde67f0e, +0xa710cc27, +0xfde6bfee, +0x89f0d3c1, +0x320b64d4, +0x0405430b, +0xd4890c15, +0x0b202762, +0x89023543, +0xe40558d3, +0xe235e315, +0x89e8d2c1, +0x240b5ed4, +0xf0e8d2c5, +0xd4d1d3f1, +0x4c76010c, +0x0d071f07, +0xffeadfbe, +0x070cd199, +0xd67bbe0d, +0xfcd289ff, +0x8bfed489, +0x4ed0892f, +0x076f42f2, +0xd4d54027, +0x2103010c, +0x41272028, +0x010cd4d5, +0x0107d4b9, +0xe0fcd28d, +0xe004db41, +0x1e03f742, +0xce41c4ff, +0x0100d3a9, +0xee0ed499, +0xf6072b34, +0xb903d13f, +0xf60106d4, +0x9903c94f, +0x46f606d4, +0xa7e4d4c1, +0xfdbf3f3e, +0xd2c13425, +0xff0ea7dc, +0x02c5fddf, +0xa8dcd140, +0x9d402701, +0xc3b906d4, +0x35a60327, +0x10270d07, +0xd1f57f7e, +0xc101a8dc, +0x3ea774d1, +0x99ffffff, +0x32b9dec7, +0x1ff6152d, +0xb70706b6, +0xf6b8c4c1, +0x0705734f, +0x60c4b937, +0x12830703, +0x08840743, +0x8c27348c, +0x6be80733, +0x10debdef, +0x29c3b902, +0x10d2b903, +0x11d3bd02, +0x07312302, +0x034f6b43, +0x6f42f031, +0x992e0704, +0x462743c3, +0x240b439b, +0x4c83480b, +0x9949333f, +0xd29d08d3, +0x70d4c518, +0x9d1bd29d, +0xd29d1ad2, +0x0737e619, +0x0c4c0348, +0x333f4c83, +0x3ea7174c, +0xa3f3ffff, +0x35cbcd4e, +0x277434c5, +0x08d39d30, +0x0329c4b9, +0x06294ff6, +0x017cc4b9, +0x06214ff6, +0x25532807, +0x27834807, +0x2da34533, +0x4d832000, +0x38071f00, +0x3c8324ab, +0x2723abf0, +0xc1f41540, +0xf28db8c3, +0xef3fe608, +0xe6d45905, +0x9905e24f, +0xd479dec2, +0x05d34ff6, +0xfe9d0e07, +0x04f19904, +0x0705fe9d, +0x2b310741, +0x07302b42, +0x06f49de1, +0xa707f39d, +0xfef51f4e, +0xd4d14311, +0xf0890208, +0x99432b08, +0xfb9907fc, +0x0542f406, +0x0cd3d105, +0x33430702, +0x2b334743, +0xe841fd43, +0xedff010a, +0x010aec40, +0xeb4cfdff, +0xfdff010a, +0x010aea4b, +0xe94efdff, +0xd1ff010a, +0xa70208d3, +0xfef51f4e, +0xd3d53103, +0x43050208, +0x020cd4d1, +0x41834103, +0x020cd4d5, +0xaea74127, +0x99fdcfff, +0xa4c509d3, +0x2c3fe66c, +0xa8d4d101, +0x41d69901, +0x032d43b9, +0x032b45b9, +0x009d3fe6, +0xc333c607, +0x4f034c07, +0x0003939c, +0x43114201, +0x2473289b, +0x21e8230b, +0x420704b1, +0x537f2c28, +0x01f583f0, +0x404cf004, +0xe4470465, +0x837fec23, +0x4c077fec, +0x939c4f03, +0x42610003, +0x289b4371, +0x230b2473, +0x043e21e8, +0x2c284207, +0x55f1537f, +0xf01401f5, +0x0420404c, +0x1c231447, +0x7f1c837f, +0x4c071733, +0x939c4f03, +0x42c10003, +0x3443c130, +0x2473289b, +0x21e8230b, +0x420703f5, +0x537f2c28, +0x01f523f3, +0x404cf034, +0x44470447, +0x837f4c23, +0x4c337f4c, +0xab31070e, +0x0734ab3e, +0x804f0346, +0x19000393, +0x184a9941, +0x337f1c83, +0x13ab151c, +0x43994b79, +0x094e9906, +0x990c4099, +0x42990f49, +0x154c9912, +0x270c53c8, +0x27649641, +0x1c4c3340, +0x3c8314ab, +0x7fec837f, +0xec333733, +0x7f2c830e, +0x3eabc783, +0x837fbc83, +0x27337f0c, +0xa715cc33, +0xf3ffff4e, +0x2cab3bab, +0x83150c33, +0xa7837f9c, +0xab6841c5, +0x3329ab30, +0x43c518ac, +0xc52aab6c, +0x40277042, +0xa709d49d, +0xffffffae, +0x152da7bd, +0x420c8cf4, +0xd1202703, +0x8701a8dc, +0xa0c3d142, +0x8040f102, +0xf6000353, +0x0702003f, +0xbe30271d, +0x07fdabe7, +0x7f2c8320, +0x41534007, +0x4e833207, +0x530fff80, +0xa743ab31, +0xf3ffff1e, +0x997c14c5, +0x4fe641d4, +0x0fa301c5, +0x2a000000, +0x42e010a5, +0x324703fb, +0x032bc4b9, +0x43874646, +0x340b3433, +0x02003d30, +0xf42af253, +0x3d832301, +0x4ea701ff, +0xc5f3ffff, +0x8cf45843, +0x07041514, +0x33480728, +0x0f4c332a, +0x2e833807, +0x8303c000, +0x3c00004e, +0xab3f3c83, +0x07383324, +0x144c3348, +0x4f8323ab, +0x03c00000, +0x84f924ab, +0x00035420, +0xffff0ea7, +0xb524abf3, +0x08d4b902, +0x264fe601, +0x070d0701, +0xe6fabe1f, +0x07d499ff, +0xfc1f4ff6, +0x0100d4a9, +0xfc174fe6, +0x01a8d4d1, +0x032043b9, +0x54ff3ce0, +0xff1ea703, +0x14c1fddf, +0xfe44fc40, +0x7e0d07fb, +0x4127f17a, +0x5e07d49d, +0xd4b9fbf1, +0x4fc60109, +0x0bd199b5, +0x5abe0d07, +0xaa1effd2, +0x32074207, +0x44474273, +0x21733183, +0x2183430b, +0x0100d4ad, +0x0106d2bd, +0x0106d1b9, +0x0100d4a9, +0x14862127, +0x30072027, +0x41c3310b, +0xd3ad428b, +0x31270102, +0x0108d4bd, +0x0109d3bd, +0x0110d2a9, +0x0112d1a9, +0x02f012ee, +0x43834207, +0x43b94d0b, +0x3f4b011d, +0x20c8230b, +0xed12daf0, +0x42073207, +0x42533383, +0x0114d4ad, +0x0118d3bd, +0x0110d2ad, +0x010cd4d1, +0xfb5442e4, +0x0604d499, +0xbe0d0745, +0x99ffccb7, +0x0d070bd1, +0xffd1ccbe, +0x01a8d4d1, +0x032043b9, +0x2fff3cc0, +0x7607d499, +0xff3ea749, +0x34c1fddf, +0x1f44d840, +0xaea74827, +0xd1fddfff, +0xa501acd0, +0x151c27a4, +0xffcc53be, +0xa4a54027, +0xdc40a3c1, +0xd499e334, +0x5e4ff606, +0x7e0d07f6, +0x565ef08e, +0x270d07f6, +0xd2c2be10, +0xfedb5eff, +0xd2ad4027, +0xd4bd0100, +0x2d5e0106, +0x833123ff, +0x5ed48933, +0x240b439b, +0x3e5e4127, +0x000fa3f9, +0xa7540000, +0xf3ffff1e, +0x3b5e10a5, +0xbe1d07fe, +0x5efdaa96, +0x2cd0fe03, +0x4127452e, +0x40273104, +0xfffb4f13, +0xd1b9ffff, +0xd4bd0211, +0x11c00212, +0xfa4c2729, +0x0213d4bd, +0x271b11c0, +0x3127fe4c, +0x30271104, +0x0214d4bd, +0xd4bd4127, +0xd3bd0215, +0x565e0216, +0x1e4127fb, +0xfe4c27e6, +0x2cd0d71e, +0x41274929, +0x40273104, +0xfffd4f13, +0xd1b9ffff, +0xd4bd0211, +0x11c00212, +0xfc4c272d, +0x0213d4bd, +0x271f11c0, +0x3127ff2c, +0x30271104, +0x11004127, +0xd2bd4027, +0xd4bd0214, +0xd3bd0215, +0x0a5e0216, +0x1e2027fb, +0xff4c27e2, +0x31c0d31e, +0xfb4c2737, +0x0211d1b9, +0x0212d4bd, +0x272511c0, +0x2127fd4c, +0x20271104, +0x11003127, +0xd4bd3027, +0x40270213, +0x0214d3bd, +0x0215d4bd, +0x0216d2bd, +0x27facc5e, +0x27dc1e40, +0xc91efe4c, +0x2b070c07, +0xd1ebc27e, +0x0701a8dc, +0x2fc4b970, +0x124f4b03, +0xb9740740, +0x4b0330c4, +0x0774124f, +0x45c4b974, +0x684fe603, +0x46c4b9fa, +0x604fe603, +0x58c2d1fa, +0x922ff603, +0x02d3a900, +0x48c4d101, +0x4c43e203, +0xff4ea7fa, +0x43d1ffff, +0x425e184c, +0x232807fa, +0xbc5e0c2c, +0x3dfa53fc, +0x5ea401f1, +0x1c27fc21, +0x33142b3f, +0x001d8318, +0xfbe05e3f, +0xf122f253, +0xd75e2101, +0x3f4c13fb, +0xec83e447, +0xfb9c5e7f, +0xcfffaea7, +0x48a2c1fd, +0x42073027, +0xa4c544a3, +0x0ef39b48, +0xff8b0007, +0xc548a2c5, +0x3ea768a3, +0x11fef51f, +0x08d4d132, +0xd4422b02, +0xce5ed342, +0x7cec27fa, +0x13fb655e, +0x4c333f4c, +0x004e830f, +0xba5e1f80, +0x48c0d1fb, +0x02dea903, +0x9b400701, +0x784eee42, +0x6fe4e201, +0x07210301, +0x23409b42, +0x634ee221, +0xff1ea701, +0x13d1ffff, +0xc1d1184c, +0x4107034c, +0x42ee4123, +0x4107f995, +0x4123409b, +0xf98be4e2, +0xffff2ea7, +0x4c23d1ff, +0xf97f5e18, +0xd95e20a7, +0x8ef203f1, +0xdec099f5, +0x07fa2d5e, +0x5e2f6b2b, +0xf199fa1e, +0x05fe9904, +0x27fa365e, +0x5e21112d, +0xb207f9f7, +0xa7f94b5e, +0xfddfff2e, +0xfc4024c1, +0x5ef8ac41, +0x4027fcad, +0x0119d4bd, +0x87fd335e, +0xfc065e32, +0x070cd199, +0xef067e0d, +0x90be0d07, +0xd3a9ffcd, +0xc45e0100, +0xd54227f8, +0x5e010cd4, +0xbc27fcdc, +0xf7e75e80, +0xc15ed489, +0x4487e8d3, +0xd4d1340b, +0xd3c5010c, +0xf8505ee8, +0x5e80cc27, +0x8c50f6a0, +0x01fa5323, +0x5ea201f0, +0x2807fc0e, +0x2a334807, +0x38074733, +0xc0002e83, +0x004d8303, +0x0f3c333f, +0x3e8324ab, +0x5e3c0000, +0x0027fbdf, +0x27f0be5e, +0xf19a5e21, +0x4103432b, +0x21152405, +0x27f1595e, +0xff2ea744, +0x24c5fdcf, +0x270c0748, +0x39be181c, +0x4027ffc9, +0xcfff3ea7, +0x4834c5fd, +0x5e6834c5, +0x0d07f0d6, +0xd97e1027, +0xf43c5ee8, +0x6174d1c1, +0x070d07f3, +0xa39ebe2a, +0xf16c5efd, +0xcd5e2027, +0x5e2727f1, +0xbc27f193, +0xf4be5e80, +0xc15ed389, +0x3387e8d4, +0xd4c5430b, +0xf5275ee8, +0x0750d489, +0xe3430323, +0x33212343, +0x5e249b45, +0x3707f1a0, +0xa7fea55e, +0xffffffae, +0x184ca3d1, +0x00fe995e, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x1c000808, +0x3030001c, +0x00343c00, +0x00001000, +0x02000010, +0x00010000, +0x00000017, +0x00000021, +0x00000017, +0x00000021, +0x00000012, +0x00000040, +0x00000017, +0x00000002, +0x00000017, +0x00000002, +0x00000009, +0x0000002b, +0x00000015, +0x00000000, +0x00000015, +0x00000000, +0x0000001d, +0x00000000, +0x3ea7fb4e, +0x27fdeb7f, +0x273c05c0, +0x0200004f, +0x27341511, +0x0ef49b40, +0x01a802d1, +0xe5ff1ea7, +0x2823b9fd, +0x0bb42703, +0xc424b923, +0x33348702, +0xf1340b44, +0x0003d43e, +0x151e05ff, +0xef3ea71b, +0x1c35fde5, +0x05244c27, +0xa73b1534, +0xf7ffff2e, +0x2cd53c35, +0x24d10100, +0xe40b0108, +0xfb8e0e55, +0x00100000, +0x4027f54e, +0x0706049d, +0x0c119951, +0x019df0e3, +0x12528941, +0x02a851d1, +0x894a028d, +0x54894a03, +0x8d310314, +0x43074c04, +0x048d4153, +0x47412350, +0x2b312344, +0x23334734, +0x9d402731, +0x048d4303, +0x16548952, +0x034c0389, +0x44530f4c, +0x8954048d, +0x01c51852, +0x0f2c0380, +0x4c034207, +0x8d455310, +0x41235a04, +0x342b4447, +0x31233347, +0x028d2453, +0x44039d56, +0xd10e5299, +0x9d01a801, +0x53a90a02, +0xd0070312, +0x995e038d, +0x4ff64314, +0x4d270486, +0x048d012c, +0xfc3c2760, +0x010c4d27, +0x8d64038d, +0x54b96204, +0x4ff60321, +0x30270458, +0x030c51a9, +0xd18dd31d, +0x0e52a966, +0x1654b903, +0x68d28d03, +0x04304ff6, +0xd4193027, +0x4fe6d33d, +0x4ea7041c, +0xc5dfffff, +0xd489f0d4, +0x5ed18950, +0x24074447, +0x219b3107, +0xd48d3333, +0x0b48035c, +0x27118723, +0xd4c50c0c, +0xc54d07ac, +0xd1c5a4d2, +0xb04d03a8, +0x07202701, +0x23420530, +0xb8440301, +0x274027f3, +0x50de8931, +0x9d0bd49d, +0xd09d0cd3, +0x1eecf40d, +0xd099019c, +0x0ed29d41, +0x019e0ff6, +0x031c54b9, +0x450b30a7, +0x02c442b9, +0xd29d4127, +0x3312873e, +0x40d49d24, +0x0b3fd39d, +0xd014f112, +0xc5ff0003, +0x02e0c8d4, +0x40270441, +0xd49d3127, +0x09d39d08, +0x032ae8f0, +0xe1034e07, +0xd3c1e1e3, +0x032e07ac, +0x03382343, +0xa8ded124, +0x36d4ad01, +0x3ad3ad02, +0x3cd2ad02, +0x38d3ad02, +0x18e2b902, +0x19e1b903, +0x23420703, +0x2840e846, +0x07310703, +0x6b362304, +0x2a30e80f, +0x7f3c8303, +0x3c334007, +0xab483310, +0x3340ab43, +0xa343ab37, +0x0200002e, +0xffff3ea7, +0x451833f3, +0xc521ab34, +0xe4d14832, +0x4df802b0, +0x030e1000, +0x4a522e27, +0xff4ea709, +0xe3b9f3ff, +0x42350316, +0x02ec3ff6, +0x2741d499, +0xe001003d, +0xa3035142, +0x1080003e, +0x3643e499, +0x44e49945, +0x03814fe6, +0xa3284c27, +0xd48d403c, +0x29e4b958, +0xa3130703, +0x0000001f, +0xb9455654, +0xe6017ce4, +0xd103294f, +0xa702c0e2, +0xfd4fff3e, +0xe87434c1, +0xa7033c40, +0xf3ffff4e, +0x994c41c5, +0x3ff641d3, +0x1d270247, +0x3ea72008, +0x99f3ffff, +0x31c508d4, +0x27455678, +0x35cbcd4e, +0x0b7434c5, +0x5032c52f, +0x032be4b9, +0xa74a42d0, +0xebffff2e, +0xa49c4e27, +0x1824d5c0, +0x1c24d501, +0x2024d501, +0x843e2701, +0x23d5a08c, +0x23d50124, +0x23d50128, +0x4e27012c, +0xd5040810, +0xd5013024, +0xd5013424, +0x27013824, +0x0810203e, +0x013c23d5, +0x014023d5, +0x014423d5, +0x0327e4b9, +0x02d64ff6, +0xf58ef0c3, +0xd0994427, +0x0ed49d41, +0xfe660fe6, +0x01a8d6d1, +0x01acd8d1, +0xd1126289, +0x1502ac64, +0x1b63b9f2, +0x25080703, +0xbef405f3, +0x27ff9f28, +0xff4ea731, +0x43c5f7ff, +0x0348074c, +0x2027184c, +0x05103c27, +0xc8440342, +0x270027f3, +0x11bc27e0, +0xf2014127, +0x4e3b1e47, +0x428b3107, +0x4ea6360b, +0x02c432b9, +0x32874207, +0x340b4433, +0xb5ff2ce0, +0xd837f102, +0x07ff0003, +0xb064d130, +0x03910702, +0x87100731, +0x0b980ba0, +0xdcc38718, +0x2404004d, +0x3f80a7f5, +0x129dff0a, +0x18909d58, +0x00004e27, +0x80c4f510, +0x9dff0a3f, +0x40a71993, +0x0203380b, +0x0358349d, +0x99fbf0e1, +0x4f6b4007, +0xb60a849d, +0xa7835146, +0xf7ffff4e, +0x3f8043e5, +0x8443e502, +0x0203023f, +0x17200cd4, +0x27203c27, +0x1000002e, +0x4087302b, +0x3f8042f5, +0x0103ff0a, +0x40a7f398, +0x84358445, +0x42be0807, +0x64b9fd67, +0xd2d1031c, +0xd39901ac, +0x99420b41, +0xd49d1844, +0x3a32e048, +0x43649902, +0x02234fe6, +0x13446399, +0x83222742, +0x83232b47, +0x144c3327, +0xa3172c33, +0x0482b04f, +0xd124ab80, +0xd101a8d4, +0x1802b043, +0xa301003d, +0xa710002d, +0xf7ffff4e, +0x11346389, +0xc54225f1, +0x31238041, +0x898443c5, +0xf3213662, +0x0b8843c5, +0x23f32532, +0x8c43c531, +0x43c53027, +0xc52123a8, +0x4335ac42, +0x43c54345, +0xff3ea734, +0x34a1efff, +0x00004fdc, +0x071b4000, +0x05412723, +0x9b302724, +0x00070ef3, +0x2305ff8b, +0x4fd824a1, +0x40000000, +0xa8d4d1e9, +0x43439901, +0x01833fe6, +0x83444499, +0x33438333, +0xab483334, +0xa74aa343, +0xefffff3e, +0x40273425, +0xd0993435, +0x50de8941, +0x27fca75e, +0xfdbc5e10, +0xe1032e07, +0xd389e1e3, +0x034e07ac, +0xd1480327, +0xad01a8de, +0xad023cd4, +0xad0236d2, +0xad023ad3, +0xb90238d3, +0xb90318e2, +0x070319e1, +0xec462342, +0x27fcdc40, +0x07310740, +0x6b362304, +0xda30ec0f, +0x5e3027fc, +0xd499fcd5, +0x634fd641, +0x81003e27, +0xfd1a5e10, +0x49d22e27, +0xfcf35e07, +0x025c53d1, +0x5ef0d3c5, +0xd499fbe6, +0x46302741, +0x8331c34b, +0xfbc85e31, +0xffff4ea7, +0x4143b9fe, +0xe6412701, +0x5e340737, +0x4d27fb9c, +0x048d0164, +0x2c3d2760, +0x3c4d2701, +0x64038d01, +0x5e62048d, +0x4027fb7a, +0x7d5e3407, +0xc33127fb, +0x5e318331, +0x3d27fb8e, +0x42e40180, +0x3ea3fcb3, +0x5e108200, +0xe2d1fcb0, +0x2df802c0, +0xfcd50a00, +0x13074127, +0x4fff3ea7, +0x08d49dfd, +0xa37434c1, +0x4000001f, +0xc840ec54, +0x7434c1fc, +0x00004ef8, +0xb9fcbe01, +0x33032ee4, +0x14ab1f4c, +0x27fcb25e, +0xd48d204c, +0xfc835e58, +0xf0c30d07, +0x095ef50e, +0x2854b9fa, +0xd410f103, +0x0bff0003, +0xc442b945, +0x080c9902, +0x34333207, +0x430b4287, +0x03d441f1, +0x44f1ff00, +0xff0003d0, +0xc5240389, +0x1489ccd4, +0x08119924, +0xe23fd29d, +0xb6fb8943, +0x3dc1c014, +0xd49d4227, +0xfb7c5e40, +0xfa1ef353, +0x4c5e3701, +0x444499fd, +0xfe7d4ff6, +0x845e4a27, +0x446399fe, +0xfddd3ff6, +0x82b02f27, +0xec5e8000, +0x2864b9fd, +0x99240b03, +0xd29d1822, +0xfdbb5e49, +0xd49d4327, +0xfb405e40, +0x1389f54e, +0x1612891c, +0x891a1e89, +0xa107181c, +0x1ea74127, +0x45fddfff, +0x2b2e2b14, +0xd402c5c3, +0xd5d00cc5, +0xb901c412, +0x070324a3, +0x8413c5d0, +0xe35ca4c1, +0x530407f3, +0x83140748, +0x1153300c, +0x04534183, +0xf4c51183, +0xc5f06534, +0x4ff630f1, +0x300701cc, +0xc134f4c1, +0x040e30f0, +0xa18934a3, +0xc5410764, +0x4d8338f1, +0x4fe68000, +0x2ea70127, +0x89fddfff, +0x2cd57ca3, +0xa4c10108, +0x5342fc80, +0x0c23d502, +0x68a4c101, +0x01f824d5, +0xc134f0c1, +0x408730f1, +0xf2611333, +0x42ab41ab, +0xdfff1ea7, +0x8814c5fd, +0x0320a3b9, +0x10ff3cc0, +0x34334387, +0x44f1430b, +0xff0003d0, +0x89d8d4c5, +0xd3894cd4, +0x07410350, +0x0f4c3323, +0x0fff2d83, +0x00004f83, +0x35330fff, +0x3c0342ab, +0xa014c57f, +0xd57f3ce3, +0x2701d013, +0xdcd2c521, +0x8343a499, +0x33340743, +0xab463334, +0xa3230734, +0xdcd2c523, +0x0320a4b9, +0xa3ff4c20, +0xdcd3c537, +0x8338f4c1, +0xe680004d, +0xc1011a4f, +0x42f880a4, +0xd2c101a9, +0x002da3dc, +0xdcd2c502, +0x5880a4c1, +0x002da344, +0xdcd2c504, +0xf880a4c1, +0x00f8404c, +0x40002da3, +0xc580d4c1, +0x4de4dcd2, +0x00f10102, +0xd2c528a3, +0x22a4b9dc, +0x83302703, +0xab4b3343, +0xdcd2c524, +0xdfff4ea7, +0x6143a5fd, +0xf63183f3, +0xd100f33f, +0x2702a8a1, +0x1de0200c, +0x00f30201, +0x02021df0, +0x1de0010f, +0x01590281, +0x12011de0, +0x402700e1, +0xd4c5f3c3, +0x07f58ee4, +0xf4422343, +0x27012e43, +0x07332741, +0x801c031a, +0x05d64ff6, +0xdef72ea7, +0x031401fd, +0x03240514, +0x27f3a824, +0x073a0743, +0x683c032f, +0x2c031f07, +0x0530610c, +0x03300120, +0x03100524, +0x78140334, +0x8ca489f4, +0x02a8a0d1, +0x14074103, +0x41231153, +0x0c182027, +0x072127f0, +0xe03f6b32, +0x1403010d, +0x020df403, +0x4000f703, +0xf401210d, +0xe501220d, +0x020de002, +0xe402ef01, +0xff01040d, +0x27848700, +0x85402770, +0x00fc5ef4, +0x22032007, +0x33833207, +0xf2652223, +0xc1fe2b5e, +0xd4c1dcd2, +0x024de080, +0xe0ff1301, +0x0d11024d, +0x024de0ff, +0xe0ff0780, +0x0180224d, +0x824de0ff, +0xd1fefb01, +0x8302a8a4, +0xf644e447, +0xfeee5efe, +0x02a8a1d1, +0xe4d0d0c1, +0x1102011d, +0xd4d2c1ff, +0x209b1027, +0x31533207, +0x420b4307, +0x80014ed4, +0x41072c3e, +0x48334383, +0xd4c5f3c3, +0xe4f58ee4, +0xc1fefd11, +0xd3c1d4d4, +0x9b2007d0, +0x53249b34, +0x07102731, +0xd0420b43, +0x3e80014e, +0xf0230ad6, +0x3e80012e, +0x4107021e, +0x48334383, +0xf3c341a3, +0x8ee4d4c5, +0xdcd2c1f5, +0x27fe625e, +0xd237e041, +0x5e4027fe, +0x3703fecd, +0xfff83d83, +0xc1fda85e, +0x1127d4d4, +0x01c43ff6, +0x209b2447, +0x12133207, +0xb01e3153, +0x11210de0, +0x0df4ff1d, +0x023e1122, +0x11020de0, +0x0de001f8, +0xff0b1104, +0x03210de0, +0x102701fb, +0x7027f185, +0xa4c18027, +0x5334075c, +0x83e40738, +0x318330ec, +0x34c6e453, +0xe383e203, +0x41834953, +0xe4a3340e, +0x8338f4c1, +0xf680004d, +0xc1fd4f4f, +0x4de080d4, +0x01ec0301, +0xe0206c27, +0xd701020d, +0x020de001, +0xe0043b11, +0x3503210d, +0x210d0004, +0x210de401, +0x27040711, +0x205c2721, +0x4227f275, +0x0de0e408, +0x01460281, +0x01040de0, +0x0de00149, +0x01431104, +0x21040de0, +0x1027013d, +0x0de0f195, +0x01373104, +0x01820de0, +0x1027011d, +0x03010de0, +0x0de0013d, +0x01370321, +0xf3a53027, +0xf2b52027, +0xdfffcea7, +0xc1b027fd, +0x9c27d4d2, +0x14cbd520, +0xd5140b01, +0x070118cb, +0xd5313b39, +0x07011ccb, +0x00412713, +0x2703210d, +0xe0143b40, +0xec01c7e3, +0xe00133e4, +0xe80176e1, +0xe00569e2, +0x4802010d, +0x010de005, +0xe0054212, +0x4001020d, +0x020de004, +0xe0043a11, +0x2101210d, +0x210de005, +0xe0051b11, +0x6502810d, +0x83100704, +0xf914e017, +0x820de004, +0xe004f301, +0xc103210d, +0x80a3c104, +0xdfff2ea7, +0x233533fd, +0x23d5203c, +0xa4c10114, +0x23443384, +0x24d5104c, +0xa3c10118, +0x23343388, +0x23d5103c, +0x14e0011c, +0x0de00409, +0x04030182, +0x41d0d4c1, +0x533407f2, +0x31312331, +0x07f051f1, +0x0b239be2, +0x81412372, +0x9b419bf2, +0x33230b30, +0x33840be4, +0x85043315, +0x2b852bf2, +0x13101326, +0x13762be0, +0xb0d1c500, +0xc5b4d8c5, +0xd7c5b8de, +0xc0d0c5bc, +0x5ec4d2c5, +0x24470181, +0x1027209b, +0x12133207, +0xec5e3153, +0xa52227fd, +0xfef25ef2, +0x10273127, +0xd95ef395, +0x953027fe, +0x5e1227f3, +0x4107fed0, +0x48334383, +0xf3c344a3, +0x8ee4d4c5, +0x273127f5, +0xa5f3b520, +0xfeca5ef2, +0x02010dc0, +0x810dc05e, +0x0de45902, +0xfe180182, +0x840b8147, +0x7027833b, +0xf3853027, +0x3bfe115e, +0x3b840713, +0x85710783, +0xfe045ef1, +0x023de5e0, +0x01bae5e8, +0x014ae6e0, +0x00afe7e0, +0x5c27ff1e, +0x27412740, +0x5ef17510, +0x6c27fe40, +0xfe155e10, +0x21040de0, +0x0de0fcd5, +0xfccf3104, +0x12010de4, +0x8407fdc6, +0x7107833b, +0x20273103, +0xf285733b, +0xe0fdbd5e, +0xd701210d, +0x210de002, +0xe002d111, +0xc402810d, +0x83400702, +0xc344e047, +0x820de002, +0x8102bd01, +0x2b3607f4, +0x81f48546, +0x134507f0, +0x2b852b30, +0xc5401376, +0xd8c5b0d4, +0xbcd7c5b4, +0xc5c0d3c5, +0xd3c5c4d0, +0x00835eb8, +0x01210de0, +0x0de0027f, +0x02791121, +0x02810de0, +0x4007024d, +0x44e44783, +0xd4c10213, +0x23f331d4, +0x87439b41, +0xb0d2c525, +0x1eb4d4c5, +0xe0320755, +0xf301210d, +0x210de001, +0xe001ed11, +0xd402810d, +0x41fb3101, +0xa12307fc, +0x3b2173f4, +0x51212314, +0x23f081f4, +0x9bc29b31, +0x2b312b3b, +0x2b249b06, +0x134607c6, +0x0bf08540, +0x0bc70b38, +0xc5101302, +0xd3c5b0d1, +0xbcdcc5b4, +0xc5c0d4c5, +0xd4c5c4d0, +0xc1f391b8, +0xf401b4d2, +0x3bc4d0c1, +0xbcd1c123, +0xf421240b, +0xdec1033b, +0xb8dcc1b0, +0x3bc0dbc1, +0x11040b13, +0x0bf491f3, +0x3be43b13, +0xc5b43bc4, +0xdcc5b0de, +0xc0dbc5b8, +0xc5b4d2c5, +0xd0c5bcd1, +0xfa265ec4, +0xf291f4a1, +0x240be907, +0xa3c1f471, +0x07e47b80, +0x07423b41, +0x133e9b24, +0xd5432b40, +0xb10114c4, +0x84a3c1f4, +0x2013247b, +0x321b3433, +0x0118c3d5, +0x3388a4c1, +0xd5242b44, +0xe0011cc2, +0xfd02810d, +0x41fb3100, +0x51f0a1fc, +0x07103bf4, +0x9b362b37, +0x33812bbe, +0xc54433c4, +0xd8c5b0db, +0xb8dcc5b4, +0xc5c0d4c5, +0xd3c5c4d3, +0xff535ebc, +0xf391f2a1, +0x0b80a4c1, +0x71f3a532, +0x7b2107f3, +0x9bf3a193, +0x0b233b49, +0x14c4d542, +0x84a3c101, +0x3433f4b1, +0x320b247b, +0x0118c3d5, +0x3388a4c1, +0xd5240b44, +0xe0011cc2, +0x8602810d, +0x41fb3100, +0xd0d4c1fc, +0xf071fe51, +0x205b2407, +0x39071c07, +0x0e074153, +0x30134123, +0x14332123, +0xc49b0433, +0x4e9b2b9b, +0x10133b9b, +0xd3c50013, +0xb4d2c5b0, +0xc5b8d1c5, +0xd0c5bcdc, +0xc4d4c5c0, +0xa1fed45e, +0xc0d6c5f2, +0xd1c5123b, +0xc4dbc5b0, +0xc5b4dbc5, +0xdbc5b8d6, +0xfebb5ebc, +0x27205c27, +0x020de041, +0x27fdb611, +0xfdb15e40, +0xdef72ea7, +0x031401fd, +0x05401314, +0x98240324, +0xfa295ef3, +0x1e405c27, +0x41fb31db, +0x53b153fc, +0x45fb35c1, +0xff735efc, +0xfc41fb31, +0xc153b153, +0x71538153, +0xfc45fb35, +0x31fef85e, +0x53fc41fb, +0x53c153b1, +0x35715381, +0x5efc45fb, +0x3173fe21, +0xe0fe125e, +0xeb01820d, +0xd4d3c1fd, +0x2307f431, +0xf1413123, +0x2153349b, +0x2123f451, +0x249b129b, +0xc5b0d5c5, +0xd1c5b4d3, +0xc0d6c5bc, +0xc5c4d2c5, +0x265eb8d6, +0xd4d4c1fe, +0xf241f331, +0x41531407, +0x41231123, +0x429b139b, +0x26473547, +0xc5b0d3c5, +0xd2c5b4d1, +0xbcd4c5b8, +0xc1fe005e, +0x4153d4d4, +0x47fd945e, +0x5e664755, +0x5587fd47, +0xc1fd425e, +0x453380a4, +0xd5404c23, +0xc00114c4, +0x7e01210d, +0x11210dc0, +0x810dc079, +0x10074002, +0xf75e1783, +0xd0d4c1fb, +0x4123f331, +0x4c23439b, +0x0b353380, +0xc5301348, +0xd4c5b0d3, +0xfdaf5eb4, +0xa780a4c1, +0xfddfff2e, +0x4c234533, +0x1424d540, +0x84a3c101, +0x3c233433, +0x1823d540, +0xd0d4c101, +0xf241f131, +0x41533407, +0x41233123, +0x429b319b, +0x23403c23, +0x1533404c, +0x380b2433, +0x1013470b, +0xd1c52013, +0xb4d3c5b0, +0xc5b8d2c5, +0x5e5ebcd4, +0xd0d4c1fd, +0x4153f331, +0x439b4123, +0x35333173, +0x0b804c23, +0xc5301348, +0xd4c5b0d3, +0xfd3f5eb4, +0xa780a3c1, +0xfddfff2e, +0x3c233533, +0x1423d540, +0x84a4c101, +0x4c234433, +0x1824d520, +0x88a3c101, +0x3c233433, +0x1c23d520, +0xfb405e01, +0xa780a4c1, +0xfddfff3e, +0x4c234533, +0x1434d580, +0xfb2c5e01, +0x3380a4c1, +0x804c2344, +0x0114c4d5, +0xc1ff125e, +0x453380a4, +0xd5204c23, +0xc10114c4, +0x343384a3, +0xd5203c23, +0x5e0118c3, +0xeff6fef7, +0x0de0fbd0, +0x011f0201, +0x12010de0, +0x0de00119, +0x01030102, +0x11020de0, +0x0de000fd, +0x00e20121, +0x11210de0, +0x0de000dc, +0x00b40281, +0x47834007, +0x009844e0, +0x01820de0, +0x0dc00092, +0xc1600321, +0x2ea780a3, +0x33fddfff, +0x803c1335, +0x011423d5, +0x3384a4c1, +0x404c1344, +0x011824d5, +0x3388a3c1, +0x403c1334, +0x011c23d5, +0xf441f131, +0x2027f351, +0x15334433, +0xd4c53433, +0xc0d3c5b8, +0xc5c4d2c5, +0xd2c5b0d1, +0xbcd2c5b4, +0x02a8a4d1, +0x01214d00, +0x11214de4, +0x1173fc3d, +0x5eb0d1c5, +0xa3c1fc35, +0xff2ea780, +0x3533fddf, +0x01003d13, +0x011423d5, +0x3384a4c1, +0x804c1344, +0x011824d5, +0x3388a3c1, +0x803c1334, +0x011c23d5, +0xa4c19f1e, +0xff3ea780, +0x4533fddf, +0x02004d13, +0x011434d5, +0xa4c18b1e, +0xff2ea780, +0x4533fddf, +0x01004d13, +0x011424d5, +0x3384a3c1, +0x003d1334, +0x1823d501, +0xff6a5e01, +0xa780a4c1, +0xfddfff3e, +0x4d134433, +0x34d50200, +0x555e0114, +0x80a4c1ff, +0x4d134533, +0xc4d50100, +0x455e0114, +0x80a4c1ff, +0x4c134533, +0x14c4d580, +0x84a3c101, +0x3c133433, +0x18c3d580, +0xff2a5e01, +0x000000d9, +0x07d1f54e, +0xf06301a8, +0x6ea79007, +0xa7ffffff, +0xfeffffae, +0xffff8ea7, +0xff5ea7f3, +0x64d1f7ff, +0x4fe60e24, +0x0ea70179, +0x11fd7fff, +0x104ca304, +0x40270415, +0x01ac9cd1, +0x4227741d, +0xa499f405, +0x48a3d109, +0x07438301, +0x87d433d4, +0x07d42b44, +0xb4be23bd, +0x3ff6ffff, +0xd3f100c6, +0xff000054, +0x6dd14027, +0xc49d069c, +0x42c10104, +0x02d307d3, +0xeed10713, +0x0701491d, +0x07418341, +0x87353334, +0x07342b44, +0x53453343, +0x2bff73fe, +0x05e30143, +0x544e23c1, +0x2707fff9, +0x44034001, +0x24032005, +0x64d1f3a8, +0x411b0698, +0x010b40e8, +0xc49d4127, +0x04c49904, +0x00934ff6, +0xefd6fe01, +0x07090782, +0xee8e7e17, +0x09071707, +0x07f49f7e, +0xb62abe09, +0x0b9199ff, +0xe5be0907, +0x84c1ffb4, +0x2444dc34, +0x54c54827, +0xac90d140, +0xc5442701, +0x1c273884, +0x8f86be14, +0xc53027ff, +0x53c53883, +0x3484c140, +0xd1de44d8, +0xbe01ac90, +0xa7ff9054, +0xfddfff0e, +0x4df80431, +0xff080100, +0xd89e0127, +0xa4d1fd8c, +0x41c00148, +0x48a4d132, +0x6142c001, +0x0148a4d1, +0xff7f43e4, +0x1e99a4b9, +0x71104cd8, +0xa4d54027, +0xc4990148, +0x714fe604, +0x070c07ff, +0x904ebe17, +0x5ef005ff, +0xd4f1ff64, +0xff000054, +0x43e2c301, +0x64d100dd, +0x34ca069c, +0x5f0ea7d4, +0x0fbefff9, +0xd2f1ff8e, +0xff000054, +0x64d1c301, +0x34ca069c, +0xb923c2bc, +0x65be0527, +0xb11efd6c, +0xf49b4027, +0x0ef49b0b, +0x55be0927, +0x165efd6c, +0xff3ea7ff, +0x3411fd7f, +0x15104ce3, +0xfe885e34, +0x3dbe0827, +0xfe5efd6c, +0x2b0d07fe, +0xf0110301, +0xcd0545f0, +0xb604b499, +0x1463d145, +0x3ca4d10e, +0x2a34ca01, +0xffaba6be, +0x64a9b369, +0x34ce0102, +0x27b4195d, +0x1d410330, +0x0ef39bb4, +0x4fff4ea7, +0x5f0ea7fd, +0x43c5fff9, +0x29c6be38, +0xd54127fe, +0x5e0148a4, +0x4107feb1, +0x34074183, +0x44873533, +0x4307342b, +0xfe534533, +0x432bfde8, +0xc105e301, +0xf9544e23, +0x012707ff, +0x0544034e, +0xa824032e, +0x9864d1f3, +0xec411b06, +0x1efe7740, +0x1ebd2581, +0x44a3a9a1, +0x42a4a901, +0x6a43ee01, +0xd54227fe, +0x5e0148a4, +0x0000fe61, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x0499fd4e, +0x6c41c012, +0x4e070e39, +0xd42c4c23, +0x34070f44, +0x3e233333, +0x01ebff7c, +0xfc41dc34, +0x43270219, +0x33333207, +0x120034f5, +0x31f1ff02, +0xff021000, +0x1c33d247, +0x1d1c5318, +0x3d871616, +0x00274227, +0x120034f5, +0xfd8eff02, +0x25334e87, +0x180423f1, +0x0299ff02, +0x0040f110, +0x23ff0216, +0x3b030b11, +0x273d8712, +0xf5010b42, +0x02120034, +0x27fd8eff, +0x4efd8e00, +0x834107fe, +0x11039941, +0x400b4487, +0x4e61312b, +0x8e803c1c, +0x810191fe, +0x87131902, +0x05420b43, +0x1d31034e, +0x11049913, +0x049d4103, +0x4efe8e11, +0xa10b21fb, +0xced00704, +0xd3995a4b, +0x5b4b0710, +0x83dc5143, +0x87d31941, +0x0bde3944, +0x071c074d, +0x8b35332b, +0x0340612c, +0xf5122b11, +0x0218003e, +0xf5200bff, +0x02180431, +0x234027ff, +0xfde8003e, +0x3e033435, +0xf5fde800, +0x02181032, +0x1431f5ff, +0x23ff0218, +0xfde7f03e, +0xb10b3435, +0xdb25d4a1, +0x27a8b4ce, +0x12d49d42, +0xfa4efb8e, +0x4fff4ea7, +0x074b01fd, +0xa3b433d0, +0x01a407bb, +0x764627dc, +0x00f8bec7, +0x27d40100, +0x05449630, +0x0ef39bdb, +0x0138acc5, +0xe4b4ced4, +0xf4e8fa8e, +0xfb4ede1e, +0x03990421, +0x5b412310, +0x110d9943, +0xcf6bc407, +0x3c2b3d07, +0x3c1cb007, +0xa7fb8e80, +0xffffdf0e, +0xcdcea93e, +0x034d0713, +0x6bd40741, +0x070b07df, +0xfefd7e1d, +0x27efdcce, +0x0ef49b40, +0xffdf3ea7, +0x8e3405ff, +0x07f94efb, +0xdf0ea7d0, +0xb207ffff, +0xd9a1c107, +0x7e10da99, +0xd099ff72, +0x072b0710, +0x0af9be1c, +0x26b00700, +0x5bc9070b, +0x071c07ca, +0x7e12230d, +0x4027febb, +0xa70ef49b, +0xffffdf3e, +0xd2993405, +0x83d3a110, +0x3b4127c1, +0x0bcc8742, +0x07cd0b34, +0xa5cb650d, +0xfec57ed3, +0xf98e0127, +0xf49b4027, +0xdf4ea70e, +0x0027ffff, +0xf98e4b05, +0x4fff1ea7, +0x9b1401fd, +0x4103122f, +0x13c14433, +0x2e24ab38, +0x0b002732, +0xc5f3abfe, +0x14c13812, +0xf842ce38, +0x0127f3eb, +0xfe4efe0b, +0x0576d33e, +0x0e200c27, +0x6e2e9efe, +0x27fe8efc, +0x00099e21, +0x9e202700, +0x4e000003, +0x3601c2fe, +0x273310c8, +0x203c2741, +0x44471147, +0xf02101c2, +0x302707f3, +0xfe8e26e6, +0x27ee10cc, +0x2b012a30, +0x5334ab01, +0xd6115341, +0x0721b642, +0x66fe8e03, +0x1e302740, +0x274127e9, +0x00e31e30, +0xd007fb4e, +0x0ea7b107, +0x07fff9b3, +0xbec2071d, +0x36fb83d5, +0x071d0706, +0xa73c072b, +0xfff9b30e, +0xfb8824be, +0xf49b4027, +0x4efb8e0e, +0x07d007fb, +0xb30ea7b1, +0x1d07fff9, +0xefbec207, +0x0636fbab, +0x2b071d07, +0x0ea73c07, +0xbefff9b3, +0x27fbe9d6, +0x0ef49b40, +0x0000fb8e, +0xf493fd4e, +0xc1019bc8, +0x10078843, +0x38031f6b, +0xd30bd187, +0x38230853, +0x01102f9b, +0x2b3e51d4, +0x9dd40542, +0x349908e1, +0xff2ea712, +0xe49dfd4f, +0x4d344909, +0x083499e4, +0x23113169, +0xe46d410b, +0x07f6e305, +0xf49b4027, +0x8b00070e, +0x274027ff, +0x9de40530, +0x2f9b08e3, +0x0bd40110, +0x8ed40542, +0x734007fd, +0xe8410342, +0xa7e31ef4, +0xfeffff3e, +0x83093499, +0x33340743, +0x2b448734, +0x4f32f934, +0xf9ff0000, +0x00004d34, +0x1d42c2ff, +0x9b3ef493, +0x8c42c101, +0xffff3ea7, +0xfc31c1ff, +0x02a424d1, +0x140e0027, +0xfe0b0127, +0xfe0b0027, +0x977af193, +0x0b4ea701, +0x4301fefd, +0x10111201, +0x3108322b, +0x00a7fe0b, +0xf74efb1e, +0xd0070429, +0x00f341e2, +0x24032107, +0x010542ea, +0x817cd4c1, +0x78d3c1dc, +0x0780dbc1, +0x2b912b92, +0x01399bc4, +0xc2c30bb4, +0x0e270ec4, +0x7e01f40d, +0xb401ff08, +0xa7f44cca, +0xfeffff3e, +0x1e3c34a9, +0x34ad490b, +0x21271e3c, +0xa78cd1c1, +0xfdcfff4e, +0x997042c5, +0x3fe64313, +0x7c2700ae, +0x90d4c130, +0x00994fe6, +0xa194dbc1, +0xb1b40bd4, +0xff3ea7dc, +0xc103feff, +0x1e3434d1, +0x2b1fcc83, +0x1f4c834c, +0x071794ca, +0x100e27a3, +0xad7e01f4, +0x34a4d1fe, +0x834c2b1e, +0x49c21f4c, +0x819fa6ed, +0xffaea7d1, +0xcea7fde4, +0x27fde4bf, +0xeea7448c, +0x07fde4af, +0x94d4c109, +0xa405410b, +0x2027a715, +0xd4b1a235, +0x3487cb05, +0x340b4633, +0xeaf03e23, +0x35c815fe, +0x15e305c2, +0xb1e235e8, +0x78d3c1d4, +0xd2a1d181, +0x230b4103, +0x4c83b30b, +0xb5310b1f, +0x85d2a5d4, +0xf01307d3, +0xd9c5bcf0, +0xd1f78e30, +0xa1025c1b, +0x5eb40bd4, +0x1499ff67, +0x4f4ff644, +0x287c27ff, +0x07ff4c5e, +0xfefa5e24, +0x00000040, +0x04c1f54e, +0x7c03c178, +0xbea74333, +0x0bfeffff, +0x3cbca934, +0x8503951e, +0x27037103, +0x0304a510, +0x630429c8, +0xc503b5f2, +0x01c57401, +0x3cbcad30, +0x07f4351e, +0x7ef24550, +0x3ea7feaa, +0xc1fdefff, +0x4c33c034, +0x1d4c5318, +0x44cc4413, +0x27230715, +0xc1f3e833, +0x4c33c024, +0x1d4c5318, +0x44c84413, +0xff3ea7ef, +0x34c1fdef, +0x6a4dd8d4, +0x23070ffc, +0xf4e84327, +0xdcd423c1, +0xf5fc6a3d, +0xb98c54c1, +0x86031e43, +0xff4ea736, +0x43a9feff, +0x52c11e3e, +0xad320b30, +0x271e3e43, +0x3054c540, +0x4ea73127, +0xc5fdcfff, +0x05077043, +0x377e1427, +0x7454c1fe, +0x9612f393, +0x03230701, +0xdf2d0341, +0x7454c501, +0xe37f2ce3, +0x34197f3c, +0xc2803c03, +0xf393f932, +0x270195f4, +0x784c2720, +0x34033205, +0xfd41f4c8, +0xfffddfe0, +0x0519ffff, +0xec03e507, +0x8532a734, +0x030307fe, +0x07330301, +0x83430720, +0x23b20723, +0x83438343, +0xc1b73333, +0x23338851, +0xd307fb25, +0xf0056407, +0xd733b22b, +0x67333333, +0x10994333, +0x80bf0309, +0x2b000648, +0x25642bd3, +0x80df03fb, +0x03000648, +0x0648806f, +0x160fe600, +0x0d1e4905, +0x081499de, +0xda091369, +0xd42d430b, +0x07081199, +0x9df1154a, +0x5c410bd1, +0x0b8c58c1, +0xabb4074c, +0x08db8dbf, +0x82893a07, +0x07910716, +0x33363341, +0x0b473395, +0x03232b94, +0x064a609f, +0x30536100, +0xf053412c, +0x0201fe78, +0x8189d729, +0x33470718, +0x03e20746, +0x53142be7, +0x411c30e3, +0xfe5ef253, +0x84992101, +0x23230738, +0x3b505144, +0x2b022b24, +0xc11703c3, +0x13538852, +0x830f0c83, +0x33e123c7, +0xc733100c, +0x1123e783, +0xeb330cab, +0x23991783, +0x0824990a, +0x1c330eab, +0x0e01ab14, +0x400da343, +0x839e0104, +0x0b4b47b7, +0x74d4c54e, +0x5c295361, +0x3c833a0b, +0x874c070f, +0x232a0713, +0x8310ab41, +0xee302721, +0x0904b84a, +0x0723ab54, +0x83412337, +0xee2f6b31, +0x07049b34, +0xa343834e, +0x0000004f, +0x2741ab80, +0x50d4c530, +0xedf6d315, +0xcac23a07, +0xb884c149, +0x04a14fe6, +0x41034a07, +0x052bc4e2, +0x52713383, +0x05827fe6, +0x4c83420b, +0x8713071f, +0x33153324, +0x0b338746, +0x03132b24, +0x0648081f, +0xc82e2300, +0x4727feea, +0x24032e01, +0x14031e05, +0xafe6f4a8, +0x58c1044e, +0x7054998c, +0x940147a6, +0xd4094736, +0x412746b6, +0x9904949d, +0x5499de83, +0x9d342b0d, +0x58c10693, +0x644d278c, +0x54d4c507, +0x4b069499, +0xba4fe64f, +0xf6940103, +0x0903b44f, +0x863027d4, +0x6b312744, +0xc343073f, +0x0ad49d41, +0x402734f6, +0x110fd49d, +0x09b656fb, +0x035329d4, +0xc1345241, +0x41037454, +0xb97454c5, +0xe6031e84, +0xc103884f, +0x12098851, +0x02ee1029, +0x420704d4, +0x410b4383, +0x4b0d4399, +0xc8230b3f, +0x02daf120, +0x074207ee, +0x53438332, +0x08149d32, +0x120d134d, +0xffff1ea7, +0xf81421eb, +0xc1045541, +0x33fc7453, +0xd4990088, +0x814ff60b, +0x7d3fc600, +0xefffbea7, +0xc0b4c1fd, +0x53184c33, +0x44131d4c, +0x271844cc, +0xa7f3e833, +0xfdefffee, +0x33c0e4c1, +0x4c53184c, +0xc844131d, +0x0ea7ea44, +0xc1fdefff, +0x4dd8d404, +0x2712fc6a, +0xa7f4e843, +0xfdefff1e, +0xdcd413c1, +0xf0fc6a3d, +0xb98c54c1, +0x86031e43, +0xff2ea736, +0x24a9feff, +0x53c11e3e, +0xad430b30, +0x271e3e24, +0x3054c540, +0x3ea74127, +0xc5fdcfff, +0x51c17034, +0x03050774, +0xfb3c7e14, +0xe65064c1, +0x9900884f, +0xbea70b63, +0x07ebffff, +0x33253323, +0x50b4c137, +0x2f03230b, +0x00064a60, +0xab5023c1, +0x0b44874f, +0x5024c543, +0xa754b3c1, +0xf3ffffee, +0xc15863c5, +0x112730e4, +0x03ff4d83, +0xc55c64c5, +0xe2c130e1, +0x07420760, +0x53455332, +0x703c8338, +0x0b7c4c83, +0x7f2c8343, +0x64c5420b, +0x64e2c160, +0x32074207, +0x38534553, +0x83703c83, +0x430b7c4c, +0x0b7f2c83, +0x6464c542, +0xc560e1c5, +0xf4936861, +0x990195bc, +0x63c50d43, +0x50d4c16c, +0x021d4fe6, +0xa754d4c1, +0xebffff0e, +0xc14404c5, +0x044550d4, +0xe65064c1, +0xc101164f, +0x43c18c54, +0xe43fe6b8, +0x0b679900, +0x07586cc1, +0x33378727, +0x07232b25, +0xc1450b42, +0x6ec1344b, +0xc1cb0b5c, +0x63c1384b, +0xc1eb0b6c, +0x4ac1484b, +0x6060c144, +0xc13c48c1, +0x49c16461, +0x09f27540, +0x6862c16d, +0x2a0b3b0b, +0x190b080b, +0x294843c5, +0xc53d075a, +0x4ec5344c, +0x3c40c538, +0xc54041c5, +0x370b4442, +0x3d073a0a, +0x01dd71e0, +0xf66c5499, +0x0701d64f, +0x0743834d, +0x87d533d4, +0x03d42b44, +0x064808df, +0x83430700, +0x33340743, +0x2b448735, +0x083f0334, +0x07000648, +0x0127274d, +0x0534033e, +0xa844034e, +0x71f181f2, +0x0bd241f4, +0x01630941, +0x0b21034b, +0x55435123, +0x31d131fb, +0x65d2454b, +0x214811f3, +0x014a4149, +0x21de11dc, +0x0bd351d0, +0x61f4511b, +0x0bc40bfb, +0x0b090be8, +0x553b0b2a, +0x15dc05d3, +0x35d025de, +0x99d245d1, +0x41200b64, +0x266c5499, +0xffdea746, +0xd4a9feff, +0x41031e3a, +0x1e3ad4ad, +0xeea74127, +0xc5fdcfff, +0x302770e4, +0x215063c5, +0x5004c1f0, +0x00864fe6, +0x998854c1, +0x43990b02, +0x7932ce0a, +0xefff1ea7, +0xcc14c1fd, +0x4c335291, +0x1d4c5318, +0xc49451c1, +0x43271644, +0x4ea7f4e8, +0xc1fdefff, +0x3c33cc43, +0x1d3c5318, +0xc1ec34c0, +0x34998c53, +0xe64ff643, +0x44349900, +0x00df4ff6, +0x0b284c27, +0xcf2ea712, +0x2105fde4, +0x40272415, +0x53992435, +0xc154910a, +0x31037852, +0x3f6b420b, +0x539d5495, +0x1535c40a, +0xffffbea7, +0x42b4a9fe, +0x0334271e, +0x42b4ad41, +0x0a539d1e, +0xfe01fd41, +0x3e07de2e, +0xa7faf45e, +0xfdefff3e, +0xdccc34c1, +0xa7fae04c, +0xfeffff0e, +0xa90a5399, +0x311e4204, +0xad430bfb, +0x991e4204, +0x52416f51, +0x31275451, +0x5061313b, +0x31235171, +0x41032b0b, +0x0b0b4b0b, +0xb10b230b, +0x23ebfb35, +0xbc8341e3, +0x75f2431f, +0x5552455b, +0x8e506554, +0x50d0c5f5, +0xa7fcbb5e, +0xebffff1e, +0xed5e1445, +0x9d4027fd, +0x605e0ad4, +0x8851c1fc, +0x990bd399, +0x43ee0a14, +0xeea7fc72, +0xa9feffff, +0x031e3ee4, +0x3ee4ad41, +0x8851c11e, +0x0ea74127, +0xc5fdcfff, +0x535e7004, +0x304c27fc, +0x71ff225e, +0x834d0b54, +0xd4871f4c, +0xd40b4633, +0xeac8de23, +0xfe2b5efe, +0xfb652fe6, +0x00001fa3, +0x5c5e2000, +0x5e3127fb, +0x7766fb47, +0x34875471, +0x340b4633, +0x151833f9, +0x539dff01, +0xf6d3096d, +0x29fb9d3f, +0x9771fcd7, +0x1f1ea7fb, +0x1301fef5, +0xee9854c1, +0xc100a034, +0x43079c53, +0x33474333, +0x4cf9432b, +0xff010ae8, +0x0aec42e9, +0x4ef9ff01, +0xff010aeb, +0x0aea41f9, +0x40f9ff01, +0xff010ae9, +0xa79853c1, +0xfef51f4e, +0x53c53103, +0xc1431598, +0x41039c54, +0x54c54183, +0x8c58c19c, +0xbea74127, +0xc1fdcfff, +0xb4c5b883, +0x26526d68, +0x5df29337, +0x219d0191, +0xa5209d06, +0x9da62e9d, +0x58c1052c, +0x0d5c9d8c, +0x3ea75469, +0xc5ebffff, +0x125e7034, +0x5e4a07fb, +0x4127fad4, +0xffff2ea7, +0x272435eb, +0xf6a27e0b, +0xffff3ea7, +0x354027eb, +0xfc332134, +0x1efb9231, +0xff3ea7e2, +0x32c1fdcf, +0xffbea74c, +0x4207fdcf, +0x302748a3, +0x9b4cb4c5, +0x00070ef3, +0xb2c5ff8b, +0x6cb3c54c, +0xf51feea7, +0xc1e201fe, +0x24ce9854, +0xff315ed1, +0x149d4027, +0xfb4a5e09, +0x43872307, +0x242b2533, +0x48082f03, +0x30270006, +0x23054727, +0xf4c82403, +0xfa94aff6, +0x4efedd5e, +0x07d007fb, +0xb30ea7b1, +0x1d07fff9, +0x77bec207, +0x0636fc5d, +0x2b071d07, +0x0ea73c07, +0xbefff9b3, +0x27fc6266, +0x0ef49b40, +0x0000fb8e, +0x00006407, +0x00006408, +0xf393f54e, +0x230191c4, +0xc53219f5, +0xf1c548f0, +0x8c05c14c, +0x01462fe6, +0xc148f0c1, +0x04494cf3, +0x013a43e2, +0xf793a307, +0x2701906a, +0x07302760, +0x334307d3, +0x0b4733d5, +0x60df03d4, +0x0700064a, +0x03cd079d, +0xcc030c9c, +0x99402754, +0xd49d66d3, +0xb33ff69c, +0xbe0c0703, +0xc1fff2d0, +0xd3c15cd4, +0xc5402b60, +0x03ea58d4, +0x402703b9, +0xffff2ea7, +0x4624adff, +0xbe090718, +0xc1005611, +0xd3c144d4, +0x0bd26140, +0xa942ea43, +0x9c54b906, +0xaa43f802, +0x5541d800, +0xf2c14a07, +0x87418348, +0x99420b44, +0x52a9a043, +0x4099027e, +0x332287a1, +0x8451d135, +0xf54a0702, +0x02180030, +0x0b429bff, +0x0432f541, +0x27ff0218, +0x003e2310, +0x3135fde8, +0xe8003e03, +0x1034f5fd, +0xf5ff0218, +0x02181432, +0xf03e23ff, +0x3135fde7, +0x029c54b9, +0x074f42d8, +0x48f3c14a, +0x44874183, +0x4399430b, +0x7e52a9a8, +0xa9419902, +0x35332247, +0x028854d1, +0x180031f5, +0xa29bff02, +0x32f5a40b, +0xff021804, +0x3e234027, +0x35fde800, +0x003e0334, +0x3af5fde8, +0xff021810, +0x181432f5, +0x3e23ff02, +0x35fde7f0, +0x1d412734, +0x89f39374, +0x32190190, +0x26d26103, +0x48f0c114, +0x494cfac1, +0x03a60b04, +0x3607a07c, +0xfed5a4ea, +0xf0934027, +0x9d018f28, +0x049da904, +0x07049d04, +0x9d08049d, +0x049d0904, +0xa7049da4, +0xa6a8049d, +0x09f19327, +0x3207018f, +0x20271a03, +0x1c031419, +0xc14526a0, +0x042948f0, +0xf378240b, +0xc148f0c1, +0x457e4cf1, +0x25f093f6, +0x04190190, +0x02214fe6, +0x2748f2c1, +0x93234940, +0x018ed3f0, +0x9d4cf2c1, +0x32e20a04, +0xf393020b, +0x27018f6e, +0xc5af0740, +0x720740f3, +0x0344f4c5, +0xb40740ac, +0x4733b533, +0xbf03b40b, +0x00064a60, +0x070bb499, +0xa9f40d6b, +0xc1030452, +0x6c035cbd, +0x07402754, +0x2df41506, +0x68b9c1f2, +0xfff127be, +0x9958bec1, +0xd02b64b4, +0x2e073d07, +0x345b0d07, +0x0e2b245b, +0xee68b1c1, +0x83027123, +0x0b438731, +0x8bcd074b, +0x6c48c1c1, +0x21830c2b, +0x4b0b4287, +0x356c43c1, +0x8bfc55f0, +0xc1310b1e, +0xb4c150b2, +0x45f32540, +0x9b42eaf8, +0x38b3c101, +0xf395f2a5, +0x2748b499, +0x3cf49d30, +0xf3b54027, +0xc53df49d, +0xb20130f3, +0x3f072333, +0x34033401, +0x008024f5, +0xa3ceff14, +0x033d07f4, +0x4307403c, +0x49c24dcb, +0x8b43070b, +0x0744c649, +0x99dc1ed3, +0x3d0764b4, +0x3183345b, +0xb2993387, +0xc13b0b66, +0x22e06c38, +0x06070343, +0xfff1c5be, +0xe01eb499, +0x9901e442, +0x4fd69cb4, +0x6454d16a, +0x0b378702, +0x0b9d8b34, +0x27380589, +0x0ef49b40, +0x02a452d1, +0x4c834207, +0xf943330f, +0x00008343, +0x230407ff, +0xffff7e0e, +0x03d83ff6, +0xffff3ea7, +0x5834d1ff, +0x2b710315, +0x07218324, +0x33224747, +0x6424ed44, +0x27ff0015, +0xff4ea731, +0x43bdffff, +0x712306a8, +0x270f4399, +0x0ef49b40, +0x33874127, +0xb04034f5, +0x54b9ff02, +0x43d8029c, +0x3d41d873, +0x41834707, +0x8748f0c1, +0x99400b44, +0x4527a041, +0x23332107, +0x120024f5, +0x23f1ff02, +0xff021000, +0xfc0a3dd8, +0x33210714, +0xe8432723, +0x0023f1f4, +0xdcff0210, +0xf2fc0a3d, +0x029c54b9, +0xc13142d8, +0x718348f2, +0x420b4787, +0x27a84299, +0xf5233345, +0x02120024, +0x0023f1ff, +0xd8ff0210, +0x10fc0a3d, +0xf4e84327, +0x100023f1, +0x3ddcff02, +0xc1f2fc0a, +0xf39344f0, +0x03018e28, +0xc5341901, +0x40d244f0, +0x40f2c11f, +0xf0c14027, +0xc1241d48, +0xf4c14cf7, +0xa02c0344, +0x740b0349, +0xea40f2c5, +0x93fe0d73, +0x018cbbf0, +0x99a50499, +0xf293a603, +0x27018cb0, +0x03432b00, +0xa5249df5, +0xb0c1f58e, +0x95f4a538, +0x48b399f0, +0xf39d242b, +0x3cb4c13c, +0xb530f2c5, +0x49b099f4, +0x5e3df09d, +0x0c07fe62, +0xffefc6be, +0x19be0c07, +0xd4c1ffef, +0x60d3c15c, +0xd4c5402b, +0x4b30e258, +0xf2497efc, +0x01a80fe6, +0x3ea72227, +0xa9ffffff, +0xf4184634, +0x5b13884d, +0xa451d103, +0xbe0c0702, +0xf6fff075, +0xa7fc250f, +0xfeffff0e, +0x83090499, +0x33248743, +0xf9422b44, +0x00005043, +0x7432e4ff, +0x64d29902, +0xc15cd4c1, +0x425b7cd1, +0x31274183, +0x4487323b, +0x027452d1, +0x4d0b310b, +0xc56c42c5, +0x1ff67cd3, +0x412702a3, +0x5e9cd49d, +0xc027fbde, +0x9b5e8027, +0x0cb399fd, +0x33332527, +0x120032f5, +0xb499ff02, +0xf143330c, +0x02100043, +0x0a3dd8ff, +0x0d2718fc, +0x497e640c, +0x0cb499f1, +0x43f14333, +0xff021000, +0xfc0a3ddc, +0x40b1c1ea, +0x9950b3c1, +0xbc9948b2, +0x02410749, +0xe2130713, +0x2701da43, +0x07402760, +0x50b4c5e2, +0xe0c8ef4b, +0x4cb0c130, +0x400b4e87, +0xd15443c1, +0x0b017442, +0xc1328b31, +0x43c59441, +0x270e0b54, +0x1213ee40, +0x5404bd02, +0x4cb4c101, +0xe40b3227, +0x0164e3bd, +0xef4bec07, +0xc632e0c8, +0x4cb0c168, +0x400b4e87, +0xd15443c1, +0x0b017442, +0xc1328b36, +0x43c59441, +0x270e0b54, +0xdf13ee40, +0x5404bd01, +0x4cb4c101, +0xe40b3227, +0x0164e3bd, +0xa70cb099, +0x99302710, +0xb19d0db2, +0x48b19d49, +0x10074127, +0xc51eb49d, +0xb3c540b3, +0x27133344, +0x0014f544, +0x87ff0212, +0xf5010722, +0x02160023, +0x270403ff, +0x0eb28943, +0x120004f5, +0xb3c5ff02, +0x3cb3c538, +0x100004f1, +0x48dcff02, +0x034207f8, +0x8334274a, +0x26530f4c, +0x120003f5, +0x2c33ff02, +0x33302714, +0x42ab104c, +0x140013f5, +0x14f5ff02, +0xff021404, +0x5e0ef39b, +0x2ea7fce7, +0xb9ffffff, +0xe6184524, +0x2700f04f, +0xfe4c5e23, +0x640c0d27, +0x07f01b7e, +0x5cbcc106, +0xffed3bbe, +0x2754b499, +0xf5433335, +0x02120043, +0x54b299ff, +0x22474327, +0x12872103, +0x120014f5, +0x1ef1ff02, +0xff021000, +0xec33c02b, +0x1dec5318, +0x00b0efe6, +0x23f12433, +0xff021804, +0x0764b499, +0x3b21232e, +0x27230b24, +0x0014f542, +0xc1ff0212, +0x14f15cb3, +0xff021000, +0x07f848dc, +0xce422b43, +0xb29993c4, +0x55b39954, +0x02074127, +0xc566b49d, +0x03335cbc, +0x04f54427, +0xff021200, +0x40273387, +0x34f52007, +0xff021600, +0x43272403, +0xf556b189, +0x02120024, +0x0024f1ff, +0xdcff0210, +0x4107f848, +0x34274a03, +0x530f4c83, +0x0023f516, +0x33ff0212, +0x3027141c, +0xab104c33, +0x0003f541, +0xf5ff0214, +0x02140404, +0x0ef39bff, +0x07fbf15e, +0x5e612b63, +0x1dbefe25, +0x52d1fd10, +0x215e02a4, +0x5e2027fc, +0x2027fd5e, +0xa7ff625e, +0xffffdf0e, +0xfc6f66be, +0xc9be0907, +0x0ea7004e, +0xbeffffdf, +0xa7fc6f34, +0xffffff2e, +0x184624a9, +0xf902f353, +0x30014103, +0x184624ad, +0x3ea74827, +0xc5fdcfff, +0xf57e4c34, +0xa74027ee, +0xfdcfff0e, +0xc54c04c5, +0x2e5e6c04, +0x5e4127f9, +0x4127fded, +0x07fe205e, +0xeca5be0c, +0xfd585eff, +0x76ef3a7e, +0xff3ea70f, +0x34b9ffff, +0x4fe61845, +0x232700af, +0x02a451d1, +0x99be0907, +0x80070050, +0xf9370ff6, +0xffff0ea7, +0x090499fe, +0x24874383, +0x422b4433, +0x005043f9, +0x32c0ff00, +0xdf0ea734, +0xccbeffff, +0x0907fc6e, +0x004e2fbe, +0xffdf0ea7, +0x6e9abeff, +0x75f253fc, +0x5e2001f8, +0x2227ff74, +0xd87eb31e, +0x962127ee, +0x47202704, +0xfc9b5e22, +0xd14cd1c1, +0x9902745c, +0x4127411b, +0x3b401399, +0x9601274b, +0x870027c4, +0x23210b23, +0x47e30741, +0x03310b00, +0x7424d5e1, +0xbd402701, +0xbd015434, +0x9d016430, +0x28c5401e, +0x423b9d94, +0x28c52c05, +0xbe090754, +0x27004ea5, +0x9cd49d41, +0x27f89c5e, +0xff525e20, +0xd007f84e, +0x7e8c0bc1, +0x00e8eeb0, +0x2b07017a, +0x0363bd03, +0x2ce31b07, +0x7f1ce37f, +0x0363bd23, +0x2c032419, +0xf921c280, +0x30874007, +0x432b4533, +0x35333407, +0x1c27342b, +0x0c3e23d9, +0x4b07fef1, +0x30012107, +0x40051123, +0x44033403, +0xf393f298, +0x010185e4, +0x03321134, +0x05210341, +0x23321534, +0x1821ec41, +0xa7330101, +0xfefd0b4e, +0xb3294325, +0x0308b0a9, +0x032b4127, +0xa78cd3c1, +0xfdcfff2e, +0x896824c5, +0x01231231, +0x9990d0c5, +0xd12d3934, +0x4d143189, +0x83b119d1, +0x13159611, +0x14338945, +0x03ca043b, +0xc1d24967, +0x402790d0, +0xd49d3207, +0x4731230a, +0xddf89340, +0x34ee0187, +0x402700b3, +0xa96cd49d, +0xb90310b1, +0x47032abb, +0x70db9d00, +0xffec9cbe, +0x9d0b809d, +0xd4c1ab80, +0x47d34990, +0xab342b44, +0x2733083f, +0x0d4d0732, +0x344c03d3, +0x37272027, +0x44034205, +0x0d07f3c8, +0x27500c03, +0x05472730, +0xc8040303, +0x07f88ef4, +0x85f893a0, +0x40270187, +0xc207afab, +0x88bef993, +0x66849d01, +0x9dbe819d, +0x81bd1e81, +0x1b1e0106, +0xa98894c1, +0x2702a4b2, +0x12428d38, +0x7e4cc3c5, +0x4027ecd0, +0xc54cc4c5, +0x1b076cc4, +0x0d072a07, +0x002da1be, +0x47234007, +0x64000d03, +0x49d242d0, +0x90d0c1d2, +0x32074027, +0x230ad49d, +0xee404731, +0xf8ff5143, +0x27ff4d21, +0x6cd49d41, +0x03ff4a5e, +0x05422b42, +0x5e311534, +0x0ea7fee1, +0xbeffffdf, +0x27fc6cbf, +0x074a07a0, +0x3337333a, +0x07430b45, +0x03340794, +0x064a6c9f, +0xb43f0300, +0x2700064a, +0x123499c0, +0x45860307, +0xc64034c1, +0xf9be5e4f, +0xc103004b, +0xc2c43907, +0xc4a103e9, +0x0ea7c8a2, +0xbeffffdf, +0x27fc6c58, +0x0bf49b40, +0xa70ef49b, +0xfdcfffae, +0xffff9ea7, +0xc54827fe, +0x32274ca4, +0x1e9793bd, +0xfc9bc027, +0xc541270e, +0x052764a4, +0x27ec0f7e, +0x9794bd40, +0x0efc9b1e, +0xc54cacc5, +0xa97e6cac, +0xd200c8ec, +0x51fdf95e, +0x07312134, +0xeb140b03, +0x590abe14, +0x4e981efc, +0xff1ea7f5, +0x14d1ffff, +0xf1e30e24, +0x4fe6d007, +0x3ea70159, +0x11fd6fff, +0x104ca334, +0x0d073415, +0xc1fdb77e, +0xd0c18cde, +0x39e19988, +0x40272027, +0xdcc13127, +0x08049d90, +0x9d09039d, +0xe3a90c02, +0x151302a4, +0x020dc13b, +0x0c6d024d, +0xa712038d, +0xfee1834e, +0xe4890455, +0x39e39912, +0xb4874123, +0x0325e2b9, +0x012a34f0, +0x2314e489, +0x9d4c2b34, +0x433b0b03, +0x42074202, +0x3407435b, +0x21232b07, +0x41234307, +0x230b1387, +0x022d132b, +0x030a049d, +0xe8e40711, +0x07011241, +0x07212323, +0x9d42a730, +0x31030d34, +0x0e0bf2b0, +0xc10d019d, +0xd1498cd4, +0x31234339, +0x070f3c83, +0x33238743, +0x2b422b44, +0x23448743, +0xfffef44e, +0xea80d4c5, +0x0700aec1, +0x2b2dbe0d, +0x99512700, +0xdcc16ed6, +0x58d1c148, +0xc13cd9c1, +0xdec164d4, +0xc14c0b50, +0xd0c134d7, +0x38d8c154, +0xc15cd2c1, +0xd3c140da, +0x44dbc160, +0xc607190b, +0xf125c533, +0x0b4cd199, +0x0b3b0b2a, +0x55080be7, +0x454c07f4, +0x15f235f3, +0x9dfe05f0, +0x4e2318f1, +0x07feece8, +0x0137272f, +0x05240321, +0xa8440341, +0x0dd399f3, +0xc3fd6103, +0xff011334, +0xc5fd3607, +0xff011335, +0xd39d3383, +0xff1ea76e, +0x14b9feff, +0x410302d4, +0x02d414bd, +0xffff1ea7, +0x2414d1ff, +0xab4ff60e, +0xff1ea7fe, +0x1411fd6f, +0x15104ce3, +0xfea85e14, +0x07ea6b7e, +0x7e0d071c, +0x4007f464, +0xfa000da3, +0x27ee44cc, +0xff495e50, +0x432b4427, +0x890b049d, +0x243b14e3, +0x32e23c2b, +0x3207fedc, +0x27fed75e, +0xfefc5ee0, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x1ea7f74e, +0xa9feffff, +0x071e3c14, +0xad480380, +0x071e3c14, +0x469307b2, +0x33d3070f, +0x07d30bd3, +0xa7a027c1, +0xfdcfff7e, +0x0d27091e, +0x29befa0d, +0xb401ffc0, +0xa9f44dca, +0x271e3cc3, +0xad310320, +0xa91e3cc3, +0x031e3ec4, +0x3ec4ad41, +0x42c3a91e, +0xad31031e, +0xa91e42c3, +0x031e3ac4, +0x3ac4ad41, +0x0ef29b1e, +0x74c54127, +0x2ea10370, +0x1ed90b8a, +0x4ef78ec2, +0x8c0ec1fc, +0xe339c007, +0x031ee4b9, +0x3c833123, +0x8723070f, +0x2b243313, +0x29232b21, +0x12e3a900, +0x41228703, +0xf42e23c1, +0x617efffe, +0x29c441ff, +0x03c271c3, +0x0b430b41, +0x8341e332, +0xc3751f3c, +0xfc8ec445, +0xd007fa4e, +0x07120099, +0x07b207a1, +0x76230714, +0x21d4510f, +0x10d399dc, +0xd285c40b, +0xc4ebd195, +0xa7353bce, +0xffffdf0e, +0xfc3fb6be, +0x0d071c07, +0xfc2c8fbe, +0xffdf0ea7, +0x3f82beff, +0x3b3127fc, +0x0b31233b, +0x07c3ebc3, +0x234b5b4c, +0x11d49d41, +0x5510db9d, +0xa1dca5d3, +0x25dc15d4, +0x0f4ccedc, +0x0cbe0d07, +0x0127ffbd, +0x0127fa8e, +0xf251fa8e, +0x1a070d07, +0xffbde0be, +0x04964127, +0x04074027, +0xf54efa8e, +0x5542f393, +0x90fe9301, +0xf063015b, +0xd1076007, +0x3ce32fab, +0x7fece37f, +0x3c033419, +0xf93ec280, +0x498c64c1, +0x0c449963, +0x649d322b, +0x16d4b90b, +0x0c649d03, +0x32273308, +0xbf6bb307, +0x5aa6f593, +0x275b1d01, +0x8c62c142, +0xa90e649d, +0x27031223, +0x64c5444c, +0x21d4b97c, +0x7863c503, +0x4ea745e6, +0xb9feffff, +0xf6014143, +0xd101b93f, +0xc5025cd3, +0xdcd19463, +0xcc8302a4, +0x23c3330f, +0xffff84ce, +0xffbf06be, +0x018c0fe6, +0xbfe68227, +0x7c070086, +0xf9937403, +0x27015928, +0x19061ea0, +0x734ad254, +0x02bcd4d1, +0x9405ca07, +0x02b8d3d1, +0x47334a07, +0x93c5c533, +0xd1c40b48, +0xb902a4d1, +0xd10270d2, +0x070268d3, +0x0347070c, +0x064ab40f, +0x7ef80500, +0xcf03feac, +0x00064a6c, +0x02a4d1d1, +0x0271d2b9, +0x3807b007, +0x0fbe0c07, +0x0b8b0021, +0x9c03a103, +0xa80fd6a0, +0xffdf0ea7, +0x3e61beff, +0xbe0c07fc, +0xa7001dc4, +0xffffdf0e, +0xfc3e2fbe, +0xf0430727, +0x63c1f58e, +0x8df4938c, +0x32990158, +0x9d1027de, +0x63990d62, +0x6d629d0d, +0x9d05439d, +0x63990641, +0xa6419d0d, +0xd1a5439d, +0x990260d0, +0x43233c04, +0x42f04f6b, +0x3e270100, +0x99020048, +0x4fe63e04, +0x230700e2, +0x00002fa3, +0x0c993000, +0x16d4b908, +0x86312703, +0x333027c4, +0x24ab1a4c, +0xab193c33, +0xff1ea723, +0x1205ebff, +0x99400e99, +0x3e073f02, +0x3c834207, +0x0f4c830f, +0x38334433, +0x4fa343ab, +0x53100001, +0x24d61415, +0x00a3efe6, +0x06000d27, +0x0ca3c4a6, +0x1ed4b910, +0xaa41e003, +0x9d4ff600, +0x40ec2700, +0x20271027, +0x029cd3b9, +0xffffdea7, +0x834307eb, +0x164c3341, +0x83163c33, +0x8000003e, +0x00224ea3, +0xab43ab08, +0xab41ab40, +0xc54eab42, +0x62995cd4, +0x2740270d, +0x9d646531, +0x2c236f63, +0x7520c80c, +0x42073207, +0x3d833533, +0x4c831f00, +0xab2573f0, +0xab278343, +0x43002742, +0x70d4c5f0, +0x4ea7f58e, +0xb9ffffff, +0x46184543, +0x5e832736, +0x4ea7fe6a, +0xc5dfffff, +0x475e9464, +0x5e8027fe, +0x2307fe5a, +0x00002fa3, +0x1f5e2000, +0x000d27ff, +0xff5e5e05, +0x00383e27, +0xff015e02, +0x20271027, +0x655ee027, +0xb0d4d1ff, +0xf144dc02, +0x27801c27, +0x2780002d, +0xff525ee0, +0x891e2027, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x0ac1f54e, +0x99500740, +0x435440a4, +0xffff4ea7, +0x4443b9ff, +0xbe3fe618, +0xb4a8b900, +0xc08fe601, +0x079a0700, +0x272027ba, +0xff6ea770, +0xca07ffff, +0xc4b9c20b, +0x42d80164, +0x5494b932, +0x54b1c101, +0xb994b0c1, +0xd1016493, +0x360174be, +0x83430745, +0x2642c043, +0x32871027, +0x18446db9, +0x34d13a0b, +0xdfd60174, +0xce410373, +0x27072114, +0xb4032103, +0x72079103, +0x8eb828da, +0xc24007f5, +0x30075001, +0x4027312b, +0x140b1307, +0xc199cd1e, +0x870a0742, +0x270c0bc7, +0x0ca5be21, +0x40a499fc, +0xa49d4123, +0x4053c140, +0xc30b4027, +0x0b40a299, +0x74cdd537, +0x5434bd01, +0x423d9d01, +0xcdc5cd05, +0x94cdc554, +0x01643dbd, +0xb9b12fc6, +0x1e01b4a8, +0x033e079e, +0x1e312b31, +0xc1f58eb0, +0x34c59434, +0x8e8c1e54, +0x31f64ef5, +0x3804c106, +0x1b3403c1, +0xee700746, +0xc1012734, +0x94b94009, +0x4c0601b4, +0x3027e407, +0xc387d027, +0x490b4c07, +0xc19441c1, +0x390b544b, +0x8d07a107, +0x30b9ab2b, +0x44d10164, +0x8f6b0174, +0x015432b9, +0x00e91be2, +0xd1031027, +0x43834007, +0x24b63d07, +0xf00d42c0, +0x0027c9fe, +0x749d4227, +0x07f68e12, +0xca410b4a, +0xc90bee46, +0x6ae2c201, +0x060700cc, +0x0fe60a2b, +0x1ff600d8, +0xd02700cb, +0xe0270027, +0x7419ade6, +0x7ac57339, +0x3c789d34, +0x2b0b4533, +0x180043f5, +0x72b5ff02, +0x18044af5, +0x1027ff02, +0xe8004e23, +0x034135fd, +0xfde8004e, +0x181042f5, +0x4af5ff02, +0xff021814, +0x4e233807, +0x4bfde7f0, +0x0b41353f, +0x6434b939, +0xbd41a301, +0xe6016434, +0x1900820f, +0xc5733974, +0x7d9d3870, +0xf545333d, +0x02180043, +0x307ec5ff, +0x180440f5, +0x71c1ff02, +0x23202740, +0xfde8004e, +0x4e034235, +0xf5fde800, +0x0218104e, +0x1440f5ff, +0x07ff0218, +0xf04e233d, +0x3f4bfde7, +0x310b4235, +0x016434b9, +0x41a30127, +0x016434bd, +0x749d4227, +0x07f68e12, +0x2ba103a4, +0xff145eab, +0xf68e0127, +0xd027a607, +0xe0270027, +0x07ff3f5e, +0x07df6bd8, +0xff365ee2, +0xe027d027, +0x27ff2f5e, +0xff025e01, +0xc007f94e, +0x6340c4c1, +0xdf0ea7f0, +0x9207ffff, +0xf405a107, +0xff9c41be, +0x23032f07, +0x2ce33f07, +0x7f3ce37f, +0x3c033419, +0xf932c280, +0xb940c3c1, +0xe601b431, +0x6434b916, +0xb642f801, +0x27230700, +0x07310701, +0xf0010310, +0xbc277ef3, +0x99f001ff, +0x04b94003, +0x43e201b4, +0x4b07008a, +0x4fc04f4b, +0xffffffff, +0x410d997e, +0x29071a07, +0x78be0d07, +0xa007ffa7, +0xc16c0fc6, +0x1b0740ce, +0x1f6b2e07, +0x4027210b, +0x24bd3227, +0x23bd0154, +0x2d9d0164, +0x27f00142, +0x40039941, +0x11874d3b, +0x20271e0b, +0x31034123, +0xd540039d, +0x05017414, +0x9412c51a, +0x075412c5, +0xfdef7e0c, +0xffdf0ea7, +0x1d7abeff, +0x430127fc, +0xb9f98ef0, +0x03016524, +0x7442fc21, +0x07f001ff, +0x400399b1, +0x01b404b9, +0x34eabf6b, +0x0ea7ff7a, +0xbeffffdf, +0x27fc1d50, +0x8ef04300, +0x5eb027f9, +0xfb4eff59, +0x07120e99, +0x07c107d0, +0x562f6bb3, +0xa740a7ee, +0xffe9733e, +0x9d4003c5, +0x0ea53d04, +0xb5340ec5, +0x3c049d0e, +0xc5380ec5, +0x0ec5300e, +0xa70e2544, +0xffffff3e, +0x16cd34b9, +0x32bd2402, +0x6e7e16cd, +0x070676fd, +0x071c070d, +0xfebe7e2b, +0x06664127, +0xfb8e0407, +0x567e0d07, +0x8e0127fd, +0x8e0127fb, +0x074027fb, +0x00fb8e04, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x02020100, +0x03030303, +0x04040404, +0x04040404, +0x05050505, +0x05050505, +0x05050505, +0x05050505, +0x06060606, +0x06060606, +0x06060606, +0x06060606, +0x06060606, +0x06060606, +0x06060606, +0x06060606, +0x07070707, +0x07070707, +0x07070707, +0x07070707, +0x07070707, +0x07070707, +0x07070707, +0x07070707, +0x07070707, +0x07070707, +0x07070707, +0x07070707, +0x07070707, +0x07070707, +0x07070707, +0x07070707, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x08080808, +0x4ea7fc4e, +0xa9feffff, +0x891e3c43, +0x0ec1d204, +0x8b342bb0, +0x1431c83f, +0xc2b401c1, +0x02890e1e, +0x8d4103ac, +0xe20bd204, +0xc558f3f0, +0x4ea7b00e, +0xc1fdefff, +0x44c1e801, +0x45e1c2d8, +0x53184c33, +0x44d41d4c, +0x2bd4273c, +0x9fcea7d4, +0x04c1fde4, +0x1841c2ec, +0xa9c404c1, +0x0b010203, +0xa9430b41, +0x05010402, +0x27c215c4, +0x89c43540, +0x0389f804, +0x0b4103ac, +0xf8048d13, +0x02e801c5, +0xcffdf0e1, +0x1ec2fc8e, +0xd20489a7, +0xfc4e981e, +0x016404b9, +0x23980389, +0x07345b44, +0x2331c2d0, +0x89fc0489, +0x410bf803, +0xcfabc407, +0x3f8b3c2b, +0x071031cc, +0xff4e7e0d, +0x2bf8d489, +0xc84f8b4c, +0xfc8ef241, +0x931e0389, +0x00ec1ff4, +0x03200289, +0x6041a931, +0x33210301, +0xa9243334, +0xc2016244, +0x30271913, +0xce2024ca, +0x04012924, +0x00002f27, +0x34ab1000, +0x030532ab, +0x13cefe0b, +0x003f2726, +0xc2040000, +0x0401e242, +0x34ab2027, +0x030532ab, +0x0401fe0b, +0x00002f27, +0x34ab3000, +0x030532ab, +0x3f27fe0b, +0x0c000000, +0xfd4ebb1e, +0x953ed007, +0xebb6f493, +0xdc43d100, +0x2134d803, +0xd4254027, +0x4027d415, +0x6520d389, +0x45d435d4, +0x76d455d4, +0xa3d40135, +0x0400004e, +0xfd8ed405, +0xd42540a7, +0xdf1ed415, +0x4eff5f5e, +0x0008a9f7, +0x0bd00701, +0xab980781, +0xff7ea79f, +0x09adfdef, +0xaea70100, +0xc1fde46f, +0xd399e47c, +0x18cc33fe, +0x2b1dcc53, +0xfad4893c, +0x430b34e6, +0x07fad48d, +0x073c0b34, +0xce4fab43, +0xc4d45c49, +0x07e30749, +0x2b310348, +0xabb40743, +0x0b0427bf, +0xc10c2bb3, +0xd4c1f0d1, +0xc2c103f4, +0xd4c11841, +0x02d3a9c8, +0x0b410b01, +0x04d2a943, +0x15a40501, +0x354027a2, +0xacd389a4, +0x310be103, +0xd3c54e07, +0xce4fabf0, +0xf0f014be, +0x9d491bcb, +0x4fabfedc, +0x270a45d0, +0x1ef4e843, +0xfedc9d83, +0xffff4ea7, +0x4243a9fe, +0x3842a91e, +0x2b43071e, +0x004dfc42, +0x07013880, +0xfad38972, +0x432b4707, +0x80004d1c, +0x4ea77307, +0xa9feffff, +0x071e3a43, +0x8b432b49, +0x0741284f, +0x999fab93, +0x4ff6d0d4, +0x3ea70112, +0xc1fdefff, +0x4c33fc34, +0x1d4c5318, +0x071344c4, +0xe8432723, +0xfc23c1f4, +0x53183c33, +0x34c01d3c, +0xff4ea7f1, +0x4ec1fdef, +0xddd499fc, +0x5318ec33, +0x4e2b1dec, +0xf6d8d189, +0x0700ac4f, +0x072e0b21, +0xce4fab42, +0xe4d45c49, +0x03420759, +0x07942b41, +0x0b0fab09, +0x2bc20704, +0x1faea702, +0x9c27fde4, +0x0fbea744, +0x8f27fde4, +0x40000000, +0x4c834c07, +0x3334871f, +0xc1340b46, +0x3e23c0d1, +0xc1feeaf0, +0xa305ccd2, +0x210be103, +0x4027a915, +0xb205a435, +0xd489b915, +0x0bb835ac, +0xc0d4c541, +0xf0f0c103, +0xddde9d3e, +0xced4d289, +0xdc893a27, +0x342cced8, +0x89b8d1c1, +0xd0c1acde, +0xffbea7e4, +0x2103d07f, +0xd4993207, +0x0b3fabdf, +0x8623071e, +0x05b10544, +0xce370e01, +0xd38de9c3, +0xb8d1c5d4, +0xe4c4f78e, +0x8ebf1e8c, +0xa7140bf7, +0xfeffff3e, +0x31ad4107, +0x4c831e40, +0x3434d51f, +0xd8d18d1e, +0x4ea73127, +0xc5fdcfff, +0x345e6c43, +0x5e7307ff, +0xd389fec9, +0x4339ced8, +0x49071307, +0x432b3103, +0x430b4fab, +0x89c0d2c1, +0x412bacd3, +0xd2c5230b, +0xb01103c0, +0xff4ea7f4, +0x49adfeff, +0x1c831e40, +0x3441d51f, +0xd8d98d1e, +0xf49b4027, +0xa731270e, +0xfdcfff4e, +0x5e6c43c5, +0x1907ff50, +0xfd4ed81e, +0xa9d40389, +0x07010004, +0x1634ced0, +0x10270d07, +0x27fdb27e, +0x89f4e843, +0xd4a9d4d3, +0x43ce0100, +0x64d4b9ec, +0x98d38901, +0xd2894423, +0xfcd189da, +0x013ed0a9, +0xdec1345b, +0x0b130be4, +0x9930a720, +0xd28dd0d4, +0xfcd18dda, +0x4486e305, +0xfd8ee315, +0xc107fc4e, +0x1027d007, +0xe8eaf093, +0xfd657e00, +0xf093cf6b, +0x7e00e9e8, +0xc7a600ad, +0xffff2ea7, +0x4223a9fe, +0x4424a901, +0x7834ce01, +0x23bd3027, +0x40271e98, +0x070ef49b, +0x871f6b1d, +0x100f0301, +0x53000654, +0x103f9bd8, +0xf2930401, +0x5100e8a8, +0x05432b2e, +0x08e19d04, +0xa7122499, +0xfd4fff3e, +0x4909e49d, +0x99e44d24, +0x21690824, +0x410b3211, +0xe205e46d, +0x4027dcf6, +0x070ef49b, +0x27ff8b00, +0x9d402720, +0xe20508e4, +0x01103f9b, +0x05430b04, +0xa7c60604, +0xfeffff3e, +0x1e9832bd, +0xf49b4027, +0x27fc8e0e, +0x9823bd32, +0x9b40271e, +0x31270ef4, +0xcfff4ea7, +0x6443c5fd, +0x07ff7e5e, +0x0342734d, +0x1ef4e841, +0x99f54ebb, +0xf0e31d04, +0x4fe66007, +0x049902f1, +0xf04fe623, +0x9d402702, +0x2ea71d64, +0xb9feffff, +0xa902d424, +0x2b014423, +0xcc4f4b43, +0xc2071c41, +0xe8150e27, +0x7e102703, +0xc4b9ff04, +0xc3a902d4, +0x432b0144, +0x41c84f4b, +0x1f6c99e8, +0xffff3ea7, +0xb9c123ff, +0x83010834, +0xc4ee0fcc, +0x4c0703a1, +0x44333c87, +0x4c2b432b, +0x44873027, +0xf5186289, +0x00011043, +0x0c43f5ff, +0xa7ff0001, +0xffffff3e, +0xb9672fd6, +0xe0010134, +0x0357ff4c, +0x010134b9, +0xfd01f405, +0xd333f401, +0xd40b4633, +0xf27cde23, +0x274d07ff, +0x123c2720, +0x44034205, +0x6231f3c8, +0xd2051027, +0xd3756341, +0x831f6499, +0x34070f4c, +0x34332487, +0x342b322b, +0x3e233387, +0x27fffeec, +0x03310547, +0xa7f4c834, +0xfd4fff4e, +0xd2214301, +0xab103c33, +0x1ed22523, +0x0134b914, +0x05d40701, +0x33d333f4, +0x23d40b46, +0xfff27cde, +0x4fff4ea7, +0xa74c81fd, +0xfeffffee, +0xe3d14091, +0xe4d10130, +0xc3330128, +0xd2310333, +0x4c1bd151, +0x240b301b, +0xecd5130b, +0xe0d50128, +0xd2350130, +0x6351d155, +0xdeb1d4a1, +0xd4a5430b, +0xe6f6f393, +0xa033b900, +0x30d0c104, +0x45334307, +0xce23c407, +0xf1feece8, +0x01132045, +0x1847f1ff, +0xf1ff0113, +0x01131c48, +0xc1f315ff, +0xd1c134d2, +0xc1c93138, +0xca413cd3, +0x5140d4c1, +0x0b250bcb, +0x0b4b0b3a, +0x0b080be7, +0x34d2c519, +0xb540d4c5, +0x30d0c5de, +0xc538d1c5, +0x63993cd3, +0x0f3c831f, +0x23874307, +0x422b4433, +0x5487432b, +0xfef45e23, +0x034507ff, +0x01372748, +0x05c403c1, +0xa8440341, +0x836431f3, +0x34870f4c, +0x340b4433, +0x13c132f9, +0x2ff6ff00, +0x4ea70165, +0xd1ffffff, +0x0718484c, +0x07cd033c, +0xe32c0705, +0x2ce37f3c, +0x07cd237f, +0x03341905, +0x32c2803c, +0x315a21f9, +0x18698958, +0x1001adf4, +0xadf00121, +0x01bc0101, +0x017cbd27, +0x04430d27, +0x3a071027, +0x3c732a07, +0x0bdebe1f, +0x803c2700, +0x300b4027, +0x5299414b, +0x87140728, +0x181c3322, +0xb80b3853, +0xa39020f1, +0x31ab0001, +0xb09bb30b, +0x4c0b4987, +0x4bd5b853, +0x84c60108, +0xc915a486, +0x63999ea6, +0x235b211f, +0x0f3c8331, +0x23874307, +0x422b4433, +0x4487432b, +0x3e233407, +0xf1fffef4, +0x00011447, +0x313471ff, +0x41f42538, +0x613a5139, +0x415e313c, +0x61515150, +0x21547152, +0x0bb70bf3, +0x0b090be8, +0x0b2c0b1a, +0x25547543, +0x455e355b, +0x65515550, +0x93f41152, +0x00e58bf1, +0x43834103, +0x04a014bd, +0x4fff9ea7, +0x219301fd, +0x3b4127da, +0x99a4ab43, +0xda251a63, +0x89713fd6, +0x62991864, +0x1e639921, +0x03226199, +0x1f609941, +0xeea7423b, +0x2bfeffff, +0xa9383341, +0x330144e2, +0x30ab104c, +0x4ea734ab, +0x03ffffff, +0x0843d521, +0x44e2ad01, +0xc3012701, +0xa7f58ef0, +0xfddfff3e, +0x01c034d1, +0x00aa4fe6, +0x01a833d1, +0x430b0451, +0xfa5e0455, +0x01aef0fc, +0x00a80100, +0xda1ebd27, +0x02720d27, +0xdf5e1027, +0x186989fe, +0x01ff175e, +0x005f27d4, +0x833fe000, +0x34870f4c, +0x340b4433, +0x13c430f1, +0x3ce9ff00, +0xff0013c8, +0x00131dbe, +0x0c07b007, +0x0010e8be, +0x0b071007, +0x000ea5be, +0x000d18be, +0xb0074027, +0x24073507, +0xc1070b07, +0x001db5be, +0x04074007, +0xc9be5107, +0xd09d000a, +0x44d39944, +0x4f6b4307, +0x27344c10, +0xd39d333c, +0x01940144, +0x144c33f1, +0xda25a4ab, +0x12be0607, +0x30a7fbae, +0xffff4ea7, +0x0143bdff, +0xff115e01, +0xf0c30027, +0xbc27f58e, +0x9f0d271f, +0x5e102705, +0xbd27fe46, +0x0d2711fd, +0x1027033a, +0x27fe395e, +0x03e8070e, +0x5d7e1027, +0x8b0ea7fb, +0x86befff2, +0xf005fc61, +0x01e900c8, +0xff4ea7f1, +0x41bdffff, +0x975e0101, +0x27d307fc, +0x2764060d, +0xfb367e10, +0x0108d4b9, +0xfc504cee, +0xf84eee1e, +0xbea7c007, +0x27fddfff, +0xfd93108c, +0x2700e410, +0xaea70c9c, +0x1efd4fff, +0x30b8c547, +0xc1102f9b, +0xd35138d4, +0xd4c5422b, +0x08399d38, +0x9d12d499, +0xd4490934, +0x344da111, +0x6908d499, +0x0b3105d2, +0x27346d42, +0x0ef49b40, +0xff8b0007, +0x0508349d, +0x104f9b30, +0xc538d3c1, +0x430b30b0, +0x0738d4c5, +0xfb8b7e0c, +0x8eb30fc6, +0xa7fc4ef8, +0xfdcfffce, +0xc5104c27, +0x1f6b50c4, +0x27faaf7e, +0x50c4c540, +0x8e70c4c5, +0xa7fb4efc, +0xfeffff2e, +0x1e3e24a9, +0x07da0389, +0xab432bd0, +0xcac1074f, +0xb2071d14, +0x0c271027, +0x07c33e16, +0xf68e7e0d, +0x1e3eb4a9, +0x2bdad389, +0xc24fab43, +0xfb8ee74c, +0x3ea7fd4e, +0x21e7ffff, +0x0c41d834, +0x4ea73027, +0x35e7ffff, +0x07fd8e43, +0x354127d3, +0x270b27d4, +0xfa4a7e10, +0x41dcd421, +0x4eef1ee4, +0x07f2e3f6, +0x272f07b0, +0x273b2710, +0x2321054b, +0xb8240331, +0x256b07f4, +0xa7f315f3, +0xe7ffff7e, +0x01086d03, +0x0164b4b9, +0xb199b849, +0x6b442308, +0x07bc694f, +0x3b9107a8, +0x98be89a4, +0xc10b943b, +0x279ab089, +0x27a48631, +0x33c43b30, +0x2127103c, +0x2027ae0e, +0xdda3d907, +0xd3ab2000, +0x27112c33, +0x270c0e41, +0x33d2ab40, +0x31270f4c, +0x3027ae0e, +0x3c33d4ab, +0x0e41270e, +0xab40270c, +0x0e4c33d3, +0x8d22f19d, +0xfa8d1cf8, +0x20fc8d1e, +0xab23f99d, +0x959fe6d4, +0xcdafe600, +0x89957600, +0x44c620f4, +0x0800dda3, +0x86f4b4c1, +0x51b4b945, +0xee412304, +0xe2008d49, +0xe60098ea, +0x8900fc9f, +0x4cee9ab4, +0x0f070101, +0xfd051027, +0x99f6ad7e, +0x4fe623f4, +0xf39900da, +0x0ab49922, +0xf389434e, +0x98b4891e, +0x00fd34ea, +0x01feef7e, +0x114546f4, +0x217355f3, +0x457065f0, +0x25b4b974, +0x714fd601, +0xb129b209, +0x077612ce, +0x0b438342, +0x0d43994b, +0x230b3f4b, +0xdaf120c8, +0x3207ee12, +0x33834207, +0xb44d4253, +0x0d08b39d, +0xfefe5eb2, +0x11231e07, +0x18071802, +0x6a7e0b07, +0x98be89fe, +0xff5faff6, +0xf489271e, +0x704fe61e, +0x00dda3ff, +0x6caeea10, +0x9ab489ff, +0x3de33d07, +0x4cee0800, +0x4027009f, +0xf4650f07, +0x6c1ef305, +0x0000dea3, +0xff2f5e01, +0x967e0607, +0x29b209f9, +0x8c21ceb1, +0xd4274027, +0xffffcea7, +0x09b49de7, +0x27fe4f7e, +0xb0c44540, +0xfe467efd, +0x5b7e0b07, +0x98b4d1f8, +0x98b38904, +0x430b4103, +0xf2c341e3, +0x0498b4d5, +0xf189f68e, +0x7e0b071c, +0x1f5ef52a, +0x7e0b07ff, +0xb489f498, +0x03c4ee9a, +0xd64183ff, +0x00dda348, +0x650f0704, +0x15fd05f4, +0x35f425f4, +0x55f445f4, +0xf5d67ef4, +0x07feee5e, +0x7e11270b, +0xfd5ef5cf, +0x00dda3fe, +0x07402704, +0x05f4650f, +0xa3d91efd, +0x5e04003d, +0x0000ff5e, +0x000000d9, +0xb007f54e, +0x2ea71b07, +0x23ffffff, +0x03a007f1, +0x0301781d, +0xd1012c0d, +0x150e2424, +0x03f125f0, +0xa70108ad, +0xe7ffff5e, +0x051a4fe6, +0x5fff3ea7, +0x933411fd, +0x00e0f3f2, +0x15104ca3, +0x0b1ea734, +0x2301fefd, +0x22111401, +0x41e8432b, +0x20e8051a, +0x4207051c, +0x45333287, +0x3407432b, +0x019ef213, +0x2b353321, +0x23f21134, +0xfef10c3e, +0x30014107, +0x20051123, +0x24033403, +0xf293f498, +0x0100e0ac, +0x03231124, +0x05310341, +0x23231524, +0x5531ec41, +0x95f39306, +0x340100e0, +0xfd0b0ea7, +0xa90415fe, +0xa90434b3, +0x27012eb2, +0xff1ea741, +0x14c5fdcf, +0x23322b68, +0x4ab4b931, +0x94b3ad04, +0x96302704, +0xb9312744, +0xbd012cb4, +0xf804aeb3, +0xd1055541, +0xa903d0bd, +0xb90494b9, +0xb90452b4, +0x070447b3, +0xf6643b69, +0x2704fb3f, +0x65b0b9c0, +0xe604f001, +0x07042304, +0x03e05be6, +0x3eb2a904, +0x23102701, +0x27230b21, +0x9d402731, +0x3ea709b3, +0x9dfee177, +0xb10d0cb1, +0xb49db14d, +0x12bd8d08, +0xbe6db355, +0xb1b92287, +0x04f00451, +0xb4a90495, +0x30070140, +0x34234c0b, +0xb39d4e2b, +0x02433b0b, +0x5b410741, +0x23340743, +0x23430721, +0x0b038741, +0x2d032b23, +0x0ab49db2, +0x14070103, +0x057d41e8, +0x21232307, +0x42a73b07, +0x030d349d, +0x93f2b031, +0x00dfc3f2, +0x24b91b0b, +0x109d04ae, +0x904ff60d, +0xff3ca701, +0x40a753b5, +0xb53053c5, +0x3054c554, +0x30a74627, +0x53c553b5, +0xa7f4b030, +0x51b5fd1c, +0xb53051c5, +0x3053c553, +0x40a73627, +0x54c554b5, +0xb9f3b030, +0x3504afb3, +0x303fe6f3, +0x2c61e804, +0x23460704, +0xd1f40541, +0xf803dcb4, +0x2801004d, +0x90b4b904, +0xd1f30104, +0x7b04dcb0, +0x07130734, +0x83430723, +0x87218312, +0x83224771, +0x0b433344, +0xe3740b72, +0x33309b37, +0xd1730b74, +0xb904e0bd, +0xb90451b3, +0x9b0470b4, +0x7fdc03d3, +0xdce34f4b, +0x064fe67f, +0x6cb9d104, +0xd8b4d104, +0xd5490e04, +0x9304d8b9, +0x003707f1, +0xb1d11c01, +0x0c070468, +0x001c54be, +0x809b8d07, +0xf293c103, +0xb90036f0, +0x0b0451b3, +0xa92c0589, +0x0704ecb4, +0x12462b03, +0xa9040734, +0xe6012eb4, +0xb904184f, +0x270491b2, +0xe64027e0, +0x2704466f, +0xf6e58630, +0x3102156f, +0x0f1fe6f1, +0x53102702, +0xab278322, +0xa723ab24, +0xfddfffde, +0xb4a921ab, +0xd2d50190, +0xd02501d4, +0x80004d83, +0xb4b94536, +0x4fc6013c, +0xdcb4d167, +0x004dd803, +0xb4b92501, +0x18270490, +0x143bf001, +0x001ba7be, +0xb3d14427, +0xd4d504e8, +0xb2d101d8, +0x309b04e4, +0xd2d5830b, +0xf23101bc, +0x41272586, +0x40276486, +0x0198d4d5, +0x0470b4b9, +0x4fe64f4b, +0xb4b903eb, +0xb3d1013b, +0xb2d10464, +0x342b04d8, +0x329b3123, +0xd8d5830b, +0x4ea7019c, +0xd5fddfff, +0x2701ac47, +0xd5302740, +0xad04a4b4, +0xb904acb3, +0xa9012db1, +0x07043ebc, +0x83212321, +0x31070f2c, +0xe1874207, +0x34330287, +0x3e2b4433, +0x422b402b, +0xb2a9312b, +0x3387013e, +0x00274487, +0x3e232c9b, +0x23fffef4, +0xfffef44e, +0xbeb91c47, +0xb3c5044d, +0xe0b4c5e4, +0xc5aeb18d, +0xb09db4b2, +0xacbc8ddf, +0xe6deb09d, +0xa7023eef, +0xfeffff4e, +0x014143b9, +0x02313fe6, +0x012eb4a9, +0xffff3ea7, +0x34b2a9df, +0xc8b3c504, +0x03c4b3c5, +0x5524ee41, +0x2cb4b903, +0x27443801, +0xdfb49d41, +0xc1acb089, +0x3007b4b2, +0xb1893333, +0xc5230bd2, +0xb3c5f0b3, +0xc0b3c5b8, +0xc5b0b3c5, +0xb3c1e8b3, +0x271803c8, +0x49beb940, +0xbcb4c504, +0x8db4b2c5, +0xb3c5d2b1, +0xe1eff6cc, +0xd1302701, +0x9d01e4b4, +0x45c6d0b3, +0x02dbefe6, +0x012eb4a9, +0x02db41e0, +0xdd4af193, +0xae14b900, +0x98b28904, +0x0164b3b9, +0x02564fe6, +0x30272027, +0xc5ecb2c5, +0x0b07f4b3, +0x93f0477e, +0x00dd27f2, +0x04ae24b9, +0x02324fe6, +0x0164b4b9, +0x013eb3a9, +0x343b4423, +0x1e98b38d, +0x070b0742, +0xf0ac7e1c, +0x2e0ab499, +0x3eb4a9d4, +0x4fc4ca01, +0xc67e0a07, +0x29b209f4, +0x5612ceb1, +0x43834207, +0x43994b0b, +0x0b3f4b0d, +0xf120c823, +0x07ee12da, +0x83420732, +0x4d425333, +0x08b39db4, +0xbd99b20d, +0xd6bc4908, +0xb4a9bfdf, +0x4cc2013e, +0x070b07b1, +0xf91f7e1c, +0x1e27a81e, +0x5e020000, +0x1127fdef, +0x247e0b07, +0x7e0a07f1, +0xb209f471, +0x21ceb129, +0x9d4027ac, +0x0b0709b4, +0xd1f3497e, +0x890498b4, +0x410398b3, +0x41e3430b, +0x0498b4d5, +0x5b7e0a07, +0xbd4127f8, +0xd10125b4, +0x210108b3, +0x122c27f4, +0x44034001, +0x34033005, +0xb2d1f2a8, +0xb3d103d0, +0xb0b903e0, +0xb2d5044c, +0xb3d50114, +0xb2b90118, +0xb0bd0490, +0xb1a90126, +0xb3b90494, +0xb0b90452, +0xb4a9012d, +0xb2bd012e, +0xb1ad0128, +0xb3bd0120, +0xb0bd0129, +0x20270127, +0x21274496, +0xb998b489, +0xbd0451b3, +0x9b0122b2, +0xaeb2b943, +0xd5443304, +0xb9011cb4, +0xbd04afb1, +0xa7012bb2, +0xffffff2e, +0x0e2424d1, +0x012ab1bd, +0xfaea4ff6, +0x5fff0ea7, +0x930411fd, +0x00dbdbf2, +0x15104ce3, +0x0b1ea704, +0x2301fefd, +0x22111401, +0x41ec432b, +0x20a7faea, +0xfae820ec, +0xa37e0a07, +0x9b4027f7, +0xf49b0bf4, +0xec051e0e, +0x27fad520, +0x7e112705, +0x3ea7f7f9, +0x93fefd0b, +0x00db9bf0, +0x03013401, +0x432b0211, +0xa7e141cc, +0xd1dd1e20, +0xc50388b4, +0xb4c5c8b4, +0xfdea5ec4, +0x012eb4a9, +0x44863027, +0x31c33127, +0x145e3183, +0x40b3a9fe, +0x2b442701, +0x2b143b40, +0x0bb49d3e, +0xfb7531e2, +0x705e3107, +0x2b4427fb, +0x3be60740, +0xfb1b5ee4, +0x3127c127, +0xd1fb045e, +0x0503dcb4, +0x004dfcf6, +0xb9fbdc01, +0xd10451b3, +0xb904e0bd, +0xd10470b4, +0x0104dcb7, +0x03d39bf0, +0x4f4b7fdc, +0xdce3709b, +0xfe4ff67f, +0xd8b4d1fb, +0x9b8d0704, +0x5e840b89, +0x0a07fc23, +0x93f6ed7e, +0x00db07f2, +0x04ae24b9, +0x009c4ff6, +0x00be0b07, +0xbdd1fba6, +0xbd8d03d0, +0xfa915e12, +0xb47e0b07, +0xfe6a5ef7, +0x237b3423, +0xb4693207, +0x0333309b, +0x4fe6300b, +0x23070093, +0x012eb4a9, +0xfd964ff6, +0x915e3027, +0x3ab4b9fd, +0xb9e12701, +0xa90491b2, +0x270162b3, +0x27441810, +0x07317b11, +0xb9460713, +0x0b0490b3, +0x2b443312, +0x0334c614, +0x0713e313, +0x2b443340, +0x83463341, +0xf603004d, +0x31fbbe6f, +0x863127f1, +0x33302714, +0xb25e103c, +0x2eb4a9fb, +0x294ff601, +0x88b4d1fd, +0xccb4c503, +0xd5fd1f5e, +0x5e019cd8, +0x0b07fc2a, +0xfba4ecbe, +0x27ff655e, +0xfa915e10, +0xb49d4127, +0xfca75ede, +0x432b4203, +0x21152405, +0x27f9a45e, +0xff6e5e20, +0x4207f64e, +0x93078207, +0x3007a207, +0xab102c53, +0x073fab4f, +0x07e39be2, +0x07710760, +0x531407b0, +0x349b100c, +0x4307109b, +0x4c53e10b, +0x9be40b10, +0x031e0220, +0x0100002e, +0xb99b4e07, +0x9b10ec33, +0x104c53a7, +0x3fabd207, +0xba0bce07, +0xc30bd40b, +0x0c071b07, +0xf68e1d0b, +0xc027f54e, +0x0000df27, +0x2c0741e0, +0xa0073d07, +0x1bbeb107, +0x00c80015, +0x0720271f, +0x071b073d, +0x127bbe0a, +0x07400700, +0xbe510704, +0x030013c3, +0x0000000f, +0x07f58e80, +0xbe0a071b, +0x8e0013b3, +0xd00401f5, +0x13011342, +0x44c032b0, +0xa4342049, +0x3c32c042, +0x45c61411, +0x01071127, +0x3284fe0b, +0x42c60411, +0x010710a7, +0x0311fe0b, +0x344e1411, +0x10a73106, +0x0221f11e, +0x42da1421, +0x31247af4, +0xca103104, +0x0442eb04, +0xa7ce3fd6, +0x27d81e10, +0x0b010710, +0xc934c4fe, +0x04111111, +0xbb1e142b, +0x0301fb4e, +0x012f32d0, +0x2842d014, +0x00fb34e0, +0xc42144c0, +0x32c42242, +0x1123051d, +0x21241504, +0x31242504, +0x11243504, +0x07141103, +0x15438b02, +0x07fb8e24, +0xc0fb8e01, +0x0c21fa32, +0xec071421, +0x0b31e42b, +0xde071331, +0xc867e0c8, +0xfa4c20ec, +0x07008c4c, +0x11b027c4, +0xce141100, +0x0f667404, +0x30c83b2b, +0x1540277e, +0x352c2524, +0x07213123, +0xd4412341, +0xffffff4f, +0x2321163f, +0x31231147, +0x21354107, +0x41232325, +0xffff4fd0, +0x27ee3fff, +0xc8240543, +0x02072810, +0xd1c8fb8e, +0x3b412752, +0x8b41234e, +0x86d02743, +0x5bd12744, +0x1e3dab3e, +0xcce013a7, +0x1e9920ec, +0x1e3b1be2, +0x072421a6, +0x83315331, +0x0313ab11, +0x35020741, +0x8e242521, +0x0b1b07fb, +0x25201513, +0x1e21352c, +0x5e3027b3, +0x3013ff77, +0x24154127, +0x23352c25, +0xdfe6801e, +0x4127ff67, +0x41234e3b, +0xce0b4b8b, +0x4486d027, +0xbe5bd127, +0x505ebdab, +0x2a44e4ff, +0x111311ff, +0x2234ee04, +0x25f093ff, +0xfb8effea, +0x30070001, +0x3c534007, +0x1f4c5317, +0x14152007, +0x2e833f6b, +0xd67fffff, +0x2728c639, +0x7d3ca743, +0x42071405, +0x47331325, +0x00004f74, +0x44474000, +0x4fd03123, +0x40000000, +0x351325f6, +0x27fe0b14, +0x0b140542, +0xff3cc0fe, +0x23273316, +0x2fa37f3c, +0x40000000, +0x12354327, +0x14051325, +0x2516fe0b, +0x14054427, +0x0e83fe0b, +0x46100000, +0x05412705, +0x0b123514, +0x1e1005fe, +0x63f54ef9, +0x051f07f1, +0x071403f0, +0xff7a7e0f, +0x4027f341, +0x22532307, +0x42abf011, +0xf231f121, +0xbe1e3c33, +0x07000c79, +0x8ef14351, +0xa3fb4ef5, +0x03bf07f2, +0x15f005b8, +0x070f07f1, +0xff4a7e1b, +0xcc03cf07, +0x030f0718, +0x7e1c0704, +0x0b07ff3c, +0xba7e1c07, +0x8ef283fd, +0x310401fb, +0xd0021103, +0x44c06442, +0xf6420057, +0x27402735, +0x3304ab00, +0x02ab1f2c, +0x0021fe0b, +0xff820fc8, +0xcc5bffff, +0x0739800c, +0x7f4c8343, +0xc07f0c03, +0x031e404c, +0x30c83f3c, +0x53430721, +0x830f6b47, +0x7fffff4e, +0xab170c33, +0x1f2c3304, +0xfe0b02ab, +0xe3803cd8, +0x1e403c03, +0x033153de, +0x27db1e01, +0x000f2740, +0x1e7f8000, +0xa34307a9, +0x1000004e, +0xffff4e83, +0x000f277f, +0x1e7f8000, +0x820f1395, +0xccffffff, +0x27531a0c, +0x23403b41, +0x27438b41, +0x27448610, +0x07305b11, +0x0701ab03, +0x7f4c8340, +0x3c404cc0, +0x4c034007, +0x5334073f, +0xd0012737, +0x0000004f, +0x43072040, +0xffff4e83, +0x170c337f, +0x07ff505e, +0x404c0340, +0x37533407, +0x4fd40127, +0x40000000, +0x1e0027e2, +0x270027de, +0xdcd81e30, +0x07e1800c, +0x27375330, +0x000f1441, +0x27400000, +0x1e040740, +0x23fe4ec2, +0x07f005f1, +0x25f1150f, +0x7ef335f2, +0xf103fef9, +0xfd4efe8e, +0xdf07f163, +0xf005d403, +0x0f071d07, +0x21fe137e, +0x963027f4, +0x07312744, +0x7ef3250d, +0xf143fed5, +0xfc4efd8e, +0xcf07f2a3, +0xf005c803, +0x0f07f115, +0xed7e1c07, +0x03df07fd, +0x0f0718dc, +0x1d070403, +0x21fddf7e, +0x1622d0f2, +0x12f0f161, +0xf4310081, +0x43cbf371, +0x2400f435, +0x6e1822c4, +0x7e0c0712, +0xf283fe91, +0xf093fc8e, +0x7effe7d8, +0xf283fe85, +0x14c0fc8e, +0x3912c05d, +0xf481f241, +0x242bf351, +0xf245f191, +0x21231342, +0x3347f245, +0x00002f27, +0x00274000, +0x2a1f4c27, +0x2b02ab31, +0x47215331, +0x07f49833, +0x7f4c8340, +0x12404cc0, +0xae1ef055, +0x0c074427, +0x3a7ef425, +0x8ef283fe, +0x800cdcfc, +0x033166ec, +0x0ce3400c, +0x1ef0557f, +0x1e0d0791, +0x0740278f, +0x55f4450c, +0x4e851ef4, +0x07f3a3fc, +0x05c803cf, +0x07f115f0, +0x7e1c070f, +0xdf07fd34, +0x0718dc03, +0x0704030f, +0xfd267e1d, +0x4290f421, +0x32d0f361, +0xdc44e024, +0xcc34e000, +0x1642c400, +0xf471f331, +0x340e2027, +0x0c072127, +0xd27ef235, +0x8ef383fd, +0x1632c4fc, +0xf471f331, +0x340e2027, +0x0d072127, +0xba7ef275, +0x8ef383fd, +0x91f251fc, +0x273027f0, +0xfac6be10, +0x41f381ff, +0x0bd107f4, +0x27420343, +0x30f4c530, +0xf471f3b5, +0x2107f331, +0x4127342e, +0x3d07f4b5, +0xc11a20cc, +0x215330f4, +0x31384103, +0x0fa30153, +0x80000000, +0x20c83207, +0x30f4c5ee, +0x00002fd4, +0xc1234000, +0x091e30f4, +0x2fb40047, +0x40000000, +0x41232247, +0xa3f200cc, +0xd0004721, +0x0000002f, +0xf4c5ef40, +0x83420730, +0x4cc07f4c, +0x0f071440, +0x0c034327, +0x34f2c528, +0x2e7ef4a5, +0x8ef383fd, +0x802cdcfc, +0x030126ea, +0x2ce3402c, +0xe4e01e7f, +0x93ff4f42, +0xffe663f0, +0xe4ff3d5e, +0x93ff2b32, +0xffe657f0, +0x4eff315e, +0x07f3a3fb, +0x05b803bf, +0x07f115f0, +0x7e1b070f, +0xcf07fc20, +0x0718cc03, +0x0704030f, +0xfc127e1c, +0x2f07f471, +0x1c0741c3, +0x07282c03, +0x7ef4750b, +0xce7efae4, +0x8ef383fc, +0xa3fb4efb, +0x03bf07f3, +0x15f005b8, +0x070f07f1, +0xfbe67e1b, +0xcc03cf07, +0x030f0718, +0x7e1c0704, +0x2f07fbd8, +0x2c031c07, +0x7e0b0728, +0x9a7efab0, +0x8ef383fc, +0x23fc4efb, +0x054327f1, +0x08c127f4, +0x36c02700, +0x05422706, +0x150f07f4, +0xfc7b7efc, +0xfc8ef103, +0xd007c876, +0x071e4c27, +0x35f4250d, +0x115bbefd, +0xc8012300, +0x4c27e001, +0x2bd03b1e, +0x25fd3540, +0x40d31ef4, +0x0000000f, +0x13d00780, +0x27d61ed0, +0x0000000f, +0x4ec61ecf, +0x07f2a3fc, +0x05c803cf, +0x07f115f0, +0x7e1c070f, +0xdf07fb5c, +0x0718dc03, +0x0704030f, +0xfb4e7e1d, +0x42d0f421, +0x90f46110, +0x070c0742, +0xf9c37e1d, +0xfc8ef283, +0xf91e0127, +0xf163fe4e, +0xf0051f07, +0x0f071403, +0x11fb277e, +0x274244f4, +0x8ef14300, +0xf842d0fe, +0xf4314440, +0x88f140c8, +0xf4211f4c, +0x0f2747c6, +0x80000000, +0xfe8ef143, +0xf321f041, +0x5b1e4c13, +0xd63fc604, +0xf1430013, +0x0f27fe8e, +0x7fffffff, +0xfe8ef143, +0xf2a3fe4e, +0x1f07f115, +0x1803f005, +0xd57e0f07, +0x070f07fa, +0x0304031f, +0xc97e181c, +0x90f421fa, +0x27f46142, +0x83423000, +0x27fe8ef2, +0x8ef28301, +0xa3fc4efe, +0x03cf07f2, +0x15f005c8, +0x070f07f1, +0xfaa27e1c, +0xdc03df07, +0x030f0718, +0x7e1d0704, +0xf421fa94, +0x611042d0, +0x074290f4, +0x7e1d070c, +0xf283f909, +0x0127fc8e, +0xfc4ef91e, +0xcf07f2a3, +0xf005c803, +0x0f07f115, +0x697e1c07, +0x03df07fa, +0x0f0718dc, +0x1d070403, +0x21fa5b7e, +0x1042d0f4, +0x4290f461, +0x1d070c07, +0x83f8d07e, +0x27fc8ef2, +0x4ef91e01, +0x07f2a3fc, +0x05c803cf, +0x07f115f0, +0x7e1c070f, +0xdf07fa30, +0x0718dc03, +0x0704030f, +0xfa227e1d, +0x42d0f421, +0x90f46110, +0x070c0742, +0xf8977e1d, +0xfc8ef283, +0xf91e00a7, +0xf2a3fc4e, +0xc803cf07, +0xf115f005, +0x1c070f07, +0x07f9f77e, +0x18dc03df, +0x04030f07, +0xe97e1d07, +0xd0f421f9, +0xf4611042, +0x0c074290, +0x5e7e1d07, +0x8ef283f8, +0x1e00a7fc, +0xa3fc4ef9, +0x03cf07f2, +0x15f005c8, +0x070f07f1, +0xf9be7e1c, +0xdc03df07, +0x030f0718, +0x7e1d0704, +0xf421f9b0, +0x611042d0, +0x074290f4, +0x7e1d070c, +0xf283f825, +0x0127fc8e, +0xfd4ef91e, +0xd007f123, +0x42270676, +0x0f07f405, +0xf4154027, +0x03fa547e, +0x27fd8ef1, +0x1e3c2743, +0xf325f405, +0x36bef035, +0x0123000f, +0xc61c00c8, +0x4c27dd0f, +0x3b402b1e, +0x07f425d0, +0x3540270f, +0x7ef415fd, +0xf103fa25, +0x2007fd8e, +0x41272013, +0x4123423b, +0x30274d8b, +0xd25b4636, +0xab1e4c27, +0x35402b3d, +0x1ef425f3, +0x1e3127a6, +0x01fd4eee, +0x1342d004, +0x32b01301, +0x205d44c0, +0xc042a434, +0x14114832, +0x112745c6, +0xfd8e0107, +0x04113284, +0x10a742c6, +0xfd8e0107, +0x14110311, +0x3106344e, +0xf11e10a7, +0x14210221, +0xdaf442da, +0x0d311524, +0x10310e41, +0x1eca1141, +0x141ecee6, +0xe16ee12a, +0x3fd60d42, +0x1e10a7c2, +0x071027cc, +0xc2fd8e01, +0x3fd6ebd0, +0xc4b01ecc, +0x1111b534, +0x142b0411, +0xf54ea71e, +0x5027f1a3, +0x03016027, +0xf645f535, +0x7107c007, +0x8027b207, +0x32d09027, +0xf014012f, +0xe0017d42, +0xe0024b34, +0xc4017544, +0x32c42442, +0x0732071b, +0x01252740, +0x05440341, +0xa8340331, +0x11c311f2, +0x8bcb0774, +0x07b41543, +0x8ef1830c, +0x4b32e0f5, +0x210e2101, +0x41fe2514, +0x07023103, +0x05f315ae, +0x31a42bf2, +0x071e411d, +0xdfa0e83a, +0x40accc00, +0x7c31e84c, +0x233a0701, +0xf355203c, +0x60275027, +0x01dc30e8, +0x14074127, +0x2127133b, +0x0a3b0207, +0x40a730a7, +0x414b300b, +0x4e8b3d8b, +0x34c634ab, +0x60275127, +0x40e8f451, +0x8e0701a4, +0x9e07845b, +0xd5079a5b, +0xd8abe607, +0x111ee9ab, +0x43faf321, +0x10270106, +0xf4252027, +0xf215f105, +0x7411c011, +0x00db04ee, +0x00cc0fe6, +0xf411f301, +0x2e071d07, +0x246b132b, +0x00f220e8, +0xb4154027, +0xb135f421, +0xb245b425, +0xbd41bc31, +0x40a730a7, +0x4d4b3c0b, +0x00004fd4, +0xe0311000, +0xffffff4f, +0x2100c00f, +0x534c07b1, +0x3d471f4c, +0x2c4734ab, +0xb235b345, +0xbd41bc31, +0x30a71123, +0xb12540a7, +0x4d4b3c0b, +0x00004fd0, +0x271e1000, +0xd4b40543, +0x000000df, +0xcb072c20, +0xf1830c07, +0xa013f58e, +0x6d40acec, +0xff1f5eff, +0xffff4fc4, +0xd0b70fff, +0xffffff3f, +0x4327b0ff, +0xdfd0b405, +0x20000000, +0x073c07d6, +0x1f0c330d, +0x31532027, +0xbe214d07, +0x30ab1c07, +0x02074153, +0x118304ab, +0xe103cb07, +0xb04513ab, +0x0c07f183, +0xbe25b135, +0xc707f58e, +0xf1830c07, +0xf101f58e, +0x1d2bf211, +0x395e2e6b, +0x11f101ff, +0x0bb015f2, +0x072e4b1d, +0x07f221d2, +0x35b225c1, +0x5ebd45bc, +0xd027ff73, +0x015ee027, +0xff3ff4ff, +0x64ffffff, +0xff395eff, +0x3027fd21, +0x312b4027, +0x2127426b, +0xbd25b215, +0xb445b335, +0xe6ff075e, +0x21fedb3f, +0x232a07f3, +0x3a0b202c, +0xf325f255, +0x10270027, +0x009120e8, +0x64074127, +0x2127623b, +0x5a3b5207, +0x30a7f201, +0x350b40a7, +0x328b464b, +0x428bf211, +0x34c634ab, +0x10270127, +0x30c8f351, +0x5bf41150, +0x11f43543, +0x5bf431f3, +0xab23073a, +0x4521ab40, +0x15f405f3, +0xfe825ef2, +0x2b204c27, +0x071e074a, +0x5b143b8d, +0x5e81ab8a, +0x3c27fe52, +0x2b412720, +0x5b14073a, +0xfe205e13, +0xfdd944e4, +0x04111311, +0xfdd134ee, +0xe06afc93, +0xfdc95eff, +0x11204c27, +0x2bf301f2, +0x5b243b4a, +0x0742073a, +0x3524ab23, +0x27a11ef2, +0x4127203c, +0x64073a2b, +0x6b5e635b, +0x11f84eff, +0x0709010a, +0x533a07ba, +0x3c531fbc, +0x07b18314, +0x15ea0703, +0xff0d831b, +0x07c02707, +0x83d90781, +0x0fffffee, +0x49070e16, +0x45164eab, +0x14054227, +0x4327f88e, +0x03fd3da7, +0x13251405, +0x1e074907, +0x33184c53, +0xab090718, +0xd4083314, +0x0000001f, +0xe3071d10, +0x41472007, +0xab1f2c53, +0x07304742, +0x23140703, +0x004fd0e1, +0xe9100000, +0x80358e25, +0xf88e8145, +0x07ff0dc0, +0x07290728, +0x182c534e, +0x42ab4833, +0x2fa32407, +0x10000000, +0x38333907, +0x03ff0d23, +0x23271245, +0x12051025, +0xf88e1335, +0x4eab4907, +0x44274516, +0xf88e1405, +0x30274e07, +0x00004e83, +0x8634ab08, +0x05412735, +0x458d3514, +0x05f88e8e, +0x4ef71e13, +0x07f1e3f5, +0x071f0751, +0x07180340, +0x15f4050f, +0xff237ef5, +0xf461f351, +0x1f831307, +0x3fffffff, +0x04872027, +0xab1e3c53, +0x8630ab12, +0x2131a314, +0x41f131f0, +0xf6d7bef2, +0x8ef1c3ff, +0xa3f54ef5, +0x03af07f3, +0xc10710ac, +0x1a07b007, +0xf3350f07, +0x5307f225, +0xfb05fc15, +0xda7ecf07, +0x24cc03fe, +0x08030f07, +0xce7e1c07, +0x070a07fe, +0xfbab7e1c, +0xf58ef383, +0x0401f64e, +0xa0279027, +0x0e410d31, +0x42f00811, +0x44e000c9, +0x424000ba, +0x4eab4d07, +0x002747f6, +0x38071027, +0x43073183, +0x271f4c33, +0x07b00730, +0xabb3abc1, +0x070b07c4, +0x21f68e1c, +0x020fe800, +0xb1fffffc, +0x000dec00, +0x07008504, +0x273f6b3d, +0xff0d0340, +0x803cc003, +0x7f3c2756, +0xd30b4027, +0xefd0e44b, +0x20000000, +0x072e0716, +0x334e073d, +0x31531f2c, +0x415332ab, +0xe407d307, +0x20070103, +0x0d074e07, +0x2d831e07, +0x185307ff, +0x4c333207, +0xab085318, +0x33e10704, +0x2027143c, +0xee83d007, +0x070fffff, +0xab130702, +0x5e1eab0d, +0x4fd6ff76, +0x833d07a9, +0xab01003d, +0xa73fc634, +0x27803c27, +0x4bd30b40, +0x00efd0e4, +0xb3200000, +0x00279c1e, +0x00001f27, +0x4b5e7ff0, +0xa34e07ff, +0x0800004e, +0xee83e407, +0x070fffff, +0xa30d071e, +0xf000001f, +0xff305e7f, +0xfc020f13, +0x0cecffff, +0x0700ba39, +0x201c2310, +0x70276027, +0x00b510e8, +0xc4074127, +0x2127c13b, +0xb03bb207, +0x40a730a7, +0x4c4b3b0b, +0x4e8b3d8b, +0x34c634ab, +0x70276127, +0x009f10e8, +0x915b9e07, +0xd9abd607, +0x3d07ae07, +0xe707a05b, +0xeaab3f6b, +0x3cc04027, +0x3c274480, +0x0b40277f, +0x074e4b3d, +0x182c3324, +0x4f14c127, +0x10000000, +0x0307c027, +0x14070853, +0x185302ab, +0x3d833c07, +0x430707ff, +0x4c33e107, +0x07302714, +0xffee83d0, +0x03070fff, +0x0dab1407, +0x975e1eab, +0xbb4fd6fe, +0x3d833d07, +0x40270100, +0x3cb634ab, +0x4c334e07, +0x14c12718, +0x000000ef, +0x07c02710, +0x0708530d, +0x5304ab1e, +0x27b61e18, +0x270027c0, +0x27ae1e10, +0x4127203c, +0xc407302b, +0x475ec35b, +0x204c27ff, +0x3e07402b, +0x343b9d07, +0x93ab905b, +0x27ff575e, +0x6a5e803c, +0x63f54eff, +0x07f005f1, +0x25f1150f, +0x45f335f2, +0xfe0a7ef4, +0xf1435107, +0xf54ef58e, +0xdf07f1e3, +0x4007d803, +0x0f075107, +0xf4051d07, +0xae7ef515, +0x27f431fc, +0x27449630, +0x350d0731, +0xfdde7ef3, +0xf1c35107, +0xf54ef58e, +0xc107f3e3, +0xb0071f07, +0x07101c03, +0x35f2250f, +0x05fc15f3, +0xfc7f7efb, +0xdc03df07, +0x030f0724, +0x7e1d0708, +0xf241fc71, +0x911622d0, +0x0912f0f1, +0xa1f45101, +0x5543cbf3, +0xc42400f4, +0x12ae1f22, +0x0c030f07, +0xfd8e7e10, +0xf3c35107, +0xf093f58e, +0x7effdc84, +0x5107fd80, +0xf58ef3c3, +0x00df14e0, +0x617f12c0, +0x81f4b1f1, +0xc1142bfc, +0xf16534f8, +0xf7c1fb71, +0x84c8ea30, +0x7d8cce00, +0x273d4c27, +0x00af2790, +0x27100000, +0xc5602750, +0xd50738f4, +0x4a07e607, +0xeaabd9ab, +0x8a1f4c33, +0x548ccec8, +0x6e075d07, +0xc86bb72b, +0x21532907, +0x4b0724ab, +0x471f4c53, +0xc114ab1c, +0x3a0738f4, +0x31534123, +0xf4c50b47, +0x07920738, +0x07b007a3, +0xbf4fd6c1, +0x3f6b3507, +0x3cc04027, +0xf5753880, +0x615ef685, +0x270f07ff, +0x100c0344, +0xe97ef445, +0xc35107fc, +0xcaf58ef3, +0xa91eb3b7, +0x07827bc2, +0x534c472b, +0x42ab1f2c, +0x11233b47, +0xc407b307, +0x6d5ef165, +0xc74fd6ff, +0x3d833507, +0x34ab0100, +0x07bc3fd6, +0xc641ab40, +0x3c27b54f, +0x0b402780, +0x07464b35, +0xff5ce353, +0xa31e6407, +0x0a5e0d07, +0x270f07ff, +0x27402730, +0x100c0320, +0xf485f375, +0xf65ef265, +0xe3f54efe, +0x03af07f5, +0xb00710ac, +0x0f07c107, +0xf3351a07, +0xfc15f225, +0x2a7efb05, +0x03df07fb, +0x0f0724dc, +0x1d070803, +0x41fb1c7e, +0x914290f4, +0x2632d0f3, +0x01f344e0, +0x01e334e0, +0x511842c4, +0x27f4a1f3, +0x27340e20, +0x550a0721, +0xfc367ef2, +0xf5c35107, +0x32c4f58e, +0xa1f35118, +0x0e2027f4, +0x07212734, +0x7ef2a50d, +0x5107fc1c, +0xf58ef5c3, +0x7130fbc1, +0x27a027f7, +0xc12b0760, +0x360734fc, +0x07071a07, +0xffeebbbe, +0x30275b07, +0xfbc5bc07, +0x50f3c54c, +0xc554f0c5, +0xf0c158f1, +0x50f1c14c, +0xf8813a07, +0x99be2707, +0xc027ffee, +0xa1079007, +0x36072507, +0x1c070807, +0xffee87be, +0xe107d007, +0xea4bd90b, +0xeaeab807, +0xaeee00fd, +0x102700f5, +0xc154f3c1, +0x910758f4, +0x930bad07, +0x7027a44b, +0xa4ea8027, +0xf4c100f9, +0x2c4aee58, +0x50f3c101, +0x074cf2c1, +0x071c070b, +0xee46bebe, +0x61f3b1ff, +0x0bc027f4, +0x27440343, +0x40f4c530, +0xa13cf3c5, +0x0bf351f4, +0x0bc14bb0, +0x2ec84bb7, +0xc5412734, +0xcfd03cf4, +0x20000000, +0x40fec13f, +0x1b074c07, +0x531f4c33, +0x072c0711, +0x5314ab0a, +0x1f0c3321, +0xb1d8e103, +0x07390715, +0x5331534a, +0x0730ab41, +0xa39307a4, +0x000000af, +0x07b10780, +0x002fd4c2, +0xc9200000, +0xd440fec5, +0x000000cf, +0xfec13110, +0x53490740, +0x2b071f4c, +0x14ab1a47, +0x471f2c53, +0x4742ab4c, +0x0709473b, +0x23c407b3, +0x59a0c8e1, +0xa1079007, +0x0000cfd0, +0xc5d71000, +0x3b0740fe, +0x40273f6b, +0x49803cc0, +0x43270f07, +0xc5380c03, +0xfcc544fb, +0x38f4c548, +0x07facb7e, +0x8ef5c351, +0x0b9de2f5, +0xc11027ff, +0xf4c154f3, +0x07910758, +0x4b930bad, +0x277027a4, +0x0b4ae281, +0x273127ff, +0x4b730b40, +0xff075e84, +0xb30731a3, +0xa11ec407, +0x07b64fd6, +0x003d833b, +0xd634ab01, +0x4907ab3f, +0x4fc64aab, +0x803c27a4, +0x3b0b4027, +0xb3074c4b, +0x07ffbce3, +0xe2921ec4, +0x1efed439, +0x3a42e4c1, +0x61f093fe, +0x265effd9, +0x1432e4fe, +0x55f093fe, +0x1a5effd9, +0xe3f54efe, +0x03af07f4, +0xc10710ac, +0x1a07b007, +0xf3350f07, +0xfc15f225, +0xcf07fb05, +0x03f8f47e, +0x0f0724cc, +0x1c070803, +0xa1f8e87e, +0xc32f07f4, +0x031c0741, +0x0a07382c, +0x2f7ef4a5, +0xfa127ef6, +0xf4c35107, +0xf54ef58e, +0xaf07f4e3, +0x0710ac03, +0x07b007c1, +0x350f071a, +0x15f225f3, +0x07fb05fc, +0xf8af7ecf, +0x0724cc03, +0x0708030f, +0xf8a37e1c, +0x1c072f07, +0x07382c03, +0xf5f07e0a, +0x07f9d37e, +0x8ef4c351, +0x63fb4ef5, +0x054327f1, +0x08b127f4, +0x36b02700, +0x05422707, +0x150f07f4, +0xf9b27efb, +0x41073007, +0x14070307, +0xfb8ef143, +0x4007bb36, +0xd0270407, +0x4c27c407, +0x35f4253c, +0xbefd45f0, +0x07000425, +0x1d1c0310, +0x23cf11c8, +0x2300c803, +0x403b4c07, +0x4c07f445, +0x3b3c3c27, +0x35312b41, +0x1ef325f4, +0x000fc0b5, +0x1a800000, +0x40134007, +0x4c27bf1e, +0x07412b20, +0x5b3d072c, +0xab313b24, +0x1ef34532, +0x273027d2, +0xe000004f, +0x4e961ec1, +0x07f3a3f5, +0x10dc03df, +0x51074007, +0x1d070f07, +0xc307f405, +0xf225f335, +0xbf07f515, +0x03f7e47e, +0x0f0724bc, +0x1b070803, +0x41f7d87e, +0x1042d0f4, +0x4290f491, +0x1b070d07, +0x83f4ac7e, +0x27f58ef3, +0x4ef91e01, +0x07f1e3f5, +0x071f0751, +0x07180340, +0x15f4050f, +0xf7ab7ef5, +0x4244f421, +0xf1c30027, +0x42d0f58e, +0x414440f8, +0xf140c8f4, +0x311f4c88, +0x274946f4, +0x0000000f, +0x8ef1c380, +0x3cec27f5, +0x4e07e42b, +0xc8204c23, +0xf2611c40, +0x045b0207, +0x4fc6f431, +0xc30013ca, +0x27f58ef1, +0xffffff0f, +0x8ef1c37f, +0x27f261f5, +0x4e2b204c, +0x343b3207, +0xf3514307, +0x0e5b0307, +0xd51e04ab, +0xf3a3f54e, +0x1f075107, +0x1c034007, +0x050f0710, +0x07b207f4, +0x25f335c3, +0x7ef515f2, +0x0f07f729, +0x08031f07, +0x7e241c03, +0xf441f71d, +0xf4914290, +0x42300027, +0xf58ef383, +0xf3830127, +0xf54ef58e, +0xdf07f3a3, +0x0710dc03, +0x07510740, +0x051d070f, +0x35c307f4, +0x15f225f3, +0x7ebf07f5, +0xbc03f6e9, +0x030f0724, +0x7e1b0708, +0xf441f6dd, +0x911042d0, +0x074290f4, +0x7e1b070d, +0xf383f3b1, +0x0127f58e, +0xf54ef91e, +0xdf07f3a3, +0x0710dc03, +0x07510740, +0x051d070f, +0x35c307f4, +0x15f225f3, +0x7ebf07f5, +0xbc03f6a5, +0x030f0724, +0x7e1b0708, +0xf441f699, +0x911042d0, +0x074290f4, +0x7e1b070d, +0xf383f36d, +0x0127f58e, +0xf54ef91e, +0xdf07f3a3, +0x0710dc03, +0x07510740, +0x051d070f, +0x35c307f4, +0x15f225f3, +0x7ebf07f5, +0xbc03f661, +0x030f0724, +0x7e1b0708, +0xf441f655, +0x911042d0, +0x074290f4, +0x7e1b070d, +0xf383f329, +0x00a7f58e, +0xf54ef91e, +0xdf07f3a3, +0x0710dc03, +0x07510740, +0x051d070f, +0x35c307f4, +0x15f225f3, +0x7ebf07f5, +0xbc03f61d, +0x030f0724, +0x7e1b0708, +0xf441f611, +0x911042d0, +0x074290f4, +0x7e1b070d, +0xf383f2e5, +0x00a7f58e, +0xf54ef91e, +0xdf07f3a3, +0x0710dc03, +0x07510740, +0x051d070f, +0x35c307f4, +0x15f225f3, +0x7ebf07f5, +0xbc03f5d9, +0x030f0724, +0x7e1b0708, +0xf441f5cd, +0x911042d0, +0x074290f4, +0x7e1b070d, +0xf383f2a1, +0x0127f58e, +0xf54ef91e, +0xa027f163, +0x8027b027, +0x06b69027, +0xf4054227, +0x40270f07, +0xd97ef415, +0x435107f6, +0x27f58ef1, +0x274327d0, +0xc0073c3c, +0xf325f405, +0xfd45f035, +0x000154be, +0x1c031007, +0x2c10c81d, +0x23d21fc6, +0x8200e803, +0x3b4c0700, +0x07f44540, +0x27413b4c, +0xf4353c3c, +0x0f07312b, +0xf3254027, +0x917ef415, +0x435107f6, +0x07f58ef1, +0x07e013e1, +0x200c230e, +0x70276027, +0x274200c8, +0x3bb40741, +0x072127b0, +0xa7ae3ba2, +0x0b40a730, +0x8b4b4b3a, +0xab4d8b3c, +0x2734c634, +0xc8702761, +0x8d074000, +0x9d07805b, +0x47079e5b, +0x073c2c27, +0x2b49ab36, +0x3538ab21, +0x25f445f3, +0xff5a5ef2, +0x27203c27, +0x073e2b41, +0x1eb35bb4, +0x204c27b9, +0x2c07412b, +0x245b3d07, +0x32ab313b, +0x745ef345, +0x204c27ff, +0x3d074e2b, +0x343b8c07, +0x83ab8e5b, +0xfe4eb51e, +0x100c0088, +0x21271013, +0x4e9efe0e, +0x00130000, +0x21271068, +0x000044be, +0xfe8e0013, +0xf31e1013, +0x00c8fd4e, +0xc8d02712, +0x20271410, +0x00002cbe, +0x0013d486, +0x0013fd8e, +0x10ccd127, +0x271013ee, +0x07d4d641, +0x27e41ed4, +0x1ed40740, +0x9e2127de, +0x27000009, +0x00039e20, +0xc2fe4e00, +0x10c83601, +0x27412733, +0x1147203c, +0x01c24447, +0x07f3f021, +0x26e63027, +0x10ccfe8e, +0x2a3027ee, +0xab012b01, +0x53415334, +0xb642d611, +0x8e030721, +0x274066fe, +0x27e91e30, +0x1e302741, +0x000ed4e3, +0xd4170100, +0x3a01000d, +0x035b3027, +0x662400f9, +0x4c270005, +0x0b041b20, +0x000fb0fe, +0x27010000, +0x035b183c, +0x662400f9, +0x48270005, +0xfe0b041b, +0x07104c27, +0xf9035b34, +0x05662400, +0x0b041b00, +0x5b3827fe, +0x2400f903, +0x27000566, +0x041b184c, +0x0000fe0b, +0x00000000, +0x0001b35a, +0x0001b35f, +0x0001b367, +0x0001b36f, +0x0001b375, +0x0001b37c, +0x0001b387, +0x0001b390, +0x0001b399, +0x0001b39d, +0x0001b3a3, +0x0001b3ad, +0x0001b3b5, +0x0001b3c3, +0x0001b3d0, +0x0001b3d7, +0x0001b3e3, +0x0001b3ed, +0x0001b3f8, +0x0001b35a, +0x0001b403, +0x0001b40b, +0x0001b413, +0x0001b437, +0x0001b417, +0x0001b367, +0x0001b420, +0x0001b42a, +0x0001b434, +0x0001b43e, +0x0001b448, +0x0001b450, +0x0001b459, +0x0001b45f, +0x0001b466, +0x0001b46c, +0x0001b477, +0x0001b481, +0x0001b35a, +0x0001b403, +0x0001b487, +0x0001b490, +0x0001b499, +0x0001b49d, +0x0001b4a4, +0x0001b4ac, +0x0001b4b6, +0x0001b4bd, +0x0001b4c5, +0x0001b4d0, +0x0001b4d4, +0x0001b4dc, +0x0001b4e6, +0x0001b4ef, +0x0001b4f4, +0x0001b4fc, +0x0001b508, +0x0001b50e, +0x0001b519, +0x0001b523, +0x0001b52b, +0x0001b35a, +0x0001b403, +0x0001b53a, +0x0001b544, +0x0001b54f, +0x0001b55c, +0x0001b563, +0x0001b566, +0x0001b56d, +0x0001b573, +0x0001b57d, +0x0001b586, +0x0001b58d, +0x0001b594, +0x0001b523, +0x0001b35a, +0x0001b403, +0x0001b59c, +0x0001b5a7, +0x0001b5af, +0x0001b437, +0x0001b5b3, +0x0001b5c1, +0x0001b5c9, +0x0001b5d4, +0x0001b3fd, +0x0001b5dd, +0x0001b5e9, +0x0001b5f4, +0x0001b5fe, +0x0001b609, +0x0001b610, +0x0001b61e, +0x0001b62d, +0x0001b35a, +0x0001b632, +0x0001b637, +0x0001b641, +0x0001b645, +0x0001b64d, +0x0001b655, +0x0001b65f, +0x0001b430, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +0x00000000, +}; +const int fw_h264enc_size = 361472; diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/fw_hevcdec.c b/src/little/linux/drivers/media/platform/canaan-vpu/fw_hevcdec.c new file mode 100755 index 000000000..cd1ebf93c --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/fw_hevcdec.c @@ -0,0 +1,54851 @@ +const unsigned int fw_hevcdec[] __attribute__((aligned(0x1000))) = { + 0x0000eb5e, + 0x02020305, + 0x33363635, + 0x32303137, + 0x43564548, + 0x63654420, + 0x7265646f, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x43564548, + 0x20434544, + 0x33346332, + 0x31643430, + 0x30703172, + 0x6530302d, + 0x00306361, + 0x00000000, + 0x00035900, + 0x00037000, + 0x0000001e, + 0x3ee77fff, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00050000, + 0x00004390, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x01a70d27, + 0x6ea7f07b, + 0x53fdcfff, + 0x530207f0, + 0xa50183f1, + 0x27609561, + 0x25601501, + 0x15002760, + 0x9b602560, + 0x6ea70ef0, + 0x01fd4fff, + 0x33110361, + 0xc512a314, + 0x60c13861, + 0xf810ce38, + 0xffff1ea7, + 0x213127ff, + 0x99240714, + 0x6c402416, + 0x27659680, + 0x169d806c, + 0x27612724, + 0x0e210330, + 0x07202762, + 0x19520b51, + 0xce0b6650, + 0x3826f042, + 0x139d3327, + 0xbd31270d, + 0x27063a13, + 0x0ef09b00, + 0xa70f1099, + 0xfd4fff6e, + 0x600b0233, + 0x274063c5, + 0x0ef39b30, + 0x4fff6ea7, + 0x3863c5fd, + 0x10000d27, + 0x871ef0e8, + 0x01271225, + 0x1399501d, + 0x0353070c, + 0x0c139d31, + 0x2c333207, + 0x04f29b18, + 0x0ea721a3, + 0x05feffff, + 0x9b202702, + 0x03150ef2, + 0x2708059d, + 0x9302000d, + 0x046dc3f1, + 0x04002d27, + 0x0706f09b, + 0x35f193f1, + 0x10010446, + 0x01270b36, + 0xf0931005, + 0x930360a8, + 0x035e23f3, + 0x011e03c2, + 0x803c0331, + 0x93f930ca, + 0x035e13f3, + 0x548ef293, + 0x03210103, + 0x03310524, + 0xf630ca34, + 0x00024ebe, + 0xf09b0027, + 0x0276be0b, + 0x27012700, + 0x06f09b10, + 0xfd1eff8b, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x01a70d27, + 0x6ea7f07b, + 0x93feffff, + 0x000a93f1, + 0x937f1ce3, + 0x000e1bf2, + 0x05b66001, + 0x9bfa21d2, + 0x1c030ff1, + 0xe3f21e80, + 0x04f09b01, + 0x02000d27, + 0xb24ef193, + 0x022d2704, + 0x06f09b40, + 0x61bef107, + 0xff8b000a, + 0x0000fd1e, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x01a70d27, + 0x6ea7f07b, + 0x93feffff, + 0x00020cf1, + 0x937f1ce3, + 0x000a0bf2, + 0x05b66001, + 0x9bfa21d2, + 0x1c030ff1, + 0xe3f21e80, + 0x04f09b01, + 0x02000d27, + 0x7ccef193, + 0x012d2704, + 0x06f09b40, + 0xf1bef107, + 0xff8b0001, + 0x0000fd1e, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x01a70d27, + 0x6ea7f07b, + 0x93feffff, + 0x000d23f1, + 0x937f1ce3, + 0x000f96f2, + 0x05b66001, + 0x9bfa21d2, + 0x1c030ff1, + 0xe3f21e80, + 0x04f09b01, + 0x02000d27, + 0xbccef193, + 0x032d2704, + 0x06f09b40, + 0xf1bef107, + 0xff8b000c, + 0x0000fd1e, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x01a70d27, + 0x6ea7f07b, + 0x93feffff, + 0x000f1ef1, + 0x937f1ce3, + 0x001024f2, + 0x05b66001, + 0x9bfa21d2, + 0x1c030ff1, + 0xe3f21e80, + 0x04f09b01, + 0x02000d27, + 0xd64ef193, + 0x042d2704, + 0x06f09b40, + 0xecbef107, + 0xff8b000e, + 0xf09bfd1e, + 0x07fe0b06, + 0x4efe0b0f, + 0x25fd93f5, + 0xd0010000, + 0xf08b0506, + 0xf71ed403, + 0xf54ef58e, + 0x0016fd93, + 0x06d00100, + 0x03f08b05, + 0x8ef71ed4, + 0x000000f5, + 0x00000000, + 0x00000000, + 0xf4abfa4e, + 0x35faf493, + 0xa7f41b01, + 0xfd9fff3e, + 0x04024d27, + 0x34153425, + 0x001145be, + 0xffff0ea7, + 0xff1ea7ff, + 0x031efd4f, + 0x0499f2e8, + 0x2713010e, + 0xd8437b26, + 0xaea7f341, + 0x11feffff, + 0x3834f9a3, + 0xe3ff000a, + 0x3834fd41, + 0xa7ff000a, + 0xfdcfffbe, + 0xf093c127, + 0x27035dac, + 0x68bcc510, + 0x0011e1be, + 0xfcebf4ab, + 0x000f82be, + 0x0027f4ab, + 0x0011bfbe, + 0xf49b4027, + 0x0ef49b0b, + 0xa3bd3227, + 0xbcc50d94, + 0x0ef49b40, + 0x9fff3ea7, + 0x68bcc5fd, + 0x40273415, + 0x070ef49b, + 0x1eff8b00, + 0x000000f6, + 0x000492b8, + 0x000492d0, + 0x00100000, + 0x00049170, + 0x00049238, + 0xf0e3f54e, + 0x394af493, + 0x27f41b01, + 0x274ea730, + 0x4305fefd, + 0x2ea74315, + 0x05fefd1f, + 0xa7231523, + 0xfef9974e, + 0x43154305, + 0xf98f2ea7, + 0x152305fe, + 0xff1ea723, + 0x4e27ebff, + 0x15c00000, + 0xa12d2714, + 0x5c12c580, + 0xffff0ea7, + 0x0c4f27e7, + 0x05800000, + 0x332ea704, + 0x2325fefd, + 0x0ac5a127, + 0x71f49350, + 0xf193047a, + 0x93047bbc, + 0x047bbffe, + 0x7bc2fc93, + 0xc5fb9304, + 0x4315047b, + 0xe3151315, + 0xb315c315, + 0x23152305, + 0x13054305, + 0xc305e305, + 0xf39bb305, + 0xff2ea70e, + 0xf493fdcf, + 0xb5fffdb8, + 0x352a3524, + 0x2df49323, + 0x24c5fffe, + 0x452a4530, + 0xff4ea723, + 0x4a15efff, + 0x8fff2ea7, + 0x254227fd, + 0x21241524, + 0x7df69323, + 0x3da3047b, + 0x23252800, + 0x18272411, + 0x28004da3, + 0xf3932415, + 0xa7047d48, + 0xf7ffff4e, + 0xc54041c5, + 0xf313bc63, + 0x7f3ce3fe, + 0x0ea73103, + 0xd1feffff, + 0x27014804, + 0x1143c026, + 0x1d203ff4, + 0x05eb0000, + 0x030ff39b, + 0xe81e803c, + 0x01d13027, + 0x63bd0148, + 0x03ad0151, + 0x20a70142, + 0x64bd4027, + 0x62d5014c, + 0x63bd0158, + 0x62d5014d, + 0x63bd0154, + 0x63ad0152, + 0x63bd014e, + 0x13c00150, + 0xff2ea711, + 0x4627feff, + 0x23d1f4e8, + 0x33c40148, + 0xf5f293f6, + 0x4ea7047a, + 0x07ffffff, + 0x2843d112, + 0x971c0306, + 0x014863d5, + 0xe37f1ce3, + 0x24197f2c, + 0xc2802c03, + 0xf393f921, + 0x27047ad0, + 0x264c2720, + 0x34033205, + 0x4ea7f4c8, + 0x65fef29b, + 0x27f3ab64, + 0x93f4eb41, + 0x04753ff2, + 0x7dddf393, + 0x7f2ce304, + 0x157f3ce3, + 0xa7f325f2, + 0xffffff1e, + 0x0a4414d1, + 0x05304fe6, + 0x8fff2ea7, + 0xa32411fd, + 0x2415104c, + 0x27bc6cc1, + 0x27c41d40, + 0x25f453b2, + 0x074001fe, + 0x3a9bbe1c, + 0x4c64b900, + 0x1b4ff601, + 0x93b19605, + 0x047a63f3, + 0x27bc32c1, + 0x60249911, + 0x012c23d1, + 0x10274496, + 0xfc0e1c33, + 0x0549403c, + 0x23892481, + 0x8541ab28, + 0xe0920724, + 0x1105bf31, + 0x213419f3, + 0x803c03f4, + 0x27f734c2, + 0xaf1ea7c0, + 0x1c05fdeb, + 0x00003f27, + 0x13150e03, + 0xf19320a7, + 0x8d0478b4, + 0x92c11412, + 0x8d40a758, + 0x1c15ec14, + 0x013414d5, + 0x013814d5, + 0x013c14d5, + 0x014014d5, + 0x8d5c148d, + 0x1205a414, + 0xfc9b1925, + 0xa73ea70e, + 0x3c05fdeb, + 0x00004f27, + 0x34150e83, + 0x030efc9b, + 0x273c0538, + 0x0300004f, + 0x9b34150f, + 0x38030efc, + 0x4f273c05, + 0x0f830000, + 0xfc9b3415, + 0x873ea70e, + 0x3c05fdeb, + 0x00004f27, + 0x34151302, + 0x010efc9b, + 0x1f4ea713, + 0x4305fde6, + 0x07602c27, + 0x03421519, + 0x3ea7641c, + 0x35fde60f, + 0x244c274c, + 0x32153405, + 0x3c350027, + 0x02e472be, + 0x93729489, + 0x047817f3, + 0x9910348d, + 0x91899893, + 0x74908972, + 0x3b629499, + 0x93033b13, + 0x041e83f2, + 0x4ce0e027, + 0x2704daff, + 0x9d433b41, + 0x245d0424, + 0x9399231d, + 0x2b245994, + 0x7d412b13, + 0x96939924, + 0x2b042499, + 0x2b2e3d03, + 0x9d233940, + 0x3fe60524, + 0x3f27048e, + 0xc400069a, + 0x028a4f27, + 0xf193c700, + 0x35041e40, + 0x93132514, + 0x0477b3f2, + 0x016493c1, + 0xbc65c124, + 0x2435430b, + 0x276e5399, + 0xe0f40540, + 0x9904773a, + 0x30279a54, + 0x31274496, + 0x78f2f293, + 0xa2239d04, + 0x27ce9499, + 0x93433b10, + 0x0478e3f3, + 0x27a3349d, + 0xd9f49320, + 0x30270478, + 0x9da6439d, + 0x42c5a141, + 0xa4418dac, + 0x99a842c5, + 0x5399a254, + 0xcd4fe6a1, + 0x404c2703, + 0xfc62f153, + 0x4f004f03, + 0x10010001, + 0x015c64d5, + 0xbec497c1, + 0x2702e7b1, + 0xff4ea731, + 0xf253f7ff, + 0x43c5fc48, + 0x2724014c, + 0x2027103c, + 0x44034205, + 0xb027f3c8, + 0xdc27a027, + 0x3b412711, + 0xe6478b4a, + 0x47008a4f, + 0x0b4e07ea, + 0xd0419949, + 0x81038e07, + 0x3aff1ce0, + 0x07310703, + 0x33333341, + 0xf1432b45, + 0x0001984c, + 0x0b4807ff, + 0xd0429949, + 0x15ff2ce0, + 0x07320703, + 0x33333342, + 0xf1432b45, + 0x00019040, + 0x9a9499ff, + 0xcee04616, + 0x0b100000, + 0x000ee003, + 0x030b1000, + 0x012c94d1, + 0x04004ddc, + 0x074b872f, + 0x804cf53b, + 0x03ff0a3f, + 0xd0ebfd31, + 0xfd000492, + 0x049310b1, + 0xf5438700, + 0x0a3f8040, + 0x1032fdff, + 0xfd000493, + 0x0492d083, + 0x03b20300, + 0x6afdf8a1, + 0x6b4b07ff, + 0x5264bd4f, + 0x93479601, + 0x0477dbf1, + 0x015c13d1, + 0xffff4ea7, + 0x8043e5f7, + 0x43e5023f, + 0x03023f84, + 0x20bcd4b2, + 0x203c2717, + 0x00002e27, + 0x873b2b10, + 0x8042f54b, + 0x03ff0a3f, + 0x53f398b1, + 0x01fb53f1, + 0xd540a710, + 0xd5015864, + 0xbe015464, + 0xa702e4d2, + 0xf7ffff2e, + 0x08e34d27, + 0x35989399, + 0x94548924, + 0x648d3347, + 0x514d279c, + 0x89244504, + 0x61c19652, + 0x8d3823bc, + 0x41279e62, + 0x12c1433b, + 0xfdf393a0, + 0x34050475, + 0xff002efc, + 0x27029bff, + 0x27302700, + 0x98949910, + 0x23bc62c1, + 0x33438343, + 0x4da31a4c, + 0x40ab0210, + 0x43ab41ab, + 0x64c53127, + 0xac63c5a8, + 0x99a22499, + 0x4383a12d, + 0xd433d383, + 0x90994833, + 0xa3d4ab98, + 0x9006e0db, + 0xe0b12702, + 0x0301de05, + 0xff2ea7b2, + 0x2321efff, + 0x3dcb2431, + 0x43ab4bcb, + 0x24a14a86, + 0x00004fdc, + 0x07214000, + 0xa1f453c2, + 0x274001fa, + 0x27c40541, + 0xa7be1a1c, + 0x402702e4, + 0xc3a1c405, + 0x00003fd8, + 0xa7e34000, + 0xefffff4e, + 0x4b354d25, + 0xefff3ea7, + 0xd54327fd, + 0xc1027034, + 0x48dc7034, + 0xff2ea7fb, + 0x24c1fdef, + 0x004ddc70, + 0x4427f908, + 0x027024d5, + 0x027424d5, + 0x23d53027, + 0x2ea70660, + 0x05fdeb8f, + 0x004f2723, + 0x1512c200, + 0x0ef39b24, + 0xe62f2ea7, + 0x184c27fd, + 0x23152405, + 0x00004f27, + 0x24352000, + 0xe66c5399, + 0x8901633f, + 0x4fe6a854, + 0x4127015c, + 0x9db9649d, + 0x649da164, + 0xbc63c1b8, + 0x83283489, + 0xc680004d, + 0x4434c145, + 0x812841dc, + 0xc04cdc34, + 0x49f19322, + 0x14990476, + 0xae4fe6a2, + 0x1f1c2701, + 0x99a36499, + 0x2107a663, + 0x138b248b, + 0x9da3629d, + 0x62b9a661, + 0x2fe60152, + 0xf293013f, + 0xb9047620, + 0x0701a024, + 0x33353334, + 0xe9342b43, + 0x00019c34, + 0x9c248dff, + 0x019e31e9, + 0x218dff00, + 0xa031e99e, + 0xc1ff0001, + 0x3489bc63, + 0x004d8328, + 0xc1456680, + 0x42384434, + 0x17e31703, + 0x2ff6f201, + 0xd12700da, + 0x00d411e0, + 0xf98ef353, + 0xfcbe3001, + 0xf4530034, + 0x4201f988, + 0x04271027, + 0xe02730a7, + 0x3027230d, + 0x8d17219d, + 0x219d1221, + 0x18239d16, + 0x8d102e8d, + 0x1103142e, + 0xf0202c03, + 0x4d07dff0, + 0x648d4013, + 0x46f401f8, + 0x95f19345, + 0x1e9d0475, + 0x45f253fe, + 0xbe2001f9, + 0xa702e798, + 0xf7ffff3e, + 0x4cf83401, + 0x53010820, + 0x01f923f4, + 0xe47fbe40, + 0xff1ea702, + 0x14d1ffff, + 0x4ff60a44, + 0x3ea7fad4, + 0x11fd8fff, + 0x104ce334, + 0xd15e3415, + 0x5ef2e8fa, + 0xf153fa03, + 0x1001f8f8, + 0x95be1c07, + 0xb00702e4, + 0xfac3bff6, + 0x27fad65e, + 0xfe215eb0, + 0xf8e6f353, + 0xf65e3001, + 0xddf253fc, + 0x5e2c01f8, + 0xc007fcd1, + 0xf95e1207, + 0x070c07fc, + 0xfcf25e21, + 0x649d4027, + 0xa1649db9, + 0x5eb8649d, + 0xd027fea5, + 0x81ff2b5e, + 0xa3020724, + 0x8540004d, + 0x2d35be24, + 0xfa555e00, + 0x34964127, + 0x46334027, + 0x27fc2f5e, + 0xf393104c, + 0x930474e0, + 0x0474dbf1, + 0x279e348d, + 0xa3139d30, + 0x129d3027, + 0xa4138da6, + 0x279c148d, + 0xfec95e11, + 0x99a21499, + 0x1227a113, + 0x3213142b, + 0x17833783, + 0x33143c33, + 0x0e27171c, + 0x5e040000, + 0x3f27fd51, + 0xe4000100, + 0x01004f27, + 0x735ee700, + 0x0f1c27fb, + 0x27fe535e, + 0xfd775eb0, + 0xf1051127, + 0x27fb865e, + 0xfb255ee1, + 0xa9be0207, + 0xd85e002d, + 0x27d307f9, + 0xf35328cc, + 0x3001f818, + 0xc50d1c27, + 0x1fbe40dc, + 0x482702e2, + 0x0140d4c5, + 0x203cfcd3, + 0xe31efedb, + 0xf493fb4e, + 0x1b01337c, + 0xff3ea7f4, + 0x3499ffff, + 0x99469611, + 0x45f61234, + 0xe8d2f493, + 0xd6441904, + 0xfd68be44, + 0x0f3c2700, + 0xbfff4ea7, + 0x274335fd, + 0x4ea75f3c, + 0xc5fd4fff, + 0x3c273443, + 0xff4ea7b6, + 0x43d5fdef, + 0x7ebe0f04, + 0x3ea70103, + 0x27fd7fff, + 0x80000a4e, + 0x42273415, + 0x62be3425, + 0x3ea70082, + 0x99ffffff, + 0x44c61134, + 0x231eb027, + 0x27123499, + 0x274486b1, + 0x93b726b0, + 0x04e873f4, + 0x46064419, + 0x3c243499, + 0x29be7f4c, + 0x34be0039, + 0x2ea70039, + 0x99ffffff, + 0xcea71124, + 0x03feffff, + 0x11249d41, + 0xc4d54327, + 0x1ea70148, + 0x01fd4fff, + 0x07d12714, + 0x07343b3d, + 0x0e239943, + 0x34ab4f6b, + 0xc50e239d, + 0x40273c14, + 0x270ef49b, + 0x3ae4be01, + 0x99c0bd00, + 0x300cd80d, + 0x100c3814, + 0xcfff4ea7, + 0x644dc5fd, + 0xcfff4ea7, + 0x604dc5fd, + 0x4ea7bf86, + 0xd1ffffff, + 0x060a4441, + 0xff2ea718, + 0x2441fdaf, + 0x7fff3ea7, + 0x05410bfd, + 0xe3342124, + 0x3425104c, + 0x4ca33411, + 0x93341510, + 0x04e7d7fc, + 0xb1bec019, + 0xc419003d, + 0x0d274816, + 0x71be0d78, + 0xf493003c, + 0x0504e7b8, + 0x000d2740, + 0x3c62be04, + 0xadf49300, + 0x400504e7, + 0x006f1cbe, + 0xf49b4027, + 0xffbea70e, + 0x3ea7feff, + 0xb9fd4fff, + 0xc50140b2, + 0x25c63834, + 0x0d99b0b9, + 0x01830453, + 0x006f2ebe, + 0xffeb0ea7, + 0x0110beff, + 0x3927be01, + 0xeb0ea700, + 0xe0beffff, + 0x62be0100, + 0xf4ab0080, + 0xfcebc127, + 0x7fffdea7, + 0xf264befd, + 0x83d41102, + 0xd415184c, + 0x00804abe, + 0x0101f0be, + 0x0141b4b9, + 0x4ea74526, + 0x45d07fff, + 0x36f4934c, + 0x441904a6, + 0x01274726, + 0x0036efbe, + 0xc7befcab, + 0xd411003d, + 0x00004ee3, + 0xebd41504, + 0x27f1abfc, + 0xc0041e20, + 0x24f92122, + 0xff010d94, + 0x872142d0, + 0x0044f142, + 0xd8ff0230, + 0x42071644, + 0x41033527, + 0x4610322b, + 0x21033127, + 0x27d9f3f0, + 0x27031e41, + 0x56f1eb40, + 0xa731274d, + 0xfdcfff4e, + 0xab6043c5, + 0x1e2027f1, + 0x2122c004, + 0x0d9424f9, + 0x42d0ff01, + 0xf1428721, + 0x02300044, + 0x1644d8ff, + 0x35274207, + 0x322b4103, + 0x31274610, + 0xf3f02103, + 0x1e4127d9, + 0xeb402703, + 0x274516f1, + 0x1ef4e843, + 0x2119bec3, + 0xffbea703, + 0xdea7ffff, + 0x1efd4fff, + 0x0ef39b0b, + 0xbe38d3c5, + 0x61032103, + 0x563027b4, + 0xff4ea742, + 0x4201fd4f, + 0x990eb399, + 0x412711be, + 0x34eb423b, + 0xb39de123, + 0x11be9d0e, + 0xffff2ea7, + 0x092499fe, + 0x34074383, + 0x44873433, + 0x34f9342b, + 0xff000050, + 0x34f9c407, + 0xff00004f, + 0x34fd4123, + 0xff00004f, + 0x2399ebd6, + 0x44b49909, + 0x4f4b432b, + 0x863041c8, + 0x28b4d1c5, + 0x25bc9d06, + 0x9340b4c5, + 0x04e617f4, + 0x40274101, + 0xffff0ea7, + 0x12be9dff, + 0x9d0cb49d, + 0xf1be2ab4, + 0x0c070035, + 0x0069c5be, + 0xcea7171e, + 0x99ffffff, + 0x0ea70ec1, + 0xbefff9cd, + 0x2701029b, + 0x12c49d41, + 0xa4dff493, + 0x06441904, + 0xff1ea74d, + 0x1251ffff, + 0x302723d6, + 0xa4cbf493, + 0x27431d04, + 0x0bf49b40, + 0xa70ef49b, + 0xfd4fff3e, + 0x9d10129d, + 0x33010f12, + 0x270ef49b, + 0x0e149921, + 0x24cb233b, + 0x4fbf3ea7, + 0x272138fd, + 0x53340541, + 0x86340321, + 0x27f31e25, + 0x0bf49b40, + 0xa70ef49b, + 0xfeffff3e, + 0x4c273211, + 0x7834bd10, + 0xfd40270d, + 0x00000024, + 0x9b4027ff, + 0x4ea70ef4, + 0x99ffffff, + 0x44d61244, + 0x00363ebe, + 0x4ea73127, + 0xc5fd4fff, + 0xff1e3043, + 0xf493fb4e, + 0x1b015294, + 0xff2ea7f4, + 0x4d27fd6f, + 0x24256002, + 0x40023d27, + 0x40272315, + 0xeb572ea7, + 0x272405fd, + 0x8300003f, + 0x93231510, + 0x04afc3f1, + 0xaf9ef093, + 0xa1fe9304, + 0xfc9304af, + 0x9304afa4, + 0x04afa7fb, + 0x04151415, + 0xc415e415, + 0x1405b415, + 0xe4050405, + 0xb405c405, + 0x030ef49b, + 0x27240528, + 0x0400003f, + 0x9b23150c, + 0x1ea70ef4, + 0x27fde54f, + 0x13051f3c, + 0x0f271415, + 0xa0000000, + 0x2ea71035, + 0x03fde53f, + 0x15230531, + 0x7f1ea724, + 0x2035fdeb, + 0x3f271405, + 0x13420000, + 0xf49b1315, + 0xadfe930e, + 0x3e0704af, + 0x0797ec03, + 0x7f3ce32e, + 0x237f2ce3, + 0x341997ec, + 0xc2803c03, + 0x2c27f932, + 0x8df39326, + 0x102704af, + 0x31054207, + 0x34032123, + 0x4ea7f4b8, + 0x55fef283, + 0x27f3abe4, + 0xa7f4eb41, + 0xebffff3e, + 0x43273235, + 0xefff2ea7, + 0x8824d5fd, + 0x8824c102, + 0xa7fb48dc, + 0xfdefff1e, + 0xdc8814c1, + 0xf908004d, + 0x14d54427, + 0x14d50288, + 0x3027028c, + 0x06a013d5, + 0xeb772ea7, + 0x272305fd, + 0x0400004f, + 0x9b24150b, + 0x2ea70ef3, + 0x27fde5cf, + 0x2405284c, + 0x4f272315, + 0x20000000, + 0x24353327, + 0x029013d5, + 0xefff3ea7, + 0x9034c1fd, + 0xa7fb48dc, + 0xfdefff1e, + 0xdc9014c1, + 0xf908004d, + 0x14d54427, + 0x14d50290, + 0x30270294, + 0x06a413d5, + 0xeb6f2ea7, + 0x272305fd, + 0x0300004f, + 0x9b241510, + 0x2ea70ef3, + 0x27fde5af, + 0x2405294c, + 0x4f272315, + 0x20000000, + 0x24353327, + 0x029813d5, + 0xefff3ea7, + 0x9834c1fd, + 0xa7fb48dc, + 0xfdefff1e, + 0xdc9814c1, + 0xf908004d, + 0x14d54427, + 0x14d50298, + 0x3027029c, + 0x06a813d5, + 0xeb672ea7, + 0x272305fd, + 0x8200004f, + 0x9b241513, + 0x2ea70ef3, + 0x27fde58f, + 0x24052a4c, + 0x4f272315, + 0x20000000, + 0x24353327, + 0x02a013d5, + 0xefff3ea7, + 0xa034c1fd, + 0xa7fb48dc, + 0xfdefff2e, + 0xdca024c1, + 0xf908004d, + 0x23d53427, + 0x23d502a0, + 0x402702a4, + 0x06ac24d5, + 0xeb5f2ea7, + 0x272405fd, + 0xc200003f, + 0x9b231513, + 0x1ea70ef4, + 0x27fde56f, + 0x13052b3c, + 0x3f271415, + 0x20000000, + 0xf2931335, + 0x2704b064, + 0x11f09330, + 0xe48d04ae, + 0x9024c5e8, + 0x45f6e38d, + 0xc5243524, + 0x24c53c24, + 0x6824c538, + 0xc56424c5, + 0xe48d9424, + 0xc0e48df4, + 0x8dc2e48d, + 0xe48dc4e4, + 0xc8e48dc6, + 0x8de0e48d, + 0xe48de2e4, + 0x9efb0ee4, + 0x4e032078, + 0x93f6a3fd, + 0x015127f4, + 0x3ea7f41b, + 0x27fd5fff, + 0x9382024d, + 0x04c74ffd, + 0x2d073425, + 0x1597dc03, + 0xe33d0734, + 0x3ce37f2c, + 0x97dc237f, + 0x2c032419, + 0xf923c280, + 0x9326ec27, + 0x04c72bf3, + 0x4e072027, + 0xe1233205, + 0xf4b83403, + 0x01043d27, + 0xbf3f4ea7, + 0xa74325fd, + 0xfdeb372e, + 0x4f272e05, + 0x14020000, + 0xf1932415, + 0xa704c6f0, + 0xfef2773e, + 0x1e15d355, + 0x40271e05, + 0xab0ef49b, + 0xeb2127f3, + 0xff4ea7f2, + 0x4ec5fddf, + 0xc84ec5c4, + 0x20003d27, + 0xd5cc43c5, + 0x27015c42, + 0x18d4ad40, + 0xa74f0701, + 0xe7ffff3e, + 0x35204c03, + 0x50d4d53e, + 0x07302701, + 0xb5f0934f, + 0xd39d04c6, + 0xcade8db1, + 0x0154d4d5, + 0x02d8ded5, + 0x0358ded5, + 0x011adead, + 0x011cdead, + 0x011edead, + 0x0120dead, + 0x0140dead, + 0x0142dead, + 0x0144dead, + 0x0148dead, + 0x8dbcde8d, + 0xde8dbade, + 0xb4de8db2, + 0x8db6de8d, + 0xde8db8de, + 0xc0de8dbe, + 0x8dc2de8d, + 0xde8dc4de, + 0x359fbec8, + 0x8ef68303, + 0x4eff1efd, + 0xff4ea7fc, + 0x4d01fd9f, + 0xd2d8c007, + 0x7788be12, + 0xff3ea701, + 0x4027fdcf, + 0xc54034c5, + 0xdc586034, + 0x0e0c0710, + 0x08679efc, + 0x4efc8e00, + 0xffaea7fa, + 0xbea7ffff, + 0xa7fd9fff, + 0xfeffffde, + 0xcfffcea7, + 0x44a4d1fd, + 0x1145260a, + 0x104ca3b4, + 0xb411061e, + 0x15104ce3, + 0x99d4b9b4, + 0x104c3c0d, + 0x331e0027, + 0x0148d4d1, + 0x992042c4, + 0xd31109d4, + 0x24874383, + 0x422b4433, + 0x33f13387, + 0xff000d48, + 0x005444f1, + 0x43e2ff00, + 0x45be0096, + 0x41270166, + 0x40270496, + 0xd4110407, + 0x0a3844f9, + 0x4f4bff00, + 0xd4b9423c, + 0x4c3c0d99, + 0x99d4b910, + 0x204cd80d, + 0x09d49914, + 0x34874383, + 0x432b4433, + 0x005044f9, + 0x4f96ff00, + 0xff7f0ff6, + 0x34f9d311, + 0xff000a38, + 0x34fd41a3, + 0xff000a38, + 0xc2c52127, + 0x40c2c568, + 0x4127f1ab, + 0x0d94d4bd, + 0xf39b3027, + 0x68c2c50e, + 0x070ef39b, + 0x27ff8b00, + 0x94d4bd40, + 0x0ef39b0d, + 0xc0c5f1eb, + 0xc5d31140, + 0x34f960c0, + 0xff000a38, + 0x34fd41e3, + 0xff000a38, + 0x5e68c2c5, + 0xfa8eff29, + 0xa007f94e, + 0xc207b107, + 0x1e409c27, + 0x10dc071c, + 0xd90741cc, + 0x83be1d07, + 0x0a070164, + 0x65be1d07, + 0xcd2b0164, + 0xad0bbd0b, + 0xc0760b07, + 0x4007f98e, + 0x03334533, + 0x40f9402b, + 0xff00018c, + 0x330f0c83, + 0x7e0e2303, + 0x299effff, + 0xf293031b, + 0xa7034ce0, + 0xfefeb33e, + 0x01304c27, + 0x05340331, + 0xa8240321, + 0x9b4027f4, + 0xfe0b0ef4, + 0xfeb32ea7, + 0xbdf393fe, + 0x4c27034c, + 0x03310130, + 0x03210534, + 0x27f4a824, + 0x0ef49b40, + 0x3ea7fe0b, + 0x27fdebff, + 0x27340540, + 0x0200004f, + 0x27341512, + 0x0ef49b40, + 0xf84efe0b, + 0xebffbea7, + 0x278007fd, + 0x070027c0, + 0x009f27a1, + 0xbe120200, + 0x0501644f, + 0x27b915bc, + 0x0ef49b40, + 0xe7ff3ea7, + 0x054427fd, + 0xa73a1534, + 0xfde7ef4e, + 0x48053c35, + 0x00274a15, + 0x28be4c35, + 0xbc050164, + 0x4027b915, + 0x8e0ef49b, + 0x0b0027f8, + 0xa7fd4efe, + 0xfeffff4e, + 0xa7094499, + 0xffffff1e, + 0x41034383, + 0x12d13487, + 0x44330620, + 0x43f1432b, + 0xff000048, + 0x402724c6, + 0x14d10d1e, + 0x2127062c, + 0x2027430a, + 0xd4074207, + 0xfeabdf6b, + 0x25273027, + 0x32c0151e, + 0x9434f912, + 0xa6ff010d, + 0x0014f146, + 0xd8ff0230, + 0x31030b44, + 0xf2281387, + 0x031e0127, + 0x0d8b0027, + 0xfd8efeeb, + 0x0f6bfe4e, + 0xdabe0596, + 0xfe0e0019, + 0x0014a19e, + 0xfd4efe8e, + 0xd0070419, + 0x45c61f6b, + 0x54be18d6, + 0xfd0e0015, + 0x001a439e, + 0xf39316d6, + 0x930163ec, + 0x0458a7f4, + 0x1dbe4305, + 0x0cbe0009, + 0x41270013, + 0xfd8ed41d, + 0xd107fd4e, + 0x26563f6b, + 0x8bbe3ba6, + 0x13be0012, + 0x0127001a, + 0x2a1e4027, + 0x192b22c4, + 0x204f4b04, + 0x8e002742, + 0x19a2befd, + 0x45f49300, + 0x40c50459, + 0xa1f393ec, + 0xf4930163, + 0x0504585c, + 0x27012743, + 0x8ed41d42, + 0x8e0027fd, + 0x93fc4efd, + 0x045923f4, + 0x43294e69, + 0xf2a7dea7, + 0x994209fe, + 0xe30b08d1, + 0xe22bc007, + 0x42214049, + 0x9910c1ce, + 0x42ce09d4, + 0x2ed4490a, + 0xced469e4, + 0x4ea71904, + 0x11fd4fff, + 0xa74ea743, + 0x4305fef2, + 0x9d084c9d, + 0x4e4d0942, + 0xfc8e406d, + 0xb007f94e, + 0x4714bc23, + 0x094b0b41, + 0x07300742, + 0x240999d1, + 0x010724c6, + 0x4107241e, + 0xe4474103, + 0x1c270107, + 0x2beb0b1c, + 0x1d4c101d, + 0x01031127, + 0x2705f1f0, + 0x09531e30, + 0x66e203e2, + 0x23400722, + 0x493b0c4c, + 0xc4873301, + 0x4b071047, + 0x410b2123, + 0x420dc30b, + 0x20073287, + 0x12233c0b, + 0x2d2ba427, + 0xa93b1b0b, + 0x21033301, + 0xdfc40d0a, + 0xffffffff, + 0x1e21270b, + 0x2d412707, + 0x23ce0514, + 0x3be12701, + 0x0bca2be0, + 0x581223e3, + 0x8e0307f2, + 0x63f54ef9, + 0x54f0c5f6, + 0x27240299, + 0xc5323b31, + 0x4f0750f2, + 0xf3c52007, + 0x58f1c54c, + 0xc5142c23, + 0x3c2740f4, + 0x40f1c110, + 0x14054027, + 0xf1c51403, + 0x07f38840, + 0x4cf2c1a2, + 0x21231027, + 0xf1c53a27, + 0x0d8c2748, + 0xc55cf2c5, + 0xa78960f3, + 0x1aa38918, + 0x00ea72f0, + 0x074cf4c1, + 0xe134eec3, + 0x50f1c100, + 0x38074807, + 0x230d4c23, + 0x413b0c3c, + 0xf1c1313b, + 0x013c0b54, + 0x23148712, + 0x87120b81, + 0x075127b3, + 0x3bb20b97, + 0x03202758, + 0x27d10781, + 0xc5910360, + 0x4f1e44f2, + 0x2f071e01, + 0x385b3e07, + 0x870f3c83, + 0x01420b43, + 0x072ae642, + 0x06428b45, + 0x07020745, + 0x07031e2e, + 0x0b42070e, + 0x1b40ce45, + 0xf2c1b205, + 0x874f0744, + 0x03340b33, + 0x03402722, + 0xc5c103b4, + 0x340544f2, + 0xde05091e, + 0x031ed403, + 0x14034e05, + 0xf9f06103, + 0x1e3f0705, + 0x5cf4c121, + 0x07a6c4ca, + 0x03370746, + 0x0a362b41, + 0x27749674, + 0x03120131, + 0x03d20514, + 0x1ef3a8d4, + 0x463401dd, + 0x27d40545, + 0x05d40340, + 0x40f1c134, + 0x31ce3403, + 0x58f2c1ed, + 0x890f82ce, + 0x00271aa4, + 0x01274c0e, + 0xf0c50f6b, + 0x44f4c148, + 0x1b1aac8d, + 0x18a48d47, + 0x0360f3c1, + 0xc5312381, + 0xa20360f3, + 0xff003ff6, + 0x4348f0c1, + 0xa7f58ef6, + 0xffffff3e, + 0x060834d1, + 0x34d5400b, + 0xfe0b0608, + 0x4ea7fe0b, + 0xb9ffffff, + 0xc1010042, + 0x3207fc40, + 0x4c834007, + 0x1e31030f, + 0x03402712, + 0x7c14fd01, + 0x07ff0000, + 0x83212340, + 0x14070f4c, + 0xf3f01333, + 0xf9091e03, + 0x00007e14, + 0xa74006ff, + 0xffffff4e, + 0x010042bd, + 0x0bfc40c5, + 0x07fc4efe, + 0x27b43ec0, + 0x270c0e41, + 0x8e040740, + 0x07fc4efc, + 0xffcf03c0, + 0x8303ffff, + 0x000000cf, + 0x271c07fc, + 0x163c2720, + 0x00f4e7be, + 0xfa234ea7, + 0xc53027ff, + 0x43c5404c, + 0x3840c53c, + 0xfa4efc8e, + 0xdc23d007, + 0x0bc24714, + 0x14dc03cd, + 0x0924db99, + 0x3b4127ce, + 0x23ae074b, + 0x01a30b42, + 0x27a432d0, + 0x23fa8e01, + 0x2b3b0c2c, + 0x4e87e20b, + 0x2387040b, + 0x00e7dcbe, + 0x00274127, + 0xd49dca0d, + 0x4efa8e31, + 0x240399f7, + 0x433b4127, + 0x7407f063, + 0xd0070a01, + 0xb107f105, + 0x84877333, + 0x9027c007, + 0x0b07c249, + 0x22871a07, + 0xa6be9103, + 0xa80b00e7, + 0xc203b70b, + 0xe9109cc4, + 0x0124d499, + 0x03c407de, + 0x24d49d41, + 0xc603f401, + 0x0d07d405, + 0x2c071f07, + 0xfe053127, + 0x96ff6d7e, + 0x27d3b105, + 0x0b4c3b41, + 0x43d3b534, + 0x4ef78ef0, + 0xedf093fa, + 0x49be011f, + 0xf09300f0, + 0xbe011fed, + 0xa700f040, + 0xfffa1fbe, + 0x270cdc27, + 0x07b209a0, + 0x3bc2071d, + 0xf7f093cd, + 0x3c07011f, + 0x21beb203, + 0xac0b00f0, + 0xbfc4d103, + 0xff000600, + 0x23cea7e1, + 0xc189fffa, + 0xfcf09332, + 0x05be011f, + 0xc1a100f0, + 0x2107c3b1, + 0xf0934a07, + 0x2b012003, + 0x9efa0e2a, + 0x4e00eff0, + 0x3808c1f6, + 0x993c0cc1, + 0xd007240e, + 0x9027b107, + 0x6c277027, + 0x1c3c270c, + 0x362b0607, + 0x0103031e, + 0x4c072227, + 0x405b203b, + 0x415c2c0b, + 0x1e03f3f0, + 0xeb2bc204, + 0x4c234007, + 0x0b24470c, + 0x3b21492d, + 0x01410b4e, + 0x0b4487d3, + 0x0b380743, + 0x05a1273c, + 0x07110343, + 0x3b3e074a, + 0x03214d40, + 0x0ac40b37, + 0x02712703, + 0x07910719, + 0x234e3b4a, + 0x1494da42, + 0x13077666, + 0x097e0d07, + 0x071007fc, + 0xfeb97e0d, + 0xca24de99, + 0xd4a190cb, + 0xc53cd3c1, + 0x432b3cdb, + 0xd4a54b0b, + 0xfa4ef68e, + 0xc13c02c1, + 0xd1074003, + 0xdd0304a1, + 0xdde30fff, + 0x322b0fff, + 0xd42ba007, + 0x663800c1, + 0x02bd0737, + 0x07b307d3, + 0x07c20bcb, + 0xf2d2be1c, + 0x070a0700, + 0xff357e1c, + 0xd606db2b, + 0xf67e0d07, + 0x070a07fd, + 0x5efa0e1d, + 0xfa8eff23, + 0x0499fa4e, + 0x07d00731, + 0x07b307a2, + 0x7e46c6c1, + 0x0526fc1d, + 0x1c070d07, + 0x27fb877e, + 0x31d49d40, + 0xc05e0fd6, + 0x0a070bb2, + 0x66fdb07e, + 0x4fb3c00e, + 0x4c234c47, + 0x24d29914, + 0x31274d0b, + 0x4409323b, + 0x34223123, + 0x111e3c07, + 0x47034207, + 0x3c07c442, + 0x051e3103, + 0x38033207, + 0x433b4127, + 0x3407d1a1, + 0x130b3123, + 0x140b13eb, + 0x4b7e0d07, + 0x32d489ff, + 0x41030d07, + 0xd48d1c07, + 0x5efa0e32, + 0x0027fb24, + 0xfa4efa8e, + 0xa007d207, + 0x2a46b107, + 0x1a073d07, + 0x0ea72b07, + 0x7efffa23, + 0x07a6fd7e, + 0xfa23cea7, + 0x24c099ff, + 0x10272227, + 0x71be0703, + 0x10070176, + 0xa47e0c07, + 0x27d61efd, + 0x0ef49b40, + 0x4007fa8e, + 0x1e0c0c27, + 0x27010303, + 0xca203b21, + 0x3ea7f824, + 0xd1ffffff, + 0x27060834, + 0xd5420b10, + 0x27060834, + 0x763a9e22, + 0x07fb4e01, + 0x121f9bb0, + 0x1e60f093, + 0xee1abe01, + 0x93b11100, + 0x011e6df0, + 0x00ee0fbe, + 0xf093b121, + 0xbe011e74, + 0x0100ee04, + 0x7bf093b1, + 0xf9be011e, + 0xc02700ed, + 0xd231db07, + 0xf0931c07, + 0x03011e7c, + 0xede6bec1, + 0xc4d40300, + 0x07ec0fcc, + 0x9efb0e0b, + 0x99fff721, + 0x4626a804, + 0xf5a74ea7, + 0x3804c5ff, + 0x04c54103, + 0xa7fe0b34, + 0xfeffff4e, + 0x4e234411, + 0xc5fff5b0, + 0x48233404, + 0x0b3804c5, + 0xff3ea7fe, + 0x2f27f9ff, + 0x11111111, + 0x01004d27, + 0x34033205, + 0x4027f4c8, + 0x9b0ef49b, + 0xf49b6af4, + 0x62f49b6b, + 0x2763f49b, + 0xa9049d30, + 0xc54c039d, + 0x04c55004, + 0x9004c554, + 0xc54404c5, + 0x04c54804, + 0x3c04c5a0, + 0x9d4004c5, + 0x049d4d04, + 0x8c049d8b, + 0x0b8a049d, + 0xdf3ea7fe, + 0x4027fdeb, + 0x4f273405, + 0x07040000, + 0x40273415, + 0x9b0ef49b, + 0xf29b6bf2, + 0x6af29b62, + 0xa363f29b, + 0xf19b1c1c, + 0x0bfe0b60, + 0x93fc4efe, + 0x0451bff2, + 0xc1502ec1, + 0xe3334023, + 0x4e2b4307, + 0xe3074008, + 0x99312d99, + 0xc2073024, + 0x24074d1b, + 0x171e2f6b, + 0x03410431, + 0x430b2107, + 0x4e1b4333, + 0x404c2f6b, + 0x00010111, + 0x4207fc8e, + 0x04074183, + 0x43330533, + 0x1207042b, + 0x7f880f03, + 0x11030004, + 0xc1d2d2ce, + 0xc1c1d0c0, + 0x93fc8ed4, + 0x045163f4, + 0x0bcc40c1, + 0x6bfa4efe, + 0x9b05c60f, + 0x3ea7044f, + 0x0bf9f7ff, + 0x9b0b1e41, + 0x4ea7043f, + 0x0bf9f7ff, + 0x07d30731, + 0x00ad27e4, + 0x00bf2718, + 0x27040607, + 0x001d27c4, + 0x6b0b0706, + 0x3320070f, + 0x1e240323, + 0xf1f3e803, + 0x02100024, + 0x333327ff, + 0x4c53184c, + 0xee44c01d, + 0x45334007, + 0x18004ef5, + 0x41f5ff02, + 0xff021804, + 0x4e233027, + 0x35fde800, + 0x004e0343, + 0x4df5fde8, + 0xff021810, + 0x181441f5, + 0x4e23ff02, + 0x35fde7f0, + 0x44a12b43, + 0x274a07c2, + 0x23071ec1, + 0x864107c1, + 0x0be10bc5, + 0x07b853d1, + 0x27971e14, + 0x0607000f, + 0x07142704, + 0x332f6b20, + 0x1e240323, + 0xf1f3e803, + 0x02100024, + 0xdc3327ff, + 0xf2fc6a4d, + 0xf1100853, + 0xfb4efa8e, + 0x20010d28, + 0x20000d27, + 0x000c051e, + 0xd0070703, + 0xbd07d373, + 0xf493b823, + 0x07045080, + 0xc10fab0b, + 0x0833b441, + 0xe027c407, + 0xe4c47c1e, + 0x9b19d62f, + 0xb1c8633f, + 0xbcc49927, + 0xf49b40ab, + 0x6d4f9b6d, + 0x2b63ef9b, + 0x03e373e3, + 0x614f9be4, + 0x8bbcc3c1, + 0x27448643, + 0x27ed3a11, + 0x9b641e04, + 0xc3c1642f, + 0x182c53bc, + 0xc40d32d8, + 0x12440a21, + 0x27644f9b, + 0xd8151e48, + 0x0716103c, + 0x804c2342, + 0xc40e44d4, + 0x4f9b0b12, + 0x9b462764, + 0x211e65f4, + 0xa6403c18, + 0x644f9b17, + 0xf49b4827, + 0x2724c665, + 0x14051e10, + 0x03110312, + 0x83eddae1, + 0x131e0327, + 0x93614f9b, + 0x044fe7f2, + 0x27bc23c1, + 0xc5438b00, + 0xf493cc24, + 0xc5044fd8, + 0xfb8eb441, + 0xc007fc4e, + 0x4f272f6b, + 0x400000ff, + 0x0761f49b, + 0x5cecbe02, + 0x93402701, + 0x044fb7fd, + 0xc5c8d4c5, + 0xc486c4d4, + 0xd4c1ff1e, + 0x004dd494, + 0x46361980, + 0x80000d27, + 0x20271007, + 0x00ef7ebe, + 0x2798d0c5, + 0xc580004d, + 0xfc8e94d4, + 0xdd27fd4e, + 0xf0930600, + 0x7e044f80, + 0x3ea7fd0f, + 0x27f9f7ff, + 0x054d0720, + 0x03d12332, + 0x93f4b834, + 0x044f67f0, + 0x93fd207e, + 0x044f5ff0, + 0x20271027, + 0x93fd687e, + 0x044f53f4, + 0x9d7f3ca7, + 0x3c27b043, + 0xac43c5f7, + 0x4dc530a7, + 0xaa439d9c, + 0xc5bc4dc5, + 0x4dc5c04d, + 0x4efd8eb8, + 0x25f493fe, + 0x4ce30343, + 0x9b071e7f, + 0x4c0308f4, + 0x804fd080, + 0xf4000393, + 0x4f16f393, + 0x8c329904, + 0x078a3499, + 0x9d42ab03, + 0xdabe8c34, + 0x0027015b, + 0x42f6f193, + 0xfd9f7e03, + 0x93604f9b, + 0x0342ebf3, + 0x200034d5, + 0xd5634f9b, + 0x9b200434, + 0x34d5624f, + 0xfe8e2008, + 0x05634f9b, + 0xd5f49304, + 0x43c1044e, + 0x9903153c, + 0x039db043, + 0xaa439908, + 0x9909039d, + 0x039dac43, + 0x8b44990a, + 0x0b0b049d, + 0x634f9bfe, + 0x4eaef393, + 0xc5412304, + 0xfe0b4034, + 0x0399fd4e, + 0x83d0078a, + 0x2734d637, + 0x99fd8e00, + 0x4fa38b04, + 0xffffffa0, + 0x049d43ab, + 0x630f9b8b, + 0xbe40d0c5, + 0x07017223, + 0x5b19be0d, + 0x8bd49901, + 0x46180027, + 0xfd8e0127, + 0xf293fe4e, + 0xc1044e68, + 0x4f9b4023, + 0x1134ce63, + 0x388b2499, + 0x4ca3104c, + 0x8b249d20, + 0x015becbe, + 0x4e4af093, + 0x8c049904, + 0xab8a0399, + 0x8a049d43, + 0x049d4027, + 0x623f9b8c, + 0xce634f9b, + 0x893e0943, + 0x022704c6, + 0xf093fe8e, + 0x99044e24, + 0x4c838b04, + 0x104c24f0, + 0xfe8e0027, + 0x8b9c04c1, + 0x4efe8ef4, + 0x09f093fd, + 0xdabe044e, + 0xfd93015a, + 0xc1044e00, + 0x0d0754d1, + 0x13331103, + 0x015c97be, + 0xcebe0d07, + 0x01b6015b, + 0x4de6f093, + 0xfb9f7e04, + 0x93a4d1c1, + 0x044ddbf0, + 0xfd0e2027, + 0x4efbe45e, + 0x07b007fb, + 0xbec10701, + 0x0701716b, + 0xbe1c070b, + 0x07015c64, + 0x9efb0e0b, + 0x4e015b99, + 0xa9f493fc, + 0x4ce30341, + 0x9b071e7f, + 0x4c030cf4, + 0x804fd080, + 0xf4000393, + 0xf49b4027, + 0x95f0930e, + 0x247e044d, + 0x930127fb, + 0x034183f1, + 0x93fc2c7e, + 0x03417bfc, + 0x4d7ef093, + 0x00c1d104, + 0x04c2d120, + 0x7ed00720, + 0xd499fb81, + 0xd147588a, + 0xd12004c3, + 0xce2008c4, + 0xd4992934, + 0x07451630, + 0x5b37be0d, + 0x04c1d101, + 0x40d4c120, + 0x1b4cd299, + 0x08243241, + 0x93202740, + 0x044d3ff0, + 0xa29efc0e, + 0xfc8e015d, + 0xcf9bfc4e, + 0x2df09363, + 0x01c1044d, + 0xbe20273c, + 0x9b015d8d, + 0x0027634f, + 0x01274c4e, + 0xf49b4827, + 0x4efc8e65, + 0x93d007fd, + 0x044d0bf0, + 0x015ae8be, + 0x4d02f493, + 0x4043c104, + 0x074c4299, + 0x32432b4d, + 0x27400824, + 0x931d0720, + 0x044cebf0, + 0x4e9efd0e, + 0xf493015d, + 0xc1044ce0, + 0xc81e4040, + 0x0499f54e, + 0x30039931, + 0x2b9802c1, + 0xa3c40743, + 0x6bd007f0, + 0x27b207cf, + 0x27902780, + 0xa7a02750, + 0xfde7ff6e, + 0xe7ef7ea7, + 0x15f205fd, + 0x009f5ef1, + 0xe183ec07, + 0x3e074e07, + 0x35334333, + 0x3d0b342b, + 0x34413031, + 0x400bf111, + 0x23332407, + 0x2703212b, + 0x20022373, + 0x33212007, + 0x5407a4d6, + 0x1a07522b, + 0x0b94d4c1, + 0x6d41ca12, + 0x022b030b, + 0xd6270bce, + 0xe8231e24, + 0xff3ea7f3, + 0x3411fdef, + 0x4c333327, + 0x1d4c5318, + 0x05ed44c0, + 0x27621560, + 0x05643540, + 0x3572157b, + 0x333e0774, + 0x2be33335, + 0x993d0b3e, + 0x48071430, + 0xab200ca3, + 0x14309d49, + 0x380144d6, + 0x40073911, + 0x45664783, + 0xcca3c407, + 0x1ea10710, + 0x034c071d, + 0x0bc40741, + 0x07cf6bb2, + 0x31d499a1, + 0xff5ec4ee, + 0x1e10cc27, + 0x1ef3e805, + 0xff2ea706, + 0x2411fdef, + 0x4ddc3327, + 0x11effc6a, + 0xbe0d07f1, + 0x99015a8c, + 0xd39931d4, + 0x07432b30, + 0x9d2f6b24, + 0xa4d632d2, + 0x3f1e0027, + 0x21832123, + 0x12074207, + 0x15334333, + 0x1d0b142b, + 0x149d4027, + 0x141c9d15, + 0x1a35f401, + 0x18051545, + 0x14251915, + 0xc530d499, + 0x410390d5, + 0xc530d49d, + 0x0d0750d5, + 0xeebe3027, + 0x0011015a, + 0xf0830333, + 0xf84ef58e, + 0x07440dc1, + 0x079107c0, + 0x27d7e3a2, + 0xbe0c0780, + 0x07015851, + 0x7e1d070c, + 0xc499fe9c, + 0x96b0078a, + 0xbe0c0745, + 0x27015949, + 0x27049641, + 0x07b82240, + 0xda4fd68b, + 0xcdc1b4f6, + 0x07d33350, + 0x5b30be0c, + 0x07b00b01, + 0xbe0d071b, + 0x070157fd, + 0x124d2b49, + 0x07a027a4, + 0x0e1a0709, + 0x57769ef8, + 0x93fa4e01, + 0x044b2bf4, + 0xc14c4399, + 0x439d3c0a, + 0x0730274d, + 0x4c439dc0, + 0xd4c1d407, + 0x4cd39940, + 0x34324a1b, + 0x400c2027, + 0x0d072307, + 0x6abe1a07, + 0xb007015b, + 0x4f9b0344, + 0x40d4c563, + 0x0f9b3c1e, + 0x6e91be63, + 0x44d1c101, + 0x89be0d07, + 0xd4990159, + 0x1b41c4aa, + 0xc1634f9b, + 0x432b40d3, + 0x00014f50, + 0x4f9b7000, + 0x004f0363, + 0xc5f00000, + 0x0d0740d4, + 0x9ebeb424, + 0x0fd60158, + 0xb5fd93a2, + 0xd499044a, + 0x4cd49d4d, + 0x010cb4e0, + 0x991bb2c4, + 0xc4998bc3, + 0x203ca38a, + 0x34ab4783, + 0xc39d0c07, + 0x5731be8b, + 0x8e022701, + 0xaac399fa, + 0x274dd49d, + 0x9d002740, + 0xb3474cd4, + 0x015c23be, + 0xbe630f9b, + 0x07016e17, + 0x5d93be0b, + 0x4dd49901, + 0xea4cd49d, + 0x9b009e0b, + 0x482764df, + 0x9b18dc53, + 0xb9d065f4, + 0x643f9b2f, + 0x5365f49b, + 0x3833183c, + 0xbcd0d3ab, + 0x4f9b1e11, + 0x9b382764, + 0x2f9b65f3, + 0x65f39b64, + 0x33184c53, + 0x2ee3104c, + 0xabffffff, + 0x27d4ab42, + 0x8bc49d40, + 0x41234d07, + 0xffff4fd4, + 0x9b2b0fff, + 0x0407634f, + 0xbe40c4c5, + 0xc1016daf, + 0xd33340c4, + 0xc0c1d40b, + 0x3ccdc5c0, + 0x015ba3be, + 0x278bc499, + 0x104ca300, + 0x8e8bc49d, + 0x634f9bfa, + 0x9340c4c5, + 0x0449e3f4, + 0x9b4042c1, + 0x1f9b624f, + 0x8bc39963, + 0x2f03412b, + 0x7fffff00, + 0x3ca3242b, + 0x991e1e40, + 0x46d88ac4, + 0x632f9b22, + 0x998bc399, + 0x07e38ac4, + 0x83203ca3, + 0x40c2c547, + 0x200b34ab, + 0xc39d0227, + 0x3cc2c58b, + 0x0427fa8e, + 0xfc4efa8e, + 0x4996f493, + 0x4c439904, + 0x439dd007, + 0x9d30274d, + 0x00274c43, + 0x015b2bbe, + 0xbe630f9b, + 0x27016d1f, + 0xbe20000d, + 0x36015c99, + 0x8ad49906, + 0x277446dc, + 0x9dc42740, + 0x6f1e8bd4, + 0x07f8c57e, + 0xd303c0c0, + 0x991102c4, + 0x0d078ad4, + 0xd49d4783, + 0x55e9be8b, + 0x76541e01, + 0x634f9b0e, + 0xc58ad399, + 0x315840d4, + 0x3390d4c1, + 0x93191e43, + 0x04492ff4, + 0x9b4044c1, + 0x2f9b623f, + 0x03322b63, + 0xffff004f, + 0xc5432b7f, + 0xd0c13cd4, + 0x104c27c0, + 0xbe8bd49d, + 0xc1015ab4, + 0x4fa3bcd4, + 0x40000000, + 0x2761f49b, + 0xb4d4c540, + 0xc227051e, + 0xf4939e1e, + 0x990448f0, + 0x0c074d43, + 0x8e4c439d, + 0x93fa4efc, + 0x0448dff3, + 0x074c3499, + 0x4d349dd0, + 0x349d4027, + 0x8b04994c, + 0x402c4f4b, + 0x731eb427, + 0xb027a307, + 0xc18adc99, + 0x4f9b3ca3, + 0x0e34ce63, + 0x073cd1c1, + 0xbe20270d, + 0x07015915, + 0x630f9bb0, + 0x016c46be, + 0x0744d1c1, + 0x573ebe0d, + 0x440d0701, + 0x5673beb4, + 0x1e0ba601, + 0xc1c636cc, + 0x3f9b3ca4, + 0x2c432b63, + 0x8adc9941, + 0xd499c1a3, + 0x833c078b, + 0x204ca337, + 0xd49d43ab, + 0xbe0d078b, + 0x18015507, + 0x99b227c6, + 0x4fa38bd4, + 0xffffff80, + 0xc08bd49d, + 0xd4996eb2, + 0xcc4f4b8b, + 0x01275b40, + 0x015b6cbe, + 0xd630d499, + 0x1eb42744, + 0x634f9b4c, + 0xc58ad399, + 0x315840d4, + 0x3390d4c1, + 0x93191e43, + 0x044827f4, + 0x9b4044c1, + 0x2f9b623f, + 0x03322b63, + 0xffff004f, + 0xc5432b7f, + 0x4c273cd4, + 0x8bd49d10, + 0x0d0706d6, + 0xe6f95f7e, + 0x44d1c105, + 0xb2270d07, + 0x01569bbe, + 0xb027031e, + 0x47eef493, + 0x4d439904, + 0x074c439d, + 0x4efa8e0b, + 0x63bf9bfa, + 0x47dafa93, + 0xc1b78304, + 0x4f9b3cac, + 0x1fdc2763, + 0xdb2bc42b, + 0x9b624f9b, + 0x432b633f, + 0x0718d4d2, + 0x5adfbe0d, + 0x0fd0d201, + 0x9b3ca4c1, + 0x432b633f, + 0xa4274032, + 0xa027031e, + 0x49be0027, + 0xdf9b0159, + 0x99f49364, + 0x40c10447, + 0x593abec0, + 0x27c12c01, + 0x07fa8e01, + 0x002f032d, + 0xcc800000, + 0x270c20cc, + 0x3c2b203c, + 0x433b40a7, + 0xb103248b, + 0x4b5b4207, + 0x002744c6, + 0x0127fa8e, + 0x0027a486, + 0xfb4efa8e, + 0xd007b107, + 0x0cc0bf6b, + 0x01246020, + 0xfdb4f453, + 0x02240d1e, + 0xfe63f453, + 0xf453051e, + 0xfc93fc11, + 0x9904473c, + 0xc4c5b0c0, + 0xaacd9d9c, + 0x01545dbe, + 0xc4c54027, + 0x27d2203c, + 0x041e314c, + 0x9d7f4ca7, + 0xb6468bc4, + 0x4716f493, + 0xac40c104, + 0xa30f0c83, + 0x041e100c, + 0xbe180c27, + 0x9301544d, + 0x0446fff4, + 0x0ec040c1, + 0x589e9efb, + 0xa7fb8e01, + 0xfdefff2e, + 0xf3e8031e, + 0x274424c1, + 0x6a4ddc33, + 0xfe0bf5fc, + 0x47b2f293, + 0x99412704, + 0x249d1323, + 0x69364697, + 0x1a238924, + 0x4027342b, + 0x249d240d, + 0x0b232d13, + 0x933127fe, + 0x04478ff4, + 0x016b43bd, + 0x3ea7fe0b, + 0x27feffff, + 0x3b34bd43, + 0xd540270d, + 0xbd0d3434, + 0x270d3834, + 0x3934bd41, + 0xbd42270d, + 0x0b0d3a34, + 0xc1fd4efe, + 0x04999c03, + 0xa002c143, + 0xc53803c5, + 0x44876402, + 0x1c0043f5, + 0x0499ff00, + 0xa003c16f, + 0x43f54487, + 0xff001c00, + 0x04c13027, + 0x89030d9c, + 0xd007a403, + 0x4253032d, + 0xc124f49b, + 0x4253a004, + 0x9925f49b, + 0x44c41204, + 0x8903491d, + 0x43ca1004, + 0xec04c115, + 0xbe424199, + 0x07016111, + 0x0e11270d, + 0x5ee49efd, + 0x4efd8e01, + 0x03c007fc, + 0x48be300c, + 0x0c07016e, + 0xbe5c0c03, + 0x27016e3f, + 0x606bbe00, + 0x504abe01, + 0x5efc0e01, + 0xfd4eff13, + 0xfff7f2be, + 0x46d2f093, + 0x3ed00704, + 0x12d499cf, + 0x071344c4, + 0x300c030d, + 0x0170debe, + 0x0c030d07, + 0x70d5be5c, + 0xa7302701, + 0x13d39d40, + 0x2512d39d, + 0xdf0ea7d4, + 0xdfbeffff, + 0xd4c100e5, + 0x38d1c144, + 0x140b0d07, + 0x0c0314eb, + 0x0539be30, + 0x70d4c100, + 0x0764d1c1, + 0x03140b0d, + 0x14eb5c0c, + 0x000526be, + 0xffdf0ea7, + 0x9efd0eff, + 0x4e00e58b, + 0x69f493fc, + 0x24070446, + 0x01772d03, + 0x2ce33407, + 0x7f3ce37f, + 0x3c033419, + 0xf932c280, + 0x464ef393, + 0x27202704, + 0x32055e4c, + 0xf4c83403, + 0xffffeea7, + 0x93e411fe, + 0x044637fc, + 0x48034447, + 0x24074f6b, + 0x210330a7, + 0x3027c325, + 0x9d43c49d, + 0xc29d12c3, + 0x9b40276f, + 0xf49b24f4, + 0x04ee9925, + 0x17270c07, + 0x27300c03, + 0x003d2720, + 0x9d4a2728, + 0x43bec8ce, + 0x0c070004, + 0x29271627, + 0x24003d27, + 0x0c034a27, + 0x0430be5c, + 0xbe0c0700, + 0x0e000346, + 0xfe585efc, + 0x0421f94e, + 0x45d6fa93, + 0x384c0304, + 0x313ca4c5, + 0xc5d00704, + 0x045968a4, + 0xa49df063, + 0x2a048914, + 0xa48d9027, + 0x28048924, + 0x9926a48d, + 0xa49d1804, + 0x9d047917, + 0x015116a4, + 0x071b0299, + 0x0fcc83c1, + 0xce23c333, + 0x81ffff84, + 0x074c0703, + 0x0344030a, + 0xf905300c, + 0x00046fbe, + 0xd151b007, + 0x911cd299, + 0x074c07d3, + 0x0345030a, + 0xf9055c0c, + 0x000457be, + 0x04d60b8b, + 0x1a1e0a27, + 0xc530d4c1, + 0xa485e4a9, + 0xa4bd40a7, + 0xdd51015c, + 0xad254027, + 0x2798a48d, + 0x8ef04300, + 0x93fb4ef9, + 0x044543f0, + 0x000215be, + 0x456afc93, + 0xbe0c0704, + 0x07016bcc, + 0x030c07b0, + 0xc1be2c0c, + 0xf493016b, + 0xc1044524, + 0x41c13842, + 0x09432964, + 0x2b2b2b4e, + 0x8d3e2b10, + 0x42c5a443, + 0xa041c59c, + 0xfd4efb8e, + 0x4502fd93, + 0x12d49904, + 0x3e0d44c4, + 0xbe0027b1, + 0xbe015e79, + 0x07014e58, + 0x300c030d, + 0x0002b0be, + 0x0c030d07, + 0x02a7be5c, + 0x04e2be00, + 0xfd0d7e00, + 0xffea15be, + 0xc49efd0e, + 0xfb4efff4, + 0x21260189, + 0x33410702, + 0x33b18748, + 0x1bc00714, + 0x300c0314, + 0x00029bbe, + 0xcb8d4027, + 0x88c0c58e, + 0x8e8cc48d, + 0x89fa4efb, + 0x04898c0b, + 0xc13b078e, + 0x4b2b880c, + 0x36332b87, + 0xf063322b, + 0x048dd007, + 0x27c32b8e, + 0x4deabea0, + 0x491c1e01, + 0x9bc309d4, + 0x81030b04, + 0x030087d4, + 0x05040bc4, + 0xbea103fc, + 0x03014d70, + 0x1f0738cc, + 0xd0892427, + 0xdcbace26, + 0xd38d3027, + 0x8ed4898c, + 0x31533007, + 0x0d07342a, + 0x43ff7d7e, + 0x4efa8ef0, + 0xc72ea7fd, + 0x4027fdeb, + 0x3f272405, + 0x0a040000, + 0xf49b2315, + 0x0528230e, + 0x003f2724, + 0x15090400, + 0x0ef49b23, + 0xebdf2ea7, + 0x272405fd, + 0x0400003f, + 0x9b231507, + 0x7cbe0ef4, + 0xf093fff5, + 0x07044404, + 0x0160bed0, + 0xfc747e00, + 0xffe957be, + 0x2412d499, + 0x7e0d0744, + 0x4127fc89, + 0x07a2f49b, + 0x300c030d, + 0x0001bcbe, + 0x0c030d07, + 0x9efd0e5c, + 0x4e0001b1, + 0xff4ea7fc, + 0x4411feff, + 0xffffdea7, + 0x24d3d1ff, + 0xf5448706, + 0x000d4843, + 0x273007ff, + 0xff4ea721, + 0x42c5fdcf, + 0x634f9b68, + 0x30c8342b, + 0xc9fc931b, + 0xc3990442, + 0x9d40274c, + 0xc39d4cc4, + 0x54abbe4d, + 0x4dc49901, + 0x934cc49d, + 0x0442aff4, + 0x9d4c4399, + 0x30274d43, + 0xd14c439d, + 0x9b0ce0dc, + 0x3cbe630f, + 0x4f9b0166, + 0x633f9b62, + 0xc4d2432b, + 0xbe0c070c, + 0x120155ad, + 0x634f9bc0, + 0x427ef493, + 0x4d439904, + 0x8e4c439d, + 0x93fe4efc, + 0x044347f0, + 0x93fc467e, + 0x04433ff0, + 0x93fbd87e, + 0x044337f0, + 0x7f9efe0e, + 0x00270157, + 0xfd4efe0b, + 0x27ac0299, + 0x33420733, + 0xad019943, + 0x120043f5, + 0x44f1ff02, + 0xff021000, + 0x0247d007, + 0x27e04c3c, + 0x33131e20, + 0xf1418725, + 0x02180423, + 0x0042f1ff, + 0x0bff0216, + 0x27308723, + 0x0034f542, + 0xc1ff0212, + 0x422bc4d4, + 0xbed4d4c5, + 0xc501725f, + 0xfd8ed8d0, + 0xf493fc4e, + 0xc10442d4, + 0xe007ec44, + 0x07104489, + 0x9bd447c1, + 0x16d30bd2, + 0x33140706, + 0x270d071a, + 0xe1c5be20, + 0x010c1e00, + 0x0bd4c214, + 0xe1be1d07, + 0xe00700e0, + 0x0e07cd05, + 0xfc4efc8e, + 0x1127c007, + 0x27a80c03, + 0x3d27162c, + 0x4a271000, + 0x0000d1be, + 0x0c030c07, + 0x271227ac, + 0x3d27172c, + 0x4a271400, + 0x0000bdbe, + 0x0d030c07, + 0x13270154, + 0x3d272127, + 0x4a271800, + 0x0000a9be, + 0xebb73ea7, + 0x052027fd, + 0x004f2732, + 0x15128200, + 0x9b402734, + 0x38230ef4, + 0x4f273205, + 0x12420000, + 0x40273415, + 0x8e0ef49b, + 0x99fd4efc, + 0xd0071204, + 0x80be4244, + 0x42270169, + 0x8e12d49d, + 0x120499fd, + 0x4a9e4204, + 0xfe0b016a, + 0xd007fb4e, + 0x64beb107, + 0xd4510169, + 0x3407d221, + 0x34eb320b, + 0x422b4307, + 0xd325b422, + 0xd4992307, + 0x5b320710, + 0x83430734, + 0x51448741, + 0x0b3207dc, + 0x613b0b4d, + 0x25c28b44, + 0x07d315d3, + 0xbec40b0d, + 0x11016a88, + 0x9b4253d4, + 0x0c0724f4, + 0xfc4efb8e, + 0x18bec007, + 0x0c070169, + 0x6d9efc0e, + 0xfe4e016a, + 0x4623e407, + 0x4c83e30b, + 0x0e3c330f, + 0x011d023d, + 0x00003f83, + 0x13333ff0, + 0x4c332027, + 0xf543ab10, + 0x02140012, + 0x0414f5ff, + 0x2dff0214, + 0x9b40270e, + 0xfe8e0ef4, + 0xd007fd4e, + 0x91be0107, + 0xd299ffea, + 0xa1d42110, + 0x83425bd1, + 0x3b312741, + 0x0b448732, + 0x654d0b31, + 0x46d3a540, + 0x0e0d0715, + 0x69879efd, + 0x4efd8e01, + 0x07f063fb, + 0x1eb107d0, + 0x10d19927, + 0xc15bcb07, + 0xcc87c183, + 0xc461cd0b, + 0x3fbef405, + 0xd299ffed, + 0x27d3a110, + 0x2b423b41, + 0x65402734, + 0xa1d3a5c4, + 0x270f07d4, + 0xd2b4ce21, + 0xfb8ef043, + 0xd007fa4e, + 0x07120099, + 0x07b207a1, + 0xc6230714, + 0x8e012704, + 0x21d451fa, + 0x10d399dc, + 0xd285c40b, + 0xc4ebd195, + 0xa7333bce, + 0xffffdf0e, + 0x00e029be, + 0x0d071c07, + 0x0ea78e3e, + 0xbeffffdf, + 0x2700dff7, + 0x233b3b31, + 0xebc30b31, + 0x5b4c07c3, + 0x9d41234b, + 0xdb9d11d4, + 0xa5d35510, + 0x15d4a1dc, + 0xcedc25dc, + 0xf25115c4, + 0x1a070d07, + 0x016b11be, + 0x04964127, + 0x04074027, + 0x0d07fa8e, + 0x0168ccbe, + 0xfa8e0127, + 0x0207fe0b, + 0xfe0bfe0b, + 0x04030105, + 0x0027fe0b, + 0xf94efe0b, + 0x07e404c1, + 0x53d00791, + 0xec02c192, + 0x0b894d76, + 0x240c8926, + 0xcb9b0481, + 0xc40bcc87, + 0x5406f393, + 0x273c2503, + 0xe40cc541, + 0x24993415, + 0x230c0712, + 0x33438343, + 0x14070e4c, + 0x00001fa3, + 0xa407cf00, + 0x000066be, + 0xafa3c01b, + 0xc7000000, + 0x1eeadc8d, + 0x030a0505, + 0x93fbc804, + 0x0353cbf3, + 0xd189392d, + 0x072987ea, + 0x0b442341, + 0x27343542, + 0x27345540, + 0x348dff4c, + 0x18318d1a, + 0xf40b2ea7, + 0x0e4c27fe, + 0x34033101, + 0x24032105, + 0xf98ef4a8, + 0xffff4ea7, + 0xbd3227fe, + 0x930be843, + 0x043febf2, + 0x24c54027, + 0x4324bdf0, + 0x27fe0b01, + 0x15010541, + 0x0b080304, + 0x93fe4efe, + 0x044147f0, + 0x12be1127, + 0xf4930004, + 0x2704413c, + 0xd5302720, + 0x9d012042, + 0x42d5cc43, + 0x42d50100, + 0x42d50118, + 0xfe8e011c, + 0xfc93fc4e, + 0x9304411c, + 0x015d27f4, + 0x40a7c405, + 0x27f0c4c5, + 0x44c4d540, + 0x604c2702, + 0x27f4c48d, + 0x8d04804d, + 0x4d27f6c4, + 0x30271800, + 0x27f8c48d, + 0xb84d2700, + 0x27102755, + 0x94c3bd22, + 0xfac48d02, + 0xbee7c39d, + 0x07ffeebc, + 0x003d270c, + 0xff4ea743, + 0x0403fbff, + 0x040043d5, + 0xa51efc8e, + 0xf493fe4e, + 0x99043f48, + 0x46661244, + 0x40b6f093, + 0xbe112704, + 0x27015c3a, + 0x492dbe00, + 0xa5f09301, + 0x11270440, + 0x159efe0e, + 0xfd4e0005, + 0xd9bed007, + 0x0536ffef, + 0x0517f413, + 0xc4fd8ed4, + 0x70be0e02, + 0xf493ffec, + 0x05015c90, + 0x8e0327d4, + 0xd1f84efd, + 0x6303b40d, + 0x03c007f0, + 0x0f9b30dc, + 0x61b9be63, + 0x624f9b01, + 0x2b633f9b, + 0x1bd4d243, + 0x2abe0d07, + 0xd0d20151, + 0xfdf49312, + 0x44c1043d, + 0x633f9b3c, + 0x04fa432b, + 0x402701a3, + 0x03b4c4d5, + 0x93638f9b, + 0x015c43f4, + 0x9f9bc405, + 0x9b412764, + 0xdf9b65f4, + 0x53462764, + 0xf49b1adc, + 0x64af9b65, + 0x9b65f49b, + 0x432764bf, + 0x5065f49b, + 0x002720dc, + 0xff6cf453, + 0x9301285e, + 0x043daff0, + 0x9b3c02c1, + 0x3f9b631f, + 0x2b430762, + 0x07400842, + 0x2b410732, + 0x1341c843, + 0x1b3c04c1, + 0xac48e441, + 0xf056be00, + 0x5e0626ff, + 0x4f9b00a3, + 0xbc03c161, + 0x4ff6438b, + 0x90e80097, + 0x4a070093, + 0xf61a4c53, + 0x07008a4f, + 0x1d4c534b, + 0x00814fe6, + 0xce7cc399, + 0x9f9b7ad3, + 0x9b412764, + 0x430765f4, + 0x54104c23, + 0x644f9b48, + 0xf49b4127, + 0x684f9b65, + 0x2764af9b, + 0x65f49b41, + 0x9b7dcd99, + 0xfd9b64bf, + 0x05f49365, + 0x4149043e, + 0x29b2c389, + 0x694e0940, + 0x0931ca44, + 0x200b2407, + 0x1e1e2e2b, + 0x99b8c199, + 0xc2c1c8c4, + 0xb9c39930, + 0x2c03410b, + 0x47444760, + 0x0b320b33, + 0x09422942, + 0x2cc48931, + 0xcc1190c8, + 0x3c270ea0, + 0x2b419b20, + 0x0bb35b3d, + 0xbe4b4e42, + 0x27ffeffe, + 0x00b25e03, + 0xd880c4c1, + 0x150c004d, + 0x26684f9b, + 0x682f9b46, + 0x34072103, + 0x9b644f9b, + 0xf3b865f2, + 0xd880c4c1, + 0x1210004d, + 0x03683f9b, + 0x9b091e31, + 0x4827644f, + 0xa865f49b, + 0x644f9bf3, + 0xf49b4127, + 0x4a37be65, + 0xe9c49901, + 0x002745b6, + 0x5924f493, + 0x1ec40501, + 0x85c49960, + 0xf49346e6, + 0x69043d58, + 0x09422943, + 0x89320b41, + 0x312bacc4, + 0x9b3d34ce, + 0x3f9b624f, + 0xcc432b63, + 0x4f9b1b49, + 0x23482b63, + 0xf353274c, + 0xc305fe31, + 0x03b4c4d5, + 0x2763f89b, + 0x211e0e0c, + 0x38be0f07, + 0x04d6016f, + 0x151e0127, + 0x4ea7f301, + 0xd5fbffff, + 0x93045043, + 0x0172ebf4, + 0x0027c405, + 0xf88ef043, + 0x0c27012c, + 0x28fe0b7c, + 0x0c277f0c, + 0x47fe0b7d, + 0x800c2c00, + 0x0b7e0c13, + 0x7f0c23fe, + 0xfc4efe0b, + 0xe0073007, + 0x34534007, + 0x830cec53, + 0x0f000f3e, + 0x000fee83, + 0x8341530f, + 0x0f000f0e, + 0x319be19b, + 0x4f830733, + 0x07800780, + 0x4e0b300b, + 0x40003fa3, + 0x4fa34000, + 0x40004000, + 0x422bf123, + 0xf405322b, + 0x4c33f315, + 0x103c3310, + 0xf335f425, + 0xc0a7df07, + 0xc833d001, + 0x0c730087, + 0xab863e16, + 0xc8d403c0, + 0x0c07efc0, + 0xfc8ef103, + 0xe107fb4e, + 0xefff2ea7, + 0xe8031efd, + 0x272401f3, + 0x184c3333, + 0xc01d4c53, + 0x2ea7f244, + 0x27fdebff, + 0x27240540, + 0x0200003f, + 0x9b231512, + 0x1f9b0ef4, + 0x9c2c2704, + 0x100bbe87, + 0xbe0b0027, + 0x0145e1be, + 0x43334b07, + 0xc4074b0b, + 0xab10cc33, + 0x00cf03c4, + 0xa7010001, + 0xf9e7ffde, + 0x07ae0f9b, + 0x7e2c071b, + 0xd005ff36, + 0x1000de23, + 0x03d00502, + 0x021004de, + 0x189cdfc4, + 0x8ee2ff06, + 0x99fe4efb, + 0x31271604, + 0x300c343b, + 0x13073303, + 0x0d031273, + 0x202702a4, + 0xf7fb4ea7, + 0xff3ea7f9, + 0x0e01f9f5, + 0x4e054423, + 0x44030e11, + 0x0e214e05, + 0x3e052103, + 0x030c0c03, + 0xc2340348, + 0x4027e521, + 0x8e0ef49b, + 0x07fc4efe, + 0x6bd007c1, + 0xff2ea7cf, + 0x24d1fbff, + 0x41dc0468, + 0x5424d1fa, + 0xbdf39304, + 0xd4d503eb, + 0x24d1024c, + 0x13070458, + 0x0250d4d5, + 0x045c24d1, + 0xd59b1c03, + 0xd10254d4, + 0xe3046024, + 0xd4d57f1c, + 0x24d10258, + 0x3ce30450, + 0x5cd4d57f, + 0x4c24d102, + 0x60d4d504, + 0x7424d102, + 0x48d4d504, + 0x4024d102, + 0x64d4d504, + 0x4424d102, + 0x68d4d504, + 0x4824d102, + 0x6cd4d504, + 0x03341902, + 0x31c2803c, + 0x59f093f9, + 0x1ea703eb, + 0xbefbf7ff, + 0x16016d3c, + 0xe84c1ec5, + 0xa7061ef3, + 0xfdefff2e, + 0x33272411, + 0x53184c33, + 0x44131d4c, + 0x9be942c8, + 0x0027042f, + 0x94802f03, + 0x1ea70003, + 0x27f9e7ff, + 0x60be9c3c, + 0xd4990143, + 0x9b472685, + 0x0027042f, + 0x951c2f03, + 0x1ea70003, + 0x27f9e763, + 0x44be9c3c, + 0x3ea70143, + 0xd1fbffff, + 0x53042032, + 0xc4218321, + 0x34d1f621, + 0xdc990400, + 0x70d4d5cf, + 0x3434d102, + 0x80d4d504, + 0x1434d102, + 0x84d4d504, + 0x1034d102, + 0x88d4d504, + 0x0434d102, + 0x74d4d504, + 0x0834d102, + 0x78d4d504, + 0x1834d102, + 0xe0d3c104, + 0x027cd4d5, + 0x02a0d3d5, + 0xc1ced499, + 0xd4bdc0d3, + 0xdcbd0295, + 0xd3d50296, + 0x4f9b0298, + 0x16d399a3, + 0x029cd4d5, + 0x433b4207, + 0x4303400c, + 0x027ed3a9, + 0x1d07e407, + 0x3c83e273, + 0xa41d033f, + 0x07002702, + 0x403c3023, + 0x2c232307, + 0x33420740, + 0x004cf143, + 0x03ff0608, + 0xf11c0501, + 0x06080444, + 0x153103ff, + 0xf1428714, + 0x060a0044, + 0x031425ff, + 0x0ec20c1c, + 0xbd4127cf, + 0x270294d4, + 0x0ef49b40, + 0xfc0e0027, + 0x01440e9e, + 0xc107fc4e, + 0xcf6bd007, + 0xffff3ea7, + 0x6834d1fb, + 0xfa41dc04, + 0xffff2ea7, + 0x2024d1fb, + 0xfa42d804, + 0xd3b94027, + 0x24d50294, + 0x3fe60468, + 0xd4d10149, + 0x0ea7024c, + 0xd5fbf7ff, + 0xd1045424, + 0x930250d4, + 0x03e9eff1, + 0x045824d5, + 0x0254d4d1, + 0x045c24d5, + 0x0258d4d1, + 0x046024d5, + 0x025cd4d1, + 0x045024d5, + 0x0260d4d1, + 0x044c24d5, + 0x0248d4d1, + 0x047424d5, + 0x0264d4d1, + 0x044024d5, + 0x0268d4d1, + 0x044424d5, + 0x026cd4d1, + 0x044824d5, + 0x016b93be, + 0x4c1ec516, + 0x061ef3e8, + 0xefff2ea7, + 0x272411fd, + 0x184c3333, + 0x131d4c53, + 0xe942c844, + 0x27041f9b, + 0x801f0300, + 0xa7000394, + 0xf9e7ff2e, + 0xbe9c3c27, + 0x990141b7, + 0x472685d4, + 0x27041f9b, + 0x1c1f0300, + 0xa7000395, + 0xf9e7632e, + 0xbe9c3c27, + 0x0701419b, + 0xfd377e0d, + 0x0270d4d1, + 0xffff3ea7, + 0x0034d5fb, + 0x80d4d104, + 0xd5030702, + 0xd1043434, + 0x070284d4, + 0x1434d52d, + 0x88d4d104, + 0x201c2702, + 0x041034d5, + 0x0274d4d1, + 0x040434d5, + 0x0278d4d1, + 0x040834d5, + 0x027cd4a9, + 0x041834d5, + 0x01b024d1, + 0x04d52403, + 0xf198041c, + 0xd49d4127, + 0xa0d4d1ca, + 0xe0d4c502, + 0x0295d4b9, + 0xb9ced49d, + 0x9d0296d4, + 0xd4d1cfd4, + 0xd4c50298, + 0x9cd4d1c0, + 0xa3f49b02, + 0x04d54127, + 0x40270430, + 0xa70ef49b, + 0xfdefff2e, + 0xf3e8031e, + 0x33272411, + 0xfc6a4ddc, + 0x4efc8ef6, + 0xbdf493fc, + 0x43c10437, + 0x4e449944, + 0x0407c007, + 0x9ebe030b, + 0x36be0149, + 0x0c07fff5, + 0xfc0e1027, + 0x4efe675e, + 0x3bcf5bf0, + 0x4efe2bdf, + 0xbe0f07fc, + 0x1effe4d1, + 0x07fb4eff, + 0xcc49beb0, + 0x07d007ff, + 0x69f09310, + 0xe1be0105, + 0xd74600d2, + 0x0b1ec027, + 0xc103d201, + 0x00d2d3be, + 0x1c07d403, + 0x055bf093, + 0xedcbda01, + 0x0000fb8e, + 0xff1eff1e, + 0xb007fb4e, + 0xf0931127, + 0xbe0105c4, + 0x1100d2b0, + 0xd1f093b1, + 0xa5be0105, + 0xb12100d2, + 0x05d8f093, + 0xd29abe01, + 0x93b10100, + 0x0105dff0, + 0x00d28fbe, + 0xf093b231, + 0x270105e6, + 0xd282be10, + 0x03db0700, + 0x31c127d4, + 0x931c07d2, + 0x0105d1f0, + 0x6dbec103, + 0xd40300d2, + 0xec0fccc4, + 0xfb0e0b07, + 0xfe4ea11e, + 0x20274007, + 0x05713c27, + 0xc8440342, + 0xc44d27f3, + 0x0531a701, + 0x4d400704, + 0xa7480303, + 0x05382720, + 0xc8440342, + 0x034007f3, + 0x20a7284c, + 0x42053827, + 0xf3c84403, + 0xc0621499, + 0x271bff4c, + 0x06049d41, + 0x9d621399, + 0x14990803, + 0x0f44dc0a, + 0x41e34307, + 0x8e08049d, + 0x9d4027fe, + 0xfe8e0604, + 0x3d270071, + 0x04010100, + 0x0803144e, + 0x0027f3b8, + 0x4007fe0b, + 0x71200099, + 0x33300742, + 0x0b310303, + 0x20439d02, + 0x3ea7fe0b, + 0x27e4f8af, + 0x75340540, + 0x27282703, + 0x4027ff3c, + 0x075024f5, + 0x2803ff1b, + 0x4027f398, + 0x0b20049d, + 0x07fe4efe, + 0x2a21c8e2, + 0xefff3ea7, + 0x5434c1fd, + 0x53184c33, + 0x42cc1d4c, + 0xbf4ea7f5, + 0x4105fde6, + 0x20274e15, + 0x3ea74235, + 0x05fde6af, + 0x353e1530, + 0x4efe8e32, + 0x932253fd, + 0x03eb5bfe, + 0x032141a7, + 0x122d140d, + 0xd1071e15, + 0x40273646, + 0xd435d4b5, + 0xd425d455, + 0xd485d495, + 0x4127fd8e, + 0x022401d1, + 0x0e070425, + 0x27fef57e, + 0x35d4b540, + 0x25d455d4, + 0x85d495d4, + 0x4efd8ed4, + 0xa70d39fb, + 0xffffff3e, + 0x34b9d123, + 0xdc830108, + 0xeec0070f, + 0x3300bcd4, + 0xa72027d3, + 0xfeffff0e, + 0x010cd2f5, + 0x03a9ff00, + 0xc1390144, + 0xffff4ea7, + 0xbd3103ff, + 0xad010841, + 0x9b014403, + 0x31270ef2, + 0xcfff4ea7, + 0xc5c229fd, + 0x25a67043, + 0x0e27fb8e, + 0xbe03e807, + 0xa702b194, + 0xfff71b0e, + 0x0157edbe, + 0x07ec00c8, + 0x33400720, + 0x0b253347, + 0x0c2e2324, + 0x4207fff7, + 0x3c271027, + 0x03410528, + 0x07f3c844, + 0x034c0732, + 0x104c0334, + 0x01121c27, + 0x0544034e, + 0xa834033e, + 0x05c431f1, + 0x28ccd124, + 0xff4ea701, + 0x2cc5fd4f, + 0xc5431164, + 0x42276823, + 0x08e804fd, + 0x2ea7ff00, + 0x27ffffff, + 0x3824bd41, + 0x0f239906, + 0xf49b4027, + 0x8741270e, + 0x4034f533, + 0x8eff02b0, + 0x27b307fb, + 0xbe64060d, + 0xb902b110, + 0xee0108b4, + 0x1eff364d, + 0x000000ef, + 0x000433bc, + 0x0000000e, + 0x01c1f54e, + 0xc5fd2358, + 0xf0c5bcf1, + 0x1702b9c8, + 0xc5130101, + 0x04b978f2, + 0x02a90116, + 0xf4c50114, + 0xc101b17c, + 0xf1c5bcf4, + 0x890131c0, + 0xf8930e44, + 0xc503e6b0, + 0xf1c580f2, + 0x1802d1c4, + 0xbcf1c101, + 0x04d1842d, + 0xf2c50110, + 0x10128974, + 0x4584f4c5, + 0x0b402783, + 0x0d833531, + 0xd5811582, + 0x25022881, + 0x2480d584, + 0x34149902, + 0x13073127, + 0xf2c1143b, + 0x2c81adbc, + 0x35219902, + 0x022c82a9, + 0x83ad313b, + 0xf3c1022e, + 0xbcf1c1bc, + 0x890e3489, + 0x429b3033, + 0x242b432b, + 0x023082ad, + 0x022e83a9, + 0x89101489, + 0x439b3212, + 0x342b422b, + 0x00004f27, + 0x83ad8f00, + 0x84d50232, + 0x03990238, + 0xff3ce062, + 0x4f2704e1, + 0xef000100, + 0x023884d5, + 0x93bcf3c1, + 0x03e613f0, + 0xd5343499, + 0x7e023484, + 0x8409fd9e, + 0xf4c58229, + 0x90f1c190, + 0xd1878441, + 0x0b94f2c5, + 0xe68631d4, + 0x27017c1f, + 0xc5328740, + 0xf4c588f3, + 0x8cf4c5b4, + 0x50a77027, + 0x460b4787, + 0x21dc4201, + 0xedf1536b, + 0x014f07fe, + 0x3c4c0313, + 0x24032101, + 0x44034105, + 0xf2c1f3a8, + 0x50f3c148, + 0x0b68f4c1, + 0x60f3c123, + 0x0b182c03, + 0xb4f3c143, + 0x0b40f1c1, + 0xa1f09334, + 0xd20b03e5, + 0x03b4f3c5, + 0xfd067e51, + 0x00fa0fe6, + 0xc13ef489, + 0x740b94f1, + 0xc1aa71ca, + 0xf3c18cf2, + 0xa125fd90, + 0x03000431, + 0x8cf2c521, + 0x010423ee, + 0x0b88f4c1, + 0x078a1e64, + 0x3c1c031f, + 0xe562f093, + 0xfd497e03, + 0x81b98429, + 0x82d10234, + 0xf19d0238, + 0x23f2050a, + 0x49f39341, + 0x47ee03e5, + 0x33b900ca, + 0x8409022c, + 0x9d8cf1c1, + 0x412308f3, + 0xe532f393, + 0xac14ee03, + 0x2e34b900, + 0x3df25302, + 0x072101fe, + 0x09f49d0f, + 0x02b1fcbe, + 0xe63efe89, + 0xc1ff55ef, + 0xa00748f2, + 0x33bcaf23, + 0x84290004, + 0x2a0bc707, + 0xfe16f353, + 0xf2c5c103, + 0x27412348, + 0xf1f993b0, + 0x0f0703e4, + 0x4cce3101, + 0x99b58647, + 0x94a908f3, + 0x34ce022c, + 0x3894d11f, + 0xff4f8302, + 0x05f7ffff, + 0xb1afbef4, + 0x89a00702, + 0xf2c13efe, + 0xbcaf2348, + 0x03000433, + 0xe2c103b1, + 0x29fefceb, + 0x532a0b84, + 0xc5fdc7f3, + 0x412348f2, + 0x31010f07, + 0xb9bbc4ce, + 0x9d023094, + 0xb21e08f4, + 0xe496f093, + 0xfc147e03, + 0x0540f4c1, + 0x40f4c104, + 0xd30b4301, + 0xb9fef35e, + 0x5e023234, + 0x33b9ff55, + 0x375e0230, + 0xc51027ff, + 0xf2c1b4f1, + 0x038d55b4, + 0x826518dc, + 0x0bc4f3c1, + 0xa4f2c52d, + 0x1618dc23, + 0x0c2c0335, + 0xc1a4f2c5, + 0xf2c1c8f1, + 0x4414c1a4, + 0x01cd42ea, + 0xebaf4ea7, + 0x053027fd, + 0x002f2743, + 0x150e0300, + 0x0ef39b42, + 0xe6c4f3c1, + 0x2703293f, + 0x18bc27c0, + 0xc1c4f3c1, + 0xf335b4f4, + 0x8574f3c1, + 0xc1f365f4, + 0xf3c178f4, + 0xc0f0c17c, + 0x9d17f49d, + 0xf4c116f3, + 0x84f3c180, + 0x0c0b1f07, + 0x270c1c03, + 0xf345182c, + 0x7514f48d, + 0xc477befd, + 0xc0f7c100, + 0x84318c41, + 0xf1c17b0b, + 0x070707bc, + 0xacf4c52c, + 0x8e7e8b09, + 0xd1f093fb, + 0x637e03e3, + 0x0b1707fb, + 0xc584091d, + 0x4fe6b8f1, + 0xdb07028a, + 0x4b87d533, + 0x2027d42b, + 0xc70bdc0b, + 0xc5a8fcc5, + 0xf2c5b0f2, + 0xe1f693a0, + 0xf3c103e5, + 0xa133f9a0, + 0xc5000431, + 0x3fe69cf3, + 0xf2c10249, + 0x9cf3c19c, + 0xf1c14d07, + 0x3323339c, + 0x2b483335, + 0xc5140b32, + 0xf1c598fd, + 0xc1d30b9c, + 0x5027a8f2, + 0xf2c52403, + 0xacf3c1cc, + 0x430b4587, + 0xa2074201, + 0xaff6a183, + 0xf15301ce, + 0x4f07fc74, + 0x4c031301, + 0x0321013c, + 0x03410524, + 0x89f3a844, + 0xf3893cf2, + 0x40f1c13e, + 0xe33af093, + 0x24f28d03, + 0x7e26f38d, + 0xb007faa0, + 0x01ba0fe6, + 0xfba5bb11, + 0x0126afe6, + 0x81d18429, + 0xfdc50238, + 0x23f10530, + 0x11f39341, + 0x45ee03e3, + 0x33b90195, + 0x8409022c, + 0x9da0f2c1, + 0x412308f3, + 0xe2faf393, + 0x7724ee03, + 0x2e34b901, + 0x070f0702, + 0x09f49d16, + 0x02afc8be, + 0xc63ef489, + 0xc007684f, + 0xcf23b507, + 0x000433bc, + 0xa027b103, + 0xe2cef993, + 0x032f1e03, + 0x99a586b1, + 0x94a908f3, + 0x34ce022c, + 0x3894d119, + 0xff4f8302, + 0x05f7ffff, + 0xaf8fbef4, + 0x23c00702, + 0x0433bccf, + 0x3ef48900, + 0x4ac2a103, + 0x0b070725, + 0x0716070d, + 0xc31bbe2c, + 0x07842900, + 0x0741230f, + 0xcedc0b16, + 0x93b9bab4, + 0xf39d0230, + 0x1eb11e08, + 0x30f4c1ff, + 0x4d1b3027, + 0xf4c1f4b5, + 0x34f3c5b0, + 0xb638f4c5, + 0xc11f075d, + 0x1c03ccf0, + 0x182c2724, + 0x00c2e0be, + 0x293ef489, + 0xea540b82, + 0x93fee052, + 0x03e247f4, + 0x09a8f1c1, + 0x9cf4c143, + 0xf1c11405, + 0xc51103a0, + 0x31e2a0f1, + 0x428700fa, + 0xc1a8f3c1, + 0x3c03acf2, + 0xc5240b1c, + 0xf3c5acf2, + 0xfe785ea8, + 0x0798f0c1, + 0x03070b1f, + 0x2c27241c, + 0xc293be18, + 0x98f4c100, + 0xc5184c03, + 0xa91e98f4, + 0xc148fbc1, + 0x070744f1, + 0x2b070d0b, + 0x0730fdc5, + 0xf9a37ecd, + 0x0b50fac1, + 0x4cf1c1cb, + 0x0c0b0707, + 0x927e2a07, + 0xb0f2c1f9, + 0x0760f9c1, + 0x30f4c1dc, + 0x0bb8f0c1, + 0xb0f3c1da, + 0x1b5cf1c1, + 0x07020b4d, + 0xc5f4b529, + 0x6e7e38f3, + 0xb0fcc1f9, + 0xc168fbc1, + 0xc90bb8f0, + 0x0b64f1c1, + 0x7e2b070c, + 0xf4c1f959, + 0x1bcb0b38, + 0xb0fcc54c, + 0x5e34f4c5, + 0x1f07ff2b, + 0xe18af093, + 0x3c1c0303, + 0x5ef96e7e, + 0x34b9fe3b, + 0x8a5e0232, + 0x3033b9fe, + 0xfe6c5e02, + 0xe16ef093, + 0xf8ec7e03, + 0x1540f4c1, + 0xc104050d, + 0xb00740f1, + 0x07071c01, + 0x2c070d0b, + 0x00c1dcbe, + 0x255edc0b, + 0xc54027fe, + 0xd05e98f4, + 0x9a4f27fd, + 0xd5cf0006, + 0x5e023884, + 0x3ea7fb20, + 0xc1fdefff, + 0x4dd85434, + 0x070ffc6a, + 0xe8432723, + 0x5423c1f4, + 0xfc6a3ddc, + 0xc8f1c1f5, + 0x81a4f2c1, + 0x4812c514, + 0xf0c144a3, + 0x7e1485c8, + 0xfd03f937, + 0xcc27f58e, + 0xc0f0c10c, + 0xfefaf193, + 0xbe2c0700, + 0xc100c17d, + 0xbc27c8f4, + 0x484cc524, + 0x4efcc35e, + 0xbc02c1fc, + 0x2ed1c107, + 0x2389012c, + 0x834e0728, + 0x86112742, + 0x83102744, + 0x3380003d, + 0xa80dc117, + 0x24c13f26, + 0x5742d844, + 0x10003d27, + 0xa7a20499, + 0xf7ffff2e, + 0x4dab4183, + 0x43ab41ab, + 0x01c12425, + 0x9c0389ac, + 0xc5e421c5, + 0x3123802c, + 0x998423c5, + 0x0389a304, + 0x8824c59e, + 0x4123430b, + 0x998c24c5, + 0x0089a601, + 0xc5310ba4, + 0x3123a821, + 0xc5ac23c5, + 0x47275820, + 0x8e3424c5, + 0x00eddcfc, + 0x3027ab01, + 0xfe4eab1e, + 0x8fff3ea7, + 0xe33411fd, + 0x1508004d, + 0xff3ea734, + 0x3201fd4f, + 0xf49b4027, + 0x87e1270e, + 0x402ef522, + 0xa7ff02b0, + 0xfdcfff1e, + 0x30074227, + 0x234414c5, + 0x4232d038, + 0x3ea72127, + 0xbdfeffff, + 0x270d9532, + 0x0ef49b40, + 0xbe681ec5, + 0x2702aa30, + 0xff3ea720, + 0x32bdfeff, + 0x40270d95, + 0xa70ef49b, + 0xfdcfff3e, + 0xc54434c5, + 0x2ea76434, + 0x11fd8fff, + 0x004da324, + 0x8e241508, + 0x1e2227fe, + 0xa7f84ebe, + 0xfeffff2e, + 0xd1092499, + 0x83014823, + 0x33d40743, + 0x2b4487d4, + 0x07bd07d4, + 0xb4be23c0, + 0x3fd6ffff, + 0xff4ea768, + 0xd2f1ffff, + 0xff000054, + 0x062c4dd1, + 0x0104039d, + 0x07d22200, + 0x8f20ead2, + 0x650dce00, + 0xac27ed07, + 0xff9ea755, + 0xe02bffff, + 0x41834007, + 0x44333487, + 0x4307340b, + 0x430b4433, + 0x4e23c005, + 0x07fff9c4, + 0x013a0721, + 0x05440348, + 0xa8240328, + 0x0a1499f3, + 0x28104cc0, + 0x062894d1, + 0x40c8401b, + 0x9d41271f, + 0xf88e04c4, + 0x014824d1, + 0xd14441c0, + 0xc0014824, + 0x24d16242, + 0x43c00148, + 0x03f88e1e, + 0xa9fef001, + 0xb499cd05, + 0x844ff604, + 0xa7312700, + 0xfeffff4e, + 0x014843d5, + 0x24b9f88e, + 0x4cd80d99, + 0x40274510, + 0x014824d5, + 0xd007f88e, + 0xff72d0ee, + 0xd4f1d31e, + 0xff000054, + 0x43e20301, + 0xbea70088, + 0xd1ffffff, + 0xc2062cb4, + 0x30272443, + 0xffff4ea7, + 0x4843d5fe, + 0x27f88e01, + 0x0bf49b40, + 0x270ef49b, + 0x5ef80e09, + 0x0827fe7e, + 0x775ef80e, + 0xcf0ea7fe, + 0x19befff9, + 0xd3f102ee, + 0xff000054, + 0xb4d1c001, + 0x04ca062c, + 0xc330c2c6, + 0x577e0527, + 0xbebc1efe, + 0xa700f72a, + 0xffffff3e, + 0x32a9b469, + 0x24ce0102, + 0x27b41920, + 0x1d410330, + 0x0ef39bb4, + 0x4fff4ea7, + 0xcf0ea7fd, + 0x43c5fff9, + 0x4e73be38, + 0xff4f5e01, + 0xde1ebd25, + 0x014423a9, + 0x014224a9, + 0xff2f43ee, + 0x24d54227, + 0xf88e0148, + 0xcf5bf04e, + 0xfe2bdf3b, + 0x0f07fc4e, + 0xfff50fbe, + 0xf00efc0e, + 0xf04eff0b, + 0xdf3bcf5b, + 0xfc4efe2b, + 0xfdbe0f07, + 0xff1efff4, + 0xffff1ea7, + 0x4814d1fe, + 0x6142c401, + 0x11091499, + 0x87438313, + 0x2b443324, + 0xf1338742, + 0x000d4833, + 0x5444f1ff, + 0xcaff0000, + 0x41274334, + 0x270a149d, + 0x0ef49b40, + 0xcfff4ea7, + 0xb93127fd, + 0xc5014012, + 0x14996043, + 0x83296609, + 0x33240743, + 0x2b448724, + 0x5024f924, + 0x36ff0000, + 0xff4ea747, + 0x43d1ffff, + 0x24f10a34, + 0xff000054, + 0x43420127, + 0xfe0b0027, + 0xfe0b0127, + 0x39272027, + 0x24fd4027, + 0xff000a38, + 0xf3982103, + 0x0127fe0b, + 0xfe4efe0b, + 0xffff4ea7, + 0x094499fe, + 0xffff1ea7, + 0x034383ff, + 0xd1348741, + 0x33062012, + 0xf1432b44, + 0x00004843, + 0x2724c6ff, + 0xd10d1e40, + 0x27062c14, + 0x27430a21, + 0x07420720, + 0xabef6be4, + 0x1e2027f1, + 0x2222c004, + 0x24f926a6, + 0xff010d94, + 0x42874846, + 0x300044f1, + 0x44d8ff02, + 0x27420716, + 0x2b410335, + 0x27461032, + 0xf0210331, + 0x0127d8f3, + 0x0027031e, + 0xf1eb0e8b, + 0xfe4efe8e, + 0x00d797be, + 0xffff4ea7, + 0x934411fe, + 0x00fb43f0, + 0x41f14487, + 0xff000d48, + 0x00c69bbe, + 0x219efe0e, + 0xfd4e0033, + 0xd0070419, + 0x48061f6b, + 0xf3931c46, + 0x0104b194, + 0x8df49333, + 0x43050470, + 0x006f0ebe, + 0x004b42be, + 0x369efd0e, + 0x180602b9, + 0xf4933127, + 0x9d04b324, + 0xf3930543, + 0x9302baf6, + 0x047067f4, + 0x7abe4305, + 0x49be0067, + 0x41270029, + 0xfd8ed41d, + 0xb107fb4e, + 0xc207d007, + 0x10270227, + 0x4dbecf6b, + 0xbcd602bb, + 0x4c8b4007, + 0x00ce4fe6, + 0xb2e6fc93, + 0x05c49904, + 0x7fbe4586, + 0x0c070068, + 0x02b887be, + 0x2458c499, + 0x77be204c, + 0x051e006f, + 0x008e1bbe, + 0xb2c2f493, + 0x05449904, + 0xdfbe4546, + 0x57be02b8, + 0x40270068, + 0xfb8ed41d, + 0x008eb2e4, + 0xb2a6f093, + 0x7bf39304, + 0xf49302ba, + 0x99046fec, + 0x43055802, + 0xbe202c24, + 0x1e006edf, + 0x8f40be05, + 0x85fc9300, + 0xcb9904b2, + 0x54c0c558, + 0x002ab4be, + 0x0b071007, + 0x006dddbe, + 0xb1270c07, + 0x02b81bbe, + 0xbe05cb9d, + 0x2702b88a, + 0x0dcb9d40, + 0xbe04c49d, + 0x27004f12, + 0xa7d41d42, + 0xfd4fff4e, + 0x40274301, + 0xa70ef49b, + 0xffffff4e, + 0x270e4499, + 0xcb233b21, + 0xbf3ea724, + 0x2138fd4f, + 0x34054127, + 0x34032153, + 0x312722d6, + 0xcfff4ea7, + 0x6043c5fd, + 0x2ea7fb8e, + 0x99fef2b3, + 0x40ce0824, + 0x0df4930f, + 0x43c104b2, + 0x09249948, + 0xa71834ce, + 0xfd4fff4e, + 0x209d4411, + 0x93240508, + 0x04b1f3f4, + 0x9d484499, + 0xfe0b0924, + 0x0f6bfe4e, + 0xf49308c6, + 0x9904b1e0, + 0x47860544, + 0x02b7fdbe, + 0x0049c4be, + 0x0065f0be, + 0x6f1af393, + 0x93330104, + 0x04b013f4, + 0xfe8e4305, + 0x2ea7fd4e, + 0x27fdeb27, + 0x27230530, + 0x0400004f, + 0x0724150d, + 0x0ef39bd0, + 0x1c03e007, + 0x24ec0324, + 0xefff2ea7, + 0xe8031efd, + 0xd424c1f3, + 0x4c333327, + 0x1d4c5318, + 0xa7f144c0, + 0xfde4bf4e, + 0x3d274e05, + 0x431506aa, + 0x42352027, + 0xe4af4ea7, + 0x154105fd, + 0xff0ea743, + 0xe30bfdef, + 0x031e4235, + 0x04c1f3e8, + 0x333327dc, + 0x4c53184c, + 0xf144c01d, + 0xe49f4ea7, + 0x274e05fd, + 0x1506aa2d, + 0x35302742, + 0xa7120b43, + 0xfde48f4e, + 0x42154105, + 0xf4934335, + 0x4404af88, + 0x000000df, + 0xa74101ff, + 0xffe3ff0e, + 0x40010e1e, + 0xe3ff1ea7, + 0xe8051eff, + 0xa7061ef3, + 0xfdefff2e, + 0x27dc24c1, + 0x184c3333, + 0xc01d4c53, + 0x4ea7ea44, + 0x05fde49f, + 0x002d2740, + 0x27421504, + 0xa7433530, + 0xfde48f4e, + 0x42154105, + 0xfd8e4335, + 0xaf32f493, + 0xa7400104, + 0xffffff1e, + 0xa7ff175e, + 0xfdefff2e, + 0xf3e8031e, + 0x27d424c1, + 0x6a4ddc33, + 0x051ef5fc, + 0x061ef3e8, + 0xefff2ea7, + 0xdc24c1fd, + 0x4ddc3327, + 0x0beefc6a, + 0xa7fc4efe, + 0xffffffde, + 0x10270227, + 0x0620dcd1, + 0x02b8efbe, + 0x0a40d4b9, + 0xc4863127, + 0x41533027, + 0x41c3308b, + 0x44c6438b, + 0xfc8e0127, + 0x4fff4ea7, + 0x274301fd, + 0x9b402700, + 0x21270ef4, + 0x3b0ed499, + 0xa724cb23, + 0xfd4fbf3e, + 0x41272138, + 0x21533405, + 0x22d63403, + 0x4ea73127, + 0xc5fdcfff, + 0xfc8e6043, + 0x0227fe4e, + 0x99be1227, + 0x2ea702b8, + 0xb9ffffff, + 0x530a4024, + 0x38408b41, + 0x8e012741, + 0xff4ea7fe, + 0x4301fd4f, + 0x40270027, + 0x990ef49b, + 0x21270e24, + 0x24cb233b, + 0x4fbf3ea7, + 0x272138fd, + 0x53340541, + 0xd6340321, + 0xa7312722, + 0xfdcfff4e, + 0x8e6043c5, + 0xa7fb4efe, + 0xffffffde, + 0x3610d499, + 0x27fbab4f, + 0x0dfc9bc0, + 0xa70efc9b, + 0xfd7fff3e, + 0x01273411, + 0x00004ea3, + 0xbe341504, + 0xa700bf28, + 0xfd4fff4e, + 0x31274201, + 0x6d17f493, + 0x9d431d04, + 0xd39d0fd2, + 0x04b0be10, + 0x0fd49900, + 0x270efc9b, + 0xf5448731, + 0x02b04043, + 0x93fbebff, + 0x04adfbf0, + 0xfb0e1127, + 0xfffc459e, + 0xfb4efb8e, + 0xc321c207, + 0xc4012211, + 0x1007b107, + 0xf778f093, + 0xc2bebe00, + 0x27bf6b00, + 0x07c231d0, + 0x95f0931d, + 0xd10300f7, + 0x00c2abbe, + 0xdcc4c403, + 0xbc46ec0f, + 0xdea7c027, + 0x41fdbfff, + 0x8749e6d4, + 0xb042f14c, + 0x07000150, + 0x7ff0931c, + 0x85be00f7, + 0xd14100c2, + 0xf78cf093, + 0xc27abe00, + 0x93d15100, + 0x00f791f0, + 0x00c26fbe, + 0xd4454027, + 0xdc03c103, + 0xc8c8c420, + 0x6c73f493, + 0x06441904, + 0x9efb0e45, + 0x0e00023a, + 0xfb989efb, + 0x6bfd4eff, + 0x9305260f, + 0x00f771fd, + 0xfd93061e, + 0x0700f775, + 0x270d0721, + 0xff607e11, + 0x01271d07, + 0x00c5699e, + 0x01271007, + 0xf94ed81e, + 0xffffeea7, + 0xff1ea7ff, + 0xe399feff, + 0x0814992a, + 0xaf6ba007, + 0x0127342e, + 0x2ea7f98e, + 0x79ffffd7, + 0x2744d624, + 0x79f98e02, + 0x07247923, + 0x274f4b93, + 0x27400c30, + 0x07241931, + 0x874383c3, + 0x2c40f144, + 0x99ff0000, + 0x200744e4, + 0x9909149d, + 0xcf6b0911, + 0xd1071383, + 0xd4334187, + 0x2c83d42b, + 0xb4de230f, + 0xc8a6ffff, + 0x0724e399, + 0x2c4f4b43, + 0x24e29d40, + 0x234e0e1e, + 0xf1930327, + 0x9e00f6f4, + 0x7900c4e2, + 0x2744c6d4, + 0x66f98e04, + 0xff4ea7a6, + 0x3127d07f, + 0x44314335, + 0x08274120, + 0xe007f98e, + 0x6610ec53, + 0x234107c9, + 0x87438341, + 0x2b443334, + 0x5244e943, + 0x27ff0000, + 0x5dd27d30, + 0x1dd46dd3, + 0x38d23dd3, + 0x412780ec, + 0x9d04d49d, + 0xd49905de, + 0x4b202705, + 0x2740084f, + 0xc3d45921, + 0x074103e1, + 0x83d45d3e, + 0xff4ea731, + 0xb207feff, + 0x014143bd, + 0xbac6bf6b, + 0xffff2ea7, + 0x4023c1ff, + 0x4007c866, + 0x23c54853, + 0xf64f6b3c, + 0x203ca744, + 0x340b031e, + 0xffff4ea7, + 0x4043c5ff, + 0xd49d4027, + 0xa7d32504, + 0xfeffff4e, + 0x013c43d5, + 0x4ea7a936, + 0xb9feffff, + 0xdc0d9944, + 0x31271248, + 0x7fff4ea7, + 0x1e4335d0, + 0xe8432707, + 0xa7061ef4, + 0xd07fff3e, + 0x41c43431, + 0xff1ea7f1, + 0x14b9feff, + 0x45760141, + 0x4ea73127, + 0x45d07fff, + 0x83290743, + 0x21c40f2c, + 0xff3ea71b, + 0x3499ffff, + 0x9d410344, + 0x41274434, + 0x014014bd, + 0x7fff4ea7, + 0xbe4255d0, + 0x1902e609, + 0xd71ea7d4, + 0x4103ffff, + 0x1479d41d, + 0x230f4c83, + 0xab240741, + 0x1928362f, + 0x1d410314, + 0x39131914, + 0x1334ce14, + 0x43831419, + 0x42f14487, + 0xff00002c, + 0xa30f2c83, + 0x3ea7802c, + 0x7dffffd7, + 0x03345932, + 0xe6345d41, + 0x9b402705, + 0x3ea70ef4, + 0xc5fd4fff, + 0xb4e63834, + 0x8e100c27, + 0x200c27f9, + 0xfe0bf98e, + 0xab5af293, + 0x03230104, + 0xf4937f0c, + 0xe304ab4c, + 0x030b7f0c, + 0x20054401, + 0x040b0307, + 0xfe4efe0b, + 0xf5f6f093, + 0xc012be00, + 0xd2dfbe00, + 0xf954be00, + 0x09dcbeff, + 0x0f7cbe00, + 0x9efe0e00, + 0x4e005b5d, + 0xff3ea7fd, + 0x3dc1fd4f, + 0xe34d0768, + 0xc0f00f4d, + 0x6301004f, + 0xf0932256, + 0xbe00f5e2, + 0x9300bfdc, + 0x00f604f0, + 0x71021f27, + 0xcdbe5663, + 0x1d0700bf, + 0xf619f093, + 0xc1321e00, + 0x34c17c32, + 0x004fd874, + 0x34200000, + 0x933121d8, + 0x00f5b1f0, + 0x00bfabbe, + 0xf650f093, + 0x78f19300, + 0x9dbe00f6, + 0xf09300bf, + 0x9300f673, + 0x00f69bf1, + 0x00bf8fbe, + 0xf1930427, + 0x9e00f601, + 0xa700c2c2, + 0xfd4fff3e, + 0x3c7034c1, + 0x7434c148, + 0x00004f5c, + 0x04270800, + 0xf678f193, + 0xa7e11e00, + 0xd07fff2e, + 0x24a121a1, + 0x830c4c53, + 0x4cc00f4c, + 0x24a1270f, + 0x285322a1, + 0xd00f2c83, + 0x1d831f23, + 0xf0930fff, + 0x2700f66d, + 0xbe422732, + 0x2700bf38, + 0x97f19304, + 0xa81e00f6, + 0x24a124a1, + 0xfe4efd8e, + 0xffff3ea7, + 0x994027ff, + 0x34bd0d32, + 0x2410063a, + 0x42872027, + 0x53f041f1, + 0x01270001, + 0x00c2459e, + 0xb007fb4e, + 0xbff6bf6b, + 0x007e00a0, + 0x2382beff, + 0xcd3ea700, + 0x4027fff9, + 0x343d341d, + 0xffdf3ea7, + 0x27051eff, + 0x01f4e846, + 0xa7d3563d, + 0xfd4fff4e, + 0x0e274401, + 0x33040000, + 0x054aa344, + 0x2d55be34, + 0xe1fc9300, + 0xc00504a9, + 0xffdf0ea7, + 0xc341beff, + 0xb6c40100, + 0x93012745, + 0x00f652f1, + 0x00c1e59e, + 0xf71b0ea7, + 0xbe1227ff, + 0x2700ce0d, + 0xd73ea740, + 0x341dffff, + 0x347d343d, + 0xffffcea7, + 0x25c49dff, + 0xc52ac49d, + 0xcdc53ccd, + 0x2d3bbe40, + 0xf736be00, + 0x2453beff, + 0x09bcbe00, + 0x49a0be00, + 0x4a0dbe00, + 0x44cd9d00, + 0x0a41cdbd, + 0xeebe0b07, + 0x3027000f, + 0xffff4ea7, + 0x25439dff, + 0x0b9efb8e, + 0xec9e0048, + 0xfd4e0047, + 0xffff4ea7, + 0x094499fe, + 0x43832027, + 0xd433d407, + 0xd42b4487, + 0xffb4de23, + 0xd70ea7ff, + 0x1427ffff, + 0x4f4b0479, + 0x04194048, + 0x24ce4383, + 0x87210318, + 0x2834f132, + 0x23ff0000, + 0x004ea321, + 0x34f58000, + 0xff000028, + 0xf1f02103, + 0xe38dbed8, + 0x9d412702, + 0xd41904d4, + 0x41033027, + 0xf39bd41d, + 0xff4ea70e, + 0x43c5fd4f, + 0x0ef39b38, + 0xffff4ea7, + 0x0e4399ff, + 0x4fbf2ea7, + 0x273138fd, + 0x53240541, + 0xd6240331, + 0x4efd8e32, + 0x4780befe, + 0x0f2ebe00, + 0x9efe0e00, + 0x4e00158f, + 0xbe0027fe, + 0x0e00530d, + 0x0ee79efe, + 0x486f9e00, + 0x09fd4e00, + 0x76d00704, + 0x93042745, + 0x00f55bf1, + 0x49500a1e, + 0xf1930427, + 0x9e00f57e, + 0x1100c0be, + 0xfe4f5804, + 0x27ffffff, + 0x93f19304, + 0xec1e00f5, + 0x4d500429, + 0x04270100, + 0xf5a8f193, + 0xbedd1e00, + 0xa702e2f3, + 0xffffd70e, + 0x03190439, + 0x43cc432b, + 0x1101393a, + 0x090339d4, + 0x33d229de, + 0xec83104c, + 0xab31030f, + 0x3d2833e4, + 0xab138303, + 0x791187e2, + 0x2c1ef504, + 0x27ff0000, + 0x83467621, + 0x4e070fec, + 0xff804fa3, + 0x047dffff, + 0x2027031e, + 0xf49b4027, + 0xff3ea70e, + 0x34c5fd4f, + 0x27259638, + 0x6cf19301, + 0x785e00f5, + 0x273301ff, + 0x0ef49b40, + 0xffff4ea7, + 0x0e4499ff, + 0x233b2127, + 0x3ea724cb, + 0x38fd4fbf, + 0x05412721, + 0xc6215334, + 0x1e340324, + 0x4efd8ef3, + 0x15f293fe, + 0x302704ab, + 0x0ea7e027, + 0x27fffe73, + 0x0401221c, + 0x00004e83, + 0x0344d603, + 0xc4191e31, + 0x0300004e, + 0x16241913, + 0x83242146, + 0xffff004e, + 0xff004e04, + 0x03e103ff, + 0x2c03180c, + 0x0c32d410, + 0xe5363486, + 0x27ccf1f0, + 0x27fe8e00, + 0x4efe8e01, + 0x100499fb, + 0x4153d127, + 0x073803c1, + 0x3bc207b1, + 0x6bd3abd4, + 0x27cf6bbf, + 0x112c2710, + 0x413b4127, + 0x11034d8b, + 0x04994d86, + 0x33e40768, + 0xb0ef03e4, + 0xc0000507, + 0xb915ff4c, + 0xb9018ce3, + 0x2b018de4, + 0xbd4c2b3b, + 0xbd018de4, + 0x99018ce3, + 0xe4076904, + 0xef03e433, + 0x000507b0, + 0x15ff4cc0, + 0x018ce3b9, + 0x018de4b9, + 0x4c2b3b2b, + 0x018de4bd, + 0x018ce3bd, + 0xf2f00203, + 0x4efb8ea8, + 0x081499fe, + 0x41d8e107, + 0x7403993d, + 0x0fff3cc0, + 0x300b3433, + 0x018d34b9, + 0x34bd4123, + 0xe299018d, + 0x33120707, + 0x74029d14, + 0x14b9100b, + 0x3207018d, + 0x41033533, + 0x14bd2333, + 0x322b018d, + 0x019433f1, + 0x03c5ff00, + 0x74039978, + 0xc109e39d, + 0x26067802, + 0x300b3433, + 0x018d34b9, + 0x34bd4103, + 0x0207018d, + 0xfb4efe8e, + 0xb007d107, + 0xffdf0ea7, + 0xc044beff, + 0x34d3c100, + 0x3c830127, + 0xf933330f, + 0x00007c34, + 0xa31d07ff, + 0x7c34fd44, + 0x99ff0000, + 0xd3c110d4, + 0x3b415338, + 0x681c0304, + 0xc02703ab, + 0x2711ec27, + 0x8b4c3b41, + 0x46c10340, + 0x0714194c, + 0x0b243324, + 0xff4cc02b, + 0x8d23b915, + 0x8c24b901, + 0x03310301, + 0x8c24bd41, + 0x8d23bd01, + 0x07143901, + 0x0b243324, + 0xff4cc02b, + 0x8d23b915, + 0x8c24b901, + 0x03310301, + 0x8c24bd41, + 0x8d23bd01, + 0xf0120301, + 0xd499b2fe, + 0xff4cc007, + 0x33340731, + 0x2b433335, + 0x8c34f134, + 0xe3ff0001, + 0x0300004e, + 0x00004ea3, + 0x8c34f502, + 0xc1ff0001, + 0xdd9944d4, + 0x9434f534, + 0xfdff0001, + 0x00018c3d, + 0xdf0ea7ff, + 0xfb0effff, + 0x00bf629e, + 0x4007f94e, + 0x070f4c83, + 0x33248734, + 0x07322b35, + 0x2bd333d3, + 0xe8df03d3, + 0x0700050b, + 0x07dc99a4, + 0x9007a333, + 0x0ea7ba07, + 0x23ffffdf, + 0xffff84be, + 0x00bf51be, + 0x1cffccc0, + 0x3c074c07, + 0x35334333, + 0x34f1342b, + 0xff00018c, + 0x00004ea3, + 0x8c34f503, + 0xf9ff0001, + 0x00007ca4, + 0x0a44d8ff, + 0x11270d07, + 0xf47e2127, + 0xffccc0fd, + 0x074c073e, + 0x3343333c, + 0xf1342b35, + 0x00019434, + 0x0749a6ff, + 0x50d3c14c, + 0x4f034433, + 0x000507b0, + 0x019043d5, + 0xbd58d399, + 0x99018e43, + 0x43bd5ad3, + 0xaaf90194, + 0xff000080, + 0x018f4abd, + 0xb499281e, + 0xc1488604, + 0xd19950d0, + 0xbe21275a, + 0xc1002873, + 0xb29950d0, + 0x58d19904, + 0x21230403, + 0x002862be, + 0xb49d4027, + 0x05b29904, + 0x9954d0c1, + 0x50be59d1, + 0x20270028, + 0x9905b29d, + 0x3cc009d3, + 0x343313ff, + 0x07b03f03, + 0x34b90005, + 0x4123018d, + 0x018d34bd, + 0xb21db459, + 0xb45d4123, + 0xffffcea7, + 0x00c4b9ff, + 0x23910301, + 0x00c4bd41, + 0xacd4c101, + 0x19fcc9c5, + 0x79f19343, + 0x12d104a6, + 0x41270430, + 0x42cb433b, + 0x14d53027, + 0xd3c50430, + 0xdf0ea7ac, + 0x28beffff, + 0xc19900be, + 0xcd0ea70e, + 0xf90efff9, + 0x00c1569e, + 0xd007fd4e, + 0x330fdc83, + 0xdf0ea7d3, + 0x2bbeffff, + 0xd4f900be, + 0xff00007c, + 0xa3104c3c, + 0xd4fd104c, + 0xff00007c, + 0xffdf0ea7, + 0xbdedbeff, + 0xff4ea700, + 0x4199ffff, + 0xcd0ea70e, + 0xfd0efff9, + 0x00c1169e, + 0xf323f74e, + 0x20273f07, + 0x050c4c27, + 0xc8340332, + 0x85fd93f4, + 0x0ea704a7, + 0x07ffffdf, + 0xbddcbe7d, + 0x6fbea700, + 0x9027fffe, + 0x7c238027, + 0x23ab0740, + 0xd8a401a4, + 0x0300004e, + 0x06d41923, + 0x09d39948, + 0x09ff3cc0, + 0x340b4f07, + 0x341d4127, + 0xc00ad399, + 0x0709ff3c, + 0x27310b1f, + 0x01341d41, + 0x004e83a4, + 0x4ee40300, + 0x89030000, + 0x76dc3900, + 0xe6b411c9, + 0xe6d47948, + 0x99d01147, + 0x212708d1, + 0x002722be, + 0xd279d011, + 0x0403d159, + 0x14be2123, + 0x40270027, + 0xbc15d47d, + 0xdc199127, + 0x40a7c9d6, + 0x9d0bd399, + 0xd49d0ad4, + 0x2135a609, + 0x27a5beb0, + 0x9d402700, + 0xd4990bd4, + 0x0145a60c, + 0x2795beb0, + 0x9d402700, + 0xbc050cd4, + 0xd209bc25, + 0xa4012916, + 0x4ee33707, + 0x05030000, + 0x0eb28da4, + 0xf2934027, + 0x8d04a6bc, + 0x272b0cb4, + 0x842e3419, + 0x341d40a7, + 0xf2983103, + 0xdc038103, + 0x18bc0310, + 0x32228ce4, + 0x07d027ff, + 0x194d0b4f, + 0x07469644, + 0x095dbe0d, + 0x2709ab00, + 0x27048640, + 0x6b940741, + 0xc4d1039f, + 0xa7e130dc, + 0xffffdf0e, + 0x00bcb2be, + 0x4ea79666, + 0x99ffffff, + 0x0ea70e41, + 0xbefff9cd, + 0x0300bfdb, + 0x4ef78ef3, + 0x050499f8, + 0x4fe6c007, + 0x089900bf, + 0x33380707, + 0xb03f0334, + 0xb9000507, + 0xe4019534, + 0x00a9ff4c, + 0x01963ab9, + 0xa0fface4, + 0xfe967e00, + 0x8922cb89, + 0xc49924cd, + 0x0fbc0306, + 0x730fdc03, + 0xc6d473b4, + 0x53d10344, + 0x070b07d1, + 0x0793be1d, + 0xc0900700, + 0x992dff0c, + 0x4ba606c4, + 0xd804c499, + 0x71be0b41, + 0xca070006, + 0x361ed027, + 0x072944dc, + 0xbe1d070b, + 0x0700076d, + 0xff0cc4c0, + 0xbe09070b, + 0x270008ab, + 0x07471e40, + 0x064abe09, + 0x07d00700, + 0x0642be0c, + 0xbe0b1e00, + 0x0700063c, + 0x27ca07d0, + 0x07480700, + 0x03443338, + 0x0507b04f, + 0x33353300, + 0x9549bd83, + 0xf5382b01, + 0x0001983d, + 0x964cbdff, + 0xf5412701, + 0x00019030, + 0x27031eff, + 0x8e040741, + 0xa7fa4ef8, + 0xffffff4e, + 0xb9fc4cc1, + 0x0b01004b, + 0xf9241ebc, + 0x00007cd4, + 0x224c83ff, + 0x270e42c4, + 0x7ed4fd41, + 0x07ff0000, + 0xfc427e0c, + 0xd4fd4027, + 0xff00007c, + 0xdc07c103, + 0x330fdc83, + 0xd4cbcad3, + 0xa54af493, + 0x03240704, + 0x07021f2d, + 0x7f2ce334, + 0x197f3ce3, + 0x803c0334, + 0x93f932c2, + 0x04a3a3fd, + 0xc074d399, + 0x3319ff3c, + 0x3c3f0334, + 0x39000509, + 0x3d412334, + 0x9d40a734, + 0x402774d4, + 0x7e78d4c5, + 0x0ea7fd74, + 0xbeffffdf, + 0xc100bb66, + 0x4ea748dc, + 0x27ffffff, + 0xe043d530, + 0x0043bd0c, + 0x302d2701, + 0xfc4cc503, + 0x06244cd5, + 0xfe730ea7, + 0xbe1027ff, + 0x0700add8, + 0x8c3d033d, + 0x27202701, + 0x3205884c, + 0xf4c83403, + 0xa4cff493, + 0x35fb9304, + 0x3c2704a3, + 0x1da0a722, + 0x074a3d4a, + 0x104c03db, + 0xb4c1f390, + 0x9946a640, + 0xf0933fb1, + 0x2704a358, + 0x24a5be21, + 0xc5402700, + 0x7ebe40b4, + 0x0c070007, + 0x001a0cbe, + 0x0ea74027, + 0xc5ffffdf, + 0xba9d48bc, + 0x78b4c574, + 0xb89efa0e, + 0xfa4e00ba, + 0xf093f523, + 0xbe00ef34, + 0x9300b620, + 0x00ef44f0, + 0x00b617be, + 0xfe72cea7, + 0x5afd93ff, + 0xa02704a4, + 0xb123bc07, + 0xeed8be01, + 0x4b030000, + 0xd319d059, + 0xd419d123, + 0xd299d103, + 0x09d19908, + 0xf115f205, + 0xd139b201, + 0x83122c53, + 0x19f22521, + 0x10ec53c2, + 0xc2c1f235, + 0x3bf05507, + 0x45f06501, + 0x0bc2c1f2, + 0xf2751a07, + 0xcec12e07, + 0x93238303, + 0x00ef2df0, + 0xb5befe85, + 0xa10300b5, + 0x0310dc03, + 0xacc418cc, + 0xf0939f22, + 0xbe00ef4e, + 0xa700b5a0, + 0xffffffce, + 0x0100c1b9, + 0x93fcc2c1, + 0x00ef4df0, + 0x00b58bbe, + 0xef5af093, + 0xb582be00, + 0xfccbc100, + 0x0100cab9, + 0x975eab0b, + 0x7e24f900, + 0x03ff0000, + 0x963407b1, + 0x7c24f945, + 0xe6ff0000, + 0xf900814f, + 0x00007f2e, + 0x832cf9ff, + 0x99ff0000, + 0x22f907d4, + 0xff00007c, + 0xfc15fe05, + 0x2505de99, + 0x38dec1fe, + 0xde99fe35, + 0x99fe4568, + 0xfe5569de, + 0x656ade99, + 0x6bde99fe, + 0xde99fe75, + 0x99fe856c, + 0xfe956dde, + 0xa56ede99, + 0x6fde99fe, + 0xde99feb5, + 0x30fec570, + 0xc571de99, + 0xde9934fe, + 0x38fec572, + 0xc573de99, + 0xde993cfe, + 0x40fec574, + 0xc575de99, + 0xde9944fe, + 0x48fec576, + 0xc577de99, + 0xe1be4cfe, + 0x4b0700b4, + 0x070f4c83, + 0x33248734, + 0x07322b35, + 0x2bd333d3, + 0x032407d3, + 0x050be8df, + 0x07233300, + 0xcff0931b, + 0xbaea00ee, + 0xf503ff45, + 0xf493fa8e, + 0xa704a170, + 0x74439d30, + 0x43c53027, + 0x8c4d0378, + 0x03240701, + 0x07021f2d, + 0x7f2ce334, + 0x197f3ce3, + 0x803c0334, + 0x93f932c2, + 0x04a2dcf4, + 0xa7222c27, + 0x3d431d30, + 0x104c0343, + 0x4ea7f2a0, + 0xbdffffff, + 0x0b010143, + 0x07fc4efe, + 0x66fcabd0, + 0xdf0ea7c5, + 0x0bbeffff, + 0x3ea700b9, + 0xc1ffffff, + 0x4d22fc34, + 0x1e3fdc27, + 0x0033b918, + 0x3a4d1b01, + 0x1ed02743, + 0x0fdc830c, + 0xddf9d333, + 0xff00007c, + 0x0ea7c566, + 0xbeffffdf, + 0xeb00b8b7, + 0x8e0d07fc, + 0x63f54efc, + 0x074f6bf0, + 0xdf0ea770, + 0x9107ffff, + 0x6207b307, + 0xf5c1f405, + 0x34fac130, + 0x00b8b5be, + 0x2c832607, + 0x0723330f, + 0x6b4027c2, + 0x84ce23bf, + 0x3327ffff, + 0x007e23fd, + 0x2bfdff00, + 0xff00007f, + 0x008224fd, + 0xc603ff00, + 0x9899c43d, + 0x0c949937, + 0xc6231b07, + 0x7d998183, + 0xe644d607, + 0xfd00ca8f, + 0x00007f21, + 0xffdce4ff, + 0xecbe00bf, + 0x08c6fff6, + 0x0ea73027, + 0x27fffe73, + 0x0201221c, + 0x83180c03, + 0x0300002e, + 0x31032506, + 0x091ef178, + 0xdf6bd307, + 0x0fffdcc4, + 0xffdf0ea7, + 0xb815beff, + 0x5e072700, + 0x4d070126, + 0x43333d07, + 0x342b3533, + 0x018c34f1, + 0x32f5ff00, + 0xff000194, + 0x00004ee3, + 0x004ea303, + 0x34f50100, + 0xff00018c, + 0x07047299, + 0x3310274d, + 0x8d32fd44, + 0x03ff0001, + 0x0507b04f, + 0xf520a700, + 0x00019831, + 0x9642bdff, + 0x9542bd01, + 0x8c34f101, + 0xf5ff0001, + 0x00019031, + 0x004ee3ff, + 0x34f50400, + 0xff00018c, + 0xed309489, + 0x00019c34, + 0x9c34e9ff, + 0x89ff0001, + 0x4c033292, + 0xed44530f, + 0x00019e32, + 0xa034edff, + 0xb1ff0001, + 0x074d1df4, + 0x077d9d4a, + 0x4d1d4b0b, + 0x42dcc419, + 0x07002711, + 0x16d7be16, + 0x19084600, + 0x1d42a3c4, + 0x965401c4, + 0x95f49346, + 0x4099049f, + 0x27160726, + 0x531abe20, + 0x01500501, + 0xa745f654, + 0xffffdf0e, + 0x00b746be, + 0x571e0827, + 0xc49d4127, + 0x9d402704, + 0x949905c4, + 0x0144c60c, + 0x464496f4, + 0x073d0786, + 0x3333334d, + 0xf5432b45, + 0x00019445, + 0x23c459ff, + 0x99c45d41, + 0x46b63694, + 0xdc047499, + 0xb1c30944, + 0xad1dab0b, + 0x74990e1e, + 0xc3455616, + 0xa7ab0bb1, + 0xa7a41d40, + 0xffffdf0e, + 0x00b6eebe, + 0xf0430027, + 0xfa4ef58e, + 0x0ea7a007, + 0xbeffffdf, + 0xbe00b6fe, + 0xa7001daf, + 0xfeffff4e, + 0x83094499, + 0x33348743, + 0xf9432b44, + 0x00004d44, + 0x0b4403ff, + 0x0ea4ca40, + 0xffdf0ea7, + 0xb6b1beff, + 0x8e0b2700, + 0x832a07fa, + 0x42070f2c, + 0x43f94333, + 0xff00007c, + 0xce23c407, + 0xf6ffff84, + 0x0700a63f, + 0x87453342, + 0x07432b32, + 0x2be333e4, + 0xe8ef03e4, + 0xc100050b, + 0xeac5ace4, + 0x1946e634, + 0xa5f29341, + 0x23d1049e, + 0x41270430, + 0x43cb413b, + 0x043024d5, + 0x9e92f493, + 0x3443d104, + 0x304bd104, + 0xab002704, + 0x53051e3b, + 0x07010331, + 0x16d183d3, + 0x11f493d3, + 0x200704af, + 0x41013127, + 0x4ea7303b, + 0x33fd4fff, + 0xab293307, + 0x11202b3b, + 0x59f49340, + 0x43d5049e, + 0x120b0430, + 0xc5e410c5, + 0x4127ace1, + 0xc41d30a7, + 0xc37d4027, + 0x3d05cd9d, + 0x04cd9dc4, + 0xa707e39d, + 0xffffff3e, + 0x010034b9, + 0x3ac544b6, + 0xbd4103fc, + 0xa7010034, + 0xffffdf0e, + 0x00b5e6be, + 0xfa8e0027, + 0x9c7af293, + 0x303c2704, + 0x28032419, + 0x01274124, + 0xf398fe0b, + 0xfe0b0027, + 0x03330f6b, + 0x061c00f1, + 0xfe0b0005, + 0x9c56f393, + 0x9034a904, + 0xa9404e01, + 0x27019234, + 0x27140e00, + 0x0b0f6b01, + 0x93fe4efe, + 0x049c3bfe, + 0x0184e4d1, + 0xd11040ce, + 0xce0180e4, + 0x02070941, + 0xcd3e1307, + 0x0127031e, + 0xfe8e0f6b, + 0xfd93fd4e, + 0xd1049c18, + 0x86018cd0, + 0xb3d3be09, + 0x27402700, + 0xd4d5602c, + 0x3d07018c, + 0x42071027, + 0x21233105, + 0xf4b83403, + 0x9bf2f393, + 0xad402704, + 0xad019232, + 0x8e019034, + 0x93fb4efd, + 0x049bdff3, + 0x018434d1, + 0xb107c007, + 0x40ced207, + 0x8034d10d, + 0xd1412e01, + 0x0e018834, + 0x93a63e24, + 0x049bbff4, + 0x01884dd5, + 0x01844cd5, + 0x01804bd5, + 0xfc4efb8e, + 0x9baafc93, + 0x8cced104, + 0xd1f06301, + 0xd10180c1, + 0xa90184c2, + 0xa90190c3, + 0x930192c4, + 0x00eae6f0, + 0x61befe05, + 0xf09300b0, + 0xbe00eb26, + 0x2700b058, + 0x11c219d0, + 0x931d07c3, + 0x00eb35f0, + 0x45bed103, + 0xc80300b0, + 0xea30dcc4, + 0xeb37f093, + 0x0ef04300, + 0xb0329efc, + 0x93fb4e00, + 0x049b53fd, + 0x0190d4a9, + 0xc107b007, + 0xd4a9402e, + 0x144e0192, + 0xadff237e, + 0xad0192dc, + 0x930190db, + 0x049b33f3, + 0x018c34d1, + 0x00ec4ff6, + 0x01883dd1, + 0x019234a9, + 0x018032d1, + 0x019030a9, + 0x0711d3d8, + 0x030703e4, + 0xe307e3e8, + 0x001d27e7, + 0x07081e10, + 0x27e103e4, + 0x4207801c, + 0x2cd84283, + 0x45060f20, + 0x02902d27, + 0x2d27131e, + 0x0d1e01e0, + 0x2d274506, + 0x051e0200, + 0x01802d27, + 0x070dd1d8, + 0x7f4c8342, + 0x2c0344e6, + 0x07242b80, + 0x333e9b30, + 0x07112334, + 0x03418b43, + 0x0b44c611, + 0x07342b31, + 0x07109b12, + 0x0301872e, + 0x53400723, + 0x7f4c8322, + 0x44e62123, + 0x2b800c03, + 0x1b428704, + 0x07419b4e, + 0x7f1c8314, + 0x4c0314e6, + 0x07412b80, + 0x0bd29bd0, + 0x85fc93d3, + 0xd40b049a, + 0xc4d10d07, + 0x0c030184, + 0x07049b20, + 0xbe212710, + 0x0700b3c7, + 0x07e0271c, + 0x8cc0d5bc, + 0x03181e01, + 0xe63007e1, + 0x203c0324, + 0x4227322b, + 0x141d0307, + 0x0d0b1315, + 0xb4d11803, + 0x20070184, + 0xca1f2c83, + 0xf493dee4, + 0xd1049a3c, + 0x27018443, + 0x1e310300, + 0x1824f918, + 0xc4000506, + 0x41270d42, + 0x24fd0f6b, + 0x00050618, + 0x0103fb8e, + 0x23332007, + 0x0c27f310, + 0x6bfb8eff, + 0x0303330f, + 0x0506180f, + 0x20041900, + 0x0b002741, + 0x1d4227fe, + 0x0b012704, + 0x27fd4efe, + 0x030d07d0, + 0xc4dd3ed1, + 0x8ef730dc, + 0x79f293fd, + 0x20c1049b, + 0xff3ea748, + 0x30d5ffff, + 0x34d10628, + 0x10270628, + 0x062c34d5, + 0x34bd40a7, + 0x40270109, + 0x010a34ad, + 0xd506219d, + 0x9d0a3430, + 0xfe0b0821, + 0x9b46f393, + 0x04329904, + 0x22e31027, + 0x34d54027, + 0x319d0404, + 0x04329d06, + 0x0b08319d, + 0x6bfe4efe, + 0x6f0fd60f, + 0xffff3ea7, + 0x2830d5ff, + 0x2c30d506, + 0xcf4ea706, + 0x401dfff9, + 0x1027403d, + 0x010231ad, + 0xbd0f4c27, + 0xa7010834, + 0x0934bd40, + 0xf9f29301, + 0x31ad049a, + 0x4027010a, + 0x9d08249d, + 0xec270620, + 0x3430d520, + 0x2030d50a, + 0x4030bd06, + 0xa720270d, + 0xfffef33e, + 0x32054e07, + 0x3403e123, + 0x40a7f4b8, + 0xfe7b3ea7, + 0x933405ff, + 0x049abff4, + 0x04044ed5, + 0x3ea7fe8e, + 0x99ffffff, + 0x42242534, + 0x34ad4027, + 0xfe8e010a, + 0x3ea7f54e, + 0x99ffffff, + 0x4fe62734, + 0xf4930123, + 0x99049a94, + 0x4ff60844, + 0x31d10117, + 0x39d10628, + 0x30a9062c, + 0x912b0102, + 0x010434a9, + 0x042b2907, + 0x141e2103, + 0x89ca4389, + 0x430bc844, + 0x4f8b402b, + 0x031d41cc, + 0x07912311, + 0x87418341, + 0x0b443334, + 0x33430734, + 0x23430b44, + 0xfff9c44e, + 0xa7d6f2f0, + 0xffffff4e, + 0x70278407, + 0x9a36f693, + 0xff5ea704, + 0x41d5fd4f, + 0xab5e0628, + 0x2c8ad100, + 0x076c1906, + 0x0f2c832a, + 0x41834a07, + 0x1487e207, + 0xe5332287, + 0x140b4433, + 0xd107e22b, + 0xd433be07, + 0xd10bb333, + 0xde23be2b, + 0x03fff9c4, + 0x050be8bf, + 0x073a0700, + 0x461b072d, + 0xad4027c5, + 0x1d0148d4, + 0x418abd64, + 0x32bcbe0d, + 0xddf29300, + 0x23890499, + 0x8d54114c, + 0x84d5cad3, + 0x80bd0d38, + 0x04cc0d40, + 0xc407864f, + 0x84d11403, + 0x0ea7062c, + 0x03fff9cf, + 0x2c84d541, + 0x336bbe06, + 0x1e712701, + 0x034a0733, + 0x2c84d541, + 0x9b402706, + 0xb4890ef4, + 0x4c23892e, + 0xf9cf0ea7, + 0x8d430bff, + 0x46be4c24, + 0x41270133, + 0x9103641d, + 0xf0937127, + 0xf0049980, + 0x07ff5092, + 0x27f58e07, + 0x4ef58e00, + 0x6dfd93fb, + 0xd4d10499, + 0xc0071080, + 0x45b6b107, + 0xbe800c27, + 0xd5001b2b, + 0xd11080d0, + 0x071080d0, + 0x274b073c, + 0xf293801c, + 0xbe00e7a4, + 0xd100a62b, + 0x0e1080d0, + 0x1ebc9efb, + 0x1eb89e00, + 0x93fd4e00, + 0x04992ffd, + 0xc148d3c1, + 0x432e7cd4, + 0x2680d499, + 0x1e55be46, + 0x9d402700, + 0xd4c180d4, + 0x7cd4c548, + 0xb39efd8e, + 0xfd4e0035, + 0x1007d007, + 0x93542c27, + 0x049cabf0, + 0x00a333be, + 0x0d070806, + 0x9c9ef393, + 0x154c2704, + 0x04030201, + 0x34033205, + 0x3127f4a8, + 0x98def493, + 0x0a439d04, + 0x04c6fd8e, + 0x00afbb9e, + 0x20270107, + 0xe0001e27, + 0xb0859e08, + 0xbefe4e00, + 0xd6fff795, + 0x8e012704, + 0x830553fe, + 0x4efe8e01, + 0xf9f493fe, + 0x24070499, + 0x073f2c03, + 0x7f2ce334, + 0x197f3ce3, + 0x803c0334, + 0x27f932c2, + 0xf393101c, + 0xa70499dc, + 0x05410720, + 0x03112332, + 0x93f4b834, + 0x04987ff4, + 0x30a72027, + 0xc56a439d, + 0x423d8841, + 0x9d0b429d, + 0x425d0c41, + 0x4d03421d, + 0x4ce30438, + 0x9b071e7f, + 0x4c030cf4, + 0x284fd080, + 0xf4000518, + 0xf49b4027, + 0x81f0930e, + 0x1d27049c, + 0x86be0c40, + 0xf4930030, + 0x07049948, + 0x3f2c0324, + 0x2ce33407, + 0x7f3ce37f, + 0x3c033419, + 0xf932c280, + 0x9932f393, + 0x27282704, + 0x03340d40, + 0x23f2b838, + 0x2307c43c, + 0xe37f2c03, + 0x3ce37f2c, + 0x0334197f, + 0x32c2803c, + 0x89f393f9, + 0x20270498, + 0x05204c27, + 0xc8340332, + 0x430ea7f4, + 0x1827fffb, + 0x00ba98be, + 0xfaf30ea7, + 0xbe1427ff, + 0xa700ba8d, + 0xfffaa30e, + 0x2c271027, + 0x9efe0e80, + 0x4e00a254, + 0x3414c1f5, + 0x3ea7f1a3, + 0x45fddfff, + 0x004e27f4, + 0x34d52000, + 0x40270208, + 0x020834d5, + 0x4fff4ea7, + 0xc14311fd, + 0xf055ac14, + 0x93ac43c5, + 0x04979bf4, + 0x07584499, + 0x204ce0b1, + 0x3027012b, + 0xf3355007, + 0xc101195e, + 0xb88934bd, + 0x28b48926, + 0x011052a9, + 0xdc33849b, + 0xd132071c, + 0x0b010c59, + 0x1e31038d, + 0x23980305, + 0x03f3f021, + 0x94010c1e, + 0x4fd44dcb, + 0x10000000, + 0x076207ed, + 0x236103a9, + 0x037d07a8, + 0x09f6f0a8, + 0xc8074027, + 0x271ef425, + 0xa311ac01, + 0xf3254707, + 0x4f304ccb, + 0x10000000, + 0x131ec807, + 0xb4c1f321, + 0xff3f8334, + 0x330fffff, + 0x34ab1c4c, + 0x4c07f325, + 0x4fc64d2b, + 0x4340cc5e, + 0x0b073f07, + 0x2f071d07, + 0xbabe3403, + 0x8dc202a6, + 0x4cb4c11a, + 0x040b0087, + 0x46160401, + 0xf311f401, + 0x3487432b, + 0x31a3f405, + 0x3f070305, + 0x1c070b07, + 0x34032f07, + 0x02a690be, + 0xdc07f411, + 0x7d02d42b, + 0x2d07d707, + 0xf1313c07, + 0xffff2f83, + 0x0b070fff, + 0xffff3f83, + 0x0bbe0fff, + 0x8c4e0046, + 0x7c07fd21, + 0x07ff625e, + 0x73392b3a, + 0xa939a633, + 0x07011054, + 0x03432b26, + 0x1054ad21, + 0x111a1e01, + 0x15a301a4, + 0x03930594, + 0x104cd4a8, + 0x33f3510a, + 0xc5430b43, + 0x98039049, + 0xf331f220, + 0x31035803, + 0xb499f335, + 0xf2f3310d, + 0x41fee234, + 0xdf0ea7fd, + 0xdc83ffff, + 0xbed3330f, + 0xf900ae46, + 0x00007cd3, + 0xb9b499ff, + 0x28a32307, + 0x23074124, + 0xf9482ca3, + 0x00007ed4, + 0x7cd2fdff, + 0x23ff0000, + 0x7ed4fd41, + 0xa7ff0000, + 0xffffdf0e, + 0x00adf2be, + 0xbe34b0c1, + 0xa702ad8c, + 0xfd4fff4e, + 0x40274301, + 0xa70ef49b, + 0xffffff4e, + 0x270e4499, + 0xcb233b21, + 0xbf3ea724, + 0x2138fd4f, + 0x34054127, + 0x34032153, + 0x412722d6, + 0xcfff3ea7, + 0x6034c5fd, + 0xe612b499, + 0x30b4c144, + 0x39be4104, + 0xf183fffb, + 0xfa4ef58e, + 0x95d2fb93, + 0xe6b11904, + 0xc100e81f, + 0x402748bd, + 0x30a72027, + 0x8d0cb49d, + 0xb2654eb3, + 0xc50bb49d, + 0xdf8350b2, + 0x8000000f, + 0xd123d04c, + 0xfff0dfa3, + 0xd103ffff, + 0x076b11c4, + 0x333d874d, + 0x07432b45, + 0x2b333334, + 0x03a30734, + 0x050be8af, + 0x07c30700, + 0xbe1a070b, + 0x03002e37, + 0x0507b0cf, + 0xafa2be00, + 0xada6be00, + 0xad95be00, + 0x44c4b900, + 0x07453604, + 0x7e0b071a, + 0xc3b9fd97, + 0x3cc0043f, + 0xc4b924ff, + 0x47e6043d, + 0xb96ab39d, + 0x27043cc3, + 0x6bb39d11, + 0x044ec4b9, + 0x10274496, + 0x46334107, + 0xb49d43ab, + 0x874d076b, + 0x2b45333d, + 0x33340743, + 0x03342b33, + 0x0507b03f, + 0x4e34b900, + 0x3c32b904, + 0x96112704, + 0x07102744, + 0xab463341, + 0x09f29342, + 0x249d0495, + 0x4834b95e, + 0x9d102704, + 0x34b95f24, + 0x4486043d, + 0x23c11127, + 0x03402748, + 0x9d241d31, + 0x23c56021, + 0x4efa8e48, + 0xddf393fe, + 0x34190494, + 0x42274144, + 0xfb7e341d, + 0xf0cfbefe, + 0x5efe0eff, + 0xf74efc17, + 0x4207d207, + 0xb1078007, + 0x38272027, + 0x44034205, + 0xb489f3c8, + 0x0d312712, + 0x14b189d4, + 0xb499d12d, + 0x9d343b34, + 0x84991ed3, + 0x32b98909, + 0x910344c6, + 0x84999153, + 0x0430274f, + 0xc1312742, + 0x3f6b4c84, + 0xff004e58, + 0x03a307ff, + 0x1e8021ad, + 0x86a1270b, + 0x13a02734, + 0x898002ad, + 0xe90730b3, + 0x030fec03, + 0x34530f3c, + 0x7a07e453, + 0xe8033703, + 0x7c834a07, + 0xe337e320, + 0xc64283e7, + 0x27456676, + 0x2702902d, + 0x181e104c, + 0x01e02d27, + 0x1e604c27, + 0x2745060f, + 0x1e02002d, + 0x802d270c, + 0x03061e01, + 0x242b802c, + 0x14331307, + 0x41071e9b, + 0x0fff4d83, + 0x1d034506, + 0x142b1000, + 0xc39bc207, + 0x0e072c87, + 0x02534207, + 0x237f4c83, + 0x0344e601, + 0x242b802c, + 0x3e074087, + 0x3c9b342b, + 0x4c834307, + 0x0344e67f, + 0x342b803c, + 0x9b30b489, + 0x03210b20, + 0x44530f4c, + 0xd215230b, + 0x990cd48d, + 0x4ff60984, + 0xb38900a5, + 0x03e90730, + 0x733103e1, + 0x03e15331, + 0xec030f3c, + 0x5334530f, + 0x033703e4, + 0xe34a07e8, + 0x83e7e337, + 0x6676c642, + 0x902d2745, + 0x104c2702, + 0x2d27181e, + 0x4c2701e0, + 0x060f1e60, + 0x002d2745, + 0x270c1e02, + 0x1e01802d, + 0x802c0306, + 0x1307242b, + 0x1e9b1433, + 0x4d834107, + 0x45060fff, + 0x10001d03, + 0xc207142b, + 0x2c87c39b, + 0x42070e07, + 0x4c830253, + 0xe601237f, + 0x802c0344, + 0x4087242b, + 0x342b3e07, + 0x43073c9b, + 0xe67f4c83, + 0x803c0344, + 0xb489342b, + 0x03209b30, + 0x0b417341, + 0x0f4c0321, + 0x4453230b, + 0xd48dd225, + 0x2c84890e, + 0x9910d48d, + 0x84890b83, + 0x8d430b2e, + 0xb18912d4, + 0x30b08932, + 0x0032c9be, + 0xffff2ea7, + 0x6e23a9ff, + 0x46d0550d, + 0x7024a937, + 0x0946860d, + 0x8d340ad4, + 0x24a918d4, + 0xd3290d70, + 0xd38d430a, + 0x4ef78e1a, + 0xe1fb93f5, + 0xb3c10492, + 0xff4ea748, + 0x13a5ffff, + 0xe3264499, + 0x079107f0, + 0x20820770, + 0x145c2742, + 0x9908915e, + 0x450608b4, + 0x5e115c27, + 0xb0c10886, + 0xf398be48, + 0xf65007ff, + 0xc108790f, + 0x4c8348b4, + 0x3334070f, + 0x2b448735, + 0x33d30734, + 0x03d32bd3, + 0x050be8df, + 0xacd6c100, + 0x011c60d5, + 0x2058b499, + 0x0d07204c, + 0x006ddcbe, + 0xe60ab499, + 0x9903ca4f, + 0x4ce00a94, + 0xb903c210, + 0xb903adb4, + 0x9303f9b2, + 0x03c22bfa, + 0x03fab1b9, + 0xa515a505, + 0x03aeb3b9, + 0x28034103, + 0x03fbb0b9, + 0xa49d1803, + 0xb9a25d04, + 0xb903b5b4, + 0x0303fcb2, + 0x07a17d31, + 0x9da41d1b, + 0xa03d05a3, + 0x0306a29d, + 0x2704281d, + 0xbe0a0728, + 0x07009c5c, + 0x070b07c0, + 0xac0d0319, + 0xbdf29303, + 0x4b7e03c1, + 0x931b07fd, + 0x03c1b3f0, + 0x04081d03, + 0xbe202c27, + 0x27009c38, + 0x27c49641, + 0xa940ab40, + 0xc103e0be, + 0x212770b3, + 0x20274496, + 0x3e0e1027, + 0xb3991127, + 0xacb4b909, + 0x2721ab03, + 0x27340e10, + 0xab420711, + 0x314fe641, + 0x48b0c101, + 0x027e0123, + 0x270516f9, + 0x8b5e0f5c, + 0xebaebe07, + 0xb9a459ff, + 0x3003acb0, + 0x1e212749, + 0x27a4790b, + 0x27491030, + 0x93230731, + 0x03c167f4, + 0x30274439, + 0x31274204, + 0x1f6b1307, + 0xb1072546, + 0x8021bd03, + 0xb1270b1e, + 0xb0271486, + 0x8002bd13, + 0xffff4ea7, + 0x094499fe, + 0x34874383, + 0x432b4433, + 0xc132f393, + 0x4d4df903, + 0x19ff0000, + 0x5df49333, + 0x41c10491, + 0x27d00b6c, + 0x27349641, + 0x001d8340, + 0x89d43b01, + 0x93890e92, + 0x96c12710, + 0x07c02714, + 0x471b070d, + 0xf35fbecc, + 0xbe0786ff, + 0xbeffeb24, + 0x06fff318, + 0x105c2705, + 0x0706f15e, + 0x071b070d, + 0xf39fbe2c, + 0x15fd93ff, + 0xd4a90491, + 0xfc9303e0, + 0xc503c0d4, + 0xc40170d4, + 0xd4d5c011, + 0xd4b90428, + 0x302703ac, + 0xd49d20a7, + 0x60d39d09, + 0xd56ad29d, + 0x9d042cd0, + 0xd29d5ed3, + 0x2690995f, + 0x01830353, + 0x003980be, + 0x011c64d1, + 0x06074586, + 0x011c0d03, + 0x003820be, + 0x0d072d07, + 0x2d031907, + 0x0d030408, + 0xf37e03ac, + 0x030d07fb, + 0xbe04080d, + 0x0700150c, + 0x1563be0c, + 0x27412700, + 0xd49d115c, + 0x066c5e08, + 0xb0b94027, + 0xb49d03ad, + 0xaeb4b90a, + 0x35b09d03, + 0xb936b49d, + 0xd103afb0, + 0x9d03b0b4, + 0xb4c537b0, + 0xb7b0b938, + 0xb8b4b903, + 0x3cb09d03, + 0xb93db49d, + 0xd103b9b0, + 0xa903f0b4, + 0xb903dcb1, + 0x0703bab3, + 0x3eb09d2e, + 0x9b44b4c5, + 0x0736c621, + 0x33310741, + 0x2b343348, + 0x0bc44743, + 0x45420bc2, + 0x07081eb4, + 0x38cc03c2, + 0xf493bc45, + 0xd1049034, + 0xd103f04e, + 0xa903ec40, + 0xa903e241, + 0xd103dc42, + 0x0b03e443, + 0x87219be0, + 0xf8ed0333, + 0xa9e30b07, + 0x0703e841, + 0x0b315332, + 0x27e10b32, + 0x43550c2c, + 0x2103031e, + 0x423b4127, + 0x93f84cca, + 0x048ff3f4, + 0x429d4151, + 0x02230724, + 0x27210713, + 0x031e0c3c, + 0x41273103, + 0x42ca433b, + 0xd5f493f8, + 0x2c27048f, + 0x25439d0c, + 0x2103031e, + 0x423b4127, + 0x93f84eca, + 0x048fbff1, + 0x9d241499, + 0x4c142612, + 0x0c4c270c, + 0x9d251099, + 0x0c142414, + 0x0c0c270c, + 0x03c613a9, + 0x03c812a9, + 0x03fb14b9, + 0x2d03239b, + 0x422303ff, + 0x109d2a53, + 0x474f6b25, + 0x07423432, + 0x0b051e23, + 0x93215323, + 0x048f7bfb, + 0x03c0b4b9, + 0x03f9b3b9, + 0x4c274536, + 0xc0b4bd10, + 0x03420703, + 0x9b435347, + 0x24b09943, + 0x03c0b3b9, + 0x2127420b, + 0x203b439b, + 0x4553e207, + 0x32274a33, + 0x2325b199, + 0x07e40be1, + 0x3b413b43, + 0x0b201330, + 0x02e28b43, + 0x07e4074e, + 0xbe00271e, + 0xa9000670, + 0xa703eab3, + 0xd07fff4e, + 0x03dcbca9, + 0x40274281, + 0x9d28b38d, + 0xc39b34b4, + 0x41272c2a, + 0xc134b49d, + 0xc4c230b4, + 0x07b0b10d, + 0xf6287e1c, + 0xbcc5b0b5, + 0xff4ea730, + 0x44c1fd4f, + 0x004e3c74, + 0x30271000, + 0x3127031e, + 0x43ab4347, + 0x501041c0, + 0x0b42c041, + 0x1e0d43c0, + 0x403c2710, + 0x3c270d1e, + 0x27081e90, + 0x031e503c, + 0xf493ff1e, + 0xad048ec0, + 0x93107c43, + 0x048eb7f4, + 0x03b440b9, + 0x9307409d, + 0x048eabfc, + 0x302740a7, + 0xc54ec48d, + 0x949950c3, + 0x0e41d826, + 0xc49d4027, + 0x9d40a75e, + 0xc39d5fc4, + 0x0a949960, + 0x41104cc0, + 0x0d030c07, + 0x190703ac, + 0xbe02f293, + 0xf9b07e03, + 0xf0931c07, + 0x0303bdf8, + 0x2704081d, + 0x9dbe202c, + 0x07c60098, + 0x0c074127, + 0x03bbd49d, + 0x9304080d, + 0x03bddbf3, + 0x32014827, + 0x02053403, + 0xf4a80403, + 0x4c034607, + 0x45f293fc, + 0x18270492, + 0x20013827, + 0x40051123, + 0x44032403, + 0xf093f398, + 0xd1048e28, + 0xc5042802, + 0x03d1f462, + 0x63c5042c, + 0x2ad489f8, + 0x590e048d, + 0x89027d72, + 0xd38d1293, + 0x1494891a, + 0x891cd48d, + 0xd28d1692, + 0x1893891e, + 0x8920d38d, + 0xd48d3094, + 0x32928922, + 0x9924d28d, + 0xd39d3503, + 0x3694990f, + 0x44963027, + 0xd39d3127, + 0x3c049906, + 0x9d0cd19d, + 0x4027b8d4, + 0x810bd49d, + 0x5cd2c592, + 0xd3c59391, + 0xc594a160, + 0x929964d4, + 0x04d29d0a, + 0x9d0c9399, + 0x94b105d3, + 0xb13cd4c5, + 0x38d2c592, + 0x990b9399, + 0x33470a94, + 0x340b4183, + 0x4f6b4307, + 0x9910d49d, + 0x1cdc5e01, + 0xd2995140, + 0x4b24d804, + 0xc35f0399, + 0x2043ce41, + 0x42cb4107, + 0x41c44583, + 0x60039917, + 0x2705d499, + 0x27340e20, + 0xc3420721, + 0x6b340741, + 0x27031e3f, + 0x59f49330, + 0x4499048d, + 0x663f6b60, + 0x2734d646, + 0x99081e40, + 0x418362d4, + 0x340741c3, + 0x43073f6b, + 0x4027031e, + 0x2716d49d, + 0xb9d49d40, + 0x9d1d7399, + 0x9fbe13d3, + 0xf493003f, + 0xa9048d24, + 0x99107c44, + 0xd0c504d3, + 0xb4d1c5b0, + 0x3cbcd48d, + 0xb027203c, + 0x4307121e, + 0x4c837b51, + 0x04d49ddf, + 0xd49d4227, + 0x93b103b9, + 0x048cf7f4, + 0xc06a4e99, + 0x997effec, + 0x4cc004d4, + 0xd0c17710, + 0x07202738, + 0x38101e30, + 0xfc24f931, + 0xce000508, + 0x315b0d4e, + 0x12072103, + 0x31b61183, + 0x2cc4051e, + 0x949935ff, + 0x3b21270b, + 0xd420ab24, + 0x01ffff2e, + 0x27302735, + 0x4127111c, + 0x428b433b, + 0x31034506, + 0x221ef198, + 0x8c9ef493, + 0x6b449904, + 0x41832347, + 0x2cc0240b, + 0x320713ff, + 0x41273153, + 0x40ab433b, + 0x1e38d4c5, + 0xff2c2713, + 0xf49330a7, + 0x9d048c78, + 0x041e6a43, + 0x9dff2c27, + 0x9099bad2, + 0x9d40a737, + 0xd49d08d0, + 0x38929909, + 0x5911d29d, + 0x27422474, + 0x93161e40, + 0x048c4ff4, + 0x27584499, + 0x204c0430, + 0x43073127, + 0x4f6b41c3, + 0x9312d49d, + 0x048c37fc, + 0xb128c389, + 0x2cd38dc2, + 0xc5109489, + 0x748da8d2, + 0x0e90892a, + 0x708d4027, + 0x04d39928, + 0x739d1027, + 0x99941518, + 0x938904d4, + 0x83425332, + 0x03345b41, + 0x43073f3c, + 0x993f4c83, + 0x4c13b8d2, + 0x27240240, + 0x0b442711, + 0x14d49d32, + 0xd49d4227, + 0x17d19d15, + 0x46534307, + 0x8d0bc399, + 0x3ff62ed4, + 0xc2c1009b, + 0x10d39948, + 0x9934d2c5, + 0x102707c4, + 0x11274486, + 0xfd05d703, + 0x2318cc03, + 0x07fc15d7, + 0x34cd0341, + 0x070d0701, + 0xbefc2519, + 0x23ffeac9, + 0xe6014ccd, + 0x5e500704, + 0xc461016e, + 0x0344d4c5, + 0x3d0768dc, + 0x2d07d003, + 0x3ce34127, + 0x0bc49d7f, + 0x237f2ce3, + 0x341968dc, + 0xc2803c03, + 0x0d07f932, + 0x93680c03, + 0x048cbff1, + 0xbe402c27, + 0x0602a10a, + 0x07b123b7, + 0x9d4f6b4b, + 0x4d0bbad4, + 0x93684499, + 0x048b57f3, + 0x996a349d, + 0x3cc0bad3, + 0xf4930eff, + 0x99048b48, + 0x3d0b6a44, + 0x8968349d, + 0xfa931090, + 0x8d048b38, + 0x928928d0, + 0x44dbc10e, + 0x7926d28d, + 0x9d0b0773, + 0x74990dd3, + 0x9d190704, + 0x92890ed4, + 0x1094890e, + 0x0144a3c1, + 0x0b429b9c, + 0x074487c3, + 0xbec40b28, + 0x0102a0a2, + 0x0b4b0798, + 0xc58b0b4c, + 0xd8c550d4, + 0x24a0994c, + 0x03fccd03, + 0x9958d09d, + 0x3b0726a2, + 0x615ad29d, + 0x0b7485a0, + 0xc540053c, + 0xa29954d3, + 0xfccd0325, + 0x59d29d03, + 0x9548dcc5, + 0x5ad09973, + 0x03eca4d1, + 0x890e9189, + 0x31271092, + 0x303b4c0b, + 0xb40b342b, + 0x2287219b, + 0x10270807, + 0xa385ab75, + 0x00952bbe, + 0xfc9bc027, + 0x0ca4990e, + 0x0a0745f6, + 0x2fbe1d07, + 0x4127ffe2, + 0xc10ca49d, + 0xd4c134d3, + 0xb5735544, + 0x3078c574, + 0x9d089999, + 0xa0991979, + 0x1b709d24, + 0x9d25a299, + 0xa3411c72, + 0x2534a099, + 0x9da45173, + 0x743518d0, + 0xe304a499, + 0x04a49d42, + 0xa41d4127, + 0xbe30dcc5, + 0xbeffefa8, + 0xa700a462, + 0xfd4fff4e, + 0x6cc54411, + 0xe864c5c0, + 0xc5a86cc5, + 0x0507b06c, + 0xf58ef0c3, + 0xf493fd4e, + 0x99048a28, + 0xf9630444, + 0x4158423c, + 0xffef77be, + 0x4b1ed027, + 0x3c033f07, + 0x2720273c, + 0x3205164c, + 0xf4c83403, + 0x20273f07, + 0x050f4c27, + 0xc8340332, + 0x3c4c27f4, + 0x07583c27, + 0x3cf38d0f, + 0x3c272407, + 0x07040b10, + 0x0af39d1f, + 0xf87ef405, + 0xf6d007f6, + 0xf4007e05, + 0xf4933127, + 0x9d0489d0, + 0x0d070443, + 0xfd8ef943, + 0x0ea7fc4e, + 0xbeffffdf, + 0x2700a1aa, + 0xbe35100d, + 0x93000b83, + 0x049a4bfc, + 0x0ea7c005, + 0xbeffffdf, + 0x2700a16f, + 0x1d0c2710, + 0x41073107, + 0x3733c201, + 0x432b4933, + 0x411d420b, + 0xf0581103, + 0x8986fc93, + 0x27402704, + 0x0dc49d30, + 0xc3c540a7, + 0x40c3c548, + 0x7e7cc4c5, + 0x4c27f0bf, + 0x000d270c, + 0x07202740, + 0x26c49d10, + 0x9d24c49d, + 0x18be25c4, + 0x202700a1, + 0x42073827, + 0x40f54333, + 0xff0004d0, + 0x0d032103, + 0xf3680800, + 0x4fff4ea7, + 0x6843c1fd, + 0x8936f293, + 0x33102704, + 0x40a7103c, + 0x9d60219d, + 0x219d5f24, + 0x1c3c535e, + 0x4d273524, + 0x051e1000, + 0x20004d27, + 0x8912fc93, + 0x7ac4ad04, + 0x78c4ad10, + 0xbe0c0710, + 0x27006424, + 0x64c4c540, + 0x8e61c49d, + 0x4efe0bfc, + 0x1f1ea7fe, + 0x2c27fffa, + 0x27e0270c, + 0x1409103c, + 0x423b1203, + 0x2103e40b, + 0x4ea7f398, + 0xa1fffa23, + 0x8e0e2b40, + 0x0b0127fe, + 0x233ea7fe, + 0x34c1fffa, + 0xc5040e34, + 0xfe0b3430, + 0xeea7fb4e, + 0xc1fffa23, + 0xd10734e4, + 0xd40744c6, + 0x4ea73c1e, + 0x99feffff, + 0xe2990944, + 0x87438324, + 0x2b443334, + 0x4d41f943, + 0x03ff0000, + 0x9b120328, + 0x0b41271d, + 0xa1423b10, + 0x02140be3, + 0x07130731, + 0x011f10d1, + 0x27100000, + 0x000000df, + 0x23bea710, + 0xb4a1fffa, + 0xa730d4c2, + 0xffffdf0e, + 0x00a033be, + 0xc00701c3, + 0xc566cf6b, + 0xffdf0ea7, + 0xa03cbeff, + 0x070b0700, + 0x090dbe1d, + 0xa7c5a600, + 0xffffdf0e, + 0x049efb0e, + 0xfb8e00a0, + 0x0e27fb4e, + 0xbe020000, + 0xa7000726, + 0xfffa23be, + 0xb49d4827, + 0x27b00524, + 0x0200001e, + 0x45be0b07, + 0xbc990008, + 0x030b0724, + 0xbe1c07c6, + 0x270004b9, + 0xb54c3b41, + 0x30fb8eb4, + 0x85f09302, + 0xfe0b00d6, + 0x87f2f393, + 0x9d402704, + 0x00276130, + 0x0b6434c5, + 0x930230fe, + 0x00d691f0, + 0xf393fe0b, + 0x27049878, + 0xc6341d40, + 0x1d412704, + 0x0b002734, + 0x65f493fe, + 0x40190498, + 0x4ea7fe0b, + 0xd5ffffff, + 0x060a4440, + 0xff2ea708, + 0x2441fdaf, + 0x7fff3ea7, + 0x05400bfd, + 0xe3342124, + 0x3425104c, + 0x4ca33411, + 0xa70b1e10, + 0xfd7fff3e, + 0x4ce33411, + 0x15002710, + 0x93fe0b34, + 0x048783f4, + 0x536c40c5, + 0xa7018307, + 0xffffff4e, + 0x2745409d, + 0x07fe0b00, + 0xd0412340, + 0x04c01442, + 0x0e08c011, + 0x20100c40, + 0xf093200c, + 0x0b00d62f, + 0x51f493fe, + 0x44990487, + 0x96408b5a, + 0x200c2045, + 0xd63df093, + 0x93fe0b00, + 0x04873bf4, + 0x2758409d, + 0x30fe0b00, + 0x50f09302, + 0xfe0b00d6, + 0x8726f393, + 0x0d01c404, + 0x270e3489, + 0x8d42a300, + 0xfe0b0e34, + 0x270e3489, + 0x8d42e300, + 0xfe0b0e34, + 0xf4930230, + 0x1e00d659, + 0x9df39314, + 0x05160497, + 0x30154027, + 0x40a7071e, + 0x40273415, + 0xfe0b0407, + 0x9786f493, + 0x0b401104, + 0x7df393fe, + 0x40270497, + 0x40a73405, + 0x41273415, + 0xfe0b341d, + 0x0230fe4e, + 0xd648f093, + 0x27fe8e00, + 0x27049641, + 0xbe040740, + 0x270008ae, + 0x4efe8e00, + 0xfde3befe, + 0x8e0027ff, + 0xc00401fe, + 0x48d45647, + 0x2f44c018, + 0x41c04554, + 0x9d42e442, + 0xc02d1e00, + 0x46e42545, + 0x2e1e0094, + 0x252a4cc0, + 0xc02b4c54, + 0x49e43748, + 0x281e0084, + 0x32394cc0, + 0x79454cc4, + 0x0011501e, + 0x00119f1e, + 0x11fe6a5e, + 0xfe7f5e00, + 0x9f5e0011, + 0x5e0011fe, + 0x0011fed3, + 0x11fee65e, + 0x119d1e00, + 0xff195e00, + 0x3d5e0011, + 0xff4ea7ff, + 0x44c1fd4f, + 0x004fd874, + 0x24200000, + 0x4ea70349, + 0xadffffff, + 0x690d6e43, + 0xad202700, + 0x1e0d7040, + 0xff4ea72c, + 0x44c1fd4f, + 0x004f3c74, + 0x93200000, + 0x00d5c2f2, + 0x3027171e, + 0xffff4ea7, + 0xe1f293ff, + 0x43bd00d5, + 0x051e0d76, + 0x00614d9e, + 0xfe0b0207, + 0xd007fd4e, + 0xffdf0ea7, + 0x9dd4beff, + 0x08d09900, + 0x2027d161, + 0x01396bbe, + 0x0706d045, + 0xd201d311, + 0x44873419, + 0x4005420b, + 0xd455d431, + 0x41033419, + 0x0ea7341d, + 0xbeffffdf, + 0x41009d83, + 0x960027d4, + 0xc3012744, + 0x8e018301, + 0x51fb4efd, + 0x07c00704, + 0x22b107d2, + 0xe6aa3e24, + 0xbf4ea70b, + 0x4b05fde4, + 0xc2414d15, + 0x43353027, + 0xe4af4ea7, + 0x154205fd, + 0xff2ea74d, + 0x4335fdef, + 0xf3e8031e, + 0x27d424c1, + 0x6a4ddc33, + 0xc341f5fc, + 0x3d0bc451, + 0x03074d2b, + 0x0d2bc455, + 0xfb8ec345, + 0x0e51fa4e, + 0xc307b007, + 0xa107d207, + 0x3e024307, + 0xd4154e07, + 0x4496b451, + 0xd211dc15, + 0xd005943e, + 0xd41108a6, + 0x242b2c07, + 0x2516d235, + 0xd2250127, + 0x1a07fa8e, + 0x0b07140b, + 0x25ff787e, + 0x964127d0, + 0x07402704, + 0x4efa8e04, + 0x3414c1f5, + 0xb407fca3, + 0x83581299, + 0xd1270fbc, + 0x33c4f0c5, + 0x3b3d07b3, + 0x07c02732, + 0x84be2391, + 0x11c1ffff, + 0xc4f8c150, + 0xc108f29d, + 0xb403c4f2, + 0xf465f335, + 0x0f07fc55, + 0xf105fb15, + 0xfc45b423, + 0x61188c03, + 0xfeda7e2a, + 0x01370fe6, + 0xc1599499, + 0xd43b5493, + 0xfcc5fda5, + 0x24f49d30, + 0x94c10f07, + 0x03b50334, + 0xfb851c0c, + 0xb523f375, + 0xf4c5fcb5, + 0xfeae7e34, + 0x010b0fe6, + 0x3f077807, + 0x3c037a0b, + 0x27202738, + 0x3205204c, + 0xf4c83403, + 0x3d272027, + 0xf2c5ffff, + 0xb8f3c5bc, + 0x5ec0f2c5, + 0x740100d7, + 0x602744d6, + 0x6407071e, + 0x680b6853, + 0xa403a707, + 0xae5e5027, + 0x54f45100, + 0x0f07384c, + 0xe6fe637e, + 0x4100c00f, + 0x03f451fd, + 0x4c2338dc, + 0x55fd4538, + 0x38dc23f4, + 0xa60754e6, + 0x09186c03, + 0xb8f4c1ac, + 0x032b4cce, + 0xab4c07c2, + 0x07c4874f, + 0xc1c10b1f, + 0xf2c538c2, + 0x1126d6bc, + 0x0b0f07a1, + 0x7e120118, + 0x0fc6fe69, + 0xbcf0c57d, + 0x0938c0c5, + 0xc1a309ac, + 0xd30dbcf2, + 0xa431a129, + 0xd215d12d, + 0x2d071807, + 0x140ba321, + 0x28030f07, + 0xc6fe8f7e, + 0xc4f3c10e, + 0x3141a451, + 0x180b0f07, + 0x2d07a341, + 0x2c03140b, + 0x1c0c0320, + 0x89fe737e, + 0xf1c12694, + 0x4c93c1c0, + 0x450b419b, + 0x430b4487, + 0xd4294d05, + 0x0bb8fcc5, + 0x26948954, + 0xff4f54fa, + 0x03c0f2c1, + 0x21031c7c, + 0x89c0f2c5, + 0xf3c12894, + 0x2334fac0, + 0x1e0027ff, + 0xdf0ea73d, + 0x77beffff, + 0x90c1009b, + 0x04b29950, + 0x03589199, + 0xbe212304, + 0x9900050b, + 0x90c15991, + 0x05b29954, + 0x0004febe, + 0xb49d4027, + 0xa7412705, + 0xffffdf0e, + 0xbe04b49d, + 0x27009b23, + 0x8efc8304, + 0x07f94ef5, + 0x14bc23b0, + 0x4b0b4147, + 0x30074209, + 0x0999d107, + 0x0724c624, + 0x07241e01, + 0x47410341, + 0x270107e4, + 0xeb0b1c1c, + 0x4c101d2b, + 0x0311271d, + 0x05f1f001, + 0x531e3027, + 0xe203e209, + 0x40072266, + 0x3b0c4c23, + 0x87330149, + 0x071047c4, + 0x0b21234b, + 0x0dc30b41, + 0x07328742, + 0x233c0b20, + 0x2ba42712, + 0x3b1b0b2d, + 0x033301a9, + 0xc40d0a21, + 0xffffffdf, + 0x21270bff, + 0x4127071e, + 0xce05142d, + 0xe1270123, + 0xca2be03b, + 0x1223e30b, + 0x0307f258, + 0xf54ef98e, + 0xf0c5f663, + 0x24029954, + 0x323b3127, + 0x0750f2c5, + 0xc520074f, + 0xf1c54cf3, + 0x142c2358, + 0x2740f4c5, + 0xf1c1103c, + 0x05402740, + 0xc5140314, + 0xf38840f1, + 0xf2c1a207, + 0x2310274c, + 0xc53a2721, + 0x8c2748f1, + 0x5cf2c50d, + 0x8960f3c5, + 0xa38918a7, + 0xea72f01a, + 0x4cf4c100, + 0x34eec307, + 0xf1c100e1, + 0x07480750, + 0x0d4c2338, + 0x3b0c3c23, + 0xc1313b41, + 0x3c0b54f1, + 0x14871201, + 0x120b8123, + 0x5127b387, + 0xb20b9707, + 0x2027583b, + 0xd1078103, + 0x91036027, + 0x1e44f2c5, + 0x071e014f, + 0x5b3e072f, + 0x0f3c8338, + 0x420b4387, + 0x2ae64201, + 0x428b4507, + 0x02074506, + 0x031e2e07, + 0x42070e07, + 0x40ce450b, + 0xc1b2051b, + 0x4f0744f2, + 0x340b3387, + 0x40272203, + 0xc103b403, + 0x0544f2c5, + 0x05091e34, + 0x1ed403de, + 0x034e0503, + 0xf0610314, + 0x3f0705f9, + 0xf4c1211e, + 0xa6c4ca5c, + 0x37074607, + 0x362b4103, + 0x7496740a, + 0x12013127, + 0xd2051403, + 0xf3a8d403, + 0x3401dd1e, + 0xd4054546, + 0xd4034027, + 0xf1c13405, + 0xce340340, + 0xf2c1ed31, + 0x0f82ce58, + 0x271aa489, + 0x274c0e00, + 0xc50f6b01, + 0xf4c148f0, + 0x1aac8d44, + 0xa48d471b, + 0x60f3c118, + 0x31238103, + 0x0360f3c5, + 0x003ff6a2, + 0x48f0c1ff, + 0xf58ef643, + 0xffff3ea7, + 0x0834d1ff, + 0xd5400b06, + 0x0b060834, + 0xa7fe0bfe, + 0xffffff4e, + 0x010042b9, + 0x07fc40c1, + 0x83400732, + 0x31030f4c, + 0x4027121e, + 0x14fd0103, + 0xff00007c, + 0x21234007, + 0x070f4c83, + 0xf0133314, + 0x091e03f3, + 0x007e14f9, + 0x4006ff00, + 0xffff4ea7, + 0x0042bdff, + 0xfc40c501, + 0xfc4efe0b, + 0xb43ec007, + 0x0c0e4127, + 0x04074027, + 0xfc4efc8e, + 0xcf03c007, + 0x03ffffff, + 0x0000cf83, + 0x1c07fc00, + 0x3c272027, + 0x980abe16, + 0x234ea700, + 0x3027fffa, + 0xc5404cc5, + 0x40c53c43, + 0x4efc8e38, + 0x23d007fa, + 0xc24714dc, + 0xdc03cd0b, + 0x24db9914, + 0x4127ce09, + 0xae074b3b, + 0xa30b4223, + 0xa432d001, + 0xfa8e0127, + 0x3b0c2c23, + 0x87e20b2b, + 0x87040b4e, + 0x8affbe23, + 0x27412700, + 0x9dca0d00, + 0xfa8e31d4, + 0x0399f74e, + 0x3b412724, + 0x07f06343, + 0x070a0174, + 0x07f105d0, + 0x877333b1, + 0x27c00784, + 0x07c24990, + 0x871a070b, + 0xbe910322, + 0x0b008ac9, + 0x03b70ba8, + 0x109cc4c2, + 0x24d499e9, + 0xc407de01, + 0xd49d4103, + 0x03f40124, + 0x07d405c6, + 0x071f070d, + 0x0531272c, + 0xff6d7efe, + 0xd3b10596, + 0x4c3b4127, + 0xd3b5340b, + 0xf78ef043, + 0xf093fa4e, + 0xbe00d04e, + 0x9300936c, + 0x00d04ef0, + 0x009363be, + 0xfa1fbea7, + 0x0cdc27ff, + 0xb209a027, + 0xc2071d07, + 0xf093cd3b, + 0x0700d058, + 0xbeb2033c, + 0x0b009344, + 0xc4d103ac, + 0x000600bf, + 0xcea7e1ff, + 0x89fffa23, + 0xf09332c1, + 0xbe00d05d, + 0xa1009328, + 0x07c3b1c1, + 0x934a0721, + 0x00d064f0, + 0xfa0e2a2b, + 0x0093139e, + 0x08c1f64e, + 0x3c0cc138, + 0x07240e99, + 0x27b107d0, + 0x27702790, + 0x3c270c6c, + 0x2b06071c, + 0x03031e36, + 0x07222701, + 0x5b203b4c, + 0x5c2c0b40, + 0x03f3f041, + 0x2bc2041e, + 0x234007eb, + 0x24470c4c, + 0x21492d0b, + 0x410b4e3b, + 0x4487d301, + 0x3807430b, + 0xa1273c0b, + 0x11034305, + 0x3e074a07, + 0x214d403b, + 0xc40b3703, + 0x7127030a, + 0x91071902, + 0x4e3b4a07, + 0x94da4223, + 0x07766614, + 0x7e0d0713, + 0x1007fc09, + 0xb97e0d07, + 0x24de99fe, + 0xa190cbca, + 0x3cd3c1d4, + 0x2b3cdbc5, + 0xa54b0b43, + 0x4ef68ed4, + 0x3c02c1fa, + 0x074003c1, + 0x0304a1d1, + 0xe30fffdd, + 0x2b0fffdd, + 0x2ba00732, + 0x3800c1d4, + 0xbd073766, + 0xb307d302, + 0xc20bcb07, + 0xf5be1c07, + 0x0a070095, + 0x357e1c07, + 0x06db2bff, + 0x7e0d07d6, + 0x0a07fdf6, + 0xfa0e1d07, + 0x8eff235e, + 0x99fa4efa, + 0xd0073104, + 0xb307a207, + 0x46c6c107, + 0x26fc1d7e, + 0x070d0705, + 0xfb877e1c, + 0xd49d4027, + 0x5e0fd631, + 0x070bb2c0, + 0xfdb07e0a, + 0xb3c00e66, + 0x234c474f, + 0xd299144c, + 0x274d0b24, + 0x09323b31, + 0x22312344, + 0x1e3c0734, + 0x03420711, + 0x07c44247, + 0x1e31033c, + 0x03320705, + 0x3b412738, + 0x07d1a143, + 0x0b312334, + 0x0b13eb13, + 0x7e0d0714, + 0xd489ff4b, + 0x030d0732, + 0x8d1c0741, + 0xfa0e32d4, + 0x27fb245e, + 0x4efa8e00, + 0x07d207fa, + 0x46b107a0, + 0x073d072a, + 0xa72b071a, + 0xfffa230e, + 0xa6fd7e7e, + 0x23cea707, + 0xc099fffa, + 0x27222724, + 0xbe070310, + 0x070131d4, + 0x7e0c0710, + 0xd61efda4, + 0xf49b4027, + 0x07fa8e0e, + 0x0c0c2740, + 0x0103031e, + 0x203b2127, + 0xa7f824ca, + 0xffffff3e, + 0x060834d1, + 0x420b1027, + 0x060834d5, + 0x9d9e2227, + 0x4ea70131, + 0xbdffffff, + 0x0b0d4440, + 0xff2ea7fe, + 0x3027ffff, + 0x0d4423bd, + 0xf49310a7, + 0x9d048f64, + 0x239d4341, + 0x27239d26, + 0x4ea7fe0b, + 0x01fd4fff, + 0x7df39342, + 0x4d2703cf, + 0x340507d2, + 0x150c4c27, + 0x35402734, + 0x07322530, + 0x9e344503, + 0x4e008bba, + 0xff4ea7fd, + 0x44b9ffff, + 0xd0070d44, + 0xf09345a6, + 0x0700ce6c, + 0x90e6be1d, + 0x45f49300, + 0x3d2703cf, + 0x430507e2, + 0x34270407, + 0x4d254315, + 0x879efd0e, + 0xfe4e008b, + 0xffff4ea7, + 0x4444b9ff, + 0x9345660d, + 0x00ce61f0, + 0x0090b7be, + 0x6f9efe0e, + 0xfd4effd2, + 0xffff4ea7, + 0x4444b9ff, + 0x66d0070d, + 0x89013146, + 0x03890a02, + 0x4cf09308, + 0x91be00ce, + 0x0d070090, + 0xeebe0803, + 0xf393ffd2, + 0x99048eb8, + 0x41034334, + 0x8e43349d, + 0xa7fb4efd, + 0xffffff4e, + 0x0d4444b9, + 0xb007f123, + 0x4566d107, + 0xce43f093, + 0x905ebe00, + 0x930f0700, + 0x00ce50f1, + 0xbe102c27, + 0xf6008769, + 0x41fd93d4, + 0xfc9300ce, + 0x2703cea8, + 0x0507e14d, + 0x844c27c4, + 0xcb25c415, + 0xf3be0d07, + 0x20070089, + 0xcc032103, + 0x273f070c, + 0x03310143, + 0x03c10534, + 0x59f4a8c4, + 0x07330934, + 0x0dc45d1d, + 0x8cf093c3, + 0x22be03ce, + 0xf0930087, + 0xbe03ce68, + 0x03008aba, + 0x4efb8ef1, + 0xffcea7fc, + 0xc4b9ffff, + 0xd0070d44, + 0x01114626, + 0x03310221, + 0xcdebf093, + 0x8fdebe00, + 0x26c49900, + 0x042745a6, + 0xce15f193, + 0x930c9e00, + 0x030d0700, + 0xf5dfbe08, + 0x211007ff, + 0xb90956dd, + 0x660d44c4, + 0x2ef09345, + 0xb1be00ce, + 0xf493008f, + 0x2703ce10, + 0x0507d33d, + 0x27040743, + 0x25431534, + 0x9efc0e4d, + 0x07008a52, + 0x5efc0e0d, + 0xfe4eff19, + 0xffff4ea7, + 0x4444b9ff, + 0x9345660d, + 0x00ce13f0, + 0x008f7bbe, + 0x8df2f393, + 0xb6341904, + 0x93042745, + 0x00ce12f1, + 0x0092a59e, + 0x341d4027, + 0xfd4efe8e, + 0xffff4ea7, + 0x4444b9ff, + 0xe6d0070d, + 0x21011145, + 0x10f09302, + 0x45be00ce, + 0xd021008f, + 0x00000f10, + 0x0f507000, + 0xf0000001, + 0xf1930427, + 0x9e00ce36, + 0xa700926a, + 0xfffe6f3e, + 0x1c272027, + 0x01342322, + 0xd8340334, + 0x0300004e, + 0xce342123, + 0x24330d40, + 0x24fd4127, + 0x00050947, + 0x3401fd8e, + 0x330d40ce, + 0xfd412724, + 0x05094824, + 0x03fd8e00, + 0x183c0321, + 0x0ecbf1f0, + 0xfde95efd, + 0x4ea7fc4e, + 0xb9ffffff, + 0xe30d4444, + 0x26d007f0, + 0x180e8948, + 0x091a0c89, + 0x11022901, + 0x15042103, + 0x51fc25fe, + 0xf3f093de, + 0xfe0500cd, + 0x008eb7be, + 0xcd16f493, + 0xde3d2703, + 0x27430507, + 0x4315203c, + 0x48030d07, + 0x02013827, + 0x42050403, + 0xf3a84403, + 0xccf6f093, + 0x0ef0c303, + 0x89449efc, + 0xa7fc4e00, + 0xffffff4e, + 0x0d4444b9, + 0x45e6d007, + 0x02110101, + 0xce17f093, + 0x8e6ebe00, + 0xcdfc9300, + 0x0c0703cc, + 0x07df4d27, + 0x1d07c405, + 0x28274827, + 0xc4150803, + 0x00856cbe, + 0xfc0e0c07, + 0x0089059e, + 0x4ea7fb4e, + 0xb9ffffff, + 0x070d4444, + 0xe6d107b0, + 0x07010145, + 0xfdf0932d, + 0x2dbe00cd, + 0xfc93008e, + 0x0703cc8c, + 0xbb4d270c, + 0x071b070b, + 0x0508032d, + 0xbecd15c4, + 0x0700852d, + 0x9efb0e0c, + 0x4e0088c6, + 0xff4ea7fc, + 0x44b9ffff, + 0xd0070d44, + 0xf09345a6, + 0x0700cdeb, + 0x8df2be1d, + 0x51fc9300, + 0x4d2703cc, + 0xc40507e0, + 0x15844c27, + 0x254127c4, + 0xbe0d07c4, + 0x0300879a, + 0x07200701, + 0x031d070c, + 0xe2be0c0c, + 0x0c070084, + 0x7b9efc0e, + 0xfc4e0088, + 0xffff4ea7, + 0x4444b9ff, + 0xa6d0070d, + 0xb9f09345, + 0x1d0700cd, + 0x008da7be, + 0xcc06fc93, + 0xe04d2703, + 0x27c40507, + 0xc415844c, + 0xc4254227, + 0x4fbe0d07, + 0x01030087, + 0x0c072007, + 0x0c031d07, + 0x8497be0c, + 0x0e0c0700, + 0x88309efc, + 0xa7fe4e00, + 0xffffff4e, + 0x0d4444b9, + 0xf0934566, + 0xbe00cd8f, + 0xa7008d60, + 0xfd4fff4e, + 0xf3934201, + 0x2703cbb8, + 0x0507d14d, + 0x27030734, + 0x25341544, + 0x9efe0e32, + 0x4e0087fa, + 0xff4ea7fd, + 0x44b9ffff, + 0xd0070d44, + 0x4566df6b, + 0xcd6af093, + 0x8d26be00, + 0x85f49300, + 0x3d2703cb, + 0x430507d4, + 0x34270407, + 0x4d254315, + 0xc79efd0e, + 0xfb4e0087, + 0xffffcea7, + 0x44c4b9ff, + 0x9348060d, + 0x048b77f4, + 0xf4934119, + 0x01048b20, + 0x1df49342, + 0x4301048b, + 0xcd3cf093, + 0x8ce2be00, + 0x44c4b900, + 0x274ce60d, + 0x07a0001f, + 0x000f2710, + 0xbe100790, + 0x070088c8, + 0x001f27b0, + 0x271007c0, + 0x07b0000f, + 0x88b6be10, + 0x27c00700, + 0x07e0001f, + 0x000f2710, + 0xbe1007d0, + 0x070088a4, + 0x071b0730, + 0x2df0932c, + 0xfb0e00cd, + 0x008c979e, + 0xfb4efb8e, + 0xffffcea7, + 0x44c4b9ff, + 0x7e44a60d, + 0xfb93ff7a, + 0x19048afc, + 0xb9d996bd, + 0xe60d44c4, + 0x3bf09345, + 0x1d2700cd, + 0x69be07dd, + 0xf493008c, + 0x2703cac8, + 0x0707dd3d, + 0x15430504, + 0x8710be4d, + 0x1d412700, + 0x4efb8eb4, + 0xff4ea7fd, + 0x44b9ffff, + 0xd0070d44, + 0xf0934566, + 0xbe00cd20, + 0x93008c38, + 0x03ca97f4, + 0x07e03d27, + 0x33274305, + 0x4c034325, + 0x0324070c, + 0x34074f2c, + 0xe37f2ce3, + 0x34197f3c, + 0xc2803c03, + 0xf393f932, + 0x6603ca70, + 0x544c27d7, + 0x0d073415, + 0x270c3c03, + 0x0101144c, + 0x31050403, + 0xf4a83403, + 0x4427131e, + 0x20273415, + 0x270c3c03, + 0x3205144c, + 0xf4c83403, + 0xca3ef093, + 0x9efd0e03, + 0x4e00868e, + 0x070fabfb, + 0x07f0a3d1, + 0xe4230712, + 0x4f0bb90d, + 0xffcea701, + 0xc4b9ffff, + 0x47260d44, + 0x89def493, + 0x93430104, + 0x0489dbf4, + 0xf0934401, + 0xbe00cc9b, + 0xb9008ba0, + 0x660d44c4, + 0x01d11146, + 0x21d331d2, + 0xbaf093d4, + 0x89be00cc, + 0xc4b9008b, + 0x49260d44, + 0xf093d241, + 0x0700ccde, + 0x073207e2, + 0x0cec5342, + 0x4c533353, + 0x83120710, + 0x832253e1, + 0x83318321, + 0xbefe0541, + 0xb9008b5c, + 0x860d44c4, + 0x18d18946, + 0x8916d289, + 0xf09314d3, + 0xbe00ccde, + 0xb9008b44, + 0x260d44c4, + 0x44d18946, + 0x9346d289, + 0x00cceaf0, + 0x008b2fbe, + 0xb918d489, + 0x8b0d44c3, + 0x4b40cc4f, + 0xd17135e6, + 0xf093d281, + 0xbe00cce9, + 0xb9008b14, + 0xe60d44c4, + 0xa1d19145, + 0xf1f093d2, + 0x01be00cc, + 0xc4b9008b, + 0x47860d44, + 0x8934dec1, + 0xd2892cd1, + 0x30d3892e, + 0x9332d489, + 0x00cce5f0, + 0xe1befe05, + 0xd491008a, + 0x01ed44f0, + 0x36265c1e, + 0xd281d171, + 0xf093d391, + 0xbe00cd21, + 0xb9008ac8, + 0x460d44c4, + 0xb1d1a146, + 0x30d3c1d2, + 0xcd2ff093, + 0x8ab2be00, + 0x44c4b900, + 0xc146860d, + 0xd2c134d1, + 0x3cd3c138, + 0xcd3bf093, + 0x8a9abe00, + 0x44c4b900, + 0x8946260d, + 0xd28940d1, + 0x3ef09342, + 0x85be00cd, + 0xd4c1008a, + 0x9044e834, + 0x44c4b901, + 0x5ed3710d, + 0x0de40168, + 0x00ae0bba, + 0xffffbea7, + 0x44b4b9ff, + 0x9347260d, + 0x04888bf4, + 0xf4934301, + 0x01048888, + 0x15f09344, + 0x4dbe00cd, + 0xb4b9008a, + 0x46660d44, + 0xd201d111, + 0xd421d331, + 0xcb67f093, + 0x8a36be00, + 0x44b4b900, + 0x4149e60d, + 0x27f093d3, + 0xe30700cd, + 0x2307c307, + 0xec531307, + 0x10cc5314, + 0x34532a53, + 0xc183e183, + 0x21834107, + 0x41833183, + 0xfc15fe05, + 0x008a03be, + 0x0d44b4b9, + 0xd1814666, + 0xd361d251, + 0xf093d471, + 0xbe00cd32, + 0x710089ec, + 0xf844f0d4, + 0x44b4b900, + 0x81d3610d, + 0xec4fe6d1, + 0x79310b00, + 0x39311934, + 0x93335932, + 0x00cc03f0, + 0xfb0ef083, + 0x0089c39e, + 0x0bbb0dc4, + 0xff4ea718, + 0x44b9ffff, + 0x4fe60d44, + 0xd30100c3, + 0xcd15f093, + 0x00b15e00, + 0x0bbc0de4, + 0xcea70099, + 0xb9ffffff, + 0x260d44c4, + 0xbdf49347, + 0x43010487, + 0x87baf493, + 0x93440104, + 0x00cd13f0, + 0x00897fbe, + 0x0d44c4b9, + 0xd1114666, + 0xd331d201, + 0xf093d421, + 0xbe00ca99, + 0xb9008968, + 0x260d44c4, + 0x18d18946, + 0x931ad289, + 0x00cd1ff0, + 0x008953be, + 0xd01ad489, + 0xc4b91c44, + 0x46e60d44, + 0x9920d199, + 0xd39921d2, + 0x23d49922, + 0xcd1bf093, + 0x8932be00, + 0xffcea700, + 0xc4b9ffff, + 0x45e60d44, + 0xd251d141, + 0xcd2bf093, + 0x891abe00, + 0xd0d45100, + 0xc4b92644, + 0xd3410d44, + 0x345e47e6, + 0xff4ea7ff, + 0x44b9ffff, + 0x46260d44, + 0xf0933007, + 0x8300cd2c, + 0x9efb0ef0, + 0x830088f0, + 0x4efb8ef0, + 0x79f493fb, + 0x438904b1, + 0x0844890a, + 0xb107c007, + 0x0027432e, + 0xe0befb8e, + 0xf3930083, + 0x010486fc, + 0x0bd00734, + 0xc6340540, + 0xff4ea707, + 0x44b9ffff, + 0x46660d44, + 0x1b07c009, + 0xcd22f293, + 0x21f39300, + 0xd47e00cd, + 0x860d07fc, + 0x8e0127d4, + 0x93fc4efb, + 0x0486c7f2, + 0x3ea72401, + 0x63ffffff, + 0xb94123f0, + 0x050d4433, + 0x072405f0, + 0x26fc09d1, + 0x930c0736, + 0x00ccf6f2, + 0xcceaf393, + 0xfc9d7e00, + 0x4d27fc0d, + 0xfc9307d6, + 0x0103c6c8, + 0x27c405f0, + 0x151d0740, + 0x82debec4, + 0x430c0700, + 0x9efc0ef0, + 0x63008306, + 0xb94d27f0, + 0x27f40d0b, + 0xf42d484c, + 0xf0011007, + 0x9a1ef043, + 0xf063fc4e, + 0xfc09f005, + 0xcdc0d107, + 0x930c0bbb, + 0x04864ff3, + 0x41233401, + 0x4ea73405, + 0xb9ffffff, + 0x260d4444, + 0x930c0746, + 0x00cc8af2, + 0xcc8df393, + 0xfc317e00, + 0x4d27fc0d, + 0xfc9307d5, + 0x0103c65c, + 0x27c405f0, + 0x151d0740, + 0x828bbec4, + 0x430c0700, + 0x9efc0ef0, + 0x4e00829a, + 0x6df493fb, + 0x436904b0, + 0xc0074449, + 0x432eb107, + 0xfb8e0027, + 0x0084f4be, + 0x85eef493, + 0x01d00704, + 0x2704d642, + 0x09131e30, + 0x043027c4, + 0x270bbb4d, + 0xc3430731, + 0x6b340741, + 0x93320b3f, + 0x0485cbf4, + 0xd7c64305, + 0xffff4ea7, + 0x4444b9ff, + 0x0946660d, + 0x931b07c0, + 0x00cbfbf2, + 0xcc09f393, + 0xfbad7e00, + 0xd4860d07, + 0xfb8e0127, + 0x3ea7f94e, + 0xb9feffff, + 0xf80d9934, + 0x00ee104c, + 0xffff4ea7, + 0x444499ff, + 0x2b093399, + 0xe84f4b43, + 0x5e00db41, + 0x130700ec, + 0x13331783, + 0x19241f03, + 0xf4930005, + 0x99048574, + 0xc407444d, + 0xffff9ea7, + 0xd7aea7ff, + 0x2b1effff, + 0x9642c499, + 0x99d12344, + 0x410340c4, + 0x3f6b3407, + 0xc49d4027, + 0x40c39d42, + 0x1027b32e, + 0x1307671e, + 0x13331783, + 0x19241f03, + 0x1f460005, + 0x4fc41401, + 0x00008a26, + 0x99a47950, + 0x4f4b4493, + 0x400c2027, + 0x43072127, + 0x2407422b, + 0x23232f6b, + 0x0f6b0207, + 0x111e2303, + 0x004f34f9, + 0x44c6ff00, + 0x181e3007, + 0x0f6b0e07, + 0x33833007, + 0xe0074387, + 0x342b3433, + 0x20cee103, + 0x993207e0, + 0x342b0414, + 0x4f4b4307, + 0xff7e41ec, + 0x84daf293, + 0x442d9d04, + 0x24991906, + 0x27487642, + 0x42249d41, + 0xffff4ea7, + 0x094499fe, + 0x149d1301, + 0x263f0404, + 0x2300008a, + 0x442d9dd1, + 0xf48b1401, + 0x84aaf493, + 0x40439904, + 0x27414499, + 0x1934ce00, + 0xf98e0127, + 0x8496f493, + 0x40439904, + 0xee414b99, + 0x27ff09b3, + 0xff105e10, + 0xfd4ef98e, + 0xffffdea7, + 0x44d4b9ff, + 0xc6f0630d, + 0xfdf49346, + 0x42990472, + 0x26d19908, + 0xcabff093, + 0x862ebe00, + 0x26d49900, + 0x931642c4, + 0x0472e3f4, + 0xb6084499, + 0x93042745, + 0x00cad6f1, + 0x0089519e, + 0xffc862be, + 0xf1930f07, + 0x7e03a298, + 0xd007fd1b, + 0xf00105c6, + 0xa28af193, + 0xfd5b7e03, + 0x4ea7e71e, + 0xb9ffffff, + 0x660d4444, + 0xf3f09345, + 0xe1be00ca, + 0xf4930085, + 0x2703c440, + 0x0707d83d, + 0x15430504, + 0x8088be4d, + 0xfdf29300, + 0x24990483, + 0x03302740, + 0x42239d41, + 0x7e40249d, + 0xf043fe44, + 0xfd4efd8e, + 0xf193f063, + 0x0703a23c, + 0xfdc97e0f, + 0xf193d007, + 0x2603a230, + 0x7ef00105, + 0xe71efd64, + 0xffff4ea7, + 0x4444b9ff, + 0x9345660d, + 0x00caadf0, + 0x008583be, + 0xc3e2f493, + 0xd73d2703, + 0x05040707, + 0xbe4d1543, + 0x9300802a, + 0x04839ff2, + 0x27402499, + 0x9d410330, + 0x249d4223, + 0xfde67e40, + 0xfd8ef043, + 0xdea7fd4e, + 0xb9ffffff, + 0x660d44d4, + 0x82f09345, + 0x41be00ca, + 0xd4990085, + 0x2745a626, + 0x88f19304, + 0x6f9e00ca, + 0x8ebe0088, + 0xfd0effc7, + 0x4eff755e, + 0xffdea7fd, + 0xd4b9ffff, + 0x45660d44, + 0xca99f093, + 0x8512be00, + 0x26d29900, + 0x4e27d499, + 0x93082724, + 0x00ca93f1, + 0x4ea7221e, + 0x99feffff, + 0x43830944, + 0x44333487, + 0x44f9432b, + 0xff00004d, + 0x48504123, + 0xf1930827, + 0x9e00cab3, + 0x2700881a, + 0x27d49d42, + 0x931822c4, + 0x048303f4, + 0x27404399, + 0x9d310320, + 0x439d4242, + 0x5efd0e40, + 0xfd8efd48, + 0xdea7fd4e, + 0xb9ffffff, + 0x660d44d4, + 0x91f09345, + 0xa5be00ca, + 0xd2990084, + 0x27d49926, + 0x0827244e, + 0xca8df193, + 0x87d09e00, + 0x9d402700, + 0x26f627d4, + 0x82baf393, + 0x40349904, + 0x0342329d, + 0x40349d41, + 0x015efd0e, + 0x4efd8efd, + 0xff4ea7fb, + 0x44b9ffff, + 0xd0070d44, + 0xf09345a6, + 0x0700ca9c, + 0x845abe1d, + 0xbed51600, + 0x1effc697, + 0xbed20407, + 0xa7ffc412, + 0xffffffce, + 0xc4b9b027, + 0xcbbd0d44, + 0x45a60634, + 0xca86f093, + 0xbe1d0700, + 0x93008430, + 0x03c28ff3, + 0x2727cd9d, + 0x0507db4d, + 0x15442734, + 0x073d2534, + 0x26cd9d03, + 0x007ecdbe, + 0x8242f393, + 0x40349904, + 0x03423b9d, + 0x40349d41, + 0x895efb0e, + 0xa7fb4efc, + 0xffffffde, + 0x0d44d4b9, + 0xf0934566, + 0xbe00ca89, + 0xa70083e8, + 0xd07fff4e, + 0x4c5c4491, + 0x93042710, + 0x00ca83f1, + 0x0087119e, + 0xffc3b5be, + 0x81faf493, + 0x93420104, + 0x0481eff4, + 0xf0934101, + 0xbe00caa2, + 0x270083b8, + 0x07a0001f, + 0x000f2710, + 0xbe100790, + 0x07007fa4, + 0x001f27b0, + 0x271007c0, + 0x07b0000f, + 0x7f92be10, + 0x27c00700, + 0x07e0001f, + 0x000f2710, + 0xbe1007d0, + 0x07007f80, + 0x071b0730, + 0x85f0932c, + 0x75be00ca, + 0x41270083, + 0x0a41d4bd, + 0x4fff4ea7, + 0x274301fd, + 0x0ef49b40, + 0xd499c127, + 0xcbc33b0e, + 0xbf3ea7c4, + 0xc138fd4f, + 0x34054127, + 0xc4c6c153, + 0xf31e3403, + 0x78414f27, + 0xf4e8017d, + 0xffff4ea7, + 0x4444b9ff, + 0x9345e60d, + 0x00c3f9f0, + 0x07dc1d27, + 0x008327be, + 0xc186f493, + 0xdc3d2703, + 0x05040707, + 0x0e4c1543, + 0x7dcc9efb, + 0xa7fd4e00, + 0xffffffde, + 0x0d44d4b9, + 0xf0934566, + 0xbe00ca43, + 0xb90082fc, + 0xe60d44d4, + 0xbbf09345, + 0x1d2700c3, + 0xe9be07d9, + 0xf4930082, + 0x2703c148, + 0x0507d93d, + 0x27040743, + 0x0e431530, + 0x7d8c9efd, + 0xa7fc4e00, + 0xffffffde, + 0x0d44d4b9, + 0x45e60c21, + 0x2c070111, + 0xca0cf093, + 0x82b6be00, + 0x27c5d600, + 0x68dcd540, + 0x6cd4ad0d, + 0xd4371e0d, + 0xd4d134c6, + 0xdcad0d68, + 0x49760d6c, + 0x0000cf27, + 0x4f271010, + 0x10100080, + 0x0d68d4d5, + 0x10270c07, + 0xbe802c27, + 0x270079c8, + 0x2233564f, + 0x40c4c511, + 0xf49b4027, + 0xff4ea70e, + 0x44b9ffff, + 0x45e60d44, + 0xc32cf093, + 0xe31d2700, + 0x825abe07, + 0xb9f49300, + 0x3d2703c0, + 0x430507e3, + 0x30270407, + 0xfc0e4315, + 0x007cfd9e, + 0xbea7fb4e, + 0xb9ffffff, + 0x070d44b4, + 0xa60d01c0, + 0xacf09345, + 0x1d0700c9, + 0x008227be, + 0x03eedde0, + 0xddd4011c, + 0xc02503ef, + 0x7a03ebdd, + 0x03ecdd54, + 0x03e9ddc0, + 0xeadde445, + 0x1e012e03, + 0xecddc053, + 0xdde47a03, + 0x012103ed, + 0xe000885e, + 0xfe03f2dd, + 0xf3dd5400, + 0xf0dde003, + 0xe400e803, + 0x0803f1dd, + 0x00e45e01, + 0x03f4dde0, + 0xddf000ec, + 0x00f203f4, + 0x03f5dde4, + 0xe25e00f3, + 0xf9f39300, + 0x3099047f, + 0x98f45341, + 0x832007fc, + 0x0b233327, + 0x93631e23, + 0x047fe3f3, + 0x53413099, + 0x07fceff4, + 0x33278320, + 0x1e230b23, + 0xcdf3934d, + 0x3099047f, + 0x3df45341, + 0x832007fc, + 0x0b233327, + 0x93371e23, + 0x047fb7f3, + 0x53413099, + 0x07fb2df4, + 0x33278320, + 0x1e230b23, + 0xa1f39321, + 0x3499047f, + 0x974ff644, + 0x41309900, + 0x20074127, + 0x23332783, + 0x0b44349d, + 0x87f45323, + 0x992405f0, + 0x3ea74331, + 0x9dfeffff, + 0xb4990421, + 0x09339944, + 0x4f4b432b, + 0xa71141cc, + 0xffffd74e, + 0x45364479, + 0x41034107, + 0x9304249d, + 0x047f57f3, + 0x41034007, + 0x6b403299, + 0x41349d4f, + 0x4f6b422b, + 0x274049d0, + 0x93f19304, + 0x331e00c8, + 0xf25efb0e, + 0x5efb0efd, + 0x0c07fd01, + 0x475efb0e, + 0x0e0c07f0, + 0xf0f55efb, + 0x5b5efb0e, + 0x0e0c07f1, + 0xfe135efb, + 0xfb0e0c07, + 0x27f17d5e, + 0x78f19304, + 0x0f9e00c8, + 0xfb8e0084, + 0x4ea7fe4e, + 0x91d07fff, + 0x104c5c44, + 0xf1930627, + 0x1e00c879, + 0x3803c110, + 0x4c3402c1, + 0x93062730, + 0x00c899f1, + 0x0083e59e, + 0x06273252, + 0xc8caf193, + 0x71f21e00, + 0x004f3004, + 0x0b700000, + 0x014f5042, + 0x27f00000, + 0xf0f19306, + 0xd91e00c8, + 0x47160481, + 0x46960491, + 0x461604a1, + 0x459604b1, + 0xf63004c1, + 0x3c04c144, + 0x06274566, + 0xc8f7f193, + 0x8eb61e00, + 0x89fb4efe, + 0xf1a31802, + 0x2144d007, + 0xfb0ef183, + 0xc0ff7f5e, + 0x5911022d, + 0x11032dd4, + 0x822dc027, + 0x2d544f01, + 0x2dc00183, + 0xc4460102, + 0x3801212d, + 0x2dc03f1e, + 0xc03a0281, + 0x3503012d, + 0x02012dc4, + 0xd42e1e27, + 0x1280032d, + 0x80012dd4, + 0x212dc024, + 0x2dc41f11, + 0x1e111201, + 0xdf2d0318, + 0xab42077f, + 0xdf2d234f, + 0x2742507f, + 0xa0f19306, + 0x1c1e00c8, + 0xcc53c207, + 0xa7c7460f, + 0xfd4fff4e, + 0x5c7444c1, + 0x0200004e, + 0xf1930427, + 0x9e00c8ac, + 0xc400830e, + 0x1702812d, + 0x4fff4ea7, + 0x7444c1fd, + 0x00004e5c, + 0x93042710, + 0x00c8b5f1, + 0x1459e21e, + 0xb1274930, + 0x14790b1e, + 0x49103027, + 0xb3073127, + 0x30271419, + 0x44861139, + 0xde413127, + 0x4e070307, + 0x41830f6b, + 0x46d605a6, + 0xf1930627, + 0x1e00c8b3, + 0x274566af, + 0xd0f19306, + 0xa41e00c8, + 0x0300ed58, + 0xf1930627, + 0x1e00c8ee, + 0x00412797, + 0x07402712, + 0x1bcfe614, + 0x33420701, + 0xb646184c, + 0xc01c4c53, + 0x06271a42, + 0xc8f3f193, + 0xff755e00, + 0x861c4c53, + 0x93062745, + 0x00c92df1, + 0x07ff665e, + 0xe6478342, + 0x1742c015, + 0xf1930627, + 0x5e00c962, + 0x4140ff53, + 0xf1930627, + 0x5e00c989, + 0xec58ff47, + 0x93062730, + 0x00c9aff1, + 0x07ff3a5e, + 0xc04c834e, + 0x4b6605c6, + 0xf1930627, + 0x5e00c9c8, + 0x4653ff27, + 0x06274250, + 0xc9f0f193, + 0xff195e00, + 0x811f41c4, + 0x30d3a1d4, + 0x0000004f, + 0x50430b70, + 0x0000014f, + 0x930627f0, + 0x00ca06f1, + 0x46fefa5e, + 0x91d4713d, + 0x004f30d3, + 0x0b700000, + 0x014f5043, + 0x27f00000, + 0x4bf19306, + 0xdc5e00ca, + 0x273596fe, + 0x6bf19306, + 0xd05e00ca, + 0x810b86fe, + 0x30d3a1d4, + 0x0000004f, + 0x50430b70, + 0x0000014f, + 0x930627f0, + 0x00ca73f1, + 0x96feb25e, + 0x93062735, + 0x00c9eff1, + 0x89fea65e, + 0xd48930d3, + 0x27344e32, + 0x90f19306, + 0x945e00ca, + 0x34d0c1fe, + 0x43834007, + 0x06274244, + 0xcac8f193, + 0xfe815e00, + 0x021104f8, + 0xf1930627, + 0x5e00cae1, + 0x2d20fe73, + 0x2d000182, + 0x2d241102, + 0x41270102, + 0x4027031e, + 0x15d64f6b, + 0x06274666, + 0xcaf5f193, + 0xfe515e00, + 0xecfc44e6, + 0x0701d430, + 0xc04c834e, + 0x27814c50, + 0x09f19306, + 0x385e00cb, + 0x40d489fe, + 0x06274596, + 0xcb21f193, + 0xfe295e00, + 0x9642d389, + 0x93062735, + 0x00cb3ef1, + 0x07fe1a5e, + 0x07b183be, + 0xe6130704, + 0x10ec58b5, + 0x01530103, + 0x1103051e, + 0x2dc01153, + 0xd4640301, + 0x2e03022d, + 0x01212de0, + 0x2d5400b8, + 0x2de00122, + 0x00b60102, + 0x01042de4, + 0xb15e00c8, + 0x012dc000, + 0x2de07302, + 0x00820281, + 0x01822de4, + 0x9d5e00b4, + 0x212de000, + 0xd4008b11, + 0x1511222d, + 0x11022de0, + 0x2de00088, + 0x00861104, + 0x03212de4, + 0x2f1e0094, + 0x21042dc0, + 0x042dc078, + 0x2de47331, + 0x00821201, + 0x4007331e, + 0x41033107, + 0x41533103, + 0xc3273153, + 0xf355f425, + 0xf415f005, + 0xf345f135, + 0x41076d1e, + 0x41534103, + 0xc3273047, + 0xf025f305, + 0xf015f455, + 0x491ef135, + 0x1103f135, + 0x40271153, + 0xf015c227, + 0xf455f145, + 0x151ef005, + 0x1103f135, + 0x11533047, + 0xc2274027, + 0xf145f315, + 0xf305f455, + 0x2b1ef425, + 0x30871103, + 0x071e1153, + 0x031e3047, + 0x40273087, + 0xf305c127, + 0xf455f135, + 0xf425f415, + 0x0b1ef445, + 0xf1930627, + 0x5e00ca64, + 0x0d07fd13, + 0xe027df07, + 0xdc031027, + 0x61cec20c, + 0x410b4f07, + 0x04c14201, + 0x27245234, + 0x69f19306, + 0xf05e00ca, + 0x0b4d07fc, + 0x71430141, + 0x30329b04, + 0x0000004f, + 0x50430b70, + 0x0000014f, + 0x930627f0, + 0x00ca71f1, + 0xa1fcce5e, + 0x30b76604, + 0x0000004f, + 0xd0430b70, + 0x0000014f, + 0x062738f0, + 0xca81f193, + 0xfcb15e00, + 0x062749a6, + 0xcaa2f193, + 0xfca55e00, + 0x44d60471, + 0x458604a1, + 0xf1930627, + 0x5e00cac4, + 0x04c1fc93, + 0x27458634, + 0xddf19306, + 0x845e00ca, + 0x03e103fc, + 0xc0040314, + 0x725e0ee3, + 0x930627ff, + 0x00caeef1, + 0x83fc6e5e, + 0x4efb8ef1, + 0x272007fe, + 0x00f09310, + 0x5bbe00cb, + 0x3ea7ffb9, + 0x27ffffff, + 0x4134bd41, + 0xff4ea70a, + 0x4201fd4f, + 0xf49b4027, + 0x0e34990e, + 0x323b3127, + 0x2ea734cb, + 0x38fd4fbf, + 0x05412731, + 0x03315324, + 0x2732d624, + 0x7d78414f, + 0x8ef4e801, + 0x0bfe0bfe, + 0x07fb4efe, + 0x121f9bb0, + 0xcabef093, + 0x7bdebe00, + 0x93b11100, + 0x00cacbf0, + 0x007bd3be, + 0xf093b121, + 0xbe00cad2, + 0x01007bc8, + 0xd9f093b1, + 0xbdbe00ca, + 0xc027007b, + 0xd231db07, + 0xf0931c07, + 0x0300cada, + 0x7baabec1, + 0xc4d40300, + 0x07ec0fcc, + 0x9efb0e0b, + 0x4effb974, + 0x07a007f9, + 0x27c207b1, + 0x1c1e409c, + 0xcc10dc07, + 0x07d90741, + 0x7f55be1d, + 0x070a0702, + 0x7f37be1d, + 0x0bcd2b02, + 0x07ad0bbd, + 0x8ec0760b, + 0x334007f9, + 0x2b033345, + 0x8c40f940, + 0x83ff0001, + 0x03330f0c, + 0xff7e0e23, + 0xa12a9eff, + 0xd5f29302, + 0x3ea70398, + 0x27fefdf3, + 0x3101304c, + 0x21053403, + 0xf4a82403, + 0xf49b4027, + 0xa7fe0b0e, + 0xfefdf32e, + 0x98b2f393, + 0x304c2703, + 0x34033101, + 0x24032105, + 0x4027f4a8, + 0x0b0ef49b, + 0x2f3ea7fe, + 0x4027fdeb, + 0x4f273405, + 0x14420000, + 0x40273415, + 0x0b0ef49b, + 0xa7f84efe, + 0xfdeb2fbe, + 0xc0278007, + 0x071a0c27, + 0x009f27a1, + 0xbe144200, + 0x05027f24, + 0x27b915bc, + 0x0ef49b40, + 0xe4bf3ea7, + 0x054427fd, + 0xa73a1534, + 0xfde4af4e, + 0x48053c35, + 0x0c274a15, + 0xbe4c351a, + 0x05027efc, + 0x27b915bc, + 0x0ef49b40, + 0x0399f88e, + 0xa6400704, + 0x0936c035, + 0x38203a40, + 0x031e0027, + 0x44990427, + 0x06458606, + 0x00372035, + 0xa338043a, + 0x4efe0b08, + 0x07d107fc, + 0x8456bec0, + 0x99051602, + 0x4c4404d4, + 0x9d412710, + 0xc49d0bd4, + 0x8475be04, + 0x40d0c502, + 0xf84efc8e, + 0x9007f063, + 0x0307d207, + 0xb107a307, + 0x027401be, + 0x34833007, + 0x3fe6c007, + 0xb899009c, + 0x108ce404, + 0x0cfc0094, + 0xa7008f20, + 0xffffffbe, + 0x0620b4d1, + 0x038e4ff6, + 0x038a08f8, + 0xffffcea7, + 0x99c4b9fe, + 0x104cf80d, + 0x0a07037c, + 0x16be0123, + 0x0fe6ffce, + 0x00270370, + 0x000f74be, + 0x013cc3d1, + 0x0a34b4d1, + 0x035e34e2, + 0x9846fc93, + 0x070f0703, + 0xf10dbe1c, + 0x2704f6ff, + 0x03505e08, + 0x0c07c441, + 0x40004ea3, + 0xbec44501, + 0x99fff197, + 0x41246194, + 0x88be0027, + 0x0a07ffed, + 0xffbefbbe, + 0xd89d4027, + 0xc8d48d0a, + 0x949d4227, + 0x34b4d104, + 0x0303270a, + 0x34b4d541, + 0x03145e0a, + 0x2612b499, + 0x27357645, + 0x03085e05, + 0x0302c8f8, + 0x26bbb499, + 0xacb0c146, + 0xbefc0c03, + 0x27ffeab0, + 0xbbb49d40, + 0x1630b4c1, + 0x070d0747, + 0x0814be1b, + 0x27051600, + 0xdb5e0c0c, + 0x28d48902, + 0x8930b4c5, + 0x412428d4, + 0x02cac8f8, + 0x4d83071e, + 0x45f68000, + 0x50be0b07, + 0x0616ffc1, + 0xb75e0b27, + 0x05b49902, + 0x01be44c6, + 0xcea7ffc0, + 0xd1ffffff, + 0xc10620c4, + 0x410344b1, + 0xd558d1c5, + 0x070620c4, + 0xf1f0931b, + 0x28be0465, + 0xd0c5ffbd, + 0x11b2995c, + 0x9960d29d, + 0xd39d13b3, + 0x04b49961, + 0x9d28d389, + 0xb1990ad4, + 0xd5402707, + 0xd50120d4, + 0x070124d4, + 0x0bd19d43, + 0x80004d83, + 0x00d44fe6, + 0x477e0b07, + 0x89d381fe, + 0x30ab1eb2, + 0x8544d4c1, + 0x3cd28dd3, + 0x3cd8411c, + 0xd3991bc0, + 0x3c90990a, + 0x070e34dc, + 0x404a8343, + 0x06b4994a, + 0x377647a6, + 0x161e0047, + 0x990ad499, + 0x448306b3, + 0x44861127, + 0x912b1027, + 0x3b3e9099, + 0x20b48903, + 0x0b44d3c1, + 0x3ed48d40, + 0x831ab289, + 0xd28d203c, + 0x1cb48926, + 0xd48dd281, + 0x22b48924, + 0x530f4c03, + 0xe6215844, + 0x40d48d37, + 0x3706161e, + 0xd840d48d, + 0x8910c02c, + 0x410322b4, + 0x4c034173, + 0x8d44530f, + 0xb49942d4, + 0x9949e605, + 0xd1b107b4, + 0x35333407, + 0x342b4333, + 0x019831f5, + 0xd4c1ff00, + 0xf5d28130, + 0x00019034, + 0x40d189ff, + 0x80002da3, + 0x01a031ed, + 0xd285ff00, + 0x4c83d481, + 0xf34fe6c0, + 0xd5465300, + 0x5e0124d4, + 0x31e000ea, + 0xb1c100e6, + 0x1ab289c0, + 0xf81cb389, + 0x00920e1c, + 0xa307d481, + 0x53c04c83, + 0xd5920746, + 0x5b0124d4, + 0xd8945ba4, + 0xd86a0c1c, + 0xc4a92118, + 0x24020d6e, + 0x4ea72407, + 0xa9ffffff, + 0x890d7043, + 0x43221cb4, + 0x031e0307, + 0x92070407, + 0x14d8a007, + 0xffcea71e, + 0xc1a9ffff, + 0x09070d72, + 0x00a5b4be, + 0x0d74c1a9, + 0x0a079007, + 0x00a5a8be, + 0xd481a007, + 0x34474183, + 0x3f0b31a3, + 0x938b2407, + 0x49072103, + 0xa38b425b, + 0x912744d6, + 0x4a07923b, + 0x44d6425b, + 0xa23ba127, + 0x2907d481, + 0x21e33a07, + 0x413831e3, + 0x33e33a07, + 0x0028d489, + 0x2401214d, + 0xe311214d, + 0x8131e321, + 0x104c58d4, + 0x8d26d38d, + 0x071e24d2, + 0x8d26d28d, + 0xdc8124d3, + 0x4c070b07, + 0x53304c83, + 0x33340744, + 0x2b444733, + 0x33430734, + 0xd5432b44, + 0x7e0120d4, + 0xc0abfc96, + 0xb2c1dc85, + 0xc4d2c538, + 0x9dbab399, + 0xb49962d3, + 0x28d389b8, + 0x40ced49d, + 0x2eb18931, + 0x1ec8d18d, + 0x8d412709, + 0xb38dc8d4, + 0x14b2992e, + 0x99ccd29d, + 0xd39d15b3, + 0x18b299cd, + 0x89a8b4c1, + 0xd29d2cb1, + 0x34b3c163, + 0xd335d415, + 0x3d074b07, + 0x0308d18d, + 0x4c03d03c, + 0x102c2768, + 0x44034101, + 0x34033105, + 0xb2c1f2a8, + 0xd500275c, + 0xc10110d2, + 0xd3d560b3, + 0xb4c10114, + 0x18d4d564, + 0x30b1c101, + 0x6382f493, + 0x1cd1d504, + 0xbcb28901, + 0x996c44c1, + 0xd4d5c0bb, + 0xd2ad012c, + 0xdbbd0150, + 0x071e0152, + 0x031e0727, + 0xf0430627, + 0xf393f88e, + 0xc50480cc, + 0x30c59031, + 0x2704e68c, + 0x99349d41, + 0xfe4efe0b, + 0x6342f393, + 0x58349904, + 0x991f41c4, + 0x47660534, + 0x4ea73127, + 0xbdffffff, + 0xbe0ce543, + 0x270013ea, + 0x95f49330, + 0x439d0480, + 0xa7fe8e99, + 0xffffff4e, + 0x0ce544b9, + 0xf4934606, + 0x99048080, + 0x42049844, + 0x0013c59e, + 0x929efe0b, + 0xfe4e0012, + 0x0276c4be, + 0x001288be, + 0x00147cbe, + 0x1f9efe0e, + 0xf0630014, + 0x0bba4d27, + 0x4c27f40d, + 0x07f42d28, + 0x43f00110, + 0xedde9ef0, + 0xa7f94eff, + 0xfeffff3e, + 0x0d9934b9, + 0x00cf48fc, + 0x83093499, + 0x33348743, + 0xf9432b44, + 0x00004d4b, + 0xbabfe6ff, + 0xff4ea700, + 0x43b9ffff, + 0x42b90a5a, + 0xc4070a5b, + 0xd307322b, + 0x0027df6b, + 0x8006f993, + 0x8dfa9304, + 0x875e0462, + 0x5023f900, + 0xf9ff000a, + 0x000a4824, + 0x1b3d1bff, + 0x034f4b4d, + 0x803c5c21, + 0x2027412c, + 0xf100051e, + 0xc4b92127, + 0x45a60ce5, + 0x0a5bc3b9, + 0x0a9a9499, + 0x99202743, + 0x472605a4, + 0x0a59c4b9, + 0x0a58c3b9, + 0x4cdc4d1b, + 0x4d070a80, + 0x4f4b432b, + 0x064941c8, + 0x834d072d, + 0x04070f4c, + 0x45330333, + 0x0e23040b, + 0x71fff5a4, + 0x0b046103, + 0x27046543, + 0x7e047540, + 0xc4b9ff32, + 0x3d070a5b, + 0x41233103, + 0xc4bdd307, + 0xdf6b0a5b, + 0xc4b90127, + 0x4dce0a5a, + 0x271b070b, + 0x1e110320, + 0x8e00278a, + 0x7efd4ef9, + 0xdea7ff1d, + 0x1effffff, + 0x5ad4b92c, + 0xbd41230a, + 0xb90a5ad4, + 0x830a5ad0, + 0x40070f0c, + 0x03334533, + 0x0e23040b, + 0x7efff5a4, + 0xd4b9fede, + 0x41230a5b, + 0x0a5bd4bd, + 0x0a5bd4b9, + 0x27cf4fd6, + 0xff1ea720, + 0x3827ffff, + 0x0a5a14b9, + 0x0a4824fd, + 0x24fdff00, + 0xff000a50, + 0xf3582103, + 0x0a5914bd, + 0x0a5814bd, + 0xfe4efd8e, + 0x0012d9be, + 0x1ea72027, + 0x27ffffff, + 0xfd402738, + 0x000a4824, + 0x982103ff, + 0x5b14bdf3, + 0x5814bd0a, + 0x5a14bd0a, + 0x93fe8e0a, + 0x047417f4, + 0xfe0b4001, + 0x0d99fd4e, + 0x07200709, + 0x03e0273d, + 0x990a1e31, + 0x21030c24, + 0xe103144e, + 0xfd8ef3a0, + 0x070cec03, + 0x2330074d, + 0x233e0b41, + 0x049d0cec, + 0x39091e09, + 0x1de10334, + 0x99310334, + 0xe4ca0904, + 0x93fd8ef3, + 0x0473cff4, + 0x10272027, + 0x429d30a7, + 0x09429d0b, + 0x070a429d, + 0x08439d24, + 0x0a5041d5, + 0x41d54115, + 0x2c030a54, + 0x193c272c, + 0x241d4027, + 0xb0682c03, + 0x4efe0bf3, + 0xe1f493fc, + 0x4dd10460, + 0x10270400, + 0x27223c27, + 0x07213b21, + 0x964d8b42, + 0x65f4934d, + 0x4e010471, + 0x41073107, + 0x33334633, + 0x3e0b340b, + 0x2b803d03, + 0x01124c27, + 0x0504030c, + 0xa834033c, + 0x073107f4, + 0x33463341, + 0x0b340b33, + 0x9034d13e, + 0xe32dab2b, + 0x01fc0e4e, + 0x2b9034d5, + 0x608af493, + 0x0042d504, + 0x03fc8e04, + 0xa8f3f011, + 0x3ea7fc8e, + 0x27fffe6f, + 0x3423221c, + 0x34033401, + 0x00004ed8, + 0x32211303, + 0x047124e6, + 0x011424ce, + 0x8124e632, + 0x0b24ce04, + 0xf0183c03, + 0x0027ddf1, + 0x0127fe0b, + 0x0fabfe0b, + 0x109b1fab, + 0x41534107, + 0x0447410b, + 0x400b4433, + 0x0e034753, + 0x0b010000, + 0x4efe0b04, + 0x070c41fc, + 0x532c07dc, + 0x2e8318dc, + 0x53fe0000, + 0xd103112c, + 0xd2302103, + 0x071e0127, + 0x22140127, + 0x3ea70027, + 0xa9ffffff, + 0x070d6e34, + 0x46ef6be0, + 0x7034a945, + 0x9601270d, + 0xa7002744, + 0xfd4fff4e, + 0x277443c1, + 0xc014c541, + 0x3fdc0f6b, + 0x20000000, + 0xc6e4b678, + 0x0427730f, + 0xc2aaf193, + 0x960c1e00, + 0x270706e4, + 0xcbf19304, + 0x3b9e00c2, + 0x06060076, + 0xf1930427, + 0x1e00c31b, + 0xc54227f2, + 0xe726c014, + 0x22d0d214, + 0xff3ea713, + 0x4427ffff, + 0x0d7432ad, + 0xadc014c5, + 0xc60d723d, + 0xff2ea706, + 0x3127ffff, + 0x23ad4827, + 0x14c50d74, + 0x7223adc0, + 0xc014c10d, + 0x1e0c4cd8, + 0x301a1489, + 0x1c148942, + 0x271342d4, + 0x18f19304, + 0xa31e00c3, + 0x94c0ccdc, + 0x1ea0efd6, + 0x63fc8ec7, + 0xb94d27f0, + 0x0d03410b, + 0x484c27f4, + 0x1007f42d, + 0x10003da3, + 0x1345f001, + 0xde9ef043, + 0xfb4effe9, + 0xd007f063, + 0x0f07b107, + 0x90faf193, + 0xe97dbe03, + 0xed0fe6ff, + 0xc4f40900, + 0x750bb94d, + 0x4ce4f429, + 0x9900d548, + 0x4cc004d4, + 0xd1c11010, + 0xd5f093ac, + 0x1c030390, + 0xf1e3bef4, + 0xb1f493ff, + 0x44010471, + 0x90c2f393, + 0xd8498603, + 0x1380004d, + 0x83183489, + 0xd680004d, + 0x93062747, + 0x00c2d2f1, + 0x41c4101e, + 0x18348911, + 0x06274140, + 0xc2f7f193, + 0x75449e00, + 0x18338900, + 0x7176f493, + 0x030b0704, + 0xf193100c, + 0x27039084, + 0x4305482c, + 0x02747cbe, + 0x731e0127, + 0x0bbc4dc4, + 0x6dfc9362, + 0xc4890390, + 0x03f3291a, + 0x344e204c, + 0xf1930627, + 0x1e00c2f8, + 0x18c489c1, + 0xa93a42c4, + 0x660148b4, + 0x93062745, + 0x00c319f1, + 0x0b07ac1e, + 0x01300d03, + 0x2c271c07, + 0x7437be20, + 0x04d49902, + 0x992a44d8, + 0x48d616d4, + 0xf0931c07, + 0x27039214, + 0x1ebe202c, + 0x151e0274, + 0xf1930627, + 0x5e00c338, + 0x0627ff79, + 0xc36df193, + 0xff6f5e00, + 0xf0430027, + 0xf54efb8e, + 0x11998107, + 0x83f26304, + 0x61f16514, + 0xd5f393f2, + 0x50070470, + 0x5c039007, + 0x26310110, + 0x08329928, + 0x20c82f4b, + 0x87320718, + 0x2b343342, + 0x33320b34, + 0x683f0333, + 0x9900051a, + 0x46162c34, + 0xf3553027, + 0x70cef293, + 0x193c2704, + 0x11c0591e, + 0x168499f0, + 0x3c034186, + 0x27450744, + 0x3001121c, + 0x40053403, + 0xf1a84403, + 0x32874207, + 0x432b4433, + 0xf393420b, + 0xa7047074, + 0x9d433320, + 0x430b0832, + 0x072b4399, + 0x9d310305, + 0x18072b43, + 0x07fd7a7e, + 0x300d0309, + 0x59f19301, + 0x2c270391, + 0x7363be20, + 0x5e712702, + 0x241904db, + 0xf6682c03, + 0x5104bd4f, + 0x073907f1, + 0x33418761, + 0x0b642b64, + 0x03633361, + 0x051a686f, + 0x03260700, + 0x3c03442c, + 0x75702710, + 0x5ef385f2, + 0x050703b8, + 0x2c7e1807, + 0x048499fd, + 0x51104ce0, + 0x01f49303, + 0x43010470, + 0x80013d40, + 0x80213d20, + 0x80023d00, + 0x80223de4, + 0x8099020a, + 0x248c8906, + 0x1c07f015, + 0xc1030546, + 0x11531c07, + 0x9789c123, + 0x2774d640, + 0xc10a1e40, + 0x45534494, + 0x41c34183, + 0xf4254f6b, + 0xd6228e89, + 0x1e4e0744, + 0x33470705, + 0x449ac144, + 0x41072407, + 0x13831a07, + 0x030f2c03, + 0xf1450f4c, + 0x44532453, + 0xd4071646, + 0xd8032703, + 0xd7e327e3, + 0x10000d27, + 0xd407081e, + 0x0c27d103, + 0x83430780, + 0x203cd842, + 0x2745060f, + 0x1e02901d, + 0xe01d2713, + 0x060d1e01, + 0x001d2745, + 0x27051e02, + 0x0701801d, + 0x3531833a, + 0x0735c6f3, + 0x7f4c8341, + 0x1c0344e6, + 0x07142b80, + 0x333d9b32, + 0x07012334, + 0x03408b43, + 0x0b44c601, + 0x07342b30, + 0x07029b01, + 0x0320871d, + 0x53420713, + 0x7f4c8312, + 0x44e61123, + 0x2b802c03, + 0x1b418724, + 0x07409b4d, + 0x7f0c8304, + 0x4c0304e6, + 0x07402b80, + 0x03b19bb2, + 0xb30b0fec, + 0x4e07b40b, + 0xf0114453, + 0xec23f405, + 0x0705260f, + 0x5e34072b, + 0x948100da, + 0x27c04c5c, + 0x5e302720, + 0xde0700ce, + 0xd103f121, + 0x14d6d173, + 0x061e2d07, + 0x33429289, + 0x28938924, + 0x3ce3a818, + 0x10ac3830, + 0x31a337e3, + 0x41034c07, + 0xf0414173, + 0x030f2c03, + 0x24530f4c, + 0x06464453, + 0x2703e407, + 0x27e3e803, + 0x0d27e7e3, + 0x081e1000, + 0xe103e407, + 0x07800c27, + 0xd8428343, + 0x060f203c, + 0x901d2745, + 0x27131e02, + 0x1e01e01d, + 0x2745060d, + 0x1e02001d, + 0x801d2705, + 0xc6f33101, + 0x83410735, + 0x44e67f4c, + 0x2b801c03, + 0x9b320714, + 0x2334333e, + 0x8b430701, + 0xc6010340, + 0x2b300b44, + 0x9b010734, + 0x871e0702, + 0x07130320, + 0x83125342, + 0x11237f4c, + 0x2c0344e6, + 0x87242b80, + 0x9b4e1b41, + 0x83040740, + 0x04e67f0c, + 0x2b804c03, + 0x0b219b40, + 0x033d0723, + 0x240b0f3c, + 0xf4013453, + 0x30274722, + 0x9489121e, + 0x02102742, + 0x07112734, + 0x0741c341, + 0xc13f6b34, + 0x4bea3494, + 0x94c1013b, + 0x3442ea38, + 0xe6f02101, + 0xf601370f, + 0x5e01333f, + 0x31c40127, + 0x2280891b, + 0x7e248189, + 0x94c1fada, + 0x1440fa44, + 0x27402701, + 0x4894c571, + 0x8101155e, + 0x1c848997, + 0xac83a707, + 0x1a808910, + 0x3407a506, + 0x051ed007, + 0xd4073007, + 0xf8c084c1, + 0x00cf0e4c, + 0xa40c4cf8, + 0x5148d800, + 0x4ea7a886, + 0xa9ffffff, + 0x890d7043, + 0x43221c84, + 0x031e2307, + 0x4ea72407, + 0xa9ffffff, + 0x890d6e43, + 0x211e1a84, + 0xffff4ea7, + 0x6e43a9ff, + 0x1a84890d, + 0x23074322, + 0x2407031e, + 0xffff4ea7, + 0x7043a9ff, + 0x1c84890d, + 0x03074322, + 0x0407031e, + 0x261eb207, + 0xffff4ea7, + 0x724ca9ff, + 0x7441a90d, + 0xd64c070d, + 0x07c107a4, + 0xbe030714, + 0x07009ba5, + 0x071c07b0, + 0x9b9bbe0d, + 0x83470700, + 0xa3344741, + 0x073f0b31, + 0x8b14072b, + 0x07110323, + 0x8b415b42, + 0x2744d603, + 0x07213b21, + 0xf6415b40, + 0x3b012746, + 0x07101e01, + 0xc04c8347, + 0x0d074653, + 0x045b2307, + 0x3207245b, + 0x31e3d007, + 0x71d8d1e3, + 0x07a5060d, + 0x1e33e332, + 0xe3d00705, + 0x289489d3, + 0x01214d00, + 0x11214d24, + 0xd1e331e3, + 0x2a509489, + 0x52948943, + 0x070ad4c2, + 0xfaad7e05, + 0x591e7027, + 0x40a77127, + 0x6caef193, + 0x9df26104, + 0x24e60814, + 0x139df351, + 0xb083c108, + 0x89b484c1, + 0x93652892, + 0x2d839475, + 0x26068000, + 0x76409489, + 0x4494c145, + 0xc5204ca3, + 0xf3714494, + 0x2c27f481, + 0x03400112, + 0x03300544, + 0x27f2a834, + 0x9d402731, + 0x649d2c63, + 0x2b639d29, + 0x00f57ff6, + 0x6c5af293, + 0xfc240104, + 0xe180004d, + 0x95f39300, + 0x32d10459, + 0x10270400, + 0x27223c27, + 0x07d13bd1, + 0x46428b4d, + 0x3341074a, + 0x0b133346, + 0x11f49314, + 0x4401046a, + 0x2b801d03, + 0x0507140b, + 0xbe482c27, + 0x93026f35, + 0x04595ff0, + 0x040004d1, + 0x04d54deb, + 0xf75e0400, + 0xf01103fb, + 0x0807c2f3, + 0x0f7e1907, + 0xe70ff6fa, + 0x008d5efb, + 0x593af093, + 0x0004d104, + 0x3bb12704, + 0xc9f193bc, + 0x4b8b0469, + 0x4ac61301, + 0xdc074c07, + 0xd3334633, + 0xdd03d40b, + 0xd30b2b80, + 0x977e0d07, + 0x2707f6f8, + 0x1d07482c, + 0xd6be0507, + 0xf293026e, + 0xd1045900, + 0xeb040024, + 0x0024d54b, + 0xfb985e04, + 0xccc0c103, + 0xad1e1122, + 0x6b7e0507, + 0x870fe6f8, + 0x7e0507fb, + 0x1907f7f7, + 0x9f7e0807, + 0x030176f9, + 0xb2c2bea1, + 0x18a2c0ff, + 0xf451111e, + 0xf4554103, + 0xfb34f3f8, + 0x081e7027, + 0xc027a027, + 0x07ff775e, + 0x8ef24307, + 0x07f74ef5, + 0x93d007a0, + 0x0475b7f8, + 0x421e7027, + 0x7103db11, + 0xbae6d021, + 0x90078201, + 0x9f03ca07, + 0x000524c0, + 0xb2cec00b, + 0x0719070b, + 0x62b6be0c, + 0x07078600, + 0xbe0c071b, + 0x11ffdd6c, + 0x050907d4, + 0x21d21184, + 0x151c07d4, + 0x62bbbe84, + 0x03d80300, + 0xcaa40188, + 0xfd93bb74, + 0x99046b0c, + 0xd49909d2, + 0x1d24ce0a, + 0x8b0ef393, + 0x134c2703, + 0x34052123, + 0x18270307, + 0x2dbe3215, + 0xd499ffdd, + 0x0ad49d09, + 0xf94ef78e, + 0x07090499, + 0x99400bc0, + 0x4b070b4b, + 0x44333b87, + 0x4b0b432b, + 0xd4074333, + 0xd399d00b, + 0x0394072d, + 0xdac1449c, + 0xc136e68c, + 0x090b54d4, + 0xc50c4ce3, + 0x107e54d4, + 0x9d4027f7, + 0x121e2dd4, + 0x0d030a07, + 0x3a7e011c, + 0x0b0c07ff, + 0xe2d5be09, + 0x07a946ff, + 0x87a1193b, + 0xd1f0934b, + 0x34330457, + 0x02d1342b, + 0x41270434, + 0x413b3b0b, + 0x333342cb, + 0x04d53c0b, + 0x40270434, + 0x998c34c5, + 0xc30109c4, + 0xc49d4123, + 0x2b31c009, + 0x4b873b07, + 0x342b3433, + 0x33333b0b, + 0x34993c0b, + 0x9946262a, + 0x41272e32, + 0x423bc311, + 0xc31534ab, + 0xc499091e, + 0x9d41230b, + 0x4b070bc4, + 0x44333b87, + 0x4b0b432b, + 0x4c0b4333, + 0x439d3027, + 0x54c4d12c, + 0xd541030a, + 0x8e0a54c4, + 0x6bfa4ef9, + 0x930be60f, + 0x046a0bf3, + 0x41c03401, + 0x09319934, + 0x0c030307, + 0x03102b0c, + 0x051a751f, + 0x19191e00, + 0x07010303, + 0x33238743, + 0x0b422b44, + 0x27433343, + 0x9543fd31, + 0x2800051a, + 0x7e061ef1, + 0x061efef2, + 0x69cefd93, + 0x09d49904, + 0x42360d07, + 0xfa93c027, + 0x930467a4, + 0x045703fb, + 0x0400b4d1, + 0xdc3bd127, + 0xa0014d8b, + 0x4c074806, + 0x36333c07, + 0x430b4333, + 0x2b804d03, + 0xd8be040b, + 0xb4d1ffe1, + 0x4deb0400, + 0x0400b4d5, + 0xccc4c103, + 0xfc93cf22, + 0x270469b0, + 0x86c419d0, + 0x870d0747, + 0x2b04334d, + 0x330d0b04, + 0xac0f0303, + 0xbe00051a, + 0x27ffe1a7, + 0x03c41d40, + 0x68cc03d1, + 0xda19dcc4, + 0xf4933027, + 0x05046954, + 0x4efa8e43, + 0xff4ea7f5, + 0xf293ffff, + 0x01046944, + 0x2043d127, + 0x23a00706, + 0xac08c131, + 0xf0630707, + 0x062043d5, + 0x27602c03, + 0x210d23b0, + 0x191c2780, + 0x84912301, + 0x2e682c03, + 0x90b10334, + 0x873b07f1, + 0x2b34334b, + 0x333b0b34, + 0xbc34f133, + 0xdc00051a, + 0x610e0c4c, + 0x83430783, + 0x48240c4c, + 0x836532a3, + 0x3b874b07, + 0x432b4433, + 0x43334b0b, + 0x1a684f03, + 0x42c10005, + 0x03836154, + 0x32ab444c, + 0x38078365, + 0x2c273803, + 0x03310112, + 0x03410534, + 0x07f2a844, + 0x333b874b, + 0x0b432b44, + 0x10a3994b, + 0x4f034333, + 0x00051a68, + 0x439d3153, + 0x05a3992e, + 0x892a439d, + 0x41242084, + 0x041e2027, + 0x0713a299, + 0x333b874b, + 0x0b432b44, + 0xfd43334b, + 0x051a9542, + 0x62ad9900, + 0xc160a489, + 0xd4585ca0, + 0xc0270027, + 0xc407031e, + 0x7616a499, + 0x0729364f, + 0x333b874b, + 0x0b432b44, + 0xf543334b, + 0x051af448, + 0x9df19300, + 0x83190455, + 0x043412d1, + 0x433b4127, + 0x14d542ab, + 0x4b070434, + 0x44333b87, + 0x4b0b432b, + 0x3304a199, + 0x684f0343, + 0x9d00051a, + 0xa3c12841, + 0x3840c534, + 0xa73c43c5, + 0x4043c530, + 0xd804a499, + 0xd2e35644, + 0x71c4521e, + 0x874b072a, + 0x2b44333b, + 0x334b0b43, + 0xf448f543, + 0x1900051a, + 0x41f29384, + 0x17070455, + 0x043423d1, + 0x4107143b, + 0x24d543ab, + 0x3b070434, + 0x34334b87, + 0x3b0b342b, + 0x3f033333, + 0x00051a68, + 0x123834c1, + 0x3830c540, + 0xc534a4c1, + 0x40274034, + 0x0728349d, + 0x333b874b, + 0x0b432b44, + 0x2743334b, + 0xb1f993e0, + 0x51270467, + 0x5027d496, + 0x68836d07, + 0x1a984ced, + 0x551e0005, + 0x1a74e0f9, + 0xc0270005, + 0x40872007, + 0x242b2433, + 0x2333200b, + 0x1a682f03, + 0x24990005, + 0x9946662a, + 0xa3c12e24, + 0x8b143b3c, + 0x27148613, + 0x2a2c9dc1, + 0x41249401, + 0xf1051127, + 0x30874007, + 0x432b4433, + 0xf301400b, + 0x4f034333, + 0x00051a68, + 0x9d29439d, + 0xe1032d46, + 0x05099499, + 0xda1127f5, + 0x9401a3e4, + 0x112f41c0, + 0x3ca2c19e, + 0x30274e07, + 0x031e42eb, + 0x0307418b, + 0x11231407, + 0x31030f6b, + 0xf3934296, + 0x9904671c, + 0x2e8b0b34, + 0x349d402b, + 0x1e32150b, + 0x9d402706, + 0x3b070b94, + 0x34334b87, + 0x3b0b342b, + 0x3f033333, + 0x00051a68, + 0x232b3499, + 0x2b349d41, + 0x7124d21c, + 0x349d4127, + 0x87cb0729, + 0x2bc4334b, + 0x33cb0bc4, + 0x68cf03c3, + 0xc100051a, + 0xc39954c4, + 0x8394072d, + 0x0100009e, + 0xc4c549cb, + 0xbdfd9354, + 0x39960466, + 0x0a50d4d1, + 0x41030d07, + 0x0a50d4d5, + 0x997e1b07, + 0x50d4d1f2, + 0xc561270a, + 0xd09934c4, + 0x38ccc109, + 0xdb071007, + 0x1103e027, + 0x4ce37f1e, + 0x54c4c50c, + 0x2709d499, + 0x61461660, + 0x004e5884, + 0x41270100, + 0x1e2cc49d, + 0x87cb0720, + 0x2bc4334b, + 0x33cb0bc4, + 0x030c07c3, + 0x051aac0f, + 0xf2c17e00, + 0xc4fd4027, + 0x00051a94, + 0x4b873b07, + 0x342b3433, + 0x33333b0b, + 0xf0934027, + 0x07046644, + 0x9534fd1b, + 0x7e00051a, + 0x501ef228, + 0x1a74e4f9, + 0x24070005, + 0x24333487, + 0x240b232b, + 0x2f032333, + 0x00051a68, + 0x96292499, + 0x3824c145, + 0xe1034c32, + 0x93daf1f0, + 0x04660bf4, + 0x2e073007, + 0x14073103, + 0x1a742f03, + 0x439d0005, + 0x190b1e09, + 0x1de10324, + 0x0721032d, + 0x091499d4, + 0x07f1e4ca, + 0x334b873b, + 0x0b342b34, + 0x0333333b, + 0x051a683f, + 0x2a349900, + 0x65cef193, + 0x26449604, + 0x16a49968, + 0x71c04796, + 0x0b149918, + 0x149d4103, + 0x9965f60b, + 0x12112e34, + 0x343b3127, + 0x131532ab, + 0xf4939d06, + 0x990465a4, + 0x04070c43, + 0x23874307, + 0x422b4433, + 0x4333430b, + 0x43c1400b, + 0xab102754, + 0x5449c593, + 0x13f91d1e, + 0x00051a74, + 0x43071103, + 0x44332387, + 0x430b422b, + 0x31274333, + 0x1a9143fd, + 0x04990005, + 0xdf14da09, + 0x06b9a499, + 0x59f0934a, + 0x04990465, + 0xf948c609, + 0x051a7343, + 0x87430700, + 0x2b443323, + 0x33430b42, + 0x9344f943, + 0x9600051a, + 0xfa547e45, + 0x4f7e061e, + 0x93061efa, + 0x04652bfd, + 0x0709d499, + 0xf949c60d, + 0x051a7344, + 0x87240700, + 0x2b243334, + 0x33240b23, + 0x682f0323, + 0x9900051a, + 0x46262924, + 0xc62b2499, + 0x081ecd4f, + 0x177e0d07, + 0x93101efa, + 0x0464f3fd, + 0xfa939d07, + 0x03045234, + 0xdc990c9c, + 0x7dcfc609, + 0xffcb3fbe, + 0x994f0cca, + 0xa4990bd3, + 0x4643ca37, + 0x9909d399, + 0x23ca35a2, + 0x38a4c13d, + 0x075e4fc6, + 0x23130704, + 0xd1192b01, + 0x070a50dc, + 0x03020be9, + 0x051a751f, + 0x191b1e00, + 0x07e103e3, + 0x33238743, + 0x0b422b44, + 0xf1433343, + 0x051a9c44, + 0x224c1b00, + 0x1ef11804, + 0x09d49928, + 0xf908d399, + 0x051a7342, + 0xce3f4b00, + 0x32071723, + 0x34334287, + 0x320b342b, + 0x34f93333, + 0x00051a93, + 0xff6a4fe6, + 0x6462f493, + 0x09449904, + 0x6bf64c36, + 0x4ed88461, + 0x36010000, + 0x4b870b07, + 0x042b0433, + 0x03330b0b, + 0xcf03c007, + 0x00051a68, + 0xc62cc499, + 0x54c4c147, + 0x1aac0f03, + 0x4ea30005, + 0xe3014000, + 0x54c4c544, + 0xffdc62be, + 0xc49d4027, + 0x8ef0432c, + 0x63fc4ef5, + 0x3dfe93f1, + 0x00270464, + 0x1c272027, + 0x27e41919, + 0x03303b31, + 0x010368ec, + 0x23ab4486, + 0xfc93f170, + 0x990463f4, + 0xc39909c1, + 0x93c4110b, + 0x00b6bef0, + 0x00646bbe, + 0x3e1ed027, + 0x1a74d2f9, + 0xd1030005, + 0x42873207, + 0x342b3433, + 0x3333320b, + 0x1a683f03, + 0x3e990005, + 0x2934992b, + 0x3e99fe05, + 0x99fe152c, + 0xfe252d3e, + 0x352a3e99, + 0x2e3e99fe, + 0x33c1fe45, + 0x642abe38, + 0x09c49900, + 0xf0931d07, + 0xda00b6b8, + 0xf143b7d4, + 0xfb4efc8e, + 0x07b90499, + 0x07b107d0, + 0x274616c2, + 0xb9049d41, + 0xb706f093, + 0xb78bbe00, + 0xc1c5e6ff, + 0x3b874cd2, + 0x320b4c87, + 0x340541a3, + 0xf94efb8e, + 0x9f07f0a3, + 0xc207a007, + 0x9403b307, + 0x52be211e, + 0xf3010260, + 0x1007f411, + 0x4b07342b, + 0xf3054c2b, + 0xd4070a07, + 0xd3074302, + 0xa73e2d07, + 0x1c07cd0b, + 0x39072f07, + 0xcbca0a07, + 0x8ef083d6, + 0xff4ea7f9, + 0x43b9ffff, + 0xf4930ce5, + 0x9d046dd4, + 0x32e49843, + 0x3ea70118, + 0x27fdefff, + 0x1034d540, + 0x1434d50e, + 0xff2ea70e, + 0x2411fd7f, + 0x00004ee3, + 0x27241502, + 0x2c34d543, + 0xff2ea702, + 0x34d1fbff, + 0x45660638, + 0x4fd82431, + 0x01000000, + 0xff1ea7f2, + 0x4027fbff, + 0x021812d1, + 0x021814d5, + 0x021013d1, + 0x6d7ef493, + 0x9443c504, + 0x10272028, + 0x11d10b1e, + 0x1f830218, + 0x0fffffff, + 0xefff3ea7, + 0xd54327fd, + 0xa1022834, + 0xfc48dc34, + 0xefff2ea7, + 0xdc24a1fd, + 0xfa08004d, + 0x24d54427, + 0x24d50228, + 0x3027022c, + 0x063823d5, + 0xebd72ea7, + 0x272305fd, + 0x0400004f, + 0x9b241508, + 0xf0930ef3, + 0xc1046d28, + 0x03998004, + 0xc5412b9a, + 0x18468004, + 0xffff4ea7, + 0x5a44b9ff, + 0x83432b0a, + 0x43330f4c, + 0x4301400b, + 0x312b4211, + 0x4115120b, + 0x3a1e4305, + 0xffff2ea7, + 0x5a24b9ff, + 0x2b3a060a, + 0x0f4c8343, + 0x44f14333, + 0x00052528, + 0x43074836, + 0x049d4123, + 0xbd41279a, + 0x99063524, + 0x40270f23, + 0x270ef49b, + 0xf5338741, + 0x02b04034, + 0xa73127ff, + 0xffffff4e, + 0x0ce543bd, + 0xfe4efe0b, + 0xffff0ea7, + 0xe504b9ff, + 0x6541c40c, + 0x6ca2fe93, + 0x90e4c104, + 0x03b945b6, + 0x04b90ce6, + 0x43ce0ce7, + 0xd73ea750, + 0x1027fdeb, + 0x4f273105, + 0x08040000, + 0x42273415, + 0x0ce504bd, + 0xc10ef19b, + 0xe4c18ce2, + 0xff3ea794, + 0x32d5fbff, + 0x48a30214, + 0x021034d5, + 0x7fff2ea7, + 0xe32421fd, + 0x0200004e, + 0x23112425, + 0x04bd4027, + 0x3ea30ce4, + 0x9d020000, + 0x231599e1, + 0xfe4efe8e, + 0x93fe5c7e, + 0x046c37f4, + 0x30272027, + 0xc59a439d, + 0x42c59442, + 0x8442c580, + 0x3ea7fe8e, + 0x27ffffff, + 0x271c2740, + 0x0ce734bd, + 0x0ce634bd, + 0xf3932027, + 0x07046c0c, + 0x23320541, + 0xb8340311, + 0xa73027f4, + 0xffffff4e, + 0x6bf6f293, + 0xe543bd04, + 0x8421c50c, + 0x0b8021c5, + 0xff3ea7fe, + 0x4027ffff, + 0x0ce434bd, + 0x0ce734bd, + 0x0ce634bd, + 0xf49b4027, + 0xa7fe0b0e, + 0xffffff3e, + 0x0ce530b9, + 0xf29309e6, + 0xc1046bc0, + 0x44f69024, + 0x06992499, + 0xe631b948, + 0xe732b90c, + 0xb901200c, + 0x060ce434, + 0x2b410746, + 0x134f6b42, + 0x4910104c, + 0x0bfee55e, + 0xa80499fe, + 0x4ea74626, + 0xc5fff5a7, + 0x41033804, + 0x0b3404c5, + 0xff4ea7fe, + 0x4411feff, + 0xf5b04e23, + 0x3404c5ff, + 0x04c54823, + 0x27fe0b38, + 0x0ef39b30, + 0xf49b4027, + 0x2bf49b2a, + 0x9b22f49b, + 0x039d23f4, + 0x4c049da9, + 0xc55003c5, + 0x03c55403, + 0x4403c590, + 0xc54803c5, + 0x03c5a003, + 0x4003c53c, + 0x9d4d039d, + 0x039d8b03, + 0x8a039d8c, + 0x3ea7fe0b, + 0x27fdeb27, + 0x27340540, + 0x0400004f, + 0x2734150d, + 0x0ef49b40, + 0x9b2bf29b, + 0xf29b22f2, + 0x23f29b2a, + 0x9b1c1ca3, + 0xfe0b20f1, + 0xfc4efe0b, + 0x0ae2f293, + 0x502ec104, + 0x334023c1, + 0x2b4307e3, + 0x0740084e, + 0x312d99e3, + 0x07302499, + 0x074d1bc2, + 0x1e2f6b24, + 0x41043117, + 0x0b210703, + 0x1b433343, + 0x4c2f6b4e, + 0x01011140, + 0x07fc8e00, + 0x07418342, + 0x33053304, + 0x07042b43, + 0x0c0f0312, + 0x030004c5, + 0xd2d2ce11, + 0xc1d0c0c1, + 0xfc8ed4c1, + 0x0a86f393, + 0xaa349904, + 0x42230f6b, + 0x6bb0309d, + 0x0f4c144f, + 0x30c50027, + 0x93fe0bbc, + 0x040a6bf4, + 0x0bcc40c1, + 0x28fb4efe, + 0x2720010d, + 0x1e20000d, + 0x03000c05, + 0x73d00707, + 0x23bd07d3, + 0x49f493b8, + 0x0b07040a, + 0x41c10fab, + 0x070833b4, + 0x1ee027c4, + 0x2fe4c47c, + 0x3f9b19d6, + 0x27b1c823, + 0xabbcc499, + 0x2df49b40, + 0x9b2d4f9b, + 0xe32b23ef, + 0xe403e373, + 0xc1214f9b, + 0x438bbcc3, + 0x11274486, + 0x0427ed3a, + 0x2f9b641e, + 0xbcc3c124, + 0xd8182c53, + 0x21c40d32, + 0x9b12440a, + 0x4827244f, + 0x3cd8151e, + 0x42071610, + 0xd4804c23, + 0x12c40e44, + 0x244f9b0b, + 0xf49b4627, + 0x18211e25, + 0x17a6403c, + 0x27244f9b, + 0x25f49b48, + 0x102724c6, + 0x1214051e, + 0xe1031103, + 0x2783edda, + 0x9b131e03, + 0xf293214f, + 0xc10409b0, + 0x0027bc23, + 0x24c5438b, + 0xa1f493cc, + 0x41c50409, + 0x4efb8eb4, + 0x07d007fb, + 0x272f6bb1, + 0x0000ff4f, + 0x21f49b40, + 0xfd7e0207, + 0x81fc93fe, + 0x40270409, + 0xc5c8c4c5, + 0xd726c4c4, + 0x1b070d07, + 0xffb305be, + 0xd8334d07, + 0xdc534f6b, + 0xc4c4c518, + 0xc1c8cdc5, + 0x4dd494c4, + 0x36198000, + 0x000d2746, + 0x27100780, + 0x63adbe20, + 0x98c0c500, + 0x80004d27, + 0x8e94c4c5, + 0x93fb4efb, + 0x040937fb, + 0x998cb399, + 0x0b078ab4, + 0xb49d43ab, + 0xd9f4938c, + 0x4c010469, + 0x026836be, + 0xd5204f9b, + 0x9b2000c4, + 0xc4d5234f, + 0x4f9b2004, + 0x99f39322, + 0xc4d5046a, + 0x4c272008, + 0x03b20136, + 0x033205b4, + 0x8ef4a834, + 0x93fc4efb, + 0x0408effc, + 0x0d274127, + 0xc49d2080, + 0x9e8ebea8, + 0x91f493ff, + 0x40050469, + 0x5a7e0c07, + 0x7e0c07fd, + 0x0c07fd7f, + 0x20271027, + 0xa7fdb57e, + 0xc49d7f4c, + 0xf74c27b0, + 0xc4c53027, + 0xc540a7ac, + 0xc49d9cc3, + 0xbcc3c5aa, + 0xc5c0c3c5, + 0xfc8eb8c3, + 0x93234f9b, + 0x04089ff3, + 0x34c54123, + 0x4efe0b40, + 0x91f493fe, + 0x43c10408, + 0x4c429940, + 0x432b4007, + 0x40282452, + 0x031ee027, + 0xf193e207, + 0xc1040878, + 0x20075013, + 0x33332e2b, + 0x432b4207, + 0xe007404c, + 0x2307e32b, + 0x9d4412c5, + 0xfe8e4e1e, + 0x0399fd4e, + 0x83d0078a, + 0x2734d637, + 0x99fd8e00, + 0x4fa38b04, + 0xffffffa0, + 0x049d43ab, + 0x230f9b8b, + 0x3e40d0c5, + 0xbe0d079f, + 0x99026711, + 0x00278bd4, + 0x01274618, + 0xfd4efd8e, + 0x7ea2f493, + 0x99410103, + 0xd4070442, + 0x4f9be927, + 0x203c2724, + 0x435b322b, + 0x410b4447, + 0x33e33407, + 0x000030f1, + 0x4238ff06, + 0x1e100c53, + 0x070fab03, + 0x0c3c5330, + 0x41273536, + 0x1e05d49d, + 0x06d49924, + 0x3cd047a6, + 0xf29b180c, + 0x53400725, + 0xf84d8341, + 0x0b20071f, + 0x0f2c8314, + 0x1eb4fef0, + 0x25f39b04, + 0x0fff0d83, + 0xfd4efd8e, + 0x07b6f093, + 0x66c9be04, + 0xadfd9302, + 0xd1c10407, + 0x030d0754, + 0xbe133311, + 0x070268f5, + 0x682cbe0d, + 0x9301b602, + 0x040793f0, + 0xc1fc3e7e, + 0xf093a4d1, + 0x27040788, + 0x5efd0e20, + 0xfb4efc6e, + 0x0107b007, + 0xe07ec107, + 0x070b07fe, + 0x68c3be1c, + 0x0e0b0702, + 0x67f89efb, + 0x9bfc4e02, + 0xf09323cf, + 0xc104075c, + 0x20273c01, + 0x026a6dbe, + 0x27234f9b, + 0x274c4e00, + 0x9b482701, + 0xfc8e25f4, + 0xd007fd4e, + 0x3f9b0401, + 0xc8432b23, + 0x03997240, + 0x93312409, + 0x026d40f2, + 0x32240d1e, + 0x03acf253, + 0xf253051e, + 0xf4930214, + 0x9d040718, + 0x42c5aa43, + 0x08d0999c, + 0x99fc837e, + 0x77be0ad0, + 0xf09b0266, + 0xbed00120, + 0xc0026b9e, + 0xf393f802, + 0x990406f4, + 0xd2118a34, + 0xc10e41d8, + 0x42079033, + 0x432b3333, + 0x23074108, + 0x06daf493, + 0x3c42c504, + 0x270bdd99, + 0x8b4d9d30, + 0x9b8c439d, + 0xfd0e230f, + 0x8efe2e5e, + 0xbdf493fd, + 0x40c10406, + 0x6bbf9e40, + 0x99f54e02, + 0x03993104, + 0x9802c130, + 0xc407432b, + 0xd007f0a3, + 0xb207cf6b, + 0x90278027, + 0xa0275027, + 0xe4bf6ea7, + 0xaf7ea7fd, + 0xf205fde4, + 0xa05ef115, + 0x83ec0700, + 0x074e07e1, + 0x3343333e, + 0x0b342b35, + 0x4130313d, + 0x0bf11134, + 0x33240740, + 0x03212b23, + 0x02237327, + 0x21200720, + 0x07a4d633, + 0x07522b54, + 0x94d4c11a, + 0x41ca120b, + 0x2b030b6e, + 0x280bce02, + 0x241e24d6, + 0x3ea7f3e8, + 0xc1fdefff, + 0x3327d434, + 0x53184c33, + 0x44c01d4c, + 0x156005ec, + 0x35402762, + 0x157b0564, + 0x07743572, + 0x3335333e, + 0x0b3e2be3, + 0x1430993d, + 0x0ca34807, + 0x9d49ab20, + 0x44d61430, + 0x39113801, + 0x47834007, + 0xc4074566, + 0x0710cca3, + 0x071d1ea1, + 0x0741034c, + 0x6bb20bc4, + 0x99a107cf, + 0xc4ee31d4, + 0xcc27ff5d, + 0xe8051e10, + 0xa7061ef3, + 0xfdefff2e, + 0x27d424c1, + 0x6a4ddc33, + 0xf111eefc, + 0x16be0d07, + 0xd4990267, + 0x30d39931, + 0x2407432b, + 0xd29d2f6b, + 0x27a4d632, + 0x233f1e00, + 0x07218321, + 0x33120742, + 0x2b153343, + 0x271d0b14, + 0x15149d40, + 0x01141c9d, + 0x451a35f4, + 0x15180515, + 0x99142519, + 0xd5c530d4, + 0x9d410390, + 0xd5c530d4, + 0x270d0750, + 0x6778be30, + 0x33001102, + 0x8ef08303, + 0xc1f84ef5, + 0xc007440d, + 0xa2079107, + 0x8027d7e3, + 0x6cbe0c07, + 0x0c070264, + 0x9a7e1d07, + 0x8ac499fe, + 0x4596b007, + 0xd3be0c07, + 0x41270265, + 0x40270496, + 0x8b07b822, + 0xf6da4fd6, + 0x50cdc1b4, + 0x0c07d333, + 0x0267babe, + 0x1b07b00b, + 0x18be0d07, + 0x49070264, + 0xa4124d2b, + 0x0907a027, + 0xf80e1a07, + 0x0263909e, + 0xf493fa4e, + 0x99040504, + 0x0ac14c43, + 0x4d439d3c, + 0xc0073027, + 0x074c439d, + 0x40d4c1d4, + 0x1b4cd399, + 0x2734324a, + 0x07400c20, + 0x070d0723, + 0x67f4be1a, + 0x44b00702, + 0x234f9b03, + 0x1e40d4c5, + 0x230f9b3b, + 0xc1fc327e, + 0x0d0744d1, + 0x026614be, + 0xc4aad499, + 0x4f9b1b41, + 0x40d3c123, + 0x4f50432b, + 0x70000001, + 0x03234f9b, + 0x0000004f, + 0x40d4c5f0, + 0xb4240d07, + 0x026529be, + 0x93a30fd6, + 0x04048ffd, + 0x9d4dd499, + 0xb4e04cd4, + 0xb2c4010a, + 0x8bc3991b, + 0xa38ac499, + 0x4783203c, + 0x0c0734ab, + 0xbe8bc39d, + 0x2702634d, + 0x99fa8e02, + 0xd49daac3, + 0x2740274d, + 0x4cd49d00, + 0xaebeb347, + 0x0f9b0268, + 0xfbb97e23, + 0xcabe0b07, + 0xd4990269, + 0x4cd49d4d, + 0x009d0bea, + 0x2724df9b, + 0x18dc5348, + 0xd025f49b, + 0x3f9b2fb9, + 0x25f49b24, + 0x33183c53, + 0xd0d3ab38, + 0x9b1e11bc, + 0x3827244f, + 0x9b25f39b, + 0xf39b242f, + 0x184c5325, + 0xe3104c33, + 0xffffff2e, + 0xd4ab42ab, + 0xc49d4027, + 0x234d078b, + 0xff4fd441, + 0x2a0fffff, + 0x07234f9b, + 0x40c4c504, + 0xc1fb527e, + 0xd33340c4, + 0xc0c1d40b, + 0x3ccdc5c0, + 0x026830be, + 0x278bc499, + 0x104ca300, + 0x8e8bc49d, + 0x234f9bfa, + 0x9340c4c5, + 0x0403bff4, + 0x9b4042c1, + 0x1f9b224f, + 0x8bc39923, + 0x2f03412b, + 0x7fffff00, + 0x3ca3242b, + 0x991e1e40, + 0x46d88ac4, + 0x232f9b22, + 0x998bc399, + 0x07e38ac4, + 0x83203ca3, + 0x40c2c547, + 0x200b34ab, + 0xc39d0227, + 0x3cc2c58b, + 0x0427fa8e, + 0xfa4efa8e, + 0x0372f393, + 0x4c349904, + 0x349dd007, + 0x9d40274d, + 0x04994c34, + 0x2c4f4b8b, + 0x1eb42740, + 0x27a30772, + 0x8adc99b0, + 0x9b3ca3c1, + 0x34ce234f, + 0x3cd1c10e, + 0x20270d07, + 0x026659be, + 0x0f9bb007, + 0xfaa17e23, + 0x0744d1c1, + 0x6483be0d, + 0x440d0702, + 0x63b8beb4, + 0x1e0ba602, + 0xc1c636cd, + 0x3f9b3ca4, + 0x2c432b23, + 0x8adc9941, + 0xd499c1a3, + 0x833c078b, + 0x204ca337, + 0xd49d43ab, + 0xbe0d078b, + 0x180261dd, + 0x99b227c6, + 0x4fa38bd4, + 0xffffff80, + 0xc08bd49d, + 0xd4996eb2, + 0xcc4f4b8b, + 0x01275b40, + 0x02685cbe, + 0xd630d499, + 0x1eb42744, + 0x234f9b4c, + 0xc58ad399, + 0x315840d4, + 0x3390d4c1, + 0x93191e43, + 0x0402bbf4, + 0x9b4044c1, + 0x2f9b223f, + 0x03322b23, + 0xffff004f, + 0xc5432b7f, + 0x4c273cd4, + 0x8bd49d10, + 0x0d0706d6, + 0xe6fa3f7e, + 0x44d1c105, + 0xb2270d07, + 0x0263e0be, + 0xb027031e, + 0x0282f493, + 0x4d439904, + 0x074c439d, + 0x4efa8e0b, + 0x23bf9bfa, + 0x026efa93, + 0xc1b78304, + 0x4f9b3cac, + 0x1fdc2723, + 0xdb2bc42b, + 0x9b224f9b, + 0x432b233f, + 0x0718d4d2, + 0x67cfbe0d, + 0x0fd0d202, + 0x9b3ca4c1, + 0x432b233f, + 0xa4274032, + 0xa027031e, + 0x8ebe0027, + 0xdf9b0266, + 0x2df49324, + 0x40c10402, + 0x667fbec0, + 0x27c12c02, + 0x07fa8e01, + 0x002f032d, + 0xcc800000, + 0x270c20cc, + 0x3c2b203c, + 0x433b40a7, + 0xb103248b, + 0x4b5b4207, + 0x002744c6, + 0x0127fa8e, + 0x0027a486, + 0xfb4efa8e, + 0xd007b107, + 0x0cc0bf6b, + 0x01246020, + 0x67f7f493, + 0x240d1e02, + 0x63f45302, + 0x53051efe, + 0x93fccbf4, + 0x0401cffc, + 0xc5b0c099, + 0xcd9d9cc4, + 0xf73a7eaa, + 0xc4c54027, + 0x27d2203c, + 0x041e314c, + 0x9d7f4ca7, + 0xb6468bc4, + 0x01aaf493, + 0xac40c104, + 0xa30f0c83, + 0x041e100c, + 0xbe180c27, + 0x9302610a, + 0x040193f4, + 0x0ec040c1, + 0x65e39efb, + 0x4efb8e02, + 0x35f493fc, + 0x4c010462, + 0x017af293, + 0x05f39304, + 0x4c270463, + 0x03310136, + 0x03210534, + 0x93f4a824, + 0x040163fd, + 0xd49d4127, + 0x7e0d07a8, + 0xc1d1f5dd, + 0xc2d12000, + 0x0d072004, + 0x99f6397e, + 0x47588ad4, + 0x2004c3d1, + 0x2008c4d1, + 0x992934ce, + 0x451630d4, + 0xc3be0d07, + 0xc1d10261, + 0xd4c12004, + 0x4cd29940, + 0x2432411b, + 0x20274008, + 0x011af093, + 0x9efc0e04, + 0x8e02642e, + 0x93fe0bfc, + 0x037797f3, + 0x341d4027, + 0x34bd4127, + 0x00270100, + 0x1559f413, + 0x4efe0b34, + 0x7dfc93fc, + 0xc4110377, + 0x0c07dc07, + 0x04d6f48b, + 0x4286c419, + 0xc41d4027, + 0xfe0bfc8e, + 0x3127fe0b, + 0x775ef493, + 0x0b431d03, + 0x27f063fe, + 0x0d0bba4d, + 0x284c27f4, + 0x1007f42d, + 0x1803f001, + 0x659ef043, + 0xf093ffce, + 0x1103773c, + 0x6b4f0004, + 0x1e0000c4, + 0x4efe0bd9, + 0x631007fd, + 0x03d007f0, + 0xbe0f0718, + 0xd6ffce9b, + 0x1e042704, + 0x24f4091e, + 0x290bba4d, + 0x284c40f4, + 0xf1930627, + 0x9e00a97b, + 0x1300599a, + 0xd41509f4, + 0xf0430027, + 0xfc4efd8e, + 0x04b90da1, + 0xf5a30100, + 0xdc03c007, + 0x0745c618, + 0xff47be0d, + 0xbd4027ff, + 0x070100c4, + 0x2720273f, + 0x3205164c, + 0xf4c83403, + 0x1d07d201, + 0xf8be0f07, + 0x0a16ffaf, + 0x42d6f493, + 0x4844c104, + 0x070f4c83, + 0x87353334, + 0x07342b44, + 0x2b433343, + 0xff3ea743, + 0x44f1fd4f, + 0x00050c94, + 0x43c53311, + 0x07f413a8, + 0xf583c415, + 0xfd4efc8e, + 0x42a2f493, + 0x4843c104, + 0x3f83d007, + 0x8000000f, + 0x304c00a1, + 0x3fa33123, + 0xfffffff0, + 0x43073103, + 0x33874533, + 0x1407432b, + 0x142b1333, + 0x0be81f03, + 0x60be0005, + 0x04c0ffbd, + 0xac94be1b, + 0x38d461ff, + 0x12f41341, + 0xf453051e, + 0x0d07ff17, + 0xe67ed415, + 0x8e0027fe, + 0x07fd4efd, + 0xb81ebed0, + 0x530556ff, + 0x15fefef4, + 0x8e0227d4, + 0x234f9bfd, + 0xfe0b0227, + 0xd007fd4e, + 0xffb803be, + 0xf4930576, + 0x150267b2, + 0x8e0227d4, + 0xe3fb4efd, + 0x9bb007f0, + 0x4427244f, + 0x9b25f49b, + 0x4227244f, + 0x9b25f49b, + 0x4627244f, + 0x9b25f49b, + 0x432724df, + 0x5325f49b, + 0xcd071ddc, + 0x4f9bc103, + 0x9b412724, + 0x4f9b25f4, + 0x104c2724, + 0x0725f49b, + 0xbe2c071f, + 0x960005f8, + 0x243f9b0a, + 0xf49b4127, + 0x1130cc25, + 0x0d1ed027, + 0x9b284f9b, + 0x92be284f, + 0xd103025f, + 0x9bf2dcca, + 0x4627243f, + 0x5325f49b, + 0xb39d1a3c, + 0xbe0b077a, + 0xc30266e6, + 0xd6fb8ef0, + 0x1e402704, + 0x1e012309, + 0x534103f9, + 0x07039601, + 0x4efe0b04, + 0x27d007fd, + 0x270107e0, + 0x0705a61d, + 0x0b30074d, + 0x013e0b4e, + 0x03340142, + 0x27242ee4, + 0x48fd8e00, + 0x8e0127f1, + 0x07fa4efd, + 0x33310741, + 0x2b383344, + 0x07310b34, + 0x2b1387d1, + 0x500ad113, + 0xa9133307, + 0x0b1a7404, + 0xac21d51a, + 0x074d7b12, + 0xd8b207c0, + 0xf4932341, + 0x89044138, + 0x42dc0e44, + 0x5404b94e, + 0x11d4ce07, + 0x983e0207, + 0x40a70c56, + 0x1a04c4bd, + 0x0754c4bd, + 0x4d073d07, + 0x48333433, + 0x4d0b432b, + 0x342b3487, + 0x3a0b3333, + 0x4d270b07, + 0x020105a6, + 0x32050403, + 0xf4a83403, + 0x1a74c3a9, + 0x4d3b4127, + 0xcdbd34ab, + 0xc3ad1a80, + 0xfa8e1a74, + 0x04b9f54e, + 0xf1230754, + 0x14eed007, + 0x1cf404e6, + 0xa904e511, + 0x7b1a7404, + 0xdb41f841, + 0xff4ea704, + 0x44c1fd4f, + 0x500ed174, + 0x004e3807, + 0x0a271000, + 0x0827031e, + 0x31074107, + 0x38334433, + 0x310b342b, + 0x232b2387, + 0x2e0b2333, + 0x22242499, + 0x76f09340, + 0x141e00a7, + 0x34102489, + 0x8920014d, + 0x4d501224, + 0xf0932001, + 0xbe00a78b, + 0x5effa741, + 0x2479048a, + 0xf0934230, + 0x1e00a797, + 0x54dd03ef, + 0x033d0707, + 0x0712afdd, + 0x7f3ce32d, + 0x237f2ce3, + 0x191a03dd, + 0x803c0334, + 0x07f932c2, + 0x33410731, + 0x2b483334, + 0x87410b43, + 0x33342b34, + 0x0b4d0733, + 0x544d033e, + 0xac2d2707, + 0x03310104, + 0x03410534, + 0x93f2a844, + 0x03750bf0, + 0x2c271027, + 0x55dfbe15, + 0xacdcb902, + 0xaddeb907, + 0x3b412707, + 0x6cd3d14c, + 0x23ec0b07, + 0xabfe1541, + 0x53f9114f, + 0x66dba937, + 0xa9240707, + 0x070764d1, + 0x532f0ba3, + 0x79deb933, + 0x6b140b07, + 0x0b2fab9f, + 0x53b3074b, + 0x78d0b933, + 0x35428b07, + 0x83218bf9, + 0x9de82331, + 0xd1b95fd3, + 0xd3b90757, + 0xd28d07b3, + 0xb2d2b948, + 0x56de9d07, + 0x836edc9d, + 0x23b183a1, + 0x4ad48d08, + 0x0768dca9, + 0x076adea9, + 0xd29d4d07, + 0x58d39d57, + 0x9d4dd99d, + 0xda9d55d0, + 0x5adb9d59, + 0x9d4cd99d, + 0x4d0354d1, + 0xdc8d0754, + 0x28de8d26, + 0x3d07f405, + 0x40272627, + 0x9d66349d, + 0x31036034, + 0xd4b9f298, + 0x41200757, + 0x0b1e8027, + 0xc861fc01, + 0x81c38153, + 0x51278183, + 0x1507fe11, + 0x41231e3b, + 0x4f6b2107, + 0x7027219b, + 0x71274214, + 0x475b4107, + 0x385b3107, + 0x439b4447, + 0x4447420b, + 0xfffe4d83, + 0x33533407, + 0x3407430b, + 0xd4b93fab, + 0xd3ad0778, + 0x49d01a88, + 0x3343070f, + 0x73430b43, + 0xad430b47, + 0x071a88d4, + 0x33318741, + 0x70dea944, + 0x72dca907, + 0xa9432b07, + 0xa90776d0, + 0x530774d9, + 0x68dba924, + 0xa9425307, + 0xa9076ad1, + 0xa90764da, + 0x870766d6, + 0x0b0e0b32, + 0xad24339c, + 0x271a8cd4, + 0x232b604c, + 0x073b1b9b, + 0x3a07983b, + 0xd465b607, + 0xe73b4027, + 0x302bc83b, + 0xd475b92b, + 0xd2ad4127, + 0xd1ad1a8a, + 0xde8d1a8e, + 0x30dc8d2e, + 0x8d2ad38d, + 0xd49d2cdb, + 0xdaa0124e, + 0xd1890e96, + 0x2ad0892c, + 0xffa51ebe, + 0x9302a15e, + 0x037373f0, + 0x049d4027, + 0x48d18909, + 0x891a018d, + 0x028d4ad2, + 0x2ad3891c, + 0x8928038d, + 0x048d2cd4, + 0x2ed9892a, + 0x892ad289, + 0x098d2cd1, + 0x30dc892c, + 0x048d4127, + 0x2e0c8d16, + 0x8918058d, + 0x028526de, + 0x89300e8d, + 0x019528d3, + 0xa932038d, + 0x891a8ad9, + 0x04893003, + 0x34098d32, + 0x1a88dca9, + 0x04c5439b, + 0x27342738, + 0x8d04a04d, + 0x0c8d3c04, + 0x0b039d36, + 0x9d0c039d, + 0xd4890d03, + 0x87410326, + 0x4404c544, + 0xd854d4c1, + 0xffff004e, + 0x24fe111b, + 0x704d27e6, + 0x11281e04, + 0x271524f1, + 0x1e02404d, + 0x284d271e, + 0x11181e01, + 0x272624f2, + 0x1e03904d, + 0x24f3110e, + 0xd04d2735, + 0x27041e01, + 0x048df04c, + 0x59d4b93e, + 0xb1f39307, + 0x349d0372, + 0x5ad9b912, + 0x13399d07, + 0x0756d4b9, + 0x44b94d0b, + 0x343d0782, + 0x0756d4b9, + 0x44b94d0b, + 0x341d077a, + 0x9d55dc99, + 0xde994d3c, + 0x4e3e9d56, + 0x0757d1b9, + 0xb94f319d, + 0xa9075ad2, + 0x070764d1, + 0x33428732, + 0x0b342b34, + 0x33430732, + 0x87432b46, + 0x07420b44, + 0x0f3c5334, + 0x230d4c53, + 0x0b438333, + 0x66d2a934, + 0x123cd407, + 0xf143872d, + 0x016f4c43, + 0x07219b00, + 0x2a425343, + 0x10cc2742, + 0x43071a1e, + 0x422a4153, + 0x1e0ccc27, + 0x0b43470f, + 0x2a425343, + 0x1ec82742, + 0x93c62703, + 0x037217f5, + 0x1c425119, + 0xa46bf093, + 0xbe2c0700, + 0x1900505c, + 0x022c0754, + 0x5d24074c, + 0xb9547d52, + 0x390756d4, + 0x0b448752, + 0x8844d14d, + 0x15535907, + 0x0f32ea54, + 0xb3deb901, + 0xb4d4b907, + 0xb5d7b907, + 0xaed2b907, + 0x256e0707, + 0x33740bf2, + 0xd1483364, + 0xb9076cd9, + 0xab07b1d3, + 0xb9f42164, + 0xb907b0db, + 0x330757d1, + 0xc907104c, + 0xab183c33, + 0x1cbc3334, + 0xd1bdc653, + 0xd2b90100, + 0x3bab07b2, + 0xb91fcc33, + 0xab07afda, + 0x11fc213c, + 0x8362abf4, + 0x2c830fec, + 0xb9e9330f, + 0xb90779d0, + 0x0b07acd8, + 0x112533ac, + 0x232eabfc, + 0x83e10743, + 0x33883313, + 0xcc33121c, + 0x78dbb90c, + 0x83043307, + 0x012da343, + 0xab21ab20, + 0x0e4c333c, + 0xac339833, + 0xab08ab14, + 0x3324ab0b, + 0x448711ec, + 0x00009e83, + 0xab3aab01, + 0xab30ab24, + 0x0c7c33e9, + 0xd3c5f131, + 0xf0d2c5d8, + 0x0766d3a9, + 0x0764d2a9, + 0xe6abe7ab, + 0xd0a9c8ab, + 0xd19d1a8e, + 0xdcdec592, + 0x0124d2ad, + 0x0126d3ad, + 0x7ee4dcc5, + 0xd0bdfa7b, + 0xd0b91a81, + 0x707e07b6, + 0x82d0bdfa, + 0xb7d0b91a, + 0xfa657e07, + 0x1a83d0bd, + 0x0d07f101, + 0x03480d03, + 0x0019dcbe, + 0xe7be0507, + 0x0027ffa2, + 0x0127031e, + 0xf58ef103, + 0xd207fb4e, + 0x27243f9b, + 0x25f49b42, + 0x1d1e3c53, + 0x243f9b13, + 0xf29b2127, + 0x53142125, + 0x41e31f3c, + 0x142543ab, + 0x27243f9b, + 0x25f49b45, + 0x3d1b3c53, + 0x243f9b13, + 0x9b204c27, + 0x131525f4, + 0x9b243f9b, + 0x142125f2, + 0x471f3c53, + 0xab42e333, + 0x9b142543, + 0xf29b243f, + 0x53142125, + 0x33871f3c, + 0x43ab44e3, + 0x3f9b1425, + 0x25f29b24, + 0x3c531421, + 0xe333331f, + 0x2543ab48, + 0x243f9b14, + 0x2125f29b, + 0x1f3c5314, + 0x4ce33433, + 0x2543ab10, + 0x244f9b14, + 0x9b164c27, + 0x3f9b25f4, + 0x25f49b24, + 0x27243f9b, + 0x25f49b48, + 0x3c53b027, + 0x27c02718, + 0x5d2d0700, + 0x9b1f1e13, + 0x3127244f, + 0x5325f39b, + 0x403b1f4c, + 0x4f9bb4ab, + 0x25f39b24, + 0x3b1f4c53, + 0x03c4ab40, + 0xe0f2f001, + 0x2718d2d0, + 0x474d2b49, + 0x243f9b44, + 0x1325f49b, + 0x345b204c, + 0x012734c6, + 0xf093fb8e, + 0xc103f854, + 0x1f9b3c02, + 0x223f9b23, + 0x422b4307, + 0x32074008, + 0x432b4107, + 0xc11241c8, + 0x411b3c04, + 0x008248e4, + 0xfff0ccbe, + 0x791e05e6, + 0xc1214f9b, + 0x438bbc03, + 0x076e4fd6, + 0x20ec272d, + 0x27101c27, + 0x5a1e0c0c, + 0x9b49b1d8, + 0x4227244f, + 0x9b25f49b, + 0x3127244f, + 0x9b25f39b, + 0x4527244f, + 0x9b25f49b, + 0xfe9b244f, + 0x244f9b25, + 0x9b25f39b, + 0xf39b244f, + 0x244f9b25, + 0x9b25f39b, + 0xf39b244f, + 0x244f9b25, + 0x9b25f19b, + 0xf19b244f, + 0x244f9b25, + 0x5825f09b, + 0x244f9bc1, + 0xf49b4827, + 0x53b15325, + 0xa5f2f0c1, + 0xfb8e0027, + 0xfb8e0427, + 0xf493f64e, + 0x07036f8c, + 0x972d0324, + 0x07340716, + 0x7f2ce360, + 0x197f3ce3, + 0x803c0334, + 0x93f932c2, + 0x036f6ff0, + 0x2d271027, + 0xeebe05a6, + 0xf193024f, + 0xd5036f60, + 0x9b12ac11, + 0x4427243f, + 0x5325f49b, + 0x133d1c3c, + 0x27243f9b, + 0x25f49b43, + 0x031d3c53, + 0x9b135d31, + 0x4127243f, + 0x6125f49b, + 0x1f3c5314, + 0x43ab41e3, + 0x14651259, + 0x077f28f4, + 0x06071403, + 0xf6fdfb7e, + 0x93077a0f, + 0x03f733f0, + 0x9b3c02c1, + 0x3f9b231f, + 0x2b430722, + 0x07400842, + 0x2b410732, + 0x1341c843, + 0x1b3c04c1, + 0x5248e441, + 0xefabbe07, + 0x5e0626ff, + 0x4f9b0749, + 0xbc03c121, + 0x4ff6438b, + 0x4f9b073d, + 0xd9f29328, + 0x4f6b036e, + 0x4cf4241d, + 0x9b072810, + 0x4f6b284f, + 0x44f4247d, + 0x43c4071d, + 0x244f9b16, + 0xf39b3127, + 0x53236125, + 0x44471f4c, + 0x34ab32e3, + 0x4f9b2365, + 0x10248d28, + 0x93284f9b, + 0x03f6bbf0, + 0xc112248d, + 0x1f9b3c02, + 0x223f9b23, + 0x422b4307, + 0x32074008, + 0x432b4107, + 0xc11341c8, + 0x411b3c04, + 0x06d748e4, + 0xffef30be, + 0xce5e0626, + 0x214f9b06, + 0x8bbc03c1, + 0xc24ff643, + 0x244f9b06, + 0xf39b3127, + 0x59f29325, + 0x2361036e, + 0x871f4c53, + 0xab34e344, + 0x83236534, + 0x9b378634, + 0x248d284f, + 0x284f9b1c, + 0x9b22248d, + 0x248d284f, + 0x284f9b1e, + 0x1e20248d, + 0x8d40270f, + 0x238d2024, + 0x1e248d1c, + 0x9b22248d, + 0x4803284f, + 0xf2934f6b, + 0x9d036e14, + 0x4bf42424, + 0x4f9b0665, + 0x6b480328, + 0x25249d4f, + 0x06574bf4, + 0x03284f9b, + 0x9d4f6b44, + 0x4cf42624, + 0x9b064811, + 0x3127244f, + 0x6125f39b, + 0x1f4c5323, + 0x38e34333, + 0x236534ab, + 0xb0273838, + 0x2b59051e, + 0xdb87b123, + 0xdf03cb07, + 0x00043d28, + 0x3d17cf03, + 0xfa930004, + 0x1e036dbc, + 0x284f9b21, + 0x4f6b4103, + 0xc103c41d, + 0x02114cf4, + 0x284f9b06, + 0xbe07c49d, + 0x05025631, + 0x03b103d0, + 0xcaa459d4, + 0x42d0dcb4, + 0xdca46142, + 0x30273d48, + 0x6d86fe93, + 0x99211e03, + 0x11f12e24, + 0x00043d24, + 0xfd262299, + 0x043d1f34, + 0x1732fd00, + 0xf500043d, + 0x043d2801, + 0x59310300, + 0x070387e4, + 0x23148724, + 0xf02f0341, + 0xca00043c, + 0x4f9bce34, + 0x6b430328, + 0x45f1934f, + 0x149d036d, + 0x9647f458, + 0x284f9b05, + 0x9b59149d, + 0x4203284f, + 0x149d4f6b, + 0x8246f45a, + 0x284f9b05, + 0x9b5b149d, + 0x149d284f, + 0x283f9b5c, + 0x1e99c127, + 0x10128959, + 0x07121d89, + 0x3b03074c, + 0x6b32074e, + 0xab41230f, + 0x9d438b3d, + 0x4ff65d10, + 0x14990551, + 0x4a47f45c, + 0x4607f405, + 0x58139905, + 0x3e0b4c07, + 0x4123433b, + 0x4d0b240b, + 0x237b437b, + 0x8d14128d, + 0x3f9b1614, + 0x9b412724, + 0x146125f4, + 0x331f3c53, + 0x104ce334, + 0x146543ab, + 0x2d104cd8, + 0x27244f9b, + 0x25f39b31, + 0x4c531361, + 0xe345331f, + 0x34ab203c, + 0x3cd81365, + 0x11d11320, + 0x060712ac, + 0x12b01d03, + 0x00080fbe, + 0x04ed0ff6, + 0x27243f9b, + 0x25f29b21, + 0x6c82f193, + 0x53146103, + 0x36331f3c, + 0xab404ce3, + 0x9b146543, + 0xf29b243f, + 0x53146125, + 0x37331f3c, + 0xab804ce3, + 0x9b146543, + 0xf29b243f, + 0x53146125, + 0x38331f3c, + 0x01004de3, + 0x146543ab, + 0x01004dd8, + 0x244f9b47, + 0xf39b3427, + 0x1c4c5325, + 0x149d4103, + 0x244f9b5e, + 0x5325f39b, + 0x41031c4c, + 0x9b5f149d, + 0x4303284f, + 0x9b60149d, + 0x149d284f, + 0x243f9b61, + 0xf49b4127, + 0x53146125, + 0x3c331f3c, + 0x004de30d, + 0x6543ab20, + 0x27091e14, + 0x5f149d48, + 0x9b5e149d, + 0xf393284f, + 0x6b036bf0, + 0x62349d4f, + 0x3e414cf4, + 0xfdf09304, + 0x02c103f3, + 0x231f9b3c, + 0x07223f9b, + 0x08422b43, + 0x07320740, + 0xc8432b41, + 0x04c11341, + 0xe4411b3c, + 0xbe041c48, + 0x26ffec75, + 0x04135e06, + 0xc1214f9b, + 0x438bbc03, + 0x04074ff6, + 0xfd93c027, + 0x1e036ba4, + 0x1ae1be0b, + 0xf80ff600, + 0x07c10303, + 0x334c072c, + 0x0b233346, + 0x62d49924, + 0x3d982f03, + 0x3c070004, + 0x1d070607, + 0x9bdbc4ca, + 0x4127243f, + 0x6125f49b, + 0x1f3c53d2, + 0x3c334027, + 0x002de30e, + 0x9d23ab40, + 0x402763d4, + 0x65a4d4c5, + 0x002dd8d2, + 0xd2994c40, + 0x284f9b26, + 0xd49d4f6b, + 0x214cf463, + 0xec27039d, + 0x93102720, + 0x036b3bf0, + 0x281ee22b, + 0x9b244f9b, + 0x4e5b25f2, + 0x34ed3147, + 0x00043d54, + 0x27244f9b, + 0x25f39b31, + 0x53a403c1, + 0x413b1f4c, + 0x04c543ab, + 0x991103a4, + 0x14ca6304, + 0x243f9bd4, + 0xf29b2127, + 0xfdf19325, + 0x1461036a, + 0x331f3c53, + 0x004de339, + 0x6543ab02, + 0x244f9b14, + 0x6125f29b, + 0x1f4c5313, + 0x3de34a33, + 0x34ab0400, + 0xf2f2f093, + 0xc1136503, + 0x1f9b3c02, + 0x223f9b23, + 0x422b4307, + 0x32074008, + 0x432b4107, + 0xc11341c8, + 0x411b3c04, + 0x030f48e4, + 0xffeb68be, + 0x065e0626, + 0x214f9b03, + 0x8bbc03c1, + 0xfa4ff643, + 0x243f9b02, + 0xf49b4127, + 0x91f19325, + 0x1261036a, + 0x331f3c53, + 0x002de33b, + 0x6523ab08, + 0x002df812, + 0x9b028508, + 0xf49b243f, + 0x1f30cc25, + 0x27243f9b, + 0x25f49b48, + 0xc4183c53, + 0x9b10ff3c, + 0x4c27244f, + 0x25f49b10, + 0x9b243f9b, + 0x3f9b25f4, + 0x9b412724, + 0x304c25f4, + 0x27244f9b, + 0x25f49b41, + 0x27244f9b, + 0x25f39b31, + 0x6a36f193, + 0x53136103, + 0x4c331f4c, + 0x003de30f, + 0x6534ab80, + 0x003dd813, + 0x4f9b6880, + 0x9b432724, + 0x3f9b25f4, + 0x9b212724, + 0x146125f2, + 0x331f3c53, + 0x4ee3113c, + 0xab020000, + 0x9b146543, + 0xf29b243f, + 0x53146125, + 0x3c331f3c, + 0x004ee310, + 0x43ab0100, + 0x4ed81465, + 0x2a010000, + 0x27244f9b, + 0x25f39b38, + 0xbd184c53, + 0x9b12a814, + 0xf39b244f, + 0x184c5325, + 0x12a914bd, + 0x9b244f9b, + 0x4c5325f3, + 0xaa14bd18, + 0x243f9b12, + 0xf49b4127, + 0x9b302c25, + 0x4f9b284f, + 0x244f9b28, + 0xf39b3127, + 0x244f9b25, + 0x9b25f39b, + 0xf39b242f, + 0x91f19325, + 0x14610369, + 0x331f2c53, + 0x4ee3122c, + 0xab040000, + 0x9b146542, + 0xf39b244f, + 0x0d40cc25, + 0x9b284f9b, + 0x4f9b284f, + 0x284f9b28, + 0x27243f9b, + 0x25f49b41, + 0x010130ec, + 0x27244f9b, + 0xf49b204c, + 0x243f9b25, + 0x9b25f49b, + 0x4127243f, + 0x0c25f49b, + 0x284f9b30, + 0x27243f9b, + 0x25f49b41, + 0x00d930ec, + 0x2724af9b, + 0x1eac5342, + 0xd625f49b, + 0x1e8027a4, + 0x248f9b58, + 0x8c534127, + 0x25f49b1f, + 0x4f9b8806, + 0x9b482724, + 0x4f9b25f4, + 0x9b352724, + 0x4f9b25f3, + 0x9b412724, + 0x4f9b25f4, + 0x25f39b24, + 0x27244f9b, + 0x25f49b44, + 0x9b243f9b, + 0x854625f4, + 0x27244f9b, + 0x25f49b44, + 0x27244f9b, + 0x25f49b45, + 0x9b243f9b, + 0x3f9b25f4, + 0x25f49b24, + 0xf7939027, + 0x1e0368c8, + 0x243f9b62, + 0xf49b4127, + 0x9b304825, + 0xf49b243f, + 0x9b302c25, + 0x111e284f, + 0x27243f9b, + 0x25f49b41, + 0xda07304c, + 0x361eb127, + 0x0328bf9b, + 0x21bcd4b1, + 0x1eda0765, + 0x24d1d829, + 0x1d1ec027, + 0x025118be, + 0x025114be, + 0x0ebe8546, + 0x0abe0251, + 0x4f9b0251, + 0x9b412724, + 0xc10325f4, + 0x53e2cbce, + 0xd6dfd6d1, + 0x74599103, + 0x9b9b94ca, + 0x4127243f, + 0xcc25f49b, + 0x4f9b2430, + 0x9b412724, + 0x3f9b25f4, + 0x25f49b24, + 0x9b243f9b, + 0x4f9b25f4, + 0x284f9b28, + 0x9b284f9b, + 0x4f9b284f, + 0x49f09328, + 0x02c103f0, + 0x231f9b3c, + 0x07223f9b, + 0x08422b43, + 0x07320740, + 0xc8432b41, + 0x04c11141, + 0xc4411b3c, + 0xc2be6848, + 0x0946ffe8, + 0x4f9b601e, + 0xbc03c121, + 0x47c6438b, + 0x1431541e, + 0x46833027, + 0x31274604, + 0x41834307, + 0xe3124c33, + 0x0400002e, + 0x126524ab, + 0x27243f9b, + 0x25f49b41, + 0x9b1730cc, + 0x4127244f, + 0x9b25f49b, + 0xf49b243f, + 0x244f9b25, + 0xf49b4627, + 0xb9f29325, + 0x21190367, + 0x0a7e0607, + 0x0e0607f1, + 0x57a89ef6, + 0x8e012702, + 0x8e0427f6, + 0x99f84ef6, + 0xd0077c04, + 0x4506c107, + 0x699ef80e, + 0x1cf4000b, + 0x0701db41, + 0x87418341, + 0x07400b44, + 0x7842d131, + 0x2731531a, + 0x8b433b41, + 0x9345d642, + 0x009a13f0, + 0x00456bbe, + 0x0701b75e, + 0x33418731, + 0x07430b34, + 0x2b333334, + 0xd1312b34, + 0x3307500b, + 0xd93b0b33, + 0x01698131, + 0xfff127be, + 0x0ff68007, + 0xdd030192, + 0x3d071a04, + 0x076fdc03, + 0x7f3ce32d, + 0x237f2ce3, + 0x191a73dd, + 0x803c0334, + 0x07f932c2, + 0x8734333c, + 0x07430b4c, + 0x2b333334, + 0x333c2b34, + 0x803e0333, + 0x4d070169, + 0x4d033b0b, + 0x2c271a04, + 0x0331011c, + 0x03410534, + 0xd1f2a844, + 0xf81a08d2, + 0x9608002d, + 0x14dca900, + 0x68d0a91a, + 0x310cea07, + 0x16d3a901, + 0x6ad4a91a, + 0x2543ea07, + 0x002ed801, + 0x07772000, + 0x100c331c, + 0x00727dbe, + 0x1c07b007, + 0xffff0d27, + 0x007271be, + 0x100b1b07, + 0x2d07ad07, + 0x071e0127, + 0x1a1824ad, + 0x1b0b0103, + 0xd3a94107, + 0x4b2b1a14, + 0x03104c53, + 0xe903c222, + 0x1a16dca9, + 0x076ad0a9, + 0x0c331c07, + 0x723cbe10, + 0x07b00700, + 0xff0d271c, + 0x7230beff, + 0x0b2b0700, + 0x1e112720, + 0x42a4ad07, + 0x0b11031a, + 0xa942072b, + 0x2b1a16d3, + 0x104c534b, + 0x13c2a203, + 0x14daa9e9, + 0x16d9a91a, + 0x68d2a91a, + 0x0b4a4707, + 0x1842ad4d, + 0xa939471a, + 0x0b076ad4, + 0x4234ad3d, + 0x08d3d11a, + 0xacdeb91a, + 0x07230707, + 0x83295343, + 0xb9130744, + 0x8307add0, + 0x0ddcb922, + 0x5324ab1a, + 0x0b430715, + 0x5311830e, + 0x2b21ab43, + 0x0748830c, + 0xb924ab13, + 0x331a12de, + 0x07185304, + 0x07c30743, + 0x8320abb3, + 0x53e22311, + 0x53c95344, + 0x3c530dbc, + 0xe0d2c50c, + 0xb95cd19d, + 0xb91a0fd2, + 0x331a0ed1, + 0x41831dec, + 0xb183c183, + 0xd3bd3183, + 0xdec50101, + 0x70da9de8, + 0x9d6fd99d, + 0xdc9d5bd4, + 0x5edb9d5d, + 0x9d6cd19d, + 0x031e6dd2, + 0x08078127, + 0xf54ef88e, + 0xa2d1a007, + 0x00c1076c, + 0x5a0389ac, + 0x0e102cf8, + 0xd1d00701, + 0x031a08a4, + 0xd30b60dc, + 0x00004ed8, + 0xa1d10c04, + 0x0d071a70, + 0x1e701c03, + 0x202cd80f, + 0x00a1d116, + 0x030d071a, + 0x2712b01d, + 0xbe03e82d, + 0x5e003a81, + 0x5d0700d5, + 0x7d076d07, + 0x8c279027, + 0x305c0310, + 0x01206d03, + 0x02a07d03, + 0xb433b907, + 0xc9070d07, + 0x3476f193, + 0x0b280702, + 0x3a53be0b, + 0x07c63300, + 0x604c034c, + 0x040b0d07, + 0x346ef193, + 0x402c2702, + 0x003a3cbe, + 0x4d034c07, + 0x0d0701e0, + 0xf193040b, + 0x27023458, + 0x26be402c, + 0x0507003a, + 0x343af193, + 0x0b280702, + 0x3a17be0b, + 0x93060700, + 0x02347bf1, + 0x0b402c27, + 0x3a07be0c, + 0x03070700, + 0x930c0b91, + 0x023467f1, + 0xbe402c27, + 0xc40039f5, + 0x0d078b93, + 0x3416f193, + 0x402c2702, + 0x03600d03, + 0x0039e0be, + 0x0d030d07, + 0xf19303a0, + 0x27023440, + 0xcebe402c, + 0x4c270039, + 0xe7d4bd10, + 0xe1d8bd03, + 0xe0d4bd03, + 0xe2d4bd03, + 0xe3d4bd03, + 0xe4d4bd03, + 0xe5d4bd03, + 0xe6d4bd03, + 0x1e412703, + 0x9d402703, + 0xf58e74a4, + 0xf2a3f54e, + 0x1c03f145, + 0x03f15560, + 0x6501801d, + 0x801d03f1, + 0x03f17501, + 0xf393801c, + 0x8502343c, + 0x25f493f1, + 0x16030234, + 0xd027a027, + 0x33daf793, + 0x95f89302, + 0xf5930233, + 0x27023380, + 0xf405106c, + 0xf195f335, + 0xf325f315, + 0x8700a95e, + 0xf93f07ed, + 0x016fc8dc, + 0x41e30b00, + 0x9bbc07e9, + 0x9bb90bba, + 0x4127243f, + 0xc825f49b, + 0x2f9b4b30, + 0x2b1a0728, + 0xca10e812, + 0xc601f200, + 0x13d2d000, + 0x24d6e361, + 0x071e4607, + 0x410b4307, + 0x3a0b4419, + 0x2716341d, + 0x1507d4d6, + 0xd320151e, + 0x071e1330, + 0x180714d6, + 0x1707091e, + 0x1c9b051e, + 0x0b07190b, + 0xeebe2c07, + 0x3d1e0038, + 0xe827d234, + 0x4f9b101e, + 0x03e36129, + 0x6be40748, + 0x1d3a0bef, + 0x074d873e, + 0x07430b3f, + 0x0340012c, + 0x1e102721, + 0x294f9b16, + 0x310b3007, + 0x4e0b3319, + 0xef6be407, + 0x3e1d3b0b, + 0xf2401103, + 0xd0f9a103, + 0x00016fc4, + 0xff51a0ea, + 0xd434d103, + 0xef1ea027, + 0xeb9af093, + 0x3c02c103, + 0x9b231f9b, + 0x4307223f, + 0x4008422b, + 0x41073207, + 0x41c8432b, + 0x3c04c111, + 0x48c4411b, + 0xe413be19, + 0x1e0696ff, + 0x214f9b15, + 0x8bbc03c1, + 0x1e451643, + 0x1e012709, + 0x1e042707, + 0x83002703, + 0x4ef58ef2, + 0x07d007fc, + 0x270527c1, + 0x074d0710, + 0x0b410b3c, + 0x01420131, + 0xce140334, + 0xf0605642, + 0x1c070d07, + 0x03700c03, + 0x2d27701c, + 0x05be03e8, + 0x0c360038, + 0x4e83c411, + 0xc4200800, + 0x3808004d, + 0x0710ce89, + 0x07e1030c, + 0x1e2c071d, + 0x1413890e, + 0x03142489, + 0xce220312, + 0xfe801a43, + 0x0312c189, + 0x890d1e11, + 0x04893ed3, + 0x03d2033e, + 0x88432e02, + 0x27051ef1, + 0x27fc8e00, + 0x4efc8e01, + 0x873107f8, + 0x0b343341, + 0x07d10743, + 0x07133314, + 0x83142b8d, + 0x871d2b81, + 0x0b133348, + 0x5009d140, + 0x033d0707, + 0x0169801e, + 0x1a7844d1, + 0xa1273153, + 0x190ba33b, + 0x8b6c21c5, + 0x07b0074a, + 0x934826c2, + 0x042d3ff4, + 0xdc0e4489, + 0x04b94c42, + 0xd4ce1a04, + 0x7e02070e, + 0x0bf6ff33, + 0xb4bd40a7, + 0x3d071a04, + 0x4d873433, + 0x3407430b, + 0x342b3333, + 0x33333d2b, + 0x3e03390b, + 0x07016980, + 0x164d270c, + 0x03020101, + 0x03320504, + 0x87f4a834, + 0xd13b0b38, + 0xab1a7834, + 0x7834d54a, + 0x4ef88e1a, + 0xbdf493fc, + 0x24070378, + 0x04572d03, + 0xc0073407, + 0xe37f2ce3, + 0x34197f3c, + 0xc2803c03, + 0xf093f932, + 0x270378a0, + 0x162d2710, + 0x4287be01, + 0x91f19302, + 0x11c50378, + 0x284f9b6c, + 0x141d4f6b, + 0xa8404cf4, + 0x284f9b03, + 0x143d4f6b, + 0x9c104cf4, + 0x243f9b03, + 0xf09b0127, + 0x53141125, + 0x41e31f3c, + 0x141543ab, + 0x9b243f9b, + 0x141125f0, + 0x471f3c53, + 0xab42e333, + 0x9b141543, + 0x4327243f, + 0x5325f49b, + 0x139d1d3c, + 0x243f9b08, + 0x1125f09b, + 0x1f3c5314, + 0x44e33387, + 0x141543ab, + 0x9b243f9b, + 0x141125f0, + 0x331f3c53, + 0xab48e333, + 0x9b141543, + 0x4103284f, + 0x4f9b145d, + 0x7d410328, + 0x294f9b14, + 0x6b1a4c03, + 0x07149d4f, + 0x4cec4f4b, + 0x9b032234, + 0x2127243f, + 0x1125f29b, + 0x1f3c5314, + 0x4ce33433, + 0x1543ab10, + 0x243f9b14, + 0x1125f29b, + 0x1f3c5314, + 0x4ce33533, + 0x1543ab20, + 0x244f9b14, + 0x1125f29b, + 0x1f4c5313, + 0x3ce34633, + 0x2734ab40, + 0x09149d40, + 0x3c381315, + 0x284f9b40, + 0x9b09149d, + 0x149d294f, + 0x294f9b0a, + 0x9b0b149d, + 0x2127243f, + 0x1125f29b, + 0x1f3c5314, + 0x4ce33733, + 0x1543ab80, + 0x243f9b14, + 0x1125f29b, + 0x1f3c5314, + 0x4de33833, + 0x43ab0100, + 0x3f9b1415, + 0x25f29b24, + 0x3c531411, + 0xe339331f, + 0xab02004d, + 0x9b141543, + 0xf29b243f, + 0x53141125, + 0x3a331f3c, + 0x04004de3, + 0x141543ab, + 0x9b243f9b, + 0x141125f2, + 0x331f3c53, + 0x004de33b, + 0x1543ab08, + 0x244f9b14, + 0x1125f29b, + 0x1f4c5313, + 0xe30c4c33, + 0xab10003d, + 0x8d402734, + 0x13153e14, + 0xf814148d, + 0xa408003d, + 0x003dfc00, + 0x9b023610, + 0x4103284f, + 0x9b10148d, + 0x4103284f, + 0x3fab3407, + 0x8d101489, + 0x4cf41213, + 0xf4021a15, + 0x0215173c, + 0x27244f9b, + 0x25f39b31, + 0x4c531311, + 0x154c331f, + 0x00003ee3, + 0x1534ab20, + 0x003edc13, + 0x273e2000, + 0x9b121e30, + 0x3103284f, + 0x4247340b, + 0x539c43ed, + 0x21030004, + 0xca101489, + 0x3027ea24, + 0xf1932127, + 0x1e0376ac, + 0x284f9b12, + 0x340b3103, + 0x43ed4247, + 0x000453c6, + 0x14892103, + 0xea24ca12, + 0x27243f9b, + 0x25f49b41, + 0x7686f293, + 0x53241103, + 0x3c331f3c, + 0x004de30d, + 0x1543ab20, + 0xa30f1e24, + 0x2720003d, + 0x8d131541, + 0x108d1014, + 0xe5f09312, + 0x02c103e7, + 0x231f9b3c, + 0x07223f9b, + 0x08422b43, + 0x07320740, + 0xc8432b41, + 0x04c11341, + 0xe4411b3c, + 0xbe016a48, + 0x26ffe05d, + 0x01615e06, + 0xc1214f9b, + 0x438bbc03, + 0x01554ff6, + 0x27243f9b, + 0x25f29b21, + 0x761ef193, + 0x53141103, + 0x3c331f3c, + 0x004de30e, + 0x1543ab40, + 0x243f9b14, + 0x1125f29b, + 0x1f3c5314, + 0xe30f3c33, + 0xab80004d, + 0xd8141543, + 0x4180004d, + 0x9b243f9b, + 0x141125f2, + 0x331f3c53, + 0x4ee3103c, + 0xab010000, + 0x9b141543, + 0xf29b243f, + 0x53141125, + 0x3c331f3c, + 0x004ee311, + 0x43ab0200, + 0x4edc1415, + 0x0d020000, + 0x9d294f9b, + 0x4f9b0c14, + 0x0d149d29, + 0x27244f9b, + 0x25f39b31, + 0x75a6fd93, + 0x53d31103, + 0x4c331f4c, + 0x003ee312, + 0x34ab0400, + 0x3ed8d315, + 0x10040000, + 0x076cd1c1, + 0x701c030c, + 0xf6fa677e, + 0x9b00ac0f, + 0x2127243f, + 0x1125f29b, + 0x1f3c53d4, + 0xe3133c33, + 0x0800004e, + 0xd41543ab, + 0x03284f9b, + 0x0ed49d42, + 0x9b244f9b, + 0xd31125f2, + 0x331f4c53, + 0x3ee3144c, + 0xab100000, + 0xc9f09334, + 0xd31503e6, + 0x9b3c02c1, + 0x3f9b231f, + 0x2b430722, + 0x07400842, + 0x2b410732, + 0x1141c843, + 0x1b3c04c1, + 0x4c48c441, + 0xffdf40be, + 0x441e05c6, + 0xc1214f9b, + 0x438bbc03, + 0x3f9b4b76, + 0x9b412724, + 0x30cc25f4, + 0x244f9b17, + 0xf49b4127, + 0x243f9b25, + 0x9b25f49b, + 0x4627244f, + 0x9325f49b, + 0x0374ebf2, + 0x0c072119, + 0x07fb8a7e, + 0x9efc0e0c, + 0x27024e42, + 0x27fc8e01, + 0x27fc8e04, + 0x243f9b00, + 0x3c534827, + 0x25f49b18, + 0x3cc0030b, + 0xfe0bf0ff, + 0x0499fd4e, + 0x06d0077c, + 0x9efd0e45, + 0x890001f0, + 0x04d53c04, + 0xfdbe1a90, + 0x0d070003, + 0x03480d03, + 0x000637be, + 0xfd0e0d07, + 0x024df99e, + 0xc67c0499, + 0x01ca9e44, + 0x4dec9e00, + 0x07fc4e02, + 0x07ad3ec0, + 0xc0a93ed0, + 0xe07b89dc, + 0x00d890dc, + 0x00f5d1e4, + 0x1a80c2b9, + 0x1a74c4a9, + 0xf0ff2ce0, + 0xf8427b00, + 0x0700ea41, + 0x33320742, + 0x2b383344, + 0x87320b34, + 0xd1432b43, + 0x330750c3, + 0x61430b43, + 0x004ef844, + 0x00c10400, + 0x27243f9b, + 0x25f49b44, + 0xbd1c3c53, + 0x9b1c0cc3, + 0x4227243f, + 0x5325f49b, + 0xc3bd1e3c, + 0x3f9b1c0d, + 0x9b412724, + 0x402725f4, + 0x1c0ec4bd, + 0x4127302c, + 0x1c0ec4bd, + 0xc4bd4127, + 0x845e1c0f, + 0x273c0700, + 0x101c2700, + 0x9b244f9b, + 0x4c5325f1, + 0xf434ad10, + 0x244f9b1b, + 0x5325f19b, + 0x34ad104c, + 0x01031bfa, + 0x03c43203, + 0x244f9be0, + 0x5325f19b, + 0xc4ad104c, + 0x4f9b1c00, + 0x25f19b24, + 0xad104c53, + 0x9b1c02c4, + 0x4c27243f, + 0x25f49b20, + 0x1c04c3d5, + 0x9b243f9b, + 0x412725f4, + 0x1c08c3d5, + 0x012fc4bd, + 0x4f9b221e, + 0x103c2724, + 0x5b25f39b, + 0xf0c4ad43, + 0x244f9b1b, + 0x5b25f39b, + 0xf2c4ad43, + 0xbd41271b, + 0x070130c4, + 0x9efc0e0c, + 0x27024cda, + 0x9bfc8e01, + 0x4c53244f, + 0x24382718, + 0xf39bff4c, + 0x9ef11e25, + 0xa9024cab, + 0xb9018804, + 0x03012e03, + 0x8804ad41, + 0x9d402701, + 0xf4937d04, + 0x15024cf6, + 0x9338c604, + 0x03e4bff3, + 0xd18a3499, + 0xd8013400, + 0x33c10e41, + 0x33400790, + 0x08432b33, + 0x93030741, + 0x03e4a3f4, + 0x273c40c5, + 0x4efe0b00, + 0x7c0499fd, + 0x4d86d007, + 0xff915dbe, + 0xc47cd499, + 0x0d070d43, + 0x03480d03, + 0x00059fbe, + 0x44c0231e, + 0x6cd4d120, + 0x07476605, + 0x034d073d, + 0x0303483d, + 0x27054c4d, + 0x4101812c, + 0x31054403, + 0xf2a83403, + 0x407cd499, + 0x3cd48944, + 0xd48d4103, + 0x9d40273c, + 0xfd8e7cd4, + 0xfe93fd4e, + 0x0703e440, + 0x3ce2c1d0, + 0x9b231f9b, + 0x4307223f, + 0x4008422b, + 0x41073207, + 0x41c8432b, + 0x3ce4c111, + 0x48c4411b, + 0xdcb7be1c, + 0x1e05c6ff, + 0x214f9b14, + 0x8bbce3c1, + 0x07457643, + 0xff6d7e0d, + 0xfd8e0227, + 0xfd8e0427, + 0x0ca9f54e, + 0xd007012c, + 0xac07c333, + 0xa0d1a00b, + 0xf1630144, + 0x024889be, + 0x04e005e6, + 0xf45301a0, + 0xd415feff, + 0xb901975e, + 0xb9011adb, + 0xc1011bd8, + 0xd1a9b4d0, + 0xd7a9010a, + 0xd5a90108, + 0xf025012a, + 0xfc35f115, + 0x151efa45, + 0x490b4707, + 0x7fab7407, + 0xc99bf221, + 0xf2252c0b, + 0xba075103, + 0x41034807, + 0xf001f405, + 0x1047ab07, + 0x1d0ba103, + 0x2a473847, + 0x16a93d0b, + 0x4b471a42, + 0xf1412d0b, + 0x3ea94d0b, + 0x23a91a42, + 0x40a91a18, + 0x14a91a18, + 0x93070148, + 0x902bc607, + 0x45c2ce2b, + 0x10d4a964, + 0x02100701, + 0x23140704, + 0xa9430731, + 0xad0112d2, + 0xab0110d1, + 0x0724024f, + 0x14d4a932, + 0x12d3ad01, + 0x021e0701, + 0x071407e4, + 0x07312336, + 0x16d2a943, + 0x14d1ad01, + 0x024fab01, + 0xa9320724, + 0xad1a14d4, + 0xea0116d3, + 0x11ff67a4, + 0x10d2a9f4, + 0x014c0b01, + 0x274fabf8, + 0x157027a0, + 0x0ed2adf4, + 0xff565e01, + 0xbdfcd4c1, + 0xbd011adb, + 0x11011bd8, + 0x2ed3b9f1, + 0x1cd0ad01, + 0xe3f02101, + 0xa920004d, + 0xc5012cd2, + 0xdeadb4d0, + 0xd9ad011e, + 0xdcad0120, + 0xd1ad0122, + 0xd7ad010a, + 0xd5ad0108, + 0xd4c5012a, + 0x933123fc, + 0x03e2bff0, + 0x313532d2, + 0x2ad2a9f4, + 0x444d0301, + 0x894d0b01, + 0x41210c43, + 0xd3ad322b, + 0x0499010c, + 0x0e41d88a, + 0x079003c1, + 0x2b333341, + 0x07410843, + 0x8df49313, + 0x41c503e2, + 0x993a1e3c, + 0xd1d18a04, + 0x41d80134, + 0x9003c10e, + 0x33334107, + 0x4108432b, + 0xd4a91307, + 0xd3a91a14, + 0xd2a91a16, + 0x349b012a, + 0xe25ef493, + 0xc5322b03, + 0xf4533c41, + 0xd3adfd77, + 0xd415010c, + 0x012cd4a9, + 0x41030327, + 0x012cd4ad, + 0xf58ef143, + 0x4c273127, + 0x5a049d1f, + 0x9d58039d, + 0xfe0b5903, + 0x202730a7, + 0x02d54027, + 0x03bd1a78, + 0x04ad1a04, + 0x03bd1a74, + 0x03bd1a80, + 0x02d50754, + 0xfe0b1a7c, + 0xfe0bfe0b, + 0xf093fe0b, + 0x0b008d24, + 0x65f393fe, + 0x34b90444, + 0x01c1012f, + 0x2744c6ac, + 0xb9241e21, + 0x24075434, + 0x2027ff4c, + 0x32d10c1e, + 0x2c53076c, + 0xf621830f, + 0x3df49325, + 0x44b90444, + 0x4fe61c0f, + 0x30270124, + 0x13d54227, + 0x14d50128, + 0x13d5011c, + 0x2fe60120, + 0x4c2700d9, + 0x3014d50f, + 0x484c2701, + 0x012014d5, + 0xd5144c27, + 0x07012414, + 0x344d0341, + 0x27202701, + 0x4205113c, + 0xf3c84403, + 0x40273227, + 0x013814bd, + 0x013913bd, + 0x013a13bd, + 0x013b13bd, + 0x43e2f493, + 0x6c44d104, + 0x004dd807, + 0x4e383e80, + 0xbd020000, + 0x1e013813, + 0x004e380c, + 0x41270100, + 0x013814bd, + 0x43bef393, + 0x6c34d104, + 0x004ed807, + 0xb9190100, + 0xbd19fc34, + 0xb9013914, + 0xbd19fd30, + 0xb9013a10, + 0xbd19fe33, + 0x93013b13, + 0x044397f3, + 0x012f34b9, + 0x14d14886, + 0x23070134, + 0x14d541a3, + 0x41070134, + 0x1bf42d03, + 0x013c4d03, + 0x20013627, + 0x40052403, + 0xf3a84403, + 0x436af393, + 0x3034b904, + 0xd1478601, + 0xa9013414, + 0xa91bf232, + 0xa31bf033, + 0x3414d542, + 0x5413d501, + 0x5812d501, + 0x45f39301, + 0x34b90443, + 0x49c61c0f, + 0xd5114c27, + 0x27017814, + 0x2814d548, + 0x5c4c2701, + 0x012c14d5, + 0x1c0c34b9, + 0x017c14bd, + 0x1c0d30b9, + 0x017d10bd, + 0x1c0e33b9, + 0x017e13bd, + 0xfc4efe0b, + 0xc0072227, + 0x0ea71327, + 0xbefe00fe, + 0x27ffd6ff, + 0x4004be01, + 0x93402702, + 0x0442f3fd, + 0x202730a7, + 0x1d7dd49d, + 0x7cd49dd4, + 0x1a04d3bd, + 0xbd7ad29d, + 0x270754d3, + 0x0dc39940, + 0x1a90d4d5, + 0xd63cd28d, + 0xdf0ea738, + 0xefbeffff, + 0x0e27003a, + 0xbe027f80, + 0xd5ffa4c7, + 0xa70750d0, + 0xffffdf0e, + 0x003ab6be, + 0x157e0d07, + 0x030d07fe, + 0x2701840d, + 0x714c2730, + 0x04030305, + 0xf393f4c8, + 0x27044314, + 0x164c2720, + 0x34033205, + 0xf393f4c8, + 0x2704435c, + 0x144c2720, + 0x34033205, + 0xfc93f4c8, + 0x27044274, + 0xc48da84c, + 0x930c0780, + 0x02482df4, + 0x03480d03, + 0x0dbec415, + 0x0c070000, + 0x8e800c03, + 0x000000fc, + 0x40270201, + 0x3f2721e3, + 0x7fffffff, + 0x02050315, + 0x04b504a5, + 0x04350425, + 0x853804c5, + 0x27049504, + 0x1f3c2720, + 0x029d4027, + 0x3d049d3c, + 0x0c032103, + 0x0bf3800c, + 0xc11007fe, + 0x30273802, + 0x1c034027, + 0xfc04bd3c, + 0xff03bd01, + 0xf403d501, + 0xf803d501, + 0xfd03bd01, + 0xfe03bd01, + 0x380c1e01, + 0x3d402721, + 0x0c1c0314, + 0x22b62153, + 0x02c50235, + 0x0b022538, + 0xff4f27fe, + 0x157fffff, + 0x26139904, + 0x433b4127, + 0x14590485, + 0x4499410b, + 0x34049d26, + 0xfe4ea81e, + 0xc1340499, + 0x44473803, + 0xe0274203, + 0x25c6051e, + 0x2307e103, + 0x31532183, + 0xff1ef498, + 0x4e871e07, + 0x142b1433, + 0x300b3107, + 0x349d4027, + 0x3e329d3d, + 0x313803c1, + 0x3b412702, + 0xab24eb4e, + 0x3c1c0334, + 0x353803c5, + 0x8e010b02, + 0x07fe4efe, + 0x87243321, + 0x0b212b11, + 0x9d402720, + 0x23993d24, + 0xc111273c, + 0xe1073804, + 0x4eebe33b, + 0x993804c5, + 0x04313c23, + 0x41eb133b, + 0xfe8e0435, + 0x41d80401, + 0xb003d113, + 0x24343901, + 0x3d412743, + 0xe3040134, + 0x0b040541, + 0x99fd4efe, + 0xd0073404, + 0x47380ec1, + 0x03010734, + 0x272d0732, + 0xd82a1e10, + 0x24c120e1, + 0x1a40ce40, + 0x41870107, + 0x042b0433, + 0x4d0b4007, + 0xd43d4499, + 0x0c031244, + 0x8e0d0b3c, + 0x03e153fd, + 0x0c2c0311, + 0x93d5f3f0, + 0x028983f0, + 0xfd4efd8e, + 0x07340499, + 0x380ec1d0, + 0x01073447, + 0x2d073203, + 0x2a1e1027, + 0xc120e1d8, + 0x40ce4424, + 0x8701071a, + 0x2b043341, + 0x0b400704, + 0x3d44994d, + 0x031244d4, + 0x0d0b3c0c, + 0xe153fd8e, + 0x2c031103, + 0xd5f3f00c, + 0x893af093, + 0x4efd8e02, + 0x07d007fc, + 0xfed47ec1, + 0x05361007, + 0x891af193, + 0x190d1e02, + 0x27d33102, + 0xab423b41, + 0x27d33534, + 0x15145d41, + 0x07d4811c, + 0x8b412301, + 0x8e14254c, + 0x07f54efc, + 0x630001d0, + 0x070183f3, + 0x07920771, + 0x2704e653, + 0x02ff5e01, + 0x41d82401, + 0xa5203509, + 0x1ed095d0, + 0x044d835f, + 0x044d2401, + 0x1e302701, + 0x71d39137, + 0xc8342b14, + 0xd2811531, + 0x4c534207, + 0x73420b1f, + 0x1e34da41, + 0x320bd3a1, + 0x36e61a1e, + 0x3013d281, + 0x4c534207, + 0x73420b1f, + 0xa1345241, + 0x1e322bd3, + 0x71d3a103, + 0x35430b74, + 0x0e749994, + 0x94014676, + 0x830d42d8, + 0x4c40284c, + 0xa5717128, + 0x11d195d3, + 0xff4fc4d4, + 0x187fffff, + 0x44d89401, + 0x27415830, + 0x0000004f, + 0x1ed41580, + 0x15923124, + 0x311e1ed2, + 0x01433293, + 0x104cfc94, + 0xd4c10267, + 0x404cd830, + 0x32d4b10c, + 0xfc940143, + 0x0255104c, + 0x4cd89401, + 0x93310ac1, + 0x9401d3b5, + 0x0130d4c5, + 0x45d40193, + 0xa39111d3, + 0x21d15541, + 0x31d26592, + 0x30f1c591, + 0xd175d405, + 0x4307315c, + 0x01044d83, + 0x01044d44, + 0x5a7e0d07, + 0x01965efd, + 0x3d072d07, + 0x1d074d07, + 0x01b42d03, + 0x01c43d03, + 0x01d44d03, + 0x01e41d03, + 0xf205dc31, + 0xf425f315, + 0x78d1f135, + 0xc6660134, + 0xc158b027, + 0x0d071b07, + 0x53fdc87e, + 0x76b103c1, + 0x278a69c2, + 0x27b80720, + 0x75f26560, + 0xb5f2a5f2, + 0xc15b1ef2, + 0xbc2130f3, + 0x1c07c30b, + 0x71fdec7e, + 0x0bf311f4, + 0xd8041934, + 0x4c4426a1, + 0x071c0720, + 0xfe697e0d, + 0xf401f161, + 0x410b0219, + 0x8459421d, + 0xf1651103, + 0xa11146c2, + 0xa53103f3, + 0x71091ef3, + 0x751103f1, + 0x19341df1, + 0x3b312704, + 0x3d412734, + 0x03f2b104, + 0xb523ab61, + 0x03a153f2, + 0x078439b4, + 0xa064ca0d, + 0x87073027, + 0x6027a707, + 0xf355f345, + 0xf395f385, + 0x81009d5e, + 0x2aac897b, + 0xb183b65b, + 0x7471b686, + 0x8130f1c1, + 0x6c82c1d3, + 0xc40b411b, + 0xc32b329b, + 0x73914127, + 0x438b463b, + 0xb5664b06, + 0x1c070d07, + 0x1efd547e, + 0x070d0708, + 0xfd947e1c, + 0x4c440419, + 0x071c0720, + 0xfdd17e0d, + 0xf341f281, + 0xb23bf421, + 0x3bab420b, + 0xf3452103, + 0x0119f285, + 0x291e411d, + 0x1c07b566, + 0x1e7e0d07, + 0x07081efd, + 0x7e0d071c, + 0xf291fd5e, + 0xb23bf351, + 0xf4313bab, + 0x0119f355, + 0x411d420b, + 0xf2952103, + 0x31270419, + 0x4227343b, + 0xf2b1043d, + 0x23ab6103, + 0xa203f2b5, + 0x74998403, + 0x11739912, + 0x64ea430b, + 0xf261ff5b, + 0xf441f3b1, + 0xd2bdf151, + 0xd32501fc, + 0xd4d5f3a1, + 0xd3bd01f4, + 0xf4710200, + 0x01f8d1d5, + 0x01fdd4bd, + 0xd1bdf181, + 0xf29101fe, + 0x01ffd2bd, + 0xd4c1dc21, + 0xa6c4cb38, + 0x34d499c7, + 0xb447a027, + 0x0e1eb103, + 0x1a07c158, + 0x4a7e0d07, + 0x03c153fc, + 0xf1bacea1, + 0xf37e0d07, + 0x990f46fb, + 0x31270c54, + 0x30274486, + 0x43034307, + 0x9431043d, + 0x01b0d0d5, + 0x71710415, + 0x01254027, + 0x549d9231, + 0x01528526, + 0x414c3894, + 0x549d4127, + 0x07920126, + 0x044d8342, + 0x044dc401, + 0x2c3c0d01, + 0x38743180, + 0x9d482742, + 0x00192654, + 0x210b509d, + 0x27d331d4, + 0xb543eb01, + 0x27031e54, + 0x8ef34300, + 0x101cd4f5, + 0x33418712, + 0x0b142b14, + 0x3e149910, + 0x002744d6, + 0x0c27fe0b, + 0x4efe0b10, + 0x93d007f8, + 0x00860ff0, + 0x0030abbe, + 0x9338d1c1, + 0x008624f0, + 0x00309fbe, + 0xf093d121, + 0xbe00863d, + 0x31003094, + 0x56f093d1, + 0x89be0086, + 0xd1d10030, + 0x14d601b0, + 0x031e10a7, + 0xf0931119, + 0xbe008665, + 0xd1003074, + 0xd601b0d1, + 0x1e10a714, + 0x93111103, + 0x008670f0, + 0x00305fbe, + 0x9334d199, + 0x008684f0, + 0x003053be, + 0x9334d499, + 0x008698f0, + 0xb103b447, + 0x00384fbe, + 0xcd07ad07, + 0x8c279027, + 0x99211e6d, + 0x45143dc4, + 0x72a740f9, + 0x39be0001, + 0xd499003b, + 0x0ccc0334, + 0x0c27942e, + 0x3b2abe7c, + 0x07910300, + 0xdcb9ce08, + 0x00387bbe, + 0x8668f093, + 0x3812be00, + 0x93c02700, + 0x008671f8, + 0x8668fb93, + 0x991f1e00, + 0x44a63da4, + 0xbe40a0c1, + 0x99003af3, + 0x080734d4, + 0x0b07c40e, + 0x0037ebbe, + 0xac03c103, + 0xce00270c, + 0x3dbedec9, + 0xf0930038, + 0xbe008641, + 0xb9002fc8, + 0x9301fcd1, + 0x008648f0, + 0x002fbbbe, + 0x0200d1b9, + 0x865bf093, + 0x2faebe00, + 0xfdd1b900, + 0x6ef09301, + 0xa1be0086, + 0xd1b9002f, + 0xf09301fe, + 0xbe008681, + 0xb9002f94, + 0x9301ffd1, + 0x008694f0, + 0x002f87be, + 0x01f4d1d1, + 0x86a7f093, + 0x2f7abe00, + 0xf8d1d100, + 0xc8f09301, + 0x6dbe0086, + 0xf093002f, + 0xbe0086ed, + 0xb9003770, + 0x0701fcd1, + 0xf5f2930d, + 0x0d030086, + 0x53be01b4, + 0xb9be003b, + 0xf0930037, + 0xbe0086e9, + 0xb9003750, + 0x0701fed1, + 0xd40d030d, + 0xd1f29301, + 0x33be0086, + 0xf80e003b, + 0x0037979e, + 0x1499fb4e, + 0x23448618, + 0x1ec02741, + 0x53c10305, + 0x07439641, + 0x20bc27e2, + 0x0107e103, + 0xbc2bd027, + 0x1e0d149d, + 0x242f9b40, + 0x2c534127, + 0x25f49b1f, + 0x070d1499, + 0xab3d3b32, + 0x0d149d43, + 0x3d072886, + 0x3d033433, + 0x310b0138, + 0x0f1e2027, + 0x9b244f9b, + 0x4b5b25fc, + 0x2103341d, + 0x04993103, + 0xed24ca06, + 0x0103d103, + 0x27bffef0, + 0x4efb8e00, + 0x27c207f5, + 0x9d402700, + 0xc06d0424, + 0x2307f223, + 0x34d67107, + 0x0e1ec01d, + 0x27243f9b, + 0x25f49b41, + 0x1d1f3c53, + 0xe6c419c3, + 0x99023b4f, + 0x242e6274, + 0x041e3027, + 0x07283f9b, + 0x23e32be2, + 0x40ecf4e1, + 0x3f9b02e8, + 0x9b412724, + 0x2f9b25f4, + 0x1f3c5328, + 0x4e070e07, + 0x03333347, + 0x61274633, + 0x632b040b, + 0xdf072103, + 0x070b629b, + 0x2710dc03, + 0x9b311eb0, + 0x4127242f, + 0x5325f49b, + 0x25f61f2c, + 0x9b243f9b, + 0x3c5325f4, + 0x1ed31d1f, + 0x04c4990d, + 0xc49d4103, + 0x1d412704, + 0x0b4f07d4, + 0x03421d4b, + 0x99d103b1, + 0xb2c2a902, + 0x333e07cb, + 0x0b4e4734, + 0x23320743, + 0x87430b31, + 0x07de0704, + 0x33d3334e, + 0x0b9f0746, + 0xb00c03d4, + 0x07109c03, + 0x0b070bbf, + 0x0b530793, + 0x27b30bd7, + 0x1e102780, + 0x19040126, + 0x23a60793, + 0x0b042391, + 0xcc36e6a4, + 0xb41913a0, + 0x483bc269, + 0x24ab3887, + 0x3a253c0b, + 0x8103c26d, + 0x4507b123, + 0x0baad399, + 0xd2112341, + 0x60ccd034, + 0xa9d39923, + 0x430b4f07, + 0x06104499, + 0x0b4f0747, + 0x69341934, + 0x87483bc2, + 0x0b24ab38, + 0x25c26d3c, + 0x07810336, + 0x333e074e, + 0x0b363343, + 0xb04c0343, + 0xbc23b407, + 0x070707b0, + 0x0bb70b1f, + 0x03902704, + 0x281e101c, + 0x04014319, + 0x0403a607, + 0x3766a40b, + 0x0717a0cc, + 0x19490b4f, + 0x3bc26943, + 0xab488738, + 0x254c0b23, + 0x03c26d4a, + 0x99910381, + 0x4107aab2, + 0x92ca490b, + 0x333e07d0, + 0x0b4e4734, + 0x23320743, + 0x0bd10731, + 0x07d30b43, + 0x0304875f, + 0x1d07105c, + 0x2bb00c03, + 0x0baf0715, + 0x03a30b07, + 0x1eb80712, + 0x19040126, + 0x239607d3, + 0x0b0423d1, + 0x8736e694, + 0xc82c0b2b, + 0xa4190f91, + 0x4b3bc369, + 0x292534ab, + 0xb103c36d, + 0xf1f0a123, + 0x2c61c8d9, + 0x3e074e07, + 0x43333633, + 0x470b430b, + 0x0ba94399, + 0x06541953, + 0x0b4f0747, + 0x69341934, + 0x874b3bc2, + 0x0b24ab3b, + 0x25c26d3c, + 0x07b10336, + 0x334e073e, + 0x0b333346, + 0x99370b34, + 0x4e47aa3a, + 0x4e0be433, + 0x04874a0b, + 0x0c03df07, + 0x10dc03b0, + 0x070b1f07, + 0x9307da0b, + 0x281e1a0b, + 0xd3190401, + 0xa103e607, + 0x0403d103, + 0x36e6e40b, + 0x2c0b2b87, + 0x190fe1c8, + 0x3bc36914, + 0x2534ab4b, + 0x03c36d2e, + 0x991103b1, + 0xa4caa994, + 0x2b6b07d4, + 0x00875e68, + 0x9b288f9b, + 0x7459286f, + 0x470bb607, + 0x0b264499, + 0xb14beab8, + 0x27dc0700, + 0x1e9027a0, + 0x36cbbe2a, + 0x242f9b02, + 0x2c534127, + 0x25f49b1f, + 0xc399c469, + 0x3b120704, + 0x2ba12319, + 0x0b41aba0, + 0x9dc46d32, + 0xda1504c3, + 0xd4039103, + 0x87d398ce, + 0x0bd803d8, + 0x27a807dc, + 0xbe2c1e90, + 0x9b023691, + 0x4127242f, + 0x9b1f2c53, + 0xc46925f4, + 0x0704c399, + 0x031a3b12, + 0xab900b91, + 0x05320b41, + 0x9dc46dd9, + 0xa10304c3, + 0xabcad403, + 0x5dcb3dd3, + 0x93c67dc8, + 0x03d5e7f0, + 0x9b3c02c1, + 0x3f9b231f, + 0x2b430722, + 0x07400842, + 0x2b410732, + 0x1141c843, + 0x1b3c04c1, + 0x1948c441, + 0xffce60be, + 0x151e0696, + 0xc1214f9b, + 0x438bbc03, + 0x091e4516, + 0x071e0127, + 0x031e0427, + 0xf2030027, + 0x0000f58e, + 0x0000007f, + 0xffffff80, + 0xf223f54e, + 0xf255f145, + 0xf4283f9b, + 0xb901cd38, + 0xd6010004, + 0x1ed30744, + 0x29df9b0a, + 0xd8f4d30b, + 0x03bd01ba, + 0x0dbd01cc, + 0x0d0301cd, + 0x300701d0, + 0x07ef0c03, + 0x7f3ce3e0, + 0x237fece3, + 0x1902bf0d, + 0x803c0334, + 0x27f93ec2, + 0x07f95161, + 0x272d3b26, + 0x65910370, + 0x015c5ef2, + 0x9b244f9b, + 0x4c5325f6, + 0xab433b1f, + 0x193103a4, + 0xcafe35e4, + 0x04b9eb34, + 0x45160100, + 0xf3253027, + 0x4027231e, + 0xf4253027, + 0x4f9b141e, + 0x25f69b24, + 0x4c53f521, + 0xab433b1f, + 0x03f52554, + 0x19f23131, + 0xe734ca24, + 0x07550399, + 0x33e70747, + 0x2be73343, + 0x03f315e4, + 0x9901d0ed, + 0xe00b5604, + 0xf4758027, + 0xdc00d85e, + 0x502709a1, + 0xf5051027, + 0x4f9b151e, + 0x054fab29, + 0x294f9bf4, + 0x4f8bf211, + 0x1407423b, + 0xf3211fab, + 0x270b31dc, + 0x272027b0, + 0x1e3027c0, + 0x294f9b77, + 0xbfabb407, + 0x07293f9b, + 0x8bf5614b, + 0x33450b4f, + 0x803c0347, + 0x342b4d7b, + 0x3c483f8b, + 0xedf25380, + 0x1e2301fe, + 0x803f2c0d, + 0x53ffffff, + 0x01fee3f4, + 0x3bf57143, + 0xab230735, + 0x294f9b2f, + 0xcfabc407, + 0x07293f9b, + 0x8bf5614c, + 0x33450b4f, + 0x803c0347, + 0x342b4d7b, + 0x3c483f8b, + 0xb1f45380, + 0x1e4301fe, + 0x803f2c0d, + 0x53ffffff, + 0x01fea7f5, + 0x3bf47153, + 0x013fab34, + 0xff1d83f4, + 0x834f6b0f, + 0x330fff2d, + 0x2114ab18, + 0x332833f5, + 0x4c07143c, + 0xbc3323ab, + 0xab4f6b18, + 0x5324ab1b, + 0x15e10551, + 0x25a153e2, + 0x038103f5, + 0x19f231e8, + 0x2484ea24, + 0x103c27ff, + 0x4cd0342b, + 0x31270b10, + 0xe415071e, + 0xe803e405, + 0xf3a84027, + 0xf9f07103, + 0x410c1e03, + 0x27a027fe, + 0x5ee70b30, + 0xf351fea7, + 0x031031c4, + 0x2702480d, + 0x1e4c2730, + 0x04030305, + 0x0027f4c8, + 0x0127031e, + 0xf58ef203, + 0xcf5bf04e, + 0xfe2bdf3b, + 0x0f07fc4e, + 0xffada4be, + 0xfb4eff1e, + 0xe0beb007, + 0xd007ff22, + 0xf0931007, + 0xbe008139, + 0x46002978, + 0x1ec027d7, + 0x03d2010b, + 0x296abec1, + 0x07d40300, + 0x2bf0931c, + 0xcbda0081, + 0x1efb8eed, + 0x4eff1eff, + 0x074027f7, + 0x6603b990, + 0xa9046d01, + 0x4d010400, + 0x12908d94, + 0x92a9f6a3, + 0x3ae0016c, + 0x93a9042f, + 0x35f0016a, + 0xd12703f1, + 0x949d4027, + 0x9a928d9c, + 0xffffcea7, + 0x75f293eb, + 0xd01303e1, + 0x1027ce21, + 0xb5ea938d, + 0xc9f0932d, + 0x019d03de, + 0xc5412748, + 0x32273024, + 0x23c54327, + 0x8824c55c, + 0xdeaef393, + 0x27310503, + 0x0c049d40, + 0x21152105, + 0xc55821c5, + 0x019d8421, + 0x34019d20, + 0x0717e2dc, + 0x354227dc, + 0x100c27d4, + 0x024f70be, + 0xd4354027, + 0x32d8d321, + 0xb94027ed, + 0x8d01b89c, + 0xcff6f494, + 0x2027038b, + 0x019f94b9, + 0x019e93b9, + 0x31834183, + 0x331b3c33, + 0x43ab1a4c, + 0x00704fa3, + 0x42aba005, + 0xffffeea7, + 0xb9e405eb, + 0xb9019993, + 0xb9019a94, + 0x83019b92, + 0x4c830f3c, + 0xb948330f, + 0xb9019c90, + 0x3301909d, + 0xb934ab34, + 0x83019891, + 0x2c330f2c, + 0x053ea30c, + 0x0c83c000, + 0xab4d070f, + 0x100c3332, + 0x019192b9, + 0x43231383, + 0x1c3330ab, + 0x33438314, + 0x31ab1c4c, + 0x34ab2323, + 0xab1e2c33, + 0xd1e31532, + 0xf8019894, + 0xffff004e, + 0x4a2702fe, + 0x7d3b7227, + 0x749b7103, + 0x022494d1, + 0x533f7c03, + 0xe144fc76, + 0xb93d2702, + 0x83470780, + 0x48333f4c, + 0xeea734ab, + 0xc5ebffff, + 0xcfe65ce3, + 0x94d102a8, + 0x00270150, + 0x075a4389, + 0x60bc03b4, + 0xb4b9b30b, + 0xb2b903e1, + 0xb1b903e2, + 0xb3b903e0, + 0x2c3303e3, + 0xab483310, + 0x3341ab42, + 0x43ab183c, + 0xb3b9e465, + 0xb2b903e5, + 0xb1b903e6, + 0xb4b903e4, + 0x2c3303e7, + 0xab383310, + 0x3331ab32, + 0x34ab184c, + 0xe045e375, + 0x1027e045, + 0xffff3ea7, + 0x072627e8, + 0x0b443341, + 0x0340194b, + 0x39f01d11, + 0x99f03d40, + 0xf05d0440, + 0x7d054099, + 0x084099f0, + 0x9904f09d, + 0xf09d0940, + 0x0c409905, + 0x9906f09d, + 0xf09d0d40, + 0x9d405907, + 0x407908f0, + 0x9909f09d, + 0xf09d0640, + 0x0740990a, + 0x990bf09d, + 0xf09d0a40, + 0x0b40990c, + 0x990df09d, + 0xf09d0e40, + 0x0f44990e, + 0x010ff49d, + 0x113405f4, + 0x213015f0, + 0x313425f4, + 0x033035f0, + 0xf2f0103c, + 0x031f078b, + 0x2107101c, + 0x7f8af393, + 0x01462700, + 0x05340330, + 0xa8240320, + 0x07df07f4, + 0x9fcea781, + 0xdc03e8ff, + 0x01a62728, + 0x3310278e, + 0x60ec03e6, + 0x0c27eb0b, + 0x07210740, + 0x83310741, + 0x83228726, + 0x3c83214c, + 0x0b327318, + 0x0b430b42, + 0x193d074e, + 0x1d310b44, + 0xf0110334, + 0xf4a1dcf0, + 0xc4058403, + 0xc415d411, + 0xc325d321, + 0x3534f0c1, + 0x38f2c1c0, + 0xf4c1c245, + 0xc1c4553c, + 0xc06540f0, + 0x7544f2c1, + 0x48f4c1c2, + 0xf0c1c485, + 0xc1c0954c, + 0xc2a550f2, + 0xb554f4c1, + 0x58f0c1c4, + 0xc130c0c5, + 0xc2c55cf2, + 0x60f4c134, + 0xc138c4c5, + 0xc0c564f0, + 0x40cc033c, + 0xff75faf8, + 0xeea7a027, + 0x27e8fdff, + 0x330a07c6, + 0xe00d0306, + 0x190b0b01, + 0x9d212704, + 0x1c2728f4, + 0x0742073f, + 0x73478332, + 0x0b433333, + 0x07400b43, + 0x0b44193d, + 0x03341d32, + 0xa1f12821, + 0x05a103f0, + 0x15d411e0, + 0x25d321e4, + 0x34f2c1e3, + 0xf4c1e235, + 0xc1e44538, + 0xe0553cf0, + 0x6540f2c1, + 0x44f4c1e2, + 0xf0c1e475, + 0xc1e08548, + 0xe2954cf2, + 0xa550f4c1, + 0x54f0c1e4, + 0xf2c1e0b5, + 0x30e2c558, + 0xc55cf4c1, + 0xf0c134e4, + 0x38e0c560, + 0xc564f2c1, + 0xec033ce2, + 0x7afcf840, + 0xa7c027ff, + 0xe8fc7fee, + 0x06330c07, + 0x03600d03, + 0x02190b0b, + 0x9d3f1c27, + 0x212728f2, + 0x32074207, + 0x33734783, + 0x430b4333, + 0x3d07400b, + 0x320b4419, + 0x2103341d, + 0xf0a1f128, + 0xe005c103, + 0xe415d411, + 0xe325d321, + 0x3534f2c1, + 0x38f4c1e2, + 0xf0c1e445, + 0xc1e0553c, + 0xe26540f2, + 0x7544f4c1, + 0x48f0c1e4, + 0xf2c1e085, + 0xc1e2954c, + 0xe4a550f4, + 0xb554f0c1, + 0x58f2c1e0, + 0xc130e2c5, + 0xe4c55cf4, + 0x60f0c134, + 0xc138e0c5, + 0xe2c564f2, + 0x40ec033c, + 0xff7ac2e4, + 0x43334707, + 0x2ea73027, + 0x8dfeffff, + 0x23d5ec94, + 0xf39b0be0, + 0x8ef6830e, + 0x27d027f7, + 0xfc105e40, + 0x5e393c27, + 0x4827fd21, + 0xd1fd035e, + 0x99015094, + 0x14075c43, + 0xc45c1c03, + 0x2c270d32, + 0xe832071a, + 0xc01419f3, + 0xc127f842, + 0x01002d27, + 0xa9fc575e, + 0x47016a93, + 0x27d02722, + 0xfbd45e41, + 0xc007fc4e, + 0xf0931327, + 0xbe007cd4, + 0x110024f0, + 0xe1f093c1, + 0xe5be007c, + 0xc1210024, + 0x7ce8f093, + 0x24dabe00, + 0x93c10100, + 0x007ceff0, + 0x0024cfbe, + 0xf093c231, + 0x27007cf6, + 0x24c2be10, + 0x93c24100, + 0x007ce9f0, + 0xb5be1127, + 0xc2510024, + 0x7cdcf093, + 0xbe122700, + 0x610024a8, + 0xcff093c2, + 0x1327007c, + 0x00249bbe, + 0xf093c271, + 0x27007cc2, + 0x248ebe14, + 0x93c28100, + 0x007cb5f0, + 0x81be1527, + 0xc2910024, + 0x7ca8f093, + 0xbe162700, + 0xa1002474, + 0x9bf093c2, + 0x1727007c, + 0x002467be, + 0xf093c2b1, + 0x27007c8e, + 0x245abe18, + 0x30c2c100, + 0x7c80f093, + 0xbe192700, + 0xc100244c, + 0xf09334c2, + 0x27007c72, + 0x243ebe1a, + 0x38c2c100, + 0x7c64f093, + 0xbe1b2700, + 0xc1002430, + 0xf0933cc2, + 0x27007c56, + 0x21be0c1c, + 0xc2c10024, + 0x47f09340, + 0x1c27007c, + 0x2412be0d, + 0x44c2c100, + 0x7c38f093, + 0x0e1c2700, + 0x002403be, + 0xf04eff1e, + 0xdf3bcf5b, + 0xfc4efe2b, + 0x98be0f07, + 0xfc0efffa, + 0xff0bf00e, + 0xcf5bf04e, + 0xfe2bdf3b, + 0x0f07fc4e, + 0xfffedfbe, + 0xff1eff1e, + 0xfe0bff1e, + 0x27180c23, + 0x27041041, + 0x0b040740, + 0x0c0c54fe, + 0x271d06d0, + 0xc0fe0b06, + 0xd023120c, + 0xc01b120c, + 0xd0f1140c, + 0xc013140c, + 0xa70f150c, + 0xd4fe0b00, + 0x01d00c04, + 0x0b042709, + 0x0b0727fe, + 0x0b0527fe, + 0x160c10fe, + 0x4127c81e, + 0x4e38403b, + 0x27338000, + 0xd8fe0b06, + 0x0c7e004e, + 0x0b0527ec, + 0x30fd4efe, + 0xd0a7120c, + 0x41270d1e, + 0x4ed8403b, + 0x09036dbc, + 0xce3ed027, + 0xfd8e0d2b, + 0x92434dd8, + 0x3ed127e6, + 0x8e0d2bc1, + 0x3efe4efd, + 0x8e012385, + 0xb9f54efe, + 0x2301ea04, + 0x27d007f9, + 0xe74ae030, + 0x9d46230e, + 0x4f6ba8d3, + 0x42143027, + 0x43073127, + 0xdca94f6b, + 0xd49d0212, + 0x14d9b9a9, + 0x15dab902, + 0x86ec0702, + 0x27e15344, + 0x4ad4b931, + 0x3b230702, + 0x0741232a, + 0x03120704, + 0x23c40b41, + 0x0b0e0b11, + 0xa9c1231e, + 0x0b0210de, + 0x3bb007c2, + 0x7b1a5b39, + 0x07ba5bca, + 0x3ba4234e, + 0x234123ca, + 0x233e0b31, + 0xa9e407c1, + 0x5b01eed2, + 0x07e95b39, + 0x3b9423ac, + 0x53455329, + 0x99afab05, + 0xd38da8dc, + 0x9ed18d9c, + 0x8da2de8d, + 0xd48da0db, + 0xa4d08da6, + 0x8d98d28d, + 0xc4e69ada, + 0xd48d4a47, + 0x0740279a, + 0xecd4bd0d, + 0xe00d0302, + 0x3c04c101, + 0xff004efc, + 0x991025ff, + 0x46e03504, + 0x45e00e28, + 0x4c270e1a, + 0x4ad4ad30, + 0xa8d4d101, + 0xbf48f802, + 0xb03c2700, + 0x23350499, + 0xb9343b44, + 0xad024ad4, + 0xbd014cd3, + 0x3302d1d4, + 0x4f83164c, + 0x07000000, + 0xffff3ea7, + 0x0c4fa3e7, + 0x05f08480, + 0xa8d3d134, + 0x83c30702, + 0x81cfe6c4, + 0x011d2700, + 0x3d029930, + 0x833e0499, + 0x33438323, + 0x83473325, + 0x2742ab38, + 0x27349621, + 0xab328720, + 0xa743ab41, + 0xe7ffffee, + 0x9950e4c5, + 0x02994603, + 0x54019947, + 0x83350499, + 0x55009931, + 0x3c332183, + 0x0e2c330f, + 0xab1f1c83, + 0x83143332, + 0x43231f0c, + 0x093331ab, + 0x30ab4383, + 0xab104c33, + 0x36e31534, + 0x6540a7c7, + 0xb9e455e4, + 0xe00215d4, + 0xe00dba45, + 0xc00daa46, + 0xff1e1744, + 0xe4654027, + 0xe81ee455, + 0x10011d27, + 0x3c27801e, + 0xff425ec0, + 0x5897f493, + 0xe8d4d502, + 0xa4d4a902, + 0x004d8301, + 0xd146a680, + 0x3c01c0d4, + 0x9cd4d141, + 0xc04c3801, + 0xd4bd4027, + 0xd3d102ec, + 0x402702a0, + 0x0354d4bd, + 0xa734f3c5, + 0xfddfff4e, + 0xd1b93027, + 0x43c502ce, + 0x16d2b9c4, + 0x50f3c502, + 0x412724f6, + 0xb950f4c5, + 0xc101ead8, + 0x825350fb, + 0xf8c58183, + 0xc1b86644, + 0xe1c344fe, + 0x3538fec5, + 0x9cd4d1fe, + 0xd1deb902, + 0x5a4cc002, + 0x5b4cf415, + 0x4fe60d2f, + 0xff1e0cc3, + 0xfcc5c027, + 0x1efc3538, + 0xb52127e1, + 0x44fbc1f2, + 0x0212d4a9, + 0xfc318e07, + 0x7b0f8c03, + 0xd0dcbd4b, + 0xa9840b02, + 0x730210d0, + 0x38f2c184, + 0xc578f8c5, + 0x25263cf0, + 0x81e38103, + 0xa978f8c5, + 0xa901f2d9, + 0xc101f4d5, + 0x290734f3, + 0x37668507, + 0xfbc14307, + 0x03312750, + 0x3b230741, + 0x3b4b0b24, + 0x13201334, + 0x8b538b30, + 0xf8dca929, + 0x44f0c101, + 0x01f6d3a9, + 0xf3c5e03b, + 0x0b7c0748, + 0x98d0d132, + 0x077e0b02, + 0x88fcc565, + 0x0b4cf3c5, + 0x210de067, + 0xe00bd601, + 0xd011210d, + 0x38fbc10b, + 0xfcb1b806, + 0x0c41cfe6, + 0x0c3dc2e0, + 0xc148f2c1, + 0x23034cf3, + 0x23e33303, + 0xf2c533e3, + 0x4cf3c548, + 0x1c183027, + 0xb931270c, + 0x2701ddd4, + 0xc52307b0, + 0x2f6b54fb, + 0xc12744f6, + 0xe054fcc5, + 0x9a11020d, + 0x030df40d, + 0xe00ae311, + 0x0701820d, + 0x830df40e, + 0xe00a8a01, + 0xee01020d, + 0x210de00e, + 0xc10e9701, + 0x402754f1, + 0xd49d3207, + 0xf4d49df5, + 0x3486318b, + 0x30274127, + 0x21274f6b, + 0xf295f425, + 0xc558f3c5, + 0xf3c55cf3, + 0x60f3c530, + 0xc574f3c5, + 0xf3c564f3, + 0x6cf3c568, + 0xd1bdf421, + 0x4fe602ed, + 0xfbc10b7e, + 0x29bff688, + 0x07e25308, + 0xc14fab4e, + 0xd4ad34fc, + 0xcae60342, + 0x4c073127, + 0x0350fec1, + 0x3b230741, + 0xc14e0b24, + 0xf1c14cf0, + 0x13343b48, + 0x002fa320, + 0x13ffff00, + 0x003fa330, + 0x8bffff00, + 0xc5128b02, + 0x638b4cf0, + 0x8b48f1c5, + 0xe6f22173, + 0xc102352f, + 0xd4b988f3, + 0xb0270216, + 0xfbc5f355, + 0x48fcc170, + 0xe12744f6, + 0xa770fec5, + 0xffffffbe, + 0x0d76b0b9, + 0xdab94827, + 0x790702ce, + 0x0354d0bd, + 0xd4bd9807, + 0x7d830355, + 0x9d83fffe, + 0xa4fcfffe, + 0x00270acd, + 0xa8d8b027, + 0xff2ea724, + 0x4707ffff, + 0x0d6e23a9, + 0x43124f8b, + 0x09074307, + 0x0d7023a9, + 0x0f8bb407, + 0x0312bfab, + 0x0fab0307, + 0xc170f1c1, + 0x114770f2, + 0x81a38107, + 0xffff8dc3, + 0x4b8b4807, + 0x31272103, + 0x323bb407, + 0x2123bf8b, + 0xc584f1c5, + 0xf2c57cfb, + 0xd2088b70, + 0x43070c3b, + 0xe4074fab, + 0xfec5ef8b, + 0x8b10077c, + 0x80f1c51f, + 0x070c31d2, + 0x070fab03, + 0xc52f8b20, + 0xf06d80f2, + 0xf92df44d, + 0xf001f70d, + 0x2d07f111, + 0x3d033d07, + 0x2d03034c, + 0x3abe0348, + 0x40270251, + 0x0354d3b9, + 0x0352d4ad, + 0x0350d4ad, + 0x0210dba9, + 0x0212dea9, + 0x034cd9d1, + 0x0a0a3ff6, + 0x0348d7d1, + 0x01009d23, + 0x01007d23, + 0x6707a907, + 0x9d03a153, + 0x61530100, + 0x01007d03, + 0x32e00127, + 0x4e070dcc, + 0xd1b94f8b, + 0x402b0355, + 0x4ac2413b, + 0x07240714, + 0x52d4a93a, + 0x03390b03, + 0x52d4ad41, + 0xf232ca03, + 0x01009de0, + 0x4b070d9d, + 0x402b4f8b, + 0x46c2413b, + 0x07240714, + 0x50d4a936, + 0x03370b03, + 0x50d4ad41, + 0xf232ca03, + 0x01007de0, + 0xfbc10d72, + 0x50d3a988, + 0x52d2a903, + 0x07b50b03, + 0x8b288b48, + 0xadb02b43, + 0xad0350d4, + 0x3b0352d2, + 0x74bae2b1, + 0x88f5c109, + 0x5ae2513b, + 0x3a070b96, + 0x8127390b, + 0x0961b3e2, + 0x4307390b, + 0xa807492b, + 0x45ca8103, + 0x009d00f0, + 0xc1fa5501, + 0x031b4cf3, + 0x06e2013b, + 0xf4c1093e, + 0x07413b48, + 0x0046e214, + 0x0bb6070b, + 0xe29127b7, + 0x0b09290b, + 0x2b4b07b7, + 0x03a90747, + 0xf041ca91, + 0x01007d00, + 0xf4c1ca07, + 0xa3f35184, + 0x8b4f0b41, + 0xe84c8b34, + 0x070af330, + 0xe840e804, + 0xc1a2070a, + 0xf1c180f2, + 0x0baf8b7c, + 0xfa100b23, + 0xa90b33a2, + 0x8b0350d4, + 0xb541fa4f, + 0xb830e80a, + 0xb4a2fa0a, + 0xb041fa0a, + 0x70f8c10a, + 0x487b4a07, + 0x73076207, + 0x0352d4ad, + 0xf0c5687b, + 0x4cf1c548, + 0xfbc1787b, + 0x87bfe650, + 0x83f5b105, + 0x835fe651, + 0xc0d4d105, + 0xc4d3d101, + 0xc8d2d101, + 0x47444701, + 0x65224733, + 0x85f375f4, + 0x48d1b9f2, + 0x33f2b102, + 0x40f1c514, + 0x0b4221e0, + 0x077221f4, + 0x3fe6f321, + 0xf8c10ece, + 0xf4d39948, + 0x6148f4c1, + 0xc58103f9, + 0x979b48f8, + 0x7103433b, + 0x34071807, + 0xd4992707, + 0xc11153f5, + 0xfc8148fe, + 0x2153fa71, + 0xb43bb107, + 0xa29bc29b, + 0xd8b9e123, + 0x930b02d0, + 0xc10bab0b, + 0xfec57123, + 0xe65f6b48, + 0x2705645f, + 0xfbc1103c, + 0x07430768, + 0x034b3b28, + 0x5cfec121, + 0x427b1407, + 0x4e3b187b, + 0xd1d5327b, + 0xd4d50308, + 0xd3d5030c, + 0xfb210310, + 0xfec1b876, + 0x08d4d134, + 0x0cd3d103, + 0x10d2d103, + 0x5b4e5b03, + 0xd52e5b3e, + 0xd50308d4, + 0xd5030cd3, + 0xb10310d2, + 0x064283f4, + 0x08d4d148, + 0x0cd3d103, + 0x10d2d103, + 0x13401303, + 0xd5201330, + 0xd50308d4, + 0xd5030cd3, + 0xc10310d2, + 0x0ff650f0, + 0xd4d1063d, + 0xd3d101a8, + 0xd2d101ac, + 0x492b01b0, + 0x2c2b3a2b, + 0xd4d5f121, + 0xd3d502f0, + 0xd2d502f4, + 0xd0d502f8, + 0xd0d502fc, + 0xd0d50300, + 0xd7ad0304, + 0xd6ad033e, + 0x16c60340, + 0x61037103, + 0x36074707, + 0x31534153, + 0x0344d4ad, + 0x0346d3ad, + 0xb978fec1, + 0xad01ecd4, + 0xe6033cde, + 0xc5012744, + 0xf6c158f0, + 0x74f1c13c, + 0x730f6c03, + 0x3a1ff664, + 0xc1760706, + 0x2fe658f2, + 0xd4d10109, + 0xf3c1021c, + 0x004ef860, + 0x0dfdffff, + 0x0dea3ff6, + 0x0187d8b9, + 0x01e01d27, + 0x80214d27, + 0x01c0d2d1, + 0x4ce32818, + 0x102c3830, + 0x41a347e3, + 0x4a204cf8, + 0x3f42f80b, + 0x90ad270b, + 0x74f3c102, + 0x07c73fe6, + 0x0b0621f8, + 0xa978fbc1, + 0x0301bed0, + 0x78fbc5b1, + 0x0778fec1, + 0x38fcc147, + 0x30074433, + 0x037f1c03, + 0x4c5b7fac, + 0xe1233433, + 0x0318d4d5, + 0x0324d3d5, + 0xe37f1ce3, + 0xb1537fac, + 0xfc78fec5, + 0xd1084b22, + 0xa70324d3, + 0xfddfff4e, + 0x01f043d5, + 0x07c921fc, + 0xa09b179b, + 0x031cd1d5, + 0x0328dad5, + 0xa7801c27, + 0xf3c17f2c, + 0xd1358638, + 0x53031cd4, + 0x1cd4d541, + 0x18d4d103, + 0x78fcc103, + 0x0324d3d1, + 0x4107c49b, + 0xc40b4123, + 0xfcc5b39b, + 0x8b4b0b78, + 0xb9c28b42, + 0xd501ead3, + 0xd50314dc, + 0xe00320d4, + 0xc1082937, + 0x0fe674f0, + 0xd3d10802, + 0x4ea701ac, + 0xd1fddfff, + 0xd501a8d1, + 0xa701b443, + 0xfddfff3e, + 0x34d54027, + 0x31c50198, + 0xff4ea7e8, + 0xf1c1fddf, + 0xe6461574, + 0xd1031e1f, + 0xfc01c0d4, + 0x07031642, + 0xa7343337, + 0xfddfff4e, + 0xd548f2c1, + 0xc101b043, + 0x42d54cf3, + 0x43d5014c, + 0xf4c10154, + 0x404ce040, + 0x00270502, + 0xfbc156e6, + 0x71f86150, + 0x7bfe81fc, + 0x7bcb7b8b, + 0x75f865eb, + 0xb1fe85fc, + 0x651ff6f1, + 0xe6f22104, + 0xc103612f, + 0x3ff650f3, + 0xf4c10335, + 0x204c0440, + 0x7e0c0c27, + 0xd0c5f6c1, + 0xa7fc61ac, + 0xfddfff4e, + 0x4cd5fe71, + 0xf0810108, + 0x010c4ed5, + 0x011040d5, + 0x0249d9b9, + 0x4ea7fe91, + 0xb1fddfff, + 0x1fec83f0, + 0x01004ed5, + 0xd534f1c1, + 0xd5010440, + 0xb9016041, + 0xc1021dd3, + 0xd1d150f4, + 0x048702a8, + 0xd2b93383, + 0x4107021e, + 0x41833a33, + 0x463303ab, + 0xf8c12383, + 0x3304ab44, + 0xfbc10c2c, + 0x3302ab54, + 0xa4d3a983, + 0x4708ab01, + 0x58fcc14b, + 0x3f8b04ab, + 0x30e80cab, + 0x30270d60, + 0x01001dfc, + 0xf1c10241, + 0x33912360, + 0x10ab0e1c, + 0x19ab9733, + 0x02c4d4a9, + 0x0b7242e0, + 0xe506fe21, + 0x00001fa3, + 0x4ea70100, + 0xc5fddfff, + 0x3ea7b441, + 0x27fdefff, + 0xb834d543, + 0xb834c102, + 0xa7fb48dc, + 0xfdefff0e, + 0xdcb804c1, + 0xf908004d, + 0x01d51427, + 0x01d502b8, + 0x302702bc, + 0x067003d5, + 0xeb472ea7, + 0x272305fd, + 0x0500004e, + 0xf39b2415, + 0xc001d50e, + 0x7403d502, + 0xd5432706, + 0xa702c404, + 0xfdefff3e, + 0xdcc434c1, + 0xdea7fb48, + 0xc1fdefff, + 0x4ddcc4d4, + 0x27f90800, + 0xc4ded5e4, + 0x3f3ea702, + 0x1027fdeb, + 0x4f273105, + 0x02050000, + 0xf19b3415, + 0x0f2ea70e, + 0x4c27fde5, + 0x1524051c, + 0x000f2721, + 0x35a00000, + 0xff3ea720, + 0x4103fde4, + 0x31153405, + 0xded53035, + 0xd1d502e0, + 0x43270648, + 0x02e4d4d5, + 0xefff3ea7, + 0xe434c1fd, + 0xa7fb48dc, + 0xfdefff0e, + 0xdce404c1, + 0xf908004d, + 0x01d51427, + 0x3ea702e4, + 0x27fdeb1f, + 0x27320520, + 0x8200004f, + 0x9b341514, + 0x3ea70ef2, + 0x27fde47f, + 0x3405124c, + 0x4f273215, + 0xa0000000, + 0x01d53435, + 0x02d502e8, + 0x4327064c, + 0x02ec04d5, + 0xefff3ea7, + 0xec34c1fd, + 0xa7fb48dc, + 0xfdefff1e, + 0xdcec14c1, + 0xf908004d, + 0x14d54427, + 0x2ea702ec, + 0x27fdeb17, + 0x27230530, + 0xc200004f, + 0x9b241514, + 0x2ea70ef3, + 0x27fde45f, + 0x2405134c, + 0x4f272315, + 0xa0000000, + 0x24353327, + 0x02f013d5, + 0xefff3ea7, + 0xf034c1fd, + 0xa7fb48dc, + 0xfdefff0e, + 0xdcf004c1, + 0xf908004d, + 0x01d51427, + 0x01d502f0, + 0x202702f4, + 0x06e802d5, + 0xeb0f3ea7, + 0x273205fd, + 0x0300004f, + 0x9b341511, + 0x3ea70ef2, + 0x27fde42f, + 0x34053a4c, + 0x4f273215, + 0xa0000000, + 0x01d53435, + 0x02d502f8, + 0x432706ec, + 0x02fc04d5, + 0xefff3ea7, + 0xfc34c1fd, + 0xa7fb48dc, + 0xfdefff3e, + 0xdcfc34c1, + 0xf908004d, + 0x34d54427, + 0x2ea702fc, + 0x27fdeb07, + 0x27230530, + 0x8300004f, + 0x9b241511, + 0x2ea70ef3, + 0x27fde41f, + 0x24053b4c, + 0x4f272315, + 0xa0000000, + 0x2435f903, + 0xf5b1f58e, + 0xdcd15183, + 0xfc6501c0, + 0x01c4ded1, + 0xd0d1fe75, + 0xf08501c8, + 0x27fa845e, + 0xfced5e30, + 0xdc5e4027, + 0x60f1c1f7, + 0x1c339123, + 0x001ea30e, + 0x10ab0400, + 0x19ab9733, + 0xfdba3fe6, + 0x019cd4d1, + 0xb1c04cf8, + 0xc0d4d1fd, + 0x001da301, + 0xa3481880, + 0x0200001e, + 0x9d104cf8, + 0x001ea3fd, + 0x955e0100, + 0xc14427fd, + 0x33276cf0, + 0x482b382b, + 0xf281f161, + 0x402bf871, + 0x233b143b, + 0xd1d5833b, + 0xd8d50308, + 0xd2d5030c, + 0x9f5e0310, + 0x0ccc27fa, + 0x927e0c07, + 0xc5f821f3, + 0x7007acd0, + 0xfbb18886, + 0x0ad2b1e0, + 0xfcc3b1f0, + 0x0ab1b2e0, + 0x0a7fb3e0, + 0x0c27ff1e, + 0xf36f7e0c, + 0xcc277007, + 0xacd0c50c, + 0x0249d9b9, + 0x9200a127, + 0xf491a027, + 0x00cb41e0, + 0x00c744e0, + 0xf8916027, + 0xb9118cf4, + 0x3b412700, + 0x004ef848, + 0x00ae0118, + 0xf091b127, + 0xa5f32b7e, + 0xa50fe6f0, + 0x7e0c070a, + 0x8007f361, + 0x3134fcc1, + 0x30f2c1fe, + 0x8c2b8a0b, + 0x30270c07, + 0x12478e2b, + 0x2227071b, + 0x5027f345, + 0xe027c027, + 0x3027f491, + 0x140f4c23, + 0x0b312742, + 0x0b4127b3, + 0x07b20bb1, + 0x2b240714, + 0x30f4c136, + 0x300bb00b, + 0x1b3b233b, + 0x61664fc6, + 0x7360a7f7, + 0xb1b0a771, + 0x8031e0f3, + 0x4b31d404, + 0xfc71fe81, + 0xa207f061, + 0x4fe6f4a1, + 0x30270a75, + 0xa7074027, + 0xa83ba013, + 0xbea7a10b, + 0xd5fddfff, + 0xd50108b0, + 0x21010cbc, + 0x10bed5fc, + 0x01cff601, + 0x14bad5fc, + 0x18b4d501, + 0x1cb3d501, + 0xfbf25e01, + 0x535eb027, + 0x5e6127ff, + 0x32e0ff3a, + 0x33e00a4a, + 0xff1e0980, + 0xfb71f681, + 0x9c1ef761, + 0xdd5ec007, + 0x44f2c1fe, + 0x08972ff6, + 0x3fe6f321, + 0xd2d1084a, + 0xded101b0, + 0xd4d101bc, + 0xd3d101a8, + 0xd1d101ac, + 0xd0d101b4, + 0xd7ad01b8, + 0xd6ad033e, + 0x71030340, + 0xec2b6103, + 0xb6072c2b, + 0x192bc707, + 0x492b0a2b, + 0xc1533a2b, + 0xd4d5b153, + 0xd3d502f0, + 0xd2d502f4, + 0xd1d502f8, + 0xd0d502fc, + 0xded50300, + 0xdcad0304, + 0xdbad0344, + 0xa95e0346, + 0xbcd7a9f9, + 0xf9c55e01, + 0x05e622e0, + 0x058123e0, + 0x0927ff1e, + 0xe0faff5e, + 0x6c02010d, + 0x810de403, + 0x27f57a02, + 0x10270f0c, + 0xf1c5f095, + 0x54f1c160, + 0x32274127, + 0x07f4d49d, + 0xf5d39d42, + 0x3027418b, + 0x31274486, + 0x20273f6b, + 0x3127f325, + 0xc558f2c5, + 0xf2c55cf3, + 0x74f2c530, + 0xc564f2c5, + 0xf2c568f3, + 0xf56e5e6c, + 0x80010de0, + 0x0dd402a5, + 0xe04b8002, + 0xbd11210d, + 0x010de403, + 0x27f52212, + 0xc1f4954a, + 0x402754f1, + 0xd49d3127, + 0x9d4207f4, + 0x418bf5d3, + 0x44863027, + 0xb0273127, + 0xc1273f6b, + 0xfbc5f325, + 0x5cfcc558, + 0xc530fbc5, + 0xfbc560fb, + 0x64fbc574, + 0xc568fbc5, + 0x195e6cfb, + 0x210de0f5, + 0x00025080, + 0xe480220d, + 0xd480020d, + 0xc54127f4, + 0xfbc160f4, + 0xbbbfe634, + 0xacd3d100, + 0x27112701, + 0xc5f19520, + 0xf1c558f1, + 0x74f1c55c, + 0xdfff4ea7, + 0xc51027fd, + 0xf2c554f2, + 0x64f2c530, + 0xc568f2c5, + 0xf1256cf2, + 0x01e043d5, + 0x58f4cb5e, + 0x4cf4c121, + 0xf4c54123, + 0x2651f84c, + 0x5e6123f4, + 0xa0a7f421, + 0xa7f6e35e, + 0xf6ab5ea0, + 0x32e03100, + 0xd7d103e5, + 0x60270348, + 0x055ea027, + 0x72b1a9f6, + 0x8b07070d, + 0x4244be0f, + 0x74b1a900, + 0x07b0070d, + 0xbe0f8b09, + 0xab004236, + 0x5e0fabbf, + 0xe7eef51a, + 0x4707fcb0, + 0x4fab4253, + 0x27f4865e, + 0x5ef0b500, + 0x4c27f349, + 0x4ad4ad50, + 0xf1e75e01, + 0xad904c27, + 0x5e014ad4, + 0x3127f1dd, + 0x03f1185e, + 0xe3630373, + 0x5e63e373, + 0x0027f3d0, + 0x1027c127, + 0xf0c5fc95, + 0x58fcc554, + 0xc55cfcc5, + 0xfcc530f0, + 0x64f0c574, + 0xc568f0c5, + 0xf1256cf0, + 0x93f41f5e, + 0x024ce8f4, + 0x02e8d4d5, + 0x93f2705e, + 0x024c76f4, + 0x02e8d4d5, + 0xe0f2645e, + 0x00e5b44c, + 0x010e4de0, + 0xcb5e00d8, + 0xa8d4d1f2, + 0x004df802, + 0xa9037601, + 0xc101bed0, + 0x470778fe, + 0x0338f2c1, + 0x074433e1, + 0x03be0730, + 0xac037f1c, + 0x23425b7f, + 0xe33433e1, + 0xace37f1c, + 0xc5b1537f, + 0xd4d578fe, + 0xd3d50318, + 0x40270324, + 0xdfff3ea7, + 0xf034d5fd, + 0xa8d2d101, + 0x002df802, + 0x03f83b01, + 0x07c00777, + 0xe3c70397, + 0x07c7e397, + 0x230a0749, + 0x333c0748, + 0x33210703, + 0x9b382343, + 0x33309b41, + 0x332333a6, + 0xc0ded116, + 0x1cd2d501, + 0x2cd1d503, + 0x30d4d503, + 0x34dad503, + 0x38d3d503, + 0x28d0d503, + 0xd8772303, + 0xf0c130e2, + 0x38f1c178, + 0x015bb703, + 0x94330703, + 0x07e3c433, + 0x1d27b7e3, + 0x2da71000, + 0xf0c50fff, + 0x18d9d578, + 0x24dcd503, + 0xf7dc5e03, + 0xb85e3027, + 0x001d27f7, + 0xff2da710, + 0xf7cc5e0f, + 0xf4b54327, + 0x27f2005e, + 0x5ef3b532, + 0x4807f1f9, + 0x83334533, + 0x42f1482b, + 0xff000190, + 0x019841f1, + 0x3ea7ff00, + 0xd5fddfff, + 0x5e01b432, + 0xfec1f7f3, + 0x70efc674, + 0x01acd1d1, + 0x27f7e65e, + 0xf5165ea0, + 0x1b7cf0c1, + 0x27004c04, + 0xaff19304, + 0x0f9e006b, + 0x14070016, + 0x27f5385e, + 0xf5175e00, + 0x0c5e3027, + 0xc50027f5, + 0xbb5e60f0, + 0x0cbc27fd, + 0xf1c1fb95, + 0x8b420754, + 0x86302741, + 0x27312744, + 0x6b0127c0, + 0xc5f3253f, + 0xf0c558fc, + 0x30fcc55c, + 0xc560f0c5, + 0xf0c574fc, + 0x68fcc564, + 0x5e6cfcc5, + 0xa027f288, + 0x07f4805e, + 0x33453348, + 0xf1482b83, + 0x00019041, + 0xf76d5eff, + 0x0780f3c1, + 0x5e3a1b2a, + 0x0499f4c7, + 0x3b46c035, + 0x272f45c0, + 0xd4ad384c, + 0xd4d1014a, + 0x48d802a8, + 0xe03c271b, + 0x27efdf5e, + 0x5ef39532, + 0x1c27fcf3, + 0x95312710, + 0x60f3c5f1, + 0x27fc945e, + 0xc55ef03c, + 0x604c27ef, + 0x014ad4ad, + 0x4c27d11e, + 0x4ad4adb0, + 0x07c81e01, + 0x074b07a7, + 0x03a01336, + 0x03401301, + 0x033013e1, + 0x3ba03bc1, + 0x813c3b4e, + 0x61fc71fe, + 0xfb805ef0, + 0x0fe6f021, + 0xf1c100b0, + 0x50f2c14c, + 0xf1c51123, + 0xc1f1614c, + 0x127b4cf3, + 0x3103139b, + 0x994cf3c5, + 0x9707f4d3, + 0xf4c1933b, + 0x03f3714c, + 0x7be70771, + 0x50f8c132, + 0xf2814103, + 0x4153e153, + 0x23f5d099, + 0x07287b41, + 0x3b249bae, + 0x07349ba0, + 0xd0d8b9ce, + 0x2b912b02, + 0x23c22ba3, + 0xf4b35e71, + 0xf1c124e6, + 0xc11c3654, + 0x312754f1, + 0x01210d04, + 0x3c033027, + 0x9542070d, + 0x27418bf3, + 0x27448630, + 0x27402731, + 0x273f6bb1, + 0xc5f325c2, + 0xfbc558f4, + 0x30fbc55c, + 0xc560f4c5, + 0xf4c574f4, + 0x68fcc564, + 0x5e6cfbc5, + 0x0427f15c, + 0x69f1f193, + 0x148c9e00, + 0x954b2700, + 0xfe945ef4, + 0xc150f3c1, + 0xf4c16cf1, + 0x07130b4c, + 0x40f3c1e7, + 0xfbc17103, + 0x03070768, + 0x53015341, + 0x5cfcc141, + 0x342b3153, + 0x2007eb3b, + 0xc150f4c1, + 0xfa7150fb, + 0xf9612c3b, + 0x5b50fcc1, + 0x4cf8c124, + 0xf4c1ab7b, + 0x7bfb8140, + 0x68f1c191, + 0xbc7b482b, + 0xb39b949b, + 0xa39bec5b, + 0x0c5b213b, + 0x02d0d8b9, + 0xa20b9e0b, + 0x7123b00b, + 0x0734f3c1, + 0x7b937bcb, + 0x5ec37ba3, + 0xdbadf3e9, + 0x8b5e0350, + 0x52deadf2, + 0xf2605e03, + 0x335e0027, + 0x48d7d1f2, + 0x07a90703, + 0x53a15367, + 0xf21e5e61, + 0xc178f3c1, + 0x470738fb, + 0x01bed0a9, + 0x44333103, + 0xb3074b5b, + 0xf3c53123, + 0x33300778, + 0xd5b15334, + 0xd50318d4, + 0x5e0324d3, + 0xad27f50b, + 0xc25e01e0, + 0x3942d8f4, + 0x0200ad27, + 0xc1f4b85e, + 0xd0a978f4, + 0x410301be, + 0xc178f4c5, + 0x470738fb, + 0x4b5b4433, + 0xc178fcc1, + 0x300778fb, + 0x3433c123, + 0xfcc5b153, + 0x18d4d578, + 0x24d3d503, + 0xfc905e03, + 0x0180ad27, + 0x21f4805e, + 0xb9efe6fe, + 0xf4d19900, + 0x0750f2c1, + 0xc1f06136, + 0x313b48f8, + 0x027b6103, + 0xc6071307, + 0xd499f371, + 0x53089bf5, + 0xc58103c1, + 0xbc0748f8, + 0x327be807, + 0x8150f8c1, + 0x27b43bf2, + 0x7be153a1, + 0x27ab2b28, + 0x48fbc191, + 0x912b2e9b, + 0xc1133e9b, + 0x02d0d8b9, + 0x900bb123, + 0xc20ba30b, + 0xfbc56123, + 0xf2f35e48, + 0x2fe6f221, + 0xf8c100e1, + 0xf4d1994c, + 0x034cf3c1, + 0x4cf8c581, + 0x0807313b, + 0x13070153, + 0xd399fc61, + 0x074607f5, + 0x03b00726, + 0x3b212341, + 0x532c9bb3, + 0x71c12741, + 0x23fe81f3, + 0x27c02b41, + 0x4cf0c191, + 0x349ba127, + 0xab2b912b, + 0xd8b94e9b, + 0x012302d0, + 0xa32b922b, + 0xf0c5c42b, + 0xf2975e4c, + 0xc168fcc1, + 0xf0c140f3, + 0xc1e60750, + 0x3c3b6cf4, + 0xfc61ec3b, + 0x02d0d8b9, + 0x0b48fbc1, + 0x07610340, + 0x07c47b16, + 0x5cf4c193, + 0x985b1153, + 0x8103cb9b, + 0xb103a307, + 0x0748fbc5, + 0x3ba85b21, + 0xc1a43b24, + 0xfbc148f4, + 0xc1415340, + 0x205b50f3, + 0xf4c5e05b, + 0x68f0c18c, + 0x8123f471, + 0x203bb153, + 0x437b135b, + 0xf381b85b, + 0x2b50f0c1, + 0x8cf1c1b1, + 0x307ba22b, + 0x2b48f2c1, + 0x9b319b9e, + 0x0b212341, + 0x0ba40b9c, + 0xc56123b3, + 0x195e48f2, + 0x4cf2c1fe, + 0xc140f1c1, + 0x122b50f3, + 0xf2c52103, + 0xc1e2074c, + 0xf2c16cf4, + 0x53f06140, + 0x53430b21, + 0x07047be1, + 0x5cf4c132, + 0xf8c1b207, + 0x2b3e2b68, + 0xc1f961be, + 0xfa7134fe, + 0x183b343b, + 0x9e3b383b, + 0xf2c1ae3b, + 0x34f8c150, + 0xfe81f471, + 0x427b069b, + 0xe83b6103, + 0xf8c1f281, + 0x53c60750, + 0x9b287bc1, + 0xc14c9b2c, + 0x910b4cfc, + 0xbe0ba30b, + 0x02d0d8b9, + 0x902bc123, + 0xb22ba42b, + 0xfcc56123, + 0xfd9a5e4c, + 0x01f2d4a9, + 0x00001ea3, + 0x1f4cf810, + 0x1ea3f484, + 0x5e200000, + 0xf0c1f47c, + 0x6cf4c150, + 0x6164f2c1, + 0x68f1c1f9, + 0x120b400b, + 0xf4c1947b, + 0x64f1c548, + 0xf1c14103, + 0x64f3c148, + 0x9b48f4c5, + 0x03240797, + 0x5cf8c171, + 0xf4c1fa71, + 0x3bfb8168, + 0x07215313, + 0x0b315337, + 0x48fec148, + 0xb07ba07b, + 0xb39bc207, + 0xc43ba39b, + 0x02d0d8b9, + 0x910be123, + 0xb20bac0b, + 0xfec57123, + 0xfd225e48, + 0x0187d8b9, + 0x02901d27, + 0x80224d27, + 0xe6f2175e, + 0xb900ba3f, + 0x270187d8, + 0x2702001d, + 0x5e80024d, + 0xd4d1f204, + 0xd3d101a8, + 0xd2d101ac, + 0xd1d101b0, + 0xd0d101b4, + 0xded101b8, + 0x192b01bc, + 0xec2b0a2b, + 0x3a2b492b, + 0xd4d52c2b, + 0xd3d502f0, + 0xd2d502f4, + 0xd1d502f8, + 0xd0d502fc, + 0xded50300, + 0xd7ad0304, + 0xd6ad033e, + 0x755e0340, + 0xead4b9f1, + 0xb446e001, + 0xc6fb2100, + 0xd0a965bf, + 0xd3d10342, + 0xd2d101b4, + 0xd1d101b8, + 0xd7ad01bc, + 0xd6ad033e, + 0x71030340, + 0x1c2b6103, + 0xc607e707, + 0x392b4027, + 0xe1532a2b, + 0x0153c153, + 0x02f0d3d5, + 0x02f4d2d5, + 0x02f8d1d5, + 0x0304d4d5, + 0x0344dead, + 0x0346dcad, + 0x0342d0ad, + 0x02fcd4d5, + 0x0300d4d5, + 0xb9f1135e, + 0x270187d8, + 0x2701801d, + 0x5e80014d, + 0xd2d1f14c, + 0xd1a901bc, + 0xd4d10342, + 0xd3d101b4, + 0x2c2b01b8, + 0xfc210707, + 0x492be607, + 0x01533a2b, + 0x1153e153, + 0x02f0d4d5, + 0x02f4d3d5, + 0x02f8d2d5, + 0x033ed0ad, + 0x0340dead, + 0x0342d1ad, + 0x02fcdcd5, + 0x0300dcd5, + 0x0304dcd5, + 0x21f0bb5e, + 0xf84fe6f4, + 0x42d0a900, + 0xa8d3d103, + 0xacd2d101, + 0xb0d1d101, + 0xff4c5e01, + 0x4027a027, + 0xbc5e3027, + 0x49d9b9fa, + 0x71fe8102, + 0x27f061fc, + 0x27402730, + 0xf6305ea0, + 0x01c0d4d1, + 0x42fc3127, + 0xf1c1f4e1, + 0x33912360, + 0x10ab0e1c, + 0x19ab9733, + 0x61f4e75e, + 0x81fc71f0, + 0x49d9b9fe, + 0x13001302, + 0x27e013c0, + 0x27402730, + 0xf5fc5ea0, + 0xf271f161, + 0xdfff4ea7, + 0x811013fd, + 0x49d9b9f3, + 0xd5201302, + 0xd5010841, + 0x13010c42, + 0x1043d530, + 0xf1ee5e01, + 0xbe7e0c07, + 0x34f8c1e8, + 0x800b8a1b, + 0xce7e0c07, + 0x075007e8, + 0xe8ef7e0c, + 0x3134fcc1, + 0x2b5a0bfe, + 0x075e2b5c, + 0x31e01bec, + 0x30f2c1f0, + 0x0c07802b, + 0x071b1247, + 0x2027ce07, + 0x495ef545, + 0x074b07f5, + 0x13fb4136, + 0x3b301340, + 0x0b3b3b45, + 0x5e3a0b42, + 0xa207f57e, + 0xfc71f061, + 0xa013fe81, + 0xc0130013, + 0x7013e013, + 0x6013b013, + 0x2a071013, + 0xa9f5575e, + 0xd10342d1, + 0xd101a8d4, + 0xd101acd3, + 0x2101b0d2, + 0x070707f8, + 0x2b492be6, + 0x532c2b3a, + 0x53e15301, + 0xf0d4d511, + 0xf4d3d502, + 0xf8d2d502, + 0x3ed0ad02, + 0x40dead03, + 0x42d1ad03, + 0xfcd8d503, + 0x00d8d502, + 0x04d8d503, + 0xef765e03, + 0xb007fb4e, + 0xf0931427, + 0xbe006497, + 0x11000b8c, + 0xa4f093b1, + 0x81be0064, + 0xb121000b, + 0x64abf093, + 0x0b76be00, + 0x93b10100, + 0x0064b2f0, + 0x000b6bbe, + 0xf093b231, + 0x270064b9, + 0x0b5ebe10, + 0x03db0700, + 0x31c127d4, + 0x931c07d2, + 0x0064a4f0, + 0x49bec103, + 0xd403000b, + 0xec0fccc4, + 0xfb0e0b07, + 0x4ee7675e, + 0x260499fc, + 0x4cc0d107, + 0x34071aff, + 0x43333533, + 0x34f1342b, + 0xff00018c, + 0x00004ea3, + 0x8c34f504, + 0x07ff0001, + 0x334d072d, + 0x0b253347, + 0x0c2e2324, + 0x1c27fff7, + 0x01420712, + 0x07440303, + 0x233c01e1, + 0x034c0511, + 0x98440334, + 0xff3ea7fe, + 0x4d27fddf, + 0x34d50800, + 0x31d50208, + 0x4ea70208, + 0x11fd4fff, + 0x07001143, + 0x6823c542, + 0x27744c03, + 0x03020138, + 0x03420504, + 0xa7f3a844, + 0xfdefff3e, + 0xd8e434c1, + 0x0ffc6a4d, + 0x43272307, + 0x23c1f4e8, + 0x6a3ddce4, + 0x3ea7f5fc, + 0xc1fdefff, + 0x4dd8ec34, + 0x070ffc6a, + 0xe8432723, + 0xec23c1f4, + 0xfc6a3ddc, + 0xfd4227f5, + 0x0008e8d4, + 0xff2ea7ff, + 0x4127ffff, + 0x063824bd, + 0x270f2399, + 0x0ef49b40, + 0x33874127, + 0xb04034f5, + 0xfc8eff02, + 0x02b9fa4e, + 0x0ea90186, + 0x04a901f2, + 0xc20702d4, + 0xc483a007, + 0xe5530447, + 0x02bcabd1, + 0x01f4a3a9, + 0x4307c906, + 0x44474653, + 0x14c24223, + 0xa7302765, + 0xfddfff4e, + 0x020843d5, + 0x02eda0b9, + 0x4ea70e76, + 0xc5fddfff, + 0xfa8ee440, + 0xd553d307, + 0x42234d47, + 0xea7928d8, + 0x0700ab41, + 0x9b315330, + 0xa743073e, + 0xfde46f2e, + 0x24054b0b, + 0xde9b2e15, + 0x2c35bd0b, + 0xe44f4ea7, + 0x053b0bfd, + 0x274e1543, + 0xb94c3533, + 0xa702eda0, + 0xfddfff4e, + 0x020843d5, + 0x8eb00fc6, + 0x9821fcfa, + 0x07202700, + 0x9b2b0b40, + 0x6f3ea74e, + 0x420bfde4, + 0x3e153405, + 0x0e9b0103, + 0x31351027, + 0xe44f4ea7, + 0x05200bfd, + 0x274e1542, + 0xa7413533, + 0xfddfff4e, + 0x020843d5, + 0x07ff6f5e, + 0x0b2e9b20, + 0x3941c22b, + 0xe46f4ea7, + 0x154205fd, + 0x9b01034e, + 0x3520270e, + 0xa70b0b42, + 0xfde44f4e, + 0x4e154005, + 0x42353327, + 0xdfff4ea7, + 0x0843d5fd, + 0xff3a5e02, + 0xdfff4ea7, + 0x084cd5fd, + 0xff2e5e02, + 0xff1f41ee, + 0xe46f3ea7, + 0x153205fd, + 0x3540273e, + 0xa7212734, + 0xfddfff4e, + 0x020842d5, + 0x07ff0f5e, + 0x9b255323, + 0xff655e2e, + 0xcf5bf04e, + 0xfe2bdf3b, + 0x0f07fc4e, + 0xffe54dbe, + 0xf00efc0e, + 0xf04eff0b, + 0xdf3bcf5b, + 0xfc4efe2b, + 0x75be0f07, + 0xff1efffd, + 0x181e2103, + 0x14190319, + 0x11030103, + 0x230d34ce, + 0x19112301, + 0x2b141900, + 0x30fe0b04, + 0x0b0027f2, + 0x07fe4efe, + 0x0740ab41, + 0x0f43d830, + 0x1e01151e, + 0x3e052423, + 0x34031403, + 0x4207071e, + 0x41034253, + 0x2586f458, + 0x11031419, + 0x3103341d, + 0xfe8ef2a8, + 0xe007fd4e, + 0xd02903dc, + 0x31072624, + 0x43073f6b, + 0x43ab4833, + 0xe4073207, + 0x32533423, + 0xab10ec33, + 0x073103e4, + 0x234e0540, + 0xb8440324, + 0x03e407f3, + 0x1e402721, + 0x07311d03, + 0x03340b3e, + 0x8ef2a841, + 0x000000fd, + 0x04110321, + 0x04014342, + 0x411d430b, + 0x41030421, + 0xfe0b0425, + 0x00000030, + 0xf2e3f54e, + 0x5f079307, + 0xb0273f07, + 0x3a037027, + 0x82074027, + 0x5c036027, + 0x95fb850c, + 0x05f3a5f7, + 0x25f115f0, + 0x01c85ef4, + 0x1c40b7b6, + 0x3e0f0725, + 0x01ba5eb8, + 0x40276807, + 0x61237027, + 0xf485b127, + 0xa95ef795, + 0x301c2301, + 0x4f6b4107, + 0xd4301c03, + 0x7536184a, + 0x27301c24, + 0x47f38531, + 0x0b733347, + 0x301c2374, + 0x855e710b, + 0x6c1ce001, + 0x1cd40180, + 0x1ce0206d, + 0x54010663, + 0x1ce0641c, + 0xe4015a25, + 0x01632d1c, + 0x1cc0261e, + 0x1ce42964, + 0x1e015869, + 0x731ce022, + 0x1c3400f6, + 0x701ce474, + 0x131e0149, + 0x0f751cc0, + 0x3e781ce4, + 0x27081e01, + 0x5ef49541, + 0x9001013c, + 0xc4641c00, + 0xcc0a691c, + 0x00130b00, + 0x071eb127, + 0x2b751cc4, + 0xd007b027, + 0x0d07a027, + 0x6cbe1a27, + 0x00f90035, + 0x00017468, + 0x4a0b4507, + 0x1a27401d, + 0x5ebe0d07, + 0xd0070035, + 0x07e6a103, + 0xa027dd1e, + 0x4c834007, + 0xf935070f, + 0x01747444, + 0x1d3a0b00, + 0x03045334, + 0x270176a1, + 0x91c707b0, + 0x2bca2bf3, + 0x813a76cb, + 0x6647a6f4, + 0x270f07b7, + 0xc57e2d1c, + 0x1eb027fe, + 0x96f3810e, + 0x071d0734, + 0xfeb67e0f, + 0xdc27041e, + 0x07c12320, + 0xbdf3534c, + 0x014103fe, + 0xe241cc31, + 0x0f07b546, + 0x7e2d1c27, + 0xda07fe98, + 0xd50bd123, + 0xd139061e, + 0xa1fe8b7e, + 0x07d123f4, + 0xf3d4ce0f, + 0x061edc07, + 0x23fe7b7e, + 0x270f07d1, + 0xd1cc201c, + 0x01591ef4, + 0x03c90791, + 0x7e0f07c4, + 0x9c07fe64, + 0x9d01611e, + 0xb02774d6, + 0x0d070b1e, + 0x000089be, + 0xb02bb707, + 0x34e6f391, + 0x457e171e, + 0x07b123fe, + 0x0741034b, + 0x201c270f, + 0x1ef041cc, + 0xfe327e04, + 0x0f07d419, + 0xd1031407, + 0xdb0742b6, + 0x217e061e, + 0x07d123fe, + 0x201c270f, + 0x03f4d1cc, + 0x07141e94, + 0xfe0e7e0f, + 0x61190d1e, + 0x057e6103, + 0xc20f07fe, + 0xb027f568, + 0x81198103, + 0xfe361ff6, + 0x10270f07, + 0x21fdef7e, + 0x23f2c3f0, + 0xa3f58e01, + 0x15f305f0, + 0x63fe4ef4, + 0x033f07f0, + 0x7ef30538, + 0xf043fdec, + 0xf083fe0e, + 0x3007fe0b, + 0x01030419, + 0x032b4396, + 0xfb4efe0b, + 0xeea7f063, + 0x05fd4fff, + 0x07c007f2, + 0x01b307d1, + 0x123f9be4, + 0x44334103, + 0xab38e2c1, + 0x1023ce34, + 0xffe30ea7, + 0x0ab8beff, + 0xe8101e00, + 0xa7061ef3, + 0xffffe32e, + 0x36272401, + 0xf1294276, + 0x1303d409, + 0x12732407, + 0x03fc4d10, + 0x0107ff1e, + 0xc4090103, + 0x322b3407, + 0x03fc4d10, + 0x310cff1e, + 0x03fc3d03, + 0x87ec30da, + 0x104c0342, + 0x4d0bf301, + 0x21034305, + 0x03fc2d04, + 0x01072027, + 0x01033b07, + 0x3401111e, + 0x14052103, + 0x2d103403, + 0x2d2303fc, + 0x128703fc, + 0x0b101c03, + 0x0df0301d, + 0xe30ea7d2, + 0x0401ffff, + 0x18be44c6, + 0x4027000a, + 0x270ef49b, + 0xff4ea731, + 0xf043fd4f, + 0xfb8e43a5, + 0xf005f063, + 0x20073107, + 0xe0001f27, + 0x0f271007, + 0x1007d000, + 0x2f5ef043, + 0x05f063ff, + 0x073107f0, + 0x001f2720, + 0x271007c0, + 0x07b0000f, + 0x5ef04310, + 0x0409ff16, + 0xf40df063, + 0x30070449, + 0xf201f42d, + 0x0f273803, + 0x10079000, + 0xa0001f27, + 0xf0431007, + 0x4efef55e, + 0x07a007fa, + 0xbeb10701, + 0x07fffede, + 0x29fc9330, + 0x35030342, + 0x0c072307, + 0x07da4d27, + 0x24231b07, + 0x050c0c03, + 0x15ca25c4, + 0xfc13bec3, + 0x3e0c07ff, + 0x4eff1eae, + 0x81f493f7, + 0x4389042d, + 0x0a428908, + 0x322b8007, + 0x300c7107, + 0x03fc3d03, + 0x002734d6, + 0x4287f78e, + 0xd0124ce9, + 0x93071007, + 0xac07c303, + 0x9123b207, + 0xb103a273, + 0x4de9c323, + 0x1007d010, + 0x270ca9d2, + 0x41f19308, + 0x843e005e, + 0x8c2da907, + 0x84298d0d, + 0x0bb9dd24, + 0x89484ce4, + 0x24141e00, + 0xc40bbadd, + 0x1e7e284c, + 0xbbdd000a, + 0xbcddc40b, + 0x8329730b, + 0x370b2707, + 0x2ce33123, + 0x7f3ce37f, + 0x2c032419, + 0xf923c280, + 0x2a07a7c6, + 0xbd103707, + 0xbd2303fc, + 0x4b8703fc, + 0xd01044f1, + 0xb1031007, + 0x34033405, + 0xbd10f238, + 0xbd2303fc, + 0xf39303fc, + 0x8d042cd8, + 0x3f270a3b, + 0x1007e000, + 0x80093b2d, + 0x0bb90dc4, + 0x2774410e, + 0x0e4ee301, + 0x744501fc, + 0x0d40f78e, + 0x06270bbc, + 0x5dc5f193, + 0xfef17e00, + 0xf78e0127, + 0xf1930627, + 0x7e005df6, + 0x831efee3, + 0x14290329, + 0x03fc3d10, + 0x4d10ff1e, + 0xff1e03fc, + 0x042b0307, + 0x0d03000c, + 0xfe0b03fc, + 0x90004f27, + 0x44291007, + 0x34070f6b, + 0x03fc4d10, + 0x03fc3d23, + 0xb0004f27, + 0x44291007, + 0x2c5ef293, + 0x07230d04, + 0xfc4d1034, + 0xfc3d2303, + 0x004f2703, + 0x291007d0, + 0x10234d44, + 0x2303fc4d, + 0x8d03fc4d, + 0x0ba60824, + 0xa0004f27, + 0x44291007, + 0x4d103407, + 0x3d2303fc, + 0x4f2703fc, + 0x1007c000, + 0x232d4429, + 0x4d103407, + 0x3d2303fc, + 0x4f2703fc, + 0x1007e000, + 0x236d4429, + 0x03fc4d10, + 0x03fc4d23, + 0x0b0a248d, + 0x93f84efe, + 0x042bf7f4, + 0x42294309, + 0x322b9007, + 0x3d03300c, + 0x34d603fc, + 0xf88e0027, + 0x4de94287, + 0x10079012, + 0xd303a307, + 0xc207bd07, + 0xb273a123, + 0xd323c103, + 0x901048e9, + 0xbad21007, + 0x9308270d, + 0x005cbbf1, + 0x07fdfe7e, + 0x159805ba, + 0xc5dc509d, + 0xf1930827, + 0x7e005d2f, + 0xb806fdeb, + 0x08030907, + 0xcd103b07, + 0xcd2303fc, + 0x4c8703fc, + 0x901044f1, + 0xc1031007, + 0x04030405, + 0xcd10f338, + 0xcd2303fc, + 0xf39303fc, + 0x2d042b78, + 0x003f273c, + 0x271007a0, + 0x8e3c2d01, + 0x93f74ef8, + 0x042b63f4, + 0x42694349, + 0x322b9007, + 0x300c7107, + 0x03fc3d03, + 0x002734d6, + 0x4287f78e, + 0xb0124ce9, + 0xa3071007, + 0x8c07c303, + 0xa123b207, + 0xb1038273, + 0x4de9c323, + 0x1007b010, + 0x270d8ad2, + 0x25f19308, + 0x687e005c, + 0x2d8a07fd, + 0x299d0d9c, + 0xb9dd2494, + 0x484cc40b, + 0x24141e74, + 0xc40bbadd, + 0x1e6a284c, + 0xbbdd000a, + 0xbcddc40b, + 0x94295f0b, + 0x27f94c50, + 0x93f19308, + 0x347e005c, + 0x079029fd, + 0x23070b37, + 0x7f3ce301, + 0x197f0ce3, + 0x803c0334, + 0xc6f930c2, + 0x07170787, + 0xfcbd1038, + 0xfcbd2303, + 0xf14b8703, + 0x07b01044, + 0x05b10310, + 0x38140314, + 0xfcbd10f3, + 0xfcbd2303, + 0xadf39303, + 0x3b6d042a, + 0xc0003f27, + 0x01271007, + 0xf78e3b2d, + 0xf1930627, + 0x7e005c54, + 0x971efcdb, + 0x4fff2ea7, + 0x9b2401fd, + 0x4103123f, + 0x22c14433, + 0x2734ab38, + 0x27320e00, + 0xe3fe0b01, + 0x15f205f0, + 0x4ef425f3, + 0xff3ea7fa, + 0x34a9ffff, + 0xf0630d6c, + 0xa107d007, + 0x00ad4fe6, + 0x00a940fa, + 0x0d6834d1, + 0x00a14fe6, + 0x07e6bb3e, + 0xa7122f9b, + 0xfd4fff4e, + 0x1ea74301, + 0x33ffffe7, + 0xd6140134, + 0xab38a343, + 0x1e130532, + 0xe70ea70a, + 0x3fbeffff, + 0xcf270006, + 0x10100000, + 0xa744cbc1, + 0xffffff4e, + 0x0d6840d1, + 0x4fff4ea7, + 0x074401fd, + 0x0b37333b, + 0x304c0303, + 0x4f9b041d, + 0x34ddf912, + 0x03000176, + 0x043d304c, + 0x4c273f07, + 0x7d0d5d20, + 0x183c0304, + 0x2a070403, + 0x057b1c27, + 0xf8eabef3, + 0xa6d007ff, + 0x48c4c107, + 0x41033b07, + 0xc148c4c5, + 0x310348c4, + 0x0fff3d10, + 0xc3c53027, + 0x44c4c144, + 0xffe70ea7, + 0x05a9beff, + 0x27031e00, + 0x430d07d0, + 0xc3fa0ef0, + 0x4efe0bf0, + 0x073401fa, + 0x07b107c3, + 0xff4fc4a2, + 0x27ffffff, + 0x2d271007, + 0x02270601, + 0x01a43d27, + 0xfefa45be, + 0x00ccd007, + 0x060d2710, + 0xfa38be01, + 0xedf493fe, + 0x40050344, + 0xc101cd05, + 0xffff1fc0, + 0x071dffff, + 0x273a072b, + 0xfa1cbe05, + 0x1000ccfe, + 0x01060d27, + 0xfefa11be, + 0x44c6f493, + 0x8e400503, + 0xbefe4efa, + 0x270007b6, + 0x07f0002f, + 0xe33d2710, + 0x07051e04, + 0x01f4e843, + 0xf842c424, + 0xbd9efe0e, + 0xfb4e0007, + 0xfb9bb027, + 0x00cf270e, + 0x271007f0, + 0x27c30531, + 0x0ef49b40, + 0x4fff4ea7, + 0x3e43a5fd, + 0x05c031c1, + 0x4efb8ecb, + 0x9bc027fb, + 0xbf270efc, + 0x1007f000, + 0xb3053127, + 0xf49b4027, + 0xff4ea70e, + 0x43a5fd4f, + 0xbc059c3e, + 0xfe4efb8e, + 0xffe70ea7, + 0x04c3beff, + 0x27302700, + 0x07f0004f, + 0x8e430510, + 0x7efe4efe, + 0x07e6fe30, + 0xa7122f9b, + 0xfd4fff4e, + 0x1ea74301, + 0x33ffffe7, + 0xd6140134, + 0xab38a343, + 0x8e130532, + 0xe70ea7fe, + 0xfe0effff, + 0x0004b19e, + 0xf105f123, + 0xf325f215, + 0xfb4ef435, + 0x7fff4ea7, + 0x634491d0, + 0xf8b007f0, + 0x008b104c, + 0xe57efdab, + 0x9b07e6fd, + 0x4ea7122f, + 0x01fd4fff, + 0xe71ea743, + 0x3433ffff, + 0x43d61401, + 0x32ab38a3, + 0x0a1e1305, + 0xffe70ea7, + 0x0468beff, + 0xff4ea700, + 0x4401fd4f, + 0xf000cf27, + 0x4c031007, + 0x203c2730, + 0x9d0cc49d, + 0x4f9b0dc3, + 0x0fc39d12, + 0x07304c03, + 0x143c033f, + 0x1d272b07, + 0xc49d03f0, + 0x100f270e, + 0x051007f0, + 0xf722bef3, + 0x154127ff, + 0x0c0f27c4, + 0xbe1007f0, + 0x03fff932, + 0x7ec02501, + 0x0ea7feff, + 0xbeffffe7, + 0xeb0003eb, + 0x0ef043fd, + 0x0bf103fb, + 0x27f84efe, + 0x1000004f, + 0xc14a0110, + 0x49c14048, + 0x484cc144, + 0xdc07ca2a, + 0xdc07051e, + 0xbea7d123, + 0xd1ffffff, + 0x2b0d68b4, + 0x934556da, + 0x0059a0f0, + 0xd1ff237e, + 0x930d68b1, + 0x0059baf0, + 0xc4ff177e, + 0x2233568f, + 0x9dd45711, + 0x26520fff, + 0x072907de, + 0x9318073c, + 0x0059c0f0, + 0x9b074a07, + 0x07fef77e, + 0x1eca07bd, + 0x2cd1be1f, + 0x6894d100, + 0x3320070d, + 0x19240b27, + 0x07458624, + 0xccf0931c, + 0xd57e0059, + 0x23c103fe, + 0x270c07b1, + 0xc40fff1d, + 0xffffffbf, + 0xda0bd4ff, + 0x00004f27, + 0x4d051010, + 0x4ea7f88e, + 0xd1ffffff, + 0xc60d6844, + 0x004f2747, + 0x01101000, + 0x01440341, + 0x01440342, + 0x01440343, + 0x92f09344, + 0x915e0059, + 0x4efe0bfe, + 0x634207f5, + 0x074013f5, + 0x076107a2, + 0x07524780, + 0xc5702791, + 0x351e50f4, + 0xd103b309, + 0xfff816be, + 0xb203c00b, + 0x1c270c07, + 0x8cf29350, + 0xad0e0059, + 0x27e6d9ce, + 0x07c41d40, + 0x82f09317, + 0x2f070059, + 0xc1fe4b7e, + 0x7a0b50f4, + 0x850b940b, + 0x070967c2, + 0x07d027b8, + 0x43ce1ecf, + 0x4ef58ef5, + 0x236207f5, + 0x077107f5, + 0x13500792, + 0x27a10760, + 0x19301e80, + 0xbed103b3, + 0x0bfff7bf, + 0x07b103c0, + 0x501c270c, + 0x5943f293, + 0xce9d0e00, + 0x4027e6da, + 0xc41d1807, + 0x592bf093, + 0x7e2f0700, + 0x890bfdf4, + 0x78c2a60b, + 0x0bb8070b, + 0x07d027b5, + 0x03d11ecf, + 0x4ef58ef5, + 0x07b007f9, + 0x07a207d1, + 0x7efcab93, + 0x07e6fbd4, + 0xa7122f9b, + 0xfd4fff4e, + 0x1ea74301, + 0x33ffffe7, + 0xd6140134, + 0xab38a343, + 0x1e130532, + 0xe70ea70a, + 0x57beffff, + 0x4f270002, + 0x1007f000, + 0x43153227, + 0x4d453a03, + 0x4a9d4325, + 0x15499d14, + 0xff7e4b35, + 0xa7d007fc, + 0xffffe70e, + 0x00020ebe, + 0xd5c6fceb, + 0x0d272b07, + 0x1d070202, + 0xfef6c9be, + 0xf98e0d07, + 0xc007fb4e, + 0xfdabb107, + 0xe6fb677e, + 0x122f9b07, + 0x4fff4ea7, + 0xa74301fd, + 0xffffe71e, + 0x14013433, + 0x38a343d6, + 0x130532ab, + 0x0ea70a1e, + 0xbeffffe7, + 0x270001ea, + 0x07f0003f, + 0x15432710, + 0x35482734, + 0x4534253c, + 0xfc987e3b, + 0x0ea7c007, + 0xbeffffe7, + 0xeb0001a7, + 0x8e0c07fd, + 0x07fc4efb, + 0xab0d66d0, + 0xfb0e7efc, + 0x2f9b07e6, + 0xff4ea712, + 0x4301fd4f, + 0xffe71ea7, + 0x013433ff, + 0xa343d614, + 0x0532ab38, + 0xa70a1e13, + 0xffffe70e, + 0x000191be, + 0xf0004f27, + 0x34271007, + 0x43254315, + 0x687e4d35, + 0xe70ea7fc, + 0x54beffff, + 0xfceb0001, + 0xfc4efc8e, + 0xd107f123, + 0xf193c007, + 0x07005802, + 0x102c270f, + 0xfff3c8be, + 0xfd93d4f6, + 0x070068c3, + 0xf664be0d, + 0x01f393ff, + 0x2007033b, + 0x07da4d27, + 0x0c03e307, + 0x15340514, + 0x033c2530, + 0x0cec0321, + 0x43273f07, + 0x34033101, + 0xe403e105, + 0x3459f4a8, + 0x1d073309, + 0x3aedf093, + 0x0de45d03, + 0xf37fbee3, + 0xc5f093ff, + 0x17be033a, + 0xff1efff7, + 0x4ea7fc4e, + 0xb9ffffff, + 0x070d4444, + 0xe6c107d0, + 0x9ff09345, + 0x1d070057, + 0x3dbe2c07, + 0x0d07fffc, + 0xc9be1c07, + 0x0596fffe, + 0xf1930227, + 0x5e0057a6, + 0xfc8eff66, + 0x8ea7f84e, + 0xb9ffffff, + 0x070d4484, + 0x07b10790, + 0x66d307a2, + 0x96f09346, + 0x19070057, + 0x3a072b07, + 0x01be4d07, + 0xcd07fffc, + 0xc227d214, + 0x1b070907, + 0x3c072a07, + 0xfffe12be, + 0x0d4484b9, + 0x45a6d007, + 0x579ef093, + 0xbe1d0700, + 0x76fffbdc, + 0x930227d5, + 0x0057a6f1, + 0x4127121e, + 0x41234c3b, + 0x45864d8b, + 0xf1930127, + 0x5e0057a1, + 0xa796fefa, + 0x0000df50, + 0x4d072000, + 0x4fd04b0b, + 0x70000001, + 0x93012723, + 0x0057a9f1, + 0xdf50e21e, + 0x70000000, + 0x4b0b4d07, + 0x00014f50, + 0x0127f000, + 0x57bff193, + 0x07c91e00, + 0x27f88e0d, + 0x595e0c3c, + 0x054027ff, + 0x27fe0b04, + 0x0ef49b40, + 0xfe0b0405, + 0x3f9b0201, + 0xff4ea712, + 0x4401fd4f, + 0x44330027, + 0x43ab48a3, + 0x0127420e, + 0xfa4efe0b, + 0x3f9bc007, + 0xff4ea712, + 0x4d01fd4f, + 0xd433a407, + 0xd3abd8a3, + 0xf4e8031e, + 0x4627cb01, + 0x37beb356, + 0xc401002a, + 0x44963027, + 0xf39bcd05, + 0x38abc50e, + 0xd4cec401, + 0x27fa8ee4, + 0xff4ea730, + 0x43d5feff, + 0xfe0b0138, + 0x07124f9b, + 0x33348724, + 0xf1232b25, + 0x01001421, + 0x103f9bff, + 0x310b4103, + 0x45331487, + 0x001423f5, + 0x412bff01, + 0x4fff3ea7, + 0xf13311fd, + 0x01000044, + 0x2b1207ff, + 0x2023f534, + 0x23ff0100, + 0xfefff41e, + 0xff682e23, + 0x014727fe, + 0x05140313, + 0xa8240323, + 0xa7fe0bf4, + 0xfd4fff4e, + 0xffff3ea7, + 0x914181fe, + 0x2832d144, + 0x3030d101, + 0x33133301, + 0x1b211b43, + 0x3034d504, + 0x2432d501, + 0x2831d501, + 0x2c30d501, + 0x0bfe0b01, + 0x93fe0bfe, + 0x033b63f4, + 0xfe0b4075, + 0x45334007, + 0x402b0087, + 0x000c41f5, + 0x41f5ff01, + 0x00045aa8, + 0x4007fe0b, + 0x00874533, + 0x41f5402b, + 0xff010010, + 0x5aac41f5, + 0xfe0b0004, + 0x05334087, + 0x0e23042b, + 0x0bfeff68, + 0x27fc4efe, + 0x2c078ccc, + 0xfff31ea7, + 0xedf093fe, + 0x4abe0339, + 0x2c07fff1, + 0xff671ea7, + 0x69f093fe, + 0x3abe033a, + 0xf093fff1, + 0xa7033aec, + 0xfefedb1e, + 0x0e102c27, + 0xf1279efc, + 0x93fe4eff, + 0x0339bbf4, + 0x4ff64419, + 0xf49300a2, + 0x070339b4, + 0x8b2c0324, + 0x2ce33407, + 0x7f3ce37f, + 0x3c033419, + 0xf932c280, + 0x399af393, + 0x27202703, + 0x3205234c, + 0xf4c83403, + 0x3a16f493, + 0x03240703, + 0x34078b2c, + 0xe37f2ce3, + 0x34197f3c, + 0xc2803c03, + 0x3c27f932, + 0xf9f29323, + 0x10270339, + 0x21054307, + 0x24033123, + 0xf493f4b8, + 0x35033a74, + 0x15430543, + 0x27432543, + 0x75f39320, + 0x4a27033a, + 0x34033205, + 0x3027f4c8, + 0x40272527, + 0x5b3834f5, + 0x34f50004, + 0x00045aa8, + 0x5aac34f5, + 0x34f50004, + 0x00045b34, + 0x001c3c03, + 0x933127f2, + 0x033917f4, + 0xf193431d, + 0x270339a0, + 0x0ea78c2c, + 0xbefeff67, + 0x93fff069, + 0x033903f1, + 0xa78c2c27, + 0xfefff30e, + 0xfff058be, + 0x3a0af193, + 0x102c2703, + 0xfedb0ea7, + 0xf047befe, + 0x5efe0eff, + 0x4ea7fe6f, + 0x11fd4fff, + 0xff4ea743, + 0x43d5feff, + 0xfe0b0134, + 0xffff3ea7, + 0xff4ea7fe, + 0x4111fd4f, + 0x013834d1, + 0x013432d1, + 0x422b410b, + 0x013834d5, + 0x4f9bfe0b, + 0x33340712, + 0x2b448735, + 0xff4ea734, + 0x4211fd4f, + 0x002434f1, + 0x422bff01, + 0x002434f5, + 0xfe0bff01, + 0x07124f9b, + 0x87253324, + 0xa7242b44, + 0xfd4fff4e, + 0x23f14411, + 0xff010024, + 0x24f5430b, + 0xff010024, + 0xf293fe0b, + 0xa7033990, + 0xfeff673e, + 0x31014727, + 0x21053403, + 0xf4a82403, + 0xffff4ea7, + 0x3844d1fe, + 0x71f39301, + 0x34950339, + 0x32014a27, + 0x02053403, + 0xf4a80403, + 0x3ea7fe0b, + 0x9dffffff, + 0x41270d30, + 0x063a34bd, + 0x270f3399, + 0x0ef49b40, + 0x33874127, + 0xb04034f5, + 0xff1eff02, + 0xc007fc4e, + 0x00275dbe, + 0x4fff1ea7, + 0x01c319fd, + 0x3b412712, + 0x1d34eb42, + 0x9b4027c3, + 0x14c50ef4, + 0x4efc8e38, + 0x07c007fb, + 0x270ebeb1, + 0x27c21900, + 0x1d2bab40, + 0xe6c43dc2, + 0x9b402705, + 0x3ea70ef4, + 0xc5fd4fff, + 0x40273834, + 0xa70ef49b, + 0xffffff4e, + 0xa70e4399, + 0xfd4fbf1e, + 0x3138328b, + 0x14054127, + 0x14033153, + 0xfb8e32d6, + 0xdf9bfd4e, + 0xf14d8712, + 0x0178104e, + 0xf843f100, + 0x2700045b, + 0x2e07801c, + 0x230b132b, + 0x01030419, + 0x2103241d, + 0xf1984486, + 0x21232e2b, + 0x3d874207, + 0x34f54f6b, + 0x00045bf8, + 0xf123fd8e, + 0xf215f105, + 0xf435f325, + 0xf063fe4e, + 0x10072f07, + 0x0d272803, + 0xf2050107, + 0xfef0f5be, + 0xfe0ef043, + 0xfe0bf103, + 0x87124f9b, + 0x03240744, + 0x045bf82f, + 0x1041f100, + 0x01000178, + 0x0b302724, + 0x27431d41, + 0xaaf09340, + 0x24050052, + 0xfff76f9e, + 0xf0a3f54e, + 0x9107f005, + 0xa407f315, + 0x87124f9b, + 0x03340744, + 0x045bf83f, + 0x1045f100, + 0x01000178, + 0x07728736, + 0x01231e83, + 0xbec103b3, + 0x0bfff0e7, + 0x11b403d0, + 0x0b0507f4, + 0x0c1c270d, + 0xc4cef201, + 0x0b8d05e7, + 0x23923e97, + 0x07a546a1, + 0x27d607b9, + 0x83e11ec0, + 0x9bf58ef0, + 0x4487124f, + 0x70804f03, + 0x43010003, + 0x03350145, + 0xfe0b4005, + 0xf063fa4e, + 0x87121f9b, + 0x804df141, + 0x93000370, + 0x005352f0, + 0xfff6ebbe, + 0xdb012e1e, + 0x1b07da11, + 0xc6be0a07, + 0xdc410024, + 0x4007de21, + 0x2b071c07, + 0xf0933a07, + 0x05005379, + 0xf6c6befe, + 0x254027ff, + 0x15d405d4, + 0x31dd31d4, + 0xcf4fd6d4, + 0xfa8ef043, + 0xe107fc4e, + 0xcf9b4307, + 0xd9f39312, + 0xcdf90053, + 0xff010d44, + 0x011721c8, + 0x2b100732, + 0x033e072d, + 0x5af093d1, + 0xcf7e0053, + 0x1edf6bfe, + 0x23320115, + 0x07df6bd1, + 0x072d2b10, + 0x53f0933e, + 0xb77e0053, + 0x44cdfdfe, + 0x8eff010d, + 0x07fc4efc, + 0x9b4307e1, + 0xf39312cf, + 0xf9005390, + 0x010d44cd, + 0x1821c8ff, + 0x10073201, + 0x3e072d2b, + 0xf093d103, + 0xbe005330, + 0x6bfff640, + 0x01161edf, + 0x6bd12332, + 0x2b1007df, + 0x933e072d, + 0x005309f0, + 0xfff627be, + 0x0d44cdfd, + 0xfc8eff01, + 0xf205f0e3, + 0xf425f315, + 0xf063fa4e, + 0x2107a007, + 0x8712cf9b, + 0x104bf14c, + 0x07000178, + 0x183c033f, + 0x077f1c27, + 0xbef3050b, + 0x93ffed98, + 0x005323f4, + 0x0d44c3f9, + 0x4201ff01, + 0x232b1a07, + 0x52d4f093, + 0x7e3b0700, + 0xf043fe1e, + 0xf0c3fa0e, + 0xf0e3fe0b, + 0xf315f205, + 0xfa4ef425, + 0xa007f063, + 0xcf9b2107, + 0xf14c8712, + 0x0178104b, + 0x033f0700, + 0x1c27183c, + 0x050b077f, + 0xed4abef3, + 0xd5f493ff, + 0xc3f90052, + 0xff010d44, + 0x1a074201, + 0xf093232b, + 0x07005286, + 0xf58abe3b, + 0x0ef043ff, + 0x0bf0c3fa, + 0x124f9bfe, + 0x24074487, + 0x5bf82f03, + 0x41f10004, + 0x00017810, + 0x30272401, + 0x431d410b, + 0xf0934027, + 0x05005095, + 0xfda05e24, + 0x27124f9b, + 0xf5448730, + 0x045bf843, + 0x23fe0b00, + 0x15f105f1, + 0x35f325f2, + 0x63fa4ef4, + 0x9b2007f0, + 0x4487124f, + 0x4af1b407, + 0x00017810, + 0x5bf8bf03, + 0xbc010004, + 0x3f070a07, + 0x2b7f1c27, + 0x183c031c, + 0xf3050c0b, + 0xffecb7be, + 0xf043c00b, + 0xbc050a07, + 0xf103fa0e, + 0x1007fe0b, + 0x51fbf093, + 0x07b11e00, + 0xf9f09310, + 0xa81e0051, + 0x87124f9b, + 0x03240744, + 0x045bf82f, + 0xf1230100, + 0x01781044, + 0x1d430b00, + 0x03240140, + 0x0b240541, + 0x07fc4efe, + 0x122f9b30, + 0x51faf493, + 0x87410100, + 0x4424f9c2, + 0xf1ff010d, + 0x017810c0, + 0x93411b00, + 0x0051a7f2, + 0xbe7f1c27, + 0xf5ffee4f, + 0x045bf8c0, + 0x4efc8e00, + 0x073007fa, + 0x122f9ba1, + 0x51c6f493, + 0x87410100, + 0x4424f9c2, + 0xf1ff010d, + 0x017810c0, + 0x93411b00, + 0x005173f2, + 0xbe7f1c27, + 0x07ffee1b, + 0xf8cf03b0, + 0x0700045b, + 0x7ecb050a, + 0xcd7efc70, + 0x8ecb05fc, + 0x124f9bfa, + 0x24074487, + 0x5bf82f03, + 0x23010004, + 0x781044f1, + 0x430b0001, + 0x1d203c27, + 0x03240143, + 0x0b240541, + 0x07fd4efe, + 0x9b3107d0, + 0x4487124f, + 0x5bf842f1, + 0x04070004, + 0xe407322b, + 0x0f033103, + 0x00017810, + 0x15d6120a, + 0x091e3127, + 0x420b0401, + 0x21034d1d, + 0xe2f5f3a8, + 0x00045bf8, + 0xf84efd8e, + 0xd107b007, + 0x4f9b8207, + 0x07448712, + 0x03a40794, + 0x0178109f, + 0xf8af0300, + 0x1e00045b, + 0x19ac0117, + 0x079401b3, + 0x0b3f4b0c, + 0xed79be04, + 0x05c00bff, + 0x23b103ac, + 0x071727d1, + 0xffdfc428, + 0xdeffffff, + 0xf84ef88e, + 0xd107b007, + 0x4f9b8207, + 0x07448712, + 0x03a40794, + 0x0178109f, + 0xf8af0300, + 0x1e00045b, + 0x01ac0115, + 0x07b31994, + 0xbe040b0c, + 0x0bffed37, + 0x03ac05c0, + 0x27d123b1, + 0xc4280717, + 0xffffffdf, + 0xf88ee0ff, + 0xb007f94e, + 0x4f9bd107, + 0x07448712, + 0x03a40794, + 0x0178109f, + 0xf8af0300, + 0x1e00045b, + 0x09ac0117, + 0x079401b3, + 0x0b3f8b0c, + 0xecf5be04, + 0x05c00bff, + 0x23b203ac, + 0x931627d1, + 0x005046f2, + 0xffffdfc4, + 0x8edbffff, + 0x07f94ef9, + 0x9bd107b0, + 0x4487124f, + 0xa4079407, + 0x78109f03, + 0xaf030001, + 0x00045bf8, + 0xac01151e, + 0xb3099401, + 0x040b0c07, + 0xffecb2be, + 0xac05c00b, + 0xd123b203, + 0xf2931527, + 0xc4005008, + 0xffffffdf, + 0xf98eddff, + 0xb007f94e, + 0x4f9bd107, + 0x07448712, + 0x03a40794, + 0x0178109f, + 0xf8af0300, + 0x1e00045b, + 0x01ac0115, + 0x07b30194, + 0xbe040b0c, + 0x0bffec6f, + 0x03ac05c0, + 0x27d123b4, + 0xf2930c1c, + 0xc4004fbf, + 0xffffffdf, + 0xf98edcff, + 0xb007f94e, + 0x4f9bd107, + 0x07448712, + 0x03a40794, + 0x0178109f, + 0xf8af0300, + 0x1e00045b, + 0x01ac0115, + 0x07b30194, + 0xbe040b0c, + 0x0bffec2b, + 0x03ac05c0, + 0x27d123b4, + 0x87f2931a, + 0xdfc4004f, + 0xffffffff, + 0x4ef98edd, + 0x079007f6, + 0x9bb207c1, + 0x4487124f, + 0x3f033407, + 0x00045bf8, + 0x781046f1, + 0x37010001, + 0x301e8307, + 0xcb07cb02, + 0xa027d707, + 0x43190b1e, + 0xe0bea103, + 0xd00bffeb, + 0x06074907, + 0x0d0b4a0b, + 0xf2931427, + 0xce004f40, + 0x8d05e5ca, + 0xbc2b9c0b, + 0xd6fa877e, + 0xf68ecfbf, + 0x8007f64e, + 0xa207b107, + 0x87124f9b, + 0x03340744, + 0x045bf83f, + 0x1046f100, + 0x01000178, + 0x1e73073c, + 0x07ba0232, + 0x27d807ba, + 0x090d1e90, + 0xbe9103d3, + 0x0bffeb8b, + 0x07d203c0, + 0x270c0b06, + 0xe1f29316, + 0xb9ce004e, + 0x054b47e7, + 0x2b840b7c, + 0xfa327eab, + 0xafd6c027, + 0x4ef68ecd, + 0x078007f6, + 0x9ba207b1, + 0x4487124f, + 0x3f033407, + 0x00045bf8, + 0x781046f1, + 0x3c010001, + 0x321e7307, + 0xba07ba02, + 0x9027d807, + 0xd3010d1e, + 0x34be9103, + 0xc00bffeb, + 0x0607d403, + 0x1a270c0b, + 0x4e90f293, + 0xe7b9ce00, + 0x7c054b87, + 0xab2b840b, + 0x27f9db7e, + 0xcdafd6c0, + 0xf54ef68e, + 0xf005f063, + 0x5207a107, + 0xb4076307, + 0x87124f9b, + 0x03340744, + 0x045bf83f, + 0x1047f100, + 0x01000178, + 0x1e930738, + 0x03431923, + 0xeae1bed1, + 0x07c00bff, + 0x0b07074a, + 0x270c0b4d, + 0xcef20118, + 0x9c05e8d6, + 0x8d7ea50b, + 0x06b123f9, + 0x27c807b5, + 0x43e11ed0, + 0x4ef58ef0, + 0x05f0a3f5, + 0x159107f0, + 0x9ba407f3, + 0x4487124f, + 0x3f033407, + 0x00045bf8, + 0x781045f1, + 0x36010001, + 0x83077247, + 0xb309231e, + 0x8cbec103, + 0xd00bffea, + 0xf411b203, + 0x0d0b0507, + 0xf2011827, + 0x05e8c4ce, + 0x7e970b8d, + 0xa123f938, + 0xb907a546, + 0xc027d607, + 0xf083e11e, + 0x0499f58e, + 0x0c03990d, + 0x44c62307, + 0x041e3407, + 0x070e0399, + 0x0b412343, + 0x04449940, + 0x960e0099, + 0x28321b45, + 0x0b030730, + 0x0b030bfe, + 0x27fb4efe, + 0x9dc007b0, + 0xc19d0c0b, + 0x9d21070e, + 0x10270d0b, + 0xc1be0403, + 0xcb1dffe7, + 0xcb5dcb3d, + 0xcb3dc203, + 0xfc4efb8e, + 0xcc27d007, + 0xbe0d07fb, + 0x4c00776a, + 0xe84c0700, + 0x8ef31ef4, + 0x07fc4efc, + 0xfbcc27d0, + 0x53be0d07, + 0x004c0077, + 0xf4e84c07, + 0xfc8ef31e, + 0x15361f6b, + 0x4d7ef093, + 0x87fe0b00, + 0x2c40f140, + 0x86000186, + 0x93143404, + 0x005c3ef0, + 0x4187fe0b, + 0x4c23400b, + 0x0b400110, + 0x93fd4efe, + 0x004d63f0, + 0xfff00bbe, + 0xdd83dea7, + 0x031d07fd, + 0xfde0001e, + 0x2107d301, + 0xf093d403, + 0x53004d69, + 0xefeebe12, + 0xa0dfc4ff, + 0xe2ff0222, + 0xf74efd8e, + 0x0af10087, + 0x00018648, + 0x862c0bf1, + 0xc1070001, + 0x4d5bf093, + 0x071a0700, + 0xbe802772, + 0x27ffefc4, + 0x011c1e90, + 0x039103cd, + 0x01d666c4, + 0x4ef093b2, + 0x1a07004d, + 0xa9be3d07, + 0x8d0bffef, + 0x97ceb403, + 0x071a07e3, + 0x45f09328, + 0xf70e004d, + 0xffef939e, + 0x2a99fa4e, + 0x07f12308, + 0x863187d2, + 0x2c33f1ac, + 0x86000186, + 0x93a43434, + 0x005b92f3, + 0x4a870a1e, + 0x4c23430b, + 0x99430110, + 0xdc4909de, + 0x4187db69, + 0xfc15fe05, + 0x42f1fb25, + 0x00018648, + 0x1007dd01, + 0xf0934a07, + 0x35004d13, + 0xef46befd, + 0x99221eff, + 0x2c690924, + 0x32f1de49, + 0x00018648, + 0xf3931007, + 0x93004d68, + 0x004d2ef0, + 0xfc15fe05, + 0xffef23be, + 0xfa8ef103, + 0xcea7fc4e, + 0x01f7ffff, + 0x59f093c1, + 0x0dbe004d, + 0xc121ffef, + 0x4d6cf093, + 0xef02be00, + 0x48c1c1ff, + 0x4d7ef093, + 0xeef6be00, + 0x44c1c1ff, + 0x4d90f093, + 0xeeeabe00, + 0xffcea7ff, + 0xc181efff, + 0x4d9ef093, + 0xeedabe00, + 0x93c1a1ff, + 0x004db1f0, + 0xffeecfbe, + 0xffffcea7, + 0x93c121eb, + 0x004dbff0, + 0xffeebfbe, + 0x9364c1c1, + 0x004dd1f0, + 0xffffcea7, + 0xeeaebee7, + 0x93c101ff, + 0x004ddff0, + 0xffeea3be, + 0x9350c1c1, + 0x004df1f0, + 0xffee97be, + 0xf093c121, + 0xbe004e04, + 0xc1ffee8c, + 0xf09354c1, + 0xbe004e16, + 0xc1ffee80, + 0xf09358c1, + 0xbe004e28, + 0xc1ffee74, + 0xf0935cc1, + 0xbe004e3a, + 0xa7ffee68, + 0xfbffffce, + 0x0628c1d1, + 0x4e46f093, + 0xee56be00, + 0x30c1d1ff, + 0x60f09301, + 0x49be004e, + 0xc1d1ffee, + 0xf0930208, + 0xbe004e7a, + 0xd1ffee3c, + 0x930420c1, + 0x004e94f0, + 0xffee2fbe, + 0x0468c1d1, + 0x4eaef093, + 0xffcea700, + 0x1dbefeff, + 0xc1d1ffee, + 0xc2d10148, + 0xf0930148, + 0x87004ebf, + 0x1c2f0322, + 0xbe000186, + 0xb9ffee04, + 0x930140c1, + 0x004ecbf0, + 0xffedf7be, + 0x9309c199, + 0x004edbf0, + 0xffedebbe, + 0x0d99c1b9, + 0x4eeaf093, + 0xeddebe00, + 0xdcc1d1ff, + 0xf9f0930b, + 0xd1be004e, + 0xc1d1ffed, + 0xf0930be0, + 0xbe004f08, + 0xd1ffedc4, + 0x930be4c1, + 0x004f17f0, + 0xffedb7be, + 0x0144c1a9, + 0x4f26f093, + 0xedaabe00, + 0x42c1a9ff, + 0x41f09301, + 0x9dbe004f, + 0x4ea7ffed, + 0xd1fdefff, + 0x930f0041, + 0x004f52f0, + 0xffed8bbe, + 0x000318be, + 0xa7fd707e, + 0xfd4fff4e, + 0x42114c01, + 0xf0931c07, + 0xbe004f55, + 0x07ffed70, + 0xa710270c, + 0xfef2b32e, + 0x07fdd37e, + 0xa711270c, + 0xfef2a72e, + 0x07fdc77e, + 0xa713270c, + 0xfef29b2e, + 0x07fdbb7e, + 0xa714270c, + 0xfef2832e, + 0x07fdaf7e, + 0xa715270c, + 0xfef2772e, + 0xa15efc0e, + 0xa7fa4efd, + 0xfd4fffce, + 0x236cc1c1, + 0x30f093f1, + 0x1dbe004f, + 0x00beffed, + 0x10070004, + 0x4f48f093, + 0xed0ebe00, + 0xffdea7ff, + 0xd199ffff, + 0x5ef09311, + 0xfdbe004f, + 0xcb01ffec, + 0x1b07c211, + 0x4f76f093, + 0xeceebe00, + 0x270b07ff, + 0xc72ea716, + 0x517efff2, + 0xfb0ea7fd, + 0x0a19ffff, + 0xfffe4ea7, + 0x190103ff, + 0x030b1942, + 0x19010341, + 0x030c1943, + 0x19010341, + 0x1944190e, + 0x6bf093d1, + 0xfe35004f, + 0xfb15fa05, + 0xadbefc25, + 0xd199ffec, + 0x9af0930f, + 0xa1be004f, + 0xd199ffec, + 0xb5f09310, + 0x95be004f, + 0xd2d1ffec, + 0xd3d10638, + 0xd1d1063c, + 0xf0930634, + 0xbe004fc7, + 0xd1ffec80, + 0x930620d1, + 0x004fedf0, + 0xffec73be, + 0x0628d1d1, + 0x5007f093, + 0xec66be00, + 0x2cd1d1ff, + 0x21f09306, + 0x59be0050, + 0xd199ffec, + 0x3cf09327, + 0x4dbe0050, + 0xd199ffec, + 0x57f09326, + 0x41be0050, + 0xd1d1ffec, + 0xf0930a34, + 0xbe005071, + 0xa9ffec34, + 0x930102d1, + 0x00508bf0, + 0xbe0f1c83, + 0xb9ffec24, + 0x930108d1, + 0x0050a2f0, + 0xffec17be, + 0x0109d1b9, + 0x50bcf093, + 0xec0abe00, + 0x0ad1a9ff, + 0xd6f09301, + 0xfdbe0050, + 0xf093ffeb, + 0xbe0050f4, + 0x99ffebf4, + 0xf0930cd1, + 0xbe0050f9, + 0x99ffebe8, + 0xf0932ad1, + 0xbe005114, + 0x99ffebdc, + 0xf09312d1, + 0xbe00512f, + 0x99ffebd0, + 0xf09344d1, + 0xbe00514a, + 0xc1ffebc4, + 0xf0933cd1, + 0xbe005165, + 0xc1ffebb8, + 0xf09340d1, + 0xbe005180, + 0xd1ffebac, + 0x930624d1, + 0x00519af0, + 0xffeb9fbe, + 0x51b8f093, + 0xeb96be00, + 0x430ea7ff, + 0xd3befffb, + 0x1007fffa, + 0x51b8f093, + 0xeb82be00, + 0xf30ea7ff, + 0xbfbefffa, + 0x1007fffa, + 0x51d3f093, + 0xeb6ebe00, + 0xff4ea7ff, + 0x4c99feff, + 0xf1f09309, + 0xc3830051, + 0x4c87bc07, + 0xb42bb433, + 0x0050b1f9, + 0xbe23ff00, + 0xbeffffb8, + 0x03ffeb48, + 0x93b139b4, + 0x0051f7f0, + 0xffeb3bbe, + 0xf093b159, + 0xbe005214, + 0x03ffeb30, + 0x334c87c1, + 0xf1c42bc4, + 0x000048c1, + 0x25f093ff, + 0x19be0052, + 0xf093ffeb, + 0xbe005244, + 0xb9ffeb10, + 0xb90a58d1, + 0xb90a5ad2, + 0x930a5bd3, + 0x005247f0, + 0xffeafbbe, + 0xa910ba39, + 0xf093a827, + 0xbe005267, + 0xb9ffeaec, + 0xb90a5ad4, + 0x2b0a5bd3, + 0x07461e43, + 0x64f0931c, + 0x1c830052, + 0xead2be0f, + 0x58d4b9ff, + 0x60f0930a, + 0x11270052, + 0x10274c0e, + 0xffeabfbe, + 0x131eb027, + 0x0a48b4f9, + 0x2127ff00, + 0x4c0eb103, + 0xa9be2027, + 0x1b07ffea, + 0x5244f093, + 0xe5bace00, + 0x41034c07, + 0xd4b9c407, + 0xcf6b0a5a, + 0x27b1c4ce, + 0xf90d1ec0, + 0x000a48c2, + 0xbec103ff, + 0x07ffea80, + 0x28f0931c, + 0xcace0052, + 0x8ef103eb, + 0xe3f64efa, + 0xddf093f4, + 0x65be0055, + 0x7127ffea, + 0x4d87d027, + 0x100044f1, + 0x3787ff02, + 0x34f1f495, + 0xff021000, + 0xf491f4a5, + 0xa7e04c3c, + 0x070b1e40, + 0xf144334d, + 0x02180c44, + 0xa1f4b5ff, + 0xe04c3cf4, + 0x0b1e40a7, + 0x44334707, + 0x180c44f1, + 0xf4c5ff02, + 0x38dc3030, + 0x091e4027, + 0x44f14d87, + 0xff021600, + 0x3034f4c5, + 0x4027387c, + 0x4787091e, + 0x160044f1, + 0xf4c5ff02, + 0xc5402738, + 0xf4c53cf4, + 0x44f4c540, + 0xb148f4c5, + 0x534533f4, + 0xf4c51f4c, + 0x30f4c13c, + 0x4c534533, + 0x40f4c51f, + 0x4833f4b1, + 0xc5184c53, + 0xf4c144f4, + 0x53483330, + 0xf4c5184c, + 0xa1f29148, + 0x38f4b1f3, + 0x0000004f, + 0x1e10a720, + 0x334d070b, + 0x0441f144, + 0xc1ff0218, + 0x4f3830f4, + 0x20000000, + 0x0b1e60a7, + 0x44334707, + 0x180446f1, + 0xfec1ff02, + 0xc141073c, + 0x1d0740fc, + 0xc144fbc1, + 0xf9c148fa, + 0x38f8c134, + 0x1153fd55, + 0xf093d203, + 0x75005537, + 0x15f605f7, + 0x35fc25fe, + 0x65fa45fb, + 0x03f885f9, + 0xe95ebe72, + 0x50dce4ff, + 0xf093fefa, + 0xbe005560, + 0x27ffe950, + 0xffbea7c0, + 0x2c07ffe3, + 0x27031c07, + 0x555af093, + 0xf3f1be00, + 0x931b07ff, + 0x00555ef0, + 0x38272827, + 0xc8034127, + 0xfff1bbbe, + 0xc420bc03, + 0xc3d820cc, + 0x27f68ef4, + 0x4304d10f, + 0x01fe0b2c, + 0x1342d004, + 0x32b01301, + 0x204944c0, + 0xc042a434, + 0x14113c32, + 0x112745c6, + 0xfe0b0107, + 0x04113284, + 0x10a742c6, + 0xfe0b0107, + 0x14110311, + 0x3106344e, + 0xf11e10a7, + 0x14210221, + 0x7af442da, + 0x31043124, + 0xeb04ca10, + 0x3fd60442, + 0x1e10a7ce, + 0x071027d8, + 0xc4fe0b01, + 0x1111c934, + 0x142b0411, + 0xfb4ebb1e, + 0x32d00301, + 0xd014012f, + 0x34e02842, + 0x44c000fb, + 0x2242c421, + 0x051d32c4, + 0x15041123, + 0x25042124, + 0x35043124, + 0x11031124, + 0x8b020714, + 0x8e241543, + 0x8e0107fb, + 0xfa32c0fb, + 0x14210c21, + 0xe42bec07, + 0x13310b31, + 0xe0c8de07, + 0x20ecc867, + 0x8c4cfa4c, + 0x27c40700, + 0x110011b0, + 0x7404ce14, + 0x3b2b0f66, + 0x277e30c8, + 0x25241540, + 0x3123352c, + 0x23410721, + 0xff4fd441, + 0x163fffff, + 0x11472321, + 0x41073123, + 0x23252135, + 0x4fd04123, + 0x3fffffff, + 0x054327ee, + 0x2810c824, + 0xfb8e0207, + 0x2752d1c8, + 0x234e3b41, + 0x27438b41, + 0x274486d0, + 0xab3e5bd1, + 0x13a71e3d, + 0x20eccce0, + 0x1be21e99, + 0x21a61e3b, + 0x53310724, + 0xab118331, + 0x07410313, + 0x25213502, + 0x07fb8e24, + 0x15130b1b, + 0x352c2520, + 0x27b31e21, + 0xff775e30, + 0x41273013, + 0x2c252415, + 0x801e2335, + 0xff67dfe6, + 0x4e3b4127, + 0x4b8b4123, + 0xd027ce0b, + 0xd1274486, + 0xbdabbe5b, + 0xe4ff505e, + 0x11ff2a44, + 0xee041113, + 0x93ff2234, + 0x0053cbf0, + 0x0001fb8e, + 0x40073007, + 0x53173c53, + 0x20071f4c, + 0x3f6b1415, + 0xffff2e83, + 0xc639d67f, + 0xa7432728, + 0x14057d3c, + 0x13254207, + 0x4f744733, + 0x40000000, + 0x31234447, + 0x00004fd0, + 0x25f64000, + 0x0b143513, + 0x054227fe, + 0xc0fe0b14, + 0x3316ff3c, + 0x7f3c2327, + 0x00002fa3, + 0x43274000, + 0x13251235, + 0xfe0b1405, + 0x44272516, + 0xfe0b1405, + 0x00000e83, + 0x27054610, + 0x35140541, + 0x05fe0b12, + 0x4ef91e10, + 0x07f163f5, + 0x03f0051f, + 0x7e0f0714, + 0xf341ff7a, + 0x23074027, + 0xf0112253, + 0xf12142ab, + 0x3c33f231, + 0x0c79be1e, + 0x43510700, + 0x4ef58ef1, + 0x07f2a3fb, + 0x05b803bf, + 0x07f115f0, + 0x7e1b070f, + 0xcf07ff4a, + 0x0718cc03, + 0x0704030f, + 0xff3c7e1c, + 0x1c070b07, + 0x83fdba7e, + 0x01fb8ef2, + 0x11033104, + 0x6442d002, + 0x005744c0, + 0x2735f642, + 0xab002740, + 0x1f2c3304, + 0xfe0b02ab, + 0x0fc80021, + 0xffffff82, + 0x800ccc5b, + 0x83430739, + 0x0c037f4c, + 0x404cc07f, + 0x3f3c031e, + 0x072130c8, + 0x6b475343, + 0xff4e830f, + 0x0c337fff, + 0x3304ab17, + 0x02ab1f2c, + 0x3cd8fe0b, + 0x3c03e380, + 0x53de1e40, + 0x1e010331, + 0x274027db, + 0x8000000f, + 0x07a91e7f, + 0x004ea343, + 0x4e831000, + 0x277fffff, + 0x8000000f, + 0x13951e7f, + 0xffff820f, + 0x1a0cccff, + 0x3b412753, + 0x8b412340, + 0x86102743, + 0x5b112744, + 0xab030730, + 0x83400701, + 0x4cc07f4c, + 0x40073c40, + 0x073f4c03, + 0x27375334, + 0x004fd001, + 0x20400000, + 0x4e834307, + 0x337fffff, + 0x505e170c, + 0x034007ff, + 0x3407404c, + 0x01273753, + 0x00004fd4, + 0x27e24000, + 0x27de1e00, + 0x1e302700, + 0x800cdcd8, + 0x533007e1, + 0x14412737, + 0x0000000f, + 0x07402740, + 0x4ec21e04, + 0x05f123fe, + 0x150f07f0, + 0x35f225f1, + 0xfef97ef3, + 0xfe8ef103, + 0xf163fd4e, + 0xd403df07, + 0x1d07f005, + 0x137e0f07, + 0x27f421fe, + 0x27449630, + 0x250d0731, + 0xfed57ef3, + 0xfd8ef143, + 0xf2a3fc4e, + 0xc803cf07, + 0xf115f005, + 0x1c070f07, + 0x07fded7e, + 0x18dc03df, + 0x04030f07, + 0xdf7e1d07, + 0xd0f221fd, + 0xf1611622, + 0x008112f0, + 0xf371f431, + 0xf43543cb, + 0x22c42400, + 0x07126e18, + 0xfe917e0c, + 0xfc8ef283, + 0x517ef093, + 0xfe857e00, + 0xfc8ef283, + 0xc05d14c0, + 0xf2413912, + 0xf351f481, + 0xf191242b, + 0x1342f245, + 0xf2452123, + 0x2f273347, + 0x40000000, + 0x4c270027, + 0xab312a1f, + 0x53312b02, + 0x98334721, + 0x834007f4, + 0x4cc07f4c, + 0xf0551240, + 0x4427ae1e, + 0xf4250c07, + 0x83fe3a7e, + 0xdcfc8ef2, + 0x66ec800c, + 0x400c0331, + 0x557f0ce3, + 0x07911ef0, + 0x278f1e0d, + 0x450c0740, + 0x1ef455f4, + 0xa3fc4e85, + 0x03cf07f3, + 0x15f005c8, + 0x070f07f1, + 0xfd347e1c, + 0xdc03df07, + 0x030f0718, + 0x7e1d0704, + 0xf421fd26, + 0xf3614290, + 0xe02432d0, + 0xe000dc44, + 0xc400cc34, + 0xf3311642, + 0x2027f471, + 0x2127340e, + 0xf2350c07, + 0x83fdd27e, + 0xc4fc8ef3, + 0xf3311632, + 0x2027f471, + 0x2127340e, + 0xf2750d07, + 0x83fdba7e, + 0x51fc8ef3, + 0x27f091f2, + 0xbe102730, + 0x8100129f, + 0x07f441f3, + 0x03430bd1, + 0xc5302742, + 0xf3b530f4, + 0xf331f471, + 0x342e2107, + 0xf4b54127, + 0x20cc3d07, + 0x30f4c11a, + 0x41032153, + 0x01533138, + 0x00000fa3, + 0x32078000, + 0xc5ee20c8, + 0x2fd430f4, + 0x40000000, + 0x30f4c123, + 0x0047091e, + 0x00002fb4, + 0x22474000, + 0x00cc4123, + 0x4721a3f2, + 0x002fd000, + 0xef400000, + 0x0730f4c5, + 0x7f4c8342, + 0x14404cc0, + 0x43270f07, + 0xc5280c03, + 0xf4a534f2, + 0x83fd2e7e, + 0xdcfc8ef3, + 0x26ea802c, + 0x402c0301, + 0x1e7f2ce3, + 0x4f42e4e0, + 0x09f093ff, + 0x3d5e0050, + 0x2b32e4ff, + 0xfdf093ff, + 0x315e004f, + 0xa3fb4eff, + 0x03bf07f3, + 0x15f005b8, + 0x070f07f1, + 0xfc207e1b, + 0xcc03cf07, + 0x030f0718, + 0x7e1c0704, + 0xf471fc12, + 0x41c32f07, + 0x2c031c07, + 0x750b0728, + 0xfae47ef4, + 0x83fcce7e, + 0x4efb8ef3, + 0x07f3a3fb, + 0x05b803bf, + 0x07f115f0, + 0x7e1b070f, + 0xcf07fbe6, + 0x0718cc03, + 0x0704030f, + 0xfbd87e1c, + 0x1c072f07, + 0x07282c03, + 0xfab07e0b, + 0x83fc9a7e, + 0x4efb8ef3, + 0x27f123fc, + 0x27f40543, + 0x270008c1, + 0x270636c0, + 0x07f40542, + 0x7efc150f, + 0xf103fc7b, + 0xc876fc8e, + 0x4c27d007, + 0x250d071e, + 0xbefd35f4, + 0x230011b3, + 0xe001c801, + 0x3b1e4c27, + 0x35402bd0, + 0x1ef425fd, + 0x000f40d3, + 0x07800000, + 0x1ed013d0, + 0x000f27d6, + 0x1ecf0000, + 0xa3fc4ec6, + 0x03cf07f2, + 0x15f005c8, + 0x070f07f1, + 0xfb5c7e1c, + 0xdc03df07, + 0x030f0718, + 0x7e1d0704, + 0xf421fb4e, + 0x611042d0, + 0x074290f4, + 0x7e1d070c, + 0xf283f9c3, + 0x0127fc8e, + 0xfe4ef91e, + 0x1f07f163, + 0x1403f005, + 0x277e0f07, + 0x44f411fb, + 0x43002742, + 0xd0fe8ef1, + 0x4440f842, + 0x40c8f431, + 0x1f4c88f1, + 0x47c6f421, + 0x00000f27, + 0xf1438000, + 0xf041fe8e, + 0x4c13f321, + 0xc6045b1e, + 0x0013d63f, + 0xfe8ef143, + 0xffff0f27, + 0xf1437fff, + 0xfe4efe8e, + 0xf115f2a3, + 0xf0051f07, + 0x0f071803, + 0x07fad57e, + 0x031f070f, + 0x181c0304, + 0x21fac97e, + 0x614290f4, + 0x300027f4, + 0x8ef28342, + 0x830127fe, + 0x4efe8ef2, + 0x07f2a3fc, + 0x05c803cf, + 0x07f115f0, + 0x7e1c070f, + 0xdf07faa2, + 0x0718dc03, + 0x0704030f, + 0xfa947e1d, + 0x42d0f421, + 0x90f46110, + 0x070c0742, + 0xf9097e1d, + 0xfc8ef283, + 0xf91e0127, + 0xf2a3fc4e, + 0xc803cf07, + 0xf115f005, + 0x1c070f07, + 0x07fa697e, + 0x18dc03df, + 0x04030f07, + 0x5b7e1d07, + 0xd0f421fa, + 0xf4611042, + 0x0c074290, + 0xd07e1d07, + 0x8ef283f8, + 0x1e0127fc, + 0xa3fc4ef9, + 0x03cf07f2, + 0x15f005c8, + 0x070f07f1, + 0xfa307e1c, + 0xdc03df07, + 0x030f0718, + 0x7e1d0704, + 0xf421fa22, + 0x611042d0, + 0x074290f4, + 0x7e1d070c, + 0xf283f897, + 0x00a7fc8e, + 0xfc4ef91e, + 0xcf07f2a3, + 0xf005c803, + 0x0f07f115, + 0xf77e1c07, + 0x03df07f9, + 0x0f0718dc, + 0x1d070403, + 0x21f9e97e, + 0x1042d0f4, + 0x4290f461, + 0x1d070c07, + 0x83f85e7e, + 0xa7fc8ef2, + 0x4ef91e00, + 0x07f2a3fc, + 0x05c803cf, + 0x07f115f0, + 0x7e1c070f, + 0xdf07f9be, + 0x0718dc03, + 0x0704030f, + 0xf9b07e1d, + 0x42d0f421, + 0x90f46110, + 0x070c0742, + 0xf8257e1d, + 0xfc8ef283, + 0xf91e0127, + 0xf123fd4e, + 0x0676d007, + 0xf4054227, + 0x40270f07, + 0x547ef415, + 0x8ef103fa, + 0x274327fd, + 0xf4051e3c, + 0xf035f325, + 0x000f8ebe, + 0x00c80123, + 0xdd0fc61c, + 0x2b1e4c27, + 0x25d03b40, + 0x270f07f4, + 0x15fd3540, + 0xfa257ef4, + 0xfd8ef103, + 0x20132007, + 0x423b4127, + 0x4d8b4123, + 0x46363027, + 0x4c27d25b, + 0x2b3dab1e, + 0x25f33540, + 0x27a61ef4, + 0x4eee1e31, + 0xd00401fd, + 0x13011342, + 0x44c032b0, + 0xa434205d, + 0x4832c042, + 0x45c61411, + 0x01071127, + 0x3284fd8e, + 0x42c60411, + 0x010710a7, + 0x0311fd8e, + 0x344e1411, + 0x10a73106, + 0x0221f11e, + 0x42da1421, + 0x1524daf4, + 0x0e410d31, + 0x11411031, + 0xcee61eca, + 0xe12a141e, + 0x0d42e16e, + 0xa7c23fd6, + 0x27cc1e10, + 0x8e010710, + 0xebd0c2fd, + 0x1ecc3fd6, + 0xb534c4b0, + 0x04111111, + 0xa71e142b, + 0xf1a3f54e, + 0x60275027, + 0xf5350301, + 0xc007f645, + 0xb2077107, + 0x90278027, + 0x012f32d0, + 0x7d42f014, + 0x4b34e001, + 0x7544e002, + 0x2442c401, + 0x071b32c4, + 0x27400732, + 0x03410125, + 0x03310544, + 0x11f2a834, + 0x077411c3, + 0x15438bcb, + 0x830c07b4, + 0xe0f58ef1, + 0x21014b32, + 0x2514210e, + 0x310341fe, + 0x15ae0702, + 0x2bf205f3, + 0x411d31a4, + 0xe83a071e, + 0xcc00dfa0, + 0xe84c40ac, + 0x07017c31, + 0x203c233a, + 0x5027f355, + 0x30e86027, + 0x412701dc, + 0x133b1407, + 0x02072127, + 0x30a70a3b, + 0x300b40a7, + 0x3d8b414b, + 0x34ab4e8b, + 0x512734c6, + 0xf4516027, + 0x01a440e8, + 0x845b8e07, + 0x9a5b9e07, + 0xe607d507, + 0xe9abd8ab, + 0xf321111e, + 0x010643fa, + 0x20271027, + 0xf105f425, + 0xc011f215, + 0x04ee7411, + 0x0fe600db, + 0xf30100cc, + 0x1d07f411, + 0x132b2e07, + 0x20e8246b, + 0x402700f2, + 0xf421b415, + 0xb425b135, + 0xbc31b245, + 0x30a7bd41, + 0x3c0b40a7, + 0x4fd44d4b, + 0x10000000, + 0xff4fe031, + 0xc00fffff, + 0x07b12100, + 0x1f4c534c, + 0x34ab3d47, + 0xb3452c47, + 0xbc31b235, + 0x1123bd41, + 0x40a730a7, + 0x3c0bb125, + 0x4fd04d4b, + 0x10000000, + 0x0543271e, + 0x00dfd4b4, + 0x2c200000, + 0x0c07cb07, + 0xf58ef183, + 0xaceca013, + 0x5eff6d40, + 0x4fc4ff1f, + 0x0fffffff, + 0xff3fd0b7, + 0xb0ffffff, + 0xb4054327, + 0x0000dfd0, + 0x07d62000, + 0x330d073c, + 0x20271f0c, + 0x4d073153, + 0x1c07be21, + 0x415330ab, + 0x04ab0207, + 0xcb071183, + 0x13abe103, + 0xf183b045, + 0xb1350c07, + 0xf58ebe25, + 0x0c07c707, + 0xf58ef183, + 0xf211f101, + 0x2e6b1d2b, + 0x01ff395e, + 0x15f211f1, + 0x4b1d0bb0, + 0x21d2072e, + 0x25c107f2, + 0x45bc35b2, + 0xff735ebd, + 0xe027d027, + 0xf4ff015e, + 0xffffff3f, + 0x5eff64ff, + 0xfd21ff39, + 0x40273027, + 0x426b312b, + 0xb2152127, + 0xb335bd25, + 0x075eb445, + 0xdb3fe6ff, + 0x07f321fe, + 0x202c232a, + 0xf2553a0b, + 0x0027f325, + 0x20e81027, + 0x41270091, + 0x623b6407, + 0x52072127, + 0xf2015a3b, + 0x40a730a7, + 0x464b350b, + 0xf211328b, + 0x34ab428b, + 0x012734c6, + 0xf3511027, + 0x115030c8, + 0x35435bf4, + 0x31f311f4, + 0x073a5bf4, + 0xab40ab23, + 0x05f34521, + 0x5ef215f4, + 0x4c27fe82, + 0x074a2b20, + 0x3b8d071e, + 0xab8a5b14, + 0xfe525e81, + 0x27203c27, + 0x073a2b41, + 0x5e135b14, + 0x44e4fe20, + 0x1311fdd9, + 0x34ee0411, + 0xfc93fdd1, + 0x5e004a10, + 0x4c27fdc9, + 0x01f21120, + 0x3b4a2bf3, + 0x073a5b24, + 0xab230742, + 0x1ef23524, + 0x203c27a1, + 0x3a2b4127, + 0x635b6407, + 0x4eff6b5e, + 0x010a11f8, + 0x07ba0709, + 0x1fbc533a, + 0x83143c53, + 0x070307b1, + 0x831b15ea, + 0x2707ff0d, + 0x078107c0, + 0xffee83d9, + 0x0e160fff, + 0x4eab4907, + 0x42274516, + 0xf88e1405, + 0x3da74327, + 0x140503fd, + 0x49071325, + 0x4c531e07, + 0x07183318, + 0x3314ab09, + 0x001fd408, + 0x1d100000, + 0x2007e307, + 0x2c534147, + 0x4742ab1f, + 0x07030730, + 0xd0e12314, + 0x0000004f, + 0x8e25e910, + 0x81458035, + 0x0dc0f88e, + 0x072807ff, + 0x534e0729, + 0x4833182c, + 0x240742ab, + 0x00002fa3, + 0x39071000, + 0x0d233833, + 0x124503ff, + 0x10252327, + 0x13351205, + 0x4907f88e, + 0x45164eab, + 0x14054427, + 0x4e07f88e, + 0x4e833027, + 0xab080000, + 0x27358634, + 0x35140541, + 0x8e8e458d, + 0x1e1305f8, + 0xe3f54ef7, + 0x075107f1, + 0x0340071f, + 0x050f0718, + 0x7ef515f4, + 0xf351ff23, + 0x1307f461, + 0xffff1f83, + 0x20273fff, + 0x3c530487, + 0xab12ab1e, + 0xa3148630, + 0x31f02131, + 0xbef241f1, + 0xc3fff6d7, + 0x4ef58ef1, + 0x07f3a3f5, + 0x10ac03af, + 0xb007c107, + 0x0f071a07, + 0xf225f335, + 0xfc155307, + 0xcf07fb05, + 0x03feda7e, + 0x0f0724cc, + 0x1c070803, + 0x07fece7e, + 0x7e1c070a, + 0xf383fbab, + 0xf64ef58e, + 0x90270401, + 0x0d31a027, + 0x08110e41, + 0x00c942f0, + 0x00ba44e0, + 0x4d074240, + 0x47f64eab, + 0x10270027, + 0x31833807, + 0x4c334307, + 0x0730271f, + 0xabc107b0, + 0x07c4abb3, + 0x8e1c070b, + 0xe80021f6, + 0xfffc020f, + 0xec00b1ff, + 0x8504000d, + 0x6b3d0700, + 0x0340273f, + 0xc003ff0d, + 0x2756803c, + 0x40277f3c, + 0xe44bd30b, + 0x0000efd0, + 0x07162000, + 0x073d072e, + 0x1f2c334e, + 0x32ab3153, + 0xd3074153, + 0x0103e407, + 0x4e072007, + 0x1e070d07, + 0x07ff2d83, + 0x32071853, + 0x53184c33, + 0x0704ab08, + 0x143c33e1, + 0xd0072027, + 0xffffee83, + 0x0702070f, + 0xab0dab13, + 0xff765e1e, + 0x07a94fd6, + 0x003d833d, + 0xc634ab01, + 0x3c27a73f, + 0x0b402780, + 0xd0e44bd3, + 0x000000ef, + 0x9c1eb320, + 0x1f270027, + 0x7ff00000, + 0x07ff4b5e, + 0x004ea34e, + 0xe4070800, + 0xffffee83, + 0x071e070f, + 0x001fa30d, + 0x5e7ff000, + 0x0f13ff30, + 0xfffffc02, + 0xba390cec, + 0x23100700, + 0x6027201c, + 0x10e87027, + 0x412700b5, + 0xc13bc407, + 0xb2072127, + 0x30a7b03b, + 0x3b0b40a7, + 0x3d8b4c4b, + 0x34ab4e8b, + 0x612734c6, + 0x10e87027, + 0x9e07009f, + 0xd607915b, + 0xae07d9ab, + 0xa05b3d07, + 0x3f6be707, + 0x4027eaab, + 0x44803cc0, + 0x277f3c27, + 0x4b3d0b40, + 0x3324074e, + 0xc127182c, + 0x00004f14, + 0xc0271000, + 0x08530307, + 0x02ab1407, + 0x3c071853, + 0x07ff3d83, + 0xe1074307, + 0x27144c33, + 0x83d00730, + 0x0fffffee, + 0x14070307, + 0x1eab0dab, + 0xd6fe975e, + 0x3d07bb4f, + 0x01003d83, + 0x34ab4027, + 0x4e073cb6, + 0x27184c33, + 0x00ef14c1, + 0x27100000, + 0x530d07c0, + 0xab1e0708, + 0x1e185304, + 0x27c027b6, + 0x1e102700, + 0x203c27ae, + 0x302b4127, + 0xc35bc407, + 0x27ff475e, + 0x402b204c, + 0x9d073e07, + 0x905b343b, + 0x575e93ab, + 0x803c27ff, + 0x4eff6a5e, + 0x05f163f5, + 0x150f07f0, + 0x35f225f1, + 0x7ef445f3, + 0x5107fe0a, + 0xf58ef143, + 0xf1e3f54e, + 0xd803df07, + 0x51074007, + 0x1d070f07, + 0xf515f405, + 0x31fcae7e, + 0x963027f4, + 0x07312744, + 0x7ef3350d, + 0x5107fdde, + 0xf58ef1c3, + 0xf3e3f54e, + 0x1f07c107, + 0x1c03b007, + 0x250f0710, + 0x15f335f2, + 0x7efb05fc, + 0xdf07fc7f, + 0x0724dc03, + 0x0708030f, + 0xfc717e1d, + 0x22d0f241, + 0xf0f19116, + 0x51010912, + 0xcbf3a1f4, + 0x00f45543, + 0x1f22c424, + 0x0f0712ae, + 0x7e100c03, + 0x5107fd8e, + 0xf58ef3c3, + 0x462af093, + 0xfd807e00, + 0xf3c35107, + 0x14e0f58e, + 0x12c000df, + 0xb1f1617f, + 0x2bfc81f4, + 0x34f8c114, + 0xfb71f165, + 0xea30f7c1, + 0xce0084c8, + 0x4c277d8c, + 0x2790273d, + 0x000000af, + 0x27502710, + 0x38f4c560, + 0xe607d507, + 0xd9ab4a07, + 0x4c33eaab, + 0xcec88a1f, + 0x5d07548c, + 0xb72b6e07, + 0x2907c86b, + 0x24ab2153, + 0x4c534b07, + 0xab1c471f, + 0x38f4c114, + 0x41233a07, + 0x0b473153, + 0x0738f4c5, + 0x07a30792, + 0xd6c107b0, + 0x3507bf4f, + 0x40273f6b, + 0x38803cc0, + 0xf685f575, + 0x07ff615e, + 0x0344270f, + 0xf445100c, + 0x07fce97e, + 0x8ef3c351, + 0xb3b7caf5, + 0x7bc2a91e, + 0x472b0782, + 0x1f2c534c, + 0x3b4742ab, + 0xb3071123, + 0xf165c407, + 0xd6ff6d5e, + 0x3507c74f, + 0x01003d83, + 0x3fd634ab, + 0xab4007bc, + 0xb54fc641, + 0x27803c27, + 0x4b350b40, + 0xe3530746, + 0x6407ff5c, + 0x0d07a31e, + 0x07ff0a5e, + 0x2730270f, + 0x03202740, + 0xf375100c, + 0xf265f485, + 0x4efef65e, + 0x07f5e3f5, + 0x10ac03af, + 0xc107b007, + 0x1a070f07, + 0xf225f335, + 0xfb05fc15, + 0x07fb2a7e, + 0x24dc03df, + 0x08030f07, + 0x1c7e1d07, + 0x90f441fb, + 0xd0f39142, + 0x44e02632, + 0x34e001f3, + 0x42c401e3, + 0xa1f35118, + 0x0e2027f4, + 0x07212734, + 0x7ef2550a, + 0x5107fc36, + 0xf58ef5c3, + 0x511832c4, + 0x27f4a1f3, + 0x27340e20, + 0xa50d0721, + 0xfc1c7ef2, + 0xf5c35107, + 0xfbc1f58e, + 0x27f77130, + 0x076027a0, + 0x34fcc12b, + 0x1a073607, + 0x94be0707, + 0x5b070006, + 0xbc073027, + 0xc54cfbc5, + 0xf0c550f3, + 0x58f1c554, + 0xc14cf0c1, + 0x3a0750f1, + 0x2707f881, + 0x000672be, + 0x9007c027, + 0x2507a107, + 0x08073607, + 0x60be1c07, + 0xd0070006, + 0xd90be107, + 0xb807ea4b, + 0x00fdeaea, + 0x00f5aeee, + 0xf3c11027, + 0x58f4c154, + 0xad079107, + 0xa44b930b, + 0x80277027, + 0x00f9a4ea, + 0xee58f4c1, + 0xc1012c4a, + 0xf2c150f3, + 0x070b074c, + 0xbebe071c, + 0xb100061f, + 0x27f461f3, + 0x03430bc0, + 0xc5302744, + 0xf3c540f4, + 0x51f4a13c, + 0x4bb00bf3, + 0x4bb70bc1, + 0x27342ec8, + 0x3cf4c541, + 0x0000cfd0, + 0xc13f2000, + 0x4c0740fe, + 0x4c331b07, + 0x0711531f, + 0xab0a072c, + 0x33215314, + 0xe1031f0c, + 0x0715b1d8, + 0x534a0739, + 0xab415331, + 0x07a40730, + 0x00afa393, + 0x07800000, + 0xd4c207b1, + 0x0000002f, + 0xfec5c920, + 0x00cfd440, + 0x31100000, + 0x0740fec1, + 0x1f4c5349, + 0x1a472b07, + 0x2c5314ab, + 0xab4c471f, + 0x473b4742, + 0x07b30709, + 0xc8e123c4, + 0x900759a0, + 0xcfd0a107, + 0x10000000, + 0x40fec5d7, + 0x3f6b3b07, + 0x3cc04027, + 0x0f074980, + 0x0c034327, + 0x44fbc538, + 0xc548fcc5, + 0xcb7e38f4, + 0xc35107fa, + 0xe2f58ef5, + 0x27ff0b9d, + 0x54f3c110, + 0x0758f4c1, + 0x0bad0791, + 0x27a44b93, + 0xe2812770, + 0x27ff0b4a, + 0x0b402731, + 0x5e844b73, + 0x31a3ff07, + 0xc407b307, + 0x4fd6a11e, + 0x833b07b6, + 0xab01003d, + 0xab3fd634, + 0x4aab4907, + 0x27a44fc6, + 0x4027803c, + 0x4c4b3b0b, + 0xbce3b307, + 0x1ec407ff, + 0xd439e292, + 0xe4c11efe, + 0x93fe3a42, + 0x004307f0, + 0xe4fe265e, + 0x93fe1432, + 0x0042fbf0, + 0x4efe1a5e, + 0x07f4e3f5, + 0x10ac03af, + 0xb007c107, + 0x0f071a07, + 0xf225f335, + 0xfb05fc15, + 0xf47ecf07, + 0x24cc03f8, + 0x08030f07, + 0xe87e1c07, + 0x07f4a1f8, + 0x0741c32f, + 0x382c031c, + 0xf4a50a07, + 0x7ef62f7e, + 0x5107fa12, + 0xf58ef4c3, + 0xf4e3f54e, + 0xac03af07, + 0x07c10710, + 0x071a07b0, + 0x25f3350f, + 0x05fc15f2, + 0x7ecf07fb, + 0xcc03f8af, + 0x030f0724, + 0x7e1c0708, + 0x2f07f8a3, + 0x2c031c07, + 0x7e0a0738, + 0xd37ef5f0, + 0xc35107f9, + 0x4ef58ef4, + 0x27f163fb, + 0x27f40543, + 0x270008b1, + 0x270736b0, + 0x07f40542, + 0x7efb150f, + 0x3007f9b2, + 0x03074107, + 0xf1431407, + 0xbb36fb8e, + 0x04074007, + 0xc407d027, + 0x253c4c27, + 0x45f035f4, + 0x047dbefd, + 0x03100700, + 0x11c81d1c, + 0xc80323cf, + 0x4c072300, + 0xf445403b, + 0x3c274c07, + 0x2b413b3c, + 0x25f43531, + 0xc0b51ef3, + 0x0000000f, + 0x40071a80, + 0xbf1e4013, + 0x2b204c27, + 0x072c0741, + 0x3b245b3d, + 0x4532ab31, + 0x27d21ef3, + 0x004f2730, + 0x1ec1e000, + 0xa3f54e96, + 0x03df07f3, + 0x400710dc, + 0x0f075107, + 0xf4051d07, + 0xf335c307, + 0xf515f225, + 0xe47ebf07, + 0x24bc03f7, + 0x08030f07, + 0xd87e1b07, + 0xd0f441f7, + 0xf4911042, + 0x0d074290, + 0xac7e1b07, + 0x8ef383f4, + 0x1e0127f5, + 0xe3f54ef9, + 0x075107f1, + 0x0340071f, + 0x050f0718, + 0x7ef515f4, + 0xf421f7ab, + 0x00274244, + 0xf58ef1c3, + 0x40f842d0, + 0xc8f44144, + 0x4c88f140, + 0x46f4311f, + 0x000f2749, + 0xc3800000, + 0x27f58ef1, + 0xe42b3cec, + 0x4c234e07, + 0x1c40c820, + 0x0207f261, + 0xf431045b, + 0x13ca4fc6, + 0x8ef1c300, + 0xff0f27f5, + 0xc37fffff, + 0x61f58ef1, + 0x204c27f2, + 0x32074e2b, + 0x4307343b, + 0x0307f351, + 0x04ab0e5b, + 0xf54ed51e, + 0x5107f3a3, + 0x40071f07, + 0x07101c03, + 0x07f4050f, + 0x35c307b2, + 0x15f225f3, + 0xf7297ef5, + 0x1f070f07, + 0x1c030803, + 0xf71d7e24, + 0x4290f441, + 0x0027f491, + 0xf3834230, + 0x0127f58e, + 0xf58ef383, + 0xf3a3f54e, + 0xdc03df07, + 0x07400710, + 0x070f0751, + 0x07f4051d, + 0x25f335c3, + 0x07f515f2, + 0xf6e97ebf, + 0x0724bc03, + 0x0708030f, + 0xf6dd7e1b, + 0x42d0f441, + 0x90f49110, + 0x070d0742, + 0xf3b17e1b, + 0xf58ef383, + 0xf91e0127, + 0xf3a3f54e, + 0xdc03df07, + 0x07400710, + 0x070f0751, + 0x07f4051d, + 0x25f335c3, + 0x07f515f2, + 0xf6a57ebf, + 0x0724bc03, + 0x0708030f, + 0xf6997e1b, + 0x42d0f441, + 0x90f49110, + 0x070d0742, + 0xf36d7e1b, + 0xf58ef383, + 0xf91e0127, + 0xf3a3f54e, + 0xdc03df07, + 0x07400710, + 0x070f0751, + 0x07f4051d, + 0x25f335c3, + 0x07f515f2, + 0xf6617ebf, + 0x0724bc03, + 0x0708030f, + 0xf6557e1b, + 0x42d0f441, + 0x90f49110, + 0x070d0742, + 0xf3297e1b, + 0xf58ef383, + 0xf91e00a7, + 0xf3a3f54e, + 0xdc03df07, + 0x07400710, + 0x070f0751, + 0x07f4051d, + 0x25f335c3, + 0x07f515f2, + 0xf61d7ebf, + 0x0724bc03, + 0x0708030f, + 0xf6117e1b, + 0x42d0f441, + 0x90f49110, + 0x070d0742, + 0xf2e57e1b, + 0xf58ef383, + 0xf91e00a7, + 0xf3a3f54e, + 0xdc03df07, + 0x07400710, + 0x070f0751, + 0x07f4051d, + 0x25f335c3, + 0x07f515f2, + 0xf5d97ebf, + 0x0724bc03, + 0x0708030f, + 0xf5cd7e1b, + 0x42d0f441, + 0x90f49110, + 0x070d0742, + 0xf2a17e1b, + 0xf58ef383, + 0xf91e0127, + 0xf163f54e, + 0xb027a027, + 0x90278027, + 0x422706b6, + 0x0f07f405, + 0xf4154027, + 0x07f6d97e, + 0x8ef14351, + 0x27d027f5, + 0x3c3c2743, + 0xf405c007, + 0xf035f325, + 0xacbefd45, + 0x10070001, + 0xc81d1c03, + 0x1fc62c10, + 0xe80323d2, + 0x07008200, + 0x45403b4c, + 0x3b4c07f4, + 0x3c3c2741, + 0x312bf435, + 0x40270f07, + 0xf415f325, + 0x07f6917e, + 0x8ef14351, + 0x13e107f5, + 0x230e07e0, + 0x6027200c, + 0x00c87027, + 0x07412742, + 0x27b03bb4, + 0x3ba20721, + 0xa730a7ae, + 0x4b3a0b40, + 0x8b3c8b4b, + 0xc634ab4d, + 0x27612734, + 0x4000c870, + 0x805b8d07, + 0x9e5b9d07, + 0x2c274707, + 0xab36073c, + 0xab212b49, + 0x45f33538, + 0x5ef225f4, + 0x3c27ff5a, + 0x2b412720, + 0x5bb4073e, + 0x27b91eb3, + 0x412b204c, + 0x3d072c07, + 0x313b245b, + 0xf34532ab, + 0x27ff745e, + 0x4e2b204c, + 0x8c073d07, + 0x8e5b343b, + 0xb51e83ab, + 0x0088fe4e, + 0x1013100c, + 0xfe0e2127, + 0x00004e9e, + 0x10680013, + 0x44be2127, + 0x00130000, + 0x1013fe8e, + 0xfd4ef31e, + 0x271200c8, + 0x1410c8d0, + 0x2cbe2027, + 0xd4860000, + 0xfd8e0013, + 0xd1270013, + 0x13ee10cc, + 0xd6412710, + 0x1ed407d4, + 0x074027e4, + 0x27de1ed4, + 0x00099e21, + 0x9e202700, + 0x4e000003, + 0x3601c2fe, + 0x273310c8, + 0x203c2741, + 0x44471147, + 0xf02101c2, + 0x302707f3, + 0xfe8e26e6, + 0x27ee10cc, + 0x2b012a30, + 0x5334ab01, + 0xd6115341, + 0x0721b642, + 0x66fe8e03, + 0x1e302740, + 0x274127e9, + 0x4ee31e30, + 0x074207f6, + 0x07930782, + 0x533007a2, + 0x4fab102c, + 0xe2073fab, + 0x6007e39b, + 0xb0077107, + 0x0c531407, + 0x9b349b10, + 0x0b430710, + 0x104c53e1, + 0x209be40b, + 0x2e031e02, + 0x07010000, + 0x33b99b4e, + 0xa79b10ec, + 0x07104c53, + 0x073fabd2, + 0x0bba0bce, + 0x07c30bd4, + 0x0b0c071b, + 0xd4f68e1d, + 0x0100000e, + 0x000dd417, + 0x30273a01, + 0x00f9035b, + 0x00018744, + 0x1b204c27, + 0xb0fe0b04, + 0x0000000f, + 0x183c2701, + 0x00f9035b, + 0x00018744, + 0x041b4827, + 0x4c27fe0b, + 0x5b340710, + 0x4400f903, + 0x1b000187, + 0x27fe0b04, + 0xf9035b38, + 0x01874400, + 0x184c2700, + 0xfe0b041b, + 0x4fff1ea7, + 0x9b1401fd, + 0x4103122f, + 0x13c14433, + 0x2e24ab38, + 0x0b002732, + 0xc5f3abfe, + 0x14c13812, + 0xf842ce38, + 0x0127f3eb, + 0xfe4efe0b, + 0x0576d33e, + 0x0e200c27, + 0x00059efe, + 0x4efe8e00, + 0xbeb007fb, + 0x07feca3f, + 0x931007d0, + 0x003e2ff0, + 0xffd0d7be, + 0xc027d746, + 0xd2010b1e, + 0xc9bec103, + 0xd403ffd0, + 0xf0931c07, + 0xda003e21, + 0xfb8eedcb, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x0001a118, + 0x000047eb, + 0x000047eb, + 0x000047eb, + 0x42746e49, + 0x0a3a6675, + 0x6c202000, + 0x5f32676f, + 0x65676170, + 0x7a69735f, + 0x20202065, + 0x5f6d756e, + 0x65676170, + 0x66282073, + 0x29656572, + 0x2020000a, + 0x30252020, + 0x20206432, + 0x20202020, + 0x20202020, + 0x35252020, + 0x28202064, + 0x62206425, + 0x73657479, + 0x55000a29, + 0x6f6c626e, + 0x6e696b63, + 0x65722067, + 0x657a6973, + 0x25203a73, + 0x54000a64, + 0x6c61746f, + 0x6c6c6120, + 0x7461636f, + 0x25206465, + 0x28206438, + 0x64657375, + 0x2c642520, + 0x666e7520, + 0x61656572, + 0x20656c62, + 0x202c6425, + 0x65657266, + 0x29642520, + 0x2a2a000a, + 0x52202a2a, + 0x25435341, + 0x42412064, + 0x2054524f, + 0x2a2a2a2a, + 0x2020000a, + 0x20204350, + 0x203d2020, + 0x30257830, + 0x000a7838, + 0x52532020, + 0x20202020, + 0x7830203d, + 0x78383025, + 0x2020000a, + 0x20524146, + 0x203d2020, + 0x30257830, + 0x000a7838, + 0x5b522020, + 0x5d643225, + 0x30203d20, + 0x38302578, + 0x00000a78, + 0x8d8bc899, + 0x9a9a9a9d, + 0x9ab89a9a, + 0x3fb89a9a, + 0x9a9a9a9a, + 0x9a9a9a9a, + 0x9a9a9a9a, + 0x8a8a999a, + 0x8a5e8d6f, + 0x9a9a9ab6, + 0x8a895c8c, + 0x8b8a988c, + 0x5c954a99, + 0x987a6b8b, + 0xb6a6b38c, + 0xc57ae38c, + 0x7d7c6e6e, + 0x7f7d998c, + 0x8f6f6d8c, + 0x6c4f6f7f, + 0x6e6e3f7b, + 0x998c7d7c, + 0x6d8c7f7d, + 0x6f7f8f6f, + 0x3f7b6c4f, + 0x8d86ab5b, + 0xa788998a, + 0x8b8b9898, + 0x6e7d6f6f, + 0x6c7c5e6e, + 0x8d7d6b7c, + 0x6b7d99b3, + 0x99b38d7d, + 0x8d7d6b7d, + 0x8c7d99b3, + 0x98b6b68b, + 0x99889888, + 0x886f8b88, + 0x00006f8b, + 0x00000000, + 0x8b6bb999, + 0xc9b9c57e, + 0x8b9a959a, + 0x989a9a9a, + 0x4f5f7a6e, + 0x991f1f3f, + 0xc68ca899, + 0x5e8a7c4f, + 0x6b956f99, + 0x9a9a9aa7, + 0xa7c4c49a, + 0xb6a7989a, + 0x889586b6, + 0x89887999, + 0xa7a6c2a9, + 0xb689a79a, + 0x6e5e6e7d, + 0x6f7d4f5f, + 0x6f6e4e6e, + 0x6c5e5f6f, + 0x6e7d6c7b, + 0x4f5f6e5e, + 0x4e6e6f7d, + 0x5f6f6f6e, + 0x6c7b6c5e, + 0x9a3d8c79, + 0x7a5ba76b, + 0x8b8ba76b, + 0x998b9a9b, + 0x3f7b7b8b, + 0x8cb7a699, + 0xa69a9988, + 0x99888cb7, + 0x8cb7a69a, + 0xaa9a9988, + 0x6b7b7b99, + 0xa7796b79, + 0x978cb797, + 0x00008cb7, + 0x00000000, + 0x8b6ba099, + 0xc9b9c57e, + 0x8b9a869a, + 0x98b79a9a, + 0x4f5f899a, + 0x991f1f3f, + 0xc6a9a899, + 0x7aa7e04f, + 0x5c956f99, + 0x9a9a9aa7, + 0xa7a7c49a, + 0xb6a7989a, + 0x889586b6, + 0x7a887999, + 0xa7a6d0a9, + 0xb6a7989a, + 0x6e7c6e7d, + 0x6f7d5e5f, + 0x7e7d4f6f, + 0x6c4f6f6f, + 0x6e7d5d7b, + 0x5e5f6e7c, + 0x4f6f6f7d, + 0x6f6f7e7d, + 0x5d7b6c4f, + 0x9a3d8c79, + 0x6b5ba76b, + 0x8b8ba76b, + 0x998b9aaa, + 0x3f7b7b8b, + 0x8cb7a67c, + 0xa69a9988, + 0x99888cb7, + 0x8cb7a69a, + 0xaa9a9988, + 0x7a8a8a99, + 0xa7797a79, + 0x978cb797, + 0x00008cb7, + 0x00000000, + 0x63617453, + 0x7461206b, + 0x0a702520, + 0x61747300, + 0x25206b63, + 0x3d206434, + 0x25783020, + 0x0a783830, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x2a2a2a2a, + 0x53415220, + 0x20642543, + 0x524f4241, + 0x2a2a2054, + 0x000a2a2a, + 0x43502020, + 0x20202020, + 0x7830203d, + 0x78383025, + 0x2020000a, + 0x20205253, + 0x203d2020, + 0x30257830, + 0x000a7838, + 0x41462020, + 0x20202052, + 0x7830203d, + 0x78383025, + 0x2020000a, + 0x32255b52, + 0x3d205d64, + 0x25783020, + 0x0a783830, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x0000532a, + 0x0000532a, + 0x0000532a, + 0x0000532a, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x20000010, + 0x804000c0, + 0x03008001, + 0x00060100, + 0x80ff080f, + 0xff080f80, + 0x080f8080, + 0x0f8080ff, + 0x8080ff08, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x20000010, + 0x00400080, + 0x02008001, + 0x00040100, + 0x00ff200f, + 0x200f0802, + 0x080200ff, + 0x00ff200f, + 0x200f0802, + 0x080200ff, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x4649424d, + 0x43564548, + 0x00000001, + 0x7478656e, + 0x6369705f, + 0x5f6f745f, + 0x73726170, + 0x20202065, + 0x75252020, + 0x2a2a000a, + 0x25202a2a, + 0x2a2a2073, + 0x50202a2a, + 0x30203a43, + 0x20782578, + 0x52532020, + 0x7830203a, + 0x20207825, + 0x52414620, + 0x7830203a, + 0x000a7825, + 0x255b5220, + 0x205d6432, + 0x7830203d, + 0x78383025, + 0x6d20000a, + 0x65747361, + 0x25232072, + 0x73252064, + 0x6f626120, + 0x64657472, + 0x2020000a, + 0x55414620, + 0x203a544c, + 0x78257830, + 0x2020000a, + 0x44414620, + 0x203a5244, + 0x78257830, + 0x4152000a, + 0x41204353, + 0x54524f42, + 0x554d4d00, + 0x4f424120, + 0x57005452, + 0x68637461, + 0x00676f64, + 0x616e7944, + 0x2063696d, + 0x6e616863, + 0x69206567, + 0x6874206e, + 0x756e2065, + 0x7265626d, + 0x20666f20, + 0x65726f63, + 0x73692073, + 0x746f6e20, + 0x70757320, + 0x74726f70, + 0x52006465, + 0x30435341, + 0x53415200, + 0x52003143, + 0x32435341, + 0x53415200, + 0x52003343, + 0x34435341, + 0x4d445300, + 0x44560041, + 0x5200414d, + 0x00004645, + 0x00034047, + 0x0000f154, + 0x0000f154, + 0x0000f154, + 0x00015073, + 0x00015079, + 0x0001507f, + 0x00015085, + 0x0001508b, + 0x00015091, + 0x00015096, + 0x0001509b, + 0x45444956, + 0x5746204f, + 0x41545320, + 0x44204554, + 0x20504d55, + 0x6f636544, + 0x3d726564, + 0x43564548, + 0x6946000a, + 0x61776d72, + 0x76206572, + 0x69737265, + 0x64206e6f, + 0x2073656f, + 0x20746f6e, + 0x6374616d, + 0x61682068, + 0x61776472, + 0x0a216572, + 0x72694600, + 0x7261776d, + 0x6f632065, + 0x6c69706d, + 0x66206465, + 0x7620726f, + 0x69737265, + 0x30206e6f, + 0x38302578, + 0x48000a78, + 0x77647261, + 0x20657261, + 0x6f706572, + 0x20737472, + 0x20202020, + 0x72657620, + 0x6e6f6973, + 0x25783020, + 0x0a783830, + 0x72694600, + 0x7261776d, + 0x65762065, + 0x6f697372, + 0x6f64206e, + 0x6e207365, + 0x6d20746f, + 0x68637461, + 0x72616820, + 0x72617764, + 0x65762065, + 0x6f697372, + 0x6946006e, + 0x61776d72, + 0x63206572, + 0x69706d6f, + 0x2064656c, + 0x20726f66, + 0x70207325, + 0x69636572, + 0x6e6f6973, + 0x6c736420, + 0x646f6d20, + 0x6c000a65, + 0x4800776f, + 0x77647261, + 0x20657261, + 0x6f706572, + 0x20737472, + 0x20202020, + 0x20732520, + 0x63657270, + 0x6f697369, + 0x7364206e, + 0x6f6d206c, + 0x000a6564, + 0x68676968, + 0x61680020, + 0x61776472, + 0x64206572, + 0x2073656f, + 0x20746f6e, + 0x70707573, + 0x2074726f, + 0x63766568, + 0x5f454c00, + 0x4c525443, + 0x2c78253a, + 0x4f434e20, + 0x3a534552, + 0x202c7825, + 0x5f43494c, + 0x45524f43, + 0x4d554e5f, + 0x2c64253a, + 0x5f574820, + 0x45524f43, + 0x4d554e5f, + 0x2064253a, + 0x6e69000a, + 0x696c6176, + 0x61682064, + 0x61776472, + 0x63206572, + 0x2065726f, + 0x626d756e, + 0x3a737265, + 0x6d756e20, + 0x20726562, + 0x6820666f, + 0x61647261, + 0x63206572, + 0x2065726f, + 0x69207369, + 0x67656c6c, + 0x4e006c61, + 0x6e69206f, + 0x66756274, + 0x61707320, + 0x66206563, + 0x6d20726f, + 0x65747361, + 0x61732072, + 0x61206576, + 0x00616572, + 0x20626f4a, + 0x7373656d, + 0x3a656761, + 0x6d754e20, + 0x20726562, + 0x6320666f, + 0x7365726f, + 0x6e616320, + 0x746f6e20, + 0x20656220, + 0x6f72657a, + 0x6f4a002e, + 0x656d2062, + 0x67617373, + 0x4e203a65, + 0x65626d75, + 0x666f2072, + 0x726f6320, + 0x74207365, + 0x6c206f6f, + 0x65677261, + 0x6f4a002e, + 0x656d2062, + 0x67617373, + 0x55203a65, + 0x7075736e, + 0x74726f70, + 0x66206465, + 0x7367616c, + 0x74657320, + 0x6f4a002e, + 0x656d2062, + 0x67617373, + 0x4e203a65, + 0x65626d75, + 0x666f2072, + 0x61726620, + 0x2073656d, + 0x206f6f74, + 0x6772616c, + 0x6e002e65, + 0x7073206f, + 0x20656361, + 0x6a206e69, + 0x7120626f, + 0x65756575, + 0x54414600, + 0x455f4c41, + 0x524f5252, + 0x444e555f, + 0x4e494645, + 0x46004445, + 0x4c415441, + 0x5252455f, + 0x415f524f, + 0x5f434246, + 0x55504e49, + 0x4f435f54, + 0x50555252, + 0x41460054, + 0x5f4c4154, + 0x4f525245, + 0x46415f52, + 0x525f4342, + 0x435f4645, + 0x5552524f, + 0x46005450, + 0x4c415441, + 0x5252455f, + 0x4c5f524f, + 0x5f444953, + 0x4c525443, + 0x58414d5f, + 0x45524f43, + 0x544f4e5f, + 0x5445535f, + 0x00000000, + 0x00015375, + 0x0001538b, + 0x000153aa, + 0x000153c7, + 0x65666552, + 0x636e6572, + 0x69702065, + 0x72757463, + 0x61742065, + 0x0a656c62, + 0x20646900, + 0x73203a20, + 0x75206174, + 0x72206573, + 0x70206665, + 0x70203179, + 0x63203279, + 0x6620706d, + 0x6d20746d, + 0x705f6962, + 0x20207274, + 0x5f69626d, + 0x65676170, + 0x69732873, + 0x2029657a, + 0x72747020, + 0x706f7420, + 0x746f623a, + 0x3325000a, + 0x203a2064, + 0x20643325, + 0x20643325, + 0x20643325, + 0x20643325, + 0x20643325, + 0x20643325, + 0x20643325, + 0x20207025, + 0x64362520, + 0x29642528, + 0x25202020, + 0x70253a70, + 0x694c000a, + 0x70206576, + 0x75746369, + 0x74206572, + 0x656c6261, + 0x754e000a, + 0x203a206d, + 0x20206425, + 0x646c4f20, + 0x20747365, + 0x000a6425, + 0x20786469, + 0x7473203a, + 0x73752061, + 0x69702065, + 0x20646963, + 0x69666572, + 0x696c2064, + 0x7973656e, + 0x7220636e, + 0x20206665, + 0x6576696c, + 0x73666572, + 0x20202020, + 0x66657220, + 0x63697032, + 0x3325000a, + 0x203a2064, + 0x20643325, + 0x20643325, + 0x33252020, + 0x20202064, + 0x20643325, + 0x36252020, + 0x33252064, + 0x30202064, + 0x38302578, + 0x33252078, + 0x33252064, + 0x33252064, + 0x33252064, + 0x33252064, + 0x33252064, + 0x33252064, + 0x33252064, + 0x33252064, + 0x33252064, + 0x33252064, + 0x33252064, + 0x33252064, + 0x33252064, + 0x33252064, + 0x33252064, + 0x50000a64, + 0x61766972, + 0x72206574, + 0x61626665, + 0x203a6b6e, + 0x6f6c6f63, + 0x78302072, + 0x6d207825, + 0x625f7861, + 0x65666675, + 0x25207372, + 0x626d2075, + 0x75252077, + 0x68626d20, + 0x20752520, + 0x65736162, + 0x6464615f, + 0x78302072, + 0x78383025, + 0x2020000a, + 0x78646920, + 0x61747320, + 0x66657220, + 0x6464615f, + 0x20202072, + 0x2077626d, + 0x68626d20, + 0x2020000a, + 0x75332520, + 0x75332520, + 0x25783020, + 0x0a783830, + 0x6e652800, + 0x666f2064, + 0x69727020, + 0x65746176, + 0x66657220, + 0x6b6e6162, + 0x6d756420, + 0x000a2970, + 0x75736e55, + 0x726f7070, + 0x20646574, + 0x6f736572, + 0x6974756c, + 0x203a6e6f, + 0x2064255b, + 0x64252078, + 0x6f63005d, + 0x70757272, + 0x6c732074, + 0x00656369, + 0x2d746573, + 0x2074706f, + 0x666f7270, + 0x6e696c69, + 0x61203a67, + 0x6d206772, + 0x20747375, + 0x30206562, + 0x20726f20, + 0x65730031, + 0x706f2d74, + 0x73652074, + 0x69706163, + 0x203a676e, + 0x20677261, + 0x7473756d, + 0x20656220, + 0x726f2030, + 0x73003120, + 0x6f2d7465, + 0x6e207470, + 0x20756c61, + 0x6d726f66, + 0x203a7461, + 0x6e6b6e55, + 0x206e776f, + 0x6d726f66, + 0x73007461, + 0x6f2d7465, + 0x6e207470, + 0x20756c61, + 0x6d726f66, + 0x203a7461, + 0x75736e55, + 0x726f7070, + 0x20646574, + 0x6d726f66, + 0x73007461, + 0x6f2d7465, + 0x69207470, + 0x726f6e67, + 0x74732065, + 0x6d616572, + 0x61656820, + 0x73726564, + 0x7261203a, + 0x756d2067, + 0x62207473, + 0x20302065, + 0x3120726f, + 0x74657300, + 0x74706f2d, + 0x61726620, + 0x7220656d, + 0x64726f65, + 0x6e697265, + 0x61203a67, + 0x6d206772, + 0x20747375, + 0x30206562, + 0x20726f20, + 0x65730031, + 0x706f2d74, + 0x6f682074, + 0x70207473, + 0x6f746f72, + 0x206c6f63, + 0x6e697270, + 0x203a7374, + 0x20677261, + 0x7473756d, + 0x20656220, + 0x726f2030, + 0x46003120, + 0x6978656c, + 0x20656c62, + 0x6e776f64, + 0x6c616373, + 0x6f6e2065, + 0x75732074, + 0x726f7070, + 0x20646574, + 0x68207962, + 0x77647261, + 0x00657261, + 0x5f6c7364, + 0x5f736f70, + 0x65646f6d, + 0x6c6e6f20, + 0x76612079, + 0x616c6961, + 0x20656c62, + 0x68206e69, + 0x20686769, + 0x63657270, + 0x6f697369, + 0x6f64206e, + 0x63736e77, + 0x20656c61, + 0x65646f6d, + 0x6e49002e, + 0x66754274, + 0x20000a3a, + 0x676f6c20, + 0x61705f32, + 0x735f6567, + 0x20657a69, + 0x756e2020, + 0x61705f6d, + 0x20736567, + 0x65726628, + 0x000a2965, + 0x20202020, + 0x64323025, + 0x20202020, + 0x20202020, + 0x20202020, + 0x20643525, + 0x64252820, + 0x74796220, + 0x0a297365, + 0x626e5500, + 0x6b636f6c, + 0x20676e69, + 0x69736572, + 0x3a73657a, + 0x0a642520, + 0x746f5400, + 0x61206c61, + 0x636f6c6c, + 0x64657461, + 0x64382520, + 0x73752820, + 0x25206465, + 0x75202c64, + 0x6572666e, + 0x6c626165, + 0x64252065, + 0x7266202c, + 0x25206565, + 0x000a2964, + 0x646e6553, + 0x20676e69, + 0x20666572, + 0x6d617266, + 0x6e752065, + 0x64657375, + 0x64646120, + 0x73736572, + 0x78383025, + 0x6552000a, + 0x76696563, + 0x53206465, + 0x43544957, + 0x52000a48, + 0x69656365, + 0x20646576, + 0x20424f4a, + 0x67616c66, + 0x75253d73, + 0x61726620, + 0x3d73656d, + 0x63207525, + 0x7365726f, + 0x0a75253d, + 0x54455300, + 0x54504f5f, + 0x204e4f49, + 0x6c696166, + 0x203a6465, + 0x000a7325, + 0x2f355600, + 0x482d3756, + 0x44435645, + 0x203a4345, + 0x63655200, + 0x65766569, + 0x45532064, + 0x504f5f54, + 0x4e4f4954, + 0x74616420, + 0x69735f61, + 0x2520657a, + 0x706f2075, + 0x6e695f74, + 0x20786564, + 0x61207525, + 0x30206772, + 0x38302578, + 0x53000a78, + 0x69737365, + 0x6f206e6f, + 0x6f697470, + 0x6320736e, + 0x6f206e61, + 0x20796c6e, + 0x63206562, + 0x676e6168, + 0x69206465, + 0x5453206e, + 0x4550504f, + 0x74732044, + 0x2e657461, + 0x54455300, + 0x54504f5f, + 0x204e4f49, + 0x202c4b4f, + 0x666e6f63, + 0x696d7269, + 0x000a676e, + 0x65636552, + 0x64657669, + 0x4c444920, + 0x43415f45, + 0x47000a4b, + 0x4920746f, + 0x5f454c44, + 0x204b4341, + 0x68746977, + 0x2074756f, + 0x746e6573, + 0x4c444920, + 0x52002e45, + 0x69656365, + 0x20646576, + 0x454c4552, + 0x5f455341, + 0x5f464552, + 0x4d415246, + 0x61642045, + 0x735f6174, + 0x20657a69, + 0x62207525, + 0x65666675, + 0x64615f72, + 0x73657264, + 0x78302073, + 0x78383025, + 0x6572000a, + 0x7361656c, + 0x65722065, + 0x72662066, + 0x3a656d61, + 0x64646120, + 0x73736572, + 0x746f6e20, + 0x206e6920, + 0x696c6176, + 0x65722064, + 0x6e6f6967, + 0x6553002e, + 0x6e69646e, + 0x72662067, + 0x5f656d61, + 0x6f6c6c61, + 0x61705f63, + 0x736d6172, + 0x2077203a, + 0x68207525, + 0x20752520, + 0x63626661, + 0x20752520, + 0x6d207525, + 0x25206962, + 0x6f642075, + 0x63736e77, + 0x64656c61, + 0x6172665f, + 0x775f656d, + 0x68746469, + 0x2c75253d, + 0x6e776f64, + 0x6c616373, + 0x665f6465, + 0x656d6172, + 0x6965685f, + 0x3d746867, + 0x0a2e7525, + 0x6e655300, + 0x676e6964, + 0x71657320, + 0x636e6575, + 0x61705f65, + 0x736d6172, + 0x7830203a, + 0x38302520, + 0x30252078, + 0x000a7838, + 0x646e6553, + 0x20676e69, + 0x66667562, + 0x705f7265, + 0x6d617261, + 0x70797420, + 0x75252065, + 0x7a697320, + 0x7a252065, + 0x53000a75, + 0x20646e65, + 0x65727473, + 0x63206d61, + 0x7572726f, + 0x203a7470, + 0x000a7325, + 0x646e6553, + 0x72747320, + 0x206d6165, + 0x20746f6e, + 0x70707573, + 0x6574726f, + 0x25203a64, + 0x53000a73, + 0x69646e65, + 0x5320676e, + 0x43544957, + 0x5f444548, + 0x000a4e49, + 0x646e6553, + 0x20676e69, + 0x5f424f4a, + 0x55514544, + 0x44455545, + 0x4449000a, + 0x2820454c, + 0x656c6469, + 0x6e65735f, + 0x6f745f74, + 0x736f685f, + 0x75252074, + 0x6e69202c, + 0x5f667562, + 0x20746e63, + 0x202c7525, + 0x6274756f, + 0x635f6675, + 0x2520746e, + 0x000a2975, + 0x61202020, + 0x6c696176, + 0x726f7720, + 0x69207364, + 0x6f63206e, + 0x71206d6d, + 0x65756575, + 0x6d203a73, + 0x25206773, + 0x6e692075, + 0x20667562, + 0x6f207525, + 0x75627475, + 0x75252066, + 0x6573000a, + 0x6e69646e, + 0x65722067, + 0x6e6f7073, + 0x63206573, + 0x2065646f, + 0x000a6425, + 0x646e6553, + 0x20676e69, + 0x434f5250, + 0x45535345, + 0x25000a44, + 0x73252073, + 0x65766d20, + 0x66756220, + 0x20726566, + 0x6d617266, + 0x69282065, + 0x6675626e, + 0x746e635f, + 0x2c752520, + 0x74756f20, + 0x5f667562, + 0x20746e63, + 0x0a297525, + 0x20202000, + 0x736f6820, + 0x61685f74, + 0x656c646e, + 0x25783020, + 0x25783830, + 0x20783830, + 0x72657375, + 0x7461645f, + 0x61745f61, + 0x78302067, + 0x78383025, + 0x78383025, + 0x2020000a, + 0x72662020, + 0x5f656d61, + 0x67616c66, + 0x78302073, + 0x78383025, + 0x706f7420, + 0x20752520, + 0x20746f62, + 0x65207525, + 0x2520736f, + 0x65722075, + 0x7525206a, + 0x2020000a, + 0x6f662020, + 0x74616d72, + 0x25783020, + 0x20783430, + 0x69736976, + 0x20656c62, + 0x25787525, + 0x20000a75, + 0x6d202020, + 0x5f696e69, + 0x6d617266, + 0x20795f65, + 0x2d752528, + 0x0a297525, + 0x20202000, + 0x616c7020, + 0x2073656e, + 0x30257830, + 0x202c7838, + 0x30257830, + 0x000a7838, + 0x20202020, + 0x657a6973, + 0x75252073, + 0x7525202c, + 0x2020000a, + 0x72632020, + 0x2078706f, + 0x63207525, + 0x79706f72, + 0x20752520, + 0x63626661, + 0x735f775f, + 0x75252062, + 0x20752520, + 0x63626661, + 0x7261705f, + 0x20736d61, + 0x30257830, + 0x000a7838, + 0x20202020, + 0x6b656570, + 0x25783020, + 0x25783230, + 0x25783230, + 0x25783230, + 0x0a783230, + 0x20202000, + 0x616c7020, + 0x745f656e, + 0x3020706f, + 0x38302578, + 0x78302078, + 0x78383025, + 0x25783020, + 0x0a783830, + 0x20202000, + 0x616c7020, + 0x625f656e, + 0x3020746f, + 0x38302578, + 0x78302078, + 0x78383025, + 0x25783020, + 0x0a783830, + 0x20202000, + 0x72747320, + 0x73656469, + 0x25202020, + 0x64252064, + 0x0a642520, + 0x20202000, + 0x78616d20, + 0x78752520, + 0x000a7525, + 0x25207325, + 0x766d2073, + 0x75622065, + 0x72656666, + 0x74696220, + 0x65727473, + 0x28206d61, + 0x75626e69, + 0x6e635f66, + 0x75252074, + 0x756f202c, + 0x66756274, + 0x746e635f, + 0x29752520, + 0x2020000a, + 0x69622020, + 0x72747374, + 0x5f6d6165, + 0x67616c66, + 0x78302073, + 0x78383025, + 0x736f6520, + 0x75252066, + 0x666f6520, + 0x20752520, + 0x20736f65, + 0x65207525, + 0x7362666f, + 0x20752520, + 0x74617473, + 0x75252073, + 0x2020000a, + 0x64612020, + 0x30207264, + 0x38302578, + 0x6c612078, + 0x20636f6c, + 0x6f207525, + 0x25206666, + 0x69662075, + 0x25206c6c, + 0x25000a75, + 0x73252073, + 0x65766d20, + 0x66756220, + 0x20726566, + 0x61726170, + 0x6574656d, + 0x74202c72, + 0x20657079, + 0x000a7525, + 0x25207325, + 0x766d2073, + 0x75622065, + 0x72656666, + 0x6e656720, + 0x6c617265, + 0x6e692820, + 0x5f667562, + 0x20746e63, + 0x202c7525, + 0x6274756f, + 0x635f6675, + 0x2520746e, + 0x000a2975, + 0x20202020, + 0x65707974, + 0x2c752520, + 0x6e6f6320, + 0x5f676966, + 0x657a6973, + 0x0a752520, + 0x20202000, + 0x6e6f6320, + 0x20676966, + 0x30257830, + 0x30207832, + 0x32302578, + 0x78302078, + 0x78323025, + 0x25783020, + 0x0a783230, + 0x20202000, + 0x66756220, + 0x5f726566, + 0x20727470, + 0x30257830, + 0x202c7838, + 0x66667562, + 0x735f7265, + 0x20657a69, + 0x000a7525, + 0x74736f48, + 0x69727020, + 0x6220746e, + 0x65666675, + 0x52452072, + 0x2e524f52, + 0x20732520, + 0x6d207325, + 0x62206576, + 0x65666675, + 0x69772072, + 0x75206874, + 0x6f6e6b6e, + 0x63206e77, + 0x2065646f, + 0x000a7525, + 0x00746f47, + 0x5054554f, + 0x53005455, + 0x69646e65, + 0x4900676e, + 0x5455504e, + 0x63655200, + 0x65766965, + 0x554f2064, + 0x54555054, + 0x554c465f, + 0x73204853, + 0x65746174, + 0x20752520, + 0x7074756f, + 0x625f7475, + 0x6b636f6c, + 0x25206465, + 0x4f000a75, + 0x75707475, + 0x6c662074, + 0x20687375, + 0x796c6e6f, + 0x6c6c6120, + 0x6465776f, + 0x65687720, + 0x7473206e, + 0x6570706f, + 0x6f202c64, + 0x66612072, + 0x20726574, + 0x70736572, + 0x65736e6f, + 0x45535f20, + 0x4e455551, + 0x505f4543, + 0x4d415241, + 0x52455445, + 0x65530053, + 0x6e69646e, + 0x554f2067, + 0x54555054, + 0x554c465f, + 0x44454853, + 0x6553000a, + 0x6e69646e, + 0x4e492067, + 0x5f545550, + 0x53554c46, + 0x0a444548, + 0x63655200, + 0x65766965, + 0x4e492064, + 0x5f545550, + 0x53554c46, + 0x49000a48, + 0x5455504e, + 0x554c465f, + 0x6f204853, + 0x20796c6e, + 0x6f6c6c61, + 0x20646577, + 0x6e656877, + 0x206e6920, + 0x504f5453, + 0x20444550, + 0x74617473, + 0x52002e65, + 0x69656365, + 0x20646576, + 0x000a4f47, + 0x5f45564d, + 0x55514552, + 0x5f545345, + 0x45444f43, + 0x3a4f475f, + 0x70204120, + 0x69766572, + 0x2073756f, + 0x74617473, + 0x72742065, + 0x69736e61, + 0x6e6f6974, + 0x20736920, + 0x6c697473, + 0x6570206c, + 0x6e69646e, + 0x4e002e67, + 0x6f6a206f, + 0x6e692062, + 0x626f6a20, + 0x65757120, + 0x002e6575, + 0x65636552, + 0x64657669, + 0x4f545320, + 0x4d000a50, + 0x525f4556, + 0x45555145, + 0x435f5453, + 0x5f45444f, + 0x504f5453, + 0x2041203a, + 0x76657270, + 0x73756f69, + 0x61747320, + 0x74206574, + 0x736e6172, + 0x6f697469, + 0x7369206e, + 0x69747320, + 0x70206c6c, + 0x69646e65, + 0x002e676e, + 0x6e616843, + 0x73206567, + 0x65746174, + 0x206f7420, + 0x000a6425, + 0x646e6553, + 0x20676e69, + 0x54415453, + 0x48435f45, + 0x45474e41, + 0x77656e20, + 0x6174735f, + 0x253d6574, + 0x53000a75, + 0x65746174, + 0x61686320, + 0x2065676e, + 0x646e6570, + 0x20676e69, + 0x74617473, + 0x64253d65, + 0x6e657020, + 0x676e6964, + 0x0a64253d, + 0x63655200, + 0x65766965, + 0x55442064, + 0x000a504d, + 0x5f45564d, + 0x55514552, + 0x5f545345, + 0x45444f43, + 0x4d55445f, + 0x6f6e2050, + 0x6c612074, + 0x65776f6c, + 0x6f662064, + 0x72702072, + 0x6365746f, + 0x20646574, + 0x73736573, + 0x736e6f69, + 0x626e002e, + 0x75622072, + 0x72656666, + 0x65682073, + 0x203a646c, + 0x69207525, + 0x7475706e, + 0x20752520, + 0x7074756f, + 0x000a7475, + 0x69617661, + 0x6f77206c, + 0x20736472, + 0x63206e69, + 0x206d6d6f, + 0x75657571, + 0x203a7365, + 0x2067736d, + 0x69207525, + 0x6675626e, + 0x20752520, + 0x6274756f, + 0x25206675, + 0x52000a75, + 0x69656365, + 0x20646576, + 0x474e4950, + 0x6552000a, + 0x76696563, + 0x44206465, + 0x47554245, + 0x736d202c, + 0x643e2d67, + 0x5f617461, + 0x657a6973, + 0x2c64253d, + 0x76656c20, + 0x253d6c65, + 0x63000a64, + 0x2065646f, + 0x6425203d, + 0x7254000a, + 0x69736e61, + 0x6e6f6974, + 0x46494620, + 0x766f204f, + 0x6c667265, + 0x5500776f, + 0x7075736e, + 0x74726f70, + 0x6d206465, + 0x61737365, + 0x63206567, + 0x2e65646f, + 0x69424d00, + 0x206f666e, + 0x7074756f, + 0x6e207475, + 0x6120746f, + 0x776f6c6c, + 0x66206465, + 0x7020726f, + 0x65746f72, + 0x64657463, + 0x73657320, + 0x6e6f6973, + 0x6142002e, + 0x424d2064, + 0x6f666e69, + 0x74756f20, + 0x3b747570, + 0x78616d20, + 0x7a69735f, + 0x73282065, + 0x64697274, + 0x5d305b65, + 0x756d2029, + 0x62207473, + 0x6f6e2065, + 0x656e2d6e, + 0x69746167, + 0x000a6576, + 0x20646142, + 0x6e69424d, + 0x6f206f66, + 0x75707475, + 0x75203b74, + 0x5f646573, + 0x657a6973, + 0x73756d20, + 0x6f6e2074, + 0x65622074, + 0x72616c20, + 0x20726567, + 0x6e616874, + 0x78616d20, + 0x7a69735f, + 0x4d000a65, + 0x666e6942, + 0x756f206f, + 0x74757074, + 0x66756220, + 0x20726566, + 0x20736168, + 0x656c6c69, + 0x206c6167, + 0x61636f6c, + 0x6e6f6974, + 0x64614200, + 0x69424d20, + 0x206f666e, + 0x7074756f, + 0x62207475, + 0x65666675, + 0x4e002e72, + 0x7573206f, + 0x726f7070, + 0x6f662074, + 0x68742072, + 0x62207369, + 0x65666675, + 0x6f632072, + 0x20726f6c, + 0x6d726f66, + 0x002e7461, + 0x64726168, + 0x65726177, + 0x656f6420, + 0x6f6e2073, + 0x75732074, + 0x726f7070, + 0x46412074, + 0x6f204342, + 0x75707475, + 0x61680074, + 0x61776472, + 0x64206572, + 0x2073656f, + 0x20746f6e, + 0x70707573, + 0x2074726f, + 0x5f45564d, + 0x4d524f46, + 0x595f5441, + 0x32345655, + 0x30505f30, + 0x54003031, + 0x20736968, + 0x65727473, + 0x6e206d61, + 0x73646565, + 0x206e6120, + 0x65746e69, + 0x63616c72, + 0x62206465, + 0x65666675, + 0x54002e72, + 0x20736968, + 0x65727473, + 0x6e206d61, + 0x73646565, + 0x6e206120, + 0x692d6e6f, + 0x7265746e, + 0x6563616c, + 0x75622064, + 0x72656666, + 0x694d002e, + 0x726f7272, + 0x20676e69, + 0x6e207369, + 0x7320746f, + 0x6f707075, + 0x64657472, + 0x726f6620, + 0x63656420, + 0x2e65646f, + 0x74694200, + 0x74706564, + 0x666f2068, + 0x42464120, + 0x756f2043, + 0x74757074, + 0x66756220, + 0x20726566, + 0x7473756d, + 0x20656220, + 0x622d3031, + 0x62207469, + 0x75616365, + 0x6f206573, + 0x65642066, + 0x65646f63, + 0x74732064, + 0x6d616572, + 0x6942002e, + 0x70656474, + 0x6f206874, + 0x46412066, + 0x6f204342, + 0x75707475, + 0x75622074, + 0x72656666, + 0x73756d20, + 0x65622074, + 0x622d3820, + 0x62207469, + 0x75616365, + 0x6f206573, + 0x65642066, + 0x65646f63, + 0x74732064, + 0x6d616572, + 0x4641002e, + 0x66204342, + 0x616d726f, + 0x756d2074, + 0x62207473, + 0x3a342065, + 0x20323a32, + 0x636e6973, + 0x65642065, + 0x65646f63, + 0x74732064, + 0x6d616572, + 0x2e736920, + 0x42464100, + 0x6f662043, + 0x74616d72, + 0x73756d20, + 0x65622074, + 0x323a3420, + 0x7320303a, + 0x65636e69, + 0x63656420, + 0x6465646f, + 0x72747320, + 0x206d6165, + 0x002e7369, + 0x61746f52, + 0x6e6f6974, + 0x20736920, + 0x20746f6e, + 0x70707573, + 0x6574726f, + 0x6f662064, + 0x46412072, + 0x62204342, + 0x65666675, + 0x002e7372, + 0x43424641, + 0x776f6420, + 0x6163736e, + 0x676e696c, + 0x746f6e20, + 0x70757320, + 0x74726f70, + 0x66206465, + 0x6920726f, + 0x7265746e, + 0x6563616c, + 0x74732064, + 0x6d616572, + 0x6e490073, + 0x696c6176, + 0x63732064, + 0x6e696c61, + 0x65732067, + 0x6f662074, + 0x46412072, + 0x62204342, + 0x65666675, + 0x6d202c72, + 0x20747375, + 0x30206562, + 0x20726f20, + 0x46002e31, + 0x6420726f, + 0x736e776f, + 0x696c6163, + 0x202c676e, + 0x43424641, + 0x616c7020, + 0x3120656e, + 0x20736920, + 0x20746f6e, + 0x76206e69, + 0x64696c61, + 0x6d656d20, + 0x2079726f, + 0x69676572, + 0x002e6e6f, + 0x43424641, + 0x616c7020, + 0x3120656e, + 0x7a697320, + 0x68732065, + 0x646c756f, + 0x746f6e20, + 0x20656220, + 0x6f72657a, + 0x4641002e, + 0x70204342, + 0x656e616c, + 0x69203020, + 0x6f6e2073, + 0x6e692074, + 0x6c617620, + 0x6d206469, + 0x726f6d65, + 0x65722079, + 0x6e6f6967, + 0x4641002e, + 0x70204342, + 0x656e616c, + 0x73203020, + 0x20657a69, + 0x756f6873, + 0x6e20646c, + 0x6220746f, + 0x657a2065, + 0x002e6f72, + 0x20726f46, + 0x65746e69, + 0x63616c72, + 0x41202c65, + 0x20434246, + 0x6e616c70, + 0x20312065, + 0x6e207369, + 0x6920746f, + 0x6176206e, + 0x2064696c, + 0x6f6d656d, + 0x72207972, + 0x6f696765, + 0x46002e6e, + 0x6920726f, + 0x7265746e, + 0x6563616c, + 0x6661202c, + 0x775f6362, + 0x68746469, + 0x5f6e695f, + 0x65707573, + 0x6f6c6272, + 0x20736b63, + 0x7473756d, + 0x20656220, + 0x20656874, + 0x656d6173, + 0x726f6620, + 0x746f6220, + 0x6c702068, + 0x73656e61, + 0x4641002e, + 0x74204342, + 0x64656c69, + 0x61656820, + 0x20726564, + 0x75716572, + 0x73657269, + 0x6c697420, + 0x62206465, + 0x2e79646f, + 0x42464100, + 0x32332043, + 0x73203878, + 0x72657075, + 0x636f6c62, + 0x6e20736b, + 0x7320746f, + 0x6f707075, + 0x64657472, + 0x726f6620, + 0x63656420, + 0x2065646f, + 0x7074756f, + 0x43007475, + 0x6e206e61, + 0x7520746f, + 0x34206573, + 0x323a323a, + 0x66756220, + 0x20726566, + 0x73206669, + 0x61657274, + 0x7369206d, + 0x323a3420, + 0x002e303a, + 0x61766e49, + 0x2064696c, + 0x6c616373, + 0x20676e69, + 0x20746573, + 0x20726f66, + 0x6e616c70, + 0x62207261, + 0x65666675, + 0x6d002e72, + 0x665f7861, + 0x656d6172, + 0x6469775f, + 0x73206874, + 0x6c756f68, + 0x65622064, + 0x72616c20, + 0x20726567, + 0x6e616874, + 0x72657a20, + 0x6d002e6f, + 0x665f7861, + 0x656d6172, + 0x6965685f, + 0x20746867, + 0x756f6873, + 0x6220646c, + 0x616c2065, + 0x72656772, + 0x61687420, + 0x657a206e, + 0x002e6f72, + 0x75736e55, + 0x726f7070, + 0x20646574, + 0x6e616c70, + 0x62207261, + 0x65666675, + 0x6f632072, + 0x20726f6c, + 0x6d726f66, + 0x002e7461, + 0x69727453, + 0x74206564, + 0x73206f6f, + 0x6c6c616d, + 0x206f7420, + 0x646c6f68, + 0x78616d20, + 0x6172665f, + 0x775f656d, + 0x68746469, + 0x6c70002e, + 0x5f656e61, + 0x20706f74, + 0x7473756d, + 0x20656220, + 0x6d206e69, + 0x726f6d65, + 0x65722079, + 0x6e6f6967, + 0x41524620, + 0x5542454d, + 0x70002e46, + 0x656e616c, + 0x746f625f, + 0x73756d20, + 0x65622074, + 0x206e6920, + 0x6f6d656d, + 0x72207972, + 0x6f696765, + 0x5246206e, + 0x42454d41, + 0x002e4655, + 0x6e616c70, + 0x6f625f65, + 0x68732074, + 0x646c756f, + 0x20656220, + 0x6f72657a, + 0x726f6620, + 0x6e6f6e20, + 0x746e692d, + 0x616c7265, + 0x20646563, + 0x65727473, + 0x002e6d61, + 0x72646441, + 0x20737365, + 0x7520666f, + 0x6573756e, + 0x6c702064, + 0x20656e61, + 0x756f6873, + 0x6220646c, + 0x657a2065, + 0x002e6f72, + 0x69727453, + 0x6f206564, + 0x6e752066, + 0x64657375, + 0x616c7020, + 0x7320656e, + 0x6c756f68, + 0x65622064, + 0x72657a20, + 0x52002e6f, + 0x7461746f, + 0x206e6f69, + 0x206e6163, + 0x20746f6e, + 0x64206562, + 0x20656e6f, + 0x20726f66, + 0x3a323a34, + 0x57002e32, + 0x48435441, + 0x20474f44, + 0x00717269, + 0x2a2a2a2a, + 0x53415220, + 0x20642543, + 0x524f4241, + 0x2a2a2054, + 0x000a2a2a, + 0x43502020, + 0x20202020, + 0x7830203d, + 0x78383025, + 0x2020000a, + 0x20205253, + 0x203d2020, + 0x30257830, + 0x000a7838, + 0x41462020, + 0x20202052, + 0x7830203d, + 0x78383025, + 0x2020000a, + 0x32255b52, + 0x3d205d64, + 0x25783020, + 0x0a783830, + 0x766e4900, + 0x64696c61, + 0x66756220, + 0x20726566, + 0x4d206e69, + 0x435f4556, + 0x5f4d4d4f, + 0x5f465542, + 0x5f514e49, + 0x52444441, + 0x78652820, + 0x74636570, + 0x6d206465, + 0x625f6576, + 0x65666675, + 0x69625f72, + 0x72747374, + 0x296d6165, + 0x6e49002e, + 0x696c6176, + 0x6e692064, + 0x20747570, + 0x66667562, + 0x002e7265, + 0x78656c46, + 0x656c6269, + 0x776f6420, + 0x6163736e, + 0x6e20656c, + 0x7320746f, + 0x6f707075, + 0x64657472, + 0x20796220, + 0x64726168, + 0x65726177, + 0x6143002e, + 0x6f6e206e, + 0x73752074, + 0x2d2d2065, + 0x6e776f64, + 0x6163735f, + 0x5820656c, + 0x74697720, + 0x2d2d2068, + 0x5f6c7364, + 0x69746172, + 0x6f685f6f, + 0x65762f72, + 0x6e612072, + 0x73642064, + 0x72665f6c, + 0x5f656d61, + 0x74646977, + 0x65682f68, + 0x74686769, + 0x20746120, + 0x656d6173, + 0x6d697420, + 0x43002e65, + 0x6e206e61, + 0x7520746f, + 0x2d206573, + 0x6c73642d, + 0x7461725f, + 0x685f6f69, + 0x762f726f, + 0x58207265, + 0x74697720, + 0x73642068, + 0x72665f6c, + 0x5f656d61, + 0x74646977, + 0x65682f68, + 0x74686769, + 0x20746120, + 0x656d6173, + 0x6d697420, + 0x66002e65, + 0x6978656c, + 0x20656c62, + 0x6e776f64, + 0x6c616373, + 0x20676e69, + 0x75736e75, + 0x726f7070, + 0x20646574, + 0x75706e69, + 0x65722074, + 0x756c6f73, + 0x6e6f6974, + 0x61687420, + 0x656c2074, + 0x74207373, + 0x206e6168, + 0x41002e32, + 0x2c434246, + 0x20726f20, + 0x2c746f6e, + 0x73756d20, + 0x65622074, + 0x65737520, + 0x6f632064, + 0x7369736e, + 0x746e6574, + 0x6420796c, + 0x6e697275, + 0x65642067, + 0x65646f63, + 0x49424d00, + 0x204f464e, + 0x7074756f, + 0x202c7475, + 0x6e20726f, + 0x202c746f, + 0x7473756d, + 0x20656220, + 0x64657375, + 0x6e6f6320, + 0x74736973, + 0x6c746e65, + 0x75642079, + 0x676e6972, + 0x63656420, + 0x0065646f, + 0x61766e49, + 0x2064696c, + 0x5f65766d, + 0x66667562, + 0x675f7265, + 0x72656e65, + 0x69206c61, + 0x564d206e, + 0x4f435f45, + 0x425f4d4d, + 0x4f5f4655, + 0x5f515455, + 0x52444441, + 0x6950002e, + 0x70206570, + 0x75746369, + 0x6a206572, + 0x6120626f, + 0x6165726c, + 0x68207964, + 0x61207361, + 0x564d206e, + 0x55425f45, + 0x52454646, + 0x444f435f, + 0x45475f45, + 0x4152454e, + 0x6568204c, + 0x72656461, + 0x73736120, + 0x6169636f, + 0x20646574, + 0x68746977, + 0x00746920, + 0x75736e55, + 0x726f7070, + 0x20646574, + 0x65707974, + 0x20666f20, + 0x5f65766d, + 0x66667562, + 0x675f7265, + 0x72656e65, + 0x62206c61, + 0x65666675, + 0x6e692072, + 0x74756f20, + 0x20747570, + 0x75657571, + 0x49002e65, + 0x6c61766e, + 0x62206469, + 0x65666675, + 0x6e692072, + 0x45564d20, + 0x4d4f435f, + 0x55425f4d, + 0x554f5f46, + 0x415f5154, + 0x20524444, + 0x70786528, + 0x65746365, + 0x766d2064, + 0x75625f65, + 0x72656666, + 0x6172665f, + 0x6f20656d, + 0x766d2072, + 0x75625f65, + 0x72656666, + 0x6e65675f, + 0x6c617265, + 0x44002e29, + 0x203a4250, + 0x5f6d756e, + 0x6d617266, + 0x253d7365, + 0x73752064, + 0x3d656761, + 0x30257830, + 0x64207838, + 0x665f6270, + 0x6e6c6c75, + 0x3d737365, + 0x6c206425, + 0x5f657669, + 0x5f666572, + 0x70736964, + 0x73616d5f, + 0x78303d6b, + 0x000a7825, + 0x3a425044, + 0x64322520, + 0x6469203a, + 0x32253d78, + 0x69642064, + 0x616c7073, + 0x726f5f79, + 0x3d726564, + 0x20643625, + 0x73756c66, + 0x64253d68, + 0x6e657020, + 0x676e6964, + 0x2064253d, + 0x66667562, + 0x755f7265, + 0x3d646573, + 0x6e206425, + 0x756f5f6f, + 0x74757074, + 0x2064253d, + 0x725f7369, + 0x253d6665, + 0x61742064, + 0x74656772, + 0x3d64695f, + 0x000a6425, + 0x7373696d, + 0x20676e69, + 0x74726170, + 0x666f2073, + 0x61726620, + 0x4900656d, + 0x6c61766e, + 0x62206469, + 0x65666675, + 0x6e692072, + 0x45564d20, + 0x4d4f435f, + 0x55425f4d, + 0x4e495f46, + 0x44415f51, + 0x28205244, + 0x65707865, + 0x64657463, + 0x65766d20, + 0x6675625f, + 0x5f726566, + 0x73746962, + 0x61657274, + 0x002e296d, + 0x64616568, + 0x70207265, + 0x65737261, + 0x72726520, + 0x202c726f, + 0x3a434950, + 0x5d64255b, + 0x5244492c, + 0x64255b3a, + 0x52462c5d, + 0x3a454d41, + 0x5d64255b, + 0x5444552c, + 0x2578305b, + 0x25783830, + 0x5d783830, + 0x72747300, + 0x206d6165, + 0x64746962, + 0x68747065, + 0x746f6e20, + 0x70757320, + 0x74726f70, + 0x62206465, + 0x61682079, + 0x61776472, + 0x70006572, + 0x64206369, + 0x6e656d69, + 0x6e6f6973, + 0x756f2073, + 0x666f2074, + 0x6e617220, + 0x75006567, + 0x7075736e, + 0x74726f70, + 0x63206465, + 0x6d6f7268, + 0x6f665f61, + 0x74616d72, + 0x6364695f, + 0x53505300, + 0x6157203a, + 0x6e696e72, + 0x53203a67, + 0x61657274, + 0x7375206d, + 0x6d207365, + 0x2065726f, + 0x65666572, + 0x636e6572, + 0x72662065, + 0x73656d61, + 0x61687420, + 0x7270206e, + 0x6c69666f, + 0x65702065, + 0x74696d72, + 0x25282073, + 0x203e2064, + 0x0a296425, + 0x00000000, + 0x00009000, + 0x0001e000, + 0x0003c000, + 0x0001e000, + 0x0003c000, + 0x0003c000, + 0x00087000, + 0x000f0000, + 0x000f0000, + 0x00220000, + 0x00220000, + 0x00220000, + 0x00880000, + 0x00880000, + 0x00880000, + 0x02200000, + 0x02200000, + 0x02200000, + 0x3a535050, + 0x70784520, + 0x65746365, + 0x65722064, + 0x65726566, + 0x6465636e, + 0x53505020, + 0x20642520, + 0x62206f74, + 0x61762065, + 0x0a64696c, + 0x00000000, + 0x02060606, + 0x40404010, + 0x75736e55, + 0x726f7070, + 0x20646574, + 0x6f736572, + 0x6974756c, + 0x00006e6f, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x2d746573, + 0x2074706f, + 0x63766568, + 0x3a636564, + 0x736e5520, + 0x6f707075, + 0x64657472, + 0x74706f20, + 0x006e6f69, + 0x3a535052, + 0x202d2d20, + 0x65666552, + 0x636e6572, + 0x61422065, + 0x53206b6e, + 0x65746174, + 0x0a2d2d20, + 0x53505200, + 0x6572203a, + 0x73755f66, + 0x6d5f6465, + 0x3a6b7361, + 0x20202020, + 0x20202020, + 0x25783020, + 0x0a783830, + 0x53505200, + 0x6572203a, + 0x61765f66, + 0x5f64696c, + 0x6b73616d, + 0x2020203a, + 0x20202020, + 0x25783020, + 0x0a783830, + 0x53505200, + 0x6572203a, + 0x6f6e5f66, + 0x78655f6e, + 0x69747369, + 0x6d5f676e, + 0x3a6b7361, + 0x25783020, + 0x0a783830, + 0x53505200, + 0x6174203a, + 0x74656772, + 0x6172665f, + 0x203a656d, + 0x20202020, + 0x20202020, + 0x0a642520, + 0x53505200, + 0x6174203a, + 0x74656772, + 0x636f705f, + 0x2020203a, + 0x20202020, + 0x20202020, + 0x0a642520, + 0x53505200, + 0x616d203a, + 0x65725f78, + 0x72665f66, + 0x73656d61, + 0x2020203a, + 0x20202020, + 0x0a642520, + 0x53505200, + 0x6552203a, + 0x73552066, + 0x3a656761, + 0x50520020, + 0x52203a53, + 0x50206665, + 0x3a73434f, + 0x7c200020, + 0x202c0020, + 0x53505200, + 0x202d203a, + 0x20535052, + 0x74617473, + 0x0a2d2065, + 0x53505200, + 0x7563203a, + 0x635f7272, + 0x746e756f, + 0x2020203a, + 0x20202020, + 0x20202020, + 0x0a642520, + 0x53505200, + 0x7563203a, + 0x6e5f7272, + 0x635f6765, + 0x746e756f, + 0x2020203a, + 0x20202020, + 0x0a642520, + 0x53505200, + 0x6f66203a, + 0x635f6c6c, + 0x746e756f, + 0x2020203a, + 0x20202020, + 0x20202020, + 0x0a642520, + 0x53505200, + 0x7563203a, + 0x6c5f7272, + 0x6f635f74, + 0x3a746e75, + 0x20202020, + 0x20202020, + 0x0a642520, + 0x53505200, + 0x6f66203a, + 0x6c5f6c6c, + 0x6f635f74, + 0x3a746e75, + 0x20202020, + 0x20202020, + 0x0a642520, + 0x53505200, + 0x7563203a, + 0x645f7272, + 0x61746c65, + 0x636f705f, + 0x62736d5f, + 0x6572705f, + 0x746e6573, + 0x73616d5f, + 0x30203a6b, + 0x38302578, + 0x52000a78, + 0x203a5350, + 0x6c6c6f66, + 0x6c65645f, + 0x705f6174, + 0x6d5f636f, + 0x705f6273, + 0x65736572, + 0x6d5f746e, + 0x3a6b7361, + 0x25783020, + 0x0a783830, + 0x53505200, + 0x6853203a, + 0x2074726f, + 0x6d726574, + 0x66657220, + 0x00203a73, + 0x202c6425, + 0x53505200, + 0x6f4c203a, + 0x7420676e, + 0x206d7265, + 0x73666572, + 0x7500203a, + 0x74544c53, + 0x61745300, + 0x61206b63, + 0x70252074, + 0x7473000a, + 0x206b6361, + 0x20643425, + 0x7830203d, + 0x78383025, + 0x0000000a, + 0x2a2a2a2a, + 0x53415220, + 0x20642543, + 0x524f4241, + 0x2a2a2054, + 0x000a2a2a, + 0x43502020, + 0x20202020, + 0x7830203d, + 0x78383025, + 0x2020000a, + 0x20205253, + 0x203d2020, + 0x30257830, + 0x000a7838, + 0x41462020, + 0x20202052, + 0x7830203d, + 0x78383025, + 0x2020000a, + 0x32255b52, + 0x3d205d64, + 0x25783020, + 0x0a783830, + 0x73657200, + 0x61756469, + 0x3020736c, + 0x20702578, + 0x78257830, + 0x0000000a, + 0x0000f708, + 0x0000f708, + 0x0000f708, + 0x0000f708, + 0x00000000, + 0x00000003, + 0x00000001, + 0x00000004, + 0x00000002, + 0x00000005, + 0x75736e55, + 0x726f7070, + 0x20646574, + 0x6e776f64, + 0x6c616373, + 0x20676e69, + 0x69746172, + 0x4600216f, + 0x6978656c, + 0x20656c62, + 0x6e776f44, + 0x6c616373, + 0x20676e69, + 0x73656f64, + 0x746f6e20, + 0x70757320, + 0x74726f70, + 0x6c697420, + 0x6f206465, + 0x75707475, + 0x6f662074, + 0x74616d72, + 0x6c46002e, + 0x64207865, + 0x63206c73, + 0x20706f72, + 0x6f727265, + 0x636f2072, + 0x72727563, + 0x202c6465, + 0x61656c70, + 0x66206573, + 0x69207869, + 0x2a002174, + 0x202a2a2a, + 0x43534152, + 0x41206425, + 0x54524f42, + 0x2a2a2a20, + 0x20000a2a, + 0x20435020, + 0x3d202020, + 0x25783020, + 0x0a783830, + 0x53202000, + 0x20202052, + 0x30203d20, + 0x38302578, + 0x20000a78, + 0x52414620, + 0x3d202020, + 0x25783020, + 0x0a783830, + 0x52202000, + 0x6432255b, + 0x203d205d, + 0x30257830, + 0x000a7838, + 0x000111d6, + 0x000111d6, + 0x000111d6, + 0x000111d6, + 0x33323130, + 0x37363534, + 0x00003938, + 0x33323130, + 0x37363534, + 0x62613938, + 0x66656463, + 0x72726f43, + 0x65747075, + 0x6e692064, + 0x20747570, + 0x75657571, + 0x4f002e65, + 0x20796c6e, + 0x5f45564d, + 0x46465542, + 0x435f5245, + 0x5f45444f, + 0x4d415246, + 0x726f2045, + 0x45564d20, + 0x4655425f, + 0x5f524546, + 0x45444f43, + 0x4e45475f, + 0x4c415245, + 0x6c6c6120, + 0x6465776f, + 0x6e49002e, + 0x696c6176, + 0x75622064, + 0x72656666, + 0x61656820, + 0x20726564, + 0x4d206e69, + 0x435f4556, + 0x5f4d4d4f, + 0x5f465542, + 0x5154554f, + 0x4444415f, + 0x54002e52, + 0x6c206f6f, + 0x65677261, + 0x71657220, + 0x74736575, + 0x73656d20, + 0x65676173, + 0x6f54002e, + 0x616c206f, + 0x20656772, + 0x66667562, + 0x6d207265, + 0x61737365, + 0x002e6567, + 0x61766e49, + 0x2064696c, + 0x66667562, + 0x69207265, + 0x564d206e, + 0x4f435f45, + 0x425f4d4d, + 0x495f4655, + 0x415f514e, + 0x2e524444, + 0x45564d00, + 0x723a5052, + 0x705f6d61, + 0x746e6972, + 0x20667562, + 0x6e207369, + 0x6120746f, + 0x6c696176, + 0x656c6261, + 0x4d000a2e, + 0x50524556, + 0x6172203a, + 0x72705f6d, + 0x66746e69, + 0x6d75645f, + 0x72662070, + 0x30206d6f, + 0x0a702578, + 0x54505200, + 0x504d5544, + 0x616c663a, + 0x78253d67, + 0x6e69202c, + 0x3d786564, + 0x202c7525, + 0x635f7277, + 0x253d746e, + 0x72202c75, + 0x6e635f64, + 0x75253d74, + 0x46000a2e, + 0x75252d57, + 0x7325203a, + 0x45564d00, + 0x663a5052, + 0x3d67616c, + 0x202c7825, + 0x3d786469, + 0x202c7525, + 0x635f7277, + 0x253d746e, + 0x72202c75, + 0x6e635f64, + 0x75253d74, + 0x20000a2e, + 0x78343025, + 0x78382500, + 0x0a73253a, + 0x30252000, + 0x00007832, + 0x1007f000, + 0x49574558, + 0x35565644, + 0x2d37562f, + 0x43564548, + 0x3a434544, + 0x65720020, + 0x657a6973, + 0x7470203a, + 0x78302072, + 0x78383025, + 0x77656e20, + 0x7a69735f, + 0x75252065, + 0x766d000a, + 0x656d5f65, + 0x65725f6d, + 0x657a6973, + 0x6c616d00, + 0x3a636f6c, + 0x7a697320, + 0x75252065, + 0x616d202c, + 0x75252078, + 0x6572202c, + 0x6e6f6967, + 0x2c752520, + 0x676f6c20, + 0x6c615f32, + 0x206e6769, + 0x000a7525, + 0x6c6c616d, + 0x203a636f, + 0x75746572, + 0x64656e72, + 0x25783020, + 0x6d000a70, + 0x6d5f6576, + 0x615f6d65, + 0x636f6c6c, + 0x6c6c4100, + 0x7461636f, + 0x6d206465, + 0x726f6d65, + 0x61682079, + 0x72772073, + 0x20676e6f, + 0x67696c61, + 0x6e656d6e, + 0x78450074, + 0x74636570, + 0x61206465, + 0x636f6c6c, + 0x64657461, + 0x6d656d20, + 0x2079726f, + 0x50206e69, + 0x45544f52, + 0x44455443, + 0x67657220, + 0x2e6e6f69, + 0x70784500, + 0x65746365, + 0x6c612064, + 0x61636f6c, + 0x20646574, + 0x6f6d656d, + 0x69207972, + 0x5246206e, + 0x42454d41, + 0x72204655, + 0x6f696765, + 0x52002e6e, + 0x3a435341, + 0x20642520, + 0x2d2d2d2d, + 0x2d2d2d2d, + 0x2d2d2d2d, + 0x2d2d2d2d, + 0x6e756620, + 0x6f697463, + 0x2d2d206e, + 0x6c616320, + 0x2d20736c, + 0x7963202d, + 0x73656c63, + 0x61202d20, + 0x61726576, + 0x2d206567, + 0x202d2d2d, + 0x0a78616d, + 0x33252c00, + 0x202c7333, + 0x34252020, + 0x20202c64, + 0x2c753725, + 0x37252020, + 0x20202c75, + 0x0a753725, + 0x25732500, + 0x73255b73, + 0x25783020, + 0x5d783830, + 0x7325000a, + 0x2f5b7325, + 0x25207325, + 0x000a5d64, + 0x73257325, + 0x5d73255b, + 0x7325000a, + 0x73257325, + 0x25783000, + 0x00783830, + 0x25006425, + 0x00202c64, + 0x78343025, + 0x30250020, + 0x00207838, + 0x78323025, + 0x00000020, + 0x00045c20, + 0x00045ca0, + 0x00045d20, + 0x00045da0, + 0x00045e20, + 0x00017837, + 0x09090909, + 0x09090909, + 0x09090909, + 0x00090909, + 0x20746f6e, + 0x74696177, + 0x00676e69, + 0x3d3d3d3d, + 0x3d3d3d3d, + 0x44563d3d, + 0x525f414d, + 0x445f4745, + 0x3d504d55, + 0x3d3d3d3d, + 0x0a3d3d3d, + 0x34302500, + 0x78302864, + 0x78343025, + 0x20202029, + 0x25783020, + 0x0a783830, + 0x20732500, + 0x656c6469, + 0x6379635f, + 0x0a73656c, + 0x20732500, + 0x38312d25, + 0x31252073, + 0x000a6435, + 0x54207325, + 0x6c61746f, + 0x6c64695f, + 0x20202065, + 0x20202020, + 0x35312520, + 0x63000a64, + 0x2065726f, + 0x25206425, + 0x2d252073, + 0x20733032, + 0x65646f63, + 0x6433253d, + 0x63697020, + 0x6433253d, + 0x736f7020, + 0x5d75705b, + 0x3325283d, + 0x33252c64, + 0x63202964, + 0x253d6b6c, + 0x63000a64, + 0x2065726f, + 0x25206425, + 0x2d252073, + 0x20733032, + 0x20202020, + 0x20202020, + 0x63697020, + 0x6433253d, + 0x736f7020, + 0x5d75705b, + 0x3325283d, + 0x33252c64, + 0x000a2964, + 0x20746f6e, + 0x20746573, + 0x74696177, + 0x00676e69, + 0x5f434f53, + 0x2e464552, + 0x54415453, + 0x20205355, + 0x20202020, + 0x20202020, + 0x78257830, + 0x4f53000a, + 0x45525f43, + 0x4f432e46, + 0x4749464e, + 0x20202020, + 0x20202020, + 0x78302020, + 0x000a7825, + 0x5f434f53, + 0x2e464552, + 0x4556494c, + 0x20464552, + 0x20202020, + 0x20202020, + 0x78257830, + 0x4f53000a, + 0x45525f43, + 0x54532e46, + 0x414d504f, + 0x20204b53, + 0x20202020, + 0x78302020, + 0x000a7825, + 0x5f434f53, + 0x532e434d, + 0x54524154, + 0x20202020, + 0x20202020, + 0x20202020, + 0x78257830, + 0x4f53000a, + 0x434d5f43, + 0x4154532e, + 0x20535554, + 0x20202020, + 0x20202020, + 0x78302020, + 0x000a7825, + 0x5f434f53, + 0x2e465254, + 0x54415453, + 0x20205355, + 0x20202020, + 0x20202020, + 0x78257830, + 0x4f53000a, + 0x52545f43, + 0x42442e46, + 0x41545347, + 0x20535554, + 0x20202020, + 0x78302020, + 0x000a7825, + 0x5f434f53, + 0x2e4c4244, + 0x4c525443, + 0x20202020, + 0x20202020, + 0x20202020, + 0x78257830, + 0x4f53000a, + 0x42445f43, + 0x54432e4c, + 0x20314c52, + 0x20202020, + 0x20202020, + 0x78302020, + 0x000a7825, + 0x5f434f53, + 0x2e4c4244, + 0x54415453, + 0x20205355, + 0x20202020, + 0x20202020, + 0x78257830, + 0x4f53000a, + 0x42445f43, + 0x54532e4c, + 0x53555441, + 0x20202031, + 0x20202020, + 0x78302020, + 0x000a7825, + 0x5f434f53, + 0x2e4c4244, + 0x54415453, + 0x20325355, + 0x20202020, + 0x20202020, + 0x78257830, + 0x4f53000a, + 0x42445f43, + 0x54532e4c, + 0x53555441, + 0x20202033, + 0x20202020, + 0x78302020, + 0x000a7825, + 0x5f434f53, + 0x53544942, + 0x41455254, + 0x43412e4d, + 0x2e444142, + 0x54415453, + 0x20205355, + 0x20202020, + 0x25783020, + 0x53000a78, + 0x425f434f, + 0x54535449, + 0x4d414552, + 0x42444d2e, + 0x41535449, + 0x4c494156, + 0x20202020, + 0x20202020, + 0x78257830, + 0x4f53000a, + 0x49425f43, + 0x52545354, + 0x2e4d4145, + 0x5f464544, + 0x4c525443, + 0x20202020, + 0x20202020, + 0x30202020, + 0x0a782578, + 0x434f5300, + 0x5449425f, + 0x45525453, + 0x482e4d41, + 0x5250564d, + 0x532e4445, + 0x55544154, + 0x20202053, + 0x78302020, + 0x000a7825, + 0x5f434f53, + 0x53544942, + 0x41455254, + 0x43482e4d, + 0x44414241, + 0x4154532e, + 0x20535554, + 0x20202020, + 0x25783020, + 0x53000a78, + 0x45524148, + 0x41525f44, + 0x69702e4d, + 0x735f6570, + 0x65746174, + 0x25202020, + 0x25282075, + 0x000a2973, + 0x52414853, + 0x525f4445, + 0x692e4d41, + 0x616c5f73, + 0x635f7473, + 0x2065726f, + 0x000a7525, + 0x52414853, + 0x525f4445, + 0x6a2e4d41, + 0x705f626f, + 0x65736168, + 0x20202020, + 0x000a7525, + 0x52414853, + 0x525f4445, + 0x6a2e4d41, + 0x735f626f, + 0x65746174, + 0x20202020, + 0x000a7825, + 0x52414853, + 0x525f4445, + 0x6f2e4d41, + 0x6d5f7475, + 0x20202062, + 0x20202020, + 0x000a7525, + 0x52414853, + 0x525f4445, + 0x742e4d41, + 0x736e6172, + 0x6d726f66, + 0x20626d5f, + 0x000a7525, + 0x52414853, + 0x525f4445, + 0x6c2e4d41, + 0x5f747361, + 0x6e69626d, + 0x20206f66, + 0x000a7525, + 0x52414853, + 0x525f4445, + 0x6f2e4d41, + 0x75707475, + 0x74735f74, + 0x65706972, + 0x6f635f73, + 0x656c706d, + 0x20646574, + 0x000a7525, + 0x52414853, + 0x525f4445, + 0x612e4d41, + 0x5f716572, + 0x69727473, + 0x5f736570, + 0x75737369, + 0x25206465, + 0x53000a75, + 0x2e414d44, + 0x4c554146, + 0x20202054, + 0x20202020, + 0x20202020, + 0x30202020, + 0x0a782578, + 0x61745300, + 0x20737574, + 0x6220666f, + 0x6b636f6c, + 0x74206465, + 0x736b7361, + 0x726f6620, + 0x726f6320, + 0x75252065, + 0x6c63203a, + 0x75253d6b, + 0x53000a20, + 0x535f434f, + 0x54435359, + 0x532e4c52, + 0x45524e56, + 0x20202056, + 0x20202020, + 0x20202020, + 0x20202020, + 0x78252020, + 0x5746000a, + 0x5645525f, + 0x20202020, + 0x20202020, + 0x20202020, + 0x20202020, + 0x20202020, + 0x20202020, + 0x20202020, + 0x0a782520, + 0x53455300, + 0x4e4f4953, + 0x4d41525f, + 0x7463612e, + 0x5f657669, + 0x65726f63, + 0x20202073, + 0x20202020, + 0x20202020, + 0x000a7525, + 0x6d726946, + 0x65726177, + 0x61747320, + 0x20737574, + 0x6d20666f, + 0x65747361, + 0x63282072, + 0x2065726f, + 0x3a296425, + 0x6b6c6320, + 0x2064253d, + 0x4553000a, + 0x4f495353, + 0x41525f4e, + 0x69662e4d, + 0x61776d72, + 0x5f736572, + 0x755f6e69, + 0x20206573, + 0x20202020, + 0x2c642520, + 0x2c642520, + 0x2c642520, + 0x2c642520, + 0x2c642520, + 0x2c642520, + 0x2c642520, + 0x0a642520, + 0x53455300, + 0x4e4f4953, + 0x4d41525f, + 0x73616d2e, + 0x5f726574, + 0x65726f63, + 0x20202020, + 0x20202020, + 0x20202020, + 0x000a7525, + 0x53534553, + 0x5f4e4f49, + 0x2e4d4152, + 0x7473616d, + 0x615f7265, + 0x636f6c6c, + 0x64657461, + 0x20202020, + 0x25202020, + 0x53000a64, + 0x49535345, + 0x525f4e4f, + 0x6d2e4d41, + 0x65747361, + 0x69735f72, + 0x6c616e67, + 0x20202073, + 0x20202020, + 0x30252020, + 0x25207838, + 0x20783830, + 0x78383025, + 0x4553000a, + 0x4f495353, + 0x41525f4e, + 0x69702e4d, + 0x72757463, + 0x695f7365, + 0x69705f6e, + 0x20206570, + 0x20202020, + 0x0a642520, + 0x53455300, + 0x4e4f4953, + 0x4d41525f, + 0x7069702e, + 0x69705f65, + 0x61745f63, + 0x20206c69, + 0x20202020, + 0x20202020, + 0x000a7525, + 0x53534553, + 0x5f4e4f49, + 0x2e4d4152, + 0x65706970, + 0x6369705f, + 0x6165685f, + 0x20202064, + 0x20202020, + 0x25202020, + 0x53000a75, + 0x49535345, + 0x525f4e4f, + 0x702e4d41, + 0x69646e65, + 0x735f676e, + 0x65746174, + 0x20202020, + 0x20202020, + 0x75252020, + 0x4553000a, + 0x4f495353, + 0x41525f4e, + 0x65732e4d, + 0x6f697373, + 0x74735f6e, + 0x20657461, + 0x20202020, + 0x20202020, + 0x0a752520, + 0x53455300, + 0x4e4f4953, + 0x4d41525f, + 0x6d6f632e, + 0x74656c70, + 0x705f6465, + 0x75746369, + 0x20736572, + 0x20202020, + 0x000a7525, + 0x53534553, + 0x5f4e4f49, + 0x2e4d4152, + 0x6576696c, + 0x7274735f, + 0x5f657069, + 0x64616568, + 0x20202020, + 0x25202020, + 0x53000a75, + 0x49535345, + 0x525f4e4f, + 0x6c2e4d41, + 0x5f657669, + 0x69727473, + 0x745f6570, + 0x2e6c6961, + 0x65646e69, + 0x75252078, + 0x4553000a, + 0x4f495353, + 0x41525f4e, + 0x696c2e4d, + 0x735f6576, + 0x70697274, + 0x61745f65, + 0x702e6c69, + 0x64696369, + 0x0a752520, + 0x53455300, + 0x4e4f4953, + 0x4d41525f, + 0x76696c2e, + 0x74735f65, + 0x65706972, + 0x6961745f, + 0x65722e6c, + 0x20207966, + 0x000a7525, + 0x73202d2d, + 0x63746977, + 0x676e6968, + 0x0a2d2d20, + 0x53455300, + 0x4e4f4953, + 0x4d41525f, + 0x78656e2e, + 0x6f625f74, + 0x745f746f, + 0x6e656b6f, + 0x20202020, + 0x20202020, + 0x000a7525, + 0x53534553, + 0x5f4e4f49, + 0x2e4d4152, + 0x5f626f6a, + 0x75657571, + 0x6f742e65, + 0x206e656b, + 0x20202020, + 0x25202020, + 0x53000a75, + 0x49535345, + 0x525f4e4f, + 0x6a2e4d41, + 0x615f626f, + 0x76697463, + 0x20202065, + 0x20202020, + 0x20202020, + 0x75252020, + 0x4553000a, + 0x4f495353, + 0x41525f4e, + 0x6f6a2e4d, + 0x68705f62, + 0x5f657361, + 0x6e756f63, + 0x20726574, + 0x20202020, + 0x0a752520, + 0x53455300, + 0x4e4f4953, + 0x4d41525f, + 0x626f6a2e, + 0x6174735f, + 0x705f7472, + 0x20206369, + 0x20202020, + 0x20202020, + 0x000a7525, + 0x53534553, + 0x5f4e4f49, + 0x2e4d4152, + 0x5f626f6a, + 0x5f646e65, + 0x20636970, + 0x20202020, + 0x20202020, + 0x25202020, + 0x53000a75, + 0x49535345, + 0x525f4e4f, + 0x732e4d41, + 0x61657274, + 0x69705f6d, + 0x65685f63, + 0x20206461, + 0x20202020, + 0x75252020, + 0x2d2d000a, + 0x696c7320, + 0x71206563, + 0x65756575, + 0x2d2d2073, + 0x4553000a, + 0x4f495353, + 0x41525f4e, + 0x69662e4d, + 0x735f6f66, + 0x6563696c, + 0x626f6a5f, + 0x20202020, + 0x20202020, + 0x20642520, + 0x72746e65, + 0x0a736569, + 0x53455300, + 0x4e4f4953, + 0x4d41525f, + 0x6669662e, + 0x6c735f6f, + 0x5f656369, + 0x706d6f63, + 0x6574656c, + 0x20202020, + 0x65206425, + 0x6972746e, + 0x000a7365, + 0x6576696c, + 0x626f6a5f, + 0x77733e2d, + 0x68637469, + 0x7165725f, + 0x74736575, + 0x20202020, + 0x20202020, + 0x20202020, + 0x000a7525, + 0x6576696c, + 0x626f6a5f, + 0x65723e2d, + 0x73657571, + 0x5f646574, + 0x626d756e, + 0x6f5f7265, + 0x6f635f66, + 0x20736572, + 0x000a7525, + 0x6576696c, + 0x626f6a5f, + 0x6f633e2d, + 0x5f736572, + 0x746f6f62, + 0x20206465, + 0x20202020, + 0x20202020, + 0x20202020, + 0x000a7525, + 0x6576696c, + 0x626f6a5f, + 0x69703e2d, + 0x735f6570, + 0x63746977, + 0x20202068, + 0x20202020, + 0x20202020, + 0x20202020, + 0x000a7525, + 0x75706e69, + 0x75622074, + 0x72656666, + 0x74732073, + 0x73757461, + 0x000a2d3a, + 0x65727473, + 0x685f6d61, + 0x3a646165, + 0x6d207525, + 0x65747361, + 0x65685f72, + 0x253a6461, + 0x616d2075, + 0x72657473, + 0x6176615f, + 0x253a6c69, + 0x62000a75, + 0x65666675, + 0x636f2072, + 0x61707563, + 0x3a79636e, + 0x62000a2d, + 0x695f6675, + 0x25207864, + 0x73000a75, + 0x61657274, + 0x6425206d, + 0x6f63000a, + 0x255b6572, + 0x25205d75, + 0x63000a64, + 0x5f65726f, + 0x64616568, + 0x5d75255b, + 0x0a752520, + 0x52545300, + 0x004d4145, + 0x43494c53, + 0x4d002045, + 0x20202043, + 0x52410020, + 0x20205145, + 0x41525400, + 0x0020534e, + 0x5054554f, + 0x50005455, + 0x51455049, + 0x41570020, + 0x4f005449, + 0x52524556, + 0x31004e55, + 0x41505453, + 0x50004547, + 0x44494349, + 0x544e4900, + 0x00465542, + 0x4556494c, + 0x53524150, + 0x4c004445, + 0x43455649, + 0x00504d4f, + 0x49434950, + 0x5845444e, + 0x4c414e00, + 0x504e4900, + 0x45004349, + 0x554f434e, + 0x46554254, + 0x45525000, + 0x51455356, + 0x46455200, + 0x4b4e4142, + 0x5345525f, + 0x4f005445, + 0x55505455, + 0x4c465f54, + 0x00485355, + 0x44524c43, + 0x45004250, + 0x445f434e, + 0x505f5045, + 0x52004349, + 0x535f4e55, + 0x45544154, + 0x494c5300, + 0x465f4543, + 0x004f4649, + 0x4556494c, + 0x494c535f, + 0x44004543, + 0x45555145, + 0x45004555, + 0x4555514e, + 0x43004555, + 0x52004c4f, + 0x44495345, + 0x004c4155, + 0x45544942, + 0x4553434e, + 0x49420051, + 0x434e4554, + 0x00465542, + 0x4d434e45, + 0x464e4942, + 0x4143004f, + 0x42434142, + 0x00535449, + 0x50564d48, + 0x00444552, + 0x4f424552, + 0x4445544f, + 0x4f525000, + 0x43005342, + 0x544e554f, + 0x50560053, + 0x00434239, + 0x56455250, + 0x4152465f, + 0x4500454d, + 0x55425458, + 0x52454646, + 0x50495000, + 0x57004445, + 0x57003050, + 0x45003150, + 0x535f444e, + 0x50495254, + 0x424d0045, + 0x4f464e49, + 0x4145485f, + 0x00524544, + 0x46464552, + 0x454d4152, + 0x56494c00, + 0x4f4c5345, + 0x4f4a0054, + 0x57530042, + 0x48435449, + 0x46455200, + 0x454c4449, + 0x46455200, + 0x544f4c53, + 0x46455200, + 0x49525453, + 0x45520050, + 0x52545346, + 0x00455049, + 0x4d464552, + 0x44534942, + 0x5000414d, + 0x44455049, + 0x4e494152, + 0x514e4500, + 0x494c535f, + 0x45004543, + 0x4d5f514e, + 0x57525f42, + 0x514e4500, + 0x5f424d5f, + 0x4e450057, + 0x52465f51, + 0x00454d41, + 0x5f514e45, + 0x45005057, + 0x535f514e, + 0x50495254, + 0x41524400, + 0x535f4e49, + 0x50495254, + 0x424d0045, + 0x45525f49, + 0x54534947, + 0x4d005245, + 0x41500043, + 0x43455352, + 0x00504d4f, + 0x53424f4a, + 0x00544f4c, + 0x525f434d, + 0x0030574f, + 0x525f434d, + 0x0031574f, + 0x49415244, + 0x45445f4e, + 0x52545350, + 0x00455049, + 0x53504544, + 0x50495254, + 0x54535f45, + 0x00545241, + 0x415f5748, + 0x4c494156, + 0x5f574800, + 0x454c4449, + 0x444e4200, + 0x52474d5f, + 0x4c424400, + 0x4f4c535f, + 0x4f520054, + 0x5f4e4957, + 0x44414f4c, + 0x574f5200, + 0x5f54554f, + 0x524f5453, + 0x4f520045, + 0x52544357, + 0x4f4c5f4c, + 0x43004441, + 0x55425249, + 0x52500046, + 0x54535645, + 0x45504952, + 0x43495000, + 0x504d4f43, + 0x46525400, + 0x4c424400, + 0x52444c5f, + 0x4d445600, + 0x52545341, + 0x00455049, + 0x414d4456, + 0x544f4c53, + 0x52545300, + 0x5f455049, + 0x504d4f43, + 0x58495000, + 0x4c5f4e49, + 0x0044414f, + 0x5f574f52, + 0x524f5453, + 0x4d530045, + 0x424d5f56, + 0x4f464e49, + 0x4c424400, + 0x0053425f, + 0x5f465254, + 0x524f5453, + 0x4f435f45, + 0x5254004d, + 0x54535f46, + 0x45504952, + 0x504d4f43, + 0x52544300, + 0x504f004c, + 0x45004e45, + 0x4500534f, + 0x425f534f, + 0x52004655, + 0x44524f45, + 0x46005245, + 0x454d4152, + 0x455a4953, + 0x59485000, + 0x00444953, + 0x004e5552, + 0x00424a50, + 0x00545753, + 0x00424a43, + 0x00037094, + 0x000370e0, + 0x0003712c, + 0x0003714c, + 0x000371b0, + 0x000371fc, + 0x00037248, + 0x000182b1, + 0x000182b8, + 0x000182bf, + 0x000182c6, + 0x000182cd, + 0x000182d4, + 0x000182db, + 0x44532020, + 0x2020414d, + 0x61747320, + 0x30737574, + 0x20202020, + 0x74617473, + 0x20317375, + 0x207c2020, + 0x6c637273, + 0x20206e65, + 0x6c747364, + 0x7c206e65, + 0x70747320, + 0x7c206e65, + 0x70747320, + 0x7c206469, + 0x76656420, + 0x65702023, + 0x6e69646e, + 0x20000a67, + 0x32255b20, + 0x20205d64, + 0x78383025, + 0x25202020, + 0x20783830, + 0x207c2020, + 0x20643625, + 0x64362520, + 0x25207c20, + 0x25206432, + 0x7c206432, + 0x78322520, + 0x78322520, + 0x23207c20, + 0x25206425, + 0x20202c64, + 0x20642523, + 0x000a6425, + 0x414d4453, + 0x50545320, + 0x4d415220, + 0x000a203a, + 0x20202020, + 0x2d643225, + 0x20643225, + 0x2000203a, + 0x00643725, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x02020100, + 0x03030303, + 0x04040404, + 0x04040404, + 0x05050505, + 0x05050505, + 0x05050505, + 0x05050505, + 0x06060606, + 0x06060606, + 0x06060606, + 0x06060606, + 0x06060606, + 0x06060606, + 0x06060606, + 0x06060606, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x63617453, + 0x7461206b, + 0x0a702520, + 0x61747300, + 0x25206b63, + 0x3d206434, + 0x25783020, + 0x0a783830, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x40ab4107, + 0x1e0f43d8, + 0x23130115, + 0x03030524, + 0x1e040314, + 0x53420707, + 0x58410342, + 0x192586f4, + 0x1d110314, + 0xa8010304, + 0x05fe0bf2, + 0xc8040301, + 0x53fe0bf2, + 0x01258622, + 0x05140314, + 0xa8040304, + 0x33fe0bf2, + 0x0001f505, + 0xf5ff0218, + 0x02180403, + 0x234027ff, + 0xfde8000e, + 0x0e030435, + 0xf5fde800, + 0x02181002, + 0x1403f5ff, + 0x23ff0218, + 0xfde7f00e, + 0xfe0b0435, + 0xd007fc4e, + 0x03334327, + 0x3d07e307, + 0x120004f5, + 0xc107ff02, + 0x12070d47, + 0x34f13333, + 0xff021000, + 0x87f848dc, + 0x0024f120, + 0xdcff0210, + 0xf608004d, + 0x01033427, + 0x120023f5, + 0x4087ff02, + 0x120043f5, + 0xe623ff02, + 0x40273c87, + 0x160034f5, + 0xec83ff02, + 0x333d070f, + 0x33330e1c, + 0x00001f83, + 0xec333ff0, + 0xf5e1ab10, + 0x02140034, + 0x043ef5ff, + 0x9bff0214, + 0xfc8e0ef4, + 0xb207f64e, + 0xa0079107, + 0x93406c27, + 0x02f60bf8, + 0xefff7ea7, + 0x07451efd, + 0x41bc10cb, + 0x8401c607, + 0xd633d407, + 0x840541c3, + 0xfe74de23, + 0x337411fe, + 0x4c53184c, + 0xf642cc1d, + 0x23032c07, + 0x0d0723e3, + 0x087e1907, + 0x9b4027ff, + 0x00270ef4, + 0x1d072a07, + 0x087e3c07, + 0x2bac0bff, + 0xd69c0bbc, + 0xf68ebabf, + 0xefff2ea7, + 0xe8031efd, + 0x272411f3, + 0x6a4ddc33, + 0xfe0bf6fc, + 0xb107fb4e, + 0xe53ec007, + 0x2b070c07, + 0xfeb31ea7, + 0x5efb0efe, + 0xfb4efec3, + 0xb107c007, + 0x1c07cf3e, + 0x00273b07, + 0xfeb32ea7, + 0x5efb0efe, + 0x4f27febb, + 0x10000011, + 0x33a0f49b, + 0x0001f505, + 0xf5ff0218, + 0x02180402, + 0x233027ff, + 0xfde8000e, + 0x4c270335, + 0x000e0323, + 0x04f5fde8, + 0xff021810, + 0x181402f5, + 0x0e23ff02, + 0x35fde7f0, + 0x83fe0b03, + 0x03330f0c, + 0xff7e0e23, + 0xc60439ff, + 0x17139e44, + 0x33fe0b00, + 0x1e040303, + 0xf1f3e803, + 0x02100004, + 0xdc3327ff, + 0xf2fc6a4d, + 0x0533fe0b, + 0x04f54327, + 0xff021800, + 0x180402f5, + 0x4027ff02, + 0xe8000e23, + 0x030435fd, + 0xfde8000e, + 0x181001f5, + 0x02f5ff02, + 0xff021814, + 0xe7f00e23, + 0x0b0435fd, + 0xbefe4efe, + 0xf6000aa9, + 0xa7302706, + 0xfeffff4e, + 0x0d6043bd, + 0x930af313, + 0x02f4c7f4, + 0xfe8e4305, + 0x7abefe4e, + 0x06f60008, + 0x4ea73027, + 0xbdfeffff, + 0x130d6043, + 0xf4930af3, + 0x0502f4a8, + 0x4efe8e43, + 0x124cbefe, + 0x1b04cc00, + 0x4ea73027, + 0xbdfeffff, + 0xc40d6043, + 0xf3130d03, + 0x85f493a9, + 0x430502f4, + 0xfe8e0027, + 0x4ea7fc4e, + 0x99ffffff, + 0xd4c6274d, + 0x051e0027, + 0xfe9b2cbe, + 0xffff4ea7, + 0xf94411fe, + 0x000a3843, + 0x4bc407ff, + 0xc8ce233f, + 0xd32efff5, + 0x101e0027, + 0x2d073007, + 0xf5bf0ea7, + 0xbe1c07ff, + 0x19fe9bac, + 0xa707e6c1, + 0xffffff3e, + 0x34bd4127, + 0x33990634, + 0x9b40270f, + 0x41270ef4, + 0x34f53387, + 0xff02b040, + 0x0027123c, + 0xfc93fc8e, + 0xa702f414, + 0xfeffffde, + 0xf08bc001, + 0xd4990536, + 0x1e47760a, + 0x1504c8f4, + 0xfe9bb0be, + 0xffff4ea7, + 0x0a4499fe, + 0x45160127, + 0x031e0027, + 0x30270127, + 0xffff4ea7, + 0x0a439dfe, + 0x1499fc8e, + 0x1b47d814, + 0x418a049d, + 0xc1133114, + 0x340b3c02, + 0x43334307, + 0x2b9003c5, + 0xc5210824, + 0xfe0b3c04, + 0x412b4007, + 0x8663f49b, + 0x03200716, + 0x634f9b28, + 0x044e3827, + 0xf39b242e, + 0x27f31e65, + 0x00007f4f, + 0x61f49b40, + 0x4ea7fe0b, + 0x91fdefff, + 0x182c3342, + 0x1e1d2c53, + 0x8904991b, + 0x231231c4, + 0x87438341, + 0x2b443334, + 0x99400b43, + 0x45e66144, + 0x9988019d, + 0x13078803, + 0x23ca1123, + 0x4efe0bdd, + 0x3ed007fd, + 0x88d499c6, + 0x3f9b45f6, + 0x634f9b62, + 0x4027432e, + 0x8e8ad49d, + 0x6af09bfd, + 0x0b6bf09b, + 0x62f19b10, + 0x9b63f09b, + 0x4ca3604f, + 0x60f49b10, + 0x0b63f09b, + 0x604f9bfe, + 0x9b104ce3, + 0x4f9b60f4, + 0xff3ea76b, + 0x4327fdef, + 0x022034d5, + 0x48dc3481, + 0xff3ea7fc, + 0x3481fdef, + 0x08004ddc, + 0xd54427fa, + 0xd5022034, + 0x27022434, + 0x6832d520, + 0xdf3ea706, + 0x3205fdeb, + 0x00004f27, + 0x34150704, + 0x990ef29b, + 0x45468804, + 0x029d4027, + 0x89049d88, + 0xf393fe0b, + 0x9902f2d0, + 0x0f6baa34, + 0x309d4223, + 0x144f6bb0, + 0x00270f4c, + 0x0bbc30c5, + 0x100c5cfe, + 0xf2b2f493, + 0xac41c102, + 0x1007183c, + 0x070f1c83, + 0x0f4c8341, + 0x2f274333, + 0x80020100, + 0x2f6b247b, + 0x24964127, + 0xf3934027, + 0x3302f28c, + 0xac31c545, + 0xc54c349d, + 0x0f9bc032, + 0xc034c160, + 0xab830ce3, + 0x93fe0b04, + 0x02f26ff4, + 0x538b4099, + 0x0b018302, + 0x634f9bfe, + 0x48134783, + 0xf49b4800, + 0x9bfe0b65, + 0xf493630f, + 0xc102f250, + 0x43075043, + 0x042b4333, + 0x030b0373, + 0xe81efe0b, + 0x9b674f9b, + 0x4c30640f, + 0x0b00a720, + 0x9b4103fe, + 0x412365f4, + 0x5b1f4c13, + 0x0b012304, + 0xa7fb4efe, + 0xffffff4e, + 0xb9380cc1, + 0x070a5a4b, + 0x5e0027d0, + 0x4307009d, + 0x8331d099, + 0xe4070f4c, + 0x45330183, + 0xe40be333, + 0x30072007, + 0xf5a4ee23, + 0x332333ff, + 0x71322b35, + 0x613d0be1, + 0x35e481e2, + 0x0be14131, + 0x25210742, + 0x802c8334, + 0x24963127, + 0x23073027, + 0x11382633, + 0x151e27a3, + 0xa3101c38, + 0x380e1e23, + 0xa304001d, + 0x0c061e21, + 0x802ca310, + 0x45334007, + 0x402b0333, + 0x429d4d0b, + 0x54d1c114, + 0x41454031, + 0x439dc319, + 0x54d3c115, + 0xe231e121, + 0x4105300b, + 0xd3c54215, + 0x27c41954, + 0x1d410301, + 0x31d499c4, + 0x0330d399, + 0x9d310341, + 0xd39d31d4, + 0x30d49930, + 0x190c42d4, + 0x2b4307c3, + 0x804cfc4b, + 0xfb8eff56, + 0x0499fa4e, + 0x30039931, + 0x2b340bc1, + 0x07e40743, + 0x27ef6bd1, + 0x31411ea0, + 0x0b324131, + 0x07233321, + 0x284d2b42, + 0x14349941, + 0x46204cd8, + 0xdc143499, + 0xd817104c, + 0x15b60e44, + 0x0499d24e, + 0xd84e1b32, + 0x192f804c, + 0x1d4103b4, + 0x300499b4, + 0x4123ec07, + 0x049def6b, + 0x07a12730, + 0x0741834e, + 0x33353334, + 0x99342b43, + 0xce073104, + 0xc103300b, + 0x1ea9e4ce, + 0x1e344105, + 0x5404c104, + 0xe65004c5, + 0xff3ea7a7, + 0x4127ffff, + 0x063534bd, + 0x270f3399, + 0x0ef49b40, + 0x33874127, + 0xb04034f5, + 0x0499ff02, + 0x30029931, + 0x2b320399, + 0x2b4f6b42, + 0x803c1834, + 0x8e32049d, + 0x99f84efa, + 0x1e218904, + 0x94074383, + 0x44879433, + 0x1d31942b, + 0xe30bb907, + 0xbec5b00b, + 0x07d32b58, + 0x07a107c0, + 0x102f6b43, + 0x000001df, + 0x00df2701, + 0x9d010000, + 0xbdc560b2, + 0x0ba3315c, + 0x0e80274d, + 0xa7812743, + 0xfde77f2e, + 0xa411a301, + 0xb89d2e05, + 0xd0c3c561, + 0x15d4c4c5, + 0x35e0272d, + 0x6f3ea72e, + 0x4c27fde7, + 0x1534051a, + 0x61b4993d, + 0x44a63e35, + 0x99fc5d7e, + 0xc39989c4, + 0x03290788, + 0x0c07582c, + 0x31034103, + 0xc49d020b, + 0x88c39d89, + 0xfc4ef88e, + 0x07300499, + 0x2744d6d0, + 0x27771ec0, + 0xa66b1ec0, + 0x89d4994a, + 0x43834123, + 0x34333407, + 0x342b4487, + 0x34993d0b, + 0x9947f661, + 0x3ec16030, + 0x07400758, + 0x33433310, + 0x0b142b15, + 0xc114211d, + 0xe42b5c33, + 0x271ee30b, + 0xdc8ad499, + 0xd4993841, + 0x31d29932, + 0x01830407, + 0x10073007, + 0x15333333, + 0x3407132b, + 0x24ce3103, + 0x32d39d1d, + 0x20071d0b, + 0x0d073e07, + 0x11ff007e, + 0x0b433304, + 0x88d499c4, + 0x42c8e027, + 0x8e0c078f, + 0x07f54efc, + 0x070107d0, + 0x2b720781, + 0x635f9b02, + 0x9b1850ce, + 0x42076c3f, + 0xda604c03, + 0x01070d34, + 0xb97e1207, + 0x5ed027fb, + 0xd3c10114, + 0xe3a00750, + 0x073333a7, + 0xcc432b4a, + 0xa8071240, + 0x4a07a7e3, + 0x402c432b, + 0xf55ed127, + 0x07702700, + 0xfc1f7e0d, + 0x9931de99, + 0x302730d4, + 0xd39d4e1b, + 0x6b94078a, + 0x8329079f, + 0x07420721, + 0x334333c2, + 0x2b6907c5, + 0x0b6103c4, + 0x509ececd, + 0xc441c131, + 0x43331333, + 0x0a07b107, + 0x0b14c399, + 0x07042bb4, + 0xd84b2b45, + 0x38072d37, + 0x40083b2b, + 0x30c818d6, + 0x070d0722, + 0xfb187e1c, + 0x41034907, + 0x9932d49d, + 0xab0714c4, + 0xd1274483, + 0xd0274486, + 0x1027d203, + 0x0008711e, + 0x070901da, + 0x27991e96, + 0xc1c02700, + 0x4a0754d3, + 0x432b3333, + 0xce2c40c8, + 0xa3070938, + 0xd4271027, + 0xd2c14d1e, + 0xff4ea738, + 0x43b9ffff, + 0x24190a5a, + 0x0d07344e, + 0xd0be1807, + 0xa807fea0, + 0x1027a72b, + 0xc4412b1e, + 0x33733007, + 0x1c07430b, + 0x9d90d4c5, + 0x0d0732d9, + 0x99fdd87e, + 0x0c1132d4, + 0xd49d4103, + 0x7e0d0732, + 0xc333fe56, + 0x1c0b1007, + 0x0a07d027, + 0x36fb207e, + 0x070807d5, + 0xfaa27e17, + 0xf58e0d07, + 0x93603f9b, + 0x02ee53f2, + 0x58ac24c1, + 0xc024c148, + 0xab830ce3, + 0x83430704, + 0x4ca3104c, + 0xcb40ab0c, + 0x9b38c634, + 0x3cd860f4, + 0x1f9b1e83, + 0x834cd863, + 0x4024c10d, + 0x1b4c2299, + 0x08243241, + 0x93202740, + 0x02ee17f0, + 0x0bfe7c5e, + 0x07fb4efe, + 0x09fd93b0, + 0xd4c102ee, + 0x4cd29940, + 0x24324b1b, + 0x20274008, + 0x1b070d07, + 0x07fe5c7e, + 0x9b0344c0, + 0xd4c5634f, + 0x9be01e40, + 0x84be630f, + 0xd1c10011, + 0x7e0d0744, + 0xd499fc7c, + 0x1b41c4aa, + 0xc1634f9b, + 0x432b40d3, + 0x00014f50, + 0x4f9b7000, + 0x004f0363, + 0xc5f00000, + 0xc44440d4, + 0x927e0d07, + 0xa70fd6fb, + 0xfb8e0c07, + 0xd007fd4e, + 0x3f9b0401, + 0xc8432b63, + 0x03997340, + 0x93312409, + 0xfea3f9f2, + 0x32240f1e, + 0xa4a7f293, + 0x93061efe, + 0xfea254f2, + 0xed7ef493, + 0xaa439d02, + 0x999c42c5, + 0x9f7e08d0, + 0x0ad099fa, + 0x9bfab47e, + 0xd00160f0, + 0xc0ff547e, + 0xf393f902, + 0x9902ed5c, + 0xd2118a34, + 0xc10e41d8, + 0x42079033, + 0x432b3333, + 0x23074108, + 0xed42f493, + 0x3c42c502, + 0x270bdd99, + 0x8b4d9d30, + 0x9b8c439d, + 0xfd0e630f, + 0x0010ce9e, + 0xfe4efd8e, + 0x078a0499, + 0x4041dce0, + 0x99310399, + 0x34ce3204, + 0x624f9b37, + 0x2b633f9b, + 0x604ccc43, + 0x631f9b20, + 0xed02f493, + 0x4043c102, + 0x074c4299, + 0x32432b41, + 0x27400824, + 0x0e0e0720, + 0xfd535efe, + 0x9bfcc97e, + 0x400b624f, + 0x8e62f49b, + 0x07f94efe, + 0x639f9ba0, + 0x9b62bf9b, + 0xfd9363cf, + 0xc102eccc, + 0x0d0744d1, + 0x7e48dac5, + 0x0d07fb64, + 0x99fa9c7e, + 0x41588ad4, + 0x0c2b0b07, + 0xd4c1f98e, + 0x4cd29940, + 0x2452491b, + 0xd0274028, + 0xd207031e, + 0xec9af093, + 0xf9007e02, + 0xec92f093, + 0xff687e02, + 0x9b624f9b, + 0x432b633f, + 0x9331a4d2, + 0x02ec7ff0, + 0xdc8a0499, + 0x04992641, + 0x99484630, + 0x41233104, + 0x34074183, + 0x43333533, + 0x34f9342b, + 0x00047f9c, + 0x07104c5c, + 0xbe2d0719, + 0x9bfea0c6, + 0x4f9b620f, + 0x8e042b63, + 0x93f84ef9, + 0x02ed1bf4, + 0xc1124a99, + 0xaff6ec4d, + 0x4ea70115, + 0xa7ffffff, + 0xfffb430e, + 0x0cdc4cd1, + 0x000e4fbe, + 0x0fc4b007, + 0xffffffff, + 0xbe0c070b, + 0x27fea91f, + 0x07f88e05, + 0xa7333330, + 0xfd4fff4e, + 0x48110027, + 0x04d03cf1, + 0x39f1ff00, + 0xff0004cc, + 0xfff6cabe, + 0xebff3ea7, + 0x273a05fd, + 0x0200004f, + 0x27341512, + 0x0ef49b40, + 0x29070027, + 0x5bbe1c07, + 0xf393fff6, + 0x9302ebcc, + 0x02f1d6f2, + 0xe37f3ce3, + 0x34197f2c, + 0xc2803c03, + 0xc907f932, + 0xec92f493, + 0xc1c25302, + 0x3c07ec42, + 0x05ae4f9b, + 0x03c12324, + 0x27f3a024, + 0xc0bafda0, + 0xa7ff0004, + 0xfffb434e, + 0x45664479, + 0xfb410ea7, + 0x0d6fbeff, + 0xff4ea700, + 0xf193fd4f, + 0x0102ec5c, + 0xec10c143, + 0x149d4127, + 0x971a9d12, + 0x017018d5, + 0x016a13bd, + 0x14210251, + 0x6b3924ce, + 0xff4ea72f, + 0x2c33feff, + 0xa343110c, + 0x1000002e, + 0xdfff4ea7, + 0x0842d5fd, + 0x084cd502, + 0x6e1c9d02, + 0x51421c9d, + 0xf5338700, + 0x000d4830, + 0xa73127ff, + 0xfdcfff4e, + 0xc16843c5, + 0x0c03ec10, + 0xfd7ebe44, + 0xf9fc93ff, + 0xc32102eb, + 0x344ed451, + 0x11be0d07, + 0x0ad6fea6, + 0x2740d499, + 0x68c4bd00, + 0x40d49901, + 0x4e234333, + 0xc5fffaa4, + 0xd499e0c4, + 0x15c49d39, + 0x3534d4c1, + 0xbd4027c4, + 0x270143c4, + 0x12c49d43, + 0x493cd4c1, + 0x2cc48d44, + 0xf74ef88e, + 0xc007a007, + 0x0730ac03, + 0x039c070a, + 0xcbc15c9c, + 0x1236be38, + 0x07800700, + 0x64ccc109, + 0x00122bbe, + 0x0a077007, + 0x00143bbe, + 0xb82b0907, + 0x001433be, + 0xfb9bb253, + 0x53c72b24, + 0x25fc9bc2, + 0xfb4ef78e, + 0xf055f1a3, + 0x8914fe89, + 0x312316f0, + 0xfd93be07, + 0x0b02eb60, + 0xa1b12b34, + 0x8dd16df4, + 0xdb2d10d3, + 0xc207d04d, + 0x16ecd1c1, + 0x1df41545, + 0x8d4f07f4, + 0xfe8d16f0, + 0x07f25114, + 0x98dc8d34, + 0x0ebe0d07, + 0xc0070004, + 0xd43106f6, + 0x2b12d399, + 0x20d4354b, + 0x7e0d0734, + 0x4427ff6a, + 0x0712d49d, + 0x8ef1830c, + 0x93fc4efb, + 0x02eb0bfd, + 0xd612d499, + 0x8e002744, + 0xcb44e4fc, + 0x29d46900, + 0x31d309dc, + 0x2bc40bd2, + 0x0b242bc3, + 0x6cd2d52c, + 0x2ec4c201, + 0x07e0d4c1, + 0x05310332, + 0xca441143, + 0x335e2043, + 0x89124901, + 0x13812614, + 0x2c0b249b, + 0x230b2287, + 0x1ea70827, + 0x27fef2cb, + 0xf31dbe34, + 0x0dfdbeff, + 0x93402700, + 0x02eaaffd, + 0x0127d40d, + 0xbe1adc8d, + 0x07000429, + 0x300c030d, + 0x0011eebe, + 0x0c030d07, + 0x11e5be5c, + 0xf3f6be00, + 0x030d07ff, + 0xa4be300c, + 0x0d070014, + 0xbe5c0c03, + 0x2100149b, + 0xf45dbed0, + 0xecd3c1ff, + 0x99393299, + 0x42c20434, + 0x97d4991d, + 0x33c14566, + 0x6cd3d534, + 0x070f1e01, + 0x9d410342, + 0x00273934, + 0xa65e4127, + 0xff4ea700, + 0x4311fd4f, + 0xea42f493, + 0x7443d502, + 0x97439901, + 0x016b43bd, + 0x43c4201e, + 0x030d071d, + 0x7cbe300c, + 0x0d070011, + 0xbe5c0c03, + 0xc1001173, + 0x44c1ecd4, + 0x6cd4d534, + 0x11fd9301, + 0xc22702ea, + 0xfaf30ea7, + 0x12dc9dff, + 0x000b9dbe, + 0x0627002c, + 0xd3d1fc8e, + 0x40070168, + 0x43f54433, + 0xff00051c, + 0x016cd3d1, + 0x052043f5, + 0xd3d1ff00, + 0x43f50170, + 0xff000524, + 0x0174d3d1, + 0x052843f5, + 0x3ea7ff00, + 0xfdffffff, + 0x0005100c, + 0xbd4127ff, + 0x99063634, + 0x40270f33, + 0x270ef49b, + 0xf5338741, + 0x02b04034, + 0x270027ff, + 0x12d49d40, + 0xf193fc8e, + 0x8902e9a0, + 0x13699814, + 0x4ce2430b, + 0xbe5efedd, + 0x19fd4efe, + 0x0703390d, + 0x4744272d, + 0xf52333ed, + 0x02120024, + 0x273387ff, + 0xf5e10340, + 0x02160034, + 0x870129ff, + 0xf543273e, + 0x02120034, + 0x0034f1ff, + 0xdcff0210, + 0x2e87f848, + 0x100024f1, + 0x4ddcff02, + 0x07f60800, + 0x03342741, + 0x0023f54a, + 0x83ff0212, + 0x2d070f4c, + 0x23331653, + 0x27141c33, + 0x104c3330, + 0x23f541ab, + 0xff021400, + 0x140424f5, + 0xf39bff02, + 0x4efd8e0e, + 0x07e007fd, + 0x915e1ed1, + 0x0834f5e4, + 0x99ff0218, + 0xe07104e4, + 0x3305e399, + 0x99e16145, + 0x0d2b20e2, + 0x180043f5, + 0x1d0bff02, + 0x180440f5, + 0x3027ff02, + 0xe8004e23, + 0x034335fd, + 0xfde8004e, + 0x181041f5, + 0x2c33ff02, + 0x1440f510, + 0xa3ff0218, + 0x0000002f, + 0xf04e2304, + 0x4235fde7, + 0xe471e391, + 0x4d2b430b, + 0xd027e495, + 0x4704e499, + 0xf1433334, + 0x02100044, + 0x333103ff, + 0x4c53184c, + 0xc834331d, + 0xfd8e8a42, + 0x27040499, + 0x07433335, + 0xf5203324, + 0x02120043, + 0xe8031eff, + 0x0024f1f3, + 0x27ff0210, + 0x0a4ddc33, + 0xfe0bf2fc, + 0xe107fe4e, + 0x01713c1e, + 0x1e2b04a1, + 0x180834f5, + 0x0419ff02, + 0x02990361, + 0x0b453320, + 0x0043f53e, + 0x33ff0218, + 0x2fa3102c, + 0x04000000, + 0x180441f5, + 0x4e23ff02, + 0x35fde800, + 0x2704a142, + 0xa5410be0, + 0x07031904, + 0xf1433343, + 0x02100044, + 0x333533ff, + 0x4c53184c, + 0xaf42c81d, + 0xf94efe8e, + 0x0c03d007, + 0x29b107ac, + 0xfe837ed9, + 0x99aad289, + 0xd199a8d0, + 0x833207a9, + 0x2d833f3c, + 0x91beffc0, + 0x3ea7fff0, + 0x27fde7cf, + 0x3405164c, + 0x34154027, + 0x00004f27, + 0x3435a000, + 0xc0b0dcc1, + 0xb2c00ab1, + 0x27c02718, + 0xc1151e10, + 0xd3c1d8d4, + 0xc1c40bc4, + 0xc34ad4d1, + 0x041ec32b, + 0x07b4d1c1, + 0x2c3c2b31, + 0xc4d4c130, + 0x4307340b, + 0xd4c54c0b, + 0xd0dcc5cc, + 0xf49b4253, + 0xc8d49926, + 0x07ccd3c1, + 0x034487ad, + 0x43f5a8ac, + 0xff001c00, + 0x747e0a07, + 0x9d4127fe, + 0xd48996d4, + 0x0d302798, + 0x8dd32dd3, + 0x0d07dcd4, + 0x000d34be, + 0xf49305b6, + 0xd102e774, + 0xd6016044, + 0x1eb02744, + 0xbe0d071d, + 0xe600158f, + 0x09f31e07, + 0x23b103d4, + 0x0d4fab41, + 0xbe4516d4, + 0x66000d24, + 0xce0d0705, + 0xb027eab9, + 0xb727031e, + 0xe73ef493, + 0x29420902, + 0x9d302744, + 0x422b96d3, + 0x0a07944e, + 0xb17e1c07, + 0x8e0b07fe, + 0x63f94ef9, + 0xec04c1f0, + 0xc107f205, + 0x07424199, + 0x29b307d0, + 0xbefa09f9, + 0x89000111, + 0xd48910c3, + 0x3cccc198, + 0x2027439b, + 0xdca51447, + 0xd2c5d469, + 0xd4d2c5d8, + 0x19c4d1c5, + 0x47349bb2, + 0x96b411c3, + 0xb4d2c52b, + 0x56b0d2c5, + 0xb8d0c149, + 0x4c070586, + 0x0bbcd3c1, + 0x1243c241, + 0x0726d289, + 0xbc1c031d, + 0xe9be3027, + 0xd0c5fea3, + 0xb8d3c1b8, + 0x1ec0d3c5, + 0xc0d4c518, + 0xd4c5b441, + 0x210e1ebc, + 0xc0d4c5b3, + 0x31b0d3c5, + 0xb4d4c5b4, + 0x07c0d4c1, + 0xc54c0b0d, + 0xb119c0d4, + 0xc6fe717e, + 0x27d36905, + 0x4d3a1b40, + 0x2dd40dd9, + 0x8ef043d3, + 0xb6fc4ef9, + 0x75fc9308, + 0xc28902e6, + 0xa8c099aa, + 0xc1993207, + 0x3f3c83a9, + 0xffc02d83, + 0xffeef3be, + 0x0c030c07, + 0xfdba7ea8, + 0xe6fef093, + 0x5efc0e02, + 0xf74efcbd, + 0xc0079307, + 0x9fabf063, + 0x016000d1, + 0x8107f405, + 0xb2071907, + 0xfa09f729, + 0x000518be, + 0x0164c3d1, + 0x9b26c489, + 0x0b44874b, + 0xadf04334, + 0xad0150ca, + 0xad0138c0, + 0xd5013ec8, + 0xad0158c3, + 0xad0144c9, + 0xad0152c7, + 0xad013cc0, + 0x8e013acb, + 0x27fd4ef7, + 0x4303b940, + 0xbd1f6b01, + 0x63014304, + 0xc4d007f0, + 0x272fff1c, + 0x277fff4d, + 0x3604ad20, + 0xbd40a701, + 0xd5015c04, + 0x27016002, + 0xff4ea732, + 0xf193feff, + 0xbd02e5c8, + 0xc50be843, + 0x12bdf012, + 0xd35e0143, + 0x5c04b900, + 0x07412e01, + 0x07231e23, + 0x33410731, + 0x2b453333, + 0x9444f143, + 0xbdff0001, + 0x01015c01, + 0x6004d543, + 0xd5430b01, + 0x27016404, + 0x60d4d120, + 0x9f4fe601, + 0x69d32900, + 0x07430bd4, + 0xad3fab34, + 0xc40136d3, + 0xd4a91022, + 0x434e0148, + 0x014ad3a9, + 0x34ced449, + 0x56d2a965, + 0x54d0b901, + 0x55d1b901, + 0x83320701, + 0x2d833f3c, + 0xe1beffc0, + 0xd369ffed, + 0x8998d289, + 0x230b10d4, + 0xf20d4103, + 0xd1a9f42d, + 0xd2490136, + 0x0d07f401, + 0x27fee57e, + 0xff4ea720, + 0xd2bdfeff, + 0xd2bd0134, + 0x11270135, + 0x0be841bd, + 0xe516f393, + 0xdef49302, + 0x32bd000f, + 0x34c50142, + 0x4032bdf0, + 0x4132bd01, + 0xff4ea701, + 0x44b9feff, + 0x41c40be8, + 0xf1fd930e, + 0xd0c102e4, + 0xc0f08bf0, + 0xf043f901, + 0xfe4efd8e, + 0xd1c80e99, + 0x0b010000, + 0x471007e1, + 0x0b1203ee, + 0x471e091e, + 0x0b3e0d22, + 0x2d200920, + 0x0d112930, + 0x2d222941, + 0x99fe8e42, + 0x4786e704, + 0xf6e60499, + 0x0403a946, + 0x90048901, + 0x930c43c2, + 0xfea581f4, + 0x04053027, + 0xf453091e, + 0x04050220, + 0x03073327, + 0xfe0bfe0b, + 0x0499fc4e, + 0x03c027b8, + 0x994f6b41, + 0x0c9dc903, + 0xe90c9de4, + 0x07b8049d, + 0x1243cad0, + 0x9db90499, + 0x4103b80c, + 0x89b9049d, + 0x048dd204, + 0xbe0127d0, + 0x99fffde1, + 0x4566e8d4, + 0xdc9d0d07, + 0x1efc0ee8, + 0x07f41393, + 0xd4050027, + 0xfa4efc8e, + 0x23ea0499, + 0x36d007f1, + 0x18fabe46, + 0xf6b00700, + 0x2700fb0f, + 0xead49d41, + 0x99b9d399, + 0x342ac8d4, + 0xd49d4127, + 0xe6d499e6, + 0x0d074586, + 0x07ff5a7e, + 0x00da5eb0, + 0x0104d4a9, + 0xd1994ae6, + 0xb9d299b8, + 0x4d073d07, + 0x03ac3c03, + 0x0d07b04c, + 0x89ff117e, + 0xd189b0d2, + 0xacd489b2, + 0x1baed389, + 0x23311b42, + 0x8d112321, + 0xd38db4d4, + 0xb0d28db6, + 0x99b2d18d, + 0x4546e4d4, + 0x898ed489, + 0x071e8cd3, + 0x89acd389, + 0xf34daed4, + 0xd189f46d, + 0xb4d289ac, + 0x89aed389, + 0xf011b6d4, + 0xfe05e027, + 0xfff835be, + 0x0fd6b007, + 0x81f3936c, + 0xfc930019, + 0x2702e398, + 0xd1d305a1, + 0x270160c4, + 0xead39d30, + 0x26e9da9d, + 0x90d4894e, + 0x0104d3a9, + 0x42c8432b, + 0xb8d19944, + 0x03c9d499, + 0xb9d29911, + 0x2103142a, + 0x3f071027, + 0x38034f07, + 0x070c4c03, + 0xfe787e0d, + 0x8908f489, + 0xf2890af3, + 0x0cf1890e, + 0x0146c4ad, + 0x0143cabd, + 0x014ac3ad, + 0x014ec2ad, + 0x014cc1ad, + 0x0148c4ad, + 0xf1030b07, + 0xfc4efa8e, + 0x9b844c27, + 0x302721f4, + 0xcfff4ea7, + 0x4043c5fd, + 0xe492fd93, + 0xffcea702, + 0xd401feff, + 0xf48b0d07, + 0xc49904f6, + 0x2742a60a, + 0x21f49b40, + 0xfc4efc8e, + 0x02c1c107, + 0x6bd00740, + 0xff1ea7cf, + 0x031efdef, + 0x1411f3e8, + 0x4c333327, + 0x1d4c5318, + 0x07f244c0, + 0x401d0312, + 0xa7002701, + 0xf9f4ff2e, + 0xbe803c27, + 0x16ffeb2f, + 0x00d4d1c5, + 0x994d3601, + 0xd499c8d3, + 0x30d1c1c9, + 0x3203340b, + 0x50601c03, + 0x2f1e113c, + 0x061ef2e8, + 0xefff0ea7, + 0x270411fd, + 0x184c3323, + 0xc01d4c53, + 0x3347eb44, + 0x2ea70027, + 0xbefef33f, + 0xa7ffeaef, + 0xfef33f4e, + 0x0100d4d5, + 0xd1d5fc8e, + 0xfc8e0100, + 0x0299fc4e, + 0x9d03619c, + 0x0299c802, + 0xf004c19d, + 0x07c9029d, + 0x0e1027d0, + 0x07112734, + 0x40d2c1c1, + 0x1ea7cf6b, + 0x1efdefff, + 0xc1f3e803, + 0x33274414, + 0x53184c33, + 0x44c01d4c, + 0x031207f1, + 0xa7082718, + 0xfef31f2e, + 0xbe403c27, + 0x07ffea93, + 0x7e1c070d, + 0xc7a6ff2a, + 0xd4d54027, + 0xd4d50244, + 0xd4d50128, + 0xd4d5012c, + 0xd4d50118, + 0xd461011c, + 0x27f0d4c5, + 0x0000ff4f, + 0x61f49b40, + 0x6ebe0127, + 0xc9beffee, + 0xd2c1fff2, + 0xa4d4c1a0, + 0xc5acd2c5, + 0xd399b4d4, + 0x80d4c116, + 0x89b6de89, + 0x4953aed1, + 0xd2c13347, + 0x0b3d0b5c, + 0x53e4071e, + 0xee338944, + 0xd49d4183, + 0x0f2c83e4, + 0x329b4027, + 0x27e5d49d, + 0x9d412720, + 0xd49dead2, + 0x04d2adca, + 0x8940a701, + 0xdc899ed2, + 0xacd089b4, + 0x89dad48d, + 0xd28d94d4, + 0x96d289b8, + 0x0bd2d48d, + 0x98d4890c, + 0x1123e183, + 0xd28dc027, + 0x890123d4, + 0xde9d9ad2, + 0xb2d18de7, + 0x8dbcd3c5, + 0xd48db0d0, + 0xdcdc8dd6, + 0x8dc0dcc5, + 0xd489d8d2, + 0x8d0d0792, + 0x82bed0d4, + 0x00270000, + 0xffeb56be, + 0xfd14f453, + 0xd4050027, + 0xfe4efc8e, + 0x03571499, + 0x4447621c, + 0x1c23410b, + 0x58139962, + 0x023004d5, + 0x010c03bd, + 0x071938d4, + 0x341d0310, + 0x07230702, + 0x034e0931, + 0x033e0d42, + 0xd5f2a832, + 0x8e023001, + 0x93fb4efe, + 0x02e28bfc, + 0x0244c4d1, + 0xb107d007, + 0x070b04ce, + 0x3e1d070c, + 0x44cdd5b2, + 0x0cc4b902, + 0x30c0d101, + 0x27410302, + 0x09091e20, + 0x2a020303, + 0xa82307b3, + 0x8e0207f4, + 0x63f54efb, + 0xa7d007f0, + 0xfbffff8e, + 0x042089d1, + 0x91839153, + 0xc1f691c4, + 0xdb995cd4, + 0x4084d586, + 0x60d4c104, + 0x84d5b1c3, + 0xd4c10444, + 0x1cbc3364, + 0x044884d5, + 0x9980d3c1, + 0x43077fd0, + 0x070d4c33, + 0x79de9924, + 0x4d833207, + 0x2d838000, + 0xd1994000, + 0x0742ab78, + 0x7edc9923, + 0x2e83e833, + 0x33010000, + 0xab303304, + 0x830eab42, + 0x0200003e, + 0x0cab1213, + 0x138343ab, + 0x1c3340ab, + 0xd541ab0c, + 0xc1044c84, + 0x84d568d4, + 0xd4c10400, + 0x0484d56c, + 0x80dac104, + 0x077fd299, + 0x0dcc33ca, + 0xd1994c07, + 0x833a0779, + 0x8380004d, + 0x010000ce, + 0xab193c33, + 0x003f83c4, + 0x33400000, + 0x99183324, + 0xde997ed0, + 0xabc3ab78, + 0x2720ab21, + 0xabcbab42, + 0xc14e2bc2, + 0x438370d2, + 0xc50c4c33, + 0xc4abe0d2, + 0xa653e240, + 0xab1fac33, + 0x088cd5ca, + 0xd5402704, + 0xc1041884, + 0xf49b74d4, + 0xb0dd03a3, + 0x033d0701, + 0x2d077fdc, + 0xd57f3ce3, + 0xe3043089, + 0xdd237f2c, + 0x3419022f, + 0xc2803c03, + 0x0827f932, + 0xffe9c6be, + 0xcd03cd07, + 0xed0701b0, + 0xf31f7ea7, + 0x27a027fe, + 0xff6ea780, + 0xe399fbff, + 0x0558077e, + 0x10ac53f3, + 0x00271c07, + 0xbc275433, + 0x01300710, + 0x334707f2, + 0x0b960735, + 0xc235ab40, + 0x44191320, + 0x00002e27, + 0x40203b01, + 0x4153ff4c, + 0x34aba2ab, + 0x041c93d5, + 0x01031305, + 0xfbf01403, + 0x038103d1, + 0xe10340cc, + 0x7c038220, + 0xc5b01e20, + 0x4027ecda, + 0x043464d5, + 0x4388d4c1, + 0x1464d5f0, + 0x9d402704, + 0xf58ee6d4, + 0xcf5bf04e, + 0xfe2bdf3b, + 0x0f07fc4e, + 0xfe8316be, + 0xf00efc0e, + 0x1ea7ff0b, + 0x01fd4fff, + 0x122f9b14, + 0x44334103, + 0xab3813c1, + 0x27322e24, + 0xabfe0b00, + 0x3812c5f3, + 0xce3814c1, + 0xf3ebf842, + 0xfe0b0127, + 0xd33efe4e, + 0x0c270576, + 0x9efe0e20, + 0x8efea699, + 0x07fc4efe, + 0xa85ebec0, + 0x19c339ff, + 0xab1307c4, + 0x27c41d43, + 0xe6c43d40, + 0x9b402705, + 0x3ea70ef4, + 0xc5fd4fff, + 0x40273834, + 0xa70ef49b, + 0xffffff4e, + 0xa70e4399, + 0xfd4fbf2e, + 0x3138318b, + 0x24054127, + 0x24033153, + 0xfc8e32d6, + 0xd007fd4e, + 0xffa841be, + 0xb60cd499, + 0x0ed49944, + 0x01230407, + 0x3d0b3007, + 0xc4043499, + 0x41270b42, + 0x9d04349d, + 0x141e0cd0, + 0x4fff4ea7, + 0x01d239fd, + 0x3b412743, + 0x3d42ab43, + 0x2700a7d4, + 0x0ef49b40, + 0x4fff3ea7, + 0x3834c5fd, + 0xfd4efd8e, + 0xf7bed007, + 0xd499ffa7, + 0x9944b60d, + 0x04070ed4, + 0x30070123, + 0x34993d0b, + 0x27459604, + 0x04349d41, + 0x1e0dd09d, + 0x032d0718, + 0xff4ea722, + 0x2139fd4f, + 0x41274301, + 0x41ab433b, + 0x00a7243d, + 0xf49b4027, + 0xff3ea70e, + 0x34c5fd4f, + 0x00fd8e38, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00014cd4, + 0x00014c34, + 0x00014b94, + 0x00014b94, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0xd007fb4e, + 0x0ea7b107, + 0x07fffa23, + 0xbec2071d, + 0x36fe8474, + 0x071d0706, + 0xa73c072b, + 0xfffa230e, + 0xfe88c3be, + 0xf49b4027, + 0x4efb8e0e, + 0x59f493fe, + 0x43c102dc, + 0x4c429940, + 0x432b4007, + 0x40282452, + 0x031ee027, + 0xf193e207, + 0xc102dc40, + 0x20075013, + 0x33332e2b, + 0x432b4207, + 0xe007404c, + 0x2307e32b, + 0x9d4412c5, + 0xfe8e4e1e, + 0x1499fb4e, + 0x07e30710, + 0x5bc307b2, + 0x07245be4, + 0x51cb2bd1, + 0x27e24e11, + 0x1ee02730, + 0x87e1830d, + 0x8b4d0b4e, + 0x2b4e6131, + 0x872183c3, + 0x614d0b42, + 0x0b1b8b44, + 0x05033541, + 0x250c1504, + 0x4efb8e0e, + 0xb5fc93f9, + 0xc49902dc, + 0xe6f3e313, + 0x2901a54f, + 0x09cd69c4, + 0x2bd40bc3, + 0x1ac489d3, + 0xb42bbd07, + 0x4027b556, + 0x5e13c49d, + 0x0dbe018a, + 0x05360011, + 0xfe94d3be, + 0xa1017d5e, + 0x2ccc89c3, + 0xf325fb6d, + 0x4f9bfc4d, + 0x9b43a6a2, + 0xa487244f, + 0x9325bf9b, + 0x02dc67fc, + 0x0734c2c1, + 0x071c070f, + 0x0c0c033a, + 0x7e301c03, + 0xbb87ff5c, + 0x0760c2c1, + 0x071c070f, + 0x240c033b, + 0x7e5c1c03, + 0xc499ff48, + 0x6fc39943, + 0xc11ef48d, + 0xf38d34c4, + 0xc1f48536, + 0xc48960c3, + 0x38f3c594, + 0x271cf48d, + 0xa0f49b41, + 0xc369c431, + 0x2be0c2c1, + 0x054d0b43, + 0xea231124, + 0x5e00e534, + 0xae0700ee, + 0x34013007, + 0x03b0f49b, + 0xf731ce34, + 0xec03ea07, + 0xcb4e0738, + 0x0742424a, + 0x76428b4e, + 0xe5f49340, + 0x449902db, + 0x5b3a0740, + 0x83430734, + 0x03448741, + 0x0480604f, + 0xc1920700, + 0x9a8b484d, + 0xc0b14f9b, + 0xf393fb41, + 0x9902dbc0, + 0x25273034, + 0x42f54333, + 0xff021200, + 0xa75c3499, + 0xfdefffae, + 0x42f54333, + 0xff021200, + 0xf3e8031e, + 0x2744a4c1, + 0x184c3333, + 0x131d4c53, + 0xef42c844, + 0xdb8af093, + 0xffbea702, + 0x0449feff, + 0xb9260389, + 0x890d30bc, + 0x439b1a01, + 0xc383140b, + 0xd90b0481, + 0x2c87e423, + 0xaed51187, + 0x2df50908, + 0xff010d20, + 0xe027140b, + 0x990efe9b, + 0x3ea74304, + 0x23fde6ff, + 0xfef2e02e, + 0x4c333205, + 0xa3242710, + 0x0000004f, + 0x35321504, + 0xef4ea734, + 0x4105fde6, + 0xc1034215, + 0xbcbd4e35, + 0x30270d30, + 0xdb22f493, + 0x13439d02, + 0xf493151e, + 0x0702db18, + 0xc11f070f, + 0x04034442, + 0x5e3c1c03, + 0xf3c3ff04, + 0xfe4ef98e, + 0xdafef093, + 0x96040902, + 0x00cabe45, + 0x2704d600, + 0x93fe8e07, + 0x02daebf1, + 0xc6131499, + 0x8e002744, + 0x291469fe, + 0x0b120913, + 0x8d422b43, + 0x4f9b1a14, + 0xfb41c0b1, + 0x93244f9b, + 0x02dac7f0, + 0x873803c1, + 0x3c02c144, + 0x04c5342b, + 0x1223c234, + 0x20270121, + 0xbe300c03, + 0xd600050e, + 0x8e082704, + 0x254f9bfe, + 0xda9ef093, + 0x6403c102, + 0x02c14487, + 0xc5342b68, + 0x23c26004, + 0x27012112, + 0x5c0c0320, + 0x0004e5be, + 0x092704d6, + 0xf193fe8e, + 0x6902da78, + 0x1a138914, + 0x342b1231, + 0x0be014c1, + 0x11430532, + 0x244f9b42, + 0x14c54487, + 0x8d402790, + 0x32229414, + 0xfe8e0127, + 0x00274127, + 0x8e13149d, + 0x3603a9fe, + 0x89046901, + 0x342bdc01, + 0x31022007, + 0x20293107, + 0x031b232d, + 0xfe0b200d, + 0xf493fc4e, + 0xd102da28, + 0x07016044, + 0x690129c0, + 0x07468602, + 0x3603a942, + 0x27410b01, + 0xbe434ed1, + 0x1e000837, + 0x29d02703, + 0x98c489c3, + 0x0c074342, + 0xb21efc0e, + 0xffff3ea7, + 0x2034d1fb, + 0xfa42d804, + 0xc1264f9b, + 0xc3c1c4c2, + 0x2b4487cc, + 0x2b340232, + 0xc1432b32, + 0xc4c5b4c3, + 0xb0c3c5b4, + 0xfffd16be, + 0xb697c499, + 0x31c4494f, + 0x894103c2, + 0xc44d98c3, + 0x4027230b, + 0xc389c149, + 0x35c42d10, + 0x4131cac2, + 0x627e0c07, + 0xa7d766ff, + 0xfeffff4e, + 0x0be844b9, + 0x930e41c4, + 0x02d997fd, + 0x8bf0d0c1, + 0xf901c0f0, + 0x27acc499, + 0xa8cc0335, + 0x10274333, + 0x43f50c07, + 0xff021200, + 0xfff0ffbe, + 0x10270c07, + 0xfff052be, + 0xfc8e00a7, + 0x0499fd4e, + 0x27412412, + 0x39fd8e00, + 0x9be5360e, + 0x4144b14f, + 0x4f9bfa1e, + 0x1943a6a2, + 0x07432702, + 0xf5333332, + 0x02120034, + 0x0031f1ff, + 0x47ff0210, + 0x181c33d2, + 0xd61d1c53, + 0x1e002714, + 0x8725331c, + 0x0423f14e, + 0x99ff0218, + 0x40f11002, + 0xff021600, + 0x030b1123, + 0x010b123b, + 0x42273d87, + 0x120034f5, + 0xfd8eff02, + 0x14470419, + 0x31871103, + 0x34f54327, + 0xff021200, + 0x100032f1, + 0x2c33ff02, + 0x1d2c5318, + 0x410726a6, + 0x03994433, + 0x0444f110, + 0x23ff0218, + 0x0b233b21, + 0x27318724, + 0x0034f542, + 0x21ff0212, + 0x0034f100, + 0xdcff0210, + 0x3187f848, + 0x100034f1, + 0x4ddcff02, + 0x2bf60800, + 0x4efe0b02, + 0x120499fb, + 0x42e4d007, + 0x041900a0, + 0x43333527, + 0x120043f5, + 0x031eff02, + 0xd419f3e8, + 0x43333b27, + 0x10004bf1, + 0xbd83ff02, + 0xb1d6fc0a, + 0xdc210d07, + 0x19ff137e, + 0x2bd239de, + 0x074127c0, + 0x12d49d3e, + 0x3333dc25, + 0x1e474427, + 0x120034f5, + 0x2287ff02, + 0x2bf51103, + 0xff021600, + 0x43273187, + 0x34f5d029, + 0xff021200, + 0x100034f1, + 0x48dcff02, + 0xf12187f8, + 0x02100024, + 0x004ddcff, + 0x4007f608, + 0x4a033427, + 0x120023f5, + 0x4c83ff02, + 0x532e070f, + 0x33233306, + 0x3027140c, + 0xab104c33, + 0x0023f540, + 0xf5ff0214, + 0x02140424, + 0x0ef39bff, + 0xfe4efb8e, + 0x41834107, + 0x87110399, + 0x2b400b44, + 0xd84e6131, + 0x9119803c, + 0x19028101, + 0x0b438713, + 0x034e0542, + 0x99131d31, + 0x41031104, + 0x8e11049d, + 0x21fd4efe, + 0x1ee0070d, + 0x10e49970, + 0x245b2d07, + 0x41834207, + 0xe319e251, + 0x4e0b4487, + 0x12074061, + 0x35334d07, + 0x3c03428b, + 0x2b110310, + 0x083df514, + 0x0bff0218, + 0x39e41904, + 0x994533e3, + 0x43f513e2, + 0xff021800, + 0x180441f5, + 0x3027ff02, + 0xe8004e23, + 0x034335fd, + 0xfde8004e, + 0x181040f5, + 0x2c33ff02, + 0x002fa310, + 0xf5040000, + 0x02181441, + 0xf04e23ff, + 0x4235fde7, + 0xed25d10b, + 0xd4cee4a1, + 0x9d42278d, + 0xfd8e12e4, + 0x30070419, + 0x41274624, + 0x99a2f49b, + 0x44a61234, + 0x0bff6c5e, + 0x390419fe, + 0xf5453300, + 0x02180041, + 0x0442f5ff, + 0x27ff0218, + 0x004e2330, + 0x4335fde8, + 0xe8004e03, + 0x1040f5fd, + 0xf5ff0218, + 0x02181442, + 0xf04e23ff, + 0x4335fde7, + 0xfc4efe0b, + 0x0019d007, + 0x30074327, + 0x20073333, + 0xdc39d129, + 0x34f52333, + 0xff021200, + 0x24f13047, + 0xff021000, + 0x87f848dc, + 0x00e4f1e3, + 0xdcff0210, + 0xf608004d, + 0x31032427, + 0x1200e2f5, + 0x3387ff02, + 0x32f54107, + 0xff021200, + 0x2c874a03, + 0x23f53027, + 0xff021600, + 0x070f4c83, + 0x33165320, + 0x141c3323, + 0xab104c33, + 0x0023f541, + 0xf5ff0214, + 0x02140424, + 0x0ef39bff, + 0xd3554027, + 0x3504d49d, + 0x4efc8ed3, + 0x990319fa, + 0x33330404, + 0xc427a207, + 0xb107d007, + 0xc42baf6b, + 0x34f13403, + 0xff021000, + 0x53184c33, + 0x44131d4c, + 0x31f04cda, + 0x212566d2, + 0x7e0d07d1, + 0xc123ff1d, + 0x2566d251, + 0x0d07d141, + 0x23ff107e, + 0x074d07c1, + 0x2748031b, + 0x013627b6, + 0x05b12312, + 0x03140342, + 0xe6f39844, + 0x26d231c6, + 0x21a5e626, + 0x7e0d07d1, + 0xc127fee9, + 0x031edb35, + 0xdc9dc127, + 0x4efa8e04, + 0xff4ea7fa, + 0x4d01fd4f, + 0xd433c007, + 0xa407d8a3, + 0xf4e8031e, + 0x4627cb01, + 0xf1beb356, + 0xc401fff6, + 0x44963027, + 0xf39bcd05, + 0x38abc50e, + 0xd4cec401, + 0x4efa8ee4, + 0x990d21fb, + 0x0c991004, + 0x5bd12311, + 0x2b4c07d4, + 0xd8b0074d, + 0xa72a804c, + 0xffffdf0e, + 0xdf6bae3e, + 0xc4070a1e, + 0x1c07cf6b, + 0x07fdb57e, + 0x0741034c, + 0xefdcce0b, + 0xf49b4027, + 0xdf3ea70e, + 0x3405ffff, + 0xf94efb8e, + 0x0ea7d007, + 0x07ffffdf, + 0xa1c107b2, + 0x10da99d9, + 0x99ff767e, + 0x2b0710d0, + 0x21be1c07, + 0xb007fff8, + 0x40270656, + 0xa70ef49b, + 0xffffdf4e, + 0x4b050027, + 0xc907f98e, + 0x1c07ca5b, + 0x12230d07, + 0x27fd5d7e, + 0x0ef49b40, + 0xffdf3ea7, + 0x993405ff, + 0xd3a110d2, + 0x4127c183, + 0xcc87423b, + 0xcd0b340b, + 0xcb650d07, + 0x667ed3a5, + 0x8e0127fd, + 0x93fd4ef9, + 0x02d52ffd, + 0x013ad3a9, + 0x0152d4a9, + 0xb93534ca, + 0xc40143d4, + 0xd4d11f41, + 0xd1a9014c, + 0xd2a90148, + 0xd3a9014a, + 0x0d070146, + 0xffeebdbe, + 0xd4bd4227, + 0x101e0143, + 0x4ea73327, + 0x27feffff, + 0xe843bd03, + 0x93fd8e0b, + 0x02d4ebf4, + 0x013843a9, + 0x015844d1, + 0x340b3387, + 0xffff2ea7, + 0xbd4027fe, + 0xd50be824, + 0x270bec23, + 0x0ef49b40, + 0xefff2ea7, + 0xe8031efd, + 0x4c24c1f3, + 0x4c333327, + 0x1d4c5318, + 0x42c84413, + 0xff4ea7ef, + 0x41d1feff, + 0x09270bec, + 0xf40f2ea7, + 0xbe3427fe, + 0x27ffdcff, + 0xc61ea709, + 0x2ea7fef2, + 0x27fef417, + 0xdcedbe31, + 0x0ff353ff, + 0x81f49302, + 0x002702d4, + 0x8ef043c5, + 0x93fb4efd, + 0x02d473f3, + 0x01423eb9, + 0x4e07e383, + 0x42f94433, + 0x0004815c, + 0x43834207, + 0x271041c4, + 0xff4ea732, + 0x0227feff, + 0x0be843bd, + 0x34b9fb8e, + 0x1ea70154, + 0x33fef40b, + 0xf1440343, + 0x02100044, + 0x331351ff, + 0x0127184c, + 0x00273486, + 0x4c533007, + 0x1332131d, + 0x27343244, + 0xd8fb8e00, + 0x14891422, + 0x31460618, + 0x02340712, + 0x2b320742, + 0x35145543, + 0x0b4ea713, + 0x4031fef4, + 0xd4074c21, + 0xd3fafb93, + 0xb9601e02, + 0x71015414, + 0xf54533d3, + 0x02180843, + 0x5414b9ff, + 0x1ad38901, + 0x21274533, + 0x27ff3c04, + 0xb93f6b20, + 0x33015511, + 0x4cf5103c, + 0xff021800, + 0xab1a2c33, + 0x0440f523, + 0x23ff0218, + 0xfde8004e, + 0x4e034235, + 0xf5fde800, + 0x02181041, + 0x1440f5ff, + 0x27ff0218, + 0xf04e2330, + 0x4335fde7, + 0xd051dc41, + 0x1b07d355, + 0x339d0fd6, + 0xfd4127e4, + 0x04815de4, + 0x42b4b900, + 0x4ef35301, + 0x274103fe, + 0xf0b3c501, + 0x0142b4bd, + 0xf94efb8e, + 0xd36efd93, + 0x0b1ea702, + 0xd2a9fef4, + 0x1b290138, + 0x013ed3a9, + 0x3bdab20b, + 0x22f45310, + 0xc50127fe, + 0xdbadf0d4, + 0xf98e0138, + 0x0141dab9, + 0x0140d4b9, + 0x4f6b4a1b, + 0x00b544f4, + 0x43834a07, + 0x04330407, + 0xcf03c007, + 0x00048060, + 0x2bf4c28d, + 0x3ad2a932, + 0x8d410301, + 0xd2b9f6c2, + 0x90270135, + 0x11fcc29d, + 0x03443311, + 0x0481540f, + 0xfac38d00, + 0x9df8cb8d, + 0x41f5fdc9, + 0x00048150, + 0x00028cbe, + 0x0150d0a9, + 0x0726d189, + 0x12310330, + 0xbd310731, + 0x320135d9, + 0xbd4127b3, + 0xda0135d4, + 0xd3a936b3, + 0xd2d1013a, + 0x41870158, + 0x3103240b, + 0x0138d4a9, + 0x013ad3ad, + 0x0158d2d5, + 0x990d40ce, + 0x46a3fcc4, + 0xbdfcc49d, + 0xa90135d9, + 0xa90144d4, + 0xad013cdb, + 0x07013ed4, + 0x9df3932a, + 0x210302d2, + 0xfe1ff453, + 0x34c50127, + 0x383badf0, + 0x4132bd01, + 0x27f98e01, + 0xff4ea732, + 0x0027feff, + 0x0be843bd, + 0xfc4ef98e, + 0xffffcea7, + 0xf0c1d1fe, + 0x9319160b, + 0x02d267fd, + 0x015cd0b9, + 0xfe7785be, + 0x0becc4d1, + 0x16764101, + 0xfd1ff453, + 0x27f0d4c5, + 0xbd412701, + 0x8e0134d4, + 0x41f093fc, + 0x402702d2, + 0x04bd3107, + 0x31830134, + 0x4ea73d76, + 0xbdfeffff, + 0x270be843, + 0x0ef49b40, + 0xefff2ea7, + 0xe8031efd, + 0x4c24c1f3, + 0x4c333327, + 0x1d4c5318, + 0x42c84413, + 0xa70927ef, + 0xfef40b2e, + 0xbe383c27, + 0x27ffda63, + 0xc61ea709, + 0x2ea7fef2, + 0x27fef417, + 0xda51be31, + 0xbe051eff, + 0x53fe9162, + 0x93fe71f3, + 0x02d1dff4, + 0x43c50027, + 0x4efc8ef0, + 0x980889f5, + 0x0bb90469, + 0x09a90140, + 0xc0070136, + 0x7ea7840b, + 0x93feffff, + 0x02d1bbf5, + 0xffff6ea7, + 0x83ab07fb, + 0x1798daa3, + 0xffff3ea7, + 0xe834b9fe, + 0x2742240b, + 0xe834bd41, + 0x5ec0690b, + 0xda07010f, + 0xdc0bd433, + 0x0141c3b9, + 0xd4993b2e, + 0xb94bb6fd, + 0xc60be874, + 0xe8141e44, + 0xff3ea7f3, + 0x34c1fdef, + 0xdc33274c, + 0xf0fc6a4d, + 0x4244131e, + 0x74bd4127, + 0x091e0be8, + 0xb32e4344, + 0xf58e0127, + 0x0be874b9, + 0x50c14144, + 0xc0f08bf0, + 0xc4b9f901, + 0xb4ce0141, + 0x34c4b90c, + 0xad4fc601, + 0xf58e0027, + 0x49f6d389, + 0x3743cec4, + 0x76fdd499, + 0xfcd4994a, + 0xd19641d8, + 0xd8042064, + 0xc2a9fa42, + 0xc0b90156, + 0x32070154, + 0x0155c1b9, + 0x833f3c83, + 0xbeffc02d, + 0x99ffd99c, + 0x41c3fcd4, + 0x5efcd49d, + 0x1a07ff6c, + 0x1c0b1433, + 0xd2f41289, + 0x11891a92, + 0xc81f8bfa, + 0x4a071011, + 0x44334103, + 0x40c14c0b, + 0x0291bef0, + 0x07290700, + 0x0741034a, + 0x334433da, + 0x0b4c0bd4, + 0xf040c1dc, + 0x07f8d389, + 0x01b1be19, + 0x07081200, + 0x0d90ce08, + 0x41034b07, + 0xbf6bb407, + 0x161e4127, + 0x3af4d489, + 0xfcd49940, + 0x070944d8, + 0x0741034b, + 0x27bf6bb4, + 0x40cbbd40, + 0xf6900701, + 0xadfed84f, + 0x270136c0, + 0xa7f58e01, + 0xfbffff3e, + 0x042034d1, + 0xd1fa42d8, + 0xab041830, + 0x0b00870f, + 0x93fe4efe, + 0x02d1dff3, + 0x34d10131, + 0x14ce0128, + 0x2c34d164, + 0x5d14ce01, + 0xa75a11c0, + 0xfeffff3e, + 0x0be934b9, + 0x274e42c0, + 0xe934bd42, + 0x2c31d50b, + 0x9b40270c, + 0x2ea70ef4, + 0x1efdefff, + 0x11f3e803, + 0x33332724, + 0x4c53184c, + 0xc844131d, + 0x1d03f042, + 0x0027013c, + 0xf3cf2ea7, + 0x883c27fe, + 0xffd872be, + 0x1ea70027, + 0xa7fef2c6, + 0xfef4162e, + 0xfe0e3127, + 0xffd85e9e, + 0xfa4efe8e, + 0xd16af293, + 0x2824d102, + 0x07c00701, + 0x1340ceb1, + 0x23a90207, + 0x41270124, + 0x01300d03, + 0x010d24bd, + 0x24d1181e, + 0x40ce012c, + 0x07402715, + 0x2623a902, + 0x0d24bd01, + 0x700d0301, + 0x8eb30501, + 0x0d01c4fa, + 0x40270207, + 0x01300d03, + 0xfa8e1405, + 0xffffdea7, + 0xe9d4b9fe, + 0xd147860b, + 0xce0c2cd4, + 0x00271440, + 0xffd98ebe, + 0xaea74027, + 0xbdfef3cf, + 0x1e0be9d4, + 0x03ac0707, + 0x99013cad, + 0xa39985a4, + 0xab444784, + 0xe9f19343, + 0xae0102d0, + 0x13b9b405, + 0x4307010d, + 0x04074183, + 0x31030633, + 0x01300d03, + 0x2487010b, + 0x010d13bd, + 0x3007210b, + 0x0c034447, + 0x0bbb093f, + 0x282cd541, + 0xe3200701, + 0x4bad7f3c, + 0x2ce30124, + 0x3f0c237f, + 0x3c033419, + 0xf932c280, + 0x34033a07, + 0x2c274007, + 0x1c112720, + 0x0d3129e1, + 0x53340341, + 0x784203e1, + 0x4efa8ef2, + 0x07f063f7, + 0x079307a1, + 0xeeb00782, + 0x0700b013, + 0xff047e1f, + 0xd06efc93, + 0x18c4d102, + 0x2e700701, + 0x1ed027b4, + 0x1cc4d145, + 0x27b42e01, + 0xb93b1ed1, + 0xd1010ecd, + 0x070108ce, + 0xa744334d, + 0x01ffff3d, + 0x99345bf1, + 0x2127ccc0, + 0x3e8b143b, + 0x4d872d3b, + 0x81d84f03, + 0x31ab0004, + 0x47d502ab, + 0xc09d0110, + 0x184bd5cc, + 0x08c3d501, + 0x93412701, + 0x02d017f3, + 0x34bd4d2b, + 0xa8ce010e, + 0x334d071b, + 0xdc33124c, + 0x89d4ab13, + 0x3dd52c34, + 0x49d20120, + 0x23090720, + 0xd21c1e01, + 0x34d1178a, + 0xdc330120, + 0x004e8313, + 0xd4ab0400, + 0x3dd50807, + 0x031e0120, + 0xf3930907, + 0x9902cfd4, + 0xa007cc34, + 0x349d44a3, + 0x430a07cc, + 0x4ef78ef0, + 0x4311c8fe, + 0x00270124, + 0x04b90d1e, + 0x03b901c1, + 0x044701c0, + 0xf49303ab, + 0xc102cfa8, + 0x40076842, + 0xffff3ea7, + 0x104c33fb, + 0x040032d5, + 0x34d540ab, + 0x31d5040c, + 0x34d1042c, + 0x42d80420, + 0x81f093fa, + 0x0abe02cf, + 0x3127fe92, + 0xcf76f493, + 0xca439d02, + 0x0000fe8e, + 0x01274c27, + 0x05140313, + 0xa8040303, + 0x9bfe0bf4, + 0x4927643f, + 0x9b173c53, + 0x030565f4, + 0x01fe3d30, + 0xfe0b0027, + 0xfc003ea3, + 0x2703051f, + 0x4efe0b01, + 0x8004c1fc, + 0x99780399, + 0x41837a01, + 0x448743cb, + 0xc0071f4b, + 0xa28040f1, + 0x102c0001, + 0x071e1027, + 0x27341c08, + 0xd007331c, + 0xc4c1d833, + 0xced1abfc, + 0x0ea70fd4, + 0xa7fbf7ff, + 0xf9e7ff1e, + 0x081e933e, + 0xfe910fbe, + 0x99fccdc5, + 0xc3997ac2, + 0x232f4b7b, + 0x9b462738, + 0x03240b43, + 0x2402334c, + 0xc2c52407, + 0x4efc8ec4, + 0xb20489f9, + 0xd007f063, + 0x3027c107, + 0x3127420e, + 0x9d2ed489, + 0x4123cbd3, + 0xce16d399, + 0xd4890c42, + 0x3b1207aa, + 0x1e412b13, + 0x3b412705, + 0xab340743, + 0xaed4893f, + 0x27bad38d, + 0x27420e30, + 0xc0d4c131, + 0xaf6ba307, + 0x16e4d399, + 0x27313845, + 0x891b1e91, + 0x9027d2d3, + 0x46dad38d, + 0xd4d189a6, + 0x8dd0d489, + 0x4d00dcd1, + 0xd48dffff, + 0xacd489da, + 0xc40e1027, + 0x40271127, + 0x07dad389, + 0xced49db1, + 0x3c2abf6b, + 0x101e4027, + 0x27dcd489, + 0x27c40a30, + 0xc3430731, + 0x074f6b41, + 0x893f6b34, + 0xd39ddad4, + 0x0ac4cace, + 0x2adcd489, + 0x1e42274c, + 0x07402703, + 0x0713ab14, + 0xdad3894c, + 0x03ced19d, + 0x0a43ca41, + 0x22dcd489, + 0x1e44274c, + 0xab402703, + 0xced49d41, + 0x27aed389, + 0xcfd49d40, + 0x891723c2, + 0x3b07b0d4, + 0x112731c3, + 0x1027c40a, + 0x418732a3, + 0xd49d43ab, + 0xe0d4c1cf, + 0x00034ee3, + 0xc549ab0c, + 0xa546e0d4, + 0x00004ea3, + 0xe0d4c504, + 0x0097bfe6, + 0x89e0d1c1, + 0x4107d6d3, + 0xd4c542a3, + 0x89232ae0, + 0x2422d8d4, + 0xd1c513a3, + 0x85d499e0, + 0xd6774fc6, + 0x9fd674af, + 0x630f9b71, + 0xffeefabe, + 0x9b624f9b, + 0x432b633f, + 0x271f49cc, + 0xde6bbe09, + 0x1609ccff, + 0xcb3ef493, + 0x3c44c102, + 0x2b633f9b, + 0x27403243, + 0x815e0e0c, + 0x7e0f0700, + 0x04d6fe1b, + 0x751e0127, + 0xffff3ea7, + 0x6834d1fb, + 0xfa41dc04, + 0x99cfd499, + 0x438bced3, + 0x1ea74438, + 0x1ef9e763, + 0xff1ea706, + 0x0ea7f9e7, + 0x7efbf7ff, + 0xf301fddc, + 0xffff4ea7, + 0x5043d5fb, + 0xcad49904, + 0x4bab2027, + 0x21274486, + 0xd3894c07, + 0xcad29dd2, + 0x1c074fab, + 0x13074302, + 0x8d85d499, + 0x4516d2d1, + 0xa70694d6, + 0xd399b6c6, + 0xff4ea7c4, + 0xd3d5fbff, + 0x00270248, + 0x047443d5, + 0x0027031e, + 0xf98ef043, + 0xffff3ea7, + 0x2034d1fb, + 0xfa42d804, + 0xcceaf293, + 0x3433d102, + 0xec24c104, + 0x438b0027, + 0x0127430e, + 0x23990f6b, + 0xc34007e6, + 0x2743ab41, + 0x27448630, + 0xe6239d31, + 0xfe4efe0b, + 0x8ebe1027, + 0xfe0efe8f, + 0xfe85f89e, + 0xf063fc4e, + 0x2f9bd007, + 0x634f9b62, + 0x29cc242b, + 0x51fc932c, + 0xc4c102ca, + 0x633f9b3c, + 0x42d2432b, + 0x630f9b1c, + 0xffede2be, + 0x5ebe0927, + 0x09ccffdd, + 0x3cc4c10c, + 0x2b633f9b, + 0x3a04da43, + 0x36c0d4c1, + 0x7e0d0745, + 0x131efd33, + 0xf685d499, + 0xff0ea745, + 0x1ea7fbf7, + 0x7ef9e7ff, + 0x4027fcf0, + 0x070ef49b, + 0xfcf57e0f, + 0xf3010806, + 0xffff4ea7, + 0xd50027fb, + 0x1e045043, + 0x3cc4c11b, + 0x2b633f9b, + 0x27492843, + 0x0c1e0e0c, + 0xd49d4127, + 0xbe0d07e6, + 0x43ffe5f7, + 0x4efc8ef0, + 0xb00489fd, + 0x41ced007, + 0xab410769, + 0xd401894f, + 0x07dc048d, + 0x07140234, + 0xb2d48931, + 0xced4d38d, + 0xd3894142, + 0xaed189d6, + 0x4fab4307, + 0x31074102, + 0x8dd8d189, + 0x4207d6d3, + 0x3fab3107, + 0x43024fab, + 0xd4a91207, + 0xd3890104, + 0xab410390, + 0xd8d18d4f, + 0x0104d4ad, + 0x4127432e, + 0x93e8d49d, + 0xffe5bff4, + 0x8cbed405, + 0x3027ffed, + 0xffff4ea7, + 0x1843d5fb, + 0x9d402704, + 0xfd8ee5d4, + 0x00000000, + 0x00000001, + 0xff060b80, + 0xff060bc0, + 0x00048060, + 0xf493f54e, + 0x6902ca18, + 0x09432946, + 0xa3444942, + 0xe50199f1, + 0xf445630b, + 0x622bd007, + 0x048917d6, + 0xc1462eac, + 0x4696c004, + 0x1607f241, + 0x55fc8e7e, + 0xc30ff6f0, + 0x9d412704, + 0xdfbee5d4, + 0xf055ffee, + 0x04b404ec, + 0x1685d499, + 0x3500a745, + 0x89081ef0, + 0x1103acd1, + 0x4027f135, + 0x9bcdd49d, + 0x41c0b14f, + 0xff3ea7fb, + 0x34d1fbff, + 0x42d80420, + 0x114f27fa, + 0x9b600000, + 0x4e27a0f4, + 0x9b200000, + 0xf25122f4, + 0x04702ff6, + 0xf3935127, + 0x2902c994, + 0x09376934, + 0x2cd38932, + 0x722b740b, + 0xff52f453, + 0x48013123, + 0xf053732e, + 0x0801ff4c, + 0x99bada89, + 0x85a616d4, + 0x07a8d189, + 0x2b243b27, + 0x27051e12, + 0x27143b11, + 0xb0d48930, + 0x474ef325, + 0xff22f453, + 0x151e4c01, + 0x2785d499, + 0x46f02501, + 0x15f25345, + 0x1e2c01ff, + 0xcbdc9904, + 0x4aacd489, + 0x01f35347, + 0x1e3e01ff, + 0xc0d4c112, + 0x44963027, + 0x43073127, + 0xe40741c3, + 0xd399ef6b, + 0xcfd299ce, + 0x238b9a07, + 0x98334207, + 0xa3104c33, + 0x0800009f, + 0x004e8380, + 0x94ab0200, + 0xb207a353, + 0xcc3391ab, + 0x33b93312, + 0x273f0ba4, + 0x27e48601, + 0xabf42100, + 0x0704ab9c, + 0x104c334e, + 0xbaab94ab, + 0x830d8c33, + 0x33400737, + 0xb8ab183c, + 0x4c331353, + 0xab43ab1b, + 0x33f905b1, + 0x33beabe8, + 0xabf30144, + 0xa304c6b4, + 0x994000bd, + 0x44c6cad4, + 0x1000bda3, + 0xc8a6f193, + 0xccd49902, + 0x3707a007, + 0x331a1289, + 0xab3123a3, + 0x20d8d1a4, + 0xbcdcc101, + 0xaca3320e, + 0x15202710, + 0xff3ea7f2, + 0x34d1fbff, + 0x41dc0468, + 0x0c4cfcf5, + 0x3f9b018d, + 0x634f9b62, + 0xc3d2342b, + 0x7e30e878, + 0xcdd49901, + 0x2f9b4bf6, + 0x634f9b62, + 0xc2d2242b, + 0x79f09364, + 0x04c102c7, + 0x633f9b3c, + 0x42d2432b, + 0x630f9b54, + 0xffeb0abe, + 0x86be0c07, + 0xc0d2ffda, + 0x59f19344, + 0x14c102c7, + 0x633f9b3c, + 0x40d2432b, + 0x03281e34, + 0x9d4f6b41, + 0x44d0cdd4, + 0x630f9b28, + 0xffeadebe, + 0x9b624f9b, + 0x432b633f, + 0x070cc4d2, + 0xda4fbe0c, + 0x9bc012ff, + 0x0d07634f, + 0x27fcad7e, + 0xcdd49d41, + 0x277fafc6, + 0x0ef29b20, + 0xff8b0007, + 0x2117a8d8, + 0xe0d3c1f4, + 0xab134c33, + 0xe0d4c543, + 0xffff3ea7, + 0x1034d5fb, + 0x52a7d804, + 0xd1ccd299, + 0xd10110d4, + 0xd80114d1, + 0xf0531821, + 0x3407fd90, + 0x30010401, + 0x40053403, + 0x4fc44403, + 0xff060bc0, + 0x1822d8f2, + 0xf1533107, + 0x1401fd78, + 0x34033201, + 0x44034205, + 0x0c004fc4, + 0xd1f2ff06, + 0xa70108d4, + 0xfbffff3e, + 0x040c34d5, + 0xd49d4027, + 0x10ac38cc, + 0x15244f9b, + 0x9b4027f4, + 0x00070ef4, + 0x0ea7ff8b, + 0xabfbffff, + 0x240bd5b8, + 0x6409d504, + 0xced29904, + 0x21533027, + 0x89cad39d, + 0x3707dad4, + 0xd29d1707, + 0x033203ce, + 0x0d34ca11, + 0x42dcd489, + 0xa3420741, + 0xced49d44, + 0x89cfd399, + 0x3153aed4, + 0x41cfd39d, + 0x0d24c2f2, + 0x42b0d489, + 0xa3430741, + 0xcfd49d44, + 0x11e0d4c1, + 0xc543e3f3, + 0x3556e0d4, + 0xfcdaf353, + 0x221e3c01, + 0xc6fef093, + 0xc1f41102, + 0xf1539003, + 0x4487fcc8, + 0x432b1c01, + 0x1e94048d, + 0xb5f25309, + 0x1e2c01fc, + 0xff3ea722, + 0x34b9feff, + 0x41c40be8, + 0xd1f4930e, + 0x40c102c6, + 0xc0f08bf0, + 0xf053f401, + 0x0501fc94, + 0xf1316707, + 0x930e16ce, + 0x02c6b7f2, + 0x41002409, + 0x00fdcff6, + 0xffff3ea7, + 0x6834d1fb, + 0xf541dc04, + 0x4c183027, + 0x07312710, + 0x271f6b13, + 0x27481830, + 0x273f6b31, + 0x27441820, + 0xd62f6b21, + 0xa6249634, + 0xa7002719, + 0xfbffff4e, + 0x046840d5, + 0x15c63496, + 0xffff1ea7, + 0x2014d1fb, + 0xf541d804, + 0xf2532546, + 0x2501fc34, + 0x34c60d1e, + 0x071e5227, + 0xfc22f353, + 0xf4933501, + 0xc102c574, + 0x1f9b3c42, + 0x623f9b63, + 0x422b4307, + 0x32074008, + 0x432b4107, + 0x931641c8, + 0x02c557f0, + 0x1b3c04c1, + 0x1848c441, + 0xfe7817be, + 0x101e0726, + 0x93614f9b, + 0x02c53ff1, + 0x8bbc13c1, + 0x53450643, + 0x01fbdff2, + 0xcdd49925, + 0x4f9b4aa6, + 0x633f9b62, + 0x40cc432b, + 0x1df49329, + 0x43c102c5, + 0x634f9b3c, + 0x00c034ee, + 0x0762cf9b, + 0x8d49be0d, + 0x624f9bfe, + 0x41ec4c2b, + 0x342700b2, + 0xab5ef355, + 0x1251c000, + 0x644ef431, + 0xe7630ea7, + 0xff1ea7f9, + 0xc97efbf7, + 0x53c556f7, + 0x01fb8bf1, + 0xc0231e10, + 0xf2933c51, + 0x0902c5ac, + 0x0d012320, + 0x53059620, + 0x01fb7ff3, + 0xeb6ebe30, + 0xc0d4c1ff, + 0xd4c54103, + 0xec55d6c0, + 0x76fbf501, + 0x55472705, + 0xc05c1ef4, + 0xf2410c51, + 0x0d071607, + 0x1eface7e, + 0x9d412706, + 0xd499e6d4, + 0x934726e6, + 0x02c48ff4, + 0x994443c1, + 0x030b4e40, + 0xffd674be, + 0xfe7da3be, + 0x52c4181e, + 0xc4d4011d, + 0x019bd44f, + 0x00270c00, + 0xf0554127, + 0x1ee8d49d, + 0xbe0d0716, + 0x07ffe07f, + 0x9b402750, + 0xf55522f4, + 0x5127051e, + 0xf051b41e, + 0xf58ef183, + 0xd007fb4e, + 0x0ea7b107, + 0x07fffa23, + 0xbec2071d, + 0x36fec911, + 0x071d0706, + 0xa73c072b, + 0xfffa230e, + 0xfecd60be, + 0xf49b4027, + 0x00fb8e0e, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0xff0102cc, + 0x00049000, + 0x00000001, + 0x00000000, + 0x00000003, + 0x00000004, + 0x1007fd4e, + 0xd1871f6b, + 0x917cdf03, + 0x08530004, + 0x01103f9b, + 0xc1f293d4, + 0x2e610195, + 0xd405432b, + 0x9908e19d, + 0x3ea71624, + 0x9dfd4fff, + 0x248909e4, + 0x99e44d08, + 0x21890c24, + 0x0b32110a, + 0x05e46d41, + 0x2707f6e2, + 0x0ef49b40, + 0xff8b0007, + 0x30274027, + 0xe39de405, + 0x102f9b08, + 0x420bd401, + 0xfd8ed405, + 0x42734007, + 0xf4e84103, + 0x4007e31e, + 0x45334a03, + 0x180042f5, + 0x100bff02, + 0x180443f5, + 0x2027ff02, + 0xe8004e23, + 0x034235fd, + 0xfde8004e, + 0x181041f5, + 0x43f5ff02, + 0xff021814, + 0xe7f04e23, + 0x0b4235fd, + 0x274027fe, + 0x1253ff2c, + 0x028d31a7, + 0x2d030d32, + 0x15048501, + 0x55043504, + 0x95042504, + 0x8d04b504, + 0xf49b1a02, + 0xa7fe0b0e, + 0xf7ffff4e, + 0x010040d5, + 0x25c62253, + 0x34d13407, + 0x14050108, + 0xf2a81403, + 0x0301fe0b, + 0x430731ab, + 0x23051207, + 0x44331403, + 0x00003fd8, + 0xc80e0f00, + 0x04014140, + 0xffff4f83, + 0x0405f0fc, + 0x060b0499, + 0x83040146, + 0x0300004e, + 0x40274706, + 0x470b049d, + 0x1d4c5343, + 0x40274644, + 0x14031405, + 0xfe0b0107, + 0x2cdc0211, + 0x2cd81c10, + 0x1415e120, + 0x18031405, + 0x0411d91e, + 0x4ee31403, + 0xa30c0002, + 0x1e241541, + 0x111405b2, + 0xd8140302, + 0x1ec0202c, + 0x074207de, + 0x28114823, + 0x1e102741, + 0x27020782, + 0x0000004f, + 0x050403f0, + 0x4efe0b24, + 0x07c207f9, + 0x072307b1, + 0x4f11c890, + 0xc04cc1c8, + 0x0739101c, + 0x3819cca1, + 0xc9ccdc07, + 0x0732073a, + 0x072d071a, + 0x23bf3e09, + 0x073007b8, + 0x071b072d, + 0x23b33e09, + 0x073007c8, + 0x072c071a, + 0x07a73e09, + 0x071b0730, + 0x0e2c0709, + 0xc09b1ef9, + 0x271a10cc, + 0xc8dc07a8, + 0xd827c8c9, + 0x0207c41e, + 0x40004f27, + 0x0403f000, + 0xf98e2405, + 0x40001d27, + 0x035ef90e, + 0x07f94eff, + 0x07b107c2, + 0xc8900723, + 0xc1c85a11, + 0x201cc057, + 0xcca10741, + 0x073f111c, + 0x11ccccdc, + 0x07320742, + 0x072d071a, + 0xff657e09, + 0x0710bc23, + 0x072d0730, + 0x7e09071b, + 0xcc23ff57, + 0x07300710, + 0x072c071a, + 0xff497e09, + 0x1b073007, + 0x2c070907, + 0x3c5ef90e, + 0x20ccc0ff, + 0x10ac271d, + 0xccc8dc07, + 0xdc27c011, + 0x07bb1e10, + 0x004f2702, + 0x03f00080, + 0x8e240504, + 0x001d27f9, + 0x5ef90e80, + 0xf94efe86, + 0xb107c207, + 0x90072307, + 0x46401cc0, + 0x1ccca107, + 0xdc074421, + 0x3521cccc, + 0x1a073207, + 0x09072d07, + 0x23ff607e, + 0x300720bc, + 0x1b072d07, + 0x527e0907, + 0x20cc23ff, + 0x1a073007, + 0x09072c07, + 0x07ff447e, + 0x071b0730, + 0x0e2c0709, + 0xff375ef9, + 0x1e20dc27, + 0x40ccc0c8, + 0x20ac270c, + 0xccc8dc07, + 0xed1ebb21, + 0xc0001d27, + 0x1b5ef90e, + 0x27fe4efe, + 0x0a029941, + 0x070b049d, + 0x3024c031, + 0x23c02534, + 0x20061e15, + 0x1926c025, + 0x0299ff1e, + 0x08019909, + 0xf25efe0e, + 0x090299fe, + 0x0e080199, + 0xfe5b5efe, + 0x99090299, + 0xfe0e0801, + 0x99ff595e, + 0x01990902, + 0x5efe0e08, + 0xf84efe5f, + 0xffff4ea7, + 0x0a0399ff, + 0x010844d1, + 0x3fc6b007, + 0x53a4076c, + 0x6b940748, + 0x10ac539f, + 0xeb070307, + 0xc0a78027, + 0xe299d027, + 0x07420758, + 0x33433332, + 0xc0342b35, + 0xf113ff2c, + 0x00018c34, + 0x3b1127ff, + 0x004ed81d, + 0xeb260400, + 0x03d103c1, + 0xd7f0f0e1, + 0x842eb441, + 0x4cceb431, + 0xff4ea720, + 0x4cc5f7ff, + 0x4848c544, + 0xb8450027, + 0xf88ebc35, + 0x07db92ce, + 0x108c338d, + 0xd21e8aab, + 0xf88e0427, + 0x8027c027, + 0xfd4ecf1e, + 0xffff4ea7, + 0x074301f7, + 0xdc0107d0, + 0x16b60d38, + 0x0e27fd8e, + 0x7e271006, + 0x0d07fc50, + 0x76ff5d7e, + 0x0efd8e02, + 0xfc425efd, + 0x3ea7fc4e, + 0xc1fdefff, + 0xd0077034, + 0x53184c33, + 0x44c41d4c, + 0x07c30719, + 0x3e10270d, + 0xe84327ba, + 0x70c3c1f4, + 0x53183c33, + 0x34c01d3c, + 0x4efc8eeb, + 0x190499fb, + 0x4487f0e3, + 0x369841f1, + 0x04310004, + 0x15140389, + 0x07f105f4, + 0xd43fe6d0, + 0xf9302700, + 0x04369233, + 0x1ad49900, + 0x9d10d289, + 0xf39308f3, + 0xf90136d8, + 0x04369444, + 0x9d331900, + 0xf39d09f4, + 0x9d2fe60a, + 0x18d49900, + 0x00964ff6, + 0x1ea70f07, + 0x7ef9e0ff, + 0xb007fe85, + 0x0716d099, + 0x03433340, + 0x43f1544c, + 0xff021000, + 0x53183c33, + 0x34c41d3c, + 0xbdfc9328, + 0x0c070192, + 0x0a0e1d27, + 0x99ff297e, + 0x400716d0, + 0x4c034333, + 0x0043f154, + 0x33ff0210, + 0x3c53183c, + 0xdf34c01d, + 0xe100be03, + 0xe33b07f9, + 0x361c2733, + 0xe0ff2ea7, + 0xfbd07ef9, + 0x0316d499, + 0xf143334a, + 0x02100043, + 0xe03cd8ff, + 0x71fc9320, + 0x0c070192, + 0x0a0e1d27, + 0x99fedd7e, + 0x4a0316d4, + 0x43f14333, + 0xff021000, + 0xe7e03cdc, + 0xfb8ef0c3, + 0x00001fa3, + 0x40270900, + 0xf415f105, + 0x99ff5f5e, + 0x2c5e1b03, + 0x07fc4eff, + 0xffdea7c0, + 0x0b1ef7ff, + 0x272241dc, + 0x7e640a0d, + 0xd401fb08, + 0xd81044dc, + 0x0c07ef48, + 0x8f7e1027, + 0xd8d401fe, + 0x0227f244, + 0xfe21c99e, + 0x0000fc8e, + 0x0003e81c, + 0x0003e80f, + 0x0003e81b, + 0x0003e807, + 0xf1a3f54e, + 0x9107a007, + 0xa469161e, + 0x450b4c2b, + 0x41c84f8b, + 0xd9f41362, + 0x0a074101, + 0xa7fe517e, + 0xffffff2e, + 0x010224a9, + 0x010423a9, + 0x9289c407, + 0x1b4307ca, + 0x07422b4c, + 0xc89d8964, + 0xd62b6fab, + 0xd123f305, + 0xffff3ea7, + 0x093499fe, + 0x019fd0e8, + 0x34074383, + 0x44873433, + 0x32f1342b, + 0xff000054, + 0x7307a401, + 0xffb47e23, + 0x8e24e2ff, + 0x09a49901, + 0xd608a599, + 0x9231954f, + 0xf235b127, + 0x74191207, + 0x990f1c83, + 0x13330473, + 0x31078307, + 0xff843e23, + 0x7c12f9ff, + 0x15ff0000, + 0x00f345f4, + 0x18b02782, + 0xb2a3402c, + 0x14f9b906, + 0xff00007d, + 0x231e4bce, + 0xff4ea7c1, + 0x43b9ffff, + 0x4c070108, + 0x030f4c83, + 0x53344ec1, + 0x01ff2ff2, + 0xff505e21, + 0x0131dfe6, + 0xffff2ea7, + 0xb93c07ff, + 0x83010824, + 0xf3550f3c, + 0x00b334ee, + 0xfe4851be, + 0x2ea77459, + 0xa9ffffff, + 0x25010223, + 0xaf3ceef4, + 0x27b42700, + 0x9b402704, + 0x2ea70ef4, + 0x21fd4fff, + 0x3824c5f3, + 0xd608a39d, + 0x2ea75ebf, + 0xa9feffff, + 0x27014224, + 0xad4103e1, + 0x9d014224, + 0x3ea709ae, + 0x6dfd4fff, + 0x193211ac, + 0x899d2d94, + 0x9129c893, + 0x012892d5, + 0x4383f251, + 0x941d923d, + 0x31c0312b, + 0xa7d8d634, + 0xffffff3e, + 0x06373ebd, + 0x270f3299, + 0x0ef49b40, + 0x22873127, + 0xb04023f5, + 0x9431ff02, + 0x41037321, + 0xc87734ce, + 0x10072d05, + 0xe8001e03, + 0xfea05e03, + 0x2ea7f331, + 0x6bfddfff, + 0xa343873f, + 0xd504004d, + 0xd5020824, + 0x1e02082b, + 0x65f453b5, + 0x5e4101fe, + 0x04e0fe7e, + 0xf183fe7f, + 0x24a9f58e, + 0xf3010104, + 0xff4b43ee, + 0x54eef421, + 0x7419ff45, + 0x42eef211, + 0x6f26ff3d, + 0x2439f241, + 0x997bb4ce, + 0x4fd605a4, + 0x034c076e, + 0xff3ea741, + 0x34adffff, + 0xdad60102, + 0x0027b027, + 0x1a5e746d, + 0xa39419ff, + 0x1e941d44, + 0x27943183, + 0x83410302, + 0x8ea405f1, + 0x830227f5, + 0xfcf58ef1, + 0xf6fecf28, + 0x53fecb8f, + 0x01fdeff3, + 0xfe0c5e31, + 0x0027b027, + 0x99fee85e, + 0x4fd605a4, + 0xa18fc6a4, + 0x0ea7f331, + 0x25fff9cf, + 0x27741973, + 0x1d410331, + 0x05a39d74, + 0xfe9e74be, + 0xb227871e, + 0xbe5e0227, + 0x272b3dfe, + 0xff4ea730, + 0x43adffff, + 0x44a9010a, + 0x36070104, + 0x2ea7340b, + 0x27ffffff, + 0xad0427b4, + 0x5e010423, + 0xfa4efe99, + 0xd107a007, + 0xcea7b207, + 0x11fdcfff, + 0x01d101de, + 0x11d431e0, + 0x2b132112, + 0x0b340b40, + 0x1132ab24, + 0x483028e0, + 0xa7fa8e00, + 0x27f91e00, + 0x44c4c542, + 0x1b070a07, + 0x27fbd17e, + 0x44c4c540, + 0x1e64c4c5, + 0x000000cb, + 0x00000055, + 0x000492b8, + 0x00000018, + 0xff1afe3c, + 0x000001c4, + 0xa007f54e, + 0xf0e32a07, + 0x01480d03, + 0x05202c03, + 0xc1f225f0, + 0xf001bca4, + 0x49894229, + 0xcd4399c8, + 0x2b994199, + 0x2b340392, + 0x142c2731, + 0xf7d2f193, + 0x3b9123ff, + 0xff707e93, + 0x04334087, + 0x3407400b, + 0x340b3433, + 0x01a6f413, + 0xbca2c141, + 0xf5f83e23, + 0x014107fe, + 0x0511232d, + 0x0324033d, + 0x93f49834, + 0x018c1ff2, + 0x24012311, + 0x41033103, + 0x24052315, + 0x069e31ec, + 0x8c0af393, + 0xa7340101, + 0xfefd33de, + 0x4127d405, + 0xcfff0ea7, + 0x6c04c5fd, + 0x04c52027, + 0xbcabc170, + 0x31274027, + 0x9d0da39d, + 0xa29d0ca4, + 0x89a24d10, + 0xa18d0cb2, + 0x0aa98d08, + 0xa716a28d, + 0xfef29b3e, + 0xb489a365, + 0x99b39972, + 0x04874123, + 0xf0ccb299, + 0x89062f34, + 0x342374b4, + 0xa39d492b, + 0x02433b0f, + 0x5b420742, + 0x07340743, + 0x07212320, + 0x87412343, + 0x2b230b13, + 0x9da26d13, + 0x11030ea4, + 0x41e80407, + 0x23070617, + 0x3a072123, + 0x349d42a7, + 0xb0310311, + 0x9d0a0bf2, + 0xbd891101, + 0x0ea4990c, + 0xe016ad8d, + 0x05caff4c, + 0x8b72f093, + 0x10048901, + 0x34870231, + 0x139b1907, + 0x0307120b, + 0xe307010b, + 0x8cbefd93, + 0x99e00b01, + 0xdea70ed2, + 0x0befffff, + 0x93dca13e, + 0x018b47fd, + 0x8deed48d, + 0xd48d16d4, + 0xa6d48d5e, + 0x012cd3d5, + 0xc554d1c5, + 0xdec59cd0, + 0x892103e4, + 0x2f6b72bd, + 0x9b99b699, + 0x0fa799d2, + 0xc174bb89, + 0xc0c8b4a8, + 0x75f25324, + 0xa74227fe, + 0xefffff3e, + 0x34052001, + 0x7e1a1c27, + 0x0ea7fa22, + 0x27efffff, + 0xa1040540, + 0xde30cc03, + 0x48234647, + 0xdfabd43b, + 0x2ea7d8ab, + 0x85efffff, + 0xff3ea72d, + 0x3401f7ff, + 0xdb204cf8, + 0xff2ea705, + 0x0027f7ff, + 0x993820c5, + 0x49070fa3, + 0x24c5433b, + 0xbca1c13c, + 0x890ea499, + 0x41037213, + 0x4a334f6b, + 0x03ff3d83, + 0x43ab973b, + 0xb1231907, + 0xabe824c5, + 0x3b40271f, + 0x9ddb07b7, + 0xa18de1a4, + 0xf6dfabda, + 0x9d412714, + 0xa09de1a4, + 0x27d12ee2, + 0xe2a49d41, + 0x3127f221, + 0x073b0307, + 0xe027010b, + 0x8de12e9d, + 0x3103da20, + 0x412704f6, + 0x9de1249d, + 0x0deee22e, + 0x2c0304a6, + 0xdd34c420, + 0xc10ca599, + 0xd507bca2, + 0x33982499, + 0x08a389d5, + 0x2a0b2d07, + 0x343b4423, + 0x15dc2189, + 0xd8238dfd, + 0x03bb1ff6, + 0x4910a499, + 0xf6438ba3, + 0xa703b04f, + 0xf7ffff0e, + 0x4cf80401, + 0x07054310, + 0x33450765, + 0x0b463363, + 0x606df164, + 0x07000490, + 0x03d101c6, + 0x049028cf, + 0xbd1fe600, + 0x83410704, + 0xd34fe641, + 0x070c0703, + 0xf61f7e2a, + 0x3f033607, + 0x0004900c, + 0x891e3189, + 0x21871634, + 0x348d412b, + 0x1c348916, + 0x348d2d0b, + 0x65f41114, + 0x8d4a0b3c, + 0x32c5dc41, + 0xf951e054, + 0x9351f403, + 0x01fd9303, + 0xbea7018b, + 0xa7fefd27, + 0xfefd17ce, + 0xd401b311, + 0x432bd211, + 0x50104cf4, + 0xe8320705, + 0x07052830, + 0x03160743, + 0x04900c1f, + 0x33338700, + 0x89432b45, + 0x4c0b1e12, + 0x1c034205, + 0x2744033c, + 0x03100136, + 0x03400514, + 0x01f3a844, + 0x053103d3, + 0x11b305d3, + 0x834103d4, + 0xd4150f4c, + 0x0f030607, + 0x0004900c, + 0xdea74127, + 0x11fdcfff, + 0x1c0389f1, + 0x896cd4c5, + 0x1a0b08ae, + 0x3d044027, + 0x4127fffe, + 0xc1e4149d, + 0x1389bca4, + 0x724289dc, + 0x40273e0b, + 0x4127320e, + 0x89e3149d, + 0x0489c813, + 0x3134ee1c, + 0x27086102, + 0x27890910, + 0xf1418724, + 0x04914043, + 0x7039ee00, + 0x78110304, + 0x272027f2, + 0xf1428714, + 0x04914043, + 0xff3fe000, + 0x84ffffff, + 0x58210303, + 0xedf493f1, + 0x41890188, + 0x5c408914, + 0x89a44e89, + 0x1f8bec4d, + 0xef8b0f8b, + 0x3027df8b, + 0x43872427, + 0x914044f1, + 0x144e0004, + 0x4e0e042e, + 0x036bd4ee, + 0xf2483103, + 0xfc26f053, + 0xc0a70b01, + 0x8411d0a7, + 0x03fb4fe6, + 0xe61f2ea7, + 0x272405fd, + 0x1501c43d, + 0x35402723, + 0x0f0ea724, + 0x2c27fde6, + 0x15020524, + 0xfdf35303, + 0xa73201fb, + 0xfde60f3e, + 0x1b070027, + 0xd07e3435, + 0xf54c87f4, + 0x04914049, + 0x06b39900, + 0x00863fe6, + 0x24332d07, + 0xf8f02e23, + 0x6462f5e4, + 0x07000490, + 0x27142732, + 0x03340540, + 0x07f1b834, + 0x2700271b, + 0x081499e8, + 0x11ff4cc0, + 0x92d044f9, + 0x23010004, + 0x403b4153, + 0x230534ab, + 0xc0101499, + 0xf911ff4c, + 0x0492d044, + 0x53231100, + 0xab403b41, + 0x99231534, + 0x4cc02814, + 0x44f911ff, + 0x000492d0, + 0x41532321, + 0x34ab403b, + 0x14992325, + 0xc0110330, + 0xf911ff4c, + 0x0492d044, + 0x53233100, + 0xab403b41, + 0x03233534, + 0x9efef004, + 0xe6a1a499, + 0x9901ae4f, + 0x3fe606b3, + 0x64e901a7, + 0x00049028, + 0xfffe4de0, + 0x31e0019b, + 0xac990329, + 0x33dc07b9, + 0xc72616dc, + 0x0f0fdda3, + 0x9911c1c4, + 0xb49948b3, + 0x103c3349, + 0xab134c33, + 0x01d3ab34, + 0x7e9027f0, + 0xa499f6f0, + 0xf54487ba, + 0x0109f84d, + 0x0ef99bff, + 0xa7baa499, + 0xfde63fde, + 0x4e234487, + 0x05fef608, + 0x153427d4, + 0x354127d3, + 0xff0ea7d9, + 0x04c5f7ff, + 0xf1c766e0, + 0x04902464, + 0x11f00100, + 0xf6b27e4c, + 0x054ccc03, + 0xf02c27dc, + 0xd935d215, + 0x03baa499, + 0x9d438341, + 0xb399baa4, + 0xf13b6606, + 0x04906464, + 0x01250700, + 0x07243343, + 0xf5140314, + 0x0a3f4023, + 0x470127ff, + 0x534007e5, + 0x0b300741, + 0x8344474e, + 0x0b120131, + 0xf5448743, + 0x0a3f4042, + 0x030103ff, + 0xe204c414, + 0xb349f411, + 0x438d4a0b, + 0x06bd99c8, + 0x4d9d3127, + 0x48b099ca, + 0x99cf409d, + 0x439d49bb, + 0xd04b9de0, + 0x62f18507, + 0x00049024, + 0xb8078a03, + 0x2409b533, + 0x0b077507, + 0x21312c21, + 0x2e512d71, + 0x23367c03, + 0xfde8000e, + 0x4d003027, + 0x3127fffe, + 0x3b079307, + 0x9c33b807, + 0xf03e231a, + 0xb533fde7, + 0x2c41051e, + 0xbdf5e027, + 0xff021808, + 0x051a2489, + 0x334f6b0c, + 0x49ab104c, + 0x04350115, + 0x31153705, + 0x34354027, + 0x1e07d10b, + 0xe9d8efd6, + 0x04902a63, + 0xf5458700, + 0x0800ec43, + 0x0bfd11ff, + 0xdcd489da, + 0x23e4d399, + 0xdcd48d41, + 0x01173ff6, + 0xd49d4027, + 0x69a249e0, + 0xab12eea1, + 0x83420700, + 0x994a0b43, + 0x3f4b1143, + 0x20c8230b, + 0xee12daf1, + 0x42073207, + 0x42533383, + 0x9d08a48d, + 0xa24d0ca3, + 0x27fbdf5e, + 0x5ec027d0, + 0x52c0fe87, + 0x3953c04e, + 0x2ea7ff1e, + 0x05fde61f, + 0x1f3ea721, + 0x2c27fde6, + 0x15160738, + 0x281f0332, + 0xa7000490, + 0xfde60f0e, + 0x3c273435, + 0x15030524, + 0x0f3ea702, + 0x0027fde6, + 0x487e3435, + 0xfc025ef2, + 0x874afd93, + 0x8fbea701, + 0xcea7fef9, + 0x5efef7c7, + 0xfd93fc30, + 0xa7018730, + 0xfef997be, + 0xf987cea7, + 0xfc1e5efe, + 0x8716fd93, + 0x1fbea701, + 0xcea7fefd, + 0x5efefb57, + 0x4127fc0c, + 0x5ee2249d, + 0xabc1fb56, + 0x0da49dbc, + 0xb41d4127, + 0x01bca1c1, + 0xf6567ef0, + 0xf9250fe6, + 0xf58ef0c3, + 0x432b4427, + 0x890fa49d, + 0x243b74b3, + 0x32e2392b, + 0x3207f9d7, + 0x27f9d25e, + 0xf9f75e00, + 0x4103432b, + 0x21152405, + 0x07f95b5e, + 0x073d07d2, + 0x3334334d, + 0x0b432b47, + 0x23b4874d, + 0xe50000be, + 0xa75ecd07, + 0x1ed307fc, + 0x03f211e5, + 0x0207c82c, + 0xc47e0a0b, + 0xfede5ef4, + 0xffff1ea7, + 0x091499fe, + 0x24874383, + 0x422b4433, + 0x005043f9, + 0x32c0ff00, + 0x27b10725, + 0x1388100e, + 0x01f0af7e, + 0x1e1ff6d1, + 0x09b499fb, + 0x24874383, + 0x422b4433, + 0x005043f9, + 0x32c4ff00, + 0x2264e9df, + 0x87000490, + 0x5e11a314, + 0xd307fafd, + 0x0128cc27, + 0x0d1c27f0, + 0x7e40dcc5, + 0x4827f40e, + 0x0140d4c5, + 0x203cfcd3, + 0xe81efa0d, + 0xf842f253, + 0x3ea72d01, + 0x01f7ffff, + 0x403dc5f0, + 0x7e0c1c27, + 0x0ea7f3ea, + 0x27f7ffff, + 0x4004c548, + 0x3cfc0301, + 0x1efa9a10, + 0xb1f493de, + 0x41210184, + 0x2fbe0b07, + 0x2a5efd3d, + 0xb8ac99fc, + 0x07fcd85e, + 0x23343331, + 0xe4f8f03e, + 0x63f54107, + 0x00049064, + 0x3e034733, + 0x2be4f8f0, + 0x87410b43, + 0x00be23b4, + 0x915ee500, + 0xa74227fc, + 0xfdcfff2e, + 0x24c5f001, + 0x161c2744, + 0x27f3897e, + 0xff3ea740, + 0x34c5fdcf, + 0x6434c544, + 0xa7faa75e, + 0xfab15e30, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0xf6dbf800, + 0xf333f555, + 0xeaabf000, + 0xc000e000, + 0x40000000, + 0x15552000, + 0x0ccd1000, + 0x09250aab, + 0x00000800, + 0x10101010, + 0x10101010, + 0x10101010, + 0x10101010, + 0x10101010, + 0x18151211, + 0x10101010, + 0x19161311, + 0x12111010, + 0x1d191614, + 0x15121010, + 0x241f1b18, + 0x18141111, + 0x2f29231e, + 0x1b161312, + 0x41362c23, + 0x1f191615, + 0x58463629, + 0x241d1918, + 0x7358412f, + 0x10101010, + 0x18141211, + 0x11101010, + 0x19181412, + 0x12111010, + 0x1c191814, + 0x14121110, + 0x211c1918, + 0x18141211, + 0x29211c19, + 0x19181412, + 0x3629211c, + 0x1c191814, + 0x47362921, + 0x211c1918, + 0x5b473629, + 0x08010400, + 0x090c0205, + 0x0a0d0306, + 0x0f0b0e07, + 0x10010800, + 0x11180209, + 0x1920030a, + 0x28040b12, + 0x0c131a21, + 0x22293005, + 0x060d141b, + 0x232a3138, + 0x070e151c, + 0x242b3239, + 0x3a0f161d, + 0x1e252c33, + 0x2d343b17, + 0x353c1f26, + 0x363d272e, + 0x3f373e2f, + 0x071e03dc, + 0xab483341, + 0x07140741, + 0x101c3332, + 0x14ab3253, + 0x071e3103, + 0x24230105, + 0xf3b80403, + 0x011d2506, + 0xf2c80103, + 0x0000fe0b, + 0xb7cef393, + 0x44340101, + 0x030f8a4f, + 0xfff45300, + 0x0b340501, + 0x3e4fc4fe, + 0x1300030f, + 0x023cf453, + 0x30273405, + 0xfa5af493, + 0x06439d01, + 0xff1efe0b, + 0xa7233f9b, + 0xffffff2e, + 0x0cdc24d1, + 0x1027432e, + 0x23d5071e, + 0x11270cdc, + 0xb792f493, + 0x4843c101, + 0x04003d14, + 0x04003d27, + 0xffff2ea7, + 0xe024d1ff, + 0xd5342e0c, + 0x270ce023, + 0x4800c111, + 0x062424d1, + 0x20d5042e, + 0x031e0624, + 0x0ea715e6, + 0x39fffb43, + 0x9e44c604, + 0x0bfe93b5, + 0xbefe4efe, + 0x93fe140e, + 0x01f9eff4, + 0x24584499, + 0xfe0e204c, + 0xfdb6679e, + 0x2d9efe0e, + 0xfe4efdd5, + 0xf9d6f493, + 0x58449901, + 0xbe204c24, + 0x1efdb64e, + 0xd518be05, + 0x9efe0efd, + 0x4efe13ec, + 0x9d4127fe, + 0xdb3e0604, + 0xfe8e0427, + 0xb703f493, + 0x27421901, + 0xff4ea731, + 0x439dfeff, + 0x9326a60b, + 0x01f99bf4, + 0x04584499, + 0x179e204c, + 0x0b9efdb6, + 0xfe0b002e, + 0xf493fc4e, + 0x1901b6d9, + 0xff3ea744, + 0x3199ffff, + 0x26329927, + 0x34d145c6, + 0x47560634, + 0x063834d1, + 0x34994696, + 0x4e45e610, + 0xff4ea721, + 0x44d1feff, + 0x44860148, + 0xdea7a33e, + 0xa7fff9cf, + 0xfd4fffce, + 0xc301d419, + 0x41dc437b, + 0xcd4ea70f, + 0x4419fff9, + 0x437bc301, + 0xbe2e41d8, + 0x190031dd, + 0x7bc301d4, + 0x1741d843, + 0x2127d319, + 0x1207c401, + 0x31eb143b, + 0x4ea7d31d, + 0xc5fdcfff, + 0x05466442, + 0xf49b4027, + 0x38c4c50e, + 0x4ea73127, + 0xc5fdcfff, + 0xfc8e6043, + 0xf4933127, + 0x9d01f8f4, + 0x3d5e6843, + 0xa7fc4eff, + 0xffffff4e, + 0xc6274d99, + 0x1e0027d4, + 0x44f0be05, + 0x2af493fd, + 0x441901b6, + 0xcea747c6, + 0x19fff5bf, + 0xce4f4bc4, + 0x20070b4d, + 0x0c071d07, + 0xfd45b7be, + 0x4f4bc419, + 0x0027423c, + 0xfc93fc8e, + 0xa701b5fc, + 0xfeffffde, + 0xf08bc001, + 0xd4990536, + 0x1e47760b, + 0x1504c8f4, + 0xfd4679be, + 0xffff4ea7, + 0x0b4499fe, + 0x45160127, + 0x031e0027, + 0x30270127, + 0xffff4ea7, + 0x0b439dfe, + 0xfb4efc8e, + 0xf86efc93, + 0x9db02701, + 0x42be69cb, + 0xd0070008, + 0x0d7e0c07, + 0x2ad4ccfe, + 0xffff4ea7, + 0x544bbdfe, + 0x7ed4f60d, + 0x1f1efdcc, + 0x1e1cd1c4, + 0xbe0d070e, + 0x07fd4626, + 0x5efb0e0c, + 0xb57efe7b, + 0x1ed027fd, + 0x05c49906, + 0x0d074136, + 0xfc4efb8e, + 0xf822f493, + 0x99302701, + 0x439d5842, + 0x202c2469, + 0xfdb47abe, + 0x70be051e, + 0xd007002c, + 0x271804cc, + 0xff4ea730, + 0x43bdfeff, + 0x03440d54, + 0x27fd777e, + 0xc4461ed0, + 0xf0934302, + 0x0701f7ec, + 0xfd967ec0, + 0xd605c499, + 0xff4ea748, + 0x4411feff, + 0xffff3ea7, + 0x2433d1ff, + 0xf5448706, + 0x000d4843, + 0xa73127ff, + 0xfdcfff4e, + 0x1e6843c5, + 0x07d42810, + 0x459cbe0d, + 0x0e0c07fd, + 0xfdf15efc, + 0xfc8e0d07, + 0xffff4ea7, + 0x094499fe, + 0x43832027, + 0x44333487, + 0x43f9432b, + 0xff00004d, + 0x131e3103, + 0x0a3824f9, + 0x4f4bff00, + 0x142e408b, + 0xfe0b0027, + 0xf3582103, + 0xfe0b0127, + 0x4ea7fc4e, + 0x01fd7fff, + 0x58c0074d, + 0x070027d8, + 0x4857be1c, + 0x00ded8fd, + 0x93260400, + 0x01b4acf4, + 0x31274219, + 0xb4a2f493, + 0xa6431d01, + 0xa7302726, + 0xfd4fff4e, + 0x43b50027, + 0xfe0693be, + 0xfffe3fbe, + 0x0000ded8, + 0x31273f80, + 0xb47ef493, + 0xa7431d01, + 0xfd4fff4e, + 0x4ea74301, + 0x87ffffff, + 0x4142b933, + 0xf540270a, + 0x02b04034, + 0x9326e6ff, + 0x01b45cf4, + 0x45064419, + 0xfd4a25be, + 0x83be051e, + 0xff1efd43, + 0xfffd6bbe, + 0x0000ded8, + 0xf4931702, + 0x1901b43d, + 0x2745e644, + 0x31f49331, + 0x431d01b4, + 0x0010d4be, + 0x1b10dcd8, + 0x4ea73127, + 0x07fdafff, + 0xbe43550c, + 0x27fd8dcb, + 0x40f19309, + 0x379efe3f, + 0x4ea7fe0d, + 0xd1ffffff, + 0xa60a4442, + 0xff3ea725, + 0x3441fdaf, + 0x3405420b, + 0xf54efc8e, + 0xffff5ea7, + 0xeaf993ff, + 0xf69301b3, + 0xa701f690, + 0xfeffffbe, + 0xcfffaea7, + 0xbf7ea7fd, + 0x53d1fff5, + 0x35a60a44, + 0xafff2ea7, + 0x0b2441fd, + 0x99240543, + 0x47161054, + 0xffeb0ea7, + 0x0e50beff, + 0x4667befe, + 0xeb0ea7fd, + 0x20beffff, + 0x9419fe0e, + 0xc02744d6, + 0x68be171e, + 0x40270002, + 0x2768649d, + 0x270496c1, + 0x2704e6c0, + 0x69649d41, + 0x0d99b4b9, + 0x532f4cd8, + 0x47be0027, + 0xb4b9fd47, + 0xd0070140, + 0x0c5845a6, + 0x83045330, + 0x7c19be01, + 0x832d07fd, + 0x2676102c, + 0x4c834d07, + 0x274cab25, + 0x27448600, + 0x6bc00701, + 0x833d07cf, + 0x3556303c, + 0x0d99b4b9, + 0x130f4cd8, + 0x0d99bdbd, + 0x24e635c6, + 0xa4c54127, + 0xc5412764, + 0xb2b960a4, + 0x2cd80d99, + 0xb4992f30, + 0x87438309, + 0x2b443334, + 0x5044f943, + 0xa6ff0000, + 0x48b4d147, + 0xc5412401, + 0x111e64a4, + 0x42544223, + 0xe6265499, + 0xfc01c84f, + 0x01c3202c, + 0x0d99b4b9, + 0x1d104cd8, + 0x46469419, + 0xfffcacbe, + 0x40270cab, + 0x41270486, + 0xcf6bc407, + 0xfd4113be, + 0x019f0ff6, + 0xc5b6b811, + 0xb2cef393, + 0x27341901, + 0x27448631, + 0x07941930, + 0x66df6bd3, + 0x6964994c, + 0x45a67c19, + 0x96056499, + 0x416cbe45, + 0x2704d6fd, + 0x27031e41, + 0x68619940, + 0xf610c2d8, + 0x04649945, + 0x43183027, + 0x23073127, + 0x2127031e, + 0x41c34107, + 0x30274d8b, + 0x31274486, + 0xdf6bd307, + 0xdfe6d28b, + 0x94190135, + 0x74194506, + 0x741d41a3, + 0xf49b4027, + 0x65f2930e, + 0x241901b2, + 0x54d14656, + 0x45960620, + 0x0d99b3b9, + 0x31833453, + 0x3027031e, + 0xd3079419, + 0x4a06df6b, + 0x11270127, + 0xe6fd437e, + 0xd8741907, + 0x3ea71941, + 0xd1fbffff, + 0x27021034, + 0x104c1c30, + 0x43073127, + 0x4f6b41c3, + 0x4027031e, + 0x30274d8b, + 0x84f90b1e, + 0xff000a38, + 0x4d8b3027, + 0x31274486, + 0x4f6b4307, + 0x941947c6, + 0x57be4506, + 0x131efd7b, + 0x270f5499, + 0x0ef39b30, + 0x44873127, + 0xb04043f5, + 0x2ea7ff02, + 0xd1fbffff, + 0xab021024, + 0xd9f393fd, + 0x341901b1, + 0xbe7e4fd6, + 0x27fe0ec6, + 0xc0041e20, + 0x24f92022, + 0xff010d94, + 0x428747c6, + 0x300044f1, + 0x44d8ff02, + 0x27420712, + 0x2b410335, + 0x27461032, + 0xf0210331, + 0xa2c1daf3, + 0x07302748, + 0xc544a342, + 0xf39b48a4, + 0x8b00070e, + 0x48a2c5ff, + 0xd168a3c5, + 0xa70a4452, + 0xfd4fff4e, + 0xa66443c5, + 0xff3ea728, + 0x3441fdaf, + 0x7fff3ea7, + 0xa7420bfd, + 0xfdafff2e, + 0x34212405, + 0x25104ce3, + 0xa3341134, + 0x3415104c, + 0xfe0e6fbe, + 0x9419fdeb, + 0x74194506, + 0x741d41e3, + 0xf49b4027, + 0x9340270e, + 0x01b13ff3, + 0x675e341d, + 0x4ef58efd, + 0x08ecbefa, + 0xff4ea700, + 0x44b9feff, + 0xd0070d99, + 0xbe2f4c1c, + 0xa700089a, + 0xffffff4e, + 0x99264399, + 0x3224274a, + 0x0d1eb127, + 0xa200b127, + 0xb4d6b027, + 0x181e0027, + 0xf3aaf493, + 0x58449901, + 0x4c043027, + 0x07312720, + 0x0741c343, + 0xbe0f6b04, + 0xa7000ba8, + 0xffffff2e, + 0xd4964127, + 0x40ab4027, + 0x063623b9, + 0x4496c127, + 0x3706c027, + 0x24bd4027, + 0x3ebe0636, + 0x0cab0007, + 0x04864027, + 0xc4074127, + 0xdea7cf6b, + 0xb9ffffff, + 0xc6063ad4, + 0x4770be44, + 0x3bd4b9fd, + 0x27460606, + 0x49f49330, + 0x439d01f3, + 0x3bd3bd06, + 0x27b4c606, + 0x27a49601, + 0xff3ea700, + 0x34b9ffff, + 0x45060637, + 0x34bd4027, + 0x34be0637, + 0x0cab0000, + 0x04864027, + 0x04074127, + 0x4ea7fa8e, + 0xc1ffffff, + 0x44b9fc43, + 0x03ca0100, + 0xc2430b13, + 0x0c830e40, + 0xf903330f, + 0x00007c00, + 0x27fe0bff, + 0x4efe0b00, + 0xedf493f5, + 0xf0e301f2, + 0x44990f6b, + 0xe6f02508, + 0x5e002744, + 0x3ea70291, + 0xb9ffffff, + 0x36063834, + 0x15002745, + 0x00b85ef0, + 0xc0274027, + 0xbd28ac27, + 0x5e063834, + 0xcd070095, + 0x47334d07, + 0xc40bc533, + 0x08f4c0f1, + 0xbc07ff00, + 0xfd4c5bbe, + 0x08f4c4f1, + 0xbe23ff00, + 0x83fff70c, + 0x34070f4c, + 0x44873533, + 0x4307342b, + 0x432b4333, + 0x0c9443f1, + 0x1b070005, + 0x2a074307, + 0x10014403, + 0x40051403, + 0xf2a84403, + 0xc564b1c1, + 0xb4c1b431, + 0xb834c568, + 0xc56cb0c1, + 0xb1c1bc30, + 0xdc31c570, + 0x8352b489, + 0x34c50f4c, + 0x54b4c1c4, + 0xc1d434c5, + 0x3bc55cbb, + 0xfd4027d8, + 0x0008e8d4, + 0x1b4ea7ff, + 0x4479fff7, + 0x0ea74566, + 0xbefff719, + 0x27fe8be5, + 0x1b0ea7c1, + 0x21befff7, + 0xd007fe8c, + 0xffff0fe4, + 0xff5cffff, + 0x4ea7fc15, + 0xd1ffffff, + 0x930a3448, + 0x01f207f5, + 0x215ef693, + 0x4df79301, + 0x08070121, + 0xfffee1be, + 0x4c834007, + 0x184ce418, + 0xc0070160, + 0xf620cc83, + 0x070157cf, + 0x0f4c8348, + 0x35333407, + 0x342b4487, + 0x93339307, + 0x9f03932b, + 0x00050be8, + 0x99119499, + 0x9dc10493, + 0xab4733ac, + 0xa4d39d34, + 0xd14094c1, + 0x2b040453, + 0xc5433343, + 0x90c1c8d4, + 0x0450d540, + 0x68adbe04, + 0x0b9499fd, + 0xc5ccd0c5, + 0x4566d0dc, + 0x4ea3d461, + 0x65010000, + 0xb99499d4, + 0xd4614546, + 0x20004da3, + 0xd489d465, + 0xc442e490, + 0x04949900, + 0x271d44d8, + 0x28649d41, + 0xf6169499, + 0x98d1c148, + 0xd4c17105, + 0xc174159c, + 0x7025a0d0, + 0x3800a25e, + 0x1e412748, + 0x9d402703, + 0x40272864, + 0x74057425, + 0x4d077415, + 0x4c033607, + 0x01282778, + 0x05440341, + 0xa8340331, + 0x0c1c27f2, + 0x891a618d, + 0x9c891a94, + 0x5345531c, + 0x24648dc5, + 0x11266c8d, + 0xc1c49b73, + 0xac079cd0, + 0xa153030b, + 0x0a0b1c07, + 0xfe3230be, + 0xd4c17321, + 0x0bb007a0, + 0x07040743, + 0xbe0a0b1c, + 0xc1fe321d, + 0x730198d4, + 0x430b2007, + 0xbd830407, + 0x2c3303ff, + 0x0b1c0716, + 0x0cbc330a, + 0xfebeb2ab, + 0x4d27fe31, + 0x1c270bbc, + 0x2df40d2c, + 0x834007f1, + 0x010fff4d, + 0x07b4abf0, + 0xbe6b8516, + 0x07fd7b5d, + 0x9a1dbe09, + 0x615499fd, + 0x0d074144, + 0xbea40c03, + 0x99fd7797, + 0x44e60b94, + 0x549d4227, + 0xbe080704, + 0x03fd4900, + 0xfe945e81, + 0xffff3ea7, + 0x3434d1ff, + 0x1e48ce0a, + 0x0a3438d5, + 0xf49b4027, + 0x0e33990e, + 0x4fbf2ea7, + 0x273138fd, + 0x53240541, + 0xd6240331, + 0x86f42132, + 0x55babe46, + 0x27f111fd, + 0x8601ab40, + 0x6b412704, + 0x11f4154f, + 0x8ef0c3f0, + 0x89fc4ef5, + 0x0d89280e, + 0xff1f8326, + 0x9b0fffff, + 0x22c307de, + 0x9efc0ed1, + 0x270024b9, + 0x07240540, + 0x8e34050d, + 0x93f54efc, + 0x01f01ff3, + 0x634839c1, + 0x0f9f83f1, + 0xc1800000, + 0x904c5437, + 0x9fa39123, + 0xfffffff0, + 0x34399103, + 0x022e4ff6, + 0x4c303459, + 0x160c2710, + 0xc103bc5e, + 0x30278831, + 0x2c27f325, + 0x27f42110, + 0x07343b31, + 0x16418b43, + 0xab430746, + 0xd5f39341, + 0x34c501ef, + 0x210a1e88, + 0x253103f3, + 0xdef2f0f3, + 0x72c1f121, + 0x40719d3c, + 0x22993907, + 0x33498706, + 0x9d342b35, + 0x43074172, + 0xefaaf293, + 0x482dc101, + 0x432b4333, + 0x993473c1, + 0xdc333871, + 0xab420b1c, + 0x35f621d3, + 0x6043a9f1, + 0xa91d0704, + 0x33045e44, + 0xff1f8363, + 0x310fffff, + 0xf5439bfc, + 0x00055c61, + 0x6064f5ff, + 0x33ff0005, + 0xc1c20bc3, + 0xcba94822, + 0xc4a90110, + 0xf1450112, + 0x083c62f5, + 0xb4da0005, + 0x27473632, + 0x1e27800c, + 0x27010000, + 0x0705be20, + 0x10ac27fe, + 0x010cc0d5, + 0x14070f1e, + 0x010cc0d1, + 0xa4471433, + 0xfe0617be, + 0x4333f431, + 0x08c24aed, + 0xf4310005, + 0x43333b07, + 0x08bc44f1, + 0x33330005, + 0xf493340b, + 0x0701ef10, + 0x2340791b, + 0x07110338, + 0xf0580353, + 0x1f1e03f1, + 0x4d073a01, + 0x2d074acb, + 0x111c4c53, + 0xf62a2b38, + 0x1320cc46, + 0x3823b123, + 0x00fa0fe6, + 0xa027da1e, + 0x00008f27, + 0xf4318000, + 0x44e94333, + 0x000508c0, + 0x01134bd2, + 0xdd4dee54, + 0xff4f8300, + 0xf50fffff, + 0x00056064, + 0x534d07ff, + 0x34071c4c, + 0x44873533, + 0xc307342b, + 0xc32bc333, + 0x3f070c07, + 0x0be80f03, + 0x1d070005, + 0x34032f07, + 0x11fe4c7e, + 0xf14606f4, + 0x050c34c4, + 0x0b308700, + 0x05402734, + 0x108cf434, + 0x4a070228, + 0x4c534dcb, + 0x1d4ff61c, + 0x41480702, + 0xf54333f1, + 0x00056041, + 0x5c44f1ff, + 0xe2ff0005, + 0x27020741, + 0x11701e05, + 0x15210124, + 0x23310534, + 0x104c3428, + 0x43f54333, + 0x00050840, + 0x53ca3823, + 0x314907e7, + 0x333987f1, + 0x07432b45, + 0x03133334, + 0x0507b01f, + 0xa9333300, + 0x2b011012, + 0x03f42134, + 0x33541521, + 0x1012ad43, + 0x4045f501, + 0x05000508, + 0xb03f035d, + 0x25000507, + 0x4434b9f4, + 0xfdf29304, + 0x410301ed, + 0x044434bd, + 0x31272459, + 0x233d4103, + 0x191e245d, + 0xf2930127, + 0x2101ede4, + 0x8823c1f1, + 0x413b4127, + 0x23c534eb, + 0x019b5e88, + 0xbe1a0c27, + 0xa700054c, + 0xfdeb2f4e, + 0x43053027, + 0x00002f27, + 0x42151442, + 0x930ef39b, + 0x01edb3fb, + 0x61e4b639, + 0x74c100df, + 0x01b3813c, + 0x5683c248, + 0xa748bcc1, + 0xffffdf0e, + 0xfe0585be, + 0xdc83dc07, + 0x24b0990f, + 0x1c07d333, + 0xdaf92027, + 0xff000080, + 0xfea10fbe, + 0x0686c007, + 0x3a877481, + 0x4a07340b, + 0x41033005, + 0x0080d4fd, + 0x0ea7ff00, + 0xbeffffdf, + 0xf6fe052b, + 0x5e0627c4, + 0xb3990121, + 0x3b460724, + 0x75b48543, + 0x3c7cc1bc, + 0xed46f293, + 0x4e238901, + 0x2d71c449, + 0x073f34ce, + 0x2728071d, + 0xc8be1a0c, + 0x38070004, + 0x1ea72c07, + 0x53f7ffff, + 0x03240132, + 0x1814d524, + 0x93f3a801, + 0x01ed17f4, + 0x42814371, + 0x380bcc49, + 0x7dc5282b, + 0x504dc53c, + 0x42854375, + 0x1e4e4c8d, + 0x5022c107, + 0x073c72c5, + 0x33398749, + 0x07432b45, + 0x2b133314, + 0xe81f0314, + 0x9300050b, + 0x01ecdff0, + 0xa3be2707, + 0x32270004, + 0xecd2f493, + 0xa7433d01, + 0xfffb430e, + 0xfe8711be, + 0x0f24d007, + 0xffffffff, + 0x5e150c27, + 0x40070081, + 0x43337c09, + 0x04d041f1, + 0x2c07ff00, + 0x071a0c27, + 0x0439beb4, + 0x34be2300, + 0xc253fffb, + 0x2ea73707, + 0x01f7ffff, + 0xd5340334, + 0xa8011824, + 0x1a0c27fc, + 0x000403be, + 0xfc937409, + 0x0501ec7c, + 0x6cc3c1b4, + 0x275073c5, + 0xc0d4fd42, + 0xa7ff0004, + 0xfffb430e, + 0x44c60439, + 0xfe8618be, + 0x00274027, + 0x1e1ec43d, + 0x4333f431, + 0x07b04f03, + 0x43a90005, + 0x44d10110, + 0x3333010c, + 0x2307340b, + 0xfb5e2823, + 0x8ef143fd, + 0x27f84ef5, + 0xff8ea7d0, + 0xfa93fd4f, + 0x1e01ec28, + 0xa7d12703, + 0xfffaf30e, + 0xfe861bbe, + 0x0fe0b007, + 0xffffffff, + 0x100700da, + 0x1df91433, + 0xff00051c, + 0x052013f1, + 0x4d07ff00, + 0x4f034333, + 0x000507b0, + 0x039040c1, + 0x0000003f, + 0xc1031580, + 0xe1078c49, + 0x4c834907, + 0x3334070f, + 0x2b448735, + 0x33c30734, + 0x03c32bc3, + 0x050be8cf, + 0xacc2c100, + 0xfae4ee23, + 0xa824c1ff, + 0x052413f1, + 0x44c6ff00, + 0x404c431b, + 0xf9a823c5, + 0x00051e14, + 0xc024c5ff, + 0x4d5c0401, + 0x4f3cfff0, + 0x0fff0000, + 0x24c58411, + 0xa6e479e0, + 0xb9c49946, + 0x41274616, + 0x93b9c49d, + 0xfe3a05f0, + 0xfd5250be, + 0x2788a3c1, + 0xeb4d3b41, + 0x88a3c534, + 0x230ccd99, + 0x0ccd9dd1, + 0x4123a459, + 0x4027a45d, + 0x0510b4fd, + 0x4ea7ff00, + 0x79fffaf3, + 0xa7456644, + 0xfffaf10e, + 0xfe8508be, + 0xff27dff6, + 0xee48a4c1, + 0x07ff2049, + 0xbe0a071c, + 0x5efd5373, + 0x0d07ff15, + 0xfd4ef88e, + 0xffff4ea7, + 0x274d99ff, + 0xce264199, + 0x44b92f1d, + 0x45a60d44, + 0x44cdf093, + 0xbe2d07fe, + 0xc4fdfe54, + 0xc5be0bd2, + 0x06c6fd3a, + 0x0b1e0227, + 0x5abed616, + 0x0546fd3a, + 0xfd0e0027, + 0xfd79c69e, + 0xfd4efd8e, + 0x26c2f493, + 0x09432902, + 0x3534ce44, + 0xfb8af493, + 0x03240701, + 0x3407c32c, + 0xe37f2ce3, + 0x34197f3c, + 0xc2803c03, + 0xd027f932, + 0xfb6ef093, + 0xfa9bbe01, + 0x930626fd, + 0x01fb63f0, + 0xfd7bb7be, + 0xe91ed127, + 0xf493d027, + 0x9901fc20, + 0x44994043, + 0x1134ce41, + 0xfd766bbe, + 0x40270dab, + 0x41270486, + 0xdf6bd407, + 0xfd8e0d07, + 0x071e03dc, + 0xab483341, + 0x07140741, + 0x101c3332, + 0x14ab3253, + 0x071e3103, + 0x24230105, + 0xf3b80403, + 0x011d2506, + 0xf2c80103, + 0x4107fe0b, + 0x43d840ab, + 0x01151e0f, + 0x05242313, + 0x03140303, + 0x07071e04, + 0x03425342, + 0x86f45841, + 0x03141925, + 0x03041d11, + 0x0bf2a801, + 0x030105fe, + 0x0bf2c804, + 0x862253fe, + 0x03140125, + 0x03040514, + 0x0bf2a804, + 0xf50533fe, + 0x02180001, + 0x0403f5ff, + 0x27ff0218, + 0x000e2340, + 0x0435fde8, + 0xe8000e03, + 0x1002f5fd, + 0xf5ff0218, + 0x02181403, + 0xf00e23ff, + 0x0435fde7, + 0xfc4efe0b, + 0x4327d007, + 0xe3070333, + 0x04f53d07, + 0xff021200, + 0x0d47c107, + 0x33331207, + 0x100034f1, + 0x48dcff02, + 0xf12087f8, + 0x02100024, + 0x004ddcff, + 0x3427f608, + 0x23f50103, + 0xff021200, + 0x43f54087, + 0xff021200, + 0x3c87e623, + 0x34f54027, + 0xff021600, + 0x070fec83, + 0x0e1c333d, + 0x1f833333, + 0x3ff00000, + 0xab10ec33, + 0x0034f5e1, + 0xf5ff0214, + 0x0214043e, + 0x0ef49bff, + 0xf64efc8e, + 0x9107b207, + 0x6c27a007, + 0xc5f89340, + 0x7ea701a6, + 0x1efdefff, + 0x10cb0747, + 0xc60741bc, + 0xd4078401, + 0x41c3d633, + 0xde238405, + 0xc1fefdb4, + 0x4c33d474, + 0x1d4c5318, + 0x07f542cc, + 0xe323032c, + 0x070d0723, + 0xff077e19, + 0xf49b4027, + 0x1a0c270e, + 0x1d072a07, + 0x067e3c07, + 0x2bac0bff, + 0xd69c0bbc, + 0xf68eb8bf, + 0xefff2ea7, + 0xe8031efd, + 0xd424c1f3, + 0x4ddc3327, + 0x0bf5fc6a, + 0x07fb4efe, + 0x3ec007b1, + 0x070c07e4, + 0xf31ea72b, + 0xfb0efefd, + 0x4efec05e, + 0x07c007fb, + 0x07ce3eb1, + 0x273b071c, + 0x2ea71a0c, + 0x0efefdf3, + 0xfeb75efb, + 0x00114f27, + 0xf4fb1000, + 0x3fffff40, + 0x01f50533, + 0xff021800, + 0x180402f5, + 0x3027ff02, + 0xe8000e23, + 0x270335fd, + 0x0e03234c, + 0xf5fde800, + 0x02181004, + 0x1402f5ff, + 0x23ff0218, + 0xfde7f00e, + 0xfe0b0335, + 0x330f0c83, + 0x7e0e2303, + 0x0439ffff, + 0x3e9e44c6, + 0xfe0bfe82, + 0x04030333, + 0xf3e8031e, + 0x100004f1, + 0x3327ff02, + 0xfc6a4ddc, + 0x33fe0bf2, + 0xf5432705, + 0x02180004, + 0x0402f5ff, + 0x27ff0218, + 0x000e2340, + 0x0435fde8, + 0xe8000e03, + 0x1001f5fd, + 0xf5ff0218, + 0x02181402, + 0xf00e23ff, + 0x0435fde7, + 0xfc4efe0b, + 0x0207c007, + 0x0c03d207, + 0x0573be44, + 0x9940a700, + 0xd49d41d3, + 0x42d49d43, + 0x991a32c4, + 0x4cc03ad4, + 0x444713ff, + 0x43b94c0b, + 0xd39d014c, + 0x4d44b942, + 0x43d49d01, + 0x0000fc8e, + 0x00000001, + 0x00000000, + 0x00000001, + 0xff02b040, + 0x0f6bf54e, + 0x0fe6f063, + 0xdea70184, + 0xb9ffffff, + 0x460635d4, + 0x8507be46, + 0x270586fd, + 0xbd612740, + 0x1e0635d4, + 0x27602703, + 0xffcea7d0, + 0x7027ffff, + 0x052ef993, + 0xff8ea702, + 0x5ea7fd7f, + 0xb9fdcfff, + 0xf40a5bc4, + 0x0122104c, + 0x0ce5c4b9, + 0x94994606, + 0x9df1139a, + 0x4c501a01, + 0x010e5e10, + 0x0196f213, + 0x930f072a, + 0x01f947f1, + 0xfd72e6be, + 0x00fa0fe6, + 0x4d24f409, + 0xf4290bba, + 0xfb284ce0, + 0x93062700, + 0xfe49e8f1, + 0x4307311e, + 0x3707400b, + 0x00014f30, + 0xf4537000, + 0x4319ff64, + 0x41c34307, + 0x2f6b2407, + 0xf90af193, + 0x61147101, + 0x0a430b13, + 0x2725b604, + 0xfff19306, + 0xb39efe49, + 0xc0b9fdfd, + 0xfbab0a5a, + 0xdc83d007, + 0x073d070f, + 0x3345334d, + 0x23340b33, + 0xfff5a43e, + 0x4a272107, + 0x24032101, + 0x34033105, + 0xc2b9f4a8, + 0xf3930a5b, + 0x8101f8c4, + 0x0731613e, + 0x0333714d, + 0x33210301, + 0x5ac0bd43, + 0x5bc2bd0a, + 0x244f030a, + 0x0b000525, + 0x0543151e, + 0x9a949941, + 0x41033027, + 0x9b9a949d, + 0xa6260ef3, + 0x0ce5c4b9, + 0x84114244, + 0x00004ea3, + 0xeb841502, + 0xff2ea7fb, + 0x4027fd4f, + 0xf49b2301, + 0x9921270e, + 0x233b0ec4, + 0xf45324cb, + 0x4301feb8, + 0x41272138, + 0x21533405, + 0x340324c6, + 0x4127f31e, + 0x276054c5, + 0x8df493d1, + 0x479d01e6, + 0xfed95e06, + 0x46ab4d07, + 0x44860027, + 0x0f6b0127, + 0xf493171e, + 0x8101f834, + 0xf4405143, + 0x0000003f, + 0x27ff0120, + 0xff165e20, + 0xf58ef043, + 0x4ea7fb4e, + 0xb9ffffff, + 0xb90ce64c, + 0x070ce743, + 0x1eb407d2, + 0xe844f122, + 0x07ff000c, + 0x2b14053e, + 0xc83f6b40, + 0x22f90d40, + 0xff000d28, + 0xd21d0127, + 0xb3bdfb8e, + 0x23070ce7, + 0x070f2c83, + 0x034287e3, + 0xd2c3cee1, + 0xfb8e0027, + 0xffff3ea7, + 0xe734b9ff, + 0xbd41030c, + 0x0b0ce734, + 0xa7f94efe, + 0xfbffff3e, + 0x02183ad1, + 0x9a073431, + 0x3c1f9c53, + 0x0000004f, + 0x1ee02701, + 0x103ed105, + 0x9395b602, + 0x020353f4, + 0xc58043c1, + 0x4e078443, + 0x43e44383, + 0xbea7009a, + 0xb9ffffff, + 0xb90ce6b1, + 0x070ce7b4, + 0x07411b0e, + 0x272f6b24, + 0xfd93104c, + 0x33020328, + 0x422b1d0c, + 0xc11f0c53, + 0xc02780d3, + 0xc1274210, + 0x2b102cd4, + 0x4f834a07, + 0x0fffffff, + 0x2c832107, + 0x33342b0f, + 0x03428733, + 0xe843f511, + 0xfdff000c, + 0x000d2820, + 0xe6b1bdff, + 0x9b40270c, + 0xc5160ef4, + 0xb4bd4127, + 0xd4c10ce4, + 0x90d3c188, + 0x305b4103, + 0x8b88d4c5, + 0xe335e63c, + 0xa7e8a3e3, + 0xfbffff4e, + 0x02104ed5, + 0xb4bd4127, + 0x3616063b, + 0xfd94d8be, + 0xe394d4c1, + 0x94d4c543, + 0x9ff6f98e, + 0xf39300f1, + 0xa70202a4, + 0xffffff4e, + 0x0a5a4db9, + 0x99803bc1, + 0xa0279a34, + 0x2300815e, + 0x07e21141, + 0x031f6b14, + 0xc6e00141, + 0xc49d6d2f, + 0x10d2079a, + 0x0000012f, + 0x00df2701, + 0x07010000, + 0x833d0710, + 0xa7370317, + 0xfde75f4e, + 0x07e3310b, + 0x37e34005, + 0x00274315, + 0x2ea74035, + 0x27fde74f, + 0x24050e4c, + 0x4d072315, + 0xffff4f83, + 0x4fa30fff, + 0x80000000, + 0x351c1c33, + 0xa741ab20, + 0xfbffff3e, + 0x021834d5, + 0x0180c4c1, + 0xc54d0be3, + 0xe41180c4, + 0x4d2b3d0b, + 0xe305e415, + 0x41071d1e, + 0xed07a127, + 0xec83e42b, + 0x03e3330f, + 0x052524ef, + 0xf6c30700, + 0x9dff6e4f, + 0xf4939a34, + 0xc10201f4, + 0xb4ce8044, + 0xff3ea70f, + 0x3411fd7f, + 0x00004ee3, + 0x26341502, + 0xff3ea7a8, + 0x4127ffff, + 0x063534bd, + 0x270f3399, + 0x0ef49b40, + 0x33874127, + 0xb04034f5, + 0xf98eff02, + 0xf49b4027, + 0x99f98e0e, + 0x47d81414, + 0x8a049d1b, + 0x13311441, + 0x0b3c02c1, + 0x33430734, + 0x9003c543, + 0x2108242b, + 0x0b3c04c5, + 0x2b4007fe, + 0x23f49b41, + 0x20071686, + 0x4f9b2803, + 0x4e382723, + 0x9b242e04, + 0xf31e25f3, + 0x007f4f27, + 0xf49b4000, + 0xa7fe0b21, + 0xfdefff4e, + 0x33dc42c1, + 0x2c53182c, + 0x991b1e1d, + 0x31c48904, + 0x83412312, + 0x33348743, + 0x0b432b44, + 0x61449940, + 0x019d45e6, + 0x88039988, + 0x11231307, + 0x0bdd23ca, + 0x07fd4efe, + 0x99c53ed0, + 0x45f688d4, + 0x9b223f9b, + 0x432e234f, + 0xd49d4027, + 0x9bfd8e8a, + 0xf09b2af0, + 0x9b100b2b, + 0xf09b22f1, + 0x204f9b23, + 0x9b104ca3, + 0xf09b20f4, + 0x9bfe0b23, + 0x4ce3204f, + 0x20f49b10, + 0xa72b4f9b, + 0xfdefff3e, + 0x34d54327, + 0x34c102d8, + 0xfb48dcd8, + 0xefff3ea7, + 0xd834c1fd, + 0x08004ddc, + 0xd54427f9, + 0xd502d834, + 0x2702dc34, + 0x3c32d520, + 0x273ea706, + 0x3205fdeb, + 0x00004f27, + 0x34150d04, + 0x990ef29b, + 0x45468804, + 0x029d4027, + 0x89049d88, + 0x0c5cfe0b, + 0x89f49310, + 0x41c101a0, + 0x07183cac, + 0x0f1c8310, + 0x4c834107, + 0x2743330f, + 0x0201002f, + 0x6b247b80, + 0x9641272f, + 0x93402724, + 0x01a063f3, + 0x31c54533, + 0x4c349dac, + 0x9bc032c5, + 0x34c1200f, + 0x830ce3c0, + 0xfe0b04ab, + 0xa046f493, + 0x8b409901, + 0x01830253, + 0x4f9bfe0b, + 0x13478323, + 0x9b480048, + 0xfe0b25f4, + 0x93230f9b, + 0x01a027f4, + 0x075043c1, + 0x2b433343, + 0x0b037304, + 0x1efe0b03, + 0x234f9be8, + 0xf4930405, + 0xc101a00c, + 0x03153c43, + 0x9db04399, + 0x43990803, + 0x09039daa, + 0x9dac4399, + 0x44990a03, + 0x0b049d8b, + 0xfe4efe0b, + 0x9fe6f293, + 0x4023c101, + 0xce234f9b, + 0x24990f34, + 0x104c388b, + 0x9d204ca3, + 0x933e8b24, + 0x9fcaf093, + 0x8c049901, + 0xab8a0399, + 0x8a049d43, + 0x049d4027, + 0x223f9b8c, + 0xce234f9b, + 0x55be0b43, + 0x04c6fd97, + 0xfe8e0227, + 0x9fa2f093, + 0x8b049901, + 0x24f04c83, + 0x0027104c, + 0x04c1fe8e, + 0x8ef48b9c, + 0x274f9bfe, + 0x30240f9b, + 0x00a7204c, + 0x4103fe0b, + 0x2325f49b, + 0x1f4c1341, + 0x0123045b, + 0xfb4efe0b, + 0xffff4ea7, + 0x380cc1ff, + 0x0a5a4bb9, + 0x0027d007, + 0x07009d5e, + 0x31d09943, + 0x070f4c83, + 0x330183e4, + 0x0be33345, + 0x072007e4, + 0xa4ee2330, + 0x2333fff5, + 0x322b3533, + 0x3d0be171, + 0xe481e261, + 0xe1413135, + 0x2107420b, + 0x2c833425, + 0x96312780, + 0x07302724, + 0x38263323, + 0x1e27a311, + 0x101c3815, + 0x0e1e23a3, + 0x04001d38, + 0x061e21a3, + 0x2ca3100c, + 0x33400780, + 0x2b033345, + 0x9d4d0b40, + 0xd1c11442, + 0x45403154, + 0x9dc31941, + 0xd3c11543, + 0x31e12154, + 0x05300be2, + 0xc5421541, + 0xc41954d3, + 0x41030127, + 0xd499c41d, + 0x30d39931, + 0x31034103, + 0x9d31d49d, + 0xd49930d3, + 0x0c42d430, + 0x4307c319, + 0x4cfc4b2b, + 0x8eff5680, + 0x99fa4efb, + 0x03993104, + 0x340bc130, + 0xe407432b, + 0xef6bd107, + 0x411ea027, + 0x32413131, + 0x2333210b, + 0x4d2b4207, + 0x34994128, + 0x204cd814, + 0x14349946, + 0x17104cdc, + 0xb60e44d8, + 0x99d24e15, + 0x4e1b3204, + 0x2f804cd8, + 0x4103b419, + 0x0499b41d, + 0x23ec0730, + 0x9def6b41, + 0xa1273004, + 0x41834e07, + 0x35333407, + 0x342b4333, + 0x07310499, + 0x03300bce, + 0xa9e4cec1, + 0x3441051e, + 0x04c1041e, + 0x5004c554, + 0x3ea7a7e6, + 0x27ffffff, + 0x3534bd41, + 0x0f339906, + 0xf49b4027, + 0x8741270e, + 0x4034f533, + 0x99ff02b0, + 0x02993104, + 0x32039930, + 0x4f6b422b, + 0x3c18342b, + 0x32049d80, + 0xf84efa8e, + 0x21890499, + 0x0743831e, + 0x87943394, + 0x31942b44, + 0x0bb9071d, + 0xc5b00be3, + 0xd32b58be, + 0xa107c007, + 0x2f6b4307, + 0x0001df10, + 0xdf270100, + 0x01000000, + 0xc560b29d, + 0xa3315cbd, + 0x80274d0b, + 0x8127430e, + 0xe49f2ea7, + 0x11a301fd, + 0x9d2e05a4, + 0xc3c561b8, + 0xd4c4c5d0, + 0xe0272d15, + 0x3ea72e35, + 0x27fde48f, + 0x34050f4c, + 0xb4993d15, + 0xa63e3561, + 0xfbed7e44, + 0x9989c499, + 0x290788c3, + 0x07582c03, + 0x0341030c, + 0x9d020b31, + 0xc39d89c4, + 0x4ef88e88, + 0x300499fc, + 0x44d6d007, + 0x771ec027, + 0x6b1ec027, + 0xd4994aa6, + 0x83412389, + 0x33340743, + 0x2b448734, + 0x993d0b34, + 0x47f66134, + 0xc1603099, + 0x4007583e, + 0x43331007, + 0x142b1533, + 0x14211d0b, + 0x2b5c33c1, + 0x1ee30be4, + 0x8ad49927, + 0x993841dc, + 0xd29932d4, + 0x83040731, + 0x07300701, + 0x33333310, + 0x07132b15, + 0xce310334, + 0xd39d1d24, + 0x071d0b32, + 0x073e0720, + 0xff007e0d, + 0x43330411, + 0xd499c40b, + 0xc8e02788, + 0x0c078f42, + 0xf54efc8e, + 0x0107d007, + 0x72078107, + 0x5f9b022b, + 0x1850ce23, + 0x072c3f9b, + 0x604c0342, + 0x070d34da, + 0x7e120701, + 0xd027fb49, + 0xc101145e, + 0xa00750d3, + 0x3333a7e3, + 0x432b4a07, + 0x071240cc, + 0x07a7e3a8, + 0x2c432b4a, + 0x5ed12740, + 0x702700f5, + 0xb07e0d07, + 0x31de99fb, + 0x2730d499, + 0x9d4e1b30, + 0x94078ad3, + 0x29079f6b, + 0x42072183, + 0x4333c207, + 0x6907c533, + 0x6103c42b, + 0x9ececd0b, + 0x41c13150, + 0x331333c4, + 0x07b10743, + 0x14c3990a, + 0x042bb40b, + 0x4b2b4507, + 0x072d37d8, + 0x083b2b38, + 0xc818d640, + 0x0d072230, + 0xa87e1c07, + 0x034907fa, + 0x32d49d41, + 0x0714c499, + 0x274483ab, + 0x274486d1, + 0x27d203d0, + 0x08711e10, + 0x0901da00, + 0x991e9607, + 0xc0270027, + 0x0754d3c1, + 0x2b33334a, + 0x2c40c843, + 0x070938ce, + 0x271027a3, + 0xc14d1ed4, + 0x4ea738d2, + 0xb9ffffff, + 0x190a5a43, + 0x07344e24, + 0xbe18070d, + 0x07fd9472, + 0x27a72ba8, + 0x412b1e10, + 0x733007c4, + 0x07430b33, + 0x90d4c51c, + 0x0732d99d, + 0xfdd87e0d, + 0x1132d499, + 0x9d41030c, + 0x0d0732d4, + 0x33fe567e, + 0x0b1007c3, + 0x07d0271c, + 0xfab17e0a, + 0x0807d536, + 0x327e1707, + 0x8e0d07fa, + 0x203f9bf5, + 0x9ba2f293, + 0xac24c101, + 0x24c14858, + 0x830ce3c0, + 0x430704ab, + 0xa3104c83, + 0x40ab0c4c, + 0x38c634cb, + 0xd820f49b, + 0x9b1e833c, + 0x4cd8231f, + 0x24c10d83, + 0x4c229940, + 0x2432411b, + 0x20274008, + 0x9b66f093, + 0xfe7c5e01, + 0xfb4efe0b, + 0xfd93b007, + 0xc1019b58, + 0xd29940d4, + 0x324b1b4c, + 0x27400824, + 0x070d0720, + 0xfe5c7e1b, + 0x0344c007, + 0xc5234f9b, + 0xe01e40d4, + 0xbe230f9b, + 0xc1fd929b, + 0x0d0744d1, + 0x99fc7c7e, + 0x41c4aad4, + 0x234f9b1b, + 0x2b40d3c1, + 0x014f5043, + 0x9b700000, + 0x4f03234f, + 0xf0000000, + 0x4440d4c5, + 0x7e0d07c4, + 0x0fd6fb92, + 0x8e0c07a7, + 0x07fd4efb, + 0xf1f093d0, + 0x7f7e019a, + 0xe9f493fb, + 0x43c1019a, + 0x4c429940, + 0x432b4d07, + 0x40082432, + 0x1d072027, + 0x9ad2f093, + 0x5efd0e01, + 0xfe4efde6, + 0x078a0499, + 0x4041dce0, + 0x99310399, + 0x34ce3204, + 0x224f9b37, + 0x2b233f9b, + 0x604ccc43, + 0x231f9b20, + 0x9aa6f493, + 0x4043c101, + 0x074c4299, + 0x32432b41, + 0x27400824, + 0x0e0e0720, + 0xfda85efe, + 0x9bfd1e7e, + 0x400b224f, + 0x8e22f49b, + 0x07f94efe, + 0x239f9ba0, + 0x9b22bf9b, + 0xfd9323cf, + 0xc1019a70, + 0x0d0744d1, + 0x7e48dac5, + 0x0d07fbb9, + 0x99faf17e, + 0x41588ad4, + 0x0c2b0b07, + 0xd4c1f98e, + 0x4cd29940, + 0x2452491b, + 0xd0274028, + 0xd207031e, + 0x9a3ef093, + 0xf8e57e01, + 0x9a36f093, + 0xff687e01, + 0x9b224f9b, + 0x432b233f, + 0x9331a4d2, + 0x019a23f0, + 0xdc8a0499, + 0x04992641, + 0x99484630, + 0x41233104, + 0x34074183, + 0x43333533, + 0x34f9342b, + 0x0004c520, + 0x07104c5c, + 0xbe2d0719, + 0x9bfd9491, + 0x4f9b220f, + 0x8e042b23, + 0x93f54ef9, + 0x0199e7f4, + 0xa34c4399, + 0x4d439df0, + 0x30276f07, + 0x074c439d, + 0xa7b407c0, + 0xffffff5e, + 0xf7936403, + 0x2701f9e0, + 0xc499108c, + 0x5a4fe6a8, + 0xe554b901, + 0x524fe60c, + 0x9bf9ab01, + 0x1607230f, + 0xf1be2f07, + 0x0c26fff5, + 0x24c4c4c1, + 0xf419804c, + 0xc4c145c6, + 0x804cc4c8, + 0xc4f41914, + 0xf0110f41, + 0x2b7e0223, + 0xc5d007fe, + 0x0d1eccc8, + 0x1f7ef011, + 0x074227fe, + 0xccc4c5d0, + 0x008fdff6, + 0xfff5ffbe, + 0xfd8db6be, + 0xbe00845e, + 0xc1fd8daf, + 0x43338474, + 0x3f9bf415, + 0xc8432b23, + 0xfa116940, + 0x9940b4c1, + 0x4a1b4cb2, + 0x40082432, + 0x0b072027, + 0x577e1a07, + 0xc4d007fc, + 0x4f9b0b03, + 0xc5d22723, + 0x4a1e40b4, + 0xbe230f9b, + 0xc1fd9093, + 0x0b0744b1, + 0x99fa747e, + 0x41c4aab4, + 0x234f9b1b, + 0x2b40b3c1, + 0x014f5043, + 0x9b700000, + 0x4f03234f, + 0xf0000000, + 0xc440b4c5, + 0x0b070ad4, + 0xa6f9897e, + 0xe6a21e05, + 0x0ad4c4d4, + 0xd427031e, + 0xc49d4027, + 0x1ef9eb8b, + 0x8ac49918, + 0x009046fc, + 0xd4274027, + 0x5e8bc49d, + 0x6abe008a, + 0xd007fd8e, + 0xff04d3e0, + 0x9910d2c4, + 0x0c078ac4, + 0xc49d4783, + 0xf7977e8b, + 0xdfd66d1e, + 0x234f9b6a, + 0xc58ac399, + 0x315840c4, + 0x3390c4c1, + 0x93191e43, + 0x01989bf4, + 0x9b4044c1, + 0x2f9b223f, + 0x03322b23, + 0xffff004f, + 0xc5432b7f, + 0xc0c13cc4, + 0x104c27c0, + 0x7e8bc49d, + 0xc4c1fcd1, + 0x004fa3bc, + 0x9b400000, + 0x402721f4, + 0x1eb4c4c5, + 0x7e00271e, + 0x0f9bfcb9, + 0x8fc5be23, + 0x000d27fd, + 0xfdd37e20, + 0x5e800fd6, + 0xd227ff6d, + 0xf493861e, + 0x99019844, + 0x0d074d43, + 0x439df083, + 0x07f58e4c, + 0x243f9b20, + 0xf49b4127, + 0x0c012725, + 0x13002730, + 0x241551f4, + 0xfd4efe0b, + 0x981afe93, + 0xc1d00701, + 0x1f9b3ce2, + 0x223f9b23, + 0x422b4307, + 0x32074008, + 0x432b4107, + 0xc11141c8, + 0x411b3ce4, + 0xbe2048c4, + 0xc6fd9091, + 0x9b181e05, + 0xe3c1214f, + 0xf6438bbc, + 0x8f3ebe45, + 0x0bf413fd, + 0xd4150027, + 0x0427fd8e, + 0xfd4efd8e, + 0xe3bed007, + 0x0536fff7, + 0x1522f413, + 0x20fd8ed4, + 0x8e042702, + 0xbe0d07fd, + 0xbefdb31f, + 0x66fff76c, + 0x1df49305, + 0xd415fd98, + 0xfd8e0027, + 0xf0e3f64e, + 0x0f9bd007, + 0x8f05be23, + 0x224f9bfd, + 0x2b233f9b, + 0x004dcc43, + 0x0d271040, + 0x06be4000, + 0x0d0cfffd, + 0x4f9b4000, + 0x243f9b23, + 0xf49b4127, + 0xe730e825, + 0x244f9b00, + 0xf39b3627, + 0x1a4c5325, + 0x9b78d49d, + 0xf39b244f, + 0x1a4c5325, + 0x9d7ad399, + 0x34ea79d4, + 0x4f9b00c6, + 0x9b332724, + 0x4c5325f3, + 0x9d41231d, + 0xf0937bd4, + 0xc101973c, + 0x1f9b3c02, + 0x223f9b23, + 0x422b4307, + 0x32074008, + 0x432b4107, + 0xc11341c8, + 0x411b3c04, + 0x009448e4, + 0xfd8fb4be, + 0x8b5e0606, + 0x214f9b00, + 0x8bbc03c1, + 0x7f4fd643, + 0xc078d199, + 0xd44b221c, + 0x5417231c, + 0x1cd4161c, + 0x1ad42310, + 0xc01e1e66, + 0xc427201c, + 0x1e5c211c, + 0x261c3429, + 0x42241cd4, + 0x1cc0381e, + 0x1cd04426, + 0x471e2829, + 0x4dbe0d07, + 0xb0070001, + 0x1e4200cc, + 0xbe0d0731, + 0x1efd9745, + 0xbe0d072e, + 0x1efd9f0c, + 0xbe0d0726, + 0x1efdac6b, + 0xbe0d071e, + 0x1efdb0a1, + 0xbe0d0716, + 0x1efdb08c, + 0xbe0d070e, + 0x1efdb058, + 0x7e0d0706, + 0xb007fe72, + 0xb127071e, + 0xb427031e, + 0x9682f093, + 0x3c02c101, + 0x9b231f9b, + 0x4307223f, + 0x4008422b, + 0x41073207, + 0x41c8432b, + 0x3c04c111, + 0x48c4411b, + 0x8efbbe13, + 0x1e0606fd, + 0x214f9b0b, + 0x8bbc03c1, + 0x27448643, + 0x224f9bb1, + 0x2b233f9b, + 0x1540cc43, + 0x963ef493, + 0x3c44c101, + 0x2b233f9b, + 0x27412843, + 0x091e0cbc, + 0x00a4bfe6, + 0x00a0b3e0, + 0x9622f493, + 0x4443c101, + 0x0b4e4099, + 0xfab8be03, + 0x27b224ff, + 0x00885eb0, + 0xf453b448, + 0xd415fe64, + 0xf6937d1e, + 0xd101d8a4, + 0xb6108064, + 0x800c2745, + 0xfd5a66be, + 0x108060d5, + 0x108068d1, + 0x89486ac1, + 0xd78910d9, + 0x8af8be0e, + 0xbec107fd, + 0x25fd8af2, + 0x074907f0, + 0x15f293bc, + 0x3a07fe3f, + 0x1c270807, + 0x15f70580, + 0xe549befb, + 0x10d289fd, + 0x27846489, + 0x89424ec0, + 0xd4898263, + 0x0f34ce0e, + 0x628d4127, + 0x80649d84, + 0x8d0ed489, + 0xf4938264, + 0xd101d83c, + 0x27108040, + 0x3effbeb0, + 0x7e0d07fd, + 0x0b07fd6a, + 0xf68ef0c3, + 0xf0e3f54e, + 0xb107d007, + 0x2724cf9b, + 0x25f49b41, + 0x4c234107, + 0x27483010, + 0x9b0c1ea0, + 0x412724af, + 0x9b1fac53, + 0x1f9b25f4, + 0x411cf428, + 0xd4b90c3f, + 0x144e1a04, + 0x8ebe0d07, + 0x0ff6fda5, + 0x7d070c47, + 0x1a047d03, + 0xc87cd399, + 0x3fe63bc0, + 0x34e00c23, + 0xd4d10c1f, + 0x41d81a08, + 0x243f9b0d, + 0xf49b4127, + 0x0c30e825, + 0x81d2b90c, + 0x240f9b1a, + 0xa925f29b, + 0xd11a8ed3, + 0xe21a84d4, + 0x270bf234, + 0x422b204c, + 0x7b1e045b, + 0x43073323, + 0x33034f6b, + 0x070b42d4, + 0x0ef0c30d, + 0xb0a69ef5, + 0x5b32d4fd, + 0x2778d399, + 0x23130720, + 0x1814101c, + 0x43072427, + 0x44544623, + 0x381028a3, + 0x14102ca3, + 0x402ca313, + 0xa3153c24, + 0x0a1e802c, + 0x4c234307, + 0xa3421413, + 0x83430721, + 0xa344a641, + 0x3c14202c, + 0x14449610, + 0x8922a317, + 0xd4d13cd3, + 0x340e1a90, + 0xa3412c18, + 0x2701002d, + 0x9dd22541, + 0x40277cd4, + 0x0188d4ad, + 0xf0150027, + 0x1a08d4d1, + 0x1a0cd3b9, + 0x4b53c407, + 0x4153e407, + 0x18531407, + 0x04075d07, + 0xe183c183, + 0x5d031183, + 0x01831a94, + 0x4f9b3506, + 0x25f39b24, + 0x1befdd03, + 0x35072d07, + 0x237f2ce3, + 0xe31befdd, + 0x34197f3c, + 0xc2803c03, + 0x4507f932, + 0x3c272027, + 0x03420557, + 0x99f3c844, + 0x3a477bd2, + 0x1aa2d2bd, + 0x1aa0d4d1, + 0x1a11d9b9, + 0x43ab42e3, + 0xd3bd3127, + 0xd4d51a95, + 0xd3b91aa0, + 0xd4b91a81, + 0xdbbd1a10, + 0xd3bd1a98, + 0xd4bd1a99, + 0xd9bd1aa8, + 0x9f9b1aa9, + 0x6b290728, + 0xbdf2252f, + 0xf41a94d2, + 0x110ad293, + 0x1842d874, + 0x27244f9b, + 0x25f39b31, + 0x1aa0d3d1, + 0xe31f4c53, + 0xd534ab31, + 0x071aa0d3, + 0x548d038d, + 0xd8846107, + 0x3f9b1042, + 0x9b422724, + 0x3c5325f4, + 0xa3d3bd1e, + 0x33c9331a, + 0x33ceabea, + 0x33c0ab0b, + 0x4b070c1c, + 0x4c23c1ab, + 0x00cda313, + 0x93423420, + 0xfe3e6bf6, + 0xb901a75e, + 0x9b077ad4, + 0xf49b243f, + 0x204c1325, + 0xd3d5345b, + 0x3f9b1ab0, + 0x9b412724, + 0xd4d125f4, + 0x3c531aa0, + 0xe333871f, + 0xd543ab44, + 0x311aa0d4, + 0xb6d3b954, + 0x1944dc07, + 0xbd03bd07, + 0x0d071b80, + 0x2b071807, + 0xfdba72be, + 0x0a490ff6, + 0x3a1e6b07, + 0xb91f32d0, + 0x9b1a82d4, + 0xf49b243f, + 0x204c1325, + 0x3f6b345b, + 0x07b6d4b9, + 0x1aa4d3bd, + 0x0c5e344a, + 0xbd40270a, + 0xb91aa4d4, + 0x071aa4d4, + 0x33633364, + 0x03640b46, + 0x0b07fc6d, + 0xd540276d, + 0x611ab8d4, + 0x004df884, + 0xb900fa40, + 0x2607b7d4, + 0x284f9b45, + 0x1aa5d4bd, + 0xb9284f9b, + 0x6b1aa5d3, + 0x7cd2b94f, + 0xbd340b03, + 0xfa1aa6d4, + 0x2709c223, + 0x07ad0740, + 0xbde027bd, + 0x5e1abcd4, + 0x3ec200b9, + 0xb7d4b94a, + 0x27423407, + 0xb9121e20, + 0x9b1a83d4, + 0x3c27242f, + 0x5b342b20, + 0x25f49b23, + 0x07f8d3d1, + 0x1ab8d0d1, + 0x3183325b, + 0xd1b92247, + 0x43071abc, + 0x4e3b2d0b, + 0x07b822a9, + 0x130b04ab, + 0x1abea2ad, + 0x1ab8d0d5, + 0x1abcd1bd, + 0xd4b9371e, + 0x3f9b077a, + 0x25f49b24, + 0x5b204c13, + 0xbea3ad34, + 0x241f9b1a, + 0x1c534127, + 0x25f49b1f, + 0x1ab8d3d1, + 0x1abcd2b9, + 0x4e3b4107, + 0x210b34ab, + 0x1ab8d3d5, + 0x1abcd2bd, + 0x27244f9b, + 0x25f39b31, + 0x30274028, + 0xd4d1101e, + 0x3e3b1ab4, + 0xd4d543ab, + 0x3f9b1ab4, + 0xb9e5c628, + 0x2e1aa5d4, + 0xfcb4d14e, + 0xd5340b1a, + 0x031b00b3, + 0x03b403e1, + 0xa5d3b9a2, + 0xa6d4b91a, + 0xea430b1a, + 0x61ff3de4, + 0x004dd884, + 0x3f9b1302, + 0x9b412724, + 0x3c5325f4, + 0xe336331f, + 0xc3ab40cc, + 0xb9046499, + 0x0b1abcd3, + 0xacd4bd43, + 0xd884611a, + 0x9b21804c, + 0x3127244f, + 0x5325f39b, + 0x44871f4c, + 0xc4abc4e3, + 0x9b244f9b, + 0x4c5325f3, + 0xe343331f, + 0x24c4abc8, + 0x5ea12792, + 0xb1270105, + 0xb0279496, + 0x3f9bb213, + 0x9b412724, + 0xd4b925f4, + 0xd0b91a06, + 0xd4bd1a07, + 0xd0bd1a9a, + 0x30cc1a9b, + 0x284f9b19, + 0xd4bd4103, + 0x95361a9a, + 0x03284f9b, + 0x27031e41, + 0x9bd4bd40, + 0x9ad4b91a, + 0x104cf41a, + 0xd4b90857, + 0x4cf41a9b, + 0x11084e10, + 0x004ed874, + 0xb9160800, + 0xd01aacd4, + 0x0d070f42, + 0x2b071507, + 0xfdb807be, + 0x08490ff6, + 0x3f9b9676, + 0x9b412724, + 0x3c5325f4, + 0xe333471f, + 0x11c3abc2, + 0x1048d874, + 0x27243f9b, + 0x25f49b41, + 0xe31f3c53, + 0xe3c3abc1, + 0xa30180cd, + 0xcc3c20cc, + 0x1ea12740, + 0x2794c62f, + 0x9b0c1e31, + 0x4127243f, + 0x9b1f3c53, + 0x402725f4, + 0x1aa7d4bd, + 0xd4b93506, + 0x051e1a9a, + 0x1a9bd4b9, + 0x4f9b4230, + 0xa7d4bd28, + 0x11a3071a, + 0x004d1874, + 0xd8912001, + 0x1d02004d, + 0x1d079796, + 0x0d072b07, + 0x1a9a1d03, + 0xfdbb2fbe, + 0x07c50ff6, + 0x4213f421, + 0x1becd4bd, + 0xf4284f9b, + 0x13079e45, + 0x95d4bd45, + 0x0bd4b91a, + 0x293f9b1a, + 0xd1b9430b, + 0xd2b90778, + 0xd3b91a0e, + 0xd4bd1a0f, + 0xd1bd1a96, + 0xd2bd1a97, + 0xd3bd1aaa, + 0x74111aab, + 0x1b804cd8, + 0x1aaad4b9, + 0x0b293f9b, + 0xaad4bd43, + 0xabd4b91a, + 0x293f9b1a, + 0xd4bd430b, + 0x74111aab, + 0x00004e3c, + 0x1e302701, + 0x243f9b0c, + 0x3c534127, + 0x25f49b1f, + 0x1a08d2d1, + 0x83112c53, + 0x9b3a4621, + 0x4127242f, + 0x5325f49b, + 0x42071f2c, + 0xcde34733, + 0xc4ab0180, + 0xcce34a07, + 0xab453320, + 0x80ccdcc4, + 0x294f9b0f, + 0x1aa8d4bd, + 0xbd294f9b, + 0x111aa9d4, + 0x004dd874, + 0x42072a40, + 0xcde34733, + 0xc4ab0180, + 0x45334a07, + 0xab20cce3, + 0x834c07c4, + 0x4cc08c4c, + 0x3f9b0e80, + 0x9b412724, + 0x3c5325f4, + 0xd10a1e1f, + 0x531a08d3, + 0x31830e3c, + 0x38334c07, + 0x01004de3, + 0x273343ab, + 0xab804ce3, + 0xe3a53342, + 0x4aab204c, + 0x1a9cd4d5, + 0xd4bd4027, + 0xd4a9012e, + 0xd6d51a16, + 0xf4051bc8, + 0xd4a9f901, + 0x73111a14, + 0xf905949b, + 0x18003df8, + 0xbf9b00a1, + 0x9abfe628, + 0x3c741100, + 0x0110004d, + 0x89041ef0, + 0x0be228d0, + 0xcf9b0673, + 0xf4c10328, + 0x066921cc, + 0x4dd87411, + 0xa76d0800, + 0xfeffff4e, + 0x83094499, + 0x33348743, + 0xf9432b44, + 0x00004d41, + 0x132bbeff, + 0x070b02fe, + 0x272b070b, + 0x210320bc, + 0x10273007, + 0xbc2be127, + 0x4f9b311e, + 0x25fc9b24, + 0x11034b5b, + 0x3816140b, + 0x012ed4b9, + 0x43333007, + 0x4ead4d0b, + 0x41d50148, + 0xd4b90144, + 0x4103012e, + 0x012ed4bd, + 0x3123031e, + 0xf2f0e103, + 0x001fd0ce, + 0x0e100000, + 0x0705f65e, + 0x244f9b3b, + 0xb825fc9b, + 0x385421f3, + 0xa908004d, + 0xe41a14d4, + 0x1105de41, + 0x004ed874, + 0x9b121000, + 0x3103283f, + 0x4f9b091e, + 0x9b482724, + 0xf3a825f4, + 0x27243f9b, + 0x25f49b41, + 0x05b930ec, + 0xffee91be, + 0x8ec6f093, + 0x3c02c101, + 0x9b231f9b, + 0x4307223f, + 0x4008422b, + 0x41073207, + 0x41c8432b, + 0x3c04c113, + 0x48e4411b, + 0x3ebe0597, + 0x0626fd87, + 0x9b058e5e, + 0x03c1214f, + 0xf6438bbc, + 0x9905824f, + 0x13e07cd1, + 0xd88901d3, + 0x4cd49926, + 0xd122f293, + 0xa9980701, + 0x3b107823, + 0x0f39ca94, + 0x9928d489, + 0x22a94dd3, + 0x433b107a, + 0xf0934242, + 0xbefe3920, + 0x5efd37c9, + 0xcd070543, + 0xe018cc03, + 0x0300f412, + 0x07054cdd, + 0x03dd033d, + 0xe32d0702, + 0x2ce37f3c, + 0x4fdd237f, + 0x03341907, + 0x32c2803c, + 0x073d07f9, + 0x4c3d034d, + 0x484d0305, + 0x812c2703, + 0x44034001, + 0x34033005, + 0xd421f2a8, + 0x30274138, + 0xd4b90d1e, + 0x31271a94, + 0x30274496, + 0xd4d13213, + 0xd39d1a08, + 0x27423c20, + 0xd1091e20, + 0x831aa0d2, + 0xb921c321, + 0x990756d4, + 0xd29d7bd3, + 0x27412350, + 0x27431210, + 0x07d42111, + 0x8341530d, + 0xab41ab41, + 0x032d0742, + 0x9d03480d, + 0x150724d4, + 0x3c072803, + 0xfdafbcbe, + 0x442704f6, + 0x9904ae5e, + 0xd3996fd4, + 0x6cd2d170, + 0x47430b07, + 0x83470344, + 0x8dfffc4d, + 0x4c0372d4, + 0x23d46560, + 0x2cd8604c, + 0x4d030b10, + 0xd4650448, + 0x031e4227, + 0xd2994027, + 0x9d302750, + 0xd39d74d4, + 0x83d39d82, + 0x939dd29d, + 0x01d017f4, + 0x1a8cd9a9, + 0x8d6c44c1, + 0x4c1890d9, + 0x9dd39d20, + 0xd49d4227, + 0x070d077c, + 0x800c031c, + 0xbe602c27, + 0xf6fd3d0f, + 0xc1044e0f, + 0xbd07acd0, + 0x07600c03, + 0x1e20273d, + 0x4031a90b, + 0x0d21031a, + 0xa9020301, + 0x031a16d4, + 0xee24c232, + 0x61acdec1, + 0x07a887d4, + 0x27e40b9a, + 0x1e9013c0, + 0x18b3a931, + 0x86030d1a, + 0x14d4a9c8, + 0x1c4cc21a, + 0x33872307, + 0x071e3e0b, + 0x14054027, + 0xd4a9280b, + 0x3a0b1a8e, + 0x130b1907, + 0x03ee24ca, + 0x03c10302, + 0x14d4a9b2, + 0xcac4c21a, + 0x996fd499, + 0x430b70d3, + 0x40274138, + 0x0d07040d, + 0xfd9f09be, + 0xe674d499, + 0xacd3c145, + 0x349d4127, + 0x9b40275c, + 0x43270ef4, + 0xd103ae5e, + 0xd11a94d2, + 0xb91a98d3, + 0xa91a14d0, + 0x271a16db, + 0x1bd4bd40, + 0x1ad4bd01, + 0xf4d2c501, + 0xd1f8d3c5, + 0xbd1a9cd9, + 0xbd0119d0, + 0xa90118db, + 0x110768dc, + 0xfcd9c5f0, + 0x4abe1c07, + 0xd489fe10, + 0xe2900728, + 0x11035e40, + 0xbe1c07f0, + 0x07fe1033, + 0x273d076d, + 0x08d0ad21, + 0x0ad9ad01, + 0xa9161e01, + 0x031a4434, + 0x0b49c232, + 0x41234207, + 0x011bd4bd, + 0x2103061e, + 0xb9e92bc2, + 0xa9011bd4, + 0x470768dc, + 0x0b410334, + 0xa944473d, + 0x0b1a4231, + 0x424ea94d, + 0xa9c19b1a, + 0x2b1a14d8, + 0x077c07e1, + 0x27b0272d, + 0xa93e1ea1, + 0x031a1a24, + 0x2b340722, + 0x2740c23b, + 0xc00b4907, + 0x439b412b, + 0xc40bcb2b, + 0x41234a07, + 0x011ad4bd, + 0x011cdbad, + 0x011ed1ad, + 0x0120d3ad, + 0x0122dead, + 0x3e9b0e1e, + 0xa103c30b, + 0x7c07b407, + 0xd1c1a8c2, + 0xb91a9cd2, + 0x071aaade, + 0x07355332, + 0x83488343, + 0x8734ab34, + 0x104c8342, + 0x228731a3, + 0x1aabd1b9, + 0x2c8334ab, + 0x3fec8320, + 0x1aa8d0b9, + 0xe63332ab, + 0xab3f1c83, + 0x0c1c333e, + 0x1a14dea9, + 0xb90f0c83, + 0xb9011bd2, + 0xab1aa9d4, + 0x180c3331, + 0x011ad1b9, + 0x30ab2e9b, + 0x0b1c4c33, + 0xa734ab12, + 0x93002720, + 0xfda696f4, + 0x012edeb9, + 0x012ad1ad, + 0x0116d0ad, + 0x010ed2ad, + 0x15ecd3c5, + 0x28d1add4, + 0xb4dcc501, + 0x0110d2ad, + 0x0112d0ad, + 0x0114d2ad, + 0x008defe6, + 0x022dc7ee, + 0xa923ef9b, + 0x270148d2, + 0xad1d0700, + 0x1e010cd2, + 0x4414d130, + 0x4813a901, + 0x28d2a901, + 0x0b433301, + 0xd5320b4e, + 0xab014414, + 0xadf4013f, + 0x03014813, + 0x0b34ca18, + 0x41234007, + 0x012ed4bd, + 0x01030a1e, + 0x012ed4b9, + 0xb9cb04ca, + 0x06012ed4, + 0xf1f3934d, + 0x39c1018a, + 0x44d2d13c, + 0x34d9d501, + 0x8a349901, + 0xc10e41d8, + 0x42079033, + 0x432b3333, + 0x23074108, + 0x8acef493, + 0x3c42c501, + 0xd4ad4027, + 0xf493012c, + 0x15fda6c4, + 0xa90d1ed4, + 0x010128d4, + 0xad401bf0, + 0xb9010cd4, + 0x131a94d4, + 0x8ad4bd42, + 0xc44d2701, + 0x84d4d501, + 0xbd402701, + 0x21018bd4, + 0x8ad3b954, + 0x404cd801, + 0xc443070a, + 0x42270b31, + 0x4307071e, + 0x41273204, + 0x018ad4bd, + 0x1a9cd4d1, + 0x1becd2b9, + 0x34074253, + 0x31834153, + 0xd3bd4183, + 0xd4bd0344, + 0x2b160345, + 0xd2bd4027, + 0xd4bd01cd, + 0xdd0301cc, + 0x3d0701d0, + 0x07efdc03, + 0x7f3ce32d, + 0x237f2ce3, + 0x1902bfdd, + 0x803c0334, + 0x07f932c2, + 0xd00d030d, + 0x27102701, + 0x96be3c2c, + 0xd4b9ffe2, + 0xbd071a94, + 0x018cbd03, + 0x072942c0, + 0x48cd03cd, + 0x07150703, + 0xbe0c072b, + 0x27000413, + 0x27049691, + 0x072d0790, + 0x030c071b, + 0xbe02c42d, + 0x07000360, + 0x27201ea0, + 0x0b07202c, + 0xbeff1c27, + 0x07ffe200, + 0x102c273d, + 0x34d54027, + 0x340302c4, + 0xa027f2a8, + 0xd4b99027, + 0xcd071a94, + 0x01accd03, + 0xbd074a76, + 0x0348bd03, + 0x15070b07, + 0xb1be2c07, + 0x09ab0001, + 0x04864027, + 0x2d074127, + 0x1c070b07, + 0x03042d03, + 0x09be9407, + 0x0c330003, + 0xab9f6b10, + 0x071a1ea0, + 0xff1c270c, + 0xbe202c27, + 0x27ffe1a4, + 0x4027103c, + 0x030464d5, + 0xf3a86403, + 0x4d034d07, + 0xd3b90184, + 0xd4c51a94, + 0x02d9bdbc, + 0x04dad501, + 0xc0dad501, + 0x4332c002, + 0xd1b95421, + 0x4c581aa7, + 0xb91d0b20, + 0x1e018c11, + 0xb91d0b07, + 0xc001ac11, + 0x5331ff1c, + 0x9d0d0711, + 0x0d03bad1, + 0x4ebe0348, + 0x0f6bfdae, + 0xc0bbd09d, + 0x9919100c, + 0x4447bad4, + 0x08fc44f9, + 0x4cc00005, + 0x41270aff, + 0xd49d0327, + 0x27191e7d, + 0xa7151e01, + 0x27111e00, + 0x9d0d1e04, + 0xd4997cd4, + 0x4c44e47c, + 0xc3ed1efc, + 0x4ef58ef0, + 0x5dfc93fc, + 0xc41101eb, + 0x0c07dc07, + 0x04d6f48b, + 0x4286c419, + 0xc41d4027, + 0x3127fc8e, + 0xeb42f493, + 0x0b431d01, + 0x07f74efe, + 0x35fc93e0, + 0xc0c101eb, + 0x34e4c140, + 0x8207d107, + 0xeb897307, + 0x1740ce26, + 0x2c079c07, + 0x1a14caa9, + 0x1a16cea9, + 0x1a189d03, + 0x1a422d03, + 0xe4c1171e, + 0x574e9944, + 0x2c032407, + 0x47220360, + 0x584a999e, + 0x2223920b, + 0x4aab4e07, + 0x076e41c0, + 0x1e112732, + 0x0330291e, + 0x9b400732, + 0x114dc24b, + 0x22232c0b, + 0xc4072409, + 0x042bcb9b, + 0x0c1edc2b, + 0xc1471103, + 0x27df1ec2, + 0x070027c0, + 0x1e412719, + 0x291e091b, + 0x2b200713, + 0x03239b3e, + 0x2a120341, + 0x1ed22bd2, + 0x05ce0b07, + 0xc2041e83, + 0x8101e44a, + 0xf8be0d07, + 0x4007fe0b, + 0x81017005, + 0xd4070d07, + 0xeebedc0b, + 0xb09bfe0b, + 0x0d1edb0b, + 0x1b078b05, + 0xd8be0d07, + 0x7005fe0b, + 0xf78e0d07, + 0x1899f64e, + 0x181d9907, + 0x9107f123, + 0xb207c007, + 0xd8078d02, + 0xbc033b07, + 0xe3eb070f, + 0xece37f3c, + 0x0fbc237f, + 0x3c033419, + 0xf93ec280, + 0x0200c3b9, + 0x01fcc2b9, + 0x01b43d03, + 0x030b0c07, + 0x3d2340a7, + 0xe20701b4, + 0xf41de32b, + 0x1027e103, + 0x2616230a, + 0x0b1ee127, + 0x11030419, + 0x241d4447, + 0x2f070103, + 0xfef0210b, + 0xce041e03, + 0x2307ebd1, + 0x2103ef07, + 0xe10b0c07, + 0x0d1e3c07, + 0x01b334b9, + 0x44471103, + 0xe103e41d, + 0x1e03f2f0, + 0xca310306, + 0xceb9eb1d, + 0x2f0701fe, + 0xe1033107, + 0x0d1e210b, + 0x01d304b9, + 0x44473103, + 0x2103241d, + 0x0715fef0, + 0x07432b4d, + 0x074103ef, + 0x0ae30b2f, + 0x27d8d6d3, + 0x03211e41, + 0xd93dca01, + 0xec272f07, + 0x2b230b11, + 0x113cd0e3, + 0x1ee12719, + 0x03211915, + 0x03e11d31, + 0x98e10321, + 0xa7e21ef4, + 0x03241d40, + 0x99feb821, + 0x28070d9a, + 0x0907c671, + 0x7027a283, + 0x21039027, + 0xeb074d1e, + 0xa4d6e90b, + 0x051e4907, + 0x014804b9, + 0x410b1f07, + 0xe41d4419, + 0x4cd4e419, + 0x4153291f, + 0x34333407, + 0x342b4487, + 0x3dc13c0b, + 0x27102740, + 0x276d1a41, + 0x8647ab40, + 0x99112744, + 0x71073e34, + 0x44967f6b, + 0x40a7d62e, + 0x9103e41d, + 0xf2f00103, + 0x272b07b2, + 0x280b113c, + 0x8cd0382b, + 0x31270b11, + 0x40a7071e, + 0x2103241d, + 0x0707f3b8, + 0xf68ef103, + 0x0000007f, + 0x04d1f54e, + 0xa00701b0, + 0x61074711, + 0x8027b207, + 0x5ca79027, + 0x0b46077f, + 0x50431949, + 0x4027203c, + 0x6f1eb405, + 0xd153d307, + 0x3d874d07, + 0x432b4433, + 0x44c14a0b, + 0x2bc70740, + 0x034c07c4, + 0x114cd448, + 0xe94c470d, + 0x030c1040, + 0x1e0f8b00, + 0x80cf2c2a, + 0x07ffffff, + 0x07101e15, + 0x80ccc81c, + 0x9df4130a, + 0x01074101, + 0x0107071e, + 0x0013100c, + 0x0d030173, + 0xbfbe4000, + 0x4d87fe09, + 0xd42bd433, + 0xd499da0b, + 0x2742443d, + 0xab493b41, + 0x100c3384, + 0xc0abcfab, + 0x9103bc05, + 0x9ce4b403, + 0x07ff7c10, + 0x4ef58e08, + 0x99a107f6, + 0x11990618, + 0x07f12318, + 0x02d20790, + 0x07180781, + 0x0fdc033d, + 0x3ce3ed07, + 0x7fece37f, + 0x190fdc23, + 0x803c0334, + 0xb9f93ec2, + 0xa701fc93, + 0x07310340, + 0x27e90709, + 0x1ef41d20, + 0xb3e4b90b, + 0x47210301, + 0x07c41d44, + 0xf0c20bcf, + 0x061e03f3, + 0x21cee103, + 0xfe9eb9e9, + 0x074f0701, + 0x0be10332, + 0xb90d1e24, + 0x0301d304, + 0x1d444731, + 0xf0210324, + 0x410715fe, + 0xef07432b, + 0x2f074103, + 0x130ae30b, + 0x412718d6, + 0x0103211e, + 0x07d931ca, + 0x11ec272f, + 0xe32b230b, + 0x19113cd0, + 0x151ee127, + 0x31032119, + 0x2103e11d, + 0xf498e103, + 0x40a7e21e, + 0x2103241d, + 0xab99feb8, + 0x71c8070d, + 0x830a0796, + 0x277027b1, + 0x1ec103a0, + 0x0bed074d, + 0x07b4d6ea, + 0xb9051e4a, + 0x07013804, + 0x19410b1f, + 0x19e41d44, + 0x1f4cd4e4, + 0x07415329, + 0x87343334, + 0x0b342b44, + 0x4032c139, + 0x41271027, + 0x4027621a, + 0x448647ab, + 0x34991127, + 0x6b71073e, + 0x2e44967f, + 0x1d40a762, + 0x03a103e4, + 0xb2fcf001, + 0x3c272d07, + 0x2b280b11, + 0x118cd038, + 0x1e31270b, + 0x1d40a707, + 0xb8210324, + 0x030707f3, + 0x4ef68ef1, + 0x3bcf5bf0, + 0x4efe2bdf, + 0xbe0f07fc, + 0x0effcfe8, + 0x0bf00efc, + 0xff1ea7ff, + 0x1401fd4f, + 0x03122f9b, + 0xc1443341, + 0x24ab3813, + 0x0027322e, + 0xf3abfe0b, + 0xc13812c5, + 0x42ce3814, + 0x27f3ebf8, + 0x4efe0b01, + 0x76d33efe, + 0x200c2705, + 0xd39efe0e, + 0xfe8efdb0, + 0x90004f27, + 0x43291007, + 0xa0004f27, + 0x44291007, + 0x03fc3d10, + 0x4d10ff1e, + 0xff1e03fc, + 0x042b0307, + 0x0d03000c, + 0x412703fc, + 0x4027010c, + 0xfe0b0407, + 0xc007fc4e, + 0xfe0929be, + 0x4fff1ea7, + 0x01c239fd, + 0x3b412713, + 0x3d42ab43, + 0x9b4027c4, + 0x14c50ef4, + 0x00fc8e38, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x0489fd4e, + 0xe40d89e8, + 0x4fab410b, + 0x99e8048d, + 0x4d2be70e, + 0x1fab1407, + 0x3ea7eaa6, + 0xc1fdefff, + 0x1e2bb434, + 0x11e04cd8, + 0x076515d0, + 0xe8432723, + 0xb423c1f4, + 0xf6e03cdc, + 0x4d0b4e07, + 0x039d3027, + 0xe4048de7, + 0xffff3ea7, + 0x4234adfe, + 0x0718060d, + 0x3815d441, + 0x9ddc01c1, + 0x2407e704, + 0xe52feea7, + 0x9e0489fd, + 0x40484f8b, + 0x01c5f2b0, + 0xc1fd8edc, + 0x0389bc04, + 0x03410bec, + 0x15e40548, + 0x893027e3, + 0xe335a004, + 0xf2f0140b, + 0x27e01ed9, + 0x8ec61e44, + 0x07fd4efd, + 0x871f6b10, + 0x04df03d1, + 0x530004d1, + 0x103f9b08, + 0xf293d401, + 0x51018f54, + 0x05432b2e, + 0x08e19dd4, + 0xa7122499, + 0xfd4fff3e, + 0x4909e49d, + 0x99e44d24, + 0x21690824, + 0x410b3211, + 0xe205e46d, + 0x402707f6, + 0x070ef49b, + 0x27ff8b00, + 0x05302740, + 0x08e39de4, + 0x01102f9b, + 0x05420bd4, + 0x07fd8ed4, + 0x03427340, + 0x1ef4e841, + 0x99fb4ee3, + 0x43c0e604, + 0xe0140713, + 0xc000e242, + 0x4ff62244, + 0x02c10146, + 0xa7471ea4, + 0xfdefff4e, + 0xfca843c1, + 0x00a1e03c, + 0x049d4427, + 0xc00489e6, + 0xa7e0048d, + 0xfdefff4e, + 0xfc8443c1, + 0x0112e03c, + 0x27c00389, + 0xca049d40, + 0xa7c4038d, + 0xfeffff4e, + 0x0d3e43ad, + 0x89a402c1, + 0x1027a204, + 0x02c5240b, + 0xa804c1a4, + 0x891242c2, + 0xe20ba20e, + 0xe407e402, + 0x01d004c1, + 0x52e3c243, + 0x27e60499, + 0x27144e20, + 0xff4ea731, + 0x43c5fdcf, + 0xe6029d70, + 0x893913c4, + 0x4f8b9e04, + 0x893140cc, + 0x0189c00c, + 0xa40ec1e0, + 0xe55fdea7, + 0xb804c1fd, + 0x0bec0389, + 0x0548034e, + 0x07d315d4, + 0x89310331, + 0x4027a002, + 0xd4351307, + 0xe20b1fab, + 0x8edfc1ce, + 0xcc0499fb, + 0x009d4ff6, + 0x89a00189, + 0x210bc003, + 0x4207210b, + 0x3103412b, + 0x8df64eca, + 0x4ea7c003, + 0xadfeffff, + 0xa70d3c43, + 0xfeffff3e, + 0x0d4034a9, + 0x89c00b89, + 0x4b1bc403, + 0x4ccc4f8b, + 0x0ec15c11, + 0xa71307a4, + 0xfde5ffce, + 0xe5efdea7, + 0xb804c1fd, + 0x4e0b3827, + 0xc315c405, + 0x4c834107, + 0x3320270f, + 0x23c23543, + 0xfef4a44e, + 0xd315d405, + 0x41034107, + 0x07a00389, + 0xabd23514, + 0xcee30b1f, + 0x0499d0b1, + 0x271327e6, + 0xff2f5e23, + 0x27e60499, + 0x5e242714, + 0x2407ff25, + 0x2a5e2f6b, + 0xe60499ff, + 0x22271227, + 0xa7ff145e, + 0xd07fff3e, + 0xe4e23411, + 0x3e25ff5c, + 0x00feff5e, + 0x0004d34c, + 0x0004d0e8, + 0x0004d080, + 0xff0102d8, + 0xff0102e8, + 0x0004d088, + 0xff0102e0, + 0xff0104a8, + 0x0004d090, + 0xff010668, + 0xff010678, + 0xd007f54e, + 0x9051f193, + 0xd5f09301, + 0x2d070188, + 0x0ce3f1a3, + 0x7f1ce37f, + 0x45f82c03, + 0x35f155f0, + 0xff4ea7f2, + 0x43d1ffff, + 0x3fe60a44, + 0x3ea7070a, + 0x11fd6fff, + 0x104ca334, + 0xf0933415, + 0xa7018cc4, + 0xfefd331e, + 0x03011401, + 0x432b0211, + 0x06fc41e8, + 0x070820e8, + 0x24334287, + 0x3407420b, + 0x340b3433, + 0x31551c27, + 0xf83e23f4, + 0x2107fef5, + 0x11233001, + 0x34034005, + 0xf2984403, + 0x8c86f293, + 0x11240101, + 0x93410322, + 0x018c7bf3, + 0x34052103, + 0x41233215, + 0x06bd21ec, + 0x4ea73301, + 0x15fefd33, + 0xc0d3a943, + 0xfad18901, + 0xcfff4ea7, + 0xc52127fd, + 0x312b6442, + 0xd4993123, + 0x98d38df8, + 0x066741f8, + 0xb998de89, + 0xb901c5d4, + 0x3b0191d1, + 0x4514f0e4, + 0x6cdba906, + 0x07142301, + 0x03413b4b, + 0x074e1b14, + 0x8d9fab94, + 0x14f09ed9, + 0x14230621, + 0x015b0e07, + 0x20271403, + 0xf2834ea7, + 0x6adca9fe, + 0x0cd29d01, + 0xd24dd20d, + 0x0104d2a9, + 0x3027d455, + 0xc1234127, + 0x9d12d28d, + 0xd49d08d3, + 0x87d06d09, + 0xc4d2b9ac, + 0xf0c10301, + 0x0705ce14, + 0x8b310749, + 0x2734234f, + 0x27400810, + 0xab410711, + 0x2b4b0b4f, + 0x0bd39d40, + 0x4202433b, + 0x435b4207, + 0x2a073407, + 0x43072123, + 0x13874123, + 0x132b230b, + 0xd49dd22d, + 0x0711030a, + 0xe641e804, + 0x23230705, + 0xa73d0721, + 0x0d349d42, + 0xf2b03103, + 0x019d0d0b, + 0x5df0530d, + 0x050401fe, + 0x2c4c034e, + 0x4fc4e103, + 0x0004d3fc, + 0xf9d499f3, + 0x0100d2a9, + 0x41233407, + 0x330f4c83, + 0x27433333, + 0x23c29b00, + 0xfffef43e, + 0xfef44e23, + 0xb91247ff, + 0xc5015bde, + 0xd4c5d4d3, + 0xa2d18dd0, + 0x9da8dcc5, + 0xd28dcdd0, + 0xccd09da0, + 0x051defe6, + 0xffff4ea7, + 0x4143b9fe, + 0x103fe601, + 0xfad48905, + 0xffff3ea7, + 0xc0d2a9df, + 0xbcd3c501, + 0x03b8d3c5, + 0x27422e41, + 0xccd49d41, + 0x38f8d499, + 0x9d412744, + 0x3027cdd4, + 0xd3c54027, + 0xe6d49ddc, + 0xc5a4d3c5, + 0xd3c5b0d3, + 0xb4d3c5ac, + 0x07d8d3c5, + 0xfc437e0d, + 0x00004f27, + 0xd3b98000, + 0xd4c50190, + 0x9a36e0f0, + 0xf6d48905, + 0x2bf4d389, + 0x33478343, + 0x004fa347, + 0xc5800000, + 0xf353f0d4, + 0xf193fd98, + 0x93018adc, + 0x018aebf2, + 0xf9933601, + 0x15018abc, + 0x99f205f1, + 0x4fe609d4, + 0xd2b90122, + 0xdb990190, + 0x6b242308, + 0x3b4b072f, + 0x87340742, + 0x2b343314, + 0x2bdc4931, + 0xf4d18934, + 0x0191d4b9, + 0x3c078387, + 0xd3488f03, + 0x323b0004, + 0x46e01c0b, + 0x844902e4, + 0x930d8305, + 0x2d0a9b9d, + 0x999c4d94, + 0x2b07f6d4, + 0x3783340b, + 0x949d4327, + 0x0b939d0c, + 0x83f0d3c1, + 0x23830f1c, + 0x23ab4187, + 0x924524ab, + 0x2e0ad499, + 0x402da3b4, + 0x09924504, + 0x6ed2a994, + 0x334f8b01, + 0x10242b44, + 0x2c27412c, + 0xa9942940, + 0x8b0170d3, + 0x0344334f, + 0x53342b27, + 0x413c1023, + 0x03403c27, + 0x23335337, + 0x83944121, + 0x33312327, + 0xab37832b, + 0x143c3324, + 0x924523ab, + 0x01afbff6, + 0x07ead289, + 0xe2412342, + 0xa701a74c, + 0xfeffff1e, + 0x0d3e14a9, + 0x03c8d389, + 0xab432bc1, + 0x20c4ca4f, + 0x0d27a107, + 0xba7e6411, + 0x7e0d07fa, + 0xa4a9fb1d, + 0xd3890d3e, + 0xab432bc8, + 0xe74cc24f, + 0x93ead289, + 0x0189b7f0, + 0xd3490401, + 0x04054103, + 0x01fc32ea, + 0x949d4127, + 0x05bfe60c, + 0x0c949902, + 0xa71043c4, + 0x08848d40, + 0x8d0c9399, + 0x33e00894, + 0x3ea700c5, + 0x21ebffff, + 0x1641dc34, + 0x4127c307, + 0x0c27c435, + 0xfa5f7e0f, + 0xc4354027, + 0x31d8c321, + 0x0c6499ee, + 0x2ea748c6, + 0x93feffff, + 0x01895ff4, + 0x24d14301, + 0x31230be0, + 0x24d54103, + 0xf0930be0, + 0x0501894c, + 0x9d402703, + 0xd4990c64, + 0x304ff609, + 0x0c949901, + 0x018342f0, + 0xf1939241, + 0x01018930, + 0xff4ea713, + 0x4245ebff, + 0x071b31c8, + 0x01f21146, + 0x07f915f6, + 0x5ef20594, + 0x0d07fe63, + 0x657e1027, + 0xe84327f9, + 0xe4d389f4, + 0xcee8d489, + 0xd089ed43, + 0xf6d489ea, + 0xa9c8d389, + 0x89016ad1, + 0x310be2d2, + 0x4103400b, + 0x89c8d38d, + 0x200b9ed3, + 0xd28d41e3, + 0xf6d48de2, + 0x30ec3f8b, + 0xd489fbed, + 0x8d400bf4, + 0xe25ef4d4, + 0x9cd499fb, + 0x44863027, + 0x9a993127, + 0x073f6b0a, + 0x33f3254a, + 0x2b3a8744, + 0x214a2b43, + 0x03c487f1, + 0x04d348cf, + 0xf614c600, + 0x310345af, + 0x963027c4, + 0x41312744, + 0x6b5307c4, + 0x724fe65f, + 0x5f5fe601, + 0x03ba0701, + 0x7b0711bc, + 0x7333ab47, + 0x74f1ce61, + 0xff021000, + 0x100b0d27, + 0x0138efe6, + 0x4c33c151, + 0x1d4c5318, + 0x00001ff0, + 0x035c1000, + 0x4413c881, + 0x03618ff6, + 0x00eb4ff6, + 0x1ef9387e, + 0xead289d0, + 0xfe8d21e4, + 0xfe89bff6, + 0xffff1ea7, + 0x3e14a9fe, + 0xc8d3890d, + 0x4fab432b, + 0xfe75c4ea, + 0x0d27a107, + 0x0e7e6411, + 0x7e0d07f9, + 0xa4a9f971, + 0xd3890d3e, + 0xab432bc8, + 0xe74cc24f, + 0x09fe535e, + 0xeed129d2, + 0x0702d912, + 0x0b438342, + 0x0d43994d, + 0x230b3f4b, + 0xdaf120c8, + 0x3207ee12, + 0x33834207, + 0xd44d4253, + 0x0d08d39d, + 0x0a9299d2, + 0xd4892716, + 0x239349ea, + 0x0d43d241, + 0x899ed489, + 0x4f8be2d1, + 0x017d40e8, + 0xee0ad499, + 0x07fe8842, + 0x7e11270d, + 0x9499f814, + 0x8142f40c, + 0x5e2027fe, + 0xd499fe7e, + 0x89d36908, + 0x430b9ad2, + 0xfdfa24e2, + 0xfdffbff6, + 0xea7e0d07, + 0xfdf75ef8, + 0x1b5e1383, + 0x334b07fd, + 0xf1ce6143, + 0x02100044, + 0x51eda6ff, + 0x001ff0c1, + 0x77100000, + 0x184c3302, + 0x4c53c881, + 0xf644131d, + 0xe602da8f, + 0x33c4a14b, + 0x08a4f5a4, + 0x89ff0218, + 0xc25126c4, + 0x35333b07, + 0x32f54f6b, + 0xff021800, + 0xf5104c33, + 0x0218043e, + 0x004fa3ff, + 0x23040000, + 0xfde8003e, + 0xc3413435, + 0x430bc431, + 0xc4353027, + 0xf321c345, + 0xfd9c3ff6, + 0x4123c431, + 0x935ec435, + 0x90a1e0fd, + 0x6ea1d400, + 0xf9e6f353, + 0xf9e6f453, + 0xf9e6f053, + 0x47013b01, + 0x5fc60801, + 0x01730161, + 0xeeb211b4, + 0x0701ab34, + 0xd040e842, + 0x33340701, + 0x2b448735, + 0x0b4c0734, + 0x104c0338, + 0x30012727, + 0x40053403, + 0xf2a84403, + 0x4103b401, + 0x7415b405, + 0x3103b311, + 0x150f3c83, + 0x074127b3, + 0xff2ea7ba, + 0xbc03fdcf, + 0x6424c511, + 0x5fe6ab47, + 0x7b07ff21, + 0x2d5e7333, + 0x43a2c0fe, + 0x1e2ea3c0, + 0x017301ff, + 0xeeb211b4, + 0x07017134, + 0xff4fe042, + 0x63ffffff, + 0x539b1eff, + 0x53f967f1, + 0x53f967f2, + 0x01f967f3, + 0x0127011b, + 0xff745e38, + 0x8662fb93, + 0x8f7ea701, + 0x8ea7fef9, + 0x5efef7c7, + 0xf453ff62, + 0xf053f94c, + 0xf153f94c, + 0x4b01f94c, + 0x18010701, + 0x03ff4d5e, + 0x89310b31, + 0xc307e0d4, + 0x4c2bcfab, + 0x41ec4f8b, + 0x0d07fe74, + 0x89f7887e, + 0x4c2be0d4, + 0x41c84f8b, + 0x0a9299f2, + 0xc1fe5f5e, + 0xd4c5fcd4, + 0xb8d4c5bc, + 0x27fb0d5e, + 0x07412b44, + 0x2b243b3b, + 0x0bd49d30, + 0xfa4832e2, + 0x435e3207, + 0x2b4427fa, + 0x3b0e0741, + 0xf9e05e04, + 0x016cdba9, + 0x412b4427, + 0x047b0b07, + 0xba5e4007, + 0xbe0d07f9, + 0x41fda6d7, + 0x513419f3, + 0x803c03f4, + 0x5ef734c2, + 0x3ea7f988, + 0x11fd6fff, + 0x104ce334, + 0xf75e3415, + 0x5e0027f8, + 0x20a7fa28, + 0x03f9035e, + 0x05422b42, + 0x5e311534, + 0x4027f93c, + 0x9b0bf49b, + 0xbea70ef4, + 0x07fdcfff, + 0xffaea791, + 0x4827feff, + 0x274cb4c5, + 0x97a3bd32, + 0x9bc0270d, + 0x41270efc, + 0x2768b4c5, + 0xf66b7e05, + 0xa4bd4027, + 0xfc9b0d97, + 0x4cbcc50e, + 0x936cbcc5, + 0x018567f1, + 0x13019401, + 0x432b1211, + 0x20a7410c, + 0xf8aa20ec, + 0xf293c11e, + 0x310187f8, + 0x35412324, + 0xfbc45e24, + 0x565e40a7, + 0x04d4d1fe, + 0xead38901, + 0x438b4183, + 0x4fa34733, + 0x80000000, + 0x5ef0d4c5, + 0x4027fa66, + 0x5e09d49d, + 0x40a7fd45, + 0x27fe905e, + 0xff2ea748, + 0x24c5fdcf, + 0x7e0b274c, + 0x4027f5fd, + 0xcfff3ea7, + 0x4c34c5fd, + 0x5e6c34c5, + 0x2e07fe05, + 0x2787f093, + 0xcf42befe, + 0xf0ff1efd, + 0xa1fca342, + 0x330a07c4, + 0x0804f504, + 0x89ff0218, + 0xc35126c4, + 0x25332b07, + 0x23f54f6b, + 0xff021800, + 0x4c331207, + 0x004fa310, + 0xf5040000, + 0x0218042e, + 0x001e23ff, + 0x1435fde8, + 0xe30bc3a1, + 0x18080ef5, + 0xc489ff02, + 0x6bc37126, + 0x0023f54f, + 0x33ff0218, + 0x28f5104c, + 0xff021804, + 0x00004fa3, + 0x14350400, + 0xd4fd5d5e, + 0x635e9e42, + 0x000000fd, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x4007fb4e, + 0x6b174c53, + 0x07c0074f, + 0xc0d027b1, + 0x0741ff4c, + 0xff3e8330, + 0x4ba67fff, + 0x0c230407, + 0x1f0ccc77, + 0x003ea32f, + 0x13078000, + 0x01e82027, + 0x4c23008c, + 0x6940c897, + 0xe43be307, + 0xd03bd107, + 0x2d074e07, + 0x49333e07, + 0x73172c53, + 0x24ab173c, + 0x272831c8, + 0x27fb8e00, + 0x773c2720, + 0x07574c27, + 0x07d47bd2, + 0x07e37be2, + 0x072d074e, + 0x5349333e, + 0x3c73172c, + 0xcc24ab17, + 0x3536da31, + 0xba602fd4, + 0xc8d10ccc, + 0xffffff3f, + 0x3fc0caff, + 0xffffffff, + 0x07b2051f, + 0x21c0cc42, + 0x01274013, + 0xfb8eb405, + 0x2b204c27, + 0x5be20740, + 0xabe03b34, + 0xd08e1ee3, + 0x0000002f, + 0xda1e9e80, + 0xfb8e0127, + 0x30133007, + 0x4c234307, + 0x9840cc20, + 0x2b204c27, + 0x07020743, + 0x5b043bd1, + 0x1ed0abd3, + 0xa3f84e8b, + 0x09f005f0, + 0x8b8207f0, + 0x1593070f, + 0xea2dbef1, + 0x49c007fd, + 0xbe0f8bf0, + 0x07fdea23, + 0xbe0c0710, + 0x07fde7e0, + 0x07f029b0, + 0xbe0f8bab, + 0x07fdea0f, + 0x8bf069c0, + 0xea05be0f, + 0x071007fd, + 0xe7c2be0c, + 0x00df27fd, + 0x07448000, + 0x071d07c0, + 0xbebc070b, + 0xc8fdeba6, + 0xd0272201, + 0x0b071907, + 0x07fec77e, + 0x071807c0, + 0xfebe7e0a, + 0x08b60c8b, + 0xf1930427, + 0x9efe25a4, + 0x07fdd05e, + 0x270c071d, + 0xeb78bed0, + 0x270108fd, + 0xc34d07d1, + 0x6bd40741, + 0xc6ca1edf, + 0xf083dbdf, + 0xfc4ef88e, + 0xefff4ea7, + 0xf04ec1fd, + 0xec33d107, + 0xb6028918, + 0x53b20389, + 0xd1031dec, + 0xe43fcea7, + 0x143222fd, + 0x03fdf0e4, + 0x0489fc8e, + 0x2b1407bc, + 0x3b42c212, + 0x02c00489, + 0xc1140714, + 0x0389cc04, + 0x0b240bdc, + 0x15c20523, + 0xc00289c1, + 0x89b60389, + 0x320bb204, + 0x0189420b, + 0xb6038dc8, + 0x03b2048d, + 0x89402711, + 0x0389b602, + 0x8dc435b2, + 0x4e07c801, + 0xe4074103, + 0xaa1eef6b, + 0x04a9fe4e, + 0x492602d4, + 0x31071353, + 0xc1c80e89, + 0x3fabd402, + 0x14072411, + 0x13c21fab, + 0x27e142f8, + 0x5efe0e10, + 0x1e2bff66, + 0xfe0e1fab, + 0x8eff5d5e, + 0x07fc4efe, + 0x6bd007c1, + 0x3df093cf, + 0xad7e019d, + 0xa7c7a600, + 0xfeffff2e, + 0x014223a9, + 0x014424a9, + 0x277834ce, + 0x9823bd30, + 0x9b40270d, + 0x1d070ef4, + 0x01871f6b, + 0xea980f03, + 0xd8530004, + 0x01103f9b, + 0xb5f29304, + 0x2e51019b, + 0x0405432b, + 0x9908e19d, + 0x3ea71224, + 0x9dfd4fff, + 0x244909e4, + 0x2499e44d, + 0x11216908, + 0x6d410b32, + 0xf6e205e4, + 0x9b4027dc, + 0x00070ef4, + 0x2027ff8b, + 0xe49d4027, + 0x9be20508, + 0x0401103f, + 0x0405430b, + 0x3ea7c606, + 0xbdfeffff, + 0x270d9832, + 0x0ef49b40, + 0x3227fc8e, + 0x0d9823bd, + 0xf49b4027, + 0xa731270e, + 0xfdcfff4e, + 0x5e6843c5, + 0x4d07ff7e, + 0x41034273, + 0xbb1ef4e8, + 0x0499f94e, + 0xe6c00725, + 0xa700a54f, + 0xfddfff1e, + 0x01c014d1, + 0x00944fe6, + 0x020c13d1, + 0x03250271, + 0x021014d1, + 0x35270d99, + 0x1413d104, + 0x45402702, + 0xa811d103, + 0xff3ea701, + 0x210bffff, + 0x7525049d, + 0xb9d12302, + 0x83010834, + 0xd4ee0fdc, + 0xd3330168, + 0xc3894027, + 0x0cd4f520, + 0xa7ff0001, + 0xffffff2e, + 0x24b93e56, + 0x4ce00101, + 0xb90131ff, + 0x07010124, + 0x07db07b4, + 0x3347334b, + 0x23d40bd5, + 0xfff70cde, + 0x20274d07, + 0x05283c27, + 0xc8440342, + 0xc1c451f3, + 0xd40550d2, + 0x4ea7c161, + 0xc5fd4fff, + 0x430164d1, + 0xab103c33, + 0x50d2c523, + 0x00271c1e, + 0x0127f98e, + 0x24b9f98e, + 0xd4070101, + 0xd533b407, + 0xd40b4733, + 0xf70cde23, + 0x071c07ff, + 0x0318032d, + 0x0327942c, + 0x13012401, + 0x430b1403, + 0x24032405, + 0xaea7f088, + 0x81fd4fff, + 0xff9ea7ae, + 0xa091feff, + 0x012894d1, + 0x013093d1, + 0xe3330333, + 0xc154d2c1, + 0x301b5cd1, + 0x240b4e1b, + 0x90d5130b, + 0x9ed50130, + 0xd2c50128, + 0x5cd1c554, + 0xd4c1c371, + 0x50d2c170, + 0xd4c5430b, + 0x27a30170, + 0xab033b01, + 0x22c49902, + 0x5650d0c5, + 0x20c1894c, + 0x0329c499, + 0x2ac39911, + 0x3b28c299, + 0x06132b14, + 0xa3115325, + 0x9980001d, + 0xc39926c4, + 0xa9483327, + 0xab014492, + 0x101c3343, + 0x3ea741ab, + 0x03ffffff, + 0x0834d521, + 0xad012701, + 0x8e014492, + 0x07a401f9, + 0x144c331b, + 0xd0c504ab, + 0xbe0c0750, + 0xa7fdbee3, + 0xff4ea730, + 0x43bdffff, + 0xa21e0101, + 0xe8070e27, + 0x7e102703, + 0x0ea7fdad, + 0xbefff71b, + 0x07fe5106, + 0xe900c8b0, + 0xffff4ea7, + 0x0140bdff, + 0xfebf5e01, + 0x0d27b307, + 0x10276406, + 0xb9fd887e, + 0xee0108b4, + 0x1efe894d, + 0x07f84eee, + 0xffbea7c0, + 0x8c27fddf, + 0x65fd9310, + 0x9c270199, + 0xffaea70c, + 0x471efd4f, + 0x9b30b8c5, + 0xd4c1102f, + 0x2bd35138, + 0x38d4c542, + 0x9908399d, + 0x349d12d4, + 0x11d44909, + 0x99344da1, + 0xd26908d4, + 0x420b3105, + 0x4027346d, + 0x070ef49b, + 0x9dff8b00, + 0x30050834, + 0xc1104f9b, + 0xb0c538d3, + 0xc5430b30, + 0x0c0738d4, + 0xc6fdd37e, + 0xf88eb30f, + 0xcea7fc4e, + 0x27fdcfff, + 0xc4c5104c, + 0x7e1f6b50, + 0x4027fd01, + 0xc550c4c5, + 0xfc8e70c4, + 0xfc93fb4e, + 0x070198e8, + 0xffdea7bc, + 0xbd03e7ff, + 0xd3210150, + 0x40273158, + 0xfb8ed435, + 0x02cec4b9, + 0x10270b27, + 0xb90c4c38, + 0x7602edc4, + 0x35412745, + 0xfcc37ed4, + 0x0b07dd1e, + 0x1eff407e, + 0x99fb4ed6, + 0xc107231e, + 0x1401e30b, + 0x8920cd89, + 0xbe071e11, + 0x120bb383, + 0xd30bb4ab, + 0x0091eff6, + 0x00fadff6, + 0x07980489, + 0x2f1fe634, + 0x4414ee01, + 0x9a048901, + 0xc4994d2e, + 0xa3421824, + 0xb98000bd, + 0xa9021504, + 0x2301f003, + 0xe2343b44, + 0xe601173d, + 0xa9011adf, + 0xa9033c04, + 0x03021003, + 0xf241e341, + 0x07009d4d, + 0x0f4c0343, + 0x41034473, + 0x41ea41e3, + 0x21070086, + 0x21032fab, + 0x00a92433, + 0x32c20212, + 0x07c02749, + 0x033fab3d, + 0xca343331, + 0x03ee5730, + 0x430700a8, + 0x04ce4823, + 0x004f276e, + 0xab100000, + 0x7ec4abcb, + 0x4ea7ff20, + 0x45e7ffff, + 0xe4fb8e4c, + 0xa9ff73e3, + 0xe6017e04, + 0xe6ff6b4f, + 0x89009a1f, + 0xbda39804, + 0x665e1000, + 0x6423ceff, + 0x48234207, + 0x077c34ce, + 0x033fab3d, + 0x27343331, + 0x000000cf, + 0xab03c204, + 0xcbab4027, + 0xd97ec4ab, + 0xff4ea7fe, + 0x4c45e7ff, + 0x04b9fb8e, + 0x46e40214, + 0xbea3ff76, + 0x5e800000, + 0x4f27ff6e, + 0x20000000, + 0xc4abcbab, + 0xa7feb37e, + 0xe7ffff4e, + 0xfb8e4c45, + 0x07980489, + 0x0614ee34, + 0x00bda3ff, + 0x021ff608, + 0x272c1eff, + 0x000000cf, + 0xff4d5e0c, + 0x00004f27, + 0xcbab3000, + 0x817ec4ab, + 0xff4ea7fe, + 0x4c45e7ff, + 0xcf27fb8e, + 0x08000000, + 0x89ff2e5e, + 0xbea39803, + 0x07010000, + 0xfecb5e43, + 0x4400bda3, + 0xa3fee65e, + 0x040000be, + 0xa3fee25e, + 0x024000be, + 0x4efeb85e, + 0x241499f9, + 0xa007d107, + 0xc3079207, + 0xc04542c0, + 0x41c02b43, + 0x7eb9072d, + 0xb103fe6d, + 0x0a073c07, + 0x2b071d07, + 0x03fe607e, + 0x072907c1, + 0x071d070a, + 0xfe537e3c, + 0x1d070a07, + 0x3c072b07, + 0x465ef90e, + 0xfe437efe, + 0x0a073c07, + 0x29071d07, + 0xf90e3103, + 0x7efe345e, + 0x2907fe31, + 0x1d070a07, + 0x3c072103, + 0x225ef90e, + 0x99fc4efe, + 0xd1072414, + 0x42c0c007, + 0x4143c04d, + 0x272a41c0, + 0x3e302720, + 0x070c0783, + 0x2722271d, + 0xff797e30, + 0x1d070c07, + 0x32272027, + 0x07ff6e7e, + 0x271d070c, + 0x0e322722, + 0xff615efc, + 0x30272027, + 0x07ff5a7e, + 0x271d070c, + 0x0e322720, + 0xff4d5efc, + 0x30272027, + 0x445efc0e, + 0x272027ff, + 0xff3d7e30, + 0x1d070c07, + 0x30272227, + 0x305efc0e, + 0xa7fc4eff, + 0xfeffff4e, + 0x0d3c43a9, + 0x011804a9, + 0x2bfc0ec1, + 0xc83f8b34, + 0x01d11631, + 0x1ec20100, + 0xf802890f, + 0x04ad4103, + 0xe20b0118, + 0xc55ef3f0, + 0x4ea7fc0e, + 0xd1fdefff, + 0xc1013001, + 0xe1c2b844, + 0x184c334a, + 0xd41d4c53, + 0xd4274144, + 0xcea7d42b, + 0xd1fde51f, + 0xc2013404, + 0x04d11941, + 0x03a90110, + 0x410b014a, + 0x02a9430b, + 0xc405014c, + 0x4027c215, + 0x04a9c435, + 0x03890140, + 0x0b4103f8, + 0x4004ad13, + 0x3001d501, + 0xf0e10201, + 0xfc8ecafd, + 0xa9a11ec2, + 0x1e011804, + 0xa9fd4e90, + 0x07017e04, + 0xc61f6b12, + 0x4ea77a4f, + 0xc1fdefff, + 0x0389fc4d, + 0x18dc33c6, + 0x53ca0489, + 0x3d2b1ddc, + 0x0bc40289, + 0xc111c343, + 0x210bd803, + 0x01894fab, + 0xb40e89b8, + 0x028d3415, + 0xca048dc4, + 0xd647e1c2, + 0xbc0489dc, + 0x072741c2, + 0xc0038924, + 0x2302212b, + 0x04c12307, + 0xdc0389d0, + 0x130b140b, + 0xe40f4ea7, + 0x154105fd, + 0xb8018942, + 0x35b40e89, + 0xc004894d, + 0x31072e07, + 0x240bd127, + 0x038d340b, + 0xb4028db8, + 0x8ec60d8d, + 0x8ddfabfd, + 0xf81ec60d, + 0x09a9f74e, + 0xe0070148, + 0x7907910b, + 0x8ea77fab, + 0xadfdefff, + 0xa7014807, + 0xfde4efae, + 0xb9c48cc1, + 0x330146e3, + 0xcc5318cc, + 0xa93c2b1d, + 0x060142e4, + 0xad430b35, + 0x070142e4, + 0x073c0b34, + 0xce4fab43, + 0xc4d46247, + 0x0703074d, + 0x2b310349, + 0xabb40743, + 0x0bd427bf, + 0xd1dc2bb3, + 0xd10138e1, + 0x03013ce4, + 0x1941c2c1, + 0x0114e4d1, + 0x014ae3a9, + 0x430b410b, + 0x014ce2a9, + 0xa215a405, + 0xa4354027, + 0x03f8e489, + 0xd5410b01, + 0x070138e4, + 0xce4fab40, + 0xfdf0160b, + 0xbd471bc7, + 0xab0146ec, + 0x0c45d04f, + 0xf4e84327, + 0xbdff7b5e, + 0xa70146ec, + 0xfeffff4e, + 0x0d4243a9, + 0x0142e2a9, + 0x422b4307, + 0x80004dfc, + 0x820700f0, + 0xefff4ea7, + 0xcc42c1fd, + 0x0123e4b9, + 0x53182c33, + 0x422b1d2c, + 0x011ee1a9, + 0x140b4766, + 0xffff4ea7, + 0x4041adfe, + 0x1ee1ad0d, + 0xa7312701, + 0xfdcfff4e, + 0x076c43c5, + 0x07320b31, + 0xee4fab43, + 0xf400ab47, + 0x0700a724, + 0x2bd103d3, + 0xabc9079d, + 0x23b207cf, + 0xa7c103d1, + 0xfde4df9e, + 0xe4cfaea7, + 0x834d07fd, + 0x43330f4c, + 0x010ce0d1, + 0xf4a44e23, + 0x10e3d1fe, + 0x27940501, + 0x0bb10318, + 0x27911530, + 0x05923520, + 0x89a115a3, + 0xa235f8e4, + 0xe4d5400b, + 0xd103010c, + 0xa946fcf0, + 0xbd011ae2, + 0xce0123eb, + 0xeca94928, + 0x2cce011e, + 0x04e1d142, + 0xf8ed8901, + 0x012ce0d1, + 0x7fffbea7, + 0x072103d0, + 0x25e4b932, + 0x0b3fab01, + 0x8623071d, + 0x05b10544, + 0xce380e01, + 0xe3ade8c3, + 0xe1d5011a, + 0xf78e0104, + 0xa983b4c4, + 0xbd011ae2, + 0xce0123eb, + 0xf78eb982, + 0xa81eb207, + 0x115e8307, + 0xe3f54eff, + 0x07d007f2, + 0x2710273f, + 0x054a272a, + 0x03212331, + 0x07f4b834, + 0x504d034d, + 0x15f22501, + 0x006d27f2, + 0xff7ea720, + 0x5ea7feff, + 0xa5e7ffff, + 0x08d199f4, + 0xd3b9db69, + 0xd4b90214, + 0xdc490215, + 0x4423b10b, + 0x8c073423, + 0xa1072b07, + 0xa43b243b, + 0x4027833b, + 0x9d20f28d, + 0xf49d22f1, + 0x1cfc8d24, + 0x9d1ef88d, + 0xf60523fa, + 0x01f0d9a9, + 0x010faff6, + 0xea98d489, + 0xe200dd84, + 0x27023c9b, + 0x24f49d41, + 0x3623f499, + 0x14d4b94f, + 0x98d38902, + 0xf2894423, + 0xc2345b1c, + 0xd4a92632, + 0xd3a90144, + 0x420b0140, + 0xcfabc407, + 0x3f8b3c2b, + 0x071131cc, + 0xfc7f7e0d, + 0x0140d4a9, + 0x4f8b4c2b, + 0xb9f141c8, + 0xd802ced4, + 0x991a0c4c, + 0xf189b1d4, + 0x8b41231e, + 0xb945f641, + 0x2602edd4, + 0x98d48945, + 0x01c914ea, + 0x9922f399, + 0x43ce0ad4, + 0x1ef1892a, + 0xc298d489, + 0xd4b92141, + 0x4cd802ce, + 0xd499120c, + 0x8b4123b1, + 0xb9455641, + 0xf602edd4, + 0x0701a64f, + 0x7e11270d, + 0x957efd44, + 0xfcf401f9, + 0x2020004d, + 0x45402701, + 0x75d4b954, + 0x814ff601, + 0x29d20900, + 0x8612eed1, + 0x83420700, + 0x994d0b43, + 0x3f4b0d43, + 0x20c8230b, + 0xee12daf1, + 0x42073207, + 0x42533383, + 0xd39dd44d, + 0x5ed20d08, + 0x74a9fee1, + 0xd3a90d3e, + 0x432b0120, + 0xc4ca4fab, + 0x27102724, + 0x217e160c, + 0x7e0d07f9, + 0x74a9fbc1, + 0xd3a90d3e, + 0x432b0120, + 0x4cc24fab, + 0x98d489e5, + 0xfef548e2, + 0xd489b92a, + 0xc6413c9a, + 0xf1b9eaa5, + 0x9d4227fe, + 0xe95e24f4, + 0x7e0d07fe, + 0xb9eafb91, + 0xee1efee0, + 0xad7ef0a1, + 0x29d209f6, + 0x7e21eed1, + 0x274027ff, + 0xffbea7c4, + 0xd49de7ff, + 0xf8e67e09, + 0xb4454027, + 0xdd7efcb0, + 0x1ad3a9f8, + 0x48d4a901, + 0x1734ce01, + 0x10270d07, + 0x27fc777e, + 0xa9f4e843, + 0xa9011ad3, + 0xce0148d4, + 0xd3b9eb43, + 0xd0890214, + 0x2cdcd198, + 0x20d2a901, + 0x44d1a901, + 0x2340a701, + 0xeedea934, + 0x5bc40501, + 0x0b2e0b03, + 0xced4b910, + 0x20d2ad02, + 0x44d1ad01, + 0x0c4c3801, + 0x02edd4b9, + 0xd4d14a36, + 0xd38902d8, + 0x0b410398, + 0xc341e343, + 0xd8d4d5f2, + 0xd1f58e02, + 0x0702e8d4, + 0x271f070d, + 0x8b302720, + 0xfed75ef4, + 0x10270d07, + 0x727e2127, + 0xc4d489fb, + 0xcecad289, + 0xd4a9ef42, + 0x48c602d4, + 0x89b6d389, + 0x34cabcd4, + 0x891a1e0c, + 0xd489b6d3, + 0x0e43c2bc, + 0x11270d07, + 0xa9f4797e, + 0x9602d4d4, + 0xcad28941, + 0xa7d8d3c1, + 0xd1341540, + 0x8902d8d4, + 0x410398d3, + 0x41e3430b, + 0xd28df2c3, + 0xd8d4d5c4, + 0x07f58e02, + 0xf4c27e0d, + 0x07fe335e, + 0x7e20270d, + 0x545efb11, + 0x9d4327fe, + 0xc55e24f4, + 0x000000fd, + 0x00000055, + 0x00000001, + 0x00000000, + 0x00020000, + 0x07f54e00, + 0x071d07d0, + 0x073d072d, + 0x03f7234d, + 0x0301500d, + 0x03017c1d, + 0x0302f02d, + 0x03018c3d, + 0xc502ac4d, + 0xf1c550f0, + 0x44f2c55c, + 0xc560f3c5, + 0xbea764f4, + 0xd1ffffff, + 0xe60a44b4, + 0xa709bc4f, + 0xfd5fffce, + 0x4ca3c411, + 0x93c41510, + 0x019063f1, + 0xfd330ea7, + 0x010401fe, + 0x2b121113, + 0x3c41e843, + 0xd220e80b, + 0x3342870a, + 0x07420b24, + 0x53c433c4, + 0x0bff7ffe, + 0x23e101c4, + 0xfef5f8ce, + 0xc55cf2c1, + 0x3c0740fc, + 0x30014107, + 0x20051123, + 0x24033403, + 0xfc93f498, + 0x0101901c, + 0x03c311c4, + 0x05310341, + 0x23c315c4, + 0x8331ec41, + 0x05fe930a, + 0xe4010190, + 0xfd330ea7, + 0xa90425fe, + 0xa9017ed1, + 0x270244d4, + 0xff2ea7c1, + 0xf1c5fdcf, + 0x642cc548, + 0x4123412b, + 0x017cd3b9, + 0x02d4d4ad, + 0xc11b31dc, + 0x6e7e50f0, + 0xbe0d07f6, + 0xa9fd9cf9, + 0xa9017ed3, + 0xc50188d4, + 0xd48d48f3, + 0xced4b912, + 0x0c4cf802, + 0xd8b908f3, + 0x8fe602ed, + 0xdba90939, + 0xd2a902d4, + 0xfbc50352, + 0x49deb94c, + 0xc5b10302, + 0xd3b930fe, + 0xfb6502d0, + 0xd4b9be3b, + 0xfb650248, + 0x02d1d0b9, + 0xfb65b37b, + 0xb934f0c5, + 0x330355d1, + 0x3bf235b4, + 0xb94433b1, + 0x7b0354d2, + 0x65037b43, + 0x4cf3c1fb, + 0x0350dba9, + 0x013bc13b, + 0xf0a5f3b5, + 0xfb25fc95, + 0x0216dcb9, + 0xc548fec1, + 0xfec538fc, + 0x314fab3c, + 0x4cd5d1f3, + 0x132ff603, + 0x1bfa910a, + 0xc1a153a5, + 0x02e030f0, + 0xb02709fb, + 0xf761fb75, + 0x742b413b, + 0x09dd2ff6, + 0x951bf991, + 0x40279153, + 0x7ff6f405, + 0xd48d08b7, + 0xeed78de8, + 0x8be8d489, + 0x124f8b3f, + 0xa9430743, + 0x8d0352db, + 0xbf8be8d4, + 0x07eed489, + 0x68fbc53b, + 0x31734f8b, + 0x43074312, + 0x89eed48d, + 0xde89e8dc, + 0x074c07ee, + 0x9b459b3e, + 0x0b012735, + 0x0b013b4a, + 0xc51027a3, + 0xfec554fc, + 0xe0d4c558, + 0xc5e4dac5, + 0xfd156cf0, + 0xf185cd07, + 0x2fe6f281, + 0xd8c10851, + 0x27f381e4, + 0x27349641, + 0x91f26140, + 0x7bf371fe, + 0x07347b24, + 0x2b6e07b2, + 0xa1621bb3, + 0x5bf281f3, + 0x6bbe2b34, + 0x2b632b2f, + 0xe6a807b3, + 0xc1081a2f, + 0xf08158f4, + 0xf4c17407, + 0x7b7fab68, + 0x2b102740, + 0x9d940747, + 0xc19df0c1, + 0xc29fabf2, + 0xd1d131b8, + 0x0b07034c, + 0xb2be082b, + 0x0f6bfdec, + 0x459b4007, + 0x0bf0c09d, + 0x074b4a48, + 0x9d412340, + 0xc499f0c4, + 0x6b4103f0, + 0x9ba4074f, + 0x9da80ba5, + 0x4907f0c4, + 0x8bf0c399, + 0x0743124f, + 0x2b4f6b43, + 0x9db90794, + 0xbfabf0c4, + 0x06ce6ae2, + 0x06cabfe6, + 0x034cd1d1, + 0x0a2b0607, + 0xfdec64be, + 0x40070f6b, + 0x4a0b459b, + 0x4af2c09d, + 0x23400746, + 0xf2c49d41, + 0x27f2c499, + 0x9d410310, + 0x4b07f2c4, + 0x8bf2c399, + 0x0743124f, + 0xf0c29943, + 0x720b4f6b, + 0xc49d740b, + 0x113707f2, + 0xc13fabf4, + 0x438d6cfb, + 0xd65beeea, + 0x54d4b907, + 0xce42e003, + 0x11f48107, + 0x034103fb, + 0x15f485b2, + 0xe4c103fb, + 0xd1fef342, + 0xa70348d4, + 0xfddfffee, + 0x022ce4d5, + 0x034cd3d1, + 0xd534fcc1, + 0xc10230e3, + 0xf1c1e0d2, + 0x3ce2d554, + 0xe4d3c102, + 0x1d83c253, + 0xe3d53fff, + 0xfcc50240, + 0x54f1c534, + 0xb130f0c1, + 0xd0d2b9f4, + 0x7b403b02, + 0x5b4433c2, + 0xc1c78342, + 0xcc3358f2, + 0xff4d8310, + 0x34fcc53f, + 0xab101c33, + 0xff2d83c4, + 0x34ecd51f, + 0x54f1c502, + 0xe1d512ab, + 0xd4990238, + 0xf1d299f2, + 0xc140fbc1, + 0x4c8338fc, + 0x1f2c833f, + 0x99f0de99, + 0xb389f3d0, + 0x33483396, + 0x1127102c, + 0x1027c486, + 0xec8342ab, + 0xab317b3f, + 0x1f0c834e, + 0xb289fe31, + 0x180c3394, + 0x3fff3d83, + 0x40abf121, + 0x3fff2d83, + 0xdfff0ea7, + 0x103c33fd, + 0x3fffed83, + 0x024404d5, + 0xec3332ab, + 0xff1d8310, + 0x2403d53f, + 0xb1fe3502, + 0xd5e1abf3, + 0xb902280e, + 0x270354d2, + 0x27348641, + 0x3cfbc140, + 0x83184c33, + 0x86312723, + 0xab3027b4, + 0x193c3342, + 0x04d543ab, + 0xd4b90220, + 0xf6c10249, + 0x4ad3b94c, + 0xf6643b02, + 0xb905333f, + 0xa90215d1, + 0x2701f0dc, + 0xf0e027a0, + 0x23051814, + 0x5b060714, + 0xa9140301, + 0x2701eed2, + 0x0b212341, + 0x88dea92e, + 0x27302701, + 0x09d49db0, + 0xf2774ea7, + 0x08db9dfe, + 0x550cd39d, + 0x4dd30dd4, + 0x8dd06dd3, + 0x228712de, + 0x0248dbb9, + 0x051414f0, + 0x4c0b4a07, + 0x34233107, + 0xd39d402b, + 0x02433b0b, + 0x5b4b074b, + 0x23340743, + 0x23430721, + 0x0b138741, + 0x2d132b23, + 0x0ad49dd2, + 0x04071103, + 0x069741e8, + 0x21232307, + 0x42a73d07, + 0x030d349d, + 0x0bf2b031, + 0xecd5b90d, + 0x0d019d02, + 0x04c35fe6, + 0x04bf61e8, + 0x71237607, + 0x01a4d4a9, + 0x40e84f8b, + 0xe0270514, + 0x02a8d4d1, + 0x4df8fe45, + 0x05120100, + 0x02d0d3b9, + 0x437b4707, + 0x21732407, + 0x34070207, + 0xe2070283, + 0x14073283, + 0x90878387, + 0x02073407, + 0x1183e183, + 0xee471147, + 0x34830483, + 0xdcd1810b, + 0x9e0b0318, + 0x03333333, + 0x0324d1d1, + 0x900b830b, + 0x47e327e3, + 0x219b4c9b, + 0x94338433, + 0x920b840b, + 0x0328d4d1, + 0x031cdad1, + 0xc153cb07, + 0xab9bc49b, + 0x034cf1c1, + 0xcc037fac, + 0x3cd0a97f, + 0x7face303, + 0xd17fcce3, + 0xd10314d4, + 0x9b0320d3, + 0x2ba19bc1, + 0x0ba40b06, + 0x070b12c3, + 0x48f2c10b, + 0x04302fe6, + 0xfa9af353, + 0x02d1d1b9, + 0x40273e01, + 0x045a6fe6, + 0xefe63027, + 0x6fe6015c, + 0xfb530154, + 0xb201fa84, + 0x17831253, + 0x13ab14ab, + 0xdfffeea7, + 0xd512abfd, + 0x2501d4e1, + 0xf6f041e0, + 0xb9013c0f, + 0xe601ecd4, + 0xd100914f, + 0xd802a8d4, + 0x5101004d, + 0x019cd4d1, + 0x02d0d0b9, + 0x0330dbd1, + 0x20c04cd8, + 0x21732707, + 0x05a820e8, + 0x0338d4d1, + 0xd3d12373, + 0x249b0334, + 0xdfff1ea7, + 0xd5c20bfd, + 0x2701f413, + 0x07103b18, + 0xe8f8be07, + 0xff2ea7fd, + 0x4427fddf, + 0x01d824d5, + 0x032cd3d1, + 0xab0bb09b, + 0x01bc23d5, + 0x41275626, + 0x40276486, + 0xdfff3ea7, + 0x9834d5fd, + 0xc6f44101, + 0x9cd4d146, + 0xc04c5801, + 0xdfffbea7, + 0xe4b9d5fd, + 0xe8bcd501, + 0xffcea701, + 0xcad5fddf, + 0xc8d5019c, + 0xdab901ac, + 0xac8302ce, + 0xa5afe60c, + 0xedd8b900, + 0x9d8fe602, + 0x9cd4d100, + 0xc0d3d102, + 0xc4dcd101, + 0x5a4ce001, + 0x4cf4049f, + 0xf603c35b, + 0x8903bd4f, + 0xd289e8d0, + 0xeede89ea, + 0xd1894007, + 0x9b422bec, + 0xa73e0743, + 0xfddfffbe, + 0xb4d5312b, + 0x3c9b0114, + 0x0118b3d5, + 0x1e2b202b, + 0x011cb3d5, + 0xa91921c8, + 0xa90340d3, + 0x2b033ed4, + 0x12402b30, + 0xe8320732, + 0xfa04f940, + 0x27036743, + 0xc80027c0, + 0xd3a91911, + 0xd4a90346, + 0x3e2b0344, + 0x31124e2b, + 0x40e83107, + 0x43fa0464, + 0x2027034f, + 0x291e4027, + 0xfeac5fe6, + 0xad5e2027, + 0xc0d4d1fe, + 0xd141fc01, + 0xff1e5efe, + 0x033edca9, + 0x0340d0a9, + 0x44334607, + 0xc42b042b, + 0x40272027, + 0xdfffeea7, + 0x50ecd5fd, + 0x58e0d501, + 0x44e2d501, + 0x48e4d501, + 0x2b6fe601, + 0xa7302702, + 0xfddfff0e, + 0x02c4d4a9, + 0x016403d5, + 0x048642e0, + 0x1ea77327, + 0xb9fddf23, + 0xc102edd8, + 0xf15544fb, + 0xb3615707, + 0xac06369b, + 0xd4d18bc6, + 0xdad1029c, + 0xd9d101c0, + 0xd38901c4, + 0xeed089e8, + 0x99ead189, + 0xd289f4de, + 0xf5dc99ec, + 0x615a4ce0, + 0x5b4cf403, + 0x4fe601c8, + 0xff1e02c5, + 0x3a9b4007, + 0x3013499b, + 0x73004013, + 0xb4313407, + 0x430bf251, + 0x06a824c5, + 0x0bb40185, + 0x23240543, + 0x78f5f871, + 0x7dd4b901, + 0x84d1a901, + 0x23340701, + 0x0f4c8341, + 0x01eed2a9, + 0x43333333, + 0x219be027, + 0xfef43e23, + 0xf44e23ff, + 0x0147fffe, + 0xdcb9b027, + 0xd7d501df, + 0xd3d502dc, + 0xd4d5012c, + 0xd08d0128, + 0x00d2d5fa, + 0x25debd01, + 0xe4dead01, + 0xf8d18d02, + 0x0124dbbd, + 0x0137cfe6, + 0xffff4ea7, + 0x4143b9fe, + 0x2a3fe601, + 0x7edea901, + 0xff4ea701, + 0x3e07dfff, + 0x0244d2a9, + 0x0114d4d5, + 0x0110d4d5, + 0x23ee3103, + 0xd4b9047a, + 0x4438017c, + 0xd4bd4127, + 0xd3b90125, + 0xd0890214, + 0x23402798, + 0xf8d28934, + 0x037bd169, + 0x0138d4d5, + 0xd5fcd4c5, + 0xd50108d4, + 0xd50104d4, + 0xd5010cd4, + 0x9b0130d4, + 0xa21fe602, + 0xe6400703, + 0xd503a2ef, + 0xd50134d4, + 0x07013cd0, + 0xf20b7e0d, + 0x02ced4b9, + 0xb90c4c38, + 0xf602edd4, + 0x07038b4f, + 0xf4cb7e0d, + 0x7e50f0c1, + 0x4127eee1, + 0x0175d4bd, + 0x0150d3d1, + 0x2760f4c1, + 0x4001122c, + 0x30054403, + 0xf2a83403, + 0x0188d2d1, + 0x017dd1b9, + 0x02a4d3d1, + 0x0187dbb9, + 0x02d4dca9, + 0x02d0deb9, + 0x0249d0b9, + 0x017ed4a9, + 0x0164d2d5, + 0x0177d1bd, + 0xf74ef253, + 0x0168d3d5, + 0x0176dbbd, + 0x0170dcad, + 0x0178debd, + 0x0179d0bd, + 0x44962119, + 0xd3b91127, + 0xd4890248, + 0x54d2d198, + 0x33439b01, + 0xecd3b944, + 0x6cd4d502, + 0x64f4c101, + 0x017ad3bd, + 0x0172d1bd, + 0x4b013827, + 0x2b054403, + 0xf3a82403, + 0xb9f7355e, + 0x5102ceda, + 0x03b403f4, + 0x0cac8344, + 0x1f5ef455, + 0x80d4d1fe, + 0x7edea901, + 0x14d4d501, + 0x10d4d501, + 0xfef05e01, + 0x3db44ce0, + 0x0e4de0fe, + 0x5e010101, + 0xd3a9fe32, + 0xd45e0342, + 0x2b4427fd, + 0x3b060741, + 0xfae95e04, + 0x0215d1b9, + 0x01f0dca9, + 0x4c071423, + 0xd389413b, + 0x0341239a, + 0x8d34e214, + 0x27a12701, + 0xfabd5ee1, + 0xf68ef253, + 0x5b5e2101, + 0x5e7607f9, + 0x4427fb44, + 0x412b3c07, + 0x0b07302b, + 0x3b0bd49d, + 0xf430e204, + 0x5e3007fa, + 0xd4b9faef, + 0xe12701ea, + 0x02d1d1b9, + 0x0212d3a9, + 0x44182027, + 0x327b2127, + 0x46072307, + 0x02d0d3b9, + 0x4433210b, + 0x34c6242b, + 0x23e32303, + 0x44334007, + 0x4633422b, + 0x03004d83, + 0xfbaa6ff6, + 0x31c33507, + 0x3c333183, + 0xfba05e10, + 0x01c0d4d1, + 0xfc45c127, + 0xfaf242fc, + 0x0318d8d1, + 0x0324d4d1, + 0x91739707, + 0x879b949b, + 0xa9fb2f5e, + 0xc502d4dc, + 0x0b5e4cfc, + 0xffeea7fa, + 0xe411fd5f, + 0x15104ce3, + 0xf6455ee4, + 0x0307c407, + 0x07fc9a5e, + 0x5e430724, + 0xff1efcdc, + 0x97b44ce0, + 0x0e4de001, + 0x1e00ce01, + 0x9b4007f2, + 0x5e499b3a, + 0x1e3bfd42, + 0x31272c3b, + 0x312b4127, + 0x335e422b, + 0xd4dea9fd, + 0x4cfec502, + 0xc1f9bd5e, + 0xe75e54f4, + 0xe0d8c1f7, + 0x07f7b05e, + 0x0760278f, + 0x96412715, + 0x07402764, + 0x91fca1b7, + 0x5bb45bfe, + 0x0bbe2bc4, + 0x030b07c9, + 0xc20c2b61, + 0x92be1bbc, + 0x0fabfde4, + 0x459b4007, + 0x4c0b800d, + 0x4b0a0123, + 0x8409800d, + 0x840d4103, + 0x62c48203, + 0xd4d1a9c3, + 0xa9f20902, + 0xc5017ed0, + 0xf0c54cf1, + 0xe8d28d48, + 0xd3a9f429, + 0xd1b90352, + 0xd48d0355, + 0xf6ee5eee, + 0x3e3b4007, + 0xaf5e4c3b, + 0x48fec1fc, + 0xf82feff6, + 0x8168f4c1, + 0xf2407bf0, + 0x07f82443, + 0x03f31143, + 0xea348d41, + 0x42071b26, + 0xc49d4103, + 0xf80f5ef0, + 0xe127a027, + 0x27f9325e, + 0xffcea740, + 0xd089fddf, + 0xeede89e8, + 0x89ead289, + 0xc4d5ecd1, + 0xc4d50114, + 0x202b0118, + 0xc4d51e2b, + 0x755e011c, + 0xf2c499fb, + 0xc49d4103, + 0xf7d75ef2, + 0x9b5e4027, + 0x5e0027fb, + 0x4203f977, + 0xc405432b, + 0x765ec115, + 0x50f0c1f5, + 0x27ec147e, + 0x0bf49b40, + 0x270ef49b, + 0x7e112705, + 0x2ea7ec70, + 0x93fefd33, + 0x01855ffb, + 0xb3012401, + 0x432bb211, + 0x20a7410c, + 0x5ee120c8, + 0x2703f501, + 0x00fa575e, + 0x27222021, + 0xf6245e90, + 0x91539507, + 0x07f61d5e, + 0x3bc153c4, + 0x5efc75c1, + 0x2100f602, + 0xa0272220, + 0x07f5ee5e, + 0x5ea153a5, + 0x4027f5e7, + 0xa7fb065e, + 0xf4c35e20, + 0x16070d07, + 0xfdab17be, + 0x02cedab9, + 0x5e0cac83, + 0xd089fb6c, + 0xead289e8, + 0x89eede89, + 0x202becd1, + 0xdfff4ea7, + 0x2b329bfd, + 0x1443d51e, + 0x9b410701, + 0xffbea74c, + 0xb4d5fddf, + 0xb4d50118, + 0xa95e011c, + 0xf64027fa, + 0x27fc62ef, + 0xfc5d5e00, + 0xfc9330a7, + 0x150184c8, + 0x7dd4b9c3, + 0xd4d2a901, + 0x23340702, + 0x0f4c8341, + 0x43333333, + 0xfef43e23, + 0xf44e23ff, + 0xd3c5fffe, + 0xd4d4c5d8, + 0xdcc524b6, + 0xccdea9d4, + 0xa6d08902, + 0x89bede8d, + 0x0103bed3, + 0x44272007, + 0xd49d239b, + 0x273387b0, + 0xc0d38d48, + 0x9dbcd28d, + 0x0303b1d4, + 0x8fbe1427, + 0xd389fde2, + 0xa74027c0, + 0xd17fff2e, + 0x8dbad08d, + 0xd48db4d3, + 0xd0d2c5dc, + 0x8dc4d48d, + 0xd48dc2d4, + 0xcad48dc8, + 0x8db6d48d, + 0xd38db8d4, + 0xc6d48db2, + 0x5eccd2c5, + 0x4127fbe7, + 0x0124d4bd, + 0x00fb815e, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00010020, + 0x00000000, + 0x00000000, + 0x00010020, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00045c0c, + 0x00045c0c, + 0x00045c0c, + 0x00045c0c, + 0x00045c0c, + 0x000182e2, + 0x000182e7, + 0x000182ef, + 0x000182f7, + 0x000182fd, + 0x00018304, + 0x0001830f, + 0x00018318, + 0x00018321, + 0x00018325, + 0x0001832b, + 0x00018335, + 0x0001833d, + 0x0001834b, + 0x00018358, + 0x0001835f, + 0x0001836b, + 0x00018375, + 0x00018380, + 0x000182e2, + 0x0001838b, + 0x00018393, + 0x0001839b, + 0x000183bf, + 0x0001839f, + 0x000182ef, + 0x000183a8, + 0x000183b2, + 0x000183bc, + 0x000183c6, + 0x000183d0, + 0x000183d8, + 0x000183e1, + 0x000183e7, + 0x000183ee, + 0x000183f4, + 0x000183ff, + 0x00018409, + 0x000182e2, + 0x0001838b, + 0x0001840f, + 0x00018413, + 0x00018417, + 0x00018385, + 0x000183bf, + 0x00018422, + 0x000182e2, + 0x0001838b, + 0x00018430, + 0x00018439, + 0x00018442, + 0x00018446, + 0x0001844d, + 0x00018455, + 0x0001845d, + 0x00018466, + 0x00018470, + 0x0001847b, + 0x000183bf, + 0x00018485, + 0x0001848f, + 0x00018499, + 0x000184a2, + 0x000184ac, + 0x000184b3, + 0x000184bd, + 0x00018422, + 0x000184ca, + 0x000184d7, + 0x000184da, + 0x000184e4, + 0x000182e2, + 0x0001838b, + 0x000184ec, + 0x000184f4, + 0x000183bf, + 0x00018422, + 0x00018385, + 0x00018460, + 0x00018502, + 0x000184fc, + 0x0001850c, + 0x0001851c, + 0x00018525, + 0x0001852d, + 0x00018535, + 0x0001853e, + 0x00018549, + 0x00018556, + 0x00018563, + 0x000182e2, + 0x0001838b, + 0x0001856a, + 0x00018575, + 0x0001857d, + 0x000183bf, + 0x00018422, + 0x00018581, + 0x00018589, + 0x00018594, + 0x00018385, + 0x0001859d, + 0x000185a9, + 0x000185b4, + 0x000185be, + 0x000185c9, + 0x000185d0, + 0x000185de, + 0x000185ed, + 0x000182e2, + 0x000185f2, + 0x000184da, + 0x000185f7, + 0x000185fb, + 0x00018603, + 0x0001860b, + 0x00018615, + 0x000183b8, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, +}; +const int fw_hevcdec_size = 219392; diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/fw_hevcenc.c b/src/little/linux/drivers/media/platform/canaan-vpu/fw_hevcenc.c new file mode 100755 index 000000000..fd020c3fc --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/fw_hevcenc.c @@ -0,0 +1,88419 @@ +const unsigned int fw_hevcenc[] __attribute__((aligned(0x1000))) = { + 0x0000eb5e, + 0x02020305, + 0x33363635, + 0x32303137, + 0x36322e48, + 0x504d2035, + 0x636e4520, + 0x7265646f, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x43564548, + 0x20434e45, + 0x33346332, + 0x31643430, + 0x30703172, + 0x6530302d, + 0x00306361, + 0x00000000, + 0x00056580, + 0x00058000, + 0x00000014, + 0x000fc0ff, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00066000, + 0x0000557c, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x01a70d27, + 0x6ea7f07b, + 0x53fdcfff, + 0xa50207f0, + 0x25012760, + 0x25002760, + 0x0ef09b60, + 0x4fff6ea7, + 0x036101fd, + 0xa3143311, + 0x3861c510, + 0xce3860c1, + 0x1ea7f810, + 0x27ffffff, + 0x07142131, + 0x24169924, + 0x96806c40, + 0x806c2765, + 0x2724169d, + 0x03302761, + 0x27620e21, + 0x0b510720, + 0x66501952, + 0xf042ce0b, + 0x33273826, + 0x270d139d, + 0x6a13bd31, + 0x9b002706, + 0x10990ef0, + 0xff6ea70f, + 0x0233fd4f, + 0x63c5600b, + 0x9b302740, + 0x6ea70ef3, + 0xc5fd4fff, + 0x0d273863, + 0xf0e81000, + 0x1225871e, + 0x501d0127, + 0x070c1399, + 0x9d310353, + 0x32070c13, + 0x9b182c33, + 0x21a304f2, + 0xffff0ea7, + 0x270205fe, + 0x0ef29b20, + 0x059d0315, + 0x000d2708, + 0x4df19302, + 0x2d270583, + 0xf09b0400, + 0x93f10706, + 0x0578bff1, + 0x0b361001, + 0x10050127, + 0x7032f093, + 0x2df39305, + 0x03c2056e, + 0x0331011e, + 0x30ca803c, + 0x1df393f9, + 0xf293056e, + 0x01056198, + 0x05240321, + 0xca340331, + 0x58bef630, + 0x00270002, + 0xbe0bf09b, + 0x27000280, + 0x9b102701, + 0xff8b06f0, + 0x0000fd1e, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x01a70d27, + 0x6ea7f07b, + 0x93feffff, + 0x000213f1, + 0x937f1ce3, + 0x00020bf2, + 0x05b66001, + 0x9bfa21d2, + 0x1c030ff1, + 0xe3f21e80, + 0x04f09b01, + 0x02000d27, + 0xa24ef193, + 0x012d2705, + 0x06f09b20, + 0x12bef107, + 0xff8b00f7, + 0x0000fd1e, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x01a70d27, + 0x6ea7f07b, + 0x93feffff, + 0x000193f1, + 0x937f1ce3, + 0x00068ff2, + 0x05b66001, + 0x9bfa21d2, + 0x1c030ff1, + 0xe3f21e80, + 0x04f09b01, + 0x02000d27, + 0xbacef193, + 0x022d2705, + 0x06f09b20, + 0x61bef107, + 0xff8b0001, + 0x0000fd1e, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x01a70d27, + 0x6ea7f07b, + 0x93feffff, + 0x000617f1, + 0x937f1ce3, + 0x0009cdf2, + 0x05b66001, + 0x9bfa21d2, + 0x1c030ff1, + 0xe3f21e80, + 0x04f09b01, + 0x02000d27, + 0xd54ef193, + 0x032d2705, + 0x06f09b20, + 0xe5bef107, + 0xff8b0005, + 0x0000fd1e, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x01a70d27, + 0x6ea7f07b, + 0x93feffff, + 0x000955f1, + 0x937f1ce3, + 0x000a29f2, + 0x05b66001, + 0x9bfa21d2, + 0x1c030ff1, + 0xe3f21e80, + 0x04f09b01, + 0x02000d27, + 0xe14ef193, + 0x042d2705, + 0x06f09b20, + 0x23bef107, + 0xff8b0009, + 0xf09bfd1e, + 0x07fe0b06, + 0x4efe0b0f, + 0x25fd93f5, + 0xd0010000, + 0xf08b0506, + 0xf71ed403, + 0xf54ef58e, + 0x0016fd93, + 0x06d00100, + 0x03f08b05, + 0x8ef71ed4, + 0x000000f5, + 0x00000000, + 0x00000000, + 0xf3abfe4e, + 0x7e36f493, + 0xbef41b01, + 0x93009fdc, + 0x0572a7f0, + 0x90be1027, + 0xfe0e00e3, + 0x00f5069e, + 0xf493fd4e, + 0x1b0182ac, + 0xff3ea7f4, + 0x4e27fd7f, + 0x25382a02, + 0xab341534, + 0xeb0127f2, + 0xff2ea7f0, + 0x4f27ebff, + 0xa0050078, + 0x3e272405, + 0x15c00000, + 0xa74d2723, + 0x5c24c580, + 0xffffeea7, + 0x0c4f27e7, + 0x05900000, + 0xa71027e4, + 0xfefddb4e, + 0xf3934125, + 0x1505b910, + 0x50e0c531, + 0x41154105, + 0xb90afd93, + 0xd5310505, + 0xd50230d1, + 0x9b0234d1, + 0x3ea70ef1, + 0x93fdcfff, + 0xfffe6bf4, + 0x303534b5, + 0xf4933135, + 0xc5fffee0, + 0x30453034, + 0x2ea73145, + 0x27fddfff, + 0x5024c547, + 0x275421c5, + 0xc520004d, + 0x3d275824, + 0x23c53000, + 0x004d275c, + 0x6024c532, + 0x52003d27, + 0x276423c5, + 0xc562004d, + 0x3ea76824, + 0x27f3ffff, + 0x5434c548, + 0xa75431c5, + 0xefffff4e, + 0x30274015, + 0xffff4ea7, + 0xd443adfe, + 0x872ea71c, + 0x2105fdeb, + 0x00004f27, + 0x24150c83, + 0xfdcf3ea7, + 0xef4ea7fe, + 0xd3d5fef5, + 0xd44501d0, + 0xa70ef19b, + 0xfdefff3e, + 0x34d54327, + 0x03070238, + 0xdc3804c1, + 0x1427fb48, + 0x023801d5, + 0x023c01d5, + 0x02d52027, + 0x3ea706c0, + 0x05fdebc7, + 0x004f2732, + 0x150b8300, + 0x0ef29b34, + 0xe70f3ea7, + 0x304c27fd, + 0x32153405, + 0x00004f27, + 0x3435a000, + 0x024001d5, + 0x06c402d5, + 0x04d54327, + 0x1ea70244, + 0xc1fdefff, + 0x48dc4414, + 0xd54427fb, + 0xa7024414, + 0xfdebbf2e, + 0x23053027, + 0x00004f27, + 0x24150c03, + 0xa70ef39b, + 0xfde6ff2e, + 0x05314c27, + 0x27231524, + 0x0000004f, + 0x272435a0, + 0x6813d533, + 0xff1ea702, + 0x14c1fdef, + 0xfb48dc68, + 0x14d54427, + 0x14d50268, + 0x3027026c, + 0x06d013d5, + 0xeb972ea7, + 0x272305fd, + 0x0400004f, + 0x9b241501, + 0x43270ef3, + 0x024814d5, + 0xefff0ea7, + 0x4804c1fd, + 0x27fb48dc, + 0x4801d514, + 0x4c01d502, + 0xd5202702, + 0xa7065402, + 0xfdebb73e, + 0x4f273205, + 0x0e420000, + 0xf29b3415, + 0xcf3ea70e, + 0x4c27fde6, + 0x15340515, + 0x004f2732, + 0x35a00000, + 0x5001d534, + 0x5002d502, + 0xd5432706, + 0xa7025404, + 0xfdefff1e, + 0xdc5414c1, + 0x4427fb48, + 0x025414d5, + 0xebaf2ea7, + 0x053027fd, + 0x004f2723, + 0x150e8200, + 0x0ef39b24, + 0xe6bf2ea7, + 0x144c27fd, + 0x23152405, + 0x00004f27, + 0x2435a000, + 0x13d53327, + 0x0ea70258, + 0xc1fdefff, + 0x48dc5804, + 0xd51427fb, + 0xd5025801, + 0x27025c01, + 0xcc02d520, + 0xa73ea706, + 0x3205fdeb, + 0x00004f27, + 0x34150ec2, + 0xa70ef29b, + 0xfde68f3e, + 0x05334c27, + 0x27321534, + 0x0000004f, + 0xd53435a0, + 0xd5026001, + 0x2706c802, + 0x6404d543, + 0xff1ea702, + 0x14c1fdef, + 0xfb48dc64, + 0x14d54427, + 0x2ea70264, + 0x27fdeb9f, + 0x27230530, + 0x0200004f, + 0x9b24150f, + 0x2ea70ef3, + 0x27fde67f, + 0x2405324c, + 0x4f272315, + 0xa0000000, + 0x33272435, + 0x02d013d5, + 0xefff1ea7, + 0xd014c1fd, + 0x27fb48dc, + 0xd014d544, + 0xd414d502, + 0xd5302702, + 0xa7069413, + 0xfdeb2f2e, + 0x4f272305, + 0x10c20000, + 0xf39b2415, + 0xaf2ea70e, + 0x4c27fde4, + 0x15240525, + 0x004f2723, + 0x35a00000, + 0xd5332724, + 0xa702d813, + 0xfdefff2e, + 0xdcd824c1, + 0x4427fb48, + 0x02d824d5, + 0x02dc24d5, + 0x23d53027, + 0x2ea70698, + 0x05fdeb27, + 0x004f2723, + 0x15110200, + 0x0ef39b24, + 0xe48f2ea7, + 0x264c27fd, + 0x23152405, + 0x55fef193, + 0x004f2703, + 0xe3a00000, + 0x0ea77f1c, + 0x35feffff, + 0x4804d124, + 0xc0362701, + 0x1ff41843, + 0x0003836c, + 0xf19b00b4, + 0x4804d10f, + 0x801c0301, + 0x43c43627, + 0xff3ea7ea, + 0x34c1fd4f, + 0x9e40e874, + 0x874ea700, + 0x2027fef6, + 0xffffeea7, + 0x48e0d1fe, + 0x09429d01, + 0x0142e2ad, + 0xd4d510a7, + 0x302701d4, + 0x4504439d, + 0x05429d41, + 0x429d4135, + 0x9d426d0a, + 0x03c00842, + 0x272e070e, + 0xd1f4e846, + 0xc4014823, + 0x4ea7f633, + 0x93ffffff, + 0x05b6b7f3, + 0x065842d1, + 0x1c031307, + 0x874ea797, + 0x4205fef6, + 0xe37f1ce3, + 0x34197f3c, + 0xc2803c03, + 0x2c27f931, + 0x91f39326, + 0x102705b6, + 0x31054207, + 0x34032123, + 0x4ea7f4b8, + 0x93fee2f3, + 0x05b543f0, + 0xd5bcd2c5, + 0xc5014cd4, + 0x3dbec0d2, + 0xff1e0368, + 0x3a5ef3e8, + 0x7434c1ff, + 0x00004ef8, + 0xa7ff5c01, + 0xebffff2e, + 0xffff1e27, + 0x0021d5ff, + 0xb84e2701, + 0x24d5c8c0, + 0x3e270104, + 0xd5a8a098, + 0x27010823, + 0xfffff34e, + 0x010c24d5, + 0xa49c3e27, + 0x1023d5af, + 0x8e4e2701, + 0x24d59a94, + 0x21d50114, + 0x4e270118, + 0xd5c0a49c, + 0x27011c24, + 0x8c847c3e, + 0x012023d5, + 0xf5f04e27, + 0x2424d5fa, + 0x843e2701, + 0x23d5a08c, + 0x4e270128, + 0xd57e7872, + 0x27012c24, + 0x03060c3e, + 0x013023d5, + 0x08101e27, + 0x3421d504, + 0x3821d501, + 0x184e2701, + 0x24d5060c, + 0x3e27013c, + 0xd5081020, + 0xd5014023, + 0x27014423, + 0x1e0e064e, + 0x014824d5, + 0x014c24d5, + 0x015024d5, + 0x06023e27, + 0x5423d50e, + 0x5823d501, + 0x5c23d501, + 0xfe9f5e01, + 0xf393f54e, + 0x9305cd58, + 0x05d1eef2, + 0x3ce3f1a3, + 0x7f2ce37f, + 0x3c033419, + 0xf932c280, + 0x7e02f493, + 0xa7f41b01, + 0xfd6fff3e, + 0x60024d27, + 0x34153425, + 0x4127f2ab, + 0xf193f4eb, + 0x2705cf94, + 0xa7e10740, + 0xebffff3e, + 0xf2933435, + 0x9305cf14, + 0x05d103f6, + 0xcf72f093, + 0xdfec0305, + 0x04152415, + 0x64c52405, + 0x9464c590, + 0xece30405, + 0x7f1ce37f, + 0x1c031419, + 0xf91ec280, + 0xcf56f393, + 0x27202705, + 0x3205384c, + 0xf4c83403, + 0xd026fb93, + 0x033b0705, + 0x2b079fbc, + 0xe37f3ce3, + 0xbc237f2c, + 0x0334199f, + 0x32c2803c, + 0x28dc27f9, + 0xd006f393, + 0x07202705, + 0x2332054d, + 0xb83403d1, + 0x95fe93f4, + 0xc12705d0, + 0xf093ec1d, + 0x2705cff8, + 0x2a27131c, + 0x08003d27, + 0xbd054a27, + 0x010372be, + 0xd02af093, + 0x121c2705, + 0x272c2c27, + 0x2740003d, + 0x035dbe48, + 0x3beea701, + 0xbec5ffe9, + 0xf5f0934c, + 0x1c2705d0, + 0x3c2c271e, + 0x1c003d27, + 0xbdc54a27, + 0x033dbe94, + 0xe1f09301, + 0x1c2705d0, + 0x3d2c271f, + 0x20003d27, + 0x28be4a27, + 0xf0930103, + 0x2705d0d0, + 0x2c27201c, + 0x003d273e, + 0xbe4a2724, + 0x93010313, + 0x05d0bff0, + 0x27211c27, + 0x3d273f2c, + 0x4a272800, + 0x0102febe, + 0xeb5f3ea7, + 0x273d05fd, + 0x0400004f, + 0xc5341503, + 0x6dc5786d, + 0x8c6dc57c, + 0x6d456d75, + 0x6d656d55, + 0xf19b1027, + 0x0538030e, + 0x004f273d, + 0x15040400, + 0x0ef19b34, + 0xe56f2ea7, + 0x1f4c27fd, + 0x2d152405, + 0x00000f27, + 0x2035a000, + 0xe55f3ea7, + 0x054103fd, + 0xa73d1534, + 0xfdeb4f2e, + 0x2d053035, + 0x00004f27, + 0x24151042, + 0x270ef19b, + 0xff4ea720, + 0x42adfeff, + 0x3ea71cd6, + 0x19fee3ff, + 0x7f4ea732, + 0x4219fee3, + 0xe3cf3ea7, + 0x274027fe, + 0x649d260c, + 0x8063c566, + 0x40072027, + 0x01233205, + 0xf4b83403, + 0xffff3ea7, + 0xad2027fe, + 0x271cde32, + 0x1434bd40, + 0xd832ad02, + 0xcf4ea71c, + 0x1ea7fee3, + 0x55fee2e7, + 0x2c30d541, + 0x2b4ea71c, + 0x32adfefa, + 0x2ea71cda, + 0xc5ffffff, + 0x24d18464, + 0x4fe60e5c, + 0x3ea70156, + 0x11fd6fff, + 0x104ca334, + 0xf0933415, + 0xbe05cf20, + 0xc10488ce, + 0x6ec18460, + 0x39019980, + 0x40272027, + 0x6dc13127, + 0x09e39d88, + 0x9d08e49d, + 0xe20d0ce2, + 0x1613e24d, + 0x02bc02a9, + 0xed6dd13b, + 0xa712e28d, + 0xfee2e73e, + 0x0489e355, + 0x39039912, + 0x14874123, + 0x036302b9, + 0x012834f0, + 0x23140489, + 0x9d4d2b34, + 0x433b0be3, + 0x42074202, + 0x3407435b, + 0x21232107, + 0x41234307, + 0x230b0387, + 0xe22d032b, + 0x030ae49d, + 0xe8140701, + 0x07011041, + 0x07212323, + 0x9d42a73e, + 0x31030d34, + 0x1e0bf2b0, + 0xc10d109d, + 0x62298463, + 0x41233439, + 0x070f4c83, + 0x33353334, + 0x23430b43, + 0xfffef44e, + 0xea7864c5, + 0x9300acd2, + 0x05ce6ff0, + 0x04b1e8be, + 0x67995127, + 0x5061c166, + 0xc13869c1, + 0x6ec15c64, + 0x0bd70744, + 0x4c60c119, + 0xc13468c1, + 0x6ac15462, + 0x5863c13c, + 0x87406bc1, + 0x0bd533c7, + 0x15dc2b4e, + 0x486199f1, + 0x3b0b2a0b, + 0xf445080b, + 0xf3354d07, + 0xf005f225, + 0x2314f19d, + 0xfee93c4e, + 0x36272f07, + 0x24032101, + 0x44034105, + 0x6299f3a8, + 0xff1ea70b, + 0xd2fdfeff, + 0xff0116dc, + 0x16ddd5fd, + 0x4707ff01, + 0x021413b9, + 0x43834103, + 0x0366649d, + 0x1413bd31, + 0xff2ea702, + 0x24d1ffff, + 0x4ff60e5c, + 0x1ea7feae, + 0x11fd6fff, + 0x104ce314, + 0xab5e1415, + 0x7156befe, + 0x931d0704, + 0x05cdc3f0, + 0x048013be, + 0x0da34007, + 0x44ccfa00, + 0x5e5027e9, + 0x4427ff4a, + 0xe49d432b, + 0x1403890b, + 0x3d2b243b, + 0xfede32e2, + 0xd95e3207, + 0x5e1027fe, + 0xfd4efefe, + 0xf493f4a3, + 0x1b017b74, + 0xff3ea7f4, + 0x4d27fd5f, + 0xfd938202, + 0x2505d810, + 0x032d0734, + 0x341597dc, + 0x2ce33d07, + 0x7f3ce37f, + 0x1997dc23, + 0x802c0324, + 0x27f923c2, + 0xf39326ec, + 0x2705d7ec, + 0x054e0720, + 0x03e12332, + 0xa7f4b834, + 0xfdeb372e, + 0x4f272e05, + 0x10820000, + 0xf1932415, + 0xa705d7c4, + 0xfee2db3e, + 0x1e15d355, + 0x40271e05, + 0xab0ef49b, + 0xeb2127f3, + 0xff4ea7f2, + 0x4ec5fddf, + 0xc84ec5c4, + 0x20003d27, + 0xd5cc43c5, + 0xa7015c42, + 0xfeffff3e, + 0x1cd03ed5, + 0xffff4ea7, + 0x274e35e7, + 0xe0d4bd40, + 0x07302704, + 0x81f0934f, + 0xd38d05d7, + 0x00deadd2, + 0x08d4d501, + 0xd8ded501, + 0xdcded504, + 0x3cded504, + 0xd4de8d05, + 0x8dd6de8d, + 0xde8dd8de, + 0xf8de8dda, + 0x8dfade8d, + 0x11befcde, + 0xf4830536, + 0x0000fd8e, + 0x8226f493, + 0xc0400105, + 0x02084a0f, + 0x41270f00, + 0x0a230f00, + 0x40270002, + 0xfe0b0407, + 0xfe0b0127, + 0xd007fb4e, + 0x08c6db3e, + 0xe3172ea7, + 0x082499fe, + 0x93524dce, + 0x0649bff1, + 0x4fff4ea7, + 0x9d4311fd, + 0x1199082d, + 0x9d230544, + 0xfb8e0921, + 0x81e2f493, + 0x29406905, + 0x0beea742, + 0x4309fee3, + 0x0b08e199, + 0x21032b02, + 0xce4b494c, + 0x4ea72b1d, + 0x11fd4fff, + 0x0b3ea742, + 0x3205fee3, + 0x9d083d9d, + 0x304d093c, + 0xfb8e3b6d, + 0x496ef193, + 0x09239906, + 0xce4414c1, + 0xfb8ea743, + 0xce09e499, + 0xe449d1c4, + 0x69cc40ce, + 0xc7b4cee4, + 0x3ea7dd1e, + 0x99feffff, + 0x1ea70934, + 0x83ffffff, + 0x87410343, + 0x5012d134, + 0x2b443306, + 0x4843f143, + 0x56ff0000, + 0x5c14d12a, + 0xc2012706, + 0xf1ab2834, + 0x23873127, + 0x31c038a6, + 0x3034f921, + 0x03ff011d, + 0xf1478631, + 0x02300024, + 0x1244d8ff, + 0x83e435d0, + 0x0bf1eb01, + 0x1e0027fe, + 0x1e3103d6, + 0xeb0027d6, + 0x4efe0bf1, + 0x35f093fa, + 0x1cbe0148, + 0xf0930113, + 0xbe014835, + 0xa7011313, + 0xfff9f34e, + 0xf0934249, + 0x0701484a, + 0x0cac33a2, + 0x070c1c27, + 0x12f9be3a, + 0xedbea701, + 0xdc27fff9, + 0x07b2090d, + 0x3bc2071d, + 0x27f093cd, + 0x3c070148, + 0xdcbeb203, + 0xac0b0112, + 0xbfc4d103, + 0xff000630, + 0xf3cea7e1, + 0xc189fff9, + 0x2cf09332, + 0xc0be0148, + 0xc1a10112, + 0x2107c3b1, + 0xf0934a07, + 0x2b014833, + 0x9efa0e2a, + 0x4e0112ab, + 0x1c88befe, + 0xff3ea701, + 0x3411feff, + 0x4850f093, + 0xf1448701, + 0x00156841, + 0x128dbeff, + 0x5efe0e01, + 0xfe4eff63, + 0xebef2ea7, + 0x053027fd, + 0x004e2723, + 0x24150400, + 0xf39be107, + 0xff3ea70e, + 0x3411fdef, + 0x33240c03, + 0x4c53184c, + 0x24ec031d, + 0x071244c4, + 0xe8432723, + 0x332311f4, + 0x3c53183c, + 0xf234c01d, + 0xe7ff3ea7, + 0x273005fd, + 0x150cd81d, + 0x35202731, + 0xef4ea732, + 0x4e05fde7, + 0x3ea74115, + 0x35fdefff, + 0x33345142, + 0x4c53184c, + 0x1244c41d, + 0x43272307, + 0x2351f4e8, + 0x53183c33, + 0x34c01d3c, + 0xbf4ea7f2, + 0x0d03fde7, + 0x40050cd8, + 0x0cd82d27, + 0x30274215, + 0xe20b4335, + 0xe7af4ea7, + 0x154e05fd, + 0x8e433542, + 0xa1f493fe, + 0x40010647, + 0xffff1ea7, + 0xff545eff, + 0xdea7fc4e, + 0x27ffffff, + 0xd1102702, + 0xbe0650dc, + 0xb9018d70, + 0x270e58d4, + 0x27c48631, + 0x8b415330, + 0x8b41c330, + 0x2744c643, + 0xa7fc8e01, + 0xfd4fff4e, + 0x00274201, + 0xf49b4027, + 0x9911270e, + 0x123b0ed3, + 0x3ea713cb, + 0x38fd4fbf, + 0x05412711, + 0x03115334, + 0x8e12d634, + 0x31f193fc, + 0x13010691, + 0x937f0c03, + 0x069123f4, + 0x0b7f0ce3, + 0x05420103, + 0x0b030710, + 0x4efe0b02, + 0xff3ea7fe, + 0x4027ffff, + 0xbd0d3299, + 0x10066a34, + 0x87202724, + 0xa041f142, + 0x27000192, + 0x14839e01, + 0xa7fd4e01, + 0xfd4fff3e, + 0x07683dc1, + 0x0f4de34d, + 0x004fc4f0, + 0x67566301, + 0xf87434c1, + 0x0100004e, + 0x34c1008c, + 0xc1483c70, + 0x4f5c7434, + 0x08000000, + 0xf1930427, + 0x9e0147ab, + 0xa7011449, + 0xd07fff2e, + 0x24a121a1, + 0x830c4c53, + 0x4cc00f4c, + 0x24a10f0f, + 0x285322a1, + 0xd40f2c83, + 0xfd8e0923, + 0x23a124a1, + 0x1d83fd8e, + 0xf0930fff, + 0x27014796, + 0xbe422732, + 0x270110d3, + 0xc0f19304, + 0x069e0147, + 0xf0930114, + 0xbe014694, + 0x930110bf, + 0x0146b6f0, + 0x71021f27, + 0xb0be5663, + 0x1d070110, + 0x46cbf093, + 0x10a5be01, + 0x93042701, + 0x0146e6f1, + 0x0113d89e, + 0xf1930427, + 0x9e01470c, + 0x4e0113cd, + 0x93f523fa, + 0x0147bbf0, + 0x011082be, + 0x47cbf093, + 0x1079be01, + 0xc2fb9301, + 0xdea70647, + 0x27fffc72, + 0x030d1ea0, + 0x10bc03a1, + 0xc014dc03, + 0x076210ac, + 0x01e123ed, + 0x00ced8ec, + 0x59e90300, + 0x23b319b0, + 0x03b419b1, + 0x08b299b1, + 0x0509b199, + 0x01f115f2, + 0x53be39e2, + 0x2183122c, + 0xd119f225, + 0x3510cc53, + 0x07d2c1f1, + 0x0e3bf055, + 0xf065f245, + 0x070bdec1, + 0x831a072c, + 0xabf09323, + 0xc0270147, + 0xfe75a103, + 0xbc03fc85, + 0x1005be10, + 0x14dc0301, + 0xa010acc4, + 0x47c8f093, + 0x0ff5be01, + 0xffcea701, + 0xc1b9ffff, + 0xc2c10100, + 0xc7f093fc, + 0xe0be0147, + 0xf093010f, + 0xbe0147d4, + 0xc1010fd7, + 0xcab9fcc1, + 0xa10b0100, + 0x00caa1e2, + 0xa95ed107, + 0x7c21f900, + 0xe6ff0000, + 0x07009a1f, + 0x2b453343, + 0x87432b42, + 0xf9e40be4, + 0x00007f23, + 0xf9e333ff, + 0x00008322, + 0x64ef03ff, + 0x99000678, + 0xf21507e4, + 0xe399f305, + 0x25210705, + 0x38e3c1f3, + 0xe199f335, + 0x45300790, + 0x91e099f1, + 0xf0551d07, + 0x9392ec99, + 0x0147a9f0, + 0xeb99fc65, + 0x99fb7593, + 0xfc8594ec, + 0x9595eb99, + 0x96ec99fb, + 0xeb99fca5, + 0x99fbb597, + 0xfcc598ec, + 0x99eb9930, + 0x9934fbc5, + 0xfcc59aec, + 0x9beb9938, + 0x993cfbc5, + 0xfcc59cec, + 0x9deb9940, + 0x9944fbc5, + 0xfcc59eec, + 0x9feb9948, + 0xbe4cfbc5, + 0x03010f23, + 0x1dadced1, + 0x3c833d07, + 0x3323070f, + 0x7e20f923, + 0xe6ff0000, + 0xf9ff480f, + 0x00007c21, + 0xff495eff, + 0xfa8ef503, + 0xfc93fc4e, + 0xc1068eac, + 0xc1c160ce, + 0x58c2c154, + 0x8964c389, + 0xf06366c4, + 0xf093fe05, + 0xbe014783, + 0x93010edb, + 0x0147c5f0, + 0x010ed2be, + 0xc311c219, + 0x47d8f093, + 0xbe102701, + 0x03010ec3, + 0xd1270ccc, + 0xc311c219, + 0xf0931d07, + 0x030147c2, + 0x0eadbed1, + 0x0ccc0301, + 0x93ead7c4, + 0x0147c4f0, + 0xfc0ef043, + 0x010e9a9e, + 0xf093fe4e, + 0xbe0147d4, + 0xbe010e8f, + 0x7e011a9f, + 0xf87efbdf, + 0x1efe0efd, + 0x99fb4e84, + 0xd1271004, + 0x03c14153, + 0x07b10738, + 0xabd43bc2, + 0x6bbf6bd3, + 0x271027cf, + 0x4127112c, + 0x4d8b413b, + 0x4d861103, + 0x07900499, + 0x03e433e4, + 0x066834ef, + 0xff4cc000, + 0x84e3b915, + 0x85e4b901, + 0x2b3b2b01, + 0x85e4bd4c, + 0x84e3bd01, + 0x91049901, + 0xe433e407, + 0x6834ef03, + 0x4cc00006, + 0xe3b915ff, + 0xe4b90184, + 0x3b2b0185, + 0xe4bd4c2b, + 0xe3bd0185, + 0x02030184, + 0x8ea8f2f0, + 0x07fc4efb, + 0x0fdc83d0, + 0x0ea7cd07, + 0x33ffffdf, + 0x12a3bec3, + 0x7cc3f901, + 0xdcff0000, + 0x0725103c, + 0x2b05330d, + 0x870d2b0c, + 0xa3040b40, + 0x0333103c, + 0x007cc3fd, + 0x0f03ff00, + 0x00067864, + 0x20271127, + 0xa7ff487e, + 0xffffdf0e, + 0x011249be, + 0xffff4ea7, + 0x0e4199ff, + 0xf99d0ea7, + 0x9efc0eff, + 0x930115dc, + 0x068df3f4, + 0x0b544089, + 0xedf493fe, + 0x40590642, + 0xfb4efe0b, + 0xd007c107, + 0xf463b207, + 0x10270227, + 0x2dbebf6b, + 0xc5d60189, + 0x4b8b4007, + 0x01164ff6, + 0xfb8ef443, + 0x93fac2c4, + 0x063c03f1, + 0xf3932107, + 0x0301e346, + 0x9305931d, + 0x06431ff4, + 0x31074305, + 0xe37f2ce3, + 0x1d237f3c, + 0x24190593, + 0xc2802c03, + 0xf393f923, + 0x27063bd8, + 0x654d2720, + 0x03320501, + 0x27f4c834, + 0x604d2731, + 0x5b13bd02, + 0x88148d01, + 0x014d13bd, + 0x014e13bd, + 0x3f072027, + 0x05114c27, + 0xc8340332, + 0x273227f4, + 0x29f49d45, + 0x9d05f39d, + 0xf39d07f3, + 0x1df29306, + 0x3f07063d, + 0x01114c27, + 0x05340330, + 0xa8240320, + 0xc44d27f4, + 0x603c2701, + 0x03b814d5, + 0x035813d5, + 0xf39320a7, + 0x27063f30, + 0x03320548, + 0x93f4c834, + 0x063f43f3, + 0x482720a7, + 0x34033205, + 0xfc93f4c8, + 0x93064288, + 0x00bdf2f4, + 0x3bd2f393, + 0x07140506, + 0xc5b1270c, + 0x86be50c3, + 0xcb9d01e1, + 0xe166be05, + 0x9d402701, + 0xc49d0dcb, + 0x1d422704, + 0xff3ea7d4, + 0x3201fd4f, + 0xf49b4027, + 0xff3ea70e, + 0x3499ffff, + 0x3b31270e, + 0xa734cb32, + 0xfd4fbf2e, + 0x41273138, + 0x31532405, + 0x32d62403, + 0xfb8ef443, + 0x422afc93, + 0x05c49906, + 0x20274736, + 0x3ea7d21d, + 0x27ffffff, + 0xadf44340, + 0xbd187e34, + 0x8e187c32, + 0xf8167efb, + 0x0c070706, + 0x01e118be, + 0xc605c499, + 0xf5bed94f, + 0xc1be01e0, + 0xcf1e0187, + 0x01e100be, + 0x0187b7be, + 0x0f6be11e, + 0x34333007, + 0x302b0087, + 0xb2203f03, + 0x34190006, + 0x270941c4, + 0x1d012742, + 0x27fe0b34, + 0x0bfe0b00, + 0x07fc4efe, + 0x76fcabd0, + 0xff3ea7cb, + 0x34c1ffff, + 0x154dc2fc, + 0x663fdc27, + 0xdf0ea7c5, + 0x67beffff, + 0xfceb0110, + 0xfc8e0d07, + 0x010033b9, + 0x34d24d1b, + 0x0fdc830e, + 0xddf9d333, + 0xff00007c, + 0xd027da1e, + 0x0ea7d61e, + 0xbeffffdf, + 0x1e011061, + 0xff4ea7bd, + 0x41b9ffff, + 0x40c10100, + 0x071926fc, + 0x0f3c8330, + 0x34f93333, + 0xff00007e, + 0x21074756, + 0x01034027, + 0x007c34fd, + 0x3007ff00, + 0x330f3c83, + 0xf0112333, + 0x4ea70ff2, + 0xbdffffff, + 0xc5010041, + 0xfe0bfc40, + 0x007e34f9, + 0x4fc6ff00, + 0xff4ea7d4, + 0x41bdffff, + 0x40c50100, + 0xabfe0bfc, + 0x05f1932f, + 0x2c03068b, + 0x6414890f, + 0x3fab2473, + 0x0127242e, + 0x4307fe0b, + 0x890f4c03, + 0x44736613, + 0x340e0027, + 0xfe0b0127, + 0xfd93fd4e, + 0xc1068adc, + 0x088660d0, + 0x010e0bbe, + 0x2c274027, + 0x60d4c515, + 0x10273d07, + 0x31054207, + 0x34032123, + 0x4027f4b8, + 0x8d66d28d, + 0xfd8e64d4, + 0x404af493, + 0x64409906, + 0xfe0b0f4b, + 0xf9f34ea7, + 0xa74149ff, + 0xfff9ed0e, + 0x270c1c33, + 0x3c270d2c, + 0x0304090f, + 0x0b423b02, + 0x98210314, + 0xf34ea7f3, + 0x40a1fff9, + 0xfe0b012b, + 0x4012f493, + 0x14409906, + 0x2107fe0b, + 0x5c9e04c6, + 0x4ea7010e, + 0xc1fd4fff, + 0x30c87443, + 0x281e270e, + 0x02070e36, + 0x1b9e2027, + 0x1e27010f, + 0x1e0e5648, + 0x07fd4ef2, + 0x271007d0, + 0xf093502c, + 0xbe0642d4, + 0x0601026a, + 0x930d0708, + 0x0642c7f3, + 0x01144c27, + 0x05040302, + 0xa8340332, + 0x933127f4, + 0x06402ff4, + 0x8e0a439d, + 0xadf493fd, + 0x4099063f, + 0x93fe0b54, + 0x063fa3f4, + 0x0b5040c1, + 0x99f493fe, + 0x40c1063f, + 0x93fe0b4c, + 0x068a8bf4, + 0x02b443d1, + 0xffff3f04, + 0x01fdffff, + 0x0006b2d1, + 0xfe0b0027, + 0x3f76f493, + 0x0b402106, + 0x6df493fe, + 0x4011063f, + 0xf493fe0b, + 0x99063f64, + 0xfe0b4440, + 0xa007f94e, + 0xac23c107, + 0x0b114714, + 0x0713091a, + 0x240999d0, + 0x0c073e66, + 0x4c234007, + 0x01493b0c, + 0x873123d2, + 0x87e20be4, + 0x0d4e0b43, + 0xc24b0113, + 0x4427320c, + 0x2047493b, + 0x1e073007, + 0xd4072223, + 0x3123e007, + 0x2a0b142b, + 0xec2bd013, + 0x23413cca, + 0x3b412701, + 0x274b0b40, + 0x05230d31, + 0x0b222314, + 0x07fe581d, + 0x07f98e0b, + 0x4741034c, + 0x1cec2724, + 0x2a0b0c07, + 0x4cd4ec2b, + 0x12071a1d, + 0x22030103, + 0x2707fef0, + 0x8e0b07b0, + 0xe61309f9, + 0x278a1e31, + 0x27bd1ee1, + 0x30e41ee1, + 0xd3f09302, + 0xfe0b0142, + 0x3f32f393, + 0x9d402706, + 0x00275d30, + 0x0b6034c5, + 0x930230fe, + 0x0142dff0, + 0xf393fe0b, + 0x27063ea0, + 0xc6341d40, + 0x1d412704, + 0x0b002734, + 0xff4ea7fe, + 0x40d5ffff, + 0x08860e5c, + 0xafff1ea7, + 0xa71341fd, + 0xfd9fff2e, + 0x1305300b, + 0x00272421, + 0x25104ce3, + 0xa3231124, + 0x2315103c, + 0x3ea7fe0b, + 0x11fd9fff, + 0xe3002734, + 0x3415104c, + 0xf493fe0b, + 0xc5063ec8, + 0x07536840, + 0x4ea70183, + 0x9dffffff, + 0x00274540, + 0x4007fe0b, + 0x42d04123, + 0x1104c014, + 0x400e08c0, + 0x0c20100c, + 0x82f09320, + 0xfe0b0142, + 0x3e96f393, + 0x56349906, + 0x4536408b, + 0x4293f093, + 0x9dfe0b01, + 0x00275430, + 0x3ea7fe0b, + 0xc1fff9f3, + 0x040e3434, + 0x273430c5, + 0x30fe0b00, + 0x9af09302, + 0xfe0b0142, + 0x7fff4ea7, + 0x3c4391d0, + 0xf093103c, + 0x0b0142b7, + 0xd9f393fe, + 0x4027063d, + 0xe614349d, + 0x9d412704, + 0x00271434, + 0x0469fe0b, + 0x42ce0249, + 0x1928c030, + 0xf0932a20, + 0x0b014300, + 0xff4ea7fe, + 0x43c1fd4f, + 0x003fd874, + 0xeb010000, + 0x3da2f393, + 0x27412706, + 0x17329d00, + 0x9d15349d, + 0xfe0b1632, + 0x42a5f093, + 0x20fe0b01, + 0xfff09301, + 0xfe0b0142, + 0x3d7ef393, + 0x19309d06, + 0x00274127, + 0x0b18349d, + 0x0b0127fe, + 0x000e10fe, + 0x0d270100, + 0xf493ffff, + 0x15063d60, + 0x0b002740, + 0x930230fe, + 0x014301f0, + 0xf493fe0b, + 0x3d063d4c, + 0x0b002740, + 0x210211fe, + 0xa32c5403, + 0x0f4d3cd0, + 0x4335f093, + 0x93fe0b01, + 0x014307f0, + 0xf493fe0b, + 0x27063d28, + 0x35434500, + 0x3cfe0b42, + 0x930e000d, + 0x01433df0, + 0x0d3cfe0b, + 0xf09340c8, + 0x0b01435b, + 0x0b0027fe, + 0x930430fe, + 0x014377f0, + 0xf393fe0b, + 0x27063cf8, + 0x1b309d41, + 0x349d0027, + 0x93fe0b1a, + 0x063ce7f4, + 0x0b2e4099, + 0xddf493fe, + 0x4099063c, + 0x93fe0b32, + 0x063cd3f4, + 0x0b5c4089, + 0xc9f493fe, + 0x4089063c, + 0x93fe0b5a, + 0x063cbff4, + 0x0b5e4089, + 0xb5f493fe, + 0x4089063c, + 0x30fe0b56, + 0x46f09302, + 0xfe0b0143, + 0x04963127, + 0x4ea73027, + 0x27ffffff, + 0x6443bd00, + 0x93fe0b15, + 0x06878bf3, + 0x4e523489, + 0x9d412704, + 0x308d6934, + 0x0b002752, + 0x75f393fe, + 0x34890687, + 0x27044e50, + 0x69349d41, + 0x2750308d, + 0x93fe0b00, + 0x06875ff3, + 0x4e543489, + 0x9d412704, + 0x308d6934, + 0x0b002754, + 0x49f493fe, + 0x40890687, + 0x4efe0b52, + 0x3e4c27fd, + 0xd007407b, + 0xc01a41d8, + 0x05c04904, + 0x3101c065, + 0x931703c0, + 0x063c2bf4, + 0xe0274d5d, + 0xfd8e0e07, + 0x42ecfe93, + 0x8e0e0701, + 0x3eb13efd, + 0x870fabc5, + 0xd0010300, + 0x0100000e, + 0x10fe9315, + 0xdd1e0143, + 0xc8f9067e, + 0xfe93ce06, + 0x1e0142e9, + 0xff777ed0, + 0xf193c21e, + 0x27063bec, + 0x93202702, + 0x0686c3f4, + 0xe0273127, + 0x9d44109d, + 0x139d0a42, + 0x1e105d65, + 0xcdf493ac, + 0x3127063b, + 0xe0272227, + 0x5d54439d, + 0x4e9a1e42, + 0xc5f6e3f5, + 0x029958f0, + 0x07312724, + 0x07323b4f, + 0x404c03e0, + 0xc554f2c5, + 0xf1c54cf3, + 0x14ec235c, + 0xf4c52f07, + 0x103c2768, + 0x24054027, + 0xf3b82403, + 0x274cf3c1, + 0x27312320, + 0x40fec54a, + 0x2748f2c5, + 0xf3c50d6c, + 0x64f4c560, + 0x8940f2c1, + 0x27891a23, + 0x50f3c518, + 0x00b172f0, + 0xee4cf4c1, + 0xc100aa34, + 0x460754f2, + 0x3b0d4c23, + 0x58f2c142, + 0x23010487, + 0x7fe6030b, + 0xf4c10100, + 0x60f2c150, + 0x010324e2, + 0xf2c14607, + 0x0c4c2354, + 0xf2c1423b, + 0x0b612350, + 0x27548742, + 0x27530b81, + 0x07863b30, + 0x076103a2, + 0x44f3c510, + 0xc7079027, + 0x3f070201, + 0x465b4207, + 0x870f4c83, + 0x013d0bd4, + 0x8be80734, + 0x854fe6e4, + 0x07b40700, + 0x07e4d632, + 0x07b20734, + 0xce480b43, + 0x1205774b, + 0x04031403, + 0xfcf09103, + 0x013f0748, + 0x05454634, + 0x03402714, + 0xc1340514, + 0x340368f2, + 0xc1ed32ce, + 0x36ce5cf3, + 0x44f4c169, + 0x1b40f3c1, + 0x18348d47, + 0xc11a3a8d, + 0xf2c140f4, + 0x23420364, + 0x40f4c521, + 0x0364f2c5, + 0x2d2ff661, + 0x48f0c1ff, + 0xf58ef6c3, + 0xea60f4c1, + 0x07ff7fa4, + 0x03370749, + 0xca392b41, + 0x7ee65874, + 0x04030201, + 0x14031205, + 0x9a1ef3a8, + 0x8f1e3205, + 0x0744f2c1, + 0x0b53054f, + 0x272203d4, + 0x03540340, + 0x44f2c5a1, + 0x775ed405, + 0x50f2c1ff, + 0x2a2e4127, + 0x1e48f4c5, + 0xc540278d, + 0x861e48f4, + 0x2750fac1, + 0xc5100730, + 0x5e5e44f3, + 0x50fac1ff, + 0x10079027, + 0x1e44f9c5, + 0x1e31279f, + 0x4efe0ba8, + 0x7ec007fc, + 0x4127f925, + 0x40270c0e, + 0xfc8e0407, + 0xc007fc4e, + 0xffffcf03, + 0xcf8303ff, + 0xfc000000, + 0x20271c07, + 0xbe163c27, + 0xa701088b, + 0xfff9f34e, + 0x4cc53027, + 0x3c43c540, + 0x8e3840c5, + 0x07fa4efc, + 0x14dc23d0, + 0xcd0bc247, + 0x9914dc03, + 0xc00924de, + 0x4e3b4127, + 0xb30bb007, + 0xa3074223, + 0xb432d301, + 0xfa8e0127, + 0x3b0c2c23, + 0x87020b2e, + 0x87030b00, + 0xfc6dbe2a, + 0x27412700, + 0x9dcb0d00, + 0xfa8e31d4, + 0x0399f74e, + 0x3b412724, + 0x07f06343, + 0x070b0184, + 0x07f10570, + 0x878333d1, + 0x27c00794, + 0x07c249a0, + 0x871b070d, + 0xbea10322, + 0x0b00fc37, + 0x03d80bb9, + 0x10acc4c2, + 0x247499e9, + 0xd4077c01, + 0x749d4103, + 0x03f40124, + 0x077405d6, + 0x071f0707, + 0x0531272d, + 0xff6b7efc, + 0x73b10596, + 0x4d3b4127, + 0x73b5340b, + 0xf78ef043, + 0xfd4efe0b, + 0xffff4ea7, + 0x6443b9ff, + 0x6bd00715, + 0x933776df, + 0x055d47f4, + 0x07d43d27, + 0x04072427, + 0x42154305, + 0xfd0e4d25, + 0x00ff719e, + 0x4044f093, + 0x03c1be01, + 0x4edd1e01, + 0x81f693f5, + 0x6ad10639, + 0xf06302d8, + 0xd007ab71, + 0x0027b45c, + 0xf58ef043, + 0x0724ac89, + 0x7e0c071b, + 0xf593fb7d, + 0x990638e8, + 0xf0051554, + 0x99704fc6, + 0x58991657, + 0x23782317, + 0x10bcd888, + 0x22a9895a, + 0x8920ab89, + 0xb42e20d4, + 0xce22d489, + 0xfc937d49, + 0xc1055934, + 0xdb8d6864, + 0x9d448320, + 0xf40148d4, + 0x9d22d98d, + 0xd79d4cd4, + 0x4bd89d4a, + 0x9df5b07e, + 0xcc794ed0, + 0x9d22d489, + 0x539949dc, + 0x1401271a, + 0x2702d04d, + 0x06004700, + 0x43012735, + 0x7ef58ef0, + 0x0127fb79, + 0xa989f61e, + 0x22ab8920, + 0xcdc0a61e, + 0xd4120321, + 0x670322cd, + 0x0182cd20, + 0x0281cd00, + 0x0121cd44, + 0x4fff4ea7, + 0x7443c1fd, + 0x00003fdc, + 0x27630100, + 0x5e802770, + 0x6499ff71, + 0x48d39968, + 0x43ee4483, + 0xd499ff7a, + 0xeef3014c, + 0x99ff7143, + 0x74ee4ad4, + 0xd499ff6a, + 0x6384ee4b, + 0x4edc99ff, + 0xeef52c7e, + 0x93ff59c0, + 0x05588bfc, + 0x4fe6c439, + 0xd399ff12, + 0xeec47949, + 0x5eff4a43, + 0xcdc0ff06, + 0xd0a21121, + 0xac1121cd, + 0x7fdfcd03, + 0x4fab4c07, + 0x1ea142d4, + 0x27722790, + 0xff0f5e82, + 0x1f6bfe4e, + 0x16260f6b, + 0xffff3ea7, + 0xa434d1ff, + 0xd5410316, + 0x8616a434, + 0xff4ea707, + 0x40d1ffff, + 0x1c2716a4, + 0xbe012312, + 0x27013623, + 0xb004fd44, + 0x27ff0016, + 0x93fe8e00, + 0x0682a3f4, + 0x0b504089, + 0x1000d1fe, + 0x190c5301, + 0xfe0b0183, + 0x04c4fe4e, + 0x07111122, + 0xd4412341, + 0x0000004f, + 0x24d12010, + 0x21d50110, + 0x4fa3010c, + 0x80000000, + 0x011024d5, + 0x0627fe8e, + 0x3eaef193, + 0x05539e01, + 0xcbf19301, + 0x4a9e013e, + 0xf94e0105, + 0xb207c107, + 0x730c0cc4, + 0x02071d01, + 0x19211a11, + 0x0a76a83e, + 0xd4c0da66, + 0x234a073d, + 0xd403e84d, + 0x9ac6194f, + 0xc301603b, + 0x0110b4d1, + 0x11ecb3c5, + 0x004fa3c3, + 0xc5100000, + 0xcc21f0b3, + 0x0110b4d5, + 0x8ef4bcc5, + 0xc6d956f9, + 0x0427ddaf, + 0x3f0af193, + 0x04f39e01, + 0x23490701, + 0x1403e84d, + 0x9ac6194f, + 0xb6a9c23b, + 0xf1930427, + 0x9e013f2b, + 0x270104d9, + 0x9bf19306, + 0xce9e013e, + 0x06270104, + 0x3e68f193, + 0x04c39e01, + 0x93042701, + 0x013f34f1, + 0x0104b89e, + 0x04c4fe4e, + 0xc811111a, + 0x24d12011, + 0x21d50110, + 0x4fa30108, + 0x40000000, + 0x011024d5, + 0x0627fe8e, + 0x3f35f193, + 0x048f9e01, + 0x93062701, + 0x013f66f1, + 0x0104849e, + 0x0cc4fe4e, + 0xf493220c, + 0xc1063704, + 0x38964443, + 0x56faf493, + 0x1d312705, + 0x15130143, + 0x25131143, + 0x35112143, + 0x27fe8e41, + 0x5ef19306, + 0x529e013f, + 0x06270104, + 0x3f7ff193, + 0x04479e01, + 0xc4fe4e01, + 0x9324440c, + 0x0556c7f2, + 0x32074127, + 0x3c03243d, + 0x114c2710, + 0x14031001, + 0x34033005, + 0x2479f4a8, + 0x247d4103, + 0x0627fe8e, + 0x3f8cf193, + 0x04139e01, + 0x07fe4e01, + 0xf40cc420, + 0x91f39315, + 0x03070556, + 0x345d4127, + 0xbe540c03, + 0x8e00f8c3, + 0x930627fe, + 0x013f96f1, + 0x0103ec9e, + 0xd007fd4e, + 0x76f2fe7e, + 0x10d4d108, + 0xa3202701, + 0x0000004f, + 0x10d4d504, + 0x93302701, + 0x063657f4, + 0x064842d5, + 0x064c43d5, + 0x0627fd8e, + 0x3f94f193, + 0x03b79e01, + 0x07fc4e01, + 0xc4d207c1, + 0xc47e2904, + 0xd10a16f2, + 0x010114d4, + 0x104ca3cc, + 0x0114d4d5, + 0xf4932027, + 0x27063620, + 0xd0dcc530, + 0x064842d5, + 0x064c43d5, + 0x0627fc8e, + 0x3f8cf193, + 0x037b9e01, + 0x93062701, + 0x013fb0f1, + 0x0103709e, + 0xc107fc4e, + 0x04c4d207, + 0xf27d7e18, + 0xd4d107f6, + 0xcc010114, + 0xc5204ca3, + 0xd4d5d4dc, + 0xfc8e0114, + 0xf1930627, + 0x9e013f56, + 0x27010345, + 0x7af19306, + 0x3a9e013f, + 0xfe4e0103, + 0x0f140cc4, + 0x41271131, + 0x015024bd, + 0x014821d5, + 0x0627fe8e, + 0x3f9bf193, + 0x031b9e01, + 0x07fe4e01, + 0x540207e0, + 0x930627e4, + 0x013fb0f1, + 0x0103089e, + 0x42071219, + 0x44333287, + 0x4403432b, + 0xd4e7e4ca, + 0xd14a112c, + 0x38011003, + 0x0000003f, + 0xc0041901, + 0x2745ff4c, + 0x27249641, + 0x184c3340, + 0xffff3f83, + 0x34abfeff, + 0x011003d5, + 0x031d1319, + 0x13391419, + 0x1904049d, + 0x05039d14, + 0xfe8e4496, + 0x44332487, + 0x0803241b, + 0xfe0e1403, + 0x00f7769e, + 0xf1930627, + 0x9e013f6f, + 0x270102a1, + 0x9df19306, + 0x969e013f, + 0xfe4e0102, + 0x06270454, + 0x3fe0f193, + 0x02879e01, + 0x07131901, + 0x03433343, + 0xeb04ca44, + 0x864133d4, + 0x07e30738, + 0x49036901, + 0x27434204, + 0x2df19306, + 0x629e0140, + 0x03890102, + 0x0804890a, + 0x03ed34ca, + 0xd1fe0808, + 0x07011024, + 0x004fa302, + 0xd5080000, + 0x03011024, + 0x2c27d80c, + 0xf705be14, + 0x27fe8e00, + 0xb7f19306, + 0x2e9e013f, + 0xfe4e0102, + 0x141904e6, + 0x27ff4c40, + 0x19f19306, + 0x1a9e0140, + 0x08d00102, + 0x1020d1f3, + 0x000fd801, + 0x13010000, + 0x46062419, + 0x27114c54, + 0x38f19306, + 0xfa9e0140, + 0x40a70101, + 0x1319241d, + 0x25ff3cc4, + 0x00000fa3, + 0x20d50100, + 0x14990110, + 0x04249d04, + 0x9d051499, + 0x14990524, + 0x06249d06, + 0x9d071199, + 0xfe8e0721, + 0xf1930627, + 0x9e014062, + 0x4e0101c1, + 0x07e107fd, + 0x20ecd010, + 0x8604414c, + 0x6604514e, + 0x1a04894f, + 0x895f4fc6, + 0x41401804, + 0xf1930627, + 0x9e014188, + 0xb9010199, + 0xb6013824, + 0x0741274e, + 0x3824bd32, + 0x183d0301, + 0x27400701, + 0x034d0108, + 0x033d0544, + 0x07f0a834, + 0x200c230e, + 0x0e201c03, + 0xff405efd, + 0xf1930627, + 0x9e014047, + 0x27010161, + 0x6ff19306, + 0x569e0140, + 0x06270101, + 0x4090f193, + 0x014b9e01, + 0x93062701, + 0x0140aef1, + 0x0101409e, + 0xf1930627, + 0x9e0140cc, + 0x4e010135, + 0x03e007fd, + 0x0d0354ec, + 0x200701a7, + 0x2ce33e07, + 0xa70d237f, + 0x7f3ce301, + 0x3c033419, + 0xf932c280, + 0x41073e07, + 0x01552c27, + 0x0544034e, + 0xa834033e, + 0x6703b9f2, + 0xe6318301, + 0x101ed13a, + 0x1414d101, + 0x832e0701, + 0xffffff2f, + 0x3f4ce303, + 0x14d53027, + 0x13bd0114, + 0x12d50150, + 0x2f380110, + 0x01000000, + 0x4cc01419, + 0x402713ff, + 0x013814bd, + 0x4027fd8e, + 0x9d54049d, + 0xc21e5803, + 0x89220289, + 0x04712003, + 0x031f2c03, + 0x0d991f3c, + 0x73257358, + 0x59009935, + 0x21104cd8, + 0x41034d07, + 0x072d43ce, + 0xce410340, + 0xef831b42, + 0x02ffffff, + 0x1ed54027, + 0x14bd0110, + 0xfd8e0138, + 0x23074207, + 0xd91e3407, + 0xf1930627, + 0x9e0140f6, + 0x2701006d, + 0x90f19306, + 0x629e0140, + 0xfe0b0100, + 0xc107fc4e, + 0x08c4d207, + 0x7e02076c, + 0x0fd6fac5, + 0xc8c0116f, + 0x0ccc5b00, + 0xe33e1c34, + 0x1cc0c101, + 0x1cc01f0d, + 0x1cc02b0e, + 0x0627370c, + 0x4181f193, + 0x002b9e01, + 0x330c2701, + 0xc101c53e, + 0xe30d1cc4, + 0x0114d4d1, + 0x0111d0bd, + 0xd4d542a3, + 0xfc8e0114, + 0x0114d4d1, + 0x0112d0bd, + 0xd4d544a3, + 0xfc8e0114, + 0x0114d4d1, + 0x0110d0bd, + 0xd4d541a3, + 0xfc8e0114, + 0xa71e0027, + 0xf1930627, + 0x9e0140c6, + 0x2700ffe1, + 0xe6f19306, + 0xd69e0140, + 0xfc4e00ff, + 0xc207d107, + 0x074e08c4, + 0xfa3b7e02, + 0xd0010e76, + 0xcc3e00c8, + 0x112e340c, + 0x31d0c8dd, + 0x2034dccc, + 0x7e48d0ca, + 0xc0d5ff4e, + 0x0d070100, + 0xd1ff457e, + 0xd50114c4, + 0xa30104c0, + 0x14c4d548, + 0x27fc8e01, + 0xdd1e33dc, + 0x0c27dd11, + 0xd1d0cc33, + 0xd11ed027, + 0xc41e0027, + 0xf1930627, + 0x9e0140ea, + 0x2700ff75, + 0x11f19306, + 0x6a9e0141, + 0x042700ff, + 0x4157f193, + 0xff5f9e01, + 0x07fc4e00, + 0xc4c207d1, + 0x02075008, + 0xb6f9c47e, + 0xc8d0010e, + 0x0ccc4000, + 0xdd113034, + 0xcc33d0c8, + 0xca2234dc, + 0xd77e4ad0, + 0xf8c0c5fe, + 0xcf7e0d07, + 0x10c4d1fe, + 0xfcc0c501, + 0x00004fa3, + 0xc4d52000, + 0xfc8e0110, + 0x1e33dc27, + 0x27dd11db, + 0xd0cc330c, + 0x1ed027cf, + 0x1e0027cf, + 0x930627c2, + 0x014130f1, + 0x00fefc9e, + 0xf1930627, + 0x9e014098, + 0x2700fef1, + 0x48f19304, + 0xe69e0141, + 0xfe4e00fe, + 0x114c08c4, + 0x5242d414, + 0x3dc01301, + 0xd127fffe, + 0xa3011024, + 0x0000004f, + 0x1024d502, + 0x2b30c801, + 0x3ccc4307, + 0x11110b34, + 0xc5c824c5, + 0xfe8ecc21, + 0x1e334c27, + 0x1024d1f2, + 0xff4f8301, + 0xd5fdffff, + 0x11011024, + 0xcc21c511, + 0x4027fe8e, + 0x0627d91e, + 0x4125f193, + 0xfe8b9e01, + 0x93062700, + 0x01413bf1, + 0x00fe809e, + 0x3007fe4e, + 0x00ec14f0, + 0x01070401, + 0x4ce00423, + 0xd0008112, + 0xe023134c, + 0x00a1194c, + 0x321a4cd4, + 0xb1154ce0, + 0x174ce000, + 0x4cc000a5, + 0x06275c14, + 0x4158f193, + 0xfe479e01, + 0x674ac000, + 0xc02d4bd4, + 0x49c07143, + 0xe742c467, + 0x14031307, + 0x4b5efe0e, + 0x1b4cc0ff, + 0x1b4cd070, + 0x1c4ce028, + 0x4cc4008d, + 0x1307cd1d, + 0xfe0e1403, + 0xc0fadd5e, + 0xd02b0f4c, + 0xc46b104c, + 0x07b8104c, + 0x0e140313, + 0xf97e5efe, + 0x14031307, + 0xe65efe0e, + 0x031307f9, + 0x5efe0e14, + 0x0207fb5a, + 0xfd5efe0e, + 0x031307f9, + 0x5efe0e14, + 0x1307f999, + 0xfe0e1403, + 0x07f88d5e, + 0x5efe0e13, + 0x1307f84c, + 0xfe0e1403, + 0x07faac5e, + 0x0e140313, + 0xfde85efe, + 0x14031307, + 0xfe5efe0e, + 0x0e1307f9, + 0xf8f65efe, + 0x14031307, + 0x465efe0e, + 0x0c4cf0fe, + 0x1307ff4e, + 0x395efe0e, + 0x031307fd, + 0x5efe0e14, + 0x0627fa20, + 0x4073f193, + 0xfd839e01, + 0xb80f0300, + 0x990006b2, + 0x14ce4d04, + 0x4d019d0e, + 0xf4933127, + 0x9d067a7c, + 0x00276943, + 0xfc4efe0b, + 0x011003d1, + 0x30ccd007, + 0x65f2931c, + 0x01d1067a, + 0x24c1010c, + 0x0d14ce60, + 0x249d4127, + 0x6021c569, + 0x011003d1, + 0x00003fd8, + 0xc14f1000, + 0x31e0ecd3, + 0xfc930123, + 0xc1067a3c, + 0x344e34c4, + 0xc3c54127, + 0x69c49d34, + 0xc1f0d3c1, + 0x344e58c4, + 0xc3c54127, + 0x69c49d58, + 0xc1f4d3c1, + 0x34ee5cc4, + 0x030700db, + 0x032b0333, + 0x1a274127, + 0x9d5cc3c5, + 0x76be69c4, + 0xc0c5012d, + 0x10d3d158, + 0x003fd801, + 0x1e200000, + 0x79eef393, + 0xfcd2c106, + 0xc13834c1, + 0x24eef8d1, + 0x412700ae, + 0xc569349d, + 0x31c53832, + 0x14d4d13c, + 0x2248d801, + 0x79caf393, + 0x04d2d106, + 0x4434c101, + 0x0100d1d1, + 0x276b24ce, + 0x69349d41, + 0xc54432c5, + 0x349d4831, + 0x10d4d140, + 0x004fd801, + 0x17400000, + 0x799ef393, + 0x08d2d106, + 0x6434c101, + 0x4127244e, + 0xc569349d, + 0xd4d16432, + 0x41dc0114, + 0xdc423c23, + 0xfc8e1344, + 0x0111d1b9, + 0xe67e0127, + 0x14d4d1fe, + 0xef44d801, + 0x0112d1b9, + 0xfc0e0227, + 0xb9fed45e, + 0x270110d1, + 0xfecb7e00, + 0x0114d4d1, + 0x1ed142d8, + 0x4834c1d4, + 0x279f14ce, + 0x69349d41, + 0xc54432c5, + 0x349d4831, + 0xd18f1e40, + 0x5e0110d3, + 0x34c1ff3d, + 0x5a14ee3c, + 0x9d4127ff, + 0x32c56934, + 0x3c31c538, + 0x93ff4c5e, + 0x06791bfc, + 0x2734c4c1, + 0xdd43ee32, + 0xfee25efe, + 0x00fffffc, + 0x7007f54e, + 0xa107b207, + 0x2fc60481, + 0xa7940774, + 0xfdefff8e, + 0xe7ff5ea7, + 0xef6ea7fd, + 0x7299fde7, + 0x5b4a072d, + 0x3b312742, + 0xa1410332, + 0x87312372, + 0x07420b44, + 0x032307ca, + 0x07c38b21, + 0x012c2bdb, + 0xfdbe3040, + 0xf413ffff, + 0xc24d01b4, + 0xd20709d2, + 0x3327051e, + 0x8411f3e8, + 0x53184c33, + 0x44131d4c, + 0x7ef041c8, + 0xc00bf37d, + 0x5d155c05, + 0x54354027, + 0x6d156905, + 0xbd2b6435, + 0x9d0bb506, + 0x9f1ead0b, + 0xefff3ea7, + 0xd83411fd, + 0x0efc6a4d, + 0x43272307, + 0x2311f4e8, + 0xfc6a3ddc, + 0x654027f6, + 0x4ef58e74, + 0x110419fc, + 0x0324471e, + 0x27d28721, + 0x310c3943, + 0x00d4f510, + 0xf1ff0212, + 0x021000d1, + 0x33e00bff, + 0x1c53181c, + 0x3317461d, + 0x0424f124, + 0x87ff0218, + 0x0032f13c, + 0x2bff0216, + 0x00e22be4, + 0xc4e02b11, + 0x9b0c1ecc, + 0x4c53a04f, + 0x0c4c8314, + 0x4227e42b, + 0xd4f50e07, + 0xff021200, + 0xf093fc8e, + 0x27055af8, + 0xad38084d, + 0x27028e04, + 0x27202745, + 0x8c04bd10, + 0x93312702, + 0x017f33f4, + 0xbd09019d, + 0xd5028d03, + 0x05029802, + 0x08019d04, + 0x029002d5, + 0x029402d5, + 0x0b2c0c03, + 0x51f74efe, + 0x0bb30704, + 0x07f06332, + 0x07d20770, + 0x553402c1, + 0xa7de8603, + 0xfdefffae, + 0xe7ff8ea7, + 0xef9ea7fd, + 0x0707fde7, + 0x2f071b07, + 0x018d26be, + 0x4d07f301, + 0x4307d302, + 0x051ef405, + 0xf3e83327, + 0x4c33a411, + 0x1d4c5318, + 0x41c84413, + 0x05f301f0, + 0x2783158c, + 0x05843540, + 0x35931590, + 0x2bf40194, + 0x0bd506d4, + 0x1eb40bc4, + 0xff3ea7be, + 0x3411fdef, + 0xfc6a4dd8, + 0x2723070e, + 0x11f4e843, + 0x6a3ddc23, + 0xf043f6fc, + 0xfa4ef78e, + 0xb3070451, + 0xf063320b, + 0xd207a007, + 0x3402c107, + 0xd9260355, + 0x2f071b07, + 0xb0be0a07, + 0xf301018c, + 0x4d071c07, + 0x4307d302, + 0xf4052407, + 0x0172c1be, + 0xd42bf401, + 0xb40bc40b, + 0x43dadfd6, + 0x4efa8ef0, + 0x07c007fb, + 0x8e2ebeb1, + 0x07c45101, + 0x554b0b0c, + 0x9efb0ec4, + 0x4e018cb7, + 0x9bd007fc, + 0xc1d848cf, + 0xbe0d07fb, + 0x51018c0a, + 0x17cc33d4, + 0x4333402b, + 0x071bcc53, + 0x8e0c0b04, + 0x07f94efc, + 0x163f6b91, + 0x27399625, + 0xc4f98e00, + 0x0419fa22, + 0x42404f4b, + 0x646ef493, + 0x86431905, + 0xd4f49331, + 0xf3930192, + 0x0505645c, + 0x27222734, + 0x8e921d01, + 0x51f493f9, + 0x43190564, + 0xf49335a6, + 0x99062c10, + 0x3fd60543, + 0x41fd937b, + 0xd4990564, + 0x2749760f, + 0x2540a730, + 0x0fd39dd4, + 0x270ed39d, + 0x21f49b44, + 0x595afa93, + 0x08a49905, + 0x577e4896, + 0x9b4027fe, + 0x012721f4, + 0xf98e941d, + 0x0c030d07, + 0x8ac0be14, + 0x030d0701, + 0xb7be100c, + 0xc41e018a, + 0x04030a07, + 0x018d67be, + 0xaba1c027, + 0xbc75ac65, + 0xa161bc65, + 0x04030a07, + 0x018fb0be, + 0x6174d3c1, + 0xc5430ba4, + 0x412774d4, + 0x9d56b49d, + 0xac9d09ac, + 0x7eac1e08, + 0x0fc6e198, + 0xca82be81, + 0x714ebe01, + 0xff775e01, + 0x33280089, + 0x0b40870b, + 0x4efe0b04, + 0xd5f793f7, + 0x71990675, + 0xbdd00710, + 0x7e034f01, + 0x4007eb70, + 0x4d838d07, + 0x8d030208, + 0x4de00308, + 0x05ba0208, + 0x4d834007, + 0x4de00440, + 0x05a70440, + 0xb5277a41, + 0x930b7499, + 0x06759ff9, + 0x05684ff6, + 0x41273427, + 0x0310d3bd, + 0x0354d4bd, + 0x030ed3bd, + 0x030fd3bd, + 0x2aa2f993, + 0x3492c106, + 0x0164d2d5, + 0xd53893c1, + 0xc10168d3, + 0xd4d53c94, + 0x9ec1016c, + 0xd54a0740, + 0x020170de, + 0x274b07ba, + 0x3b1c07c1, + 0x23410714, + 0x074fab41, + 0x28d2a934, + 0x2ad1a903, + 0xab3f0b03, + 0x0b04073f, + 0x07410b02, + 0x3f2c03e3, + 0x8b3f1c03, + 0x53308be4, + 0xad165326, + 0xad031cd3, + 0xad031ede, + 0xad0330d2, + 0x7e0332d1, + 0x0cf4ed71, + 0xbd045c34, + 0xbd02e2d0, + 0x7e02e1dc, + 0x0cf4ed57, + 0x27044334, + 0xe4d0bd41, + 0xe3d4bd02, + 0xed597e02, + 0x28340cf4, + 0xbd412704, + 0xbd02e6d0, + 0x7e02e5d4, + 0xd0bdeaa2, + 0x948902c0, + 0xc4d4d546, + 0x65929902, + 0x02e0d2bd, + 0xe0e7047e, + 0xe004e302, + 0x7e04d603, + 0x01e8e6ef, + 0x4427048d, + 0x0308d4bd, + 0x0308d4b9, + 0xd4bd4203, + 0xd4a90308, + 0xd2a90330, + 0x3d270332, + 0x249b0500, + 0x0334d3ad, + 0x30004d27, + 0x0308d3b9, + 0x0336d4ad, + 0xd5604c27, + 0xad0338d2, + 0xbd033cd4, + 0x07030ad3, + 0xfe9e7e08, + 0x0348d0d5, + 0x10000d14, + 0x10000d27, + 0x0352d4b9, + 0x0348d0d5, + 0x03864ff6, + 0x4fff3ea7, + 0x7434c1fd, + 0x049340e8, + 0x06644d27, + 0x033ed4ad, + 0xd4bd4127, + 0x7499030b, + 0xbd080709, + 0x99034dd4, + 0xdebd0a7e, + 0x7199034e, + 0x4cd1bd0c, + 0xe9737e03, + 0x034cd4b9, + 0x0332d0a9, + 0x4007400a, + 0x032adca9, + 0xcc034f6b, + 0xafd4bd3f, + 0x07340703, + 0x2346734c, + 0x34123fcc, + 0xd3bd3407, + 0xd2b903af, + 0xd3b90352, + 0x11270353, + 0xd2bd4827, + 0xd3bd0395, + 0xd4bd0396, + 0xd1bd0398, + 0xd1bd03b0, + 0xd4bd0394, + 0x74990397, + 0x4fdeb908, + 0xbd302703, + 0x27039bd4, + 0x9fd4bd40, + 0x99d3bd03, + 0x9ed1bd03, + 0x9ad1bd03, + 0xaedebd03, + 0xff2ea703, + 0x24c1fd4f, + 0xb2d3ad74, + 0x4340e803, + 0xff3ea703, + 0x34c1fd4f, + 0x2a40e874, + 0x99d4b903, + 0x344ff603, + 0x19719904, + 0x03b2d4a9, + 0x03acd1bd, + 0x99604c03, + 0xdba91a72, + 0xd4d50328, + 0xd3a90358, + 0xd4a90330, + 0xdea9031c, + 0xd2bd031e, + 0xd0ad03ad, + 0xd3ad0368, + 0xd4ad0366, + 0xdead0388, + 0xdbad038a, + 0xdcad036a, + 0x057e036c, + 0x000df8e9, + 0xf8021a02, + 0xa9021608, + 0xa9036ad4, + 0x2b036cd3, + 0xad3c2b4b, + 0xad036ed4, + 0x270370d3, + 0x56d3b941, + 0x27262703, + 0x8ed4bd10, + 0xbd472703, + 0xd5038dd2, + 0xbd02f4d1, + 0xbd014cd4, + 0xd5038cd2, + 0x9d02f0d1, + 0x9499dcd3, + 0xe64f4b66, + 0x93020a4f, + 0x06282bf3, + 0xbd683499, + 0xbd015bd4, + 0xbd014dd4, + 0x93014ed4, + 0x067313fb, + 0xd560b4c1, + 0x7e0154d4, + 0xd1b9e513, + 0xdeb9034d, + 0xd0bd034e, + 0xd0bd0159, + 0xd1bd0158, + 0xdebd0153, + 0x08070152, + 0xb9fceb7e, + 0xb90397d4, + 0xb90398d1, + 0x83038cd2, + 0x1c830f4c, + 0x8dd3b90f, + 0x33453303, + 0xab232319, + 0x23238341, + 0x0e2c3333, + 0x20014ea3, + 0xab338304, + 0x103c3342, + 0xd2b943ab, + 0xd0d50159, + 0xd4d50120, + 0x2ff60124, + 0x402701fb, + 0x015ad4bd, + 0x281af193, + 0x54149906, + 0xe0ded399, + 0x2701c541, + 0x07430b43, + 0x9d3f6b34, + 0xf093ded3, + 0x19054800, + 0x99494604, + 0x41405414, + 0x41034307, + 0xb9ded49d, + 0xa3014cd4, + 0x4cd4bd48, + 0xd5021101, + 0x21017cd2, + 0x80d3d503, + 0xd5043101, + 0x390184d4, + 0xcdf39304, + 0x4e860547, + 0x41d83441, + 0x5414991b, + 0xd4994140, + 0x9d4103de, + 0xd4b9ded4, + 0x4ca3014c, + 0x4cd4bd10, + 0xd8344101, + 0x14991942, + 0x99414054, + 0x4103ded4, + 0xb9ded49d, + 0xa3014cd4, + 0xd4bd204c, + 0x4d07014c, + 0x01884d03, + 0x4796f293, + 0x113c2705, + 0x24032e01, + 0x44034e05, + 0x0459f3a8, + 0xf4934ba6, + 0x99054770, + 0x31d85443, + 0x54149919, + 0xd4994140, + 0x9d4103de, + 0xd4b9ded4, + 0x4ca3014c, + 0x4cd4bd40, + 0x034d0701, + 0x9301cc4d, + 0x05479bf2, + 0x013d3c27, + 0x05240321, + 0xa8440341, + 0xd67011f3, + 0xd4a9710f, + 0xd2a9031c, + 0xd1d1031e, + 0x249b0154, + 0x03ff2c03, + 0xa7ffff1d, + 0x2853453c, + 0x27101c53, + 0xafdcb941, + 0x58bbc103, + 0xd3bd129b, + 0xd4bd0150, + 0xf3930151, + 0x270151a4, + 0x150c27e0, + 0x42ca3401, + 0xca341111, + 0x34210c41, + 0x34994b2a, + 0xc0c4e20c, + 0x03e10301, + 0xf018143c, + 0x151a3c27, + 0xa9f78e73, + 0xa90388d1, + 0xad038ad2, + 0xad036ad1, + 0x5e036cd2, + 0xf293fddb, + 0x27015174, + 0x153c2710, + 0x04ce2409, + 0x0311036f, + 0xf398142c, + 0x27454ca7, + 0x50d4bd31, + 0x51d3bd01, + 0xb9ff1e01, + 0xb9014dd4, + 0xb9014ed3, + 0xc3015bd2, + 0xc331c341, + 0x4dd4bd21, + 0x4ed3bd01, + 0x5bd2bd01, + 0xfded5e01, + 0x4fff4ea7, + 0x7443c1fd, + 0x010430e8, + 0x07144d27, + 0x033ed4ad, + 0x27fc7b5e, + 0xe5d4bd40, + 0xfbdd5e02, + 0xd4bd4027, + 0xc25e02e3, + 0xbd4027fb, + 0x5e02e1d4, + 0x4127fba7, + 0x87fe3c5e, + 0x0b143341, + 0xd84f0341, + 0x99000192, + 0x44990e4e, + 0x50debd0d, + 0x51d4bd01, + 0x7ef78e01, + 0x0100e2c1, + 0xfe0003e4, + 0xd4bd4127, + 0xfd5e015a, + 0x7434c1fd, + 0x00004ef8, + 0x5efcd001, + 0x24c1fcd5, + 0x004ef874, + 0xfcb70100, + 0xe87424c1, + 0xa700ad40, + 0xfd4fff3e, + 0xec7434c1, + 0xc1fca440, + 0x4ef87434, + 0x9a010000, + 0x309499fc, + 0xfc934fe6, + 0x0399d4b9, + 0xd4bd42a3, + 0x865e0399, + 0x5e4327fc, + 0x4ea7fb74, + 0x99feffff, + 0x33830943, + 0x34334387, + 0x3cf9342b, + 0xff00004d, + 0x31e8527e, + 0xc00f6b94, + 0x42f07b41, + 0xc2d0fa78, + 0x9d40276e, + 0x6d5e0b94, + 0x277a41fa, + 0xfa5a5eb4, + 0xab077b41, + 0x27fa535e, + 0x08d4bd43, + 0xfb325e03, + 0xf6e2127e, + 0x7efb1e0f, + 0x0fc6e4b8, + 0xbd4127a9, + 0x5e0308d4, + 0x4d27fb26, + 0xd4ad0724, + 0x795e033e, + 0x7434c1fb, + 0x00004ef8, + 0x27fb6701, + 0xad06744d, + 0x5e033ed4, + 0x24c1fb64, + 0x004ef874, + 0xff4d0100, + 0xe62f9499, + 0xbdff464f, + 0x5e0399d1, + 0x02d4ff3f, + 0xfa025e91, + 0x2734c2d0, + 0x09949d41, + 0x87f9f75e, + 0x0be4334e, + 0xd84f034e, + 0x99000192, + 0x43890e41, + 0x0d449910, + 0x0150d1bd, + 0x0151d4bd, + 0x27fe2e5e, + 0xb6f19304, + 0x729e0135, + 0x02d400f2, + 0xf9c65ecb, + 0xa007fa4e, + 0xd007c107, + 0xd4d1b027, + 0x1c07029c, + 0x46e60407, + 0x00f2bebe, + 0x029cd0d5, + 0xd403b103, + 0xd5e8b2c4, + 0x8e02a4ac, + 0x270c07fa, + 0x2760001d, + 0xf378be20, + 0x9cd0d500, + 0x4ee21e02, + 0x07d007fc, + 0x07c403c0, + 0x030c071d, + 0x20272c1c, + 0x01871dbe, + 0x0c070676, + 0xcbbe1127, + 0xf4930188, + 0x0501765c, + 0x8e0327d4, + 0x230646fc, + 0x2705c601, + 0x03015340, + 0x07039641, + 0x27fe0b04, + 0x0b040740, + 0x003e27fe, + 0xf39b0100, + 0xf5049940, + 0xab0f4c33, + 0x40f49b4f, + 0xe0f30199, + 0xc0009211, + 0x13206d12, + 0x00be14e0, + 0x3e27ff1e, + 0x9b041800, + 0x402740f3, + 0x9b40f49b, + 0xf49b40f4, + 0x003d2740, + 0x40f39b80, + 0x00004e27, + 0x40f49b0b, + 0x00002e27, + 0x40f29b0f, + 0x80003d27, + 0x2740f39b, + 0x40f49b40, + 0x9b40f49b, + 0x112340f3, + 0x4f6b4107, + 0x43d41103, + 0x40f29b46, + 0x2740f29b, + 0x0b00004e, + 0x9940f49b, + 0x4833f404, + 0x00004ea3, + 0x40f49b07, + 0x4e27fe0b, + 0x9b041000, + 0x302740f4, + 0x2740f39b, + 0x9b80004d, + 0xf49b40f4, + 0x003e2740, + 0xf39b0c00, + 0x279e1e40, + 0x0408004e, + 0x1400de1e, + 0xf39bff1e, + 0x40f39b40, + 0x9b40f39b, + 0xf39b40f3, + 0x9b402740, + 0xf39b40f4, + 0x40f49b40, + 0x9b40f29b, + 0x4e2740f2, + 0x9b030000, + 0x9c1e40f4, + 0x20003e27, + 0x40f39b04, + 0xf49b4027, + 0x40f49b40, + 0x9b40f49b, + 0x3d2740f4, + 0xf39b8000, + 0x004e2740, + 0xf49b0a00, + 0xff425e40, + 0xf4a3f54e, + 0xf49d4027, + 0x04f49d05, + 0xd007fe49, + 0x96490499, + 0x06f49deb, + 0xf7ff4ea7, + 0x003d27f9, + 0x27f42508, + 0x35212746, + 0x27f41df3, + 0x094d2739, + 0x06f1992c, + 0xf29dfe55, + 0x2df33d04, + 0x45fe95f4, + 0x05f29dfe, + 0x98101ce0, + 0xbe0f0705, + 0x99018367, + 0xd7c145d4, + 0x7dd29958, + 0x4496c027, + 0xd4c1c127, + 0x96302760, + 0x07312744, + 0x577399b3, + 0xf3a5bf6b, + 0x0102d6b9, + 0x0377cfe6, + 0xf4c54227, + 0x138c2744, + 0x18070d07, + 0x018766be, + 0x4c334b07, + 0x40f49b0f, + 0x4027c4e6, + 0x9940f49b, + 0xf49bffd4, + 0xf0bfe641, + 0x44f4c103, + 0x7e41f49b, + 0x9007df57, + 0x8996d589, + 0xda8998dc, + 0x138ce08e, + 0x74990165, + 0xa3483320, + 0x0700004e, + 0xb940f49b, + 0x230264d3, + 0xf03f6b35, + 0xb9032834, + 0x7e0ab8d0, + 0xb007fe09, + 0x0a07bf6b, + 0x80be1c07, + 0xf3c10120, + 0x07890744, + 0xab8f6b90, + 0xd83fe69f, + 0xfdd19900, + 0xe2fcd499, + 0x99034641, + 0x4fe6fed4, + 0x3027033f, + 0x9b40f39b, + 0x412740f3, + 0x9b41f49b, + 0xd49941f3, + 0x41f49bfd, + 0x80003d27, + 0xb940f39b, + 0x230264dc, + 0x6b4c07c1, + 0xf0c1034f, + 0x2306e842, + 0x6b4c07c3, + 0xf0c3034f, + 0xe0057342, + 0xe005e8c5, + 0xe004c5c6, + 0xe4052bc7, + 0x0700c0c8, + 0x81a103a8, + 0x9bca077b, + 0x070b07c5, + 0x2005be1c, + 0x740fe601, + 0x84b4e007, + 0x071c0706, + 0x1ffbbe0b, + 0xabc09b01, + 0x07bc2bcf, + 0x34fcc54b, + 0x4aee4fab, + 0xc907066b, + 0x0c07c80b, + 0x89be1a07, + 0x0616011f, + 0x0c071a07, + 0x011fa1be, + 0x79be1507, + 0x4127011f, + 0xc141f49b, + 0x3f6b34f3, + 0x3ea33833, + 0x9b070000, + 0x402740f3, + 0xf040f49b, + 0xfb0100bd, + 0x004d2709, + 0x40f49b80, + 0xfb9bb853, + 0x99431e41, + 0x4ff6fed4, + 0x3d270334, + 0xf39b8000, + 0x64d4b940, + 0x6b432302, + 0xde42f04f, + 0x103c2708, + 0x41273b2b, + 0x433bb123, + 0x330fbc83, + 0x4fab10bc, + 0xf49b4bab, + 0x64d3b940, + 0x07332302, + 0x034f6b43, + 0x4f42f033, + 0xf6d49908, + 0xd49945a6, + 0x0f4c337b, + 0xf49b4fab, + 0x41739940, + 0x2ea735c6, + 0xc1fd4fff, + 0x40e87424, + 0xf3c103ba, + 0x8832f044, + 0x1a6c2302, + 0xb942f69b, + 0xf60104d4, + 0x9901a24f, + 0x43fc4174, + 0xd499019b, + 0xa14516f7, + 0xe732f0f3, + 0xb4dca900, + 0x6ac2f002, + 0x071c0705, + 0x272d07ed, + 0xd1112300, + 0xd102bc23, + 0x0302b824, + 0x23342b24, + 0x07300231, + 0xf0f15803, + 0x0100000e, + 0x0c53018d, + 0x10ac2710, + 0x01000df0, + 0x38270189, + 0x4827035b, + 0x0cf03007, + 0x27018910, + 0x27325b24, + 0xf02307b4, + 0x27018934, + 0x07122702, + 0xab3aab34, + 0xab215b3b, + 0xab215330, + 0x23b30732, + 0x9bb103c1, + 0xf39b41fc, + 0xb4d4a941, + 0x6f42d002, + 0x4c234307, + 0x2314070f, + 0x83030711, + 0x0c830f1c, + 0x10ac270f, + 0x3310cc27, + 0x1c33100c, + 0x2b212710, + 0x1ec42bab, + 0x40f49b19, + 0x3ea33fab, + 0x9b0f0000, + 0xd4a940f3, + 0x210302b4, + 0x42c2e403, + 0xb8e4d132, + 0xbce3d102, + 0x23342b02, + 0x53430731, + 0x4c3b104c, + 0x41ab4fab, + 0xce11bccc, + 0x3a3b3fab, + 0x30ab3fab, + 0xa940f39b, + 0x0302b4d4, + 0xcae40321, + 0x4d27d024, + 0xf49b8000, + 0x483f9b40, + 0x271a31dc, + 0x9b02202d, + 0x402722f2, + 0x070ef49b, + 0x9bff8b00, + 0x3f9b22f4, + 0xec31d848, + 0x33484f9b, + 0x4c53174c, + 0x8348131b, + 0x2345a647, + 0x0f4c8341, + 0x9b104c33, + 0x0f0740f4, + 0x0183d4be, + 0xcd27d161, + 0xc02b0800, + 0xb0071c2b, + 0xeabe0f07, + 0x0f070183, + 0x0183bcbe, + 0x0d07f251, + 0x3c074027, + 0x1ea70403, + 0x9df9f7ff, + 0xf49d05f4, + 0xf2737e04, + 0xf293d4a1, + 0x710557f8, + 0x2b4c6543, + 0xc143753c, + 0x24897421, + 0x0b310b78, + 0x78248d4b, + 0xa17423c5, + 0x9d4127d2, + 0xf3935624, + 0x2701715c, + 0x05f48303, + 0x27f58ed3, + 0x9b80004d, + 0x5f5e40f4, + 0x272d16fe, + 0xc5812732, + 0x895e44f3, + 0xb9d0b9fc, + 0xb8d4b90a, + 0x7e040b0a, + 0xb007fadd, + 0xd35ebf6b, + 0xf4a027fc, + 0x7b01000d, + 0x5b3027fe, + 0x07402703, + 0x100cf430, + 0x2027fe7b, + 0xb027325b, + 0x34f42307, + 0x0027fe7b, + 0x785e1027, + 0x4521e0fe, + 0x27302703, + 0x44f3c581, + 0xb9fc3f5e, + 0x230264d3, + 0x6b430731, + 0xf031034f, + 0x2303dc42, + 0x6b430733, + 0xf033034f, + 0xe0041942, + 0xe005a535, + 0xe005cc36, + 0xe006c437, + 0x27051c38, + 0x9b80004d, + 0xd3b940f4, + 0x32d00ab8, + 0x83b1230c, + 0xbc330fbc, + 0x40fb9b10, + 0x0264dcb9, + 0x89fc9a5e, + 0x74891070, + 0x7e049b0e, + 0x0cecfa49, + 0x07011a11, + 0x83312330, + 0x3c330f3c, + 0x100c1310, + 0x3b60d489, + 0xab4fab40, + 0x40f49b43, + 0x27fbe85e, + 0x40f49b40, + 0xd49937d6, + 0x994696fe, + 0x45e6fcd4, + 0x80004d27, + 0x9b40f49b, + 0xf39b40f4, + 0x9b402740, + 0xd4b940f4, + 0x4c330101, + 0x9b4fab0f, + 0xd39940f4, + 0x9935e6f6, + 0x45467bd4, + 0xb644f4c1, + 0x40f49b44, + 0xf49b4027, + 0xfd335e41, + 0x99fcd399, + 0x34e2fdd4, + 0x402702e7, + 0x9b40f49b, + 0x312740f4, + 0x9b41f39b, + 0xd4b941f3, + 0xf49b0103, + 0x002d2741, + 0x40f29b80, + 0xb9fdd499, + 0x2b0103d3, + 0x9b412343, + 0xf29b41f4, + 0x64d4b940, + 0x0f45e002, + 0xc246e003, + 0x8247e003, + 0xbe48e402, + 0x078103fc, + 0x23b59bb8, + 0xfa7c8181, + 0x270631b9, + 0x27ffff3d, + 0x40f3c5a0, + 0x94f05027, + 0xa123027f, + 0x4fab4a07, + 0x43f0a103, + 0x0c070273, + 0xeabe1b07, + 0x4b07011b, + 0x482b0b9b, + 0x49f20fab, + 0x41270759, + 0x2741f49b, + 0x0700003e, + 0x2740f39b, + 0x40f49b40, + 0x0df00c1b, + 0x06100100, + 0x80004d27, + 0x5340f49b, + 0x41f09b08, + 0x07fc585e, + 0x104c2340, + 0x2762d389, + 0x242b102c, + 0x323b4123, + 0x330f4c83, + 0x3fab104c, + 0xf39b34ab, + 0x003e2740, + 0x00270f00, + 0x27fecf5e, + 0x5ef45544, + 0x24c1fa65, + 0x004ef874, + 0xfc400100, + 0x038131fc, + 0xf49b4027, + 0x41749940, + 0x051442f8, + 0x80004d27, + 0x5e40f49b, + 0xc807fc26, + 0xbc07c103, + 0x1b07b59b, + 0x1fbe0907, + 0xa007011b, + 0x09071c07, + 0x011b15be, + 0x01031507, + 0x011aebbe, + 0x2a07ab9b, + 0x2fab7181, + 0x01500ff6, + 0x99fcd399, + 0x43eefdd4, + 0x41270179, + 0xf241f49b, + 0x270677b9, + 0x0700004e, + 0x2740f49b, + 0x9b80003d, + 0x410740f3, + 0x4df0422b, + 0x05200100, + 0x5340f39b, + 0x41f49b48, + 0x0264dcb9, + 0xfad9c7e4, + 0x017591e0, + 0x99fcd399, + 0x43eafdd4, + 0x0807024d, + 0x18078103, + 0x159b090b, + 0x011a87be, + 0x013e0ff6, + 0xf49b4127, + 0x003e2741, + 0xf39b0700, + 0x004d2740, + 0x40f49b80, + 0xf39b3027, + 0xfb5f5e40, + 0x07fdda99, + 0x0309071a, + 0xbe012311, + 0xf6011a58, + 0xe002000f, + 0x2701fc91, + 0x41f49b41, + 0x0264dcb9, + 0x0589c3e0, + 0xfa69c4e4, + 0xc8078103, + 0x0907c59b, + 0x53be1c07, + 0x0c9b011a, + 0x81230fab, + 0x0693c0f2, + 0x00003e27, + 0x9bb02707, + 0x080740f3, + 0x090b1c07, + 0x011a13be, + 0x06630ff6, + 0x80004d27, + 0x0740f49b, + 0xe80b2b09, + 0x6601000d, + 0x40f49b05, + 0xf09b0873, + 0x64dcb941, + 0x1cc5e402, + 0x031807fa, + 0xbe090711, + 0x03011a06, + 0xbe150701, + 0xd60119dc, + 0x91c0780f, + 0xfcd39979, + 0x22fdd499, + 0xfed49934, + 0x276b4fd6, + 0x41f49b41, + 0x00003e27, + 0x40f39b07, + 0x80003d27, + 0x0740f39b, + 0xe8490b48, + 0x1701004d, + 0x40f39b04, + 0xf49b4873, + 0x64dcb941, + 0xf9cd5e02, + 0x81274127, + 0x5e44f4c5, + 0x02c8f8fc, + 0x9b412731, + 0x3a0741f4, + 0x38333f6b, + 0x00003ea3, + 0x40f39b07, + 0xf49b4027, + 0x2b310740, + 0x003df432, + 0x9b037101, + 0xdcb940f4, + 0x945e0264, + 0xa091e4f9, + 0x9b402701, + 0xdcb941f4, + 0x845e0264, + 0x9b4027f9, + 0x6f5e41f4, + 0x1c94d0fb, + 0xf49b4127, + 0x003e2741, + 0xf39b0700, + 0x9b402740, + 0xf49b40f4, + 0xfa275e40, + 0x27e693d4, + 0x41f49b40, + 0x27fa1c5e, + 0x9b80004d, + 0xd3b940f4, + 0x4c270103, + 0x034b2b10, + 0x3bb12331, + 0x0fbc8334, + 0xab10bc33, + 0x9b3bab3f, + 0x265e40f3, + 0x2bc1e0fd, + 0xb1c2e003, + 0x9b402701, + 0xdcb941f4, + 0x085e0264, + 0x004d27f9, + 0x40f49b80, + 0x0264d3b9, + 0x018931e0, + 0x03dd32e0, + 0xbc83b123, + 0x10bc330f, + 0xb940fb9b, + 0x5e0264dc, + 0x4807f8d7, + 0x94f24103, + 0x41270125, + 0x2741f49b, + 0x0700003e, + 0x2740f39b, + 0x40f49b40, + 0xb940f49b, + 0x5e0264d4, + 0x4d27fcd5, + 0xf49b8000, + 0x64dcb940, + 0x39c3e002, + 0xa0c4e403, + 0xfdda99f8, + 0x0a0b0907, + 0x1a07a103, + 0x7dbe159b, + 0x0ff60118, + 0x91e003f8, + 0x3c2703f4, + 0x273b2b10, + 0x3bb12343, + 0x0fbc8343, + 0xab10bc33, + 0x9b4bab4f, + 0xdcb940f4, + 0x685e0264, + 0x9b4027f8, + 0xdcb941f4, + 0x745e0264, + 0xfed499f8, + 0xff194ff6, + 0x07fdad5e, + 0xab2c2b2b, + 0x9b31272f, + 0x420741f3, + 0x48334f6b, + 0x00004ea3, + 0x40f49b07, + 0x80004d27, + 0x0740f49b, + 0xf4022b0b, + 0xad01000d, + 0x9b4027fc, + 0x065e40f4, + 0x03b807f9, + 0x077481b1, + 0x07c59bcb, + 0xc51c0704, + 0x4ebe38f4, + 0x0c9b0118, + 0xf0c50fab, + 0xa69bf23c, + 0xa2c9f201, + 0x9b412701, + 0x3e2741f4, + 0x9b070000, + 0x402740f3, + 0xc140f49b, + 0xf3c138f0, + 0xf4032b3c, + 0xbd01000d, + 0x40f49b02, + 0x0264d4b9, + 0x27fbf45e, + 0x41f49b41, + 0x00003e27, + 0x40f39b07, + 0xf49b4027, + 0x40f49b40, + 0x0264dcb9, + 0x27f7d65e, + 0x9b80004d, + 0x7e5e40f4, + 0x9b4027fc, + 0xd4b941f4, + 0xc25e0264, + 0x031807fb, + 0x9b080711, + 0xbe090b15, + 0xf6011780, + 0x27fad60f, + 0x9b80004d, + 0xd3b940f4, + 0x4c270ab8, + 0x234b2b10, + 0x83343bb1, + 0xbc330fbc, + 0xab3fab10, + 0x40f39b3b, + 0x0264dcb9, + 0xe0f7665e, + 0x99031051, + 0x41e490d4, + 0xd71efe74, + 0xe090d499, + 0xe0034b41, + 0xe0032742, + 0x89031b44, + 0x312792d2, + 0x0741f39b, + 0x334f6b42, + 0x004ea348, + 0xf49b0700, + 0x9b302740, + 0x402740f3, + 0xb940f49b, + 0x5e0264dc, + 0x1103f72f, + 0x2bbe0907, + 0x01030117, + 0x01be1507, + 0x09d60117, + 0x272a91c0, + 0x9b80004d, + 0xd39940f4, + 0x104c27fd, + 0x4b2b3103, + 0x7c5e3f6b, + 0x071103ff, + 0x1700be09, + 0x07010301, + 0x16d6be15, + 0xd80fc601, + 0x80004d27, + 0xb940f49b, + 0xf40ab8d3, + 0xb9fdef32, + 0x5e0264dc, + 0x33e0f6cf, + 0x34e4fd8c, + 0x7c81f7ad, + 0xfd85c3f0, + 0xa103a807, + 0xb59bba07, + 0x5c0b5807, + 0x1b070507, + 0x0116eabe, + 0xacea0314, + 0x4127fd6b, + 0x0741f49b, + 0xbe1b0705, + 0x9b0116dd, + 0x040fe60b, + 0x07082b03, + 0x334f6b40, + 0x004ea348, + 0xf49b0700, + 0x9b402740, + 0x091b40f4, + 0x01000df0, + 0x4d270106, + 0xf49b8000, + 0x9b085340, + 0x4e5e41f0, + 0x103c27f7, + 0x42273b2b, + 0x235eb123, + 0x23a907f7, + 0x070a07a1, + 0x163ebe1c, + 0xa20bfa01, + 0x9b4127fe, + 0x1c0741f4, + 0x4fbe0a07, + 0xc09b0116, + 0x4f6b4c07, + 0x4ea34833, + 0x9b070000, + 0x302740f4, + 0xc140f39b, + 0xf4c138f0, + 0xf4042b3c, + 0xfd01000d, + 0x5e402700, + 0x4027fe3d, + 0x5e40f49b, + 0x4d27f716, + 0xf49b8000, + 0x9b385340, + 0xdcb941f3, + 0x1c5e0264, + 0x031807f6, + 0x9b080711, + 0xbe090b15, + 0xf60115dc, + 0xe4ff070f, + 0x5efe5a91, + 0x91e0ff00, + 0x41270171, + 0x2741f49b, + 0x0700003e, + 0xe040f39b, + 0x9900f851, + 0x41e090d4, + 0x402700f1, + 0xf040f49b, + 0x8f01009d, + 0x004d27fe, + 0x40f49b80, + 0x38533907, + 0xb941f39b, + 0x5e0264dc, + 0x4027f5b3, + 0xb940f49b, + 0x5e0264dc, + 0x0907f5bb, + 0x1b070123, + 0x0115a1be, + 0x4b9b4007, + 0x01035407, + 0x49075fab, + 0x452b0b9b, + 0xa407082b, + 0xafab0fab, + 0x5e40f0c5, + 0xf49bf9b6, + 0xf6535e40, + 0x07fdda99, + 0x0b3a0749, + 0x0731034a, + 0xb5130704, + 0x30f3c5f4, + 0x011543be, + 0x00b30ff6, + 0x00af91e0, + 0xb130f1c1, + 0xbe159bf0, + 0xf6011530, + 0x27fc570f, + 0x4b2b104c, + 0xc43bb123, + 0x330fbc83, + 0xcfab10bc, + 0xfc9bcbab, + 0x64dcb940, + 0xf5215e02, + 0x80004d27, + 0x5340f49b, + 0x41f09b08, + 0x0264d4b9, + 0x99f9305e, + 0xc1c090dc, + 0x84d4b9cb, + 0x784fc602, + 0x15070907, + 0x011536be, + 0x01230fab, + 0x4fab4007, + 0x42d00103, + 0x6002c06f, + 0x275d01dc, + 0x3b2b103c, + 0xb1234427, + 0x5e5e433b, + 0x004d27fc, + 0x40f49b80, + 0x27ff0e5e, + 0x0700004e, + 0x9940f49b, + 0x0907fdd1, + 0x1103010b, + 0xa5be159b, + 0x0ff60114, + 0x4d2700ed, + 0xf49b8000, + 0x9b402740, + 0xdcb940f4, + 0xb85e0264, + 0xb8d4b9f4, + 0xb142f40a, + 0xfa215efb, + 0x0ab8d4b9, + 0xfba642f4, + 0xe4f48a5e, + 0x07fb9fc2, + 0xe64f6b49, + 0x27fb974f, + 0x3b2b103c, + 0xb1234127, + 0xf65e433b, + 0x6651e4fb, + 0xfe8c5efb, + 0x490b4807, + 0x4f6b4b2b, + 0x4ea34833, + 0x9b070000, + 0x805e40f4, + 0x104c27f9, + 0x35074b2b, + 0xb123343b, + 0xca5e4307, + 0x9b4127fb, + 0x350741f4, + 0x38333f6b, + 0x00003ea3, + 0xf8a25e07, + 0x0284d4b9, + 0xfce14fe6, + 0x2792d289, + 0x41f39b31, + 0x4f6b4207, + 0x4ea34833, + 0x9b070000, + 0x3d2740f4, + 0xf39b8000, + 0xfcdc5e40, + 0xfcbd9fe6, + 0x8992d389, + 0x212794d4, + 0x3fab342b, + 0x0741f29b, + 0x334f6b43, + 0x004ea348, + 0xf49b0700, + 0x002d2740, + 0x40f29b80, + 0x432b4907, + 0x01004de8, + 0xf29bfcaa, + 0x9b487340, + 0xdcb941f4, + 0xd45e0264, + 0x9b4027f3, + 0x165e40f4, + 0x9b4027ff, + 0x090740f4, + 0x0dcc0b2b, + 0x9b290100, + 0xdcb940f4, + 0xc05e0264, + 0x07082bf3, + 0x074fab40, + 0x333f6b34, + 0x003ea338, + 0xb4070700, + 0x27f9625e, + 0x0700004e, + 0x27fd055e, + 0x5e80004d, + 0x0cc8f975, + 0x4e2710ff, + 0x2307ff00, + 0xf49bff0c, + 0xff0ccc40, + 0xab0833f7, + 0x000ea30f, + 0xf09b0700, + 0x4efe0b40, + 0x3ec107fc, + 0x0e0c07da, + 0xa7d41efc, + 0xfbffff3e, + 0x041834d1, + 0xefff2ea7, + 0x874fabfd, + 0x9004d544, + 0xd1432702, + 0xd502a401, + 0x81022024, + 0xbd412723, + 0xd8029804, + 0xd120e03c, + 0xd1088424, + 0x27065c22, + 0x2b201332, + 0xff4ea724, + 0x43d5fdef, + 0x210b0220, + 0x029402d5, + 0x2027fe0b, + 0x4ea73227, + 0xd5fdefff, + 0x0b022043, + 0x9402d521, + 0x0bfe0b02, + 0xc1f64efe, + 0xf0a3880e, + 0x70276027, + 0xde07b307, + 0xf715f605, + 0x9107a207, + 0xce078407, + 0xc11fdc73, + 0x03c17802, + 0xb2b1e07c, + 0x230b0700, + 0x73100701, + 0x9ebe1f1c, + 0x3d0700ef, + 0x2fbe2c07, + 0x480700f0, + 0x071f4c73, + 0x0be407d8, + 0xe8e14bd0, + 0x0700a9a1, + 0x271a0709, + 0x07210780, + 0x33410730, + 0x31531f2c, + 0x417332ab, + 0x14070307, + 0x41cc8103, + 0xd44536e9, + 0x0000003f, + 0x2d07e080, + 0x2c533d87, + 0xab4e871e, + 0x53230742, + 0x14871e2c, + 0x038712ab, + 0x144b030b, + 0xec53e007, + 0x07c1871e, + 0xab3b072b, + 0x73b087ce, + 0x0b0b1f3c, + 0xc3be1c4b, + 0x380700ef, + 0xc8203c23, + 0x61076330, + 0x7107637b, + 0x30c8787b, + 0x7b4a0741, + 0x07f40543, + 0x15387b3a, + 0x11f201f3, + 0x070607f3, + 0xef98be17, + 0x8ef08300, + 0x030e07f6, + 0x73100701, + 0xeebe1f1c, + 0x3d0700ee, + 0x7fbe2c07, + 0xd00700ef, + 0xa1ece107, + 0xa9e6ff5b, + 0x7b5e8027, + 0x204c27ff, + 0x2a07482b, + 0x243b3907, + 0x4207385b, + 0x24ab2307, + 0xb01ef205, + 0x2b204c27, + 0x07210748, + 0x5b243b60, + 0x1e62ab68, + 0x009ff492, + 0x24800000, + 0x5e8027ff, + 0xfb4eff46, + 0xbf6bb107, + 0x5e86fc93, + 0xd10df906, + 0x400006b2, + 0x2602c001, + 0xfb8e0d07, + 0x02a0c4b9, + 0xc0b94306, + 0xc49902a3, + 0x0b0f4b19, + 0x2f00c804, + 0x0cc8d007, + 0xdc27e334, + 0x8e0d0733, + 0xd0677efb, + 0xc019c399, + 0x03c01f01, + 0xcd02c41a, + 0x02a1c4b9, + 0xb9c64fc6, + 0x4b02a4c0, + 0xcc030b0f, + 0xd027d300, + 0xb156b71e, + 0x02a2c4b9, + 0xb9ae4fc6, + 0x4b02a5c0, + 0xcc030b0f, + 0xd027bb00, + 0x00009f1e, + 0x00000064, + 0xf793f54e, + 0x01065e0c, + 0x07f2a37c, + 0xb9c736a0, + 0xb9020800, + 0x7e0371a1, + 0xa0bdff6a, + 0xacd502aa, + 0xf2830284, + 0x00b9f58e, + 0xa1b90208, + 0x537e0371, + 0xbd4127ff, + 0xbd02aba0, + 0x9302aca4, + 0x06134ff3, + 0xd14433c1, + 0xd1037ca1, + 0x75017474, + 0x6071d5f3, + 0xcf34ce02, + 0x017473d5, + 0x0208a2b9, + 0x22e0f265, + 0x74d10724, + 0x73d10288, + 0x72990284, + 0xd5439b71, + 0x9301cc74, + 0x065d9bf1, + 0x40272786, + 0x31272027, + 0x021a14bd, + 0x021813bd, + 0x01c812d5, + 0x021914bd, + 0x01c412d5, + 0x01d01cd1, + 0x7120c1c8, + 0xbe1c07f0, + 0xf6011090, + 0x7e03630f, + 0x0ceedac3, + 0x3027035c, + 0x73d54027, + 0x74d501d4, + 0x749901d8, + 0x51fd9371, + 0x4ff6065d, + 0xa47e0649, + 0x87fe61da, + 0x6043f14e, + 0xc10006b4, + 0x3ce07cd4, + 0xd1068d33, + 0xe80188d3, + 0x61033731, + 0x3d2fe6f2, + 0x6c74c103, + 0x037542e0, + 0x01a474b9, + 0x5d1af393, + 0x99452606, + 0x4ff67134, + 0x402705fc, + 0x7e72749d, + 0x05e6cf13, + 0x01a674b9, + 0x5cfef393, + 0xd64ff606, + 0x9d402705, + 0xa67e7474, + 0xb905e6d5, + 0x9301a574, + 0x065ce7f3, + 0x05b04ff6, + 0x749d4027, + 0x3474d173, + 0xd5fd9301, + 0x41e0065c, + 0xf26104e6, + 0x0371abb9, + 0x44f94287, + 0x0006b460, + 0x02aaa4bd, + 0x023cddb9, + 0x0339adbd, + 0x053f2fe6, + 0xd5a073c1, + 0xc10298a3, + 0xa4d5a474, + 0x4ea7029c, + 0x99feffff, + 0xb47e094c, + 0x87c383d4, + 0x2bc4334c, + 0x4dcef9c4, + 0x12ff0000, + 0x71e0070e, + 0x23f471f1, + 0x7c72d112, + 0x23412b01, + 0x99429b41, + 0x70d1707d, + 0xe4d20184, + 0x0b32470e, + 0x2b430732, + 0xda112342, + 0xf471f64e, + 0x4d2b4103, + 0x40070412, + 0x0336aebd, + 0x026ca4d5, + 0x0270a1d5, + 0x01987ed1, + 0x0278aed5, + 0x01a871b9, + 0x02afa1bd, + 0x019c72d1, + 0x01a473b9, + 0x027ca2d5, + 0x01ac74b9, + 0x02b2a3bd, + 0x02b0a4bd, + 0x01a07ed1, + 0x01a571b9, + 0x0280aed5, + 0x01b072b9, + 0x02b3a1bd, + 0x02b1a2bd, + 0xb97c73c1, + 0xd501a672, + 0xc10290a3, + 0x73d18074, + 0xa4d501b4, + 0x71c10294, + 0x787ea930, + 0xb874d101, + 0x8ca1d501, + 0xc0a3d502, + 0x8873d102, + 0xa4aead01, + 0xc4a4d502, + 0xb4a2bd02, + 0x88a3d502, + 0xbc74d102, + 0x2073d101, + 0xc8a4d502, + 0xc07ed102, + 0x2474d101, + 0xd4aed502, + 0xc471d102, + 0xcca3d501, + 0xd8a1d502, + 0xc872d102, + 0xd0a4d501, + 0xdca2d502, + 0xcc73d102, + 0x95f19301, + 0xa3d5065b, + 0x74b902e0, + 0xa4bd0218, + 0x73d102e4, + 0x74d101d4, + 0x7ed101d8, + 0xa3d501d0, + 0xa4d502ec, + 0xaed502f0, + 0xf39302e8, + 0x07065d48, + 0xd532014a, + 0x1102f442, + 0xf84ed53e, + 0xd5322102, + 0x3102fc42, + 0x004ed53e, + 0x03324103, + 0x42d5143c, + 0x4c030304, + 0xd03fc414, + 0xd60006b4, + 0x018c13d1, + 0x0260a3d5, + 0x019014d1, + 0xa4d5f361, + 0x1ed10264, + 0xaed50194, + 0x3ff60268, + 0x149903dd, + 0xada4bd86, + 0x87129902, + 0x02aea2bd, + 0x23d86a7e, + 0x000d0801, + 0xff0c2701, + 0x0274a0bd, + 0x018074d1, + 0x5afafc93, + 0x004d1006, + 0xff4c2701, + 0x0275a4bd, + 0xbd89c199, + 0x890276a1, + 0x4ff620c4, + 0xc2d1041d, + 0xc4990258, + 0xa0a2d571, + 0x5cc3d102, + 0xa6a4bd02, + 0x44a3d502, + 0x60ceb903, + 0xbcaebd01, + 0x64c1b902, + 0xbda1bd01, + 0x68c2b902, + 0xbea2bd01, + 0x72c39902, + 0x0134ced1, + 0x02a7a3bd, + 0x1973c499, + 0xa8a4bdc3, + 0x74c19902, + 0xbd6cc2c1, + 0x610277a3, + 0xb8aed5f4, + 0xa9a1bd02, + 0x84a2d502, + 0x204ff602, + 0x9cccb903, + 0x38acbd02, + 0x9471d103, + 0xff4ea702, + 0xa1d5ffff, + 0x72d1033c, + 0x1c270298, + 0x40a2d512, + 0xac40d103, + 0xbe012316, + 0xf9010dc7, + 0x0016b004, + 0x4df193ff, + 0x4586065a, + 0x018014d1, + 0x14d54103, + 0x14d10180, + 0x30270180, + 0x139d4123, + 0x7812c171, + 0x14d5f371, + 0x23ee0180, + 0x7499036f, + 0x88709989, + 0x5a1ef393, + 0x2b04e206, + 0x8034d1fc, + 0x234ff601, + 0x9df283fc, + 0xf58e8930, + 0xeed7627e, + 0x61fcadc0, + 0xa74ff6f4, + 0xfc985efc, + 0x1ff6f161, + 0x4027fccd, + 0x023c74bd, + 0xd1d7467e, + 0x93018074, + 0x0659e3f2, + 0x04c246c6, + 0x88239912, + 0x30ea4007, + 0x4cf40886, + 0x9d08783d, + 0x40278924, + 0x74d53027, + 0x202701b8, + 0xd56c74c1, + 0xd5018070, + 0xd501b473, + 0xe401bc72, + 0x93fc8f42, + 0x0659abf4, + 0x71704399, + 0x55432bf4, + 0x0f4c83f4, + 0x3407e407, + 0xe3333633, + 0xe42be30b, + 0x58eaf393, + 0x33330106, + 0x0b4e07e3, + 0x85f34543, + 0x3841b9fe, + 0x3c44d111, + 0x33f11511, + 0xe0f40543, + 0x41096912, + 0x27f481f3, + 0xd1430b90, + 0x11114443, + 0x878307f4, + 0x444bf144, + 0x950006b4, + 0x07db07f4, + 0x1fdc73cb, + 0x02ff3ff6, + 0x1d070b07, + 0x40273107, + 0x349634ab, + 0x6c07c007, + 0x6b0bfe11, + 0xeff66173, + 0xf48105e2, + 0x410bf141, + 0x11484dd1, + 0x021c7dd5, + 0x4d473027, + 0x02ed39ea, + 0x02e539ee, + 0x49ea4027, + 0x49ee0793, + 0x4d07078b, + 0x41533027, + 0x091b39ea, + 0x091339ee, + 0x1a270d07, + 0x010c6cbe, + 0x49ea4027, + 0x49ee0bbd, + 0xf4110bb5, + 0x4433fe91, + 0x4f034e0b, + 0x0006b2b8, + 0x01ec43d1, + 0xc173c30b, + 0x01ec4cd5, + 0x04016de8, + 0x6d270573, + 0xfc910400, + 0xfb81f141, + 0x029074d1, + 0xb2b8cf03, + 0xb10b0006, + 0x018cc6d5, + 0x1154b2d1, + 0x30271407, + 0x1c730407, + 0xe8b3be1f, + 0x8c74d100, + 0x07340702, + 0x1f3c7324, + 0x00e8a4be, + 0xe107f201, + 0x0198c2d5, + 0x1158b2b9, + 0x41073007, + 0x5310ec33, + 0xc2d5103c, + 0x3eab01a8, + 0x4c532027, + 0x001d2710, + 0x4b310b80, + 0x33240742, + 0x3c53102c, + 0x0132ab10, + 0x93f32570, + 0x065857fd, + 0x02a404e0, + 0x2ff6f211, + 0x4ea70340, + 0xd1ffffff, + 0x07188045, + 0x875d0335, + 0xe3250702, + 0x2ce37f3c, + 0x875d237f, + 0x03341902, + 0x32c2803c, + 0x41f481f9, + 0xa9430bf3, + 0xe6116c44, + 0x81063e4f, + 0x03fe41fc, + 0x0b1170cd, + 0x071407ce, + 0x2780272c, + 0x27230190, + 0x4b830b40, + 0x98240394, + 0x41f681f1, + 0x0be027f4, + 0x27d50764, + 0x5efe35b0, + 0xf1610200, + 0x01681ff6, + 0x0198dcd1, + 0x060acff6, + 0x73d1e027, + 0x72d10164, + 0x4307016c, + 0xf193422b, + 0x0c0657cc, + 0x73401340, + 0x27440841, + 0x13231243, + 0x6012d140, + 0x0b342b01, + 0xd5430724, + 0xd5016413, + 0x23016012, + 0x03245a41, + 0x07421242, + 0x994e0b42, + 0x74d58673, + 0x72990160, + 0x07435a87, + 0x07421234, + 0xa872b932, + 0x6073d501, + 0xaaa2bd01, + 0x3c73b902, + 0x71abb902, + 0x39a3bd03, + 0x1f4d2703, + 0xe43c2701, + 0x0298a4d5, + 0x029ca3d5, + 0x61fac15e, + 0x51e1c0fe, + 0x00c5bfe6, + 0x029dc3b9, + 0x74b93f4b, + 0x4f4b029c, + 0xa4bd431b, + 0xce5e0338, + 0x841e99fc, + 0x02adaebd, + 0xbd851199, + 0x5e02aea1, + 0x3499fc24, + 0x4d4fe671, + 0x9d4127fa, + 0x4a5e7334, + 0x733499fa, + 0xfa274fe6, + 0x349d4127, + 0xfa245e74, + 0x349d4127, + 0xfa055e72, + 0xa4bd4027, + 0x8e5e0338, + 0x274027fc, + 0xd5c02730, + 0xd5022cd4, + 0xd50238d4, + 0xd50228d3, + 0xd50234d3, + 0x7e0230dc, + 0x1007d443, + 0x277cd2c1, + 0x1f1c7330, + 0x00e6ecbe, + 0xd4bd4027, + 0xd0d5023c, + 0xd1d50220, + 0xdcd50224, + 0x985e01c0, + 0xc8d77ef9, + 0x0337a0bd, + 0xc1fbdd5e, + 0x41e46c14, + 0x4227fc8e, + 0x5e6c14c5, + 0x049bfc86, + 0x0188d3d1, + 0x34f24047, + 0x4127f96f, + 0x023cd4bd, + 0xb9f96a5e, + 0x4b029ec3, + 0xff3c5e3f, + 0xe4c8a07e, + 0x27f8d902, + 0x5ef36531, + 0xd3d1f8d2, + 0xd4990168, + 0x85d09984, + 0x4007345a, + 0x43070312, + 0x74d5fe61, + 0x4e870168, + 0xb46044f9, + 0xabb90006, + 0xa4bd0371, + 0x71b902aa, + 0xa1bd023c, + 0x9d5e0339, + 0x27f001f9, + 0x53400710, + 0x1833184c, + 0x14ab2307, + 0x08333907, + 0x00eeeabe, + 0xe2fcef5e, + 0x11fd1b84, + 0x33fe91f4, + 0x034e0b44, + 0x06b2b84f, + 0xdc43d100, + 0x73c30b01, + 0xdc4cd5c1, + 0xfd425e01, + 0x53650c28, + 0x01f7f7f1, + 0x6b430713, + 0x08d49d4f, + 0x64a9f231, + 0x230b116c, + 0xf235b103, + 0xd103c403, + 0x04134bf2, + 0x4027c101, + 0x31870107, + 0xab1e0c53, + 0x53230740, + 0x14871e2c, + 0x038712ab, + 0x144b030b, + 0x2c532007, + 0xab41871e, + 0x0b308742, + 0x07144b03, + 0xbe390728, + 0x0700e666, + 0xa501cc30, + 0x41273127, + 0xf311ac1e, + 0x064531e0, + 0x01d074d1, + 0xf393f251, + 0xd20655a0, + 0x34d10d24, + 0x45160134, + 0x34d54127, + 0xe87e0134, + 0x89fd93d2, + 0x30070655, + 0x019874d1, + 0x014c71d1, + 0x015072d1, + 0x0c030d07, + 0xf5b37ea8, + 0x013474d1, + 0x015c70d5, + 0x05c441e0, + 0x01acd4d1, + 0x01a8ded1, + 0x0164d4d5, + 0x0160ded5, + 0x016073d1, + 0x99867499, + 0x345a8772, + 0x23124207, + 0x73d14307, + 0x7d990164, + 0x6074d584, + 0x85749901, + 0xd4073d5a, + 0xd3074312, + 0x7dd5f111, + 0x11e40164, + 0x7c7efcd4, + 0x511007d2, + 0x0889bef0, + 0x93012401, + 0x065513f4, + 0x016c4dd5, + 0x02307dd1, + 0xeed2627e, + 0x11048e0d, + 0x822ff6f2, + 0x27402701, + 0x3874d530, + 0xb874d502, + 0x3473d501, + 0x3072d502, + 0xb473d502, + 0xbc72d501, + 0xddf79301, + 0x74d10654, + 0x410301c0, + 0x034c44ec, + 0x74d5f311, + 0x73d501c0, + 0x73d501c4, + 0x7dd101c8, + 0xd1c801d0, + 0x07f05120, + 0x07d6be1d, + 0x260ff601, + 0xd2097e01, + 0x011f0dee, + 0x40273027, + 0x01d473d5, + 0x01d874d5, + 0x01d473d1, + 0x01d874d1, + 0xe027fd01, + 0x4e4b3d0b, + 0x01bc72d1, + 0x01d473d5, + 0x01d874d5, + 0x547ef993, + 0x1b20c806, + 0x01b493d1, + 0x01b894d1, + 0x3d0b2103, + 0x93d54e4b, + 0x94d501b4, + 0x92d501b8, + 0x9bd101bc, + 0x9cd10234, + 0x93c10238, + 0x3090d17c, + 0x2891d102, + 0x2c92d102, + 0x0b402702, + 0x2bce4bbd, + 0x0be46bd3, + 0x03e24bd1, + 0x20988901, + 0x02349bd5, + 0x02389cd5, + 0x023090d5, + 0x02289dd5, + 0x022c9ed5, + 0x033b8ff6, + 0x07c9847e, + 0xc96b7ed0, + 0xdff604c6, + 0x402702cb, + 0x118c749d, + 0x4d4ff6f4, + 0x1f1d2701, + 0xe42c2701, + 0xc1a074c1, + 0x4103a473, + 0x410b3103, + 0x4153320b, + 0x72d13153, + 0xf1510184, + 0xc5a074c5, + 0x12faa473, + 0xf493f6bc, + 0xd10653d8, + 0xc801d04d, + 0x01071dd1, + 0xe9be1d07, + 0x0ff60106, + 0x1c7e03ae, + 0xa70deed1, + 0x3074c103, + 0x74d54373, + 0x74d10188, + 0xfe010188, + 0x0b7c73c1, + 0xd5432b4e, + 0x07018874, + 0x004fec34, + 0x39400000, + 0x95f49302, + 0x43d50653, + 0x6d5e0188, + 0xd0e57ef6, + 0xfeead0ee, + 0x1ff6f111, + 0xd55efee4, + 0xc473d1fe, + 0x75f29301, + 0x30e80653, + 0x24d1feae, + 0xfe2101c8, + 0x3e0b4103, + 0x01c824d5, + 0x01c423d5, + 0xecfe995e, + 0xfa90406c, + 0x5e406c27, + 0xf211fa8a, + 0x534af593, + 0x1c7dd106, + 0x2121e402, + 0x2b4c07fa, + 0x8140e84b, + 0x33048706, + 0x87040b44, + 0x07040b40, + 0x066cbe1b, + 0x07b00701, + 0x321c270d, + 0xbe310c03, + 0x41010691, + 0x1bf481f3, + 0xd1430b0d, + 0xc2114c43, + 0xbccc1d03, + 0x54b91928, + 0x41030219, + 0x3f6b3407, + 0x3a273b08, + 0x54bd4027, + 0x53bd021a, + 0xbce80219, + 0xb9059129, + 0x93021a74, + 0x0652e3f2, + 0x34074103, + 0x3b083f6b, + 0x40273a27, + 0x021924bd, + 0x021a23bd, + 0x021a74b9, + 0x52c6f393, + 0x7d46f406, + 0x1c3dd105, + 0xf99a5e02, + 0xcf6bfc21, + 0xbe47fe11, + 0xb346b4e9, + 0x4de00006, + 0x017bffff, + 0x01774cee, + 0xe407f191, + 0xb34c10f1, + 0x2c070006, + 0x029a4ce2, + 0xf0013007, + 0x41034207, + 0x1d27d027, + 0x2e1b011f, + 0x063be4ea, + 0x0637efe6, + 0x4c034307, + 0x003ee880, + 0x017f0800, + 0x419b4873, + 0xd1033407, + 0x03e2f248, + 0x3fe605be, + 0xe02705ba, + 0x1d272027, + 0x4307011f, + 0xe8804c03, + 0x0800003e, + 0x21030137, + 0x419b4873, + 0x2dee3407, + 0x0402013c, + 0x4d0740d6, + 0x24024153, + 0x4e07e103, + 0x749d4f6b, + 0x91f1018c, + 0x8c7299fe, + 0xb346bced, + 0xe1f50006, + 0x0006b34c, + 0xe68d749d, + 0x27fe0c2f, + 0x27011f4d, + 0x0407e43c, + 0x4ee81307, + 0xe2080000, + 0x804c0300, + 0x409b4873, + 0x00003ee8, + 0x0300ca08, + 0x3873803c, + 0xf208319b, + 0x23071407, + 0x35fde35e, + 0x05f331f4, + 0xfcca5e53, + 0x0130d4d1, + 0xf11e4ce4, + 0xcf257ef9, + 0xd1d13007, + 0xd2d1014c, + 0x0d070150, + 0x0c034c07, + 0xf1f77ea8, + 0x013cd4d1, + 0x050240fa, + 0x0138d4d1, + 0x04123027, + 0xe3073127, + 0x014474d1, + 0x04f304fa, + 0x5196f493, + 0x4043d106, + 0xb330f201, + 0x5ee0a7f9, + 0x4327f9ae, + 0xe2fcb35e, + 0x11f8758d, + 0x33f191f4, + 0x03410b44, + 0x06b2b84f, + 0xe043d100, + 0x73c30b01, + 0xe04cd5c1, + 0xf8925e01, + 0xffff3f27, + 0xc25e3fff, + 0x3c4c27fd, + 0x5e89249d, + 0x4307f786, + 0x7c3d4cf0, + 0x7eef1ef7, + 0xf411c6a3, + 0x4ff66007, + 0xfe510325, + 0x02647ed5, + 0x74d5f401, + 0x1f5e0280, + 0x8d7499fd, + 0x9bfefd5e, + 0x803c0331, + 0x375e3873, + 0x03409bff, + 0x4873804c, + 0x07ff1f5e, + 0x03419b43, + 0x4873804c, + 0x34072103, + 0xfec8d2ee, + 0xfec804e2, + 0x2027e103, + 0xfebee6e4, + 0xc75e4627, + 0x9b4307fe, + 0x804c0341, + 0x7d5e4873, + 0xc2f77efe, + 0xf27e0120, + 0xbd03e4c2, + 0xe0f211fc, + 0xd103d122, + 0x27019c7c, + 0x27b027d0, + 0x87280710, + 0xf843f141, + 0x030006b4, + 0x88b30b11, + 0x074c07f2, + 0x184c533d, + 0x38330807, + 0x34ab2c07, + 0x01032833, + 0xb2be1027, + 0x2b0700e0, + 0x2c0b3027, + 0x48be3d4b, + 0x0dec00e9, + 0x00df0100, + 0x01000d27, + 0x025873d1, + 0x430b4347, + 0x0273040b, + 0x025870d5, + 0x93fc5b5e, + 0x065073f4, + 0x077c42c1, + 0x0730271d, + 0x1f1c730d, + 0x00e074be, + 0x27142c27, + 0x07500730, + 0xe100be61, + 0x51fe9300, + 0xecd10650, + 0x8007022c, + 0xebd19107, + 0xc1e80228, + 0x4c07032a, + 0xec07db07, + 0x531f4c33, + 0xabe173d1, + 0x669edad4, + 0x07609ece, + 0x2b460735, + 0xd54e6b3d, + 0xd5022073, + 0x5e022474, + 0x707efb17, + 0x5fd0eecd, + 0xf6f211fc, + 0x5efc592f, + 0x1a7efc4d, + 0x9402e4c2, + 0x152127f6, + 0xf68d5ef2, + 0x0343c4e2, + 0x2407f301, + 0x615eec07, + 0xed84e2fd, + 0x91f411f6, + 0x0b4433f2, + 0xb84f0342, + 0xd10006b2, + 0x0b01e443, + 0xd5c173c3, + 0x5e01e44c, + 0xd8c2f6fc, + 0x0735079f, + 0x6b382b46, + 0xbdf19349, + 0x13d5064f, + 0x14d50220, + 0xb05e0224, + 0x010de8fa, + 0x27ff2304, + 0x5e04000d, + 0xd4d1ff1c, + 0x04f20148, + 0x012702d3, + 0x017074d1, + 0x4f92f193, + 0xb74ff606, + 0x6414d102, + 0x6c12d101, + 0xd5400b01, + 0x23016414, + 0x1234072a, + 0x99320724, + 0x13d57014, + 0x41530164, + 0x017014d5, + 0xd1fa135e, + 0xe80130d4, + 0x027f1e4c, + 0x012cd0d1, + 0x0120dbd1, + 0x21f12087, + 0x0006b360, + 0x0124dcd1, + 0x31074107, + 0x2b1f4c73, + 0x03c46bb3, + 0x1e1c2701, + 0x0120dbd5, + 0x0124dcd5, + 0x01024fbe, + 0x012cd0d5, + 0x74d1fc01, + 0x72d10128, + 0x73d10120, + 0xdc070124, + 0x071fdc73, + 0x4b2c0b04, + 0x0344873d, + 0x1e1c2701, + 0xb3604cf5, + 0x72d50006, + 0x73d50120, + 0x19be0124, + 0x74d10102, + 0x70d50130, + 0xf6930128, + 0xe8064eec, + 0xf93e1e4c, + 0x4d072c07, + 0x331d2c53, + 0xab3c0743, + 0x07333342, + 0x2b940783, + 0x079d6b8c, + 0x2068d5e0, + 0x2469d501, + 0xe8e12301, + 0x870276e0, + 0x6021f12e, + 0x070006b3, + 0x332107be, + 0x07212b23, + 0x1f4c7342, + 0xd407c207, + 0xd94bc80b, + 0x6cd5b123, + 0x6dd50120, + 0xb0e80124, + 0x2b870245, + 0xb36021f1, + 0xeb070006, + 0x210b2147, + 0x4c734207, + 0x0702071f, + 0x4b0c0b14, + 0xd5e1231d, + 0xd5012060, + 0xe8012461, + 0x870216e0, + 0x6042f14e, + 0x270006b3, + 0x0b3247db, + 0x73430732, + 0x300b1f4c, + 0x63d5414b, + 0x64d50120, + 0xe1230124, + 0x872ae0c8, + 0x6040f14e, + 0xd10006b3, + 0xd1012071, + 0x07012472, + 0x73300740, + 0x310b1f4c, + 0x73d5424b, + 0x74d50120, + 0xfdf00124, + 0xf8765ed6, + 0x1e1eec03, + 0xd1c007d3, + 0x0b026474, + 0x07f051cd, + 0x23042b3c, + 0x05fb9331, + 0x03e2064e, + 0x0c2bfccc, + 0x68be1c07, + 0xd0e20101, + 0xb4b9fcc0, + 0xf101027c, + 0x41033487, + 0x31f54f6b, + 0x0006b520, + 0x027cb4bd, + 0x4027482a, + 0x027cb4bd, + 0x0280b8d1, + 0x90270d07, + 0x2027d027, + 0x43f14287, + 0x0006b520, + 0xd30b2103, + 0x4807f088, + 0x4c531907, + 0x07183318, + 0xab2c0708, + 0x33302714, + 0xddb7be08, + 0x07b00700, + 0x072807c1, + 0x27060739, + 0xdda7be10, + 0x272d0700, + 0x4b200b30, + 0x070b0731, + 0xe639be1c, + 0x81f29300, + 0x0d08064d, + 0x0d270101, + 0x24d10100, + 0xfc21025c, + 0x340b3447, + 0x0273030b, + 0xcf6b4027, + 0xd58c249d, + 0x5e025c20, + 0x74b9faa8, + 0x46f00219, + 0x3027fa88, + 0x4d4ef493, + 0x1843bd06, + 0xfa7a5e02, + 0x021c3dd1, + 0x34bd4127, + 0x195e0218, + 0x4b80e2f4, + 0x91f411f4, + 0x0b4433f3, + 0xb84f0343, + 0xd10006b2, + 0x0b01e843, + 0xd5c173c3, + 0x5e01e84c, + 0xc4d6f448, + 0xfcd4b1f4, + 0x4cab4b07, + 0x276d4fd6, + 0x5ee027d0, + 0x94b9fcdb, + 0xfe010254, + 0x41033487, + 0x3ef54f6b, + 0x0006b4f8, + 0x025494bd, + 0xfc1948ea, + 0x94bd4027, + 0x105e0254, + 0xd54103fc, + 0x5e0130d4, + 0x41e8fdb0, + 0x4123f780, + 0x017014d5, + 0xd1f7775e, + 0x270140d4, + 0x27401231, + 0x23030730, + 0xfd225e01, + 0x7e5e4013, + 0x27f301f9, + 0xfa4c5ed0, + 0x095ee227, + 0x5ee1a7fb, + 0x4027f4ca, + 0x07fa755e, + 0x1f4c734c, + 0x1c531407, + 0x0b20271f, + 0x072c4b1b, + 0x07310702, + 0x1f0c3342, + 0x10273153, + 0x30ab2027, + 0x182b4173, + 0xd307296b, + 0x423ae407, + 0xfc4542ee, + 0xfc4113e2, + 0x49073807, + 0x464b350b, + 0x022073d5, + 0x022474d5, + 0x03f7565e, + 0xe85e1eec, + 0x1ebc03fd, + 0x03fdb95e, + 0x885e1eec, + 0x5e2127fd, + 0xfa4ef9c8, + 0xc027329b, + 0xb1072107, + 0x33182c53, + 0xab4027c8, + 0x07b833c2, + 0x072307a0, + 0x0734070b, + 0xe4d1be1c, + 0x87ea0700, + 0x2be4334a, + 0x33ea0be4, + 0x03d007e4, + 0x01947cef, + 0x27002700, + 0xe41133bc, + 0xe403e201, + 0x3407420b, + 0x0b1f3c53, + 0x3a317334, + 0x4001033d, + 0x4efa8efb, + 0xc5f563f5, + 0xf09930f0, + 0xddfd937c, + 0x4f6b064b, + 0xc540f4c5, + 0xd48944f0, + 0x50d0891c, + 0xf045f435, + 0x891ed489, + 0xf2c552d0, + 0x39f29338, + 0xf4550601, + 0x22c1f065, + 0x20d48944, + 0xc554d089, + 0xf2253cf3, + 0x7534f1c5, + 0x99f085f4, + 0xdec118d4, + 0x99f49564, + 0xd3014cd0, + 0xd2c1f0a5, + 0x80e0e834, + 0x30d4c106, + 0x4eee1027, + 0x41070672, + 0x140741c3, + 0xd0c11f6b, + 0x68d4993c, + 0x2150f0c5, + 0xc1d811de, + 0xd79938dc, + 0x40db990c, + 0xdac1d651, + 0xc1d54148, + 0x4ff644d9, + 0x412705c9, + 0x06d923ee, + 0x2407f021, + 0x0ff64127, + 0xf33105ee, + 0x42abf041, + 0x03ee2127, + 0xf3510652, + 0x42abf061, + 0x03ee2127, + 0xf3710654, + 0x42abf081, + 0x03ee2127, + 0xf3910656, + 0x42abf0a1, + 0x03ee2127, + 0xf3c10658, + 0xab42ab50, + 0xee212714, + 0x2706873e, + 0xbb1fe641, + 0x2742ab05, + 0x4e8cee31, + 0x2743ab06, + 0x507bee21, + 0x2742ab06, + 0x526aee31, + 0x2743ab06, + 0x5459ee21, + 0x2742ab06, + 0x7e4ff630, + 0x84d4d105, + 0x30f0c102, + 0x04eef305, + 0x2127055a, + 0xf2c1f2b5, + 0x30f3c134, + 0x0288d2d5, + 0x0284d3d5, + 0x4abafd93, + 0x0d1c2706, + 0x2d073d07, + 0x07343c03, + 0x23300141, + 0x03200511, + 0x98240334, + 0x20d289f4, + 0xf2154027, + 0x029cd1bd, + 0x029ed4bd, + 0xbd69d49d, + 0x93029dd4, + 0x064a87fc, + 0x05502ff6, + 0xc4bd4327, + 0xd4b9029c, + 0xfc9302a0, + 0x46064a74, + 0xa3c3b945, + 0x9cc3bd02, + 0xa1c4b902, + 0xb9454602, + 0xbd02a4c4, + 0xb9029dc4, + 0x4602a2c4, + 0xa5c0b945, + 0x9ec0bd02, + 0xb9302702, + 0xd502a6c4, + 0x460294c3, + 0xa8c2d145, + 0x94c2d502, + 0xacc4b902, + 0x98c3d502, + 0xd1454602, + 0xd502b0c3, + 0x7e0298c3, + 0x0506c249, + 0xc4bd4027, + 0xf4c1029c, + 0xc14d7630, + 0x0cd634f0, + 0x4027c005, + 0x02b4d2d1, + 0x936cd4c5, + 0x064a03f3, + 0xffff2fc0, + 0x272affff, + 0x19329d41, + 0x02a234bd, + 0x029e32b9, + 0x02a034bd, + 0x02a134bd, + 0x029d30b9, + 0x029c34b9, + 0x02a532bd, + 0x02a334bd, + 0x02a430bd, + 0xf58ef543, + 0xf493d801, + 0xc60649c8, + 0x47b1b58f, + 0x30274291, + 0xa0279707, + 0x00002f30, + 0x2f274000, + 0x3fffffff, + 0x42073027, + 0x02071307, + 0x33104c53, + 0x14ab101c, + 0x07100c33, + 0xbe3a0729, + 0xf000e247, + 0x27048711, + 0xffffff0f, + 0xc5dba13f, + 0xc0277cd0, + 0xbff45007, + 0x40000000, + 0x4b07043b, + 0x4c531c07, + 0x101c3310, + 0x29070b07, + 0x0c3314ab, + 0xbe3a0710, + 0xc100e213, + 0xd0c530d2, + 0x1320e880, + 0xc925fa05, + 0x73420706, + 0x32071f4c, + 0x044d41f0, + 0xffff3f27, + 0xf0933fff, + 0xc105feb8, + 0x6307440b, + 0xd3c56373, + 0x88d6d530, + 0x84dbd501, + 0xe0c30701, + 0x0704d284, + 0xbe15070c, + 0xe800fc91, + 0x08052101, + 0x2701000d, + 0xf493ff0c, + 0x9d06490c, + 0xd2998840, + 0x89d29d88, + 0xa7c11a7e, + 0xfeffff4e, + 0x6b094399, + 0x8733830f, + 0x2b343343, + 0x4d34f934, + 0x99ff0000, + 0x400218d1, + 0x04e00407, + 0x03e00486, + 0x0123047d, + 0x4f6b4007, + 0x42f00103, + 0x3ebe0471, + 0x010300fc, + 0x2f6b2007, + 0x0144f3c1, + 0x70d29df4, + 0xf19343ab, + 0x270648b4, + 0x27448630, + 0xabf4b131, + 0x094fe643, + 0x38f4c103, + 0x43330c07, + 0x14d5460b, + 0x01730188, + 0x061504f2, + 0x3027b123, + 0x4127b20b, + 0x01002d27, + 0x12d50027, + 0x14c50194, + 0x781bc56c, + 0x9d71149d, + 0x139d7413, + 0x73139d72, + 0x018c12d5, + 0x019012d5, + 0x40873007, + 0x430b3433, + 0xb2b84f03, + 0x30270006, + 0x01ec43d5, + 0x01dc43d5, + 0x01e043d5, + 0x01e443d5, + 0x01e843d5, + 0x03c40103, + 0x40f0c1d8, + 0x6127d421, + 0x60270496, + 0x482ef293, + 0xdd40e806, + 0x11140704, + 0x84219d24, + 0x27344c08, + 0x3407334c, + 0x9d0c2499, + 0x4fe68523, + 0x2351041f, + 0x049030e8, + 0x239d2441, + 0x344cec86, + 0x249d0472, + 0x004d2787, + 0x5cd4d501, + 0x58d4d502, + 0xedfc9302, + 0x447e0647, + 0x2002e8c5, + 0xf6f21105, + 0xd1047d2f, + 0x070294d4, + 0xe84a26a5, + 0x08046a41, + 0x4c27654c, + 0x07c40764, + 0x1fcc73b4, + 0x07c51e7e, + 0x27209b25, + 0x070b0730, + 0xd7c7be1c, + 0x642c2700, + 0x57be3027, + 0x501200d8, + 0xd4d1a007, + 0x1a070258, + 0x24073407, + 0x3c730a07, + 0x1f1c731f, + 0x00d7a4be, + 0x27807c27, + 0x4b070b80, + 0x07410718, + 0x184c33b0, + 0xb4abb853, + 0xc130f2c1, + 0x460734f3, + 0x1b070127, + 0x99fb317e, + 0xe00784d4, + 0x4766fa93, + 0x07401206, + 0x85a499e4, + 0xe407e412, + 0x0188a0d1, + 0xd130a1c1, + 0x2b0294a9, + 0x73210710, + 0x42071f2c, + 0x0c530107, + 0x07473319, + 0x3340ab31, + 0x4b370b37, + 0x33240748, + 0x3853182c, + 0x019cabd5, + 0x01acaed5, + 0xa30732ab, + 0x91e89d46, + 0x490703a7, + 0x27659c08, + 0xc407644c, + 0xcc73b407, + 0xc4657e1f, + 0x277cd4c1, + 0x07409b30, + 0x070b0724, + 0xd70bbe1c, + 0x27302700, + 0x9bbe642c, + 0xd4d100d7, + 0x30070298, + 0x033345d6, + 0x1a27030b, + 0x00fa21be, + 0xa3123007, + 0xf2c1a307, + 0x34f3c130, + 0x1a074607, + 0x8b7e0027, + 0x7cd4c1fa, + 0x0258ded1, + 0x3e071407, + 0x04072e07, + 0x731f3c73, + 0xc2be1f1c, + 0x3c2700d6, + 0x0b402780, + 0x07414b30, + 0x182c3324, + 0x32ab3853, + 0xf2c11307, + 0x34f3c130, + 0x01274607, + 0x07fa517e, + 0xc3e57ec0, + 0x15190ccc, + 0x0c271007, + 0xf9c0be1e, + 0x0b00e800, + 0x100cec03, + 0xc00b02ec, + 0x03030c07, + 0xd586d499, + 0x0701acd0, + 0x61f29330, + 0x40120646, + 0x24993407, + 0x07341287, + 0x84249934, + 0x40121207, + 0x14990407, + 0x07041285, + 0xa823d504, + 0xac20d501, + 0x982ad501, + 0x9cded101, + 0xe43c2701, + 0xd3c52e07, + 0xacd3d1a4, + 0xa7215301, + 0x1f4d27c0, + 0x84d1d101, + 0xd5b02702, + 0xc50250d2, + 0xded5a0d4, + 0xd3d501a0, + 0xd2d501b0, + 0xd2d50240, + 0xd2d50244, + 0xd2d50248, + 0xdc8d024c, + 0x92dc8d8e, + 0x2790dc8d, + 0x0100000e, + 0xbd8ddb9d, + 0xbe0254db, + 0xd100f959, + 0xd50288d1, + 0x27028cd0, + 0x0100000e, + 0x00f948be, + 0xd534f4c1, + 0xd50290d0, + 0x7e017cd4, + 0x4027c31f, + 0xd52edc89, + 0xd50180d0, + 0x7e01d0d4, + 0xc012c30f, + 0x131e0ce8, + 0xd0d0d502, + 0x93d40101, + 0x0645a3f1, + 0x01c144e0, + 0x433cf2c1, + 0xd52333f5, + 0x8e0178d2, + 0x8df493f5, + 0x30270645, + 0x2768439d, + 0xc1f40541, + 0xd4d130f0, + 0x40ee0284, + 0xf493faaa, + 0xd1064574, + 0xc1028843, + 0x402734f0, + 0x4127030e, + 0x975ef4b5, + 0x5e3127fa, + 0xf331fa81, + 0x4027f041, + 0x212742ab, + 0xfa1430ee, + 0x4027611e, + 0x312742ab, + 0xfa47c8ee, + 0x2700905e, + 0xffffffbf, + 0x5ec0273f, + 0x467efbbe, + 0xad02e0b7, + 0xbf01e0fa, + 0xbd472700, + 0x27029ec4, + 0xbd452732, + 0xbd029cc3, + 0x5e029dc4, + 0x1127fa9a, + 0x27f98d5e, + 0xf9905e10, + 0xfb7f1ff6, + 0x00000ff0, + 0xfb774000, + 0xf6fb6e5e, + 0xf0fbb94f, + 0x0000002f, + 0x5efbb140, + 0xf351fba8, + 0x2027f061, + 0x212742ab, + 0xf9b030ee, + 0xf081f371, + 0x42ab2027, + 0x30ee2127, + 0xf391f9ae, + 0x2027f0a1, + 0x212742ab, + 0xf9ac30ee, + 0xf3c12027, + 0xab42ab50, + 0xee212714, + 0x1ef9aae3, + 0xab30272c, + 0xee212743, + 0x27f9b4b7, + 0x2742ab20, + 0xb2a6ee31, + 0xab3027f9, + 0xee212743, + 0x27f9b095, + 0x2742ab20, + 0xae4fe630, + 0xff275ef9, + 0x41272027, + 0xf97b1ff6, + 0x21ff315e, + 0x074027f0, + 0xe6412724, + 0x5ef9290f, + 0x4527ff12, + 0xc4bd3227, + 0xc3bd029e, + 0xe35e029c, + 0x5e2427f9, + 0x2627fb98, + 0x07fb935e, + 0x108c5387, + 0x481e8cd4, + 0x5e88d89d, + 0x84e0fb3e, + 0x82e000f9, + 0x0c2700ba, + 0x0710271e, + 0xbe302725, + 0x3400d441, + 0x1015d611, + 0x0000000f, + 0xff0f2740, + 0x933fffff, + 0x05f997f3, + 0x07443bc1, + 0x07637360, + 0x30d0c5c0, + 0x0188d6d5, + 0x0184dbd5, + 0x07fae25e, + 0xbe15070c, + 0xcc00f771, + 0x01270f01, + 0x9dfae55e, + 0x219d8723, + 0xfbef5e86, + 0xd7790ce8, + 0x780c27fa, + 0x27fad15e, + 0x3c27504c, + 0x4814d564, + 0x8010c101, + 0x276e4c27, + 0x3813d520, + 0x3c14d501, + 0x3c3c2701, + 0xd51e4c27, + 0xd5016c12, + 0xd5014013, + 0xd5014414, + 0xd5013412, + 0xd5014c10, + 0xd5015012, + 0xd5015c12, + 0x5e017012, + 0xf493fe00, + 0xd5064398, + 0x5e01d04c, + 0x4c27fde9, + 0xfb8c5e33, + 0x5e0f0c27, + 0x0c27fd12, + 0x5e102778, + 0x3027ff47, + 0x27fb6f5e, + 0x5ec027b1, + 0x0027fc65, + 0x27fcf95e, + 0x5ec027b1, + 0x767efba0, + 0xca01e0b5, + 0x7c03e400, + 0x004d27fb, + 0x58c4d502, + 0xfb715e02, + 0x225e4027, + 0x538707fb, + 0xb007108c, + 0x4807c027, + 0x271f8c10, + 0x24071e4c, + 0x0b073027, + 0x3ebe1c07, + 0x900700d3, + 0x1134a107, + 0x0f301616, + 0x40000000, + 0xffff9f27, + 0xa0273fff, + 0x24074027, + 0x0c530507, + 0x0723331d, + 0x3320ab15, + 0x07010713, + 0x1c0c5342, + 0x31074433, + 0x343340ab, + 0x426b312b, + 0xce234aca, + 0xf2931d4a, + 0xc105f864, + 0x6907442b, + 0xc9076373, + 0xd530d9c5, + 0xd50188d6, + 0x5e0184db, + 0x93c2fe84, + 0x079307e2, + 0xc1dc1ea4, + 0xf3c130f2, + 0x27460734, + 0x7e150700, + 0xc499f67a, + 0x07401286, + 0x87c49904, + 0x04070412, + 0xc4d54027, + 0xc5d501ac, + 0xc0d50198, + 0xc4d501a8, + 0x5e5e019c, + 0x554d27fc, + 0x58c4d501, + 0xfaad5e02, + 0xf1930427, + 0x9e0108e4, + 0xd500c571, + 0x5e018810, + 0xfb4ef9e8, + 0xfe99f063, + 0x2cfc9928, + 0xdf6bd407, + 0xfc054e07, + 0x9918fb99, + 0x747e14fc, + 0x34dc54f6, + 0x3419f371, + 0xf2934e36, + 0x27064250, + 0xa424bd40, + 0x34cc5401, + 0xe419fe81, + 0x402749b6, + 0x01a524bd, + 0x9134bc54, + 0x963419f3, + 0x43402745, + 0xa624bdf0, + 0x27fb8e01, + 0x43341d40, + 0xbd3127f0, + 0xd501a623, + 0x8e01b02b, + 0x1d4027fb, + 0xd54127e4, + 0xbd01ac2c, + 0x1e01a524, + 0x1d4027cc, + 0xfdf29334, + 0x41270641, + 0x01a82dd5, + 0x01a424bd, + 0x3ea7a81e, + 0x11fdefff, + 0x6a4dd834, + 0x23070efc, + 0xf4e84327, + 0x3ddc2311, + 0xa7f6fc6a, + 0xfdefff3e, + 0x4dd83451, + 0x070efc6a, + 0xe8432723, + 0xdc2351f4, + 0xf6fc6a3d, + 0xfe4efe0b, + 0x12270227, + 0x013d0fbe, + 0xffff3ea7, + 0x5834b9ff, + 0x8b41530e, + 0x27413840, + 0xa7fe8e01, + 0xfd4fff4e, + 0x00274201, + 0xf49b4027, + 0x9911270e, + 0x123b0e33, + 0x3ea713cb, + 0x38fd4fbf, + 0x05412711, + 0x03115334, + 0x8e12d634, + 0x07fb4efe, + 0x01c321c2, + 0x072211c4, + 0x931007b1, + 0x0107ddf0, + 0x00c112be, + 0xf093c231, + 0x27010800, + 0xc105be10, + 0x03bf6b00, + 0x31d127c4, + 0x931d07c2, + 0x0107ebf0, + 0xf0bed103, + 0xc40300c0, + 0xec0fdcc4, + 0xc027bd86, + 0xbfffdea7, + 0x03091efd, + 0x20dc03c1, + 0x413ac8c0, + 0x8742c6d4, + 0x8042f14c, + 0x07000192, + 0xcbf0931c, + 0xc0be0107, + 0xd14100c0, + 0x07d8f093, + 0xc0b5be01, + 0x93d15100, + 0x0107ddf0, + 0x00c0aabe, + 0xd4454027, + 0xdc03c103, + 0xc8c8c420, + 0x2e9af493, + 0xe6431905, + 0x5efb0e34, + 0xfb0eb1f8, + 0x4eade25e, + 0x272007fe, + 0xbff09310, + 0x567e0107, + 0xff2ea7ff, + 0x4127ffff, + 0x4fff3ea7, + 0x5924bdfd, + 0x2731010e, + 0x0ef49b40, + 0x270e2399, + 0xcb213b21, + 0xbf3ea723, + 0x2138fd4f, + 0x34054127, + 0x34032153, + 0x4f2722d6, + 0x017d7841, + 0xfe8ef4e8, + 0x0f6bfd4e, + 0xfd930706, + 0x07010783, + 0x270d0721, + 0xff077e11, + 0x01271d07, + 0x00c3649e, + 0x0778fd93, + 0x07e91e01, + 0x1e012710, + 0x07fb4ed8, + 0x931027b0, + 0x01076ff0, + 0x00c00abe, + 0xf093b111, + 0xbe01077c, + 0x2100bfff, + 0x83f093b1, + 0xf4be0107, + 0xb10100bf, + 0x078af093, + 0xbfe9be01, + 0x93b23100, + 0x010791f0, + 0xdcbe1027, + 0xdb0700bf, + 0xc127d403, + 0x1c07d231, + 0x077cf093, + 0xbec10301, + 0x0300bfc7, + 0x0fccc4d4, + 0x0e0b07ec, + 0x4e9d1efb, + 0xffeea7f9, + 0x1ea7ffff, + 0x99feffff, + 0x14992ae3, + 0x6ba00708, + 0x8e43eeaf, + 0xd72ea701, + 0x2479ffff, + 0x022744d6, + 0x2379f98e, + 0x93072479, + 0x30274f4b, + 0x017740e8, + 0x03072419, + 0x44874383, + 0x002c4cf1, + 0xe499ff00, + 0x9dbc0744, + 0x11990914, + 0x830f6b09, + 0x87d10713, + 0x2bd43341, + 0x0fbc83d4, + 0xffb4de23, + 0x510ff6ff, + 0xa7a62601, + 0xd07fff4e, + 0x43353127, + 0x21e44231, + 0xec07012d, + 0xf610ec53, + 0x9901590f, + 0x202705d4, + 0x40084f4b, + 0xd4592127, + 0x4103e1c3, + 0xd45d3e07, + 0x4ea73183, + 0x07feffff, + 0x4143bdb2, + 0xc6bf6b01, + 0xff3ea7ba, + 0x32c1ffff, + 0x07086640, + 0xc548534c, + 0x4f6b3c32, + 0x00f44fe6, + 0x4ea7240b, + 0xc5ffffff, + 0x3ca74042, + 0x25402720, + 0x04d49dd3, + 0xffff4ea7, + 0x3c42d5fe, + 0xa7a97601, + 0xfeffff4e, + 0x1d3543b9, + 0x3127385c, + 0x7fff4ea7, + 0xa74335d0, + 0xd07fff3e, + 0x41c03431, + 0x2723070c, + 0x31f4e843, + 0xf831c423, + 0xffff0ea7, + 0x4104b9fe, + 0x27457601, + 0xff4ea731, + 0x4345d07f, + 0x1c831907, + 0x1b11c40f, + 0xffff2ea7, + 0x442499ff, + 0x41033127, + 0xa744249d, + 0xd07fff4e, + 0x014003bd, + 0xd9be4155, + 0xd31900f2, + 0xffd71ea7, + 0x1d3103ff, + 0x831479d3, + 0x41230f4c, + 0x2fab2407, + 0x2f6b28e6, + 0xffd73ea7, + 0x59327dff, + 0x5d410334, + 0x2705e634, + 0x0ef49b40, + 0x4fff3ea7, + 0x3834c5fd, + 0x0c27b906, + 0x19f98e10, + 0x1d410314, + 0x39131914, + 0x4b34ce14, + 0x43831419, + 0x42f14487, + 0xff00002c, + 0xa30f2c83, + 0xbd1e802c, + 0x8e200c27, + 0x8e0827f9, + 0x8e0127f9, + 0x5e3127f9, + 0x2ca7fe88, + 0xff0c5e20, + 0x0e4ce4d1, + 0xc524e399, + 0x430740e4, + 0x40cc4f4b, + 0x24eb9d3e, + 0x4fe6d479, + 0x0427fe99, + 0x2027f98e, + 0x4107831e, + 0x43834123, + 0x44333487, + 0x44e9432b, + 0xff000052, + 0xdb7d3027, + 0xd46dd35d, + 0xdb3dd31d, + 0x2780ec38, + 0x04d49d41, + 0x5e05de9d, + 0x3bcefe7f, + 0x930327c4, + 0x010579f1, + 0x00c0e89e, + 0x2ea7f54e, + 0x27fddfff, + 0x2000004e, + 0x273415c1, + 0x0824d530, + 0x0823d502, + 0xff4ea702, + 0x4211fd4f, + 0x89d413c1, + 0x32c52614, + 0x281a8950, + 0x070d1899, + 0x33a49bc5, + 0x61071ccc, + 0xac0b7007, + 0x90078103, + 0x01089ba9, + 0x01049ed1, + 0xb6e62b07, + 0x4ccbe401, + 0x00004fd0, + 0x070b1000, + 0x23e8033b, + 0xb8f3f821, + 0x03020700, + 0x231e0701, + 0x07dc0718, + 0x23180320, + 0xb3f2f801, + 0x2b410700, + 0x8643734e, + 0xad4b1b48, + 0x86010894, + 0x11300707, + 0x15120114, + 0x03e205e4, + 0x104c5418, + 0x470b4333, + 0x03884ec5, + 0x03f338e8, + 0x9df8f098, + 0x0ea7c507, + 0x83ffffdf, + 0xa6be0fcc, + 0xc33300c1, + 0x007cc3f9, + 0xc4f9ff00, + 0xff00007e, + 0x412338a3, + 0x007ec4fd, + 0x0ea7ff00, + 0xfdffffdf, + 0x00007cc3, + 0xc15cbeff, + 0x3460c100, + 0x330f0c83, + 0x7e0e2303, + 0x0439ffff, + 0x3ea74eb6, + 0x01fd4fff, + 0x9b402732, + 0x3ea70ef4, + 0x99ffffff, + 0x31270e34, + 0x34cb323b, + 0x4fbf2ea7, + 0x273138fd, + 0x53240541, + 0xd6240331, + 0x01f58e32, + 0xf44ccbe4, + 0x0000004f, + 0x5eff3810, + 0x1301ff3d, + 0x43cb4d07, + 0x4ff4d307, + 0x10000000, + 0xa3eeff41, + 0x3a5eff35, + 0xc40dbeff, + 0x4ea81e00, + 0x29fc93fc, + 0xc11905f2, + 0xc1681fc6, + 0x402744cd, + 0x30a72027, + 0x8d0cc49d, + 0xc2654ac3, + 0xc50bc49d, + 0xdf834cc2, + 0x8000000f, + 0xc061d0c8, + 0x4d276a11, + 0xd49b0398, + 0x3f033d07, + 0x00066834, + 0x104632b9, + 0x103431b9, + 0x2c264127, + 0x41ab4633, + 0xb95ac49d, + 0x93104034, + 0x05f1d7f2, + 0xb95bc49d, + 0x27103534, + 0xc1467610, + 0x40274423, + 0x241d3103, + 0xc55c219d, + 0xfc8e4423, + 0x274423c1, + 0x27310311, + 0x9d241d40, + 0x23c55c21, + 0x27ec1e44, + 0x23be1e40, + 0xf0dfa3d1, + 0x03ffffff, + 0xbe951ed1, + 0xbe00c2b7, + 0xbe00c0bb, + 0x0700c0aa, + 0x333d074d, + 0x2b353343, + 0x873d2b34, + 0x33d30bd3, + 0x70d4f9d3, + 0xf6000678, + 0x07ff774f, + 0x030c071d, + 0x0678641f, + 0xfdf27e00, + 0x4eff675e, + 0x7ec007fc, + 0xc4d1ff2b, + 0xf35302f8, + 0x41036cbf, + 0xc3050027, + 0x02f8c4d5, + 0xfc4efc8e, + 0x0f30c007, + 0x40000000, + 0x036ff093, + 0x7efc8e01, + 0x0fabadbf, + 0x0103dc07, + 0xd09bdfab, + 0xde30d103, + 0x93010000, + 0x010377f0, + 0x0c07fc8e, + 0x07b40a7e, + 0xb41b7e0d, + 0xfc8e0027, + 0xc007fc4e, + 0xc0ad9c7e, + 0x03c01002, + 0x93012029, + 0x010399f0, + 0xc6d4fc8e, + 0xabdc07f7, + 0xb4237edf, + 0xd1030fab, + 0xd103d09b, + 0x0000ded0, + 0xf0931201, + 0x8e010357, + 0xe2c3c0fc, + 0x0370f093, + 0x07fc8e01, + 0xb3e97e0c, + 0xce7e0d07, + 0x8e0027b3, + 0x000000fc, + 0x00001000, + 0x08000000, + 0x0000000f, + 0x07c1f54e, + 0x3c0dc138, + 0x07240a99, + 0x27c107b0, + 0x27502780, + 0xddfc0c6c, + 0x00a41000, + 0x4d034d07, + 0xc4ea2000, + 0x3c27009a, + 0x2b06071b, + 0x27010336, + 0x3b4d0722, + 0x0b405b20, + 0x5b41dc2d, + 0x2755f3f0, + 0x4a3b0f4c, + 0xf4139487, + 0x134e01b0, + 0x4201aff4, + 0x2b0b2247, + 0xb3012149, + 0x490b4187, + 0x3707430b, + 0x11033d0b, + 0x3a074305, + 0x3703214d, + 0x030ade0b, + 0x18025127, + 0x41278107, + 0x42234a3b, + 0x5936841a, + 0xa194dcca, + 0x3cb3c1b4, + 0x2b3cbcc5, + 0xa54c0b43, + 0xc2f58eb4, + 0x2007982c, + 0x070c2c23, + 0x274a3b42, + 0x3b9487e1, + 0x07aa1ee0, + 0x7e0b0713, + 0x1007b02c, + 0xd97e0b07, + 0x24ba99b5, + 0xff5cdcea, + 0xf453c61e, + 0x4e01ff34, + 0x20270607, + 0x851e9027, + 0x02c1fa4e, + 0x4003c13c, + 0x04a1d107, + 0x0fffdd03, + 0x0fffdde3, + 0xb007322b, + 0x00c1d42b, + 0xd634d638, + 0x07fa8ed7, + 0x243dcaad, + 0xc20bca07, + 0x90be1c07, + 0x0b0700bd, + 0xfd7e1c07, + 0xc6da2bfe, + 0x7e0d07d0, + 0x0b07b510, + 0xfa0e1d07, + 0x07feeb5e, + 0x0bca07a3, + 0xbe1c07c2, + 0x0700bd6b, + 0x7e1c070b, + 0xda2bfed8, + 0xfa4eda1e, + 0x07310499, + 0x07a207d0, + 0x56c107b3, + 0x0cb2c04f, + 0xc87e0a07, + 0x5d0fc6b4, + 0x475ab3c0, + 0x144c234c, + 0x0b24d199, + 0x3b31274d, + 0x23420931, + 0x2932c231, + 0x41273c07, + 0xd1a1433b, + 0x31233407, + 0x13eb130b, + 0x0d07140b, + 0x89ff577e, + 0x0d0732d4, + 0x1c074103, + 0x0e32d48d, + 0xaf525efa, + 0x47034107, + 0x071ac4c2, + 0x1e31033c, + 0xb2e17ece, + 0x402706d6, + 0xc431d49d, + 0xa81e9fb2, + 0xfa8e0027, + 0x38033107, + 0x0d07b51e, + 0x257e1c07, + 0x9d4027af, + 0x0fc631d4, + 0x4efa8e81, + 0xffcea7f9, + 0xc4d1ffff, + 0xb0070640, + 0x91070a99, + 0x274d760d, + 0xe6d4a1c1, + 0xa700894f, + 0xffffdf0e, + 0x00bdb0be, + 0x2c07b161, + 0xdfbe0a07, + 0xd4990414, + 0x87d3a12c, + 0x07430b44, + 0xa74005c0, + 0xffffdf0e, + 0x00bd6dbe, + 0xd499cf26, + 0x0321272c, + 0x2cd49d41, + 0x2a3bb341, + 0x0027320b, + 0xf98eb345, + 0xffdf0ea7, + 0xbd6fbeff, + 0x40c4d100, + 0x34c3d106, + 0x27448706, + 0x1c43ca20, + 0x187dc2bd, + 0x187dc4b9, + 0xc12745f6, + 0xffdf0ea7, + 0xbd28beff, + 0x278b1e00, + 0x27f21ec3, + 0x7dc2bd21, + 0x7dc4b918, + 0x1e40a618, + 0x150c27ef, + 0x0ea7f98e, + 0xbeffffdf, + 0x6100bd29, + 0x0c0c27b1, + 0x57be2c07, + 0x90070414, + 0xffdf0ea7, + 0xbcf0beff, + 0xda9fc600, + 0xd4999905, + 0x03d9a52c, + 0x2cd49d41, + 0x4eff4a5e, + 0x034007f5, + 0x07f06344, + 0x99f405d0, + 0x1d074902, + 0x1c030407, + 0x5078be2c, + 0x06500701, + 0x43050705, + 0x01f58ef0, + 0x001d27f0, + 0x5458be02, + 0xd6500701, + 0xf0d49901, + 0x04a441fc, + 0x011742fc, + 0x06d644fc, + 0x081d48fc, + 0xd8104cfc, + 0x204cfc09, + 0x4cf80595, + 0x07009a40, + 0x271c270d, + 0x01523abe, + 0x025ed1b9, + 0x1c030527, + 0xd8097e10, + 0x3d071d07, + 0xb9102c27, + 0x33017134, + 0x004ea348, + 0xf49b0700, + 0x68310340, + 0x5ed4b9f2, + 0x2747a602, + 0x8114b920, + 0xa3483301, + 0x0700004e, + 0xb940f49b, + 0x03025ed3, + 0xda110321, + 0x4d27e823, + 0xf49b8000, + 0x483f9b40, + 0x271a31dc, + 0x9b02202d, + 0x402722f2, + 0x070ef49b, + 0x9bff8b00, + 0x3f9b22f4, + 0xec31d848, + 0x33484f9b, + 0x4c53174c, + 0x8348131b, + 0x2345a647, + 0x0f4c8341, + 0x9b104c33, + 0xd49940f4, + 0xbf4c83f0, + 0x26f0d49d, + 0x49d49945, + 0xff2b41e0, + 0xa181d499, + 0x9d4103d2, + 0x3d2781d4, + 0xf0010480, + 0xfb932345, + 0x8905254c, + 0x987e78bc, + 0x0b0353c0, + 0x27f001c0, + 0x78bc8d11, + 0x015129be, + 0xffff3ea7, + 0xbd4127ff, + 0x99066934, + 0x40270f32, + 0x270ef49b, + 0xf5228741, + 0x02b04024, + 0xf0d399ff, + 0xfedb3ff6, + 0x3e5cf493, + 0x43050701, + 0x8ed405f0, + 0xb0d6d1f5, + 0x08d8d102, + 0x14648901, + 0x89306a89, + 0x69891263, + 0x10d7d132, + 0x18d2d101, + 0x1cded101, + 0x270d0701, + 0xdcd1211c, + 0xdbd1010c, + 0xa32b0114, + 0x820b942b, + 0x0cbe7e0b, + 0xd4990151, + 0x33ac0bf1, + 0x9b0b0c4c, + 0x81534fab, + 0x00004ea3, + 0x53715303, + 0x9b9153a1, + 0x3e2740f4, + 0x9b020000, + 0x4d2740f3, + 0xf49b8000, + 0x7e0d0740, + 0xd499c7e9, + 0x41f49bf2, + 0x9b3c6399, + 0x648941f3, + 0x41f49b30, + 0x9b326389, + 0x85f641f3, + 0x7576a5b6, + 0x40279536, + 0x1e40f49b, + 0x004d2714, + 0x40f49b80, + 0x9b41f89b, + 0xf79b41fa, + 0x41f99b41, + 0x9b3d6499, + 0x639941f4, + 0x41f39b3e, + 0xf49b4427, + 0x9b302741, + 0xd49940f3, + 0xc743e080, + 0x64d4b903, + 0x6b412302, + 0xe144f44f, + 0xfcd49907, + 0x44863127, + 0x33133027, + 0x2741f39b, + 0x41f49b42, + 0xf49b4027, + 0x56639941, + 0x2b346299, + 0x9b332323, + 0xf29b41f3, + 0x41f49b41, + 0x23346499, + 0x27440842, + 0x41f49b43, + 0xf49b4027, + 0x41f49b41, + 0x9b40f49b, + 0x639940f4, + 0xa735c641, + 0xfd4fff3e, + 0xe87434c1, + 0x2708d040, + 0x40f49b40, + 0xf39b3027, + 0x64d4b940, + 0x6b452302, + 0xc644f44f, + 0xb9d4b905, + 0xb8d3b90a, + 0x9b430b0a, + 0xd49941f4, + 0x404cecfc, + 0xd49903da, + 0xd34fe6fe, + 0xb8d4b903, + 0x684fc60a, + 0xcd270027, + 0x0fe68000, + 0xd49903ad, + 0x2d43e080, + 0x07012308, + 0x031f6b10, + 0x27212701, + 0x40f49b40, + 0x41273207, + 0x9b41f49b, + 0xf19b41f3, + 0x40fc9b41, + 0x298609c6, + 0xe1271027, + 0xe0270100, + 0x2780d499, + 0x27148631, + 0x6343e030, + 0xfcd49903, + 0x4f6b402b, + 0x3341f49b, + 0xf39b0f3c, + 0xf0110340, + 0xd4b9dff2, + 0x01030ab8, + 0xb9a004da, + 0xe00264d3, + 0xe0080235, + 0x2307fe36, + 0x6b430737, + 0xf037034f, + 0x23084c42, + 0x6b430731, + 0x2448f44f, + 0x004d2705, + 0x40f49b80, + 0xf39b3027, + 0xf6d49941, + 0xab0f4c33, + 0x40f49b4f, + 0x33426399, + 0x3fab0f3c, + 0xd140f39b, + 0x070130d4, + 0xff4ce30d, + 0x012c0d03, + 0x4f003027, + 0x02020200, + 0xd4b93127, + 0x13070130, + 0x30271f6b, + 0x078642e0, + 0x2f6b2307, + 0x02e91ff6, + 0x02e52ff6, + 0x0154d4b9, + 0x02dd4ff6, + 0x4efc04a1, + 0xbeff00ff, + 0x58d4b907, + 0xb64ff601, + 0x27002707, + 0x40f49b30, + 0x00df3fe6, + 0x0156d4b9, + 0x07534fe6, + 0x80004d27, + 0xb940f49b, + 0x330157d3, + 0x003ea338, + 0xf39b0700, + 0x57d4b940, + 0xff4ce001, + 0x4027078a, + 0x0740f49b, + 0x0f3c3330, + 0xa640f39b, + 0x55d4b90d, + 0x0d4c3301, + 0x4ea34fab, + 0x9b020000, + 0x2c3340f4, + 0x40f29b0f, + 0x4c334107, + 0x40f49b0f, + 0xd4b91986, + 0x48330131, + 0x00004ea3, + 0x40f49b07, + 0x0132d3b9, + 0x3ea33833, + 0x9b070000, + 0xd4b940f3, + 0x48330133, + 0x00004ea3, + 0x40f49b07, + 0xf49b4027, + 0x40f49b40, + 0x9b40f49b, + 0xf49b40f4, + 0x58d3b940, + 0xca3fe601, + 0x003d2706, + 0x40f39b80, + 0x0162d4a9, + 0x00004ea3, + 0x40f49b0f, + 0x0160d3a9, + 0x00003ea3, + 0x40f39b0f, + 0x0166d4a9, + 0x00004ea3, + 0x40f49b0f, + 0x0164d3a9, + 0x00003ea3, + 0x40f39b0f, + 0xf49b4027, + 0x40f49b40, + 0xf49b4027, + 0x9b402740, + 0x3d2740f4, + 0xf39b8000, + 0x484f9b40, + 0x271a41dc, + 0x9b02202d, + 0x402722f2, + 0x070ef49b, + 0x9bff8b00, + 0x3f9b22f4, + 0xec31d848, + 0x33484f9b, + 0x4c53174c, + 0x8348131b, + 0x2345a647, + 0x0f4c8341, + 0x9b104c33, + 0xd49940f4, + 0xfd4c83f0, + 0x5ef0d49d, + 0x0d07fc13, + 0xc1201c27, + 0xb0bef8dc, + 0xd499014d, + 0x0c4c33f1, + 0x4ea34fab, + 0x9b030000, + 0x3e2740f4, + 0x9b01c000, + 0x4e2740f3, + 0x9b050000, + 0x3e2740f4, + 0x9b020000, + 0x4d2740f3, + 0xf49b8000, + 0xff3e2740, + 0xf39b0fff, + 0x7e0d0740, + 0x4027c481, + 0x9940f49b, + 0x33e080d3, + 0xd4b9045e, + 0x41230264, + 0x44f44f6b, + 0xd4990081, + 0x863127fc, + 0x13302744, + 0x41f39b33, + 0xf49b4227, + 0x9b402741, + 0x3e2741f4, + 0x9b050000, + 0xf49b40f3, + 0x58d3b941, + 0x563fe601, + 0x40f49b01, + 0xf49b4027, + 0x003d2740, + 0x40f39b80, + 0xdc484f9b, + 0x2d271a41, + 0xf29b0220, + 0x9b402722, + 0x00070ef4, + 0xf49bff8b, + 0x483f9b22, + 0x9bec31d8, + 0x4c33484f, + 0x1b4c5317, + 0x47834813, + 0x412345a6, + 0x330f4c83, + 0xf49b104c, + 0xf0d49940, + 0x9dfe4c83, + 0x345ef0d4, + 0xfcd499fb, + 0x44863127, + 0x32133027, + 0x9941f39b, + 0x3027fed4, + 0x31274486, + 0x5e41f39b, + 0xf49bff79, + 0x9b322741, + 0x515e41f3, + 0x270d07fc, + 0xacbe271c, + 0x0c27014c, + 0x7e142790, + 0xd4a9d27f, + 0x4ea3014c, + 0x9b0f0000, + 0xd3a940f4, + 0x3ea30150, + 0x9b0f0000, + 0x4d2740f3, + 0xf49b8000, + 0x483f9b40, + 0x271a31dc, + 0x9b02202d, + 0x402722f2, + 0x070ef49b, + 0x9bff8b00, + 0x3f9b22f4, + 0xec31d848, + 0x33484f9b, + 0x4c53174c, + 0x8348131b, + 0x2345a647, + 0x0f4c8341, + 0x9b104c33, + 0xd49940f4, + 0xdf4c83f0, + 0x5ef0d49d, + 0x4127fa97, + 0xfca23fe6, + 0x9d5e4e07, + 0xfcd199fc, + 0x30272027, + 0x27fc655e, + 0x27312701, + 0x5e80004d, + 0xd4b9fd31, + 0x41230264, + 0x44f04f6b, + 0x30270317, + 0x80000d27, + 0x0ab8d4b9, + 0x01b843f2, + 0x402734e6, + 0x0340f49b, + 0x41f39b31, + 0xf49b4027, + 0x99230741, + 0x1027fed4, + 0x046b4fe6, + 0x9bfcd499, + 0xf09b41f4, + 0x1ef25840, + 0x272c07d0, + 0x112c5340, + 0x070f4c33, + 0x0742ab3c, + 0x0f3c3324, + 0x53102c33, + 0x32ab103c, + 0x80000d27, + 0x2740f09b, + 0x0f00002e, + 0x2740f29b, + 0x0f80001e, + 0x0740f19b, + 0x102c5323, + 0x00002ea3, + 0x40f29b0f, + 0x3ea33fab, + 0x9b0f0000, + 0xf09b40f3, + 0xff4d2740, + 0x41f49b7f, + 0xf39b3027, + 0xfe565e41, + 0x2758dbc1, + 0x57b499c0, + 0xc1274210, + 0x1c270d07, + 0x4b6dbe22, + 0x99cf6b01, + 0xf49bffd4, + 0xf2d29941, + 0x2741f29b, + 0x40f39b30, + 0x2740f39b, + 0x0200004e, + 0x9b40f49b, + 0x1d2740f3, + 0xf19b8000, + 0x41f39b40, + 0x9b41f39b, + 0xb49942f3, + 0x0f4c3343, + 0xf49b4fab, + 0x40f39b40, + 0x2740f19b, + 0x41f49b42, + 0x4b54b299, + 0x42f29b2f, + 0x4b55b499, + 0x42f49b4f, + 0x9b40f39b, + 0xf39b40f3, + 0x40f39b40, + 0x2c332c07, + 0x40f29b0f, + 0x33f7d499, + 0x4fab0f4c, + 0x6640f49b, + 0x41f39bc6, + 0x2357b499, + 0x41f49b41, + 0x9b40f19b, + 0xf19b40f1, + 0x40f19b40, + 0xf49b4027, + 0x04d3b940, + 0x563fe601, + 0x40f49b02, + 0x9b42f49b, + 0x402742f4, + 0x9940f49b, + 0x36d6fed3, + 0x27fcd499, + 0x27449630, + 0xc3430731, + 0x33418341, + 0x4fab0f4c, + 0x2740f49b, + 0x41f49b40, + 0x9b40f49b, + 0x3d2740f4, + 0xf39b8000, + 0x484f9b40, + 0x271a41dc, + 0x9b02202d, + 0x402722f2, + 0x070ef49b, + 0x9bff8b00, + 0x3f9b22f4, + 0xec31d848, + 0x33484f9b, + 0x4c53174c, + 0x8348131b, + 0x2345a647, + 0x0f4c8341, + 0x9b104c33, + 0xd49940f4, + 0xfb4c83f0, + 0x5ef0d49d, + 0xd3b9f8a7, + 0xe05e0264, + 0xb8d4b9fa, + 0x41f49b0a, + 0x27fa415e, + 0x40f49b40, + 0x07fae45e, + 0x271c270d, + 0x014a2ebe, + 0x0120dbd1, + 0x0124d9b9, + 0xa183ab07, + 0x0125dcb9, + 0x0281aff6, + 0x027d95e0, + 0x0c271627, + 0xcfe97e2d, + 0xf29b2027, + 0x40f29b41, + 0x49334907, + 0x4ea34fab, + 0x9b060000, + 0x3a0740f4, + 0x9b0f3c33, + 0xca3340f3, + 0xcea3cfab, + 0x9b050000, + 0x4b0740fc, + 0x830e4c33, + 0x9b80004d, + 0x3b0740f4, + 0x830d3c33, + 0x9b80003d, + 0x4b0740f3, + 0x830c4c33, + 0x9b80004d, + 0xbb3340f4, + 0x8000bd83, + 0x9b40fb9b, + 0xf29b40f2, + 0xc0ad3640, + 0xd4b94595, + 0x4c330126, + 0xa34fab0c, + 0x0300004e, + 0xb940f49b, + 0x330127d3, + 0x3fab0c3c, + 0x00003ea3, + 0x40f39b03, + 0x0128d4b9, + 0xab0c4c33, + 0x004ea34f, + 0xf49b0300, + 0x29d3b940, + 0x0c3c3301, + 0x3ea33fab, + 0x9b030000, + 0x4e2740f3, + 0x9b070000, + 0x3d2740f4, + 0xf39b8000, + 0x9b402740, + 0xf39b40f4, + 0x484f9b40, + 0x271a41dc, + 0x9b02202d, + 0x402722f2, + 0x070ef49b, + 0x9bff8b00, + 0x3f9b22f4, + 0xec31d848, + 0x33484f9b, + 0x4c53174c, + 0x8348131b, + 0x2345a647, + 0x0f4c8341, + 0x9b104c33, + 0xd49940f4, + 0xf74c83f0, + 0x5ef0d49d, + 0x4327f763, + 0x2741f49b, + 0x41f39b32, + 0x27fbb85e, + 0x41f29b21, + 0xf49b4027, + 0x41f49b41, + 0x80001d27, + 0x9b40f19b, + 0xf49b40f4, + 0x41f49b41, + 0x2740f49b, + 0x41f39b32, + 0x9b41f49b, + 0xf19b41f4, + 0x41f49b40, + 0x9b40f19b, + 0xf29b40f4, + 0x41f49b41, + 0x9b41f49b, + 0xd3b940f4, + 0x3fe60284, + 0x3027fe66, + 0x2740f39b, + 0x41f49b41, + 0x9b41f39b, + 0xf19b41f4, + 0x64d3b940, + 0xf9315e02, + 0x27fcd499, + 0x27448631, + 0x9b321330, + 0xd49941f3, + 0x863027fe, + 0x9b312744, + 0x195e41f3, + 0x40f19bf8, + 0x07fdb15e, + 0x271c270d, + 0x01486ebe, + 0x27181c27, + 0x407e890c, + 0x272d07ce, + 0x3424a910, + 0x004ea301, + 0xf49b0f00, + 0x3a23a940, + 0x003ea301, + 0xf39b0f00, + 0x03110340, + 0xe213c422, + 0x0140d4a9, + 0x00004ea3, + 0x40f49b0f, + 0x0142d3a9, + 0x00003ea3, + 0x40f39b0f, + 0x0146d4a9, + 0x00004ea3, + 0x40f49b0f, + 0x0144d3a9, + 0x00003ea3, + 0x40f39b0f, + 0x014ad4a9, + 0x00004ea3, + 0x40f49b0f, + 0x0148d3a9, + 0x00003ea3, + 0x40f39b0f, + 0x80004d27, + 0x9b40f49b, + 0x31dc483f, + 0x202d271a, + 0x22f29b02, + 0xf49b4027, + 0x8b00070e, + 0x22f49bff, + 0xd8483f9b, + 0x4f9bec31, + 0x174c3348, + 0x131b4c53, + 0xa6478348, + 0x83412345, + 0x4c330f4c, + 0x40f49b10, + 0x83f0d499, + 0xd49def4c, + 0xf6055ef0, + 0x02002127, + 0x21032027, + 0x01e41027, + 0x1127f7d3, + 0x27f7ce5e, + 0xfd845e14, + 0x795e3127, + 0x9b4027f8, + 0xc75e40f4, + 0x9b4027f8, + 0x715e40f4, + 0x41f19bf9, + 0x27fb995e, + 0x40f49b40, + 0xf39b3127, + 0x41f49b41, + 0x9bfcd399, + 0xf49b41f3, + 0x40f49b40, + 0x9b41f49b, + 0xd3b941f4, + 0xe05e0264, + 0x7434c1f7, + 0x00004ef8, + 0x27f72a01, + 0x9b80004d, + 0x255e40f4, + 0x5e0027f7, + 0xd4a9fb15, + 0x4ea3015a, + 0x9b0f0000, + 0xd3a940f4, + 0x3ea3015c, + 0x9b0f0000, + 0x5f5e40f3, + 0x9b4027f8, + 0x312740f4, + 0x9b41f39b, + 0x332741f4, + 0x9b41f39b, + 0xf49b40f4, + 0x41f49b40, + 0xb941f49b, + 0x5e0264d3, + 0x0000f793, + 0x000000ff, + 0xfe93f54e, + 0xc1051ab0, + 0xf6e360e2, + 0xe489e349, + 0x60f2c50c, + 0xc164f0c5, + 0x43c23021, + 0x0b238724, + 0x36240121, + 0x0d0c2745, + 0xf58ef6c3, + 0xf2c12401, + 0xc1310360, + 0x00273c22, + 0x4215f6c3, + 0xf58ee34d, + 0x74037007, + 0x07071207, + 0xa3be2027, + 0x0ff60144, + 0xf3c100a4, + 0x60f4c160, + 0xb160fec1, + 0xc1445133, + 0xf3c530ee, + 0xc5f40548, + 0x308140fe, + 0x1548f4c1, + 0x253291f0, + 0x3533a1f2, + 0x104389f3, + 0x3fe64387, + 0xfec102d9, + 0x40f5c148, + 0x070eea89, + 0x27e40783, + 0x27ffffcd, + 0x71afc690, + 0xff62f253, + 0x26015001, + 0xb027dc07, + 0x04310251, + 0xa13003c1, + 0x09420b01, + 0x03310b0c, + 0x2607184c, + 0xe40b2103, + 0xcd4e930b, + 0x43010411, + 0x0429e30b, + 0xb40b6207, + 0x6f6bdc07, + 0x03d2bada, + 0xbef8f054, + 0x0148f0c1, + 0x0bf95504, + 0x01f4454e, + 0x0b070701, + 0x241c0314, + 0xf3be190b, + 0x07c60147, + 0xff3203e4, + 0x2764f3c1, + 0x3df49303, + 0xf6c30133, + 0xf58e3405, + 0xfef2f353, + 0xc41e3601, + 0x11be0707, + 0xf2c10143, + 0xe6245160, + 0x2702454f, + 0x18dc2730, + 0x1f070707, + 0x7e182c27, + 0xf3c1b482, + 0xb1070760, + 0x013d0731, + 0x7e2c071c, + 0xf4c1b472, + 0x48fec160, + 0x012a4189, + 0x874107ee, + 0x2b453331, + 0x0bcd0b43, + 0xc53c07e4, + 0xfec53cfc, + 0xf6340b38, + 0x2701e46f, + 0xc58e0700, + 0x1fe638f0, + 0x460701ce, + 0x4333e607, + 0xe42be533, + 0x0760f0c1, + 0x184c034f, + 0x0354f3c5, + 0x89302744, + 0xfec52802, + 0xffbd2744, + 0x4cf3c5ff, + 0xc550f3c5, + 0xf4c558f3, + 0xac2fe668, + 0x58f2c100, + 0xc138f5c1, + 0xa28740f3, + 0xa30b5833, + 0x4b0756ab, + 0x1c1ed027, + 0xc1b3f57e, + 0xf3c13cf0, + 0x03942960, + 0x32891c0c, + 0x3cf0c528, + 0x2dd2d40b, + 0x014b0778, + 0x091f07a9, + 0x3cf3c19b, + 0x1c030707, + 0x1c2c2718, + 0x110a4bce, + 0x50f8c59e, + 0x840be401, + 0x6550fec1, + 0x31fe85f5, + 0xa59c5194, + 0x95c40bf8, + 0xc19ea1fc, + 0xfb8d3094, + 0xc14e0b1c, + 0xf4b54cfe, + 0x2930fec5, + 0x8d8c0b9e, + 0xfec11efe, + 0xc5e40b4c, + 0xdfc64cfe, + 0x54f3c194, + 0x0768f1c1, + 0x182c0323, + 0x0754f2c5, + 0x182c2707, + 0xc1b3757e, + 0x942960f3, + 0x0b283289, + 0x8ad2dad4, + 0xc12a3189, + 0x410358f4, + 0xd258f4c5, + 0xfec10f14, + 0x44f0c138, + 0xfec5e00b, + 0xff3b5e38, + 0x00d41fe6, + 0x2740f4c1, + 0x54fdc1e0, + 0x0734f4c5, + 0xff6d2754, + 0x5cfec5ff, + 0x07622fc6, + 0x1e802746, + 0x01460703, + 0x09bd0759, + 0x073d0796, + 0xceb40307, + 0x91111946, + 0x2c071c01, + 0x07b28c7e, + 0x0707073b, + 0x7e222719, + 0x9609b306, + 0x9c31dc0b, + 0x3d079121, + 0x2c070707, + 0x07b2707e, + 0x0b9a51bd, + 0x079141bc, + 0x072a0707, + 0xb25f7e3b, + 0x2960f0c1, + 0x28028994, + 0x840bdb07, + 0x82dada0b, + 0x2a0189a9, + 0x035cf3c1, + 0xc5310354, + 0x31da5cf3, + 0x271da690, + 0x272b8660, + 0x34f4c180, + 0x4c013d07, + 0xcba10707, + 0x2b07c191, + 0x07b2247e, + 0x30c9c1ad, + 0xc1b1ab0b, + 0x07072907, + 0x127e3a07, + 0x60fec1b2, + 0xe289c429, + 0x0bda0728, + 0xdad90b84, + 0xe189cc82, + 0x34f0c12a, + 0x04036103, + 0xda34f0c5, + 0x0707b861, + 0x67be1127, + 0xb55e0143, + 0x9b4607fd, + 0x33840741, + 0xc1433385, + 0x842b38f2, + 0x135e820b, + 0x27e407fe, + 0x5e602790, + 0x3027fd78, + 0xf1930707, + 0x270109a8, + 0x3f7e0c2c, + 0x0c3c27b2, + 0x5e24dc27, + 0xfd4efdac, + 0x0ea7d007, + 0xbeffffdf, + 0x9900add9, + 0xd16108d0, + 0x07be2027, + 0xd0450405, + 0xd3110706, + 0x3419d201, + 0x420b4487, + 0xd4314005, + 0x3419d455, + 0x341d4103, + 0xffdf0ea7, + 0xad88beff, + 0x27d44100, + 0x27449600, + 0x8301c301, + 0x4efd8e01, + 0x070451fb, + 0x07d207c0, + 0x4642cab1, + 0xe7ff3ea7, + 0x153b05fd, + 0x27c1413d, + 0xa7323520, + 0xfde7ef4e, + 0x4d154105, + 0xefff3ea7, + 0x114235fd, + 0x6a4dd834, + 0x23070efc, + 0xf4e84327, + 0x3ddc2311, + 0x41f6fc6a, + 0x0bc451c3, + 0x2b03073d, + 0x550d2b4d, + 0x8ec345c4, + 0xff647efb, + 0x8eb60fd6, + 0x51fa4efb, + 0x07b0070e, + 0x07d207c3, + 0x024307a1, + 0x154e073e, + 0x96b451d4, + 0x11dc1544, + 0x05893ed2, + 0x1108a6d0, + 0x2b2c07d4, + 0x16d23524, + 0x25012725, + 0x07fa8ed2, + 0x07140b1a, + 0xff6d7e0b, + 0x4127d025, + 0x40270496, + 0xfa8e0407, + 0xd207fa4e, + 0xb107a007, + 0xfa8e27b6, + 0xf9f3cea7, + 0x24c099ff, + 0x22271027, + 0x17be0703, + 0x10070404, + 0xd17e0c07, + 0x073d07a3, + 0xa72b071a, + 0xfff9f30e, + 0xd6a3807e, + 0x4027d70f, + 0x8e0ef49b, + 0xc1f54efa, + 0xc1073412, + 0xdc83d207, + 0x5811990f, + 0xb127d333, + 0xde23fd23, + 0x07ffff84, + 0x0370073b, + 0x3bf265d4, + 0x50c2c131, + 0xf335a027, + 0xfd154027, + 0x5508f19d, + 0x076707fa, + 0x45d4230f, + 0x03f205f4, + 0x7961186c, + 0x16fe957e, + 0xdf0ea70c, + 0x6ebeffff, + 0xc0c100ac, + 0x04d29950, + 0x0358c199, + 0x7e212304, + 0xc199ff64, + 0x54c0c159, + 0x7e05d299, + 0x4027ff58, + 0x0ea73127, + 0x9dffffdf, + 0xd39d05d4, + 0xac1cbe04, + 0x03042700, + 0x99f58efd, + 0xc3c159c4, + 0xa5b43b54, + 0x30fac5fb, + 0x0324f49d, + 0xc10f07d5, + 0xfd8534c4, + 0x231c0c03, + 0xb5f375d5, + 0x34f4c5fa, + 0xc6fe2d7e, + 0x3f07980f, + 0x27383c03, + 0x204c2720, + 0x34033205, + 0xc289f4c8, + 0x132fe628, + 0x0b302701, + 0xff1d2796, + 0x26c489ff, + 0xc5bcf9c5, + 0xf1c5c0f3, + 0xc8f3c5c4, + 0x01bcf1c1, + 0x5334c613, + 0xc5360b38, + 0x4fe6ccf3, + 0xf8c100d3, + 0xc8f4c1bc, + 0x87c4f9c1, + 0x27840344, + 0xb8f4c550, + 0x41008a5e, + 0x40ac23fb, + 0x4540bc03, + 0x23fa55fb, + 0x55a640bc, + 0x07ccf8c1, + 0x181c0318, + 0x09ccf1c5, + 0xc4fac58a, + 0x03189ace, + 0xab4a07a2, + 0x0794874f, + 0xc1920b2f, + 0xa2233893, + 0xc6c0f3c5, + 0xba0d633f, + 0xf2c18129, + 0x2d8431c0, + 0x07b215b1, + 0x212b0716, + 0x07140b83, + 0x7e28030f, + 0x0fe6fe21, + 0x7141fee9, + 0x160b8451, + 0x0f078341, + 0x140b2b07, + 0x03242c03, + 0x067e1c0c, + 0xb8f3c1fe, + 0x0b4cc4c1, + 0x294b0543, + 0x26c489b3, + 0x45d2530b, + 0x519a0734, + 0x40acf4fa, + 0x0f07ff73, + 0xe6fd417e, + 0x51feac0f, + 0xff655efa, + 0x0f078111, + 0x1201160b, + 0xe6fd767e, + 0x09fe980f, + 0xc0f0c58a, + 0xc53890c5, + 0x831ec4fa, + 0xc128c289, + 0x1103c8f1, + 0xd2c8f1c5, + 0xf3c10d21, + 0x1c3c03bc, + 0x5ebcf3c5, + 0x0027ff08, + 0x4efea65e, + 0xa7f063fd, + 0xffffdf0e, + 0x00aad4be, + 0x0ea72f07, + 0x03ffe93b, + 0x053f0723, + 0x7f2ce3f0, + 0x197f3ce3, + 0x803c0334, + 0xa7f932c2, + 0xffe93b0e, + 0x01b404b9, + 0x30274bc6, + 0x101ed027, + 0x3d07f001, + 0x01b404b9, + 0xd3073103, + 0x0b2843d2, + 0x6434b930, + 0xe942d801, + 0x31994d87, + 0x27040b42, + 0xfd8a7e21, + 0x3499f301, + 0x9d412340, + 0xf0014034, + 0xd6400499, + 0x1027cd4f, + 0x01b82d27, + 0xe93b0ea7, + 0x9decbeff, + 0xdf0ea700, + 0x37beffff, + 0xf04300aa, + 0xf94efd8e, + 0xdcaef493, + 0x03240705, + 0x34073f2c, + 0x2ce3f063, + 0x7f3ce37f, + 0x3c033419, + 0xf932c280, + 0x93100c27, + 0x05dc8ff3, + 0x400720a7, + 0x01233205, + 0xf4b83403, + 0xdb3afd93, + 0x93302705, + 0x0625b7f1, + 0x40a72127, + 0x9d68129d, + 0xd0c566d4, + 0x9dd33d80, + 0xd09d0bd3, + 0x1dd35d0c, + 0x69129dd3, + 0x9d039d07, + 0x49071030, + 0x4ce33d07, + 0xb03d037f, + 0xe44f5449, + 0x9b0006b1, + 0x4c030cf4, + 0xf843ca80, + 0xfc9bc027, + 0xffbea70e, + 0x0027fdeb, + 0x0121dbbe, + 0x0000af27, + 0xbc050d02, + 0xfc9bba15, + 0xff3ea70e, + 0x4427fde7, + 0x2d273405, + 0x32153980, + 0xe7ef4ea7, + 0x053c35fd, + 0x27421549, + 0xbe4c3500, + 0x050121ac, + 0x9bba15bc, + 0xdcd50efc, + 0xf4931028, + 0x0705dbac, + 0x3f2c0324, + 0x2ce33407, + 0x7f3ce37f, + 0x3c033419, + 0xf932c280, + 0xdb96f293, + 0x27382705, + 0x03240d40, + 0x23f3b828, + 0x1207c42c, + 0x077f1c03, + 0x7f1ce332, + 0x197f3ce3, + 0x803c0334, + 0x93f931c2, + 0x05daebf3, + 0x4c272027, + 0x03320520, + 0xa7f4c834, + 0xfffb330e, + 0x29be1827, + 0x0ea700ad, + 0x27fffae3, + 0xad1ebe14, + 0x802c2700, + 0x0ea71027, + 0xbefffa73, + 0x7e009ca6, + 0x2f07fe3b, + 0x4ea72303, + 0x07ffe777, + 0xe3f4053f, + 0x3ce37f2c, + 0x0334197f, + 0x32c2803c, + 0x774ea7f9, + 0x4001ffe7, + 0x31be04c6, + 0xf30100a7, + 0xf0434027, + 0x34053425, + 0xf98e3415, + 0x4007f74e, + 0x070f4c83, + 0x33340724, + 0x2b353323, + 0x87342b32, + 0x33a30ba3, + 0x037007a3, + 0x067864af, + 0xdf0ea700, + 0x9207ffff, + 0xbe07a899, + 0x2300a8b5, + 0xffff849e, + 0xdb4bfd93, + 0x6bcea705, + 0x3027fffc, + 0xcc030e1e, + 0x10dc0314, + 0x04d4cfc0, + 0x2332ff00, + 0x03c401c8, + 0x004e83c8, + 0x4ec40300, + 0xe3030000, + 0xb016db19, + 0x4fc6c401, + 0xf6d459da, + 0x0500ef4f, + 0x14cc03cb, + 0xdc033127, + 0xd4cfc410, + 0xd0ff0004, + 0x01153ff6, + 0x1aff8cc0, + 0x48872807, + 0x420b2433, + 0x038c43f1, + 0x3ea3ff00, + 0xf5030000, + 0x00038c43, + 0xfc9419ff, + 0xe000d744, + 0x00e0ff8c, + 0x24332807, + 0x420b4887, + 0x039443f1, + 0x3fe6ff00, + 0xa3c100ce, + 0x03420750, + 0x0668344f, + 0x8843d500, + 0x58a39901, + 0xd92afd93, + 0x8643bd05, + 0x5aa39901, + 0x018c43bd, + 0xbd049399, + 0x99018743, + 0xa0c10592, + 0x59a19954, + 0x27faf77e, + 0x05929d20, + 0xc009a399, + 0x3313ff3c, + 0x343f0334, + 0xb9000668, + 0x23018534, + 0x8534bd41, + 0x1d945901, + 0x5d412392, + 0xffcea794, + 0xc4b9ffff, + 0x71030100, + 0xc4bd4123, + 0xa3c10100, + 0xfcc7c5d4, + 0xd1d13219, + 0x41271028, + 0x41cb423b, + 0xa3c53027, + 0xdf0ea7d4, + 0xd4d5ffff, + 0x73be1028, + 0xc19900a7, + 0x9d0ea70e, + 0xf70efff9, + 0x00ab0b9e, + 0x9903d0c1, + 0x212707d1, + 0xc1fa837e, + 0xd25903d0, + 0x0403d139, + 0x757e2123, + 0x5d4027fa, + 0xfef55ed4, + 0x10270a07, + 0x327e2127, + 0xff8ce494, + 0x9499ff24, + 0x9347d604, + 0x05d86bfd, + 0xa7ff525e, + 0xffffff4e, + 0xa70e4199, + 0xfff99d0e, + 0x00aabfbe, + 0xc1fedb5e, + 0xa19950a0, + 0x7e21275a, + 0xa0c1fa34, + 0x04929950, + 0x0358a199, + 0x7e212304, + 0x4027fa24, + 0xd832fd93, + 0x04949d05, + 0x4eff165e, + 0xa9fc93f7, + 0xf0a305d9, + 0x30274027, + 0xffdf0ea7, + 0x057c07ff, + 0x9df34df4, + 0xaea706f4, + 0xbefffc6b, + 0x2700a6ed, + 0x23d02780, + 0x0e1e407c, + 0xcc03d103, + 0x14ac0310, + 0x9410dce0, + 0x23ba0700, + 0xd8b401b8, + 0x0300004e, + 0x86c41923, + 0x09c39948, + 0x09ff3cc0, + 0x340b4f07, + 0x341d4127, + 0xc00ac399, + 0x0709ff3c, + 0x27340b4f, + 0x19341d41, + 0xa745d6c4, + 0x0ac39d30, + 0x2709c39d, + 0x01a41540, + 0x004e83b4, + 0x4ec40300, + 0xa9030000, + 0x9616c939, + 0x4586a401, + 0x4ff6c479, + 0xa9050088, + 0xc3098127, + 0x01923fd6, + 0xe32707b4, + 0x0300004e, + 0xa38db405, + 0x9340270a, + 0x05d8fff3, + 0x2b08a48d, + 0xce241937, + 0x2103594d, + 0xd103f3b0, + 0x0310cc03, + 0xdce414ac, + 0x27ff7010, + 0x03061ed0, + 0x1fd7c0d1, + 0x4d0b4f07, + 0x32b64319, + 0x637e0d07, + 0x2708ab95, + 0x27048640, + 0x03840741, + 0xc48f6bd1, + 0x0ea7e3d7, + 0xbeffffdf, + 0x6600a5f2, + 0xff4ea786, + 0x4199ffff, + 0x9d0ea70e, + 0x85befff9, + 0xf08300a9, + 0x40a7f78e, + 0xa31e241d, + 0xc199c011, + 0x7e212708, + 0xc011f8f4, + 0xc159c279, + 0x21230403, + 0x27f8e77e, + 0x5ec47d40, + 0xfb4eff5e, + 0x00c1d007, + 0x7e1d07f4, + 0xb007f911, + 0x0b0704c6, + 0xcea7fb8e, + 0xd1ffffff, + 0xa70650c4, + 0xfff24b0e, + 0xc4d54103, + 0x83be0650, + 0x00c80125, + 0x87300739, + 0xc1363340, + 0x430b34dd, + 0x0dc44df5, + 0x4227ff00, + 0x0db804fd, + 0x807eff00, + 0xbd4127fe, + 0x990668c4, + 0x40270fc3, + 0x270ef49b, + 0x07338741, + 0x4034f50b, + 0x8eff02b0, + 0x00ff1efb, + 0x00000290, + 0x000001e0, + 0x00000200, + 0x00000180, + 0x000669b8, + 0xff00038c, + 0x000667da, + 0x3ea7f54e, + 0x99ffffff, + 0xf3632734, + 0x050b4fe6, + 0xd65af993, + 0x08949905, + 0x04ff4ff6, + 0x065830d1, + 0x065c3ad1, + 0x010234a9, + 0x010433a9, + 0x1407a02b, + 0xabe6e307, + 0x21832007, + 0x32874207, + 0x340b4733, + 0x4307320b, + 0x432b4333, + 0x4e23420b, + 0xa9fff994, + 0xa9034842, + 0x2b034643, + 0x0be1071e, + 0x2befab32, + 0xec3f8b3e, + 0x0704a731, + 0x2301031a, + 0x70f1f8a1, + 0xff4ea704, + 0x40d5ffff, + 0xa0270658, + 0xf2a52027, + 0xffff7ea7, + 0xd1f593ff, + 0x78d1061f, + 0x4807065c, + 0x24074183, + 0x27333487, + 0x340b320b, + 0xd333d307, + 0xd40bd32b, + 0x156178bd, + 0xde230807, + 0xbefff994, + 0xf80174f3, + 0x0706a304, + 0x0f4c8348, + 0x34072407, + 0x35332333, + 0x342b322b, + 0xc30bc387, + 0xcf03c333, + 0x00067864, + 0xe004c199, + 0x06a2101c, + 0xe030c4c1, + 0xb906c541, + 0xd10257c4, + 0xa9064490, + 0xa9034cc2, + 0xf00210c3, + 0x2705b842, + 0x1323ca41, + 0x73b94656, + 0x40070e65, + 0x4223432b, + 0x41ec4f4b, + 0xc49906e1, + 0x99474605, + 0xf39507c3, + 0xf3b53433, + 0x68343f03, + 0x34b90006, + 0x4ce0018d, + 0x3603f8ff, + 0x05c49915, + 0x058c4ff6, + 0x4c073d07, + 0x03643c03, + 0x2c27d84c, + 0x034b0112, + 0x033b0544, + 0x01f2a834, + 0x274427c1, + 0xbdd10532, + 0xbd0363d4, + 0x990364d3, + 0xc48917c3, + 0xd0c2c12c, + 0xbd34cbc1, + 0xad035bd3, + 0x070350d4, + 0xd54c073d, + 0xd50274d2, + 0x0302bcdb, + 0x0301943d, + 0x2701204d, + 0x4001322c, + 0x30054403, + 0xf2a83403, + 0x01e8c2d1, + 0x4c073d07, + 0x025cd2d5, + 0x02603d03, + 0x01ec4d03, + 0x4b012427, + 0x3b054403, + 0xf2a83403, + 0x340d4409, + 0xd544c1c1, + 0x990278d1, + 0xd2bd07c2, + 0xc3c1035e, + 0xc0d3d530, + 0x72c4b902, + 0x62d4bd03, + 0x2ecb8903, + 0xad4cc1c1, + 0x890346db, + 0xd1d526c0, + 0xd0ad027c, + 0xc2890342, + 0x070d0728, + 0x44d2ad1c, + 0x000d0303, + 0x402c2703, + 0xbe901c03, + 0xc1011a96, + 0x4c073c93, + 0x028cd3d5, + 0x34033d07, + 0x02004d03, + 0x01182c27, + 0x0544034b, + 0xa834033b, + 0x48c1a9f2, + 0x4ad1ad03, + 0x4ac2a903, + 0x4cd2ad03, + 0x94577e03, + 0xd0ad0fab, + 0x0ff6034c, + 0xc4a9044a, + 0x3d07034c, + 0x034ed4ad, + 0x3c034c07, + 0x604d03ac, + 0x3a2c2702, + 0x44034b01, + 0x34033b05, + 0xc4b9f2a8, + 0x3027035a, + 0x31274486, + 0xbd5094c1, + 0x990354d3, + 0xd4bd5444, + 0xc1b90355, + 0xd1bd0350, + 0xc2b90356, + 0xd2bd0351, + 0xc3d10357, + 0xd3d50354, + 0xc4b902d8, + 0xd4bd0358, + 0xcbb90358, + 0xdbbd035b, + 0xc0d10359, + 0xd0d50364, + 0xc1d102d0, + 0xd1d50368, + 0xc2c102d4, + 0x80d2d550, + 0x54c3c102, + 0x0284d3d5, + 0xd558c4c1, + 0x7e0288d4, + 0x0f6b92e8, + 0x0384d0bd, + 0x5bc107c6, + 0x74dbd568, + 0x5850c103, + 0x0378d0d5, + 0xd57051c1, + 0xc1037cd1, + 0xd2d57452, + 0x3d070380, + 0x3d034c07, + 0x4c030290, + 0x0129275c, + 0x0544034b, + 0xa834033b, + 0x80c199f2, + 0x02b4d1bd, + 0x036cc2b9, + 0x035ad2bd, + 0xbd18c399, + 0x99035fd3, + 0xd4bd05c4, + 0xcbb9035c, + 0xdbbd0371, + 0xc0b9035d, + 0xc1c1036e, + 0x65d0bd38, + 0xc4d1d503, + 0x6dc2b902, + 0xbdfb9303, + 0xd2bd05d2, + 0xb4990366, + 0x654fe61c, + 0xb5f35303, + 0xd53401fc, + 0xb902b8d4, + 0xbd036fc4, + 0xd10367d4, + 0xd50374c0, + 0x9902c8d0, + 0xd1bd1bb1, + 0xc2b90360, + 0xd2bd0370, + 0xb3990361, + 0x69d3bd31, + 0x959f7e03, + 0x036ad0bd, + 0x0394c4b9, + 0x4fff2ea7, + 0xa0d4bdfd, + 0x33b39903, + 0xbd7424c1, + 0xe8036ed3, + 0xe602e040, + 0x99043b3f, + 0xd0bd60b0, + 0xb199036f, + 0x70d1bd61, + 0x62b29903, + 0x0371d2bd, + 0xbd63bb99, + 0xb90372db, + 0xbd0378c4, + 0x060385d4, + 0x84c3d14c, + 0x79c2b903, + 0x90d3d503, + 0x80c4d103, + 0x86d2bd03, + 0x8cd4d503, + 0x88cbd103, + 0xd5402703, + 0xd10394db, + 0xbd037cc0, + 0xd50387d4, + 0xd10388d0, + 0xd50390c1, + 0xd1039cd1, + 0xd5038cc3, + 0xb90398d3, + 0x930395c4, + 0x05cb33f3, + 0x03a1d4bd, + 0xd4bd4127, + 0x34b9036b, + 0x20270153, + 0x21274486, + 0x01283bd1, + 0x036dd2bd, + 0x02dcdbd5, + 0x013830d1, + 0x02ecd0d5, + 0x014831b9, + 0x02fcd1bd, + 0x012c32d1, + 0x02e0d2d5, + 0x013c34d1, + 0x02f0d4d5, + 0x01493bb9, + 0x02fddbbd, + 0x013030d1, + 0x02e4d0d5, + 0x014031d1, + 0x02f4d1d5, + 0x014a32b9, + 0x02fed2bd, + 0x013434d1, + 0x02e8d4d5, + 0x01443bd1, + 0x4fff4ea7, + 0xf8dbd5fd, + 0x4b33b902, + 0xffd3bd01, + 0x4492d102, + 0x5073d106, + 0x48908906, + 0xd0ad4111, + 0x21030348, + 0x40273103, + 0x065073d5, + 0x13e872d5, + 0x156074bd, + 0x064492d5, + 0x155871d5, + 0x41034807, + 0x065c74d5, + 0xf39b3027, + 0x2ec4890e, + 0xa7489389, + 0xfff99f0e, + 0x948d430b, + 0xa379be48, + 0x03112700, + 0xf0f1a5a1, + 0x27fbb1a2, + 0x073d1ed1, + 0x07218320, + 0x33428732, + 0x0b430b37, + 0x33340742, + 0x0b342b33, + 0x943e2332, + 0x32a9fff9, + 0x34a90348, + 0x420b0346, + 0x4f8b4e2b, + 0xfb5f41e8, + 0xffff4ea7, + 0x5840d5ff, + 0x65a1e006, + 0x07d027fb, + 0x8ef3430d, + 0x8e34b9f5, + 0xff4ce401, + 0x187efc03, + 0x22c689f9, + 0x9924cb89, + 0x6c0306c4, + 0x0fbc030f, + 0xb4736473, + 0xb10344c6, + 0xc4c1b153, + 0x30f4c534, + 0x8930f0c1, + 0x0c836454, + 0xc503330f, + 0x01f930f0, + 0xff00007f, + 0x46eef185, + 0x117e0266, + 0x64568d90, + 0xc1665b8d, + 0x4fe66054, + 0x54c10281, + 0x0746a658, + 0x27350724, + 0xe0341910, + 0x03016642, + 0x0c3c0311, + 0x6c7ef290, + 0x4c0ff68d, + 0xff1ea702, + 0x1499feff, + 0x2ec18909, + 0x24874383, + 0x422b4433, + 0x004d43f9, + 0x3203ff00, + 0x023413e2, + 0xffdf0ea7, + 0x9f97beff, + 0x30f2c100, + 0x30274027, + 0x007f2ef9, + 0xf405ff00, + 0xf49df34d, + 0x21f35306, + 0x21f453fa, + 0x013001fa, + 0xd8140141, + 0x0300004e, + 0xc6021929, + 0x09049928, + 0x0bff4cc0, + 0x4b0bbf07, + 0x230b4319, + 0x0499421d, + 0xff4cc00a, + 0x0b2f070d, + 0x19431942, + 0x1d320b02, + 0x141c0343, + 0xc4100c03, + 0x0004cc1f, + 0x1027c4ff, + 0x4f072727, + 0x4319410b, + 0x011831e0, + 0xf2881103, + 0xffdf0ea7, + 0x9efcbeff, + 0x48998900, + 0x4fff4ea7, + 0xad4211fd, + 0xa70348d9, + 0xffffff3e, + 0x34bd4b27, + 0xfda11560, + 0x32d51b27, + 0x13e41558, + 0x3ea7fec3, + 0xd1ffffff, + 0xa7065c34, + 0xfff99f0e, + 0x34d54103, + 0xd8be065c, + 0xa85e00a1, + 0x7424c1fe, + 0x00004ef8, + 0x5efd1a01, + 0x9389fd1b, + 0x4ad3ad58, + 0x58948903, + 0x4fab4103, + 0xa958948d, + 0xee034cd3, + 0x27fba143, + 0xcdf49330, + 0x438d05cf, + 0xfb945e58, + 0xa05e4027, + 0x58c4b9fc, + 0x10e02702, + 0x07e12742, + 0x5e4f6b4e, + 0x217efa3d, + 0x710fe68f, + 0xdf0ea7fa, + 0x86beffff, + 0xc399009e, + 0xdf0ea707, + 0x3433ffff, + 0x69b83f03, + 0x34190006, + 0x341d4203, + 0x009e49be, + 0x81fa4b5e, + 0xee4147fb, + 0x07fe96b4, + 0x33418731, + 0x27342b34, + 0xfdb10721, + 0x06b22032, + 0xe0bf6b00, + 0xfe84ffbc, + 0xf1b14b07, + 0x44333b87, + 0xf091432b, + 0x69c11bfd, + 0x4f030006, + 0x0006b220, + 0x20874311, + 0x23f5210b, + 0xff000398, + 0x24f54421, + 0xff000390, + 0x5e04c199, + 0x4147f9ef, + 0xfee6e4ee, + 0xbf6bb107, + 0xffdf0ea7, + 0x9de0beff, + 0xffbcc400, + 0xfedf5eb8, + 0x25271527, + 0xa7489989, + 0xfd4fff4e, + 0xd9ad4311, + 0x4ea70348, + 0xbdffffff, + 0xa1156042, + 0x5843d5fd, + 0xfedc5e15, + 0x065074d1, + 0x94994816, + 0xe5fc9304, + 0x42dc05ce, + 0x7e080714, + 0xc4998b0d, + 0xa3122704, + 0x9d222742, + 0x0b1e04c4, + 0x27271727, + 0x1327b71e, + 0x4ea72327, + 0x89fd4fff, + 0x43114899, + 0x0348d9ad, + 0xffff4ea7, + 0xd5d127ff, + 0xbd155843, + 0x5e156042, + 0x5489fe8e, + 0x97b4ee66, + 0xfd9d5efd, + 0xf1930427, + 0x9e00e156, + 0x7e009c05, + 0x02e08b25, + 0x1b27fdb1, + 0x715e2b27, + 0x0c1c27ff, + 0x695e2107, + 0x8db27eff, + 0x0fe60f6b, + 0x52c1016c, + 0x5453c15c, + 0x89645189, + 0x23f86654, + 0x17030270, + 0x17e34803, + 0xed2747e3, + 0x0d271000, + 0x3cf80fff, + 0xf8023920, + 0x53022c32, + 0x01f7bbfb, + 0x0d21d8b3, + 0x2c832307, + 0x0324e67f, + 0x322b803c, + 0x649b6107, + 0x26076433, + 0x24c6208b, + 0x622b6e0b, + 0x14072187, + 0x1303239b, + 0x02073107, + 0x0c833253, + 0xe631237f, + 0x8701dd0f, + 0x53411b43, + 0x802c0342, + 0x0407202b, + 0x1007030b, + 0xf035029b, + 0x2287f431, + 0xf245460b, + 0x2427f455, + 0x89645489, + 0x53c1665b, + 0x23430358, + 0x0343e331, + 0x9b4153b1, + 0x0bb15313, + 0x33b49b12, + 0x7051c5b6, + 0xf151f031, + 0xbc03fb65, + 0x0b3103a0, + 0x6850c5b1, + 0x9b7456c5, + 0x8cee7eb3, + 0x05460f6b, + 0xf231f441, + 0xb40b422b, + 0x0b071b07, + 0x53be2127, + 0x50c5009c, + 0x7eb00760, + 0x0f6b8cd0, + 0x011b0fe6, + 0xe65854c1, + 0x27fca94f, + 0x75150730, + 0x27f325f3, + 0x834b07e0, + 0x3b071f4c, + 0x3c0344e6, + 0x07342b20, + 0x074e0b43, + 0x1f2c8324, + 0x4c0324e6, + 0x15422b20, + 0x83430714, + 0x03077f4c, + 0x0c0344e6, + 0xc1042b80, + 0xb0075854, + 0xf0313607, + 0x4123349b, + 0x340b409b, + 0xf421f241, + 0x320b3b0b, + 0x4307340b, + 0xe67f4c83, + 0x803c0344, + 0x4227342b, + 0x1325141d, + 0xf221f071, + 0x0103f361, + 0x54c1230b, + 0x25f07558, + 0x0c1c03f2, + 0x04cae60b, + 0xfc135e8d, + 0xc15c52c1, + 0x50895453, + 0x66548964, + 0x00f923f8, + 0x07031407, + 0x07e31803, + 0xbd2717e3, + 0xed271000, + 0x3cf80fff, + 0xf800fa20, + 0x5300d532, + 0x01f64ff3, + 0x0d21d834, + 0x3c833407, + 0x0334e67f, + 0x432b804c, + 0x319b3007, + 0x23073433, + 0x24c62e8b, + 0x322b3b0b, + 0xe09be407, + 0x01072e87, + 0x42070303, + 0x4c830253, + 0xe601237f, + 0x802c0344, + 0x4087242b, + 0x4e9b411b, + 0x1c831407, + 0x0314e67f, + 0x412b804c, + 0x230b209b, + 0xf255240b, + 0x20276027, + 0xf6351027, + 0x8d5ef245, + 0x5854c1fe, + 0xfb904fe6, + 0x10272507, + 0xfb61051e, + 0x3b07b00b, + 0x071f3c83, + 0x0334e64b, + 0x432b204c, + 0x2415f051, + 0x4007040b, + 0xe67f4c83, + 0x800c0344, + 0x4227042b, + 0x54c1241d, + 0x03202558, + 0x0c2c0311, + 0x5ecc14ca, + 0x4387fb3d, + 0x4253411b, + 0x130b1407, + 0x329b3107, + 0x295ef335, + 0x95fb53fe, + 0x5eb301f5, + 0x32d8fdd5, + 0x8dfb5337, + 0x5eb301f5, + 0xf353fdc9, + 0x3401f580, + 0x07ff2c5e, + 0x27110314, + 0xec2780bc, + 0xff105e7f, + 0xec274103, + 0x7f0c2780, + 0xd8fd995e, + 0xf3531332, + 0x3401f560, + 0x53ff085e, + 0x01f55bfb, + 0xfd935eb3, + 0xf552f353, + 0xf65e3401, + 0x93fa4efe, + 0x05cbc3fa, + 0x41e0a419, + 0x4ea7012b, + 0xb9ffffff, + 0xc101004b, + 0xbc0bfc4c, + 0x1e10cbca, + 0xfd40273b, + 0x00007cd4, + 0xcec103ff, + 0xdc072ebc, + 0x330fdc83, + 0x7cd4f9d3, + 0x83ff0000, + 0x42c4224c, + 0xfd4127e1, + 0x00007ed4, + 0x7e0c07ff, + 0x4027f180, + 0x007cd4fd, + 0xc103ff00, + 0x93d4cbce, + 0x05cceff4, + 0x2c032407, + 0xe33407ff, + 0x3ce37f2c, + 0x0334197f, + 0x32c2803c, + 0x70a399f9, + 0xcb4efd93, + 0xff3cc005, + 0x03343319, + 0x0669b83f, + 0xa7343900, + 0x3d412320, + 0x9d402734, + 0xd4c570d2, + 0xf3057e74, + 0xffdf0ea7, + 0x9a0bbeff, + 0x44dcc100, + 0xffff3ea7, + 0xbd4027ff, + 0x27010034, + 0xc501402d, + 0x3cd5fc3c, + 0x0ea70654, + 0x27fffc73, + 0x8d70be10, + 0x034d0700, + 0x2701844d, + 0x403c2720, + 0x44034205, + 0xf393f3c8, + 0x9305cc79, + 0x05cae7fd, + 0xa7102c27, + 0x1d343d40, + 0x103c0334, + 0xd4c1f2a0, + 0x2749d63c, + 0x88e87e00, + 0x0d07d127, + 0xdf7ed103, + 0xf7d7c488, + 0x302740a7, + 0xffdf0ea7, + 0x44acc5ff, + 0xc570a49d, + 0x6fbe74a3, + 0xfa0e0099, + 0x99ef395e, + 0xf0933ad1, + 0x2705cadc, + 0xec867e21, + 0xd4c54027, + 0x27c11e3c, + 0x7ea41d42, + 0xcf5ed85f, + 0xd0fe4efe, + 0x2810010d, + 0x030c2c27, + 0x3be12721, + 0xf8e0cae2, + 0xffff3ea7, + 0x3834d1ff, + 0x0b020706, + 0x271027e4, + 0x383ed522, + 0x9efe0e06, + 0x2703f07a, + 0xed270c2c, + 0xdd1e1000, + 0xeea7fc4e, + 0xc1fff9f3, + 0xd10734e4, + 0xd4074606, + 0xf9f3cea7, + 0xcac4a1ff, + 0xfc8e484d, + 0xffff3ea7, + 0x093499fe, + 0x8324e299, + 0x33348743, + 0xf9432b44, + 0x00004d41, + 0x032803ff, + 0x271d9b12, + 0x3b100b41, + 0x0be3a142, + 0x4013ca14, + 0x1fd0d107, + 0x10000001, + 0xf3cea7c0, + 0xc4a1fff9, + 0x0000df27, + 0xd4c21000, + 0xdf0ea7ba, + 0xb4beffff, + 0x09760098, + 0xffdf0ea7, + 0x98c3beff, + 0x070c0700, + 0xd9f67e1d, + 0xffdf0ea7, + 0x9efc0eff, + 0x0700988e, + 0xf0d10713, + 0x0000011f, + 0x1eff7f10, + 0x070c07bd, + 0x5efc0e1d, + 0x0000d9d4, + 0x0000000c, + 0x00060000, + 0x00001000, + 0xa107f54e, + 0xc99ef193, + 0x1df59305, + 0x11c10614, + 0xc1f3a344, + 0xa1a56c54, + 0xb530f2c5, + 0x85f293f0, + 0x2cc105c9, + 0x2542c444, + 0x017454d1, + 0x991e4cce, + 0x0c1b7050, + 0x8387ac7e, + 0x0c40180c, + 0x130c2718, + 0xf58ef383, + 0xc95ef393, + 0x443cc105, + 0xffdf0ea7, + 0x9837beff, + 0x87d77e00, + 0xffff3ea7, + 0x093499fe, + 0x24874383, + 0x422b4433, + 0x004d43f9, + 0x3403ff00, + 0xc3ca300b, + 0xdf0ea710, + 0xebbeffff, + 0x0b270097, + 0xf58ef383, + 0x2c832c07, + 0x3332070f, + 0x7c34f933, + 0x07ff0000, + 0x84ee23e3, + 0x4ff6ffff, + 0x420700a9, + 0x432b4533, + 0x0487422b, + 0x0333040b, + 0x78640f03, + 0x04c10006, + 0x340cc5d4, + 0x441946e6, + 0xc8e6f793, + 0x2872d105, + 0x3b312710, + 0xd532cb34, + 0x93102873, + 0x05c8d3f1, + 0x10281dd1, + 0x102c14d1, + 0x41f84dab, + 0x2027126a, + 0x21034153, + 0x27fa41dc, + 0x07123b11, + 0x33428732, + 0x0b1dab34, + 0xa9f39343, + 0x31d505c8, + 0xf3931028, + 0x01061280, + 0xa7422b31, + 0xfd4fff2e, + 0x43332311, + 0x13c5140b, + 0xd401c588, + 0x20a73027, + 0xe39d4127, + 0x9de33d05, + 0xe41d04e3, + 0x029de27d, + 0xff3ea707, + 0x34b9ffff, + 0x44b60100, + 0x03fc3cc5, + 0x0034bd41, + 0xdf0ea701, + 0x1bbeffff, + 0xf4930097, + 0xc105c854, + 0x41994449, + 0x8339070a, + 0x23070f3c, + 0x23334307, + 0x422b4533, + 0xd487432b, + 0xd333d40b, + 0x7864df03, + 0xd7c10006, + 0x29fb93d4, + 0xf79505c8, + 0x033a1fe6, + 0xe00aa499, + 0x0332104c, + 0x02ceb1b9, + 0xe1def793, + 0xb9402704, + 0xb90286b2, + 0x0502cfb0, + 0x15180374, + 0x03210374, + 0xb9715d08, + 0xb90285b3, + 0x9d02d0b1, + 0x707d0572, + 0x02d1b2b9, + 0x0288b0b9, + 0x713d3103, + 0x739d1b07, + 0x9d701d04, + 0x1d030672, + 0x28271020, + 0xebbe0707, + 0xc0070089, + 0x8910a189, + 0xa2890ea0, + 0x32a38930, + 0x27869e7e, + 0x27c49641, + 0xa940ab40, + 0xc102b0b3, + 0x11276cb2, + 0x10274496, + 0x230e0027, + 0xb3b90127, + 0xb4990284, + 0xab210709, + 0x0e102720, + 0x07112734, + 0xe641ab42, + 0x0700a54f, + 0x7e012309, + 0x04e685bd, + 0x8f200cf8, + 0xef4d7e11, + 0xf0937459, + 0xb905c770, + 0xf0028402, + 0x39116649, + 0x00c12774, + 0x03c02742, + 0x938021cd, + 0x05c757f3, + 0x936834c1, + 0x06113bf9, + 0x01004d83, + 0x93c1b207, + 0x96812758, + 0x03802744, + 0x898847b1, + 0xa1890ea0, + 0x30a28910, + 0xee32ae89, + 0x7e11163b, + 0xf293eeff, + 0x27061110, + 0x03241937, + 0x41e00c2c, + 0xf3a010fd, + 0xee5894c1, + 0x7e10bc4b, + 0x98c58618, + 0x589bc55c, + 0x93549cc5, + 0x05c6fff0, + 0x04a97111, + 0x770102b0, + 0x028402b9, + 0x102401d5, + 0xd56c04c5, + 0x9d102007, + 0xf7930902, + 0x2705c6e0, + 0x8570b940, + 0x0a749d02, + 0x028674b9, + 0x9d35709d, + 0x70b93674, + 0x74b9028a, + 0xf393028b, + 0x9d05c6c0, + 0x749d3770, + 0x8c70b938, + 0xc074d102, + 0xac32a902, + 0xb031a902, + 0x8d33b902, + 0x39709d02, + 0x9b4074c5, + 0xef3fe612, + 0x07320704, + 0x33383342, + 0x47430b44, + 0x0b410b84, + 0x27744581, + 0x81f79340, + 0x0ea705c6, + 0xbdffffdf, + 0xbe49d874, + 0xa7009559, + 0xffffff2e, + 0x064029d1, + 0x9ff6c707, + 0x73a90f0e, + 0x7ca902b2, + 0x4c2702ac, + 0x7824bd10, + 0x7d29bd18, + 0xa7c39b18, + 0xffffdf0e, + 0x009509be, + 0xc642f093, + 0xc001d105, + 0xbc04d102, + 0xb802a902, + 0x03140b02, + 0x0b07f81d, + 0xae03a912, + 0xc402d102, + 0x55338702, + 0xdc02d50c, + 0xf0130b49, + 0xb510018d, + 0x0c3c270f, + 0x41273103, + 0x48ca433b, + 0x933f6bf8, + 0x05c603f7, + 0x739d7451, + 0x023c0724, + 0xf034074c, + 0x7a10013d, + 0x0c2c270e, + 0x41272103, + 0x43ca423b, + 0x6b4207f8, + 0xddf0934f, + 0x049d05c5, + 0x011df025, + 0x270e5610, + 0x31030c3c, + 0x433b4127, + 0x07f841ca, + 0x934f6b43, + 0x05c5bff1, + 0x9926149d, + 0x4c142414, + 0x0c4c270c, + 0xc5aef293, + 0x25219905, + 0x1424249d, + 0x1c270c1c, + 0x9df3930c, + 0xf79305c5, + 0xa905c598, + 0xb9029a32, + 0xa902d074, + 0x23029833, + 0x03239b42, + 0x9d03ff2d, + 0x4f6b2571, + 0x42f02a53, + 0x32470e1d, + 0x3153320b, + 0xc56ef093, + 0x9302b905, + 0xb9b00702, + 0x9602ce01, + 0x104c2725, + 0x029304bd, + 0x07102c27, + 0x53470343, + 0x0b419b43, + 0x24b09943, + 0x2127429b, + 0xe207203b, + 0x4a334553, + 0xb1993227, + 0x0be12325, + 0x3b4307e4, + 0x13303b41, + 0x8b430b20, + 0x074e02e2, + 0x271e07e4, + 0xface7e00, + 0x02acbca9, + 0x02bab2a9, + 0x4ea7c303, + 0xe3d07fff, + 0x81c203c3, + 0x8d402743, + 0xb49d28b2, + 0x2ac29b34, + 0x9d41273c, + 0xb4c134b4, + 0x5e4cea30, + 0x87b1b90d, + 0x07b19d02, + 0xf2930d07, + 0x0305c4e4, + 0x27025fdd, + 0x000d0330, + 0xc540a702, + 0x248d4c23, + 0x0730074a, + 0x7f2ce32d, + 0x025fdd23, + 0x197f3ce3, + 0x803c0334, + 0xc1f932c2, + 0x1a0730f2, + 0x010ad9be, + 0x1d031d07, + 0x0d070120, + 0x0c031123, + 0x072107d8, + 0x7f2ce330, + 0x3ce31103, + 0x0334197f, + 0x32c2803c, + 0x8df393f9, + 0x39d105c4, + 0x2c2702d8, + 0x07490712, + 0x0c4c0330, + 0x44034701, + 0x34033705, + 0xf293f2a8, + 0xd105c470, + 0xb902d820, + 0x83016703, + 0x583fe631, + 0xe7dd0302, + 0x072d0701, + 0x7f2ce331, + 0x01e7dd23, + 0x197f3ce3, + 0x803c0334, + 0x07f932c2, + 0x03310740, + 0x2c27544c, + 0x03470132, + 0x03370544, + 0x93f2a834, + 0x05c42ff1, + 0x02d814d1, + 0x017c44d1, + 0x01e8d4d5, + 0x832ad489, + 0x8dffdf4d, + 0xee7e2ad4, + 0x14ab8983, + 0x0378d0bd, + 0x7a21bcf4, + 0xbd402701, + 0xb90378d4, + 0xe60379d4, + 0x2702054f, + 0x9d102746, + 0xa49909a4, + 0x554fe608, + 0xe9f79301, + 0x73d105c3, + 0x002702d8, + 0x016434d1, + 0x4f1c2027, + 0x08000000, + 0x42072127, + 0x418b41c3, + 0x01274486, + 0x4f6b4007, + 0x01ecd4bd, + 0xb9694fc6, + 0xbd012c34, + 0xc601edd4, + 0x13075e4f, + 0x00272d07, + 0xa912a389, + 0x02013014, + 0x53430743, + 0xee24ad45, + 0x12a38901, + 0x013214a9, + 0x43074302, + 0x531f4c03, + 0xf024ad45, + 0x14a38901, + 0x013414a9, + 0x43074302, + 0x24ad4553, + 0xa38901f2, + 0x3614a914, + 0x07430201, + 0x1f4c0343, + 0x24ad4553, + 0xd3b901f4, + 0x010301ed, + 0x28031803, + 0x93aa03ca, + 0x05c353f0, + 0x02d803d1, + 0x34d1c007, + 0x4ff80164, + 0x02000000, + 0x34b90170, + 0x2027011c, + 0x549d30a7, + 0xb453d51b, + 0xa352bd02, + 0x19549d02, + 0x02a052bd, + 0x271a549d, + 0x95d4bd41, + 0x08a39903, + 0xd4b93576, + 0x4ce00120, + 0xc101a7ff, + 0x9351e8d1, + 0x9461f7b1, + 0x28532107, + 0x074073c5, + 0x303c8331, + 0x834474c5, + 0xc6345321, + 0x83320324, + 0x53410733, + 0x0e418349, + 0xb134a324, + 0x95039df0, + 0xd582eb7e, + 0x930354d0, + 0x05c2d3f1, + 0x49d811b9, + 0xbdf0d489, + 0xc50394d1, + 0x4de030d4, + 0x0b3b1102, + 0x11034df4, + 0x4de000c7, + 0x0b070182, + 0x01834df4, + 0x4de00112, + 0x0b350102, + 0x01034df4, + 0x41e0011a, + 0xff1e0c37, + 0xd4bd4027, + 0x3c5e01ec, + 0x8c0fe6ff, + 0x826d7efe, + 0x0384d0d5, + 0x6e7ec007, + 0x031b0782, + 0x15731f1c, + 0x0380d0d5, + 0x02144107, + 0x10020227, + 0xc10b1007, + 0xdcd50407, + 0xd1d50388, + 0x56be0380, + 0xd0d500c0, + 0xa499037c, + 0x9345d608, + 0x05c24ff2, + 0xd54423c1, + 0x9349d423, + 0x05c243f4, + 0x49d443d1, + 0x0388d1d1, + 0x0390d3d5, + 0x074440c1, + 0x2b412341, + 0x2d04c203, + 0x2608a499, + 0xbe012b49, + 0xd100c013, + 0xd50380d4, + 0xc2038cd0, + 0x41271740, + 0x0379d4bd, + 0x27fe125e, + 0x20d4bd40, + 0x24d3bd01, + 0xfdde5e01, + 0xd4bd4027, + 0x11270379, + 0xe0fe015e, + 0x4e31044d, + 0x054df40a, + 0xe000cd31, + 0xb511214d, + 0x224df40b, + 0xe000b211, + 0xa311044d, + 0xff385e0b, + 0x016431b9, + 0xc07e0027, + 0xd8c4d181, + 0xb9012702, + 0x7e016541, + 0xc4d181b3, + 0x022702d8, + 0x016641b9, + 0x5e81a67e, + 0x4107fe8b, + 0x07404c03, + 0x0b815384, + 0x5e744584, + 0x4de0fb17, + 0x09f10281, + 0x02824dd4, + 0x014de019, + 0x5e0a1f02, + 0x4de0feee, + 0x0a210104, + 0x01214de0, + 0xdf5e0a15, + 0x014de0fe, + 0xe00b3c03, + 0x3003214d, + 0xfed05e0b, + 0xc166f193, + 0xd813d105, + 0xd1c10702, + 0xf6012034, + 0xb9fe4a4f, + 0x27016431, + 0x81457e00, + 0x02d8c4d1, + 0x41b90127, + 0x387e0165, + 0xd8c4d181, + 0xb9022702, + 0x7e016641, + 0x4027812b, + 0x0395d4bd, + 0xe0fe1e5e, + 0x0512014d, + 0x044de00b, + 0x5e0af921, + 0x4dc0fe82, + 0x341d8002, + 0xe080034d, + 0x7480014d, + 0xfe705e09, + 0x80214de0, + 0x4de0093c, + 0x09308022, + 0x27fe615e, + 0xd4bd154c, + 0xfb930372, + 0x3905c078, + 0x894566b4, + 0x4ca32ad4, + 0x2ad48d10, + 0xd4bd4027, + 0xb2990358, + 0xd5f0930c, + 0xd2bd05c0, + 0xb7990350, + 0x10d3a910, + 0x51d7bd02, + 0x6800c103, + 0xd5ead489, + 0xad0374d0, + 0x93034cd3, + 0x05c0b3f1, + 0x83541199, + 0x4fd1bd41, + 0x0dfc9303, + 0xd4bd060b, + 0xc299034e, + 0x0ed1a908, + 0x5ad2bd02, + 0xa6c05103, + 0x9b430706, + 0x0d40c241, + 0x010b0123, + 0x00be7cbe, + 0x034cd0ad, + 0x42e0c401, + 0x43340632, + 0x1e0d41c0, + 0xe743e0ff, + 0xde44e007, + 0x27f51e07, + 0x3cd4d131, + 0x004ef802, + 0x060dffff, + 0xd4bd4227, + 0xf493035d, + 0xb905b91c, + 0x07030343, + 0x70d3bd0d, + 0x0444b903, + 0x3df79303, + 0xd4bd05c0, + 0xcc990371, + 0x6fdcbd0b, + 0xaca27e03, + 0x8912a489, + 0xf1b12ad0, + 0xd50e708d, + 0x59021cd4, + 0x89717d11, + 0xd28d12a2, + 0x14a3891a, + 0xc00ef293, + 0x1cd38d05, + 0x2716a489, + 0x1ed48d30, + 0x8d18a789, + 0xa08920d7, + 0x22d08d30, + 0x9332a189, + 0x05bfeff0, + 0x9924d18d, + 0xd29d3522, + 0x36a4990f, + 0x31274496, + 0x9906d39d, + 0x40273703, + 0x035bd3bd, + 0x9d0cd49d, + 0xa4810bd4, + 0x9184d4c5, + 0x88d7c5a7, + 0xd1c5a1a1, + 0x0aa2998c, + 0x9904d29d, + 0xd39d0ca3, + 0xc5a4b105, + 0xa7b13cd4, + 0x9938d7c5, + 0xa4990ba3, + 0x8333470a, + 0x07340b41, + 0x9d4f6b43, + 0x019910d4, + 0x401cdc5a, + 0x04d29924, + 0x991e24d8, + 0x41c35b03, + 0x071734ee, + 0x275c0399, + 0x26356640, + 0x8ad49945, + 0x41c34183, + 0x031e4f6b, + 0xd49d4027, + 0x37a09916, + 0xd09d40a7, + 0x09d49d08, + 0x9d38a199, + 0xf2b111d1, + 0x2299f3b1, + 0x6ed2bd4f, + 0x27345903, + 0xa642e030, + 0xc3430705, + 0x12d49d41, + 0xbf36f493, + 0x28448905, + 0xd48df7b1, + 0x10a0892c, + 0xbf26f293, + 0x2a708d05, + 0xb10ea189, + 0x28718d22, + 0xc504d399, + 0x739dd0d2, + 0x15302718, + 0x04d499a3, + 0x5332a289, + 0x5b418342, + 0x3f2c0324, + 0x4c834207, + 0x5bd3b93f, + 0x404c1303, + 0xbeeef093, + 0x02102705, + 0x0b112734, + 0x27442723, + 0x14d49d32, + 0x9d17d19d, + 0x420715d3, + 0x03994653, + 0x2ed48d0b, + 0x024c3ff6, + 0xd48d4027, + 0x64d38d62, + 0xd10ea489, + 0x4702d802, + 0x62d48d44, + 0xc110a389, + 0x33474400, + 0x01a424b9, + 0xc564d38d, + 0x4fe634d0, + 0x22b905e3, + 0xd29d019c, + 0x95f49380, + 0x449905be, + 0x34dbc107, + 0xffdf0ea7, + 0x10d599ff, + 0x66bef4a5, + 0x2b07008d, + 0x330f2c83, + 0x27820723, + 0x848e2340, + 0x3327ffff, + 0x007e23fd, + 0x25fdff00, + 0xff00007f, + 0x008224fd, + 0x8603ff00, + 0xa799843d, + 0x65150737, + 0x0ca499f7, + 0xf7657183, + 0xd7998623, + 0x6144d607, + 0xfd05a6f0, + 0x00007f21, + 0xff7ce0ff, + 0xd79d0426, + 0x7857fd07, + 0x19000669, + 0xa3423c84, + 0x93841d42, + 0x05be1ff3, + 0xc3073461, + 0x03f44fe6, + 0xe680d299, + 0x8901092f, + 0xd48962d3, + 0x7121fc64, + 0x27439b05, + 0x75148700, + 0x5c22fcf0, + 0x47302705, + 0xfcf38504, + 0x89053b24, + 0xd3891ad4, + 0x0f4c031c, + 0x730f3c03, + 0x9b447334, + 0x07602734, + 0x0bb303b1, + 0xe3b30bb0, + 0x0bcb47b3, + 0x00cd14cb, + 0x00cd2710, + 0x774ea710, + 0x4001ffe7, + 0x05390fe6, + 0xc4c24411, + 0x300fe630, + 0xbe1c0705, + 0x07008b8b, + 0xa74c2640, + 0xffe7779e, + 0x1b070c07, + 0x9c159405, + 0x00bb90be, + 0x0c080fab, + 0x100c2711, + 0x403b4127, + 0x94254123, + 0xeea73027, + 0x27ffe777, + 0x1127102c, + 0x4107e021, + 0xc307433b, + 0xcf6b408b, + 0x46563103, + 0x0ea7f258, + 0xbeffffdf, + 0x27008c22, + 0xf4365e08, + 0x2f4b2c07, + 0xffff2fc0, + 0x3be8ffff, + 0xeb400712, + 0x773ea741, + 0x3425ffe7, + 0x0180d199, + 0x0b2b9b33, + 0x8511f832, + 0xc5430705, + 0x12fc68d4, + 0x40270575, + 0xfc6cd4c5, + 0x27056114, + 0xc5f27130, + 0xd4c170d3, + 0xc5f38134, + 0xd3c574d2, + 0x7cd6c578, + 0xc560dc9d, + 0x41275cd4, + 0x849d3027, + 0x05839d04, + 0xc60ca499, + 0xd6f0a144, + 0xa6f16104, + 0x87370716, + 0x0b343347, + 0xfdf29343, + 0x42f505bc, + 0xff000394, + 0x41238459, + 0xa399845d, + 0xa23ff636, + 0x04d49902, + 0x029444fc, + 0x57fd51c3, + 0x00066978, + 0xffdf0ea7, + 0x8b7cbeff, + 0xb5f29300, + 0x226105bc, + 0x0c030d07, + 0x44d2c590, + 0xf3932007, + 0x0705bca4, + 0xe34127d0, + 0x349d7f2c, + 0x90dc230b, + 0x34193207, + 0xc2803c03, + 0xf193f932, + 0x2705bdcc, + 0xa7be402c, + 0xa4890102, + 0x8df0b110, + 0xa78928d4, + 0x71f2930e, + 0xd78d05bc, + 0xc1007926, + 0xd09d44db, + 0x07f1b10d, + 0x0411990b, + 0xbc5af793, + 0x0ed19d05, + 0x014023c1, + 0x10a489ac, + 0x0b30f2c1, + 0x074487c3, + 0xbec40b1a, + 0x01010266, + 0x0b4b07a9, + 0xc59b0b4c, + 0xd9c550d4, + 0x2df3934c, + 0x339905bc, + 0x25f19324, + 0xd39d05bc, + 0x26779958, + 0x03fccd03, + 0xb15ad79d, + 0x071161f0, + 0x0b04853b, + 0xc541053c, + 0xf29354d3, + 0x9905bc04, + 0x4d072522, + 0x9559d29d, + 0x03300703, + 0x0303fccd, + 0x4c03703c, + 0x0129275c, + 0x05440347, + 0xa8340337, + 0x80d299f2, + 0xf393f1b1, + 0x9d05bbd8, + 0xdcc59412, + 0x5ad29948, + 0x02bc34d1, + 0x4c0b3127, + 0x342b323b, + 0xa289b40b, + 0xb9f49310, + 0x4b7505bb, + 0x26864385, + 0x10272907, + 0x24054027, + 0x0310a389, + 0xda240311, + 0x4027f313, + 0xb90ef49b, + 0xb1034fd0, + 0x91f193f7, + 0x709d05bb, + 0x0c14991d, + 0x01f04fe6, + 0xd2c1f1b1, + 0x44d3c134, + 0x19c51255, + 0x9913b530, + 0xf09308a4, + 0x9d05bb70, + 0xa7991914, + 0x1a179d09, + 0x9d240099, + 0xf1931b10, + 0xd105bb5c, + 0xf049dc12, + 0x7d10012d, + 0x0c3c2703, + 0x41273103, + 0x42ca433b, + 0x6b4307f8, + 0x0c4c144f, + 0x6b0c4c27, + 0x93f2b14f, + 0x05bb33f3, + 0x411c249d, + 0x29f79334, + 0x242505bb, + 0x23c17751, + 0xd527353c, + 0x310364d4, + 0x15f19320, + 0xd0d505bb, + 0x33990368, + 0xbdc10708, + 0xc1036cd3, + 0x4c834414, + 0x0734070f, + 0x33263324, + 0x93320b33, + 0x0604d3f2, + 0x2401342b, + 0xa2993333, + 0xbd340b08, + 0x99113832, + 0x202709aa, + 0x11393abd, + 0x532ad489, + 0xbd418345, + 0x99113b34, + 0x32d505d4, + 0x34bd1140, + 0xf7b1113a, + 0x113c32d5, + 0xc13c74c1, + 0x449930d3, + 0x6dd4bd28, + 0x34109903, + 0xc018d09d, + 0xbebe6631, + 0x0fabff7a, + 0x034ad0ad, + 0xc1890766, + 0x48d1ad58, + 0x58c48903, + 0x4fab4103, + 0xa958c48d, + 0xee034ad3, + 0x93021434, + 0x05ba7ff2, + 0x27042499, + 0x9d42e331, + 0x231d0424, + 0xbee4037e, + 0xa7008b7d, + 0xfd4fff4e, + 0xf4914211, + 0x00273027, + 0xc56443c5, + 0x43c58c42, + 0x5443c54c, + 0x07f12b5e, + 0x5e4f6b43, + 0x3327f9f2, + 0x07f9e05e, + 0xe34c7e0d, + 0x5e940fc6, + 0xd499f114, + 0x714ff616, + 0xa751c3fd, + 0x7854fd40, + 0x5e000669, + 0x3099fd64, + 0x271b0726, + 0xe038be20, + 0xf6c06503, + 0x5efbff0f, + 0xf393fcaa, + 0x2705bb90, + 0xa7e02720, + 0xfffc730e, + 0x01101c27, + 0x004e8304, + 0x48360300, + 0x0c032103, + 0x103c0314, + 0x863122d4, + 0x28e9d624, + 0xdf0ea7f1, + 0x9fbeffff, + 0x07270088, + 0xc4f0b35e, + 0x0300004e, + 0xd63419de, + 0x3421d94f, + 0xff004e83, + 0x004ec4ff, + 0x03ccffff, + 0x27c81ee1, + 0x73eea710, + 0x0c27fffc, + 0x03e20110, + 0x2e8314ec, + 0xe6030000, + 0x03015b2f, + 0x1ef06811, + 0x5e3127b9, + 0x0ea7fa59, + 0xbeffffdf, + 0xc1008875, + 0x012734d2, + 0x330f2c83, + 0x7c24f923, + 0x07ff0000, + 0xfd44a31d, + 0x00007c24, + 0x10d399ff, + 0x5338d4c1, + 0x03033b31, + 0x04ab901c, + 0xcc27e027, + 0x3b412711, + 0x03408b4e, + 0x194d46e1, + 0x33240714, + 0x342f0324, + 0xc0000668, + 0xb915ff4c, + 0xb9018523, + 0x03018424, + 0xbd410331, + 0xbd018424, + 0x39018523, + 0x33240714, + 0x342f0324, + 0xc0000668, + 0xb915ff4c, + 0xb9018523, + 0x03018424, + 0xbd410331, + 0xbd018424, + 0x03018523, + 0xaafcf012, + 0xc007d499, + 0x872fff4c, + 0x0b443334, + 0x8c34f134, + 0xe3ff0003, + 0x0300004e, + 0x00004ea3, + 0x8c34f502, + 0xc1ff0003, + 0xd79944d4, + 0x9434f534, + 0xfdff0003, + 0x00038c37, + 0xdf0ea7ff, + 0x8fbeffff, + 0x41270087, + 0xb8c6f093, + 0x0c049d05, + 0x99fd3b5e, + 0xdb9d55bb, + 0xfa1f5e80, + 0x891cd689, + 0x6c031ad4, + 0x0f4c030f, + 0x44736473, + 0x3607649b, + 0x47fac65e, + 0x85040744, + 0xfaa55ef4, + 0x1487439b, + 0x925ef175, + 0x5e3227fa, + 0x3427f825, + 0x07f8205e, + 0x001e270c, + 0x2027a000, + 0x00872dbe, + 0xca5e4007, + 0x8d4027fa, + 0xe85e58c4, + 0xcb4107fd, + 0xe4458342, + 0x99f8e341, + 0xd4995c03, + 0x0e202705, + 0x07212734, + 0x8341c342, + 0xf8d35e41, + 0x7f6b7107, + 0x5eff7ce0, + 0x331707fe, + 0x0b378714, + 0x8c34f131, + 0xf5ff0003, + 0x00039432, + 0x004ee3ff, + 0x4ea30300, + 0xf5010000, + 0x00038c34, + 0x04d099ff, + 0x30fd4027, + 0xff00038d, + 0x039834f5, + 0x1f03ff00, + 0x00066834, + 0x12bd20a7, + 0x12bd018e, + 0x34f1018d, + 0xff00038c, + 0x00004ee3, + 0x8c34f504, + 0x89ff0003, + 0x31ed30a1, + 0xff00039c, + 0xed32a289, + 0x00039e32, + 0xf9a45eff, + 0x5e0c4c27, + 0x4c27fc99, + 0xf6d45e16, + 0x5e144c27, + 0xf071f6ce, + 0x300bf181, + 0x9a5e310b, + 0x0bf471fa, + 0xfa8a5e43, + 0x7c5e4027, + 0x104c27fa, + 0x27f6b15e, + 0xab5e0f4c, + 0x1b4c27f6, + 0x27f6a55e, + 0x9f5e134c, + 0x07b0b1f6, + 0x770cbe1c, + 0xc5b0b5ff, + 0x965e30bc, + 0x0c4c27f2, + 0x27f6895e, + 0xb85e0c4c, + 0x0c4c27f1, + 0x27f1945e, + 0xf6785e4b, + 0x735e4227, + 0x0d4c27f6, + 0x27f66d5e, + 0x675e184c, + 0x5e3247f6, + 0x77bef1e8, + 0x74a9ff77, + 0x734102ae, + 0x04962127, + 0x439b2027, + 0x0407423b, + 0x1a270333, + 0x00b534be, + 0x00000e03, + 0x2740a704, + 0x34f0c530, + 0xc6a90f07, + 0xf42502ac, + 0xf405f355, + 0xf335f415, + 0xb907f345, + 0x0c03c027, + 0xb2cee90c, + 0x07000192, + 0x9b4c0b40, + 0xf04e05e6, + 0x241001ed, + 0x4df15301, + 0x271301ed, + 0x07310371, + 0xca433b47, + 0x3f6bf64e, + 0x6d123cd0, + 0x22271307, + 0x3b34f3c1, + 0xe3230b21, + 0x03ffff2e, + 0x00002e34, + 0x25f45306, + 0x074201ed, + 0x054c0b4f, + 0xb0c3f942, + 0x42000192, + 0xc4c40329, + 0x07a70ccc, + 0xe2f401b2, + 0x1101044b, + 0xfa4be2f4, + 0xe2f42100, + 0x9300e14b, + 0x05b6a3f7, + 0x49d873bd, + 0xffff4ea7, + 0x7d42b9ff, + 0x837e5518, + 0x07342721, + 0x7843bdce, + 0x404bd518, + 0x7d42bd06, + 0xf0315e18, + 0x22532e07, + 0x13074707, + 0x433b2e0b, + 0x038824d2, + 0x6b130731, + 0x27801e1f, + 0xf56c5e40, + 0x5e0c3c27, + 0x2027f057, + 0xa05e1127, + 0x5494c1ed, + 0xef41c4ee, + 0x0036f493, + 0x5c43c106, + 0xef3583ee, + 0x27ef355e, + 0x435e114c, + 0x5e4127f5, + 0x4c27f53e, + 0xf5385e19, + 0x5e0e4c27, + 0x4c27f532, + 0xf52c5e1a, + 0x275e4a27, + 0x100c27f5, + 0xc1ecf35e, + 0xc4ee5494, + 0x3e07eee7, + 0xff74eebe, + 0xef050fe6, + 0x79eeda5e, + 0x9849f474, + 0xc5f493ee, + 0x433904cf, + 0x270e32c0, + 0x5e8001cd, + 0x0c27ee93, + 0xecc25e0f, + 0x8002cd27, + 0x53ee865e, + 0x07ec2bf1, + 0x5313012e, + 0x53ec2bf7, + 0x0b740122, + 0x5e13072e, + 0x3227ff58, + 0x4f073387, + 0x4e31430b, + 0x92b033f9, + 0x105e0001, + 0x1e3127ff, + 0x1e3027ec, + 0x07f64ee8, + 0x6802a970, + 0x07740303, + 0xaf09b9c0, + 0xff1c2703, + 0x03be0707, + 0x41270078, + 0x20273027, + 0x0128c4d5, + 0x0704c39d, + 0x68c3b947, + 0x34c2d503, + 0x2cc2d501, + 0x30c2d501, + 0x1d490b01, + 0x68caa943, + 0x07190703, + 0xb35fbe0a, + 0x07600700, + 0xbe0a0719, + 0x0700b34f, + 0x079c8680, + 0x07b02719, + 0x0b4707e9, + 0x0743194b, + 0x0b182b0b, + 0x03d1270c, + 0xe8360bb1, + 0x07011e11, + 0x05039d43, + 0xc0a94553, + 0x24870368, + 0x03c22c0b, + 0x2824d110, + 0x1f3c8301, + 0xd4abd33b, + 0x01282dd5, + 0x07c7fef0, + 0x79f493a0, + 0x405105ff, + 0xc1a99c07, + 0x9d030366, + 0x05460148, + 0x419b4a07, + 0x00e404ea, + 0x4027ba07, + 0x941d947d, + 0x945d943d, + 0x0148c3b9, + 0x31032027, + 0xc2d54127, + 0xc3bd0144, + 0xc4d50148, + 0xc2d50138, + 0xc2d5013c, + 0xabc60140, + 0x85038c07, + 0x0807d027, + 0x0d0b3707, + 0x34193d0b, + 0xe0270219, + 0xb4e2421b, + 0x1a070089, + 0x1b121e2b, + 0x1fe61b07, + 0x300700a1, + 0x3219031e, + 0x4e2b4207, + 0xd1033103, + 0x0bf441ca, + 0x2feacae4, + 0x1c070c07, + 0x03880c03, + 0x2703581d, + 0xdd7e602c, + 0xc10776ea, + 0xf4939cc2, + 0xd105b478, + 0xd502d843, + 0x9302f8c2, + 0x0153d8f4, + 0xc4053225, + 0x0e07f68e, + 0x30870553, + 0x2e073c0b, + 0x013831d1, + 0x271f2c83, + 0xab423b41, + 0xd5290741, + 0x0b013834, + 0x07241920, + 0x07410308, + 0x0b241d37, + 0x193d0b0d, + 0x1b021934, + 0x7b4bea42, + 0x2b4207ff, + 0x074b224e, + 0x038d1e4b, + 0x0b891ed1, + 0x5e310319, + 0x0123fedf, + 0x0abe010b, + 0xb00700b2, + 0x135ebfab, + 0x5e4027ff, + 0xfb4eff6f, + 0x00000e27, + 0x796abe02, + 0xf3bea7ff, + 0x4827fff9, + 0x0524b49d, + 0x001e27b0, + 0x0b070200, + 0x99c3377e, + 0x0b0724bc, + 0x1c07c603, + 0xff7403be, + 0x4c3b4127, + 0xfb8eb4b5, + 0x3ea7f54e, + 0x99ffffff, + 0x45361134, + 0xe6123499, + 0x27016d4f, + 0x4ea70f3c, + 0x35fdbfff, + 0x5f2c2743, + 0x4fff4ea7, + 0x3442c5fd, + 0xa7b63c27, + 0xfdefff4e, + 0x0f0443d5, + 0x0083c3be, + 0x9fff1ea7, + 0x0a4e27fd, + 0x14158000, + 0x13253227, + 0x0ea71411, + 0xa3fdebff, + 0x1504004d, + 0x27132114, + 0x003da320, + 0x05132504, + 0x004f2702, + 0x150d0200, + 0x0ef29b04, + 0xffff2ea7, + 0x112499ff, + 0x24994536, + 0x154fe612, + 0xa7d02701, + 0xffffff1e, + 0xa7111499, + 0xfeffffce, + 0x149d4103, + 0xd5332711, + 0xa70148c3, + 0xfd4fff0e, + 0xb1270301, + 0x433b4b07, + 0x12993407, + 0x073f6b0e, + 0x9d42ab43, + 0x03c50e14, + 0x9b40273c, + 0x01270ef4, + 0xbdbd8e7e, + 0x181d35c0, + 0x0cfc300c, + 0xe600aa10, + 0xa7008cdf, + 0xffffff0e, + 0x0e5c04d1, + 0x1ea74806, + 0x41fdafff, + 0xff2ea713, + 0x340bfd9f, + 0x24211305, + 0x25104ce3, + 0xa3231124, + 0x2315103c, + 0xb2cef193, + 0xe6141905, + 0x9900b34f, + 0x20072504, + 0x03cc42e0, + 0xb2baf393, + 0xa7321905, + 0xffffff4e, + 0x439d3027, + 0x27263625, + 0xbe19d40d, + 0x93ff6b5d, + 0x05b297f4, + 0x4ea74005, + 0xb9ffffff, + 0xf6156443, + 0xa703df3f, + 0xfd4fff4e, + 0xf2934101, + 0x2704d628, + 0x2707d14d, + 0x05020734, + 0x25231524, + 0x7854be21, + 0x9b402700, + 0x1ea70ef4, + 0xa7feffff, + 0xfd4fff3e, + 0x014012b9, + 0xf63834c5, + 0xa7f58e2a, + 0xfdcfff4e, + 0x5e684bc5, + 0xf493ff4f, + 0x1905b248, + 0x8c3ff643, + 0x7c33befe, + 0xfe855e00, + 0xb236f493, + 0x46431905, + 0x24249935, + 0x457f4cf8, + 0x5ed12703, + 0x10b9fedb, + 0x04531d35, + 0xf50e0183, + 0xff78619e, + 0xff6b0cbe, + 0xa7fe117e, + 0xfff99d3e, + 0x341d4027, + 0x3ea7343d, + 0x01ffffdf, + 0x07458634, + 0xe8462723, + 0x562301f4, + 0xff3ea733, + 0x3401fd4f, + 0xffdfbea7, + 0xa34433ff, + 0x27b40548, + 0x7e20000d, + 0xfc93e755, + 0x0505fbbc, + 0xbe0b07c0, + 0x01008092, + 0x214fe6c4, + 0x4b0ea703, + 0x1227fff2, + 0x008497be, + 0x4ea70027, + 0x1dffffd7, + 0x7d403d40, + 0xff2ea740, + 0x4027ffff, + 0xa72a209d, + 0xfff19fee, + 0xf393e41d, + 0xa705b0d8, + 0x43319d10, + 0x0e5024bd, + 0x3d25209d, + 0x3c24c5e4, + 0x9d4024c5, + 0x249d2624, + 0x6424bd27, + 0x27382715, + 0xfd402721, + 0x000e5024, + 0x982103ff, + 0xf1fe93f3, + 0x1c2705b0, + 0x273e071b, + 0x05410720, + 0x03112332, + 0x27f4b834, + 0xffdea740, + 0xd2c1fd4f, + 0xa23c2774, + 0x4c27e43d, + 0x3501274c, + 0x27e445e3, + 0xc84d2732, + 0x25e35d4e, + 0x1ce19de4, + 0xe115e01d, + 0x9d1be09d, + 0xe09d1ae1, + 0xa9f3932e, + 0x20e805b0, + 0x40270255, + 0x9d30e49d, + 0x3ea72fe4, + 0x27fd4fff, + 0x7434c120, + 0xe855e29d, + 0x27022740, + 0x33e49d41, + 0xfd934027, + 0xa705b0f8, + 0x70d39d30, + 0x2774d4c5, + 0x84dd0330, + 0x9d0d0701, + 0xdc0360e3, + 0xa73127ff, + 0x331c2720, + 0x0746e38d, + 0x7f0ce33d, + 0x8d63e19d, + 0xe49d5ee2, + 0x34e4c558, + 0xc538e4c5, + 0xe4c53ce4, + 0x61e19d40, + 0x9d62e49d, + 0xe28d44e4, + 0x5ce28d5a, + 0x9d32e49d, + 0xe49d64e4, + 0x68e4c566, + 0xc565e49d, + 0xe4c550e4, + 0x54e49d4c, + 0x237f3ce3, + 0x190283dd, + 0x800c0304, + 0x93f903c2, + 0x05b210f4, + 0xa7103c27, + 0x3d421d20, + 0x104c0342, + 0x4ea7f3a0, + 0xbdffffff, + 0x27010142, + 0x7d7cbe00, + 0x27c007ff, + 0x73be330c, + 0xfa93ff7d, + 0x0705fadc, + 0x005d272a, + 0x006e27fa, + 0x7c271e00, + 0x1d9c271e, + 0x071a1c27, + 0x2740278a, + 0x27e0a7b0, + 0x9d240531, + 0x249d1823, + 0xb525950c, + 0x152c2526, + 0x452c5520, + 0x1c278d20, + 0x8d1e298d, + 0x219d202b, + 0x1a219d19, + 0xc51b219d, + 0x2c03302e, + 0x202fc434, + 0xc60006b3, + 0x8ed53207, + 0x8b9d0174, + 0x383d0368, + 0x27202702, + 0x03320546, + 0x27f4c834, + 0xf393232c, + 0x2705fb14, + 0x05420710, + 0x03212331, + 0x27f4b834, + 0xe0d4bd40, + 0xbd40a702, + 0xd502e1d2, + 0xa702b4a4, + 0xffffff3e, + 0xd5520c27, + 0xd5159032, + 0x930134a2, + 0x04cfb7f3, + 0x40072027, + 0x01233205, + 0xf4b83403, + 0xffff4ea7, + 0xbd3027ff, + 0xbd0e6443, + 0xbd0e6642, + 0xbd0e6542, + 0xbd187c42, + 0xbd0e6740, + 0x2702d4d2, + 0x44429d10, + 0x0e5942bd, + 0x187e41ad, + 0x16a040d5, + 0x9d06d19d, + 0x40d508d1, + 0x40d50658, + 0x3ea7065c, + 0x1dfff99f, + 0xad313d31, + 0x27010240, + 0x43bd0f3c, + 0x20a70108, + 0x010942bd, + 0xada0ec27, + 0xd5010a40, + 0xd50e4c40, + 0xbd065040, + 0xa7156041, + 0xfffef33e, + 0x4e072027, + 0xe1233205, + 0xf4b83403, + 0x1ea720a7, + 0xa7fffc9b, + 0xffffff3e, + 0x40271215, + 0x16b034bd, + 0x16ac3ed5, + 0x3ed51205, + 0x3ed516a4, + 0x212716a8, + 0x27113c27, + 0xb024fd40, + 0x03ff0016, + 0x5ef39821, + 0x4027fc38, + 0x249d3027, + 0x0a23ad25, + 0xfc4c5e01, + 0xff6738be, + 0x27b7797e, + 0xfb915ed1, + 0xf87434c1, + 0x0100004e, + 0xf493fdd3, + 0x9d05ae58, + 0xcd5e3342, + 0x74d4c1fd, + 0x00004ef8, + 0x9dfda501, + 0x309d3030, + 0xfda45e2f, + 0xc1d7f093, + 0x78e5be00, + 0xfc195e00, + 0xf1930127, + 0x9e00c1a4, + 0x4e007c15, + 0xff4ea7fd, + 0x43b9ffff, + 0xd0071564, + 0x93673fd6, + 0x04d22bf1, + 0x4d273327, + 0x132507e0, + 0x1c031405, + 0x0331070c, + 0x21074f1c, + 0xe37f3ce3, + 0x1c237f2c, + 0x0334195b, + 0x32c2803c, + 0x27d8c6f9, + 0x1415544c, + 0xf3930d07, + 0x2704d204, + 0x0101144c, + 0x31050403, + 0xf4a83403, + 0xd1e6f093, + 0x9efd0e04, + 0x2700741e, + 0x93141544, + 0x04d1e3f3, + 0x4c272027, + 0x03320514, + 0x1ef4c834, + 0x5ff093e0, + 0x58be00c1, + 0x901e0078, + 0x4ea7fd4e, + 0xb9ffffff, + 0xf6156443, + 0xa700893f, + 0xfeffff3e, + 0x27093499, + 0x07438310, + 0x87d433d4, + 0x23d42b44, + 0xffffb4de, + 0xffd70ea7, + 0x070479ff, + 0x4b310331, + 0x4823874f, + 0x83041940, + 0x5114ce43, + 0x002824f1, + 0x4ea3ff00, + 0xf5800000, + 0x00002824, + 0xc41307ff, + 0x83bed834, + 0x312700ac, + 0x1904d39d, + 0x033027d4, + 0x9bd41d41, + 0x4ea70ef3, + 0xc5fd4fff, + 0xf39b3843, + 0xff4ea70e, + 0x4399ffff, + 0xbf2ea70e, + 0x3138fd4f, + 0x24054127, + 0x24033153, + 0xfd8e32d6, + 0x31033107, + 0xf093bc1e, + 0xbe00c0d1, + 0x5e0077b7, + 0xfd4eff6f, + 0xffff4ea7, + 0x6443b9ff, + 0xf6d00715, + 0x8900ec3f, + 0x4fe608d4, + 0x49f400da, + 0xd43100cb, + 0xfffe4ffc, + 0x00b6ffff, + 0xf40ad489, + 0xa201004d, + 0xac08be00, + 0xd70ea700, + 0x0439ffff, + 0x432b0319, + 0x397143cc, + 0x08de8901, + 0x0339d431, + 0x330ad289, + 0x3103104c, + 0xab0fec83, + 0x33033de4, + 0xab138328, + 0x791187e2, + 0x2c1ef504, + 0x27ff0000, + 0x8345f631, + 0x4e070fec, + 0xff804fa3, + 0x047dffff, + 0xf49b4027, + 0xff2ea70e, + 0x24c5fd4f, + 0x013ba638, + 0x9b402722, + 0x3ea70ef4, + 0x99ffffff, + 0x31270e34, + 0x34cb323b, + 0x4fbf2ea7, + 0x273138fd, + 0x53240541, + 0x03354631, + 0x27f31e24, + 0x93c61e30, + 0x05abfff3, + 0x03433499, + 0x43349d41, + 0x0127fd8e, + 0xc0ddf193, + 0x7a239e00, + 0x93042700, + 0x00c0a9f1, + 0x007a189e, + 0xf1930427, + 0x9e00c07a, + 0x27007a0d, + 0x47f19304, + 0x029e00c0, + 0x0427007a, + 0xc00ef193, + 0x79f79e00, + 0x89013100, + 0x03890a02, + 0xd3f09308, + 0xa8be00bf, + 0x045e0076, + 0xa7fb4eff, + 0xffffff4e, + 0x156443b9, + 0xb007f123, + 0x3fd6d107, + 0x930f0765, + 0x00c0acf1, + 0xbe102c27, + 0xe6006e8b, + 0xe5fc93dd, + 0x4d2704cf, + 0x3c2707e1, + 0x15c40584, + 0x07cb25c3, + 0x7118be0d, + 0x03200700, + 0x0ccc0321, + 0x43273f07, + 0x34033101, + 0xc403c105, + 0x3459f4a8, + 0x1d073309, + 0xc30dc45d, + 0xcfc9f093, + 0x6e49be04, + 0xa5f09300, + 0xdfbe04cf, + 0xf1030071, + 0xfd93fb8e, + 0x1e00c050, + 0x32f093ad, + 0x24be00c0, + 0x921e0076, + 0xcea7fa4e, + 0xb9ffffff, + 0x231564c4, + 0xf6d007f8, + 0x99057d4f, + 0x4ff626c4, + 0xdc21056b, + 0x08030d07, + 0x513bcce0, + 0x3cccd002, + 0x4bcce04d, + 0xccd0025d, + 0xcce07e4c, + 0xf002aa56, + 0x011257cc, + 0xe259cce0, + 0x5accf401, + 0xcce00439, + 0xe001fa57, + 0x017858cc, + 0x1418cce0, + 0x19ccf407, + 0xcce005a8, + 0xf406c415, + 0x06a716cc, + 0x06d7c3e0, + 0x8414cce0, + 0x9ff19301, + 0x1b5e00c3, + 0x23cce001, + 0xccd00204, + 0xcce05d24, + 0xf002322d, + 0x00a82ecc, + 0xa832cce0, + 0x33ccf402, + 0xcce0034c, + 0xc402be2e, + 0x31b62fcc, + 0x034007d0, + 0x4cf0334c, + 0x93010c67, + 0x00c083f1, + 0xe000e15e, + 0x024642cc, + 0xb843ccf0, + 0x46cce000, + 0xccf40174, + 0xe003fb47, + 0x013643cc, + 0x8544ccc4, + 0x32f0d331, + 0xf1930588, + 0x5e00c1a1, + 0xcce000b6, + 0xf001f610, + 0x00b311cc, + 0xbf13cce0, + 0x14ccf401, + 0xcce0043a, + 0xe401d611, + 0xff5a12cc, + 0x30bed031, + 0xdc21ff6e, + 0x1ff61007, + 0x4ea7008a, + 0xb9ffffff, + 0xf6156443, + 0x93048f3f, + 0x04ce73f4, + 0x07d33d27, + 0x04072427, + 0x42154305, + 0x9fbe4c25, + 0xf8030070, + 0xcce0fa8e, + 0xf4012b27, + 0x031828cc, + 0x2e24cce0, + 0x26cce401, + 0x67beff10, + 0xdc21ff6c, + 0xb71e1007, + 0x3651cce0, + 0x52ccf402, + 0xcce00241, + 0xe401ca4c, + 0xfef250cc, + 0x930cd399, + 0x05aa0bf4, + 0x2160439d, + 0xe0981edc, + 0x01943ecc, + 0xa23fccf4, + 0x3ccce002, + 0xcce40199, + 0x31fecf3d, + 0xe942f0d4, + 0x94f19304, + 0x0c0700c0, + 0x1efdec7e, + 0x02c4e096, + 0x5ac5f401, + 0x75c1c003, + 0xfeaec2e4, + 0x1ebed031, + 0xdc21ff6b, + 0x535e1007, + 0x94f97eff, + 0x2f6b2007, + 0x4f4b4207, + 0x931a04ce, + 0x00bf97f1, + 0xd331c91e, + 0xa9a6f493, + 0x46438d05, + 0x214843c5, + 0xff305edc, + 0xf492f493, + 0x9d312705, + 0x42bd6943, + 0x43bd02a5, + 0xdc2102a2, + 0x31ff195e, + 0x1c32f0d3, + 0x83f19306, + 0x931e00c2, + 0xa972f293, + 0x64249905, + 0x4f4bd331, + 0x03df4fe6, + 0xc0f5f193, + 0xff7c5e00, + 0x1fbed031, + 0xdc21ff6b, + 0xe35e1007, + 0xf0d331fe, + 0x0386203c, + 0xbf7af193, + 0xff605e00, + 0x39f4d331, + 0xf493063d, + 0x8d05a938, + 0xdc215643, + 0x31fec55e, + 0x25f493d2, + 0x312705f4, + 0x02b042d5, + 0xbd69439d, + 0x2102ac43, + 0xfeac5edc, + 0x88bed031, + 0xdc21ff6b, + 0x9b5e1007, + 0x6bc3befe, + 0x07dc21ff, + 0xfe905e10, + 0xbe4bf193, + 0xff145e00, + 0x9abed031, + 0xdc21ff6b, + 0x7b5e1007, + 0x0cd289fe, + 0xa8e2f493, + 0x5c428d05, + 0x6f5edc21, + 0xbed031fe, + 0x21ff6c27, + 0x5e1007dc, + 0xd031fe5e, + 0xff6b5cbe, + 0x1007dc21, + 0x31fe515e, + 0x034007d0, + 0x4cf0334c, + 0x93037c67, + 0x00be1ff1, + 0x31fec95e, + 0xb8167ed0, + 0x1007dc21, + 0x31fe315e, + 0xb7d07ed0, + 0x1007dc21, + 0x31fe255e, + 0x89f493d2, + 0x312705f3, + 0x02a842d5, + 0xbd69439d, + 0x2102a643, + 0xfe105edc, + 0x39f0d331, + 0xf19302bd, + 0x5e00bfa1, + 0xd331fe8a, + 0xa866f493, + 0x3443c505, + 0xf35edc21, + 0xf0d431fd, + 0x93038642, + 0x00bedaf1, + 0x89fe6d5e, + 0xf4930cd3, + 0x8d05a848, + 0xdc215e43, + 0x93fdd55e, + 0x05a83bfc, + 0x1d070c07, + 0x031e0c03, + 0x2c270c1c, + 0x6ae1be10, + 0x9d412700, + 0xdc211cc4, + 0x31fdb55e, + 0x034007d0, + 0x4cf4334c, + 0x7efd4a67, + 0x2007934b, + 0x42072f6b, + 0x40ee4f4b, + 0xf493fe53, + 0x2705f2fc, + 0x69439d31, + 0x02a442bd, + 0x02a143bd, + 0x835edc21, + 0x0cd299fd, + 0xa7e6f493, + 0x61429d05, + 0x735edc21, + 0x53ccc0fd, + 0x53ccd024, + 0x54cce430, + 0xf293fcb0, + 0x9905a7cc, + 0xd3314424, + 0x01cd4fe6, + 0x01c93fe6, + 0xc02bf193, + 0xfdd45e00, + 0x930cd299, + 0x05a7aff4, + 0x2163429d, + 0xfd3c5edc, + 0x930cd399, + 0x05a79ff4, + 0x2162439d, + 0xfd2c5edc, + 0x1c38ccc0, + 0x273accc0, + 0x6933cce4, + 0x07d331fc, + 0xf0412343, + 0x9301eb48, + 0x00bdddf1, + 0x31fd955e, + 0x340cf0d0, + 0xf1930222, + 0x5e00bd7c, + 0xd331fd86, + 0xc0203cf0, + 0x36f19301, + 0x775e00be, + 0x40ccc0fd, + 0x41ccd014, + 0x93d2311f, + 0x05a74bf4, + 0x214042c5, + 0xfcd85edc, + 0xf493d331, + 0xc505a73c, + 0xdc213c43, + 0x31fcc95e, + 0x2df493d2, + 0x42c505a7, + 0x5edc2138, + 0xccc0fcba, + 0xccd01729, + 0xcce41b29, + 0x31fbf72a, + 0x6883bed0, + 0x07dc21ff, + 0xfc9c5e10, + 0xc1f1f193, + 0xfd205e00, + 0xfabed031, + 0xdc21ff69, + 0x875e1007, + 0x5bccc0fc, + 0x5bccd01e, + 0x5ccce429, + 0xd431fbc8, + 0xa6e2f293, + 0xc5312705, + 0x239d6824, + 0x5edc2166, + 0xd231fc6a, + 0xa6cef493, + 0x5042c505, + 0x5b5edc21, + 0x93d331fc, + 0x05a6bff4, + 0x214c43c5, + 0xfc4c5edc, + 0x1849ccc0, + 0x224accd4, + 0x8947cce4, + 0xf0d331fb, + 0x93012438, + 0x00be61f1, + 0x31fcb95e, + 0xf332f0d3, + 0xd4f19301, + 0xab5e00be, + 0x0cd389fc, + 0xa686f493, + 0x5a438d05, + 0x135edc21, + 0x15c6c0fc, + 0xe41fc6d0, + 0x31fb53c9, + 0x6868bed0, + 0x07dc21ff, + 0xfbf85e10, + 0x0fbed031, + 0xdc21ff68, + 0xeb5e1007, + 0xbed031fb, + 0x21ff678f, + 0x5e1007dc, + 0xccc0fbde, + 0xccc02c1a, + 0xcce44122, + 0x31fb1f19, + 0x39fa93db, + 0xa42105a6, + 0x4ec8bd83, + 0x0b07b4ab, + 0xff690ebe, + 0x0ff61007, + 0xab25fc42, + 0xb35edc21, + 0x19fa93fb, + 0xd43105a6, + 0xb4ebab21, + 0xf0be0b07, + 0x1007ff68, + 0xfc240ff6, + 0xd031e11e, + 0xff680abe, + 0x1007dc21, + 0x9dfb895e, + 0xdc216423, + 0x27fb855e, + 0x04f19304, + 0xd29e00bb, + 0x01110073, + 0x03310221, + 0xbabbf093, + 0x7085be00, + 0xfa755e00, + 0xc09ef093, + 0x7079be00, + 0xfb695e00, + 0xa5c2f493, + 0x32439d05, + 0x4f5edc21, + 0xb5f293fb, + 0x249905a5, + 0xe64f4b64, + 0x93008b4f, + 0x00bd0df1, + 0x93fbc15e, + 0x05a59ff4, + 0x2131439d, + 0xfb2c5edc, + 0xa592f493, + 0x2e439d05, + 0x1f5edc21, + 0x46238dfb, + 0x175edc21, + 0x933783fb, + 0x05a57bf4, + 0x2155439d, + 0xfb085edc, + 0x542ccce0, + 0x2dccf401, + 0xcce000de, + 0xe4019b1c, + 0xfa5b2bcc, + 0x32f0d331, + 0xf19301ea, + 0x5e00bfaf, + 0xdbbefb6e, + 0xf393ff72, + 0x2705f044, + 0x69349d41, + 0x02b430d5, + 0xcf5edc21, + 0x90717efa, + 0x2f6b2007, + 0x4f4b4207, + 0x013304ee, + 0xbabef193, + 0xfb405e00, + 0x2144239d, + 0xfab05edc, + 0xa516f293, + 0x9d402705, + 0x3fe63324, + 0x4127fc30, + 0x2133249d, + 0xfa985edc, + 0xa4fef293, + 0x9d102705, + 0x44f63021, + 0x249d4127, + 0xff3ea730, + 0x34c1fd4f, + 0x0940ec74, + 0x7434c1fc, + 0x00004ef8, + 0x9dfbff01, + 0xdc213021, + 0x93fa695e, + 0x05a4cff2, + 0x219d1027, + 0x2744f62f, + 0x2f249d41, + 0x4fff3ea7, + 0x7434c1fd, + 0xfbda40ec, + 0xf87434c1, + 0x0100004e, + 0x219dfbd0, + 0x5edc212f, + 0xf293fa3a, + 0x2705a4a0, + 0x58249d40, + 0xfbba3fe6, + 0x249d4127, + 0x5edc2158, + 0xcce0fa22, + 0xe400a730, + 0xf97f31cc, + 0x4307d331, + 0xf40c4c03, + 0x00c8194c, + 0xef52f493, + 0x1a439d05, + 0xff5edc21, + 0x16ccc0f9, + 0x17cce423, + 0xd489f95d, + 0xd741e00e, + 0x21f19300, + 0x6f5e00be, + 0xf0d331fa, + 0x93011032, + 0x00bd7ef1, + 0x31fa615e, + 0x2632f0d3, + 0xd8f19301, + 0x535e00bd, + 0x0cd389fa, + 0xc00ed289, + 0x34c07131, + 0x6b32c06e, + 0x936833c0, + 0x00bce7f1, + 0x99fa395e, + 0xf4930cd3, + 0x9d05eef4, + 0xdc210b43, + 0x31f9a15e, + 0x7548c0d4, + 0xb8104ce0, + 0x26f19300, + 0x175e00be, + 0xf1f493fa, + 0x312705ee, + 0xbd69439d, + 0xbd02a342, + 0x2102a043, + 0xf9785edc, + 0x4307d331, + 0xd40c4c03, + 0x9330194c, + 0x05eeb3f4, + 0x2119439d, + 0xf9605edc, + 0xf493d231, + 0x5505eea4, + 0x5edc2142, + 0x2cd0f952, + 0xf193191b, + 0x5e00bc9e, + 0xf193f9ce, + 0x5e00be59, + 0xf193f9c6, + 0x5e00be2e, + 0xf493f9be, + 0x1505ee7c, + 0x21430542, + 0xf9285edc, + 0xf4933327, + 0x4505ee6c, + 0x5edc2143, + 0xd389f91a, + 0x2343070c, + 0x164cf041, + 0xf1930093, + 0x5e00bd6e, + 0xf493f98e, + 0x9d05ee4c, + 0xdc211843, + 0x93f8f95e, + 0x05ee3ff2, + 0x249d4027, + 0x793fe608, + 0x9d4127fa, + 0xdc210824, + 0x27f8e15e, + 0x25f49334, + 0x434505ee, + 0xd35edc21, + 0x19f293f8, + 0x243105ee, + 0x3fd64100, + 0x9d40275f, + 0x3fe60924, + 0x3127fa4c, + 0xee02f493, + 0x09439d05, + 0xaf5edc21, + 0xf5f293f8, + 0x402705ed, + 0xe60a249d, + 0x27fa2f3f, + 0x0a249d41, + 0x975edc21, + 0x274307f8, + 0x0f07801c, + 0xbaeaf293, + 0xbe382700, + 0x27006833, + 0x9e1f0703, + 0xc00070d5, + 0xf2931a31, + 0x9905edc0, + 0x45360924, + 0xdc212335, + 0x93f8695e, + 0x00bc33f1, + 0x93f8e95e, + 0x05eda7f2, + 0xfe4eeb1e, + 0xffff4ea7, + 0x6443b9ff, + 0x93379615, + 0x05a2aff3, + 0x45063419, + 0x341d4027, + 0x0427fe8e, + 0xbdbff193, + 0x708b9e00, + 0xa3f09300, + 0x44be00bd, + 0xdc1e006d, + 0xdea7fc4e, + 0xb9ffffff, + 0x211564d4, + 0x694fd60c, + 0x4027c9f6, + 0x1588dcd5, + 0x158cd4ad, + 0xffff4ea7, + 0x6443b9ff, + 0x603fd615, + 0xc67ef493, + 0xe33d2704, + 0x07202707, + 0x15430504, + 0x9efc0e42, + 0xd40068aa, + 0xd4d1dbc6, + 0xdcad1588, + 0x4fd6158c, + 0x00cf27d0, + 0x27101000, + 0x1000804f, + 0x88d4d510, + 0x270c0715, + 0x802c2710, + 0x006511be, + 0x33563f27, + 0xc3c51122, + 0x9b402740, + 0xa51e0ef4, + 0x2c070111, + 0xbd4ff093, + 0x6cbdbe00, + 0x938a1e00, + 0x00bd71f0, + 0x07e31d27, + 0x006caebe, + 0xfb4e931e, + 0xffffcea7, + 0x64c4b9ff, + 0x8e449615, + 0xe5f493fb, + 0x411905a1, + 0xa18ef393, + 0x8df49305, + 0x320105a1, + 0xf0934301, + 0xbe00bd58, + 0xb9006c7f, + 0xc61564c4, + 0x1f27da4f, + 0x1007a000, + 0x90000f27, + 0x64be1007, + 0xb0070068, + 0xc0001f27, + 0x0f271007, + 0x1007b000, + 0x006852be, + 0x1f27c007, + 0x1007e000, + 0xd0000f27, + 0x40be1007, + 0x30070068, + 0x2c071b07, + 0xbd48f093, + 0x9efb0e00, + 0x4e006c33, + 0xff4ea7fd, + 0x43b9ffff, + 0xd0071564, + 0xf2933a56, + 0x2704c588, + 0x0507e04d, + 0x2c3c2724, + 0x24254427, + 0x0d072315, + 0x270c2c03, + 0x0303014a, + 0x03230504, + 0x93f4a824, + 0x04c563f0, + 0x9b9efd0e, + 0xf0930067, + 0xbe00bd38, + 0x1e006beb, + 0xabfb4ec6, + 0xa3d1070f, + 0x071207f0, + 0xb90dc0e3, + 0x0de0670b, + 0x008d0bba, + 0x0bbb0de0, + 0x0dc000bd, + 0xa7120bbc, + 0xffffff4e, + 0x156443b9, + 0x00f63ff6, + 0xfb8ef083, + 0xffffcea7, + 0x64c4b9ff, + 0x064ff615, + 0x1ad48901, + 0x00b144f4, + 0xffffcea7, + 0x64c4b9ff, + 0xe24ff615, + 0xd0d45100, + 0xc4b9d744, + 0xd3411564, + 0x79ce4fc6, + 0x39311934, + 0x93335932, + 0x00be16f0, + 0xfb0ef083, + 0x006b729e, + 0xffffbea7, + 0x64b3b9ff, + 0x0e3ff615, + 0x18d48901, + 0x40e84f8b, + 0x3ff6008b, + 0xd4c1021d, + 0x9944c834, + 0x1564b4b9, + 0x4fc6d371, + 0xa7c11e90, + 0xffffffbe, + 0x1564b4b9, + 0x017c4ff6, + 0x44f0d471, + 0xb4b9ff7c, + 0xd3611564, + 0x4fe6d081, + 0x030bff70, + 0x01190479, + 0x03590239, + 0xf093f083, + 0x0e00bdb3, + 0x6b119efb, + 0xff4ea700, + 0x43b9ffff, + 0x3fe61564, + 0xd301ff4c, + 0xf0932e07, + 0x8300beca, + 0x9efb0ef0, + 0xb9006af3, + 0xe61564c4, + 0x99ff4b4f, + 0xd29920d1, + 0x22d39921, + 0x9323d499, + 0x00bf23f0, + 0x006ad6be, + 0xf6ff335e, + 0x9101ef3f, + 0x1144f0d4, + 0xff765eff, + 0x2e073007, + 0xbf55f093, + 0x0ef08300, + 0x6ab59efb, + 0x51d14100, + 0x1df093d2, + 0xa8be00bf, + 0x125e006a, + 0x9df493ff, + 0xf293059f, + 0x01059f9c, + 0x93240143, + 0x00be86f0, + 0x8cbe2e07, + 0xc4b9006a, + 0x4fe61564, + 0xd421fedd, + 0xd201d111, + 0xf093d331, + 0xbe00bc08, + 0xb9006a73, + 0xe61564c4, + 0x89fec44f, + 0xd28918d1, + 0x8cf0931a, + 0x5cbe00be, + 0xb25e006a, + 0x51f493fe, + 0xf293059f, + 0x01059f50, + 0x93240143, + 0x00bba1f0, + 0x40be2e07, + 0xb3b9006a, + 0x3fe61564, + 0xd331fed5, + 0xd201d111, + 0xf093d421, + 0xbe00bbbc, + 0xb9006a27, + 0xe61564b3, + 0x41febc3f, + 0xdef093d2, + 0xc20700bb, + 0x42073207, + 0x070ccc53, + 0x53335312, + 0x2253104c, + 0x3183c183, + 0x41832183, + 0xf8befc05, + 0xb3b90069, + 0x3fe61564, + 0xd389fe8d, + 0x18d18914, + 0x9316d289, + 0x00bbdcf0, + 0x0069debe, + 0x1564b3b9, + 0xfe733fe6, + 0x8944d189, + 0xf09346d2, + 0xbe00bbe6, + 0xb90069c7, + 0x5e1564b3, + 0xf493fe5d, + 0x93059eb8, + 0x059eb7f2, + 0x24014301, + 0xbcd5f093, + 0xbe2e0700, + 0xb90069a7, + 0xe61564b4, + 0x21fe674f, + 0x01d111d4, + 0x93d331d2, + 0x00bb23f0, + 0x00698ebe, + 0x1564b4b9, + 0xfe4e4fe6, + 0xf093d341, + 0x0700bce1, + 0x07c307e3, + 0x53230713, + 0xcc5314ec, + 0x07e18310, + 0x532a5341, + 0x83c18334, + 0x83218341, + 0x15fe0531, + 0x6959befc, + 0x64b4b900, + 0x194fe615, + 0x51d181fe, + 0x71d361d2, + 0xeaf093d4, + 0x40be00bc, + 0x055e0069, + 0x71d391fe, + 0x93d281d1, + 0x00bbebf0, + 0x00692ebe, + 0x1564b3b9, + 0xfdd03fe6, + 0xa130d3c1, + 0x93d2b1d1, + 0x00bbf7f0, + 0x006916be, + 0x1564b3b9, + 0xfdb83fe6, + 0xc13cd3c1, + 0xd2c134d1, + 0x01f09338, + 0xfcbe00bc, + 0xb3b90068, + 0x3fe61564, + 0xd189fd9e, + 0x42d28940, + 0xbc02f093, + 0x68e5be00, + 0xfd8c5e00, + 0xd281d171, + 0xbb0ef093, + 0x68d5be00, + 0x64b3b900, + 0x003fe615, + 0xa1d191fe, + 0x14f093d2, + 0xc0be00bb, + 0xb3b90068, + 0x3fe61564, + 0xdec1fdeb, + 0x2cd18934, + 0x892ed289, + 0xd48930d3, + 0x06f09332, + 0xfe0500bb, + 0x00689ebe, + 0x4efdce5e, + 0x99f493fb, + 0x428905eb, + 0x0843890a, + 0xb107c007, + 0x0027322e, + 0xeabefb8e, + 0xf3930145, + 0x01059d7c, + 0x0bd00734, + 0x56340540, + 0x860d0705, + 0x8e0127d4, + 0xff4ea7fb, + 0x43b9ffff, + 0x31e61564, + 0x1b07c009, + 0xbd2df293, + 0x2cf39300, + 0x667e00bd, + 0x4edb1efc, + 0x07f063fd, + 0x15f193d0, + 0x0f0704ba, + 0x0726a23e, + 0x4d24f409, + 0xf4290bba, + 0x14284cc0, + 0xf1930627, + 0x9e00bd21, + 0x85006b61, + 0x430027d0, + 0x93fd8ef0, + 0x04b9ebf2, + 0x21512481, + 0x00004fd4, + 0x27182000, + 0x71236100, + 0x0a430b24, + 0x2707d614, + 0xdbf19306, + 0x329e00bc, + 0x410b006b, + 0x4fd03027, + 0x70000001, + 0x6b03071e, + 0x07db1e0f, + 0xb1f3930d, + 0x4a2704b9, + 0x34033201, + 0x04030205, + 0x0127f4a8, + 0x3127ae1e, + 0xfb4ee01e, + 0x9cc2f493, + 0xa7430105, + 0xffffffbe, + 0x3123f063, + 0x1564b2b9, + 0x4305f005, + 0xfc09d107, + 0xfc0d2b36, + 0x4d27f001, + 0xfc9307d6, + 0x2704c104, + 0x07c40530, + 0xbec3151d, + 0x07006304, + 0x6330be0c, + 0xd8d44100, + 0x710f114c, + 0xb94586d4, + 0x030e65b4, + 0x65b4bd41, + 0x8ef0430e, + 0x930c07fb, + 0x00bcaef2, + 0xbc41f393, + 0xfb7b7e00, + 0xfc4eb91e, + 0xf005f063, + 0xd107fc09, + 0x0bbbcdc0, + 0x49f3930c, + 0x3401059c, + 0x34054123, + 0xffff4ea7, + 0x6443b9ff, + 0x0d38b615, + 0x93f001fc, + 0x04c09bfc, + 0x07d54d27, + 0x1d073027, + 0xc315c405, + 0x0062b0be, + 0xf0430c07, + 0xbf9efc0e, + 0x0c070062, + 0xbc55f293, + 0x58f39300, + 0x227e00bc, + 0x63cd1efb, + 0xb94d27f0, + 0x483c270b, + 0xf32df40d, + 0xf0011007, + 0x931ef043, + 0xf493f54e, + 0xb9059cb4, + 0xb902e149, + 0xee02e046, + 0x0700f569, + 0x07218329, + 0x33420732, + 0x2b463334, + 0x33d40743, + 0x07d40bd3, + 0x18af03ad, + 0x0100066b, + 0x103cf8a3, + 0xe02700d2, + 0xcbe9c247, + 0xff00159c, + 0x1598c4e9, + 0xc8e9ff00, + 0xff001594, + 0x47a6b7e6, + 0x1d078806, + 0x68341f03, + 0x12b90006, + 0x14b90491, + 0x42420490, + 0x43834307, + 0xca6542c0, + 0xa3015eb8, + 0x072b32d8, + 0x342f032d, + 0xd1000668, + 0x2702e424, + 0x2742e310, + 0xe424d530, + 0x9121bd02, + 0x9023bd04, + 0xed402704, + 0x001594c4, + 0x8c21d5ff, + 0x03490704, + 0x6b940741, + 0x2469ce9f, + 0x21832907, + 0x42073207, + 0x46333433, + 0xd407432b, + 0xd40bd333, + 0xaf03ad07, + 0x00066b18, + 0x3cfca301, + 0x07ff6f10, + 0xd1f58e0e, + 0x07048c15, + 0x07420771, + 0x33363332, + 0x0b430b43, + 0x46438945, + 0xb3ca0407, + 0xff017e83, + 0x049174b9, + 0x049073b9, + 0x24074103, + 0x72bd2f6b, + 0xe1270491, + 0x5ed323ca, + 0x0027ff67, + 0xfb4ef58e, + 0xe8e6f493, + 0x49426905, + 0x07d00743, + 0x27322eb1, + 0xbefb8e00, + 0x070062fc, + 0x0907e6c0, + 0xbb0dc0d0, + 0xf3930c0b, + 0x01059abc, + 0x05410334, + 0xff4ea734, + 0x43b9ffff, + 0x35961564, + 0xc4c60c07, + 0xfb8e0127, + 0x1b07fb8e, + 0xba75f293, + 0xe4f39300, + 0xae7e00ba, + 0x4ee61ef9, + 0xff3ea7f8, + 0x34b9feff, + 0x4cf81d35, + 0xa700d510, + 0xffffff1e, + 0x99093399, + 0x432b4414, + 0x41e84f4b, + 0xfb9300c2, + 0x99059a70, + 0xb29941bc, + 0x2b4c0740, + 0x6b340742, + 0x393fe63f, + 0x83e20701, + 0x03e333e7, + 0x066770ef, + 0x44bd9900, + 0x008fefe6, + 0x4fe4e401, + 0x0000ba18, + 0x910700b1, + 0xffd7aea7, + 0x798b07ff, + 0x449399a4, + 0x20274f4b, + 0x010140e8, + 0x422b4307, + 0x0f6b0407, + 0x10070323, + 0x03031f6b, + 0x077b01ce, + 0x87438341, + 0x2b443324, + 0x4f43f942, + 0xf6ff0000, + 0x03410737, + 0x6b140741, + 0x8331071f, + 0x33438733, + 0xce342b34, + 0x34f95401, + 0xff00004f, + 0xe49940a6, + 0x2b310704, + 0xc83f4b34, + 0xb4994c31, + 0x96280742, + 0x99d12344, + 0x30274024, + 0x14074103, + 0x239d1f6b, + 0x40219d42, + 0x2747c1ce, + 0x44bd9d30, + 0x36f60027, + 0xf493f88e, + 0x990599b0, + 0x43994042, + 0x6b322b41, + 0xa600273f, + 0x8e012731, + 0x04e499f8, + 0x342b3007, + 0x31cc3f4b, + 0x42b499b6, + 0xa644bd9d, + 0x85f49349, + 0x42990599, + 0x2b3c0740, + 0x1e3f6b32, + 0x83e107d5, + 0x03e333e7, + 0x066770ef, + 0x01ee8600, + 0x184fe0e4, + 0x2c0000ba, + 0x448d9dff, + 0xb49d4127, + 0xff4ea742, + 0x4499feff, + 0x9de30109, + 0xfc9304e4, + 0xc0059948, + 0x00ba183f, + 0xcd9d2400, + 0x8be40144, + 0x40c399f4, + 0x2b41c499, + 0x6b340743, + 0x27871e3f, + 0xfefe5e21, + 0x9d44bd99, + 0x655e44bd, + 0x1ed123ff, + 0x2b4c07da, + 0x6b340741, + 0xff535e3f, + 0xdea7f84e, + 0xb9ffffff, + 0xa31564d4, + 0x4c4ff6f0, + 0xbdf89301, + 0xd4990599, + 0x2e42e026, + 0xe2c7be01, + 0xff4ea700, + 0x4bb9ffff, + 0x4cb90e64, + 0xbcce0e67, + 0xba9d2759, + 0x28ac270b, + 0x4c070c1e, + 0xc4074103, + 0xbccecf6b, + 0x833c0745, + 0x43070f3c, + 0x44332387, + 0x432b422b, + 0x04074333, + 0xde23d407, + 0x23fff198, + 0xfff1700e, + 0x00e23cbe, + 0x4fc6d481, + 0x754027ce, + 0x0dd465d4, + 0x01fa2df9, + 0x7e1d07f0, + 0x4c07fbc6, + 0xc4074103, + 0xcbcecf6b, + 0xff2ea7bd, + 0x2bbdffff, + 0x2bbd0e67, + 0x81c10e66, + 0x9d302744, + 0x839d0683, + 0xd48bbd08, + 0x5821d502, + 0x5824d106, + 0xd530a706, + 0x07065c24, + 0x0923bddf, + 0x03402701, + 0x0a24add4, + 0x4c21d501, + 0x110b1e0e, + 0x0df193f0, + 0x737e04b8, + 0x930d07fb, + 0x04b803f1, + 0x07fa967e, + 0xa70156c0, + 0xffffffde, + 0x1564d4b9, + 0x00884ff6, + 0xbc82f493, + 0xd83d2704, + 0x05040707, + 0xbe4c1543, + 0x93005eb2, + 0x05980bf2, + 0x27402499, + 0x9d410330, + 0x249d4223, + 0xfd657e40, + 0x064488b9, + 0xd8bd1d07, + 0xdcbd0e65, + 0x212716b0, + 0x27113c27, + 0xb024fd40, + 0x03ff0016, + 0x27f39821, + 0xd5f08340, + 0xd516a014, + 0xd516ac14, + 0xd516a814, + 0x8e16a414, + 0x088499f8, + 0xfecf4ff6, + 0xf1930427, + 0x9e00b837, + 0x930065ed, + 0x059873f8, + 0x9926d199, + 0xf0930882, + 0xbe00b7f1, + 0x5e00629b, + 0xf093fea6, + 0xbe00b866, + 0x5e00628f, + 0xfd4eff70, + 0x061ef063, + 0x237ef001, + 0x4df193fb, + 0x0f0704b7, + 0x07fc917e, + 0x41f193d0, + 0x015604b7, + 0xffff4ea7, + 0x6443b9ff, + 0x9339d615, + 0x04bbc7f4, + 0x07d73d27, + 0x43050407, + 0xf7be4d15, + 0xf293005d, + 0x99059750, + 0x30274024, + 0x239d4103, + 0x40249d42, + 0x43fcaa7e, + 0x93fd8ef0, + 0x00b81df0, + 0x00622ebe, + 0xfb4eca1e, + 0xffffdea7, + 0x64d4b9ff, + 0xf6f06315, + 0x9900e74f, + 0x4ff626d4, + 0xfc9300ec, + 0x7e0597d8, + 0xcbb9fb1c, + 0xcdb902e0, + 0xdbce02e1, + 0x073d1e0e, + 0x0741034d, + 0xcedf6bd4, + 0x4d0732bd, + 0x34074183, + 0x44333633, + 0x0307342b, + 0x030b0333, + 0x6b1804f1, + 0x43830006, + 0x03d942c4, + 0x066b240f, + 0xfac97e00, + 0x41034d07, + 0xdf6bd407, + 0xb9d0dbce, + 0xc60ec9c4, + 0x07d02748, + 0x330d073d, + 0x2b063334, + 0x33400703, + 0x03040b43, + 0x066e980f, + 0xfa9d7e00, + 0x0ec9c4b9, + 0xd4dad103, + 0x273027df, + 0xd5202740, + 0xd1064cc3, + 0x2702d8c1, + 0x48c2d530, + 0xe1c4bd06, + 0xdcc3d502, + 0xc9c4bd02, + 0xe0c4bd0e, + 0x2115e602, + 0xff3ea714, + 0x4103ffff, + 0x159034d5, + 0xf1930f07, + 0x7e04b0fc, + 0x07e6fb76, + 0x4dc0f409, + 0x01ee0bbb, + 0xe9f193f0, + 0xeb7e04b0, + 0x930f07f9, + 0x04b0dff1, + 0xb6fb597e, + 0xfeb07e00, + 0xfb8ef043, + 0xb733f093, + 0x612dbe00, + 0xff115e00, + 0xf1930427, + 0x9e00b73b, + 0x4e00645d, + 0xffdea7fd, + 0xd4b9ffff, + 0x4e361564, + 0x9926d199, + 0x41ce27d4, + 0xff3ea73c, + 0x3499feff, + 0x87438309, + 0x2b443324, + 0x4d43f942, + 0x23ff0000, + 0x3738d431, + 0xd49d4227, + 0x8e120027, + 0xe5f493fd, + 0x43990595, + 0x03202740, + 0x42429d31, + 0x0e40439d, + 0xfb3d5efd, + 0xf1930827, + 0x9e00b71c, + 0x93006401, + 0x00b706f0, + 0x0060babe, + 0x0827a71e, + 0xb749f193, + 0x63eb9e00, + 0xa7fd4e00, + 0xffffffde, + 0x1564d4b9, + 0xd2994a96, + 0x27d49926, + 0x271f42ce, + 0x27d49d40, + 0xfd8e2486, + 0x958ef393, + 0x40349905, + 0x0342329d, + 0x40349d41, + 0xe85efd0e, + 0x930827fa, + 0x00b72ef1, + 0x0063ac9e, + 0xb716f093, + 0x6065be00, + 0x4ec41e00, + 0xffcea7fb, + 0xc4b9ffff, + 0xd0071564, + 0xdc064f96, + 0xc4b9b027, + 0xcbbd1564, + 0x4f760664, + 0xb9aaf293, + 0x27cd9d04, + 0x07db4d27, + 0x24053427, + 0x2d252315, + 0xcd9d0207, + 0x5bd0be26, + 0x29f39300, + 0x34990595, + 0x423b9d40, + 0x349d4103, + 0x5efb0e40, + 0xf493fa83, + 0x990595d8, + 0x20270443, + 0x439d32e3, + 0x08429d04, + 0x7e064d9d, + 0xa91ec9fd, + 0xb6f6f093, + 0xbe1d0700, + 0x1e005fef, + 0xfdf0939a, + 0x1d0700b6, + 0x005fe2be, + 0xfb4e9b1e, + 0xffffcea7, + 0x64c4b9ff, + 0x93499615, + 0x05951bfb, + 0xd486bd19, + 0xc4b9fb8e, + 0x48161564, + 0xb926f493, + 0xdd3d2704, + 0x05040707, + 0xbe4d1543, + 0x27005b56, + 0x8eb41d41, + 0xf2fc7efb, + 0xf093d21e, + 0x2700b05a, + 0xbe07dd1d, + 0x1e005f97, + 0xa7fb4ed4, + 0xffffffde, + 0x1564d4b9, + 0x00c24ff6, + 0x7fff4ea7, + 0xf84391d0, + 0x00d1103c, + 0xff50dfbe, + 0x9472f493, + 0x69f39305, + 0x42010594, + 0xf0933101, + 0xbe00b70e, + 0x27005f5f, + 0x07a0001f, + 0x000f2710, + 0xbe100790, + 0x07005b4b, + 0x001f27b0, + 0x271007c0, + 0x07b0000f, + 0x5b39be10, + 0x27c00700, + 0x07e0001f, + 0x000f2710, + 0xbe1007d0, + 0x07005b27, + 0x072c0730, + 0xf1f0931b, + 0x1cbe00b6, + 0x4127005f, + 0x4fff3ea7, + 0x59d4bdfd, + 0x2732010e, + 0x0ef49b40, + 0xd399c127, + 0xcbc23b0e, + 0xbf3ea7c3, + 0xc138fd4f, + 0x34054127, + 0xc4c6c153, + 0xf31e3403, + 0x78414f27, + 0xf4e8017d, + 0xffff3ea7, + 0x6434b9ff, + 0x93487615, + 0x04b83ff4, + 0x07dc3d27, + 0x43050407, + 0xfb0e4c15, + 0x005a6d9e, + 0xb623f093, + 0x5ebdbe00, + 0xff365e00, + 0xaf70f093, + 0xdc1d2700, + 0x5eadbe07, + 0x27d11e00, + 0x15f19304, + 0xde9e00b6, + 0xfc4e0061, + 0xffff4ea7, + 0x6443b9ff, + 0xbe397615, + 0x16ff53cc, + 0xff4ea70a, + 0x43b9ffff, + 0x3fd61564, + 0xe5f49374, + 0x3d2704b7, + 0x202707d9, + 0x43050407, + 0xfc0e4215, + 0x005a119e, + 0xb66df093, + 0x5e61be00, + 0x93cd1e00, + 0x059287f2, + 0x99092399, + 0x34ce0824, + 0x03430764, + 0xf9478341, + 0x0666983c, + 0x09249d00, + 0xffdf0ea7, + 0x62e7beff, + 0x333c0700, + 0x0bcc8734, + 0x8cc4f1c3, + 0xd8ff0003, + 0x0300004e, + 0x03c3070d, + 0x0669b8cf, + 0xb6c41900, + 0x93082747, + 0x00b654f1, + 0x00614c9e, + 0xaec4f093, + 0xd91d2700, + 0x5e01be07, + 0xff7f5e00, + 0x0ea74223, + 0x1dffffdf, + 0x627cbec4, + 0xff635e00, + 0xf1930827, + 0x9e00b5fe, + 0x4e006121, + 0xffbea7fb, + 0xb4b9ffff, + 0xc0071564, + 0x4ff60d01, + 0xdde0013a, + 0x00e903ee, + 0x03efddd0, + 0xf2dde024, + 0xf400e303, + 0x8d03f3dd, + 0xf0dde000, + 0xe0011803, + 0x0b03f1dd, + 0x93042701, + 0x00b647f1, + 0x0060e09e, + 0x03ebdde0, + 0xddd000c7, + 0xe07d03ec, + 0xd303ecdd, + 0xedddc400, + 0xfd93e003, + 0x9905928c, + 0x4e9644d4, + 0x2741de99, + 0x831e0741, + 0x9d133317, + 0x1d0b44d4, + 0xe51af453, + 0xd0991405, + 0xff3ea743, + 0x109dfeff, + 0x44b49904, + 0x2b093299, + 0xcc4f4b42, + 0x4ea71141, + 0x79ffffd7, + 0x07353643, + 0x9d410340, + 0x4e070414, + 0xd3994103, + 0x9d4f6b40, + 0x432b41d4, + 0x49f44f6b, + 0xfb8e00a8, + 0x03f4dde0, + 0xdde40081, + 0xff7703f5, + 0xfb0e0c07, + 0xc0efdb5e, + 0x1d03e9dd, + 0x03eadde4, + 0xfd93ff65, + 0x99059210, + 0xf45341de, + 0x1e07fc59, + 0x13331783, + 0x8d1e1d0b, + 0x91fafd93, + 0x41de9905, + 0xfbd1f453, + 0x17831e07, + 0x1d0b1333, + 0x0eff775e, + 0xfe405efb, + 0xfb0e0c07, + 0x93e6b75e, + 0x0591d7fd, + 0x5341de99, + 0x07faa1f4, + 0x3317831e, + 0x5e1d0b13, + 0xfd93ff54, + 0x990591c0, + 0xf45341de, + 0x1e07f8ac, + 0x13331783, + 0x3d5e1d0b, + 0x5efb0eff, + 0x0c07ef32, + 0xeb5efb0e, + 0x5efb0ee4, + 0xf093fd05, + 0x0700b510, + 0x5c8dbe1d, + 0xfebc5e00, + 0xf1930427, + 0x9e00b50b, + 0x4e005fbd, + 0xff4ea7fe, + 0x4391d07f, + 0x4e103cd8, + 0x03c10471, + 0x3802c134, + 0x00004fd0, + 0x0b347000, + 0x014fd443, + 0x2bf00000, + 0x813e32ca, + 0x91475604, + 0xa146d604, + 0xb1465604, + 0xc145d604, + 0x45363004, + 0x963c04c1, + 0x27fe8e44, + 0x9ef19306, + 0x6e9e00b5, + 0x0627005f, + 0xb514f193, + 0x5f639e00, + 0x93062700, + 0x00b4d9f1, + 0x005f589e, + 0xf1930627, + 0x9e00b527, + 0x00005f4d, + 0x00000012, + 0x0000006c, + 0x07b9f54e, + 0xd00702e0, + 0x02e100b9, + 0x4007f563, + 0xf0c5471b, + 0xbe840738, + 0xc1ff4e4d, + 0xf0b544d1, + 0x1fe68f6b, + 0x1123045d, + 0x4f834107, + 0x80000003, + 0x40e81103, + 0x448708e9, + 0x897c44f1, + 0x31070005, + 0x00033f83, + 0xf4a58000, + 0x078630e8, + 0x4387f1a1, + 0x41f5f2b1, + 0x0005897c, + 0x03ed22e4, + 0xf3953027, + 0x02dcd4d1, + 0x82f4f485, + 0xf2910138, + 0x0d07ed07, + 0x3d071d07, + 0xed034d07, + 0x0d030808, + 0x1d030658, + 0x21030ecc, + 0x02e43d03, + 0x04a84d03, + 0xc53cfec5, + 0xf1c540f0, + 0x48f2c544, + 0xc54cf3c5, + 0xd4b950f4, + 0x4fe60eca, + 0xd4b90114, + 0x4fe60ec9, + 0xd4b9010c, + 0x45060ecb, + 0xd4bd4127, + 0x47070ec8, + 0x34074183, + 0x44333633, + 0xd2b9342b, + 0xc3070ec8, + 0xc30bc333, + 0x1c073207, + 0x36332433, + 0x322b1d0b, + 0x02e414d1, + 0xe333e307, + 0x2407e30b, + 0x0e0721e3, + 0x02e412d5, + 0x03d10d0b, + 0x43e30658, + 0x43ab3283, + 0x02e414d5, + 0x065803d1, + 0x348344e3, + 0x14d543ab, + 0xd3b902e4, + 0x48e30ecb, + 0x33333183, + 0x14d543ab, + 0x00d102e4, + 0xcd03065c, + 0x10d502f0, + 0xf05302e8, + 0xed03fecc, + 0x2d070664, + 0x04013d07, + 0x3e0b2c0b, + 0x02f0cd23, + 0x0664ed23, + 0x34033101, + 0x24032105, + 0x3e07f4a8, + 0x4d034c07, + 0x3d0302e4, + 0x0d0706ac, + 0x040b1d07, + 0xacbe130b, + 0xd4b9ff5c, + 0x4ff60ecb, + 0xd4b9008f, + 0x41030ec8, + 0x0ec8d4bd, + 0x0ec9d4b9, + 0x34074123, + 0xd3bd3f6b, + 0x35960ec9, + 0xd4bd4027, + 0xd3bd0eca, + 0x40270ec8, + 0xd4bd8103, + 0x71030ecb, + 0xff0082f0, + 0xf3c1f481, + 0xe0d7bd38, + 0x6b432b02, + 0xa148ea4f, + 0x0d0c2702, + 0xf58ef543, + 0xf1930f07, + 0x7e04ab24, + 0x0fc6f45e, + 0xc0f409dc, + 0x1f0bb94d, + 0x0bbb4dc0, + 0xbc4dc44a, + 0xf1291b0b, + 0x9344f2c1, + 0x04ab03f0, + 0xff5ba2be, + 0xfeb882f0, + 0xf429b71e, + 0x40484cc0, + 0xf1930627, + 0x9e00b8d8, + 0x27005d49, + 0xc8d4bd41, + 0xf9f1530e, + 0x3cf2c1fd, + 0x0140f3c1, + 0x033e0114, + 0x032e0534, + 0x5ef4a824, + 0xf129ff60, + 0x9344f2c1, + 0x04aabff0, + 0xff5e9fbe, + 0xfe7482f0, + 0x93ff735e, + 0x04aaaff1, + 0x3dfc1341, + 0x01eb0800, + 0xaaa2fe93, + 0x4cd1d104, + 0x48d0d106, + 0x14e48906, + 0xc534f1c5, + 0x1e0730f0, + 0x01b14ff6, + 0xaa86f093, + 0x44048904, + 0x4fe65007, + 0x712300df, + 0x61836707, + 0x46073607, + 0x46333433, + 0xa407432b, + 0xa40ba333, + 0x3d0b3a07, + 0x04903bb9, + 0xb1037103, + 0xcf6bcb07, + 0x04903cbd, + 0x39d1b123, + 0x06be048c, + 0x0ceaff52, + 0x2b0700a5, + 0x46334b07, + 0x240b2333, + 0xfd4efe53, + 0xe401290b, + 0x32071507, + 0x14031001, + 0x34033005, + 0xf093f4a8, + 0x0704aa20, + 0x0b04411a, + 0x0013d11d, + 0x004e8303, + 0x43ab0100, + 0x030014d5, + 0x20890341, + 0x003d8346, + 0xd543ab20, + 0x38030014, + 0x14a93f0c, + 0x40ee0304, + 0x2389018f, + 0x33460744, + 0x334b0b43, + 0x4487103c, + 0x43f530ab, + 0xff0015a0, + 0x41f52171, + 0xff0015e0, + 0x10272381, + 0x162043f5, + 0x2291ff00, + 0x42f53647, + 0xff001660, + 0x159830ed, + 0xf493ff00, + 0x4104a9b4, + 0x0d0c5340, + 0x3dbe0183, + 0x82f0ff56, + 0x615efd62, + 0x89ff1efe, + 0xa007180c, + 0x097dc1e0, + 0xcdc00b41, + 0xf4201102, + 0x521103cd, + 0x82cdc004, + 0xcdf41501, + 0x06aa0183, + 0x0104cd20, + 0x0121cd00, + 0x0102cde4, + 0x1c0706ba, + 0x260f1c53, + 0xff4ea716, + 0x43c1fd4f, + 0x003ef874, + 0x09368000, + 0x4fff4ea7, + 0x7443c1fd, + 0x00003f5c, + 0xcd400100, + 0xcd200121, + 0xccfc1121, + 0xe0092cf0, + 0xaa0281cd, + 0x2db1fc04, + 0x3fb2fc09, + 0xa6b8fc09, + 0xd5b4f808, + 0x16a98900, + 0x08a69fe6, + 0xe614a389, + 0x9308cb3f, + 0x058e03f2, + 0x49b024a9, + 0x08c949ea, + 0x49b224a9, + 0x08cc43ea, + 0x04011fe6, + 0x0030bcfc, + 0xc0bcfc09, + 0xbdfc0932, + 0x09210300, + 0xa391a471, + 0x00004ff4, + 0x06467000, + 0xf1930627, + 0x9e00b3ec, + 0x07005b3d, + 0xf6248323, + 0x41fe4b2f, + 0xe3302714, + 0x4520004d, + 0x14138d14, + 0x8d46128d, + 0x355e4412, + 0x9cd2d1fe, + 0x44d4c10f, + 0x4f832103, + 0x80000003, + 0x40e8f2a5, + 0xfea104f2, + 0x4ef54487, + 0x0005897c, + 0xbefdf75e, + 0x95ff4a13, + 0xfc125ef0, + 0x0d07f381, + 0x23073183, + 0x34332633, + 0x4207232b, + 0x420b4333, + 0x02e44d03, + 0x340b3d07, + 0x0b544c03, + 0xd8d3d504, + 0x5d68be02, + 0x430027ff, + 0x1ef58ef5, + 0x5529beff, + 0xa53027ff, + 0xfbc25ef0, + 0x0000bef8, + 0x93082001, + 0x04a84bfe, + 0x8918e489, + 0x4f8b12ec, + 0x40e8c183, + 0xf2c10534, + 0x30f0c148, + 0x2734f1c1, + 0x6c3abe30, + 0xc601ab00, + 0x5bcfe604, + 0x83470703, + 0x33340741, + 0x2b443336, + 0x33130734, + 0x03130b13, + 0x0702e41d, + 0xe43d2331, + 0xd13d0b02, + 0x0702e434, + 0xa347e39d, + 0xe434d542, + 0x48d2d102, + 0x4cd4d106, + 0xab710306, + 0x0b810324, + 0x91250691, + 0xa10ff6f0, + 0x03390703, + 0xf2290c3c, + 0xa7d6fc93, + 0x07030704, + 0xbef3751c, + 0xc1004ef7, + 0x090744f1, + 0xff58f2be, + 0x274cf2c1, + 0x73291be0, + 0x33420724, + 0x0b328744, + 0x07322b34, + 0x2b493343, + 0x33b40743, + 0xb40b12bc, + 0x6b47b013, + 0x159c6eed, + 0x9489ff00, + 0x9464ed20, + 0xc1ff0015, + 0x0ff644c0, + 0xc489015a, + 0x41457614, + 0x004ef8c4, + 0x014c0100, + 0x91899401, + 0x104ce320, + 0x2b073027, + 0x93bd9405, + 0x9ebd01ac, + 0x253301ad, + 0x15a021f5, + 0x90d5ff00, + 0xce7101a8, + 0x15e02ef5, + 0xc081ff00, + 0x162020f5, + 0xc391ff00, + 0x159861ed, + 0x23f5ff00, + 0xff001660, + 0x1127c041, + 0x830d0c53, + 0x53c2be01, + 0xff1ea7ff, + 0x10d1ffff, + 0xf25316a8, + 0x2101fa38, + 0xf8be0123, + 0x04f90089, + 0xff0016b0, + 0x019a42e0, + 0x041b41e0, + 0x0648d4d1, + 0xffff4fe0, + 0x03d5ffff, + 0xff4b23be, + 0x4ea70826, + 0xd1ffffff, + 0x5316a840, + 0x01fa03fe, + 0xbe0123e1, + 0xf90089c3, + 0x0016b004, + 0xf241e0ff, + 0xd5f09302, + 0x044104a6, + 0x4dd8b007, + 0x270f0400, + 0xd5302740, + 0xd50648d3, + 0x41064cd4, + 0x004dfc04, + 0xd1016d08, + 0xd10648dc, + 0xab064cd4, + 0x444ff64c, + 0xa5f19301, + 0x118904a6, + 0x9df29316, + 0xd1ad04a6, + 0x22890652, + 0x91f39314, + 0xd2ad04a6, + 0x33890650, + 0xff4ea718, + 0x9c15ffff, + 0xf996fe53, + 0x16a840d1, + 0xd3ade101, + 0x50be0654, + 0x04f90089, + 0xff0016b0, + 0x028e44e0, + 0x0648d0d1, + 0x064cd1d1, + 0xb127f2a1, + 0x3027c027, + 0x1c4b0b0b, + 0x006a5bbe, + 0xffff2ea7, + 0xa824d1ff, + 0x48d0d516, + 0xd5410306, + 0xd5064cd1, + 0xf016a824, + 0x5ef9f182, + 0x9401faf0, + 0xd57af593, + 0x104ca305, + 0xdebe9405, + 0x5401ff4d, + 0x4fe6a007, + 0x2a0701a3, + 0x46334a07, + 0x53012333, + 0x2b9b240b, + 0xf91efe53, + 0xf071230b, + 0x92d5e401, + 0x320701a8, + 0x04030101, + 0x34033105, + 0x4127f4a8, + 0x94bd3027, + 0x93bd01ac, + 0x218901ad, + 0x3f1c3846, + 0xee209489, + 0x8900d441, + 0x3b074424, + 0x33104c33, + 0xf541ab35, + 0x0015a034, + 0x932071ff, + 0x04a5bffe, + 0x15e030f5, + 0x2481ff00, + 0x162034f5, + 0x2291ff00, + 0x159861ed, + 0x32f5ff00, + 0xff001660, + 0x1127e041, + 0x830d0c53, + 0x522abe01, + 0xff1ea7ff, + 0x10d1ffff, + 0xf25316a8, + 0x2101f8a0, + 0x60be0123, + 0x04f90088, + 0xff0016b0, + 0xfe6a42e4, + 0x40273027, + 0x0648d3d5, + 0x064cd4d5, + 0xbefe6b5e, + 0xe6ff4a72, + 0xd1feb80f, + 0x510650d3, + 0x89434eb4, + 0xd4a918b3, + 0x34ee0654, + 0x3027fea5, + 0x0648d3d5, + 0x0648dcd1, + 0xd4d54027, + 0x925e064c, + 0x04cde0fe, + 0xf4fbc531, + 0x723105cd, + 0x21cde002, + 0xf0fbb911, + 0x001122cd, + 0x01cde003, + 0xe4fbad12, + 0x5f2104cd, + 0xfba45e02, + 0x3fa33123, + 0xfffffffc, + 0x715e3103, + 0xfcff1ef8, + 0x0461c0bc, + 0x1b070c07, + 0xff4bfcbe, + 0x014902e4, + 0x0182cdc0, + 0x02cdc012, + 0xcd400d11, + 0x4c070102, + 0x44e44783, + 0xbcf803b1, + 0x27012e30, + 0xe0f19306, + 0x2e9e00b0, + 0xd4b90057, + 0x9d070ec9, + 0x36333407, + 0x342b4433, + 0x23332307, + 0x2d03230b, + 0x12070658, + 0x06581d23, + 0x13d11d0b, + 0x920b0658, + 0x34e332a3, + 0x065813d5, + 0x0ec9d4b9, + 0xd4bd4103, + 0xb25e0ec9, + 0xff4ea7fc, + 0x43c1fd4f, + 0x003efc74, + 0xfb4b1000, + 0xf1930427, + 0x9e00ada3, + 0xd00056d9, + 0xc0073102, + 0x47334007, + 0xffdf0ea7, + 0x0bc433ff, + 0x5833bec4, + 0x7e0c0700, + 0x5005bec1, + 0xffdf0ea7, + 0x5800beff, + 0x07500100, + 0xbe10272c, + 0x5e004ba2, + 0xff1efe2e, + 0x0ec9d1b9, + 0xfc5b1fe6, + 0x41073107, + 0x46333433, + 0x2407432b, + 0xa42afe93, + 0xc1233304, + 0xe34150f0, + 0x200b240b, + 0x022c34f8, + 0x4307c706, + 0x00004ee3, + 0x71e44501, + 0x003ea323, + 0x23750100, + 0x0ec9d1b9, + 0x31274027, + 0x0ec8d4bd, + 0x0ecad3bd, + 0x01da13e0, + 0xd2bd2027, + 0x0a5e0ecb, + 0x273027fc, + 0x48d3d540, + 0x4cd4d506, + 0xfd035e06, + 0x064cd4d1, + 0x4ff64cab, + 0x42270125, + 0x16b004fd, + 0x615eff00, + 0xa34123fd, + 0xfffffc4f, + 0x5e4103ff, + 0x4123f70e, + 0xfffc4fa3, + 0x4103ffff, + 0x89fb055e, + 0x1fe640a1, + 0xa08903c8, + 0xb60fe642, + 0x01cde003, + 0xf402a203, + 0x3f0302cd, + 0x21cde001, + 0xf4018201, + 0x470122cd, + 0x02cde002, + 0xe402c001, + 0x440104cd, + 0x87402701, + 0x15b12731, + 0x65f045f3, + 0x35f425f4, + 0x07f455f4, + 0x61f293af, + 0xe02704a3, + 0xa403c027, + 0x01d0bee2, + 0x4c0b4a07, + 0x23c14001, + 0xd830fa34, + 0x034f0702, + 0x2371104c, + 0x44014c0b, + 0x00003ff4, + 0x01dc7000, + 0xf1930627, + 0x9e00b00e, + 0xd100558d, + 0xe4064cd4, + 0xffffff4f, + 0xa1fc23ff, + 0x234027f3, + 0x48d3d531, + 0xd5310306, + 0xa5064cd4, + 0xfc0e5ef3, + 0x8916e289, + 0xe38914e1, + 0x2ee4892c, + 0x410b320b, + 0x8d14e48d, + 0xb75e16e3, + 0x48d3d1fa, + 0x4cd4d106, + 0xa710a706, + 0x4b310b20, + 0x48d3d542, + 0x4cd4d506, + 0xfbce5e06, + 0x0281cde0, + 0xcdf0f962, + 0x00a00282, + 0x0301cde0, + 0xcd24f956, + 0x4f5e0321, + 0x01cdd4f9, + 0x06275180, + 0xab58f193, + 0x550f9e00, + 0xfd412700, + 0x0016b004, + 0xfc3e5eff, + 0x4ff4430b, + 0xf0000001, + 0x3fe6f9b4, + 0xa48102e4, + 0x02d34ff6, + 0x4ff6a4a1, + 0xa4c101f6, + 0x3444fc34, + 0x034907fa, + 0xa3890f4c, + 0xe2445330, + 0x27fa2643, + 0x1ef19306, + 0xca9e00ae, + 0xcdf00054, + 0xf8f48003, + 0x4d034c07, + 0x4fab7fdf, + 0xf8e842f0, + 0xcdc09d1e, + 0xf4451121, + 0x291122cd, + 0x02cde001, + 0xe0018411, + 0xc61104cd, + 0x21cde0fe, + 0x27015f03, + 0xbdf19306, + 0x8e9e00ae, + 0xcde40054, + 0xff700201, + 0xe4f8b55e, + 0x671104cd, + 0xf8ac5eff, + 0x13e4f1b1, + 0x2127fe24, + 0x0ecbd2bd, + 0x07fa2c5e, + 0x27410340, + 0x87415330, + 0x15b12721, + 0x65f445f2, + 0x35f325f3, + 0x5ef355f3, + 0x1e07fe8b, + 0xf502fe53, + 0xf393e401, + 0x0104a19c, + 0x05140310, + 0xa8340330, + 0x530207f4, + 0x03f4ebfe, + 0xe4010c0c, + 0xa1caf193, + 0x01300704, + 0x0534033e, + 0xa814031e, + 0x533007f4, + 0x01f4cff0, + 0x69f19304, + 0x1e0104a1, + 0x3e051403, + 0xf4a83403, + 0x31272471, + 0x00004ea3, + 0x27247501, + 0xbd402720, + 0xbd0ec8d4, + 0xbd0ecad3, + 0x5e0ecbd2, + 0x2471f9a9, + 0x01274ff6, + 0x4ff624a1, + 0x24c10121, + 0x0f4ff634, + 0x03e10301, + 0xe42403c4, + 0xe2fe13e3, + 0x27f91a91, + 0xeff19306, + 0xbe9e00ae, + 0x409b0053, + 0x4ff4430b, + 0xf0000001, + 0x24a1fe1c, + 0x27d74fc6, + 0x50f19306, + 0xa29e00ae, + 0xcdc00053, + 0xc02c0201, + 0x7d0281cd, + 0x0182cde4, + 0xb65efefb, + 0x930627fd, + 0x00af6cf1, + 0x0053849e, + 0x2104cde0, + 0xcde0fda5, + 0xfd9f3104, + 0x1201cde4, + 0x4007fedb, + 0x30274103, + 0xb2274153, + 0xf365f455, + 0xf125f115, + 0xf045f335, + 0x07fd925e, + 0x03410730, + 0x53410331, + 0x27315341, + 0x65f435b3, + 0x25f115f3, + 0x55f045f4, + 0xfd755ef3, + 0x41034007, + 0x31474153, + 0xf315b327, + 0xf125f465, + 0xf045f135, + 0x5c5ef455, + 0x474027fd, + 0xfd475e31, + 0x41034007, + 0x20273147, + 0xb2274153, + 0xf455f325, + 0xf315f265, + 0xf045f235, + 0x27fd3a5e, + 0x80f19306, + 0xf69e00ac, + 0x06270052, + 0xac1df193, + 0x52eb9e00, + 0x93062700, + 0x00aa59f1, + 0x0052e09e, + 0xf1930627, + 0x9e00aa88, + 0x270052d5, + 0x21f19306, + 0xca9e00ad, + 0x06270052, + 0xadc9f193, + 0x52bf9e00, + 0x93062700, + 0x00ad96f1, + 0x0052b49e, + 0xf1930627, + 0x9e00aa7f, + 0x270052a9, + 0x98f19306, + 0x9e9e00aa, + 0x06270052, + 0xaaabf193, + 0x52939e00, + 0x93062700, + 0x00adebf1, + 0x0052889e, + 0xf1930427, + 0x9e00a8ef, + 0x7e00527d, + 0xc85ef2bf, + 0x930427f7, + 0x00a903f1, + 0x00526c9e, + 0xf1930627, + 0x9e00a95c, + 0x27005261, + 0x8df19306, + 0x569e00aa, + 0x06270052, + 0xa98cf193, + 0x524b9e00, + 0x93062700, + 0x00ac42f1, + 0x0052409e, + 0xf1930627, + 0x9e00ac0b, + 0x27005235, + 0xaef19306, + 0x2a9e00aa, + 0x06270052, + 0xaa7df193, + 0x521f9e00, + 0x93062700, + 0x00ab15f1, + 0x0052149e, + 0xf1930627, + 0x9e00aae4, + 0x4e005209, + 0x07f423f5, + 0x89f093d0, + 0xb97e0584, + 0x34f0c5f2, + 0x02fc0ff6, + 0x847af693, + 0xd86cd105, + 0x71402702, + 0xf5f293c0, + 0xf0c50583, + 0xded49d38, + 0x0734f1c1, + 0x61d1bd0d, + 0x58249903, + 0x03080d03, + 0x02d74ff6, + 0xff4acabe, + 0x02f30ff6, + 0xffff3ea7, + 0xa034d1ff, + 0x03202716, + 0xa034d541, + 0x78d2d516, + 0x74d2d501, + 0x38c38901, + 0x02d86ad1, + 0x0174d3d5, + 0xd53ac489, + 0xd10178d4, + 0xd80168a3, + 0xd119103c, + 0xf00124ab, + 0x000000bf, + 0x2707ba40, + 0xd5902700, + 0xd502f0d0, + 0x9302fcd9, + 0x05ce7ff4, + 0xf6694399, + 0xd102de3f, + 0x380164a4, + 0x0000004f, + 0xd5002704, + 0xb902f0d0, + 0xa902e0d3, + 0xc502c4d4, + 0xf4c53cf3, + 0xb53ff630, + 0xc0dbb902, + 0x07b12302, + 0x034f6b4b, + 0x6b42f0b1, + 0xb5102708, + 0x30f2c1f1, + 0xbef2d28d, + 0xc1ff4b93, + 0xd08d3cf3, + 0x5b3ff6f4, + 0xcbbff602, + 0x4031be02, + 0xbe5007ff, + 0x07ff46d5, + 0x402fbe80, + 0x2c02e0ff, + 0xd864d104, + 0x56441102, + 0xfcd4d545, + 0xf0d4d502, + 0xff4ea702, + 0x40d1ffff, + 0x1c2716ac, + 0xbe012312, + 0xf9008163, + 0x0016b004, + 0xde42e0ff, + 0x0341e004, + 0x07b12307, + 0x034f6b4b, + 0x5e42f0b1, + 0xb0b5e004, + 0x8bb6e005, + 0x9eb7e007, + 0x2eb8e002, + 0xfcd4b90b, + 0x23002702, + 0x03740741, + 0xd1418371, + 0x8302f4dc, + 0xa5f49571, + 0xc1cfe6f0, + 0xd864d102, + 0x53490102, + 0xe0918393, + 0x070785c3, + 0xa94c2b45, + 0x0702ecd3, + 0x6b310314, + 0xb942271f, + 0xbd0302d2, + 0xad02e8d4, + 0xbd02ead3, + 0xe6015fd1, + 0xe6047f2f, + 0x9107819f, + 0x474747f0, + 0xc0d4bd30, + 0xe0d3bd03, + 0xe6f3a103, + 0xa9047b3f, + 0x2702ead8, + 0x03d4bd40, + 0xecd8ad03, + 0xd5c12302, + 0xb902f4dc, + 0xbd02e8da, + 0xa10360da, + 0xeb3ff6f3, + 0xe0a2e002, + 0x07b12306, + 0x034f6b4b, + 0xf342f0b1, + 0x16b5e009, + 0xcbb6e008, + 0xb3b7e00a, + 0x1ab8e00b, + 0xfcd4d109, + 0x832a0702, + 0x63d4bd41, + 0x4722e003, + 0xbdc12708, + 0xbe0304dc, + 0xf6ff41f8, + 0x0708470f, + 0x64d4bd4c, + 0x38f2c103, + 0x24834127, + 0x40272486, + 0x02d863d1, + 0x33114433, + 0x037cd8ad, + 0x0378d3d5, + 0x0362d4bd, + 0x02db8fe6, + 0x0629a1e0, + 0x0302d4b9, + 0x031c4fe6, + 0x03189ff6, + 0x015fd2b9, + 0x094921e0, + 0x4127f091, + 0x4ca3403b, + 0x84d4d534, + 0xbaa2e003, + 0xfcd4d102, + 0xd5410302, + 0x0702fcd4, + 0xa5f2934d, + 0xb1230581, + 0x03b84d03, + 0xd4c52219, + 0x9d4b07c4, + 0x4f6bd6d2, + 0x42f0b103, + 0xb32303cd, + 0x4f6b4b07, + 0x42f0b303, + 0xb523042b, + 0x4f6b4b07, + 0x42f0b503, + 0xb7230483, + 0x4f6b4b07, + 0x42f0b703, + 0xd4b904a5, + 0x4fe60152, + 0xafe6026e, + 0xd4b9026a, + 0x30270303, + 0xeaff4ce0, + 0xc3430709, + 0x23418341, + 0xd7d49db1, + 0x4f6b4b07, + 0x03bc42f0, + 0x03bedabd, + 0xffffbea7, + 0xacbcd1ff, + 0x07402716, + 0xbcd4ad0c, + 0x27022303, + 0x8cbe121c, + 0x4027007f, + 0x16b004fd, + 0xc103ff00, + 0xcbdff453, + 0x16acbcd5, + 0xf0c1d405, + 0x8ef40334, + 0x47f5bef5, + 0xbd0fe6ff, + 0xff4ea700, + 0x40d1ffff, + 0x1c2716a0, + 0xbe012312, + 0xf9007f57, + 0x0016b004, + 0x1142e0ff, + 0xbe0d07fd, + 0x5eff55e3, + 0xf4c1fd08, + 0xa641e43c, + 0xa2bfe6fd, + 0xf0d4d1fd, + 0x9a4fe602, + 0xd864d1fd, + 0x30f1c102, + 0x0c074c11, + 0x007f22be, + 0xfc690fc6, + 0x270d29c1, + 0x61d4bd41, + 0xfd7b5e03, + 0x02c0dbb9, + 0xa9fd585e, + 0xa90330d0, + 0xb90332d1, + 0xb902e2d4, + 0xb902e4dc, + 0x0302e6db, + 0x2502e1dd, + 0x35d203fd, + 0x27d203fd, + 0x27fd45e0, + 0x3927542c, + 0x02e5dd23, + 0xfb15fc05, + 0xfe55fe65, + 0x5e88ed7e, + 0xd4d1fceb, + 0x4fe602f0, + 0x64d1fd31, + 0xf1c102d8, + 0xbe401130, + 0xf6007ebb, + 0x27fd200f, + 0x61d4bd44, + 0xfd175e03, + 0x02d864d1, + 0x3ff64311, + 0x3a5efc68, + 0xd864d1ff, + 0xe64c1102, + 0x07010dcf, + 0x30f1c145, + 0x149b4103, + 0x88be0c07, + 0x0fe6007e, + 0xd4a90862, + 0x4fe6058e, + 0xc4f4085a, + 0xd2d100ee, + 0x302702fc, + 0x21832123, + 0x02f4dcd1, + 0xf3a5f295, + 0x058ad7b9, + 0xfd43cff6, + 0x02f0d0d1, + 0x01870fe6, + 0xd3a9f491, + 0x244702ec, + 0xd4bd4127, + 0x40a702e8, + 0xd4bdb123, + 0x402703e0, + 0xd4bd3103, + 0x4b070303, + 0x03c0d2bd, + 0x02ecd3ad, + 0x015fdcbd, + 0x02f4d5d5, + 0x02ead3ad, + 0x0302dcbd, + 0xb1034f6b, + 0x089542f0, + 0x02d864d1, + 0x0300d3a9, + 0x324a4211, + 0x41234307, + 0x0300d4ad, + 0x0300d2ad, + 0x0123c007, + 0xffff4ea7, + 0xf0d0d5ff, + 0xac40d102, + 0x121c2716, + 0x007de6be, + 0x16b004f9, + 0x41e0ff00, + 0xdab90584, + 0xd8a902e8, + 0xdabd02ea, + 0xf3a10360, + 0x3fe69027, + 0xb3e0fd19, + 0xb4e003e0, + 0xd0d104d2, + 0x132702fc, + 0x007db6be, + 0xd0bd4127, + 0xd4bd0363, + 0x3a5e0304, + 0x032307fd, + 0x562aee24, + 0x834c070e, + 0xa243e043, + 0x0ba3c20d, + 0x43072a42, + 0xa4ee4303, + 0xd4b9ff16, + 0xdcd102fc, + 0x412302f4, + 0x71037407, + 0xf4954183, + 0x40277183, + 0x525ef4a5, + 0x84d8d5fc, + 0x4aa2e403, + 0xe6f1a1fd, + 0x5efd4e1f, + 0x4027fd41, + 0xe6fda65e, + 0xe0fbd45f, + 0xe0083bb3, + 0xd105afb4, + 0x2702fcdc, + 0x230c0713, + 0x7d41be01, + 0x950f6b00, + 0x230c07f0, + 0xbe132702, + 0x07007d33, + 0xf4dcd170, + 0x6b212702, + 0x5ef2a57f, + 0xb323fc05, + 0x4f6b4b07, + 0x42f0b303, + 0xb5230781, + 0x4f6b4b07, + 0x42f0b503, + 0xb72307de, + 0x4f6b4b07, + 0x42f0b703, + 0x412708a3, + 0x3407f291, + 0x423b373b, + 0xd3d534ab, + 0xca5e0384, + 0xf0d4d1fc, + 0x124ff602, + 0xf4dcd102, + 0x0ecff602, + 0xfcd7d102, + 0xa5002702, + 0x957183f0, + 0x2730a7f0, + 0xe8d4bd40, + 0xe0d3bd02, + 0xc0d3bd03, + 0xd862d103, + 0xd5302702, + 0xd502f0d8, + 0x4902f4d3, + 0xbd402722, + 0xbd015fd4, + 0xbd0159d5, + 0xad0303d4, + 0xc10300d2, + 0xd4ad3cf2, + 0xd3ad02ea, + 0xd4bd02ec, + 0x24c60302, + 0x0592d3ad, + 0x02ead8a9, + 0xd9d59027, + 0xc05e02fc, + 0x270027fb, + 0xf0d0d590, + 0xfcd9d502, + 0xfb1b5e02, + 0x4747f291, + 0xd4bd3247, + 0xd3bd03c0, + 0xf3a103e0, + 0xfb893ff6, + 0x03059fe6, + 0x02ead8a9, + 0x02ecd8ad, + 0x0159d4b9, + 0x015fd3b9, + 0xe0dcd299, + 0xf4070442, + 0xe0039343, + 0x27056e41, + 0xd4bdff4c, + 0x6a5e0303, + 0xd864d1fb, + 0xe6431102, + 0x99fc2d3f, + 0x3123ecd3, + 0x4f6b4307, + 0x42d03103, + 0x51b2e017, + 0x3cf4c105, + 0xfc144fe6, + 0xfc10b2e4, + 0x3ce43800, + 0x27fc2d10, + 0x9db12340, + 0x4b07d7d4, + 0x42f44f6b, + 0xf0c1fc48, + 0x410ff63c, + 0xe6f1b1fc, + 0xd1fc3b1f, + 0x9302d4d3, + 0x057d6ff2, + 0xb946238d, + 0x2702e8da, + 0x0100004e, + 0x02d0d4d5, + 0x02c4d3d5, + 0xd1fc1b5e, + 0x1102d864, + 0xcf3fe643, + 0xc14507fb, + 0x410330f1, + 0x149b0507, + 0xa8be030b, + 0x4007007b, + 0x42d04123, + 0xb3b4e4a3, + 0xc70ff6fb, + 0xd1991efb, + 0x0702d864, + 0xc14c11a5, + 0xa10330f1, + 0x0c071a9b, + 0x007b82be, + 0x02030fe6, + 0x01f7cff6, + 0xfdecace2, + 0x02fcd2d1, + 0x02f4dcd1, + 0x21832123, + 0x74273027, + 0xf3a5f295, + 0xd1fa405e, + 0x1102d864, + 0x77cfe64c, + 0x0da2e0fb, + 0xc1850704, + 0x810330f1, + 0x189b0c07, + 0x007b42be, + 0x89ee9007, + 0xb6e4ff3f, + 0x9ff6fb5a, + 0x345efb62, + 0xd864d1ff, + 0xe64c1102, + 0x07fb55cf, + 0x30f9c175, + 0x979b7103, + 0x19070c07, + 0x007b16be, + 0x41234007, + 0x42f08007, + 0x0c07ff0f, + 0x19070103, + 0x007b02be, + 0xff010fe6, + 0x19070c07, + 0xf4be0203, + 0x0fe6007a, + 0x78eefef3, + 0xb8e0feef, + 0xa1e40433, + 0x0c07fb12, + 0xdcbe1707, + 0x0fe6007a, + 0xd85efb06, + 0xf4dcd1fe, + 0x0eb1e002, + 0xd864d106, + 0xc8d3d102, + 0xc1441102, + 0xa40730f0, + 0x0aeea32b, + 0x34ee03a2, + 0xd9d1039a, + 0xf1c102fc, + 0xbe090730, + 0xe0007aa7, + 0xfc054202, + 0xc1053e01, + 0x4fe63cf4, + 0x4ea70537, + 0xd1ffffff, + 0x2716ac40, + 0x0123121c, + 0x007a86be, + 0x16b004f9, + 0x4596ff00, + 0x0592d4a9, + 0xd4ad4103, + 0x39070592, + 0xd4b93f6b, + 0x03070592, + 0x0123042b, + 0x73070183, + 0x7183f095, + 0xf4a54027, + 0x5eead98d, + 0xd9d1f935, + 0x912302fc, + 0x02fcd9d5, + 0xbef8f45e, + 0x07ff38df, + 0x07cfabc0, + 0xabc1034b, + 0x03c49b4f, + 0x00cef4c1, + 0xf8310100, + 0x2cbe0b07, + 0x0c07ff3f, + 0xff3f3cbe, + 0xe0f8225e, + 0xe0052ab1, + 0x230260b2, + 0x6b4b07b3, + 0xf0b3034f, + 0x23074542, + 0x6b4b07b5, + 0xf0b5034f, + 0x23081642, + 0x6b4b07b7, + 0xf0b7034f, + 0x9108f042, + 0x3b4a07f1, + 0x84d4d541, + 0xf9c75e03, + 0x01bbaff6, + 0x43273127, + 0x0363d4bd, + 0x0304d3bd, + 0x0364d3bd, + 0xb9f9645e, + 0xe60302d4, + 0x27017c4f, + 0x27948641, + 0xbd420340, + 0x5e0363d4, + 0x64d10173, + 0x350702d8, + 0x0330f1c1, + 0x9b401131, + 0x79a5be13, + 0x950ff600, + 0x86d0b901, + 0x84d7b905, + 0xf4dcd105, + 0x95102702, + 0x5ef1a5f0, + 0xd9bdf86d, + 0x785e0302, + 0x88d4a9f8, + 0x054ff605, + 0xfcd7d1fe, + 0xf4dcd102, + 0x27042702, + 0x95718310, + 0x5ef1a5f0, + 0x11e0f849, + 0xf191051d, + 0x31474427, + 0x03c0d4bd, + 0x03e0d3bd, + 0xa9f87c5e, + 0x5e02ead8, + 0xa4d1fd00, + 0x4cfc0168, + 0xd1014c20, + 0xd102d864, + 0x1102d0dc, + 0xab2c0743, + 0x1b23ee2f, + 0xb5302706, + 0xff4ea7f3, + 0x40d1ffff, + 0x1c2716ac, + 0xbe012312, + 0xf900791b, + 0x0016b004, + 0xd94ff6ff, + 0x30f4c104, + 0x02ccd4d5, + 0x0168a4d1, + 0x52204cf8, + 0x42e9bef7, + 0x4ac0eaff, + 0xd5c127f7, + 0x5e02d0dc, + 0xafe6f741, + 0xa1e00112, + 0xd0d10632, + 0x132702fc, + 0x0078debe, + 0x0363d0bd, + 0xd4bd4127, + 0xd4bd0304, + 0xa7660364, + 0xf85fa1e4, + 0xf1c14507, + 0x07410330, + 0x0b149b08, + 0x78b9be05, + 0x4a0ff600, + 0x63d4b9f8, + 0x80d4ad03, + 0xf83f5e05, + 0x01d143e0, + 0xfc6d45e4, + 0x43073123, + 0x31034f6b, + 0xfc6143f4, + 0x432b4427, + 0xd4bd4f6b, + 0xc65e0303, + 0xb4aff6f7, + 0x27442700, + 0x63d4bd30, + 0x88d3ad03, + 0xbd412705, + 0xbd0304d4, + 0x070364d4, + 0xe6a1e42a, + 0xd864d1f7, + 0x49c12702, + 0x88d4ad44, + 0xf7dd5e05, + 0x02ead8a9, + 0xdcd59027, + 0x905e02f0, + 0xbd4227f7, + 0x230363d4, + 0x6b4b07b7, + 0xd0b7034f, + 0xc9077742, + 0x0304dcbd, + 0xff39b3be, + 0xf7bd0fe6, + 0xba5e4127, + 0xfcd0d1f7, + 0xbe132702, + 0x2700781f, + 0x63d0bd41, + 0x04d4bd03, + 0x64d4bd03, + 0xf7a35e03, + 0x0582d2b9, + 0x0584d7b9, + 0x02f4dcd1, + 0xf2953027, + 0xda5ef3a5, + 0xd864d1f6, + 0x27431102, + 0xd5310341, + 0xd102d0d3, + 0xbd0128a0, + 0xd502d8d4, + 0x5e02d4d0, + 0x4427fe9b, + 0x0363d4bd, + 0xd1fefb5e, + 0x8302fcd4, + 0x63d4bd41, + 0xff4f5e03, + 0x02d864d1, + 0xd4ad4449, + 0x7f5e058e, + 0x7cd4a9ff, + 0x07f09105, + 0x3b1a073a, + 0xab143b30, + 0x84d3d531, + 0xf7835e03, + 0x02eadca9, + 0x050ecff6, + 0x02fcd0d1, + 0x02231327, + 0x00778ebe, + 0x0580d2b9, + 0x7007f295, + 0x02f4dcd1, + 0x7f6b3127, + 0x5a5ef3a5, + 0x31aff6f6, + 0xbd452705, + 0x270363d4, + 0xad402735, + 0xad058ad3, + 0xd1058cd4, + 0x0702d864, + 0xad44492a, + 0xe4058ed4, + 0xb9f6d0a1, + 0x270363d4, + 0x90d4adc1, + 0xf6c95e05, + 0xf7c18507, + 0x9b810330, + 0x070c0778, + 0x7735be17, + 0xe2900700, + 0x03fb3205, + 0x0b0c07c1, + 0xbe170705, + 0xe2007723, + 0x5efb2205, + 0x4fe6fbde, + 0x4ea7fc66, + 0xd1ffffff, + 0x2716ac40, + 0x0123121c, + 0x007706be, + 0x16b004f9, + 0x41e0ff00, + 0xd3b9054e, + 0xf395057c, + 0x02fcd9d1, + 0x71837907, + 0x91fc8f5e, + 0x3b4207f3, + 0xab233b47, + 0x344ca342, + 0x0384d4d5, + 0xe0f6b45e, + 0xe602dd23, + 0xe402dd3f, + 0x27fa9631, + 0x03d4bd42, + 0xf5ff5e03, + 0xfac131e0, + 0xfaab34e4, + 0xe6faba5e, + 0x5efab68f, + 0xb1e0fbca, + 0x40270310, + 0xd1ecd49d, + 0xd102d863, + 0x1102c8dc, + 0xa5f29334, + 0x4c2b0578, + 0xe04741c0, + 0xc103c142, + 0x16063cf1, + 0x02d824d1, + 0x4c2b4411, + 0xc04a43c0, + 0xaff63f44, + 0x4227028f, + 0x0363d4bd, + 0x02d863d1, + 0x32114227, + 0xd2d5c127, + 0x334902c8, + 0x057cd4ad, + 0x27eed38d, + 0xecd39d31, + 0x8d30f3c1, + 0xd05ef0d3, + 0x9d4227f5, + 0x23d1ecd4, + 0x341102d8, + 0xac1e4c2b, + 0x9d104c27, + 0xbb1eecd4, + 0xd49d4827, + 0xd823d1ec, + 0x2b341102, + 0xab44c44c, + 0xd7d1e71e, + 0xd0b902fc, + 0xdcd1058a, + 0x102702f4, + 0xf0957183, + 0xee5ef1a5, + 0x8edca9f4, + 0xd1c0a605, + 0x1102d864, + 0x87a4f04a, + 0xc14507f7, + 0x410330f1, + 0x0a07149b, + 0x0075eebe, + 0x04f70ff6, + 0x02fcd7d1, + 0x058ad4b9, + 0x02f4dcd1, + 0xf4957183, + 0xb65ef0a5, + 0x5e3127f4, + 0xaff6f615, + 0x4427019e, + 0xd4bd3427, + 0xd3ad0363, + 0x41270586, + 0x0304d4bd, + 0x0364d4bd, + 0xa2f42a07, + 0xd0a9f52d, + 0xd4b90582, + 0xd0ad0363, + 0xd4ad0584, + 0x22e40582, + 0x5f5ef51d, + 0x914127fd, + 0x3b3407f2, + 0xab473b32, + 0x183ca334, + 0x0384d3d5, + 0xe0f5605e, + 0xd1f76bb1, + 0xd102d863, + 0x1102c8d2, + 0x30f1c133, + 0x422b4307, + 0xf76a14ee, + 0x0300d3ad, + 0xe0f7675e, + 0xe0023ca1, + 0xc1023302, + 0x3fe63cf3, + 0xd4b90281, + 0x491b0592, + 0x41234f6b, + 0x71037407, + 0x71834183, + 0xe15ef495, + 0x943ff6fa, + 0xbd432701, + 0x5e0303d4, + 0x4127f46d, + 0x3407f091, + 0x473b303b, + 0x3ca334ab, + 0x84d3d518, + 0xf4f75e03, + 0x02ead0a9, + 0x01a50ff6, + 0x02fcd0d1, + 0x02231327, + 0x007506be, + 0xdcd17007, + 0x132702f4, + 0x7f6b2127, + 0xf2a5f195, + 0x91f3d45e, + 0x3b4a07f3, + 0xd544a343, + 0x5e0384d4, + 0xaff6f4c5, + 0x452701ab, + 0xd4bd3527, + 0xd3ad0363, + 0x64d1058a, + 0x2a0702d8, + 0xd4ad4449, + 0x22e4058e, + 0x875ef445, + 0x30f1c1fc, + 0x02e111e0, + 0x02d864d1, + 0x02c8d2d1, + 0xf4c14311, + 0xee322b30, + 0xa901c734, + 0xe602ead4, + 0xa701bf4f, + 0xffffff4e, + 0x16ac40d1, + 0x23121c27, + 0x748dbe01, + 0xb004f900, + 0x23ff0016, + 0xf04f6b41, + 0xd104eb42, + 0xe002fcd9, + 0x2304ce91, + 0x83390791, + 0x03f39531, + 0x27790791, + 0xa5718340, + 0xead98df4, + 0x27f3405e, + 0x07f19141, + 0x3b313b34, + 0xa334ab47, + 0xd3d5303c, + 0x265e0384, + 0x274747f4, + 0xc0d4bd34, + 0xe0d3bd03, + 0xf3635e03, + 0x02ccd0a9, + 0x5e30f0c5, + 0x64d1fb28, + 0x510302d8, + 0xf4c14c11, + 0x9b0c0730, + 0x85140745, + 0xbe5123f4, + 0xf6007417, + 0x8102140f, + 0xbe0c07f1, + 0x23007411, + 0x03018301, + 0xad0f6b03, + 0xbd0586d0, + 0x5e0363d0, + 0x32f0fe3a, + 0x4427fd2b, + 0x0303d4bd, + 0xd1f3285e, + 0xee0378d4, + 0xd1030f4c, + 0xc102d863, + 0x341130f2, + 0x24ee4c2b, + 0xdcd1035c, + 0xf1c102fc, + 0xbe0c0730, + 0xe00073c7, + 0xfc01f702, + 0xc101f301, + 0x2ff63cf2, + 0x4c0701f3, + 0x2a074183, + 0x0363d4bd, + 0xf32b22e4, + 0x27fb6d5e, + 0x03d4bd41, + 0xf2db5e03, + 0xd49d4027, + 0xfaaff6ec, + 0x27422701, + 0x63d4bd31, + 0xecd39d03, + 0x02d862d1, + 0x22114227, + 0xc1273227, + 0x057cd4ad, + 0x057ed3ad, + 0x02c8d2d5, + 0xe0f2f25e, + 0x07031101, + 0x30f1c145, + 0x4103050b, + 0x149b0103, + 0x00735abe, + 0x02280ff6, + 0x02fcd0d1, + 0x02231327, + 0x00734abe, + 0xdcd17007, + 0x432702f4, + 0x7f6b0127, + 0xf0a5f495, + 0xd1f2185e, + 0x8302fcd4, + 0x63d4bd41, + 0xfe585e03, + 0x463cf1c1, + 0x7cd2b91e, + 0x83790705, + 0x5ef29571, + 0x2fe6f8bc, + 0xd3d1f9e5, + 0x23ee02c8, + 0xb1e0f9dd, + 0xb2e40381, + 0xd4d1f9d5, + 0x42f002d4, + 0x321bf9cd, + 0x1fab1307, + 0xf1c52127, + 0x27f2b530, + 0xd8d4bd40, + 0xc4d3d502, + 0xf9b75e02, + 0x057cd0b9, + 0x02fcd9d1, + 0x6a5ef095, + 0x5e4907fe, + 0x4427fd84, + 0x5eecd49d, + 0xf291fc3b, + 0x423b4a07, + 0xd5184ca3, + 0x5e0384d4, + 0xfcc1f299, + 0x9b510330, + 0x230807c5, + 0x07050b51, + 0x72a5be1c, + 0xbb0ff600, + 0x071c07f9, + 0x729fbe08, + 0x03018300, + 0x63d0bd03, + 0xf9b65e03, + 0x02a6c1e0, + 0xa103a507, + 0x1a070c07, + 0x00727ebe, + 0x023d0ff6, + 0xf1c1c50b, + 0x030c0730, + 0xbe1a9b01, + 0xf600726b, + 0xd102450f, + 0x2702fcd0, + 0xbe022313, + 0xb900725b, + 0x070580d3, + 0xf4dcd170, + 0x6b412702, + 0xa5f3957f, + 0xf1275ef4, + 0x02d864d1, + 0x1130f1c1, + 0x9b51034c, + 0x750c0715, + 0xbe5123f1, + 0xf600722f, + 0x7101a60f, + 0xbe0c07f1, + 0x23007229, + 0x03018301, + 0xbd0f6b04, + 0x930363d0, + 0x05741ff4, + 0x02d843d1, + 0x058ad0ad, + 0xd3ad3349, + 0xa05e058c, + 0xfcd4d1fa, + 0xbd418302, + 0x5e0363d4, + 0x4527fc36, + 0x0361d4bd, + 0x91f0545e, + 0x3b4a07f3, + 0x184ca343, + 0x0384d4d5, + 0xb9f1bc5e, + 0xd1057cd2, + 0x9502fcd9, + 0xfd635ef2, + 0xe63cf3c1, + 0xb9fe113f, + 0x070592d3, + 0x07c32b2a, + 0xbd41834c, + 0xe40363d4, + 0x5ef13422, + 0xd0a9f976, + 0x02e0057c, + 0x03e001ea, + 0x0f6b0202, + 0xa95ef095, + 0xfcd4d1fa, + 0xc8d1d102, + 0xbd418302, + 0xd10363d4, + 0x9102d863, + 0x30f0c1f4, + 0x057ed4ad, + 0x2a073411, + 0x312b3407, + 0xce2b03ce, + 0x31c02414, + 0xb632e00e, + 0xe42a0701, + 0x5ef0e822, + 0x4227f92a, + 0xd1ecd49d, + 0xd102d863, + 0x1102c8d4, + 0x1e342b33, + 0xca4fe6e1, + 0x9d4127f0, + 0xf393ecd4, + 0xd1057350, + 0x1102d834, + 0xc8dcd54c, + 0x2b431102, + 0xc231c43c, + 0xdcd1cd1e, + 0x132702fc, + 0x01230c07, + 0x007122be, + 0xf0950f6b, + 0x13270c07, + 0x14be0223, + 0x70070071, + 0x02f4dcd1, + 0x7f6b1127, + 0xe65ef1a5, + 0x07f091ef, + 0xa3403b4a, + 0xd4d5304c, + 0xd65e0384, + 0x8cd3a9f0, + 0x463ae205, + 0xfcd7d1f3, + 0x8ad1b902, + 0xf4dcd105, + 0x83202702, + 0xa5f19571, + 0xefb75ef2, + 0xfcf1cfe6, + 0xffff4ea7, + 0xac40d1ff, + 0x121c2716, + 0xc0be0123, + 0x04f90070, + 0xff0016b0, + 0xfcd54fe6, + 0x057cd3b9, + 0xd3bd2a07, + 0x64d10363, + 0x401102d8, + 0x02c8d0d5, + 0xd3ad4449, + 0xd48d057c, + 0x9d4127ee, + 0xf1c1ecd4, + 0xf0d18d30, + 0xf00b22e4, + 0xd1f84d5e, + 0x8302fcd4, + 0x63d4bd41, + 0xf9195e03, + 0x057cd4a9, + 0x00d742e0, + 0x32274227, + 0x0363d4bd, + 0x02d864d1, + 0x40112a07, + 0x02c8d0d5, + 0xd0d1bb1e, + 0x132702fc, + 0x50be0123, + 0xdcd10070, + 0x0f6b02f4, + 0x73273127, + 0xf3a5f095, + 0xe0ef205e, + 0xe400bf01, + 0x0bff0902, + 0x30f1c1c5, + 0x01030c07, + 0x28be1a9b, + 0x02e00070, + 0xdcd10118, + 0x132702fc, + 0x01230c07, + 0x007016be, + 0xf0950f6b, + 0x02230c07, + 0x08be1327, + 0x70070070, + 0x02f4dcd1, + 0x7f6b0127, + 0xda5ef0a5, + 0x2b4a07ee, + 0x5a45f44c, + 0xfcd7d1f2, + 0x90d0b902, + 0xf9cc5e05, + 0xe030f4c1, + 0xd100ab41, + 0x2702fcd0, + 0xbe012313, + 0xb9006fd3, + 0xd10580d7, + 0x6b02f4dc, + 0x9521270f, + 0x5ef2a5f0, + 0x1327eea1, + 0xc55ef195, + 0x074427f8, + 0xecd49d2a, + 0xef2f22e4, + 0x27f7715e, + 0x5ef29522, + 0x2227fb39, + 0xa95ef295, + 0x274327f8, + 0xff2a5e33, + 0x057ed1b9, + 0x02fcd9d1, + 0x1e5ef195, + 0xd4d4d1fb, + 0x874ff602, + 0xf64f5efc, + 0xf1c1c50b, + 0x030c0730, + 0xbe1a9b01, + 0xc0006f6f, + 0xdcd14a01, + 0x132702fc, + 0x01230c07, + 0x006f5ebe, + 0xf0950f6b, + 0x13270c07, + 0x50be0223, + 0xc75e006f, + 0xfcd7d1f7, + 0x8ad3b902, + 0xf4dcd105, + 0x83402702, + 0xa5f39571, + 0xee175ef4, + 0x0580d0b9, + 0x02f4dcd1, + 0x74271127, + 0xf1a5f095, + 0xd1ee045e, + 0x2702fcd0, + 0xbe022313, + 0xb9006f17, + 0x950580d1, + 0xf1dd5ef1, + 0x02fcd0d1, + 0x01231327, + 0x006f02be, + 0x0580d7b9, + 0x02f4dcd1, + 0x41270f6b, + 0xf4a5f095, + 0x4eedd05e, + 0x93c007fc, + 0x0570f3f0, + 0x93df237e, + 0x011058f4, + 0xc4050027, + 0xfb4efc8e, + 0x9daaf493, + 0x07431904, + 0xc13fe6b0, + 0xff3ea700, + 0x34d1fbff, + 0x42dc0420, + 0x27c3071e, + 0x200000de, + 0x2722fd9b, + 0x0abe0f0c, + 0x402700d0, + 0xd122f49b, + 0xd80420c3, + 0xf093eb32, + 0xbe048dd4, + 0x9300c35f, + 0x048e93f3, + 0xfffb4ea7, + 0xff1ea7f9, + 0x2c27f9fd, + 0x23300111, + 0x11400544, + 0x05440330, + 0x03302140, + 0x03100548, + 0x14030c3c, + 0xf493f230, + 0xc1048da0, + 0x41c1a042, + 0xff3ea7a4, + 0x32d5fbff, + 0x40c10490, + 0xb831d5a8, + 0xac42c104, + 0x049430d5, + 0xd5b041c1, + 0xc1049832, + 0x31d5b440, + 0x42c1049c, + 0xa030d5b8, + 0xbc41c104, + 0x04b032d5, + 0xd5c040c1, + 0xc104b431, + 0x30d5c442, + 0xb4d10418, + 0x32d502b0, + 0x45c60434, + 0x98be0b07, + 0x0b0700c3, + 0x00c3fdbe, + 0xf49b4027, + 0x4efb8e0e, + 0x070419fb, + 0x061f6bb0, + 0xce1fe645, + 0xe6fb8e01, + 0x2701711f, + 0xf5fd9341, + 0xd49d056f, + 0xdf0ea705, + 0xcebeffff, + 0x0d27003e, + 0x5a7e3740, + 0xbdfc93a5, + 0xc00505b9, + 0xffdf0ea7, + 0x3e94beff, + 0x27c30100, + 0x07341d40, + 0x984c0343, + 0x2c271127, + 0x03411d1c, + 0x984c0311, + 0x2307f2b0, + 0x373f2d03, + 0x34b83d03, + 0xffff4ea7, + 0x8043d5ff, + 0x7f2ce318, + 0x197f3ce3, + 0x803c0334, + 0xa7f932c2, + 0xffffff4e, + 0xd1a21c27, + 0x27188044, + 0x05310720, + 0x03112342, + 0x27f3b844, + 0x30a71a2c, + 0xbd78d3c5, + 0xa70fded2, + 0xffffffce, + 0x1890c1d5, + 0x0fdcd2bd, + 0x0fddd2bd, + 0xd1c54027, + 0x44d1c53c, + 0x1014d1d5, + 0xbd0dd49d, + 0xd5101cd1, + 0xd51888c1, + 0x7e188cc1, + 0x4c2793d6, + 0x2710270c, + 0x9d01b82d, + 0xd49d26d4, + 0x25d49d24, + 0xe93b0ea7, + 0x3198beff, + 0x000d2700, + 0x07202740, + 0x3dd4be10, + 0xe0c0d500, + 0x03212704, + 0x2708000d, + 0x33420737, + 0xe040f543, + 0x03ff0004, + 0x000d0321, + 0xa7f36808, + 0xfd4fff4e, + 0x276843c1, + 0x103c3320, + 0xd49d40a7, + 0x5cd29d5b, + 0x535ad29d, + 0x35e01c3c, + 0x4d27011b, + 0x21272000, + 0x93133c27, + 0x05b93bf1, + 0x49b2d4ad, + 0x9d54d29d, + 0xd4ad56d3, + 0xd29d49b0, + 0x27310755, + 0x27072720, + 0x23320547, + 0xb8340301, + 0x274327f4, + 0x27144521, + 0xc5402731, + 0x149d60d0, + 0x0a139d08, + 0x12051235, + 0x109d1015, + 0x5dd09d09, + 0xb41d4127, + 0xf293fb8e, + 0x9300d52f, + 0x04a6b7f3, + 0x40273205, + 0x9321f49b, + 0x04a6b3fc, + 0x20273c07, + 0x051f4c27, + 0xc8340332, + 0x9d4027f4, + 0xd7be0ec4, + 0x4227ff40, + 0x2710c49d, + 0x8d35084d, + 0x3c2716c4, + 0x9d412723, + 0xc49d15c3, + 0x273a2714, + 0xc0c51e4c, + 0x12c38d60, + 0xbe11c49d, + 0x1e00cd04, + 0xccfebea4, + 0x69fc9300, + 0x61be04a6, + 0xc49900bf, + 0x934a160f, + 0x049b8ff0, + 0x93fd397e, + 0x049b87f3, + 0xe6083499, + 0x99fe104f, + 0x4b360534, + 0xf49b3481, + 0x9b339130, + 0xf09331f3, + 0x0e049b70, + 0xce399efb, + 0x07c27100, + 0x031c070c, + 0x1c03100c, + 0xd603be44, + 0x070c0700, + 0x03c2611c, + 0x1c03140c, + 0xd5f3be28, + 0x81b11e00, + 0x48f49b34, + 0xf39b3391, + 0x27c81e49, + 0x5e10004d, + 0xfb4efee6, + 0xffffdea7, + 0x10d499ff, + 0xfb8e4486, + 0xc027fbab, + 0x9b0dfc9b, + 0x3ea70efc, + 0x11fd9fff, + 0xa3012734, + 0x0400004e, + 0xe4be3415, + 0x4ea70033, + 0x01fd4fff, + 0x9d212743, + 0xf4930fd3, + 0x1d04a5bc, + 0x10d29d42, + 0x9b0fd499, + 0x31270efc, + 0x43f54487, + 0xff02b040, + 0xf093fbeb, + 0x27056d64, + 0x5efb0e11, + 0xfc4efd53, + 0xd8484f9b, + 0xf493fb41, + 0x07048a80, + 0x292d2324, + 0xe3340706, + 0x3ce37f2c, + 0x0334197f, + 0x32c2803c, + 0xff3ea7f9, + 0x34d1fbff, + 0x42dc0420, + 0x27c3071e, + 0x200000de, + 0x2722fd9b, + 0x72be0f0c, + 0x402700cc, + 0xd122f49b, + 0xd80420c3, + 0xf493eb32, + 0x190499dc, + 0x8e349643, + 0xff4ea7fc, + 0x4cd1fbff, + 0xf0930418, + 0x07048a28, + 0xbeda33dc, + 0x9300bff2, + 0x048ae3f2, + 0x931adc53, + 0x048a13fe, + 0x07111c27, + 0x40dc304d, + 0x4c234d07, + 0x33340740, + 0x0030f133, + 0x87ff0600, + 0xf1200544, + 0x06000433, + 0x15d103ff, + 0x0044f123, + 0x25ff0602, + 0x0c2c0324, + 0xa7d1f1f0, + 0xfbffff2e, + 0x049024d1, + 0xe4c51c07, + 0xb823d1a0, + 0x001ee304, + 0xe3c53f00, + 0x9424d1a4, + 0xa8e4c504, + 0x049823d1, + 0xd1ace3c5, + 0xc5049c24, + 0x23d1b0e4, + 0xe3c504a0, + 0xb024d1b4, + 0xb8e4c504, + 0x04b423d1, + 0xc5c0e1c5, + 0x24d1bce3, + 0xe4c50434, + 0x4efc8ec4, + 0xc60f6bfd, + 0x59f49307, + 0x4399056c, + 0x8e349605, + 0x225abefd, + 0xbe0346ff, + 0x0e010b44, + 0xb20e9efd, + 0x9b442700, + 0xdb7e21f4, + 0x484f9bfe, + 0x271a41dc, + 0x9b02202d, + 0x402722f2, + 0x070ef49b, + 0x9bff8b00, + 0x3f9b22f4, + 0xec31d848, + 0x9986fd93, + 0x08d49904, + 0x40274cd6, + 0x9321f49b, + 0x04a443fd, + 0xc60fd499, + 0x1d07ae4f, + 0x1c030d07, + 0x140c0328, + 0xff3e0ebe, + 0x1d07d065, + 0x1c030d07, + 0x100c0344, + 0xff3dfebe, + 0x0d07d075, + 0xbe140c03, + 0x0700caca, + 0x100c030d, + 0xbf9efd0e, + 0x0d0700ca, + 0x71be0403, + 0xd49900cd, + 0x9b45d605, + 0xd485304f, + 0x95313f9b, + 0x9ba41ed3, + 0xd485484f, + 0x95493f9b, + 0x00981ed3, + 0x00058538, + 0x00001000, + 0x00000fff, + 0x00000180, + 0x000001e0, + 0x00000080, + 0x0000007f, + 0xf163f54e, + 0x4127f3ab, + 0x0ea7f4eb, + 0xd1ffffff, + 0xa60e5c03, + 0xff1ea735, + 0x1441fdaf, + 0x1405430b, + 0xffff2ea7, + 0x102499ff, + 0x03604fe6, + 0xa392f393, + 0xf6341904, + 0x2702554f, + 0xff1ea780, + 0x14b9feff, + 0x4cfc1d35, + 0xa701fa2f, + 0xfeffff4e, + 0x1d3541b9, + 0x29301cd8, + 0x83094499, + 0x33248743, + 0xf9422b44, + 0x00005043, + 0xa736e6ff, + 0xfeffff0e, + 0x014803d1, + 0x092a31e0, + 0x42234307, + 0x092d42f0, + 0xffff3ea7, + 0x3534b9fe, + 0x104cf81d, + 0x4ea70088, + 0x99ffffff, + 0xcfe6274c, + 0xa02707e0, + 0xffff0ea7, + 0xf90d11fe, + 0x000e50db, + 0x4b1d07ff, + 0xb01e23bf, + 0xcbeefff1, + 0x902702f2, + 0xa30af193, + 0xa6141904, + 0xa70ea746, + 0x0419fff1, + 0x4c4e4f4b, + 0x2a071c07, + 0xff275dbe, + 0x2ea797e6, + 0x27ffffff, + 0x6424bd41, + 0x0f239906, + 0xf49b4027, + 0x8741270e, + 0x4034f533, + 0xfcff02b0, + 0xa702dcb2, + 0xfeffff2e, + 0x014824d1, + 0x42e03027, + 0x430702fd, + 0x302748ab, + 0x31274486, + 0x8f6b8307, + 0xffff3ea7, + 0x233c11fe, + 0xfff1b0ce, + 0x010a8fe6, + 0xf893b027, + 0x9304a294, + 0x04a297f4, + 0x9d064919, + 0x6a56f093, + 0x65039905, + 0xf1a74ea7, + 0x194a19ff, + 0x793ff6cd, + 0x07012702, + 0x0731533d, + 0xc341534a, + 0x9334eb31, + 0x056a33f4, + 0x5c644299, + 0x99053631, + 0x43f80444, + 0x4207009d, + 0x4b8b41c3, + 0x44863027, + 0xb3073127, + 0xbfe6b183, + 0xc4190089, + 0xc41d41a3, + 0x3ea795a6, + 0x19fff1a7, + 0x1d41a334, + 0x9b402734, + 0x83190ef4, + 0x00a43ff6, + 0xffff0ea7, + 0x5004d1ff, + 0x974ff606, + 0xff1ea700, + 0x1db9feff, + 0xd4531d35, + 0xf293d183, + 0x1904a20c, + 0xa6bdf62b, + 0xd7bff6d7, + 0xff3ea707, + 0x3499ffff, + 0x9b30270f, + 0x31270ef3, + 0x43f54487, + 0xff02b040, + 0x8419fdab, + 0x06aa4fe6, + 0xc419fdeb, + 0xa1daf193, + 0x1d41e304, + 0xa61319c4, + 0xa73ea735, + 0x3419fff1, + 0x341d41e3, + 0xf49b4027, + 0x1d40270e, + 0xfe045e84, + 0x11270127, + 0x00af5bbe, + 0xa7c60fc6, + 0xfff1a73e, + 0x30273419, + 0x41184d8b, + 0xd3073127, + 0x941edf6b, + 0xa18ef893, + 0x27841904, + 0xf44fe6b1, + 0x5eb027fe, + 0xd027feef, + 0x27ff755e, + 0x73c5be00, + 0xff2ea7ff, + 0x24b9feff, + 0xd0070140, + 0x06b34ff6, + 0xb007c007, + 0x8310cc83, + 0xc67630bc, + 0x4c834d07, + 0x2748ab25, + 0x27448630, + 0x6b830731, + 0x9cbff68f, + 0xff3ea705, + 0x34b9feff, + 0x4cf81d35, + 0xbdfdc60f, + 0x5e1d353d, + 0x75befdbf, + 0x1ea700b6, + 0xb9feffff, + 0x271d3514, + 0x27049691, + 0x2f4cf890, + 0x2ea706ab, + 0x99ffffff, + 0x27992624, + 0xb742e027, + 0xb372e002, + 0x27802702, + 0xff3ea740, + 0x34bdffff, + 0xdabe0669, + 0x0e3600b1, + 0xffff4ea7, + 0x6443b9ff, + 0x6744b90e, + 0x07431b0e, + 0xd4df6bd4, + 0x073910dc, + 0x1ea027b3, + 0x9d402711, + 0xd10356c4, + 0xa127b103, + 0x5f10dcf4, + 0x834b0706, + 0xc4070f4c, + 0xc4333487, + 0xc42bc32b, + 0xce23c333, + 0x07fff198, + 0xca697e0c, + 0xf6d30fd6, + 0x27063daf, + 0x2749ab40, + 0x27448630, + 0xff2ea731, + 0x24b9ffff, + 0x3f6b0666, + 0x4ff6f335, + 0x0ea705ef, + 0xb9ffffff, + 0xf6066a04, + 0xf606074f, + 0x27053c8f, + 0xa7f12510, + 0xffffff3e, + 0x066734b9, + 0x40274506, + 0x066734bd, + 0x682ef093, + 0x08049905, + 0x02094fe6, + 0xf4310027, + 0x40ab3027, + 0x31274486, + 0xf0934027, + 0x6b056814, + 0x64049d3f, + 0x3fe68307, + 0x4127fcb9, + 0x5e65049d, + 0x0ea7fcb1, + 0xbeffffeb, + 0x7e0036dd, + 0x0ea7fa36, + 0xbeffffeb, + 0x5e0036ae, + 0x0ea7fc8c, + 0x07fff1a7, + 0xbe3a072c, + 0xf9ff3b8d, + 0x000e50db, + 0x4b9007ff, + 0xfcfa5ebf, + 0x67caf193, + 0x05149905, + 0x05ac4fe6, + 0x7c5e0027, + 0xedfd93fd, + 0xd001049f, + 0x0ff6f08b, + 0x3ea7081d, + 0x99feffff, + 0x42060a34, + 0x40273127, + 0xffff1ea7, + 0x0a149dfe, + 0xffff2ea7, + 0x4824d1fe, + 0x0742e401, + 0xffdea7fd, + 0xd411fd9f, + 0x15184c83, + 0x3772bed4, + 0xff4ea700, + 0x43b9feff, + 0x35660141, + 0x4ea73127, + 0x45d07fff, + 0x9df29343, + 0x2419049f, + 0x08b04ff6, + 0xf87e0027, + 0x27f1abfa, + 0xd92fe621, + 0xd521e007, + 0x3024f907, + 0xf0ff011d, + 0x87083142, + 0x0043f142, + 0xf8ff0230, + 0x03082534, + 0xde25d021, + 0xf1eb4127, + 0x08464fe6, + 0x0065e5be, + 0xffff3ea7, + 0x263461ff, + 0xa7c30747, + 0xfd4fffde, + 0xf49b4027, + 0x38d4c50e, + 0x0065c9be, + 0x4256c461, + 0xffff0ea7, + 0x090399fe, + 0x4fffbea7, + 0xa7b201fd, + 0xffffffee, + 0x990ee199, + 0x338311ed, + 0x423b4127, + 0x14eb2307, + 0x3387d123, + 0xe19d2433, + 0x9d232b0e, + 0x24f911ed, + 0xff000050, + 0x24f9c407, + 0xff00004f, + 0x24fd4123, + 0xff00004f, + 0x078fdff6, + 0x99090399, + 0x432b44e4, + 0x41e84f4b, + 0xc5860781, + 0x0658e4d1, + 0xc525ec9d, + 0xf49340e4, + 0x01056690, + 0x07402741, + 0x0ce49d0e, + 0x9d2ae49d, + 0x3bbe12ed, + 0xb101ff1e, + 0x8a22f293, + 0xd24d2704, + 0x0c3c2707, + 0x24050207, + 0x21252315, + 0x2d452c35, + 0x002c49be, + 0x9e9ef393, + 0xf6341904, + 0x2706ec4f, + 0x0bf49b40, + 0xa70ef49b, + 0xfeffff2e, + 0x4c272111, + 0xfc24bd10, + 0xfd30271c, + 0x00000013, + 0x9b4027ff, + 0x3ea70ef4, + 0x99ffffff, + 0x4fe61234, + 0x31270770, + 0x4fff4ea7, + 0x3043c5fd, + 0x8127ff1e, + 0xa7fd4e5e, + 0xffffff1e, + 0x066814b9, + 0x04454ff6, + 0xf2152027, + 0xffff0ea7, + 0x4c06d1ff, + 0x00d95e0e, + 0xd9874907, + 0xd40b4433, + 0x13fad2f9, + 0x729dff00, + 0xfcd4f149, + 0xe9ff0013, + 0x001400d1, + 0x9074c5ff, + 0x13fcd0f1, + 0x718dff00, + 0x54babe94, + 0x4ec5be00, + 0x07402700, + 0x005f27b0, + 0x073fe000, + 0xe9350724, + 0x001400da, + 0xbe0b07ff, + 0x07005f58, + 0x070a07b0, + 0x5492bec1, + 0x4e9dbe00, + 0x07400700, + 0x07240731, + 0xbe0b071c, + 0x07005b70, + 0xbe040740, + 0x9d004081, + 0x40279670, + 0xd4edc027, + 0xff001400, + 0x13fcdcf5, + 0xc5beff00, + 0xf241ff24, + 0x46334907, + 0xf393420b, + 0x0105af50, + 0x33492b32, + 0x7070c543, + 0x43d1420b, + 0x7cc5113c, + 0xc5333374, + 0x84996c73, + 0x99453604, + 0x4ff60584, + 0xf2930088, + 0x99056548, + 0x41c05d24, + 0x0b849972, + 0x42274586, + 0x6536f393, + 0x04349d05, + 0x317e0607, + 0x0761038b, + 0x045dbe06, + 0x83400701, + 0x4ce4184c, + 0xfc01bc18, + 0x01b7200c, + 0x9c839607, + 0x0719070f, + 0x33133349, + 0x2b412b45, + 0x0b848749, + 0x45833384, + 0x648f03f1, + 0x99000678, + 0x83991184, + 0xc1473304, + 0x34abd487, + 0xb948739d, + 0xf6027784, + 0xb9fedf4f, + 0x2702aa83, + 0xd99b14dc, + 0x5e49739d, + 0x0707fee1, + 0x7e480c03, + 0x861eb62b, + 0xff2437be, + 0xff740fe6, + 0x631ef493, + 0x08439905, + 0x03094499, + 0x83130731, + 0xee312317, + 0x9905ee14, + 0xf0930782, + 0x9d056304, + 0xf1530801, + 0x32fdf8f4, + 0x00066698, + 0xaa271401, + 0x3a271027, + 0xa1234105, + 0xf3b84403, + 0x24334287, + 0x44f1420b, + 0xff000398, + 0x8176f193, + 0xa9140504, + 0xb902328b, + 0xa9035b8c, + 0x0702308d, + 0x1681a94b, + 0x1880a902, + 0x1283a902, + 0x1482a902, + 0xd14c0b02, + 0x0302208e, + 0x4c030fdc, + 0x2b312b0f, + 0x93445320, + 0x04813ff0, + 0x0315d453, + 0x04450225, + 0x0c650a55, + 0x0d350e85, + 0x023d84b9, + 0x037483d1, + 0x048d4803, + 0x24048924, + 0x31833853, + 0x270fbc03, + 0x274a0011, + 0x8d410710, + 0xb4532603, + 0x3fe64533, + 0xf25301f9, + 0x1d07f85c, + 0xf2532e01, + 0x1703f858, + 0x2001b803, + 0xb7e317e3, + 0x4fe63127, + 0xf2530172, + 0x2401f84c, + 0x340735c6, + 0xe67f3c83, + 0x804c0334, + 0x2107432b, + 0x24332b9b, + 0x308b3207, + 0x2e0b34c6, + 0x0407232b, + 0x3087019b, + 0x13031b07, + 0x12534307, + 0x237f4c83, + 0x0344e611, + 0x342b803c, + 0xb42b4187, + 0x4b07b09b, + 0xe67f4c83, + 0x80bc0344, + 0x319bb42b, + 0xf453320b, + 0x3b0bf7e8, + 0x808af193, + 0x75400104, + 0xc1857e13, + 0xa7fe315e, + 0xfeffff1e, + 0x1d351dbd, + 0xf82dcfe6, + 0x4ea73127, + 0xc5fdcfff, + 0x205e6843, + 0xff0ea7f8, + 0x04d1ffff, + 0x46ce0e4c, + 0xff1ea733, + 0x0ea7ffff, + 0xd5fff99f, + 0xbe0e4c16, + 0x2700351f, + 0x0ef49b40, + 0xffff2ea7, + 0x0e2399ff, + 0x4fbf2ea7, + 0x273138fd, + 0x53240541, + 0x0334c631, + 0x21f31e24, + 0x763ff6f3, + 0x6bf01103, + 0xfaf45e0f, + 0xff19c5be, + 0x1d5ea007, + 0x962127f8, + 0x25202774, + 0xfac15ef2, + 0x003440be, + 0x2fc62127, + 0x6e21c071, + 0x1d3024f9, + 0x4626ff01, + 0x43f14287, + 0xff023000, + 0x21033438, + 0xa7e425d0, + 0xfdcfff3e, + 0x274031c1, + 0xa3410720, + 0x4034c541, + 0x070ef29b, + 0xc5ff8b00, + 0x32c54031, + 0xff4ea760, + 0x41d1ffff, + 0x4ea70e5c, + 0xc5fd4fff, + 0x18066442, + 0xafff0ea7, + 0xa70341fd, + 0xfd9fff2e, + 0x0305310b, + 0x4ce32421, + 0x11242510, + 0x103ca323, + 0xf0be2315, + 0xe15e0033, + 0x1e2103f8, + 0x83b0078a, + 0xbff630bc, + 0xc00702c3, + 0x5e10cc83, + 0xf253f94a, + 0x2401f6d8, + 0x27fe8f5e, + 0x6624bd40, + 0x030cbe06, + 0x27f33101, + 0x8603ab40, + 0x6b412704, + 0xa7f4354f, + 0xffffff0e, + 0x066a04b9, + 0xf9fd4fe6, + 0xff1b16be, + 0xbef9f65e, + 0x5e00af6e, + 0x0ea7f952, + 0x39fff19f, + 0xff1ea704, + 0x1bbdffff, + 0x44f60e64, + 0xb25e4127, + 0x33f9bef9, + 0x5e412700, + 0x21bef9a9, + 0x2127ff18, + 0x20270486, + 0xc85e0207, + 0x75f253f7, + 0x532e01f6, + 0x01f673f2, + 0x031d0720, + 0x5e3027b1, + 0x4b7efe0e, + 0xf83e5ecc, + 0xcfff4ea7, + 0x6843c5fd, + 0xa7f6d75e, + 0xffffff2e, + 0xe6262499, + 0xf8fa4c4f, + 0xf6c6201c, + 0x27fa445e, + 0xff3ea740, + 0x34bdffff, + 0x097e0668, + 0xa7d007c5, + 0xfff24b0e, + 0x00b027be, + 0x27119c27, + 0x270bbc8d, + 0xa007207c, + 0xffff0fe0, + 0x019fffff, + 0x46334a07, + 0xc40bca87, + 0x0dc4c0f1, + 0xdc07ff00, + 0xf23cde23, + 0x1dbbbeff, + 0xc4c3f1ff, + 0x07ff000d, + 0x0f3c831d, + 0x43072307, + 0x45332333, + 0x432b422b, + 0x420b2487, + 0x42f14333, + 0x00067938, + 0x42073907, + 0x10014403, + 0x40051403, + 0xf3a84403, + 0x21c5d171, + 0x93d38158, + 0x05ab2bf1, + 0x915c23c5, + 0xc51e01d4, + 0xd0a16024, + 0x20c51d07, + 0x0ad48980, + 0x832c1c03, + 0x24c50f4c, + 0xc5d33168, + 0xd4517823, + 0x017c24c5, + 0x83d0a1d4, + 0x24070f4c, + 0x36333407, + 0x230b2333, + 0x2333242b, + 0x4e0b4207, + 0x116440d5, + 0x4d033627, + 0x10011144, + 0x40051403, + 0xf3a84403, + 0xffff1ea7, + 0x8010d1ff, + 0x11320718, + 0x073e0b01, + 0xad410341, + 0xc8116c34, + 0x32071641, + 0x11703d03, + 0x20073e0b, + 0x038820c1, + 0x03300524, + 0xa7f4a034, + 0xffffff2e, + 0x065024d1, + 0x60baf093, + 0x23dc0105, + 0xec03d141, + 0x5024d502, + 0xe00bb906, + 0xe10db902, + 0xad3cee02, + 0x9df19301, + 0x14d10560, + 0x4cee049c, + 0xc0270187, + 0x32d8c301, + 0xbb31f820, + 0xe3430700, + 0xf8c30532, + 0x00a5104c, + 0x40273027, + 0x01acc4bd, + 0x01adc3bd, + 0x01a8c3d5, + 0x018cc4b9, + 0x017b4fd6, + 0x0541a3c4, + 0x0edbcec4, + 0x4d07291e, + 0xd4074103, + 0xbdcedf6b, + 0x834d071e, + 0x33340741, + 0x2b443336, + 0x33230734, + 0xf1320b23, + 0x066b1834, + 0xdb41dc00, + 0xf393bd07, + 0xbd056030, + 0x2702e13b, + 0xb8a4fd40, + 0xa7ff000d, + 0xfff24b3e, + 0x48563479, + 0x0ea7d127, + 0xbefff24b, + 0x0700ae80, + 0xff0fe4a0, + 0x65ffffff, + 0x964127fe, + 0x154027d4, + 0xf9ee5ef4, + 0xf2490ea7, + 0x31cdbeff, + 0x1ed12700, + 0x2df80dd6, + 0x011c07f7, + 0x6c1d03f0, + 0xc2b87e01, + 0x07ff765e, + 0x0c0c030c, + 0x5ec3067e, + 0x157eff64, + 0xc9f293c3, + 0x2bb9055f, + 0x2db902e0, + 0xc30102e1, + 0x07ff345e, + 0x10cc83c0, + 0xc4860c07, + 0xf3be0127, + 0x7f5eff25, + 0x893a7ef6, + 0x04abf411, + 0x04864027, + 0x4f6b4127, + 0x7a5ef415, + 0xed04e8fc, + 0x15babef7, + 0xff0ea7ff, + 0x0499feff, + 0xf631270a, + 0x27f7dd4f, + 0xf7d85e30, + 0x225e2103, + 0xff1ea7f8, + 0x1251ffff, + 0x402723d6, + 0x979ef093, + 0x27041d04, + 0x0bf39b30, + 0xa70ef39b, + 0xfd4fff4e, + 0x9d10129d, + 0x42010f12, + 0x270ef39b, + 0x0e149931, + 0x34cb323b, + 0x4fbf2ea7, + 0x273138fd, + 0x53240541, + 0xdc3fe631, + 0x1e2403f8, + 0xffcea7f1, + 0xc199ffff, + 0x9d0ea70e, + 0x85befff9, + 0x41270031, + 0x5e12c49d, + 0x4027f8ac, + 0x27f7e15e, + 0x33430731, + 0x2b343346, + 0x33c40743, + 0x03c40bc3, + 0x066b18cf, + 0xfe665e00, + 0xe61e3027, + 0xf1eb4127, + 0xf7c24ff6, + 0xf4e84327, + 0x2127f1ab, + 0x21c02d66, + 0x3024f947, + 0xd0ff011d, + 0x42873a42, + 0x300043f1, + 0x34d8ff02, + 0xd021032f, + 0xd11ee325, + 0xff6755be, + 0x27f88d5e, + 0x33f19308, + 0x269e0088, + 0x0127002c, + 0xabf24a7e, + 0xe3d411f3, + 0x0400004e, + 0xf3ebd415, + 0x27f73f5e, + 0x03a81e40, + 0x4eb21e21, + 0xeb0ea7fe, + 0x6ebeffff, + 0xc77e002d, + 0xeb0ea7f0, + 0x3fbeffff, + 0xfe0e002d, + 0x4ef2ef5e, + 0x3bcf5bf0, + 0x4efe2bdf, + 0xbe0f07fc, + 0x1eff6889, + 0x9b4027ff, + 0x00070ef4, + 0xf61eff8b, + 0xff1eff1e, + 0x03d1fa4e, + 0xc00701d0, + 0x026134b9, + 0xd207b107, + 0x008e4fe6, + 0x1407e307, + 0xe4a9a027, + 0xb4ca0266, + 0x68e4a943, + 0x3c4bc202, + 0x0264e4a9, + 0xe3fcc3c1, + 0x1f3c0343, + 0x35534303, + 0x0262e2a9, + 0x4123432a, + 0x89fc34c2, + 0x020772c3, + 0x2a8703e3, + 0x2d0b3123, + 0x30073012, + 0xc389232d, + 0x12312372, + 0x4d430743, + 0x03a10324, + 0xb3f1f0e8, + 0x8924a2c8, + 0xd24908d1, + 0x073812ca, + 0x03d36942, + 0xdad02941, + 0x43072543, + 0x2d4403ca, + 0xca4107d4, + 0xd44d3512, + 0xa1c4a123, + 0x49d42912, + 0x27d46dd3, + 0x08d38d41, + 0xfa8ed41d, + 0x4a07a027, + 0xd41d4f6b, + 0xd14dfa8e, + 0x2908d28d, + 0x49d369d4, + 0x08d189d2, + 0xd46dd32d, + 0x4207b61e, + 0xd44da123, + 0x4007c91e, + 0x4107d42d, + 0x1ebc21c2, + 0xa7f84eee, + 0xffffff4e, + 0xd10a0399, + 0x07010844, + 0x6a3fc6b0, + 0x4853a407, + 0x9f6b9407, + 0x0710ac53, + 0x27eb0703, + 0x27c0a780, + 0x58e299d0, + 0x32874207, + 0x340b4433, + 0x13ff2cc0, + 0x038c34f1, + 0x1127ff00, + 0x4ed81d3b, + 0x26040000, + 0xd103c1eb, + 0xf0f0e103, + 0x2eb441d9, + 0xceb43184, + 0x4ea7204c, + 0xc5f7ffff, + 0x48c5444c, + 0x45002748, + 0x8ebc35b8, + 0xdb92cef8, + 0x8c338d07, + 0x1e8aab10, + 0x8e0427d2, + 0x27c027f8, + 0x4ecf1e80, + 0xff3ea7fe, + 0x4027ffff, + 0x153834d5, + 0x153034d5, + 0x153434d5, + 0x03460ea9, + 0x018202b9, + 0x322b3e07, + 0x3e0b2307, + 0x4e2b4307, + 0x07f641c8, + 0x0708330e, + 0x5a94be12, + 0xff4ea700, + 0x40d5ffff, + 0xfe8e13ec, + 0x00000180, + 0x0499f54e, + 0x07f8a3f2, + 0xdf4ff670, + 0x0c709908, + 0x018374b9, + 0xe070f0c5, + 0xc105a242, + 0x78c1c472, + 0xbc74c1b8, + 0x7399f215, + 0xc1f31dfb, + 0xf025c870, + 0x3dfc7199, + 0xcc72c1f1, + 0x7399f235, + 0xc1f35dfd, + 0x48fad475, + 0x480700c9, + 0x870f4c83, + 0x0b443334, + 0xf93cf934, + 0xd1ff0013, + 0x87012c70, + 0xf14a07ac, + 0x0013f03b, + 0x07470bff, + 0xc1204763, + 0x6e23ac49, + 0xe2ffec10, + 0x0701d6b2, + 0x0bd433dc, + 0x0b4d07da, + 0x4043d147, + 0xe0310801, + 0xc201b5c1, + 0x4d070fb0, + 0x43d1470b, + 0x31080144, + 0x01dfc1e0, + 0x41534007, + 0x070fb4c2, + 0xd1470b4d, + 0x08014843, + 0xd7c1e031, + 0xbe1a2701, + 0xc2005a01, + 0x4d070fb0, + 0x43d1470b, + 0x3108014c, + 0x01cdc1e0, + 0xd4d1d70b, + 0x41e80150, + 0xc1e0018e, + 0x7d89017f, + 0x070907f0, + 0x2481be1b, + 0x0b2d0702, + 0x07d20220, + 0x030f072d, + 0xc1a00b04, + 0xa205dc74, + 0x07096399, + 0x0a66991f, + 0x361d310b, + 0x72c1421b, + 0x0b8103bc, + 0x3b82f254, + 0xbc72d1ff, + 0x4673a902, + 0xc5420703, + 0x482b74f2, + 0xf4c1349b, + 0x8272b974, + 0x7948f201, + 0x2b430701, + 0x2942e842, + 0xa7713905, + 0xffffff0e, + 0x1123122b, + 0x010803b9, + 0x4c834807, + 0x0f1c830f, + 0x312bb487, + 0xb40b4433, + 0x230f3c83, + 0xffec10be, + 0x07a139f4, + 0x0709bd99, + 0x33ad8741, + 0xf1133345, + 0x001530a0, + 0xf1140bff, + 0x00011411, + 0x870506ff, + 0xa014ea40, + 0xff4ea705, + 0x40d1ffff, + 0xd8be13ec, + 0xf0c50223, + 0x2c70d168, + 0x014a0701, + 0x47470bb6, + 0xac49c130, + 0x05e063e2, + 0xc433cd07, + 0x4c07ca0b, + 0x43d1470b, + 0x31080140, + 0x05d4d1e0, + 0x070f60c2, + 0xd1470b4c, + 0x08014443, + 0x86d1e031, + 0x5340070b, + 0x0f64c241, + 0x470b4c07, + 0x014843d1, + 0xd1e03108, + 0x1a270b7c, + 0x0058d8be, + 0x070f60c2, + 0xd1470b4c, + 0x08014c43, + 0x70d1e031, + 0xd1c70b0b, + 0xe80150c4, + 0xe0077641, + 0xc10767d1, + 0x090768f1, + 0x02235abe, + 0x07f07c89, + 0x0bd403df, + 0x020c0bda, + 0x050c07c0, + 0x09b499d0, + 0xbb991f07, + 0x1d410b0a, + 0xdc72c14b, + 0x02bc73d1, + 0x8103522b, + 0xc57cf2c5, + 0x500b74f3, + 0x042483fa, + 0x74b9691e, + 0x4ff60130, + 0x9307fe47, + 0x27fe8d5e, + 0xdc9b14dc, + 0xb9fe3a5e, + 0xf6013073, + 0x5e940735, + 0xc1e4fe7a, + 0x73b9fe76, + 0x31e40130, + 0x9de8fe6e, + 0xfe680181, + 0xfd8af453, + 0x5f5e4901, + 0x3074b9fe, + 0x1d4ff601, + 0x5e9307fe, + 0x74b9fe52, + 0x4ff60130, + 0x9307fe25, + 0xb9fe455e, + 0xf6013074, + 0x07fe2f4f, + 0xfe385e93, + 0xc5dc72c1, + 0x73c17cf2, + 0x3474d1d8, + 0xc5130701, + 0xf4c55cf3, + 0xe8152b60, + 0x99035141, + 0xf3c5c073, + 0xc5310330, + 0x34fa78f3, + 0xf0c101fc, + 0x07309b7c, + 0x5cf4c1d3, + 0x14071412, + 0x029e11e8, + 0xbecd0c27, + 0x0702227f, + 0x8870d1c0, + 0x64f0c501, + 0x02460ff6, + 0xad071027, + 0x3c07b027, + 0xf145fd55, + 0xe86cf3c5, + 0xc1026f31, + 0x0ff670f0, + 0xf1c101ee, + 0x9a1ff630, + 0x5cf9c100, + 0x78991127, + 0x279353c1, + 0x270027d0, + 0x99f1a520, + 0x7199c376, + 0xec64e0c2, + 0xd363e001, + 0xc1051b03, + 0x092b7cfc, + 0xc22b1f6b, + 0x005745be, + 0x2b60f2c1, + 0xab21e8c0, + 0x68d9f003, + 0xc1d15302, + 0xdf6b74f3, + 0x02ecd3ea, + 0x537cf8c1, + 0x74f4c182, + 0x02d6d4ea, + 0x018374b9, + 0x021341e0, + 0x020f43e0, + 0x038574b9, + 0x4ff6dc07, + 0xf0c10228, + 0xc50d126c, + 0xf1c16cfd, + 0xc581126c, + 0x74d16cf8, + 0x70d10114, + 0x71d10118, + 0x7dd1011c, + 0x7ed1010c, + 0x41480110, + 0xa160f2c1, + 0xfb23eef3, + 0x70f3c102, + 0x430b4f07, + 0xf4414619, + 0x027141e8, + 0x4c083407, + 0x643c2765, + 0x42234307, + 0x94071307, + 0x1c730307, + 0x7384071f, + 0x2a071f9c, + 0x7abe3b07, + 0x2c270033, + 0xbe302764, + 0x0700340a, + 0x0b443340, + 0x141c2704, + 0x005695be, + 0x022d00e8, + 0xf0c5f151, + 0xc5011240, + 0x729940f1, + 0x34f2c5f2, + 0x04d52ff6, + 0xe6f47499, + 0x9903864f, + 0x7c99f97d, + 0x076d5afa, + 0x07c612dc, + 0x34f2c1d6, + 0x72b92cf6, + 0x74a90182, + 0x42c20346, + 0x74f3c13b, + 0x31237439, + 0x2b0f3c83, + 0x87412342, + 0x0b343323, + 0x0f4c8323, + 0x13f923f9, + 0x2407ff00, + 0x43332533, + 0x44f1420b, + 0xff000114, + 0x34f53387, + 0xff001530, + 0x02bc73d1, + 0xc174f3c5, + 0x302774f4, + 0x870f4c83, + 0x0b443324, + 0xf023f524, + 0xd1ff0013, + 0x0702bc74, + 0x101e2312, + 0x4fd6ffec, + 0xdc74c163, + 0x43333447, + 0x23f5340b, + 0xff0013f4, + 0x018874d1, + 0xf4c14566, + 0xf424f56c, + 0x9dff0013, + 0x1d9d0a1d, + 0x70f2c108, + 0x7609129d, + 0xff4ea725, + 0x4dd5ffff, + 0x0d071884, + 0xf58ef883, + 0x275cf0c1, + 0x1b03531a, + 0xbe033305, + 0xc10055b2, + 0xf2c17cf1, + 0x7cf3c178, + 0xd107129b, + 0x31f2102b, + 0x1307fded, + 0xc1fde85e, + 0x20f56cf0, + 0xff0013f4, + 0xf9c1b21e, + 0x30f2c15c, + 0x2ff69353, + 0x312700c7, + 0xa5c17899, + 0xc37699f3, + 0x0027d027, + 0xe4c27199, + 0xc1fe1864, + 0x31535cf3, + 0x070d53d2, + 0x0b417343, + 0x12115343, + 0xec115354, + 0x27fe0411, + 0xfdff5e11, + 0x01e8f045, + 0x400701dc, + 0xf3650cec, + 0x07140700, + 0x1f1c7304, + 0x2d07b027, + 0x02be3b07, + 0x30270032, + 0xbe642c27, + 0xd1003292, + 0x07018c74, + 0xe63007ad, + 0x5500854f, + 0x6cf3c5fd, + 0xfd9531ec, + 0xf4c54127, + 0xfd8d5e6c, + 0x6a5ec127, + 0xec79c1fd, + 0xc1e81c07, + 0x090701bd, + 0x021fd6be, + 0x1807d007, + 0xccbe0907, + 0x74b9021f, + 0x80070385, + 0xfddc4fe6, + 0x70d11c07, + 0xc1e80190, + 0xb4be019e, + 0xd007021f, + 0xc1fdc95e, + 0x82537cf8, + 0xe4fdab5e, + 0x27fa5e02, + 0x70f1c511, + 0x11fa565e, + 0x7cf4c1f0, + 0x042b1207, + 0x0054b1be, + 0x00c700e8, + 0xc1c17899, + 0xfdc178f1, + 0x9b200730, + 0x5ef1a508, + 0x0433fd3b, + 0x1c27030b, + 0x5490be14, + 0xe8fd5500, + 0x12009f00, + 0x070d070d, + 0xf90cf230, + 0x5e3c07fc, + 0x7099fcf4, + 0x7cf2c1c0, + 0x0330f0c5, + 0x07209b01, + 0x78f0c5d2, + 0x27fcb45e, + 0x40f0c500, + 0x27fdd95e, + 0xa7102701, + 0x5e90a780, + 0x4c27fda2, + 0xff0b5e64, + 0xfd2a63e4, + 0x5ec88c27, + 0x63e4fd24, + 0x0907fd14, + 0x1807052b, + 0x005435be, + 0x0b7cfcc1, + 0xfd025ec0, + 0xc5dc74c1, + 0x48077cf4, + 0xc174f1c1, + 0x410374f0, + 0x04fa182b, + 0x0fe006fe, + 0x80000000, + 0x480706f6, + 0x870f4c83, + 0x0b443324, + 0xf923f924, + 0x03ff0013, + 0xf9355681, + 0x0013fa22, + 0x00f21dff, + 0xfc105ef1, + 0x645e0027, + 0x5e0027ff, + 0x63e4ff38, + 0x1efafd05, + 0x1eee00a7, + 0xf2c1009f, + 0x6b0d2b60, + 0x07242b1e, + 0x1f3c7332, + 0x00312dbe, + 0x01e8d007, + 0x74b9fce5, + 0x4ff60130, + 0x1a270094, + 0x0053b1be, + 0xf1c14d07, + 0x5a402b6c, + 0x070d0b14, + 0x9601fa41, + 0x6cf4c500, + 0xfcbf84f2, + 0x5e6cf8c5, + 0xf8c1fcb9, + 0xf082537c, + 0x53fc6bd9, + 0x5edf6bd1, + 0xf3c1fc5d, + 0xfa31535c, + 0xf2fe1635, + 0x53fe1e95, + 0xfe195e11, + 0x10270127, + 0x07fe2f5e, + 0xe2425340, + 0x07fa5c14, + 0x33df0731, + 0x07d40338, + 0x07da0b10, + 0x5383be03, + 0xbed10100, + 0x89021e27, + 0xd45ef07c, + 0x5e1127fa, + 0x1127fe42, + 0xe2fe615e, + 0xc1ff61d0, + 0x2ce86cf2, + 0x27ff59c9, + 0xf3c5c83c, + 0xff505e6c, + 0x1fbe1527, + 0x4d070053, + 0x2b6cf2c1, + 0x7624fa40, + 0x070d0bff, + 0x6e20f242, + 0x5e4007ff, + 0xcc27ff69, + 0x5ecd9b14, + 0x74b9fa30, + 0x4ff60130, + 0x9307fa28, + 0x99fa6e5e, + 0x4ff6f574, + 0xf4c1fc77, + 0xe74ff670, + 0xc1f03905, + 0xf2c160f1, + 0xeef07578, + 0xd1023b12, + 0xe8012074, + 0xc1021f42, + 0x19f030f1, + 0xf3190218, + 0x322bf271, + 0x01ed31e8, + 0x018474b9, + 0x4f4b3173, + 0x230b242b, + 0x65333c27, + 0x99f385f2, + 0xf4b5c374, + 0x063c44e0, + 0xc664f1c1, + 0x8c74d115, + 0xbc41e001, + 0xa44fe601, + 0xf97d9901, + 0x13e0f1b1, + 0x74b9035b, + 0x46460385, + 0x038674b9, + 0xf2614586, + 0x32faf371, + 0xf385061d, + 0x7c99f061, + 0x2fd0f2fa, + 0x81fd9503, + 0x1cd2f2f2, + 0xb12d0703, + 0x0332e0f3, + 0x70f1c103, + 0xc14412c0, + 0x0f0770f3, + 0xf1c14387, + 0x11400b60, + 0xe611e840, + 0xe23ff602, + 0x11f32102, + 0xda34e2f4, + 0x07f47102, + 0x91320703, + 0x072312f2, + 0xe471c132, + 0xc5e872c1, + 0xf1c158f1, + 0x54f2c56c, + 0x026801e2, + 0x024243fa, + 0xf291f395, + 0x01fa26ee, + 0x2c2cf291, + 0x70f3c119, + 0x021331e0, + 0x018574b9, + 0xf1c145e6, + 0x39154670, + 0x12f291f4, + 0xc1f49542, + 0x39c664f3, + 0x3634f4c1, + 0x70f0c149, + 0x74d10896, + 0x47d6018c, + 0xc16cf1c1, + 0x12ee40f2, + 0xf51100d0, + 0xd240f4c1, + 0x46077f54, + 0x4103f091, + 0xf4954012, + 0x24c0f2b1, + 0xd2f19141, + 0x6d071bd1, + 0x99fb3c5e, + 0xf3b5c373, + 0x99f97d99, + 0xf695fa7c, + 0xd07e9f1e, + 0xf71f5ef6, + 0x6cf2f691, + 0x6c07fb21, + 0x27fb1c5e, + 0x32070d2c, + 0x04b9f3e8, + 0x412b0108, + 0xf00f4c83, + 0x1ef84f49, + 0x0474d1ee, + 0xba41c401, + 0xc170f4c1, + 0x470b70f3, + 0x010844b9, + 0x31c4f495, + 0x91f339a9, + 0x234307f0, + 0x0904da43, + 0x40073303, + 0x43070312, + 0x921ef495, + 0x3b072a07, + 0x19070807, + 0x002e08be, + 0x27642c27, + 0x2e98be30, + 0x7550f200, + 0xf2f191ff, + 0x95ff6f61, + 0xff6a5ef6, + 0x013073b9, + 0x940735f6, + 0xe4f8925e, + 0xb9f88ed1, + 0xe4013073, + 0xe8f88631, + 0x8001819d, + 0x809d27f8, + 0xf8795e01, + 0xf3914607, + 0x43f24223, + 0xf495ff2a, + 0x11ff255e, + 0x40f2c1f4, + 0xfe5742f2, + 0x27f97d99, + 0xf385333c, + 0x99fe4f5e, + 0xfd65f97d, + 0xb9fe475e, + 0x71018472, + 0x0b2f4bf0, + 0x53430732, + 0x430b1f4c, + 0x022b4173, + 0x1c27040b, + 0x85f06533, + 0xfe095ef1, + 0x018474b9, + 0x4f4bf271, + 0x3c27242b, + 0x85f26533, + 0xfdf55ef3, + 0x012871d1, + 0x038111e8, + 0x012470d1, + 0x00508dbe, + 0x0312f371, + 0x74d10307, + 0x42e80120, + 0xf2190370, + 0x018474b9, + 0x4f4b3207, + 0x042b302b, + 0xfffb3fcc, + 0x0b39ffff, + 0x53140743, + 0x140b1f1c, + 0x100b1173, + 0xf1654207, + 0x41124323, + 0xf461f465, + 0x4012f071, + 0x3fccf065, + 0xfffffff7, + 0x331c2725, + 0xf381f185, + 0x43f2f461, + 0xf365fd8f, + 0x07fd8a5e, + 0x23f06542, + 0x65401243, + 0x71f361f4, + 0x653412f4, + 0x852303f4, + 0x342cc8f2, + 0x332c27da, + 0xd31ef285, + 0x0770f3c1, + 0x0b43870f, + 0x7cf3c140, + 0x351b4211, + 0x30ec320b, + 0x1607fdf4, + 0xf1951123, + 0xfdead1f2, + 0xe55efd95, + 0x3074b9fd, + 0xe941e401, + 0x23f471fd, + 0x07d41241, + 0xf2f0914d, + 0x95fddb40, + 0xfdd65ef4, + 0xf0c11007, + 0x80f3c554, + 0xbe84f4c5, + 0xc1021a9f, + 0xf3c16cf2, + 0x84f4c180, + 0xce3802c2, + 0x41033534, + 0xf1c1df1e, + 0x3f10c26c, + 0x42f2f291, + 0x1007fd96, + 0xc558f0c1, + 0xf4c580f3, + 0x1a71be84, + 0x6cf1c102, + 0xc180f3c1, + 0x10c284f4, + 0xcef29115, + 0x41231024, + 0xf391dd1e, + 0xfd6c43f2, + 0x675ef495, + 0xf2f495fd, + 0x5efd6143, + 0xf091fd5c, + 0xf4954012, + 0x13f2f191, + 0x4d5efd52, + 0x5e4607fd, + 0xf4c1fd29, + 0xfa4ff670, + 0x30f0c1fc, + 0xfcf90fe6, + 0x81fd395e, + 0xe42cf2f2, + 0x5e2c07fc, + 0xf161fcdf, + 0x1cf2f195, + 0xfc95fccf, + 0xc1fcca5e, + 0x21e070f2, + 0xf2c102da, + 0x9b21e860, + 0x5cf0c1fc, + 0x50f20353, + 0xf3c10241, + 0x073ff670, + 0x30f4c101, + 0x190b48d4, + 0x03f061f4, + 0x65401241, + 0x81f061f4, + 0x610132f1, + 0xc1f385f3, + 0x01e470f0, + 0xf3c1fc6a, + 0x5539d030, + 0xc160f2c1, + 0x32077cf0, + 0x271f3c73, + 0x2ba7be10, + 0x07200700, + 0x3870d131, + 0x3c71d101, + 0x38f0c501, + 0xfa3cf1c5, + 0xc1024231, + 0x13ee3cf1, + 0x42070237, + 0x4c531307, + 0x3302071d, + 0x3314ab13, + 0x4b020b03, + 0x272a2713, + 0x2c08be30, + 0x3cf2c100, + 0x020c12fa, + 0x020112ee, + 0x011871d1, + 0x011c72d1, + 0xc544f1c5, + 0x010748f2, + 0x12073027, + 0xe3be2a27, + 0xf3c1002b, + 0x50f1c57c, + 0x47d471c1, + 0x1b230b23, + 0x07120b15, + 0x1f4c7341, + 0x34072107, + 0xd14cf0c5, + 0xd1011071, + 0xd1010c70, + 0x0b011474, + 0xc8314b20, + 0xf4c12641, + 0xc1485660, + 0x41fa48f4, + 0x14ee00ea, + 0xf4c100df, + 0xc343fa48, + 0xb834ee00, + 0x48f4c100, + 0x008414fa, + 0xc17a14ce, + 0xf0c130f4, + 0xe2415374, + 0x71fb9540, + 0x23f171f0, + 0x65110301, + 0x5ef185f0, + 0xf1c1fb86, + 0x0611e470, + 0x61f471ff, + 0x124323f2, + 0x71f46542, + 0x03f381f4, + 0x8534124a, + 0x60f4c1f4, + 0xee78f0c1, + 0xc1fee840, + 0x112374f1, + 0x4c834107, + 0x3334870f, + 0x74f1c544, + 0x32f9340b, + 0xff0013f9, + 0xf1c51103, + 0xc62ff674, + 0x81f419fe, + 0x124a03f2, + 0x61f48524, + 0xf2f481f3, + 0x65fec534, + 0xfec05ef4, + 0xc244f3c1, + 0xf2c18230, + 0x48f3c144, + 0x316b202b, + 0xf3c11307, + 0x5a020750, + 0x6c31ee13, + 0x4cf2c1ff, + 0xff6520e2, + 0xf471f371, + 0x41033123, + 0xf485f365, + 0xc1ff565e, + 0x24e244f4, + 0xf061ff45, + 0x1012f171, + 0xf261f165, + 0x23f2f381, + 0xf365ff3f, + 0xc1ff3a5e, + 0x04e244f4, + 0xf471ff1e, + 0x27234c0c, + 0xf061234c, + 0xf4654012, + 0xf281f161, + 0xff1d12f2, + 0x185ef265, + 0x3074b9ff, + 0x3f4fe601, + 0xf4735efa, + 0x013074b9, + 0xfa344fe6, + 0xb9f47d5e, + 0xf6013074, + 0x5ef48c4f, + 0x1127fa26, + 0x71f9095e, + 0xfc8c5ef0, + 0x018474b9, + 0x042b4f4b, + 0x0c27f065, + 0x5ef08533, + 0xf4c1fa57, + 0xcb41e070, + 0x27f23900, + 0xf275330c, + 0x018473b9, + 0xf3653f4b, + 0x0bc37499, + 0x99f4b532, + 0xf365f97d, + 0x4d5ef085, + 0xe005f2fa, + 0x60f2c1fd, + 0xd278f3c1, + 0xf4c11b23, + 0x1946f670, + 0x12f081f4, + 0x61f48504, + 0xf2f281f1, + 0x65fdc212, + 0xfdbd5ef2, + 0xc470f1c1, + 0xf281ee11, + 0x2312f371, + 0xf471f385, + 0x4323f061, + 0x65dd04d2, + 0xc1d91ef4, + 0x40e238f4, + 0xf071fdfc, + 0xf0650123, + 0xe2fdf35e, + 0x71fdc902, + 0x234c0cf4, + 0x61234c27, + 0x654212f2, + 0x81f361f4, + 0xd934f2f4, + 0x5ef465fd, + 0xf419fdd4, + 0x4323f061, + 0xf9be40f2, + 0xb95ef465, + 0x65f471f9, + 0x5ef485f4, + 0xf3c1f9e0, + 0xb531e860, + 0x7cf4c1fd, + 0x536cf0c1, + 0x1e40ee42, + 0x61f419fd, + 0x1641f2f1, + 0x5ef465fd, + 0xf0c1fd11, + 0x07012374, + 0x0f4c8340, + 0x44333487, + 0x0b74f0c5, + 0xf932f934, + 0x03ff0013, + 0x74f0c501, + 0xf3392f66, + 0x13074027, + 0xf3751323, + 0x4112f165, + 0x7499f465, + 0xc0f4b5c3, + 0x44c03a42, + 0x330c2737, + 0xf4c1f085, + 0x104cf074, + 0x74b9f959, + 0x4fe6036a, + 0x4307f951, + 0x4103f081, + 0xf4850412, + 0xf9432ff6, + 0x43e2f419, + 0xf181f93d, + 0x14f24103, + 0xf485f935, + 0x07f9305e, + 0x85130313, + 0x19c81ef1, + 0xcaf339f4, + 0x4027a534, + 0xfe4ea11e, + 0x7fff3ea7, + 0xe33411fd, + 0x1508004d, + 0xff3ea734, + 0x3201fd4f, + 0xf49b4027, + 0x87e1270e, + 0x402ef522, + 0xa7ff02b0, + 0xfdcfff1e, + 0x30074427, + 0x234814c5, + 0x4232d038, + 0x3ea72127, + 0xbdfeffff, + 0x271d3232, + 0x0ef49b40, + 0xbe601ec5, + 0x2701f664, + 0xff3ea720, + 0x32bdfeff, + 0x40271d32, + 0xa70ef49b, + 0xfdcfff3e, + 0xc54834c5, + 0x2ea76834, + 0x11fd7fff, + 0x004da324, + 0x8e241508, + 0x1e2227fe, + 0xd1fd4ebe, + 0x0701d013, + 0x0c3499d0, + 0x4fc60207, + 0x8b41e06a, + 0x10349900, + 0x27684fd6, + 0x4b43be16, + 0x8302e800, + 0x6305cc00, + 0x40873007, + 0x342b3533, + 0x4387300b, + 0x4447432b, + 0x07d32c27, + 0x330d073d, + 0x7f0c833b, + 0x3c53029b, + 0x03349b12, + 0x3c03800c, + 0x53085380, + 0x800c1038, + 0x837f0c27, + 0xdf837f0c, + 0x01e00000, + 0x0dab4307, + 0x40003d10, + 0x3fff4d27, + 0x3fff4d83, + 0x04ab4733, + 0x4c27fd8e, + 0xc12c2792, + 0x4c27ba1e, + 0xd32c27ae, + 0x0427b21e, + 0x40873007, + 0x342b3533, + 0x4387300b, + 0x4447432b, + 0x4c279b1e, + 0xda2c27ba, + 0x4d27961e, + 0x8d1e015c, + 0x01d014d1, + 0x42991007, + 0xb843d10c, + 0x292c7602, + 0x07330932, + 0x33010741, + 0x7f0c834b, + 0x4c53029b, + 0x03439b12, + 0x4c03800c, + 0x53085380, + 0x800c1048, + 0x837f0c27, + 0x1f837f0c, + 0x01e00000, + 0x4d1001ab, + 0x4d274000, + 0x4d833fff, + 0x47333fff, + 0xfe0b04ab, + 0x991621c0, + 0x45461044, + 0x890a3289, + 0xb41e0833, + 0x890e3289, + 0xac1e0c33, + 0x33493269, + 0x14d1a61e, + 0x100701d0, + 0xd10c4299, + 0x7602b843, + 0x0932292c, + 0x07410733, + 0x834b3301, + 0x029b7f0c, + 0x9b124c53, + 0x800c0343, + 0x53804c03, + 0x10485308, + 0x0c27800c, + 0x7f0c837f, + 0x00001f83, + 0x01ab01e0, + 0x40004d10, + 0x3fff4d27, + 0x3fff4d83, + 0x04ab4733, + 0x21c0fe0b, + 0x10449916, + 0x32894546, + 0x0833890a, + 0x3289b41e, + 0x0c33890e, + 0x3269ac1e, + 0xa61e3349, + 0xc007fc4e, + 0xf0931227, + 0xbe007a90, + 0x1100160b, + 0x9df093c1, + 0x00be007a, + 0xc1210016, + 0x7aa4f093, + 0x15f5be00, + 0x93c10100, + 0x007aabf0, + 0x0015eabe, + 0xf093c231, + 0x27007ab2, + 0x15ddbe10, + 0x93c24100, + 0x007aa5f0, + 0xd0be1127, + 0xc2510015, + 0x7a98f093, + 0xbe122700, + 0x610015c3, + 0x8bf093c2, + 0x1327007a, + 0x0015b6be, + 0xf093c271, + 0x27007a7e, + 0x15a9be14, + 0x93c28100, + 0x007a71f0, + 0x9cbe1527, + 0xc2910015, + 0x7a64f093, + 0xbe162700, + 0xa100158f, + 0x57f093c2, + 0x1727007a, + 0x001582be, + 0xf093c2b1, + 0x27007a4a, + 0x1575be18, + 0x30c2c100, + 0x7a3cf093, + 0xbe192700, + 0xc1001567, + 0xf09334c2, + 0x27007a2e, + 0x1559be1a, + 0x38c2c100, + 0x7a20f093, + 0xbe1b2700, + 0xc100154b, + 0xf0933cc2, + 0x27007a12, + 0x3cbe0c1c, + 0xc2c10015, + 0x03f09340, + 0x1c27007a, + 0x152dbe0d, + 0x44c2c100, + 0x79f4f093, + 0x0e1c2700, + 0x00151ebe, + 0xf04eff1e, + 0xdf3bcf5b, + 0xfc4efe2b, + 0x7dbe0f07, + 0xfc0effec, + 0xff0bf00e, + 0xcf5bf04e, + 0xfe2bdf3b, + 0x0f07fc4e, + 0xfffedfbe, + 0x0000ff1e, + 0x0b21fb4e, + 0xd00704a1, + 0x995a4bce, + 0x4b0710d3, + 0xdc51435b, + 0xd3194183, + 0xde394487, + 0x1c074d0b, + 0x35332b07, + 0x40612c8b, + 0x122b1103, + 0x18003ef5, + 0x200bff02, + 0x180431f5, + 0x4027ff02, + 0xe8003e23, + 0x033435fd, + 0xfde8003e, + 0x181032f5, + 0x31f5ff02, + 0xff021814, + 0xe7f03e23, + 0x0b3435fd, + 0x25d4a1b1, + 0xa8b4cedb, + 0xd49d4227, + 0x4efb8e12, + 0x23e407fe, + 0x83e30b46, + 0x3c330f4c, + 0x1d023d0e, + 0x003f8301, + 0x333ff000, + 0x33202713, + 0x43ab104c, + 0x140012f5, + 0x14f5ff02, + 0xff021404, + 0x40270e2d, + 0x8e0ef49b, + 0x1eff1efe, + 0xff3ea7ff, + 0x3499feff, + 0x07438309, + 0x87343334, + 0xf9342b44, + 0x00004f32, + 0x4d34f9ff, + 0xc2ff0000, + 0xf4931d42, + 0xc104ccb0, + 0x3ea78442, + 0xc1ffffff, + 0x24d1fc31, + 0x002702bc, + 0x0127140e, + 0x0027fe0b, + 0xf94efe0b, + 0xc107a007, + 0x4714ac23, + 0x091a0b11, + 0x99d00713, + 0x3e662409, + 0x40070c07, + 0x3b0c4c23, + 0x23d20149, + 0x0be48731, + 0x0b4387e2, + 0x01130d4e, + 0x320cc24b, + 0x493b4427, + 0x30072047, + 0x22231e07, + 0xe007d407, + 0x142b3123, + 0xd0132a0b, + 0x3ccaec2b, + 0x27012341, + 0x0b403b41, + 0x0d31274b, + 0x23140523, + 0x581d0b22, + 0x8e0b07fe, + 0x034c07f9, + 0x27244741, + 0x0c071cec, + 0xec2b2a0b, + 0x1a1d4cd4, + 0x01031207, + 0xfef02203, + 0x07b02707, + 0x09f98e0b, + 0x1e31e613, + 0x1ee1278a, + 0x1ee127bd, + 0xe3f54ee4, + 0x58f0c5f6, + 0x27240299, + 0x3b4f0731, + 0x03e00732, + 0xf2c5404c, + 0x4cf3c554, + 0x235cf1c5, + 0x2f0714ec, + 0x2768f4c5, + 0x4027103c, + 0x24032405, + 0xf3c1f3b8, + 0x2320274c, + 0xc54a2731, + 0xf2c540fe, + 0x0d6c2748, + 0xc560f3c5, + 0xf2c164f4, + 0x1a238940, + 0xc5182789, + 0x72f050f3, + 0xf4c100b1, + 0xaa34ee4c, + 0x54f2c100, + 0x4c234607, + 0xc1423b0d, + 0x048758f2, + 0x030b2301, + 0x01007fe6, + 0xc150f4c1, + 0x24e260f2, + 0x46070103, + 0x2354f2c1, + 0x423b0c4c, + 0x2350f2c1, + 0x87420b61, + 0x0b812754, + 0x3b302753, + 0x03a20786, + 0xc5100761, + 0x902744f3, + 0x0201c707, + 0x42073f07, + 0x4c83465b, + 0x0bd4870f, + 0x0734013d, + 0xe6e48be8, + 0x0700854f, + 0xd63207b4, + 0x073407e4, + 0x0b4307b2, + 0x774bce48, + 0x14031205, + 0x91030403, + 0x0748fcf0, + 0x4634013f, + 0x27140545, + 0x05140340, + 0x68f2c134, + 0x32ce3403, + 0x5cf3c1ed, + 0xc16936ce, + 0xf3c144f4, + 0x8d471b40, + 0x3a8d1834, + 0x40f4c11a, + 0x0364f2c1, + 0xc5212342, + 0xf2c540f4, + 0xf6610364, + 0xc1ff2d2f, + 0xf6c348f0, + 0xf4c1f58e, + 0x7fa4ea60, + 0x074907ff, + 0x2b410337, + 0x5874ca39, + 0x02017ee6, + 0x12050403, + 0xf3a81403, + 0x32059a1e, + 0xf2c18f1e, + 0x054f0744, + 0x03d40b53, + 0x03402722, + 0xc5a10354, + 0xd40544f2, + 0xc1ff775e, + 0x412750f2, + 0xf4c52a2e, + 0x278d1e48, + 0x48f4c540, + 0xfac1861e, + 0x07302750, + 0x44f3c510, + 0xc1ff5e5e, + 0x902750fa, + 0xf9c51007, + 0x279f1e44, + 0xa7a81e31, + 0xffffff4e, + 0x010041b9, + 0x26fc40c1, + 0x83300719, + 0x33330f3c, + 0x007e34f9, + 0x4756ff00, + 0x40272107, + 0x34fd0103, + 0xff00007c, + 0x3c833007, + 0x2333330f, + 0x0ff2f011, + 0xffff4ea7, + 0x0041bdff, + 0xfc40c501, + 0x34f9fe0b, + 0xff00007e, + 0xa7d44fc6, + 0xffffff4e, + 0x010041bd, + 0x0bfc40c5, + 0x07fc4efe, + 0x27a13ec0, + 0x270c0e41, + 0x8e040740, + 0x07fa4efc, + 0x14dc23d0, + 0xcd0bc247, + 0x9914dc03, + 0xc00924de, + 0x4e3b4127, + 0xb30bb007, + 0xa3074223, + 0xb432d301, + 0xfa8e0127, + 0x3b0c2c23, + 0x87020b2e, + 0x87030b00, + 0x0949be2a, + 0x27412700, + 0x9dcb0d00, + 0xfa8e31d4, + 0x0399f74e, + 0x3b412724, + 0x07f06343, + 0x070b0184, + 0x07f10570, + 0x878333d1, + 0x27c00794, + 0x07c249a0, + 0x871b070d, + 0xbea10322, + 0x0b000913, + 0x03d80bb9, + 0x10acc4c2, + 0x247499e9, + 0xd4077c01, + 0x749d4103, + 0x03f40124, + 0x077405d6, + 0x071f0707, + 0x0531272d, + 0xff6b7efc, + 0x73b10596, + 0x4d3b4127, + 0x73b5340b, + 0xf78ef043, + 0xb007fb4e, + 0xf0931327, + 0xbe0075bc, + 0x110010c3, + 0xc9f093b1, + 0xb8be0075, + 0xb1210010, + 0x75d0f093, + 0x10adbe00, + 0x93b10100, + 0x0075d7f0, + 0x0010a2be, + 0xf093b231, + 0x270075de, + 0x1095be10, + 0x03db0700, + 0x31c127d4, + 0x931c07d2, + 0x0075c9f0, + 0x80bec103, + 0xd4030010, + 0xec0fccc4, + 0xfb0e0b07, + 0x00fc265e, + 0x00001000, + 0x08000000, + 0x0000000f, + 0x07c1f54e, + 0x3c0dc138, + 0x07240a99, + 0x27c107b0, + 0x27502780, + 0xddfc0c6c, + 0x00a41000, + 0x4d034d07, + 0xc4ea2000, + 0x3c27009a, + 0x2b06071b, + 0x27010336, + 0x3b4d0722, + 0x0b405b20, + 0x5b41dc2d, + 0x2755f3f0, + 0x4a3b0f4c, + 0xf4139487, + 0x134e01b0, + 0x4201aff4, + 0x2b0b2247, + 0xb3012149, + 0x490b4187, + 0x3707430b, + 0x11033d0b, + 0x3a074305, + 0x3703214d, + 0x030ade0b, + 0x18025127, + 0x41278107, + 0x42234a3b, + 0x5936841a, + 0xa194dcca, + 0x3cb3c1b4, + 0x2b3cbcc5, + 0xa54c0b43, + 0xc2f58eb4, + 0x2007982c, + 0x070c2c23, + 0x274a3b42, + 0x3b9487e1, + 0x07aa1ee0, + 0x7e0b0713, + 0x1007fbae, + 0x7d7e0b07, + 0x24ba99fe, + 0xff5cdcea, + 0xf453c61e, + 0x4e01ff34, + 0x20270607, + 0x851e9027, + 0x02c1fa4e, + 0x4003c13c, + 0x04a1d107, + 0x0fffdd03, + 0x0fffdde3, + 0xb007322b, + 0x00c1d42b, + 0xd634d638, + 0x07fa8ed7, + 0x503dcaad, + 0xc20bca07, + 0x10be1c07, + 0x0b070013, + 0xfd7e1c07, + 0xc6da2bfe, + 0xffdf03d0, + 0x0703ffff, + 0x00cf83cd, + 0x03fc0000, + 0x000001df, + 0x071c07fc, + 0x2720270d, + 0x18be163c, + 0x3ea70013, + 0xc5fff9f3, + 0x40273830, + 0x0b071d07, + 0xc5403cc5, + 0xfa0e3c34, + 0x07febf5e, + 0x0bca07a3, + 0xbe1c07c2, + 0x070012bf, + 0x7e1c070b, + 0xda2bfeac, + 0xfa4eae1e, + 0x07310499, + 0x07a207d0, + 0x56c107b3, + 0x0cb2c04f, + 0x6e7e0a07, + 0x5d0fc6fd, + 0x475ab3c0, + 0x144c234c, + 0x0b24d199, + 0x3b31274d, + 0x23420931, + 0x2932c231, + 0x41273c07, + 0xd1a1433b, + 0x31233407, + 0x13eb130b, + 0x0d07140b, + 0x89ff2b7e, + 0x0d0732d4, + 0x1c074103, + 0x0e32d48d, + 0xfaa85efa, + 0x47034107, + 0x071ac4c2, + 0x1e31033c, + 0xfb2f7ece, + 0x402706d6, + 0xc431d49d, + 0xa81e9fb2, + 0xfa8e0027, + 0x38033107, + 0x0d07b51e, + 0x7b7e1c07, + 0x9d4027fa, + 0x0fc631d4, + 0x4efa8e81, + 0x07d207fa, + 0xb6b107a0, + 0xa7fa8e27, + 0xfff9f3ce, + 0x2724c099, + 0x03222710, + 0x6d5ebe07, + 0x07100703, + 0xfd227e0c, + 0x1a073d07, + 0x0ea72b07, + 0x7efff9f3, + 0x0fd6fcd1, + 0x9b4027d7, + 0xfa8e0ef4, + 0x04a1fb4e, + 0xd007f063, + 0x14ceb107, + 0x1001992c, + 0xc15bcb07, + 0xcc87c183, + 0xc461cd0b, + 0x0f072127, + 0xa03ef405, + 0xa110d199, + 0x3b4127d2, + 0x27242b41, + 0xa5c36530, + 0xd9b2ced2, + 0xfb8ef043, + 0xcf5bf04e, + 0xfe2bdf3b, + 0x0f07fc4e, + 0xfff9a4be, + 0xf00efc0e, + 0xf04eff0b, + 0xdf3bcf5b, + 0xfc4efe2b, + 0x0dbe0f07, + 0xff1efffd, + 0xff1eff1e, + 0x0499fe4e, + 0xc0e1071e, + 0x8718ff4c, + 0x0b443334, + 0x8c34f134, + 0xa3ff0003, + 0x0400004e, + 0x038c34f5, + 0x0499ff00, + 0x8303311f, + 0x14070f4c, + 0x43331533, + 0x0b0f3c83, + 0x1444f141, + 0x87ff0001, + 0x0b343323, + 0xf024f523, + 0xa7ff0013, + 0xfddfff1e, + 0x08004d27, + 0x020814d5, + 0x10d50027, + 0x3ea70208, + 0x11fd4fff, + 0x873e0732, + 0x0b36334e, + 0xe442f543, + 0x27ff000d, + 0xb8e4fd42, + 0xa7ff000d, + 0xffffff2e, + 0x24bd4127, + 0x23990668, + 0x0ef09b0f, + 0x33874127, + 0xb04034f5, + 0xfe8eff02, + 0x4ea73027, + 0xc5fddfff, + 0x01b9b443, + 0x04a90485, + 0x02b90162, + 0x410b0165, + 0x323b3127, + 0x430b4123, + 0x2423427b, + 0x4123423b, + 0x0b9a048d, + 0xb9f94efe, + 0x07013a04, + 0xe03027d0, + 0x2304014a, + 0xa8d39d46, + 0x30274f6b, + 0x31274214, + 0x4f6b4307, + 0x0162dba9, + 0xb9a9d49d, + 0xb90164da, + 0x070165dc, + 0x5344861b, + 0x85d4b911, + 0x23312704, + 0x3b230741, + 0x03e4072c, + 0x60d0a941, + 0x07b40b01, + 0x23e10b42, + 0x3b4123b1, + 0x0bb20b3a, + 0x079e0741, + 0x234c5b10, + 0x5bbc7b11, + 0x2331239c, + 0x44d2a9c4, + 0x3b300b01, + 0x3ed0a9bc, + 0x5bc10701, + 0x03ca5b3a, + 0xa4230f2c, + 0x15530a3b, + 0xb123e553, + 0xda992473, + 0x9cd38da8, + 0x8d9ed48d, + 0xd98da2dc, + 0xa6d18da0, + 0x8da4de8d, + 0xdb8d98d0, + 0xe4d2d59a, + 0x89a54604, + 0x44479ad4, + 0xa79ad48d, + 0xfd4fff2e, + 0x23c14027, + 0xbd0d0774, + 0x0304f9d4, + 0xe801300d, + 0x27032530, + 0xc1a02730, + 0x4efc3c04, + 0x59ffff00, + 0xff2ea703, + 0x24c1fd4f, + 0xf740e874, + 0xa44c2702, + 0x0102d4ad, + 0x3ea735d6, + 0xc1fd4fff, + 0x40e87434, + 0x0199031b, + 0xb04c2735, + 0x413b1423, + 0x0104d4ad, + 0xd4b91403, + 0x3ea70485, + 0xbde7ffff, + 0x3304d1d4, + 0x4f83164c, + 0x07000000, + 0x800c4fa3, + 0x3405f084, + 0x03f4dbd1, + 0xbfe6b483, + 0xcd27008e, + 0x02993011, + 0x3d04993e, + 0x43832383, + 0x45332733, + 0x4fffeea7, + 0xc124abfd, + 0x2aab74e3, + 0x30e82cab, + 0x24a3022e, + 0xffffeea7, + 0x50e2c5e7, + 0x99470299, + 0x21834604, + 0xd3b94183, + 0x2c330138, + 0x0f4c330e, + 0xc02724ab, + 0x025b32e0, + 0x99540499, + 0x4c835503, + 0x332cab1f, + 0x1f3c8344, + 0x24ab1323, + 0x13833933, + 0x1c3323ab, + 0x1521ab10, + 0xa7b736e2, + 0x55e46540, + 0x65d4b9e4, + 0x1e45e001, + 0xe946e002, + 0x1244c001, + 0x4027ff1e, + 0xe455e465, + 0xcd27e81e, + 0x735e1011, + 0x61f493ff, + 0xd4d50429, + 0xd4a904f4, + 0x4d8301a8, + 0x46a68000, + 0x01c4d4d1, + 0xd4d1413c, + 0x4c3801a0, + 0xbd4027c0, + 0x2704f9d4, + 0xff2ea740, + 0x24c5fddf, + 0xd1d4b9c4, + 0x62d0a904, + 0x60dea901, + 0x03040b01, + 0x04730f0c, + 0xd3b94027, + 0xec03013c, + 0xd0d4bd0f, + 0x34d0ad04, + 0xe6e47305, + 0xd101723f, + 0xf8016cd4, + 0xffff004e, + 0xdbb9018b, + 0x2d27048a, + 0xd3d101e0, + 0x3d8303f4, + 0x35060100, + 0xe37f2c03, + 0x4e077f2c, + 0xd4d54433, + 0x3fe60524, + 0xe7030158, + 0xc7e3ce07, + 0x48234c07, + 0x43333207, + 0x3333429b, + 0xd1d12633, + 0xd3d501c4, + 0xd2d50528, + 0xd4d5052c, + 0xe7230530, + 0x014812f8, + 0xc4330703, + 0x3d2707e3, + 0x2da71000, + 0xdcd50fff, + 0xd4d10524, + 0x31230524, + 0x300b049b, + 0xb4334b87, + 0x4b0b328b, + 0x0520d3d5, + 0xdfff0ea7, + 0x9843f1fd, + 0x27ff0003, + 0x9802d520, + 0xe803c501, + 0x02d50e15, + 0xd4b901b0, + 0x4b26013c, + 0x27fc02c5, + 0x0004d541, + 0xf4d2d101, + 0x6dd4b903, + 0xb9120701, + 0x83016ed3, + 0x83163311, + 0x811ca343, + 0x33834a33, + 0x3c3314ab, + 0x1813ab0c, + 0xa301002d, + 0x0400001e, + 0xa7b401c5, + 0xfdefff3e, + 0x34d54327, + 0x030702b8, + 0xdcb804c1, + 0x1427fb48, + 0x02b801d5, + 0x02bc01d5, + 0x03d53027, + 0x2ea70670, + 0x05fdeb47, + 0x004f2723, + 0x15050400, + 0x0ef39b24, + 0x02c001d5, + 0x067403d5, + 0x04d54327, + 0x3ea702c4, + 0xc1fdefff, + 0x48dcc434, + 0xd54427fb, + 0x2702c434, + 0x3f3ea710, + 0x3105fdeb, + 0x00004f27, + 0x34150604, + 0xa70ef19b, + 0xfde50f2e, + 0x051c4c27, + 0x27211524, + 0x0000000f, + 0xa72035a0, + 0xfde4ff3e, + 0x34054103, + 0x30353115, + 0xe4c1f98e, + 0x004ef874, + 0xfdcc0100, + 0x15fdcb5e, + 0xb023d52e, + 0xff615e01, + 0x296ef493, + 0xf4d4d504, + 0xfe2c5e04, + 0xd2d52e9b, + 0x3c270528, + 0x7f2ca780, + 0xb9fed95e, + 0x27048adb, + 0x5e01802d, + 0x3d27fe76, + 0x2da71000, + 0xc35e0fff, + 0xd7f493fe, + 0xd4d50428, + 0xfb5e04f4, + 0x5ec127fd, + 0x24c1fda4, + 0x004ef874, + 0xfd030100, + 0xadb44c27, + 0x5e0102d4, + 0x24c1fd00, + 0x004ef874, + 0xfcd50100, + 0x27410499, + 0x27431830, + 0xc3430731, + 0x6b340741, + 0x5ea3873f, + 0x3127fcc3, + 0xc1fbfe5e, + 0x4ef87434, + 0xdf010000, + 0x350199fc, + 0x23c04c27, + 0x03413b14, + 0x04d4ad14, + 0xfcdc5e01, + 0xadd44c27, + 0xb60102d4, + 0xff3ea735, + 0x34c1fd4f, + 0x1440c874, + 0x27350199, + 0x1423e04c, + 0x1403413b, + 0x0104d4ad, + 0xc1fcb55e, + 0x4ed87434, + 0xe5010000, + 0x27350199, + 0x1423f04c, + 0x1403413b, + 0x0104d4ad, + 0x4efc995e, + 0x27b007fb, + 0xa5f09314, + 0x94be006e, + 0xb1110008, + 0x6eb2f093, + 0x0889be00, + 0x93b12100, + 0x006eb9f0, + 0x00087ebe, + 0xf093b101, + 0xbe006ec0, + 0x31000873, + 0xc7f093b2, + 0x1027006e, + 0x000866be, + 0xd403db07, + 0xd231c127, + 0xf0931c07, + 0x03006eb2, + 0x0851bec1, + 0xc4d40300, + 0x07ec0fcc, + 0x5efb0e0b, + 0xf04efa6e, + 0xdf3bcf5b, + 0xfc4efe2b, + 0x5dbe0f07, + 0xfc0efffa, + 0xff0bf00e, + 0xcf5bf04e, + 0xfe2bdf3b, + 0x0f07fc4e, + 0xffff7ebe, + 0x2103ff1e, + 0x0319181e, + 0x01031419, + 0x34ce1103, + 0x2301230d, + 0x19001911, + 0x0b042b14, + 0x27f230fe, + 0x4efe0b00, + 0xab4107fe, + 0xd8300740, + 0x151e0f43, + 0x24231e01, + 0x14033e05, + 0x071e3403, + 0x42534207, + 0xf4584103, + 0x14192586, + 0x341d1103, + 0xf2a83103, + 0xfd4efe8e, + 0x03dce007, + 0x2624d029, + 0x3f6b3107, + 0x48334307, + 0x320743ab, + 0x3423e407, + 0xec333253, + 0x03e4ab10, + 0x05400731, + 0x0324234e, + 0x07f3b844, + 0x272103e4, + 0x1d031e40, + 0x0b3e0731, + 0xa8410334, + 0x00fd8ef2, + 0x04110321, + 0x04014342, + 0x411d430b, + 0x41030421, + 0xfe0b0425, + 0x00000030, + 0xf2e3f54e, + 0x5f079307, + 0xb0273f07, + 0x3a037027, + 0x82074027, + 0x5c036027, + 0x95fb850c, + 0x05f3a5f7, + 0x25f115f0, + 0x01c85ef4, + 0x1c40b7b6, + 0x3e0f0725, + 0x01ba5eb8, + 0x40276807, + 0x61237027, + 0xf485b127, + 0xa95ef795, + 0x301c2301, + 0x4f6b4107, + 0xd4301c03, + 0x7536184a, + 0x27301c24, + 0x47f38531, + 0x0b733347, + 0x301c2374, + 0x855e710b, + 0x6c1ce001, + 0x1cd40180, + 0x1ce0206d, + 0x54010663, + 0x1ce0641c, + 0xe4015a25, + 0x01632d1c, + 0x1cc0261e, + 0x1ce42964, + 0x1e015869, + 0x731ce022, + 0x1c3400f6, + 0x701ce474, + 0x131e0149, + 0x0f751cc0, + 0x3e781ce4, + 0x27081e01, + 0x5ef49541, + 0x9001013c, + 0xc4641c00, + 0xcc0a691c, + 0x00130b00, + 0x071eb127, + 0x2b751cc4, + 0xd007b027, + 0x0d07a027, + 0x58be1a27, + 0x00f9003a, + 0x000199bc, + 0x4a0b4507, + 0x1a27401d, + 0x4abe0d07, + 0xd007003a, + 0x07e6a103, + 0xa027dd1e, + 0x4c834007, + 0xf935070f, + 0x0199c844, + 0x1d3a0b00, + 0x03045334, + 0x270176a1, + 0x91c707b0, + 0x2bca2bf3, + 0x813a76cb, + 0x6647a6f4, + 0x270f07b7, + 0xc57e2d1c, + 0x1eb027fe, + 0x96f3810e, + 0x071d0734, + 0xfeb67e0f, + 0xdc27041e, + 0x07c12320, + 0xbdf3534c, + 0x014103fe, + 0xe241cc31, + 0x0f07b546, + 0x7e2d1c27, + 0xda07fe98, + 0xd50bd123, + 0xd139061e, + 0xa1fe8b7e, + 0x07d123f4, + 0xf3d4ce0f, + 0x061edc07, + 0x23fe7b7e, + 0x270f07d1, + 0xd1cc201c, + 0x01591ef4, + 0x03c90791, + 0x7e0f07c4, + 0x9c07fe64, + 0x9d01611e, + 0xb02774d6, + 0x0d070b1e, + 0x000089be, + 0xb02bb707, + 0x34e6f391, + 0x457e171e, + 0x07b123fe, + 0x0741034b, + 0x201c270f, + 0x1ef041cc, + 0xfe327e04, + 0x0f07d419, + 0xd1031407, + 0xdb0742b6, + 0x217e061e, + 0x07d123fe, + 0x201c270f, + 0x03f4d1cc, + 0x07141e94, + 0xfe0e7e0f, + 0x61190d1e, + 0x057e6103, + 0xc20f07fe, + 0xb027f568, + 0x81198103, + 0xfe361ff6, + 0x10270f07, + 0x21fdef7e, + 0x23f2c3f0, + 0xa3f58e01, + 0x15f305f0, + 0x63fe4ef4, + 0x033f07f0, + 0x7ef30538, + 0xf043fdec, + 0xf083fe0e, + 0x3007fe0b, + 0x01030419, + 0x032b4396, + 0xfb4efe0b, + 0xeea7f063, + 0x05fd4fff, + 0x07c007f2, + 0x01b307d1, + 0x123f9be4, + 0x44334103, + 0xab38e2c1, + 0x1023ce34, + 0xffe30ea7, + 0x09cbbeff, + 0xe8101e00, + 0xa7061ef3, + 0xffffe32e, + 0x36272401, + 0xf1294276, + 0x1303d409, + 0x12732407, + 0x03fc4d10, + 0x0107ff1e, + 0xc4090103, + 0x322b3407, + 0x03fc4d10, + 0x310cff1e, + 0x03fc3d03, + 0x87ec30da, + 0x104c0342, + 0x4d0bf301, + 0x21034305, + 0x03fc2d04, + 0x01072027, + 0x01033b07, + 0x3401111e, + 0x14052103, + 0x2d103403, + 0x2d2303fc, + 0x128703fc, + 0x0b101c03, + 0x0df0301d, + 0xe30ea7d2, + 0x0401ffff, + 0x2bbe44c6, + 0x40270009, + 0x270ef49b, + 0xff4ea731, + 0xf043fd4f, + 0xfb8e43a5, + 0xf005f063, + 0x20073107, + 0xe0001f27, + 0x0f271007, + 0x1007d000, + 0x2f5ef043, + 0x05f063ff, + 0x073107f0, + 0x001f2720, + 0x271007c0, + 0x07b0000f, + 0x5ef04310, + 0x0409ff16, + 0xf40df063, + 0x30070449, + 0xf201f42d, + 0x0f273803, + 0x10079000, + 0xa0001f27, + 0xf0431007, + 0x4efef55e, + 0x07a007fa, + 0xbeb10701, + 0x07fffede, + 0x41fc9330, + 0x3503045c, + 0x0c072307, + 0x07da4d27, + 0x24231b07, + 0x050c0c03, + 0x15ca25c4, + 0xfc15bec3, + 0x3e0c07ff, + 0x29ff1eae, + 0x10142903, + 0x1e03fc3d, + 0xfc4d10ff, + 0x07ff1e03, + 0x0c042b03, + 0xfc0d0300, + 0x27fe0b03, + 0x0790004f, + 0x6b442910, + 0x1034070f, + 0x2303fc4d, + 0x2703fc3d, + 0x07b0004f, + 0x93442910, + 0x0586cff2, + 0x3407230d, + 0x03fc4d10, + 0x03fc3d23, + 0xd0004f27, + 0x44291007, + 0x4d10234d, + 0x4d2303fc, + 0x248d03fc, + 0x270ba608, + 0x07a0004f, + 0x07442910, + 0xfc4d1034, + 0xfc3d2303, + 0x004f2703, + 0x291007c0, + 0x07232d44, + 0xfc4d1034, + 0xfc3d2303, + 0x004f2703, + 0x291007e0, + 0x10236d44, + 0x2303fc4d, + 0x8d03fc4d, + 0xfe0b0a24, + 0xf493f84e, + 0x09058668, + 0x07422943, + 0x0c322b90, + 0xfc3d0330, + 0x2734d603, + 0x87f88e00, + 0x124de942, + 0x07100790, + 0x07d303a3, + 0x23c207bd, + 0x03b273a1, + 0xe9d323c1, + 0x07901048, + 0x0dbad210, + 0xf1930827, + 0x7e006a94, + 0xba07feeb, + 0x9d159805, + 0x27c5dc50, + 0xc9f19308, + 0xd87e006a, + 0x07b806fe, + 0x07080309, + 0xfccd103b, + 0xfccd2303, + 0xf14c8703, + 0x07901044, + 0x05c10310, + 0x38040304, + 0xfccd10f3, + 0xfccd2303, + 0xe9f39303, + 0x3c2d0585, + 0xa0003f27, + 0x01271007, + 0xf88e3c2d, + 0xf493f74e, + 0x490585d4, + 0x07426943, + 0x07322b90, + 0x03300c71, + 0xd603fc3d, + 0x8e002734, + 0xe94287f7, + 0x07b0124c, + 0x03a30710, + 0x078c07c3, + 0x73a123b2, + 0x23b10382, + 0x104de9c3, + 0xd21007b0, + 0x08270d8a, + 0x69fef193, + 0xfe557e00, + 0x9c2d8a07, + 0x94299d0d, + 0x0bb9dd24, + 0x74484cc4, + 0xdd24141e, + 0x4cc40bba, + 0x0a1e6a28, + 0x0bbbdd00, + 0x0bbcddc4, + 0x5094295f, + 0x0827f94c, + 0x6a2df193, + 0xfe217e00, + 0x37079029, + 0x0123070b, + 0xe37f3ce3, + 0x34197f0c, + 0xc2803c03, + 0x87c6f930, + 0x38071707, + 0x03fcbd10, + 0x03fcbd23, + 0x44f14b87, + 0x1007b010, + 0x1405b103, + 0xf3381403, + 0x03fcbd10, + 0x03fcbd23, + 0x851ef393, + 0x273b6d05, + 0x07c0003f, + 0x2d012710, + 0x27f78e3b, + 0xeef19306, + 0xc87e0069, + 0xa7971efd, + 0xfd4fff2e, + 0x3f9b2401, + 0x33410312, + 0x3822c144, + 0x002734ab, + 0x0127320e, + 0xf0e3fe0b, + 0xf315f205, + 0xfa4ef425, + 0xffff3ea7, + 0x8c34a9ff, + 0x07f06315, + 0xe6a107d0, + 0xfa00ad4f, + 0xd100a940, + 0xe6158834, + 0x3e00a14f, + 0x9b07e6bb, + 0x4ea7122f, + 0x01fd4fff, + 0xe71ea743, + 0x3433ffff, + 0x43d61401, + 0x32ab38a3, + 0x0a1e1305, + 0xffe70ea7, + 0x063fbeff, + 0x00cf2700, + 0xc1101000, + 0x4ea744cb, + 0xd1ffffff, + 0xa7158840, + 0xfd4fff4e, + 0x3b074401, + 0x030b3733, + 0x1d304c03, + 0x124f9b04, + 0x9b48ddf9, + 0x4c030001, + 0x07043d30, + 0x204c273f, + 0x047d0d5d, + 0x03183c03, + 0x272a0704, + 0xf3057b1c, + 0xfff9d7be, + 0x07a6d007, + 0x0748c4c1, + 0xc541033b, + 0xc4c148c4, + 0x10310348, + 0x270fff3d, + 0x44c3c530, + 0xa744c4c1, + 0xffffe70e, + 0x0005a9be, + 0xd027031e, + 0xf0430d07, + 0xf0c3fa0e, + 0xfa4efe0b, + 0xc3073401, + 0xa207b107, + 0xffff4fc4, + 0x0727ffff, + 0x012d2710, + 0x27022706, + 0xbe01a43d, + 0x07fee2ca, + 0x1000ccd0, + 0x01060d27, + 0xfee2bdbe, + 0x5cf2f493, + 0x05400504, + 0xc0c101cd, + 0xffffff1f, + 0x2b071dff, + 0x05273a07, + 0xfee2a1be, + 0x271000cc, + 0xbe01060d, + 0x93fee296, + 0x045ccbf4, + 0xfa8e4005, + 0xb6befe4e, + 0x2f270007, + 0x1007f000, + 0x04e33d27, + 0x4307051e, + 0x2401f4e8, + 0x0ef842c4, + 0x07bd9efe, + 0x27fb4e00, + 0x0efb9bb0, + 0xf000cf27, + 0x31271007, + 0x4027c305, + 0xa70ef49b, + 0xfd4fff4e, + 0xc13e43a5, + 0xcb05c031, + 0xfb4efb8e, + 0xfc9bc027, + 0x00bf270e, + 0x271007f0, + 0x27b30531, + 0x0ef49b40, + 0x4fff4ea7, + 0x3e43a5fd, + 0x8ebc059c, + 0xa7fe4efb, + 0xffffe70e, + 0x0004c3be, + 0x4f273027, + 0x1007f000, + 0xfe8e4305, + 0x307efe4e, + 0x9b07e6fe, + 0x4ea7122f, + 0x01fd4fff, + 0xe71ea743, + 0x3433ffff, + 0x43d61401, + 0x32ab38a3, + 0xfe8e1305, + 0xffe70ea7, + 0x9efe0eff, + 0x230004b1, + 0x15f105f1, + 0x35f325f2, + 0xa7fb4ef4, + 0xd07fff4e, + 0xf0634491, + 0x4cf8b007, + 0xab008b10, + 0xfde57efd, + 0x2f9b07e6, + 0xff4ea712, + 0x4301fd4f, + 0xffe71ea7, + 0x013433ff, + 0xa343d614, + 0x0532ab38, + 0xa70a1e13, + 0xffffe70e, + 0x000468be, + 0x4fff4ea7, + 0x274401fd, + 0x07f000cf, + 0x304c0310, + 0x9d203c27, + 0xc39d0cc4, + 0x124f9b0d, + 0x030fc39d, + 0x3f07304c, + 0x07143c03, + 0xf01d272b, + 0x0ec49d03, + 0xf0100f27, + 0xf3051007, + 0xfff80fbe, + 0xc4154127, + 0xf00c0f27, + 0x1fbe1007, + 0x0103fffa, + 0xff7ec025, + 0xe70ea7fe, + 0xebbeffff, + 0xfdeb0003, + 0xfb0ef043, + 0xfe0bf103, + 0x4f27f84e, + 0x10100000, + 0x48c14a01, + 0x4449c140, + 0x2a484cc1, + 0x1edc07ca, + 0x23dc0705, + 0xffbea7d1, + 0xb4d1ffff, + 0xda2b1588, + 0xf0934556, + 0x7e00673a, + 0xb1d1ff23, + 0xf0931588, + 0x7e006754, + 0x8fc4ff17, + 0x11223356, + 0xff9dd457, + 0xde26520f, + 0x3c072907, + 0xf0931807, + 0x0700675a, + 0x7e9b074a, + 0xca07fef7, + 0x1f1ebd07, + 0x0032aabe, + 0x158894d1, + 0x27332007, + 0x2419240b, + 0x1c074586, + 0x6766f093, + 0xfed57e00, + 0xb123c103, + 0x1d270c07, + 0xbfc40fff, + 0xffffffff, + 0x27da0bd4, + 0x1000004f, + 0x8e4d0510, + 0xff4ea7f8, + 0x44d1ffff, + 0x47c61588, + 0x00004f27, + 0x41011010, + 0x42014403, + 0x43014403, + 0x44014403, + 0x672cf093, + 0xfe915e00, + 0xf54efe0b, + 0xf5634207, + 0xa2074013, + 0x80076107, + 0x91075247, + 0xf4c57027, + 0x09351e50, + 0xbed103b3, + 0x0bfff903, + 0x07b203c0, + 0x501c270c, + 0x6726f293, + 0xcead0e00, + 0x4027e6d9, + 0x1707c41d, + 0x671cf093, + 0x7e2f0700, + 0xf4c1fe4b, + 0x0b7a0b50, + 0xc2850b94, + 0xb8070967, + 0xcf07d027, + 0xf543ce1e, + 0xf54ef58e, + 0xf5236207, + 0x92077107, + 0x60135007, + 0x8027a107, + 0xb319301e, + 0xacbed103, + 0xc00bfff8, + 0x0c07b103, + 0x93501c27, + 0x0066ddf2, + 0xdace9d0e, + 0x074027e6, + 0x93c41d18, + 0x0066c5f0, + 0xf47e2f07, + 0x0b890bfd, + 0x0b78c2a6, + 0xb50bb807, + 0xcf07d027, + 0xf503d11e, + 0xf94ef58e, + 0xd107b007, + 0x9307a207, + 0xd47efcab, + 0x9b07e6fb, + 0x4ea7122f, + 0x01fd4fff, + 0xe71ea743, + 0x3433ffff, + 0x43d61401, + 0x32ab38a3, + 0x0a1e1305, + 0xffe70ea7, + 0x0257beff, + 0x004f2700, + 0x271007f0, + 0x03431532, + 0x254d453a, + 0x144a9d43, + 0x3515499d, + 0xfcff7e4b, + 0x0ea7d007, + 0xbeffffe7, + 0xeb00020e, + 0x07d5c6fc, + 0x020d272b, + 0xbe1d0702, + 0x07fedf4e, + 0x4ef98e0d, + 0x07c007fb, + 0x7efdabb1, + 0x07e6fb67, + 0xa7122f9b, + 0xfd4fff4e, + 0x1ea74301, + 0x33ffffe7, + 0xd6140134, + 0xab38a343, + 0x1e130532, + 0xe70ea70a, + 0xeabeffff, + 0x3f270001, + 0x1007f000, + 0x34154327, + 0x3c354827, + 0x3b453425, + 0x07fc987e, + 0xe70ea7c0, + 0xa7beffff, + 0xfdeb0001, + 0xfb8e0c07, + 0xd007fc4e, + 0xfcab0d66, + 0xe6fb0e7e, + 0x122f9b07, + 0x4fff4ea7, + 0xa74301fd, + 0xffffe71e, + 0x14013433, + 0x38a343d6, + 0x130532ab, + 0x0ea70a1e, + 0xbeffffe7, + 0x27000191, + 0x07f0004f, + 0x15342710, + 0x35432543, + 0xfc687e4d, + 0xffe70ea7, + 0x0154beff, + 0x8efceb00, + 0x23fc4efc, + 0x07d107f1, + 0x9bf193c0, + 0x0f070065, + 0xbe102c27, + 0xf6fff4b7, + 0x28fd93d4, + 0x0d07006c, + 0xfff751be, + 0x5606f393, + 0x27200704, + 0x0707da4d, + 0x140c03e3, + 0x30153405, + 0x21033c25, + 0x070cec03, + 0x0143273f, + 0x05340331, + 0xa8e403e1, + 0x093459f4, + 0x931d0733, + 0x0455f2f0, + 0xe30de45d, + 0xfff46ebe, + 0x55caf093, + 0xf804be04, + 0x4eff1eff, + 0xff4ea7fc, + 0x44b9ffff, + 0xd0071564, + 0x45e6c107, + 0x6538f093, + 0x071d0700, + 0xfc3dbe2c, + 0x070d07ff, + 0xfec9be1c, + 0x270596ff, + 0x3ff19302, + 0x665e0065, + 0x4efc8eff, + 0xff8ea7f8, + 0x84b9ffff, + 0x90071564, + 0xa207b107, + 0x4666d307, + 0x652ff093, + 0x07190700, + 0x073a072b, + 0xfc01be4d, + 0x14cd07ff, + 0x07c227d2, + 0x071b0709, + 0xbe3c072a, + 0xb9fffe12, + 0x07156484, + 0x9345a6d0, + 0x006537f0, + 0xdcbe1d07, + 0xd576fffb, + 0xf1930227, + 0x1e00653f, + 0x3b412712, + 0x8b41234c, + 0x2745864d, + 0x3af19301, + 0xfa5e0065, + 0x50a796fe, + 0x000000df, + 0x0b4d0720, + 0x014fd04b, + 0x23700000, + 0xf1930127, + 0x1e006542, + 0x00df50e2, + 0x07700000, + 0x504b0b4d, + 0x0000014f, + 0x930127f0, + 0x006558f1, + 0x0d07c91e, + 0x3c27f88e, + 0xff595e0c, + 0x04054027, + 0x4027fe0b, + 0x050ef49b, + 0x01fe0b04, + 0x123f9b02, + 0x4fff4ea7, + 0x274401fd, + 0xa3443300, + 0x0e43ab48, + 0x0b012742, + 0x07fa4efe, + 0x123f9bc0, + 0x4fff4ea7, + 0x074d01fd, + 0xa3d433a4, + 0x1ed3abd8, + 0x01f4e803, + 0x564627cb, + 0x2fb8beb3, + 0x27c40100, + 0x05449630, + 0x0ef39bcd, + 0x0138abc5, + 0xe4d4cec4, + 0x3027fa8e, + 0xffff4ea7, + 0x3843d5fe, + 0x9bfe0b01, + 0x2407124f, + 0x25333487, + 0x21f1232b, + 0xff010014, + 0x03103f9b, + 0x87310b41, + 0xf5453314, + 0x01001423, + 0xa7412bff, + 0xfd4fff3e, + 0x44f13311, + 0xff010000, + 0x342b1207, + 0x002023f5, + 0x1e23ff01, + 0x23fefff4, + 0xfeff682e, + 0x13014727, + 0x23051403, + 0xf4a82403, + 0x4ea7fe0b, + 0xa7fd4fff, + 0xfeffff3e, + 0x44914181, + 0x012832d1, + 0x013030d1, + 0x43331333, + 0x041b211b, + 0x013034d5, + 0x012432d5, + 0x012831d5, + 0x012c30d5, + 0xfe0bfe0b, + 0xf493fe0b, + 0x75045668, + 0x07fe0b40, + 0x87453340, + 0xf5402b00, + 0x01000c41, + 0x2841f5ff, + 0x0b00058d, + 0x334007fe, + 0x2b008745, + 0x1041f540, + 0xf5ff0100, + 0x058d2c41, + 0x87fe0b00, + 0x2b053340, + 0x680e2304, + 0xfe0bfeff, + 0xcc27fc4e, + 0xa72c078c, + 0xfefff31e, + 0x54f2f093, + 0xf239be04, + 0xa72c07ff, + 0xfeff671e, + 0x556ef093, + 0xf229be04, + 0xf1f093ff, + 0x1ea70455, + 0x27fefedb, + 0xfc0e102c, + 0xfff2169e, + 0xf493fe4e, + 0x190454c0, + 0xa24ff644, + 0xb9f49300, + 0x24070454, + 0x078b2c03, + 0x7f2ce334, + 0x197f3ce3, + 0x803c0334, + 0x93f932c2, + 0x04549ff3, + 0x4c272027, + 0x03320523, + 0x93f4c834, + 0x04551bf4, + 0x2c032407, + 0xe334078b, + 0x3ce37f2c, + 0x0334197f, + 0x32c2803c, + 0x233c27f9, + 0x54fef293, + 0x07102704, + 0x23210543, + 0xb8240331, + 0x79f493f4, + 0x43350455, + 0x43154305, + 0x20274325, + 0x557af393, + 0x054a2704, + 0xc8340332, + 0x273027f4, + 0xf5402725, + 0x058db834, + 0x2834f500, + 0xf500058d, + 0x058d2c34, + 0xb434f500, + 0x0300058d, + 0xf2001c3c, + 0xf4933127, + 0x1d04541c, + 0xa5f19343, + 0x2c270454, + 0x670ea78c, + 0x58befeff, + 0xf193fff1, + 0x27045408, + 0x0ea78c2c, + 0xbefefff3, + 0x93fff147, + 0x04550ff1, + 0xa7102c27, + 0xfefedb0e, + 0xfff136be, + 0x6f5efe0e, + 0xff4ea7fe, + 0x4311fd4f, + 0xffff4ea7, + 0x3443d5fe, + 0xa7fe0b01, + 0xfeffff3e, + 0x4fff4ea7, + 0xd14111fd, + 0xd1013834, + 0x0b013432, + 0xd5422b41, + 0x0b013834, + 0x124f9bfe, + 0x35333407, + 0x342b4487, + 0x4fff4ea7, + 0xf14211fd, + 0x01002434, + 0xf5422bff, + 0x01002434, + 0x9bfe0bff, + 0x2407124f, + 0x44872533, + 0x4ea7242b, + 0x11fd4fff, + 0x2423f144, + 0x0bff0100, + 0x2424f543, + 0x0bff0100, + 0x95f293fe, + 0x3ea70454, + 0x27feff67, + 0x03310147, + 0x03210534, + 0xa7f4a824, + 0xfeffff4e, + 0x013844d1, + 0x5476f393, + 0x27349504, + 0x0332014a, + 0x03020534, + 0x0bf4a804, + 0xff3ea7fe, + 0x309dffff, + 0xbd41270d, + 0x99066a34, + 0x40270f33, + 0x270ef49b, + 0xf5338741, + 0x02b04034, + 0x4eff1eff, + 0xbec007fc, + 0x39002cb4, + 0x07c419c3, + 0x1d43ab13, + 0x3d4027c4, + 0x2705e6c4, + 0x0ef49b40, + 0x4fff3ea7, + 0x3834c5fd, + 0xf49b4027, + 0xff4ea70e, + 0x4399ffff, + 0xbf2ea70e, + 0x318bfd4f, + 0x41273138, + 0x31532405, + 0x32d62403, + 0xfc4efc8e, + 0x97bec007, + 0x1ea7002c, + 0x39fd4fff, + 0x271301c2, + 0xab433b41, + 0x27c43d42, + 0x0ef49b40, + 0x8e3814c5, + 0x07fc4efc, + 0x2c74bec0, + 0xff1ea700, + 0xc319fd4f, + 0x41271201, + 0x34eb423b, + 0x4027c31d, + 0xc50ef49b, + 0xfc8e3814, + 0xc007fb4e, + 0x25beb107, + 0xc219002c, + 0x2bab4027, + 0xc43dc21d, + 0x402705e6, + 0xa70ef49b, + 0xfd4fff3e, + 0x273834c5, + 0x0ef49b40, + 0xffff4ea7, + 0x0e4399ff, + 0x4fbf1ea7, + 0x38328bfd, + 0x05412731, + 0x03315314, + 0x8e32d614, + 0x0d0499fb, + 0x070c0399, + 0x0744c623, + 0x99041e34, + 0x43070e03, + 0x400b4123, + 0x99044499, + 0x45960e00, + 0x3028321b, + 0xfe0b0307, + 0xfe0b030b, + 0xb027fb4e, + 0x0b9dc007, + 0x0ec19d0c, + 0x0b9d2107, + 0x0310270d, + 0xef80be04, + 0x3dcb1dff, + 0x03cb5dcb, + 0x8ecb3dc2, + 0x07fc4efb, + 0xfbcc27d0, + 0xb3be0d07, + 0x004c007b, + 0xf4e84c07, + 0xfc8ef31e, + 0xd007fc4e, + 0x07fbcc27, + 0x7b9cbe0d, + 0x07004c00, + 0x1ef4e84c, + 0x6bfc8ef3, + 0x9315361f, + 0x006102f0, + 0x4087fe0b, + 0xabd440f1, + 0x04860001, + 0xf0931434, + 0x0b006673, + 0x0b4187fe, + 0x104c2340, + 0xfe0b4001, + 0x0087f74e, + 0xabf00af1, + 0x0bf10001, + 0x0001abd4, + 0xf093c107, + 0x070060d7, + 0x2772071a, + 0xf6c5be90, + 0x1e8027ff, + 0x03cd011c, + 0x66c40391, + 0x93b201d6, + 0x0060caf0, + 0x3d071a07, + 0xfff6aabe, + 0xb4038d0b, + 0x07e397ce, + 0x9328071a, + 0x0060c1f0, + 0x949ef70e, + 0xfa4efff6, + 0x23082a99, + 0x87d207f1, + 0xf1ac8631, + 0x01abd433, + 0x34348600, + 0xf8f393a4, + 0x0a1e0065, + 0x430b4a87, + 0x01104c23, + 0x09de9943, + 0xdb69dc49, + 0xfe054187, + 0xfb25fc15, + 0xabf042f1, + 0xdd010001, + 0x4a071007, + 0x608ff093, + 0xbefd3500, + 0x1efff647, + 0x09249922, + 0xde492c69, + 0xabf032f1, + 0x10070001, + 0x60e4f393, + 0xaaf09300, + 0xfe050060, + 0x24befc15, + 0xf103fff6, + 0xfc4efa8e, + 0xffffcea7, + 0x63c101f7, + 0xd3f093f0, + 0x0cbe0060, + 0xc121fff6, + 0x60e6f093, + 0xf601be00, + 0x48c1c1ff, + 0x60f8f093, + 0xf5f5be00, + 0x44c1c1ff, + 0x610af093, + 0xf5e9be00, + 0xffcea7ff, + 0xc181efff, + 0x6118f093, + 0xf5d9be00, + 0x93c1a1ff, + 0x00612bf0, + 0xfff5cebe, + 0xffffcea7, + 0x93c121eb, + 0x006139f0, + 0xfff5bebe, + 0x9364c1c1, + 0x00614bf0, + 0xfff5b2be, + 0xffffcea7, + 0x93c101e7, + 0x006159f0, + 0xfff5a2be, + 0x9350c1c1, + 0x00616bf0, + 0xfff596be, + 0xf093c121, + 0xbe00617e, + 0xc1fff58b, + 0xf09354c1, + 0xbe006190, + 0xc1fff57f, + 0xf09358c1, + 0xbe0061a2, + 0xc1fff573, + 0xf0935cc1, + 0xbe0061b4, + 0xa7fff567, + 0xfbffffce, + 0x0628c1d1, + 0x61c0f093, + 0xf555be00, + 0x30c1d1ff, + 0xdaf09301, + 0x48be0061, + 0xc1d1fff5, + 0xf0930208, + 0xbe0061f4, + 0xd1fff53b, + 0x930420c1, + 0x00620ef0, + 0xfff52ebe, + 0x0468c1d1, + 0x6228f093, + 0xf521be00, + 0xff4ea7ff, + 0x41c1f3ff, + 0x3ef09334, + 0x10be0062, + 0xcea7fff5, + 0x31fddfff, + 0x4cf093c1, + 0x00be0062, + 0xc1c1fff5, + 0x4cc2c148, + 0xc16cc3c1, + 0xcec170c4, + 0x52f09340, + 0xfe050062, + 0xfff4e6be, + 0xffffcea7, + 0x48c1d1fe, + 0x48c2d101, + 0x71f09301, + 0x22870062, + 0xabc42f03, + 0xc8be0001, + 0xc1b9fff4, + 0xf0930140, + 0xbe00627d, + 0x99fff4bb, + 0xf09309c1, + 0xbe00628d, + 0xb9fff4af, + 0x931d35c1, + 0x00629cf0, + 0xfff4a2be, + 0x0144c1a9, + 0x62abf093, + 0xf495be00, + 0x42c1a9ff, + 0xc6f09301, + 0x88be0062, + 0x4ea7fff4, + 0xd1fdefff, + 0x930f0041, + 0x0062d7f0, + 0xfff476be, + 0x0003d5be, + 0x4fff4ea7, + 0x114c01fd, + 0x931c0742, + 0x0062ddf0, + 0xfff45ebe, + 0x10270c07, + 0xe3172ea7, + 0xfdc07efe, + 0x11270c07, + 0xe30b2ea7, + 0xfdb47efe, + 0x13270c07, + 0xe2f32ea7, + 0xfda87efe, + 0x14270c07, + 0xe2e72ea7, + 0xfd9c7efe, + 0x15270c07, + 0xe2db2ea7, + 0xfd907efe, + 0xffffcea7, + 0x40c1d1ff, + 0x48c2d115, + 0x44c3d115, + 0x54c4d115, + 0xb1f09315, + 0x04be0062, + 0xc2d1fff4, + 0xc1d11550, + 0xf093154c, + 0x430062c2, + 0x9efc0ef0, + 0x4efff3ef, + 0xffbea7f8, + 0xb1c1fd4f, + 0x93f1236c, + 0x0062bcf0, + 0xfff3dabe, + 0x00042cbe, + 0xf0931007, + 0xa70062d4, + 0xffffffce, + 0xfff3c6be, + 0x9311c199, + 0x0062eaf0, + 0xfff3babe, + 0xb211ba01, + 0xf0931a07, + 0xbe006302, + 0x07fff3ab, + 0xa716270a, + 0xffeaa72e, + 0xa7fd0d7e, + 0xfffffb0e, + 0x01030919, + 0x4ea70a19, + 0x03fffffe, + 0x19421901, + 0x0341030b, + 0x190e1901, + 0x19410343, + 0x93c11944, + 0x0062f7f0, + 0xf905fe35, + 0xfb25fa15, + 0xfff36abe, + 0x930fc199, + 0x006326f0, + 0xfff35ebe, + 0x9310c199, + 0x006341f0, + 0xfff352be, + 0x0668c2d1, + 0x066cc3d1, + 0x0664c1d1, + 0x6353f093, + 0xf33dbe00, + 0x50c1d1ff, + 0x79f09306, + 0x30be0063, + 0xc1d1fff3, + 0xf0930658, + 0xbe006393, + 0xd1fff323, + 0x93065cc1, + 0x0063adf0, + 0xfff316be, + 0x9327c199, + 0x0063c8f0, + 0xfff30abe, + 0x9326c199, + 0x0063e3f0, + 0xfff2febe, + 0x0e4cc1d1, + 0x63fdf093, + 0xf2f1be00, + 0x65c1b9ff, + 0x17f0930e, + 0xe4be0064, + 0xc1b9fff2, + 0xf0930e64, + 0xbe006434, + 0xd1fff2d7, + 0x9313e8c1, + 0x006451f0, + 0xfff2cabe, + 0x0102c1a9, + 0x646ef093, + 0x0f1c8300, + 0xfff2babe, + 0x0108c1b9, + 0x6485f093, + 0xf2adbe00, + 0x09c1b9ff, + 0x9ff09301, + 0xa0be0064, + 0xc1a9fff2, + 0xf093010a, + 0xbe0064b9, + 0xd1fff293, + 0x931890c1, + 0x0064d3f0, + 0xfff286be, + 0x187cc1b9, + 0x64f3f093, + 0xf279be00, + 0x7dc1b9ff, + 0x0df09318, + 0xcea70065, + 0xbeffe93b, + 0xb9fff267, + 0x9301b4c1, + 0x006522f0, + 0xfff25abe, + 0x9340c199, + 0x00653bf0, + 0x4cbe8c07, + 0xc027fff2, + 0x14f9661e, + 0xff001828, + 0x183830f1, + 0x32f1ff00, + 0xff001718, + 0x175833f1, + 0x42d8ff00, + 0x2bb30749, + 0xcad027b2, + 0xb0070923, + 0xb22bb103, + 0x4187d307, + 0x183843f1, + 0xeb07ff00, + 0xed0b3103, + 0x175849f1, + 0x42f1ff00, + 0xff0016c4, + 0x650bf093, + 0x1844f100, + 0x27ff0017, + 0x27e30ea0, + 0x053a07a1, + 0x25fb15f9, + 0xf1e5befd, + 0x07c103ff, + 0x4084991c, + 0x31871f6b, + 0xa79014ca, + 0xffffffce, + 0x0e66c1b9, + 0x6526f093, + 0xf1c5be00, + 0x67c1b9ff, + 0x40f0930e, + 0xb8be0065, + 0xc1b9fff1, + 0xf0930e64, + 0xbe00655a, + 0x93fff1ab, + 0x006578f0, + 0xfff1a2be, + 0x930cc199, + 0x00657df0, + 0xfff196be, + 0x932ac199, + 0x006598f0, + 0xfff18abe, + 0x9312c199, + 0x0065b3f0, + 0xfff17ebe, + 0x9344c199, + 0x0065cef0, + 0xfff172be, + 0x933cc1c1, + 0x0065e9f0, + 0xfff166be, + 0x9340c1c1, + 0x006604f0, + 0xfff15abe, + 0x0654c1d1, + 0x661ef093, + 0xf14dbe00, + 0x3cf093ff, + 0x44be0066, + 0x0ea7fff1, + 0xbefffb33, + 0x07fff9b1, + 0x3cf09310, + 0x30be0066, + 0x0ea7fff1, + 0xbefffae3, + 0x07fff99d, + 0x57f09310, + 0x1cbe0066, + 0xc027fff1, + 0x3c074c07, + 0x35334333, + 0x42f1430b, + 0xff000110, + 0xf0931c07, + 0x03006669, + 0xf0fdbec1, + 0x10ccc4ff, + 0xff4ea7e0, + 0x4b99feff, + 0x6ef09309, + 0xb3830066, + 0x4b87cb07, + 0xc42bc433, + 0x0050c1f9, + 0xce23ff00, + 0xbeffffb8, + 0x03fff0d3, + 0x93c139c4, + 0x006674f0, + 0xfff0c6be, + 0xf093c159, + 0xbe006691, + 0x03fff0bb, + 0x334b87b1, + 0xf1b42bb4, + 0x000048b1, + 0xa2f093ff, + 0xf1030066, + 0xa09ef80e, + 0xf64efff0, + 0xf093f4e3, + 0xbe006a38, + 0x27fff093, + 0x87d02771, + 0x0044f14d, + 0x87ff0210, + 0xf1f49537, + 0x02100034, + 0x91f4a5ff, + 0xe04c3cf4, + 0x0b1e40a7, + 0x44334d07, + 0x180c44f1, + 0xf4b5ff02, + 0x4c3cf4a1, + 0x1e40a7e0, + 0x3347070b, + 0x0c44f144, + 0xc5ff0218, + 0xdc3030f4, + 0x1e402738, + 0xf14d8709, + 0x02160044, + 0x34f4c5ff, + 0x27387c30, + 0x87091e40, + 0x0044f147, + 0xc5ff0216, + 0x402738f4, + 0xc53cf4c5, + 0xf4c540f4, + 0x48f4c544, + 0xf3a1f291, + 0x4f38f4b1, + 0x20000000, + 0x0b1e10a7, + 0x44334d07, + 0x180441f1, + 0xf4c1ff02, + 0x004f3830, + 0xa7200000, + 0x070b1e60, + 0xf1443347, + 0x02180446, + 0x3cfec1ff, + 0xfcc14107, + 0xc11d0740, + 0xfac144fb, + 0x34f9c148, + 0x5538f8c1, + 0x031153fd, + 0xbcf093d2, + 0xf7750069, + 0xfe15f605, + 0xfb35fc25, + 0xf965fa45, + 0x7203f885, + 0xffefb6be, + 0x2450dce4, + 0x8ef4c3ff, + 0xd10f27f6, + 0x0b2c4304, + 0x07f64efe, + 0x07820742, + 0x07a20793, + 0x102c5330, + 0x3fab4fab, + 0xe39be207, + 0x71076007, + 0x1407b007, + 0x9b100c53, + 0x07109b34, + 0x53e10b43, + 0xe40b104c, + 0x1e02209b, + 0x00002e03, + 0x9b4e0701, + 0x10ec33b9, + 0x4c53a79b, + 0xabd20710, + 0x0bce073f, + 0x0bd40bba, + 0x071b07c3, + 0x8e1d0b0c, + 0x27f54ef6, + 0x00df27c0, + 0x0741e000, + 0x073d072c, + 0xbeb107a0, + 0xc80020ec, + 0x20271f00, + 0x1b073d07, + 0x4cbe0a07, + 0x4007001e, + 0x51070407, + 0x001f94be, + 0x00000f03, + 0xf58e8000, + 0x0a071b07, + 0x001f84be, + 0xf54ef58e, + 0xb207f1a3, + 0xd207c307, + 0x10e8e307, + 0x302701bd, + 0xc0e8f355, + 0xa10701c9, + 0x5007bd07, + 0x00aceff6, + 0x00ccd1e2, + 0x0000def4, + 0xf401e401, + 0xa00100dd, + 0x27402703, + 0x3b07202c, + 0x33f9345b, + 0x0001acc8, + 0x132b1207, + 0x4c2716e6, + 0x2b250720, + 0x5b3a0741, + 0x07313b24, + 0x3ba3aba2, + 0x07b13b51, + 0x109c539b, + 0x0a071907, + 0x002264be, + 0x19078007, + 0x54be0a07, + 0xab070022, + 0x0c334507, + 0x53afab10, + 0xc807104c, + 0xca9b04ab, + 0x0b0bc062, + 0x0b0a8123, + 0x03540cea, + 0x1907c01b, + 0x32be0c07, + 0xd0070022, + 0x0c071907, + 0x002222be, + 0x0c334507, + 0x074fab10, + 0x9b04abed, + 0x0be082ea, + 0x2ad1230b, + 0x23e0020b, + 0x334807d1, + 0x0d07104c, + 0x402704ab, + 0x2e070b1e, + 0x00cae1e2, + 0x40270027, + 0x6007f351, + 0x14077407, + 0x302735c6, + 0x302b4027, + 0x0307416b, + 0xf1831407, + 0xd596f58e, + 0x10270127, + 0x0021d4be, + 0xbef0b007, + 0xf3010000, + 0x00bff400, + 0xb0010000, + 0x102c2702, + 0x3b074207, + 0x33f9345b, + 0x0001acc8, + 0x832b8207, + 0x01dc8ff6, + 0xca074b07, + 0x4fab9b07, + 0x9c53cb2b, + 0x27f43510, + 0x07190781, + 0x2193be0c, + 0x07a00700, + 0xbe0c0719, + 0x07002183, + 0x33fc3145, + 0x4c53100c, + 0x9b04ab10, + 0x0bc062ca, + 0x0aa1230b, + 0x8e0cea0b, + 0x07c01b02, + 0xbe0c0719, + 0x07002165, + 0x071907d0, + 0x2155be0c, + 0x31450700, + 0x100c33fe, + 0x04ab4fab, + 0xe082ed9b, + 0xd1230b0b, + 0xe0020b2a, + 0x4a07d123, + 0x07104c33, + 0x0704ab0d, + 0xff3e5e48, + 0x0000eed0, + 0xeff46301, + 0x01000000, + 0x1c27021b, + 0x07410710, + 0xf9345b32, + 0x01acc833, + 0x2b810700, + 0x628fd683, + 0x5bea2a0a, + 0x0127ff10, + 0x0d5e4027, + 0x273027ff, + 0x6b302b40, + 0xa7140741, + 0x07f45540, + 0x3bc0ec03, + 0x073027fe, + 0x514027d3, + 0x0be407f3, + 0x6bdb2b3f, + 0x5ef355ec, + 0xbdf4fe26, + 0x01d10100, + 0x2c274027, + 0xff105e20, + 0x0100edf4, + 0x402701a3, + 0x1e201c27, + 0x00dff49f, + 0x9c010000, + 0x102c2701, + 0x1b5e4207, + 0x203c27fe, + 0x4b07382b, + 0x283b435b, + 0x92ab9407, + 0x4a07ca07, + 0x2507d907, + 0xdc53c35b, + 0x5b483b10, + 0x0724ab23, + 0x150c071d, + 0x2083bef2, + 0x07f04500, + 0xbe0c071d, + 0x11002073, + 0x41a907f4, + 0x100c33fc, + 0x4c53afab, + 0xabb83b10, + 0x05ca9b04, + 0x13c0c2fb, + 0x090bf441, + 0xf4454123, + 0xc042096a, + 0xf4454123, + 0xc01b090b, + 0x0c071d07, + 0x002044be, + 0x1d07b007, + 0x34be0c07, + 0xf4110020, + 0xab100c33, + 0xabd0074f, + 0x42ab9bd4, + 0x23d90bad, + 0x309de2b1, + 0x01f44101, + 0x104c33fc, + 0xeb07b4ab, + 0xec53f401, + 0xab1b0710, + 0x071fab4f, + 0x10cc530e, + 0x049b2107, + 0x2c9b149b, + 0x41073007, + 0x4c53320b, + 0x0b2d0710, + 0x9b2a2b34, + 0x030302ec, + 0x010000ee, + 0x4c534307, + 0xeae40b10, + 0xee00b12e, + 0x07009a2e, + 0x5e40270b, + 0xb83bfddc, + 0x2b204c27, + 0x07ca0748, + 0x079b073a, + 0x5bc45b25, + 0x53383b24, + 0x23ab109c, + 0x0c071907, + 0xaebef225, + 0xa007001f, + 0x0c071907, + 0x001f9ebe, + 0xf4213b07, + 0x0c333fab, + 0x104c5310, + 0xf335c307, + 0xca9b40ab, + 0x4b0bc4a2, + 0x4b4aa123, + 0xa123c422, + 0xc41b4b0b, + 0x0c071907, + 0x001f78be, + 0x1907d007, + 0x68be0c07, + 0xf421001f, + 0x0c33f231, + 0xab4fab10, + 0xa22d9b04, + 0x230b0b20, + 0x220b4ad1, + 0x0bd12320, + 0x334a070b, + 0x583b104c, + 0x8d07c007, + 0x84abc22b, + 0x07fda85e, + 0x33310743, + 0x3fab104c, + 0x283b2507, + 0x42e2430b, + 0x0b07ff57, + 0x40270123, + 0x27fd2f5e, + 0x181c2748, + 0x27fdfe5e, + 0x2827184c, + 0x27fc815e, + 0x2827184c, + 0x27fd515e, + 0x1827184c, + 0x27fde65e, + 0x182c2748, + 0x27fd415e, + 0x182c2748, + 0xe2fc615e, + 0x0bfed0ad, + 0x5eb123d9, + 0x8123fec9, + 0xa95e0b0b, + 0x0ba123fc, + 0xfd6f5e0b, + 0xf2e3f54e, + 0xc307b207, + 0xe307d207, + 0x01ab10e8, + 0xf2a52027, + 0x0194c0e8, + 0x7007bd07, + 0xefd6a107, + 0xe0d1e265, + 0x00def000, + 0x01b00100, + 0x0000dff4, + 0x039a0100, + 0x07102c27, + 0x5b0b0742, + 0xc803f904, + 0x070001ac, + 0xf6432b42, + 0x2701ad4f, + 0x07f17510, + 0x10dc53db, + 0x0a071d07, + 0x001e80be, + 0x1d07c007, + 0x70be0a07, + 0x6b07001e, + 0x6fab4707, + 0x53100c33, + 0xc69b104c, + 0xc06204ab, + 0x0b2a0b0b, + 0x0b0bc002, + 0xef5ec01b, + 0xc2ce0700, + 0x800726e1, + 0xf0059107, + 0xf1a1f115, + 0x01651fc6, + 0x27f111f0, + 0x2b402730, + 0x07416b30, + 0x05140703, + 0xc3f415f3, + 0xf0f58ef2, + 0x010000ee, + 0xeff40134, + 0x01000000, + 0x2c270318, + 0x07420710, + 0xf9345b3c, + 0x01acc833, + 0x2bd20700, + 0x3ddff6d3, + 0xcaca0a01, + 0x2707157b, + 0x2b2b3a07, + 0x41273c2b, + 0x030e27e2, + 0xa42ba307, + 0xf1a17207, + 0xfa15f705, + 0x9a078707, + 0x019d1fd6, + 0xc3f111f0, + 0x96f58ef2, + 0x270127d5, + 0x1dcfbe10, + 0xf0b00700, + 0x010000be, + 0xbff400b8, + 0x01000000, + 0x2c2702c0, + 0x07420710, + 0xf9045b0b, + 0x01acc803, + 0x2b520700, + 0xd95ff653, + 0x07ca0701, + 0x276b07db, + 0x53cb2b10, + 0x6fab10dc, + 0x1d07f175, + 0x8ebe0c07, + 0xa007001d, + 0x0c071d07, + 0x001d7ebe, + 0x0c334707, + 0x104c5310, + 0x04aba69b, + 0x0b0ba042, + 0x0aea0b0a, + 0xc0070291, + 0x1d07ca2b, + 0x62be0c07, + 0xa007001d, + 0x0c071d07, + 0x001d52be, + 0x0c334707, + 0x9b4fab10, + 0x6204aba6, + 0x2a0b0ba0, + 0x0ba0020b, + 0x710a2b0b, + 0x5b8007f1, + 0x05902781, + 0x5ef915f8, + 0x3027feea, + 0xd3074027, + 0xdb2be407, + 0x615eec6b, + 0x273027fe, + 0x6b302b40, + 0x07030741, + 0xa530a714, + 0xfe4a5ef3, + 0x0100bdf4, + 0x4027021c, + 0x5e202c27, + 0xddf4ff4b, + 0x02060100, + 0x2c274027, + 0xfe535e20, + 0x0100edf4, + 0x402701d8, + 0x5e202c27, + 0xf475fecf, + 0x4c132707, + 0x71245b20, + 0x3b3a07f4, + 0xaba20734, + 0x3bb43ba3, + 0xfe415e74, + 0x2b204c27, + 0x21f4254d, + 0x5b4b07f0, + 0x3b3c0740, + 0xab54073d, + 0x07470753, + 0x076507ca, + 0x3bc05b3a, + 0x106c533d, + 0x43ab405b, + 0x0c071607, + 0x9abef455, + 0xf095001c, + 0x0c071607, + 0x001c8abe, + 0x1507f451, + 0x1fabfc91, + 0x53100c33, + 0xbd3b104c, + 0xf1857d3b, + 0xc19b04ab, + 0xf745fb35, + 0x9113c0c2, + 0x23050bf2, + 0x6af29521, + 0x23c04205, + 0x0bf29521, + 0x07c01b05, + 0xbe0c0716, + 0x07001c55, + 0x071607a0, + 0x1c45be0c, + 0x33f45100, + 0xf781100c, + 0xb0074fab, + 0x7a9bb4ab, + 0xb50b7b42, + 0x5be2a123, + 0xf491015a, + 0x4c333a07, + 0x0734ab10, + 0xabf431c3, + 0x10cc533f, + 0x4fabfe31, + 0x0c07a307, + 0x0710ec53, + 0x9b049b13, + 0x071e9ba4, + 0x0b4a0720, + 0x104c5321, + 0x3c071b07, + 0x172b240b, + 0x02023e9b, + 0x00003e03, + 0x53420701, + 0x0307104c, + 0x040b3207, + 0x07103c33, + 0x074fab4a, + 0xea240b23, + 0xee008910, + 0x1b010801, + 0x00955e01, + 0x4507b53b, + 0x07204c13, + 0x073a07ca, + 0x5b2707db, + 0x10dc53c4, + 0x353b245b, + 0x1d0723ab, + 0xf2650c07, + 0xaabef575, + 0xa007001b, + 0x0c071d07, + 0x001b9abe, + 0x6b07f461, + 0x0c336fab, + 0x104c5310, + 0x40aba69b, + 0x4b0ba462, + 0xa4024b2a, + 0xc4074b0b, + 0x1d07ca2b, + 0x7abe0c07, + 0xa007001b, + 0x0c071d07, + 0x001b6abe, + 0x0c33f461, + 0x9b4fab10, + 0x6204aba6, + 0x2a0b0ba0, + 0x0ba0020b, + 0x3bc0070b, + 0x5eca2b75, + 0xf431fdbe, + 0x421b3007, + 0x0127352b, + 0x2b6342c2, + 0x2b010730, + 0x41240703, + 0x2bf141f4, + 0x0a312742, + 0x1b302714, + 0x5bf02130, + 0x3b23074d, + 0x07840720, + 0x5b82ab93, + 0x15f8059d, + 0xfcd05ef9, + 0x2c274827, + 0xfcf95e18, + 0x27184c27, + 0xfc675e28, + 0x27184c27, + 0xfce95e28, + 0x27184c27, + 0xfd415e28, + 0x2c274827, + 0xfc4f5e18, + 0x2c274827, + 0xfd315e18, + 0xf15e4027, + 0x1e0027fc, + 0x5e0b0b9b, + 0x7be2fd6e, + 0xa123fea6, + 0x9f5eb50b, + 0xeaf341fe, + 0x27ff7932, + 0x4e891e00, + 0x35f163f5, + 0x07b107f0, + 0xb83ff6d2, + 0xf621e200, + 0x002ef400, + 0x01c80100, + 0x01002df4, + 0x4027037a, + 0x07202c27, + 0xf9345b3d, + 0x01acc833, + 0x2be20700, + 0x31e766e3, + 0x204c27f2, + 0x245b4e2b, + 0x3b07f431, + 0xb2073e3b, + 0xb3ab4e3b, + 0xde3bf435, + 0xac53ad07, + 0x071a0710, + 0x1a6bbe0b, + 0x07900700, + 0xbe0b071a, + 0x31001a5b, + 0x336d07f4, + 0x6fab100c, + 0x07104c53, + 0x9b04abc9, + 0x0bc062c6, + 0x0a91230d, + 0x3a0cea0d, + 0x07c01b03, + 0xbe0c071a, + 0x07001a39, + 0x071a07b0, + 0x1a29be0c, + 0x33f43100, + 0x4fab100c, + 0x04ab3b07, + 0x3082369b, + 0xb1230d0b, + 0x30020d2a, + 0x4907b123, + 0x07104c33, + 0x2704ab0b, + 0x07140740, + 0x43840770, + 0x07f58ef1, + 0xfb13ea23, + 0x003ef000, + 0x00e60100, + 0x00003ff4, + 0x02a80100, + 0x07101c27, + 0x5b320741, + 0xc833f934, + 0x070001ac, + 0xf6632b61, + 0x2a01016f, + 0xeaf4312b, + 0x2700cd4d, + 0x07402701, + 0x07700714, + 0x8ef14384, + 0x272596f5, + 0xbe102701, + 0x070019b5, + 0x00def0d0, + 0x00ba0100, + 0x0000dff4, + 0x02700100, + 0x07102c27, + 0x5b3d0742, + 0xc833f934, + 0x070001ac, + 0xf6932b92, + 0x0701939f, + 0x07ad07cb, + 0x53cd2b6d, + 0x6fab10ac, + 0x1a075127, + 0x76be0c07, + 0x90070019, + 0x0c071a07, + 0x001966be, + 0x0c33f431, + 0x104c5310, + 0x04abc907, + 0xc062c69b, + 0x91230d0b, + 0x0cea0d0a, + 0xc01b0250, + 0x0c071a07, + 0x001948be, + 0x1a07b007, + 0x38be0c07, + 0xf4310019, + 0xab100c33, + 0xab3b074f, + 0x82369b04, + 0x230d0b30, + 0x020d2ab1, + 0x07b12330, + 0x104c3349, + 0x04ab0b07, + 0x14074507, + 0x84077007, + 0xf58ef143, + 0x01003df4, + 0x402701ce, + 0x5e201c27, + 0x0027ff1d, + 0x14074027, + 0x84077007, + 0xf58ef143, + 0x0100ddf4, + 0x402701ca, + 0x5e202c27, + 0x2ff4ff49, + 0x01000000, + 0x2c2701c2, + 0x5e420710, + 0x3c27fe37, + 0x07362b20, + 0x3b435b4d, + 0xaba40726, + 0x07f231a2, + 0x079a07cb, + 0x5bc35b4b, + 0x53463b23, + 0x24ab109c, + 0x0c071907, + 0xaabef215, + 0x50070018, + 0x0c071907, + 0x00189abe, + 0xf4113a07, + 0x0c333fab, + 0x104c5310, + 0xd63bc307, + 0x04abf345, + 0xfd05c59b, + 0x0a0bc0a2, + 0x0a4a5123, + 0x5123c022, + 0xc01b0a0b, + 0x0c071907, + 0x001870be, + 0x1907b007, + 0x60be0c07, + 0xf4110018, + 0x41100c33, + 0x074fabf9, + 0x9bd4abd0, + 0x0b9d429b, + 0xe2b123da, + 0x070139ad, + 0x104c3345, + 0xeb07b4ab, + 0xec53f401, + 0x07fc0110, + 0xab4fab1b, + 0x530e071f, + 0x210710cc, + 0x149b049b, + 0x30072c9b, + 0x320b4107, + 0x07104c53, + 0x2b340b2d, + 0x02ec9b29, + 0x00ee0303, + 0x43070100, + 0x0b104c53, + 0xb32eeae4, + 0x9c2eee00, + 0x270b0700, + 0xfe355e40, + 0x4c27d93b, + 0x2bf23120, + 0x07cb0749, + 0x5b3b07ad, + 0x3b245bc4, + 0x10ac5339, + 0x1a0723ab, + 0xf2250c07, + 0x0017d8be, + 0x1a075007, + 0xc8be0c07, + 0xf4210017, + 0x0c336d07, + 0x536fab10, + 0xc507104c, + 0xc69b40ab, + 0x4d0bc4a2, + 0x4d4a5123, + 0x5123c422, + 0xc41b4d0b, + 0x0c071a07, + 0x0017a4be, + 0x1a07b007, + 0x94be0c07, + 0xf4210017, + 0xab100c33, + 0xab2b074f, + 0xa2269b04, + 0x230d0b20, + 0x220d4ab1, + 0x0bb12320, + 0x3145070d, + 0x104c33f3, + 0x5b07c007, + 0xc22b393b, + 0xf33554ab, + 0x07fded5e, + 0x07f23143, + 0x104c3331, + 0x263b3fab, + 0x42e2430b, + 0x0b07ff55, + 0x40270123, + 0x70071407, + 0xf1438407, + 0x4c27f58e, + 0x5e182718, + 0x4827fd59, + 0x5e181c27, + 0x4c27fd51, + 0x5e282718, + 0x4827fd91, + 0x5e182c27, + 0x4827fc87, + 0x5e182c27, + 0x4c27fd81, + 0x5e282718, + 0x9de2fc77, + 0xda0bfec7, + 0xc05eb123, + 0x0b9123fe, + 0xfcc35e0d, + 0x0d0b9123, + 0x01fdad5e, + 0x1342d004, + 0x32b01301, + 0x204944c0, + 0xc042a434, + 0x14113c32, + 0x112745c6, + 0xfe0b0107, + 0x04113284, + 0x10a742c6, + 0xfe0b0107, + 0x14110311, + 0x3106344e, + 0xf11e10a7, + 0x14210221, + 0x7af442da, + 0x31043124, + 0xeb04ca10, + 0x3fd60442, + 0x1e10a7ce, + 0x071027d8, + 0xc4fe0b01, + 0x1111c934, + 0x142b0411, + 0xfb4ebb1e, + 0x32d00301, + 0xd014012f, + 0x34e02842, + 0x44c000fb, + 0x2242c421, + 0x051d32c4, + 0x15041123, + 0x25042124, + 0x35043124, + 0x11031124, + 0x8b020714, + 0x8e241543, + 0x8e0107fb, + 0xfa32c0fb, + 0x14210c21, + 0xe42bec07, + 0x13310b31, + 0xe0c8de07, + 0x20ecc867, + 0x8c4cfa4c, + 0x27c40700, + 0x110011b0, + 0x7404ce14, + 0x3b2b0f66, + 0x277e30c8, + 0x25241540, + 0x3123352c, + 0x23410721, + 0xff4fd441, + 0x163fffff, + 0x11472321, + 0x41073123, + 0x23252135, + 0x4fd04123, + 0x3fffffff, + 0x054327ee, + 0x2810c824, + 0xfb8e0207, + 0x2752d1c8, + 0x234e3b41, + 0x27438b41, + 0x274486d0, + 0xab3e5bd1, + 0x13a71e3d, + 0x20eccce0, + 0x1be21e99, + 0x21a61e3b, + 0x53310724, + 0xab118331, + 0x07410313, + 0x25213502, + 0x07fb8e24, + 0x15130b1b, + 0x352c2520, + 0x27b31e21, + 0xff775e30, + 0x41273013, + 0x2c252415, + 0x801e2335, + 0xff67dfe6, + 0x4e3b4127, + 0x4b8b4123, + 0xd027ce0b, + 0xd1274486, + 0xbdabbe5b, + 0xe4ff505e, + 0x11ff2a44, + 0xee041113, + 0x93ff2234, + 0x005bfbf0, + 0x0001fb8e, + 0x40073007, + 0x53173c53, + 0x20071f4c, + 0x3f6b1415, + 0xffff2e83, + 0xc639d67f, + 0xa7432728, + 0x14057d3c, + 0x13254207, + 0x4f744733, + 0x40000000, + 0x31234447, + 0x00004fd0, + 0x25f64000, + 0x0b143513, + 0x054227fe, + 0xc0fe0b14, + 0x3316ff3c, + 0x7f3c2327, + 0x00002fa3, + 0x43274000, + 0x13251235, + 0xfe0b1405, + 0x44272516, + 0xfe0b1405, + 0x00000e83, + 0x27054610, + 0x35140541, + 0x05fe0b12, + 0x4ef91e10, + 0x07f163f5, + 0x03f0051f, + 0x7e0f0714, + 0xf341ff7a, + 0x23074027, + 0xf0112253, + 0xf12142ab, + 0x3c33f231, + 0x0c79be1e, + 0x43510700, + 0x4ef58ef1, + 0x07f2a3fb, + 0x05b803bf, + 0x07f115f0, + 0x7e1b070f, + 0xcf07ff4a, + 0x0718cc03, + 0x0704030f, + 0xff3c7e1c, + 0x1c070b07, + 0x83fdba7e, + 0x01fb8ef2, + 0x11033104, + 0x6442d002, + 0x005744c0, + 0x2735f642, + 0xab002740, + 0x1f2c3304, + 0xfe0b02ab, + 0x0fc80021, + 0xffffff82, + 0x800ccc5b, + 0x83430739, + 0x0c037f4c, + 0x404cc07f, + 0x3f3c031e, + 0x072130c8, + 0x6b475343, + 0xff4e830f, + 0x0c337fff, + 0x3304ab17, + 0x02ab1f2c, + 0x3cd8fe0b, + 0x3c03e380, + 0x53de1e40, + 0x1e010331, + 0x274027db, + 0x8000000f, + 0x07a91e7f, + 0x004ea343, + 0x4e831000, + 0x277fffff, + 0x8000000f, + 0x13951e7f, + 0xffff820f, + 0x1a0cccff, + 0x3b412753, + 0x8b412340, + 0x86102743, + 0x5b112744, + 0xab030730, + 0x83400701, + 0x4cc07f4c, + 0x40073c40, + 0x073f4c03, + 0x27375334, + 0x004fd001, + 0x20400000, + 0x4e834307, + 0x337fffff, + 0x505e170c, + 0x034007ff, + 0x3407404c, + 0x01273753, + 0x00004fd4, + 0x27e24000, + 0x27de1e00, + 0x1e302700, + 0x800cdcd8, + 0x533007e1, + 0x14412737, + 0x0000000f, + 0x07402740, + 0x4ec21e04, + 0x05f123fe, + 0x150f07f0, + 0x35f225f1, + 0xfef97ef3, + 0xfe8ef103, + 0xf163fd4e, + 0xd403df07, + 0x1d07f005, + 0x137e0f07, + 0x27f421fe, + 0x27449630, + 0x250d0731, + 0xfed57ef3, + 0xfd8ef143, + 0xf2a3fc4e, + 0xc803cf07, + 0xf115f005, + 0x1c070f07, + 0x07fded7e, + 0x18dc03df, + 0x04030f07, + 0xdf7e1d07, + 0xd0f221fd, + 0xf1611622, + 0x008112f0, + 0xf371f431, + 0xf43543cb, + 0x22c42400, + 0x07126e18, + 0xfe917e0c, + 0xfc8ef283, + 0x59aef093, + 0xfe857e00, + 0xfc8ef283, + 0xc05d14c0, + 0xf2413912, + 0xf351f481, + 0xf191242b, + 0x1342f245, + 0xf2452123, + 0x2f273347, + 0x40000000, + 0x4c270027, + 0xab312a1f, + 0x53312b02, + 0x98334721, + 0x834007f4, + 0x4cc07f4c, + 0xf0551240, + 0x4427ae1e, + 0xf4250c07, + 0x83fe3a7e, + 0xdcfc8ef2, + 0x66ec800c, + 0x400c0331, + 0x557f0ce3, + 0x07911ef0, + 0x278f1e0d, + 0x450c0740, + 0x1ef455f4, + 0xa3fc4e85, + 0x03cf07f3, + 0x15f005c8, + 0x070f07f1, + 0xfd347e1c, + 0xdc03df07, + 0x030f0718, + 0x7e1d0704, + 0xf421fd26, + 0xf3614290, + 0xe02432d0, + 0xe000dc44, + 0xc400cc34, + 0xf3311642, + 0x2027f471, + 0x2127340e, + 0xf2350c07, + 0x83fdd27e, + 0xc4fc8ef3, + 0xf3311632, + 0x2027f471, + 0x2127340e, + 0xf2750d07, + 0x83fdba7e, + 0x51fc8ef3, + 0x27f091f2, + 0xbe102730, + 0x81ffeef5, + 0x07f441f3, + 0x03430bd1, + 0xc5302742, + 0xf3b530f4, + 0xf331f471, + 0x342e2107, + 0xf4b54127, + 0x20cc3d07, + 0x30f4c11a, + 0x41032153, + 0x01533138, + 0x00000fa3, + 0x32078000, + 0xc5ee20c8, + 0x2fd430f4, + 0x40000000, + 0x30f4c123, + 0x0047091e, + 0x00002fb4, + 0x22474000, + 0x00cc4123, + 0x4721a3f2, + 0x002fd000, + 0xef400000, + 0x0730f4c5, + 0x7f4c8342, + 0x14404cc0, + 0x43270f07, + 0xc5280c03, + 0xf4a534f2, + 0x83fd2e7e, + 0xdcfc8ef3, + 0x26ea802c, + 0x402c0301, + 0x1e7f2ce3, + 0x4f42e4e0, + 0x39f093ff, + 0x3d5e0058, + 0x2b32e4ff, + 0x2df093ff, + 0x315e0058, + 0xa3fb4eff, + 0x03bf07f3, + 0x15f005b8, + 0x070f07f1, + 0xfc207e1b, + 0xcc03cf07, + 0x030f0718, + 0x7e1c0704, + 0xf471fc12, + 0x41c32f07, + 0x2c031c07, + 0x750b0728, + 0xfae47ef4, + 0x83fcce7e, + 0x4efb8ef3, + 0x07f3a3fb, + 0x05b803bf, + 0x07f115f0, + 0x7e1b070f, + 0xcf07fbe6, + 0x0718cc03, + 0x0704030f, + 0xfbd87e1c, + 0x1c072f07, + 0x07282c03, + 0xfab07e0b, + 0x83fc9a7e, + 0x4efb8ef3, + 0x27f123fc, + 0x27f40543, + 0x270008c1, + 0x270636c0, + 0x07f40542, + 0x7efc150f, + 0xf103fc7b, + 0xc876fc8e, + 0x4c27d007, + 0x250d071e, + 0xbefd35f4, + 0x2300115b, + 0xe001c801, + 0x3b1e4c27, + 0x35402bd0, + 0x1ef425fd, + 0x000f40d3, + 0x07800000, + 0x1ed013d0, + 0x000f27d6, + 0x1ecf0000, + 0xa3fc4ec6, + 0x03cf07f2, + 0x15f005c8, + 0x070f07f1, + 0xfb5c7e1c, + 0xdc03df07, + 0x030f0718, + 0x7e1d0704, + 0xf421fb4e, + 0x611042d0, + 0x074290f4, + 0x7e1d070c, + 0xf283f9c3, + 0x0127fc8e, + 0xfe4ef91e, + 0x1f07f163, + 0x1403f005, + 0x277e0f07, + 0x44f411fb, + 0x43002742, + 0xd0fe8ef1, + 0x4440f842, + 0x40c8f431, + 0x1f4c88f1, + 0x47c6f421, + 0x00000f27, + 0xf1438000, + 0xf041fe8e, + 0x4c13f321, + 0xc6045b1e, + 0x0013d63f, + 0xfe8ef143, + 0xffff0f27, + 0xf1437fff, + 0xfe4efe8e, + 0xf115f2a3, + 0xf0051f07, + 0x0f071803, + 0x07fad57e, + 0x031f070f, + 0x181c0304, + 0x21fac97e, + 0x614290f4, + 0x300027f4, + 0x8ef28342, + 0x830127fe, + 0x4efe8ef2, + 0x07f2a3fc, + 0x05c803cf, + 0x07f115f0, + 0x7e1c070f, + 0xdf07faa2, + 0x0718dc03, + 0x0704030f, + 0xfa947e1d, + 0x42d0f421, + 0x90f46110, + 0x070c0742, + 0xf9097e1d, + 0xfc8ef283, + 0xf91e0127, + 0xf2a3fc4e, + 0xc803cf07, + 0xf115f005, + 0x1c070f07, + 0x07fa697e, + 0x18dc03df, + 0x04030f07, + 0x5b7e1d07, + 0xd0f421fa, + 0xf4611042, + 0x0c074290, + 0xd07e1d07, + 0x8ef283f8, + 0x1e0127fc, + 0xa3fc4ef9, + 0x03cf07f2, + 0x15f005c8, + 0x070f07f1, + 0xfa307e1c, + 0xdc03df07, + 0x030f0718, + 0x7e1d0704, + 0xf421fa22, + 0x611042d0, + 0x074290f4, + 0x7e1d070c, + 0xf283f897, + 0x00a7fc8e, + 0xfc4ef91e, + 0xcf07f2a3, + 0xf005c803, + 0x0f07f115, + 0xf77e1c07, + 0x03df07f9, + 0x0f0718dc, + 0x1d070403, + 0x21f9e97e, + 0x1042d0f4, + 0x4290f461, + 0x1d070c07, + 0x83f85e7e, + 0xa7fc8ef2, + 0x4ef91e00, + 0x07f2a3fc, + 0x05c803cf, + 0x07f115f0, + 0x7e1c070f, + 0xdf07f9be, + 0x0718dc03, + 0x0704030f, + 0xf9b07e1d, + 0x42d0f421, + 0x90f46110, + 0x070c0742, + 0xf8257e1d, + 0xfc8ef283, + 0xf91e0127, + 0xf123fd4e, + 0x0676d007, + 0xf4054227, + 0x40270f07, + 0x547ef415, + 0x8ef103fa, + 0x274327fd, + 0xf4051e3c, + 0xf035f325, + 0x000f36be, + 0x00c80123, + 0xdd0fc61c, + 0x2b1e4c27, + 0x25d03b40, + 0x270f07f4, + 0x15fd3540, + 0xfa257ef4, + 0xfd8ef103, + 0x20132007, + 0x423b4127, + 0x4d8b4123, + 0x46363027, + 0x4c27d25b, + 0x2b3dab1e, + 0x25f33540, + 0x27a61ef4, + 0x4eee1e31, + 0xd00401fd, + 0x13011342, + 0x44c032b0, + 0xa434205d, + 0x4832c042, + 0x45c61411, + 0x01071127, + 0x3284fd8e, + 0x42c60411, + 0x010710a7, + 0x0311fd8e, + 0x344e1411, + 0x10a73106, + 0x0221f11e, + 0x42da1421, + 0x1524daf4, + 0x0e410d31, + 0x11411031, + 0xcee61eca, + 0xe12a141e, + 0x0d42e16e, + 0xa7c23fd6, + 0x27cc1e10, + 0x8e010710, + 0xebd0c2fd, + 0x1ecc3fd6, + 0xb534c4b0, + 0x04111111, + 0xa71e142b, + 0xf1a3f54e, + 0x60275027, + 0xf5350301, + 0xc007f645, + 0xb2077107, + 0x90278027, + 0x012f32d0, + 0x7d42f014, + 0x4b34e001, + 0x7544e002, + 0x2442c401, + 0x071b32c4, + 0x27400732, + 0x03410125, + 0x03310544, + 0x11f2a834, + 0x077411c3, + 0x15438bcb, + 0x830c07b4, + 0xe0f58ef1, + 0x21014b32, + 0x2514210e, + 0x310341fe, + 0x15ae0702, + 0x2bf205f3, + 0x411d31a4, + 0xe83a071e, + 0xcc00dfa0, + 0xe84c40ac, + 0x07017c31, + 0x203c233a, + 0x5027f355, + 0x30e86027, + 0x412701dc, + 0x133b1407, + 0x02072127, + 0x30a70a3b, + 0x300b40a7, + 0x3d8b414b, + 0x34ab4e8b, + 0x512734c6, + 0xf4516027, + 0x01a440e8, + 0x845b8e07, + 0x9a5b9e07, + 0xe607d507, + 0xe9abd8ab, + 0xf321111e, + 0x010643fa, + 0x20271027, + 0xf105f425, + 0xc011f215, + 0x04ee7411, + 0x0fe600db, + 0xf30100cc, + 0x1d07f411, + 0x132b2e07, + 0x20e8246b, + 0x402700f2, + 0xf421b415, + 0xb425b135, + 0xbc31b245, + 0x30a7bd41, + 0x3c0b40a7, + 0x4fd44d4b, + 0x10000000, + 0xff4fe031, + 0xc00fffff, + 0x07b12100, + 0x1f4c534c, + 0x34ab3d47, + 0xb3452c47, + 0xbc31b235, + 0x1123bd41, + 0x40a730a7, + 0x3c0bb125, + 0x4fd04d4b, + 0x10000000, + 0x0543271e, + 0x00dfd4b4, + 0x2c200000, + 0x0c07cb07, + 0xf58ef183, + 0xaceca013, + 0x5eff6d40, + 0x4fc4ff1f, + 0x0fffffff, + 0xff3fd0b7, + 0xb0ffffff, + 0xb4054327, + 0x0000dfd0, + 0x07d62000, + 0x330d073c, + 0x20271f0c, + 0x4d073153, + 0x1c07be21, + 0x415330ab, + 0x04ab0207, + 0xcb071183, + 0x13abe103, + 0xf183b045, + 0xb1350c07, + 0xf58ebe25, + 0x0c07c707, + 0xf58ef183, + 0xf211f101, + 0x2e6b1d2b, + 0x01ff395e, + 0x15f211f1, + 0x4b1d0bb0, + 0x21d2072e, + 0x25c107f2, + 0x45bc35b2, + 0xff735ebd, + 0xe027d027, + 0xf4ff015e, + 0xffffff3f, + 0x5eff64ff, + 0xfd21ff39, + 0x40273027, + 0x426b312b, + 0xb2152127, + 0xb335bd25, + 0x075eb445, + 0xdb3fe6ff, + 0x07f321fe, + 0x202c232a, + 0xf2553a0b, + 0x0027f325, + 0x20e81027, + 0x41270091, + 0x623b6407, + 0x52072127, + 0xf2015a3b, + 0x40a730a7, + 0x464b350b, + 0xf211328b, + 0x34ab428b, + 0x012734c6, + 0xf3511027, + 0x115030c8, + 0x35435bf4, + 0x31f311f4, + 0x073a5bf4, + 0xab40ab23, + 0x05f34521, + 0x5ef215f4, + 0x4c27fe82, + 0x074a2b20, + 0x3b8d071e, + 0xab8a5b14, + 0xfe525e81, + 0x27203c27, + 0x073a2b41, + 0x5e135b14, + 0x44e4fe20, + 0x1311fdd9, + 0x34ee0411, + 0xfc93fdd1, + 0x5e005240, + 0x4c27fdc9, + 0x01f21120, + 0x3b4a2bf3, + 0x073a5b24, + 0xab230742, + 0x1ef23524, + 0x203c27a1, + 0x3a2b4127, + 0x635b6407, + 0x4eff6b5e, + 0x010a11f8, + 0x07ba0709, + 0x1fbc533a, + 0x83143c53, + 0x070307b1, + 0x831b15ea, + 0x2707ff0d, + 0x078107c0, + 0xffee83d9, + 0x0e160fff, + 0x4eab4907, + 0x42274516, + 0xf88e1405, + 0x3da74327, + 0x140503fd, + 0x49071325, + 0x4c531e07, + 0x07183318, + 0x3314ab09, + 0x001fd408, + 0x1d100000, + 0x2007e307, + 0x2c534147, + 0x4742ab1f, + 0x07030730, + 0xd0e12314, + 0x0000004f, + 0x8e25e910, + 0x81458035, + 0x0dc0f88e, + 0x072807ff, + 0x534e0729, + 0x4833182c, + 0x240742ab, + 0x00002fa3, + 0x39071000, + 0x0d233833, + 0x124503ff, + 0x10252327, + 0x13351205, + 0x4907f88e, + 0x45164eab, + 0x14054427, + 0x4e07f88e, + 0x4e833027, + 0xab080000, + 0x27358634, + 0x35140541, + 0x8e8e458d, + 0x1e1305f8, + 0xe3f54ef7, + 0x075107f1, + 0x0340071f, + 0x050f0718, + 0x7ef515f4, + 0xf351ff23, + 0x1307f461, + 0xffff1f83, + 0x20273fff, + 0x3c530487, + 0xab12ab1e, + 0xa3148630, + 0x31f02131, + 0xbef241f1, + 0xc3fff6d7, + 0x4ef58ef1, + 0x07f3a3f5, + 0x10ac03af, + 0xb007c107, + 0x0f071a07, + 0xf225f335, + 0xfc155307, + 0xcf07fb05, + 0x03feda7e, + 0x0f0724cc, + 0x1c070803, + 0x07fece7e, + 0x7e1c070a, + 0xf383fbab, + 0xf64ef58e, + 0x90270401, + 0x0d31a027, + 0x08110e41, + 0x00c942f0, + 0x00ba44e0, + 0x4d074240, + 0x47f64eab, + 0x10270027, + 0x31833807, + 0x4c334307, + 0x0730271f, + 0xabc107b0, + 0x07c4abb3, + 0x8e1c070b, + 0xe80021f6, + 0xfffc020f, + 0xec00b1ff, + 0x8504000d, + 0x6b3d0700, + 0x0340273f, + 0xc003ff0d, + 0x2756803c, + 0x40277f3c, + 0xe44bd30b, + 0x0000efd0, + 0x07162000, + 0x073d072e, + 0x1f2c334e, + 0x32ab3153, + 0xd3074153, + 0x0103e407, + 0x4e072007, + 0x1e070d07, + 0x07ff2d83, + 0x32071853, + 0x53184c33, + 0x0704ab08, + 0x143c33e1, + 0xd0072027, + 0xffffee83, + 0x0702070f, + 0xab0dab13, + 0xff765e1e, + 0x07a94fd6, + 0x003d833d, + 0xc634ab01, + 0x3c27a73f, + 0x0b402780, + 0xd0e44bd3, + 0x000000ef, + 0x9c1eb320, + 0x1f270027, + 0x7ff00000, + 0x07ff4b5e, + 0x004ea34e, + 0xe4070800, + 0xffffee83, + 0x071e070f, + 0x001fa30d, + 0x5e7ff000, + 0x0f13ff30, + 0xfffffc02, + 0xba390cec, + 0x23100700, + 0x6027201c, + 0x10e87027, + 0x412700b5, + 0xc13bc407, + 0xb2072127, + 0x30a7b03b, + 0x3b0b40a7, + 0x3d8b4c4b, + 0x34ab4e8b, + 0x612734c6, + 0x10e87027, + 0x9e07009f, + 0xd607915b, + 0xae07d9ab, + 0xa05b3d07, + 0x3f6be707, + 0x4027eaab, + 0x44803cc0, + 0x277f3c27, + 0x4b3d0b40, + 0x3324074e, + 0xc127182c, + 0x00004f14, + 0xc0271000, + 0x08530307, + 0x02ab1407, + 0x3c071853, + 0x07ff3d83, + 0xe1074307, + 0x27144c33, + 0x83d00730, + 0x0fffffee, + 0x14070307, + 0x1eab0dab, + 0xd6fe975e, + 0x3d07bb4f, + 0x01003d83, + 0x34ab4027, + 0x4e073cb6, + 0x27184c33, + 0x00ef14c1, + 0x27100000, + 0x530d07c0, + 0xab1e0708, + 0x1e185304, + 0x27c027b6, + 0x1e102700, + 0x203c27ae, + 0x302b4127, + 0xc35bc407, + 0x27ff475e, + 0x402b204c, + 0x9d073e07, + 0x905b343b, + 0x575e93ab, + 0x803c27ff, + 0x4eff6a5e, + 0x05f163f5, + 0x150f07f0, + 0x35f225f1, + 0x7ef445f3, + 0x5107fe0a, + 0xf58ef143, + 0xf1e3f54e, + 0xd803df07, + 0x51074007, + 0x1d070f07, + 0xf515f405, + 0x31fcae7e, + 0x963027f4, + 0x07312744, + 0x7ef3350d, + 0x5107fdde, + 0xf58ef1c3, + 0xf3e3f54e, + 0x1f07c107, + 0x1c03b007, + 0x250f0710, + 0x15f335f2, + 0x7efb05fc, + 0xdf07fc7f, + 0x0724dc03, + 0x0708030f, + 0xfc717e1d, + 0x22d0f241, + 0xf0f19116, + 0x51010912, + 0xcbf3a1f4, + 0x00f45543, + 0x1f22c424, + 0x0f0712ae, + 0x7e100c03, + 0x5107fd8e, + 0xf58ef3c3, + 0x4e5af093, + 0xfd807e00, + 0xf3c35107, + 0x14e0f58e, + 0x12c000df, + 0xb1f1617f, + 0x2bfc81f4, + 0x34f8c114, + 0xfb71f165, + 0xea30f7c1, + 0xce0084c8, + 0x4c277d8c, + 0x2790273d, + 0x000000af, + 0x27502710, + 0x38f4c560, + 0xe607d507, + 0xd9ab4a07, + 0x4c33eaab, + 0xcec88a1f, + 0x5d07548c, + 0xb72b6e07, + 0x2907c86b, + 0x24ab2153, + 0x4c534b07, + 0xab1c471f, + 0x38f4c114, + 0x41233a07, + 0x0b473153, + 0x0738f4c5, + 0x07a30792, + 0xd6c107b0, + 0x3507bf4f, + 0x40273f6b, + 0x38803cc0, + 0xf685f575, + 0x07ff615e, + 0x0344270f, + 0xf445100c, + 0x07fce97e, + 0x8ef3c351, + 0xb3b7caf5, + 0x7bc2a91e, + 0x472b0782, + 0x1f2c534c, + 0x3b4742ab, + 0xb3071123, + 0xf165c407, + 0xd6ff6d5e, + 0x3507c74f, + 0x01003d83, + 0x3fd634ab, + 0xab4007bc, + 0xb54fc641, + 0x27803c27, + 0x4b350b40, + 0xe3530746, + 0x6407ff5c, + 0x0d07a31e, + 0x07ff0a5e, + 0x2730270f, + 0x03202740, + 0xf375100c, + 0xf265f485, + 0x4efef65e, + 0x07f5e3f5, + 0x10ac03af, + 0xc107b007, + 0x1a070f07, + 0xf225f335, + 0xfb05fc15, + 0x07fb2a7e, + 0x24dc03df, + 0x08030f07, + 0x1c7e1d07, + 0x90f441fb, + 0xd0f39142, + 0x44e02632, + 0x34e001f3, + 0x42c401e3, + 0xa1f35118, + 0x0e2027f4, + 0x07212734, + 0x7ef2550a, + 0x5107fc36, + 0xf58ef5c3, + 0x511832c4, + 0x27f4a1f3, + 0x27340e20, + 0xa50d0721, + 0xfc1c7ef2, + 0xf5c35107, + 0xfbc1f58e, + 0x27f77130, + 0x076027a0, + 0x34fcc12b, + 0x1a073607, + 0xeabe0707, + 0x5b07ffe2, + 0xbc073027, + 0xc54cfbc5, + 0xf0c550f3, + 0x58f1c554, + 0xc14cf0c1, + 0x3a0750f1, + 0x2707f881, + 0xffe2c8be, + 0x9007c027, + 0x2507a107, + 0x08073607, + 0xb6be1c07, + 0xd007ffe2, + 0xd90be107, + 0xb807ea4b, + 0x00fdeaea, + 0x00f5aeee, + 0xf3c11027, + 0x58f4c154, + 0xad079107, + 0xa44b930b, + 0x80277027, + 0x00f9a4ea, + 0xee58f4c1, + 0xc1012c4a, + 0xf2c150f3, + 0x070b074c, + 0xbebe071c, + 0xb1ffe275, + 0x27f461f3, + 0x03430bc0, + 0xc5302744, + 0xf3c540f4, + 0x51f4a13c, + 0x4bb00bf3, + 0x4bb70bc1, + 0x27342ec8, + 0x3cf4c541, + 0x0000cfd0, + 0xc13f2000, + 0x4c0740fe, + 0x4c331b07, + 0x0711531f, + 0xab0a072c, + 0x33215314, + 0xe1031f0c, + 0x0715b1d8, + 0x534a0739, + 0xab415331, + 0x07a40730, + 0x00afa393, + 0x07800000, + 0xd4c207b1, + 0x0000002f, + 0xfec5c920, + 0x00cfd440, + 0x31100000, + 0x0740fec1, + 0x1f4c5349, + 0x1a472b07, + 0x2c5314ab, + 0xab4c471f, + 0x473b4742, + 0x07b30709, + 0xc8e123c4, + 0x900759a0, + 0xcfd0a107, + 0x10000000, + 0x40fec5d7, + 0x3f6b3b07, + 0x3cc04027, + 0x0f074980, + 0x0c034327, + 0x44fbc538, + 0xc548fcc5, + 0xcb7e38f4, + 0xc35107fa, + 0xe2f58ef5, + 0x27ff0b9d, + 0x54f3c110, + 0x0758f4c1, + 0x0bad0791, + 0x27a44b93, + 0xe2812770, + 0x27ff0b4a, + 0x0b402731, + 0x5e844b73, + 0x31a3ff07, + 0xc407b307, + 0x4fd6a11e, + 0x833b07b6, + 0xab01003d, + 0xab3fd634, + 0x4aab4907, + 0x27a44fc6, + 0x4027803c, + 0x4c4b3b0b, + 0xbce3b307, + 0x1ec407ff, + 0xd439e292, + 0xe4c11efe, + 0x93fe3a42, + 0x004b37f0, + 0xe4fe265e, + 0x93fe1432, + 0x004b2bf0, + 0x4efe1a5e, + 0x07f4e3f5, + 0x10ac03af, + 0xb007c107, + 0x0f071a07, + 0xf225f335, + 0xfb05fc15, + 0xf47ecf07, + 0x24cc03f8, + 0x08030f07, + 0xe87e1c07, + 0x07f4a1f8, + 0x0741c32f, + 0x382c031c, + 0xf4a50a07, + 0x7ef62f7e, + 0x5107fa12, + 0xf58ef4c3, + 0xf4e3f54e, + 0xac03af07, + 0x07c10710, + 0x071a07b0, + 0x25f3350f, + 0x05fc15f2, + 0x7ecf07fb, + 0xcc03f8af, + 0x030f0724, + 0x7e1c0708, + 0x2f07f8a3, + 0x2c031c07, + 0x7e0a0738, + 0xd37ef5f0, + 0xc35107f9, + 0x4ef58ef4, + 0x27f163fb, + 0x27f40543, + 0x270008b1, + 0x270736b0, + 0x07f40542, + 0x7efb150f, + 0x3007f9b2, + 0x03074107, + 0xf1431407, + 0xbb36fb8e, + 0x04074007, + 0xc407d027, + 0x253c4c27, + 0x45f035f4, + 0x0425befd, + 0x03100700, + 0x11c81d1c, + 0xc80323cf, + 0x4c072300, + 0xf445403b, + 0x3c274c07, + 0x2b413b3c, + 0x25f43531, + 0xc0b51ef3, + 0x0000000f, + 0x40071a80, + 0xbf1e4013, + 0x2b204c27, + 0x072c0741, + 0x3b245b3d, + 0x4532ab31, + 0x27d21ef3, + 0x004f2730, + 0x1ec1e000, + 0xa3f54e96, + 0x03df07f3, + 0x400710dc, + 0x0f075107, + 0xf4051d07, + 0xf335c307, + 0xf515f225, + 0xe47ebf07, + 0x24bc03f7, + 0x08030f07, + 0xd87e1b07, + 0xd0f441f7, + 0xf4911042, + 0x0d074290, + 0xac7e1b07, + 0x8ef383f4, + 0x1e0127f5, + 0xe3f54ef9, + 0x075107f1, + 0x0340071f, + 0x050f0718, + 0x7ef515f4, + 0xf421f7ab, + 0x00274244, + 0xf58ef1c3, + 0x40f842d0, + 0xc8f44144, + 0x4c88f140, + 0x46f4311f, + 0x000f2749, + 0xc3800000, + 0x27f58ef1, + 0xe42b3cec, + 0x4c234e07, + 0x1c40c820, + 0x0207f261, + 0xf431045b, + 0x13ca4fc6, + 0x8ef1c300, + 0xff0f27f5, + 0xc37fffff, + 0x61f58ef1, + 0x204c27f2, + 0x32074e2b, + 0x4307343b, + 0x0307f351, + 0x04ab0e5b, + 0xf54ed51e, + 0x5107f3a3, + 0x40071f07, + 0x07101c03, + 0x07f4050f, + 0x35c307b2, + 0x15f225f3, + 0xf7297ef5, + 0x1f070f07, + 0x1c030803, + 0xf71d7e24, + 0x4290f441, + 0x0027f491, + 0xf3834230, + 0x0127f58e, + 0xf58ef383, + 0xf3a3f54e, + 0xdc03df07, + 0x07400710, + 0x070f0751, + 0x07f4051d, + 0x25f335c3, + 0x07f515f2, + 0xf6e97ebf, + 0x0724bc03, + 0x0708030f, + 0xf6dd7e1b, + 0x42d0f441, + 0x90f49110, + 0x070d0742, + 0xf3b17e1b, + 0xf58ef383, + 0xf91e0127, + 0xf3a3f54e, + 0xdc03df07, + 0x07400710, + 0x070f0751, + 0x07f4051d, + 0x25f335c3, + 0x07f515f2, + 0xf6a57ebf, + 0x0724bc03, + 0x0708030f, + 0xf6997e1b, + 0x42d0f441, + 0x90f49110, + 0x070d0742, + 0xf36d7e1b, + 0xf58ef383, + 0xf91e0127, + 0xf3a3f54e, + 0xdc03df07, + 0x07400710, + 0x070f0751, + 0x07f4051d, + 0x25f335c3, + 0x07f515f2, + 0xf6617ebf, + 0x0724bc03, + 0x0708030f, + 0xf6557e1b, + 0x42d0f441, + 0x90f49110, + 0x070d0742, + 0xf3297e1b, + 0xf58ef383, + 0xf91e00a7, + 0xf3a3f54e, + 0xdc03df07, + 0x07400710, + 0x070f0751, + 0x07f4051d, + 0x25f335c3, + 0x07f515f2, + 0xf61d7ebf, + 0x0724bc03, + 0x0708030f, + 0xf6117e1b, + 0x42d0f441, + 0x90f49110, + 0x070d0742, + 0xf2e57e1b, + 0xf58ef383, + 0xf91e00a7, + 0xf3a3f54e, + 0xdc03df07, + 0x07400710, + 0x070f0751, + 0x07f4051d, + 0x25f335c3, + 0x07f515f2, + 0xf5d97ebf, + 0x0724bc03, + 0x0708030f, + 0xf5cd7e1b, + 0x42d0f441, + 0x90f49110, + 0x070d0742, + 0xf2a17e1b, + 0xf58ef383, + 0xf91e0127, + 0xf163f54e, + 0xb027a027, + 0x90278027, + 0x422706b6, + 0x0f07f405, + 0xf4154027, + 0x07f6d97e, + 0x8ef14351, + 0x27d027f5, + 0x3c3c2743, + 0xf405c007, + 0xf035f325, + 0x54befd45, + 0x10070001, + 0xc81d1c03, + 0x1fc62c10, + 0xe80323d2, + 0x07008200, + 0x45403b4c, + 0x3b4c07f4, + 0x3c3c2741, + 0x312bf435, + 0x40270f07, + 0xf415f325, + 0x07f6917e, + 0x8ef14351, + 0x13e107f5, + 0x230e07e0, + 0x6027200c, + 0x00c87027, + 0x07412742, + 0x27b03bb4, + 0x3ba20721, + 0xa730a7ae, + 0x4b3a0b40, + 0x8b3c8b4b, + 0xc634ab4d, + 0x27612734, + 0x4000c870, + 0x805b8d07, + 0x9e5b9d07, + 0x2c274707, + 0xab36073c, + 0xab212b49, + 0x45f33538, + 0x5ef225f4, + 0x3c27ff5a, + 0x2b412720, + 0x5bb4073e, + 0x27b91eb3, + 0x412b204c, + 0x3d072c07, + 0x313b245b, + 0xf34532ab, + 0x27ff745e, + 0x4e2b204c, + 0x8c073d07, + 0x8e5b343b, + 0xb51e83ab, + 0x0088fe4e, + 0x1013100c, + 0xfe0e2127, + 0x00004e9e, + 0x10680013, + 0x44be2127, + 0x00130000, + 0x1013fe8e, + 0xfd4ef31e, + 0x271200c8, + 0x1410c8d0, + 0x2cbe2027, + 0xd4860000, + 0xfd8e0013, + 0xd1270013, + 0x13ee10cc, + 0xd6412710, + 0x1ed407d4, + 0x074027e4, + 0x27de1ed4, + 0x00099e21, + 0x9e202700, + 0x4e000003, + 0x3601c2fe, + 0x273310c8, + 0x203c2741, + 0x44471147, + 0xf02101c2, + 0x302707f3, + 0xfe8e26e6, + 0x27ee10cc, + 0x2b012a30, + 0x5334ab01, + 0xd6115341, + 0x0721b642, + 0x66fe8e03, + 0x1e302740, + 0x274127e9, + 0xd4e31e30, + 0x0100000e, + 0x000dd417, + 0x30273a01, + 0x00f9035b, + 0x0001acc8, + 0x1b204c27, + 0xb0fe0b04, + 0x0000000f, + 0x183c2701, + 0x00f9035b, + 0x0001acc8, + 0x041b4827, + 0x4c27fe0b, + 0x5b340710, + 0xc800f903, + 0x1b0001ac, + 0x27fe0b04, + 0xf9035b38, + 0x01acc800, + 0x184c2700, + 0xfe0b041b, + 0x4fff1ea7, + 0x9b1401fd, + 0x4103122f, + 0x13c14433, + 0x2e24ab38, + 0x0b002732, + 0xc5f3abfe, + 0x14c13812, + 0xf842ce38, + 0x0127f3eb, + 0xfe4efe0b, + 0x0576d33e, + 0x0e200c27, + 0x00059efe, + 0x4efe8e00, + 0xbeb007fb, + 0x07fead43, + 0x931007d0, + 0x0046b7f0, + 0xffcb56be, + 0xc027d746, + 0xd2010b1e, + 0x48bec103, + 0xd403ffcb, + 0xf0931c07, + 0xda0046a9, + 0xfb8eedcb, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x42746e49, + 0x0a3a6675, + 0x6c202000, + 0x5f32676f, + 0x65676170, + 0x7a69735f, + 0x20202065, + 0x5f6d756e, + 0x65676170, + 0x66282073, + 0x29656572, + 0x2020000a, + 0x30252020, + 0x20206432, + 0x20202020, + 0x20202020, + 0x35252020, + 0x28202064, + 0x62206425, + 0x73657479, + 0x55000a29, + 0x6f6c626e, + 0x6e696b63, + 0x65722067, + 0x657a6973, + 0x25203a73, + 0x54000a64, + 0x6c61746f, + 0x6c6c6120, + 0x7461636f, + 0x25206465, + 0x28206438, + 0x64657375, + 0x2c642520, + 0x666e7520, + 0x61656572, + 0x20656c62, + 0x202c6425, + 0x65657266, + 0x29642520, + 0x656e000a, + 0x705f7478, + 0x745f6369, + 0x61705f6f, + 0x20657372, + 0x20202020, + 0x000a7525, + 0x6d726946, + 0x65726177, + 0x72657620, + 0x6e6f6973, + 0x656f6420, + 0x6f6e2073, + 0x616d2074, + 0x20686374, + 0x64726168, + 0x65726177, + 0x46000a21, + 0x776d7269, + 0x20657261, + 0x706d6f63, + 0x64656c69, + 0x726f6620, + 0x72657620, + 0x6e6f6973, + 0x25783020, + 0x0a783830, + 0x72614800, + 0x72617764, + 0x65722065, + 0x74726f70, + 0x20202073, + 0x76202020, + 0x69737265, + 0x30206e6f, + 0x38302578, + 0x46000a78, + 0x776d7269, + 0x20657261, + 0x73726576, + 0x206e6f69, + 0x73656f64, + 0x746f6e20, + 0x74616d20, + 0x68206863, + 0x77647261, + 0x20657261, + 0x73726576, + 0x006e6f69, + 0x64726168, + 0x65726177, + 0x656f6420, + 0x6f6e2073, + 0x75732074, + 0x726f7070, + 0x6e652074, + 0x69646f63, + 0x6800676e, + 0x77647261, + 0x20657261, + 0x73656f64, + 0x746f6e20, + 0x70757320, + 0x74726f70, + 0x76656820, + 0x454c0063, + 0x5254435f, + 0x78253a4c, + 0x434e202c, + 0x5345524f, + 0x2c78253a, + 0x43494c20, + 0x524f435f, + 0x554e5f45, + 0x64253a4d, + 0x5748202c, + 0x524f435f, + 0x554e5f45, + 0x64253a4d, + 0x69000a20, + 0x6c61766e, + 0x68206469, + 0x77647261, + 0x20657261, + 0x65726f63, + 0x6d756e20, + 0x73726562, + 0x756e203a, + 0x7265626d, + 0x20666f20, + 0x64726168, + 0x20657261, + 0x65726f63, + 0x20736920, + 0x656c6c69, + 0x006c6167, + 0x65666552, + 0x636e6572, + 0x69702065, + 0x72757463, + 0x61742065, + 0x0a656c62, + 0x20646900, + 0x73203a20, + 0x75206174, + 0x72206573, + 0x70206665, + 0x70203179, + 0x63203279, + 0x6620706d, + 0x6d20746d, + 0x705f6962, + 0x20207274, + 0x5f69626d, + 0x65676170, + 0x69732873, + 0x2029657a, + 0x72747020, + 0x706f7420, + 0x746f623a, + 0x3325000a, + 0x203a2064, + 0x20643325, + 0x20643325, + 0x20643325, + 0x20643325, + 0x20643325, + 0x20643325, + 0x20643325, + 0x20207025, + 0x64362520, + 0x29642528, + 0x25202020, + 0x70253a70, + 0x694c000a, + 0x70206576, + 0x75746369, + 0x74206572, + 0x656c6261, + 0x754e000a, + 0x203a206d, + 0x20206425, + 0x646c4f20, + 0x20747365, + 0x000a6425, + 0x20786469, + 0x7473203a, + 0x73752061, + 0x69702065, + 0x20646963, + 0x69666572, + 0x696c2064, + 0x7973656e, + 0x7220636e, + 0x20206665, + 0x6576696c, + 0x73666572, + 0x20202020, + 0x66657220, + 0x63697032, + 0x3325000a, + 0x203a2064, + 0x20643325, + 0x20643325, + 0x33252020, + 0x20202064, + 0x20643325, + 0x36252020, + 0x33252064, + 0x30202064, + 0x38302578, + 0x33252078, + 0x33252064, + 0x33252064, + 0x33252064, + 0x33252064, + 0x33252064, + 0x33252064, + 0x33252064, + 0x33252064, + 0x33252064, + 0x33252064, + 0x33252064, + 0x33252064, + 0x33252064, + 0x33252064, + 0x33252064, + 0x50000a64, + 0x61766972, + 0x72206574, + 0x61626665, + 0x203a6b6e, + 0x6f6c6f63, + 0x78302072, + 0x6d207825, + 0x625f7861, + 0x65666675, + 0x25207372, + 0x626d2075, + 0x75252077, + 0x68626d20, + 0x20752520, + 0x65736162, + 0x6464615f, + 0x78302072, + 0x78383025, + 0x2020000a, + 0x78646920, + 0x61747320, + 0x66657220, + 0x6464615f, + 0x20202072, + 0x2077626d, + 0x68626d20, + 0x2020000a, + 0x75332520, + 0x75332520, + 0x25783020, + 0x0a783830, + 0x6e652800, + 0x666f2064, + 0x69727020, + 0x65746176, + 0x66657220, + 0x6b6e6162, + 0x6d756420, + 0x000a2970, + 0x45444956, + 0x5746204f, + 0x41545320, + 0x44204554, + 0x20504d55, + 0x6f636e45, + 0x3d726564, + 0x43564548, + 0x6573000a, + 0x706f2d74, + 0x72702074, + 0x6c69666f, + 0x3a676e69, + 0x67726120, + 0x73756d20, + 0x65622074, + 0x6f203020, + 0x00312072, + 0x2d746573, + 0x2074706f, + 0x61637365, + 0x676e6970, + 0x7261203a, + 0x756d2067, + 0x62207473, + 0x20302065, + 0x3120726f, + 0x74657300, + 0x74706f2d, + 0x6c616e20, + 0x6f662075, + 0x74616d72, + 0x6e55203a, + 0x776f6e6b, + 0x6f66206e, + 0x74616d72, + 0x74657300, + 0x74706f2d, + 0x6c616e20, + 0x6f662075, + 0x74616d72, + 0x6e55203a, + 0x70707573, + 0x6574726f, + 0x6f662064, + 0x74616d72, + 0x74657300, + 0x74706f2d, + 0x70786520, + 0x2065736f, + 0x20666572, + 0x6d617266, + 0x203a7365, + 0x20677261, + 0x7473756d, + 0x20656220, + 0x726f2030, + 0x73003120, + 0x6f2d7465, + 0x65207470, + 0x736f7078, + 0x65722065, + 0x72662066, + 0x73656d61, + 0x6f4e203a, + 0x75732074, + 0x726f7070, + 0x20646574, + 0x20726f66, + 0x746f7270, + 0x65746365, + 0x65732064, + 0x6f697373, + 0x7300736e, + 0x6f2d7465, + 0x64207470, + 0x65666669, + 0x746e6572, + 0x72747320, + 0x206d6165, + 0x64746962, + 0x68747065, + 0x6f6e2073, + 0x75732074, + 0x726f7070, + 0x00646574, + 0x2d746573, + 0x2074706f, + 0x6f636e65, + 0x73206564, + 0x61657274, + 0x6962206d, + 0x70656474, + 0x203a6874, + 0x75736e75, + 0x726f7070, + 0x20646574, + 0x756c6176, + 0x65730065, + 0x706f2d74, + 0x68632074, + 0x616d6f72, + 0x726f665f, + 0x3b74616d, + 0x72686320, + 0x20616d6f, + 0x6d726f66, + 0x6e207461, + 0x7320746f, + 0x6f707075, + 0x64657472, + 0x6573002e, + 0x706f2d74, + 0x626d2074, + 0x6f666e69, + 0x74756f20, + 0x3a747570, + 0x67726120, + 0x73756d20, + 0x65622074, + 0x6f203020, + 0x00312072, + 0x2d746573, + 0x2074706f, + 0x7320766d, + 0x63726165, + 0x61722068, + 0x3a65676e, + 0x766e6920, + 0x64696c61, + 0x61207820, + 0x73006772, + 0x6f2d7465, + 0x6d207470, + 0x65732076, + 0x68637261, + 0x6e617220, + 0x203a6567, + 0x61766e69, + 0x2064696c, + 0x72612079, + 0x65730067, + 0x706f2d74, + 0x626d2074, + 0x70797420, + 0x49203a65, + 0x6c61766e, + 0x69206469, + 0x6172746e, + 0x6c657320, + 0x69746365, + 0x73006e6f, + 0x6f2d7465, + 0x6d207470, + 0x79742062, + 0x203a6570, + 0x61766e49, + 0x2064696c, + 0x65746e69, + 0x65732072, + 0x7463656c, + 0x006e6f69, + 0x2d746573, + 0x2074706f, + 0x20424752, + 0x59206f74, + 0x203a5655, + 0x75736e75, + 0x726f7070, + 0x20646574, + 0x65646f6d, + 0x74657300, + 0x74706f2d, + 0x736f6820, + 0x72702074, + 0x636f746f, + 0x70206c6f, + 0x746e6972, + 0x61203a73, + 0x6d206772, + 0x20747375, + 0x30206562, + 0x20726f20, + 0x65730031, + 0x706f2d74, + 0x4f472074, + 0x79742050, + 0x203a6570, + 0x75736e55, + 0x726f7070, + 0x20646574, + 0x65707974, + 0x74657300, + 0x74706f2d, + 0x504f4720, + 0x70797420, + 0x69203a65, + 0x6c61766e, + 0x73006469, + 0x6f2d7465, + 0x47207470, + 0x7420504f, + 0x3a657079, + 0x766e6920, + 0x64696c61, + 0x504f4720, + 0x7a697320, + 0x65530065, + 0x6e69646e, + 0x4f4a2067, + 0x45445f42, + 0x55455551, + 0x000a4445, + 0x6e6f7257, + 0x69732067, + 0x6f20657a, + 0x75622066, + 0x72656666, + 0x7261705f, + 0x665f6d61, + 0x656d6172, + 0x7461725f, + 0x65730065, + 0x706f2d74, + 0x72662074, + 0x20656d61, + 0x65746172, + 0x6e75203a, + 0x70707573, + 0x6574726f, + 0x72612064, + 0x72570067, + 0x20676e6f, + 0x657a6973, + 0x20666f20, + 0x66667562, + 0x70207265, + 0x6d617261, + 0x74617220, + 0x6f635f65, + 0x6f72746e, + 0x6c42006c, + 0x206b636f, + 0x666e6f63, + 0x72756769, + 0x6f697461, + 0x5228206e, + 0x6f20494f, + 0x6f522072, + 0x63202977, + 0x6f6e6e61, + 0x65732074, + 0x50512074, + 0x676f7420, + 0x65687465, + 0x69772072, + 0x72206874, + 0x20657461, + 0x746e6f63, + 0x006c6f72, + 0x2d746573, + 0x2074706f, + 0x20746962, + 0x65746172, + 0x6f66203a, + 0x79742072, + 0x4f206570, + 0x202c4646, + 0x67726174, + 0x72207465, + 0x20657461, + 0x756f6873, + 0x6220646c, + 0x657a2065, + 0x73006f72, + 0x6f2d7465, + 0x62207470, + 0x72207469, + 0x3a657461, + 0x736e7520, + 0x6f707075, + 0x64657472, + 0x78616d20, + 0x74696220, + 0x65746172, + 0x74657300, + 0x74706f2d, + 0x74696220, + 0x74617220, + 0x75203a65, + 0x7075736e, + 0x74726f70, + 0x74206465, + 0x65677261, + 0x61722074, + 0x57006574, + 0x676e6f72, + 0x7a697320, + 0x666f2065, + 0x66756220, + 0x20726566, + 0x61726170, + 0x6f66206d, + 0x61722072, + 0x63206574, + 0x72746e6f, + 0x48206c6f, + 0x62204452, + 0x65666675, + 0x69732072, + 0x5500657a, + 0x7075736e, + 0x74726f70, + 0x48206465, + 0x62204452, + 0x65666675, + 0x69732072, + 0x202c657a, + 0x7473756d, + 0x20656220, + 0x31203d3e, + 0x636e4500, + 0x2065646f, + 0x61726170, + 0x7266206d, + 0x20656d61, + 0x6b636170, + 0x3b676e69, + 0x7a697320, + 0x6f742065, + 0x6d73206f, + 0x2e6c6c61, + 0x636e4500, + 0x2065646f, + 0x61726170, + 0x7266206d, + 0x20656d61, + 0x6b636170, + 0x3b676e69, + 0x6e616320, + 0x6c6e6f20, + 0x65622079, + 0x74657320, + 0x726f6620, + 0x65687420, + 0x72696620, + 0x66207473, + 0x656d6172, + 0x6e45002e, + 0x65646f63, + 0x72617020, + 0x63206d61, + 0x756f6c6f, + 0x65642072, + 0x69726373, + 0x6f697470, + 0x73203b6e, + 0x20657a69, + 0x206f6f74, + 0x6c616d73, + 0x45002e6c, + 0x646f636e, + 0x61702065, + 0x206d6172, + 0x72657375, + 0x74616420, + 0x65722061, + 0x74736967, + 0x64657265, + 0x6973203a, + 0x7420657a, + 0x73206f6f, + 0x6c6c616d, + 0x6e45002e, + 0x65646f63, + 0x72617020, + 0x67206d61, + 0x7220706f, + 0x74657365, + 0x6f6e203a, + 0x75732074, + 0x726f7070, + 0x20646574, + 0x20726f66, + 0x72662d62, + 0x73656d61, + 0x6e45002e, + 0x65646f63, + 0x72617020, + 0x72206d61, + 0x74657365, + 0x706f6720, + 0x6e796420, + 0x63696d61, + 0x6973203a, + 0x6920657a, + 0x72772073, + 0x2e676e6f, + 0x636e4500, + 0x2065646f, + 0x61726170, + 0x6f67206d, + 0x65722070, + 0x20746573, + 0x616e7964, + 0x6163696d, + 0x3a796c6c, + 0x746f6e20, + 0x70757320, + 0x74726f70, + 0x66206465, + 0x6220726f, + 0x6172662d, + 0x2e73656d, + 0x636e4500, + 0x2065646f, + 0x61726170, + 0x6e65206d, + 0x74732063, + 0x20737461, + 0x6973203a, + 0x6920657a, + 0x72772073, + 0x2e676e6f, + 0x636e4500, + 0x2065646f, + 0x61726170, + 0x6572206d, + 0x6e6f6967, + 0x73203a73, + 0x20657a69, + 0x206f6f74, + 0x6c616d73, + 0x45002e6c, + 0x646f636e, + 0x61702065, + 0x206d6172, + 0x69676572, + 0x3a736e6f, + 0x6d756e20, + 0x20726562, + 0x7220666f, + 0x6f696765, + 0x6320736e, + 0x6f6e6e61, + 0x78652074, + 0x64656563, + 0x00363120, + 0x6f636e45, + 0x70206564, + 0x6d617261, + 0x67657220, + 0x736e6f69, + 0x6163203a, + 0x746f6e6e, + 0x20656220, + 0x64657375, + 0x676f7420, + 0x65687465, + 0x69772072, + 0x72206874, + 0x6220776f, + 0x64657361, + 0x6f6c6220, + 0x63206b63, + 0x69666e6f, + 0x61727567, + 0x6e6f6974, + 0x6e450073, + 0x65646f63, + 0x72617020, + 0x63206d61, + 0x676e6168, + 0x65722065, + 0x6e617463, + 0x73656c67, + 0x6973203a, + 0x7420657a, + 0x73206f6f, + 0x6c6c616d, + 0x6e45002e, + 0x65646f63, + 0x72617020, + 0x63206d61, + 0x676e6168, + 0x65722065, + 0x6e617463, + 0x73656c67, + 0x756e203a, + 0x7265626d, + 0x20666f20, + 0x69676572, + 0x20736e6f, + 0x6e6e6163, + 0x6520746f, + 0x65656378, + 0x00322064, + 0x6f636e45, + 0x70206564, + 0x6d617261, + 0x61686320, + 0x2065676e, + 0x74636572, + 0x6c676e61, + 0x203a7365, + 0x61766e69, + 0x2064696c, + 0x726f6f63, + 0x616e6964, + 0x00736574, + 0x5f45564d, + 0x46465542, + 0x475f5245, + 0x52454e45, + 0x545f4c41, + 0x5f455059, + 0x434f4c42, + 0x4f435f4b, + 0x4749464e, + 0x6d203a53, + 0x61737365, + 0x73206567, + 0x20657a69, + 0x206f6f74, + 0x6c616d73, + 0x4d002e6c, + 0x425f4556, + 0x45464655, + 0x45475f52, + 0x4152454e, + 0x59545f4c, + 0x425f4550, + 0x4b434f4c, + 0x4e4f435f, + 0x53474946, + 0x776f7220, + 0x6e752073, + 0x706d6f63, + 0x6163203a, + 0x746f6e6e, + 0x20656220, + 0x64657375, + 0x676f7420, + 0x65687465, + 0x69772072, + 0x72206874, + 0x6f696765, + 0x666f2d6e, + 0x746e692d, + 0x73657265, + 0x564d0074, + 0x55425f45, + 0x52454646, + 0x4e45475f, + 0x4c415245, + 0x5059545f, + 0x4c425f45, + 0x5f4b434f, + 0x464e4f43, + 0x3a534749, + 0x736e7520, + 0x6f707075, + 0x64657472, + 0x6f6c6220, + 0x63206b63, + 0x69666e6f, + 0x79742067, + 0x4d006570, + 0x425f4556, + 0x45464655, + 0x45475f52, + 0x4152454e, + 0x73203a4c, + 0x20657a69, + 0x206f6f74, + 0x6c616d73, + 0x6f74206c, + 0x61657220, + 0x65682064, + 0x72656461, + 0x564d002e, + 0x55425f45, + 0x52454646, + 0x4e45475f, + 0x4c415245, + 0x7562203a, + 0x72656666, + 0x696f7020, + 0x7265746e, + 0x20736920, + 0x4c4c554e, + 0x564d002e, + 0x55425f45, + 0x52454646, + 0x4e45475f, + 0x4c415245, + 0x7562203a, + 0x72656666, + 0x7a697320, + 0x73692065, + 0x72657a20, + 0x4d002e6f, + 0x425f4556, + 0x45464655, + 0x45475f52, + 0x4152454e, + 0x63203a4c, + 0x69666e6f, + 0x69732067, + 0x6920657a, + 0x657a2073, + 0x002e6f72, + 0x5f45564d, + 0x46465542, + 0x475f5245, + 0x52454e45, + 0x545f4c41, + 0x5f455059, + 0x434f4c42, + 0x4f435f4b, + 0x4749464e, + 0x61203a53, + 0x66756220, + 0x20726566, + 0x20736168, + 0x65726c61, + 0x20796461, + 0x6e656562, + 0x6e657320, + 0x6f662074, + 0x68742072, + 0x70207369, + 0x75746369, + 0x002e6572, + 0x5f45564d, + 0x46465542, + 0x475f5245, + 0x52454e45, + 0x203a4c41, + 0x75736e75, + 0x726f7070, + 0x20646574, + 0x65707974, + 0x206e6920, + 0x5f45564d, + 0x4d4d4f43, + 0x4655425f, + 0x514e495f, + 0x4444415f, + 0x4d002e52, + 0x425f4556, + 0x45464655, + 0x45475f52, + 0x4152454e, + 0x59545f4c, + 0x425f4550, + 0x4b434f4c, + 0x4e4f435f, + 0x53474946, + 0x776f7220, + 0x6e752073, + 0x706d6f63, + 0x5f6e203a, + 0x736c6f63, + 0x656f6420, + 0x6f6e2073, + 0x616d2074, + 0x20686374, + 0x20656874, + 0x74636970, + 0x20657275, + 0x74646977, + 0x564d0068, + 0x55425f45, + 0x52454646, + 0x4e45475f, + 0x4c415245, + 0x5059545f, + 0x4c425f45, + 0x5f4b434f, + 0x464e4f43, + 0x20534749, + 0x73776f72, + 0x636e7520, + 0x3a706d6f, + 0x725f6e20, + 0x2073776f, + 0x73656f64, + 0x746f6e20, + 0x74616d20, + 0x74206863, + 0x70206568, + 0x75746369, + 0x68206572, + 0x68676965, + 0x72570074, + 0x20676e6f, + 0x657a6973, + 0x20666f20, + 0x66667562, + 0x70207265, + 0x6d617261, + 0x74617220, + 0x6f632065, + 0x6f72746e, + 0x7071206c, + 0x6f6c4200, + 0x63206b63, + 0x69666e6f, + 0x61727567, + 0x6e6f6974, + 0x4f522820, + 0x726f2049, + 0x776f5220, + 0x61632029, + 0x746f6e6e, + 0x74657320, + 0x20505120, + 0x65676f74, + 0x72656874, + 0x74697720, + 0x50512068, + 0x502c4920, + 0x7300422c, + 0x6f2d7465, + 0x71207470, + 0x55203a70, + 0x6f6e6b6e, + 0x66206e77, + 0x656d6172, + 0x70797420, + 0x72570065, + 0x20676e6f, + 0x657a6973, + 0x20666f20, + 0x66667562, + 0x70207265, + 0x6d617261, + 0x74617220, + 0x6f635f65, + 0x6f72746e, + 0x61705f6c, + 0x206d6172, + 0x00294928, + 0x636f6c42, + 0x6f63206b, + 0x6769666e, + 0x74617275, + 0x206e6f69, + 0x494f5228, + 0x20726f20, + 0x29776f52, + 0x6e616320, + 0x20746f6e, + 0x20746573, + 0x74205051, + 0x7465676f, + 0x20726568, + 0x68746977, + 0x74617220, + 0x6f632065, + 0x6f72746e, + 0x6170206c, + 0x736d6172, + 0x74657300, + 0x74706f2d, + 0x74617220, + 0x6f632065, + 0x6f72746e, + 0x6170206c, + 0x3a6d6172, + 0x5f707120, + 0x206e696d, + 0x6e6e6163, + 0x6520746f, + 0x65656378, + 0x70712064, + 0x78616d5f, + 0x29492820, + 0x6f725700, + 0x7320676e, + 0x20657a69, + 0x6220666f, + 0x65666675, + 0x61702072, + 0x206d6172, + 0x65746172, + 0x6e6f635f, + 0x6c6f7274, + 0x7261705f, + 0x73006d61, + 0x6f2d7465, + 0x72207470, + 0x20657461, + 0x746e6f63, + 0x206c6f72, + 0x61726170, + 0x71203a6d, + 0x696d5f70, + 0x6163206e, + 0x746f6e6e, + 0x63786520, + 0x20646565, + 0x6d5f7071, + 0x45007861, + 0x646f636e, + 0x61702065, + 0x206d6172, + 0x203b7071, + 0x657a6973, + 0x6f6f7420, + 0x616d7320, + 0x002e6c6c, + 0x6f636e45, + 0x70206564, + 0x6d617261, + 0x72706520, + 0x7266695f, + 0x5f656d61, + 0x62616e65, + 0x7620656c, + 0x65756c61, + 0x73756d20, + 0x65622074, + 0x6f203020, + 0x2e312072, + 0x45564d00, + 0x4655425f, + 0x5f524546, + 0x41524150, + 0x6973204d, + 0x7420657a, + 0x73206f6f, + 0x6c6c616d, + 0x6e55002e, + 0x70707573, + 0x6574726f, + 0x6e652064, + 0x65646f63, + 0x72617020, + 0x69206d61, + 0x564d206e, + 0x4f435f45, + 0x425f4d4d, + 0x495f4655, + 0x415f514e, + 0x2e524444, + 0x206f6400, + 0x20746f6e, + 0x62616e65, + 0x5320656c, + 0x77204f41, + 0x206e6568, + 0x464e4f43, + 0x414d4749, + 0x455f4b53, + 0x69204951, + 0x61662073, + 0x0065736c, + 0x206f6f74, + 0x6c616d73, + 0x5248206c, + 0x75622044, + 0x72656666, + 0x7a697320, + 0x2a2a0065, + 0x25202a2a, + 0x2a2a2073, + 0x50202a2a, + 0x30203a43, + 0x20782578, + 0x52532020, + 0x7830203a, + 0x20207825, + 0x52414620, + 0x7830203a, + 0x000a7825, + 0x255b5220, + 0x205d6432, + 0x7830203d, + 0x78383025, + 0x6d20000a, + 0x65747361, + 0x25232072, + 0x73252064, + 0x6f626120, + 0x64657472, + 0x2020000a, + 0x55414620, + 0x203a544c, + 0x78257830, + 0x2020000a, + 0x44414620, + 0x203a5244, + 0x78257830, + 0x4157000a, + 0x44484354, + 0x6920474f, + 0x52007172, + 0x20435341, + 0x524f4241, + 0x4d4d0054, + 0x42412055, + 0x0054524f, + 0x2a2a2a2a, + 0x53415220, + 0x20642543, + 0x524f4241, + 0x2a2a2054, + 0x000a2a2a, + 0x43502020, + 0x20202020, + 0x7830203d, + 0x78383025, + 0x2020000a, + 0x20205253, + 0x203d2020, + 0x30257830, + 0x000a7838, + 0x41462020, + 0x20202052, + 0x7830203d, + 0x78383025, + 0x2020000a, + 0x32255b52, + 0x3d205d64, + 0x25783020, + 0x0a783830, + 0x74615700, + 0x6f646863, + 0x79440067, + 0x696d616e, + 0x68632063, + 0x65676e61, + 0x206e6920, + 0x20656874, + 0x626d756e, + 0x6f207265, + 0x6f632066, + 0x20736572, + 0x6e207369, + 0x7320746f, + 0x6f707075, + 0x64657472, + 0x74657300, + 0x74706f2d, + 0x66207020, + 0x656d6172, + 0x49203a73, + 0x6c61766e, + 0x61206469, + 0x6d756772, + 0x00746e65, + 0x2d746573, + 0x2074706f, + 0x72462050, + 0x73656d61, + 0x6e69203a, + 0x696c6176, + 0x4f472064, + 0x69732050, + 0x7300657a, + 0x6f2d7465, + 0x42207470, + 0x61724620, + 0x3a73656d, + 0x766e6920, + 0x64696c61, + 0x504f4720, + 0x7a697320, + 0x65730065, + 0x706f2d74, + 0x20422074, + 0x6d617266, + 0x203a7365, + 0x20746f4e, + 0x70707573, + 0x6574726f, + 0x6f640064, + 0x746f6e20, + 0x70757320, + 0x74726f70, + 0x5f454d20, + 0x5f454d46, + 0x49425543, + 0x45525f43, + 0x6e752053, + 0x20726564, + 0x464e4f43, + 0x414d4749, + 0x455f4b53, + 0x69204951, + 0x61662073, + 0x0065736c, + 0x69206f4e, + 0x7562746e, + 0x70732066, + 0x20656361, + 0x20726f66, + 0x7473616d, + 0x73207265, + 0x20657661, + 0x61657261, + 0x6e655300, + 0x676e6964, + 0x49575320, + 0x45484354, + 0x4e495f44, + 0x6553000a, + 0x6e69646e, + 0x52502067, + 0x5345434f, + 0x0a444553, + 0x63655200, + 0x65766965, + 0x57532064, + 0x48435449, + 0x6552000a, + 0x76696563, + 0x4a206465, + 0x6620424f, + 0x7367616c, + 0x2075253d, + 0x6d617266, + 0x253d7365, + 0x6f632075, + 0x3d736572, + 0x000a7525, + 0x20626f4a, + 0x7373656d, + 0x3a656761, + 0x6d754e20, + 0x20726562, + 0x6320666f, + 0x7365726f, + 0x6e616320, + 0x746f6e20, + 0x20656220, + 0x6f72657a, + 0x6f4a002e, + 0x656d2062, + 0x67617373, + 0x4e203a65, + 0x65626d75, + 0x666f2072, + 0x726f6320, + 0x74207365, + 0x6c206f6f, + 0x65677261, + 0x6f4a002e, + 0x656d2062, + 0x67617373, + 0x55203a65, + 0x7075736e, + 0x74726f70, + 0x66206465, + 0x7367616c, + 0x74657320, + 0x6f4a002e, + 0x656d2062, + 0x67617373, + 0x4e203a65, + 0x65626d75, + 0x666f2072, + 0x61726620, + 0x2073656d, + 0x206f6f74, + 0x6772616c, + 0x6e002e65, + 0x7073206f, + 0x20656361, + 0x6a206e69, + 0x7120626f, + 0x65756575, + 0x54455300, + 0x54504f5f, + 0x204e4f49, + 0x6c696166, + 0x203a6465, + 0x000a7325, + 0x2f355600, + 0x482d3756, + 0x45435645, + 0x203a434e, + 0x63655200, + 0x65766569, + 0x45532064, + 0x504f5f54, + 0x4e4f4954, + 0x74616420, + 0x69735f61, + 0x2520657a, + 0x706f2075, + 0x6e695f74, + 0x20786564, + 0x61207525, + 0x30206772, + 0x38302578, + 0x53000a78, + 0x69737365, + 0x6f206e6f, + 0x6f697470, + 0x6320736e, + 0x6f206e61, + 0x20796c6e, + 0x63206562, + 0x676e6168, + 0x69206465, + 0x5453206e, + 0x4550504f, + 0x74732044, + 0x2e657461, + 0x636e6500, + 0x6f61735f, + 0x616e6520, + 0x20656c62, + 0x206e6163, + 0x20746f6e, + 0x20657375, + 0x00776f6e, + 0x2d746573, + 0x2074706f, + 0x645f7071, + 0x61746c65, + 0x705f695f, + 0x6e55203a, + 0x70707573, + 0x6574726f, + 0x61762064, + 0x0065756c, + 0x2d746573, + 0x2074706f, + 0x645f7071, + 0x61746c65, + 0x705f695f, + 0x6156203a, + 0x2065756c, + 0x206f6f74, + 0x00676962, + 0x2d746573, + 0x2074706f, + 0x645f7071, + 0x61746c65, + 0x625f695f, + 0x6665725f, + 0x6e55203a, + 0x70707573, + 0x6574726f, + 0x61762064, + 0x0065756c, + 0x2d746573, + 0x2074706f, + 0x645f7071, + 0x61746c65, + 0x625f695f, + 0x6665725f, + 0x6156203a, + 0x2065756c, + 0x206f6f74, + 0x00676962, + 0x2d746573, + 0x2074706f, + 0x65786966, + 0x50512064, + 0x6e75203a, + 0x70707573, + 0x6574726f, + 0x61762064, + 0x0065756c, + 0x62616e65, + 0x765f656c, + 0x61757369, + 0x61203a6c, + 0x72206772, + 0x65676e61, + 0x73756d20, + 0x65622074, + 0x6f726620, + 0x2030206d, + 0x33206f74, + 0x65730031, + 0x706f2d74, + 0x616d2074, + 0x756e5f78, + 0x6f635f6d, + 0x3a736572, + 0x766e4920, + 0x64696c61, + 0x6c617620, + 0x73006575, + 0x655f7465, + 0x735f636e, + 0x6c5f6f61, + 0x5f616d75, + 0x203a6e65, + 0x20677261, + 0x7473756d, + 0x20656220, + 0x726f2030, + 0x73003120, + 0x655f7465, + 0x735f636e, + 0x635f6f61, + 0x6d6f7268, + 0x6e655f61, + 0x7261203a, + 0x756d2067, + 0x62207473, + 0x20302065, + 0x3120726f, + 0x6f617300, + 0x6e657020, + 0x79746c61, + 0x7261203a, + 0x61722067, + 0x2065676e, + 0x7473756d, + 0x20656220, + 0x6d6f7266, + 0x74203020, + 0x3133206f, + 0x74657300, + 0x636e655f, + 0x656d665f, + 0x6369625f, + 0x63696275, + 0x7369645f, + 0x7261203a, + 0x756d2067, + 0x62207473, + 0x20302065, + 0x3120726f, + 0x6c2d2d00, + 0x6d5f7274, + 0x2065646f, + 0x7473756d, + 0x20656220, + 0x6c206562, + 0x20737365, + 0x6e616874, + 0x52544c20, + 0x444f4d5f, + 0x55535f45, + 0x524f5050, + 0x554e5f54, + 0x2d2d004d, + 0x5f72746c, + 0x65646f6d, + 0x6e616320, + 0x746f6e20, + 0x6e6f6320, + 0x20676966, + 0x68746977, + 0x722d2d20, + 0x725f6665, + 0x6e655f62, + 0x2d003120, + 0x72746c2d, + 0x7265705f, + 0x20646f69, + 0x206e6163, + 0x20746f6e, + 0x666e6f63, + 0x77206769, + 0x20687469, + 0x65722d2d, + 0x62725f66, + 0x206e655f, + 0x61660031, + 0x74206c69, + 0x6573206f, + 0x6e652074, + 0x74735f63, + 0x5f737461, + 0x65646f6d, + 0x7261203a, + 0x756d2067, + 0x62207473, + 0x6e692065, + 0x2c305b20, + 0x005d3720, + 0x45535341, + 0x20285452, + 0x3e206425, + 0x696d203d, + 0x665f696e, + 0x656d6172, + 0x78616d5f, + 0x6765735f, + 0x746e656d, + 0x2c292073, + 0x6f6f7420, + 0x67696220, + 0x6e696d20, + 0x72665f69, + 0x5f656d61, + 0x5f78616d, + 0x6d676573, + 0x73746e65, + 0x29642528, + 0x73002120, + 0x655f7465, + 0x735f636e, + 0x6d5f7465, + 0x69746c75, + 0x7370735f, + 0x7370705f, + 0x7261203a, + 0x756d2067, + 0x62207473, + 0x20302065, + 0x3120726f, + 0x722d2d00, + 0x725f6665, + 0x6e655f62, + 0x63203120, + 0x6e206e61, + 0x6320746f, + 0x69666e6f, + 0x69772067, + 0x2d206874, + 0x72746c2d, + 0x646f6d5f, + 0x65730065, + 0x706f2d74, + 0x65682074, + 0x6e656376, + 0x55203a63, + 0x7075736e, + 0x74726f70, + 0x6f206465, + 0x6f697470, + 0x6e69206e, + 0x00786564, + 0x2d746573, + 0x3a74706f, + 0x736e5520, + 0x6f707075, + 0x64657472, + 0x56454820, + 0x72702043, + 0x6c69666f, + 0x65730065, + 0x706f2d74, + 0x55203a74, + 0x7075736e, + 0x74726f70, + 0x48206465, + 0x20435645, + 0x6576656c, + 0x6573006c, + 0x706f2d74, + 0x65682074, + 0x6e656376, + 0x63203a63, + 0x74736e6f, + 0x70692072, + 0x20646572, + 0x7473756d, + 0x20656220, + 0x726f2030, + 0x73003120, + 0x6f2d7465, + 0x68207470, + 0x65637665, + 0x203a636e, + 0x72746e65, + 0x2079706f, + 0x636e7973, + 0x73756d20, + 0x65622074, + 0x6f203020, + 0x00312072, + 0x2d746573, + 0x2074706f, + 0x63766568, + 0x3a636e65, + 0x6e616320, + 0x746f6e20, + 0x76616820, + 0x6e652065, + 0x706f7274, + 0x79735f79, + 0x2620636e, + 0x69742026, + 0x725f656c, + 0x2173776f, + 0x7300303d, + 0x6f2d7465, + 0x68207470, + 0x65637665, + 0x203a636e, + 0x706d6574, + 0x6c61726f, + 0x70766d20, + 0x73756d20, + 0x65622074, + 0x6f203020, + 0x00312072, + 0x2d746573, + 0x2074706f, + 0x63766568, + 0x3a636e65, + 0x73756d20, + 0x61682074, + 0x30206576, + 0x74203c20, + 0x5f656c69, + 0x736c6f63, + 0x203d3c20, + 0x65730031, + 0x706f2d74, + 0x65682074, + 0x6e656376, + 0x6d203a63, + 0x20747375, + 0x65766168, + 0x3c203020, + 0x6c697420, + 0x6f725f65, + 0x3c207377, + 0x3232203d, + 0x74657300, + 0x74706f2d, + 0x76656820, + 0x636e6563, + 0x696d203a, + 0x756c206e, + 0x6320616d, + 0x69732062, + 0x6d20657a, + 0x20747375, + 0x38206562, + 0x20726f20, + 0x73003631, + 0x6f2d7465, + 0x68207470, + 0x65637665, + 0x203a636e, + 0x61626163, + 0x6e692063, + 0x69207469, + 0x6d206364, + 0x20747375, + 0x30206562, + 0x20726f20, + 0x6e490031, + 0x696c6176, + 0x62632064, + 0x5f70715f, + 0x7366666f, + 0x72207465, + 0x65676e61, + 0x32312d5b, + 0x5d323120, + 0x766e4900, + 0x64696c61, + 0x5f726320, + 0x6f5f7071, + 0x65736666, + 0x61722074, + 0x5b65676e, + 0x2032312d, + 0x005d3231, + 0x5f544553, + 0x4954504f, + 0x4f204e4f, + 0x63202c4b, + 0x69666e6f, + 0x6e696d72, + 0x62000a67, + 0x77646e61, + 0x68746469, + 0x6d696c20, + 0x203a7469, + 0x20746f6e, + 0x70707573, + 0x6574726f, + 0x65520064, + 0x76696563, + 0x49206465, + 0x5f454c44, + 0x0a4b4341, + 0x746f4700, + 0x4c444920, + 0x43415f45, + 0x6977204b, + 0x756f6874, + 0x65732074, + 0x4920746e, + 0x2e454c44, + 0x63655200, + 0x65766965, + 0x45442064, + 0x2c475542, + 0x67736d20, + 0x61643e2d, + 0x735f6174, + 0x3d657a69, + 0x202c6425, + 0x6576656c, + 0x64253d6c, + 0x6573000a, + 0x6e69646e, + 0x65722067, + 0x6e6f7073, + 0x63206573, + 0x2065646f, + 0x000a6425, + 0x454c4449, + 0x64692820, + 0x735f656c, + 0x5f746e65, + 0x685f6f74, + 0x2074736f, + 0x202c7525, + 0x75626e69, + 0x6e635f66, + 0x75252074, + 0x756f202c, + 0x66756274, + 0x746e635f, + 0x29752520, + 0x2020000a, + 0x61766120, + 0x77206c69, + 0x7364726f, + 0x206e6920, + 0x6d6d6f63, + 0x65757120, + 0x3a736575, + 0x67736d20, + 0x20752520, + 0x75626e69, + 0x75252066, + 0x74756f20, + 0x20667562, + 0x000a7525, + 0x646e6553, + 0x20676e69, + 0x46464552, + 0x454d4152, + 0x7325000a, + 0x20732520, + 0x2065766d, + 0x66667562, + 0x66207265, + 0x656d6172, + 0x6e692820, + 0x5f667562, + 0x20746e63, + 0x202c7525, + 0x6274756f, + 0x635f6675, + 0x2520746e, + 0x000a2975, + 0x20202020, + 0x74736f68, + 0x6e61685f, + 0x20656c64, + 0x30257830, + 0x30257838, + 0x75207838, + 0x5f726573, + 0x61746164, + 0x6761745f, + 0x25783020, + 0x25783830, + 0x0a783830, + 0x20202000, + 0x61726620, + 0x665f656d, + 0x7367616c, + 0x25783020, + 0x20783830, + 0x20706f74, + 0x62207525, + 0x2520746f, + 0x6f652075, + 0x75252073, + 0x6a657220, + 0x0a752520, + 0x20202000, + 0x726f6620, + 0x2074616d, + 0x30257830, + 0x76207834, + 0x62697369, + 0x2520656c, + 0x75257875, + 0x2020000a, + 0x696d2020, + 0x665f696e, + 0x656d6172, + 0x2820795f, + 0x252d7525, + 0x000a2975, + 0x20202020, + 0x6e616c70, + 0x30207365, + 0x38302578, + 0x30202c78, + 0x38302578, + 0x20000a78, + 0x73202020, + 0x73657a69, + 0x2c752520, + 0x0a752520, + 0x20202000, + 0x6f726320, + 0x25207870, + 0x72632075, + 0x2079706f, + 0x61207525, + 0x5f636266, + 0x62735f77, + 0x20752520, + 0x61207525, + 0x5f636266, + 0x61726170, + 0x3020736d, + 0x38302578, + 0x20000a78, + 0x70202020, + 0x206b6565, + 0x30257830, + 0x30257832, + 0x30257832, + 0x30257832, + 0x000a7832, + 0x20202020, + 0x6e616c70, + 0x6f745f65, + 0x78302070, + 0x78383025, + 0x25783020, + 0x20783830, + 0x30257830, + 0x000a7838, + 0x20202020, + 0x6e616c70, + 0x6f625f65, + 0x78302074, + 0x78383025, + 0x25783020, + 0x20783830, + 0x30257830, + 0x000a7838, + 0x20202020, + 0x69727473, + 0x20736564, + 0x64252020, + 0x20642520, + 0x000a6425, + 0x20202020, + 0x2078616d, + 0x25787525, + 0x25000a75, + 0x73252073, + 0x65766d20, + 0x66756220, + 0x20726566, + 0x73746962, + 0x61657274, + 0x6928206d, + 0x6675626e, + 0x746e635f, + 0x2c752520, + 0x74756f20, + 0x5f667562, + 0x20746e63, + 0x0a297525, + 0x20202000, + 0x74696220, + 0x65727473, + 0x665f6d61, + 0x7367616c, + 0x25783020, + 0x20783830, + 0x66736f65, + 0x20752520, + 0x20666f65, + 0x65207525, + 0x2520736f, + 0x6f652075, + 0x20736266, + 0x73207525, + 0x73746174, + 0x0a752520, + 0x20202000, + 0x64646120, + 0x78302072, + 0x78383025, + 0x6c6c6120, + 0x2520636f, + 0x666f2075, + 0x75252066, + 0x6c696620, + 0x7525206c, + 0x7325000a, + 0x20732520, + 0x2065766d, + 0x66667562, + 0x70207265, + 0x6d617261, + 0x72657465, + 0x7974202c, + 0x25206570, + 0x25000a75, + 0x73252073, + 0x65766d20, + 0x66756220, + 0x20726566, + 0x656e6567, + 0x206c6172, + 0x626e6928, + 0x635f6675, + 0x2520746e, + 0x6f202c75, + 0x75627475, + 0x6e635f66, + 0x75252074, + 0x20000a29, + 0x74202020, + 0x20657079, + 0x202c7525, + 0x666e6f63, + 0x735f6769, + 0x20657a69, + 0x000a7525, + 0x20202020, + 0x666e6f63, + 0x30206769, + 0x32302578, + 0x78302078, + 0x78323025, + 0x25783020, + 0x20783230, + 0x30257830, + 0x000a7832, + 0x20202020, + 0x66667562, + 0x705f7265, + 0x30207274, + 0x38302578, + 0x62202c78, + 0x65666675, + 0x69735f72, + 0x2520657a, + 0x48000a75, + 0x2074736f, + 0x6e697270, + 0x75622074, + 0x72656666, + 0x52524520, + 0x202e524f, + 0x25207325, + 0x766d2073, + 0x75622065, + 0x72656666, + 0x74697720, + 0x6e752068, + 0x776f6e6b, + 0x6f63206e, + 0x25206564, + 0x47000a75, + 0x4f00746f, + 0x55505455, + 0x6e490054, + 0x696c6176, + 0x756f2064, + 0x74757074, + 0x66756220, + 0x2e726566, + 0x766e4900, + 0x64696c61, + 0x66756220, + 0x20726566, + 0x4d206e69, + 0x435f4556, + 0x5f4d4d4f, + 0x5f465542, + 0x5154554f, + 0x4444415f, + 0x65282052, + 0x63657078, + 0x20646574, + 0x5f65766d, + 0x66667562, + 0x625f7265, + 0x74737469, + 0x6d616572, + 0x53002e29, + 0x69646e65, + 0x4900676e, + 0x5455504e, + 0x63655200, + 0x65766965, + 0x554f2064, + 0x54555054, + 0x554c465f, + 0x73204853, + 0x65746174, + 0x20752520, + 0x7074756f, + 0x625f7475, + 0x6b636f6c, + 0x25206465, + 0x4f000a75, + 0x75707475, + 0x6c662074, + 0x20687375, + 0x796c6e6f, + 0x6c6c6120, + 0x6465776f, + 0x65687720, + 0x7473206e, + 0x6570706f, + 0x6f202c64, + 0x66612072, + 0x20726574, + 0x70736572, + 0x65736e6f, + 0x45535f20, + 0x4e455551, + 0x505f4543, + 0x4d415241, + 0x52455445, + 0x65530053, + 0x6e69646e, + 0x554f2067, + 0x54555054, + 0x554c465f, + 0x44454853, + 0x6553000a, + 0x6e69646e, + 0x4e492067, + 0x5f545550, + 0x53554c46, + 0x0a444548, + 0x63655200, + 0x65766965, + 0x4e492064, + 0x5f545550, + 0x53554c46, + 0x49000a48, + 0x5455504e, + 0x554c465f, + 0x6f204853, + 0x20796c6e, + 0x6f6c6c61, + 0x20646577, + 0x6e656877, + 0x206e6920, + 0x504f5453, + 0x20444550, + 0x74617473, + 0x52002e65, + 0x69656365, + 0x20646576, + 0x000a4f47, + 0x5f45564d, + 0x55514552, + 0x5f545345, + 0x45444f43, + 0x3a4f475f, + 0x70204120, + 0x69766572, + 0x2073756f, + 0x74617473, + 0x72742065, + 0x69736e61, + 0x6e6f6974, + 0x20736920, + 0x6c697473, + 0x6570206c, + 0x6e69646e, + 0x4e002e67, + 0x6f6a206f, + 0x6e692062, + 0x626f6a20, + 0x65757120, + 0x002e6575, + 0x65636552, + 0x64657669, + 0x4f545320, + 0x4d000a50, + 0x525f4556, + 0x45555145, + 0x435f5453, + 0x5f45444f, + 0x504f5453, + 0x2041203a, + 0x76657270, + 0x73756f69, + 0x61747320, + 0x74206574, + 0x736e6172, + 0x6f697469, + 0x7369206e, + 0x69747320, + 0x70206c6c, + 0x69646e65, + 0x002e676e, + 0x6e616843, + 0x73206567, + 0x65746174, + 0x206f7420, + 0x000a6425, + 0x646e6553, + 0x20676e69, + 0x54415453, + 0x48435f45, + 0x45474e41, + 0x77656e20, + 0x6174735f, + 0x253d6574, + 0x53000a75, + 0x65746174, + 0x61686320, + 0x2065676e, + 0x646e6570, + 0x20676e69, + 0x74617473, + 0x64253d65, + 0x6e657020, + 0x676e6964, + 0x0a64253d, + 0x63655200, + 0x65766965, + 0x55442064, + 0x000a504d, + 0x5f45564d, + 0x55514552, + 0x5f545345, + 0x45444f43, + 0x4d55445f, + 0x6f6e2050, + 0x6c612074, + 0x65776f6c, + 0x6f662064, + 0x72702072, + 0x6365746f, + 0x20646574, + 0x73736573, + 0x736e6f69, + 0x626e002e, + 0x75622072, + 0x72656666, + 0x65682073, + 0x203a646c, + 0x69207525, + 0x7475706e, + 0x20752520, + 0x7074756f, + 0x000a7475, + 0x69617661, + 0x6f77206c, + 0x20736472, + 0x63206e69, + 0x206d6d6f, + 0x75657571, + 0x203a7365, + 0x2067736d, + 0x69207525, + 0x6675626e, + 0x20752520, + 0x6274756f, + 0x25206675, + 0x52000a75, + 0x69656365, + 0x20646576, + 0x474e4950, + 0x6e65000a, + 0x65722d63, + 0x72662d66, + 0x3a656d61, + 0x206f6e20, + 0x6f707865, + 0x20646573, + 0x6d617266, + 0x6f742065, + 0x6c657220, + 0x65736165, + 0x69702800, + 0x2029676e, + 0x65746e69, + 0x6c616e72, + 0x72726520, + 0x7720726f, + 0x20687469, + 0x2d666572, + 0x6d617266, + 0x78652d65, + 0x63617274, + 0x6e6f6974, + 0x63656d20, + 0x696e6168, + 0x002e6d73, + 0x65646f63, + 0x25203d20, + 0x54000a64, + 0x736e6172, + 0x6f697469, + 0x4946206e, + 0x6f204f46, + 0x66726576, + 0x00776f6c, + 0x75736e55, + 0x726f7070, + 0x20646574, + 0x7373656d, + 0x20656761, + 0x65646f63, + 0x424d002e, + 0x6f666e69, + 0x706e6920, + 0x6e207475, + 0x6120746f, + 0x776f6c6c, + 0x66206465, + 0x7020726f, + 0x65746f72, + 0x64657463, + 0x73657320, + 0x6e6f6973, + 0x424d002e, + 0x6f666e69, + 0x706e6920, + 0x62207475, + 0x65666675, + 0x61682072, + 0x6c692073, + 0x6167656c, + 0x6f6c206c, + 0x69746163, + 0x42006e6f, + 0x4d206461, + 0x666e6942, + 0x6e69206f, + 0x3b747570, + 0x65737520, + 0x69735f64, + 0x2820657a, + 0x69727473, + 0x315b6564, + 0x6d20295d, + 0x20747375, + 0x20746f6e, + 0x6c206562, + 0x65677261, + 0x68742072, + 0x6d206e61, + 0x735f7861, + 0x20657a69, + 0x72747328, + 0x5b656469, + 0x0a295d30, + 0x64614200, + 0x69424d20, + 0x206f666e, + 0x75706e69, + 0x75622074, + 0x72656666, + 0x6f4e002e, + 0x70757320, + 0x74726f70, + 0x726f6620, + 0x69687420, + 0x75622073, + 0x72656666, + 0x6c6f6320, + 0x6620726f, + 0x616d726f, + 0x68002e74, + 0x77647261, + 0x20657261, + 0x73656f64, + 0x746f6e20, + 0x70757320, + 0x74726f70, + 0x42464120, + 0x6e692043, + 0x00747570, + 0x6f636e65, + 0x676e6964, + 0x746f6e20, + 0x70757320, + 0x74726f70, + 0x6f206465, + 0x68742066, + 0x31207369, + 0x69622d30, + 0x6e692074, + 0x20747570, + 0x6d726f66, + 0x68007461, + 0x77647261, + 0x20657261, + 0x73656f64, + 0x746f6e20, + 0x70757320, + 0x74726f70, + 0x45564d20, + 0x524f465f, + 0x5f54414d, + 0x34565559, + 0x505f3032, + 0x00303130, + 0x5f45564d, + 0x46465542, + 0x465f5245, + 0x454d4152, + 0x414c465f, + 0x4e495f47, + 0x4c524554, + 0x20454341, + 0x3a746573, + 0x746e4920, + 0x616c7265, + 0x20646563, + 0x6f636e65, + 0x6e206564, + 0x7320746f, + 0x6f707075, + 0x64657472, + 0x6c46002e, + 0x4d206761, + 0x425f4556, + 0x45464655, + 0x52465f52, + 0x5f454d41, + 0x47414c46, + 0x544f425f, + 0x5249465f, + 0x73205453, + 0x6c756f68, + 0x6f6e2064, + 0x65622074, + 0x74657320, + 0x6c46002e, + 0x4d206761, + 0x425f4556, + 0x45464655, + 0x52465f52, + 0x5f454d41, + 0x47414c46, + 0x544f425f, + 0x4552505f, + 0x544e4553, + 0x6f687320, + 0x20646c75, + 0x20746f6e, + 0x73206562, + 0x002e7465, + 0x7473754d, + 0x76616820, + 0x69762065, + 0x6c626973, + 0x72665f65, + 0x5f656d61, + 0x74646977, + 0x203e2068, + 0x4d002e30, + 0x20747375, + 0x65766168, + 0x73697620, + 0x656c6269, + 0x6172665f, + 0x685f656d, + 0x68676965, + 0x203e2074, + 0x76002e30, + 0x62697369, + 0x665f656c, + 0x656d6172, + 0x6469775f, + 0x74206874, + 0x6c206f6f, + 0x65677261, + 0x73697600, + 0x656c6269, + 0x6172665f, + 0x685f656d, + 0x68676965, + 0x6f742074, + 0x616c206f, + 0x00656772, + 0x61746f52, + 0x6e6f6974, + 0x746f6e20, + 0x70757320, + 0x74726f70, + 0x66206465, + 0x4120726f, + 0x20434246, + 0x75706e69, + 0x53002e74, + 0x696c6163, + 0x6e20676e, + 0x7320746f, + 0x6f707075, + 0x64657472, + 0x726f6620, + 0x42464120, + 0x6e692043, + 0x2e747570, + 0x72694d00, + 0x69726f72, + 0x6920676e, + 0x6f6e2073, + 0x75732074, + 0x726f7070, + 0x20646574, + 0x20726f66, + 0x43424641, + 0x706e6920, + 0x002e7475, + 0x43424641, + 0x616c7020, + 0x3020656e, + 0x20736920, + 0x20746f6e, + 0x76206e69, + 0x64696c61, + 0x6d656d20, + 0x2079726f, + 0x69676572, + 0x002e6e6f, + 0x43424641, + 0x616c7020, + 0x3020656e, + 0x7a697320, + 0x68732065, + 0x646c756f, + 0x746f6e20, + 0x20656220, + 0x6f72657a, + 0x4641002e, + 0x62204342, + 0x6f74746f, + 0x6c70206d, + 0x20656e61, + 0x6e696f70, + 0x20726574, + 0x756f6873, + 0x6820646c, + 0x20657661, + 0x6e656562, + 0x72657a20, + 0x41002e6f, + 0x20434246, + 0x6e616c70, + 0x20312065, + 0x657a6973, + 0x6f687320, + 0x20646c75, + 0x7a206562, + 0x2e6f7265, + 0x42464100, + 0x6e692043, + 0x3a747570, + 0x69775f20, + 0x5f687464, + 0x735f6e69, + 0x72657075, + 0x636f6c62, + 0x7420736b, + 0x73206f6f, + 0x6c6c616d, + 0x726f6620, + 0x61726620, + 0x5300656d, + 0x696c6163, + 0x6e20676e, + 0x7320746f, + 0x6f707075, + 0x64657472, + 0x726f6620, + 0x616c7020, + 0x2072616e, + 0x75706e69, + 0x52002e74, + 0x7461746f, + 0x206e6f69, + 0x206e6163, + 0x20746f6e, + 0x64206562, + 0x20656e6f, + 0x20726f66, + 0x3a323a34, + 0x6d002e32, + 0x665f7861, + 0x656d6172, + 0x6469775f, + 0x73206874, + 0x6c756f68, + 0x65622064, + 0x72616c20, + 0x20726567, + 0x6e616874, + 0x72657a20, + 0x6d002e6f, + 0x665f7861, + 0x656d6172, + 0x6965685f, + 0x20746867, + 0x756f6873, + 0x6220646c, + 0x616c2065, + 0x72656772, + 0x61687420, + 0x657a206e, + 0x002e6f72, + 0x75736e55, + 0x726f7070, + 0x20646574, + 0x6e616c70, + 0x62207261, + 0x65666675, + 0x6f632072, + 0x20726f6c, + 0x6d726f66, + 0x002e7461, + 0x69727453, + 0x74206564, + 0x73206f6f, + 0x6c6c616d, + 0x206f7420, + 0x646c6f68, + 0x78616d20, + 0x6172665f, + 0x775f656d, + 0x68746469, + 0x6c70002e, + 0x5f656e61, + 0x20706f74, + 0x7473756d, + 0x20656220, + 0x6d206e69, + 0x726f6d65, + 0x65722079, + 0x6e6f6967, + 0x41524620, + 0x5542454d, + 0x70002e46, + 0x656e616c, + 0x746f625f, + 0x6f687320, + 0x20646c75, + 0x7a206562, + 0x206f7265, + 0x20726f66, + 0x2d6e6f6e, + 0x65746e69, + 0x63616c72, + 0x73206465, + 0x61657274, + 0x41002e6d, + 0x65726464, + 0x6f207373, + 0x6e752066, + 0x64657375, + 0x616c7020, + 0x7320656e, + 0x6c756f68, + 0x65622064, + 0x72657a20, + 0x53002e6f, + 0x64697274, + 0x666f2065, + 0x756e7520, + 0x20646573, + 0x6e616c70, + 0x68732065, + 0x646c756f, + 0x20656220, + 0x6f72657a, + 0x754d002e, + 0x68207473, + 0x20657661, + 0x69736976, + 0x5f656c62, + 0x6d617266, + 0x69775f65, + 0x20687464, + 0x6d203d3c, + 0x665f7861, + 0x656d6172, + 0x6469775f, + 0x002e6874, + 0x504f545f, + 0x4552505f, + 0x544e4553, + 0x20726f20, + 0x444e455f, + 0x5f464f5f, + 0x45525453, + 0x6d204d41, + 0x20747375, + 0x73206562, + 0x002e7465, + 0x61766e49, + 0x2064696c, + 0x66667562, + 0x69207265, + 0x564d206e, + 0x4f435f45, + 0x425f4d4d, + 0x495f4655, + 0x415f514e, + 0x20524444, + 0x70786528, + 0x65746365, + 0x766d2064, + 0x75625f65, + 0x72656666, + 0x6172665f, + 0x6f20656d, + 0x766d2072, + 0x75625f65, + 0x72656666, + 0x7261705f, + 0x2e296d61, + 0x30323400, + 0x203e2d20, + 0x20323234, + 0x766e6f63, + 0x69737265, + 0x6e206e6f, + 0x7320746f, + 0x6f707075, + 0x64657472, + 0x6e65002e, + 0x65722d63, + 0x72662d66, + 0x3a656d61, + 0x746f6e20, + 0x6f6e6520, + 0x20686775, + 0x65746e69, + 0x6c616e72, + 0x6f6c7320, + 0x52007374, + 0x30435341, + 0x53415200, + 0x52003143, + 0x32435341, + 0x53415200, + 0x52003343, + 0x34435341, + 0x4d445300, + 0x44560041, + 0x5200414d, + 0x46004645, + 0x4c415441, + 0x5252455f, + 0x555f524f, + 0x4645444e, + 0x44454e49, + 0x54414600, + 0x455f4c41, + 0x524f5252, + 0x4246415f, + 0x4e495f43, + 0x5f545550, + 0x52524f43, + 0x00545055, + 0x41544146, + 0x52455f4c, + 0x5f524f52, + 0x43424641, + 0x4645525f, + 0x524f435f, + 0x54505552, + 0x54414600, + 0x455f4c41, + 0x524f5252, + 0x49534c5f, + 0x54435f44, + 0x4d5f4c52, + 0x4f435841, + 0x4e5f4552, + 0x535f544f, + 0x00005445, + 0x000191db, + 0x000191e1, + 0x000191e7, + 0x000191ed, + 0x000191f3, + 0x000191f9, + 0x000191fe, + 0x00019203, + 0x00019207, + 0x0001921d, + 0x0001923c, + 0x00019259, + 0x30000000, + 0x2400000c, + 0x1c00001e, + 0x0001b65e, + 0x000109bf, + 0x000109bf, + 0x000109bf, + 0x4649424d, + 0x43564548, + 0x00010001, + 0x00000090, + 0x00000870, + 0x0001f400, + 0x001e0001, + 0x00000001, + 0x000001e0, + 0x00003840, + 0x0016e360, + 0x003c0001, + 0x00000003, + 0x000003c0, + 0x00007080, + 0x002dc6c0, + 0x003f0001, + 0x00000005, + 0x00000870, + 0x0000fd20, + 0x005b8d80, + 0x005a0002, + 0x00000007, + 0x00000f00, + 0x0001fa40, + 0x00989680, + 0x005d0003, + 0x00000009, + 0x00002200, + 0x0003fc00, + 0x00b71b00, + 0x00780005, + 0x0000000b, + 0x00002200, + 0x0003fc00, + 0x01c9c380, + 0x00780105, + 0x0000000c, + 0x00002200, + 0x0007f800, + 0x01312d00, + 0x007b0005, + 0x0000000d, + 0x00002200, + 0x0007f800, + 0x02faf080, + 0x007b0105, + 0x0000000e, + 0x00008800, + 0x000ff000, + 0x017d7840, + 0x0096000b, + 0x0000000f, + 0x00008800, + 0x000ff000, + 0x05f5e100, + 0x0096010b, + 0x00000010, + 0x00008800, + 0x001fe000, + 0x02625a00, + 0x0099000b, + 0x00000011, + 0x00008800, + 0x001fe000, + 0x09896800, + 0x0099010b, + 0x00000012, + 0x00008800, + 0x003fc000, + 0x03938700, + 0x009c000b, + 0x00000013, + 0x00008800, + 0x003fc000, + 0x0e4e1c00, + 0x009c010b, + 0x00000014, + 0x00022000, + 0x003fc000, + 0x03938700, + 0x00b40016, + 0x00000015, + 0x00022000, + 0x003fc000, + 0x0e4e1c00, + 0x00b40116, + 0x00000016, + 0x00022000, + 0x007f8000, + 0x07270e00, + 0x00b70016, + 0x00000017, + 0x00022000, + 0x007f8000, + 0x1c9c3800, + 0x00b70116, + 0x00000018, + 0x00022000, + 0x00ff0000, + 0x0e4e1c00, + 0x00ba0016, + 0x00000019, + 0x00022000, + 0x00ff0000, + 0x2faf0800, + 0x00ba0116, + 0x0000001a, + 0x0056e81c, + 0x0052f58a, + 0x004f02f8, + 0x004b1066, + 0x0047b74a, + 0x00445e2e, + 0x00410576, + 0x003dacbd, + 0x003a524a, + 0x0036f7da, + 0x0033ec31, + 0x0030e088, + 0x002e0661, + 0x002b2c3b, + 0x002854e4, + 0x00257d8a, + 0x0022ebdf, + 0x00205a33, + 0x001e0e85, + 0x001bc2d7, + 0x0019812e, + 0x00173f85, + 0x00154bfb, + 0x00135871, + 0x0011b2c8, + 0x00100d1f, + 0x000e88c8, + 0x000d0473, + 0x000bc721, + 0x000a89cf, + 0x00099d54, + 0x0008b0da, + 0x0007cd9a, + 0x0006ea5a, + 0x00063ff8, + 0x00059597, + 0x00050bf1, + 0x00048248, + 0x00040712, + 0x00038bdc, + 0x000327f8, + 0x0002c417, + 0x000274ec, + 0x000225c3, + 0x0001dfda, + 0x000199f3, + 0x0001642c, + 0x00012e66, + 0x000107da, + 0x0000e14d, + 0x0000c2e1, + 0x0000a476, + 0x046c53d4, + 0x0376467b, + 0x02b5b112, + 0x021ef4a4, + 0x01a8f94d, + 0x014ca103, + 0x010459a6, + 0x00cbc6fb, + 0x009f7f54, + 0x007cd6df, + 0x0061b65a, + 0x004c7ad7, + 0x003bdc73, + 0x002eda83, + 0x0024ac29, + 0x001cb426, + 0x0016776e, + 0x001195ac, + 0x000dc37b, + 0x000ac5d7, + 0x00086e92, + 0x00069985, + 0x00052a66, + 0x00040b0d, + 0x00032a21, + 0x00027a17, + 0x0001f04f, + 0x00018476, + 0x0001300d, + 0x0000edfb, + 0x0000ba45, + 0x000091ca, + 0x0000721c, + 0x0000594f, + 0x000045e6, + 0x000036b6, + 0x00002ad2, + 0x00002185, + 0x00001a3b, + 0x00001488, + 0x00001012, + 0x00000c94, + 0x000009d7, + 0x000007b3, + 0x00000608, + 0x000004b8, + 0x000003b1, + 0x000002e4, + 0x00000243, + 0x000001c5, + 0x00000161, + 0x00000114, + 0x003ddcfb, + 0x003ac288, + 0x0037a814, + 0x00348d9f, + 0x0031047b, + 0x002d7b54, + 0x002acfcf, + 0x00282448, + 0x002556ae, + 0x00228917, + 0x001fc70a, + 0x001d04fd, + 0x001acf85, + 0x00189a0f, + 0x00166e64, + 0x001442b6, + 0x0012153d, + 0x000fe7c3, + 0x000e5445, + 0x000cc0c5, + 0x000b331a, + 0x0009a56e, + 0x00085d14, + 0x000714bd, + 0x000631c5, + 0x00054ecf, + 0x00048403, + 0x0003b936, + 0x00032f8f, + 0x0002a5e9, + 0x00024c00, + 0x0001f217, + 0x0001a51c, + 0x00015821, + 0x0001252e, + 0x0000f23d, + 0x0000ca29, + 0x0000a214, + 0x00008738, + 0x00006c5c, + 0x00005ba6, + 0x00004aee, + 0x000041a1, + 0x00003852, + 0x000031df, + 0x00002b69, + 0x0000265a, + 0x0000214a, + 0x00001df6, + 0x00001aa1, + 0x000017c8, + 0x000014f1, + 0x2a2a2a2a, + 0x53415220, + 0x20642543, + 0x524f4241, + 0x2a2a2054, + 0x000a2a2a, + 0x43502020, + 0x20202020, + 0x7830203d, + 0x78383025, + 0x2020000a, + 0x20205253, + 0x203d2020, + 0x30257830, + 0x000a7838, + 0x41462020, + 0x20202052, + 0x7830203d, + 0x78383025, + 0x2020000a, + 0x32255b52, + 0x3d205d64, + 0x25783020, + 0x0a783830, + 0x00000000, + 0x00011d68, + 0x00011d68, + 0x00011d68, + 0x00011d68, + 0x2a2a2a2a, + 0x53415220, + 0x20642543, + 0x524f4241, + 0x2a2a2054, + 0x000a2a2a, + 0x43502020, + 0x20202020, + 0x7830203d, + 0x78383025, + 0x2020000a, + 0x20205253, + 0x203d2020, + 0x30257830, + 0x000a7838, + 0x41462020, + 0x20202052, + 0x7830203d, + 0x78383025, + 0x2020000a, + 0x32255b52, + 0x3d205d64, + 0x25783020, + 0x0a783830, + 0x00000000, + 0x00012482, + 0x00012482, + 0x00012482, + 0x00012482, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00010000, + 0x00010001, + 0x00010001, + 0x00020002, + 0x00030003, + 0x00050004, + 0x00080006, + 0x000d000a, + 0x00140010, + 0x00200019, + 0x00330028, + 0x00510040, + 0x00800066, + 0x00cb00a1, + 0x01430100, + 0x02000196, + 0x032d0285, + 0x050a0400, + 0x08000659, + 0x0cb30a14, + 0x14291000, + 0x20001966, + 0x32cc2851, + 0x0000001d, + 0x0000001e, + 0x0000001f, + 0x00000020, + 0x00000021, + 0x00000021, + 0x00000022, + 0x00000022, + 0x00000023, + 0x00000023, + 0x00000024, + 0x00000024, + 0x00000025, + 0x00000025, + 0x2a2a2a2a, + 0x53415220, + 0x20642543, + 0x524f4241, + 0x2a2a2054, + 0x000a2a2a, + 0x43502020, + 0x20202020, + 0x7830203d, + 0x78383025, + 0x2020000a, + 0x20205253, + 0x203d2020, + 0x30257830, + 0x000a7838, + 0x41462020, + 0x20202052, + 0x7830203d, + 0x78383025, + 0x2020000a, + 0x32255b52, + 0x3d205d64, + 0x25783020, + 0x0a783830, + 0x00000000, + 0x00012a40, + 0x00012a40, + 0x00012a40, + 0x00012a40, + 0x000000a0, + 0x000000b0, + 0x000000d0, + 0x000000e0, + 0x00000100, + 0x00000120, + 0x00000140, + 0x00000160, + 0x000001a0, + 0x000001c0, + 0x00000200, + 0x00000240, + 0x00000280, + 0x000002c0, + 0x00000340, + 0x00000380, + 0x00000400, + 0x00000480, + 0x00000500, + 0x00000580, + 0x00000680, + 0x00000700, + 0x00000800, + 0x00000900, + 0x00000a00, + 0x00000b00, + 0x00000d00, + 0x00000e00, + 0x00001000, + 0x00001200, + 0x00001400, + 0x00001600, + 0x00001a00, + 0x00001c00, + 0x00002000, + 0x00002400, + 0x00002800, + 0x00002c00, + 0x00003400, + 0x00003800, + 0x00004000, + 0x00004800, + 0x00005000, + 0x00005800, + 0x00006800, + 0x00007000, + 0x00008000, + 0x00009000, + 0x0000a000, + 0x0000b000, + 0x0000d000, + 0x0000e000, + 0x33323130, + 0x37363534, + 0x00003938, + 0x33323130, + 0x37363534, + 0x62613938, + 0x66656463, + 0x72726f43, + 0x65747075, + 0x6e692064, + 0x20747570, + 0x75657571, + 0x49002e65, + 0x6c61766e, + 0x62206469, + 0x65666675, + 0x65682072, + 0x72656461, + 0x206e6920, + 0x5f45564d, + 0x4d4d4f43, + 0x4655425f, + 0x54554f5f, + 0x44415f51, + 0x002e5244, + 0x206f6f54, + 0x6772616c, + 0x65722065, + 0x73657571, + 0x656d2074, + 0x67617373, + 0x54002e65, + 0x6c206f6f, + 0x65677261, + 0x66756220, + 0x20726566, + 0x7373656d, + 0x2e656761, + 0x766e4900, + 0x64696c61, + 0x66756220, + 0x20726566, + 0x4d206e69, + 0x435f4556, + 0x5f4d4d4f, + 0x5f465542, + 0x5f514e49, + 0x52444441, + 0x564d002e, + 0x3a505245, + 0x5f6d6172, + 0x6e697270, + 0x66756274, + 0x20736920, + 0x20746f6e, + 0x69617661, + 0x6c62616c, + 0x000a2e65, + 0x5245564d, + 0x72203a50, + 0x705f6d61, + 0x746e6972, + 0x75645f66, + 0x6620706d, + 0x206d6f72, + 0x70257830, + 0x5052000a, + 0x4d554454, + 0x6c663a50, + 0x253d6761, + 0x69202c78, + 0x7865646e, + 0x2c75253d, + 0x5f727720, + 0x3d746e63, + 0x202c7525, + 0x635f6472, + 0x253d746e, + 0x000a2e75, + 0x252d5746, + 0x25203a75, + 0x564d0073, + 0x3a505245, + 0x67616c66, + 0x2c78253d, + 0x78646920, + 0x2c75253d, + 0x5f727720, + 0x3d746e63, + 0x202c7525, + 0x635f6472, + 0x253d746e, + 0x000a2e75, + 0x34302520, + 0x38250078, + 0x73253a78, + 0x2520000a, + 0x00783230, + 0x1007f000, + 0x49574558, + 0x35565644, + 0x2d37562f, + 0x43564548, + 0x3a434e45, + 0x65720020, + 0x657a6973, + 0x7470203a, + 0x78302072, + 0x78383025, + 0x77656e20, + 0x7a69735f, + 0x75252065, + 0x766d000a, + 0x656d5f65, + 0x65725f6d, + 0x657a6973, + 0x6c616d00, + 0x3a636f6c, + 0x7a697320, + 0x75252065, + 0x616d202c, + 0x75252078, + 0x6572202c, + 0x6e6f6967, + 0x2c752520, + 0x676f6c20, + 0x6c615f32, + 0x206e6769, + 0x000a7525, + 0x6c6c616d, + 0x203a636f, + 0x75746572, + 0x64656e72, + 0x25783020, + 0x6d000a70, + 0x6d5f6576, + 0x615f6d65, + 0x636f6c6c, + 0x6c6c4100, + 0x7461636f, + 0x6d206465, + 0x726f6d65, + 0x61682079, + 0x72772073, + 0x20676e6f, + 0x67696c61, + 0x6e656d6e, + 0x78450074, + 0x74636570, + 0x61206465, + 0x636f6c6c, + 0x64657461, + 0x6d656d20, + 0x2079726f, + 0x50206e69, + 0x45544f52, + 0x44455443, + 0x67657220, + 0x2e6e6f69, + 0x70784500, + 0x65746365, + 0x6c612064, + 0x61636f6c, + 0x20646574, + 0x6f6d656d, + 0x69207972, + 0x5246206e, + 0x42454d41, + 0x72204655, + 0x6f696765, + 0x6e002e6e, + 0x7720746f, + 0x69746961, + 0x2500676e, + 0x64692073, + 0x635f656c, + 0x656c6379, + 0x25000a73, + 0x2d252073, + 0x20733831, + 0x64353125, + 0x7325000a, + 0x746f5420, + 0x695f6c61, + 0x20656c64, + 0x20202020, + 0x25202020, + 0x0a643531, + 0x726f6300, + 0x64252065, + 0x20732520, + 0x30322d25, + 0x6f632073, + 0x253d6564, + 0x70206433, + 0x253d6369, + 0x70206433, + 0x705b736f, + 0x283d5d75, + 0x2c643325, + 0x29643325, + 0x6b6c6320, + 0x0a64253d, + 0x726f6300, + 0x64252065, + 0x20732520, + 0x30322d25, + 0x20202073, + 0x20202020, + 0x70202020, + 0x253d6369, + 0x70206433, + 0x705b736f, + 0x283d5d75, + 0x2c643325, + 0x29643325, + 0x6f6e000a, + 0x65732074, + 0x61772074, + 0x6e697469, + 0x4f530067, + 0x45525f43, + 0x54532e46, + 0x53555441, + 0x20202020, + 0x20202020, + 0x78302020, + 0x000a7825, + 0x5f434f53, + 0x2e464552, + 0x464e4f43, + 0x20204749, + 0x20202020, + 0x20202020, + 0x78257830, + 0x4f53000a, + 0x45525f43, + 0x494c2e46, + 0x45524556, + 0x20202046, + 0x20202020, + 0x78302020, + 0x000a7825, + 0x5f434f53, + 0x2e464552, + 0x504f5453, + 0x4b53414d, + 0x20202020, + 0x20202020, + 0x78257830, + 0x4f53000a, + 0x434d5f43, + 0x4154532e, + 0x20205452, + 0x20202020, + 0x20202020, + 0x78302020, + 0x000a7825, + 0x5f434f53, + 0x532e434d, + 0x55544154, + 0x20202053, + 0x20202020, + 0x20202020, + 0x78257830, + 0x4f53000a, + 0x52545f43, + 0x54532e46, + 0x53555441, + 0x20202020, + 0x20202020, + 0x78302020, + 0x000a7825, + 0x5f434f53, + 0x2e465254, + 0x53474244, + 0x55544154, + 0x20202053, + 0x20202020, + 0x78257830, + 0x4f53000a, + 0x42445f43, + 0x54432e4c, + 0x20204c52, + 0x20202020, + 0x20202020, + 0x78302020, + 0x000a7825, + 0x5f434f53, + 0x2e4c4244, + 0x4c525443, + 0x20202031, + 0x20202020, + 0x20202020, + 0x78257830, + 0x4f53000a, + 0x42445f43, + 0x54532e4c, + 0x53555441, + 0x20202020, + 0x20202020, + 0x78302020, + 0x000a7825, + 0x5f434f53, + 0x2e4c4244, + 0x54415453, + 0x20315355, + 0x20202020, + 0x20202020, + 0x78257830, + 0x4f53000a, + 0x42445f43, + 0x54532e4c, + 0x53555441, + 0x20202032, + 0x20202020, + 0x78302020, + 0x000a7825, + 0x5f434f53, + 0x2e4c4244, + 0x54415453, + 0x20335355, + 0x20202020, + 0x20202020, + 0x78257830, + 0x4f53000a, + 0x49425f43, + 0x52545354, + 0x2e4d4145, + 0x41424341, + 0x54532e44, + 0x53555441, + 0x20202020, + 0x30202020, + 0x0a782578, + 0x434f5300, + 0x5449425f, + 0x45525453, + 0x4d2e4d41, + 0x54494244, + 0x41564153, + 0x20204c49, + 0x20202020, + 0x78302020, + 0x000a7825, + 0x5f434f53, + 0x53544942, + 0x41455254, + 0x45442e4d, + 0x54435f46, + 0x20204c52, + 0x20202020, + 0x20202020, + 0x25783020, + 0x53000a78, + 0x425f434f, + 0x54535449, + 0x4d414552, + 0x564d482e, + 0x44455250, + 0x4154532e, + 0x20535554, + 0x20202020, + 0x78257830, + 0x4f53000a, + 0x49425f43, + 0x52545354, + 0x2e4d4145, + 0x42414348, + 0x532e4441, + 0x55544154, + 0x20202053, + 0x30202020, + 0x0a782578, + 0x434f5300, + 0x2e454d5f, + 0x54415453, + 0x20205355, + 0x20202020, + 0x20202020, + 0x25783020, + 0x53000a78, + 0x565f434f, + 0x2e414d44, + 0x5f515249, + 0x54415453, + 0x20205355, + 0x30202020, + 0x0a782578, + 0x4f532000, + 0x44565f43, + 0x6520414d, + 0x3d305f71, + 0x64207825, + 0x3d305f71, + 0x65207825, + 0x3d315f71, + 0x64207825, + 0x3d315f71, + 0x73207825, + 0x635f6372, + 0x3d6c7274, + 0x000a7825, + 0x52414853, + 0x525f4445, + 0x702e4d41, + 0x5f657069, + 0x74617473, + 0x20202065, + 0x28207525, + 0x0a297325, + 0x41485300, + 0x5f444552, + 0x2e4d4152, + 0x6c5f7369, + 0x5f747361, + 0x65726f63, + 0x0a752520, + 0x41485300, + 0x5f444552, + 0x2e4d4152, + 0x5f626f6a, + 0x73616870, + 0x20202065, + 0x0a752520, + 0x41485300, + 0x5f444552, + 0x2e4d4152, + 0x5f626f6a, + 0x74617473, + 0x20202065, + 0x0a782520, + 0x41485300, + 0x5f444552, + 0x2e4d4152, + 0x7074756f, + 0x735f7475, + 0x70697274, + 0x635f7365, + 0x6c706d6f, + 0x64657465, + 0x0a752520, + 0x41485300, + 0x5f444552, + 0x2e4d4152, + 0x71657261, + 0x7274735f, + 0x73657069, + 0x7373695f, + 0x20646575, + 0x000a7525, + 0x414d4453, + 0x5541462e, + 0x2020544c, + 0x20202020, + 0x20202020, + 0x20202020, + 0x78257830, + 0x7453000a, + 0x73757461, + 0x20666f20, + 0x636f6c62, + 0x2064656b, + 0x6b736174, + 0x6f662073, + 0x6f632072, + 0x25206572, + 0x63203a75, + 0x253d6b6c, + 0x000a2075, + 0x74617473, + 0x25207375, + 0x6f742078, + 0x64252070, + 0x746e6320, + 0x20642520, + 0x756e636d, + 0x7825206d, + 0x626d000a, + 0x3d6d756e, + 0x72207825, + 0x766d656d, + 0x0a78253d, + 0x434f5300, + 0x5359535f, + 0x4c525443, + 0x4e56532e, + 0x20564552, + 0x20202020, + 0x20202020, + 0x20202020, + 0x20202020, + 0x000a7825, + 0x525f5746, + 0x20205645, + 0x20202020, + 0x20202020, + 0x20202020, + 0x20202020, + 0x20202020, + 0x20202020, + 0x25202020, + 0x53000a78, + 0x49535345, + 0x525f4e4f, + 0x612e4d41, + 0x76697463, + 0x6f635f65, + 0x20736572, + 0x20202020, + 0x20202020, + 0x75252020, + 0x6946000a, + 0x61776d72, + 0x73206572, + 0x75746174, + 0x666f2073, + 0x73616d20, + 0x20726574, + 0x726f6328, + 0x64252065, + 0x63203a29, + 0x253d6b6c, + 0x000a2064, + 0x53534553, + 0x5f4e4f49, + 0x2e4d4152, + 0x6d726966, + 0x65726177, + 0x6e695f73, + 0x6573755f, + 0x20202020, + 0x25202020, + 0x25202c64, + 0x25202c64, + 0x25202c64, + 0x25202c64, + 0x25202c64, + 0x25202c64, + 0x25202c64, + 0x53000a64, + 0x49535345, + 0x525f4e4f, + 0x6d2e4d41, + 0x65747361, + 0x6f635f72, + 0x20206572, + 0x20202020, + 0x20202020, + 0x75252020, + 0x4553000a, + 0x4f495353, + 0x41525f4e, + 0x616d2e4d, + 0x72657473, + 0x6c6c615f, + 0x7461636f, + 0x20206465, + 0x20202020, + 0x0a642520, + 0x53455300, + 0x4e4f4953, + 0x4d41525f, + 0x73616d2e, + 0x5f726574, + 0x6e676973, + 0x20736c61, + 0x20202020, + 0x20202020, + 0x78383025, + 0x38302520, + 0x30252078, + 0x000a7838, + 0x53534553, + 0x5f4e4f49, + 0x2e4d4152, + 0x74636970, + 0x73657275, + 0x5f6e695f, + 0x65706970, + 0x20202020, + 0x25202020, + 0x53000a64, + 0x49535345, + 0x525f4e4f, + 0x702e4d41, + 0x5f657069, + 0x5f636970, + 0x6c696174, + 0x20202020, + 0x20202020, + 0x75252020, + 0x4553000a, + 0x4f495353, + 0x41525f4e, + 0x69702e4d, + 0x705f6570, + 0x685f6369, + 0x20646165, + 0x20202020, + 0x20202020, + 0x0a752520, + 0x53455300, + 0x4e4f4953, + 0x4d41525f, + 0x6e65702e, + 0x676e6964, + 0x6174735f, + 0x20206574, + 0x20202020, + 0x20202020, + 0x000a7525, + 0x53534553, + 0x5f4e4f49, + 0x2e4d4152, + 0x73736573, + 0x5f6e6f69, + 0x74617473, + 0x20202065, + 0x20202020, + 0x25202020, + 0x53000a75, + 0x49535345, + 0x525f4e4f, + 0x632e4d41, + 0x6c706d6f, + 0x64657465, + 0x6369705f, + 0x65727574, + 0x20202073, + 0x75252020, + 0x4553000a, + 0x4f495353, + 0x41525f4e, + 0x756f2e4d, + 0x74757074, + 0x6675625f, + 0x5f726566, + 0x64616568, + 0x6172665f, + 0x2020656d, + 0x000a7525, + 0x53534553, + 0x5f4e4f49, + 0x2e4d4152, + 0x7074756f, + 0x625f7475, + 0x65666675, + 0x65685f72, + 0x20206461, + 0x20202020, + 0x75252020, + 0x4553000a, + 0x4f495353, + 0x41525f4e, + 0x69702e4d, + 0x72757463, + 0x695f7365, + 0x65757373, + 0x6f745f64, + 0x7069705f, + 0x20202065, + 0x000a7525, + 0x53534553, + 0x5f4e4f49, + 0x2e4d4152, + 0x6576696c, + 0x7274735f, + 0x5f657069, + 0x64616568, + 0x20202020, + 0x25202020, + 0x53000a75, + 0x49535345, + 0x525f4e4f, + 0x6c2e4d41, + 0x5f657669, + 0x69727473, + 0x745f6570, + 0x2e6c6961, + 0x65646e69, + 0x75252078, + 0x4553000a, + 0x4f495353, + 0x41525f4e, + 0x696c2e4d, + 0x735f6576, + 0x70697274, + 0x61745f65, + 0x702e6c69, + 0x64696369, + 0x0a752520, + 0x53455300, + 0x4e4f4953, + 0x4d41525f, + 0x76696c2e, + 0x74735f65, + 0x65706972, + 0x6961745f, + 0x65722e6c, + 0x20207966, + 0x000a7525, + 0x53534553, + 0x5f4e4f49, + 0x2e4d4152, + 0x5f636e65, + 0x74617473, + 0x74735f73, + 0x6761726f, + 0x6c732e65, + 0x6d5f746f, + 0x206b7361, + 0x0a752520, + 0x53455300, + 0x4e4f4953, + 0x4d41525f, + 0x6f74732e, + 0x6e697070, + 0x6f6e5f67, + 0x20626f5f, + 0x20202020, + 0x20202020, + 0x000a7525, + 0x53534553, + 0x5f4e4f49, + 0x2e4d4152, + 0x5f736964, + 0x725f6269, + 0x7a697365, + 0x20202065, + 0x20202020, + 0x25202020, + 0x6d000a64, + 0x725f7861, + 0x64697365, + 0x5f6c6175, + 0x65676170, + 0x20202073, + 0x20202020, + 0x20202020, + 0x20202020, + 0x000a6425, + 0x65676170, + 0x756f635f, + 0x2020746e, + 0x20202020, + 0x20202020, + 0x20202020, + 0x20202020, + 0x20202020, + 0x0a642520, + 0x61702000, + 0x695f6567, + 0x7865646e, + 0x20642520, + 0x65207025, + 0x7974706d, + 0x20642520, + 0x695f7277, + 0x25207864, + 0x64722064, + 0x7864695f, + 0x20642520, + 0x67617020, + 0x65725f65, + 0x30735f6d, + 0x20642520, + 0x65676170, + 0x6d65725f, + 0x2031735f, + 0x000a6425, + 0x53534553, + 0x5f4e4f49, + 0x2e4d4152, + 0x7074756f, + 0x625f7475, + 0x65666675, + 0x656e5f72, + 0x20207478, + 0x25202020, + 0x53000a75, + 0x49535345, + 0x525f4e4f, + 0x6f2e4d41, + 0x75707475, + 0x75625f74, + 0x72656666, + 0x6961745f, + 0x2020206c, + 0x75252020, + 0x4553000a, + 0x4f495353, + 0x41525f4e, + 0x756f2e4d, + 0x74757074, + 0x6675625f, + 0x5f726566, + 0x64616568, + 0x20202020, + 0x0a752520, + 0x202d2d00, + 0x74697773, + 0x6e696863, + 0x2d2d2067, + 0x4553000a, + 0x4f495353, + 0x41525f4e, + 0x656e2e4d, + 0x625f7478, + 0x5f746f6f, + 0x656b6f74, + 0x2020206e, + 0x20202020, + 0x0a752520, + 0x53455300, + 0x4e4f4953, + 0x4d41525f, + 0x626f6a2e, + 0x6575715f, + 0x742e6575, + 0x6e656b6f, + 0x20202020, + 0x20202020, + 0x000a7525, + 0x53534553, + 0x5f4e4f49, + 0x2e4d4152, + 0x5f626f6a, + 0x69746361, + 0x20206576, + 0x20202020, + 0x20202020, + 0x25202020, + 0x53000a75, + 0x49535345, + 0x525f4e4f, + 0x6a2e4d41, + 0x705f626f, + 0x65736168, + 0x756f635f, + 0x7265746e, + 0x20202020, + 0x75252020, + 0x4553000a, + 0x4f495353, + 0x41525f4e, + 0x6f6a2e4d, + 0x74735f62, + 0x5f747261, + 0x20636970, + 0x20202020, + 0x20202020, + 0x0a752520, + 0x53455300, + 0x4e4f4953, + 0x4d41525f, + 0x626f6a2e, + 0x646e655f, + 0x6369705f, + 0x20202020, + 0x20202020, + 0x20202020, + 0x000a7525, + 0x53534553, + 0x5f4e4f49, + 0x2e4d4152, + 0x65727473, + 0x705f6d61, + 0x685f6369, + 0x20646165, + 0x20202020, + 0x25202020, + 0x2d000a75, + 0x6c73202d, + 0x20656369, + 0x75657571, + 0x2d207365, + 0x53000a2d, + 0x49535345, + 0x525f4e4f, + 0x662e4d41, + 0x5f6f6669, + 0x63696c73, + 0x6f6a5f65, + 0x20202062, + 0x20202020, + 0x64252020, + 0x746e6520, + 0x73656972, + 0x4553000a, + 0x4f495353, + 0x41525f4e, + 0x69662e4d, + 0x735f6f66, + 0x6563696c, + 0x6d6f635f, + 0x74656c70, + 0x20202065, + 0x20642520, + 0x72746e65, + 0x0a736569, + 0x656d2000, + 0x7274735f, + 0x5f657069, + 0x20736f70, + 0x64253d69, + 0x736f7020, + 0x0a64253d, + 0x76696c00, + 0x6f6a5f65, + 0x733e2d62, + 0x63746977, + 0x65725f68, + 0x73657571, + 0x20202074, + 0x20202020, + 0x20202020, + 0x0a752520, + 0x76696c00, + 0x6f6a5f65, + 0x723e2d62, + 0x65757165, + 0x64657473, + 0x6d756e5f, + 0x5f726562, + 0x635f666f, + 0x7365726f, + 0x0a752520, + 0x76696c00, + 0x6f6a5f65, + 0x633e2d62, + 0x7365726f, + 0x6f6f625f, + 0x20646574, + 0x20202020, + 0x20202020, + 0x20202020, + 0x0a752520, + 0x76696c00, + 0x6f6a5f65, + 0x703e2d62, + 0x5f657069, + 0x74697773, + 0x20206863, + 0x20202020, + 0x20202020, + 0x20202020, + 0x0a752520, + 0x52545300, + 0x004d4145, + 0x43494c53, + 0x4d002045, + 0x20202045, + 0x41525400, + 0x0020534e, + 0x5054554f, + 0x50005455, + 0x51455049, + 0x41570020, + 0x4f005449, + 0x52524556, + 0x31004e55, + 0x41505453, + 0x50004547, + 0x44494349, + 0x544e4900, + 0x00465542, + 0x4556494c, + 0x53524150, + 0x4c004445, + 0x43455649, + 0x00504d4f, + 0x49434950, + 0x5845444e, + 0x4c414e00, + 0x504e4900, + 0x45004349, + 0x554f434e, + 0x46554254, + 0x45525000, + 0x51455356, + 0x46455200, + 0x4b4e4142, + 0x5345525f, + 0x4f005445, + 0x55505455, + 0x4c465f54, + 0x00485355, + 0x44524c43, + 0x45004250, + 0x445f434e, + 0x505f5045, + 0x52004349, + 0x535f4e55, + 0x45544154, + 0x494c5300, + 0x465f4543, + 0x004f4649, + 0x4556494c, + 0x494c535f, + 0x44004543, + 0x45555145, + 0x45004555, + 0x4555514e, + 0x43004555, + 0x52004c4f, + 0x44495345, + 0x004c4155, + 0x45544942, + 0x4553434e, + 0x49420051, + 0x434e4554, + 0x00465542, + 0x4d434e45, + 0x464e4942, + 0x4143004f, + 0x42434142, + 0x00535449, + 0x50564d48, + 0x00444552, + 0x4f424552, + 0x4445544f, + 0x4f525000, + 0x43005342, + 0x544e554f, + 0x50560053, + 0x00434239, + 0x56455250, + 0x4152465f, + 0x4500454d, + 0x55425458, + 0x52454646, + 0x50495000, + 0x52004445, + 0x52464645, + 0x00454d41, + 0x4556494c, + 0x544f4c53, + 0x424f4a00, + 0x49575300, + 0x00484354, + 0x49464552, + 0x00454c44, + 0x45504950, + 0x49415244, + 0x4f52004e, + 0x46554257, + 0x424f4a00, + 0x544f4c53, + 0x574f5200, + 0x4e554f43, + 0x00524554, + 0x00465252, + 0x414d4456, + 0x00435253, + 0x4e415254, + 0x524f4653, + 0x5252004d, + 0x41524646, + 0x4100454d, + 0x00514552, + 0x495f454d, + 0x00454c44, + 0x414d4456, + 0x5254535f, + 0x00455049, + 0x4f4c4f43, + 0x42520043, + 0x465f4655, + 0x4853554c, + 0x444e4500, + 0x4152465f, + 0x5200454d, + 0x54535f43, + 0x4d005441, + 0x5f494e49, + 0x4d415246, + 0x55425f45, + 0x424d0046, + 0x4f464e49, + 0x004e495f, + 0x4e49424d, + 0x4f5f4f46, + 0x52005455, + 0x44495345, + 0x5f4c4155, + 0x0054554f, + 0x52504f54, + 0x4d00574f, + 0x52540043, + 0x51524946, + 0x4d445300, + 0x44005741, + 0x54535045, + 0x45504952, + 0x4c424400, + 0x4f4c535f, + 0x424d0054, + 0x51524949, + 0x52494300, + 0x00465542, + 0x5249424d, + 0x00444145, + 0x56455250, + 0x49525453, + 0x50004550, + 0x4f434349, + 0x5400504d, + 0x4d004652, + 0x464e4942, + 0x45485f4f, + 0x52454441, + 0x4c424400, + 0x52444c5f, + 0x4d445600, + 0x52545341, + 0x00455049, + 0x414d4456, + 0x544f4c53, + 0x52545300, + 0x5f455049, + 0x504d4f43, + 0x58495000, + 0x4c5f4e49, + 0x0044414f, + 0x5f574f52, + 0x524f5453, + 0x4d530045, + 0x424d5f56, + 0x4f464e49, + 0x4c424400, + 0x0053425f, + 0x5f465254, + 0x524f5453, + 0x4f435f45, + 0x5254004d, + 0x54535f46, + 0x45504952, + 0x504d4f43, + 0x52544300, + 0x504f004c, + 0x50004e45, + 0x45535241, + 0x504d4f43, + 0x534f4500, + 0x534f4500, + 0x4655425f, + 0x4f455200, + 0x52454452, + 0x41524600, + 0x4953454d, + 0x5000455a, + 0x49535948, + 0x00000044, + 0x004e5552, + 0x00424a50, + 0x00545753, + 0x00424a43, + 0x00058000, + 0x0005804c, + 0x00000000, + 0x00058098, + 0x000580f4, + 0x00058130, + 0x0005817c, + 0x0001a88d, + 0x0001a894, + 0x00000000, + 0x0001a89b, + 0x0001a8a1, + 0x0001a8a8, + 0x0001a8af, + 0x44532020, + 0x2020414d, + 0x61747320, + 0x30737574, + 0x20202020, + 0x74617473, + 0x20317375, + 0x207c2020, + 0x6c637273, + 0x20206e65, + 0x6c747364, + 0x7c206e65, + 0x70747320, + 0x7c206e65, + 0x70747320, + 0x7c206469, + 0x76656420, + 0x65702023, + 0x6e69646e, + 0x20000a67, + 0x32255b20, + 0x20205d64, + 0x78383025, + 0x25202020, + 0x20783830, + 0x207c2020, + 0x20643625, + 0x64362520, + 0x25207c20, + 0x25206432, + 0x7c206432, + 0x78322520, + 0x78322520, + 0x23207c20, + 0x25206425, + 0x20202c64, + 0x20642523, + 0x000a6425, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x02020100, + 0x03030303, + 0x04040404, + 0x04040404, + 0x05050505, + 0x05050505, + 0x05050505, + 0x05050505, + 0x06060606, + 0x06060606, + 0x06060606, + 0x06060606, + 0x06060606, + 0x06060606, + 0x06060606, + 0x06060606, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x63617453, + 0x7461206b, + 0x0a702520, + 0x61747300, + 0x25206b63, + 0x3d206434, + 0x25783020, + 0x0a783830, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0xba2af493, + 0x61f39304, + 0x420103f2, + 0x32053101, + 0xfe0b4105, + 0x4ea7fe4e, + 0x99feffff, + 0x33830943, + 0x34334387, + 0x33f9342b, + 0xff00004d, + 0x4ea73726, + 0xb9ffffff, + 0x4b0e504e, + 0xcee08bef, + 0x202719e1, + 0xf3f02103, + 0x8e012705, + 0x5024f9fe, + 0x4bff000e, + 0xce408b4f, + 0x0027eb4e, + 0x4107fe8e, + 0x43dc40ab, + 0x1524d018, + 0x44234207, + 0x41034253, + 0x24231301, + 0x14030305, + 0xf4980403, + 0x14192586, + 0x041d1103, + 0xf2a80103, + 0x2253fe0b, + 0x14012586, + 0x04051403, + 0xf2a80403, + 0x0533fe0b, + 0x180001f5, + 0x03f5ff02, + 0xff021804, + 0x0e234027, + 0x35fde800, + 0x000e0304, + 0x02f5fde8, + 0xff021810, + 0x181403f5, + 0x0e23ff02, + 0x35fde7f0, + 0x4efe0b04, + 0x66b207f6, + 0x0791072f, + 0x8df793a0, + 0x6c2703f1, + 0xff8ea740, + 0xdb07fdef, + 0x0741bc10, + 0x077401d6, + 0xc3c633c4, + 0x23740541, + 0xfefe74ce, + 0x4c338411, + 0x1d4c5318, + 0x07f642cc, + 0xe323032d, + 0x070c0723, + 0xff7c7e19, + 0xf49b4027, + 0x2b00270e, + 0x071c07bd, + 0x7e3d072a, + 0xb506ff7a, + 0x9d0bad0b, + 0xf68eb91e, + 0x04030333, + 0x100004f1, + 0x4dd8ff02, + 0x2710fc6a, + 0xf1f4e843, + 0x02100003, + 0x6a3ddcff, + 0xfe0bf2fc, + 0xf11ef493, + 0x27430103, + 0xff4ea721, + 0x429dfeff, + 0x4a3f000a, + 0x0b000208, + 0x09f493fe, + 0x431903f1, + 0xf49332e6, + 0x1d04b728, + 0x27fe0b42, + 0xbdf49331, + 0x439d04b8, + 0x4eca1e64, + 0xff4ea7fa, + 0x4b01fd9f, + 0xb8fca007, + 0xbed80143, + 0x15040000, + 0xf0d6f493, + 0x27421903, + 0xc5f49331, + 0x431d03f0, + 0x01342ff6, + 0x0000bef8, + 0x2700c280, + 0xb1f49321, + 0x421d03f0, + 0x4fff3ea7, + 0xa73201fd, + 0xffffff1e, + 0x40272287, + 0x0e5913b9, + 0xb04024f5, + 0x3ff6ff02, + 0xf49300ec, + 0x1903f094, + 0x27109943, + 0xc6261299, + 0x6414d135, + 0xd1463606, + 0x76066814, + 0x10149945, + 0x02ee44c6, + 0x4d7e00fd, + 0x9fdea7ff, + 0xcea7fff9, + 0x19fd4fff, + 0x7bc301d4, + 0x0f41dc43, + 0xf99d4ea7, + 0x014319ff, + 0xd8327bc2, + 0xa9be5231, + 0xd419ffb6, + 0x437bc301, + 0x191741d8, + 0x012127d3, + 0x3b1207c4, + 0x1d31eb14, + 0xff4ea7d3, + 0x42c5fdcf, + 0x9d1ea768, + 0x1419fff9, + 0x437bc301, + 0x191741d8, + 0x01212713, + 0x3be207c4, + 0x1d3eebe4, + 0xff4ea713, + 0x42c5fdcf, + 0x2705466c, + 0x0ef49b40, + 0x5838c4c5, + 0x020000be, + 0xeff6f493, + 0xd6431903, + 0x10bcdc37, + 0xff4ea726, + 0x42d1ffff, + 0x25a60e5c, + 0xafff3ea7, + 0x0b3441fd, + 0x8e340542, + 0x933127fa, + 0x03efc7f4, + 0xbcd8431d, + 0x3127dc10, + 0xafff4ea7, + 0x550a07fd, + 0xc131be43, + 0x930927fe, + 0xffc974f1, + 0xff84ec9e, + 0xefaaf493, + 0x06431903, + 0x730abe39, + 0x27ff1efe, + 0xbe1a0700, + 0x5efec158, + 0x3027feb6, + 0x4fff4ea7, + 0xb50027fd, + 0x7d9dbe43, + 0xfe897eff, + 0xbefebb5e, + 0x1efe6ed3, + 0xff4ea7d9, + 0x43d1feff, + 0x3fe60148, + 0xf75efefd, + 0x99fb4efe, + 0xc007040d, + 0x96050b99, + 0xa7fb8ed4, + 0xffffdf0e, + 0xff8600be, + 0x010fd2d0, + 0x072d07c0, + 0x2304031b, + 0xd8f6be21, + 0x27c001fe, + 0x21270c1c, + 0xfed8ebbe, + 0xffdf0ea7, + 0x85b8beff, + 0x154027ff, + 0x8ec405c4, + 0xa7f54efb, + 0xffffff2e, + 0x0e6421b9, + 0x25b9f2a3, + 0xf1650e67, + 0x02e015ee, + 0x4c834507, + 0x87c4070f, + 0x2bc43334, + 0x33c42bc3, + 0x98ce23c3, + 0xc499fff1, + 0xc34fe656, + 0x71c74102, + 0x99c961c8, + 0x7c1855c6, + 0x007ea310, + 0xc4811000, + 0x4ff6c351, + 0xcd990316, + 0x210c0724, + 0xbecb31ca, + 0xe6ff1883, + 0x5103470f, + 0x35ca25c3, + 0x24cd9dcb, + 0xd30733e3, + 0xd8073802, + 0x0c071907, + 0xad072d07, + 0xfe87efbe, + 0xc961a90b, + 0x49073d07, + 0x43e2480b, + 0x430702b0, + 0xd807492b, + 0x3d07d42b, + 0x03ff3d03, + 0x3a532707, + 0x04112ee3, + 0x453fab10, + 0x8dc475c2, + 0x3ea726c3, + 0x99ffffff, + 0xb1272634, + 0xb0278486, + 0x02424ff6, + 0x2754c49d, + 0x270bba3d, + 0xf30d284c, + 0xc69df42d, + 0x07f00125, + 0x188cbe1c, + 0x55dff6ff, + 0x030c0702, + 0xde7e280c, + 0x54c499fe, + 0x01f94fe6, + 0xf4107cf8, + 0xf0bff601, + 0x31c35101, + 0x2333e3c4, + 0xf355143c, + 0xc1c1c321, + 0x45f3354c, + 0x48c0c1f4, + 0xc124c499, + 0x610750c2, + 0x0b3ccdc1, + 0x0bf42560, + 0xf6dfe662, + 0x30c4c102, + 0x8336c389, + 0xb4870f4c, + 0xb40b4433, + 0xe76cbe23, + 0x8d3347ff, + 0xc48910b3, + 0x8d444738, + 0x6fe612b4, + 0x87070183, + 0x00008ee3, + 0x007dfc10, + 0x23017610, + 0x23112321, + 0x85f27501, + 0x27f095f1, + 0xbe0c0770, + 0xe6ff177b, + 0x0701560f, + 0x2bf35126, + 0xc2c18127, + 0x23070923, + 0x3327051e, + 0x3ea7f3e8, + 0x11fdefff, + 0x184c3334, + 0x131d4c53, + 0xeb41c844, + 0xe7ff4ea7, + 0x154d05fd, + 0xa7402742, + 0xfde7ff3e, + 0x1c033435, + 0xef3ea714, + 0x3105fde7, + 0x1ea73215, + 0x23fde7ef, + 0x3cc3c121, + 0x1435a207, + 0x2103ad0b, + 0x01853fe6, + 0x430bf491, + 0x017d4dea, + 0x01c6d3ea, + 0x02334aea, + 0x24864207, + 0x94074127, + 0x0740c4c1, + 0x6f4ff6e2, + 0xc1002701, + 0x36a644c3, + 0x430bf471, + 0xea0d4dca, + 0xea017fd3, + 0x0701fa4a, + 0x27031e12, + 0x008ea310, + 0x720b0100, + 0x6742c845, + 0x4de34807, + 0xc4450411, + 0x04964127, + 0x44474027, + 0x14963127, + 0x33873027, + 0x43ab49ab, + 0xbe05b435, + 0xb125b015, + 0xefff3ea7, + 0x813411fd, + 0x184c33c1, + 0x131d4c53, + 0x1741cc44, + 0xf3e83327, + 0xefff3ea7, + 0x333411fd, + 0x4c53184c, + 0xc844131d, + 0x4ea7eb41, + 0x05fde7ff, + 0x143c274b, + 0x30274315, + 0x4ea74335, + 0x05fde7ef, + 0x141c2741, + 0x43354115, + 0xefff3ea7, + 0xd83411fd, + 0x11fc6a4d, + 0xf4e84327, + 0xefff4ea7, + 0xdc4311fd, + 0xf1fc6a3d, + 0x4027f121, + 0x6524c19d, + 0x31f441c4, + 0x27c435f3, + 0xd20b281c, + 0x0bba4d27, + 0x6d142c03, + 0x25c275f1, + 0x11f44dc3, + 0xbe1c07f0, + 0x02ff16a6, + 0x008df867, + 0x27fe9c10, + 0x54c49d40, + 0xa734c399, + 0xffe7774e, + 0x41274221, + 0x42ab433b, + 0xe7771ea7, + 0x071425ff, + 0x07410345, + 0xa75f6b54, + 0xffffff3e, + 0x0e6735bd, + 0x54eef461, + 0x0027fd24, + 0xf58ef283, + 0xe654c499, + 0x07fdbe4f, + 0x104d8347, + 0x104ce410, + 0xbff6fdb3, + 0xdfe6fdaf, + 0x1d270097, + 0x3c270bba, + 0x2df10d28, + 0x25c69df3, + 0x1c07f001, + 0xff1635be, + 0xc4854027, + 0xca65cd75, + 0xb91ec745, + 0x3027d027, + 0xc745c875, + 0x27fd665e, + 0xc19027e0, + 0x4fe640c4, + 0xf381fe95, + 0x3dea340b, + 0xd4cafe8d, + 0x9d3aea28, + 0x5e020700, + 0x33e3fe83, + 0x932b932a, + 0x27fd015e, + 0xfd145ea0, + 0xea594aca, + 0x27fe86a3, + 0x0b132b11, + 0xfe7f5e1a, + 0xea643aca, + 0x27fe5ca4, + 0x0b042b01, + 0xfe555e0a, + 0xca424aca, + 0xe127aea3, + 0xea0be32b, + 0xec364e07, + 0xa41e9407, + 0x830e0c27, + 0x27f58ef2, + 0x0d0bba4d, + 0x281c27f4, + 0xf12d4707, + 0x45114ce3, + 0x25c69dc4, + 0x1c07f001, + 0xff1599be, + 0x07fd105e, + 0x03132b14, + 0xfe2b5e11, + 0xe32be407, + 0x4e07e103, + 0x27c2efc6, + 0x5e940741, + 0x0307ff63, + 0x0103042b, + 0x07fdf65e, + 0x2b110314, + 0xfe075e1d, + 0x01030307, + 0xe45e0d2b, + 0x03e407fd, + 0x07ed2be1, + 0xd4efd64e, + 0x385e9407, + 0x40cdc1ff, + 0xfd07dff6, + 0x5e44cdc1, + 0xfd4efd01, + 0xffff4ea7, + 0x274d99ff, + 0xce264199, + 0x44b90c1d, + 0x48b61564, + 0x8613d2c0, + 0xbefd8ed4, + 0x46fe6b10, + 0x0e002703, + 0x1c7d9efd, + 0xbb6cbeff, + 0x270186fe, + 0x9efd0e02, + 0x93ff1c6f, + 0xffd402f0, + 0xc4be2d07, + 0xd11eff7c, + 0xf493fd4e, + 0x2904ffc0, + 0xce430942, + 0xd0272632, + 0xb1b2f493, + 0x40429904, + 0x2e414399, + 0x8e0d0732, + 0x170dbefd, + 0x270dabff, + 0x27048640, + 0x07d40741, + 0x93fd8e0d, + 0x04b0c3f4, + 0x2c032407, + 0xe33407c3, + 0x3ce37f2c, + 0x0334197f, + 0x32c2803c, + 0x1ed027f9, + 0xa5f0930c, + 0x88be04b0, + 0xd127ff1e, + 0xb09af093, + 0x78f6be04, + 0x1e0196ff, + 0xff3ea7a8, + 0x3411fdef, + 0xfc6a4dd8, + 0x2723070e, + 0x11f4e843, + 0x6a3ddc23, + 0xfe0bf6fc, + 0xb107fb4e, + 0xde3ec007, + 0x2b070c07, + 0xfeb31ea7, + 0x5efb0efe, + 0xfb4ef842, + 0xb107c007, + 0x1c07c83e, + 0x00273b07, + 0xfeb32ea7, + 0x5efb0efe, + 0xf04ef83a, + 0xdf3bcf5b, + 0xfc4efe2b, + 0x14be0f07, + 0xfc0efff9, + 0xff0bf00e, + 0x90004f27, + 0x43291007, + 0xa0004f27, + 0x44291007, + 0x03fc3d10, + 0x4d10ff1e, + 0xff1e03fc, + 0x042b0307, + 0x0d03000c, + 0x412703fc, + 0x4027010c, + 0xfe0b0407, + 0xd007fd4e, + 0xffb049be, + 0xb60cd499, + 0x0ed49944, + 0x01230407, + 0x3d0b3007, + 0xc4043499, + 0x41270b42, + 0x9d04349d, + 0x141e0cd0, + 0x4fff4ea7, + 0x01d239fd, + 0x3b412743, + 0x3d42ab43, + 0x2700a7d4, + 0x0ef49b40, + 0x4fff3ea7, + 0x3834c5fd, + 0xfd4efd8e, + 0xffbed007, + 0xd499ffaf, + 0x9944b60d, + 0x04070ed4, + 0x30070123, + 0x34993d0b, + 0x27459604, + 0x04349d41, + 0x1e0dd09d, + 0x032d0718, + 0xff4ea722, + 0x2139fd4f, + 0x41274301, + 0x41ab433b, + 0x00a7243d, + 0xf49b4027, + 0xff3ea70e, + 0x34c5fd4f, + 0x00fd8e38, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x0001b82c, + 0x0001b8cc, + 0x0001b78c, + 0x8d8bc899, + 0x9a9a9a9d, + 0x9ab89a9a, + 0x3fb89a9a, + 0x9a9a9a9a, + 0x9a9a9a9a, + 0x9a9a9a9a, + 0x8a8a999a, + 0x8a5e8d6f, + 0x9a9a9ab6, + 0x8a895c8c, + 0x8b8a988c, + 0x5c954a99, + 0x987a6b8b, + 0xb6a6b38c, + 0xc57ae38c, + 0x7d7c6e6e, + 0x7f7d998c, + 0x8f6f6d8c, + 0x6c4f6f7f, + 0x6e6e3f7b, + 0x998c7d7c, + 0x6d8c7f7d, + 0x6f7f8f6f, + 0x3f7b6c4f, + 0x8d86ab5b, + 0xa788998a, + 0x8b8b9898, + 0x6e7d6f6f, + 0x6c7c5e6e, + 0x8d7d6b7c, + 0x6b7d99b3, + 0x99b38d7d, + 0x8d7d6b7d, + 0x8c7d99b3, + 0x98b6b68b, + 0x99889888, + 0x886f8b88, + 0x00006f8b, + 0x00000000, + 0x8b6ba099, + 0xc9b9c57e, + 0x8b9a869a, + 0x98b79a9a, + 0x4f5f899a, + 0x991f1f3f, + 0xc6a9a899, + 0x7aa7e04f, + 0x5c956f99, + 0x9a9a9aa7, + 0xa7a7c49a, + 0xb6a7989a, + 0x889586b6, + 0x7a887999, + 0xa7a6d0a9, + 0xb6a7989a, + 0x6e7c6e7d, + 0x6f7d5e5f, + 0x7e7d4f6f, + 0x6c4f6f6f, + 0x6e7d5d7b, + 0x5e5f6e7c, + 0x4f6f6f7d, + 0x6f6f7e7d, + 0x5d7b6c4f, + 0x9a3d8c79, + 0x6b5ba76b, + 0x8b8ba76b, + 0x998b9aaa, + 0x3f7b7b8b, + 0x8cb7a67c, + 0xa69a9988, + 0x99888cb7, + 0x8cb7a69a, + 0xaa9a9988, + 0x7a8a8a99, + 0xa7797a79, + 0x978cb797, + 0x00008cb7, + 0x00000000, + 0x8b6bb999, + 0xc9b9c57e, + 0x8b9a959a, + 0x989a9a9a, + 0x4f5f7a6e, + 0x991f1f3f, + 0xc68ca899, + 0x5e8a7c4f, + 0x6b956f99, + 0x9a9a9aa7, + 0xa7c4c49a, + 0xb6a7989a, + 0x889586b6, + 0x89887999, + 0xa7a6c2a9, + 0xb689a79a, + 0x6e5e6e7d, + 0x6f7d4f5f, + 0x6f6e4e6e, + 0x6c5e5f6f, + 0x6e7d6c7b, + 0x4f5f6e5e, + 0x4e6e6f7d, + 0x5f6f6f6e, + 0x6c7b6c5e, + 0x9a3d8c79, + 0x7a5ba76b, + 0x8b8ba76b, + 0x998b9a9b, + 0x3f7b7b8b, + 0x8cb7a699, + 0xa69a9988, + 0x99888cb7, + 0x8cb7a69a, + 0xaa9a9988, + 0x6b7b7b99, + 0xa7796b79, + 0x978cb797, + 0x00008cb7, + 0x00000000, + 0xdc36f293, + 0x7a249903, + 0xf49b4447, + 0x113f2748, + 0x9b720000, + 0x24c1a0f3, + 0xa3f49bc8, + 0xebe72ea7, + 0x051027fd, + 0x003f2721, + 0x150d8200, + 0x9b402723, + 0x28030ef4, + 0x3f272105, + 0x0dc20000, + 0xf49b2315, + 0x0528030e, + 0x003f2721, + 0x150e0200, + 0x0ef49b23, + 0x0499fe0b, + 0x104cc044, + 0x84048922, + 0x24104cdc, + 0x96f00499, + 0xf4f45345, + 0x27040504, + 0x93fe0b00, + 0xfec03ef4, + 0x00270405, + 0xf493fe0b, + 0x05fe8993, + 0x93e91e04, + 0xfecbcbf4, + 0xe01e0405, + 0x01c1fe4e, + 0x13202758, + 0x3027bdf4, + 0x05fc0e99, + 0xb403ad04, + 0xa802d502, + 0xb001d502, + 0xac02d502, + 0x40ecd402, + 0xfe049972, + 0x00824ff6, + 0x276eefd6, + 0x6404b931, + 0xb803bd02, + 0x6b41230a, + 0x2744344f, + 0xb804bd44, + 0x8404b90a, + 0x994ef602, + 0x0299f604, + 0x7f03997e, + 0x41274926, + 0x8dff3ce0, + 0xff2ce000, + 0x4fc60083, + 0x33438763, + 0xf1430b34, + 0x00039443, + 0xd53201ff, + 0x0b02ac03, + 0xa802d523, + 0x54048902, + 0x02a403d1, + 0x18331407, + 0x142b4633, + 0x7e6331ca, + 0x0027fee4, + 0x0499fe8e, + 0x944fd6fe, + 0x921e3227, + 0x0ab804b9, + 0x04bd4103, + 0xa01e0ab8, + 0x026404b9, + 0x31033e07, + 0x03bd4523, + 0x4f6b0ab8, + 0x278d44d4, + 0xb904bd42, + 0x07851e0a, + 0x33438732, + 0xf1430b34, + 0x00039443, + 0xd53201ff, + 0x0b02ac03, + 0xa802d523, + 0xd69b1e02, + 0x961e804f, + 0x2ce44027, + 0x1eff75ff, + 0x8856bef3, + 0x4e991efe, + 0xff4ea7fb, + 0x43d1fbff, + 0xb00704a8, + 0xde27c407, + 0x1c180000, + 0x1632dc31, + 0x2722fd9b, + 0x76be0e0c, + 0x4027000c, + 0xd122f49b, + 0x1e04a8c3, + 0x271b07e7, + 0x0ea7a02c, + 0xbefbf75f, + 0x27ff6f4b, + 0x0ef49b40, + 0xfb4efb8e, + 0xffff4ea7, + 0xa843d1fb, + 0x07b00704, + 0x00de27c4, + 0x311c1800, + 0x9b1632dc, + 0x0c2722fd, + 0x0c33be0e, + 0x9b402700, + 0xc3d122f4, + 0xe71e04a8, + 0x1ea70b07, + 0x27fbf75f, + 0xfb0ea02c, + 0xff6f069e, + 0x44534007, + 0x340b3487, + 0x832d3c23, + 0x319b0f0c, + 0x34730333, + 0x0b100c23, + 0x1631c830, + 0x277f3c28, + 0xfe0b7d0c, + 0x0f403ccc, + 0x2b3f4c27, + 0x0b044743, + 0x7c0c27fe, + 0x3c23fe0b, + 0xa3034740, + 0x4efe0b01, + 0xb004d1fe, + 0x3d419902, + 0x99564399, + 0x4299344e, + 0x3318033e, + 0x0713ab38, + 0x001ea34e, + 0x28030200, + 0xab0c4c33, + 0xab243314, + 0x080e0712, + 0x070527e6, + 0x140c332e, + 0x01ab2223, + 0x1ea72433, + 0xd5fbffff, + 0x27048010, + 0x0200004e, + 0x14d53207, + 0x38a30484, + 0x048813d5, + 0x040010d5, + 0x00082fa3, + 0x12d50c00, + 0x40270404, + 0x043014d5, + 0xf84efe8e, + 0x077d0a99, + 0xa3a2e0c0, + 0x012d2701, + 0xfec99905, + 0x00df9ff6, + 0x00003f27, + 0xc4b91000, + 0xba070264, + 0x230cbc33, + 0x6bb2ab41, + 0xf4b3ab4f, + 0x9900b648, + 0x4b067bc4, + 0x02acc4d1, + 0x4d994a46, + 0xe0d9a608, + 0x2701c6d1, + 0x84c4b912, + 0xde4fe602, + 0x000d2701, + 0xff3ea720, + 0x30e5fbff, + 0xe5020380, + 0x0203c030, + 0x018bd2e0, + 0x0000bfa3, + 0xae668000, + 0xa768c8c1, + 0xfbffff3e, + 0x53088499, + 0x1c34d541, + 0xc99fe604, + 0x4fa2e000, + 0xfdc49901, + 0xd4074103, + 0x0284c4b9, + 0x4fe6df6b, + 0xc4c100c4, + 0x83448158, + 0x0000014f, + 0x7640e880, + 0x3e41e001, + 0x020f2701, + 0xa7200000, + 0xfbffff3e, + 0x030030e5, + 0xc0a2e002, + 0xff3ea700, + 0x34c1fd4f, + 0x3640c874, + 0x4ea73027, + 0xd5fbffff, + 0xd5048c4b, + 0xd504084b, + 0x27040c43, + 0x1443d530, + 0x99f88e04, + 0x3027f6c4, + 0x43074ef6, + 0x435e4f6b, + 0xe03127ff, + 0x3300bca2, + 0x1f5e1c3c, + 0x7434c1ff, + 0x00004ed8, + 0xc4c1c301, + 0x41409958, + 0x00ab01f8, + 0x8000bda3, + 0x00013e27, + 0xaf02d801, + 0xffff4ea7, + 0x00bea3fb, + 0x4bd50100, + 0x3ea3048c, + 0xd5020002, + 0xd504084b, + 0x27040c43, + 0x1443d530, + 0x27f88e04, + 0x6b430731, + 0xfeec5e4f, + 0xa2e0d127, + 0xd2130081, + 0x0284c4b9, + 0xff404ff6, + 0x01530d07, + 0x0d030f6b, + 0x1d074000, + 0xffa879be, + 0xab100c33, + 0xff3ea70d, + 0x30e5fbff, + 0xe4020300, + 0x99ff44a2, + 0x41532884, + 0xd5104ca3, + 0xf6041c34, + 0x2700b19f, + 0x0000010f, + 0xff4ea740, + 0x40e5fbff, + 0xa7020340, + 0xfd4fff3e, + 0xec7434c1, + 0x5eff2340, + 0x2d27ff55, + 0x5e5e0511, + 0x333027fe, + 0x635e1c3c, + 0x5e3027fe, + 0xc499ff5d, + 0x1543c480, + 0x0103c4b9, + 0x4fd6d127, + 0x5ed02782, + 0xc499ff7e, + 0xe743c0fd, + 0x0103c4b9, + 0xd4074103, + 0x6d5edf6b, + 0x010f27ff, + 0x1e400000, + 0x779fd681, + 0x40004d27, + 0x03a034e5, + 0x00bfa302, + 0xe5800000, + 0x0203e034, + 0x46fe655e, + 0x8ba2e09f, + 0xfcc49900, + 0x14074103, + 0x2e5e1f6b, + 0xa34123fe, + 0xfffffe4f, + 0xe44103ff, + 0x1efe8441, + 0x530107bd, + 0x000d0301, + 0xa7acbe40, + 0x5e0fabff, + 0xc399fe19, + 0x3e33c0fd, + 0x0103cdb9, + 0x0d07d32b, + 0x7348d0c8, + 0x031d0701, + 0xbe40000d, + 0x33ffa78a, + 0xdfab100c, + 0x325e0dab, + 0x5e1127ff, + 0x4d27fde1, + 0x34e5e000, + 0xa30203a0, + 0x000000bf, + 0xe034e580, + 0xef5e0203, + 0x80c499fd, + 0xb9be43c4, + 0x760103c4, + 0xfe0f2747, + 0x5ee000ff, + 0x0013ff01, + 0xc499b61e, + 0x074103fd, + 0x5e1f6b14, + 0x0f27fda5, + 0xc000ffff, + 0x4efee85e, + 0x07b007fb, + 0x07c403c0, + 0x030c071b, + 0x20272c1c, + 0x000bd1be, + 0x04c6d007, + 0xfb8e0d07, + 0x1d270c07, + 0xb3be0800, + 0xd007000f, + 0x0c070216, + 0x08001d27, + 0xfe7cb2be, + 0x0449f453, + 0xb4050d07, + 0x0000fb8e, + 0x00040000, + 0xe107f54e, + 0x9107e183, + 0x50071e87, + 0x1bd1100b, + 0x00d1029c, + 0x5cd10290, + 0xf22302a4, + 0xe79f1ea7, + 0x0bc02bfd, + 0x93b3070b, + 0x03e13bf3, + 0x02945ad1, + 0x1005d207, + 0x99545289, + 0x33294cf0, + 0xbf6b8407, + 0x1c158f6b, + 0x3548f799, + 0x15f225f0, + 0x350027f3, + 0x8f3ea710, + 0x4c27fde7, + 0x15340516, + 0x35e1c33c, + 0xd1ee8730, + 0x0b02a452, + 0x7f3ea7e5, + 0xe1d1fde7, + 0x4103029c, + 0x34052a2b, + 0x3215a10b, + 0xe76f4ea7, + 0x053035fd, + 0x3542154a, + 0x8fdfe640, + 0x03450703, + 0x07028c4d, + 0x0304071d, + 0x45202718, + 0x10a7bef4, + 0xa7f01100, + 0xfbffff3e, + 0x042c30d5, + 0x042034d1, + 0x071e42dc, + 0x00de27c3, + 0xfd9b2000, + 0x0f0c2722, + 0x0007b8be, + 0xf49b4027, + 0x20c3d122, + 0xeb32d804, + 0x02b052d1, + 0x24991127, + 0x32238935, + 0x0107943b, + 0x043b392b, + 0x30073012, + 0x47342499, + 0x07143b23, + 0x6b610741, + 0x533f6b4f, + 0x004fa363, + 0x33800900, + 0x0f6c8338, + 0x6da343ab, + 0x2c830100, + 0xabf405f0, + 0xe6b4d662, + 0x21028b7f, + 0xe2f211f1, + 0x27031012, + 0x788fe631, + 0x11f00102, + 0x334607f7, + 0x4da3143c, + 0x0ee31000, + 0x75010000, + 0x558707f3, + 0xa7f065f4, + 0xfbffffce, + 0x00009e27, + 0x00de2740, + 0x1ea70800, + 0xd1feffff, + 0xc4014814, + 0x2ea70f42, + 0x99ffffff, + 0x24992623, + 0x7a34ce27, + 0x7103f111, + 0x011618ee, + 0x8fe6b607, + 0xf32100c1, + 0x37eefa01, + 0xc4d100c5, + 0x41dc0420, + 0x22f99b17, + 0xbe0f0c27, + 0x270006ed, + 0x22f49b40, + 0x0420c3d1, + 0xa3eb31d8, + 0x080000be, + 0x0424cbd5, + 0x04a8c4d1, + 0x9b1742dc, + 0x0c2722fd, + 0x06c7be0e, + 0x9b402700, + 0xc3d122f4, + 0x32d804a8, + 0xa1f293eb, + 0x242903df, + 0x04a4cad5, + 0x242d4103, + 0xc6f75399, + 0xba81e034, + 0x03f32100, + 0x6f73ea81, + 0xff3ea7ff, + 0x34d1fbff, + 0x42dc0420, + 0x27c3071e, + 0x200000de, + 0x2722fd9b, + 0x7ebe0f0c, + 0x40270006, + 0xd122f49b, + 0xd80420c3, + 0x4ea7eb32, + 0xd1fbffff, + 0x0704a843, + 0x00ce27d4, + 0x311c1800, + 0x00a032fc, + 0x2722fc9b, + 0x52be0e0c, + 0x40270006, + 0xd122f49b, + 0x1e04a8d3, + 0xe3f321e6, + 0x610300bd, + 0x3f73eefa, + 0xb053d1ff, + 0x99212702, + 0x34893431, + 0x23213b0e, + 0x30338941, + 0x342b429b, + 0x49f6f431, + 0x56f75499, + 0x07202749, + 0x6bf17143, + 0xab33534f, + 0xfface341, + 0xe30f3c83, + 0xab080fbd, + 0xabb3aba4, + 0x00bda3a2, + 0xfefc5e20, + 0xeb5efb51, + 0x71f053fe, + 0x1e0201fd, + 0x20c4d1d3, + 0x1c42dc04, + 0x0000be27, + 0x22fb9b20, + 0xbe0f0c27, + 0x270005d5, + 0x22f49b40, + 0x0420c3d1, + 0x93eb32d8, + 0x03d343f0, + 0x5ef96d7e, + 0xf421ff1d, + 0x017074ee, + 0xffff4ea7, + 0xa844d1fb, + 0xdf48fc04, + 0x104cfc00, + 0x302700da, + 0xde8af093, + 0x27032d03, + 0x9854d540, + 0x9054d502, + 0x9454d502, + 0xff3ea702, + 0x34d1fbff, + 0x4ee30418, + 0xd53fffff, + 0x41041834, + 0x0518bef0, + 0xa7452700, + 0xfdeddf3e, + 0x3ea73405, + 0x81fdefff, + 0x0a4dd834, + 0x23070efc, + 0xf4e84327, + 0x3ddc2381, + 0xa7f6fc0a, + 0xfdefff3e, + 0x34d54327, + 0x03070218, + 0x48dc0461, + 0xd51427fc, + 0xd5021801, + 0x27021c01, + 0x5803d530, + 0xe72ea706, + 0x2305fdeb, + 0x00004f27, + 0x24150d82, + 0xd50ef39b, + 0xd5022001, + 0x27065c03, + 0x2404d543, + 0xff2ea702, + 0x2391fdef, + 0x27fc38dc, + 0x2424d544, + 0xdf2ea702, + 0x4027fdeb, + 0x3f272405, + 0x0dc20000, + 0xf49b2315, + 0x27f2210e, + 0x9227ee01, + 0x03004700, + 0x27f58ef2, + 0xfd875e30, + 0x00004ea3, + 0x006da302, + 0x5ef4050e, + 0x4027fd6b, + 0x9b0ef49b, + 0x31dc483f, + 0x202d271a, + 0x22f29b02, + 0xf49b4027, + 0x8b00070e, + 0x22f49bff, + 0xd8483f9b, + 0x4ea7ec31, + 0xd1fbffff, + 0x33049044, + 0x1d4c534b, + 0x41234986, + 0x330f4c83, + 0xf49b104c, + 0x484f9b40, + 0x271a41dc, + 0x9b02202d, + 0x402722f2, + 0x070ef49b, + 0x9bff8b00, + 0x3f9b22f4, + 0xec31d848, + 0x4ea73027, + 0xd5fbffff, + 0x5e04a843, + 0x1507febe, + 0x028c1d03, + 0xad5ef145, + 0x470027fc, + 0x8ef20300, + 0x5e7207f5, + 0x0507fdb1, + 0xfe8f56be, + 0x4efec65e, + 0x25f593f5, + 0x53c103dd, + 0x89564960, + 0xf2230c54, + 0x32c17007, + 0x1a64ca30, + 0x04030707, + 0xfbbe1027, + 0xf4930008, + 0x27fe8158, + 0x077405e0, + 0x8ef2030e, + 0x0f5499f5, + 0x73d149a6, + 0x3fe602a8, + 0x468702ea, + 0x4401430b, + 0x4fe6f455, + 0xd707025a, + 0x71c1d403, + 0xbe0d07c4, + 0xa6000b02, + 0x07e42709, + 0x8ef2030e, + 0xff4ea7f5, + 0x43d1feff, + 0x32c00148, + 0x0b468710, + 0xf6400142, + 0x2702320f, + 0xb01e0dec, + 0x0e07e227, + 0xf58ef203, + 0x27547489, + 0x6073c120, + 0xf265469b, + 0x02e634ee, + 0x45534607, + 0x470b4487, + 0x42c13607, + 0x1f3c83cc, + 0x433b4127, + 0x3607428b, + 0x030c5289, + 0x35f47531, + 0xc6f345f2, + 0x75412744, + 0xb9f441f4, + 0x53029873, + 0x0b448745, + 0xcc44c147, + 0x3ff6f425, + 0xf26100ed, + 0x07072586, + 0x07f78e7e, + 0xf7f47e07, + 0x3ff6f371, + 0x74990197, + 0x904ff6f7, + 0x16f46101, + 0xe6f27145, + 0x99021c2f, + 0x79b97d74, + 0x41e00102, + 0x41f40267, + 0xfd930208, + 0x93fff33c, + 0x03d0aff4, + 0x2c032407, + 0xe334079f, + 0x3ce37f2c, + 0x0334197f, + 0x32c2803c, + 0x95f893f9, + 0xd03903d0, + 0x1907db59, + 0x07f6f77e, + 0x071907c0, + 0xf6ee7e0b, + 0x4007da19, + 0x79104c33, + 0x331907db, + 0xab0a07c8, + 0xf6da7ec4, + 0x1907c0ab, + 0xd17e0b07, + 0x180c33f6, + 0x8c05c0ab, + 0xd4038403, + 0x95a08fc4, + 0x93c00005, + 0x03d04ff0, + 0x61f6367e, + 0x713576f3, + 0x9944f6f4, + 0x4be6f774, + 0xffff0ea7, + 0x004e27fb, + 0x72d103fc, + 0x04d502b0, + 0x23990490, + 0x0271b93d, + 0x9b462701, + 0x6b302743, + 0xd5140b4f, + 0x0304b803, + 0x1402334c, + 0x1f6b1407, + 0xf4933127, + 0xd503d004, + 0x1d04b401, + 0x41f23143, + 0x0ea127f3, + 0x83a02723, + 0xb1271f3c, + 0xb33bf421, + 0xbff6b48b, + 0xf3610133, + 0x01283ff6, + 0xaff64a07, + 0xfe71011d, + 0x0112eff6, + 0xbff6db07, + 0xf2510107, + 0x07071607, + 0xfd15fe05, + 0x07f9cb7e, + 0x990ff6e0, + 0x5c509900, + 0x935d5d99, + 0x03db1ffc, + 0x012e0dee, + 0xc1c12087, + 0x5824f148, + 0xf1ff0017, + 0x00183823, + 0x8b410bff, + 0xf5302743, + 0x00175824, + 0x1803fdff, + 0xc1ff0018, + 0x180650c1, + 0x43f14d87, + 0xff001758, + 0x183842f1, + 0x310bff00, + 0x43f5328b, + 0xff001758, + 0x1818defd, + 0x5449ff00, + 0x41033027, + 0x539d544d, + 0xb9b5860f, + 0x03010074, + 0x0074bd41, + 0xbcafe601, + 0x45f493fd, + 0x431d03cf, + 0x07fd9f5e, + 0x75fdbe0d, + 0xb474a9fe, + 0x87035302, + 0x03370b34, + 0xb830d541, + 0xb474ad02, + 0xfe575e02, + 0xfd7e03e0, + 0xf2030e07, + 0xe727f58e, + 0x27fd865e, + 0x53be401c, + 0x52c1fff0, + 0xcc2fe66c, + 0x03050700, + 0x1c27200c, + 0xf02abe40, + 0x6054c1ff, + 0x44c10507, + 0x0315073c, + 0x1c03100c, + 0x95202744, + 0x0a33be54, + 0x07050700, + 0x140c0315, + 0x27281c03, + 0x0a23be20, + 0x27564900, + 0x0f549d41, + 0x27fd455e, + 0xfef85ed1, + 0xed5ee127, + 0x5e4127fe, + 0x3127fee2, + 0x27fed75e, + 0xfecc5eb1, + 0x1e1f42c0, + 0xf77499ff, + 0xfea74fe6, + 0xcea2f093, + 0xf4897e03, + 0x5ef77499, + 0x2027fe5a, + 0x1f5ef255, + 0x0174b9fd, + 0xf1448701, + 0x01b7804d, + 0xfdd15e00, + 0x8748c0c1, + 0x50c4c12d, + 0x175821f1, + 0x23f1ff00, + 0xff001838, + 0x410b400b, + 0x3027438b, + 0x175824f5, + 0xd3fdff00, + 0xff001818, + 0xb9fef15e, + 0xc3010174, + 0xf1448741, + 0x01b7804d, + 0xfd955e00, + 0xf3653127, + 0x99fd175e, + 0x3ea70854, + 0x33fddfff, + 0x4ea30c4c, + 0xd5100000, + 0xd5020834, + 0xa7020832, + 0xfd4fff4e, + 0x53c54311, + 0xff135e6c, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0xebef2ea7, + 0x051027fd, + 0x003e2721, + 0x23150400, + 0xf49b4027, + 0x0528230e, + 0x003f2721, + 0x150d4200, + 0x0ef49b23, + 0xfd4efe0b, + 0x43270319, + 0xd333d307, + 0x0e290139, + 0x1200d4f5, + 0x3347ff02, + 0x04f10d07, + 0xff021000, + 0x27f848dc, + 0x034e0724, + 0x0002f531, + 0x87ff0212, + 0xf54a0333, + 0x02120032, + 0x271187ff, + 0x0f4c8330, + 0x13f5e653, + 0xff021600, + 0x3314ec33, + 0x4eab104c, + 0x1400d3f5, + 0xd4f5ff02, + 0xff021404, + 0x8e0ef39b, + 0x93fe4efd, + 0x03d8e7f1, + 0x13691229, + 0x4ea71e09, + 0x0bfd4fff, + 0x2b421132, + 0x0b4ea73e, + 0x409dfee3, + 0x4d420508, + 0x99134943, + 0x436d0811, + 0x5309419d, + 0x27077608, + 0x0ef49b40, + 0xff8b0007, + 0xe30b4ea7, + 0x273027fe, + 0x9d430520, + 0xfe8e0842, + 0x42734007, + 0xf4e84103, + 0xfe4ee71e, + 0xd8484f9b, + 0x0219fb41, + 0x32074327, + 0x34f53333, + 0xff021200, + 0x100031f1, + 0xe247ff02, + 0x53181c33, + 0x19661d1c, + 0x25330439, + 0x23f14487, + 0xff021804, + 0xf1070299, + 0x02160040, + 0x0b1123ff, + 0x87123b03, + 0x0b42273e, + 0x0034f501, + 0x8eff0212, + 0x273e87fe, + 0xf5002742, + 0x02120034, + 0x4efe8eff, + 0x070e31fc, + 0xc2d20731, + 0x00210be1, + 0x010be12b, + 0xfc8e2e05, + 0x41270191, + 0x2b2d1299, + 0x23423b3e, + 0x8bc40741, + 0x03325bc3, + 0x0312a141, + 0x874c2b31, + 0x0bd40533, + 0xbe300132, + 0x0bfe6521, + 0x4efc8e0c, + 0x390219fa, + 0x07c00703, + 0x27033302, + 0x0004f544, + 0x87ff0212, + 0x07402733, + 0x0034f520, + 0x03ff0216, + 0x29432724, + 0xf5f063c1, + 0x02120024, + 0x0024f1ff, + 0xdcff0210, + 0x4107f848, + 0x34274a03, + 0x530f4c83, + 0x0023f516, + 0x33ff0212, + 0xd027141c, + 0xab104c33, + 0x000df541, + 0xf5ff0214, + 0x02140404, + 0x0efd9bff, + 0xc331cb51, + 0x196c3bc2, + 0xf14333c4, + 0x02100043, + 0x183c33ff, + 0x441d3c53, + 0x55f04334, + 0x07fa8ecb, + 0x070c072f, + 0xff397e1b, + 0x2f10f201, + 0x01000001, + 0x00002f27, + 0xc4190100, + 0x4533c339, + 0x43f5f205, + 0xff021800, + 0x180442f5, + 0x4e23ff02, + 0x35fde800, + 0x004e034d, + 0x40f5fde8, + 0xff021810, + 0x181442f5, + 0x4e23ff02, + 0x35fde7f0, + 0x31f4014d, + 0xcab40bc3, + 0xc441a8b3, + 0x07a34fc6, + 0x2bd40bd3, + 0x9adfc6db, + 0x4333c419, + 0x100043f1, + 0x3c33ff02, + 0x1d3c5318, + 0x278734c0, + 0x000000af, + 0x071b0701, + 0x7e2f070c, + 0xf101febf, + 0x00011f10, + 0x1a070100, + 0x1d071d02, + 0xc339c419, + 0xf1054533, + 0x180043f5, + 0x41f5ff02, + 0xff021804, + 0x4e232027, + 0x35fde800, + 0x004e0342, + 0x40f5fde8, + 0xff021810, + 0x181441f5, + 0xf301ff02, + 0xe7f04e23, + 0x2b4235fd, + 0xe6b30bd3, + 0x19ff2cdf, + 0xf14333c4, + 0x02100043, + 0x183c33ff, + 0xc41d3c53, + 0xf0439834, + 0xfa8ecb55, + 0xd007fd4e, + 0xf37e0d07, + 0x27d419fd, + 0x03e44735, + 0xf54333e1, + 0x02120043, + 0x272e87ff, + 0x0024f543, + 0xf1ff0212, + 0x02100021, + 0x181c33ff, + 0x661d1c53, + 0x99e43316, + 0xe3f107d4, + 0xff021804, + 0x143b1123, + 0x4227130b, + 0x120024f5, + 0x24f1ff02, + 0xff021000, + 0xcef848dc, + 0xd019af10, + 0x2047d451, + 0x412b2103, + 0xd4553287, + 0x34f12123, + 0xff021000, + 0x39f848dc, + 0x271007d3, + 0xf5133344, + 0x02120014, + 0x273387ff, + 0xf5210340, + 0x02160034, + 0x272287ff, + 0xf5d02943, + 0x02120024, + 0x0024f1ff, + 0xdcff0210, + 0x4007f848, + 0x34274a03, + 0x530f4c83, + 0x0023f506, + 0x33ff0212, + 0x3027140c, + 0xab104c33, + 0x0013f540, + 0xf5ff0214, + 0x02140414, + 0x0ef39bff, + 0xf84efd8e, + 0x07050499, + 0x07b00782, + 0xf68f6ba1, + 0xa700ef4f, + 0xffffff9e, + 0x99391c99, + 0x9db95513, + 0xc30b0e66, + 0x4c2b4d07, + 0x4ff64f6b, + 0xcea70119, + 0xb9ffffff, + 0xee0e64c4, + 0xa700e14d, + 0xffffff3e, + 0x187c34b9, + 0x011a4ff6, + 0x41034d07, + 0x0e6634bd, + 0xf19d0ea7, + 0xf60439ff, + 0x0700ba4f, + 0x0f4c834d, + 0x34872407, + 0x232b2433, + 0x2333242b, + 0xf1982e23, + 0x99b295ff, + 0x3a0794a4, + 0x9154249d, + 0x703c03b4, + 0x27304c03, + 0x01192709, + 0x0501233e, + 0x0334034e, + 0x81f19844, + 0x25235124, + 0x2733e3b4, + 0x06b89d41, + 0x3505b49d, + 0x45b055b3, + 0x1cae99b0, + 0x5107be9d, + 0x99b465a4, + 0x2e9d1cae, + 0x44a4c12d, + 0x3540a3c1, + 0x48a4c124, + 0x24452325, + 0x9d95ae99, + 0xa499552e, + 0x9946561a, + 0xa39960a4, + 0x2744d619, + 0x27320041, + 0x9d430b40, + 0xa4992424, + 0x274f5639, + 0x27b41d46, + 0x094d2739, + 0x06b2992c, + 0xb42db33d, + 0x66102cc0, + 0x9604b499, + 0x9d412745, + 0x0b0704b4, + 0x27fcc27e, + 0xbef88e00, + 0x5eff6e53, + 0x0ea7ff43, + 0xbefff19f, + 0xb9ff6e8e, + 0xee0e64c4, + 0x91ff12d4, + 0xe33027c4, + 0x04ffff4d, + 0x0200004e, + 0x0c273127, + 0x7cc3bd0c, + 0x1ef88e18, + 0x9d0ea7ff, + 0x63befff1, + 0x9db9ff6e, + 0x4d070e66, + 0x4f6b4c2b, + 0xfed44fe6, + 0xf88e0b27, + 0x8e0c0c27, + 0x03b451f8, + 0x1eb45544, + 0x07fc4e94, + 0x48cf9bd0, + 0x33fbc1d8, + 0xcc5317cc, + 0x9b40271b, + 0x0d074af4, + 0x53fdb37e, + 0x13d051c3, + 0x2bc383c4, + 0x8ed0550c, + 0x99fe4efc, + 0xf0630604, + 0x4c20e107, + 0x8ef04310, + 0xfa14d0fe, + 0x1f07e423, + 0x30272427, + 0x0fbefe05, + 0xf043fe6f, + 0xfa4efe8e, + 0x07040499, + 0x6bd007b1, + 0x3e4826bf, + 0x91d451a5, + 0x75a027dc, + 0xa64127c4, + 0x07ca65b6, + 0x2746f6b4, + 0x56cb9d40, + 0x9d05da9d, + 0xfa8e04d4, + 0xca654027, + 0x41a6b407, + 0x0d07d151, + 0xf493a03e, + 0x5103d3d0, + 0x7442c1d3, + 0x43c5320b, + 0x9bd51e74, + 0x41dc484f, + 0x202d271a, + 0x22f29b02, + 0xf49b4027, + 0x8b00070e, + 0x22f49bff, + 0xd8483f9b, + 0x4f9bec31, + 0x9b42e348, + 0x039948f4, + 0x5231c049, + 0xf49b4027, + 0xab1a3340, + 0x001ea31f, + 0xf19b0500, + 0x004e2740, + 0xf49b0500, + 0x003e2740, + 0xf39b0220, + 0x484f9b40, + 0x271a41dc, + 0x9b02202d, + 0x402722f2, + 0x070ef49b, + 0x9bff8b00, + 0x3f9b22f4, + 0xec31d848, + 0x99484f9b, + 0x42e37a03, + 0x43ab3347, + 0x0b48f49b, + 0x004e27fe, + 0xf49b0700, + 0x003e2740, + 0xf39b0f00, + 0x004e2740, + 0xf49b0701, + 0x4e961e40, + 0x21fb93fb, + 0xb41903d3, + 0xf39345a6, + 0x99049ae0, + 0x4fd60534, + 0x9b442769, + 0xfc9321f4, + 0xa703c840, + 0xfeffffde, + 0xf093c401, + 0x8b03c834, + 0x0ad499f4, + 0x3b233007, + 0x32104536, + 0x262b04cc, + 0x9b402701, + 0x02c021f4, + 0x27044c64, + 0xff4ea730, + 0x43bdfeff, + 0xb4191cfc, + 0x30274586, + 0x9a92f493, + 0x06439d04, + 0x8e0d03c0, + 0x000e03fb, + 0xd27e4e20, + 0x13b61ef9, + 0xf4933bf3, + 0x2703d2ac, + 0x8e430500, + 0x063499fb, + 0x99934fd6, + 0x41dc0434, + 0xd434598d, + 0xa787104c, + 0xfffb330e, + 0xff6d04be, + 0xff7b04ec, + 0x003960be, + 0xffe017be, + 0xfb8e0027, + 0xa71e0427, + 0x0ea7fd4e, + 0xbefffae3, + 0xe8ffe8f2, + 0x93009900, + 0x03d26bfe, + 0x8960e3c1, + 0x34890ce1, + 0x07200728, + 0x33233330, + 0x2b419b35, + 0xc52e0732, + 0x3e2368e4, + 0x03fffad4, + 0xd627642c, + 0x21014627, + 0x3105d123, + 0x34032403, + 0x4227f498, + 0x052004fd, + 0x3ea7ff00, + 0x27ffffff, + 0x6634bd41, + 0x0f329906, + 0xf49b4027, + 0x8741270e, + 0x4024f522, + 0x93ff02b0, + 0x03d20bf3, + 0xe49d4027, + 0x1331190e, + 0x3ea76ef2, + 0x93feffff, + 0x03d1f3f4, + 0x1cfc3dbd, + 0x14d64205, + 0xfd8e0027, + 0x003a59be, + 0x99aaf493, + 0x05439904, + 0x6dbe3216, + 0x0027ffdf, + 0x0627fd8e, + 0xfc4efd8e, + 0xc107d007, + 0x22f9357e, + 0x8e00270c, + 0x7e0d07fc, + 0xd151fb30, + 0x1c0bd431, + 0x271241ca, + 0x0ad44110, + 0x0715f614, + 0xf9b17e0d, + 0xfc8e0027, + 0xee1e142b, + 0x74be0d07, + 0x04c8feaa, + 0x4efc8eeb, + 0x8dfc93f6, + 0xc41903d1, + 0xf3934586, + 0x9904994c, + 0x4c760534, + 0xd17ef993, + 0x0e9d9903, + 0xc66096c1, + 0x44275edf, + 0x510e949d, + 0x25302764, + 0x50669994, + 0x948d4027, + 0x64969d78, + 0xffff4ea7, + 0xfc43bdfe, + 0x28f2531c, + 0x45f493fe, + 0x302703d1, + 0x42050027, + 0x8e7493c5, + 0x063499f6, + 0x99ba4fd6, + 0x41dc0434, + 0xd43459b4, + 0xa7ae104c, + 0xfffb330e, + 0xff6b98be, + 0xbea204cc, + 0xbe0037f5, + 0x27ffdeac, + 0xa7f68e00, + 0xfffb330e, + 0xffe743be, + 0x0fe08007, + 0xffffffff, + 0x4ea700b7, + 0x01fd4fff, + 0x9d400743, + 0x43336693, + 0x936c9dc5, + 0x03c17ff3, + 0xd165f293, + 0xe041f103, + 0xf1ff0004, + 0x0004dc4c, + 0x7f3ce3ff, + 0x197f2ce3, + 0x803c0334, + 0xc1f932c2, + 0xc9066090, + 0xb107a007, + 0x07407c27, + 0x10dc070b, + 0xd70741cc, + 0x8bbe1d07, + 0x0a07ffe6, + 0xcd2b1d07, + 0xffe66bbe, + 0xad0bbd0b, + 0x4027c076, + 0x04d084fd, + 0x3ea7ff00, + 0x79fffb33, + 0x274a7634, + 0xc1302741, + 0x949d609d, + 0x99932d0e, + 0xfc9318d4, + 0xc003d080, + 0x8925104c, + 0xd0c128d1, + 0x962fbe34, + 0x4d0fabff, + 0x4cd489c0, + 0xc08d040b, + 0xfef05e0c, + 0xfb310ea7, + 0x69f9beff, + 0x8dc51eff, + 0xc34d0cc3, + 0xa7fedd5e, + 0xfeffff4e, + 0x3ea74211, + 0xd1ffffff, + 0x87065431, + 0xf5c41922, + 0x00156821, + 0x274606ff, + 0xf1f49330, + 0x05270497, + 0x8e06439d, + 0x8e0527f6, + 0x07fd4ef6, + 0xc21111d1, + 0x04197d12, + 0x4533d301, + 0x211b320b, + 0x43f50139, + 0xff021800, + 0x180442f5, + 0x3027ff02, + 0xe8004e23, + 0x034335fd, + 0xfde8004e, + 0x181041f5, + 0x42f5ff02, + 0xff021814, + 0xe7f04e23, + 0x352027fd, + 0xa6de2143, + 0x26d131eb, + 0x0b04191b, + 0x1b4533e2, + 0xf5013921, + 0x0218004e, + 0x0442f5ff, + 0x27ff0218, + 0x004e2330, + 0x4335fde8, + 0xe8004e03, + 0x1041f5fd, + 0xf5ff0218, + 0x02181442, + 0xf04e23ff, + 0x4335fde7, + 0x212bfd8e, + 0x0000bc1e, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x9966f393, + 0x20340103, + 0x02084a4f, + 0x234fc000, + 0x0b00020a, + 0xf453ff1e, + 0x3405030b, + 0xf453fe0b, + 0x3405012a, + 0xf4933027, + 0x9d04610c, + 0xfe0b0643, + 0xff32269e, + 0x4127fe4e, + 0x3e06049d, + 0xa6c2bef4, + 0x8e0027ff, + 0x31ff9efe, + 0xff2ea7ff, + 0x03c1ffff, + 0x5424d144, + 0x0e34ce06, + 0x065423d5, + 0xfb330ea7, + 0x960439ff, + 0x9efe0b44, + 0xa7ff32a7, + 0xffffff4e, + 0xb9fc43c1, + 0xca010044, + 0x430b1303, + 0x830e40c2, + 0x03330f0c, + 0x007c00f9, + 0xfe0bff00, + 0xfe0b0027, + 0x6f45f493, + 0x053027fe, + 0x4c03bd04, + 0x0b002701, + 0x93fd4efe, + 0x04608ffd, + 0x02d8d4d1, + 0x45d6e007, + 0xef89f493, + 0x0d0c27fe, + 0xfd8ee405, + 0xffff3ea7, + 0x9032d1ff, + 0x2b442115, + 0x47418342, + 0x9442e944, + 0xe9ff0015, + 0x00159843, + 0xd532caff, + 0x02f802d1, + 0x2c834127, + 0x0712070f, + 0xe904bd32, + 0x33133302, + 0x27312b35, + 0xd8d0d140, + 0xc5322b02, + 0x2387bce4, + 0x230b0171, + 0x0603f453, + 0xe4052333, + 0x20001e83, + 0x642f0301, + 0x96000678, + 0xdcd4d117, + 0x2a238902, + 0xd4d54103, + 0x3cd802dc, + 0x40271d10, + 0xe49d0027, + 0xc1fd8ede, + 0x41abe824, + 0x89e824c5, + 0x31831e03, + 0x034e23bd, + 0x0027d41e, + 0xfa4efd8e, + 0x5fe6fa93, + 0x9d402704, + 0xfb9365a4, + 0x930458a8, + 0x045e37fc, + 0xf093b401, + 0x8b04589c, + 0xf6d007f4, + 0x26c41906, + 0xa7302742, + 0xfeffff4e, + 0x1cf043bd, + 0x0d07c31d, + 0x3027fa8e, + 0x04ccc31d, + 0xff4ea719, + 0x43bdfeff, + 0x03c41cf0, + 0xfe6a7e0a, + 0x0d07d027, + 0x02c4fa8e, + 0x91f093de, + 0xa27e045f, + 0x05a499fe, + 0x4ea747d6, + 0x11feffff, + 0xff2ea743, + 0x24d1ffff, + 0x33870654, + 0x34f50d07, + 0xff001568, + 0xd44cfa8e, + 0x5f66f093, + 0x5efa0e04, + 0x0d07fe60, + 0xfe1587be, + 0xf54eef1e, + 0x0ea7d027, + 0xbefffae3, + 0x93ffadbc, + 0x045f47f8, + 0x4fff5ea7, + 0x1df693fd, + 0xe00704a9, + 0xffff0fe0, + 0x00f7ffff, + 0x20074007, + 0x25334333, + 0x29f9242b, + 0xff00052c, + 0x053023f1, + 0x4907ff00, + 0x4f034333, + 0x00066834, + 0x03884dc1, + 0x0000003f, + 0xc1d31580, + 0xa2078447, + 0x3c833707, + 0x07b3070f, + 0x33b33343, + 0x2b4b2b45, + 0x0bc48743, + 0x03c333c4, + 0x067864cf, + 0xd4c1c100, + 0xfad4ae23, + 0x4c14c1ff, + 0x00aa4ff6, + 0x053424f1, + 0x14c5ff00, + 0x2e24f94c, + 0xc5ff0005, + 0xd4016414, + 0xfff04d5c, + 0x00004f3c, + 0x54110fff, + 0x078414c5, + 0x0b463343, + 0x2b62014b, + 0x0b433343, + 0x3c41d142, + 0xd1a24111, + 0x89114040, + 0x210b14a3, + 0x43d5300b, + 0x42d51140, + 0x83c1113c, + 0x3b412780, + 0xc534eb49, + 0xcd998083, + 0x9dd1230c, + 0x84590ccd, + 0x845d4123, + 0xe4fd4027, + 0xff000520, + 0xfae33ea7, + 0x563479ff, + 0xc1d5f649, + 0x474e4484, + 0x08071c07, + 0xfe6ae3be, + 0x0ea7d127, + 0xbefffae3, + 0x07ffacb8, + 0xff0fe4e0, + 0x0dffffff, + 0x8e0d07ff, + 0xe10ea7f5, + 0x0cbefffa, + 0xce1eff30, + 0x053420f1, + 0x401bff00, + 0xff6040ec, + 0xf94c10c5, + 0x00052e24, + 0x6414c5ff, + 0x4eff515e, + 0x0df693f5, + 0x6ac1045e, + 0x9d402744, + 0xaf836564, + 0x8000000f, + 0x69c1f0a3, + 0xe6a0e850, + 0xf6643902, + 0x5901214f, + 0x104cf464, + 0x61c101a2, + 0x27702780, + 0x3127102c, + 0x4307373b, + 0x4fe6418b, + 0x7103031c, + 0x92c1f278, + 0x50979d3c, + 0x4a073a07, + 0x33062299, + 0x2b453333, + 0x51929d43, + 0x6bc14a2b, + 0x0b148744, + 0x3494c114, + 0x331cbc33, + 0x07b4ab13, + 0x07f11547, + 0x99433321, + 0x2f033895, + 0x00066834, + 0x21a9f405, + 0xf0011058, + 0x105623a9, + 0x4f834b07, + 0x0fffffff, + 0x058c04f5, + 0x319bff00, + 0x85075333, + 0x059003f5, + 0x8f03ff00, + 0x00066834, + 0x13a122b9, + 0xa94461c1, + 0xa901088d, + 0x9d010a8c, + 0x01f56092, + 0x000668b8, + 0x0275cdf2, + 0x69385cf1, + 0xed070006, + 0xec0be333, + 0xe823da46, + 0x4b07e301, + 0x4c5343cb, + 0x76e8031c, + 0x2b4b0748, + 0x1b40cc43, + 0x5d26f493, + 0x26437904, + 0x232e0739, + 0x1d07102c, + 0xd123e207, + 0xf1f8e803, + 0x250701e7, + 0x68342f03, + 0x23a90006, + 0x3df20108, + 0xe40100ee, + 0x00d6b4ee, + 0x278063c1, + 0xeb473b41, + 0xedf09334, + 0x63c5045c, + 0xfbfb7e80, + 0x4ea73027, + 0xbdfeffff, + 0x7e1cf043, + 0xd027fba4, + 0xf0830d07, + 0x41e0f58e, + 0x0ea7011f, + 0xbefffb33, + 0x07ffab7e, + 0xff0fe0d0, + 0x88ffffff, + 0x33c00702, + 0xe0c0f1c3, + 0x09ff0004, + 0xbe190792, + 0xbeffa33b, + 0x09ffaa85, + 0x9dfb9394, + 0xc4f5045c, + 0xff0004dc, + 0xc56866c1, + 0x42275c96, + 0x04d0d4fd, + 0xdea7ff00, + 0x39fffb33, + 0x7b4ff6d4, + 0x07c02701, + 0x7ebc3d0b, + 0x4ea7fb89, + 0xbdfeffff, + 0x7e1cf04c, + 0xb499fb34, + 0x99462605, + 0x453606b4, + 0xf804b499, + 0x7e015e41, + 0x1dbefb50, + 0xd027ffa2, + 0xf0830d07, + 0xdc27f58e, + 0x41f09316, + 0x527e045c, + 0x056499fb, + 0x0d074186, + 0xfe125fbe, + 0x5c2ef093, + 0x0ef08304, + 0xfb265ef5, + 0x4f83f001, + 0x0fffffff, + 0x01042cd1, + 0x059004f5, + 0x3333ff00, + 0x3ec23c0b, + 0x23130725, + 0x1e210718, + 0x11182303, + 0x15200124, + 0x34300534, + 0x4333104c, + 0x68bc43f5, + 0x28230006, + 0xe1ca3107, + 0x033507e5, + 0x0668343f, + 0x0834a900, + 0x01f21101, + 0xf54103f1, + 0x0668bc1e, + 0x0834ad00, + 0x15eb0501, + 0x342f03e7, + 0xb9000668, + 0x03103c24, + 0x3c24bd41, + 0x27635910, + 0x3d310341, + 0xc1635d64, + 0x64813c9b, + 0xf793b801, + 0xea045ba4, + 0x8900f148, + 0xb4494a63, + 0x5b96fc93, + 0xee6d7104, + 0x0700ad34, + 0x070d071b, + 0xa219be28, + 0x81c471ff, + 0x0bbb49c3, + 0xc5382b48, + 0xcdc53c9d, + 0x85c4754c, + 0x4acb8dc3, + 0x4a073a07, + 0x45333333, + 0x4a2b432b, + 0x430b3487, + 0x44e94333, + 0x0006788e, + 0x8d049399, + 0x62b95894, + 0x929d02d4, + 0xd464b955, + 0x03430b02, + 0xbd4f6b41, + 0x9902d464, + 0x32275692, + 0x633d420b, + 0x02d464bd, + 0x01fe615e, + 0xcb4b0723, + 0x530b0743, + 0x28231c4c, + 0x4ff6032b, + 0x00e8fe0a, + 0x035efdfc, + 0xa3a123fe, + 0xfffff0af, + 0x5ea103ff, + 0x0d07fd11, + 0xff2cdabe, + 0x59fe805e, + 0x104cf4b4, + 0x0d07fe9f, + 0xff2d9cbe, + 0xfe9c08e8, + 0x5ef9e37e, + 0xccc1fe92, + 0x3c9cc54c, + 0xd6ff6f5e, + 0x1e277dcf, + 0x27010000, + 0x2027800c, + 0xff2981be, + 0xd5101c27, + 0xed010480, + 0x06693e51, + 0xfd6e5e00, + 0x43ab4107, + 0x5e8064c5, + 0x7cc1fce2, + 0xdf0ea744, + 0x8abeffff, + 0xdc07ff29, + 0x990fdc83, + 0xd3332470, + 0x20271c07, + 0x0080dbf9, + 0xabbeff00, + 0xc0070280, + 0x93810d26, + 0x430b4b87, + 0x40053b07, + 0xd3fd3103, + 0xff000080, + 0xffdf0ea7, + 0x2930beff, + 0x247399ff, + 0x9bc14127, + 0x85433b3c, + 0x5e7c7574, + 0x1c07febf, + 0x010480d1, + 0x30be1433, + 0xcc47ff28, + 0x1fab1c07, + 0x693e51ed, + 0xf55e0006, + 0xdf0ea7fc, + 0xfbbeffff, + 0xd627ff28, + 0x27fdf05e, + 0xea5e15dc, + 0xd1f94efd, + 0xb902f803, + 0x8302e901, + 0x23070f3c, + 0x23334307, + 0x422b4533, + 0xc487432b, + 0xc333c40b, + 0xcf03d007, + 0x00067864, + 0x011a1fe6, + 0xd9994027, + 0xe904bda0, + 0x109ce002, + 0xd0c10134, + 0xb0d189bc, + 0xe2bead07, + 0xd399ff57, + 0x032d0705, + 0xea2503a4, + 0x27017003, + 0x07110310, + 0x19410b42, + 0xc2410743, + 0x4a0bf430, + 0xcea94419, + 0x431b034c, + 0x010fe4e2, + 0x07b2db89, + 0xea202b2b, + 0xe60125e2, + 0x07014b2f, + 0x19310b3a, + 0x2b310334, + 0xf842ca40, + 0xd48d4fab, + 0x5cd1bdd4, + 0x2ac48901, + 0x8d104c18, + 0xf493d4db, + 0x9904a3f4, + 0x30a71844, + 0x015dd4bd, + 0x02aac4b9, + 0x015ed4bd, + 0x0374c4d1, + 0x41c34253, + 0xd4bd4183, + 0xc4b90160, + 0xd39d035d, + 0x4fd4bddb, + 0x9d402701, + 0xd39dc3d4, + 0xdad39dc2, + 0x036cc3b9, + 0xabff3ce0, + 0xd7d49900, + 0x00a44fe6, + 0x02e8deb9, + 0x00bde2e0, + 0x41534307, + 0x0bc2d49d, + 0x9033993c, + 0xc1dad39d, + 0x4df8e8c4, + 0x00912000, + 0x14001d27, + 0x0bd4d489, + 0x194bca40, + 0x402b4b07, + 0xf86ef353, + 0x034ec2b9, + 0xd48dd305, + 0x101ca3d4, + 0x11a32486, + 0x1ca3e4b6, + 0x109c4420, + 0x034ec4b9, + 0xab104ca3, + 0xc5032714, + 0xf98ed0d1, + 0x89b00489, + 0x03c1d401, + 0x4c02b9bc, + 0x0b419b01, + 0x802c8334, + 0xd9994027, + 0xde049da0, + 0xbdbc03c5, + 0xe4014c02, + 0xfed0109c, + 0x27b2db89, + 0xbd002740, + 0x8d015cd4, + 0x1a5ed4db, + 0x2b4307ff, + 0x20e4ca40, + 0x5eb2db89, + 0xc4c1ff04, + 0xe8deb9e8, + 0x004dfc02, + 0x27ff7320, + 0x5e04001d, + 0x2e07ff70, + 0x89feda5e, + 0x4e07b2db, + 0xb9fee35e, + 0x07036dc4, + 0x9d315334, + 0x4c0bc2d3, + 0x9d904499, + 0x405edbd4, + 0x271027ff, + 0xfe9c5e40, + 0xc35e4027, + 0x93f74efe, + 0x04a597f4, + 0x89084389, + 0x80070a42, + 0x7107322b, + 0x3d03300c, + 0x34d603fc, + 0xf78e0027, + 0x4ce94287, + 0x1007d012, + 0xc3039307, + 0xb207ac07, + 0xa2739123, + 0xc323b103, + 0xd0104de9, + 0xa9d21007, + 0x9308270e, + 0xff89bff1, + 0xff1e16be, + 0x8c2da907, + 0x84298d0d, + 0x0bb9dd24, + 0x66484cc4, + 0xdd24141e, + 0x4cc40bba, + 0x0a1e5c28, + 0x0bbbdd00, + 0x0bbcddc4, + 0x07802951, + 0x23070b37, + 0x7f3ce301, + 0x197f0ce3, + 0x803c0334, + 0xc6f930c2, + 0x071707a7, + 0xfcbd103a, + 0xfcbd2303, + 0xf14b8703, + 0x07d01044, + 0x05b10310, + 0x38140314, + 0xfcbd10f3, + 0xfcbd2303, + 0xedf39303, + 0x3b8d04a4, + 0x003f270a, + 0x271007e0, + 0x8e3b2d01, + 0x930627f7, + 0xff8956f1, + 0xff1d96be, + 0x0000a41e, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x1007fd4e, + 0xd1871f6b, + 0xcf48df03, + 0x08530005, + 0x01103f9b, + 0xf1f293d4, + 0x2ed102bc, + 0x432b014c, + 0xe19dd405, + 0x4a24b908, + 0xff3ea701, + 0xe49dfd4f, + 0x3c24a909, + 0xb9e44d01, + 0xa9014024, + 0x11013e21, + 0x6d410b32, + 0xf6e205e4, + 0x9b402707, + 0x00070ef4, + 0x4027ff8b, + 0xe4053027, + 0x9b08e39d, + 0xd401102f, + 0xd405420b, + 0x4007fd8e, + 0x41034273, + 0xe31ef4e8, + 0x4ea7fd4e, + 0x01f7ffff, + 0x07d00743, + 0x0d38dc01, + 0xfd8e16d6, + 0x10060e27, + 0xff767e27, + 0x22be0d07, + 0x0256fdf9, + 0xfd0efd8e, + 0x4eff675e, + 0xff3ea7f5, + 0x34c1f3ff, + 0xdcb00734, + 0xd3072942, + 0xffffcea7, + 0xc54827f7, + 0xb0d140c4, + 0x422701d4, + 0x2738d4c5, + 0xad3e131c, + 0xd3c53027, + 0x40c3c538, + 0xd834d4c1, + 0xb489e042, + 0x90b3898e, + 0x63475447, + 0xa027cb07, + 0xffffdea7, + 0x207d27f7, + 0xf14a8702, + 0x0c001449, + 0xd1d301ff, + 0xd801d4b8, + 0x9fdc4332, + 0x04000000, + 0x27d7a51e, + 0x03d4b540, + 0xc4c103a1, + 0x4127dca2, + 0xffff3ea7, + 0x552027f3, + 0x05b29d34, + 0xd5c5f58e, + 0x3cd6c538, + 0x076ac499, + 0x1f4c833a, + 0x83104c33, + 0x204ca331, + 0xd4a543ab, + 0xcc1ed9b5, + 0xd4c54a27, + 0x27080740, + 0xff2a7e1b, + 0xd4c54827, + 0xdcd30140, + 0xe91ea932, + 0xc007fc4e, + 0xffffdea7, + 0xdc0b1ef7, + 0x0d272241, + 0x997e640a, + 0xdcd401fe, + 0x48d81044, + 0x270c07ef, + 0xfefa7e10, + 0x44d8d401, + 0x9e0227f2, + 0x8efe276d, + 0x000000fc, + 0x0003e80d, + 0x0003e80b, + 0x0003e807, + 0xf1a3f54e, + 0x9107a007, + 0xa469161e, + 0x460b4b2b, + 0x41c84f8b, + 0xddf41364, + 0x0a074101, + 0xa7febf7e, + 0xffffff2e, + 0x010224a9, + 0x010423a9, + 0x92a9b407, + 0x43070348, + 0x422b4b1b, + 0x9da97407, + 0x7fab0346, + 0xf305d72b, + 0x3ea7d123, + 0x99feffff, + 0xd0e80934, + 0x4383019b, + 0x34333407, + 0x342b4487, + 0x005432f1, + 0xa401ff00, + 0x8e238307, + 0xe2ffffb4, + 0x99018c24, + 0xa69909a4, + 0x934fd608, + 0x02bc92d1, + 0xf235c127, + 0x84191207, + 0x990f1c83, + 0x13330483, + 0x31075307, + 0xff843e23, + 0x7c12f9ff, + 0x15ff0000, + 0x00f345f4, + 0x18c02752, + 0xc2a3402c, + 0x14f9c906, + 0xff00007d, + 0x231e4cce, + 0xff4ea7b1, + 0x43b9ffff, + 0x4b070108, + 0x030f4c83, + 0x53344eb1, + 0x01ff2ff2, + 0xff4c5e21, + 0xffff3ea7, + 0xb92b07ff, + 0x83010834, + 0xf2550f2c, + 0x00b224ee, + 0xfe5379be, + 0x2ea78459, + 0xa9ffffff, + 0x25010223, + 0xae3beef4, + 0x27e42700, + 0x9b402704, + 0x2ea70ef4, + 0x21fd4fff, + 0x3824c5f3, + 0xd608a39d, + 0x2ea75def, + 0xa9feffff, + 0x27014224, + 0xad4103c1, + 0x9d014224, + 0x3ea709ac, + 0x11fd4fff, + 0xa9ab6d32, + 0x07034694, + 0xcc92d53d, + 0xabf25102, + 0x2b923d3f, + 0xc0932d43, + 0xd9163641, + 0xffff3ea7, + 0x673cbdff, + 0x0f329906, + 0xf49b4027, + 0x8731270e, + 0x4023f522, + 0xd1ff02b0, + 0x2102bc94, + 0xce410383, + 0x05c87634, + 0x0310072d, + 0x03e8001e, + 0x31fea15e, + 0xff2ea7f3, + 0x3f6bfddf, + 0x4da34387, + 0x24d50400, + 0x2ed50208, + 0xb31e0208, + 0xfe66f453, + 0x7f5e4101, + 0x8004e0fe, + 0x8ef183fe, + 0x0424a9f5, + 0xeef30101, + 0x21ff4c43, + 0x4664eef4, + 0x118419ff, + 0x3e42eef2, + 0x817fe6ff, + 0x39f24100, + 0xc3c4ee24, + 0x05a49900, + 0x00b54ff6, + 0xf3318421, + 0x272934ca, + 0x27e22741, + 0x05a49d02, + 0x19ff1c5e, + 0x1d44a394, + 0xd1841e94, + 0x2702bc94, + 0x83410302, + 0x8ea405f1, + 0x830227f5, + 0xb6f58ef1, + 0xff4ea7d9, + 0x2ea7ffff, + 0xd1feffff, + 0xd10e4c43, + 0xc2013c24, + 0x4b075143, + 0x2ea74103, + 0xadffffff, + 0x27010224, + 0x6d0027e0, + 0xfed35e84, + 0x41034b07, + 0xffff3ea7, + 0x27e027ff, + 0x0234ad00, + 0xfebf5e01, + 0xf605a499, + 0xe6ff7c4f, + 0x31ff785f, + 0x9f0ea7f3, + 0x8325fff9, + 0x31278419, + 0x841d4103, + 0xbe05a39d, + 0x5efe251b, + 0xf331ff5d, + 0xf99f0ea7, + 0x253103ff, + 0xbef33583, + 0x31fe2507, + 0x05a499f2, + 0xf2352123, + 0x27944fc6, + 0x5e0227e2, + 0x2c3dfe75, + 0x4ea73027, + 0xadffffff, + 0xa9010a43, + 0x07010444, + 0xa7340b37, + 0xffffff2e, + 0x0427e427, + 0x010423ad, + 0x4efe505e, + 0x33c107fb, + 0x2b1333c5, + 0x0b4007c1, + 0xdc43d14c, + 0xe6e00701, + 0x0700f33f, + 0xd944b9d4, + 0xe94ff601, + 0xff4ea700, + 0x41c1fdef, + 0x5443c164, + 0x33181c33, + 0x3c53183c, + 0x1d1c531d, + 0x01dcd2a9, + 0x31071312, + 0x01ded0a9, + 0xb307321b, + 0xb0073002, + 0x01e2d1a9, + 0x3fab4b07, + 0x042b4fab, + 0x310b432b, + 0x3fab240b, + 0x01e0d4a9, + 0x01ded0ad, + 0x01dcd2ad, + 0x01e2d3ad, + 0x009834e2, + 0x3c07d407, + 0x34a93e0b, + 0x0d0701e4, + 0x0666042b, + 0xd180e189, + 0x0701ec32, + 0x0b241130, + 0xb8241541, + 0x6ce489f3, + 0xa7754dce, + 0xfeffff3e, + 0x1cd434a9, + 0x400b1c07, + 0x1cd434ad, + 0x1dad1e0b, + 0x312701e4, + 0xcfff4ea7, + 0xda12b9fd, + 0x7043c501, + 0xbcc62d16, + 0xcea70b07, + 0x27fde66f, + 0xdea740bc, + 0xd1fde6af, + 0xd101e812, + 0x890118e3, + 0x320b86e4, + 0xc405430b, + 0xe489cb15, + 0x0b202784, + 0x89c23543, + 0xd4057ae3, + 0xd235d315, + 0x01e813d1, + 0x0b80e489, + 0xe814d543, + 0xccf0f001, + 0xd307fb8e, + 0x07ff695e, + 0xa91e0b1c, + 0xca01e014, + 0x14d1824d, + 0x30a701ec, + 0x43152127, + 0x01d912bd, + 0x4eff725e, + 0x060199fb, + 0x02893427, + 0x99317b7e, + 0x32120c04, + 0x24073207, + 0x43332533, + 0x3fab242b, + 0x23ad200b, + 0x048901dc, + 0xad432b7e, + 0x9601de24, + 0xdc24a91e, + 0x074dc601, + 0xa7c02712, + 0xfde66fde, + 0xa740bc27, + 0xfde6afee, + 0x01e812d1, + 0x011803d1, + 0x0b860489, + 0x05430b32, + 0x89db15d4, + 0x20278404, + 0xd235430b, + 0x057a0389, + 0x35e315e4, + 0xe813d1e2, + 0x80048901, + 0x01dc12a9, + 0x14d5430b, + 0xc10301e8, + 0x8ec6c2ca, + 0x89fb4efb, + 0xc0076804, + 0x3ea74ca6, + 0xc1fdefff, + 0x0b994434, + 0xe04cd80c, + 0xd1d30716, + 0x2701d4c0, + 0x01f40c1e, + 0xc1fa5b7e, + 0x4cdc44d4, + 0xc2d1eee0, + 0xc1890120, + 0x47230180, + 0x1443c241, + 0x410b2401, + 0x23112405, + 0x2115130b, + 0xc48d4027, + 0x07fb8e68, + 0x3305330b, + 0x070b2bb3, + 0xa93c0b30, + 0xa901e034, + 0x0301e232, + 0xe034ad41, + 0xe034a901, + 0xd80d0301, + 0x0b1c0701, + 0xd80d2310, + 0x4942ca01, + 0x4007d207, + 0x43a94c0b, + 0xed0701e4, + 0xe626e32b, + 0xc1891251, + 0x113e0780, + 0x15410b24, + 0x89f3b824, + 0x4dce6cc4, + 0xff2ea728, + 0x24a9feff, + 0x30071cd4, + 0x24ad4e0b, + 0x3c0b1cd4, + 0x01e43dad, + 0x4ea73127, + 0xc5fdcfff, + 0x851e7043, + 0xb71ed407, + 0x1c0b1007, + 0x01e014a9, + 0xd1cf4dca, + 0xa701ec14, + 0x15212730, + 0xd912bd43, + 0x00bf1e01, + 0x00000033, + 0x000000ff, + 0xfb63f54e, + 0x013404d1, + 0x07a0f1c5, + 0x5a41e0b0, + 0x27702702, + 0xc5112750, + 0xf7c59cf7, + 0x94f7c598, + 0xc590f7c5, + 0xf7c570f1, + 0x88f7c58c, + 0xc584f7c5, + 0xf5c580f7, + 0x78f5c57c, + 0x2774f5c5, + 0xa7c02790, + 0xf3ffff3e, + 0xdc3434c1, + 0xd3071541, + 0x01d4b0d1, + 0xf4081e27, + 0xf93e7e01, + 0xd834d4c1, + 0xb4d1ef41, + 0x4eb60134, + 0x8663b399, + 0x24b4a93d, + 0xe04f8b01, + 0xfffffe4f, + 0xc10b60ff, + 0x4ea7a0f2, + 0x95f3ffff, + 0x4432e042, + 0x8343070b, + 0xa3443343, + 0xc120004d, + 0x31fc88f3, + 0x4efc051e, + 0x2c020000, + 0x70f9c10d, + 0x4fa39516, + 0x08000000, + 0xffff3ea7, + 0x273425f3, + 0x43340540, + 0xc1f58efb, + 0x4ea79cfe, + 0xc1f3ffff, + 0x4e9594f1, + 0xc598f2c1, + 0xf3c14041, + 0x4442c58c, + 0x01323fe6, + 0xe663b499, + 0xc1012b4f, + 0x4ff684f4, + 0x7ea30132, + 0xd1180000, + 0xb901d0b0, + 0x26018504, + 0x63b49945, + 0x04dc4ff6, + 0x3888f1c1, + 0x63b49911, + 0x04d84ff6, + 0x00007efc, + 0xc104dd02, + 0x251670f2, + 0x00007fa3, + 0xdea70800, + 0x25f3ffff, + 0x39b4b9d7, + 0x86202702, + 0xb9212744, + 0x27019404, + 0x27448630, + 0xab420731, + 0xc146a643, + 0xf4c180f3, + 0xc5d3a57c, + 0xfec158d4, + 0xc5d5b578, + 0xf1c17cde, + 0x15148674, + 0x05b499d9, + 0x07954ff6, + 0x04b9dc05, + 0xbec102b4, + 0xf8b1c1fc, + 0x00b444f8, + 0x012ab4a9, + 0x2c032107, + 0xd144470f, + 0xa902a40a, + 0xe80128b3, + 0x73047120, + 0xabd20724, + 0x93d4f2df, + 0x032e0700, + 0x20e80f2c, + 0x24730e2b, + 0x0fab0207, + 0x33472007, + 0x230b249b, + 0x0c2d30fa, + 0x1c331c07, + 0x1a1c5311, + 0x43078027, + 0xfec14103, + 0x0d04d274, + 0x0c70eff6, + 0x42073807, + 0x433d4a0b, + 0x012ab4a9, + 0x41034447, + 0xa930d4d2, + 0x0b0128b4, + 0xd2344720, + 0xeff61303, + 0x38070e35, + 0x420b4a07, + 0xb3a9431d, + 0x33470128, + 0x41034307, + 0xe60c04d2, + 0x538907e4, + 0x2a0b198c, + 0xb0d1283d, + 0x1f1e01d0, + 0xe684fec1, + 0x99fedeef, + 0x4fe663b4, + 0x7ea3fed7, + 0x5e020000, + 0x1c07fecf, + 0x53111c33, + 0x04d11a1c, + 0x4c8302bc, + 0x3334870f, + 0xf1340b44, + 0x0013fc32, + 0x0034e9ff, + 0x0bff0014, + 0xc1410312, + 0x34ed90f2, + 0xff001400, + 0x13fc31f5, + 0x2fe6ff00, + 0x40270352, + 0xa905b49d, + 0xa9012ab3, + 0x430128b4, + 0x90b38dfb, + 0x8e8eb48d, + 0x2803a9f5, + 0x74048901, + 0x012e0cb9, + 0x034443e2, + 0x012a03a9, + 0x277c0489, + 0x27340a20, + 0x078c8721, + 0x0b2f6b48, + 0x90f2c54b, + 0xe6bc49c1, + 0xa70fcacf, + 0xfddfffde, + 0x3580ac27, + 0x6cd4c1da, + 0x8370d3c1, + 0xffffff4f, + 0x4530e87f, + 0x4149ee03, + 0x0b280703, + 0xbc24c12b, + 0x07a0f9c1, + 0x83c18334, + 0xab310347, + 0x07c33394, + 0xc59cab43, + 0x4f83bc23, + 0xbfffffff, + 0xe09cf9c5, + 0x990cd248, + 0x32e063b3, + 0x73070a99, + 0x74337383, + 0x01d0b8d1, + 0x026080b9, + 0x062f0ff6, + 0x90274127, + 0xc570f4c5, + 0xf4c564f9, + 0x5cf4c560, + 0xa958f4c5, + 0xc6034c8c, + 0x84a97bcf, + 0x4fd6034a, + 0xe80fe66a, + 0x6181b90a, + 0x891fa602, + 0xb3c172b2, + 0x334207fc, + 0xa9432b45, + 0xf40128bd, + 0x0ecb204c, + 0x01230207, + 0x23a92807, + 0x2ea90262, + 0x33e30264, + 0x03124007, + 0x4d0e4307, + 0x0727d4d2, + 0x0343e34e, + 0x07401243, + 0xd24d0e40, + 0xb3a9184d, + 0x24a9012a, + 0x340e0266, + 0x24a93442, + 0x43020268, + 0x00007ea3, + 0xf0280302, + 0x8cadc1f1, + 0x84a9034a, + 0x4123034a, + 0x034a84ad, + 0x0128b9a9, + 0x076cb489, + 0x23215329, + 0xee102741, + 0xa909ed24, + 0x89012abe, + 0x4e0774b3, + 0x53a8fec5, + 0x86c12741, + 0x27c02724, + 0x274486e1, + 0x6b3123e0, + 0x33c6331f, + 0x06b099e8, + 0x39ee2027, + 0x2f6b09b0, + 0xc57cb489, + 0xf2c16cf2, + 0x274123a8, + 0x9824ee30, + 0x24b4a909, + 0xc53f6b01, + 0xf3c5a4f4, + 0x8543f868, + 0xc5202707, + 0xf2c598f2, + 0xedbd9994, + 0xb9eeb499, + 0x83036183, + 0x334183d1, + 0xdc33164c, + 0x33d4ab15, + 0x33378309, + 0xd0ab173c, + 0xab6cf4c1, + 0x331733d3, + 0xd1ab0f4c, + 0xab68f3c1, + 0x90f4c1d4, + 0xab103c33, + 0x0c4c33d3, + 0xd4ab3027, + 0x025cb3bd, + 0x84b9d7ab, + 0xdcab0194, + 0x4ff6deab, + 0xe0270582, + 0xfec55027, + 0x88fec58c, + 0xc584fec5, + 0xf5c580fe, + 0x78f5c57c, + 0xc174f5c5, + 0x44e664f4, + 0x0000dea3, + 0xa4fcc118, + 0x836cfec1, + 0x8eeff6c3, + 0xc1332704, + 0x1ff668f1, + 0x2c27047b, + 0x337c070c, + 0xb97dab7a, + 0xab038584, + 0x0672ab73, + 0x8684b94d, + 0xd14c4603, + 0xe6039882, + 0xd1097a2f, + 0xc1038883, + 0x4307a8fe, + 0x4eee429b, + 0xe4c20b9a, + 0x0721030d, + 0x23439b42, + 0x9ee4ea21, + 0x8c83d109, + 0x23430703, + 0x1042ce41, + 0x038884d1, + 0x9ba8f2c1, + 0xea412343, + 0xb9094d42, + 0x27012eb1, + 0x27110061, + 0x68f3c160, + 0x01213ff6, + 0x1ff60127, + 0xd127011b, + 0xd0279496, + 0x2760f4c1, + 0x864d8b30, + 0xc1312744, + 0x3f6ba8f4, + 0x01064fe6, + 0xf604b499, + 0xc100ff4f, + 0x9fe65cf9, + 0x212700f8, + 0x0fe6a827, + 0x3fe600fc, + 0x012700f8, + 0x00f2c1e0, + 0x00f42ff6, + 0xc16cf4c1, + 0x41c358f9, + 0xe027498b, + 0x00f44fe6, + 0x00f02fe6, + 0xc3e04127, + 0x93470910, + 0x90ab9aab, + 0x019483b9, + 0x9eab4433, + 0x3fe694ab, + 0xb4b900ea, + 0x45460239, + 0x025cb4b9, + 0x08a94fe6, + 0xdfe614d6, + 0xb49908c6, + 0x83c40718, + 0xfec13fcc, + 0xabc93374, + 0x67efe6c9, + 0x19b39903, + 0x991bb999, + 0x3c831ab4, + 0x3f9c833f, + 0x333f4c83, + 0x9c33193c, + 0xab493319, + 0x5e94abc3, + 0xb499fa9f, + 0x06302763, + 0xc3430748, + 0x5e418341, + 0x4ea3fca4, + 0x5e020000, + 0x2027fade, + 0xf2c53127, + 0x90f3c59c, + 0x27fd1a5e, + 0xc3430731, + 0x5e418341, + 0x7ea3fc84, + 0x5e180000, + 0x7ea3fb20, + 0xf8020000, + 0x0200007e, + 0x7ee3fb27, + 0x5e180000, + 0x2c03fb1f, + 0xfb8d5e0f, + 0x01d4b0d1, + 0xa5101c27, + 0xf3967eda, + 0xd4a54027, + 0x27fc9a5e, + 0xfee45e00, + 0x2f6b2607, + 0xa333a207, + 0xff080ff6, + 0x2fe60027, + 0xf4c1ff10, + 0x58f9c16c, + 0x498b41c3, + 0x4ff6e387, + 0x9347ff10, + 0x90ab9aab, + 0x019483b9, + 0x9eab4027, + 0x3ff694ab, + 0xb4b9ff1a, + 0x4fe60239, + 0xf1c102c1, + 0xba1ff690, + 0x5cb4b902, + 0xb24ff602, + 0x2eb2b902, + 0x0b428701, + 0xbc44c14b, + 0x47834123, + 0x09bb2ff6, + 0x4e234533, + 0x01e4d000, + 0x11f33543, + 0x21fe454e, + 0x31f15541, + 0x41f36543, + 0x51fe754e, + 0xd0bed141, + 0x61f18501, + 0xacfec543, + 0x4471f395, + 0x0128b3d1, + 0xf4a51627, + 0xc541e499, + 0x149b40f1, + 0xb940f1c5, + 0xc50238b4, + 0x35963cf4, + 0xb2d52556, + 0xb2d50248, + 0xe0270240, + 0xfeb51427, + 0xc530fec5, + 0xf1c534fe, + 0xb13e07b0, + 0x833153f4, + 0x33244741, + 0x07230b34, + 0x0c3c033f, + 0x2499230b, + 0xc52d1904, + 0x283938f4, + 0xc1052399, + 0xa40738fe, + 0xad0b4807, + 0x5207430b, + 0xa40bed1b, + 0xe0e85103, + 0x48070908, + 0x40e8432b, + 0x4e120743, + 0xe0e8e407, + 0x239908f3, + 0x0c26990d, + 0x99085c99, + 0x13070820, + 0x1c0b4607, + 0x140b400b, + 0x1a0b3c1b, + 0x08d030e8, + 0x462b4007, + 0x071040e8, + 0x34074312, + 0x482b4d07, + 0x06ff40e8, + 0x34074312, + 0x4c2b4007, + 0x08ab40e8, + 0x43122307, + 0x54992407, + 0x38f3c104, + 0x30e8342b, + 0x42070894, + 0x43073212, + 0xe4123407, + 0x54993e07, + 0xe8461b0c, + 0x1206c740, + 0xc1340743, + 0xf2c130fe, + 0xc1e30b34, + 0xf3b1b0f4, + 0x210b1353, + 0x41233103, + 0xc530fec5, + 0xf3b534f2, + 0xf6b0f4c5, + 0xb9ff2e4f, + 0x230239b0, + 0x6b400701, + 0xf001034f, + 0xe0093742, + 0x2708c703, + 0x3cf4c120, + 0x40e8420b, + 0x4c080923, + 0x334c2734, + 0xf3c1d407, + 0x0bdf6b40, + 0x6b43073d, + 0xacfec14f, + 0xb908f49d, + 0x1203a0e3, + 0x08430734, + 0x4c27344c, + 0xacf1c133, + 0xb908f49d, + 0x9903a013, + 0x341209f4, + 0x4c084307, + 0x334c2734, + 0x9dacf2c1, + 0x23b909f4, + 0xf49903a0, + 0x0734120a, + 0x344c0843, + 0x9d334c27, + 0xf4c10af4, + 0xa043b9ac, + 0x0bf49903, + 0x43073412, + 0x27344c08, + 0xf49d334c, + 0x08fa990b, + 0x890e03d0, + 0xb3a972b4, + 0x41230128, + 0x08d934ee, + 0x07acfec1, + 0xa0e4b93d, + 0x074d1203, + 0x343ce834, + 0xdc27076d, + 0x234d0733, + 0xbcd10c4c, + 0x448701d0, + 0x02b8c3d1, + 0x2ed440f1, + 0x3ff60003, + 0xb49909e6, + 0x83200763, + 0x4ff67f2c, + 0xef2707a0, + 0x54000000, + 0x036ac4b9, + 0x07a54ff6, + 0x4d071207, + 0x2f74d5f9, + 0x3d070003, + 0x333f4c83, + 0xab345348, + 0x0e3c3354, + 0xab0fdc33, + 0x07300753, + 0x53ca074d, + 0x004e8331, + 0xcc833c00, + 0x83d5333f, + 0x0fff803e, + 0x54ab2153, + 0xdf83c933, + 0x03c00000, + 0xe0ab32ab, + 0x01ff1d83, + 0xc9ab4027, + 0xc578f3c5, + 0x5dab80fe, + 0xc57cf1c5, + 0x902774f4, + 0x07f7565e, + 0xf0d17e0b, + 0x01d0b0d1, + 0x99f8635e, + 0x438366b4, + 0x825e2487, + 0x65b399fb, + 0x705e3383, + 0x68fec1fb, + 0xd694b3c1, + 0xe06fe6e4, + 0x6cf4c104, + 0xc9074533, + 0xc4abc3ab, + 0x1c5e9027, + 0x12b4b9f7, + 0x874fe602, + 0x28b3a900, + 0x14b2a901, + 0xc123e202, + 0x18b4a904, + 0x7334ca02, + 0x021ab4a9, + 0xa96c43ca, + 0xee0216b1, + 0xa9071d23, + 0x270218b4, + 0x1b34ee20, + 0xc3420707, + 0xc5418341, + 0x13ee60f4, + 0xb4a906fe, + 0x2027021a, + 0x070934ee, + 0xe1c3e207, + 0xfec5e183, + 0x08b4b958, + 0x5e4fe602, + 0x0ab2a906, + 0x4832ea02, + 0x0cb4a906, + 0x4043ea02, + 0x60f1c106, + 0x23ee15c6, + 0xb4a907f4, + 0x34ee020e, + 0x112707ec, + 0xf1c52027, + 0x64f2c570, + 0x5e5cf1c5, + 0x4127f95b, + 0xc570f4c5, + 0xf4c564f4, + 0x5cf4c560, + 0x5e58f4c5, + 0xf37df947, + 0xf33df31d, + 0x8499f35d, + 0x9b362741, + 0xb9530734, + 0x6b0238b6, + 0x0b45075f, + 0x18b49d46, + 0x9d1bb49d, + 0xb49d1ab4, + 0xa8fcc119, + 0xc1831b07, + 0x47181c03, + 0xb93c4729, + 0xc502608a, + 0xf2c554f1, + 0x4cf3c548, + 0x0385afe6, + 0x026181b9, + 0x037d1fe6, + 0xc172b289, + 0x4207fcb3, + 0x432b4533, + 0x86204cf4, + 0x23e20708, + 0x272807e1, + 0x6224a970, + 0x6420a902, + 0x0743e302, + 0x07e4123e, + 0xd2390e34, + 0x40072493, + 0x430343e3, + 0x4e074e12, + 0x49d2490e, + 0x2ab3a915, + 0x6624a901, + 0x42340e02, + 0x6824a934, + 0x27430202, + 0xf0280371, + 0x84b9c4f1, + 0x4ce00194, + 0xf4043eff, + 0x0171114c, + 0x0169aff6, + 0x01d0bad1, + 0xa3b91027, + 0x76070198, + 0xc550f1c5, + 0x410788f1, + 0xc14cf9c1, + 0x490b50fe, + 0xc407ee47, + 0xfec5c433, + 0x59f15344, + 0x0b2027f5, + 0x271e01c4, + 0x1623da00, + 0x02ec0103, + 0xf25303b6, + 0x2e01f544, + 0xa3b92027, + 0x32d20198, + 0x0b4c07ec, + 0x994b0b42, + 0x3fe61c43, + 0x32070391, + 0x34334287, + 0x380b342b, + 0xa948f1c1, + 0x0b019c34, + 0x7a14ea10, + 0x9e34a903, + 0x7241e201, + 0x07210303, + 0x33428732, + 0x07342b34, + 0xb91a0b13, + 0xca019a19, + 0x4127b9e9, + 0x025cb4bd, + 0x019814d1, + 0x33a9380b, + 0x4ffc0198, + 0x02000000, + 0x360b04d1, + 0xf1c13fab, + 0x0b4f0744, + 0x1d410b10, + 0xe83f8b42, + 0x28052c30, + 0xf453343c, + 0x4301f4c0, + 0xfec17307, + 0x077f6b54, + 0x0b450b47, + 0x07141d1e, + 0xd1328742, + 0x3301d0ba, + 0x0b432b44, + 0x9b43b94a, + 0xc1315801, + 0x11a388f1, + 0xb988f1c5, + 0x070198a3, + 0xff545ee9, + 0x27a8f3c1, + 0x27348621, + 0x199ff620, + 0xc1d12702, + 0x2516a0b3, + 0x4fe6b479, + 0xae2702b3, + 0x47040000, + 0xab3dab4d, + 0x98f3c534, + 0x0798f4c1, + 0x133c3331, + 0x4aab43ab, + 0x2798f4c5, + 0x002ff638, + 0x86b45902, + 0xe632a344, + 0xa302351f, + 0x86d49634, + 0xab412744, + 0x94f3c534, + 0x99f8305e, + 0x4fe6ecb4, + 0x4d27f4b9, + 0xbc5e2030, + 0xa0f1c1f4, + 0x00001ea3, + 0xa0f1c540, + 0xf6f4965e, + 0xd1fe977f, + 0x2701d0ba, + 0xc5760730, + 0xf3c58cf3, + 0x84f3c588, + 0xf339f419, + 0x029934ee, + 0xfec5e127, + 0x007d2774, + 0x71a4b940, + 0x18b39903, + 0x34124f4b, + 0xa3b94307, + 0x3f4b0372, + 0x43074312, + 0xb918b49d, + 0x990371a4, + 0x4f4b19b3, + 0x43073412, + 0x0372a3b9, + 0x43123f4b, + 0xb49d4307, + 0x71a4b919, + 0x1ab39903, + 0x34124f4b, + 0xa3b94307, + 0x3f4b0372, + 0x43074312, + 0xb91ab49d, + 0x990371a4, + 0x4f4b1bb3, + 0x43073412, + 0x0372a3b9, + 0x43123f4b, + 0xb49d4307, + 0x18b3991b, + 0x03a0a4b9, + 0x43073412, + 0x27344c08, + 0xb49d334c, + 0x19b39918, + 0x03a0a4b9, + 0x43073412, + 0x27344c08, + 0xb49d334c, + 0x1ab39919, + 0x03a0a4b9, + 0x43073412, + 0x27344c08, + 0xb49d334c, + 0x1bb3991a, + 0x03a0a4b9, + 0x43073412, + 0x27344c08, + 0xb49d334c, + 0xa0a3b91b, + 0x12460703, + 0x08430736, + 0x4c27344c, + 0xb9340733, + 0x6b03a082, + 0x0723123f, + 0x343ce832, + 0xcc270085, + 0x234c0733, + 0xa3d10c4c, + 0x448702b8, + 0x2ed440f1, + 0x3ff60003, + 0xb49904b0, + 0x83200763, + 0x4ff67f2c, + 0xef27009e, + 0x54000000, + 0x036aa4b9, + 0x009e4ff6, + 0x4c071207, + 0x2f74c5f9, + 0x3c070003, + 0x333f4c83, + 0xab345348, + 0x0fcc3354, + 0xab0e3c33, + 0x074c0753, + 0x004e8330, + 0xc5333c00, + 0x54ab3153, + 0xff803e83, + 0x8321530f, + 0xc00000cf, + 0xab32ab03, + 0xff1d83e0, + 0xabd7ab01, + 0x78f3c55c, + 0xc580fec5, + 0xfc5e7cf1, + 0x6bc307f6, + 0x0cccf4cf, + 0x4027ff79, + 0x27ff795e, + 0xf6675e31, + 0x4f5e2127, + 0xecb499f6, + 0xf5644fe6, + 0x5e307c27, + 0x1127f564, + 0x27f6125e, + 0xfcd85e70, + 0x1ff6d027, + 0x3027fde7, + 0x5e98fdc5, + 0xef27fe09, + 0x2a000000, + 0xa3ff635e, + 0xfe0f5e36, + 0x42071207, + 0x45331333, + 0x1df0140b, + 0xff580200, + 0x01ff1d27, + 0xe3ff515e, + 0x1800004e, + 0x07f2d05e, + 0x111c331c, + 0x071a1c53, + 0x6b4a0781, + 0x1d420b8f, + 0x28b3a948, + 0x5e334701, + 0x4fe6f3c6, + 0x34a3fdcd, + 0x27fdc85e, + 0xfb245e40, + 0x0216b1a9, + 0xfb4d31e2, + 0xa3fb385e, + 0x0200007e, + 0x034a8cad, + 0xe4f5755e, + 0xf838ff3c, + 0xd1f7535e, + 0xc1038884, + 0x42e2a8f2, + 0x7ea3f6b7, + 0x5e020000, + 0x3c47f6af, + 0x5e1a3c53, + 0xb499f38e, + 0x209ca318, + 0x27f7385e, + 0xfd515ea0, + 0x385e4013, + 0x5e4013f9, + 0x4013f900, + 0x13f8ef5e, + 0xf8bc5e40, + 0xef5e4027, + 0x007ea3f6, + 0x5e5e0200, + 0x98a3b9f6, + 0x5e210301, + 0xf4c1fc5a, + 0xc5410350, + 0x42e450f4, + 0xbea9fc1c, + 0xb1a9012a, + 0xb9a90124, + 0xb8d10128, + 0x202701d0, + 0xc5a8fec5, + 0xf2c5a4f1, + 0x84f2c58c, + 0x59fd635e, + 0x6532eef2, + 0xeef479fd, + 0x07fd5f42, + 0x27402767, + 0x74f4c570, + 0xb9fd5c5e, + 0xc1019984, + 0x42eaa8f2, + 0x84b9fd2f, + 0x49ea0198, + 0x4ea7fd27, + 0x03f7ffff, + 0x004cd5c1, + 0x0842d101, + 0xd0bad101, + 0xb9f21501, + 0xd103a1a3, + 0xa601084c, + 0x33420735, + 0x1b4c7343, + 0x3f6b3407, + 0x0260a4b9, + 0x7fe644c6, + 0x31e4fcf7, + 0xfe11fcf3, + 0x0000effc, + 0x038a4000, + 0x4c334e07, + 0x1a4c731a, + 0x460b3c07, + 0x123f3c83, + 0x08430734, + 0x4c27344c, + 0x071e0733, + 0x141c3374, + 0x7f6b4c07, + 0x331a1c73, + 0xf71d144c, + 0x0b1a4c53, + 0x07411216, + 0x341c0814, + 0x07331c27, + 0x0e0c330e, + 0x1f6b4c07, + 0x331a0c73, + 0xf13d0e4c, + 0x0b1a4c53, + 0x07401206, + 0x340c0804, + 0x07330c27, + 0x334c073e, + 0x730f6b38, + 0x48331a3c, + 0x4c53f05d, + 0x12360b1a, + 0x08340743, + 0x3c27343c, + 0x6b4e8733, + 0x1f4c533f, + 0xc51fec53, + 0xfec584f4, + 0x0723078c, + 0xc5e02747, + 0x250b88fe, + 0x050b150b, + 0xb49d450b, + 0x19b19d18, + 0x9d1ab09d, + 0xf37d1bb2, + 0xc3fc4b5e, + 0x0000083f, + 0xbc23c540, + 0x03f3265e, + 0xd35e0f2c, + 0x6bd307f1, + 0x0cdcf4df, + 0x4027f891, + 0xa9f8915e, + 0x2a020eb4, + 0x10b4a934, + 0xb634e202, + 0x27e027f9, + 0x70f9c591, + 0xc564fec5, + 0x205e5cfe, + 0x99a4b9f3, + 0xab340b01, + 0xfb2c5e3f, + 0x6b5e3013, + 0x5e4013f7, + 0x3013f754, + 0x27f72f5e, + 0xf70c5ee0, + 0xf75ee013, + 0x333907f6, + 0x3c53113c, + 0xf1c65e1a, + 0x0000ef27, + 0x615e2a00, + 0x234533f8, + 0xe49e004e, + 0x07f6465e, + 0x33420712, + 0x0b453313, + 0x001df014, + 0x27f85102, + 0x5e01ff1d, + 0x4127f84a, + 0x036a83b9, + 0x038784bd, + 0xfe073ff6, + 0x00007fa3, + 0x625e0800, + 0x5e3027f4, + 0x9027fadc, + 0x5e58f9c5, + 0xe027f911, + 0x5e60fec5, + 0x2127f8f2, + 0x27f8e45e, + 0xf8f65e21, + 0xd130f2c1, + 0x530244be, + 0x002ef022, + 0x00f60100, + 0x07104c27, + 0xf0235b34, + 0xe201002d, + 0x27182700, + 0x07235b38, + 0x102cf032, + 0xc42700ce, + 0x325b2427, + 0x00bd34f0, + 0x2227d227, + 0xf2c1325b, + 0xab14abac, + 0xbc24d11c, + 0x531dab02, + 0xd613ab31, + 0x2027784f, + 0x0240b4d1, + 0x0248b3d1, + 0x3103410b, + 0x0240b4d5, + 0x0248b3d5, + 0x27f6d85e, + 0xf6e25e40, + 0x00ec02e0, + 0xc134f4c1, + 0x445330fe, + 0x270e4ec2, + 0xb94b0b40, + 0x4b023a42, + 0xf6b75e2f, + 0x5334f4c1, + 0x7ce4ca43, + 0x5334f4c1, + 0x274e2242, + 0x27e31e42, + 0x89df1e43, + 0xb3a97cb4, + 0x4123012a, + 0xf71e43ee, + 0x0248b1d1, + 0x00831ff6, + 0x0244b1d5, + 0xb4d54027, + 0xb4d50248, + 0x055e0240, + 0x7de1d2f7, + 0x4e2b4107, + 0x35333407, + 0x342b4447, + 0x077e30c8, + 0x2c247323, + 0xfffff92f, + 0x5e26a7ff, + 0x28e8ff6c, + 0x2727ff68, + 0x27ff635e, + 0x5e2027d0, + 0xc027ff44, + 0x335e2027, + 0x271027ff, + 0xff1f5e30, + 0x30274027, + 0x27ff0c5e, + 0xff6f5e41, + 0xf81431fc, + 0x012ab4a9, + 0xf80c41fc, + 0x31272027, + 0xc570f2c5, + 0xf3c564f2, + 0xf1655e5c, + 0x5fbe1b07, + 0x4b5efdf2, + 0x40b0d1fb, + 0x3c9bbe02, + 0x44b0d5fe, + 0xff765e02, + 0x073a1ece, + 0x874e2b41, + 0x0b453334, + 0x8430cc34, + 0x5e0f3c03, + 0x4247ff7f, + 0x4653420b, + 0xff19e4e2, + 0x44534207, + 0x07a1e4c2, + 0xe2435342, + 0x07ff26e4, + 0xe2425342, + 0x27ff22e4, + 0xfeff5e44, + 0xcd5e20a7, + 0x072123fe, + 0x230fab02, + 0x07e10701, + 0x6223a928, + 0x6421a902, + 0x0733e302, + 0x07031240, + 0xd24d0e43, + 0x310729d4, + 0x330333e3, + 0x03124007, + 0x4d0e4307, + 0xa9184dd2, + 0xa9012ab3, + 0x0e026624, + 0xa9344234, + 0x02026824, + 0x007ea343, + 0x28030200, + 0xadbffef0, + 0x5e034a8c, + 0x1b07f12e, + 0xfdf1b1be, + 0xa7f6155e, + 0xfddfffde, + 0xd2352127, + 0xc148d4c1, + 0x4f834cd3, + 0x7fffffff, + 0x94ee3008, + 0xb0d1f03d, + 0x1c2701d4, + 0x7ed2a510, + 0x4027e710, + 0xd91ed4a5, + 0xe6f8a499, + 0x99fc734f, + 0x4507f7a6, + 0xb49d460b, + 0x1bb49d18, + 0x9d1ab49d, + 0x5d5e19b4, + 0x072123fc, + 0x230fab02, + 0x07e10701, + 0xa9702728, + 0xa9026223, + 0xe3026421, + 0x12400733, + 0x0e430703, + 0x2694d249, + 0x33e33107, + 0x40073303, + 0x43070312, + 0x49d2490e, + 0x2ab3a915, + 0x6624a901, + 0x42340e02, + 0x6824a934, + 0x27430202, + 0xf0280371, + 0x735ec2fe, + 0x99fa4ef7, + 0xd0076304, + 0x4ff6a107, + 0xb0270275, + 0x0670d489, + 0xff1ea74f, + 0x14c1fdef, + 0x4813c138, + 0x335812c1, + 0x2c33183c, + 0x1d3c5318, + 0x331d2c53, + 0x320b184c, + 0x0b1d4c53, + 0x073a4634, + 0xd4d0d1c1, + 0x0c1e2701, + 0x557e01f4, + 0x38c4c1e6, + 0xc148c3c1, + 0x3c3358c2, + 0x184c3318, + 0x531d3c53, + 0x2c331d4c, + 0x53340b18, + 0x320b1d2c, + 0x01d33fd6, + 0x030d07a4, + 0x7ea40541, + 0x0d07eba9, + 0x8d7e1b07, + 0x63d499ec, + 0xdbc146e6, + 0x5ed4a9a8, + 0xa2b4f202, + 0xacd3c101, + 0xead0d4c1, + 0xc1014034, + 0xd399a8d4, + 0xc3420364, + 0xc4d1c131, + 0xc5c8d2c1, + 0xd39da8d4, + 0x3621c264, + 0x0bccd4c1, + 0xc4d4c541, + 0xd2c5420a, + 0x1cdcd1c4, + 0xc4d3c101, + 0x34c2c411, + 0x0dd1991d, + 0xa07e0d07, + 0xd4d0d1e9, + 0x0c1e2701, + 0xc17e01f4, + 0xc1c311e5, + 0x34cac4d4, + 0xc1ae01e5, + 0x4ee2d0d4, + 0xd41900e7, + 0xc103ce07, + 0xc66cda89, + 0xff3ea748, + 0x3411d07f, + 0x9b80d289, + 0x1624c22c, + 0x34113225, + 0x070f24c2, + 0x1a1c2703, + 0xf3e83107, + 0x42ca0411, + 0x70d189f8, + 0x00b11fe6, + 0x0663d299, + 0x62d4a92d, + 0x404ec202, + 0x0118d0d1, + 0x0110d4d1, + 0x0b82d389, + 0xe0030b04, + 0x27019a22, + 0x310780bc, + 0x31233153, + 0xe71f2ea7, + 0x073183fd, + 0x0b439b4b, + 0x15240540, + 0x3510272b, + 0x0731c321, + 0x0b439b4b, + 0x15240540, + 0xd021352b, + 0x3a0755e2, + 0x4c073203, + 0x012c3cea, + 0x1e2b1407, + 0xd2d11e66, + 0xeea70110, + 0x27fde69f, + 0x0ea740cc, + 0xd1fde6df, + 0x890118d3, + 0x320b86d4, + 0xe405430b, + 0xd489ec15, + 0x0b202784, + 0x89e23543, + 0x04057ad3, + 0x02350315, + 0x0110d2d1, + 0x0b80d489, + 0x10d2d524, + 0xd0f1f001, + 0xd4d1fa8e, + 0xd3890110, + 0xd5430b80, + 0x8e0110d4, + 0x63d499fa, + 0x0118d0d1, + 0x0114d2d1, + 0xe082d189, + 0x2700e042, + 0xd4a980ec, + 0x43c20260, + 0x06d49927, + 0xd4894876, + 0x0b200b70, + 0xcd4ff621, + 0xa7ee4700, + 0xfde6ef3e, + 0x3e153205, + 0x34354027, + 0xd1acd3c1, + 0x890114d2, + 0x310380d4, + 0x4127240b, + 0xd5acd3c5, + 0x8d0114d2, + 0x6c5e68d4, + 0x64d499fe, + 0xdfff1ea7, + 0x073407fd, + 0x333a3324, + 0x03342b48, + 0xd164003d, + 0x230108dc, + 0x9c13c5b4, + 0x07b0d0c1, + 0xb4dec14b, + 0x1fff4d83, + 0xd3c5b203, + 0x8340abb8, + 0xffbd8321, + 0xac14c51f, + 0x2633beab, + 0xabb01bc5, + 0x8c12c52c, + 0xc1acd3c1, + 0x43e2d0d4, + 0x565efe1b, + 0xff3ea7ff, + 0x2c27fddf, + 0xc1323520, + 0x41dc8c34, + 0x64d3a952, + 0xa8d4c102, + 0xc264d299, + 0xbe270e43, + 0x5e800000, + 0x4307fd6c, + 0xc1fed35e, + 0x21c3b8db, + 0x7fffbd83, + 0x2183b433, + 0x0000bea3, + 0x132c3330, + 0x4d5eb2ab, + 0x00ed27fd, + 0xff205e01, + 0x41234153, + 0x3e074183, + 0x230b349b, + 0x27ff2a5e, + 0x5e0100bd, + 0xc307fe66, + 0x0c27b207, + 0x7ecba50f, + 0x4027e340, + 0xcb35c4a5, + 0xd88cc4c1, + 0xeb1e9841, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000081, + 0x00000081, + 0x00000081, + 0x00000081, + 0x00000202, + 0x00000202, + 0x00000202, + 0x00000202, + 0x00000483, + 0x00000483, + 0x00000483, + 0x00000804, + 0x00000804, + 0x00000804, + 0x00000c85, + 0x00001206, + 0x00001206, + 0x00001887, + 0x00002008, + 0x00002889, + 0x0000320a, + 0x00003c8b, + 0x0000548d, + 0x0000620e, + 0x00008010, + 0x0000a212, + 0x0000c814, + 0x00010897, + 0x00013899, + 0x0001a49d, + 0x00020020, + 0x00028824, + 0x00032028, + 0x0003f4ad, + 0x000514b3, + 0x000658b9, + 0x00080040, + 0x000a2048, + 0x000cd0d1, + 0x00102cdb, + 0x00000000, + 0x00000000, + 0x00000000, + 0x18101010, + 0x30282420, + 0x44403834, + 0x59545049, + 0x6f696460, + 0x84807974, + 0x99948f89, + 0xafa9a4a0, + 0xc4c0b9b4, + 0xd9d4cfc9, + 0x00000081, + 0x00000081, + 0x00000081, + 0x00000081, + 0x00000202, + 0x00000202, + 0x00000202, + 0x00000202, + 0x00000483, + 0x00000483, + 0x00000483, + 0x00000804, + 0x00000804, + 0x00000804, + 0x00000c85, + 0x00001206, + 0x00001206, + 0x00001887, + 0x00002008, + 0x00002889, + 0x0000320a, + 0x00003c8b, + 0x0000548d, + 0x0000620e, + 0x00008010, + 0x0000a212, + 0x0000c814, + 0x00010897, + 0x00013899, + 0x0001a49d, + 0x00020020, + 0x00028824, + 0x00032028, + 0x0003f4ad, + 0x000514b3, + 0x000658b9, + 0x00080040, + 0x000a2048, + 0x000cd0d1, + 0x00102cdb, + 0x00000000, + 0x00000000, + 0x00000000, + 0x18101010, + 0x30282420, + 0x44403834, + 0x59545049, + 0x6f696460, + 0x84807974, + 0x99948f89, + 0xafa9a4a0, + 0xc4c0b9b4, + 0xd9d4cfc9, + 0xa007f94e, + 0xea87a553, + 0xb007e10b, + 0xbc839107, + 0xd111271f, + 0x3b02dce4, + 0x8bd9071b, + 0x03c20741, + 0x2702fcdd, + 0x27448630, + 0xece2d131, + 0x07c37d02, + 0x6c93bd41, + 0x27428b03, + 0x27448630, + 0xbdc35d31, + 0x86036893, + 0x270a07ab, + 0x07e02710, + 0x194e0b4d, + 0x0be10343, + 0x27f09813, + 0x83420730, + 0x0b310341, + 0xc2215314, + 0xc459f43b, + 0x2027c379, + 0x448643ab, + 0x41072127, + 0xc29d4123, + 0x4094ad04, + 0x27f98e03, + 0x4ed51e10, + 0xff4ea7fa, + 0x3027f7ff, + 0x010043d5, + 0x639803c1, + 0x87a407f0, + 0xffcea7d3, + 0xeea7fdef, + 0xa7fde63f, + 0xfde62f1e, + 0xc124bc27, + 0x242770c4, + 0x53184c33, + 0x33271d4c, + 0x517044c0, + 0x054d0b04, + 0x27e215e4, + 0x05e33530, + 0x3512151b, + 0x08a4d113, + 0xc6f40501, + 0x4327d64f, + 0x0270c4d5, + 0xefff3ea7, + 0x7034c1fd, + 0x27fb48dc, + 0x7034d544, + 0x7434d502, + 0xd5202702, + 0xa7069032, + 0xfdeb8f3e, + 0x4f273205, + 0x0f420000, + 0xf29b3415, + 0xa7f4010e, + 0xfde63f3e, + 0x1c273405, + 0x15004140, + 0x2f4ea731, + 0x3235fde6, + 0x41154005, + 0x4235f043, + 0xf3e8fa8e, + 0x4eff7e5e, + 0x07c007fb, + 0x73b00721, + 0x2c731fcc, + 0x073c071f, + 0x07120701, + 0x11dbbe2b, + 0x803c27fe, + 0x300b4027, + 0x2407414b, + 0x53182c33, + 0x0732ab38, + 0x4efb8e03, + 0x07f1a3f5, + 0x46d007c2, + 0x8202b91b, + 0x4e22d001, + 0x0c07d439, + 0x23332407, + 0x240b4533, + 0xfef42e23, + 0x242c9dff, + 0xf183d439, + 0x4c834123, + 0x3314070f, + 0x0b433315, + 0x2c43f141, + 0x0bff0001, + 0x8e23853c, + 0xda2ebef5, + 0x83d439fd, + 0x333407f1, + 0x0b453333, + 0xf43e2334, + 0x3085fffe, + 0x8e24309d, + 0x8304b9f5, + 0x0c039901, + 0x015f42e0, + 0xd1a63fd6, + 0xe60188db, + 0xd1015bbf, + 0xe0018cd4, + 0x99015341, + 0x4fd6f3d4, + 0xf4d49990, + 0x998a4fd6, + 0x4fd6f5d4, + 0x03420784, + 0x7d14ea41, + 0xa7d439ff, + 0xffffff3e, + 0x4123422b, + 0xd10f4c83, + 0x07188033, + 0x33e307a4, + 0x873d03a3, + 0x07453302, + 0x2ba40b91, + 0x44d8a992, + 0xe3230703, + 0xae237fec, + 0xe3fffef4, + 0x3d237f2c, + 0xe4190287, + 0xc280ec03, + 0x3001f9e2, + 0x019001e8, + 0x01879fe6, + 0x10272307, + 0x24993907, + 0x4b210308, + 0xa0140b4f, + 0xbe0833f3, + 0x21fe3431, + 0x7ef105a1, + 0x1007fed3, + 0x0cacd0c1, + 0x2701000d, + 0x7e01000d, + 0x6007fec3, + 0x1907a081, + 0x0ebe0833, + 0xd4d1fe34, + 0xd3d102bc, + 0x4c830134, + 0x0724870f, + 0x0b443370, + 0x807c0324, + 0x31084127, + 0x12074027, + 0xec101e23, + 0x87f125ff, + 0xf924f934, + 0x53ff0013, + 0xe6f41578, + 0xe600e5bf, + 0x2700d94f, + 0x21392729, + 0xf9d999f1, + 0x07081499, + 0x12b22bb4, + 0x07b9079b, + 0xfad59983, + 0x8512840b, + 0xf3218507, + 0x11e4d4c1, + 0xe8d1c133, + 0xf445f355, + 0x63c2f135, + 0x5078da6a, + 0xf311b807, + 0x4c073556, + 0x4b124123, + 0xf451b407, + 0x110d64c2, + 0x071556f1, + 0x1221032c, + 0x01b2072b, + 0x42f451f3, + 0x96f11134, + 0x5ab50714, + 0x129b07b9, + 0x219507b5, + 0x9dc907f3, + 0x4d5e0a37, + 0xa132e4fe, + 0xfe465efe, + 0x02bcd4d1, + 0xfe3e42f4, + 0x07fea65e, + 0x070607a7, + 0x7ef03110, + 0xf351fdef, + 0xce2703c2, + 0xa103248a, + 0xf451ee1e, + 0xd22d46c2, + 0xa707957b, + 0x10070607, + 0xd07ef041, + 0xc2f151fd, + 0xabce1110, + 0x1ea1230e, + 0x7babf2ee, + 0x5eba07ff, + 0xba07ff76, + 0xff70a8f2, + 0x12ff6b5e, + 0xf2b7077b, + 0x5eff65b8, + 0x2027ff60, + 0x5e123c27, + 0x21f9ff27, + 0xff0013f8, + 0x07f9d499, + 0x12932b91, + 0x07940749, + 0xfad499b3, + 0xb412b10b, + 0x2af1b407, + 0xff0013f4, + 0xc1e4d5c1, + 0x6ac2e8d8, + 0x187bda30, + 0x585e9b07, + 0x5e1027ff, + 0x0807fe89, + 0x08331907, + 0xfe32b4be, + 0x07fe825e, + 0x071607c7, + 0xfd517e08, + 0x0ac26007, + 0x21bcce24, + 0xee1ec103, + 0xf22ba6c2, + 0x07ff2a79, + 0x071607c7, + 0xfd357e05, + 0xa0c26007, + 0x0e9cce11, + 0xee1ec123, + 0xff11c9f2, + 0x0c5e9c07, + 0xf29c07ff, + 0x1eff06cb, + 0x077912a8, + 0xfc9bf297, + 0x4e9e1efe, + 0x0c0499fe, + 0xc30d0299, + 0x0c049d41, + 0x070c0399, + 0x33e30710, + 0x2b3333e5, + 0xd8ed03e3, + 0xc31e0b01, + 0x03310721, + 0x029d171c, + 0xe321070d, + 0xed237f3c, + 0x2ce301d8, + 0x171c237f, + 0x3c033419, + 0xf932c280, + 0x20274107, + 0x42053627, + 0xf3c84403, + 0x07980199, + 0xd1300b3e, + 0xbd012004, + 0xd501d831, + 0x8901ec34, + 0x44478004, + 0x01e834d5, + 0xf54efe8e, + 0x01d006d1, + 0xffff4ea7, + 0xd19007ff, + 0xd102bc6a, + 0x63159040, + 0x83a02bf0, + 0x47f205a1, + 0x332a07ca, + 0xe9f80125, + 0x001594c4, + 0x07b207ff, + 0x33730751, + 0x6361b984, + 0x60be2303, + 0x4586ffea, + 0x15a023f1, + 0x34eeff00, + 0xfd01008b, + 0x1598c3e9, + 0xd10bff00, + 0xd3c2d433, + 0x94c4e929, + 0x4aff0015, + 0xe91f1e34, + 0x001594c4, + 0x1243c2ff, + 0x641a0d27, + 0xffdc5bbe, + 0x1598c3e9, + 0x3dcaff00, + 0xd096d1e7, + 0x07b00101, + 0xea4fab40, + 0x11020e84, + 0xab4007b0, + 0x4584ea4f, + 0x07b02102, + 0xea4fab40, + 0x31023f84, + 0xab4007b0, + 0x3984ea4f, + 0x07b04102, + 0xea4fab40, + 0x51023384, + 0xab4007b0, + 0x2d84ea4f, + 0x07b06102, + 0xea4fab40, + 0x71022784, + 0xab4007b0, + 0x2184ea4f, + 0xe9ff1e02, + 0x001598c4, + 0x6f43eeff, + 0xd49dc1ff, + 0xc1dc9ec1, + 0x94c1e49c, + 0xe093c1d8, + 0x9be892c1, + 0x9be59bd5, + 0x0bd40bc5, + 0xc1c20be3, + 0x6389f894, + 0xa7482b7c, + 0xfddfff2e, + 0x01c824d5, + 0x80003d83, + 0x015f3fe6, + 0x24d54547, + 0x64b901fc, + 0x4cc0035e, + 0x94891eff, + 0x03f10172, + 0x9b43e343, + 0x0092d141, + 0x53453301, + 0xa7420b41, + 0xfddfff3e, + 0x077434c5, + 0x137c0337, + 0x3ce32707, + 0x7f2ce37f, + 0x19137c23, + 0x803c0334, + 0x07f932c2, + 0x27202747, + 0x03420535, + 0xd1f3c844, + 0xb901d093, + 0xe6026034, + 0xb900eb4f, + 0xc0035e34, + 0x8958ff4c, + 0x3ea77292, + 0x03fdefff, + 0x7834c123, + 0xf10123e3, + 0x4c332533, + 0x53129b18, + 0x11531d4c, + 0xd1f090c1, + 0xc401009e, + 0xd3071344, + 0xf4e84327, + 0x3378d3c1, + 0x3c53183c, + 0xf134c01d, + 0xe61f4ea7, + 0x05010bfd, + 0x15224740, + 0x35302742, + 0xa71e0b43, + 0xfde60f4e, + 0x42154105, + 0xfd014335, + 0xd1532707, + 0x1d070907, + 0xd1be2a03, + 0xd5c6fdd3, + 0x12231d07, + 0x27070907, + 0xfdd3c3be, + 0x010494d1, + 0x20004da3, + 0x010494d5, + 0xc60a7399, + 0x74897d3f, + 0x0c72890e, + 0x83127389, + 0x890fff4d, + 0x2d831071, + 0x4c330fff, + 0xff3d8310, + 0x3342ab0f, + 0x2ea7103c, + 0x83fddfff, + 0xd50fff1d, + 0xab020024, + 0x0423d531, + 0xd094d102, + 0x5e43b901, + 0xff3cc003, + 0xff3ea71c, + 0x34c1fdef, + 0x6a4dd87c, + 0x23070ffc, + 0xf4e84327, + 0xdc7c23c1, + 0xf5fc6a3d, + 0x01d093d1, + 0x837c3489, + 0x5680004d, + 0xff4ea745, + 0x4cc5fddf, + 0x8ef043e4, + 0xdc2dc5f5, + 0x5ee02ec5, + 0x9489fea2, + 0x27440872, + 0xff4d8343, + 0x104c330f, + 0xdfff3ea7, + 0x0034d5fd, + 0x0434d502, + 0x279b1e02, + 0x6361b940, + 0x33a33303, + 0x100c5314, + 0x52bea40b, + 0x4a87fe2f, + 0xc1d49dc1, + 0x9cc1dc9e, + 0xf1051be4, + 0x00166041, + 0xe043f1ff, + 0xf1ff0015, + 0x00162042, + 0x9bc09bff, + 0x0be09bd0, + 0x0be20bd3, + 0xfe255ec1, + 0xbe1e4127, + 0xba1e4227, + 0xb61e4327, + 0xb21e4427, + 0xae1e4527, + 0xaa1e4627, + 0xa61e4727, + 0x3ea7fc4e, + 0x99feffff, + 0x02d10934, + 0x438301d0, + 0x34333407, + 0x342b4487, + 0x004d3ef9, + 0x01c1ff00, + 0x4624a998, + 0xf91e0b03, + 0x00004e3c, + 0x99d007ff, + 0x41c23923, + 0x2b46270e, + 0x89210743, + 0x243b6e03, + 0x4027234a, + 0x8e07d49d, + 0xf7eccefc, + 0x21873007, + 0x021c3d03, + 0xb77e4027, + 0x0cd3d1fc, + 0x3f4ea701, + 0x4325fdbf, + 0x0104d2d1, + 0xdfff4ea7, + 0xc53127fd, + 0xd39d4042, + 0x4efc8e07, + 0xff3ea7fd, + 0x34c1fdef, + 0x6a4dd874, + 0x23070ffc, + 0xf4e84327, + 0xdc7423c1, + 0xf5fc6a3d, + 0x1ea70041, + 0x21fde65f, + 0x05033104, + 0x27131514, + 0xa71e35e0, + 0xfde64f2e, + 0x0534dc27, + 0x4123152d, + 0x462e3504, + 0xc6005146, + 0x15140505, + 0x051e3510, + 0x3520152d, + 0x4efd8e2e, + 0x0e0499fa, + 0xc107d007, + 0x41274536, + 0x8e0e049d, + 0x074107fa, + 0x334333a1, + 0x07a42ba5, + 0xa9300b3a, + 0xe601de34, + 0x07b30747, + 0xbe1c070d, + 0xd1ffdd23, + 0x2701d4d0, + 0x01f4171e, + 0xffd943be, + 0x01deb4a9, + 0x2ea740f6, + 0xc1fdefff, + 0x24c16423, + 0x183c3354, + 0x53184c33, + 0x3c531d4c, + 0x06430b1d, + 0xd1c20749, + 0x2701d4d0, + 0x01f4171e, + 0xffd913be, + 0xc164c3c1, + 0x3c3354c4, + 0x184c3318, + 0x531d4c53, + 0x430b1d3c, + 0x07dd4fd6, + 0xa91d0b1a, + 0xa901e214, + 0xb901dc13, + 0x0b01d912, + 0xad3fab34, + 0xb601e213, + 0xa92a072e, + 0x0301e014, + 0x0b01d82d, + 0x4743ca2d, + 0x4a07e307, + 0x43a94d0b, + 0x0e0701e4, + 0x0626032b, + 0xd1892251, + 0x11300780, + 0x15410b24, + 0x89f3b824, + 0x4ece6cd4, + 0xff3ea726, + 0x34a9feff, + 0xda0b1cd4, + 0x34ad400b, + 0xdead1cd4, + 0x312701e4, + 0xcfff4ea7, + 0x7043c5fd, + 0xe407fa8e, + 0x1a07b91e, + 0x14a91d0b, + 0x4eca01e0, + 0xec14d1d1, + 0x2730a701, + 0xbd431521, + 0x1e01d912, + 0x99fc4ec1, + 0xd0070d01, + 0xa7fee67e, + 0xfeffff1e, + 0x12a94027, + 0x13a90144, + 0xd49d0142, + 0x1a23ce0e, + 0xd0d1c107, + 0x1d2701d4, + 0x41be6418, + 0xc3a9ffd8, + 0xc4a90144, + 0x43ce0142, + 0xd0d3d1ea, + 0xff1ea701, + 0x3289feff, + 0xd414a912, + 0x0b30271c, + 0xd414ad42, + 0x0ef39b1c, + 0x0000fc8e, + 0x000000e9, + 0x0000007e, + 0x0000007c, + 0x54000000, + 0x2a000000, + 0x000001ff, + 0xd007f54e, + 0x0138dd03, + 0xdc031d07, + 0x232d0797, + 0xd101cfdd, + 0x0701d000, + 0x634d073d, + 0x7f1ce3f2, + 0x037f2ce3, + 0x0302083d, + 0x25021c4d, + 0x65f155f0, + 0x75e007f2, + 0x21f485f3, + 0x29f351f0, + 0x460ca904, + 0x2bf16103, + 0xc5c123c4, + 0xe49998dc, + 0x13ac0739, + 0x19a43b46, + 0x803c0334, + 0x27f931c2, + 0x27402720, + 0x41d3bd31, + 0x40d4bd01, + 0x44d2bd01, + 0x38d2ad01, + 0x3cd2ad01, + 0xa9ba0701, + 0xab02bce2, + 0x3edbadbf, + 0x4ad2ad01, + 0xf33ea701, + 0xd3d5fee2, + 0xe489014c, + 0x39e39912, + 0x04874123, + 0x0363e2b9, + 0x080e34f0, + 0x2314e489, + 0xbd4a2b34, + 0x3b0143d3, + 0x07420243, + 0x07435b42, + 0x23200734, + 0x23430721, + 0x0b138741, + 0xad132b23, + 0xbd013ad2, + 0x030142d4, + 0xe8040711, + 0x0710f141, + 0x07212323, + 0xbd42a73d, + 0x03014534, + 0x0bf2a831, + 0x4501bd0d, + 0x07e23901, + 0x2342070d, + 0x0f4c8341, + 0x32071407, + 0x25331533, + 0x33334333, + 0x410b320b, + 0xfef44e23, + 0xf43e23ff, + 0xd4d5fffe, + 0xd3d5011c, + 0x407e0120, + 0x6ed489f9, + 0x013edbad, + 0x0275a4ea, + 0x01d4dbd1, + 0x9362fe93, + 0xdb0ea702, + 0xe401fefd, + 0x03210211, + 0x240b4013, + 0x32ab340b, + 0x30e8e211, + 0x20e8105e, + 0x3207108f, + 0x37334287, + 0x420b430b, + 0x33333407, + 0xf453342b, + 0x4101fe8c, + 0xf221320b, + 0xeda03e23, + 0x014107fe, + 0x0511232e, + 0x0324033e, + 0x93f49834, + 0x029313f2, + 0x24012311, + 0x41033103, + 0x24052315, + 0x104231ec, + 0x92fef393, + 0xa7340102, + 0xfefddbee, + 0x4127e405, + 0xcfff0ea7, + 0x7004c5fd, + 0xc56ed389, + 0x3ae26c04, + 0xbc870718, + 0x41534b07, + 0xd48d4fab, + 0x53312370, + 0xee202741, + 0x99100634, + 0xd29d07d4, + 0x2f4fe606, + 0x81f37110, + 0x012527f4, + 0x05440341, + 0xa8340331, + 0x994027f2, + 0xd49d63d2, + 0xd12fe608, + 0x70dc8901, + 0x3c074c07, + 0x34034223, + 0x1fff4d83, + 0x1fff3d83, + 0x33104c33, + 0xd4c5103c, + 0xb4d3c5b0, + 0x0fb222e0, + 0x99252c27, + 0x312706da, + 0x3027c486, + 0x44334a07, + 0x333324ab, + 0xab70d189, + 0x08d2d523, + 0x89122301, + 0x10e86ed4, + 0x44470f87, + 0x0f7141f2, + 0x0372d289, + 0x3323e323, + 0xc1219b25, + 0xd3c1f0d4, + 0xa7420bf4, + 0xfddfff0e, + 0x0ba804c5, + 0xa402c523, + 0xffff3ea7, + 0x8934a1ef, + 0xd08976de, + 0x98d1c178, + 0x071d40c8, + 0x05422723, + 0x9b302724, + 0x00070ef3, + 0x2305ff8b, + 0x40cc24a1, + 0x70dc89ed, + 0x8706da99, + 0x2b300741, + 0x27351034, + 0xab3e9b34, + 0xff4ea73f, + 0x4385efff, + 0x270cd399, + 0x64d49d40, + 0xded11027, + 0x430701d0, + 0x3368d18d, + 0x2b453333, + 0x14e28943, + 0x00274d0b, + 0x01da4abd, + 0xe3892247, + 0x9d442712, + 0xd4c505d1, + 0xacd0c5a8, + 0x0110d0d5, + 0x0114d0d5, + 0x2bc4d0c5, + 0x1013472c, + 0x07222723, + 0x23419b42, + 0xad31a741, + 0xad0126d4, + 0xbd0124d3, + 0xad012fd2, + 0xad012cd1, + 0xad0128d0, + 0xd5012adc, + 0xb90134d0, + 0xe00194e4, + 0x00d2ff4c, + 0x4f6b4123, + 0xff104cf4, + 0x98e4b900, + 0xf74fe601, + 0x070b0700, + 0x07ab07cb, + 0x273d072e, + 0x03010310, + 0x1ea303c2, + 0xa224a955, + 0x554bc201, + 0x349d4127, + 0xa024a91c, + 0x6a04ca01, + 0x01a224a9, + 0x276340c2, + 0x2d349d41, + 0x01a024a9, + 0xa950c4ca, + 0xc201a224, + 0x4127494c, + 0xa93e349d, + 0xca01a024, + 0x24a936a4, + 0x4ac201a2, + 0x9d41272f, + 0xe4b94f34, + 0x11030198, + 0x030c2c03, + 0x8f41f231, + 0xa024a900, + 0xa64bc201, + 0x349d4027, + 0x21ab1e1c, + 0x070a07f1, + 0xf2967e2d, + 0x27fd835e, + 0x4f349d40, + 0x4027d11e, + 0x1e3e349d, + 0x9d4027b7, + 0x9d1e2d34, + 0x890cd399, + 0x43077ed1, + 0x33334533, + 0x4d0b432b, + 0x01e041ad, + 0xd180d389, + 0x890120d2, + 0xda9970dc, + 0x15334706, + 0xfebe5e23, + 0x0198e2b9, + 0x025ce4d1, + 0x23332103, + 0x1c9b1207, + 0xe4bf3ea7, + 0x05140bfd, + 0x35321531, + 0x70d48930, + 0x0199e3b9, + 0x34da4103, + 0x9f4ea70e, + 0x120bfde4, + 0x42154105, + 0xd4994035, + 0xba4fe663, + 0x62d19900, + 0x995a11d8, + 0xd38960db, + 0x334b0770, + 0x0bcb8744, + 0xff0ea7c4, + 0xc4f1ffff, + 0xff00038c, + 0x010802d1, + 0x4edc3403, + 0x35040000, + 0x9007a347, + 0x3dbe171e, + 0x94d1ffd3, + 0xc3f10108, + 0xff00038c, + 0x3edc2407, + 0x16040000, + 0x48534207, + 0x4f6b3207, + 0x64120d27, + 0xce103c53, + 0x3adad9b4, + 0x62d199d6, + 0x995712d8, + 0xd38961db, + 0x334b0770, + 0x0bcb8744, + 0xff1ea7c4, + 0xc4f1ffff, + 0xff00038c, + 0x010812d1, + 0x4edc3403, + 0x32040000, + 0x9107a347, + 0xe1be171e, + 0x94d1ffd2, + 0xc3f10108, + 0xff00038c, + 0x3edc2407, + 0x16040000, + 0x48534207, + 0x4f6b3207, + 0x64120d27, + 0xce103c53, + 0x3adad9b4, + 0xd0d4d1d6, + 0x6543b901, + 0xb93ff603, + 0xc4d2c10c, + 0x27c8d3c1, + 0xc2f40540, + 0xd4c13832, + 0xc5420bcc, + 0x430ac4d4, + 0xd1c4d3c5, + 0xc1011cdc, + 0xc411c4d3, + 0x991f34c2, + 0x0d070dd1, + 0xffd6c2be, + 0x01d4d0d1, + 0xf40c1e27, + 0xd2e2be01, + 0xc1c311ff, + 0x34cac4d4, + 0xc1fc01e3, + 0x4ce2d0d4, + 0xd41900d7, + 0xb103bc07, + 0xc66cda89, + 0xff3ea748, + 0x3411d07f, + 0x9b80d289, + 0x1624c22b, + 0x34113225, + 0x070f24c2, + 0x1a1c2703, + 0xf3e83107, + 0x42ca0411, + 0x70d189f8, + 0x00a11fe6, + 0x0663d299, + 0x62d4a92d, + 0x404cc202, + 0x0118ded1, + 0x0110d4d1, + 0x0b82d389, + 0xe0e30be4, + 0x270c1022, + 0x3107800c, + 0x31233153, + 0xe71f2ea7, + 0x073183fd, + 0x0b439b40, + 0x1524054e, + 0x35102720, + 0x0731c321, + 0x0b439b40, + 0x1524054e, + 0xf0213520, + 0x070bd0c2, + 0x0242034a, + 0x2b4b074b, + 0xd14cc64c, + 0x070110d2, + 0x9f0ea714, + 0xcc27fde6, + 0xdfeea740, + 0xd3d1fde6, + 0xd4890118, + 0x0b320b86, + 0x15040543, + 0x84d4890c, + 0x430b2027, + 0xd3890235, + 0x15e4057a, + 0xd1e235e3, + 0x890110d2, + 0x240b80d4, + 0x0110d2d5, + 0x89d0f1f0, + 0x4f2670d4, + 0xefff1ea7, + 0x3814c1fd, + 0xc14813c1, + 0x3c335812, + 0x182c3318, + 0x531d3c53, + 0x4c331d2c, + 0x53320b18, + 0x340b1d4c, + 0xc1073a66, + 0x01d4d0d1, + 0xf40c1e27, + 0xd1c2be01, + 0x38c4c1ff, + 0xc148c3c1, + 0x3c3358c2, + 0x184c3318, + 0x531d3c53, + 0x2c331d4c, + 0x53340b18, + 0x320b1d2c, + 0x01d23fd6, + 0x63d399f4, + 0xf4054103, + 0x00c03fe6, + 0xa9a8dcc1, + 0xda025ed4, + 0xd4994d4c, + 0x08ded164, + 0x07340701, + 0x333a3324, + 0x03342b48, + 0xa764003d, + 0xfddfff4e, + 0x239c43c5, + 0xb0d1c1c4, + 0xd0c14c07, + 0xff4d83b4, + 0xc5c2031f, + 0x41abb8d3, + 0x1ea72183, + 0x83fddfff, + 0xc51fffcd, + 0xc0abac14, + 0x2eab2633, + 0xc5b01cc5, + 0xd3c18c12, + 0xd0d4c1ac, + 0x996043c2, + 0xd0d163d4, + 0xd2d10118, + 0xde890114, + 0x9f42e082, + 0x801c270a, + 0x0260d4a9, + 0x993143c2, + 0x49b606d4, + 0x0b70d489, + 0xe62e0b20, + 0x530b144f, + 0x83412341, + 0x9b310741, + 0xa7230b34, + 0xfde6ef3e, + 0x31153205, + 0x34354027, + 0xd1acd3c1, + 0x890114d2, + 0x310380d4, + 0x4127240b, + 0xd5acd3c5, + 0x8d0114d2, + 0xd19968d4, + 0xbe0d070d, + 0xc1ffd49f, + 0xd399a8d4, + 0xc3420364, + 0xc4d1c131, + 0xc5c8d2c1, + 0xd39da8d4, + 0x3821c264, + 0x0bccd4c1, + 0xc4d4c541, + 0xd2c5420a, + 0x1cdcd1c4, + 0xc4d3c101, + 0x34c2c411, + 0x0dd1991f, + 0x64be0d07, + 0xd0d1ffd4, + 0x1e2701d4, + 0xbe01f40c, + 0x11ffd084, + 0xc4d4c1c3, + 0x01e334ca, + 0xd0d4c1fc, + 0x00d74ce2, + 0xbc07d419, + 0xda89b103, + 0xa748c66c, + 0xd07fff3e, + 0xd2893411, + 0xc22b9b80, + 0x32251624, + 0x24c23411, + 0x2703070f, + 0x31071a1c, + 0x0411f3e8, + 0x89f842ca, + 0x1fe670d1, + 0xd29900a1, + 0xa92d0663, + 0xc20262d4, + 0xded1404c, + 0xd4d10118, + 0xd3890110, + 0x0be40b82, + 0xbe22e0e3, + 0x800c2706, + 0x31533107, + 0x2ea73123, + 0x83fde71f, + 0x9b400731, + 0x054e0b43, + 0x27201524, + 0xc3213510, + 0x9b400731, + 0x054e0b43, + 0x35201524, + 0x4bc2f021, + 0x034a0707, + 0x074b0242, + 0xc64c2b4b, + 0x10d2d14c, + 0xa7140701, + 0xfde69f0e, + 0xa740cc27, + 0xfde6dfee, + 0x0118d3d1, + 0x0b86d489, + 0x05430b32, + 0x890c1504, + 0x202784d4, + 0x0235430b, + 0x057ad389, + 0x35e315e4, + 0x10d2d1e2, + 0x80d48901, + 0xd2d5240b, + 0xf1f00110, + 0x34d4d1d0, + 0x7d4fd601, + 0x0d071f07, + 0xffe8f4be, + 0x070dd199, + 0xd359be0d, + 0x24d2a9ff, + 0x26d4a901, + 0x892f8b01, + 0x42f270d0, + 0x40270717, + 0x0134d4d5, + 0x20282103, + 0xd4d54127, + 0xd4b90134, + 0xd2ad012f, + 0x41e00124, + 0x42e005e8, + 0xff1e04f9, + 0x432b4427, + 0x0143d4bd, + 0x3b14e389, + 0xe23a2b24, + 0x07f7f832, + 0xf7f35e32, + 0xca7e0d07, + 0x27fe21f6, + 0xd1e41d41, + 0x2101d4d0, + 0xd04abef1, + 0xbe0ff6ff, + 0xd0ded105, + 0xf7555e01, + 0xa99341c4, + 0x990128d3, + 0x34ee0fd4, + 0x3ff60692, + 0xd4b9049b, + 0x4ff6012e, + 0xd4990493, + 0xd1473607, + 0xa7010cd4, + 0xfdbf3f3e, + 0xd2d13425, + 0xeea70104, + 0xc5fddfff, + 0xdbd140e2, + 0x402701d0, + 0xb907d49d, + 0xa60365b3, + 0x270d0735, + 0xf4fd7e10, + 0x01d0dbd1, + 0xa798d1c1, + 0xffffff0e, + 0xb9f6b799, + 0xf6156502, + 0x0706291f, + 0xd0b4c197, + 0x07db4ff6, + 0xb4b93707, + 0xa30703a0, + 0xa4074312, + 0x2734ac08, + 0x0a0733ac, + 0xd0bd0f6b, + 0xb3b90238, + 0xd2b90367, + 0xd3bd0238, + 0x31230239, + 0x4f6b4307, + 0x42f03103, + 0xb39906d7, + 0x9b162741, + 0x0b410713, + 0x3f4c834a, + 0x310b3007, + 0xd2994933, + 0x18d39d09, + 0x9d94d4c5, + 0xd39d1bd3, + 0x19d39d1a, + 0x4a0727e6, + 0x830c4c03, + 0x4c333f4c, + 0xcd4ea317, + 0x2ea735cb, + 0x27f3ffff, + 0x7424c530, + 0xb909d39d, + 0xf60367b4, + 0xb906484f, + 0xf60194b4, + 0x0706404f, + 0x0733533a, + 0x5343072a, + 0x83278325, + 0x48331f4c, + 0x20002da3, + 0xf33524ab, + 0x3a074a07, + 0x53f03c83, + 0x4523ab44, + 0x154027f4, + 0x04d399f4, + 0x3556f26d, + 0x036db4b9, + 0x061a4fe6, + 0x0bf6b299, + 0x7f2c8321, + 0xffffeea7, + 0xd0b4c1f3, + 0xa63ce2c5, + 0x04f09d44, + 0xf5af0ea7, + 0xd10311fe, + 0x690230d4, + 0x99432bf0, + 0x42f404f1, + 0xd4d1059a, + 0x44870234, + 0x0a5841fd, + 0x40edff01, + 0xff010a5a, + 0x0230d3d1, + 0xf5af4ea7, + 0xd53103fe, + 0x050230d3, + 0x34d4d143, + 0x83410302, + 0x34d4d541, + 0xa7412702, + 0xfdcfffee, + 0xc50ad399, + 0x3fe66ce4, + 0xd6990218, + 0xd0d4d163, + 0x33860701, + 0x03380783, + 0x036e1c3f, + 0x4831c100, + 0x9b4c32c1, + 0x0b14731a, + 0x6a45b912, + 0x2211e803, + 0x28410705, + 0xf0537f1c, + 0x0401f540, + 0x07404cf0, + 0x23b44705, + 0xbc837fbc, + 0x0348077f, + 0x036e1c4f, + 0x6042c100, + 0x9b6443c1, + 0x0b24732a, + 0x8021e823, + 0x28420704, + 0xf2537f2c, + 0x2401f510, + 0x62404cf0, + 0x23c44704, + 0xcc837fcc, + 0x07c7337f, + 0x1c4f0348, + 0xc100036e, + 0x43c17842, + 0x732a9b7c, + 0xe8230b24, + 0x07043821, + 0x7f2c2842, + 0xf4def353, + 0x4cf03401, + 0x47041840, + 0x7fec23e4, + 0x337fec83, + 0x48070eec, + 0x6e1c4f03, + 0x42010003, + 0x2a9b4311, + 0x230b2473, + 0x03ee21e8, + 0x2c284207, + 0xadf0537f, + 0xf00401f4, + 0x03cd404c, + 0x1c231447, + 0x7f1c837f, + 0x07151c33, + 0x1c4f0348, + 0x6100036e, + 0x9b437142, + 0xab9c072a, + 0xab24739b, + 0xab230b9e, + 0x9b21e891, + 0x28420703, + 0xf1537f2c, + 0x1401f474, + 0x80404cf0, + 0x23b44703, + 0xbc837fbc, + 0x0348077f, + 0x036e1c4f, + 0x3042c100, + 0x9b3443c1, + 0x0b24732a, + 0x5921e823, + 0x28420703, + 0xf3537f2c, + 0x3401f444, + 0x3b404cf0, + 0x23144703, + 0x1c837f1c, + 0x0717337f, + 0x1c4f0348, + 0xc100036e, + 0x43c19042, + 0x732a9b94, + 0xe8230b24, + 0x07031121, + 0x7f2c2842, + 0xf412fe53, + 0x4cf0e401, + 0x4702f140, + 0x7f0c2304, + 0x337f0c83, + 0x48070e0c, + 0x6e1c4f03, + 0x42c10003, + 0xac43c1a8, + 0x24732a9b, + 0x21e8230b, + 0x420702c5, + 0x537f2c28, + 0x01f3dff2, + 0x404cf024, + 0xe44702a4, + 0x837fec23, + 0xec337fec, + 0x03480715, + 0x036e1c4f, + 0xc042c100, + 0x9bc443c1, + 0x0b24732a, + 0x7821e823, + 0x28420702, + 0xf3537f2c, + 0x3401f3ac, + 0x5d404cf0, + 0x23244702, + 0x2c837f2c, + 0x0346077f, + 0x036e004f, + 0x18439900, + 0xc8154c99, + 0x41270c53, + 0x40276496, + 0xab1c4c33, + 0x831bab94, + 0xabc78337, + 0x183c3310, + 0xffff0ea7, + 0x15cc33f3, + 0xab6809c5, + 0xc53cab1e, + 0x32ab6c01, + 0x03c54027, + 0x0ad49d70, + 0xffff1ea7, + 0x6517bdff, + 0x0cacf415, + 0x2027032e, + 0x01d0dcd1, + 0xc3d14287, + 0x40f102b8, + 0x00032e00, + 0x03563ff6, + 0x30271d07, + 0xfdd49cbe, + 0x2c832007, + 0x5340077f, + 0x53320741, + 0x804e8331, + 0x43ab0fff, + 0xffff3ea7, + 0x7c34c5f3, + 0xf663d399, + 0x5302d03f, + 0x01f30ffe, + 0xa740abe4, + 0xf3ffff3e, + 0xc4b934a5, + 0x4686036a, + 0x43334207, + 0x240b2533, + 0x02002d30, + 0xf2f6f453, + 0x4a074201, + 0xa3f9fe41, + 0x00032ea0, + 0x4c83f031, + 0x0fec833f, + 0x0c834833, + 0xabfe450f, + 0x0eec3334, + 0x3eabf035, + 0x33120c33, + 0x1ea714ac, + 0xabf3ffff, + 0xff2d8330, + 0x00af8301, + 0xc503c000, + 0x3aab5812, + 0xd4b913b5, + 0x4fe60130, + 0x0d070131, + 0x0abe1f07, + 0xd499ffe4, + 0x1a4ff608, + 0x28d4a9fb, + 0x124fe601, + 0xd0d4d1fb, + 0x5e43b901, + 0xff3ce003, + 0x2ea701ff, + 0xc1fddfff, + 0x44fc4024, + 0x0d07faf9, + 0x27f02f7e, + 0x08d49d41, + 0xb9faec5e, + 0xc60131d4, + 0xd199b54f, + 0xbe0d070c, + 0x1effce33, + 0x074207aa, + 0x47427332, + 0x73318344, + 0x83430b21, + 0x28d4ad21, + 0x2ed2bd01, + 0x28d4a901, + 0x2ed2b901, + 0x8341c301, + 0x00112741, + 0x27102721, + 0x27248631, + 0x0b148b30, + 0xad348b02, + 0xbd012ad0, + 0xbd0130d3, + 0xa90131d1, + 0xa90138d2, + 0xee013ad1, + 0x0701bb12, + 0x0b438342, + 0x4543b94d, + 0x0b3f4b01, + 0xf020c823, + 0x07ed12da, + 0x83420732, + 0xad425333, + 0xbd013cd4, + 0xad0140d3, + 0xd10138d2, + 0xe40134d4, + 0x99fa4842, + 0x450605d4, + 0x00be0d07, + 0xd199ffca, + 0xbe0d070c, + 0xd1ffcd9f, + 0xb901d0d4, + 0xc0035e43, + 0x9934ff3c, + 0x4a1608d4, + 0xdfffeea7, + 0x40e4c1fd, + 0x272444d8, + 0xff2ea748, + 0xd0d1fddf, + 0x24a501d4, + 0xbe151c27, + 0xa7ffc99c, + 0xfddfff3e, + 0x34a54027, + 0xdc4033c1, + 0xd499de34, + 0x524ff607, + 0x7e0d07fa, + 0x4a5eef38, + 0x270d07fa, + 0xcfe2be10, + 0xfed05eff, + 0xd2ad4027, + 0xd4bd0128, + 0x225e012e, + 0x8ef243ff, + 0x000d27f5, + 0xf9425e01, + 0x473f4c13, + 0x7f2c8324, + 0x53fda45e, + 0x01f13ff4, + 0xfd9b5e42, + 0x2b3fec27, + 0x16ec33e4, + 0x0000ef83, + 0x5a5e0fc0, + 0x00ef27fd, + 0x5e0f8000, + 0x0c27fd51, + 0x33042b3f, + 0x0e830f0c, + 0x5e1f8000, + 0x0e27fd0e, + 0x5e1f0000, + 0x1c27fd06, + 0x33142b3f, + 0x001d8318, + 0xfcc55e3f, + 0x3e001d27, + 0x13fcbe5e, + 0xb4473f4c, + 0x5e7fbc83, + 0xf253fc81, + 0x2b01f0e4, + 0x27fc785e, + 0x142b3f1c, + 0x83161c33, + 0xc000001f, + 0xfc315e0f, + 0x00001f27, + 0x285e0f80, + 0x3fec27fc, + 0xec33e42b, + 0x00ee830f, + 0xe75e1f80, + 0x00ee27fb, + 0xdf5e1f00, + 0x3fcc27fb, + 0xc833c42b, + 0x3f00cd83, + 0x27fb9e5e, + 0x5e3e00cd, + 0xd4d1fb97, + 0xd3890110, + 0xd5430b80, + 0xd10110d4, + 0x5e0134d4, + 0x9207f8f9, + 0xa7f9d85e, + 0xfddfff3e, + 0xfc4034c1, + 0x5ef8fc41, + 0xd4b9fe02, + 0x4ff6012e, + 0xd199f96a, + 0x7e0d070d, + 0x0d07eeef, + 0xffcd66be, + 0x0128d3a9, + 0x27f9555e, + 0x34d4d542, + 0xfe3d5e01, + 0xd4bd4027, + 0x685e0141, + 0x45f153fe, + 0x5e1401f0, + 0x4c13fd31, + 0x83b4473f, + 0xfa5e7fbc, + 0x29f153fa, + 0x5e1b01f0, + 0x2a07faf1, + 0x5e0c2c23, + 0x3ea7fcd0, + 0xc1fdcfff, + 0xeea74832, + 0x07fdcfff, + 0x2744a342, + 0x48e4c530, + 0x070ef39b, + 0xc5ff8b00, + 0xe3c548e2, + 0xaf3ea768, + 0x3211fef5, + 0x0230d4d1, + 0x42d4422b, + 0xfa345ece, + 0xf5be1d07, + 0xad5efdd1, + 0x07ea07fc, + 0x53e3533a, + 0x112d2734, + 0x45fe3521, + 0xf9d75ef3, + 0x0239d4b9, + 0x3ea74766, + 0x99feffff, + 0x43830934, + 0x44332487, + 0x43f9422b, + 0xff00004d, + 0x070b31c0, + 0x83290b21, + 0xc95e7f2c, + 0x7f2c27f9, + 0xd0f9c35e, + 0x27452e2c, + 0x27310441, + 0xfb4f1340, + 0xb9ffffff, + 0xbd0239d1, + 0xc0023ad4, + 0x4c272911, + 0x3bd4bdfa, + 0x1b11c002, + 0x27fe4c27, + 0x27110431, + 0x3cd4bd30, + 0xbd412702, + 0xbd023dd4, + 0x5e023ed3, + 0x4127f8ee, + 0x4c27e61e, + 0xd0d71efe, + 0x2749292c, + 0x27310441, + 0xfd4f1340, + 0xb9ffffff, + 0xbd0239d1, + 0xc0023ad4, + 0x4c272d11, + 0x3bd4bdfc, + 0x1f11c002, + 0x27ff2c27, + 0x27110431, + 0x00412730, + 0xbd402711, + 0xbd023cd2, + 0xbd023dd4, + 0x5e023ed3, + 0x2027f8a2, + 0x4c27e21e, + 0xc0d31eff, + 0x4c273731, + 0x39d1b9fb, + 0x3ad4bd02, + 0x2511c002, + 0x27fd4c27, + 0x27110421, + 0x00312720, + 0xbd302711, + 0x27023bd4, + 0x3cd3bd40, + 0x3dd4bd02, + 0x3ed2bd02, + 0xf8645e02, + 0xdc1e4027, + 0x1efe4c27, + 0x070b07c9, + 0xe6657e29, + 0x01d0dbd1, + 0xb4b97007, + 0x4f4b036f, + 0x74074012, + 0x0370b4b9, + 0x74124f4b, + 0xb4b97407, + 0x4fe60385, + 0xb4b9f800, + 0x4fe60386, + 0xb2d1f7f8, + 0x2ff60398, + 0xd3a900ae, + 0xb4d1012a, + 0x43e20388, + 0x1ea7f7e4, + 0xd1ffffff, + 0x5e188413, + 0x1d27f7da, + 0x615e0100, + 0x10d4d1f5, + 0x80d38901, + 0xd4d5430b, + 0x745e0110, + 0x000d27f4, + 0xf3f05e01, + 0x10270d07, + 0x5ee51a7e, + 0x20a7f341, + 0x89efa15e, + 0x412372d2, + 0x23e32303, + 0x249b2533, + 0x27f08e5e, + 0xf0895e20, + 0x5e272c27, + 0x0027f04f, + 0x27ef1e5e, + 0xeff95e21, + 0x4103432b, + 0x21152405, + 0x27efb75e, + 0xff2ea744, + 0x24c5fdcf, + 0x270b0748, + 0x15be181c, + 0x4027ffc6, + 0xcfff3ea7, + 0x4834c5fd, + 0x5e6834c5, + 0xd1c1ef30, + 0x07f37198, + 0x7e2b070d, + 0xd65ee8be, + 0x5e1147ef, + 0xbcd1f4f7, + 0xdea90388, + 0x4c07012a, + 0x4ece429b, + 0x39e4c231, + 0x42072103, + 0x21234c9b, + 0xa72e4ec2, + 0xffffff0e, + 0x188403d1, + 0x038cb1d1, + 0x41234107, + 0xf71442ee, + 0x4c9b4107, + 0xe4e24123, + 0x235ef70a, + 0xff4ea7ff, + 0x43d1ffff, + 0xdd1e1884, + 0xd91e3707, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x1c000808, + 0x3030001c, + 0x00343c00, + 0x00001000, + 0x03010010, + 0x00020000, + 0xfffffffb, + 0x00000048, + 0xfffffff1, + 0x00000048, + 0xfffffff1, + 0x00000048, + 0xfffffffb, + 0x00000058, + 0xfffffffb, + 0x00000048, + 0xfffffffb, + 0x00000048, + 0x00000000, + 0x00000058, + 0xfffffff6, + 0x00000060, + 0xfffffff6, + 0x00000060, + 0x00000000, + 0x00000000, + 0x0000000f, + 0x00000018, + 0x0000000f, + 0x00000018, + 0x00000000, + 0x00000000, + 0x0000000a, + 0x00000038, + 0x0000000a, + 0x00000038, + 0x00000000, + 0x00000000, + 0x0000000f, + 0x00000038, + 0x0000000f, + 0x00000038, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000018, + 0xfffffffb, + 0x00000020, + 0x00000000, + 0x00000000, + 0xfffffff1, + 0x00000060, + 0x00000000, + 0x00000040, + 0x00000000, + 0x00000000, + 0xfffffff6, + 0x00000040, + 0xfffffffb, + 0x00000038, + 0x2ea7fd4e, + 0x27fdeb8f, + 0x27230530, + 0x4200004f, + 0x0724150f, + 0x0ef39bd0, + 0xc0630499, + 0x04d14b41, + 0x43b901d0, + 0x430b0366, + 0x030043b9, + 0x34334387, + 0x40f1430b, + 0xff000394, + 0xe63f2ea7, + 0x272005fd, + 0x272e15e4, + 0xa7213510, + 0xfde62f3e, + 0x05244c27, + 0xa73e1534, + 0xf7ffff2e, + 0x21d53135, + 0x24d10100, + 0x040b0108, + 0xfd8ed055, + 0x01d004d1, + 0x035a43b9, + 0x43b9430b, + 0xb51e0300, + 0x1389f54e, + 0x1612891c, + 0x891a1e89, + 0xa107181c, + 0x1ea74127, + 0x45fddfff, + 0x2b2e2b14, + 0xfc02c5c3, + 0xd5f80cc5, + 0xb901c412, + 0x070362a3, + 0x8413c5d0, + 0xe374a4c1, + 0x530407f3, + 0x83140748, + 0x1153300c, + 0x04534183, + 0xf4c51183, + 0xc5f06534, + 0x4ff630f1, + 0x300701e2, + 0xc134f4c1, + 0x040e30f0, + 0xa18934a3, + 0xc541077c, + 0x4d8338f1, + 0x4fe68000, + 0x2ea7013d, + 0x89fddfff, + 0x2cd594a3, + 0xa4c10108, + 0x7542fc98, + 0x0c23d502, + 0x80a4c101, + 0x01f824d5, + 0xc134f0c1, + 0x408730f1, + 0xf2611333, + 0x42ab41ab, + 0xdfff1ea7, + 0x8814c5fd, + 0x035ea3b9, + 0x11ff3cc0, + 0x34334387, + 0x44f1430b, + 0xff000390, + 0x0100d4d5, + 0x8978d489, + 0x410374d3, + 0x4c332307, + 0xff2d830f, + 0x004f830f, + 0x330fff00, + 0x0342ab35, + 0x14c57f3c, + 0x7f3ce3a0, + 0x01d013d5, + 0xd2d52127, + 0xa3990104, + 0x42a49941, + 0x43833383, + 0x34334633, + 0x230734ab, + 0xd2d523a3, + 0xa4b90104, + 0x4c20035e, + 0xd537a3ff, + 0xc10104d3, + 0x4d8338f4, + 0x4fe68000, + 0xa4c10129, + 0xc342f898, + 0x04d2d101, + 0x002da301, + 0x04d2d502, + 0x98a4c101, + 0x2da34458, + 0xd2d50400, + 0xa4c10104, + 0x404cf898, + 0x2da30105, + 0xd2d54000, + 0xd4c10104, + 0x002da3a4, + 0x04d2d501, + 0x024de401, + 0xa300fd01, + 0x04d2d528, + 0x60a4b901, + 0x83302703, + 0xab4b3343, + 0x04d2d524, + 0xff4ea701, + 0x43a5fddf, + 0x3183f361, + 0x00fd3ff6, + 0x02c0a1d1, + 0xe0400c27, + 0xfd02011d, + 0x021df000, + 0xe0011a02, + 0x6602811d, + 0x011de001, + 0x2700eb12, + 0xd5f3c340, + 0x8e010cd4, + 0x234307f5, + 0x3a43f442, + 0x27412701, + 0x031a0733, + 0x4ff6981c, + 0x2ea705e3, + 0x01fddef7, + 0x05140314, + 0xa8240324, + 0x074327f3, + 0x031f073a, + 0x1c03803c, + 0x612f070c, + 0x01100530, + 0x05140330, + 0x03340320, + 0x89f47824, + 0xa0d1a4a4, + 0x410302c0, + 0x11531407, + 0x20274123, + 0x27f00c18, + 0x6b320721, + 0x010de03f, + 0xf4032103, + 0x0303020d, + 0x210d4001, + 0x220df401, + 0xe002f201, + 0xfc01020d, + 0x040de402, + 0x87010b01, + 0x27702784, + 0x5ef48540, + 0x20070108, + 0x32072203, + 0x22233383, + 0x155ef265, + 0x04d2d1fe, + 0x002da301, + 0xa4d4c101, + 0x0104d2d5, + 0x01024de0, + 0x4de0ff07, + 0xff011102, + 0x80024de0, + 0x4de0fefb, + 0xfef58022, + 0x01824de0, + 0xa4d1feef, + 0x478302c0, + 0xfeeb44e4, + 0xd1fee25e, + 0xc102c0a1, + 0x1de4f8d0, + 0xff070201, + 0x27fcd2c1, + 0x07209b10, + 0x07315332, + 0xd4420b43, + 0x3e80014e, + 0x8341072d, + 0xc3483343, + 0x0cd4d5f3, + 0xe4f58e01, + 0xc1fef211, + 0xd3c1fcd4, + 0x9b2007f8, + 0x53249b34, + 0x07102731, + 0xd0420b43, + 0x3e80014e, + 0xf0230ad5, + 0x3e80012e, + 0x41070220, + 0x48334383, + 0xf3c341a3, + 0x010cd4d5, + 0xd2d1f58e, + 0x495e0104, + 0xe04127fe, + 0x27fec637, + 0xfec15e40, + 0x3d833703, + 0x865efff8, + 0xfcd4c1fd, + 0x3ff61127, + 0x244701c4, + 0x3207209b, + 0x31531213, + 0x0de0ae1e, + 0xff111121, + 0x11220df4, + 0x0de0023f, + 0x01f91102, + 0x11040de0, + 0x0de0feff, + 0x01fc0321, + 0xf1851027, + 0x80277027, + 0x0774a4c1, + 0x07385334, + 0x30ec83e4, + 0xe4533183, + 0xe20334c6, + 0x4953e383, + 0x340e4183, + 0xf4c1e4a3, + 0x004d8338, + 0x2d4ff680, + 0xa4d4c1fd, + 0x03014de0, + 0x6c2701ed, + 0x020de040, + 0xe001d801, + 0x3c11020d, + 0x210de004, + 0x00043603, + 0xe401210d, + 0x0811210d, + 0x27212704, + 0xf275405c, + 0xe4084227, + 0x02810de0, + 0x0de00146, + 0x01490104, + 0x11040de0, + 0x0de00143, + 0x013d2104, + 0xf1951027, + 0x31040de0, + 0x0de00137, + 0x011d0182, + 0x0de01027, + 0x013e0301, + 0x03210de0, + 0x30270138, + 0x2027f3a5, + 0xcea7f2b5, + 0x27fddfff, + 0xfcd2c1b0, + 0xd5409c27, + 0x0b0114cb, + 0x18cbd514, + 0x3b390701, + 0x1ccbd531, + 0x27130701, + 0x210d0041, + 0x3b402703, + 0xc8e3e014, + 0x34e4ec01, + 0x77e1e001, + 0x6ee2e801, + 0x010de005, + 0xe0054d02, + 0x4712010d, + 0x020de005, + 0xe0044101, + 0x3b11020d, + 0x210de004, + 0xe0052501, + 0x1f11210d, + 0x810de005, + 0x07046702, + 0xe0178310, + 0xe004fc14, + 0xf601820d, + 0x210de004, + 0xc104c403, + 0x2ea798a3, + 0x33fddfff, + 0x403c2336, + 0x011423d5, + 0x339ca4c1, + 0x204c2345, + 0x011824d5, + 0x33a0a3c1, + 0x203c2335, + 0x011c23d5, + 0x040a14e0, + 0x01820de0, + 0xd4c10404, + 0x07f241f8, + 0x23315334, + 0x51f13131, + 0x9be207f0, + 0x23720b23, + 0x9bf28141, + 0x0b309b41, + 0x0be53323, + 0x33163384, + 0x2bf28505, + 0x13262b85, + 0x2be01310, + 0xc5001376, + 0xd8c5d4d1, + 0xdcdec5d8, + 0xc5e0d7c5, + 0xd2c5e4d0, + 0x01825ee8, + 0x209b2447, + 0x32071027, + 0x31531213, + 0x27fdea5e, + 0x5ef2a522, + 0x3127fef2, + 0xf3951027, + 0x27fed95e, + 0x27f39530, + 0xfed05e12, + 0x43834107, + 0x44a34833, + 0xd4d5f3c3, + 0xf58e010c, + 0x20273127, + 0xf2a5f3b5, + 0xc0fec95e, + 0x5e02010d, + 0x02810dc0, + 0x820de459, + 0x47fe1701, + 0x3b840b81, + 0x27702783, + 0x5ef38530, + 0x133bfe10, + 0x833b8407, + 0xf1857107, + 0xe0fe035e, + 0xe8023de5, + 0xe001bae5, + 0xe0014ae6, + 0x1e00afe7, + 0x805c27ff, + 0x10274127, + 0x3f5ef175, + 0x206c27fe, + 0xe0fe145e, + 0xc821040d, + 0x040de0fc, + 0xe4fcc231, + 0xc512010d, + 0x3b8407fd, + 0x03710783, + 0x3b202731, + 0x5ef28573, + 0x0de0fdbc, + 0x02d70121, + 0x11210de0, + 0x0de002d1, + 0x02c40281, + 0x47834007, + 0x02c344e0, + 0x01820de0, + 0xf48102bd, + 0x462b3607, + 0xf081f485, + 0x30134507, + 0x762b852b, + 0xd4c54013, + 0xd8d8c5d4, + 0xc5e0d7c5, + 0xd0c5e4d3, + 0xdcd3c5e8, + 0xe000835e, + 0x7f01210d, + 0x210de002, + 0xe0027911, + 0x4d02810d, + 0x83400702, + 0x1344e447, + 0xfcd4c102, + 0x4123f331, + 0x2587439b, + 0xc5d4d2c5, + 0x551ed8d4, + 0x0de03207, + 0x01f30121, + 0x11210de0, + 0x0de001ed, + 0x01d40281, + 0xfc41fb31, + 0xf4a12307, + 0x143b2173, + 0xf4512123, + 0x3123f081, + 0x3b9bc29b, + 0x062b312b, + 0xc62b249b, + 0x40134607, + 0x380bf085, + 0x020bc70b, + 0xd1c51013, + 0xd8d3c5d4, + 0xc5e0dcc5, + 0xd0c5e4d4, + 0xdcd4c5e8, + 0xd2c1f391, + 0xc1f401d8, + 0x233be8d0, + 0x0be0d1c1, + 0x3bf42124, + 0xd4dec103, + 0xc1dcdcc1, + 0x133be4db, + 0xf311040b, + 0x130bf491, + 0xc43be43b, + 0xdec5b43b, + 0xdcdcc5d4, + 0xc5e4dbc5, + 0xd1c5d8d2, + 0xe8d0c5e0, + 0xa1fa035e, + 0x07f291f4, + 0x71240be9, + 0x98a3c1f4, + 0x4107e47b, + 0x2407423b, + 0x40133e9b, + 0xc4d5432b, + 0xf4b10114, + 0x7b9ca3c1, + 0x33201324, + 0xd5321b35, + 0xc10118c3, + 0x4533a0a4, + 0xc2d5242b, + 0x0de0011c, + 0x00fd0281, + 0xfc41fb31, + 0xf451f0a1, + 0x3707103b, + 0xbe9b362b, + 0xc533812b, + 0xdbc54533, + 0xd8d8c5d4, + 0xc5dcdcc5, + 0xd3c5e4d4, + 0xe0d3c5e8, + 0xa1ff535e, + 0xc1f391f2, + 0x320b98a4, + 0xf371f3a5, + 0x937b2107, + 0x499bf3a1, + 0x420b233b, + 0x0114c4d5, + 0xb19ca3c1, + 0x7b3533f4, + 0xd5320b24, + 0xc10118c3, + 0x4533a0a4, + 0xc2d5240b, + 0x0de0011c, + 0x00860281, + 0xfc41fb31, + 0x51f8d4c1, + 0x07f071fe, + 0x07205b24, + 0x5339071c, + 0x230e0741, + 0x23301341, + 0x33153321, + 0x9bc49b05, + 0x9b4e9b2b, + 0x1310133b, + 0xd4d3c500, + 0xc5d8d2c5, + 0xdcc5dcd1, + 0xe4d0c5e0, + 0x5ee8d4c5, + 0xf2a1fed4, + 0x3be4d6c5, + 0xd4d1c512, + 0xc5e8dbc5, + 0xd6c5d8db, + 0xe0dbc5dc, + 0x27febb5e, + 0x4127405c, + 0x11020de0, + 0x4027fdb6, + 0xa7fdb15e, + 0xfddef72e, + 0x14031401, + 0x24054013, + 0xf3982403, + 0x27fa1c5e, + 0xdb1e805c, + 0xfc41fb31, + 0xc153b153, + 0xfc45fb35, + 0x31ff735e, + 0x53fc41fb, + 0x53c153b1, + 0x35715381, + 0x5efc45fb, + 0xfb31fef8, + 0xb153fc41, + 0x8153c153, + 0xfb357153, + 0x215efc45, + 0x5e3173fe, + 0x0de0fe12, + 0xfdeb0182, + 0x31fcd3c1, + 0x232307f4, + 0x9bf14131, + 0x51215334, + 0x9b2123f4, + 0xc5249b12, + 0xd3c5d4d5, + 0xe0d1c5d8, + 0xc5e4d6c5, + 0xd6c5e8d2, + 0xfe265edc, + 0x31fcd4c1, + 0x07f241f3, + 0x23415314, + 0x9b412311, + 0x47429b13, + 0xc5264735, + 0xd1c5d4d3, + 0xdcd2c5d8, + 0x5ee0d4c5, + 0xd4c1fe00, + 0x5e4153fc, + 0x5547fd94, + 0x475e6647, + 0x5e5587fd, + 0xa4c1fd42, + 0x23463398, + 0xc4d5804c, + 0x0dc00114, + 0xc07f0121, + 0x7a11210d, + 0x02810dc0, + 0x83100741, + 0xfbf65e17, + 0x31f8d4c1, + 0x9b4123f3, + 0x004d2343, + 0x0b363301, + 0xc5301348, + 0xd4c5d4d3, + 0xfdae5ed8, + 0xa798a4c1, + 0xfddfff2e, + 0x4c234633, + 0x1424d580, + 0x9ca3c101, + 0x3c233533, + 0x1823d580, + 0xf8d4c101, + 0xf241f131, + 0x41533407, + 0x41233123, + 0x429b319b, + 0x23803c23, + 0x1633804c, + 0x380b2533, + 0x1013470b, + 0xd1c52013, + 0xd8d3c5d4, + 0xc5dcd2c5, + 0x5d5ee0d4, + 0xf8d4c1fd, + 0x4153f331, + 0x439b4123, + 0x36333173, + 0x01004d23, + 0x3013480b, + 0xc5d4d3c5, + 0x3d5ed8d4, + 0x98a3c1fd, + 0xdfff2ea7, + 0x233633fd, + 0x23d5803c, + 0xa4c10114, + 0x2345339c, + 0x24d5404c, + 0xa3c10118, + 0x233533a0, + 0x23d5403c, + 0x3d5e011c, + 0x98a4c1fb, + 0xdfff3ea7, + 0x234633fd, + 0xd501004d, + 0x5e011434, + 0xa4c1fb28, + 0x23453398, + 0xd501004d, + 0x5e0114c4, + 0xa4c1ff0e, + 0x23463398, + 0xc4d5404c, + 0xa3c10114, + 0x2335339c, + 0xc3d5403c, + 0xf35e0118, + 0xcceff6fe, + 0x010de0fb, + 0xe0011f02, + 0x1912010d, + 0x020de001, + 0xe0010301, + 0xfd11020d, + 0x210de000, + 0xe000e201, + 0xdc11210d, + 0x810de000, + 0x0700b402, + 0xe0478340, + 0xe0009844, + 0x9201820d, + 0x210dc000, + 0xa3c16003, + 0xff2ea798, + 0x3633fddf, + 0xd5803c13, + 0xc1011423, + 0x45339ca4, + 0xd5404c13, + 0xc1011824, + 0x3533a0a3, + 0xd5403c13, + 0x31011c23, + 0x51f441f1, + 0x332027f3, + 0x33163345, + 0xdcd4c535, + 0xc5e4d3c5, + 0xd1c5e8d2, + 0xd8d2c5d4, + 0xd1e0d2c5, + 0x0002c0a4, + 0xe401214d, + 0x3911214d, + 0xc51173fc, + 0x315ed4d1, + 0x98a3c1fc, + 0xdfff2ea7, + 0x133633fd, + 0xd501003d, + 0xc1011423, + 0x45339ca4, + 0xd5804c13, + 0xc1011824, + 0x3533a0a3, + 0xd5803c13, + 0x1e011c23, + 0x98a4c19f, + 0xdfff3ea7, + 0x134633fd, + 0xd502004d, + 0x1e011434, + 0x98a4c18b, + 0xdfff2ea7, + 0x134633fd, + 0xd501004d, + 0xc1011424, + 0x35339ca3, + 0x01003d13, + 0x011823d5, + 0xc1ff6a5e, + 0x3ea798a4, + 0x33fddfff, + 0x004d1345, + 0x1434d502, + 0xff555e01, + 0x3398a4c1, + 0x004d1346, + 0x14c4d501, + 0xff455e01, + 0x3398a4c1, + 0x804c1346, + 0x0114c4d5, + 0x339ca3c1, + 0x803c1335, + 0x0118c3d5, + 0x00ff2a5e, + 0x00100000, + 0x4027f54e, + 0x0707049d, + 0x0c1099d0, + 0xd09d5107, + 0x12118963, + 0xd18df0e3, + 0x6cde896c, + 0x47145289, + 0x6ed28d4e, + 0x8972d48d, + 0x54d11653, + 0x3c0302c0, + 0x8d35531f, + 0xd4c574d3, + 0x893123a4, + 0x35331654, + 0x4123432b, + 0xd49d4353, + 0x16538965, + 0x4fff2ea7, + 0x0f3c03fd, + 0xd38d3453, + 0x18548976, + 0x530f4c03, + 0x78d48d44, + 0x03185389, + 0x35531f3c, + 0x897cd38d, + 0x31231854, + 0x432b3533, + 0x43534123, + 0x9966d49d, + 0xd09d0e50, + 0x5051a90b, + 0x7424c103, + 0xe880d18d, + 0xd1058740, + 0x9901d0d4, + 0x3fd64143, + 0x7424c168, + 0x05a440e8, + 0x04644d27, + 0x2782d48d, + 0x2704244d, + 0x8d03e43d, + 0x54b984d4, + 0xd38d035f, + 0x684fc686, + 0xffff4ea7, + 0x4143b9fe, + 0x96212701, + 0x07202734, + 0xa9d31d32, + 0xb9034a53, + 0x8d035454, + 0x50a988d3, + 0xd08d034c, + 0x994f668a, + 0x302763d4, + 0x31274496, + 0x318331c3, + 0xd33dd419, + 0x51d14e36, + 0xd1d50274, + 0x4f1e0118, + 0xe87424c1, + 0x27055f40, + 0x8d05144d, + 0x3d2782d4, + 0x4d270484, + 0xd38d04c4, + 0x84d48d86, + 0x035f54b9, + 0x279a4fd6, + 0xa9d31d30, + 0xb9034a53, + 0x8d035454, + 0x50a988d3, + 0xd08d034c, + 0xa84fd68a, + 0xd4193027, + 0x4fc6d33d, + 0xff4ea7b2, + 0xd4d5dfff, + 0x54b90118, + 0x53d1036b, + 0x418302c8, + 0x43333483, + 0x52d143ab, + 0xd4c50278, + 0x542399a0, + 0x8380d089, + 0x36333f3c, + 0xd3c534ab, + 0x552499a0, + 0x4c831e07, + 0x0c4c333f, + 0x109b2047, + 0x120b34ab, + 0x277ede8d, + 0xe2030c2c, + 0xd3c54d07, + 0xc8d1c5a0, + 0xc5d0dec5, + 0x4d03ccd0, + 0x102701d8, + 0x41053207, + 0x44032123, + 0x4027f3b8, + 0xd0893127, + 0x0cd49d72, + 0x9d0dd39d, + 0x0cf00ed2, + 0x2701e41e, + 0x63de9942, + 0xf60fd49d, + 0xb901e2ef, + 0xa7035a54, + 0xb9450b30, + 0x27030042, + 0x60d29d41, + 0x24331287, + 0x9d62d49d, + 0x120b61d3, + 0x039012f1, + 0x4027ff00, + 0x9df0d2c5, + 0xd49deed4, + 0xade2e0ed, + 0xd0ded103, + 0x27402701, + 0x09d49d31, + 0xf00ad39d, + 0x07035008, + 0xc1010340, + 0x01e3d0d3, + 0x43032007, + 0x24033223, + 0x025ed4ad, + 0x0262d3ad, + 0x0264d2ad, + 0x0260d3ad, + 0x0356e2b9, + 0x0357e1b9, + 0x46234207, + 0x034e40e8, + 0x04073107, + 0x0f6b3623, + 0x035030e8, + 0x077f3c83, + 0x103c3340, + 0x43ab4833, + 0x373340ab, + 0x2ea343ab, + 0xa7020000, + 0xf3ffff3e, + 0x34451833, + 0x32c521ab, + 0xc8e4d148, + 0x004df802, + 0x2702dc10, + 0x094a522e, + 0xffff4ea7, + 0x54e3b9f3, + 0xf6423503, + 0x9901043f, + 0x1d2763d4, + 0x21270112, + 0x20274200, + 0xe3b92933, + 0xe4c10365, + 0x003ea340, + 0x32ab1080, + 0x4ef831ab, + 0xd5ffff00, + 0x504c2700, + 0x8d403ca3, + 0xe4b97ad4, + 0x13070367, + 0x00001fa3, + 0x4ff65400, + 0xe4b90096, + 0x4ff60194, + 0xe2d1008e, + 0x2dfc02d8, + 0x03500a00, + 0x4fff3ea7, + 0x7434c1fd, + 0x008840e8, + 0xffff3ea7, + 0x09d499f3, + 0x564c31c5, + 0xcd4e2745, + 0x34c535cb, + 0xc52f0b74, + 0xe4b95032, + 0x42d0036a, + 0xff2ea74a, + 0x4e27ebff, + 0xd5c0a49c, + 0xd5011824, + 0xd5011c24, + 0x27012024, + 0xa08c843e, + 0x012423d5, + 0x012823d5, + 0x012c23d5, + 0x08104e27, + 0x3024d504, + 0x3424d501, + 0x3824d501, + 0x203e2701, + 0x23d50810, + 0x23d5013c, + 0x23d50140, + 0xe4b90144, + 0x4ff60365, + 0xf0c30243, + 0x3ea7f58e, + 0xc1fd4fff, + 0xe2d17434, + 0x40ec02d8, + 0x34c1ff7c, + 0x004ef874, + 0xff720100, + 0x036ee4b9, + 0xab1f4c33, + 0xff665e14, + 0x8d404c27, + 0x2f5e7ad4, + 0x63d499ff, + 0x02734ff6, + 0x1d272027, + 0xff5e0112, + 0x63de99fe, + 0xe60fd19d, + 0xd1fe22ef, + 0xd101d0d6, + 0x8901d4d8, + 0x63d13461, + 0xf11502c4, + 0x035962b9, + 0xf2250807, + 0x59bef305, + 0x3127ff94, + 0xffff4ea7, + 0x4c43c5f7, + 0x4c034807, + 0x27202718, + 0x4205103c, + 0xf3c84403, + 0xe0270027, + 0x2711bc27, + 0x47f20141, + 0x074e3b1e, + 0x0b428b31, + 0xb94ea636, + 0x07030032, + 0x33328742, + 0xe0340b44, + 0x0278ff2c, + 0x039837f1, + 0x3007ff00, + 0x02c864d1, + 0x31039107, + 0xa0871007, + 0x180b980b, + 0x4ddcc387, + 0xf5240400, + 0x0a3f80a7, + 0x58129dff, + 0x2718909d, + 0x1000004e, + 0x3f80c4f5, + 0x939dff0a, + 0x0b40a719, + 0x9d020338, + 0xe1035834, + 0x0799fbf0, + 0x9d4f6b40, + 0x46b60a84, + 0x4ea78351, + 0xe5f7ffff, + 0x023f8043, + 0x3f8443e5, + 0xd4020302, + 0x2717200c, + 0x2e27203c, + 0x2b100000, + 0xf5408730, + 0x0a3f8042, + 0x980103ff, + 0x4540a7f3, + 0x07843584, + 0x8bebbe08, + 0x5a64b9fd, + 0xd4d2d103, + 0x63d39901, + 0x4499420b, + 0x6ad49d18, + 0x021732e0, + 0xfc4064c1, + 0xffff004e, + 0x2f2701ec, + 0x800082b0, + 0x01d0d4d1, + 0x02c843d1, + 0x01003d18, + 0x10002da3, + 0x4ea7f011, + 0x03f7ffff, + 0x63890f0c, + 0x15422534, + 0xc50473f0, + 0xf1218040, + 0x23366289, + 0x8443c531, + 0x0b8841c5, + 0x23f12512, + 0x8c41c511, + 0x43c53027, + 0xc52123a8, + 0x4335ac42, + 0x43c54345, + 0xff3ea734, + 0x34a1efff, + 0x00004fdc, + 0x071b4000, + 0x05412723, + 0x9b302724, + 0x00070ef3, + 0x2305ff8b, + 0x4fd824a1, + 0x40000000, + 0xd0d3d1e9, + 0x4034c101, + 0xff004efc, + 0x27014eff, + 0xff3ea72b, + 0x3225efff, + 0x34354027, + 0x8963de99, + 0x785e72d0, + 0xd22e27fc, + 0x255e0749, + 0x032007fd, + 0x8901e301, + 0x4007d0d3, + 0x48032703, + 0x0264d4ad, + 0x025ed2ad, + 0x0262d3ad, + 0x0260d3ad, + 0x0356e2b9, + 0x0357e1b9, + 0x46234207, + 0xfcb640ec, + 0x31074027, + 0x36230407, + 0x30ec0f6b, + 0x3027fcb4, + 0x07fcaf5e, + 0x0ef0c30d, + 0xef1a5ef5, + 0x036654b9, + 0x039412f1, + 0x450bff00, + 0x030041b9, + 0x07082b99, + 0x87343331, + 0xf1430b41, + 0x0003944c, + 0x9044f1ff, + 0x89ff0003, + 0xd4c52423, + 0x24c489f4, + 0xce992a81, + 0x61d19d08, + 0xd60c43c2, + 0xe9b1e0e4, + 0x9d422700, + 0xded162d4, + 0xc28101d0, + 0x42c2e491, + 0x2731271e, + 0xedd39d40, + 0x9deed49d, + 0xfa5eecd3, + 0x921d27fb, + 0xfc885e01, + 0x5e7424c1, + 0x4f6bfa77, + 0x4a2b242b, + 0x21234123, + 0xd39d3027, + 0xedd49dec, + 0x5eeed29d, + 0x1307fbd5, + 0x1fa34127, + 0x54400000, + 0x5e09d49d, + 0x24c1fca4, + 0x004ef874, + 0xfa560100, + 0x04744d27, + 0x2782d48d, + 0x2703f43d, + 0x8d04344d, + 0xd48d86d3, + 0xfaba5e84, + 0xf87424c1, + 0x0100004e, + 0x4d27fa9b, + 0xd48d0524, + 0x943d2782, + 0xd44d2704, + 0x86d38d04, + 0x5e84d48d, + 0xf353fa98, + 0x3701f970, + 0x99fd895e, + 0x32994234, + 0x83438341, + 0x33243323, + 0xa324ab48, + 0xfea35e2b, + 0x99416399, + 0x22274264, + 0x2783232b, + 0x47834213, + 0xa3142c33, + 0x0482b02f, + 0x174c3380, + 0xfd5e24ab, + 0x6664b9fd, + 0x99240b03, + 0xd29d1822, + 0xfdde5e6b, + 0xd49d4327, + 0xff185e62, + 0x000000e9, + 0x07d1f54e, + 0xf06301d0, + 0x6ea79007, + 0xa7ffffff, + 0xfeffffae, + 0xffff8ea7, + 0xff5ea7f3, + 0x64d1f7ff, + 0x4fe60e5c, + 0x0ea7017e, + 0x11fd7fff, + 0x104ca304, + 0x40270415, + 0x01d49cd1, + 0x4227741d, + 0xa499f405, + 0x48a3d109, + 0x07438301, + 0x87d433d4, + 0x07d42b44, + 0xb4be23bd, + 0x3ff6ffff, + 0xd3f100cb, + 0xff000054, + 0x6dd14027, + 0xc49d065c, + 0x42c10104, + 0x02d307d3, + 0xeed10713, + 0x07014e1d, + 0x07418341, + 0x33348724, + 0x0b320b27, + 0x33230734, + 0x53232b23, + 0x0bff6ffe, + 0x05e40124, + 0x942e23c1, + 0x3707fff9, + 0x24032001, + 0x34033005, + 0x64d1f4a8, + 0x411b0658, + 0x010c40e8, + 0xc49d4127, + 0x04c49904, + 0x00944ff6, + 0xeff6fe01, + 0x0907ff7e, + 0x557e1707, + 0x071707f8, + 0xed8e7e09, + 0x91be0907, + 0x9199ffb7, + 0xbe09070c, + 0xc1ffb607, + 0x44dc3484, + 0xc5482724, + 0x90d14054, + 0x442701d4, + 0x273884c5, + 0x69be141c, + 0x3027ff8f, + 0xc53883c5, + 0x84c14053, + 0xde44d834, + 0x01d490d1, + 0xff9037be, + 0xdfff0ea7, + 0xf80431fd, + 0x0301004d, + 0x9e0127ff, + 0xd1fdb7bd, + 0xc00148a4, + 0xa4d13241, + 0x42c00148, + 0x48a4d161, + 0x7e43e401, + 0x35a4b9ff, + 0x104cd81d, + 0xd5402771, + 0x990148a4, + 0x4fe604c4, + 0x0c07ff70, + 0x31be1707, + 0xf005ff90, + 0xf1ff635e, + 0x000054d4, + 0xe2c301ff, + 0xd100e243, + 0xca065c64, + 0x0ea7d434, + 0xbefff99f, + 0xf1fdb7d2, + 0x000054d2, + 0xd1c301ff, + 0xca065c64, + 0x23c2bc34, + 0xbe0527b9, + 0x1efd97b6, + 0x9b4027b1, + 0xf49b0bf4, + 0xbe09270e, + 0x5efd97a6, + 0x3ea7ff15, + 0x11fd7fff, + 0x104ce334, + 0x835e3415, + 0xbe0827fe, + 0x5efd978e, + 0x0d07fefd, + 0x1103012b, + 0x0545f0f0, + 0x04b499cd, + 0x63d145b6, + 0xa4d10e4c, + 0x34ca013c, + 0xe40cbe2a, + 0xa9b369fd, + 0xce010264, + 0xb4196234, + 0x41033027, + 0xf39bb41d, + 0xff4ea70e, + 0x0ea7fd4f, + 0xc5fff99f, + 0x04be3843, + 0x4127fdb7, + 0x0148a4d5, + 0x07feb05e, + 0x07418341, + 0x33348724, + 0x0b320b27, + 0x33230734, + 0x53232b23, + 0x0bfddffe, + 0x05e40124, + 0x942e23c1, + 0x3707fff9, + 0x24032e01, + 0x34033e05, + 0x64d1f4a8, + 0x411b0658, + 0xfe7240ec, + 0x25ff7d5e, + 0xa99c1ebd, + 0xa90144a3, + 0xee0142a4, + 0x27fe6443, + 0x48a4d542, + 0xfe5b5e01, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x0499fd4e, + 0x6c41c012, + 0x4e070e39, + 0xd42c4c23, + 0x34070f44, + 0x3e233333, + 0x01ebff7c, + 0xfc41dc34, + 0x43270219, + 0x33333207, + 0x120034f5, + 0x31f1ff02, + 0xff021000, + 0x1c33d247, + 0x1d1c5318, + 0x3d871616, + 0x00274227, + 0x120034f5, + 0xfd8eff02, + 0x25334e87, + 0x180423f1, + 0x0299ff02, + 0x0040f110, + 0x23ff0216, + 0x3b030b11, + 0x273d8712, + 0xf5010b42, + 0x02120034, + 0x27fd8eff, + 0x4efd8e00, + 0x834107fe, + 0x11039941, + 0x400b4487, + 0x4e61312b, + 0x8e803c1c, + 0x810191fe, + 0x87131902, + 0x05420b43, + 0x1d31034e, + 0x11049913, + 0x049d4103, + 0x4efe8e11, + 0xff4ea7fa, + 0x4b01fd4f, + 0xb433d007, + 0xa407bba3, + 0x4627dc01, + 0x33bec776, + 0xd401fcda, + 0x44963027, + 0xf39bdb05, + 0x38acc50e, + 0xb4ced401, + 0xe8fa8ee4, + 0x4ede1ef4, + 0x990421fb, + 0x41231003, + 0x0d99435b, + 0x6bc40711, + 0x2b3d07cf, + 0x1cb0073c, + 0xfb8e803c, + 0xffdf0ea7, + 0xcea93eff, + 0x4d0713cd, + 0xd4074103, + 0x0b07df6b, + 0x687e1d07, + 0xefdcceff, + 0xf49b4027, + 0xdf3ea70e, + 0x3405ffff, + 0xf94efb8e, + 0x0ea7d007, + 0x07ffffdf, + 0xa1c107b2, + 0x10da99d9, + 0x99ff727e, + 0x2b0710d0, + 0x2dbe1c07, + 0xb0070004, + 0xc9070b46, + 0x1c07ca5b, + 0x12230d07, + 0x27ff267e, + 0x0ef49b40, + 0xffdf3ea7, + 0x993405ff, + 0xd3a110d2, + 0x4127c183, + 0xcc87423b, + 0xcd0b340b, + 0xcb650d07, + 0x05bed3a5, + 0x0127fc90, + 0x4027f98e, + 0xa70ef49b, + 0xffffdf4e, + 0x4b050027, + 0x0000f98e, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00030002, + 0x00050004, + 0x00080006, + 0x000c000a, + 0x00140010, + 0x00200019, + 0x00320028, + 0x00500040, + 0x00800065, + 0x00cb00a1, + 0x01420100, + 0x02000196, + 0x032c0285, + 0x050a0400, + 0x08000659, + 0x0cb20a14, + 0x14281000, + 0x20001965, + 0x32cb2851, + 0x50a24000, + 0xfb4e6597, + 0xb107d007, + 0xf9f30ea7, + 0x071d07ff, + 0x99febec2, + 0x070636fb, + 0x072b071d, + 0xf30ea73c, + 0x43befff9, + 0x4027fbea, + 0x8e0ef49b, + 0x000000fb, + 0xf493fd4e, + 0xc1015c70, + 0x10078043, + 0x38031f6b, + 0xd30bd187, + 0x38230853, + 0x01102f9b, + 0x2b3e51d4, + 0x9dd40542, + 0x349908e1, + 0xff2ea712, + 0xe49dfd4f, + 0x4d344909, + 0x083499e4, + 0x23113169, + 0xe46d410b, + 0x07f6e305, + 0xf49b4027, + 0x8b00070e, + 0x274027ff, + 0x9de40530, + 0x2f9b08e3, + 0x0bd40110, + 0x8ed40542, + 0x734007fd, + 0xe8410342, + 0x4ee31ef4, + 0xb41cb9fb, + 0x07d10702, + 0xd8e307b2, + 0x43074cc1, + 0x44874183, + 0x4319420b, + 0x029612a9, + 0x22874039, + 0x11d13533, + 0x4e07029c, + 0x180030f5, + 0x429bff02, + 0x32f5410b, + 0xff021804, + 0x3e231027, + 0x35fde800, + 0x003e0331, + 0x34f5fde8, + 0xff021810, + 0x181432f5, + 0x3e23ff02, + 0x35fde7f0, + 0x4cc2d831, + 0x41834e07, + 0x4b0b4487, + 0xa9084399, + 0x990296d2, + 0x22470941, + 0xd4d13533, + 0x31f502a0, + 0xff021800, + 0x4e0be29b, + 0x180432f5, + 0x1027ff02, + 0xe8003e23, + 0x033135fd, + 0xfde8003e, + 0x181034f5, + 0x32f5ff02, + 0xff021814, + 0xe7f03e23, + 0x8e3135fd, + 0xb9fd4efb, + 0x0702b404, + 0xd8e207d1, + 0x42073941, + 0x44874183, + 0x4119410b, + 0x21074527, + 0x24f52333, + 0xff021200, + 0x100023f1, + 0x3dd8ff02, + 0x0714fc0a, + 0x27233321, + 0xf1f4e843, + 0x02100023, + 0x0a3ddcff, + 0x04b9f2fc, + 0x42d802b4, + 0x87e1832e, + 0x994d0b4e, + 0x45270842, + 0x24f52333, + 0xff021200, + 0x100023f1, + 0x3dd8ff02, + 0x2710fc0a, + 0xf1f4e843, + 0x02100023, + 0x0a3ddcff, + 0xfd8ef2fc, + 0x58f2f193, + 0xdb4ea701, + 0x4301fefd, + 0x10111201, + 0x3108322b, + 0x00a7fe0b, + 0xf74efb1e, + 0xd0070409, + 0x010541e2, + 0x21032107, + 0x00ff42ea, + 0x8174d4c1, + 0x70d3c1dc, + 0x0778dbc1, + 0x2b912b92, + 0x01399bc4, + 0xc2c30bb4, + 0x0e270ec4, + 0x7e01f40d, + 0xb401fe28, + 0xa7f44cca, + 0xfeffff3e, + 0x1cd834a9, + 0x34ad490b, + 0x31271cd8, + 0xcfff4ea7, + 0x7043c5fd, + 0x4fff2ea7, + 0x7424c1fd, + 0xe884d3c1, + 0xc100c940, + 0x4efc4034, + 0xabffff00, + 0x887c2700, + 0xf688d4c1, + 0xd100ab4f, + 0xa102743b, + 0xb1b40bd4, + 0xff3ea7dc, + 0xc103feff, + 0x1cd034d1, + 0x2b1fcc83, + 0x1f4c834c, + 0x071794ca, + 0x100e27a3, + 0xbd7e01f4, + 0xd0a4d1fd, + 0x834c2b1c, + 0x49c21f4c, + 0x819fa6ed, + 0x7faea7d1, + 0xcea7fde5, + 0x27fde53f, + 0xeea71c8c, + 0x07fde52f, + 0x8cd4c109, + 0xa405410b, + 0x2027a715, + 0xd4b1a235, + 0x3487cb05, + 0x432b4533, + 0xe7544e23, + 0x35c815fe, + 0x15e405c2, + 0xb1e235e8, + 0x70d3c1d4, + 0xd2a1d181, + 0x230b4103, + 0x4c83b30b, + 0xb5310b1f, + 0x85d2a5d4, + 0xf01307d3, + 0xd9c5bcf0, + 0x8ef78e30, + 0x5e2407f7, + 0xd4c1ff00, + 0xa87c2788, + 0xff594fe6, + 0xa18cdbc1, + 0x5eb40bd4, + 0x24c1ff57, + 0x004ef874, + 0xff310100, + 0x384034c1, + 0xffff004e, + 0x5eb87c27, + 0x7c27ff30, + 0xff2a5e98, + 0xd007fb4e, + 0x0ea7b107, + 0x07fff9f3, + 0xbec2071d, + 0x36fc8ce6, + 0x071d0706, + 0xa73c072b, + 0xfff9f30e, + 0xfc91d5be, + 0xf49b4027, + 0x00fb8e0e, + 0x00000040, + 0x04c1f54e, + 0x7403c170, + 0xbea74447, + 0x0bfeffff, + 0xd8bca934, + 0x8503951c, + 0x27037103, + 0x0304a510, + 0xe30409c2, + 0x0703b5f1, + 0x6c01c5d0, + 0xad3001c5, + 0x451cd8bc, + 0x7ef255f4, + 0x3ea7fe52, + 0xc1fdefff, + 0x4c33a034, + 0x1d4c5318, + 0x44cc4413, + 0x27230715, + 0xc1f3e833, + 0x4c33a024, + 0x1d4c5318, + 0x44c84413, + 0xff3ea7ef, + 0x34c1fdef, + 0x6a4dd8b4, + 0x23070ffc, + 0xf4e84327, + 0xdcb423c1, + 0xf5fc6a3d, + 0xb984d4c1, + 0x86035c43, + 0xff4ea736, + 0x43a9feff, + 0xd2c11cda, + 0xad320b30, + 0x271cda43, + 0x30d4c540, + 0x4ea73127, + 0xc5fdcfff, + 0x0d077043, + 0xdf7e1127, + 0x6cd3c1fd, + 0xefff2ea7, + 0xc53103fd, + 0x051e6cd3, + 0xf3e83327, + 0x33a024c1, + 0x4c53184c, + 0xc844131d, + 0x3ea7ef44, + 0xc1fdefff, + 0x4dd8b434, + 0x070ffc6a, + 0xe8432723, + 0xb423c1f4, + 0xfc6a3ddc, + 0x84d4c1f5, + 0x035c43b9, + 0x4ea73686, + 0xa9feffff, + 0xc11cda43, + 0x320b30d2, + 0x1cda43ad, + 0xd4c54027, + 0xa7312730, + 0xfdcfff4e, + 0x077043c5, + 0x7e12270d, + 0xd4c1fd72, + 0xb5f3936c, + 0x23070156, + 0x2c034103, + 0x6cd4c5df, + 0xe37f2ce3, + 0x34197f3c, + 0xc2803c03, + 0xf393f932, + 0x27015698, + 0x384c2720, + 0x34033205, + 0xfe51f4c8, + 0xfffdefe0, + 0x04c9ffff, + 0x12a72d07, + 0x15342c03, + 0x27f265f1, + 0xc1f31111, + 0x330380d2, + 0x43834307, + 0xf315c407, + 0xc6334333, + 0xf411c42b, + 0x56335107, + 0x23991333, + 0x2b432309, + 0x03f41551, + 0x05e970cf, + 0x705f0300, + 0xe60005e9, + 0x4904df3f, + 0x69c70d27, + 0x08249923, + 0x430bc809, + 0x2799c42d, + 0x9d380708, + 0xd9c10bc7, + 0x89a70784, + 0x47071692, + 0xa5333633, + 0xa40b4733, + 0xaf03232b, + 0x0005ea50, + 0x2c30db61, + 0x2dfe5341, + 0x29e201fe, + 0x189189c6, + 0x46334607, + 0xe703e207, + 0xe353142b, + 0x53411c30, + 0x01fe13f2, + 0x38949921, + 0x4423d051, + 0x2b07d341, + 0x022b243b, + 0x17033b2b, + 0x5380d2c1, + 0x0f0c8313, + 0xe1233783, + 0x0c333733, + 0x23e78310, + 0x3303ab11, + 0x991783eb, + 0x24990a23, + 0x330eab08, + 0x01ab141c, + 0x0da3430e, + 0xc4890440, + 0x83a10108, + 0x0b444747, + 0x34c4c541, + 0x4107d361, + 0x2307380b, + 0x2c834383, + 0x004fa30f, + 0x87a00000, + 0x87378322, + 0xab42ab33, + 0x2740ab43, + 0x15c45530, + 0x091e56c3, + 0xc23807d2, + 0x94c14a28, + 0xc24fe6d0, + 0x03480705, + 0x1a24e241, + 0x83130706, + 0xe6d37113, + 0x0b09026f, + 0x1f4c8343, + 0x31072407, + 0x25334487, + 0x13333533, + 0x312b242b, + 0xe9083f03, + 0x2e230005, + 0x27fee750, + 0x03210146, + 0x03310524, + 0xe6f4a834, + 0xa7056b8f, + 0xfd4fff1e, + 0xe87414c1, + 0x27054c40, + 0x6507643d, + 0x06a499c3, + 0x4fe64f4b, + 0xa40103b7, + 0x03b14ff6, + 0x3027c409, + 0x31274486, + 0x43073f6b, + 0xc49d41c3, + 0x2734f60a, + 0x0fc49d40, + 0xc4097656, + 0x4103d309, + 0xd4c13452, + 0xc541036c, + 0xd4c16cd4, + 0x5c43b984, + 0x843fe603, + 0x80d1c103, + 0x10291209, + 0x07ad02ee, + 0x43834207, + 0x4399410b, + 0x0b3f4b0d, + 0xf120c823, + 0x07ee02da, + 0x83320742, + 0x9d325343, + 0x134d0814, + 0x1ea7120d, + 0x21ebffff, + 0xcd41f814, + 0x0bc49906, + 0x00884ff6, + 0xe66cd4c1, + 0xa700814f, + 0xfdefff7e, + 0x33a074c1, + 0x4c53184c, + 0xcc44131d, + 0x33271844, + 0xeea7f3e8, + 0xc1fdefff, + 0x4c33a0e4, + 0x1d4c5318, + 0x44c84413, + 0xff1ea7ea, + 0x14c1fdef, + 0x6a4dd8b4, + 0x432712fc, + 0x2ea7f4e8, + 0xc1fdefff, + 0x3ddcb423, + 0xc1f0fc6a, + 0x43b984d4, + 0x3726035c, + 0xffff3ea7, + 0xda34a9fe, + 0x30d3c11c, + 0xffff7ea7, + 0xad430bfe, + 0x271cda74, + 0x30d4c540, + 0xeea74127, + 0xc5fdcfff, + 0xd1c170e4, + 0x7e0d076c, + 0x5451fabe, + 0x008c4fe6, + 0xa70b5399, + 0xebffff1e, + 0x25332307, + 0x14c13733, + 0x03230b50, + 0x05ea502f, + 0x5023c100, + 0x44874fab, + 0x24c5430b, + 0xff2ea750, + 0x13c1f3ff, + 0x3024c174, + 0x4d831127, + 0x430b03ff, + 0x21c55475, + 0x6022c130, + 0x32074207, + 0x38534553, + 0x83703c83, + 0x430b7c4c, + 0x0b7f2c83, + 0xa7548542, + 0xf3ffff3e, + 0x076432c1, + 0x53320742, + 0x83385345, + 0x4c83703c, + 0x83430b7c, + 0x420b7f2c, + 0x4ea75495, + 0xc5f3ffff, + 0x51a56041, + 0x5502f493, + 0x0b439901, + 0xc45153b5, + 0x02174fe6, + 0x4fff7ea7, + 0x7474c1fd, + 0x028440e8, + 0x4fff7ea7, + 0x7474c1fd, + 0x025d40e8, + 0xeea7c461, + 0xc5ebffff, + 0xc45144e4, + 0xffff1ea7, + 0x511445eb, + 0xe04fe654, + 0x84d4c100, + 0xe6d043c1, + 0x9900b93f, + 0x5e710b5b, + 0x8b073b07, + 0x85333333, + 0x4807832b, + 0x47c14d0b, + 0xc153b134, + 0x4ac1444c, + 0x91508140, + 0x3c49c151, + 0xe70b52a1, + 0x47c15609, + 0x0b3c0b38, + 0x0b070b2a, + 0x4443c519, + 0x3607da09, + 0xc5344ec5, + 0x41c53840, + 0x4042c53c, + 0x3a0a3b0b, + 0xd4713607, + 0x460b3383, + 0x071f4c83, + 0x87753374, + 0x07742b44, + 0x33453343, + 0x23432b33, + 0xfee7507e, + 0xe9084f03, + 0x37070005, + 0x4e012627, + 0x3e054403, + 0xf2a83403, + 0x53097231, + 0x230b2103, + 0x4807f361, + 0x7235430b, + 0x7e014641, + 0x70114901, + 0x71214a11, + 0x4b314c21, + 0xe90b7341, + 0x1c0b0a0b, + 0x360b2b0b, + 0x7e057345, + 0x71257015, + 0x7ea77235, + 0xa9feffff, + 0x031cd674, + 0xd674ad41, + 0xa741271c, + 0xfdcfffee, + 0x2770e4c5, + 0x11535530, + 0x151103f1, + 0x071383f1, + 0x33310741, + 0x2b363343, + 0x8432f134, + 0xe60005e9, + 0xa700862f, + 0xfdefff2e, + 0xc1ac24c1, + 0x4c338cd0, + 0x1d4c5318, + 0xd2914413, + 0x271843cc, + 0xa7f3e833, + 0xfdefff3e, + 0x33ac34c1, + 0x4c53184c, + 0xc844131d, + 0x7ea7ea43, + 0xc1fd4fff, + 0xd3c17474, + 0xf240e884, + 0x4034c100, + 0xff004efc, + 0x2700e2ff, + 0x020b884c, + 0xe54f2ea7, + 0x152005fd, + 0x35402724, + 0x08d39924, + 0xd2c1d491, + 0x0b310370, + 0x953f6b42, + 0x08d39dd4, + 0xa71533c4, + 0xfeffffee, + 0x1cdee4a9, + 0x41033227, + 0x1cdee4ad, + 0x5108d39d, + 0xeef311f2, + 0xa7fb4832, + 0xfdefff3e, + 0xdcac34c1, + 0xa7fae04c, + 0xebffff3e, + 0x42f83421, + 0x1ea7053c, + 0x99feffff, + 0x13a908d4, + 0xd2c11cde, + 0xad340b84, + 0x891cde13, + 0xf7411624, + 0xd261d141, + 0x4c03d071, + 0x73d3511f, + 0x0b170b45, + 0x0b444727, + 0x0bf74570, + 0x1f7c8334, + 0xd775f1c3, + 0xd355d145, + 0xf58ed265, + 0xbf5ec355, + 0xff2ea7fc, + 0x2445ebff, + 0x27fe0e5e, + 0x0ac49d40, + 0xc1fc635e, + 0xc39980d1, + 0x0a14990b, + 0xfc7643ee, + 0xffff7ea7, + 0xda74a9fe, + 0xad41031c, + 0xc11cda74, + 0x412780d1, + 0xcfffeea7, + 0x70e4c5fd, + 0x27fc575e, + 0x1f5ea84c, + 0x7474c1ff, + 0x00004ef8, + 0xc1ff0801, + 0x4ef84034, + 0x62ffff00, + 0xb84c2702, + 0xc1ff055e, + 0x4ef87474, + 0x9d010000, + 0xa7c461fd, + 0xebffffee, + 0x0fff4d83, + 0x5e44e4c5, + 0x74c1fd96, + 0x004ef874, + 0xfd760100, + 0x2784dec1, + 0xe499282c, + 0x27411845, + 0xd803292d, + 0x42071a42, + 0x2ce342a3, + 0xab4f6bff, + 0x83320724, + 0xa3e3003d, + 0x6b1c003d, + 0x0723ab2f, + 0xab4f6b42, + 0x5364072f, + 0x07618328, + 0x202ca394, + 0x990dc899, + 0x64c641ea, + 0x029921fc, + 0xf3053027, + 0x42834907, + 0xeb99f435, + 0x4b4ff642, + 0x27302701, + 0x25702700, + 0x07f131f3, + 0x1cec33e6, + 0xefa31506, + 0x20000000, + 0xa3109c18, + 0x000000ef, + 0x83490740, + 0x1127204c, + 0x10274496, + 0x4c334107, + 0x0f98f814, + 0x004ea301, + 0xb4072000, + 0xbea32fab, + 0x38034000, + 0xabf40121, + 0x212458e4, + 0x0e4c33f4, + 0x1207e4ab, + 0x96101c83, + 0x33f32114, + 0x28180c3c, + 0x1fe6b7ab, + 0x1007017f, + 0x33111c33, + 0x0ea3170c, + 0x83080000, + 0x0000001f, + 0xab0bab7c, + 0xff7ea713, + 0x74c1ebff, + 0x1340cc4c, + 0x071a2c27, + 0xa7f3e832, + 0xebffff3e, + 0xc84c34c1, + 0x4ea7f240, + 0xa3ebffff, + 0x0000001f, + 0x4c4ec580, + 0x0fff1de3, + 0xc54441c5, + 0x695e7c40, + 0x7414c1fc, + 0x00004ef8, + 0x99faae01, + 0xc29d0bd2, + 0xfaa55e0d, + 0xd4716726, + 0x45333487, + 0x44f9432b, + 0xff0118ac, + 0x0965d49d, + 0x803ff6c3, + 0xaf1ea7fa, + 0x1301fef5, + 0xee90d4c1, + 0xc1023334, + 0x448794d4, + 0x0a5840f9, + 0x41e9ff01, + 0xff010a5a, + 0xa790d3c1, + 0xfef5af2e, + 0xd3c53103, + 0xc1231590, + 0x410394d4, + 0xd4c54183, + 0x84d4c194, + 0x42c13127, + 0xff4ea7d0, + 0x43c5fdcf, + 0xa6d14d68, + 0x0bd09d24, + 0xeea7d449, + 0xc5ebffff, + 0x245e70e4, + 0x5e4807fa, + 0x4ea3f9e5, + 0x5e400000, + 0x24f8fef2, + 0xe19900ae, + 0x473a0758, + 0x331f4b4a, + 0x0b342b33, + 0x470b0718, + 0x2b03334b, + 0x08042b13, + 0x1c273a1c, + 0x13300739, + 0x12410730, + 0x28430731, + 0x4ce81e4c, + 0x23018d2c, + 0x0b300746, + 0x7830e834, + 0x6b030702, + 0x55b0f20f, + 0x99402701, + 0x444709d3, + 0x97d441e9, + 0x31e00001, + 0x31f40247, + 0x41070150, + 0x43333107, + 0x430b3633, + 0x4447410b, + 0x73804c03, + 0x254fab48, + 0x9480eaf4, + 0x03480701, + 0x402b144c, + 0x44474f6b, + 0x8e0047e9, + 0x2cdc0004, + 0xf3212d10, + 0x2e5e0707, + 0x984c27fe, + 0x07fca55e, + 0x111c3317, + 0x1f830707, + 0x7c000000, + 0xab170c33, + 0x5e13ab0b, + 0x7027fe85, + 0x2cd8f725, + 0xe399d510, + 0x4b4a4759, + 0x2ba3333f, + 0x07380ba4, + 0x334b471b, + 0x2b3a2b13, + 0x3a3c0814, + 0x07393c27, + 0x13310743, + 0x07341230, + 0x1e4c2843, + 0xe62c4ce8, + 0x07462300, + 0xe8340b31, + 0x0701cb30, + 0xf20f6b03, + 0x270096b0, + 0x09d39940, + 0x41e94447, + 0x000197d4, + 0x012131e0, + 0x009531f4, + 0x31074107, + 0x36334333, + 0x410b430b, + 0x4c034447, + 0x07487380, + 0xea3fab34, + 0x0300ee80, + 0x802b148c, + 0x4f6b4807, + 0x40e94447, + 0x00048e00, + 0xd2fd845e, + 0x402755a8, + 0x4709d399, + 0xd441e944, + 0xe0000197, + 0xd4010a31, + 0x41076231, + 0x43333107, + 0x430b3633, + 0x4447410b, + 0x73804c03, + 0x054fab48, + 0xfd3e5ef4, + 0x2ea74127, + 0x35ebffff, + 0x7e0b2724, + 0x3ea7f2cc, + 0x27ebffff, + 0x21343540, + 0x1a31fc33, + 0x07e21ef9, + 0x5e4b0b40, + 0x4807ff69, + 0xa91e4a0b, + 0x4b0b4007, + 0xe0feaa5e, + 0x2700e432, + 0xff7d5e30, + 0x00c532e0, + 0xf7257027, + 0xe0fec05e, + 0x27008a32, + 0x5ef10510, + 0x4487fcec, + 0x97c844f1, + 0x6e5e0001, + 0xf14487fe, + 0x0197c844, + 0xff155e00, + 0xcfff3ea7, + 0x4c32c1fd, + 0xcfffeea7, + 0xa34207fd, + 0xc5302748, + 0xf39b4ce4, + 0x8b00070e, + 0x4ce2c5ff, + 0xa76ce3c5, + 0xfef5af1e, + 0xd4c11201, + 0xd124ce90, + 0x2bfd9e5e, + 0x144c2708, + 0x4f6b402b, + 0x2bfe6d5e, + 0x144c2708, + 0x4f6b402b, + 0x27ff135e, + 0x09149d40, + 0x07f8715e, + 0x87353331, + 0x0b430b41, + 0x03448741, + 0x4873804c, + 0x3fab3407, + 0x99fee65e, + 0x4fe610e4, + 0x31070083, + 0x35334187, + 0x310b342b, + 0x432b4387, + 0x07ff095e, + 0x33418731, + 0x0b430b35, + 0x03448741, + 0x4873804c, + 0xf4054fab, + 0x99fc3b5e, + 0x4d6610e4, + 0x41873107, + 0x342b3533, + 0x4387310b, + 0xe35e432b, + 0x10e499fd, + 0x31074b46, + 0x35334187, + 0x310b342b, + 0x432b4387, + 0x07fe7f5e, + 0x33418731, + 0x0b430b35, + 0x03448741, + 0x4873804c, + 0xf4254fab, + 0x27fdc05e, + 0xfd875e30, + 0x345e3027, + 0x5ef125fe, + 0x3107fdb1, + 0x05fe5e5e, + 0xfbde5ef1, + 0x4227c307, + 0x0b27c435, + 0x27f16f7e, + 0x21c43540, + 0xb332fcc3, + 0x07ec1efa, + 0x33453341, + 0x03412b13, + 0x05e9084f, + 0x27202700, + 0x03420536, + 0xf6f3c844, + 0x5ef7168f, + 0x0000fc7c, + 0x00006407, + 0x00006408, + 0xf293f54e, + 0xa3014da4, + 0xc52e19f6, + 0xf1c548f0, + 0x8405c14c, + 0x06c5efe6, + 0xc148f0c1, + 0x04294cf2, + 0x02ce42e2, + 0xf3c53247, + 0x980c0360, + 0xfa933103, + 0x27014ce2, + 0xa7202770, + 0xffffff6e, + 0xc55cf0c5, + 0x5c1e64f3, + 0x71be0c07, + 0xd4c1ffee, + 0x60d3c15c, + 0xd4c5402b, + 0x8803ea58, + 0xad402700, + 0x07187e64, + 0x513bbe09, + 0x44d4c100, + 0x6140d3c1, + 0xea430bd2, + 0xb9061042, + 0xfc02b454, + 0x2700cf43, + 0x93a41d41, + 0x014d27f3, + 0x71033e19, + 0x00ebe7f2, + 0x0348f4c1, + 0x4329a0ac, + 0x074cf4c1, + 0xe2470b27, + 0x07025334, + 0x334207d2, + 0x0b4733d5, + 0x50df03d4, + 0x070005ea, + 0x03cd079d, + 0xcc030c9c, + 0x99402754, + 0xd49d66d3, + 0x813fc69c, + 0x6dbe0c07, + 0x0c07fc7f, + 0xffedebbe, + 0xc15cd4c1, + 0x402b60d3, + 0xe258d4c5, + 0xbeff7c30, + 0xe6fc7ff9, + 0x2701b60f, + 0x7e64a922, + 0x884df418, + 0xd1060613, + 0x0702bc51, + 0xeee0be0c, + 0x5a0ff6ff, + 0xff0ea7ff, + 0x0499feff, + 0x87438309, + 0x2b443324, + 0x5043f942, + 0xe4ff0000, + 0x99018d32, + 0xd4c164d2, + 0x7cd1c15c, + 0x4183425b, + 0x323b3127, + 0x52d14487, + 0x310b028c, + 0x42c54d0b, + 0x7cd3c56c, + 0x053a1ff6, + 0xd49d4127, + 0xff135e9c, + 0xc148f0c1, + 0xf3c15cf2, + 0x7e150760, + 0xf3c1f04f, + 0x48f0c164, + 0x075cf2c1, + 0xf0417e15, + 0xa41d4127, + 0x4c3ef393, + 0x033e1901, + 0x197efa71, + 0x91fd93ff, + 0x4027014b, + 0x9d09d49d, + 0xd49d04d4, + 0x08d49d07, + 0x0179e1ec, + 0xf0c12027, + 0x4cf1c148, + 0x93f2bf7e, + 0x014c0ff0, + 0x4fe60419, + 0xf2c10194, + 0x9d402748, + 0x23290ad4, + 0xe24cf4c1, + 0x47018334, + 0x54f0c504, + 0x4bf8f293, + 0x40f2c501, + 0xc148f0c1, + 0x302754f2, + 0x0c03af07, + 0x07210398, + 0x44f3c574, + 0xac034027, + 0x50f0c540, + 0x0758f2c5, + 0x33b533b4, + 0x03b40b47, + 0x05ea50bf, + 0x0bb49900, + 0xf40d6b07, + 0x034253a9, + 0x035cbdc1, + 0x4027546c, + 0xf4150607, + 0xb9c1f32d, + 0xecaebe68, + 0x58bec1ff, + 0x2b64b499, + 0x073d07d0, + 0x5b0d072e, + 0x2b245b34, + 0x68b1c10e, + 0x021a23ee, + 0x43873183, + 0xcd074b0b, + 0x48c1c18b, + 0x830c2b6c, + 0x0b428721, + 0x6c43c14b, + 0xfc55f035, + 0x310b1e8b, + 0xc150b2c1, + 0xf32540b4, + 0x42eaf845, + 0xb4c101b4, + 0x95f2a538, + 0x48b099f4, + 0x40273027, + 0xb53cf09d, + 0x3df49df3, + 0x0130f3c5, + 0x072333b2, + 0x0334013f, + 0x8024f534, + 0xceff1400, + 0x3d07f4a3, + 0x07403c03, + 0xe24dcb43, + 0x0700ad49, + 0xe6498b43, + 0x0700a54f, + 0xb9d91ed3, + 0x86187d64, + 0x5e23274d, + 0x0ea7fe45, + 0xbeffffdf, + 0x07fc9725, + 0x4e06be09, + 0xdf0ea700, + 0xf3beffff, + 0x64a9fc96, + 0xf253187e, + 0x4103fd34, + 0x64ad2001, + 0x4827187e, + 0xcfff2ea7, + 0x4c24c5fd, + 0x27ee5f7e, + 0xff3ea740, + 0x34c5fdcf, + 0x6c34c54c, + 0x27fdd05e, + 0xfdfb5e20, + 0x4a16fd93, + 0x9d402701, + 0xd49d09d4, + 0x07d49d04, + 0x0708d49d, + 0x0bf3931e, + 0x2027014a, + 0x03fce1e8, + 0x3c033419, + 0xc14526a0, + 0x040948f0, + 0xf178240b, + 0xc148f0c1, + 0x2d7e4cf1, + 0x7df093f1, + 0x0419014a, + 0xfe704ff6, + 0xf6830027, + 0xb499f58e, + 0x5b3d0764, + 0x87318334, + 0x66b29933, + 0x38c13b0b, + 0x3822e06c, + 0xbe060702, + 0x99ffec3f, + 0x42e01eb4, + 0xb49900eb, + 0x684fd69c, + 0x027c54d1, + 0x340b3787, + 0x890b9d8b, + 0x40273805, + 0xd10ef49b, + 0x0702bc52, + 0x0f4c8342, + 0x43f94333, + 0xff000083, + 0x0e230407, + 0xf6ffff7e, + 0xa702cd3f, + 0xffffff3e, + 0x159034d1, + 0x242b7103, + 0x47072183, + 0x46332247, + 0x159c24ed, + 0x3127ff00, + 0xffff4ea7, + 0x6843bdff, + 0x0f429906, + 0xf49b4027, + 0x8741270e, + 0x4024f522, + 0xb9ff02b0, + 0xdc02b454, + 0xf2c15743, + 0xd1f09344, + 0x21030149, + 0xf2c50419, + 0x5142f244, + 0x48f4c1ff, + 0xc140f0c1, + 0x432944f2, + 0x274cf7c1, + 0x03041d40, + 0x720ba00c, + 0x0740f0c5, + 0xdc73ea42, + 0xff2e5efd, + 0xa538b3c1, + 0x2bf395f4, + 0x48b49924, + 0x9d30f2c5, + 0xb0c13cf4, + 0x99f0b53c, + 0xf29d49b2, + 0xfe495e3d, + 0xc150f1c1, + 0x050754f2, + 0xc1ee1c7e, + 0xf2c150f1, + 0x7e050758, + 0x931eee11, + 0x8027c027, + 0x99fdf25e, + 0x25270cb3, + 0x32f53333, + 0xff021200, + 0x330cb499, + 0x0043f143, + 0xd8ff0210, + 0x18fc0a3d, + 0x640c0d27, + 0x99eccf7e, + 0x43330cb4, + 0x100043f1, + 0x3ddcff02, + 0xc1eafc0a, + 0xb3c140b1, + 0x48b29950, + 0x0749bc99, + 0x07130241, + 0xc843e213, + 0x27602701, + 0xc5e20740, + 0xef4b50b4, + 0xc130e0c8, + 0x4e874cb0, + 0x43c1400b, + 0x7442d154, + 0x8b310b01, + 0x9441c132, + 0x0b5443c5, + 0xee40270e, + 0xbd01b113, + 0xc1015404, + 0x32274cb4, + 0xe3bde40b, + 0xec070164, + 0xe0c8ef4b, + 0xc168c632, + 0x4e874cb0, + 0x43c1400b, + 0x7442d154, + 0x8b360b01, + 0x9441c132, + 0x0b5443c5, + 0xee40270e, + 0xbd017e13, + 0xc1015404, + 0x32274cb4, + 0xe3bde40b, + 0xb0990164, + 0x2710a70c, + 0x0db29930, + 0x9d49b19d, + 0x412748b1, + 0xb49d1007, + 0x40b3c51e, + 0x3344b3c5, + 0xf5442713, + 0x02120014, + 0x072287ff, + 0x0023f501, + 0x03ff0216, + 0x89432704, + 0x04f50eb2, + 0xff021200, + 0xc538b3c5, + 0x04f13cb3, + 0xff021000, + 0x07f848dc, + 0x274a0342, + 0x0f4c8334, + 0x03f52653, + 0xff021200, + 0x27142c33, + 0x104c3330, + 0x13f542ab, + 0xff021400, + 0x140414f5, + 0xf39bff02, + 0xfde05e0e, + 0x640c0d27, + 0x07ebb37e, + 0x5cbcc106, + 0xffe92bbe, + 0x2754b499, + 0xf5433335, + 0x02120043, + 0x54b299ff, + 0x22474327, + 0x12872103, + 0x120014f5, + 0x1ef1ff02, + 0xff021000, + 0xec33c02b, + 0x1dec5318, + 0x00abefe6, + 0x23f12433, + 0xff021804, + 0x0764b499, + 0x3b21232e, + 0x27230b24, + 0x0014f542, + 0xc1ff0212, + 0x14f15cb3, + 0xff021000, + 0x07f848dc, + 0xce422b43, + 0xb29993c4, + 0x55b39954, + 0x02074127, + 0xc566b49d, + 0x03335cbc, + 0x04f54427, + 0xff021200, + 0x40273387, + 0x34f52007, + 0xff021600, + 0x43272403, + 0xf556b189, + 0x02120024, + 0x0024f1ff, + 0xdcff0210, + 0x4107f848, + 0x34274a03, + 0x530f4c83, + 0x0023f516, + 0x33ff0212, + 0x3027141c, + 0xab104c33, + 0x0003f541, + 0xf5ff0214, + 0x02140404, + 0x0ef39bff, + 0x07fcfc5e, + 0x5e612b63, + 0x68befe37, + 0x52d1fc96, + 0x2c5e02bc, + 0x5e2027fd, + 0x4127ff67, + 0x27fe4e5e, + 0xfe815e41, + 0xb9be0c07, + 0xc15efc79, + 0x7a57befa, + 0x6c0fd6fc, + 0x187d64b9, + 0x27784fc6, + 0xbc51d123, + 0xbe090702, + 0x07004c60, + 0xd40ff680, + 0xff3ea7f9, + 0x3499feff, + 0x87438309, + 0x2b443324, + 0x5043f942, + 0xc0ff0000, + 0x0ea75632, + 0xbeffffdf, + 0x07fc9311, + 0x49f2be09, + 0xdf0ea700, + 0xdfbeffff, + 0xf453fc92, + 0x4001f928, + 0x93fbf55e, + 0x01462bfd, + 0x20274027, + 0x9d09d49d, + 0xd49d04d4, + 0x08d49d07, + 0x27fa9d5e, + 0xbe9b1e22, + 0x27fc79e1, + 0x27049621, + 0x5e224720, + 0x2027f9ef, + 0x1127881e, + 0xc1fc035e, + 0x5cd14cd1, + 0x1b99028c, + 0x99412741, + 0x4b3b4013, + 0xc4960127, + 0x23870027, + 0x4123210b, + 0x0047e307, + 0xe103310b, + 0x017424d5, + 0x34bd4027, + 0x30bd0154, + 0x1e9d0164, + 0x9428c540, + 0x05423b9d, + 0x5428c52c, + 0x4abe0907, + 0x4127004a, + 0x5e9cd49d, + 0xf84ef917, + 0x07840dc1, + 0xeb5e7eb0, + 0x016400e8, + 0xdd033d07, + 0x2d0703a3, + 0xe37f3ce3, + 0xdd237f2c, + 0x341903a3, + 0xc2803c03, + 0x3007f932, + 0x40873733, + 0x400b430b, + 0x33333407, + 0x300b342b, + 0x23e91c27, + 0xfeeda03e, + 0x21074d07, + 0x11233001, + 0x34034005, + 0xf2984403, + 0x4406f393, + 0x11340101, + 0x03410332, + 0x15340521, + 0xec412332, + 0x0100fe21, + 0xdb4ea733, + 0x4325fefd, + 0xd2a9d329, + 0x41270346, + 0xb3c1232b, + 0xff0ea784, + 0x04c5fdcf, + 0x12318968, + 0xb2c52123, + 0x39349988, + 0x3189b10d, + 0x19b12d14, + 0x961183d1, + 0x89461315, + 0x243b1433, + 0x295423ca, + 0xc13027b2, + 0xb39d88b4, + 0x47320708, + 0x93312344, + 0x0144eff8, + 0x009934ee, + 0xb49d4027, + 0x68d3b964, + 0x9d202703, + 0xd4b968b3, + 0xddb9036c, + 0xb49d0340, + 0x9d4b0767, + 0x4c030b8d, + 0x05362734, + 0xc8440342, + 0x030b07f3, + 0x30274c0c, + 0x03054627, + 0xf4c80403, + 0xa207f88e, + 0x44aaf893, + 0xab402701, + 0x93c007af, + 0x014543f9, + 0x9d66849d, + 0x1b1e1e81, + 0xa98094c1, + 0x2702bcd2, + 0x12428d38, + 0x7e4cc3c5, + 0x4027e8b4, + 0xc54cc4c5, + 0x1d076cc4, + 0x0b072a07, + 0x002957be, + 0x47234007, + 0x64000d03, + 0x29d242d0, + 0xc13027b2, + 0xb39d88b4, + 0x47320708, + 0xee312344, + 0xf8ff6b43, + 0x27ff6721, + 0x64b49d41, + 0x03ff645e, + 0x05422b42, + 0x5e311534, + 0x0ea7fefb, + 0xbeffffdf, + 0x93fc90fd, + 0x014483f3, + 0xc027a307, + 0x9948ac23, + 0x03071234, + 0x34c14566, + 0xbe4f4640, + 0x030047c8, + 0xc43a07c1, + 0x0ea7eac2, + 0xbeffffdf, + 0x27fc90ae, + 0x0bf49b40, + 0xa70ef49b, + 0xfdcfffae, + 0xffff9ea7, + 0xc54827fe, + 0x32274ca4, + 0x1d3393bd, + 0xfc9bc027, + 0xc541270e, + 0x052760a4, + 0x27e80b7e, + 0x3394bd40, + 0x0efc9b1d, + 0xc54cacc5, + 0x857e6cac, + 0xd200c8e9, + 0x51fe275e, + 0x07312134, + 0xeb140b03, + 0x7d96be14, + 0x009d1efc, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x1ea7f74e, + 0xa9feffff, + 0x071cd814, + 0xad420380, + 0x071cd814, + 0x069307b2, + 0x0bd3470f, + 0x27c107d3, + 0xff7ea7a0, + 0x091efdcf, + 0xfa0d0d27, + 0xffc053be, + 0x4dcab401, + 0xd8c3a9f4, + 0x0320271c, + 0xd8c3ad31, + 0xdac4a91c, + 0xad41031c, + 0xa91cdac4, + 0x031cdec3, + 0xdec3ad31, + 0xd6c4a91c, + 0xad41031c, + 0x9b1cd6c4, + 0x41270ef2, + 0x037074c5, + 0x0b8a2ea1, + 0x8ec21ed9, + 0xc1fc4ef7, + 0xc007840e, + 0xe4b9e239, + 0x2123035c, + 0x070f2c83, + 0x33353332, + 0x09230b23, + 0x50e3a900, + 0x23c14103, + 0xfffef42e, + 0x41ff677e, + 0x71c309c4, + 0x0b4103c2, + 0xe3320b43, + 0x1f3c8341, + 0xc445c375, + 0xfa4efc8e, + 0x0099d007, + 0x07a10712, + 0x071407b2, + 0x510f7623, + 0x99dc21d4, + 0xc40b10d3, + 0xd195d285, + 0x3bcec4eb, + 0xdf0ea735, + 0x3ebeffff, + 0x1c07fc68, + 0x4dbe0d07, + 0x0ea7fc55, + 0xbeffffdf, + 0x27fc680a, + 0x233b3b31, + 0xebc30b31, + 0x5b4c07c3, + 0x9d41234b, + 0xdb9d11d4, + 0xa5d35510, + 0x15d4a1dc, + 0xcedc25dc, + 0x0d070f4c, + 0xfc4e67be, + 0xfa8e0127, + 0xfa8e0127, + 0x0d07f251, + 0xfbbe1a07, + 0x4127ffbd, + 0x40270496, + 0xfa8e0407, + 0xf393f54e, + 0x930117c8, + 0x011c5efe, + 0x6007f063, + 0x2faba107, + 0xe37f3ce3, + 0x34197fec, + 0xc2803c03, + 0x64c1f93e, + 0x99632984, + 0x322b0c44, + 0xb909649d, + 0x9d0354a4, + 0x31080a64, + 0xc3073127, + 0xf593cf6b, + 0x1d011b7c, + 0xc141275c, + 0x649d8462, + 0x5023a90c, + 0xff1ea703, + 0x63c5fd4f, + 0x7414c170, + 0x025540e8, + 0xe87414c1, + 0x27025840, + 0x64c51c4c, + 0x5fa4b974, + 0xa745e603, + 0xfeffff4e, + 0x014143b9, + 0x01fd3ff6, + 0x0274a4d1, + 0xd18c64c5, + 0x8302bcad, + 0xd3330fdc, + 0xff84de23, + 0x4e57beff, + 0xcb0fe6fc, + 0xe6822701, + 0x070086cf, + 0x9374037d, + 0x011a8bf9, + 0x061ed027, + 0x4dd25419, + 0xd4a4d173, + 0x05cd0702, + 0xd0a4d194, + 0xc5c53302, + 0x4d074894, + 0xc40b4733, + 0x02bca1d1, + 0x0288a2b9, + 0x0280a3d1, + 0x47070c07, + 0xeaa40f03, + 0xf8050005, + 0x03fe997e, + 0x05ea5ccf, + 0xbca1d100, + 0x89a2b902, + 0x07b00702, + 0xbe0c0738, + 0x8b002106, + 0x03d1030b, + 0x0fd6a09c, + 0xdf0ea7a8, + 0xd6beffff, + 0x0c07fc66, + 0x001db7be, + 0xffdf0ea7, + 0x66a4beff, + 0x430727fc, + 0xc1f58ef0, + 0xf2938463, + 0x990119f0, + 0xeea7f634, + 0x9debffff, + 0x649d6564, + 0x05249d0b, + 0x249d4027, + 0x78add106, + 0x5cd39902, + 0x8343d499, + 0x99418331, + 0x4c3342d2, + 0x9938331a, + 0x34ab08db, + 0x3fa32183, + 0xa0050078, + 0x271b2c33, + 0x07bff641, + 0x3332ab01, + 0x34ab194c, + 0xd499e305, + 0x3ed3993d, + 0x833fd299, + 0x3c830f4c, + 0x9938330f, + 0xdc9940d0, + 0xab443334, + 0x3cd19943, + 0x330f2c83, + 0x4ea30c2c, + 0x83c00005, + 0x3c070f0c, + 0x0c3342ab, + 0x35d29910, + 0x33231383, + 0x1c3340ab, + 0xab338314, + 0x1c3c3341, + 0x43ab2323, + 0xab1e2c33, + 0xe0e41542, + 0xb900f6c6, + 0x27035ca4, + 0x41e0230c, + 0x4ff600f6, + 0x1c270101, + 0x3cd4c140, + 0xff004ef8, + 0xa700a2ff, + 0xfd4fff3e, + 0x277434c1, + 0xa240e82a, + 0x3b422700, + 0x9b41034c, + 0x3f4c0342, + 0x21074653, + 0x4c8320ab, + 0x042ea33f, + 0x48330400, + 0xb4a624ab, + 0xb9102ca3, + 0xa702b4a4, + 0xebffff1e, + 0x3c333407, + 0x33418316, + 0x3e83164c, + 0xab800000, + 0xc532ab34, + 0x62995c13, + 0x6540270b, + 0x0c2c2364, + 0x009c20e8, + 0x32074207, + 0x4d834533, + 0x3c831f00, + 0xab2573f0, + 0xab278334, + 0x43002732, + 0x7013c5f0, + 0x4ea7f58e, + 0xb9ffffff, + 0xe6187d43, + 0x5e832736, + 0x4027fe2b, + 0xa7fef85e, + 0xdfffff4e, + 0x5e8c64c5, + 0x8027fe03, + 0xa7fe165e, + 0xfd4fff3e, + 0x277434c1, + 0x6240ec28, + 0x7434c1ff, + 0x00004ef8, + 0x27ff5801, + 0x034c3b42, + 0x03429b41, + 0x4653bf4c, + 0xc1ff555e, + 0x14c17414, + 0xac40ec74, + 0x7414c1fd, + 0xb9fda65e, + 0x27035ca4, + 0x41e42b0c, + 0xa4d1ff0e, + 0x445c02c8, + 0x80800da3, + 0x065e1027, + 0x5e1027ff, + 0x2027ff01, + 0x00ff635e, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x0ac1f54e, + 0x99500740, + 0x42f040a4, + 0xa8b900bf, + 0x8fe601b4, + 0x9a0700cf, + 0x2027ba07, + 0x6ea77027, + 0x07ffffff, + 0xb9c20bca, + 0xd80164c4, + 0x94b93342, + 0xb1c10154, + 0x94b0c154, + 0x016493b9, + 0x0174bed1, + 0x43074536, + 0x42c04383, + 0x87102727, + 0x7c6db932, + 0xd13a0b18, + 0xf6017434, + 0x030081df, + 0x2114ce41, + 0x21032707, + 0x9103b403, + 0x28da7207, + 0x07f58eb7, + 0x5001c240, + 0x312b3007, + 0x13074027, + 0xcc1e140b, + 0x0742c199, + 0x0bc7870a, + 0xbe21270c, + 0x99fc3567, + 0x412340a4, + 0xc140a49d, + 0x40274053, + 0xa299c30b, + 0xd5370b40, + 0xbd0174cd, + 0x9d015434, + 0xcd05423d, + 0xc554cdc5, + 0x3dbd94cd, + 0x2fc60164, + 0xb4a8b9b1, + 0x079e1e01, + 0x2b31033e, + 0xa7b01e31, + 0xffffff4e, + 0x187c43b9, + 0xff383ff6, + 0x34c1f58e, + 0x5434c594, + 0x8eff7f5e, + 0x31f64ef5, + 0x3804c106, + 0x1b3403c1, + 0xee700746, + 0xc1012734, + 0x94b94009, + 0x4c0601b4, + 0x3027e407, + 0xc387d027, + 0x490b4c07, + 0xc19441c1, + 0x390b544b, + 0x8d07a107, + 0x30b9ab2b, + 0x44d10164, + 0x8f6b0174, + 0x015432b9, + 0x00e91be2, + 0xd1031027, + 0x43834007, + 0x24b63d07, + 0xf00d42c0, + 0x0027c9fe, + 0x749d4227, + 0x07f68e12, + 0xca410b4a, + 0xc90bee46, + 0x6ae2c201, + 0x060700cc, + 0x0fe60a2b, + 0x1ff600d8, + 0xd02700cb, + 0xe0270027, + 0x7419ade6, + 0x7ac57339, + 0x3c789d34, + 0x2b0b4533, + 0x180043f5, + 0x72b5ff02, + 0x18044af5, + 0x1027ff02, + 0xe8004e23, + 0x034135fd, + 0xfde8004e, + 0x181042f5, + 0x4af5ff02, + 0xff021814, + 0x4e233807, + 0x4bfde7f0, + 0x0b41353f, + 0x6434b939, + 0xbd41a301, + 0xe6016434, + 0x1900820f, + 0xc5733974, + 0x7d9d3870, + 0xf545333d, + 0x02180043, + 0x307ec5ff, + 0x180440f5, + 0x71c1ff02, + 0x23202740, + 0xfde8004e, + 0x4e034235, + 0xf5fde800, + 0x0218104e, + 0x1440f5ff, + 0x07ff0218, + 0xf04e233d, + 0x3f4bfde7, + 0x310b4235, + 0x016434b9, + 0x41a30127, + 0x016434bd, + 0x749d4227, + 0x07f68e12, + 0x2ba103a4, + 0xff145eab, + 0xf68e0127, + 0xd027a607, + 0xe0270027, + 0x07ff3f5e, + 0x07df6bd8, + 0xff365ee2, + 0xe027d027, + 0x27ff2f5e, + 0xff025e01, + 0xc007f94e, + 0x6340c4c1, + 0xdf0ea7f0, + 0x9207ffff, + 0xf405a107, + 0xff9c52be, + 0x23032f07, + 0x2ce33f07, + 0x7f3ce37f, + 0x3c033419, + 0xf932c280, + 0xb940c3c1, + 0xe601b431, + 0x6434b916, + 0xb642f801, + 0x27230700, + 0x07310701, + 0xf0010310, + 0xbc277ef3, + 0x99f001ff, + 0x04b94003, + 0x43e201b4, + 0x4b07008a, + 0x4fc04f4b, + 0xffffffff, + 0x410d997e, + 0x29071a07, + 0xbdbe0d07, + 0xa007ffa0, + 0xc16c0fc6, + 0x1b0740ce, + 0x1f6b2e07, + 0x4027210b, + 0x24bd3227, + 0x23bd0154, + 0x2d9d0164, + 0x27f00142, + 0x40039941, + 0x11874d3b, + 0x20271e0b, + 0x31034123, + 0xd540039d, + 0x05017414, + 0x9412c51a, + 0x075412c5, + 0xfdef7e0c, + 0xffdf0ea7, + 0x45f8beff, + 0x430127fc, + 0xb9f98ef0, + 0x03016524, + 0x7442fc21, + 0x07f001ff, + 0x400399b1, + 0x01b404b9, + 0x34eabf6b, + 0x0ea7ff7a, + 0xbeffffdf, + 0x27fc45ce, + 0x8ef04300, + 0x5eb027f9, + 0xfb4eff59, + 0x07120e99, + 0x07c107d0, + 0x562f6bb3, + 0xa740a7ee, + 0xffe93b3e, + 0x9d4003c5, + 0x0ea53d04, + 0xb5340ec5, + 0x3c049d0e, + 0xc5380ec5, + 0x0ec5300e, + 0xa70e2544, + 0xffffff3e, + 0x170534b9, + 0x32bd2402, + 0x6e7e1705, + 0x070676fd, + 0x071c070d, + 0xfebe7e2b, + 0x06664127, + 0xfb8e0407, + 0x567e0d07, + 0x8e0127fd, + 0x8e0127fb, + 0x074027fb, + 0x00fb8e04, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x02020100, + 0x03030303, + 0x04040404, + 0x04040404, + 0x05050505, + 0x05050505, + 0x05050505, + 0x05050505, + 0x06060606, + 0x06060606, + 0x06060606, + 0x06060606, + 0x06060606, + 0x06060606, + 0x06060606, + 0x06060606, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x4ea7fc4e, + 0xa9feffff, + 0x891cd843, + 0x0ec1d204, + 0x8b342bb0, + 0x1431c83f, + 0xc2b401c1, + 0x02890e1e, + 0x8d4103ac, + 0xe20bd204, + 0xc558f3f0, + 0x4ea7b00e, + 0xc1fdefff, + 0x44c1e801, + 0x45e1c2b8, + 0x53184c33, + 0x44d41d4c, + 0x2bd4273c, + 0x1fcea7d4, + 0x04c1fde5, + 0x1841c2ec, + 0xa9c404c1, + 0x0b010203, + 0xa9430b41, + 0x05010402, + 0x27c215c4, + 0x89c43540, + 0x0389f804, + 0x0b4103ac, + 0xf8048d13, + 0x02e801c5, + 0xcffdf0e1, + 0x1ec2fc8e, + 0xd20489a7, + 0xfc4e981e, + 0x016404b9, + 0x23980389, + 0x07345b44, + 0x2331c2d0, + 0x89fc0489, + 0x410bf803, + 0xcfabc407, + 0x3f8b3c2b, + 0x071031cc, + 0xff4e7e0d, + 0x2bf8d489, + 0xc84f8b4c, + 0xfc8ef241, + 0x08a9f64e, + 0xd0070100, + 0x9807810b, + 0x7ea79fab, + 0xadfdefff, + 0xa7010009, + 0xfde4efae, + 0x99c47cc1, + 0xcc33fed3, + 0x1dcc5318, + 0xd4893c2b, + 0x0b34e6fa, + 0xfad48d43, + 0x3c0b3407, + 0x4fab4307, + 0xd45c49ce, + 0xe30749c4, + 0x31034807, + 0xb407432b, + 0x0427bfab, + 0x0c2bb30b, + 0xc1f0d1c1, + 0xc103f4d4, + 0xc11841c2, + 0xd3a9c8d4, + 0x410b0102, + 0xd2a9430b, + 0xa4050104, + 0x4027a215, + 0xd389a435, + 0x0be103ac, + 0xc54e0731, + 0x4fabf0d3, + 0xf014bece, + 0x491bcbf0, + 0xabfedc9d, + 0x0a45d04f, + 0xf4e84327, + 0xdc9d831e, + 0xff3ea7fe, + 0x34a9feff, + 0xd2991cde, + 0x166407d0, + 0xd434a926, + 0x2b36071c, + 0x003d1c34, + 0x89640780, + 0x4607fad3, + 0x4d1c432b, + 0x63078000, + 0xffff1ea7, + 0xd613a9fe, + 0x2b49071c, + 0x284f8b43, + 0xab930741, + 0xe82ff69f, + 0xff4ea700, + 0x4cc1fdef, + 0xddd499cc, + 0x5318cc33, + 0x4c2b1dcc, + 0xf6d8d289, + 0x0700af4f, + 0x073c0b32, + 0xce4fab43, + 0xc4d46449, + 0x03e30761, + 0x270e07e1, + 0xa70fab14, + 0xfde4dfae, + 0xa71c8c27, + 0xfde4cfbe, + 0x00007f27, + 0x1c2b4000, + 0x4c834307, + 0x3334871f, + 0xc1432b45, + 0x4e23c0d2, + 0xc1fee754, + 0xa405ccd3, + 0x320bc103, + 0x4027a815, + 0xb305a435, + 0xd489b815, + 0x0bb735ac, + 0xc0d4c542, + 0x3e072007, + 0xe1032103, + 0x0207094e, + 0xf1f00fab, + 0xdddc9dc0, + 0xced4d289, + 0xdc893526, + 0x2f2cced8, + 0x89b8d1c1, + 0xd0c1acde, + 0xffbea7e4, + 0x2103d07f, + 0xd4993207, + 0x0b3fabdf, + 0x8623071e, + 0x05b10544, + 0xce360e01, + 0xd38de9c3, + 0xb8d1c5d4, + 0xf68ef68e, + 0x4207240b, + 0x1cdc12ad, + 0xd51f4c83, + 0x8d1cd014, + 0x3127d8d2, + 0xcfff4ea7, + 0x6c43c5fd, + 0x89ff365e, + 0x39ced8d3, + 0x07130743, + 0x2b310349, + 0x0b4fab43, + 0xc0d2c143, + 0x2bacd389, + 0xc5230b41, + 0x1103c0d2, + 0x4ea7f4b0, + 0xadfeffff, + 0x831cdc49, + 0x41d51f1c, + 0xd98d1cd0, + 0x9b4027d8, + 0x31270ef4, + 0xcfff4ea7, + 0x6c43c5fd, + 0x07ff5f5e, + 0x4ed81e19, + 0xd40389fd, + 0x010004a9, + 0x34ced007, + 0x270d0716, + 0xfdda7e10, + 0xf4e84327, + 0xa9d4d389, + 0xce0100d4, + 0xd4b9ec43, + 0xd3890164, + 0x89442398, + 0xd189dad2, + 0x3ed0a9fc, + 0xc1345b01, + 0x130be4de, + 0x30a7200b, + 0x8dd0d499, + 0xd18ddad2, + 0x86e305fc, + 0x8ee31544, + 0x07fc4efd, + 0x27d007c1, + 0x35f09310, + 0x8d7e00aa, + 0x93cf6bfd, + 0x00ab33f0, + 0xa600ad7e, + 0xff2ea7c7, + 0x23a9feff, + 0x24a90142, + 0x34ce0144, + 0xbd302778, + 0x271d3423, + 0x0ef49b40, + 0x1f6b1d07, + 0x0f030187, + 0x0005f590, + 0x3f9bd853, + 0x93040110, + 0x00a9f3f2, + 0x432b2e51, + 0xe19d0405, + 0x12249908, + 0x4fff3ea7, + 0x09e49dfd, + 0xe44d2449, + 0x69082499, + 0x0b321121, + 0x05e46d41, + 0x27dcf6e2, + 0x0ef49b40, + 0xff8b0007, + 0x40272027, + 0x0508e49d, + 0x103f9be2, + 0x430b0401, + 0xc6060405, + 0xffff3ea7, + 0x3432bdfe, + 0x9b40271d, + 0xfc8e0ef4, + 0x23bd3227, + 0x40271d34, + 0x270ef49b, + 0xff4ea731, + 0x43c5fdcf, + 0xff7e5e60, + 0x42734d07, + 0xf4e84103, + 0xf54ebb1e, + 0x631d0499, + 0xe66007f0, + 0x9902534f, + 0x4fe62304, + 0x40270252, + 0xa71d649d, + 0xfeffff2e, + 0x021424b9, + 0x014423a9, + 0x4f4b432b, + 0x071c41cc, + 0x150e27c2, + 0x102703e8, + 0xb9ff047e, + 0xa90214c4, + 0x2b0144c3, + 0xc84f4b43, + 0x6c99e841, + 0xff3ea71f, + 0xc123ffff, + 0x010834b9, + 0xee0fcc83, + 0x070319c4, + 0x334c073c, + 0x0b333345, + 0x89202734, + 0x32f51864, + 0xff000110, + 0x010c32f5, + 0x3ea7ff00, + 0xd6ffffff, + 0x34b9634f, + 0x4ce00101, + 0xb902d1ff, + 0x05010134, + 0x27f201f4, + 0x4207113c, + 0x46337287, + 0x7e23740b, + 0x07fff23c, + 0x05202747, + 0xc8440342, + 0x056231f3, + 0x27634172, + 0x99737520, + 0x4c831f64, + 0x3334070f, + 0x0b453333, + 0xec3e2334, + 0x4627fffe, + 0x34033205, + 0x4ea7f4c8, + 0x01fd4fff, + 0x33722143, + 0x23ab103c, + 0x121e7225, + 0x010134b9, + 0xf4057487, + 0x740b4633, + 0xf23c7e23, + 0xff4ea7ff, + 0x4c81fd4f, + 0xffffeea7, + 0xd14091fe, + 0xd10130e3, + 0x330128e4, + 0x310333c3, + 0x1b715172, + 0x0b301b4c, + 0xd5130b24, + 0xd50128ec, + 0x350130e0, + 0x51715572, + 0x9374a163, + 0x00a84ff2, + 0x74a5430b, + 0x04e025b9, + 0x450770b1, + 0x45333587, + 0xc407432b, + 0xe93cce23, + 0xcc48f1fe, + 0xf1ff0116, + 0x0116c449, + 0xc84af1ff, + 0xc1ff0116, + 0x72c13071, + 0x3874c134, + 0x73c1cb31, + 0x0bce413c, + 0x0b3e0b4b, + 0x0b1a0b09, + 0x3c73c528, + 0x71c570b5, + 0x3472c530, + 0x993874c5, + 0x36271f64, + 0x070f4c83, + 0x33d333d4, + 0x23d40b45, + 0xfffef4de, + 0x48034d07, + 0xc403c101, + 0x44034105, + 0x6431f3a8, + 0x870f4c83, + 0x0b443334, + 0xf932f934, + 0xe6ff0013, + 0x8900c72f, + 0x0ca61860, + 0x211f6499, + 0x834123dc, + 0x34070f4c, + 0x45333333, + 0x2307340b, + 0xfef42e23, + 0x1439f1ff, + 0x61ff0001, + 0x31d03128, + 0x41d1412a, + 0x51d3512b, + 0x0bd4612e, + 0x0b0a0bc9, + 0x0b3e0b1b, + 0x25d46548, + 0x45d035dc, + 0x07d355d1, + 0x83410345, + 0x71f39343, + 0x34bd00a7, + 0xaea704e0, + 0x01fd4fff, + 0x277d21a3, + 0xab433b41, + 0x1a6399d4, + 0x3ff67d25, + 0x648900a1, + 0x21629918, + 0x991e6399, + 0x41032261, + 0x3b1f6099, + 0xffeea742, + 0x412bfeff, + 0xe2a93833, + 0x4c330144, + 0xab30ab10, + 0xff4ea734, + 0x2103ffff, + 0x010843d5, + 0x0144e2ad, + 0xf0430127, + 0x3ea7f58e, + 0xd1fddfff, + 0xe601c034, + 0xd100d94f, + 0x5101a833, + 0x55430b04, + 0xfd985e04, + 0xffff4ea7, + 0x8041d1ff, + 0x03310718, + 0x0702871d, + 0x7f3ce321, + 0x237f2ce3, + 0x1902871d, + 0x803c0334, + 0x99f932c2, + 0xd22124d4, + 0x43f14487, + 0x000198ec, + 0x9b186089, + 0x0b408732, + 0xc5385341, + 0xd2218843, + 0xfefc2fe6, + 0xf75e1015, + 0x277401fe, + 0xe000005f, + 0x0f4c833f, + 0x44333487, + 0x30f1340b, + 0xff0013fc, + 0x14003ce9, + 0x85beff00, + 0xb0070014, + 0x50be0c07, + 0x10070012, + 0x0dbe0b07, + 0x80be0010, + 0x4027000e, + 0x3507b007, + 0x0b072407, + 0x1dbec107, + 0x4007001f, + 0x51070407, + 0x000c31be, + 0x9940709d, + 0x43074073, + 0x4c104f6b, + 0x333c2734, + 0x0140739d, + 0x33f101a4, + 0xd4ab144c, + 0x06077d25, + 0xfbd553be, + 0x4ea730a7, + 0xbdffffff, + 0x5e010143, + 0x0027fee2, + 0xf58ef043, + 0xe8070e27, + 0x7e102703, + 0x0ea7fbe5, + 0xbefff24b, + 0x05fc6782, + 0xe900c8f0, + 0x4ea7f101, + 0xbdffffff, + 0x5e010141, + 0xd307fd1d, + 0x64060d27, + 0xbe7e1027, + 0x08d4b9fb, + 0xd84cee01, + 0x4eee1efc, + 0xa7c007f8, + 0xfddfffbe, + 0x93108c27, + 0x00a5e3fd, + 0xa70c9c27, + 0xfd4fffae, + 0xb8c5471e, + 0x102f9b30, + 0x5138d4c1, + 0xc5422bd3, + 0x399d38d4, + 0x12d49908, + 0x4909349d, + 0x4da111d4, + 0x08d49934, + 0x3105d269, + 0x346d420b, + 0xf49b4027, + 0x8b00070e, + 0x08349dff, + 0x4f9b3005, + 0x38d3c110, + 0x0b30b0c5, + 0x38d4c543, + 0x137e0c07, + 0xb30fc6fc, + 0xfc4ef88e, + 0xcfffcea7, + 0x104c27fd, + 0x6b50c4c5, + 0xfb377e1f, + 0xc4c54027, + 0x70c4c550, + 0xfb4efc8e, + 0xffff2ea7, + 0xda24a9fe, + 0xda03891c, + 0x432bd007, + 0xc1074fab, + 0x071d14ca, + 0x271027b2, + 0xc33e160c, + 0xe17e0d07, + 0xdab4a9f7, + 0xdad3891c, + 0x4fab432b, + 0x8ee74cc2, + 0xa7fd4efb, + 0xe7ffff3e, + 0x41d83421, + 0xa730270c, + 0xe7ffff4e, + 0xfd8e4335, + 0x4127d307, + 0x0b27d435, + 0xd27e1027, + 0xdcd421fa, + 0xef1ee441, + 0x1e99fb4e, + 0x0bc10723, + 0x891401e3, + 0x118920cd, + 0x83be071e, + 0xab120bb3, + 0xf6d30bb4, + 0xf60091ef, + 0x8900fadf, + 0x34079804, + 0x012f1fe6, + 0x014414ee, + 0x2e9a0489, + 0x24c4994d, + 0xbda34218, + 0x04b98000, + 0x03a90165, + 0x44230140, + 0x3de2343b, + 0xdfe60117, + 0x04a9011a, + 0x03a90534, + 0x41030160, + 0x4df241e3, + 0x4307009d, + 0x730f4c03, + 0xe3410344, + 0x8641ea41, + 0xab210700, + 0x3321032f, + 0x6200a924, + 0x4932c201, + 0x3d07c027, + 0x31033fab, + 0x30ca3433, + 0xa803ee57, + 0x23430700, + 0x6e04ce48, + 0x00004f27, + 0xcbab1000, + 0x327ec4ab, + 0xff4ea7ff, + 0x4c45e7ff, + 0xe3e4fb8e, + 0x04a9ff73, + 0x4fe6012e, + 0x1fe6ff6b, + 0x0489009a, + 0x00bda398, + 0xff665e10, + 0x076423ce, + 0xce482342, + 0x3d077c34, + 0x31033fab, + 0xcf273433, + 0x04000000, + 0x27ab03c2, + 0xabcbab40, + 0xfeeb7ec4, + 0xffff4ea7, + 0x8e4c45e7, + 0x6404b9fb, + 0x7646e401, + 0x00bea3ff, + 0x6e5e8000, + 0x004f27ff, + 0xab200000, + 0x7ec4abcb, + 0x4ea7fec5, + 0x45e7ffff, + 0x89fb8e4c, + 0x34079804, + 0xff0614ee, + 0x0800bda3, + 0xff021ff6, + 0xcf272c1e, + 0x0c000000, + 0x27ff4d5e, + 0x0000004f, + 0xabcbab30, + 0xfe937ec4, + 0xffff4ea7, + 0x8e4c45e7, + 0x00cf27fb, + 0x5e080000, + 0x0389ff2e, + 0x00bea398, + 0x43070100, + 0xa3fecb5e, + 0x5e4400bd, + 0xbea3fee6, + 0x5e040000, + 0xbea3fee2, + 0x5e024000, + 0xf94efeb8, + 0x07241499, + 0x07a007d1, + 0xc0c30792, + 0x43c04542, + 0x2d41c02b, + 0x6d7eb907, + 0x07b103fe, + 0x070a073c, + 0x7e2b071d, + 0xc103fe60, + 0x0a072907, + 0x3c071d07, + 0x07fe537e, + 0x071d070a, + 0x0e3c072b, + 0xfe465ef9, + 0x07fe437e, + 0x070a073c, + 0x0329071d, + 0x5ef90e31, + 0x317efe34, + 0x072907fe, + 0x031d070a, + 0x0e3c0721, + 0xfe225ef9, + 0x1499fc4e, + 0x07d10724, + 0x4d42c0c0, + 0xc04143c0, + 0x20272a41, + 0x833e3027, + 0x1d070c07, + 0x30272227, + 0x07ff797e, + 0x271d070c, + 0x7e322720, + 0x0c07ff6e, + 0x22271d07, + 0xfc0e3227, + 0x27ff615e, + 0x7e302720, + 0x0c07ff5a, + 0x20271d07, + 0xfc0e3227, + 0x27ff4d5e, + 0x0e302720, + 0xff445efc, + 0x30272027, + 0x07ff3d7e, + 0x271d070c, + 0x0e302722, + 0xff305efc, + 0xf323f64e, + 0x070c2c27, + 0x273f07d0, + 0x05420710, + 0x03212331, + 0x07f4b834, + 0x15f2256d, + 0x008d27f2, + 0xff7ea720, + 0x6d03e7ff, + 0xd1990108, + 0xb9db6908, + 0xb90164d3, + 0x490165d4, + 0x23b10bd0, + 0x07342344, + 0x072b0790, + 0x3b243bc1, + 0x27933bc4, + 0x20f28d40, + 0x9d22f19d, + 0xf08d24f4, + 0x1ef98d1c, + 0x0523fc9d, + 0x40daa9f8, + 0x71cfd601, + 0xca98d489, + 0xabe26494, + 0x412700fd, + 0x9924f49d, + 0x4fc623f4, + 0x22f3997a, + 0x4e0ad499, + 0x1ef38943, + 0xea98d489, + 0x7e00bd34, + 0xf401fcf9, + 0x20004dfc, + 0x402700c4, + 0xd4b97445, + 0x4fd60125, + 0x29d20968, + 0x6d12ced1, + 0x43834207, + 0x43994d0b, + 0x0b3f4b0d, + 0xf120c823, + 0x07ee12da, + 0x83420732, + 0x4d425333, + 0x08d39dd4, + 0x5b5ed20d, + 0x071007ff, + 0xfc7c7e0d, + 0xc298d489, + 0xba2a9149, + 0x04e4d4d1, + 0xc766413c, + 0x278dbaca, + 0x24f49d42, + 0xd623f499, + 0xf189884f, + 0x7e0d071c, + 0x7e5ef4e6, + 0x7e0d07ff, + 0xbaeaf454, + 0xe01eff6f, + 0x337e0607, + 0x29d209f8, + 0x9521ced1, + 0xc4274027, + 0xffffbea7, + 0x09d49de7, + 0x27fc647e, + 0xb0b44540, + 0xfc5b7efc, + 0xf87e0d07, + 0xd8d4d1f6, + 0x98d38904, + 0x430b4103, + 0xf30341e3, + 0x04d8d4d5, + 0x0d07f68e, + 0xc97e1127, + 0xfc377ef4, + 0x4df8f401, + 0xff402000, + 0x04f4d4d1, + 0x1f070d07, + 0x30272027, + 0x335ef48b, + 0x9d4327ff, + 0x045e24f4, + 0x000000ff, + 0x000000e9, + 0xb007f54e, + 0x2ea71b07, + 0x23ffffff, + 0x03a007f1, + 0x0301901d, + 0xd1012c0d, + 0x350e5c24, + 0x03f115f0, + 0xa70108ad, + 0xe7ffff5e, + 0x05164fe6, + 0x5fff3ea7, + 0x933411fd, + 0x00a103f2, + 0x15104ca3, + 0xdb1ea734, + 0x2301fefd, + 0x22111401, + 0x41e8432b, + 0x20e80516, + 0x32070518, + 0x37334287, + 0x420b430b, + 0x33333407, + 0x320b342b, + 0x0196f213, + 0x23f23121, + 0xfeeda03e, + 0x30014107, + 0x20051123, + 0x24033403, + 0xf293f498, + 0x0100a0b8, + 0x03231124, + 0x05310341, + 0x23231524, + 0x6731ec41, + 0xa1f39306, + 0x340100a0, + 0xfddb0ea7, + 0xa90415fe, + 0xa90472b3, + 0x27012eb2, + 0xff1ea741, + 0x14c5fdcf, + 0x23322b68, + 0x88b4b931, + 0xd4b3ad04, + 0x96302704, + 0xb9312744, + 0xbd012cb4, + 0xf804f8b3, + 0xd1056241, + 0xa903e8bc, + 0xb904d4b8, + 0xb90490b4, + 0x070485b3, + 0xf6643b68, + 0xb904f13f, + 0xa90165b0, + 0x270140bd, + 0xd804f090, + 0x07042304, + 0x03e05be6, + 0x3eb2a904, + 0x23102701, + 0x27230b21, + 0x9d402731, + 0x3ea709b3, + 0x9dfee2db, + 0xb10d0cb1, + 0xb49db14d, + 0x12bc8d08, + 0xbe6db355, + 0xb1b92287, + 0x04f0048f, + 0x49070489, + 0x30074d0b, + 0x4e2b3423, + 0x3b0bb39d, + 0x07410243, + 0x07435b41, + 0x07212334, + 0x87412343, + 0x2b230b03, + 0x9db22d03, + 0x01030ab4, + 0x41e81407, + 0x2307058d, + 0x3b072123, + 0x349d42a7, + 0xb031030d, + 0xcdf293f2, + 0x1b0b009f, + 0x04f824b9, + 0xf60d109d, + 0xa701904f, + 0x53b5ff3c, + 0x53c540a7, + 0xc554b530, + 0x46273054, + 0x53b530a7, + 0xb03053c5, + 0xfd1ca7f4, + 0x51c551b5, + 0xc553b530, + 0x36273053, + 0x54b540a7, + 0xb03054c5, + 0xf9b3b9f3, + 0xe6f32504, + 0xe8043d3f, + 0x07043961, + 0x05412346, + 0xf4b4d1f4, + 0x004df803, + 0xb9043501, + 0x0104d0b4, + 0x24b0d1f3, + 0x07347b05, + 0x07230713, + 0x83128343, + 0x47718721, + 0x33448322, + 0x0b720b43, + 0x9b37e374, + 0x0b743330, + 0x28bdd173, + 0x8fb3b905, + 0xb0b4b904, + 0x03d39b04, + 0x4f4b7fdc, + 0xe67fdce3, + 0xd104134f, + 0xd104acb9, + 0x0e0520b4, + 0x20b9d549, + 0x91f19305, + 0x1c010033, + 0x04a8b1d1, + 0x0cbe0c07, + 0x8d07001c, + 0xc103809b, + 0x337af293, + 0x8fb3b900, + 0x05890b04, + 0x34b4a92c, + 0x2b030705, + 0x07341246, + 0x2eb4a904, + 0x214fe601, + 0xd1b2b904, + 0x27e02704, + 0x4f6fe640, + 0x86302704, + 0x0b6ff6e5, + 0xe6f12102, + 0x2702051f, + 0x83225310, + 0xab24ab27, + 0xffdea723, + 0x21abfddf, + 0x01a8b4a9, + 0x01d4d2d5, + 0x4d83d025, + 0x45368000, + 0x013cb4b9, + 0xd1674fc6, + 0xd803f4b4, + 0x2501004d, + 0x04d0b4b9, + 0xf0011827, + 0x5fbe143b, + 0x4427001b, + 0x0530b3d1, + 0x01d8d4d5, + 0x052cb2d1, + 0x830b309b, + 0x01bcd2d5, + 0x2586f221, + 0x64864127, + 0xd4d54027, + 0xb4b90198, + 0x4f4b04b0, + 0x03fb4fe6, + 0x013bb4b9, + 0x04a4b3d1, + 0x0520b2d1, + 0x3123342b, + 0x830b329b, + 0x019cd8d5, + 0xdfff4ea7, + 0xac47d5fd, + 0x27402701, + 0xe8b4d530, + 0xf0b3ad04, + 0x2db3b904, + 0x7cb0a901, + 0x23430704, + 0x0f4c8341, + 0x2307e407, + 0x3533e533, + 0x23334333, + 0x013eb1a9, + 0x4e0b230b, + 0xe027109b, + 0xfef42e23, + 0xf44e23ff, + 0x3047fffe, + 0x048bbcb9, + 0xc5e4b2c5, + 0xb38de0b4, + 0xb4b1c5ae, + 0x8ddfbe9d, + 0xbe9dacb0, + 0x3ccfe6de, + 0xff4ea702, + 0x43b9feff, + 0x3fe60141, + 0xb4a9022f, + 0x3ea7012e, + 0xa9dfffff, + 0xc50472b2, + 0xb3c5c8b3, + 0xee4103c4, + 0xb9036d24, + 0x38012cb4, + 0x9d412744, + 0xb089dfb4, + 0xb4b2c1ac, + 0xb1893047, + 0xc5230bd2, + 0xb3c5f0b3, + 0xc0b3c5b8, + 0xc5b0b3c5, + 0xb3c1e8b3, + 0x271203c8, + 0x87beb940, + 0xbcb4c504, + 0x8db4b2c5, + 0xb3c5d2b1, + 0xe1eff6cc, + 0xd1302701, + 0x9d01fcb4, + 0x45c6d0b3, + 0x02f5efe6, + 0x012eb4a9, + 0x02f541e0, + 0x9d5ef193, + 0xf814b900, + 0x98b28904, + 0x0164b3b9, + 0x026b4fe6, + 0x20273027, + 0xc5f4b2c5, + 0x0b07ecb3, + 0x93efdb7e, + 0x009d3bf2, + 0x04f824b9, + 0x02474fe6, + 0x0164b4b9, + 0x013eb3a9, + 0x343b4423, + 0x1e98b38d, + 0x070b0742, + 0xf0407e1c, + 0x2e0ab499, + 0x3eb4a9d4, + 0x4fc4ca01, + 0x8f7e0a07, + 0x29b209f3, + 0x5612ceb1, + 0x43834207, + 0x43994b0b, + 0x0b3f4b0d, + 0xf120c823, + 0x07ee12da, + 0x83420732, + 0x4d425333, + 0x08b39db4, + 0xbd99b20d, + 0xd6bc4908, + 0xb4a9bfdf, + 0x4cc2013e, + 0x070b07b1, + 0xf7607e1c, + 0x1e27a81e, + 0x5e020000, + 0x1127fdf9, + 0x157e0b07, + 0x7e0a07f0, + 0xb209f33a, + 0x21ceb129, + 0x9d4027ac, + 0x0b0709b4, + 0xd1f2127e, + 0x8904d8b4, + 0x410398b3, + 0x41e3430b, + 0x04d8b4d5, + 0x9c7e0a07, + 0xbd4127f6, + 0xd10125b4, + 0x110108b3, + 0x122c27f4, + 0x44034001, + 0x34033005, + 0xb2d1f2a8, + 0xb3d103e8, + 0xb0b903f8, + 0xb2d5048a, + 0xb3d50114, + 0xb2b90118, + 0xb0bd04d0, + 0xb1a90126, + 0xb3b904d4, + 0xb0b90490, + 0xb4a9012d, + 0xb2bd012e, + 0xb1ad0128, + 0xb3bd0120, + 0xb0bd0129, + 0x20270127, + 0x21274496, + 0xb998b489, + 0xbd048fb3, + 0x9b0122b2, + 0xf8b2b943, + 0xd5443304, + 0xb9011cb4, + 0xbd04f9b1, + 0xa7012bb2, + 0xffffff2e, + 0x0e5c24d1, + 0x012ab1bd, + 0xfaee4ff6, + 0x5fff0ea7, + 0x930411fd, + 0x009beff2, + 0x15104ce3, + 0xdb1ea704, + 0x2301fefd, + 0x22111401, + 0x41ec432b, + 0x20a7faee, + 0xfaec20ec, + 0xe47e0a07, + 0x9b4027f5, + 0xf49b0bf4, + 0xec051e0e, + 0x27fad920, + 0x7e112705, + 0x3ea7f63a, + 0x93fefddb, + 0x009baff0, + 0x03013401, + 0x432b0211, + 0xa7e141cc, + 0xd1dd1e20, + 0xc503a0b4, + 0xb4c5c8b4, + 0xfdec5ec4, + 0x012eb4a9, + 0x44863027, + 0x31c33127, + 0x145e3183, + 0x2b4427fe, + 0x3b3d0740, + 0x9d3e2b14, + 0x31e20bb4, + 0x3107fb81, + 0x27fb7c5e, + 0x07402b44, + 0x5ee43be6, + 0xb0b9fb29, + 0xbda90165, + 0x04230140, + 0x403b4d07, + 0x239ab389, + 0xe2040341, + 0x2700d334, + 0x5e312791, + 0xb4d1fafd, + 0xf60503f4, + 0x01004dfc, + 0xb3b9fbcf, + 0xbdd1048f, + 0xb4b90528, + 0xb7d104b0, + 0xf0010524, + 0xdc03d39b, + 0x9b4f4b7f, + 0x7fdce370, + 0xfbf14ff6, + 0x0520b4d1, + 0x840b8d9b, + 0x07fc185e, + 0xf5197e0a, + 0x9b06f293, + 0xf824b900, + 0xa14ff604, + 0xbe0b0700, + 0xd1fbcac9, + 0x8d03e8bc, + 0x845e12bc, + 0x7e0b07fa, + 0x555ef82c, + 0x7b3423fe, + 0x9bb36923, + 0x0b404720, + 0x9a3fe624, + 0xa9320700, + 0xf6012eb4, + 0x27fd834f, + 0xfd7e5e20, + 0x013ab4b9, + 0xb2b9e127, + 0xb3a904d1, + 0x10270162, + 0x11274418, + 0x1307317b, + 0xb3b94607, + 0x120b04d0, + 0x142b4433, + 0x130334c6, + 0x400713e3, + 0x412b4433, + 0x4d834633, + 0x6ff60300, + 0xf121fbb5, + 0x14863127, + 0x3c333027, + 0xfba95e10, + 0x31279027, + 0xa9fa2c5e, + 0xf6012eb4, + 0xd1fd0f4f, + 0xc503a0b4, + 0x055eccb4, + 0x9cd8d5fd, + 0xfc1a5e01, + 0xfdbe0b07, + 0x605efbc9, + 0x5e1027ff, + 0x4127fa81, + 0x5edeb49d, + 0x4203fc8f, + 0x2405432b, + 0x925e2115, + 0x5e3027f9, + 0xf54eff67, + 0xdf27c027, + 0x41e00000, + 0x3d072c07, + 0xb107a007, + 0x00151bbe, + 0x271f00c8, + 0x073d0720, + 0xbe0a071b, + 0x0700127b, + 0x07040740, + 0x13c3be51, + 0x000f0300, + 0x8e800000, + 0x071b07f5, + 0x13b3be0a, + 0x01f58e00, + 0x1342d004, + 0x32b01301, + 0x204944c0, + 0xc042a434, + 0x14113c32, + 0x112745c6, + 0xfe0b0107, + 0x04113284, + 0x10a742c6, + 0xfe0b0107, + 0x14110311, + 0x3106344e, + 0xf11e10a7, + 0x14210221, + 0x7af442da, + 0x31043124, + 0xeb04ca10, + 0x3fd60442, + 0x1e10a7ce, + 0x071027d8, + 0xc4fe0b01, + 0x1111c934, + 0x142b0411, + 0xfb4ebb1e, + 0x32d00301, + 0xd014012f, + 0x34e02842, + 0x44c000fb, + 0x2242c421, + 0x051d32c4, + 0x15041123, + 0x25042124, + 0x35043124, + 0x11031124, + 0x8b020714, + 0x8e241543, + 0x8e0107fb, + 0xfa32c0fb, + 0x14210c21, + 0xe42bec07, + 0x13310b31, + 0xe0c8de07, + 0x20ecc867, + 0x8c4cfa4c, + 0x27c40700, + 0x110011b0, + 0x7404ce14, + 0x3b2b0f66, + 0x277e30c8, + 0x25241540, + 0x3123352c, + 0x23410721, + 0xff4fd441, + 0x163fffff, + 0x11472321, + 0x41073123, + 0x23252135, + 0x4fd04123, + 0x3fffffff, + 0x054327ee, + 0x2810c824, + 0xfb8e0207, + 0x2752d1c8, + 0x234e3b41, + 0x27438b41, + 0x274486d0, + 0xab3e5bd1, + 0x13a71e3d, + 0x20eccce0, + 0x1be21e99, + 0x21a61e3b, + 0x53310724, + 0xab118331, + 0x07410313, + 0x25213502, + 0x07fb8e24, + 0x15130b1b, + 0x352c2520, + 0x27b31e21, + 0xff775e30, + 0x41273013, + 0x2c252415, + 0x801e2335, + 0xff67dfe6, + 0x4e3b4127, + 0x4b8b4123, + 0xd027ce0b, + 0xd1274486, + 0xbdabbe5b, + 0xe4ff505e, + 0x11ff2a44, + 0xee041113, + 0x93ff2234, + 0xffe9f7f0, + 0x0001fb8e, + 0x40073007, + 0x53173c53, + 0x20071f4c, + 0x3f6b1415, + 0xffff2e83, + 0xc639d67f, + 0xa7432728, + 0x14057d3c, + 0x13254207, + 0x4f744733, + 0x40000000, + 0x31234447, + 0x00004fd0, + 0x25f64000, + 0x0b143513, + 0x054227fe, + 0xc0fe0b14, + 0x3316ff3c, + 0x7f3c2327, + 0x00002fa3, + 0x43274000, + 0x13251235, + 0xfe0b1405, + 0x44272516, + 0xfe0b1405, + 0x00000e83, + 0x27054610, + 0x35140541, + 0x05fe0b12, + 0x4ef91e10, + 0x07f163f5, + 0x03f0051f, + 0x7e0f0714, + 0xf341ff7a, + 0x23074027, + 0xf0112253, + 0xf12142ab, + 0x3c33f231, + 0x0c79be1e, + 0x43510700, + 0x4ef58ef1, + 0x07f2a3fb, + 0x05b803bf, + 0x07f115f0, + 0x7e1b070f, + 0xcf07ff4a, + 0x0718cc03, + 0x0704030f, + 0xff3c7e1c, + 0x1c070b07, + 0x83fdba7e, + 0x01fb8ef2, + 0x11033104, + 0x6442d002, + 0x005744c0, + 0x2735f642, + 0xab002740, + 0x1f2c3304, + 0xfe0b02ab, + 0x0fc80021, + 0xffffff82, + 0x800ccc5b, + 0x83430739, + 0x0c037f4c, + 0x404cc07f, + 0x3f3c031e, + 0x072130c8, + 0x6b475343, + 0xff4e830f, + 0x0c337fff, + 0x3304ab17, + 0x02ab1f2c, + 0x3cd8fe0b, + 0x3c03e380, + 0x53de1e40, + 0x1e010331, + 0x274027db, + 0x8000000f, + 0x07a91e7f, + 0x004ea343, + 0x4e831000, + 0x277fffff, + 0x8000000f, + 0x13951e7f, + 0xffff820f, + 0x1a0cccff, + 0x3b412753, + 0x8b412340, + 0x86102743, + 0x5b112744, + 0xab030730, + 0x83400701, + 0x4cc07f4c, + 0x40073c40, + 0x073f4c03, + 0x27375334, + 0x004fd001, + 0x20400000, + 0x4e834307, + 0x337fffff, + 0x505e170c, + 0x034007ff, + 0x3407404c, + 0x01273753, + 0x00004fd4, + 0x27e24000, + 0x27de1e00, + 0x1e302700, + 0x800cdcd8, + 0x533007e1, + 0x14412737, + 0x0000000f, + 0x07402740, + 0x4ec21e04, + 0x05f123fe, + 0x150f07f0, + 0x35f225f1, + 0xfef97ef3, + 0xfe8ef103, + 0xf163fd4e, + 0xd403df07, + 0x1d07f005, + 0x137e0f07, + 0x27f421fe, + 0x27449630, + 0x250d0731, + 0xfed57ef3, + 0xfd8ef143, + 0xf2a3fc4e, + 0xc803cf07, + 0xf115f005, + 0x1c070f07, + 0x07fded7e, + 0x18dc03df, + 0x04030f07, + 0xdf7e1d07, + 0xd0f221fd, + 0xf1611622, + 0x008112f0, + 0xf371f431, + 0xf43543cb, + 0x22c42400, + 0x07126e18, + 0xfe917e0c, + 0xfc8ef283, + 0xe7aaf093, + 0xfe857eff, + 0xfc8ef283, + 0xc05d14c0, + 0xf2413912, + 0xf351f481, + 0xf191242b, + 0x1342f245, + 0xf2452123, + 0x2f273347, + 0x40000000, + 0x4c270027, + 0xab312a1f, + 0x53312b02, + 0x98334721, + 0x834007f4, + 0x4cc07f4c, + 0xf0551240, + 0x4427ae1e, + 0xf4250c07, + 0x83fe3a7e, + 0xdcfc8ef2, + 0x66ec800c, + 0x400c0331, + 0x557f0ce3, + 0x07911ef0, + 0x278f1e0d, + 0x450c0740, + 0x1ef455f4, + 0xa3fc4e85, + 0x03cf07f3, + 0x15f005c8, + 0x070f07f1, + 0xfd347e1c, + 0xdc03df07, + 0x030f0718, + 0x7e1d0704, + 0xf421fd26, + 0xf3614290, + 0xe02432d0, + 0xe000dc44, + 0xc400cc34, + 0xf3311642, + 0x2027f471, + 0x2127340e, + 0xf2350c07, + 0x83fdd27e, + 0xc4fc8ef3, + 0xf3311632, + 0x2027f471, + 0x2127340e, + 0xf2750d07, + 0x83fdba7e, + 0x51fc8ef3, + 0x27f091f2, + 0xbe102730, + 0x8100129f, + 0x07f441f3, + 0x03430bd1, + 0xc5302742, + 0xf3b530f4, + 0xf331f471, + 0x342e2107, + 0xf4b54127, + 0x20cc3d07, + 0x30f4c11a, + 0x41032153, + 0x01533138, + 0x00000fa3, + 0x32078000, + 0xc5ee20c8, + 0x2fd430f4, + 0x40000000, + 0x30f4c123, + 0x0047091e, + 0x00002fb4, + 0x22474000, + 0x00cc4123, + 0x4721a3f2, + 0x002fd000, + 0xef400000, + 0x0730f4c5, + 0x7f4c8342, + 0x14404cc0, + 0x43270f07, + 0xc5280c03, + 0xf4a534f2, + 0x83fd2e7e, + 0xdcfc8ef3, + 0x26ea802c, + 0x402c0301, + 0x1e7f2ce3, + 0x4f42e4e0, + 0x35f093ff, + 0x3d5effe6, + 0x2b32e4ff, + 0x29f093ff, + 0x315effe6, + 0xa3fb4eff, + 0x03bf07f3, + 0x15f005b8, + 0x070f07f1, + 0xfc207e1b, + 0xcc03cf07, + 0x030f0718, + 0x7e1c0704, + 0xf471fc12, + 0x41c32f07, + 0x2c031c07, + 0x750b0728, + 0xfae47ef4, + 0x83fcce7e, + 0x4efb8ef3, + 0x07f3a3fb, + 0x05b803bf, + 0x07f115f0, + 0x7e1b070f, + 0xcf07fbe6, + 0x0718cc03, + 0x0704030f, + 0xfbd87e1c, + 0x1c072f07, + 0x07282c03, + 0xfab07e0b, + 0x83fc9a7e, + 0x4efb8ef3, + 0x27f123fc, + 0x27f40543, + 0x270008c1, + 0x270636c0, + 0x07f40542, + 0x7efc150f, + 0xf103fc7b, + 0xc876fc8e, + 0x4c27d007, + 0x250d071e, + 0xbefd35f4, + 0x230011b3, + 0xe001c801, + 0x3b1e4c27, + 0x35402bd0, + 0x1ef425fd, + 0x000f40d3, + 0x07800000, + 0x1ed013d0, + 0x000f27d6, + 0x1ecf0000, + 0xa3fc4ec6, + 0x03cf07f2, + 0x15f005c8, + 0x070f07f1, + 0xfb5c7e1c, + 0xdc03df07, + 0x030f0718, + 0x7e1d0704, + 0xf421fb4e, + 0x611042d0, + 0x074290f4, + 0x7e1d070c, + 0xf283f9c3, + 0x0127fc8e, + 0xfe4ef91e, + 0x1f07f163, + 0x1403f005, + 0x277e0f07, + 0x44f411fb, + 0x43002742, + 0xd0fe8ef1, + 0x4440f842, + 0x40c8f431, + 0x1f4c88f1, + 0x47c6f421, + 0x00000f27, + 0xf1438000, + 0xf041fe8e, + 0x4c13f321, + 0xc6045b1e, + 0x0013d63f, + 0xfe8ef143, + 0xffff0f27, + 0xf1437fff, + 0xfe4efe8e, + 0xf115f2a3, + 0xf0051f07, + 0x0f071803, + 0x07fad57e, + 0x031f070f, + 0x181c0304, + 0x21fac97e, + 0x614290f4, + 0x300027f4, + 0x8ef28342, + 0x830127fe, + 0x4efe8ef2, + 0x07f2a3fc, + 0x05c803cf, + 0x07f115f0, + 0x7e1c070f, + 0xdf07faa2, + 0x0718dc03, + 0x0704030f, + 0xfa947e1d, + 0x42d0f421, + 0x90f46110, + 0x070c0742, + 0xf9097e1d, + 0xfc8ef283, + 0xf91e0127, + 0xf2a3fc4e, + 0xc803cf07, + 0xf115f005, + 0x1c070f07, + 0x07fa697e, + 0x18dc03df, + 0x04030f07, + 0x5b7e1d07, + 0xd0f421fa, + 0xf4611042, + 0x0c074290, + 0xd07e1d07, + 0x8ef283f8, + 0x1e0127fc, + 0xa3fc4ef9, + 0x03cf07f2, + 0x15f005c8, + 0x070f07f1, + 0xfa307e1c, + 0xdc03df07, + 0x030f0718, + 0x7e1d0704, + 0xf421fa22, + 0x611042d0, + 0x074290f4, + 0x7e1d070c, + 0xf283f897, + 0x00a7fc8e, + 0xfc4ef91e, + 0xcf07f2a3, + 0xf005c803, + 0x0f07f115, + 0xf77e1c07, + 0x03df07f9, + 0x0f0718dc, + 0x1d070403, + 0x21f9e97e, + 0x1042d0f4, + 0x4290f461, + 0x1d070c07, + 0x83f85e7e, + 0xa7fc8ef2, + 0x4ef91e00, + 0x07f2a3fc, + 0x05c803cf, + 0x07f115f0, + 0x7e1c070f, + 0xdf07f9be, + 0x0718dc03, + 0x0704030f, + 0xf9b07e1d, + 0x42d0f421, + 0x90f46110, + 0x070c0742, + 0xf8257e1d, + 0xfc8ef283, + 0xf91e0127, + 0xf123fd4e, + 0x0676d007, + 0xf4054227, + 0x40270f07, + 0x547ef415, + 0x8ef103fa, + 0x274327fd, + 0xf4051e3c, + 0xf035f325, + 0x000f8ebe, + 0x00c80123, + 0xdd0fc61c, + 0x2b1e4c27, + 0x25d03b40, + 0x270f07f4, + 0x15fd3540, + 0xfa257ef4, + 0xfd8ef103, + 0x20132007, + 0x423b4127, + 0x4d8b4123, + 0x46363027, + 0x4c27d25b, + 0x2b3dab1e, + 0x25f33540, + 0x27a61ef4, + 0x4eee1e31, + 0xd00401fd, + 0x13011342, + 0x44c032b0, + 0xa434205d, + 0x4832c042, + 0x45c61411, + 0x01071127, + 0x3284fd8e, + 0x42c60411, + 0x010710a7, + 0x0311fd8e, + 0x344e1411, + 0x10a73106, + 0x0221f11e, + 0x42da1421, + 0x1524daf4, + 0x0e410d31, + 0x11411031, + 0xcee61eca, + 0xe12a141e, + 0x0d42e16e, + 0xa7c23fd6, + 0x27cc1e10, + 0x8e010710, + 0xebd0c2fd, + 0x1ecc3fd6, + 0xb534c4b0, + 0x04111111, + 0xa71e142b, + 0xf1a3f54e, + 0x60275027, + 0xf5350301, + 0xc007f645, + 0xb2077107, + 0x90278027, + 0x012f32d0, + 0x7d42f014, + 0x4b34e001, + 0x7544e002, + 0x2442c401, + 0x071b32c4, + 0x27400732, + 0x03410125, + 0x03310544, + 0x11f2a834, + 0x077411c3, + 0x15438bcb, + 0x830c07b4, + 0xe0f58ef1, + 0x21014b32, + 0x2514210e, + 0x310341fe, + 0x15ae0702, + 0x2bf205f3, + 0x411d31a4, + 0xe83a071e, + 0xcc00dfa0, + 0xe84c40ac, + 0x07017c31, + 0x203c233a, + 0x5027f355, + 0x30e86027, + 0x412701dc, + 0x133b1407, + 0x02072127, + 0x30a70a3b, + 0x300b40a7, + 0x3d8b414b, + 0x34ab4e8b, + 0x512734c6, + 0xf4516027, + 0x01a440e8, + 0x845b8e07, + 0x9a5b9e07, + 0xe607d507, + 0xe9abd8ab, + 0xf321111e, + 0x010643fa, + 0x20271027, + 0xf105f425, + 0xc011f215, + 0x04ee7411, + 0x0fe600db, + 0xf30100cc, + 0x1d07f411, + 0x132b2e07, + 0x20e8246b, + 0x402700f2, + 0xf421b415, + 0xb425b135, + 0xbc31b245, + 0x30a7bd41, + 0x3c0b40a7, + 0x4fd44d4b, + 0x10000000, + 0xff4fe031, + 0xc00fffff, + 0x07b12100, + 0x1f4c534c, + 0x34ab3d47, + 0xb3452c47, + 0xbc31b235, + 0x1123bd41, + 0x40a730a7, + 0x3c0bb125, + 0x4fd04d4b, + 0x10000000, + 0x0543271e, + 0x00dfd4b4, + 0x2c200000, + 0x0c07cb07, + 0xf58ef183, + 0xaceca013, + 0x5eff6d40, + 0x4fc4ff1f, + 0x0fffffff, + 0xff3fd0b7, + 0xb0ffffff, + 0xb4054327, + 0x0000dfd0, + 0x07d62000, + 0x330d073c, + 0x20271f0c, + 0x4d073153, + 0x1c07be21, + 0x415330ab, + 0x04ab0207, + 0xcb071183, + 0x13abe103, + 0xf183b045, + 0xb1350c07, + 0xf58ebe25, + 0x0c07c707, + 0xf58ef183, + 0xf211f101, + 0x2e6b1d2b, + 0x01ff395e, + 0x15f211f1, + 0x4b1d0bb0, + 0x21d2072e, + 0x25c107f2, + 0x45bc35b2, + 0xff735ebd, + 0xe027d027, + 0xf4ff015e, + 0xffffff3f, + 0x5eff64ff, + 0xfd21ff39, + 0x40273027, + 0x426b312b, + 0xb2152127, + 0xb335bd25, + 0x075eb445, + 0xdb3fe6ff, + 0x07f321fe, + 0x202c232a, + 0xf2553a0b, + 0x0027f325, + 0x20e81027, + 0x41270091, + 0x623b6407, + 0x52072127, + 0xf2015a3b, + 0x40a730a7, + 0x464b350b, + 0xf211328b, + 0x34ab428b, + 0x012734c6, + 0xf3511027, + 0x115030c8, + 0x35435bf4, + 0x31f311f4, + 0x073a5bf4, + 0xab40ab23, + 0x05f34521, + 0x5ef215f4, + 0x4c27fe82, + 0x074a2b20, + 0x3b8d071e, + 0xab8a5b14, + 0xfe525e81, + 0x27203c27, + 0x073a2b41, + 0x5e135b14, + 0x44e4fe20, + 0x1311fdd9, + 0x34ee0411, + 0xfc93fdd1, + 0x5effe03c, + 0x4c27fdc9, + 0x01f21120, + 0x3b4a2bf3, + 0x073a5b24, + 0xab230742, + 0x1ef23524, + 0x203c27a1, + 0x3a2b4127, + 0x635b6407, + 0x4eff6b5e, + 0x010a11f8, + 0x07ba0709, + 0x1fbc533a, + 0x83143c53, + 0x070307b1, + 0x831b15ea, + 0x2707ff0d, + 0x078107c0, + 0xffee83d9, + 0x0e160fff, + 0x4eab4907, + 0x42274516, + 0xf88e1405, + 0x3da74327, + 0x140503fd, + 0x49071325, + 0x4c531e07, + 0x07183318, + 0x3314ab09, + 0x001fd408, + 0x1d100000, + 0x2007e307, + 0x2c534147, + 0x4742ab1f, + 0x07030730, + 0xd0e12314, + 0x0000004f, + 0x8e25e910, + 0x81458035, + 0x0dc0f88e, + 0x072807ff, + 0x534e0729, + 0x4833182c, + 0x240742ab, + 0x00002fa3, + 0x39071000, + 0x0d233833, + 0x124503ff, + 0x10252327, + 0x13351205, + 0x4907f88e, + 0x45164eab, + 0x14054427, + 0x4e07f88e, + 0x4e833027, + 0xab080000, + 0x27358634, + 0x35140541, + 0x8e8e458d, + 0x1e1305f8, + 0xe3f54ef7, + 0x075107f1, + 0x0340071f, + 0x050f0718, + 0x7ef515f4, + 0xf351ff23, + 0x1307f461, + 0xffff1f83, + 0x20273fff, + 0x3c530487, + 0xab12ab1e, + 0xa3148630, + 0x31f02131, + 0xbef241f1, + 0xc3fff6d7, + 0x4ef58ef1, + 0x07f3a3f5, + 0x10ac03af, + 0xb007c107, + 0x0f071a07, + 0xf225f335, + 0xfc155307, + 0xcf07fb05, + 0x03feda7e, + 0x0f0724cc, + 0x1c070803, + 0x07fece7e, + 0x7e1c070a, + 0xf383fbab, + 0xf64ef58e, + 0x90270401, + 0x0d31a027, + 0x08110e41, + 0x00c942f0, + 0x00ba44e0, + 0x4d074240, + 0x47f64eab, + 0x10270027, + 0x31833807, + 0x4c334307, + 0x0730271f, + 0xabc107b0, + 0x07c4abb3, + 0x8e1c070b, + 0xe80021f6, + 0xfffc020f, + 0xec00b1ff, + 0x8504000d, + 0x6b3d0700, + 0x0340273f, + 0xc003ff0d, + 0x2756803c, + 0x40277f3c, + 0xe44bd30b, + 0x0000efd0, + 0x07162000, + 0x073d072e, + 0x1f2c334e, + 0x32ab3153, + 0xd3074153, + 0x0103e407, + 0x4e072007, + 0x1e070d07, + 0x07ff2d83, + 0x32071853, + 0x53184c33, + 0x0704ab08, + 0x143c33e1, + 0xd0072027, + 0xffffee83, + 0x0702070f, + 0xab0dab13, + 0xff765e1e, + 0x07a94fd6, + 0x003d833d, + 0xc634ab01, + 0x3c27a73f, + 0x0b402780, + 0xd0e44bd3, + 0x000000ef, + 0x9c1eb320, + 0x1f270027, + 0x7ff00000, + 0x07ff4b5e, + 0x004ea34e, + 0xe4070800, + 0xffffee83, + 0x071e070f, + 0x001fa30d, + 0x5e7ff000, + 0x0f13ff30, + 0xfffffc02, + 0xba390cec, + 0x23100700, + 0x6027201c, + 0x10e87027, + 0x412700b5, + 0xc13bc407, + 0xb2072127, + 0x30a7b03b, + 0x3b0b40a7, + 0x3d8b4c4b, + 0x34ab4e8b, + 0x612734c6, + 0x10e87027, + 0x9e07009f, + 0xd607915b, + 0xae07d9ab, + 0xa05b3d07, + 0x3f6be707, + 0x4027eaab, + 0x44803cc0, + 0x277f3c27, + 0x4b3d0b40, + 0x3324074e, + 0xc127182c, + 0x00004f14, + 0xc0271000, + 0x08530307, + 0x02ab1407, + 0x3c071853, + 0x07ff3d83, + 0xe1074307, + 0x27144c33, + 0x83d00730, + 0x0fffffee, + 0x14070307, + 0x1eab0dab, + 0xd6fe975e, + 0x3d07bb4f, + 0x01003d83, + 0x34ab4027, + 0x4e073cb6, + 0x27184c33, + 0x00ef14c1, + 0x27100000, + 0x530d07c0, + 0xab1e0708, + 0x1e185304, + 0x27c027b6, + 0x1e102700, + 0x203c27ae, + 0x302b4127, + 0xc35bc407, + 0x27ff475e, + 0x402b204c, + 0x9d073e07, + 0x905b343b, + 0x575e93ab, + 0x803c27ff, + 0x4eff6a5e, + 0x05f163f5, + 0x150f07f0, + 0x35f225f1, + 0x7ef445f3, + 0x5107fe0a, + 0xf58ef143, + 0xf1e3f54e, + 0xd803df07, + 0x51074007, + 0x1d070f07, + 0xf515f405, + 0x31fcae7e, + 0x963027f4, + 0x07312744, + 0x7ef3350d, + 0x5107fdde, + 0xf58ef1c3, + 0xf3e3f54e, + 0x1f07c107, + 0x1c03b007, + 0x250f0710, + 0x15f335f2, + 0x7efb05fc, + 0xdf07fc7f, + 0x0724dc03, + 0x0708030f, + 0xfc717e1d, + 0x22d0f241, + 0xf0f19116, + 0x51010912, + 0xcbf3a1f4, + 0x00f45543, + 0x1f22c424, + 0x0f0712ae, + 0x7e100c03, + 0x5107fd8e, + 0xf58ef3c3, + 0xdc56f093, + 0xfd807eff, + 0xf3c35107, + 0x14e0f58e, + 0x12c000df, + 0xb1f1617f, + 0x2bfc81f4, + 0x34f8c114, + 0xfb71f165, + 0xea30f7c1, + 0xce0084c8, + 0x4c277d8c, + 0x2790273d, + 0x000000af, + 0x27502710, + 0x38f4c560, + 0xe607d507, + 0xd9ab4a07, + 0x4c33eaab, + 0xcec88a1f, + 0x5d07548c, + 0xb72b6e07, + 0x2907c86b, + 0x24ab2153, + 0x4c534b07, + 0xab1c471f, + 0x38f4c114, + 0x41233a07, + 0x0b473153, + 0x0738f4c5, + 0x07a30792, + 0xd6c107b0, + 0x3507bf4f, + 0x40273f6b, + 0x38803cc0, + 0xf685f575, + 0x07ff615e, + 0x0344270f, + 0xf445100c, + 0x07fce97e, + 0x8ef3c351, + 0xb3b7caf5, + 0x7bc2a91e, + 0x472b0782, + 0x1f2c534c, + 0x3b4742ab, + 0xb3071123, + 0xf165c407, + 0xd6ff6d5e, + 0x3507c74f, + 0x01003d83, + 0x3fd634ab, + 0xab4007bc, + 0xb54fc641, + 0x27803c27, + 0x4b350b40, + 0xe3530746, + 0x6407ff5c, + 0x0d07a31e, + 0x07ff0a5e, + 0x2730270f, + 0x03202740, + 0xf375100c, + 0xf265f485, + 0x4efef65e, + 0x07f5e3f5, + 0x10ac03af, + 0xc107b007, + 0x1a070f07, + 0xf225f335, + 0xfb05fc15, + 0x07fb2a7e, + 0x24dc03df, + 0x08030f07, + 0x1c7e1d07, + 0x90f441fb, + 0xd0f39142, + 0x44e02632, + 0x34e001f3, + 0x42c401e3, + 0xa1f35118, + 0x0e2027f4, + 0x07212734, + 0x7ef2550a, + 0x5107fc36, + 0xf58ef5c3, + 0x511832c4, + 0x27f4a1f3, + 0x27340e20, + 0xa50d0721, + 0xfc1c7ef2, + 0xf5c35107, + 0xfbc1f58e, + 0x27f77130, + 0x076027a0, + 0x34fcc12b, + 0x1a073607, + 0x94be0707, + 0x5b070006, + 0xbc073027, + 0xc54cfbc5, + 0xf0c550f3, + 0x58f1c554, + 0xc14cf0c1, + 0x3a0750f1, + 0x2707f881, + 0x000672be, + 0x9007c027, + 0x2507a107, + 0x08073607, + 0x60be1c07, + 0xd0070006, + 0xd90be107, + 0xb807ea4b, + 0x00fdeaea, + 0x00f5aeee, + 0xf3c11027, + 0x58f4c154, + 0xad079107, + 0xa44b930b, + 0x80277027, + 0x00f9a4ea, + 0xee58f4c1, + 0xc1012c4a, + 0xf2c150f3, + 0x070b074c, + 0xbebe071c, + 0xb100061f, + 0x27f461f3, + 0x03430bc0, + 0xc5302744, + 0xf3c540f4, + 0x51f4a13c, + 0x4bb00bf3, + 0x4bb70bc1, + 0x27342ec8, + 0x3cf4c541, + 0x0000cfd0, + 0xc13f2000, + 0x4c0740fe, + 0x4c331b07, + 0x0711531f, + 0xab0a072c, + 0x33215314, + 0xe1031f0c, + 0x0715b1d8, + 0x534a0739, + 0xab415331, + 0x07a40730, + 0x00afa393, + 0x07800000, + 0xd4c207b1, + 0x0000002f, + 0xfec5c920, + 0x00cfd440, + 0x31100000, + 0x0740fec1, + 0x1f4c5349, + 0x1a472b07, + 0x2c5314ab, + 0xab4c471f, + 0x473b4742, + 0x07b30709, + 0xc8e123c4, + 0x900759a0, + 0xcfd0a107, + 0x10000000, + 0x40fec5d7, + 0x3f6b3b07, + 0x3cc04027, + 0x0f074980, + 0x0c034327, + 0x44fbc538, + 0xc548fcc5, + 0xcb7e38f4, + 0xc35107fa, + 0xe2f58ef5, + 0x27ff0b9d, + 0x54f3c110, + 0x0758f4c1, + 0x0bad0791, + 0x27a44b93, + 0xe2812770, + 0x27ff0b4a, + 0x0b402731, + 0x5e844b73, + 0x31a3ff07, + 0xc407b307, + 0x4fd6a11e, + 0x833b07b6, + 0xab01003d, + 0xab3fd634, + 0x4aab4907, + 0x27a44fc6, + 0x4027803c, + 0x4c4b3b0b, + 0xbce3b307, + 0x1ec407ff, + 0xd439e292, + 0xe4c11efe, + 0x93fe3a42, + 0xffd933f0, + 0xe4fe265e, + 0x93fe1432, + 0xffd927f0, + 0x4efe1a5e, + 0x07f4e3f5, + 0x10ac03af, + 0xb007c107, + 0x0f071a07, + 0xf225f335, + 0xfb05fc15, + 0xf47ecf07, + 0x24cc03f8, + 0x08030f07, + 0xe87e1c07, + 0x07f4a1f8, + 0x0741c32f, + 0x382c031c, + 0xf4a50a07, + 0x7ef62f7e, + 0x5107fa12, + 0xf58ef4c3, + 0xf4e3f54e, + 0xac03af07, + 0x07c10710, + 0x071a07b0, + 0x25f3350f, + 0x05fc15f2, + 0x7ecf07fb, + 0xcc03f8af, + 0x030f0724, + 0x7e1c0708, + 0x2f07f8a3, + 0x2c031c07, + 0x7e0a0738, + 0xd37ef5f0, + 0xc35107f9, + 0x4ef58ef4, + 0x27f163fb, + 0x27f40543, + 0x270008b1, + 0x270736b0, + 0x07f40542, + 0x7efb150f, + 0x3007f9b2, + 0x03074107, + 0xf1431407, + 0xbb36fb8e, + 0x04074007, + 0xc407d027, + 0x253c4c27, + 0x45f035f4, + 0x047dbefd, + 0x03100700, + 0x11c81d1c, + 0xc80323cf, + 0x4c072300, + 0xf445403b, + 0x3c274c07, + 0x2b413b3c, + 0x25f43531, + 0xc0b51ef3, + 0x0000000f, + 0x40071a80, + 0xbf1e4013, + 0x2b204c27, + 0x072c0741, + 0x3b245b3d, + 0x4532ab31, + 0x27d21ef3, + 0x004f2730, + 0x1ec1e000, + 0xa3f54e96, + 0x03df07f3, + 0x400710dc, + 0x0f075107, + 0xf4051d07, + 0xf335c307, + 0xf515f225, + 0xe47ebf07, + 0x24bc03f7, + 0x08030f07, + 0xd87e1b07, + 0xd0f441f7, + 0xf4911042, + 0x0d074290, + 0xac7e1b07, + 0x8ef383f4, + 0x1e0127f5, + 0xe3f54ef9, + 0x075107f1, + 0x0340071f, + 0x050f0718, + 0x7ef515f4, + 0xf421f7ab, + 0x00274244, + 0xf58ef1c3, + 0x40f842d0, + 0xc8f44144, + 0x4c88f140, + 0x46f4311f, + 0x000f2749, + 0xc3800000, + 0x27f58ef1, + 0xe42b3cec, + 0x4c234e07, + 0x1c40c820, + 0x0207f261, + 0xf431045b, + 0x13ca4fc6, + 0x8ef1c300, + 0xff0f27f5, + 0xc37fffff, + 0x61f58ef1, + 0x204c27f2, + 0x32074e2b, + 0x4307343b, + 0x0307f351, + 0x04ab0e5b, + 0xf54ed51e, + 0x5107f3a3, + 0x40071f07, + 0x07101c03, + 0x07f4050f, + 0x35c307b2, + 0x15f225f3, + 0xf7297ef5, + 0x1f070f07, + 0x1c030803, + 0xf71d7e24, + 0x4290f441, + 0x0027f491, + 0xf3834230, + 0x0127f58e, + 0xf58ef383, + 0xf3a3f54e, + 0xdc03df07, + 0x07400710, + 0x070f0751, + 0x07f4051d, + 0x25f335c3, + 0x07f515f2, + 0xf6e97ebf, + 0x0724bc03, + 0x0708030f, + 0xf6dd7e1b, + 0x42d0f441, + 0x90f49110, + 0x070d0742, + 0xf3b17e1b, + 0xf58ef383, + 0xf91e0127, + 0xf3a3f54e, + 0xdc03df07, + 0x07400710, + 0x070f0751, + 0x07f4051d, + 0x25f335c3, + 0x07f515f2, + 0xf6a57ebf, + 0x0724bc03, + 0x0708030f, + 0xf6997e1b, + 0x42d0f441, + 0x90f49110, + 0x070d0742, + 0xf36d7e1b, + 0xf58ef383, + 0xf91e0127, + 0xf3a3f54e, + 0xdc03df07, + 0x07400710, + 0x070f0751, + 0x07f4051d, + 0x25f335c3, + 0x07f515f2, + 0xf6617ebf, + 0x0724bc03, + 0x0708030f, + 0xf6557e1b, + 0x42d0f441, + 0x90f49110, + 0x070d0742, + 0xf3297e1b, + 0xf58ef383, + 0xf91e00a7, + 0xf3a3f54e, + 0xdc03df07, + 0x07400710, + 0x070f0751, + 0x07f4051d, + 0x25f335c3, + 0x07f515f2, + 0xf61d7ebf, + 0x0724bc03, + 0x0708030f, + 0xf6117e1b, + 0x42d0f441, + 0x90f49110, + 0x070d0742, + 0xf2e57e1b, + 0xf58ef383, + 0xf91e00a7, + 0xf3a3f54e, + 0xdc03df07, + 0x07400710, + 0x070f0751, + 0x07f4051d, + 0x25f335c3, + 0x07f515f2, + 0xf5d97ebf, + 0x0724bc03, + 0x0708030f, + 0xf5cd7e1b, + 0x42d0f441, + 0x90f49110, + 0x070d0742, + 0xf2a17e1b, + 0xf58ef383, + 0xf91e0127, + 0xf163f54e, + 0xb027a027, + 0x90278027, + 0x422706b6, + 0x0f07f405, + 0xf4154027, + 0x07f6d97e, + 0x8ef14351, + 0x27d027f5, + 0x3c3c2743, + 0xf405c007, + 0xf035f325, + 0xacbefd45, + 0x10070001, + 0xc81d1c03, + 0x1fc62c10, + 0xe80323d2, + 0x07008200, + 0x45403b4c, + 0x3b4c07f4, + 0x3c3c2741, + 0x312bf435, + 0x40270f07, + 0xf415f325, + 0x07f6917e, + 0x8ef14351, + 0x13e107f5, + 0x230e07e0, + 0x6027200c, + 0x00c87027, + 0x07412742, + 0x27b03bb4, + 0x3ba20721, + 0xa730a7ae, + 0x4b3a0b40, + 0x8b3c8b4b, + 0xc634ab4d, + 0x27612734, + 0x4000c870, + 0x805b8d07, + 0x9e5b9d07, + 0x2c274707, + 0xab36073c, + 0xab212b49, + 0x45f33538, + 0x5ef225f4, + 0x3c27ff5a, + 0x2b412720, + 0x5bb4073e, + 0x27b91eb3, + 0x412b204c, + 0x3d072c07, + 0x313b245b, + 0xf34532ab, + 0x27ff745e, + 0x4e2b204c, + 0x8c073d07, + 0x8e5b343b, + 0xb51e83ab, + 0x0088fe4e, + 0x1013100c, + 0xfe0e2127, + 0x00004e9e, + 0x10680013, + 0x44be2127, + 0x00130000, + 0x1013fe8e, + 0xfd4ef31e, + 0x271200c8, + 0x1410c8d0, + 0x2cbe2027, + 0xd4860000, + 0xfd8e0013, + 0xd1270013, + 0x13ee10cc, + 0xd6412710, + 0x1ed407d4, + 0x074027e4, + 0x27de1ed4, + 0x00099e21, + 0x9e202700, + 0x4e000003, + 0x3601c2fe, + 0x273310c8, + 0x203c2741, + 0x44471147, + 0xf02101c2, + 0x302707f3, + 0xfe8e26e6, + 0x27ee10cc, + 0x2b012a30, + 0x5334ab01, + 0xd6115341, + 0x0721b642, + 0x66fe8e03, + 0x1e302740, + 0x274127e9, + 0x4ee31e30, + 0x074207f6, + 0x07930782, + 0x533007a2, + 0x4fab102c, + 0xe2073fab, + 0x6007e39b, + 0xb0077107, + 0x0c531407, + 0x9b349b10, + 0x0b430710, + 0x104c53e1, + 0x209be40b, + 0x2e031e02, + 0x07010000, + 0x33b99b4e, + 0xa79b10ec, + 0x07104c53, + 0x073fabd2, + 0x0bba0bce, + 0x07c30bd4, + 0x0b0c071b, + 0xd4f68e1d, + 0x0100000e, + 0x000dd417, + 0x30273a01, + 0x00f9035b, + 0x00054724, + 0x1b204c27, + 0xb0fe0b04, + 0x0000000f, + 0x183c2701, + 0x00f9035b, + 0x00054724, + 0x041b4827, + 0x4c27fe0b, + 0x5b340710, + 0x2400f903, + 0x1b000547, + 0x27fe0b04, + 0xf9035b38, + 0x05472400, + 0x184c2700, + 0xfe0b041b, + 0x0001a8b6, + 0x0001a8bb, + 0x0001a8c3, + 0x0001a8cb, + 0x0001a8d1, + 0x0001a8d8, + 0x0001a8e3, + 0x0001a8ec, + 0x0001a8f5, + 0x0001a8f9, + 0x0001a8ff, + 0x0001a909, + 0x0001a911, + 0x0001a91f, + 0x0001a92c, + 0x0001a933, + 0x0001a93f, + 0x0001a949, + 0x0001a954, + 0x0001a8b6, + 0x0001a95f, + 0x0001a967, + 0x0001a96f, + 0x0001a993, + 0x0001a973, + 0x0001a8c3, + 0x0001a97c, + 0x0001a986, + 0x0001a990, + 0x0001a99a, + 0x0001a9a4, + 0x0001a9ac, + 0x0001a9b5, + 0x0001a9bb, + 0x0001a9c2, + 0x0001a9c8, + 0x0001a9d3, + 0x0001a9dd, + 0x0001a8b6, + 0x0001a95f, + 0x0001a9e3, + 0x0001a9ec, + 0x0001a9f5, + 0x0001a9f9, + 0x0001aa00, + 0x0001aa08, + 0x0001aa12, + 0x0001aa19, + 0x0001aa21, + 0x0001aa2c, + 0x0001aa30, + 0x0001aa38, + 0x0001aa42, + 0x0001aa4b, + 0x0001aa50, + 0x0001aa58, + 0x0001aa64, + 0x0001aa6a, + 0x0001aa75, + 0x0001aa7f, + 0x0001aa87, + 0x0001a8b6, + 0x0001a95f, + 0x0001aa96, + 0x0001aaa0, + 0x0001aaab, + 0x0001aab8, + 0x0001aabf, + 0x0001aac2, + 0x0001aac9, + 0x0001aacf, + 0x0001aad9, + 0x0001aae2, + 0x0001aae9, + 0x0001aaf0, + 0x0001aa7f, + 0x0001a8b6, + 0x0001a95f, + 0x0001aaf8, + 0x0001ab03, + 0x0001ab0b, + 0x0001a993, + 0x0001ab0f, + 0x0001ab1d, + 0x0001ab25, + 0x0001ab30, + 0x0001a959, + 0x0001ab39, + 0x0001ab45, + 0x0001ab50, + 0x0001ab5a, + 0x0001ab65, + 0x0001ab6c, + 0x0001ab7a, + 0x0001ab89, + 0x0001a8b6, + 0x0001ab8e, + 0x0001ab93, + 0x0001ab9d, + 0x0001aba1, + 0x0001aba9, + 0x0001abb1, + 0x0001abbb, + 0x0001a98c, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, +}; +const int fw_hevcenc_size = 353664; diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/fw_jpegdec.c b/src/little/linux/drivers/media/platform/canaan-vpu/fw_jpegdec.c new file mode 100755 index 000000000..cd40bfbef --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/fw_jpegdec.c @@ -0,0 +1,46051 @@ +const unsigned int fw_jpegdec[] __attribute__((aligned(0x1000))) = { + 0x0000eb5e, + 0x02020305, + 0x33363635, + 0x32303137, + 0x69746f4d, + 0x4a206e6f, + 0x20474550, + 0x6f636544, + 0x00726564, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x4745504a, + 0x20434544, + 0x33346332, + 0x31643430, + 0x30703172, + 0x6530302d, + 0x00306361, + 0x00000000, + 0x0002cf80, + 0x0002e000, + 0x00000012, + 0x0003dee7, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x0003c000, + 0x00003420, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x01a70d27, + 0x6ea7f07b, + 0x53fdcfff, + 0xa50207f0, + 0x25012760, + 0x25002760, + 0x0ef09b60, + 0x4fff6ea7, + 0x036101fd, + 0xa3143311, + 0x3861c510, + 0xce3860c1, + 0x1ea7f810, + 0x27ffffff, + 0x07142131, + 0x24169924, + 0x96806c40, + 0x806c2765, + 0x2724169d, + 0x03302761, + 0x27620e21, + 0x0b510720, + 0x66501952, + 0xf042ce0b, + 0x33273826, + 0x270d139d, + 0x3a13bd31, + 0x9b002706, + 0x10990ef0, + 0xff6ea70f, + 0x0233fd4f, + 0x63c5600b, + 0x9b302740, + 0x6ea70ef3, + 0xc5fd4fff, + 0x0d273863, + 0xf0e81000, + 0x1225871e, + 0x501d0127, + 0x070c1399, + 0x9d310353, + 0x32070c13, + 0x9b182c33, + 0x21a304f2, + 0xffff0ea7, + 0x270205fe, + 0x0ef29b20, + 0x059d0315, + 0x000d2708, + 0x4df19302, + 0x2d270322, + 0xf09b0400, + 0x93f10706, + 0x02f9bff1, + 0x0b361001, + 0x10050127, + 0xd0b2f093, + 0x2df39302, + 0x03c202ce, + 0x0331011e, + 0x30ca803c, + 0x1df393f9, + 0xf29302ce, + 0x0102cb18, + 0x05240321, + 0xca340331, + 0x58bef630, + 0x00270002, + 0xbe0bf09b, + 0x27000280, + 0x9b102701, + 0xff8b06f0, + 0x0000fd1e, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x01a70d27, + 0x6ea7f07b, + 0x93feffff, + 0x000213f1, + 0x937f1ce3, + 0x00020bf2, + 0x05b66001, + 0x9bfa21d2, + 0x1c030ff1, + 0xe3f21e80, + 0x04f09b01, + 0x02000d27, + 0x414ef193, + 0x012d2703, + 0x06f09b40, + 0xdebef107, + 0xff8b00a7, + 0x0000fd1e, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x01a70d27, + 0x6ea7f07b, + 0x93feffff, + 0x000193f1, + 0x937f1ce3, + 0x0007c2f2, + 0x05b66001, + 0x9bfa21d2, + 0x1c030ff1, + 0xe3f21e80, + 0x04f09b01, + 0x02000d27, + 0x6b4ef193, + 0x022d2703, + 0x06f09b40, + 0x71bef107, + 0xff8b0001, + 0x0000fd1e, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x01a70d27, + 0x6ea7f07b, + 0x93feffff, + 0x00074af1, + 0x937f1ce3, + 0x00098bf2, + 0x05b66001, + 0x9bfa21d2, + 0x1c030ff1, + 0xe3f21e80, + 0x04f09b01, + 0x02000d27, + 0x75cef193, + 0x032d2703, + 0x06f09b40, + 0x18bef107, + 0xff8b0007, + 0x0000fd1e, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x01a70d27, + 0x6ea7f07b, + 0x93feffff, + 0x000913f1, + 0x937f1ce3, + 0x000a19f2, + 0x05b66001, + 0x9bfa21d2, + 0x1c030ff1, + 0xe3f21e80, + 0x04f09b01, + 0x02000d27, + 0x8ccef193, + 0x042d2703, + 0x06f09b40, + 0xe1bef107, + 0xff8b0008, + 0xf09bfd1e, + 0x07fe0b06, + 0x4efe0b0f, + 0x25fd93f5, + 0xd0010000, + 0xf08b0506, + 0xf71ed403, + 0xf54ef58e, + 0x0016fd93, + 0x06d00100, + 0x03f08b05, + 0x8ef71ed4, + 0x000000f5, + 0x00000000, + 0x00000000, + 0xf4abfe4e, + 0x196ef493, + 0xbef41b01, + 0x930012e7, + 0x02d007f0, + 0x07be1027, + 0xfe0e000b, + 0x0018fd9e, + 0x00038214, + 0x0003822c, + 0x00100000, + 0x000380a4, + 0xf0e3f54e, + 0x24caf493, + 0x27f41b01, + 0xe74ea730, + 0x4305fefd, + 0x2ea74315, + 0x05fefddf, + 0xa7231523, + 0xfefa574e, + 0x43154305, + 0xfa4f2ea7, + 0x152305fe, + 0xff1ea723, + 0x4f27ebff, + 0x02400000, + 0x2c271415, + 0x5c12c521, + 0xfdf30ea7, + 0x270325fe, + 0xff4ea711, + 0x41c5e7ff, + 0x79f29350, + 0xfe930369, + 0x93036ab0, + 0x036ab3fc, + 0x6ab6fb93, + 0xb9fa9303, + 0x2315036a, + 0xc315e315, + 0xa315b315, + 0x03150305, + 0xe3052305, + 0xb305c305, + 0xf39ba305, + 0xff2ea70e, + 0xf493fdcf, + 0xb5fffe40, + 0x35213524, + 0xb5f49323, + 0x24c5fffe, + 0x45214530, + 0xff4ea723, + 0x4315efff, + 0x7fff2ea7, + 0x254227fd, + 0x21241524, + 0x71f69323, + 0x3da3036a, + 0x23252800, + 0x18272411, + 0x28004da3, + 0x23212415, + 0xffff4ea7, + 0x003ea3f7, + 0x23250100, + 0x6d1ef393, + 0x4041c503, + 0x13bc63c5, + 0x3ce3fef3, + 0xa731037f, + 0xfeffff0e, + 0x014804d1, + 0x43c02627, + 0xd73ff411, + 0x8f00001a, + 0x0ff39b04, + 0x1e803c03, + 0xd13027e8, + 0xbd014801, + 0xad024163, + 0xa7014203, + 0xbd402720, + 0xd5023c64, + 0xbd024862, + 0xd5023d63, + 0xbd024462, + 0xad024263, + 0xbd023e63, + 0xc0024063, + 0x2ea71113, + 0x27feffff, + 0xd1f4e846, + 0xc4014823, + 0xf293f633, + 0xa70369e0, + 0xffffff4e, + 0x43d11207, + 0x1c030628, + 0x3863d597, + 0x7f1ce302, + 0x197f2ce3, + 0x802c0324, + 0x93f921c2, + 0x0369bbf3, + 0x4c272027, + 0x03320526, + 0xa7f4c834, + 0xfef3e74e, + 0xf3ab6465, + 0xf4eb4127, + 0x643ef293, + 0x58f39303, + 0x2ce3036e, + 0x7f3ce37f, + 0x698af593, + 0x25f21503, + 0xff1ea7f3, + 0x14d1ffff, + 0x4fe60b84, + 0x2ea703cf, + 0x11fd7fff, + 0x104ca324, + 0x6cc12415, + 0x1d4027bc, + 0x53b227c4, + 0x01fe23f4, + 0xbe1c0740, + 0xb900af09, + 0xf6023c64, + 0x9603ba4f, + 0x49f393b1, + 0x32c10369, + 0x991127bc, + 0x23d16024, + 0x449601cc, + 0x1c331027, + 0x403cfc0e, + 0x248103d5, + 0xab282389, + 0x07248541, + 0x1331e0d2, + 0x19f31104, + 0x03f42134, + 0x34c2803c, + 0xa72027f7, + 0xfdebb71e, + 0x30a71205, + 0x67b2f193, + 0x14138d03, + 0xa758d3c1, + 0x2414d540, + 0x2814d501, + 0x2c14d501, + 0x3014d501, + 0xe0148d01, + 0x8d58148d, + 0x12159c14, + 0x1d251305, + 0xebb74ea7, + 0x001f27fd, + 0x150c4200, + 0x0ef29b41, + 0xebaf3ea7, + 0x273205fd, + 0x8200004f, + 0x9b34150c, + 0x38030ef2, + 0x4f273205, + 0x0cc20000, + 0xf29b3415, + 0x0538030e, + 0x004f2732, + 0x150d0200, + 0x0ef29b34, + 0x32053803, + 0x00004f27, + 0x34150d42, + 0x930ef29b, + 0x036737f4, + 0x3d274201, + 0x00270100, + 0xbe241c27, + 0x07029922, + 0x641c031d, + 0x2d270027, + 0x4abe0100, + 0xd2890299, + 0x11f19372, + 0x128d0367, + 0x98d39910, + 0x8972d189, + 0xd49974d0, + 0x3b133b62, + 0x85f29303, + 0xe02702f3, + 0x32ff4ce0, + 0x3b412703, + 0x04249d43, + 0x231d245d, + 0x5994d399, + 0x2b132b24, + 0x99247d41, + 0x249996d3, + 0x3d032b04, + 0x39402b2e, + 0x05249d23, + 0x02eb3fe6, + 0x00003f27, + 0x4f27c400, + 0xc7000000, + 0xf342f193, + 0x25143502, + 0xadf29313, + 0x24010366, + 0xc164d3c1, + 0x430bbc62, + 0x669ef393, + 0x99343503, + 0x40276e23, + 0x3ae0f405, + 0x249902ca, + 0x9630279a, + 0x9d312744, + 0xd4b9a253, + 0x2027016e, + 0x3027433b, + 0x53a6539d, + 0x27fc8bf3, + 0xac52c510, + 0x01a852c5, + 0xddf29330, + 0x549d0121, + 0xa1519da3, + 0x024c52d5, + 0xd1a4518d, + 0xbe0164d7, + 0x2702994a, + 0xff4ea731, + 0xf153f7ff, + 0x43c5fc60, + 0x2714014c, + 0x103c2720, + 0x44034205, + 0xb027f3c8, + 0x9c27a027, + 0x3b412711, + 0xe6478b4a, + 0x47008c4f, + 0x0b4e07ea, + 0x7041b94d, + 0x038e0701, + 0xff1ce081, + 0x310701ed, + 0x33334107, + 0x432b4533, + 0x01984cf1, + 0x4807ff00, + 0x42b94d0b, + 0x2ce00170, + 0x0701c7ff, + 0x33420732, + 0x2b453333, + 0x9040f143, + 0x99ff0001, + 0x46169ad4, + 0x0000cee0, + 0xe001bd10, + 0x1000000e, + 0xd4d101bd, + 0x4ddc01cc, + 0x872f0400, + 0xf53b074b, + 0x0a3f804c, + 0xfd3103ff, + 0x03822ceb, + 0x6cb1fd00, + 0x87000382, + 0x8040f543, + 0xfdff0a3f, + 0x03826c32, + 0x2c83fd00, + 0x03000382, + 0xf8a103b2, + 0x07ff68f9, + 0xbd4f6b4b, + 0xf6024264, + 0x4c53d146, + 0xff4ea702, + 0x43e5f7ff, + 0xe5023f80, + 0x023f8443, + 0xbcd4b203, + 0x3c271720, + 0x002e2720, + 0x3b2b1000, + 0x42f54b87, + 0xff0a3f80, + 0xf398b103, + 0xfb6ef253, + 0x40a72001, + 0x024864d5, + 0x024464d5, + 0x029793be, + 0x62c13027, + 0x9e638dbc, + 0x899c638d, + 0xf3932824, + 0x05029ad9, + 0x004d8363, + 0xc145c680, + 0x41dc4424, + 0xdc248123, + 0x991dc04c, + 0x4fe6a254, + 0x1c27014c, + 0xa364991f, + 0x07a66399, + 0x8b248b21, + 0xa3629d13, + 0xb9a6619d, + 0xe6024262, + 0xb901052f, + 0x07029054, + 0x33353334, + 0xe9342b43, + 0x00019c34, + 0x9c548dff, + 0x019e31e9, + 0x518dff00, + 0xa031e99e, + 0xc1ff0001, + 0x3489bc63, + 0x004d8328, + 0xc1456680, + 0x42384434, + 0x17e31703, + 0x2ff6f201, + 0xd12700b0, + 0x00aa11e0, + 0xb8be0507, + 0xf35300aa, + 0x3201fad0, + 0x04271027, + 0xe02730a7, + 0x3027230d, + 0x8d53219d, + 0x219d4e21, + 0x54239d52, + 0x8d4c2e8d, + 0x1103502e, + 0xf05c2c03, + 0x4d07dff0, + 0xf1014013, + 0x017064ad, + 0x5ebd14c6, + 0x05070176, + 0x029ad3be, + 0xfa82f253, + 0x5fbe2001, + 0x1ea70297, + 0xd1ffffff, + 0xf60b8414, + 0xa7fc354f, + 0xfd7fff3e, + 0x4ce33411, + 0x5e341510, + 0xf2e8fc32, + 0x53fb5f5e, + 0x01fa57f1, + 0xbe1c0710, + 0x07029774, + 0x24bff6b0, + 0xfc375efc, + 0xfa4af353, + 0x445e3001, + 0x41f253fe, + 0x5e2c01fa, + 0xc007fe1e, + 0x475e1207, + 0x070c07fe, + 0xfe405e21, + 0x555ed027, + 0x072481ff, + 0x004da302, + 0xbe248540, + 0x5e00a389, + 0x3027fbc9, + 0x9d104c27, + 0x1127a353, + 0x548d3027, + 0xa6529d9e, + 0x8da4538d, + 0x085e9c54, + 0x003f27ff, + 0x27e40001, + 0x0001004f, + 0xfd165ee7, + 0x5e0f1c27, + 0x1127feb5, + 0x335ef105, + 0x5ee127fd, + 0x0207fccd, + 0x00a433be, + 0x4efb845e, + 0x29f493fb, + 0xf41b0120, + 0x6fff2ea7, + 0x024d27fd, + 0x27242560, + 0x1540023d, + 0xa7402723, + 0xfdeb672e, + 0x3f272405, + 0x09830000, + 0xf1932315, + 0x93036e9c, + 0x036e77f0, + 0x6e7afe93, + 0x7dfc9303, + 0xfb93036e, + 0x15036e80, + 0x15041514, + 0x15c415e4, + 0x051405b4, + 0x05e40504, + 0x9bb405c4, + 0x28030ef4, + 0x3f272405, + 0x07040000, + 0xf49b2315, + 0x8f1ea70e, + 0x3c27fde5, + 0x1513051f, + 0x000f2714, + 0x35a00000, + 0x7f2ea710, + 0x3103fde5, + 0x24152305, + 0xeb8f1ea7, + 0x052035fd, + 0x003f2714, + 0x150d8200, + 0x0ef49b13, + 0x6e86fe93, + 0x033e0703, + 0x2e0797ec, + 0xe37f3ce3, + 0xec237f2c, + 0x03341997, + 0x32c2803c, + 0x262c27f9, + 0x6e66f393, + 0x07102703, + 0x23310542, + 0xb8340321, + 0xdb4ea7f4, + 0xe455fef3, + 0x4127f3ab, + 0x3ea7f4eb, + 0x35ebffff, + 0xa7432732, + 0xfdefff2e, + 0x027824d5, + 0x14c11207, + 0xfb48dc78, + 0x14d54427, + 0x14d50278, + 0x3027027c, + 0x06a013d5, + 0xeb872ea7, + 0x272305fd, + 0xc200004f, + 0x9b24150d, + 0x2ea70ef3, + 0x27fde60f, + 0x2405284c, + 0x4f272315, + 0x20000000, + 0x33272435, + 0x028013d5, + 0xefff1ea7, + 0x8014c1fd, + 0x27fb48dc, + 0x8014d544, + 0x8414d502, + 0xd5302702, + 0xa706a413, + 0xfdeb7f2e, + 0x4f272305, + 0x0e020000, + 0xf39b2415, + 0xef2ea70e, + 0x4c27fde5, + 0x15240529, + 0x004f2723, + 0x35200000, + 0xd5332724, + 0xa7028813, + 0xfdefff1e, + 0xdc8814c1, + 0x4427fb48, + 0x028814d5, + 0x028c14d5, + 0x13d53027, + 0x2ea706a8, + 0x05fdeb77, + 0x004f2723, + 0x150e4200, + 0x0ef39b24, + 0xe5cf2ea7, + 0x2a4c27fd, + 0x23152405, + 0x00004f27, + 0x24352000, + 0x13d53327, + 0x2ea70290, + 0xc1fdefff, + 0x48dc9024, + 0xd53427fb, + 0xd5029023, + 0x27029423, + 0xac24d540, + 0x6f2ea706, + 0x2405fdeb, + 0x00003f27, + 0x23150e82, + 0xa70ef49b, + 0xfde5af1e, + 0x052b3c27, + 0x27141513, + 0x0000003f, + 0x93133520, + 0x03700ff2, + 0xf0933027, + 0x8d036d1c, + 0x24c5e8e4, + 0xf6e38d90, + 0x24352445, + 0xc53c24c5, + 0x24c53824, + 0x6424c568, + 0x8d9424c5, + 0xe48df4e4, + 0xc2e48dc0, + 0x8dc4e48d, + 0xe48dc6e4, + 0xe0e48dc8, + 0x8de2e48d, + 0xfb0ee4e4, + 0x02a0039e, + 0xf6a3fd4e, + 0x1f16f493, + 0xa7f41b01, + 0xfd5fff3e, + 0x82024d27, + 0x83dafd93, + 0x07342503, + 0x97dc032d, + 0x3d073415, + 0xe37f2ce3, + 0xdc237f3c, + 0x03241997, + 0x23c2802c, + 0x26ec27f9, + 0x83b6f393, + 0x07202703, + 0x2332054e, + 0xb83403e1, + 0x043d27f4, + 0x3f4ea701, + 0x4325fdbf, + 0xeb472ea7, + 0x272e05fd, + 0xc200004f, + 0x9324150e, + 0x03837bf1, + 0xf3cf3ea7, + 0x15d355fe, + 0x271e051e, + 0x0ef49b40, + 0x2127f3ab, + 0x4ea7f2eb, + 0xc5fddfff, + 0x4ec5c44e, + 0x003d27c8, + 0xcc43c520, + 0x015c42d5, + 0xd4ad4027, + 0x4f070118, + 0xffff3ea7, + 0x204c03e7, + 0xd4d53e35, + 0x30270150, + 0xf0934f07, + 0x9d038340, + 0xde8db1d3, + 0x54d4d5ca, + 0x78ded501, + 0xf0ded503, + 0x1adead03, + 0x1cdead01, + 0x1edead01, + 0x20dead01, + 0x40dead01, + 0x42dead01, + 0x44dead01, + 0x48dead01, + 0xbcde8d01, + 0x8dbade8d, + 0xde8db2de, + 0xb6de8db4, + 0x8db8de8d, + 0xde8dbede, + 0xc2de8dc0, + 0x8dc4de8d, + 0x0ebec8de, + 0xf68302b2, + 0x0000fd8e, + 0xffff1ea7, + 0x4814d1fe, + 0x4242c401, + 0x11091499, + 0x07438313, + 0x87243324, + 0x87242b44, + 0x8833f133, + 0xf1ff000e, + 0x00005424, + 0x2234caff, + 0x014014b9, + 0x24f94826, + 0xff000050, + 0x4ea74736, + 0xd1ffffff, + 0xf10b7443, + 0x00005424, + 0x420127ff, + 0x0b002743, + 0x0b0127fe, + 0x272027fe, + 0xfd402739, + 0x000b7824, + 0x982103ff, + 0x93fe0bf3, + 0x031567f4, + 0x0f244001, + 0x0001a85c, + 0xfe0b0127, + 0x0f004127, + 0x0001a8cf, + 0x04074027, + 0xfc4efe0b, + 0xdc3ed007, + 0x2ea70a86, + 0x99fef40b, + 0xd4ce0824, + 0x61f4930f, + 0x43c103ae, + 0x09249944, + 0xa75f34ce, + 0xfd4fff4e, + 0x2d9d4411, + 0x93240508, + 0x03ae47f4, + 0x9d444499, + 0xfc8e0924, + 0x15f2f493, + 0x69422903, + 0xffeea740, + 0x4309fef3, + 0x0b08e199, + 0x21032b02, + 0xce4c4942, + 0xe49910d1, + 0x0a42ce09, + 0x402ee449, + 0x4ccee469, + 0xff4ea719, + 0x4311fd4f, + 0xf3ff4ea7, + 0x9d4305fe, + 0x429d084d, + 0x6d404d09, + 0x4efc8e4c, + 0xff4ea7fd, + 0x4499feff, + 0xff1ea709, + 0x4383ffff, + 0x34874103, + 0x062012d1, + 0x432b4433, + 0x004843f1, + 0x24c6ff00, + 0x0d1e4027, + 0x062c14d1, + 0x430a2127, + 0x42072027, + 0xdf6bd407, + 0x3027feab, + 0x151e2527, + 0xf91231c0, + 0x010c3c34, + 0xf146a6ff, + 0x02300014, + 0x0b44d8ff, + 0x13873103, + 0x0127f228, + 0x0027031e, + 0xfeeb0d8b, + 0xfd4efd8e, + 0xd0070419, + 0x45c61f6b, + 0x72be1976, + 0xfd0e0083, + 0x0099989e, + 0xa5be1506, + 0x141e0034, + 0x02edf353, + 0x143ef493, + 0xbe430503, + 0xbe0072ee, + 0x27008122, + 0x8ed41d41, + 0xbefe4efd, + 0xa700d574, + 0xfeffff4e, + 0xf0934411, + 0x8700f39c, + 0x8841f144, + 0xbeff000e, + 0x0e00cb48, + 0x3df79efe, + 0x6bfe4e00, + 0x9307660f, + 0x03ad2bf4, + 0x66054499, + 0xfe8d7e47, + 0x1bbe06c6, + 0xfe0e0188, + 0x012f6b9e, + 0x00940abe, + 0xc99efe0e, + 0xfe8e0082, + 0xd107fd4e, + 0x2a763f6b, + 0x93663fc6, + 0x0313d4f4, + 0x47264419, + 0xacf2f493, + 0x05449903, + 0x547e45e6, + 0xbe0546fe, + 0xbe0187e2, + 0xbe012f34, + 0xbe008031, + 0x270098f3, + 0x1e402701, + 0x3522c434, + 0x4f4b0419, + 0x930e42c0, + 0x03139cf4, + 0x44d64419, + 0xfd8e0027, + 0x0098b1be, + 0x146af493, + 0x2c40d503, + 0x28f35301, + 0x79f49302, + 0x43050313, + 0x42270127, + 0xfd8ed41d, + 0xfd8e0027, + 0xb107fb4e, + 0xc207d007, + 0x10270227, + 0xbabecf6b, + 0xbf96012f, + 0x4c8b4007, + 0x01394fe6, + 0xac76fc93, + 0x05c49903, + 0xd87e4726, + 0xbe0556fd, + 0xbe018745, + 0xbe012eb8, + 0x070074eb, + 0x86debe0c, + 0x55f49301, + 0x449903ac, + 0x204c2454, + 0x008887be, + 0xb5be051e, + 0xf4930089, + 0x9903ac40, + 0x45c60544, + 0x018735be, + 0x012e87be, + 0x0074babe, + 0xd41d4027, + 0xb2e4fb8e, + 0x4ea700e3, + 0x99feffff, + 0xfc930944, + 0x8303ac18, + 0x33348743, + 0xf9432b44, + 0x00004d42, + 0x35f393ff, + 0xf4930187, + 0x0503aa54, + 0x4122d043, + 0x00770bbe, + 0x4454c499, + 0x0c07204c, + 0x0087ccbe, + 0x0c07071e, + 0x008962be, + 0xabdefc93, + 0x54cb9903, + 0xbe50c0c5, + 0x07003503, + 0xbe0b0710, + 0x07007e1a, + 0x864abe0c, + 0x9d412701, + 0xbbbe05c4, + 0x361e0186, + 0x012e0bbe, + 0x4454c499, + 0x0c07204c, + 0x00878cbe, + 0x0c07071e, + 0x008922be, + 0xab9efc93, + 0x54cb9903, + 0xbe50c0c5, + 0x070034c3, + 0xbe0b0710, + 0x07007dda, + 0x860abe0c, + 0x81f39301, + 0x412703ab, + 0x270d349d, + 0x04349d40, + 0x0059f3be, + 0xd41d4227, + 0x4fff4ea7, + 0x274301fd, + 0x0ef49b40, + 0xffff4ea7, + 0x0e4499ff, + 0x233b2127, + 0x3ea724cb, + 0x38fd4fbf, + 0x05412721, + 0x03215334, + 0x8e22d634, + 0xa7fa4efb, + 0xffffff4e, + 0xc6274d99, + 0x1eb027d4, + 0xfd397e06, + 0x4ea7b007, + 0x11feffff, + 0x7843f944, + 0x07ff000b, + 0x233f4bc4, + 0xfff488ce, + 0xa027d32e, + 0x0ea7111e, + 0x07fff47f, + 0x072d071c, + 0xfdfa7e3b, + 0xf493a007, + 0x190311d5, + 0x86cc1944, + 0x7f0ea746, + 0x0419fff4, + 0x4d4e4f4b, + 0x2b071d07, + 0xe6fe4f7e, + 0xff3ea7a7, + 0x4127ffff, + 0x063434bd, + 0x270f3399, + 0x0ef49b40, + 0x33874127, + 0xb04034f5, + 0xc23cff02, + 0xfa8e0027, + 0x118efc93, + 0xffdea703, + 0xc001feff, + 0x0536f08b, + 0x560ad499, + 0xc8f41e47, + 0x2b7e1404, + 0xff4ea7fc, + 0x4499feff, + 0x1601270a, + 0x1e002745, + 0x27012703, + 0xff4ea730, + 0x439dfeff, + 0x4efa8e0a, + 0x56f493fe, + 0x44190311, + 0xf3934aa6, + 0x9903aa74, + 0x49660534, + 0xd6063499, + 0x04349948, + 0x591f41dc, + 0x104cd434, + 0x430ea719, + 0xd7befffb, + 0x04cc00d0, + 0x852bbe0d, + 0x2c9ebe01, + 0x8e002701, + 0x811fbefe, + 0x27077600, + 0xff4ea730, + 0x43bdfeff, + 0xf3930c08, + 0x930144c4, + 0x0310fff4, + 0xfe8e4305, + 0x10fbf493, + 0x86441903, + 0x93302745, + 0x03aa17f4, + 0x8e06439d, + 0xa7fe4efe, + 0xfdebdf2e, + 0x23053027, + 0x00004f27, + 0x24150404, + 0xa70ef39b, + 0xfdefff2e, + 0x03240c03, + 0x031e241c, + 0x2411f3e8, + 0x4c333327, + 0x1d4c5318, + 0xa7f244c0, + 0xfde7ff4e, + 0x3d274005, + 0x4315074a, + 0x42352027, + 0xe7ef4ea7, + 0x154105fd, + 0xffeea743, + 0x030bfdef, + 0x031e4235, + 0xe491f3e8, + 0x4c333327, + 0x1d4c5318, + 0xa7f244c0, + 0xfde77f4e, + 0x2d274005, + 0x4215074a, + 0x43353027, + 0x4ea7120b, + 0x05fde76f, + 0x35421541, + 0x93fe8e43, + 0x03a7dff4, + 0x1ea74001, + 0x5effffff, + 0xfc4eff6d, + 0xffffdea7, + 0x270227ff, + 0x20dcd110, + 0x2c9fbe06, + 0x80d4b901, + 0x8631270b, + 0x533027c4, + 0xc3308b41, + 0xc6438b41, + 0x8e012744, + 0xff4ea7fc, + 0x4301fd4f, + 0x40270027, + 0x270ef49b, + 0x0ed49921, + 0x24cb233b, + 0x4fbf3ea7, + 0x272138fd, + 0x53340541, + 0xd6340321, + 0x4efc8e22, + 0xffdea7fb, + 0xd499ffff, + 0xab4f3610, + 0x9bc027fb, + 0xfc9b0dfc, + 0xff3ea70e, + 0x3411fd9f, + 0x4ea30127, + 0x15040000, + 0xc322be34, + 0xff4ea700, + 0x4201fd4f, + 0xf4933127, + 0x1d030fc9, + 0x0fd29d43, + 0xbe10d39d, + 0x99000b46, + 0xfc9b0fd4, + 0x8731270e, + 0x4043f544, + 0xebff02b0, + 0x29f093fb, + 0x112703a7, + 0x379efb0e, + 0xfb8efffb, + 0xefff2ea7, + 0xe8031efd, + 0x272411f3, + 0x6a4ddc33, + 0x051ef6fc, + 0x061ef3e8, + 0xefff2ea7, + 0x272491fd, + 0x6a4ddc33, + 0xfe0beffc, + 0x0227fe4e, + 0xc6be1227, + 0x2ea7012b, + 0xb9ffffff, + 0x530b8024, + 0x38408b41, + 0x8e012741, + 0xff4ea7fe, + 0x4301fd4f, + 0x40270027, + 0x990ef49b, + 0x21270e24, + 0x24cb233b, + 0x4fbf3ea7, + 0x272138fd, + 0x53340541, + 0xd6340321, + 0x4efe8e22, + 0x21c207fb, + 0x012211c3, + 0x07b107c4, + 0xaff09310, + 0x49be00ee, + 0xbf6b00c6, + 0xc231d027, + 0xf0931d07, + 0x0300eecc, + 0xc636bed1, + 0xc4c40300, + 0x46ec0fdc, + 0xa7c027bc, + 0xfdbfffde, + 0x49e6d441, + 0x42f14c87, + 0x00011494, + 0xf0931c07, + 0xbe00eeb6, + 0x4100c610, + 0xc3f093d1, + 0x05be00ee, + 0xd15100c6, + 0xeec8f093, + 0xc5fabe00, + 0x45402700, + 0x03c103d4, + 0xc8c420dc, + 0xb6f493c8, + 0x4419030e, + 0xfb0e4506, + 0x00087d9e, + 0x769efb0e, + 0xfd4efffa, + 0x05260f6b, + 0xeea8fd93, + 0x93061e00, + 0x00eeacfd, + 0x0d072107, + 0x607e1127, + 0x271d07ff, + 0xc8f49e01, + 0x27100700, + 0x4ed81e01, + 0xffeea7f9, + 0x1ea7ffff, + 0x99feffff, + 0x14992ae3, + 0x6ba00708, + 0x27342eaf, + 0xa7f98e01, + 0xffffd72e, + 0x44d62479, + 0xf98e0227, + 0x24792379, + 0x4f4b9307, + 0x400c3027, + 0x24193127, + 0x4383c307, + 0x40f14487, + 0xff00002c, + 0x0744e499, + 0x09149d20, + 0x6b091199, + 0x071383cf, + 0x334187d1, + 0x83d42bd4, + 0xde230f2c, + 0xa6ffffb4, + 0x24e399c8, + 0x4f4b4307, + 0xe29d402c, + 0x4e0e1e24, + 0x93032723, + 0x00ee2bf1, + 0x00c86d9e, + 0x44c6d479, + 0xf98e0427, + 0x4ea7a666, + 0x27d07fff, + 0x31433531, + 0x27412044, + 0x07f98e08, + 0x10ec53e0, + 0x4107c966, + 0x43834123, + 0x44333487, + 0x44e9432b, + 0xff000052, + 0xd27d3027, + 0xd46dd35d, + 0xd23dd31d, + 0x2780ec38, + 0x04d49d41, + 0x9905de9d, + 0x202705d4, + 0x40084f4b, + 0xd4592127, + 0x4103e1c3, + 0xd45d3e07, + 0x4ea73183, + 0x07feffff, + 0x4143bdb2, + 0xc6bf6b01, + 0xff2ea7ba, + 0x23c1ffff, + 0x07c86640, + 0xc5485340, + 0x4f6b3c23, + 0x3ca744f6, + 0x0b031e20, + 0xff4ea734, + 0x43c5ffff, + 0x9d402740, + 0xd32504d4, + 0xffff4ea7, + 0x3c43d5fe, + 0xa7a93601, + 0xfeffff4e, + 0x0c4144b9, + 0x271248dc, + 0xff4ea731, + 0x4335d07f, + 0x4327071e, + 0x061ef4e8, + 0x7fff3ea7, + 0xc43431d0, + 0x1ea7f141, + 0xb9feffff, + 0x76014114, + 0xa7312745, + 0xd07fff4e, + 0x29074345, + 0xc40f2c83, + 0x3ea71b21, + 0x99ffffff, + 0x41034434, + 0x2744349d, + 0x4014bd41, + 0xff4ea701, + 0x4255d07f, + 0x00ebd0be, + 0x1ea7d419, + 0x03ffffd7, + 0x79d41d41, + 0x0f4c8314, + 0x24074123, + 0x28362fab, + 0x41031419, + 0x1319141d, + 0x34ce1439, + 0x83141913, + 0xf1448743, + 0x00002c42, + 0x0f2c83ff, + 0xa7802ca3, + 0xffffd73e, + 0x3459327d, + 0x345d4103, + 0x402705e6, + 0xa70ef49b, + 0xfd4fff3e, + 0xe63834c5, + 0x100c27b4, + 0x0c27f98e, + 0x4ef98e20, + 0xff3ea7fb, + 0x3499ffff, + 0x99469611, + 0x45f61234, + 0xa402f493, + 0xd6441903, + 0xc364be44, + 0x0f3c2700, + 0xbfff4ea7, + 0x274335fd, + 0x4ea75f3c, + 0xc5fd4fff, + 0x3c273443, + 0xff4ea7b6, + 0x43d5fdef, + 0x7abe0f04, + 0x3ea700c9, + 0x27fd9fff, + 0x80000a4e, + 0x42273415, + 0x34113425, + 0x04004da3, + 0x34213415, + 0x04004da3, + 0xd7be3425, + 0x3ea7004e, + 0x99ffffff, + 0x44c61134, + 0x211ed027, + 0x27123499, + 0x274486d1, + 0x93d6e6d0, + 0x03a393f4, + 0x45c64419, + 0x3c243499, + 0xa07e7f4c, + 0xfc667efb, + 0xffff2ea7, + 0x112499ff, + 0xffffcea7, + 0x9d4103fe, + 0x43271124, + 0x0148c4d5, + 0x4fff1ea7, + 0x271401fd, + 0x3b3b07b1, + 0x99430734, + 0x4f6b0e23, + 0x239d34ab, + 0x3c14c50e, + 0xf49b4027, + 0x7e01270e, + 0xc0bdfd47, + 0x0c580c41, + 0x100c3830, + 0xcfff4ea7, + 0x684bc5fd, + 0x4ea7dda6, + 0xd1ffffff, + 0x060b8441, + 0xff2ea718, + 0x2441fdaf, + 0x9fff3ea7, + 0x05410bfd, + 0xe3342124, + 0x3425104c, + 0x4ca33411, + 0x93341510, + 0x03a303fc, + 0x45bec019, + 0xc4190006, + 0x0d274636, + 0x21be0eb8, + 0xf4930005, + 0x0503a2e8, + 0x3b72be40, + 0x9b402700, + 0x1ea70ef4, + 0xa7feffff, + 0xfd4fff3e, + 0x014012b9, + 0x063834c5, + 0x4110b926, + 0x8304530c, + 0x9efb0e01, + 0x8e003b82, + 0xbef54efb, + 0xab004cc5, + 0xeb4127f4, + 0x2af593f4, + 0xf693030b, + 0xa703a44c, + 0xfeffff9e, + 0xcfff7ea7, + 0x7f8ea7fd, + 0x2ea7fff4, + 0xd1ffffff, + 0xa60b8423, + 0xff2ea735, + 0x2441fdaf, + 0x2405430b, + 0xffff3ea7, + 0x103499ff, + 0x0ea746f6, + 0xbeffffeb, + 0x7e00c6ce, + 0x0ea7faeb, + 0xbeffffeb, + 0x1900c69f, + 0x2744d654, + 0xbe171ed0, + 0x2701283b, + 0x64649d40, + 0x0496d127, + 0x04e6d027, + 0x649d4127, + 0x4194b965, + 0x2f4cd80c, + 0x7e00274d, + 0x94b9fc3b, + 0xc0070140, + 0x0c5845a6, + 0x83045330, + 0x3ae8be01, + 0x832c0700, + 0x2676102c, + 0x4c834c07, + 0x274dab25, + 0x27448600, + 0x6bd00701, + 0x833c07df, + 0x3556303c, + 0x0c4194b9, + 0x0e0f4cd8, + 0x0c419cbd, + 0x24e63526, + 0x74c54127, + 0x4192b968, + 0x302cd80c, + 0x09949935, + 0x34874383, + 0x432b4433, + 0x005044f9, + 0x4866ff00, + 0x014894d1, + 0x74c54124, + 0x23171e68, + 0x1242d442, + 0xffff3ea7, + 0x263499ff, + 0x01dd4fe6, + 0xd8202cfc, + 0x4194b901, + 0x104cd80c, + 0xf80fbe1b, + 0xbec007ff, + 0xf6fff44c, + 0x0701c20f, + 0x864dab4c, + 0x07012744, + 0x11df6bd0, + 0x88be239b, + 0xd5b6fff4, + 0x0a02f293, + 0x27241903, + 0x27448631, + 0x07541930, + 0x26cf6bc3, + 0x6564994e, + 0xbd198a19, + 0x649945a6, + 0xbe459605, + 0xd6fff473, + 0x1e212704, + 0x07202703, + 0x0731533d, + 0x5331c34a, + 0x9934eb41, + 0x31dc6461, + 0x9925f610, + 0x30270464, + 0x31274318, + 0x031e2307, + 0x41072127, + 0x4c8b41c3, + 0x44863027, + 0xc3073127, + 0xc28bcf6b, + 0x0139cfe6, + 0x41a3b419, + 0x5419b41d, + 0x84194506, + 0x841d41a3, + 0xf49b4027, + 0x85f3930e, + 0x34190309, + 0x2ea746f6, + 0xd1ffffff, + 0x96062024, + 0x4193b945, + 0x8334530c, + 0x27031e31, + 0x07541930, + 0xe6cf6bc3, + 0x2701274a, + 0x25b7be11, + 0x1907e601, + 0x1941d884, + 0xffff3ea7, + 0x1034d1fb, + 0x1c302702, + 0x3127104c, + 0x41c34307, + 0x031e4f6b, + 0x4c8b4027, + 0x44863027, + 0xc3073127, + 0xc866cf6b, + 0x45065419, + 0x003a14be, + 0x2ea7181e, + 0x99ffffff, + 0x30270f24, + 0x270ef39b, + 0xf5448731, + 0x02b04043, + 0xff3ea7ff, + 0x34d1fbff, + 0xfdab0210, + 0x08faf293, + 0xd6241903, + 0x2fbe774f, + 0x302700c7, + 0x141e2527, + 0xf91131c0, + 0x010c3c34, + 0xf14606ff, + 0x02300014, + 0x034458ff, + 0x30138731, + 0x4072c1f2, + 0x42073027, + 0x74c541a3, + 0x0ef39b40, + 0xff8b0007, + 0xc54072c5, + 0x4ea76073, + 0xd1ffffff, + 0xa70b8442, + 0xfd4fff4e, + 0xa66443c5, + 0xff3ea728, + 0x3441fdaf, + 0x9fff3ea7, + 0xa7420bfd, + 0xfdafff2e, + 0x34212405, + 0x25104ce3, + 0xa3341134, + 0x3415104c, + 0x00c6dfbe, + 0xb419fdeb, + 0xb41d41e3, + 0x45065419, + 0x41e38419, + 0x4027841d, + 0x270ef49b, + 0x61f39340, + 0x341d0308, + 0xa7fd495e, + 0xfd9fffde, + 0x4c83d411, + 0xbed41518, + 0xbe0049df, + 0xa700c539, + 0xfeffff4e, + 0x014144b9, + 0x31274566, + 0x7fff4ea7, + 0x934345d0, + 0x030830f4, + 0x47264419, + 0x1abe0127, + 0xfcabfff4, + 0x0003a5be, + 0x4ee3d411, + 0x15040000, + 0x27fcebd4, + 0xf403be00, + 0x27f0abff, + 0x1e252730, + 0x1331c016, + 0x0c3c34f9, + 0x42d0ff01, + 0x0014f114, + 0xd8ff0230, + 0x31030b44, + 0xf2201387, + 0x031e4127, + 0xf0eb4027, + 0xf0ab4ab6, + 0x25273027, + 0x31c0161e, + 0x3c34f913, + 0xd0ff010c, + 0x14f11442, + 0xff023000, + 0x030b44d8, + 0x20138731, + 0x1e4127f2, + 0xeb402703, + 0x274516f0, + 0x1ef4e843, + 0xe6b1bece, + 0xffbea700, + 0xdea7ffff, + 0x1efd4fff, + 0x0ef39b0b, + 0xbe38d3c5, + 0x6100e69b, + 0x563027b4, + 0xff4ea742, + 0x4201fd4f, + 0x990eb399, + 0x412711be, + 0x34eb423b, + 0xb39de123, + 0x11be9d0e, + 0xffff2ea7, + 0x092499fe, + 0x34074383, + 0x44873433, + 0x34f9342b, + 0xff000050, + 0x34f9c407, + 0xff00004f, + 0x34fd4123, + 0xff00004f, + 0x2399ebb6, + 0x44b49909, + 0x4f4b432b, + 0x862f41c8, + 0x28b4d1c5, + 0x25bc9d06, + 0x9340b4c5, + 0x039eabf4, + 0x40274101, + 0xffff0ea7, + 0x12be9dff, + 0x9d0cb49d, + 0x2e7e2ab4, + 0xbe0c07f6, + 0x1e003371, + 0xffcea717, + 0xc199ffff, + 0xcd0ea70e, + 0x62befff9, + 0x412700c6, + 0x9312c49d, + 0x0306f4f4, + 0x4d064419, + 0xffff1ea7, + 0xd61251ff, + 0x93302723, + 0x0306e0f4, + 0x4027431d, + 0x9b0bf49b, + 0x3ea70ef4, + 0x9dfd4fff, + 0x129d1012, + 0x9b33010f, + 0x21270ef4, + 0x3b0e1499, + 0xa724cb23, + 0xfd4fbf3e, + 0x41272138, + 0x21533405, + 0x25863403, + 0x4027f31e, + 0x9b0bf49b, + 0x3ea70ef4, + 0x11feffff, + 0x104c2732, + 0x0c0834bd, + 0x24fd4027, + 0xff000000, + 0xf49b4027, + 0xff4ea70e, + 0x4499ffff, + 0x7e44b612, + 0x3127f6e0, + 0x4fff4ea7, + 0x3043c5fd, + 0xfe4eff1e, + 0xffeb0ea7, + 0xc244beff, + 0xf6617e00, + 0xffeb0ea7, + 0xc215beff, + 0x5efe0e00, + 0xfe0bfb19, + 0x9dd6f293, + 0x03230103, + 0xf4937f0c, + 0xe3039dc8, + 0x030b7f0c, + 0x20054401, + 0x040b0307, + 0xfe4efe0b, + 0xe6daf093, + 0xbd5abe00, + 0xc957be00, + 0xf1efbe00, + 0x09c0beff, + 0x0f2cbe00, + 0x9efe0e00, + 0x4e005f1e, + 0xff3ea7fd, + 0x3dc1fd4f, + 0xe34d0768, + 0xc0f00f4d, + 0x6301004f, + 0xf0932256, + 0xbe00e6c6, + 0x9300bd24, + 0x00e6e8f0, + 0x71021f27, + 0x15be5663, + 0x1d0700bd, + 0xe6fdf093, + 0xc1321e00, + 0x34c17c32, + 0x004fd874, + 0x34200000, + 0x933121d8, + 0x00e695f0, + 0x00bcf3be, + 0xe734f093, + 0x5cf19300, + 0xe5be00e7, + 0xf09300bc, + 0x9300e757, + 0x00e77ff1, + 0x00bcd7be, + 0xf1930427, + 0x9e00e6e5, + 0xa700c00a, + 0xd07fff2e, + 0x24a121a1, + 0x830c4c53, + 0x4cc00f4c, + 0x24a1270f, + 0x285322a1, + 0xd00f2c83, + 0x1d831f23, + 0xf0930fff, + 0x2700e74e, + 0xbe422732, + 0x2700bc9c, + 0x78f19304, + 0xc41e00e7, + 0x24a124a1, + 0xfe4efd8e, + 0xffff3ea7, + 0x994027ff, + 0x34bd0d32, + 0x2410063a, + 0x42872027, + 0x17b441f1, + 0x01270001, + 0x00bfa99e, + 0xb007fb4e, + 0xbff6bf6b, + 0x1c7e00a0, + 0x2710beff, + 0xcd3ea700, + 0x4027fff9, + 0x343d341d, + 0xffdf3ea7, + 0x27051eff, + 0x01f4e846, + 0xa7d3563d, + 0xfd4fff4e, + 0x0e274401, + 0x33040000, + 0x0548a344, + 0x3109be34, + 0x79fc9300, + 0xc005039c, + 0xffdf0ea7, + 0xc0a5beff, + 0xb6c40100, + 0x93012745, + 0x00e733f1, + 0x00bf499e, + 0xf5db0ea7, + 0xbe1227ff, + 0x2700c4a1, + 0xd73ea740, + 0x341dffff, + 0x347d343d, + 0xffffcea7, + 0x25c49dff, + 0xc52ac49d, + 0xcdc53ccd, + 0x30eebe40, + 0xef27be00, + 0x27e1beff, + 0x09bcbe00, + 0x4db8be00, + 0x4e40be00, + 0x44cd9d00, + 0x0b81cdbd, + 0xd3be0b07, + 0x3027000f, + 0xffff4ea7, + 0x25439dff, + 0x239efb8e, + 0xbc9e004c, + 0xfd4e004d, + 0xffff4ea7, + 0x094499fe, + 0x43832027, + 0xd433d407, + 0xd42b4487, + 0xffb4de23, + 0xd70ea7ff, + 0x1427ffff, + 0x4f4b0479, + 0x04194048, + 0x24ce4383, + 0x87210318, + 0x2834f132, + 0x23ff0000, + 0x004ea321, + 0x34f58000, + 0xff000028, + 0xf1f02103, + 0xe32dbed8, + 0x9d412700, + 0xd41904d4, + 0x41033027, + 0xf39bd41d, + 0xff4ea70e, + 0x43c5fd4f, + 0x0ef39b38, + 0xffff4ea7, + 0x0e4399ff, + 0x4fbf2ea7, + 0x273138fd, + 0x53240541, + 0xd6240331, + 0x4efd8e32, + 0x4b98befe, + 0x0f13be00, + 0x9efe0e00, + 0x4e001844, + 0xbe0027fe, + 0x0e005738, + 0x0ecc9efe, + 0x4c879e00, + 0x09fd4e00, + 0x76d00704, + 0x93042745, + 0x00e63cf1, + 0x49500a1e, + 0xf1930427, + 0x9e00e65f, + 0x1100be22, + 0xfe4f5804, + 0x27ffffff, + 0x74f19304, + 0xec1e00e6, + 0x4d500429, + 0x04270100, + 0xe689f193, + 0xbedd1e00, + 0xa700e293, + 0xffffd70e, + 0x03190439, + 0x43cc432b, + 0x1101393a, + 0x090339d4, + 0x33d229de, + 0xec83104c, + 0xab31030f, + 0x3d2833e4, + 0xab138303, + 0x791187e2, + 0x2c1ef504, + 0x27ff0000, + 0x83467621, + 0x4e070fec, + 0xff804fa3, + 0x047dffff, + 0x2027031e, + 0xf49b4027, + 0xff3ea70e, + 0x34c5fd4f, + 0x27259638, + 0x4df19301, + 0x785e00e6, + 0x273301ff, + 0x0ef49b40, + 0xffff4ea7, + 0x0e4499ff, + 0x233b2127, + 0x3ea724cb, + 0x38fd4fbf, + 0x05412721, + 0xc6215334, + 0x1e340324, + 0x4efd8ef3, + 0xa5f293fe, + 0x3027039d, + 0x0ea7e027, + 0x27fffe73, + 0x0401221c, + 0x00004e83, + 0x0344d603, + 0xc4191e31, + 0x0300004e, + 0x16241913, + 0x83242146, + 0xffff004e, + 0xff004e04, + 0x03e103ff, + 0x2c03180c, + 0x0c32d410, + 0xe5363486, + 0x27ccf1f0, + 0x27fe8e00, + 0x4efe8e01, + 0x100499fb, + 0x4153d127, + 0x073803c1, + 0x3bc207b1, + 0x6bd3abd4, + 0x27cf6bbf, + 0x112c2710, + 0x413b4127, + 0x11034d8b, + 0x04994d86, + 0x33e40768, + 0x2cef03e4, + 0xc00003cd, + 0xb915ff4c, + 0xb90184e3, + 0x2b0185e4, + 0xbd4c2b3b, + 0xbd0185e4, + 0x990184e3, + 0xe4076904, + 0xef03e433, + 0x0003cd2c, + 0x15ff4cc0, + 0x0184e3b9, + 0x0185e4b9, + 0x4c2b3b2b, + 0x0185e4bd, + 0x0184e3bd, + 0xf2f00203, + 0x4efb8ea8, + 0x081499fe, + 0x41d8e107, + 0x7003993d, + 0x0fff3cc0, + 0x300b3433, + 0x018534b9, + 0x34bd4123, + 0xe2990185, + 0x33120707, + 0x70029d14, + 0x14b9100b, + 0x32070185, + 0x41033533, + 0x14bd2333, + 0x322b0185, + 0x019433f1, + 0x03c5ff00, + 0x70039974, + 0xc109e39d, + 0x26067402, + 0x300b3433, + 0x018534b9, + 0x34bd4103, + 0x02070185, + 0xfb4efe8e, + 0xb007d107, + 0xffdf0ea7, + 0xbda8beff, + 0x34d3c100, + 0x3c830127, + 0xf933330f, + 0x00007c34, + 0xa31d07ff, + 0x7c34fd44, + 0x99ff0000, + 0xd3c110d4, + 0x3b415338, + 0x681c0304, + 0xc02703ab, + 0x2711ec27, + 0x8b4c3b41, + 0x46c10340, + 0x0714194c, + 0x0b243324, + 0xff4cc02b, + 0x8523b915, + 0x8424b901, + 0x03310301, + 0x8424bd41, + 0x8523bd01, + 0x07143901, + 0x0b243324, + 0xff4cc02b, + 0x8523b915, + 0x8424b901, + 0x03310301, + 0x8424bd41, + 0x8523bd01, + 0xf0120301, + 0xd499b2fe, + 0xff4cc007, + 0x33340731, + 0x2b433335, + 0x8c34f134, + 0xe3ff0001, + 0x0300004e, + 0x00004ea3, + 0x8c34f502, + 0xc1ff0001, + 0xdd9944d4, + 0x9434f534, + 0xfdff0001, + 0x00018c3d, + 0xdf0ea7ff, + 0xfb0effff, + 0x00bcc69e, + 0x4007f94e, + 0x070f4c83, + 0x33248734, + 0x07322b35, + 0x2bd333d3, + 0x54df03d3, + 0x070003d1, + 0x07dc99a4, + 0x9007a333, + 0x0ea7ba07, + 0x23ffffdf, + 0xffff84be, + 0x00bcb5be, + 0x1cffccc0, + 0x3c074c07, + 0x35334333, + 0x34f1342b, + 0xff00018c, + 0x00004ea3, + 0x8c34f503, + 0xf9ff0001, + 0x00007ca4, + 0x0a44d8ff, + 0x11270d07, + 0xf47e2127, + 0xffccc0fd, + 0x074c073e, + 0x3343333c, + 0xf1342b35, + 0x00019434, + 0x0749a6ff, + 0x50d3c14c, + 0x4f034433, + 0x0003cd2c, + 0x018843d5, + 0xbd58d399, + 0x99018643, + 0x43bd5ad3, + 0xaaf9018c, + 0xff000080, + 0x01874abd, + 0xb499281e, + 0xc1488604, + 0xd19950d0, + 0xbe21275a, + 0xc1002c29, + 0xb29950d0, + 0x58d19904, + 0x21230403, + 0x002c18be, + 0xb49d4027, + 0x05b29904, + 0x9954d0c1, + 0x06be59d1, + 0x2027002c, + 0x9905b29d, + 0x3cc009d3, + 0x343313ff, + 0xcd2c3f03, + 0x34b90003, + 0x41230185, + 0x018534bd, + 0xb21db459, + 0xb45d4123, + 0xffffcea7, + 0x00c4b9ff, + 0x23910301, + 0x00c4bd41, + 0xacd4c101, + 0x19fcc9c5, + 0x11f19343, + 0x12d10399, + 0x41270420, + 0x42cb433b, + 0x14d53027, + 0xd3c50420, + 0xdf0ea7ac, + 0x8cbeffff, + 0xc19900bb, + 0xcd0ea70e, + 0xf90efff9, + 0x00bf249e, + 0xd007fd4e, + 0x330fdc83, + 0xdf0ea7d3, + 0x8fbeffff, + 0xd4f900bb, + 0xff00007c, + 0xa3104c3c, + 0xd4fd104c, + 0xff00007c, + 0xffdf0ea7, + 0xbb51beff, + 0xff4ea700, + 0x4199ffff, + 0xcd0ea70e, + 0xfd0efff9, + 0x00bee49e, + 0xf323f74e, + 0x20273f07, + 0x050c4c27, + 0xc8340332, + 0x15fd93f4, + 0x0ea7039a, + 0x07ffffdf, + 0xbb40be7d, + 0x6fbea700, + 0x9027fffe, + 0x7c238027, + 0x23ab0740, + 0xd8a401a4, + 0x0300004e, + 0x06d41923, + 0x09d39948, + 0x09ff3cc0, + 0x340b4f07, + 0x341d4127, + 0xc00ad399, + 0x0709ff3c, + 0x27310b1f, + 0x01341d41, + 0x004e83a4, + 0x4ee40300, + 0x89030000, + 0x76dc3900, + 0xe6b411c9, + 0xe6d47948, + 0x99d01147, + 0x212708d1, + 0x002ad8be, + 0xd279d011, + 0x0403d159, + 0xcabe2123, + 0x4027002a, + 0xbc15d47d, + 0xdc199127, + 0x40a7c9d6, + 0x9d0bd399, + 0xd49d0ad4, + 0x2135a609, + 0x2b58beb0, + 0x9d402700, + 0xd4990bd4, + 0x0145a60c, + 0x2b48beb0, + 0x9d402700, + 0xbc050cd4, + 0xd209bc25, + 0xa4012916, + 0x4ee33707, + 0x05030000, + 0x0eb28da4, + 0xf2934027, + 0x8d03994c, + 0x272b0cb4, + 0x842e3419, + 0x341d40a7, + 0xf2983103, + 0xdc038103, + 0x18bc0310, + 0x32228ce4, + 0x07d027ff, + 0x194d0b4f, + 0x07469644, + 0x0929be0d, + 0x2709ab00, + 0x27048640, + 0x6b940741, + 0xc4d1039f, + 0xa7e130dc, + 0xffffdf0e, + 0x00ba16be, + 0x4ea79666, + 0x99ffffff, + 0x0ea70e41, + 0xbefff9cd, + 0x0300bda9, + 0x4ef78ef3, + 0x050499f8, + 0x4fe6c007, + 0x089900bf, + 0x33380707, + 0x2c3f0334, + 0xb90003cd, + 0xe4018d34, + 0x00a9ff4c, + 0x018e3ab9, + 0xa0fface4, + 0xfe967e00, + 0x8922cb89, + 0xc49924cd, + 0x0fbc0306, + 0x730fdc03, + 0xc6d473b4, + 0x53d10344, + 0x070b07d1, + 0x075fbe1d, + 0xc0900700, + 0x992dff0c, + 0x4ba606c4, + 0xd804c499, + 0x75be0b41, + 0xca070006, + 0x361ed027, + 0x072944dc, + 0xbe1d070b, + 0x07000739, + 0xff0cc4c0, + 0xbe09070b, + 0x27000877, + 0x07471e40, + 0x064ebe09, + 0x07d00700, + 0x0646be0c, + 0xbe0b1e00, + 0x07000640, + 0x27ca07d0, + 0x07480700, + 0x03443338, + 0x03cd2c4f, + 0x33353300, + 0x8d49bd83, + 0xf5382b01, + 0x0001983d, + 0x8e4cbdff, + 0xf5412701, + 0x00019030, + 0x27031eff, + 0x8e040741, + 0xa7fa4ef8, + 0xffffff4e, + 0xb9fc4cc1, + 0x0b01004b, + 0xf9241ebc, + 0x00007cd4, + 0x224c83ff, + 0x270e42c4, + 0x7ed4fd41, + 0x07ff0000, + 0xfc427e0c, + 0xd4fd4027, + 0xff00007c, + 0xdc07c103, + 0x330fdc83, + 0xd4cbcad3, + 0x97daf493, + 0x03240703, + 0x07021f2d, + 0x7f2ce334, + 0x197f3ce3, + 0x803c0334, + 0x93f932c2, + 0x03963bfd, + 0xc070d399, + 0x3319ff3c, + 0xb03f0334, + 0x390003ce, + 0x3d412334, + 0x9d40a734, + 0x402770d4, + 0x7e74d4c5, + 0x0ea7fd74, + 0xbeffffdf, + 0xc100b8ca, + 0x4ea744dc, + 0x27ffffff, + 0x2043d530, + 0x0043bd0e, + 0x302d2701, + 0xfc4cc503, + 0x06244cd5, + 0xfe730ea7, + 0xbe1027ff, + 0x0700ab3e, + 0x843d033d, + 0x27202701, + 0x3205884c, + 0xf4c83403, + 0x975ff493, + 0xcdfb9303, + 0x3c270395, + 0x1da0a722, + 0x074a3d4a, + 0x104c03db, + 0xb4c1f390, + 0x9946a63c, + 0xf0933ab1, + 0x270395ec, + 0x285bbe21, + 0xc5402700, + 0x4abe3cb4, + 0x0c070007, + 0x001d9abe, + 0x0ea74027, + 0xc5ffffdf, + 0xba9d44bc, + 0x74b4c570, + 0x1c9efa0e, + 0xfa4e00b8, + 0xf093f523, + 0xbe00e014, + 0x9300b384, + 0x00e024f0, + 0x00b37bbe, + 0xfe72cea7, + 0xeafd93ff, + 0xa0270396, + 0xb123bc07, + 0xeed8be01, + 0x4b030000, + 0xd319d059, + 0xd419d123, + 0xd299d103, + 0x09d19908, + 0xf115f205, + 0xd139b201, + 0x83122c53, + 0x19f22521, + 0x10ec53c2, + 0xc2c1f235, + 0x3bf05507, + 0x45f06501, + 0x0bc2c1f2, + 0xf2751a07, + 0xcec12e07, + 0x93238303, + 0x00e00df0, + 0x19befe85, + 0xa10300b3, + 0x0310dc03, + 0xacc418cc, + 0xf0939f22, + 0xbe00e02e, + 0xa700b304, + 0xffffffce, + 0x0100c1b9, + 0x93fcc2c1, + 0x00e02df0, + 0x00b2efbe, + 0xe03af093, + 0xb2e6be00, + 0xfccbc100, + 0x0100cab9, + 0x975eab0b, + 0x7e24f900, + 0x03ff0000, + 0x963407b1, + 0x7c24f945, + 0xe6ff0000, + 0xf900814f, + 0x00007f2e, + 0x832cf9ff, + 0x99ff0000, + 0x22f907d4, + 0xff00007c, + 0xfc15fe05, + 0x2505de99, + 0x38dec1fe, + 0xde99fe35, + 0x99fe4568, + 0xfe5569de, + 0x656ade99, + 0x6bde99fe, + 0xde99fe75, + 0x99fe856c, + 0xfe956dde, + 0xa56ede99, + 0x6fde99fe, + 0xde99feb5, + 0x30fec570, + 0xc571de99, + 0xde9934fe, + 0x38fec572, + 0xc573de99, + 0xde993cfe, + 0x40fec574, + 0xc575de99, + 0xde9944fe, + 0x48fec576, + 0xc577de99, + 0x45be4cfe, + 0x4b0700b2, + 0x070f4c83, + 0x33248734, + 0x07322b35, + 0x2bd333d3, + 0x032407d3, + 0x03d154df, + 0x07233300, + 0xaff0931b, + 0xbaea00df, + 0xf503ff45, + 0xf493fa8e, + 0xa7039408, + 0x70439d30, + 0x43c53027, + 0x844d0374, + 0x03240701, + 0x07021f2d, + 0x7f2ce334, + 0x197f3ce3, + 0x803c0334, + 0x93f932c2, + 0x03956cf4, + 0xa7222c27, + 0x3d431d30, + 0x104c0343, + 0x4ea7f2a0, + 0xbdffffff, + 0x0b010143, + 0x07fc4efe, + 0x66fcabd0, + 0xdf0ea7c5, + 0x6fbeffff, + 0x3ea700b6, + 0xc1ffffff, + 0x4d22fc34, + 0x1e3fdc27, + 0x0033b918, + 0x3a4d1b01, + 0x1ed02743, + 0x0fdc830c, + 0xddf9d333, + 0xff00007c, + 0x0ea7c566, + 0xbeffffdf, + 0xeb00b61b, + 0x8e0d07fc, + 0x63f54efc, + 0x074f6bf0, + 0xdf0ea770, + 0x9107ffff, + 0x6207b307, + 0xf5c1f405, + 0x34fac130, + 0x00b619be, + 0x2c832607, + 0x0723330f, + 0x6b4027c2, + 0x84ce23bf, + 0x3327ffff, + 0x007e23fd, + 0x2bfdff00, + 0xff00007f, + 0x008224fd, + 0xc603ff00, + 0x9899c43d, + 0x0c949937, + 0xc6231b07, + 0x7d998183, + 0xe644d607, + 0xfd00ca8f, + 0x00007f21, + 0xffdce4ff, + 0xecbe00bf, + 0x08c6fff6, + 0x0ea73027, + 0x27fffe73, + 0x0201221c, + 0x83180c03, + 0x0300002e, + 0x31032506, + 0x091ef178, + 0xdf6bd307, + 0x0fffdcc4, + 0xffdf0ea7, + 0xb579beff, + 0x5e072700, + 0x4d070126, + 0x43333d07, + 0x342b3533, + 0x018c34f1, + 0x32f5ff00, + 0xff000194, + 0x00004ee3, + 0x004ea303, + 0x34f50100, + 0xff00018c, + 0x07047299, + 0x3310274d, + 0x8d32fd44, + 0x03ff0001, + 0x03cd2c4f, + 0xf520a700, + 0x00019831, + 0x8e42bdff, + 0x8d42bd01, + 0x8c34f101, + 0xf5ff0001, + 0x00019031, + 0x004ee3ff, + 0x34f50400, + 0xff00018c, + 0xed309489, + 0x00019c34, + 0x9c34e9ff, + 0x89ff0001, + 0x4c033292, + 0xed44530f, + 0x00019e32, + 0xa034edff, + 0xb1ff0001, + 0x074d1df4, + 0x077d9d4a, + 0x4d1d4b0b, + 0x42dcc419, + 0x07002711, + 0x1a65be16, + 0x19084600, + 0x1d42a3c4, + 0x965401c4, + 0x2df49346, + 0x40990392, + 0x27160726, + 0x24aabe20, + 0x01500500, + 0xa745f654, + 0xffffdf0e, + 0x00b4aabe, + 0x571e0827, + 0xc49d4127, + 0x9d402704, + 0x949905c4, + 0x0144c60c, + 0x464496f4, + 0x073d0786, + 0x3333334d, + 0xf5432b45, + 0x00019445, + 0x23c459ff, + 0x99c45d41, + 0x46b63694, + 0xdc047499, + 0xb1c30944, + 0xad1dab0b, + 0x74990e1e, + 0xc3455616, + 0xa7ab0bb1, + 0xa7a41d40, + 0xffffdf0e, + 0x00b452be, + 0xf0430027, + 0xfa4ef58e, + 0x0ea7a007, + 0xbeffffdf, + 0xbe00b462, + 0xa700213c, + 0xfeffff4e, + 0x83094499, + 0x33348743, + 0xf9432b44, + 0x00004d44, + 0x0b4403ff, + 0x0ea4ca40, + 0xffdf0ea7, + 0xb415beff, + 0x8e0b2700, + 0x832a07fa, + 0x42070f2c, + 0x43f94333, + 0xff00007c, + 0xce23c407, + 0xf6ffff84, + 0x0700aa3f, + 0x87453342, + 0x07432b32, + 0x2be333e4, + 0x54ef03e4, + 0xc10003d1, + 0xeac5ace4, + 0x1946e634, + 0x3df29341, + 0x23d10391, + 0x41270420, + 0x43cb413b, + 0x042024d5, + 0x912af493, + 0x2443d103, + 0x204bd104, + 0xab002704, + 0x53051e3b, + 0x07010331, + 0x16d183d3, + 0x874007d3, + 0x0b443330, + 0x93212734, + 0x03a18ff4, + 0x302b4101, + 0x4ea7203b, + 0x11fd4fff, + 0x93343340, + 0x0390eff4, + 0x42d52bab, + 0x130b0420, + 0xc5e410c5, + 0x4127ace1, + 0xc41d30a7, + 0xc37d4027, + 0x3d05cd9d, + 0x04cd9dc4, + 0xa707e39d, + 0xffffff3e, + 0x010034b9, + 0x3ac544b6, + 0xbd4103fc, + 0xa7010034, + 0xffffdf0e, + 0x00b346be, + 0xfa8e0027, + 0x8f0ef293, + 0x303c2703, + 0x28032419, + 0x01274124, + 0xf398fe0b, + 0xfe0b0027, + 0x03330f6b, + 0xcb9800f1, + 0xfe0b0003, + 0xfe0b0027, + 0xfd93fd4e, + 0xd1038ee4, + 0x86018cd0, + 0xb16bbe09, + 0x27402700, + 0xd4d5602c, + 0x3d07018c, + 0x42071027, + 0x21233105, + 0xf4b83403, + 0x8ebef393, + 0xad402703, + 0xad019232, + 0x8e019034, + 0x93fb4efd, + 0x038eabf3, + 0x018434d1, + 0xb107c007, + 0x40ced207, + 0x8034d10d, + 0xd1412e01, + 0x0e018834, + 0x93a63e24, + 0x038e8bf4, + 0x01884dd5, + 0x01844cd5, + 0x01804bd5, + 0xfc4efb8e, + 0x8e76fc93, + 0x8cced103, + 0xd1f06301, + 0xd10180c1, + 0xa90184c2, + 0xa90190c3, + 0x930192c4, + 0x00dbfaf0, + 0xf9befe05, + 0xf09300ad, + 0xbe00dc3a, + 0x2700adf0, + 0x11c219d0, + 0x931d07c3, + 0x00dc49f0, + 0xddbed103, + 0xc80300ad, + 0xea30dcc4, + 0xdc4bf093, + 0x0ef04300, + 0xadca9efc, + 0x93fb4e00, + 0x038e1ffd, + 0x0190d4a9, + 0xc107b007, + 0xd4a9402e, + 0x144e0192, + 0xadff237e, + 0xad0192dc, + 0x930190db, + 0x038dfff3, + 0x018c34d1, + 0x00ec4ff6, + 0x01883dd1, + 0x019234a9, + 0x018032d1, + 0x019030a9, + 0x0711d3d8, + 0x030703e4, + 0xe307e3e8, + 0x001d27e7, + 0x07081e10, + 0x27e103e4, + 0x4207801c, + 0x2cd84283, + 0x45060f20, + 0x02902d27, + 0x2d27131e, + 0x0d1e01e0, + 0x2d274506, + 0x051e0200, + 0x01802d27, + 0x070dd1d8, + 0x7f4c8342, + 0x2c0344e6, + 0x07242b80, + 0x333e9b30, + 0x07112334, + 0x03418b43, + 0x0b44c611, + 0x07342b31, + 0x07109b12, + 0x0301472e, + 0x53400721, + 0x7f4c8321, + 0x44e62123, + 0x2b800c03, + 0x1b424704, + 0x07419b4e, + 0x7f1c8314, + 0x4c0314e6, + 0x07412b80, + 0x0bd29bd0, + 0x51fc93d3, + 0xd40b038d, + 0xc4d10d07, + 0x0c030184, + 0x07049b20, + 0xbe212710, + 0x0700b15f, + 0x07e0271c, + 0x8cc0d5bc, + 0x03181e01, + 0xe63007e1, + 0x203c0324, + 0x4227322b, + 0x141d0307, + 0x0d0b1315, + 0xb4d11803, + 0x20070184, + 0xca1f2c83, + 0xf493dee4, + 0xd1038d08, + 0x27018443, + 0x1e310300, + 0x9424f918, + 0xc40003cb, + 0x41270d42, + 0x24fd0f6b, + 0x0003cb94, + 0x0103fb8e, + 0x23332007, + 0x0c27f310, + 0x6bfb8eff, + 0x0303330f, + 0x03cb940f, + 0x20041900, + 0x0b002741, + 0x1d4227fe, + 0x0b012704, + 0x27fd4efe, + 0x030d07d0, + 0xc4dd3ed1, + 0x8ef730dc, + 0xadf393fd, + 0x34d1038c, + 0x404e0184, + 0x018034d1, + 0x140e0027, + 0x0f6b0127, + 0xf293fe0b, + 0xc1038e2c, + 0x3ea74420, + 0xd5ffffff, + 0xd1062830, + 0x27062834, + 0x2c34d510, + 0xbd40a706, + 0x27010934, + 0x0a34ad40, + 0x06219d01, + 0x0b7430d5, + 0x0b08219d, + 0xf9f393fe, + 0x3299038d, + 0xe3102704, + 0xd5402722, + 0x9d03f434, + 0x329d0631, + 0x08319d04, + 0xfe4efe0b, + 0x0fd60f6b, + 0xff3ea76f, + 0x30d5ffff, + 0x30d50628, + 0x4ea7062c, + 0x1dfff9cf, + 0x27403d40, + 0x0231ad10, + 0x0f4c2701, + 0x010834bd, + 0x34bd40a7, + 0xf2930109, + 0xad038dac, + 0x27010a31, + 0x08249d40, + 0x2706209d, + 0x30d520ec, + 0x30d50b74, + 0x30bd0620, + 0x20270e80, + 0xfef33ea7, + 0x054e07ff, + 0x03e12332, + 0xa7f4b834, + 0x7b3ea740, + 0x3405fffe, + 0x8d72f493, + 0xf44ed503, + 0xa7fe8e03, + 0xffffff3e, + 0x24253499, + 0xad402742, + 0x8e010a34, + 0xa7f54efe, + 0xffffff3e, + 0xe6273499, + 0x9301264f, + 0x038d47f4, + 0xf6084499, + 0xd1011a4f, + 0xd1062830, + 0xa9062c39, + 0x2b01023e, + 0x0434a990, + 0x2b190701, + 0x1e1103e4, + 0x6a43a916, + 0x6844a901, + 0x2b430b01, + 0xcc4f8b4e, + 0x01031d41, + 0x40079123, + 0x34074183, + 0x37332487, + 0x340b322b, + 0x4e234387, + 0xf0fff9c4, + 0x4ea7d4f1, + 0x07ffffff, + 0x93702784, + 0x038ce7f6, + 0x4fff5ea7, + 0x2840d5fd, + 0x00ac5e06, + 0x062c8ad1, + 0x4a076b19, + 0x070f4c83, + 0x07e183ea, + 0x07153314, + 0x2b44872e, + 0x33ce8714, + 0x072c2b27, + 0x332e0bd1, + 0x87d12bd3, + 0xc4ce23c2, + 0xdf03fff9, + 0x0003d154, + 0x2c073a07, + 0xb5461d07, + 0xc4ad4027, + 0x641d01e8, + 0x0e818abd, + 0x00372bbe, + 0x8c8ef293, + 0x48238903, + 0xc3ad5411, + 0x84d5016a, + 0x80bd0e78, + 0x04cc0e80, + 0xc407864f, + 0x84d11403, + 0x0ea7062c, + 0x03fff9cf, + 0x2c84d541, + 0xb212be06, + 0x1e712700, + 0x034a0733, + 0x2c84d541, + 0x9b402706, + 0xd4890ef4, + 0x4823892e, + 0xf9cf0ea7, + 0x8d430bff, + 0xedbe4824, + 0x412700b1, + 0x9103641d, + 0xf0937127, + 0xf0038c30, + 0x07ff4f92, + 0x27f58e07, + 0x4ef58e00, + 0x1df493f5, + 0xf0e3038c, + 0x44990f6b, + 0xe6f02508, + 0x5e002744, + 0x3ea70290, + 0xb9ffffff, + 0x36063834, + 0x15002745, + 0x00b85ef0, + 0xc0274027, + 0xbd28ac27, + 0x5e063834, + 0xcd070095, + 0x47334d07, + 0xc40bc533, + 0x0a34c0f1, + 0xbc07ff00, + 0xfff2f3be, + 0x0a34c4f1, + 0xbe23ff00, + 0x83fff5cc, + 0x34070f4c, + 0x44873533, + 0x4307342b, + 0x432b4333, + 0xd20043f1, + 0x1b070003, + 0x2a074307, + 0x10014403, + 0x40051403, + 0xf2a84403, + 0xc564b1c1, + 0xb4c1b431, + 0xb834c568, + 0xc56cb0c1, + 0xb1c1bc30, + 0xdc31c570, + 0x8352b489, + 0x34c50f4c, + 0x54b4c1c4, + 0xc1d434c5, + 0x3bc55cbb, + 0xfd4027d8, + 0x000a28d4, + 0xdb4ea7ff, + 0x4479fff5, + 0x0ea74566, + 0xbefff5d9, + 0x2700b10c, + 0xdb0ea7c1, + 0xa6befff5, + 0xd0070123, + 0xffff0fe4, + 0xff5cffff, + 0x4ea7fc15, + 0xd1ffffff, + 0x930b7448, + 0x038b37f5, + 0xa092f693, + 0x81f79302, + 0x080702a0, + 0x016741be, + 0x4c834007, + 0x184ce418, + 0xc0070160, + 0xf620cc83, + 0x070157cf, + 0x0f4c8348, + 0x35333407, + 0x342b4487, + 0x93339307, + 0x9f03932b, + 0x0003d154, + 0x99119499, + 0x9dc10493, + 0xab4733ac, + 0xa4d39d34, + 0xd14094c1, + 0x2b03f453, + 0xc5433343, + 0x90c1c8d4, + 0xf450d540, + 0x12d3be03, + 0x0b949900, + 0xc5ccd0c5, + 0x4566d0dc, + 0x4ea3d461, + 0x65010000, + 0xb99499d4, + 0xd4614546, + 0x20004da3, + 0xd489d465, + 0xc442e490, + 0x04949900, + 0x271d44d8, + 0x28649d41, + 0xf6169499, + 0x98d1c148, + 0xd4c17105, + 0xc174159c, + 0x7025a0d0, + 0x3800a25e, + 0x1e412748, + 0x9d402703, + 0x40272864, + 0x74057425, + 0x4d077415, + 0x4c033607, + 0x01282778, + 0x05440341, + 0xa8340331, + 0x0c1c27f2, + 0x891a618d, + 0x9c891a94, + 0x5345531c, + 0x24648dc5, + 0x11266c8d, + 0xc1c49b73, + 0xac079cd0, + 0xa153030b, + 0x0a0b1c07, + 0x00cef9be, + 0xd4c17321, + 0x0bb007a0, + 0x07040743, + 0xbe0a0b1c, + 0xc100cee6, + 0x730198d4, + 0x430b2007, + 0xbd830407, + 0x2c3303ff, + 0x0b1c0716, + 0x0cbc330a, + 0xc7beb2ab, + 0x4d2700ce, + 0x1c270bbc, + 0x2df40d2c, + 0x834007f1, + 0x010fff4d, + 0x07b4abf0, + 0xbe6b8516, + 0x070025a8, + 0x44e0be09, + 0x5d549900, + 0x0d074144, + 0xbea40c03, + 0x990021e2, + 0x44e60b94, + 0x549d4227, + 0xbe080704, + 0x03ffef98, + 0xfe945e81, + 0xffff3ea7, + 0x7434d1ff, + 0x1e48ce0b, + 0x0b7438d5, + 0xf49b4027, + 0x0e33990e, + 0x4fbf2ea7, + 0x273138fd, + 0x53240541, + 0xd6240331, + 0x66f42132, + 0xfc377e46, + 0x4027f111, + 0x048601ab, + 0x4f6b4127, + 0xf011f415, + 0xf58ef0c3, + 0x0e89fc4e, + 0x26048928, + 0xdf83d107, + 0x0fffffff, + 0xc307e49b, + 0x2709deca, + 0x05240540, + 0x050f1e34, + 0x07140724, + 0xce0ebe0d, + 0x07c00500, + 0x8e0e07ed, + 0x93fb4efc, + 0x038943fd, + 0x1070d4d1, + 0xb107c007, + 0x0c2745b6, + 0x1c1dbe80, + 0x70d0d500, + 0x70d0d110, + 0x073c0710, + 0x801c274b, + 0xd5c2f293, + 0xa0cdbe00, + 0x70d0d100, + 0x9efb0e10, + 0x9e001fad, + 0x4e001fa9, + 0x05fd93fd, + 0xd3c10389, + 0x78d4c144, + 0xd499432e, + 0xbe46267c, + 0x27001f46, + 0x7cd49d40, + 0xc544d4c1, + 0xfd8e78d4, + 0x00374f9e, + 0xd007fd4e, + 0x2c271007, + 0x79f0934c, + 0xd7be038c, + 0x0806009d, + 0xf3930d07, + 0x27038c6c, + 0x0201134c, + 0x32050403, + 0xf4a83403, + 0xf4933127, + 0x9d0388b4, + 0xfd8e0a43, + 0x5d9e04c6, + 0x010700aa, + 0x1e272027, + 0x9e019000, + 0x4e00ab27, + 0xf4d3befe, + 0x2704d6ff, + 0x53fe8e01, + 0x8e018305, + 0x93fe4efe, + 0x0389c7f4, + 0x2c032407, + 0xe334073f, + 0x3ce37f2c, + 0x0334197f, + 0x32c2803c, + 0x101c27f9, + 0x89aaf393, + 0x0720a703, + 0x23320541, + 0xb8340311, + 0x55f493f4, + 0x20270388, + 0x439d30a7, + 0x8041c566, + 0x429d423d, + 0x0c419d0b, + 0x421d425d, + 0x04284d03, + 0x1e7f4ce3, + 0x0cf49b07, + 0xd0804c03, + 0x03dd944f, + 0x4027f400, + 0x930ef49b, + 0x038c47f0, + 0x0c401d27, + 0x0031b1be, + 0x8916f493, + 0x03240703, + 0x34073f2c, + 0xe37f2ce3, + 0x34197f3c, + 0xc2803c03, + 0xf393f932, + 0x27038900, + 0x0d402728, + 0xb8380334, + 0xc43c23f2, + 0x2c032307, + 0x7f2ce37f, + 0x197f3ce3, + 0x803c0334, + 0x93f932c2, + 0x038857f3, + 0x4c272027, + 0x03320520, + 0xa7f4c834, + 0xfffb430e, + 0x6abe1827, + 0x0ea700ae, + 0x27fffaf3, + 0xae5fbe14, + 0xa30ea700, + 0x1027fffa, + 0x0e802c27, + 0x9cf89efe, + 0xc1f54e00, + 0xf1a33414, + 0xdfff3ea7, + 0x27f445fd, + 0x2000004e, + 0x020834d5, + 0x34d54027, + 0x4ea70208, + 0x11fd4fff, + 0xac14c143, + 0x43c5f055, + 0x71f493ac, + 0x44990387, + 0xe0b10754, + 0x0128204c, + 0x50073027, + 0x165ef335, + 0x34bdc101, + 0x8926b889, + 0x52a928b4, + 0x849b0108, + 0x071cdc33, + 0x0459d132, + 0x038d0b01, + 0x03051e31, + 0xf0212398, + 0x0c1e03f3, + 0x4dcb9401, + 0x00004fd4, + 0x07ed1000, + 0x03a90762, + 0x07a82361, + 0xf0a8037d, + 0x402709f6, + 0xf425c807, + 0xac01271e, + 0x4707a311, + 0x4ccbf325, + 0x00004f30, + 0xc8071000, + 0xf321131e, + 0x8334b4c1, + 0xffffff3f, + 0x1c4c330f, + 0xf32534ab, + 0x4d2b4c07, + 0x40cc4fa6, + 0x073f0741, + 0x071d070b, + 0x7e34032f, + 0x8dc2fd60, + 0x4cb4c11a, + 0x040b0087, + 0x46160401, + 0xf311f401, + 0x3487432b, + 0x31a3f405, + 0x3f070305, + 0x1c070b07, + 0x34032f07, + 0x11fd377e, + 0x2bdc07f4, + 0x077d02d4, + 0x072d07d7, + 0x83f1313c, + 0xffffff2f, + 0x830b070f, + 0xffffff3f, + 0x4729be0f, + 0x218c4e00, + 0x5e7c07fd, + 0x3a07ff65, + 0x3373392b, + 0x54a939a6, + 0x26070108, + 0x2103432b, + 0x010854ad, + 0xa4111a1e, + 0x9415a301, + 0xa8039305, + 0x0a104cd4, + 0x4333f351, + 0x49c5430b, + 0x20980388, + 0x03f331f2, + 0x35310358, + 0x0db499f3, + 0x34f2f331, + 0xfd41fee5, + 0xffdf0ea7, + 0x0fdc83ff, + 0xebbed333, + 0xd3f900a8, + 0xff00007c, + 0x07b9b499, + 0x2428a323, + 0xa3230741, + 0xd4f9482c, + 0xff00007e, + 0x007cd2fd, + 0x4123ff00, + 0x007ed4fd, + 0x0ea7ff00, + 0xbeffffdf, + 0xc100a897, + 0x4ebe34b0, + 0x4ea7010d, + 0x01fd4fff, + 0x9b402743, + 0x4ea70ef4, + 0x99ffffff, + 0x21270e44, + 0x24cb233b, + 0x4fbf3ea7, + 0x272138fd, + 0x53340541, + 0xd6340321, + 0x12b49922, + 0xb4c144e6, + 0xbe410430, + 0x83fff869, + 0x4ef58ef1, + 0xb5fb93fa, + 0xb1190385, + 0x00e81fe6, + 0x2744bdc1, + 0xa7202740, + 0x0cb49d30, + 0x654ab38d, + 0x0bb49db2, + 0x834cb2c5, + 0x00000fdf, + 0x23d04c80, + 0xf0dfa3d1, + 0x03ffffff, + 0x6b11c4d1, + 0x3d874d07, + 0x432b4533, + 0x33333407, + 0xa307342b, + 0xd154af03, + 0xc3070003, + 0x1a070b07, + 0x002fa0be, + 0xcd2ccf03, + 0x51be0003, + 0x55be00aa, + 0x44be00a8, + 0xc4b900a8, + 0x45360434, + 0x0b071a07, + 0xb9fda47e, + 0xc0042fc3, + 0xb924ff3c, + 0xe6042dc4, + 0x66b39d47, + 0x042cc3b9, + 0xb39d1127, + 0x3ec4b967, + 0x27449604, + 0x33410710, + 0x9d43ab46, + 0x4d0767b4, + 0x45333d87, + 0x3407432b, + 0x342b3333, + 0xcd2c3f03, + 0x34b90003, + 0x32b9043e, + 0x1127042c, + 0x10274496, + 0x46334107, + 0xf29342ab, + 0x9d0384ec, + 0x34b95a24, + 0x10270438, + 0xb95b249d, + 0x86042d34, + 0xc1112744, + 0x40274423, + 0x241d3103, + 0xc55c219d, + 0xfa8e4423, + 0xf393fe4e, + 0x190384c0, + 0x27414434, + 0x7e341d42, + 0x1abefefb, + 0xfe0effee, + 0x4efc245e, + 0xa7d027f8, + 0xfd4fff8e, + 0x849efa93, + 0x27031e03, + 0xf30ea7d1, + 0xe6befffa, + 0xb007011c, + 0xffff0fe0, + 0x00d8ffff, + 0x14331007, + 0x051c1df9, + 0x13f1ff00, + 0xff000520, + 0x43334d07, + 0xcd2c4f03, + 0x40c10003, + 0x003f0388, + 0x15800000, + 0x8449c103, + 0x4907e107, + 0x070f4c83, + 0x87353334, + 0x07342b44, + 0x2bc333c3, + 0x54cf03c3, + 0xc10003d1, + 0xee23acc2, + 0xc1fffae4, + 0x13f1a824, + 0xff000524, + 0x431b44c6, + 0x23c5404c, + 0x1e14f9a8, + 0xc5ff0005, + 0x0401c024, + 0xfff04d5c, + 0x00004f3c, + 0x84110fff, + 0x79e024c5, + 0x994686e4, + 0x45f6b9c4, + 0xc49d4127, + 0xc3f093b9, + 0xf07e00d0, + 0x80a3c1fa, + 0x4d3b4127, + 0xa3c534eb, + 0x0ccd9980, + 0xcd9dd123, + 0x23a4590c, + 0x27a45d41, + 0x10b4fd40, + 0xa7ff0005, + 0xfffaf34e, + 0x45664479, + 0xfaf10ea7, + 0xa976beff, + 0x28dff600, + 0x44a4c1ff, + 0xff2149ee, + 0x0a071c07, + 0x5efc147e, + 0x0d07ff17, + 0xf74ef88e, + 0x4207d207, + 0xb1078007, + 0x38272027, + 0x44034205, + 0xb489f3c8, + 0x0d312712, + 0x14b189d4, + 0xb499d12d, + 0x9d343b34, + 0x84991ed3, + 0x32b98904, + 0x910344c6, + 0x84999153, + 0x04302747, + 0xc1312742, + 0x3f6b4484, + 0xff004e58, + 0x03a307ff, + 0x1e8021ad, + 0x86a1270b, + 0x13a02734, + 0x898002ad, + 0xe90730b3, + 0x030fec03, + 0x34530f3c, + 0x7a07e453, + 0xe8033703, + 0x7c834a07, + 0xe337e320, + 0xc64283e7, + 0x27456676, + 0x2702902d, + 0x181e104c, + 0x01e02d27, + 0x1e604c27, + 0x2745060f, + 0x1e02002d, + 0x802d270c, + 0x03061e01, + 0x242b802c, + 0x14331307, + 0x41071e9b, + 0x0fff4d83, + 0x1d034506, + 0x142b1000, + 0xc39bc207, + 0x0e072c47, + 0x01534207, + 0x237f4c83, + 0x0344e601, + 0x242b802c, + 0x3e074047, + 0x3c9b342b, + 0x4c834307, + 0x0344e67f, + 0x342b803c, + 0x9b30b489, + 0x03210b20, + 0x44530f4c, + 0xd215230b, + 0x990cd48d, + 0x4ff60484, + 0xb38900a5, + 0x03e90730, + 0x733103e1, + 0x03e15331, + 0xec030f3c, + 0x5334530f, + 0x033703e4, + 0xe34a07e8, + 0x83e7e337, + 0x6676c642, + 0x902d2745, + 0x104c2702, + 0x2d27181e, + 0x4c2701e0, + 0x060f1e60, + 0x002d2745, + 0x270c1e02, + 0x1e01802d, + 0x802c0306, + 0x1307242b, + 0x1e9b1433, + 0x4d834107, + 0x45060fff, + 0x10001d03, + 0xc207142b, + 0x2c47c39b, + 0x42070e07, + 0x4c830153, + 0xe601237f, + 0x802c0344, + 0x4047242b, + 0x342b3e07, + 0x43073c9b, + 0xe67f4c83, + 0x803c0344, + 0xb489342b, + 0x03209b30, + 0x0b417341, + 0x0f4c0321, + 0x4453230b, + 0xd48dd225, + 0x2484890e, + 0x9910d48d, + 0x84890683, + 0x8d430b26, + 0xb18912d4, + 0x30b08932, + 0x003348be, + 0xffff2ea7, + 0xae23a9ff, + 0x46d0550e, + 0xb024a937, + 0x0946860e, + 0x8d340ad4, + 0x24a918d4, + 0xd3290eb0, + 0xd38d430a, + 0x4ef78e1a, + 0xc5fb93f5, + 0xb3c10381, + 0xff4ea744, + 0x13a5ffff, + 0xe3264499, + 0x079107f0, + 0x20820770, + 0x145c2742, + 0x9908695e, + 0x450608b4, + 0x5e115c27, + 0xb0c1085e, + 0xefe4be44, + 0xf65007ff, + 0xc108510f, + 0x4c8344b4, + 0x3334070f, + 0x2b448735, + 0x33d30734, + 0x03d32bd3, + 0x03d154df, + 0xacd6c100, + 0x011c60d5, + 0x2054b499, + 0x0d07204c, + 0x005ee0be, + 0xe60ab499, + 0x9903a44f, + 0x4ce00a94, + 0xb9039c10, + 0xb903a5b4, + 0x9303e9b2, + 0x0296f3fa, + 0x03eab1b9, + 0xa515a505, + 0x03a6b3b9, + 0x28034103, + 0x03ebb0b9, + 0xa49d1803, + 0xb9a25d04, + 0xb903a8b4, + 0x0303ecb2, + 0x07a17d31, + 0x9da41d1b, + 0xa03d05a3, + 0x0306a29d, + 0x2704181d, + 0xbe0a0728, + 0x0700960e, + 0x109189c0, + 0xbe0e9089, + 0x27fff078, + 0x27c49641, + 0xa940ab40, + 0xc103d0be, + 0x21276cb3, + 0x20274496, + 0x3e0e1027, + 0xb3991127, + 0xa4b4b909, + 0x2721ab03, + 0x27340e10, + 0xab420711, + 0x314fe641, + 0x44b0c101, + 0x287e0123, + 0x270516f8, + 0x7b5e0f5c, + 0xe812be07, + 0xb9a459ff, + 0x3003a4b0, + 0x1e212749, + 0x27a4790b, + 0x27491030, + 0x93230731, + 0x029647f4, + 0x30274439, + 0x31274204, + 0x1f6b1307, + 0xb1072546, + 0x8021bd03, + 0xb1270b1e, + 0xb0271486, + 0x8002bd13, + 0xffff4ea7, + 0x094499fe, + 0x34874383, + 0x432b4433, + 0x9612f393, + 0x4d4df902, + 0x19ff0000, + 0x59f49333, + 0x41c10380, + 0x27d00b68, + 0x27349641, + 0x001d8340, + 0x89d43b01, + 0x93890e92, + 0x96c12710, + 0x07c02714, + 0x471b070d, + 0xf1ebbecc, + 0xbe0786ff, + 0xbeffe788, + 0x06ffef80, + 0x105c2705, + 0x0706e15e, + 0x071b070d, + 0xefcfbe2c, + 0x11fd93ff, + 0xd4a90380, + 0xfc9303d0, + 0xc50295b4, + 0xc4016cd4, + 0xd4d5c011, + 0xd4b90418, + 0x302703a4, + 0xd49d20a7, + 0x5cd39d09, + 0xd566d29d, + 0x9d041cd0, + 0xd29d5ad3, + 0x2690995b, + 0x01830353, + 0x003a0fbe, + 0x011c64d1, + 0x06074586, + 0x011c0d03, + 0x0038afbe, + 0x0d072d07, + 0x2d031907, + 0x0d0303f8, + 0x0b7e03a4, + 0x030d07fc, + 0xbe03f80d, + 0x07001523, + 0x157abe0c, + 0x27412700, + 0xd49d115c, + 0x065c5e08, + 0xb0b94027, + 0xb49d03a5, + 0xa6b4b90a, + 0x35b09d03, + 0xb936b49d, + 0xb903aab0, + 0x9d03abb4, + 0xb49d37b0, + 0xacb0b938, + 0xe0b4d103, + 0xccb1a903, + 0xadb3b903, + 0x9d2e0703, + 0xb4c539b0, + 0xc6219b40, + 0x07410736, + 0x33483331, + 0x47432b34, + 0x0bc20bc4, + 0x1eb44542, + 0x03c20708, + 0xbc4538cc, + 0x7f3ef493, + 0xe04ed103, + 0xdc40d103, + 0xd241a903, + 0xcc42a903, + 0xd443d103, + 0x9be00b03, + 0x03338721, + 0x0b07f8ed, + 0xd841a9e3, + 0x53320703, + 0x0b320b31, + 0x0c2c27e1, + 0x031e4355, + 0x41272103, + 0x4cca423b, + 0xfdf493f8, + 0x4151037e, + 0x0724429d, + 0x07130223, + 0x0c3c2721, + 0x3103031e, + 0x433b4127, + 0x93f842ca, + 0x037edff4, + 0x9d0c2c27, + 0x031e2543, + 0x41272103, + 0x4eca423b, + 0xc9f193f8, + 0x1499037e, + 0x26129d24, + 0x270c4c14, + 0x10990c4c, + 0x24149d25, + 0x270c0c14, + 0x13a90c0c, + 0x12a903b8, + 0x14b903ba, + 0x239b03eb, + 0x03ff2d03, + 0x2a534223, + 0x6b25109d, + 0x3432474f, + 0x1e230742, + 0x53230b05, + 0x85fb9321, + 0xb4b9037e, + 0xb3b903b3, + 0x453603e9, + 0xbd104c27, + 0x0703b3b4, + 0x53470342, + 0x99439b43, + 0xb3b924b0, + 0x420b03b3, + 0x439b2127, + 0xe207203b, + 0x4a334553, + 0xb1993227, + 0x0be12325, + 0x3b4307e4, + 0x13303b41, + 0x8b430b20, + 0x074e02e2, + 0x271e07e4, + 0x0670be00, + 0xdab3a900, + 0xff4ea703, + 0xbca9d07f, + 0x428103cc, + 0xb38d4027, + 0x34b49d28, + 0x2c2ac39b, + 0xb49d4127, + 0x30b4c134, + 0xb10dc4c2, + 0x7e1c07b0, + 0xb0b5f55c, + 0xa730bcc5, + 0xfd4fff4e, + 0x3c7444c1, + 0x1000004e, + 0x031e3027, + 0x43473127, + 0x41c043ab, + 0xc0415010, + 0x43c00b42, + 0x27101e0d, + 0x0d1e403c, + 0x1e903c27, + 0x503c2708, + 0xff1e031e, + 0x7dcaf493, + 0x6c43ad03, + 0xc1f49310, + 0x40b9037d, + 0x409d03a7, + 0xb5fc9307, + 0x40a7037d, + 0xc48d3027, + 0x4cc3c54a, + 0xd8269499, + 0x40270e41, + 0xa75ac49d, + 0x5bc49d40, + 0x995cc39d, + 0x4cc00a94, + 0x0c074110, + 0x03a40d03, + 0xf2931907, + 0x7e029310, + 0x1c07f9d6, + 0x9306f093, + 0xf81d0302, + 0x202c2703, + 0x009275be, + 0x412707c6, + 0xd49d0c07, + 0xf80d03bb, + 0xe9f39303, + 0x48270292, + 0x34033201, + 0x04030205, + 0x4607f4a8, + 0x93fc4c03, + 0x03813ff2, + 0x38271827, + 0x11232001, + 0x24034005, + 0xf3984403, + 0x7d32f093, + 0x1802d103, + 0xf462c504, + 0x041c03d1, + 0x89f863c5, + 0x048d2ad4, + 0x7d72590e, + 0x12938902, + 0x891ad38d, + 0xd48d1494, + 0x1692891c, + 0x891ed28d, + 0xd38d1893, + 0x30948920, + 0x8922d48d, + 0xd28d3292, + 0x35039924, + 0x990fd39d, + 0x30273694, + 0x31274496, + 0x9906d39d, + 0xd19d3704, + 0xb8d49d0c, + 0xd49d4027, + 0xc592810b, + 0x93915cd2, + 0xa160d3c5, + 0x64d4c594, + 0x9d0a9299, + 0x939904d2, + 0x05d39d0c, + 0xd4c594b1, + 0xc592b13c, + 0x939938d2, + 0x0a94990b, + 0x41833347, + 0x4307340b, + 0xd49d4f6b, + 0x5a019910, + 0x51401cdc, + 0xd804d299, + 0x03994b24, + 0xce41c35b, + 0x41072043, + 0x458342cb, + 0x991741c4, + 0xd4995c03, + 0x0e202705, + 0x07212734, + 0x0741c342, + 0x1e3f6b34, + 0x93302703, + 0x037c63f4, + 0x6b5c4499, + 0xd646663f, + 0x1e402734, + 0x62d49908, + 0x41c34183, + 0x3f6b3407, + 0x031e4307, + 0xd49d4027, + 0x9d402716, + 0x7399b9d4, + 0x13d39d1d, + 0x00401bbe, + 0x7c2ef493, + 0x6c44a903, + 0x04d39910, + 0xc5b0d0c5, + 0xd48db4d1, + 0x203c3cbc, + 0x121eb027, + 0x7b514307, + 0x9ddf4c83, + 0x422704d4, + 0x03b9d49d, + 0x01f493b1, + 0x4e99037c, + 0xffecc066, + 0x04d4997e, + 0x77104cc0, + 0x2738d0c1, + 0x1e300720, + 0xf9313810, + 0x03ce7024, + 0x0d4ece00, + 0x2103315b, + 0x11831207, + 0x051e31b6, + 0x35ff2cc4, + 0x270b9499, + 0xab243b21, + 0xff2ed420, + 0x273501ff, + 0x111c2730, + 0x433b4127, + 0x4506428b, + 0xf1983103, + 0xf493221e, + 0x99037ba8, + 0x23476744, + 0x240b4183, + 0x13ff2cc0, + 0x31533207, + 0x433b4127, + 0xd4c540ab, + 0x27131e38, + 0x30a7ff2c, + 0x7b82f493, + 0x66439d03, + 0x2c27041e, + 0xbad29dff, + 0xa7379099, + 0x08d09d40, + 0x9909d49d, + 0xd29d3892, + 0x24745911, + 0x1e402742, + 0x59f49316, + 0x4499037b, + 0x04302754, + 0x3127204c, + 0x41c34307, + 0xd49d4f6b, + 0x41fc9312, + 0xc389037b, + 0x8dc2b128, + 0x94892cd3, + 0xa8d2c510, + 0x892a748d, + 0x40270e90, + 0x9928708d, + 0x102704d3, + 0x1518739d, + 0x04d49994, + 0x53329389, + 0x5b418342, + 0x1f3c0334, + 0x4c834307, + 0xb8d2991f, + 0x02204c13, + 0x0b112724, + 0x27422732, + 0x14d49da1, + 0x0717d19d, + 0x15da9d43, + 0xc3994553, + 0x2ed48d0b, + 0x00993ff6, + 0x9944c2c1, + 0xd2c510d3, + 0x07c49934, + 0x44861027, + 0xd7031127, + 0xcc03fd05, + 0x15d72318, + 0x034107fc, + 0x07012ccd, + 0x2519070d, + 0xe73bbefc, + 0x44cd23ff, + 0x0704e601, + 0x016c5e50, + 0xca9dc461, + 0x44d4c50b, + 0x0768dc03, + 0x07d0033d, + 0x7f3ce32d, + 0x237f2ce3, + 0x341968dc, + 0xc2803c03, + 0x0d07f932, + 0x93680c03, + 0x037bc3f1, + 0xbe402c27, + 0x06010052, + 0x07b123b7, + 0x9d4f6b4b, + 0x4d0bbad4, + 0x93684499, + 0x037a63f3, + 0x9966349d, + 0x3cc0bad3, + 0xf4930eff, + 0x99037a54, + 0x3d0b6644, + 0x8968349d, + 0xfa931090, + 0x8d037a44, + 0x928928d0, + 0x44dbc10e, + 0x7926d28d, + 0x9d0b0773, + 0x74990dd3, + 0x9d190704, + 0x92890ed4, + 0x1094890e, + 0x0140a3c1, + 0x0b429b9c, + 0x074487c3, + 0xbec40b28, + 0x0100ffea, + 0x0b4b0798, + 0xc58b0b4c, + 0xd8c550d4, + 0x24a0994c, + 0x03fccd03, + 0x9958d09d, + 0x3b0726a2, + 0x615ad29d, + 0x0b7485a0, + 0xc540053c, + 0xa29954d3, + 0xfccd0325, + 0x59d29d03, + 0x9548dcc5, + 0x5ad09973, + 0x03dca4d1, + 0x890e9189, + 0x31271092, + 0x303b4c0b, + 0xb40b342b, + 0x2287219b, + 0x10270807, + 0xa385ab75, + 0x008f05be, + 0xfc9bc027, + 0x0ca4990e, + 0x0a0745f6, + 0xa3be1d07, + 0x4127ffde, + 0xc10ca49d, + 0xd4c134d3, + 0xb5735544, + 0x3078c574, + 0x9d089999, + 0xa0991979, + 0x1b709d24, + 0x9d25a299, + 0xa3411c72, + 0x2534a099, + 0x9da45173, + 0x743518d0, + 0xe304a499, + 0x04a49d42, + 0xa41d4127, + 0xbe30dcc5, + 0xbeffec01, + 0xa7009e3a, + 0xfd4fff4e, + 0x6cc54411, + 0xe864c5c0, + 0xc5a86cc5, + 0x0507b06c, + 0xf58ef0c3, + 0xf493fd4e, + 0x99037934, + 0xf9630444, + 0x4158423c, + 0xffebd0be, + 0x4b1ed027, + 0x3c033f07, + 0x2720273c, + 0x3205164c, + 0xf4c83403, + 0x20273f07, + 0x050f4c27, + 0xc8340332, + 0x3c4c27f4, + 0x07583c27, + 0x3cf38d0f, + 0x3c272407, + 0x07040b10, + 0x0af39d1f, + 0x207ef405, + 0xf6d007f7, + 0xf3297e05, + 0xf4933127, + 0x9d0378dc, + 0x0d070443, + 0xfd8ef943, + 0x0ea7fc4e, + 0xbeffffdf, + 0x27009b82, + 0xbe2c000d, + 0x93000bab, + 0x038947fc, + 0x0ea7c005, + 0xbeffffdf, + 0x27009b47, + 0x1d1c2720, + 0x42873207, + 0x430b3433, + 0xc301422b, + 0x430b4433, + 0x2103421d, + 0xfc93f148, + 0x27037890, + 0x9d302740, + 0x40a70dc4, + 0xc544c3c5, + 0xc4c53cc3, + 0xeff37e78, + 0x270c4c27, + 0x2740000d, + 0x9d100720, + 0xc49d26c4, + 0x25c49d24, + 0x009aeebe, + 0x38272027, + 0x43334207, + 0x04d040f5, + 0x2103ff00, + 0x08000d03, + 0x4ea7f368, + 0xc1fd4fff, + 0xf2936843, + 0x27037840, + 0x103c3310, + 0x219d40a7, + 0x5b249d5c, + 0x535a219d, + 0x35241c3c, + 0x10004d27, + 0x4d27051e, + 0xfc932000, + 0xad03781c, + 0xad106ac4, + 0x071068c4, + 0x5565be0c, + 0xc5402700, + 0xc49d60c4, + 0x0bfc8e5d, + 0xa7fe4efe, + 0xfffa1f1e, + 0x270c2c27, + 0x103c27e0, + 0x12031409, + 0xe40b423b, + 0xf3982103, + 0xfa234ea7, + 0x2b40a1ff, + 0x27fe8e0e, + 0xa7fe0b01, + 0xfffa233e, + 0x0e3434c1, + 0x3430c504, + 0xfb4efe0b, + 0xfa23eea7, + 0x34e4c1ff, + 0x44c6d107, + 0x3c1ed407, + 0xffff4ea7, + 0x094499fe, + 0x8324e299, + 0x33348743, + 0xf9432b44, + 0x00004d41, + 0x032803ff, + 0x271d9b12, + 0x3b100b41, + 0x0be3a142, + 0x07310214, + 0x10d10713, + 0x0000011f, + 0x00df2710, + 0xa7100000, + 0xfffa23be, + 0xd4c2b4a1, + 0xdf0ea730, + 0x09beffff, + 0x01c3009a, + 0xcf6bc007, + 0x0ea7c566, + 0xbeffffdf, + 0x07009a12, + 0xbe1d070b, + 0xa600090c, + 0xdf0ea7c5, + 0xfb0effff, + 0x0099da9e, + 0xfb4efb8e, + 0x00000e27, + 0x0725be02, + 0x23bea700, + 0x4827fffa, + 0x0524b49d, + 0x001e27b0, + 0x0b070200, + 0x000844be, + 0x0724bc99, + 0x07c6030b, + 0x04b8be1c, + 0x3b412700, + 0x8eb4b54c, + 0x930230fb, + 0x00c3d7f0, + 0xf393fe0b, + 0x270376fc, + 0x5d309d40, + 0x34c50027, + 0x30fe0b60, + 0xe3f09302, + 0xfe0b00c3, + 0x8772f393, + 0x1d402703, + 0x2704c634, + 0x27341d41, + 0x93fe0b00, + 0x03875ff4, + 0xfe0b4019, + 0xffff4ea7, + 0x8440d5ff, + 0xa708060b, + 0xfdafff2e, + 0x3ea72441, + 0x0bfd9fff, + 0x21240540, + 0x104ce334, + 0x34113425, + 0x1e104ca3, + 0xff3ea70b, + 0x3411fd9f, + 0x27104ce3, + 0x0b341500, + 0x8df493fe, + 0x40c50376, + 0x83075368, + 0xff4ea701, + 0x409dffff, + 0x0b002745, + 0x234007fe, + 0x1442d041, + 0xc01104c0, + 0x0c400e08, + 0x200c2010, + 0xc381f093, + 0x93fe0b00, + 0x03765bf4, + 0x8b564499, + 0x20459640, + 0xf093200c, + 0x0b00c38f, + 0x45f493fe, + 0x409d0376, + 0x0b002754, + 0x930230fe, + 0x00c3a2f0, + 0xf393fe0b, + 0xc4037630, + 0x34890d01, + 0xa300270e, + 0x0e348d42, + 0x3489fe0b, + 0xe300270e, + 0x0e348d42, + 0x0230fe0b, + 0xc3abf493, + 0x93141e00, + 0x038697f3, + 0x40270516, + 0x071e3015, + 0x341540a7, + 0x04074027, + 0xf493fe0b, + 0x11038680, + 0x93fe0b40, + 0x038677f3, + 0x34054027, + 0x341540a7, + 0x341d4127, + 0xfe4efe0b, + 0xf0930230, + 0x8e00c39a, + 0x964127fe, + 0x07402704, + 0x08d3be04, + 0x8e002700, + 0xbefe4efe, + 0x27fffde3, + 0x01fe8e00, + 0x5647c004, + 0xc01848d4, + 0x45542f44, + 0xe44241c0, + 0x1e009d42, + 0x2545c02d, + 0x009446e4, + 0x4cc02e1e, + 0x4c54252a, + 0x3748c02b, + 0x008449e4, + 0x4cc0281e, + 0x4cc43239, + 0x501e7945, + 0x9f1e0011, + 0x6a5e0011, + 0x5e0011fe, + 0x0011fe7f, + 0x11fe9f5e, + 0xfed35e00, + 0xe65e0011, + 0x1e0011fe, + 0x5e00119d, + 0x0011ff19, + 0xa7ff3d5e, + 0xfd4fff4e, + 0xd87444c1, + 0x0000004f, + 0x03492420, + 0xffff4ea7, + 0xae43adff, + 0x2700690e, + 0xb040ad20, + 0xa72c1e0e, + 0xfd4fff4e, + 0x3c7444c1, + 0x0000004f, + 0x14f29320, + 0x171e00c3, + 0x4ea73027, + 0x93ffffff, + 0x00c333f2, + 0x0eb643bd, + 0x779e051e, + 0x02070052, + 0xfd4efe0b, + 0x0ea7d007, + 0xbeffffdf, + 0x990097aa, + 0xd16108d0, + 0x6dbe2027, + 0xd0450007, + 0xd3110706, + 0x3419d201, + 0x420b4487, + 0xd4314005, + 0x3419d455, + 0x341d4103, + 0xffdf0ea7, + 0x9759beff, + 0x27d44100, + 0x27449600, + 0x8301c301, + 0x4efd8e01, + 0x070451fb, + 0x07d207c0, + 0x3e2422b1, + 0xa70bc6aa, + 0xfde7ff4e, + 0x4d154b05, + 0x3027c241, + 0x4ea74335, + 0x05fde7ef, + 0xa74d1542, + 0xfdefff2e, + 0x031e4335, + 0x2411f3e8, + 0x4ddc3327, + 0x41f6fc6a, + 0x0bc451c3, + 0x074d2b3d, + 0x2bc45503, + 0x8ec3450d, + 0x51fa4efb, + 0x07b0070e, + 0x07d207c3, + 0x024307a1, + 0x154e073e, + 0x96b451d4, + 0x11dc1544, + 0x05953ed2, + 0x1108a6d0, + 0x2b2c07d4, + 0x16d23524, + 0x25012725, + 0x07fa8ed2, + 0x07140b1a, + 0xff797e0b, + 0x4127d025, + 0x40270496, + 0xfa8e0407, + 0x14c1f54e, + 0x07fca334, + 0x581299b4, + 0x270fbc83, + 0xc4f0c5d1, + 0x3d07b333, + 0xc027323b, + 0xbe239107, + 0xc1ffff84, + 0xf8c15011, + 0x08f29dc4, + 0x03c4f2c1, + 0x65f335b4, + 0x07fc55f4, + 0x05fb150f, + 0x45b423f1, + 0x188c03fc, + 0xdb7e2a61, + 0x370fe6fe, + 0x59949901, + 0x3b5493c1, + 0xc5fda5d4, + 0xf49d30fc, + 0xc10f0724, + 0xb5033494, + 0x851c0c03, + 0x23f375fb, + 0xc5fcb5b5, + 0xaf7e34f4, + 0x0b0fe6fe, + 0x07780701, + 0x037a0b3f, + 0x2027383c, + 0x05204c27, + 0xc8340332, + 0x272027f4, + 0xc5ffff3d, + 0xf3c5bcf2, + 0xc0f2c5b8, + 0x0100d75e, + 0x2744d674, + 0x07071e60, + 0x0b685364, + 0x03a70768, + 0x5e5027a4, + 0xf45100ae, + 0x07384c54, + 0xfe647e0f, + 0x00c00fe6, + 0xf451fd41, + 0x2338dc03, + 0xfd45384c, + 0xdc23f455, + 0x0754e638, + 0x186c03a6, + 0xf4c1ac09, + 0x2b4cceb8, + 0x4c07c203, + 0xc4874fab, + 0xc10b1f07, + 0xc538c2c1, + 0x26d6bcf2, + 0x0f07a111, + 0x1201180b, + 0xc6fe6a7e, + 0xf0c57d0f, + 0x38c0c5bc, + 0xa309ac09, + 0x0dbcf2c1, + 0x31a129d3, + 0x15d12da4, + 0x071807d2, + 0x0ba3212d, + 0x030f0714, + 0xfe8f7e28, + 0xf3c10ec6, + 0x41a451c4, + 0x0b0f0731, + 0x07a34118, + 0x03140b2d, + 0x0c03202c, + 0xfe737e1c, + 0xc1269489, + 0x93c1c0f1, + 0x0b419b4c, + 0x0b448745, + 0x294d0543, + 0xb8fcc5d4, + 0x9489540b, + 0x4f54fa26, + 0xc0f2c1ff, + 0x031c7c03, + 0xc0f2c521, + 0xc1289489, + 0x34fac0f3, + 0x0027ff23, + 0x0ea73d1e, + 0xbeffffdf, + 0xc100954e, + 0xb2995090, + 0x58919904, + 0x21230403, + 0x000534be, + 0xc1599199, + 0xb2995490, + 0x0527be05, + 0x9d402700, + 0x412705b4, + 0xffdf0ea7, + 0x04b49dff, + 0x0094fabe, + 0xfc830427, + 0xf94ef58e, + 0xbc23b007, + 0x0b414714, + 0x0742094b, + 0x99d10730, + 0x24c62409, + 0x241e0107, + 0x41034107, + 0x0107e447, + 0x0b1c1c27, + 0x101d2beb, + 0x11271d4c, + 0xf1f00103, + 0x1e302705, + 0x03e20953, + 0x072266e2, + 0x0c4c2340, + 0x3301493b, + 0x1047c487, + 0x21234b07, + 0xc30b410b, + 0x3287420d, + 0x3c0b2007, + 0xa4271223, + 0x1b0b2d2b, + 0x3301a93b, + 0x0d0a2103, + 0xffffdfc4, + 0x270bffff, + 0x27071e21, + 0x05142d41, + 0x270123ce, + 0x2be03be1, + 0x23e30bca, + 0x07f25812, + 0x4ef98e03, + 0xc5f6a3f5, + 0x029954f0, + 0x3b312724, + 0x50f2c532, + 0x20074f07, + 0xc54cf3c5, + 0x2c2358f1, + 0x40f4c514, + 0xc1103c27, + 0x402740f1, + 0x14031405, + 0x8840f1c5, + 0xc17207f3, + 0x10274cf2, + 0x3a272123, + 0x2748f1c5, + 0xf2c50dac, + 0x64f3c560, + 0x89187889, + 0x82f01a75, + 0xf4c100ea, + 0xe345ee4c, + 0x50f1c100, + 0x3a074a07, + 0x230d4c23, + 0x413b0c3c, + 0xf1c1313b, + 0x01048754, + 0x23350b12, + 0x0bc387a1, + 0x07312702, + 0x273a3bb8, + 0x03c20b40, + 0x079507a1, + 0x036027d0, + 0x5cf3c5b1, + 0x1e44f4c5, + 0x070e0151, + 0x5b3e071f, + 0x0f3c833a, + 0x410b4387, + 0x2b264201, + 0x8b5cf4c1, + 0x07450642, + 0x1e2e0712, + 0xc11e0703, + 0x420b5cf4, + 0xc11b41ce, + 0xc20544f4, + 0x33874203, + 0x320b2f07, + 0x0344f4c5, + 0x034027c4, + 0x1e340591, + 0x03de0509, + 0x05031ed4, + 0x0304034e, + 0x05fbf061, + 0x211e3f07, + 0xca60f2c1, + 0x4607a492, + 0x41033807, + 0x840a362b, + 0x31278496, + 0x04030401, + 0xd403d405, + 0xdd1ef3a8, + 0x45463401, + 0x4027d405, + 0x3405d403, + 0x0340f2c1, + 0xed32ce34, + 0xce58f3c1, + 0x41270aa3, + 0x4027950e, + 0xc148f4c5, + 0x798d44f4, + 0x8d481b1a, + 0xf1c11874, + 0x23a10364, + 0x64f1c511, + 0x1ff67203, + 0xf0c1ff00, + 0x8ef68348, + 0xff3ea7f5, + 0x34d1ffff, + 0x400b0608, + 0x060834d5, + 0xfe0bfe0b, + 0xffff4ea7, + 0x0042b9ff, + 0xfc40c101, + 0x40073207, + 0x030f4c83, + 0x27121e31, + 0xfd010340, + 0x00007c14, + 0x234007ff, + 0x0f4c8321, + 0x13331407, + 0x1e03f3f0, + 0x7e14f909, + 0x06ff0000, + 0xff4ea740, + 0x42bdffff, + 0x40c50100, + 0x4efe0bfc, + 0x3ec007fc, + 0x0e4127b4, + 0x0740270c, + 0x4efc8e04, + 0x03c007fc, + 0xffffffcf, + 0x00cf8303, + 0x07fc0000, + 0x2720271c, + 0xe1be163c, + 0x4ea70091, + 0x27fffa23, + 0x404cc530, + 0xc53c43c5, + 0xfc8e3840, + 0xd007fa4e, + 0x4714dc23, + 0x03cd0bc2, + 0xdb9914dc, + 0x27ce0924, + 0x074b3b41, + 0x0b4223ae, + 0x32d001a3, + 0x8e0127a4, + 0x0c2c23fa, + 0xe20b2b3b, + 0x040b4e87, + 0xd8be2387, + 0x41270084, + 0xca0d0027, + 0x8e31d49d, + 0x99f74efa, + 0x41272403, + 0xf063433b, + 0x0a017407, + 0xf105d007, + 0x7333b107, + 0xc0078487, + 0xc2499027, + 0x1a070b07, + 0x91032287, + 0x0084a2be, + 0xb70ba80b, + 0x9cc4c203, + 0xd499e910, + 0x07de0124, + 0x9d4103c4, + 0xf40124d4, + 0xd405c603, + 0x1f070d07, + 0x31272c07, + 0x6d7efe05, + 0xb10596ff, + 0x3b4127d3, + 0xb5340b4c, + 0x8ef043d3, + 0x93fa4ef7, + 0x00bda1f0, + 0x008d43be, + 0xbda1f093, + 0x8d3abe00, + 0x1fbea700, + 0xdc27fffa, + 0x09a0270c, + 0x071d07b2, + 0x93cd3bc2, + 0x00bdabf0, + 0xb2033c07, + 0x008d1bbe, + 0xd103ac0b, + 0x0600bfc4, + 0xa7e1ff00, + 0xfffa23ce, + 0x9332c189, + 0x00bdb0f0, + 0x008cffbe, + 0xc3b1c1a1, + 0x4a072107, + 0xbdb7f093, + 0x0e2a2b00, + 0x8cea9efa, + 0xc1f64e00, + 0x0cc13808, + 0x240e993c, + 0xb107d007, + 0x70279027, + 0x270c6c27, + 0x06071c3c, + 0x031e362b, + 0x22270103, + 0x203b4c07, + 0x2c0b405b, + 0xf3f0415c, + 0xc2041e03, + 0x4007eb2b, + 0x470c4c23, + 0x492d0b24, + 0x0b4e3b21, + 0x87d30141, + 0x07430b44, + 0x273c0b38, + 0x034305a1, + 0x074a0711, + 0x4d403b3e, + 0x0b370321, + 0x27030ac4, + 0x07190271, + 0x3b4a0791, + 0xda42234e, + 0x76661494, + 0x0d071307, + 0x07fc097e, + 0x7e0d0710, + 0xde99feb9, + 0x90cbca24, + 0xd3c1d4a1, + 0x3cdbc53c, + 0x4b0b432b, + 0xf68ed4a5, + 0x02c1fa4e, + 0x4003c13c, + 0x04a1d107, + 0x0fffdd03, + 0x0fffdde3, + 0xa007322b, + 0x00c1d42b, + 0x07376638, + 0x07d302bd, + 0x0bcb07b3, + 0xbe1c07c2, + 0x07008fcc, + 0x7e1c070a, + 0xdb2bff35, + 0x0d07d606, + 0x07fdf67e, + 0x0e1d070a, + 0xff235efa, + 0xfa4efa8e, + 0x07310499, + 0x07a207d0, + 0xc6c107b3, + 0xfc1d7e46, + 0x0d070526, + 0x877e1c07, + 0x9d4027fb, + 0x0fd631d4, + 0x0bb2c05e, + 0xb07e0a07, + 0xc00e66fd, + 0x4c474fb3, + 0x99144c23, + 0x4d0b24d2, + 0x323b3127, + 0x31234409, + 0x3c073422, + 0x4207111e, + 0xc4424703, + 0x31033c07, + 0x3207051e, + 0x41273803, + 0xd1a1433b, + 0x31233407, + 0x13eb130b, + 0x0d07140b, + 0x89ff4b7e, + 0x0d0732d4, + 0x1c074103, + 0x0e32d48d, + 0xfb245efa, + 0xfa8e0027, + 0xd007fb4e, + 0x0ea7b107, + 0x07fffa23, + 0x7ec2071d, + 0x0616fb0e, + 0x2b071d07, + 0x0ea73c07, + 0x7efffa23, + 0x4027ff5e, + 0x8e0ef49b, + 0x07fa4efb, + 0x07a007d2, + 0x072a06b1, + 0x071a073d, + 0x230ea72b, + 0x557efffa, + 0xa70766fd, + 0xfffa23ce, + 0x2724c099, + 0x03102722, + 0x07ae3e07, + 0x7e0c0710, + 0xd81efd7d, + 0xf49b4027, + 0x07fa8e0e, + 0x0c0c2740, + 0x0103031e, + 0x203b2127, + 0xa7f824ca, + 0xffffff3e, + 0x060834d1, + 0x420b1027, + 0x060834d5, + 0x795e2227, + 0xff4ea7ff, + 0x40bdffff, + 0xfe0b0e84, + 0xffff2ea7, + 0xbd3027ff, + 0xa70e8423, + 0x39f49310, + 0x419d037e, + 0x26239d43, + 0x0b27239d, + 0xff4ea7fe, + 0x4201fd4f, + 0xac66f393, + 0xd24d2702, + 0x27340507, + 0x34150c4c, + 0x30354027, + 0x03073225, + 0x6b9e3445, + 0xfd4e0085, + 0xffff4ea7, + 0x8444b9ff, + 0xa6d0070e, + 0x99f09345, + 0x1d0700bb, + 0x008a97be, + 0xac2ef493, + 0xe23d2702, + 0x07430507, + 0x15342704, + 0x0e4d2543, + 0x85389efd, + 0xa7fe4e00, + 0xffffff4e, + 0x0e8444b9, + 0xf0934566, + 0xbe00bb8e, + 0x0e008a68, + 0xcebc9efe, + 0xa7fd4eff, + 0xffffff4e, + 0x0e8444b9, + 0x4666d007, + 0x02890131, + 0x0803890a, + 0xbb79f093, + 0x8a42be00, + 0x030d0700, + 0xcf3bbe08, + 0x8df393ff, + 0x3499037d, + 0x9d410343, + 0xfd8e4334, + 0x4ea7fb4e, + 0xb9ffffff, + 0x230e8444, + 0x07b007f1, + 0x934566d1, + 0x00bb70f0, + 0x008a0fbe, + 0xf1930f07, + 0x2700bb7d, + 0x1cbe102c, + 0xd4f60081, + 0xbb6efd93, + 0x91fc9300, + 0x4d2702ab, + 0xc40507e1, + 0x15844c27, + 0x07cb25c4, + 0x83a4be0d, + 0x03200700, + 0x0ccc0321, + 0x43273f07, + 0x34033101, + 0xc403c105, + 0x3459f4a8, + 0x1d073309, + 0xc30dc45d, + 0xab75f093, + 0x80d5be02, + 0x51f09300, + 0x6bbe02ab, + 0xf1030084, + 0xfc4efb8e, + 0xffffcea7, + 0x84c4b9ff, + 0x26d0070e, + 0x21011146, + 0x93033102, + 0x00bb18f0, + 0x00898fbe, + 0xa626c499, + 0x93042745, + 0x00bb42f1, + 0x008cbd9e, + 0x08030d07, + 0xfff5babe, + 0xdd211007, + 0xc4b90956, + 0x45660e84, + 0xbb5bf093, + 0x8962be00, + 0xf9f49300, + 0x3d2702aa, + 0x430507d3, + 0x34270407, + 0x4d254315, + 0x039efc0e, + 0x0d070084, + 0x195efc0e, + 0xa7fe4eff, + 0xffffff4e, + 0x0e8444b9, + 0xf0934566, + 0xbe00bb40, + 0x9300892c, + 0x037cc7f3, + 0x45b63419, + 0xf1930427, + 0x9e00bb3f, + 0x27008c56, + 0x8e341d40, + 0xa7fd4efe, + 0xffffff4e, + 0x0e8444b9, + 0x45e6d007, + 0x02210111, + 0xbb3df093, + 0x88f6be00, + 0x10d02100, + 0x0000000f, + 0x010f5070, + 0x27f00000, + 0x63f19304, + 0x1b9e00bb, + 0x3ea7008c, + 0x27fffe6f, + 0x221c2720, + 0x34013423, + 0x4ed83403, + 0x23030000, + 0x40ce3421, + 0x2724330d, + 0xbb24fd41, + 0x8e0003ce, + 0xce3401fd, + 0x24330d40, + 0x24fd4127, + 0x0003cebc, + 0x2103fd8e, + 0xf0183c03, + 0xfd0ecbf1, + 0x4efde95e, + 0xff4ea7fc, + 0x44b9ffff, + 0xf0e30e84, + 0x4826d007, + 0x89180e89, + 0x01091a0c, + 0x03110229, + 0xfe150421, + 0xde51fc25, + 0xbb20f093, + 0xbefe0500, + 0x93008868, + 0x02a9fff4, + 0x07de3d27, + 0x3c274305, + 0x07431520, + 0x2748030d, + 0x03020138, + 0x03420504, + 0x93f3a844, + 0x02a9dff0, + 0xfc0ef0c3, + 0x0082f59e, + 0x4ea7fc4e, + 0xb9ffffff, + 0x070e8444, + 0x0145e6d0, + 0x93021101, + 0x00bb44f0, + 0x00881fbe, + 0xa9b6fc93, + 0x270c0702, + 0x0507df4d, + 0x271d07c4, + 0x03282748, + 0xbec41508, + 0x07007f1f, + 0x9efc0e0c, + 0x4e0082b6, + 0xff4ea7fb, + 0x44b9ffff, + 0xb0070e84, + 0x45e6d107, + 0x2d070101, + 0xbb2af093, + 0x87debe00, + 0x75fc9300, + 0x0c0702a9, + 0x0bbb4d27, + 0x2d071b07, + 0xc4050803, + 0xe0becd15, + 0x0c07007e, + 0x779efb0e, + 0xfc4e0082, + 0xffff4ea7, + 0x8444b9ff, + 0xa6d0070e, + 0x18f09345, + 0x1d0700bb, + 0x0087a3be, + 0xa93afc93, + 0xe04d2702, + 0x27c40507, + 0xc415844c, + 0xc4254127, + 0x4bbe0d07, + 0x01030081, + 0x0c072007, + 0x0c031d07, + 0x7e95be0c, + 0x0e0c0700, + 0x822c9efc, + 0xa7fc4e00, + 0xffffff4e, + 0x0e8444b9, + 0x45a6d007, + 0xbae6f093, + 0xbe1d0700, + 0x93008758, + 0x02a8effc, + 0x07e04d27, + 0x4c27c405, + 0x27c41584, + 0x07c42542, + 0x8100be0d, + 0x07010300, + 0x070c0720, + 0x0c0c031d, + 0x007e4abe, + 0xfc0e0c07, + 0x0081e19e, + 0x4ea7fe4e, + 0xb9ffffff, + 0x660e8444, + 0xbcf09345, + 0x11be00ba, + 0x4ea70087, + 0x01fd4fff, + 0xa1f39342, + 0x4d2702a8, + 0x340507d1, + 0x44270307, + 0x32253415, + 0xab9efe0e, + 0xfd4e0081, + 0xffff4ea7, + 0x8444b9ff, + 0x6bd0070e, + 0x934566df, + 0x00ba97f0, + 0x0086d7be, + 0xa86ef493, + 0xd43d2702, + 0x07430507, + 0x15342704, + 0x0e4d2543, + 0x81789efd, + 0xa7fb4e00, + 0xffffffce, + 0x0e84c4b9, + 0xf4934806, + 0x19037a4c, + 0xf5f49341, + 0x42010379, + 0x79f2f493, + 0x93430103, + 0x00ba69f0, + 0x008693be, + 0x0e84c4b9, + 0x1f274ce6, + 0x1007a000, + 0x90000f27, + 0x79be1007, + 0xb0070082, + 0xc0001f27, + 0x0f271007, + 0x1007b000, + 0x008267be, + 0x1f27c007, + 0x1007e000, + 0xd0000f27, + 0x55be1007, + 0x30070082, + 0x2c071b07, + 0xba5af093, + 0x9efb0e00, + 0x8e008648, + 0xa7fb4efb, + 0xffffffce, + 0x0e84c4b9, + 0x7a7e44a6, + 0xd1fb93ff, + 0xbd190379, + 0xc4b9d996, + 0x45e60e84, + 0xba68f093, + 0xdd1d2700, + 0x861abe07, + 0xb1f49300, + 0x3d2702a7, + 0x040707dd, + 0x4d154305, + 0x0080c1be, + 0xb41d4127, + 0xfd4efb8e, + 0xffff4ea7, + 0x8444b9ff, + 0x66d0070e, + 0x4df09345, + 0xe9be00ba, + 0xf4930085, + 0x2702a780, + 0x0507e03d, + 0x25332743, + 0x0c4c0343, + 0x2c032407, + 0xe334074f, + 0x3ce37f2c, + 0x0334197f, + 0x32c2803c, + 0x59f393f9, + 0xd76602a7, + 0x15544c27, + 0x030d0734, + 0x4c270c3c, + 0x03010114, + 0x03310504, + 0x1ef4a834, + 0x15442713, + 0x03202734, + 0x4c270c3c, + 0x03320514, + 0x93f4c834, + 0x02a727f0, + 0x3f9efd0e, + 0xfb4e0080, + 0xd1070fab, + 0x1207f0a3, + 0x0de42307, + 0x014f0bb9, + 0xffffcea7, + 0x84c4b9ff, + 0x9347260e, + 0x0378b3f4, + 0xf4934301, + 0x010378b0, + 0xc8f09344, + 0x51be00b9, + 0xc4b90085, + 0x46660e84, + 0xd201d111, + 0xd421d331, + 0xb9e7f093, + 0x853abe00, + 0x84c4b900, + 0x4149260e, + 0x0bf093d2, + 0xe20700ba, + 0x42073207, + 0x530cec53, + 0x104c5333, + 0xe1831207, + 0x21832253, + 0x41833183, + 0x0dbefe05, + 0xc4b90085, + 0x46860e84, + 0x8918d189, + 0xd38916d2, + 0x0bf09314, + 0xf5be00ba, + 0xc4b90084, + 0x46260e84, + 0x8944d189, + 0xf09346d2, + 0xbe00ba17, + 0x890084e0, + 0xc3b918d4, + 0x4f8b0e84, + 0xe64b40cc, + 0x81d17135, + 0x16f093d2, + 0xc5be00ba, + 0xc4b90084, + 0x45e60e84, + 0xd2a1d191, + 0xba1ef093, + 0x84b2be00, + 0x84c4b900, + 0xc147860e, + 0xd18934de, + 0x2ed2892c, + 0x8930d389, + 0xf09332d4, + 0x0500ba12, + 0x8492befe, + 0xf0d49100, + 0x1e01ed44, + 0x7136265c, + 0x91d281d1, + 0x4ef093d3, + 0x79be00ba, + 0xc4b90084, + 0x46460e84, + 0xd2b1d1a1, + 0x9330d3c1, + 0x00ba5cf0, + 0x008463be, + 0x0e84c4b9, + 0xd1c14686, + 0x38d2c134, + 0x933cd3c1, + 0x00ba68f0, + 0x00844bbe, + 0x0e84c4b9, + 0xd1894626, + 0x42d28940, + 0xba6bf093, + 0x8436be00, + 0x34d4c100, + 0x019044e8, + 0x0e84c4b9, + 0x685ed371, + 0xba0de401, + 0xa700ae0b, + 0xffffffbe, + 0x0e84b4b9, + 0xf4934726, + 0x01037760, + 0x5df49343, + 0x44010377, + 0xba42f093, + 0x83febe00, + 0x84b4b900, + 0x1146660e, + 0x31d201d1, + 0x93d421d3, + 0x00b894f0, + 0x0083e7be, + 0x0e84b4b9, + 0xd34149e6, + 0xba54f093, + 0x07e30700, + 0x072307c3, + 0x14ec5313, + 0x5310cc53, + 0x8334532a, + 0x07c183e1, + 0x83218341, + 0x05418331, + 0xbefc15fe, + 0xb90083b4, + 0x660e84b4, + 0x51d18146, + 0x71d361d2, + 0x5ff093d4, + 0x9dbe00ba, + 0xd4710083, + 0x00f844f0, + 0x0e84b4b9, + 0xd181d361, + 0x00ec4fe6, + 0x3479310b, + 0x32393119, + 0xf0933359, + 0x8300b930, + 0x9efb0ef0, + 0xc4008374, + 0x180bbb0d, + 0xffff4ea7, + 0x8444b9ff, + 0xc34fe60e, + 0x93d30100, + 0x00ba42f0, + 0xe400b15e, + 0x990bbc0d, + 0xffcea700, + 0xc4b9ffff, + 0x47260e84, + 0x7692f493, + 0x93430103, + 0x03768ff4, + 0xf0934401, + 0xbe00ba40, + 0xb9008330, + 0x660e84c4, + 0x01d11146, + 0x21d331d2, + 0xc6f093d4, + 0x19be00b7, + 0xc4b90083, + 0x46260e84, + 0x8918d189, + 0xf0931ad2, + 0xbe00ba4c, + 0x89008304, + 0x44d01ad4, + 0x84c4b91c, + 0x9946e60e, + 0xd29920d1, + 0x22d39921, + 0x9323d499, + 0x00ba48f0, + 0x0082e3be, + 0xffffcea7, + 0x84c4b9ff, + 0x4145e60e, + 0x93d251d1, + 0x00ba58f0, + 0x0082cbbe, + 0x44d0d451, + 0x84c4b926, + 0xe6d3410e, + 0xff345e47, + 0xffff4ea7, + 0x8444b9ff, + 0x0746260e, + 0x59f09330, + 0xf08300ba, + 0xa19efb0e, + 0xf0830082, + 0xfb4efb8e, + 0x8b72f493, + 0x0a438903, + 0x07084489, + 0x2eb107c0, + 0x8e002743, + 0x7d91befb, + 0xd1f39300, + 0x34010375, + 0x400bd007, + 0x07c63405, + 0xffff4ea7, + 0x8444b9ff, + 0x0946660e, + 0x931b07c0, + 0x00ba4ff2, + 0xba4ef393, + 0xfcd47e00, + 0xd4860d07, + 0xfb8e0127, + 0xf293fc4e, + 0x0103759c, + 0xff3ea724, + 0xf063ffff, + 0x33b94123, + 0xf0050e84, + 0xd1072405, + 0x3626fc09, + 0xf2930c07, + 0x9300ba23, + 0x00ba17f3, + 0x0dfc9d7e, + 0xd64d27fc, + 0xb1fc9307, + 0xf00102a3, + 0x4027c405, + 0xc4151d07, + 0x007c8fbe, + 0xf0430c07, + 0xb79efc0e, + 0xf063007c, + 0x0bb94d27, + 0x4c27f40d, + 0x07f42d48, + 0x43f00110, + 0x4e9a1ef0, + 0x05f063fc, + 0x07fc09f0, + 0xbbcdc0d1, + 0xf3930c0b, + 0x01037524, + 0x05412334, + 0xff4ea734, + 0x44b9ffff, + 0x46260e84, + 0xf2930c07, + 0x9300b9b7, + 0x00b9baf3, + 0x0dfc317e, + 0xd54d27fc, + 0x45fc9307, + 0xf00102a3, + 0x4027c405, + 0xc4151d07, + 0x007c3cbe, + 0xf0430c07, + 0x4b9efc0e, + 0xfb4e007c, + 0x8a66f493, + 0x49436903, + 0x07c00744, + 0x27432eb1, + 0xbefb8e00, + 0x93007ea5, + 0x0374c3f4, + 0x4201d007, + 0x302704d6, + 0xc409131e, + 0x4d043027, + 0x31270bbb, + 0x41c34307, + 0x3f6b3407, + 0xf493320b, + 0x050374a0, + 0xa7d7c643, + 0xffffff4e, + 0x0e8444b9, + 0xc0094666, + 0xf2931b07, + 0x9300b928, + 0x00b936f3, + 0x07fbad7e, + 0x27d4860d, + 0x4efb8e01, + 0xff3ea7f9, + 0x34b9feff, + 0x4cf80c41, + 0xa700ee10, + 0xffffff4e, + 0x99444499, + 0x432b0933, + 0x41e84f4b, + 0xec5e00db, + 0x83130700, + 0x03133317, + 0x03de901f, + 0x49f49300, + 0x4d990374, + 0xa7c40744, + 0xffffff9e, + 0xffd7aea7, + 0x992b1eff, + 0x449642c4, + 0xc499d123, + 0x07410340, + 0x273f6b34, + 0x42c49d40, + 0x2e40c39d, + 0x1e1027b3, + 0x83130767, + 0x03133317, + 0x03de901f, + 0x011f4600, + 0xbd4fc414, + 0x50000060, + 0x9399a479, + 0x274f4b44, + 0x27400c20, + 0x2b430721, + 0x6b240742, + 0x0723232f, + 0x030f6b02, + 0xf9111e23, + 0x00004f34, + 0x0744c6ff, + 0x07181e30, + 0x070f6b0e, + 0x87338330, + 0x33e00743, + 0x03342b34, + 0xe020cee1, + 0x14993207, + 0x07342b04, + 0xec4f4b43, + 0x93ff7e41, + 0x0373aff2, + 0x06442d9d, + 0x42249919, + 0x41274876, + 0xa742249d, + 0xfeffff4e, + 0x01094499, + 0x04149d13, + 0x60bd3f04, + 0xd1230000, + 0x01442d9d, + 0x93f48b14, + 0x03737ff4, + 0x99404399, + 0x00274144, + 0x271934ce, + 0x93f98e01, + 0x03736bf4, + 0x99404399, + 0xb3ee414b, + 0x1027ff09, + 0x8eff105e, + 0xa7fd4ef9, + 0xffffffde, + 0x0e84d4b9, + 0x46c6f063, + 0x61e2f493, + 0x08429903, + 0x9326d199, + 0x00b7ecf0, + 0x007fdfbe, + 0xc426d499, + 0xf4931642, + 0x990361c8, + 0x45b60844, + 0xf1930427, + 0x9e00b803, + 0xbe008302, + 0x07ffc4af, + 0x61f1930f, + 0x1b7e0277, + 0xc6d007fd, + 0x93f00105, + 0x027753f1, + 0x1efd5b7e, + 0xff4ea7e7, + 0x44b9ffff, + 0x45660e84, + 0xb820f093, + 0x7f92be00, + 0x29f49300, + 0x3d2702a1, + 0x040707d8, + 0x4d154305, + 0x007a39be, + 0x72d2f293, + 0x40249903, + 0x41033027, + 0x9d42239d, + 0x447e4024, + 0x8ef043fe, + 0x63fd4efd, + 0x05f193f0, + 0x0f070277, + 0x07fdc97e, + 0xf9f193d0, + 0x05260276, + 0x647ef001, + 0xa7e71efd, + 0xffffff4e, + 0x0e8444b9, + 0xf0934566, + 0xbe00b7da, + 0x93007f34, + 0x02a0cbf4, + 0x07d73d27, + 0x43050407, + 0xdbbe4d15, + 0xf2930079, + 0x99037274, + 0x30274024, + 0x239d4103, + 0x40249d42, + 0x43fde67e, + 0x4efd8ef0, + 0xffdea7fd, + 0xd4b9ffff, + 0x45660e84, + 0xb7aff093, + 0x7ef2be00, + 0x26d49900, + 0x042745a6, + 0xb7b5f193, + 0x82209e00, + 0xc3dbbe00, + 0x5efd0eff, + 0xfd4eff75, + 0xffffdea7, + 0x84d4b9ff, + 0x9345660e, + 0x00b7c6f0, + 0x007ec3be, + 0x9926d299, + 0x244e27d4, + 0xf1930827, + 0x1e00b7c0, + 0xff4ea722, + 0x4499feff, + 0x87438309, + 0x2b443334, + 0x4d44f943, + 0x23ff0000, + 0x27485041, + 0xe0f19308, + 0xcb9e00b7, + 0x42270081, + 0xc427d49d, + 0xf4931822, + 0x990371d8, + 0x20274043, + 0x429d3103, + 0x40439d42, + 0x485efd0e, + 0x4efd8efd, + 0xffdea7fd, + 0xd4b9ffff, + 0x45660e84, + 0xb7bef093, + 0x7e56be00, + 0x26d29900, + 0x4e27d499, + 0x93082724, + 0x00b7baf1, + 0x0081819e, + 0xd49d4027, + 0x9326f627, + 0x03718ff3, + 0x9d403499, + 0x41034232, + 0x0e40349d, + 0xfd015efd, + 0xfb4efd8e, + 0xffff4ea7, + 0x8444b9ff, + 0xa6d0070e, + 0xc9f09345, + 0x1d0700b7, + 0x007e0bbe, + 0xe4bed516, + 0x071effc2, + 0x7bbed204, + 0xcea7ffc0, + 0x27ffffff, + 0x84c4b9b0, + 0x34cbbd0e, + 0x9345a606, + 0x00b7b3f0, + 0xe1be1d07, + 0xf393007d, + 0x9d029f78, + 0x4d2727cd, + 0x340507db, + 0x34154427, + 0x03073d25, + 0xbe26cd9d, + 0x9300787e, + 0x037117f3, + 0x9d403499, + 0x4103423b, + 0x0e40349d, + 0xfc895efb, + 0xdea7fb4e, + 0xb9ffffff, + 0x660e84d4, + 0xb6f09345, + 0x99be00b7, + 0x4ea7007d, + 0x91d07fff, + 0x104c5c44, + 0xf1930427, + 0x9e00b7b0, + 0xbe0080c2, + 0x93ffc01e, + 0x0370cff4, + 0xf4934201, + 0x010370c4, + 0xcff09341, + 0x69be00b7, + 0x1f27007d, + 0x1007a000, + 0x90000f27, + 0x55be1007, + 0xb0070079, + 0xc0001f27, + 0x0f271007, + 0x1007b000, + 0x007943be, + 0x1f27c007, + 0x1007e000, + 0xd0000f27, + 0x31be1007, + 0x30070079, + 0x2c071b07, + 0xb7b2f093, + 0x7d26be00, + 0xbd412700, + 0xa70b81d4, + 0xfd4fff4e, + 0x40274301, + 0x270ef49b, + 0x0ed499c1, + 0xc4cbc33b, + 0x4fbf3ea7, + 0x27c138fd, + 0x53340541, + 0x03c4c6c1, + 0x27f31e34, + 0x7d78414f, + 0xa7f4e801, + 0xffffff4e, + 0x0e8444b9, + 0xf09345e6, + 0x2700b126, + 0xbe07dc1d, + 0x93007cd8, + 0x029e6ff4, + 0x07dc3d27, + 0x43050407, + 0xfb0e4c15, + 0x00777d9e, + 0xdea7fd4e, + 0xb9ffffff, + 0x660e84d4, + 0x70f09345, + 0xadbe00b7, + 0xd4b9007c, + 0x45e60e84, + 0xb0e8f093, + 0xd91d2700, + 0x7c9abe07, + 0x31f49300, + 0x3d27029e, + 0x430507d9, + 0x30270407, + 0xfd0e4315, + 0x00773d9e, + 0xdea7fc4e, + 0xb9ffffff, + 0x210e84d4, + 0x1145e60c, + 0x932c0701, + 0x00b739f0, + 0x007c67be, + 0x4027c5d6, + 0x0ea8dcd5, + 0x0eacd4ad, + 0xc6d4371e, + 0xa8d4d134, + 0xacdcad0e, + 0x2749760e, + 0x100000cf, + 0x804f2710, + 0xd5101000, + 0x070ea8d4, + 0x2710270c, + 0x7bbe802c, + 0x4f270073, + 0x11223356, + 0x2740c4c5, + 0x0ef49b40, + 0xffff4ea7, + 0x8444b9ff, + 0x9345e60e, + 0x00b059f0, + 0x07e31d27, + 0x007c0bbe, + 0x9da2f493, + 0xe33d2702, + 0x07430507, + 0x15302704, + 0x9efc0e43, + 0x4e0076ae, + 0xffbea7fb, + 0xb4b9ffff, + 0xc0070e84, + 0x45a60d01, + 0xb6d9f093, + 0xbe1d0700, + 0xe0007bd8, + 0x1c03eedd, + 0xefddd401, + 0xddc02503, + 0x547a03eb, + 0xc003ecdd, + 0x4503e9dd, + 0x03eadde4, + 0x531e012e, + 0x03ecddc0, + 0xeddde47a, + 0x5e012103, + 0xdde00088, + 0x00fe03f2, + 0x03f3dd54, + 0x03f0dde0, + 0xdde400e8, + 0x010803f1, + 0xe000e45e, + 0xec03f4dd, + 0xf4ddf000, + 0xe400f203, + 0xf303f5dd, + 0x00e25e00, + 0x6ecef393, + 0x41309903, + 0xfc98f453, + 0x27832007, + 0x230b2333, + 0xf393631e, + 0x99036eb8, + 0xf4534130, + 0x2007fcef, + 0x23332783, + 0x4d1e230b, + 0x6ea2f393, + 0x41309903, + 0xfc3df453, + 0x27832007, + 0x230b2333, + 0xf393371e, + 0x99036e8c, + 0xf4534130, + 0x2007fb2d, + 0x23332783, + 0x211e230b, + 0x6e76f393, + 0x44349903, + 0x00974ff6, + 0x27413099, + 0x83200741, + 0x9d233327, + 0x230b4434, + 0xf087f453, + 0x31992405, + 0xff3ea743, + 0x219dfeff, + 0x44b49904, + 0x2b093399, + 0xcc4f4b43, + 0x4ea71141, + 0x79ffffd7, + 0x07453644, + 0x9d410341, + 0xf3930424, + 0x07036e2c, + 0x99410340, + 0x4f6b4032, + 0x2b41349d, + 0xd04f6b42, + 0x04274049, + 0xb5c0f193, + 0x0e331e00, + 0xfdf25efb, + 0x015efb0e, + 0x0e0c07fd, + 0xf0475efb, + 0xfb0e0c07, + 0x0ef0f55e, + 0xf15b5efb, + 0xfb0e0c07, + 0x07fe135e, + 0x5efb0e0c, + 0x0427f17d, + 0xb5a5f193, + 0x7dc09e00, + 0x4efb8e00, + 0xff4ea7fe, + 0x4491d07f, + 0x27104c5c, + 0xa6f19306, + 0x101e00b5, + 0xc13803c1, + 0x304c3402, + 0xf1930627, + 0x9e00b5c6, + 0x52007d96, + 0x93062732, + 0x00b5f7f1, + 0x0471f21e, + 0x00004f30, + 0x420b7000, + 0x00014f50, + 0x0627f000, + 0xb61df193, + 0x81d91e00, + 0x91471604, + 0xa1469604, + 0xb1461604, + 0xc1459604, + 0x44f63004, + 0x663c04c1, + 0x93062745, + 0x00b624f1, + 0xfe8eb61e, + 0x0289fb4e, + 0x07f1a318, + 0x832144d0, + 0x5efb0ef1, + 0x2dc0ff7f, + 0xd4591102, + 0x2711032d, + 0x01822dc0, + 0x832d544f, + 0x022dc001, + 0x2dc44601, + 0x1e380121, + 0x812dc03f, + 0x2dc03a02, + 0xc4350301, + 0x2702012d, + 0x2dd42e1e, + 0xd4128003, + 0x2480012d, + 0x11212dc0, + 0x012dc41f, + 0x181e1112, + 0x7fdf2d03, + 0x4fab4207, + 0x7fdf2d23, + 0x06274250, + 0xb5cdf193, + 0x071c1e00, + 0x0fcc53c2, + 0x4ea7c746, + 0xc1fd4fff, + 0x4e5c7444, + 0x27020000, + 0xd9f19304, + 0xbf9e00b5, + 0x2dc4007c, + 0xa7170281, + 0xfd4fff4e, + 0x5c7444c1, + 0x1000004e, + 0xf1930427, + 0x1e00b5e2, + 0x301459e2, + 0x1eb12749, + 0x2714790b, + 0x27491030, + 0x19b30731, + 0x39302714, + 0x27448611, + 0x07de4131, + 0x6b4e0703, + 0xa641830f, + 0x2746d605, + 0xe0f19306, + 0xaf1e00b5, + 0x06274566, + 0xb5fdf193, + 0x58a41e00, + 0x270300ed, + 0x1bf19306, + 0x971e00b6, + 0x12004127, + 0x14074027, + 0x0118cfe6, + 0x4c334207, + 0x1c4c5318, + 0x42c0b5e6, + 0x93062717, + 0x00b620f1, + 0x86ff755e, + 0x93062745, + 0x00b65df1, + 0x07ff695e, + 0xe6478342, + 0x1742c015, + 0xf1930627, + 0x5e00b692, + 0x4140ff56, + 0xf1930627, + 0x5e00b6b9, + 0xec58ff4a, + 0x93062730, + 0x00b6dff1, + 0x07ff3d5e, + 0xc04c834e, + 0x4b6605c6, + 0xf1930627, + 0x5e00b6f8, + 0x4653ff2a, + 0x06274250, + 0xb720f193, + 0xff1c5e00, + 0x811f41c4, + 0x30d3a1d4, + 0x0000004f, + 0x50430b70, + 0x0000014f, + 0x930627f0, + 0x00b736f1, + 0x46fefd5e, + 0x91d4713d, + 0x004f30d3, + 0x0b700000, + 0x014f5043, + 0x27f00000, + 0x7bf19306, + 0xdf5e00b7, + 0x273596fe, + 0x9bf19306, + 0xd35e00b7, + 0x810b86fe, + 0x30d3a1d4, + 0x0000004f, + 0x50430b70, + 0x0000014f, + 0x930627f0, + 0x00b7a3f1, + 0x96feb55e, + 0x93062735, + 0x00b71ff1, + 0x89fea95e, + 0xd48930d3, + 0x27344e32, + 0xc0f19306, + 0x975e00b7, + 0x34d0c1fe, + 0x43834007, + 0x06274244, + 0xb7f8f193, + 0xfe845e00, + 0x021104f8, + 0xf1930627, + 0x5e00b811, + 0x2d20fe76, + 0x2d000182, + 0x2d241102, + 0x41270102, + 0x4027031e, + 0x15d64f6b, + 0x06274666, + 0xb825f193, + 0xfe545e00, + 0xecfc44e6, + 0x0701d430, + 0xc04c834e, + 0x27814c50, + 0x39f19306, + 0x3b5e00b8, + 0x40d489fe, + 0x06274596, + 0xb851f193, + 0xfe2c5e00, + 0x9642d389, + 0x93062735, + 0x00b86ef1, + 0x07fe1d5e, + 0x07b183be, + 0xe6130704, + 0x10ec58b5, + 0x01530103, + 0x1103051e, + 0x2dc01153, + 0xd4640301, + 0x2e03022d, + 0x01212de0, + 0x2d5400b8, + 0x2de00122, + 0x00b60102, + 0x01042de4, + 0xb15e00c8, + 0x012dc000, + 0x2de07302, + 0x00820281, + 0x01822de4, + 0x9d5e00b4, + 0x212de000, + 0xd4008b11, + 0x1511222d, + 0x11022de0, + 0x2de00088, + 0x00861104, + 0x03212de4, + 0x2f1e0094, + 0x21042dc0, + 0x042dc078, + 0x2de47331, + 0x00821201, + 0x4007331e, + 0x41033107, + 0x41533103, + 0xc3273153, + 0xf355f425, + 0xf415f005, + 0xf345f135, + 0x41076d1e, + 0x41534103, + 0xc3273047, + 0xf025f305, + 0xf015f455, + 0x491ef135, + 0x1103f135, + 0x40271153, + 0xf015c227, + 0xf455f145, + 0x151ef005, + 0x1103f135, + 0x11533047, + 0xc2274027, + 0xf145f315, + 0xf305f455, + 0x2b1ef425, + 0x30871103, + 0x071e1153, + 0x031e3047, + 0x40273087, + 0xf305c127, + 0xf455f135, + 0xf425f415, + 0x0b1ef445, + 0xf1930627, + 0x5e00b794, + 0x0d07fd16, + 0xe027df07, + 0xdc031027, + 0x61cec20c, + 0x410b4f07, + 0x04c14201, + 0x27245234, + 0x99f19306, + 0xf35e00b7, + 0x0b4d07fc, + 0x71430141, + 0x30329b04, + 0x0000004f, + 0x50430b70, + 0x0000014f, + 0x930627f0, + 0x00b7a1f1, + 0xa1fcd15e, + 0x30b76604, + 0x0000004f, + 0xd0430b70, + 0x0000014f, + 0x062738f0, + 0xb7b1f193, + 0xfcb45e00, + 0x062749a6, + 0xb7d2f193, + 0xfca85e00, + 0x44d60471, + 0x458604a1, + 0xf1930627, + 0x5e00b7f4, + 0x04c1fc96, + 0x27458634, + 0x0df19306, + 0x875e00b8, + 0x03e103fc, + 0xc0040314, + 0x725e0ee3, + 0x930627ff, + 0x00b81ef1, + 0x83fc715e, + 0x4efb8ef1, + 0x272007fe, + 0x30f09310, + 0x84be00b8, + 0x3ea7ffaf, + 0x27ffffff, + 0x8134bd41, + 0xff4ea70b, + 0x4201fd4f, + 0xf49b4027, + 0x0e34990e, + 0x323b3127, + 0x2ea734cb, + 0x38fd4fbf, + 0x05412731, + 0x03315324, + 0x2732d624, + 0x7d78414f, + 0x8ef4e801, + 0x0bfe0bfe, + 0x07fb4efe, + 0x121f9bb0, + 0xb7eef093, + 0x7592be00, + 0x93b11100, + 0x00b7fbf0, + 0x007587be, + 0xf093b121, + 0xbe00b802, + 0x0100757c, + 0x09f093b1, + 0x71be00b8, + 0xc0270075, + 0xd231db07, + 0xf0931c07, + 0x0300b80a, + 0x755ebec1, + 0xc4d40300, + 0x07ec0fcc, + 0x9efb0e0b, + 0x4effaf9d, + 0x07a007f9, + 0x27c207b1, + 0x1c1e409c, + 0xcc10dc07, + 0x07d90741, + 0xde67be1d, + 0x070a0700, + 0xde49be1d, + 0x0bcd2b00, + 0x07ad0bbd, + 0x8ec0760b, + 0x114f27f9, + 0x9b100000, + 0x0533a0f4, + 0x180001f5, + 0x02f5ff02, + 0xff021804, + 0x0e233027, + 0x35fde800, + 0x234c2703, + 0xe8000e03, + 0x1004f5fd, + 0xf5ff0218, + 0x02181402, + 0xf00e23ff, + 0x0335fde7, + 0x4007fe0b, + 0x03334533, + 0x40f9402b, + 0xff00018c, + 0x330f0c83, + 0x7e0e2303, + 0xb49effff, + 0xf293007c, + 0xa7026d64, + 0xfefeb33e, + 0x01304c27, + 0x05340331, + 0xa8240321, + 0x9b4027f4, + 0xfe0b0ef4, + 0xfeb32ea7, + 0x41f393fe, + 0x4c27026d, + 0x03310130, + 0x03210534, + 0x27f4a824, + 0x0ef49b40, + 0x3ea7fe0b, + 0x27fdebff, + 0x27340540, + 0x0200004f, + 0x2734150b, + 0x0ef49b40, + 0xf84efe0b, + 0xebffbea7, + 0x278007fd, + 0x070027c0, + 0x009f27a1, + 0xbe0b0200, + 0x0500ddb9, + 0x27b915bc, + 0x0ef49b40, + 0xe7ff3ea7, + 0x054427fd, + 0xa73a1534, + 0xfde7ef4e, + 0x48053c35, + 0x00274a15, + 0x92be4c35, + 0xbc0500dd, + 0x4027b915, + 0x8e0ef49b, + 0x270533f8, + 0x0004f543, + 0xf5ff0218, + 0x02180402, + 0x234027ff, + 0xfde8000e, + 0x0e030435, + 0xf5fde800, + 0x02181001, + 0x1402f5ff, + 0x23ff0218, + 0xfde7f00e, + 0xfe0b0435, + 0x07040399, + 0xc035a640, + 0x3a400936, + 0x00273820, + 0x0427031e, + 0x86064499, + 0x20350645, + 0x043a0037, + 0x0b08a338, + 0x07fc4efe, + 0xbec007d1, + 0x1600e018, + 0x04d49905, + 0x27104c44, + 0x0bd49d41, + 0xbe04c49d, + 0xc500e037, + 0xfc8e40d0, + 0xc007fc4e, + 0xd2070207, + 0xbe440c03, + 0xa7001bdc, + 0x41d39940, + 0x9d43d49d, + 0x32c442d4, + 0x3ad4991a, + 0x13ff4cc0, + 0x4c0b4447, + 0x014443b9, + 0xb942d39d, + 0x9d014544, + 0xfc8e43d4, + 0xf063f84e, + 0xd2079007, + 0xa3070307, + 0x73beb107, + 0x30070131, + 0xc0073483, + 0x009d3fe6, + 0xe404b899, + 0x0095108c, + 0x90200cfc, + 0xffbea700, + 0xb4d1ffff, + 0x4ff60620, + 0x08f80396, + 0xcea70392, + 0xb9feffff, + 0xf80c41c4, + 0x0384104c, + 0x01230a07, + 0xffcc82be, + 0x03780fe6, + 0x49be0027, + 0xc3d1000f, + 0xb4d1013c, + 0x34e20b74, + 0xfc930366, + 0x07026c70, + 0xbe1c070f, + 0xf6fff06a, + 0x5e082704, + 0xc4410358, + 0x4ea30c07, + 0x45014000, + 0xf0f4bec4, + 0x5d9499ff, + 0x00274124, + 0xffece5be, + 0xa5be0a07, + 0x4027ffba, + 0xad0ad89d, + 0x270168d4, + 0x04949d42, + 0x0b74b4d1, + 0x41030327, + 0x0b74b4d5, + 0x99031b5e, + 0x452612b4, + 0x05273576, + 0xf8030f5e, + 0x990309c8, + 0x4626bbb4, + 0x03acb0c1, + 0x0cbefc0c, + 0x4027ffea, + 0xc1bbb49d, + 0x471630b4, + 0x1b070d07, + 0x0007e8be, + 0x0c270516, + 0x02e25e0c, + 0xc528d489, + 0xd48930b4, + 0xf8412428, + 0x1e02d1c8, + 0x004d8307, + 0x0745f680, + 0xbcf9be0b, + 0x270616ff, + 0x02be5e0b, + 0xc605b499, + 0xbbaabe44, + 0xffcea7ff, + 0xc4d1ffff, + 0xb1c10620, + 0xc5410344, + 0xc4d558d1, + 0x1b070620, + 0x5432f093, + 0xb8d1be03, + 0x5cd0c5ff, + 0x9d11b299, + 0xb39960d2, + 0x61d39d13, + 0x8904b499, + 0xd49d28d3, + 0x07b1990a, + 0xd4d54027, + 0xd4d501c0, + 0x430701c4, + 0x830bd19d, + 0xe680004d, + 0x0700d44f, + 0xfe0e7e0b, + 0xb289d381, + 0xc130ab1e, + 0xd38544d4, + 0x1c3cd28d, + 0xc03cd841, + 0x0ad3991b, + 0xdc379099, + 0x43070e34, + 0x4a404a83, + 0xa606b499, + 0x47377647, + 0x99161e00, + 0xb3990ad4, + 0x27448306, + 0x27448611, + 0x99912b10, + 0x033b3990, + 0xc120b489, + 0x400b44d3, + 0x893ed48d, + 0x3c831ab2, + 0x26d28d20, + 0x811cb489, + 0x24d48dd2, + 0x0322b489, + 0x44530f4c, + 0x37e62158, + 0x1e40d48d, + 0x8d370616, + 0x2cd840d4, + 0xb48910c0, + 0x73410322, + 0x0f4c0341, + 0xd48d4453, + 0x05b49942, + 0xb49949e6, + 0x07d1b107, + 0x33353334, + 0xf5342b43, + 0x00019831, + 0x30d4c1ff, + 0x34f5d281, + 0xff000190, + 0xa340d189, + 0xed80002d, + 0x0001a031, + 0x81d285ff, + 0xc04c83d4, + 0x00f34fe6, + 0xd4d54653, + 0xea5e01c4, + 0xe631e000, + 0xc0b1c100, + 0x891ab289, + 0x1cf81cb3, + 0x8100920e, + 0x83a307d4, + 0x4653c04c, + 0xd4d59207, + 0xa45b01c4, + 0x1cd8945b, + 0x18d86a0c, + 0xaec4a921, + 0x0724020e, + 0xff4ea724, + 0x43a9ffff, + 0xb4890eb0, + 0x0743221c, + 0x07031e03, + 0x07920704, + 0x1e14d8a0, + 0xffffcea7, + 0xb2c1a9ff, + 0xbe09070e, + 0xa900978e, + 0x070eb4c1, + 0xbe0a0790, + 0x07009782, + 0x83d481a0, + 0xa3344741, + 0x073f0b31, + 0x03938b24, + 0x5b490721, + 0xd6a38b42, + 0x3b912744, + 0x5b4a0792, + 0x2744d642, + 0x81a23ba1, + 0x072907d4, + 0xe321e33a, + 0x07413831, + 0x8933e33a, + 0x4d0028d4, + 0x4d240121, + 0x21e31121, + 0xd48131e3, + 0x8d104c58, + 0xd28d26d3, + 0x8d071e24, + 0xd38d26d2, + 0x07dc8124, + 0x834c070b, + 0x4453304c, + 0x33333407, + 0x342b4447, + 0x44334307, + 0xd4d5432b, + 0x5d7e01c0, + 0x85c0abfc, + 0x38b2c1dc, + 0x0164d2d5, + 0x9dbab399, + 0xb49962d3, + 0x28d389b8, + 0x016ed4bd, + 0xb1893140, + 0x68d1ad2e, + 0x270a1e01, + 0x68d4ad41, + 0x2eb38d01, + 0xbd14b299, + 0x99016cd2, + 0xd3bd15b3, + 0xb299016d, + 0xa8b4c118, + 0x9d2cb189, + 0xb3c163d2, + 0x35d41534, + 0x074b07d3, + 0x08d18d3d, + 0x01703d03, + 0x27684c03, + 0x4101102c, + 0x31054403, + 0xf2a83403, + 0x275cb2c1, + 0xb0d2d500, + 0x60b3c101, + 0x01b4d3d5, + 0xd564b4c1, + 0xc101b8d4, + 0xf49330b1, + 0xd50351bc, + 0x8901bcd1, + 0x44c1bcb2, + 0xc0bb9968, + 0x01ccd4d5, + 0x01f0d2ad, + 0x01f2dbbd, + 0x0727071e, + 0x0627031e, + 0xf88ef043, + 0x6ea6f393, + 0x9031c503, + 0xe68c30c5, + 0x9d412704, + 0xfe0b9934, + 0x579efe0b, + 0xfe4e0012, + 0xffcccebe, + 0x00124dbe, + 0x001433be, + 0xd69efe0e, + 0xf0630013, + 0x0bba4d27, + 0x4c27f40d, + 0x07f42d28, + 0x43f00110, + 0xed799ef0, + 0xa7f94eff, + 0xfeffff3e, + 0x0c4134b9, + 0x00cf48fc, + 0x83093499, + 0x33348743, + 0xf9432b44, + 0x00004d4b, + 0xbabfe6ff, + 0xff4ea700, + 0x43b9ffff, + 0x42b90b9a, + 0xc4070b9b, + 0xd307322b, + 0x0027df6b, + 0x6e26f993, + 0x0dfa9303, + 0x875e0351, + 0x9023f900, + 0xf9ff000b, + 0x000b8824, + 0x1b3d1bff, + 0x034f4b4d, + 0x803c5c21, + 0x2027412c, + 0xf100051e, + 0xc4b92127, + 0x45a60e25, + 0x0b9bc3b9, + 0x0a9a9499, + 0x99202743, + 0x472605a4, + 0x0b99c4b9, + 0x0b98c3b9, + 0x4cdc4d1b, + 0x4d070a80, + 0x4f4b432b, + 0x064941c8, + 0x834d072d, + 0x04070f4c, + 0x45330333, + 0x0e23040b, + 0x71fff464, + 0x0b046103, + 0x27046543, + 0x7e047540, + 0xc4b9ff32, + 0x3d070b9b, + 0x41233103, + 0xc4bdd307, + 0xdf6b0b9b, + 0xc4b90127, + 0x4dce0b9a, + 0x271b070b, + 0x1e110320, + 0x8e00278a, + 0x7efd4ef9, + 0xdea7ff1d, + 0x1effffff, + 0x9ad4b92c, + 0xbd41230b, + 0xb90b9ad4, + 0x830b9ad0, + 0x40070f0c, + 0x03334533, + 0x0e23040b, + 0x7efff464, + 0xd4b9fede, + 0x41230b9b, + 0x0b9bd4bd, + 0x0b9bd4b9, + 0x27cf4fd6, + 0xff1ea720, + 0x3827ffff, + 0x0b9a14b9, + 0x0b8824fd, + 0x24fdff00, + 0xff000b90, + 0xf3582103, + 0x0b9914bd, + 0x0b9814bd, + 0xfe4efd8e, + 0x001290be, + 0x1ea72027, + 0x27ffffff, + 0xfd402738, + 0x000b8824, + 0x982103ff, + 0x9b14bdf3, + 0x9814bd0b, + 0x9a14bd0b, + 0xa7fe8e0b, + 0xffffff4e, + 0x0e2544b9, + 0xf4934606, + 0x99036ce8, + 0x42049844, + 0x0011c49e, + 0xf493fe0b, + 0x0103626c, + 0x4efe0b40, + 0x090d99fd, + 0x3d072007, + 0x3103e027, + 0x24990a1e, + 0x4e21030c, + 0xa0e10314, + 0x03fd8ef3, + 0x4d070cec, + 0x41233007, + 0xec233e0b, + 0x09049d0c, + 0x3439091e, + 0x341de103, + 0x04993103, + 0xf3e4ca09, + 0xf493fd8e, + 0x27036224, + 0xa7102720, + 0x0b429d30, + 0x9d09429d, + 0x24070a42, + 0xd508439d, + 0x150a5041, + 0x5441d541, + 0x2c2c030a, + 0x27193c27, + 0x03241d40, + 0xf3b0682c, + 0xfc4efe0b, + 0x4f46f493, + 0xf04dd103, + 0x27102703, + 0x2127223c, + 0x4207213b, + 0x4d964d8b, + 0x5fbaf493, + 0x074e0103, + 0x33410731, + 0x0b333346, + 0x033e0b34, + 0x2722703d, + 0x0c01124c, + 0x3c050403, + 0xf4a83403, + 0x41073107, + 0x33334633, + 0x3e0b340b, + 0x228034d1, + 0x4ee32dab, + 0xd501fc0e, + 0x93228034, + 0x034eeff4, + 0x03f042d5, + 0x1103fc8e, + 0x8ea8f3f0, + 0x6f3ea7fc, + 0x1c27fffe, + 0x01342322, + 0xd8340334, + 0x0300004e, + 0xe6322113, + 0xce047124, + 0x32011424, + 0x048124e6, + 0x030b24ce, + 0xf1f0183c, + 0x0b0027dd, + 0x0b0127fe, + 0xab0fabfe, + 0x07109b1f, + 0x0b015301, + 0x03004701, + 0x0100000e, + 0xfc4efe0b, + 0xdc070c41, + 0xdc532c07, + 0x002e8318, + 0x2c53fe00, + 0x03d10311, + 0x27d23021, + 0x27071e01, + 0x27221401, + 0xff3ea700, + 0x34a9ffff, + 0xe0070eae, + 0x4546ef6b, + 0x0eb034a9, + 0x44960127, + 0x4ea70027, + 0xc1fd4fff, + 0x41277443, + 0x6bc014c5, + 0x003fdc0f, + 0x78200000, + 0x0fc6e4b6, + 0x93042773, + 0x00af72f1, + 0xe4960c1e, + 0x04270706, + 0xaf93f193, + 0x6f749e00, + 0x27060600, + 0xe3f19304, + 0xf21e00af, + 0x14c54227, + 0x14e726c0, + 0x1322d0d2, + 0xffff3ea7, + 0xad4427ff, + 0xc50eb432, + 0x3dadc014, + 0x06c60eb2, + 0xffff2ea7, + 0x273127ff, + 0xb423ad48, + 0xc014c50e, + 0x0eb223ad, + 0xd8c014c1, + 0x891e0c4c, + 0x42301a14, + 0xd41c1489, + 0x04271342, + 0xafe0f193, + 0xdca31e00, + 0xd694c0cc, + 0xc71ea0ef, + 0xf063fc8e, + 0x0bb94d27, + 0xf40d0341, + 0x2d484c27, + 0xa31007f4, + 0x0110003d, + 0x431345f0, + 0xe9669ef0, + 0x63fb4eff, + 0x07d007f0, + 0x930f07b1, + 0x02654ff1, + 0xffe905be, + 0x00ed0fe6, + 0x4dc4f409, + 0x29750bb9, + 0x484ce4f4, + 0xd49900d5, + 0x104cc004, + 0xacd1c110, + 0x652af093, + 0xf41c0302, + 0xfff16bbe, + 0x600ef493, + 0x93440103, + 0x026517f3, + 0x4dd84986, + 0x89138000, + 0x4d831834, + 0x47d68000, + 0xf1930627, + 0x1e00af9a, + 0x1141c410, + 0x40183489, + 0x93062741, + 0x00afbff1, + 0x006e7d9e, + 0x93183389, + 0x035fd3f4, + 0x0c030b07, + 0xd9f19310, + 0x2c270264, + 0xbe430548, + 0x2700d325, + 0xc4731e01, + 0x620bbc4d, + 0x64c2fc93, + 0x1ac48902, + 0x4c03f329, + 0x27344e20, + 0xc0f19306, + 0xc11e00af, + 0xc418c489, + 0xb4a93a42, + 0x456601e8, + 0xf1930627, + 0x1e00afe1, + 0x030b07ac, + 0x0701d00d, + 0x202c271c, + 0x00d2e0be, + 0xd804d499, + 0xd4992a44, + 0x0748d616, + 0x69f0931c, + 0x2c270266, + 0xd2c7be20, + 0x27151e00, + 0x00f19306, + 0x795e00b0, + 0x930627ff, + 0x00b035f1, + 0x27ff6f5e, + 0x8ef04300, + 0x07f54efb, + 0x04119981, + 0x1483f263, + 0xf261f165, + 0x5f32f393, + 0x07500703, + 0x105c0390, + 0x28263101, + 0x4b083299, + 0x1820c82f, + 0x42873207, + 0x342b3433, + 0x3333320b, + 0xdfd43f03, + 0x34990003, + 0x2746162c, + 0x93f35530, + 0x035f2bf2, + 0x1e193c27, + 0xf011c059, + 0x86168499, + 0x443c0341, + 0x1c274507, + 0x03300112, + 0x03400534, + 0x07f1a844, + 0x33328742, + 0x0b432b44, + 0xd1f39342, + 0x20a7035e, + 0x329d4333, + 0x99430b08, + 0x05072b43, + 0x439d3103, + 0x7e18072b, + 0x0907fd7a, + 0x01d00d03, + 0x65aef193, + 0x202c2702, + 0x00d20cbe, + 0xdb5e7127, + 0x03241904, + 0x4ff6682c, + 0xf15104bd, + 0x61073907, + 0x64334187, + 0x610b642b, + 0x6f036333, + 0x0003dfd4, + 0x2c032607, + 0x103c0344, + 0xf2757027, + 0xb85ef385, + 0x07050703, + 0xfd2c7e18, + 0xe0048499, + 0x0351104c, + 0x5e5ef493, + 0x40430103, + 0x2080013d, + 0x0080213d, + 0xe480023d, + 0x0a80223d, + 0x06809902, + 0x15248c89, + 0x461c07f0, + 0x07c10305, + 0x2311531c, + 0x409789c1, + 0x402774d6, + 0x94c10a1e, + 0x83455344, + 0x6b41c341, + 0x89f4254f, + 0x44d6228e, + 0x051e4e07, + 0x44334707, + 0x07449ac1, + 0x07410724, + 0x0313831a, + 0x4c030f2c, + 0x53f1450f, + 0x46445324, + 0x03d40716, + 0xe3d80327, + 0x27d7e327, + 0x1e10000d, + 0x03d40708, + 0x800c27d1, + 0x42834307, + 0x0f203cd8, + 0x1d274506, + 0x131e0290, + 0x01e01d27, + 0x45060d1e, + 0x02001d27, + 0x1d27051e, + 0x3a070180, + 0xf3353183, + 0x410735c6, + 0xe67f4c83, + 0x801c0344, + 0x3207142b, + 0x34333d9b, + 0x43070123, + 0x0103408b, + 0x300b44c6, + 0x0107342b, + 0x1d07029b, + 0x11032047, + 0x11534207, + 0x237f4c83, + 0x0344e611, + 0x242b802c, + 0x4d1b4147, + 0x0407409b, + 0xe67f0c83, + 0x804c0304, + 0xb207402b, + 0xec03b19b, + 0x0bb30b0f, + 0x534e07b4, + 0x05f01144, + 0x0fec23f4, + 0x2b070526, + 0xda5e3407, + 0x5c948100, + 0x2027c04c, + 0xce5e3027, + 0x21de0700, + 0x73d103f1, + 0x0714d6d1, + 0x89061e2d, + 0x24334292, + 0x18289389, + 0x303ce3a8, + 0xe310ac38, + 0x0731a337, + 0x7341034c, + 0x03f04141, + 0x4c030f2c, + 0x5324530f, + 0x07064644, + 0x032703e4, + 0xe327e3e8, + 0x000d27e7, + 0x07081e10, + 0x27e103e4, + 0x4307800c, + 0x3cd84283, + 0x45060f20, + 0x02901d27, + 0x1d27131e, + 0x0d1e01e0, + 0x1d274506, + 0x051e0200, + 0x01801d27, + 0x35c6f331, + 0x4c834107, + 0x0344e67f, + 0x142b801c, + 0x3e9b3207, + 0x01233433, + 0x408b4307, + 0x44c60103, + 0x342b300b, + 0x029b0107, + 0x20471e07, + 0x42071103, + 0x4c831153, + 0xe611237f, + 0x802c0344, + 0x4147242b, + 0x409b4e1b, + 0x0c830407, + 0x0304e67f, + 0x402b804c, + 0x230b219b, + 0x3c033d07, + 0x53240b0f, + 0x22f40134, + 0x1e302747, + 0x42948912, + 0x34021027, + 0x41071127, + 0x340741c3, + 0x94c13f6b, + 0x3b4bea34, + 0x3894c101, + 0x013442ea, + 0x0fe6f021, + 0x3ff60137, + 0x275e0133, + 0x1b31c401, + 0x89228089, + 0xe27e2481, + 0x4494c1fa, + 0x011440fa, + 0x71274027, + 0x5e4894c5, + 0x97810115, + 0x071c8489, + 0x10ac83a7, + 0x061a8089, + 0x073407a5, + 0x07051ed0, + 0xc1d40730, + 0x4cf8c084, + 0xf800cf0e, + 0x00a40c4c, + 0x865148d8, + 0xff4ea7a8, + 0x43a9ffff, + 0x84890eb0, + 0x0743221c, + 0x07031e23, + 0xff4ea724, + 0x43a9ffff, + 0x84890eae, + 0xa7211e1a, + 0xffffff4e, + 0x0eae43a9, + 0x221a8489, + 0x1e230743, + 0xa7240703, + 0xffffff4e, + 0x0eb043a9, + 0x221c8489, + 0x1e030743, + 0x07040703, + 0xa7261eb2, + 0xffffff4e, + 0x0eb24ca9, + 0x0eb441a9, + 0xa4d64c07, + 0x1407c107, + 0xabbe0307, + 0xb007008d, + 0x0d071c07, + 0x008da1be, + 0x41834707, + 0x31a33447, + 0x2b073f0b, + 0x238b1407, + 0x42071103, + 0x038b415b, + 0x212744d6, + 0x4007213b, + 0x46f6415b, + 0x013b0127, + 0x4707101e, + 0x53c04c83, + 0x070d0746, + 0x5b045b23, + 0x07320724, + 0xe331e3d0, + 0x0d71d8d1, + 0x3207a506, + 0x051e33e3, + 0xd3e3d007, + 0x00289489, + 0x2401214d, + 0xe311214d, + 0x89d1e331, + 0x432a5094, + 0xc2529489, + 0x05070ad4, + 0x27faad7e, + 0x27591e70, + 0x9340a771, + 0x035b0bf1, + 0x149df261, + 0x5124e608, + 0x08139df3, + 0xc1b083c1, + 0x9289b484, + 0x75936528, + 0x002d8394, + 0x89260680, + 0x45764094, + 0xa34494c1, + 0x94c5204c, + 0x81f37144, + 0x122c27f4, + 0x44034001, + 0x34033005, + 0x3127f2a8, + 0x639d4027, + 0x29649d2c, + 0xf62b639d, + 0x9300f57f, + 0x035ab7f2, + 0x4dfc2401, + 0x00e18000, + 0x4802f393, + 0xf032d103, + 0x27102703, + 0xd127223c, + 0x4d07d13b, + 0x4a46428b, + 0x46334107, + 0x140b1333, + 0x586ef493, + 0x03440103, + 0x0b22701d, + 0x27050714, + 0xdebe482c, + 0xf09300cd, + 0xd10347cc, + 0xeb03f004, + 0xf004d54d, + 0xfbf75e03, + 0xf3f01103, + 0x070807c2, + 0xfa0f7e19, + 0xfbe70ff6, + 0x93008d5e, + 0x0347a7f0, + 0x03f004d1, + 0xbc3bb127, + 0x5826f193, + 0x014b8b03, + 0x074ac613, + 0x33dc074c, + 0x0bd33346, + 0x70dd03d4, + 0x07d30b22, + 0xf89f7e0d, + 0x2c2707f6, + 0x071d0748, + 0xcd7fbe05, + 0x6df29300, + 0x24d10347, + 0x4beb03f0, + 0x03f024d5, + 0x03fb985e, + 0x22ccc0c1, + 0x07ad1e11, + 0xf8737e05, + 0xfb870fe6, + 0xff7e0507, + 0x071907f7, + 0xf99f7e08, + 0xa1030176, + 0xffae97be, + 0x1e18a2c0, + 0x03f45111, + 0xf8f45541, + 0x27fb34f3, + 0x27081e70, + 0x5ec027a0, + 0x0707ff77, + 0xf58ef243, + 0xa007f74e, + 0xf893d007, + 0x27036414, + 0x11421e70, + 0x217103db, + 0x01bae6d0, + 0x07900782, + 0x2c9f03ca, + 0x0b0003ea, + 0x0bb2cec0, + 0x0c071907, + 0x005bf1be, + 0x1b070786, + 0xf4be0c07, + 0xd411ffdc, + 0x84050907, + 0xd421d211, + 0x84151c07, + 0x005bf6be, + 0x8803d803, + 0x74caa401, + 0x69fd93bb, + 0xd2990359, + 0x0ad49909, + 0x931d24ce, + 0x025f63f3, + 0x23134c27, + 0x07340521, + 0x15182703, + 0xdcb5be32, + 0x09d499ff, + 0x8e0ad49d, + 0x99f94ef7, + 0xc0070904, + 0x4b99400b, + 0x874b070b, + 0x2b44333b, + 0x334b0b43, + 0x0bd40743, + 0x2dd399d0, + 0x9c039407, + 0x8cdac144, + 0xd4c136e6, + 0xe3090b54, + 0xd4c50c4c, + 0xf7187e54, + 0xd49d4027, + 0x07121e2d, + 0x1c0d030a, + 0xff3a7e01, + 0x090b0c07, + 0xffe25dbe, + 0x3b07a946, + 0x4b87a119, + 0x463ef093, + 0x2b343303, + 0x2402d134, + 0x0b412704, + 0xcb413b3b, + 0x0b333342, + 0x2404d53c, + 0xc5402704, + 0xc4998c34, + 0x23c30109, + 0x09c49d41, + 0x072b31c0, + 0x334b873b, + 0x0b342b34, + 0x0b33333b, + 0x2a34993c, + 0x32994626, + 0x1141272e, + 0xab423bc3, + 0x1ec31534, + 0x0bc49909, + 0xc49d4123, + 0x874b070b, + 0x2b44333b, + 0x334b0b43, + 0x274c0b43, + 0x2c439d30, + 0x0a54c4d1, + 0xc4d54103, + 0xf98e0a54, + 0x0f6bfa4e, + 0xf3930be6, + 0x01035868, + 0x3441c034, + 0x07093199, + 0x0c0c0303, + 0x1f03102b, + 0x0003dfe1, + 0x0319191e, + 0x43070103, + 0x44332387, + 0x430b422b, + 0x31274333, + 0xe00143fd, + 0xf1280003, + 0xf27e061e, + 0x93061efe, + 0x03582bfd, + 0x0709d499, + 0x2742360d, + 0x01fa93c0, + 0xfb930356, + 0xd1034570, + 0x2703f0b4, + 0x8bdc3bd1, + 0x06a0014d, + 0x074c0748, + 0x3336333c, + 0x03430b43, + 0x0b22704d, + 0xe160be04, + 0xf0b4d1ff, + 0xd54deb03, + 0x0303f0b4, + 0x22ccc4c1, + 0x0dfc93cf, + 0xd0270358, + 0x4786c419, + 0x4d870d07, + 0x042b0433, + 0x03330d0b, + 0xe0180f03, + 0x2fbe0003, + 0x4027ffe1, + 0xd103c41d, + 0xc468cc03, + 0x27da19dc, + 0xb1f49330, + 0x43050357, + 0xf54efa8e, + 0xffff4ea7, + 0xa1f293ff, + 0x27010357, + 0x062043d1, + 0x3123a007, + 0x07ac09c1, + 0xd5f06307, + 0x03062043, + 0xb027602c, + 0x80210d23, + 0x01191c27, + 0x03949123, + 0x342e682c, + 0xf190b103, + 0x4b873b07, + 0x342b3433, + 0x33333b0b, + 0xe02834f1, + 0x4cdc0003, + 0x93610e0c, + 0x4c834307, + 0xa348240c, + 0x07936532, + 0x333b874b, + 0x0b432b44, + 0x0343334b, + 0x03dfd44f, + 0x5442c100, + 0x4c039361, + 0x6532ab44, + 0x03390793, + 0x122c2738, + 0x34033101, + 0x44034105, + 0x4b07f2a8, + 0x44333b87, + 0x4b0b432b, + 0x3310a399, + 0xd44f0343, + 0x530003df, + 0x2e439d31, + 0x9d05a399, + 0x94892a43, + 0x27412420, + 0x99041e20, + 0x4b0713a2, + 0x44333b87, + 0x4b0b432b, + 0x42fd4333, + 0x0003e001, + 0x8962ad99, + 0xa0c160a4, + 0x27d4585c, + 0x1ec02700, + 0x99c40703, + 0x4f7616a4, + 0x4b072936, + 0x44333b87, + 0x4b0b432b, + 0x49f54333, + 0x0003e060, + 0x440af193, + 0xd1931903, + 0x27042412, + 0xab433b41, + 0x2414d542, + 0x874b0704, + 0x2b44333b, + 0x994b0b43, + 0x433304a1, + 0xdfd44f03, + 0x419d0003, + 0x34a3c128, + 0xc53840c5, + 0x30a73c43, + 0x994043c5, + 0x44d804a4, + 0x1ed2e356, + 0x2a71c452, + 0x3b874b07, + 0x432b4433, + 0x43334b0b, + 0xe06049f5, + 0x94190003, + 0x43aef293, + 0xd1170703, + 0x3b042423, + 0xab410714, + 0x2424d543, + 0x873b0704, + 0x2b34334b, + 0x333b0b34, + 0xd43f0333, + 0xc10003df, + 0x40123834, + 0xc13830c5, + 0x34c534a4, + 0x9d402740, + 0x4b072834, + 0x44333b87, + 0x4b0b432b, + 0xe0274333, + 0x560ef893, + 0x96512703, + 0x075027d4, + 0xed68836d, + 0x03e0044c, + 0xf9551e00, + 0x03dfe0e0, + 0x07c02700, + 0x33408720, + 0x0b242b24, + 0x03233320, + 0x03dfd42f, + 0x2a249900, + 0x24994666, + 0x3ca3c12e, + 0x138b143b, + 0xc1271486, + 0x012a2c9d, + 0x27412484, + 0x07f10511, + 0x33308740, + 0x0b432b44, + 0x33f30140, + 0xd44f0343, + 0x9d0003df, + 0x469d2943, + 0x99e1032d, + 0xf5050984, + 0xe4da1127, + 0xc08401a3, + 0x8e112f41, + 0x073ca2c1, + 0xeb30274e, + 0x8b031e42, + 0x07030741, + 0x6b112314, + 0x9631030f, + 0x79f39342, + 0x34990355, + 0x2b2e8b0b, + 0x0b349d40, + 0x061e3215, + 0x849d4027, + 0x873b070b, + 0x2b34334b, + 0x333b0b34, + 0xd43f0333, + 0x990003df, + 0x41232b34, + 0x1c2b349d, + 0x277124d2, + 0x29349d41, + 0x4b87cb07, + 0xc42bc433, + 0xc333cb0b, + 0xdfd4cf03, + 0xc4c10003, + 0x2dc39954, + 0x8e838407, + 0xcb010000, + 0x54c4c548, + 0x551afd93, + 0xd1399603, + 0x070a50d4, + 0xd541030d, + 0x070a50d4, + 0xf2a17e1b, + 0x0a50d4d1, + 0xc4c56127, + 0x09d09934, + 0x0738ccc1, + 0x27db0710, + 0x1e1103e0, + 0x0c4ce37f, + 0x9954c4c5, + 0x602709d4, + 0x94614616, + 0x00004e58, + 0x9d412701, + 0x201e2cc4, + 0x4b87cb07, + 0xc42bc433, + 0xc333cb0b, + 0x0f030c07, + 0x0003e018, + 0x27f2c97e, + 0x00c4fd40, + 0x070003e0, + 0x334b873b, + 0x0b342b34, + 0x2733333b, + 0xa1f09340, + 0x1b070354, + 0xe00134fd, + 0x307e0003, + 0xf9501ef2, + 0x03dfe0e4, + 0x87240700, + 0x2b243334, + 0x33240b23, + 0xd42f0323, + 0x990003df, + 0x45962924, + 0x323824c1, + 0xf0e1034c, + 0xf493daf1, + 0x07035468, + 0x032e0730, + 0x03140731, + 0x03dfe02f, + 0x09439d00, + 0x24190b1e, + 0x2d1de103, + 0xd4072103, + 0xca091499, + 0x3b07f1e4, + 0x34334b87, + 0x3b0b342b, + 0x3f033333, + 0x0003dfd4, + 0x932a3499, + 0x03542bf1, + 0x68264496, + 0x9616a499, + 0x1871c047, + 0x030b1499, + 0x0b149d41, + 0x349965f6, + 0x2712112e, + 0xab343b31, + 0x06131532, + 0x01f4938d, + 0x43990354, + 0x0704070c, + 0x33238743, + 0x0b422b44, + 0x0b433343, + 0x5443c140, + 0x83ab1027, + 0x1e5448c5, + 0xe013f91d, + 0x030003df, + 0x87430711, + 0x2b443323, + 0x33430b42, + 0xfd312743, + 0x03dffd43, + 0x09049900, + 0x99df14da, + 0x4a06b9a4, + 0x53b6f093, + 0x09049903, + 0x43f948c6, + 0x0003dfdf, + 0x23874307, + 0x422b4433, + 0x4333430b, + 0xdfff44f9, + 0x45960003, + 0x1efa547e, + 0xfa4f7e06, + 0xfd93061e, + 0x99035388, + 0x0d0709d4, + 0x44f94986, + 0x0003dfdf, + 0x34872407, + 0x232b2433, + 0x2333240b, + 0xdfd42f03, + 0x24990003, + 0x9945e629, + 0x4fc62b24, + 0x7e061ecd, + 0x0b1efa19, + 0x5352fd93, + 0xa5fa9303, + 0xdc990340, + 0xbecb0609, + 0x4affcaaa, + 0x09d3990c, + 0xc235a499, + 0xd4992834, + 0x08d29909, + 0xdfdf44f9, + 0x2f4b0003, + 0x34871407, + 0x132b1433, + 0x0d07140b, + 0x242e1333, + 0xdfff14f9, + 0x4fc60003, + 0x0df493b7, + 0x44990353, + 0xf64c3609, + 0xd894616b, + 0x0100004e, + 0x870b0736, + 0x2b04334b, + 0x330b0b04, + 0x03c00703, + 0x03dfd4cf, + 0x2cc49900, + 0xc4c147c6, + 0x180f0354, + 0xa30003e0, + 0x0140004e, + 0xc4c544e3, + 0xdc38be54, + 0x9d4027ff, + 0xf0432cc4, + 0xfc4ef58e, + 0xfe93f163, + 0x270352e8, + 0x27202700, + 0xe419191c, + 0x303b3127, + 0x0368ec03, + 0xab448601, + 0x93f17023, + 0x03529ffc, + 0x9909c199, + 0xc4110bc3, + 0xa3d4f093, + 0x5df2be00, + 0x1ed02700, + 0xe0d2f93e, + 0x030003df, + 0x873207d1, + 0x2b343342, + 0x33320b34, + 0xd43f0333, + 0x990003df, + 0x34992b3e, + 0x99fe0529, + 0xfe152c3e, + 0x252d3e99, + 0x2a3e99fe, + 0x3e99fe35, + 0xc1fe452e, + 0xb1be3833, + 0xc499005d, + 0x931d0709, + 0x00a3cef0, + 0x43b7d4da, + 0x4efc8ef1, + 0xb90499fb, + 0xb107d007, + 0x4616c207, + 0x049d4127, + 0x1cf093b9, + 0x70be00a4, + 0xc5e6ffb6, + 0x874cd2c1, + 0x0b4c873b, + 0x0541a332, + 0x4efb8e34, + 0x07f0a3f9, + 0x07a0079f, + 0x03b307c2, + 0xbe211e94, + 0x01ffb5dc, + 0x07f411f3, + 0x07342b10, + 0x054c2b4b, + 0x070a07f3, + 0x074302d4, + 0x3e2d07d3, + 0x07cd0ba7, + 0x072f071c, + 0xca0a0739, + 0xf083d6cb, + 0x4ea7f98e, + 0xb9ffffff, + 0x930e2543, + 0x035c2ff4, + 0xe498439d, + 0xa7010a32, + 0xfdefff3e, + 0x34d54027, + 0x34d50e00, + 0x2ea70e04, + 0x11fd9fff, + 0x004ee324, + 0x24150200, + 0x34d54327, + 0x34d1022c, + 0x45860638, + 0xd8234f9b, + 0x0000004f, + 0x1ea7f101, + 0x27fbffff, + 0x1812d140, + 0x1814d502, + 0x1013d102, + 0xddf49302, + 0x43c5035b, + 0x27202894, + 0xd10b1e10, + 0x83021811, + 0xffffff1f, + 0xff3ea70f, + 0x4327fdef, + 0x022834d5, + 0x24a12307, + 0x27fc48dc, + 0x2824d544, + 0x2c24d502, + 0xd5302702, + 0xa7063823, + 0xfdebd72e, + 0x4f272305, + 0x05040000, + 0xf39b2415, + 0x91f0930e, + 0x04c1035b, + 0x9a039980, + 0x04c5412b, + 0xa7184680, + 0xffffff4e, + 0x0b9a44b9, + 0x4c83432b, + 0x0b43330f, + 0x11430140, + 0x0b312b42, + 0x05411512, + 0xa73a1e43, + 0xffffff2e, + 0x0b9a24b9, + 0x432b3a06, + 0x330f4c83, + 0x4444f143, + 0x360003ea, + 0x23430748, + 0x9a049d41, + 0x24bd4127, + 0x23990635, + 0x9b40270f, + 0x41270ef4, + 0x34f53387, + 0xff02b040, + 0x4ea73127, + 0xbdffffff, + 0x0b0e2543, + 0xa7fe4efe, + 0xffffff0e, + 0x0e2504b9, + 0x936541c4, + 0x035b0bfe, + 0xb690e4c1, + 0x2603b945, + 0x2704b90e, + 0x5043ce0e, + 0xebd73ea7, + 0x051027fd, + 0x004f2731, + 0x15050400, + 0xbd422734, + 0x9b0e2504, + 0xe2c10ef1, + 0x94e4c18c, + 0xffff3ea7, + 0x1432d5fb, + 0xd548a302, + 0xa7021034, + 0xfd9fff2e, + 0x4ee32421, + 0x25020000, + 0x27231124, + 0x2404bd40, + 0x003ea30e, + 0xe19d0200, + 0x8e231599, + 0x7efe4efe, + 0xf493fe6a, + 0x27035aa0, + 0x9d302720, + 0x42c59a43, + 0x8042c594, + 0x8e8442c5, + 0xff3ea7fe, + 0x4027ffff, + 0xbd271c27, + 0xbd0e2734, + 0x270e2634, + 0x75f39320, + 0x4107035a, + 0x11233205, + 0xf4b83403, + 0x4ea73027, + 0x93ffffff, + 0x035a5ff2, + 0x0e2543bd, + 0xc58421c5, + 0xfe0b8021, + 0xffff3ea7, + 0xbd4027ff, + 0xbd0e2434, + 0xbd0e2734, + 0x270e2634, + 0x0ef49b40, + 0x3ea7fe0b, + 0xb9ffffff, + 0xe60e2530, + 0x29f29309, + 0x24c1035a, + 0x9944f690, + 0x48069924, + 0x0e2631b9, + 0x0e2732b9, + 0x34b90120, + 0x46060e24, + 0x422b4107, + 0x4c134f6b, + 0x5e491010, + 0xfe0bfee5, + 0x26a80499, + 0x674ea746, + 0x04c5fff4, + 0xc5410338, + 0xfe0b3404, + 0xffff4ea7, + 0x234411fe, + 0xfff4704e, + 0x233404c5, + 0x3804c548, + 0x3ea7fe0b, + 0x27f9ffff, + 0x1111112f, + 0x004d2711, + 0x03320502, + 0x27f4c834, + 0x0ef49b40, + 0x9b6af49b, + 0xf49b6bf4, + 0x63f49b62, + 0x049d3027, + 0x4c039da9, + 0xc55004c5, + 0x04c55404, + 0x4404c590, + 0xc54804c5, + 0x04c5a004, + 0x4004c53c, + 0x9d4d049d, + 0x049d8b04, + 0x8a049d8c, + 0x3ea7fe0b, + 0x27fdebdf, + 0x27340540, + 0x0400004f, + 0x27341504, + 0x0ef49b40, + 0x9b6bf29b, + 0xf29b62f2, + 0x63f29b6a, + 0x9b181ca3, + 0xfe0b60f1, + 0xffff4ea7, + 0x094499fe, + 0x34874383, + 0x432b4433, + 0x004d44f9, + 0x41c4ff00, + 0x05f3930e, + 0x349902a3, + 0x9d47838b, + 0xfe0b8c34, + 0xf293fc4e, + 0xc102a2f4, + 0x23c1502e, + 0x07e33340, + 0x084e2b43, + 0x99e30740, + 0x2499312d, + 0x1bc20730, + 0x6b24074d, + 0x31171e2f, + 0x07034104, + 0x33430b21, + 0x6b4e1b43, + 0x11404c2f, + 0x8e000101, + 0x834207fc, + 0x33040741, + 0x2b433305, + 0x03120704, + 0x03340c0f, + 0xce110300, + 0xc0c1d2d2, + 0xd4c1c1d0, + 0xf393fc8e, + 0x9902a298, + 0x0f6baa34, + 0x309d4223, + 0x144f6bb0, + 0x00270f4c, + 0x0bbc30c5, + 0x7df493fe, + 0x40c102a2, + 0x4efe0bcc, + 0xc60f6bfa, + 0x044f9b05, + 0xf7ff3ea7, + 0x1e410bf9, + 0x043f9b0b, + 0xf7ff4ea7, + 0x07310bf9, + 0x27e407d3, + 0x271800ad, + 0x060700bf, + 0x27c42704, + 0x0706001d, + 0x070f6b0b, + 0x03233320, + 0xe8031e24, + 0x0024f1f3, + 0x27ff0210, + 0x184c3333, + 0xc01d4c53, + 0x4007ee44, + 0x4ef54533, + 0xff021800, + 0x180441f5, + 0x3027ff02, + 0xe8004e23, + 0x034335fd, + 0xfde8004e, + 0x18104df5, + 0x41f5ff02, + 0xff021814, + 0xe7f04e23, + 0x2b4335fd, + 0x07c244a1, + 0x1ec1274a, + 0x07c12307, + 0x0bc58641, + 0x53d10be1, + 0x1e1407b8, + 0x000f2797, + 0x27040607, + 0x6b200714, + 0x0323332f, + 0xe8031e24, + 0x0024f1f3, + 0x27ff0210, + 0x6a4ddc33, + 0x0853f2fc, + 0xfa8ef110, + 0xd007fb4e, + 0x2f6bb107, + 0x00ff4f27, + 0xf49b4000, + 0x7e020761, + 0xfc93ff06, + 0x2702a19c, + 0xc8c4c540, + 0x26c4c4c5, + 0x070d07d7, + 0xb1c6be1b, + 0x334d07ff, + 0x534f6bd8, + 0xc4c518dc, + 0xc8cdc5c4, + 0xd494c4c1, + 0x1980004d, + 0x0d274636, + 0x10078000, + 0x10be2027, + 0xc0c5005d, + 0x004d2798, + 0x94c4c580, + 0xfd4efb8e, + 0xa14bf493, + 0x66441902, + 0x93302745, + 0x035817f4, + 0xdd274305, + 0xf0930600, + 0x7e02a13c, + 0x3ea7fd70, + 0x27f9f7ff, + 0x054d0720, + 0x03d12332, + 0x93f4b834, + 0x02a123f0, + 0x93fd817e, + 0x02a11bf0, + 0x20271027, + 0x93fdc97e, + 0x02a10ff4, + 0x9d7f3ca7, + 0x3c27b043, + 0xac43c5f7, + 0x4dc530a7, + 0xaa439d9c, + 0xc5bc4dc5, + 0x4dc5c04d, + 0x4efd8eb8, + 0xddf493fe, + 0x4ce30253, + 0x9b071e7f, + 0x4c0308f4, + 0x004fd080, + 0xf4000307, + 0xa0d2f393, + 0x8c329902, + 0x078a3499, + 0x9d42ab03, + 0xaabe8c34, + 0x002700c3, + 0x53aef193, + 0xfe417e02, + 0x93604f9b, + 0x0253a3f3, + 0x200034d5, + 0xd5634f9b, + 0x9b200434, + 0x34d5624f, + 0xfe8e2008, + 0x05634f9b, + 0x91f49304, + 0x43c102a0, + 0x9903153c, + 0x039db043, + 0xaa439908, + 0x9909039d, + 0x039dac43, + 0x8b44990a, + 0x0b0b049d, + 0x634f9bfe, + 0xa06af393, + 0xc5412302, + 0xfe0b4034, + 0x0399fd4e, + 0x83d0078a, + 0x2734d637, + 0x99fd8e00, + 0x4fa38b04, + 0xffffffa0, + 0x049d43ab, + 0x630f9b8b, + 0xbe40d0c5, + 0x0700c40a, + 0xc2e9be0d, + 0x8bd49900, + 0x46180027, + 0xfd8e0127, + 0xf293fe4e, + 0xc102a024, + 0x4f9b4023, + 0x1134ce63, + 0x388b2499, + 0x4ca3104c, + 0x8b249d20, + 0x00c395be, + 0xa006f093, + 0x8c049902, + 0xab8a0399, + 0x8a049d43, + 0x049d4027, + 0x623f9b8c, + 0xce634f9b, + 0x893e0943, + 0x022704c6, + 0xf093fe8e, + 0x99029fe0, + 0x4c838b04, + 0x104c24f0, + 0xfe8e0027, + 0x8b9c04c1, + 0x4efe8ef4, + 0xff4ea7fb, + 0x0cc1ffff, + 0x9a4bb938, + 0x27d0070b, + 0x009d5e00, + 0xd0994307, + 0x0f4c8331, + 0x0183e407, + 0xe3334533, + 0x2007e40b, + 0xee233007, + 0x33fff464, + 0x2b353323, + 0x0be17132, + 0x81e2613d, + 0x413135e4, + 0x07420be1, + 0x83342521, + 0x3127802c, + 0x30272496, + 0x26332307, + 0x27a31138, + 0x1c38151e, + 0x1e23a310, + 0x001d380e, + 0x1e21a304, + 0xa3100c06, + 0x4007802c, + 0x03334533, + 0x4d0b402b, + 0xc114429d, + 0x403154d1, + 0xc3194145, + 0xc115439d, + 0xe12154d3, + 0x300be231, + 0x42154105, + 0x1954d3c5, + 0x030127c4, + 0x99c41d41, + 0xd39931d4, + 0x03410330, + 0x31d49d31, + 0x9930d39d, + 0x42d430d4, + 0x07c3190c, + 0xfc4b2b43, + 0xff56804c, + 0xfa4efb8e, + 0x99310499, + 0x0bc13003, + 0x07432b34, + 0x6bd107e4, + 0x1ea027ef, + 0x41313141, + 0x33210b32, + 0x2b420723, + 0x9941284d, + 0x4cd81434, + 0x34994620, + 0x104cdc14, + 0x0e44d817, + 0xd24e15b6, + 0x1b320499, + 0x804cd84e, + 0x03b4192f, + 0x99b41d41, + 0xec073004, + 0xef6b4123, + 0x2730049d, + 0x834e07a1, + 0x33340741, + 0x2b433335, + 0x31049934, + 0x300bce07, + 0xe4cec103, + 0x41051ea9, + 0xc1041e34, + 0x04c55404, + 0xa7a7e650, + 0xffffff3e, + 0x34bd4127, + 0x33990635, + 0x9b40270f, + 0x41270ef4, + 0x34f53387, + 0xff02b040, + 0x99310499, + 0x03993002, + 0x6b422b32, + 0x18342b4f, + 0x049d803c, + 0x4efa8e32, + 0x51f093fd, + 0x36be029e, + 0xfd9300c1, + 0xc1029e48, + 0x0d0754d1, + 0x13331103, + 0x07ff357e, + 0xfe6d7e0d, + 0xf09301f6, + 0x7e029e30, + 0xd1c1fa8e, + 0x25f093a4, + 0x2027029e, + 0xd35efd0e, + 0x07fb4efa, + 0x070107b0, + 0xc1e0bec1, + 0x070b0700, + 0xff047e1c, + 0xfb0e0b07, + 0x4efe3a5e, + 0xf1f493fc, + 0x4ce30250, + 0x9b071e7f, + 0x4c030cf4, + 0x004fd080, + 0xf4000307, + 0xf49b4027, + 0xe1f0930e, + 0x157e029d, + 0x930127fa, + 0x0250cbf1, + 0x93fb5e7e, + 0x0250c3fc, + 0x9dcaf093, + 0x00c1d102, + 0x04c2d120, + 0x7ed00720, + 0xd499fa72, + 0xd147588a, + 0xd12004c3, + 0xce2008c4, + 0xd4992834, + 0x0744f630, + 0xfdd97e0d, + 0x2004c1d1, + 0x9940d4c1, + 0x411b4cd2, + 0x40082432, + 0xf0932027, + 0x0e029d8c, + 0xc2a59efc, + 0x4efc8e00, + 0x63cf9bfc, + 0x9d7af093, + 0x3c01c102, + 0x90be2027, + 0x4f9b00c2, + 0x4e002763, + 0x2701274c, + 0x65f49b48, + 0xfb4efc8e, + 0xfd93b007, + 0xc1029d58, + 0xd29940d4, + 0x324b1b4c, + 0x27400824, + 0x070d0720, + 0xc261be1b, + 0x44c00700, + 0x634f9b03, + 0x1e40d4c5, + 0x630f9bdf, + 0x00c0fdbe, + 0x0744d1c1, + 0xfe207e0d, + 0xc4aad499, + 0x4f9b1b41, + 0x40d3c163, + 0x4f50432b, + 0x70000001, + 0x03634f9b, + 0x0000004f, + 0x40d4c5f0, + 0x0d07c444, + 0xd6fd367e, + 0x0c07a60f, + 0xfd4efb8e, + 0x0401d007, + 0x2b633f9b, + 0x7140c843, + 0x24090399, + 0x93f25331, + 0x240d1e06, + 0x09f25332, + 0x53051e05, + 0x930370f2, + 0x029ccff4, + 0xc5aa439d, + 0xd0999c42, + 0xfa287e08, + 0xbe0ad099, + 0x9b00bff2, + 0xd00160f0, + 0xc0ff557e, + 0xf393f902, + 0x99029cac, + 0xd2118a34, + 0xc10e41d8, + 0x42079033, + 0x432b3333, + 0x23074108, + 0x9c92f493, + 0x3c42c502, + 0x270bdd99, + 0x8b4d9d30, + 0x9b8c439d, + 0xfd0e630f, + 0x00c0499e, + 0xfd4efd8e, + 0xf093d007, + 0x7e029c70, + 0xf493fca3, + 0xc1029c68, + 0x42994043, + 0x2b4d074c, + 0x08243243, + 0x07202740, + 0x51f0931d, + 0xfd0e029c, + 0x00c16a9e, + 0xf093fc4e, + 0xbe029c44, + 0x9b00bf29, + 0xf293604f, + 0xc5029c38, + 0x3f9ba424, + 0xd9f49363, + 0x14070353, + 0xc5d71c03, + 0x3407a023, + 0xe37f1ce3, + 0x34197f3c, + 0xc2803c03, + 0xf293f931, + 0x930353bc, + 0x029c0bf3, + 0x01364c27, + 0x05340331, + 0xa8240321, + 0xf9f293f4, + 0xf393029b, + 0x270352c8, + 0x3101364c, + 0x21053403, + 0xf4a82403, + 0x9be2fc93, + 0xa4c1c102, + 0x07a0c2c1, + 0xf88c7e0c, + 0x0ea0c0c1, + 0xff585efc, + 0xf093fc4e, + 0xbe029bc8, + 0x9b00bead, + 0xf293604f, + 0xc5029bbc, + 0x3f9ba424, + 0x85f49363, + 0x14070352, + 0xc5d71c03, + 0x3407a023, + 0xe37f1ce3, + 0x34197f3c, + 0xc2803c03, + 0xf293f931, + 0x93035268, + 0x029b8ff3, + 0x01364c27, + 0x05340331, + 0xa8240321, + 0x51f493f4, + 0x42b90352, + 0xfd930180, + 0x06029b74, + 0x07340727, + 0xd83c030d, + 0x01364c27, + 0x05340332, + 0xa8040302, + 0x271b1ef4, + 0x38d3c141, + 0xc5a8d49d, + 0xd2c594d2, + 0x190d0798, + 0xf77e7e3c, + 0x1d38d4c1, + 0x3dfc934c, + 0xc1c1029b, + 0xa0c2c1a4, + 0xe77e0c07, + 0x8ac499f7, + 0xc10b47d8, + 0xc3c190c4, + 0x4e4333a0, + 0xa0c0c134, + 0xa35efc0e, + 0x93fc8efe, + 0x029b13f4, + 0x5e4040c1, + 0xf54efe96, + 0x99310499, + 0x02c13003, + 0x07432b98, + 0x07f0a3c4, + 0x07cf6bd0, + 0x278027b2, + 0x27502790, + 0xff6ea7a0, + 0x7ea7fde7, + 0x05fde7ef, + 0x5ef115f2, + 0xec07009f, + 0x4e07e183, + 0x43333e07, + 0x342b3533, + 0x30313d0b, + 0xf1113441, + 0x2407400b, + 0x212b2333, + 0x23732703, + 0x20072002, + 0xa4d63321, + 0x522b5407, + 0xd4c11a07, + 0xca120b94, + 0x030b6d41, + 0x0bce022b, + 0x1e24d627, + 0xa7f3e823, + 0xfdefff3e, + 0x33273411, + 0x53184c33, + 0x44c01d4c, + 0x156005ed, + 0x35402762, + 0x157b0564, + 0x07743572, + 0x3335333e, + 0x0b3e2be3, + 0x1430993d, + 0x0ca34807, + 0x9d49ab20, + 0x44d61430, + 0x39113801, + 0x47834007, + 0xc4074566, + 0x0710cca3, + 0x071d1ea1, + 0x0741034c, + 0x6bb20bc4, + 0x99a107cf, + 0xc4ee31d4, + 0xcc27ff5e, + 0xe8051e10, + 0xa7061ef3, + 0xfdefff2e, + 0x33272411, + 0xfc6a4ddc, + 0x07f111ef, + 0xfb147e0d, + 0x9931d499, + 0x432b30d3, + 0x2f6b2407, + 0xd632d29d, + 0x1e0027a4, + 0x8321233f, + 0x07420721, + 0x33433312, + 0x0b142b15, + 0x9d40271d, + 0x1c9d1514, + 0x35f40114, + 0x0515451a, + 0x25191518, + 0x30d49914, + 0x0390d5c5, + 0x30d49d41, + 0x0750d5c5, + 0xbe30270d, + 0x1100bdd7, + 0x83033300, + 0x4ef58ef0, + 0x440dc1f8, + 0x9107c007, + 0xd7e3a207, + 0x0c078027, + 0x00bc98be, + 0x1d070c07, + 0x99fe9d7e, + 0xb0078ac4, + 0x0c074576, + 0x27f9d27e, + 0x27049641, + 0x07b82240, + 0xdb4fd68b, + 0xcdc1b4f6, + 0x07d33350, + 0xbe1abe0c, + 0x07b00b00, + 0xbe0d071b, + 0x0700bc45, + 0x124d2b49, + 0x07a027a4, + 0x0e1a0709, + 0xbbbe9ef8, + 0x93fa4e00, + 0x02995ff4, + 0xc14c4399, + 0x439d3c0a, + 0x0730274d, + 0x4c439dc0, + 0xd4c1d407, + 0x4cd39940, + 0x34324a1b, + 0x400c2027, + 0x0d072307, + 0x54be1a07, + 0xb00700be, + 0x4f9b0344, + 0x40d4c563, + 0x0f9b3a1e, + 0xbcf0be63, + 0x44d1c100, + 0x137e0d07, + 0xaad499fa, + 0x9b1b41c4, + 0xd3c1634f, + 0x50432b40, + 0x0000014f, + 0x634f9b70, + 0x00004f03, + 0xd4c5f000, + 0x240d0740, + 0xf9297eb4, + 0x93a40fd6, + 0x0298ebfd, + 0x9d4dd499, + 0xb4e04cd4, + 0xb2c4010c, + 0x8bc3991b, + 0xa38ac499, + 0x4783203c, + 0x0c0734ab, + 0xbe8bc39d, + 0x2700bb7b, + 0x99fa8e02, + 0xd49daac3, + 0x2740274d, + 0x4cd49d00, + 0x0cbeb347, + 0x0f9b00bf, + 0xbc78be63, + 0xbe0b0700, + 0x9900bf92, + 0xd49d4dd4, + 0x9e0bea4c, + 0x64df9b00, + 0xdc534827, + 0x65f49b18, + 0x9b2fb9d0, + 0xf49b643f, + 0x183c5365, + 0xd3ab3833, + 0x1e11bcd0, + 0x27644f9b, + 0x65f39b38, + 0x9b642f9b, + 0x4c5365f3, + 0x104c3318, + 0xffff2ee3, + 0xab42abff, + 0x9d4027d4, + 0x4d078bc4, + 0x4fd44123, + 0x0fffffff, + 0x634f9b2b, + 0xc4c50407, + 0xbc10be40, + 0x40c4c100, + 0xd40bd333, + 0xc5c0c0c1, + 0x8cbe3ccd, + 0xc49900be, + 0xa300278b, + 0xc49d104c, + 0x9bfa8e8b, + 0xc4c5634f, + 0x19f49340, + 0x42c10298, + 0x624f9b40, + 0x99631f9b, + 0x412b8bc3, + 0xff002f03, + 0x242b7fff, + 0x1e403ca3, + 0x8ac4991e, + 0x9b2246d8, + 0xc399632f, + 0x8ac4998b, + 0x3ca307e3, + 0xc5478320, + 0x34ab40c2, + 0x0227200b, + 0xc58bc39d, + 0xfa8e3cc2, + 0xfa8e0427, + 0xf393fa4e, + 0x990297cc, + 0xd0074c34, + 0x274d349d, + 0x4c349d40, + 0x4b8b0499, + 0x27402c4f, + 0x07711eb4, + 0x99b027a3, + 0xa3c18adc, + 0x634f9b3c, + 0xc10e34ce, + 0x0d073cd1, + 0xb8be2027, + 0xb00700bc, + 0xbe630f9b, + 0xc100bb5e, + 0x0d0744d1, + 0x07f8817e, + 0x7eb4440d, + 0x0ba6f7b7, + 0xc636ce1e, + 0x9b3ca4c1, + 0x432b633f, + 0xdc99412c, + 0x99c1a38a, + 0x3c078bd4, + 0x4ca33783, + 0x9d43ab20, + 0x0d078bd4, + 0x00ba0abe, + 0xb227c618, + 0xa38bd499, + 0xffff804f, + 0x8bd49dff, + 0x996db2c0, + 0x4f4b8bd4, + 0x275a40cc, + 0xbe24be01, + 0x30d49900, + 0xb42744d6, + 0x4f9b4b1e, + 0x8ad39963, + 0x5840d4c5, + 0x90d4c131, + 0x191e4333, + 0x9716f493, + 0x4044c102, + 0x9b623f9b, + 0x322b632f, + 0xff004f03, + 0x432b7fff, + 0x273cd4c5, + 0xd49d104c, + 0x0706b68b, + 0xf6927e0d, + 0xd1c105c6, + 0x270d0744, + 0xf7e07eb2, + 0xb027031e, + 0x96def493, + 0x4d439902, + 0x074c439d, + 0x4efa8e0b, + 0x63bf9bfa, + 0x96cafa93, + 0xc1b78302, + 0x4f9b3cac, + 0x1fdc2763, + 0xdb2bc42b, + 0x9b624f9b, + 0x432b633f, + 0x0718d4d2, + 0xbd98be0d, + 0x0fd0d200, + 0x9b3ca4c1, + 0x432b633f, + 0xa4274032, + 0xa027031e, + 0xecbe0027, + 0xdf9b00bc, + 0x89f49364, + 0x40c10296, + 0xbcddbec0, + 0x27c12c00, + 0x07fa8e01, + 0x002f032d, + 0xcc800000, + 0x270c20cc, + 0x3c2b203c, + 0x433b40a7, + 0xb103248b, + 0x4b5b4207, + 0x002744c6, + 0x0127fa8e, + 0x0027a486, + 0xf54efa8e, + 0x964af493, + 0x4c439902, + 0x439df0a3, + 0x276f074d, + 0x4c439d30, + 0xb407c007, + 0xffff5ea7, + 0x936403ff, + 0x034c5ff7, + 0x99108c27, + 0x4fe6a8c4, + 0x54b9015d, + 0x4fe60e25, + 0xf9ab0155, + 0x07630f9b, + 0xbe2f0716, + 0x26010f57, + 0xc4c4c10c, + 0x19804c24, + 0xc145c6f4, + 0x4cc4c8c4, + 0xf4191480, + 0x110f41c4, + 0x7e0223f0, + 0xd007f88e, + 0x1eccc8c5, + 0x7ef0110d, + 0x4227f882, + 0xc4c5d007, + 0x90dff6cc, + 0x0f65be00, + 0xf1ccbe01, + 0x00855eff, + 0xfff1c5be, + 0x338474c1, + 0x9bf41543, + 0x432b633f, + 0x116a40c8, + 0x40b4c1fa, + 0x1b4cb299, + 0x0824324a, + 0x07202740, + 0xbe1a070b, + 0x0700babf, + 0x0b03c4d0, + 0x27634f9b, + 0x40b4c5d2, + 0x0f9b4a1e, + 0xb958be63, + 0x44b1c100, + 0x7b7e0b07, + 0xaab499f6, + 0x9b1b41c4, + 0xb3c1634f, + 0x50432b40, + 0x0000014f, + 0x634f9b70, + 0x00004f03, + 0xb4c5f000, + 0x0ad4c440, + 0x907e0b07, + 0x1e05a6f5, + 0xc4d4e6a1, + 0x031e0ad4, + 0x4027d427, + 0xeb8bc49d, + 0x99181ef9, + 0x46fc8ac4, + 0x40270095, + 0xc49dd427, + 0x008f5e8b, + 0x000db8be, + 0xd3e0d007, + 0xd2c4ff03, + 0x8ac49911, + 0x47830c07, + 0xbe8bc49d, + 0x1e00b7cb, + 0x6edfd671, + 0x99634f9b, + 0xc4c58ac3, + 0xc1315840, + 0x433390c4, + 0xf493191e, + 0xc10294fc, + 0x3f9b4044, + 0x632f9b62, + 0x4f03322b, + 0x7fffff00, + 0xc4c5432b, + 0xc0c0c13c, + 0x9d104c27, + 0x34be8bc4, + 0xc4c100bb, + 0x004fa3bc, + 0x9b400000, + 0x402761f4, + 0x1eb4c4c5, + 0xbe002721, + 0x9b00bb1b, + 0x87be630f, + 0x0d2700b8, + 0x9fbe2000, + 0x0ff600bb, + 0x685eff7c, + 0x1ed227ff, + 0xa1f49381, + 0x43990294, + 0x830d074d, + 0x4c439df0, + 0xfb4ef58e, + 0xd007b107, + 0x0cc0bf6b, + 0x01245f20, + 0xfe34f453, + 0x02240d1e, + 0xfcaaf453, + 0xf453051e, + 0xfc93fb11, + 0x99029470, + 0xc4c5b0c0, + 0xaacd9d9c, + 0x27f1c97e, + 0x3cc4c540, + 0x4c27d220, + 0xa7041e31, + 0xc49d7f4c, + 0x93b6468b, + 0x02944bf4, + 0x83ac40c1, + 0x0ca30f0c, + 0x27041e10, + 0x6fbe180c, + 0xf49300b7, + 0xc1029434, + 0xfb0ec040, + 0x00ba869e, + 0xf293fb8e, + 0x270294fc, + 0x13239941, + 0x46e3249d, + 0x89246936, + 0x342b1a23, + 0x240d4027, + 0x2d13249d, + 0x27fe0b23, + 0xd9f49331, + 0x43bd0294, + 0xfe0b0133, + 0xffff3ea7, + 0xbd4327fe, + 0x270be334, + 0xdc34d540, + 0xe034bd0b, + 0xbd41270b, + 0x270be134, + 0xe234bd42, + 0x27fe0b0b, + 0xc1040d40, + 0x0399e804, + 0x3804c512, + 0xc5ec04c1, + 0x04896404, + 0xc4042df0, + 0x03890e34, + 0x2a044910, + 0x9e112734, + 0x0b0005ed, + 0x07fc4efe, + 0x300c03c0, + 0x00ceb9be, + 0x0c030c07, + 0xceb0be5c, + 0xbe002700, + 0x0e00cc1b, + 0xb3c19efc, + 0xbefd4e00, + 0x93fff533, + 0x02945bf0, + 0xd23ed007, + 0xc412d499, + 0x0d071344, + 0xbe300c03, + 0x0700cf1a, + 0x5c0c030d, + 0x00cf11be, + 0x40a73027, + 0x9d13d39d, + 0xd42512d3, + 0xffdf0ea7, + 0x4f2cbeff, + 0x44d4c100, + 0x0738d1c1, + 0xeb140b0d, + 0x300c0314, + 0x0006acbe, + 0xc170d4c1, + 0x0d0764d1, + 0x0c03140b, + 0xbe14eb5c, + 0xa7000699, + 0xffffdf0e, + 0xd89efd0e, + 0xfc4e004e, + 0x93f2f493, + 0x03240702, + 0x07013f2d, + 0x7f2ce334, + 0x197f3ce3, + 0x803c0334, + 0x93f932c2, + 0x0293d7f3, + 0x4c272027, + 0x03320550, + 0x93f4c834, + 0x0293c7fc, + 0xe0a70c07, + 0x0c03ce25, + 0x27e02730, + 0x27202717, + 0x2724003d, + 0x12ce9d49, + 0x0005dcbe, + 0x16270c07, + 0x3d272927, + 0x4a271800, + 0xbe5c0c03, + 0x070005c9, + 0x047abe0c, + 0x5efc0e00, + 0xfb4efebc, + 0x21260189, + 0x33410702, + 0x33b18748, + 0x1bc00714, + 0x300c0314, + 0x000654be, + 0xcb8d4027, + 0x88c0c58e, + 0x8e8cc48d, + 0x21f94efb, + 0x5dfa9304, + 0x4c030293, + 0x3ca4c538, + 0xd0070331, + 0x5968a3c5, + 0x9df06304, + 0x038914a4, + 0x8d90272a, + 0x048924a3, + 0x26a48d28, + 0x9d180399, + 0x047917a3, + 0x5116a49d, + 0x1b029901, + 0xcc83c107, + 0x23c3330f, + 0xffff84ce, + 0x4c070381, + 0x44030a07, + 0x05300c03, + 0x06b6bef9, + 0x51b00700, + 0x1cd299d1, + 0x4c07d391, + 0x45030a07, + 0x055c0c03, + 0x069ebef9, + 0xd60b8b00, + 0x1e0a2704, + 0x30d3c11f, + 0xd516a499, + 0x850124a9, + 0x0744e6a3, + 0xff507e0a, + 0x4027dd51, + 0xa48dad25, + 0x430027e4, + 0x4ef98ef0, + 0x03c007fc, + 0xd4be300c, + 0x0c070004, + 0x0e5c0c03, + 0x04c99efc, + 0xa3fb4e00, + 0x89f055f1, + 0xf08914fe, + 0x07312316, + 0xa1fd93be, + 0x340b0292, + 0xf4a1b12b, + 0xd38dd16d, + 0x4ddb2d10, + 0xd1c207d0, + 0x16012cd1, + 0x1df41545, + 0x8d4f07f4, + 0xfe8d16f0, + 0x07f25114, + 0xe4dc8d34, + 0x5cbe0d07, + 0xc00700ca, + 0xd43106d6, + 0x2b12d399, + 0x20d4354b, + 0x3e0d0734, + 0x9d442793, + 0x0c0712d4, + 0xfb8ef183, + 0xf093fe4e, + 0x7e02924c, + 0xf093fdc5, + 0x7e029244, + 0xf093fd93, + 0x0e02923c, + 0xff6d5efe, + 0xfc93fb4e, + 0x07029260, + 0xca3ebe0c, + 0x07b00700, + 0x2c0c030c, + 0x00ca33be, + 0x921af493, + 0x3842c102, + 0x296441c1, + 0x2b4e0943, + 0x2b102b2b, + 0xf0438d3e, + 0xc5e842c5, + 0xfb8eec41, + 0xfd93fd4e, + 0x990291f8, + 0x44c412d4, + 0x27ba3e0d, + 0xc999be00, + 0xb141be00, + 0x030d0700, + 0x04be300c, + 0x0d070005, + 0xbe5c0c03, + 0xbe0004fb, + 0x0effd35e, + 0xf0059efd, + 0xa7fd4eff, + 0xfdebc72e, + 0x24054027, + 0x00003f27, + 0x23150903, + 0x230ef49b, + 0x27240528, + 0x0400003f, + 0x9b231506, + 0x2ea70ef4, + 0x05fdebdf, + 0x003f2724, + 0x15040400, + 0x0ef49b23, + 0xfff2b6be, + 0x918af093, + 0xbed00702, + 0x7e00026c, + 0x29befcb0, + 0xd499ffd3, + 0x07442412, + 0xfcc57e0d, + 0xf49b4127, + 0x030d07a2, + 0x8cbe300c, + 0x0d070003, + 0x0e5c0c03, + 0x03819efd, + 0xa7fc4e00, + 0xfeffff4e, + 0xdea74411, + 0xd1ffffff, + 0x870624d3, + 0x8843f544, + 0x07ff000e, + 0x633f9b40, + 0x40c8432b, + 0x59fc931b, + 0xc3990290, + 0x9d40274c, + 0xc39d4cc4, + 0xf2ecbe4d, + 0x4dc499ff, + 0x934cc49d, + 0x02903ff4, + 0x9d4c4399, + 0x30274d43, + 0xd14c439d, + 0x9b0e20dc, + 0xf7be630f, + 0x4f9b00b3, + 0x633f9b62, + 0xc4d2432b, + 0xbe0c070c, + 0x1200b706, + 0x634f9bc0, + 0x900ef493, + 0x4d439902, + 0x8e4c439d, + 0x93f84efc, + 0x0290d7f4, + 0xd1124a99, + 0xf6012c4d, + 0xa7010daf, + 0xffffff4e, + 0xfb430ea7, + 0x1c4cd1ff, + 0xc157be0e, + 0xc4b00700, + 0xffffff0f, + 0x0c070aff, + 0x27ff547e, + 0x07f88e05, + 0xa7333330, + 0xfd4fff4e, + 0x48110027, + 0x04d03cf1, + 0x39f1ff00, + 0xff0004cc, + 0x00b03cbe, + 0xebff3ea7, + 0x273a05fd, + 0x0200004f, + 0x2734150b, + 0x0ef49b40, + 0x29070027, + 0xa2be1c07, + 0xf393ffd1, + 0x93028f84, + 0x02a6c6f2, + 0xe37f3ce3, + 0x34197f2c, + 0xc2803c03, + 0xc907f932, + 0x904ef493, + 0xd1c25302, + 0x07012c42, + 0xae4f9b3c, + 0xc1232405, + 0xf3a02403, + 0xbafda027, + 0xff0004c0, + 0xfb434ea7, + 0x664479ff, + 0x410ea745, + 0x19befffb, + 0x4ea7004e, + 0x93fd4fff, + 0x029017f1, + 0x10d14301, + 0x4127012c, + 0x9d12149d, + 0x18d5e31a, + 0x13bd0138, + 0x02510132, + 0x24ce1421, + 0xa72f6b2f, + 0xfeffff4e, + 0x110c2c33, + 0x002ea343, + 0x4ea71000, + 0xd5fddfff, + 0xd5020842, + 0x9d02084c, + 0x1c9d6e1c, + 0x87005142, + 0x8830f533, + 0xd1ff000e, + 0x03012c10, + 0xf3be440c, + 0xfc93fff1, + 0x21028fbc, + 0x4ed451c3, + 0x7e0d0734, + 0x0b36fc4d, + 0xc49d4027, + 0xe0c49de1, + 0x2740d499, + 0x30c4bd00, + 0x40d49901, + 0x4e234333, + 0xd5fffaa4, + 0x990120c4, + 0xc49d39d4, + 0x34d4c115, + 0x4327c435, + 0xc112c49d, + 0x44493cd4, + 0x8e2cc48d, + 0x89fb4ef8, + 0x03898c0c, + 0x874c078e, + 0x880dc12c, + 0x3c2b4633, + 0x038d422b, + 0x07d42b8e, + 0xbec103b0, + 0x1e00aeaf, + 0x09b44916, + 0x0b249bd3, + 0x87b38123, + 0x0bd40342, + 0x034d0543, + 0xb28938dc, + 0x27fc2826, + 0x8cb38d30, + 0x078eb489, + 0x4a315332, + 0x0e0b0734, + 0xfb985efb, + 0x0027fb8e, + 0xfe0bfe0b, + 0xc007fc4e, + 0x0c031127, + 0x162c27f4, + 0x2d003d27, + 0x36be4827, + 0x0c070001, + 0x27f80c03, + 0x172c2712, + 0x2e003d27, + 0x22be4827, + 0x3ea70001, + 0x27fdebbf, + 0x27340540, + 0x0200004f, + 0x2734150c, + 0x0ef49b40, + 0xfc4efc8e, + 0x8ed2f493, + 0x2c44d102, + 0x89e00701, + 0xc1071044, + 0xd29bd447, + 0x0616d30b, + 0x1a331407, + 0x20270d07, + 0x004986be, + 0x14010c1e, + 0x070bd4c2, + 0x48a2be1d, + 0x05e00700, + 0x8e0e07cd, + 0x27fb4efc, + 0xe2049d41, + 0x27e40489, + 0x070b2930, + 0xad030dd0, + 0x2d011c04, + 0xc621be03, + 0x1ec02700, + 0x03d40917, + 0xab4123c1, + 0x96d40d4f, + 0xc61fbe45, + 0x2704d600, + 0x07081e07, + 0xe6cbce0d, + 0x40270027, + 0x8ee2d49d, + 0x21fc4efb, + 0x1ed0070c, + 0x10d49957, + 0x345b3c07, + 0x41834307, + 0x4487de51, + 0x4d0bd319, + 0x4161d039, + 0x4c072e07, + 0x4e8b3533, + 0x242b2103, + 0x180030f5, + 0x410bff02, + 0x180432f5, + 0x1027ff02, + 0xe8003e23, + 0x033135fd, + 0xfde8003e, + 0x181034f5, + 0x32f5ff02, + 0xff021814, + 0xe7f03e23, + 0x0b3135fd, + 0xa1dc25c2, + 0xa6c4ced4, + 0xd49d4227, + 0x19fc8e12, + 0x24300704, + 0x9b412746, + 0x3499a2f4, + 0x1e448612, + 0x99fe0b85, + 0x42041204, + 0x0bff7c5e, + 0x07fe4efe, + 0x0b4623e4, + 0x0f4c83e3, + 0x3d0e3c33, + 0x83011d02, + 0xf000003f, + 0x2713333f, + 0x104c3320, + 0x12f543ab, + 0xff021400, + 0x140414f5, + 0x0e2dff02, + 0xf49b4027, + 0x4efe8e0e, + 0x07d007fd, + 0xb570be01, + 0x10d299ff, + 0xd1a1d421, + 0x4183425b, + 0x323b3127, + 0x310b4487, + 0x40654d0b, + 0x1526d3a5, + 0xfd0e0d07, + 0x8eff185e, + 0x63fb4efd, + 0x07d007f0, + 0x99271eb1, + 0xcb0710d1, + 0xc183c15b, + 0xcd0bcc87, + 0xf405c461, + 0xffb848be, + 0xa110d299, + 0x3b4127d3, + 0x27342b42, + 0xa5c46540, + 0x07d4a1d3, + 0xce21270f, + 0xf043d2b4, + 0xfc4efb8e, + 0x67bec007, + 0x0c0700c7, + 0x345efc0e, + 0x07fb4eff, + 0xbeb107d0, + 0x5100c756, + 0x07d221d4, + 0xeb320b34, + 0x2b430734, + 0x25b42242, + 0x992307d3, + 0x320710d4, + 0x4307345b, + 0x44874183, + 0x43614d0b, + 0x4207dc51, + 0xc28b4b0b, + 0xd4250d07, + 0xc30bd415, + 0x07fef27e, + 0x4efb8e0c, + 0x120499fd, + 0x4244d007, + 0x00c70dbe, + 0xd49d4227, + 0x4efd8e12, + 0xa7d007f9, + 0xffffdf0e, + 0xc107b207, + 0xda99d9a1, + 0xc6bcbe10, + 0x10d09900, + 0x1c072b07, + 0xffb777be, + 0x0656b007, + 0xf49b4027, + 0xdf4ea70e, + 0x0027ffff, + 0xf98e4b05, + 0xca5bc907, + 0x0d071c07, + 0x47be1223, + 0x402700c5, + 0xa70ef49b, + 0xffffdf3e, + 0xd2993405, + 0x83d3a110, + 0x3b4127c1, + 0x0bcc8742, + 0x07cd0b34, + 0xa5cb650d, + 0xfe077ed3, + 0xf98e0127, + 0xd007fa4e, + 0x07120099, + 0x07b207a1, + 0xc6230714, + 0x8e012704, + 0x21d451fa, + 0x10d399dc, + 0xd285c40b, + 0xc4ebd195, + 0xa7343bce, + 0xffffdf0e, + 0x00472dbe, + 0x0d071c07, + 0xa7feb87e, + 0xffffdf0e, + 0x0046fabe, + 0x3b3b3127, + 0xc30b3123, + 0x4c07c3eb, + 0x41234b5b, + 0x9d11d49d, + 0xd35510db, + 0xd4a1dca5, + 0xdc25dc15, + 0x5114c4ce, + 0x070d07f2, + 0xff297e1a, + 0x04964127, + 0x04074027, + 0x0d07fa8e, + 0x27fd887e, + 0x0bfa8e01, + 0x71f393fe, + 0x4027025e, + 0x4127341d, + 0x010034bd, + 0xf4130027, + 0x0b341559, + 0x93fc4efe, + 0x025e57fc, + 0xdc07c411, + 0xf48b0c07, + 0xc41904d6, + 0x40274286, + 0xfc8ec41d, + 0xfe0bfe0b, + 0xf4933127, + 0x1d025e38, + 0x63fe0b43, + 0xba4d27f0, + 0x27f40d0b, + 0xf42d284c, + 0xf0011007, + 0xf0431803, + 0xffbfee9e, + 0x5e16f093, + 0x00041102, + 0x00a9794f, + 0x0bd91e00, + 0x07fd4efe, + 0x07f06310, + 0x071803d0, + 0xc024be0f, + 0x2704d6ff, + 0x091e1e04, + 0xba4d24f4, + 0x40f4290b, + 0x0627284c, + 0x8844f193, + 0x44d49e00, + 0x09f41300, + 0x0027d415, + 0xfd8ef043, + 0x0da1fc4e, + 0x010004b9, + 0xc007f5a3, + 0xc618dc03, + 0xbe0d0745, + 0x27ffff47, + 0x00c4bd40, + 0x273f0701, + 0x164c2720, + 0x34033205, + 0xd201f4c8, + 0x0f071d07, + 0xffa182be, + 0xf4930a16, + 0xc1032344, + 0x4c834444, + 0x3334070f, + 0x2b448735, + 0x33430734, + 0xa7432b43, + 0xfd4fff3e, + 0xd20044f1, + 0x33110003, + 0x13a843c5, + 0xc41507f4, + 0xfc8ef583, + 0xf493fd4e, + 0xc1032310, + 0xd0074443, + 0x000f3f83, + 0x00a18000, + 0x3123304c, + 0xfff03fa3, + 0x3103ffff, + 0x45334307, + 0x432b3387, + 0x13331407, + 0x1f03142b, + 0x0003d154, + 0xffaec3be, + 0xbe1b04c0, + 0x61ff9d1f, + 0x134138d4, + 0x051e12f4, + 0xff17f453, + 0xd4150d07, + 0x27fee67e, + 0x4efd8e00, + 0xbed007fd, + 0x56ffa980, + 0xfef45305, + 0x27d415fe, + 0x27fd8e02, + 0x56049d41, + 0x9d55049d, + 0xfe0b5404, + 0xf4933127, + 0x9d0341fc, + 0xfe0b0443, + 0xfe0bfe0b, + 0xf093fe0b, + 0x0b008787, + 0x4efe0bfe, + 0x271027fe, + 0x0027402c, + 0xffe7a3be, + 0x87be0227, + 0xf49300ac, + 0x270341d0, + 0x93102730, + 0x00b13bf2, + 0x43bd4205, + 0x43d505d6, + 0x43d5077c, + 0x439d0780, + 0x6a439d04, + 0x018443bd, + 0xbd82439d, + 0xbd05d243, + 0xbd05d143, + 0xbd018543, + 0xbd03ab43, + 0xbd029843, + 0xbd04be43, + 0x9d077841, + 0x20270541, + 0x06e44d03, + 0x05123c27, + 0xc8440342, + 0x5df393f3, + 0x20270347, + 0x05404c27, + 0xc8340332, + 0x75f393f4, + 0x20270341, + 0x05164c27, + 0xc8340332, + 0xbdf393f4, + 0x20270341, + 0x01604d27, + 0x34033205, + 0xf493f4c8, + 0x27034148, + 0x8d05d83d, + 0x30a70c43, + 0x2746439d, + 0x2c4d0320, + 0x133c2707, + 0x44034205, + 0xf093f3c8, + 0x8e034134, + 0xf4f493fe, + 0x040500b0, + 0x20074027, + 0x06eb04bd, + 0x27484c27, + 0xe42d0330, + 0xe404d506, + 0xc5402706, + 0x039d4004, + 0x4802c545, + 0x06e803ad, + 0x06ea03bd, + 0x0b44039d, + 0x07f74efe, + 0x6bc007a2, + 0x0c4107af, + 0x07470310, + 0xc1937394, + 0x4f9bb4cd, + 0x23b10763, + 0x790710bc, + 0x2027b40b, + 0xc35e7223, + 0x6b22c400, + 0xc868dfd6, + 0x8f9b6573, + 0x634f9b63, + 0x342b3b07, + 0x314c3353, + 0xcbbe0b07, + 0x341effea, + 0xabbcc499, + 0xab38333f, + 0x6df39b34, + 0x866d4f9b, + 0x614f9ba8, + 0x8bbcc3c1, + 0xd24fc643, + 0x53644f9b, + 0x4ace184c, + 0xbcc4c10f, + 0x00004fa3, + 0xf49b4000, + 0x9bbb1e61, + 0x282b632f, + 0x22032373, + 0xc1614f9b, + 0x438bbcc3, + 0xd1274486, + 0x0427293a, + 0x3f9b5b1e, + 0x183c5364, + 0x4127a526, + 0x1e093ace, + 0x96412705, + 0xa6402734, + 0x0fd1c044, + 0x27644f9b, + 0x65f49b48, + 0x18ff3cc4, + 0x4f9b101e, + 0xbcc3c161, + 0x438b0027, + 0x1eccc4c5, + 0x27d77624, + 0x9b161ed1, + 0xc3c1614f, + 0x66438bbc, + 0x003fa345, + 0x9b400000, + 0xd02761f3, + 0x29fa2103, + 0x0327ff3d, + 0x8eb4cdc5, + 0x010d08f7, + 0x000d2720, + 0x27100720, + 0xf093d82c, + 0x5e028768, + 0xfb4efef9, + 0xe7beb007, + 0x002700aa, + 0x00aa8dbe, + 0x00adaebe, + 0xbe630f9b, + 0x2700ab1a, + 0xbe20000d, + 0x0700ae32, + 0x27c00710, + 0x39f09320, + 0xca7e0287, + 0xd6d007fe, + 0x614f9b0a, + 0x872afc93, + 0xbcc3c102, + 0x438b0227, + 0xbeccc4c5, + 0xbe00aa52, + 0xc100ad73, + 0x4fa3bcc4, + 0x40000000, + 0x9361f49b, + 0x00afd9f4, + 0xb4050027, + 0x8eb4cdc5, + 0xa9cfd6fb, + 0xfb8e0427, + 0xf4e3f94e, + 0x0713ac27, + 0x079107d0, + 0x07b0273f, + 0x233b054a, + 0xb83403a1, + 0x70d189f4, + 0x8d6cde89, + 0xf28928f1, + 0x6ed08928, + 0x24334287, + 0x4027242b, + 0x1d72d389, + 0x004d27f4, + 0x34f48d01, + 0x8d144c27, + 0xf48d2af3, + 0x27319b2c, + 0x7504004d, + 0x22f08df0, + 0x3d2ef48d, + 0x8dfe65fa, + 0xf3c520fe, + 0x08fb9d30, + 0x2780dd99, + 0xc007c84c, + 0x8d3cf2c5, + 0xfd9d16f0, + 0x36f48d47, + 0xfb7dfb5d, + 0x9d14fe8d, + 0xfb9d04fb, + 0x07fb9d06, + 0x1f070907, + 0xbe4c2c27, + 0x2600348e, + 0x07090707, + 0x134c273f, + 0x34033201, + 0x04030205, + 0x0f07f4a8, + 0xff968fbe, + 0xf98ef4c3, + 0xd007fa4e, + 0xc6050099, + 0x8e002704, + 0x004d27fa, + 0xe4d4d501, + 0xbd402705, + 0x2705ecd4, + 0x1ad4bd41, + 0x484c2706, + 0x06e4d4d5, + 0x8970d489, + 0xd4ad6ed1, + 0xd48905f2, + 0x6cd28972, + 0x05f4d4ad, + 0xad74d499, + 0xbd0616d1, + 0x990618d4, + 0xd1ad75d4, + 0xd18905f8, + 0xbd302708, + 0x070619d4, + 0x14d2ad4d, + 0xead3bd06, + 0xf6d2ad06, + 0xfad3ad05, + 0xefd3bd05, + 0x0ad3bd05, + 0xf0d3bd06, + 0xe8d0ad05, + 0xe8d0d506, + 0xeed0bd05, + 0xfcd0ad05, + 0x04d0d505, + 0x08d1ad06, + 0x10d0d506, + 0xec4d0306, + 0x2720a706, + 0x03420538, + 0x07f3c844, + 0x0c4d034d, + 0x2720a707, + 0x053827a8, + 0x03a12342, + 0xb9f3b844, + 0xd6061ad4, + 0xecd4b946, + 0x0cd3b906, + 0x03410307, + 0xedd4bd31, + 0x0dd3bd06, + 0x7dd49907, + 0x337edc99, + 0x844c0346, + 0x0d071d07, + 0x2c27140b, + 0x210d0340, + 0x7fdb9906, + 0xa4bec633, + 0xcc030033, + 0x071d0784, + 0x271c0b0d, + 0x0d03402c, + 0x90be0661, + 0xb6330033, + 0x0784bc03, + 0x0b0d071d, + 0x402c271b, + 0x06a10d03, + 0x00337abe, + 0xb980d499, + 0xb90618d3, + 0xbd0619d2, + 0x230620d4, + 0x33438333, + 0x3383124c, + 0x4da32323, + 0x3c331105, + 0x3323830e, + 0x43ab102c, + 0xd4d542ab, + 0x0d0705e0, + 0x1d074027, + 0x9d0ed49d, + 0xdac510da, + 0x0fda9d40, + 0x030c0c03, + 0x2705e41d, + 0xbe01002d, + 0x76ff9c3b, + 0x9d412705, + 0xd0d505d4, + 0xfa8e0780, + 0xd007fd4e, + 0x27644f9b, + 0xf39b103c, + 0x20435b65, + 0x8e012744, + 0x644f9bfd, + 0x9365f39b, + 0x0284b7f0, + 0xad104c53, + 0xc105d4d4, + 0x1f9b3c02, + 0x623f9b63, + 0x422b4307, + 0x32074008, + 0x432b4107, + 0xc11141c8, + 0x411b3c04, + 0xbe1d48c4, + 0xc6ffe70b, + 0x9b151e05, + 0x03c1614f, + 0x96438bbc, + 0x27412745, + 0xd6d4bd00, + 0x27fd8e05, + 0x4efd8e04, + 0x9ba007f8, + 0x3353633f, + 0x2764cf9b, + 0xcc53104c, + 0x65f49b10, + 0xeb41ccf0, + 0x0bbc0700, + 0x27b333b3, + 0x49f99380, + 0x915e0284, + 0x418c0300, + 0x00d4c8ea, + 0x27643f9b, + 0x65f49b44, + 0xa61c3c53, + 0x83f49336, + 0xa4d50082, + 0x0127077c, + 0xa4bd4127, + 0xf88e0778, + 0x2764df9b, + 0x1cdc5344, + 0xf465f49b, + 0xc100a5d4, + 0x1f9b3c92, + 0x623f9b63, + 0x422b4307, + 0x32074008, + 0x432b4107, + 0xc11241c8, + 0x411b3c94, + 0x008848e4, + 0xffe66abe, + 0x7f1e05e6, + 0xc1614f9b, + 0x438bbc93, + 0x07744fd6, + 0x0326332d, + 0x2a0b842c, + 0x1c270027, + 0x644f9b40, + 0xf39b3827, + 0x0b320765, + 0x184c5330, + 0x0103341d, + 0xf1404dc6, + 0x2b634f9b, + 0x6a40e84b, + 0xa9f093ff, + 0x02c10283, + 0x631f9b3c, + 0x07623f9b, + 0x08422b43, + 0x07320740, + 0xc8432b41, + 0x04c11141, + 0xc4411b3c, + 0x04be2148, + 0x05c6ffe6, + 0x4f9b191e, + 0xbc03c161, + 0x4616438b, + 0x00274127, + 0x0184a4bd, + 0x0127f88e, + 0x0427f88e, + 0xfb4ef88e, + 0x4f9bd007, + 0x102c2764, + 0x5b65f29b, + 0x9f4bf042, + 0x643f9b01, + 0xf49b4827, + 0x183c5365, + 0x01273840, + 0x81b3f493, + 0x01395e00, + 0x9b644f9b, + 0x4c5365f2, + 0x6e048d10, + 0x4fab4123, + 0x20004df4, + 0x4f9b0172, + 0x65f29b64, + 0x8d104c53, + 0x41236c04, + 0x4df44fab, + 0x015c2000, + 0x27643f9b, + 0x65f49b48, + 0x9d183c53, + 0x33447603, + 0x10272007, + 0x01276d1e, + 0x8189f493, + 0x00ed5e00, + 0x27644f9b, + 0x65f49b48, + 0x27644f9b, + 0x65f39b34, + 0x9d1c4c53, + 0x41237724, + 0x42504f6b, + 0xf4930127, + 0x5e00818b, + 0x4f9b00c7, + 0x9b342764, + 0x4c5365f3, + 0x7a249d1c, + 0x4f6b4123, + 0x01274250, + 0x8193f493, + 0x00a95e00, + 0x27643f9b, + 0x65f49b48, + 0x9d183c53, + 0x21037d23, + 0x01273450, + 0x819df493, + 0x008d5e00, + 0xd4991103, + 0x9914da76, + 0x2777dc99, + 0x7ad49938, + 0xb307c123, + 0x4123bc3b, + 0x036ed089, + 0x07343bc1, + 0x034c0724, + 0x23420323, + 0x9d130701, + 0xd49d75d2, + 0xbe030b74, + 0x8900603a, + 0xd08d6cd4, + 0x07412372, + 0x070b0b04, + 0x6028be1b, + 0x70d08d00, + 0x0736c2c4, + 0x6c3c033d, + 0xc40c3489, + 0x2901014d, + 0x440e3489, + 0x9901024d, + 0x41c47cd4, + 0xc42d1e1c, + 0x0b01014d, + 0xc47cd499, + 0x42270f41, + 0x4d241e1e, + 0xd4990202, + 0x1442c07c, + 0xf4930127, + 0xd5008137, + 0x27077cd4, + 0x78d4bd41, + 0x9dfb8e07, + 0xf09380d4, + 0xc10281f0, + 0x1f9b3c02, + 0x623f9b63, + 0x422b4307, + 0x32074008, + 0x432b4107, + 0xc11141c8, + 0x411b3c04, + 0xbe2048c4, + 0xc6ffe44b, + 0x9b181e05, + 0x03c1614f, + 0xf6438bbc, + 0x27412745, + 0x82d49d00, + 0x0127fb8e, + 0x0427fb8e, + 0xfd4efb8e, + 0x076a0499, + 0x274566d0, + 0xf8f49301, + 0x261e0080, + 0x27643f9b, + 0xf49b104c, + 0xe4345b65, + 0x00ca0c3c, + 0x27643f9b, + 0x65f49b48, + 0xc0183c53, + 0x01271433, + 0x80fff493, + 0x7cd4d500, + 0xbd412707, + 0x8e0778d4, + 0x272007fd, + 0x644f9b10, + 0xf49b4827, + 0x643f9b65, + 0xf49b4427, + 0x1c3c5365, + 0xf464239d, + 0x9b008b32, + 0xf49b643f, + 0x1c3c5365, + 0x0367239d, + 0xd4210311, + 0x13c47732, + 0x643f9bd1, + 0xf49b4827, + 0x183c5365, + 0x9b663fd6, + 0xf49b643f, + 0x183c5365, + 0x593f3cc4, + 0x27643f9b, + 0x65f49b44, + 0xb61c3c53, + 0x643f9b3d, + 0x5365f49b, + 0x3c561c3c, + 0x80fef093, + 0x3c02c102, + 0x9b631f9b, + 0x4307623f, + 0x4008422b, + 0x41073207, + 0x41c8432b, + 0x3c04c111, + 0x48c4411b, + 0xe359be20, + 0x1e05c6ff, + 0x614f9b18, + 0x8bbc03c1, + 0x2745f643, + 0x9d002741, + 0xfd8e6ad4, + 0xfd8e0127, + 0xfd8e0427, + 0xa107f84e, + 0x12e8b007, + 0x410700c5, + 0x31474173, + 0x1333e407, + 0xe333132b, + 0xe42b4447, + 0x1623100b, + 0xd007e00b, + 0xe4995b1e, + 0x04d89904, + 0xe209d909, + 0x27204c13, + 0x243b203c, + 0x4907382b, + 0x3407433b, + 0x43cb4207, + 0x428b348b, + 0xd603342e, + 0x1499331e, + 0x13100904, + 0x3007204c, + 0x4307343b, + 0x238b32cb, + 0x348bc107, + 0x32cec623, + 0x29d00d16, + 0x2dd42913, + 0x4d1349d3, + 0x9d190dd3, + 0x142d0418, + 0x1c07d603, + 0x07a4d1c2, + 0x734b2b41, + 0x0b348741, + 0x33430734, + 0x07430b44, + 0x0b183314, + 0x33410714, + 0x140b104c, + 0x11130b07, + 0x07ff5b7e, + 0x734d2b4b, + 0x0b348741, + 0x33430734, + 0x07430b44, + 0x0b183314, + 0x33410714, + 0x140b104c, + 0x0d071a1b, + 0x355ef80e, + 0x9bf88eff, + 0xf393534f, + 0xd50281fc, + 0x9b061834, + 0x34d5544f, + 0xfe0b061c, + 0x2919f54e, + 0x8207f123, + 0x293b2227, + 0x6b38f6c1, + 0x0bb4073f, + 0x15a30742, + 0x076405f3, + 0x0b5107d0, + 0x014f30a9, + 0x27ff0620, + 0x00e05e71, + 0x11231407, + 0x1ce33b07, + 0x7f3ce37f, + 0x3c033419, + 0xf931c280, + 0x10270b07, + 0x002e05be, + 0xea074807, + 0xef6b4103, + 0xf4257027, + 0xaf5efe35, + 0x04d29900, + 0xd009f411, + 0x1407421b, + 0x3c271fab, + 0x07312b10, + 0xab433b40, + 0x07437b4f, + 0xcaefabe4, + 0x4a0730a2, + 0x4fab422b, + 0x3127d229, + 0x3b0c1c33, + 0xab21ab34, + 0x3b0e073f, + 0x032fab04, + 0x1e102731, + 0x07420d03, + 0x4740ab41, + 0x034b0b44, + 0x1ef38811, + 0xab192b5c, + 0xab017b1f, + 0x07cd070f, + 0xca26032c, + 0x23991352, + 0x0d3ac204, + 0x3a2bc469, + 0x402e437b, + 0xe81ec207, + 0xe17b6401, + 0x47e34703, + 0x81393407, + 0x3b2b2e07, + 0x33472fab, + 0xfff03e83, + 0xa322470f, + 0xffc0001f, + 0x0b13abff, + 0x31210d2b, + 0x07f221f3, + 0x051c070d, + 0xff027ef6, + 0xdc0770ab, + 0xd5e2d603, + 0x0707ff51, + 0xf58ef103, + 0x00000001, + 0xf2e3f54e, + 0x05c600b9, + 0xf275f165, + 0x3f6bb407, + 0xf199bf6b, + 0x5cfe9958, + 0xe660f289, + 0x71023c0f, + 0xe60419f0, + 0x6102344f, + 0xcdf193f2, + 0x22010286, + 0x2e230027, + 0x55fa0000, + 0xc04c27f2, + 0x14031005, + 0xd027f4c8, + 0xec270127, + 0x07f47110, + 0x59400b1d, + 0x441f0344, + 0x0300033e, + 0x1d071e41, + 0x03d10310, + 0x03f4b811, + 0x93fe0801, + 0x02868ff4, + 0x020040b9, + 0xe027d027, + 0x141ec027, + 0x10194e0d, + 0xe103d103, + 0x11034203, + 0x47f20cce, + 0x56c103ee, + 0x96512707, + 0x355027b4, + 0x96e127f5, + 0x07e02734, + 0x2757563e, + 0x1ef04504, + 0x074d4717, + 0x444f031d, + 0x0300033c, + 0x033e451f, + 0x27ce1e00, + 0x41f24520, + 0x137127f9, + 0x3b91039b, + 0x7131c379, + 0x23f395f8, + 0x29f39391, + 0x71230286, + 0x6027b027, + 0xca5ef325, + 0x13809900, + 0xd007a127, + 0x030fdc83, + 0x0bad3b41, + 0x2b4b0b4a, + 0x014d5046, + 0x05f45302, + 0x1e4301ff, + 0xf9f39103, + 0x033e4461, + 0x0b4d0700, + 0x114c3041, + 0xfeeef553, + 0x4d075301, + 0x940a4103, + 0x3b073846, + 0x4b47fe21, + 0xee093333, + 0x3f03342b, + 0x00033f44, + 0x319d3e0d, + 0x13849904, + 0x342db103, + 0xf231621e, + 0x002724c6, + 0x0453031e, + 0x4b473b07, + 0x342b3333, + 0xea07c127, + 0x0da31d0b, + 0x3f030800, + 0x00033f46, + 0x2027ca2b, + 0xf185e103, + 0x291ef0a5, + 0x345df481, + 0x3223f521, + 0x4d3b5409, + 0x340d42ab, + 0x04863203, + 0xf0411207, + 0xf4a1178b, + 0x41ab103b, + 0x2103340d, + 0x3603c103, + 0x0d5b0247, + 0xfef01c07, + 0x21ba0bd0, + 0x036103f5, + 0x03f52552, + 0x39fe7181, + 0x3264eae4, + 0xab4b07ff, + 0x45fc934f, + 0x0c070288, + 0x0c00c4ad, + 0x497e1407, + 0x00c0a9fc, + 0x07d0270c, + 0x03c40340, + 0x19091e41, + 0x02c603c3, + 0xa8d3073d, + 0xd9f393f4, + 0xdacc0228, + 0x7d40270d, + 0x3d3d1d34, + 0x1e345d34, + 0xcc13072c, + 0x27130ddc, + 0x232d0740, + 0x27347d29, + 0x3d131d39, + 0x1e145d12, + 0x07402714, + 0x27147d3d, + 0x0c3c2348, + 0x4427141d, + 0x135d143d, + 0x40471007, + 0x142b1333, + 0xf4515f07, + 0x288ef293, + 0x03302702, + 0x033f3e1f, + 0xc5f09300, + 0x54030287, + 0xb17ef505, + 0x54fec1fc, + 0xed9df311, + 0x93f25107, + 0x02286bf4, + 0x322b4419, + 0x4d06e49d, + 0x1e0c86e3, + 0xc1f36163, + 0x300154f4, + 0x9d06419d, + 0x3401074e, + 0x0b54f5c1, + 0x30524d42, + 0x2720014d, + 0x23451e01, + 0xfa00000e, + 0x120b1007, + 0x30071123, + 0xe37f1ce3, + 0x34197f3c, + 0xc2803c03, + 0xf1c1f931, + 0x2a71be64, + 0x54fec100, + 0xe499f061, + 0x83030906, + 0x4c330f4c, + 0x0534ab10, + 0x01e449e3, + 0x0b470303, + 0x0547e343, + 0xc3002704, + 0x4ef58ef2, + 0x35f393f8, + 0x23070284, + 0x2d03f1a3, + 0x4d2702ff, + 0x81070800, + 0xd007f455, + 0x2ce38f6b, + 0x7f3ce37f, + 0x3c033419, + 0xf932c280, + 0x870ef493, + 0x03240702, + 0x070c012d, + 0x7f2ce334, + 0x197f3ce3, + 0x803c0334, + 0x03f932c2, + 0x0505e8dd, + 0x23e927fd, + 0x2505e8dd, + 0x072d07fe, + 0x28ec271f, + 0xfe35c327, + 0x01792d03, + 0x7b72fe93, + 0x030d0700, + 0xdd03141c, + 0x380705f0, + 0xfe454127, + 0xc97efc15, + 0x05eb27fc, + 0xf0dd23fd, + 0x07fe2505, + 0x271f072d, + 0xfe3538ec, + 0xfe939007, + 0x03007b6c, + 0x07028c2d, + 0x141c030d, + 0x05f8dd03, + 0x41273807, + 0xfe45fc15, + 0x27fc977e, + 0x23fd05e4, + 0x1505f8dd, + 0x072d07fe, + 0x20ed271f, + 0x07fe3502, + 0x71fe93c0, + 0x2d03007b, + 0xbc27039f, + 0x030d0710, + 0xdd03141c, + 0x38070600, + 0xfe454027, + 0x617efb25, + 0x05e627fc, + 0x00dd23fd, + 0x07fe1506, + 0x50ed271f, + 0x352d0702, + 0x93a007fe, + 0x007d5bfe, + 0xc9ab0d07, + 0x1c033807, + 0xb22d0314, + 0x25402704, + 0xabfe45fb, + 0xfc2e7eca, + 0xf1830cab, + 0xfe4ef88e, + 0x10270027, + 0xbe402c27, + 0x27ffd928, + 0xf49b114c, + 0xe9f093a0, + 0xf413027c, + 0xd804d56c, + 0x1efe8e05, + 0x27fd4ede, + 0xf49b114c, + 0xd1fd93a0, + 0xd4d1027c, + 0xf49b05d4, + 0xc5d4b9a3, + 0x074c2605, + 0x7e10270d, + 0xd4d1fea3, + 0xf49b0618, + 0x1cd4d153, + 0x54f49b06, + 0x05e8d4d1, + 0xf49b4487, + 0xf8d4d150, + 0xa3448705, + 0x50f49b41, + 0x05f0d4d1, + 0x42a34487, + 0xd150f49b, + 0x870600d4, + 0x9b43a344, + 0x4e2750f4, + 0x9b3f1c80, + 0xfd8ea9f4, + 0xf0a3fc4e, + 0x04d1c007, + 0xf49b05d4, + 0x6d4027a3, + 0x89f44df4, + 0x04896402, + 0x27f01166, + 0x271027e0, + 0xbefe0530, + 0x07ffe861, + 0x070836d0, + 0x7e10270c, + 0xd007fe2f, + 0x402706d6, + 0x9b53f49b, + 0x412754f4, + 0x05c5c4bd, + 0x2fbe0c07, + 0x0d0700a7, + 0xfc8ef083, + 0x4f27fe4e, + 0x40004000, + 0x99b0f49b, + 0x42207404, + 0x0e1e1127, + 0x246e0499, + 0x1e222741, + 0x2742440b, + 0x1e242712, + 0x27242705, + 0xa24f9b11, + 0x27fb41d8, + 0xa2f49b42, + 0xef273207, + 0x02000000, + 0x20cc3103, + 0x1e31270f, + 0xe004a90b, + 0xa8f49b05, + 0x98a8fe9b, + 0x273107f3, + 0x0000002f, + 0xcc310302, + 0x31270f10, + 0x04a90b1e, + 0xf49b05e2, + 0xa8f29ba8, + 0x3107f398, + 0x00002f27, + 0x31030200, + 0x270f10cc, + 0xa90b1e31, + 0x9b05e404, + 0xf29ba8f4, + 0x27f398a8, + 0x4efe8e00, + 0x3bcf5bf0, + 0x4efe2bdf, + 0xbe0f07fc, + 0x1effbb01, + 0x9b4027ff, + 0x00070ef4, + 0xf61eff8b, + 0xff1eff1e, + 0xb007fb4e, + 0xf0931227, + 0xbe007e4c, + 0x11003080, + 0x59f093b1, + 0x75be007e, + 0xb1210030, + 0x7e60f093, + 0x306abe00, + 0x93b10100, + 0x007e67f0, + 0x00305fbe, + 0xf093b231, + 0x27007e6e, + 0x3052be10, + 0x03db0700, + 0x31c127d4, + 0x931c07d2, + 0x007e59f0, + 0x3dbec103, + 0xd4030030, + 0xec0fccc4, + 0xfb0e0b07, + 0x3027a11e, + 0x41a71253, + 0x0385040d, + 0x0315012d, + 0x03550335, + 0x03950325, + 0x402703b5, + 0x0b0ef49b, + 0x07fe4efe, + 0x27202740, + 0x4205123c, + 0xf3c84403, + 0xa7484c27, + 0x07040531, + 0x03034d40, + 0x2720a748, + 0x03420538, + 0x07f3c844, + 0x284c0340, + 0x382720a7, + 0x44034205, + 0x1499f3c8, + 0xff4cc062, + 0x9d41271b, + 0x13990604, + 0x08039d62, + 0xdc0a1499, + 0x43070f44, + 0x049d41e3, + 0x27fe8e08, + 0x06049d40, + 0x0401fe8e, + 0x41ab0207, + 0x24050403, + 0x4207fe0b, + 0x11482307, + 0x10274128, + 0x0207e91e, + 0x00004f27, + 0x0403f000, + 0xfe0b2405, + 0xc207f94e, + 0x2307b107, + 0x11c89007, + 0x4cc1c84f, + 0x39101cc0, + 0x19cca107, + 0xccdc0738, + 0x32073ac9, + 0x2d071a07, + 0xbf3e0907, + 0x3007b823, + 0x1b072d07, + 0xb33e0907, + 0x3007c823, + 0x2c071a07, + 0xa73e0907, + 0x1b073007, + 0x2c070907, + 0x9b1ef90e, + 0x1a10ccc0, + 0xdc07a827, + 0x27c8c9c8, + 0x07c41ed8, + 0x004f2702, + 0x03f00040, + 0x8e240504, + 0x001d27f9, + 0x5ef90e40, + 0xf94eff6a, + 0xb107c207, + 0x90072307, + 0xc85a11c8, + 0x1cc057c1, + 0xa1074120, + 0x3f111ccc, + 0xccccdc07, + 0x32074211, + 0x2d071a07, + 0x657e0907, + 0x10bc23ff, + 0x2d073007, + 0x09071b07, + 0x23ff577e, + 0x300710cc, + 0x2c071a07, + 0x497e0907, + 0x073007ff, + 0x0709071b, + 0x5ef90e2c, + 0xccc0ff3c, + 0xac271d20, + 0xc8dc0710, + 0x27c011cc, + 0xbb1e10dc, + 0x4f270207, + 0xf0008000, + 0x24050403, + 0x1d27f98e, + 0xf90e8000, + 0x4efeed5e, + 0x07c207f9, + 0x072307b1, + 0x401cc090, + 0xcca10746, + 0x0744211c, + 0x21ccccdc, + 0x07320735, + 0x072d071a, + 0xff607e09, + 0x0720bc23, + 0x072d0730, + 0x7e09071b, + 0xcc23ff52, + 0x07300720, + 0x072c071a, + 0xff447e09, + 0x1b073007, + 0x2c070907, + 0x375ef90e, + 0x20dc27ff, + 0xccc0c81e, + 0xac270c40, + 0xc8dc0720, + 0x1ebb21cc, + 0x001d27ed, + 0x5ef90ec0, + 0xfe4efe82, + 0x02994127, + 0x0b049d0a, + 0x24c03107, + 0xc0253430, + 0x061e1523, + 0x26c02520, + 0x99ff1e19, + 0x01990902, + 0x5efe0e08, + 0x0299fef2, + 0x08019909, + 0x5b5efe0e, + 0x090299fe, + 0x0e080199, + 0xff595efe, + 0x99090299, + 0xfe0e0801, + 0x71fe5f5e, + 0x103c2700, + 0x144e0401, + 0xf3b80803, + 0xfe0b0027, + 0x00994007, + 0x03427120, + 0x23300701, + 0x83033301, + 0x020b0f3c, + 0x0b20439d, + 0x07fe4efe, + 0x4ced03e0, + 0xd5402701, + 0x75014c04, + 0x2718270e, + 0x3e070f2c, + 0x4027310b, + 0x18033405, + 0x4027f298, + 0x8e20049d, + 0x07fe4efe, + 0x2a21c8e2, + 0xefff3ea7, + 0x4c34c1fd, + 0x53184c33, + 0x42cc1d4c, + 0xdf4ea7f5, + 0x4105fde6, + 0x20274e15, + 0x3ea74235, + 0x05fde6cf, + 0x353e1530, + 0x4efe8e32, + 0x932253fd, + 0x024cf3fe, + 0x032141a7, + 0x122d140d, + 0xd1071e15, + 0x40273646, + 0xd435d4b5, + 0xd425d455, + 0xd485d495, + 0x4127fd8e, + 0x04250191, + 0x267e0e07, + 0xb54027fd, + 0x55d435d4, + 0x95d425d4, + 0x8ed485d4, + 0x39fb4efd, + 0xff3ea70d, + 0xd123ffff, + 0x010834b9, + 0x070fdc83, + 0xbcd4eec0, + 0x27d33300, + 0xff0ea720, + 0xd2f5feff, + 0xff00010c, + 0x014403a9, + 0x4ea7c139, + 0x03ffffff, + 0x0841bd31, + 0x4403ad01, + 0x0ef29b01, + 0x4ea73127, + 0x29fdcfff, + 0x7043c5c2, + 0xfb8e25a6, + 0xe8070e27, + 0xf1aebe03, + 0xdb0ea701, + 0x58befff5, + 0x00c800a7, + 0x072007ec, + 0x33473340, + 0x23240b25, + 0xfff5cc2e, + 0x10274207, + 0x05283c27, + 0xc8440341, + 0x073207f3, + 0x0334034c, + 0x1c27104c, + 0x034e0112, + 0x033e0544, + 0x31f1a834, + 0xd12405c4, + 0xa701c8cc, + 0xfd4fff4e, + 0x11642cc5, + 0x6823c543, + 0x04fd4227, + 0xff000a28, + 0xffff2ea7, + 0xbd4127ff, + 0x99063824, + 0x40270f23, + 0x270ef49b, + 0xf5338741, + 0x02b04034, + 0x07fb8eff, + 0x060d27b3, + 0xf12abe64, + 0x08b4b901, + 0x364dee01, + 0x00ef1eff, + 0x0003093c, + 0x0000000e, + 0x01c1f54e, + 0xc5fca358, + 0xf0c5b4f1, + 0xb702b9c0, + 0xc5130101, + 0x04b978f2, + 0x02a901b6, + 0xf4c501b4, + 0xc101b17c, + 0xf1c5b4f4, + 0x890131b8, + 0xf7930e44, + 0xc50249cc, + 0xf1c580f2, + 0xb802d1bc, + 0xb4f1c101, + 0x04d1742d, + 0xf2c501b0, + 0x10128974, + 0x4584f4c5, + 0x0b402773, + 0x0d733531, + 0xa5711572, + 0x95742571, + 0x34149970, + 0x13073127, + 0xf2c1143b, + 0x2c718db4, + 0x89352199, + 0x313b2c72, + 0xc12e738d, + 0xf1c1b4f3, + 0x0e3489b4, + 0x9b303389, + 0x2b432b42, + 0x30728d24, + 0x892e7389, + 0x12891014, + 0x2b439b32, + 0x27342b42, + 0x0000004f, + 0x32738d8f, + 0x993874c5, + 0x3ce06203, + 0x2704b1ff, + 0x0001004f, + 0x3874c5ef, + 0x93b4f3c1, + 0x02493bf0, + 0xc5343499, + 0xaa7e3474, + 0x297409fd, + 0x90f4c572, + 0x4190f1c1, + 0xc5d18774, + 0xd40b94f2, + 0x1fe67631, + 0x3287015e, + 0xf3c55027, + 0x8cf5c588, + 0x48878027, + 0x4201460b, + 0x535d21dc, + 0x07fefff1, + 0x0313014f, + 0x21013c4c, + 0x41052403, + 0xf3a84403, + 0xc148f2c1, + 0xf4c150f3, + 0xc1230b68, + 0x2c0360f3, + 0x40f1c118, + 0xf093430b, + 0x0b0248d4, + 0x7e540bd2, + 0x0fe6fd1b, + 0xf48900eb, + 0x94f3c13e, + 0x83ca840b, + 0x8cf4c1b2, + 0x0390f1c1, + 0x8cf4c541, + 0x00f614ee, + 0x0b88f2c1, + 0x079a1e62, + 0x3c1c031f, + 0x489ef093, + 0xfd6d7e02, + 0x71997429, + 0x3872c134, + 0x050af19d, + 0x934123f2, + 0x024887f3, + 0x00c248ee, + 0x092c3399, + 0x8cf1c174, + 0x2308f39d, + 0x71f39341, + 0x14ee0248, + 0x349900a6, + 0x61f2532e, + 0x072101fe, + 0x09f49d0f, + 0x89fc617e, + 0xefe63efe, + 0xf2c1ff68, + 0x23a00748, + 0x03093caf, + 0x07742900, + 0x532a0bc8, + 0x03fe3bf3, + 0x48f2c5c1, + 0xb0274123, + 0x4832f993, + 0x010f0702, + 0x444cce31, + 0xf399b566, + 0x2c948908, + 0xc11d34ce, + 0x4f833894, + 0xf7ffffff, + 0x177ef405, + 0x89a007fc, + 0xf2c13efe, + 0x3caf2348, + 0x03000309, + 0xe2c103b1, + 0x29ff12eb, + 0x532a0b74, + 0xc5fdeff3, + 0x412348f2, + 0x31010f07, + 0x99bec4ce, + 0xf49d3094, + 0x93b61e08, + 0x0247dbf0, + 0xc1fc377e, + 0x020540f2, + 0x0140f4c1, + 0x5ed30b43, + 0x3499ff02, + 0xff5b5e32, + 0x5e303399, + 0x5027ff3f, + 0xdc037d55, + 0x0b3d0718, + 0xbcf4c135, + 0xf3c57565, + 0x18dc23a0, + 0x3c034516, + 0xa0f3c50c, + 0xc1c0f1c1, + 0x14c1a0f2, + 0x9842ea44, + 0xb74ea701, + 0x3027fdeb, + 0x2f274305, + 0x0c420000, + 0xf39b4215, + 0xbcf3c10e, + 0x02e83fe6, + 0xbc27c027, + 0xbcf3c118, + 0x3574f4c1, + 0xc1f465f3, + 0xf4c178f3, + 0xb8f0c17c, + 0x9d17f39d, + 0xf3c116f4, + 0x84f4c180, + 0x0c0b1f07, + 0x270c1c03, + 0xf445182c, + 0x8514f38d, + 0xbefd75f5, + 0xc100208f, + 0x7c41b8f8, + 0xf1c18b0b, + 0x077331b4, + 0xc52c0708, + 0x7b09a8f3, + 0x93fbc47e, + 0x02471ff0, + 0x07fb947e, + 0x091d0b18, + 0xb0f1c574, + 0x02404fe6, + 0xd533db07, + 0xd42b4b87, + 0xdc0b2027, + 0xfcc5c80b, + 0xacf2c5a4, + 0x939cf2c5, + 0x02472ff6, + 0x27a4f3c1, + 0xc5340350, + 0xf3c598f5, + 0xa8f1c1c4, + 0x410b4587, + 0xa2074201, + 0xaff6a183, + 0xf15301c5, + 0x4f07fcd0, + 0x4c031301, + 0x0321013c, + 0x03410524, + 0x89f3a844, + 0xf3893cf2, + 0x40f1c13e, + 0x46b2f093, + 0x24f28d02, + 0x7e26f38d, + 0xb007faf7, + 0x01af0fe6, + 0xfba5bb11, + 0x011dafe6, + 0x71c17429, + 0x30fdc538, + 0x4123f105, + 0x468af393, + 0x8c45ee02, + 0x2c339901, + 0xf2c17409, + 0x08f39d9c, + 0xf3934123, + 0xee024674, + 0x99017024, + 0x0f072e34, + 0xf49d1607, + 0xfa687e09, + 0xc63ef489, + 0xc007644f, + 0xcf23b507, + 0x0003093c, + 0xa027b103, + 0x464af993, + 0x032c1e02, + 0x99a566b1, + 0x948908f3, + 0x1734ce2c, + 0x833894c1, + 0xffffff4f, + 0x7ef405f7, + 0xc007fa32, + 0x093ccf23, + 0xf4890003, + 0xc2a1033e, + 0x0807244a, + 0x16070d0b, + 0x64be2c07, + 0x7429001f, + 0x41230f07, + 0xdc0b1607, + 0x99bdb4ce, + 0xf39d3093, + 0x1eb51e08, + 0x30f4c1ff, + 0x4d1b3027, + 0xf4c1f4b5, + 0x34f3c5ac, + 0x9638f4c5, + 0xc11f075d, + 0x1c03c4f0, + 0x182c2724, + 0x001f2abe, + 0x293ef489, + 0xea540b71, + 0x93fee851, + 0x0245c7f4, + 0xf4c14209, + 0x053027a4, + 0x9cf3c143, + 0xf3c53103, + 0xe323e29c, + 0xc1418700, + 0xf1c1a4f2, + 0x1c2c03a8, + 0xf1c5140b, + 0xa4f2c5a8, + 0xc1feab5e, + 0x1f0798f0, + 0x1c03080b, + 0x182c2724, + 0x001edebe, + 0x0398f4c1, + 0xf4c5184c, + 0xc1aa1e98, + 0xf1c148fb, + 0x0b080744, + 0xc52b070d, + 0xcd0730fd, + 0xc1fa0c7e, + 0xcb0b50fa, + 0x074cf1c1, + 0x070c0b08, + 0xf9fb7e2a, + 0xc1acf2c1, + 0xdc0760f9, + 0xc130f4c1, + 0xda0bb0f0, + 0xc1acf3c1, + 0x4d1b5cf1, + 0x2907020b, + 0xf3c5f4b5, + 0xf9d77e38, + 0xc1acfcc1, + 0xf0c168fb, + 0xc1c90bb0, + 0x0c0b64f1, + 0xc27e2b07, + 0x38f4c1f9, + 0x4c1bcb0b, + 0xc5acfcc5, + 0x2c5e34f4, + 0x931f07ff, + 0x02450bf0, + 0x7e3c1c03, + 0x445ef9d7, + 0x323499fe, + 0x99fe915e, + 0x755e3033, + 0xf1f093fe, + 0x4d7e0244, + 0x40f4c1f9, + 0x04050d15, + 0x0740f1c1, + 0x071c01b0, + 0x070d0b08, + 0x1e29be2c, + 0x5edc0b00, + 0x3ea7fe30, + 0xc1fdefff, + 0x4dd84c34, + 0x070ffc6a, + 0xe8432723, + 0x4c23c1f4, + 0xfc6a3ddc, + 0xc0f3c1f5, + 0x81a0f1c1, + 0x4831c534, + 0xf0c144a3, + 0x7e3485c0, + 0xfc83f9b5, + 0x4f27f58e, + 0xcf00069a, + 0x5e3874c5, + 0xcc27fb50, + 0xb8f0c10c, + 0x7606f193, + 0xbe2c0700, + 0xc1001dd3, + 0xbc27c0f4, + 0x484cc524, + 0x4efd045e, + 0xbc02c1fc, + 0x2ed1c107, + 0x238901cc, + 0x834e0728, + 0x86112742, + 0x83102744, + 0x3380003d, + 0xa80dc117, + 0x24c13f26, + 0x5742d844, + 0x10003d27, + 0xa7a20499, + 0xf7ffff2e, + 0x4dab4183, + 0x43ab41ab, + 0x01c12425, + 0x9c0389ac, + 0xc5e421c5, + 0x3123802c, + 0x998423c5, + 0x0389a304, + 0x8824c59e, + 0x4123430b, + 0x998c24c5, + 0x0089a601, + 0xc5310ba4, + 0x3123a821, + 0xc5ac23c5, + 0x47275820, + 0x8e3424c5, + 0x00eddcfc, + 0x3027ab01, + 0xfe4eab1e, + 0x7fff3ea7, + 0xe33411fd, + 0x1508004d, + 0xff3ea734, + 0x3201fd4f, + 0xf49b4027, + 0x87e1270e, + 0x402ef522, + 0xa7ff02b0, + 0xfdcfff1e, + 0x30074427, + 0x234814c5, + 0x4232d038, + 0x3ea72127, + 0xbdfeffff, + 0x270c3e32, + 0x0ef49b40, + 0xbe601ec5, + 0x2701eabc, + 0xff3ea720, + 0x32bdfeff, + 0x40270c3e, + 0xa70ef49b, + 0xfdcfff3e, + 0xc54834c5, + 0x2ea76834, + 0x11fd7fff, + 0x004da324, + 0x8e241508, + 0x1e2227fe, + 0xa7f84ebe, + 0xfeffff2e, + 0xd1092499, + 0x83014823, + 0x33d40743, + 0x2b4487d4, + 0x07bd07d4, + 0xb4be23c0, + 0x3fd6ffff, + 0xff4ea768, + 0xd2f1ffff, + 0xff000054, + 0x062c4dd1, + 0x0104039d, + 0x07d22200, + 0x8f20ead2, + 0x650dce00, + 0xac27ed07, + 0xff9ea77d, + 0xe02bffff, + 0x41834007, + 0x24873407, + 0x322b3733, + 0x3387340b, + 0x3e23c005, + 0x07fff9c4, + 0x014a0721, + 0x05340338, + 0xa8240328, + 0x0a1499f4, + 0x28104cc0, + 0x062894d1, + 0x40c8401b, + 0x9d41271f, + 0xf88e04c4, + 0x014824d1, + 0xd14441c0, + 0xc0014824, + 0x24d16242, + 0x43c00148, + 0x03f88e1e, + 0xa9fef001, + 0xb499cd05, + 0x844ff604, + 0xa7312700, + 0xfeffff4e, + 0x014843d5, + 0x24b9f88e, + 0x4cd80c41, + 0x40274510, + 0x014824d5, + 0xd007f88e, + 0xff72d0ee, + 0xd4f1d31e, + 0xff000054, + 0x43e20301, + 0xbea70088, + 0xd1ffffff, + 0xc2062cb4, + 0x30272443, + 0xffff4ea7, + 0x4843d5fe, + 0x27f88e01, + 0x0bf49b40, + 0x270ef49b, + 0x5ef80e09, + 0x0827fe7e, + 0x775ef80e, + 0xcf0ea7fe, + 0x80befff9, + 0xd3f1002c, + 0xff000054, + 0xb4d1c001, + 0x04ca062c, + 0xc330c2c6, + 0x577e0527, + 0xbebc1efe, + 0xa7004c4b, + 0xffffff3e, + 0x32a9b469, + 0x24ce0102, + 0x27b41920, + 0x1d410330, + 0x0ef39bb4, + 0x4fff4ea7, + 0xcf0ea7fd, + 0x43c5fff9, + 0x2bf2be38, + 0xff4f5e00, + 0xde1ebd25, + 0x014423a9, + 0x014224a9, + 0xff2f43ee, + 0x24d54227, + 0xf88e0148, + 0xcf5bf04e, + 0xfe2bdf3b, + 0x0f07fc4e, + 0xfff393be, + 0xf00efc0e, + 0xf04eff0b, + 0xdf3bcf5b, + 0xfc4efe2b, + 0x81be0f07, + 0xff1efff3, + 0xff1eff1e, + 0x02a9fa4e, + 0x40270104, + 0x016603b9, + 0x6d12028d, + 0x07044d04, + 0x6c02a9a0, + 0x1d3ae001, + 0x6a04a901, + 0x0e45f001, + 0x27d12701, + 0x9ca39d30, + 0xa79aa28d, + 0xebffffce, + 0xc57ef293, + 0x21d01302, + 0x8d1027ce, + 0x2db5eaa4, + 0xc232f093, + 0x48019d02, + 0x24c54127, + 0x27322730, + 0x5c23c543, + 0x938824c5, + 0x02c217f3, + 0x40273105, + 0x050c049d, + 0xc5211521, + 0x21c55821, + 0x20019d84, + 0xdc34019d, + 0xdc0717e2, + 0xd4354227, + 0xbe100c27, + 0x2701f359, + 0x21d43540, + 0xed32d8d3, + 0xba074027, + 0xda07ca07, + 0x03f4a48d, + 0x030199bd, + 0x0301d9cd, + 0xa70219dd, + 0xe8fe9f0e, + 0xf940ec27, + 0xea39b403, + 0x074c0700, + 0x0b430b2d, + 0x193b0b23, + 0x23411933, + 0x1901000d, + 0x03031d24, + 0x011d800c, + 0x1d800c03, + 0xf0010304, + 0x1ea7d6fe, + 0x27ebffff, + 0x0105104e, + 0xa3b91405, + 0xa4b90190, + 0xa2b90198, + 0x33230191, + 0x83144c33, + 0x1c3c3333, + 0x80004fa3, + 0x23230248, + 0x2c3343ab, + 0x1542ab1e, + 0x213c2714, + 0x275c13c5, + 0x4000102f, + 0x75126540, + 0x45402712, + 0xa7144514, + 0xfeffff3e, + 0x0bc034d5, + 0x8e0ef49b, + 0x27d027fa, + 0xfef35e30, + 0x016a04a9, + 0xd0272247, + 0xe65e3127, + 0x07fc4efe, + 0x931327c0, + 0x00720bf0, + 0x0022b3be, + 0xf093c111, + 0xbe007218, + 0x210022a8, + 0x1ff093c1, + 0x9dbe0072, + 0xc1010022, + 0x7226f093, + 0x2292be00, + 0x93c23100, + 0x00722df0, + 0x85be1027, + 0xc2410022, + 0x7220f093, + 0xbe112700, + 0x51002278, + 0x13f093c2, + 0x12270072, + 0x00226bbe, + 0xf093c261, + 0x27007206, + 0x225ebe13, + 0x93c27100, + 0x0071f9f0, + 0x51be1427, + 0xc2810022, + 0x71ecf093, + 0xbe152700, + 0x91002244, + 0xdff093c2, + 0x16270071, + 0x002237be, + 0xf093c2a1, + 0x270071d2, + 0x222abe17, + 0x93c2b100, + 0x0071c5f0, + 0x1dbe1827, + 0xc2c10022, + 0xb7f09330, + 0x19270071, + 0x00220fbe, + 0x9334c2c1, + 0x0071a9f0, + 0x01be1a27, + 0xc2c10022, + 0x9bf09338, + 0x1b270071, + 0x0021f3be, + 0x933cc2c1, + 0x00718df0, + 0xbe0c1c27, + 0xc10021e4, + 0xf09340c2, + 0x2700717e, + 0xd5be0d1c, + 0xc2c10021, + 0x6ff09344, + 0x1c270071, + 0x21c6be0e, + 0x4eff1e00, + 0x3bcf5bf0, + 0x4efe2bdf, + 0xbe0f07fc, + 0x0efffdac, + 0x0bf00efc, + 0x5bf04eff, + 0x2bdf3bcf, + 0x07fc4efe, + 0xfedfbe0f, + 0x1eff1eff, + 0x0bff1eff, + 0x23fe0bfe, + 0x4127180c, + 0x40270410, + 0xfe0b0407, + 0xd00c0c54, + 0x06271d06, + 0x0cc0fe0b, + 0x0cd02312, + 0x0cc01b12, + 0x0cd0f114, + 0x0cc01314, + 0x00a70f15, + 0x04d4fe0b, + 0x0901d00c, + 0xfe0b0427, + 0xfe0b0727, + 0xfe0b0527, + 0x1e160c10, + 0x3b4127c8, + 0x004e3840, + 0x06273380, + 0x4ed8fe0b, + 0xec0c7e00, + 0xfe0b0527, + 0x0c30fd4e, + 0x1ed0a712, + 0x3b41270d, + 0xbc4ed840, + 0x2709036d, + 0x2bce3ed0, + 0xd8fd8e0d, + 0xe692434d, + 0xc13ed127, + 0xfd8e0d2b, + 0x853efe4e, + 0xfe8e0123, + 0x04b9f54e, + 0xf92301ea, + 0x3027d007, + 0x0b524ae0, + 0xd39d4623, + 0x274f6ba8, + 0x27421430, + 0x6b430731, + 0xa9d49d4f, + 0x0214d9b9, + 0x0215d8b9, + 0x0212daa9, + 0xa1534486, + 0x0210dea9, + 0xd2b94127, + 0x340702ea, + 0x01f0d0a9, + 0xc423c907, + 0x393b1e07, + 0x2123483b, + 0x01eedba9, + 0x0c3b2a0b, + 0x31231123, + 0x3e0b4123, + 0xe2074a0b, + 0xbc3ba107, + 0x395bc007, + 0xe85b485b, + 0x2553a553, + 0x195bcfab, + 0x8da8d099, + 0xd48d9cd3, + 0xa2d18d9e, + 0x8da0de8d, + 0xd28da6da, + 0x98db8da4, + 0xe69adc8d, + 0x8d4c4704, + 0xd0b99ad4, + 0x402702ea, + 0x0371d0bd, + 0x0371d2b9, + 0x0386d4bd, + 0x27483c27, + 0x1cd1b940, + 0x162c3302, + 0x014ad3ad, + 0x014cd4ad, + 0x00002f83, + 0x11e00700, + 0x2fa30a8a, + 0x10000000, + 0xffff4ea7, + 0xe04205e7, + 0x270a9112, + 0xa710011d, + 0xe7ffff2e, + 0x01a4d3a9, + 0x275021c5, + 0x83241540, + 0x0680003d, + 0xc0d4d136, + 0xf941f801, + 0xbd402703, + 0x270386d4, + 0x40d1d140, + 0xecd4bd03, + 0x38f1c503, + 0x4ea73027, + 0xb9fddfff, + 0xc5036ede, + 0xd2b9c443, + 0xf3c50216, + 0x2724f654, + 0x54f2c521, + 0x01ead3b9, + 0x5354f4c1, + 0xc5318332, + 0x490648f3, + 0xc348fbc1, + 0x3cfbc5b1, + 0xd4d1fb45, + 0xd1b9033c, + 0x4ce00371, + 0xd40a285a, + 0xf6155b4c, + 0x2703984f, + 0x30fcc5c0, + 0x80271a1e, + 0x453cf8c5, + 0x20dc1ef8, + 0x4de0b44c, + 0x09d8010e, + 0x2227ff1e, + 0xc130f2c5, + 0xd4a948fb, + 0x81070212, + 0x8c03fc41, + 0xbd4b7b0f, + 0x0b0370dc, + 0x10d0a984, + 0xc1847302, + 0xf8c53cf2, + 0x40f0c57c, + 0x81032526, + 0xf8c581e3, + 0xf2dca97c, + 0xf4d5a901, + 0x38f3c101, + 0x95072c07, + 0x43073766, + 0x2754f8c1, + 0x07410331, + 0x0b243b23, + 0x13343b48, + 0x8b301320, + 0xa92c8b53, + 0xc101f8db, + 0xd3a948f0, + 0x103b01f6, + 0x074cf3c5, + 0xd1320b7b, + 0x0b0338d0, + 0xc5650771, + 0xf3c588fb, + 0xe0670b50, + 0x3b01210d, + 0x210de006, + 0xc1063511, + 0x88263cf8, + 0xe630fbc1, + 0xe008e5bf, + 0xc108e1b2, + 0xf3c14cf2, + 0x03230350, + 0xe323e333, + 0x4cf2c533, + 0x2750f3c5, + 0x0cec1840, + 0x34074127, + 0x0de03f6b, + 0x0fd51102, + 0x11030df4, + 0x0de0060d, + 0x08d30182, + 0x01830df4, + 0x0de008b5, + 0x12630102, + 0x01210de0, + 0x4027121b, + 0x9df5d49d, + 0x2027f4d4, + 0xf2c50127, + 0x60f2c55c, + 0xc534f2c5, + 0xf2c564f2, + 0x68f2c578, + 0xc56cf2c5, + 0xf33570f2, + 0xf0c5f0a5, + 0x31212758, + 0x87d2bdf3, + 0x9b3fe603, + 0x88f4c105, + 0x05964ff6, + 0x41071253, + 0xf8c14fab, + 0xdad4ad38, + 0x278ae603, + 0xc1480731, + 0x410354fb, + 0x243b2307, + 0xfec14b0b, + 0x4cf0c150, + 0x2013343b, + 0x00002fa3, + 0x3013ffff, + 0x00003fa3, + 0xe28bffff, + 0xfec5028b, + 0xc5638b50, + 0x738b4cf0, + 0x1fe6f131, + 0xf2c1023e, + 0x88f3c14c, + 0x0216d4b9, + 0xf2258027, + 0xf8c5f365, + 0x2744f674, + 0x74fbc5b1, + 0xffffbea7, + 0xb6beb9ff, + 0xb948270e, + 0x07036eda, + 0xecdebd7c, + 0xedd4bd03, + 0xfe7d8303, + 0xfe9d83ff, + 0xb8a4fcff, + 0x27002709, + 0x24a8d8b0, + 0xffff2ea7, + 0xa94707ff, + 0x8b0eae23, + 0x0743124f, + 0xa9090743, + 0x070eb023, + 0xab0f8bb4, + 0x070312bf, + 0xc10fab03, + 0x312774f1, + 0xc1a3c147, + 0x8c07cf0b, + 0x48078fab, + 0x11034b8b, + 0x313b2407, + 0x11232f8b, + 0xc580f2c5, + 0x088b74f1, + 0x070c32d2, + 0x074fab43, + 0xc5bf8bb4, + 0xe00780fb, + 0xfec5ef8b, + 0x0c3ed284, + 0x0fab0307, + 0x1f8b1007, + 0x6d84f1c5, + 0x2df44df0, + 0x01f70df9, + 0x07f111f0, + 0x033d072d, + 0x0303e02d, + 0xbe03e43d, + 0x2701f87d, + 0xecd3b940, + 0xead4ad03, + 0xe8d4ad03, + 0x10dea903, + 0x12d2a902, + 0xe4d9d102, + 0xfb3ff603, + 0xe0d7d108, + 0x009d2303, + 0x007d2301, + 0x07a90701, + 0x03a15367, + 0x5301009d, + 0x007d0361, + 0x04012701, + 0x07002732, + 0xb9bf8bb2, + 0x2b03edd1, + 0xc2b13bb0, + 0x3a0712ba, + 0x03ead4a9, + 0x4103390b, + 0x03ead4ad, + 0x04f23bca, + 0xad01009d, + 0x0703ead2, + 0x2bbf8bbe, + 0xc2b13bb0, + 0x360712b6, + 0x03e8d4a9, + 0x4103370b, + 0x03e8d4ad, + 0x04f23bca, + 0xad01007d, + 0xc103e8de, + 0xd3a988fb, + 0xd2a903e8, + 0xb50b03ea, + 0x288b4807, + 0xb02b438b, + 0x03e8d4ad, + 0x03ead2ad, + 0xbae2b13b, + 0xf5c10865, + 0xe2513b88, + 0x0710095a, + 0x27390b3a, + 0x52b3e281, + 0x07390b08, + 0x07492b43, + 0xca8103a8, + 0x9d00f045, + 0xfa650100, + 0x1b50f3c1, + 0xe2013b03, + 0xc1082f06, + 0x413b4cf4, + 0x46e21407, + 0xb6070fd1, + 0x9127b70b, + 0x081a0be2, + 0x4b07b70b, + 0xa907472b, + 0x41ca9103, + 0x007d00f0, + 0x61fa2501, + 0x8bf421f3, + 0xe84c8b3c, + 0x070fa330, + 0x9840e804, + 0xc142070f, + 0xf1c184f2, + 0x0b4f8b80, + 0xfa100b23, + 0xa90f7c42, + 0x8b03e8da, + 0x64a1faaf, + 0xd230080f, + 0x04271b24, + 0x6c90f193, + 0x1f549e00, + 0xfc825e00, + 0x019cd4d1, + 0x08c04cf8, + 0xfbff5efc, + 0xc1e4a1da, + 0x620774f8, + 0x7307487b, + 0x03ead4ad, + 0xf0c5687b, + 0x50f1c54c, + 0xfbc1787b, + 0xe2bfe654, + 0x30f5c102, + 0x5fe65183, + 0xd4d102de, + 0xd3d101c0, + 0xd2d101c4, + 0x444701c8, + 0x22473347, + 0xf385f475, + 0xd1b9f295, + 0xf2c102e8, + 0xc5143330, + 0x21e044f1, + 0x21f4046c, + 0xf33103a4, + 0x0c263fe6, + 0x994cf8c1, + 0xf4c1f4d3, + 0x03f9714c, + 0x4cf8c581, + 0x433b979b, + 0x18077103, + 0x27073407, + 0x53f5d499, + 0x4cfec111, + 0xfa81fc91, + 0xb1072153, + 0xc29bb43b, + 0xe123a29b, + 0x0370d8b9, + 0xab0b930b, + 0x7123c10b, + 0x6b4cfec5, + 0x2d5fe65f, + 0x103c2703, + 0x076cfbc1, + 0x3b280743, + 0xc121034b, + 0x140760fe, + 0x187b427b, + 0x327b4e3b, + 0x03a0d1d5, + 0x03a4d4d5, + 0x03a8d3d5, + 0xb876fb31, + 0xd138fec1, + 0xd103a0d4, + 0xd103a4d3, + 0x5b03a8d2, + 0x5b3e5b4e, + 0xa0d4d52e, + 0xa4d3d503, + 0xa8d2d503, + 0x30f4c103, + 0x48064283, + 0x03a0d4d1, + 0x03a4d3d1, + 0x03a8d2d1, + 0x30134013, + 0xd4d52013, + 0xd3d503a0, + 0xd2d503a4, + 0xf0c103a8, + 0x4d0ff654, + 0xa8d4d102, + 0xacd3d101, + 0xb0d2d101, + 0x2b492b01, + 0x312c2b3a, + 0x88d4d5f1, + 0x8cd3d503, + 0x90d2d503, + 0x94d0d503, + 0x98d0d503, + 0x9cd0d503, + 0xd6d7ad03, + 0xd8d6ad03, + 0x0316c603, + 0x07610371, + 0x53360747, + 0xad315341, + 0xad03dcd4, + 0xc103ded3, + 0xd4b97cfe, + 0xdead01ec, + 0x44e603d4, + 0xf0c50127, + 0x40f6c15c, + 0x0378f1c1, + 0x64730f6c, + 0x01991ff6, + 0xf2c18607, + 0xfc2fe65c, + 0x64f3c100, + 0x06133fe6, + 0x0187d7b9, + 0x02001d27, + 0x80024d27, + 0x01c0d2d1, + 0x4ce32818, + 0x102c3830, + 0x41a347e3, + 0xe7204cf8, + 0xdc42f805, + 0x90ad2705, + 0x78f4c102, + 0x04bb4fe6, + 0xe183e207, + 0x0b13efe6, + 0x01bed0a9, + 0x077cfbc1, + 0xc5b10330, + 0x34337cfb, + 0xfcc14807, + 0xbcd3d53c, + 0x7cf3c103, + 0xac034433, + 0x234c5b7f, + 0xb0d4d531, + 0x7face303, + 0xf3c5b153, + 0xf122fc7c, + 0xbcd3d105, + 0xff4ea703, + 0x43d5fddf, + 0xeff601f0, + 0x189b04b9, + 0xd1d5a09b, + 0xdad503b4, + 0x1c2703c0, + 0x7f2ca780, + 0x863cf0c1, + 0xb4d4d105, + 0xd5415303, + 0xd103b4d4, + 0xc103b0d4, + 0xd3d17cfc, + 0xc49b03bc, + 0x41234107, + 0xb39bc40b, + 0x0b7cfcc5, + 0x8b428b4b, + 0xead3b9c2, + 0xacdcd501, + 0xb8d4d503, + 0x5337e003, + 0x78f0c10c, + 0x04df0fe6, + 0x01acd3d1, + 0xdfff4ea7, + 0xa8d1d1fd, + 0xb443d501, + 0xff3ea701, + 0x4027fddf, + 0x019834d5, + 0xa7e831c5, + 0xfddfff4e, + 0x1578f1c1, + 0x841fe646, + 0xc0d4d100, + 0x7c42dc01, + 0x34333807, + 0xdfff4ea7, + 0x4cf2c1fd, + 0x01b043d5, + 0xd550f3c1, + 0xd5014c42, + 0xc1015443, + 0x4ce044f4, + 0x2703a440, + 0xc156e600, + 0xf87154fb, + 0xfe91fc81, + 0xcb7b8b7b, + 0xf875eb7b, + 0xfe95fc85, + 0xf630f1c1, + 0x31088a1f, + 0x122fe6f2, + 0x54f3c105, + 0x08e53ff6, + 0xe044f4c1, + 0x08fa204c, + 0xc5f7877e, + 0x885eacd0, + 0x30f5c108, + 0xdcd15183, + 0xfc7501c0, + 0x01c4ded1, + 0xd0d1fe85, + 0xf09501c8, + 0x27fd295e, + 0xa9861e30, + 0x5e01bcd8, + 0x172efe66, + 0x6f5e4027, + 0x534707fa, + 0x5e4fab42, + 0x2158fa66, + 0x2350f4c1, + 0x50f4c541, + 0xf9c151f8, + 0xbc5e6123, + 0x010de0f9, + 0xf4024480, + 0x2880020d, + 0x210de002, + 0xe40c1611, + 0xf712010d, + 0xa5ea27f9, + 0x0c8b5efe, + 0xf648f2c1, + 0x3101ab2f, + 0x2a3fe6f3, + 0xb0d2d10a, + 0xbcded101, + 0xa8d4d101, + 0xacd3d101, + 0xb4d1d101, + 0xb8d0d101, + 0xd6d7ad01, + 0xd8d6ad03, + 0x03710303, + 0x2bec2b61, + 0x07b6072c, + 0x2b192bc7, + 0x2b492b0a, + 0x53c1533a, + 0x88d4d5b1, + 0x8cd3d503, + 0x90d2d503, + 0x94d1d503, + 0x98d0d503, + 0x9cded503, + 0xdcdcad03, + 0xdedbad03, + 0xfd995e03, + 0xf0c14427, + 0x2b332770, + 0x71482b38, + 0x81f291f1, + 0x3b402bf8, + 0x3b233b14, + 0xa0d1d583, + 0xa4d8d503, + 0xa8d2d503, + 0xfcd65e03, + 0x006622c0, + 0x31ff1e23, + 0x2aefe6fe, + 0xf4d1990a, + 0x0754f2c1, + 0xc1f07136, + 0x313b4cf8, + 0x027b6103, + 0xc6071307, + 0xd499f381, + 0x53089bf5, + 0xc58103c1, + 0xbc074cf8, + 0x327be807, + 0x9154f8c1, + 0x27b43bf2, + 0x7be153a1, + 0x27ab2b28, + 0x4cfbc191, + 0x912b2e9b, + 0xc1133e9b, + 0x0370d8b9, + 0x900bb123, + 0xc20ba30b, + 0xfbc56123, + 0xfc415e4c, + 0x2fe6f231, + 0xf8c10792, + 0xf4d19950, + 0x0350f3c1, + 0x50f8c581, + 0x0807313b, + 0x13070153, + 0xd399fc71, + 0x074607f5, + 0x03b00726, + 0x3b212341, + 0x532c9bb3, + 0x81c12741, + 0x23fe91f3, + 0x27c02b41, + 0x50f0c191, + 0x349ba127, + 0xab2b912b, + 0xd8b94e9b, + 0x01230370, + 0xa32b922b, + 0xf0c5c42b, + 0xfbe55e50, + 0x0fe6f031, + 0xf1c10876, + 0x54f2c150, + 0xf1c51123, + 0xc1f17150, + 0x127b50f3, + 0x3103139b, + 0x9950f3c5, + 0x9707f4d3, + 0xf4c1933b, + 0x03f38150, + 0x7be70771, + 0x54f8c132, + 0xf2914103, + 0x4153e153, + 0x23f5d099, + 0x07287b41, + 0x3b249bae, + 0x07349ba0, + 0x70d8b9ce, + 0x2b912b03, + 0x23c22ba3, + 0xfb895e71, + 0x01ead4b9, + 0x0b0346e0, + 0xbfe6fb31, + 0xd0a908c0, + 0xd3d103da, + 0xd2d101b4, + 0xd1d101b8, + 0xd7ad01bc, + 0xd6ad03d6, + 0x710303d8, + 0x1c2b6103, + 0xc607e707, + 0x392b4027, + 0xe1532a2b, + 0x0153c153, + 0x0388d3d5, + 0x038cd2d5, + 0x0390d1d5, + 0x039cd4d5, + 0x03dcdead, + 0x03dedcad, + 0x03dad0ad, + 0x0394d4d5, + 0x0398d4d5, + 0xc0fbee5e, + 0x1280210d, + 0x80220d00, + 0x80020de4, + 0xe127f7ce, + 0x1e64fec5, + 0xc5402706, + 0xf0c164f4, + 0xd10a8638, + 0x2701acd3, + 0xa5802741, + 0x5cf4c5f4, + 0xc560f4c5, + 0x202778f4, + 0xdfff4ea7, + 0x58f8c5fd, + 0xc534f8c5, + 0xf8c568f8, + 0x70f8c56c, + 0x43d5f235, + 0xb85e01e0, + 0x272127f7, + 0xc5f2a530, + 0xf2c55cf2, + 0x78f2c560, + 0xf3c52027, + 0x34f3c558, + 0xc568f3c5, + 0xf3c56cf3, + 0x5ef23570, + 0x7303f793, + 0x73e36303, + 0x2c5e63e3, + 0x010de0f7, + 0xe409ec02, + 0x4f02810d, + 0x0fec27f7, + 0xfea50027, + 0x1e64f0c5, + 0x108c270b, + 0xf8a5b127, + 0x3564fbc5, + 0x272127f3, + 0x5cf3c530, + 0xc534f3c5, + 0xf3c578f3, + 0x70f3c568, + 0xc558f2c5, + 0xf2c560f2, + 0x2741276c, + 0xf4d49d32, + 0x5ef5d39d, + 0x3327f73b, + 0x5e30f3c5, + 0x4ea7f62b, + 0x27e7ffff, + 0x0510011d, + 0xf5815e42, + 0xad5e3127, + 0x5e0927f4, + 0xd4b9fc5d, + 0x44e00215, + 0x1d270975, + 0x685e1009, + 0xc50127f5, + 0xfc5e30f0, + 0x48d4d1f5, + 0x004df803, + 0xa900e001, + 0xc101bed0, + 0xf3c17cf2, + 0x3348073c, + 0x5b210344, + 0x07300743, + 0x7fac03b2, + 0x34332123, + 0x537face3, + 0x7cf2c5b1, + 0x03b0d4d5, + 0x03bcd3d5, + 0x3ea74027, + 0xd5fddfff, + 0xd101f034, + 0xf80348d2, + 0x4b01002d, + 0x078703fb, + 0x039807c0, + 0xe397e3c7, + 0x074907c7, + 0x0748230a, + 0x0703333c, + 0x23433321, + 0x9b419b38, + 0x33a63330, + 0xd1163323, + 0xd501c0de, + 0xd503b4d2, + 0xd503c4d1, + 0xd503c8d4, + 0xd503ccda, + 0xd503d0d3, + 0x2303c0d0, + 0x2be2d887, + 0xc17cf4c1, + 0xb7033cfe, + 0x47034e5b, + 0xc4339433, + 0xb7e347e3, + 0x10001d27, + 0x0fff2da7, + 0xd57cf4c5, + 0xd503b0d9, + 0x5e03bcdc, + 0x1d27faec, + 0x2da71000, + 0xe15e0fff, + 0x334707fa, + 0x2b733345, + 0x9042f147, + 0xf1ff0001, + 0x00019841, + 0xff3ea7ff, + 0x32d5fddf, + 0x165e01b4, + 0x7cfbc1fb, + 0x01bed0a9, + 0xfbc5b103, + 0x7cfec17c, + 0xfcc14807, + 0x0744333c, + 0x234c5b30, + 0x533433e1, + 0x7cfec5b1, + 0x03b0d4d5, + 0x03bcd3d5, + 0x27ff235e, + 0x5e01e0ad, + 0x42f8fa25, + 0xad270438, + 0x1a5e0200, + 0x87d7b9fa, + 0x801d2701, + 0x014d2701, + 0xf9ee5e80, + 0xf25ea0a7, + 0x5ea0a7f7, + 0x3100f7ba, + 0x081032e0, + 0x03e0d7d1, + 0xa0276027, + 0xa9f7145e, + 0x070eb2b1, + 0xbe0f8b07, + 0xa9003aab, + 0x070eb4b1, + 0x8b0907b0, + 0x3a9dbe0f, + 0xabbfab00, + 0xf62f5e0f, + 0x125e3027, + 0x0c0c27fa, + 0x07f2837e, + 0x0cbc2790, + 0xb9acd0c5, + 0x2702e9d4, + 0xc242e0c0, + 0xe0f4a107, + 0xe003cf41, + 0x2703cb44, + 0xf4fea180, + 0x03bd11ec, + 0x4e3b4127, + 0x18004ef8, + 0x2703b201, + 0x7ef0a1a1, + 0xf0b5f23f, + 0x02e40fe6, + 0x757e0b07, + 0xc15007f2, + 0x5c0b38f0, + 0xf2c1f141, + 0x27502b34, + 0x47512b30, + 0x27091bb2, + 0x27f355e2, + 0x271027c0, + 0x27f4a120, + 0x0f4c2330, + 0x31274214, + 0xab0ba30b, + 0x4127382b, + 0xf8c1ae0b, + 0x0b640734, + 0x3b300ba0, + 0xf64a3b63, + 0x9102db8f, + 0x71fb81f8, + 0x30fec1f7, + 0x0726e1e0, + 0x02c0e1f4, + 0xf381f291, + 0xa607f071, + 0x1ff6f1b1, + 0x9b070345, + 0x9013fb51, + 0x9c3b8013, + 0x960b8b3b, + 0xa7078a0b, + 0xa53ba013, + 0xbea7a40b, + 0xd5fddfff, + 0xd50108b0, + 0x31010cb3, + 0x10b2d5fc, + 0xd5c5d601, + 0xd50114ba, + 0xd50118b9, + 0xa1011cb8, + 0xff4ea7fe, + 0xec83fddf, + 0x30f0c11f, + 0x01004ed5, + 0xd538f1c1, + 0xd5010440, + 0xd1016041, + 0xc10348d2, + 0x420754f3, + 0x13874183, + 0x14ab4633, + 0xc148f4c1, + 0x433358f8, + 0x01a4d3a9, + 0xfbc114ab, + 0xab48475c, + 0xab3f8b14, + 0x7a30e81b, + 0xfc302702, + 0x7c01002d, + 0x1cd4b902, + 0xa3410002, + 0x2640001d, + 0x9cd4d138, + 0xc04cd801, + 0xc0d4d118, + 0x001da301, + 0xa3481880, + 0x0200001e, + 0xa3104c18, + 0x0100001e, + 0x0364d4a9, + 0x025142e0, + 0xc506fc31, + 0x00001fa3, + 0x4ea70100, + 0xc5fddfff, + 0x3ea7b441, + 0x27fdefff, + 0xa834d543, + 0xc1030702, + 0x48dca804, + 0xd51427fb, + 0xd502a801, + 0x2702ac01, + 0x7003d530, + 0x572ea706, + 0x2305fdeb, + 0x00004e27, + 0x9b241505, + 0x01d50ef3, + 0x03d502b0, + 0x43270674, + 0x02b404d5, + 0xefffdea7, + 0xb4d4c1fd, + 0x27fb48dc, + 0xb4ded5e4, + 0x4f3ea702, + 0x1027fdeb, + 0x4f273105, + 0x02050000, + 0xf19b3415, + 0x4f2ea70e, + 0x4c27fde5, + 0x1524051c, + 0x000f2721, + 0x35a00000, + 0x3f3ea720, + 0x4103fde5, + 0x31153405, + 0xded53035, + 0xd1d502d0, + 0x43270648, + 0x02d4d4d5, + 0xefff0ea7, + 0xd404c1fd, + 0x27fb48dc, + 0xd401d514, + 0x2f3ea702, + 0x2027fdeb, + 0x4f273205, + 0x0f420000, + 0xf29b3415, + 0xbf3ea70e, + 0x4c27fde4, + 0x15340512, + 0x004f2732, + 0x35a00000, + 0xd801d534, + 0x4c02d502, + 0xd5432706, + 0xa702dc04, + 0xfdefff1e, + 0xdcdc14c1, + 0x4427fb48, + 0x02dc14d5, + 0xeb272ea7, + 0x053027fd, + 0x004f2723, + 0x150f8200, + 0x0ef39b24, + 0xe49f2ea7, + 0x134c27fd, + 0x23152405, + 0x00004f27, + 0x2435a000, + 0x13d53327, + 0x0ea702e0, + 0xc1fdefff, + 0x48dce004, + 0xd51427fb, + 0xd502e001, + 0x2702e401, + 0xe802d520, + 0x1f3ea706, + 0x3205fdeb, + 0x00004f27, + 0x34150a03, + 0xa70ef29b, + 0xfde46f3e, + 0x053a4c27, + 0x27321534, + 0x0000004f, + 0xd53435a0, + 0xd502e801, + 0x2706ec02, + 0xec04d543, + 0xff3ea702, + 0x34c1fdef, + 0xfb48dcec, + 0x34d54427, + 0x2ea702ec, + 0x27fdeb17, + 0x27230530, + 0x8300004f, + 0x9b24150a, + 0x2ea70ef3, + 0x27fde45f, + 0x24053b4c, + 0x4f272315, + 0xa0000000, + 0x2435f903, + 0xfec1f58e, + 0x2b0b0738, + 0x7e5c07ce, + 0x500bef8c, + 0xa17e0b07, + 0x07c00bef, + 0xefc27e0b, + 0x4138f2c1, + 0xc1201bf1, + 0xf0c134f3, + 0x2bc12b38, + 0x47091b51, + 0x271207b3, + 0x5efc55e0, + 0xe2e0fd0d, + 0xe3e003ce, + 0xff1e03bb, + 0x80a7f771, + 0xb0a77173, + 0x07fd245e, + 0x7e0b07b0, + 0xf831ef10, + 0x07acd0c5, + 0x8c8fe690, + 0x30fbc1fc, + 0x0340b1e0, + 0x7143b1d4, + 0xff4ea7fc, + 0xfe81fddf, + 0x01084cd5, + 0x4ed5f091, + 0x40d5010c, + 0x405e0110, + 0xc0d4d1fd, + 0xf8312701, + 0xa3fd8842, + 0x0400001e, + 0xa9fd805e, + 0xa301f2d4, + 0x1000001e, + 0xa51f4cf8, + 0x001ea3fd, + 0x9d5e2000, + 0x37b2e0fd, + 0x24b3e003, + 0x27ff1e03, + 0x961e0cbc, + 0x0180ad27, + 0x27f5e45e, + 0xfc4f5ea0, + 0x365e8127, + 0x278027fc, + 0xfcc85e90, + 0x5e0c0c27, + 0xf2c1f704, + 0x44f1c150, + 0x2b54f3c1, + 0xc5210312, + 0xe20750f2, + 0xc170f4c1, + 0xf07144f2, + 0x430b2153, + 0x047be153, + 0xf4c13207, + 0xc1b20760, + 0x3e2b6cf8, + 0xf971be2b, + 0x8138fec1, + 0x3b343bfa, + 0x3b383b18, + 0xc1ae3b9e, + 0xf8c154f2, + 0x91f48138, + 0x7b069bfe, + 0x3b610342, + 0xc1f291e8, + 0xc60754f8, + 0x287bc153, + 0x4c9b2c9b, + 0x0b50fcc1, + 0x0ba30b91, + 0xb9c123be, + 0x2b0370d8, + 0x2ba42b90, + 0xc56123b2, + 0xf4c150fc, + 0x7bcb0738, + 0x7ba47b94, + 0xf4215ec4, + 0xc154f0c1, + 0xf2c170f4, + 0xc1f97168, + 0x400b6cf1, + 0x947b120b, + 0xc54cf4c1, + 0x410368f1, + 0xc14cf1c1, + 0xf4c568f3, + 0x07979b4c, + 0xc1710324, + 0xfa8160f8, + 0x916cf4c1, + 0x53133bfb, + 0x53370721, + 0xc1480b31, + 0xa07b4cfe, + 0xc207b07b, + 0xa39bb39b, + 0xd8b9c43b, + 0xe1230370, + 0xac0b910b, + 0x7123b20b, + 0x1e4cfec5, + 0x7cf3c192, + 0x073cfbc1, + 0xbed0a948, + 0x33310301, + 0x074b5b44, + 0xc53123b3, + 0x30077cf3, + 0xb1533433, + 0x03b0d4d5, + 0x03bcd3d5, + 0x27f4f85e, + 0xf8a50c8c, + 0xb127e027, + 0xf3352127, + 0xc558fbc5, + 0xfbc55cfe, + 0x34fec560, + 0xc564fbc5, + 0xfbc578fe, + 0x6cfec568, + 0x5e70fec5, + 0xf3c1f04f, + 0x70f1c154, + 0x0b50f4c1, + 0xc1e70713, + 0x710344f3, + 0x076cfbc1, + 0x53410307, + 0xc1415301, + 0x315360fc, + 0xeb3b342b, + 0xf4c12007, + 0x54fbc154, + 0x2c3bfa81, + 0xfcc1f971, + 0xc1245b54, + 0xab7b50f8, + 0x9144f4c1, + 0xc1917bfb, + 0x482b6cf1, + 0x949bbc7b, + 0xec5bb39b, + 0x213ba39b, + 0xd8b90c5b, + 0x9e0b0370, + 0xb00ba20b, + 0xd75e7123, + 0xa8d4d1fe, + 0xacd3d101, + 0xb0d2d101, + 0xb4d1d101, + 0xb8d0d101, + 0xbcded101, + 0x2b192b01, + 0x2bec2b0a, + 0x2b3a2b49, + 0x88d4d52c, + 0x8cd3d503, + 0x90d2d503, + 0x94d1d503, + 0x98d0d503, + 0x9cded503, + 0xd6d7ad03, + 0xd8d6ad03, + 0xf3855e03, + 0x01bcd2d1, + 0x03dad1a9, + 0x01b4d4d1, + 0x01b8d3d1, + 0x07072c2b, + 0xe607fc31, + 0x3a2b492b, + 0xe1530153, + 0xd4d51153, + 0xd3d50388, + 0xd2d5038c, + 0xd0ad0390, + 0xdead03d6, + 0xd1ad03d8, + 0xdcd503da, + 0xdcd50394, + 0xdcd50398, + 0x3c5e039c, + 0x6cfcc1f3, + 0xc144f3c1, + 0xe60754f0, + 0x3b70f4c1, + 0x71ec3b3c, + 0x70d8b9fc, + 0x4cfbc103, + 0x6103400b, + 0xc47b1607, + 0xf4c19307, + 0x5b115360, + 0x03cb9b98, + 0x03a30781, + 0x4cfbc5b1, + 0xa85b2107, + 0xa43b243b, + 0xc14cf4c1, + 0x415344fb, + 0x5b54f3c1, + 0xc5e05b20, + 0xf0c18cf4, + 0x23f4816c, + 0x3bb15381, + 0x7b135b20, + 0x91b85b43, + 0x54f0c1f3, + 0xf1c1b12b, + 0x7ba22b8c, + 0x4cf2c130, + 0x319b9e2b, + 0x2123419b, + 0xa40b9c0b, + 0x6123b30b, + 0x5e4cf2c5, + 0xfec1fdbe, + 0xd1e92678, + 0x5e01acd1, + 0xf171f3bd, + 0x4ea7f281, + 0x13fddfff, + 0xd5f39110, + 0x13010841, + 0x0c42d520, + 0xd5301301, + 0x5e011043, + 0x4707f9ff, + 0x73334533, + 0x41f1472b, + 0xff000190, + 0x91f38c5e, + 0x71f381f2, + 0x278027f0, + 0x5ea02790, + 0xf071f9be, + 0xf291f381, + 0x30130013, + 0x80272013, + 0xa0279027, + 0x27f9a95e, + 0x279027a0, + 0x81f29180, + 0x5ef071f3, + 0xa607f99a, + 0xf381f071, + 0xa013f291, + 0x30130013, + 0x70132013, + 0x8013b013, + 0x6a074013, + 0xc1f95f5e, + 0x0a1b80f0, + 0xf09c00e8, + 0x925e1a07, + 0x84f3c1f0, + 0x341b2407, + 0x27f07e5e, + 0xf0675e00, + 0x5c5e3027, + 0x5ea027f0, + 0xa027f045, + 0xf6f00d5e, + 0x0431273a, + 0x2701210d, + 0x27802730, + 0x0d3c0341, + 0x2127b227, + 0xf4c5f3a5, + 0x5cf8c558, + 0xc560f4c5, + 0xf8c534f4, + 0x78f8c564, + 0xc568f8c5, + 0xf4c56cfb, + 0x5ef83570, + 0x0427eddf, + 0x5c95f193, + 0x0f949e00, + 0xa54b2700, + 0xfd5a5ef4, + 0x9b07a707, + 0x0103a013, + 0x21039013, + 0x11038013, + 0x923ba03b, + 0x4e5e813b, + 0x5ec127ff, + 0xd7d1f83d, + 0xa90703e0, + 0xa1536707, + 0x025e6153, + 0x091e27ef, + 0xf45e0110, + 0xa5b227eb, + 0x272027fb, + 0xc5f33501, + 0xf2c55cf2, + 0x64f2c534, + 0xc578f2c5, + 0xf2c568f2, + 0x70f2c56c, + 0xc558f0c5, + 0x402760f0, + 0x21273127, + 0x9df4d49d, + 0x645ef5d3, + 0xa6f431ed, + 0xdad0a946, + 0xa8d3d103, + 0xacd2d101, + 0xb0d1d101, + 0xf5005e01, + 0x03dad1a9, + 0x01a8d4d1, + 0x01acd3d1, + 0x01b0d2d1, + 0x0707f831, + 0x492be607, + 0x2c2b3a2b, + 0xe1530153, + 0xd4d51153, + 0xd3d50388, + 0xd2d5038c, + 0xd0ad0390, + 0xdead03d6, + 0xd1ad03d8, + 0xd8d503da, + 0xd8d50394, + 0xd8d50398, + 0xe85e039c, + 0x07fb4ef0, + 0x931427b0, + 0x005c1ef0, + 0x000b77be, + 0xf093b111, + 0xbe005c2b, + 0x21000b6c, + 0x32f093b1, + 0x61be005c, + 0xb101000b, + 0x5c39f093, + 0x0b56be00, + 0x93b23100, + 0x005c40f0, + 0x49be1027, + 0xdb07000b, + 0xc127d403, + 0x1c07d231, + 0x5c2bf093, + 0xbec10300, + 0x03000b34, + 0x0fccc4d4, + 0x0e0b07ec, + 0xe98f5efb, + 0x0499fc4e, + 0xc0d10726, + 0x071aff4c, + 0x33353334, + 0xf1342b43, + 0x00018c34, + 0x004ea3ff, + 0x34f50400, + 0xff00018c, + 0x4d072d07, + 0x25334733, + 0x2e23240b, + 0x27fff5cc, + 0x4207121c, + 0x44030301, + 0x3c01e107, + 0x4c051123, + 0x44033403, + 0x3ea7fe98, + 0x27fddfff, + 0xd508004d, + 0xd5020834, + 0xa7020831, + 0xfd4fff4e, + 0x00114311, + 0x23c54207, + 0x744c0368, + 0x02013827, + 0x42050403, + 0xf3a84403, + 0xefff3ea7, + 0xd434c1fd, + 0xfc6a4dd8, + 0x2723070f, + 0xc1f4e843, + 0x3ddcd423, + 0xa7f5fc6a, + 0xfdefff3e, + 0xd8dc34c1, + 0x0ffc6a4d, + 0x43272307, + 0x23c1f4e8, + 0x6a3ddcdc, + 0x4227f5fc, + 0x0a28d4fd, + 0x2ea7ff00, + 0x27ffffff, + 0x3824bd41, + 0x0f239906, + 0xf49b4027, + 0x8741270e, + 0x4034f533, + 0x8eff02b0, + 0xb9fa4efc, + 0x07018602, + 0xa9c207b0, + 0x8301f200, + 0xd10553c4, + 0xa9035cba, + 0xa90374be, + 0x0601f4b3, + 0x534307c9, + 0x23444746, + 0x6514c242, + 0x4ea73027, + 0xd5fddfff, + 0xb9020843, + 0x760387b0, + 0xff4ea70e, + 0x40c5fddf, + 0x07fa8ee4, + 0x47d553d3, + 0xd842234d, + 0x41ea7928, + 0x3e07009a, + 0x309b3153, + 0x2ea74307, + 0x0bfde4af, + 0x1524054a, + 0x0bd09b20, + 0xa72c35ad, + 0xfde48f4e, + 0x43053a0b, + 0x33274015, + 0xb0b94c35, + 0x4ea70387, + 0xd5fddfff, + 0xc6020843, + 0xfa8eb00f, + 0x008721fc, + 0x40072027, + 0x4e9b2a0b, + 0xe4af3ea7, + 0x05420bfd, + 0x03301534, + 0x27e09be1, + 0xa7313510, + 0xfde48f4e, + 0x42052e0b, + 0x33274015, + 0x4ea74135, + 0xd5fddfff, + 0x5e020843, + 0x2007ff6f, + 0x2a0b2e9b, + 0xa72841c2, + 0xfde4af3e, + 0x30153205, + 0x34354027, + 0x4ea72327, + 0xd5fddfff, + 0x5e020842, + 0x4ea7ff4b, + 0xd5fddfff, + 0x5e02084c, + 0x41eeff3f, + 0x3ea7ff30, + 0x05fde4af, + 0x27301532, + 0x27343540, + 0xff4ea721, + 0x42d5fddf, + 0x205e0208, + 0x532307ff, + 0x5e209b25, + 0xf04eff76, + 0xdf3bcf5b, + 0xfc4efe2b, + 0x88be0f07, + 0xfc0effe7, + 0xff0bf00e, + 0xcf5bf04e, + 0xfe2bdf3b, + 0x0f07fc4e, + 0xfffd88be, + 0x2103ff1e, + 0x0319181e, + 0x01031419, + 0x34ce1103, + 0x2301230d, + 0x19001911, + 0x0b042b14, + 0x27f230fe, + 0x4efe0b00, + 0xab4107fe, + 0xd8300740, + 0x151e0f43, + 0x24231e01, + 0x14033e05, + 0x071e3403, + 0x42534207, + 0xf4584103, + 0x14192586, + 0x341d1103, + 0xf2a83103, + 0xfd4efe8e, + 0x03dce007, + 0x2624d029, + 0x3f6b3107, + 0x48334307, + 0x320743ab, + 0x3423e407, + 0xec333253, + 0x03e4ab10, + 0x05400731, + 0x0324234e, + 0x07f3b844, + 0x272103e4, + 0x1d031e40, + 0x0b3e0731, + 0xa8410334, + 0x00fd8ef2, + 0x04110321, + 0x04014342, + 0x411d430b, + 0x41030421, + 0xfe0b0425, + 0x00000030, + 0xf2e3f54e, + 0x5f079307, + 0xb0273f07, + 0x3a037027, + 0x82074027, + 0x5c036027, + 0x95fb850c, + 0x05f3a5f7, + 0x25f115f0, + 0x01c85ef4, + 0x1c40b7b6, + 0x3e0f0725, + 0x01ba5eb8, + 0x40276807, + 0x61237027, + 0xf485b127, + 0xa95ef795, + 0x301c2301, + 0x4f6b4107, + 0xd4301c03, + 0x7536184a, + 0x27301c24, + 0x47f38531, + 0x0b733347, + 0x301c2374, + 0x855e710b, + 0x6c1ce001, + 0x1cd40180, + 0x1ce0206d, + 0x54010663, + 0x1ce0641c, + 0xe4015a25, + 0x01632d1c, + 0x1cc0261e, + 0x1ce42964, + 0x1e015869, + 0x731ce022, + 0x1c3400f6, + 0x701ce474, + 0x131e0149, + 0x0f751cc0, + 0x3e781ce4, + 0x27081e01, + 0x5ef49541, + 0x9001013c, + 0xc4641c00, + 0xcc0a691c, + 0x00130b00, + 0x071eb127, + 0x2b751cc4, + 0xd007b027, + 0x0d07a027, + 0x39be1a27, + 0x00f9002e, + 0x00013c4c, + 0x4a0b4507, + 0x1a27401d, + 0x2bbe0d07, + 0xd007002e, + 0x07e6a103, + 0xa027dd1e, + 0x4c834007, + 0xf935070f, + 0x013c5844, + 0x1d3a0b00, + 0x03045334, + 0x270176a1, + 0x91c707b0, + 0x2bca2bf3, + 0x813a76cb, + 0x6647a6f4, + 0x270f07b7, + 0xc57e2d1c, + 0x1eb027fe, + 0x96f3810e, + 0x071d0734, + 0xfeb67e0f, + 0xdc27041e, + 0x07c12320, + 0xbdf3534c, + 0x014103fe, + 0xe241cc31, + 0x0f07b546, + 0x7e2d1c27, + 0xda07fe98, + 0xd50bd123, + 0xd139061e, + 0xa1fe8b7e, + 0x07d123f4, + 0xf3d4ce0f, + 0x061edc07, + 0x23fe7b7e, + 0x270f07d1, + 0xd1cc201c, + 0x01591ef4, + 0x03c90791, + 0x7e0f07c4, + 0x9c07fe64, + 0x9d01611e, + 0xb02774d6, + 0x0d070b1e, + 0x000089be, + 0xb02bb707, + 0x34e6f391, + 0x457e171e, + 0x07b123fe, + 0x0741034b, + 0x201c270f, + 0x1ef041cc, + 0xfe327e04, + 0x0f07d419, + 0xd1031407, + 0xdb0742b6, + 0x217e061e, + 0x07d123fe, + 0x201c270f, + 0x03f4d1cc, + 0x07141e94, + 0xfe0e7e0f, + 0x61190d1e, + 0x057e6103, + 0xc20f07fe, + 0xb027f568, + 0x81198103, + 0xfe361ff6, + 0x10270f07, + 0x21fdef7e, + 0x23f2c3f0, + 0xa3f58e01, + 0x15f305f0, + 0x63fe4ef4, + 0x033f07f0, + 0x7ef30538, + 0xf043fdec, + 0xf083fe0e, + 0x3007fe0b, + 0x01030419, + 0x032b4396, + 0xfb4efe0b, + 0xeea7f063, + 0x05fd4fff, + 0x07c007f2, + 0x01b307d1, + 0x123f9be4, + 0x44334103, + 0xab38e2c1, + 0x1023ce34, + 0xffe30ea7, + 0x0ab8beff, + 0xe8101e00, + 0xa7061ef3, + 0xffffe32e, + 0x36272401, + 0xf1294276, + 0x1303d409, + 0x12732407, + 0x03fc4d10, + 0x0107ff1e, + 0xc4090103, + 0x322b3407, + 0x03fc4d10, + 0x310cff1e, + 0x03fc3d03, + 0x87ec30da, + 0x104c0342, + 0x4d0bf301, + 0x21034305, + 0x03fc2d04, + 0x01072027, + 0x01033b07, + 0x3401111e, + 0x14052103, + 0x2d103403, + 0x2d2303fc, + 0x128703fc, + 0x0b101c03, + 0x0df0301d, + 0xe30ea7d2, + 0x0401ffff, + 0x18be44c6, + 0x4027000a, + 0x270ef49b, + 0xff4ea731, + 0xf043fd4f, + 0xfb8e43a5, + 0xf005f063, + 0x20073107, + 0xe0001f27, + 0x0f271007, + 0x1007d000, + 0x2f5ef043, + 0x05f063ff, + 0x073107f0, + 0x001f2720, + 0x271007c0, + 0x07b0000f, + 0x5ef04310, + 0x0409ff16, + 0xf40df063, + 0x30070449, + 0xf201f42d, + 0x0f273803, + 0x10079000, + 0xa0001f27, + 0xf0431007, + 0x4efef55e, + 0x07a007fa, + 0xbeb10701, + 0x07fffede, + 0x61fc9330, + 0x35030225, + 0x0c072307, + 0x07da4d27, + 0x24231b07, + 0x050c0c03, + 0x15ca25c4, + 0xfc15bec3, + 0x3e0c07ff, + 0x4eff1eae, + 0xc9f493f7, + 0x4389030d, + 0x0a428908, + 0x322b8007, + 0x300c7107, + 0x03fc3d03, + 0x002734d6, + 0x4287f78e, + 0xd0124ce9, + 0x93071007, + 0xac07c303, + 0x9123b207, + 0xb103a273, + 0x4de9c323, + 0x1007d010, + 0x270ca9d2, + 0xddf19308, + 0x843e0055, + 0x8c2da907, + 0x84298d0d, + 0x0bb9dd24, + 0x89484ce4, + 0x24141e00, + 0xc40bbadd, + 0x1e7e284c, + 0xbbdd000a, + 0xbcddc40b, + 0x8329730b, + 0x370b2707, + 0x2ce33123, + 0x7f3ce37f, + 0x2c032419, + 0xf923c280, + 0x2a07a7c6, + 0xbd103707, + 0xbd2303fc, + 0x4b8703fc, + 0xd01044f1, + 0xb1031007, + 0x34033405, + 0xbd10f238, + 0xbd2303fc, + 0xf39303fc, + 0x8d030d20, + 0x3f270a3b, + 0x1007e000, + 0x80093b2d, + 0x0bb90dc4, + 0x2774410e, + 0x0e4ee301, + 0x744501fc, + 0x0d40f78e, + 0x06270bbc, + 0x5561f193, + 0xfef17e00, + 0xf78e0127, + 0xf1930627, + 0x7e005592, + 0x831efee3, + 0x14290329, + 0x03fc3d10, + 0x4d10ff1e, + 0xff1e03fc, + 0x042b0307, + 0x0d03000c, + 0xfe0b03fc, + 0x90004f27, + 0x44291007, + 0x34070f6b, + 0x03fc4d10, + 0x03fc3d23, + 0xb0004f27, + 0x44291007, + 0x0ca6f293, + 0x07230d03, + 0xfc4d1034, + 0xfc3d2303, + 0x004f2703, + 0x291007d0, + 0x10234d44, + 0x2303fc4d, + 0x8d03fc4d, + 0x0ba60824, + 0xa0004f27, + 0x44291007, + 0x4d103407, + 0x3d2303fc, + 0x4f2703fc, + 0x1007c000, + 0x232d4429, + 0x4d103407, + 0x3d2303fc, + 0x4f2703fc, + 0x1007e000, + 0x236d4429, + 0x03fc4d10, + 0x03fc4d23, + 0x0b0a248d, + 0x93f84efe, + 0x030c3ff4, + 0x42294309, + 0x322b9007, + 0x3d03300c, + 0x34d603fc, + 0xf88e0027, + 0x4de94287, + 0x10079012, + 0xd303a307, + 0xc207bd07, + 0xb273a123, + 0xd323c103, + 0x901048e9, + 0xbad21007, + 0x9308270d, + 0x005457f1, + 0x07fdfe7e, + 0x159805ba, + 0xc5dc509d, + 0xf1930827, + 0x7e0054cb, + 0xb806fdeb, + 0x08030907, + 0xcd103b07, + 0xcd2303fc, + 0x4c8703fc, + 0x901044f1, + 0xc1031007, + 0x04030405, + 0xcd10f338, + 0xcd2303fc, + 0xf39303fc, + 0x2d030bc0, + 0x003f273c, + 0x271007a0, + 0x8e3c2d01, + 0x93f74ef8, + 0x030babf4, + 0x42694349, + 0x322b9007, + 0x300c7107, + 0x03fc3d03, + 0x002734d6, + 0x4287f78e, + 0xb0124ce9, + 0xa3071007, + 0x8c07c303, + 0xa123b207, + 0xb1038273, + 0x4de9c323, + 0x1007b010, + 0x270d8ad2, + 0xc1f19308, + 0x687e0053, + 0x2d8a07fd, + 0x299d0d9c, + 0xb9dd2494, + 0x484cc40b, + 0x24141e74, + 0xc40bbadd, + 0x1e6a284c, + 0xbbdd000a, + 0xbcddc40b, + 0x94295f0b, + 0x27f94c50, + 0x2ff19308, + 0x347e0054, + 0x079029fd, + 0x23070b37, + 0x7f3ce301, + 0x197f0ce3, + 0x803c0334, + 0xc6f930c2, + 0x07170787, + 0xfcbd1038, + 0xfcbd2303, + 0xf14b8703, + 0x07b01044, + 0x05b10310, + 0x38140314, + 0xfcbd10f3, + 0xfcbd2303, + 0xf5f39303, + 0x3b6d030a, + 0xc0003f27, + 0x01271007, + 0xf78e3b2d, + 0xf1930627, + 0x7e0053f0, + 0x971efcdb, + 0x4fff2ea7, + 0x9b2401fd, + 0x4103123f, + 0x22c14433, + 0x2734ab38, + 0x27320e00, + 0xe3fe0b01, + 0x15f205f0, + 0x4ef425f3, + 0xff3ea7fa, + 0x34a9ffff, + 0xf0630eac, + 0xa107d007, + 0x00ad4fe6, + 0x00a940fa, + 0x0ea834d1, + 0x00a14fe6, + 0x07e6bb3e, + 0xa7122f9b, + 0xfd4fff4e, + 0x1ea74301, + 0x33ffffe7, + 0xd6140134, + 0xab38a343, + 0x1e130532, + 0xe70ea70a, + 0x3fbeffff, + 0xcf270006, + 0x10100000, + 0xa744cbc1, + 0xffffff4e, + 0x0ea840d1, + 0x4fff4ea7, + 0x074401fd, + 0x0b37333b, + 0x304c0303, + 0x4f9b041d, + 0x18ddf912, + 0x0300013e, + 0x043d304c, + 0x4c273f07, + 0x7d0d5d20, + 0x183c0304, + 0x2a070403, + 0x057b1c27, + 0xf8eabef3, + 0xa6d007ff, + 0x48c4c107, + 0x41033b07, + 0xc148c4c5, + 0x310348c4, + 0x0fff3d10, + 0xc3c53027, + 0x44c4c144, + 0xffe70ea7, + 0x05a9beff, + 0x27031e00, + 0x430d07d0, + 0xc3fa0ef0, + 0x4efe0bf0, + 0x073401fa, + 0x07b107c3, + 0xff4fc4a2, + 0x27ffffff, + 0x2d271007, + 0x02270601, + 0x01a43d27, + 0xff29fdbe, + 0x00ccd007, + 0x060d2710, + 0x29f0be01, + 0x25f493ff, + 0x40050225, + 0xc101cd05, + 0xffff1fc0, + 0x071dffff, + 0x273a072b, + 0x29d4be05, + 0x1000ccff, + 0x01060d27, + 0xff29c9be, + 0x24fef493, + 0x8e400502, + 0xbefe4efa, + 0x270007b6, + 0x07f0002f, + 0xe33d2710, + 0x07051e04, + 0x01f4e843, + 0xf842c424, + 0xbd9efe0e, + 0xfb4e0007, + 0xfb9bb027, + 0x00cf270e, + 0x271007f0, + 0x27c30531, + 0x0ef49b40, + 0x4fff4ea7, + 0x3e43a5fd, + 0x05c031c1, + 0x4efb8ecb, + 0x9bc027fb, + 0xbf270efc, + 0x1007f000, + 0xb3053127, + 0xf49b4027, + 0xff4ea70e, + 0x43a5fd4f, + 0xbc059c3e, + 0xfe4efb8e, + 0xffe70ea7, + 0x04c3beff, + 0x27302700, + 0x07f0004f, + 0x8e430510, + 0x7efe4efe, + 0x07e6fe30, + 0xa7122f9b, + 0xfd4fff4e, + 0x1ea74301, + 0x33ffffe7, + 0xd6140134, + 0xab38a343, + 0x8e130532, + 0xe70ea7fe, + 0xfe0effff, + 0x0004b19e, + 0xf105f123, + 0xf325f215, + 0xfb4ef435, + 0x7fff4ea7, + 0x634491d0, + 0xf8b007f0, + 0x008b104c, + 0xe57efdab, + 0x9b07e6fd, + 0x4ea7122f, + 0x01fd4fff, + 0xe71ea743, + 0x3433ffff, + 0x43d61401, + 0x32ab38a3, + 0x0a1e1305, + 0xffe70ea7, + 0x0468beff, + 0xff4ea700, + 0x4401fd4f, + 0xf000cf27, + 0x4c031007, + 0x203c2730, + 0x9d0cc49d, + 0x4f9b0dc3, + 0x0fc39d12, + 0x07304c03, + 0x143c033f, + 0x1d272b07, + 0xc49d03f0, + 0x100f270e, + 0x051007f0, + 0xf722bef3, + 0x154127ff, + 0x0c0f27c4, + 0xbe1007f0, + 0x03fff932, + 0x7ec02501, + 0x0ea7feff, + 0xbeffffe7, + 0xeb0003eb, + 0x0ef043fd, + 0x0bf103fb, + 0x27f84efe, + 0x1000004f, + 0xc14a0110, + 0x49c14048, + 0x484cc144, + 0xdc07ca2a, + 0xdc07051e, + 0xbea7d123, + 0xd1ffffff, + 0x2b0ea8b4, + 0x934556da, + 0x00513cf0, + 0xd1ff237e, + 0x930ea8b1, + 0x005156f0, + 0xc4ff177e, + 0x2233568f, + 0x9dd45711, + 0x26520fff, + 0x072907de, + 0x9318073c, + 0x00515cf0, + 0x9b074a07, + 0x07fef77e, + 0x1ebd07ca, + 0x259ebe1f, + 0xa894d100, + 0x3320070e, + 0x19240b27, + 0x07458624, + 0x68f0931c, + 0xd57e0051, + 0x23c103fe, + 0x270c07b1, + 0xc40fff1d, + 0xffffffbf, + 0xda0bd4ff, + 0x00004f27, + 0x4d051010, + 0x4ea7f88e, + 0xd1ffffff, + 0xc60ea844, + 0x004f2747, + 0x01101000, + 0x01440341, + 0x01440342, + 0x01440343, + 0x2ef09344, + 0x915e0051, + 0x4efe0bfe, + 0x634207f5, + 0x074013f5, + 0x076107a2, + 0x07524780, + 0xc5702791, + 0x351e50f4, + 0xd103b309, + 0xfff816be, + 0xb203c00b, + 0x1c270c07, + 0x28f29350, + 0xad0e0051, + 0x27e6d9ce, + 0x07c41d40, + 0x1ef09317, + 0x2f070051, + 0xc1fe4b7e, + 0x7a0b50f4, + 0x850b940b, + 0x070967c2, + 0x07d027b8, + 0x43ce1ecf, + 0x4ef58ef5, + 0x236207f5, + 0x077107f5, + 0x13500792, + 0x27a10760, + 0x19301e80, + 0xbed103b3, + 0x0bfff7bf, + 0x07b103c0, + 0x501c270c, + 0x50dff293, + 0xce9d0e00, + 0x4027e6da, + 0xc41d1807, + 0x50c7f093, + 0x7e2f0700, + 0x890bfdf4, + 0x78c2a60b, + 0x0bb8070b, + 0x07d027b5, + 0x03d11ecf, + 0x4ef58ef5, + 0x07b007f9, + 0x07a207d1, + 0x7efcab93, + 0x07e6fbd4, + 0xa7122f9b, + 0xfd4fff4e, + 0x1ea74301, + 0x33ffffe7, + 0xd6140134, + 0xab38a343, + 0x1e130532, + 0xe70ea70a, + 0x57beffff, + 0x4f270002, + 0x1007f000, + 0x43153227, + 0x4d453a03, + 0x4a9d4325, + 0x15499d14, + 0xff7e4b35, + 0xa7d007fc, + 0xffffe70e, + 0x00020ebe, + 0xd5c6fceb, + 0x0d272b07, + 0x1d070202, + 0xff2681be, + 0xf98e0d07, + 0xc007fb4e, + 0xfdabb107, + 0xe6fb677e, + 0x122f9b07, + 0x4fff4ea7, + 0xa74301fd, + 0xffffe71e, + 0x14013433, + 0x38a343d6, + 0x130532ab, + 0x0ea70a1e, + 0xbeffffe7, + 0x270001ea, + 0x07f0003f, + 0x15432710, + 0x35482734, + 0x4534253c, + 0xfc987e3b, + 0x0ea7c007, + 0xbeffffe7, + 0xeb0001a7, + 0x8e0c07fd, + 0x07fc4efb, + 0xab0d66d0, + 0xfb0e7efc, + 0x2f9b07e6, + 0xff4ea712, + 0x4301fd4f, + 0xffe71ea7, + 0x013433ff, + 0xa343d614, + 0x0532ab38, + 0xa70a1e13, + 0xffffe70e, + 0x000191be, + 0xf0004f27, + 0x34271007, + 0x43254315, + 0x687e4d35, + 0xe70ea7fc, + 0x54beffff, + 0xfceb0001, + 0xfc4efc8e, + 0xd107f123, + 0xf193c007, + 0x07004f9e, + 0x102c270f, + 0xfff3cabe, + 0xfd93d4f6, + 0x07005610, + 0xf664be0d, + 0x39f393ff, + 0x2007021e, + 0x07da4d27, + 0x0c03e307, + 0x15340514, + 0x033c2530, + 0x0cec0321, + 0x43273f07, + 0x34033101, + 0xe403e105, + 0x3459f4a8, + 0x1d073309, + 0x1e25f093, + 0x0de45d02, + 0xf381bee3, + 0xfdf093ff, + 0x17be021d, + 0xff1efff7, + 0x4ea7fc4e, + 0xb9ffffff, + 0x070e8444, + 0xe6c107d0, + 0x3bf09345, + 0x1d07004f, + 0x3dbe2c07, + 0x0d07fffc, + 0xc9be1c07, + 0x0596fffe, + 0xf1930227, + 0x5e004f42, + 0xfc8eff66, + 0x8ea7f84e, + 0xb9ffffff, + 0x070e8484, + 0x07b10790, + 0x66d307a2, + 0x32f09346, + 0x1907004f, + 0x3a072b07, + 0x01be4d07, + 0xcd07fffc, + 0xc227d214, + 0x1b070907, + 0x3c072a07, + 0xfffe12be, + 0x0e8484b9, + 0x45a6d007, + 0x4f3af093, + 0xbe1d0700, + 0x76fffbdc, + 0x930227d5, + 0x004f42f1, + 0x4127121e, + 0x41234c3b, + 0x45864d8b, + 0xf1930127, + 0x5e004f3d, + 0xa796fefa, + 0x0000df50, + 0x4d072000, + 0x4fd04b0b, + 0x70000001, + 0x93012723, + 0x004f45f1, + 0xdf50e21e, + 0x70000000, + 0x4b0b4d07, + 0x00014f50, + 0x0127f000, + 0x4f5bf193, + 0x07c91e00, + 0x27f88e0d, + 0x595e0c3c, + 0x054027ff, + 0x27fe0b04, + 0x0ef49b40, + 0xfe0b0405, + 0x3f9b0201, + 0xff4ea712, + 0x4401fd4f, + 0x44330027, + 0x43ab48a3, + 0x0127420e, + 0xfa4efe0b, + 0x3f9bc007, + 0xff4ea712, + 0x4d01fd4f, + 0xd433a407, + 0xd3abd8a3, + 0xf4e8031e, + 0x4627cb01, + 0x04beb356, + 0xc4010023, + 0x44963027, + 0xf39bcd05, + 0x38abc50e, + 0xd4cec401, + 0x27fa8ee4, + 0xff4ea730, + 0x43d5feff, + 0xfe0b0138, + 0x07124f9b, + 0x33348724, + 0xf1232b25, + 0x01001421, + 0x103f9bff, + 0x310b4103, + 0x45331487, + 0x001423f5, + 0x412bff01, + 0x4fff3ea7, + 0xf13311fd, + 0x01000044, + 0x2b1207ff, + 0x2023f534, + 0x23ff0100, + 0xfefff41e, + 0xff682e23, + 0x014727fe, + 0x05140313, + 0xa8240323, + 0xa7fe0bf4, + 0xfd4fff4e, + 0xffff3ea7, + 0x914181fe, + 0x2832d144, + 0x3030d101, + 0x33133301, + 0x1b211b43, + 0x3034d504, + 0x2432d501, + 0x2831d501, + 0x2c30d501, + 0x0bfe0b01, + 0x93fe0bfe, + 0x021e9bf4, + 0xfe0b4075, + 0x45334007, + 0x402b0087, + 0x000c41f5, + 0x41f5ff01, + 0x00030e28, + 0x4007fe0b, + 0x00874533, + 0x41f5402b, + 0xff010010, + 0x0e2c41f5, + 0xfe0b0003, + 0x05334087, + 0x0e23042b, + 0x0bfeff68, + 0x27fc4efe, + 0x2c078ccc, + 0xfff31ea7, + 0x25f093fe, + 0x4cbe021d, + 0x2c07fff1, + 0xff671ea7, + 0xa1f093fe, + 0x3cbe021d, + 0xf093fff1, + 0xa7021e24, + 0xfefedb1e, + 0x0e102c27, + 0xf1299efc, + 0x93fe4eff, + 0x021cf3f4, + 0x4ff64419, + 0xf49300a2, + 0x07021cec, + 0x8b2c0324, + 0x2ce33407, + 0x7f3ce37f, + 0x3c033419, + 0xf932c280, + 0x1cd2f393, + 0x27202702, + 0x3205234c, + 0xf4c83403, + 0x1d4ef493, + 0x03240702, + 0x34078b2c, + 0xe37f2ce3, + 0x34197f3c, + 0xc2803c03, + 0x3c27f932, + 0x31f29323, + 0x1027021d, + 0x21054307, + 0x24033123, + 0xf493f4b8, + 0x35021dac, + 0x15430543, + 0x27432543, + 0xadf39320, + 0x4a27021d, + 0x34033205, + 0x3027f4c8, + 0x40272527, + 0x0eb834f5, + 0x34f50003, + 0x00030e28, + 0x0e2c34f5, + 0x34f50003, + 0x00030eb4, + 0x001c3c03, + 0x933127f2, + 0x021c4ff4, + 0xf193431d, + 0x27021cd8, + 0x0ea78c2c, + 0xbefeff67, + 0x93fff06b, + 0x021c3bf1, + 0xa78c2c27, + 0xfefff30e, + 0xfff05abe, + 0x1d42f193, + 0x102c2702, + 0xfedb0ea7, + 0xf049befe, + 0x5efe0eff, + 0x4ea7fe6f, + 0x11fd4fff, + 0xff4ea743, + 0x43d5feff, + 0xfe0b0134, + 0xffff3ea7, + 0xff4ea7fe, + 0x4111fd4f, + 0x013834d1, + 0x013432d1, + 0x422b410b, + 0x013834d5, + 0x4f9bfe0b, + 0x33340712, + 0x2b448735, + 0xff4ea734, + 0x4211fd4f, + 0x002434f1, + 0x422bff01, + 0x002434f5, + 0xfe0bff01, + 0x07124f9b, + 0x87253324, + 0xa7242b44, + 0xfd4fff4e, + 0x23f14411, + 0xff010024, + 0x24f5430b, + 0xff010024, + 0xf293fe0b, + 0xa7021cc8, + 0xfeff673e, + 0x31014727, + 0x21053403, + 0xf4a82403, + 0xffff4ea7, + 0x3844d1fe, + 0xa9f39301, + 0x3495021c, + 0x32014a27, + 0x02053403, + 0xf4a80403, + 0x3ea7fe0b, + 0x9dffffff, + 0x41270d30, + 0x063a34bd, + 0x270f3399, + 0x0ef49b40, + 0x33874127, + 0xb04034f5, + 0xff1eff02, + 0xc007fc4e, + 0x002000be, + 0xc419c339, + 0x43ab1307, + 0x4027c41d, + 0x05e6c43d, + 0xf49b4027, + 0xff3ea70e, + 0x34c5fd4f, + 0x9b402738, + 0x4ea70ef4, + 0x99ffffff, + 0x2ea70e43, + 0x8bfd4fbf, + 0x27313831, + 0x53240541, + 0xd6240331, + 0x4efc8e32, + 0xbec007fc, + 0xa7001fe3, + 0xfd4fff1e, + 0x1301c239, + 0x433b4127, + 0xc43d42ab, + 0xf49b4027, + 0x3814c50e, + 0xfc4efc8e, + 0xc0bec007, + 0x1ea7001f, + 0x19fd4fff, + 0x271201c3, + 0xeb423b41, + 0x27c31d34, + 0x0ef49b40, + 0x8e3814c5, + 0x07fb4efc, + 0xbeb107c0, + 0x19001f71, + 0xab4027c2, + 0x3dc21d2b, + 0x2705e6c4, + 0x0ef49b40, + 0x4fff3ea7, + 0x3834c5fd, + 0xf49b4027, + 0xff4ea70e, + 0x4399ffff, + 0xbf1ea70e, + 0x328bfd4f, + 0x41273138, + 0x31531405, + 0x32d61403, + 0x0499fb8e, + 0x0c03990d, + 0x44c62307, + 0x041e3407, + 0x070e0399, + 0x0b412343, + 0x04449940, + 0x960e0099, + 0x28321b45, + 0x0b030730, + 0x0b030bfe, + 0x27fb4efe, + 0x9dc007b0, + 0xc19d0c0b, + 0x9d21070e, + 0x10270d0b, + 0x93be0403, + 0xcb1dffee, + 0xcb5dcb3d, + 0xcb3dc203, + 0xfc4efb8e, + 0xcc27d007, + 0xbe0d07fb, + 0x4c0071c3, + 0xe84c0700, + 0x8ef31ef4, + 0x07fc4efc, + 0xfbcc27d0, + 0xacbe0d07, + 0x004c0071, + 0xf4e84c07, + 0xfc8ef31e, + 0x15361f6b, + 0x4b05f093, + 0x87fe0b00, + 0x2c40f140, + 0x8600014d, + 0x93143404, + 0x00505bf0, + 0x4187fe0b, + 0x4c23400b, + 0x0b400110, + 0x93fd4efe, + 0x004aeaf0, + 0xfff6dbbe, + 0xdd83dea7, + 0x031d07fd, + 0xfde0001e, + 0x2107d301, + 0xf093d403, + 0x53004af0, + 0xf6bebe12, + 0xa0dfc4ff, + 0xe2ff0222, + 0xf74efd8e, + 0x0af10087, + 0x00014d48, + 0x4d2c0bf1, + 0xc1070001, + 0x4ae2f093, + 0x071a0700, + 0xbe802772, + 0x27fff694, + 0x011c1e90, + 0x039103cd, + 0x01d666c4, + 0xd5f093b2, + 0x1a07004a, + 0x79be3d07, + 0x8d0bfff6, + 0x97ceb403, + 0x071a07e3, + 0xccf09328, + 0xf70e004a, + 0xfff6639e, + 0x2a99fa4e, + 0x07f12308, + 0x863187d2, + 0x2c33f1ac, + 0x8600014d, + 0x93a43434, + 0x004faff3, + 0x4a870a1e, + 0x4c23430b, + 0x99430110, + 0xdc4909de, + 0x4187db69, + 0xfc15fe05, + 0x42f1fb25, + 0x00014d48, + 0x1007dd01, + 0xf0934a07, + 0x35004a9a, + 0xf616befd, + 0x99221eff, + 0x2c690924, + 0x32f1de49, + 0x00014d48, + 0xf3931007, + 0x93004aef, + 0x004ab5f0, + 0xfc15fe05, + 0xfff5f3be, + 0xfa8ef103, + 0xcea7fc4e, + 0x01f7ffff, + 0xe0f093c1, + 0xddbe004a, + 0xc121fff5, + 0x4af3f093, + 0xf5d2be00, + 0x48c1c1ff, + 0x4b05f093, + 0xf5c6be00, + 0x44c1c1ff, + 0x4b17f093, + 0xf5babe00, + 0xffcea7ff, + 0xc181efff, + 0x4b25f093, + 0xf5aabe00, + 0x93c1a1ff, + 0x004b38f0, + 0xfff59fbe, + 0xffffcea7, + 0x93c121eb, + 0x004b46f0, + 0xfff58fbe, + 0x9364c1c1, + 0x004b58f0, + 0xffffcea7, + 0xf57ebee7, + 0x93c101ff, + 0x004b66f0, + 0xfff573be, + 0x9350c1c1, + 0x004b78f0, + 0xfff567be, + 0xf093c121, + 0xbe004b8b, + 0xc1fff55c, + 0xf09354c1, + 0xbe004b9d, + 0xc1fff550, + 0xf09358c1, + 0xbe004baf, + 0xc1fff544, + 0xf0935cc1, + 0xbe004bc1, + 0xa7fff538, + 0xfbffffce, + 0x0628c1d1, + 0x4bcdf093, + 0xf526be00, + 0x30c1d1ff, + 0xe7f09301, + 0x19be004b, + 0xc1d1fff5, + 0xf0930208, + 0xbe004c01, + 0xd1fff50c, + 0x930420c1, + 0x004c1bf0, + 0xfff4ffbe, + 0x0468c1d1, + 0x4c35f093, + 0xffcea700, + 0xedbefeff, + 0xc1d1fff4, + 0xc2d10148, + 0xf0930148, + 0x87004c46, + 0x1c2f0322, + 0xbe00014d, + 0xb9fff4d4, + 0x930140c1, + 0x004c52f0, + 0xfff4c7be, + 0x9309c199, + 0x004c62f0, + 0xfff4bbbe, + 0x0c41c1b9, + 0x4c71f093, + 0xf4aebe00, + 0xbcc1d1ff, + 0x80f0930b, + 0xa1be004c, + 0xc1d1fff4, + 0xf0930bc0, + 0xbe004c8f, + 0xd1fff494, + 0x930bc4c1, + 0x004c9ef0, + 0xfff487be, + 0x0144c1a9, + 0x4cadf093, + 0xf47abe00, + 0x42c1a9ff, + 0xc8f09301, + 0x6dbe004c, + 0x4ea7fff4, + 0xd1fdefff, + 0x930f0041, + 0x004cd9f0, + 0xfff45bbe, + 0x000318be, + 0xa7fd707e, + 0xfd4fff4e, + 0x42114c01, + 0xf0931c07, + 0xbe004cdc, + 0x07fff440, + 0xa710270c, + 0xfef40b2e, + 0x07fdd37e, + 0xa711270c, + 0xfef3ff2e, + 0x07fdc77e, + 0xa713270c, + 0xfef3e72e, + 0x07fdbb7e, + 0xa714270c, + 0xfef3db2e, + 0x07fdaf7e, + 0xa715270c, + 0xfef3cf2e, + 0xa15efc0e, + 0xa7fa4efd, + 0xfd4fffce, + 0x236cc1c1, + 0xb7f093f1, + 0xedbe004c, + 0x9dbefff3, + 0x10070003, + 0x4ccff093, + 0xf3debe00, + 0xffdea7ff, + 0xd199ffff, + 0xe5f09311, + 0xcdbe004c, + 0xcb01fff3, + 0x1b07c211, + 0x4cfdf093, + 0xf3bebe00, + 0x270b07ff, + 0x872ea716, + 0x517efff1, + 0xfb0ea7fd, + 0x0a19ffff, + 0xfffe4ea7, + 0x190103ff, + 0x030b1942, + 0x19010341, + 0x030c1943, + 0x19010341, + 0x1944190e, + 0xf2f093d1, + 0xfe35004c, + 0xfb15fa05, + 0x7dbefc25, + 0xd199fff3, + 0x21f0930f, + 0x71be004d, + 0xd199fff3, + 0x3cf09310, + 0x65be004d, + 0xd2d1fff3, + 0xd3d10638, + 0xd1d1063c, + 0xf0930634, + 0xbe004d4e, + 0xd1fff350, + 0x930620d1, + 0x004d74f0, + 0xfff343be, + 0x0628d1d1, + 0x4d8ef093, + 0xf336be00, + 0x2cd1d1ff, + 0xa8f09306, + 0x29be004d, + 0xd199fff3, + 0xc3f09327, + 0x1dbe004d, + 0xd199fff3, + 0xdef09326, + 0x11be004d, + 0xd1d1fff3, + 0xf0930b74, + 0xbe004df8, + 0xa9fff304, + 0x930102d1, + 0x004e12f0, + 0xbe0f1c83, + 0xb9fff2f4, + 0x930108d1, + 0x004e29f0, + 0xfff2e7be, + 0x0109d1b9, + 0x4e43f093, + 0xf2dabe00, + 0x0ad1a9ff, + 0x5df09301, + 0xcdbe004e, + 0xf093fff2, + 0xbe004e7b, + 0x99fff2c4, + 0xf0930cd1, + 0xbe004e80, + 0x99fff2b8, + 0xf0932ad1, + 0xbe004e9b, + 0x99fff2ac, + 0xf09312d1, + 0xbe004eb6, + 0x99fff2a0, + 0xf09344d1, + 0xbe004ed1, + 0xc1fff294, + 0xf0933cd1, + 0xbe004eec, + 0xc1fff288, + 0xf09340d1, + 0xbe004f07, + 0xd1fff27c, + 0x930624d1, + 0x004f21f0, + 0xfff26fbe, + 0x4f3ff093, + 0xf266be00, + 0x430ea7ff, + 0xd3befffb, + 0x1007fffa, + 0x4f3ff093, + 0xf252be00, + 0xf30ea7ff, + 0xbfbefffa, + 0x1007fffa, + 0x4f5af093, + 0xf23ebe00, + 0xff4ea7ff, + 0x4c99feff, + 0x78f09309, + 0xc383004f, + 0x4c87bc07, + 0xb42bb433, + 0x0050b1f9, + 0xbe23ff00, + 0xbeffffb8, + 0x03fff218, + 0x93b139b4, + 0x004f7ef0, + 0xfff20bbe, + 0xf093b159, + 0xbe004f9b, + 0x03fff200, + 0x334c87c1, + 0xf1c42bc4, + 0x000048c1, + 0xacf093ff, + 0xe9be004f, + 0xf093fff1, + 0xbe004fcb, + 0xb9fff1e0, + 0xb90b98d1, + 0xb90b9ad2, + 0x930b9bd3, + 0x004fcef0, + 0xfff1cbbe, + 0xa910ba39, + 0xf093a827, + 0xbe004fee, + 0xb9fff1bc, + 0xb90b9ad4, + 0x2b0b9bd3, + 0x07461e43, + 0xebf0931c, + 0x1c83004f, + 0xf1a2be0f, + 0x98d4b9ff, + 0xe7f0930b, + 0x1127004f, + 0x10274c0e, + 0xfff18fbe, + 0x131eb027, + 0x0b88b4f9, + 0x2127ff00, + 0x4c0eb103, + 0x79be2027, + 0x1b07fff1, + 0x4fcbf093, + 0xe5bace00, + 0x41034c07, + 0xd4b9c407, + 0xcf6b0b9a, + 0x27b1c4ce, + 0xf90d1ec0, + 0x000b88c2, + 0xbec103ff, + 0x07fff150, + 0xaff0931c, + 0xcace004f, + 0x8ef103eb, + 0xe3f64efa, + 0x65f093f4, + 0x35be0053, + 0x7127fff1, + 0x4d87d027, + 0x100044f1, + 0x3787ff02, + 0x34f1f495, + 0xff021000, + 0xf491f4a5, + 0xa7e04c3c, + 0x070b1e40, + 0xf144334d, + 0x02180c44, + 0xa1f4b5ff, + 0xe04c3cf4, + 0x0b1e40a7, + 0x44334707, + 0x180c44f1, + 0xf4c5ff02, + 0x38dc3030, + 0x091e4027, + 0x44f14d87, + 0xff021600, + 0x3034f4c5, + 0x4027387c, + 0x4787091e, + 0x160044f1, + 0xf4c5ff02, + 0xc5402738, + 0xf4c53cf4, + 0x44f4c540, + 0x9148f4c5, + 0xb1f3a1f2, + 0x004f38f4, + 0xa7200000, + 0x070b1e10, + 0xf144334d, + 0x02180441, + 0x30f4c1ff, + 0x00004f38, + 0x60a72000, + 0x47070b1e, + 0x46f14433, + 0xff021804, + 0x073cfec1, + 0x40fcc141, + 0xfbc11d07, + 0x48fac144, + 0xc134f9c1, + 0xfd5538f8, + 0xd2031153, + 0x52e9f093, + 0x05f77500, + 0x25fe15f6, + 0x45fb35fc, + 0x85f965fa, + 0xbe7203f8, + 0xe4fff058, + 0xff2450dc, + 0xf68ef4c3, + 0x04d10f27, + 0xfe0b2c43, + 0x42d00401, + 0xb0130113, + 0x4944c032, + 0x42a43420, + 0x113c32c0, + 0x2745c614, + 0x0b010711, + 0x113284fe, + 0xa742c604, + 0x0b010710, + 0x110311fe, + 0x06344e14, + 0x1e10a731, + 0x210221f1, + 0xf442da14, + 0x0431247a, + 0x04ca1031, + 0xd60442eb, + 0x10a7ce3f, + 0x1027d81e, + 0xfe0b0107, + 0x11c934c4, + 0x2b041111, + 0x4ebb1e14, + 0xd00301fb, + 0x14012f32, + 0xe02842d0, + 0xc000fb34, + 0x42c42144, + 0x1d32c422, + 0x04112305, + 0x04212415, + 0x04312425, + 0x03112435, + 0x02071411, + 0x2415438b, + 0x0107fb8e, + 0x32c0fb8e, + 0x210c21fa, + 0x2bec0714, + 0x310b31e4, + 0xc8de0713, + 0xecc867e0, + 0x4cfa4c20, + 0xc407008c, + 0x0011b027, + 0x04ce1411, + 0x2b0f6674, + 0x7e30c83b, + 0x24154027, + 0x23352c25, + 0x41072131, + 0x4fd44123, + 0x3fffffff, + 0x47232116, + 0x07312311, + 0x25213541, + 0xd0412323, + 0xffffff4f, + 0x4327ee3f, + 0x10c82405, + 0x8e020728, + 0x52d1c8fb, + 0x4e3b4127, + 0x438b4123, + 0x4486d027, + 0x3e5bd127, + 0xa71e3dab, + 0xeccce013, + 0xe21e9920, + 0xa61e3b1b, + 0x31072421, + 0x11833153, + 0x410313ab, + 0x21350207, + 0xfb8e2425, + 0x130b1b07, + 0x2c252015, + 0xb31e2135, + 0x775e3027, + 0x273013ff, + 0x25241541, + 0x1e23352c, + 0x67dfe680, + 0x3b4127ff, + 0x8b41234e, + 0x27ce0b4b, + 0x274486d0, + 0xabbe5bd1, + 0xff505ebd, + 0xff2a44e4, + 0x04111311, + 0xff2234ee, + 0x5192f093, + 0x01fb8e00, + 0x07300700, + 0x173c5340, + 0x071f4c53, + 0x6b141520, + 0xff2e833f, + 0x39d67fff, + 0x432728c6, + 0x057d3ca7, + 0x25420714, + 0x74473313, + 0x0000004f, + 0x23444740, + 0x004fd031, + 0xf6400000, + 0x14351325, + 0x4227fe0b, + 0xfe0b1405, + 0x16ff3cc0, + 0x3c232733, + 0x002fa37f, + 0x27400000, + 0x25123543, + 0x0b140513, + 0x272516fe, + 0x0b140544, + 0x000e83fe, + 0x05461000, + 0x14054127, + 0xfe0b1235, + 0xf91e1005, + 0xf163f54e, + 0xf0051f07, + 0x0f071403, + 0x41ff7a7e, + 0x074027f3, + 0x11225323, + 0x2142abf0, + 0x33f231f1, + 0x79be1e3c, + 0x5107000c, + 0xf58ef143, + 0xf2a3fb4e, + 0xb803bf07, + 0xf115f005, + 0x1b070f07, + 0x07ff4a7e, + 0x18cc03cf, + 0x04030f07, + 0x3c7e1c07, + 0x070b07ff, + 0xfdba7e1c, + 0xfb8ef283, + 0x03310401, + 0x42d00211, + 0x5744c064, + 0x35f64200, + 0x00274027, + 0x2c3304ab, + 0x0b02ab1f, + 0xc80021fe, + 0xffff820f, + 0x0ccc5bff, + 0x43073980, + 0x037f4c83, + 0x4cc07f0c, + 0x3c031e40, + 0x2130c83f, + 0x47534307, + 0x4e830f6b, + 0x337fffff, + 0x04ab170c, + 0xab1f2c33, + 0xd8fe0b02, + 0x03e3803c, + 0xde1e403c, + 0x01033153, + 0x4027db1e, + 0x00000f27, + 0xa91e7f80, + 0x4ea34307, + 0x83100000, + 0x7fffff4e, + 0x00000f27, + 0x951e7f80, + 0xff820f13, + 0x0cccffff, + 0x4127531a, + 0x4123403b, + 0x1027438b, + 0x11274486, + 0x0307305b, + 0x400701ab, + 0xc07f4c83, + 0x073c404c, + 0x3f4c0340, + 0x37533407, + 0x4fd00127, + 0x40000000, + 0x83430720, + 0x7fffff4e, + 0x5e170c33, + 0x4007ff50, + 0x07404c03, + 0x27375334, + 0x004fd401, + 0xe2400000, + 0xde1e0027, + 0x30270027, + 0x0cdcd81e, + 0x3007e180, + 0x41273753, + 0x00000f14, + 0x40274000, + 0xc21e0407, + 0xf123fe4e, + 0x0f07f005, + 0xf225f115, + 0xf97ef335, + 0x8ef103fe, + 0x63fd4efe, + 0x03df07f1, + 0x07f005d4, + 0x7e0f071d, + 0xf421fe13, + 0x44963027, + 0x0d073127, + 0xd57ef325, + 0x8ef143fe, + 0xa3fc4efd, + 0x03cf07f2, + 0x15f005c8, + 0x070f07f1, + 0xfded7e1c, + 0xdc03df07, + 0x030f0718, + 0x7e1d0704, + 0xf221fddf, + 0x611622d0, + 0x8112f0f1, + 0x71f43100, + 0x3543cbf3, + 0xc42400f4, + 0x126e1822, + 0x917e0c07, + 0x8ef283fe, + 0x45f093fc, + 0x857e004f, + 0x8ef283fe, + 0x5d14c0fc, + 0x413912c0, + 0x51f481f2, + 0x91242bf3, + 0x42f245f1, + 0x45212313, + 0x273347f2, + 0x0000002f, + 0x27002740, + 0x312a1f4c, + 0x312b02ab, + 0x33472153, + 0x4007f498, + 0xc07f4c83, + 0x5512404c, + 0x27ae1ef0, + 0x250c0744, + 0xfe3a7ef4, + 0xfc8ef283, + 0xec800cdc, + 0x0c033166, + 0x7f0ce340, + 0x911ef055, + 0x8f1e0d07, + 0x0c074027, + 0xf455f445, + 0xfc4e851e, + 0xcf07f3a3, + 0xf005c803, + 0x0f07f115, + 0x347e1c07, + 0x03df07fd, + 0x0f0718dc, + 0x1d070403, + 0x21fd267e, + 0x614290f4, + 0x2432d0f3, + 0x00dc44e0, + 0x00cc34e0, + 0x311642c4, + 0x27f471f3, + 0x27340e20, + 0x350c0721, + 0xfdd27ef2, + 0xfc8ef383, + 0x311632c4, + 0x27f471f3, + 0x27340e20, + 0x750d0721, + 0xfdba7ef2, + 0xfc8ef383, + 0xf091f251, + 0x10273027, + 0x00129fbe, + 0xf441f381, + 0x430bd107, + 0x30274203, + 0xb530f4c5, + 0x31f471f3, + 0x2e2107f3, + 0xb5412734, + 0xcc3d07f4, + 0xf4c11a20, + 0x03215330, + 0x53313841, + 0x000fa301, + 0x07800000, + 0xee20c832, + 0xd430f4c5, + 0x0000002f, + 0xf4c12340, + 0x47091e30, + 0x002fb400, + 0x47400000, + 0xcc412322, + 0x21a3f200, + 0x2fd00047, + 0x40000000, + 0x30f4c5ef, + 0x4c834207, + 0x404cc07f, + 0x270f0714, + 0x280c0343, + 0xa534f2c5, + 0xfd2e7ef4, + 0xfc8ef383, + 0xea802cdc, + 0x2c030126, + 0x7f2ce340, + 0x42e4e01e, + 0xf093ff4f, + 0x5e004dd0, + 0x32e4ff3d, + 0xf093ff2b, + 0x5e004dc4, + 0xfb4eff31, + 0xbf07f3a3, + 0xf005b803, + 0x0f07f115, + 0x207e1b07, + 0x03cf07fc, + 0x0f0718cc, + 0x1c070403, + 0x71fc127e, + 0xc32f07f4, + 0x031c0741, + 0x0b07282c, + 0xe47ef475, + 0xfcce7efa, + 0xfb8ef383, + 0xf3a3fb4e, + 0xb803bf07, + 0xf115f005, + 0x1b070f07, + 0x07fbe67e, + 0x18cc03cf, + 0x04030f07, + 0xd87e1c07, + 0x072f07fb, + 0x282c031c, + 0xb07e0b07, + 0xfc9a7efa, + 0xfb8ef383, + 0xf123fc4e, + 0xf4054327, + 0x0008c127, + 0x0636c027, + 0xf4054227, + 0xfc150f07, + 0x03fc7b7e, + 0x76fc8ef1, + 0x27d007c8, + 0x0d071e4c, + 0xfd35f425, + 0x0011b3be, + 0x01c80123, + 0x1e4c27e0, + 0x402bd03b, + 0xf425fd35, + 0x0f40d31e, + 0x80000000, + 0xd013d007, + 0x0f27d61e, + 0xcf000000, + 0xfc4ec61e, + 0xcf07f2a3, + 0xf005c803, + 0x0f07f115, + 0x5c7e1c07, + 0x03df07fb, + 0x0f0718dc, + 0x1d070403, + 0x21fb4e7e, + 0x1042d0f4, + 0x4290f461, + 0x1d070c07, + 0x83f9c37e, + 0x27fc8ef2, + 0x4ef91e01, + 0x07f163fe, + 0x03f0051f, + 0x7e0f0714, + 0xf411fb27, + 0x00274244, + 0xfe8ef143, + 0x40f842d0, + 0xc8f43144, + 0x4c88f140, + 0xc6f4211f, + 0x000f2747, + 0x43800000, + 0x41fe8ef1, + 0x13f321f0, + 0x045b1e4c, + 0x13d63fc6, + 0x8ef14300, + 0xff0f27fe, + 0x437fffff, + 0x4efe8ef1, + 0x15f2a3fe, + 0x051f07f1, + 0x071803f0, + 0xfad57e0f, + 0x1f070f07, + 0x1c030403, + 0xfac97e18, + 0x4290f421, + 0x0027f461, + 0xf2834230, + 0x0127fe8e, + 0xfe8ef283, + 0xf2a3fc4e, + 0xc803cf07, + 0xf115f005, + 0x1c070f07, + 0x07faa27e, + 0x18dc03df, + 0x04030f07, + 0x947e1d07, + 0xd0f421fa, + 0xf4611042, + 0x0c074290, + 0x097e1d07, + 0x8ef283f9, + 0x1e0127fc, + 0xa3fc4ef9, + 0x03cf07f2, + 0x15f005c8, + 0x070f07f1, + 0xfa697e1c, + 0xdc03df07, + 0x030f0718, + 0x7e1d0704, + 0xf421fa5b, + 0x611042d0, + 0x074290f4, + 0x7e1d070c, + 0xf283f8d0, + 0x0127fc8e, + 0xfc4ef91e, + 0xcf07f2a3, + 0xf005c803, + 0x0f07f115, + 0x307e1c07, + 0x03df07fa, + 0x0f0718dc, + 0x1d070403, + 0x21fa227e, + 0x1042d0f4, + 0x4290f461, + 0x1d070c07, + 0x83f8977e, + 0xa7fc8ef2, + 0x4ef91e00, + 0x07f2a3fc, + 0x05c803cf, + 0x07f115f0, + 0x7e1c070f, + 0xdf07f9f7, + 0x0718dc03, + 0x0704030f, + 0xf9e97e1d, + 0x42d0f421, + 0x90f46110, + 0x070c0742, + 0xf85e7e1d, + 0xfc8ef283, + 0xf91e00a7, + 0xf2a3fc4e, + 0xc803cf07, + 0xf115f005, + 0x1c070f07, + 0x07f9be7e, + 0x18dc03df, + 0x04030f07, + 0xb07e1d07, + 0xd0f421f9, + 0xf4611042, + 0x0c074290, + 0x257e1d07, + 0x8ef283f8, + 0x1e0127fc, + 0x23fd4ef9, + 0x76d007f1, + 0x05422706, + 0x270f07f4, + 0x7ef41540, + 0xf103fa54, + 0x4327fd8e, + 0x051e3c27, + 0x35f325f4, + 0x0f8ebef0, + 0xc8012300, + 0x0fc61c00, + 0x1e4c27dd, + 0xd03b402b, + 0x0f07f425, + 0xfd354027, + 0x257ef415, + 0x8ef103fa, + 0x132007fd, + 0x3b412720, + 0x8b412342, + 0x3630274d, + 0x27d25b46, + 0x3dab1e4c, + 0xf335402b, + 0xa61ef425, + 0xee1e3127, + 0x0401fd4e, + 0x011342d0, + 0xc032b013, + 0x34205d44, + 0x32c042a4, + 0xc6141148, + 0x07112745, + 0x84fd8e01, + 0xc6041132, + 0x0710a742, + 0x11fd8e01, + 0x4e141103, + 0xa7310634, + 0x21f11e10, + 0xda142102, + 0x24daf442, + 0x410d3115, + 0x4110310e, + 0xe61eca11, + 0x2a141ece, + 0x42e16ee1, + 0xc23fd60d, + 0xcc1e10a7, + 0x01071027, + 0xd0c2fd8e, + 0xcc3fd6eb, + 0x34c4b01e, + 0x111111b5, + 0x1e142b04, + 0xa3f54ea7, + 0x275027f1, + 0x35030160, + 0x07f645f5, + 0x077107c0, + 0x278027b2, + 0x2f32d090, + 0x42f01401, + 0x34e0017d, + 0x44e0024b, + 0x42c40175, + 0x1b32c424, + 0x40073207, + 0x41012527, + 0x31054403, + 0xf2a83403, + 0x7411c311, + 0x438bcb07, + 0x0c07b415, + 0xf58ef183, + 0x014b32e0, + 0x14210e21, + 0x0341fe25, + 0xae070231, + 0xf205f315, + 0x1d31a42b, + 0x3a071e41, + 0x00dfa0e8, + 0x4c40accc, + 0x017c31e8, + 0x3c233a07, + 0x27f35520, + 0xe8602750, + 0x2701dc30, + 0x3b140741, + 0x07212713, + 0xa70a3b02, + 0x0b40a730, + 0x8b414b30, + 0xab4e8b3d, + 0x2734c634, + 0x51602751, + 0xa440e8f4, + 0x5b8e0701, + 0x5b9e0784, + 0x07d5079a, + 0xabd8abe6, + 0x21111ee9, + 0x0643faf3, + 0x27102701, + 0x05f42520, + 0x11f215f1, + 0xee7411c0, + 0xe600db04, + 0x0100cc0f, + 0x07f411f3, + 0x2b2e071d, + 0xe8246b13, + 0x2700f220, + 0x21b41540, + 0x25b135f4, + 0x31b245b4, + 0xa7bd41bc, + 0x0b40a730, + 0xd44d4b3c, + 0x0000004f, + 0x4fe03110, + 0x0fffffff, + 0xb12100c0, + 0x4c534c07, + 0xab3d471f, + 0x452c4734, + 0x31b235b3, + 0x23bd41bc, + 0xa730a711, + 0x0bb12540, + 0xd04d4b3c, + 0x0000004f, + 0x43271e10, + 0xdfd4b405, + 0x20000000, + 0x07cb072c, + 0x8ef1830c, + 0xeca013f5, + 0xff6d40ac, + 0xc4ff1f5e, + 0xffffff4f, + 0x3fd0b70f, + 0xffffffff, + 0x054327b0, + 0x00dfd0b4, + 0xd6200000, + 0x0d073c07, + 0x271f0c33, + 0x07315320, + 0x07be214d, + 0x5330ab1c, + 0xab020741, + 0x07118304, + 0xabe103cb, + 0x83b04513, + 0x350c07f1, + 0x8ebe25b1, + 0x07c707f5, + 0x8ef1830c, + 0x11f101f5, + 0x6b1d2bf2, + 0xff395e2e, + 0xf211f101, + 0x1d0bb015, + 0xd2072e4b, + 0xc107f221, + 0xbc35b225, + 0x735ebd45, + 0x27d027ff, + 0xff015ee0, + 0xffff3ff4, + 0xff64ffff, + 0x21ff395e, + 0x273027fd, + 0x6b312b40, + 0x15212742, + 0x35bd25b2, + 0x5eb445b3, + 0x3fe6ff07, + 0xf321fedb, + 0x2c232a07, + 0x553a0b20, + 0x27f325f2, + 0xe8102700, + 0x27009120, + 0x3b640741, + 0x07212762, + 0x015a3b52, + 0xa730a7f2, + 0x4b350b40, + 0x11328b46, + 0xab428bf2, + 0x2734c634, + 0x51102701, + 0x5030c8f3, + 0x435bf411, + 0xf311f435, + 0x3a5bf431, + 0x40ab2307, + 0xf34521ab, + 0xf215f405, + 0x27fe825e, + 0x4a2b204c, + 0x8d071e07, + 0x8a5b143b, + 0x525e81ab, + 0x203c27fe, + 0x3a2b4127, + 0x135b1407, + 0xe4fe205e, + 0x11fdd944, + 0xee041113, + 0x93fdd134, + 0x0047d7fc, + 0x27fdc95e, + 0xf211204c, + 0x4a2bf301, + 0x3a5b243b, + 0x23074207, + 0xf23524ab, + 0x3c27a11e, + 0x2b412720, + 0x5b64073a, + 0xff6b5e63, + 0x0a11f84e, + 0xba070901, + 0xbc533a07, + 0x143c531f, + 0x0307b183, + 0x1b15ea07, + 0x07ff0d83, + 0x8107c027, + 0xee83d907, + 0x160fffff, + 0xab49070e, + 0x2745164e, + 0x8e140542, + 0xa74327f8, + 0x0503fd3d, + 0x07132514, + 0x531e0749, + 0x1833184c, + 0x14ab0907, + 0x1fd40833, + 0x10000000, + 0x07e3071d, + 0x53414720, + 0x42ab1f2c, + 0x03073047, + 0xe1231407, + 0x00004fd0, + 0x25e91000, + 0x4580358e, + 0xc0f88e81, + 0x2807ff0d, + 0x4e072907, + 0x33182c53, + 0x0742ab48, + 0x002fa324, + 0x07100000, + 0x23383339, + 0x4503ff0d, + 0x25232712, + 0x35120510, + 0x07f88e13, + 0x164eab49, + 0x05442745, + 0x07f88e14, + 0x8330274e, + 0x0800004e, + 0x358634ab, + 0x14054127, + 0x8e458d35, + 0x1305f88e, + 0xf54ef71e, + 0x5107f1e3, + 0x40071f07, + 0x0f071803, + 0xf515f405, + 0x51ff237e, + 0x07f461f3, + 0xff1f8313, + 0x273fffff, + 0x53048720, + 0x12ab1e3c, + 0x148630ab, + 0xf02131a3, + 0xf241f131, + 0xfff6d7be, + 0xf58ef1c3, + 0xf3a3f54e, + 0xac03af07, + 0x07c10710, + 0x071a07b0, + 0x25f3350f, + 0x155307f2, + 0x07fb05fc, + 0xfeda7ecf, + 0x0724cc03, + 0x0708030f, + 0xfece7e1c, + 0x1c070a07, + 0x83fbab7e, + 0x4ef58ef3, + 0x270401f6, + 0x31a02790, + 0x110e410d, + 0xc942f008, + 0xba44e000, + 0x07424000, + 0xf64eab4d, + 0x27002747, + 0x83380710, + 0x33430731, + 0x30271f4c, + 0xc107b007, + 0xc4abb3ab, + 0x1c070b07, + 0x0021f68e, + 0xfc020fe8, + 0x00b1ffff, + 0x04000dec, + 0x3d070085, + 0x40273f6b, + 0x03ff0d03, + 0x56803cc0, + 0x277f3c27, + 0x4bd30b40, + 0x00efd0e4, + 0x16200000, + 0x3d072e07, + 0x2c334e07, + 0xab31531f, + 0x07415332, + 0x03e407d3, + 0x07200701, + 0x070d074e, + 0xff2d831e, + 0x07185307, + 0x184c3332, + 0x04ab0853, + 0x3c33e107, + 0x07202714, + 0xffee83d0, + 0x02070fff, + 0x0dab1307, + 0x765e1eab, + 0xa94fd6ff, + 0x3d833d07, + 0x34ab0100, + 0x27a73fc6, + 0x4027803c, + 0xe44bd30b, + 0x0000efd0, + 0x1eb32000, + 0x2700279c, + 0xf000001f, + 0xff4b5e7f, + 0x4ea34e07, + 0x07080000, + 0xffee83e4, + 0x1e070fff, + 0x1fa30d07, + 0x7ff00000, + 0x13ff305e, + 0xfffc020f, + 0x390cecff, + 0x100700ba, + 0x27201c23, + 0xe8702760, + 0x2700b510, + 0x3bc40741, + 0x072127c1, + 0xa7b03bb2, + 0x0b40a730, + 0x8b4c4b3b, + 0xab4e8b3d, + 0x2734c634, + 0xe8702761, + 0x07009f10, + 0x07915b9e, + 0x07d9abd6, + 0x5b3d07ae, + 0x6be707a0, + 0x27eaab3f, + 0x803cc040, + 0x7f3c2744, + 0x3d0b4027, + 0x24074e4b, + 0x27182c33, + 0x004f14c1, + 0x27100000, + 0x530307c0, + 0xab140708, + 0x07185302, + 0xff3d833c, + 0x07430707, + 0x144c33e1, + 0xd0073027, + 0xffffee83, + 0x0703070f, + 0xab0dab14, + 0xfe975e1e, + 0x07bb4fd6, + 0x003d833d, + 0xab402701, + 0x073cb634, + 0x184c334e, + 0xef14c127, + 0x10000000, + 0x0d07c027, + 0x1e070853, + 0x185304ab, + 0xc027b61e, + 0x10270027, + 0x3c27ae1e, + 0x2b412720, + 0x5bc40730, + 0xff475ec3, + 0x2b204c27, + 0x073e0740, + 0x5b343b9d, + 0x5e93ab90, + 0x3c27ff57, + 0xff6a5e80, + 0xf163f54e, + 0x0f07f005, + 0xf225f115, + 0xf445f335, + 0x07fe0a7e, + 0x8ef14351, + 0xe3f54ef5, + 0x03df07f1, + 0x074007d8, + 0x070f0751, + 0x15f4051d, + 0xfcae7ef5, + 0x3027f431, + 0x31274496, + 0xf3350d07, + 0x07fdde7e, + 0x8ef1c351, + 0xe3f54ef5, + 0x07c107f3, + 0x03b0071f, + 0x0f07101c, + 0xf335f225, + 0xfb05fc15, + 0x07fc7f7e, + 0x24dc03df, + 0x08030f07, + 0x717e1d07, + 0xd0f241fc, + 0xf1911622, + 0x010912f0, + 0xf3a1f451, + 0xf45543cb, + 0x22c42400, + 0x0712ae1f, + 0x100c030f, + 0x07fd8e7e, + 0x8ef3c351, + 0xf1f093f5, + 0x807e0043, + 0xc35107fd, + 0xe0f58ef3, + 0xc000df14, + 0xf1617f12, + 0xfc81f4b1, + 0xf8c1142b, + 0x71f16534, + 0x30f7c1fb, + 0x0084c8ea, + 0x277d8cce, + 0x90273d4c, + 0x0000af27, + 0x50271000, + 0xf4c56027, + 0x07d50738, + 0xab4a07e6, + 0x33eaabd9, + 0xc88a1f4c, + 0x07548cce, + 0x2b6e075d, + 0x07c86bb7, + 0xab215329, + 0x534b0724, + 0x1c471f4c, + 0xf4c114ab, + 0x233a0738, + 0x47315341, + 0x38f4c50b, + 0xa3079207, + 0xc107b007, + 0x07bf4fd6, + 0x273f6b35, + 0x803cc040, + 0x85f57538, + 0xff615ef6, + 0x44270f07, + 0x45100c03, + 0xfce97ef4, + 0xf3c35107, + 0xb7caf58e, + 0xc2a91eb3, + 0x2b07827b, + 0x2c534c47, + 0x4742ab1f, + 0x0711233b, + 0x65c407b3, + 0xff6d5ef1, + 0x07c74fd6, + 0x003d8335, + 0xd634ab01, + 0x4007bc3f, + 0x4fc641ab, + 0x803c27b5, + 0x350b4027, + 0x5307464b, + 0x07ff5ce3, + 0x07a31e64, + 0xff0a5e0d, + 0x30270f07, + 0x20274027, + 0x75100c03, + 0x65f485f3, + 0xfef65ef2, + 0xf5e3f54e, + 0xac03af07, + 0x07b00710, + 0x070f07c1, + 0x25f3351a, + 0x05fc15f2, + 0xfb2a7efb, + 0xdc03df07, + 0x030f0724, + 0x7e1d0708, + 0xf441fb1c, + 0xf3914290, + 0xe02632d0, + 0xe001f344, + 0xc401e334, + 0xf3511842, + 0x2027f4a1, + 0x2127340e, + 0xf2550a07, + 0x07fc367e, + 0x8ef5c351, + 0x1832c4f5, + 0xf4a1f351, + 0x340e2027, + 0x0d072127, + 0x1c7ef2a5, + 0xc35107fc, + 0xc1f58ef5, + 0xf77130fb, + 0x6027a027, + 0xfcc12b07, + 0x07360734, + 0xbe07071a, + 0x07000694, + 0x0730275b, + 0x4cfbc5bc, + 0xc550f3c5, + 0xf1c554f0, + 0x4cf0c158, + 0x0750f1c1, + 0x07f8813a, + 0x0672be27, + 0x07c02700, + 0x07a10790, + 0x07360725, + 0xbe1c0708, + 0x07000660, + 0x0be107d0, + 0x07ea4bd9, + 0xfdeaeab8, + 0xf5aeee00, + 0xc1102700, + 0xf4c154f3, + 0x07910758, + 0x4b930bad, + 0x277027a4, + 0xf9a4ea80, + 0x58f4c100, + 0x012c4aee, + 0xc150f3c1, + 0x0b074cf2, + 0xbe071c07, + 0x00061fbe, + 0xf461f3b1, + 0x430bc027, + 0x30274403, + 0xc540f4c5, + 0xf4a13cf3, + 0xb00bf351, + 0xb70bc14b, + 0x342ec84b, + 0xf4c54127, + 0x00cfd03c, + 0x3f200000, + 0x0740fec1, + 0x331b074c, + 0x11531f4c, + 0x0a072c07, + 0x215314ab, + 0x031f0c33, + 0x15b1d8e1, + 0x4a073907, + 0x41533153, + 0xa40730ab, + 0xafa39307, + 0x80000000, + 0xc207b107, + 0x00002fd4, + 0xc5c92000, + 0xcfd440fe, + 0x10000000, + 0x40fec131, + 0x4c534907, + 0x472b071f, + 0x5314ab1a, + 0x4c471f2c, + 0x3b4742ab, + 0xb3070947, + 0xe123c407, + 0x0759a0c8, + 0xd0a10790, + 0x000000cf, + 0xfec5d710, + 0x6b3b0740, + 0xc040273f, + 0x0749803c, + 0x0343270f, + 0xfbc5380c, + 0x48fcc544, + 0x7e38f4c5, + 0x5107facb, + 0xf58ef5c3, + 0xff0b9de2, + 0xf3c11027, + 0x58f4c154, + 0xad079107, + 0xa44b930b, + 0x81277027, + 0xff0b4ae2, + 0x40273127, + 0x844b730b, + 0xa3ff075e, + 0x07b30731, + 0xd6a11ec4, + 0x3b07b64f, + 0x01003d83, + 0x3fd634ab, + 0xab4907ab, + 0xa44fc64a, + 0x27803c27, + 0x4b3b0b40, + 0xe3b3074c, + 0xc407ffbc, + 0x39e2921e, + 0xc11efed4, + 0xfe3a42e4, + 0x40cef093, + 0xfe265e00, + 0xfe1432e4, + 0x40c2f093, + 0xfe1a5e00, + 0xf4e3f54e, + 0xac03af07, + 0x07c10710, + 0x071a07b0, + 0x25f3350f, + 0x05fc15f2, + 0x7ecf07fb, + 0xcc03f8f4, + 0x030f0724, + 0x7e1c0708, + 0xf4a1f8e8, + 0x41c32f07, + 0x2c031c07, + 0xa50a0738, + 0xf62f7ef4, + 0x07fa127e, + 0x8ef4c351, + 0xe3f54ef5, + 0x03af07f4, + 0xc10710ac, + 0x1a07b007, + 0xf3350f07, + 0xfc15f225, + 0xcf07fb05, + 0x03f8af7e, + 0x0f0724cc, + 0x1c070803, + 0x07f8a37e, + 0x031c072f, + 0x0a07382c, + 0x7ef5f07e, + 0x5107f9d3, + 0xf58ef4c3, + 0xf163fb4e, + 0xf4054327, + 0x0008b127, + 0x0736b027, + 0xf4054227, + 0xfb150f07, + 0x07f9b27e, + 0x07410730, + 0x43140703, + 0x36fb8ef1, + 0x074007bb, + 0x07d02704, + 0x3c4c27c4, + 0xf035f425, + 0x7dbefd45, + 0x10070004, + 0xc81d1c03, + 0x0323cf11, + 0x072300c8, + 0x45403b4c, + 0x274c07f4, + 0x413b3c3c, + 0xf435312b, + 0xb51ef325, + 0x00000fc0, + 0x071a8000, + 0x1e401340, + 0x204c27bf, + 0x2c07412b, + 0x245b3d07, + 0x32ab313b, + 0xd21ef345, + 0x4f273027, + 0xc1e00000, + 0xf54e961e, + 0xdf07f3a3, + 0x0710dc03, + 0x07510740, + 0x051d070f, + 0x35c307f4, + 0x15f225f3, + 0x7ebf07f5, + 0xbc03f7e4, + 0x030f0724, + 0x7e1b0708, + 0xf441f7d8, + 0x911042d0, + 0x074290f4, + 0x7e1b070d, + 0xf383f4ac, + 0x0127f58e, + 0xf54ef91e, + 0x5107f1e3, + 0x40071f07, + 0x0f071803, + 0xf515f405, + 0x21f7ab7e, + 0x274244f4, + 0x8ef1c300, + 0xf842d0f5, + 0xf4414440, + 0x88f140c8, + 0xf4311f4c, + 0x0f274946, + 0x80000000, + 0xf58ef1c3, + 0x2b3cec27, + 0x234e07e4, + 0x40c8204c, + 0x07f2611c, + 0x31045b02, + 0xca4fc6f4, + 0xf1c30013, + 0x0f27f58e, + 0x7fffffff, + 0xf58ef1c3, + 0x4c27f261, + 0x074e2b20, + 0x07343b32, + 0x07f35143, + 0xab0e5b03, + 0x4ed51e04, + 0x07f3a3f5, + 0x071f0751, + 0x101c0340, + 0xf4050f07, + 0xc307b207, + 0xf225f335, + 0x297ef515, + 0x070f07f7, + 0x0308031f, + 0x1d7e241c, + 0x90f441f7, + 0x27f49142, + 0x83423000, + 0x27f58ef3, + 0x8ef38301, + 0xa3f54ef5, + 0x03df07f3, + 0x400710dc, + 0x0f075107, + 0xf4051d07, + 0xf335c307, + 0xf515f225, + 0xe97ebf07, + 0x24bc03f6, + 0x08030f07, + 0xdd7e1b07, + 0xd0f441f6, + 0xf4911042, + 0x0d074290, + 0xb17e1b07, + 0x8ef383f3, + 0x1e0127f5, + 0xa3f54ef9, + 0x03df07f3, + 0x400710dc, + 0x0f075107, + 0xf4051d07, + 0xf335c307, + 0xf515f225, + 0xa57ebf07, + 0x24bc03f6, + 0x08030f07, + 0x997e1b07, + 0xd0f441f6, + 0xf4911042, + 0x0d074290, + 0x6d7e1b07, + 0x8ef383f3, + 0x1e0127f5, + 0xa3f54ef9, + 0x03df07f3, + 0x400710dc, + 0x0f075107, + 0xf4051d07, + 0xf335c307, + 0xf515f225, + 0x617ebf07, + 0x24bc03f6, + 0x08030f07, + 0x557e1b07, + 0xd0f441f6, + 0xf4911042, + 0x0d074290, + 0x297e1b07, + 0x8ef383f3, + 0x1e00a7f5, + 0xa3f54ef9, + 0x03df07f3, + 0x400710dc, + 0x0f075107, + 0xf4051d07, + 0xf335c307, + 0xf515f225, + 0x1d7ebf07, + 0x24bc03f6, + 0x08030f07, + 0x117e1b07, + 0xd0f441f6, + 0xf4911042, + 0x0d074290, + 0xe57e1b07, + 0x8ef383f2, + 0x1e00a7f5, + 0xa3f54ef9, + 0x03df07f3, + 0x400710dc, + 0x0f075107, + 0xf4051d07, + 0xf335c307, + 0xf515f225, + 0xd97ebf07, + 0x24bc03f5, + 0x08030f07, + 0xcd7e1b07, + 0xd0f441f5, + 0xf4911042, + 0x0d074290, + 0xa17e1b07, + 0x8ef383f2, + 0x1e0127f5, + 0x63f54ef9, + 0x27a027f1, + 0x278027b0, + 0x2706b690, + 0x07f40542, + 0x1540270f, + 0xf6d97ef4, + 0xf1435107, + 0xd027f58e, + 0x3c274327, + 0x05c0073c, + 0x35f325f4, + 0xbefd45f0, + 0x070001ac, + 0x1d1c0310, + 0xc62c10c8, + 0x0323d21f, + 0x008200e8, + 0x403b4c07, + 0x4c07f445, + 0x3c27413b, + 0x2bf4353c, + 0x270f0731, + 0x15f32540, + 0xf6917ef4, + 0xf1435107, + 0xe107f58e, + 0x0e07e013, + 0x27200c23, + 0xc8702760, + 0x41274200, + 0xb03bb407, + 0xa2072127, + 0x30a7ae3b, + 0x3a0b40a7, + 0x3c8b4b4b, + 0x34ab4d8b, + 0x612734c6, + 0x00c87027, + 0x5b8d0740, + 0x5b9d0780, + 0x2747079e, + 0x36073c2c, + 0x212b49ab, + 0xf33538ab, + 0xf225f445, + 0x27ff5a5e, + 0x4127203c, + 0xb4073e2b, + 0xb91eb35b, + 0x2b204c27, + 0x072c0741, + 0x3b245b3d, + 0x4532ab31, + 0xff745ef3, + 0x2b204c27, + 0x073d074e, + 0x5b343b8c, + 0x1e83ab8e, + 0x88fe4eb5, + 0x13100c00, + 0x0e212710, + 0x004e9efe, + 0x68001300, + 0xbe212710, + 0x13000044, + 0x13fe8e00, + 0x4ef31e10, + 0x1200c8fd, + 0x10c8d027, + 0xbe202714, + 0x8600002c, + 0x8e0013d4, + 0x270013fd, + 0xee10ccd1, + 0x41271013, + 0xd407d4d6, + 0x4027e41e, + 0xde1ed407, + 0x099e2127, + 0x20270000, + 0x0000039e, + 0x01c2fe4e, + 0x3310c836, + 0x3c274127, + 0x47114720, + 0x2101c244, + 0x2707f3f0, + 0x8e26e630, + 0xee10ccfe, + 0x012a3027, + 0x34ab012b, + 0x11534153, + 0x21b642d6, + 0xfe8e0307, + 0x30274066, + 0x4127e91e, + 0xe31e3027, + 0x4207f64e, + 0x93078207, + 0x3007a207, + 0xab102c53, + 0x073fab4f, + 0x07e39be2, + 0x07710760, + 0x531407b0, + 0x349b100c, + 0x4307109b, + 0x4c53e10b, + 0x9be40b10, + 0x031e0220, + 0x0100002e, + 0xb99b4e07, + 0x9b10ec33, + 0x104c53a7, + 0x3fabd207, + 0xba0bce07, + 0xc30bd40b, + 0x0c071b07, + 0xf68e1d0b, + 0x00000ed4, + 0x0dd41701, + 0x273a0100, + 0xf9035b30, + 0x014e2000, + 0x204c2700, + 0xfe0b041b, + 0x00000fb0, + 0x3c270100, + 0xf9035b18, + 0x014e2000, + 0x1b482700, + 0x27fe0b04, + 0x3407104c, + 0x00f9035b, + 0x00014e20, + 0xfe0b041b, + 0x035b3827, + 0x4e2000f9, + 0x4c270001, + 0x0b041b18, + 0xff1ea7fe, + 0x1401fd4f, + 0x03122f9b, + 0xc1443341, + 0x24ab3813, + 0x0027322e, + 0xf3abfe0b, + 0xc13812c5, + 0x42ce3814, + 0x27f3ebf8, + 0x4efe0b01, + 0x76d33efe, + 0x200c2705, + 0x059efe0e, + 0xfe8e0000, + 0xb007fb4e, + 0xff012abe, + 0x1007d007, + 0x3bf6f093, + 0xd80abe00, + 0x27d746ff, + 0x010b1ec0, + 0xbec103d2, + 0x03ffd7fc, + 0x931c07d4, + 0x003be8f0, + 0x8eedcbda, + 0x000000fb, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x7478656e, + 0x6369705f, + 0x5f6f745f, + 0x73726170, + 0x20202065, + 0x75252020, + 0x2a2a000a, + 0x25202a2a, + 0x2a2a2073, + 0x50202a2a, + 0x30203a43, + 0x20782578, + 0x52532020, + 0x7830203a, + 0x20207825, + 0x52414620, + 0x7830203a, + 0x000a7825, + 0x255b5220, + 0x205d6432, + 0x7830203d, + 0x78383025, + 0x6d20000a, + 0x65747361, + 0x25232072, + 0x73252064, + 0x6f626120, + 0x64657472, + 0x2020000a, + 0x55414620, + 0x203a544c, + 0x78257830, + 0x2020000a, + 0x44414620, + 0x203a5244, + 0x78257830, + 0x4152000a, + 0x41204353, + 0x54524f42, + 0x554d4d00, + 0x4f424120, + 0x57005452, + 0x68637461, + 0x00676f64, + 0x616e7944, + 0x2063696d, + 0x6e616863, + 0x69206567, + 0x6874206e, + 0x756e2065, + 0x7265626d, + 0x20666f20, + 0x65726f63, + 0x73692073, + 0x746f6e20, + 0x70757320, + 0x74726f70, + 0x52006465, + 0x30435341, + 0x53415200, + 0x52003143, + 0x32435341, + 0x53415200, + 0x52003343, + 0x34435341, + 0x4d445300, + 0x44560041, + 0x5200414d, + 0x00004645, + 0x00011467, + 0x0001146d, + 0x00011473, + 0x00011479, + 0x0001147f, + 0x00011485, + 0x0001148a, + 0x0001148f, + 0x45444956, + 0x5746204f, + 0x41545320, + 0x44204554, + 0x20504d55, + 0x6f636544, + 0x3d726564, + 0x4745504a, + 0x6946000a, + 0x61776d72, + 0x76206572, + 0x69737265, + 0x64206e6f, + 0x2073656f, + 0x20746f6e, + 0x6374616d, + 0x61682068, + 0x61776472, + 0x0a216572, + 0x72694600, + 0x7261776d, + 0x6f632065, + 0x6c69706d, + 0x66206465, + 0x7620726f, + 0x69737265, + 0x30206e6f, + 0x38302578, + 0x48000a78, + 0x77647261, + 0x20657261, + 0x6f706572, + 0x20737472, + 0x20202020, + 0x72657620, + 0x6e6f6973, + 0x25783020, + 0x0a783830, + 0x72694600, + 0x7261776d, + 0x65762065, + 0x6f697372, + 0x6f64206e, + 0x6e207365, + 0x6d20746f, + 0x68637461, + 0x72616820, + 0x72617764, + 0x65762065, + 0x6f697372, + 0x6946006e, + 0x61776d72, + 0x63206572, + 0x69706d6f, + 0x2064656c, + 0x20726f66, + 0x70207325, + 0x69636572, + 0x6e6f6973, + 0x6c736420, + 0x646f6d20, + 0x6c000a65, + 0x4800776f, + 0x77647261, + 0x20657261, + 0x6f706572, + 0x20737472, + 0x20202020, + 0x20732520, + 0x63657270, + 0x6f697369, + 0x7364206e, + 0x6f6d206c, + 0x000a6564, + 0x68676968, + 0x454c0020, + 0x5254435f, + 0x78253a4c, + 0x434e202c, + 0x5345524f, + 0x2c78253a, + 0x43494c20, + 0x524f435f, + 0x554e5f45, + 0x64253a4d, + 0x5748202c, + 0x524f435f, + 0x554e5f45, + 0x64253a4d, + 0x69000a20, + 0x6c61766e, + 0x68206469, + 0x77647261, + 0x20657261, + 0x65726f63, + 0x6d756e20, + 0x73726562, + 0x756e203a, + 0x7265626d, + 0x20666f20, + 0x64726168, + 0x20657261, + 0x65726f63, + 0x20736920, + 0x656c6c69, + 0x006c6167, + 0x69206f4e, + 0x7562746e, + 0x70732066, + 0x20656361, + 0x20726f66, + 0x7473616d, + 0x73207265, + 0x20657661, + 0x61657261, + 0x626f4a00, + 0x73656d20, + 0x65676173, + 0x754e203a, + 0x7265626d, + 0x20666f20, + 0x65726f63, + 0x61632073, + 0x6f6e206e, + 0x65622074, + 0x72657a20, + 0x4a002e6f, + 0x6d20626f, + 0x61737365, + 0x203a6567, + 0x626d754e, + 0x6f207265, + 0x6f632066, + 0x20736572, + 0x206f6f74, + 0x6772616c, + 0x4a002e65, + 0x6d20626f, + 0x61737365, + 0x203a6567, + 0x75736e55, + 0x726f7070, + 0x20646574, + 0x67616c66, + 0x65732073, + 0x4a002e74, + 0x6d20626f, + 0x61737365, + 0x203a6567, + 0x626d754e, + 0x6f207265, + 0x72662066, + 0x73656d61, + 0x6f6f7420, + 0x72616c20, + 0x002e6567, + 0x73206f6e, + 0x65636170, + 0x206e6920, + 0x20626f6a, + 0x75657571, + 0x41460065, + 0x5f4c4154, + 0x4f525245, + 0x4e555f52, + 0x49464544, + 0x0044454e, + 0x41544146, + 0x52455f4c, + 0x5f524f52, + 0x43424641, + 0x504e495f, + 0x435f5455, + 0x5552524f, + 0x46005450, + 0x4c415441, + 0x5252455f, + 0x415f524f, + 0x5f434246, + 0x5f464552, + 0x52524f43, + 0x00545055, + 0x41544146, + 0x52455f4c, + 0x5f524f52, + 0x4449534c, + 0x5254435f, + 0x414d5f4c, + 0x524f4358, + 0x4f4e5f45, + 0x45535f54, + 0x00000054, + 0x0001173a, + 0x00011750, + 0x0001176f, + 0x0001178c, + 0x65666552, + 0x636e6572, + 0x69702065, + 0x72757463, + 0x61742065, + 0x0a656c62, + 0x20646900, + 0x73203a20, + 0x75206174, + 0x72206573, + 0x70206665, + 0x70203179, + 0x63203279, + 0x6620706d, + 0x6d20746d, + 0x705f6962, + 0x20207274, + 0x5f69626d, + 0x65676170, + 0x69732873, + 0x2029657a, + 0x72747020, + 0x706f7420, + 0x746f623a, + 0x3325000a, + 0x203a2064, + 0x20643325, + 0x20643325, + 0x20643325, + 0x20643325, + 0x20643325, + 0x20643325, + 0x20643325, + 0x20207025, + 0x64362520, + 0x29642528, + 0x25202020, + 0x70253a70, + 0x694c000a, + 0x70206576, + 0x75746369, + 0x74206572, + 0x656c6261, + 0x754e000a, + 0x203a206d, + 0x20206425, + 0x646c4f20, + 0x20747365, + 0x000a6425, + 0x20786469, + 0x7473203a, + 0x73752061, + 0x69702065, + 0x20646963, + 0x69666572, + 0x696c2064, + 0x7973656e, + 0x7220636e, + 0x20206665, + 0x6576696c, + 0x73666572, + 0x20202020, + 0x66657220, + 0x63697032, + 0x3325000a, + 0x203a2064, + 0x20643325, + 0x20643325, + 0x33252020, + 0x20202064, + 0x20643325, + 0x36252020, + 0x33252064, + 0x30202064, + 0x38302578, + 0x33252078, + 0x33252064, + 0x33252064, + 0x33252064, + 0x33252064, + 0x33252064, + 0x33252064, + 0x33252064, + 0x33252064, + 0x33252064, + 0x33252064, + 0x33252064, + 0x33252064, + 0x33252064, + 0x33252064, + 0x33252064, + 0x50000a64, + 0x61766972, + 0x72206574, + 0x61626665, + 0x203a6b6e, + 0x6f6c6f63, + 0x78302072, + 0x6d207825, + 0x625f7861, + 0x65666675, + 0x25207372, + 0x626d2075, + 0x75252077, + 0x68626d20, + 0x20752520, + 0x65736162, + 0x6464615f, + 0x78302072, + 0x78383025, + 0x2020000a, + 0x78646920, + 0x61747320, + 0x66657220, + 0x6464615f, + 0x20202072, + 0x2077626d, + 0x68626d20, + 0x2020000a, + 0x75332520, + 0x75332520, + 0x25783020, + 0x0a783830, + 0x6e652800, + 0x666f2064, + 0x69727020, + 0x65746176, + 0x66657220, + 0x6b6e6162, + 0x6d756420, + 0x000a2970, + 0x75736e55, + 0x726f7070, + 0x20646574, + 0x6f736572, + 0x6974756c, + 0x203a6e6f, + 0x2064255b, + 0x64252078, + 0x6f63005d, + 0x70757272, + 0x6c732074, + 0x00656369, + 0x2d746573, + 0x2074706f, + 0x666f7270, + 0x6e696c69, + 0x61203a67, + 0x6d206772, + 0x20747375, + 0x30206562, + 0x20726f20, + 0x65730031, + 0x706f2d74, + 0x73652074, + 0x69706163, + 0x203a676e, + 0x20677261, + 0x7473756d, + 0x20656220, + 0x726f2030, + 0x73003120, + 0x6f2d7465, + 0x6e207470, + 0x20756c61, + 0x6d726f66, + 0x203a7461, + 0x6e6b6e55, + 0x206e776f, + 0x6d726f66, + 0x73007461, + 0x6f2d7465, + 0x6e207470, + 0x20756c61, + 0x6d726f66, + 0x203a7461, + 0x75736e55, + 0x726f7070, + 0x20646574, + 0x6d726f66, + 0x73007461, + 0x6f2d7465, + 0x69207470, + 0x726f6e67, + 0x74732065, + 0x6d616572, + 0x61656820, + 0x73726564, + 0x7261203a, + 0x756d2067, + 0x62207473, + 0x20302065, + 0x3120726f, + 0x74657300, + 0x74706f2d, + 0x61726620, + 0x7220656d, + 0x64726f65, + 0x6e697265, + 0x61203a67, + 0x6d206772, + 0x20747375, + 0x30206562, + 0x20726f20, + 0x65730031, + 0x706f2d74, + 0x6f682074, + 0x70207473, + 0x6f746f72, + 0x206c6f63, + 0x6e697270, + 0x203a7374, + 0x20677261, + 0x7473756d, + 0x20656220, + 0x726f2030, + 0x46003120, + 0x6978656c, + 0x20656c62, + 0x6e776f64, + 0x6c616373, + 0x6f6e2065, + 0x75732074, + 0x726f7070, + 0x20646574, + 0x68207962, + 0x77647261, + 0x00657261, + 0x5f6c7364, + 0x5f736f70, + 0x65646f6d, + 0x6c6e6f20, + 0x76612079, + 0x616c6961, + 0x20656c62, + 0x68206e69, + 0x20686769, + 0x63657270, + 0x6f697369, + 0x6f64206e, + 0x63736e77, + 0x20656c61, + 0x65646f6d, + 0x6e49002e, + 0x66754274, + 0x20000a3a, + 0x676f6c20, + 0x61705f32, + 0x735f6567, + 0x20657a69, + 0x756e2020, + 0x61705f6d, + 0x20736567, + 0x65726628, + 0x000a2965, + 0x20202020, + 0x64323025, + 0x20202020, + 0x20202020, + 0x20202020, + 0x20643525, + 0x64252820, + 0x74796220, + 0x0a297365, + 0x626e5500, + 0x6b636f6c, + 0x20676e69, + 0x69736572, + 0x3a73657a, + 0x0a642520, + 0x746f5400, + 0x61206c61, + 0x636f6c6c, + 0x64657461, + 0x64382520, + 0x73752820, + 0x25206465, + 0x75202c64, + 0x6572666e, + 0x6c626165, + 0x64252065, + 0x7266202c, + 0x25206565, + 0x000a2964, + 0x646e6553, + 0x20676e69, + 0x20666572, + 0x6d617266, + 0x6e752065, + 0x64657375, + 0x64646120, + 0x73736572, + 0x78383025, + 0x6552000a, + 0x76696563, + 0x53206465, + 0x43544957, + 0x52000a48, + 0x69656365, + 0x20646576, + 0x20424f4a, + 0x67616c66, + 0x75253d73, + 0x61726620, + 0x3d73656d, + 0x63207525, + 0x7365726f, + 0x0a75253d, + 0x54455300, + 0x54504f5f, + 0x204e4f49, + 0x6c696166, + 0x203a6465, + 0x000a7325, + 0x2f355600, + 0x4a2d3756, + 0x44474550, + 0x203a4345, + 0x63655200, + 0x65766569, + 0x45532064, + 0x504f5f54, + 0x4e4f4954, + 0x74616420, + 0x69735f61, + 0x2520657a, + 0x706f2075, + 0x6e695f74, + 0x20786564, + 0x61207525, + 0x30206772, + 0x38302578, + 0x53000a78, + 0x69737365, + 0x6f206e6f, + 0x6f697470, + 0x6320736e, + 0x6f206e61, + 0x20796c6e, + 0x63206562, + 0x676e6168, + 0x69206465, + 0x5453206e, + 0x4550504f, + 0x74732044, + 0x2e657461, + 0x54455300, + 0x54504f5f, + 0x204e4f49, + 0x202c4b4f, + 0x666e6f63, + 0x696d7269, + 0x000a676e, + 0x65636552, + 0x64657669, + 0x4c444920, + 0x43415f45, + 0x47000a4b, + 0x4920746f, + 0x5f454c44, + 0x204b4341, + 0x68746977, + 0x2074756f, + 0x746e6573, + 0x4c444920, + 0x52002e45, + 0x69656365, + 0x20646576, + 0x454c4552, + 0x5f455341, + 0x5f464552, + 0x4d415246, + 0x61642045, + 0x735f6174, + 0x20657a69, + 0x62207525, + 0x65666675, + 0x64615f72, + 0x73657264, + 0x78302073, + 0x78383025, + 0x6572000a, + 0x7361656c, + 0x65722065, + 0x72662066, + 0x3a656d61, + 0x64646120, + 0x73736572, + 0x746f6e20, + 0x206e6920, + 0x696c6176, + 0x65722064, + 0x6e6f6967, + 0x6553002e, + 0x6e69646e, + 0x72662067, + 0x5f656d61, + 0x6f6c6c61, + 0x61705f63, + 0x736d6172, + 0x2077203a, + 0x68207525, + 0x20752520, + 0x63626661, + 0x20752520, + 0x6d207525, + 0x25206962, + 0x6f642075, + 0x63736e77, + 0x64656c61, + 0x6172665f, + 0x775f656d, + 0x68746469, + 0x2c75253d, + 0x6e776f64, + 0x6c616373, + 0x665f6465, + 0x656d6172, + 0x6965685f, + 0x3d746867, + 0x0a2e7525, + 0x6e655300, + 0x676e6964, + 0x71657320, + 0x636e6575, + 0x61705f65, + 0x736d6172, + 0x7830203a, + 0x38302520, + 0x30252078, + 0x000a7838, + 0x646e6553, + 0x20676e69, + 0x66667562, + 0x705f7265, + 0x6d617261, + 0x70797420, + 0x75252065, + 0x7a697320, + 0x7a252065, + 0x53000a75, + 0x20646e65, + 0x65727473, + 0x63206d61, + 0x7572726f, + 0x203a7470, + 0x000a7325, + 0x646e6553, + 0x72747320, + 0x206d6165, + 0x20746f6e, + 0x70707573, + 0x6574726f, + 0x25203a64, + 0x53000a73, + 0x69646e65, + 0x5320676e, + 0x43544957, + 0x5f444548, + 0x000a4e49, + 0x646e6553, + 0x20676e69, + 0x5f424f4a, + 0x55514544, + 0x44455545, + 0x4449000a, + 0x2820454c, + 0x656c6469, + 0x6e65735f, + 0x6f745f74, + 0x736f685f, + 0x75252074, + 0x6e69202c, + 0x5f667562, + 0x20746e63, + 0x202c7525, + 0x6274756f, + 0x635f6675, + 0x2520746e, + 0x000a2975, + 0x61202020, + 0x6c696176, + 0x726f7720, + 0x69207364, + 0x6f63206e, + 0x71206d6d, + 0x65756575, + 0x6d203a73, + 0x25206773, + 0x6e692075, + 0x20667562, + 0x6f207525, + 0x75627475, + 0x75252066, + 0x6573000a, + 0x6e69646e, + 0x65722067, + 0x6e6f7073, + 0x63206573, + 0x2065646f, + 0x000a6425, + 0x646e6553, + 0x20676e69, + 0x434f5250, + 0x45535345, + 0x25000a44, + 0x73252073, + 0x65766d20, + 0x66756220, + 0x20726566, + 0x6d617266, + 0x69282065, + 0x6675626e, + 0x746e635f, + 0x2c752520, + 0x74756f20, + 0x5f667562, + 0x20746e63, + 0x0a297525, + 0x20202000, + 0x736f6820, + 0x61685f74, + 0x656c646e, + 0x25783020, + 0x25783830, + 0x20783830, + 0x72657375, + 0x7461645f, + 0x61745f61, + 0x78302067, + 0x78383025, + 0x78383025, + 0x2020000a, + 0x72662020, + 0x5f656d61, + 0x67616c66, + 0x78302073, + 0x78383025, + 0x706f7420, + 0x20752520, + 0x20746f62, + 0x65207525, + 0x2520736f, + 0x65722075, + 0x7525206a, + 0x2020000a, + 0x6f662020, + 0x74616d72, + 0x25783020, + 0x20783430, + 0x69736976, + 0x20656c62, + 0x25787525, + 0x20000a75, + 0x6d202020, + 0x5f696e69, + 0x6d617266, + 0x20795f65, + 0x2d752528, + 0x0a297525, + 0x20202000, + 0x616c7020, + 0x2073656e, + 0x30257830, + 0x202c7838, + 0x30257830, + 0x000a7838, + 0x20202020, + 0x657a6973, + 0x75252073, + 0x7525202c, + 0x2020000a, + 0x72632020, + 0x2078706f, + 0x63207525, + 0x79706f72, + 0x20752520, + 0x63626661, + 0x735f775f, + 0x75252062, + 0x20752520, + 0x63626661, + 0x7261705f, + 0x20736d61, + 0x30257830, + 0x000a7838, + 0x20202020, + 0x6b656570, + 0x25783020, + 0x25783230, + 0x25783230, + 0x25783230, + 0x0a783230, + 0x20202000, + 0x616c7020, + 0x745f656e, + 0x3020706f, + 0x38302578, + 0x78302078, + 0x78383025, + 0x25783020, + 0x0a783830, + 0x20202000, + 0x616c7020, + 0x625f656e, + 0x3020746f, + 0x38302578, + 0x78302078, + 0x78383025, + 0x25783020, + 0x0a783830, + 0x20202000, + 0x72747320, + 0x73656469, + 0x25202020, + 0x64252064, + 0x0a642520, + 0x20202000, + 0x78616d20, + 0x78752520, + 0x000a7525, + 0x25207325, + 0x766d2073, + 0x75622065, + 0x72656666, + 0x74696220, + 0x65727473, + 0x28206d61, + 0x75626e69, + 0x6e635f66, + 0x75252074, + 0x756f202c, + 0x66756274, + 0x746e635f, + 0x29752520, + 0x2020000a, + 0x69622020, + 0x72747374, + 0x5f6d6165, + 0x67616c66, + 0x78302073, + 0x78383025, + 0x736f6520, + 0x75252066, + 0x666f6520, + 0x20752520, + 0x20736f65, + 0x65207525, + 0x7362666f, + 0x20752520, + 0x74617473, + 0x75252073, + 0x2020000a, + 0x64612020, + 0x30207264, + 0x38302578, + 0x6c612078, + 0x20636f6c, + 0x6f207525, + 0x25206666, + 0x69662075, + 0x25206c6c, + 0x25000a75, + 0x73252073, + 0x65766d20, + 0x66756220, + 0x20726566, + 0x61726170, + 0x6574656d, + 0x74202c72, + 0x20657079, + 0x000a7525, + 0x25207325, + 0x766d2073, + 0x75622065, + 0x72656666, + 0x6e656720, + 0x6c617265, + 0x6e692820, + 0x5f667562, + 0x20746e63, + 0x202c7525, + 0x6274756f, + 0x635f6675, + 0x2520746e, + 0x000a2975, + 0x20202020, + 0x65707974, + 0x2c752520, + 0x6e6f6320, + 0x5f676966, + 0x657a6973, + 0x0a752520, + 0x20202000, + 0x6e6f6320, + 0x20676966, + 0x30257830, + 0x30207832, + 0x32302578, + 0x78302078, + 0x78323025, + 0x25783020, + 0x0a783230, + 0x20202000, + 0x66756220, + 0x5f726566, + 0x20727470, + 0x30257830, + 0x202c7838, + 0x66667562, + 0x735f7265, + 0x20657a69, + 0x000a7525, + 0x74736f48, + 0x69727020, + 0x6220746e, + 0x65666675, + 0x52452072, + 0x2e524f52, + 0x20732520, + 0x6d207325, + 0x62206576, + 0x65666675, + 0x69772072, + 0x75206874, + 0x6f6e6b6e, + 0x63206e77, + 0x2065646f, + 0x000a7525, + 0x00746f47, + 0x5054554f, + 0x53005455, + 0x69646e65, + 0x4900676e, + 0x5455504e, + 0x63655200, + 0x65766965, + 0x554f2064, + 0x54555054, + 0x554c465f, + 0x73204853, + 0x65746174, + 0x20752520, + 0x7074756f, + 0x625f7475, + 0x6b636f6c, + 0x25206465, + 0x4f000a75, + 0x75707475, + 0x6c662074, + 0x20687375, + 0x796c6e6f, + 0x6c6c6120, + 0x6465776f, + 0x65687720, + 0x7473206e, + 0x6570706f, + 0x6f202c64, + 0x66612072, + 0x20726574, + 0x70736572, + 0x65736e6f, + 0x45535f20, + 0x4e455551, + 0x505f4543, + 0x4d415241, + 0x52455445, + 0x65530053, + 0x6e69646e, + 0x554f2067, + 0x54555054, + 0x554c465f, + 0x44454853, + 0x6553000a, + 0x6e69646e, + 0x4e492067, + 0x5f545550, + 0x53554c46, + 0x0a444548, + 0x63655200, + 0x65766965, + 0x4e492064, + 0x5f545550, + 0x53554c46, + 0x49000a48, + 0x5455504e, + 0x554c465f, + 0x6f204853, + 0x20796c6e, + 0x6f6c6c61, + 0x20646577, + 0x6e656877, + 0x206e6920, + 0x504f5453, + 0x20444550, + 0x74617473, + 0x52002e65, + 0x69656365, + 0x20646576, + 0x000a4f47, + 0x5f45564d, + 0x55514552, + 0x5f545345, + 0x45444f43, + 0x3a4f475f, + 0x70204120, + 0x69766572, + 0x2073756f, + 0x74617473, + 0x72742065, + 0x69736e61, + 0x6e6f6974, + 0x20736920, + 0x6c697473, + 0x6570206c, + 0x6e69646e, + 0x4e002e67, + 0x6f6a206f, + 0x6e692062, + 0x626f6a20, + 0x65757120, + 0x002e6575, + 0x65636552, + 0x64657669, + 0x4f545320, + 0x4d000a50, + 0x525f4556, + 0x45555145, + 0x435f5453, + 0x5f45444f, + 0x504f5453, + 0x2041203a, + 0x76657270, + 0x73756f69, + 0x61747320, + 0x74206574, + 0x736e6172, + 0x6f697469, + 0x7369206e, + 0x69747320, + 0x70206c6c, + 0x69646e65, + 0x002e676e, + 0x6e616843, + 0x73206567, + 0x65746174, + 0x206f7420, + 0x000a6425, + 0x646e6553, + 0x20676e69, + 0x54415453, + 0x48435f45, + 0x45474e41, + 0x77656e20, + 0x6174735f, + 0x253d6574, + 0x53000a75, + 0x65746174, + 0x61686320, + 0x2065676e, + 0x646e6570, + 0x20676e69, + 0x74617473, + 0x64253d65, + 0x6e657020, + 0x676e6964, + 0x0a64253d, + 0x63655200, + 0x65766965, + 0x55442064, + 0x000a504d, + 0x5f45564d, + 0x55514552, + 0x5f545345, + 0x45444f43, + 0x4d55445f, + 0x6f6e2050, + 0x6c612074, + 0x65776f6c, + 0x6f662064, + 0x72702072, + 0x6365746f, + 0x20646574, + 0x73736573, + 0x736e6f69, + 0x626e002e, + 0x75622072, + 0x72656666, + 0x65682073, + 0x203a646c, + 0x69207525, + 0x7475706e, + 0x20752520, + 0x7074756f, + 0x000a7475, + 0x69617661, + 0x6f77206c, + 0x20736472, + 0x63206e69, + 0x206d6d6f, + 0x75657571, + 0x203a7365, + 0x2067736d, + 0x69207525, + 0x6675626e, + 0x20752520, + 0x6274756f, + 0x25206675, + 0x52000a75, + 0x69656365, + 0x20646576, + 0x474e4950, + 0x6552000a, + 0x76696563, + 0x44206465, + 0x47554245, + 0x736d202c, + 0x643e2d67, + 0x5f617461, + 0x657a6973, + 0x2c64253d, + 0x76656c20, + 0x253d6c65, + 0x63000a64, + 0x2065646f, + 0x6425203d, + 0x7254000a, + 0x69736e61, + 0x6e6f6974, + 0x46494620, + 0x766f204f, + 0x6c667265, + 0x5500776f, + 0x7075736e, + 0x74726f70, + 0x6d206465, + 0x61737365, + 0x63206567, + 0x2e65646f, + 0x69424d00, + 0x206f666e, + 0x7074756f, + 0x6e207475, + 0x6120746f, + 0x776f6c6c, + 0x66206465, + 0x7020726f, + 0x65746f72, + 0x64657463, + 0x73657320, + 0x6e6f6973, + 0x6142002e, + 0x424d2064, + 0x6f666e69, + 0x74756f20, + 0x3b747570, + 0x78616d20, + 0x7a69735f, + 0x73282065, + 0x64697274, + 0x5d305b65, + 0x756d2029, + 0x62207473, + 0x6f6e2065, + 0x656e2d6e, + 0x69746167, + 0x000a6576, + 0x20646142, + 0x6e69424d, + 0x6f206f66, + 0x75707475, + 0x75203b74, + 0x5f646573, + 0x657a6973, + 0x73756d20, + 0x6f6e2074, + 0x65622074, + 0x72616c20, + 0x20726567, + 0x6e616874, + 0x78616d20, + 0x7a69735f, + 0x4d000a65, + 0x666e6942, + 0x756f206f, + 0x74757074, + 0x66756220, + 0x20726566, + 0x20736168, + 0x656c6c69, + 0x206c6167, + 0x61636f6c, + 0x6e6f6974, + 0x64614200, + 0x69424d20, + 0x206f666e, + 0x7074756f, + 0x62207475, + 0x65666675, + 0x4e002e72, + 0x7573206f, + 0x726f7070, + 0x6f662074, + 0x68742072, + 0x62207369, + 0x65666675, + 0x6f632072, + 0x20726f6c, + 0x6d726f66, + 0x002e7461, + 0x64726168, + 0x65726177, + 0x656f6420, + 0x6f6e2073, + 0x75732074, + 0x726f7070, + 0x46412074, + 0x6f204342, + 0x75707475, + 0x61680074, + 0x61776472, + 0x64206572, + 0x2073656f, + 0x20746f6e, + 0x70707573, + 0x2074726f, + 0x5f45564d, + 0x4d524f46, + 0x595f5441, + 0x32345655, + 0x30505f30, + 0x54003031, + 0x20736968, + 0x65727473, + 0x6e206d61, + 0x73646565, + 0x206e6120, + 0x65746e69, + 0x63616c72, + 0x62206465, + 0x65666675, + 0x54002e72, + 0x20736968, + 0x65727473, + 0x6e206d61, + 0x73646565, + 0x6e206120, + 0x692d6e6f, + 0x7265746e, + 0x6563616c, + 0x75622064, + 0x72656666, + 0x694d002e, + 0x726f7272, + 0x20676e69, + 0x6e207369, + 0x7320746f, + 0x6f707075, + 0x64657472, + 0x726f6620, + 0x63656420, + 0x2e65646f, + 0x74694200, + 0x74706564, + 0x666f2068, + 0x42464120, + 0x756f2043, + 0x74757074, + 0x66756220, + 0x20726566, + 0x7473756d, + 0x20656220, + 0x622d3031, + 0x62207469, + 0x75616365, + 0x6f206573, + 0x65642066, + 0x65646f63, + 0x74732064, + 0x6d616572, + 0x6942002e, + 0x70656474, + 0x6f206874, + 0x46412066, + 0x6f204342, + 0x75707475, + 0x75622074, + 0x72656666, + 0x73756d20, + 0x65622074, + 0x622d3820, + 0x62207469, + 0x75616365, + 0x6f206573, + 0x65642066, + 0x65646f63, + 0x74732064, + 0x6d616572, + 0x4641002e, + 0x66204342, + 0x616d726f, + 0x756d2074, + 0x62207473, + 0x3a342065, + 0x20323a32, + 0x636e6973, + 0x65642065, + 0x65646f63, + 0x74732064, + 0x6d616572, + 0x2e736920, + 0x42464100, + 0x6f662043, + 0x74616d72, + 0x73756d20, + 0x65622074, + 0x323a3420, + 0x7320303a, + 0x65636e69, + 0x63656420, + 0x6465646f, + 0x72747320, + 0x206d6165, + 0x002e7369, + 0x61746f52, + 0x6e6f6974, + 0x20736920, + 0x20746f6e, + 0x70707573, + 0x6574726f, + 0x6f662064, + 0x46412072, + 0x62204342, + 0x65666675, + 0x002e7372, + 0x43424641, + 0x776f6420, + 0x6163736e, + 0x676e696c, + 0x746f6e20, + 0x70757320, + 0x74726f70, + 0x66206465, + 0x6920726f, + 0x7265746e, + 0x6563616c, + 0x74732064, + 0x6d616572, + 0x6e490073, + 0x696c6176, + 0x63732064, + 0x6e696c61, + 0x65732067, + 0x6f662074, + 0x46412072, + 0x62204342, + 0x65666675, + 0x6d202c72, + 0x20747375, + 0x30206562, + 0x20726f20, + 0x46002e31, + 0x6420726f, + 0x736e776f, + 0x696c6163, + 0x202c676e, + 0x43424641, + 0x616c7020, + 0x3120656e, + 0x20736920, + 0x20746f6e, + 0x76206e69, + 0x64696c61, + 0x6d656d20, + 0x2079726f, + 0x69676572, + 0x002e6e6f, + 0x43424641, + 0x616c7020, + 0x3120656e, + 0x7a697320, + 0x68732065, + 0x646c756f, + 0x746f6e20, + 0x20656220, + 0x6f72657a, + 0x4641002e, + 0x70204342, + 0x656e616c, + 0x69203020, + 0x6f6e2073, + 0x6e692074, + 0x6c617620, + 0x6d206469, + 0x726f6d65, + 0x65722079, + 0x6e6f6967, + 0x4641002e, + 0x70204342, + 0x656e616c, + 0x73203020, + 0x20657a69, + 0x756f6873, + 0x6e20646c, + 0x6220746f, + 0x657a2065, + 0x002e6f72, + 0x20726f46, + 0x65746e69, + 0x63616c72, + 0x41202c65, + 0x20434246, + 0x6e616c70, + 0x20312065, + 0x6e207369, + 0x6920746f, + 0x6176206e, + 0x2064696c, + 0x6f6d656d, + 0x72207972, + 0x6f696765, + 0x46002e6e, + 0x6920726f, + 0x7265746e, + 0x6563616c, + 0x6661202c, + 0x775f6362, + 0x68746469, + 0x5f6e695f, + 0x65707573, + 0x6f6c6272, + 0x20736b63, + 0x7473756d, + 0x20656220, + 0x20656874, + 0x656d6173, + 0x726f6620, + 0x746f6220, + 0x6c702068, + 0x73656e61, + 0x4641002e, + 0x74204342, + 0x64656c69, + 0x61656820, + 0x20726564, + 0x75716572, + 0x73657269, + 0x6c697420, + 0x62206465, + 0x2e79646f, + 0x42464100, + 0x32332043, + 0x73203878, + 0x72657075, + 0x636f6c62, + 0x6e20736b, + 0x7320746f, + 0x6f707075, + 0x64657472, + 0x726f6620, + 0x63656420, + 0x2065646f, + 0x7074756f, + 0x43007475, + 0x6e206e61, + 0x7520746f, + 0x34206573, + 0x323a323a, + 0x66756220, + 0x20726566, + 0x73206669, + 0x61657274, + 0x7369206d, + 0x323a3420, + 0x002e303a, + 0x61766e49, + 0x2064696c, + 0x6c616373, + 0x20676e69, + 0x20746573, + 0x20726f66, + 0x6e616c70, + 0x62207261, + 0x65666675, + 0x6d002e72, + 0x665f7861, + 0x656d6172, + 0x6469775f, + 0x73206874, + 0x6c756f68, + 0x65622064, + 0x72616c20, + 0x20726567, + 0x6e616874, + 0x72657a20, + 0x6d002e6f, + 0x665f7861, + 0x656d6172, + 0x6965685f, + 0x20746867, + 0x756f6873, + 0x6220646c, + 0x616c2065, + 0x72656772, + 0x61687420, + 0x657a206e, + 0x002e6f72, + 0x75736e55, + 0x726f7070, + 0x20646574, + 0x6e616c70, + 0x62207261, + 0x65666675, + 0x6f632072, + 0x20726f6c, + 0x6d726f66, + 0x002e7461, + 0x69727453, + 0x74206564, + 0x73206f6f, + 0x6c6c616d, + 0x206f7420, + 0x646c6f68, + 0x78616d20, + 0x6172665f, + 0x775f656d, + 0x68746469, + 0x6c70002e, + 0x5f656e61, + 0x20706f74, + 0x7473756d, + 0x20656220, + 0x6d206e69, + 0x726f6d65, + 0x65722079, + 0x6e6f6967, + 0x41524620, + 0x5542454d, + 0x70002e46, + 0x656e616c, + 0x746f625f, + 0x73756d20, + 0x65622074, + 0x206e6920, + 0x6f6d656d, + 0x72207972, + 0x6f696765, + 0x5246206e, + 0x42454d41, + 0x002e4655, + 0x6e616c70, + 0x6f625f65, + 0x68732074, + 0x646c756f, + 0x20656220, + 0x6f72657a, + 0x726f6620, + 0x6e6f6e20, + 0x746e692d, + 0x616c7265, + 0x20646563, + 0x65727473, + 0x002e6d61, + 0x72646441, + 0x20737365, + 0x7520666f, + 0x6573756e, + 0x6c702064, + 0x20656e61, + 0x756f6873, + 0x6220646c, + 0x657a2065, + 0x002e6f72, + 0x69727453, + 0x6f206564, + 0x6e752066, + 0x64657375, + 0x616c7020, + 0x7320656e, + 0x6c756f68, + 0x65622064, + 0x72657a20, + 0x52002e6f, + 0x7461746f, + 0x206e6f69, + 0x206e6163, + 0x20746f6e, + 0x64206562, + 0x20656e6f, + 0x20726f66, + 0x3a323a34, + 0x57002e32, + 0x48435441, + 0x20474f44, + 0x00717269, + 0x2a2a2a2a, + 0x53415220, + 0x20642543, + 0x524f4241, + 0x2a2a2054, + 0x000a2a2a, + 0x43502020, + 0x20202020, + 0x7830203d, + 0x78383025, + 0x2020000a, + 0x20205253, + 0x203d2020, + 0x30257830, + 0x000a7838, + 0x41462020, + 0x20202052, + 0x7830203d, + 0x78383025, + 0x2020000a, + 0x32255b52, + 0x3d205d64, + 0x25783020, + 0x0a783830, + 0x00000000, + 0x0001653b, + 0x0000ba8b, + 0x0000ba8b, + 0x0000ba8b, + 0x61766e49, + 0x2064696c, + 0x66667562, + 0x69207265, + 0x564d206e, + 0x4f435f45, + 0x425f4d4d, + 0x495f4655, + 0x415f514e, + 0x20524444, + 0x70786528, + 0x65746365, + 0x766d2064, + 0x75625f65, + 0x72656666, + 0x7469625f, + 0x65727473, + 0x2e296d61, + 0x766e4900, + 0x64696c61, + 0x706e6920, + 0x62207475, + 0x65666675, + 0x46002e72, + 0x6978656c, + 0x20656c62, + 0x6e776f64, + 0x6c616373, + 0x6f6e2065, + 0x75732074, + 0x726f7070, + 0x20646574, + 0x68207962, + 0x77647261, + 0x2e657261, + 0x6e614300, + 0x746f6e20, + 0x65737520, + 0x642d2d20, + 0x5f6e776f, + 0x6c616373, + 0x20582065, + 0x68746977, + 0x642d2d20, + 0x725f6c73, + 0x6f697461, + 0x726f685f, + 0x7265762f, + 0x646e6120, + 0x6c736420, + 0x6172665f, + 0x775f656d, + 0x68746469, + 0x6965682f, + 0x20746867, + 0x73207461, + 0x20656d61, + 0x656d6974, + 0x6143002e, + 0x6f6e206e, + 0x73752074, + 0x2d2d2065, + 0x5f6c7364, + 0x69746172, + 0x6f685f6f, + 0x65762f72, + 0x20582072, + 0x68746977, + 0x6c736420, + 0x6172665f, + 0x775f656d, + 0x68746469, + 0x6965682f, + 0x20746867, + 0x73207461, + 0x20656d61, + 0x656d6974, + 0x6c66002e, + 0x62697865, + 0x6420656c, + 0x736e776f, + 0x696c6163, + 0x7520676e, + 0x7075736e, + 0x74726f70, + 0x69206465, + 0x7475706e, + 0x73657220, + 0x74756c6f, + 0x206e6f69, + 0x74616874, + 0x73656c20, + 0x68742073, + 0x32206e61, + 0x4641002e, + 0x202c4342, + 0x6e20726f, + 0x202c746f, + 0x7473756d, + 0x20656220, + 0x64657375, + 0x6e6f6320, + 0x74736973, + 0x6c746e65, + 0x75642079, + 0x676e6972, + 0x63656420, + 0x0065646f, + 0x4e49424d, + 0x6f204f46, + 0x75707475, + 0x6f202c74, + 0x6f6e2072, + 0x6d202c74, + 0x20747375, + 0x75206562, + 0x20646573, + 0x736e6f63, + 0x65747369, + 0x796c746e, + 0x72756420, + 0x20676e69, + 0x6f636564, + 0x49006564, + 0x6c61766e, + 0x6d206469, + 0x625f6576, + 0x65666675, + 0x65675f72, + 0x6172656e, + 0x6e69206c, + 0x45564d20, + 0x4d4f435f, + 0x55425f4d, + 0x554f5f46, + 0x415f5154, + 0x2e524444, + 0x70695000, + 0x69702065, + 0x72757463, + 0x6f6a2065, + 0x6c612062, + 0x64616572, + 0x61682079, + 0x6e612073, + 0x45564d20, + 0x4655425f, + 0x5f524546, + 0x45444f43, + 0x4e45475f, + 0x4c415245, + 0x61656820, + 0x20726564, + 0x6f737361, + 0x74616963, + 0x77206465, + 0x20687469, + 0x55007469, + 0x7075736e, + 0x74726f70, + 0x74206465, + 0x20657079, + 0x6d20666f, + 0x625f6576, + 0x65666675, + 0x65675f72, + 0x6172656e, + 0x7562206c, + 0x72656666, + 0x206e6920, + 0x7074756f, + 0x71207475, + 0x65756575, + 0x6e49002e, + 0x696c6176, + 0x75622064, + 0x72656666, + 0x206e6920, + 0x5f45564d, + 0x4d4d4f43, + 0x4655425f, + 0x54554f5f, + 0x44415f51, + 0x28205244, + 0x65707865, + 0x64657463, + 0x65766d20, + 0x6675625f, + 0x5f726566, + 0x6d617266, + 0x726f2065, + 0x65766d20, + 0x6675625f, + 0x5f726566, + 0x656e6567, + 0x296c6172, + 0x5044002e, + 0x6e203a42, + 0x665f6d75, + 0x656d6172, + 0x64253d73, + 0x61737520, + 0x303d6567, + 0x38302578, + 0x70642078, + 0x75665f62, + 0x656e6c6c, + 0x253d7373, + 0x696c2064, + 0x725f6576, + 0x645f6665, + 0x5f707369, + 0x6b73616d, + 0x2578303d, + 0x44000a78, + 0x203a4250, + 0x3a643225, + 0x78646920, + 0x6432253d, + 0x73696420, + 0x79616c70, + 0x64726f5f, + 0x253d7265, + 0x66206436, + 0x6873756c, + 0x2064253d, + 0x646e6570, + 0x3d676e69, + 0x62206425, + 0x65666675, + 0x73755f72, + 0x253d6465, + 0x6f6e2064, + 0x74756f5f, + 0x3d747570, + 0x69206425, + 0x65725f73, + 0x64253d66, + 0x72617420, + 0x5f746567, + 0x253d6469, + 0x6d000a64, + 0x69737369, + 0x7020676e, + 0x73747261, + 0x20666f20, + 0x6d617266, + 0x6e490065, + 0x696c6176, + 0x75622064, + 0x72656666, + 0x206e6920, + 0x5f45564d, + 0x4d4d4f43, + 0x4655425f, + 0x514e495f, + 0x4444415f, + 0x65282052, + 0x63657078, + 0x20646574, + 0x5f65766d, + 0x66667562, + 0x625f7265, + 0x74737469, + 0x6d616572, + 0x73002e29, + 0x6f2d7465, + 0x6a207470, + 0x64676570, + 0x203a6365, + 0x75736e55, + 0x726f7070, + 0x20646574, + 0x6974706f, + 0x68006e6f, + 0x65646165, + 0x61702072, + 0x20657372, + 0x6f727265, + 0x61700072, + 0x20657372, + 0x6e617571, + 0x617a6974, + 0x6e6f6974, + 0x62617420, + 0x202c656c, + 0x303d2158, + 0x72617000, + 0x73206573, + 0x74726174, + 0x20666f20, + 0x6d617266, + 0x62202c65, + 0x65647469, + 0x21687470, + 0x7000383d, + 0x65737261, + 0x61747320, + 0x6f207472, + 0x72662066, + 0x2c656d61, + 0x72626e20, + 0x6d6f635f, + 0x656e6f70, + 0x2173746e, + 0x7000333d, + 0x65737261, + 0x61747320, + 0x6f207472, + 0x72662066, + 0x2c656d61, + 0x735f6820, + 0x6c706d61, + 0x61665f65, + 0x726f7463, + 0x72617000, + 0x73206573, + 0x74726174, + 0x20666f20, + 0x6d617266, + 0x76202c65, + 0x6d61735f, + 0x5f656c70, + 0x74636166, + 0x7000726f, + 0x65737261, + 0x61747320, + 0x6f207472, + 0x72662066, + 0x2c656d61, + 0x61757120, + 0x745f746e, + 0x656c6261, + 0x6c65735f, + 0x7000333e, + 0x65737261, + 0x61747320, + 0x6f207472, + 0x72662066, + 0x2c656d61, + 0x72686320, + 0x5f616d6f, + 0x6d726f66, + 0x695f7461, + 0x70006364, + 0x65737261, + 0x61747320, + 0x6f207472, + 0x63732066, + 0x202c6e61, + 0x746c756d, + 0x656c7069, + 0x61637320, + 0x7020736e, + 0x66207265, + 0x656d6172, + 0x72617000, + 0x73206573, + 0x74726174, + 0x20666f20, + 0x6e616373, + 0x626e202c, + 0x6f635f72, + 0x6e6f706d, + 0x73746e65, + 0x00333d21, + 0x73726170, + 0x75682065, + 0x616d6666, + 0x6174206e, + 0x2c656c62, + 0x6c627420, + 0x72626e5f, + 0x31203e20, + 0x00000000, + 0x20002000, + 0x30023001, + 0x30043003, + 0xc0223005, + 0x10061006, + 0xc0122007, + 0x10081008, + 0xc0122009, + 0x100a100a, + 0x0000200b, + 0x20002000, + 0x20012001, + 0x20022002, + 0xc0233003, + 0x10041004, + 0x10041004, + 0x20052005, + 0xc0233006, + 0x10071007, + 0x10071007, + 0x20082008, + 0xc0223009, + 0x100a100a, + 0x0000200b, + 0x20012001, + 0x20012001, + 0x20022002, + 0x20022002, + 0x30033003, + 0x40044000, + 0xc0444011, + 0xc0c4c084, + 0x10051005, + 0x10051005, + 0x10051005, + 0x10051005, + 0x10121012, + 0x10121012, + 0x10121012, + 0x10121012, + 0x10211021, + 0x10211021, + 0x10211021, + 0x10211021, + 0x20312031, + 0x20312031, + 0x20412041, + 0x20412041, + 0x30063006, + 0x30133013, + 0x30513051, + 0x30613061, + 0x40224007, + 0xc0444071, + 0xc0c4c084, + 0xc144c104, + 0x10141014, + 0x10141014, + 0x10141014, + 0x10141014, + 0x10321032, + 0x10321032, + 0x10321032, + 0x10321032, + 0x10811081, + 0x10811081, + 0x10811081, + 0x10811081, + 0x10911091, + 0x10911091, + 0x10911091, + 0x10911091, + 0x10a110a1, + 0x10a110a1, + 0x10a110a1, + 0x10a110a1, + 0x20082008, + 0x20082008, + 0x20232023, + 0x20232023, + 0x20422042, + 0x20422042, + 0x20b120b1, + 0x20b120b1, + 0x20c120c1, + 0x20c120c1, + 0x30153015, + 0x30523052, + 0x30d130d1, + 0x30f030f0, + 0x40334024, + 0x40724062, + 0xc084c044, + 0xc104c0c4, + 0xc184c144, + 0xc204c1c4, + 0x30823082, + 0x400a4009, + 0x40174016, + 0x40194018, + 0x4025401a, + 0x40274026, + 0x40294028, + 0x4034402a, + 0x40364035, + 0x40384037, + 0x403a4039, + 0x40444043, + 0x40464045, + 0x40484047, + 0x404a4049, + 0x40544053, + 0x40564055, + 0x40584057, + 0x405a4059, + 0x40644063, + 0x40664065, + 0x40684067, + 0x406a4069, + 0x40744073, + 0x40764075, + 0x40784077, + 0x407a4079, + 0x40844083, + 0x40864085, + 0x40884087, + 0x408a4089, + 0x40934092, + 0x40954094, + 0x40974096, + 0x40994098, + 0x40a2409a, + 0x40a440a3, + 0x40a640a5, + 0x40a840a7, + 0x40aa40a9, + 0x40b340b2, + 0x40b540b4, + 0x40b740b6, + 0x40b940b8, + 0x40c240ba, + 0x40c440c3, + 0x40c640c5, + 0x40c840c7, + 0x40ca40c9, + 0x40d340d2, + 0x40d540d4, + 0x40d740d6, + 0x40d940d8, + 0x40e140da, + 0x40e340e2, + 0x40e540e4, + 0x40e740e6, + 0x40e940e8, + 0x40f140ea, + 0x40f340f2, + 0x40f540f4, + 0x40f740f6, + 0x40f940f8, + 0x000040fa, + 0x20002000, + 0x20002000, + 0x20002000, + 0x20002000, + 0x20002000, + 0x20002000, + 0x20002000, + 0x20002000, + 0x20012001, + 0x20012001, + 0x20012001, + 0x20012001, + 0x20012001, + 0x20012001, + 0x20012001, + 0x20012001, + 0x30023002, + 0x30023002, + 0x30023002, + 0x30023002, + 0x40034003, + 0x40034003, + 0x40114011, + 0x40114011, + 0x50045004, + 0x50055005, + 0x50215021, + 0x50315031, + 0x60126006, + 0x60516041, + 0xc144c104, + 0xc1c4c184, + 0x10071007, + 0x10071007, + 0x10071007, + 0x10071007, + 0x10611061, + 0x10611061, + 0x10611061, + 0x10611061, + 0x10711071, + 0x10711071, + 0x10711071, + 0x10711071, + 0x20132013, + 0x20132013, + 0x20222022, + 0x20222022, + 0x20322032, + 0x20322032, + 0x20812081, + 0x20812081, + 0x30083008, + 0x30143014, + 0x30423042, + 0x30913091, + 0x30a130a1, + 0x30b130b1, + 0x30c130c1, + 0x40234009, + 0x40524033, + 0xc04340f0, + 0xc083c063, + 0xc1c3c0a3, + 0x10151015, + 0x10151015, + 0x10621062, + 0x10621062, + 0x10721072, + 0x10721072, + 0x10d110d1, + 0x10d110d1, + 0x200a200a, + 0x20162016, + 0x20242024, + 0x20342034, + 0xc043c023, + 0xc083c063, + 0xc0c3c0a3, + 0xc103c0e3, + 0x10e110e1, + 0x10e110e1, + 0x20252025, + 0x20f120f1, + 0x30183017, + 0x301a3019, + 0x30273026, + 0x30293028, + 0x3035302a, + 0x30373036, + 0x30393038, + 0x3043303a, + 0x30453044, + 0x30473046, + 0x30493048, + 0x3053304a, + 0x30553054, + 0x30573056, + 0x30593058, + 0x3063305a, + 0x30653064, + 0x30673066, + 0x30693068, + 0x3073306a, + 0x30753074, + 0x30773076, + 0x30793078, + 0x3082307a, + 0x30843083, + 0x30863085, + 0x30883087, + 0x308a3089, + 0xc043c023, + 0xc083c063, + 0xc0c3c0a3, + 0xc103c0e3, + 0x30933092, + 0x30953094, + 0x30973096, + 0x30993098, + 0x30a2309a, + 0x30a430a3, + 0x30a630a5, + 0x30a830a7, + 0x30aa30a9, + 0x30b330b2, + 0x30b530b4, + 0x30b730b6, + 0x30b930b8, + 0x30c230ba, + 0x30c430c3, + 0x30c630c5, + 0x30c830c7, + 0x30ca30c9, + 0x30d330d2, + 0x30d530d4, + 0x30d730d6, + 0x30d930d8, + 0x30e230da, + 0x30e430e3, + 0x30e630e5, + 0x30e830e7, + 0x30ea30e9, + 0x30f330f2, + 0x30f530f4, + 0x30f730f6, + 0x30f930f8, + 0x000030fa, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x2a2a2a2a, + 0x53415220, + 0x20642543, + 0x524f4241, + 0x2a2a2054, + 0x000a2a2a, + 0x43502020, + 0x20202020, + 0x7830203d, + 0x78383025, + 0x2020000a, + 0x20205253, + 0x203d2020, + 0x30257830, + 0x000a7838, + 0x41462020, + 0x20202052, + 0x7830203d, + 0x78383025, + 0x2020000a, + 0x32255b52, + 0x3d205d64, + 0x25783020, + 0x0a783830, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x0000c71e, + 0x0000c71e, + 0x0000c71e, + 0x0000c71e, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x20000010, + 0x804000c0, + 0x03008001, + 0x00060100, + 0x80ff080f, + 0xff080f80, + 0x080f8080, + 0x0f8080ff, + 0x8080ff08, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x20000010, + 0x00400080, + 0x02008001, + 0x00040100, + 0x00ff200f, + 0x200f0802, + 0x080200ff, + 0x00ff200f, + 0x200f0802, + 0x080200ff, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x4649424d, + 0x4745504a, + 0x00000001, + 0x2a2a2a2a, + 0x53415220, + 0x20642543, + 0x524f4241, + 0x2a2a2054, + 0x000a2a2a, + 0x43502020, + 0x20202020, + 0x7830203d, + 0x78383025, + 0x2020000a, + 0x20205253, + 0x203d2020, + 0x30257830, + 0x000a7838, + 0x41462020, + 0x20202052, + 0x7830203d, + 0x78383025, + 0x2020000a, + 0x32255b52, + 0x3d205d64, + 0x25783020, + 0x0a783830, + 0x73657200, + 0x61756469, + 0x3020736c, + 0x20702578, + 0x78257830, + 0x0000000a, + 0x0000c98d, + 0x0000c98d, + 0x0000c98d, + 0x0000c98d, + 0x06050100, + 0x0d070402, + 0x110c0803, + 0x18120b09, + 0x1c1b0f0e, + 0x2a1d1a10, + 0x2b291e19, + 0x352c281f, + 0x2017130a, + 0x26211614, + 0x2f252215, + 0x31302423, + 0x36342d27, + 0x3c37332e, + 0x3d3b3832, + 0x3f3e3a39, + 0x75736e55, + 0x726f7070, + 0x20646574, + 0x6e776f64, + 0x6c616373, + 0x20676e69, + 0x69746172, + 0x4600216f, + 0x6978656c, + 0x20656c62, + 0x6e776f44, + 0x6c616373, + 0x20676e69, + 0x73656f64, + 0x746f6e20, + 0x70757320, + 0x74726f70, + 0x6c697420, + 0x6f206465, + 0x75707475, + 0x6f662074, + 0x74616d72, + 0x6c46002e, + 0x64207865, + 0x63206c73, + 0x20706f72, + 0x6f727265, + 0x636f2072, + 0x72727563, + 0x202c6465, + 0x61656c70, + 0x66206573, + 0x69207869, + 0x2a002174, + 0x202a2a2a, + 0x43534152, + 0x41206425, + 0x54524f42, + 0x2a2a2a20, + 0x20000a2a, + 0x20435020, + 0x3d202020, + 0x25783020, + 0x0a783830, + 0x53202000, + 0x20202052, + 0x30203d20, + 0x38302578, + 0x20000a78, + 0x52414620, + 0x3d202020, + 0x25783020, + 0x0a783830, + 0x52202000, + 0x6432255b, + 0x203d205d, + 0x30257830, + 0x000a7838, + 0x0000e220, + 0x0000e220, + 0x0000e220, + 0x0000e220, + 0x33323130, + 0x37363534, + 0x00003938, + 0x33323130, + 0x37363534, + 0x62613938, + 0x66656463, + 0x72726f43, + 0x65747075, + 0x6e692064, + 0x20747570, + 0x75657571, + 0x4f002e65, + 0x20796c6e, + 0x5f45564d, + 0x46465542, + 0x435f5245, + 0x5f45444f, + 0x4d415246, + 0x726f2045, + 0x45564d20, + 0x4655425f, + 0x5f524546, + 0x45444f43, + 0x4e45475f, + 0x4c415245, + 0x6c6c6120, + 0x6465776f, + 0x6e49002e, + 0x696c6176, + 0x75622064, + 0x72656666, + 0x61656820, + 0x20726564, + 0x4d206e69, + 0x435f4556, + 0x5f4d4d4f, + 0x5f465542, + 0x5154554f, + 0x4444415f, + 0x54002e52, + 0x6c206f6f, + 0x65677261, + 0x71657220, + 0x74736575, + 0x73656d20, + 0x65676173, + 0x6f54002e, + 0x616c206f, + 0x20656772, + 0x66667562, + 0x6d207265, + 0x61737365, + 0x002e6567, + 0x61766e49, + 0x2064696c, + 0x66667562, + 0x69207265, + 0x564d206e, + 0x4f435f45, + 0x425f4d4d, + 0x495f4655, + 0x415f514e, + 0x2e524444, + 0x45564d00, + 0x723a5052, + 0x705f6d61, + 0x746e6972, + 0x20667562, + 0x6e207369, + 0x6120746f, + 0x6c696176, + 0x656c6261, + 0x4d000a2e, + 0x50524556, + 0x6172203a, + 0x72705f6d, + 0x66746e69, + 0x6d75645f, + 0x72662070, + 0x30206d6f, + 0x0a702578, + 0x54505200, + 0x504d5544, + 0x616c663a, + 0x78253d67, + 0x6e69202c, + 0x3d786564, + 0x202c7525, + 0x635f7277, + 0x253d746e, + 0x72202c75, + 0x6e635f64, + 0x75253d74, + 0x46000a2e, + 0x75252d57, + 0x7325203a, + 0x45564d00, + 0x663a5052, + 0x3d67616c, + 0x202c7825, + 0x3d786469, + 0x202c7525, + 0x635f7277, + 0x253d746e, + 0x72202c75, + 0x6e635f64, + 0x75253d74, + 0x20000a2e, + 0x78343025, + 0x78382500, + 0x0a73253a, + 0x30252000, + 0x00007832, + 0x1007f000, + 0x49574558, + 0x35565644, + 0x2d37562f, + 0x4745504a, + 0x3a434544, + 0x65720020, + 0x657a6973, + 0x7470203a, + 0x78302072, + 0x78383025, + 0x77656e20, + 0x7a69735f, + 0x75252065, + 0x766d000a, + 0x656d5f65, + 0x65725f6d, + 0x657a6973, + 0x6c616d00, + 0x3a636f6c, + 0x7a697320, + 0x75252065, + 0x616d202c, + 0x75252078, + 0x6572202c, + 0x6e6f6967, + 0x2c752520, + 0x676f6c20, + 0x6c615f32, + 0x206e6769, + 0x000a7525, + 0x6c6c616d, + 0x203a636f, + 0x75746572, + 0x64656e72, + 0x25783020, + 0x6d000a70, + 0x6d5f6576, + 0x615f6d65, + 0x636f6c6c, + 0x6c6c4100, + 0x7461636f, + 0x6d206465, + 0x726f6d65, + 0x61682079, + 0x72772073, + 0x20676e6f, + 0x67696c61, + 0x6e656d6e, + 0x78450074, + 0x74636570, + 0x61206465, + 0x636f6c6c, + 0x64657461, + 0x6d656d20, + 0x2079726f, + 0x50206e69, + 0x45544f52, + 0x44455443, + 0x67657220, + 0x2e6e6f69, + 0x70784500, + 0x65746365, + 0x6c612064, + 0x61636f6c, + 0x20646574, + 0x6f6d656d, + 0x69207972, + 0x5246206e, + 0x42454d41, + 0x72204655, + 0x6f696765, + 0x6e002e6e, + 0x7720746f, + 0x69746961, + 0x3d00676e, + 0x3d3d3d3d, + 0x3d3d3d3d, + 0x4d44563d, + 0x45525f41, + 0x55445f47, + 0x3d3d504d, + 0x3d3d3d3d, + 0x000a3d3d, + 0x64343025, + 0x25783028, + 0x29783430, + 0x20202020, + 0x30257830, + 0x000a7838, + 0x69207325, + 0x5f656c64, + 0x6c637963, + 0x000a7365, + 0x25207325, + 0x7338312d, + 0x35312520, + 0x25000a64, + 0x6f542073, + 0x5f6c6174, + 0x656c6469, + 0x20202020, + 0x20202020, + 0x64353125, + 0x6f63000a, + 0x25206572, + 0x73252064, + 0x322d2520, + 0x63207330, + 0x3d65646f, + 0x20643325, + 0x3d636970, + 0x20643325, + 0x5b736f70, + 0x3d5d7570, + 0x64332528, + 0x6433252c, + 0x6c632029, + 0x64253d6b, + 0x6f63000a, + 0x25206572, + 0x73252064, + 0x322d2520, + 0x20207330, + 0x20202020, + 0x20202020, + 0x3d636970, + 0x20643325, + 0x5b736f70, + 0x3d5d7570, + 0x64332528, + 0x6433252c, + 0x6e000a29, + 0x7320746f, + 0x77207465, + 0x69746961, + 0x5300676e, + 0x525f434f, + 0x532e4645, + 0x55544154, + 0x20202053, + 0x20202020, + 0x30202020, + 0x0a782578, + 0x434f5300, + 0x4645525f, + 0x4e4f432e, + 0x20474946, + 0x20202020, + 0x20202020, + 0x25783020, + 0x53000a78, + 0x525f434f, + 0x4c2e4645, + 0x52455649, + 0x20204645, + 0x20202020, + 0x30202020, + 0x0a782578, + 0x434f5300, + 0x4645525f, + 0x4f54532e, + 0x53414d50, + 0x2020204b, + 0x20202020, + 0x25783020, + 0x53000a78, + 0x4d5f434f, + 0x54532e43, + 0x20545241, + 0x20202020, + 0x20202020, + 0x30202020, + 0x0a782578, + 0x434f5300, + 0x2e434d5f, + 0x54415453, + 0x20205355, + 0x20202020, + 0x20202020, + 0x25783020, + 0x53000a78, + 0x545f434f, + 0x532e4652, + 0x55544154, + 0x20202053, + 0x20202020, + 0x30202020, + 0x0a782578, + 0x434f5300, + 0x4652545f, + 0x4742442e, + 0x54415453, + 0x20205355, + 0x20202020, + 0x25783020, + 0x53000a78, + 0x445f434f, + 0x432e4c42, + 0x204c5254, + 0x20202020, + 0x20202020, + 0x30202020, + 0x0a782578, + 0x434f5300, + 0x4c42445f, + 0x5254432e, + 0x2020314c, + 0x20202020, + 0x20202020, + 0x25783020, + 0x53000a78, + 0x445f434f, + 0x532e4c42, + 0x55544154, + 0x20202053, + 0x20202020, + 0x30202020, + 0x0a782578, + 0x434f5300, + 0x4c42445f, + 0x4154532e, + 0x31535554, + 0x20202020, + 0x20202020, + 0x25783020, + 0x53000a78, + 0x445f434f, + 0x532e4c42, + 0x55544154, + 0x20203253, + 0x20202020, + 0x30202020, + 0x0a782578, + 0x434f5300, + 0x4c42445f, + 0x4154532e, + 0x33535554, + 0x20202020, + 0x20202020, + 0x25783020, + 0x53000a78, + 0x425f434f, + 0x54535449, + 0x4d414552, + 0x4243412e, + 0x532e4441, + 0x55544154, + 0x20202053, + 0x20202020, + 0x78257830, + 0x4f53000a, + 0x49425f43, + 0x52545354, + 0x2e4d4145, + 0x4942444d, + 0x56415354, + 0x204c4941, + 0x20202020, + 0x30202020, + 0x0a782578, + 0x434f5300, + 0x5449425f, + 0x45525453, + 0x442e4d41, + 0x435f4645, + 0x204c5254, + 0x20202020, + 0x20202020, + 0x78302020, + 0x000a7825, + 0x5f434f53, + 0x53544942, + 0x41455254, + 0x4d482e4d, + 0x45525056, + 0x54532e44, + 0x53555441, + 0x20202020, + 0x25783020, + 0x53000a78, + 0x425f434f, + 0x54535449, + 0x4d414552, + 0x4143482e, + 0x2e444142, + 0x54415453, + 0x20205355, + 0x20202020, + 0x78257830, + 0x4853000a, + 0x44455241, + 0x4d41525f, + 0x7069702e, + 0x74735f65, + 0x20657461, + 0x75252020, + 0x73252820, + 0x53000a29, + 0x45524148, + 0x41525f44, + 0x73692e4d, + 0x73616c5f, + 0x6f635f74, + 0x25206572, + 0x53000a75, + 0x45524148, + 0x41525f44, + 0x6f6a2e4d, + 0x68705f62, + 0x20657361, + 0x25202020, + 0x53000a75, + 0x45524148, + 0x41525f44, + 0x6f6a2e4d, + 0x74735f62, + 0x20657461, + 0x25202020, + 0x53000a78, + 0x45524148, + 0x41525f44, + 0x756f2e4d, + 0x626d5f74, + 0x20202020, + 0x25202020, + 0x53000a75, + 0x45524148, + 0x41525f44, + 0x72742e4d, + 0x66736e61, + 0x5f6d726f, + 0x2520626d, + 0x53000a75, + 0x45524148, + 0x41525f44, + 0x616c2e4d, + 0x6d5f7473, + 0x666e6962, + 0x2520206f, + 0x53000a75, + 0x45524148, + 0x41525f44, + 0x756f2e4d, + 0x74757074, + 0x7274735f, + 0x73657069, + 0x6d6f635f, + 0x74656c70, + 0x25206465, + 0x53000a75, + 0x45524148, + 0x41525f44, + 0x72612e4d, + 0x735f7165, + 0x70697274, + 0x695f7365, + 0x65757373, + 0x75252064, + 0x4453000a, + 0x462e414d, + 0x544c5541, + 0x20202020, + 0x20202020, + 0x20202020, + 0x78302020, + 0x000a7825, + 0x74617453, + 0x6f207375, + 0x6c622066, + 0x656b636f, + 0x61742064, + 0x20736b73, + 0x20726f66, + 0x65726f63, + 0x3a752520, + 0x6b6c6320, + 0x2075253d, + 0x4f53000a, + 0x59535f43, + 0x52544353, + 0x56532e4c, + 0x5645524e, + 0x20202020, + 0x20202020, + 0x20202020, + 0x20202020, + 0x0a782520, + 0x5f574600, + 0x20564552, + 0x20202020, + 0x20202020, + 0x20202020, + 0x20202020, + 0x20202020, + 0x20202020, + 0x20202020, + 0x000a7825, + 0x53534553, + 0x5f4e4f49, + 0x2e4d4152, + 0x69746361, + 0x635f6576, + 0x7365726f, + 0x20202020, + 0x20202020, + 0x25202020, + 0x46000a75, + 0x776d7269, + 0x20657261, + 0x74617473, + 0x6f207375, + 0x616d2066, + 0x72657473, + 0x6f632820, + 0x25206572, + 0x203a2964, + 0x3d6b6c63, + 0x0a206425, + 0x53455300, + 0x4e4f4953, + 0x4d41525f, + 0x7269662e, + 0x7261776d, + 0x695f7365, + 0x73755f6e, + 0x20202065, + 0x20202020, + 0x202c6425, + 0x202c6425, + 0x202c6425, + 0x202c6425, + 0x202c6425, + 0x202c6425, + 0x202c6425, + 0x000a6425, + 0x53534553, + 0x5f4e4f49, + 0x2e4d4152, + 0x7473616d, + 0x635f7265, + 0x2065726f, + 0x20202020, + 0x20202020, + 0x25202020, + 0x53000a75, + 0x49535345, + 0x525f4e4f, + 0x6d2e4d41, + 0x65747361, + 0x6c615f72, + 0x61636f6c, + 0x20646574, + 0x20202020, + 0x64252020, + 0x4553000a, + 0x4f495353, + 0x41525f4e, + 0x616d2e4d, + 0x72657473, + 0x6769735f, + 0x736c616e, + 0x20202020, + 0x20202020, + 0x38302520, + 0x30252078, + 0x25207838, + 0x0a783830, + 0x53455300, + 0x4e4f4953, + 0x4d41525f, + 0x6369702e, + 0x65727574, + 0x6e695f73, + 0x7069705f, + 0x20202065, + 0x20202020, + 0x000a6425, + 0x53534553, + 0x5f4e4f49, + 0x2e4d4152, + 0x65706970, + 0x6369705f, + 0x6961745f, + 0x2020206c, + 0x20202020, + 0x25202020, + 0x53000a75, + 0x49535345, + 0x525f4e4f, + 0x702e4d41, + 0x5f657069, + 0x5f636970, + 0x64616568, + 0x20202020, + 0x20202020, + 0x75252020, + 0x4553000a, + 0x4f495353, + 0x41525f4e, + 0x65702e4d, + 0x6e69646e, + 0x74735f67, + 0x20657461, + 0x20202020, + 0x20202020, + 0x0a752520, + 0x53455300, + 0x4e4f4953, + 0x4d41525f, + 0x7365732e, + 0x6e6f6973, + 0x6174735f, + 0x20206574, + 0x20202020, + 0x20202020, + 0x000a7525, + 0x53534553, + 0x5f4e4f49, + 0x2e4d4152, + 0x706d6f63, + 0x6574656c, + 0x69705f64, + 0x72757463, + 0x20207365, + 0x25202020, + 0x53000a75, + 0x49535345, + 0x525f4e4f, + 0x6c2e4d41, + 0x5f657669, + 0x69727473, + 0x685f6570, + 0x20646165, + 0x20202020, + 0x75252020, + 0x4553000a, + 0x4f495353, + 0x41525f4e, + 0x696c2e4d, + 0x735f6576, + 0x70697274, + 0x61745f65, + 0x692e6c69, + 0x7865646e, + 0x0a752520, + 0x53455300, + 0x4e4f4953, + 0x4d41525f, + 0x76696c2e, + 0x74735f65, + 0x65706972, + 0x6961745f, + 0x69702e6c, + 0x20646963, + 0x000a7525, + 0x53534553, + 0x5f4e4f49, + 0x2e4d4152, + 0x6576696c, + 0x7274735f, + 0x5f657069, + 0x6c696174, + 0x6665722e, + 0x25202079, + 0x2d000a75, + 0x7773202d, + 0x68637469, + 0x20676e69, + 0x000a2d2d, + 0x53534553, + 0x5f4e4f49, + 0x2e4d4152, + 0x7478656e, + 0x6f6f625f, + 0x6f745f74, + 0x206e656b, + 0x20202020, + 0x25202020, + 0x53000a75, + 0x49535345, + 0x525f4e4f, + 0x6a2e4d41, + 0x715f626f, + 0x65756575, + 0x6b6f742e, + 0x20206e65, + 0x20202020, + 0x75252020, + 0x4553000a, + 0x4f495353, + 0x41525f4e, + 0x6f6a2e4d, + 0x63615f62, + 0x65766974, + 0x20202020, + 0x20202020, + 0x20202020, + 0x0a752520, + 0x53455300, + 0x4e4f4953, + 0x4d41525f, + 0x626f6a2e, + 0x6168705f, + 0x635f6573, + 0x746e756f, + 0x20207265, + 0x20202020, + 0x000a7525, + 0x53534553, + 0x5f4e4f49, + 0x2e4d4152, + 0x5f626f6a, + 0x72617473, + 0x69705f74, + 0x20202063, + 0x20202020, + 0x25202020, + 0x53000a75, + 0x49535345, + 0x525f4e4f, + 0x6a2e4d41, + 0x655f626f, + 0x705f646e, + 0x20206369, + 0x20202020, + 0x20202020, + 0x75252020, + 0x4553000a, + 0x4f495353, + 0x41525f4e, + 0x74732e4d, + 0x6d616572, + 0x6369705f, + 0x6165685f, + 0x20202064, + 0x20202020, + 0x0a752520, + 0x202d2d00, + 0x63696c73, + 0x75712065, + 0x73657565, + 0x0a2d2d20, + 0x53455300, + 0x4e4f4953, + 0x4d41525f, + 0x6669662e, + 0x6c735f6f, + 0x5f656369, + 0x20626f6a, + 0x20202020, + 0x20202020, + 0x65206425, + 0x6972746e, + 0x000a7365, + 0x53534553, + 0x5f4e4f49, + 0x2e4d4152, + 0x6f666966, + 0x696c735f, + 0x635f6563, + 0x6c706d6f, + 0x20657465, + 0x25202020, + 0x6e652064, + 0x65697274, + 0x6c000a73, + 0x5f657669, + 0x2d626f6a, + 0x6977733e, + 0x5f686374, + 0x75716572, + 0x20747365, + 0x20202020, + 0x20202020, + 0x25202020, + 0x6c000a75, + 0x5f657669, + 0x2d626f6a, + 0x7165723e, + 0x74736575, + 0x6e5f6465, + 0x65626d75, + 0x666f5f72, + 0x726f635f, + 0x25207365, + 0x6c000a75, + 0x5f657669, + 0x2d626f6a, + 0x726f633e, + 0x625f7365, + 0x65746f6f, + 0x20202064, + 0x20202020, + 0x20202020, + 0x25202020, + 0x6c000a75, + 0x5f657669, + 0x2d626f6a, + 0x7069703e, + 0x77735f65, + 0x68637469, + 0x20202020, + 0x20202020, + 0x20202020, + 0x25202020, + 0x69000a75, + 0x7475706e, + 0x66756220, + 0x73726566, + 0x61747320, + 0x3a737574, + 0x73000a2d, + 0x61657274, + 0x65685f6d, + 0x253a6461, + 0x616d2075, + 0x72657473, + 0x6165685f, + 0x75253a64, + 0x73616d20, + 0x5f726574, + 0x69617661, + 0x75253a6c, + 0x7562000a, + 0x72656666, + 0x63636f20, + 0x6e617075, + 0x2d3a7963, + 0x7562000a, + 0x64695f66, + 0x75252078, + 0x7473000a, + 0x6d616572, + 0x0a642520, + 0x726f6300, + 0x75255b65, + 0x6425205d, + 0x6f63000a, + 0x685f6572, + 0x5b646165, + 0x205d7525, + 0x000a7525, + 0x45525453, + 0x53004d41, + 0x4543494c, + 0x434d0020, + 0x20202020, + 0x45524100, + 0x00202051, + 0x4e415254, + 0x4f002053, + 0x55505455, + 0x49500054, + 0x20514550, + 0x49415700, + 0x564f0054, + 0x55525245, + 0x5331004e, + 0x47415054, + 0x49500045, + 0x00444943, + 0x42544e49, + 0x4c004655, + 0x50455649, + 0x45535241, + 0x494c0044, + 0x4f434556, + 0x5000504d, + 0x4e494349, + 0x00584544, + 0x004c414e, + 0x49504e49, + 0x4e450043, + 0x54554f43, + 0x00465542, + 0x56455250, + 0x00514553, + 0x42464552, + 0x5f4b4e41, + 0x45534552, + 0x554f0054, + 0x54555054, + 0x554c465f, + 0x43004853, + 0x5044524c, + 0x4e450042, + 0x45445f43, + 0x49505f50, + 0x55520043, + 0x54535f4e, + 0x00455441, + 0x43494c53, + 0x49465f45, + 0x4c004f46, + 0x5f455649, + 0x43494c53, + 0x45440045, + 0x55455551, + 0x4e450045, + 0x55455551, + 0x4f430045, + 0x4552004c, + 0x55444953, + 0x42004c41, + 0x4e455449, + 0x51455343, + 0x54494200, + 0x42434e45, + 0x45004655, + 0x424d434e, + 0x4f464e49, + 0x42414300, + 0x49424341, + 0x48005354, + 0x5250564d, + 0x52004445, + 0x4f4f4245, + 0x00444554, + 0x424f5250, + 0x4f430053, + 0x53544e55, + 0x39505600, + 0x50004342, + 0x5f564552, + 0x4d415246, + 0x58450045, + 0x46554254, + 0x00524546, + 0x45504950, + 0x50570044, + 0x50570030, + 0x4e450031, + 0x54535f44, + 0x45504952, + 0x49424d00, + 0x5f4f464e, + 0x44414548, + 0x52005245, + 0x52464645, + 0x00454d41, + 0x4556494c, + 0x544f4c53, + 0x424f4a00, + 0x49575300, + 0x00484354, + 0x49464552, + 0x00454c44, + 0x53464552, + 0x00544f4c, + 0x53464552, + 0x50495254, + 0x46455200, + 0x49525453, + 0x52004550, + 0x424d4645, + 0x4d445349, + 0x49500041, + 0x52444550, + 0x004e4941, + 0x5f514e45, + 0x43494c53, + 0x4e450045, + 0x424d5f51, + 0x0057525f, + 0x5f514e45, + 0x575f424d, + 0x514e4500, + 0x4152465f, + 0x4500454d, + 0x575f514e, + 0x4e450050, + 0x54535f51, + 0x00504952, + 0x49415244, + 0x54535f4e, + 0x45504952, + 0x49424d00, + 0x4745525f, + 0x45545349, + 0x434d0052, + 0x52415000, + 0x4f434553, + 0x4a00504d, + 0x4c53424f, + 0x4d00544f, + 0x4f525f43, + 0x4d003057, + 0x4f525f43, + 0x44003157, + 0x4e494152, + 0x5045445f, + 0x49525453, + 0x44004550, + 0x54535045, + 0x45504952, + 0x4154535f, + 0x48005452, + 0x56415f57, + 0x004c4941, + 0x495f5748, + 0x00454c44, + 0x5f444e42, + 0x0052474d, + 0x5f4c4244, + 0x544f4c53, + 0x574f5200, + 0x4c5f4e49, + 0x0044414f, + 0x4f574f52, + 0x535f5455, + 0x45524f54, + 0x574f5200, + 0x4c525443, + 0x414f4c5f, + 0x49430044, + 0x46554252, + 0x45525000, + 0x52545356, + 0x00455049, + 0x43434950, + 0x00504d4f, + 0x00465254, + 0x5f4c4244, + 0x0052444c, + 0x414d4456, + 0x49525453, + 0x56004550, + 0x53414d44, + 0x00544f4c, + 0x49525453, + 0x435f4550, + 0x00504d4f, + 0x49584950, + 0x4f4c5f4e, + 0x52004441, + 0x535f574f, + 0x45524f54, + 0x564d5300, + 0x49424d5f, + 0x004f464e, + 0x5f4c4244, + 0x54005342, + 0x535f4652, + 0x45524f54, + 0x4d4f435f, + 0x46525400, + 0x5254535f, + 0x43455049, + 0x00504d4f, + 0x4c525443, + 0x45504f00, + 0x4f45004e, + 0x4f450053, + 0x55425f53, + 0x45520046, + 0x4544524f, + 0x52460052, + 0x53454d41, + 0x00455a49, + 0x53594850, + 0x00004449, + 0x004e5552, + 0x00424a50, + 0x00545753, + 0x00424a43, + 0x0002e080, + 0x0002e0cc, + 0x0002e118, + 0x0002e138, + 0x0002e19c, + 0x0002e1e8, + 0x0002e234, + 0x000149b0, + 0x000149b7, + 0x000149be, + 0x000149c5, + 0x000149cc, + 0x000149d3, + 0x000149da, + 0x44532020, + 0x2020414d, + 0x61747320, + 0x30737574, + 0x20202020, + 0x74617473, + 0x20317375, + 0x207c2020, + 0x6c637273, + 0x20206e65, + 0x6c747364, + 0x7c206e65, + 0x70747320, + 0x7c206e65, + 0x70747320, + 0x7c206469, + 0x76656420, + 0x65702023, + 0x6e69646e, + 0x20000a67, + 0x32255b20, + 0x20205d64, + 0x78383025, + 0x25202020, + 0x20783830, + 0x207c2020, + 0x20643625, + 0x64362520, + 0x25207c20, + 0x25206432, + 0x7c206432, + 0x78322520, + 0x78322520, + 0x23207c20, + 0x25206425, + 0x20202c64, + 0x20642523, + 0x000a6425, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x02020100, + 0x03030303, + 0x04040404, + 0x04040404, + 0x05050505, + 0x05050505, + 0x05050505, + 0x05050505, + 0x06060606, + 0x06060606, + 0x06060606, + 0x06060606, + 0x06060606, + 0x06060606, + 0x06060606, + 0x06060606, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x63617453, + 0x7461206b, + 0x0a702520, + 0x61747300, + 0x25206b63, + 0x3d206434, + 0x25783020, + 0x0a783830, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x7bfef493, + 0x79f39302, + 0x420101e4, + 0x32053101, + 0xfe0b4105, + 0xe46af493, + 0x27420101, + 0xff4ea731, + 0x439dfeff, + 0x5c2fc40a, + 0x1d0001a8, + 0xe457f493, + 0x26441901, + 0x75f49347, + 0x4499027d, + 0x204c0454, + 0xff59839e, + 0xff5acb9e, + 0x0011579e, + 0xfc4efe0b, + 0xe433f493, + 0xa7441901, + 0xffffff3e, + 0x99273199, + 0x45c62632, + 0x063434d1, + 0x34d14756, + 0x46960638, + 0xe6103499, + 0xa7214e45, + 0xfeffff4e, + 0x014844d1, + 0x913e4486, + 0xf9cfdea7, + 0xffcea7ff, + 0xd419fd4f, + 0x437bc301, + 0xa70f41dc, + 0xfff9cd4e, + 0xc3014419, + 0x41d8437b, + 0xc2bbbe2e, + 0x01d419ff, + 0xd8437bc3, + 0xd3191741, + 0xc4012127, + 0x143b1207, + 0xd31d31eb, + 0xcfff4ea7, + 0x6842c5fd, + 0x40270546, + 0xc50ef49b, + 0xfc8e38c4, + 0xf4933127, + 0x9d027cd4, + 0x355e6443, + 0xff4ea7ff, + 0x4499feff, + 0x83202709, + 0x33348743, + 0xf9432b44, + 0x00004d43, + 0x1e3103ff, + 0x7824f913, + 0x4bff000b, + 0x2e408b4f, + 0x0b002714, + 0x582103fe, + 0x0b0127f3, + 0xa7fc4efe, + 0xfd9fff4e, + 0xc0074d01, + 0x0027d858, + 0xbbbe1c07, + 0xded8fed4, + 0x26040000, + 0xe353f493, + 0x27421901, + 0x49f49331, + 0x431d01e3, + 0x302726a6, + 0x4fff4ea7, + 0xb50027fd, + 0x9682be43, + 0xff82beff, + 0x00ded8ff, + 0x273f8000, + 0x25f49331, + 0x431d01e3, + 0x4fff4ea7, + 0xa74301fd, + 0xffffff4e, + 0x42b93387, + 0x40270b81, + 0xb04034f5, + 0x26e6ff02, + 0xe303f493, + 0x06441901, + 0xdcccbe45, + 0xbe051efe, + 0x1efecec5, + 0xfeb8beff, + 0x00ded8ff, + 0x93170200, + 0x01e2e4f4, + 0x45e64419, + 0xf4933127, + 0x1d01e2d8, + 0x5c7ebe43, + 0x10dcd800, + 0xa731271b, + 0xfdafff4e, + 0x43550c07, + 0xff2406be, + 0xf1930927, + 0x9effc2db, + 0xa7ff9d26, + 0xffffff4e, + 0x0b8442d1, + 0x3ea725a6, + 0x41fdafff, + 0x05420b34, + 0x4efc8e34, + 0x0108befa, + 0xff4ea700, + 0x44b9feff, + 0xd0070c41, + 0xbe2f4c1c, + 0xa70000b6, + 0xffffff4e, + 0x99264399, + 0x3224274a, + 0x0d1eb127, + 0xa200b127, + 0xb4d6b027, + 0x181e0027, + 0x7b8af493, + 0x54449902, + 0x4c043027, + 0x07312720, + 0x0741c343, + 0xbe0f6b04, + 0xa7000304, + 0xffffff2e, + 0xd4964127, + 0x40ab4027, + 0x063623b9, + 0x4496c127, + 0x3706c027, + 0x24bd4027, + 0xa8be0636, + 0x0cabfef6, + 0x04864027, + 0xc4074127, + 0xdea7cf6b, + 0xb9ffffff, + 0xc6063ad4, + 0xdcb8be44, + 0x3bd4b9fe, + 0x27460606, + 0x29f49330, + 0x439d027b, + 0x3bd3bd06, + 0x27b4c606, + 0x27a49601, + 0xff3ea700, + 0x34b9ffff, + 0x45060637, + 0x34bd4027, + 0xe4be0637, + 0x0cabfeee, + 0x04864027, + 0x04074127, + 0xfd4efa8e, + 0xffff4ea7, + 0x274d99ff, + 0xce264199, + 0x44b92f1d, + 0x45a60e84, + 0xd2d9f093, + 0xbe2d07ff, + 0xc4ff98e4, + 0x39be0bd2, + 0x06c6fed2, + 0x0b1e0227, + 0x4bbed616, + 0x0546fed1, + 0xfd0e0027, + 0xff1aa59e, + 0xfd4efd8e, + 0xa19af493, + 0x09432902, + 0x3534ce44, + 0x8b3ef493, + 0x03240702, + 0x3407c32c, + 0xe37f2ce3, + 0x34197f3c, + 0xc2803c03, + 0xd027f932, + 0x8b22f093, + 0x952bbe02, + 0x930626ff, + 0x028b17f0, + 0xff1c96be, + 0xe91ed127, + 0xf493d027, + 0x99028bd4, + 0x44994043, + 0x1134ce41, + 0xff174abe, + 0x40270dab, + 0x41270486, + 0xdf6bd407, + 0xfd8e0d07, + 0x071e03dc, + 0xab483341, + 0x07140741, + 0x101c3332, + 0x14ab3253, + 0x071e3103, + 0x24230105, + 0xf3b80403, + 0x011d2506, + 0xf2c80103, + 0x4107fe0b, + 0x43d840ab, + 0x01151e0f, + 0x05242313, + 0x03140303, + 0x07071e04, + 0x03425342, + 0x86f45841, + 0x03141925, + 0x03041d11, + 0x0bf2a801, + 0x030105fe, + 0x0bf2c804, + 0x862253fe, + 0x03140125, + 0x03040514, + 0x0bf2a804, + 0xf50533fe, + 0x02180001, + 0x0403f5ff, + 0x27ff0218, + 0x000e2340, + 0x0435fde8, + 0xe8000e03, + 0x1002f5fd, + 0xf5ff0218, + 0x02181403, + 0xf00e23ff, + 0x0435fde7, + 0xfc4efe0b, + 0x4327d007, + 0xc1070333, + 0x04f51d07, + 0xff021200, + 0x0d47e307, + 0x14f11333, + 0xff021000, + 0x27f848dc, + 0xf5010334, + 0x02120013, + 0xf54087ff, + 0x02120043, + 0x87e623ff, + 0xf540273c, + 0x02160034, + 0x0fec83ff, + 0x2c333d07, + 0x8333330e, + 0xf000002f, + 0x10ec333f, + 0x34f5e2ab, + 0xff021400, + 0x14043ef5, + 0xf49bff02, + 0x4efc8e0e, + 0x07b207f6, + 0x27a00791, + 0xf893406c, + 0xa701e01c, + 0xfdefff7e, + 0xcb07451e, + 0x0741bc10, + 0x078401c6, + 0xc3d633d4, + 0x23840541, + 0xfefe74de, + 0x4c337411, + 0x1d4c5318, + 0x07f642cc, + 0xe323032c, + 0x070d0723, + 0xff177e19, + 0xf49b4027, + 0x0700270e, + 0x071d072a, + 0xff177e3c, + 0xbc2bac0b, + 0xbfd69c0b, + 0xa7f68eba, + 0xfdefff2e, + 0xf3e8031e, + 0x33272411, + 0xfc6a4ddc, + 0x4efe0bf6, + 0x07b107fb, + 0x07e53ec0, + 0xa72b070c, + 0xfefeb31e, + 0xd25efb0e, + 0x07fb4efe, + 0x3eb107c0, + 0x071c07cf, + 0xa700273b, + 0xfefeb32e, + 0xca5efb0e, + 0x0f0c83fe, + 0x0e230333, + 0x39ffff7e, + 0x9e44c604, + 0x0bff9e4c, + 0x030333fe, + 0xe8031e04, + 0x0004f1f3, + 0x27ff0210, + 0x6a4ddc33, + 0xfe0bf2fc, + 0x00000001, + 0x00000000, + 0x00000001, + 0xff02b040, + 0x0f6bf54e, + 0x0fe6f063, + 0xdea7017a, + 0xb9ffffff, + 0x460635d4, + 0x270bbe46, + 0x270586ff, + 0xbd612740, + 0x1e0635d4, + 0x27602703, + 0xffcea7d0, + 0x7027ffff, + 0x9552f993, + 0xff8ea702, + 0xf593fd9f, + 0xb9027834, + 0xf40b9bc4, + 0x0118104c, + 0x0e25c4b9, + 0x94994606, + 0x9df1139a, + 0x4c501a01, + 0x01045e10, + 0x0196f213, + 0x930f072a, + 0x0289bbf1, + 0xff1485be, + 0x00f00fe6, + 0x4d24f409, + 0xf4290bba, + 0xf1284ce0, + 0x93062700, + 0xffd8c7f1, + 0x4307311e, + 0x3707400b, + 0x00014f30, + 0xf4537000, + 0x4319ff64, + 0x41c34307, + 0x2f6b2407, + 0x897ef193, + 0x61147102, + 0x0a430b13, + 0x2725b604, + 0xdef19306, + 0x039effd8, + 0xc0b9ff99, + 0xfbab0b9a, + 0xdc83d007, + 0x073d070f, + 0x3345334d, + 0x23340b33, + 0xfff4643e, + 0x4a272107, + 0x24032101, + 0x34033105, + 0xc2b9f4a8, + 0xf3930b9b, + 0x81028938, + 0x0731613e, + 0x0333714d, + 0x33210301, + 0x9ac0bd43, + 0x9bc2bd0b, + 0x404f030b, + 0x0b0003ea, + 0x0543151e, + 0x9a949941, + 0x41033027, + 0x9b9a949d, + 0xa6260ef3, + 0x0e25c4b9, + 0x84114244, + 0x00004ea3, + 0xeb841502, + 0xff2ea7fb, + 0x4027fd4f, + 0xf49b2301, + 0x9921270e, + 0x233b0ec4, + 0xf45324cb, + 0x4301feb8, + 0x41272138, + 0x21533405, + 0x340324c6, + 0xd127f31e, + 0x5e06579d, + 0x4d07fee3, + 0x002746ab, + 0x01274486, + 0x171e0f6b, + 0x88b2f493, + 0x51438102, + 0x003ff440, + 0x0b200000, + 0x5e2027ff, + 0xf043ff20, + 0x1499f58e, + 0x1b47d814, + 0x418a049d, + 0xc1133114, + 0x340b3c02, + 0x43334307, + 0x2b9003c5, + 0xc5210824, + 0xfe0b3c04, + 0x412b4007, + 0x8663f49b, + 0x03200716, + 0x634f9b28, + 0x044e3827, + 0xf39b242e, + 0x27f31e65, + 0x00007f4f, + 0x61f49b40, + 0x4ea7fe0b, + 0x91fdefff, + 0x182c3342, + 0x1e1d2c53, + 0x8904991b, + 0x231231c4, + 0x87438341, + 0x2b443334, + 0x99400b43, + 0x45e66144, + 0x9988019d, + 0x13078803, + 0x23ca1123, + 0x4efe0bdd, + 0x3ed007fd, + 0x88d499c6, + 0x3f9b45f6, + 0x634f9b62, + 0x4027432e, + 0x8e8ad49d, + 0x6af09bfd, + 0x0b6bf09b, + 0x62f19b10, + 0x9b63f09b, + 0x4ca3604f, + 0x60f49b10, + 0x0b63f09b, + 0x604f9bfe, + 0x9b104ce3, + 0x4f9b60f4, + 0xff3ea76b, + 0x4327fdef, + 0x022034d5, + 0x48dc3481, + 0xd54427fc, + 0xd5022034, + 0x27022434, + 0x6832d520, + 0xdf3ea706, + 0x3205fdeb, + 0x00004f27, + 0x34150404, + 0x990ef29b, + 0x45468804, + 0x029d4027, + 0x89049d88, + 0x0c5cfe0b, + 0xc5f49310, + 0x41c101dc, + 0x07183cac, + 0x0f1c8310, + 0x4c834107, + 0x2743330f, + 0x0201002f, + 0x6b247b80, + 0x9641272f, + 0x93402724, + 0x01dc9ff3, + 0x31c54533, + 0x4c349dac, + 0x9bc032c5, + 0x34c1600f, + 0x830ce3c0, + 0xfe0b04ab, + 0xdc82f493, + 0x8b409901, + 0x01830253, + 0x4f9bfe0b, + 0x13478363, + 0x9b480048, + 0xfe0b65f4, + 0x93630f9b, + 0x01dc63f4, + 0x075043c1, + 0x2b433343, + 0x0b037304, + 0x1efe0b03, + 0x674f9be8, + 0x30640f9b, + 0x00a7204c, + 0x4103fe0b, + 0x2365f49b, + 0x1f4c1341, + 0x0123045b, + 0xfe4efe0b, + 0xdc2ef493, + 0x4043c101, + 0x074c4299, + 0x52432b40, + 0x27402824, + 0x07031ee0, + 0x15f193e2, + 0x13c101dc, + 0x2b200750, + 0x0733332e, + 0x4c432b42, + 0x2be00740, + 0xc52307e3, + 0x1e9d4412, + 0x4efe8e4e, + 0x890499f8, + 0x43831e21, + 0x94339407, + 0x942b4487, + 0xb9071d31, + 0xb00be30b, + 0x2b58bec5, + 0x07c007d3, + 0x6b4307a1, + 0x01df102f, + 0x27010000, + 0x000000df, + 0x60b29d01, + 0x315cbdc5, + 0x274d0ba3, + 0x27430e80, + 0x7f2ea781, + 0xa301fde7, + 0x2e05a411, + 0xc561b89d, + 0xc4c5d0c3, + 0x272d15d4, + 0xa72e35e0, + 0xfde76f3e, + 0x051a4c27, + 0x993d1534, + 0x3e3561b4, + 0xbb7e44a6, + 0x89c499fd, + 0x0788c399, + 0x582c0329, + 0x41030c07, + 0x020b3103, + 0x9d89c49d, + 0xf88e88c3, + 0x0499fc4e, + 0xd6d00730, + 0x1ec02744, + 0x1ec02777, + 0x994aa66b, + 0x412389d4, + 0x34074383, + 0x44873433, + 0x3d0b342b, + 0xf6613499, + 0x60309947, + 0x07583ec1, + 0x33100740, + 0x2b153343, + 0x211d0b14, + 0x5c33c114, + 0xe30be42b, + 0xd499271e, + 0x3841dc8a, + 0x9932d499, + 0x040731d2, + 0x30070183, + 0x33331007, + 0x132b1533, + 0x31033407, + 0x9d1d24ce, + 0x1d0b32d3, + 0x3e072007, + 0x007e0d07, + 0x330411ff, + 0x99c40b43, + 0xe02788d4, + 0x078f42c8, + 0x4efc8e0c, + 0x07d007f5, + 0x07810701, + 0x9b022b72, + 0x50ce635f, + 0x6c3f9b18, + 0x4c034207, + 0x0d34da60, + 0x12070107, + 0x27fd177e, + 0x01115ed0, + 0x0750d3c1, + 0x33a7e3a0, + 0x2b4a0733, + 0x1240cc43, + 0xa7e3a807, + 0x432b4a07, + 0xd127402c, + 0x2700f25e, + 0x7e0d0770, + 0xde99fd7d, + 0x30d49931, + 0x4e1b3027, + 0x078ad39d, + 0x079f6b94, + 0x07218329, + 0x33c20742, + 0x07c53343, + 0x03c42b69, + 0xcecd0b61, + 0xc1314e9e, + 0x1333c441, + 0xb1074333, + 0xc3990a07, + 0x2bb40b14, + 0x2b450704, + 0x2b37d84b, + 0x3b2b3807, + 0x18964008, + 0x072030c8, + 0x7e1c070d, + 0x4907fc76, + 0xd49d4103, + 0x14c49932, + 0x4483ab07, + 0x4486d127, + 0xd203d027, + 0x0008401e, + 0x070901da, + 0x279b1e96, + 0xc1c02700, + 0x4a0754d3, + 0x432b3333, + 0x4e2b40c8, + 0x27a30738, + 0xc11f1ed4, + 0x4ea738d2, + 0xb9ffffff, + 0x190b9a43, + 0x07344e24, + 0xbe18070d, + 0x07ff3bd5, + 0x27a72ba8, + 0x1e1027d0, + 0x07c4412d, + 0x0b337330, + 0xc51c0743, + 0xd99d90d4, + 0x7e0d0732, + 0xd499fddb, + 0x030c1132, + 0x32d49d41, + 0x597e0d07, + 0x07c333fe, + 0x271c0b10, + 0x7e0a07d0, + 0xd536fc81, + 0x17070807, + 0x07fc037e, + 0x9bf58e0d, + 0xf293603f, + 0xc101d9a0, + 0x4858ac24, + 0xe3c024c1, + 0x04ab830c, + 0x4c834307, + 0xab48a310, + 0xc634cb40, + 0x60f49b38, + 0x1e833cd8, + 0xd8631f9b, + 0xc10d834c, + 0x22994024, + 0x32411b4c, + 0x27400824, + 0x65f09320, + 0x805e01d9, + 0x4efe0bfe, + 0x8a0499fe, + 0x41dce007, + 0x31039940, + 0xce320499, + 0x4f9b3734, + 0x633f9b62, + 0x4ccc432b, + 0x1f9b2060, + 0x39f49363, + 0x43c101d9, + 0x4c429940, + 0x432b4107, + 0x40082432, + 0x0e072027, + 0x405efe0e, + 0xfdb67efe, + 0x0b624f9b, + 0x62f49b40, + 0xf94efe8e, + 0x9f9ba007, + 0x62bf9b63, + 0x9363cf9b, + 0x01d903fd, + 0x0744d1c1, + 0x48dac50d, + 0xff39f1be, + 0x28be0d07, + 0xd499ff39, + 0x0741588a, + 0x8e0c2b0b, + 0x40d4c1f9, + 0x1b4cd299, + 0x28245249, + 0x1ed02740, + 0x93d20703, + 0x01d8cff0, + 0x93fb497e, + 0x01d8c7f0, + 0x9bff667e, + 0x3f9b624f, + 0xd2432b63, + 0xf09331a4, + 0x9901d8b4, + 0x41dc8a04, + 0x30049926, + 0x04994846, + 0x83412331, + 0x33340741, + 0x2b433335, + 0x2034f934, + 0x5c000334, + 0x1907104c, + 0xc8be2d07, + 0x0f9bff3e, + 0x634f9b62, + 0xf98e042b, + 0xfc93fc4e, + 0x010290fc, + 0x07dc07c4, + 0xf6f48b0c, + 0x04c49904, + 0x40274266, + 0x8e04c49d, + 0x07fd4efc, + 0xf842bed0, + 0x2704c6fe, + 0x13fd8e04, + 0x022747f4, + 0xfd8ed405, + 0x0499fc4e, + 0xe6d00705, + 0xbdc0274a, + 0xbd05d20c, + 0xbd05d10c, + 0xbd01850c, + 0xbd03ab0c, + 0xbd02980c, + 0xbd04be0c, + 0xbd01840c, + 0x9d05d60c, + 0x0c9d820c, + 0xeb7dbe6a, + 0x9dd421fe, + 0x410305dc, + 0xfc8ed425, + 0xc007fc4e, + 0xff37dbbe, + 0x0556d007, + 0xf4530027, + 0x101e00ca, + 0xfffb6fbe, + 0x0c0705e6, + 0x0027a33e, + 0x0587f413, + 0xc0fc8ec4, + 0x0f9b32d2, + 0xfba8be63, + 0x624f9bff, + 0x2b633f9b, + 0x004dcc43, + 0x0d271010, + 0xb3be1000, + 0x0d0cfffe, + 0x4f9b1000, + 0x624f9b63, + 0x2b633f9b, + 0x27412c43, + 0x27fc8e04, + 0x4efc8e00, + 0x7ec007fc, + 0xf413ff5c, + 0x05002798, + 0x4efc8ec4, + 0xd1d007fd, + 0x9b078004, + 0x432b633f, + 0x272141cc, + 0x402c2710, + 0xcdbe0027, + 0x0227ff35, + 0xfffab1be, + 0xfffdd2be, + 0x5010f493, + 0x050027ff, + 0x27fd8ed4, + 0xfa9cbe00, + 0xfdbdbeff, + 0x7f4f27ff, + 0x9b400000, + 0x002761f4, + 0xff34b9be, + 0x0780d0d1, + 0xff39edbe, + 0x931602c4, + 0xffd586f0, + 0xfee756be, + 0xff36ccbe, + 0xfed7f453, + 0x0027d405, + 0xf74efd8e, + 0x07820499, + 0xb945e6c0, + 0x26018404, + 0x6a049945, + 0x03674ff6, + 0xbe630f9b, + 0x9bfffae2, + 0x3f9b624f, + 0xcc432b63, + 0x1010004d, + 0x10000d27, + 0xfffdedbe, + 0x10000d0c, + 0x9b634f9b, + 0x3f9b624f, + 0xcc432b63, + 0x65be1248, + 0x0fe6fffa, + 0xf45303d5, + 0xc405fe81, + 0x27031a5e, + 0xbd4027b0, + 0xd50778c4, + 0x9b077ccb, + 0x482764df, + 0x9b18dc53, + 0x002765f4, + 0xfff9f5be, + 0xfffd16be, + 0x007f4f27, + 0xf49b4000, + 0xbe002761, + 0xe0ff3412, + 0x0243d9dc, + 0x12dadcd4, + 0x20c4dcc0, + 0xbad8dce0, + 0xc0dce401, + 0x985e01ef, + 0xdbdce001, + 0xdcf00188, + 0xe401d4db, + 0x01dddddc, + 0x9b01735e, + 0x3353633f, + 0x27649f9b, + 0x9c53104c, + 0x65f49b10, + 0x00f249ea, + 0x9b013e5e, + 0x442764bf, + 0x5365f49b, + 0xb2f41cbc, + 0xdf9b012f, + 0x65f49b64, + 0xf41cdc53, + 0xc10122d4, + 0x1f9b3c72, + 0x623f9b63, + 0x422b4307, + 0x32074008, + 0x432b4107, + 0xc11341c8, + 0x411b3c74, + 0x010548e4, + 0xff38a6be, + 0xfc5e0626, + 0x614f9b00, + 0x8bbc73c1, + 0xf04ff643, + 0x15d2d000, + 0xc4bd4127, + 0xd1270778, + 0xd5b6f493, + 0x7cc4d5ff, + 0x00df5e07, + 0x01133d27, + 0xb5863d9b, + 0x230b2c07, + 0x03ab2d03, + 0x2c07091e, + 0x2d03230b, + 0xac030185, + 0x27e02711, + 0x101c2701, + 0x27644f9b, + 0x65f39b38, + 0x4c533207, + 0x5d300b18, + 0x0be40b34, + 0x300103a4, + 0x01edf4f1, + 0xea009201, + 0x27008e9a, + 0x27b02741, + 0x27d02710, + 0x2e3d110c, + 0x191e241d, + 0x27644f9b, + 0x65f39b38, + 0x3b0b3207, + 0x03184c53, + 0x9db10311, + 0x051e1334, + 0xed0be207, + 0x14dae459, + 0xf0d103e0, + 0x121e03f0, + 0xed1e1027, + 0x830b8907, + 0xa0278333, + 0xd56ef793, + 0x634f9b01, + 0x40e8482b, + 0xf093feff, + 0xc101d560, + 0x1f9b3c02, + 0x623f9b63, + 0x422b4307, + 0x32074008, + 0x432b4107, + 0xc11141c8, + 0x411b3c04, + 0xbe1948c4, + 0x06ff37bb, + 0x9b111e07, + 0x03c1614f, + 0x16438bbc, + 0x27091e45, + 0x27071ed1, + 0x27031ed4, + 0xbd4027d0, + 0xf605d2c4, + 0x2700b6df, + 0xd2c4bd41, + 0x00ad5e05, + 0x35be0c07, + 0x071eff50, + 0x94be0c07, + 0xd007ff50, + 0x07009a5e, + 0x5194be0c, + 0xf6d007ff, + 0x07008e0f, + 0x030c071c, + 0xbe072c1d, + 0x1eff4df0, + 0x27d0277f, + 0x6acb9da0, + 0x05d2cbbd, + 0x05d1cbbd, + 0x0185cbbd, + 0x03abcbbd, + 0x0298cbbd, + 0x04becbbd, + 0x0184cbbd, + 0x05d6cbbd, + 0x1e82cb9d, + 0xbe0c0755, + 0x07ff5306, + 0x270d56d0, + 0x40451ed3, + 0x4d07fedc, + 0xd4e04c23, + 0x9b17104c, + 0x4c2764af, + 0x65f49b10, + 0xa223a45b, + 0xa0c8d127, + 0x1ed02729, + 0x234d0725, + 0x48d0d04c, + 0x27102719, + 0x0027402c, + 0xff32bfbe, + 0xa3be0227, + 0xc4befff7, + 0x375efffa, + 0x27d12701, + 0x5df093a0, + 0x02c101d4, + 0x631f9b3c, + 0x07623f9b, + 0x08422b43, + 0x07320740, + 0xc8432b41, + 0x04c11341, + 0xc4411b3c, + 0xb8be1648, + 0x0fe6ff36, + 0x0c1e0085, + 0xc1614f9b, + 0x438bbc03, + 0xbe774fc6, + 0x27fff7a0, + 0x270496d1, + 0x614f9bd0, + 0x16404cdc, + 0xd412f493, + 0x3c44c101, + 0x2b633f9b, + 0xd6414843, + 0x1eb027d4, + 0x93b12703, + 0x01d3fbf4, + 0x994443c1, + 0x030b4e40, + 0xff3691be, + 0x10270027, + 0xbe402c27, + 0x27ff3230, + 0xf714be02, + 0xfa35beff, + 0xc6bfe6ff, + 0x53d50600, + 0x1efb70f4, + 0xc1f45305, + 0xbec405fb, + 0x93ff3355, + 0xffd202f0, + 0xfee3d2be, + 0xa85ed027, + 0x27d32700, + 0x270027a0, + 0x402c2710, + 0xff31f3be, + 0xd7be0227, + 0xf8befff6, + 0xd1c4fff9, + 0x78c4b91d, + 0xd14f8607, + 0xbe077cc0, + 0x27fee39f, + 0x78c4bd40, + 0xd5402707, + 0x1e077cc4, + 0xc8d7f64e, + 0x3f9b14a1, + 0x0ba33363, + 0xd4f4533a, + 0xd5c405fb, + 0x1e0780c3, + 0xfff49357, + 0x4a1eff4b, + 0x4682c499, + 0x84c4b948, + 0x99478601, + 0x46e66ac4, + 0x01be0c07, + 0xd007ff4d, + 0x073504cc, + 0x4a9fbe0c, + 0x1ed327ff, + 0x78f0932b, + 0x48beffd1, + 0xf493fee3, + 0xc101d32c, + 0x40994443, + 0x0bd0274e, + 0x35c0be03, + 0x32abbeff, + 0x0df453ff, + 0x1ec405fb, + 0x07d42703, + 0x4ef78e0d, + 0x1dfd93fc, + 0xcea701d5, + 0xd1feffff, + 0x0705d8d4, + 0xf6f48b0d, + 0x0ac49904, + 0xfc8e4266, + 0xf453fe0b, + 0x0399021c, + 0xd804d574, + 0x93312405, + 0x00054ff4, + 0xf493061e, + 0x27004548, + 0xd5202730, + 0x2705dc04, + 0x1704bd40, + 0xe403ad06, + 0x0c02d505, + 0xe003ad06, + 0xe203ad05, + 0x0802d505, + 0x114c2706, + 0x27a0f49b, + 0x3f1c804e, + 0xd1a9f49b, + 0x8705e804, + 0x50f49b44, + 0x05f804d1, + 0x41a34487, + 0xd150f49b, + 0x8705f004, + 0x9b42a344, + 0x04d150f4, + 0x44870600, + 0xf49b43a3, + 0x4efe0b50, + 0xbed007fc, + 0x9bfff5fa, + 0x37be630f, + 0x4f9bfff6, + 0x633f9b62, + 0x4ccc432b, + 0x0c270e20, + 0xf944be20, + 0x200c0cff, + 0x9b634f9b, + 0x2f9b634f, + 0x102c5364, + 0x12ff2cc4, + 0x53644f9b, + 0xab240748, + 0x644f9b2f, + 0xf49b4827, + 0xff2dc465, + 0x4f9b6dff, + 0x101c2764, + 0x9b65f19b, + 0x3007640f, + 0x4307315b, + 0x4dc04453, + 0x07200ffd, + 0x1c4c5340, + 0x2e0d4cc0, + 0x9b644f9b, + 0x0f9b65f1, + 0x5b300764, + 0x53430731, + 0xfd4dc444, + 0x23070f0f, + 0xff002da3, + 0x9b644f9b, + 0x1a1e65f1, + 0x4c534007, + 0x0d4cc41c, + 0x53230718, + 0x002da328, + 0x644f9bff, + 0xf49b4827, + 0x634f9b65, + 0x091e1127, + 0x9b644f9b, + 0x102765f1, + 0x44534207, + 0x4dc44fab, + 0x073e0ffd, + 0x0cd3d142, + 0x0f4c8306, + 0x763243ce, + 0x644f9b15, + 0x9b104c27, + 0x402765f4, + 0x05e4d4ad, + 0x05e0d4ad, + 0x05e2d4ad, + 0xf49b4027, + 0x54f49b53, + 0x060cd4d1, + 0x4103c027, + 0xd4d54783, + 0x0c1e060c, + 0x27644f9b, + 0xf49b104c, + 0x27c12765, + 0x0000404f, + 0x61f49b40, + 0xd15ef093, + 0x3c02c101, + 0x9b631f9b, + 0x4307623f, + 0x4008422b, + 0x41073207, + 0x41c8432b, + 0x3c04c111, + 0x48c4411b, + 0x33b9be13, + 0x1e0d26ff, + 0x614f9b0b, + 0x8bbc03c1, + 0xbe4ba643, + 0x56fff4a4, + 0x21f29306, + 0x24c101d1, + 0x633f9b3c, + 0x41cc432b, + 0x11f49316, + 0x43c101d1, + 0x4e409944, + 0x030bc127, + 0xff33a5be, + 0x24c1111e, + 0x4e209944, + 0x97be040b, + 0x0427ff33, + 0x4027fc8e, + 0x0608d4d5, + 0x4127c626, + 0x0617d4bd, + 0x56cef493, + 0xdcd4d5ff, + 0x09f41305, + 0xd4d50027, + 0xfc8e05d8, + 0xd007f74e, + 0xf49b4027, + 0x05c8be74, + 0xea04ec00, + 0xa501e001, + 0xb5fb9301, + 0xf89301d0, + 0x27ff56a0, + 0xf993107c, + 0xc101d180, + 0x3f9b3cb4, + 0x4c432b63, + 0xbd412741, + 0xd50617d4, + 0x9b05dcd8, + 0x4f9b622f, + 0xcc242b63, + 0x2c10002d, + 0x9b3cb4c1, + 0x432b633f, + 0x9b2142d2, + 0x43be630f, + 0x0d27fff4, + 0x5bbe1000, + 0x0dccfff7, + 0xc10d1000, + 0x3f9b3cb4, + 0xfa432b63, + 0x27015804, + 0xdcd4d1a0, + 0x8b0d0705, + 0x9bc007f4, + 0x4506744f, + 0x9b644f9b, + 0xb2c165f7, + 0x631f9b3c, + 0x07623f9b, + 0x08422b43, + 0x07320740, + 0xc8432b41, + 0xb4c11241, + 0xc4411b3c, + 0xa0be1548, + 0x0fc6ff32, + 0x9b0c1e78, + 0xb3c1614f, + 0xc6438bbc, + 0x4f9b6b4f, + 0x404cdc61, + 0xf382be12, + 0xc105b6ff, + 0x3f9b3cb4, + 0xcc432b63, + 0xb4c11341, + 0x4eb09944, + 0x8fbe040b, + 0x7abeff32, + 0x501eff2f, + 0xd4d1ac66, + 0xd4d50610, + 0xd4a905e0, + 0xd4ad0614, + 0xb09905e4, + 0x44b4c14e, + 0x6bbe040b, + 0x4dbeff32, + 0xd4a9ff3e, + 0x4f8b05e0, + 0xa953f49b, + 0xa905e2d3, + 0x8b05e4d4, + 0x103c333f, + 0xf49b43ab, + 0x008e5e54, + 0x9917c1c4, + 0xb4c14eb0, + 0xbe040b44, + 0x27ff323a, + 0x17d4bd41, + 0xdcd8d506, + 0x23900905, + 0x16900d01, + 0xbe090705, + 0x07000809, + 0x44a027c0, + 0xffffff0f, + 0xbea127ff, + 0x00000519, + 0xffffffcf, + 0x2ac1c8ff, + 0xd4899349, + 0x2243c22a, + 0x05cad4b9, + 0xd4d147a6, + 0xd3a90608, + 0x410305c8, + 0x0608d4d5, + 0x460b43ca, + 0x53002735, + 0x1efccaf4, + 0x93a7e633, + 0x01d00ff2, + 0xd4892349, + 0x2743222a, + 0xb9f78e00, + 0x260617d4, + 0x9d412746, + 0x091ee324, + 0xfe75cff6, + 0xf78e0427, + 0x0004bcbe, + 0xf4930327, + 0xd5ff54ac, + 0x8e05d8d4, + 0x534f9bf7, + 0x05e0d4ad, + 0x07543f9b, + 0x104c5343, + 0x05e2d4ad, + 0x05e0d4d1, + 0x05e4d3ad, + 0x0610d4d5, + 0x05e4d4a9, + 0xd4ada127, + 0x7dbe0614, + 0x7e5eff3d, + 0x4ef78efe, + 0x3bcf5bf0, + 0x4efe2bdf, + 0xbe0f07fc, + 0x0effeb4d, + 0x0bf00efc, + 0x004f27ff, + 0x29100790, + 0x004f2743, + 0x291007a0, + 0xfc3d1044, + 0x10ff1e03, + 0x1e03fc4d, + 0x2b0307ff, + 0x03000c04, + 0x2703fc0d, + 0x27010c41, + 0x0b040740, + 0x07fd4efe, + 0xad85bed0, + 0x0cd499ff, + 0xd49944b6, + 0x2304070e, + 0x0b300701, + 0x0434993d, + 0x270b42c4, + 0x04349d41, + 0x1e0cd09d, + 0xff4ea714, + 0xd239fd4f, + 0x41274301, + 0x42ab433b, + 0x00a7d43d, + 0xf49b4027, + 0xff3ea70e, + 0x34c5fd4f, + 0x4efd8e38, + 0xbed007fd, + 0x99ffad3b, + 0x44b60dd4, + 0x070ed499, + 0x07012304, + 0x993d0b30, + 0x45960434, + 0x349d4127, + 0x0dd09d04, + 0x2d07181e, + 0x4ea72203, + 0x39fd4fff, + 0x27430121, + 0xab433b41, + 0xa7243d41, + 0x9b402700, + 0x3ea70ef4, + 0xc5fd4fff, + 0xfd8e3834, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x4f27fe4e, + 0x40004000, + 0x9bb0f49b, + 0x41d8a24f, + 0x9b4227fb, + 0x0499a2f4, + 0x27412074, + 0x275d1e00, + 0x52f49b40, + 0x9b51f49b, + 0xe3a652ef, + 0xf49b4027, + 0x51f49b52, + 0xa6520f9b, + 0x9b402703, + 0xf49b52f4, + 0x521f9b51, + 0x402713a6, + 0x9b52f49b, + 0x2f9b51f4, + 0x2723a652, + 0x52f49b40, + 0xf49b4127, + 0x523f9b51, + 0x402733a6, + 0x2752f49b, + 0x51f49b42, + 0xa6524f9b, + 0xab0eab43, + 0xab02ab01, + 0x9b04ab03, + 0x44c6744f, + 0xfe8e0127, + 0x01830153, + 0x0000fe8e, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x65befd4e, + 0xd0070003, + 0xf4930a96, + 0x2701cc79, + 0xa7421930, + 0xfeffff4e, + 0x0c0843bd, + 0xbb0df393, + 0x5df493fe, + 0x430501cc, + 0xd8be2686, + 0xf493fee0, + 0x9902657c, + 0x44d60544, + 0xffe7c7be, + 0xfd8e0d07, + 0xf493fe4e, + 0x1901cc41, + 0x934aa644, + 0x02655ff3, + 0x66053499, + 0x06349949, + 0x349948d6, + 0x1f41dc04, + 0x4cd43459, + 0x0ea71910, + 0xbefffb43, + 0xccff8bc2, + 0x16be0d04, + 0x89be0040, + 0x0027ffe7, + 0x04befe8e, + 0x04ccfff9, + 0xa730270f, + 0xfeffff4e, + 0x0c0843bd, + 0x932403c4, + 0x01cbf0f4, + 0x45864419, + 0xf4933027, + 0x9d02650c, + 0x03c40643, + 0x55f3530e, + 0xd1f493ff, + 0x430501cb, + 0xfe8e0027, + 0x1499fb4e, + 0x07e30710, + 0x5bc307b2, + 0x07245be4, + 0x51cb2bd1, + 0x27e24e11, + 0x1ee02730, + 0x87e1830d, + 0x8b4d0b4e, + 0x2b4e6131, + 0x872183c3, + 0x614d0b42, + 0x0b1b8b44, + 0x05033541, + 0x250c1504, + 0x4efb8e0e, + 0x07a007f6, + 0xe1ad9980, + 0x07308c03, + 0xbe9a0708, + 0x030004d4, + 0x60075c9c, + 0xc9be0907, + 0xac990004, + 0x2b7007e0, + 0x06cf6bcd, + 0x03bd07cf, + 0x07b123b1, + 0x07d383db, + 0x8744334d, + 0x0b340b3d, + 0x9834c13a, + 0x462b0807, + 0x414cb103, + 0x2b9c34c1, + 0x0e41c847, + 0xbe27c4d0, + 0x07ff3eea, + 0x3ee4be09, + 0x332d87ff, + 0x0b2d0bd4, + 0x20a4d12a, + 0xa023c101, + 0x4305c123, + 0x34c24411, + 0x8e01270f, + 0xbea021f6, + 0x27ffeb8d, + 0xc1f68e00, + 0xa3819024, + 0x879422c1, + 0x05340b44, + 0xe1ab9d32, + 0xc066b103, + 0xfd4e941e, + 0xcbcef093, + 0x96040901, + 0x0377be45, + 0x2704d600, + 0x93fd8e07, + 0x01cbbbfd, + 0xc613d499, + 0x8e002744, + 0x69d329fd, + 0x0bd209d4, + 0x07422b43, + 0x1ad48d0d, + 0xbe300c03, + 0xc10003b0, + 0xd3c138d4, + 0xc5402b3c, + 0x30c234d4, + 0x210d0714, + 0x300c03d1, + 0xbcbe2027, + 0x04d6ff3e, + 0xfd8e0827, + 0xcbd2f093, + 0x0386be01, + 0x6df29300, + 0x24c101cb, + 0x6823c164, + 0x24c5402b, + 0x1430c260, + 0x21210207, + 0x275c0c03, + 0x3e8dbe20, + 0x2704d6ff, + 0x93fd8e09, + 0x01cb47fd, + 0x3616d499, + 0x7e0d0745, + 0x0536fecf, + 0xd49d4127, + 0x8e002713, + 0x93f84efd, + 0x01cb2bfc, + 0xe313c499, + 0x214fe6f3, + 0x69c42901, + 0x0bc309c2, + 0x1ac48924, + 0x242b232b, + 0x40272556, + 0x5e13c49d, + 0xc4890108, + 0x38cdc12c, + 0x0c07f44d, + 0x0c03c4a1, + 0x6df42530, + 0x0306bef2, + 0x07d02b00, + 0x64c8c10c, + 0xbe5c0c03, + 0xc10002f8, + 0x802b34c2, + 0x0f071c07, + 0x03301c03, + 0x3d070c0c, + 0xc1fe237e, + 0x0f0760c2, + 0x0c031c07, + 0x5c1c0324, + 0x117e3807, + 0x16c499fe, + 0xc48948e6, + 0x88c0c11a, + 0x2c271f07, + 0xbef40d3c, + 0xc1ffe9a3, + 0xc48988c3, + 0x3c3c038c, + 0xc48d4103, + 0x88c3c58c, + 0x2700895e, + 0xa0f49b41, + 0x2f071f07, + 0x0344c9c1, + 0x3c2c0314, + 0x34013107, + 0x03b0f49b, + 0xf732ce34, + 0xac03ad07, + 0xcb4a0738, + 0x0b49c24d, + 0x498b4a07, + 0xda0744c6, + 0xf193df1e, + 0x9901ca5c, + 0x1c99e01b, + 0x834b0740, + 0x871e4943, + 0x26138924, + 0x10894433, + 0x07240b1a, + 0x5b3e9b4d, + 0x0b210b4c, + 0xc5418330, + 0x2ac59023, + 0x9c28c598, + 0x1c314487, + 0xf369410b, + 0x44c11e69, + 0x0bd98b48, + 0x0b0e2b3c, + 0xc5300b4d, + 0x24c5a023, + 0x9db10394, + 0x3027e01b, + 0xca06f493, + 0x13439d01, + 0xf88ef3c3, + 0xfc93fa4e, + 0x9901c9f8, + 0x44d612c4, + 0xfa8e0027, + 0x00db44e4, + 0xcd29c369, + 0xcb31c409, + 0xd42bd30b, + 0xbd0bb32b, + 0x0134cbd5, + 0xa27eca49, + 0x694027fe, + 0x8dc40dc3, + 0xd3c21acd, + 0x20c4d111, + 0x033b0701, + 0x11430531, + 0x4034e244, + 0xb1fd9301, + 0x002701c9, + 0x00015abe, + 0x8616d499, + 0xbe0d0747, + 0x07ff3a2d, + 0x300c030d, + 0x0003d5be, + 0x0c030d07, + 0x03ccbe5c, + 0x07181e00, + 0x300c030d, + 0x0003c1be, + 0x0c030d07, + 0x03b8be5c, + 0x7e0d0700, + 0xccbefd07, + 0xf093ffe8, + 0xbe01c99c, + 0x9300043a, + 0x01c9bff0, + 0x000431be, + 0xc95afd93, + 0xbed02101, + 0xd1ffe8f1, + 0x99012cd3, + 0x34993932, + 0x1d42c204, + 0x66e3d499, + 0x3433c145, + 0x0134d3d5, + 0x42070f1e, + 0x349d4103, + 0x27002739, + 0x00b05e41, + 0x4fff4ea7, + 0x934311fd, + 0x01c91ff4, + 0x013c43d5, + 0xbde34399, + 0x1e013343, + 0x1e43c421, + 0x0c030c07, + 0x0344be30, + 0x030c0700, + 0x3bbe5c0c, + 0xc4d10003, + 0x44c1012c, + 0x34c4d534, + 0xedfd9301, + 0xc22701c8, + 0xfaf30ea7, + 0x12dc9dff, + 0xfff9c6be, + 0x0627002c, + 0xd3d1fa8e, + 0x40070130, + 0x43f54433, + 0xff00051c, + 0x0134d3d1, + 0x052043f5, + 0xd3d1ff00, + 0x43f50138, + 0xff000524, + 0x013cd3d1, + 0x052843f5, + 0xf493ff00, + 0xfd01c7c9, + 0x0005100c, + 0xf64419ff, + 0xff3ea747, + 0x4127ffff, + 0x063634bd, + 0x270f3399, + 0x0ef49b40, + 0x33874127, + 0xb04034f5, + 0x0027ff02, + 0xd49d4027, + 0x89fa8e12, + 0xc38126c4, + 0xd40b4a9b, + 0x430b4d87, + 0x43053027, + 0x07feb05e, + 0xa9432940, + 0x2d011c00, + 0x0d032b40, + 0x0bfe0b40, + 0x29fd4efe, + 0xe4048903, + 0x4322d007, + 0xe01efd0e, + 0xfffd10be, + 0x16e3d499, + 0x31d44948, + 0x894103d2, + 0xd44de4d3, + 0x4027230b, + 0xd389d149, + 0x35d42d10, + 0x07312ad2, + 0xa7b93e0d, + 0x4efd8e00, + 0x3c11c1fb, + 0x01a5f063, + 0xd0073119, + 0xfb29f205, + 0x66befc09, + 0x05c6ff39, + 0x4027d369, + 0xdb4d3c1b, + 0xd32dd40d, + 0xfb8ef043, + 0x0499fd4e, + 0x27412412, + 0x39fd8e00, + 0x9be5360e, + 0x4144b14f, + 0x4f9bfa1e, + 0x1943a6a2, + 0x07432702, + 0xf5333332, + 0x02120034, + 0x0031f1ff, + 0x47ff0210, + 0x181c33d2, + 0xd61d1c53, + 0x1e002714, + 0x8725331c, + 0x0423f14e, + 0x99ff0218, + 0x40f11002, + 0xff021600, + 0x030b1123, + 0x010b123b, + 0x42273d87, + 0x120034f5, + 0xfd8eff02, + 0x14470419, + 0x31871103, + 0x34f54327, + 0xff021200, + 0x100032f1, + 0x2c33ff02, + 0x1d2c5318, + 0x410726a6, + 0x03994433, + 0x0444f110, + 0x23ff0218, + 0x0b233b21, + 0x27318724, + 0x0034f542, + 0x21ff0212, + 0x0034f100, + 0xdcff0210, + 0x022bf848, + 0xfe4efe0b, + 0x41834107, + 0x87110399, + 0x2b400b44, + 0xd84e6131, + 0x9119803c, + 0x19028101, + 0x0b438713, + 0x034e0542, + 0x99131d31, + 0x41031104, + 0x8e11049d, + 0x390419fe, + 0xf5453300, + 0x02180041, + 0x0442f5ff, + 0x27ff0218, + 0x004e2330, + 0x4335fde8, + 0xe8004e03, + 0x1040f5fd, + 0xf5ff0218, + 0x02181442, + 0xf04e23ff, + 0x4335fde7, + 0xfc4efe0b, + 0x0019d007, + 0x30074327, + 0xe0073333, + 0xdc39d129, + 0x34f5e333, + 0xff021200, + 0xe4f13047, + 0xff021000, + 0x27f848dc, + 0xf5310324, + 0x021200e2, + 0x073387ff, + 0x0032f541, + 0x03ff0212, + 0x272c874a, + 0x0023f530, + 0x83ff0216, + 0x20070f4c, + 0x23331653, + 0x33141c33, + 0x41ab104c, + 0x140023f5, + 0x24f5ff02, + 0xff021404, + 0x270ef39b, + 0x9dd35540, + 0xd33504d4, + 0xfa4efc8e, + 0x04990319, + 0x07333304, + 0x07c427a2, + 0x6bb107d0, + 0x03c42baf, + 0x0034f134, + 0x33ff0210, + 0x4c53184c, + 0xda44131d, + 0xd231f04c, + 0xd1212566, + 0x2a7e0d07, + 0x51c123ff, + 0x412566d2, + 0x7e0d07d1, + 0xc123ff1d, + 0x1b074d07, + 0xb6274803, + 0x12013627, + 0x4205b123, + 0x44031403, + 0xc6e6f398, + 0x2626d231, + 0xd121a5e6, + 0xf67e0d07, + 0x35c127fe, + 0x27031edb, + 0x04dc9dc1, + 0xfa4efa8e, + 0x4fff4ea7, + 0x074d01fd, + 0xa3d433c0, + 0x1ea407d8, + 0x01f4e803, + 0x564627cb, + 0xa401beb3, + 0x27c401ff, + 0x05449630, + 0x0ef39bcd, + 0x0138abc5, + 0xe4d4cec4, + 0xfc4efa8e, + 0x07120499, + 0x8942e4d0, + 0x210d0700, + 0xfdc67edc, + 0x3527d419, + 0xc02b4333, + 0x120043f5, + 0x0d07ff02, + 0xcefe177e, + 0xd119e4c0, + 0x31074127, + 0xd49dd239, + 0x33dc2512, + 0xf5442733, + 0x02120034, + 0x873107ff, + 0x33402722, + 0x0024f533, + 0x03ff0216, + 0x29432734, + 0x0034f5d0, + 0x07ff0212, + 0x0024f123, + 0xdcff0210, + 0x4007f848, + 0x4a033427, + 0x120023f5, + 0x4c83ff02, + 0x5321070f, + 0x33233306, + 0x3027140c, + 0xab104c33, + 0x0023f540, + 0xf5ff0214, + 0x02140424, + 0x0ef39bff, + 0xfb4efc8e, + 0x04990d21, + 0x110c9910, + 0xd45bd123, + 0x4d2b4c07, + 0x4cd8b007, + 0x0ea72b80, + 0x7effffdf, + 0xdf6bff1a, + 0xc4070a1e, + 0x1c07cf6b, + 0x07fdc57e, + 0x0741034c, + 0xefdcce0b, + 0xf49b4027, + 0xdf3ea70e, + 0x3405ffff, + 0x0000fb8e, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x40004f27, + 0xf49b4000, + 0x690299b0, + 0xd8a24f9b, + 0x4227fb41, + 0x99a2f49b, + 0x42e47404, + 0x40270092, + 0x9b52f49b, + 0x3f9b51f4, + 0x2733a652, + 0x52f49b40, + 0x9b51f49b, + 0x43a6524f, + 0x24001127, + 0x34ab1027, + 0x40271806, + 0x9b52f49b, + 0x2f9b51f4, + 0x2723a652, + 0x52f49b40, + 0x9b51f49b, + 0x43a6524f, + 0x34ab32ab, + 0xf49b4027, + 0x9b412752, + 0x4f9b51f4, + 0xab43a652, + 0x27166634, + 0x52f49b40, + 0xf49b4127, + 0x524f9b51, + 0x34ab43a6, + 0xf49b4027, + 0x9b422752, + 0x4f9b51f4, + 0xab43a652, + 0x27166634, + 0x52f49b40, + 0xf49b4227, + 0x524f9b51, + 0x34ab43a6, + 0x01273238, + 0x0027031e, + 0xc6744f9b, + 0x0b012744, + 0x964127fe, + 0x07402704, + 0x00fe0b04, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x8c7ef393, + 0x44340101, + 0x01a85c4f, + 0x40f45300, + 0x0b340501, + 0xcf4fc4fe, + 0x130001a8, + 0x00bef453, + 0x30273405, + 0x2586f493, + 0x06439d02, + 0xff1efe0b, + 0xa7633f9b, + 0xffffff2e, + 0x0e1c24d1, + 0x1027432e, + 0x23d5071e, + 0x11270e1c, + 0x8c42f493, + 0x4843c101, + 0x04003d14, + 0x04003d27, + 0xffff2ea7, + 0x2024d1ff, + 0xd5342e0e, + 0x270e2023, + 0x4400c111, + 0x062424d1, + 0x20d5042e, + 0x031e0624, + 0x0ea715e6, + 0x39fffb43, + 0x9e44c604, + 0x0bff4ad8, + 0xbefe4efe, + 0xbeff4a06, + 0x93fef030, + 0x022517f4, + 0x24544499, + 0xfe0e204c, + 0xff01219e, + 0x799efe0e, + 0xfe4eff02, + 0x24fef493, + 0x54449902, + 0xbe204c24, + 0x1eff0108, + 0x0260be05, + 0xef82beff, + 0x9efe0efe, + 0x4eff49dc, + 0x9d4127fe, + 0xd73e0604, + 0xffa72bbe, + 0xfe8e0027, + 0xf493fc4e, + 0x270224cc, + 0x54429930, + 0x2465439d, + 0xb6be202c, + 0x051eff00, + 0xffb31bbe, + 0x04ccd007, + 0xa7302718, + 0xfeffff4e, + 0x0bfc43bd, + 0xf57e0344, + 0x1ed027fe, + 0x3802c43b, + 0x2496f093, + 0x7ec00702, + 0xc499ff14, + 0xa7479605, + 0xfeffff4e, + 0x3ea74411, + 0xd1ffffff, + 0x87062433, + 0x8843f544, + 0x1eff000e, + 0x07d4280f, + 0x75f4be0d, + 0x0e0c07fe, + 0x07811efc, + 0x4efc8e0d, + 0x59fd93fb, + 0xb0270224, + 0xbe65db9d, + 0x0700008f, + 0x7e0d07c0, + 0xc4ccfecc, + 0xff4ea755, + 0x4bbdfeff, + 0xc9360bfc, + 0x99fe8b7e, + 0x4ba605d4, + 0xb606d499, + 0x04d4994a, + 0x592e41dc, + 0x104cd4d4, + 0x430ea728, + 0x9bbefffb, + 0x08ccff4a, + 0xc4281e1c, + 0x0e1e25c1, + 0x93be0c07, + 0x0d07fe75, + 0x205efb0e, + 0xfe527eff, + 0x0f1ec027, + 0xbefef57e, + 0x1effa648, + 0x05d49906, + 0x0c074016, + 0x4ea7fb8e, + 0xc1ffffff, + 0x44b9fc43, + 0x03ca0100, + 0xc2430b13, + 0x0c830e40, + 0xf903330f, + 0x00007c00, + 0x27fe0bff, + 0x4efe0b00, + 0xbdf393f5, + 0x39c10223, + 0x83f16344, + 0x00000f9f, + 0x5037c180, + 0x9123904c, + 0xfff09fa3, + 0x9103ffff, + 0x4ff63439, + 0x3459022f, + 0x27104c30, + 0xb85e160c, + 0x8031c103, + 0xf3253027, + 0x21102c27, + 0x3b3127f4, + 0x8b430734, + 0x07461641, + 0x9341ab43, + 0x022373f3, + 0x1e8034c5, + 0x03f3210a, + 0xf0f32531, + 0xf121def2, + 0x9d3c72c1, + 0x39074071, + 0x87062299, + 0x2b353349, + 0x41729d34, + 0xf2934307, + 0xc1022348, + 0x4333442d, + 0x73c1432b, + 0x38719934, + 0x0b1cdc33, + 0x21d3ab42, + 0xa9f135f6, + 0x07045043, + 0x4e44a91d, + 0x83633304, + 0xffffff1f, + 0x9bfc310f, + 0x5c61f543, + 0xf5ff0005, + 0x00056064, + 0x0bc333ff, + 0x4422c1c2, + 0x0108cba9, + 0x010ac4a9, + 0x62f5f145, + 0x0003cdb0, + 0x3632b4da, + 0x800c2747, + 0x00001e27, + 0xbe202701, + 0x27ff456f, + 0xc0d510ac, + 0x0f1e0104, + 0xc0d11407, + 0x14330104, + 0x81bea447, + 0xf431ff44, + 0x4aed4333, + 0x0003ce36, + 0x3b07f431, + 0x44f14333, + 0x0003ce30, + 0x340b3333, + 0x22aef493, + 0x791b0702, + 0x03382340, + 0x03530711, + 0x03f1f058, + 0x3a011f1e, + 0x4acb4d07, + 0x4c532d07, + 0x2b38111c, + 0xcc46f62a, + 0xb1231320, + 0x0fe63823, + 0xda1e00fb, + 0x8f27a027, + 0x80000000, + 0x4333f431, + 0xce3444e9, + 0x4bd20003, + 0xee540113, + 0x8300de4d, + 0xffffff4f, + 0x6064f50f, + 0x07ff0005, + 0x1c4c534d, + 0x35333407, + 0x342b4487, + 0xc333c307, + 0x0c07c32b, + 0x0f033f07, + 0x0003d154, + 0x2f071d07, + 0xb9be3403, + 0xf411fe98, + 0xc4f14606, + 0x0003d1a0, + 0x340b3087, + 0x34054027, + 0x23108cf4, + 0xcb4a0702, + 0x1c4c534d, + 0x02184ff6, + 0xf1414807, + 0x41f54333, + 0xff000560, + 0x055c44f1, + 0x41e2ff00, + 0x05270202, + 0x2411701e, + 0x34152101, + 0x28233105, + 0x33104c34, + 0xb443f543, + 0x230003cd, + 0xe753ca38, + 0xf1314907, + 0x45333987, + 0x3407432b, + 0x1f031333, + 0x0003cd2c, + 0x12a93333, + 0x342b0108, + 0x2103f421, + 0x43335415, + 0x010812ad, + 0xcdb445f5, + 0x5d050003, + 0xcd2c3f03, + 0xf4250003, + 0x043434b9, + 0x219af293, + 0xbd410302, + 0x59043434, + 0x03312724, + 0x5d233d41, + 0x27191e24, + 0x81f29301, + 0xf1210221, + 0x278023c1, + 0xeb413b41, + 0x8023c534, + 0x2701965e, + 0xa8d3be00, + 0xff4ea7ff, + 0x3027fdeb, + 0x2f274305, + 0x0b020000, + 0xf39b4215, + 0x51fb930e, + 0xb6390221, + 0x00de61e4, + 0x813c74c1, + 0xc24801b3, + 0xbcc15683, + 0xdf0ea744, + 0xefbeffff, + 0xdc07ff43, + 0x990fdc83, + 0xd33324b0, + 0x20271c07, + 0x0080daf9, + 0xa5beff00, + 0xc007feb3, + 0x74810686, + 0x340b3a87, + 0x30054a07, + 0xd4fd4103, + 0xff000080, + 0xffdf0ea7, + 0x4395beff, + 0x27c4f6ff, + 0x011d5e06, + 0x0724b399, + 0x85433b46, + 0xc1bc75b4, + 0xf2933c7c, + 0x890220e4, + 0xc4494a23, + 0x34ce2d71, + 0x071d073e, + 0xbe002728, + 0x07fecab5, + 0xa72c0738, + 0xf7ffff1e, + 0x24013253, + 0x14d52403, + 0xf3a80118, + 0x20b6f493, + 0x81437102, + 0x0bcc4942, + 0xc5282b38, + 0x4dc53c7d, + 0x8543754c, + 0x4a4c8d42, + 0x22c1071e, + 0x3c72c54c, + 0x39874907, + 0x432b4533, + 0x13331407, + 0x1f03142b, + 0x0003d154, + 0x207ef093, + 0xbe270702, + 0x27fecad8, + 0x71f49332, + 0x433d0220, + 0xfb430ea7, + 0xb905beff, + 0x24d007ff, + 0xffffff0f, + 0x150c27ff, + 0x40077e1e, + 0x43337c09, + 0x04d041f1, + 0x2c07ff00, + 0xb4070027, + 0xfeca28be, + 0xfb34be23, + 0x07c253ff, + 0xff2ea737, + 0x3401f7ff, + 0x24d53403, + 0xfca80118, + 0x8ebe0027, + 0x7409ffa7, + 0x201efc93, + 0xc1b40502, + 0x73c568c3, + 0xfd422750, + 0x0004c0d4, + 0x430ea7ff, + 0x0439fffb, + 0xb1be44c6, + 0x4027ff45, + 0xc43d0027, + 0xf4311e1e, + 0x4f034333, + 0x0003cd2c, + 0x010843a9, + 0x010444d1, + 0x340b3333, + 0x28232307, + 0x43fe005e, + 0x4ef58ef1, + 0xff4ea7fb, + 0x4cb9ffff, + 0x43b90e26, + 0xd2070e27, + 0x221eb407, + 0x0e2844f1, + 0x3e07ff00, + 0x402b1405, + 0x40c83f6b, + 0x6822f90d, + 0x27ff000e, + 0x8ed21d01, + 0x27b3bdfb, + 0x8323070e, + 0xe3070f2c, + 0xe1034287, + 0x27d2c3ce, + 0xa7fb8e00, + 0xffffff3e, + 0x0e2734b9, + 0x34bd4103, + 0xfe0b0e27, + 0x3ea7f94e, + 0xd1fbffff, + 0x0702183a, + 0x1f9c539a, + 0x3c234f9b, + 0x0000004f, + 0x1ee02701, + 0x103ed105, + 0x9395b602, + 0x023c6bf4, + 0xc58043c1, + 0x4e078443, + 0x43e44383, + 0xbea7009a, + 0xb9ffffff, + 0xb90e26b1, + 0x070e27b4, + 0x07411b0e, + 0x272f6b24, + 0xfd93104c, + 0x33023c40, + 0x422b1d0c, + 0xc11f0c53, + 0xc02780d3, + 0xc1274210, + 0x2b102cd4, + 0x4f834a07, + 0x0fffffff, + 0x2c832107, + 0x33342b0f, + 0x03428733, + 0x2843f511, + 0xfdff000e, + 0x000e6820, + 0x26b1bdff, + 0x9b40270e, + 0xc5160ef4, + 0xb4bd4127, + 0xd4c10e24, + 0x90d3c188, + 0x305b4103, + 0x8b88d4c5, + 0xe335e63c, + 0xa7e8a3e3, + 0xfbffff4e, + 0x02104ed5, + 0xb4bd4127, + 0x3616063b, + 0xfedf95be, + 0xe394d4c1, + 0x94d4c543, + 0x9ff6f98e, + 0xf39300f1, + 0xa7023bbc, + 0xffffff4e, + 0x0b9a4db9, + 0x99803bc1, + 0xa0279a34, + 0x2300815e, + 0x07e21141, + 0x031f6b14, + 0xc6e00141, + 0xc49d6d2f, + 0x10d2079a, + 0x0000012f, + 0x00df2701, + 0x07010000, + 0x833d0710, + 0xa7370317, + 0xfde75f4e, + 0x07e3310b, + 0x37e34005, + 0x00274315, + 0x2ea74035, + 0x27fde74f, + 0x24050e4c, + 0x4d072315, + 0xffff4f83, + 0x4fa30fff, + 0x80000000, + 0x351c1c33, + 0xa741ab20, + 0xfbffff3e, + 0x021834d5, + 0x0180c4c1, + 0xc54d0be3, + 0xe41180c4, + 0x4d2b3d0b, + 0xe305e415, + 0x41071d1e, + 0xed07a127, + 0xec83e42b, + 0x03e3330f, + 0x03ea40ef, + 0xf6c30700, + 0x9dff6e4f, + 0xf4939a34, + 0xc1023b0c, + 0xb4ce8044, + 0xff3ea70f, + 0x3411fd9f, + 0x00004ee3, + 0x26341502, + 0xff3ea7a8, + 0x4127ffff, + 0x063534bd, + 0x270f3399, + 0x0ef49b40, + 0x33874127, + 0xb04034f5, + 0xf98eff02, + 0xf49b4027, + 0x00f98e0e, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0xff01020c, + 0x00037e80, + 0x00000001, + 0x00000000, + 0x00000003, + 0x00000004, + 0x1007fd4e, + 0xd1871f6b, + 0x7fe8df03, + 0x08530003, + 0x01103f9b, + 0xadf293d4, + 0x2e6100cf, + 0xd405432b, + 0x9908e19d, + 0x3ea71624, + 0x9dfd4fff, + 0x248909e4, + 0x99e44d08, + 0x21890c24, + 0x0b32110a, + 0x05e46d41, + 0x2707f6e2, + 0x0ef49b40, + 0xff8b0007, + 0x30274027, + 0xe39de405, + 0x102f9b08, + 0x420bd401, + 0xfd8ed405, + 0x42734007, + 0xf4e84103, + 0x4007e31e, + 0x45334903, + 0x180042f5, + 0x100bff02, + 0x180443f5, + 0x2027ff02, + 0xe8004e23, + 0x034235fd, + 0xfde8004e, + 0x181041f5, + 0x43f5ff02, + 0xff021814, + 0xe7f04e23, + 0x0b4235fd, + 0xff4ea7fe, + 0x40d5f7ff, + 0x22530100, + 0x340725c6, + 0x010834d1, + 0x14031405, + 0xfe0bf2a8, + 0x4ea7f84e, + 0x99ffffff, + 0x44d10a03, + 0xb0070108, + 0x076c3fc6, + 0x074853a4, + 0x539f6b94, + 0x030710ac, + 0x8027eb07, + 0xd027c0a7, + 0x0758e299, + 0x33320742, + 0x2b353343, + 0xff2cc034, + 0x8c34f113, + 0x27ff0001, + 0xd81d3b11, + 0x0400004e, + 0x03c1eb26, + 0xf0e103d1, + 0xb441d7f0, + 0xb431842e, + 0xa7204cce, + 0xf7ffff4e, + 0xc5444cc5, + 0x00274848, + 0xbc35b845, + 0x92cef88e, + 0x338d07db, + 0x8aab108c, + 0x0427d21e, + 0xc027f88e, + 0xcf1e8027, + 0x4ea7fd4e, + 0x01f7ffff, + 0x07d00743, + 0x0d38dc01, + 0xfd8e16b6, + 0x10060e27, + 0xfea67e27, + 0x5d7e0d07, + 0x8e0276ff, + 0x5efd0efd, + 0xfc4efe98, + 0xdea7c007, + 0x1ef7ffff, + 0x2141dc0b, + 0x640a0d27, + 0x01fe837e, + 0x0f44dcd4, + 0x07ef48d8, + 0x3e10270c, + 0xd8d401b4, + 0x0227f344, + 0xfe410d9e, + 0x0000fc8e, + 0x0003e81c, + 0x0003e80f, + 0x0003e81b, + 0x0003e807, + 0xf1a3f54e, + 0x9107a007, + 0xa469161e, + 0x450b4c2b, + 0x41c84f8b, + 0xd9f41364, + 0x0a074101, + 0xa7ff777e, + 0xffffff2e, + 0x010224a9, + 0x010423a9, + 0x92a9c407, + 0x4307016a, + 0x422b4c1b, + 0x9da96407, + 0x6fab0168, + 0xf305d62b, + 0x3ea7d123, + 0x99feffff, + 0xd0e80934, + 0x438301a0, + 0x34333407, + 0x342b4487, + 0x005432f1, + 0xa401ff00, + 0x7e237307, + 0xe2ffffb4, + 0x99018f24, + 0xa59909a4, + 0x934fd608, + 0xb1279231, + 0x1207f235, + 0x1c837419, + 0x0473990f, + 0x83071333, + 0x3e233107, + 0xf9ffff84, + 0x00007c12, + 0x45f415ff, + 0x278200f3, + 0x402c18b0, + 0xb906b2a3, + 0x007d14f9, + 0x4bceff00, + 0xa7c1231e, + 0xffffff4e, + 0x010843b9, + 0x4c834c07, + 0x4ec1030f, + 0x2df25334, + 0x5e2101ff, + 0xdfe6ff4e, + 0x2ea70132, + 0x07ffffff, + 0x0824b93c, + 0x0f3c8301, + 0x34eef355, + 0x60be00b4, + 0x7459fe60, + 0xffff2ea7, + 0x0223a9ff, + 0xeef42501, + 0x2700b03c, + 0x270427b4, + 0x0ef49b40, + 0x4fff2ea7, + 0xc5f321fd, + 0xa39d3824, + 0x5fbfd608, + 0xffff2ea7, + 0x4224a9fe, + 0x03e12701, + 0x4224ad41, + 0x09ae9d01, + 0x4fff3ea7, + 0x11ac6dfd, + 0x2d941932, + 0x6893a99d, + 0xd5912901, + 0x5101c892, + 0x3d4383f2, + 0x2b941d92, + 0x3431c031, + 0x3ea7d8d6, + 0xbdffffff, + 0x9906373e, + 0x40270f32, + 0x270ef49b, + 0xf5228731, + 0x02b04023, + 0x219431ff, + 0xce410373, + 0x05c87734, + 0x0310072d, + 0x03e8001e, + 0x31fe9d5e, + 0xff2ea7f3, + 0x3f6bfddf, + 0x4da34387, + 0x24d50400, + 0x2bd50208, + 0xb51e0208, + 0xfe62f453, + 0x7b5e4101, + 0x7c04e0fe, + 0x8ef183fe, + 0x0424a9f5, + 0xeef30101, + 0x21ff4a43, + 0x4454eef4, + 0x117419ff, + 0x3c42eef2, + 0x416f26ff, + 0xce2439f2, + 0xa4997bb4, + 0x6e4fd605, + 0x41034c07, + 0xffff3ea7, + 0x0234adff, + 0x27dad601, + 0x6d0027b0, + 0xff195e74, + 0x44a39419, + 0x831e941d, + 0x02279431, + 0xf1834103, + 0xf58ea405, + 0xf1830227, + 0x28fcf58e, + 0x8ff6fece, + 0xf353feca, + 0x3101fdec, + 0x27fe095e, + 0x5e0027b0, + 0xa499fee7, + 0xa44fd605, + 0x31a18fc6, + 0xcf0ea7f3, + 0x7325fff9, + 0x31277419, + 0x741d4103, + 0xbe05a39d, + 0x1efe3ee0, + 0x27b22787, + 0xfebd5e02, + 0x30272b3d, + 0xffff4ea7, + 0x0a43adff, + 0x0444a901, + 0x0b360701, + 0xff2ea734, + 0xb427ffff, + 0x23ad0427, + 0x985e0104, + 0x99fa4efe, + 0x3ea75204, + 0xd5f7ffff, + 0xa7010034, + 0xebffff2e, + 0x01083ad1, + 0xc1072421, + 0x072744dc, + 0xffdea7b2, + 0xd411fd7f, + 0x4ea30c07, + 0x15010000, + 0x191c27d4, + 0x11fcf77e, + 0x004ee3d4, + 0xd4150100, + 0x34d8b321, + 0xff3ea7e2, + 0x3ac5ebff, + 0xc5412760, + 0xfa8e6834, + 0xa007fa4e, + 0xb207d107, + 0xcfffcea7, + 0x01de11fd, + 0x31e001d1, + 0x211211d4, + 0x0b402b13, + 0xab240b34, + 0x28e01132, + 0x8e004830, + 0x1e00a7fa, + 0xc54427f9, + 0x0a0748c4, + 0xa17e1b07, + 0xc54027fc, + 0xc4c548c4, + 0x00cb1e68, + 0x0000007d, + 0x00037fbc, + 0xff010218, + 0xff010228, + 0x00037fc4, + 0xff010220, + 0xff0103e8, + 0x00037fcc, + 0xff0105a8, + 0xff1affb8, + 0x5007f54e, + 0xb007f0a3, + 0x935c0c03, + 0x00c987f6, + 0x02385d03, + 0xb4c1f015, + 0x290507bc, + 0x684da942, + 0x6d43b901, + 0x99419901, + 0x3403d22b, + 0xd123312b, + 0xfae2f193, + 0x142c27ff, + 0x597ed33b, + 0x874007ff, + 0x2b473330, + 0x91f21343, + 0x400b2101, + 0xb2c14487, + 0xb84e23bc, + 0x3107fef6, + 0x11232901, + 0x24034905, + 0xf3984403, + 0x64016311, + 0x41033103, + 0x64056315, + 0x050131ec, + 0xc91ef293, + 0xa7240100, + 0xfefdf33e, + 0x41273405, + 0xcfff9ea7, + 0x6c94c5fd, + 0x94c52027, + 0xbcbec170, + 0x31274027, + 0x9d0cb49d, + 0xb29d0db3, + 0x89cd0710, + 0xcfab0cea, + 0x4d08b18d, + 0x0abc8db2, + 0xa716ba8d, + 0xfef3e70e, + 0xe489b065, + 0x99e39972, + 0x04874123, + 0x016ce2b9, + 0x03bb34f0, + 0x2374e489, + 0x9d4d2b34, + 0x433b0fb3, + 0x42074202, + 0x3407435b, + 0x21232007, + 0x41234307, + 0x230b1387, + 0xb26d132b, + 0x030eb49d, + 0xe8040711, + 0x07047541, + 0x07212323, + 0x9d42a73b, + 0x31031134, + 0x0b0bf2b0, + 0x8911019d, + 0xb4990ce9, + 0x16b98d0e, + 0x56ff4ce0, + 0x7dfa9303, + 0xa38900c8, + 0x87a13110, + 0x9b2d0743, + 0x07210b24, + 0x07020b04, + 0x0b100b14, + 0x20a4d541, + 0xe2a38d01, + 0x8d54a2c5, + 0xa0c516a3, + 0x5aa38d98, + 0x8ddca1c5, + 0xe4999ea3, + 0x4e44f499, + 0x89d02703, + 0x302774e4, + 0x4d3b4123, + 0xbcade407, + 0xb3bd0116, + 0xefab011d, + 0x4127c516, + 0x011db4bd, + 0x011eb3bd, + 0x4127ec2e, + 0x011eb4bd, + 0x1127f311, + 0x2d3b2107, + 0x00272c0b, + 0x011d30bd, + 0x011632ad, + 0x25161103, + 0x34bd4127, + 0x30bd011d, + 0x2eee011e, + 0x3c0302f4, + 0xd914c45c, + 0xc10cba99, + 0x3a07bcb1, + 0x33334a07, + 0x432b4533, + 0x12994a2b, + 0x89448798, + 0x840708b3, + 0x8b0b2423, + 0x82a9323b, + 0xf4050118, + 0x011483ad, + 0x01e52ff6, + 0x4910b499, + 0xf6438bb3, + 0x0701da4f, + 0x334a873a, + 0x07430b36, + 0x887f0374, + 0xc100037e, + 0xc407547d, + 0xcf03d101, + 0x00037ea4, + 0x02bc1fe6, + 0x020811f8, + 0x2b070c07, + 0xfe0409be, + 0x891e7489, + 0x70891673, + 0x2b24871c, + 0x16738d34, + 0x708d2d0b, + 0x5472c514, + 0x84ad7c65, + 0xa1e00118, + 0xa1f4021e, + 0xf15301d2, + 0xf253fd9c, + 0xf353fd9c, + 0x1d01fd9c, + 0x3c012901, + 0xd4019311, + 0x432bd211, + 0xb2104cf4, + 0xe8320702, + 0x0702eb30, + 0x87453343, + 0x89432b33, + 0x4c0b1e72, + 0x42053707, + 0x033c3c03, + 0x01262744, + 0x05340330, + 0xa8440340, + 0x03d301f2, + 0x05d30531, + 0x03d41193, + 0x0f4c8341, + 0x4127d415, + 0xcfff2ea7, + 0x1c7389fd, + 0x896c24c5, + 0x402708b1, + 0xfffe3d04, + 0x84bd4127, + 0xb4c10120, + 0x1883a9bc, + 0x72428901, + 0x4027310b, + 0x4127320e, + 0x011f84bd, + 0x891c7389, + 0x34eec884, + 0x726100db, + 0x29091027, + 0x41870427, + 0x7fac43f1, + 0x39ee0003, + 0x11030256, + 0x1027f078, + 0x41870427, + 0x7fac43f1, + 0x3fe00003, + 0xffffffff, + 0x1103023a, + 0xf193f058, + 0x8900c698, + 0x1e891410, + 0x9c1d8958, + 0x8be01c89, + 0x8bef8b0f, + 0x27cf8bdf, + 0x87142730, + 0xac44f143, + 0x4e00037f, + 0x0e4e2e04, + 0xf3c4ee4d, + 0x48310301, + 0xc5f053f1, + 0xa70d01fc, + 0xe62211c0, + 0x0701d12f, + 0x241c270a, + 0x7e483c27, + 0x0a07f84a, + 0x2c271d07, + 0xf8777e48, + 0x49f54c87, + 0x00037fac, + 0xfe01fc01, + 0xcc030027, + 0xecec03cc, + 0x40071827, + 0x4b0b2007, + 0x29212d0b, + 0x3c0b3407, + 0x22a13905, + 0x42054e0b, + 0xf1280403, + 0x4027d349, + 0x99c8838d, + 0x312706dd, + 0xbdca8d9d, + 0xbd010f84, + 0xbd011c83, + 0xbd010c83, + 0xbd010d84, + 0x61010e84, + 0x310a077d, + 0x27d221d3, + 0xdf7e241c, + 0xf6d351f7, + 0xa900f83f, + 0x01011882, + 0x033207f4, + 0x3123c84c, + 0x0b07b201, + 0x1507040b, + 0x011883ad, + 0x4027f28b, + 0x011c84bd, + 0xb169b249, + 0x008512ee, + 0x43834207, + 0x43994b0b, + 0x0b3f4b11, + 0xf120c823, + 0x07ee12da, + 0x83420732, + 0x8d425333, + 0xb39d08b4, + 0x5eb24d0c, + 0xa2c0fda4, + 0x31a3c020, + 0x2107ff1e, + 0x1c270a07, + 0x383c2724, + 0x07f7757e, + 0x271c070a, + 0xa27e382c, + 0xfdea5ef7, + 0xfbc2f253, + 0xfbc2f353, + 0x39012d01, + 0xfa47cea7, + 0xfe0e5efe, + 0xc6a2fd93, + 0x4f9ea700, + 0xcea7fefa, + 0x5efef887, + 0xf453fdfc, + 0xf053fb90, + 0xf153fb90, + 0x4d01fb90, + 0x1c010901, + 0xc1fde75e, + 0xb49dbcbe, + 0x1d41270d, + 0xbcb1c1e4, + 0x5d7e0507, + 0x970fe6f8, + 0x8ef083fb, + 0x2b4427f5, + 0x0fb49d43, + 0x3b74e389, + 0xe23d2b24, + 0x07fc4b32, + 0xfc465e32, + 0x34bd4127, + 0x075e011e, + 0x0fb499fd, + 0xcd07d43b, + 0xcfabd407, + 0xa85edfab, + 0x07d241fc, + 0x241c270a, + 0xa9f6d97e, + 0x5e011882, + 0x1ea7feff, + 0x99feffff, + 0x43830914, + 0x44332487, + 0x43f9422b, + 0xff000050, + 0x072532c0, + 0x100e2791, + 0x457e1388, + 0xf6d101f6, + 0x99fd1f1f, + 0x43830994, + 0x44332487, + 0x43f9422b, + 0xff000050, + 0x89df32c4, + 0x14871674, + 0x015e11a3, + 0x5e30a7fd, + 0xf293fd4f, + 0x2100c488, + 0xbe0d0721, + 0x5efe0121, + 0xc307fe38, + 0x4c07dc07, + 0x4633d333, + 0xde23d40b, + 0x5ee50000, + 0xc107fe09, + 0xd107eb1e, + 0xd3334107, + 0xd40b4633, + 0x0000de23, + 0xfe165ee5, + 0x2ea74427, + 0xc5fdcfff, + 0x05074824, + 0x7e161c27, + 0x4027f710, + 0xcfff3ea7, + 0x4834c5fd, + 0x5e6834c5, + 0x0027fce4, + 0x2bfb995e, + 0x1df09343, + 0x410300c4, + 0x01150405, + 0x00faf35e, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x0489fd4e, + 0xe40d89e8, + 0x4fab410b, + 0x99e8048d, + 0x4d2be70e, + 0x1fab1407, + 0x3ea7eaa6, + 0xc1fdefff, + 0x1e2ba434, + 0x11e04cd8, + 0x076515d0, + 0xe8432723, + 0xa423c1f4, + 0xf6e03cdc, + 0x4d0b4e07, + 0x039d3027, + 0xe4048de7, + 0xffff3ea7, + 0xea34adfe, + 0x0718060b, + 0x3815d441, + 0x9ddc01c1, + 0x2407e704, + 0xe56feea7, + 0x9e0489fd, + 0x40484f8b, + 0x01c5f2b0, + 0xc1fd8edc, + 0x0389bc04, + 0x03410bec, + 0x15e40548, + 0x893027e3, + 0xe335a004, + 0xf2f0140b, + 0x27e01ed9, + 0x8ec61e44, + 0x07fd4efd, + 0x871f6b10, + 0x04df03d1, + 0x5300038a, + 0x103f9b08, + 0xf293d401, + 0x5100ced4, + 0x05432b2e, + 0x08e19dd4, + 0xa7122499, + 0xfd4fff3e, + 0x4909e49d, + 0x99e44d24, + 0x21690824, + 0x410b3211, + 0xe205e46d, + 0x402707f6, + 0x070ef49b, + 0x27ff8b00, + 0x05302740, + 0x08e39de4, + 0x01102f9b, + 0x05420bd4, + 0x07fd8ed4, + 0x03427340, + 0x1ef4e841, + 0x99fb4ee3, + 0x43c0e604, + 0xe0140713, + 0xc000e242, + 0x4ff62244, + 0x02c10146, + 0xa7471ea4, + 0xfdefff4e, + 0xfc9843c1, + 0x00a1e03c, + 0x049d4427, + 0xc00489e6, + 0xa7e0048d, + 0xfdefff4e, + 0xfc7443c1, + 0x0112e03c, + 0x27c00389, + 0xca049d40, + 0xa7c4038d, + 0xfeffff4e, + 0x0be643ad, + 0x89a402c1, + 0x1027a204, + 0x02c5240b, + 0xa804c1a4, + 0x891242c2, + 0xe20ba20e, + 0xe407e402, + 0x01d004c1, + 0x52e3c243, + 0x27e60499, + 0x27144e20, + 0xff4ea731, + 0x43c5fdcf, + 0xe6029d70, + 0x893913c4, + 0x4f8b9e04, + 0x893140cc, + 0x0189c00c, + 0xa40ec1e0, + 0xe59fdea7, + 0xb804c1fd, + 0x0bec0389, + 0x0548034e, + 0x07d315d4, + 0x89310331, + 0x4027a002, + 0xd4351307, + 0xe20b1fab, + 0x8edfc1ce, + 0xcc0499fb, + 0x009d4ff6, + 0x89a00189, + 0x210bc003, + 0x4207210b, + 0x3103412b, + 0x8df64eca, + 0x4ea7c003, + 0xadfeffff, + 0xa70be443, + 0xfeffff3e, + 0x0be834a9, + 0x89c00b89, + 0x4b1bc403, + 0x4ccc4f8b, + 0x0ec15c11, + 0xa71307a4, + 0xfde63fce, + 0xe62fdea7, + 0xb804c1fd, + 0x4e0b3827, + 0xc315c405, + 0x4c834107, + 0x3320270f, + 0x23c23543, + 0xfef4c44e, + 0xd315d405, + 0x41034107, + 0x07a00389, + 0xabd23514, + 0xcee30b1f, + 0x0499d0b1, + 0x271327e6, + 0xff2f5e23, + 0x27e60499, + 0x5e242714, + 0x2407ff25, + 0x2a5e2f6b, + 0xe60499ff, + 0x22271227, + 0xa7ff145e, + 0xd07fff3e, + 0xe4e23411, + 0x3e25ff5c, + 0x00feff5e, + 0x00038cec, + 0x000389e8, + 0x00038980, + 0xff010218, + 0xff010228, + 0x00038988, + 0xff010220, + 0xff0103e8, + 0x00038990, + 0xff0105a8, + 0xff0105b8, + 0xd007f54e, + 0xd071f193, + 0x55f09300, + 0x2d0700c8, + 0x0ce3f1a3, + 0x7f1ce37f, + 0x35f82c03, + 0x45f155f0, + 0xff4ea7f2, + 0x43d1ffff, + 0x3fe60b84, + 0x3ea706c9, + 0x11fd6fff, + 0x104ca334, + 0xf0933415, + 0xa700cc44, + 0xfefdf31e, + 0x03011401, + 0x432b0211, + 0x071a41e8, + 0x072620e8, + 0x32874207, + 0x432b4733, + 0x4487420b, + 0x417d1c27, + 0xb84e23f3, + 0x2107fef6, + 0x11234001, + 0x44033005, + 0xf2983403, + 0xcc06f293, + 0x11240100, + 0x93410322, + 0x00cbfbf3, + 0x34052103, + 0x41233215, + 0x06db21ec, + 0x4ea73301, + 0x15fefdf3, + 0x60d3a943, + 0xfad18902, + 0xcfff4ea7, + 0xc52127fd, + 0x312b6842, + 0xd4993123, + 0x98d38df8, + 0x062641f8, + 0xb998dc89, + 0xb90265d4, + 0x3b0191d0, + 0x0404f0c4, + 0x6cdaa906, + 0x07042301, + 0x03403b4a, + 0x074c1b04, + 0x8defabe4, + 0x04f09ede, + 0x042305e0, + 0x105b1c07, + 0x20270403, + 0xf3db4ea7, + 0x6adba9fe, + 0x0cd29d01, + 0xd24dd20d, + 0x0104d2a9, + 0x3027d455, + 0xb1234127, + 0x9d12d28d, + 0xd49d08d3, + 0x87d16d09, + 0x64d2b99b, + 0xf0b10302, + 0x07058d04, + 0x8b30074e, + 0x2734234f, + 0x274008e0, + 0xab4e07e1, + 0x2b4a0b4f, + 0x0bd39d41, + 0x4202433b, + 0x435b4207, + 0x29073407, + 0x43072123, + 0x13874123, + 0x132b230b, + 0xd49dd22d, + 0x0711030a, + 0xfa41e8e4, + 0x23230705, + 0xa73d0721, + 0x0d349d42, + 0xf2b03103, + 0xfe62f253, + 0x2301ed0b, + 0x2027a427, + 0x070de19d, + 0x0b415342, + 0xe204e04c, + 0x03340504, + 0x2c3c0321, + 0x0261faf8, + 0xa9f9d499, + 0x070100d2, + 0x83412334, + 0x33330f4c, + 0x00274333, + 0x3e23b29b, + 0x23fffef4, + 0xfffef44e, + 0xdeb91247, + 0xd3c5015b, + 0xd0d4c5d4, + 0xc5a2d18d, + 0xd09da8db, + 0xa0d28dcd, + 0xe6ccd09d, + 0xa7055bef, + 0xfeffff4e, + 0x014143b9, + 0x054e3fe6, + 0xa7fad489, + 0xdfffff3e, + 0x0260d2a9, + 0xc5bcd3c5, + 0x4103b8d3, + 0x4127422e, + 0x99ccd49d, + 0x4438f8d4, + 0xd49d4127, + 0x273027cd, + 0xdcd3c540, + 0xc5e6d49d, + 0xd3c5a4d3, + 0xacd3c5b0, + 0xc5b4d3c5, + 0x0d07d8d3, + 0x27fc387e, + 0x0000004f, + 0x90d3b980, + 0xf0d4c501, + 0x050e36e0, + 0x89f6d489, + 0x432bf4d3, + 0x47334783, + 0x00004fa3, + 0xd4c58000, + 0x8df253f0, + 0x51f093fd, + 0xf19300ca, + 0x0100ca60, + 0x31f99326, + 0xf01500ca, + 0xd499f105, + 0x144fe609, + 0x08dc9901, + 0x3c07db49, + 0x34334c87, + 0x3c2b342b, + 0xb9f4d189, + 0x870191d4, + 0xe88f0383, + 0x0b00038c, + 0xea46e01b, + 0x05834902, + 0x0a9c9d8b, + 0x932d9b4d, + 0xd3999b0d, + 0x0b4b07f6, + 0x27478343, + 0x0b949d33, + 0xc10c939d, + 0x3c07f0d2, + 0x830f1c83, + 0xab418733, + 0x4534ab32, + 0x0ad49993, + 0x3da3c42e, + 0x93450440, + 0xd2a99409, + 0x4f8b016e, + 0x242b4433, + 0x27412c10, + 0x9429402c, + 0x0170d3a9, + 0x44334f8b, + 0x342b2703, + 0x3c102353, + 0x403c2741, + 0x33533703, + 0x94412123, + 0x31232783, + 0x37832b33, + 0x3c3324ab, + 0x4523ab14, + 0xb3cff692, + 0xead28901, + 0x41234207, + 0x01ab4be2, + 0xffff1ea7, + 0xe614a9fe, + 0xc8d3890b, + 0x432bb103, + 0xb4ca4fab, + 0x27a10720, + 0x7e64110d, + 0x0d07fabd, + 0xa9fb207e, + 0x890be6a4, + 0x432bc8d3, + 0x4bc24fab, + 0xead289e7, + 0xc93af093, + 0x49040100, + 0x054103d3, + 0x0032ea04, + 0x9d412702, + 0xcfe60c94, + 0x94990209, + 0x1043c40c, + 0x848d40a7, + 0x0c939908, + 0xe008948d, + 0xa700cc33, + 0xebffff3e, + 0x41dc3421, + 0x27c30716, + 0x27c43541, + 0x627e0f0c, + 0x354027fa, + 0xd8c321c4, + 0x6499ee31, + 0xa748c60c, + 0xfeffff2e, + 0xc8e2f493, + 0xd1430100, + 0x230bc024, + 0xd5410331, + 0x930bc024, + 0x00c8cff0, + 0x40270305, + 0x990c649d, + 0x4ff609d4, + 0x94990134, + 0x8742f00c, + 0x93924101, + 0x00c8b3f1, + 0x4ea71301, + 0x45ebffff, + 0x2231c842, + 0xf2114607, + 0xf915f601, + 0xf2059407, + 0xb9fe715e, + 0x5e0191d0, + 0x0d07fd87, + 0x617e1027, + 0xe84327f9, + 0xe4d389f4, + 0xcee8d489, + 0xd089ed43, + 0xf6d489ea, + 0xa9c8d389, + 0x89016ad1, + 0x310be2d2, + 0x4103400b, + 0x89c8d38d, + 0x200b9ed3, + 0xd28d41e3, + 0xf6d48de2, + 0x30ec3f8b, + 0xd489fbe9, + 0x8d400bf4, + 0xde5ef4d4, + 0x9cd499fb, + 0x44863027, + 0x9a993127, + 0x073f6b0a, + 0x33f3254a, + 0x2b3a8744, + 0x214a2b43, + 0x03b487f1, + 0x038ce8bf, + 0xf614c600, + 0x31039caf, + 0x963027b4, + 0x41312744, + 0x6b5307b4, + 0x574fe65f, + 0x445fe601, + 0x0fac0301, + 0xc333ca07, + 0xf000ce23, + 0x01b261fd, + 0x0b0d27c4, + 0x202fe610, + 0x33b15101, + 0x4c53184c, + 0x001ff01d, + 0x21100000, + 0x13be8103, + 0x83eff644, + 0xeb4ff603, + 0xf9377e00, + 0xd289d41e, + 0x8921e4ea, + 0x85cff6fe, + 0xff1ea7fe, + 0x14a9feff, + 0xd3890be6, + 0xab432bc8, + 0x71b4ea4f, + 0x27a107fe, + 0x7e64110d, + 0x0d07f90d, + 0xa9f9707e, + 0x890be6a4, + 0x432bc8d3, + 0x4bc24fab, + 0xfe4f5ee7, + 0xd129d209, + 0x023612ee, + 0x43834207, + 0x43994d0b, + 0x0b3f4b0d, + 0xf120c823, + 0x07ee12da, + 0x83420732, + 0x4d425333, + 0x08d39dd4, + 0x9299d20d, + 0x8927160a, + 0x9349ead4, + 0x43d24123, + 0x9ed4890d, + 0x8be2d189, + 0xc540e84f, + 0x0ad49901, + 0xfe8442ee, + 0x11270d07, + 0x99f8137e, + 0x42f40c94, + 0x2027fe7d, + 0x99fe7a5e, + 0xd36908d4, + 0x0b9ad289, + 0xf624e243, + 0xfbcff6fd, + 0x7e0d07fd, + 0xf35ef8e9, + 0x5e1383fd, + 0x4a07fd15, + 0xb2614333, + 0x100044f1, + 0x2aa6ff02, + 0x1ff0b151, + 0x10000000, + 0x4c33023c, + 0x53be8118, + 0x44131d4c, + 0x0239eff6, + 0x4a0748e6, + 0x41f54533, + 0xff021800, + 0x180442f5, + 0x3027ff02, + 0xe8004e23, + 0x414335fd, + 0x0bb431b3, + 0x35302743, + 0x21b345b4, + 0xb03ff6f3, + 0x23b431fd, + 0x5eb43541, + 0xa1e0fda7, + 0xa1d400af, + 0xfdf3536f, + 0xfdf453f9, + 0xfdf053f9, + 0x013c01f9, + 0xc6080147, + 0x7301625f, + 0xc211c401, + 0x016934ee, + 0x40e84207, + 0x34070217, + 0x44873533, + 0x4b07342b, + 0x4c03380b, + 0x01272710, + 0x05340330, + 0xa8440340, + 0x03c401f2, + 0x15c40541, + 0x03c31174, + 0x0f3c8331, + 0x4127c315, + 0xcfff2ea7, + 0x6824c5fd, + 0xe60fac03, + 0x07ff3d5f, + 0x23c333ca, + 0xfdf000ce, + 0xc0fe485e, + 0xa3c025a2, + 0x01ff1e4c, + 0x11c40173, + 0x0334eec2, + 0xe0420701, + 0xffffff4f, + 0x1eff62ff, + 0x0b4c079a, + 0x5e340542, + 0xf453fb1b, + 0xf053f980, + 0xf153f980, + 0x4c01f980, + 0x18010701, + 0x53ff6a5e, + 0x53f95ff1, + 0x53f95ff2, + 0x01f95ff3, + 0x0127011c, + 0xff555e38, + 0xc5dafc93, + 0x4f7ea700, + 0x8ea7fefa, + 0x5efef887, + 0x4427ff43, + 0x3a07402b, + 0x312b243b, + 0xe20bd49d, + 0x07fa8932, + 0xfa845e32, + 0x402b4427, + 0x143b1c07, + 0xa9fa215e, + 0x27016cda, + 0x07402b44, + 0x07147b1a, + 0xf9fb5e41, + 0x31be0d07, + 0xf331fe03, + 0xf4513419, + 0xc2803c03, + 0xc95ef734, + 0xff3ea7f9, + 0x3411fd6f, + 0x15104ce3, + 0xf9385e34, + 0x310b3103, + 0x07e0d489, + 0x2bcfabc3, + 0xec4f8b4c, + 0x07fe2c41, + 0xf73f7e0d, + 0x2be0d489, + 0xc84f8b4c, + 0x9299f241, + 0xfe175e0a, + 0xc5fcd4c1, + 0xd4c5bcd4, + 0xfacf5eb8, + 0xd49d4027, + 0xfde85e09, + 0x0104d4d1, + 0x83ead389, + 0x33438b41, + 0x004fa347, + 0xc5800000, + 0xf25ef0d4, + 0x5ee027fa, + 0x40a7fa14, + 0xa7fefe5e, + 0xfe985e40, + 0xe55e20a7, + 0x2b4203f8, + 0x15340542, + 0xf91e5e31, + 0xf49b4027, + 0x0ef49b0b, + 0xcfffbea7, + 0xa79107fd, + 0xfeffffae, + 0xb4c54827, + 0xbd32274c, + 0x270c3fa3, + 0x0efc9bc0, + 0xb4c54127, + 0x7e052760, + 0x4027f64d, + 0x0c3fa4bd, + 0xc50efc9b, + 0xbcc54cbc, + 0xc9f1936c, + 0x940100c4, + 0x12111301, + 0x410c432b, + 0x20ec20a7, + 0xc11ef88c, + 0x75fff093, + 0x2646befe, + 0xf0ff1efe, + 0x07fdee42, + 0xf545334a, + 0x02180041, + 0xf51407ff, + 0x02180442, + 0x001e23ff, + 0x2027fde8, + 0x1235b371, + 0x180043f5, + 0x4ef5ff02, + 0xff021804, + 0xb45e1235, + 0xbdf293fd, + 0x243100c7, + 0x24354123, + 0x27fb665e, + 0xff2ea748, + 0x24c5fdcf, + 0x7e0b274c, + 0x4027f5cd, + 0xcfff3ea7, + 0x4c34c5fd, + 0x5e6c34c5, + 0x42d4fdbe, + 0xfc7f5ea3, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x4007fb4e, + 0x6b174c53, + 0x07c0074f, + 0xc0d027b1, + 0x0741ff4c, + 0xff3e8330, + 0x4ba67fff, + 0x0c230407, + 0x1f0ccc77, + 0x003ea32f, + 0x13078000, + 0x01e82027, + 0x4c23008c, + 0x6940c897, + 0xe43be307, + 0xd03bd107, + 0x2d074e07, + 0x49333e07, + 0x73172c53, + 0x24ab173c, + 0x272831c8, + 0x27fb8e00, + 0x773c2720, + 0x07574c27, + 0x07d47bd2, + 0x07e37be2, + 0x072d074e, + 0x5349333e, + 0x3c73172c, + 0xcc24ab17, + 0x3536da31, + 0xba602fd4, + 0xc8d10ccc, + 0xffffff3f, + 0x3fc0caff, + 0xffffffff, + 0x07b2051f, + 0x21c0cc42, + 0x01274013, + 0xfb8eb405, + 0x2b204c27, + 0x5be20740, + 0xabe03b34, + 0xd08e1ee3, + 0x0000002f, + 0xda1e9e80, + 0xfb8e0127, + 0x30133007, + 0x4c234307, + 0x9840cc20, + 0x2b204c27, + 0x07020743, + 0x5b043bd1, + 0x1ed0abd3, + 0xa3f84e8b, + 0x09f005f0, + 0x8b8207f0, + 0x1593070f, + 0x3a42bef1, + 0x49c007fe, + 0xbe0f8bf0, + 0x07fe3a38, + 0xbe0c0710, + 0x07fe37f5, + 0x07f029b0, + 0xbe0f8bab, + 0x07fe3a24, + 0x8bf069c0, + 0x3a1abe0f, + 0x071007fe, + 0x37d7be0c, + 0x00df27fe, + 0x07448000, + 0x071d07c0, + 0xbebc070b, + 0xc8fe3bbb, + 0xd0272201, + 0x0b071907, + 0x07fec77e, + 0x071807c0, + 0xfebe7e0a, + 0x08b60c8b, + 0xf1930427, + 0x9efe7488, + 0x07fe27a6, + 0x270c071d, + 0x3b8dbed0, + 0x270108fe, + 0xc34d07d1, + 0x6bd40741, + 0xc6ca1edf, + 0xf083dbdf, + 0xfc4ef88e, + 0xefff4ea7, + 0xe04ec1fd, + 0xec33d107, + 0xb6028918, + 0x53b20389, + 0xd1031dec, + 0xe47fcea7, + 0x143222fd, + 0x03fdf0e4, + 0x0489fc8e, + 0x2b1407bc, + 0x3b42c212, + 0x02c00489, + 0xc1140714, + 0x0389cc04, + 0x0b240bdc, + 0x15c20523, + 0xc00289c1, + 0x89b60389, + 0x320bb204, + 0x0189420b, + 0xb6038dc8, + 0x03b2048d, + 0x89402711, + 0x0389b602, + 0x8dc435b2, + 0x4e07c801, + 0xe4074103, + 0xaa1eef6b, + 0x04a9fe4e, + 0x49260374, + 0x31071353, + 0xc1c80e89, + 0x3fabd402, + 0x14072411, + 0x13c21fab, + 0x27e142f8, + 0x5efe0e10, + 0x1e2bff66, + 0xfe0e1fab, + 0x8eff5d5e, + 0x07fc4efe, + 0x6bd007c1, + 0xbdf093cf, + 0xad7e00da, + 0xa7c7a600, + 0xfeffff2e, + 0x014223a9, + 0x014424a9, + 0x277834ce, + 0x4023bd30, + 0x9b40270c, + 0x1d070ef4, + 0x01871f6b, + 0xa1180f03, + 0xd8530003, + 0x01103f9b, + 0x35f29304, + 0x2e5100d9, + 0x0405432b, + 0x9908e19d, + 0x3ea71224, + 0x9dfd4fff, + 0x244909e4, + 0x2499e44d, + 0x11216908, + 0x6d410b32, + 0xf6e205e4, + 0x9b4027dc, + 0x00070ef4, + 0x2027ff8b, + 0xe49d4027, + 0x9be20508, + 0x0401103f, + 0x0405430b, + 0x3ea7c606, + 0xbdfeffff, + 0x270c4032, + 0x0ef49b40, + 0x3227fc8e, + 0x0c4023bd, + 0xf49b4027, + 0xa731270e, + 0xfdcfff4e, + 0x5e6043c5, + 0x4d07ff7e, + 0x41034273, + 0xbb1ef4e8, + 0x0499f94e, + 0xe6c00725, + 0xa700a54f, + 0xfddfff1e, + 0x01c014d1, + 0x00944fe6, + 0x020c13d1, + 0x03250271, + 0x021014d1, + 0x35270d99, + 0x1413d104, + 0x45402702, + 0xa811d103, + 0xff3ea701, + 0x210bffff, + 0x7525049d, + 0xb9d12302, + 0x83010834, + 0xd4ee0fdc, + 0xd3330168, + 0xc3894027, + 0x0cd4f520, + 0xa7ff0001, + 0xffffff2e, + 0x24b93e56, + 0x4ce00101, + 0xb90131ff, + 0x07010124, + 0x07db07b4, + 0x3347334b, + 0x23d40bd5, + 0xfff5ccde, + 0x20274d07, + 0x05283c27, + 0xc8440342, + 0xc1c451f3, + 0xd40550d2, + 0x4ea7c161, + 0xc5fd4fff, + 0x430164d1, + 0xab103c33, + 0x50d2c523, + 0x00271c1e, + 0x0127f98e, + 0x24b9f98e, + 0xd4070101, + 0xd533b407, + 0xd40b4733, + 0xf5ccde23, + 0x071c07ff, + 0x0318032d, + 0x0327942c, + 0x13012401, + 0x430b1403, + 0x24032405, + 0xaea7f088, + 0x81fd4fff, + 0xff9ea7ae, + 0xa091feff, + 0x012894d1, + 0x013093d1, + 0xe3330333, + 0xc154d2c1, + 0x301b5cd1, + 0x240b4e1b, + 0x90d5130b, + 0x9ed50130, + 0xd2c50128, + 0x5cd1c554, + 0xd4c1c371, + 0x50d2c170, + 0xd4c5430b, + 0x27a30170, + 0xab033b01, + 0x22c49902, + 0x5650d0c5, + 0x20c1894c, + 0x0329c499, + 0x2ac39911, + 0x3b28c299, + 0x06132b14, + 0xa3115325, + 0x9980001d, + 0xc39926c4, + 0xa9483327, + 0xab014492, + 0x101c3343, + 0x3ea741ab, + 0x03ffffff, + 0x0834d521, + 0xad012701, + 0x8e014492, + 0x07a401f9, + 0x144c331b, + 0xd0c504ab, + 0xbe0c0750, + 0xa7fe1640, + 0xff4ea730, + 0x43bdffff, + 0xa21e0101, + 0xe8070e27, + 0x7e102703, + 0x0ea7fdad, + 0xbefff5db, + 0x07fe9bd7, + 0xe900c8b0, + 0xffff4ea7, + 0x0140bdff, + 0xfebf5e01, + 0x0d27b307, + 0x10276406, + 0xb9fd887e, + 0xee0108b4, + 0x1efe894d, + 0x07f84eee, + 0xffbea7c0, + 0x8c27fddf, + 0xe5fd9310, + 0x9c2700d6, + 0xffaea70c, + 0x471efd4f, + 0x9b30b8c5, + 0xd4c1102f, + 0x2bd35138, + 0x38d4c542, + 0x9908399d, + 0x349d12d4, + 0x11d44909, + 0x99344da1, + 0xd26908d4, + 0x420b3105, + 0x4027346d, + 0x070ef49b, + 0x9dff8b00, + 0x30050834, + 0xc1104f9b, + 0xb0c538d3, + 0xc5430b30, + 0x0c0738d4, + 0xc6fdd37e, + 0xf88eb30f, + 0xcea7fc4e, + 0x27fdcfff, + 0xc4c5104c, + 0x7e1f6b50, + 0x4027fd01, + 0xc550c4c5, + 0xfc8e70c4, + 0xfc93fb4e, + 0x0700d668, + 0xffdea7bc, + 0xbd03e7ff, + 0xd3210150, + 0x40273158, + 0xfb8ed435, + 0x036ec4b9, + 0x10270b27, + 0xb90c4c38, + 0x760387c4, + 0x35412745, + 0xfcc37ed4, + 0x0b07dd1e, + 0x1eff407e, + 0xa7fc4ed6, + 0xfeffff4e, + 0x0be443a9, + 0x011804a9, + 0x2bfc0ec1, + 0xc83f8b34, + 0x01d11631, + 0x1ec20100, + 0xf802890f, + 0x04ad4103, + 0xe20b0118, + 0xc55ef3f0, + 0x4ea7fc0e, + 0xd1fdefff, + 0xc1013001, + 0xe1c2a844, + 0x184c334a, + 0xd41d4c53, + 0xd4274144, + 0xcea7d42b, + 0xd1fde55f, + 0xc2013404, + 0x04d11941, + 0x03a90110, + 0x410b014a, + 0x02a9430b, + 0xc405014c, + 0x4027c215, + 0x04a9c435, + 0x03890140, + 0x0b4103f8, + 0x4004ad13, + 0x3001d501, + 0xf0e10201, + 0xfc8ecafd, + 0xa9a11ec2, + 0x1e011804, + 0xa9fd4e90, + 0x07017e04, + 0xc61f6b12, + 0x4ea77a4f, + 0xc1fdefff, + 0x0389ec4d, + 0x18dc33c6, + 0x53ca0489, + 0x3d2b1ddc, + 0x0bc40289, + 0xc111c343, + 0x210bd803, + 0x01894fab, + 0xb40e89b8, + 0x028d3415, + 0xca048dc4, + 0xd647e1c2, + 0xbc0489dc, + 0x072741c2, + 0xc0038924, + 0x2302212b, + 0x04c12307, + 0xdc0389d0, + 0x130b140b, + 0xe44f4ea7, + 0x154105fd, + 0xb8018942, + 0x35b40e89, + 0xc004894d, + 0x31072e07, + 0x240bd127, + 0x038d340b, + 0xb4028db8, + 0x8ec60d8d, + 0x8ddfabfd, + 0xf81ec60d, + 0x09a9f74e, + 0xe0070148, + 0x7907910b, + 0x8ea77fab, + 0xadfdefff, + 0xa7014807, + 0xfde52fae, + 0xb9b48cc1, + 0x330146e3, + 0xcc5318cc, + 0xa93c2b1d, + 0x060142e4, + 0xad430b35, + 0x070142e4, + 0x073c0b34, + 0xce4fab43, + 0xc4d46247, + 0x0703074d, + 0x2b310349, + 0xabb40743, + 0x0bd427bf, + 0xd1dc2bb3, + 0xd10138e1, + 0x03013ce4, + 0x1941c2c1, + 0x0114e4d1, + 0x014ae3a9, + 0x430b410b, + 0x014ce2a9, + 0xa215a405, + 0xa4354027, + 0x03f8e489, + 0xd5410b01, + 0x070138e4, + 0xce4fab40, + 0xfdf0160b, + 0xbd471bc7, + 0xab0146ec, + 0x0c45d04f, + 0xf4e84327, + 0xbdff7b5e, + 0xa70146ec, + 0xfeffff4e, + 0x0bea43a9, + 0x0142e2a9, + 0x422b4307, + 0x80004dfc, + 0x820700e3, + 0xefff4ea7, + 0xbc41c1fd, + 0x0123e4b9, + 0x53181c33, + 0x412b1d1c, + 0x011ee2a9, + 0x240b4766, + 0xffff4ea7, + 0xe842adfe, + 0x1ee2ad0b, + 0xa7312701, + 0xfdcfff4e, + 0x076c43c5, + 0x07310b32, + 0xce4fab43, + 0x14d45647, + 0x03d30753, + 0x079d2bd1, + 0x07cfabc9, + 0x03d123b1, + 0x1f9ea7c1, + 0xaea7fde5, + 0x07fde50f, + 0x0f4c834d, + 0xe0d14333, + 0x4e23010c, + 0xd1fef4c4, + 0x050110e3, + 0x03182794, + 0x15300bb1, + 0x35202791, + 0x15a30592, + 0xf8e489a1, + 0x400ba235, + 0x010ce4d5, + 0xfcf0d103, + 0xa91b0748, + 0xbd011ae2, + 0xce0123e1, + 0xeca94028, + 0x2cce011e, + 0x04e1d139, + 0xf8ed8901, + 0x012ce0d1, + 0x7fffbea7, + 0x072103d0, + 0x25e4b932, + 0x0b3fab01, + 0x8623071d, + 0x05b10544, + 0xce380e01, + 0xe3ade8c3, + 0xe1d5011a, + 0xf78e0104, + 0x1e81b4c4, + 0x07f78eb5, + 0xff1e5e83, + 0x5007f54e, + 0x7ea7d007, + 0xa7feffff, + 0xe7ffff6e, + 0x01505d03, + 0xd089d949, + 0x08d89998, + 0xd189da69, + 0x8631279a, + 0x07302794, + 0x0be123e0, + 0x331123a8, + 0x4127103c, + 0x40279e0e, + 0xbda3b807, + 0xb3ab2000, + 0x27114c33, + 0x271a0e21, + 0x03b4ab20, + 0x0f2c3311, + 0x090e3127, + 0xb2ab3027, + 0x270e3c33, + 0x271a0e41, + 0x33b3ab40, + 0xb4ab0e4c, + 0xce078ad6, + 0xc907e902, + 0x0be674a9, + 0x0120d3a9, + 0x4fab432b, + 0x2720c4ca, + 0x160c2710, + 0x07fc5b7e, + 0xfcaf7e0d, + 0x0be674a9, + 0x0120d3a9, + 0x4fab432b, + 0x89e54cc2, + 0x09e298d0, + 0x8fe600c3, + 0xd4890161, + 0xc34aee9a, + 0xb98e7600, + 0x890214d4, + 0x442398d3, + 0x39c2345b, + 0x44d4a926, + 0x40d3a901, + 0x07490b01, + 0x2bcfabc4, + 0xcc3f8b3c, + 0x0d071131, + 0xa9fc647e, + 0x2b0140d4, + 0xc84f8b4c, + 0xd4b9f141, + 0x4cd8036e, + 0xd499170c, + 0x8b4123b1, + 0xb945f649, + 0x260387d4, + 0x98d48945, + 0x016894ea, + 0xce0ad499, + 0xd4892784, + 0x2149c298, + 0x036ed4b9, + 0x120c4cd8, + 0x23b1d499, + 0x56498b41, + 0x87d4b945, + 0x4d4ff603, + 0x270d0701, + 0xfd327e11, + 0x45fbcf7e, + 0x75d4b96b, + 0x094c1601, + 0xced129d2, + 0x42074412, + 0x4d0b4383, + 0x4b0d4399, + 0xc8230b3f, + 0x12daf120, + 0x073207ee, + 0x53338342, + 0x9dd44d42, + 0xd20d08d3, + 0x89feb35e, + 0xbde39ad4, + 0xa4ee0800, + 0xbda3ff41, + 0x3a5e0400, + 0x7e0507ff, + 0xd209f934, + 0x21ced129, + 0x274027be, + 0xffbea7c4, + 0xd49de7ff, + 0xfb6e7e09, + 0xb4454027, + 0x657efcb0, + 0x1ad3a9fb, + 0x48d4a901, + 0x1734ce01, + 0x10270d07, + 0x27fcb37e, + 0xa9f4e843, + 0xa9011ad3, + 0xce0148d4, + 0xd3b9eb43, + 0xd2890214, + 0x2cdcd198, + 0x20d1a901, + 0x44d0a901, + 0x2340a701, + 0xeedea934, + 0x5bc40501, + 0x0b1e0b23, + 0x6ed4b902, + 0x20d1ad03, + 0x44d0ad01, + 0x0c4c3801, + 0x0387d4b9, + 0xd4d148d6, + 0xd3890378, + 0x0b410398, + 0xd541e343, + 0x8e0378d4, + 0x7e0d07f5, + 0x9b5efb31, + 0x270d07fe, + 0x7e212710, + 0xd489fbb9, + 0xcad289c4, + 0xa9ef42ce, + 0xc60374d4, + 0xb6d38948, + 0xcabcd489, + 0x1a1e0c34, + 0x89b6d389, + 0x43c2bcd4, + 0x270d070e, + 0xf70c7e11, + 0x0374d4a9, + 0xd2894196, + 0xd8d3c1ca, + 0x341540a7, + 0x0378d4d1, + 0x0398d389, + 0xe3430b41, + 0xc4d28d41, + 0x0378d4d5, + 0x0d07f58e, + 0x557e1907, + 0xfe925ef7, + 0x0d071907, + 0x567e2027, + 0xfeab5efb, + 0x0000007d, + 0x00000001, + 0x00000000, + 0x00020000, + 0x07f54e00, + 0x071d07d0, + 0x073d072d, + 0x03f7634d, + 0x0301500d, + 0x03017c1d, + 0x0303882d, + 0x03018c3d, + 0xc5034c4d, + 0xf1c568f0, + 0x64f2c544, + 0xc548f3c5, + 0xbea75cf4, + 0xd1ffffff, + 0xe60b84b4, + 0xa709284f, + 0xfd5fffce, + 0x4ca3c411, + 0x93c41510, + 0x00d07ff1, + 0xfdf30ea7, + 0x010401fe, + 0x2b121113, + 0x9741e843, + 0xda20e80a, + 0x8742070b, + 0x2b473332, + 0x53420b43, + 0x87ff7ffc, + 0x23c10144, + 0xfef6b84e, + 0xc544f2c1, + 0x34073cf4, + 0x3e014107, + 0x2e051123, + 0x24033403, + 0xf293f498, + 0x0100d038, + 0x03231124, + 0x05310341, + 0x23231524, + 0x8b31ec41, + 0x21f3930b, + 0x340100d0, + 0xfdf3bea7, + 0xa9b425fe, + 0xa9017edc, + 0xc502e4d4, + 0xf0c154fc, + 0xa7c12754, + 0xfdcfffee, + 0x2b68ecc5, + 0xb9412340, + 0xad017cd3, + 0xdc0374d4, + 0xf0c11b31, + 0xf9077e68, + 0x19be0d07, + 0xd1a9fdf9, + 0xd2a9017e, + 0xf1c50188, + 0x12d28d54, + 0x036ed4b9, + 0x5c0c4cf8, + 0x87d4b908, + 0x544fe603, + 0x74d3a909, + 0xead2a903, + 0x4cf3c503, + 0x02e9d4b9, + 0xb54cfbc1, + 0x03feb1f4, + 0x70d3b9b1, + 0x3bfb5503, + 0xe8d4b9be, + 0xb9fb5502, + 0x7b0371d0, + 0xc5fb55b3, + 0xd1b930f0, + 0xb43303ed, + 0xb13bf235, + 0xd2b94433, + 0x437b03ec, + 0xfb55037b, + 0xa94cf3c1, + 0x3b03e8db, + 0xa5013bc1, + 0x85f095f3, + 0xb9fb25fc, + 0xc10216dc, + 0xfcc554fe, + 0x38fec534, + 0xf3314fab, + 0x03e4d5d1, + 0x0a7d2ff6, + 0xa51bfa81, + 0xf0b1a153, + 0x0a6602e0, + 0xfb65b027, + 0x413bf751, + 0x2ff6742b, + 0xf981094d, + 0x9153951b, + 0xf4054027, + 0x08cf7ff6, + 0x8de8d48d, + 0xd489eed7, + 0x8b3f8be8, + 0x0743124f, + 0xeadba943, + 0xe8d48d03, + 0xd489bf8b, + 0xc53b07ee, + 0x4f8b60fb, + 0x43123173, + 0xd48d4307, + 0xe8dc89ee, + 0x07eede89, + 0x9b3e074c, + 0x27359b45, + 0x3b4a0b01, + 0x27a30b01, + 0x6cfcc510, + 0xc540fec5, + 0xdac5e0d4, + 0x70f0c5e4, + 0xcd07fd15, + 0xf271f175, + 0x08692fe6, + 0x71e4d8c1, + 0x964127f3, + 0x51402734, + 0x61fe81f2, + 0x7b247bf3, + 0x07b20734, + 0x1bb32b6e, + 0x71f39162, + 0x2b345bf2, + 0x2b2f6bbe, + 0x07b32b63, + 0x322fe6a8, + 0x40f4c108, + 0x7160f0c1, + 0x7b7407f1, + 0x077fab01, + 0x58f0c540, + 0x472b2027, + 0xc29d9407, + 0xf2c29df0, + 0xb8c29fab, + 0xe4d1d131, + 0x2b0b0703, + 0x3f58be08, + 0x070f6bfe, + 0x9d459b40, + 0x480bf0c0, + 0x40074b4a, + 0xc49d4123, + 0xf0c499f0, + 0x4f6b4103, + 0xa59ba407, + 0xc49da80b, + 0x994907f0, + 0x4f8bf0c3, + 0x43074312, + 0x942b4f6b, + 0xc49db907, + 0xe2bfabf0, + 0xe606b16a, + 0xd106adbf, + 0x0703e4d1, + 0xbe0a2b06, + 0x6bfe3f0a, + 0x9b40070f, + 0x9d4a0b45, + 0x464af2c0, + 0x41234007, + 0x99f2c49d, + 0x1027f2c4, + 0xc49d4103, + 0x994b07f2, + 0x4f8bf2c3, + 0x43074312, + 0x6bf0c299, + 0x0b720b4f, + 0xf2c49d74, + 0xf4113707, + 0xfbc13fab, + 0xea438d70, + 0x07405bee, + 0x03ecd4b9, + 0x073842e0, + 0xfb11f471, + 0xb2034103, + 0xfb15f475, + 0x42e4c103, + 0xd4d1feee, + 0xeea703e0, + 0xd5fddfff, + 0xd1022ce4, + 0xc103e4d3, + 0xe3d530fc, + 0xd2c10230, + 0x6cf1c1e0, + 0x023ce2d5, + 0x53e4d3c1, + 0xff1d83c2, + 0x40e3d53f, + 0x30fcc502, + 0xb16cf1c5, + 0xb9f4a1f0, + 0x3b0370d2, + 0x33c27b40, + 0x83425b44, + 0x40f2c1c7, + 0x8310cc33, + 0xc53fff4d, + 0x1c3330fc, + 0x83c4ab10, + 0xd51fff2d, + 0xc50234ec, + 0x12ab6cf1, + 0x0238e1d5, + 0x99f2d499, + 0xfbc1f1d2, + 0x34fcc13c, + 0x833f4c83, + 0xde991f2c, + 0xf3d099f0, + 0x3396b389, + 0x102c3348, + 0xc4861127, + 0x42ab1027, + 0x7b3fec83, + 0x834eab31, + 0xfe311f0c, + 0x3394b289, + 0x3d83180c, + 0xf1213fff, + 0x2d8340ab, + 0x0ea73fff, + 0x33fddfff, + 0xed83103c, + 0x04d53fff, + 0x32ab0244, + 0x8310ec33, + 0xd53fff1d, + 0x35022403, + 0xabf3a1fe, + 0x280ed5e1, + 0xecd2b902, + 0x86412703, + 0xc1402734, + 0x4c3338fb, + 0x27238318, + 0x27b48631, + 0x3342ab30, + 0x43ab193c, + 0x022004d5, + 0x02e9d4b9, + 0xb94cf6c1, + 0x3b02ead3, + 0x303ff664, + 0x27c02705, + 0x15d1b9e0, + 0x1914f002, + 0x07142305, + 0x03015b06, + 0xeed2a914, + 0x23412701, + 0xa92e0b21, + 0x270188de, + 0x9db02730, + 0x4ea709d4, + 0x9dfef3cf, + 0xd39d08db, + 0x0dd4550c, + 0x6dd34dd3, + 0x12de8dd0, + 0xdbb92287, + 0x14f002e8, + 0xd4a90515, + 0x310701f0, + 0x34234c0b, + 0xd39d402b, + 0x02433b0b, + 0x5b4b074b, + 0x23340743, + 0x23430721, + 0x0b138741, + 0x2d132b23, + 0x0ad49dd2, + 0x04071103, + 0x066541e8, + 0x21232307, + 0x42a73d07, + 0x030d349d, + 0x0bf2b031, + 0x86d5b90d, + 0x0d019d03, + 0x04c25fe6, + 0x04be61e8, + 0x71237607, + 0x01a4d4a9, + 0x40e84f8b, + 0xe0270515, + 0x0348d4d1, + 0x4df8fe45, + 0x05130100, + 0x0370d3b9, + 0x437b4707, + 0x21732407, + 0x34070207, + 0xe2070283, + 0x14073283, + 0x90878387, + 0x02073407, + 0x1183e183, + 0xee471147, + 0x34830483, + 0xdcd1810b, + 0x9e0b03b0, + 0x03333333, + 0x03bcd1d1, + 0x900b830b, + 0x47e327e3, + 0x219b4c9b, + 0x94338433, + 0x920b840b, + 0x03c0d4d1, + 0x03b4dad1, + 0xc153cb07, + 0xab9bc49b, + 0x034cf1c1, + 0xcc037fac, + 0xd4d0a97f, + 0x7face303, + 0xd17fcce3, + 0xd103acd4, + 0x9b03b8d3, + 0x2ba19bc1, + 0x0ba40b06, + 0x070b12c3, + 0x54f2c10b, + 0x04312fe6, + 0xfa92f353, + 0x0371d1b9, + 0x40273e01, + 0x045b6fe6, + 0xefe63027, + 0x6fe6015c, + 0xfb530154, + 0xb201fa7c, + 0x17831253, + 0x13ab14ab, + 0xdfffeea7, + 0xd512abfd, + 0x2501d4e1, + 0xf6f041e0, + 0xb9013c0f, + 0xe601ecd4, + 0xd100914f, + 0xd80348d4, + 0x5101004d, + 0x019cd4d1, + 0x0370d0b9, + 0x03c8dbd1, + 0x20c04cd8, + 0x21732707, + 0x053a20e8, + 0x03d0d4d1, + 0xd3d12373, + 0x249b03cc, + 0xdfff1ea7, + 0xd5c20bfd, + 0x2701f413, + 0x07103b18, + 0x3ba1be07, + 0xff2ea7fe, + 0x4427fddf, + 0x01d824d5, + 0x03c4d3d1, + 0xab0bb09b, + 0x01bc23d5, + 0x41275626, + 0x40276486, + 0xdfff3ea7, + 0x9834d5fd, + 0xc6f44101, + 0x9cd4d146, + 0xc04c5801, + 0xdfffbea7, + 0xe4b9d5fd, + 0xe8bcd501, + 0xffcea701, + 0xcad5fddf, + 0xc8d5019c, + 0xdab901ac, + 0xac83036e, + 0xa5afe60c, + 0x87d4b900, + 0x9d4fe603, + 0x3cd4d100, + 0xc0d3d103, + 0xc4dcd101, + 0x5a4ce001, + 0x4cf405b4, + 0xf603ab5b, + 0x8903a54f, + 0xd289e8d0, + 0xeede89ea, + 0xd1894007, + 0x9b422bec, + 0xa73e0743, + 0xfddfffbe, + 0xb4d5312b, + 0x3c9b0114, + 0x0118b3d5, + 0x1e2b202b, + 0x011cb3d5, + 0xa91921c8, + 0xa903d8d3, + 0x2b03d6d4, + 0x12402b30, + 0xe8320732, + 0xfa044c40, + 0x27034f43, + 0xc80027c0, + 0xd3a91911, + 0xd4a903de, + 0x3e2b03dc, + 0x31124e2b, + 0x40e83107, + 0x43fa0543, + 0x20270337, + 0x291e4027, + 0xfeac5fe6, + 0xad5e2027, + 0xc0d4d1fe, + 0xd141fc01, + 0xff1e5efe, + 0x03d6dca9, + 0x03d8d0a9, + 0x44334607, + 0xc42b042b, + 0x40272027, + 0xdfffeea7, + 0x50ecd5fd, + 0x58e0d501, + 0x44e2d501, + 0x48e4d501, + 0x2a6fe601, + 0xa7302702, + 0xfddfff0e, + 0x0364d4a9, + 0x016403d5, + 0x048942e0, + 0xd1b98327, + 0xfbc10387, + 0x50f1c564, + 0xdf235ea7, + 0x617807fd, + 0x66369bb3, + 0x50f2c1ac, + 0xd4d12bc6, + 0xdad1033c, + 0xd9d101c0, + 0xd38901c4, + 0xeed089e8, + 0x99ead189, + 0xd289f4de, + 0xf5dc99ec, + 0xca5a4ce0, + 0x5b4cf402, + 0x4fe601c3, + 0xff1e02a9, + 0x3a9b4007, + 0x3013499b, + 0x83004013, + 0xb4313407, + 0x54c5430b, + 0x50f4c1a8, + 0xb4014506, + 0x5405430b, + 0xf7f88123, + 0xd4b90176, + 0xd1a9017d, + 0x34070184, + 0x4c834123, + 0xeed2a90f, + 0x33333301, + 0x9be02743, + 0xf43e2321, + 0x4e23fffe, + 0x47fffef4, + 0xdfdcb901, + 0x7cd8d501, + 0x2cd3d503, + 0x28d4d501, + 0xfad08d01, + 0x0100d2d5, + 0x0125debd, + 0x0384dead, + 0xbdf8d18d, + 0xe60124de, + 0xa70133cf, + 0xfeffff4e, + 0x014143b9, + 0x01263fe6, + 0x017edea9, + 0xffff4ea7, + 0xa93e07df, + 0xd502e4d2, + 0xd50114d4, + 0x030110d4, + 0x9323ee31, + 0x7cd4b903, + 0x27443801, + 0x25d4bd41, + 0x14d3b901, + 0x98d08902, + 0x34234027, + 0x69f8d289, + 0xd5037bd1, + 0xc50138d4, + 0xd4d5fcd4, + 0xd4d50108, + 0xd4d50104, + 0xd4d5010c, + 0x029b0130, + 0x02bb1fe6, + 0xefe64007, + 0xd4d502bb, + 0xd0d50134, + 0x0d07013c, + 0xb9f2507e, + 0x38036ed4, + 0xd4b90c4c, + 0x4ff60387, + 0x0d0702a4, + 0xc1f5037e, + 0x727e68f0, + 0xbd4127f1, + 0xd10175d4, + 0xc10150d3, + 0x2c2748f4, + 0x034b0112, + 0x033b0544, + 0xd1f2a834, + 0xb90188de, + 0xd10187d1, + 0xa90344d0, + 0xb90374d2, + 0xb90370d3, + 0xb902e9db, + 0xa9017ddc, + 0xd5017ed4, + 0xbd0164de, + 0x530176d1, + 0xd5f743fe, + 0xad0168d0, + 0xbd0170d2, + 0xbd0178d3, + 0xbd0179db, + 0x190177dc, + 0x274496e1, + 0xe8d3b911, + 0x98d48902, + 0x0386d0b9, + 0x4433439b, + 0x016cd4d5, + 0x0154d2d1, + 0xbd5cf4c1, + 0xbd0172d1, + 0x27017ad0, + 0x03410138, + 0x03210544, + 0x5ef3a824, + 0xdab9f72a, + 0xb403036e, + 0xac835403, + 0xfe215e0c, + 0x0180d4d1, + 0x017edea9, + 0x0114d4d5, + 0x0110d4d5, + 0xe0fef45e, + 0xfe42b44c, + 0x010e4de0, + 0x375e00ea, + 0xdad3a9fe, + 0xfdd55e03, + 0x412b4427, + 0x043b0607, + 0x27fae85e, + 0x5ee127c1, + 0xf353fad1, + 0x3101f6a0, + 0xa9f9785e, + 0xc50374dc, + 0xa95e4cfc, + 0xffeea7fa, + 0xe411fd5f, + 0x15104ce3, + 0xf6d95ee4, + 0x455e7607, + 0xf0d3a9fb, + 0x2b442701, + 0x07302b41, + 0x0bd49d0b, + 0x30e2043b, + 0x3007faf3, + 0xb9faee5e, + 0x2701ead4, + 0x71d1b9e1, + 0x12d3a903, + 0x18202702, + 0x7b212744, + 0x07230732, + 0x70d3b946, + 0x33210b03, + 0xc6242b44, + 0xe3230334, + 0x33400723, + 0x33422b44, + 0x004d8346, + 0xa96ff603, + 0xc33507fb, + 0x33318331, + 0x9f5e103c, + 0xc0d4d1fb, + 0x45c12701, + 0xf142fcfc, + 0xb0d8d1fa, + 0xbcd4d103, + 0x73970703, + 0x9b949b91, + 0xfb2e5e87, + 0x0307c407, + 0x07fcb25e, + 0x5e430724, + 0xff1efcf4, + 0xb2b44ce0, + 0x0e4de001, + 0x1e01fb01, + 0x9b4007f2, + 0x5e499b3a, + 0x1e3bfd5e, + 0x31272c3b, + 0x312b4127, + 0x4f5e422b, + 0x3b4007fd, + 0x5e4c3b3e, + 0xfec1fd46, + 0xc5eff654, + 0x58f0c1f8, + 0xf8be03f2, + 0xf3114307, + 0x348d4103, + 0x871fe6ea, + 0x03420700, + 0xf0c49d41, + 0xa9f8a75e, + 0xc50374de, + 0xa95e4cfe, + 0x6cf4c1f9, + 0xc1f7cf5e, + 0x985ee0d8, + 0x278f07f7, + 0x27150760, + 0x27649641, + 0x91b70740, + 0x5bfe81fc, + 0x2bc45bb4, + 0x07c90bbe, + 0x2b61030b, + 0x1bbcc20c, + 0xfe3725be, + 0x40070fab, + 0x800d459b, + 0x01234c0b, + 0x800d4b0a, + 0x41038409, + 0x8203840d, + 0xa9c362c4, + 0x090374d1, + 0x7ed0a9f2, + 0x4cf1c501, + 0x8d54f0c5, + 0xf429e8d2, + 0x03ead3a9, + 0x03edd1b9, + 0x5eeed48d, + 0xc499f6d6, + 0x9d4103f2, + 0x215ef2c4, + 0x202100f8, + 0x5e902722, + 0x9507f6b4, + 0xad5e9153, + 0x5e4027f6, + 0x20a7fbb3, + 0x27f5685e, + 0xf9a95e00, + 0xc55e2703, + 0xf64027fa, + 0x27fd49ef, + 0xfd445e00, + 0xf09330a7, + 0x1500c5c0, + 0x7dd4b903, + 0x74d2a901, + 0x23340703, + 0x0f4c8341, + 0x43333333, + 0xfef43e23, + 0xf44e23ff, + 0xd3c5fffe, + 0xd4d4c5d8, + 0xd0c524b6, + 0x6cd1a9d4, + 0xa6d08903, + 0x89bed18d, + 0x0103bed3, + 0x44272007, + 0xd49d239b, + 0x273387b0, + 0xc0d38d48, + 0x9dbcd28d, + 0x0303b1d4, + 0x1cbe1427, + 0xd389fe36, + 0xa74027c0, + 0xd17fff2e, + 0x8dbad08d, + 0xd48db4d3, + 0xd0d2c5dc, + 0x8dc4d48d, + 0xd48dc2d4, + 0xcad48dc8, + 0x8db6d48d, + 0xd38db8d4, + 0xc6d48db2, + 0x5eccd2c5, + 0x4127fcce, + 0x0124d4bd, + 0x07fc685e, + 0xbe16070d, + 0xb9fe0505, + 0x83036eda, + 0x695e0cac, + 0xe8d089fb, + 0x89ead289, + 0xd189eede, + 0xa7202bec, + 0xfddfff4e, + 0x1e2b329b, + 0x011443d5, + 0x4c9b4107, + 0xdfffbea7, + 0x18b4d5fd, + 0x1cb4d501, + 0xfaa65e01, + 0xc153c407, + 0xfc65c13b, + 0x00f5975e, + 0x27222021, + 0xf5845ea0, + 0xa153a507, + 0x27f57d5e, + 0xfabc5e40, + 0xcea74027, + 0x89fddfff, + 0xde89e8d0, + 0xead289ee, + 0xd5ecd189, + 0xd50114c4, + 0x2b0118c4, + 0xd51e2b20, + 0x5e011cc4, + 0x4203fa60, + 0x2405432b, + 0x6e5e2115, + 0x68f0c1f4, + 0x27eda87e, + 0x0bf49b40, + 0x270ef49b, + 0x7e112705, + 0x2ea7ee04, + 0x93fefdf3, + 0x00c473fb, + 0xb3012401, + 0x432bb211, + 0x20a7410c, + 0x5ee120c8, + 0x0000f3f9, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000001, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x000149e1, + 0x000149e6, + 0x000149ee, + 0x000149f6, + 0x000149fc, + 0x00014a03, + 0x00014a0e, + 0x00014a17, + 0x00014a20, + 0x00014a24, + 0x00014a2a, + 0x00014a34, + 0x00014a3c, + 0x00014a4a, + 0x00014a57, + 0x00014a5e, + 0x00014a6a, + 0x00014a74, + 0x00014a7f, + 0x000149e1, + 0x00014a8a, + 0x00014a92, + 0x00014a9a, + 0x00014abe, + 0x00014a9e, + 0x000149ee, + 0x00014aa7, + 0x00014ab1, + 0x00014abb, + 0x00014ac5, + 0x00014acf, + 0x00014ad7, + 0x00014ae0, + 0x00014ae6, + 0x00014aed, + 0x00014af3, + 0x00014afe, + 0x00014b08, + 0x000149e1, + 0x00014a8a, + 0x00014b0e, + 0x00014b12, + 0x00014b16, + 0x00014a84, + 0x00014abe, + 0x00014b21, + 0x000149e1, + 0x00014a8a, + 0x00014b2f, + 0x00014b38, + 0x00014b41, + 0x00014b45, + 0x00014b4c, + 0x00014b54, + 0x00014b5c, + 0x00014b65, + 0x00014b6f, + 0x00014b7a, + 0x00014abe, + 0x00014b84, + 0x00014b8e, + 0x00014b98, + 0x00014ba1, + 0x00014bab, + 0x00014bb2, + 0x00014bbc, + 0x00014b21, + 0x00014bc9, + 0x00014bd6, + 0x00014bd9, + 0x00014be3, + 0x000149e1, + 0x00014a8a, + 0x00014beb, + 0x00014bf3, + 0x00014abe, + 0x00014b21, + 0x00014a84, + 0x00014b5f, + 0x00014c01, + 0x00014bfb, + 0x00014c0b, + 0x00014c1b, + 0x00014c24, + 0x00014c2c, + 0x00014c34, + 0x00014c3d, + 0x00014c48, + 0x00014c55, + 0x00014c62, + 0x000149e1, + 0x00014a8a, + 0x00014c69, + 0x00014c74, + 0x00014c7c, + 0x00014abe, + 0x00014b21, + 0x00014c80, + 0x00014c88, + 0x00014c93, + 0x00014a84, + 0x00014c9c, + 0x00014ca8, + 0x00014cb3, + 0x00014cbd, + 0x00014cc8, + 0x00014ccf, + 0x00014cdd, + 0x00014cec, + 0x000149e1, + 0x00014cf1, + 0x00014bd9, + 0x00014cf6, + 0x00014cfa, + 0x00014d02, + 0x00014d0a, + 0x00014d14, + 0x00014ab7, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, +}; +const int fw_jpegdec_size = 184192; diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/fw_jpegenc.c b/src/little/linux/drivers/media/platform/canaan-vpu/fw_jpegenc.c new file mode 100755 index 000000000..bfb72957a --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/fw_jpegenc.c @@ -0,0 +1,69443 @@ +const unsigned int fw_jpegenc[] __attribute__((aligned(0x1000))) = { + 0x0000eb5e, + 0x02020305, + 0x33363635, + 0x32303137, + 0x69746f4d, + 0x4a206e6f, + 0x20474550, + 0x6f636e45, + 0x00726564, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x4745504a, + 0x20434e45, + 0x33346332, + 0x31643430, + 0x30703172, + 0x6530302d, + 0x00306361, + 0x00000000, + 0x00043d00, + 0x00045000, + 0x00000015, + 0x001f9b95, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00054000, + 0x00005378, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x01a70d27, + 0x6ea7f07b, + 0x53fdcfff, + 0xa50207f0, + 0x25012760, + 0x25002760, + 0x0ef09b60, + 0x4fff6ea7, + 0x036101fd, + 0xa3143311, + 0x3861c510, + 0xce3860c1, + 0x1ea7f810, + 0x27ffffff, + 0x07142131, + 0x24169924, + 0x96806c40, + 0x806c2765, + 0x2724169d, + 0x03302761, + 0x27620e21, + 0x0b510720, + 0x66501952, + 0xf042ce0b, + 0x33273826, + 0x270d139d, + 0x6a13bd31, + 0x9b002704, + 0x10990ef0, + 0xff6ea70f, + 0x0233fd4f, + 0x63c5600b, + 0x9b302740, + 0x6ea70ef3, + 0xc5fd4fff, + 0x0d273863, + 0xf0e81000, + 0x1225871e, + 0x501d0127, + 0x070c1399, + 0x9d310353, + 0x32070c13, + 0x9b182c33, + 0x21a304f2, + 0xffff0ea7, + 0x270205fe, + 0x0ef29b20, + 0x059d0315, + 0x000d2708, + 0xcdf19302, + 0x2d27046c, + 0xf09b0400, + 0x93f10706, + 0x04473ff1, + 0x0b361001, + 0x10050127, + 0x4132f093, + 0x2df39304, + 0x03c2043e, + 0x0331011e, + 0x30ca803c, + 0x1df393f9, + 0xf293043e, + 0x01043818, + 0x05240321, + 0xca340331, + 0x58bef630, + 0x00270002, + 0xbe0bf09b, + 0x27000280, + 0x9b102701, + 0xff8b06f0, + 0x0000fd1e, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x01a70d27, + 0x6ea7f07b, + 0x93feffff, + 0x000213f1, + 0x937f1ce3, + 0x00020bf2, + 0x05b66001, + 0x9bfa21d2, + 0x1c030ff1, + 0xe3f21e80, + 0x04f09b01, + 0x02000d27, + 0x8bcef193, + 0x012d2704, + 0x06f09b20, + 0x22bef107, + 0xff8b0069, + 0x0000fd1e, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x01a70d27, + 0x6ea7f07b, + 0x93feffff, + 0x000193f1, + 0x937f1ce3, + 0x00032df2, + 0x05b66001, + 0x9bfa21d2, + 0x1c030ff1, + 0xe3f21e80, + 0x04f09b01, + 0x02000d27, + 0xbacef193, + 0x022d2704, + 0x06f09b20, + 0x61bef107, + 0xff8b0001, + 0x0000fd1e, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x01a70d27, + 0x6ea7f07b, + 0x93feffff, + 0x0002b5f1, + 0x937f1ce3, + 0x0004acf2, + 0x05b66001, + 0x9bfa21d2, + 0x1c030ff1, + 0xe3f21e80, + 0x04f09b01, + 0x02000d27, + 0xd2cef193, + 0x032d2704, + 0x06f09b20, + 0x83bef107, + 0xff8b0002, + 0x0000fd1e, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x01a70d27, + 0x6ea7f07b, + 0x93feffff, + 0x000434f1, + 0x937f1ce3, + 0x00050cf2, + 0x05b66001, + 0x9bfa21d2, + 0x1c030ff1, + 0xe3f21e80, + 0x04f09b01, + 0x02000d27, + 0xf7cef193, + 0x042d2704, + 0x06f09b20, + 0x02bef107, + 0xff8b0004, + 0xf09bfd1e, + 0x07fe0b06, + 0x4efe0b0f, + 0x25fd93f5, + 0xd0010000, + 0xf08b0506, + 0xf71ed403, + 0xf54ef58e, + 0x0016fd93, + 0x06d00100, + 0x03f08b05, + 0x8ef71ed4, + 0x000000f5, + 0x00000000, + 0x00000000, + 0xf3abfe4e, + 0xabc2f493, + 0xbef41b00, + 0x930041bb, + 0x044187f0, + 0xedbe1027, + 0xfe0e0030, + 0x0066a69e, + 0xf493fa4e, + 0x1b00ae00, + 0xff3ea7f4, + 0x4d27fd7f, + 0x34250202, + 0xf2ab3415, + 0xf0eb0127, + 0xffff1ea7, + 0x184d27eb, + 0x27140501, + 0x4000003f, + 0x27131502, + 0x14c5214c, + 0xa720275c, + 0xfefddb1e, + 0xfe931215, + 0x1504b920, + 0xd3cea7e2, + 0xc215fefd, + 0xb91afb93, + 0xa7b21504, + 0xfefdcb3e, + 0xfa933225, + 0x1504b914, + 0xff4ea7a2, + 0x40c5e7ff, + 0x05120550, + 0x05c205e2, + 0x153205b2, + 0x01fd9332, + 0xa20504b9, + 0x01d8d2d5, + 0x01dcd2d5, + 0xa70ef29b, + 0xfdcfff3e, + 0xfe52f493, + 0x3534b5ff, + 0x93323530, + 0xfffec7f4, + 0x453034c5, + 0xa7324530, + 0xfddfff1e, + 0x14c54727, + 0x5412c550, + 0x20004d27, + 0x275814c5, + 0xc540003d, + 0x0ea75c13, + 0x27f3ffff, + 0x5404c548, + 0xffff1ea7, + 0x91fe93fe, + 0x02c50269, + 0xa7402754, + 0xfefdbf3e, + 0x077fece3, + 0x6414adc1, + 0x78d3d519, + 0x48c4d101, + 0xc0362701, + 0xeff41843, + 0x00028bb4, + 0xfe9b00a5, + 0x48c4d10f, + 0x80ec0301, + 0x43c43627, + 0x974ea7ea, + 0x2027fef6, + 0x0148c0d1, + 0xad09429d, + 0xa70142c2, + 0x7cd4d510, + 0x9d302701, + 0x41450443, + 0x3505429d, + 0x0a429d41, + 0x429d426d, + 0x1103c008, + 0xffff2ea7, + 0xe84627fe, + 0x4823d1f4, + 0xf633c401, + 0xffff4ea7, + 0x09f393ff, + 0x42d104b9, + 0x13070458, + 0xa7971c03, + 0xfef6974e, + 0x1ce34205, + 0x7f3ce37f, + 0x3c033419, + 0xf931c280, + 0x93262c27, + 0x04b8e3f3, + 0x42071027, + 0x21233105, + 0xf4b83403, + 0xe6674ea7, + 0xedf093fe, + 0xd2c504b7, + 0xf4d4c568, + 0xbe6cd2c5, + 0x1e027375, + 0x5ef3e8ff, + 0xfa4eff49, + 0xce3af393, + 0x48f29304, + 0x3ce304d5, + 0x7f2ce37f, + 0x3c033419, + 0xf932c280, + 0xacbaf493, + 0xa7f41b00, + 0xfd6fff3e, + 0x42024d27, + 0x34153425, + 0x4127f2ab, + 0xf093f4eb, + 0x2704d018, + 0xa7e00730, + 0xebffff4e, + 0xf2934335, + 0x9304cff8, + 0x04cffbf1, + 0x01cfed03, + 0x13152315, + 0x13052305, + 0xe37fece3, + 0x04197f0c, + 0xc2800c03, + 0xf393f90e, + 0x2704cfe4, + 0x744c2720, + 0x34033205, + 0xfd93f4c8, + 0x0704d1a4, + 0x7fdd033d, + 0xe32d0702, + 0x2ce37f3c, + 0x7fdd237f, + 0x03341902, + 0x32c2803c, + 0xa0ac27f9, + 0xd182f393, + 0x07202704, + 0x2332054a, + 0xb83403a1, + 0xf1fe93f4, + 0xb42704d3, + 0xc127eb1d, + 0xdcc5e227, + 0xd5c327a0, + 0xd50140de, + 0x9301e0dc, + 0x04d163f0, + 0x2a271827, + 0x0c003d27, + 0xda054927, + 0x00667bbe, + 0xd196f093, + 0x27142704, + 0x3d272c2c, + 0x48271800, + 0x006667be, + 0xf01fcea7, + 0xd5f093ff, + 0x192704d1, + 0x3d272b27, + 0x49270e00, + 0xc54cdcc5, + 0x49be94da, + 0xf0930066, + 0x2704d204, + 0x2d2c2715, + 0x19003d27, + 0xdcc54827, + 0x34dad5ec, + 0x662ebe01, + 0x41f09300, + 0x1a2704d2, + 0x270c2c27, + 0x2710003d, + 0x661abe49, + 0xcdf09300, + 0x1b2704d2, + 0x270d2c27, + 0x2712003d, + 0x6606be49, + 0x61f09300, + 0x162704d2, + 0x272e2c27, + 0x271a003d, + 0x65f2be48, + 0x2f2c2700, + 0x1b003d27, + 0xf0934827, + 0x2704d2e4, + 0x65debe17, + 0x7f4ea700, + 0xdcd5fee7, + 0xdad5018c, + 0x3ea70274, + 0x19fee6ff, + 0x93341942, + 0x04d313fe, + 0x3ea74027, + 0x27fee73f, + 0xe49d26dc, + 0x38eac586, + 0xc598eac5, + 0xeac59cea, + 0x3ceac5ac, + 0xc530eac5, + 0xe3c534ea, + 0x072027a0, + 0x2332054d, + 0xb83403d1, + 0xff2ea7f4, + 0x1027feff, + 0x196c21ad, + 0x24bd4027, + 0x3ea70214, + 0xa7fee65b, + 0xfee73f4e, + 0x196621ad, + 0xf0934355, + 0xa704d2bc, + 0xfefa2b4e, + 0x196821ad, + 0xd5a4e4c5, + 0x0e18bc2d, + 0x85b69efa, + 0xa3fd4e03, + 0x69f493f4, + 0xf41b00ab, + 0x5fff3ea7, + 0x024d27fd, + 0xb1fd9382, + 0x342504f3, + 0xdc032d07, + 0x07341597, + 0x7f2ce33d, + 0x237f3ce3, + 0x241997dc, + 0xc2802c03, + 0xec27f923, + 0x8df39326, + 0x202704f3, + 0x32054e07, + 0x3403e123, + 0x2ea7f4b8, + 0x05fdeb9f, + 0x004f272e, + 0x15050300, + 0x65f19324, + 0x3ea704f3, + 0x55fee64f, + 0x051e15d3, + 0x9b40271e, + 0xf3ab0ef4, + 0xf2eb2127, + 0xdfff4ea7, + 0xc44ec5fd, + 0x27c84ec5, + 0xc520003d, + 0x42d5cc43, + 0x3ea7015c, + 0xd5feffff, + 0xa719603e, + 0xe7ffff4e, + 0x40274e35, + 0x04d0d4bd, + 0x4f073027, + 0xf322f093, + 0xd2d38d04, + 0x0100dead, + 0x0108d4d5, + 0x04c8ded5, + 0x04ccded5, + 0x04d8ded5, + 0x0520ded5, + 0x8dd4de8d, + 0xde8dd6de, + 0xdade8dd8, + 0x8df8de8d, + 0xde8dfade, + 0x2e4ebefc, + 0x8ef48304, + 0x000000fd, + 0x660ef493, + 0xc0400104, + 0x01211d0f, + 0x41270f00, + 0x2b690f00, + 0x40270001, + 0xfe0b0407, + 0xfe0b0127, + 0xd007fb4e, + 0x08c6db3e, + 0xe68b2ea7, + 0x082499fe, + 0x93524dce, + 0x052907f1, + 0x4fff4ea7, + 0x9d4311fd, + 0x1199082d, + 0x9d230544, + 0xfb8e0921, + 0x65caf493, + 0x29406904, + 0x7feea742, + 0x4309fee6, + 0x0b08e199, + 0x21032b02, + 0xce4b494c, + 0x4ea72b1d, + 0x11fd4fff, + 0x7f3ea742, + 0x3205fee6, + 0x9d083d9d, + 0x304d093c, + 0xfb8e3b6d, + 0x28b6f193, + 0x09239905, + 0xce4414c1, + 0xfb8ea743, + 0xce09e499, + 0xe449d1c4, + 0x69cc40ce, + 0xc7b4cee4, + 0x3ea7dd1e, + 0x99feffff, + 0x1ea70934, + 0x83ffffff, + 0x87410343, + 0x5012d134, + 0x2b443304, + 0x4843f143, + 0x56ff0000, + 0x5c14d12a, + 0xc2012704, + 0xf1ab2834, + 0x23873127, + 0x31c038a6, + 0xbc34f921, + 0x03ff0119, + 0xf1478631, + 0x02300024, + 0x1244d8ff, + 0x83e435d0, + 0x0bf1eb01, + 0x1e0027fe, + 0x1e3103d6, + 0xeb0027d6, + 0x4efe0bf1, + 0x51f093fa, + 0xd8be0088, + 0xf0930070, + 0xbe008851, + 0xa70070cf, + 0xfffbf34e, + 0xf0934249, + 0x07008866, + 0x0cac33a2, + 0x070c1c27, + 0x70b5be3a, + 0xedbea700, + 0xdc27fffb, + 0x07b2090d, + 0x3bc2071d, + 0x43f093cd, + 0x3c070088, + 0x98beb203, + 0xac0b0070, + 0xbfc4d103, + 0xff000430, + 0xf3cea7e1, + 0xc189fffb, + 0x48f09332, + 0x7cbe0088, + 0xc1a10070, + 0x2107c3b1, + 0xf0934a07, + 0x2b00884f, + 0x9efa0e2a, + 0x4e007067, + 0x7a44befe, + 0xff3ea700, + 0x3411feff, + 0x886cf093, + 0xf1448700, + 0x000fb841, + 0x7049beff, + 0x5efe0e00, + 0xfe4eff63, + 0xebef2ea7, + 0x053027fd, + 0x004e2723, + 0x24150500, + 0xf39be107, + 0xff3ea70e, + 0x3411fdef, + 0x33240c03, + 0x4c53184c, + 0x24ec031d, + 0x071244c4, + 0xe8432723, + 0x332311f4, + 0x3c53183c, + 0xf234c01d, + 0xe7ff3ea7, + 0x273005fd, + 0x1508bc1d, + 0x35202731, + 0xef4ea732, + 0x4e05fde7, + 0x3ea74115, + 0x35fdefff, + 0x33345142, + 0x4c53184c, + 0x1244c41d, + 0x43272307, + 0x2351f4e8, + 0x53183c33, + 0x34c01d3c, + 0xbf4ea7f2, + 0x0d03fde7, + 0x400508bc, + 0x08bc2d27, + 0x30274215, + 0xe20b4335, + 0xe7af4ea7, + 0x154e05fd, + 0x8e433542, + 0xe9f493fe, + 0x40010526, + 0xffff1ea7, + 0xff545eff, + 0xdea7fc4e, + 0x27ffffff, + 0xd1102702, + 0xbe0450dc, + 0xb900bc0c, + 0x270c38d4, + 0x27c48631, + 0x8b415330, + 0x8b41c330, + 0x2744c643, + 0xa7fc8e01, + 0xfd4fff4e, + 0x00274201, + 0xf49b4027, + 0x9911270e, + 0x123b0ed3, + 0x3ea713cb, + 0x38fd4fbf, + 0x05412711, + 0x03115334, + 0x8e12d634, + 0xf1f193fc, + 0x13010573, + 0x937f0c03, + 0x0573e3f4, + 0x0b7f0ce3, + 0x05420103, + 0x0b030710, + 0x4efe0b02, + 0xff3ea7fe, + 0x4027ffff, + 0xbd0d3299, + 0x10046a34, + 0x87202724, + 0x3841f142, + 0x270000c0, + 0x723f9e01, + 0xa7fd4e00, + 0xfd4fff3e, + 0x07683dc1, + 0x0f4de34d, + 0x004fc4f0, + 0x4d566301, + 0xd87434c1, + 0x0100004e, + 0xff2ea772, + 0x21a1d07f, + 0x4c5324a1, + 0x0f4c830c, + 0x0f0f4cc0, + 0x22a124a1, + 0x2c832853, + 0x0923d40f, + 0x24a1fd8e, + 0xfd8e23a1, + 0x0fff1d83, + 0x87adf093, + 0x27322700, + 0x6ea9be42, + 0x93042700, + 0x0087d7f1, + 0x0071dc9e, + 0x86caf093, + 0x6e95be00, + 0xecf09300, + 0x1f270086, + 0x56637102, + 0x006e86be, + 0xf0931d07, + 0xbe008701, + 0x27006e7b, + 0x1cf19304, + 0xae9e0087, + 0x04270071, + 0x8742f193, + 0x71a39e00, + 0x23fa4e00, + 0xd2f093f5, + 0x58be0087, + 0xf093006e, + 0xbe0087e2, + 0x93006e4f, + 0x052724fb, + 0xfe72dea7, + 0x1ea027ff, + 0x03a1030d, + 0xdc0310bc, + 0x10acc014, + 0x23ed0762, + 0xd8ec01e1, + 0x030000ce, + 0x19b059e9, + 0x19b123b3, + 0x99b103b4, + 0xb19908b2, + 0x15f20509, + 0x39e201f1, + 0x122c53be, + 0xf2252183, + 0xcc53d119, + 0xc1f13510, + 0xf05507d2, + 0xf2450e3b, + 0xdec1f065, + 0x072c070b, + 0x9323831a, + 0x0087c2f0, + 0xa103c027, + 0xfc85fe75, + 0xbe10bc03, + 0x03006ddb, + 0xacc414dc, + 0xf093a010, + 0xbe0087df, + 0xa7006dcb, + 0xffffffce, + 0x0100c1b9, + 0x93fcc2c1, + 0x0087def0, + 0x006db6be, + 0x87ebf093, + 0x6dadbe00, + 0xfcc1c100, + 0x0100cab9, + 0xa1e2a10b, + 0xd10700d0, + 0xf900af5e, + 0x00007c10, + 0xa00fe6ff, + 0x33320700, + 0x2b228734, + 0x33430732, + 0x07430b43, + 0xf9e333e4, + 0x00007f13, + 0x8312f9ff, + 0x0bff0000, + 0xd0ef03e4, + 0x99000552, + 0xf21507e4, + 0xe399f305, + 0x25200705, + 0x38e3c1f3, + 0xe199f335, + 0x453c0768, + 0x69e099f1, + 0xf0551d07, + 0x936aec99, + 0x0087baf0, + 0xeb99fc65, + 0x99fb756b, + 0xfc856cec, + 0x956deb99, + 0x6eec99fb, + 0xeb99fca5, + 0x99fbb56f, + 0xfcc570ec, + 0x71eb9930, + 0x9934fbc5, + 0xfcc572ec, + 0x73eb9938, + 0x993cfbc5, + 0xfcc574ec, + 0x75eb9940, + 0x9944fbc5, + 0xfcc576ec, + 0x77eb9948, + 0xbe4cfbc5, + 0x03006cf3, + 0x1dadced1, + 0x2c832d07, + 0x3312070f, + 0x7e1cf913, + 0xe6ff0000, + 0xf9ff42cf, + 0x00007c10, + 0xff435eff, + 0xfa8ef503, + 0xfc93fc4e, + 0xc1057180, + 0xc1c13cce, + 0x34c2c130, + 0x8940c389, + 0xf06342c4, + 0xf093fe05, + 0xbe008794, + 0x93006cab, + 0x0087d6f0, + 0x006ca2be, + 0xc311c219, + 0x87e9f093, + 0xbe102700, + 0x03006c93, + 0xd1270ccc, + 0xc311c219, + 0xf0931d07, + 0x030087d3, + 0x6c7dbed1, + 0x0ccc0300, + 0x93ead4c4, + 0x0087d5f0, + 0xfc0ef043, + 0x006c6a9e, + 0xf093fe4e, + 0xbe0087e5, + 0xbe006c5f, + 0x7e00786f, + 0xf27efbf3, + 0x1efe0efd, + 0x99fb4e84, + 0xd1271004, + 0x03c14153, + 0x07b10738, + 0xabd43bc2, + 0x6bbf6bd3, + 0x271027cf, + 0x4127112c, + 0x4d8b413b, + 0x4d861103, + 0x07680499, + 0x03e433e4, + 0x054260ef, + 0xff4cc000, + 0x84e3b915, + 0x85e4b901, + 0x2b3b2b01, + 0x85e4bd4c, + 0x84e3bd01, + 0x69049901, + 0xe433e407, + 0x4260ef03, + 0x4cc00005, + 0xe3b915ff, + 0xe4b90184, + 0x3b2b0185, + 0xe4bd4c2b, + 0xe3bd0185, + 0x02030184, + 0x8ea8f2f0, + 0x07fc4efb, + 0x0fdc83d0, + 0x0ea7cd07, + 0x33ffffdf, + 0x7073bec3, + 0x7cc2f900, + 0xdcff0000, + 0x072d102c, + 0x333d874d, + 0x07432b44, + 0x0b033304, + 0x07300704, + 0x0b333342, + 0x104ca303, + 0x007cc4fd, + 0x0f03ff00, + 0x000552d0, + 0x20271127, + 0xa7ff407e, + 0xffffdf0e, + 0x007011be, + 0xffff4ea7, + 0x0e4199ff, + 0xfb9d0ea7, + 0x9efc0eff, + 0x4e0073a4, + 0x07c107fb, + 0x27b207d0, + 0x6b102702, + 0xb7eabebf, + 0x07c59600, + 0xf64b8b40, + 0x8e00b14f, + 0xfcc2c4fb, + 0x015ff393, + 0x95f49301, + 0xf1930522, + 0x05057040, + 0x07202743, + 0x464c2731, + 0x34033205, + 0x4c27f4c8, + 0x483c2770, + 0xc50c148d, + 0x20a7d013, + 0x70f6f393, + 0x05482705, + 0xc8340332, + 0x09f393f4, + 0x00a70571, + 0x48272827, + 0x21233005, + 0xf4b83403, + 0x2256fc93, + 0x07f49305, + 0xf3930103, + 0x15057000, + 0x270c0714, + 0xc51225b1, + 0x66be50c3, + 0xcb9d0100, + 0x0046be05, + 0x9d402701, + 0xc49d0dcb, + 0x1d422704, + 0xff3ea7d4, + 0x3201fd4f, + 0xf49b4027, + 0xff3ea70e, + 0x3499ffff, + 0x3b31270e, + 0xa734cb32, + 0xfd4fbf2e, + 0x41273138, + 0x31532405, + 0x32d62403, + 0xfc93fb8e, + 0x990521f8, + 0x46f605c4, + 0xd21d2027, + 0xffff3ea7, + 0xad4027ff, + 0xbd119a34, + 0x8e119832, + 0xf89e7efb, + 0x0c070706, + 0x00fffcbe, + 0xc605c499, + 0xd9bedb4f, + 0xe5be00ff, + 0xd11e00b6, + 0x00ffe4be, + 0x00b6dbbe, + 0x0f6be11e, + 0x34333007, + 0x302b0087, + 0x8fc43f03, + 0x34190005, + 0x270941c4, + 0x1d012742, + 0x27fe0b34, + 0x0bfe0b00, + 0x07fc4efe, + 0x76fcabd0, + 0xff3ea7cb, + 0x34c1ffff, + 0x154dc2fc, + 0x663fdc27, + 0xdf0ea7c5, + 0xabbeffff, + 0xfceb006e, + 0xfc8e0d07, + 0x010033b9, + 0x34d24d1b, + 0x0fdc830e, + 0xddf9d333, + 0xff00007c, + 0xd027da1e, + 0x0ea7d61e, + 0xbeffffdf, + 0x1e006ea5, + 0xff4ea7bd, + 0x41b9ffff, + 0x40c10100, + 0x071926fc, + 0x0f3c8330, + 0x34f93333, + 0xff00007e, + 0x21074756, + 0x01034027, + 0x007c34fd, + 0x3007ff00, + 0x330f3c83, + 0xf0112333, + 0x4ea70ff2, + 0xbdffffff, + 0xc5010041, + 0xfe0bfc40, + 0x007e34f9, + 0x4fc6ff00, + 0xff4ea7d4, + 0x41bdffff, + 0x40c50100, + 0x27fe0bfc, + 0xa7fe0b00, + 0xfffbf34e, + 0x0ea74149, + 0x33fffbed, + 0x2c270c1c, + 0x0f3c270d, + 0x02030409, + 0x140b423b, + 0xf3982103, + 0xfbf34ea7, + 0x2b40a1ff, + 0x93fe0b01, + 0x05207ff4, + 0x0b144099, + 0x07fd4efe, + 0x271007d0, + 0xf0934c2c, + 0xbe05232c, + 0x0600636d, + 0x930d0708, + 0x05231ff3, + 0x01134c27, + 0x05040302, + 0xa8340332, + 0x933127f4, + 0x052087f4, + 0x8e0a439d, + 0x07f94efd, + 0x23c107a0, + 0x114714ac, + 0x13091a0b, + 0x0999d007, + 0x073e6624, + 0x2340070c, + 0x493b0c4c, + 0x3123d201, + 0xe20be487, + 0x4e0b4387, + 0x4b01130d, + 0x27320cc2, + 0x47493b44, + 0x07300720, + 0x0722231e, + 0x23e007d4, + 0x0b142b31, + 0x2bd0132a, + 0x413ccaec, + 0x41270123, + 0x4b0b403b, + 0x230d3127, + 0x22231405, + 0xfe581d0b, + 0xf98e0b07, + 0x41034c07, + 0xec272447, + 0x0b0c071c, + 0xd4ec2b2a, + 0x071a1d4c, + 0x03010312, + 0x07fef022, + 0x0b07b027, + 0x1309f98e, + 0x8a1e31e6, + 0xbd1ee127, + 0xe41ee127, + 0xf0930230, + 0x0b008433, + 0xddf393fe, + 0x4027051f, + 0x275d309d, + 0x6034c500, + 0x0230fe0b, + 0x843ff093, + 0x93fe0b00, + 0x051f87f3, + 0x341d4027, + 0x412704c6, + 0x0027341d, + 0x4ea7fe0b, + 0xd5ffffff, + 0x860c3c40, + 0xff1ea708, + 0x1341fdaf, + 0x9fff2ea7, + 0x05300bfd, + 0x27242113, + 0x104ce300, + 0x23112425, + 0x15103ca3, + 0xa7fe0b23, + 0xfd9fff3e, + 0x00273411, + 0x15104ce3, + 0x93fe0b34, + 0x051f73f4, + 0x536840c5, + 0xa7018307, + 0xffffff4e, + 0x2745409d, + 0x07fe0b00, + 0xd0412340, + 0x04c01442, + 0x0e08c011, + 0x20100c40, + 0xf093200c, + 0x0b0083e2, + 0x41f393fe, + 0x3499051f, + 0x36408b56, + 0xf3f09345, + 0xfe0b0083, + 0x2754309d, + 0xa7fe0b00, + 0xfffbf33e, + 0x0e3434c1, + 0x3430c504, + 0xfe0b0027, + 0x03490469, + 0x202043ce, + 0x24f09338, + 0xfe0b0084, + 0x1ecaf493, + 0x17439d05, + 0x31272827, + 0x439d0027, + 0x16429d15, + 0xf093fe0b, + 0x0b0083d6, + 0x234007fe, + 0x93423041, + 0x00842cf0, + 0xf393fe0b, + 0x9d051ea0, + 0x41271930, + 0x349d0027, + 0x93fe0b18, + 0x051e8ff3, + 0x26183499, + 0x19309945, + 0xfe0b0240, + 0x04c40783, + 0x101c83f8, + 0x14d60127, + 0xfe0b0313, + 0x03130027, + 0x0e10f91e, + 0x27010000, + 0x93ffff0d, + 0x051e5ff4, + 0x00274015, + 0x0230fe0b, + 0x840bf093, + 0x93fe0b00, + 0x051e4bf4, + 0x0027403d, + 0x0411fe0b, + 0x45760321, + 0xf0933606, + 0x0b008442, + 0x14f093fe, + 0xfe0b0084, + 0x1e2af493, + 0x45002705, + 0x0b433543, + 0x4ef093fe, + 0xfe0b0084, + 0x8467f093, + 0x93fe0b00, + 0x051e0ff4, + 0xfe0b4059, + 0x847af093, + 0x30fe0b00, + 0x9af09304, + 0xfe0b0084, + 0x1df6f393, + 0x9d412705, + 0x00271b30, + 0x0b1a349d, + 0x930230fe, + 0x0084a5f0, + 0x3127fe0b, + 0x30270496, + 0xffff4ea7, + 0xbd0027ff, + 0x0b0fb443, + 0xe3f54efe, + 0x58f0c5f6, + 0x27240299, + 0x3b4f0731, + 0x03e00732, + 0xf2c5404c, + 0x4cf3c554, + 0x235cf1c5, + 0x2f0714ec, + 0x2768f4c5, + 0x4027103c, + 0x24032405, + 0xf3c1f3b8, + 0x2320274c, + 0xc54a2731, + 0xf2c540fe, + 0x0d6c2748, + 0xc560f3c5, + 0xf2c164f4, + 0x1a238940, + 0xc5182789, + 0x72f050f3, + 0xf4c100b1, + 0xaa34ee4c, + 0x54f2c100, + 0x4c234607, + 0xc1423b0d, + 0x048758f2, + 0x030b2301, + 0x01007fe6, + 0xc150f4c1, + 0x24e260f2, + 0x46070103, + 0x2354f2c1, + 0x423b0c4c, + 0x2350f2c1, + 0x87420b61, + 0x0b812754, + 0x3b302753, + 0x03a20786, + 0xc5100761, + 0x902744f3, + 0x0201c707, + 0x42073f07, + 0x4c83465b, + 0x0bd4870f, + 0x0734013d, + 0xe6e48be8, + 0x0700854f, + 0xd63207b4, + 0x073407e4, + 0x0b4307b2, + 0x774bce48, + 0x14031205, + 0x91030403, + 0x0748fcf0, + 0x4634013f, + 0x27140545, + 0x05140340, + 0x68f2c134, + 0x32ce3403, + 0x5cf3c1ed, + 0xc16936ce, + 0xf3c144f4, + 0x8d471b40, + 0x3a8d1834, + 0x40f4c11a, + 0x0364f2c1, + 0xc5212342, + 0xf2c540f4, + 0xf6610364, + 0xc1ff2d2f, + 0xf6c348f0, + 0xf4c1f58e, + 0x7fa4ea60, + 0x074907ff, + 0x2b410337, + 0x5874ca39, + 0x02017ee6, + 0x12050403, + 0xf3a81403, + 0x32059a1e, + 0xf2c18f1e, + 0x054f0744, + 0x03d40b53, + 0x03402722, + 0xc5a10354, + 0xd40544f2, + 0xc1ff775e, + 0x412750f2, + 0xf4c52a2e, + 0x278d1e48, + 0x48f4c540, + 0xfac1861e, + 0x07302750, + 0x44f3c510, + 0xc1ff5e5e, + 0x902750fa, + 0xf9c51007, + 0x279f1e44, + 0x0ba81e31, + 0x07fc4efe, + 0xfb277ec0, + 0x0c0e4127, + 0x04074027, + 0xfc4efc8e, + 0xcf03c007, + 0x03ffffff, + 0x0000cf83, + 0x1c07fc00, + 0x3c272027, + 0x68d1be16, + 0xf34ea700, + 0x3027fffb, + 0xc5404cc5, + 0x40c53c43, + 0x4efc8e38, + 0x23d007fa, + 0xc24714dc, + 0xdc03cd0b, + 0x24de9914, + 0x4127c009, + 0xb0074e3b, + 0x4223b30b, + 0xd301a307, + 0x0127b432, + 0x2c23fa8e, + 0x0b2e3b0c, + 0x0b008702, + 0xbe2a8703, + 0x27005eea, + 0x0d002741, + 0x31d49dcb, + 0xf74efa8e, + 0x27240399, + 0x63433b41, + 0x018407f0, + 0x0570070b, + 0x33d107f1, + 0x07948783, + 0x49a027c0, + 0x070d07c2, + 0x0322871b, + 0x5eb4bea1, + 0x0bb90b00, + 0xc4c203d8, + 0x99e910ac, + 0x7c012474, + 0x4103d407, + 0x0124749d, + 0x05d603f4, + 0x07070774, + 0x272d071f, + 0x7efc0531, + 0x0596ff6b, + 0x412773b1, + 0x340b4d3b, + 0xf04373b5, + 0xfe0bf78e, + 0x4ea7fd4e, + 0xb9ffffff, + 0x070fb443, + 0x76df6bd0, + 0x6df49337, + 0x3d270433, + 0x242707d4, + 0x43050407, + 0x4d254215, + 0xb79efd0e, + 0xf093005f, + 0xbe008217, + 0x1e006407, + 0x000000dd, + 0x00000012, + 0x00000032, + 0x00000030, + 0x00054242, + 0x3ea7f54e, + 0x99ffffff, + 0x4fe62734, + 0xf7930378, + 0x99051b34, + 0x4ff60874, + 0x30d1036c, + 0x38d10458, + 0x34a9045c, + 0x33a90102, + 0x802b0104, + 0xe3071407, + 0x20078f46, + 0x32072183, + 0x36334287, + 0x320b342b, + 0x44334307, + 0x420b432b, + 0xfb944e23, + 0x7042a9ff, + 0x7243a903, + 0x071e2b03, + 0xab320be1, + 0x8b3e2bef, + 0x1431ec3f, + 0x03180703, + 0x83400701, + 0x87340741, + 0x2b363324, + 0x07340b32, + 0x2b243323, + 0x23240b23, + 0xfffb942e, + 0xf1f88123, + 0x4ea702dd, + 0xd5ffffff, + 0x27045840, + 0x71f69380, + 0x5027051a, + 0xffff9ea7, + 0x5c9ad1ff, + 0x834a0704, + 0x87340741, + 0x2b363324, + 0x07340b32, + 0x2bb433b3, + 0x07b40bb3, + 0xb19abdcb, + 0x230a070f, + 0xfffb94ce, + 0x00f8c6be, + 0x02e704f8, + 0x4c834a07, + 0x3324070f, + 0x2b448724, + 0x33320724, + 0x07320b33, + 0x0bd333d3, + 0xd0df03d3, + 0x99000552, + 0x4ce004d4, + 0xc102fe10, + 0x41e030d4, + 0x93b90321, + 0x74d10c45, + 0x432b0f20, + 0x4f4b4223, + 0x033241ec, + 0xfedef153, + 0x2d073b07, + 0x3e231401, + 0x03fffa90, + 0x2101b02c, + 0x31052403, + 0xf4a83403, + 0x4227d301, + 0x3127c305, + 0x038dc4bd, + 0x038ec3bd, + 0x99a8d4c1, + 0xd38917d1, + 0xecc4d52c, + 0x34d4c102, + 0x0385c1bd, + 0xfea2f153, + 0x037ac3ad, + 0x030cc4d5, + 0x3d072c07, + 0x2d031401, + 0x3c03020c, + 0x033101f8, + 0x03210534, + 0xd1f4a824, + 0x0701c0d3, + 0xd4c3d54d, + 0x033c0702, + 0x0302d83d, + 0x2701c44d, + 0x03410124, + 0x03310544, + 0x09f2a834, + 0x0d0c0744, + 0x44d3c134, + 0xd5402c27, + 0x9902f0c3, + 0x0d0307d4, + 0xc4bd032c, + 0xd1c10388, + 0x10c1d530, + 0xc2d3b903, + 0x8cc3bd03, + 0x2ed48903, + 0xad4cd3c1, + 0x890370c4, + 0xc3d526d1, + 0xc1ad02f4, + 0xd489036c, + 0xad1d0728, + 0x03036ec4, + 0xdfbe681c, + 0x71c100ae, + 0x073c073c, + 0x04c1d54d, + 0x03340303, + 0x2701d84d, + 0x4101402c, + 0x31054403, + 0xf2a83403, + 0x0398d3a9, + 0xc3ad6449, + 0xc4ad0374, + 0x4ff60376, + 0xd3a9017a, + 0xf153039c, + 0xc3adfde0, + 0x2c070378, + 0x14013d07, + 0x014c2d03, + 0x02d83d03, + 0x34033101, + 0x24032105, + 0xd4b9f4a8, + 0x302703aa, + 0x31274486, + 0xbd5074c1, + 0x99037ec3, + 0xc4bd5444, + 0xd3b9037f, + 0xc3bd03a0, + 0xd4b90380, + 0xc4bd03a1, + 0xd1d10381, + 0xc1d503a4, + 0xd3b90328, + 0xc3bd03a8, + 0xd4b90382, + 0xc4bd03ab, + 0xd1d10383, + 0xc1d503b4, + 0xd3d10320, + 0xc3d503b8, + 0xd4c10324, + 0xf8c4d550, + 0x54d1c102, + 0x02fcc1d5, + 0xd558d3c1, + 0xb90300c3, + 0xbd03bcd4, + 0x990384c4, + 0xc1bd18d1, + 0xd3990389, + 0x86c3bd05, + 0xc1d4b903, + 0x87c4bd03, + 0x38d1c103, + 0x0314c1d5, + 0x03bed3b9, + 0x038fc3bd, + 0x03bdd4b9, + 0x0390c4bd, + 0xe61c6499, + 0x5300db4f, + 0x01fd23f1, + 0xc4d3d114, + 0x08c4d503, + 0x18c3d503, + 0x1b649903, + 0x038ac4bd, + 0x03c0d1b9, + 0x038bc1bd, + 0x03c8d3b9, + 0x4fff1ea7, + 0x92c3bdfd, + 0x89121103, + 0x94d14871, + 0x73d10450, + 0xc1ad0f20, + 0xd1b90372, + 0x410303c9, + 0x94d53103, + 0xc1bd0450, + 0x40270393, + 0x0f8893d5, + 0x0fb094bd, + 0x0fa892d5, + 0x0f2073d5, + 0x41034a07, + 0x045c94d5, + 0xf39b3027, + 0x2ed4890e, + 0xa7487389, + 0xfffb9f0e, + 0x748d430b, + 0xbe810348, + 0x2700683b, + 0x4282f051, + 0x1ed127fd, + 0x7223a922, + 0x7024a903, + 0x2b430b03, + 0xe84f8b4e, + 0xa7fcf241, + 0xffffff4e, + 0x045840d5, + 0xfd1381e0, + 0x0d07d027, + 0x7489f58e, + 0x74c4ad58, + 0x58748903, + 0x4fab4103, + 0xa958748d, + 0xee0376c3, + 0x27fe7143, + 0x9df19340, + 0x148d0517, + 0xfe645e58, + 0x2a5e4027, + 0x271527ff, + 0xff4ea725, + 0x7789fd4f, + 0xad431148, + 0xa70372c7, + 0xffffff4e, + 0x0fa843d5, + 0x0fb042bd, + 0x13c4d507, + 0xff3ea7ae, + 0x34d1ffff, + 0x0ea7045c, + 0x03fffb9f, + 0x5c34d541, + 0x67a5be04, + 0xd1941e00, + 0x16045094, + 0x04749948, + 0x1746fd93, + 0x1442dc05, + 0x127e0a07, + 0x04d499f4, + 0x42a31227, + 0xd49d2227, + 0x270b1e04, + 0x1e272717, + 0x2713279d, + 0xff4ea723, + 0x7789fd4f, + 0xad431148, + 0xa70372c7, + 0xffffff4e, + 0x43d5d127, + 0x42bd0fa8, + 0x971e0fb0, + 0x070c1c27, + 0xff735e21, + 0x1cd0fe4e, + 0x04411920, + 0x04514826, + 0x04894906, + 0x2749d61a, + 0x3af19306, + 0xca9e007e, + 0x06270062, + 0x7da7f193, + 0x62bf9e00, + 0x93062700, + 0x007dcff1, + 0x0062b49e, + 0xf1930627, + 0x9e007df0, + 0x270062a9, + 0x37f19306, + 0x9e9e007e, + 0xfe4e0062, + 0x5f0c0cc4, + 0x13111401, + 0x4a261021, + 0x073a44c0, + 0xe84d2343, + 0x194fd403, + 0x523b9ac6, + 0x24d11301, + 0x23c50108, + 0xa31311e4, + 0x0000004f, + 0xe823c510, + 0x24d51121, + 0x21c50108, + 0x26fe8eec, + 0x93042730, + 0x007e54f1, + 0x0062549e, + 0x4d234007, + 0x4f1403e8, + 0x3b9ac619, + 0x27b930c2, + 0x75f19304, + 0x3a9e007e, + 0x06270062, + 0x7e07f193, + 0x622f9e00, + 0x93042700, + 0x007e89f1, + 0x0062249e, + 0x3007fe4e, + 0x011d14d0, + 0x274a4004, + 0xbef19306, + 0x0e9e007e, + 0x01070062, + 0x04231307, + 0xfe0e1403, + 0x27ff655e, + 0x85f19306, + 0xf69e007e, + 0xfe4e0061, + 0xec03e007, + 0x870d0354, + 0x07200701, + 0x7f2ce33e, + 0x01870d23, + 0x197f3ce3, + 0x803c0334, + 0x07f932c2, + 0x2741073e, + 0x4e014d2c, + 0x3e054403, + 0xf2a83403, + 0x015f04b9, + 0x4a264183, + 0x010812d1, + 0x010c14d1, + 0x3f833207, + 0x03ffffff, + 0xd50f4ce3, + 0xd5010c14, + 0x38010813, + 0x0000003f, + 0xc0141901, + 0x2711ff4c, + 0x3014bd40, + 0x9dfe8e01, + 0x049d5804, + 0x83ca1e54, + 0xffffff2f, + 0xd5402702, + 0xbd010812, + 0x8e013014, + 0xd1fd4efe, + 0xd8010804, + 0x0000004f, + 0x03c14210, + 0x3e31c0e4, + 0x6432fd93, + 0x4ed40105, + 0x05412734, + 0x0cd49dd3, + 0x11e803c1, + 0x27344ed4, + 0x9dd31541, + 0x03c10cd4, + 0xced421ec, + 0x03071634, + 0x03334127, + 0x1a27032b, + 0x250cd49d, + 0x7460bed3, + 0x8ed01500, + 0xf5fd93fd, + 0xd4010563, + 0x43ce3227, + 0x00c61ec1, + 0x00fffffc, + 0x7007f54e, + 0xa107b207, + 0x2fc60481, + 0xa7940774, + 0xfdefff8e, + 0xe7ff5ea7, + 0xef6ea7fd, + 0x7299fde7, + 0x5b4a072d, + 0x3b312742, + 0xa1410332, + 0x87312372, + 0x07420b44, + 0x032307ca, + 0x07c38b21, + 0x012c2bdb, + 0xfdbe3040, + 0xf413ffff, + 0xc24d01b4, + 0xd20709d2, + 0x3327051e, + 0x8411f3e8, + 0x53184c33, + 0x44131d4c, + 0x7ef041c8, + 0xc00bf84b, + 0x5d155c05, + 0x54354027, + 0x6d156905, + 0xbd2b6435, + 0x9d0bb506, + 0x9f1ead0b, + 0xefff3ea7, + 0xd83411fd, + 0x0efc6a4d, + 0x43272307, + 0x2311f4e8, + 0xfc6a3ddc, + 0x654027f6, + 0x93f58e74, + 0x0450a3f0, + 0xf4933027, + 0x0500b94d, + 0x09039d04, + 0x0308039d, + 0xfe0b3c0c, + 0x0451f74e, + 0x320bb307, + 0x7007f063, + 0xc107d207, + 0x03553402, + 0xaea7de86, + 0xa7fdefff, + 0xfde7ff8e, + 0xe7ef9ea7, + 0x070707fd, + 0xbe2f071b, + 0x0100b2c6, + 0x024d07f3, + 0x054307d3, + 0x27051ef4, + 0x11f3e833, + 0x184c33a4, + 0x131d4c53, + 0xf041c844, + 0x8c05f301, + 0x40278315, + 0x90058435, + 0x94359315, + 0xd42bf401, + 0xc40bd506, + 0xbe1eb40b, + 0xefff3ea7, + 0xd83411fd, + 0x0efc6a4d, + 0x43272307, + 0x2311f4e8, + 0xfc6a3ddc, + 0x8ef043f6, + 0x51fa4ef7, + 0x0bb30704, + 0x07f06332, + 0x07d207a0, + 0x553402c1, + 0x07d92603, + 0x072f071b, + 0xb250be0a, + 0x07f30100, + 0x024d071c, + 0x074307d3, + 0xbef40524, + 0x0100a932, + 0x0bd42bf4, + 0xd6b40bc4, + 0xf043dadf, + 0xf94efa8e, + 0x3f6b9107, + 0x39962516, + 0xf98e0027, + 0x19fa22c4, + 0x404f4b04, + 0x65f49342, + 0x43190450, + 0xf4933186, + 0x9300ba5d, + 0x045053f3, + 0x22273405, + 0x921d0127, + 0xf493f98e, + 0x19045048, + 0x9335a643, + 0x051367f4, + 0xd6054399, + 0xfd93723f, + 0x99045038, + 0x49760fd4, + 0x40a73027, + 0xd39dd425, + 0x0ed39d0f, + 0xf49b4427, + 0x61fa9321, + 0xa499044f, + 0x7e477608, + 0x4027feb3, + 0x2721f49b, + 0x8e941d01, + 0x030d07f9, + 0x9abe100c, + 0xcd1e00b0, + 0x04030a07, + 0x00b34abe, + 0xaba1c027, + 0xbc75ac65, + 0xa161bc65, + 0x04030a07, + 0x00b578be, + 0x6174d3c1, + 0xc5430ba4, + 0x412774d4, + 0x9d31b49d, + 0xac9d09ac, + 0x7eb51e08, + 0x0fc6e9b0, + 0xf0f6be8a, + 0xa802be00, + 0x4e801e00, + 0xc60f6bfd, + 0xd5f49305, + 0x43990512, + 0x8e3e7605, + 0x9b4427fd, + 0x3ea721f4, + 0xd1fbffff, + 0xcc04c034, + 0x4f9bfa40, + 0xfb41d848, + 0xffff4ea7, + 0xc442d1fb, + 0xc841d104, + 0xc843d104, + 0xc1fd9304, + 0x3533044e, + 0x07ff2d83, + 0x07ff1d83, + 0x99153c53, + 0xd28d08d4, + 0x36d18d34, + 0x3638d38d, + 0x9b402747, + 0xfd8e21f4, + 0xc6e93f7e, + 0x85beaa0f, + 0xfd0e00f0, + 0x00a78f9e, + 0x04030d07, + 0x00b296be, + 0xd605d499, + 0x304f9b45, + 0x3f9bd485, + 0x1ed39531, + 0x484f9bd1, + 0x3f9bd485, + 0x1ed39549, + 0x07fc4ec5, + 0x031127c0, + 0xb4d4be04, + 0x0af49300, + 0x032700b7, + 0xfc8ec405, + 0xefff3ea7, + 0xd83411fd, + 0x0efc6a4d, + 0x43272307, + 0x2311f4e8, + 0xfc6a3ddc, + 0xff3ea7f6, + 0x3451fdef, + 0xfc6a4dd8, + 0x2723070e, + 0x51f4e843, + 0x6a3ddc23, + 0xfe0bf6fc, + 0x0227fe4e, + 0x29be1227, + 0x3ea700a7, + 0xb9ffffff, + 0x530c3834, + 0x38408b41, + 0x8e012741, + 0xff4ea7fe, + 0x4201fd4f, + 0x40270027, + 0x270ef49b, + 0x0e339911, + 0x13cb123b, + 0x4fbf3ea7, + 0x271138fd, + 0x53340541, + 0xd6340311, + 0x4efe8e12, + 0x21c207fb, + 0x11c401c3, + 0x07b10722, + 0x6df09310, + 0x4cbe007a, + 0xc231005a, + 0x7a90f093, + 0xbe102700, + 0x6b005a3f, + 0x27c403bf, + 0x07c231d1, + 0x7bf0931d, + 0xd103007a, + 0x005a2abe, + 0xdcc4c403, + 0xbd86ec0f, + 0xdea7c027, + 0x1efdbfff, + 0x03c10309, + 0xc8c020dc, + 0xc6d4413a, + 0xf14c8742, + 0x00c01842, + 0x931c0700, + 0x007a5bf0, + 0x0059fabe, + 0xf093d141, + 0xbe007a68, + 0x510059ef, + 0x6df093d1, + 0xe4be007a, + 0x40270059, + 0xc103d445, + 0xc420dc03, + 0xf493c8c8, + 0x19044e00, + 0x0e34e643, + 0xed625efb, + 0x605efb0e, + 0x07fe4ee9, + 0x93102720, + 0x007a4ff0, + 0xa7ff567e, + 0xffffff2e, + 0x3ea74127, + 0xbdfd4fff, + 0x010c3924, + 0x9b402731, + 0x23990ef4, + 0x3b21270e, + 0xa723cb21, + 0xfd4fbf3e, + 0x41272138, + 0x21533405, + 0x22d63403, + 0x78414f27, + 0xf4e8017d, + 0xfd4efe8e, + 0x07060f6b, + 0x7a13fd93, + 0x07210700, + 0x7e11270d, + 0x1d07ff07, + 0x9e9e0127, + 0xfd93005c, + 0x1e007a08, + 0x271007e9, + 0x4ed81e01, + 0x27b007fb, + 0xfff09310, + 0x44be0079, + 0xb1110059, + 0x7a0cf093, + 0x5939be00, + 0x93b12100, + 0x007a13f0, + 0x00592ebe, + 0xf093b101, + 0xbe007a1a, + 0x31005923, + 0x21f093b2, + 0x1027007a, + 0x005916be, + 0xd403db07, + 0xd231c127, + 0xf0931c07, + 0x03007a0c, + 0x5901bec1, + 0xc4d40300, + 0x07ec0fcc, + 0x1efb0e0b, + 0xa7f94e9d, + 0xffffffee, + 0xffff1ea7, + 0x2ae399fe, + 0x07081499, + 0xeeaf6ba0, + 0xa7018e43, + 0xffffd72e, + 0x44d62479, + 0xf98e0227, + 0x24792379, + 0x4f4b9307, + 0x40e83027, + 0x24190177, + 0x43830307, + 0x4cf14487, + 0xff00002c, + 0x0744e499, + 0x09149dbc, + 0x6b091199, + 0x0713830f, + 0x334187d1, + 0x83d42bd4, + 0xde230fbc, + 0xf6ffffb4, + 0x2601510f, + 0xff4ea7a6, + 0x3127d07f, + 0x42314335, + 0x012d21e4, + 0xec53ec07, + 0x590ff610, + 0x05d49901, + 0x4f4b2027, + 0x21274008, + 0xe1c3d459, + 0x3e074103, + 0x3183d45d, + 0xffff4ea7, + 0xbdb207fe, + 0x6b014143, + 0xa7bac6bf, + 0xffffff3e, + 0x664032c1, + 0x534c0708, + 0x3c32c548, + 0x4fe64f6b, + 0x240b00f4, + 0xffff4ea7, + 0x4042c5ff, + 0x27203ca7, + 0x9dd32540, + 0x4ea704d4, + 0xd5feffff, + 0x76013c42, + 0xff4ea7a9, + 0x43b9feff, + 0x385c19c1, + 0x4ea73127, + 0x35d07fff, + 0xff3ea743, + 0x3431d07f, + 0x070c41c0, + 0xe8432723, + 0xc42331f4, + 0x0ea7f831, + 0xb9feffff, + 0x76014104, + 0xa7312745, + 0xd07fff4e, + 0x19074345, + 0xc40f1c83, + 0x2ea71b11, + 0x99ffffff, + 0x31274424, + 0x249d4103, + 0xff4ea744, + 0x03bdd07f, + 0x41550140, + 0x006e73be, + 0x1ea7d319, + 0x03ffffd7, + 0x79d31d31, + 0x0f4c8314, + 0x24074123, + 0x28e62fab, + 0x3ea72f6b, + 0x7dffffd7, + 0x03345932, + 0xe6345d41, + 0x9b402705, + 0x3ea70ef4, + 0xc5fd4fff, + 0xb9063834, + 0x8e100c27, + 0x031419f9, + 0x19141d41, + 0xce143913, + 0x14194b34, + 0x44874383, + 0x002c42f1, + 0x2c83ff00, + 0x802ca30f, + 0x0c27bd1e, + 0x27f98e20, + 0x27f98e08, + 0x27f98e01, + 0xfe885e31, + 0x5e202ca7, + 0xe4d1ff0c, + 0xe3990c2c, + 0x40e4c524, + 0x4f4b4307, + 0x9d3e40cc, + 0xd47924eb, + 0xfe994fe6, + 0xf98e0427, + 0x831e2027, + 0x41234107, + 0x34874383, + 0x432b4433, + 0x005244e9, + 0x3027ff00, + 0xd35ddb7d, + 0xd31dd46d, + 0xec38db3d, + 0x9d412780, + 0xde9d04d4, + 0xfe7f5e05, + 0x27c43bce, + 0x09f19303, + 0x229e0078, + 0xf64e005a, + 0xdfff2ea7, + 0x004e27fd, + 0x16c12000, + 0xd5302734, + 0xd5020824, + 0xa7020823, + 0xfd4fff4e, + 0x11ac13c1, + 0xc5a10742, + 0x70075032, + 0x36079007, + 0xac898027, + 0x28a48926, + 0x01089ba9, + 0xc49b0307, + 0x0b1c0c33, + 0xd12b07c0, + 0xc601049e, + 0xcbe401b6, + 0x004fd040, + 0x0a100000, + 0xe8033b07, + 0xf3f02123, + 0x03d2074b, + 0x232e07d1, + 0x031d0728, + 0xf0d12328, + 0x420747f1, + 0x43734e2b, + 0x4b1b4886, + 0x010894ad, + 0x3d07d786, + 0x21012411, + 0xe105e415, + 0x4c542803, + 0x0b433310, + 0x884ec547, + 0xf338e803, + 0x030da499, + 0xda980381, + 0xa3c12748, + 0x01881e34, + 0xd440cbe4, + 0x0000004f, + 0xaa1ea510, + 0x40072301, + 0x030743cb, + 0x00004fd4, + 0xceac1000, + 0xa71ea2c3, + 0x0ea7c607, + 0x83ffffdf, + 0xbabe0fcc, + 0xc333005a, + 0x007cc3f9, + 0xc4f9ff00, + 0xff00007e, + 0x412338a3, + 0x007ec4fd, + 0x0ea7ff00, + 0xfdffffdf, + 0x00007cc3, + 0x5a70beff, + 0x34a0c100, + 0x330f0c83, + 0x7e0e2303, + 0x0439ffff, + 0x3ea749f6, + 0x01fd4fff, + 0x9b402732, + 0x3ea70ef4, + 0x99ffffff, + 0x31270e34, + 0x34cb323b, + 0x4fbf2ea7, + 0x273138fd, + 0x53240541, + 0xd6240331, + 0xbef68e32, + 0x1e005d47, + 0x93fc4ece, + 0x050ceffc, + 0x1fc6c119, + 0x44cdc168, + 0x20274027, + 0xc49d30a7, + 0x4ac38d0c, + 0xc49dc265, + 0x4cc2c50b, + 0x000fdf83, + 0xd0c88000, + 0x6a11c061, + 0x03cc4d27, + 0x3d07d49b, + 0x42603f03, + 0x32b90005, + 0x31b91086, + 0x41271074, + 0x46332c26, + 0xc49d41ab, + 0x8034b95a, + 0x9df09310, + 0xc49d050c, + 0x7534b95b, + 0x76202710, + 0x4403c146, + 0x31034027, + 0x029d041d, + 0x4403c55c, + 0x03c1fc8e, + 0x03212744, + 0x1d402731, + 0x5c029d04, + 0x1e4403c5, + 0x1e4027ec, + 0xa3d123be, + 0xfffff0df, + 0x1ed103ff, + 0x5bf1be95, + 0x59f5be00, + 0x59e4be00, + 0x873d0700, + 0x2b34332d, + 0x33430732, + 0x07430b43, + 0x0bd333d4, + 0xdcd3f9d4, + 0xf6000552, + 0x07ff753f, + 0x030c071d, + 0x0552d01f, + 0xfdf07e00, + 0x00ff655e, + 0x00001000, + 0x08000000, + 0x0000000f, + 0x07c1f54e, + 0x3c0dc138, + 0x07240a99, + 0x27c107b0, + 0x27502780, + 0xddfc0c6c, + 0x00a41000, + 0x4d034d07, + 0xc4ea2000, + 0x3c27009a, + 0x2b06071b, + 0x27010336, + 0x3b4d0722, + 0x0b405b20, + 0x5b41dc2d, + 0x2755f3f0, + 0x4a3b0f4c, + 0xf4139487, + 0x134e01b0, + 0x4201aff4, + 0x2b0b2247, + 0xb3012149, + 0x490b4187, + 0x3707430b, + 0x11033d0b, + 0x3a074305, + 0x3703214d, + 0x030ade0b, + 0x18025127, + 0x41278107, + 0x42234a3b, + 0x5936841a, + 0xa194dcca, + 0x3cb3c1b4, + 0x2b3cbcc5, + 0xa54c0b43, + 0xc2f58eb4, + 0x2007982c, + 0x070c2c23, + 0x274a3b42, + 0x3b9487e1, + 0x07aa1ee0, + 0x7e0b0713, + 0x1007eae9, + 0x6f7e0b07, + 0x24ba99ef, + 0xff5cdcea, + 0xf453c61e, + 0x4e01ff34, + 0x20270607, + 0x851e9027, + 0x02c1fa4e, + 0x4003c13c, + 0x04a1d107, + 0x0fffdd03, + 0x0fffdde3, + 0xb007322b, + 0x00c1d42b, + 0xd634d638, + 0x07fa8ed7, + 0x243dcaad, + 0xc20bca07, + 0x6cbe1c07, + 0x0b070057, + 0xfd7e1c07, + 0xc6da2bfe, + 0x7e0d07d0, + 0x0b07eea6, + 0xfa0e1d07, + 0x07feeb5e, + 0x0bca07a3, + 0xbe1c07c2, + 0x07005747, + 0x7e1c070b, + 0xda2bfed8, + 0xfa4eda1e, + 0x07310499, + 0x07a207d0, + 0x56c107b3, + 0x0cb2c04f, + 0x5e7e0a07, + 0x5d0fc6ee, + 0x475ab3c0, + 0x144c234c, + 0x0b24d199, + 0x3b31274d, + 0x23420931, + 0x2932c231, + 0x41273c07, + 0xd1a1433b, + 0x31233407, + 0x13eb130b, + 0x0d07140b, + 0x89ff577e, + 0x0d0732d4, + 0x1c074103, + 0x0e32d48d, + 0xea0f5efa, + 0x47034107, + 0x071ac4c2, + 0x1e31033c, + 0xec777ece, + 0x402706d6, + 0xc431d49d, + 0xa81e9fb2, + 0xfa8e0027, + 0x38033107, + 0x0d07b51e, + 0xe27e1c07, + 0x9d4027e9, + 0x0fc631d4, + 0x4efa8e81, + 0xffcea7f9, + 0xc4d1ffff, + 0xb0070440, + 0x91070a99, + 0x274d760d, + 0xe6d4a1c1, + 0xa700894f, + 0xffffdf0e, + 0x00578cbe, + 0x2c07b161, + 0x49be0a07, + 0xd4990368, + 0x87d3a12c, + 0x07430b44, + 0xa74005c0, + 0xffffdf0e, + 0x005749be, + 0xd499cf26, + 0x0321272c, + 0x2cd49d41, + 0x2a3bb341, + 0x0027320b, + 0xf98eb345, + 0xffdf0ea7, + 0x574bbeff, + 0x40c4d100, + 0x34c3d104, + 0x27448704, + 0x1c43ca20, + 0x1199c2bd, + 0x1199c4b9, + 0xc12745f6, + 0xffdf0ea7, + 0x5704beff, + 0x278b1e00, + 0x27f21ec3, + 0x99c2bd21, + 0x99c4b911, + 0x1e40a611, + 0x150c27ef, + 0x0ea7f98e, + 0xbeffffdf, + 0x61005705, + 0x0c0c27b1, + 0xc1be2c07, + 0x90070367, + 0xffdf0ea7, + 0x56ccbeff, + 0xda9fc600, + 0xd4999905, + 0x03d9a52c, + 0x2cd49d41, + 0x00ff4a5e, + 0x000000ff, + 0xfe93f54e, + 0xc1044654, + 0xf6e360e2, + 0xe489e349, + 0x60f2c50c, + 0xc164f0c5, + 0x43c23021, + 0x0b238724, + 0x36240121, + 0x0d0c2745, + 0xf58ef6c3, + 0xf2c12401, + 0xc1310360, + 0x00273c22, + 0x4215f6c3, + 0xf58ee34d, + 0x74037007, + 0x07071207, + 0x2abe2027, + 0x0ff600aa, + 0xf3c100a4, + 0x60f4c160, + 0xb160fec1, + 0xc1445133, + 0xf3c530ee, + 0xc5f40548, + 0x308140fe, + 0x1548f4c1, + 0x253291f0, + 0x3533a1f2, + 0x104389f3, + 0x3fe64387, + 0xfec102d9, + 0x40f5c148, + 0x070eea89, + 0x27e40783, + 0x27ffffcd, + 0x71afc690, + 0xff62f253, + 0x26015001, + 0xb027dc07, + 0x04310251, + 0xa13003c1, + 0x09420b01, + 0x03310b0c, + 0x2607184c, + 0xe40b2103, + 0xcd4e930b, + 0x43010411, + 0x0429e30b, + 0xb40b6207, + 0x6f6bdc07, + 0x03d2bada, + 0xbef8f054, + 0x0148f0c1, + 0x0bf95504, + 0x01f4454e, + 0x0b070701, + 0x241c0314, + 0x29be190b, + 0x07c600af, + 0xff3203e4, + 0x2764f3c1, + 0x4ef49303, + 0xf6c300ad, + 0xf58e3405, + 0xfef2f353, + 0xc41e3601, + 0x98be0707, + 0xf2c100a8, + 0xe6245160, + 0x2702454f, + 0x18dc2730, + 0x1f070707, + 0x7e182c27, + 0xf3c1f469, + 0xb1070760, + 0x013d0731, + 0x7e2c071c, + 0xf4c1f459, + 0x48fec160, + 0x012a4189, + 0x874107ee, + 0x2b453331, + 0x0bcd0b43, + 0xc53c07e4, + 0xfec53cfc, + 0xf6340b38, + 0x2701e46f, + 0xc58e0700, + 0x1fe638f0, + 0x460701ce, + 0x4333e607, + 0xe42be533, + 0x0760f0c1, + 0x184c034f, + 0x0354f3c5, + 0x89302744, + 0xfec52802, + 0xffbd2744, + 0x4cf3c5ff, + 0xc550f3c5, + 0xf4c558f3, + 0xac2fe668, + 0x58f2c100, + 0xc138f5c1, + 0xa28740f3, + 0xa30b5833, + 0x4b0756ab, + 0x1c1ed027, + 0xc1f3dc7e, + 0xf3c13cf0, + 0x03942960, + 0x32891c0c, + 0x3cf0c528, + 0x2dd2d40b, + 0x014b0778, + 0x091f07a9, + 0x3cf3c19b, + 0x1c030707, + 0x1c2c2718, + 0x110a4bce, + 0x50f8c59e, + 0x840be401, + 0x6550fec1, + 0x31fe85f5, + 0xa59c5194, + 0x95c40bf8, + 0xc19ea1fc, + 0xfb8d3094, + 0xc14e0b1c, + 0xf4b54cfe, + 0x2930fec5, + 0x8d8c0b9e, + 0xfec11efe, + 0xc5e40b4c, + 0xdfc64cfe, + 0x54f3c194, + 0x0768f1c1, + 0x182c0323, + 0x0754f2c5, + 0x182c2707, + 0xc1f35c7e, + 0x942960f3, + 0x0b283289, + 0x8ad2dad4, + 0xc12a3189, + 0x410358f4, + 0xd258f4c5, + 0xfec10f14, + 0x44f0c138, + 0xfec5e00b, + 0xff3b5e38, + 0x00d41fe6, + 0x2740f4c1, + 0x54fdc1e0, + 0x0734f4c5, + 0xff6d2754, + 0x5cfec5ff, + 0x07622fc6, + 0x1e802746, + 0x01460703, + 0x09bd0759, + 0x073d0796, + 0xceb40307, + 0x91111946, + 0x2c071c01, + 0x07f2737e, + 0x0707073b, + 0x7e222719, + 0x9609f2ed, + 0x9c31dc0b, + 0x3d079121, + 0x2c070707, + 0x07f2577e, + 0x0b9a51bd, + 0x079141bc, + 0x072a0707, + 0xf2467e3b, + 0x2960f0c1, + 0x28028994, + 0x840bdb07, + 0x82dada0b, + 0x2a0189a9, + 0x035cf3c1, + 0xc5310354, + 0x31da5cf3, + 0x271da690, + 0x272b8660, + 0x34f4c180, + 0x4c013d07, + 0xcba10707, + 0x2b07c191, + 0x07f20b7e, + 0x30c9c1ad, + 0xc1b1ab0b, + 0x07072907, + 0xf97e3a07, + 0x60fec1f1, + 0xe289c429, + 0x0bda0728, + 0xdad90b84, + 0xe189cc82, + 0x34f0c12a, + 0x04036103, + 0xda34f0c5, + 0x0707b861, + 0xd3be1127, + 0xb55e00a8, + 0x9b4607fd, + 0x33840741, + 0xc1433385, + 0x842b38f2, + 0x135e820b, + 0x27e407fe, + 0x5e602790, + 0x3027fd78, + 0xf1930707, + 0x2700840c, + 0x267e0c2c, + 0x0c3c27f2, + 0x5e24dc27, + 0xfd4efdac, + 0x0ea7d007, + 0xbeffffdf, + 0x99005351, + 0xd16108d0, + 0x0dbe2027, + 0xd0450364, + 0xd3110706, + 0x3419d201, + 0x420b4487, + 0xd4314005, + 0x3419d455, + 0x341d4103, + 0xffdf0ea7, + 0x5300beff, + 0x27d44100, + 0x27449600, + 0x8301c301, + 0x4efd8e01, + 0x070451fb, + 0x07d207c0, + 0x4642cab1, + 0xe7ff3ea7, + 0x153b05fd, + 0x27c1413d, + 0xa7323520, + 0xfde7ef4e, + 0x4d154105, + 0xefff3ea7, + 0x114235fd, + 0x6a4dd834, + 0x23070efc, + 0xf4e84327, + 0x3ddc2311, + 0x41f6fc6a, + 0x0bc451c3, + 0x2b03073d, + 0x550d2b4d, + 0x8ec345c4, + 0xff647efb, + 0x8eb60fd6, + 0x51fa4efb, + 0x07b0070e, + 0x07d207c3, + 0x024307a1, + 0x154e073e, + 0x96b451d4, + 0x11dc1544, + 0x05893ed2, + 0x1108a6d0, + 0x2b2c07d4, + 0x16d23524, + 0x25012725, + 0x07fa8ed2, + 0x07140b1a, + 0xff6d7e0b, + 0x4127d025, + 0x40270496, + 0xfa8e0407, + 0xd207fa4e, + 0xb107a007, + 0xfa8e27b6, + 0xfbf3cea7, + 0x24c099ff, + 0x22271027, + 0x1dbe0703, + 0x10070363, + 0x037e0c07, + 0x073d07e9, + 0xa72b071a, + 0xfffbf30e, + 0xd6e8b27e, + 0x4027d70f, + 0x8e0ef49b, + 0xc1f54efa, + 0xc1073412, + 0xdc83d207, + 0x5811990f, + 0xb127d333, + 0xde23fd23, + 0x07ffff84, + 0x0370073b, + 0x3bf265d4, + 0x50c2c131, + 0xf335a027, + 0xfd154027, + 0x5508f19d, + 0x076707fa, + 0x45d4230f, + 0x03f205f4, + 0x7961186c, + 0x16fe957e, + 0xdf0ea70c, + 0xe6beffff, + 0xc0c10051, + 0x04d29950, + 0x0358c199, + 0x7e212304, + 0xc199ff64, + 0x54c0c159, + 0x7e05d299, + 0x4027ff58, + 0x0ea73127, + 0x9dffffdf, + 0xd39d05d4, + 0x5194be04, + 0x03042700, + 0x99f58efd, + 0xc3c159c4, + 0xa5b43b54, + 0x30fac5fb, + 0x0324f49d, + 0xc10f07d5, + 0xfd8534c4, + 0x231c0c03, + 0xb5f375d5, + 0x34f4c5fa, + 0xc6fe2d7e, + 0x3f07980f, + 0x27383c03, + 0x204c2720, + 0x34033205, + 0xc289f4c8, + 0x132fe628, + 0x0b302701, + 0xff1d2796, + 0x26c489ff, + 0xc5bcf9c5, + 0xf1c5c0f3, + 0xc8f3c5c4, + 0x01bcf1c1, + 0x5334c613, + 0xc5360b38, + 0x4fe6ccf3, + 0xf8c100d3, + 0xc8f4c1bc, + 0x87c4f9c1, + 0x27840344, + 0xb8f4c550, + 0x41008a5e, + 0x40ac23fb, + 0x4540bc03, + 0x23fa55fb, + 0x55a640bc, + 0x07ccf8c1, + 0x181c0318, + 0x09ccf1c5, + 0xc4fac58a, + 0x03189ace, + 0xab4a07a2, + 0x0794874f, + 0xc1920b2f, + 0xa2233893, + 0xc6c0f3c5, + 0xba0d633f, + 0xf2c18129, + 0x2d8431c0, + 0x07b215b1, + 0x212b0716, + 0x07140b83, + 0x7e28030f, + 0x0fe6fe21, + 0x7141fee9, + 0x160b8451, + 0x0f078341, + 0x140b2b07, + 0x03242c03, + 0x067e1c0c, + 0xb8f3c1fe, + 0x0b4cc4c1, + 0x294b0543, + 0x26c489b3, + 0x45d2530b, + 0x519a0734, + 0x40acf4fa, + 0x0f07ff73, + 0xe6fd417e, + 0x51feac0f, + 0xff655efa, + 0x0f078111, + 0x1201160b, + 0xe6fd767e, + 0x09fe980f, + 0xc0f0c58a, + 0xc53890c5, + 0x831ec4fa, + 0xc128c289, + 0x1103c8f1, + 0xd2c8f1c5, + 0xf3c10d21, + 0x1c3c03bc, + 0x5ebcf3c5, + 0x0027ff08, + 0x4efea65e, + 0xa7f063fd, + 0xffffdf0e, + 0x00504cbe, + 0x0ea72f07, + 0x03fff01f, + 0x053f0723, + 0x7f2ce3f0, + 0x197f3ce3, + 0x803c0334, + 0xa7f932c2, + 0xfff01f0e, + 0x01b404b9, + 0x30274bc6, + 0x101ed027, + 0x3d07f001, + 0x01b404b9, + 0xd3073103, + 0x0b2843d2, + 0x6434b930, + 0xe942d801, + 0x31994d87, + 0x27040b42, + 0xfd8a7e21, + 0x3499f301, + 0x9d412340, + 0xf0014034, + 0xd6400499, + 0x1027cd4f, + 0x01b82d27, + 0xf01f0ea7, + 0x459bbeff, + 0xdf0ea700, + 0xafbeffff, + 0xf043004f, + 0xf94efd8e, + 0x03b2f493, + 0x03240705, + 0x34073f2c, + 0xe37f2ce3, + 0x34197f3c, + 0xc2803c03, + 0x2c27f932, + 0x95f39310, + 0x10a70503, + 0x31054207, + 0x34032123, + 0xfd93f4b8, + 0x27050240, + 0x9d40a730, + 0xd2c566d4, + 0x9dd33d80, + 0xd29d0bd3, + 0x1dd35d0c, + 0x039d07d3, + 0x0710709d, + 0xe33d0749, + 0x3d037f4c, + 0x4f544d30, + 0x00058f90, + 0x030cf49b, + 0x43ca804c, + 0x9bc027f8, + 0xbea70efc, + 0x27fdebff, + 0x9842be00, + 0x00af2700, + 0x05058200, + 0x9bba15bc, + 0x3ea70efc, + 0x27fde7ff, + 0x27340544, + 0x153cc02d, + 0xef4ea732, + 0x3c35fde7, + 0x42154905, + 0x4c350027, + 0x009813be, + 0xba15bc05, + 0xd50efc9b, + 0x931068dc, + 0x0502bff4, + 0x2c032407, + 0xe334073f, + 0x3ce37f2c, + 0x0334197f, + 0x32c2803c, + 0xa9f293f9, + 0x38270502, + 0x240d4027, + 0xf3b82803, + 0x07c42c23, + 0x7f1c0312, + 0x1ce33207, + 0x7f3ce37f, + 0x3c033419, + 0xf931c280, + 0x01fef393, + 0x27202705, + 0x3205204c, + 0xf4c83403, + 0xfd330ea7, + 0xbe1827ff, + 0xa70052b0, + 0xfffce30e, + 0xa5be1427, + 0x10270052, + 0xa7802c27, + 0xfffc730e, + 0x004464be, + 0x485ef90e, + 0x07f84efe, + 0x0f1c8310, + 0x21874107, + 0x422b4433, + 0x33333407, + 0xd307340b, + 0xd30bd333, + 0x52d0df03, + 0xa1070005, + 0x3307dc99, + 0x079007a3, + 0xdf0ea7ba, + 0xbe23ffff, + 0xbeffff84, + 0xc0004e65, + 0x071affcc, + 0x334c872c, + 0xf1420b24, + 0x00018c43, + 0x003ea3ff, + 0x43f50300, + 0xff00018c, + 0x007ca4f9, + 0x44fcff00, + 0xcce000ba, + 0x0700c3ff, + 0x8724332c, + 0xf1420b4c, + 0x00019443, + 0xb13fe6ff, + 0x50d3c100, + 0x4f034207, + 0x00054260, + 0x018843d5, + 0x9358d399, + 0x0500b7f8, + 0x018643bd, + 0xbd5ad399, + 0xf9018c43, + 0x000080aa, + 0x874abdff, + 0x05b29901, + 0x9954d0c1, + 0x7d7e59d1, + 0x9d2027fb, + 0xd39905b2, + 0xff3cc009, + 0x03343313, + 0x0542603f, + 0x8534b900, + 0xbd412301, + 0x59018534, + 0x23b21db4, + 0xa7b45d41, + 0xffffffce, + 0x0100c4b9, + 0x41239103, + 0x0100c4bd, + 0xc5acd3c1, + 0x3219fcc9, + 0x106881d1, + 0x423b4127, + 0x41cb3027, + 0xa7acd3c5, + 0xffffdf0e, + 0x106884d5, + 0x004d71be, + 0xa70ec199, + 0xfffb9d0e, + 0x099ef80e, + 0x0d070051, + 0x21271027, + 0xe4dc807e, + 0xff41ffcc, + 0x5604b499, + 0x15f89345, + 0x725e0500, + 0x50d0c1ff, + 0x275ad199, + 0xfaee7e21, + 0x9950d0c1, + 0xd19904b2, + 0x23040358, + 0xfade7e21, + 0xf8934027, + 0x9d04fff0, + 0x4a5e04b4, + 0x93f74eff, + 0x050167fc, + 0x4027f063, + 0xffdf0ea7, + 0x057c07ff, + 0x6baea7f4, + 0x26befffe, + 0x8027004d, + 0x7c23d027, + 0x030e1e40, + 0x10cc03d1, + 0xe014ac03, + 0x009410dc, + 0xb823ba07, + 0x4ed8b401, + 0x23030000, + 0x4886c419, + 0xc009c399, + 0x0709ff3c, + 0x27340b4f, + 0x99341d41, + 0x3cc00ac3, + 0x4f0709ff, + 0x4127340b, + 0xc419341d, + 0x30a745d6, + 0x9d0ac39d, + 0x402709c3, + 0xb401a415, + 0x00004e83, + 0x004ec403, + 0x39a90300, + 0x019616c9, + 0x794586a4, + 0x834ff6c4, + 0x27a90500, + 0xd6c30981, + 0xb401923f, + 0x4ee32707, + 0x05030000, + 0x0aa38db4, + 0xf3934027, + 0x8d0500c4, + 0x372b08a4, + 0x4dce2419, + 0xb0210341, + 0x03d103f3, + 0xac0310cc, + 0x10dce414, + 0xd027ff70, + 0x4d0b4f07, + 0x39a64319, + 0xd4c4d103, + 0xdf0ea7f4, + 0x43beffff, + 0x8666004c, + 0xffff4ea7, + 0x0e4199ff, + 0xfb9d0ea7, + 0x4fd6beff, + 0x8ef04300, + 0x1d40a7f7, + 0x07bb1e24, + 0xdd347e0d, + 0x402708ab, + 0x41270486, + 0x8f6b8407, + 0xc011c31e, + 0x2708c199, + 0xf9ba7e21, + 0xc279c011, + 0x0403c159, + 0xad7e2123, + 0x7d4027f9, + 0xff635ec4, + 0xd007fb4e, + 0x07cc00c1, + 0xf9d77e1d, + 0x04c6b007, + 0xfb8e0b07, + 0xffffcea7, + 0x50c4d1ff, + 0x6b0ea704, + 0x4103fff4, + 0x0450c4d5, + 0x009b46be, + 0x073900c8, + 0x33408730, + 0x34ddc136, + 0x4df5430b, + 0xff000ba4, + 0x04fd4227, + 0xff000b98, + 0x27fe8c7e, + 0x68c4bd41, + 0x0fc39904, + 0xf49b4027, + 0x8741270e, + 0xf50b0733, + 0x02b04034, + 0x1efb8eff, + 0x93fa4eff, + 0x04fe4ffa, + 0x41e0a419, + 0x4ea7012b, + 0xb9ffffff, + 0xc101004b, + 0xbc0bfc4c, + 0x1e10cbca, + 0xfd40273b, + 0x00007cd4, + 0xcec103ff, + 0xdc072ebc, + 0x330fdc83, + 0x7cd4f9d3, + 0x83ff0000, + 0x42c4224c, + 0xfd4127e1, + 0x00007ed4, + 0x7e0c07ff, + 0x4027fcc5, + 0x007cd4fd, + 0xc103ff00, + 0x93d4cbce, + 0x04ff7bf4, + 0x2c032407, + 0xe33407ff, + 0x3ce37f2c, + 0x0334197f, + 0x32c2803c, + 0x70a399f9, + 0xfddafd93, + 0xff3cc004, + 0x03343319, + 0x0543e43f, + 0xa7343900, + 0x3d412320, + 0x9d402734, + 0xd4c570d2, + 0xfdd37e74, + 0xffdf0ea7, + 0x4b0bbeff, + 0x44dcc100, + 0xffff3ea7, + 0xbd4027ff, + 0x27010034, + 0xc501402d, + 0x3cd5fc3c, + 0x0ea70454, + 0x27fffe73, + 0x40a7be10, + 0x034d0700, + 0x2701844d, + 0x403c2720, + 0x44034205, + 0xf393f3c8, + 0x9304ff05, + 0x04fd73fd, + 0xa7102c27, + 0x1d343d40, + 0x103c0334, + 0xd4c1f2a0, + 0x2749d63c, + 0xdba47e00, + 0x0d07d127, + 0x9b7ed103, + 0xf7d4c4db, + 0x302740a7, + 0xffdf0ea7, + 0x44acc5ff, + 0xc570a49d, + 0x6fbe74a3, + 0xfa0e004a, + 0x99fac15e, + 0xf0933ad1, + 0x2704fd68, + 0xf80e7e21, + 0xd4c54027, + 0x27c11e3c, + 0x7ea41d42, + 0xcf5ef025, + 0xd0fe4efe, + 0x2810010d, + 0x030c2c27, + 0x3be12721, + 0xf8e0cae2, + 0xffff3ea7, + 0x3834d1ff, + 0x0b020704, + 0x271027e4, + 0x383ed522, + 0x9efe0e04, + 0x27035b08, + 0xed270c2c, + 0xdd1e1000, + 0x0419fb4e, + 0x1f6bb007, + 0x1fe64506, + 0xfb8e0168, + 0x010c1fe6, + 0xfd934127, + 0x9d04fcc4, + 0x0ea705d4, + 0xbeffffdf, + 0x27004a11, + 0x3e14780d, + 0x05fc939d, + 0xc005054a, + 0xffdf0ea7, + 0x49d8beff, + 0x27c30100, + 0x27341d40, + 0x983c0321, + 0x1d1c4c27, + 0x03210332, + 0xf4b0983c, + 0x30a72027, + 0xd3c54027, + 0x0dd49d78, + 0x1036d2bd, + 0xc53cd2c5, + 0xd2bd44d2, + 0xd2bd1034, + 0xf77e1035, + 0x0c4c27f9, + 0x9d26d49d, + 0xd49d24d4, + 0x27102725, + 0xa701b82d, + 0xfff01f0e, + 0x003f68be, + 0x40000d27, + 0x10072027, + 0x00496dbe, + 0xffff4ea7, + 0xe040d5ff, + 0x03212702, + 0x2708000d, + 0x33420737, + 0xe040f543, + 0x03ff0002, + 0x000d0321, + 0x93f36808, + 0x054aebf0, + 0x3127e007, + 0x1d272027, + 0xed034000, + 0x40a7023b, + 0x9d5bd49d, + 0xd1ad5cd2, + 0xd39d4d32, + 0x5ad29d56, + 0x4d30d1ad, + 0x9d55d39d, + 0xece354d3, + 0x7f0ce37f, + 0x0c030419, + 0xf90ec280, + 0x938f2c27, + 0x054aabf3, + 0x42071027, + 0x21233105, + 0xf4b83403, + 0xd2c54027, + 0x5dd49d60, + 0xb41d4127, + 0xf293fb8e, + 0x9300a295, + 0x04388bf3, + 0x40273205, + 0x9321f49b, + 0x043887fd, + 0x20273d07, + 0x051f4c27, + 0xc8340332, + 0x9d4027f4, + 0x107e0ed4, + 0x9d4227e7, + 0x4d2710d4, + 0xd48d1708, + 0x233c2716, + 0xd39d4127, + 0x14d49d15, + 0x4c273b27, + 0x60d0c51e, + 0x9d12d38d, + 0xcdbe11d4, + 0xa51e0098, + 0x0098c7be, + 0x009f97be, + 0x377ef393, + 0x08349904, + 0xfe884fe6, + 0xf6053499, + 0x9b348146, + 0x339130f4, + 0x9331f39b, + 0x043767f0, + 0x039efb0e, + 0x3481009a, + 0x9148f49b, + 0x49f39b33, + 0xfb4eea1e, + 0xffffdea7, + 0x10d499ff, + 0xfb8e4486, + 0xc027fbab, + 0x9b0dfc9b, + 0x3ea70efc, + 0x11fd9fff, + 0xa3012734, + 0x0400004e, + 0xc8be3415, + 0x4ea7003f, + 0x01fd4fff, + 0x9d212743, + 0xf4930fd3, + 0x1d0437cc, + 0x10d29d42, + 0x9b0fd499, + 0x31270efc, + 0x43f54487, + 0xff02b040, + 0xf093fbeb, + 0x2704fad4, + 0x5efb0e11, + 0xfc4efdf4, + 0xfbf3eea7, + 0x34e4c1ff, + 0x4606d107, + 0xcea7d407, + 0xa1fffbf3, + 0x484dcac4, + 0x3ea7fc8e, + 0x99feffff, + 0xe2990934, + 0x87438324, + 0x2b443334, + 0x4d41f943, + 0x03ff0000, + 0x9b120328, + 0x0b41271d, + 0xa1423b10, + 0xca140be3, + 0xd1074013, + 0x00011fd0, + 0xa7c01000, + 0xfffbf3ce, + 0xdf27c4a1, + 0x10000000, + 0xa7bad4c2, + 0xffffdf0e, + 0x0047a6be, + 0x0ea70976, + 0xbeffffdf, + 0x070047b5, + 0x7e1d070c, + 0x0ea7ef0c, + 0x0effffdf, + 0x47809efc, + 0x07130700, + 0x011ff0d1, + 0x7f100000, + 0x07bd1eff, + 0x0e1d070c, + 0xeeea5efc, + 0x00058fc4, + 0xf693f54e, + 0x0704fa28, + 0x4461c1a1, + 0xa1a5f123, + 0x0ea75007, + 0x35ffffdf, + 0x446cc1f2, + 0x004768be, + 0xa7d8c47e, + 0xfeffff3e, + 0x83093499, + 0x33248743, + 0xf9422b44, + 0x00004d43, + 0x0b3403ff, + 0x10c3ca30, + 0xffdf0ea7, + 0x471cbeff, + 0x030b2700, + 0x07f58ef1, + 0x0f2c832c, + 0x43334207, + 0x007c43f9, + 0xe407ff00, + 0xff84ee23, + 0xa03ff6ff, + 0x33420700, + 0x2b228744, + 0x33340742, + 0x07340b33, + 0x0b033303, + 0xd00f0303, + 0xc1000552, + 0x0cc5ac04, + 0x19464634, + 0x6862d144, + 0x3b312710, + 0xd532cb34, + 0xd1106863, + 0xd110686d, + 0xab106c64, + 0xd641f84d, + 0x5320270b, + 0xdc210341, + 0x1127fa41, + 0x3207123b, + 0x34334287, + 0x430b1dab, + 0x46c2f393, + 0x6861d505, + 0x01422b10, + 0xff2ea731, + 0x2311fd4f, + 0x140b4333, + 0xc58813c5, + 0x3027ac01, + 0x412720a7, + 0x3d05e39d, + 0x04e39de3, + 0xe27de41d, + 0xa707029d, + 0xffffff3e, + 0x010034b9, + 0x3cc544b6, + 0xbd4103fc, + 0xa7010034, + 0xffffdf0e, + 0x004655be, + 0x994469c1, + 0x49070a61, + 0x070f4c83, + 0x87243324, + 0x07242b44, + 0x0b333332, + 0x33d30732, + 0x03d30bd3, + 0x0552d0df, + 0xacd2c100, + 0xf8f2fb93, + 0xe6f21504, + 0x9903571f, + 0x4ce00aa4, + 0xb9034f10, + 0xb90285b3, + 0x9302cab0, + 0x040977f7, + 0xb1b94027, + 0x740502c9, + 0x31037415, + 0xb2b90803, + 0x18030286, + 0x7d04739d, + 0x88b3b970, + 0xcbb4b902, + 0xccb0b902, + 0x5d210302, + 0x9d1b0771, + 0x709d0572, + 0x3d731d06, + 0x601d0374, + 0x07282710, + 0x3b5fbe07, + 0x96c12700, + 0x89c02704, + 0xa08910a1, + 0xd7997e0e, + 0xb4a9c0ab, + 0xb3c102b0, + 0x9611276c, + 0x071027c4, + 0x0e2027c1, + 0xb9212734, + 0x990284b3, + 0xc2ab09b4, + 0x340e2027, + 0x4c072127, + 0x4fe642ab, + 0x090700bd, + 0xbe7e0123, + 0xf804e6d6, + 0x0b03200c, + 0x59f8607e, + 0x8462b974, + 0xdf49f002, + 0x2774390a, + 0x274200c1, + 0x21cd03c0, + 0x6864c180, + 0x458efb93, + 0x004d8305, + 0xc1920701, + 0x812734b3, + 0x80274496, + 0x88479103, + 0x890ea089, + 0x39ee10a1, + 0x227e0bae, + 0x69f293f8, + 0x34270545, + 0x2c032419, + 0x9541e00c, + 0xc1f3a00b, + 0x49ee34b4, + 0xb0c10ae9, + 0xbe09a63c, + 0x27004380, + 0xb1f15340, + 0x0c2c27fd, + 0x453ef093, + 0x3c04c505, + 0x42071301, + 0x31051027, + 0x34032123, + 0x4027f4b8, + 0x8d40b48d, + 0xb8c542b2, + 0x34b9c538, + 0x1130bcc5, + 0xb064a971, + 0xb9770102, + 0xd5028462, + 0xc5106461, + 0x67d56c64, + 0x629d1060, + 0xb9402709, + 0x9d028660, + 0x64b90a64, + 0x609d0285, + 0x35649d36, + 0x028b60b9, + 0x028a64b9, + 0x9d38609d, + 0x60d13764, + 0x64b902c0, + 0x61a9028c, + 0x62a902ac, + 0x63b902b0, + 0x60c5028d, + 0x39649d40, + 0xf093219b, + 0xe604f75c, + 0x0703563f, + 0x33410731, + 0x0b443338, + 0x0b844743, + 0x45820b42, + 0xa7402704, + 0xffffdf0e, + 0x4d5164bd, + 0x004490be, + 0xffff2ea7, + 0x4021d1ff, + 0x29f09304, + 0x1fe604f7, + 0x0ca9030b, + 0x074102ac, + 0x00a9ca33, + 0xcdf002ae, + 0x0a9c1001, + 0x270c3c27, + 0x073103e1, + 0xca433b4e, + 0x3f6bf64c, + 0x35113cf0, + 0x07b30709, + 0x001e1491, + 0x9e270600, + 0x9b060000, + 0x27033307, + 0x5608be1a, + 0x3b442700, + 0x000e034b, + 0x040b0400, + 0xffff0ee3, + 0x07090203, + 0xbd402790, + 0xa74d5164, + 0xffffff3e, + 0x119932b9, + 0x21836c55, + 0x34bd4827, + 0x39d51194, + 0x32bd0440, + 0x0ea71199, + 0xbeffffdf, + 0xd10043de, + 0xd102c061, + 0xa902bc64, + 0x0b02b863, + 0xf81d0314, + 0xa9130b07, + 0xd102ae62, + 0x8702c463, + 0xd56c5522, + 0x474d5463, + 0xf0120b08, + 0xab10010d, + 0x0c3c2708, + 0x41273103, + 0x40ca433b, + 0x513f6bf8, + 0x24639d64, + 0x4c020c07, + 0x0df00407, + 0x08861001, + 0x030c3c27, + 0x3b412731, + 0xf840ca43, + 0x4f6b4307, + 0xf025649d, + 0xdd10011d, + 0x0c3c2708, + 0x41273103, + 0x41ca433b, + 0x6b4307f8, + 0x26649d4f, + 0xf62af693, + 0x24649904, + 0x270c4c14, + 0x61990c4c, + 0x24649d25, + 0x270c1c14, + 0x62a90c1c, + 0x63a9029a, + 0x64b90298, + 0x239b02cb, + 0x2d034223, + 0x619d03ff, + 0x534f6b25, + 0x8c42f02a, + 0x0b324708, + 0xb9315332, + 0x93029362, + 0x04f5e7fc, + 0x02c961b9, + 0x4c272596, + 0x93c4bd10, + 0x102c2702, + 0x47034307, + 0x419b4353, + 0xc099430b, + 0x27429b24, + 0x07203b21, + 0x334553e2, + 0x9932274a, + 0xe12325c1, + 0x4307e40b, + 0x303b413b, + 0x430b2013, + 0x4e02e28b, + 0x1e07e407, + 0xcf7e0027, + 0x87c4b9fa, + 0x07c49d02, + 0x30270d07, + 0x02d7dd03, + 0x01d80d03, + 0x40a72d07, + 0x074c63c5, + 0x4a648d30, + 0x237f2ce3, + 0xe302d7dd, + 0x34197f3c, + 0xc2803c03, + 0xf231f932, + 0xdfbe1a07, + 0x1d07008a, + 0x07f81c03, + 0x0311230d, + 0x2107b00c, + 0x2ce33007, + 0xe311037f, + 0x34197f3c, + 0xc2803c03, + 0x6ed1f932, + 0x300702d4, + 0x4c034e07, + 0x122c270c, + 0x44034001, + 0x34033005, + 0x60d1f2a8, + 0x03b902d4, + 0x3183015f, + 0x00b43fe6, + 0x01bfdd03, + 0x31072d07, + 0x237f2ce3, + 0xe301bfdd, + 0x34197f3c, + 0xc2803c03, + 0x4007f932, + 0x4c033107, + 0x322c2754, + 0x44034101, + 0x34033105, + 0x64d1f2a8, + 0x44d102d4, + 0xd4d50174, + 0xd0c101c0, + 0x89e361c0, + 0xe2512ad4, + 0x4d831007, + 0x1853ffdf, + 0x074453c5, + 0x303c8330, + 0xc52ad48d, + 0x11834052, + 0x14c63453, + 0x33833203, + 0x49534007, + 0x140e4183, + 0x539d34a3, + 0x6df29361, + 0x212104f4, + 0xd5c8d489, + 0xb903a4d1, + 0xc54d5163, + 0xd3bd30d4, + 0x4de003c8, + 0x07811102, + 0x11034dd4, + 0x824de029, + 0xd4076a01, + 0x3d01834d, + 0x01024de0, + 0x4df406e1, + 0x06cf0103, + 0x06c641e0, + 0x4027ff1e, + 0x9df8d49d, + 0x7f5efcd3, + 0x044de0ff, + 0xd4071a31, + 0x2931054d, + 0x11214de0, + 0x4df406d6, + 0x06c41122, + 0x11044de0, + 0xd51e0731, + 0x02814de0, + 0x4df40712, + 0x07000282, + 0x02014de0, + 0xc11e06f5, + 0x80024de0, + 0x4df40642, + 0x06308003, + 0x80014dc0, + 0xa9ae1e2b, + 0xa902b203, + 0x2702ac0c, + 0xc39b104c, + 0x119424bd, + 0x119921bd, + 0x07fd555e, + 0x404c0342, + 0x81538407, + 0x0445840b, + 0x27fcb05e, + 0xd4bd134c, + 0x243903c2, + 0xf3aaf393, + 0x89456604, + 0x4ca32ad4, + 0x2ad48d10, + 0xd4bd4027, + 0x349903a8, + 0xe8d2a90c, + 0xa0d4bd01, + 0x10339903, + 0x039cd2ad, + 0x03a1d3bd, + 0x896860c1, + 0xd0d5c2d3, + 0x619903c4, + 0x7df49354, + 0xd1bd0542, + 0x3183039f, + 0xd3bd4011, + 0xd1a9039e, + 0x06a601e6, + 0x419b4207, + 0x230d40c2, + 0xbe010b01, + 0xad0052ae, + 0x89039cd0, + 0xd38912a4, + 0x8d20272a, + 0xd2d50e63, + 0xd4d502f4, + 0x545901f4, + 0xa089647d, + 0x1ad08d12, + 0x8d14a189, + 0xa3891cd1, + 0x1ed38d16, + 0x8d18a489, + 0xa08920d4, + 0x22d08d30, + 0x9332a189, + 0x04f34bf0, + 0x9924d18d, + 0xd39d3563, + 0x36a4990f, + 0x44963027, + 0xd39d3127, + 0x37049906, + 0xbd0cd29d, + 0x2703abd4, + 0x0bd49d40, + 0xd1c5a181, + 0xc5a2915c, + 0xa3a160d2, + 0x9964d3c5, + 0xd49d0aa4, + 0x0ca19904, + 0xb105d19d, + 0x3cd2c5a2, + 0xd3c5a3b1, + 0x0ba39938, + 0x470aa499, + 0x0b418333, + 0x6b430734, + 0x10d49d4f, + 0xfc5a0299, + 0x0337402c, + 0xf804d199, + 0x99033014, + 0x41c35b03, + 0x04c534ee, + 0x275c0399, + 0x26356640, + 0x62d49945, + 0x41c34183, + 0xd49d4f6b, + 0x37a49916, + 0xd49d3027, + 0x9d40a708, + 0xa09909d4, + 0x11d09d38, + 0xbd4f5199, + 0x5903bed1, + 0xf742e054, + 0xc3430702, + 0x12d49d41, + 0xb1286289, + 0x2cd28d60, + 0xc510a389, + 0x538da8d0, + 0x0ea4892a, + 0x548d3027, + 0x04d19928, + 0xf27af793, + 0x18519d04, + 0xd499a315, + 0x32a28904, + 0x41834253, + 0x2c03245b, + 0x8342071f, + 0xd3b91f4c, + 0x4c1303ab, + 0x02102720, + 0x0b112734, + 0x27422723, + 0x14d49d31, + 0x9d17d19d, + 0x420715d3, + 0x73994553, + 0x2ed48d0b, + 0x00fb3ff6, + 0xa74472c1, + 0xffffdf0e, + 0x9934d2c5, + 0xf2050773, + 0x2510d999, + 0x3f77bef3, + 0x27f20100, + 0x0f2c8340, + 0xb2072333, + 0xff84be23, + 0xfd3327ff, + 0x00007e23, + 0x7f29fdff, + 0xfdff0000, + 0x00008224, + 0x3db603ff, + 0x37a899b4, + 0x070ca499, + 0x83b62319, + 0x07dc9981, + 0x85a64496, + 0x007f21fd, + 0xcce0ff00, + 0x9d034cff, + 0x9cfd07dc, + 0x000543a4, + 0x423cb419, + 0xb41d42a3, + 0xf7936461, + 0xe604f1c0, + 0x2703114f, + 0x9d302741, + 0xb39d04b4, + 0x0ca49905, + 0x02ed4fe6, + 0x2fe6f221, + 0x3c0702e7, + 0x34334c87, + 0xf293430b, + 0xf504f1b0, + 0x00019442, + 0x23b459ff, + 0x99b45d41, + 0x3ff636a3, + 0xd49902ba, + 0xac44fc04, + 0xfd91c302, + 0x0543a49c, + 0xdf0ea700, + 0xa3beffff, + 0x0d07003e, + 0x0c036361, + 0xc5200768, + 0x412744d3, + 0x2ce3d007, + 0x0b649d7f, + 0x0768dc23, + 0x03341932, + 0x32c2803c, + 0x89f193f9, + 0x2c2704f2, + 0x86b8be40, + 0x10a48900, + 0x8d44dbc1, + 0xa08928d4, + 0x26d08d0e, + 0x0b075179, + 0x990dd19d, + 0x1a070452, + 0xc10ed29d, + 0xac014063, + 0x3110a489, + 0x87c30bf2, + 0xbec40b44, + 0x01008686, + 0x0b4b07a9, + 0xc59b0b4c, + 0xd9c550d4, + 0x2463994c, + 0x03fccd03, + 0x9958d39d, + 0x3b072660, + 0x615ad09d, + 0x0b548561, + 0xc541053c, + 0x629954d3, + 0xfccd0325, + 0x59d29d03, + 0xdcc55395, + 0x5ad29948, + 0x02bc64d1, + 0x4c0b3127, + 0x342b323b, + 0xa289b40b, + 0x856b7510, + 0x07268663, + 0x27102729, + 0x89240540, + 0x110310a3, + 0x13da2403, + 0x9b4027f3, + 0xd3b90ef4, + 0x539d039f, + 0x0c64991d, + 0x00ed4fe6, + 0xc134d2c1, + 0x525544d3, + 0xb53059c5, + 0x08a49953, + 0x9919549d, + 0x509d2460, + 0x5462d11b, + 0x012df04d, + 0x27023a10, + 0x31030c3c, + 0x433b4127, + 0x07f842ca, + 0x144f6b43, + 0x4c270c4c, + 0x9d4f6b0c, + 0x64411c54, + 0x253c53c1, + 0x27615154, + 0xd55135b0, + 0x3103b4d4, + 0x3dfc9352, + 0xd2d504f0, + 0x339903b8, + 0xbcd3bd08, + 0x4464c103, + 0x8308aa99, + 0x34070f4c, + 0x34332487, + 0xf293322b, + 0x0b053d74, + 0x87240134, + 0xbd340b33, + 0x8911383a, + 0x45532ad4, + 0x34bd4183, + 0xd499113b, + 0x403bd505, + 0x3a34bd11, + 0x3c54c111, + 0x113c3bd5, + 0xc1284499, + 0xd4bd30d3, + 0x669903bd, + 0x18d69d34, + 0x012831e0, + 0x2704c499, + 0x9d42e331, + 0xc31d04c4, + 0xbed48b7e, + 0xa7003f51, + 0xfd4fff4e, + 0xf1114311, + 0x1bc50027, + 0x8c13c564, + 0xc54c1bc5, + 0xd05e541b, + 0x5e4027f5, + 0x3127fcea, + 0xa7fd085e, + 0xffffdf0e, + 0x003cf8be, + 0x2734d2c1, + 0x0f2c83c1, + 0x24f92333, + 0xff00007c, + 0x44a31d07, + 0x007c24fd, + 0xd399ff00, + 0x38d4c110, + 0xc33b3153, + 0xab681c03, + 0x270027c4, + 0x412711ec, + 0x4c8b403b, + 0x4d460103, + 0x24071419, + 0x2f032433, + 0x00054260, + 0x15ff4cc0, + 0x018523b9, + 0x018424b9, + 0x41033103, + 0x018424bd, + 0x018523bd, + 0x24071439, + 0x2f032433, + 0x00054260, + 0x15ff4cc0, + 0x018523b9, + 0x018424b9, + 0x41033103, + 0x018424bd, + 0x018523bd, + 0xfef01203, + 0x07d499aa, + 0x2fff4cc0, + 0x44333487, + 0x34f1340b, + 0xff00018c, + 0x00004ee3, + 0x004ea303, + 0x34f50200, + 0xff00018c, + 0x9944d0c1, + 0x30f534d1, + 0xff000194, + 0x018c31fd, + 0x0ea7ff00, + 0xbeffffdf, + 0x27003c12, + 0x0c649d41, + 0x99fe435e, + 0x4ff616d4, + 0x91c3fd59, + 0x94fd40a7, + 0x000543a4, + 0xe6fd4c5e, + 0x5efd2c8f, + 0x0d07fd16, + 0xe6eff77e, + 0x5efed30f, + 0x7099f4cb, + 0x27f10126, + 0x4cc2be20, + 0xf6706503, + 0xa7fce20f, + 0xffffdf0e, + 0x003bc9be, + 0xac5e0827, + 0x033707f4, + 0x2701843d, + 0xa7e02720, + 0xfffe730e, + 0x01101c27, + 0x004e8304, + 0x48360300, + 0x0c032103, + 0x103c0314, + 0x863722d4, + 0x28ea9624, + 0xdf0ea7f1, + 0x8fbeffff, + 0x0727003b, + 0xc4f4725e, + 0x0300004e, + 0xd63419de, + 0x3421d94f, + 0xff004e83, + 0x004ec4ff, + 0x03ccffff, + 0x27c81ee1, + 0xdc5e0c4c, + 0xa71027fd, + 0xfffe73ee, + 0x01100c27, + 0x14ec03e2, + 0x00002e83, + 0x2f2fe603, + 0x68110301, + 0x07b31ef0, + 0x8341cb42, + 0x3541e445, + 0x5c0399fb, + 0x2705d499, + 0x27340e20, + 0xc3420721, + 0x5e418341, + 0x4dc0fb25, + 0x40148021, + 0x5e80224d, + 0x4c27f97c, + 0xf9f45e15, + 0x5e164c27, + 0x4c27f9ee, + 0xf9e85e14, + 0x5e0c4c27, + 0x3c27f788, + 0xf7615e0c, + 0x22532c07, + 0xb3074e07, + 0x433b2c0b, + 0xf6c124f2, + 0xb3073103, + 0xb85ebf6b, + 0x272027f6, + 0xf4345e11, + 0xb75e4027, + 0x044dc0f9, + 0x4d401301, + 0x2d5e0121, + 0x5e4b27f9, + 0x4c27f9a6, + 0xf9a05e0d, + 0x5e184c27, + 0x4dc0f99a, + 0x40141201, + 0x5e21044d, + 0x4c27f910, + 0xf9885e0e, + 0x5e1a4c27, + 0x4a27f982, + 0x47f97d5e, + 0xf7795e32, + 0x5e0c4c27, + 0x7479f731, + 0xf51f49f4, + 0xfdf6f493, + 0xc0433903, + 0xcd275e32, + 0x1a5e8001, + 0x0f0c27f5, + 0x27f3625e, + 0x4f5e1b4c, + 0x5e4227f9, + 0x4dc0f94a, + 0x40140301, + 0x5e03214d, + 0x4c27f8c0, + 0xf9385e0f, + 0x5e114c27, + 0x4127f932, + 0x27f92d5e, + 0x275e104c, + 0x194c27f9, + 0x27f9215e, + 0x1b5e0c4c, + 0x30b4c1f9, + 0xf514c4ee, + 0x3a62f493, + 0x3843c105, + 0xf50883ee, + 0x27f5355e, + 0x5e8002cd, + 0xc107f4bd, + 0xcce0cf6b, + 0x07fe84ff, + 0x8714331c, + 0xf1310b3c, + 0x00018c34, + 0x9432f5ff, + 0xe3ff0001, + 0x0300004e, + 0x00004ea3, + 0x8c34f501, + 0x99ff0001, + 0x1f0304d4, + 0x00054260, + 0x018d34fd, + 0x4027ff00, + 0x019834f5, + 0x20a7ff00, + 0x018e12bd, + 0x018d12bd, + 0x018c34f1, + 0x4ee3ff00, + 0xf5040000, + 0x00018c34, + 0x30a089ff, + 0x019c30ed, + 0xa189ff00, + 0x9e31ed32, + 0x5eff0001, + 0x2c07faa3, + 0xbc272253, + 0x072c0b0c, + 0x004d273b, + 0xfeaa5e10, + 0x5e100c27, + 0xb4c1f27f, + 0x4fc4ee30, + 0xcb697ef4, + 0xf49d0fe6, + 0x4ef4455e, + 0x000e27fb, + 0xe37e0200, + 0xf3bea7cf, + 0x4827fffb, + 0x0524b49d, + 0x001e27b0, + 0x0b070200, + 0x99e01b7e, + 0x0b0724bc, + 0x1c07c603, + 0x27cba47e, + 0xb54c3b41, + 0x4efb8eb4, + 0xff3ea7fa, + 0x3499ffff, + 0x99453611, + 0x4fe61234, + 0x3c270167, + 0xff4ea70f, + 0x4335fdbf, + 0xa75f2c27, + 0xfd4fff4e, + 0x273442c5, + 0x4ea7b63c, + 0xd5fdefff, + 0xbe0f0443, + 0xa7003a84, + 0xfd9fff1e, + 0x000a4e27, + 0x27141580, + 0x11132532, + 0xff0ea714, + 0x4da3fdeb, + 0x14150400, + 0x20271321, + 0x04003da3, + 0x02051325, + 0x00004f27, + 0x04150582, + 0xa70ef29b, + 0xffffff2e, + 0x36112499, + 0x12249945, + 0x010f4fe6, + 0x1ea7d027, + 0x99ffffff, + 0xcea71114, + 0x03feffff, + 0x11149d41, + 0xc3d53327, + 0x0ea70148, + 0x01fd4fff, + 0x07b12703, + 0x07433b4b, + 0x0e129934, + 0x43073f6b, + 0x149d42ab, + 0x3c03c50e, + 0xf49b4027, + 0x7e01270e, + 0xc0bddb15, + 0x0c1819c1, + 0x100cfc30, + 0xdfe600a4, + 0x0ea70086, + 0xd1ffffff, + 0x060c3c04, + 0xff1ea748, + 0x1341fdaf, + 0x9fff2ea7, + 0x05340bfd, + 0xe3242113, + 0x2425104c, + 0x3ca32311, + 0x93231510, + 0x04eb1bfa, + 0x4fe6a419, + 0x049900ac, + 0xe0200725, + 0x19027042, + 0xa73027a2, + 0xffffff4e, + 0x1625439d, + 0x9c0d2726, + 0xc4677e11, + 0xeaeaf493, + 0xa7400504, + 0xffffff4e, + 0x0fb443b9, + 0x02603ff6, + 0x4fff4ea7, + 0x934101fd, + 0x0402cff2, + 0x07d14d27, + 0x02073427, + 0x23152405, + 0x1bbe2125, + 0x4027002f, + 0xa70ef49b, + 0xfeffff1e, + 0x4fff3ea7, + 0x4012b9fd, + 0x3834c501, + 0xfa8e2af6, + 0xcfff4ea7, + 0x684bc5fd, + 0x93ff555e, + 0x04ea9bf4, + 0x3ff64319, + 0xfabefe92, + 0x8b5e0032, + 0x89f493fe, + 0x431904ea, + 0x24993546, + 0x7f4cf824, + 0xd12701ef, + 0xb9fee15e, + 0x5319c110, + 0x0e018304, + 0xcee25efa, + 0x7ec4187e, + 0x3ea7fe1b, + 0x27fffb9d, + 0x3d341d40, + 0xdf3ea734, + 0x3401ffff, + 0x23074586, + 0xf4e84627, + 0x33562301, + 0x4fff3ea7, + 0xa73401fd, + 0xffffdfbe, + 0x48a34433, + 0x0d27b405, + 0x1e7e2000, + 0x89fc93ed, + 0xc0050537, + 0x5bbe0b07, + 0xc4010037, + 0x01a44fe6, + 0xf46b0ea7, + 0xbe1227ff, + 0x27003b60, + 0xd74ea700, + 0x401dffff, + 0x407d403d, + 0xffff2ea7, + 0x9d4027ff, + 0xeea72a20, + 0x1dfff3bf, + 0x69f393e4, + 0x10a704e9, + 0xbd43319d, + 0x9d0c3024, + 0xe43d2520, + 0xc53c24c5, + 0x249d4024, + 0x27249d26, + 0x0fb424bd, + 0x21273827, + 0x24fd4027, + 0xff000c30, + 0xf3982103, + 0xe982fe93, + 0x0c0c2704, + 0x20273e07, + 0x32054007, + 0x34030123, + 0xfd93f4b8, + 0xa704e9a8, + 0x70d49d40, + 0x0374d0c5, + 0x070184dd, + 0x0332271d, + 0x2127ffdc, + 0xe35d4027, + 0x1ce33d07, + 0x2ee29d7f, + 0xe21de43d, + 0xe035e015, + 0xe025e045, + 0x9d1be29d, + 0xe09d1ae0, + 0x7f3ce31c, + 0x0283dd23, + 0x1c031419, + 0xf913c280, + 0xeaebf493, + 0x59f19304, + 0x3c2704e9, + 0x1d20a710, + 0x03423d42, + 0xf3a0104c, + 0xffff4ea7, + 0x0142bdff, + 0x27302701, + 0x13bd520c, + 0x13bd02dd, + 0x202702dc, + 0xfde2f393, + 0x05400703, + 0x03012332, + 0xa7f4b834, + 0xffffff4e, + 0x43bd3027, + 0x42bd0c44, + 0x42bd0c46, + 0x42bd0c45, + 0x40bd1198, + 0xd2bd0c47, + 0x102702d0, + 0xbd44429d, + 0xad0c3942, + 0x9d119a41, + 0xd19d06d1, + 0x5840d508, + 0x5c40d504, + 0x9f3ea704, + 0x311dfffb, + 0x40ad313d, + 0x3c270102, + 0x0843bd0f, + 0xbd20a701, + 0xad010942, + 0xd5010a40, + 0xd50c2c40, + 0xbd045040, + 0xa70fb041, + 0xfffef33e, + 0x4c272027, + 0x03320520, + 0xa7f4c834, + 0xfffe7b3e, + 0x341540a7, + 0x945e3405, + 0x274027fd, + 0x25249d30, + 0x010a23ad, + 0x7efda25e, + 0x5d7ec199, + 0x5ed127d6, + 0xf093fcee, + 0xbe0052ac, + 0x5e00312b, + 0x0127fd98, + 0x5279f193, + 0x345b9e00, + 0xa7fd4e00, + 0xffffff4e, + 0x0fb443b9, + 0x3fd6d007, + 0x51f19367, + 0x33270400, + 0x07e04d27, + 0x14051325, + 0x070c1c03, + 0x4f1c0331, + 0x3ce32107, + 0x7f2ce37f, + 0x195b1c23, + 0x803c0334, + 0xc6f932c2, + 0x544c27d8, + 0x0d071415, + 0x002af393, + 0x144c2704, + 0x04030101, + 0x34033105, + 0xf093f4a8, + 0x0e04000c, + 0x2c649efd, + 0x15442700, + 0x09f39314, + 0x20270400, + 0x05144c27, + 0xc8340332, + 0x93e01ef4, + 0x005234f0, + 0x00309ebe, + 0xfd4e901e, + 0xffff4ea7, + 0xb443b9ff, + 0x893ff60f, + 0xff3ea700, + 0x3499feff, + 0x83102709, + 0x33d40743, + 0x2b4487d4, + 0xb4de23d4, + 0x0ea7ffff, + 0x79ffffd7, + 0x03310704, + 0x874f4b31, + 0x19404823, + 0xce438304, + 0x24f15114, + 0xff000028, + 0x00004ea3, + 0x2824f580, + 0x07ff0000, + 0xd834c413, + 0x004729be, + 0xd39d3127, + 0x27d41904, + 0x1d410330, + 0x0ef39bd4, + 0x4fff4ea7, + 0x3843c5fd, + 0xa70ef39b, + 0xffffff4e, + 0xa70e4399, + 0xfd4fbf2e, + 0x41273138, + 0x31532405, + 0x32d62403, + 0x3107fd8e, + 0xbc1e3103, + 0x51a6f093, + 0x2ffdbe00, + 0xff6f5e00, + 0x4ea7fd4e, + 0xb9ffffff, + 0x070fb443, + 0xec3ff6d0, + 0x08d48900, + 0x00da4fe6, + 0x00cb49f4, + 0x4ffcd431, + 0xfffffffe, + 0xd48900b6, + 0x004df40a, + 0xbe00a201, + 0xa70046ae, + 0xffffd70e, + 0x03190439, + 0x43cc432b, + 0x89013971, + 0xd43108de, + 0xd2890339, + 0x104c330a, + 0xec833103, + 0x3de4ab0f, + 0x83283303, + 0x87e2ab13, + 0xf5047911, + 0x00002c1e, + 0xf63127ff, + 0x0fec8345, + 0x4fa34e07, + 0xffffff80, + 0x4027047d, + 0xa70ef49b, + 0xfd4fff2e, + 0xa63824c5, + 0x2722013b, + 0x0ef49b40, + 0xffff3ea7, + 0x0e3499ff, + 0x323b3127, + 0x2ea734cb, + 0x38fd4fbf, + 0x05412731, + 0x46315324, + 0x1e240335, + 0x1e3027f3, + 0x0df393c6, + 0x349904e6, + 0x9d410343, + 0xfd8e4334, + 0xf1930127, + 0x9e0051b2, + 0x27003269, + 0x7ef19304, + 0x5e9e0051, + 0x04270032, + 0x514ff193, + 0x32539e00, + 0x93042700, + 0x00511cf1, + 0x0032489e, + 0xf1930427, + 0x9e0050e3, + 0x3100323d, + 0x0a028901, + 0x93080389, + 0x0050a8f0, + 0x002eeebe, + 0x4eff045e, + 0xff4ea7fb, + 0x43b9ffff, + 0xf1230fb4, + 0xd107b007, + 0x07653fd6, + 0x81f1930f, + 0x2c270051, + 0x2908be10, + 0x93dde600, + 0x03fe0bfc, + 0x07e14d27, + 0x05843c27, + 0x25c315c4, + 0xbe0d07cb, + 0x0700295e, + 0x03210320, + 0x3f070ccc, + 0x31014327, + 0xc1053403, + 0xf4a8c403, + 0x33093459, + 0xc45d1d07, + 0xf093c30d, + 0xbe03fdef, + 0x930028c6, + 0x03fdcbf0, + 0x002a25be, + 0xfb8ef103, + 0x5125fd93, + 0x93ad1e00, + 0x005107f0, + 0x002e6abe, + 0xfa4e921e, + 0xffffcea7, + 0xb4c4b9ff, + 0xf6d0070f, + 0x9902814f, + 0x4ff626c4, + 0xdc21026f, + 0x08030d07, + 0x8724cce0, + 0x25ccd001, + 0x32cce02a, + 0xccd00194, + 0xcce05533, + 0xf002044b, + 0x01154ccc, + 0xf25acce0, + 0x5bcce001, + 0xcce401e5, + 0x9300a54c, + 0x00514bf1, + 0xc9e02e1e, + 0xcad00160, + 0x13cce073, + 0xccf0010d, + 0xe0008314, + 0x01271acc, + 0x1623cce0, + 0x19ccc401, + 0x0df4937e, + 0x402104e5, + 0x07c6ff7e, + 0x07090610, + 0x5efa0e0c, + 0xcce0fefb, + 0xf0015728, + 0x00ac29cc, + 0xae29cce0, + 0x2accc401, + 0x7ed03156, + 0xdc21c56e, + 0x1fd61007, + 0xff4ea7db, + 0x43b9ffff, + 0x3ff60fb4, + 0xf49301f4, + 0x2703fcfc, + 0x2707d33d, + 0x05040724, + 0x25421543, + 0x9efa0e4c, + 0xe0002946, + 0xd0013cc4, + 0xc5e057c5, + 0xc6c40118, + 0x7ed03116, + 0xdc21c56b, + 0xbf1e1007, + 0x3811cce0, + 0x12cce001, + 0xfb930129, + 0x0705339c, + 0x3bbd033b, + 0xe32b0702, + 0x2ce37f3c, + 0x3bbd237f, + 0x03341902, + 0x32c2803c, + 0x20cce0f9, + 0xccf401a0, + 0xe0014b21, + 0x01c41ccc, + 0x411fccc0, + 0x517af193, + 0xff595e00, + 0xc44bc1c0, + 0xd031c1c2, + 0x21c4bd7e, + 0x5e1007dc, + 0xcce0ff6a, + 0xc4010c26, + 0x31ac27cc, + 0xc58b7ed0, + 0x1007dc21, + 0xe0ff555e, + 0x00a633cc, + 0x974accc4, + 0x5113f193, + 0xff215e00, + 0xb405d431, + 0x3e5edc21, + 0x7ed031ff, + 0xdc21c5aa, + 0x2f5e1007, + 0x7ed031ff, + 0xdc21c4e7, + 0x235e1007, + 0x7ed031ff, + 0xdc21c5a6, + 0x175e1007, + 0xf1fa93ff, + 0xd43104e3, + 0xb4ebab21, + 0xdd7e0b07, + 0xf61007c5, + 0x25fede0f, + 0x5edc21ab, + 0x937efefd, + 0x07dc21c5, + 0xfef05e10, + 0xdc7ed031, + 0x07dc21c4, + 0xfee45e10, + 0xe3befc93, + 0x070c0704, + 0x1e0c031d, + 0x270c1c03, + 0xd3be102c, + 0x41270026, + 0x211cc49d, + 0xfec75edc, + 0x9c7ed031, + 0x07dc21c5, + 0xfeb85e10, + 0xe57ed031, + 0x07dc21c3, + 0xfeac5e10, + 0x4307d331, + 0x48d04123, + 0xe3f19353, + 0x785e004f, + 0x7ed031fe, + 0xdc21c58d, + 0x8f5e1007, + 0x7ed031fe, + 0x1007c550, + 0x31fe855e, + 0xc53f7ed0, + 0x7b5e1007, + 0x11f193fe, + 0x505e0050, + 0xd8f193fe, + 0x485e004f, + 0x14f193fe, + 0x405e0051, + 0x84f193fe, + 0x385e004f, + 0xc45a7efe, + 0x1007dc21, + 0x93fe515e, + 0x04e32bf4, + 0x212e439d, + 0xfe475edc, + 0x8421cce0, + 0x55cce400, + 0xd431feb8, + 0x022cb4d5, + 0xb4d5d441, + 0xd4510230, + 0x0234b4d5, + 0xb4d5d461, + 0xdc210238, + 0x27fe205e, + 0xd7f19304, + 0x169e004e, + 0x0111002f, + 0x03310221, + 0x4e8ef093, + 0x2bc9be00, + 0xfd715e00, + 0x508ef093, + 0x2bbdbe00, + 0xfe045e00, + 0x30271d07, + 0x99100c27, + 0x26861012, + 0x0fa33cd4, + 0x041e4127, + 0x03a33c40, + 0xc2310341, + 0x1103f742, + 0x3cd0f020, + 0xf19322a3, + 0x5e004fea, + 0xd431fda3, + 0xdc21b415, + 0x31fdc05e, + 0x2441c0d4, + 0x933c42c0, + 0x005021f1, + 0x31fd8a5e, + 0x4a41c0d4, + 0xe07343c0, + 0xe000c842, + 0x93009844, + 0x004fdff1, + 0x07fd725e, + 0x83f0931d, + 0x1c030531, + 0x402c2710, + 0x002589be, + 0xb49d4127, + 0x5edc2108, + 0x1d07fd7d, + 0x31a8f093, + 0x101c0305, + 0xbe402c27, + 0x2700256e, + 0x09b49d41, + 0x625edc21, + 0x031d07fd, + 0x2c27101c, + 0xcbf09310, + 0x53be0531, + 0x1d070025, + 0x31d0f093, + 0x201c0305, + 0xbe0c2c27, + 0x27002542, + 0x8ab49d41, + 0x365edc21, + 0x031d07fd, + 0x2c27101c, + 0xbbf09310, + 0x27be0531, + 0x1d070025, + 0x31c0f093, + 0x201c0305, + 0xbe0c2c27, + 0x27002516, + 0x8bb49d41, + 0x0a5edc21, + 0x031d07fd, + 0x2c27101c, + 0x5df09310, + 0xfbbe0532, + 0x1d070024, + 0x3262f093, + 0x201c0305, + 0xbea22c27, + 0x270024ea, + 0x8db49d41, + 0xde5edc21, + 0x031d07fc, + 0x2c27101c, + 0x7ff09310, + 0xcfbe0531, + 0x1d070024, + 0x3184f093, + 0x201c0305, + 0xbea22c27, + 0x270024be, + 0x8cb49d41, + 0xb25edc21, + 0xa7fe4efc, + 0xffffff4e, + 0x0fb443b9, + 0xf3933796, + 0x1904e178, + 0x27450634, + 0x8e341d40, + 0x930427fe, + 0x004f7cf1, + 0x002d8c9e, + 0x4f60f093, + 0x2a45be00, + 0x4edc1e00, + 0xffdea7fc, + 0xd4b9ffff, + 0x0c210fb4, + 0xf6694fd6, + 0xd54027c9, + 0xad0fd8dc, + 0xa70fdcd4, + 0xffffff4e, + 0x0fb443b9, + 0x93603fd6, + 0x03f95ff4, + 0x07e33d27, + 0x04072027, + 0x42154305, + 0xab9efc0e, + 0xc6d40025, + 0xd8d4d1db, + 0xdcdcad0f, + 0xd04fd60f, + 0x0000cf27, + 0x4f271010, + 0x10100080, + 0x0fd8d4d5, + 0x10270c07, + 0xbe802c27, + 0x27002449, + 0x2233563f, + 0x40c3c511, + 0xf49b4027, + 0x11a51e0e, + 0x932c0701, + 0x004f0cf0, + 0x0029bebe, + 0xf0938a1e, + 0x27004f2e, + 0xbe07e31d, + 0x1e0029af, + 0xa7fb4e93, + 0xffffffce, + 0x0fb4c4b9, + 0xfb8e4496, + 0xe0aef493, + 0x93411904, + 0x04e057f3, + 0xe056f493, + 0x01320104, + 0x15f09343, + 0x80be004f, + 0xc4b90029, + 0x4fc60fb4, + 0x001f27da, + 0x271007a0, + 0x0790000f, + 0x2565be10, + 0x27b00700, + 0x07c0001f, + 0x000f2710, + 0xbe1007b0, + 0x07002553, + 0x001f27c0, + 0x271007e0, + 0x07d0000f, + 0x2541be10, + 0x07300700, + 0x932c071b, + 0x004f05f0, + 0x349efb0e, + 0xfd4e0029, + 0xffff4ea7, + 0xb443b9ff, + 0x56d0070f, + 0x69f2933a, + 0x4d2703f8, + 0x240507e0, + 0x272c3c27, + 0x15242544, + 0x030d0723, + 0x4a270c2c, + 0x04030301, + 0x24032305, + 0xf093f4a8, + 0x0e03f844, + 0x249c9efd, + 0xf5f09300, + 0xecbe004e, + 0xc61e0028, + 0x0fabfb4e, + 0xf0a3d107, + 0xe3071207, + 0x0bb90dc0, + 0xba0de067, + 0xe0008d0b, + 0xbd0bbb0d, + 0xbc0dc000, + 0x4ea7120b, + 0xb9ffffff, + 0xf60fb443, + 0x8300f63f, + 0xa7fb8ef0, + 0xffffffce, + 0x0fb4c4b9, + 0x01064ff6, + 0xf41ad489, + 0xa700b144, + 0xffffffce, + 0x0fb4c4b9, + 0x00e24ff6, + 0x44d0d451, + 0xb4c4b9d7, + 0xc6d3410f, + 0x3479ce4f, + 0x32393119, + 0xf0933359, + 0x83004fd3, + 0x9efb0ef0, + 0xa7002873, + 0xffffffbe, + 0x0fb4b3b9, + 0x010e3ff6, + 0x8b18d489, + 0x8b40e84f, + 0x1d3ff600, + 0x34d4c102, + 0xb99944c8, + 0x710fb4b4, + 0x904fc6d3, + 0xbea7c11e, + 0xb9ffffff, + 0xf60fb4b4, + 0x71017c4f, + 0x7c44f0d4, + 0xb4b4b9ff, + 0x81d3610f, + 0x704fe6d0, + 0x79030bff, + 0x39011904, + 0x83035902, + 0x70f093f0, + 0xfb0e004f, + 0x0028129e, + 0xffff4ea7, + 0xb443b9ff, + 0x4c3fe60f, + 0x07d301ff, + 0x87f0932e, + 0xf0830050, + 0xf49efb0e, + 0xc4b90027, + 0x4fe60fb4, + 0xd199ff4b, + 0x21d29920, + 0x9922d399, + 0xf09323d4, + 0xbe0050e0, + 0x5e0027d7, + 0x3ff6ff33, + 0xd49101ef, + 0xff1144f0, + 0x07ff765e, + 0x932e0730, + 0x005112f0, + 0xfb0ef083, + 0x0027b69e, + 0xd251d141, + 0x50daf093, + 0x27a9be00, + 0xff125e00, + 0xde66f493, + 0x65f29304, + 0x430104de, + 0xf0932401, + 0x07005043, + 0x278dbe2e, + 0xb4c4b900, + 0xdd4fe60f, + 0x11d421fe, + 0x31d201d1, + 0xc5f093d3, + 0x74be004d, + 0xc4b90027, + 0x4fe60fb4, + 0xd189fec4, + 0x1ad28918, + 0x5049f093, + 0x275dbe00, + 0xfeb25e00, + 0xde1af493, + 0x19f29304, + 0x430104de, + 0xf0932401, + 0x07004d5e, + 0x2741be2e, + 0xb4b3b900, + 0xd53fe60f, + 0x11d331fe, + 0x21d201d1, + 0x79f093d4, + 0x28be004d, + 0xb3b90027, + 0x3fe60fb4, + 0xd241febc, + 0x4d9bf093, + 0x07c20700, + 0x53420732, + 0x12070ccc, + 0x4c533353, + 0x83225310, + 0x833183c1, + 0x05418321, + 0x26f9befc, + 0xb4b3b900, + 0x8d3fe60f, + 0x14d389fe, + 0x8918d189, + 0xf09316d2, + 0xbe004d99, + 0xb90026df, + 0xe60fb4b3, + 0x89fe733f, + 0xd28944d1, + 0xa3f09346, + 0xc8be004d, + 0xb3b90026, + 0x5d5e0fb4, + 0x81f493fe, + 0xf29304dd, + 0x0104dd80, + 0x93240143, + 0x004e92f0, + 0xa8be2e07, + 0xb4b90026, + 0x4fe60fb4, + 0xd421fe67, + 0xd201d111, + 0xf093d331, + 0xbe004ce0, + 0xb900268f, + 0xe60fb4b4, + 0x41fe4e4f, + 0x9ef093d3, + 0xe307004e, + 0x1307c307, + 0xec532307, + 0x10cc5314, + 0x4107e183, + 0x34532a53, + 0x4183c183, + 0x31832183, + 0xfc15fe05, + 0x00265abe, + 0x0fb4b4b9, + 0xfe194fe6, + 0xd251d181, + 0xd471d361, + 0x4ea7f093, + 0x2641be00, + 0xfe055e00, + 0xd171d391, + 0xf093d281, + 0xbe004da8, + 0xb900262f, + 0xe60fb4b3, + 0xc1fdd03f, + 0xd1a130d3, + 0xf093d2b1, + 0xbe004db4, + 0xb9002617, + 0xe60fb4b3, + 0xc1fdb83f, + 0xd1c13cd3, + 0x38d2c134, + 0x4dbef093, + 0x25fdbe00, + 0xb4b3b900, + 0x9e3fe60f, + 0x40d189fd, + 0x9342d289, + 0x004dbff0, + 0x0025e6be, + 0x71fd8c5e, + 0x93d281d1, + 0x004ccbf0, + 0x0025d6be, + 0x0fb4b3b9, + 0xfe003fe6, + 0xd2a1d191, + 0x4cd1f093, + 0x25c1be00, + 0xb4b3b900, + 0xeb3fe60f, + 0x34dec1fd, + 0x892cd189, + 0xd3892ed2, + 0x32d48930, + 0x4cc3f093, + 0xbefe0500, + 0x5e00259f, + 0xfb4efdce, + 0x2df6f493, + 0x0a428905, + 0x07084389, + 0x2eb107c0, + 0x8e002732, + 0xd412befb, + 0x45f39300, + 0x340104dc, + 0x400bd007, + 0x05563405, + 0xd4860d07, + 0xfb8e0127, + 0xffff4ea7, + 0xb443b9ff, + 0x0931e60f, + 0x931b07c0, + 0x004eeaf2, + 0x4ee9f393, + 0xfc667e00, + 0xfd4edb1e, + 0xd007f063, + 0xef2ef193, + 0x3e0f0703, + 0x090726a2, + 0xba4d24f4, + 0xc0f4290b, + 0x2714284c, + 0xdef19306, + 0x629e004e, + 0xd0850028, + 0xf0430027, + 0xf293fd8e, + 0x8103ef04, + 0xd4215124, + 0x0000004f, + 0x00271820, + 0x24712361, + 0x140a430b, + 0x062707d6, + 0x4e98f193, + 0x28339e00, + 0x27410b00, + 0x014fd030, + 0x1e700000, + 0x0f6b0307, + 0x0d07db1e, + 0xeecaf393, + 0x014a2703, + 0x05340332, + 0xa8040302, + 0x1e0127f4, + 0x1e3127ae, + 0x93fb4ee0, + 0x04db8bf4, + 0xbea74301, + 0x63ffffff, + 0xb93123f0, + 0x050fb4b2, + 0x074305f0, + 0x36fc09d1, + 0x01fc0d2b, + 0xd64d27f0, + 0xe5fc9307, + 0x302703f3, + 0x1d07c405, + 0x05bec315, + 0x0c070020, + 0x002031be, + 0x4cd8d441, + 0xd4710f11, + 0xb4b94586, + 0x41030c45, + 0x0c45b4bd, + 0xfb8ef043, + 0xf2930c07, + 0x93004e6b, + 0x004dfef3, + 0x1efb7b7e, + 0x63fc4eb9, + 0x09f005f0, + 0xc0d107fc, + 0x0c0bbbcd, + 0xdb12f393, + 0x23340104, + 0xa7340541, + 0xffffff4e, + 0x0fb443b9, + 0xfc0d38b6, + 0xfc93f001, + 0x2703f37c, + 0x2707d54d, + 0x051d0730, + 0xbec315c4, + 0x07001fb1, + 0x0ef0430c, + 0x1fc09efc, + 0x930c0700, + 0x004e12f2, + 0x4e15f393, + 0xfb227e00, + 0xf063cd1e, + 0x0bb94d27, + 0x0d483c27, + 0x07f32df4, + 0x43f00110, + 0x4e931ef0, + 0x4df493fb, + 0x4269052c, + 0xd0074349, + 0x322eb107, + 0xfb8e0027, + 0x002107be, + 0x07e6c007, + 0x0dc0d009, + 0x930c0bbb, + 0x04da8ff3, + 0x41033401, + 0x4ea73405, + 0xb9ffffff, + 0x960fb443, + 0xc60c0735, + 0x8e0127c4, + 0x07fb8efb, + 0x3cf2931b, + 0xf393004d, + 0x7e004dab, + 0xe61efab8, + 0x3ea7f84e, + 0xb9feffff, + 0xf819c134, + 0x00d5104c, + 0xffff1ea7, + 0x093399ff, + 0x2b441499, + 0xe84f4b43, + 0x9300c241, + 0x04da43fb, + 0x9941bc99, + 0x4c0740b2, + 0x3407422b, + 0x3fe63f6b, + 0xe2070139, + 0xe333e783, + 0x41d8ef03, + 0xbd990005, + 0x8fefe644, + 0xe4e40100, + 0x005a724f, + 0x0700b100, + 0xd7aea791, + 0x8b07ffff, + 0x9399a479, + 0x274f4b44, + 0x0140e820, + 0x2b430701, + 0x6b040742, + 0x0703230f, + 0x031f6b10, + 0x7b01ce03, + 0x43834107, + 0x44332487, + 0x43f9422b, + 0xff00004f, + 0x410737f6, + 0x14074103, + 0x31071f6b, + 0x43873383, + 0x342b3433, + 0xf95401ce, + 0x00004f34, + 0x9940a6ff, + 0x310704e4, + 0x3f4b342b, + 0x994c31c8, + 0x280742b4, + 0xd1234496, + 0x27402499, + 0x07410330, + 0x9d1f6b14, + 0x219d4223, + 0x47c1ce40, + 0xbd9d3027, + 0xf6002744, + 0x93f88e36, + 0x04d983f4, + 0x99404299, + 0x322b4143, + 0x00273f6b, + 0x012731a6, + 0xe499f88e, + 0x2b300704, + 0xcc3f4b34, + 0xb499b631, + 0x44bd9d42, + 0xf49349a6, + 0x9904d958, + 0x3c074042, + 0x3f6b322b, + 0xe107d51e, + 0xe333e783, + 0x41d8ef03, + 0xee860005, + 0x4fe0e401, + 0x00005a72, + 0x8d9dff2c, + 0x9d412744, + 0x4ea742b4, + 0x99feffff, + 0xe3010944, + 0x9304e49d, + 0x04d91bfc, + 0x5a723fc0, + 0x9d240000, + 0xe40144cd, + 0xc399f48b, + 0x41c49940, + 0x3407432b, + 0x871e3f6b, + 0xfe5e2127, + 0x44bd99fe, + 0x5e44bd9d, + 0xd123ff65, + 0x4c07da1e, + 0x3407412b, + 0x535e3f6b, + 0xa7f84eff, + 0xffffffde, + 0x0fb4d4b9, + 0x4ff6f0a3, + 0xf8930122, + 0x9904d954, + 0x42e026d4, + 0xb2be0104, + 0x4ea70071, + 0xb9ffffff, + 0xb90c444b, + 0xce0c474c, + 0x9d2759bc, + 0xac270bba, + 0x070c1e28, + 0x0741034c, + 0xcecf6bc4, + 0x3c0745bc, + 0x070f3c83, + 0x33238743, + 0x0b422b44, + 0x07448743, + 0x23d40704, + 0xfff3b8de, + 0xf3900e23, + 0x7127beff, + 0xc6d48100, + 0x4027ce4f, + 0xd465d475, + 0xfa2df90d, + 0x1d07f001, + 0x07fcd07e, + 0x0741034c, + 0xcecf6bc4, + 0x2ea7bdcb, + 0xbdffffff, + 0xbd0c472b, + 0xc10c462b, + 0x30274481, + 0x9d06839d, + 0x8bbd0883, + 0x21d502d0, + 0x24d10458, + 0x30a70458, + 0x045c24d5, + 0x23bddf07, + 0x40270109, + 0x24add403, + 0x21d5010a, + 0x0b1e0c2c, + 0xf193f011, + 0x7e03ec58, + 0x0d07fc7d, + 0xec4ef193, + 0xfba07e03, + 0x0156c007, + 0xffffdea7, + 0xb4d4b9ff, + 0x5e4fd60f, + 0xf06ef493, + 0xd83d2703, + 0x05040707, + 0xbe4c1543, + 0x93001cbe, + 0x04d7dff2, + 0x27402499, + 0x9d410330, + 0x249d4223, + 0xfd667e40, + 0x0f2088b9, + 0xd8bdf083, + 0xf88e0c45, + 0xf6088499, + 0x27fef94f, + 0x28f19304, + 0x229e004b, + 0xf8930024, + 0x9904d834, + 0x829926d1, + 0xe2f09308, + 0xd0be004a, + 0xd05e0020, + 0x57f093fe, + 0xc4be004b, + 0x991e0020, + 0xf063fd4e, + 0xf001061e, + 0x93fc587e, + 0x03ebc3f1, + 0xbc7e0f07, + 0x93d007fc, + 0x03ebb7f1, + 0x4ea70156, + 0xb9ffffff, + 0xd60fb443, + 0xddf49339, + 0x3d2703ef, + 0x040707d7, + 0x4d154305, + 0x001c2dbe, + 0xd74ef293, + 0x40249904, + 0x41033027, + 0x9d42239d, + 0xd57e4024, + 0x8ef043fc, + 0x0ff093fd, + 0x64be004b, + 0xca1e0020, + 0xdea7fb4e, + 0xb9ffffff, + 0x630fb4d4, + 0xc94ff6f0, + 0x26d49900, + 0x00ce4ff6, + 0xd79afc93, + 0xdccbb904, + 0xddcdb902, + 0x0edbce02, + 0x4d073d1e, + 0xd4074103, + 0xbdcedf6b, + 0x834d0732, + 0x33340747, + 0x2b433336, + 0x33030734, + 0xf1032b03, + 0x05454004, + 0xc4438300, + 0x0f03d942, + 0x0005454c, + 0x07fc017e, + 0x0741034d, + 0xcedf6bd4, + 0xc4b9d0db, + 0x48c60f29, + 0x3d07d027, + 0x33334d07, + 0x432b4633, + 0x03330407, + 0x0f03042b, + 0x00055194, + 0xb9fbd57e, + 0x030f29c4, + 0xdfd4dad1, + 0x40273027, + 0x02d8c3d5, + 0x0f29c4bd, + 0x0f24c3d5, + 0x02dcc3bd, + 0x02ddc3bd, + 0xf1930f07, + 0x7e03e7b0, + 0x07e6fbbf, + 0x4dc0f409, + 0x01ee0bbb, + 0x9df193f0, + 0x3e7e03e7, + 0x930f07fb, + 0x03e793f1, + 0xb6fba27e, + 0xfece7e00, + 0xfb8ef043, + 0x4a43f093, + 0x1f81be00, + 0xff2f5e00, + 0xf1930427, + 0x9e004a4b, + 0x4e0022b1, + 0xffdea7fd, + 0xd4b9ffff, + 0x4e360fb4, + 0x9926d199, + 0x41ce27d4, + 0xff3ea73c, + 0x3499feff, + 0x87438309, + 0x2b443324, + 0x4d43f942, + 0x23ff0000, + 0x3738d431, + 0xd49d4227, + 0x8e120027, + 0x01f493fd, + 0x439904d6, + 0x03202740, + 0x42429d31, + 0x0e40439d, + 0xfb865efd, + 0xf1930827, + 0x9e004a2c, + 0x93002255, + 0x004a16f0, + 0x001f0ebe, + 0x0827a71e, + 0x4a59f193, + 0x223f9e00, + 0xa7fd4e00, + 0xffffffde, + 0x0fb4d4b9, + 0xd2994a96, + 0x27d49926, + 0x271f42ce, + 0x27d49d40, + 0xfd8e2486, + 0xd5aaf393, + 0x40349904, + 0x0342329d, + 0x40349d41, + 0x315efd0e, + 0x930827fb, + 0x004a3ef1, + 0x0022009e, + 0x4a26f093, + 0x1eb9be00, + 0x4ec41e00, + 0xffcea7fb, + 0xc4b9ffff, + 0xd0070fb4, + 0xdc064f96, + 0xc4b9b027, + 0xcbbd0fb4, + 0x4f760464, + 0xeddef293, + 0x27cd9d03, + 0x07db4d27, + 0x24053427, + 0x2d252315, + 0xcd9d0207, + 0x1a24be26, + 0x45f39300, + 0x349904d5, + 0x423b9d40, + 0x349d4103, + 0x5efb0e40, + 0xf493facc, + 0x9904d5b8, + 0x20270443, + 0x439d32e3, + 0x08429d04, + 0x7e064d9d, + 0xa91ed751, + 0x4a06f093, + 0xbe1d0700, + 0x1e001e43, + 0x0df0939a, + 0x1d07004a, + 0x001e36be, + 0xfb4e9b1e, + 0xffffcea7, + 0xb4c4b9ff, + 0x9349960f, + 0x04d537fb, + 0xd486bd19, + 0xc4b9fb8e, + 0x48160fb4, + 0xed5af493, + 0xdd3d2703, + 0x05040707, + 0xbe4d1543, + 0x270019aa, + 0x8eb41d41, + 0xf44f7efb, + 0xf093d21e, + 0x2700436a, + 0xbe07dd1d, + 0x1e001deb, + 0xa7fb4ed4, + 0xffffffde, + 0x0fb4d4b9, + 0x00c14ff6, + 0x7fff4ea7, + 0xf84391d0, + 0x00d0103c, + 0x93b1637e, + 0x04d48ff4, + 0xd486f393, + 0x01420104, + 0x1ff09331, + 0xb4be004a, + 0x1f27001d, + 0x1007a000, + 0x90000f27, + 0xa0be1007, + 0xb0070019, + 0xc0001f27, + 0x0f271007, + 0x1007b000, + 0x00198ebe, + 0x1f27c007, + 0x1007e000, + 0xd0000f27, + 0x7cbe1007, + 0x30070019, + 0x1b072c07, + 0x4a02f093, + 0x1d71be00, + 0xa7412700, + 0xfd4fff3e, + 0x0c39d4bd, + 0x40273201, + 0x270ef49b, + 0x0ed399c1, + 0xc3cbc23b, + 0x4fbf3ea7, + 0x27c138fd, + 0x53340541, + 0x03c4c6c1, + 0x27f31e34, + 0x7d78414f, + 0xa7f4e801, + 0xffffff3e, + 0x0fb434b9, + 0xf4934876, + 0x2703ec74, + 0x0707dc3d, + 0x15430504, + 0x9efb0e4c, + 0x930018c2, + 0x004934f0, + 0x001d12be, + 0x93ff375e, + 0x004281f0, + 0x07dc1d27, + 0x001d02be, + 0x0427d11e, + 0x4926f193, + 0x20339e00, + 0xa7fc4e00, + 0xffffff4e, + 0x0fb443b9, + 0x7c7e3956, + 0xa70a16b3, + 0xffffff4e, + 0x0fb443b9, + 0x93743fd6, + 0x03ec1bf4, + 0x07d93d27, + 0x04072027, + 0x42154305, + 0x679efc0e, + 0xf0930018, + 0xbe00497f, + 0x1e001cb7, + 0xa5f293ce, + 0x239904d2, + 0x08249909, + 0x076434ce, + 0x83410343, + 0x003cf947, + 0x9d000541, + 0x0ea70924, + 0xbeffffdf, + 0x0700213d, + 0x8734333c, + 0xf1c30bcc, + 0x00018cc4, + 0x004ed8ff, + 0x070d0300, + 0xe4cf03c3, + 0x19000543, + 0x2747b6c4, + 0x66f19308, + 0xa29e0049, + 0xf093001f, + 0x270041d6, + 0xbe07d91d, + 0x5e001c57, + 0x4223ff7f, + 0xffdf0ea7, + 0xbec41dff, + 0x5e0020d2, + 0x0827ff63, + 0x4910f193, + 0x1f779e00, + 0xa7fb4e00, + 0xffffffbe, + 0x0fb4b4b9, + 0x0d01c007, + 0x013a4ff6, + 0x03eedde0, + 0xddd000e9, + 0xe02403ef, + 0xe303f2dd, + 0xf3ddf400, + 0xe0008d03, + 0x1803f0dd, + 0xf1dde001, + 0x27010b03, + 0x59f19304, + 0x369e0049, + 0xdde0001f, + 0x00c703eb, + 0x03ecddd0, + 0xecdde07d, + 0xc400d303, + 0xe003eddd, + 0xd2aafd93, + 0x44d49904, + 0xde994e96, + 0x07412741, + 0x3317831e, + 0x44d49d13, + 0xf4531d0b, + 0x1405eb2a, + 0xa743d099, + 0xfeffff3e, + 0x9904109d, + 0x329944b4, + 0x4b422b09, + 0x1141cc4f, + 0xffd74ea7, + 0x364379ff, + 0x03400735, + 0x04149d41, + 0x41034e07, + 0x6b40d399, + 0x41d49d4f, + 0x4f6b432b, + 0x00a849f4, + 0xdde0fb8e, + 0x008103f4, + 0x03f5dde4, + 0x0c07ff77, + 0x305efb0e, + 0xe9ddc0f1, + 0xdde41d03, + 0xff6503ea, + 0xd22efd93, + 0x41de9904, + 0xfc5bf453, + 0x17831e07, + 0x1d0b1333, + 0xfd938d1e, + 0x9904d218, + 0xf45341de, + 0x1e07fbd3, + 0x13331783, + 0x775e1d0b, + 0x5efb0eff, + 0x0c07fe41, + 0xc75efb0e, + 0xf5fd93ec, + 0xde9904d1, + 0xc1f45341, + 0x831e07fa, + 0x0b133317, + 0xff545e1d, + 0xd1defd93, + 0x41de9904, + 0xf8f7f453, + 0x17831e07, + 0x1d0b1333, + 0x0eff3d5e, + 0xf0875efb, + 0xfb0e0c07, + 0x0eeafb5e, + 0xfd075efb, + 0x4822f093, + 0xbe1d0700, + 0x5e001ae3, + 0x0427febc, + 0x481df193, + 0x1e139e00, + 0x00000000, + 0x00054548, + 0x000455f0, + 0x00001000, + 0x00000fff, + 0x00000080, + 0x0000007f, + 0xf123f54e, + 0x4127f3ab, + 0x7ea7f4eb, + 0xa7ffffff, + 0xfeffff6e, + 0x0c3c73d1, + 0x0ea735a6, + 0x41fdafff, + 0x05430b04, + 0x10749904, + 0x02f14fe6, + 0x0eb6f293, + 0xf6241904, + 0x27020b4f, + 0xc164b980, + 0x2f4cfc19, + 0x61b901c0, + 0x1cd819c1, + 0x64992430, + 0x87438309, + 0x2b443324, + 0x5043f942, + 0x46ff0000, + 0x4863d136, + 0xbb31e001, + 0x23430707, + 0x8642f042, + 0xc164b909, + 0x104cd819, + 0x277c9972, + 0x0692cfe6, + 0x6d11a027, + 0x0c30dbf9, + 0x1d07ff00, + 0x1e23bf4b, + 0xeefff3d0, + 0x2702a2cb, + 0x4df29390, + 0x2419040e, + 0x0ea74686, + 0x19fff3c7, + 0x4e4f4b04, + 0x071c074c, + 0xae997e2a, + 0x41279746, + 0x046474bd, + 0x270f7399, + 0x0ef49b40, + 0x33874127, + 0xb04034f5, + 0xb2fcff02, + 0x64d10291, + 0x30270148, + 0x02a842e0, + 0x48ab4307, + 0x44863027, + 0x83073127, + 0x6c118f6b, + 0xf3d0ce23, + 0xfa8fe6ff, + 0x93b02700, + 0x040de7f8, + 0x0deaf393, + 0x06391904, + 0x09f4939d, + 0x439904d1, + 0xc74ea765, + 0x4a19fff3, + 0x3ff6cd19, + 0x01270238, + 0x31533d07, + 0x41534a07, + 0x34eb31c3, + 0xd0e6f493, + 0x64429904, + 0x0536315c, + 0xf8044499, + 0x07008d43, + 0x8b41c342, + 0x8630274b, + 0x07312744, + 0xc6b183b3, + 0xc41979bf, + 0xc41d41a3, + 0x3ea795a6, + 0x19fff3c7, + 0x1d41a334, + 0x9b402734, + 0x83190ef4, + 0x00953ff6, + 0x045074d1, + 0x008d4ff6, + 0x19c16db9, + 0xd183d453, + 0x0d6af093, + 0x560b1904, + 0xf6d706bd, + 0x990685bf, + 0x30270f74, + 0x270ef39b, + 0xf5448731, + 0x02b04043, + 0x19fdabff, + 0x864fe684, + 0x19fdeb05, + 0x3df093c4, + 0x41e3040d, + 0x0319c41d, + 0x3ea735a6, + 0x19fff3c7, + 0x1d41e334, + 0x9b402734, + 0x40270ef4, + 0x4d5e841d, + 0x270127fe, + 0x6572be11, + 0xc60fc600, + 0xf3c73ea7, + 0x273419ff, + 0x184d8b30, + 0x07312741, + 0x1edf6bd3, + 0xf1f89399, + 0x8419040c, + 0x4fe6b127, + 0xb027ff04, + 0x27feff5e, + 0xff7a5ed0, + 0xc27e0027, + 0x4064b9bf, + 0xf6d00701, + 0x0705074f, + 0x83b007c0, + 0xbc8310cc, + 0x07c67630, + 0x254c834d, + 0x302748ab, + 0x31274486, + 0x8f6b8307, + 0x04c9bff6, + 0x19c164b9, + 0x0b0f4cf8, + 0xc16dbdfe, + 0xfe045e19, + 0x006998be, + 0x19c164b9, + 0x04969127, + 0x4cf89027, + 0x9905822f, + 0x75992674, + 0x8b42e027, + 0x8752e002, + 0x27802702, + 0x6974bd40, + 0x680bbe04, + 0xb90d9600, + 0xb90c4473, + 0x1b0c4774, + 0x6bd40743, + 0x10dcd4df, + 0x27b30739, + 0x27111ea0, + 0x31c49d40, + 0xb103d103, + 0xdcf4a127, + 0x07054510, + 0x0f4c834b, + 0x24873407, + 0x322b3433, + 0xc387340b, + 0xf3b8ce23, + 0x7e0c07ff, + 0x0fd6f2be, + 0x23aff6d3, + 0xab402705, + 0x86302749, + 0xb9312744, + 0x6b046674, + 0xf6f3153f, + 0xb904e04f, + 0xf6046a74, + 0xf604f84f, + 0x2704c98f, + 0x6774b950, + 0x27450604, + 0x6774bd40, + 0x21f09304, + 0x049904cf, + 0xf84fe608, + 0x11402701, + 0x2743abf3, + 0x27448630, + 0x93402731, + 0x04cf07f0, + 0x049d3f6b, + 0xe6830764, + 0x27fd283f, + 0x65049d41, + 0xa7fd205e, + 0xffffeb0e, + 0x001c44be, + 0xa7d3b97e, + 0xffffeb0e, + 0x001c15be, + 0xa7fcfb5e, + 0xfff3c70e, + 0x3a072c07, + 0xf9bb297e, + 0x000c30db, + 0x4b9007ff, + 0xfd4b5ebf, + 0xcebef093, + 0x05049904, + 0x04ba4fe6, + 0xbd5e0027, + 0x81fd93fd, + 0xd001040b, + 0x0ff6f08b, + 0x649906a9, + 0x2742a60a, + 0x9d402731, + 0x64d10a64, + 0x42e40148, + 0xdea7fd5c, + 0x11fd9fff, + 0x184c83d4, + 0xe9bed415, + 0x4ea7001c, + 0xb9feffff, + 0x66014143, + 0xa7312735, + 0xd07fff4e, + 0xf2934345, + 0x19040b40, + 0x274ff624, + 0x7e002707, + 0xf1abbb7f, + 0x2fe62127, + 0x21e0066e, + 0x24f9066a, + 0xff0119bc, + 0x06c642f0, + 0x43f14287, + 0xff023000, + 0x06ba34f8, + 0x25d02103, + 0xeb4127de, + 0xbe4fe6f1, + 0x2dbcbe06, + 0xff3ea700, + 0x3461ffff, + 0xc3074726, + 0x4fffdea7, + 0x9b4027fd, + 0xd4c50ef4, + 0x2da0be38, + 0x56c46100, + 0xff0ea742, + 0x0399feff, + 0xffbea709, + 0xb201fd4f, + 0xffffeea7, + 0x0ee199ff, + 0x8311ed99, + 0x3b412733, + 0xeb230742, + 0x87d12314, + 0x9d243333, + 0x232b0ee1, + 0xf911ed9d, + 0x00005024, + 0xf9c407ff, + 0x00004f24, + 0xfd4123ff, + 0x00004f24, + 0x24dff6ff, + 0x09039906, + 0x2b44e499, + 0xe84f4b43, + 0x86061641, + 0x58e4d1c5, + 0x25ec9d04, + 0x9340e4c5, + 0x04cd93f4, + 0x40274101, + 0xe49d0e07, + 0x2ae49d0c, + 0x7e12ed9d, + 0xb101a5f6, + 0xe57af293, + 0xd24d2703, + 0x0c3c2707, + 0x24050207, + 0x21252315, + 0x2d452c35, + 0x0011c1be, + 0x0a42f393, + 0xf6341904, + 0x2705824f, + 0x0bf49b40, + 0xa70ef49b, + 0xfeffff2e, + 0x4c272111, + 0x8824bd10, + 0xfd302719, + 0x00000013, + 0x9b4027ff, + 0x3ea70ef4, + 0x99ffffff, + 0x4fe61234, + 0x312705e9, + 0x4fff4ea7, + 0x3043c5fd, + 0x8127ff1e, + 0xb9fd7a5e, + 0xf6046874, + 0x2703384f, + 0x2c7ad180, + 0x93231e0c, + 0x04cd0ff0, + 0xe05d0499, + 0x9901ad41, + 0x45860bd4, + 0xf2934227, + 0x9d04ccfc, + 0x0a070424, + 0x03cbb07e, + 0xbe0a07a1, + 0x0700ab37, + 0x184c8340, + 0x92184ce4, + 0x83b00701, + 0xbff620bc, + 0x2a070189, + 0x070f2c83, + 0x333287c2, + 0x07c32bc4, + 0x0b43334c, + 0x33d4074c, + 0x03d40bd3, + 0x0552d0df, + 0x11d49900, + 0xc104d399, + 0x4733acd9, + 0x939d34ab, + 0x7ec20b48, + 0xf493abbb, + 0x010519f8, + 0xc5cc8743, + 0xc30b7090, + 0x113cc4d1, + 0x33749bc5, + 0x6c94c543, + 0xf604d399, + 0x99ff723f, + 0x4fe605d4, + 0xbc7eff6b, + 0x640fe6ab, + 0x11f093ff, + 0x039904cb, + 0x09049908, + 0x13073103, + 0x31231783, + 0x051914ee, + 0x9307d299, + 0x04caf7f4, + 0xfa32f053, + 0x0108419d, + 0x0032fd04, + 0x27000541, + 0x27ba2710, + 0x2341053a, + 0xb84403b1, + 0x334287f3, + 0xf1420b24, + 0x00019844, + 0xb9f293ff, + 0x240503df, + 0x020adea9, + 0x03abd1b9, + 0x01ecd2a9, + 0x01ead3a9, + 0x0208dca9, + 0xf2354e07, + 0xf293410b, + 0xd103df98, + 0x0301f8d0, + 0x23150fcc, + 0x310f4c03, + 0x534453f3, + 0x252445c4, + 0x652b5523, + 0x35208521, + 0xc4d3d12c, + 0x53482703, + 0x8d318338, + 0x4e072424, + 0x8d0f4c03, + 0x44532623, + 0x01b73fe6, + 0x3c07e407, + 0xf9aaf453, + 0xf9aaf053, + 0xe8033703, + 0x04014101, + 0xe7e337e3, + 0x2e9b2307, + 0x428b2433, + 0x210b44c6, + 0x0d27242b, + 0x039b0180, + 0x30471e07, + 0x43071103, + 0x4c831153, + 0xa611237f, + 0x803c0344, + 0xe42b4147, + 0x4e07e09b, + 0xa67f4c83, + 0x80ec0344, + 0x320b319b, + 0xf956f253, + 0xdf02f493, + 0x013e0b03, + 0x7e437520, + 0xf093eae2, + 0x9904cb64, + 0x41e45d04, + 0x0907fe57, + 0x7e480c03, + 0x4c5ee2e5, + 0x2c74d1fe, + 0x294ace0c, + 0xfb9f0ea7, + 0x2c7ad5ff, + 0x1b8dbe0c, + 0x9b402700, + 0x73990ef4, + 0xbf2ea70e, + 0x3138fd4f, + 0x24054127, + 0x34c63153, + 0xf31e2403, + 0x02f15ff6, + 0x4f6b4807, + 0xbdfc025e, + 0xe619c16d, + 0x27f945cf, + 0xff4ea731, + 0x43c5fdcf, + 0xf9385e68, + 0x07a2697e, + 0xf96c5ea0, + 0xbc83b007, + 0xe5bff630, + 0x83c00702, + 0xf65e10cc, + 0x1a9bbefa, + 0xc6212700, + 0x21c0712f, + 0xbc24f96e, + 0x26ff0119, + 0xf1428746, + 0x02300043, + 0x033438ff, + 0xe425d021, + 0xcfff3ea7, + 0x4031c1fd, + 0x41072027, + 0x34c541a3, + 0x0ef29b40, + 0xff8b0007, + 0xc54031c5, + 0x71d16032, + 0x4ea70c3c, + 0xc5fd4fff, + 0x18a66442, + 0xafff2ea7, + 0xa72341fd, + 0xfdafff4e, + 0x2ea7310b, + 0x05fd9fff, + 0xe3242143, + 0x2425104c, + 0x3ca32311, + 0xbe231510, + 0x5e001a4b, + 0x2103fa05, + 0x41278a1e, + 0x40275496, + 0x325e5407, + 0xbd4027fb, + 0xbe046674, + 0x1100a9cd, + 0xab4027f3, + 0x27048603, + 0x154f6b41, + 0x6a74b9f4, + 0x0c4fe604, + 0xa3c97efb, + 0xbefb065e, + 0x5e0063bf, + 0x0ea7fa7b, + 0x39fff3bf, + 0x447bbd04, + 0x2744f60c, + 0xfad15e41, + 0x001a6ebe, + 0xc85e4127, + 0x01f253fa, + 0x01f053f8, + 0x01e407f8, + 0x07040121, + 0x5ee1033c, + 0x7b7efe50, + 0xf98b5ef4, + 0x27a0bf7e, + 0x27048621, + 0x5e020720, + 0x4ea7f8fc, + 0xc5fdcfff, + 0x465e6843, + 0x274027f8, + 0x6874bdd0, + 0x6b0ea704, + 0x3ebefff4, + 0x8c270066, + 0xe0900711, + 0xffffff0f, + 0x07014dff, + 0x87463349, + 0xf1c40bc9, + 0x000ba4c0, + 0x7eac07ff, + 0xc3f1a689, + 0xff000ba4, + 0xf45cae23, + 0x0f3c83ff, + 0x24332307, + 0x232b3387, + 0x43334207, + 0x3407420b, + 0x430b3333, + 0x537c42f1, + 0x1a070005, + 0x38074207, + 0x10014403, + 0x40051403, + 0xf3a84403, + 0x23c5a371, + 0xc5a48158, + 0xa0915c24, + 0xa16020c5, + 0xbdf093a3, + 0x23c50516, + 0x0aa48980, + 0x4c830101, + 0x6824c50f, + 0x0a07a331, + 0x517823c5, + 0x2c0c03a4, + 0x017c24c5, + 0x0f3c83a3, + 0x23874307, + 0x422b4433, + 0x4487430b, + 0x410ba2a1, + 0x116442d5, + 0x4d033627, + 0x02011144, + 0x42050403, + 0xf3a84403, + 0x045074d1, + 0xc916f393, + 0xb9412304, + 0xb902dc3b, + 0x0102dd3d, + 0x5074d5a3, + 0xddf45304, + 0x274201f6, + 0x01182700, + 0xb134ee24, + 0x03010300, + 0x8801882d, + 0x01c027f1, + 0x9642fcc4, + 0x84c4b900, + 0x754fd601, + 0x41a3c401, + 0xdbcec405, + 0x07291e0e, + 0x0741034d, + 0xcedf6bd4, + 0x3d071ebd, + 0x23073783, + 0x33332633, + 0x4207232b, + 0x422b4333, + 0x454043f1, + 0x31dc0005, + 0x93bd07db, + 0x04c8a7f3, + 0x02dd3bbd, + 0x94fd4027, + 0xff000b98, + 0xf46b3ea7, + 0x963479ff, + 0xa7d12747, + 0xfff46b0e, + 0x0064f0be, + 0x0fe49007, + 0xffffffff, + 0x8d07feb7, + 0xa7fb605e, + 0xfff4690e, + 0x0018bebe, + 0xdc1ed127, + 0x0bbc0d27, + 0x0d202c27, + 0x07f22df0, + 0x03f0011c, + 0x7e01641d, + 0x755eeca1, + 0x030c07ff, + 0xef7e0c0c, + 0xff635eec, + 0x46334007, + 0x402b0333, + 0xc333c407, + 0xcf03c42b, + 0x00054540, + 0x7eff465e, + 0x08abace8, + 0x04864027, + 0x84074127, + 0x015e8f6b, + 0x267499fd, + 0xf9884fe6, + 0x72201cf8, + 0xf9805ef6, + 0xcc83c007, + 0x860c0710, + 0x7e0127c4, + 0x0a5eac74, + 0x5c04e8f8, + 0x9eda7ef9, + 0x270a6499, + 0x524ff631, + 0x5e3027f9, + 0x2103f94d, + 0xa7f98d5e, + 0xffffff1e, + 0x23d61251, + 0xf0934027, + 0x1d0404ac, + 0x9b302704, + 0xf39b0bf3, + 0xff4ea70e, + 0x129dfd4f, + 0x0f129d10, + 0xf39b4201, + 0x9931270e, + 0x323b0e14, + 0x2ea734cb, + 0x38fd4fbf, + 0x05412731, + 0xe6315324, + 0x03fa463f, + 0xa7f11e24, + 0xffffffce, + 0xa70ec199, + 0xfffb9d0e, + 0x001867be, + 0xc49d4127, + 0xfa165e12, + 0x4c5e4027, + 0xeb4127f9, + 0x4a4ff6f1, + 0xe84327f9, + 0x27f1abf4, + 0xc02d4621, + 0x24f94621, + 0xff0119bc, + 0x873942d0, + 0x0043f142, + 0xd8ff0230, + 0x21032e34, + 0x1ee325d0, + 0xb51a7ed1, + 0x27fa155e, + 0x63f19308, + 0x269e003d, + 0x01270013, + 0xabb45a7e, + 0xe3d411f3, + 0x0400004e, + 0xf3ebd415, + 0x27f8c85e, + 0x03a91e40, + 0x4eb31e21, + 0xeb0ea7fe, + 0x6ebeffff, + 0xe37e0014, + 0xeb0ea7cb, + 0x3fbeffff, + 0xfe0e0014, + 0x4ef4f75e, + 0xff4ea7fe, + 0x4391d07f, + 0x4e103cd8, + 0x03c10471, + 0x3802c134, + 0x00004fd0, + 0x0b347000, + 0x014fd443, + 0x2bf00000, + 0x813e32ca, + 0x91475604, + 0xa146d604, + 0xb1465604, + 0xc145d604, + 0x45363004, + 0x963c04c1, + 0x27fe8e44, + 0xb3f19306, + 0x9e9e003d, + 0x06270012, + 0x3d29f193, + 0x12939e00, + 0x93062700, + 0x003ceef1, + 0x0012889e, + 0xf1930627, + 0x9e003d3c, + 0x4e00127d, + 0x3bcf5bf0, + 0x4efe2bdf, + 0xbe0f07fc, + 0x1effb5df, + 0x9b4027ff, + 0x00070ef4, + 0xf61eff8b, + 0xff1eff1e, + 0x3ea7fe4e, + 0x11fd7fff, + 0x004de334, + 0xa7341508, + 0xfd4fff3e, + 0x40273201, + 0x270ef49b, + 0xf52287e1, + 0x02b0402e, + 0xff1ea7ff, + 0x4427fdcf, + 0x14c53007, + 0xd0382348, + 0x21274232, + 0xffff3ea7, + 0xbe32bdfe, + 0x9b402719, + 0x1ec50ef4, + 0xbe76be60, + 0xa7202701, + 0xfeffff3e, + 0x19be32bd, + 0xf49b4027, + 0xff3ea70e, + 0x34c5fdcf, + 0x6834c548, + 0x7fff2ea7, + 0xa32411fd, + 0x1508004d, + 0x27fe8e24, + 0x4ebe1e22, + 0x27c007fc, + 0xcdf09312, + 0x94be0045, + 0xc111000e, + 0x45daf093, + 0x0e89be00, + 0x93c12100, + 0x0045e1f0, + 0x000e7ebe, + 0xf093c101, + 0xbe0045e8, + 0x31000e73, + 0xeff093c2, + 0x10270045, + 0x000e66be, + 0xf093c241, + 0x270045e2, + 0x0e59be11, + 0x93c25100, + 0x0045d5f0, + 0x4cbe1227, + 0xc261000e, + 0x45c8f093, + 0xbe132700, + 0x71000e3f, + 0xbbf093c2, + 0x14270045, + 0x000e32be, + 0xf093c281, + 0x270045ae, + 0x0e25be15, + 0x93c29100, + 0x0045a1f0, + 0x18be1627, + 0xc2a1000e, + 0x4594f093, + 0xbe172700, + 0xb1000e0b, + 0x87f093c2, + 0x18270045, + 0x000dfebe, + 0x9330c2c1, + 0x004579f0, + 0xf0be1927, + 0xc2c1000d, + 0x6bf09334, + 0x1a270045, + 0x000de2be, + 0x9338c2c1, + 0x00455df0, + 0xd4be1b27, + 0xc2c1000d, + 0x4ff0933c, + 0x1c270045, + 0x0dc5be0c, + 0x40c2c100, + 0x4540f093, + 0x0d1c2700, + 0x000db6be, + 0x9344c2c1, + 0x004531f0, + 0xbe0e1c27, + 0x1e000da7, + 0x5bf04eff, + 0x2bdf3bcf, + 0x07fc4efe, + 0xfe76be0f, + 0x0efc0eff, + 0x4eff0bf0, + 0x3bcf5bf0, + 0x4efe2bdf, + 0xbe0f07fc, + 0x1efffedf, + 0x000000ff, + 0xe407fe4e, + 0xe30b4623, + 0x330f4c83, + 0x023d0e3c, + 0x3f83011d, + 0x3ff00000, + 0x20271333, + 0xab104c33, + 0x0012f543, + 0xf5ff0214, + 0x02140414, + 0x270e2dff, + 0x0ef49b40, + 0xff1efe8e, + 0xf94eff1e, + 0xc107a007, + 0x4714ac23, + 0x091a0b11, + 0x99d00713, + 0x3e662409, + 0x40070c07, + 0x3b0c4c23, + 0x23d20149, + 0x0be48731, + 0x0b4387e2, + 0x01130d4e, + 0x320cc24b, + 0x493b4427, + 0x30072047, + 0x22231e07, + 0xe007d407, + 0x142b3123, + 0xd0132a0b, + 0x3ccaec2b, + 0x27012341, + 0x0b403b41, + 0x0d31274b, + 0x23140523, + 0x581d0b22, + 0x8e0b07fe, + 0x034c07f9, + 0x27244741, + 0x0c071cec, + 0xec2b2a0b, + 0x1a1d4cd4, + 0x01031207, + 0xfef02203, + 0x07b02707, + 0x09f98e0b, + 0x1e31e613, + 0x1ee1278a, + 0x1ee127bd, + 0xe3f54ee4, + 0x58f0c5f6, + 0x27240299, + 0x3b4f0731, + 0x03e00732, + 0xf2c5404c, + 0x4cf3c554, + 0x235cf1c5, + 0x2f0714ec, + 0x2768f4c5, + 0x4027103c, + 0x24032405, + 0xf3c1f3b8, + 0x2320274c, + 0xc54a2731, + 0xf2c540fe, + 0x0d6c2748, + 0xc560f3c5, + 0xf2c164f4, + 0x1a238940, + 0xc5182789, + 0x72f050f3, + 0xf4c100b1, + 0xaa34ee4c, + 0x54f2c100, + 0x4c234607, + 0xc1423b0d, + 0x048758f2, + 0x030b2301, + 0x01007fe6, + 0xc150f4c1, + 0x24e260f2, + 0x46070103, + 0x2354f2c1, + 0x423b0c4c, + 0x2350f2c1, + 0x87420b61, + 0x0b812754, + 0x3b302753, + 0x03a20786, + 0xc5100761, + 0x902744f3, + 0x0201c707, + 0x42073f07, + 0x4c83465b, + 0x0bd4870f, + 0x0734013d, + 0xe6e48be8, + 0x0700854f, + 0xd63207b4, + 0x073407e4, + 0x0b4307b2, + 0x774bce48, + 0x14031205, + 0x91030403, + 0x0748fcf0, + 0x4634013f, + 0x27140545, + 0x05140340, + 0x68f2c134, + 0x32ce3403, + 0x5cf3c1ed, + 0xc16936ce, + 0xf3c144f4, + 0x8d471b40, + 0x3a8d1834, + 0x40f4c11a, + 0x0364f2c1, + 0xc5212342, + 0xf2c540f4, + 0xf6610364, + 0xc1ff2d2f, + 0xf6c348f0, + 0xf4c1f58e, + 0x7fa4ea60, + 0x074907ff, + 0x2b410337, + 0x5874ca39, + 0x02017ee6, + 0x12050403, + 0xf3a81403, + 0x32059a1e, + 0xf2c18f1e, + 0x054f0744, + 0x03d40b53, + 0x03402722, + 0xc5a10354, + 0xd40544f2, + 0xc1ff775e, + 0x412750f2, + 0xf4c52a2e, + 0x278d1e48, + 0x48f4c540, + 0xfac1861e, + 0x07302750, + 0x44f3c510, + 0xc1ff5e5e, + 0x902750fa, + 0xf9c51007, + 0x279f1e44, + 0xa7a81e31, + 0xffffff4e, + 0x010041b9, + 0x26fc40c1, + 0x83300719, + 0x33330f3c, + 0x007e34f9, + 0x4756ff00, + 0x40272107, + 0x34fd0103, + 0xff00007c, + 0x3c833007, + 0x2333330f, + 0x0ff2f011, + 0xffff4ea7, + 0x0041bdff, + 0xfc40c501, + 0x34f9fe0b, + 0xff00007e, + 0xa7d44fc6, + 0xffffff4e, + 0x010041bd, + 0x0bfc40c5, + 0x07fc4efe, + 0x27a13ec0, + 0x270c0e41, + 0x8e040740, + 0x07fa4efc, + 0x14dc23d0, + 0xcd0bc247, + 0x9914dc03, + 0xc00924de, + 0x4e3b4127, + 0xb30bb007, + 0xa3074223, + 0xb432d301, + 0xfa8e0127, + 0x3b0c2c23, + 0x87020b2e, + 0x87030b00, + 0x04b4be2a, + 0x27412700, + 0x9dcb0d00, + 0xfa8e31d4, + 0x0399f74e, + 0x3b412724, + 0x07f06343, + 0x070b0184, + 0x07f10570, + 0x878333d1, + 0x27c00794, + 0x07c249a0, + 0x871b070d, + 0xbea10322, + 0x0b00047e, + 0x03d80bb9, + 0x10acc4c2, + 0x247499e9, + 0xd4077c01, + 0x749d4103, + 0x03f40124, + 0x077405d6, + 0x071f0707, + 0x0531272d, + 0xff6b7efc, + 0x73b10596, + 0x4d3b4127, + 0x73b5340b, + 0xf78ef043, + 0xb007fb4e, + 0xf0931327, + 0xbe0041a4, + 0x110009f7, + 0xb1f093b1, + 0xecbe0041, + 0xb1210009, + 0x41b8f093, + 0x09e1be00, + 0x93b10100, + 0x0041bff0, + 0x0009d6be, + 0xf093b231, + 0x270041c6, + 0x09c9be10, + 0x03db0700, + 0x31c127d4, + 0x931c07d2, + 0x0041b1f0, + 0xb4bec103, + 0xd4030009, + 0xec0fccc4, + 0xfb0e0b07, + 0x00fc675e, + 0x00001000, + 0x08000000, + 0x0000000f, + 0x07c1f54e, + 0x3c0dc138, + 0x07240a99, + 0x27c107b0, + 0x27502780, + 0xddfc0c6c, + 0x00a41000, + 0x4d034d07, + 0xc4ea2000, + 0x3c27009a, + 0x2b06071b, + 0x27010336, + 0x3b4d0722, + 0x0b405b20, + 0x5b41dc2d, + 0x2755f3f0, + 0x4a3b0f4c, + 0xf4139487, + 0x134e01b0, + 0x4201aff4, + 0x2b0b2247, + 0xb3012149, + 0x490b4187, + 0x3707430b, + 0x11033d0b, + 0x3a074305, + 0x3703214d, + 0x030ade0b, + 0x18025127, + 0x41278107, + 0x42234a3b, + 0x5936841a, + 0xa194dcca, + 0x3cb3c1b4, + 0x2b3cbcc5, + 0xa54c0b43, + 0xc2f58eb4, + 0x2007982c, + 0x070c2c23, + 0x274a3b42, + 0x3b9487e1, + 0x07aa1ee0, + 0x7e0b0713, + 0x1007fbae, + 0x7d7e0b07, + 0x24ba99fe, + 0xff5cdcea, + 0xf453c61e, + 0x4e01ff34, + 0x20270607, + 0x851e9027, + 0x02c1fa4e, + 0x4003c13c, + 0x04a1d107, + 0x0fffdd03, + 0x0fffdde3, + 0xb007322b, + 0x00c1d42b, + 0xd634d638, + 0x07fa8ed7, + 0x503dcaad, + 0xc20bca07, + 0x44be1c07, + 0x0b07000c, + 0xfd7e1c07, + 0xc6da2bfe, + 0xffdf03d0, + 0x0703ffff, + 0x00cf83cd, + 0x03fc0000, + 0x000001df, + 0x071c07fc, + 0x2720270d, + 0x4cbe163c, + 0x3ea7000c, + 0xc5fffbf3, + 0x40273830, + 0x0b071d07, + 0xc5403cc5, + 0xfa0e3c34, + 0x07febf5e, + 0x0bca07a3, + 0xbe1c07c2, + 0x07000bf3, + 0x7e1c070b, + 0xda2bfeac, + 0xfa4eae1e, + 0x07310499, + 0x07a207d0, + 0x56c107b3, + 0x0cb2c04f, + 0x6e7e0a07, + 0x5d0fc6fd, + 0x475ab3c0, + 0x144c234c, + 0x0b24d199, + 0x3b31274d, + 0x23420931, + 0x2932c231, + 0x41273c07, + 0xd1a1433b, + 0x31233407, + 0x13eb130b, + 0x0d07140b, + 0x89ff2b7e, + 0x0d0732d4, + 0x1c074103, + 0x0e32d48d, + 0xfaa85efa, + 0x47034107, + 0x071ac4c2, + 0x1e31033c, + 0xfb2f7ece, + 0x402706d6, + 0xc431d49d, + 0xa81e9fb2, + 0xfa8e0027, + 0x38033107, + 0x0d07b51e, + 0x7b7e1c07, + 0x9d4027fa, + 0x0fc631d4, + 0x4efa8e81, + 0x07d207fa, + 0xb6b107a0, + 0xa7fa8e27, + 0xfffbf3ce, + 0x2724c099, + 0x03222710, + 0x1d31be07, + 0x07100703, + 0xfd227e0c, + 0x1a073d07, + 0x0ea72b07, + 0x7efffbf3, + 0x0fd6fcd1, + 0x9b4027d7, + 0xfa8e0ef4, + 0x04a1fb4e, + 0xd007f063, + 0x14ceb107, + 0x1001992c, + 0xc15bcb07, + 0xcc87c183, + 0xc461cd0b, + 0x0f072127, + 0xa03ef405, + 0xa110d199, + 0x3b4127d2, + 0x27242b41, + 0xa5c36530, + 0xd9b2ced2, + 0xfb8ef043, + 0xcf5bf04e, + 0xfe2bdf3b, + 0x0f07fc4e, + 0xfff9e5be, + 0xf00efc0e, + 0xf04eff0b, + 0xdf3bcf5b, + 0xfc4efe2b, + 0x0dbe0f07, + 0xff1efffd, + 0xb007fb4e, + 0xff9046be, + 0x1007d007, + 0x3f1af093, + 0x06f9be00, + 0x27d74600, + 0x010b1ec0, + 0xbec103d2, + 0x030006eb, + 0x931c07d4, + 0x003f0cf0, + 0x8eedcbda, + 0x1eff1efb, + 0x1e0499ff, + 0x4cc00107, + 0x348718ff, + 0x340b4433, + 0x018c34f1, + 0x4ea3ff00, + 0xf5040000, + 0x00018c34, + 0xff2ea7ff, + 0x4d27fddf, + 0x24d50800, + 0x10270208, + 0x020821d5, + 0x4fff3ea7, + 0x073211fd, + 0x33408730, + 0xf5430b36, + 0x000bc442, + 0xfd4227ff, + 0x000b9804, + 0xff2ea7ff, + 0x4127ffff, + 0x046824bd, + 0x9b0f2399, + 0x41270ef1, + 0x34f53387, + 0xff02b040, + 0xfb4efe0b, + 0x1427b007, + 0x3ea2f093, + 0x065dbe00, + 0x93b11100, + 0x003eaff0, + 0x000652be, + 0xf093b121, + 0xbe003eb6, + 0x01000647, + 0xbdf093b1, + 0x3cbe003e, + 0xb2310006, + 0x3ec4f093, + 0xbe102700, + 0x0700062f, + 0x27d403db, + 0x07d231c1, + 0xaff0931c, + 0xc103003e, + 0x00061abe, + 0xccc4d403, + 0x0b07ec0f, + 0x345efb0e, + 0x5bf04eff, + 0x2bdf3bcf, + 0x07fc4efe, + 0xff23be0f, + 0x0efc0eff, + 0x4eff0bf0, + 0x3bcf5bf0, + 0x4efe2bdf, + 0xbe0f07fc, + 0x1effff7e, + 0x1e2103ff, + 0x19031918, + 0x03010314, + 0x0d34ce11, + 0x11230123, + 0x14190019, + 0xfe0b042b, + 0x0027f230, + 0xfe4efe0b, + 0x40ab4107, + 0x43d83007, + 0x01151e0f, + 0x0524231e, + 0x0314033e, + 0x07071e34, + 0x03425342, + 0x86f45841, + 0x03141925, + 0x03341d11, + 0x8ef2a831, + 0x07fd4efe, + 0x2903dce0, + 0x072624d0, + 0x073f6b31, + 0xab483343, + 0x07320743, + 0x533423e4, + 0x10ec3332, + 0x3103e4ab, + 0x4e054007, + 0x44032423, + 0xe407f3b8, + 0x40272103, + 0x311d031e, + 0x340b3e07, + 0xf2a84103, + 0x3007fd8e, + 0x01030419, + 0x032b4396, + 0xfb4efe0b, + 0xeea7f063, + 0x05fd4fff, + 0x07c007f2, + 0x01b307d1, + 0x123f9be4, + 0x44334103, + 0xab38e2c1, + 0x1023ce34, + 0xffe30ea7, + 0x09cbbeff, + 0xe8101e00, + 0xa7061ef3, + 0xffffe32e, + 0x36272401, + 0xf1294276, + 0x1303d409, + 0x12732407, + 0x03fc4d10, + 0x0107ff1e, + 0xc4090103, + 0x322b3407, + 0x03fc4d10, + 0x310cff1e, + 0x03fc3d03, + 0x87ec30da, + 0x104c0342, + 0x4d0bf301, + 0x21034305, + 0x03fc2d04, + 0x01072027, + 0x01033b07, + 0x3401111e, + 0x14052103, + 0x2d103403, + 0x2d2303fc, + 0x128703fc, + 0x0b101c03, + 0x0df0301d, + 0xe30ea7d2, + 0x0401ffff, + 0x2bbe44c6, + 0x40270009, + 0x270ef49b, + 0xff4ea731, + 0xf043fd4f, + 0xfb8e43a5, + 0xf005f063, + 0x20073107, + 0xe0001f27, + 0x0f271007, + 0x1007d000, + 0x2f5ef043, + 0x05f063ff, + 0x073107f0, + 0x001f2720, + 0x271007c0, + 0x07b0000f, + 0x5ef04310, + 0x0409ff16, + 0xf40df063, + 0x30070449, + 0xf201f42d, + 0x0f273803, + 0x10079000, + 0xa0001f27, + 0xf0431007, + 0x4efef55e, + 0x07a007fa, + 0xbeb10701, + 0x07fffede, + 0x21fc9330, + 0x350303d2, + 0x0c072307, + 0x07da4d27, + 0x24231b07, + 0x050c0c03, + 0x15ca25c4, + 0xfe4cbec3, + 0x3e0c07ff, + 0x29ff1eae, + 0x10142903, + 0x1e03fc3d, + 0xfc4d10ff, + 0x07ff1e03, + 0x0c042b03, + 0xfc0d0300, + 0x27fe0b03, + 0x0790004f, + 0x6b442910, + 0x1034070f, + 0x2303fc4d, + 0x2703fc3d, + 0x07b0004f, + 0x93442910, + 0x050c2bf2, + 0x3407230d, + 0x03fc4d10, + 0x03fc3d23, + 0xd0004f27, + 0x44291007, + 0x4d10234d, + 0x4d2303fc, + 0x248d03fc, + 0x270ba608, + 0x07a0004f, + 0x07442910, + 0xfc4d1034, + 0xfc3d2303, + 0x004f2703, + 0x291007c0, + 0x07232d44, + 0xfc4d1034, + 0xfc3d2303, + 0x004f2703, + 0x291007e0, + 0x10236d44, + 0x2303fc4d, + 0x8d03fc4d, + 0xfe0b0a24, + 0xf493f84e, + 0x09050bc4, + 0x07422943, + 0x0c322b90, + 0xfc3d0330, + 0x2734d603, + 0x87f88e00, + 0x124de942, + 0x07100790, + 0x07d303a3, + 0x23c207bd, + 0x03b273a1, + 0xe9d323c1, + 0x07901048, + 0x0dbad210, + 0xf1930827, + 0x7e003bdc, + 0xba07feeb, + 0x9d159805, + 0x27c5dc50, + 0x11f19308, + 0xd87e003c, + 0x07b806fe, + 0x07080309, + 0xfccd103b, + 0xfccd2303, + 0xf14c8703, + 0x07901044, + 0x05c10310, + 0x38040304, + 0xfccd10f3, + 0xfccd2303, + 0x45f39303, + 0x3c2d050b, + 0xa0003f27, + 0x01271007, + 0xf88e3c2d, + 0xf493f74e, + 0x49050b30, + 0x07426943, + 0x07322b90, + 0x03300c71, + 0xd603fc3d, + 0x8e002734, + 0xe94287f7, + 0x07b0124c, + 0x03a30710, + 0x078c07c3, + 0x73a123b2, + 0x23b10382, + 0x104de9c3, + 0xd21007b0, + 0x08270d8a, + 0x3b46f193, + 0xfe557e00, + 0x9c2d8a07, + 0x94299d0d, + 0x0bb9dd24, + 0x74484cc4, + 0xdd24141e, + 0x4cc40bba, + 0x0a1e6a28, + 0x0bbbdd00, + 0x0bbcddc4, + 0x5094295f, + 0x0827f94c, + 0x3b75f193, + 0xfe217e00, + 0x37079029, + 0x0123070b, + 0xe37f3ce3, + 0x34197f0c, + 0xc2803c03, + 0x87c6f930, + 0x38071707, + 0x03fcbd10, + 0x03fcbd23, + 0x44f14b87, + 0x1007b010, + 0x1405b103, + 0xf3381403, + 0x03fcbd10, + 0x03fcbd23, + 0x0a7af393, + 0x273b6d05, + 0x07c0003f, + 0x2d012710, + 0x27f78e3b, + 0x36f19306, + 0xc87e003b, + 0xa7971efd, + 0xfd4fff2e, + 0x3f9b2401, + 0x33410312, + 0x3822c144, + 0x002734ab, + 0x0127320e, + 0xf0e3fe0b, + 0xf315f205, + 0xfa4ef425, + 0xffff3ea7, + 0xdc34a9ff, + 0x07f0630f, + 0xe6a107d0, + 0xfa00ad4f, + 0xd100a940, + 0xe60fd834, + 0x3e00a14f, + 0x9b07e6bb, + 0x4ea7122f, + 0x01fd4fff, + 0xe71ea743, + 0x3433ffff, + 0x43d61401, + 0x32ab38a3, + 0x0a1e1305, + 0xffe70ea7, + 0x063fbeff, + 0x00cf2700, + 0xc1101000, + 0x4ea744cb, + 0xd1ffffff, + 0xa70fd840, + 0xfd4fff4e, + 0x3b074401, + 0x030b3733, + 0x1d304c03, + 0x124f9b04, + 0xc530ddf9, + 0x4c030000, + 0x07043d30, + 0x204c273f, + 0x047d0d5d, + 0x03183c03, + 0x272a0704, + 0xf3057b1c, + 0x001087be, + 0x07a6d007, + 0x0748c4c1, + 0xc541033b, + 0xc4c148c4, + 0x10310348, + 0x270fff3d, + 0x44c3c530, + 0xa744c4c1, + 0xffffe70e, + 0x0005a9be, + 0xd027031e, + 0xf0430d07, + 0xf0c3fa0e, + 0xfa4efe0b, + 0xc3073401, + 0xa207b107, + 0xffff4fc4, + 0x0727ffff, + 0x012d2710, + 0x27022706, + 0xbe01a43d, + 0x07ff8a2a, + 0x1000ccd0, + 0x01060d27, + 0xff8a1dbe, + 0xd2d2f493, + 0x05400503, + 0xc0c101cd, + 0xffffff1f, + 0x2b071dff, + 0x05273a07, + 0xff8a01be, + 0x271000cc, + 0xbe01060d, + 0x93ff89f6, + 0x03d2abf4, + 0xfa8e4005, + 0xb6befe4e, + 0x2f270007, + 0x1007f000, + 0x04e33d27, + 0x4307051e, + 0x2401f4e8, + 0x0ef842c4, + 0x07bd9efe, + 0x27fb4e00, + 0x0efb9bb0, + 0xf000cf27, + 0x31271007, + 0x4027c305, + 0xa70ef49b, + 0xfd4fff4e, + 0xc13e43a5, + 0xcb05c031, + 0xfb4efb8e, + 0xfc9bc027, + 0x00bf270e, + 0x271007f0, + 0x27b30531, + 0x0ef49b40, + 0x4fff4ea7, + 0x3e43a5fd, + 0x8ebc059c, + 0xa7fe4efb, + 0xffffe70e, + 0x0004c3be, + 0x4f273027, + 0x1007f000, + 0xfe8e4305, + 0x307efe4e, + 0x9b07e6fe, + 0x4ea7122f, + 0x01fd4fff, + 0xe71ea743, + 0x3433ffff, + 0x43d61401, + 0x32ab38a3, + 0xfe8e1305, + 0xffe70ea7, + 0x9efe0eff, + 0x230004b1, + 0x15f105f1, + 0x35f325f2, + 0xa7fb4ef4, + 0xd07fff4e, + 0xf0634491, + 0x4cf8b007, + 0xab008b10, + 0xfde57efd, + 0x2f9b07e6, + 0xff4ea712, + 0x4301fd4f, + 0xffe71ea7, + 0x013433ff, + 0xa343d614, + 0x0532ab38, + 0xa70a1e13, + 0xffffe70e, + 0x000468be, + 0x4fff4ea7, + 0x274401fd, + 0x07f000cf, + 0x304c0310, + 0x9d203c27, + 0xc39d0cc4, + 0x124f9b0d, + 0x030fc39d, + 0x3f07304c, + 0x07143c03, + 0xf01d272b, + 0x0ec49d03, + 0xf0100f27, + 0xf3051007, + 0x000ebfbe, + 0xc4154127, + 0xf00c0f27, + 0x1fbe1007, + 0x0103fffa, + 0xff7ec025, + 0xe70ea7fe, + 0xebbeffff, + 0xfdeb0003, + 0xfb0ef043, + 0xfe0bf103, + 0x4f27f84e, + 0x10100000, + 0x48c14a01, + 0x4449c140, + 0x2a484cc1, + 0x1edc07ca, + 0x23dc0705, + 0xffbea7d1, + 0xb4d1ffff, + 0xda2b0fd8, + 0xf0934556, + 0x7e003882, + 0xb1d1ff23, + 0xf0930fd8, + 0x7e00389c, + 0x8fc4ff17, + 0x11223356, + 0xff9dd457, + 0xde26520f, + 0x3c072907, + 0xf0931807, + 0x070038a2, + 0x7e9b074a, + 0xca07fef7, + 0x1f1ebd07, + 0x00155fbe, + 0x0fd894d1, + 0x27332007, + 0x2419240b, + 0x1c074586, + 0x38aef093, + 0xfed57e00, + 0xb123c103, + 0x1d270c07, + 0xbfc40fff, + 0xffffffff, + 0x27da0bd4, + 0x1000004f, + 0x8e4d0510, + 0xff4ea7f8, + 0x44d1ffff, + 0x47c60fd8, + 0x00004f27, + 0x41011010, + 0x42014403, + 0x43014403, + 0x44014403, + 0x3874f093, + 0xfe915e00, + 0xf54efe0b, + 0xf5634207, + 0xa2074013, + 0x80076107, + 0x91075247, + 0xf4c57027, + 0x09351e50, + 0xbed103b3, + 0x0b000fb3, + 0x07b203c0, + 0x501c270c, + 0x386ef293, + 0xcead0e00, + 0x4027e6d9, + 0x1707c41d, + 0x3864f093, + 0x7e2f0700, + 0xf4c1fe4b, + 0x0b7a0b50, + 0xc2850b94, + 0xb8070967, + 0xcf07d027, + 0xf543ce1e, + 0xf54ef58e, + 0xf5236207, + 0x92077107, + 0x60135007, + 0x8027a107, + 0xb319301e, + 0x5cbed103, + 0xc00b000f, + 0x0c07b103, + 0x93501c27, + 0x003825f2, + 0xdace9d0e, + 0x074027e6, + 0x93c41d18, + 0x00380df0, + 0xf47e2f07, + 0x0b890bfd, + 0x0b78c2a6, + 0xb50bb807, + 0xcf07d027, + 0xf503d11e, + 0xf94ef58e, + 0xd107b007, + 0x9307a207, + 0xd47efcab, + 0x9b07e6fb, + 0x4ea7122f, + 0x01fd4fff, + 0xe71ea743, + 0x3433ffff, + 0x43d61401, + 0x32ab38a3, + 0x0a1e1305, + 0xffe70ea7, + 0x0257beff, + 0x004f2700, + 0x271007f0, + 0x03431532, + 0x254d453a, + 0x144a9d43, + 0x3515499d, + 0xfcff7e4b, + 0x0ea7d007, + 0xbeffffe7, + 0xeb00020e, + 0x07d5c6fc, + 0x020d272b, + 0xbe1d0702, + 0x07ff86ae, + 0x4ef98e0d, + 0x07c007fb, + 0x7efdabb1, + 0x07e6fb67, + 0xa7122f9b, + 0xfd4fff4e, + 0x1ea74301, + 0x33ffffe7, + 0xd6140134, + 0xab38a343, + 0x1e130532, + 0xe70ea70a, + 0xeabeffff, + 0x3f270001, + 0x1007f000, + 0x34154327, + 0x3c354827, + 0x3b453425, + 0x07fc987e, + 0xe70ea7c0, + 0xa7beffff, + 0xfdeb0001, + 0xfb8e0c07, + 0xd007fc4e, + 0xfcab0d66, + 0xe6fb0e7e, + 0x122f9b07, + 0x4fff4ea7, + 0xa74301fd, + 0xffffe71e, + 0x14013433, + 0x38a343d6, + 0x130532ab, + 0x0ea70a1e, + 0xbeffffe7, + 0x27000191, + 0x07f0004f, + 0x15342710, + 0x35432543, + 0xfc687e4d, + 0xffe70ea7, + 0x0154beff, + 0x8efceb00, + 0x23fc4efc, + 0x07d107f1, + 0xe3f193c0, + 0x0f070036, + 0xbe102c27, + 0xf6fff6ee, + 0x70fd93d4, + 0x0d07003d, + 0xfff751be, + 0xcbe6f393, + 0x27200703, + 0x0707da4d, + 0x140c03e3, + 0x30153405, + 0x21033c25, + 0x070cec03, + 0x0143273f, + 0x05340331, + 0xa8e403e1, + 0x093459f4, + 0x931d0733, + 0x03cbd2f0, + 0xe30de45d, + 0xfff6a5be, + 0xcbaaf093, + 0xf804be03, + 0x4eff1eff, + 0xff4ea7fc, + 0x44b9ffff, + 0xd0070fb4, + 0x45e6c107, + 0x3680f093, + 0x071d0700, + 0xfc3dbe2c, + 0x070d07ff, + 0xfec9be1c, + 0x270596ff, + 0x87f19302, + 0x665e0036, + 0x4efc8eff, + 0xff8ea7f8, + 0x84b9ffff, + 0x90070fb4, + 0xa207b107, + 0x4666d307, + 0x3677f093, + 0x07190700, + 0x073a072b, + 0xfc01be4d, + 0x14cd07ff, + 0x07c227d2, + 0x071b0709, + 0xbe3c072a, + 0xb9fffe12, + 0x070fb484, + 0x9345a6d0, + 0x00367ff0, + 0xdcbe1d07, + 0xd576fffb, + 0xf1930227, + 0x1e003687, + 0x3b412712, + 0x8b41234c, + 0x2745864d, + 0x82f19301, + 0xfa5e0036, + 0x50a796fe, + 0x000000df, + 0x0b4d0720, + 0x014fd04b, + 0x23700000, + 0xf1930127, + 0x1e00368a, + 0x00df50e2, + 0x07700000, + 0x504b0b4d, + 0x0000014f, + 0x930127f0, + 0x0036a0f1, + 0x0d07c91e, + 0x3c27f88e, + 0xff595e0c, + 0x04054027, + 0x4027fe0b, + 0x050ef49b, + 0x01fe0b04, + 0x123f9b02, + 0x4fff4ea7, + 0x274401fd, + 0xa3443300, + 0x0e43ab48, + 0x0b012742, + 0x07fa4efe, + 0x123f9bc0, + 0x4fff4ea7, + 0x074d01fd, + 0xa3d433a4, + 0x1ed3abd8, + 0x01f4e803, + 0x564627cb, + 0x1218beb3, + 0x27c40100, + 0x05449630, + 0x0ef39bcd, + 0x0138abc5, + 0xe4d4cec4, + 0x3027fa8e, + 0xffff4ea7, + 0x3843d5fe, + 0x9bfe0b01, + 0x2407124f, + 0x25333487, + 0x21f1232b, + 0xff010014, + 0x03103f9b, + 0x87310b41, + 0xf5453314, + 0x01001423, + 0xa7412bff, + 0xfd4fff3e, + 0x44f13311, + 0xff010000, + 0x342b1207, + 0x002023f5, + 0x1e23ff01, + 0x23fefff4, + 0xfeff682e, + 0x13014727, + 0x23051403, + 0xf4a82403, + 0x4ea7fe0b, + 0xa7fd4fff, + 0xfeffff3e, + 0x44914181, + 0x012832d1, + 0x013030d1, + 0x43331333, + 0x041b211b, + 0x013034d5, + 0x012432d5, + 0x012831d5, + 0x012c30d5, + 0xfe0bfe0b, + 0xf493fe0b, + 0x7503cc48, + 0x07fe0b40, + 0x87453340, + 0xf5402b00, + 0x01000c41, + 0xa841f5ff, + 0x0b00045b, + 0x334007fe, + 0x2b008745, + 0x1041f540, + 0xf5ff0100, + 0x045bac41, + 0x87fe0b00, + 0x2b053340, + 0x680e2304, + 0xfe0bfeff, + 0xcc27fc4e, + 0xa72c078c, + 0xfefff31e, + 0xcad2f093, + 0xf470be03, + 0xa72c07ff, + 0xfeff671e, + 0xcb4ef093, + 0xf460be03, + 0xd1f093ff, + 0x1ea703cb, + 0x27fefedb, + 0xfc0e102c, + 0xfff44d9e, + 0xf493fe4e, + 0x1903caa0, + 0xa24ff644, + 0x99f49300, + 0x240703ca, + 0x078b2c03, + 0x7f2ce334, + 0x197f3ce3, + 0x803c0334, + 0x93f932c2, + 0x03ca7ff3, + 0x4c272027, + 0x03320523, + 0x93f4c834, + 0x03cafbf4, + 0x2c032407, + 0xe334078b, + 0x3ce37f2c, + 0x0334197f, + 0x32c2803c, + 0x233c27f9, + 0xcadef293, + 0x07102703, + 0x23210543, + 0xb8240331, + 0x59f493f4, + 0x433503cb, + 0x43154305, + 0x20274325, + 0xcb5af393, + 0x054a2703, + 0xc8340332, + 0x273027f4, + 0xf5402725, + 0x045c3834, + 0xa834f500, + 0xf500045b, + 0x045bac34, + 0x3434f500, + 0x0300045c, + 0xf2001c3c, + 0xf4933127, + 0x1d03c9fc, + 0x85f19343, + 0x2c2703ca, + 0x670ea78c, + 0x8fbefeff, + 0xf193fff3, + 0x2703c9e8, + 0x0ea78c2c, + 0xbefefff3, + 0x93fff37e, + 0x03caeff1, + 0xa7102c27, + 0xfefedb0e, + 0xfff36dbe, + 0x6f5efe0e, + 0xff4ea7fe, + 0x4311fd4f, + 0xffff4ea7, + 0x3443d5fe, + 0xa7fe0b01, + 0xfeffff3e, + 0x4fff4ea7, + 0xd14111fd, + 0xd1013834, + 0x0b013432, + 0xd5422b41, + 0x0b013834, + 0x124f9bfe, + 0x35333407, + 0x342b4487, + 0x4fff4ea7, + 0xf14211fd, + 0x01002434, + 0xf5422bff, + 0x01002434, + 0x9bfe0bff, + 0x2407124f, + 0x44872533, + 0x4ea7242b, + 0x11fd4fff, + 0x2423f144, + 0x0bff0100, + 0x2424f543, + 0x0bff0100, + 0x75f293fe, + 0x3ea703ca, + 0x27feff67, + 0x03310147, + 0x03210534, + 0xa7f4a824, + 0xfeffff4e, + 0x013844d1, + 0xca56f393, + 0x27349503, + 0x0332014a, + 0x03020534, + 0x0bf4a804, + 0xff3ea7fe, + 0x309dffff, + 0xbd41270d, + 0x99046a34, + 0x40270f33, + 0x270ef49b, + 0xf5338741, + 0x02b04034, + 0x4eff1eff, + 0xbec007fc, + 0x39000f14, + 0x07c419c3, + 0x1d43ab13, + 0x3d4027c4, + 0x2705e6c4, + 0x0ef49b40, + 0x4fff3ea7, + 0x3834c5fd, + 0xf49b4027, + 0xff4ea70e, + 0x4399ffff, + 0xbf2ea70e, + 0x318bfd4f, + 0x41273138, + 0x31532405, + 0x32d62403, + 0xfc4efc8e, + 0xf7bec007, + 0x1ea7000e, + 0x39fd4fff, + 0x271301c2, + 0xab433b41, + 0x27c43d42, + 0x0ef49b40, + 0x8e3814c5, + 0x07fc4efc, + 0x0ed4bec0, + 0xff1ea700, + 0xc319fd4f, + 0x41271201, + 0x34eb423b, + 0x4027c31d, + 0xc50ef49b, + 0xfc8e3814, + 0xc007fb4e, + 0x85beb107, + 0xc219000e, + 0x2bab4027, + 0xc43dc21d, + 0x402705e6, + 0xa70ef49b, + 0xfd4fff3e, + 0x273834c5, + 0x0ef49b40, + 0xffff4ea7, + 0x0e4399ff, + 0x4fbf1ea7, + 0x38328bfd, + 0x05412731, + 0x03315314, + 0x8e32d614, + 0x0d0499fb, + 0x070c0399, + 0x0744c623, + 0x99041e34, + 0x43070e03, + 0x400b4123, + 0x99044499, + 0x45960e00, + 0x3028321b, + 0xfe0b0307, + 0xfe0b030b, + 0xb027fb4e, + 0x0b9dc007, + 0x0ec19d0c, + 0x0b9d2107, + 0x0310270d, + 0xf1b7be04, + 0x3dcb1dff, + 0x03cb5dcb, + 0x8ecb3dc2, + 0x07fc4efb, + 0xfbcc27d0, + 0x38be0d07, + 0x004c004b, + 0xf4e84c07, + 0xfc8ef31e, + 0xd007fc4e, + 0x07fbcc27, + 0x4b21be0d, + 0x07004c00, + 0x1ef4e84c, + 0x6bfc8ef3, + 0x9315361f, + 0x00324af0, + 0x4087fe0b, + 0xd50040f1, + 0x04860000, + 0xf0931434, + 0x0b0037bb, + 0x0b4187fe, + 0x104c2340, + 0xfe0b4001, + 0x0087f74e, + 0xd51c0af1, + 0x0bf10000, + 0x0000d500, + 0xf093c107, + 0x0700321f, + 0x2772071a, + 0xf6c5be90, + 0x1e8027ff, + 0x03cd011c, + 0x66c40391, + 0x93b201d6, + 0x003212f0, + 0x3d071a07, + 0xfff6aabe, + 0xb4038d0b, + 0x07e397ce, + 0x9328071a, + 0x003209f0, + 0x949ef70e, + 0xfa4efff6, + 0x23082a99, + 0x87d207f1, + 0xf1ac8631, + 0x00d50033, + 0x34348600, + 0x40f393a4, + 0x0a1e0037, + 0x430b4a87, + 0x01104c23, + 0x09de9943, + 0xdb69dc49, + 0xfe054187, + 0xfb25fc15, + 0xd51c42f1, + 0xdd010000, + 0x4a071007, + 0x31d7f093, + 0xbefd3500, + 0x1efff647, + 0x09249922, + 0xde492c69, + 0xd51c32f1, + 0x10070000, + 0x322cf393, + 0xf2f09300, + 0xfe050031, + 0x24befc15, + 0xf103fff6, + 0xfc4efa8e, + 0xffffcea7, + 0x63c101f7, + 0x1bf093f0, + 0x0cbe0032, + 0xc121fff6, + 0x322ef093, + 0xf601be00, + 0x48c1c1ff, + 0x3240f093, + 0xf5f5be00, + 0x44c1c1ff, + 0x3252f093, + 0xf5e9be00, + 0xffcea7ff, + 0xc181efff, + 0x3260f093, + 0xf5d9be00, + 0x93c1a1ff, + 0x003273f0, + 0xfff5cebe, + 0xffffcea7, + 0x93c121eb, + 0x003281f0, + 0xfff5bebe, + 0x9364c1c1, + 0x003293f0, + 0xfff5b2be, + 0xffffcea7, + 0x93c101e7, + 0x0032a1f0, + 0xfff5a2be, + 0x9350c1c1, + 0x0032b3f0, + 0xfff596be, + 0xf093c121, + 0xbe0032c6, + 0xc1fff58b, + 0xf09354c1, + 0xbe0032d8, + 0xc1fff57f, + 0xf09358c1, + 0xbe0032ea, + 0xc1fff573, + 0xf0935cc1, + 0xbe0032fc, + 0xa7fff567, + 0xfbffffce, + 0x0628c1d1, + 0x3308f093, + 0xf555be00, + 0x30c1d1ff, + 0x22f09301, + 0x48be0033, + 0xc1d1fff5, + 0xf0930208, + 0xbe00333c, + 0xd1fff53b, + 0x930420c1, + 0x003356f0, + 0xfff52ebe, + 0x0468c1d1, + 0x3370f093, + 0xf521be00, + 0xff4ea7ff, + 0x41c1f3ff, + 0x86f09334, + 0x10be0033, + 0xcea7fff5, + 0x31fddfff, + 0x94f093c1, + 0x00be0033, + 0xc1c1fff5, + 0x4cc2c148, + 0xc16cc3c1, + 0xcec170c4, + 0x9af09340, + 0xfe050033, + 0xfff4e6be, + 0xffffcea7, + 0x48c1d1fe, + 0x48c2d101, + 0xb9f09301, + 0x22870033, + 0xd4f02f03, + 0xc8be0000, + 0xc1b9fff4, + 0xf0930140, + 0xbe0033c5, + 0x99fff4bb, + 0xf09309c1, + 0xbe0033d5, + 0xb9fff4af, + 0x9319c1c1, + 0x0033e4f0, + 0xfff4a2be, + 0x0144c1a9, + 0x33f3f093, + 0xf495be00, + 0x42c1a9ff, + 0x0ef09301, + 0x88be0034, + 0x4ea7fff4, + 0xd1fdefff, + 0x930f0041, + 0x00341ff0, + 0xfff476be, + 0x0005d1be, + 0x4fff4ea7, + 0x114c01fd, + 0x931c0742, + 0x003425f0, + 0xfff45ebe, + 0x10270c07, + 0xe68b2ea7, + 0xfdc07efe, + 0x11270c07, + 0xe67f2ea7, + 0xfdb47efe, + 0x13270c07, + 0xe6672ea7, + 0xfda87efe, + 0x14270c07, + 0xe65b2ea7, + 0xfd9c7efe, + 0x15270c07, + 0xe64f2ea7, + 0xfd907efe, + 0xffffcea7, + 0x90c1d1ff, + 0x98c2d10f, + 0x94c3d10f, + 0xa4c4d10f, + 0xf9f0930f, + 0x04be0033, + 0xc2d1fff4, + 0xc1d10fa0, + 0xf0930f9c, + 0x4300340a, + 0x9efc0ef0, + 0x4efff3ef, + 0xffbea7f8, + 0xb1c1fd4f, + 0x93f1236c, + 0x003404f0, + 0xfff3dabe, + 0x000628be, + 0xf0931007, + 0xa700341c, + 0xffffffce, + 0xfff3c6be, + 0x9311c199, + 0x003432f0, + 0xfff3babe, + 0xb211ba01, + 0xf0931a07, + 0xbe00344a, + 0x07fff3ab, + 0xa716270a, + 0xfff0572e, + 0xa7fd0d7e, + 0xfffffb0e, + 0x01030919, + 0x4ea70a19, + 0x03fffffe, + 0x19421901, + 0x0341030b, + 0x190e1901, + 0x19410343, + 0x93c11944, + 0x00343ff0, + 0xf905fe35, + 0xfb25fa15, + 0xfff36abe, + 0x930fc199, + 0x00346ef0, + 0xfff35ebe, + 0x9310c199, + 0x003489f0, + 0xfff352be, + 0x0468c2d1, + 0x046cc3d1, + 0x0464c1d1, + 0x349bf093, + 0xf33dbe00, + 0x50c1d1ff, + 0xc1f09304, + 0x30be0034, + 0xc1d1fff3, + 0xf0930458, + 0xbe0034db, + 0xd1fff323, + 0x93045cc1, + 0x0034f5f0, + 0xfff316be, + 0x9327c199, + 0x003510f0, + 0xfff30abe, + 0x9326c199, + 0x00352bf0, + 0xfff2febe, + 0x0c2cc1d1, + 0x3545f093, + 0xf2f1be00, + 0x02c1a9ff, + 0x5ff09301, + 0x1c830035, + 0xf2e1be0f, + 0x08c1b9ff, + 0x76f09301, + 0xd4be0035, + 0xc1b9fff2, + 0xf0930109, + 0xbe003590, + 0xa9fff2c7, + 0x93010ac1, + 0x0035aaf0, + 0xfff2babe, + 0x1198c1b9, + 0x35c4f093, + 0xf2adbe00, + 0x99c1b9ff, + 0xdef09311, + 0xcea70035, + 0xbefff01f, + 0xb9fff29b, + 0x9301b4c1, + 0x0035f3f0, + 0xfff28ebe, + 0x9340c199, + 0x00360cf0, + 0x80be8c07, + 0xc027fff2, + 0x14f9661e, + 0xff001144, + 0x115430f1, + 0x32f1ff00, + 0xff001034, + 0x107433f1, + 0x42d8ff00, + 0x2bb30749, + 0xcad027b2, + 0xb0070923, + 0xb22bb103, + 0x4187d307, + 0x115443f1, + 0xeb07ff00, + 0xed0b3103, + 0x107449f1, + 0x42f1ff00, + 0xff000fe0, + 0x35dcf093, + 0x3444f100, + 0x27ff0010, + 0x27e30ea0, + 0x053a07a1, + 0x25fb15f9, + 0xf219befd, + 0x07c103ff, + 0x4084991c, + 0x31871f6b, + 0xa79014ca, + 0xffffffce, + 0x0c46c1b9, + 0x35f7f093, + 0xf1f9be00, + 0x47c1b9ff, + 0x11f0930c, + 0xecbe0036, + 0xc1b9fff1, + 0xf0930c44, + 0xbe00362b, + 0x93fff1df, + 0x003649f0, + 0xfff1d6be, + 0x930cc199, + 0x00364ef0, + 0xfff1cabe, + 0x932ac199, + 0x003669f0, + 0xfff1bebe, + 0x9312c199, + 0x003684f0, + 0xfff1b2be, + 0x9344c199, + 0x00369ff0, + 0xfff1a6be, + 0x933cc1c1, + 0x0036baf0, + 0xfff19abe, + 0x9340c1c1, + 0x0036d5f0, + 0xfff18ebe, + 0x0454c1d1, + 0x36eff093, + 0xf181be00, + 0x0df093ff, + 0x78be0037, + 0x0ea7fff1, + 0xbefffd33, + 0x07fff9e5, + 0x0df09310, + 0x64be0037, + 0x0ea7fff1, + 0xbefffce3, + 0x07fff9d1, + 0x28f09310, + 0x50be0037, + 0xc027fff1, + 0x43334c07, + 0x011042f1, + 0x1c07ff00, + 0x3740f093, + 0xbec10300, + 0xc4fff137, + 0xa7e610cc, + 0xfeffff4e, + 0x93094b99, + 0x003745f0, + 0xcb07b383, + 0xc4334b87, + 0xc1f9c42b, + 0xff000050, + 0xffb8ce23, + 0xf10dbeff, + 0x39c403ff, + 0x4bf093c1, + 0x00be0037, + 0xc159fff1, + 0x3768f093, + 0xf0f5be00, + 0x87b103ff, + 0x2bb4334b, + 0x48b1f1b4, + 0x93ff0000, + 0x003779f0, + 0xf80ef103, + 0xfff0da9e, + 0x04110321, + 0x04014342, + 0x411d430b, + 0x41030421, + 0xfe0b0425, + 0x00000030, + 0xf2e3f54e, + 0x5f079307, + 0xb0273f07, + 0x3a037027, + 0x82074027, + 0x5c036027, + 0x95fb850c, + 0x05f3a5f7, + 0x25f115f0, + 0x01c85ef4, + 0x1c40b7b6, + 0x3e0f0725, + 0x01ba5eb8, + 0x40276807, + 0x61237027, + 0xf485b127, + 0xa95ef795, + 0x301c2301, + 0x4f6b4107, + 0xd4301c03, + 0x7536184a, + 0x27301c24, + 0x47f38531, + 0x0b733347, + 0x301c2374, + 0x855e710b, + 0x6c1ce001, + 0x1cd40180, + 0x1ce0206d, + 0x54010663, + 0x1ce0641c, + 0xe4015a25, + 0x01632d1c, + 0x1cc0261e, + 0x1ce42964, + 0x1e015869, + 0x731ce022, + 0x1c3400f6, + 0x701ce474, + 0x131e0149, + 0x0f751cc0, + 0x3e781ce4, + 0x27081e01, + 0x5ef49541, + 0x9001013c, + 0xc4641c00, + 0xcc0a691c, + 0x00130b00, + 0x071eb127, + 0x2b751cc4, + 0xd007b027, + 0x0d07a027, + 0x5dbe1a27, + 0x00f90006, + 0x0000d538, + 0x4a0b4507, + 0x1a27401d, + 0x4fbe0d07, + 0xd0070006, + 0x07e6a103, + 0xa027dd1e, + 0x4c834007, + 0xf935070f, + 0x00d54444, + 0x1d3a0b00, + 0x03045334, + 0x270176a1, + 0x91c707b0, + 0x2bca2bf3, + 0x813a76cb, + 0x6647a6f4, + 0x270f07b7, + 0xc57e2d1c, + 0x1eb027fe, + 0x96f3810e, + 0x071d0734, + 0xfeb67e0f, + 0xdc27041e, + 0x07c12320, + 0xbdf3534c, + 0x014103fe, + 0xe241cc31, + 0x0f07b546, + 0x7e2d1c27, + 0xda07fe98, + 0xd50bd123, + 0xd139061e, + 0xa1fe8b7e, + 0x07d123f4, + 0xf3d4ce0f, + 0x061edc07, + 0x23fe7b7e, + 0x270f07d1, + 0xd1cc201c, + 0x01591ef4, + 0x03c90791, + 0x7e0f07c4, + 0x9c07fe64, + 0x9d01611e, + 0xb02774d6, + 0x0d070b1e, + 0xffe9d9be, + 0xb02bb707, + 0x34e6f391, + 0x457e171e, + 0x07b123fe, + 0x0741034b, + 0x201c270f, + 0x1ef041cc, + 0xfe327e04, + 0x0f07d419, + 0xd1031407, + 0xdb0742b6, + 0x217e061e, + 0x07d123fe, + 0x201c270f, + 0x03f4d1cc, + 0x07141e94, + 0xfe0e7e0f, + 0x61190d1e, + 0x057e6103, + 0xc20f07fe, + 0xb027f568, + 0x81198103, + 0xfe361ff6, + 0x10270f07, + 0x21fdef7e, + 0x23f2c3f0, + 0xa3f58e01, + 0x15f305f0, + 0x63fe4ef4, + 0x033f07f0, + 0x7ef30538, + 0xf043fdec, + 0xf083fe0e, + 0xf64efe0b, + 0xf093f4e3, + 0xbe0038e4, + 0x27ffee97, + 0x87d02771, + 0x0044f14d, + 0x87ff0210, + 0xf1f49537, + 0x02100034, + 0x91f4a5ff, + 0xe04c3cf4, + 0x0b1e40a7, + 0x44334d07, + 0x180c44f1, + 0xf4b5ff02, + 0x4c3cf4a1, + 0x1e40a7e0, + 0x3347070b, + 0x0c44f144, + 0xc5ff0218, + 0xdc3030f4, + 0x1e402738, + 0xf14d8709, + 0x02160044, + 0x34f4c5ff, + 0x27387c30, + 0x87091e40, + 0x0044f147, + 0xc5ff0216, + 0x402738f4, + 0xc53cf4c5, + 0xf4c540f4, + 0x48f4c544, + 0xf3a1f291, + 0x4f38f4b1, + 0x20000000, + 0x0b1e10a7, + 0x44334d07, + 0x180441f1, + 0xf4c1ff02, + 0x004f3830, + 0xa7200000, + 0x070b1e60, + 0xf1443347, + 0x02180446, + 0x3cfec1ff, + 0xfcc14107, + 0xc11d0740, + 0xfac144fb, + 0x34f9c148, + 0x5538f8c1, + 0x031153fd, + 0x68f093d2, + 0xf7750038, + 0xfe15f605, + 0xfb35fc25, + 0xf965fa45, + 0x7203f885, + 0xffedbabe, + 0x2450dce4, + 0x8ef4c3ff, + 0xd10f27f6, + 0x0b2c4304, + 0x63f54efe, + 0x07f035f1, + 0xf6d207b1, + 0xe200b83f, + 0xf400f621, + 0x0100002e, + 0x2df401c8, + 0x037a0100, + 0x2c274027, + 0x5b3d0720, + 0xec33f934, + 0x070000d5, + 0x66e32be2, + 0x27f231e7, + 0x4e2b204c, + 0xf431245b, + 0x3e3b3b07, + 0x4e3bb207, + 0xf435b3ab, + 0xad07de3b, + 0x0710ac53, + 0xbe0b071a, + 0x070003c6, + 0x071a0790, + 0x03b6be0b, + 0x07f43100, + 0x100c336d, + 0x4c536fab, + 0xabc90710, + 0x62c69b04, + 0x230d0bc0, + 0xea0d0a91, + 0x1b033a0c, + 0x071a07c0, + 0x0394be0c, + 0x07b00700, + 0xbe0c071a, + 0x31000384, + 0x100c33f4, + 0x3b074fab, + 0x369b04ab, + 0x0d0b3082, + 0x0d2ab123, + 0xb1233002, + 0x4c334907, + 0xab0b0710, + 0x07402704, + 0x07700714, + 0x8ef14384, + 0xea2307f5, + 0xf000fb13, + 0x0100003e, + 0x3ff400e6, + 0x01000000, + 0x1c2702a8, + 0x07410710, + 0xf9345b32, + 0x00d5ec33, + 0x2b610700, + 0x016ff663, + 0x312b2a01, + 0xcd4deaf4, + 0x27012700, + 0x07140740, + 0x43840770, + 0x96f58ef1, + 0x27012725, + 0x0310be10, + 0xf0d00700, + 0x010000de, + 0xdff400ba, + 0x01000000, + 0x2c270270, + 0x07420710, + 0xf9345b3d, + 0x00d5ec33, + 0x2b920700, + 0x939ff693, + 0x07cb0701, + 0x2b6d07ad, + 0x10ac53cd, + 0x51276fab, + 0x0c071a07, + 0x0002d1be, + 0x1a079007, + 0xc1be0c07, + 0xf4310002, + 0x53100c33, + 0xc907104c, + 0xc69b04ab, + 0x0d0bc062, + 0x0d0a9123, + 0x02500cea, + 0x1a07c01b, + 0xa3be0c07, + 0xb0070002, + 0x0c071a07, + 0x000293be, + 0x0c33f431, + 0x074fab10, + 0x9b04ab3b, + 0x0b308236, + 0x2ab1230d, + 0x2330020d, + 0x334907b1, + 0x0b07104c, + 0x450704ab, + 0x70071407, + 0xf1438407, + 0x3df4f58e, + 0x01ce0100, + 0x1c274027, + 0xff1d5e20, + 0x40270027, + 0x70071407, + 0xf1438407, + 0xddf4f58e, + 0x01ca0100, + 0x2c274027, + 0xff495e20, + 0x00002ff4, + 0x01c20100, + 0x07102c27, + 0xfe375e42, + 0x2b203c27, + 0x5b4d0736, + 0x07263b43, + 0x31a2aba4, + 0x07cb07f2, + 0x5b4b079a, + 0x3b235bc3, + 0x109c5346, + 0x190724ab, + 0xf2150c07, + 0x000205be, + 0x19075007, + 0xf5be0c07, + 0x3a070001, + 0x3fabf411, + 0x53100c33, + 0xc307104c, + 0xf345d63b, + 0xc59b04ab, + 0xc0a2fd05, + 0x51230a0b, + 0xc0220a4a, + 0x0a0b5123, + 0x1907c01b, + 0xcbbe0c07, + 0xb0070001, + 0x0c071907, + 0x0001bbbe, + 0x0c33f411, + 0xabf94110, + 0xabd0074f, + 0x429b9bd4, + 0x23da0b9d, + 0x39ade2b1, + 0x33450701, + 0xb4ab104c, + 0xf401eb07, + 0x0110ec53, + 0xab1b07fc, + 0x071fab4f, + 0x10cc530e, + 0x049b2107, + 0x2c9b149b, + 0x41073007, + 0x4c53320b, + 0x0b2d0710, + 0x9b292b34, + 0x030302ec, + 0x010000ee, + 0x4c534307, + 0xeae40b10, + 0xee00b32e, + 0x07009c2e, + 0x5e40270b, + 0xd93bfe35, + 0x31204c27, + 0x07492bf2, + 0x07ad07cb, + 0x5bc45b3b, + 0x53393b24, + 0x23ab10ac, + 0x0c071a07, + 0x33bef225, + 0x50070001, + 0x0c071a07, + 0x000123be, + 0x6d07f421, + 0xab100c33, + 0x104c536f, + 0x40abc507, + 0xc4a2c69b, + 0x51234d0b, + 0xc4224d4a, + 0x4d0b5123, + 0x1a07c41b, + 0xffbe0c07, + 0xb0070000, + 0x0c071a07, + 0x0000efbe, + 0x0c33f421, + 0x074fab10, + 0x9b04ab2b, + 0x0b20a226, + 0x4ab1230d, + 0x2320220d, + 0x070d0bb1, + 0x33f33145, + 0xc007104c, + 0x393b5b07, + 0x54abc22b, + 0xed5ef335, + 0x314307fd, + 0x333107f2, + 0x3fab104c, + 0x430b263b, + 0xff5542e2, + 0x01230b07, + 0x14074027, + 0x84077007, + 0xf58ef143, + 0x27184c27, + 0xfd595e18, + 0x1c274827, + 0xfd515e18, + 0x27184c27, + 0xfd915e28, + 0x2c274827, + 0xfc875e18, + 0x2c274827, + 0xfd815e18, + 0x27184c27, + 0xfc775e28, + 0xfec79de2, + 0xb123da0b, + 0x23fec05e, + 0x5e0d0b91, + 0x9123fcc3, + 0xad5e0d0b, + 0x88fe4efd, + 0x13100c00, + 0x0e212710, + 0x004e9efe, + 0x68001300, + 0xbe212710, + 0x13000044, + 0x13fe8e00, + 0x4ef31e10, + 0x1200c8fd, + 0x10c8d027, + 0xbe202714, + 0x8600002c, + 0x8e0013d4, + 0x270013fd, + 0xee10ccd1, + 0x41271013, + 0xd407d4d6, + 0x4027e41e, + 0xde1ed407, + 0x099e2127, + 0x20270000, + 0x0000039e, + 0x01c2fe4e, + 0x3310c836, + 0x3c274127, + 0x47114720, + 0x2101c244, + 0x2707f3f0, + 0x8e26e630, + 0xee10ccfe, + 0x012a3027, + 0x34ab012b, + 0x11534153, + 0x21b642d6, + 0xfe8e0307, + 0x30274066, + 0x4127e91e, + 0xe31e3027, + 0x4fff1ea7, + 0x9b1401fd, + 0x4103122f, + 0x13c14433, + 0x2e24ab38, + 0x0b002732, + 0xc5f3abfe, + 0x14c13812, + 0xf842ce38, + 0x0127f3eb, + 0xfe4efe0b, + 0x0576d33e, + 0x0e200c27, + 0x00059efe, + 0x4efe8e00, + 0xbeb007fb, + 0x07ff7243, + 0x931007d0, + 0x0034dbf0, + 0xffe8f6be, + 0xc027d746, + 0xd2010b1e, + 0xe8bec103, + 0xd403ffe8, + 0xf0931c07, + 0xda0034cd, + 0xfb8eedcb, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x42746e49, + 0x0a3a6675, + 0x6c202000, + 0x5f32676f, + 0x65676170, + 0x7a69735f, + 0x20202065, + 0x5f6d756e, + 0x65676170, + 0x66282073, + 0x29656572, + 0x2020000a, + 0x30252020, + 0x20206432, + 0x20202020, + 0x20202020, + 0x35252020, + 0x28202064, + 0x62206425, + 0x73657479, + 0x55000a29, + 0x6f6c626e, + 0x6e696b63, + 0x65722067, + 0x657a6973, + 0x25203a73, + 0x54000a64, + 0x6c61746f, + 0x6c6c6120, + 0x7461636f, + 0x25206465, + 0x28206438, + 0x64657375, + 0x2c642520, + 0x666e7520, + 0x61656572, + 0x20656c62, + 0x202c6425, + 0x65657266, + 0x29642520, + 0x656e000a, + 0x705f7478, + 0x745f6369, + 0x61705f6f, + 0x20657372, + 0x20202020, + 0x000a7525, + 0x6d726946, + 0x65726177, + 0x72657620, + 0x6e6f6973, + 0x656f6420, + 0x6f6e2073, + 0x616d2074, + 0x20686374, + 0x64726168, + 0x65726177, + 0x46000a21, + 0x776d7269, + 0x20657261, + 0x706d6f63, + 0x64656c69, + 0x726f6620, + 0x72657620, + 0x6e6f6973, + 0x25783020, + 0x0a783830, + 0x72614800, + 0x72617764, + 0x65722065, + 0x74726f70, + 0x20202073, + 0x76202020, + 0x69737265, + 0x30206e6f, + 0x38302578, + 0x46000a78, + 0x776d7269, + 0x20657261, + 0x73726576, + 0x206e6f69, + 0x73656f64, + 0x746f6e20, + 0x74616d20, + 0x68206863, + 0x77647261, + 0x20657261, + 0x73726576, + 0x006e6f69, + 0x64726168, + 0x65726177, + 0x656f6420, + 0x6f6e2073, + 0x75732074, + 0x726f7070, + 0x6e652074, + 0x69646f63, + 0x4c00676e, + 0x54435f45, + 0x253a4c52, + 0x4e202c78, + 0x45524f43, + 0x78253a53, + 0x494c202c, + 0x4f435f43, + 0x4e5f4552, + 0x253a4d55, + 0x48202c64, + 0x4f435f57, + 0x4e5f4552, + 0x253a4d55, + 0x000a2064, + 0x61766e69, + 0x2064696c, + 0x64726168, + 0x65726177, + 0x726f6320, + 0x756e2065, + 0x7265626d, + 0x6e203a73, + 0x65626d75, + 0x666f2072, + 0x72616820, + 0x65726164, + 0x726f6320, + 0x73692065, + 0x6c6c6920, + 0x6c616765, + 0x66655200, + 0x6e657265, + 0x70206563, + 0x75746369, + 0x74206572, + 0x656c6261, + 0x6469000a, + 0x203a2020, + 0x20617473, + 0x20657375, + 0x20666572, + 0x20317970, + 0x20327970, + 0x20706d63, + 0x20746d66, + 0x5f69626d, + 0x20727470, + 0x69626d20, + 0x6761705f, + 0x73287365, + 0x29657a69, + 0x74702020, + 0x6f742072, + 0x6f623a70, + 0x25000a74, + 0x3a206433, + 0x64332520, + 0x64332520, + 0x64332520, + 0x64332520, + 0x64332520, + 0x64332520, + 0x64332520, + 0x20702520, + 0x36252020, + 0x64252864, + 0x20202029, + 0x253a7025, + 0x4c000a70, + 0x20657669, + 0x74636970, + 0x20657275, + 0x6c626174, + 0x4e000a65, + 0x3a206d75, + 0x20642520, + 0x6c4f2020, + 0x74736564, + 0x0a642520, + 0x78646900, + 0x73203a20, + 0x75206174, + 0x70206573, + 0x64696369, + 0x66657220, + 0x6c206469, + 0x73656e69, + 0x20636e79, + 0x20666572, + 0x76696c20, + 0x66657265, + 0x20202073, + 0x65722020, + 0x69703266, + 0x25000a63, + 0x3a206433, + 0x64332520, + 0x64332520, + 0x25202020, + 0x20206433, + 0x64332520, + 0x25202020, + 0x25206436, + 0x20206433, + 0x30257830, + 0x25207838, + 0x25206433, + 0x25206433, + 0x25206433, + 0x25206433, + 0x25206433, + 0x25206433, + 0x25206433, + 0x25206433, + 0x25206433, + 0x25206433, + 0x25206433, + 0x25206433, + 0x25206433, + 0x25206433, + 0x25206433, + 0x000a6433, + 0x76697250, + 0x20657461, + 0x62666572, + 0x3a6b6e61, + 0x6c6f6320, + 0x3020726f, + 0x20782578, + 0x5f78616d, + 0x66667562, + 0x20737265, + 0x6d207525, + 0x25207762, + 0x626d2075, + 0x75252068, + 0x73616220, + 0x64615f65, + 0x30207264, + 0x38302578, + 0x20000a78, + 0x64692020, + 0x74732078, + 0x65722061, + 0x64615f66, + 0x20207264, + 0x77626d20, + 0x626d2020, + 0x20000a68, + 0x33252020, + 0x33252075, + 0x78302075, + 0x78383025, + 0x6528000a, + 0x6f20646e, + 0x72702066, + 0x74617669, + 0x65722065, + 0x6e616266, + 0x7564206b, + 0x0a29706d, + 0x44495600, + 0x46204f45, + 0x54532057, + 0x20455441, + 0x504d5544, + 0x636e4520, + 0x7265646f, + 0x45504a3d, + 0x73000a47, + 0x6f2d7465, + 0x70207470, + 0x69666f72, + 0x676e696c, + 0x7261203a, + 0x756d2067, + 0x62207473, + 0x20302065, + 0x3120726f, + 0x74657300, + 0x74706f2d, + 0x63736520, + 0x6e697061, + 0x61203a67, + 0x6d206772, + 0x20747375, + 0x30206562, + 0x20726f20, + 0x65730031, + 0x706f2d74, + 0x616e2074, + 0x6620756c, + 0x616d726f, + 0x55203a74, + 0x6f6e6b6e, + 0x66206e77, + 0x616d726f, + 0x65730074, + 0x706f2d74, + 0x616e2074, + 0x6620756c, + 0x616d726f, + 0x55203a74, + 0x7075736e, + 0x74726f70, + 0x66206465, + 0x616d726f, + 0x65730074, + 0x706f2d74, + 0x69642074, + 0x72656666, + 0x20746e65, + 0x65727473, + 0x62206d61, + 0x65647469, + 0x73687470, + 0x746f6e20, + 0x70757320, + 0x74726f70, + 0x73006465, + 0x6f2d7465, + 0x65207470, + 0x646f636e, + 0x74732065, + 0x6d616572, + 0x74696220, + 0x74706564, + 0x75203a68, + 0x7075736e, + 0x74726f70, + 0x76206465, + 0x65756c61, + 0x74657300, + 0x74706f2d, + 0x72686320, + 0x5f616d6f, + 0x6d726f66, + 0x203b7461, + 0x6f726863, + 0x6620616d, + 0x616d726f, + 0x6f6e2074, + 0x75732074, + 0x726f7070, + 0x2e646574, + 0x74657300, + 0x74706f2d, + 0x69626d20, + 0x206f666e, + 0x7074756f, + 0x203a7475, + 0x20677261, + 0x7473756d, + 0x20656220, + 0x726f2030, + 0x73003120, + 0x6f2d7465, + 0x6d207470, + 0x65732076, + 0x68637261, + 0x6e617220, + 0x203a6567, + 0x61766e69, + 0x2064696c, + 0x72612078, + 0x65730067, + 0x706f2d74, + 0x766d2074, + 0x61657320, + 0x20686372, + 0x676e6172, + 0x69203a65, + 0x6c61766e, + 0x79206469, + 0x67726120, + 0x74657300, + 0x74706f2d, + 0x66204220, + 0x656d6172, + 0x4e203a73, + 0x7320746f, + 0x6f707075, + 0x64657472, + 0x74657300, + 0x74706f2d, + 0x504f4720, + 0x70797420, + 0x55203a65, + 0x7075736e, + 0x74726f70, + 0x74206465, + 0x00657079, + 0x2d746573, + 0x2074706f, + 0x7420626d, + 0x3a657079, + 0x766e4920, + 0x64696c61, + 0x746e6920, + 0x73206172, + 0x63656c65, + 0x6e6f6974, + 0x74657300, + 0x74706f2d, + 0x42475220, + 0x206f7420, + 0x3a565559, + 0x736e7520, + 0x6f707075, + 0x64657472, + 0x646f6d20, + 0x65730065, + 0x706f2d74, + 0x6f682074, + 0x70207473, + 0x6f746f72, + 0x206c6f63, + 0x6e697270, + 0x203a7374, + 0x20677261, + 0x7473756d, + 0x20656220, + 0x726f2030, + 0x53003120, + 0x69646e65, + 0x4a20676e, + 0x445f424f, + 0x45555145, + 0x0a444555, + 0x45564d00, + 0x4655425f, + 0x5f524546, + 0x454e4547, + 0x3a4c4152, + 0x7a697320, + 0x6f742065, + 0x6d73206f, + 0x206c6c61, + 0x72206f74, + 0x20646165, + 0x64616568, + 0x002e7265, + 0x5f45564d, + 0x46465542, + 0x475f5245, + 0x52454e45, + 0x203a4c41, + 0x66667562, + 0x70207265, + 0x746e696f, + 0x69207265, + 0x554e2073, + 0x002e4c4c, + 0x5f45564d, + 0x46465542, + 0x475f5245, + 0x52454e45, + 0x203a4c41, + 0x66667562, + 0x73207265, + 0x20657a69, + 0x7a207369, + 0x2e6f7265, + 0x45564d00, + 0x4655425f, + 0x5f524546, + 0x454e4547, + 0x3a4c4152, + 0x6e6f6320, + 0x20676966, + 0x657a6973, + 0x20736920, + 0x6f72657a, + 0x564d002e, + 0x55425f45, + 0x52454646, + 0x4e45475f, + 0x4c415245, + 0x6e75203a, + 0x70707573, + 0x6574726f, + 0x79742064, + 0x69206570, + 0x564d206e, + 0x4f435f45, + 0x425f4d4d, + 0x495f4655, + 0x415f514e, + 0x2e524444, + 0x6f725700, + 0x7320676e, + 0x20657a69, + 0x6220666f, + 0x65666675, + 0x61702072, + 0x206d6172, + 0x65746172, + 0x6e6f635f, + 0x6c6f7274, + 0x74657300, + 0x74706f2d, + 0x74696220, + 0x74617220, + 0x66203a65, + 0x7420726f, + 0x20657079, + 0x2c46464f, + 0x72617420, + 0x20746567, + 0x65746172, + 0x6f687320, + 0x20646c75, + 0x7a206562, + 0x006f7265, + 0x2d746573, + 0x2074706f, + 0x20746962, + 0x65746172, + 0x6e75203a, + 0x70707573, + 0x6574726f, + 0x616d2064, + 0x69622078, + 0x74617274, + 0x65730065, + 0x706f2d74, + 0x69622074, + 0x61722074, + 0x203a6574, + 0x75736e75, + 0x726f7070, + 0x20646574, + 0x67726174, + 0x72207465, + 0x00657461, + 0x5f45564d, + 0x46465542, + 0x505f5245, + 0x4d415241, + 0x7a697320, + 0x6f742065, + 0x6d73206f, + 0x2e6c6c61, + 0x736e5500, + 0x6f707075, + 0x64657472, + 0x636e6520, + 0x2065646f, + 0x61726170, + 0x6e69206d, + 0x45564d20, + 0x4d4f435f, + 0x55425f4d, + 0x4e495f46, + 0x44415f51, + 0x002e5244, + 0x2a2a2a2a, + 0x20732520, + 0x2a2a2a2a, + 0x3a435020, + 0x25783020, + 0x20202078, + 0x203a5253, + 0x78257830, + 0x46202020, + 0x203a5241, + 0x78257830, + 0x5220000a, + 0x6432255b, + 0x203d205d, + 0x30257830, + 0x000a7838, + 0x73616d20, + 0x20726574, + 0x20642523, + 0x61207325, + 0x74726f62, + 0x000a6465, + 0x46202020, + 0x544c5541, + 0x7830203a, + 0x000a7825, + 0x46202020, + 0x52444441, + 0x7830203a, + 0x000a7825, + 0x43544157, + 0x474f4448, + 0x71726920, + 0x53415200, + 0x42412043, + 0x0054524f, + 0x20554d4d, + 0x524f4241, + 0x2a2a0054, + 0x52202a2a, + 0x25435341, + 0x42412064, + 0x2054524f, + 0x2a2a2a2a, + 0x2020000a, + 0x20204350, + 0x203d2020, + 0x30257830, + 0x000a7838, + 0x52532020, + 0x20202020, + 0x7830203d, + 0x78383025, + 0x2020000a, + 0x20524146, + 0x203d2020, + 0x30257830, + 0x000a7838, + 0x5b522020, + 0x5d643225, + 0x30203d20, + 0x38302578, + 0x57000a78, + 0x68637461, + 0x00676f64, + 0x616e7944, + 0x2063696d, + 0x6e616863, + 0x69206567, + 0x6874206e, + 0x756e2065, + 0x7265626d, + 0x20666f20, + 0x65726f63, + 0x73692073, + 0x746f6e20, + 0x70757320, + 0x74726f70, + 0x4e006465, + 0x6e69206f, + 0x66756274, + 0x61707320, + 0x66206563, + 0x6d20726f, + 0x65747361, + 0x61732072, + 0x61206576, + 0x00616572, + 0x646e6553, + 0x20676e69, + 0x54495753, + 0x44454843, + 0x0a4e495f, + 0x6e655300, + 0x676e6964, + 0x4f525020, + 0x53534543, + 0x000a4445, + 0x65636552, + 0x64657669, + 0x49575320, + 0x0a484354, + 0x63655200, + 0x65766965, + 0x4f4a2064, + 0x6c662042, + 0x3d736761, + 0x66207525, + 0x656d6172, + 0x75253d73, + 0x726f6320, + 0x253d7365, + 0x4a000a75, + 0x6d20626f, + 0x61737365, + 0x203a6567, + 0x626d754e, + 0x6f207265, + 0x6f632066, + 0x20736572, + 0x206e6163, + 0x20746f6e, + 0x7a206562, + 0x2e6f7265, + 0x626f4a00, + 0x73656d20, + 0x65676173, + 0x754e203a, + 0x7265626d, + 0x20666f20, + 0x65726f63, + 0x6f742073, + 0x616c206f, + 0x2e656772, + 0x626f4a00, + 0x73656d20, + 0x65676173, + 0x6e55203a, + 0x70707573, + 0x6574726f, + 0x6c662064, + 0x20736761, + 0x2e746573, + 0x626f4a00, + 0x73656d20, + 0x65676173, + 0x754e203a, + 0x7265626d, + 0x20666f20, + 0x6d617266, + 0x74207365, + 0x6c206f6f, + 0x65677261, + 0x6f6e002e, + 0x61707320, + 0x69206563, + 0x6f6a206e, + 0x75712062, + 0x00657565, + 0x5f544553, + 0x4954504f, + 0x66204e4f, + 0x656c6961, + 0x25203a64, + 0x00000a73, + 0x562f3556, + 0x504a2d37, + 0x4e454745, + 0x00203a43, + 0x69636552, + 0x64657665, + 0x54455320, + 0x54504f5f, + 0x204e4f49, + 0x61746164, + 0x7a69735f, + 0x75252065, + 0x74706f20, + 0x646e695f, + 0x25207865, + 0x72612075, + 0x78302067, + 0x78383025, + 0x6553000a, + 0x6f697373, + 0x706f206e, + 0x6e6f6974, + 0x61632073, + 0x6e6f206e, + 0x6220796c, + 0x68632065, + 0x65676e61, + 0x6e692064, + 0x4f545320, + 0x44455050, + 0x61747320, + 0x002e6574, + 0x6d726946, + 0x65726177, + 0x20736920, + 0x20746f6e, + 0x70707573, + 0x2074726f, + 0x73696874, + 0x74706f20, + 0x206e6f69, + 0x6e692d2d, + 0x715f7469, + 0x62006270, + 0x77646e61, + 0x68746469, + 0x6d696c20, + 0x203a7469, + 0x20746f6e, + 0x70707573, + 0x6574726f, + 0x65730064, + 0x706f2d74, + 0x616d2074, + 0x756e5f78, + 0x6f635f6d, + 0x3a736572, + 0x766e4920, + 0x64696c61, + 0x6c617620, + 0x46006575, + 0x776d7269, + 0x20657261, + 0x6e207369, + 0x7320746f, + 0x6f707075, + 0x74207472, + 0x20736968, + 0x6974706f, + 0x2d206e6f, + 0x7264672d, + 0x6d756e5f, + 0x00726562, + 0x6d726946, + 0x65726177, + 0x20736920, + 0x20746f6e, + 0x70707573, + 0x2074726f, + 0x73696874, + 0x74706f20, + 0x206e6f69, + 0x64672d2d, + 0x65705f72, + 0x646f6972, + 0x72694600, + 0x7261776d, + 0x73692065, + 0x746f6e20, + 0x70757320, + 0x74726f70, + 0x69687420, + 0x706f2073, + 0x6e6f6974, + 0x692d2d20, + 0x5f74696e, + 0x00697071, + 0x6765706a, + 0x20636e65, + 0x2d746573, + 0x3a74706f, + 0x6b6e5520, + 0x6e776f6e, + 0x74706f20, + 0x206e6f69, + 0x65646e69, + 0x65730078, + 0x706f2d74, + 0x75682074, + 0x616d6666, + 0x6174206e, + 0x3a656c62, + 0x72726520, + 0x6920726f, + 0x6174206e, + 0x00656c62, + 0x2d746573, + 0x2074706f, + 0x66667568, + 0x206e616d, + 0x6c626174, + 0x55203a65, + 0x6f6e6b6e, + 0x74206e77, + 0x656c6261, + 0x70797420, + 0x65730065, + 0x706f2d74, + 0x75712074, + 0x20746e61, + 0x6c626174, + 0x55203a65, + 0x6f6e6b6e, + 0x74206e77, + 0x00657079, + 0x5f544553, + 0x4954504f, + 0x4f204e4f, + 0x63202c4b, + 0x69666e6f, + 0x6e696d72, + 0x46000a67, + 0x776d7269, + 0x20657261, + 0x6e207369, + 0x7320746f, + 0x6f707075, + 0x74207472, + 0x20736968, + 0x6974706f, + 0x2d206e6f, + 0x696e692d, + 0x70715f74, + 0x65520070, + 0x76696563, + 0x49206465, + 0x5f454c44, + 0x0a4b4341, + 0x746f4700, + 0x4c444920, + 0x43415f45, + 0x6977204b, + 0x756f6874, + 0x65732074, + 0x4920746e, + 0x2e454c44, + 0x63655200, + 0x65766965, + 0x45442064, + 0x2c475542, + 0x67736d20, + 0x61643e2d, + 0x735f6174, + 0x3d657a69, + 0x202c6425, + 0x6576656c, + 0x64253d6c, + 0x6573000a, + 0x6e69646e, + 0x65722067, + 0x6e6f7073, + 0x63206573, + 0x2065646f, + 0x000a6425, + 0x454c4449, + 0x64692820, + 0x735f656c, + 0x5f746e65, + 0x685f6f74, + 0x2074736f, + 0x202c7525, + 0x75626e69, + 0x6e635f66, + 0x75252074, + 0x756f202c, + 0x66756274, + 0x746e635f, + 0x29752520, + 0x2020000a, + 0x61766120, + 0x77206c69, + 0x7364726f, + 0x206e6920, + 0x6d6d6f63, + 0x65757120, + 0x3a736575, + 0x67736d20, + 0x20752520, + 0x75626e69, + 0x75252066, + 0x74756f20, + 0x20667562, + 0x000a7525, + 0x646e6553, + 0x20676e69, + 0x46464552, + 0x454d4152, + 0x7325000a, + 0x20732520, + 0x2065766d, + 0x66667562, + 0x66207265, + 0x656d6172, + 0x6e692820, + 0x5f667562, + 0x20746e63, + 0x202c7525, + 0x6274756f, + 0x635f6675, + 0x2520746e, + 0x000a2975, + 0x20202020, + 0x74736f68, + 0x6e61685f, + 0x20656c64, + 0x30257830, + 0x30257838, + 0x75207838, + 0x5f726573, + 0x61746164, + 0x6761745f, + 0x25783020, + 0x25783830, + 0x0a783830, + 0x20202000, + 0x61726620, + 0x665f656d, + 0x7367616c, + 0x25783020, + 0x20783830, + 0x20706f74, + 0x62207525, + 0x2520746f, + 0x6f652075, + 0x75252073, + 0x6a657220, + 0x0a752520, + 0x20202000, + 0x726f6620, + 0x2074616d, + 0x30257830, + 0x76207834, + 0x62697369, + 0x2520656c, + 0x75257875, + 0x2020000a, + 0x696d2020, + 0x665f696e, + 0x656d6172, + 0x2820795f, + 0x252d7525, + 0x000a2975, + 0x20202020, + 0x6e616c70, + 0x30207365, + 0x38302578, + 0x30202c78, + 0x38302578, + 0x20000a78, + 0x73202020, + 0x73657a69, + 0x2c752520, + 0x0a752520, + 0x20202000, + 0x6f726320, + 0x25207870, + 0x72632075, + 0x2079706f, + 0x61207525, + 0x5f636266, + 0x62735f77, + 0x20752520, + 0x61207525, + 0x5f636266, + 0x61726170, + 0x3020736d, + 0x38302578, + 0x20000a78, + 0x70202020, + 0x206b6565, + 0x30257830, + 0x30257832, + 0x30257832, + 0x30257832, + 0x000a7832, + 0x20202020, + 0x6e616c70, + 0x6f745f65, + 0x78302070, + 0x78383025, + 0x25783020, + 0x20783830, + 0x30257830, + 0x000a7838, + 0x20202020, + 0x6e616c70, + 0x6f625f65, + 0x78302074, + 0x78383025, + 0x25783020, + 0x20783830, + 0x30257830, + 0x000a7838, + 0x20202020, + 0x69727473, + 0x20736564, + 0x64252020, + 0x20642520, + 0x000a6425, + 0x20202020, + 0x2078616d, + 0x25787525, + 0x25000a75, + 0x73252073, + 0x65766d20, + 0x66756220, + 0x20726566, + 0x73746962, + 0x61657274, + 0x6928206d, + 0x6675626e, + 0x746e635f, + 0x2c752520, + 0x74756f20, + 0x5f667562, + 0x20746e63, + 0x0a297525, + 0x20202000, + 0x74696220, + 0x65727473, + 0x665f6d61, + 0x7367616c, + 0x25783020, + 0x20783830, + 0x66736f65, + 0x20752520, + 0x20666f65, + 0x65207525, + 0x2520736f, + 0x6f652075, + 0x20736266, + 0x73207525, + 0x73746174, + 0x0a752520, + 0x20202000, + 0x64646120, + 0x78302072, + 0x78383025, + 0x6c6c6120, + 0x2520636f, + 0x666f2075, + 0x75252066, + 0x6c696620, + 0x7525206c, + 0x7325000a, + 0x20732520, + 0x2065766d, + 0x66667562, + 0x70207265, + 0x6d617261, + 0x72657465, + 0x7974202c, + 0x25206570, + 0x25000a75, + 0x73252073, + 0x65766d20, + 0x66756220, + 0x20726566, + 0x656e6567, + 0x206c6172, + 0x626e6928, + 0x635f6675, + 0x2520746e, + 0x6f202c75, + 0x75627475, + 0x6e635f66, + 0x75252074, + 0x20000a29, + 0x74202020, + 0x20657079, + 0x202c7525, + 0x666e6f63, + 0x735f6769, + 0x20657a69, + 0x000a7525, + 0x20202020, + 0x666e6f63, + 0x30206769, + 0x32302578, + 0x78302078, + 0x78323025, + 0x25783020, + 0x20783230, + 0x30257830, + 0x000a7832, + 0x20202020, + 0x66667562, + 0x705f7265, + 0x30207274, + 0x38302578, + 0x62202c78, + 0x65666675, + 0x69735f72, + 0x2520657a, + 0x48000a75, + 0x2074736f, + 0x6e697270, + 0x75622074, + 0x72656666, + 0x52524520, + 0x202e524f, + 0x25207325, + 0x766d2073, + 0x75622065, + 0x72656666, + 0x74697720, + 0x6e752068, + 0x776f6e6b, + 0x6f63206e, + 0x25206564, + 0x47000a75, + 0x4f00746f, + 0x55505455, + 0x6e490054, + 0x696c6176, + 0x756f2064, + 0x74757074, + 0x66756220, + 0x2e726566, + 0x766e4900, + 0x64696c61, + 0x66756220, + 0x20726566, + 0x4d206e69, + 0x435f4556, + 0x5f4d4d4f, + 0x5f465542, + 0x5154554f, + 0x4444415f, + 0x65282052, + 0x63657078, + 0x20646574, + 0x5f65766d, + 0x66667562, + 0x625f7265, + 0x74737469, + 0x6d616572, + 0x53002e29, + 0x69646e65, + 0x4900676e, + 0x5455504e, + 0x63655200, + 0x65766965, + 0x554f2064, + 0x54555054, + 0x554c465f, + 0x73204853, + 0x65746174, + 0x20752520, + 0x7074756f, + 0x625f7475, + 0x6b636f6c, + 0x25206465, + 0x4f000a75, + 0x75707475, + 0x6c662074, + 0x20687375, + 0x796c6e6f, + 0x6c6c6120, + 0x6465776f, + 0x65687720, + 0x7473206e, + 0x6570706f, + 0x6f202c64, + 0x66612072, + 0x20726574, + 0x70736572, + 0x65736e6f, + 0x45535f20, + 0x4e455551, + 0x505f4543, + 0x4d415241, + 0x52455445, + 0x65530053, + 0x6e69646e, + 0x554f2067, + 0x54555054, + 0x554c465f, + 0x44454853, + 0x6553000a, + 0x6e69646e, + 0x4e492067, + 0x5f545550, + 0x53554c46, + 0x0a444548, + 0x63655200, + 0x65766965, + 0x4e492064, + 0x5f545550, + 0x53554c46, + 0x49000a48, + 0x5455504e, + 0x554c465f, + 0x6f204853, + 0x20796c6e, + 0x6f6c6c61, + 0x20646577, + 0x6e656877, + 0x206e6920, + 0x504f5453, + 0x20444550, + 0x74617473, + 0x52002e65, + 0x69656365, + 0x20646576, + 0x000a4f47, + 0x5f45564d, + 0x55514552, + 0x5f545345, + 0x45444f43, + 0x3a4f475f, + 0x70204120, + 0x69766572, + 0x2073756f, + 0x74617473, + 0x72742065, + 0x69736e61, + 0x6e6f6974, + 0x20736920, + 0x6c697473, + 0x6570206c, + 0x6e69646e, + 0x4e002e67, + 0x6f6a206f, + 0x6e692062, + 0x626f6a20, + 0x65757120, + 0x002e6575, + 0x65636552, + 0x64657669, + 0x4f545320, + 0x4d000a50, + 0x525f4556, + 0x45555145, + 0x435f5453, + 0x5f45444f, + 0x504f5453, + 0x2041203a, + 0x76657270, + 0x73756f69, + 0x61747320, + 0x74206574, + 0x736e6172, + 0x6f697469, + 0x7369206e, + 0x69747320, + 0x70206c6c, + 0x69646e65, + 0x002e676e, + 0x6e616843, + 0x73206567, + 0x65746174, + 0x206f7420, + 0x000a6425, + 0x646e6553, + 0x20676e69, + 0x54415453, + 0x48435f45, + 0x45474e41, + 0x77656e20, + 0x6174735f, + 0x253d6574, + 0x53000a75, + 0x65746174, + 0x61686320, + 0x2065676e, + 0x646e6570, + 0x20676e69, + 0x74617473, + 0x64253d65, + 0x6e657020, + 0x676e6964, + 0x0a64253d, + 0x63655200, + 0x65766965, + 0x55442064, + 0x000a504d, + 0x5f45564d, + 0x55514552, + 0x5f545345, + 0x45444f43, + 0x4d55445f, + 0x6f6e2050, + 0x6c612074, + 0x65776f6c, + 0x6f662064, + 0x72702072, + 0x6365746f, + 0x20646574, + 0x73736573, + 0x736e6f69, + 0x626e002e, + 0x75622072, + 0x72656666, + 0x65682073, + 0x203a646c, + 0x69207525, + 0x7475706e, + 0x20752520, + 0x7074756f, + 0x000a7475, + 0x69617661, + 0x6f77206c, + 0x20736472, + 0x63206e69, + 0x206d6d6f, + 0x75657571, + 0x203a7365, + 0x2067736d, + 0x69207525, + 0x6675626e, + 0x20752520, + 0x6274756f, + 0x25206675, + 0x52000a75, + 0x69656365, + 0x20646576, + 0x474e4950, + 0x6e65000a, + 0x65722d63, + 0x72662d66, + 0x3a656d61, + 0x206f6e20, + 0x6f707865, + 0x20646573, + 0x6d617266, + 0x6f742065, + 0x6c657220, + 0x65736165, + 0x69702800, + 0x2029676e, + 0x65746e69, + 0x6c616e72, + 0x72726520, + 0x7720726f, + 0x20687469, + 0x2d666572, + 0x6d617266, + 0x78652d65, + 0x63617274, + 0x6e6f6974, + 0x63656d20, + 0x696e6168, + 0x002e6d73, + 0x65646f63, + 0x25203d20, + 0x54000a64, + 0x736e6172, + 0x6f697469, + 0x4946206e, + 0x6f204f46, + 0x66726576, + 0x00776f6c, + 0x75736e55, + 0x726f7070, + 0x20646574, + 0x7373656d, + 0x20656761, + 0x65646f63, + 0x6e65002e, + 0x65722d63, + 0x72662d66, + 0x3a656d61, + 0x746f6e20, + 0x6f6e6520, + 0x20686775, + 0x65746e69, + 0x6c616e72, + 0x6f6c7320, + 0x4d007374, + 0x666e6942, + 0x6e69206f, + 0x20747570, + 0x20746f6e, + 0x6f6c6c61, + 0x20646577, + 0x20726f66, + 0x746f7270, + 0x65746365, + 0x65732064, + 0x6f697373, + 0x4d002e6e, + 0x666e6942, + 0x6e69206f, + 0x20747570, + 0x66667562, + 0x68207265, + 0x69207361, + 0x67656c6c, + 0x6c206c61, + 0x7461636f, + 0x006e6f69, + 0x20646142, + 0x6e69424d, + 0x69206f66, + 0x7475706e, + 0x7375203b, + 0x735f6465, + 0x20657a69, + 0x72747328, + 0x5b656469, + 0x20295d31, + 0x7473756d, + 0x746f6e20, + 0x20656220, + 0x6772616c, + 0x74207265, + 0x206e6168, + 0x5f78616d, + 0x657a6973, + 0x74732820, + 0x65646972, + 0x295d305b, + 0x6142000a, + 0x424d2064, + 0x6f666e69, + 0x706e6920, + 0x62207475, + 0x65666675, + 0x4e002e72, + 0x7573206f, + 0x726f7070, + 0x6f662074, + 0x68742072, + 0x62207369, + 0x65666675, + 0x6f632072, + 0x20726f6c, + 0x6d726f66, + 0x002e7461, + 0x64726168, + 0x65726177, + 0x656f6420, + 0x6f6e2073, + 0x75732074, + 0x726f7070, + 0x46412074, + 0x69204342, + 0x7475706e, + 0x636e6500, + 0x6e69646f, + 0x6f6e2067, + 0x75732074, + 0x726f7070, + 0x20646574, + 0x7420666f, + 0x20736968, + 0x622d3031, + 0x69207469, + 0x7475706e, + 0x726f6620, + 0x0074616d, + 0x64726168, + 0x65726177, + 0x656f6420, + 0x6f6e2073, + 0x75732074, + 0x726f7070, + 0x564d2074, + 0x4f465f45, + 0x54414d52, + 0x5655595f, + 0x5f303234, + 0x30313050, + 0x45564d00, + 0x4655425f, + 0x5f524546, + 0x4d415246, + 0x4c465f45, + 0x495f4741, + 0x5245544e, + 0x4543414c, + 0x74657320, + 0x6e49203a, + 0x6c726574, + 0x64656361, + 0x636e6520, + 0x2065646f, + 0x20746f6e, + 0x70707573, + 0x6574726f, + 0x46002e64, + 0x2067616c, + 0x5f45564d, + 0x46465542, + 0x465f5245, + 0x454d4152, + 0x414c465f, + 0x4f425f47, + 0x49465f54, + 0x20545352, + 0x756f6873, + 0x6e20646c, + 0x6220746f, + 0x65732065, + 0x46002e74, + 0x2067616c, + 0x5f45564d, + 0x46465542, + 0x465f5245, + 0x454d4152, + 0x414c465f, + 0x4f425f47, + 0x52505f54, + 0x4e455345, + 0x68732054, + 0x646c756f, + 0x746f6e20, + 0x20656220, + 0x2e746573, + 0x73754d00, + 0x61682074, + 0x76206576, + 0x62697369, + 0x665f656c, + 0x656d6172, + 0x6469775f, + 0x3e206874, + 0x002e3020, + 0x7473754d, + 0x76616820, + 0x69762065, + 0x6c626973, + 0x72665f65, + 0x5f656d61, + 0x67696568, + 0x3e207468, + 0x002e3020, + 0x69736976, + 0x5f656c62, + 0x6d617266, + 0x69775f65, + 0x20687464, + 0x206f6f74, + 0x6772616c, + 0x69760065, + 0x6c626973, + 0x72665f65, + 0x5f656d61, + 0x67696568, + 0x74207468, + 0x6c206f6f, + 0x65677261, + 0x746f5200, + 0x6f697461, + 0x6f6e206e, + 0x75732074, + 0x726f7070, + 0x20646574, + 0x20726f66, + 0x43424641, + 0x706e6920, + 0x002e7475, + 0x6c616353, + 0x20676e69, + 0x20746f6e, + 0x70707573, + 0x6574726f, + 0x6f662064, + 0x46412072, + 0x69204342, + 0x7475706e, + 0x694d002e, + 0x726f7272, + 0x20676e69, + 0x6e207369, + 0x7320746f, + 0x6f707075, + 0x64657472, + 0x726f6620, + 0x42464120, + 0x6e692043, + 0x2e747570, + 0x6f726300, + 0x6e697070, + 0x6f6e2067, + 0x75732074, + 0x726f7070, + 0x20646574, + 0x20726f66, + 0x43424641, + 0x706e6920, + 0x41007475, + 0x20434246, + 0x6e616c70, + 0x20302065, + 0x6e207369, + 0x6920746f, + 0x6176206e, + 0x2064696c, + 0x6f6d656d, + 0x72207972, + 0x6f696765, + 0x41002e6e, + 0x20434246, + 0x6e616c70, + 0x20302065, + 0x657a6973, + 0x6f687320, + 0x20646c75, + 0x20746f6e, + 0x7a206562, + 0x2e6f7265, + 0x42464100, + 0x6f622043, + 0x6d6f7474, + 0x616c7020, + 0x7020656e, + 0x746e696f, + 0x73207265, + 0x6c756f68, + 0x61682064, + 0x62206576, + 0x206e6565, + 0x6f72657a, + 0x4641002e, + 0x70204342, + 0x656e616c, + 0x73203120, + 0x20657a69, + 0x756f6873, + 0x6220646c, + 0x657a2065, + 0x002e6f72, + 0x43424641, + 0x706e6920, + 0x203a7475, + 0x6469775f, + 0x695f6874, + 0x75735f6e, + 0x62726570, + 0x6b636f6c, + 0x6f742073, + 0x6d73206f, + 0x206c6c61, + 0x20726f66, + 0x6d617266, + 0x63530065, + 0x6e696c61, + 0x6f6e2067, + 0x75732074, + 0x726f7070, + 0x20646574, + 0x20726f66, + 0x6e616c70, + 0x69207261, + 0x7475706e, + 0x616d002e, + 0x72665f78, + 0x5f656d61, + 0x74646977, + 0x68732068, + 0x646c756f, + 0x20656220, + 0x6772616c, + 0x74207265, + 0x206e6168, + 0x6f72657a, + 0x616d002e, + 0x72665f78, + 0x5f656d61, + 0x67696568, + 0x73207468, + 0x6c756f68, + 0x65622064, + 0x72616c20, + 0x20726567, + 0x6e616874, + 0x72657a20, + 0x55002e6f, + 0x7075736e, + 0x74726f70, + 0x70206465, + 0x616e616c, + 0x75622072, + 0x72656666, + 0x6c6f6320, + 0x6620726f, + 0x616d726f, + 0x53002e74, + 0x64697274, + 0x6f742065, + 0x6d73206f, + 0x206c6c61, + 0x68206f74, + 0x20646c6f, + 0x5f78616d, + 0x6d617266, + 0x69775f65, + 0x2e687464, + 0x616c7000, + 0x745f656e, + 0x6d20706f, + 0x20747375, + 0x69206562, + 0x656d206e, + 0x79726f6d, + 0x67657220, + 0x206e6f69, + 0x4d415246, + 0x46554245, + 0x6c70002e, + 0x5f656e61, + 0x20746f62, + 0x756f6873, + 0x6220646c, + 0x657a2065, + 0x66206f72, + 0x6e20726f, + 0x692d6e6f, + 0x7265746e, + 0x6563616c, + 0x74732064, + 0x6d616572, + 0x6441002e, + 0x73657264, + 0x666f2073, + 0x756e7520, + 0x20646573, + 0x6e616c70, + 0x68732065, + 0x646c756f, + 0x20656220, + 0x6f72657a, + 0x7453002e, + 0x65646972, + 0x20666f20, + 0x73756e75, + 0x70206465, + 0x656e616c, + 0x6f687320, + 0x20646c75, + 0x7a206562, + 0x2e6f7265, + 0x73754d00, + 0x61682074, + 0x76206576, + 0x62697369, + 0x665f656c, + 0x656d6172, + 0x6469775f, + 0x3c206874, + 0x616d203d, + 0x72665f78, + 0x5f656d61, + 0x74646977, + 0x4d002e68, + 0x20747375, + 0x65766168, + 0x73697620, + 0x656c6269, + 0x6172665f, + 0x685f656d, + 0x68676965, + 0x3d3c2074, + 0x78616d20, + 0x6172665f, + 0x685f656d, + 0x68676965, + 0x5f002e74, + 0x5f504f54, + 0x53455250, + 0x20544e45, + 0x5f20726f, + 0x5f444e45, + 0x535f464f, + 0x41455254, + 0x756d204d, + 0x62207473, + 0x65732065, + 0x49002e74, + 0x6c61766e, + 0x62206469, + 0x65666675, + 0x6e692072, + 0x45564d20, + 0x4d4f435f, + 0x55425f4d, + 0x4e495f46, + 0x44415f51, + 0x28205244, + 0x65707865, + 0x64657463, + 0x65766d20, + 0x6675625f, + 0x5f726566, + 0x6d617266, + 0x726f2065, + 0x65766d20, + 0x6675625f, + 0x5f726566, + 0x61726170, + 0x002e296d, + 0x20303234, + 0x34203e2d, + 0x63203232, + 0x65766e6f, + 0x6f697372, + 0x6f6e206e, + 0x75732074, + 0x726f7070, + 0x2e646574, + 0x49464a00, + 0x41520046, + 0x00304353, + 0x43534152, + 0x41520031, + 0x00324353, + 0x43534152, + 0x41520033, + 0x00344353, + 0x414d4453, + 0x4d445600, + 0x45520041, + 0x41460046, + 0x5f4c4154, + 0x4f525245, + 0x4e555f52, + 0x49464544, + 0x0044454e, + 0x41544146, + 0x52455f4c, + 0x5f524f52, + 0x43424641, + 0x504e495f, + 0x435f5455, + 0x5552524f, + 0x46005450, + 0x4c415441, + 0x5252455f, + 0x415f524f, + 0x5f434246, + 0x5f464552, + 0x52524f43, + 0x00545055, + 0x41544146, + 0x52455f4c, + 0x5f524f52, + 0x4449534c, + 0x5254435f, + 0x414d5f4c, + 0x524f4358, + 0x4f4e5f45, + 0x45535f54, + 0x00000054, + 0x0000bf72, + 0x0000bf78, + 0x0000bf7e, + 0x0000bf84, + 0x0000bf8a, + 0x0000bf90, + 0x0000bf95, + 0x0000bf9a, + 0x0000bf9e, + 0x0000bfb4, + 0x0000bfd3, + 0x0000bff0, + 0x0000de83, + 0x00007bcf, + 0x00007bcf, + 0x00007bcf, + 0x4649424d, + 0x4745504a, + 0x00010001, + 0x16131008, + 0x221d1b1a, + 0x18161010, + 0x25221d1b, + 0x1b1a1613, + 0x2622221d, + 0x1b1a1616, + 0x2825221d, + 0x1d1b1a16, + 0x30282320, + 0x201d1b1a, + 0x3a302823, + 0x221d1b1a, + 0x45382e26, + 0x26231d1b, + 0x5345382e, + 0x01050100, + 0x01010101, + 0x00000001, + 0x00000000, + 0x03020100, + 0x07060504, + 0x0b0a0908, + 0x03010200, + 0x03040203, + 0x04040505, + 0x7d010000, + 0x00030201, + 0x12051104, + 0x06413121, + 0x07615113, + 0x32147122, + 0x08a19181, + 0xc1b14223, + 0xf0d15215, + 0x72623324, + 0x160a0982, + 0x1a191817, + 0x28272625, + 0x35342a29, + 0x39383736, + 0x4544433a, + 0x49484746, + 0x5554534a, + 0x59585756, + 0x6564635a, + 0x69686766, + 0x7574736a, + 0x79787776, + 0x8584837a, + 0x89888786, + 0x9493928a, + 0x98979695, + 0xa3a29a99, + 0xa7a6a5a4, + 0xb2aaa9a8, + 0xb6b5b4b3, + 0xbab9b8b7, + 0xc5c4c3c2, + 0xc9c8c7c6, + 0xd4d3d2ca, + 0xd8d7d6d5, + 0xe2e1dad9, + 0xe6e5e4e3, + 0xeae9e8e7, + 0xf4f3f2f1, + 0xf8f7f6f5, + 0x0300faf9, + 0x01010101, + 0x01010101, + 0x00000001, + 0x01000000, + 0x05040302, + 0x09080706, + 0x02000b0a, + 0x04040201, + 0x05070403, + 0x01000404, + 0x01007702, + 0x04110302, + 0x06312105, + 0x07514112, + 0x22137161, + 0x14088132, + 0xb1a19142, + 0x332309c1, + 0x6215f052, + 0x160ad172, + 0x25e13424, + 0x191817f1, + 0x2827261a, + 0x36352a29, + 0x3a393837, + 0x46454443, + 0x4a494847, + 0x56555453, + 0x5a595857, + 0x66656463, + 0x6a696867, + 0x76757473, + 0x7a797877, + 0x85848382, + 0x89888786, + 0x9493928a, + 0x98979695, + 0xa3a29a99, + 0xa7a6a5a4, + 0xb2aaa9a8, + 0xb6b5b4b3, + 0xbab9b8b7, + 0xc5c4c3c2, + 0xc9c8c7c6, + 0xd4d3d2ca, + 0xd8d7d6d5, + 0xe3e2dad9, + 0xe7e6e5e4, + 0xf2eae9e8, + 0xf6f5f4f3, + 0xfaf9f8f7, + 0x2a2a2a2a, + 0x53415220, + 0x20642543, + 0x524f4241, + 0x2a2a2054, + 0x000a2a2a, + 0x43502020, + 0x20202020, + 0x7830203d, + 0x78383025, + 0x2020000a, + 0x20205253, + 0x203d2020, + 0x30257830, + 0x000a7838, + 0x41462020, + 0x20202052, + 0x7830203d, + 0x78383025, + 0x2020000a, + 0x32255b52, + 0x3d205d64, + 0x25783020, + 0x0a783830, + 0x00000000, + 0x00007d7f, + 0x00007d7f, + 0x00007d7f, + 0x00007d7f, + 0x2a2a2a2a, + 0x53415220, + 0x20642543, + 0x524f4241, + 0x2a2a2054, + 0x000a2a2a, + 0x43502020, + 0x20202020, + 0x7830203d, + 0x78383025, + 0x2020000a, + 0x20205253, + 0x203d2020, + 0x30257830, + 0x000a7838, + 0x41462020, + 0x20202052, + 0x7830203d, + 0x78383025, + 0x2020000a, + 0x32255b52, + 0x3d205d64, + 0x25783020, + 0x0a783830, + 0x00000000, + 0x000083ee, + 0x000083ee, + 0x000083ee, + 0x000083ee, + 0x63617453, + 0x7461206b, + 0x0a702520, + 0x61747300, + 0x25206b63, + 0x3d206434, + 0x25783020, + 0x0a783830, + 0x00000000, + 0x2a2a2a2a, + 0x53415220, + 0x20642543, + 0x524f4241, + 0x2a2a2054, + 0x000a2a2a, + 0x43502020, + 0x20202020, + 0x7830203d, + 0x78383025, + 0x2020000a, + 0x20205253, + 0x203d2020, + 0x30257830, + 0x000a7838, + 0x41462020, + 0x20202052, + 0x7830203d, + 0x78383025, + 0x2020000a, + 0x32255b52, + 0x3d205d64, + 0x25783020, + 0x0a783830, + 0x00000000, + 0x00008517, + 0x00008517, + 0x00008517, + 0x00008517, + 0x72726f43, + 0x65747075, + 0x6e692064, + 0x20747570, + 0x75657571, + 0x49002e65, + 0x6c61766e, + 0x62206469, + 0x65666675, + 0x65682072, + 0x72656461, + 0x206e6920, + 0x5f45564d, + 0x4d4d4f43, + 0x4655425f, + 0x54554f5f, + 0x44415f51, + 0x002e5244, + 0x206f6f54, + 0x6772616c, + 0x65722065, + 0x73657571, + 0x656d2074, + 0x67617373, + 0x54002e65, + 0x6c206f6f, + 0x65677261, + 0x66756220, + 0x20726566, + 0x7373656d, + 0x2e656761, + 0x766e4900, + 0x64696c61, + 0x66756220, + 0x20726566, + 0x4d206e69, + 0x435f4556, + 0x5f4d4d4f, + 0x5f465542, + 0x5f514e49, + 0x52444441, + 0x564d002e, + 0x3a505245, + 0x5f6d6172, + 0x6e697270, + 0x66756274, + 0x20736920, + 0x20746f6e, + 0x69617661, + 0x6c62616c, + 0x000a2e65, + 0x5245564d, + 0x72203a50, + 0x705f6d61, + 0x746e6972, + 0x75645f66, + 0x6620706d, + 0x206d6f72, + 0x70257830, + 0x5052000a, + 0x4d554454, + 0x6c663a50, + 0x253d6761, + 0x69202c78, + 0x7865646e, + 0x2c75253d, + 0x5f727720, + 0x3d746e63, + 0x202c7525, + 0x635f6472, + 0x253d746e, + 0x000a2e75, + 0x252d5746, + 0x25203a75, + 0x564d0073, + 0x3a505245, + 0x67616c66, + 0x2c78253d, + 0x78646920, + 0x2c75253d, + 0x5f727720, + 0x3d746e63, + 0x202c7525, + 0x635f6472, + 0x253d746e, + 0x000a2e75, + 0x34302520, + 0x38250078, + 0x73253a78, + 0x2520000a, + 0x00783230, + 0x1007f000, + 0x49574558, + 0x35565644, + 0x2d37562f, + 0x4745504a, + 0x3a434e45, + 0x65720020, + 0x657a6973, + 0x7470203a, + 0x78302072, + 0x78383025, + 0x77656e20, + 0x7a69735f, + 0x75252065, + 0x766d000a, + 0x656d5f65, + 0x65725f6d, + 0x657a6973, + 0x6c616d00, + 0x3a636f6c, + 0x7a697320, + 0x75252065, + 0x616d202c, + 0x75252078, + 0x6572202c, + 0x6e6f6967, + 0x2c752520, + 0x676f6c20, + 0x6c615f32, + 0x206e6769, + 0x000a7525, + 0x6c6c616d, + 0x203a636f, + 0x75746572, + 0x64656e72, + 0x25783020, + 0x6d000a70, + 0x6d5f6576, + 0x615f6d65, + 0x636f6c6c, + 0x6c6c4100, + 0x7461636f, + 0x6d206465, + 0x726f6d65, + 0x61682079, + 0x72772073, + 0x20676e6f, + 0x67696c61, + 0x6e656d6e, + 0x78450074, + 0x74636570, + 0x61206465, + 0x636f6c6c, + 0x64657461, + 0x6d656d20, + 0x2079726f, + 0x50206e69, + 0x45544f52, + 0x44455443, + 0x67657220, + 0x2e6e6f69, + 0x70784500, + 0x65746365, + 0x6c612064, + 0x61636f6c, + 0x20646574, + 0x6f6d656d, + 0x69207972, + 0x5246206e, + 0x42454d41, + 0x72204655, + 0x6f696765, + 0x6e002e6e, + 0x7720746f, + 0x69746961, + 0x2500676e, + 0x64692073, + 0x635f656c, + 0x656c6379, + 0x25000a73, + 0x2d252073, + 0x20733831, + 0x64353125, + 0x7325000a, + 0x746f5420, + 0x695f6c61, + 0x20656c64, + 0x20202020, + 0x25202020, + 0x0a643531, + 0x726f6300, + 0x64252065, + 0x20732520, + 0x30322d25, + 0x6f632073, + 0x253d6564, + 0x70206433, + 0x253d6369, + 0x70206433, + 0x705b736f, + 0x283d5d75, + 0x2c643325, + 0x29643325, + 0x6b6c6320, + 0x0a64253d, + 0x726f6300, + 0x64252065, + 0x20732520, + 0x30322d25, + 0x20202073, + 0x20202020, + 0x70202020, + 0x253d6369, + 0x70206433, + 0x705b736f, + 0x283d5d75, + 0x2c643325, + 0x29643325, + 0x6f6e000a, + 0x65732074, + 0x61772074, + 0x6e697469, + 0x4f530067, + 0x45525f43, + 0x54532e46, + 0x53555441, + 0x20202020, + 0x20202020, + 0x78302020, + 0x000a7825, + 0x5f434f53, + 0x2e464552, + 0x464e4f43, + 0x20204749, + 0x20202020, + 0x20202020, + 0x78257830, + 0x4f53000a, + 0x45525f43, + 0x494c2e46, + 0x45524556, + 0x20202046, + 0x20202020, + 0x78302020, + 0x000a7825, + 0x5f434f53, + 0x2e464552, + 0x504f5453, + 0x4b53414d, + 0x20202020, + 0x20202020, + 0x78257830, + 0x4f53000a, + 0x434d5f43, + 0x4154532e, + 0x20205452, + 0x20202020, + 0x20202020, + 0x78302020, + 0x000a7825, + 0x5f434f53, + 0x532e434d, + 0x55544154, + 0x20202053, + 0x20202020, + 0x20202020, + 0x78257830, + 0x4f53000a, + 0x52545f43, + 0x54532e46, + 0x53555441, + 0x20202020, + 0x20202020, + 0x78302020, + 0x000a7825, + 0x5f434f53, + 0x2e465254, + 0x53474244, + 0x55544154, + 0x20202053, + 0x20202020, + 0x78257830, + 0x4f53000a, + 0x42445f43, + 0x54432e4c, + 0x20204c52, + 0x20202020, + 0x20202020, + 0x78302020, + 0x000a7825, + 0x5f434f53, + 0x2e4c4244, + 0x4c525443, + 0x20202031, + 0x20202020, + 0x20202020, + 0x78257830, + 0x4f53000a, + 0x42445f43, + 0x54532e4c, + 0x53555441, + 0x20202020, + 0x20202020, + 0x78302020, + 0x000a7825, + 0x5f434f53, + 0x2e4c4244, + 0x54415453, + 0x20315355, + 0x20202020, + 0x20202020, + 0x78257830, + 0x4f53000a, + 0x42445f43, + 0x54532e4c, + 0x53555441, + 0x20202032, + 0x20202020, + 0x78302020, + 0x000a7825, + 0x5f434f53, + 0x2e4c4244, + 0x54415453, + 0x20335355, + 0x20202020, + 0x20202020, + 0x78257830, + 0x4f53000a, + 0x49425f43, + 0x52545354, + 0x2e4d4145, + 0x41424341, + 0x54532e44, + 0x53555441, + 0x20202020, + 0x30202020, + 0x0a782578, + 0x434f5300, + 0x5449425f, + 0x45525453, + 0x4d2e4d41, + 0x54494244, + 0x41564153, + 0x20204c49, + 0x20202020, + 0x78302020, + 0x000a7825, + 0x5f434f53, + 0x53544942, + 0x41455254, + 0x45442e4d, + 0x54435f46, + 0x20204c52, + 0x20202020, + 0x20202020, + 0x25783020, + 0x53000a78, + 0x425f434f, + 0x54535449, + 0x4d414552, + 0x564d482e, + 0x44455250, + 0x4154532e, + 0x20535554, + 0x20202020, + 0x78257830, + 0x4f53000a, + 0x49425f43, + 0x52545354, + 0x2e4d4145, + 0x42414348, + 0x532e4441, + 0x55544154, + 0x20202053, + 0x30202020, + 0x0a782578, + 0x434f5300, + 0x2e454d5f, + 0x54415453, + 0x20205355, + 0x20202020, + 0x20202020, + 0x25783020, + 0x53000a78, + 0x565f434f, + 0x2e414d44, + 0x5f515249, + 0x54415453, + 0x20205355, + 0x30202020, + 0x0a782578, + 0x4f532000, + 0x44565f43, + 0x6520414d, + 0x3d305f71, + 0x64207825, + 0x3d305f71, + 0x65207825, + 0x3d315f71, + 0x64207825, + 0x3d315f71, + 0x73207825, + 0x635f6372, + 0x3d6c7274, + 0x000a7825, + 0x52414853, + 0x525f4445, + 0x702e4d41, + 0x5f657069, + 0x74617473, + 0x20202065, + 0x28207525, + 0x0a297325, + 0x41485300, + 0x5f444552, + 0x2e4d4152, + 0x6c5f7369, + 0x5f747361, + 0x65726f63, + 0x0a752520, + 0x41485300, + 0x5f444552, + 0x2e4d4152, + 0x5f626f6a, + 0x73616870, + 0x20202065, + 0x0a752520, + 0x41485300, + 0x5f444552, + 0x2e4d4152, + 0x5f626f6a, + 0x74617473, + 0x20202065, + 0x0a782520, + 0x41485300, + 0x5f444552, + 0x2e4d4152, + 0x7074756f, + 0x735f7475, + 0x70697274, + 0x635f7365, + 0x6c706d6f, + 0x64657465, + 0x0a752520, + 0x41485300, + 0x5f444552, + 0x2e4d4152, + 0x71657261, + 0x7274735f, + 0x73657069, + 0x7373695f, + 0x20646575, + 0x000a7525, + 0x414d4453, + 0x5541462e, + 0x2020544c, + 0x20202020, + 0x20202020, + 0x20202020, + 0x78257830, + 0x7453000a, + 0x73757461, + 0x20666f20, + 0x636f6c62, + 0x2064656b, + 0x6b736174, + 0x6f662073, + 0x6f632072, + 0x25206572, + 0x63203a75, + 0x253d6b6c, + 0x000a2075, + 0x74617473, + 0x25207375, + 0x6f742078, + 0x64252070, + 0x746e6320, + 0x20642520, + 0x756e636d, + 0x7825206d, + 0x626d000a, + 0x3d6d756e, + 0x72207825, + 0x766d656d, + 0x0a78253d, + 0x434f5300, + 0x5359535f, + 0x4c525443, + 0x4e56532e, + 0x20564552, + 0x20202020, + 0x20202020, + 0x20202020, + 0x20202020, + 0x000a7825, + 0x525f5746, + 0x20205645, + 0x20202020, + 0x20202020, + 0x20202020, + 0x20202020, + 0x20202020, + 0x20202020, + 0x25202020, + 0x53000a78, + 0x49535345, + 0x525f4e4f, + 0x612e4d41, + 0x76697463, + 0x6f635f65, + 0x20736572, + 0x20202020, + 0x20202020, + 0x75252020, + 0x6946000a, + 0x61776d72, + 0x73206572, + 0x75746174, + 0x666f2073, + 0x73616d20, + 0x20726574, + 0x726f6328, + 0x64252065, + 0x63203a29, + 0x253d6b6c, + 0x000a2064, + 0x53534553, + 0x5f4e4f49, + 0x2e4d4152, + 0x6d726966, + 0x65726177, + 0x6e695f73, + 0x6573755f, + 0x20202020, + 0x25202020, + 0x25202c64, + 0x25202c64, + 0x25202c64, + 0x25202c64, + 0x25202c64, + 0x25202c64, + 0x25202c64, + 0x53000a64, + 0x49535345, + 0x525f4e4f, + 0x6d2e4d41, + 0x65747361, + 0x6f635f72, + 0x20206572, + 0x20202020, + 0x20202020, + 0x75252020, + 0x4553000a, + 0x4f495353, + 0x41525f4e, + 0x616d2e4d, + 0x72657473, + 0x6c6c615f, + 0x7461636f, + 0x20206465, + 0x20202020, + 0x0a642520, + 0x53455300, + 0x4e4f4953, + 0x4d41525f, + 0x73616d2e, + 0x5f726574, + 0x6e676973, + 0x20736c61, + 0x20202020, + 0x20202020, + 0x78383025, + 0x38302520, + 0x30252078, + 0x000a7838, + 0x53534553, + 0x5f4e4f49, + 0x2e4d4152, + 0x74636970, + 0x73657275, + 0x5f6e695f, + 0x65706970, + 0x20202020, + 0x25202020, + 0x53000a64, + 0x49535345, + 0x525f4e4f, + 0x702e4d41, + 0x5f657069, + 0x5f636970, + 0x6c696174, + 0x20202020, + 0x20202020, + 0x75252020, + 0x4553000a, + 0x4f495353, + 0x41525f4e, + 0x69702e4d, + 0x705f6570, + 0x685f6369, + 0x20646165, + 0x20202020, + 0x20202020, + 0x0a752520, + 0x53455300, + 0x4e4f4953, + 0x4d41525f, + 0x6e65702e, + 0x676e6964, + 0x6174735f, + 0x20206574, + 0x20202020, + 0x20202020, + 0x000a7525, + 0x53534553, + 0x5f4e4f49, + 0x2e4d4152, + 0x73736573, + 0x5f6e6f69, + 0x74617473, + 0x20202065, + 0x20202020, + 0x25202020, + 0x53000a75, + 0x49535345, + 0x525f4e4f, + 0x632e4d41, + 0x6c706d6f, + 0x64657465, + 0x6369705f, + 0x65727574, + 0x20202073, + 0x75252020, + 0x4553000a, + 0x4f495353, + 0x41525f4e, + 0x696c2e4d, + 0x735f6576, + 0x70697274, + 0x65685f65, + 0x20206461, + 0x20202020, + 0x0a752520, + 0x53455300, + 0x4e4f4953, + 0x4d41525f, + 0x76696c2e, + 0x74735f65, + 0x65706972, + 0x6961745f, + 0x6e692e6c, + 0x20786564, + 0x000a7525, + 0x53534553, + 0x5f4e4f49, + 0x2e4d4152, + 0x6576696c, + 0x7274735f, + 0x5f657069, + 0x6c696174, + 0x6369702e, + 0x25206469, + 0x53000a75, + 0x49535345, + 0x525f4e4f, + 0x6c2e4d41, + 0x5f657669, + 0x69727473, + 0x745f6570, + 0x2e6c6961, + 0x79666572, + 0x75252020, + 0x4553000a, + 0x4f495353, + 0x41525f4e, + 0x74732e4d, + 0x6970706f, + 0x6e5f676e, + 0x626f5f6f, + 0x20202020, + 0x20202020, + 0x0a752520, + 0x53455300, + 0x4e4f4953, + 0x4d41525f, + 0x7369642e, + 0x5f62695f, + 0x69736572, + 0x2020657a, + 0x20202020, + 0x20202020, + 0x000a6425, + 0x5f78616d, + 0x69736572, + 0x6c617564, + 0x6761705f, + 0x20207365, + 0x20202020, + 0x20202020, + 0x20202020, + 0x0a642520, + 0x67617000, + 0x6f635f65, + 0x20746e75, + 0x20202020, + 0x20202020, + 0x20202020, + 0x20202020, + 0x20202020, + 0x64252020, + 0x7020000a, + 0x5f656761, + 0x65646e69, + 0x64252078, + 0x20702520, + 0x74706d65, + 0x64252079, + 0x5f727720, + 0x20786469, + 0x72206425, + 0x64695f64, + 0x64252078, + 0x61702020, + 0x725f6567, + 0x735f6d65, + 0x64252030, + 0x67617020, + 0x65725f65, + 0x31735f6d, + 0x0a642520, + 0x53455300, + 0x4e4f4953, + 0x4d41525f, + 0x74756f2e, + 0x5f747570, + 0x66667562, + 0x6e5f7265, + 0x20747865, + 0x20202020, + 0x000a7525, + 0x53534553, + 0x5f4e4f49, + 0x2e4d4152, + 0x7074756f, + 0x625f7475, + 0x65666675, + 0x61745f72, + 0x20206c69, + 0x25202020, + 0x53000a75, + 0x49535345, + 0x525f4e4f, + 0x6f2e4d41, + 0x75707475, + 0x75625f74, + 0x72656666, + 0x6165685f, + 0x20202064, + 0x75252020, + 0x2d2d000a, + 0x69777320, + 0x69686374, + 0x2d20676e, + 0x53000a2d, + 0x49535345, + 0x525f4e4f, + 0x6e2e4d41, + 0x5f747865, + 0x746f6f62, + 0x6b6f745f, + 0x20206e65, + 0x20202020, + 0x75252020, + 0x4553000a, + 0x4f495353, + 0x41525f4e, + 0x6f6a2e4d, + 0x75715f62, + 0x2e657565, + 0x656b6f74, + 0x2020206e, + 0x20202020, + 0x0a752520, + 0x53455300, + 0x4e4f4953, + 0x4d41525f, + 0x626f6a2e, + 0x7463615f, + 0x20657669, + 0x20202020, + 0x20202020, + 0x20202020, + 0x000a7525, + 0x53534553, + 0x5f4e4f49, + 0x2e4d4152, + 0x5f626f6a, + 0x73616870, + 0x6f635f65, + 0x65746e75, + 0x20202072, + 0x25202020, + 0x53000a75, + 0x49535345, + 0x525f4e4f, + 0x6a2e4d41, + 0x735f626f, + 0x74726174, + 0x6369705f, + 0x20202020, + 0x20202020, + 0x75252020, + 0x4553000a, + 0x4f495353, + 0x41525f4e, + 0x6f6a2e4d, + 0x6e655f62, + 0x69705f64, + 0x20202063, + 0x20202020, + 0x20202020, + 0x0a752520, + 0x53455300, + 0x4e4f4953, + 0x4d41525f, + 0x7274732e, + 0x5f6d6165, + 0x5f636970, + 0x64616568, + 0x20202020, + 0x20202020, + 0x000a7525, + 0x73202d2d, + 0x6563696c, + 0x65757120, + 0x20736575, + 0x000a2d2d, + 0x53534553, + 0x5f4e4f49, + 0x2e4d4152, + 0x6f666966, + 0x696c735f, + 0x6a5f6563, + 0x2020626f, + 0x20202020, + 0x25202020, + 0x6e652064, + 0x65697274, + 0x53000a73, + 0x49535345, + 0x525f4e4f, + 0x662e4d41, + 0x5f6f6669, + 0x63696c73, + 0x6f635f65, + 0x656c706d, + 0x20206574, + 0x64252020, + 0x746e6520, + 0x73656972, + 0x6d20000a, + 0x74735f65, + 0x65706972, + 0x736f705f, + 0x253d6920, + 0x6f702064, + 0x64253d73, + 0x696c000a, + 0x6a5f6576, + 0x3e2d626f, + 0x74697773, + 0x725f6863, + 0x65757165, + 0x20207473, + 0x20202020, + 0x20202020, + 0x75252020, + 0x696c000a, + 0x6a5f6576, + 0x3e2d626f, + 0x75716572, + 0x65747365, + 0x756e5f64, + 0x7265626d, + 0x5f666f5f, + 0x65726f63, + 0x75252073, + 0x696c000a, + 0x6a5f6576, + 0x3e2d626f, + 0x65726f63, + 0x6f625f73, + 0x6465746f, + 0x20202020, + 0x20202020, + 0x20202020, + 0x75252020, + 0x696c000a, + 0x6a5f6576, + 0x3e2d626f, + 0x65706970, + 0x6977735f, + 0x20686374, + 0x20202020, + 0x20202020, + 0x20202020, + 0x75252020, + 0x5453000a, + 0x4d414552, + 0x494c5300, + 0x00204543, + 0x2020454d, + 0x52540020, + 0x20534e41, + 0x54554f00, + 0x00545550, + 0x45504950, + 0x57002051, + 0x00544941, + 0x5245564f, + 0x004e5552, + 0x50545331, + 0x00454741, + 0x49434950, + 0x4e490044, + 0x46554254, + 0x56494c00, + 0x52415045, + 0x00444553, + 0x4556494c, + 0x504d4f43, + 0x43495000, + 0x45444e49, + 0x414e0058, + 0x4e49004c, + 0x00434950, + 0x4f434e45, + 0x55425455, + 0x52500046, + 0x45535645, + 0x45520051, + 0x4e414246, + 0x45525f4b, + 0x00544553, + 0x5054554f, + 0x465f5455, + 0x4853554c, + 0x524c4300, + 0x00425044, + 0x5f434e45, + 0x5f504544, + 0x00434950, + 0x5f4e5552, + 0x54415453, + 0x4c530045, + 0x5f454349, + 0x4f464946, + 0x56494c00, + 0x4c535f45, + 0x00454349, + 0x55514544, + 0x00455545, + 0x55514e45, + 0x00455545, + 0x004c4f43, + 0x49534552, + 0x4c415544, + 0x54494200, + 0x53434e45, + 0x42005145, + 0x4e455449, + 0x46554243, + 0x434e4500, + 0x4e49424d, + 0x43004f46, + 0x43414241, + 0x53544942, + 0x564d4800, + 0x44455250, + 0x42455200, + 0x45544f4f, + 0x52500044, + 0x0053424f, + 0x4e554f43, + 0x56005354, + 0x43423950, + 0x45525000, + 0x52465f56, + 0x00454d41, + 0x42545845, + 0x45464655, + 0x49500052, + 0x00444550, + 0x46464552, + 0x454d4152, + 0x56494c00, + 0x4f4c5345, + 0x4f4a0054, + 0x57530042, + 0x48435449, + 0x46455200, + 0x454c4449, + 0x50495000, + 0x41524445, + 0x52004e49, + 0x5542574f, + 0x4f4a0046, + 0x4f4c5342, + 0x4f520054, + 0x554f4357, + 0x5245544e, + 0x46525200, + 0x4d445600, + 0x43525341, + 0x41525400, + 0x4f46534e, + 0x52004d52, + 0x52464652, + 0x00454d41, + 0x51455241, + 0x5f454d00, + 0x454c4449, + 0x4d445600, + 0x54535f41, + 0x45504952, + 0x4c4f4300, + 0x5200434f, + 0x5f465542, + 0x53554c46, + 0x4e450048, + 0x52465f44, + 0x00454d41, + 0x535f4352, + 0x00544154, + 0x4e49424d, + 0x495f4f46, + 0x424d004e, + 0x4f464e49, + 0x54554f5f, + 0x53455200, + 0x41554449, + 0x554f5f4c, + 0x4f540054, + 0x574f5250, + 0x00434d00, + 0x49465254, + 0x53005152, + 0x57414d44, + 0x50454400, + 0x49525453, + 0x44004550, + 0x535f4c42, + 0x00544f4c, + 0x4949424d, + 0x43005152, + 0x55425249, + 0x424d0046, + 0x41455249, + 0x52500044, + 0x54535645, + 0x45504952, + 0x43495000, + 0x504d4f43, + 0x46525400, + 0x49424d00, + 0x5f4f464e, + 0x44414548, + 0x44005245, + 0x4c5f4c42, + 0x56005244, + 0x53414d44, + 0x50495254, + 0x44560045, + 0x4c53414d, + 0x5300544f, + 0x50495254, + 0x4f435f45, + 0x5000504d, + 0x4e495849, + 0x414f4c5f, + 0x4f520044, + 0x54535f57, + 0x0045524f, + 0x5f564d53, + 0x4e49424d, + 0x44004f46, + 0x425f4c42, + 0x52540053, + 0x54535f46, + 0x5f45524f, + 0x004d4f43, + 0x5f465254, + 0x49525453, + 0x4f434550, + 0x4300504d, + 0x004c5254, + 0x4e45504f, + 0x52415000, + 0x4f434553, + 0x4500504d, + 0x4500534f, + 0x425f534f, + 0x52004655, + 0x44524f45, + 0x46005245, + 0x454d4152, + 0x455a4953, + 0x59485000, + 0x00444953, + 0x004e5552, + 0x00424a50, + 0x00545753, + 0x00424a43, + 0x00045100, + 0x0004514c, + 0x00000000, + 0x00045198, + 0x000451f0, + 0x0004522c, + 0x00045278, + 0x0000d1ca, + 0x0000d1d1, + 0x00000000, + 0x0000d1d8, + 0x0000d1de, + 0x0000d1e5, + 0x0000d1ec, + 0x33323130, + 0x37363534, + 0x00003938, + 0x33323130, + 0x37363534, + 0x62613938, + 0x66656463, + 0x44532020, + 0x2020414d, + 0x61747320, + 0x30737574, + 0x20202020, + 0x74617473, + 0x20317375, + 0x207c2020, + 0x6c637273, + 0x20206e65, + 0x6c747364, + 0x7c206e65, + 0x70747320, + 0x7c206e65, + 0x70747320, + 0x7c206469, + 0x76656420, + 0x65702023, + 0x6e69646e, + 0x20000a67, + 0x32255b20, + 0x20205d64, + 0x78383025, + 0x25202020, + 0x20783830, + 0x207c2020, + 0x20643625, + 0x64362520, + 0x25207c20, + 0x25206432, + 0x7c206432, + 0x78322520, + 0x78322520, + 0x23207c20, + 0x25206425, + 0x20202c64, + 0x20642523, + 0x000a6425, + 0x02020100, + 0x03030303, + 0x04040404, + 0x04040404, + 0x05050505, + 0x05050505, + 0x05050505, + 0x05050505, + 0x06060606, + 0x06060606, + 0x06060606, + 0x06060606, + 0x06060606, + 0x06060606, + 0x06060606, + 0x06060606, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x07070707, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x08080808, + 0x63617453, + 0x7461206b, + 0x0a702520, + 0x61747300, + 0x25206b63, + 0x3d206434, + 0x25783020, + 0x0a783830, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x6ad6f493, + 0xadf39304, + 0x420103a7, + 0x32053101, + 0xfe0b4105, + 0x4ea7fe4e, + 0x99feffff, + 0x33830943, + 0x34334387, + 0x33f9342b, + 0xff00004d, + 0x4ea73726, + 0xb9ffffff, + 0x4b0c304e, + 0xcee08bef, + 0x202719e1, + 0xf3f02103, + 0x8e012705, + 0x3024f9fe, + 0x4bff000c, + 0xce408b4f, + 0x0027eb4e, + 0x4107fe8e, + 0x43dc40ab, + 0x1524d018, + 0x44234207, + 0x41034253, + 0x24231301, + 0x14030305, + 0xf4980403, + 0x14192586, + 0x041d1103, + 0xf2a80103, + 0x2253fe0b, + 0x14012586, + 0x04051403, + 0xf2a80403, + 0x0533fe0b, + 0x180001f5, + 0x03f5ff02, + 0xff021804, + 0x0e234027, + 0x35fde800, + 0x000e0304, + 0x02f5fde8, + 0xff021810, + 0x181403f5, + 0x0e23ff02, + 0x35fde7f0, + 0x4efe0b04, + 0x66b207f6, + 0x0791072f, + 0xd9f793a0, + 0x6c2703a6, + 0xff8ea740, + 0xdb07fdef, + 0x0741bc10, + 0x077401d6, + 0xc3c633c4, + 0x23740541, + 0xfefe74ce, + 0x4c338411, + 0x1d4c5318, + 0x07f642cc, + 0xe323032d, + 0x070c0723, + 0xff7c7e19, + 0xf49b4027, + 0x2b00270e, + 0x071c07bd, + 0x7e3d072a, + 0xb506ff7a, + 0x9d0bad0b, + 0xf68eb91e, + 0x04030333, + 0x100004f1, + 0x4dd8ff02, + 0x2710fc6a, + 0xf1f4e843, + 0x02100003, + 0x6a3ddcff, + 0xfe0bf2fc, + 0xa66af493, + 0x27430103, + 0xff4ea721, + 0x429dfeff, + 0x1d3f000a, + 0x0b000121, + 0x55f493fe, + 0x431903a6, + 0xf49332e6, + 0x1d04b71c, + 0x27fe0b42, + 0x69f49331, + 0x439d0469, + 0x4eca1e64, + 0xff4ea7fa, + 0x4b01fd9f, + 0xb8fca007, + 0xbed80143, + 0x15040000, + 0xa622f493, + 0x27421903, + 0x11f49331, + 0x431d03a6, + 0x01342ff6, + 0x0000bef8, + 0x2700c280, + 0xfdf49321, + 0x421d03a5, + 0x4fff3ea7, + 0xa73201fd, + 0xffffff1e, + 0x40272287, + 0x0c3913b9, + 0xb04024f5, + 0x3ff6ff02, + 0xf49300ec, + 0x1903a5e0, + 0x27109943, + 0xc6261299, + 0x6414d135, + 0xd1463604, + 0x76046814, + 0x10149945, + 0x02ee44c6, + 0x4d7e00fd, + 0x9fdea7ff, + 0xcea7fffb, + 0x19fd4fff, + 0x7bc301d4, + 0x0f41dc43, + 0xfb9d4ea7, + 0x014319ff, + 0xd8327bc2, + 0x29be5231, + 0xd419ffc8, + 0x437bc301, + 0x191741d8, + 0x012127d3, + 0x3b1207c4, + 0x1d31eb14, + 0xff4ea7d3, + 0x42c5fdcf, + 0x9d1ea768, + 0x1419fffb, + 0x437bc301, + 0x191741d8, + 0x01212713, + 0x3be207c4, + 0x1d3eebe4, + 0xff4ea713, + 0x42c5fdcf, + 0x2705466c, + 0x0ef49b40, + 0x5838c4c5, + 0x020000be, + 0xa542f493, + 0xd6431903, + 0x10bcdc37, + 0xff4ea726, + 0x42d1ffff, + 0x25a60c3c, + 0xafff3ea7, + 0x0b3441fd, + 0x8e340542, + 0x933127fa, + 0x03a513f4, + 0xbcd8431d, + 0x3127dc10, + 0xafff4ea7, + 0x550a07fd, + 0x5717be43, + 0x930927ff, + 0xffd1eaf1, + 0xffb40c9e, + 0xa4f6f493, + 0x06431903, + 0x445abe39, + 0x27ff1eff, + 0xbe1a0700, + 0x5eff573e, + 0x3027feb6, + 0x4fff4ea7, + 0xb50027fd, + 0xacbdbe43, + 0xfe897eff, + 0xbefebb5e, + 0x1eff4037, + 0xff4ea7d9, + 0x43d1feff, + 0x3fe60148, + 0xf75efefd, + 0x99fb4efe, + 0xc007040d, + 0x96050b99, + 0xa7fb8ed4, + 0xffffdf0e, + 0xffb520be, + 0x010fd2d0, + 0x072d07c0, + 0x2304031b, + 0x629ebe21, + 0x27c001ff, + 0x21270c1c, + 0xff6293be, + 0xffdf0ea7, + 0xb4d8beff, + 0x154027ff, + 0x8ec405c4, + 0xa7f54efb, + 0xffffff1e, + 0x0c4718b9, + 0x0c4415b9, + 0x58eef063, + 0x380700b5, + 0x070f3c83, + 0x33238743, + 0x0b422b44, + 0x23d48743, + 0xfff3b8de, + 0xe631d499, + 0x4100984f, + 0x61d971d7, + 0x30d699da, + 0xa3107c18, + 0x1000007e, + 0xd351d481, + 0x00c04ff6, + 0xdb210d07, + 0xa7bedc31, + 0x0fe6ff8a, + 0xd35100c0, + 0xdc35db25, + 0xc30733e3, + 0xc9073902, + 0x0d071a07, + 0xbc072c07, + 0xff5203be, + 0xda61ba0b, + 0x4a073c07, + 0x43c2490b, + 0x2b43074f, + 0x2bc9074a, + 0xffcd03c4, + 0x533c0703, + 0x26d38d3a, + 0x0bba3d27, + 0x3c27f30d, + 0x07f32d28, + 0x113ee337, + 0xd3451004, + 0x7525d69d, + 0x23f001d4, + 0x0703ffcd, + 0x8ac7be1d, + 0x27caa6ff, + 0x75d48540, + 0x45db65dc, + 0x4f85eed7, + 0x430027ff, + 0x27f58ef0, + 0x26d48d40, + 0x27283c27, + 0x0d0bba4d, + 0x75f32df4, + 0x9dd745d9, + 0xf00125d6, + 0x92be1d07, + 0x0d07ff8a, + 0x7e280c03, + 0x4807fec9, + 0x84074103, + 0x4ea78f6b, + 0xbdffffff, + 0x5e0c4748, + 0x33e3ff0a, + 0xa32ba32a, + 0x27ff515e, + 0xff645eb0, + 0x430e0c27, + 0x4ef58ef0, + 0xff4ea7fd, + 0x4d99ffff, + 0x26419927, + 0xb90c1dce, + 0xb60fb444, + 0x13d2c048, + 0xfd8ed486, + 0xff3f73be, + 0x00270346, + 0x489efd0e, + 0x51beff90, + 0x0186ff54, + 0xfd0e0227, + 0xff903a9e, + 0xdaddf093, + 0xbe2d07ff, + 0x1effaee3, + 0x93fd4ed1, + 0x04b73bf4, + 0x43094229, + 0x272632ce, + 0x99f493d0, + 0x42990465, + 0x41439940, + 0x0d07322e, + 0x21befd8e, + 0x0dabff8b, + 0x04864027, + 0xd4074127, + 0xfd8e0d07, + 0x64aaf493, + 0x03240704, + 0x3407c32c, + 0xe37f2ce3, + 0x34197f3c, + 0xc2803c03, + 0xd027f932, + 0xf0930c1e, + 0xbe04648c, + 0x27ff9251, + 0x81f093d1, + 0x15be0464, + 0x0196ffab, + 0x3ea7a81e, + 0x11fdefff, + 0x6a4dd834, + 0x23070efc, + 0xf4e84327, + 0x3ddc2311, + 0x0bf6fc6a, + 0x07fb4efe, + 0x3ec007b1, + 0x070c07de, + 0xb31ea72b, + 0xfb0efefe, + 0x4efb415e, + 0x07c007fb, + 0x07c83eb1, + 0x273b071c, + 0xb32ea700, + 0xfb0efefe, + 0x4efb395e, + 0x640b89f8, + 0x1b07d007, + 0x19330403, + 0x000c0fbe, + 0x018d0ff6, + 0xc668d4c1, + 0x44996cbf, + 0xffcea73c, + 0x9127fbff, + 0x017442f0, + 0x27139c33, + 0x270208ad, + 0xd4b1ff8c, + 0x4be2eb07, + 0x1b07013c, + 0x4eab4907, + 0x04c0c4d5, + 0x04c0c3d1, + 0x271930c8, + 0x22f49b48, + 0xf39b3027, + 0x8b00070e, + 0x22f39bff, + 0x04c0c4d1, + 0xb1e940cc, + 0x30d0c1d2, + 0x2e2b4b07, + 0x412b0e2b, + 0x07a6d389, + 0xc5d2b5b4, + 0xbfab30d0, + 0x249634c6, + 0xbfd60b36, + 0x484f9bae, + 0x271a41dc, + 0x9b02082d, + 0x402722f2, + 0x070ef49b, + 0x9bff8b00, + 0x3f9b22f4, + 0xec31d848, + 0xf88e0027, + 0xf49b4827, + 0x9b302722, + 0x00070ef3, + 0xf39bff8b, + 0xc0c4d122, + 0xe940cc04, + 0xdc484f9b, + 0xfa9b1641, + 0x9b402722, + 0x00070ef4, + 0xf49bff8b, + 0x483f9b22, + 0x9bec31d8, + 0x4c33484f, + 0x1b4c5317, + 0x342b3827, + 0x3ff63783, + 0x4f9b0091, + 0x1641dc48, + 0x2722fa9b, + 0x0ef49b40, + 0xff8b0007, + 0x9b22f49b, + 0x31d8483f, + 0x484f9bec, + 0x02004de3, + 0x8948f49b, + 0x3783a4d3, + 0xffd03d03, + 0x3ea33fab, + 0x9b0f0000, + 0x4f9b40f3, + 0x1641dc48, + 0x2722fa9b, + 0x0ef49b40, + 0xff8b0007, + 0x9b22f49b, + 0x31d8483f, + 0x484f9bec, + 0x02004da3, + 0x2748f49b, + 0xa4d38920, + 0x04c4c2d5, + 0x27a6d189, + 0xc8c2d540, + 0x8d310304, + 0xd38d38d4, + 0x8dd1b5a4, + 0xd48d34d4, + 0xc3bff636, + 0xff135efe, + 0xefabe407, + 0xc15e1e07, + 0x104c27fe, + 0x2807432b, + 0x3123243b, + 0x3c834207, + 0x103c330f, + 0x43ab4fab, + 0x5e40f49b, + 0x9027ff56, + 0x27fe8b5e, + 0x4ef88e04, + 0x3bcf5bf0, + 0x4efe2bdf, + 0xbe0f07fc, + 0x0efffa6f, + 0x0bf00efc, + 0x004f27ff, + 0x29100790, + 0x004f2743, + 0x291007a0, + 0xfc3d1044, + 0x10ff1e03, + 0x1e03fc4d, + 0x2b0307ff, + 0x03000c04, + 0x2703fc0d, + 0x27010c41, + 0x0b040740, + 0x07fd4efe, + 0xc324bed0, + 0x0cd499ff, + 0xd49944b6, + 0x2304070e, + 0x0b300701, + 0x0434993d, + 0x270b42c4, + 0x04349d41, + 0x1e0cd09d, + 0xff4ea714, + 0xd239fd4f, + 0x41274301, + 0x42ab433b, + 0x00a7d43d, + 0xf49b4027, + 0xff3ea70e, + 0x34c5fd4f, + 0x4efd8e38, + 0xbed007fd, + 0x99ffc2da, + 0x44b60dd4, + 0x070ed499, + 0x07012304, + 0x993d0b30, + 0x45960434, + 0x349d4127, + 0x0dd09d04, + 0x2d07181e, + 0x4ea72203, + 0x39fd4fff, + 0x27430121, + 0xab433b41, + 0xa7243d41, + 0x9b402700, + 0x3ea70ef4, + 0xc5fd4fff, + 0xfd8e3834, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x10080100, + 0x0a030209, + 0x19201811, + 0x05040b12, + 0x211a130c, + 0x22293028, + 0x060d141b, + 0x1c150e07, + 0x38312a23, + 0x242b3239, + 0x170f161d, + 0x332c251e, + 0x2d343b3a, + 0x2e271f26, + 0x363d3c35, + 0x3f3e372f, + 0xebef2ea7, + 0x054027fd, + 0x003e2724, + 0x23150500, + 0x0b0ef49b, + 0x19fd4efe, + 0x07432703, + 0x39d333d3, + 0xf50e2901, + 0x021200d4, + 0x073347ff, + 0x0004f10d, + 0xdcff0210, + 0x2427f848, + 0x31034e07, + 0x120002f5, + 0x3387ff02, + 0x32f54a03, + 0xff021200, + 0x30271187, + 0x530f4c83, + 0x0013f5e6, + 0x33ff0216, + 0x4c3314ec, + 0xf54eab10, + 0x021400d3, + 0x04d4f5ff, + 0x9bff0214, + 0xfd8e0ef3, + 0xf193fe4e, + 0x29039f04, + 0x09136912, + 0xff4ea71e, + 0x320bfd4f, + 0x3e2b4211, + 0xe67f4ea7, + 0x08409dfe, + 0x434d4205, + 0x11991349, + 0x9d436d08, + 0x08530941, + 0x40270776, + 0x070ef49b, + 0xa7ff8b00, + 0xfee67f4e, + 0x20273027, + 0x429d4305, + 0x07fe8e08, + 0x03427340, + 0x1ef4e841, + 0x9bfe4ee7, + 0x41d8484f, + 0x270219fb, + 0x33320743, + 0x0034f533, + 0xf1ff0212, + 0x02100031, + 0x33e247ff, + 0x1c53181c, + 0x3919661d, + 0x87253304, + 0x0423f144, + 0x99ff0218, + 0x40f10702, + 0xff021600, + 0x030b1123, + 0x3e87123b, + 0x010b4227, + 0x120034f5, + 0xfe8eff02, + 0x42273e87, + 0x34f50027, + 0xff021200, + 0xfc4efe8e, + 0x31070e31, + 0xe1c2d207, + 0x2b00210b, + 0x05010be1, + 0x91fc8e2e, + 0x99412701, + 0x3e2b2d12, + 0x4123423b, + 0xc38bc407, + 0x4103325b, + 0x310312a1, + 0x33874c2b, + 0x320bd405, + 0xccbe3001, + 0x0c0bff44, + 0xfa4efc8e, + 0x03390219, + 0x0207c007, + 0x44270333, + 0x120004f5, + 0x3387ff02, + 0x20074027, + 0x160034f5, + 0x2403ff02, + 0xc1294327, + 0x24f5f063, + 0xff021200, + 0x100024f1, + 0x48dcff02, + 0x034107f8, + 0x8334274a, + 0x16530f4c, + 0x120023f5, + 0x1c33ff02, + 0x33d02714, + 0x41ab104c, + 0x14000df5, + 0x04f5ff02, + 0xff021404, + 0x510efd9b, + 0xc2c331cb, + 0xc4196c3b, + 0x43f14333, + 0xff021000, + 0x53183c33, + 0x34441d3c, + 0xcb55f043, + 0x2f07fa8e, + 0x1b070c07, + 0x01ff397e, + 0x012f10f2, + 0x27010000, + 0x0000002f, + 0x39c41901, + 0x054533c3, + 0x0043f5f2, + 0xf5ff0218, + 0x02180442, + 0x004e23ff, + 0x4d35fde8, + 0xe8004e03, + 0x1040f5fd, + 0xf5ff0218, + 0x02181442, + 0xf04e23ff, + 0x4d35fde7, + 0xc331f401, + 0xb3cab40b, + 0xc6c441a8, + 0xd307a34f, + 0xdb2bd40b, + 0x199adfc6, + 0xf14333c4, + 0x02100043, + 0x183c33ff, + 0xc01d3c53, + 0xaf278734, + 0x01000000, + 0x0c071b07, + 0xbf7e2f07, + 0x10f101fe, + 0x0000011f, + 0x021a0701, + 0x191d071d, + 0x33c339c4, + 0xf5f10545, + 0x02180043, + 0x0441f5ff, + 0x27ff0218, + 0x004e2320, + 0x4235fde8, + 0xe8004e03, + 0x1040f5fd, + 0xf5ff0218, + 0x02181441, + 0x23f301ff, + 0xfde7f04e, + 0xd32b4235, + 0xdfe6b30b, + 0xc419ff2c, + 0x43f14333, + 0xff021000, + 0x53183c33, + 0x34c41d3c, + 0x55f04398, + 0x4efa8ecb, + 0x07d007fd, + 0xfdf37e0d, + 0x3527d419, + 0xe103e447, + 0x43f54333, + 0xff021200, + 0x43272e87, + 0x120024f5, + 0x21f1ff02, + 0xff021000, + 0x53181c33, + 0x16661d1c, + 0xd499e433, + 0x04e3f107, + 0x23ff0218, + 0x0b143b11, + 0xf5422713, + 0x02120024, + 0x0024f1ff, + 0xdcff0210, + 0x10cef848, + 0x51d019af, + 0x032047d4, + 0x87412b21, + 0x23d45532, + 0x0034f121, + 0xdcff0210, + 0xd339f848, + 0x44271007, + 0x14f51333, + 0xff021200, + 0x40273387, + 0x34f52103, + 0xff021600, + 0x43272287, + 0x24f5d029, + 0xff021200, + 0x100024f1, + 0x48dcff02, + 0x034007f8, + 0x8334274a, + 0x06530f4c, + 0x120023f5, + 0x0c33ff02, + 0x33302714, + 0x40ab104c, + 0x140013f5, + 0x14f5ff02, + 0xff021404, + 0x8e0ef39b, + 0x99f84efd, + 0x82070504, + 0xa107b007, + 0x4ff68f6b, + 0x9ea700cd, + 0x99ffffff, + 0x1399391c, + 0x469db955, + 0x07c30b0c, + 0x6b4c2b4d, + 0xfe4ff64f, + 0xffcea700, + 0xc4b9ffff, + 0x4dee0c44, + 0x3ea700c8, + 0xb9ffffff, + 0xf611983c, + 0x070107cf, + 0xbd41034d, + 0xa70c4634, + 0xfff3bd0e, + 0x4ff60439, + 0x4d0700a1, + 0x070f4c83, + 0x33348724, + 0x0b232b24, + 0x07228724, + 0xb80e2302, + 0x0481fff3, + 0xb4250351, + 0x412733e3, + 0x9d06b89d, + 0xb33505b4, + 0xbc45bc55, + 0xa199b095, + 0x07b19d1c, + 0xb465a451, + 0xc12d019d, + 0xa3c144a4, + 0x5424f540, + 0xc1ff000c, + 0x23f548a4, + 0xff000c50, + 0xa4990445, + 0x30049d61, + 0x9960a499, + 0x4b0619a3, + 0x430b4027, + 0x9924049d, + 0x395639a3, + 0xb41d4327, + 0x4d273927, + 0xb299080a, + 0x2db33d06, + 0x102cc0b4, + 0x04b49968, + 0x41274596, + 0x0704b49d, + 0xfce47e0b, + 0xf88e0027, + 0x4127ff1e, + 0x1ec632c4, + 0xae5dbec6, + 0xff5c5eff, + 0xf3bf0ea7, + 0xae98beff, + 0x44c4b9ff, + 0x2bd4ee0c, + 0x27c491ff, + 0xff4de330, + 0x004e04ff, + 0x31270200, + 0xbd0c0c27, + 0x8e1198c3, + 0xbd0ea7f8, + 0x6fbefff3, + 0x9db9ffae, + 0x4d070c46, + 0x4f6b4c2b, + 0xfeef4fe6, + 0xf88e0b27, + 0x4403b451, + 0x921eb455, + 0x8e0c0c27, + 0x07fc4ef8, + 0x48cf9bd0, + 0x33fbc1d8, + 0xcc5317cc, + 0x9b40271b, + 0x0d074af4, + 0x53fdce7e, + 0x13d051c3, + 0x2bc383c4, + 0x8ed0550c, + 0x99fe4efc, + 0xf0630604, + 0x4c20e107, + 0x8ef04310, + 0xfa14d0fe, + 0x1f07e423, + 0x30272427, + 0x8abefe05, + 0xf043ff49, + 0xfa4efe8e, + 0x07040499, + 0x6bd007b1, + 0x3e4826bf, + 0x91d451a5, + 0x75a027dc, + 0xa64127c4, + 0x07ca65b6, + 0x2746f6b4, + 0x31cb9d40, + 0x9d05da9d, + 0xfa8e04d4, + 0xca654027, + 0x41a6b407, + 0x0d07d151, + 0xf493a03e, + 0x51039a08, + 0x7442c1d3, + 0x43c5320b, + 0x4ed51e74, + 0x07fa63f8, + 0x3a11e0b1, + 0xf911f401, + 0x03a00700, + 0x9c2710ac, + 0x390123a0, + 0x27c0270e, + 0xca312721, + 0x4f0711e2, + 0x21034c0b, + 0x1da3cc54, + 0xc2c10343, + 0x3103f12e, + 0x21274307, + 0x3c34400b, + 0x1e4e1911, + 0x0b3f07df, + 0x1d40273c, + 0x07e02734, + 0x194e0b4a, + 0x07f11943, + 0x27df0743, + 0x0f4c8300, + 0x6b10bcd0, + 0x24532307, + 0x33102c23, + 0xd4240b44, + 0x1926a02c, + 0x103c27d4, + 0x8007342b, + 0x3807833b, + 0x3fab4123, + 0x0b0f4c83, + 0x333b3329, + 0x34ab1b4c, + 0x23f52287, + 0xff060000, + 0x41034007, + 0xe1030407, + 0xecc20fab, + 0x26d23932, + 0x0341072b, + 0x07304741, + 0xab4f6b03, + 0xf442ce0f, + 0x0726ceca, + 0x0b4a0714, + 0x0343194e, + 0x834307d1, + 0xbcd40f4c, + 0x4cd49710, + 0x2407c70c, + 0xd4399e1e, + 0x07e114ce, + 0xca2fd624, + 0x4910bcc0, + 0x1811bcc4, + 0xfa934ea7, + 0x003f27f9, + 0x05080000, + 0x002f2743, + 0x234ff400, + 0x27420544, + 0x0ef49b40, + 0xf88efa43, + 0xc0101c20, + 0x1e10111c, + 0x03a007ff, + 0x0c032cac, + 0x5e90271c, + 0xa007fefd, + 0x03faac03, + 0x9c27ea0c, + 0xfeef5eae, + 0xfd4b4ea7, + 0x003f27f9, + 0x051d0000, + 0x002f2743, + 0x2357f900, + 0x1e420544, + 0x03a007bb, + 0x0c03deac, + 0x4e9d27ce, + 0xfec75e01, + 0xfc93fc4e, + 0xc10397e8, + 0x052668c0, + 0xf6fd0499, + 0x9300834f, + 0xffd9fbfd, + 0x10270d07, + 0x07fe927e, + 0x101c270d, + 0x07fe8a7e, + 0x7e11270d, + 0x0d07fe83, + 0x7e111c27, + 0x4f27fe7b, + 0x76000011, + 0x9ba0f49b, + 0x31dc483f, + 0x082d271a, + 0x22f29b02, + 0xf49b4027, + 0x8b00070e, + 0x22f49bff, + 0xd8483f9b, + 0x4d27ec31, + 0xf49b0200, + 0xa0c3c148, + 0x89a3f39b, + 0xc28938c4, + 0x34c38936, + 0x07ff4d83, + 0xffff1ea7, + 0xff3d83fb, + 0x104c3307, + 0x07ff2d83, + 0x04c413d5, + 0x14d542ab, + 0xfc8e04c8, + 0xdd03d007, + 0x7d5e0100, + 0x27fd4eff, + 0x07402730, + 0x38038dd0, + 0x8d3a049d, + 0x038d3403, + 0xff4e7e36, + 0x1d070d07, + 0x0359d299, + 0x3c1c0304, + 0x86fc047e, + 0x99fd8e04, + 0x4cc054d4, + 0xd4893910, + 0x104cdc94, + 0xcdf45329, + 0x89d40503, + 0xd28964d4, + 0x70d3c166, + 0x232b249b, + 0xc5a6d489, + 0x44d630d2, + 0xfd8ed2b5, + 0x42c2d4b5, + 0x8ed2b5cd, + 0x51f493fd, + 0xd405ff51, + 0xf493d61e, + 0x05ff487d, + 0x4ecd1ed4, + 0x91fa93fa, + 0xa4190397, + 0xf39345a6, + 0x99045ab0, + 0x4fd60534, + 0x9b44276f, + 0xfb9321f4, + 0xa70396c0, + 0xfeffffce, + 0x0876081e, + 0xd60ac499, + 0x93b40147, + 0x0396abf0, + 0xd007f48b, + 0xeb0d0cc4, + 0xe80d0e27, + 0xf84e7e03, + 0xc60ac499, + 0x9b402740, + 0xd44c21f4, + 0x4ea73027, + 0xbdfeffff, + 0x19198843, + 0xc04536a4, + 0x0d0712d3, + 0x3027fa8e, + 0x5a52f493, + 0x06439d04, + 0x27f0d3c4, + 0x37f313d0, + 0x9716f493, + 0x050d0703, + 0x99fa8e43, + 0x4fd60634, + 0x0434998d, + 0x598741dc, + 0x104cd434, + 0x330ea781, + 0x42befffd, + 0x04ecffab, + 0x3ebeff75, + 0x35be0038, + 0xd027ffef, + 0xfd4eb51e, + 0xfce30ea7, + 0xf6b9beff, + 0x9900e8ff, + 0xd9fe9300, + 0xe3c10396, + 0x0ce18960, + 0x07283489, + 0x33300720, + 0x9b353323, + 0x07322b41, + 0x68e4c52e, + 0xfcd43e23, + 0x642c03ff, + 0x4627d627, + 0xd1232101, + 0x24033105, + 0xf4983403, + 0x04fd4227, + 0xff000320, + 0xffff3ea7, + 0xbd4127ff, + 0x99046634, + 0x40270f32, + 0x270ef49b, + 0xf5228741, + 0x02b04024, + 0x79f393ff, + 0x40270396, + 0x190ee49d, + 0x6ef21331, + 0xffff3ea7, + 0x61f493fe, + 0x3dbd0396, + 0x42051988, + 0x002714d6, + 0xf2befd8e, + 0xf4930038, + 0x99045978, + 0x32160543, + 0xffee8fbe, + 0xfd8e0027, + 0xfd8e0627, + 0xd007fc4e, + 0x867ec107, + 0x270c22f7, + 0x07fc8e00, + 0xf9817e0d, + 0xd431d151, + 0x41ca1c0b, + 0x41102712, + 0xf6140ad4, + 0x7e0d0715, + 0x0027f802, + 0x142bfc8e, + 0x0d07ee1e, + 0xff4edabe, + 0x8eeb04c8, + 0x93f64efc, + 0x0395fbfc, + 0x4586c419, + 0x591af393, + 0x05349904, + 0xf9934c76, + 0x990395ec, + 0x96c10e9d, + 0x5edfc660, + 0x949d4427, + 0x2764510e, + 0x99942530, + 0x40275066, + 0x9d78948d, + 0x4ea76496, + 0xbdfeffff, + 0x53198843, + 0x93fe26f2, + 0x0395b3f4, + 0x00273027, + 0x93c54205, + 0x99f68e74, + 0x4fd60634, + 0x043499ba, + 0x59b441dc, + 0x104cd434, + 0x330ea7ae, + 0xdabefffd, + 0x04ccffa9, + 0x36d7bea2, + 0xedcebe00, + 0x8e0027ff, + 0x330ea7f6, + 0x0abefffd, + 0x8007fff5, + 0xffff0fe0, + 0x00b7ffff, + 0x4fff4ea7, + 0x074301fd, + 0x66939d40, + 0x9dc54333, + 0xa1f3936c, + 0xf2930390, + 0xf10395d3, + 0x0002e041, + 0xdc4cf1ff, + 0xe3ff0002, + 0x2ce37f3c, + 0x0334197f, + 0x32c2803c, + 0x6090c1f9, + 0xa007c906, + 0x7c27b107, + 0x070b0740, + 0x41cc10dc, + 0x1d07d707, + 0xfff2aebe, + 0x1d070a07, + 0x8ebecd2b, + 0xbd0bfff2, + 0xc076ad0b, + 0x84fd4027, + 0xff0002d0, + 0xfd333ea7, + 0x763479ff, + 0x2741274a, + 0x609dc130, + 0x2d0e949d, + 0x18d49993, + 0x94eefc93, + 0x104cc003, + 0x28d18925, + 0xbe34d0c1, + 0xabffb726, + 0x89c04d0f, + 0x040b4cd4, + 0x5e0cc08d, + 0x0ea7fef0, + 0xbefffd31, + 0x1effa83b, + 0x0cc38dc5, + 0xdd5ec34d, + 0xff4ea7fe, + 0x4211feff, + 0xffff3ea7, + 0x5431d1ff, + 0x19228704, + 0xb821f5c4, + 0x06ff000f, + 0x93302746, + 0x0457bff4, + 0x439d0527, + 0x27f68e06, + 0x4ef68e05, + 0x11d107fd, + 0x7d12c211, + 0xd3010419, + 0x320b4533, + 0x0139211b, + 0x180043f5, + 0x42f5ff02, + 0xff021804, + 0x4e233027, + 0x35fde800, + 0x004e0343, + 0x41f5fde8, + 0xff021810, + 0x181442f5, + 0x4e23ff02, + 0x27fde7f0, + 0x21433520, + 0x31eba6de, + 0x191b26d1, + 0x33e20b04, + 0x39211b45, + 0x004ef501, + 0xf5ff0218, + 0x02180442, + 0x233027ff, + 0xfde8004e, + 0x4e034335, + 0xf5fde800, + 0x02181041, + 0x1442f5ff, + 0x23ff0218, + 0xfde7f04e, + 0xfd8e4335, + 0xbc1e212b, + 0xfb93f94e, + 0xc1039400, + 0xb24960b3, + 0x070cb489, + 0x3033c1c0, + 0x00f724ea, + 0xf63004c1, + 0xa700d14f, + 0xfbffff3e, + 0x04c034d1, + 0x071b40c8, + 0x9b482723, + 0x302722f4, + 0x070ef39b, + 0x9bff8b00, + 0x24d122f3, + 0x40cc04c0, + 0x484f9be9, + 0x271a41dc, + 0x9b02082d, + 0x402722f2, + 0x070ef49b, + 0x9bff8b00, + 0x3f9b22f4, + 0xec31d848, + 0x33484f9b, + 0x4c53174c, + 0x2b28271b, + 0x66278324, + 0x103c2727, + 0x4c27322b, + 0x3b2123ff, + 0x0f2c8343, + 0xab102c33, + 0x9b42ab4f, + 0x4f9b40f4, + 0x1a41dc48, + 0x02082d27, + 0x2722f29b, + 0x0ef49b40, + 0xff8b0007, + 0x9b22f49b, + 0x31d8483f, + 0x484f9bec, + 0x02004de3, + 0x2748f49b, + 0x0fffd93e, + 0x9b40f39b, + 0x41dc484f, + 0x082d271a, + 0x22f29b02, + 0xf49b4027, + 0x8b00070e, + 0x22f49bff, + 0xd8483f9b, + 0x4f9bec31, + 0x004da348, + 0x48f49b02, + 0xd403dc07, + 0xd007051e, + 0x0d07d403, + 0x07f87c7e, + 0x7e11270d, + 0xf453f8c2, + 0x3027faf9, + 0xc4050327, + 0x8e68c3c5, + 0x0fb499f9, + 0x42874cf6, + 0x4001430b, + 0x0c2704f6, + 0x27f98e0d, + 0x6cbe401c, + 0xb2c1fff0, + 0xf82fe66c, + 0x030b0704, + 0x1c27200c, + 0xf043be40, + 0x60b4c1ff, + 0x44c10b07, + 0x271b073c, + 0x100c0320, + 0x95441c03, + 0xfe297eb4, + 0xb2494127, + 0x160fb49d, + 0x3ac49925, + 0x07744fc6, + 0xf045be0c, + 0x6904ccff, + 0x995cb099, + 0xfd935dbe, + 0xee039294, + 0x8704720e, + 0x48d1c130, + 0x107434f1, + 0x32f1ff00, + 0xff001154, + 0x428b410b, + 0x34f5c027, + 0xff001074, + 0x11340cfd, + 0xd1c1ff00, + 0x87180650, + 0x7443f14e, + 0xf1ff0010, + 0x00115442, + 0x8b310bff, + 0x7443f532, + 0xfdff0010, + 0x001134ec, + 0x27b349ff, + 0x27310340, + 0x0fb49d00, + 0xf98eb34d, + 0xff2403e0, + 0xdc07f98e, + 0x0d07d403, + 0x027e1d27, + 0x7e68c9c1, + 0x0156fbe4, + 0xdc484f9b, + 0x2d271a41, + 0xf29b0208, + 0x9b402722, + 0x00070ef4, + 0xf49bff8b, + 0x483f9b22, + 0x9bec31d8, + 0x4de3484f, + 0xf49b0200, + 0xd83e2748, + 0xf39b0fff, + 0xe04e2740, + 0xf49b0fff, + 0x103e2740, + 0xf39b0f00, + 0x0ef29340, + 0x3527ffd2, + 0x48332419, + 0x00004ea3, + 0x40f49b07, + 0xf3782103, + 0x01004e27, + 0x40f49b07, + 0x2740f49b, + 0x0700003e, + 0x2740f39b, + 0x0f00014e, + 0x9b40f49b, + 0xf39b40f4, + 0x40f39b40, + 0xffdb2e27, + 0x68cec10f, + 0x2740f29b, + 0x0f00434e, + 0x9b40f49b, + 0xf09340f3, + 0x07fff1d0, + 0x402c2710, + 0x3e0b1319, + 0x333d3499, + 0x004ea348, + 0xf49b0700, + 0x50110340, + 0xdb4e27f2, + 0xf49b0fff, + 0x433e2740, + 0xf39b0f00, + 0x004e2740, + 0xf49b0701, + 0x2b210740, + 0x0b031920, + 0x7d34993e, + 0x4ea34833, + 0x9b070000, + 0x010340f4, + 0x9fe6f250, + 0x9499034a, + 0x434fe6fd, + 0x03d90703, + 0x270100dd, + 0x0fffc44e, + 0x0740f49b, + 0x03d019ed, + 0x112710ec, + 0x070f2c27, + 0x19310b3d, + 0x0b110334, + 0xab040740, + 0x03f2780f, + 0x4007130c, + 0x4ea34fab, + 0x230f0000, + 0xf49b130c, + 0x003e2740, + 0xf39b0700, + 0x27102740, + 0x3d07102c, + 0x3419310b, + 0x4ea34833, + 0x9b070000, + 0x110340f4, + 0x0746f258, + 0x10272007, + 0x310b3e07, + 0x48333419, + 0x00004ea3, + 0x40f49b07, + 0xf2581103, + 0xffc44e27, + 0x40f49b0f, + 0xad07ed07, + 0x031cd099, + 0xac031cec, + 0x2711272c, + 0x3e070f2c, + 0x3419310b, + 0x400b1103, + 0x0fab0407, + 0x0c03f278, + 0xab400713, + 0x004ea34f, + 0x0c230f00, + 0x40f49b13, + 0x10003e27, + 0x40f39b07, + 0x2c271027, + 0x0b3e0710, + 0x33341931, + 0x004ea348, + 0xf49b0700, + 0x58110340, + 0x070746f2, + 0x07102720, + 0x19310b3a, + 0xa3483334, + 0x0700004e, + 0x0340f49b, + 0x27f25811, + 0x0fffc44e, + 0x0740f49b, + 0x99ad07ed, + 0xec03ced0, + 0xdeac03ce, + 0x2c271127, + 0x0b3e070f, + 0x03341931, + 0x07400b11, + 0x780fab04, + 0x130c03f2, + 0x4fab4007, + 0x00004ea3, + 0x130c230f, + 0x2740f49b, + 0x0701003e, + 0x2740f39b, + 0x102c2710, + 0x310b3e07, + 0x48333419, + 0x00004ea3, + 0x40f49b07, + 0xf2581103, + 0x20070746, + 0x3a071027, + 0x3419310b, + 0x4ea34833, + 0x9b070000, + 0x110340f4, + 0x4e27f258, + 0x9b0fffc4, + 0xed0740f4, + 0x03ead099, + 0xdc03eaec, + 0x271127fa, + 0x3e070f2c, + 0x3419310b, + 0x400b1103, + 0x0fab0407, + 0x0c03f278, + 0xab400713, + 0x004ea34f, + 0x0c230f00, + 0x40f49b13, + 0x11003e27, + 0x40f39b07, + 0x2c271027, + 0x0b3e0710, + 0x33341931, + 0x004ea348, + 0xf49b0700, + 0x58110340, + 0x070746f2, + 0x07102720, + 0x193d0b31, + 0xa3483334, + 0x0700004e, + 0x0340f49b, + 0x89f25811, + 0x2746a6c2, + 0xffdd4e27, + 0x40f49b0f, + 0x00043e27, + 0x40f39b0f, + 0x00002ea3, + 0x40f29b0f, + 0x893c9e99, + 0x92891291, + 0xc04e2714, + 0xf49b0fff, + 0x113e2740, + 0xf39b0f00, + 0x004e2740, + 0xf49b0708, + 0x002ea340, + 0xf29b0f00, + 0x001ea340, + 0xf19b0f00, + 0x004e2740, + 0xf49b0703, + 0x27002740, + 0x003e2711, + 0xde270310, + 0x27070100, + 0x070000ae, + 0x20002e27, + 0x6b400703, + 0xa348334f, + 0x0700004e, + 0xb640f49b, + 0xefe3e007, + 0x40f29b00, + 0x9b0de2c0, + 0xfa9b40f2, + 0x03010340, + 0x9bdb1e11, + 0xf31e40f3, + 0x9b40f39b, + 0xfd9b40f3, + 0xea13c840, + 0xffda4e27, + 0x40f49b0f, + 0x000c3e27, + 0x40f39b0f, + 0x03004e27, + 0x40f49b07, + 0x42072027, + 0x48334f6b, + 0x1e273127, + 0x27071100, + 0x0700000e, + 0x00004ea3, + 0x40f49b07, + 0xf09b2736, + 0x07210340, + 0x334f6b42, + 0xa3310348, + 0x0700004e, + 0x6640f49b, + 0x40f19b21, + 0x27e733c8, + 0x0700004e, + 0x2740f49b, + 0x073f003e, + 0x9b40f39b, + 0x3f9b40f4, + 0x1a31dc48, + 0x02082d27, + 0x2722f29b, + 0x0ef49b40, + 0xff8b0007, + 0x9b22f49b, + 0x31d8483f, + 0x484f9bec, + 0x02004da3, + 0x2748f49b, + 0x3ac39d31, + 0xc1fb7a5e, + 0x2e8748d0, + 0xf150d4c1, + 0x00107421, + 0x5423f1ff, + 0x0bff0011, + 0x8b410b40, + 0xf5302743, + 0x00107424, + 0x34e3fdff, + 0x5eff0011, + 0xfd93fbad, + 0x5effcf58, + 0xf39bfcbf, + 0x40f29b40, + 0x99ff155e, + 0x3ea708b4, + 0x33fddfff, + 0x4ea30c4c, + 0xd5100000, + 0xd5020834, + 0xa7020832, + 0xfd4fff4e, + 0xb3c54311, + 0xfae75e6c, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x08050508, + 0x1e19140c, + 0x09070606, + 0x1b1e1d0d, + 0x0c080607, + 0x1c221c14, + 0x0e0b0807, + 0x1f282b19, + 0x1c120b09, + 0x26333622, + 0x201b110c, + 0x2e383428, + 0x2b272018, + 0x323c3c33, + 0x312f2e24, + 0x31333238, + 0x170c0908, + 0x31313131, + 0x210d0a09, + 0x31313131, + 0x311c0d0c, + 0x31313131, + 0x31312117, + 0x31313131, + 0x31313131, + 0x31313131, + 0x31313131, + 0x31313131, + 0x31313131, + 0x31313131, + 0x31313131, + 0x31313131, + 0x170c0908, + 0x31313131, + 0x210d0a09, + 0x31313131, + 0x311c0d0c, + 0x31313131, + 0x31312117, + 0x31313131, + 0x31313131, + 0x31313131, + 0x31313131, + 0x31313131, + 0x31313131, + 0x31313131, + 0x31313131, + 0x31313131, + 0x5ef2f393, + 0x20340103, + 0x01211d4f, + 0x694fc000, + 0x0b00012b, + 0xf453ff1e, + 0x34050b11, + 0xf453fe0b, + 0x340500bd, + 0xf4933027, + 0x9d0421f8, + 0xfe0b0643, + 0xff71869e, + 0x4127fe4e, + 0x3e06049d, + 0xb702bef4, + 0x8e0027ff, + 0x715f9efe, + 0xff2ea7ff, + 0x03c1ffff, + 0x5424d144, + 0x0e34ce04, + 0x045423d5, + 0xfd330ea7, + 0x960439ff, + 0x9efe0b44, + 0xa7ff7207, + 0xffffff4e, + 0xb9fc43c1, + 0xca010044, + 0x430b1303, + 0x830e40c2, + 0x03330f0c, + 0x007c00f9, + 0xfe0bff00, + 0xfe0b0027, + 0x00dbf453, + 0x00270415, + 0xfd4efe0b, + 0xf193d007, + 0x27032f60, + 0x26ec2700, + 0x12011411, + 0x420b1403, + 0x3c533407, + 0x73340b1f, + 0x0a3dda31, + 0xfe380103, + 0x8e640c27, + 0x150cc8fd, + 0x0b40870e, + 0x500c2304, + 0xed650ccc, + 0x00ccfd8e, + 0x8e0027eb, + 0x93f94efd, + 0x04213ff9, + 0x6ee2fb93, + 0x9d402704, + 0xab076594, + 0xda07b411, + 0xf48b0a07, + 0x06f6c007, + 0x4246a419, + 0x4ea73027, + 0xbdfeffff, + 0x1d197c43, + 0x8e0c07b3, + 0x1d3027f9, + 0x1904cca3, + 0xffff4ea7, + 0x7c43bdfe, + 0x0a03c419, + 0x27fedb7e, + 0x8e0c07c0, + 0xde02c4f9, + 0x20eef093, + 0xff137e04, + 0xd6059499, + 0xff4ea747, + 0x4311feff, + 0xffff2ea7, + 0x5424d1ff, + 0x07338704, + 0xb834f50c, + 0x8eff000f, + 0x93c44cf9, + 0x0420c3f0, + 0xd15ef90e, + 0xbe0c07fe, + 0x1efef79c, + 0x07fc4eef, + 0x13bbbec0, + 0x80c3c1ff, + 0xc189c221, + 0x0331037e, + 0x53110321, + 0x270151f4, + 0xc5c41500, + 0xc22580c3, + 0x8e7ec18d, + 0x27f54efc, + 0xe30ea7d0, + 0xeabefffc, + 0xf893ffbc, + 0xa704207c, + 0xfd4fff5e, + 0x6dcaf693, + 0xe0b00704, + 0xffffff0f, + 0x0700f3ff, + 0x33200740, + 0x2b253343, + 0x2c29f924, + 0xf1ff0003, + 0x00033023, + 0x334907ff, + 0x604f0343, + 0xc1000542, + 0x3f03884d, + 0x80000000, + 0x47c1d315, + 0x07a20784, + 0x0f0c8307, + 0x30871007, + 0x132b1433, + 0x43334107, + 0xc407410b, + 0xc40bc333, + 0x52d0cf03, + 0xc3c10005, + 0xd4ae23ac, + 0x34c1fffc, + 0xa44ff64c, + 0x3424f100, + 0xc5ff0003, + 0x24f94c34, + 0xff00032e, + 0x016434c5, + 0xf04d5cd4, + 0x004f3cff, + 0x110fff00, + 0x8434c554, + 0x010b6201, + 0x420b4087, + 0x113c41d1, + 0x40d1a241, + 0xa3891140, + 0x0b210b14, + 0x4043d530, + 0x3c42d511, + 0x8083c111, + 0x493b4127, + 0x83c534eb, + 0x0ccd9980, + 0xcd9dd123, + 0x2384590c, + 0x27845d41, + 0x20b4fd40, + 0xa7ff0003, + 0xfffce33e, + 0x49563479, + 0x84c1d5f6, + 0x07474e44, + 0xbe08071c, + 0x27ff1156, + 0xe30ea7d1, + 0xeabefffc, + 0xb007ffbb, + 0xffff0fe4, + 0xff11ffff, + 0xf58e0d07, + 0xfce10ea7, + 0x6fb9beff, + 0xf1ce1eff, + 0x0003342e, + 0xec4e1bff, + 0xc5ff6640, + 0x24f94c3e, + 0xff00032e, + 0x5e6434c5, + 0xf54eff57, + 0x1f46f793, + 0xdd71b904, + 0xdc76b902, + 0x1b410702, + 0x07f32346, + 0x6bf195d4, + 0xbe8007df, + 0xc1ff00df, + 0x3ff64473, + 0x21270150, + 0x4387f2a5, + 0x43f5f3a1, + 0x0004585c, + 0x02d874d1, + 0xd8d4f4b5, + 0x35f99334, + 0x0f07042e, + 0x30a2f193, + 0x43b9be03, + 0x090866ff, + 0xb94dc0f4, + 0x4dc0320b, + 0xc43e0bbb, + 0x2e0bbc4d, + 0xf093f129, + 0x07033084, + 0x07e2be29, + 0xd3d8d0ff, + 0xf291f4b1, + 0x02dc76bd, + 0x4f6b422b, + 0x01b04dea, + 0x030d0c27, + 0x29f58ef3, + 0x48acc0fa, + 0x9306271e, + 0xff9b46f1, + 0xff6a9c9e, + 0xf093f129, + 0x0703304c, + 0x086ebe29, + 0x9bd8d0ff, + 0xfb93c71e, + 0x8903303c, + 0xc1e018bc, + 0xb14106ab, + 0x1102cdc0, + 0x03cdf026, + 0xc001fe11, + 0x1b3104cd, + 0x3105cdf4, + 0xcd400405, + 0xcdf01121, + 0x04cf1122, + 0x1201cd00, + 0x2104cde4, + 0x3c0703f7, + 0xf60f3c53, + 0xa700ba3f, + 0xfd4fff2e, + 0x5c7424c1, + 0x0000004f, + 0x21cd4001, + 0x21cd2001, + 0xf0ccfc11, + 0xcde00512, + 0x02050281, + 0x064611fc, + 0x066312fc, + 0x065418fc, + 0x00a314f8, + 0x8516b489, + 0x684fe6f4, + 0x14b58906, + 0x066c5fe6, + 0x4d3074a9, + 0x42eaf281, + 0xf293066d, + 0xa9041e10, + 0xea4d3224, + 0xe6066b45, + 0xfc019b3f, + 0x06d0301c, + 0xc0c01cfc, + 0x001dfc06, + 0xb106f103, + 0xe04ff6b4, + 0x91b47106, + 0x004ff4b3, + 0x95700000, + 0x93062703, + 0xff977af1, + 0xff69c09e, + 0x41234307, + 0x000f4f83, + 0x40e88000, + 0x448701a9, + 0x585c44f1, + 0x3f830004, + 0x8000000f, + 0x30ecf4a5, + 0x3123fe96, + 0xfff03fa3, + 0x3103ffff, + 0xa7fe895e, + 0xfd4fff2e, + 0xfc7424c1, + 0x8000004e, + 0x0427ff3b, + 0x94cef193, + 0x69779eff, + 0x001ef8ff, + 0x05f50100, + 0x47834607, + 0x36333407, + 0x342b4333, + 0xc333c307, + 0xbc07c32b, + 0x4260bf03, + 0xb4d10005, + 0x0c0702e0, + 0x42a347e3, + 0xb4d52a07, + 0xf19302e0, + 0x03032ef8, + 0x05454c0f, + 0x6038be00, + 0x40cf03ff, + 0x07000545, + 0xbe19070c, + 0xd1ff0736, + 0x030f2471, + 0xe4b1d561, + 0x2470d102, + 0x03f1a10f, + 0x7c46be01, + 0x2470d5ff, + 0xf0d1030f, + 0x5efe19d8, + 0xf4b1fe44, + 0x1ab6fb93, + 0x07478304, + 0x33363334, + 0x07342b43, + 0x2b233323, + 0x93020723, + 0x041cfff4, + 0x45402f03, + 0x42d50005, + 0x0f0302d4, + 0x00054594, + 0xff0764be, + 0xbc033b07, + 0xe32b07ff, + 0x2ce37f3c, + 0xffbc237f, + 0x3c033419, + 0xf932c280, + 0x1a6ef393, + 0x27202704, + 0x3205404c, + 0xf4c83403, + 0x02d47cd1, + 0x7124c089, + 0xfde9bec1, + 0x3cb09dfe, + 0xa4fcca71, + 0xf4530130, + 0x38070a67, + 0x3c032027, + 0x150027d0, + 0x27f30384, + 0x4883c540, + 0x9dd6849d, + 0x828dd782, + 0xe0f58ed4, + 0x1f0182cd, + 0x83cdf4fe, + 0xe0021901, + 0x130104cd, + 0x21cde0fe, + 0xe4fe0d01, + 0xfc0102cd, + 0xfe045e01, + 0xdfc01cfc, + 0xbe0c0704, + 0xc4fefd93, + 0xcdc05d02, + 0xc0580182, + 0x531102cd, + 0x0102cdc0, + 0x834c074e, + 0x4744c047, + 0xf1930627, + 0x9eff9928, + 0xa7ff6825, + 0xfd4fff2e, + 0xfc7424c1, + 0x1000004e, + 0x0427fdf0, + 0x93baf193, + 0x680b9eff, + 0xa34123ff, + 0xfffff04f, + 0x874103ff, + 0x5c44f144, + 0x83000458, + 0x00000f3f, + 0xecf4a580, + 0x5efce530, + 0xb089fe4e, + 0xd60fe640, + 0x42bb8904, + 0x048dbfe6, + 0x0301cde0, + 0xcdf403b1, + 0x01d40302, + 0x0121cde0, + 0xcdf40246, + 0x03550122, + 0x0102cde0, + 0xcde403b8, + 0x01d90104, + 0x40271127, + 0xf1753087, + 0xf465f315, + 0xf435f425, + 0xf455fb45, + 0x2d56f293, + 0x27102703, + 0xe2f371c0, + 0x07028431, + 0x0b44034f, + 0xc14e014c, + 0x3efa3423, + 0x4f070484, + 0x71104c03, + 0x014c0b23, + 0x003ff444, + 0x94700000, + 0x93062702, + 0xff96d0f1, + 0xff67689e, + 0x0724cd89, + 0x930d071a, + 0x041b37f9, + 0xfefca2be, + 0xe6159499, + 0x9901864f, + 0x9e991691, + 0x23182317, + 0x10acf8e8, + 0xcd89016e, + 0x20c28922, + 0x2ea48489, + 0xa6848942, + 0x01e84dee, + 0x2ff6fc93, + 0xca8e9d03, + 0x8da4828d, + 0x809da68d, + 0xc9819dcb, + 0xfefce2be, + 0x79cd809d, + 0xa68e89cc, + 0x99c88c9d, + 0x01271a94, + 0x02d0ed14, + 0x00470027, + 0x02394fe6, + 0x27a48189, + 0x0f1c0340, + 0x2d832107, + 0x3207fff0, + 0x849d3453, + 0xac838d8c, + 0x9d8a849d, + 0x828d8b84, + 0x3cb49998, + 0xe00f1c23, + 0xe0021841, + 0x07028c42, + 0x0321073e, + 0x3d830f3c, + 0x2703fff0, + 0xfff82d83, + 0x44534307, + 0x13531207, + 0x27ae848d, + 0x8d04004d, + 0x848dac81, + 0x9a838db2, + 0x8998828d, + 0x8389ac82, + 0x274827ae, + 0x27329b10, + 0x8d2933c0, + 0x0807b084, + 0x01004d27, + 0x9dc482c5, + 0x83c58681, + 0xb8848db4, + 0x8d84819d, + 0x0c03ba8c, + 0xf9d3be84, + 0xcd8299fe, + 0x9d628c9d, + 0xcf5e6082, + 0x01cdf4fd, + 0x2700b280, + 0x80f19306, + 0x529eff91, + 0xcde0ff66, + 0xfbfc0281, + 0x0282cdf0, + 0xcde000b0, + 0xfbf00301, + 0x0321cdc4, + 0xfbe85edf, + 0x4ff4430b, + 0xf0000001, + 0x3fe6fc65, + 0xb48102f1, + 0x02e04ff6, + 0x4ff6b4a1, + 0xb4c102f0, + 0xa944fc34, + 0x89f481fc, + 0x4c0330b3, + 0xe244530f, + 0x27fc9b43, + 0x5df19306, + 0xfe9eff94, + 0xcdc0ff65, + 0xf4741121, + 0x571122cd, + 0x02cde001, + 0xe001e711, + 0x311104cd, + 0x21cde0fe, + 0x27018503, + 0xecf19306, + 0xd69eff94, + 0xcd89ff65, + 0x22c28920, + 0xc0fe935e, + 0x750321dd, + 0x0322ddd4, + 0x82ddc05b, + 0xddc06b01, + 0xc0660281, + 0x610121dd, + 0xe0271027, + 0xf0fe685e, + 0x578003cd, + 0x034c07fb, + 0xab7fdf4d, + 0x4b42f04f, + 0xff3d5efb, + 0x0201cde4, + 0x3f5eff37, + 0x04cde4fb, + 0x5eff2e11, + 0x4b07fb36, + 0x30274103, + 0x20874153, + 0xf1751127, + 0xf445f215, + 0xf325f365, + 0xf355f335, + 0xc0fdc75e, + 0x111121dd, + 0x1121ddd0, + 0xdfdd03ac, + 0xab4d077f, + 0xa142d44f, + 0x4fff4ea7, + 0x7443c1fd, + 0x8499971e, + 0x1540eecb, + 0xc98499fe, + 0xfe0e41ee, + 0xeeca8499, + 0x93fe07e4, + 0x032dfbfc, + 0x4fe6c439, + 0x8399fc96, + 0xeec479c8, + 0x5efdf843, + 0x0427fc8a, + 0x908ff193, + 0x65139eff, + 0xf62471ff, + 0xa1015b4f, + 0x554ff624, + 0x3424c101, + 0x01a64ff6, + 0xc4031103, + 0x13e42403, + 0xf481fd5d, + 0x018b04ea, + 0xfb7e5be2, + 0xf1930627, + 0x9eff952b, + 0x9bff64e1, + 0xf4430b4e, + 0x0000014f, + 0xa1fd64f0, + 0xd14fc624, + 0xf1930627, + 0x9eff945a, + 0xbeff64c5, + 0x89fefa9b, + 0xc15ea68e, + 0x034e07fd, + 0x4d830f4c, + 0x3407fff0, + 0x2d273453, + 0x838d0300, + 0xb2828dae, + 0x5e9a848d, + 0xcde0fdff, + 0xfce22104, + 0x3104cde0, + 0xcde4fcdc, + 0xfead1201, + 0x41034b07, + 0x41533027, + 0xf1751227, + 0xf365f455, + 0xf025f015, + 0xfb45f335, + 0xc0fccf5e, + 0xe10201cd, + 0x0281cdc0, + 0x82cde46b, + 0x5efe8201, + 0x4b07fca8, + 0x41534103, + 0x23273047, + 0xf315f275, + 0xf025f465, + 0xfb45f035, + 0xa15ef455, + 0x034e07fc, + 0xf84d8347, + 0x533407ff, + 0x002d2733, + 0xae838d02, + 0x8db2828d, + 0x885e9a84, + 0x074007fd, + 0x0341033b, + 0x53415331, + 0x75132731, + 0x65f435f1, + 0x25f015f3, + 0x55fb45f4, + 0xfc665ef3, + 0x40272127, + 0xf2753047, + 0x07fc4f5e, + 0x4741034b, + 0x53202730, + 0x75122741, + 0x55f325f1, + 0x15f265f4, + 0x45f235f3, + 0xfc3e5efb, + 0xf1930627, + 0x9eff8fb5, + 0x07ff63d5, + 0x50e5be0b, + 0x5efa29ff, + 0x0627fa5c, + 0x901df193, + 0x63bf9eff, + 0x930627ff, + 0xff8fdaf1, + 0xff63b49e, + 0xf1930627, + 0x9eff9372, + 0x27ff63a9, + 0x36f19306, + 0x9e9eff90, + 0x0627ff63, + 0x904ef193, + 0x63939eff, + 0x930627ff, + 0xff9067f1, + 0xff63889e, + 0xf1930627, + 0x9eff907a, + 0x27ff637d, + 0xf0f19306, + 0x729eff93, + 0x0627ff63, + 0x91fcf193, + 0x63679eff, + 0x930627ff, + 0xff9374f1, + 0xff635c9e, + 0xf1930627, + 0x9eff9342, + 0x27ff6351, + 0x2ff19306, + 0x469eff92, + 0x0627ff63, + 0x9147f193, + 0x633b9eff, + 0x930627ff, + 0xff9116f1, + 0xff63309e, + 0xf1930627, + 0x9eff9162, + 0x27ff6325, + 0x5df19306, + 0x1a9eff90, + 0x0627ff63, + 0x902bf193, + 0x630f9eff, + 0x930627ff, + 0xff91c1f1, + 0xff63049e, + 0xf1930627, + 0x9eff9237, + 0x27ff62f9, + 0x82f19306, + 0xee9eff90, + 0x0627ff62, + 0x904cf193, + 0x62e39eff, + 0x93f54eff, + 0x0416f3f6, + 0x274467c1, + 0x65649d40, + 0x000f7f83, + 0xf0a38000, + 0xe8506ac1, + 0x3902ea70, + 0x234ff664, + 0xf4645901, + 0x01a4104c, + 0x278061c1, + 0x102c2780, + 0x383b3127, + 0x418b4307, + 0x03204fe6, + 0xf2788103, + 0x47873707, + 0x342b3433, + 0x9d3ca2c1, + 0x430750a8, + 0x33062299, + 0x9d430b43, + 0x140751a2, + 0x33446bc1, + 0x34a3c113, + 0x4807140b, + 0x2107f115, + 0xbc334333, + 0x38a5991c, + 0x42602f03, + 0xb3ab0005, + 0x21a9f405, + 0xf0011098, + 0x109623a9, + 0x4f834b07, + 0x0fffffff, + 0x038c04f5, + 0x319bff00, + 0x95075333, + 0x039003f5, + 0x9f03ff00, + 0x00054260, + 0x143122b9, + 0xa94461c1, + 0xa901089d, + 0x9d010a9c, + 0x01f560a2, + 0x000542e4, + 0x0277cdf2, + 0x43645cf1, + 0xed070005, + 0xec0be333, + 0xe823da46, + 0x4b07e301, + 0x4c5343cb, + 0x76e8031c, + 0x2b4b0748, + 0x1b40cc43, + 0x160af493, + 0x26437904, + 0x232e0739, + 0x1d07102c, + 0xd123e207, + 0xf1f8e803, + 0x250701e9, + 0x42602f03, + 0x23a90005, + 0x3df20108, + 0xe40100ee, + 0x00d6b4ee, + 0x278063c1, + 0xeb483b41, + 0xd1f09334, + 0x63c50415, + 0xf3f37e80, + 0x4ea73027, + 0xbdfeffff, + 0x7e197c43, + 0xd027f39c, + 0xf0830d07, + 0x41e0f58e, + 0x0ea7011f, + 0xbefffd33, + 0x07ffb25b, + 0xff0fe0d0, + 0x8affffff, + 0x33c00702, + 0xe0c0f1c3, + 0x09ff0002, + 0xbe1a07a2, + 0xbeffab73, + 0x09ffafbe, + 0x81fb93a4, + 0xc4f50415, + 0xff0002dc, + 0xc56866c1, + 0x42275ca6, + 0x02d0d4fd, + 0xdea7ff00, + 0x39fffd33, + 0x7d4ff6d4, + 0x07c02701, + 0x7ebc3d0b, + 0x4ea7f381, + 0xbdfeffff, + 0x7e197c4c, + 0xb499f32c, + 0x99462605, + 0x453606b4, + 0xf804b499, + 0x7e016041, + 0x55bef348, + 0xd027ffaa, + 0xf0830d07, + 0xdc27f58e, + 0x25f09316, + 0x4a7e0415, + 0x056499f3, + 0x0d074186, + 0xfeebfbbe, + 0x1512f093, + 0x0ef08304, + 0xf31e5ef5, + 0x4f83f001, + 0x0fffffff, + 0x01042cd1, + 0x039004f5, + 0x3333ff00, + 0x3ec23c0b, + 0x23130725, + 0x1e210718, + 0x11182303, + 0x15200124, + 0x34300534, + 0x4333104c, + 0x42e843f5, + 0x28230005, + 0xe1ca3107, + 0x033507e5, + 0x0542603f, + 0x0834a900, + 0x01f21101, + 0xf54103f1, + 0x0542e81e, + 0x0834ad00, + 0x15eb0501, + 0x602f03e8, + 0xb9000542, + 0x03107c24, + 0x7c24bd41, + 0x27635910, + 0x3d310341, + 0xc1635d64, + 0x64813cab, + 0xf893b901, + 0xea041488, + 0x8900f349, + 0xb4494a63, + 0x147afc93, + 0xee6d7104, + 0x0700af34, + 0x070d071b, + 0xaa51be29, + 0x81c471ff, + 0x0bbb49c3, + 0xc5392b49, + 0xcdc53cad, + 0x85c4754c, + 0x4acb8dc3, + 0x27873707, + 0x322b3433, + 0x43334307, + 0x2407430b, + 0x420b2333, + 0x52fa44e9, + 0xa3990005, + 0x58a48d04, + 0x02d062b9, + 0xb955a29d, + 0x0b02d064, + 0x6b410343, + 0xd064bd4f, + 0x56a29902, + 0x420b3227, + 0x64bd633d, + 0x5f5e02d0, + 0x072301fe, + 0x0743cb4b, + 0x1c4c530b, + 0x032b2823, + 0xfe084ff6, + 0xfdfa00e8, + 0x23fe015e, + 0xf07fa371, + 0x03ffffff, + 0xfd0d5e71, + 0x30be0d07, + 0x7e5eff64, + 0xf4b459fe, + 0xfe9d104c, + 0xf2be0d07, + 0x08e8ff64, + 0xd97efe9a, + 0xfe905ef1, + 0xc54cccc1, + 0x6d5e3cac, + 0x7dcfd6ff, + 0x00001e27, + 0x800c2701, + 0xd7be2027, + 0x1c27ff60, + 0x0490d510, + 0x6a51ed01, + 0x5e000543, + 0x4107fd6c, + 0x64c543ab, + 0xfcde5e80, + 0xa7448cc1, + 0xffffdf0e, + 0xff60e0be, + 0xdc83dc07, + 0x2480990f, + 0x1c07d333, + 0xdbf92027, + 0xff000080, + 0x02718fbe, + 0x0d26c007, + 0x4b87a381, + 0x3b07430b, + 0x31034005, + 0x0080d3fd, + 0x0ea7ff00, + 0xbeffffdf, + 0x99ff6086, + 0x41272483, + 0x3b3cabc1, + 0x75848543, + 0xfebd5e8c, + 0x90d11c07, + 0x14330104, + 0xff5f86be, + 0x1c07cc47, + 0x51ed1fab, + 0x0005436a, + 0xa7fcf35e, + 0xffffdf0e, + 0xff6051be, + 0xee5ed627, + 0x15dc27fd, + 0x4efde85e, + 0x8003c1fb, + 0x837c0199, + 0x23070f3c, + 0x33872433, + 0x4207232b, + 0x420b4333, + 0xc333c407, + 0xcf03c40b, + 0x000552d0, + 0x039cc3a9, + 0x038dd007, + 0x5e1fc658, + 0x30274027, + 0x9d24db99, + 0x038d7c04, + 0x10bcc074, + 0x40d0c170, + 0xbe34d189, + 0x89ff71e6, + 0xc48936d2, + 0x104c182a, + 0x8958d28d, + 0x400b58d4, + 0x271624c2, + 0x10bc4410, + 0x039ec4b9, + 0xab104ca3, + 0xc5032714, + 0xfb8e54d1, + 0x039ec4b9, + 0x1127202b, + 0xf3534bd6, + 0x1d13f0fc, + 0xd3150431, + 0x1e58d28d, + 0x340089d5, + 0x9b40d4c1, + 0x89400b03, + 0xd4c576d1, + 0x7190be40, + 0x74d489ff, + 0x0b24db99, + 0x74d48d40, + 0x9210bcc4, + 0x2736d289, + 0x58d28d00, + 0x1027951e, + 0xf0bef353, + 0x04311d13, + 0xd28dd315, + 0x4e971e58, + 0xddfa93f5, + 0x3a07040f, + 0x07ffac03, + 0xe3f2e32a, + 0xb0077f3c, + 0x237f2ce3, + 0x3419ffac, + 0xc2803c03, + 0xf693f932, + 0xd104121c, + 0x9302d461, + 0x0460e3f5, + 0xa58a5499, + 0x361371f1, + 0x8b549945, + 0x03284fe6, + 0xf4254127, + 0x029c0d27, + 0x3483e127, + 0x34864127, + 0x30274027, + 0xa49d4433, + 0x08a39d0a, + 0x9d7eb499, + 0x41830ca3, + 0x890ba49d, + 0xa005acb1, + 0x890ea18d, + 0xa28daeb2, + 0xa4b38910, + 0x8912a38d, + 0x3027a6b4, + 0x8914a48d, + 0x412798b1, + 0x8930a18d, + 0xa1999ab2, + 0x32a28d3c, + 0xb57eb289, + 0x24a28da3, + 0xa49da285, + 0x3df29336, + 0x11e0040f, + 0x12e00601, + 0x43270608, + 0x249d3427, + 0x35239d34, + 0x9d085499, + 0x4fe6fdae, + 0xf19301a5, + 0x27046056, + 0xf093402c, + 0xbe040f51, + 0x99ff545a, + 0x4fe60954, + 0xf1930168, + 0x2704607e, + 0xf093402c, + 0xbe040f79, + 0x93ff5442, + 0x04606df1, + 0x93402c27, + 0x040fa8f0, + 0xff5431be, + 0x6002f993, + 0x15930104, + 0x113506f3, + 0x6e7ff697, + 0x030b0701, + 0xf1930c0c, + 0x27040ecc, + 0xbe01002d, + 0x07ff16f8, + 0x170ff690, + 0xd1b38101, + 0xc502d462, + 0x232580b3, + 0x02d864d1, + 0x41035311, + 0x02d864d5, + 0x01a53ff6, + 0x5fcef493, + 0x27440904, + 0x76b48d30, + 0xb49d4127, + 0x40b3c57c, + 0x233ca499, + 0xf04f6b42, + 0x9901ce42, + 0xa39934a4, + 0x23432335, + 0x83338333, + 0x0e4c3343, + 0xab103c33, + 0x004e2734, + 0x43ab0400, + 0x11054da3, + 0x2170b4c5, + 0xad4fe6f4, + 0x38bdc100, + 0x078a5499, + 0x00cd03cd, + 0x2f4ff601, + 0xe9f19305, + 0x2c27ff8e, + 0xbe0c0710, + 0x07ff5386, + 0x100d030d, + 0xe5f19301, + 0x2c27ff8e, + 0x5374be0c, + 0x8b5499ff, + 0x052f4fe6, + 0xf1930c07, + 0x27045ff6, + 0x0c03102c, + 0x535cbece, + 0x030c07ff, + 0xf193de0c, + 0x27045ff2, + 0x4bbe0c2c, + 0x5499ff53, + 0x2f4fe68c, + 0x930c0705, + 0x045fe9f1, + 0x03102c27, + 0x33be1c0c, + 0x0c07ff53, + 0x932c0c03, + 0x045fe5f1, + 0xbea22c27, + 0x99ff5322, + 0x4fe68d54, + 0x0c07052f, + 0x6072f193, + 0x102c2704, + 0xbeea0c03, + 0x07ff530a, + 0xfa0c030c, + 0x606ef193, + 0xa22c2704, + 0xff52f9be, + 0xfcfdf453, + 0x0907b415, + 0xf58ef2c3, + 0xed5ef193, + 0x402c27ff, + 0x0e13f093, + 0x52dcbe04, + 0x8df193ff, + 0x2c27ffed, + 0x42f09340, + 0xcbbe040e, + 0x995eff52, + 0xf9f193fe, + 0x2c27ffec, + 0xaef09340, + 0xb7be040d, + 0x5c5eff52, + 0xff3ea7fe, + 0x3499feff, + 0x81f39309, + 0x4383040f, + 0x44332487, + 0x3399422b, + 0x4d44f92e, + 0xeaff0000, + 0x03042834, + 0x23230731, + 0xc02f6b31, + 0x33c00e34, + 0x0731230b, + 0xf04f6b43, + 0x07057542, + 0x446dc1c2, + 0x4d386cd5, + 0x0f82f893, + 0xc7dcfa04, + 0x4c84d100, + 0xbf4dee4d, + 0x2b0d0700, + 0xeddbbe0c, + 0x180c83fe, + 0xa6180ce0, + 0x139c2700, + 0xc1ff595e, + 0x4c8380b4, + 0x3324070f, + 0x2b448724, + 0x33320724, + 0x07320b33, + 0x0b433343, + 0xd04f0343, + 0xa9000552, + 0x89039c43, + 0x349b2644, + 0x00003e10, + 0x8d340701, + 0x412776b3, + 0xb49d3027, + 0x40b3c57c, + 0x233ca499, + 0xf44f6b42, + 0xa1fe3642, + 0x243489f3, + 0x01024dc0, + 0x024dc014, + 0x4d400f11, + 0x4d208002, + 0x47838022, + 0xfe1944e4, + 0x9934a499, + 0x432335a3, + 0x33833323, + 0x4c334383, + 0x103c330e, + 0x4e2734ab, + 0x5e080000, + 0x5499fe16, + 0xd54ff68c, + 0x8d5499fc, + 0xfcce4ff6, + 0x0d272027, + 0xe0270100, + 0xcb5ef225, + 0xc19401fc, + 0x9711448d, + 0x51a9f415, + 0x52d1023a, + 0x1f8b022c, + 0x023053d1, + 0xf205f195, + 0x023454d1, + 0x41083128, + 0xf191f305, + 0x2c2714f6, + 0xf6f2951e, + 0x2703b9df, + 0x446dc140, + 0x4d5064bd, + 0x34e0f311, + 0x4027042e, + 0xf191f485, + 0x42be0d07, + 0x04e6ff6d, + 0xa60c9499, + 0x91402747, + 0x0c949df2, + 0x4c2730a7, + 0x446dc1c8, + 0x4d4063d5, + 0x4d4464d5, + 0x4d3c62d5, + 0x03a0dcfa, + 0x4c07cd1b, + 0x070f4c83, + 0x33248734, + 0x0b322b34, + 0x91f49334, + 0x4201045b, + 0x320b3387, + 0x113c31d1, + 0x899ab489, + 0x133398b2, + 0x4c030107, + 0x0f2c030f, + 0xf1752473, + 0x33d1e007, + 0x44731168, + 0x9b1f1c73, + 0x18ec5342, + 0x18339027, + 0x2407f365, + 0x08331eab, + 0x84073907, + 0xff68fcbe, + 0xd007f261, + 0xa2152ce8, + 0x23020703, + 0x1527140c, + 0xff6cd2be, + 0x08140c03, + 0x0c27260c, + 0xf5408725, + 0x0450404d, + 0x1001c800, + 0x1baaf393, + 0x12340103, + 0x033d05d4, + 0x91f0a834, + 0xbe0c07f1, + 0x07ff6cd4, + 0x910596d0, + 0x4060d5f1, + 0x3c61d54d, + 0xe8f2814d, + 0x81043821, + 0xbef191f0, + 0x45ff6c8b, + 0x406cd1f0, + 0x91f2934d, + 0xc0e8040d, + 0xd586046b, + 0xd14423c1, + 0xce4d4c24, + 0x24d11534, + 0xf3714d3c, + 0x3c0b4123, + 0x4d3c24d5, + 0x4d4023d5, + 0x6dd1c307, + 0x07074d3c, + 0x1d070c2b, + 0xff6c4ebe, + 0x0c2cf055, + 0xc84c27c8, + 0xf181f455, + 0x03f511e8, + 0x1a27f081, + 0x34be0333, + 0x0c2bff6c, + 0x2cbe1d07, + 0xf045ff6c, + 0x13c80ce8, + 0x07f38103, + 0x0731731d, + 0xbe0c2b03, + 0x07ff6c17, + 0x07f051c0, + 0x07100728, + 0x1f1c7340, + 0x33184c53, + 0x0714ab18, + 0xbe083339, + 0x7eff6811, + 0x7007eb82, + 0xd9c8cce8, + 0x734c0702, + 0x2c071f4c, + 0x2c53d407, + 0xabd83318, + 0x41c833d2, + 0x072807f0, + 0x73400710, + 0x4c531f1c, + 0xab183318, + 0x33390714, + 0x67dbbe08, + 0xeb4c7eff, + 0x2807f035, + 0x39070c07, + 0xcabe1d07, + 0x3b7eff67, + 0x71c007eb, + 0xf2f351f2, + 0x61027732, + 0xa847f2f4, + 0x4f71e802, + 0x08d70703, + 0xdc27657c, + 0xd1f14164, + 0xc84d4464, + 0x4c0c2011, + 0x1e4c271e, + 0xd4d24503, + 0x31f43115, + 0x1f4c53f2, + 0xd173420b, + 0xd40b4173, + 0x7e15dcec, + 0xe0f31102, + 0x1102c134, + 0x0d32e0f3, + 0x4463c103, + 0x4d4c64d1, + 0x025134ee, + 0x0092d1e8, + 0x19fefc93, + 0x1d482703, + 0x272127c4, + 0x24f93f3c, + 0x0000c064, + 0x43734d9b, + 0xff004ff8, + 0x018fffff, + 0x4c734013, + 0xfd4f6b1f, + 0x04500024, + 0xf0210300, + 0xf093ddf3, + 0x93040a09, + 0x0319c7f1, + 0xff4f0dbe, + 0xc41d4827, + 0x273f3c27, + 0x64c4f9c1, + 0x9b0000c0, + 0xf843734d, + 0xffff004f, + 0x13014fff, + 0x1f4c7340, + 0xc4fd4f6b, + 0x00045000, + 0xf3f0c103, + 0x91f193dd, + 0x2c070319, + 0x0a07f093, + 0x4ed0be04, + 0x932c07ff, + 0x040a3cf0, + 0x197af193, + 0x4ec0be03, + 0x4463c1ff, + 0x070f3c83, + 0x33238743, + 0x93422b44, + 0x04591bf1, + 0x1201430b, + 0x420b4487, + 0x11684dd5, + 0x4d4463d1, + 0x0baef493, + 0xd53d1204, + 0xc14d444d, + 0x4dd54442, + 0x42d54d48, + 0x665e4d4c, + 0x9d4427fa, + 0x249d3424, + 0xfa065e35, + 0x33274427, + 0x9d34249d, + 0xf95e3523, + 0x5e3407f9, + 0xf193fbd7, + 0x27045ad6, + 0x0c07102c, + 0xff4e59be, + 0x0d030d07, + 0xf1930110, + 0x27045ad2, + 0x47be0c2c, + 0x5499ff4e, + 0xd54ff68b, + 0x930c07fa, + 0xff8a61f1, + 0x03102c27, + 0x2fbece0c, + 0x0c07ff4e, + 0x93de0c03, + 0xff8a5df1, + 0xbe0c2c27, + 0x99ff4e1e, + 0x4ff68c54, + 0x0c07fad5, + 0x8986f193, + 0x102c27ff, + 0xbe1c0c03, + 0x07ff4e06, + 0x2c0c030c, + 0x8982f193, + 0xa22c27ff, + 0xff4df5be, + 0xf68d5499, + 0x07fad54f, + 0x2bf1930c, + 0x2c27ff8a, + 0xea0c0310, + 0xff4dddbe, + 0x0c030c07, + 0x27f193fa, + 0x2c27ff8a, + 0x4dccbea2, + 0xd0f453ff, + 0x5eb415f7, + 0xdce8fad2, + 0xb9fc4f1f, + 0x934d5064, + 0x040acbf3, + 0xfc424ff6, + 0x27443dc1, + 0x5034bd41, + 0xfc365e4d, + 0xb75e4f6b, + 0x5e4f6bfe, + 0xf201fe77, + 0x00ba2fe6, + 0x31e8f301, + 0xfd010134, + 0x2765dc08, + 0xfc9364dc, + 0x27031838, + 0x27c41d48, + 0xc1273f3c, + 0xc064c4f9, + 0x4d9b0000, + 0x4fd84373, + 0xffffff00, + 0x73401326, + 0x4f6b1f4c, + 0x5000c4fd, + 0xc1030004, + 0x93def3f0, + 0x031807f1, + 0xf0932c07, + 0xbe04083d, + 0x5eff4d46, + 0x4f6bfe65, + 0x9121df1e, + 0xd35ef185, + 0xe8f361fb, + 0x07015930, + 0xfc655e03, + 0xf251f171, + 0xfd8b12f2, + 0x37faf361, + 0x7ce8fd85, + 0x03015615, + 0xfd7f5e75, + 0x5ec8cc27, + 0x2c27fd25, + 0x5ef245c8, + 0xc427fce9, + 0x93fa8c5e, + 0x040a13f4, + 0x4d484dd1, + 0xe8fda75e, + 0x00e0157c, + 0x525e7523, + 0x270d07fd, + 0x68e9be15, + 0x0bd087ff, + 0xfd775ed0, + 0x0707f191, + 0xff68dabe, + 0x899ab489, + 0x100798b3, + 0x030f4c03, + 0x34730f3c, + 0x4473e007, + 0x9b1f1c73, + 0x18ec5343, + 0x24071833, + 0x1eab3027, + 0xc6be0833, + 0x377eff64, + 0x5ef005e8, + 0x64b9ff10, + 0xf3934d50, + 0xd60409b0, + 0x33d17a4f, + 0xf4014d48, + 0xc81fd4da, + 0x271965dc, + 0xf105641c, + 0x4307fd01, + 0xd45a4223, + 0x4d124403, + 0xd4074d07, + 0x05fd185e, + 0xe8f201fd, + 0x0100ab21, + 0x651cc8f1, + 0x642c27e0, + 0xd91ef205, + 0xd35ed127, + 0x453027fe, + 0xfbcf5ef3, + 0x4d4863d1, + 0xd127c91e, + 0x51fcb85e, + 0x073907f0, + 0x73400710, + 0x4c531f1c, + 0xab183318, + 0x33280714, + 0x6447be08, + 0xe7b87eff, + 0x70073027, + 0xf335c027, + 0xd1fc765e, + 0xd24d4833, + 0xdc0747c3, + 0x7123811e, + 0x91fc745e, + 0xbe0707f1, + 0x07ff680b, + 0x73400710, + 0x4c531f1c, + 0xab183318, + 0x07f05514, + 0x33390728, + 0x6407be08, + 0xe7787eff, + 0x7007f481, + 0x272941c8, + 0x5ed027c0, + 0xf493fc03, + 0x050316cc, + 0xfb295e40, + 0xd3f2fd31, + 0xd307ff3a, + 0x03ff355e, + 0xfc275e71, + 0xf4054127, + 0x27ff375e, + 0x35c02710, + 0xfc095ef1, + 0xf493f74e, + 0x890459cc, + 0x42890843, + 0x2b80070a, + 0x0c710732, + 0xfc3d0330, + 0x2734d603, + 0x87f78e00, + 0x124ce942, + 0x071007d0, + 0x07c30393, + 0x23b207ac, + 0x03a27391, + 0xe9c323b1, + 0x07d0104d, + 0x0ea9d210, + 0xf1930827, + 0xbeff89e0, + 0x07ff4cef, + 0x0d8c2da9, + 0x2484298d, + 0xc40bb9dd, + 0x1e66484c, + 0xbadd2414, + 0x284cc40b, + 0x000a1e5c, + 0xc40bbbdd, + 0x510bbcdd, + 0x37078029, + 0x0123070b, + 0xe37f3ce3, + 0x34197f0c, + 0xc2803c03, + 0xa7c6f930, + 0x3a071707, + 0x03fcbd10, + 0x03fcbd23, + 0x44f14b87, + 0x1007d010, + 0x1405b103, + 0xf3381403, + 0x03fcbd10, + 0x03fcbd23, + 0x5922f393, + 0x0a3b8d04, + 0xe0003f27, + 0x01271007, + 0xf78e3b2d, + 0xf1930627, + 0xbeff8977, + 0x1eff4c6f, + 0x000000a4, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00023a88, + 0x00023a9c, + 0xff010224, + 0x0004ce00, + 0x00000040, + 0x00000034, + 0x00000003, + 0xff01022c, + 0x0004ce08, + 0x00000040, + 0x00000034, + 0x00000003, + 0x1007fd4e, + 0xd1871f6b, + 0xcf00df03, + 0x08530004, + 0x01103f9b, + 0x51f293d4, + 0x2ec10293, + 0x05432bf4, + 0x08e19dd4, + 0xa7f22499, + 0xfd4fff3e, + 0x8909e49d, + 0xe44de424, + 0x89e82499, + 0x3211e621, + 0xe46d410b, + 0x07f6e205, + 0xf49b4027, + 0x8b00070e, + 0x274027ff, + 0x9de40530, + 0x2f9b08e3, + 0x0bd40110, + 0x8ed40542, + 0x734007fd, + 0xe8410342, + 0x4ee31ef4, + 0xff4ea7f8, + 0x0399ffff, + 0x0844d10a, + 0xc6b00701, + 0xa4076a3f, + 0x94074853, + 0xac539f6b, + 0x07030710, + 0xa78027eb, + 0x99d027c0, + 0x420758e2, + 0x44333287, + 0x2cc0340b, + 0x34f113ff, + 0xff00018c, + 0x1d3b1127, + 0x00004ed8, + 0xc1eb2604, + 0xe103d103, + 0x41d9f0f0, + 0x31842eb4, + 0x204cceb4, + 0xffff4ea7, + 0x444cc5f7, + 0x274848c5, + 0x35b84500, + 0xcef88ebc, + 0x8d07db92, + 0xab108c33, + 0x27d21e8a, + 0x27f88e04, + 0x1e8027c0, + 0xa7fd4ecf, + 0xf7ffff4e, + 0xd0074301, + 0x38dc0107, + 0x8e16b60d, + 0x060e27fd, + 0xf97e2710, + 0x7e0d07fe, + 0x0276ff5f, + 0xfd0efd8e, + 0x4efeeb5e, + 0xff3ea7fb, + 0x34c1fddf, + 0xd8c00740, + 0xd3071b41, + 0xd140bc27, + 0x27017cc0, + 0xdba5151c, + 0x4027b83e, + 0xd3c1d4a5, + 0xec31dc40, + 0x0000fb8e, + 0x0003e80d, + 0x0003e80b, + 0x0003e807, + 0xf1a3f54e, + 0x9107a007, + 0xa469151e, + 0x460b4b2b, + 0x41c84f8b, + 0xddf41363, + 0x0a074101, + 0x2ea7803e, + 0xa9ffffff, + 0xa9010224, + 0x07010423, + 0x7292a9b4, + 0x1b430703, + 0x07422b4b, + 0x709da974, + 0x2b7fab03, + 0x23f305d7, + 0xff3ea7d1, + 0x3499feff, + 0x9bd0e809, + 0x07438301, + 0x87343334, + 0xf1342b44, + 0x00005432, + 0x07a401ff, + 0xb48e2383, + 0x24e2ffff, + 0xa499018c, + 0x08a69909, + 0xd1944fd6, + 0x27030c92, + 0x07f235c1, + 0x83841912, + 0x83990f1c, + 0x07133304, + 0x23310753, + 0xffff843e, + 0x007c12f9, + 0xf415ff00, + 0x5200f345, + 0x2c18c027, + 0x06c2a340, + 0x7d14f9c9, + 0xceff0000, + 0xb1231e4c, + 0xffff4ea7, + 0x0843b9ff, + 0x834b0701, + 0xb1030f4c, + 0xf253344e, + 0x2101ff30, + 0xa7ff4d5e, + 0xffffff3e, + 0x34b92b07, + 0x2c830108, + 0xeef2550f, + 0xbe00b224, + 0x59fe650e, + 0xff2ea784, + 0x23a9ffff, + 0xf4250102, + 0x00ae3bee, + 0x0427e427, + 0xf49b4027, + 0xff2ea70e, + 0xf321fd4f, + 0x9d3824c5, + 0xefd608a3, + 0xff2ea75d, + 0x24a9feff, + 0xc1270142, + 0x24ad4103, + 0xac9d0142, + 0xff3ea709, + 0x3211fd4f, + 0x94a9ab6d, + 0x3d070370, + 0x031c92d5, + 0x3fabf251, + 0x432b923d, + 0x41c0932d, + 0xa7d91636, + 0xffffff3e, + 0x04673cbd, + 0x270f3299, + 0x0ef49b40, + 0x22873127, + 0xb04023f5, + 0x94d1ff02, + 0x8321030c, + 0x34ce4103, + 0x2d05c876, + 0x1e031007, + 0x5e03e800, + 0xf331fea2, + 0xdfff2ea7, + 0x873f6bfd, + 0x004da343, + 0x0824d504, + 0x082ed502, + 0x53b31e02, + 0x01fe67f4, + 0xfe805e41, + 0xfe8004e0, + 0xf58ef183, + 0x010424a9, + 0x43eef301, + 0xf421ff4c, + 0xff4664ee, + 0xf2118419, + 0xff3e42ee, + 0x00817fe6, + 0x2439f241, + 0x00c3c4ee, + 0xf605a499, + 0x2100b54f, + 0xcaf33184, + 0x41272934, + 0x0227e227, + 0x5e05a49d, + 0x9419ff1c, + 0x941d44a3, + 0x94d1841e, + 0x0227030c, + 0xf1834103, + 0xf58ea405, + 0xf1830227, + 0xd9b6f58e, + 0xffff4ea7, + 0xff2ea7ff, + 0x43d1feff, + 0x24d10c2c, + 0x43c2013c, + 0x034b0751, + 0xff2ea741, + 0x24adffff, + 0xe0270102, + 0x846d0027, + 0x07fed35e, + 0xa741034b, + 0xffffff3e, + 0x0027e027, + 0x010234ad, + 0x99febf5e, + 0x4ff605a4, + 0x5fe6ff7c, + 0xf331ff78, + 0xfb9f0ea7, + 0x198325ff, + 0x03312784, + 0x9d841d41, + 0x50be05a3, + 0x5d5efe54, + 0xa7f331ff, + 0xfffb9f0e, + 0x83253103, + 0x3cbef335, + 0xf231fe54, + 0x2305a499, + 0xc6f23521, + 0xe227944f, + 0x755e0227, + 0x272c3dfe, + 0xff4ea730, + 0x43adffff, + 0x44a9010a, + 0x37070104, + 0x2ea7340b, + 0x27ffffff, + 0xad0427e4, + 0x5e010423, + 0x0000fe50, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0xfe0bfe0b, + 0x2ea7fc4e, + 0xa9feffff, + 0xa9014423, + 0x07014224, + 0x1a34cec0, + 0xc0d1d207, + 0x1d27017c, + 0x7abe6418, + 0xd3a9fffc, + 0xd4a90144, + 0x43ce0142, + 0x78c3d1ea, + 0xff1ea701, + 0x3289feff, + 0x6414a912, + 0x0b302719, + 0x6414ad42, + 0x0ef39b19, + 0xf94efc8e, + 0x017804d1, + 0x07a003c1, + 0xa92433e0, + 0x2b011c40, + 0xffbea732, + 0xeac1fddf, + 0x80e2c184, + 0xc18ce9c1, + 0xecc188e4, + 0x90edc194, + 0x80000d83, + 0x01c8b3d5, + 0xb1d50846, + 0xe3d101fc, + 0x34a90178, + 0x4d83011c, + 0x45d68000, + 0xcd0bd19b, + 0xdfff4ea7, + 0xe44cc5fd, + 0x219bf98e, + 0x419b2a0b, + 0x0bdcb2c5, + 0xe0b4c549, + 0x0000d51e, + 0x000000e5, + 0xd007f54e, + 0x07e0dc03, + 0x7809d11d, + 0x97dc0301, + 0x077f1ce3, + 0x93f0638d, + 0x028e3ff6, + 0x8ce3f105, + 0x77dd237f, + 0xa7e90701, + 0xffffff5e, + 0x94293107, + 0x03709ba9, + 0xb123b42b, + 0x9944dbc5, + 0xab0739e4, + 0xa43b4513, + 0x3c033419, + 0xf938c280, + 0x40272027, + 0xd39d3127, + 0xe8d49de9, + 0x8decd29d, + 0xd28de0d2, + 0xa9ca07e4, + 0xab030ce2, + 0xe6dc8dcf, + 0xa7f2d28d, + 0xfee6673e, + 0x89f4d3c5, + 0xe39912e4, + 0x87412339, + 0x8de2b914, + 0x3a34f003, + 0x14e48902, + 0x4a2b3423, + 0x3bebd39d, + 0x07420243, + 0x07435b42, + 0x23210734, + 0x23430721, + 0x0b038741, + 0x8d032b23, + 0xd49de2d2, + 0x070103ea, + 0x4d41e814, + 0x23230702, + 0xa73d0721, + 0xed349d42, + 0xf2b03103, + 0x109d1d0b, + 0xd1e439ed, + 0x07017cd7, + 0x83412334, + 0x33330f4c, + 0x3e234333, + 0x23fffef4, + 0xfffef44e, + 0xc5c8d3c5, + 0xdc8dc4d4, + 0xcb1ea7e6, + 0x6401fefd, + 0x13211211, + 0x240b4013, + 0x32ab340b, + 0x30e86211, + 0x20e80201, + 0x42070202, + 0x46333287, + 0x420b432b, + 0x34333407, + 0xf453342b, + 0x4c01fedc, + 0x3e23320b, + 0x07fef200, + 0x014c0729, + 0x05c12321, + 0x03240331, + 0x11f49834, + 0x03630164, + 0x15310341, + 0xec630564, + 0x9301e841, + 0x028d0bf3, + 0x1ea73401, + 0x05fefdcb, + 0xa7312714, + 0xfdcfff2e, + 0x897023c5, + 0x23c51cd4, + 0x6d4ae26c, + 0x2ad48901, + 0x3fab3b07, + 0x231ed38d, + 0x272b4741, + 0x8034ee10, + 0x06d49901, + 0xe605d19d, + 0x2701694f, + 0x78d2d110, + 0x9d402701, + 0xd18d12d4, + 0xb4d3c116, + 0xd4c54427, + 0x58dcc554, + 0xc5b8dcc5, + 0xdcc5bcdc, + 0x3f4ea770, + 0x2089fdbf, + 0x03432518, + 0xd4c11f0c, + 0x1eda89ac, + 0x73162e89, + 0x04d19d05, + 0xdfff1ea7, + 0x1fec03fd, + 0x2b4014c5, + 0x10e5730a, + 0x07012701, + 0x234e9b40, + 0x9931a741, + 0xd48d11d2, + 0xccd38dce, + 0x9ddcdcc5, + 0xde8dd7d0, + 0xd0dc8dd4, + 0xe6d2da8d, + 0x9900a52f, + 0x11d810d1, + 0x0edb994f, + 0x010852d1, + 0x44334b07, + 0xc40bcb87, + 0x018cc3f1, + 0x4a07ff00, + 0x3edc4403, + 0x30040000, + 0x4207a447, + 0x32074853, + 0x0d274f6b, + 0x3c536412, + 0xd2b40e10, + 0xbdbe17a3, + 0x54d1fff8, + 0xc3f10108, + 0xff00018c, + 0x3ed82407, + 0xd7040000, + 0xd810d199, + 0xdb994d12, + 0x1ed1890f, + 0xcb874b07, + 0xc40b4433, + 0x018cc3f1, + 0x52d1ff00, + 0x14030108, + 0x00003edc, + 0xa1472d04, + 0x48534207, + 0x4f6b3207, + 0x64120d27, + 0x0e103c53, + 0x17a3d2b4, + 0xfff86bbe, + 0x010854d1, + 0x018cc3f1, + 0x2407ff00, + 0x00003ed8, + 0x0d07d704, + 0xfff96abe, + 0x941d4127, + 0x017cd0d1, + 0x95be1907, + 0x0b16fff9, + 0x0178ded1, + 0x6f5ef301, + 0x2b4427fd, + 0xebd49d43, + 0x3b14e389, + 0xe23a2b24, + 0x07fdcc32, + 0xfdc75e32, + 0x717e0d07, + 0x1d4127fc, + 0x7cd0d194, + 0xbe190701, + 0xc6fff960, + 0xf043cb0f, + 0xd1c1f58e, + 0x270d0744, + 0xfc9c7e30, + 0x27fe8e5e, + 0xfe7f5e11, + 0xc15e1027, + 0x5e20a7fd, + 0x4427fdfe, + 0xcfff2ea7, + 0x4824c5fd, + 0x1c270707, + 0xf8c7be18, + 0xa74027ff, + 0xfdcfff3e, + 0xc54834c5, + 0xc25e6834, + 0x93342bfd, + 0x028b23f2, + 0x23053103, + 0x0c5e2c15, + 0x000000fe, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x049d4027, + 0x0c149906, + 0x8911049d, + 0x048d1214, + 0x1414891a, + 0x891c048d, + 0x14d11613, + 0x3c030310, + 0x8d34530f, + 0x04c52403, + 0x18148950, + 0x530f4c03, + 0x26048d44, + 0x03181389, + 0x35531f3c, + 0x892a038d, + 0x31231814, + 0x432b3533, + 0x43534123, + 0x9914049d, + 0x019d0e11, + 0x4efe0b09, + 0x1c1389f5, + 0x89161289, + 0x1c891a1e, + 0x27a10718, + 0xff1ea741, + 0x1445fddf, + 0xc32b2e2b, + 0xc5a402c5, + 0x12d5a00c, + 0xa3b901c4, + 0xd007038c, + 0xd18413c5, + 0xe30114a4, + 0x530407f3, + 0x83140748, + 0x1153300c, + 0x04534183, + 0xf4c51183, + 0xc5f06534, + 0x4ff630f1, + 0x30070170, + 0xc134f4c1, + 0x040e30f0, + 0xa1a934a3, + 0x4107011c, + 0x8338f1c5, + 0xe680004d, + 0xa700c74f, + 0xfddfff2e, + 0x0134a3a9, + 0x01082cd5, + 0x0138a4d1, + 0x01b842fc, + 0x010c23d5, + 0x0120a4d1, + 0x01f824d5, + 0xc134f0c1, + 0xf26130f1, + 0x13334087, + 0x42ab41ab, + 0xdfff3ea7, + 0x8834c5fd, + 0x2738f4c1, + 0xacd2c521, + 0x80004d83, + 0xa4d149e6, + 0x42580138, + 0x02012d27, + 0xd1acd2c5, + 0xf80138a4, + 0xc1016b44, + 0x2da3acd2, + 0xd2c50400, + 0x38a4d1ac, + 0x404c3801, + 0x40002da3, + 0xd1acd2c5, + 0x990178d4, + 0x31e04043, + 0xa4b90162, + 0x3027038a, + 0x4b334383, + 0xd2c524ab, + 0xff4ea7ac, + 0x43a5fddf, + 0x3183f361, + 0x00c53ff6, + 0x0310a1d1, + 0xe0200c27, + 0xc502011d, + 0x021df000, + 0xe000e102, + 0x5802811d, + 0x011de001, + 0x2700b312, + 0xc5f3c340, + 0xf58eb4d4, + 0x42234307, + 0x010943f4, + 0x33274127, + 0x1d031a07, + 0x4ff60138, + 0x2ea705e3, + 0x01fddef7, + 0x05140314, + 0xa8240324, + 0x074327f3, + 0x032f073a, + 0x0701203d, + 0x0c2c031f, + 0x20053061, + 0x24033001, + 0x34031005, + 0xf4781403, + 0x0144a4a9, + 0x0310a0d1, + 0x14074103, + 0x41231153, + 0x0c182027, + 0x072127f0, + 0xe03f6b32, + 0xe603010d, + 0x020df402, + 0x4000f303, + 0xf401210d, + 0xf201220d, + 0x020de002, + 0xe402fc01, + 0xfb01040d, + 0x27848700, + 0x85402770, + 0x00f85ef4, + 0x22032007, + 0x33833207, + 0xf2652223, + 0xd1fe875e, + 0xc10310a1, + 0x1de4a0d0, + 0xff3f0201, + 0x27a4d2c1, + 0x07209b10, + 0x07315332, + 0xd4420b43, + 0x3e80014e, + 0x8341072c, + 0xc3483343, + 0xb4d4c5f3, + 0x11e4f58e, + 0xd4c1ff2b, + 0xa0d3c1a4, + 0x349b2007, + 0x3153249b, + 0x43071027, + 0x4ed0420b, + 0xd63e8001, + 0x2ef0230a, + 0x673e8001, + 0x83410702, + 0xa3483343, + 0xc5f3c341, + 0xf58eb4d4, + 0x5eacd2c1, + 0x3703fea1, + 0xfff83d83, + 0x27fe435e, + 0xf737e041, + 0x5e4027fe, + 0xd4c1fef2, + 0x024dc050, + 0x4dc01e01, + 0xc0191102, + 0x1480024d, + 0x80224dc0, + 0x824d400f, + 0x10a4d101, + 0xe4478303, + 0xa3fe7d44, + 0xacd2c528, + 0xc1fe755e, + 0x1127a4d4, + 0x01c83ff6, + 0x209b2447, + 0x12133207, + 0x831e3153, + 0x11210de0, + 0x0df4ff21, + 0x02331122, + 0x11020de0, + 0x0de00209, + 0xff0f1104, + 0x03210de0, + 0x102701d1, + 0x7027f185, + 0xa4d18027, + 0x34070114, + 0xe4073853, + 0x8330ec83, + 0xc6e45331, + 0x83e20334, + 0x834953e3, + 0xa3340e41, + 0x38f4c1e4, + 0x80004d83, + 0xfdb24ff6, + 0xe050d4c1, + 0xd103014d, + 0x206c2701, + 0x01020de0, + 0x0de001d1, + 0x04301102, + 0x03210de0, + 0x0d00042a, + 0x0de40121, + 0x04101121, + 0x5c272127, + 0x27f27520, + 0xe0e40842, + 0x4902810d, + 0x040de001, + 0xe0014c01, + 0x4611040d, + 0x040de001, + 0x27014021, + 0xe0f19510, + 0x3a31040d, + 0x820de001, + 0x27012001, + 0x010de010, + 0xe0013103, + 0x2b03210d, + 0xa5302701, + 0xb52027f3, + 0xffcea7f2, + 0xb027fddf, + 0x27a4d2c1, + 0xcbd5209c, + 0x140b0114, + 0x0118cbd5, + 0x313b3907, + 0x011ccbd5, + 0x41271307, + 0x03210d00, + 0x143b4027, + 0x036ce3e0, + 0x016ee4ec, + 0x031be1e0, + 0x057ce2e8, + 0x02010de0, + 0x0de00559, + 0x05531201, + 0x01020de0, + 0x0de00448, + 0x04421102, + 0x01210de0, + 0x0de00531, + 0x052b1121, + 0x02810de0, + 0x1007046f, + 0x14e01783, + 0x0de00508, + 0x05020182, + 0x03210de0, + 0xa3d104cd, + 0x2ea70138, + 0x33fddfff, + 0x203c2335, + 0x011423d5, + 0x013ca4d1, + 0x4c234433, + 0x1824d510, + 0x40a3d101, + 0x23343301, + 0x23d5103c, + 0x14e0011c, + 0x0de00410, + 0x040a0182, + 0x41a0d4c1, + 0x533407f2, + 0x31312331, + 0x07f051f1, + 0x0b239be2, + 0x81412372, + 0x9b419bf2, + 0x33230b30, + 0x33840be4, + 0x85043315, + 0x2b852bf2, + 0x13101326, + 0x13762be0, + 0x80d1c500, + 0xc584d8c5, + 0xd7c588de, + 0x90d0c58c, + 0x5e94d2c5, + 0x2447010c, + 0x1027209b, + 0x12133207, + 0xbb5e3153, + 0xa52227fd, + 0xfeef5ef2, + 0x10273127, + 0xd65ef395, + 0x953027fe, + 0x5e1227f3, + 0x3127fecd, + 0xf3b52027, + 0xd65ef2a5, + 0x07133bfe, + 0x07833b84, + 0x5ef18571, + 0x4107fe2e, + 0x48334383, + 0xf3c344a3, + 0x8eb4d4c5, + 0x010dc0f5, + 0x0dc04202, + 0xe43d0281, + 0x0701820d, + 0x0b8147fe, + 0x27833b84, + 0x85302770, + 0xfe005ef3, + 0xe4106c27, + 0x3301020d, + 0x405c27fe, + 0x10274127, + 0x465ef175, + 0x040de0fe, + 0xe0fce421, + 0xde31040d, + 0x010de4fc, + 0x07fdd112, + 0x07833b84, + 0x27310371, + 0x85733b20, + 0xfdc85ef2, + 0x0196e5e0, + 0x0110e5e8, + 0x009de6e0, + 0xff1ee700, + 0x0de03207, + 0x02d90121, + 0x11210de0, + 0x0de002d3, + 0x02ba0281, + 0xfc41fb31, + 0xf4a12307, + 0x143b2173, + 0xf4512123, + 0x3123f081, + 0x3b9bc29b, + 0x062b312b, + 0xc62b249b, + 0x40134607, + 0x380bf085, + 0x020bc70b, + 0xd1c51013, + 0x84d3c580, + 0xc58cdcc5, + 0xd0c590d4, + 0x88d4c594, + 0xd2c1f391, + 0xc1f40184, + 0x233b94d0, + 0x0b8cd1c1, + 0x3bf42124, + 0x80dec103, + 0xc188dcc1, + 0x133b90db, + 0xf311040b, + 0x130bf491, + 0xc43be43b, + 0xdec5b43b, + 0x88dcc580, + 0xc590dbc5, + 0xd1c584d2, + 0x94d0c58c, + 0xa1fafb5e, + 0x07f291f4, + 0x71240be9, + 0x38a3d1f4, + 0x07e47b01, + 0x07423b41, + 0x133e9b24, + 0xd5432b40, + 0xb10114c4, + 0x3ca3d1f4, + 0x13247b01, + 0x1b343320, + 0x18c3d532, + 0x40a4d101, + 0x2b443301, + 0x1cc2d524, + 0x810de001, + 0x3101e002, + 0xa1fc41fb, + 0x3bf451f0, + 0x2b370710, + 0x2bbe9b36, + 0x33c43381, + 0x80dbc544, + 0xc584d8c5, + 0xd4c588dc, + 0x94d3c590, + 0x5e8cd3c5, + 0xf2a1ff50, + 0xa4d1f391, + 0x320b0138, + 0xf371f3a5, + 0x937b2107, + 0x499bf3a1, + 0x420b233b, + 0x0114c4d5, + 0x013ca3d1, + 0x3433f4b1, + 0x320b247b, + 0x0118c3d5, + 0x0140a4d1, + 0x240b4433, + 0x011cc2d5, + 0x02810de0, + 0xfb310166, + 0xd4c1fc41, + 0x71fe51a0, + 0x5b2407f0, + 0x071c0720, + 0x07415339, + 0x1341230e, + 0x33212330, + 0x9b043314, + 0x9b2b9bc4, + 0x133b9b4e, + 0xc5001310, + 0xd2c580d3, + 0x88d1c584, + 0xc58cdcc5, + 0xd4c590d0, + 0xfece5e94, + 0xd6c5f2a1, + 0xc5123b90, + 0xdbc580d1, + 0x84dbc594, + 0xc588d6c5, + 0xb55e8cdb, + 0x210de0fe, + 0xe0010001, + 0xfa11210d, + 0x810de000, + 0x0700ed02, + 0xe0478340, + 0xe000ec44, + 0xe601820d, + 0x07f48100, + 0x85462b36, + 0x07f081f4, + 0x2b301345, + 0x13762b85, + 0x80d4c540, + 0xc584d8c5, + 0xd3c58cd7, + 0x94d0c590, + 0x5e88d3c5, + 0x0de0fe6c, + 0x00a80121, + 0x11210de0, + 0x0dc000a2, + 0x07760281, + 0xc4478340, + 0xd4c13e44, + 0x23f331a4, + 0x87439b41, + 0x80d2c525, + 0x5e84d4c5, + 0x5c27fe40, + 0xe0412720, + 0xa711020d, + 0x5e4027fd, + 0x5c27fda2, + 0xa7ef1e40, + 0xfddef72e, + 0x14031401, + 0x24054013, + 0xf3982403, + 0xc0fa1c5e, + 0xbf01820d, + 0x31a4d3c1, + 0x232307f4, + 0x9bf14131, + 0x51215334, + 0x9b2123f4, + 0xc5249b12, + 0xd3c580d5, + 0x8cd1c584, + 0xc590d6c5, + 0xd6c594d2, + 0xfde65e88, + 0x31a4d4c1, + 0x07f241f3, + 0x23415314, + 0x9b412311, + 0x47429b13, + 0xc5264735, + 0xd1c580d3, + 0x88d2c584, + 0x5e8cd4c5, + 0xd4c1fdc0, + 0x5e4153a4, + 0x5547ff69, + 0x1e5e6647, + 0x5e5587ff, + 0xfb31ff19, + 0xb153fc41, + 0xfb35c153, + 0x935efc45, + 0x41fb31fe, + 0x53b153fc, + 0x538153c1, + 0x45fb3571, + 0xfe155efc, + 0xfc41fb31, + 0xc153b153, + 0x71538153, + 0xfc45fb35, + 0x73fd3b5e, + 0xfd2c5e31, + 0x0138a4d1, + 0x4c234533, + 0x14c4d540, + 0x210de001, + 0xc0008101, + 0x7b11210d, + 0x02810dc0, + 0x83100742, + 0xfbf05e17, + 0x31a0d4c1, + 0x9b4123f3, + 0x804c2343, + 0x480b3533, + 0xd3c53013, + 0x84d4c580, + 0xd1fd335e, + 0xa70138a4, + 0xfddfff2e, + 0x4c234533, + 0x1424d540, + 0x3ca3d101, + 0x23343301, + 0x23d5403c, + 0xd4c10118, + 0x41f131a0, + 0x533407f2, + 0x23312341, + 0x9b319b41, + 0x403c2342, + 0x33404c23, + 0x0b243315, + 0x13470b38, + 0xc5201310, + 0xd3c580d1, + 0x88d2c584, + 0x5e8cd4c5, + 0xd4c1fce0, + 0x53f331a0, + 0x9b412341, + 0x33317343, + 0x804c2335, + 0x3013480b, + 0xc580d3c5, + 0xc15e84d4, + 0x38a3d1fc, + 0xff2ea701, + 0x3533fddf, + 0xd5403c23, + 0xd1011423, + 0x33013ca4, + 0x204c2344, + 0x011824d5, + 0x0140a3d1, + 0x3c233433, + 0x1c23d520, + 0xfb345e01, + 0x0138a4d1, + 0xdfff3ea7, + 0x234533fd, + 0x34d5804c, + 0x1f5e0114, + 0x38a4d1fb, + 0x23443301, + 0xc4d5804c, + 0x0a5e0114, + 0x38a4d1ff, + 0x23453301, + 0xc4d5204c, + 0xa3d10114, + 0x3433013c, + 0xd5203c23, + 0x5e0118c3, + 0xeff6feed, + 0x0de0fbf6, + 0x012a0201, + 0x12010de0, + 0x0de00124, + 0x010d0102, + 0x11020de0, + 0x0de00107, + 0x00eb0121, + 0x11210de0, + 0x0de000e5, + 0x00bb0281, + 0x47834007, + 0x009e44e0, + 0x01820de0, + 0x0dc00098, + 0xd1630321, + 0xa70138a3, + 0xfddfff2e, + 0x3c133533, + 0x1423d580, + 0x3ca4d101, + 0x13443301, + 0x24d5404c, + 0xa3d10118, + 0x34330140, + 0xd5403c13, + 0x31011c23, + 0x51f441f1, + 0x332027f3, + 0x33153344, + 0x88d4c534, + 0xc590d3c5, + 0xd1c594d2, + 0x84d2c580, + 0xd18cd2c5, + 0x000310a4, + 0xe401214d, + 0xb511214d, + 0xc51173fb, + 0xad5e80d1, + 0x38a3d1fb, + 0xff2ea701, + 0x3533fddf, + 0x01003d13, + 0x011423d5, + 0x013ca4d1, + 0x4c134433, + 0x1824d580, + 0x40a3d101, + 0x13343301, + 0x23d5803c, + 0x9c1e011c, + 0x0138a4d1, + 0xdfff3ea7, + 0x134533fd, + 0xd502004d, + 0x1e011434, + 0x38a4d187, + 0xff2ea701, + 0x4533fddf, + 0x01004d13, + 0x011424d5, + 0x013ca3d1, + 0x3d133433, + 0x23d50100, + 0x645e0118, + 0x38a4d1ff, + 0xff3ea701, + 0x4433fddf, + 0x02004d13, + 0x011434d5, + 0xd1ff4e5e, + 0x330138a4, + 0x004d1345, + 0x14c4d501, + 0xff3d5e01, + 0x0138a4d1, + 0x4c134533, + 0x14c4d580, + 0x3ca3d101, + 0x13343301, + 0xc3d5803c, + 0x205e0118, + 0xd1f54eff, + 0x07017809, + 0xff8ea770, + 0xbea7ffff, + 0x27feffff, + 0x84d1e55c, + 0x4fe60c3c, + 0x0ea70136, + 0x11fd7fff, + 0x104ca304, + 0x40270415, + 0x017c7cd1, + 0x941d6227, + 0xd109b499, + 0x830148b3, + 0x33d40743, + 0x2b4487d4, + 0x23ad07d4, + 0xffffb4ae, + 0x00983ff6, + 0x0054d3f1, + 0x4027ff00, + 0x045c8dd1, + 0x0104c49d, + 0x07d342c1, + 0x071302d3, + 0x081deed1, + 0x83410701, + 0x87340741, + 0x2b363324, + 0x07340b32, + 0x2b243323, + 0x05240b23, + 0x942e23c1, + 0x3907fffb, + 0x2e014507, + 0x3e052403, + 0xf4a83403, + 0x045884d1, + 0x40e8411b, + 0x412700ca, + 0x9904c49d, + 0x499604c4, + 0x07866fd6, + 0x7e190707, + 0x0707f4a0, + 0xf07e1907, + 0xbe0707f4, + 0xa7ffb54c, + 0xfddfffee, + 0x4df8e431, + 0xff480100, + 0x0e9e0127, + 0x0c07fe08, + 0x79be1907, + 0x6007ffb1, + 0xff526ff6, + 0xb4d1ca1e, + 0x41c00148, + 0x48b4d11f, + 0x4e42c001, + 0x0148b4d1, + 0xb9ad43c4, + 0xd819c1b4, + 0x275f104c, + 0x48b4d540, + 0xf19d1e01, + 0x000054d4, + 0xe2c301ff, + 0xd100de43, + 0xca045c84, + 0x0ea7e634, + 0xbefffb9f, + 0xf1fe0826, + 0x000054d2, + 0xd1c301ff, + 0xca045c84, + 0x23c2ce34, + 0xbe0527cb, + 0x1efdf108, + 0x9b4027c3, + 0xf49b0bf4, + 0xbe09270e, + 0x5efdf0f8, + 0x3ea7ff57, + 0x11fd7fff, + 0x104ce334, + 0xcb5e3415, + 0xbe0827fe, + 0x5efdf0e0, + 0x0d07ff3f, + 0x1103012b, + 0x0549f0f0, + 0x04a499cd, + 0x83d145b6, + 0xb4d10c2c, + 0x34ca013c, + 0x16c0be2a, + 0xa9a369fe, + 0xce010284, + 0xa4192634, + 0x41033027, + 0xf39ba41d, + 0xff4ea70e, + 0x0ea7fd4f, + 0xc5fffb9f, + 0x58be3843, + 0x4127fe07, + 0x0148b4d5, + 0x25fef25e, + 0x07d81ead, + 0x07418341, + 0x33248734, + 0x0b322b36, + 0x33230734, + 0x0b232b24, + 0x23c10524, + 0xfffb942e, + 0x45073907, + 0x24032e01, + 0x34033e05, + 0x84d1f4a8, + 0x411b0458, + 0xfeb440ec, + 0xa9ff7d5e, + 0xa90144b3, + 0xee0142b4, + 0x27feaa43, + 0x48b4d542, + 0xfea15e01, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x0499fd4e, + 0xc0100712, + 0x0e396341, + 0x4c234e07, + 0x0f44d42c, + 0x33333407, + 0xff7c3e23, + 0xdc3401eb, + 0x1219fc41, + 0x32074327, + 0x34f53333, + 0xff021200, + 0x100030f1, + 0xd247ff02, + 0x53180c33, + 0x08461d0c, + 0x4e872533, + 0x180422f1, + 0x13c1ff02, + 0x004ef140, + 0x0bff0216, + 0xc13766e2, + 0x01233814, + 0x0e0b049b, + 0x42273d87, + 0x120034f5, + 0xfd8eff02, + 0xfd8e0027, + 0x23101499, + 0x0b043b01, + 0x4ee61e0e, + 0x834107fe, + 0x11039941, + 0x400b4487, + 0x4e61312b, + 0x8e803c1c, + 0x810191fe, + 0x87131902, + 0x05420b43, + 0x1d31034e, + 0x11049913, + 0x049d4103, + 0x4efe8e11, + 0xa10b21fb, + 0xced00704, + 0xd3995a4b, + 0x5b4b0710, + 0x83dc5143, + 0x87d31941, + 0x0bde3944, + 0x071c074d, + 0x8b35332b, + 0x0340612c, + 0xf5122b11, + 0x0218003e, + 0xf5200bff, + 0x02180431, + 0x234027ff, + 0xfde8003e, + 0x3e033435, + 0xf5fde800, + 0x02181032, + 0x1431f5ff, + 0x23ff0218, + 0xfde7f03e, + 0xb10b3435, + 0xdb25d4a1, + 0x27a8b4ce, + 0x12d49d42, + 0xfa4efb8e, + 0x4fff4ea7, + 0x074b01fd, + 0xa3b433d0, + 0x01a407bb, + 0x764627dc, + 0x1231bec7, + 0x27d40100, + 0x05449630, + 0x0ef39bdb, + 0x0138acc5, + 0xe4b4ced4, + 0xf4e8fa8e, + 0xfd4ede1e, + 0x5d96f493, + 0xa043c101, + 0x1f6b1007, + 0xd1873803, + 0x0853d30b, + 0x2f9b3823, + 0x51d40110, + 0x05422b3e, + 0x08e19dd4, + 0xa7123499, + 0xfd4fff2e, + 0x4909e49d, + 0x99e44d34, + 0x31690834, + 0x410b2311, + 0xe305e46d, + 0x402707f6, + 0x070ef49b, + 0x27ff8b00, + 0x05302740, + 0x08e39de4, + 0x01102f9b, + 0x05420bd4, + 0x07fd8ed4, + 0x03427340, + 0x1ef4e841, + 0xff3ea7e3, + 0x3499feff, + 0x07438309, + 0x87343334, + 0xf9342b44, + 0x00004f32, + 0x4d34f9ff, + 0xc2ff0000, + 0xf4931d42, + 0xc1015d0c, + 0x3ea7a442, + 0xc1ffffff, + 0x24d1fc31, + 0x0027030c, + 0x0127140e, + 0x0027fe0b, + 0xf193fe0b, + 0xa7015888, + 0xfefdcb4e, + 0x12014301, + 0x322b1011, + 0xfe0b3108, + 0xfb1e00a7, + 0xf193f54e, + 0xa301587c, + 0x073107f0, + 0xcf1d0390, + 0x20008901, + 0x2107f215, + 0x057f3ce3, + 0x7f2ce3f0, + 0x01cf1d23, + 0x3c033419, + 0xf932c280, + 0x5852f393, + 0x27202701, + 0x3205744c, + 0xf4c83403, + 0x149d4127, + 0x6d14bd11, + 0xf9149d01, + 0x1185149d, + 0xfd0fe0f0, + 0x0cffffff, + 0xa702a702, + 0xebffff5e, + 0xdfff8ea7, + 0x036007fd, + 0x03100703, + 0x07132361, + 0x831383e6, + 0x07e38303, + 0x07200741, + 0x87a0873e, + 0x33c187be, + 0x33353325, + 0xa09dc145, + 0x3b2b2a2b, + 0x410b4c2b, + 0x3e0b200b, + 0x8709d199, + 0x87a387b2, + 0x90bf0374, + 0x030004e6, + 0x04e690af, + 0x907f0300, + 0xe60004e6, + 0x49022c1f, + 0x69b20dd2, + 0x08d499d3, + 0x430bb209, + 0xd099b42d, + 0x9d320708, + 0x94c10bb0, + 0x8d340b30, + 0x918908b3, + 0x879e9920, + 0x41234107, + 0x014824ee, + 0x29229489, + 0x274123b3, + 0x5c34ee11, + 0x9d208701, + 0x290b11b1, + 0x94992301, + 0x5b130787, + 0x9d310314, + 0x3c8312b1, + 0x9923050f, + 0xbe8912b4, + 0x87438308, + 0x99190b14, + 0x124111b3, + 0x07a49dc1, + 0x0f4c834e, + 0xc487232b, + 0x9938d399, + 0x2fe639d4, + 0x949901b7, + 0xe0124588, + 0x0701c543, + 0x33473340, + 0xf1040b05, + 0x04e86003, + 0x000f2700, + 0x83400040, + 0x003fa333, + 0xab800000, + 0xc5b0153c, + 0xd4b950b3, + 0x4fe60386, + 0x91c101a7, + 0x291209a0, + 0xf302ee10, + 0x83420701, + 0x99410b43, + 0x3f4b0d43, + 0x20c8230b, + 0xee02daf1, + 0x32074207, + 0x32534383, + 0x4d08149d, + 0x21120d13, + 0xa041f854, + 0xf8542101, + 0xc101af44, + 0x4fe650b4, + 0xbc890136, + 0x87949908, + 0xc783c47b, + 0x84354127, + 0xc14884c1, + 0x30c84c83, + 0x1240c85f, + 0x4cce4783, + 0xe2378357, + 0xca010243, + 0x4cc24ec3, + 0x50b4c14b, + 0x01044fe6, + 0x3127b411, + 0xc56054c5, + 0xb4c16853, + 0xc1544550, + 0x44e65074, + 0x74c54027, + 0x50a4c150, + 0xa39947a6, + 0x07a1110b, + 0x33273323, + 0xf1320b35, + 0x04e86034, + 0xf5433300, + 0x14008041, + 0xcef411ff, + 0x06074e46, + 0x27fe4c5e, + 0x2784b541, + 0xfd1c7e0b, + 0x84b54027, + 0x3127871e, + 0x31233e3b, + 0x418b4307, + 0x4fe63103, + 0x1307feac, + 0x142b1103, + 0x29229489, + 0xee4123b3, + 0x07fea843, + 0x2c939940, + 0x34f24103, + 0x431bfe9d, + 0x310b3107, + 0x1307f4d8, + 0xa7fe905e, + 0xebffff3e, + 0x42f83421, + 0x2ea700fe, + 0x99feffff, + 0x24a92893, + 0xfd01196c, + 0x24ad430b, + 0x9099196c, + 0x3091c187, + 0x273493c1, + 0x01203b21, + 0x3890c194, + 0x233c9ec1, + 0x031d0b21, + 0x0b3d0b31, + 0x0b41030d, + 0x83120bde, + 0xfd050e4c, + 0x31e312eb, + 0x831fdc83, + 0x3c9dc5f0, + 0x91c59435, + 0x3493c530, + 0x053890c5, + 0x25941594, + 0xe2f58e94, + 0xeaff4e34, + 0xc1fefdc3, + 0x4ff650b4, + 0x4027ff00, + 0x085e5445, + 0x50b1c5ff, + 0x13feae5e, + 0x27432b4a, + 0x99343b31, + 0x13458894, + 0x0000cfa3, + 0x43e42000, + 0xec83fe3f, + 0x33e17310, + 0xceab10ec, + 0xc1fe325e, + 0xb399a091, + 0x0a14990b, + 0xfe5343ee, + 0xffff2ea7, + 0x6824a9fe, + 0xad410319, + 0xc1196824, + 0x4127a091, + 0xcfff3ea7, + 0x7034c5fd, + 0x27fe345e, + 0x27543541, + 0xfc007e0b, + 0x54354027, + 0x31fc5321, + 0xec1efe51, + 0x54354427, + 0x7e0f0c27, + 0x4027fbea, + 0x53215435, + 0xfe4134fc, + 0x4027eb1e, + 0x5e09149d, + 0xd307fe2b, + 0xd4354227, + 0xcb7e0b27, + 0x354027fb, + 0xfcd321d4, + 0x1efef132, + 0xa7f74eec, + 0xfeffff1e, + 0x196614a9, + 0x48038007, + 0x196614ad, + 0x9307c207, + 0xd3070de6, + 0xd30bd333, + 0xa027b107, + 0xcfff7ea7, + 0x27081efd, + 0x7efa0d0d, + 0xc401fb8e, + 0xa9f54dca, + 0x271966b3, + 0xad310320, + 0xa91966b3, + 0x031968b4, + 0x68b4ad41, + 0x6cb3a919, + 0xad310319, + 0x9b196cb3, + 0x41270ef2, + 0x037074c5, + 0x0b8a2ea1, + 0x8ecc1ed9, + 0xc1fc4ef7, + 0xc007a40e, + 0xe4b9e239, + 0x21230386, + 0xa90f2c83, + 0x89037ae3, + 0x23332000, + 0x2330c1c1, + 0xfffef42e, + 0xc1ff747e, + 0xc38930c4, + 0x3cc2c120, + 0x430b4103, + 0x41e3320b, + 0xc51f3c83, + 0xc4c53cc3, + 0x4efc8e30, + 0x990421fb, + 0x41231003, + 0x0d99435b, + 0x6bc40711, + 0x2b3d07cf, + 0x1cb0073c, + 0xfb8e803c, + 0xffdf0ea7, + 0xfabc7eff, + 0x0713cdce, + 0x0741034d, + 0x07df6bd4, + 0x7e1d070b, + 0xdccefa0f, + 0x9b4027ef, + 0x3ea70ef4, + 0x05ffffdf, + 0x4efb8e34, + 0xa7d007f9, + 0xffffdf0e, + 0xc107b207, + 0xda99d9a1, + 0xfa847e10, + 0x0710d099, + 0xbe1c072b, + 0x07000e0f, + 0x070b26b0, + 0x07ca5bc9, + 0x230d071c, + 0xf9cd7e12, + 0xf49b4027, + 0xdf3ea70e, + 0x3405ffff, + 0xa110d299, + 0x27c183d3, + 0x87423b41, + 0x0b340bcc, + 0x650d07cd, + 0x7ed3a5cb, + 0x0127f9d7, + 0x4027f98e, + 0xa70ef49b, + 0xffffdf4e, + 0x4b050027, + 0x0000f98e, + 0x00006407, + 0x00006408, + 0xf293f54e, + 0xc10157e8, + 0xf563a403, + 0xf0c52e19, + 0x50f1c54c, + 0xe648f3c5, + 0xc10126ef, + 0xf3c14cf2, + 0x22248950, + 0x011943e2, + 0x554cfa93, + 0x27702701, + 0xff6ea720, + 0x5ea7ffff, + 0x1efeffff, + 0x7e0c0753, + 0xd4c1f8cc, + 0x60d3c15c, + 0xd4c5402b, + 0x7d03ca58, + 0x64ad4027, + 0x0907119a, + 0x006e14be, + 0xc144d4c1, + 0xd26140d3, + 0x42ea430b, + 0x41270553, + 0xf293a41d, + 0x1901577c, + 0xf271032e, + 0xc100c6e7, + 0xac034cf4, + 0x224389a0, + 0x0750f4c1, + 0xe2470b27, + 0x0700b234, + 0x334207d2, + 0x0b4733d5, + 0x60df03d4, + 0x070004e8, + 0x03cd079d, + 0xcc030c9c, + 0x99402754, + 0xd49d66d3, + 0x8a3fc69c, + 0x007e0c07, + 0x7e0c07f9, + 0xd4c1f850, + 0x60d3c15c, + 0xd4c5402b, + 0x8530c258, + 0xc6f9f47e, + 0x2227620f, + 0x119a64a9, + 0x13884df4, + 0xf0c1053a, + 0x0c01d148, + 0x7e0c0703, + 0x0ff6fea3, + 0x5499ff64, + 0x87438309, + 0x2b443324, + 0x5043f942, + 0xe4ff0000, + 0x99045932, + 0xd4c164d2, + 0x48f0c15c, + 0xd1c1425b, + 0x2741837c, + 0x87323b31, + 0x0402d144, + 0x0b310b03, + 0x6c42c54d, + 0xf67cd3c5, + 0x2704851f, + 0x9cd49d41, + 0xb9ff1f5e, + 0xe6119964, + 0x2704664f, + 0x93961e23, + 0x01542ff3, + 0x40272427, + 0x1d05349d, + 0x9d347d34, + 0x3c030434, + 0xe6f270a0, + 0x07045def, + 0x17f1933e, + 0x20270154, + 0x1c031419, + 0xc14546a0, + 0x04894cf0, + 0x70240b20, + 0x4cf0c1f3, + 0x7e50f1c1, + 0xf093f9a0, + 0x1901566c, + 0x844fe604, + 0x4cf3c101, + 0x53def493, + 0x22328901, + 0x439d3027, + 0x50f4c10a, + 0x016d24e2, + 0x5474f093, + 0x07202701, + 0xc55407af, + 0xf2c540f0, + 0x03402744, + 0xb40740ac, + 0x4733b533, + 0xbf03b40b, + 0x0004e860, + 0xc10bb499, + 0xf40d48f3, + 0x33a96b07, + 0xbdc1036c, + 0x546c035c, + 0x06074027, + 0xf32df415, + 0x7e68b8c1, + 0xbec1f728, + 0x64b49958, + 0x3d07d02b, + 0xcd072e07, + 0x245b345b, + 0xb1c1ce2b, + 0x3223ee68, + 0x87318301, + 0x074b0b43, + 0xc1918b9d, + 0xc92b6c47, + 0x42872183, + 0x43c14b0b, + 0x071e8b6c, + 0x03310b0b, + 0xf3250c0c, + 0xf745fc35, + 0xe17ef955, + 0x44b4c1f6, + 0x0b40b3c1, + 0xc5402b43, + 0x34ea50b4, + 0xf4a500d5, + 0x2738b4c1, + 0x99f49530, + 0x402748b0, + 0xb53cf09d, + 0x3df49df3, + 0x0130f3c5, + 0x072333b2, + 0x0334013f, + 0x8024f534, + 0xceff1400, + 0x3d07f4a3, + 0x07403c03, + 0xc24dcb43, + 0x43070b48, + 0x44c6488b, + 0xdc1ed307, + 0x0764b499, + 0x83345b3d, + 0x99338731, + 0x3b0b66b2, + 0xe06c39c1, + 0x0701e322, + 0xfca97e06, + 0xe01eb499, + 0x99009742, + 0x4a569cb4, + 0x8748f2c1, + 0xf423d145, + 0x8b430b02, + 0x05980b8d, + 0x9b302749, + 0x24d10ef3, + 0x4c83030c, + 0xf943330f, + 0x00008343, + 0x230407ff, + 0xffff7e0e, + 0x02713ff6, + 0x9344f0c1, + 0x01550ff3, + 0x34190103, + 0xd244f0c5, + 0xf4c12240, + 0x40f0c14c, + 0x8944f2c1, + 0xf5c12243, + 0x1d402750, + 0xa00c0304, + 0xf0c5520b, + 0xea420740, + 0x27fead53, + 0x8ef54300, + 0x38b2c1f5, + 0xf295f3a5, + 0xb399432b, + 0x30f4c548, + 0xc13cf39d, + 0xf4b53cb4, + 0x9d49b099, + 0x285e3df0, + 0x279027ff, + 0xfeda5e70, + 0x270cb399, + 0xf5333325, + 0x02120032, + 0x0cb499ff, + 0x43f14333, + 0xff021000, + 0xfc0a3dd8, + 0x0c0d2718, + 0xf6fc7e64, + 0x330cb499, + 0x0043f143, + 0xdcff0210, + 0xeafc0a3d, + 0xc140b1c1, + 0xb29950b3, + 0x49bc9948, + 0x13024107, + 0x43e21307, + 0x702701ce, + 0xe2074027, + 0x4b50b4c5, + 0x30e0c8ef, + 0x874cb0c1, + 0xc1400b4e, + 0x42d15443, + 0x310b0174, + 0x41c1328b, + 0x5443c594, + 0x40270e0b, + 0x01f613ee, + 0x015404bd, + 0x274cb4c1, + 0xbde40b32, + 0x070164e3, + 0xc8ef4bec, + 0x78c632e0, + 0x874cb0c1, + 0xc1400b4e, + 0x42d15443, + 0x370b0174, + 0x41c1328b, + 0x5443c594, + 0x40270e0b, + 0x01c313ee, + 0x015404bd, + 0x274cb4c1, + 0xbde40b32, + 0x990164e3, + 0x10a70cb0, + 0xb2993027, + 0x49b19d0d, + 0x2748b19d, + 0x9d100741, + 0xb3c51eb4, + 0x44b3c540, + 0x44271333, + 0x120014f5, + 0x2287ff02, + 0x23f50107, + 0xff021600, + 0x43270403, + 0xf50eb289, + 0x02120004, + 0x38b3c5ff, + 0xf13cb3c5, + 0x02100004, + 0xf848dcff, + 0x4a034207, + 0x4c833427, + 0xf526530f, + 0x02120003, + 0x142c33ff, + 0x4c333027, + 0xf542ab10, + 0x02140013, + 0x0414f5ff, + 0x9bff0214, + 0x345e0ef3, + 0x0c0d27fe, + 0xf5e07e64, + 0xbcc10607, + 0xf48e7e5c, + 0x2754b499, + 0xf5433335, + 0x02120043, + 0x54b299ff, + 0x22474327, + 0x12872103, + 0x120014f5, + 0x1ef1ff02, + 0xff021000, + 0xec33c02b, + 0x1dec5318, + 0x00a7efe6, + 0x23f12433, + 0xff021804, + 0x0764b499, + 0x3b21232e, + 0x27230b24, + 0x0014f542, + 0xc1ff0212, + 0x14f15cb3, + 0xff021000, + 0x07f848dc, + 0xce422b43, + 0xb29994c4, + 0x55b39954, + 0x02074127, + 0xc566b49d, + 0x03335cbc, + 0x04f54427, + 0xff021200, + 0x40273387, + 0x34f52007, + 0xff021600, + 0x43272403, + 0xf556b189, + 0x02120024, + 0x0024f1ff, + 0xdcff0210, + 0x4107f848, + 0x34274a03, + 0x530f4c83, + 0x0023f516, + 0x33ff0212, + 0x3027141c, + 0xab104c33, + 0x0003f541, + 0xf5ff0214, + 0x02140404, + 0x0ef39bff, + 0xbefd525e, + 0x5efcfa73, + 0x7307fd8c, + 0x315e712b, + 0x5e2027fe, + 0x0ea7ff6b, + 0xbeffffdf, + 0x07fcf765, + 0x6826be09, + 0xdf0ea700, + 0x33beffff, + 0x64a9fcf7, + 0xf253119a, + 0x4103fa80, + 0x64ad2001, + 0x4827119a, + 0xcfff3ea7, + 0x4c34c5fd, + 0x27f4c97e, + 0xff0ea740, + 0x04c5fdcf, + 0x6c04c54c, + 0x27fb0c5e, + 0xfb325e20, + 0x095e4127, + 0x5e4127fe, + 0x0c07fe3c, + 0x5ef4067e, + 0x2027fb77, + 0x7efbbc5e, + 0x0e96f505, + 0x119964b9, + 0x00b04fe6, + 0xf3c12327, + 0xd1090748, + 0xbe030c31, + 0x070069f4, + 0x8f0ff680, + 0x095499fa, + 0x24874383, + 0x422b4433, + 0x005043f9, + 0x32c0ff00, + 0xdf0ea734, + 0xcebeffff, + 0x0907fcf6, + 0x00678fbe, + 0xffdf0ea7, + 0xf69cbeff, + 0xf1f253fc, + 0x5e2001f9, + 0x2227ff72, + 0xaa7eb51e, + 0x962127f4, + 0x47202704, + 0xfabc5e22, + 0xc14cd1c1, + 0x1b9948f4, + 0x044cd141, + 0x99412703, + 0x4b3b4013, + 0xc4960127, + 0x23870027, + 0x4123210b, + 0x0047e307, + 0xe103310b, + 0x017424d5, + 0x34bd4027, + 0x30bd0154, + 0x1e9d0164, + 0x9428c540, + 0x05423b9d, + 0x5428c52c, + 0x02be0907, + 0x41270068, + 0x5e9cd49d, + 0x2027f9f6, + 0x4eff515e, + 0x0df393f5, + 0xfe93014b, + 0x6301521b, + 0x077007f0, + 0xe32fabd1, + 0xece37f3c, + 0x0334197f, + 0x3ec2803c, + 0xa474c1f9, + 0x99227389, + 0x322b0c44, + 0xb929749d, + 0x93037ed4, + 0x01513bf5, + 0x082a749d, + 0x1d342735, + 0xc1442753, + 0x749da473, + 0x4034992c, + 0xe088749d, + 0xe001ce41, + 0xd101ca43, + 0x83030cdc, + 0xc3330fcc, + 0xff84ce23, + 0xf3df7eff, + 0x01a00fe6, + 0x54198227, + 0x00874fe6, + 0x64036c07, + 0x4e8ef993, + 0x1ea02701, + 0xd2541906, + 0xd4d1744a, + 0xca070324, + 0xd4d19405, + 0xc5330320, + 0x074894c5, + 0x0b47334a, + 0x0cd1d1c4, + 0x00d2b903, + 0xf8d3d103, + 0x070c0702, + 0xb40f0346, + 0x050004e8, + 0x465abef8, + 0x6ccf0300, + 0xd10004e8, + 0xb9030cd1, + 0x070301d2, + 0x073807b0, + 0x6974be0c, + 0x030b8b00, + 0xa09c03a1, + 0xa7a70fd6, + 0xffffdf0e, + 0xfcf568be, + 0x29be0c07, + 0x0ea70066, + 0xbeffffdf, + 0x27fcf536, + 0x8ef04307, + 0xa474c1f5, + 0x4df7f293, + 0x8b43b901, + 0x9d142701, + 0x739d8573, + 0x2b74992b, + 0x4027241d, + 0x2c03243d, + 0xa7f188a0, + 0xebffff4e, + 0x02f0d6d1, + 0x01183e27, + 0x99430501, + 0x41e03c64, + 0x42e00102, + 0x3f270119, + 0x42788000, + 0xffff4ea7, + 0x274315eb, + 0x43c5613c, + 0x002e275c, + 0x42853a00, + 0x42a54295, + 0x42c542b5, + 0x27802730, + 0xc5ffff9d, + 0xd8073442, + 0xd60bd633, + 0x8100a127, + 0xdc03a027, + 0x27a6333d, + 0x27d119b0, + 0x0100000e, + 0x0004a5be, + 0x23732b07, + 0x1b074207, + 0x14834483, + 0xcb074333, + 0x11873207, + 0xeb074a0b, + 0x410bc183, + 0xe2833283, + 0x33874c0b, + 0x430bee47, + 0x4e0b2183, + 0x420b2247, + 0xd1030fab, + 0xb1034447, + 0x09070496, + 0x000040ed, + 0xbcc4ff17, + 0x8103b040, + 0x279882c4, + 0x0ef49b40, + 0xc5887399, + 0x33c03874, + 0x2b709963, + 0x749d4127, + 0x0c0c2387, + 0x076300c8, + 0x33300740, + 0x004d8345, + 0xf03c831f, + 0x34ab0573, + 0x30ab0783, + 0xffff4ea7, + 0x430027eb, + 0x7043c5f0, + 0x4ea7f58e, + 0xb9ffffff, + 0xe6119943, + 0x5e832734, + 0x8027fe56, + 0x89fe515e, + 0x422b2274, + 0x42274308, + 0x4227541d, + 0x5e2c749d, + 0x3f27fe27, + 0x52588000, + 0x99ff035e, + 0x42272b70, + 0x2387749d, + 0x00cc0c0c, + 0x1e00279f, + 0x003f279b, + 0x5e126880, + 0xf84efee8, + 0x0bc1d007, + 0xf2287ea4, + 0x018100e8, + 0xbd033b07, + 0x2b070393, + 0xe37f3ce3, + 0xbd237f2c, + 0x34190393, + 0xc2803c03, + 0x4007f932, + 0x46333087, + 0x400b432b, + 0x34333407, + 0x300b342b, + 0x23e51c27, + 0xfef2003e, + 0x21074b07, + 0x11233001, + 0x34034005, + 0xf2984403, + 0x4a66f393, + 0x11340101, + 0x03410332, + 0x15340521, + 0xec412332, + 0x01011b21, + 0xcb4ea733, + 0x4325fefd, + 0xb0a9b429, + 0x31270370, + 0x4ea7042b, + 0xc5fdcfff, + 0xd3c16843, + 0x890123a4, + 0xd0c51234, + 0x393299a8, + 0x8920d48d, + 0xd48d1434, + 0xdcb41922, + 0x45277f41, + 0x3389422b, + 0xc2043b14, + 0xf8937330, + 0x07014bec, + 0x27142738, + 0x1e349d40, + 0x0366349d, + 0xf190a03c, + 0xafaba007, + 0x4e56f993, + 0xffcea701, + 0x1b1efdcf, + 0x030cb3a9, + 0x8da094c1, + 0x38271243, + 0x7e4cc3c5, + 0x4027f0a2, + 0xc54cc4c5, + 0x1b076cc4, + 0x0d072a07, + 0x07fcb67e, + 0x03472340, + 0xd064000d, + 0xd289d342, + 0xa8d0c122, + 0x32074027, + 0x2328d49d, + 0xce404731, + 0x21d82443, + 0x9d412721, + 0x1f1e84d4, + 0xc122d289, + 0x4027a8d0, + 0xd49d3207, + 0x47312328, + 0x69f89340, + 0x34ce014b, + 0x9d4027de, + 0xb1a984d4, + 0x00470378, + 0x0002bcbe, + 0x9d0b809d, + 0xd3c1ab80, + 0x992127a4, + 0x31993934, + 0x2b4a1338, + 0x75243b41, + 0x55d245d2, + 0xa7d265d2, + 0xfddfff3e, + 0x994c34c1, + 0x4f8387d2, + 0x7fffffff, + 0xd405423b, + 0xd425d435, + 0xf88ed415, + 0x422b4203, + 0x31153405, + 0xa7fede5e, + 0xffffdf0e, + 0xfcf260be, + 0x4a07a027, + 0x37333a07, + 0x430b4533, + 0x34079407, + 0xe86c9f03, + 0x3f030004, + 0x0004e8b4, + 0x3499c027, + 0x86030712, + 0x4034c145, + 0xbe5e4fc6, + 0x030062f8, + 0xc43907c1, + 0xa103e9c2, + 0xa7c8a4c4, + 0xffffdf0e, + 0xfcf1f9be, + 0xf49b4027, + 0x0ef49b0b, + 0xcfffaea7, + 0xff9ea7fd, + 0x4827feff, + 0x274ca4c5, + 0xbf93bd32, + 0x9bc02719, + 0x41270efc, + 0x2760a4c5, + 0xef807e05, + 0x94bd4027, + 0xfc9b19bf, + 0x4cacc50e, + 0x7e6cacc5, + 0x00c8f01a, + 0xfdf25ed2, + 0x31213451, + 0x140b0307, + 0xadbe14eb, + 0x981efce5, + 0x7ea7f64e, + 0xd1ffffff, + 0x070c3c74, + 0xff9ea7c0, + 0x6ea7fd6f, + 0xa7fee65b, + 0xfeffff8e, + 0x00e64fe6, + 0x4ca39411, + 0x07941510, + 0xfda87e0c, + 0xc1a4cec1, + 0xeb99a0c0, + 0x27202739, + 0xc1312740, + 0x1527a8cd, + 0x9d08049d, + 0x029d0903, + 0x4d020d0c, + 0xa91b2b02, + 0x3b030ce2, + 0x8d0d6dd1, + 0xe4891202, + 0x23065512, + 0xb9a48741, + 0xf0038de2, + 0x8900bcb4, + 0x3b0714e4, + 0x4d2b3423, + 0x3b0b039d, + 0x07420243, + 0x07435b42, + 0x232a0734, + 0x23430721, + 0x0b138741, + 0x2d132b23, + 0x0a049d02, + 0xe4071103, + 0x00a241e8, + 0x21232307, + 0x42a73007, + 0x030d349d, + 0x0bf2b031, + 0x0d019d0e, + 0x89a4c4c1, + 0x433922c2, + 0x3c833123, + 0x2333330f, + 0xfffef43e, + 0xca98c3c5, + 0x0c0748d2, + 0x27f3347e, + 0x86c39911, + 0x23874307, + 0x422b4533, + 0x032bc299, + 0x6c42fd31, + 0xfdff0112, + 0x01126d41, + 0x9d3383ff, + 0x84b986c3, + 0x41030214, + 0x021484bd, + 0x0c3c74d1, + 0xff1e4ff6, + 0x4ce39411, + 0x5e941510, + 0x477eff1b, + 0x071d07ee, + 0xf3ea7e0c, + 0x0da34007, + 0x44ccfa00, + 0x1e1027ee, + 0x2b4427ad, + 0x0b049d4b, + 0x3b14e389, + 0xe23d2b24, + 0x07ff4c32, + 0xff475e32, + 0x6c5ee027, + 0xff1ea7ff, + 0x1401fd4f, + 0x03122f9b, + 0xc1443341, + 0x24ab3813, + 0x0027322e, + 0xf3abfe0b, + 0xc13812c5, + 0x42ce3814, + 0x27f3ebf8, + 0x4efe0b01, + 0x76d33efe, + 0x200c2705, + 0x959efe0e, + 0xfe8efce4, + 0x0088fe4e, + 0x1013100c, + 0xfe0e2127, + 0x00004e9e, + 0x10680013, + 0x44be2127, + 0x00130000, + 0x1013fe8e, + 0xfd4ef31e, + 0x271200c8, + 0x1410c8d0, + 0x2cbe2027, + 0xd4860000, + 0xfd8e0013, + 0xd1270013, + 0x13ee10cc, + 0xd6412710, + 0x1ed407d4, + 0x074027e4, + 0x27de1ed4, + 0x00099e21, + 0x9e202700, + 0x4e000003, + 0x3601c2fe, + 0x273310c8, + 0x203c2741, + 0x44471147, + 0xf02101c2, + 0x302707f3, + 0xfe8e26e6, + 0x27ee10cc, + 0x2b012a30, + 0x5334ab01, + 0xd6115341, + 0x0721b642, + 0x66fe8e03, + 0x1e302740, + 0x274127e9, + 0x00e31e30, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0xd007fb4e, + 0x0ea7b107, + 0x07fffbf3, + 0xbec2071d, + 0x36fc8151, + 0x071d0706, + 0xa73c072b, + 0xfffbf30e, + 0xfc96d9be, + 0xf49b4027, + 0x4efb8e0e, + 0x07d007fb, + 0xf30ea7b1, + 0x1d07fffb, + 0x13bec207, + 0x0636fcdd, + 0x2b071d07, + 0x0ea73c07, + 0xbefffbf3, + 0x27fce202, + 0x0ef49b40, + 0x0000fb8e, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0xd007fa4e, + 0x07120099, + 0x07b207a1, + 0x76230714, + 0x21d4510f, + 0x10d399dc, + 0xd285c40b, + 0xc4ebd195, + 0xa7353bce, + 0xffffdf0e, + 0xfcaf10be, + 0x0d071c07, + 0xfca2ebbe, + 0xffdf0ea7, + 0xaedcbeff, + 0x3b3127fc, + 0x0b31233b, + 0x07c3ebc3, + 0x234b5b4c, + 0x11d49d41, + 0x5510db9d, + 0xa1dca5d3, + 0x25dc15d4, + 0x0f4ccedc, + 0xc8be0d07, + 0x0127ffab, + 0x0127fa8e, + 0xf251fa8e, + 0x1a070d07, + 0xffb18abe, + 0x04964127, + 0x04074027, + 0x0000fa8e, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x0ac1f54e, + 0x99500740, + 0x435440a4, + 0xffff4ea7, + 0x9843b9ff, + 0xbe3fe611, + 0xb4a8b900, + 0xc08fe601, + 0x079a0700, + 0x272027ba, + 0xff6ea770, + 0xca07ffff, + 0xc4b9c20b, + 0x42d80164, + 0x5494b932, + 0x54b1c101, + 0xb994b0c1, + 0xd1016493, + 0x360174be, + 0x83430745, + 0x2642c043, + 0x32871027, + 0x11986db9, + 0x34d13a0b, + 0xdfd60174, + 0xce410373, + 0x27072114, + 0xb4032103, + 0x72079103, + 0x8eb828da, + 0xc24007f5, + 0x30075001, + 0x4027312b, + 0x140b1307, + 0xc199cd1e, + 0x870a0742, + 0x270c0bc7, + 0x8249be21, + 0x40a499fc, + 0xa49d4123, + 0x4053c140, + 0xc30b4027, + 0x0b40a299, + 0x74cdd537, + 0x5434bd01, + 0x423d9d01, + 0xcdc5cd05, + 0x94cdc554, + 0x01643dbd, + 0xb9b12fc6, + 0x1e01b4a8, + 0x033e079e, + 0x1e312b31, + 0xc1f58eb0, + 0x34c59434, + 0x8e8c1e54, + 0x31f64ef5, + 0x3804c106, + 0x1b3403c1, + 0xee700746, + 0xc1012734, + 0x94b94009, + 0x4c0601b4, + 0x3027e407, + 0xc387d027, + 0x490b4c07, + 0xc19441c1, + 0x390b544b, + 0x8d07a107, + 0x30b9ab2b, + 0x44d10164, + 0x8f6b0174, + 0x015432b9, + 0x00e91be2, + 0xd1031027, + 0x43834007, + 0x24b63d07, + 0xf00d42c0, + 0x0027c9fe, + 0x749d4227, + 0x07f68e12, + 0xca410b4a, + 0xc90bee46, + 0x6ae2c201, + 0x060700cc, + 0x0fe60a2b, + 0x1ff600d8, + 0xd02700cb, + 0xe0270027, + 0x7419ade6, + 0x7ac57339, + 0x3c789d34, + 0x2b0b4533, + 0x180043f5, + 0x72b5ff02, + 0x18044af5, + 0x1027ff02, + 0xe8004e23, + 0x034135fd, + 0xfde8004e, + 0x181042f5, + 0x4af5ff02, + 0xff021814, + 0x4e233807, + 0x4bfde7f0, + 0x0b41353f, + 0x6434b939, + 0xbd41a301, + 0xe6016434, + 0x1900820f, + 0xc5733974, + 0x7d9d3870, + 0xf545333d, + 0x02180043, + 0x307ec5ff, + 0x180440f5, + 0x71c1ff02, + 0x23202740, + 0xfde8004e, + 0x4e034235, + 0xf5fde800, + 0x0218104e, + 0x1440f5ff, + 0x07ff0218, + 0xf04e233d, + 0x3f4bfde7, + 0x310b4235, + 0x016434b9, + 0x41a30127, + 0x016434bd, + 0x749d4227, + 0x07f68e12, + 0x2ba103a4, + 0xff145eab, + 0xf68e0127, + 0xd027a607, + 0xe0270027, + 0x07ff3f5e, + 0x07df6bd8, + 0xff365ee2, + 0xe027d027, + 0x27ff2f5e, + 0xff025e01, + 0xc007f94e, + 0x6340c4c1, + 0xdf0ea7f0, + 0x9207ffff, + 0xf405a107, + 0xff8a45be, + 0x23032f07, + 0x2ce33f07, + 0x7f3ce37f, + 0x3c033419, + 0xf932c280, + 0xb940c3c1, + 0xe601b431, + 0x6434b916, + 0xb642f801, + 0x27230700, + 0x07310701, + 0xf0010310, + 0xbc277ef3, + 0x99f001ff, + 0x04b94003, + 0x43e201b4, + 0x4b07008a, + 0x4fc04f4b, + 0xffffffff, + 0x410d997e, + 0x29071a07, + 0x80be0d07, + 0xa007ff9d, + 0xc16c0fc6, + 0x1b0740ce, + 0x1f6b2e07, + 0x4027210b, + 0x24bd3227, + 0x23bd0154, + 0x2d9d0164, + 0x27f00142, + 0x40039941, + 0x11874d3b, + 0x20271e0b, + 0x31034123, + 0xd540039d, + 0x05017414, + 0x9412c51a, + 0x075412c5, + 0xfdef7e0c, + 0xffdf0ea7, + 0x8c1cbeff, + 0x430127fc, + 0xb9f98ef0, + 0x03016524, + 0x7442fc21, + 0x07f001ff, + 0x400399b1, + 0x01b404b9, + 0x34eabf6b, + 0x0ea7ff7a, + 0xbeffffdf, + 0x27fc8bf2, + 0x8ef04300, + 0x5eb027f9, + 0xfb4eff59, + 0x07120e99, + 0x07c107d0, + 0x562f6bb3, + 0xa740a7ee, + 0xfff01f3e, + 0x9d4003c5, + 0x0ea53d04, + 0xb5340ec5, + 0x3c049d0e, + 0xc5380ec5, + 0x0ec5300e, + 0xa70e2544, + 0xffffff3e, + 0x102134b9, + 0x32bd2402, + 0x6e7e1021, + 0x070676fd, + 0x071c070d, + 0xfebe7e2b, + 0x06664127, + 0xfb8e0407, + 0x567e0d07, + 0x8e0127fd, + 0x8e0127fb, + 0x074027fb, + 0x00fb8e04, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0xc107fc4e, + 0xcf6bd007, + 0xc886f093, + 0x00ad7e00, + 0x2ea7c7a6, + 0xa9feffff, + 0xa9014223, + 0xce014424, + 0x30277834, + 0x19c023bd, + 0xf49b4027, + 0x6b1d070e, + 0x0301871f, + 0x050c100f, + 0x9bd85300, + 0x0401103f, + 0xc746f293, + 0x2b2e5100, + 0x9d040543, + 0x249908e1, + 0xff3ea712, + 0xe49dfd4f, + 0x4d244909, + 0x082499e4, + 0x32112169, + 0xe46d410b, + 0xdcf6e205, + 0xf49b4027, + 0x8b00070e, + 0x272027ff, + 0x08e49d40, + 0x3f9be205, + 0x0b040110, + 0x06040543, + 0xff3ea7c6, + 0x32bdfeff, + 0x402719c0, + 0x8e0ef49b, + 0xbd3227fc, + 0x2719c023, + 0x0ef49b40, + 0x4ea73127, + 0xc5fdcfff, + 0x7e5e6043, + 0x734d07ff, + 0xe8410342, + 0x4ebb1ef4, + 0x1d0499f9, + 0x4fe6c007, + 0x40270148, + 0xa71d049d, + 0xfeffff2e, + 0x021424b9, + 0x014423a9, + 0x4f4b432b, + 0x071c41cc, + 0x150e27d2, + 0x102703e8, + 0xb9ff177e, + 0xa90214d4, + 0x2b0144d3, + 0xc84f4b43, + 0xcd99e841, + 0xff3ea71f, + 0xd123ffff, + 0x010834b9, + 0xee0fdc83, + 0x070145d4, + 0x3330274d, + 0x18c28943, + 0x011043f5, + 0x43f5ff00, + 0xff00010c, + 0xffff3ea7, + 0xb92cb6ff, + 0xe0010134, + 0x0106ff4c, + 0x010134b9, + 0x4b07b407, + 0xdb874633, + 0xde23d40b, + 0x07fff45c, + 0x2720274d, + 0x4205113c, + 0xf3c84403, + 0xd221c431, + 0xc141d405, + 0x4fff4ea7, + 0x01d175fd, + 0x103c3343, + 0xd22523ab, + 0x34b9121e, + 0xd4870101, + 0x4633b407, + 0xde23d40b, + 0xa7fff45c, + 0xfd4fffae, + 0x9ea7ae81, + 0x91feffff, + 0x2894d1a0, + 0x3093d101, + 0x51d23101, + 0x33e333d1, + 0x1b4e1b03, + 0x0b240b30, + 0x289ed513, + 0x3090d501, + 0x55d23501, + 0xa1c451d1, + 0xd1f293d3, + 0x340b00c5, + 0x24b9d3a5, + 0xa10104d0, + 0x43834103, + 0x04d024bd, + 0x2127d321, + 0x23ab213b, + 0x251ac499, + 0x894af6d2, + 0xc19918c4, + 0x1ec39921, + 0x0322c299, + 0x1fc09941, + 0x422b413b, + 0x92a93833, + 0x4c330144, + 0xab30ab10, + 0xff4ea734, + 0x2103ffff, + 0x010843d5, + 0x014492ad, + 0xf98e0127, + 0x1b07a401, + 0xab144c33, + 0x07d22524, + 0x3d97be0c, + 0xa730a7fc, + 0xffffff4e, + 0x010143bd, + 0x0e27ae1e, + 0x2703e807, + 0xfdca7e10, + 0xf46b0ea7, + 0x9855beff, + 0xc8b007fc, + 0x4ea7e900, + 0xbdffffff, + 0x5e010140, + 0xb307feea, + 0x64060d27, + 0xa57e1027, + 0x08b4b9fd, + 0xac4dee01, + 0x4eee1efe, + 0x93c007f9, + 0x00c51bfd, + 0xa70c9c27, + 0xfd4fffae, + 0x1e33bc27, + 0x103f9b3e, + 0x5138d4c1, + 0xc5432bd2, + 0x299d38d4, + 0x12d49908, + 0x4909249d, + 0x4da111d4, + 0x08d49924, + 0x2105d369, + 0x246d430b, + 0xf4e84b07, + 0x20053027, + 0x9b08239d, + 0xd3c1104f, + 0xc5430b38, + 0x0c0738d4, + 0xc6fdfe7e, + 0xf98ebc0f, + 0xcea7fc4e, + 0x27fdcfff, + 0xc4c5104c, + 0x7e1f6b50, + 0x4027fd2c, + 0xc550c4c5, + 0xfc8e70c4, + 0x000000e5, + 0x00000012, + 0x9007f54e, + 0x60075007, + 0x0ea7d007, + 0xd1ffffff, + 0x930c3c04, + 0x00c483fb, + 0x01089d03, + 0x012c5d03, + 0x02306d03, + 0x5fff8ea7, + 0xcb7ea7fd, + 0x4fe6fefd, + 0x841101ac, + 0x15104ca3, + 0x01740184, + 0x2bb211b3, + 0xac41e843, + 0xae20e801, + 0x87420701, + 0x2b463332, + 0x07420b43, + 0x2b343334, + 0x9df41334, + 0x320b4101, + 0xf2003e23, + 0x072507fe, + 0x23300141, + 0x03200511, + 0x98240334, + 0x11b401f4, + 0x034103b3, + 0x15b40531, + 0xec4123b3, + 0x9301d731, + 0x00c40ff0, + 0x74150401, + 0x049cd3a9, + 0x012ed2a9, + 0x1ea74127, + 0xc5fdcfff, + 0x322b6814, + 0xd4b93123, + 0xd3ad012c, + 0x41f804c4, + 0xdcd10198, + 0xd2a90438, + 0xd4b904c4, + 0xd3b904ba, + 0x243b04af, + 0x017b3ff6, + 0xd0b9a027, + 0x04f00165, + 0x04230166, + 0xe05be207, + 0xd2a90403, + 0x1027013e, + 0x230b2123, + 0x40273127, + 0xa709d39d, + 0xfee64f3e, + 0x0d0cd19d, + 0x9dd14dd1, + 0xdc8d08d4, + 0x6dd35512, + 0xb92287de, + 0xf004b9d1, + 0xa9011504, + 0x070140d4, + 0x234a0b30, + 0x9d4e2b34, + 0x433b0bd3, + 0x41074102, + 0x3407435b, + 0x43072123, + 0x03874123, + 0x032b230b, + 0xd49dd22d, + 0x0701030a, + 0x1c41e814, + 0x23230701, + 0xa73d0721, + 0x0d349d42, + 0xf2b03103, + 0x109d1d0b, + 0x7e09070d, + 0x4127fe2b, + 0xfea2f053, + 0x0125d4bd, + 0x0108d2d1, + 0x36070401, + 0x34033101, + 0x24032105, + 0xd1d1f4a8, + 0xd3d10438, + 0xd0b90448, + 0xd1d504b4, + 0xd1a90114, + 0xd3d504c4, + 0xd0bd0118, + 0xd1ad0126, + 0xd3b90120, + 0xd0b904c0, + 0xd1b904ba, + 0xd4a9012d, + 0xd3bd012e, + 0xd0bd0128, + 0xd1bd0129, + 0x20270127, + 0x21274496, + 0x04b9d3b9, + 0xa798d489, + 0xffffff0e, + 0x4433439b, + 0x011cd4d5, + 0x04ded3b9, + 0x0c3c04d1, + 0x0122d2bd, + 0x012ad3bd, + 0xfe584ff6, + 0x4ce38411, + 0x01841510, + 0x11b30174, + 0xec432bb2, + 0xa7fe5841, + 0x5620ec20, + 0x7e0907fe, + 0x4027fd87, + 0x9b0bf49b, + 0x051e0ef4, + 0xfe4320ec, + 0x11270527, + 0x01fdcf7e, + 0x11b30174, + 0xcc432bb2, + 0x20a7eb41, + 0xd3a9e71e, + 0x44270140, + 0x143b402b, + 0xd49d3e2b, + 0xf531e20b, + 0x5e3107fe, + 0x4427fef0, + 0xe207402b, + 0x9b5ee43b, + 0x27a127fe, + 0xfe845e31, + 0x347e0907, + 0x38dcd1fd, + 0x12dc8d04, + 0x27fe615e, + 0xfef25e10, + 0x432b4203, + 0xc236f393, + 0x15340500, + 0xfe1d5e31, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x16131008, + 0x221d1b1a, + 0x18161010, + 0x25221d1b, + 0x1b1a1613, + 0x2622221d, + 0x1b1a1616, + 0x2825221d, + 0x1d1b1a16, + 0x30282320, + 0x201d1b1a, + 0x3a302823, + 0x221d1b1a, + 0x45382e26, + 0x26231d1b, + 0x5345382e, + 0x00030000, + 0x0002b4af, + 0x0001d0aa, + 0x00016fe2, + 0x000137b5, + 0x0001121c, + 0x0000f6c9, + 0x0000e1d1, + 0x0000d119, + 0x0000c362, + 0x0000b7e1, + 0x0000ae0e, + 0x0000a58c, + 0x00009e17, + 0x0000977b, + 0x00009194, + 0x00008c44, + 0x00008774, + 0x00008311, + 0x00007f0c, + 0x00007b59, + 0x00006c79, + 0x000061a8, + 0x0000595c, + 0x000052bf, + 0x00004d51, + 0x000048c4, + 0x000044e1, + 0x00004183, + 0x00003e8f, + 0x00003bf2, + 0x0000399c, + 0x00003782, + 0x0000359a, + 0x000033dd, + 0x00003246, + 0x000030d0, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x0000d1f3, + 0x0000d1f8, + 0x0000d200, + 0x0000d208, + 0x0000d20e, + 0x0000d215, + 0x0000d220, + 0x0000d229, + 0x0000d232, + 0x0000d236, + 0x0000d23c, + 0x0000d246, + 0x0000d24e, + 0x0000d25c, + 0x0000d269, + 0x0000d270, + 0x0000d27c, + 0x0000d286, + 0x0000d291, + 0x0000d1f3, + 0x0000d29c, + 0x0000d2a4, + 0x0000d2ac, + 0x0000d2d0, + 0x0000d2b0, + 0x0000d200, + 0x0000d2b9, + 0x0000d2c3, + 0x0000d2cd, + 0x0000d2d7, + 0x0000d2e1, + 0x0000d2e9, + 0x0000d2f2, + 0x0000d2f8, + 0x0000d2ff, + 0x0000d305, + 0x0000d310, + 0x0000d31a, + 0x0000d1f3, + 0x0000d29c, + 0x0000d320, + 0x0000d329, + 0x0000d332, + 0x0000d336, + 0x0000d33d, + 0x0000d345, + 0x0000d34f, + 0x0000d356, + 0x0000d35e, + 0x0000d369, + 0x0000d36d, + 0x0000d375, + 0x0000d37f, + 0x0000d388, + 0x0000d38d, + 0x0000d395, + 0x0000d3a1, + 0x0000d3a7, + 0x0000d3b2, + 0x0000d3bc, + 0x0000d1f3, + 0x0000d29c, + 0x0000d3c4, + 0x0000d3ce, + 0x0000d3d9, + 0x0000d3e6, + 0x0000d3ed, + 0x0000d3f0, + 0x0000d3f7, + 0x0000d3fd, + 0x0000d407, + 0x0000d410, + 0x0000d417, + 0x0000d41e, + 0x0000d3bc, + 0x0000d1f3, + 0x0000d29c, + 0x0000d426, + 0x0000d431, + 0x0000d439, + 0x0000d2d0, + 0x0000d43d, + 0x0000d44b, + 0x0000d453, + 0x0000d45e, + 0x0000d296, + 0x0000d467, + 0x0000d473, + 0x0000d47e, + 0x0000d488, + 0x0000d493, + 0x0000d49a, + 0x0000d4a8, + 0x0000d4b7, + 0x0000d1f3, + 0x0000d4bc, + 0x0000d4c1, + 0x0000d4cb, + 0x0000d4cf, + 0x0000d4d7, + 0x0000d4df, + 0x0000d4e9, + 0x0000d2c9, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, +}; +const int fw_jpegenc_size = 277760; diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mve_protocol_def_v2.h b/src/little/linux/drivers/media/platform/canaan-vpu/mve_protocol_def_v2.h new file mode 100755 index 000000000..7888514a3 --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mve_protocol_def_v2.h @@ -0,0 +1,2064 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +/* + * Copyright: + * ---------------------------------------------------------------------------- + * This confidential and proprietary software may be used only as authorized + * by a licensing agreement from Arm Technology (China) Co., Ltd. + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * The entire notice above must be reproduced on all authorized copies and + * copies may only be made to the extent permitted by a licensing agreement + * from Arm Technology (China) Co., Ltd. + * ---------------------------------------------------------------------------- + */ +#ifndef __FW_INCLUDE__MVE_PROTOCOL_DEF_H__ +#define __FW_INCLUDE__MVE_PROTOCOL_DEF_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __KERNEL__ +#include +#else +#include +#endif + +/***************************************************************************** + * + * Communication protocol between the host/driver and the MVE firmware, + * the 'host interface'. + * + * MVE == LINLON Video Engine + * + * Protocol version 2.5 + * + * Note: Message structs may be expanded in the future; the host should + * use the 'size' of the message to determine how many bytes to + * read from the message queue, rather than a sizeof(struct). + * + ****************************************************************************/ + + + + + + + + + + + + + + + + + +/***************************************************************************** + * + * Virtual memory regions + * + * ..._ADDR_BEGIN gives the starting virtual address of the region, + * and ..._ADDR_END the (non-inclusive) ending address, such that + * the size of the region is obtained with the subtraction + * (..._ADDR_END - ..._ADDR_BEGIN). + * + ****************************************************************************/ + +/* Memory region for first firmware instance */ +#define MVE_MEM_REGION_FW_INSTANCE0_ADDR_BEGIN (0x00000000u) +#define MVE_MEM_REGION_FW_INSTANCE0_ADDR_END (0x000FFFFFu + 1) + +/* + * Areas for communication between host and MVE are placed in the interval + * 0x10079000 - 0x1007FFFF, see special defines further down. + */ + +/* PROTECTED virtual memory region */ +#define MVE_MEM_REGION_PROTECTED_ADDR_BEGIN (0x20000000u) +#define MVE_MEM_REGION_PROTECTED_ADDR_END (0x4FFFFFFFu + 1) + +/* FRAMEBUF virtual memory region */ +#define MVE_MEM_REGION_FRAMEBUF_ADDR_BEGIN (0x50000000u) +#define MVE_MEM_REGION_FRAMEBUF_ADDR_END (0x7FFFFFFFu + 1) + +/* Memory regions for other firmware instances */ +#define MVE_MEM_REGION_FW_INSTANCE1_ADDR_BEGIN (0x80000000u) +#define MVE_MEM_REGION_FW_INSTANCE1_ADDR_END \ + (MVE_MEM_REGION_FW_INSTANCE1_ADDR_BEGIN + MVE_MEM_REGION_FW_INSTANCE0_ADDR_END) + +#define MVE_MEM_REGION_FW_INSTANCE2_ADDR_BEGIN (0x90000000u) +#define MVE_MEM_REGION_FW_INSTANCE2_ADDR_END \ + (MVE_MEM_REGION_FW_INSTANCE2_ADDR_BEGIN + MVE_MEM_REGION_FW_INSTANCE0_ADDR_END) + +#define MVE_MEM_REGION_FW_INSTANCE3_ADDR_BEGIN (0xA0000000u) +#define MVE_MEM_REGION_FW_INSTANCE3_ADDR_END \ + (MVE_MEM_REGION_FW_INSTANCE3_ADDR_BEGIN + MVE_MEM_REGION_FW_INSTANCE0_ADDR_END) + +#define MVE_MEM_REGION_FW_INSTANCE4_ADDR_BEGIN (0xB0000000u) +#define MVE_MEM_REGION_FW_INSTANCE4_ADDR_END \ + (MVE_MEM_REGION_FW_INSTANCE4_ADDR_BEGIN + MVE_MEM_REGION_FW_INSTANCE0_ADDR_END) + +#define MVE_MEM_REGION_FW_INSTANCE5_ADDR_BEGIN (0xC0000000u) +#define MVE_MEM_REGION_FW_INSTANCE5_ADDR_END \ + (MVE_MEM_REGION_FW_INSTANCE5_ADDR_BEGIN + MVE_MEM_REGION_FW_INSTANCE0_ADDR_END) + +#define MVE_MEM_REGION_FW_INSTANCE6_ADDR_BEGIN (0xD0000000u) +#define MVE_MEM_REGION_FW_INSTANCE6_ADDR_END \ + (MVE_MEM_REGION_FW_INSTANCE6_ADDR_BEGIN + MVE_MEM_REGION_FW_INSTANCE0_ADDR_END) + +#define MVE_MEM_REGION_FW_INSTANCE7_ADDR_BEGIN (0xE0000000u) +#define MVE_MEM_REGION_FW_INSTANCE7_ADDR_END \ + (MVE_MEM_REGION_FW_INSTANCE7_ADDR_BEGIN + MVE_MEM_REGION_FW_INSTANCE0_ADDR_END) + +/* 0xF0000000 - 0xFFFFFFFF is used internally in MVE */ + + + + + + + + + + + + + + + + +/***************************************************************************** + * + * Communication queues between HOST/DRIVER and MVE + * + * Address for queue for messages in to MVE, + * one struct mve_comm_area_host located here + * + ****************************************************************************/ + +#define MVE_COMM_MSG_INQ_ADDR (0x10079000u) + +/* Address for queue for messages out from MVE, + * one struct mve_comm_area_mve located here + */ +#define MVE_COMM_MSG_OUTQ_ADDR (0x1007A000u) + +/* Address for queue for input buffers in to MVE, + * one struct mve_comm_area_host located here + */ +#define MVE_COMM_BUF_INQ_ADDR (0x1007B000u) + +/* Address for queue for input buffers returned from MVE, + * one struct mve_comm_area_mve located here + */ +#define MVE_COMM_BUF_INRQ_ADDR (0x1007C000u) + +/* Address for queue for output buffers in to MVE, + * one struct mve_comm_area_host located here + */ +#define MVE_COMM_BUF_OUTQ_ADDR (0x1007D000u) + +/* Address for queue for output buffers returned from MVE, + * one struct mve_comm_area_mve located here + */ +#define MVE_COMM_BUF_OUTRQ_ADDR (0x1007E000u) + +/* One struct mve_rpc_communication_area located here */ +#define MVE_COMM_RPC_ADDR (0x1007F000u) + +/* Address for ram_print buffer in FW */ +#define MVE_FW_PRINT_RAM_ADDR (0x10100000u) +#define MVE_FW_PRINT_RAM_SIZE (0x80000u) + +/* One page of memory (4 kB) is used for each queue, + * so maximum 1024 words, but need room for some counters as well, + * see structs mve_comm_area_mve and mve_comm_area_host below. + */ +#define MVE_COMM_QUEUE_SIZE_IN_WORDS 1020 + +/* This is the part of the message area that is written by host. */ +struct mve_comm_area_host +{ + volatile uint16_t out_rpos; + volatile uint16_t in_wpos; + volatile uint32_t reserved[ 3 ]; + /* + * Queue of messages to MVE, each block of data prefixed with + * a mve_msg_header + */ + volatile uint32_t in_data[ MVE_COMM_QUEUE_SIZE_IN_WORDS ]; +}; + +/* This is the part of the message area that is written by MVE. */ +struct mve_comm_area_mve +{ + volatile uint16_t out_wpos; + volatile uint16_t in_rpos; + volatile uint32_t reserved[ 3 ]; + /* + * Queue of messages to host, each block of data prefixed with + * a mve_msg_header + */ + volatile uint32_t out_data[ MVE_COMM_QUEUE_SIZE_IN_WORDS ]; +}; + +#define MVE_RPC_AREA_SIZE_IN_WORDS 256 +#define MVE_RPC_DATA_SIZE_IN_WORDS (MVE_RPC_AREA_SIZE_IN_WORDS - 3) +union mve_rpc_params +{ + volatile uint32_t data[ MVE_RPC_DATA_SIZE_IN_WORDS ]; + struct + { + char string[ MVE_RPC_DATA_SIZE_IN_WORDS * 4 ]; + } debug_print; + struct + { + uint32_t size; + uint32_t max_size; + uint8_t region; /* Memory region selection */ + #define MVE_MEM_REGION_PROTECTED (0) + #define MVE_MEM_REGION_OUTBUF (1) + #define MVE_MEM_REGION_FRAMEBUF (MVE_MEM_REGION_OUTBUF) + + /* The newly allocated memory must be placed + * on (at least) a 2^(log2_alignment) boundary + */ + uint8_t log2_alignment; + } mem_alloc; + struct + { + uint32_t ve_pointer; + uint32_t new_size; + } mem_resize; + struct + { + uint32_t ve_pointer; + } mem_free; +}; + +struct mve_rpc_communication_area +{ + volatile uint32_t state; + #define MVE_RPC_STATE_FREE (0) + #define MVE_RPC_STATE_PARAM (1) + #define MVE_RPC_STATE_RETURN (2) + volatile uint32_t call_id; + #define MVE_RPC_FUNCTION_DEBUG_PRINTF (1) + #define MVE_RPC_FUNCTION_MEM_ALLOC (2) + #define MVE_RPC_FUNCTION_MEM_RESIZE (3) + #define MVE_RPC_FUNCTION_MEM_FREE (4) + volatile uint32_t size; + union mve_rpc_params params; +}; + +struct mve_fw_ram_print_head_aera +{ + volatile uint32_t rd_cnt; + volatile uint32_t reserved0[15]; + + volatile uint32_t flag; + volatile uint32_t index; + volatile uint32_t wr_cnt; + volatile uint32_t reserved1[13]; +}; + + + + + + + + + + + + + + + +/********************************************************************* + * + * Message codes + * + *********************************************************************/ + +/* Messages consist of one struct mve_msg_header, possibly followed + * by extra data. + */ +struct mve_msg_header +{ + uint16_t code; + /* REQUESTs are messages from the + * host/driver to the firmware: Code: Extra data in message: */ + #define MVE_REQUEST_CODE_GO (1001) /* no extra data */ + #define MVE_REQUEST_CODE_STOP (1002) /* no extra data */ + #define MVE_REQUEST_CODE_INPUT_FLUSH (1003) /* no extra data */ + #define MVE_REQUEST_CODE_OUTPUT_FLUSH (1004) /* no extra data */ + #define MVE_REQUEST_CODE_SWITCH (1005) /* no extra data */ + #define MVE_REQUEST_CODE_PING (1006) /* no extra data */ + #define MVE_REQUEST_CODE_DUMP (1008) /* no extra data */ + #define MVE_REQUEST_CODE_JOB (1009) /* struct mve_request_job */ + #define MVE_REQUEST_CODE_SET_OPTION (1010) /* struct mve_request_set_option (variable size) */ + #define MVE_REQUEST_CODE_RELEASE_REF_FRAME (1011) /* struct mve_request_release_ref_frame */ + #define MVE_REQUEST_CODE_IDLE_ACK (1012) /* no extra data */ + #define MVE_REQUEST_CODE_DEBUG (1013) /* level: 0 for disable, refer to fw_log_level */ + /* RESPONSEs are messages from + * the firmware to the host: */ + #define MVE_RESPONSE_CODE_SWITCHED_IN (2001) /* struct mve_response_switched_in */ + #define MVE_RESPONSE_CODE_SWITCHED_OUT (2002) /* struct mve_response_switched_out */ + #define MVE_RESPONSE_CODE_SET_OPTION_CONFIRM (2003) /* no extra data */ + #define MVE_RESPONSE_CODE_JOB_DEQUEUED (2004) /* struct mve_response_job_dequeued */ + #define MVE_RESPONSE_CODE_INPUT (2005) /* no extra data, but buffer placed in buffer queue */ + #define MVE_RESPONSE_CODE_OUTPUT (2006) /* no extra data, but buffer placed in buffer queue */ + #define MVE_RESPONSE_CODE_INPUT_FLUSHED (2007) /* no extra data */ + #define MVE_RESPONSE_CODE_OUTPUT_FLUSHED (2008) /* no extra data */ + #define MVE_RESPONSE_CODE_PONG (2009) /* no extra data */ + #define MVE_RESPONSE_CODE_ERROR (2010) /* struct mve_response_error */ + #define MVE_RESPONSE_CODE_STATE_CHANGE (2011) /* struct mve_response_state_change */ + #define MVE_RESPONSE_CODE_DUMP (2012) /* no extra data */ + #define MVE_RESPONSE_CODE_IDLE (2013) /* no extra data */ + #define MVE_RESPONSE_CODE_FRAME_ALLOC_PARAM (2014) /* struct mve_response_frame_alloc_parameters */ + #define MVE_RESPONSE_CODE_SEQUENCE_PARAMETERS (2015) /* struct mve_response_sequence_parameters */ + #define MVE_RESPONSE_CODE_EVENT (2016) /* struct mve_response_event (variable size) */ + #define MVE_RESPONSE_CODE_SET_OPTION_FAIL (2017) /* struct mve_response_set_option_failed */ + #define MVE_RESPONSE_CODE_REF_FRAME_UNUSED (2018) /* struct mve_response_ref_frame_unused */ + #define MVE_RESPONSE_CODE_DEBUG (2019) /* no extra data */ + /* BUFFERs are sent from host to firmware, + * and then return at some time: */ + #define MVE_BUFFER_CODE_FRAME (3001) /* struct mve_buffer_frame */ + #define MVE_BUFFER_CODE_BITSTREAM (3002) /* struct mve_buffer_bitstream */ + #define MVE_BUFFER_CODE_PARAM (3003) /* struct mve_buffer_param */ + #define MVE_BUFFER_CODE_GENERAL (3004) /* struct mve_buffer_general */ + + uint16_t size; /* size in bytes of trailing data, 0 if none */ +}; + + + + + + + + + + + + + + + + +/********************************************************************* + * + * REQUESTs are messages from the host to the firmware + * + * Some of the MVE_REQUEST_CODE_ codes are followed by one of the + * structs below. + * + *********************************************************************/ + +struct mve_request_job +{ + uint16_t cores; /* >= 1, number of cores to use, must match request to HW scheduler */ + uint16_t frames; /* number of frames to process, zero means infinite */ + uint32_t flags; /* can be zero */ + #define MVE_JOB_FLAG_DISABLE_BNDMGR (0x01) +}; + +struct mve_request_set_option +{ + uint32_t index; + #define MVE_SET_OPT_INDEX_NALU_FORMAT (1) /* see arg, MVE_OPT_NALU_FORMAT_ */ + #define MVE_SET_OPT_INDEX_STREAM_ESCAPING (2) /* arg=1 to enable (default), arg=0 to disable */ + #define MVE_SET_OPT_INDEX_PROFILE_LEVEL (3) /* data.profile_level */ + #define MVE_SET_OPT_INDEX_HOST_PROTOCOL_PRINTS (4) /* arg=1 to enable, arg=0 to disable (default) */ + #define MVE_SET_OPT_INDEX_PROFILING (5) /* arg=1 to enable, arg=0 to disable (default) */ + #define MVE_SET_OPT_INDEX_DISABLE_FEATURES (6) /* see arg, MVE_OPT_DISABLE_FEATURE_ */ + #define MVE_SET_OPT_INDEX_IGNORE_STREAM_HEADERS (7) /* decode, arg=1 to enable, + * arg=0 to disable (default) */ + #define MVE_SET_OPT_INDEX_FRAME_REORDERING (8) /* decode, arg=1 to enable (default), + * arg=0 to disable */ + #define MVE_SET_OPT_INDEX_INTBUF_SIZE (9) /* decode, arg = suggested limit of intermediate + * buffer allocation */ + #define MVE_SET_OPT_INDEX_ENC_P_FRAMES (16) /* encode, arg = nPFrames */ + #define MVE_SET_OPT_INDEX_ENC_B_FRAMES (17) /* encode, arg = number of B frames */ + #define MVE_SET_OPT_INDEX_GOP_TYPE (18) /* encode, see arg */ + #define MVE_SET_OPT_INDEX_INTRA_MB_REFRESH (19) /* encode, arg */ + #define MVE_SET_OPT_INDEX_ENC_CONSTR_IPRED (20) /* encode, arg = 0 or 1 */ + #define MVE_SET_OPT_INDEX_ENC_ENTROPY_SYNC (21) /* encode, arg = 0 or 1 */ + #define MVE_SET_OPT_INDEX_ENC_TEMPORAL_MVP (22) /* encode, arg = 0 or 1 */ + #define MVE_SET_OPT_INDEX_TILES (23) /* encode, data.tiles */ + #define MVE_SET_OPT_INDEX_ENC_MIN_LUMA_CB_SIZE (24) /* HEVC encode, arg = 8 or 16, + * for sizes 8x8 or 16x16 */ + #define MVE_SET_OPT_INDEX_ENC_MB_TYPE_ENABLE (25) /* encode, see arg */ + #define MVE_SET_OPT_INDEX_ENC_MB_TYPE_DISABLE (26) /* encode, see arg */ + #define MVE_SET_OPT_INDEX_ENC_H264_CABAC (27) /* encode, arg = 0 or 1, enabled by default */ + #define MVE_SET_OPT_INDEX_ENC_SLICE_SPACING (28) /* encode, arg = suggested number of + * CTUs/macroblocks in a slice */ + #define MVE_SET_OPT_INDEX_ENC_VP9_PROB_UPDATE (30) /* VP9 encode, see arg */ + #define MVE_SET_OPT_INDEX_RESYNC_INTERVAL (31) /* JPEG encode, arg = nRestartInterval + * = nResynchMarkerSpacing */ + #define MVE_SET_OPT_INDEX_HUFFMAN_TABLE (32) /* JPEG encode, data.huffman_table */ + #define MVE_SET_OPT_INDEX_QUANT_TABLE (33) /* JPEG encode, data.quant_table */ + #define MVE_SET_OPT_INDEX_ENC_EXPOSE_REF_FRAMES (34) /* encode only, disabled by default */ + #define MVE_SET_OPT_INDEX_MBINFO_OUTPUT (35) /* encode, arg=1 to enable, + * arg=0 to disable (default) */ + #define MVE_SET_OPT_INDEX_MV_SEARCH_RANGE (36) /* encode, data,motion_vector_search_range */ + #define MVE_SET_OPT_INDEX_ENC_STREAM_BITDEPTH (38) /* encode, data.bitdepth, to set other bitdepth + * of encoded stream than of input frames */ + #define MVE_SET_OPT_INDEX_ENC_STREAM_CHROMA_FORMAT (39) /* encode, arg, to set other chroma format of + * encoded stream than of input frames */ + #define MVE_SET_OPT_INDEX_ENC_RGB_TO_YUV_MODE (40) /* encode, arg, select which way RGB is converted + * to YUV before encoding */ + #define MVE_SET_OPT_INDEX_ENC_BANDWIDTH_LIMIT (41) /* encode, arg, the maxium bandwidth limit defined + * by host */ + #define MVE_SET_OPT_INDEX_WATCHDOG_TIMEOUT (42) /* arg=timeout, arg=0 to disable */ + #define MVE_SET_OPT_INDEX_ENC_CABAC_INIT_IDC (43) /* encode, arg; 0,1,2 for H264; 0,1 for HEVC */ + #define MVE_SET_OPT_INDEX_ENC_ADPTIVE_QUANTISATION (44) /* encode (h264 and hevc) */ + #define MVE_SET_OPT_INDEX_QP_DELTA_I_P (45) + #define MVE_SET_OPT_INDEX_QP_DELTA_I_B_REF (46) + #define MVE_SET_OPT_INDEX_QP_DELTA_I_B_NONREF (47) + #define MVE_SET_OPT_INDEX_CB_QP_OFFSET (48) + #define MVE_SET_OPT_INDEX_CR_QP_OFFSET (49) + #define MVE_SET_OPT_INDEX_LAMBDA_SCALE (50) /* encode, data.lambda_scale */ + #define MVE_SET_OPT_INDEX_ENC_MAX_NUM_CORES (51) /* maximum number of cores */ + #define MVE_SET_OPT_INDEX_ENC_EXTRA_REFS (52) /* configure number of extra ref buffers */ + #define MVE_SET_OPT_INDEX_QP_DELTA_RAW_I_P (53) + #define MVE_SET_OPT_INDEX_QP_DELTA_RAW_I_B_REF (54) + #define MVE_SET_OPT_INDEX_QP_DELTA_RAW_I_B_NONREF (55) + #define MVE_SET_OPT_INDEX_ENC_FIXED_QP (56) + /* ARBITRARY_DOWNSCALE */ + #define MVE_SET_OPT_INDEX_DEC_DOWNSCALE (57) /* decode, set downscaled width and height */ + #define MVE_SET_OPT_INDEX_FLUSHLESS_REFBANK (58) /* configure AFBC ref bank for individual buffer + * allocation. Forced internally for flushless + * resolution change codecs */ + #define MVE_SET_OPT_INDEX_ENC_SAO_LUMA_EN (60) + #define MVE_SET_OPT_INDEX_ENC_SAO_CHROMA_EN (61) + + #define MVE_SET_OPT_INDEX_ENC_CROP_RARAM_LEFT (62) + #define MVE_SET_OPT_INDEX_ENC_CROP_RARAM_RIGHT (63) + #define MVE_SET_OPT_INDEX_ENC_CROP_RARAM_TOP (64) + #define MVE_SET_OPT_INDEX_ENC_CROP_RARAM_BOTTOM (65) + /* LONG_TERM_REFERENCE */ + #define MVE_SET_OPT_INDEX_ENC_LTR_MODE (66) + #define MVE_SET_OPT_INDEX_ENC_LTR_PERIOD (67) + #define MVE_SET_OPT_INDEX_DEC_DOWNSCALE_POS_MODE (69) + #define MVE_SET_OPT_INDEX_MINI_FRAME_HEIGHT_PIX (70) /* max cnt of mini frames*/ + /* Encode Data Statistics */ + #define MVE_SET_OPT_INDEX_ENC_STATS_MODE (71) + #define MVE_SET_OPT_INDEX_ENC_MULTI_SPS_PPS (73) + #define MVE_SET_OPT_INDEX_ENC_INIT_QPI (74) + #define MVE_SET_OPT_INDEX_ENC_INIT_QPP (75) + #define MVE_SET_OPT_INDEX_ENC_INIT_QPB (76) + + #define MVE_SET_OPT_INDEX_ENC_RC_CLIP_TOP (80) + #define MVE_SET_OPT_INDEX_ENC_RC_CLIP_BOTTOM (81) + #define MVE_SET_OPT_INDEX_ENC_QPMAP_CLIP_TOP (82) + #define MVE_SET_OPT_INDEX_ENC_QPMAP_CLIP_BOTTOM (83) + + #define MVE_SET_OPT_INDEX_ENC_REF_RING_BUFFER (84) + #define MVE_SET_OPT_INDEX_ENC_JPEG_RC (85) //MVE_ENC_RC_JPEG + #define MVE_SET_OPT_INDEX_ENC_RC_I_BIT_RATIO (86) /* RC_I_BIT_RATIO */ + #define MVE_SET_OPT_INDEX_ENC_RC_I_BIT_MODE (87) /* RC_I_BIT_RATIO */ + /* SVCT3 level-1 peroid */ + #define MVE_SET_OPT_INDEX_ENC_SVCT3_LEVEL1_PEROID (88) + #define MVE_SET_OPT_iNDEX_ENC_VISUAL_ENABLE (89)//enable_visual FW CODE IS iNDEX + /* GDR */ + #define MVE_SET_OPT_INDEX_ENC_GDR_NUMBER (90) + #define MVE_SET_OPT_INDEX_ENC_GDR_PERIOD (91) + #define MVE_SET_OPT_INDEX_SCD_ENABLE (93) + #define MVE_SET_OPT_INDEX_SCD_PERCENT (94) + #define MVE_SET_OPT_INDEX_SCD_THRESHOLD (95) + /* for aq, add new para */ + #define MVE_SET_OPT_INDEX_ENC_AQ_SSIM_EN (96) + #define MVE_SET_OPT_INDEX_ENC_AQ_NEG_RATIO (97) + #define MVE_SET_OPT_INDEX_ENC_AQ_POS_RATIO (98) + #define MVE_SET_OPT_INDEX_ENC_AQ_QPDELTA_LMT (99) + #define MVE_SET_OPT_INDEX_ENC_AQ_INIT_FRM_AVG_SVAR (100) + #define MVE_SET_OPT_INDEX_SCD_ADAPTIVE_I (101) + #define MVE_SET_OPT_INDEX_DEC_YUV2RGB_PARAMS (103) + #define MVE_SET_OPT_INDEX_ENC_FORCED_UV_VAL (104) + #define MVE_SET_OPT_INDEX_DEC_DSL_INTERP_MODE (105) + + #define MVE_SET_OPT_INDEX_ENC_SRC_CROPPING (106) + #define MVE_SET_OPT_INDEX_DEC_DST_CROPPING (107) //ENABLE_DST_CROP + + union + { + uint32_t arg; /* Most options only need a uint32_t as argument */ + /* For option MVE_SET_OPT_INDEX_NALU_FORMAT, arg should + * be one of these: */ + #define MVE_OPT_NALU_FORMAT_START_CODES (1) + #define MVE_OPT_NALU_FORMAT_ONE_NALU_PER_BUFFER (2) + #define MVE_OPT_NALU_FORMAT_ONE_BYTE_LENGTH_FIELD (4) + #define MVE_OPT_NALU_FORMAT_TWO_BYTE_LENGTH_FIELD (8) + #define MVE_OPT_NALU_FORMAT_FOUR_BYTE_LENGTH_FIELD (16) + /* For option MVE_SET_OPT_INDEX_GOP_TYPE, arg should + * be one of these: */ + #define MVE_OPT_GOP_TYPE_BIDIRECTIONAL (1) + #define MVE_OPT_GOP_TYPE_LOW_DELAY (2) + #define MVE_OPT_GOP_TYPE_PYRAMID (3) + #define MVE_OPT_GOP_TYPE_SVCT3 (4) + #define MVE_OPT_GOP_TYPE_GDR (5) + /* For option MVE_SET_OPT_INDEX_ENC_VP9_PROB_UPDATE, + * arg should be one of these: */ + #define MVE_OPT_VP9_PROB_UPDATE_DISABLED (0) + #define MVE_OPT_VP9_PROB_UPDATE_IMPLICIT (1) + #define MVE_OPT_VP9_PROB_UPDATE_EXPLICIT (2) + /* For option MVE_SET_OPT_INDEX_DISABLE_FEATURES, arg + * should be a bitmask with features to disable: */ + #define MVE_OPT_DISABLE_FEATURE_AFBC_COMP (0x00000001) /* VDMA AFBC Compression */ + #define MVE_OPT_DISABLE_FEATURE_REF_CACHE (0x00000002) /* REF caching */ + #define MVE_OPT_DISABLE_FEATURE_DEBLOCK (0x00000004) /* Deblocking */ + #define MVE_OPT_DISABLE_FEATURE_SAO (0x00000008) /* SAO */ + #define MVE_OPT_DISABLE_FEATURE_PIC_OUTPUT (0x00000020) /* Picture Output Removal */ + #define MVE_OPT_DISABLE_FEATURE_PIPE (0x00000040) /* Pipe (i.e. parser-only) */ + #define MVE_OPT_DISABLE_FEATURE_SLEEP (0x00000080) /* Clock gating + * (SOC_SYSCTRL.SLEEP bit) */ + #define MVE_OPT_DISABLE_FEATURE_AFBC_LEGACY_REF (0x00000100) /* Enables tiled AFBC format in + * reference buffers. Ignored + * for decode AFBC output */ + #define MVE_OPT_DISABLE_FEATURE_REF_PICS (0x00000400) /* Forces use of static 16x16 + * reference pics */ + #define MVE_OPT_DISABLE_FEATURE_CHNG_RECT_WA (0x00000800) /* Disables workaround */ + #define MVE_OPT_DISABLE_FEATURE_REFSZ_LIMIT (0x00001000) /* Disable REFSZ bw limit */ + /* For options MVE_SET_OPT_INDEX_ENC_MB_TYPE_ENABLE + * and MVE_SET_OPT_INDEX_ENC_MB_TYPE_DISABLE, arg + * should be a bitmask of MVE_MBTYPEs: */ + #define MVE_MBTYPE_4x4 (0x00000001) /* 4x4 inter */ + #define MVE_MBTYPE_4x8 (0x00000002) /* 4x8 inter */ + #define MVE_MBTYPE_8x4 (0x00000004) /* 8x4 inter */ + #define MVE_MBTYPE_8x8 (0x00000008) /* 8x8 inter */ + #define MVE_MBTYPE_8x16 (0x00000010) /* 8x16 inter */ + #define MVE_MBTYPE_16x8 (0x00000020) /* 16x8 inter */ + #define MVE_MBTYPE_16x16 (0x00000040) /* 16x16 inter */ + #define MVE_MBTYPE_PSKIP (0x00000080) /* P Skip inter */ + #define MVE_MBTYPE_I4x4 (0x00000100) /* 4x4 intra */ + #define MVE_MBTYPE_I8x8 (0x00000200) /* 8x8 intra */ + #define MVE_MBTYPE_I16x16 (0x00000400) /* 16x16 intra */ + #define MVE_MBTYPE_I32x32 (0x00000800) /* 32x32 intra */ + #define MVE_MBTYPE_16x32 (0x00001000) /* 16x32 inter */ + #define MVE_MBTYPE_32x16 (0x00002000) /* 32x16 inter */ + #define MVE_MBTYPE_32x32 (0x00004000) /* 32x32 inter */ + /* For option MVE_SET_OPT_INDEX_ENC_RGB_TO_YUV_MODE, + * arg should be one of these: */ + #define MVE_OPT_RGB_TO_YUV_BT601_STUDIO (0) + #define MVE_OPT_RGB_TO_YUV_BT601_FULL (1) + #define MVE_OPT_RGB_TO_YUV_BT709_STUDIO (2) + #define MVE_OPT_RGB_TO_YUV_BT709_FULL (3) + #define MVE_OPT_RGB_TO_YUV_BT2020_STUDIO (4) + #define MVE_OPT_RGB_TO_YUV_BT2020_FULL (5) + /* For option MVE_SET_OPT_INDEX_ENC_EXPOSE_REF_FRAMES, + * arg should be one of: */ + #define MVE_OPT_REF_OUTPUT_NONE (0) /* No REF output */ + #define MVE_OPT_REF_OUTPUT_USED_FOR_REF (1) /* Output reference frames */ + #define MVE_OPT_REF_OUTPUT_ALL (2) /* Output/reconstruct all frames */ + struct + { + uint16_t profile; + /* AVC/H.264 profiles */ + #define MVE_OPT_PROFILE_H264_BASELINE (1) + #define MVE_OPT_PROFILE_H264_MAIN (2) + #define MVE_OPT_PROFILE_H264_HIGH (3) + /* HEVC/H.265 profiles */ + #define MVE_OPT_PROFILE_H265_MAIN (1) + #define MVE_OPT_PROFILE_H265_MAIN_STILL (2) + #define MVE_OPT_PROFILE_H265_MAIN_INTRA (3) + #define MVE_OPT_PROFILE_H265_MAIN_10 (4) + /* VC-1 profiles */ + #define MVE_OPT_PROFILE_VC1_SIMPLE (1) + #define MVE_OPT_PROFILE_VC1_MAIN (2) + #define MVE_OPT_PROFILE_VC1_ADVANCED (3) + /* VP8 profiles */ + #define MVE_OPT_PROFILE_VP8_MAIN (1) + uint16_t level; + /* AVC/H.264 levels */ + #define MVE_OPT_LEVEL_H264_1 (1) + #define MVE_OPT_LEVEL_H264_1b (2) + #define MVE_OPT_LEVEL_H264_11 (3) + #define MVE_OPT_LEVEL_H264_12 (4) + #define MVE_OPT_LEVEL_H264_13 (5) + #define MVE_OPT_LEVEL_H264_2 (6) + #define MVE_OPT_LEVEL_H264_21 (7) + #define MVE_OPT_LEVEL_H264_22 (8) + #define MVE_OPT_LEVEL_H264_3 (9) + #define MVE_OPT_LEVEL_H264_31 (10) + #define MVE_OPT_LEVEL_H264_32 (11) + #define MVE_OPT_LEVEL_H264_4 (12) + #define MVE_OPT_LEVEL_H264_41 (13) + #define MVE_OPT_LEVEL_H264_42 (14) + #define MVE_OPT_LEVEL_H264_5 (15) + #define MVE_OPT_LEVEL_H264_51 (16) + #define MVE_OPT_LEVEL_H264_52 (17) + #define MVE_OPT_LEVEL_H264_6 (18) + #define MVE_OPT_LEVEL_H264_61 (19) + #define MVE_OPT_LEVEL_H264_62 (20) + #define MVE_OPT_LEVEL_H264_USER_SUPPLIED_BASE (32) + /* The value (MVE_OPT_LEVEL_H264_USER_SUPPLIED_BASE + level_idc) encodes a user + * supplied level_idc value in the range 0 to 255 inclusive. If the host supplies a level_idc + * value by this method then the encoder will encode this level_idc value in the bitstream + * without checking the validity of the level_idc value + */ + #define MVE_OPT_LEVEL_H264_USER_SUPPLIED_MAX (MVE_OPT_LEVEL_H264_USER_SUPPLIED_BASE + 255) + /* HEVC/H.265 levels */ + #define MVE_OPT_LEVEL_H265_MAIN_TIER_1 (1) + #define MVE_OPT_LEVEL_H265_HIGH_TIER_1 (2) + #define MVE_OPT_LEVEL_H265_MAIN_TIER_2 (3) + #define MVE_OPT_LEVEL_H265_HIGH_TIER_2 (4) + #define MVE_OPT_LEVEL_H265_MAIN_TIER_21 (5) + #define MVE_OPT_LEVEL_H265_HIGH_TIER_21 (6) + #define MVE_OPT_LEVEL_H265_MAIN_TIER_3 (7) + #define MVE_OPT_LEVEL_H265_HIGH_TIER_3 (8) + #define MVE_OPT_LEVEL_H265_MAIN_TIER_31 (9) + #define MVE_OPT_LEVEL_H265_HIGH_TIER_31 (10) + #define MVE_OPT_LEVEL_H265_MAIN_TIER_4 (11) + #define MVE_OPT_LEVEL_H265_HIGH_TIER_4 (12) + #define MVE_OPT_LEVEL_H265_MAIN_TIER_41 (13) + #define MVE_OPT_LEVEL_H265_HIGH_TIER_41 (14) + #define MVE_OPT_LEVEL_H265_MAIN_TIER_5 (15) + #define MVE_OPT_LEVEL_H265_HIGH_TIER_5 (16) + #define MVE_OPT_LEVEL_H265_MAIN_TIER_51 (17) + #define MVE_OPT_LEVEL_H265_HIGH_TIER_51 (18) + #define MVE_OPT_LEVEL_H265_MAIN_TIER_52 (19) + #define MVE_OPT_LEVEL_H265_HIGH_TIER_52 (20) + #define MVE_OPT_LEVEL_H265_MAIN_TIER_6 (21) + #define MVE_OPT_LEVEL_H265_HIGH_TIER_6 (22) + #define MVE_OPT_LEVEL_H265_MAIN_TIER_61 (23) + #define MVE_OPT_LEVEL_H265_HIGH_TIER_61 (24) + #define MVE_OPT_LEVEL_H265_MAIN_TIER_62 (25) + #define MVE_OPT_LEVEL_H265_HIGH_TIER_62 (26) + } profile_level; + struct + { + int32_t mv_search_range_x; + int32_t mv_search_range_y; + } motion_vector_search_range; + struct + { + uint32_t type; + #define MVE_OPT_HUFFMAN_TABLE_DC_LUMA (1) + #define MVE_OPT_HUFFMAN_TABLE_AC_LUMA (2) + #define MVE_OPT_HUFFMAN_TABLE_DC_CHROMA (3) + #define MVE_OPT_HUFFMAN_TABLE_AC_CHROMA (4) + uint8_t number_of_huffman_of_code_length[ 16 ]; + uint8_t table[ 162 ]; /* 12 are used for DC, 162 for AC */ + } huffman_table; + struct + { + uint32_t type; + #define MVE_OPT_QUANT_TABLE_LUMA (1) + #define MVE_OPT_QUANT_TABLE_CHROMA (2) + uint8_t matrix[ 64 ]; + } quant_table; + struct + { + uint32_t qscale; + uint32_t qscale_luma; + uint32_t qscale_chroma; + uint32_t fps; + uint32_t change_pos; + } jpeg_rate_control; //MVE_ENC_RC_JPEG + struct + { + /* For HEVC, tile_cols must be zero. For VP9, tile_rows + * and tile_cols must be powers of 2. */ + uint16_t tile_rows; + uint16_t tile_cols; + } tiles; + struct + { + uint16_t luma_bitdepth; + uint16_t chroma_bitdepth; + } bitdepth; + struct + { + /* Scale factors, and their square roots, for the lambda + * coefficients used by the encoder, in unsigned Q8 fixed-point + * format. Default (no scaling) is 1.0 (so 0x0100 in hex). + */ + uint16_t lambda_scale_i_q8; + uint16_t lambda_scale_sqrt_i_q8; + uint16_t lambda_scale_p_q8; + uint16_t lambda_scale_sqrt_p_q8; + uint16_t lambda_scale_b_ref_q8; + uint16_t lambda_scale_sqrt_b_ref_q8; + uint16_t lambda_scale_b_nonref_q8; + uint16_t lambda_scale_sqrt_b_nonref_q8; + } lambda_scale; + /* ARBITRARY_DOWNSCALE */ + struct + { + uint16_t width; + uint16_t height; + } downscaled_frame; + struct + { + uint32_t mode; + } dsl_pos; + struct + { + int16_t coef[3][3]; //coef[Y|U|V][R|G|B] + uint16_t offset[3]; + } yuv2rgb_params; + struct + { + uint8_t rgb2yuv_mode; + int16_t coef[3 * 3]; //coef[Y|U|V][R|G|B] + uint8_t luma_range[2]; + uint8_t chroma_range[2]; + uint8_t rgb_range[2]; + } rgb2yuv_params; + struct + { + uint16_t value; + } gray_uv_value; + struct + { + uint16_t mode; + } interp_mode; + struct + { + uint8_t crop_en; + /* left start x of luma in original image */ + uint16_t x; //included + /* top start y of luma in original image */ + uint16_t y; //included + /* cropped width of luma in original image */ + uint16_t width; + /* cropped height of luma in original image */ + uint16_t height; + } enc_src_crop; + + struct + { + uint8_t crop_en; + /* left start x of luma in original image */ + uint16_t x; //included + /* top start y of luma in original image */ + uint16_t y; //included + /* cropped width of luma in original image */ + uint16_t width; + /* cropped height of luma in original image */ + uint16_t height; + } dec_dst_crop; //ENABLE_DST_CROP + } data; +}; + +struct mve_request_release_ref_frame +{ + /* Decode: For a frame buffer that MVE has returned + * marked as _REF_FRAME, the host can send this message + * to ask the MVE to release the buffer as soon as it is + * no longer used as reference anymore. (Otherwise, in + * normal operation, the host would re-enqueue the buffer + * to the MVE when it has been displayed and can be over- + * written with a new frame.) + * + * Note: When a frame is no longer used as reference depends + * on the stream being decoded, and there is no way to + * guarantee a short response time, the response may not + * come until the end of the stream. + * + * Encode: Return this reference buffer to the firmware + * so it can be reused. This is only useful when the + * MVE_SET_OPT_INDEX_ENC_EXPOSE_REF_FRAMES is used and reference + * frames are reported by events (and must be returned). + */ + uint32_t buffer_address; +}; + + + + + + + + + + + + + + +/********************************************************************* + * + * RESPONSEs are messages from the host to the firmware + * + * Some of the MVE_RESPONSE_CODE_ codes are followed by one of the + * structs below. + * + *********************************************************************/ + +/* Sent when firmware has booted. + */ +struct mve_response_switched_in +{ + uint32_t core; +}; + +/* Sent when last core in a session has switched out. + */ +struct mve_response_switched_out +{ + uint32_t core; + uint32_t reason; + uint32_t sub_reason; +}; + +/* Response confirming state transition after either GO or STOP + * command from host. + */ +struct mve_response_state_change +{ + uint32_t new_state; + #define MVE_STATE_STOPPED (0) + #define MVE_STATE_RUNNING (2) +}; + +/* Message sent when the all cores in the session have dequeued a + * job from the firmware job queue. + */ +struct mve_response_job_dequeued +{ + uint32_t valid_job; +}; + +/* Fatal error message from firmware, if sent then no further + * operation is possible. + */ +struct mve_response_error +{ + uint32_t error_code; + #define MVE_ERROR_ABORT (1) + #define MVE_ERROR_OUT_OF_MEMORY (2) + #define MVE_ERROR_ASSERT (3) + #define MVE_ERROR_UNSUPPORTED (4) + #define MVE_ERROR_INVALID_BUFFER (6) + #define MVE_ERROR_INVALID_STATE (8) + #define MVE_ERROR_WATCHDOG (9) + + #define MVE_MAX_ERROR_MESSAGE_SIZE (128) + char message[ MVE_MAX_ERROR_MESSAGE_SIZE ]; +}; + +/* When a set-option succeeds, a confirmation message is + * sent, including the index-code for that particular option. + */ +struct mve_response_set_option_confirm +{ + uint32_t index; /* Same as 'index' in struct mve_request_set_option */ +}; + +/* If a set-option request fails, this message is returned. + * This is not a fatal error. The set-option had no effect, + * and the session is still alive. + * For example, trying to set an option with a too large + * or small parameter would result in this message. + * The included text string is meant for development and + * debugging purposes only. + * (When a set-option succeeds the set-option-confirm + * message code is sent instead.) + */ +struct mve_response_set_option_fail +{ + uint32_t index; /* Same as 'index' in struct mve_request_set_option */ + char message[ MVE_MAX_ERROR_MESSAGE_SIZE ]; +}; + +/* Decode only: This message is sent from MVE to the host so that it can + * allocate large enough output buffers. Output buffers that are to small + * will be returned to the host marked as 'rejected'. + */ +struct mve_response_frame_alloc_parameters +{ + /* Please note that the below information is a hint + * for what buffers to allocate, it does not say + * what actual resolution an output picture has. + */ + + /* To use if allocating PLANAR YUV output buffers: */ + uint16_t planar_alloc_frame_width; + uint16_t planar_alloc_frame_height; + + /* To use if allocating AFBC output buffers + * (if interlace, each field needs this size): + */ + uint32_t afbc_alloc_bytes; + + /* For situations where downscaled AFBC is supported, + * this number of bytes is needed for the downscaled frame. + */ + uint32_t afbc_alloc_bytes_downscaled; + + /* When the host allocates an AFBC frame buffer, it should normally set + * the the afbc_width_in_superblocks to be at least this recommended value. + * Buffers with smaller values are likely to be returned rejected by the MVE. + * See also comments above for afbc_alloc_bytes and + * afbc_alloc_bytes_downscaled, they describe the situations where the + * different values are used. + */ + uint16_t afbc_width_in_superblocks; + uint16_t afbc_width_in_superblocks_downscaled; + + /* For PLANAR YUV output, every plane's address need to be adjusted to get + * optimal AXI bursts when the pixel data is written, the values below may + * be used to calculate address offsets. + */ + uint16_t cropx; + uint16_t cropy; + + uint32_t mbinfo_alloc_bytes; /* Only for debugging */ + + + /* downscaled frame width/height for decode */ + /* ARBITRARY_DOWNSCALE */ + uint16_t dsl_frame_width; + uint16_t dsl_frame_height; + uint16_t dsl_pos_mode; + uint8_t ctu_size; /* EXPORT_SEQ_INFO */ + /* ENABLE_DST_CROP*/ + uint16_t dst_crop_x; + uint16_t dst_crop_y; + uint16_t dst_crop_width; + uint16_t dst_crop_height; +}; + +/* Decode only: This message is sent from MVE to the host so that it can + * allocate suitable output buffers. The needed size of the buffer is sent + * in a separate message (above). + * When MVE sends the message below, it enters a waiting-state and will not + * make any progress until the host sends an output-flush command, upon + * which MVE will return all output buffers, followed by a message saying + * that the output has been flushed. Only then should the host start + * enqueueing new output buffers. + */ +struct mve_response_sequence_parameters +{ + /* Other stream parameters affecting buffer allocation, + * any change in these values will trigger a flush. + */ + uint8_t interlace; /* 0 or 1 */ + uint8_t chroma_format; + #define MVE_CHROMA_FORMAT_MONO (0x0) + #define MVE_CHROMA_FORMAT_420 (0x1) + #define MVE_CHROMA_FORMAT_422 (0x2) + #define MVE_CHROMA_FORMAT_440 (0x3) + #define MVE_CHROMA_FORMAT_ARGB (0x4) + #define MVE_CHROMA_FORMAT_RGB (0x5) + #define MVE_CHROMA_FORMAT_444 (0x6) + #define MVE_CHROMA_FORMAT_OSD_ARGB (0x7) + + uint8_t bitdepth_luma; /* 8, 9 or 10 */ + uint8_t bitdepth_chroma; /* 8, 9 or 10 */ + uint8_t num_buffers_planar; /* number of planar buffers needed */ + uint8_t num_buffers_afbc; /* number of AFBC buffers needed, for + * AFBC output more buffers are needed + * (for planar output, the firmware + * will allocate extra memory via RPC) + */ + uint8_t range_mapping_enabled; /* VC-1 AP specific feature, if enabled + * then AFBC buffers may need special + * filtering before they can be + * displayed correctly. If the host is + * not able to do that, then planar output + * should be used, for which MVE + * automatically performs the filtering. + */ + uint8_t reserved0; +}; + +struct mve_response_ref_frame_unused +{ + /* Decode only: If requested by the host with the message + * MVE_REQUEST_CODE_RELEASE_REF_FRAME, the MVE will respond + * with this message when (if ever) the buffer is no longer + * used. + */ + uint32_t unused_buffer_address; +}; + + +/* This message is only for debugging and performance profiling. + * Is sent by the firmware if the corresponding options is enabled. + */ +struct mve_event_processed +{ + uint8_t pic_format; + uint8_t qp; + uint8_t pad0; + uint8_t pad1; + uint32_t parse_start_time; /* Timestamp, absolute time */ + uint32_t parse_end_time; /* Timestamp, absolute time */ + uint32_t parse_idle_time; /* Definition of idle here is waiting for in/out buffers or available RAM */ + + uint32_t pipe_start_time; /* Timestamp */ + uint32_t pipe_end_time; /* Timestamp, end-start = process time. Idle time while in a frame is + * not measured. */ + uint32_t pipe_idle_time; /* Always 0 in decode, */ + + uint32_t parser_coreid; /* Core used to parse this frame */ + uint32_t pipe_coreid; /* Core used to pipe this frame */ + + uint32_t bitstream_bits; /* Number of bitstream bits used for this frame. */ + + uint32_t intermediate_buffer_size; /* Size of intermediate (mbinfo/residuals) buffer after this frame was + * parsed. */ + uint32_t total_memory_allocated; /* after the frame was parsed. Including reference frames. */ + + uint32_t bus_read_bytes; /* bus read bytes */ + uint32_t bus_write_bytes; /* bus written bytes */ + + uint32_t afbc_bytes; /* afbc data transferred */ + + uint32_t slice0_end_time; /* Timestamp, absolute time */ + uint32_t stream_start_time; /* Timestamp, absolute stream start time */ + uint32_t stream_open_time; /* Timestamp, absolute stream open time */ +}; + +/* This message is sent by the firmware if the option + * MVE_SET_OPT_INDEX_ENC_EXPOSE_REF_FRAMES is enabled + */ +struct mve_event_ref_frame +{ + uint32_t ref_addr; /* MVE virtual address of AFBC reference frame */ + uint32_t ref_width; /* Width of display area in luma pixels */ + uint32_t ref_height; /* Height of display area in luma pixels */ + uint32_t ref_mb_width; /* Width in macroblocks */ + uint32_t ref_mb_height; /* Height in macroblocks */ + uint32_t ref_left_crop; /* Left crop in luma pixels */ + uint32_t ref_top_crop; /* Top crop in luma pixels */ + uint32_t ref_frame_size; /* Total AFBC frame size in bytes */ + uint32_t ref_display_order; /* Display picture order count */ + uint16_t bit_width; /* Bit width of the YUV either 8 or 10 */ + uint16_t tiled_headers; /* AFBC format is tiled */ + uint64_t user_data_tag; /* User data tag of corresponding input buffer */ +}; + +/* This message is only for debugging, is sent by the firmware if event tracing + * is enabled. + */ +struct mve_event_trace_buffers +{ + uint16_t reserved; + uint8_t num_cores; + uint8_t rasc_mask; + #define MVE_MAX_TRACE_BUFFERS 40 + /* this array will contain one buffer per rasc in rasc_mask per num_core */ + struct + { + uint32_t rasc_addr; /* rasc address of the buffer */ + uint32_t size; /* size of the buffer in bytes */ + } buffers[MVE_MAX_TRACE_BUFFERS]; +}; + +/* 'Events' are informative messages, the host is not required to react in + * any particular way. + */ +struct mve_response_event +{ + uint32_t event_code; + #define MVE_EVENT_ERROR_STREAM_CORRUPT (1) /* message, text string */ + #define MVE_EVENT_ERROR_STREAM_NOT_SUPPORTED (2) /* message, text string */ + #define MVE_EVENT_PROCESSED (3) /* struct mve_event_processed */ + #define MVE_EVENT_REF_FRAME (4) /* struct mve_event_ref_frame */ + #define MVE_EVENT_TRACE_BUFFERS (5) /* struct mve_event_trace_buffers */ + union + { + struct mve_event_processed event_processed; + struct mve_event_ref_frame event_ref_frame; + struct mve_event_trace_buffers event_trace_buffers; + char message[ MVE_MAX_ERROR_MESSAGE_SIZE ]; + } event_data; +}__attribute__((packed)); + + + + + + + + + + + + + + + + +/********************************************************************* + * + * BUFFERs are sent both ways, from host to firmware and back again + * + * Each MVE_BUFFER_CODE_ code is followed by one of the structs + * below. + * + *********************************************************************/ + +/* Flags in mve_buffer_frame::frame_flags: + * Set by whom? Meaning: + * DECODE: ENCODE: + * MVE_BUFFER_FRAME_FLAG_INTERLACE host - Buffer is interlaced (both top and + * bottom fields are allocated) + * MVE_BUFFER_FRAME_FLAG_BOT_FIRST fw - Bottom field should be displayed + * first (only if interlaced) + * MVE_BUFFER_FRAME_FLAG_TOP_PRESENT fw host Top field present (or full frame if + * not interlaced) + * MVE_BUFFER_FRAME_FLAG_BOT_PRESENT fw - Bottom present (only if interlaced) + * + * MVE_BUFFER_FRAME_FLAG_ROTATION_* host host Decode: MVE will rotate the output frame + * according to this setting. + * Encode: MVE will rotate the input frame + * according to this setting before + * encoding them. + * MVE_BUFFER_FRAME_FLAG_SCALING_MASK host - Output pictures should be downscaled + * + * MVE_BUFFER_FRAME_FLAG_MIRROR_* - host Input frame should be mirrored before encoding + * + * MVE_BUFFER_FRAME_FLAG_REJECTED fw - Buffer was too small, host should re-allocate + * + * MVE_BUFFER_FRAME_FLAG_CORRUPT fw - Frame contains visual corruption + * + * MVE_BUFFER_FRAME_FLAG_DECODE_ONLY fw - Frame should not be displayed + * + * MVE_BUFFER_FRAME_FLAG_REF_FRAME fw - Frame is used by MVE as reference, host must + * not change, just re-enqueue when displayed + * MVE_BUFFER_FRAME_FLAG_EOS fw host This is the last frame in the stream. + */ + +/* mve_buffer_frame_planar stores uncompressed YUV pictures. + * ________________________________________ + * | ^ | | ^ + * |<-:--visible_frame_width---->| | : + * | : | | : + * | : | | : + * | visible_frame_height | | max_frame_height + * | : | | : + * | : | | : + * |__v__________________________| | : + * | | : + * |<-------------max_frame_width---------->| : + * |________________________________________| v + * + */ +struct mve_buffer_frame_planar +{ + /* Y,Cb,Cr top field */ + uint32_t plane_top[ 3 ]; + + /* Y,Cb,Cr bottom field (interlace only) */ + uint32_t plane_bot[ 3 ]; + + /* Stride between rows, in bytes */ + int32_t stride[ 3 ]; + + /* Size of largest frame allowed to put in this buffer */ + uint16_t max_frame_width; + uint16_t max_frame_height; + +}; + +/* mve_buffer_frame_afbc stores AFBC compressed content that is also used + * as the reference frame. Out of loop processing (crop, rotation, + * range reduction) must be supported by the user of this buffer and + * the parameters are signaled within the buffer descriptor below. + * ________________________________________ + * | ^ | + * | cropy | + * | v_____________________________ | + * |<-cropx->| ^ || + * | |<-:--visible_frame_width---->|| + * | | : || + * | | : || + * | | visible_frame_height || + * | | : || + * | | : || + * | |__v__________________________|| + * |________________________________________| + * + * <----- superblock_width ---------------> + * * afbc_width_in_superblocks + * + * Note that the sizes and cropping values need not be multiples of 16. + * + * For interlaced streams, the values refer to a full frame, + * while the output is actually separated into fields. Thus for fields, + * cropy and visible_frame_height should be divided by two. + * + * For dual-downscaled AFBC output (not supported for interlace), + * then the cropx, cropy, visible_frame_width and visible_frame_height + * should be divided by two for the downscaled plane. + */ +struct mve_buffer_frame_afbc +{ + uint32_t plane[ 2 ]; /* Addresses for up to two AFBC planes: + * Top and bottom fields for interlace, + * or standard and optional downscaled output. */ + uint32_t alloc_bytes[ 2 ]; /* Size of allocation for each plane */ + uint16_t cropx; /* Luma x crop */ + uint16_t cropy; /* Luma y crop */ + uint16_t afbc_width_in_superblocks[ 2 ]; /* Width of AFBC frame buffer, in units + * of superblock width (32 or 16). + * If dual-downscaled output is chosen, + * this width can be different for the + * two planes. + * For first plane: + * (cropx + frame_width) + * <= superblock_width * afbc_width... + */ + uint32_t afbc_params; /* AFBC parameters */ + #define MVE_BUFFER_FRAME_AFBC_TILED_BODY (0x00000001) /* Output body blocks should be tiled */ + #define MVE_BUFFER_FRAME_AFBC_TILED_HEADER (0x00000002) /* Output headers should be tiled */ + #define MVE_BUFFER_FRAME_AFBC_32X8_SUPERBLOCK (0x00000004) /* Super block is 32x8, default is 16x16, + * (only supported as input for encode) */ + #define MVE_BUFFER_FRAME_AFBC_DN_FORCE_8BIT (0x00000008) /* For downscaled AFBC plane: It shall + * be 8-bit, even if full-scale is 10-bit */ + #define MVE_BUFFER_FRAME_AFBC_DN_FORCE_420 (0x00000010) /* For downscaled AFBC plane: It shall + * be 4:2:0, even if full-scale is 4:2:2 */ + #define MVE_BUFFER_FRAME_AFBC_STRIDE_SET_BY_MVE (0x00000020) /* Decode only: By default, the host should + set the afbc_width_in_superblocks. If the + value is zero, or if this bit is set, then + the MVE sets an appropriate value. */ + +}; + +/* output from encoder, encoder statistics. + * buffer parameter to a buffer of this encoder statistics + * this struct indicates each size of statistics. + */ + +struct mve_buffer_param_enc_stats +{ + uint32_t mms_buffer_size; + uint32_t bitcost_buffer_size; + uint32_t qp_buffer_size; + uint32_t flags; + //ENC_STATS_FLAGS + #define MVE_BUFFER_ENC_STATS_FLAG_MMS (1<<0) + #define MVE_BUFFER_ENC_STATS_FLAG_BITCOST (1<<1) + #define MVE_BUFFER_ENC_STATS_FLAG_QP (1<<2) + #define MVE_BUFFER_ENC_STATS_FLAG_DROP (1<<3) + uint16_t stats_mb_width; + uint16_t stats_mb_height; +}; + +/* + * The FRAME buffer stores the common information for PLANAR and AFBC buffers, + * and a union of PLANAR and AFBC specific information. + */ +struct mve_buffer_frame +{ + /* For identification of the buffer, this is not changed by + * the firmware. */ + uint64_t host_handle; + + /* For matching input buffer with output buffers, the firmware + * copies these values between frame buffers and bitstream buffers. */ + uint64_t user_data_tag; + + /* Frame buffer flags, see commentary above */ + uint32_t frame_flags; + #define MVE_BUFFER_FRAME_FLAG_INTERLACE (0x00000001) + #define MVE_BUFFER_FRAME_FLAG_BOT_FIRST (0x00000002) + #define MVE_BUFFER_FRAME_FLAG_TOP_PRESENT (0x00000004) + #define MVE_BUFFER_FRAME_FLAG_BOT_PRESENT (0x00000008) + #define MVE_BUFFER_FRAME_FLAG_ROTATION_90 (0x00000010) + #define MVE_BUFFER_FRAME_FLAG_ROTATION_180 (0x00000020) + #define MVE_BUFFER_FRAME_FLAG_ROTATION_270 (0x00000030) + #define MVE_BUFFER_FRAME_FLAG_SCALING_MASK (0x000000C0) + #define MVE_BUFFER_FRAME_FLAG_MIRROR_HORI (0x00000100) + #define MVE_BUFFER_FRAME_FLAG_MIRROR_VERT (0x00000200) + #define MVE_BUFFER_FRAME_FLAG_FORCE_IDR (0x00000400) + #define MVE_BUFFER_FRAME_FLAG_RESET_GOP (0x00000800) + #define MVE_BUFFER_FRAME_FLAG_REJECTED (0x00001000) + #define MVE_BUFFER_FRAME_FLAG_CORRUPT (0x00002000) + #define MVE_BUFFER_FRAME_FLAG_DECODE_ONLY (0x00004000) + #define MVE_BUFFER_FRAME_FLAG_REF_FRAME (0x00008000) + #define MVE_BUFFER_FRAME_FLAG_EOS (0x00010000) + #define MVE_BUFFER_FRAME_FLAG_RESET_LTR_PEROID (0x00020000) + /*ARBITRARY_DOWNSCALE*/ + #define MVE_BUFFER_FRAME_FLAG_SCALING_MASKX (0xFF000000) //8bit + #define MVE_BUFFER_FRAME_FLAG_SCALING_MASKY (0x00FE0000) //7bit + + /* Height (in luma samples) of visible part of frame, + * may be smaller than allocated frame size. */ + uint16_t visible_frame_height; + + /* Width (in luma samples) of visible part of frame, + * may be smaller than allocated frame size. */ + uint16_t visible_frame_width; + + /* Color format of buffer */ + uint16_t format; + /* format bitfield: */ + #define MVE_FORMAT_BF_C (0) /* 3 bits, chroma subsampling */ + #define MVE_FORMAT_BF_B (4) /* 4 bits, max bitdepth minus 8 */ + #define MVE_FORMAT_BF_N (8) /* 2 bits, number of planes */ + #define MVE_FORMAT_BF_V (12) /* 2 bits, format variant */ + #define MVE_FORMAT_BF_A (15) /* 1 bit, AFBC bit */ + /* formats: */ + #define MVE_FORMAT_YUV420_AFBC_8 ( (MVE_CHROMA_FORMAT_420 << MVE_FORMAT_BF_C) | \ + ( ( 8 - 8) << MVE_FORMAT_BF_B) | \ + ( 1 << MVE_FORMAT_BF_A) ) + + #define MVE_FORMAT_YUV420_AFBC_10 ( (MVE_CHROMA_FORMAT_420 << MVE_FORMAT_BF_C) | \ + ( (10 - 8) << MVE_FORMAT_BF_B) | \ + ( 1 << MVE_FORMAT_BF_A) ) + + #define MVE_FORMAT_YUV422_AFBC_8 ( (MVE_CHROMA_FORMAT_422 << MVE_FORMAT_BF_C) | \ + ( ( 8 - 8) << MVE_FORMAT_BF_B) | \ + ( 1 << MVE_FORMAT_BF_A) ) + + #define MVE_FORMAT_YUV422_AFBC_10 ( (MVE_CHROMA_FORMAT_422 << MVE_FORMAT_BF_C) | \ + ( (10 - 8) << MVE_FORMAT_BF_B) | \ + ( 1 << MVE_FORMAT_BF_A) ) + + #define MVE_FORMAT_YUV420_I420 ( (MVE_CHROMA_FORMAT_420 << MVE_FORMAT_BF_C) | \ + ( ( 8 - 8) << MVE_FORMAT_BF_B) | \ + ( 3 << MVE_FORMAT_BF_N) | \ + ( 0 << MVE_FORMAT_BF_V) ) + + #define MVE_FORMAT_YUV420_I420_10 ( (MVE_CHROMA_FORMAT_420 << MVE_FORMAT_BF_C) | \ + ( ( 10 - 8) << MVE_FORMAT_BF_B) | \ + ( 3 << MVE_FORMAT_BF_N) | \ + ( 0 << MVE_FORMAT_BF_V) ) + + #define MVE_FORMAT_YUV420_NV12 ( (MVE_CHROMA_FORMAT_420 << MVE_FORMAT_BF_C) | \ + ( ( 8 - 8) << MVE_FORMAT_BF_B) | \ + ( 2 << MVE_FORMAT_BF_N) | \ + ( 0 << MVE_FORMAT_BF_V) ) + + #define MVE_FORMAT_YUV420_NV21 ( (MVE_CHROMA_FORMAT_420 << MVE_FORMAT_BF_C) | \ + ( ( 8 - 8) << MVE_FORMAT_BF_B) | \ + ( 2 << MVE_FORMAT_BF_N) | \ + ( 1 << MVE_FORMAT_BF_V) ) + + #define MVE_FORMAT_YUV420_P010 ( (MVE_CHROMA_FORMAT_420 << MVE_FORMAT_BF_C) | \ + ( (16 - 8) << MVE_FORMAT_BF_B) | \ + ( 2 << MVE_FORMAT_BF_N) | \ + ( 0 << MVE_FORMAT_BF_V) ) + + #define MVE_FORMAT_YUV420_2P_10 ( (MVE_CHROMA_FORMAT_420 << MVE_FORMAT_BF_C) | \ + ( (10 - 8) << MVE_FORMAT_BF_B) | \ + ( 2 << MVE_FORMAT_BF_N) | \ + ( 0 << MVE_FORMAT_BF_V) ) + + #define MVE_FORMAT_YUV420_Y0L2 ( (MVE_CHROMA_FORMAT_420 << MVE_FORMAT_BF_C) | \ + ( (10 - 8) << MVE_FORMAT_BF_B) | \ + ( 1 << MVE_FORMAT_BF_N) | \ + ( 0 << MVE_FORMAT_BF_V) ) + + #define MVE_FORMAT_YUV420_AQB1 ( (MVE_CHROMA_FORMAT_420 << MVE_FORMAT_BF_C) | \ + ( (10 - 8) << MVE_FORMAT_BF_B) | \ + ( 1 << MVE_FORMAT_BF_N) | \ + ( 1 << MVE_FORMAT_BF_V) ) + + #define MVE_FORMAT_YUV422_YUY2 ( (MVE_CHROMA_FORMAT_422 << MVE_FORMAT_BF_C) | \ + ( ( 8 - 8) << MVE_FORMAT_BF_B) | \ + ( 1 << MVE_FORMAT_BF_N) | \ + ( 0 << MVE_FORMAT_BF_V) ) + + #define MVE_FORMAT_YUV422_UYVY ( (MVE_CHROMA_FORMAT_422 << MVE_FORMAT_BF_C) | \ + ( ( 8 - 8) << MVE_FORMAT_BF_B) | \ + ( 1 << MVE_FORMAT_BF_N) | \ + ( 1 << MVE_FORMAT_BF_V) ) + + #define MVE_FORMAT_YUV422_Y210 ( (MVE_CHROMA_FORMAT_422 << MVE_FORMAT_BF_C) | \ + ( (16 - 8) << MVE_FORMAT_BF_B) | \ + ( 1 << MVE_FORMAT_BF_N) | \ + ( 0 << MVE_FORMAT_BF_V) ) + + #define MVE_FORMAT_YUV422_1P_10 ( (MVE_CHROMA_FORMAT_422 << MVE_FORMAT_BF_C) | \ + ( (10 - 8) << MVE_FORMAT_BF_B) | \ + ( 1 << MVE_FORMAT_BF_N) | \ + ( 0 << MVE_FORMAT_BF_V) ) + + #define MVE_FORMAT_RGBA_8888 ( (MVE_CHROMA_FORMAT_ARGB << MVE_FORMAT_BF_C) | \ + ( ( 8 - 8) << MVE_FORMAT_BF_B) | \ + ( 1 << MVE_FORMAT_BF_N) | \ + ( 0 << MVE_FORMAT_BF_V) ) + + #define MVE_FORMAT_BGRA_8888 ( (MVE_CHROMA_FORMAT_ARGB << MVE_FORMAT_BF_C) | \ + ( ( 8 - 8) << MVE_FORMAT_BF_B) | \ + ( 1 << MVE_FORMAT_BF_N) | \ + ( 1 << MVE_FORMAT_BF_V) ) + + #define MVE_FORMAT_ARGB_8888 ( (MVE_CHROMA_FORMAT_ARGB << MVE_FORMAT_BF_C) | \ + ( ( 8 - 8) << MVE_FORMAT_BF_B) | \ + ( 1 << MVE_FORMAT_BF_N) | \ + ( 2 << MVE_FORMAT_BF_V) ) + + #define MVE_FORMAT_ABGR_8888 ( (MVE_CHROMA_FORMAT_ARGB << MVE_FORMAT_BF_C) | \ + ( ( 8 - 8) << MVE_FORMAT_BF_B) | \ + ( 1 << MVE_FORMAT_BF_N) | \ + ( 3 << MVE_FORMAT_BF_V) ) + #define MVE_FORMAT_Y ( (MVE_CHROMA_FORMAT_MONO << MVE_FORMAT_BF_C) | \ + ( ( 8 - 8) << MVE_FORMAT_BF_B) | \ + ( 1 << MVE_FORMAT_BF_N) | \ + ( 0 << MVE_FORMAT_BF_V) ) + #define MVE_FORMAT_Y_10 ( (MVE_CHROMA_FORMAT_MONO << MVE_FORMAT_BF_C) | \ + ( ( 10 - 8) << MVE_FORMAT_BF_B) | \ + ( 1 << MVE_FORMAT_BF_N) | \ + ( 0 << MVE_FORMAT_BF_V) ) + + #define MVE_FORMAT_RGB_888 ( (MVE_CHROMA_FORMAT_RGB << MVE_FORMAT_BF_C) | \ + ( ( 8 - 8) << MVE_FORMAT_BF_B) | \ + ( 1 << MVE_FORMAT_BF_N) | \ + ( 0 << MVE_FORMAT_BF_V) ) + + #define MVE_FORMAT_BGR_888 ( (MVE_CHROMA_FORMAT_RGB << MVE_FORMAT_BF_C) | \ + ( ( 8 - 8) << MVE_FORMAT_BF_B) | \ + ( 1 << MVE_FORMAT_BF_N) | \ + ( 1 << MVE_FORMAT_BF_V) ) + + #define MVE_FORMAT_RGB_3P ( (MVE_CHROMA_FORMAT_RGB << MVE_FORMAT_BF_C) | \ + ( ( 8 - 8) << MVE_FORMAT_BF_B) | \ + ( 3 << MVE_FORMAT_BF_N) | \ + ( 0 << MVE_FORMAT_BF_V) ) + #define MVE_FORMAT_YUV444 ( (MVE_CHROMA_FORMAT_444 << MVE_FORMAT_BF_C) | \ + ( ( 8 - 8) << MVE_FORMAT_BF_B) | \ + ( 3 << MVE_FORMAT_BF_N) | \ + ( 0 << MVE_FORMAT_BF_V) ) + #define MVE_FORMAT_YUV444_10 ( (MVE_CHROMA_FORMAT_444 << MVE_FORMAT_BF_C) | \ + ( ( 10 - 8) << MVE_FORMAT_BF_B) | \ + ( 3 << MVE_FORMAT_BF_N) | \ + ( 0 << MVE_FORMAT_BF_V) ) + #define MVE_FORMAT_ARGB_1555 ( (MVE_CHROMA_FORMAT_OSD_ARGB << MVE_FORMAT_BF_C) | \ + ( ( 8 - 8) << MVE_FORMAT_BF_B) | \ + ( 1 << MVE_FORMAT_BF_N) | \ + ( 0 << MVE_FORMAT_BF_V) ) + #define MVE_FORMAT_ARGB_4444 ( (MVE_CHROMA_FORMAT_OSD_ARGB << MVE_FORMAT_BF_C) | \ + ( ( 8 - 8) << MVE_FORMAT_BF_B) | \ + ( 1 << MVE_FORMAT_BF_N) | \ + ( 1 << MVE_FORMAT_BF_V) ) + #define MVE_FORMAT_RGB_565 ( (MVE_CHROMA_FORMAT_OSD_ARGB << MVE_FORMAT_BF_C) | \ + ( ( 8 - 8) << MVE_FORMAT_BF_B) | \ + ( 1 << MVE_FORMAT_BF_N) | \ + ( 2 << MVE_FORMAT_BF_V) ) + + #define MVE_FORMAT_MBINFO (0x0001) /* only used for debugging */ + + #define MVE_FORMAT_UNUSED (0x0000) + + //uint16_t reserved0; /* force 'data' to be 4-byte aligned */ + uint8_t frame_type; /* ADD_FRAME_TYPE_TO_PIC_JOB */ + uint8_t frame_flags_ext;/* add osd buffer tag to seperate osd & source */ + #define OSD1_TAG 0x80 /* use bit7 stand for osd_1 */ + #define OSD0_TAG 0x40 /* use bit6 stand for osd_1 */ + + union + { + struct mve_buffer_frame_planar planar; + struct mve_buffer_frame_afbc afbc; + } data; + + //uint32_t reserved1; /* force size to be multiple of 8 bytes */ + uint16_t mini_frame_y_start; + uint16_t mini_frame_y_end; +}; + +/* The bitstream buffer stores a number of bitstream bytes */ +struct mve_buffer_bitstream +{ + /* For identification of the buffer, this is not changed by + * the firmware. */ + uint64_t host_handle; + + /* For matching input buffer with output buffers, the firmware + * copies these values between frame buffers and bitstream buffers. */ + uint64_t user_data_tag; + + /* BufferFlags */ + uint32_t bitstream_flags; + #define MVE_BUFFER_BITSTREAM_FLAG_EOS (0x00000001) + #define MVE_BUFFER_BITSTREAM_FLAG_ENDOFFRAME (0x00000010) + #define MVE_BUFFER_BITSTREAM_FLAG_SYNCFRAME (0x00000020) + #define MVE_BUFFER_BITSTREAM_FLAG_CODECCONFIG (0x00000080) + #define MVE_BUFFER_BITSTREAM_FLAG_ENDOFSUBFRAME (0x00000400) + #define MVE_BUFFER_BITSTREAM_FLAG_ENC_STATS (0x00010000) + #define MVE_BUFFER_BITSTREAM_FLAG_BSEOF (0x00100000) + + /* Length of allocated buffer */ + uint32_t bitstream_alloc_bytes; + + /* Byte offset from start to first byte */ + uint32_t bitstream_offset; + + /* Number of bytes in the buffer */ + uint32_t bitstream_filled_len; + + /* Pointer to buffer start */ + uint32_t bitstream_buf_addr; + + /* frame_type. 0:I, 1:P, 2:B, 3:b */ + uint8_t frame_type; + #define MVE_FRAME_TYPE_I 0 + #define MVE_FRAME_TYPE_P 1 + #define MVE_FRAME_TYPE_B 2 // B frame + #define MVE_FRAME_TYPE_LOWER_B 3 // b frame + #define MVE_FRAME_TYPE_P_KEY 4 + #define MVE_FRAME_TYPE_NO_REF_P 5 // only svct3 + #define MVE_FRAME_TYPE_GDR 6 // GDR + + uint8_t src_transform; + #define MVE_SRC_TRANSFORM_NONE (0) // none src transform + #define MVE_SRC_TRANSFORM_R90 (1) // rotate 90 degrees + #define MVE_SRC_TRANSFORM_R180 (2) // rotate 180 degrees + #define MVE_SRC_TRANSFORM_R270 (3) // rotate 270 degrees + #define MVE_SRC_TRANSFORM_VFLIP (4) // vertical flip (no rotation) + #define MVE_SRC_TRANSFORM_R90_VFLIP (5) // rotate 90 degrees and vertical flip + #define MVE_SRC_TRANSFORM_R180_VFLIP (6) // rotate 180 degrees and vertical flip + #define MVE_SRC_TRANSFORM_R270_VFLIP (7) // rotate 270 degrees and vertical flip + + /* Pad to force 8-byte alignment */ + //uint32_t reserved; + uint16_t bitstream_remaining_kb; // remaining kbytes of bitstream not returned to host. +}; + +/* + * Define a region in 16x16 units + * + * The region is macroblock positions (x,y) in the range + * mbx_left <= x < mbx_right + * mby_top <= y < mby_bottom + */ +struct mve_buffer_param_region +{ + uint16_t mbx_left; /* macroblock x left edge (inclusive) */ + uint16_t mbx_right; /* macroblock x right edge (exclusive) */ + uint16_t mby_top; /* macroblock y top edge (inclusive) */ + uint16_t mby_bottom; /* macroblock y bottom edge (exclusive) */ + int16_t qp_delta; /* QP delta value for this region, this + * delta applies to QP values in the ranges: + * H264: 0-51 + * HEVC: 0-51 + * VP9: 0-255 */ + uint8_t prio; /* the priority of this region */ + uint8_t force_intra; /* force intra to this ROI region, refer to macro: FEATURE_SUPPORT_ROI_MISC */ +}; + +/* input for encoder, + * the mve_buffer_param_regions buffer stores the information for FRAME buffers, + * and the information for regions of interest. + */ +struct mve_buffer_param_regions +{ + uint8_t n_regions; /* Number of regions */ + uint8_t reserved[ 3 ]; + #define MVE_MAX_FRAME_REGIONS 16 + struct mve_buffer_param_region region[ MVE_MAX_FRAME_REGIONS ]; +}; + +/* the block parameter record specifies the various properties of a quad */ +struct mve_block_param_record +{ + uint32_t qp_delta; + /* Bitset of four 4-bit QP delta values for a quad. + * For H.264 and HEVC these are qp delta values in the range -8 to +7. + * For Vp9 these are segment map values in the range 0 to 7. + */ + #define MVE_BLOCK_PARAM_RECORD_QP_DELTA_TOP_LEFT_16X16 (0) + #define MVE_BLOCK_PARAM_RECORD_QP_DELTA_TOP_LEFT_16X16_SZ (6) + #define MVE_BLOCK_PARAM_RECORD_QP_DELTA_TOP_RIGHT_16X16 (6) + #define MVE_BLOCK_PARAM_RECORD_QP_DELTA_TOP_RIGHT_16X16_SZ (6) + #define MVE_BLOCK_PARAM_RECORD_QP_DELTA_BOT_LEFT_16X16 (12) + #define MVE_BLOCK_PARAM_RECORD_QP_DELTA_BOT_LEFT_16X16_SZ (6) + #define MVE_BLOCK_PARAM_RECORD_QP_DELTA_BOT_RIGHT_16X16 (18) + #define MVE_BLOCK_PARAM_RECORD_QP_DELTA_BOT_RIGHT_16X16_SZ (6) + #define MVE_BLOCK_PARAM_RECORD_QP_FORCE_FIELD (24) + #define MVE_BLOCK_PARAM_RECORD_QP_FORCE_FIELD_SZ (5) + #define MVE_BLOCK_PARAM_RECORD_QUAD_FORCE_INTRA (29) + #define MVE_BLOCK_PARAM_RECORD_QUAD_FORCE_INTRA_SZ (1) + #define MVE_BLOCK_PARAM_RECORD_QP_ABSOLUTE (30) + #define MVE_BLOCK_PARAM_RECORD_QP_ABSOLUTE_SZ (1) + #define MVE_BLOCK_PARAM_RECORD_QP_QUAD_SKIP (31) + #define MVE_BLOCK_PARAM_RECORD_QP_QUAD_SKIP_SZ (1) + + #define MVE_BLOCK_PARAM_RECORD_FORCE_NONE (0x00) + #define MVE_BLOCK_PARAM_RECORD_FORCE_QP (0x01) + uint32_t min_qp; + #define MVE_BLOCK_PARAM_RECORD_MIN_QP_TOP_LEFT_16X16 (0) + #define MVE_BLOCK_PARAM_RECORD_MIN_QP_TOP_LEFT_16X16_SZ (6) + #define MVE_BLOCK_PARAM_RECORD_MIN_QP_TOP_RIGHT_16X16 (6) + #define MVE_BLOCK_PARAM_RECORD_MIN_QP_TOP_RIGHT_16X16_SZ (6) + #define MVE_BLOCK_PARAM_RECORD_MIN_QP_BOT_LEFT_16X16 (12) + #define MVE_BLOCK_PARAM_RECORD_MIN_QP_BOT_LEFT_16X16_SZ (6) + #define MVE_BLOCK_PARAM_RECORD_MIN_QP_BOT_RIGHT_16X16 (18) + #define MVE_BLOCK_PARAM_RECORD_MIN_QP_BOT_RIGHT_16X16_SZ (6) + #define MVE_BLOCK_PARAM_RECORD_QUAD_SELECT_QP_DELTA (24) + #define MVE_BLOCK_PARAM_RECORD_QUAD_SELECT_QP_DELTA_SZ (1) +}; + +/* block configuration uncompressed rows header. this configures the size of the + * uncompressed body. */ +struct mve_buffer_general_rows_uncomp_hdr +{ + uint8_t n_cols_minus1; /* number of quad cols in picture minus 1 */ + uint8_t n_rows_minus1; /* number of quad rows in picture minus 1 */ + uint8_t reserved[2]; +}; + +/* block configuration uncompressed rows body. this structure contains an array + * of block parameter records whose length is (n_cols_minus1 + 1) * (n_rows_minus1 + 1) + * elements. therefore the allocation of this structure needs to be dynamic and + * a pointer to the allocated memory should then be assigned to the general + * purpose buffer data pointer + */ +struct mve_buffer_general_rows_uncomp_body +{ + /* the size of this array is variable and not necessarily equal to 1. + * therefore the sizeof operator should not be used + */ + struct mve_block_param_record bpr[1]; +}; + +/* input for encoder, block level configurations. + * the row based block configurations can be defined in different formats. they + * are stored in the blk_cfgs union and identified by the blk_cfg_type member. + * these definitions consist of a header and body pair. the header part contains + * configuration information for the body. the body part describes the actual + * layout of the data buffer pointed to by the mve_buffer_general_hdr buffer_ptr. + */ +struct mve_buffer_general_block_configs +{ + uint8_t blk_cfg_type; + #define MVE_BLOCK_CONFIGS_TYPE_NONE (0x00) + #define MVE_BLOCK_CONFIGS_TYPE_ROW_UNCOMP (0xff) + uint8_t reserved[3]; + union + { + struct mve_buffer_general_rows_uncomp_hdr rows_uncomp; + } blk_cfgs; +}; + +/* for the mve_buffer_general_encoder_stats buffer type the body data + * is an array of records of the following format, one record for each + * 32x32 pixel block of the picture. Values that are marked "per CTU" + * are only valid in the first 32x32 block of the 64x64 CTU for HEVC or VP9. + * For H.264 the "per CTU" values are the sum of four 16x16 macroblocks. + * Each record is 12 bytes and must be 32-bit aligned. + */ +struct mve_block_stats_record_full +{ + uint8_t intra_count; // number of 8x8 blocks in the CTU that are intra + uint8_t reserved0; // not used + uint16_t bit_estimate; // bit estimate for the CTU + uint16_t luma_mean; // luminance mean + uint16_t luma_cplx; // luma complexity measure (0=flat) + int16_t rmv_x; // rough x motion vector in pixels + int16_t rmv_y; // rough y motion vector in pixels +}; + +/* input for encoder, block level statistics + * this buffer is added to the encoder input frame queue, before the + * input frame for which statistics are to be gathered. The buffer is + * filled duing frame analysis and returned in the input buffer return + * queue before the input buffer is returned. + */ +struct mve_buffer_general_encoder_stats +{ + uint8_t encoder_stats_type; + #define MVE_ENCODER_STATS_TYPE_FULL (0x01) + uint8_t frame_type; // See MVE_FRAME_TYPE_* + #define MVE_FRAME_TYPE_I 0 + #define MVE_FRAME_TYPE_P 1 + #define MVE_FRAME_TYPE_B 2 + uint8_t used_as_reference; // 0=No, 1=Yes + uint8_t qp; // base quantizer used for the frame + // HEVC, H.264: 0-51. VP9: 0-63 + uint32_t picture_count; // display order picture count + uint16_t num_cols; // number of columns (each 32 pixels wide) + uint16_t num_rows; // number of rows (each 32 pixels high) + uint32_t ref_pic_count[2]; // display order picture count of references + // unused values are set to zero +}; + +/* input for encoder */ +struct mve_buffer_param_qp +{ + /* QP (quantization parameter) for encode. + * + * When used to set fixed QP for encode, with rate control + * disabled, then the valid ranges are: + * H264: 0-51 + * HEVC: 0-51 + * VP8: 0-63 + * VP9: 0-63 + * Note: The QP must be set separately for I, P and B frames. + * + * But when this message is used with the regions-feature, + * then the valid ranges are the internal bitstream ranges: + * H264: 0-51 + * HEVC: 0-51 + * VP8: 0-127 + * VP9: 0-255 + */ + int32_t qp; + int32_t epr_iframe_enable; +}; + +struct mve_reset_gop_dynamic +{ + uint32_t reset_gop_pframes; +}; + +struct mve_reset_ltr_peroid_dynamic +{ + uint32_t reset_ltr_peroid_pframes; +}; + +/* output from decoder */ +struct mve_buffer_param_display_size +{ + uint16_t display_width; + uint16_t display_height; +}; + +/* output from decoder, colour information needed for hdr */ +struct mve_buffer_param_colour_description +{ + uint32_t flags; + #define MVE_BUFFER_PARAM_COLOUR_FLAG_MASTERING_DISPLAY_DATA_VALID (1) + #define MVE_BUFFER_PARAM_COLOUR_FLAG_CONTENT_LIGHT_DATA_VALID (2) + + uint8_t range; /* Unspecified=0, Limited=1, Full=2 */ + #define MVE_BUFFER_PARAM_COLOUR_RANGE_UNSPECIFIED (0) + #define MVE_BUFFER_PARAM_COLOUR_RANGE_LIMITED (1) + #define MVE_BUFFER_PARAM_COLOUR_RANGE_FULL (2) + + uint8_t colour_primaries; /* see hevc spec. E.3.1 */ + uint8_t transfer_characteristics; /* see hevc spec. E.3.1 */ + uint8_t matrix_coeff; /* see hevc spec. E.3.1 */ + + uint16_t mastering_display_primaries_x[3]; /* see hevc spec. D.3.27 */ + uint16_t mastering_display_primaries_y[3]; /* see hevc spec. D.3.27 */ + uint16_t mastering_white_point_x; /* see hevc spec. D.3.27 */ + uint16_t mastering_white_point_y; /* see hevc spec. D.3.27 */ + uint32_t max_display_mastering_luminance; /* see hevc spec. D.3.27 */ + uint32_t min_display_mastering_luminance; /* see hevc spec. D.3.27 */ + + uint32_t max_content_light_level; /* see hevc spec. D.3.35 */ + uint32_t avg_content_light_level; /* see hevc spec. D.3.35 */ + + uint8_t video_format_present_flag; + uint8_t video_format; + uint8_t aspect_ratio_info_present_flag; + uint8_t aspect_ratio_idc; + uint8_t timing_flag_info_present_flag; + uint16_t sar_width; + uint16_t sar_height; + uint32_t num_units_in_tick; + uint32_t time_scale; + + uint8_t pad[7]; // pad for 8-byte alignment +}; + +struct mve_buffer_param_sei_user_data_unregistered +{ + uint8_t flags; + #define MVE_BUFFER_PARAM_USER_DATA_UNREGISTERED_VALID (1) + uint8_t uuid[16]; + char user_data[256 - 35]; + uint8_t user_data_len; + + uint8_t reserved[5]; +}; + +/* output from decoder see hevc spec. D.3.3 */ +struct mve_buffer_param_frame_field_info +{ + uint8_t pic_struct; + uint8_t source_scan_type; + uint8_t duplicate_flag; + uint8_t reserved; +}; + +/* output from decoder, VC-1 specific feature only relevant + * if using AFBC output + */ +struct mve_buffer_param_range_map +{ + uint8_t luma_map_enabled; + uint8_t luma_map_value; + uint8_t chroma_map_enabled; + uint8_t chroma_map_value; +}; + +/* input for encoder */ +struct mve_buffer_param_rate_control +{ + uint32_t rate_control_mode; + #define MVE_OPT_RATE_CONTROL_MODE_OFF (0) + #define MVE_OPT_RATE_CONTROL_MODE_STANDARD (1) + #define MVE_OPT_RATE_CONTROL_MODE_VARIABLE (2) + #define MVE_OPT_RATE_CONTROL_MODE_CONSTANT (3) + #define MVE_OPT_RATE_CONTROL_MODE_C_VARIABLE (4) + uint32_t target_bitrate; /* in bits per second */ + uint32_t maximum_bitrate; /* in bits per second */ +}; + +/* input for encoder */ +struct mve_buffer_param_rate_control_qp_range +{ + int32_t qp_min; + int32_t qp_max; +}; + +/* input for encoder, see hevc spec. D.3.16 */ +struct mve_buffer_param_frame_packing +{ + uint32_t flags; + #define MVE_BUFFER_PARAM_FRAME_PACKING_FLAG_QUINCUNX_SAMPLING (1) + #define MVE_BUFFER_PARAM_FRAME_PACKING_FLAG_SPATIAL_FLIPPING (2) + #define MVE_BUFFER_PARAM_FRAME_PACKING_FLAG_FRAME0_FLIPPED (4) + #define MVE_BUFFER_PARAM_FRAME_PACKING_FLAG_FIELD_VIEWS (8) + #define MVE_BUFFER_PARAM_FRAME_PACKING_FLAG_CURRENT_FRAME_IS_FRAME0 (16) + + uint8_t frame_packing_arrangement_type; + uint8_t content_interpretation_type; + + uint8_t frame0_grid_position_x; + uint8_t frame0_grid_position_y; + uint8_t frame1_grid_position_x; + uint8_t frame1_grid_position_y; + + uint8_t reserved[ 2 ]; +}; + +struct mve_buffer_param_rectangle +{ + uint16_t x_left; /* pixel x left edge (inclusive) */ + uint16_t x_right; /* pixel x right edge (exclusive) */ + uint16_t y_top; /* pixel y top edge (inclusive) */ + uint16_t y_bottom; /* pixel y bottom edge (exclusive) */ +}; + +/* input for encoder, + * indicate which parts of the source picture has changed. + * The encoder can (optionally) use this information to + * reduce memory bandwidth. + * + * n_rectangles=0 indicates the source picture is unchanged. + * + * This parameter only applies to the picture that immediately + * follows (and not to subsequent ones). + */ +struct mve_buffer_param_change_rectangles +{ + uint8_t n_rectangles; /* Number of rectangles */ + uint8_t reserved[3]; + #define MVE_MAX_FRAME_CHANGE_RECTANGLES 2 + struct mve_buffer_param_rectangle rectangles[MVE_MAX_FRAME_CHANGE_RECTANGLES]; +}; + +/* input for VP9 encoder, + * specify the qp deltas for each segment map index. + * These are intended to be used with block configs only. + */ +struct mve_buffer_param_vp9_segmap +{ + #define VP9SPEC_MAX_SEGMENTS 8 + int8_t qp_delta[VP9SPEC_MAX_SEGMENTS]; /* Qp delta to use for each segment map region */ + int8_t num_segments; /* Number of active segments (to set coding probability) */ +}; + +typedef struct mve_buffer_param_osd_cfg { + uint8_t osd_inside_enable; + uint8_t osd_inside_alpha_enable; + uint8_t osd_inside_convert_color_enable; + uint8_t osd_inside_alpha_value; /* as alpha range [0~16], use u8 */ + uint8_t osd_inside_convert_color_threshold;/* threshold range [0~255], if input is 10bit, th * 4 */ + uint8_t osd_inside_rgb2yuv_mode;/* 0-601L, 1-601F, 2-709_L, 3-709_F */ + uint16_t osd_inside_start_x; /* pixel x left edge (inclusive) */ + uint16_t osd_inside_start_y; /* pixel y top edge (inclusive) */ + uint16_t reserved[3]; +} t_mve_buffer_param_osd_cfg; + +struct mve_buffer_param_osd_rectangles { + #define MVE_MAX_FRAME_OSD_REGION 2 + t_mve_buffer_param_osd_cfg osd_single_cfg[MVE_MAX_FRAME_OSD_REGION]; +}; + +/* Parameters that are sent in the same communication channels + * as the buffers. A parameter applies to all subsequent buffers. + * Some types are only valid for decode, and some only for encode. + */ +struct mve_buffer_param +{ + uint32_t type; /* Extra data: */ + #define MVE_BUFFER_PARAM_TYPE_QP (2) /* qp */ + #define MVE_BUFFER_PARAM_TYPE_REGIONS (3) /* regions */ + #define MVE_BUFFER_PARAM_TYPE_DISPLAY_SIZE (5) /* display_size */ + #define MVE_BUFFER_PARAM_TYPE_RANGE_MAP (6) /* range_map */ + #define MVE_BUFFER_PARAM_TYPE_FRAME_RATE (9) /* arg, in frames per second, as a + * fixed point Q16 value, for example + * 0x001e0000 == 30.0 fps */ + #define MVE_BUFFER_PARAM_TYPE_RATE_CONTROL (10) /* rate_control */ + #define MVE_BUFFER_PARAM_TYPE_QP_I (12) /* qp for I frames, when no rate control */ + #define MVE_BUFFER_PARAM_TYPE_QP_P (13) /* qp for P frames, when no rate control */ + #define MVE_BUFFER_PARAM_TYPE_QP_B (14) /* qp for B frames, when no rate control */ + #define MVE_BUFFER_PARAM_TYPE_COLOUR_DESCRIPTION (15) /* colour_description */ + #define MVE_BUFFER_PARAM_TYPE_FRAME_PACKING (16) /* frame_packing */ + #define MVE_BUFFER_PARAM_TYPE_FRAME_FIELD_INFO (17) /* frame_field_info */ + #define MVE_BUFFER_PARAM_TYPE_GOP_RESET (18) /* no extra data */ + #define MVE_BUFFER_PARAM_TYPE_DPB_HELD_FRAMES (19) /* arg, number of output buffers that are + * complete and held by firmware in the + * DPB for reordering purposes. + * Valid after the next frame is output */ + #define MVE_BUFFER_PARAM_TYPE_CHANGE_RECTANGLES (20) /* change rectangles */ + #define MVE_BUFFER_PARAM_TYPE_RATE_CONTROL_QP_RANGE (21) /* rate_control_qp_range */ + #define MVE_BUFFER_PARAM_TYPE_RATE_CONTROL_HRD_BUF_SIZE (23) /* arg */ + #define MVE_BUFFER_PARAM_TYPE_VP9_SEGMAP (24) /* VP9 segment map settings */ + #define MVE_BUFFER_PARAM_TYPE_RATE_CONTROL_QP_RANGE_I (25) /* special range for I frames, + * rate_control_qp_range */ + #define MVE_BUFFER_PARAM_TYPE_SEI_USER_DATA_UNREGISTERED (26) /* sei user_data_unregistered */ + #define MVE_BUFFER_PARAM_TYPE_GOP_RESET_DYNAMIC (27) + #define MVE_BUFFER_PARAM_TYPE_GOP_RESET_LTR_PEROID_DYNAMIC (28) /* reset ltr peroid dynamiclly */ + #define MVE_BUFFER_PARAM_TYPE_ENC_STATS (29) /* encode stats */ + #define MVE_BUFFER_PARAM_TYPE_OSD_RECTANGLES (30) /* osd rectangles */ + #define MVE_BUFFER_PARAM_TYPE_RATE_CONTROL_CHANGE_POS (31) + + union + { + uint32_t arg; /* some parameters only need a uint32_t as argument */ + struct mve_buffer_param_qp qp; + struct mve_reset_gop_dynamic reset_gop_dynamic; + struct mve_reset_ltr_peroid_dynamic reset_ltr_peroid_dynamic; + struct mve_buffer_param_regions regions; + struct mve_buffer_param_display_size display_size; + struct mve_buffer_param_range_map range_map; + struct mve_buffer_param_rate_control rate_control; + struct mve_buffer_param_rate_control_qp_range rate_control_qp_range; + struct mve_buffer_param_colour_description colour_description; + struct mve_buffer_param_frame_packing frame_packing; + struct mve_buffer_param_frame_field_info frame_field_info; + struct mve_buffer_param_change_rectangles change_rectangles; + struct mve_buffer_param_vp9_segmap vp9_segmap; + struct mve_buffer_param_sei_user_data_unregistered user_data_unregistered; + struct mve_buffer_param_enc_stats enc_stats; + struct mve_buffer_param_osd_rectangles osd_rectangles_buff; + } data; +}; + +/* output from decoder, assertive display statistics. + * buffer_ptr points to a buffer of luma quad average values for the picture + * that can be used as a thumbnail. the type of content used to generate the + * assertive display statistics is indicated by MVE_AD_STATS_PIC_FMT_INTERLACED. + * for progressive content; the arrangement is in raster format with dimensions + * thumbnail_width by thumbnail_height. the overall frame average luma and + * chroma values are returned in frame_average. + * for interlaced content; the arrangement is in raster format, top field + * followed by bottom field with each field having dimensions thumbnail_width by + * thumbnail_height. the field averages for luma and chroma values are combined + * and returned in an overall value for the frame (frame_average). + */ +struct mve_buffer_general_ad_stats +{ + + uint32_t frame_averages; + // bitfields + #define MVE_AD_STATS_PIC_AVGS_Y (0) + #define MVE_AD_STATS_PIC_AVGS_Y_SZ (12) + #define MVE_AD_STATS_PIC_AVGS_CB (12) + #define MVE_AD_STATS_PIC_AVGS_CB_SZ (10) + #define MVE_AD_STATS_PIC_AVGS_CR (22) + #define MVE_AD_STATS_PIC_AVGS_CR_SZ (10) + uint16_t thumbnail_width; + uint16_t thumbnail_height; + uint8_t ad_stats_flags; + #define MVE_AD_STATS_PIC_FMT_PROGRESSIVE (0) + #define MVE_AD_STATS_PIC_FMT_INTERLACED (1) + uint8_t reserved[3]; +}; + +/* The general purpose buffer header stores the common fields of an + * mve_buffer_general. it contains the pointer to the data buffer that contains + * the general purpose data + */ +struct mve_buffer_general_hdr +{ + /* For identification of the buffer, this is not changed by the firmware. */ + uint64_t host_handle; + + /* this depends upon the type of the general purpose buffer */ + uint64_t user_data_tag; + + /* pointer to the buffer containing the general purpose data. the format + * of this data is defined by the configuration in the mve_buffer_general */ + uint32_t buffer_ptr; + + /* size of the buffer pointed to by buffer_ptr */ + uint32_t buffer_size; + + /* selects the type of semantics to use for the general purpose buffer. it + * tags (or discriminates) the union config member in mve_buffer_general + */ + uint16_t type; /* Extra data: */ + #define MVE_BUFFER_GENERAL_TYPE_INVALID (0) /* invalid */ + #define MVE_BUFFER_GENERAL_TYPE_BLOCK_CONFIGS (1) /* block_configs */ + #define MVE_BUFFER_GENERAL_TYPE_AD_STATS (2) /* assertive display statistics */ + /* size of the mve_buffer_general config member */ + uint16_t config_size; + + /* pad to force 8-byte alignment */ + uint32_t reserved; +}; + +/* The general purpose buffer consists of a header and a configuration. The + * header contains a pointer to a buffer whose format is described by the + * configuration. The type of configuration is indicated by the type value in + * the header. N.B. In use, the size of the config part of this structure is + * defined in the header and is not necessarily equal to that returned by the + * sizeof() operator. This allows a more size efficient communication between + * the host and firmware. + */ +struct mve_buffer_general +{ + struct mve_buffer_general_hdr header; + + /* used to describe the configuration of the general purpose buffer data + * pointed to be buffer_ptr + */ + union + { + struct mve_buffer_general_block_configs block_configs; + struct mve_buffer_general_ad_stats ad_stats; + } config; +}; + +#ifdef __cplusplus +} +#endif + +#endif /* __FW_INCLUDE__MVE_PROTOCOL_DEF_H__ */ diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mve_protocol_def_v3.h b/src/little/linux/drivers/media/platform/canaan-vpu/mve_protocol_def_v3.h new file mode 100755 index 000000000..9c79991f0 --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mve_protocol_def_v3.h @@ -0,0 +1,2003 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +/* + * Copyright: + * ---------------------------------------------------------------------------- + * This confidential and proprietary software may be used only as authorized + * by a licensing agreement from Arm Technology (China) Co., Ltd. + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * The entire notice above must be reproduced on all authorized copies and + * copies may only be made to the extent permitted by a licensing agreement + * from Arm Technology (China) Co., Ltd. + * ---------------------------------------------------------------------------- + */ +#ifndef __FW_INCLUDE__MVE_PROTOCOL_DEF_H__ +#define __FW_INCLUDE__MVE_PROTOCOL_DEF_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __KERNEL__ +#include +#else +#include +#endif + +/***************************************************************************** + * + * Communication protocol between the host/driver and the MVE firmware, + * the 'host interface'. + * + * MVE == LINLON Video Engine + * + * Protocol version 3.3 + * + * Note: Message structs may be expanded in the future; the host should + * use the 'size' of the message to determine how many bytes to + * read from the message queue, rather than a sizeof(struct). + * + ****************************************************************************/ + + + + + + + + + + + + + + + + + +/***************************************************************************** + * + * Virtual memory regions + * + * ..._ADDR_BEGIN gives the starting virtual address of the region, + * and ..._ADDR_END the (non-inclusive) ending address, such that + * the size of the region is obtained with the subtraction + * (..._ADDR_END - ..._ADDR_BEGIN). + * + ****************************************************************************/ + +/* Memory region for first firmware instance */ +#define MVE_MEM_REGION_FW_INSTANCE0_ADDR_BEGIN (0x00000000u) +#define MVE_MEM_REGION_FW_INSTANCE0_ADDR_END (0x000FFFFFu + 1) + +/* Memory regions for other firmware instances */ +#define MVE_MEM_REGION_FW_INSTANCE1_ADDR_BEGIN (0x01000000u) +#define MVE_MEM_REGION_FW_INSTANCE1_ADDR_END \ + (MVE_MEM_REGION_FW_INSTANCE1_ADDR_BEGIN + MVE_MEM_REGION_FW_INSTANCE0_ADDR_END) + +#define MVE_MEM_REGION_FW_INSTANCE2_ADDR_BEGIN (0x02000000u) +#define MVE_MEM_REGION_FW_INSTANCE2_ADDR_END \ + (MVE_MEM_REGION_FW_INSTANCE2_ADDR_BEGIN + MVE_MEM_REGION_FW_INSTANCE0_ADDR_END) + +#define MVE_MEM_REGION_FW_INSTANCE3_ADDR_BEGIN (0x03000000u) +#define MVE_MEM_REGION_FW_INSTANCE3_ADDR_END \ + (MVE_MEM_REGION_FW_INSTANCE3_ADDR_BEGIN + MVE_MEM_REGION_FW_INSTANCE0_ADDR_END) + +#define MVE_MEM_REGION_FW_INSTANCE4_ADDR_BEGIN (0x04000000u) +#define MVE_MEM_REGION_FW_INSTANCE4_ADDR_END \ + (MVE_MEM_REGION_FW_INSTANCE4_ADDR_BEGIN + MVE_MEM_REGION_FW_INSTANCE0_ADDR_END) + +#define MVE_MEM_REGION_FW_INSTANCE5_ADDR_BEGIN (0x05000000u) +#define MVE_MEM_REGION_FW_INSTANCE5_ADDR_END \ + (MVE_MEM_REGION_FW_INSTANCE5_ADDR_BEGIN + MVE_MEM_REGION_FW_INSTANCE0_ADDR_END) + +#define MVE_MEM_REGION_FW_INSTANCE6_ADDR_BEGIN (0x06000000u) +#define MVE_MEM_REGION_FW_INSTANCE6_ADDR_END \ + (MVE_MEM_REGION_FW_INSTANCE6_ADDR_BEGIN + MVE_MEM_REGION_FW_INSTANCE0_ADDR_END) + +#define MVE_MEM_REGION_FW_INSTANCE7_ADDR_BEGIN (0x07000000u) +#define MVE_MEM_REGION_FW_INSTANCE7_ADDR_END \ + (MVE_MEM_REGION_FW_INSTANCE7_ADDR_BEGIN + MVE_MEM_REGION_FW_INSTANCE0_ADDR_END) + +/* + * Areas for communication between host and MVE are placed in the interval + * 0x10079000 - 0x1007FFFF, see special defines further down. + */ + +/* PROTECTED virtual memory region */ +#define MVE_MEM_REGION_PROTECTED_ADDR_BEGIN (0x20000000u) +#define MVE_MEM_REGION_PROTECTED_ADDR_END (0x6FFFFFFFu + 1) + +/* FRAMEBUF virtual memory region */ +#define MVE_MEM_REGION_FRAMEBUF_ADDR_BEGIN (0x70000000u) +#define MVE_MEM_REGION_FRAMEBUF_ADDR_END (0xEFFFFFFFu + 1) + +/* 0xF0000000 - 0xFFFFFFFF is used internally in MVE */ + + + + + + + + + + + + + + + + +/***************************************************************************** + * + * Communication queues between HOST/DRIVER and MVE + * + * Address for queue for messages in to MVE, + * one struct mve_comm_area_host located here + * + ****************************************************************************/ + +#define MVE_COMM_MSG_INQ_ADDR (0x10079000u) + +/* Address for queue for messages out from MVE, + * one struct mve_comm_area_mve located here + */ +#define MVE_COMM_MSG_OUTQ_ADDR (0x1007A000u) + +/* Address for queue for input buffers in to MVE, + * one struct mve_comm_area_host located here + */ +#define MVE_COMM_BUF_INQ_ADDR (0x1007B000u) + +/* Address for queue for input buffers returned from MVE, + * one struct mve_comm_area_mve located here + */ +#define MVE_COMM_BUF_INRQ_ADDR (0x1007C000u) + +/* Address for queue for output buffers in to MVE, + * one struct mve_comm_area_host located here + */ +#define MVE_COMM_BUF_OUTQ_ADDR (0x1007D000u) + +/* Address for queue for output buffers returned from MVE, + * one struct mve_comm_area_mve located here + */ +#define MVE_COMM_BUF_OUTRQ_ADDR (0x1007E000u) + +/* One struct mve_rpc_communication_area located here */ +#define MVE_COMM_RPC_ADDR (0x1007F000u) + +/* Address for ram_print buffer in FW */ +#define MVE_FW_PRINT_RAM_ADDR (0x10100000u) +#define MVE_FW_PRINT_RAM_SIZE (0x80000u) + +/* One page of memory (4 kB) is used for each queue, + * so maximum 1024 words, but need room for some counters as well, + * see structs mve_comm_area_mve and mve_comm_area_host below. + */ +#define MVE_COMM_QUEUE_SIZE_IN_WORDS 1020 + +/* This is the part of the message area that is written by host. */ +struct mve_comm_area_host +{ + volatile uint16_t out_rpos; + volatile uint16_t in_wpos; + volatile uint32_t reserved[ 3 ]; + /* + * Queue of messages to MVE, each block of data prefixed with + * a mve_msg_header + */ + volatile uint32_t in_data[ MVE_COMM_QUEUE_SIZE_IN_WORDS ]; +}; + +/* This is the part of the message area that is written by MVE. */ +struct mve_comm_area_mve +{ + volatile uint16_t out_wpos; + volatile uint16_t in_rpos; + volatile uint32_t reserved[ 3 ]; + /* + * Queue of messages to host, each block of data prefixed with + * a mve_msg_header + */ + volatile uint32_t out_data[ MVE_COMM_QUEUE_SIZE_IN_WORDS ]; +}; + +#define MVE_RPC_AREA_SIZE_IN_WORDS 256 +#define MVE_RPC_DATA_SIZE_IN_WORDS (MVE_RPC_AREA_SIZE_IN_WORDS - 3) +union mve_rpc_params +{ + volatile uint32_t data[ MVE_RPC_DATA_SIZE_IN_WORDS ]; + struct + { + char string[ MVE_RPC_DATA_SIZE_IN_WORDS * 4 ]; + } debug_print; + struct + { + uint32_t size; + uint32_t max_size; + uint8_t region; /* Memory region selection */ + #define MVE_MEM_REGION_PROTECTED (0) + #define MVE_MEM_REGION_OUTBUF (1) + #define MVE_MEM_REGION_FRAMEBUF (MVE_MEM_REGION_OUTBUF) + + /* The newly allocated memory must be placed + * on (at least) a 2^(log2_alignment) boundary + */ + uint8_t log2_alignment; + } mem_alloc; + struct + { + uint32_t ve_pointer; + uint32_t new_size; + } mem_resize; + struct + { + uint32_t ve_pointer; + } mem_free; +}; + +struct mve_rpc_communication_area +{ + volatile uint32_t state; + #define MVE_RPC_STATE_FREE (0) + #define MVE_RPC_STATE_PARAM (1) + #define MVE_RPC_STATE_RETURN (2) + volatile uint32_t call_id; + #define MVE_RPC_FUNCTION_DEBUG_PRINTF (1) + #define MVE_RPC_FUNCTION_MEM_ALLOC (2) + #define MVE_RPC_FUNCTION_MEM_RESIZE (3) + #define MVE_RPC_FUNCTION_MEM_FREE (4) + volatile uint32_t size; + union mve_rpc_params params; +}; + +struct mve_fw_ram_print_head_aera +{ + volatile uint32_t rd_cnt; + volatile uint32_t reserved0[15]; + + volatile uint32_t flag; + volatile uint32_t index; + volatile uint32_t wr_cnt; + volatile uint32_t reserved1[13]; +}; + + + + + + + + + + + + + + +/********************************************************************* + * + * Message codes + * + *********************************************************************/ + +/* Messages consist of one struct mve_msg_header, possibly followed + * by extra data. + */ +struct mve_msg_header +{ + uint16_t code; + /* REQUESTs are messages from the + * host/driver to the firmware: Code: Extra data in message: */ + #define MVE_REQUEST_CODE_GO (1001) /* no extra data */ + #define MVE_REQUEST_CODE_STOP (1002) /* no extra data */ + #define MVE_REQUEST_CODE_INPUT_FLUSH (1003) /* no extra data */ + #define MVE_REQUEST_CODE_OUTPUT_FLUSH (1004) /* no extra data */ + #define MVE_REQUEST_CODE_SWITCH (1005) /* no extra data */ + #define MVE_REQUEST_CODE_PING (1006) /* no extra data */ + #define MVE_REQUEST_CODE_DUMP (1008) /* no extra data */ + #define MVE_REQUEST_CODE_JOB (1009) /* struct mve_request_job */ + #define MVE_REQUEST_CODE_SET_OPTION (1010) /* struct mve_request_set_option (variable size) */ + #define MVE_REQUEST_CODE_RELEASE_REF_FRAME (1011) /* struct mve_request_release_ref_frame */ + #define MVE_REQUEST_CODE_IDLE_ACK (1012) /* no extra data */ + #define MVE_REQUEST_CODE_DEBUG (1013) /* level: 0 for disable, refer to fw_log_level */ + /* RESPONSEs are messages from + * the firmware to the host: */ + #define MVE_RESPONSE_CODE_SWITCHED_IN (2001) /* struct mve_response_switched_in */ + #define MVE_RESPONSE_CODE_SWITCHED_OUT (2002) /* struct mve_response_switched_out */ + #define MVE_RESPONSE_CODE_SET_OPTION_CONFIRM (2003) /* no extra data */ + #define MVE_RESPONSE_CODE_JOB_DEQUEUED (2004) /* struct mve_response_job_dequeued */ + #define MVE_RESPONSE_CODE_INPUT (2005) /* no extra data, but buffer placed in buffer queue */ + #define MVE_RESPONSE_CODE_OUTPUT (2006) /* no extra data, but buffer placed in buffer queue */ + #define MVE_RESPONSE_CODE_INPUT_FLUSHED (2007) /* no extra data */ + #define MVE_RESPONSE_CODE_OUTPUT_FLUSHED (2008) /* no extra data */ + #define MVE_RESPONSE_CODE_PONG (2009) /* no extra data */ + #define MVE_RESPONSE_CODE_ERROR (2010) /* struct mve_response_error */ + #define MVE_RESPONSE_CODE_STATE_CHANGE (2011) /* struct mve_response_state_change */ + #define MVE_RESPONSE_CODE_DUMP (2012) /* no extra data */ + #define MVE_RESPONSE_CODE_IDLE (2013) /* no extra data */ + #define MVE_RESPONSE_CODE_FRAME_ALLOC_PARAM (2014) /* struct mve_response_frame_alloc_parameters */ + #define MVE_RESPONSE_CODE_SEQUENCE_PARAMETERS (2015) /* struct mve_response_sequence_parameters */ + #define MVE_RESPONSE_CODE_EVENT (2016) /* struct mve_response_event (variable size) */ + #define MVE_RESPONSE_CODE_SET_OPTION_FAIL (2017) /* struct mve_response_set_option_failed */ + #define MVE_RESPONSE_CODE_REF_FRAME_UNUSED (2018) /* struct mve_response_ref_frame_unused */ + #define MVE_RESPONSE_CODE_DEBUG (2019) /* no extra data */ + /* BUFFERs are sent from host to firmware, + * and then return at some time: */ + #define MVE_BUFFER_CODE_FRAME (3001) /* struct mve_buffer_frame */ + #define MVE_BUFFER_CODE_BITSTREAM (3002) /* struct mve_buffer_bitstream */ + #define MVE_BUFFER_CODE_PARAM (3003) /* struct mve_buffer_param */ + #define MVE_BUFFER_CODE_GENERAL (3004) /* struct mve_buffer_general */ + + uint16_t size; /* size in bytes of trailing data, 0 if none */ +}; + + + + + + + + + + + + + + + +enum fw_log_level{ + FW_LOG_ERROR = 1, + FW_LOG_WARNING, + FW_LOG_INFO, + FW_LOG_DEBUG, + FW_LOG_VERBOSE, + FW_LOG_MAX +}; + + +/********************************************************************* + * + * REQUESTs are messages from the host to the firmware + * + * Some of the MVE_REQUEST_CODE_ codes are followed by one of the + * structs below. + * + *********************************************************************/ + +struct mve_request_job +{ + uint16_t cores; /* >= 1, number of cores to use, must match request to HW scheduler */ + uint16_t frames; /* number of frames to process, zero means infinite */ + uint32_t flags; /* can be zero */ + #define MVE_JOB_FLAG_DISABLE_BNDMGR (0x01) +}; + +struct mve_request_set_option +{ + uint32_t index; + #define MVE_SET_OPT_INDEX_NALU_FORMAT (1) /* see arg, MVE_OPT_NALU_FORMAT_ */ + #define MVE_SET_OPT_INDEX_STREAM_ESCAPING (2) /* arg=1 to enable (default), arg=0 to disable */ + #define MVE_SET_OPT_INDEX_PROFILE_LEVEL (3) /* data.profile_level */ + #define MVE_SET_OPT_INDEX_HOST_PROTOCOL_PRINTS (4) /* arg=1 to enable, arg=0 to disable (default) */ + #define MVE_SET_OPT_INDEX_PROFILING (5) /* arg=1 to enable, arg=0 to disable (default) */ + #define MVE_SET_OPT_INDEX_DISABLE_FEATURES (6) /* see arg, MVE_OPT_DISABLE_FEATURE_ */ + #define MVE_SET_OPT_INDEX_IGNORE_STREAM_HEADERS (7) /* decode, arg=1 to enable, + * arg=0 to disable (default) */ + #define MVE_SET_OPT_INDEX_FRAME_REORDERING (8) /* decode, arg=1 to enable (default), + * arg=0 to disable */ + #define MVE_SET_OPT_INDEX_INTBUF_SIZE (9) /* decode, arg = suggested limit of intermediate + * buffer allocation */ + #define MVE_SET_OPT_INDEX_ENC_P_FRAMES (16) /* encode, arg = nPFrames */ + #define MVE_SET_OPT_INDEX_ENC_B_FRAMES (17) /* encode, arg = number of B frames */ + #define MVE_SET_OPT_INDEX_GOP_TYPE (18) /* encode, see arg */ + #define MVE_SET_OPT_INDEX_INTRA_MB_REFRESH (19) /* encode, arg */ + #define MVE_SET_OPT_INDEX_ENC_CONSTR_IPRED (20) /* encode, arg = 0 or 1 */ + #define MVE_SET_OPT_INDEX_ENC_ENTROPY_SYNC (21) /* encode, arg = 0 or 1 */ + #define MVE_SET_OPT_INDEX_ENC_TEMPORAL_MVP (22) /* encode, arg = 0 or 1 */ + #define MVE_SET_OPT_INDEX_TILES (23) /* encode, data.tiles */ + #define MVE_SET_OPT_INDEX_ENC_MIN_LUMA_CB_SIZE (24) /* HEVC encode, arg = 8 or 16, + * for sizes 8x8 or 16x16 */ + #define MVE_SET_OPT_INDEX_ENC_MB_TYPE_ENABLE (25) /* encode, see arg */ + #define MVE_SET_OPT_INDEX_ENC_MB_TYPE_DISABLE (26) /* encode, see arg */ + #define MVE_SET_OPT_INDEX_ENC_H264_CABAC (27) /* encode, arg = 0 or 1, enabled by default */ + #define MVE_SET_OPT_INDEX_ENC_SLICE_SPACING (28) /* encode, arg = suggested number of + * CTUs/macroblocks in a slice */ + #define MVE_SET_OPT_INDEX_ENC_VP9_PROB_UPDATE (30) /* VP9 encode, see arg */ + #define MVE_SET_OPT_INDEX_RESYNC_INTERVAL (31) /* JPEG encode, arg = nRestartInterval + * = nResynchMarkerSpacing */ + #define MVE_SET_OPT_INDEX_HUFFMAN_TABLE (32) /* JPEG encode, data.huffman_table */ + #define MVE_SET_OPT_INDEX_QUANT_TABLE (33) /* JPEG encode, data.quant_table */ + #define MVE_SET_OPT_INDEX_ENC_EXPOSE_REF_FRAMES (34) /* encode debug, arg = 0 or 1, + * disabled by default */ + #define MVE_SET_OPT_INDEX_MBINFO_OUTPUT (35) /* encode, arg=1 to enable, + * arg=0 to disable (default) */ + #define MVE_SET_OPT_INDEX_MV_SEARCH_RANGE (36) /* encode, data,motion_vector_search_range */ + #define MVE_SET_OPT_INDEX_ENC_STREAM_BITDEPTH (38) /* encode, data.bitdepth, to set other bitdepth + * of encoded stream than of input frames */ + #define MVE_SET_OPT_INDEX_ENC_STREAM_CHROMA_FORMAT (39) /* encode, arg, to set other chroma format of + * encoded stream than of input frames */ + #define MVE_SET_OPT_INDEX_ENC_RGB_TO_YUV_MODE (40) /* encode, arg, select which way RGB is converted + * to YUV before encoding */ + #define MVE_SET_OPT_INDEX_ENC_BANDWIDTH_LIMIT (41) /* encode, arg, the maxium bandwidth limit defined + * by host */ + #define MVE_SET_OPT_INDEX_WATCHDOG_TIMEOUT (42) /* arg=timeout, arg=0 to disable */ + #define MVE_SET_OPT_INDEX_ENC_CABAC_INIT_IDC (43) /* encode, arg; 0,1,2 for H264; 0,1 for HEVC */ + #define MVE_SET_OPT_INDEX_ENC_ADPTIVE_QUANTISATION (44) /* encode (h264 and hevc) */ + #define MVE_SET_OPT_INDEX_QP_DELTA_I_P (45) + #define MVE_SET_OPT_INDEX_QP_DELTA_I_B_REF (46) + #define MVE_SET_OPT_INDEX_QP_DELTA_I_B_NONREF (47) + #define MVE_SET_OPT_INDEX_CB_QP_OFFSET (48) + #define MVE_SET_OPT_INDEX_CR_QP_OFFSET (49) + #define MVE_SET_OPT_INDEX_LAMBDA_SCALE (50) /* encode, data.lambda_scale */ + #define MVE_SET_OPT_INDEX_ENC_MAX_NUM_CORES (51) /* maximum number of cores */ + #define MVE_SET_OPT_INDEX_ENC_FIXED_QP (56) + /* ARBITRARY_DOWNSCALE */ + #define MVE_SET_OPT_INDEX_DEC_DOWNSCALE (57) /* decode, set downscaled width and height */ + /* SAO_EVAL */ + #define MVE_SET_OPT_INDEX_ENC_SAO_PENALTY (58) + #define MVE_SET_OPT_INDEX_ENC_SAO_EN (59) /* do not use now */ + #define MVE_SET_OPT_INDEX_ENC_SAO_LUMA_EN (60) + #define MVE_SET_OPT_INDEX_ENC_SAO_CHROMA_EN (61) + /* MVE_ENCODE_CROP_FEATURE */ + #define MVE_SET_OPT_INDEX_ENC_CROP_RARAM_LEFT (62) + #define MVE_SET_OPT_INDEX_ENC_CROP_RARAM_RIGHT (63) + #define MVE_SET_OPT_INDEX_ENC_CROP_RARAM_TOP (64) + #define MVE_SET_OPT_INDEX_ENC_CROP_RARAM_BOTTOM (65) + /* LONG_TERM_REFERENCE */ + #define MVE_SET_OPT_INDEX_ENC_LTR_MODE (66) + #define MVE_SET_OPT_INDEX_ENC_LTR_PERIOD (67) + #define MVE_SET_OPT_INDEX_DEC_DOWNSCALE_POS_MODE (69) + #define MVE_SET_OPT_INDEX_MINI_FRAME_HEIGHT_PIX (70) /* max cnt of mini frames*/ + /* Encode Data Statistics */ + #define MVE_SET_OPT_INDEX_ENC_STATS_MODE (71) + #define MVE_SET_OPT_INDEX_ENC_MULTI_SPS_PPS (73) + #define MVE_SET_OPT_INDEX_ENC_INIT_QPI (74) + #define MVE_SET_OPT_INDEX_ENC_INIT_QPP (75) + #define MVE_SET_OPT_INDEX_ENC_INIT_QPB (76) + + #define MVE_SET_OPT_INDEX_ENC_RC_CLIP_TOP (80) + #define MVE_SET_OPT_INDEX_ENC_RC_CLIP_BOTTOM (81) + #define MVE_SET_OPT_INDEX_ENC_QPMAP_CLIP_TOP (82) + #define MVE_SET_OPT_INDEX_ENC_QPMAP_CLIP_BOTTOM (83) + + #define MVE_SET_OPT_INDEX_ENC_REF_RING_BUFFER (84) + #define MVE_SET_OPT_INDEX_ENC_JPEG_RC (85) //MVE_ENC_RC_JPEG + #define MVE_SET_OPT_INDEX_ENC_RC_I_BIT_RATIO (86) /* RC_I_BIT_RATIO */ + #define MVE_SET_OPT_INDEX_ENC_RC_I_BIT_MODE (87) /* RC_I_BIT_RATIO */ + #define MVE_SET_OPT_iNDEX_ENC_VISUAL_ENABLE (89)//enable_visual FW CODE IS iNDEX + /* SVCT3 level-1 peroid */ + #define MVE_SET_OPT_INDEX_ENC_SVCT3_LEVEL1_PEROID (88) + /* GDR */ + #define MVE_SET_OPT_INDEX_ENC_GDR_NUMBER (90) + #define MVE_SET_OPT_INDEX_ENC_GDR_PERIOD (91) + + #define MVE_SET_OPT_INDEX_SCD_ENABLE (93) + #define MVE_SET_OPT_INDEX_SCD_PERCENT (94) + #define MVE_SET_OPT_INDEX_SCD_THRESHOLD (95) + /* for aq, add new para */ + #define MVE_SET_OPT_INDEX_ENC_AQ_SSIM_EN (96) + #define MVE_SET_OPT_INDEX_ENC_AQ_NEG_RATIO (97) + #define MVE_SET_OPT_INDEX_ENC_AQ_POS_RATIO (98) + #define MVE_SET_OPT_INDEX_ENC_AQ_QPDELTA_LMT (99) + #define MVE_SET_OPT_INDEX_ENC_AQ_INIT_FRM_AVG_SVAR (100) + #define MVE_SET_OPT_INDEX_SCD_ADAPTIVE_I (101) + #define MVE_SET_OPT_INDEX_DEC_YUV2RGB_PARAMS (103) + #define MVE_SET_OPT_INDEX_ENC_FORCED_UV_VAL (104) + #define MVE_SET_OPT_INDEX_DEC_DSL_INTERP_MODE (105) + + #define MVE_SET_OPT_INDEX_ENC_SRC_CROPPING (106) + #define MVE_SET_OPT_INDEX_DEC_DST_CROPPING (107) //ENABLE_DST_CROP + union + { + uint32_t arg; /* Most options only need a uint32_t as argument */ + /* For option MVE_SET_OPT_INDEX_NALU_FORMAT, arg should + * be one of these: */ + #define MVE_OPT_NALU_FORMAT_START_CODES (1) + #define MVE_OPT_NALU_FORMAT_ONE_NALU_PER_BUFFER (2) + #define MVE_OPT_NALU_FORMAT_ONE_BYTE_LENGTH_FIELD (4) + #define MVE_OPT_NALU_FORMAT_TWO_BYTE_LENGTH_FIELD (8) + #define MVE_OPT_NALU_FORMAT_FOUR_BYTE_LENGTH_FIELD (16) + #define MVE_OPT_NALU_FORMAT_MBINFO (32) /* only used for debugging */ + /* For option MVE_SET_OPT_INDEX_GOP_TYPE, arg should + * be one of these: */ + #define MVE_OPT_GOP_TYPE_BIDIRECTIONAL (1) + #define MVE_OPT_GOP_TYPE_LOW_DELAY (2) + #define MVE_OPT_GOP_TYPE_PYRAMID (3) + #define MVE_OPT_GOP_TYPE_SVCT3 (4) + #define MVE_OPT_GOP_TYPE_GDR (5) + /* For option MVE_SET_OPT_INDEX_ENC_VP9_PROB_UPDATE, + * arg should be one of these: */ + #define MVE_OPT_VP9_PROB_UPDATE_DISABLED (0) + #define MVE_OPT_VP9_PROB_UPDATE_IMPLICIT (1) + #define MVE_OPT_VP9_PROB_UPDATE_EXPLICIT (2) + /* For option MVE_SET_OPT_INDEX_DISABLE_FEATURES, arg + * should be a bitmask with features to disable: */ + #define MVE_OPT_DISABLE_FEATURE_AFBC_COMP (0x00000001) /* VDMA AFBC Compression */ + #define MVE_OPT_DISABLE_FEATURE_REF_CACHE (0x00000002) /* REF caching */ + #define MVE_OPT_DISABLE_FEATURE_DEBLOCK (0x00000004) /* Deblocking */ + #define MVE_OPT_DISABLE_FEATURE_SAO (0x00000008) /* SAO */ + #define MVE_OPT_DISABLE_FEATURE_PIC_OUTPUT (0x00000020) /* Picture Output Removal */ + #define MVE_OPT_DISABLE_FEATURE_PIPE (0x00000040) /* Pipe (i.e. parser-only) */ + #define MVE_OPT_DISABLE_FEATURE_SLEEP (0x00000080) /* Clock gating + * (SOC_SYSCTRL.SLEEP bit) */ + #define MVE_OPT_DISABLE_FEATURE_AFBC_LEGACY_REF (0x00000100) /* Enables tiled AFBC format in + * reference buffers. Ignored + * for decode AFBC output */ + #define MVE_OPT_DISABLE_FEATURE_REF_PICS (0x00000400) /* Forces use of static 16x16 + * reference pics */ + #define MVE_OPT_DISABLE_FEATURE_CHNG_RECT_WA (0x00000800) /* Disables workaround */ + #define MVE_OPT_DISABLE_FEATURE_REFSZ_LIMIT (0x00001000) /* Disable REFSZ bw limit */ + /* For options MVE_SET_OPT_INDEX_ENC_MB_TYPE_ENABLE + * and MVE_SET_OPT_INDEX_ENC_MB_TYPE_DISABLE, arg + * should be a bitmask of MVE_MBTYPEs: */ + #define MVE_MBTYPE_4x4 (0x00000001) /* 4x4 inter */ + #define MVE_MBTYPE_4x8 (0x00000002) /* 4x8 inter */ + #define MVE_MBTYPE_8x4 (0x00000004) /* 8x4 inter */ + #define MVE_MBTYPE_8x8 (0x00000008) /* 8x8 inter */ + #define MVE_MBTYPE_8x16 (0x00000010) /* 8x16 inter */ + #define MVE_MBTYPE_16x8 (0x00000020) /* 16x8 inter */ + #define MVE_MBTYPE_16x16 (0x00000040) /* 16x16 inter */ + #define MVE_MBTYPE_PSKIP (0x00000080) /* P Skip inter */ + #define MVE_MBTYPE_I4x4 (0x00000100) /* 4x4 intra */ + #define MVE_MBTYPE_I8x8 (0x00000200) /* 8x8 intra */ + #define MVE_MBTYPE_I16x16 (0x00000400) /* 16x16 intra */ + #define MVE_MBTYPE_I32x32 (0x00000800) /* 32x32 intra */ + #define MVE_MBTYPE_16x32 (0x00001000) /* 16x32 inter */ + #define MVE_MBTYPE_32x16 (0x00002000) /* 32x16 inter */ + #define MVE_MBTYPE_32x32 (0x00004000) /* 32x32 inter */ + /* For option MVE_SET_OPT_INDEX_ENC_RGB_TO_YUV_MODE, + * arg should be one of these: */ + #define MVE_OPT_RGB_TO_YUV_BT601_STUDIO (0) + #define MVE_OPT_RGB_TO_YUV_BT601_FULL (1) + #define MVE_OPT_RGB_TO_YUV_BT709_STUDIO (2) + #define MVE_OPT_RGB_TO_YUV_BT709_FULL (3) + #define MVE_OPT_RGB_TO_YUV_BT2020_STUDIO (4) + #define MVE_OPT_RGB_TO_YUV_BT2020_FULL (5) + struct + { + uint16_t profile; + /* AVC/H.264 profiles */ + #define MVE_OPT_PROFILE_H264_BASELINE (1) + #define MVE_OPT_PROFILE_H264_MAIN (2) + #define MVE_OPT_PROFILE_H264_HIGH (3) + #define MVE_OPT_PROFILE_H264_HIGH_10 (4) + /* HEVC/H.265 profiles */ + #define MVE_OPT_PROFILE_H265_MAIN (1) + #define MVE_OPT_PROFILE_H265_MAIN_STILL (2) + #define MVE_OPT_PROFILE_H265_MAIN_INTRA (3) + #define MVE_OPT_PROFILE_H265_MAIN_10 (4) + /* VC-1 profiles */ + #define MVE_OPT_PROFILE_VC1_SIMPLE (1) + #define MVE_OPT_PROFILE_VC1_MAIN (2) + #define MVE_OPT_PROFILE_VC1_ADVANCED (3) + /* VP8 profiles */ + #define MVE_OPT_PROFILE_VP8_MAIN (1) + uint16_t level; + /* AVC/H.264 levels */ + #define MVE_OPT_LEVEL_H264_1 (1) + #define MVE_OPT_LEVEL_H264_1b (2) + #define MVE_OPT_LEVEL_H264_11 (3) + #define MVE_OPT_LEVEL_H264_12 (4) + #define MVE_OPT_LEVEL_H264_13 (5) + #define MVE_OPT_LEVEL_H264_2 (6) + #define MVE_OPT_LEVEL_H264_21 (7) + #define MVE_OPT_LEVEL_H264_22 (8) + #define MVE_OPT_LEVEL_H264_3 (9) + #define MVE_OPT_LEVEL_H264_31 (10) + #define MVE_OPT_LEVEL_H264_32 (11) + #define MVE_OPT_LEVEL_H264_4 (12) + #define MVE_OPT_LEVEL_H264_41 (13) + #define MVE_OPT_LEVEL_H264_42 (14) + #define MVE_OPT_LEVEL_H264_5 (15) + #define MVE_OPT_LEVEL_H264_51 (16) + #define MVE_OPT_LEVEL_H264_52 (17) + #define MVE_OPT_LEVEL_H264_6 (18) + #define MVE_OPT_LEVEL_H264_61 (19) + #define MVE_OPT_LEVEL_H264_62 (20) + #define MVE_OPT_LEVEL_H264_USER_SUPPLIED_BASE (32) + /* The value (MVE_OPT_LEVEL_H264_USER_SUPPLIED_BASE + level_idc) encodes a user + * supplied level_idc value in the range 0 to 255 inclusive. If the host supplies a level_idc + * value by this method then the encoder will encode this level_idc value in the bitstream + * without checking the validity of the level_idc value + */ + #define MVE_OPT_LEVEL_H264_USER_SUPPLIED_MAX (MVE_OPT_LEVEL_H264_USER_SUPPLIED_BASE + 255) + /* HEVC/H.265 levels */ + #define MVE_OPT_LEVEL_H265_MAIN_TIER_1 (1) + #define MVE_OPT_LEVEL_H265_HIGH_TIER_1 (2) + #define MVE_OPT_LEVEL_H265_MAIN_TIER_2 (3) + #define MVE_OPT_LEVEL_H265_HIGH_TIER_2 (4) + #define MVE_OPT_LEVEL_H265_MAIN_TIER_21 (5) + #define MVE_OPT_LEVEL_H265_HIGH_TIER_21 (6) + #define MVE_OPT_LEVEL_H265_MAIN_TIER_3 (7) + #define MVE_OPT_LEVEL_H265_HIGH_TIER_3 (8) + #define MVE_OPT_LEVEL_H265_MAIN_TIER_31 (9) + #define MVE_OPT_LEVEL_H265_HIGH_TIER_31 (10) + #define MVE_OPT_LEVEL_H265_MAIN_TIER_4 (11) + #define MVE_OPT_LEVEL_H265_HIGH_TIER_4 (12) + #define MVE_OPT_LEVEL_H265_MAIN_TIER_41 (13) + #define MVE_OPT_LEVEL_H265_HIGH_TIER_41 (14) + #define MVE_OPT_LEVEL_H265_MAIN_TIER_5 (15) + #define MVE_OPT_LEVEL_H265_HIGH_TIER_5 (16) + #define MVE_OPT_LEVEL_H265_MAIN_TIER_51 (17) + #define MVE_OPT_LEVEL_H265_HIGH_TIER_51 (18) + #define MVE_OPT_LEVEL_H265_MAIN_TIER_52 (19) + #define MVE_OPT_LEVEL_H265_HIGH_TIER_52 (20) + #define MVE_OPT_LEVEL_H265_MAIN_TIER_6 (21) + #define MVE_OPT_LEVEL_H265_HIGH_TIER_6 (22) + #define MVE_OPT_LEVEL_H265_MAIN_TIER_61 (23) + #define MVE_OPT_LEVEL_H265_HIGH_TIER_61 (24) + #define MVE_OPT_LEVEL_H265_MAIN_TIER_62 (25) + #define MVE_OPT_LEVEL_H265_HIGH_TIER_62 (26) + } profile_level; + struct + { + int32_t mv_search_range_x; + int32_t mv_search_range_y; + } motion_vector_search_range; + struct + { + uint32_t type; + #define MVE_OPT_HUFFMAN_TABLE_DC_LUMA (1) + #define MVE_OPT_HUFFMAN_TABLE_AC_LUMA (2) + #define MVE_OPT_HUFFMAN_TABLE_DC_CHROMA (3) + #define MVE_OPT_HUFFMAN_TABLE_AC_CHROMA (4) + uint8_t number_of_huffman_of_code_length[ 16 ]; + uint8_t table[ 162 ]; /* 12 are used for DC, 162 for AC */ + } huffman_table; + struct + { + uint32_t type; + #define MVE_OPT_QUANT_TABLE_LUMA (1) + #define MVE_OPT_QUANT_TABLE_CHROMA (2) + uint8_t matrix[ 64 ]; + } quant_table; + struct + { + uint32_t qscale; + uint32_t qscale_luma; + uint32_t qscale_chroma; + uint32_t fps; + uint32_t change_pos; + } jpeg_rate_control; //MVE_ENC_RC_JPEG + struct + { + /* For HEVC, tile_cols must be zero. For VP9, tile_rows + * and tile_cols must be powers of 2. */ + uint16_t tile_rows; + uint16_t tile_cols; + } tiles; + struct + { + uint16_t luma_bitdepth; + uint16_t chroma_bitdepth; + } bitdepth; + struct + { + /* Scale factors, and their square roots, for the lambda + * coefficients used by the encoder, in unsigned Q8 fixed-point + * format. Default (no scaling) is 1.0 (so 0x0100 in hex). + */ + uint16_t lambda_scale_i_q8; + uint16_t lambda_scale_sqrt_i_q8; + uint16_t lambda_scale_p_q8; + uint16_t lambda_scale_sqrt_p_q8; + uint16_t lambda_scale_b_ref_q8; + uint16_t lambda_scale_sqrt_b_ref_q8; + uint16_t lambda_scale_b_nonref_q8; + uint16_t lambda_scale_sqrt_b_nonref_q8; + } lambda_scale; + /* ARBITRARY_DOWNSCALE */ + struct + { + uint16_t width; + uint16_t height; + } downscaled_frame; + struct + { + uint32_t mode; + } dsl_pos; + struct + { + int16_t coef[3][3]; //coef[Y|U|V][R|G|B] + uint16_t offset[3]; + } yuv2rgb_params; + struct + { + uint8_t rgb2yuv_mode; + int16_t coef[3 * 3]; //coef[Y|U|V][R|G|B] + uint8_t luma_range[2]; + uint8_t chroma_range[2]; + uint8_t rgb_range[2]; + } rgb2yuv_params; + struct + { + uint16_t value; + } gray_uv_value; + struct + { + uint16_t mode; + } interp_mode; + struct + { + uint8_t crop_en; + /* left start x of luma in original image */ + uint16_t x; //included + /* top start y of luma in original image */ + uint16_t y; //included + /* cropped width of luma in original image */ + uint16_t width; + /* cropped height of luma in original image */ + uint16_t height; + } enc_src_crop; + + struct + { + uint8_t crop_en; + /* left start x of luma in original image */ + uint16_t x; //included + /* top start y of luma in original image */ + uint16_t y; //included + /* cropped width of luma in original image */ + uint16_t width; + /* cropped height of luma in original image */ + uint16_t height; + } dec_dst_crop; //ENABLE_DST_CROP + } data; +}; + +struct mve_request_release_ref_frame +{ + /* Decode only: For a frame buffer that MVE has returned + * marked as _REF_FRAME, the host can send this message + * to ask the MVE to release the buffer as soon as it is + * no longer used as reference anymore. (Otherwise, in + * normal operation, the host would re-enqueue the buffer + * to the MVE when it has been displayed and can be over- + * written with a new frame.) + * + * Note: When a frame is no longer used as reference depends + * on the stream being decoded, and there is no way to + * guarantee a short response time, the response may not + * come until the end of the stream. + */ + uint32_t buffer_address; +}; + + + + + + + + + + + + + + +/********************************************************************* + * + * RESPONSEs are messages from the host to the firmware + * + * Some of the MVE_RESPONSE_CODE_ codes are followed by one of the + * structs below. + * + *********************************************************************/ + +/* Sent when firmware has booted. + */ +struct mve_response_switched_in +{ + uint32_t core; +}; + +/* Sent when last core in a session has switched out. + */ +struct mve_response_switched_out +{ + uint32_t core; + uint32_t reason; + uint32_t sub_reason; +}; + +/* Response confirming state transition after either GO or STOP + * command from host. + */ +struct mve_response_state_change +{ + uint32_t new_state; + #define MVE_STATE_STOPPED (0) + #define MVE_STATE_RUNNING (2) +}; + +/* Message sent when the all cores in the session have dequeued a + * job from the firmware job queue. + */ +struct mve_response_job_dequeued +{ + uint32_t valid_job; +}; + +/* Fatal error message from firmware, if sent then no further + * operation is possible. + */ +struct mve_response_error +{ + uint32_t error_code; + #define MVE_ERROR_ABORT (1) + #define MVE_ERROR_OUT_OF_MEMORY (2) + #define MVE_ERROR_ASSERT (3) + #define MVE_ERROR_UNSUPPORTED (4) + #define MVE_ERROR_INVALID_BUFFER (6) + #define MVE_ERROR_INVALID_STATE (8) + #define MVE_ERROR_WATCHDOG (9) + + #define MVE_MAX_ERROR_MESSAGE_SIZE (128) + char message[ MVE_MAX_ERROR_MESSAGE_SIZE ]; +}; + +/* When a set-option succeeds, a confirmation message is + * sent, including the index-code for that particular option. + */ +struct mve_response_set_option_confirm +{ + uint32_t index; /* Same as 'index' in struct mve_request_set_option */ +}; + +/* If a set-option request fails, this message is returned. + * This is not a fatal error. The set-option had no effect, + * and the session is still alive. + * For example, trying to set an option with a too large + * or small parameter would result in this message. + * The included text string is meant for development and + * debugging purposes only. + * (When a set-option succeeds the set-option-confirm + * message code is sent instead.) + */ +struct mve_response_set_option_fail +{ + uint32_t index; /* Same as 'index' in struct mve_request_set_option */ + char message[ MVE_MAX_ERROR_MESSAGE_SIZE ]; +}; + +/* Decode only: This message is sent from MVE to the host so that it can + * allocate large enough output buffers. Output buffers that are to small + * will be returned to the host marked as 'rejected'. + */ +struct mve_response_frame_alloc_parameters +{ + /* Please note that the below information is a hint + * for what buffers to allocate, it does not say + * what actual resolution an output picture has. + */ + + /* To use if allocating PLANAR YUV output buffers: */ + uint16_t planar_alloc_frame_width; + uint16_t planar_alloc_frame_height; + + /* To use if allocating AFBC output buffers + * (if interlace, each field needs this size): + */ + uint32_t afbc_alloc_bytes; + + /* For situations where downscaled AFBC is supported, + * this number of bytes is needed for the downscaled frame. + */ + uint32_t afbc_alloc_bytes_downscaled; + + /* When the host allocates an AFBC frame buffer, it should normally set + * the the afbc_width_in_superblocks to be at least this recommended value. + * Buffers with smaller values are likely to be returned rejected by the MVE. + * See also comments above for afbc_alloc_bytes and + * afbc_alloc_bytes_downscaled, they describe the situations where the + * different values are used. + */ + uint16_t afbc_width_in_superblocks; + uint16_t afbc_width_in_superblocks_downscaled; + + /* For PLANAR YUV output, every plane's address need to be adjusted to get + * optimal AXI bursts when the pixel data is written, the values below may + * be used to calculate address offsets. + */ + uint16_t cropx; + uint16_t cropy; + + uint32_t mbinfo_alloc_bytes; /* Only for debugging */ + + + /* downscaled frame width/height for decode */ + /* ARBITRARY_DOWNSCALE */ + uint16_t dsl_frame_width; + uint16_t dsl_frame_height; + uint16_t dsl_pos_mode; + uint8_t ctu_size; /* EXPORT_SEQ_INFO */ + /* ENABLE_DST_CROP*/ + uint16_t dst_crop_x; + uint16_t dst_crop_y; + uint16_t dst_crop_width; + uint16_t dst_crop_height; +}; + +/* Decode only: This message is sent from MVE to the host so that it can + * allocate suitable output buffers. The needed size of the buffer is sent + * in a separate message (above). + * When MVE sends the message below, it enters a waiting-state and will not + * make any progress until the host sends an output-flush command, upon + * which MVE will return all output buffers, followed by a message saying + * that the output has been flushed. Only then should the host start + * enqueueing new output buffers. + */ +struct mve_response_sequence_parameters +{ + /* Other stream parameters affecting buffer allocation, + * any change in these values will trigger a flush. + */ + uint8_t interlace; /* 0 or 1 */ + uint8_t chroma_format; + #define MVE_CHROMA_FORMAT_MONO (0x0) + #define MVE_CHROMA_FORMAT_420 (0x1) + #define MVE_CHROMA_FORMAT_422 (0x2) + #define MVE_CHROMA_FORMAT_440 (0x3) + #define MVE_CHROMA_FORMAT_ARGB (0x4) + #define MVE_CHROMA_FORMAT_RGB (0x5) + #define MVE_CHROMA_FORMAT_444 (0x6) + #define MVE_CHROMA_FORMAT_OSD_ARGB (0x7) + + uint8_t bitdepth_luma; /* 8, 9 or 10 */ + uint8_t bitdepth_chroma; /* 8, 9 or 10 */ + uint8_t num_buffers_planar; /* number of planar buffers needed */ + uint8_t num_buffers_afbc; /* number of AFBC buffers needed, for + * AFBC output more buffers are needed + * (for planar output, the firmware + * will allocate extra memory via RPC) + */ + uint8_t range_mapping_enabled; /* VC-1 AP specific feature, if enabled + * then AFBC buffers may need special + * filtering before they can be + * displayed correctly. If the host is + * not able to do that, then planar output + * should be used, for which MVE + * automatically performs the filtering. + */ + uint8_t reserved0; +}; + +struct mve_response_ref_frame_unused +{ + /* Decode only: If requested by the host with the message + * MVE_REQUEST_CODE_RELEASE_REF_FRAME, the MVE will respond + * with this message when (if ever) the buffer is no longer + * used. + */ + uint32_t unused_buffer_address; +}; + + +/* This message is only for debugging and performance profiling. + * Is sent by the firmware if the corresponding options is enabled. + */ +struct mve_event_processed +{ + uint8_t pic_format; + uint8_t qp; + uint8_t pad0; + uint8_t pad1; + uint32_t parse_start_time; /* Timestamp, absolute time */ + uint32_t parse_end_time; /* Timestamp, absolute time */ + uint32_t parse_idle_time; /* Definition of idle here is waiting for in/out buffers or available RAM */ + + uint32_t pipe_start_time; /* Timestamp */ + uint32_t pipe_end_time; /* Timestamp, end-start = process time. Idle time while in a frame is + * not measured. */ + uint32_t pipe_idle_time; /* Always 0 in decode, */ + + uint32_t parser_coreid; /* Core used to parse this frame */ + uint32_t pipe_coreid; /* Core used to pipe this frame */ + + uint32_t bitstream_bits; /* Number of bitstream bits used for this frame. */ + + uint32_t intermediate_buffer_size; /* Size of intermediate (mbinfo/residuals) buffer after this frame was + * parsed. */ + uint32_t total_memory_allocated; /* after the frame was parsed. Including reference frames. */ + + uint32_t bus_read_bytes; /* bus read bytes */ + uint32_t bus_write_bytes; /* bus written bytes */ + + uint32_t afbc_bytes; /* afbc data transferred */ + + uint32_t slice0_end_time; /* Timestamp, absolute time */ + uint32_t stream_start_time; /* Timestamp, absolute stream start time */ + uint32_t stream_open_time; /* Timestamp, absolute stream open time */ +}; + +/* This message is only for debugging, is sent by the + * firmware if the corresponding option is enabled. + */ +struct mve_event_ref_frame +{ + uint32_t ref_addr; /* MVE virtual address of AFBC reference frame */ + uint32_t ref_width; /* Width of display area in luma pixels */ + uint32_t ref_height; /* Height of display area in luma pixels */ + uint32_t ref_mb_width; /* Width in macroblocks */ + uint32_t ref_mb_height; /* Height in macroblocks */ + uint32_t ref_left_crop; /* Left crop in luma pixels */ + uint32_t ref_top_crop; /* Top crop in luma pixels */ + uint32_t ref_frame_size; /* Total AFBC frame size in bytes */ + uint32_t ref_display_order; + uint16_t bit_width; /* bit width of the YUV either 8 or 10 */ + uint16_t tiled_headers; /* AFBC format is tiled */ +}; + +/* This message is only for debugging, is sent by the firmware if event tracing + * is enabled. + */ +struct mve_event_trace_buffers +{ + uint16_t reserved; + uint8_t num_cores; + uint8_t rasc_mask; + #define MVE_MAX_TRACE_BUFFERS 40 + /* this array will contain one buffer per rasc in rasc_mask per num_core */ + struct + { + uint32_t rasc_addr; /* rasc address of the buffer */ + uint32_t size; /* size of the buffer in bytes */ + } buffers[MVE_MAX_TRACE_BUFFERS]; +}; + +/* 'Events' are informative messages, the host is not required to react in + * any particular way. + */ +struct mve_response_event +{ + uint32_t event_code; + #define MVE_EVENT_ERROR_STREAM_CORRUPT (1) /* message, text string */ + #define MVE_EVENT_ERROR_STREAM_NOT_SUPPORTED (2) /* message, text string */ + #define MVE_EVENT_PROCESSED (3) /* struct mve_event_processed */ + #define MVE_EVENT_REF_FRAME (4) /* struct mve_event_ref_frame */ + #define MVE_EVENT_TRACE_BUFFERS (5) /* struct mve_event_trace_buffers */ + union + { + struct mve_event_processed event_processed; + struct mve_event_ref_frame event_ref_frame; + struct mve_event_trace_buffers event_trace_buffers; + char message[ MVE_MAX_ERROR_MESSAGE_SIZE ]; + } event_data; +}__attribute__((packed)); + + + + + + + + + + + + + + + + +/********************************************************************* + * + * BUFFERs are sent both ways, from host to firmware and back again + * + * Each MVE_BUFFER_CODE_ code is followed by one of the structs + * below. + * + *********************************************************************/ + +/* Flags in mve_buffer_frame::frame_flags: + * Set by whom? Meaning: + * DECODE: ENCODE: + * MVE_BUFFER_FRAME_FLAG_INTERLACE host - Buffer is interlaced (both top and + * bottom fields are allocated) + * MVE_BUFFER_FRAME_FLAG_BOT_FIRST fw - Bottom field should be displayed + * first (only if interlaced) + * MVE_BUFFER_FRAME_FLAG_TOP_PRESENT fw host Top field present (or full frame if + * not interlaced) + * MVE_BUFFER_FRAME_FLAG_BOT_PRESENT fw - Bottom present (only if interlaced) + * + * MVE_BUFFER_FRAME_FLAG_ROTATION_* host host Decode: MVE will rotate the output frame + * according to this setting. + * Encode: MVE will rotate the input frame + * according to this setting before + * encoding them. + * MVE_BUFFER_FRAME_FLAG_SCALING_MASK host - Output pictures should be downscaled + * + * MVE_BUFFER_FRAME_FLAG_MIRROR_* - host Input frame should be mirrored before encoding + * + * MVE_BUFFER_FRAME_FLAG_REJECTED fw - Buffer was too small, host should re-allocate + * + * MVE_BUFFER_FRAME_FLAG_CORRUPT fw - Frame contains visual corruption + * + * MVE_BUFFER_FRAME_FLAG_DECODE_ONLY fw - Frame should not be displayed + * + * MVE_BUFFER_FRAME_FLAG_REF_FRAME fw - Frame is used by MVE as reference, host must + * not change, just re-enqueue when displayed + * MVE_BUFFER_FRAME_FLAG_EOS fw host This is the last frame in the stream. + */ + +/* mve_buffer_frame_planar stores uncompressed YUV pictures. + * ________________________________________ + * | ^ | | ^ + * |<-:--visible_frame_width---->| | : + * | : | | : + * | : | | : + * | visible_frame_height | | max_frame_height + * | : | | : + * | : | | : + * |__v__________________________| | : + * | | : + * |<-------------max_frame_width---------->| : + * |________________________________________| v + * + */ +struct mve_buffer_frame_planar +{ + /* Y,Cb,Cr top field */ + uint32_t plane_top[ 3 ]; + + /* Y,Cb,Cr bottom field (interlace only) */ + uint32_t plane_bot[ 3 ]; + + /* Stride between rows, in bytes */ + int32_t stride[ 3 ]; + + /* Size of largest frame allowed to put in this buffer */ + uint16_t max_frame_width; + uint16_t max_frame_height; + +}; + +/* mve_buffer_frame_afbc stores AFBC compressed content that is also used + * as the reference frame. Out of loop processing (crop, rotation, + * range reduction) must be supported by the user of this buffer and + * the parameters are signaled within the buffer descriptor below. + * ________________________________________ + * | ^ | + * | cropy | + * | v_____________________________ | + * |<-cropx->| ^ || + * | |<-:--visible_frame_width---->|| + * | | : || + * | | : || + * | | visible_frame_height || + * | | : || + * | | : || + * | |__v__________________________|| + * |________________________________________| + * + * <----- superblock_width ---------------> + * * afbc_width_in_superblocks + * + * Note that the sizes and cropping values need not be multiples of 16. + * + * For interlaced streams, the values refer to a full frame, + * while the output is actually separated into fields. Thus for fields, + * cropy and visible_frame_height should be divided by two. + * + * For dual-downscaled AFBC output (not supported for interlace), + * then the cropx, cropy, visible_frame_width and visible_frame_height + * should be divided by two for the downscaled plane. + */ +struct mve_buffer_frame_afbc +{ + uint32_t plane[ 2 ]; /* Addresses for up to two AFBC planes: + * Top and bottom fields for interlace, + * or standard and optional downscaled output. */ + uint32_t alloc_bytes[ 2 ]; /* Size of allocation for each plane */ + uint16_t cropx; /* Luma x crop */ + uint16_t cropy; /* Luma y crop */ + uint16_t afbc_width_in_superblocks[ 2 ]; /* Width of AFBC frame buffer, in units + * of superblock width (32 or 16). + * If dual-downscaled output is chosen, + * this width can be different for the + * two planes. + * For first plane: + * (cropx + frame_width) + * <= superblock_width * afbc_width... + */ + uint32_t afbc_params; /* AFBC parameters */ + #define MVE_BUFFER_FRAME_AFBC_TILED_BODY (0x00000001) /* Output body blocks should be tiled */ + #define MVE_BUFFER_FRAME_AFBC_TILED_HEADER (0x00000002) /* Output headers should be tiled */ + #define MVE_BUFFER_FRAME_AFBC_32X8_SUPERBLOCK (0x00000004) /* Super block is 32x8, default is 16x16, + * (only supported as input for encode) */ + #define MVE_BUFFER_FRAME_AFBC_DN_FORCE_8BIT (0x00000008) /* For downscaled AFBC plane: It shall + * be 8-bit, even if full-scale is 10-bit */ + #define MVE_BUFFER_FRAME_AFBC_DN_FORCE_420 (0x00000010) /* For downscaled AFBC plane: It shall + * be 4:2:0, even if full-scale is 4:2:2 */ + #define MVE_BUFFER_FRAME_AFBC_STRIDE_SET_BY_MVE (0x00000020) /* Decode only: By default, the host should + set the afbc_width_in_superblocks. If the + value is zero, or if this bit is set, then + the MVE sets an appropriate value. */ + +}; + +/* output from encoder, encoder statistics. + * buffer parameter to a buffer of this encoder statistics + * this struct indicates each size of statistics. + */ + +struct mve_buffer_param_enc_stats +{ + uint32_t mms_buffer_size; + uint32_t bitcost_buffer_size; + uint32_t qp_buffer_size; + uint32_t flags; + //ENC_STATS_FLAGS + #define MVE_BUFFER_ENC_STATS_FLAG_MMS (1<<0) + #define MVE_BUFFER_ENC_STATS_FLAG_BITCOST (1<<1) + #define MVE_BUFFER_ENC_STATS_FLAG_QP (1<<2) + #define MVE_BUFFER_ENC_STATS_FLAG_DROP (1<<3) + uint16_t stats_mb_width; + uint16_t stats_mb_height; +}; + +/* + * The FRAME buffer stores the common information for PLANAR and AFBC buffers, + * and a union of PLANAR and AFBC specific information. + */ +struct mve_buffer_frame +{ + /* For identification of the buffer, this is not changed by + * the firmware. */ + uint64_t host_handle; + + /* For matching input buffer with output buffers, the firmware + * copies these values between frame buffers and bitstream buffers. */ + uint64_t user_data_tag; + + /* Frame buffer flags, see commentary above */ + uint32_t frame_flags; + #define MVE_BUFFER_FRAME_FLAG_INTERLACE (0x00000001) + #define MVE_BUFFER_FRAME_FLAG_BOT_FIRST (0x00000002) + #define MVE_BUFFER_FRAME_FLAG_TOP_PRESENT (0x00000004) + #define MVE_BUFFER_FRAME_FLAG_BOT_PRESENT (0x00000008) + #define MVE_BUFFER_FRAME_FLAG_ROTATION_90 (0x00000010) + #define MVE_BUFFER_FRAME_FLAG_ROTATION_180 (0x00000020) + #define MVE_BUFFER_FRAME_FLAG_ROTATION_270 (0x00000030) + #define MVE_BUFFER_FRAME_FLAG_SCALING_MASK (0x000000C0) + #define MVE_BUFFER_FRAME_FLAG_MIRROR_HORI (0x00000100) + #define MVE_BUFFER_FRAME_FLAG_MIRROR_VERT (0x00000200) + #define MVE_BUFFER_FRAME_FLAG_FORCE_IDR (0x00000400) + #define MVE_BUFFER_FRAME_FLAG_RESET_GOP (0x00000800) + #define MVE_BUFFER_FRAME_FLAG_REJECTED (0x00001000) + #define MVE_BUFFER_FRAME_FLAG_CORRUPT (0x00002000) + #define MVE_BUFFER_FRAME_FLAG_DECODE_ONLY (0x00004000) + #define MVE_BUFFER_FRAME_FLAG_REF_FRAME (0x00008000) + #define MVE_BUFFER_FRAME_FLAG_EOS (0x00010000) + #define MVE_BUFFER_FRAME_FLAG_RESET_LTR_PEROID (0x00020000) + /*ARBITRARY_DOWNSCALE*/ + #define MVE_BUFFER_FRAME_FLAG_SCALING_MASKX (0xFF000000) //8bit + #define MVE_BUFFER_FRAME_FLAG_SCALING_MASKY (0x00FE0000) //7bit + + /* Height (in luma samples) of visible part of frame, + * may be smaller than allocated frame size. */ + uint16_t visible_frame_height; + + /* Width (in luma samples) of visible part of frame, + * may be smaller than allocated frame size. */ + uint16_t visible_frame_width; + + /* Color format of buffer */ + uint16_t format; + /* format bitfield: */ + #define MVE_FORMAT_BF_C (0) /* 3 bits, chroma subsampling */ + #define MVE_FORMAT_BF_B (4) /* 4 bits, max bitdepth minus 8 */ + #define MVE_FORMAT_BF_N (8) /* 2 bits, number of planes */ + #define MVE_FORMAT_BF_V (12) /* 2 bits, format variant */ + #define MVE_FORMAT_BF_A (15) /* 1 bit, AFBC bit */ + /* formats: */ + #define MVE_FORMAT_YUV420_AFBC_8 ( (MVE_CHROMA_FORMAT_420 << MVE_FORMAT_BF_C) | \ + ( ( 8 - 8) << MVE_FORMAT_BF_B) | \ + ( 1 << MVE_FORMAT_BF_A) ) + + #define MVE_FORMAT_YUV420_AFBC_10 ( (MVE_CHROMA_FORMAT_420 << MVE_FORMAT_BF_C) | \ + ( (10 - 8) << MVE_FORMAT_BF_B) | \ + ( 1 << MVE_FORMAT_BF_A) ) + + #define MVE_FORMAT_YUV422_AFBC_8 ( (MVE_CHROMA_FORMAT_422 << MVE_FORMAT_BF_C) | \ + ( ( 8 - 8) << MVE_FORMAT_BF_B) | \ + ( 1 << MVE_FORMAT_BF_A) ) + + #define MVE_FORMAT_YUV422_AFBC_10 ( (MVE_CHROMA_FORMAT_422 << MVE_FORMAT_BF_C) | \ + ( (10 - 8) << MVE_FORMAT_BF_B) | \ + ( 1 << MVE_FORMAT_BF_A) ) + + #define MVE_FORMAT_YUV420_I420 ( (MVE_CHROMA_FORMAT_420 << MVE_FORMAT_BF_C) | \ + ( ( 8 - 8) << MVE_FORMAT_BF_B) | \ + ( 3 << MVE_FORMAT_BF_N) | \ + ( 0 << MVE_FORMAT_BF_V) ) + + #define MVE_FORMAT_YUV420_I420_10 ( (MVE_CHROMA_FORMAT_420 << MVE_FORMAT_BF_C) | \ + ( ( 10 - 8) << MVE_FORMAT_BF_B) | \ + ( 3 << MVE_FORMAT_BF_N) | \ + ( 0 << MVE_FORMAT_BF_V) ) + + #define MVE_FORMAT_YUV420_NV12 ( (MVE_CHROMA_FORMAT_420 << MVE_FORMAT_BF_C) | \ + ( ( 8 - 8) << MVE_FORMAT_BF_B) | \ + ( 2 << MVE_FORMAT_BF_N) | \ + ( 0 << MVE_FORMAT_BF_V) ) + + #define MVE_FORMAT_YUV420_NV21 ( (MVE_CHROMA_FORMAT_420 << MVE_FORMAT_BF_C) | \ + ( ( 8 - 8) << MVE_FORMAT_BF_B) | \ + ( 2 << MVE_FORMAT_BF_N) | \ + ( 1 << MVE_FORMAT_BF_V) ) + + #define MVE_FORMAT_YUV420_P010 ( (MVE_CHROMA_FORMAT_420 << MVE_FORMAT_BF_C) | \ + ( (16 - 8) << MVE_FORMAT_BF_B) | \ + ( 2 << MVE_FORMAT_BF_N) | \ + ( 0 << MVE_FORMAT_BF_V) ) + + #define MVE_FORMAT_YUV420_2P_10 ( (MVE_CHROMA_FORMAT_420 << MVE_FORMAT_BF_C) | \ + ( (10 - 8) << MVE_FORMAT_BF_B) | \ + ( 2 << MVE_FORMAT_BF_N) | \ + ( 0 << MVE_FORMAT_BF_V) ) + + #define MVE_FORMAT_YUV420_Y0L2 ( (MVE_CHROMA_FORMAT_420 << MVE_FORMAT_BF_C) | \ + ( (10 - 8) << MVE_FORMAT_BF_B) | \ + ( 1 << MVE_FORMAT_BF_N) | \ + ( 0 << MVE_FORMAT_BF_V) ) + + #define MVE_FORMAT_YUV420_AQB1 ( (MVE_CHROMA_FORMAT_420 << MVE_FORMAT_BF_C) | \ + ( (10 - 8) << MVE_FORMAT_BF_B) | \ + ( 1 << MVE_FORMAT_BF_N) | \ + ( 1 << MVE_FORMAT_BF_V) ) + + #define MVE_FORMAT_YUV422_YUY2 ( (MVE_CHROMA_FORMAT_422 << MVE_FORMAT_BF_C) | \ + ( ( 8 - 8) << MVE_FORMAT_BF_B) | \ + ( 1 << MVE_FORMAT_BF_N) | \ + ( 0 << MVE_FORMAT_BF_V) ) + + #define MVE_FORMAT_YUV422_UYVY ( (MVE_CHROMA_FORMAT_422 << MVE_FORMAT_BF_C) | \ + ( ( 8 - 8) << MVE_FORMAT_BF_B) | \ + ( 1 << MVE_FORMAT_BF_N) | \ + ( 1 << MVE_FORMAT_BF_V) ) + + #define MVE_FORMAT_YUV422_Y210 ( (MVE_CHROMA_FORMAT_422 << MVE_FORMAT_BF_C) | \ + ( (16 - 8) << MVE_FORMAT_BF_B) | \ + ( 1 << MVE_FORMAT_BF_N) | \ + ( 0 << MVE_FORMAT_BF_V) ) + + #define MVE_FORMAT_YUV422_1P_10 ( (MVE_CHROMA_FORMAT_422 << MVE_FORMAT_BF_C) | \ + ( (10 - 8) << MVE_FORMAT_BF_B) | \ + ( 1 << MVE_FORMAT_BF_N) | \ + ( 0 << MVE_FORMAT_BF_V) ) + + #define MVE_FORMAT_RGBA_8888 ( (MVE_CHROMA_FORMAT_ARGB << MVE_FORMAT_BF_C) | \ + ( ( 8 - 8) << MVE_FORMAT_BF_B) | \ + ( 1 << MVE_FORMAT_BF_N) | \ + ( 0 << MVE_FORMAT_BF_V) ) + + #define MVE_FORMAT_BGRA_8888 ( (MVE_CHROMA_FORMAT_ARGB << MVE_FORMAT_BF_C) | \ + ( ( 8 - 8) << MVE_FORMAT_BF_B) | \ + ( 1 << MVE_FORMAT_BF_N) | \ + ( 1 << MVE_FORMAT_BF_V) ) + + #define MVE_FORMAT_ARGB_8888 ( (MVE_CHROMA_FORMAT_ARGB << MVE_FORMAT_BF_C) | \ + ( ( 8 - 8) << MVE_FORMAT_BF_B) | \ + ( 1 << MVE_FORMAT_BF_N) | \ + ( 2 << MVE_FORMAT_BF_V) ) + + #define MVE_FORMAT_ABGR_8888 ( (MVE_CHROMA_FORMAT_ARGB << MVE_FORMAT_BF_C) | \ + ( ( 8 - 8) << MVE_FORMAT_BF_B) | \ + ( 1 << MVE_FORMAT_BF_N) | \ + ( 3 << MVE_FORMAT_BF_V) ) + #define MVE_FORMAT_Y ( (MVE_CHROMA_FORMAT_MONO << MVE_FORMAT_BF_C) | \ + ( ( 8 - 8) << MVE_FORMAT_BF_B) | \ + ( 1 << MVE_FORMAT_BF_N) | \ + ( 0 << MVE_FORMAT_BF_V) ) + #define MVE_FORMAT_Y_10 ( (MVE_CHROMA_FORMAT_MONO << MVE_FORMAT_BF_C) | \ + ( ( 10 - 8) << MVE_FORMAT_BF_B) | \ + ( 1 << MVE_FORMAT_BF_N) | \ + ( 0 << MVE_FORMAT_BF_V) ) + + #define MVE_FORMAT_RGB_888 ( (MVE_CHROMA_FORMAT_RGB << MVE_FORMAT_BF_C) | \ + ( ( 8 - 8) << MVE_FORMAT_BF_B) | \ + ( 1 << MVE_FORMAT_BF_N) | \ + ( 0 << MVE_FORMAT_BF_V) ) + + #define MVE_FORMAT_BGR_888 ( (MVE_CHROMA_FORMAT_RGB << MVE_FORMAT_BF_C) | \ + ( ( 8 - 8) << MVE_FORMAT_BF_B) | \ + ( 1 << MVE_FORMAT_BF_N) | \ + ( 1 << MVE_FORMAT_BF_V) ) + + #define MVE_FORMAT_RGB_3P ( (MVE_CHROMA_FORMAT_RGB << MVE_FORMAT_BF_C) | \ + ( ( 8 - 8) << MVE_FORMAT_BF_B) | \ + ( 3 << MVE_FORMAT_BF_N) | \ + ( 0 << MVE_FORMAT_BF_V) ) + #define MVE_FORMAT_YUV444 ( (MVE_CHROMA_FORMAT_444 << MVE_FORMAT_BF_C) | \ + ( ( 8 - 8) << MVE_FORMAT_BF_B) | \ + ( 3 << MVE_FORMAT_BF_N) | \ + ( 0 << MVE_FORMAT_BF_V) ) + #define MVE_FORMAT_YUV444_10 ( (MVE_CHROMA_FORMAT_444 << MVE_FORMAT_BF_C) | \ + ( ( 10 - 8) << MVE_FORMAT_BF_B) | \ + ( 3 << MVE_FORMAT_BF_N) | \ + ( 0 << MVE_FORMAT_BF_V) ) + #define MVE_FORMAT_ARGB_1555 ( (MVE_CHROMA_FORMAT_OSD_ARGB << MVE_FORMAT_BF_C) | \ + ( ( 8 - 8) << MVE_FORMAT_BF_B) | \ + ( 1 << MVE_FORMAT_BF_N) | \ + ( 0 << MVE_FORMAT_BF_V) ) + #define MVE_FORMAT_ARGB_4444 ( (MVE_CHROMA_FORMAT_OSD_ARGB << MVE_FORMAT_BF_C) | \ + ( ( 8 - 8) << MVE_FORMAT_BF_B) | \ + ( 1 << MVE_FORMAT_BF_N) | \ + ( 1 << MVE_FORMAT_BF_V) ) + #define MVE_FORMAT_RGB_565 ( (MVE_CHROMA_FORMAT_OSD_ARGB << MVE_FORMAT_BF_C) | \ + ( ( 8 - 8) << MVE_FORMAT_BF_B) | \ + ( 1 << MVE_FORMAT_BF_N) | \ + ( 2 << MVE_FORMAT_BF_V) ) + + #define MVE_FORMAT_MBINFO (0x0001) /* only used for debugging */ + + #define MVE_FORMAT_UNUSED (0x0000) + + //uint16_t reserved0; /* force 'data' to be 4-byte aligned */ + uint8_t frame_type; /* ADD_FRAME_TYPE_TO_PIC_JOB */ + uint8_t frame_flags_ext;/* add osd buffer tag to seperate osd & source */ + #define OSD1_TAG 0x80 /* use bit7 stand for osd_1 */ + #define OSD0_TAG 0x40 /* use bit6 stand for osd_1 */ + + union + { + struct mve_buffer_frame_planar planar; + struct mve_buffer_frame_afbc afbc; + } data; + + //uint32_t reserved1; /* force size to be multiple of 8 bytes */ + uint16_t mini_frame_y_start; + uint16_t mini_frame_y_end; +}; + +/* The bitstream buffer stores a number of bitstream bytes */ +struct mve_buffer_bitstream +{ + /* For identification of the buffer, this is not changed by + * the firmware. */ + uint64_t host_handle; + + /* For matching input buffer with output buffers, the firmware + * copies these values between frame buffers and bitstream buffers. */ + uint64_t user_data_tag; + + /* BufferFlags */ + uint32_t bitstream_flags; + #define MVE_BUFFER_BITSTREAM_FLAG_EOS (0x00000001) + #define MVE_BUFFER_BITSTREAM_FLAG_ENDOFFRAME (0x00000010) + #define MVE_BUFFER_BITSTREAM_FLAG_SYNCFRAME (0x00000020) + #define MVE_BUFFER_BITSTREAM_FLAG_CODECCONFIG (0x00000080) + #define MVE_BUFFER_BITSTREAM_FLAG_ENDOFSUBFRAME (0x00000400) + #define MVE_BUFFER_BITSTREAM_FLAG_ENC_STATS (0x00010000) + #define MVE_BUFFER_BITSTREAM_FLAG_BSEOF (0x00100000) + + /* Length of allocated buffer */ + uint32_t bitstream_alloc_bytes; + + /* Byte offset from start to first byte */ + uint32_t bitstream_offset; + + /* Number of bytes in the buffer */ + uint32_t bitstream_filled_len; + + /* Pointer to buffer start */ + uint32_t bitstream_buf_addr; + + /* frame_type. 0:I, 1:p, 2:B, 3:b */ + uint8_t frame_type; + #define MVE_FRAME_TYPE_I 0 + #define MVE_FRAME_TYPE_P 1 + #define MVE_FRAME_TYPE_B 2 // B frame + #define MVE_FRAME_TYPE_LOWER_B 3 // b frame + #define MVE_FRAME_TYPE_P_KEY 4 + #define MVE_FRAME_TYPE_NO_REF_P 5 // only svct3 + #define MVE_FRAME_TYPE_GDR 6 // GDR + + uint8_t src_transform; + #define MVE_SRC_TRANSFORM_NONE (0) // none src transform + #define MVE_SRC_TRANSFORM_R90 (1) // rotate 90 degrees + #define MVE_SRC_TRANSFORM_R180 (2) // rotate 180 degrees + #define MVE_SRC_TRANSFORM_R270 (3) // rotate 270 degrees + #define MVE_SRC_TRANSFORM_VFLIP (4) // vertical flip (no rotation) + #define MVE_SRC_TRANSFORM_R90_VFLIP (5) // rotate 90 degrees and vertical flip + #define MVE_SRC_TRANSFORM_R180_VFLIP (6) // rotate 180 degrees and vertical flip + #define MVE_SRC_TRANSFORM_R270_VFLIP (7) // rotate 270 degrees and vertical flip + + /* Pad to force 8-byte alignment */ + //uint32_t reserved; + uint16_t bitstream_remaining_kb; // remaining kbytes of bitstream not returned to host. +}; + +/* + * Define a region in 16x16 units + * + * The region is macroblock positions (x,y) in the range + * mbx_left <= x < mbx_right + * mby_top <= y < mby_bottom + */ +struct mve_buffer_param_region +{ + uint16_t mbx_left; /* macroblock x left edge (inclusive) */ + uint16_t mbx_right; /* macroblock x right edge (exclusive) */ + uint16_t mby_top; /* macroblock y top edge (inclusive) */ + uint16_t mby_bottom; /* macroblock y bottom edge (exclusive) */ + int16_t qp_delta; /* QP delta value for this region, this + * delta applies to QP values in the ranges: + * H264: 0-51 + * HEVC: 0-51 + * VP9: 0-255 */ + uint8_t prio; /* the priority of this region */ + uint8_t force_intra; /* force intra to this ROI region, refer to macro: FEATURE_SUPPORT_ROI_MISC */; +}; + +/* input for encoder, + * the mve_buffer_param_regions buffer stores the information for FRAME buffers, + * and the information for regions of interest. + */ +struct mve_buffer_param_regions +{ + uint8_t n_regions; /* Number of regions */ + uint8_t reserved[ 3 ]; + #define MVE_MAX_FRAME_REGIONS 16 + struct mve_buffer_param_region region[ MVE_MAX_FRAME_REGIONS ]; +}; + +/* the block parameter record specifies the various properties of a quad */ +struct mve_block_param_record +{ + uint32_t qp_delta; /* Bitset of four 4-bit QP delta values for a quad */ + #define MVE_BLOCK_PARAM_RECORD_QP_DELTA_TOP_LEFT_16X16 (0) + #define MVE_BLOCK_PARAM_RECORD_QP_DELTA_TOP_LEFT_16X16_SZ (6) + #define MVE_BLOCK_PARAM_RECORD_QP_DELTA_TOP_RIGHT_16X16 (6) + #define MVE_BLOCK_PARAM_RECORD_QP_DELTA_TOP_RIGHT_16X16_SZ (6) + #define MVE_BLOCK_PARAM_RECORD_QP_DELTA_BOT_LEFT_16X16 (12) + #define MVE_BLOCK_PARAM_RECORD_QP_DELTA_BOT_LEFT_16X16_SZ (6) + #define MVE_BLOCK_PARAM_RECORD_QP_DELTA_BOT_RIGHT_16X16 (18) + #define MVE_BLOCK_PARAM_RECORD_QP_DELTA_BOT_RIGHT_16X16_SZ (6) + #define MVE_BLOCK_PARAM_RECORD_QP_FORCE_FIELD (24) + #define MVE_BLOCK_PARAM_RECORD_QP_FORCE_FIELD_SZ (5) + #define MVE_BLOCK_PARAM_RECORD_QUAD_FORCE_INTRA (29) + #define MVE_BLOCK_PARAM_RECORD_QUAD_FORCE_INTRA_SZ (1) + #define MVE_BLOCK_PARAM_RECORD_QP_ABSOLUTE (30) + #define MVE_BLOCK_PARAM_RECORD_QP_ABSOLUTE_SZ (1) + #define MVE_BLOCK_PARAM_RECORD_QP_QUAD_SKIP (31) + #define MVE_BLOCK_PARAM_RECORD_QP_QUAD_SKIP_SZ (1) + + #define MVE_BLOCK_PARAM_RECORD_FORCE_NONE (0x00) + #define MVE_BLOCK_PARAM_RECORD_FORCE_QP (0x01) + uint32_t min_qp; + #define MVE_BLOCK_PARAM_RECORD_MIN_QP_TOP_LEFT_16X16 (0) + #define MVE_BLOCK_PARAM_RECORD_MIN_QP_TOP_LEFT_16X16_SZ (6) + #define MVE_BLOCK_PARAM_RECORD_MIN_QP_TOP_RIGHT_16X16 (6) + #define MVE_BLOCK_PARAM_RECORD_MIN_QP_TOP_RIGHT_16X16_SZ (6) + #define MVE_BLOCK_PARAM_RECORD_MIN_QP_BOT_LEFT_16X16 (12) + #define MVE_BLOCK_PARAM_RECORD_MIN_QP_BOT_LEFT_16X16_SZ (6) + #define MVE_BLOCK_PARAM_RECORD_MIN_QP_BOT_RIGHT_16X16 (18) + #define MVE_BLOCK_PARAM_RECORD_MIN_QP_BOT_RIGHT_16X16_SZ (6) + #define MVE_BLOCK_PARAM_RECORD_QUAD_SELECT_QP_DELTA (24) + #define MVE_BLOCK_PARAM_RECORD_QUAD_SELECT_QP_DELTA_SZ (1) +}; + +/* block configuration uncompressed rows header. this configures the size of the + * uncompressed body. */ +struct mve_buffer_general_rows_uncomp_hdr +{ + uint8_t n_cols_minus1; /* number of quad cols in picture minus 1 */ + uint8_t n_rows_minus1; /* number of quad rows in picture minus 1 */ + uint8_t reserved[2]; +}; + +/* block configuration uncompressed rows body. this structure contains an array + * of block parameter records whose length is (n_cols_minus1 + 1) * (n_rows_minus1 + 1) + * elements. therefore the allocation of this structure needs to be dynamic and + * a pointer to the allocated memory should then be assigned to the general + * purpose buffer data pointer + */ +struct mve_buffer_general_rows_uncomp_body +{ + /* the size of this array is variable and not necessarily equal to 1. + * therefore the sizeof operator should not be used + */ + struct mve_block_param_record bpr[1]; +}; + +/* input for encoder, block level configurations. + * the row based block configurations can be defined in different formats. they + * are stored in the blk_cfgs union and identified by the blk_cfg_type member. + * these definitions consist of a header and body pair. the header part contains + * configuration information for the body. the body part describes the actual + * layout of the data buffer pointed to by the mve_buffer_general_hdr buffer_ptr. + */ +struct mve_buffer_general_block_configs +{ + uint8_t blk_cfg_type; + #define MVE_BLOCK_CONFIGS_TYPE_NONE (0x00) + #define MVE_BLOCK_CONFIGS_TYPE_ROW_UNCOMP (0xff) + uint8_t reserved[3]; + union + { + struct mve_buffer_general_rows_uncomp_hdr rows_uncomp; + } blk_cfgs; +}; + + +/* input for encoder */ +struct mve_buffer_param_qp +{ + /* QP (quantization parameter) for encode. + * + * When used to set fixed QP for encode, with rate control + * disabled, then the valid ranges are: + * H264: 0-51 + * HEVC: 0-51 + * VP8: 0-63 + * VP9: 0-63 + * Note: The QP must be set separately for I, P and B frames. + * + * But when this message is used with the regions-feature, + * then the valid ranges are the internal bitstream ranges: + * H264: 0-51 + * HEVC: 0-51 + * VP8: 0-127 + * VP9: 0-255 + */ + int32_t qp; + int32_t epr_iframe_enable; +}; + +struct mve_reset_gop_dynamic +{ + uint32_t reset_gop_pframes; +}; + +struct mve_reset_ltr_peroid_dynamic +{ + uint32_t reset_ltr_peroid_pframes; +}; + +/* output from decoder */ +struct mve_buffer_param_display_size +{ + uint16_t display_width; + uint16_t display_height; +}; + +/* output from decoder, colour information needed for hdr */ +struct mve_buffer_param_colour_description +{ + uint32_t flags; + #define MVE_BUFFER_PARAM_COLOUR_FLAG_MASTERING_DISPLAY_DATA_VALID (1) + #define MVE_BUFFER_PARAM_COLOUR_FLAG_CONTENT_LIGHT_DATA_VALID (2) + + uint8_t range; /* Unspecified=0, Limited=1, Full=2 */ + #define MVE_BUFFER_PARAM_COLOUR_RANGE_UNSPECIFIED (0) + #define MVE_BUFFER_PARAM_COLOUR_RANGE_LIMITED (1) + #define MVE_BUFFER_PARAM_COLOUR_RANGE_FULL (2) + + uint8_t colour_primaries; /* see hevc spec. E.3.1 */ + uint8_t transfer_characteristics; /* see hevc spec. E.3.1 */ + uint8_t matrix_coeff; /* see hevc spec. E.3.1 */ + + uint16_t mastering_display_primaries_x[3]; /* see hevc spec. D.3.27 */ + uint16_t mastering_display_primaries_y[3]; /* see hevc spec. D.3.27 */ + uint16_t mastering_white_point_x; /* see hevc spec. D.3.27 */ + uint16_t mastering_white_point_y; /* see hevc spec. D.3.27 */ + uint32_t max_display_mastering_luminance; /* see hevc spec. D.3.27 */ + uint32_t min_display_mastering_luminance; /* see hevc spec. D.3.27 */ + + uint32_t max_content_light_level; /* see hevc spec. D.3.35 */ + uint32_t avg_content_light_level; /* see hevc spec. D.3.35 */ + + uint8_t video_format_present_flag; + uint8_t video_format; + uint8_t aspect_ratio_info_present_flag; + uint8_t aspect_ratio_idc; + uint8_t timing_flag_info_present_flag; + uint16_t sar_width; + uint16_t sar_height; + uint32_t num_units_in_tick; + uint32_t time_scale; + + uint8_t pad[7]; // pad for 8-byte alignment +}; + +struct mve_buffer_param_sei_user_data_unregistered +{ + uint8_t flags; + #define MVE_BUFFER_PARAM_USER_DATA_UNREGISTERED_VALID (1) + uint8_t uuid[16]; + char user_data[256 - 35]; + uint8_t user_data_len; + + uint8_t reserved[5]; +}; + +/* output from decoder see hevc spec. D.3.3 */ +struct mve_buffer_param_frame_field_info +{ + uint8_t pic_struct; + uint8_t source_scan_type; + uint8_t duplicate_flag; + uint8_t reserved; +}; + +/* output from decoder, VC-1 specific feature only relevant + * if using AFBC output + */ +struct mve_buffer_param_range_map +{ + uint8_t luma_map_enabled; + uint8_t luma_map_value; + uint8_t chroma_map_enabled; + uint8_t chroma_map_value; +}; + +/* input for encoder */ +struct mve_buffer_param_rate_control +{ + uint32_t rate_control_mode; + #define MVE_OPT_RATE_CONTROL_MODE_OFF (0) + #define MVE_OPT_RATE_CONTROL_MODE_STANDARD (1) + #define MVE_OPT_RATE_CONTROL_MODE_VARIABLE (2) + #define MVE_OPT_RATE_CONTROL_MODE_CONSTANT (3) + #define MVE_OPT_RATE_CONTROL_MODE_C_VARIABLE (4) + uint32_t target_bitrate; /* in bits per second */ + uint32_t maximum_bitrate; /* in bits per second */ +}; + +/* input for encoder */ +struct mve_buffer_param_rate_control_qp_range +{ + int32_t qp_min; + int32_t qp_max; +}; + +/* input for encoder, see hevc spec. D.3.16 */ +struct mve_buffer_param_frame_packing +{ + uint32_t flags; + #define MVE_BUFFER_PARAM_FRAME_PACKING_FLAG_QUINCUNX_SAMPLING (1) + #define MVE_BUFFER_PARAM_FRAME_PACKING_FLAG_SPATIAL_FLIPPING (2) + #define MVE_BUFFER_PARAM_FRAME_PACKING_FLAG_FRAME0_FLIPPED (4) + #define MVE_BUFFER_PARAM_FRAME_PACKING_FLAG_FIELD_VIEWS (8) + #define MVE_BUFFER_PARAM_FRAME_PACKING_FLAG_CURRENT_FRAME_IS_FRAME0 (16) + + uint8_t frame_packing_arrangement_type; + uint8_t content_interpretation_type; + + uint8_t frame0_grid_position_x; + uint8_t frame0_grid_position_y; + uint8_t frame1_grid_position_x; + uint8_t frame1_grid_position_y; + + uint8_t reserved[ 2 ]; +}; + +struct mve_buffer_param_rectangle +{ + uint16_t x_left; /* pixel x left edge (inclusive) */ + uint16_t x_right; /* pixel x right edge (exclusive) */ + uint16_t y_top; /* pixel y top edge (inclusive) */ + uint16_t y_bottom; /* pixel y bottom edge (exclusive) */ +}; + +/* input for encoder, + * indicate which parts of the source picture has changed. + * The encoder can (optionally) use this information to + * reduce memory bandwidth. + * + * n_rectangles=0 indicates the source picture is unchanged. + * + * This parameter only applies to the picture that immediately + * follows (and not to subsequent ones). + */ +struct mve_buffer_param_change_rectangles +{ + uint8_t n_rectangles; /* Number of rectangles */ + uint8_t reserved[3]; + #define MVE_MAX_FRAME_CHANGE_RECTANGLES 2 + struct mve_buffer_param_rectangle rectangles[MVE_MAX_FRAME_CHANGE_RECTANGLES]; +}; + +typedef struct mve_buffer_param_osd_cfg { + uint8_t osd_inside_enable; + uint8_t osd_inside_alpha_enable; + uint8_t osd_inside_convert_color_enable; + uint8_t osd_inside_alpha_value; /* as alpha range [0~16], use u8 */ + uint8_t osd_inside_convert_color_threshold;/* threshold range [0~255], if input is 10bit, th * 4 */ + uint8_t osd_inside_rgb2yuv_mode;/* 0-601L, 1-601F, 2-709_L, 3-709_F */ + uint16_t osd_inside_start_x; /* pixel x left edge (inclusive) */ + uint16_t osd_inside_start_y; /* pixel y top edge (inclusive) */ + uint16_t reserved[3]; +} t_mve_buffer_param_osd_cfg; + +struct mve_buffer_param_osd_rectangles { + #define MVE_MAX_FRAME_OSD_REGION 2 + t_mve_buffer_param_osd_cfg osd_single_cfg[MVE_MAX_FRAME_OSD_REGION]; +}; + + +/* Parameters that are sent in the same communication channels + * as the buffers. A parameter applies to all subsequent buffers. + * Some types are only valid for decode, and some only for encode. + */ +struct mve_buffer_param +{ + uint32_t type; /* Extra data: */ + #define MVE_BUFFER_PARAM_TYPE_QP (2) /* qp */ + #define MVE_BUFFER_PARAM_TYPE_REGIONS (3) /* regions */ + #define MVE_BUFFER_PARAM_TYPE_DISPLAY_SIZE (5) /* display_size */ + #define MVE_BUFFER_PARAM_TYPE_RANGE_MAP (6) /* range_map */ + #define MVE_BUFFER_PARAM_TYPE_FRAME_RATE (9) /* arg, in frames per second, as a + * fixed point Q16 value, for example + * 0x001e0000 == 30.0 fps */ + #define MVE_BUFFER_PARAM_TYPE_RATE_CONTROL (10) /* rate_control */ + #define MVE_BUFFER_PARAM_TYPE_QP_I (12) /* qp for I frames, when no rate control */ + #define MVE_BUFFER_PARAM_TYPE_QP_P (13) /* qp for P frames, when no rate control */ + #define MVE_BUFFER_PARAM_TYPE_QP_B (14) /* qp for B frames, when no rate control */ + #define MVE_BUFFER_PARAM_TYPE_COLOUR_DESCRIPTION (15) /* colour_description */ + #define MVE_BUFFER_PARAM_TYPE_FRAME_PACKING (16) /* frame_packing */ + #define MVE_BUFFER_PARAM_TYPE_FRAME_FIELD_INFO (17) /* frame_field_info */ + #define MVE_BUFFER_PARAM_TYPE_GOP_RESET (18) /* no extra data */ + #define MVE_BUFFER_PARAM_TYPE_DPB_HELD_FRAMES (19) /* arg, number of output buffers that are + * complete and held by firmware in the + * DPB for reordering purposes. + * Valid after the next frame is output */ + #define MVE_BUFFER_PARAM_TYPE_CHANGE_RECTANGLES (20) /* change rectangles */ + #define MVE_BUFFER_PARAM_TYPE_RATE_CONTROL_QP_RANGE (21) /* rate_control_qp_range */ + #define MVE_BUFFER_PARAM_TYPE_RATE_CONTROL_HRD_BUF_SIZE (23) /* arg */ + #define MVE_BUFFER_PARAM_TYPE_RATE_CONTROL_QP_RANGE_I (25) /* special range for I frames, + * rate_control_qp_range */ + #define MVE_BUFFER_PARAM_TYPE_SEI_USER_DATA_UNREGISTERED (26) /* sei user_data_unregistered */ + #define MVE_BUFFER_PARAM_TYPE_GOP_RESET_DYNAMIC (27) + #define MVE_BUFFER_PARAM_TYPE_GOP_RESET_LTR_PEROID_DYNAMIC (28) /* reset ltr peroid dynamiclly */ + #define MVE_BUFFER_PARAM_TYPE_ENC_STATS (29) /* encode stats */ + #define MVE_BUFFER_PARAM_TYPE_OSD_RECTANGLES (30) /* osd rectangles */ + #define MVE_BUFFER_PARAM_TYPE_RATE_CONTROL_CHANGE_POS (31) + + union + { + uint32_t arg; /* some parameters only need a uint32_t as argument */ + struct mve_buffer_param_qp qp; + struct mve_reset_gop_dynamic reset_gop_dynamic; + struct mve_reset_ltr_peroid_dynamic reset_ltr_peroid_dynamic; + struct mve_buffer_param_regions regions; + struct mve_buffer_param_display_size display_size; + struct mve_buffer_param_range_map range_map; + struct mve_buffer_param_rate_control rate_control; + struct mve_buffer_param_rate_control_qp_range rate_control_qp_range; + struct mve_buffer_param_colour_description colour_description; + struct mve_buffer_param_frame_packing frame_packing; + struct mve_buffer_param_frame_field_info frame_field_info; + struct mve_buffer_param_change_rectangles change_rectangles; + struct mve_buffer_param_sei_user_data_unregistered user_data_unregistered; + struct mve_buffer_param_enc_stats enc_stats; + struct mve_buffer_param_osd_rectangles osd_rectangles_buff; + } data; +}; + +/* output from decoder, assertive display statistics. + * buffer_ptr points to a buffer of luma quad average values for the picture + * that can be used as a thumbnail. the type of content used to generate the + * assertive display statistics is indicated by MVE_AD_STATS_PIC_FMT_INTERLACED. + * for progressive content; the arrangement is in raster format with dimensions + * thumbnail_width by thumbnail_height. the overall frame average luma and + * chroma values are returned in frame_average. + * for interlaced content; the arrangement is in raster format, top field + * followed by bottom field with each field having dimensions thumbnail_width by + * thumbnail_height. the field averages for luma and chroma values are combined + * and returned in an overall value for the frame (frame_average). + */ +struct mve_buffer_general_ad_stats +{ + + uint32_t frame_averages; + // bitfields + #define MVE_AD_STATS_PIC_AVGS_Y (0) + #define MVE_AD_STATS_PIC_AVGS_Y_SZ (12) + #define MVE_AD_STATS_PIC_AVGS_CB (12) + #define MVE_AD_STATS_PIC_AVGS_CB_SZ (10) + #define MVE_AD_STATS_PIC_AVGS_CR (22) + #define MVE_AD_STATS_PIC_AVGS_CR_SZ (10) + uint16_t thumbnail_width; + uint16_t thumbnail_height; + uint8_t ad_stats_flags; + #define MVE_AD_STATS_PIC_FMT_PROGRESSIVE (0) + #define MVE_AD_STATS_PIC_FMT_INTERLACED (1) + uint8_t reserved[3]; +}; + +/* The general purpose buffer header stores the common fields of an + * mve_buffer_general. it contains the pointer to the data buffer that contains + * the general purpose data + */ +struct mve_buffer_general_hdr +{ + /* For identification of the buffer, this is not changed by the firmware. */ + uint64_t host_handle; + + /* this depends upon the type of the general purpose buffer */ + uint64_t user_data_tag; + + /* pointer to the buffer containing the general purpose data. the format + * of this data is defined by the configuration in the mve_buffer_general */ + uint32_t buffer_ptr; + + /* size of the buffer pointed to by buffer_ptr */ + uint32_t buffer_size; + + /* selects the type of semantics to use for the general purpose buffer. it + * tags (or discriminates) the union config member in mve_buffer_general + */ + uint16_t type; /* Extra data: */ + #define MVE_BUFFER_GENERAL_TYPE_INVALID (0) /* invalid */ + #define MVE_BUFFER_GENERAL_TYPE_BLOCK_CONFIGS (1) /* block_configs */ + #define MVE_BUFFER_GENERAL_TYPE_AD_STATS (2) /* assertive display statistics */ + /* size of the mve_buffer_general config member */ + uint16_t config_size; + + /* pad to force 8-byte alignment */ + uint32_t reserved; +}; + +/* The general purpose buffer consists of a header and a configuration. The + * header contains a pointer to a buffer whose format is described by the + * configuration. The type of configuration is indicated by the type value in + * the header. N.B. In use, the size of the config part of this structure is + * defined in the header and is not necessarily equal to that returned by the + * sizeof() operator. This allows a more size efficient communication between + * the host and firmware. + */ +struct mve_buffer_general +{ + struct mve_buffer_general_hdr header; + + /* used to describe the configuration of the general purpose buffer data + * pointed to be buffer_ptr + */ + union + { + struct mve_buffer_general_block_configs block_configs; + struct mve_buffer_general_ad_stats ad_stats; + } config; +}; + +#ifdef __cplusplus +} +#endif + +#endif /* __FW_INCLUDE__MVE_PROTOCOL_DEF_H__ */ diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx-v4l2-controls.h b/src/little/linux/drivers/media/platform/canaan-vpu/mvx-v4l2-controls.h new file mode 100755 index 000000000..cb5700dcc --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx-v4l2-controls.h @@ -0,0 +1,737 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef _MVX_V4L2_CONTROLS_H_ +#define _MVX_V4L2_CONTROLS_H_ + +/**************************************************************************** + * Includes + ****************************************************************************/ + +#include +#include +#include +#include + +/**************************************************************************** + * Pixel formats + ****************************************************************************/ + +#define V4L2_PIX_FMT_YUV420_AFBC_8 v4l2_fourcc('Y', '0', 'A', '8') +#define V4L2_PIX_FMT_YUV420_AFBC_10 v4l2_fourcc('Y', '0', 'A', 'A') +#define V4L2_PIX_FMT_YUV422_AFBC_8 v4l2_fourcc('Y', '2', 'A', '8') +#define V4L2_PIX_FMT_YUV422_AFBC_10 v4l2_fourcc('Y', '2', 'A', 'A') +#define V4L2_PIX_FMT_AQB1 v4l2_fourcc('Y', '0', 'A', 'B') +#define V4L2_PIX_FMT_Y210 v4l2_fourcc('Y', '2', '1', '0') +#define V4L2_PIX_FMT_P010 v4l2_fourcc('Y', '0', 'P', '1') +#define V4L2_PIX_FMT_Y0L2 v4l2_fourcc('Y', '0', 'Y', 'L') +#define V4L2_PIX_FMT_RGB_3P v4l2_fourcc('R', 'G', 'B', 'M') + + +#define V4L2_PIX_FMT_Y10_LE v4l2_fourcc('Y', '1', '0', 'L') +#define V4L2_PIX_FMT_YUV444_10 v4l2_fourcc('Y', '4', 'P', '3') +#define V4L2_PIX_FMT_YUV422_1P_10 v4l2_fourcc('Y', '2', 'P', '1') +#define V4L2_PIX_FMT_YUV420_2P_10 v4l2_fourcc('Y', '0', 'P', '2') +#define V4L2_PIX_FMT_YUV420_I420_10 v4l2_fourcc('Y', '0', 'P', '3') + + +#define V4L2_PIX_FMT_RV v4l2_fourcc('R', 'V', '0', '0') + +#ifndef V4L2_PIX_FMT_HEVC +#define V4L2_PIX_FMT_HEVC v4l2_fourcc('H', 'E', 'V', 'C') +#endif + +#ifndef V4L2_PIX_FMT_VP9 +#define V4L2_PIX_FMT_VP9 v4l2_fourcc('V', 'P', '9', '0') +#endif + +#ifndef V4L2_PIX_FMT_AV1 +#define V4L2_PIX_FMT_AV1 v4l2_fourcc('A', 'V', '1', '0') +#endif + +#define V4L2_PIX_FMT_AVS v4l2_fourcc('A', 'V', 'S', '1') +#define V4L2_PIX_FMT_AVS2 v4l2_fourcc('A', 'V', 'S', '2') + +#ifndef V4L2_CID_MPEG_VIDEO_HEVC_MIN_QP +#define V4L2_CID_MPEG_VIDEO_HEVC_MIN_QP (V4L2_CID_MPEG_BASE + 600) +#endif +#ifndef V4L2_CID_MPEG_VIDEO_HEVC_MAX_QP +#define V4L2_CID_MPEG_VIDEO_HEVC_MAX_QP (V4L2_CID_MPEG_BASE + 601) +#endif +#ifndef V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_QP +#define V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_QP (V4L2_CID_MPEG_BASE + 602) +#endif +#ifndef V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_QP +#define V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_QP (V4L2_CID_MPEG_BASE + 603) +#endif +#ifndef V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QP +#define V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QP (V4L2_CID_MPEG_BASE + 604) +#endif +/**************************************************************************** + * Buffers + * @see v4l2_buffer + ****************************************************************************/ + +/* + * Extended buffer flags. + */ +/* +#define V4L2_BUF_FLAG_MVX_DECODE_ONLY 0x01000000 +#define V4L2_BUF_FLAG_MVX_CODEC_CONFIG 0x02000000 +#define V4L2_BUF_FLAG_MVX_AFBC_TILED_HEADERS 0x10000000 +#define V4L2_BUF_FLAG_MVX_AFBC_TILED_BODY 0x20000000 +#define V4L2_BUF_FLAG_MVX_AFBC_32X8_SUPERBLOCK 0x40000000 +#define V4L2_BUF_FLAG_MVX_MASK 0xff000000 +#define V4L2_BUF_FLAG_END_OF_SUB_FRAME 0x04000000 +#define V4L2_BUF_FLAG_MVX_BUFFER_FRAME_PRESENT 0x08000000 +#define V4L2_BUF_FLAG_MVX_BUFFER_NEED_REALLOC 0x07000000 + + +#define V4L2_BUF_FRAME_FLAG_ROTATION_90 0x81000000 +#define V4L2_BUF_FRAME_FLAG_ROTATION_180 0x82000000 +#define V4L2_BUF_FRAME_FLAG_ROTATION_270 0x83000000 +#define V4L2_BUF_FRAME_FLAG_ROTATION_MASK 0x83000000 +#define V4L2_BUF_FRAME_FLAG_MIRROR_HORI 0x90000000 +#define V4L2_BUF_FRAME_FLAG_MIRROR_VERT 0xA0000000 +#define V4L2_BUF_FRAME_FLAG_MIRROR_MASK 0xB0000000 +#define V4L2_BUF_FRAME_FLAG_SCALING_2 0x84000000 +#define V4L2_BUF_FRAME_FLAG_SCALING_4 0x88000000 +#define V4L2_BUF_FRAME_FLAG_SCALING_MASK 0x8C000000 + +#define V4L2_BUF_FLAG_MVX_BUFFER_EPR 0xC0000000 +#define V4L2_BUF_FLAG_MVX_BUFFER_ROI 0x70000000 +*/ +//redefine these flags +/*use encode/decode frame/bitstream to update these flags*/ + +#define V4L2_BUF_FLAG_MVX_MASK 0xfff00000 + +//for decode frame flag +#define V4L2_BUF_FRAME_FLAG_ROTATION_90 0x01000000 /* Frame is rotated 90 degrees */ +#define V4L2_BUF_FRAME_FLAG_ROTATION_180 0x02000000 /* Frame is rotated 180 degrees */ +#define V4L2_BUF_FRAME_FLAG_ROTATION_270 0x03000000 /* Frame is rotated 270 degrees */ +#define V4L2_BUF_FRAME_FLAG_ROTATION_MASK 0x03000000 +#define V4L2_BUF_FRAME_FLAG_SCALING_2 0x04000000 /* Frame is scaled by half */ +#define V4L2_BUF_FRAME_FLAG_SCALING_4 0x08000000 /* Frame is scaled by quarter */ +#define V4L2_BUF_FRAME_FLAG_SCALING_MASK 0x0C000000 +#define V4L2_BUF_FLAG_MVX_BUFFER_FRAME_PRESENT 0x10000000 +#define V4L2_BUF_FLAG_MVX_BUFFER_NEED_REALLOC 0x20000000 + +//for decode bitstream flag +#define V4L2_BUF_FLAG_MVX_CODEC_CONFIG 0xC1000000 +#define V4L2_BUF_FLAG_END_OF_SUB_FRAME 0xC2000000 +#define V4L2_BUF_FLAG_MVX_DECODE_ONLY 0xC4000000 + +//for encode frame flag +#define V4L2_BUF_FRAME_FLAG_MIRROR_HORI 0x01000000 +#define V4L2_BUF_FRAME_FLAG_MIRROR_VERT 0x02000000 +#define V4L2_BUF_FRAME_FLAG_MIRROR_MASK 0x03000000 +#define V4L2_BUF_ENCODE_FLAG_ROTATION_90 0x10000000 /* Frame is rotated 90 degrees */ +#define V4L2_BUF_ENCODE_FLAG_ROTATION_180 0x20000000 /* Frame is rotated 180 degrees */ +#define V4L2_BUF_ENCODE_FLAG_ROTATION_270 0x30000000 /* Frame is rotated 270 degrees */ +#define V4L2_BUF_ENCODE_FLAG_ROTATION_MASK 0x30000000 + +#define V4L2_BUF_FLAG_MVX_BUFFER_ROI 0x04000000 /* this buffer has a roi region */ +#define V4L2_BUF_FLAG_MVX_BUFFER_EPR 0x08000000 /* EPR buffer flag */ +#define V4L2_BUF_FLAG_MVX_BUFFER_GENERAL 0x08000000 +#define V4L2_BUF_FLAG_MVX_BUFFER_CHR 0x40000000 +#define V4L2_BUF_FLAG_MVX_BUFFER_GOP_RESET 0x80000000 /* reset GOP */ +#define V4L2_BUF_FLAG_MVX_BUFFER_LTR_RESET 0x00200000 /* reset GOP */ +#define V4L2_BUF_FLAG_MVX_BUFFER_ENC_STATS 0x00400000 /* reset LTR */ + +//afbc flag +#define V4L2_BUF_FLAG_MVX_AFBC_TILED_HEADERS 0x01000000 +#define V4L2_BUF_FLAG_MVX_AFBC_TILED_BODY 0x02000000 +#define V4L2_BUF_FLAG_MVX_AFBC_32X8_SUPERBLOCK 0x04000000 + +//for customeized flag, set to v4l2_buffer.reserved2 +#define V4L2_BUF_FLAG_MVX_MINIFRAME 0x00000001 +#define V4L2_BUF_FLAG_MVX_OSD_1 0x00000002 +#define V4L2_BUF_FLAG_MVX_OSD_2 0x00000004 +#define V4L2_BUF_FLAG_MVX_OSD_MASK 0x00000006 +#define V4L2_BUF_FLAG_MVX_AD_STATS 0x00000008 + +/**************************************************************************** + * HDR color description. + ****************************************************************************/ + +#define V4L2_EVENT_MVX_COLOR_DESC V4L2_EVENT_PRIVATE_START +#define V4L2_MVX_MAX_FRAME_REGIONS 16 +#define V4L2_MAX_FRAME_OSD_REGION 2 +enum v4l2_mvx_range { + V4L2_MVX_RANGE_UNSPECIFIED, + V4L2_MVX_RANGE_FULL, + V4L2_MVX_RANGE_LIMITED +}; + +enum v4l2_mvx_primaries { + V4L2_MVX_PRIMARIES_UNSPECIFIED, + V4L2_MVX_PRIMARIES_BT709, /* Rec.ITU-R BT.709 */ + V4L2_MVX_PRIMARIES_BT470M, /* Rec.ITU-R BT.470 System M */ + V4L2_MVX_PRIMARIES_BT601_625, /* Rec.ITU-R BT.601 625 */ + V4L2_MVX_PRIMARIES_BT601_525, /* Rec.ITU-R BT.601 525 */ + V4L2_MVX_PRIMARIES_GENERIC_FILM, /* Generic Film */ + V4L2_MVX_PRIMARIES_BT2020 /* Rec.ITU-R BT.2020 */ +}; + +enum v4l2_mvx_transfer { + V4L2_MVX_TRANSFER_UNSPECIFIED, + V4L2_MVX_TRANSFER_LINEAR, /* Linear transfer characteristics */ + V4L2_MVX_TRANSFER_SRGB, /* sRGB */ + V4L2_MVX_TRANSFER_SMPTE170M, /* SMPTE 170M */ + V4L2_MVX_TRANSFER_GAMMA22, /* Assumed display gamma 2.2 */ + V4L2_MVX_TRANSFER_GAMMA28, /* Assumed display gamma 2.8 */ + V4L2_MVX_TRANSFER_ST2084, /* SMPTE ST 2084 */ + V4L2_MVX_TRANSFER_HLG, /* ARIB STD-B67 hybrid-log-gamma */ + V4L2_MVX_TRANSFER_SMPTE240M, /* SMPTE 240M */ + V4L2_MVX_TRANSFER_XVYCC, /* IEC 61966-2-4 */ + V4L2_MVX_TRANSFER_BT1361, /* Rec.ITU-R BT.1361 extended gamut */ + V4L2_MVX_TRANSFER_ST428 /* SMPTE ST 428-1 */ +}; + +enum v4l2_mvx_matrix { + V4L2_MVX_MATRIX_UNSPECIFIED, + V4L2_MVX_MATRIX_BT709, /* Rec.ITU-R BT.709 */ + V4L2_MVX_MATRIX_BT470M, /* KR=0.30, KB=0.11 */ + V4L2_MVX_MATRIX_BT601, /* Rec.ITU-R BT.601 625 */ + V4L2_MVX_MATRIX_SMPTE240M, /* SMPTE 240M or equivalent */ + V4L2_MVX_MATRIX_BT2020, /* Rec.ITU-R BT.2020 non-const lum */ + V4L2_MVX_MATRIX_BT2020Constant /* Rec.ITU-R BT.2020 constant lum */ +}; + +enum v4l2_nalu_format { + V4L2_OPT_NALU_FORMAT_START_CODES, + V4L2_OPT_NALU_FORMAT_ONE_NALU_PER_BUFFER, + V4L2_OPT_NALU_FORMAT_ONE_BYTE_LENGTH_FIELD, + V4L2_OPT_NALU_FORMAT_TWO_BYTE_LENGTH_FIELD, + V4L2_OPT_NALU_FORMAT_FOUR_BYTE_LENGTH_FIELD, + V4L2_OPT_NALU_FORMAT_ONE_FRAME_PER_BUFFER +}; + +struct v4l2_mvx_primary { + unsigned short x; + unsigned short y; +}; + +/** + * struct v4l2_mvx_color_desc - HDR color description. + * @flags: Flags which fields that are valid. + * @range: enum v4l2_mvx_range. + * @primaries: enum v4l2_mvx_primaries. + * @transfer: enum v4l2_mvx_transfer. + * @matrix: enum v4l2_mvx_matrix. + * @display.r: Red point. + * @display.g: Green point. + * @display.b: Blue point. + * @display.w: White point. + * @display.luminance_min: Minimum display luminance. + * @display.luminance_max: Maximum display luminance. + * @content.luminance_max: Maximum content luminance. + * @content.luminance_average: Average content luminance. + * + * Color- and white point primaries are given in increments of 0.00002 + * and in the range of 0 to 50'000. + * + * Luminance is given in increments of 0.0001 candelas per m3. + */ +struct v4l2_mvx_color_desc { + unsigned int flags; + #define V4L2_BUFFER_PARAM_COLOUR_FLAG_MASTERING_DISPLAY_DATA_VALID (1) + #define V4L2_BUFFER_PARAM_COLOUR_FLAG_CONTENT_LIGHT_DATA_VALID (2) + unsigned char range; + unsigned char primaries; + unsigned char transfer; + unsigned char matrix; + struct { + struct v4l2_mvx_primary r; + struct v4l2_mvx_primary g; + struct v4l2_mvx_primary b; + struct v4l2_mvx_primary w; + unsigned short luminance_min; + unsigned short luminance_max; + } display; + struct { + unsigned short luminance_max; + unsigned short luminance_average; + } content; + + unsigned char video_format; + unsigned char aspect_ratio_idc; + unsigned short sar_width; + unsigned short sar_height; + unsigned int num_units_in_tick; + unsigned int time_scale; +} __attribute__ ((packed)); + +struct v4l2_buffer_param_region +{ + unsigned short mbx_left; /**< X coordinate of the left most macroblock */ + unsigned short mbx_right; /**< X coordinate of the right most macroblock */ + unsigned short mby_top; /**< Y coordinate of the top most macroblock */ + unsigned short mby_bottom; /**< Y coordinate of the bottom most macroblock */ + short qp_delta; /**< QP delta value. This region will be encoded + * with qp = qp_default + qp_delta. */ + unsigned short prio; + unsigned short force_intra; +}; + +struct v4l2_mvx_roi_regions +{ + unsigned int pic_index; + unsigned char qp_present; + unsigned char qp; + unsigned char roi_present; + unsigned char num_roi; + struct v4l2_buffer_param_region roi[V4L2_MVX_MAX_FRAME_REGIONS]; +}; + +struct v4l2_sei_user_data +{ + unsigned char flags; + #define V4L2_BUFFER_PARAM_USER_DATA_UNREGISTERED_VALID (1) + unsigned char uuid[16]; + char user_data[256 - 35]; + unsigned char user_data_len; +}; + +struct v4l2_rate_control +{ + unsigned int rc_type; + #define V4L2_OPT_RATE_CONTROL_MODE_OFF (0) + #define V4L2_OPT_RATE_CONTROL_MODE_STANDARD (1) + #define V4L2_OPT_RATE_CONTROL_MODE_VARIABLE (2) + #define V4L2_OPT_RATE_CONTROL_MODE_CONSTANT (3) + #define V4L2_OPT_RATE_CONTROL_MODE_C_VARIABLE (4) + unsigned int target_bitrate; + unsigned int maximum_bitrate; +}; + +struct v4l2_mvx_dsl_frame +{ + unsigned int width; + unsigned int height; +}; + +struct v4l2_mvx_dsl_ratio +{ + unsigned int hor; + unsigned int ver; +}; + +struct v4l2_mvx_long_term_ref +{ + unsigned int mode; + unsigned int period; +}; + +struct v4l2_buffer_param_rectangle +{ + unsigned short x_left; /* pixel x left edge (inclusive) */ + unsigned short x_right; /* pixel x right edge (exclusive) */ + unsigned short y_top; /* pixel y top edge (inclusive) */ + unsigned short y_bottom; /* pixel y bottom edge (exclusive) */ +}; + +/* input for encoder, + * indicate which parts of the source picture has changed. + * The encoder can (optionally) use this information to + * reduce memory bandwidth. + * + * n_rectangles=0 indicates the source picture is unchanged. + * + * This parameter only applies to the picture that immediately + * follows (and not to subsequent ones). + */ +struct v4l2_mvx_chr_config +{ + unsigned int pic_index; + unsigned int num_chr; + #define V4L2_MAX_FRAME_CHANGE_RECTANGLES 2 + struct v4l2_buffer_param_rectangle rectangle[V4L2_MAX_FRAME_CHANGE_RECTANGLES]; +}; + +struct v4l2_mvx_osd_cfg +{ + uint8_t osd_inside_enable; + uint8_t osd_inside_alpha_enable; + uint8_t osd_inside_convert_color_enable; + uint8_t osd_inside_alpha_value; /* as alpha range [0~16], use u8 */ + uint8_t osd_inside_convert_color_threshold;/* threshold range [0~255], if input is 10bit, th * 4 */ + uint8_t osd_inside_rgb2yuv_mode;/* 0-601L, 1-601F, 2-709_L, 3-709_F */ + uint16_t osd_inside_start_x; /* pixel x left edge (inclusive) */ + uint16_t osd_inside_start_y; /* pixel y top edge (inclusive) */ + uint16_t reserved[3]; +}; + +struct v4l2_osd_config +{ + unsigned int pic_index; + unsigned int num_osd; + struct v4l2_mvx_osd_cfg osd_single_cfg[V4L2_MAX_FRAME_OSD_REGION];/* include single osd region config and index */ +}; + +struct v4l2_osd_info +{ + uint32_t width_osd[V4L2_MAX_FRAME_OSD_REGION]; + uint32_t height_osd[V4L2_MAX_FRAME_OSD_REGION]; + uint32_t inputFormat_osd[V4L2_MAX_FRAME_OSD_REGION]; +}; + +#define V4L2_MVX_COLOR_DESC_DISPLAY_VALID 0x1 +#define V4L2_MVX_COLOR_DESC_CONTENT_VALID 0x2 + +/**************************************************************************** + * Custom IOCTL + ****************************************************************************/ + +#define VIDIOC_G_MVX_COLORDESC _IOWR('V', BASE_VIDIOC_PRIVATE, \ + struct v4l2_mvx_color_desc) +#define VIDIOC_S_MVX_ROI_REGIONS _IOWR('V', BASE_VIDIOC_PRIVATE + 1, \ + struct v4l2_mvx_roi_regions) +#define VIDIOC_S_MVX_QP_EPR _IOWR('V', BASE_VIDIOC_PRIVATE + 2, \ + struct v4l2_buffer_param_qp) +#define VIDIOC_S_MVX_COLORDESC _IOWR('V', BASE_VIDIOC_PRIVATE + 3, \ + struct v4l2_mvx_color_desc) +#define VIDIOC_S_MVX_SEI_USERDATA _IOWR('V', BASE_VIDIOC_PRIVATE + 4, \ + struct v4l2_sei_user_data) +#define VIDIOC_S_MVX_RATE_CONTROL _IOWR('V', BASE_VIDIOC_PRIVATE + 5, \ + struct v4l2_rate_control) +#define VIDIOC_S_MVX_DSL_FRAME _IOWR('V', BASE_VIDIOC_PRIVATE + 6, \ + struct v4l2_mvx_dsl_frame) +#define VIDIOC_S_MVX_DSL_RATIO _IOWR('V', BASE_VIDIOC_PRIVATE + 7, \ + struct v4l2_mvx_dsl_ratio) +#define VIDIOC_S_MVX_LONG_TERM_REF _IOWR('V', BASE_VIDIOC_PRIVATE + 8, \ + struct v4l2_mvx_long_term_ref) +#define VIDIOC_S_MVX_DSL_MODE _IOWR('V', BASE_VIDIOC_PRIVATE + 9, \ + int) +#define VIDIOC_S_MVX_MINI_FRAME_HEIGHT _IOWR('V', BASE_VIDIOC_PRIVATE + 10, \ + int) +#define VIDIOC_S_MVX_STATS_MODE _IOWR('V', BASE_VIDIOC_PRIVATE + 11, \ + struct v4l2_buffer_param_enc_stats) +#define VIDIOC_S_MVX_CHR_CFG _IOWR('V', BASE_VIDIOC_PRIVATE + 12, \ + struct v4l2_mvx_chr_config) +#define VIDIOC_S_MVX_HUFF_TABLE _IOWR('V', BASE_VIDIOC_PRIVATE + 13, \ + struct v4l2_mvx_huff_table) +#define VIDIOC_S_MVX_SEAMLESS_TARGET _IOWR('V', BASE_VIDIOC_PRIVATE + 14, \ + struct v4l2_mvx_seamless_target) +#define VIDIOC_S_MVX_COLOR_CONV_COEF _IOWR('V', BASE_VIDIOC_PRIVATE + 15, \ + struct v4l2_mvx_color_conv_coef) +#define VIDIOC_S_MVX_ENC_SRC_CROP _IOWR('V', BASE_VIDIOC_PRIVATE + 16, \ + struct v4l2_mvx_crop_cfg) +#define VIDIOC_S_MVX_DEC_DST_CROP _IOWR('V', BASE_VIDIOC_PRIVATE + 17, \ + struct v4l2_mvx_crop_cfg) +#define VIDIOC_S_MVX_RGB2YUV_COLOR_CONV_COEF _IOWR('V', BASE_VIDIOC_PRIVATE + 18, \ + struct v4l2_mvx_rgb2yuv_color_conv_coef) +#define VIDIOC_S_MVX_OSD_CONFIG _IOWR('V', BASE_VIDIOC_PRIVATE + 19, \ + struct v4l2_osd_config) +#define VIDIOC_S_MVX_OSD_INFO _IOWR('V', BASE_VIDIOC_PRIVATE + 20, \ + struct v4l2_osd_info) +/**************************************************************************** + * Custom controls + ****************************************************************************/ + +/* + * Video for Linux 2 custom controls. + */ +enum v4l2_cid_mve_video { +#if LINUX_VERSION_CODE > KERNEL_VERSION(6, 0, 0) + V4L2_CID_MVE_VIDEO_FRAME_RATE = V4L2_CTRL_CLASS_CODEC + 0x2000, +#else + V4L2_CID_MVE_VIDEO_FRAME_RATE = V4L2_CTRL_CLASS_MPEG + 0x2000, +#endif + V4L2_CID_MVE_VIDEO_NALU_FORMAT, + V4L2_CID_MVE_VIDEO_STREAM_ESCAPING, + V4L2_CID_MVE_VIDEO_H265_PROFILE, + V4L2_CID_MVE_VIDEO_VC1_PROFILE, + V4L2_CID_MVE_VIDEO_H265_LEVEL, + V4L2_CID_MVE_VIDEO_IGNORE_STREAM_HEADERS, + V4L2_CID_MVE_VIDEO_FRAME_REORDERING, + V4L2_CID_MVE_VIDEO_INTBUF_SIZE, + V4L2_CID_MVE_VIDEO_P_FRAMES, + V4L2_CID_MVE_VIDEO_GOP_TYPE, + V4L2_CID_MVE_VIDEO_CONSTR_IPRED, + V4L2_CID_MVE_VIDEO_ENTROPY_SYNC, + V4L2_CID_MVE_VIDEO_TEMPORAL_MVP, + V4L2_CID_MVE_VIDEO_TILE_ROWS, + V4L2_CID_MVE_VIDEO_TILE_COLS, + V4L2_CID_MVE_VIDEO_MIN_LUMA_CB_SIZE, + V4L2_CID_MVE_VIDEO_MB_MASK, + V4L2_CID_MVE_VIDEO_VP9_PROB_UPDATE, + V4L2_CID_MVE_VIDEO_BITDEPTH_CHROMA, + V4L2_CID_MVE_VIDEO_BITDEPTH_LUMA, + V4L2_CID_MVE_VIDEO_FORCE_CHROMA_FORMAT, + V4L2_CID_MVE_VIDEO_RGB_TO_YUV_MODE, + V4L2_CID_MVE_VIDEO_BANDWIDTH_LIMIT, + V4L2_CID_MVE_VIDEO_CABAC_INIT_IDC, + V4L2_CID_MVE_VIDEO_VPX_B_FRAME_QP, + V4L2_CID_MVE_VIDEO_SECURE_VIDEO, + V4L2_CID_MVE_VIDEO_CROP_LEFT, + V4L2_CID_MVE_VIDEO_CROP_RIGHT, + V4L2_CID_MVE_VIDEO_CROP_TOP, + V4L2_CID_MVE_VIDEO_CROP_BOTTOM, + V4L2_CID_MVE_VIDEO_HRD_BUFFER_SIZE, + V4L2_CID_MVE_VIDEO_INIT_QP_I, + V4L2_CID_MVE_VIDEO_INIT_QP_P, + V4L2_CID_MVE_VIDEO_SAO_LUMA, + V4L2_CID_MVE_VIDEO_SAO_CHROMA, + V4L2_CID_MVE_VIDEO_QP_DELTA_I_P, + V4L2_CID_MVE_VIDEO_QP_REF_RB_EN, + V4L2_CID_MVE_VIDEO_RC_CLIP_TOP, + V4L2_CID_MVE_VIDEO_RC_CLIP_BOT, + V4L2_CID_MVE_VIDEO_QP_MAP_CLIP_TOP, + V4L2_CID_MVE_VIDEO_QP_MAP_CLIP_BOT, + V4L2_CID_MVE_VIDEO_MAX_QP_I, + V4L2_CID_MVE_VIDEO_MIN_QP_I, + V4L2_CID_MVE_VIDEO_FW_PROFILING, + V4L2_CID_MVE_VIDEO_VISIBLE_WIDTH, + V4L2_CID_MVE_VIDEO_VISIBLE_HEIGHT, + V4L2_CID_MVE_VIDEO_JPEG_QUALITY_LUMA, + V4L2_CID_MVE_VIDEO_JPEG_QUALITY_CHROMA, + V4L2_CID_MVE_VIDEO_RC_I_MODE, + V4L2_CID_MVE_VIDEO_RC_I_RATIO, + V4L2_CID_MVE_VIDEO_INTER_MED_BUF_SIZE, + V4L2_CID_MVE_VIDEO_SVCT3_LEVEL1_PERIOD, + V4L2_CID_MVE_VIDEO_GOP_RESET_PFRAMES, + V4L2_CID_MVE_VIDEO_LTR_RESET_PERIOD, + V4L2_CID_MVE_VIDEO_QP_FIXED, + V4L2_CID_MVE_VIDEO_GDR_NUMBER, + V4L2_CID_MVE_VIDEO_GDR_PERIOD, + V4L2_CID_MVE_VIDEO_MULTI_SPS_PPS, + V4L2_CID_MVE_VIDEO_ENABLE_VISUAL, + V4L2_CID_MVE_VIDEO_SCD_ENABLE, + V4L2_CID_MVE_VIDEO_SCD_PERCENT, + V4L2_CID_MVE_VIDEO_SCD_THRESHOLD, + V4L2_CID_MVE_VIDEO_AQ_SSIM_EN, + V4L2_CID_MVE_VIDEO_AQ_NEG_RATIO, + V4L2_CID_MVE_VIDEO_AQ_POS_RATIO, + V4L2_CID_MVE_VIDEO_AQ_QPDELTA_LMT, + V4L2_CID_MVE_VIDEO_AQ_INIT_FRM_AVG_SVAR, + V4L2_CID_MVE_VIDEO_COLOR_CONVERSION, + V4L2_CID_MVE_VIDEO_RGB2YUV_COLOR_CONV_COEF, + V4L2_CID_MVE_VIDEO_FORCED_UV_VALUE, + V4L2_CID_MVE_VIDEO_DSL_INTERP_MODE, + V4L2_CID_MVE_VIDEO_DISABLED_FEATURES, + V4L2_CID_MVE_VIDEO_ENABLE_ADAPTIVE_INTRA_BLOCK, + V4L2_CID_MVE_VIDEO_CHANGE_POS, +}; + +struct v4l2_buffer_param_enc_stats +{ + unsigned int mms_buffer_size; + unsigned int bitcost_buffer_size; + unsigned int qp_buffer_size; + unsigned int flags; + //ENC_STATS_FLAGS + #define V4L2_BUFFER_ENC_STATS_FLAG_MMS (1<<0) + #define V4L2_BUFFER_ENC_STATS_FLAG_BITCOST (1<<1) + #define V4L2_BUFFER_ENC_STATS_FLAG_QP (1<<2) + #define V4L2_BUFFER_ENC_STATS_FLAG_DROP (1<<3) + unsigned int pic_index_or_mb_size; +}; + + +/* block configuration uncompressed rows header. this configures the size of the + * uncompressed body. */ +struct v4l2_buffer_general_rows_uncomp_hdr +{ + unsigned char n_cols_minus1; /* number of quad cols in picture minus 1 */ + unsigned char n_rows_minus1; /* number of quad rows in picture minus 1 */ + unsigned char reserved[2]; +}; + +struct v4l2_buffer_general_block_configs +{ + unsigned char blk_cfg_type; + #define V4L2_BLOCK_CONFIGS_TYPE_NONE (0x00) + #define V4L2_BLOCK_CONFIGS_TYPE_ROW_UNCOMP (0xff) + unsigned char reserved[3]; + union + { + struct v4l2_buffer_general_rows_uncomp_hdr rows_uncomp; + } blk_cfgs; +}; + +struct v4l2_buffer_general_ad_stats +{ + unsigned int frame_averages; + // bitfields + #define v4l2_AD_STATS_PIC_AVGS_Y (0) + #define v4l2_AD_STATS_PIC_AVGS_Y_SZ (12) + #define v4l2_AD_STATS_PIC_AVGS_CB (12) + #define v4l2_AD_STATS_PIC_AVGS_CB_SZ (10) + #define v4l2_AD_STATS_PIC_AVGS_CR (22) + #define v4l2_AD_STATS_PIC_AVGS_CR_SZ (10) + unsigned short thumbnail_width; + unsigned short thumbnail_height; + unsigned char ad_stats_flags; + #define v4l2_AD_STATS_PIC_FMT_PROGRESSIVE (0) + #define v4l2_AD_STATS_PIC_FMT_INTERLACED (1) + unsigned char reserved[3]; +}; + +/* input for encoder */ +struct v4l2_buffer_param_qp +{ + /* QP (quantization parameter) for encode. + * + * When used to set fixed QP for encode, with rate control + * disabled, then the valid ranges are: + * H264: 0-51 + * HEVC: 0-51 + * VP8: 0-63 + * VP9: 0-63 + * Note: The QP must be set separately for I, P and B frames. + * + * But when this message is used with the regions-feature, + * then the valid ranges are the internal bitstream ranges: + * H264: 0-51 + * HEVC: 0-51 + * VP8: 0-127 + * VP9: 0-255 + */ + int qp; + int epr_iframe_enable; +}; + +/* the block parameter record specifies the various properties of a quad */ +struct v4l2_block_param_record +{ + unsigned int qp_delta; + /* Bitset of four 4-bit QP delta values for a quad. + * For H.264 and HEVC these are qp delta values in the range -8 to +7. + * For Vp9 these are segment map values in the range 0 to 7. + */ + #define V4L2_BLOCK_PARAM_RECORD_QP_DELTA_TOP_LEFT_16X16 (0) + #define V4L2_BLOCK_PARAM_RECORD_QP_DELTA_TOP_LEFT_16X16_SZ (6) + #define V4L2_BLOCK_PARAM_RECORD_QP_DELTA_TOP_RIGHT_16X16 (6) + #define V4L2_BLOCK_PARAM_RECORD_QP_DELTA_TOP_RIGHT_16X16_SZ (6) + #define V4L2_BLOCK_PARAM_RECORD_QP_DELTA_BOT_LEFT_16X16 (12) + #define V4L2_BLOCK_PARAM_RECORD_QP_DELTA_BOT_LEFT_16X16_SZ (6) + #define V4L2_BLOCK_PARAM_RECORD_QP_DELTA_BOT_RIGHT_16X16 (18) + #define V4L2_BLOCK_PARAM_RECORD_QP_DELTA_BOT_RIGHT_16X16_SZ (6) + + #define V4L2_BLOCK_PARAM_RECORD_QP_FORCE_FIELD (24) + #define V4L2_BLOCK_PARAM_RECORD_QP_FORCE_FIELD_SZ (5) + #define V4L2_BLOCK_PARAM_RECORD_QUAD_FORCE_INTRA (29) + #define V4L2_BLOCK_PARAM_RECORD_QUAD_FORCE_INTRA_SZ (1) + #define V4L2_BLOCK_PARAM_RECORD_QP_ABSOLUTE (30) + #define V4L2_BLOCK_PARAM_RECORD_QP_ABSOLUTE_SZ (1) + #define V4L2_BLOCK_PARAM_RECORD_QP_QUAD_SKIP (31) + #define V4L2_BLOCK_PARAM_RECORD_QP_QUAD_SKIP_SZ (1) + + #define V4L2_BLOCK_PARAM_RECORD_FORCE_NONE (0x00) + #define V4L2_BLOCK_PARAM_RECORD_FORCE_QP (0x01) + unsigned int min_qp; + #define V4L2_BLOCK_PARAM_RECORD_MIN_QP_TOP_LEFT_16X16 (0) + #define V4L2_BLOCK_PARAM_RECORD_MIN_QP_TOP_LEFT_16X16_SZ (6) + #define V4L2_BLOCK_PARAM_RECORD_MIN_QP_TOP_RIGHT_16X16 (6) + #define V4L2_BLOCK_PARAM_RECORD_MIN_QP_TOP_RIGHT_16X16_SZ (6) + #define V4L2_BLOCK_PARAM_RECORD_MIN_QP_BOT_LEFT_16X16 (12) + #define V4L2_BLOCK_PARAM_RECORD_MIN_QP_BOT_LEFT_16X16_SZ (6) + #define V4L2_BLOCK_PARAM_RECORD_MIN_QP_BOT_RIGHT_16X16 (18) + #define V4L2_BLOCK_PARAM_RECORD_MIN_QP_BOT_RIGHT_16X16_SZ (6) + #define V4L2_BLOCK_PARAM_RECORD_QUAD_SELECT_QP_DELTA (24) + #define V4L2_BLOCK_PARAM_RECORD_QUAD_SELECT_QP_DELTA_SZ (1) + +}; + +struct v4l2_buffer_general_rows_uncomp_body +{ + /* the size of this array is variable and not necessarily equal to 1. + * therefore the sizeof operator should not be used + */ + struct v4l2_block_param_record bpr[1]; +}; + +struct v4l2_core_buffer_header_general +{ + //uint64_t user_data_tag; // User supplied tracking identifier + //uint64_t app_handle; // Host buffer handle number + unsigned short type; // type of config, value is one of V4L2_BUFFER_GENERAL_TYPE_X + + #define V4L2_BUFFER_GENERAL_TYPE_INVALID (0) /* invalid */ + #define V4L2_BUFFER_GENERAL_TYPE_BLOCK_CONFIGS (1) /* block_configs */ + #define V4L2_BUFFER_GENERAL_TYPE_AD_STATS (2) /* assertive display statistics */ + unsigned short config_size; // size of the configuration + unsigned int buffer_size; + union { + struct v4l2_buffer_general_block_configs config; + struct v4l2_buffer_general_ad_stats ad_stats; + } config; +}; + +struct v4l2_mvx_huff_table +{ + unsigned int type; + #define V4L2_OPT_HUFFMAN_TABLE_DC_LUMA (1) + #define V4L2_OPT_HUFFMAN_TABLE_AC_LUMA (2) + #define V4L2_OPT_HUFFMAN_TABLE_DC_CHROMA (4) + #define V4L2_OPT_HUFFMAN_TABLE_AC_CHROMA (8) + unsigned char dc_luma_code_lenght[16]; + unsigned char ac_luma_code_lenght[16]; + unsigned char dc_chroma_code_lenght[16]; + unsigned char ac_chroma_code_lenght[16]; + unsigned char dc_luma_table[162]; + unsigned char ac_luma_table[162]; + unsigned char dc_chroma_table[162]; + unsigned char ac_chroma_table[162]; +}; +struct v4l2_mvx_seamless_target +{ + unsigned int seamless_mode; + unsigned int target_width; + unsigned int target_height; + unsigned int target_stride[3]; + unsigned int target_size[3]; +}; +struct v4l2_mvx_color_conv_coef +{ + short coef[3][3]; + unsigned short offset[3]; +}; + +struct v4l2_mvx_rgb2yuv_color_conv_coef +{ + short coef[3 * 3]; //coef[Y|U|V][R|G|B] + unsigned char luma_range[2]; + unsigned char chroma_range[2]; + unsigned char rgb_range[2]; +}; + +struct v4l2_mvx_crop_cfg +{ + unsigned char crop_en; + unsigned short x; + unsigned short y; + unsigned short width; + unsigned short height; +}; +#endif /* _MVX_V4L2_CONTROLS_H_ */ diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_bitops.h b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_bitops.h new file mode 100755 index 000000000..20ea99e03 --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_bitops.h @@ -0,0 +1,91 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef _MVX_BITOPS_H_ +#define _MVX_BITOPS_H_ + +/**************************************************************************** + * Includes + ****************************************************************************/ + +#include +#include + +/**************************************************************************** + * Static functions + ****************************************************************************/ + +/** + * mvx_set_bit() - Set a bit in the bitmask. + * @bit: Bit to be set. + * @addr: Pointer to bitmask. + * + * Works similar to set_bit but uses no locks, is not atomic and protects + * agains overflow. + */ +static inline void mvx_set_bit(unsigned int bit, + uint64_t *addr) +{ + BUG_ON(bit >= (sizeof(*addr) * 8)); + *addr |= 1ull << bit; +} + +/** + * mvx_clear_bit() - Clear a bit in the bitmask. + * @bit: Bit to be cleared. + * @addr: Pointer to bitmask. + * + * Works similar to clear_bit but uses no locks, is not atomic and protects + * agains overflow. + */ +static inline void mvx_clear_bit(unsigned int bit, + uint64_t *addr) +{ + BUG_ON(bit >= (sizeof(*addr) * 8)); + *addr &= ~(1ull << bit); +} + +/** + * mvx_test_bit() - Test a bit in the bitmask. + * @bit: Bit to be tested. + * @addr: Pointer to bitmask. + * + * Works similar to test_bit but uses no locks, is not atomic and protects + * agains overflow. + */ +static inline bool mvx_test_bit(unsigned int bit, + uint64_t *addr) +{ + BUG_ON(bit >= (sizeof(*addr) * 8)); + return 0 != (*addr & (1ull << bit)); +} + +#endif /* _MVX_BITOPS_H_ */ diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_buffer.c b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_buffer.c new file mode 100755 index 000000000..682b4e72e --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_buffer.c @@ -0,0 +1,569 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +/**************************************************************************** + * Includes + ****************************************************************************/ + +#include +#include "mvx_buffer.h" +#include "mvx_seq.h" +#include "mvx_log_group.h" + +/**************************************************************************** + * Defines + ****************************************************************************/ + +/** + * Each 2x2 pixel square is subsampled. How many samples that are taken depends + * on the color format, but typically the luma channel (Y) gets 4 samples and + * the luma channels (UV) get 2 or 4 samples. + */ +#define SUBSAMPLE_PIXELS 2 + +/**************************************************************************** + * Static functions + ****************************************************************************/ + +/** + * get_stride() - Get 3 plane stride for 2x2 pixels square. + * @format: MVX frame format. + * @stride: [plane 0, plane 1, plane 2][x, y] stride. + * + * Calculate the stride in bytes for each plane for a subsampled (2x2) pixels + * square. + * + * Return: 0 on success, else error code. + */ +static int get_stride(enum mvx_format format, + uint8_t *nplanes, + unsigned int stride[MVX_BUFFER_NPLANES][2]) +{ + switch (format) { + case MVX_FORMAT_YUV420_I420: + *nplanes = 3; + stride[0][0] = 2; + stride[0][1] = 2; + stride[1][0] = 1; + stride[1][1] = 1; + stride[2][0] = 1; + stride[2][1] = 1; + break; + case MVX_FORMAT_YUV420_NV12: + case MVX_FORMAT_YUV420_NV21: + *nplanes = 2; + stride[0][0] = 2; + stride[0][1] = 2; + stride[1][0] = 2; + stride[1][1] = 1; + stride[2][0] = 0; + stride[2][1] = 0; + break; + case MVX_FORMAT_YUV420_P010: + case MVX_FORMAT_YUV420_2P_10: + *nplanes = 2; + stride[0][0] = 4; + stride[0][1] = 2; + stride[1][0] = 4; + stride[1][1] = 1; + stride[2][0] = 0; + stride[2][1] = 0; + break; + case MVX_FORMAT_YUV420_Y0L2: + case MVX_FORMAT_YUV420_AQB1: + *nplanes = 1; + stride[0][0] = 8; + stride[0][1] = 1; + stride[1][0] = 0; + stride[1][1] = 0; + stride[2][0] = 0; + stride[2][1] = 0; + break; + case MVX_FORMAT_YUV422_YUY2: + case MVX_FORMAT_YUV422_UYVY: + *nplanes = 1; + stride[0][0] = 4; + stride[0][1] = 2; + stride[1][0] = 0; + stride[1][1] = 0; + stride[2][0] = 0; + stride[2][1] = 0; + break; + case MVX_FORMAT_YUV422_Y210: + case MVX_FORMAT_YUV422_1P_10: + case MVX_FORMAT_RGBA_8888: + case MVX_FORMAT_BGRA_8888: + case MVX_FORMAT_ARGB_8888: + case MVX_FORMAT_ABGR_8888: + *nplanes = 1; + stride[0][0] = 8; + stride[0][1] = 2; + stride[1][0] = 0; + stride[1][1] = 0; + stride[2][0] = 0; + stride[2][1] = 0; + break; + case MVX_FORMAT_RGB_888: + case MVX_FORMAT_BGR_888: + *nplanes = 1; + stride[0][0] = 6; + stride[0][1] = 2; + stride[1][0] = 0; + stride[1][1] = 0; + stride[2][0] = 0; + stride[2][1] = 0; + break; + case MVX_FORMAT_RGB_888_3P: + case MVX_FORMAT_YUV444: + *nplanes = 3; + stride[0][0] = 2; + stride[0][1] = 2; + stride[1][0] = 2; + stride[1][1] = 2; + stride[2][0] = 2; + stride[2][1] = 2; + break; + case MVX_FORMAT_Y: + *nplanes = 1; + stride[0][0] = 2; + stride[0][1] = 2; + stride[1][0] = 0; + stride[1][1] = 0; + stride[2][0] = 0; + stride[2][1] = 0; + break; + case MVX_FORMAT_Y_10: + *nplanes = 1; + stride[0][0] = 4; + stride[0][1] = 2; + stride[1][0] = 0; + stride[1][1] = 0; + stride[2][0] = 0; + stride[2][1] = 0; + break; + case MVX_FORMAT_YUV444_10: + *nplanes = 3; + stride[0][0] = 4; + stride[0][1] = 2; + stride[1][0] = 4; + stride[1][1] = 2; + stride[2][0] = 4; + stride[2][1] = 2; + break; + case MVX_FORMAT_YUV420_I420_10: + *nplanes = 3; + stride[0][0] = 4; + stride[0][1] = 2; + stride[1][0] = 2; + stride[1][1] = 1; + stride[2][0] = 2; + stride[2][1] = 1; + break; + default: + return -EINVAL; + } + + return 0; +} + +static int map_plane(struct mvx_buffer *buf, + mvx_mmu_va begin, + mvx_mmu_va end, + unsigned int plane) +{ + while (begin < end) { + struct mvx_buffer_plane *p = &buf->planes[plane]; + int ret; + + ret = mvx_mmu_map_pages(buf->mmu, begin, p->pages, + MVX_ATTR_SHARED_RW, + MVX_ACCESS_READ_WRITE); + if (ret == 0) { + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_INFO, + "Memory map buffer. buf=%p, plane=%u, va=0x%x, size=%zu.", + buf, plane, p->pages->va, + mvx_buffer_size(buf, plane)); + return 0; + } + + if (ret != -EAGAIN) + return ret; + + begin += 1 * 1024 * 1024; /* 1 MB. */ + } + + return -ENOMEM; +} + +/**************************************************************************** + * External functions + ****************************************************************************/ + +void mvx_buffer_show(struct mvx_buffer *buf, + struct seq_file *s) +{ + int i; + int ind = 0; + + mvx_seq_printf(s, "mvx_buffer", ind, "%p\n", buf); + + ind++; + mvx_seq_printf(s, "format", ind, "0x%x\n", buf->format); + mvx_seq_printf(s, "dir", ind, "%u\n", buf->dir); + mvx_seq_printf(s, "flags", ind, "0x%0x\n", buf->flags); + mvx_seq_printf(s, "width", ind, "%u\n", buf->width); + mvx_seq_printf(s, "height", ind, "%u\n", buf->height); + mvx_seq_printf(s, "nplanes", ind, "%u\n", buf->nplanes); + mvx_seq_printf(s, "planes", ind, "\n"); + ind++; + for (i = 0; i < buf->nplanes; ++i) { + char tag[10]; + struct mvx_buffer_plane *plane = &buf->planes[i]; + + scnprintf(tag, sizeof(tag), "#%d", i); + mvx_seq_printf(s, tag, ind, + "va: 0x%08x, size: %10zu, stride: %5u, filled: %10u\n", + mvx_buffer_va(buf, i), + mvx_buffer_size(buf, i), + plane->stride, + plane->filled); + } + + ind--; +} + +int mvx_buffer_construct(struct mvx_buffer *buf, + struct device *dev, + struct mvx_mmu *mmu, + enum mvx_direction dir, + unsigned int nplanes, + struct sg_table **sgt) +{ + int i; + + if (nplanes > MVX_BUFFER_NPLANES) { + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "Failed to construct buffer. Too many planes. nplanes=%u.", + nplanes); + return -EINVAL; + } + + memset(buf, 0, sizeof(*buf)); + + buf->dev = dev; + buf->mmu = mmu; + buf->dir = dir; + buf->nplanes = nplanes; + + for (i = 0; i < buf->nplanes; ++i) { + struct mvx_buffer_plane *plane = &buf->planes[i]; + + if (sgt[i] == NULL) + break; + + plane->pages = mvx_mmu_alloc_pages_sg(dev, sgt[i], 0); + if (IS_ERR(plane->pages)) + goto free_pages; + } + + return 0; + +free_pages: + while (i--) + mvx_mmu_free_pages(buf->planes[i].pages); + + return -ENOMEM; +} + +void mvx_buffer_destruct(struct mvx_buffer *buf) +{ + int i; + + mvx_buffer_unmap(buf); + + for (i = 0; i < buf->nplanes; i++) + if (buf->planes[i].pages != NULL) + mvx_mmu_free_pages(buf->planes[i].pages); +} + +int mvx_buffer_map(struct mvx_buffer *buf, + mvx_mmu_va begin, + mvx_mmu_va end) +{ + int i; + int ret = 0; + + for (i = 0; i < buf->nplanes; i++) { + struct mvx_buffer_plane *plane = &buf->planes[i]; + + if (plane->pages != NULL) { + ret = map_plane(buf, begin, end, i); + if (ret != 0) { + mvx_buffer_unmap(buf); + break; + } + } + } + + return ret; +} + +void mvx_buffer_unmap(struct mvx_buffer *buf) +{ + int i; + + for (i = 0; i < buf->nplanes; i++) { + struct mvx_buffer_plane *plane = &buf->planes[i]; + + if ((plane->pages != NULL) && (plane->pages->va != 0)) + mvx_mmu_unmap_pages(plane->pages); + } +} + +bool mvx_buffer_is_mapped(struct mvx_buffer *buf) +{ + return (buf->planes[0].pages != NULL) && + (buf->planes[0].pages->va != 0); +} + +int mvx_buffer_synch(struct mvx_buffer *buf, + enum dma_data_direction dir) +{ + int i; + int ret; + + for (i = 0; i < buf->nplanes; i++) { + struct mvx_buffer_plane *plane = &buf->planes[i]; + + if (plane->pages != NULL) { + ret = mvx_mmu_synch_pages(plane->pages, dir); + if (ret != 0) + return ret; + } + } + + return 0; +} + +void mvx_buffer_clear(struct mvx_buffer *buf) +{ + unsigned int i; + + buf->flags = 0; + + for (i = 0; i < buf->nplanes; i++) + buf->planes[i].filled = 0; +} + +int mvx_buffer_filled_set(struct mvx_buffer *buf, + unsigned int plane, + unsigned int filled, + unsigned int offset) +{ + struct mvx_buffer_plane *p = &buf->planes[plane]; + size_t size = mvx_buffer_size(buf, plane); + + if (plane > buf->nplanes) + return -EINVAL; + + if (size < (filled + offset)) { + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "Buffer plane too small. plane=%d, size=%zu, filled=%u, offset=%u.", + plane, size, filled, offset); + buf->flags |= MVX_BUFFER_FRAME_NEED_REALLOC; + return -ENOMEM; + } + + p->filled = filled; + p->offset = offset; + + return 0; +} + +size_t mvx_buffer_size(struct mvx_buffer *buf, + unsigned int plane) +{ + struct mvx_buffer_plane *p = &buf->planes[plane]; + + if (plane >= buf->nplanes || p->pages == NULL) + return 0; + + return mvx_mmu_size_pages(p->pages); +} + +mvx_mmu_va mvx_buffer_va(struct mvx_buffer *buf, + unsigned int plane) +{ + struct mvx_buffer_plane *p = &buf->planes[plane]; + + if (plane >= buf->nplanes || p->pages == NULL) + return 0; + + return p->pages->va + p->pages->offset; +} + +int mvx_buffer_frame_dim(enum mvx_format format, + unsigned int width, + unsigned int height, + uint8_t *nplanes, + unsigned int *stride, + unsigned int *size, + unsigned int *setting_stride) +{ + unsigned int s[MVX_BUFFER_NPLANES][2]; + unsigned int __nplanes = *nplanes; + int i; + int ret; + memset(s,0,sizeof(s)); + ret = get_stride(format, nplanes, s); + if (ret != 0) + return ret; + + for (i = 0; i < *nplanes; i++) { + const unsigned int stride_align = 1; + unsigned int tmp = DIV_ROUND_UP(width * s[i][0], + SUBSAMPLE_PIXELS); + /* Use optimal stride if no special stride was requested. */ + if (i >= __nplanes || stride[i] == 0){ + if (setting_stride[i]) { + stride[i] = max(stride[i], round_up(tmp, stride_align)); + } else { + stride[i] = round_up(tmp, stride_align); + } + } else { + /* Else make sure to round up to minimum stride. */ + stride[i] = max(stride[i], tmp); + } + size[i] = DIV_ROUND_UP(height * s[i][1], + SUBSAMPLE_PIXELS ) * stride[i]; + } + /* a workaround patch for nv12/nv21/p010 odd height/width output*/ + if (*nplanes == 2 && (width % 2 != 0 || height % 2 != 0)) { + unsigned int tmp = DIV_ROUND_UP(width, SUBSAMPLE_PIXELS) * s[1][0]; + stride[1] = max(stride[1], tmp); + size[1] = DIV_ROUND_UP(height * s[1][1], + SUBSAMPLE_PIXELS ) * stride[1]; + } + return 0; +} + +int mvx_buffer_frame_set(struct mvx_buffer *buf, + enum mvx_format format, + unsigned int width, + unsigned int height, + unsigned int *stride, + unsigned int *size, + bool interlaced) +{ + int i; + + buf->format = format; + buf->width = width; + buf->height = height; + + for (i = 0; i < buf->nplanes; i++) { + struct mvx_buffer_plane *plane = &buf->planes[i]; + + plane->stride = stride[i]; + plane->offset = 0; + + if (buf->dir == MVX_DIR_OUTPUT) { + int ret; + + ret = mvx_buffer_filled_set(buf, i, size[i], 0); + if (ret != 0) + return ret; + } + + /* Verify that plane has correct length. */ + if (plane->filled > 0 && plane->filled != size[i]) { + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_INFO, + "Buffer filled length does not match plane size. plane=%i, filled=%zu, size=%u.", + i, plane->filled, size[i]); + //return -ENOMEM; + } + + /* Verify that there is no buffer overflow. */ + if ((plane->filled + plane->offset) > mvx_buffer_size(buf, i)) { + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "Buffer plane size is too small. plane=%i, size=%zu, size=%u.", + i, size[i], mvx_buffer_size(buf, i)); + return -ENOMEM; + } + } + + if (interlaced != false){ + buf->flags |= MVX_BUFFER_INTERLACE; + } else { + buf->flags &= ~MVX_BUFFER_INTERLACE; + } + return 0; +} + +int mvx_buffer_afbc_set(struct mvx_buffer *buf, + enum mvx_format format, + unsigned int width, + unsigned int height, + unsigned int afbc_width, + unsigned int size, + bool interlaced) +{ + int ret; + + buf->format = format; + buf->width = width; + buf->height = height; + buf->planes[0].offset = 0; + buf->planes[0].afbc_width = afbc_width; + + if (buf->dir == MVX_DIR_INPUT) { + buf->crop_left = 0; + buf->crop_top = 0; + } + + if (buf->dir == MVX_DIR_OUTPUT) { + ret = mvx_buffer_filled_set(buf, 0, size, 0); + if (ret != 0) + return ret; + } + + if (size > mvx_buffer_size(buf, 0)) { + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "AFBC buffer too small. buf_size=%zu, size=%u.", + size, mvx_buffer_size(buf, 0)); + return -ENOMEM; + } + + if (interlaced != false) + buf->flags |= MVX_BUFFER_INTERLACE; + + return 0; +} diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_buffer.h b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_buffer.h new file mode 100755 index 000000000..2f0618983 --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_buffer.h @@ -0,0 +1,441 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef _MVX_BUFFER_H_ +#define _MVX_BUFFER_H_ + +/**************************************************************************** + * Includes + ****************************************************************************/ + +#include +#include +#include "mvx_if.h" +#include "mvx_mmu.h" +/**************************************************************************** + * Defines + ****************************************************************************/ + +#define MVX_BUFFER_NPLANES 3 +#define MVX_ROI_QP_NUMS 10 + +/**************************************************************************** + * Types + ****************************************************************************/ + +struct device; + +/** + * struct mvx_buffer_plane - Plane information. + * @pages: MMU pages object. + * @stride: Horizontal stride in bytes. + * @filled: Number of bytes written to this plane. For a frame buffer this + * value should always match the size of the plane. + * @offset: Offset in bytes from begin of buffer to first bitstream data. + * @afbc_width: AFBC width in superblocks. + */ +struct mvx_buffer_plane { + struct mvx_mmu_pages *pages; + unsigned int stride; + unsigned int filled; + unsigned int offset; + unsigned int afbc_width; +}; + +struct mvx_buffer_general_encoder_stats +{ + uint32_t mms_buffer_size; + uint32_t bitcost_buffer_size; + uint32_t qp_buffer_size; + uint32_t flags; + //ENC_STATS_FLAGS + #define MVX_BUFFER_ENC_STATS_FLAG_MMS (1<<0) + #define MVX_BUFFER_ENC_STATS_FLAG_BITCOST (1<<1) + #define MVX_BUFFER_ENC_STATS_FLAG_QP (1<<2) + #define MVX_BUFFER_ENC_STATS_FLAG_DROP (1<<3) + uint32_t reserved; +}; + +struct mvx_buffer_general_rows_uncomp_hdr +{ + uint8_t n_cols_minus1; /* number of quad cols in picture minus 1 */ + uint8_t n_rows_minus1; /* number of quad rows in picture minus 1 */ + uint8_t reserved[2]; +}; + +struct mvx_buffer_general_block_configs +{ + uint8_t blk_cfg_type; + #define MVX_BLOCK_CONFIGS_TYPE_NONE (0x00) + #define MVX_BLOCK_CONFIGS_TYPE_ROW_UNCOMP (0xff) + uint8_t reserved[3]; + union + { + struct mvx_buffer_general_rows_uncomp_hdr rows_uncomp; + } blk_cfgs; +}; + +struct mvx_buffer_general_ad_stats +{ + + uint32_t frame_averages; + // bitfields + #define MVX_AD_STATS_PIC_AVGS_Y (0) + #define MVX_AD_STATS_PIC_AVGS_Y_SZ (12) + #define MVX_AD_STATS_PIC_AVGS_CB (12) + #define MVX_AD_STATS_PIC_AVGS_CB_SZ (10) + #define MVX_AD_STATS_PIC_AVGS_CR (22) + #define MVX_AD_STATS_PIC_AVGS_CR_SZ (10) + uint16_t thumbnail_width; + uint16_t thumbnail_height; + uint8_t ad_stats_flags; + #define MVX_AD_STATS_PIC_FMT_PROGRESSIVE (0) + #define MVX_AD_STATS_PIC_FMT_INTERLACED (1) + uint8_t reserved[3]; +}; + + +struct mvx_buffer_general_hdr +{ + /* For identification of the buffer, this is not changed by the firmware. */ + uint64_t host_handle; + + /* this depends upon the type of the general purpose buffer */ + uint64_t user_data_tag; + + /* pointer to the buffer containing the general purpose data. the format + * of this data is defined by the configuration in the mve_buffer_general */ + uint32_t buffer_ptr; + + /* size of the buffer pointed to by buffer_ptr */ + uint32_t buffer_size; + + /* selects the type of semantics to use for the general purpose buffer. it + * tags (or discriminates) the union config member in mve_buffer_general + */ + uint16_t type; /* Extra data: */ + + #define MVX_BUFFER_GENERAL_TYPE_INVALID (0) /* invalid */ + #define MVX_BUFFER_GENERAL_TYPE_BLOCK_CONFIGS (1) /* block_configs */ + #define MVX_BUFFER_GENERAL_TYPE_AD_STATS (2) /* assertive display statistics */ + + /* size of the mve_buffer_general config member */ + uint16_t config_size; + + /* pad to force 8-byte alignment */ + uint32_t reserved; +}; + +struct mvx_buffer_general +{ + struct mvx_buffer_general_hdr header; + + /* used to describe the configuration of the general purpose buffer data + * pointed to be buffer_ptr + */ + union + { + struct mvx_buffer_general_block_configs block_configs; + struct mvx_buffer_general_ad_stats ad_stats; + } config; +}; + +struct mvx_enc_stats +{ + uint32_t mms_buffer_size; + uint32_t bitcost_buffer_size; + uint32_t qp_buffer_size; + uint32_t flags; + //ENC_STATS_FLAGS + #define MVX_BUFFER_ENC_STATS_FLAG_MMS (1<<0) + #define MVX_BUFFER_ENC_STATS_FLAG_BITCOST (1<<1) + #define MVX_BUFFER_ENC_STATS_FLAG_QP (1<<2) + #define MVX_BUFFER_ENC_STATS_FLAG_DROP (1<<3) + uint32_t pic_index; +}; + +/** + * struct mvx_buffer - Buffer descriptor. + * @dev: Pointer to device. + * @mmu: Pointer to MMU. + * @head: List head used to add buffer to various queues. + * @format: Bitstream or frame format. + * @dir: Direction the buffer was allocated for. + * @user_data: User data copied from input- to output buffer. + * @flags: Buffer flags. + * @width: Frame width in pixels. + * @height: Frame height in pixels. + * @crop_left: Left crop in pixels. + * @crop_top: Top crop in pixels. + * @nplanes: Number of planes. + * @planes: Array or planes. + */ +struct mvx_buffer { + struct device *dev; + struct mvx_mmu *mmu; + struct list_head head; + enum mvx_format format; + enum mvx_direction dir; + uint64_t user_data; + unsigned int flags; + unsigned int width; + unsigned int height; + unsigned int crop_left; + unsigned int crop_top; + unsigned int nplanes; + uint32_t offset; + struct mvx_buffer_plane planes[MVX_BUFFER_NPLANES]; + struct mvx_buffer_general general; + uint8_t frame_type; + uint8_t src_transform; + uint16_t bitstream_remaining_kb; +}; + +#define MVX_BUFFER_EOS 0x00000001 +#define MVX_BUFFER_EOF 0x00000002 +#define MVX_BUFFER_CORRUPT 0x00000004 +#define MVX_BUFFER_REJECTED 0x00000008 +#define MVX_BUFFER_DECODE_ONLY 0x00000010 +#define MVX_BUFFER_CODEC_CONFIG 0x00000020 +#define MVX_BUFFER_AFBC_TILED_HEADERS 0x00000040 +#define MVX_BUFFER_AFBC_TILED_BODY 0x00000080 +#define MVX_BUFFER_AFBC_32X8_SUPERBLOCK 0x00000100 +#define MVX_BUFFER_INTERLACE 0x00000200 +#define MVX_BUFFER_END_OF_SUB_FRAME 0x00000400 +#define MVX_BUFFER_FRAME_PRESENT 0x00000800 + +#define MVX_BUFFER_FRAME_FLAG_ROTATION_90 0x00001000 /* Frame is rotated 90 degrees */ +#define MVX_BUFFER_FRAME_FLAG_ROTATION_180 0x00002000 /* Frame is rotated 180 degrees */ +#define MVX_BUFFER_FRAME_FLAG_ROTATION_270 0x00003000 /* Frame is rotated 270 degrees */ +#define MVX_BUFFER_FRAME_FLAG_ROTATION_MASK 0x00003000 + +#define MVX_BUFFER_FRAME_FLAG_MIRROR_HORI 0x00010000 +#define MVX_BUFFER_FRAME_FLAG_MIRROR_VERT 0x00020000 +#define MVX_BUFFER_FRAME_FLAG_MIRROR_MASK 0x00030000 + +#define MVX_BUFFER_FRAME_FLAG_SCALING_2 0x00004000 /* Frame is scaled by half */ +#define MVX_BUFFER_FRAME_FLAG_SCALING_4 0x00008000 /* Frame is scaled by quarter */ +#define MVX_BUFFER_FRAME_FLAG_SCALING_MASK 0x0000C000 + +#define MVX_BUFFER_FRAME_FLAG_GENERAL 0x00040000 /* Frame is a general buffer */ +#define MVX_BUFFER_FRAME_FLAG_ROI 0x00080000 /* This buffer has a roi region */ +#define MVX_BUFFER_FRAME_FLAG_CHR 0x01000000 + +#define MVX_BUFFER_FRAME_NEED_REALLOC 0x00100000 /* This buffer needs realloc */ +#define MVX_BUFFER_FRAME_FLAG_GOP_REST 0x00200000 /* This buffer needs gop reset */ +#define MVX_BUFFER_FRAME_FLAG_LTR_REST 0x00400000 +#define MVX_BUFFER_FRAME_FLAG_FORCE_IDR (0x00800000) +#define MVX_BUFFER_ENC_STATS 0x02000000 + +#define MVX_BUFFER_FRAME_FLAG_OSD_1 0x04000000 +#define MVX_BUFFER_FRAME_FLAG_OSD_2 0x08000000 +#define MVX_BUFFER_FRAME_FLAG_OSD_MASK 0x0C000000 + + +/**************************************************************************** + * External functions + ****************************************************************************/ + +/** + * mvx_buffer_construct() - Construct the buffer object. + * @buf: Pointer to buffer. + * @dev: Pointer to device. + * @mmu: Pointer to MMU. + * @dir: Which direction the buffer was allocated for. + * @nplanes: Number of planes. + * @sgt: Array with SG tables. Each table contains a list of memory + * pages for corresponding plane. + * + * Return: 0 on success, else error code. + */ +int mvx_buffer_construct(struct mvx_buffer *buf, + struct device *dev, + struct mvx_mmu *mmu, + enum mvx_direction dir, + unsigned int nplanes, + struct sg_table **sgt); + +/** + * mvx_buffer_construct() - Destruct the buffer object. + * @buf: Pointer to buffer. + */ +void mvx_buffer_destruct(struct mvx_buffer *buf); + +/** + * mvx_buffer_map() - Map the buffer to the MVE virtual address space. + * @buf: Pointer to buffer. + * @begin: MVE virtual begin address. + * @end: MVE virtual end address. + * + * Try to MMU map the buffer anywhere between the begin and end addresses. + * + * Return: 0 on success, else error code. + */ +int mvx_buffer_map(struct mvx_buffer *buf, + mvx_mmu_va begin, + mvx_mmu_va end); + +/** + * mvx_buffer_unmap() - Unmap the buffer from the MVE virtual address space. + * @buf: Pointer to buffer. + */ +void mvx_buffer_unmap(struct mvx_buffer *buf); + +/** + * mvx_buffer_is_mapped() - Return if buffer has been mapped. + * @buf: Pointer to buffer. + * + * Return: True if mapped, else false. + */ +bool mvx_buffer_is_mapped(struct mvx_buffer *buf); + +/** + * mvx_buffer_synch() - Synch the data caches. + * @buf: Pointer to buffer. + * @dir: Data direction. + * + * Return: 0 on success, else error code. + */ +int mvx_buffer_synch(struct mvx_buffer *buf, + enum dma_data_direction dir); + +/** + * mvx_buffer_clear() - Clear and empty the buffer. + * @buf: Pointer to buffer. + */ +void mvx_buffer_clear(struct mvx_buffer *buf); + +/** + * mvx_buffer_filled_set() - Set filled bytes for each plane. + * @buf: Pointer to buffer. + * @plane: Plane index. + * @filled: Number of bytes filled. + * @offset: Number of bytes offset. + * + * Return: 0 on success, else error code. + */ +int mvx_buffer_filled_set(struct mvx_buffer *buf, + unsigned int plane, + unsigned int filled, + unsigned int offset); + +/** + * mvx_buffer_size() - Get size in bytes for a plane. + * @buf: Pointer to buffer. + * @plane: Which plane to get size for. + * + * Return: Size of plane. + */ +size_t mvx_buffer_size(struct mvx_buffer *buf, + unsigned int plane); + +/** + * mvx_buffer_va() - Get VA for a plane. + * @buf: Pointer to buffer. + * @plane: Plane index. + * + * Return: VA address of plane, 0 if unmapped. + */ +mvx_mmu_va mvx_buffer_va(struct mvx_buffer *buf, + unsigned int plane); + +/** + * mvx_buffer_frame_dim() - Get frame buffer dimensions. + * @format: Bitstream or frame format. + * @width: Width in pixels. + * @height: Height in pixels. + * @nplanes: Number of planes for this format. + * @stride: Horizontal stride in bytes. + * @size: Size in bytes for each plane. + * + * If *nplanes is larger than 0 then the stride is used as input to tell this + * function which stride that is desired, but it might be modified if the + * stride is too short or not optimal for the MVE hardware. + * + * Return: 0 on success, else error code. + */ +int mvx_buffer_frame_dim(enum mvx_format format, + unsigned int width, + unsigned int height, + uint8_t *nplanes, + unsigned int *stride, + unsigned int *size, + unsigned int *setting_stride); + +/** + * mvx_buffer_frame_set() - Set frame dimensions. + * @buf: Pointer to buffer. + * @format: Bitstream or frame format. + * @width: Width in pixels. + * @height: Height in pixels. + * @stride: Horizontal stride in bytes. + * @size: Size in bytes for each plane. + * @interlaced: Defines if the buffer is interlaced. + * + * Return: 0 on success, else error code. + */ +int mvx_buffer_frame_set(struct mvx_buffer *buf, + enum mvx_format format, + unsigned int width, + unsigned int height, + unsigned int *stride, + unsigned int *size, + bool interlaced); + +/** + * mvx_buffer_afbc_set() - Set AFBC dimensions. + * @buf: Pointer to buffer. + * @format: Bitstream or frame format. + * @width: Width in pixels. + * @height: Height in pixels. + * @afbc_width: AFBC width in superblocks. + * @size: Size in bytes for AFBC plane. + * @interlaced: Defines if the buffer is interlaced. + * + * Return: 0 on success, else error code. + */ +int mvx_buffer_afbc_set(struct mvx_buffer *buf, + enum mvx_format format, + unsigned int width, + unsigned int height, + unsigned int afbc_width, + unsigned int size, + bool interlaced); + +/** + * mvx_buffer_show() - Print debug information into seq-file. + * @buf: Pointer to buffer. + * @s: Seq-file to print to. + */ +void mvx_buffer_show(struct mvx_buffer *buf, + struct seq_file *s); + +#endif /* _MVX_BUFFER_H_ */ diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_dev.c b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_dev.c new file mode 100755 index 000000000..70bd9767e --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_dev.c @@ -0,0 +1,691 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +/**************************************************************************** + * Includes + ****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "mvx_bitops.h" +#include "mvx_dev.h" +#include "mvx_hwreg.h" +#include "mvx_if.h" +#include "mvx_scheduler.h" +#include "mvx_session.h" +#include "mvx_log_group.h" +#include "mvx_pm_runtime.h" + +/**************************************************************************** + * Defines + ****************************************************************************/ + +/** + * Name of the MVx dev device. + */ +#define MVX_DEV_NAME "amvx_dev" + +#define MVX_PCI_VENDOR 0x13b5 +#define MVX_PCI_DEVICE 0x0001 + +/**************************************************************************** + * Types + ****************************************************************************/ + +/** + * struct mvx_dev_ctx - Private context for the MVx dev device. + */ +struct mvx_dev_ctx { + struct device *dev; + struct clk* clk; + struct mvx_if_ops *if_ops; + struct mvx_client_ops client_ops; + struct mvx_hwreg hwreg; + struct mvx_sched scheduler; + unsigned int irq; + struct workqueue_struct *work_queue; + struct work_struct work; + unsigned long irqve; + struct dentry *dentry; +}; + +/** + * struct mvx_client_session - Device session. + * + * When the if module registers a session this structure is returned. + */ +struct mvx_client_session { + struct mvx_dev_ctx *ctx; + struct mvx_sched_session session; +}; + +/**************************************************************************** + * Static variables and functions + ****************************************************************************/ + +static struct mvx_dev_ctx *client_ops_to_ctx(struct mvx_client_ops *client) +{ + return container_of(client, struct mvx_dev_ctx, client_ops); +} + +static void get_hw_ver(struct mvx_client_ops *client, + struct mvx_hw_ver *hw_ver) +{ + struct mvx_dev_ctx *ctx = client_ops_to_ctx(client); + + int ret = 0; + + ret = mvx_pm_runtime_get_sync(ctx->dev); + if (ret < 0) { + hw_ver->id = MVE_Unknown; + return; + } + + hw_ver->id = mvx_hwreg_get_hw_id(&ctx->hwreg, &hw_ver->revision, + &hw_ver->patch); + + ret = mvx_pm_runtime_put_sync(ctx->dev); + if (ret < 0) + hw_ver->id = MVE_Unknown; +} + +static void get_formats(struct mvx_client_ops *client, + enum mvx_direction direction, + uint64_t *formats) +{ + struct mvx_dev_ctx *ctx = client_ops_to_ctx(client); + uint32_t fuses; + + int ret = 0; + + *formats = 0; + + ret = mvx_pm_runtime_get_sync(ctx->dev); + if (ret < 0) + return; + + ctx->hwreg.ops.get_formats(direction, formats); + + /* Remove formats based on fuses. */ + fuses = mvx_hwreg_read(&ctx->hwreg, MVX_HWREG_FUSE); + + if (fuses & MVX_HWREG_FUSE_DISABLE_AFBC) { + mvx_clear_bit(MVX_FORMAT_YUV420_AFBC_8, formats); + mvx_clear_bit(MVX_FORMAT_YUV420_AFBC_10, formats); + mvx_clear_bit(MVX_FORMAT_YUV422_AFBC_8, formats); + mvx_clear_bit(MVX_FORMAT_YUV422_AFBC_10, formats); + } + + if (fuses & MVX_HWREG_FUSE_DISABLE_REAL) + mvx_clear_bit(MVX_FORMAT_RV, formats); + + if (fuses & MVX_HWREG_FUSE_DISABLE_VPX) { + mvx_clear_bit(MVX_FORMAT_VP8, formats); + mvx_clear_bit(MVX_FORMAT_VP9, formats); + } + + if (fuses & MVX_HWREG_FUSE_DISABLE_HEVC) + mvx_clear_bit(MVX_FORMAT_HEVC, formats); + + ret = mvx_pm_runtime_put_sync(ctx->dev); + if (ret < 0) + *formats = 0; +} + +static unsigned int get_ncores(struct mvx_client_ops *client) +{ + struct mvx_dev_ctx *ctx = client_ops_to_ctx(client); + uint32_t ncores; + + int ret = 0; + + ret = mvx_pm_runtime_get_sync(ctx->dev); + if (ret < 0) + return 0; + + ncores = mvx_hwreg_read(&ctx->hwreg, MVX_HWREG_NCORES); + + ret = mvx_pm_runtime_put_sync(ctx->dev); + if (ret < 0) + return 0; + + return ncores; +} + +static struct mvx_client_session *register_session( + struct mvx_client_ops *client, + struct mvx_if_session *isession) +{ + struct mvx_dev_ctx *ctx = client_ops_to_ctx(client); + struct mvx_client_session *csession; + int ret; + + csession = devm_kzalloc(ctx->dev, sizeof(*csession), GFP_KERNEL); + if (csession == NULL) + return ERR_PTR(-ENOMEM); + + csession->ctx = ctx; + + ret = mvx_pm_runtime_get_sync(ctx->dev); + if (ret < 0) + goto free_session; + + ret = mvx_sched_session_construct(&csession->session, isession); + if (ret != 0) + goto runtime_put; + + MVX_LOG_PRINT(&mvx_log_dev, MVX_LOG_INFO, + "Register client session. csession=0x%p, isession=0x%p.", + csession, isession); + + return csession; + +runtime_put: + mvx_pm_runtime_put_sync(csession->ctx->dev); +free_session: + devm_kfree(ctx->dev, csession); + + return ERR_PTR(ret); +} + +static void unregister_session(struct mvx_client_session *csession) +{ + MVX_LOG_PRINT(&mvx_log_dev, MVX_LOG_INFO, + "%p Unregister client session. csession=0x%p.", + mvx_if_session_to_session(csession->session.isession), + csession); + + mvx_sched_terminate(&csession->ctx->scheduler, &csession->session); + mvx_sched_session_destruct(&csession->session); + + mvx_pm_runtime_put_sync(csession->ctx->dev); + + devm_kfree(csession->ctx->dev, csession); +} + +static int switch_in(struct mvx_client_session *csession) +{ + struct mvx_dev_ctx *ctx = csession->ctx; + int ret; + + ret = mvx_sched_switch_in(&ctx->scheduler, &csession->session); + + return ret; +} + +static int send_irq(struct mvx_client_session *csession) +{ + struct mvx_dev_ctx *ctx = csession->ctx; + int ret; + + ret = mvx_sched_send_irq(&ctx->scheduler, &csession->session); + + return ret; +} + +static int flush_mmu(struct mvx_client_session *csession) +{ + struct mvx_dev_ctx *ctx = csession->ctx; + int ret; + + ret = mvx_sched_flush_mmu(&ctx->scheduler, &csession->session); + + return ret; +} + +static void print_debug(struct mvx_client_session *csession) +{ + struct mvx_dev_ctx *ctx = csession->ctx; + + mvx_sched_print_debug(&ctx->scheduler, &csession->session); +} + +static struct mvx_dev_ctx *work_to_ctx(struct work_struct *work) +{ + return container_of(work, struct mvx_dev_ctx, work); +} + +/** + * irq_bottom() - Handle IRQ bottom. + * @work: Work struct that is part of the context structure. + * + * This function is called from a work queue and id doing the actual work of + * handling the interrupt. + */ +static void irq_bottom(struct work_struct *work) +{ + struct mvx_dev_ctx *ctx = work_to_ctx(work); + uint32_t nlsid; + uint32_t i; + + nlsid = mvx_hwreg_read(&ctx->hwreg, MVX_HWREG_NLSID); + for (i = 0; i < nlsid; i++) + if (test_and_clear_bit(i, &ctx->irqve)) + mvx_sched_handle_irq(&ctx->scheduler, i); +} + +/** + * irq_top() - Handle IRQ top. + * @irq: IRQ number. + * @dev_id: Pointer to context. + * + * This function is called in interrupt context. It should be short and must not + * block. + * + * Return: IRQ status if the IRQ was handled or not. + */ +static irqreturn_t irq_top(int irq, + void *dev_id) +{ + struct mvx_dev_ctx *ctx = dev_id; + uint32_t nlsid; + uint32_t irqve; + int ret = IRQ_NONE; + + nlsid = mvx_hwreg_read(&ctx->hwreg, MVX_HWREG_NLSID); + irqve = mvx_hwreg_read(&ctx->hwreg, MVX_HWREG_IRQVE); + while (nlsid-- > 0) + if ((irqve >> nlsid) & 0x1) { + mvx_hwreg_write_lsid(&ctx->hwreg, + nlsid, + MVX_HWREG_LIRQVE, + 0); + set_bit(nlsid, &ctx->irqve); + ret = IRQ_HANDLED; + } + + queue_work(ctx->work_queue, &ctx->work); + + return ret; +} + +static int mvx_dev_probe(struct device *dev, + struct resource *iores, + struct resource *irqres) +{ + struct mvx_dev_ctx *ctx; + int ret; + + /* Create device context and store pointer in device private data. */ + ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL); + if (ctx == NULL) + return -EINVAL; + + ctx->dev = dev; + + dev_set_drvdata(dev, ctx); + + ret = mvx_pm_runtime_get_sync(ctx->dev); + if (ret < 0) + goto free_ctx; + +#ifdef ENABLE_PM_CLK + ctx->clk = devm_clk_get(dev, "vpu"); + clk_prepare_enable(ctx->clk); +#endif + + /* Setup client ops callbacks. */ + ctx->client_ops.get_hw_ver = get_hw_ver; + ctx->client_ops.get_formats = get_formats; + ctx->client_ops.get_ncores = get_ncores; + ctx->client_ops.register_session = register_session; + ctx->client_ops.unregister_session = unregister_session; + ctx->client_ops.switch_in = switch_in; + ctx->client_ops.send_irq = send_irq; + ctx->client_ops.flush_mmu = flush_mmu; + ctx->client_ops.print_debug = print_debug; + + /* Create if context. */ + ctx->if_ops = mvx_if_create(dev, &ctx->client_ops, ctx); + if (IS_ERR(ctx->if_ops)) + goto runtime_put; + + /* Create debugfs entry */ + if (IS_ENABLED(CONFIG_DEBUG_FS)) { + char name[20]; + + scnprintf(name, sizeof(name), "%s%u", MVX_DEV_NAME, dev->id); + ctx->dentry = debugfs_create_dir(name, NULL); + if (IS_ERR_OR_NULL(ctx->dentry)) { + ret = -EINVAL; + goto destroy_if; + } + } + + /* Construct hw register context. */ + ret = mvx_hwreg_construct(&ctx->hwreg, dev, iores, ctx->dentry); + if (ret != 0) + goto destruct_dentry; + + ret = mvx_sched_construct(&ctx->scheduler, dev, ctx->if_ops, + &ctx->hwreg, ctx->dentry); + if (ret != 0) + goto destruct_hwreg; + + /* Create work queue for IRQ handler. */ + ctx->work_queue = alloc_workqueue(dev_name(dev), WQ_UNBOUND, 1); + if (ctx->work_queue == NULL) { + MVX_LOG_PRINT(&mvx_log_dev, MVX_LOG_ERROR, + "Failed to create work queue."); + ret = -EINVAL; + goto destruct_sched; + } + + INIT_WORK(&ctx->work, irq_bottom); + + /* Request IRQ handler. */ + ctx->irq = irqres->start; + ret = request_irq(ctx->irq, irq_top, + IRQF_SHARED | (irqres->flags & IRQF_TRIGGER_MASK), + dev_name(dev), ctx); + if (ret != 0) { + MVX_LOG_PRINT(&mvx_log_dev, MVX_LOG_ERROR, + "Failed to request IRQ. irq=%u, ret=%d.", + ctx->irq, + ret); + goto workqueue_destroy; + } + + MVX_LOG_PRINT(&mvx_log_dev, MVX_LOG_WARNING, + "Linlon v%x identified. cores=%u, nlsid=%u, id=%u.", + mvx_hwreg_get_hw_id(&ctx->hwreg, NULL, NULL), + mvx_hwreg_read(&ctx->hwreg, MVX_HWREG_NCORES), + mvx_hwreg_read(&ctx->hwreg, MVX_HWREG_NLSID), + dev->id); + + ret = mvx_pm_runtime_put_sync(ctx->dev); + if (ret < 0) + goto irq_free; + + return 0; + +irq_free: + free_irq(ctx->irq, ctx); + +workqueue_destroy: + destroy_workqueue(ctx->work_queue); + +destruct_sched: + mvx_sched_destruct(&ctx->scheduler); + +destruct_hwreg: + mvx_hwreg_destruct(&ctx->hwreg); + +destruct_dentry: + if (IS_ENABLED(CONFIG_DEBUG_FS)) + debugfs_remove_recursive(ctx->dentry); + +destroy_if: + mvx_if_destroy(ctx->if_ops); + +runtime_put: + pm_runtime_put_sync(ctx->dev); + +free_ctx: + devm_kfree(dev, ctx); + + return ret; +} + +static int mvx_dev_remove(struct mvx_dev_ctx *ctx) +{ + MVX_LOG_PRINT(&mvx_log_dev, MVX_LOG_INFO, "remove"); + + mvx_if_destroy(ctx->if_ops); + free_irq(ctx->irq, ctx); + destroy_workqueue(ctx->work_queue); + mvx_sched_destruct(&ctx->scheduler); + mvx_hwreg_destruct(&ctx->hwreg); + dev_set_drvdata(ctx->dev, NULL); + + if (IS_ENABLED(CONFIG_DEBUG_FS)) + debugfs_remove_recursive(ctx->dentry); +#ifdef ENABLE_PM_CLK + clk_disable_unprepare(ctx->clk); +#endif + devm_kfree(ctx->dev, ctx); + + return 0; +} + +/**************************************************************************** + * Platform driver + ****************************************************************************/ + +static int mvx_pdev_probe(struct platform_device *pdev) +{ + struct resource iores; + struct resource irqres; + unsigned int irq; + int ret; + + MVX_LOG_PRINT(&mvx_log_dev, MVX_LOG_INFO, "probe"); + + /* Get resource. */ + ret = of_address_to_resource(pdev->dev.of_node, 0, &iores); + if (ret != 0) { + MVX_LOG_PRINT(&mvx_log_dev, MVX_LOG_ERROR, + "Failed to get address of resource. ret=%d.", + ret); + return ret; + } + + /* Get IRQ resource. */ + irq = of_irq_to_resource(pdev->dev.of_node, 0, &irqres); + if (irq == 0) { + MVX_LOG_PRINT(&mvx_log_dev, MVX_LOG_ERROR, + "Failed to get IRQ resource."); + return -EINVAL; + } + +#ifdef ENABLE_PM_CLK + pm_runtime_enable(&pdev->dev); +#endif + + ret = mvx_dev_probe(&pdev->dev, &iores, &irqres); + +#ifdef ENABLE_PM_CLK + if (ret != 0) + pm_runtime_disable(&pdev->dev); +#endif + return ret; +} + +static int mvx_pdev_remove(struct platform_device *pdev) +{ + struct mvx_dev_ctx *ctx = platform_get_drvdata(pdev); + int ret; + + MVX_LOG_PRINT(&mvx_log_dev, MVX_LOG_INFO, "pdev remove"); + + ret = mvx_dev_remove(ctx); + +#ifdef ENABLE_PM_CLK + pm_runtime_disable(&pdev->dev); +#endif + return ret; +} + +#ifdef CONFIG_PM + +static int mvx_pm_suspend(struct device *dev) +{ + MVX_LOG_PRINT(&mvx_log_dev, MVX_LOG_INFO, "mvx_pm_suspend"); + return 0; +} + +static int mvx_pm_resume(struct device *dev) +{ + MVX_LOG_PRINT(&mvx_log_dev, MVX_LOG_INFO, "mvx_pm_resume"); + return 0; +} + +static int mvx_pm_runtime_suspend(struct device *dev) +{ + MVX_LOG_PRINT(&mvx_log_dev, MVX_LOG_INFO, "mvx_pm_runtime_suspend"); + return 0; +} + +static int mvx_pm_runtime_resume(struct device *dev) +{ + MVX_LOG_PRINT(&mvx_log_dev, MVX_LOG_INFO, "mvx_pm_runtime_resume"); + return 0; +} + +static int mvx_pm_runtime_idle(struct device *dev) +{ + MVX_LOG_PRINT(&mvx_log_dev, MVX_LOG_INFO, "mvx_pm_runtime_idle"); + return 0; +} + +static const struct dev_pm_ops mvx_dev_pm_ops = { + .suspend = mvx_pm_suspend, + .resume = mvx_pm_resume, + .runtime_suspend = mvx_pm_runtime_suspend, + .runtime_resume = mvx_pm_runtime_resume, + .runtime_idle = mvx_pm_runtime_idle, +}; +#endif /* CONFIG_PM */ + +static const struct of_device_id mvx_dev_match_table[] = { + { .compatible = "arm,mali-mve" }, + { .compatible = "arm,mali-v500" }, + { .compatible = "arm,mali-v550" }, + { .compatible = "arm,mali-v61" }, + { .compatible = "armChina,linlon-v5" }, + { .compatible = "armChina,linlon-v6" }, + { .compatible = "armChina,linlon-v7" }, + { .compatible = "armChina,linlon-v8" }, + { { 0 } } +}; + +static struct platform_driver mvx_dev_driver = { + .probe = mvx_pdev_probe, + .remove = mvx_pdev_remove, + .driver = { + .name = MVX_DEV_NAME, + .owner = THIS_MODULE, + .of_match_table = mvx_dev_match_table, +#ifdef CONFIG_PM + .pm = &mvx_dev_pm_ops +#endif /* CONFIG_PM */ + } +}; + +/**************************************************************************** + * PCI driver + ****************************************************************************/ + +/* LCOV_EXCL_START */ +static int mvx_pci_probe(struct pci_dev *pdev, + const struct pci_device_id *id) +{ + static unsigned int dev_id; + struct resource irqres = { + .start = pdev->irq, + .end = pdev->irq, + .flags = 0 + }; + pdev->dev.id = dev_id++; + return mvx_dev_probe(&pdev->dev, &pdev->resource[1], &irqres); +} + +static void mvx_pci_remove(struct pci_dev *pdev) +{ + struct mvx_dev_ctx *ctx = pci_get_drvdata(pdev); + + mvx_dev_remove(ctx); +} + +static struct pci_device_id mvx_pci_device_id[] = { + { PCI_DEVICE(MVX_PCI_VENDOR, + MVX_PCI_DEVICE) }, + { 0, } +}; + +MODULE_DEVICE_TABLE(pci, mvx_pci_device_id); + +static struct pci_driver mvx_pci_driver = { + .name = MVX_DEV_NAME, + .id_table = mvx_pci_device_id, + .probe = mvx_pci_probe, + .remove = mvx_pci_remove +}; +/* LCOV_EXCL_STOP */ + +/**************************************************************************** + * Exported variables and functions + ****************************************************************************/ + +int mvx_dev_init(void) +{ + int ret; + + ret = platform_driver_register(&mvx_dev_driver); + if (ret != 0) { + pr_err("mvx_dev: Failed to register driver.\n"); + return ret; + } + + /* LCOV_EXCL_START */ + ret = pci_register_driver(&mvx_pci_driver); + if (ret != 0) { + pr_err("mvx_dev: Failed to register PCI driver.\n"); + goto unregister_driver; + } + + /* LCOV_EXCL_STOP */ + + return 0; + +unregister_driver: + platform_driver_unregister(&mvx_dev_driver); /* LCOV_EXCL_LINE */ + + return ret; +} + +void mvx_dev_exit(void) +{ + pci_unregister_driver(&mvx_pci_driver); /* LCOV_EXCL_LINE */ + platform_driver_unregister(&mvx_dev_driver); +} diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_dev.h b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_dev.h new file mode 100755 index 000000000..70ddc959e --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_dev.h @@ -0,0 +1,49 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef _MVX_DEV_H_ +#define _MVX_DEV_H_ + +/**************************************************************************** + * Exported functions + ****************************************************************************/ + +/** + * mvx_dev_init() - Initialize the dev device. + */ +int mvx_dev_init(void); + +/** + * mvx_dev_exit() - Remove and exit the dev device. + */ +void mvx_dev_exit(void); + +#endif /* _MVX_DEV_H_ */ diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_driver.c b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_driver.c new file mode 100755 index 000000000..832dc0b83 --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_driver.c @@ -0,0 +1,70 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include +#include +#include +#include "mvx_if.h" +#include "mvx_dev.h" +#include "mvx_log_group.h" + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("ARMChina"); +MODULE_DESCRIPTION("Tiube VPU Driver."); + +static int __init mvx_init(void) +{ + int ret; + + ret = mvx_log_group_init("amvx"); + if (ret != 0) { + pr_err("Failed to create MVx driver logging.\n"); + return ret; + } + + ret = mvx_dev_init(); + if (ret != 0) { + pr_err("Failed to register MVx dev driver.\n"); + mvx_log_group_deinit(); + return ret; + } + + return 0; +} + +static void __exit mvx_exit(void) +{ + mvx_dev_exit(); + mvx_log_group_deinit(); +} + +module_init(mvx_init); +module_exit(mvx_exit); diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_ext_if.h b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_ext_if.h new file mode 100755 index 000000000..bea6b0d37 --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_ext_if.h @@ -0,0 +1,87 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef _MVX_EXT_H_ +#define _MVX_EXT_H_ + +/**************************************************************************** + * Includes + ****************************************************************************/ + +#include +#include +#include + +/**************************************************************************** + * Types + ****************************************************************************/ + +struct device; +struct mvx_csched; +struct mvx_fw_cache; + +struct mvx_ext_if { + struct mutex lock; + struct device *dev; + struct mvx_fw_cache *cache; + struct mvx_client_ops *client_ops; + struct video_device vdev; + struct v4l2_device v4l2_dev; + struct dentry *dsessions; +}; + +/**************************************************************************** + * Exported functions + ****************************************************************************/ + +/** + * mvx_ext_if_construct() - Construct the external interface object. + * @ext: Pointer to interface object. + * @dev: Pointer to device struct. + * @cache: Pointer to firmware cache. + * @client_ops: Pointer to client client_ops. + * @parent: Parent debugfs directory entry. + * + * Return: 0 on success, else error code. + */ +int mvx_ext_if_construct(struct mvx_ext_if *ext, + struct device *dev, + struct mvx_fw_cache *cache, + struct mvx_client_ops *client_ops, + struct dentry *parent); + +/** + * mvx_ext_if_destruct() - Destroy external interface instance. + * @ext: Pointer to interface object. + */ +void mvx_ext_if_destruct(struct mvx_ext_if *ext); + +#endif /* _MVX_EXT_H_ */ diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_ext_v4l2.c b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_ext_v4l2.c new file mode 100755 index 000000000..ca2ac393e --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_ext_v4l2.c @@ -0,0 +1,183 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +/**************************************************************************** + * Includes + ****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "mvx_bitops.h" +#include "mvx_buffer.h" +#include "mvx_ext_if.h" +#include "mvx_firmware.h" +#include "mvx_if.h" +#include "mvx_mmu.h" +#include "mvx_session.h" + +#include "mvx_v4l2_buffer.h" +#include "mvx_v4l2_session.h" +#include "mvx_v4l2_vidioc.h" +#include "mvx_v4l2_fops.h" +#include "mvx_log_group.h" + +static const struct v4l2_file_operations mvx_v4l2_fops = { + .owner = THIS_MODULE, + .open = mvx_v4l2_open, + .release = mvx_v4l2_release, + .poll = mvx_v4l2_poll, + .unlocked_ioctl = video_ioctl2, + .mmap = mvx_v4l2_mmap +}; + +static const struct v4l2_ioctl_ops mvx_v4l2_ioctl_ops = { + .vidioc_querycap = mvx_v4l2_vidioc_querycap, + .vidioc_enum_fmt_vid_cap = mvx_v4l2_vidioc_enum_fmt_vid_cap, + .vidioc_enum_fmt_vid_out = mvx_v4l2_vidioc_enum_fmt_vid_out, +#if 0 + .vidioc_enum_fmt_vid_cap_mplane = mvx_v4l2_vidioc_enum_fmt_vid_cap, + .vidioc_enum_fmt_vid_out_mplane = mvx_v4l2_vidioc_enum_fmt_vid_out, +#endif + .vidioc_enum_framesizes = mvx_v4l2_vidioc_enum_framesizes, + .vidioc_g_fmt_vid_cap = mvx_v4l2_vidioc_g_fmt_vid_cap, + .vidioc_g_fmt_vid_cap_mplane = mvx_v4l2_vidioc_g_fmt_vid_cap, + .vidioc_g_fmt_vid_out = mvx_v4l2_vidioc_g_fmt_vid_out, + .vidioc_g_fmt_vid_out_mplane = mvx_v4l2_vidioc_g_fmt_vid_out, + .vidioc_s_fmt_vid_cap = mvx_v4l2_vidioc_s_fmt_vid_cap, + .vidioc_s_fmt_vid_cap_mplane = mvx_v4l2_vidioc_s_fmt_vid_cap, + .vidioc_s_fmt_vid_out = mvx_v4l2_vidioc_s_fmt_vid_out, + .vidioc_s_fmt_vid_out_mplane = mvx_v4l2_vidioc_s_fmt_vid_out, + .vidioc_try_fmt_vid_cap = mvx_v4l2_vidioc_try_fmt_vid_cap, + .vidioc_try_fmt_vid_cap_mplane = mvx_v4l2_vidioc_try_fmt_vid_cap, + .vidioc_try_fmt_vid_out = mvx_v4l2_vidioc_try_fmt_vid_out, + .vidioc_try_fmt_vid_out_mplane = mvx_v4l2_vidioc_try_fmt_vid_out, +#if 0 + .vidioc_g_crop = mvx_v4l2_vidioc_g_crop, +#else + .vidioc_g_selection = mvx_v4l2_vidioc_g_selection, +#endif + .vidioc_streamon = mvx_v4l2_vidioc_streamon, + .vidioc_streamoff = mvx_v4l2_vidioc_streamoff, + .vidioc_encoder_cmd = mvx_v4l2_vidioc_encoder_cmd, + .vidioc_try_encoder_cmd = mvx_v4l2_vidioc_try_encoder_cmd, + .vidioc_decoder_cmd = mvx_v4l2_vidioc_decoder_cmd, + .vidioc_try_decoder_cmd = mvx_v4l2_vidioc_try_decoder_cmd, + .vidioc_reqbufs = mvx_v4l2_vidioc_reqbufs, + .vidioc_create_bufs = mvx_v4l2_vidioc_create_bufs, + .vidioc_querybuf = mvx_v4l2_vidioc_querybuf, + .vidioc_qbuf = mvx_v4l2_vidioc_qbuf, + .vidioc_dqbuf = mvx_v4l2_vidioc_dqbuf, + .vidioc_subscribe_event = mvx_v4l2_vidioc_subscribe_event, + .vidioc_unsubscribe_event = v4l2_event_unsubscribe, + .vidioc_default = mvx_v4l2_vidioc_default +}; + +/**************************************************************************** + * Exported functions and variables + ****************************************************************************/ + +int mvx_ext_if_construct(struct mvx_ext_if *ext, + struct device *dev, + struct mvx_fw_cache *cache, + struct mvx_client_ops *client_ops, + struct dentry *parent) +{ + int ret; + const char name[] = "mvx"; + + ext->dev = dev; + ext->cache = cache; + ext->client_ops = client_ops; + mutex_init(&ext->lock); + + if (IS_ENABLED(CONFIG_DEBUG_FS)) { + ext->dsessions = debugfs_create_dir("session", parent); + if (IS_ERR_OR_NULL(ext->dsessions)) + return -ENOMEM; + } + + ret = v4l2_device_register(dev, &ext->v4l2_dev); + + if (ret != 0) { + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_ERROR, + "Failed to register V4L2 device. ret=%d.", ret); + goto delete_dentry; + } + + /* Video device. */ + ext->vdev.fops = &mvx_v4l2_fops; + ext->vdev.ioctl_ops = &mvx_v4l2_ioctl_ops; + ext->vdev.release = video_device_release_empty; + ext->vdev.vfl_dir = VFL_DIR_M2M; + ext->vdev.v4l2_dev = &ext->v4l2_dev; + ext->vdev.device_caps = V4L2_CAP_VIDEO_M2M |V4L2_CAP_VIDEO_M2M_MPLANE | V4L2_CAP_EXT_PIX_FORMAT | V4L2_CAP_STREAMING; + // ext->vdev.device_caps = V4L2_CAP_VIDEO_M2M |V4L2_CAP_VIDEO_M2M_MPLANE | V4L2_CAP_EXT_PIX_FORMAT | V4L2_CAP_STREAMING | \ + // V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_VIDEO_OUTPUT_MPLANE | V4L2_CAP_DEVICE_CAPS; + strncpy(ext->vdev.name, name, sizeof(ext->vdev.name)); + + video_set_drvdata(&ext->vdev, ext); + + ret = video_register_device(&ext->vdev, /*VFL_TYPE_SUBDEV*/VFL_TYPE_VIDEO, -1); + + if (ret != 0) { + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_ERROR, + "Failed to register video device. ret=%d.", + ret); + goto unregister_device; + } + + return 0; + +unregister_device: + v4l2_device_unregister(&ext->v4l2_dev); + +delete_dentry: + if (IS_ENABLED(CONFIG_DEBUG_FS)) + debugfs_remove_recursive(ext->dsessions); + + return ret; +} + +void mvx_ext_if_destruct(struct mvx_ext_if *ext) +{ + video_unregister_device(&ext->vdev); + v4l2_device_unregister(&ext->v4l2_dev); + + if (IS_ENABLED(CONFIG_DEBUG_FS)) + debugfs_remove_recursive(ext->dsessions); +} diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_firmware.c b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_firmware.c new file mode 100755 index 000000000..a63920700 --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_firmware.c @@ -0,0 +1,600 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +/**************************************************************************** + * Includes + ****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "mvx_if.h" +#include "mvx_log_group.h" +#include "mvx_firmware_cache.h" +#include "mvx_firmware_priv.h" +#include "mvx_mmu.h" +#include "mvx_secure.h" +#include "mvx_seq.h" + +/**************************************************************************** + * Defines + ****************************************************************************/ + +#define FW_TEXT_BASE_ADDR 0x1000u + +/**************************************************************************** + * Private functions + ****************************************************************************/ + +/** + * test_bit_32() - 32 bit version Linux test_bit. + * + * Test if bit is set in bitmap array. + */ +static bool test_bit_32(int bit, + const uint32_t *addr) +{ + return 0 != (addr[bit >> 5] & (1 << (bit & 0x1f))); +} + +/** + * get_major_version() - Get firmware major version. + * + * Return: Major version. + */ +static unsigned int get_major_version(const struct mvx_fw_bin *fw_bin) +{ + if (fw_bin->securevideo != false) + return fw_bin->secure.securefw->protocol.major; + else + return fw_bin->nonsecure.header->protocol_major; +} + +/** + * get_minor_version() - Get firmware minor version. + * + * Return: Minor version. + */ +static unsigned int get_minor_version(const struct mvx_fw_bin *fw_bin) +{ + if (fw_bin->securevideo != false) + return fw_bin->secure.securefw->protocol.minor; + else + return fw_bin->nonsecure.header->protocol_minor; +} + +/** + * fw_unmap() - Remove MMU mappings and release allocated memory. + */ +static void fw_unmap(struct mvx_fw *fw) +{ + unsigned int i; + uint32_t begin; + uint32_t end; + int ret; + + if (fw->fw_bin->securevideo == false) { + /* Unmap a region of 4 MB for each core. */ + for (i = 0; i < fw->ncores; i++) { + ret = fw->ops.get_region(MVX_FW_REGION_CORE_0 + i, + &begin, &end); + if (ret == 0) + mvx_mmu_unmap_va(fw->mmu, begin, + 4 * 1024 * 1024); + } + + if (!IS_ERR_OR_NULL(fw->text)) + mvx_mmu_free_pages(fw->text); + + if (!IS_ERR_OR_NULL(fw->bss)) + mvx_mmu_free_pages(fw->bss); + + if (!IS_ERR_OR_NULL(fw->bss_shared)) + mvx_mmu_free_pages(fw->bss_shared); + } + + fw->ops.unmap_protocol(fw); +} + +/** + * fw_map_core() - Map pages for the text and BSS segments for one core. + * + * This function assumes that the fw instance has been correctly allocated + * and instansiated and will therefor not make any NULL pointer checks. It + * assumes that all pointers - for example to the mmu or firmware binary - have + * been correctly set up. + */ +static int fw_map_core(struct mvx_fw *fw, + unsigned int core) +{ + int ret; + const struct mvx_fw_header *header = fw->fw_bin->nonsecure.header; + mvx_mmu_va fw_base; + mvx_mmu_va end; + mvx_mmu_va va; + unsigned int i; + unsigned int bss_cnt = core * fw->fw_bin->nonsecure.bss_cnt; + unsigned int bss_scnt = 0; + + /* + * Get the base address where the pages for this cores should be + * mapped. + */ + ret = fw->ops.get_region(MVX_FW_REGION_CORE_0 + core, &fw_base, &end); + if (ret != 0) + return ret; + + /* Map text segment. */ + ret = mvx_mmu_map_pages(fw->mmu, + fw_base + FW_TEXT_BASE_ADDR, + fw->text, + MVX_ATTR_PRIVATE, + MVX_ACCESS_EXECUTABLE); + if (ret != 0) + return ret; + + /* Map bss shared and private pages. */ + va = header->bss_start_address; + for (i = 0; i < header->bss_bitmap_size; i++) { + if (va >= header->master_rw_start_address && + va < (header->master_rw_start_address + + header->master_rw_size)) + ret = mvx_mmu_map_pa( + fw->mmu, + fw_base + va, + fw->bss_shared->pages[bss_scnt++], + MVE_PAGE_SIZE, + MVX_ATTR_PRIVATE, + MVX_ACCESS_READ_WRITE); + else if (test_bit_32(i, header->bss_bitmap)) + ret = mvx_mmu_map_pa(fw->mmu, + fw_base + va, + fw->bss->pages[bss_cnt++], + MVE_PAGE_SIZE, + MVX_ATTR_PRIVATE, + MVX_ACCESS_READ_WRITE); + + if (ret != 0) + return ret; + + va += MVE_PAGE_SIZE; + } + + return 0; +} + +/** + * fw_map() - Map up MMU tables. + */ +static int fw_map(struct mvx_fw *fw) +{ + int ret; + unsigned int i; + + if (fw->fw_bin->securevideo != false) { + /* Map MMU tables for each core. */ + for (i = 0; i < fw->ncores; i++) { + mvx_mmu_va fw_base; + mvx_mmu_va end; + phys_addr_t l2 = fw->fw_bin->secure.securefw->l2pages + + i * MVE_PAGE_SIZE; + + ret = fw->ops.get_region(MVX_FW_REGION_CORE_0 + i, + &fw_base, &end); + if (ret != 0) + return ret; + + ret = mvx_mmu_map_l2(fw->mmu, fw_base, l2); + if (ret != 0) + goto unmap_fw; + } + } else { + const struct mvx_fw_bin *fw_bin = fw->fw_bin; + const struct mvx_fw_header *header = fw_bin->nonsecure.header; + + /* Allocate memory for text segment. */ + fw->text = mvx_mmu_alloc_pages(fw->dev, + fw_bin->nonsecure.text_cnt, + 0); + if (IS_ERR(fw->text)) + return PTR_ERR(fw->text); + + /* Allocate memory for BSS segment. */ + fw->bss = mvx_mmu_alloc_pages( + fw->dev, fw_bin->nonsecure.bss_cnt * fw->ncores, 0); + if (IS_ERR(fw->bss)) { + ret = PTR_ERR(fw->bss); + goto unmap_fw; + } + + /* Allocate memory for BSS shared segment. */ + fw->bss_shared = mvx_mmu_alloc_pages( + fw->dev, fw_bin->nonsecure.sbss_cnt, 0); + if (IS_ERR(fw->bss_shared)) { + ret = PTR_ERR(fw->bss_shared); + goto unmap_fw; + } + + /* Map MMU tables for each core. */ + for (i = 0; i < fw->ncores; i++) { + ret = fw_map_core(fw, i); + if (ret != 0) + goto unmap_fw; + } + + /* Copy firmware binary. */ + ret = mvx_mmu_write(fw->mmu, FW_TEXT_BASE_ADDR, + fw_bin->nonsecure.fw->data, + header->text_length); + if (ret != 0) + goto unmap_fw; + } + + /* Map MMU tables for the message queues. */ + ret = fw->ops.map_protocol(fw); + if (ret != 0) + goto unmap_fw; + + return 0; + +unmap_fw: + fw_unmap(fw); + + return ret; +} + +/** + * Callbacks and handlers for FW stats. + */ +static int fw_stat_show(struct seq_file *s, + void *v) +{ + struct mvx_fw *fw = (struct mvx_fw *)s->private; + const struct mvx_fw_bin *fw_bin = fw->fw_bin; + + mvx_seq_printf(s, "mvx_fw", 0, "%p\n", fw); + seq_puts(s, "\n"); + + mvx_seq_printf(s, "mmu", 0, "%p\n", fw->mmu); + + if (fw_bin->securevideo == false) { + mvx_seq_printf(s, "text", 0, "%p\n", fw->text); + mvx_seq_printf(s, "bss", 0, "%p\n", fw->bss); + mvx_seq_printf(s, "bss_shared", 0, "%p\n", fw->bss_shared); + } + + seq_puts(s, "\n"); + + mvx_seq_printf(s, "msg_host", 0, "%p\n", fw->msg_host); + mvx_seq_printf(s, "msg_mve", 0, "%p\n", fw->msg_mve); + mvx_seq_printf(s, "buf_in_host", 0, "%p\n", fw->buf_in_host); + mvx_seq_printf(s, "buf_in_mve", 0, "%p\n", fw->buf_in_mve); + mvx_seq_printf(s, "buf_out_host", 0, "%p\n", fw->buf_out_host); + mvx_seq_printf(s, "buf_out_mve", 0, "%p\n", fw->buf_out_mve); + seq_puts(s, "\n"); + + fw->ops.print_stat(fw, 0, s); + seq_puts(s, "\n"); + + mvx_seq_printf(s, "rpc", 0, "%p\n", fw->rpc); + mvx_seq_printf(s, "ncores", 0, "%u\n", fw->ncores); + mvx_seq_printf(s, "msg_pending", 0, "%u\n", fw->msg_pending); + seq_puts(s, "\n"); + + mvx_seq_printf(s, "ops.map_protocol", 0, "%ps\n", + fw->ops.map_protocol); + mvx_seq_printf(s, "ops.unmap_protocol", 0, "%ps\n", + fw->ops.unmap_protocol); + mvx_seq_printf(s, "ops.get_region", 0, "%ps\n", + fw->ops.get_region); + mvx_seq_printf(s, "ops.get_message", 0, "%ps\n", + fw->ops.get_message); + mvx_seq_printf(s, "ops.put_message", 0, "%ps\n", + fw->ops.put_message); + mvx_seq_printf(s, "ops.handle_rpc", 0, "%ps\n", + fw->ops.handle_rpc); + seq_puts(s, "\n"); + + mvx_seq_printf(s, "fw_bin", 0, "%p\n", fw_bin); + mvx_seq_printf(s, "fw_bin.cache", 0, "%p\n", fw_bin->cache); + mvx_seq_printf(s, "fw_bin.filename", 0, "%s\n", fw_bin->filename); + mvx_seq_printf(s, "fw_bin.format", 0, "%u\n", fw_bin->format); + mvx_seq_printf(s, "fw_bin.dir", 0, "%s\n", + (fw_bin->dir == MVX_DIR_INPUT) ? "in" : + (fw_bin->dir == MVX_DIR_OUTPUT) ? "out" : + "invalid"); + + if (fw_bin->securevideo == false) { + mvx_seq_printf(s, "fw_bin.text_cnt", 0, "%u\n", + fw_bin->nonsecure.text_cnt); + mvx_seq_printf(s, "fw_bin.bss_cnt", 0, "%u\n", + fw_bin->nonsecure.bss_cnt); + mvx_seq_printf(s, "fw_bin.sbss_cnt", 0, "%u\n", + fw_bin->nonsecure.sbss_cnt); + } + + return 0; +} + +static int fw_stat_open(struct inode *inode, + struct file *file) +{ + return single_open(file, fw_stat_show, inode->i_private); +} + +static const struct file_operations fw_stat_fops = { + .open = fw_stat_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release +}; + +static void *rpcmem_seq_start(struct seq_file *s, + loff_t *pos) +{ + struct mvx_fw *fw = s->private; + int ret; + + ret = mutex_lock_interruptible(&fw->rpcmem_mutex); + if (ret != 0) + return ERR_PTR(-EINVAL); + + return mvx_seq_hash_start(fw->dev, fw->rpc_mem, HASH_SIZE( + fw->rpc_mem), *pos); +} + +static void *rpcmem_seq_next(struct seq_file *s, + void *v, + loff_t *pos) +{ + struct mvx_fw *fw = s->private; + + return mvx_seq_hash_next(v, fw->rpc_mem, HASH_SIZE(fw->rpc_mem), pos); +} + +static void rpcmem_seq_stop(struct seq_file *s, + void *v) +{ + struct mvx_fw *fw = s->private; + + mutex_unlock(&fw->rpcmem_mutex); + mvx_seq_hash_stop(v); +} + +static int rpcmem_seq_show(struct seq_file *s, + void *v) +{ + struct mvx_seq_hash_it *it = v; + struct mvx_mmu_pages *pages = hlist_entry(it->node, + struct mvx_mmu_pages, node); + + if (pages == NULL) + return 0; + + seq_printf(s, "va = %08x, cap = %08zu, count = %08zu\n", + pages->va, pages->capacity, pages->count); + + return 0; +} + +static const struct seq_operations rpcmem_seq_ops = { + .start = rpcmem_seq_start, + .next = rpcmem_seq_next, + .stop = rpcmem_seq_stop, + .show = rpcmem_seq_show +}; + +static int rpcmem_open(struct inode *inode, + struct file *file) +{ + int ret; + struct seq_file *s; + struct mvx_fw *fw = inode->i_private; + + ret = seq_open(file, &rpcmem_seq_ops); + if (ret != 0) + return ret; + + s = file->private_data; + s->private = fw; + + return 0; +} + +static const struct file_operations rpcmem_fops = { + .open = rpcmem_open, + .read = seq_read, + .llseek = seq_lseek, + .release = seq_release +}; + +/** + * fw_debugfs_init() - Create debugfs entries for mvx_fw. + */ +static int fw_debugfs_init(struct mvx_fw *fw, + struct dentry *parent) +{ + int ret; + struct dentry *dentry; + + fw->dentry = debugfs_create_dir("fw", parent); + if (IS_ERR_OR_NULL(fw->dentry)) + return -ENOMEM; + + dentry = debugfs_create_file("stat", 0400, fw->dentry, fw, + &fw_stat_fops); + if (IS_ERR_OR_NULL(dentry)) { + ret = -ENOMEM; + goto remove_dentry; + } + + if (fw->fw_bin->securevideo == false) { + ret = mvx_mmu_pages_debugfs_init(fw->text, "text", fw->dentry); + if (ret != 0) + goto remove_dentry; + + ret = mvx_mmu_pages_debugfs_init(fw->bss, "bss", fw->dentry); + if (ret != 0) + goto remove_dentry; + + ret = mvx_mmu_pages_debugfs_init(fw->bss_shared, "bss_shared", + fw->dentry); + if (ret != 0) + goto remove_dentry; + + dentry = debugfs_create_file("rpc_mem", 0400, fw->dentry, fw, + &rpcmem_fops); + if (IS_ERR_OR_NULL(dentry)) { + ret = -ENOMEM; + goto remove_dentry; + } + } + + return 0; + +remove_dentry: + debugfs_remove_recursive(fw->dentry); + return ret; +} + +/**************************************************************************** + * Exported functions + ****************************************************************************/ + +int mvx_fw_factory(struct mvx_fw *fw, + struct mvx_fw_bin *fw_bin, + struct mvx_mmu *mmu, + struct mvx_session *session, + struct mvx_client_ops *client_ops, + struct mvx_client_session *csession, + unsigned int ncores, + struct dentry *parent) +{ + unsigned int major; + unsigned int minor; + int ret; + + /* Verifty that firmware loading was successful. */ + if ((fw_bin->securevideo == false && + IS_ERR_OR_NULL(fw_bin->nonsecure.fw)) || + (fw_bin->securevideo != false && + IS_ERR_OR_NULL(fw_bin->secure.securefw))) { + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "Firmware binary was loaded with error."); + return -EINVAL; + } + + if (fw_bin->securevideo != false && + ncores > fw_bin->secure.securefw->ncores) { + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "Too few secure cores setup. max_ncores=%u, ncores=%u.", + fw_bin->secure.securefw->ncores, ncores); + return -EINVAL; + } + + major = get_major_version(fw_bin); + minor = get_minor_version(fw_bin); + + /* Call constructor for derived class based on protocol version. */ + switch (major) { + case 2: + ret = mvx_fw_construct_v2(fw, fw_bin, mmu, session, client_ops, + csession, ncores, major, minor); + if (ret != 0) + return ret; + + break; + case 3: + ret = mvx_fw_construct_v3(fw, fw_bin, mmu, session, client_ops, + csession, ncores, major, minor); + if (ret != 0) + return ret; + + break; + default: + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "Unsupported firmware interface revision. major=%u, minor=%u.", + major, minor); + return -EINVAL; + } + + /* Map up the MMU tables. */ + ret = fw_map(fw); + if (ret != 0) + return ret; + + if (IS_ENABLED(CONFIG_DEBUG_FS)) + ret = fw_debugfs_init(fw, parent); + + return ret; +} + +int mvx_fw_construct(struct mvx_fw *fw, + struct mvx_fw_bin *fw_bin, + struct mvx_mmu *mmu, + struct mvx_session *session, + struct mvx_client_ops *client_ops, + struct mvx_client_session *csession, + unsigned int ncores) +{ + memset(fw, 0, sizeof(*fw)); + + fw->dev = fw_bin->dev; + fw->mmu = mmu; + fw->session = session; + fw->client_ops = client_ops; + fw->csession = csession; + fw->ncores = ncores; + fw->fw_bin = fw_bin; + mutex_init(&fw->rpcmem_mutex); + + return 0; +} + +void mvx_fw_destruct(struct mvx_fw *fw) +{ + if (IS_ENABLED(CONFIG_DEBUG_FS)) + debugfs_remove_recursive(fw->dentry); + + /* Release and unmap allocates pages. */ + fw_unmap(fw); +} diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_firmware.h b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_firmware.h new file mode 100755 index 000000000..3e35e8d7d --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_firmware.h @@ -0,0 +1,1116 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef _MVX_FIRMWARE_H_ +#define _MVX_FIRMWARE_H_ + +/**************************************************************************** + * Includes + ****************************************************************************/ + +#include +#include +#include +#include +#include +#include "mvx_if.h" +#include "mvx_buffer.h" + +/**************************************************************************** + * Defines + ****************************************************************************/ + +#define MVX_FW_HTABLE_BITS 3 +#define MVX_FW_QUANT_LEN 64 + +/**************************************************************************** + * Firmware communication types + ****************************************************************************/ + +/** + * enum mvx_fw_state - Firmware state. + */ +enum mvx_fw_state { + MVX_FW_STATE_STOPPED, + MVX_FW_STATE_RUNNING +}; + +/** + * struct mvx_fw_job - Job request. + * @cores: Number for cores to use. + * @frames: Number of frames to process before job is switched out. + */ +struct mvx_fw_job { + unsigned int cores; + unsigned int frames; +}; + +/** + * struct mvx_fw_qp_range - QP range. + */ +struct mvx_fw_qp_range { + int min; + int max; +}; + +/** + * struct mvx_fw_profile_level - Profile and level. + */ +struct mvx_fw_profile_level { + unsigned int profile; + unsigned int level; +}; + +/** + * struct mvx_fw_tile - Tile size. + */ +struct mvx_fw_tile { + unsigned int rows; + unsigned int cols; +}; + +/** + * struct mvx_fw_mv - Motion vector search range. + */ +struct mvx_fw_mv { + unsigned int x; + unsigned int y; +}; + +/** + * struct mvx_fw_bitdepth - Bit depth. + */ +struct mvx_fw_bitdepth { + unsigned int chroma; + unsigned int luma; +}; + +struct mvx_buffer_param_region +{ + uint16_t mbx_left; /**< X coordinate of the left most macroblock */ + uint16_t mbx_right; /**< X coordinate of the right most macroblock */ + uint16_t mby_top; /**< Y coordinate of the top most macroblock */ + uint16_t mby_bottom; /**< Y coordinate of the bottom most macroblock */ + int16_t qp_delta; /**< QP delta value. This region will be encoded + * with qp = qp_default + qp_delta. */ + uint8_t prio; /* the priority of this region */ + uint8_t force_intra; +}; + +struct mvx_roi_config +{ + unsigned int pic_index; + unsigned char qp_present; + unsigned char qp; + unsigned char roi_present; + unsigned char num_roi; + #define MVX_MAX_FRAME_REGIONS 16 + struct mvx_buffer_param_region roi[MVX_MAX_FRAME_REGIONS]; +}; + +struct mvx_buffer_param_rectangle +{ + uint16_t x_left; /* pixel x left edge (inclusive) */ + uint16_t x_right; /* pixel x right edge (exclusive) */ + uint16_t y_top; /* pixel y top edge (inclusive) */ + uint16_t y_bottom; /* pixel y bottom edge (exclusive) */ +}; + +struct mvx_chr_cfg +{ + unsigned int pic_index; + unsigned int num_chr; + #define MVX_MAX_FRAME_CHANGE_RECTANGLES 2 + struct mvx_buffer_param_rectangle rectangle[MVX_MAX_FRAME_CHANGE_RECTANGLES]; +}; + +struct mvx_huff_table +{ + uint32_t type; + #define MVX_OPT_HUFFMAN_TABLE_DC_LUMA (1) + #define MVX_OPT_HUFFMAN_TABLE_AC_LUMA (2) + #define MVX_OPT_HUFFMAN_TABLE_DC_CHROMA (4) + #define MVX_OPT_HUFFMAN_TABLE_AC_CHROMA (8) + uint8_t dc_luma_code_lenght[16]; + uint8_t ac_luma_code_lenght[16]; + uint8_t dc_chroma_code_lenght[16]; + uint8_t ac_chroma_code_lenght[16]; + uint8_t dc_luma_table[162]; + uint8_t ac_luma_table[162]; + uint8_t dc_chroma_table[162]; + uint8_t ac_chroma_table[162]; +}; + +struct mvx_buffer_param_rate_control +{ + uint32_t rate_control_mode; + #define MVX_OPT_RATE_CONTROL_MODE_OFF (0) + #define MVX_OPT_RATE_CONTROL_MODE_STANDARD (1) + #define MVX_OPT_RATE_CONTROL_MODE_VARIABLE (2) + #define MVX_OPT_RATE_CONTROL_MODE_CONSTANT (3) + #define MVX_OPT_RATE_CONTROL_MODE_C_VARIABLE (4) + uint32_t target_bitrate; /* in bits per second */ + uint32_t maximum_bitrate; /* in bits per second */ +}; + +struct mvx_buffer_option_jpeg_rate_control +{ + uint32_t qscale; + uint32_t qscale_luma; + uint32_t qscale_chroma; + uint32_t fps; + uint32_t change_pos; +}; + +struct mvx_dsl_frame{ + uint32_t width; + uint32_t height; +}; + +struct mvx_dsl_ratio{ + uint32_t hor; + uint32_t ver; +}; + +struct mvx_long_term_ref{ + uint32_t mode; + uint32_t period; +}; + +struct mvx_color_conv_coef +{ + int16_t coef[3][3]; + uint16_t offset[3]; +}; + +struct mvx_rgb2yuv_color_conv_coef +{ + int16_t coef[3 * 3]; + uint8_t luma_range[2]; + uint8_t chroma_range[2]; + uint8_t rgb_range[2]; +}; + +struct mvx_crop_cfg +{ + uint8_t crop_en; + /* left start x of luma in original image */ + uint16_t x; //included + /* top start y of luma in original image */ + uint16_t y; //included + /* cropped width of luma in original image */ + uint16_t width; + /* cropped height of luma in original image */ + uint16_t height; +}; + +struct mvx_seamless_target{ + uint32_t seamless_mode; + uint32_t target_width; + uint32_t target_height; + uint32_t target_stride[MVX_BUFFER_NPLANES]; + uint32_t target_size[MVX_BUFFER_NPLANES]; +}; + +struct mvx_param_osd_cfg{ + uint8_t osd_inside_enable; + uint8_t osd_inside_alpha_enable; + uint8_t osd_inside_convert_color_enable; + uint8_t osd_inside_alpha_value; /* as alpha range [0~16], use u8 */ + uint8_t osd_inside_convert_color_threshold;/* threshold range [0~255], if input is 10bit, th * 4 */ + uint8_t osd_inside_rgb2yuv_mode;/* 0-601L, 1-601F, 2-709_L, 3-709_F */ + uint16_t osd_inside_start_x; /* pixel x left edge (inclusive) */ + uint16_t osd_inside_start_y; /* pixel y top edge (inclusive) */ + uint16_t reserved[3]; +}; + +struct mvx_osd_config{ + unsigned int pic_index; + unsigned int num_osd; + #define MVX_MAX_FRAME_OSD_REGION 2 + struct mvx_param_osd_cfg osd_single_cfg[MVX_MAX_FRAME_OSD_REGION];/* include single osd region config and index */ +}; + +struct mvx_osd_info{ + uint16_t width_osd[MVX_MAX_FRAME_OSD_REGION]; + uint16_t height_osd[MVX_MAX_FRAME_OSD_REGION]; + enum mvx_format inputFormat_osd[MVX_MAX_FRAME_OSD_REGION]; +}; + +/** + * struct mvx_fw_error - Firmware error message. + * @error_code: What kind of error that was reported. + * @message: Error message string. + */ +struct mvx_fw_error { + enum { + MVX_FW_ERROR_ABORT, + MVX_FW_ERROR_OUT_OF_MEMORY, + MVX_FW_ERROR_ASSERT, + MVX_FW_ERROR_UNSUPPORTED, + MVX_FW_ERROR_INVALID_BUFFER, + MVX_FW_ERROR_INVALID_STATE, + MVX_FW_ERROR_WATCHDOG + } error_code; + char message[128]; +}; + +/** + * struct mvx_fw_flush - Flush firmware buffers. + * @dir: Which port to flush. + */ +struct mvx_fw_flush { + enum mvx_direction dir; +}; + +/** + * struct mvx_fw_alloc_param - Allocation parameters. + * @width: Width in pixels. + * @height: Height in pixels. + * @afbc_alloc_bytes: AFBC buffer size. + * @afbc_width: AFBC width in superblocks. + * + * Dimensions of a decoded frame buffer. + */ +struct mvx_fw_alloc_param { + unsigned int width; + unsigned int height; + unsigned int afbc_alloc_bytes; + unsigned int afbc_width; +}; + +/** + * struct mvx_fw_seq_param - Sequence parameters. + * @planar.buffers_min: Minimum number of planar buffers required. + * @afbc.buffers_min: Minimum number of AFBC buffers required. + */ +struct mvx_fw_seq_param { + struct { + unsigned int buffers_min; + } planar; + struct { + unsigned int buffers_min; + } afbc; +}; + +enum mvx_fw_range { + MVX_FW_RANGE_UNSPECIFIED, + MVX_FW_RANGE_FULL, + MVX_FW_RANGE_LIMITED +}; + +enum mvx_fw_primaries { + MVX_FW_PRIMARIES_UNSPECIFIED, + MVX_FW_PRIMARIES_BT709, /* Rec.ITU-R BT.709 */ + MVX_FW_PRIMARIES_BT470M, /* Rec.ITU-R BT.470 System M */ + MVX_FW_PRIMARIES_BT601_625, /* Rec.ITU-R BT.601 625 */ + MVX_FW_PRIMARIES_BT601_525, /* Rec.ITU-R BT.601 525 */ + MVX_FW_PRIMARIES_GENERIC_FILM, /* Generic Film */ + MVX_FW_PRIMARIES_BT2020 /* Rec.ITU-R BT.2020 */ +}; + +enum mvx_fw_transfer { + MVX_FW_TRANSFER_UNSPECIFIED, + MVX_FW_TRANSFER_LINEAR, /* Linear transfer characteristics */ + MVX_FW_TRANSFER_SRGB, /* sRGB or equivalent */ + MVX_FW_TRANSFER_SMPTE170M, /* SMPTE 170M */ + MVX_FW_TRANSFER_GAMMA22, /* Assumed display gamma 2.2 */ + MVX_FW_TRANSFER_GAMMA28, /* Assumed display gamma 2.8 */ + MVX_FW_TRANSFER_ST2084, /* SMPTE ST 2084 */ + MVX_FW_TRANSFER_HLG, /* ARIB STD-B67 hybrid-log-gamma */ + MVX_FW_TRANSFER_SMPTE240M, /* SMPTE 240M */ + MVX_FW_TRANSFER_XVYCC, /* IEC 61966-2-4 */ + MVX_FW_TRANSFER_BT1361, /* Rec.ITU-R BT.1361 extended gamut */ + MVX_FW_TRANSFER_ST428 /* SMPTE ST 428-1 */ +}; + +enum mvx_fw_matrix { + MVX_FW_MATRIX_UNSPECIFIED, + MVX_FW_MATRIX_BT709, /* Rec.ITU-R BT.709 */ + MVX_FW_MATRIX_BT470M, /* KR=0.30, KB=0.11 */ + MVX_FW_MATRIX_BT601, /* Rec.ITU-R BT.601 625 */ + MVX_FW_MATRIX_SMPTE240M, /* SMPTE 240M or equivalent */ + MVX_FW_MATRIX_BT2020, /* Rec.ITU-R BT.2020 non-const lum */ + MVX_FW_MATRIX_BT2020Constant /* Rec.ITU-R BT.2020 const lum */ +}; + +struct mvx_fw_primary { + unsigned int x; + unsigned int y; +}; + +/** + * struct mvx_fw_color_desc - HDR color description. + */ +struct mvx_fw_color_desc { + unsigned int flags; + enum mvx_fw_range range; + enum mvx_fw_primaries primaries; + enum mvx_fw_transfer transfer; + enum mvx_fw_matrix matrix; + struct { + struct mvx_fw_primary r; + struct mvx_fw_primary g; + struct mvx_fw_primary b; + struct mvx_fw_primary w; + unsigned int luminance_min; + unsigned int luminance_max; + } display; + struct { + unsigned int luminance_max; + unsigned int luminance_average; + } content; + + uint8_t video_format; + uint8_t aspect_ratio_idc; + uint16_t sar_width; + uint16_t sar_height; + uint32_t num_units_in_tick; + uint32_t time_scale; +}; + +struct mvx_fw_display_size { + uint16_t display_width; + uint16_t display_height; +}; + +struct mvx_sei_userdata{ + uint8_t flags; + #define MVX_BUFFER_PARAM_USER_DATA_UNREGISTERED_VALID (1) + uint8_t uuid[16]; + char user_data[256 - 35]; + uint8_t user_data_len; +}; + +struct mvx_buffer_param_qp{ + int32_t qp; + int32_t epr_iframe_enable; +}; +/** + * struct mvx_fw_set_option - Set firmware options. + */ +struct mvx_fw_set_option { + enum { + /** + * Frame rate. + * Extra data: frame_date. + */ + MVX_FW_SET_FRAME_RATE, + + /** + * Bitrate. + * Extra data: target_bitrate. + * + * When target_bitrate is other than zero, rate control + * in HW is enabled, otherwise rate control is disabled. + */ + MVX_FW_SET_TARGET_BITRATE, + + /** + * QP range. + * Extra data: qp_range. + * + * QP range when rate controller is enabled. + */ + MVX_FW_SET_QP_RANGE, + + /** + * NALU format. + * Extra data: nalu_format. + */ + MVX_FW_SET_NALU_FORMAT, + + /** + * Defines if stream escaping is enabled. + * Extra data: stream_escaping. + */ + MVX_FW_SET_STREAM_ESCAPING, + + /** + * Defines profile and level for encoder. + * Extra data: profile_level. + */ + MVX_FW_SET_PROFILE_LEVEL, + + /** + * Ignore stream headers. + * Extra data: ignore_stream_headers. + */ + MVX_FW_SET_IGNORE_STREAM_HEADERS, + + /** + * Enable frame reordering for decoder. + * Extra data: frame_reordering. + */ + MVX_FW_SET_FRAME_REORDERING, + + /** + * Suggested internal buffer size. + * Extra data: intbuf_size. + */ + MVX_FW_SET_INTBUF_SIZE, + + /** + * Number of P frames for encoder. + * Extra data: pb_frames. + */ + MVX_FW_SET_P_FRAMES, + + /** + * Number of B frames for encoder. + * Extra data: pb_frames. + */ + MVX_FW_SET_B_FRAMES, + + /** + * GOP type for encoder. + * Extra data: gop_type. + */ + MVX_FW_SET_GOP_TYPE, + + /** + * Intra MB refresh. + * Extra data: intra_mb_refresh. + */ + MVX_FW_SET_INTRA_MB_REFRESH, + + /** + * Constrained intra prediction. + * Extra data: constr_ipred. + */ + MVX_FW_SET_CONSTR_IPRED, + + /** + * Enable entropy synchronization. + * Extra data: entropy_sync. + */ + MVX_FW_SET_ENTROPY_SYNC, + + /** + * Enable temporal motion vector prediction. + * Extra data: temporal_mvp. + */ + MVX_FW_SET_TEMPORAL_MVP, + + /** + * Tiles size. + * Extra data: tile. + */ + MVX_FW_SET_TILES, + + /** + * Minimum luma coding block size. + * Extra data: min_luma_cb_size. + */ + MVX_FW_SET_MIN_LUMA_CB_SIZE, + + /** + * Entropy mode. + * Extra data: entropy_mode. + */ + MVX_FW_SET_ENTROPY_MODE, + + /** + * Suggested number of CTUs in a slice. + * Extra data: slice_spacing_mb. + */ + MVX_FW_SET_SLICE_SPACING_MB, + + /** + * Probability update method. + * Extra data: vp9_prob_update. + */ + MVX_FW_SET_VP9_PROB_UPDATE, + + /** + * Search range for motion vectors. + * Extra data: mv. + */ + MVX_FW_SET_MV_SEARCH_RANGE, + + /** + * Bitdepth. + * Extra data: bitdepth. + */ + MVX_FW_SET_BITDEPTH, + + /** + * Chroma format. + * Extra data: chroma_format. + */ + MVX_FW_SET_CHROMA_FORMAT, + + /** + * RGB to YUV conversion mode. + * Extra data: rgb_to_yuv_mode. + */ + MVX_FW_SET_RGB_TO_YUV_MODE, + + /** + * Maximum bandwidth limit. + * Extra data: band_limit. + */ + MVX_FW_SET_BAND_LIMIT, + + /** + * CABAC initialization table. + * Extra data: cabac_init_idc. + */ + MVX_FW_SET_CABAC_INIT_IDC, + + /** + * QP for I frames when rate control is disabled. + * Extra data: qp + */ + MVX_FW_SET_QP_I, + + /** + * QP for P frames when rate control is disabled. + * Extra data: qp + */ + MVX_FW_SET_QP_P, + + /** + * QP for B frames when rate control is disabled. + * Extra data: qp + */ + MVX_FW_SET_QP_B, + + /** + * JPEG resync interval. + * Extra data: resync_interval + */ + MVX_FW_SET_RESYNC_INTERVAL, + + /** + * JPEG quantization table. + * Extra data: quant_tbl. + */ + MVX_FW_SET_QUANT_TABLE, + + /** + * Set watchdog timeout. 0 to disable. + */ + MVX_FW_SET_WATCHDOG_TIMEOUT, + + /** + * QP for encode frame. + * Extra data: qp + */ + MVX_FW_SET_QP_REGION, + + /** + * ROI for encode frame. + * Extra data: ROI + */ + MVX_FW_SET_ROI_REGIONS, + + /** + * Rate Control for encode frame. + * Extra data: rate control + */ + MVX_FW_SET_RATE_CONTROL, + /** + * Crop left for encode frame. + * Extra data: crop left + */ + MVX_FW_SET_CROP_LEFT, + /** + * Crop right for encode frame. + * Extra data: crop right + */ + MVX_FW_SET_CROP_RIGHT, + /** + * Crop top for encode frame. + * Extra data: crop top + */ + MVX_FW_SET_CROP_TOP, + /** + * Crop bottom for encode frame. + * Extra data: crop bottom + */ + MVX_FW_SET_CROP_BOTTOM, + + MVX_FW_SET_COLOUR_DESC, + + MVX_FW_SET_SEI_USERDATA, + + MVX_FW_SET_HRD_BUF_SIZE, + + MVX_FW_SET_DSL_FRAME, + + MVX_FW_SET_LONG_TERM_REF, + + MVX_FW_SET_DSL_MODE, + + MVX_FW_SET_MINI_FRAME_HEIGHT, + + MVX_FW_SET_STATS_MODE, + + MVX_FW_SET_CHR_CFG, + + MVX_FW_SET_INIT_QP_I, + MVX_FW_SET_INIT_QP_P, + MVX_FW_SET_SAO_LUMA, + MVX_FW_SET_SAO_CHROMA, + MVX_FW_SET_QP_DELTA_I_P, + MVX_FW_SET_QP_REF_RB_EN, + MVX_FW_SET_RC_CLIP_TOP, + MVX_FW_SET_RC_CLIP_BOT, + MVX_FW_SET_QP_MAP_CLIP_TOP, + MVX_FW_SET_QP_MAP_CLIP_BOT, + MVX_FW_SET_QP_RANGE_I, + MVX_FW_SET_PROFILING, + MVX_FW_SET_HUFF_TABLE, + MVX_FW_SET_RC_BIT_I_MODE, + MVX_FW_SET_RC_BIT_I_RATIO, + MVX_FW_SET_INTER_MED_BUF_SIZE, + MVX_FW_SET_SVCT3_LEVEL1_PERIOD, + MVX_FW_SET_GOP_PFRAMES, + MVX_FW_SET_RATE_CONTROL_JPEG, + MVX_FW_SET_LTR_PERIOD, + MVX_FW_SET_FIXED_QP, + MVX_FW_SET_GDR_NUMBER, + MVX_FW_SET_GDR_PERIOD, + MVX_FW_SET_MULTI_SPS_PPS, + MVX_FW_SET_VISUAL_ENABLE, + MVX_FW_SET_ADPTIVE_QUANTISATION, + MVX_FW_SET_EPR_QP, + MVX_FW_SET_DISABLE_FEATURES, + MVX_FW_SET_SCD_ENABLE, + MVX_FW_SET_SCD_PERCENT, + MVX_FW_SET_SCD_THRESHOLD, + MVX_FW_SET_AQ_SSIM_EN, + MVX_FW_SET_AQ_NEG_RATIO, + MVX_FW_SET_AQ_POS_RATIO, + MVX_FW_SET_AQ_QPDELTA_LMT, + MVX_FW_SET_AQ_INIT_FRM_AVG_SVAR, + MVX_FW_SET_DEC_YUV2RGB_PARAMS, + MVX_FW_SET_ENC_FORCED_UV_VAL, + MVX_FW_SET_DSL_INTERP_MODE, + MVX_FW_SET_ENC_SRC_CROPPING, + MVX_FW_SET_DEC_DST_CROPPING, + MVX_FW_SET_VISUAL_ENABLE_ADAPTIVE_INTRA_BLOCK, + MVX_FW_SET_OSD_CONFIG, + MVX_FW_SET_RATE_CONTROL_CHANGE_POS, + } code; + + /** + * Extra data for an option. + */ + union { + unsigned int frame_rate; + unsigned int target_bitrate; + struct mvx_fw_qp_range qp_range; + enum mvx_nalu_format nalu_format; + bool stream_escaping; + struct mvx_fw_profile_level profile_level; + bool ignore_stream_headers; + bool frame_reordering; + unsigned int intbuf_size; + unsigned int pb_frames; + enum mvx_gop_type gop_type; + unsigned int intra_mb_refresh; + bool constr_ipred; + bool entropy_sync; + bool temporal_mvp; + struct mvx_fw_tile tile; + unsigned int min_luma_cb_size; + enum mvx_entropy_mode entropy_mode; + unsigned int slice_spacing_mb; + enum mvx_vp9_prob_update vp9_prob_update; + struct mvx_fw_mv mv; + struct mvx_fw_bitdepth bitdepth; + unsigned int chroma_format; + enum mvx_rgb_to_yuv_mode rgb_to_yuv_mode; + unsigned int band_limit; + unsigned int cabac_init_idc; + int qp; + int resync_interval; + struct { + uint8_t *chroma; + uint8_t *luma; + } quant_tbl; + int watchdog_timeout; + struct mvx_roi_config roi_config; + struct mvx_buffer_param_rate_control rate_control; + unsigned int crop_left; + unsigned int crop_right; + unsigned int crop_top; + unsigned int crop_bottom; + struct mvx_fw_color_desc colour_desc; + struct mvx_sei_userdata userdata; + unsigned int nHRDBufsize; + struct mvx_dsl_frame dsl_frame; + struct mvx_long_term_ref ltr; + int dsl_pos_mode; + uint32_t mini_frame_height; + struct mvx_enc_stats enc_stats; + struct mvx_chr_cfg chr_cfg; + uint32_t init_qpi; + uint32_t init_qpp; + uint32_t sao_luma; + uint32_t sao_chroma; + uint32_t qp_delta_i_p; + uint32_t ref_rb_en; + uint32_t qpmap_qp_clip_top; + uint32_t qpmap_qp_clip_bot; + uint32_t rc_qp_clip_top; + uint32_t rc_qp_clip_bot; + uint32_t profiling; + struct mvx_huff_table huff_table; + uint32_t rc_bit_i_mode; + uint32_t rc_bit_i_ratio; + uint32_t inter_med_buf_size; + uint32_t svct3_level1_period; + uint32_t reset_gop_pframes; + struct mvx_buffer_option_jpeg_rate_control jpeg_rc; + uint32_t reset_ltr_period; + uint32_t fixedqp; + uint32_t gdr_number; + uint32_t gdr_period; + uint32_t multi_sps_pps; + uint32_t enable_visual; + uint32_t adapt_qnt; + struct mvx_buffer_param_qp epr_qp; + uint32_t disabled_features; + uint32_t scd_enable; + uint32_t scd_percent; + uint32_t scd_threshold; + uint32_t aq_ssim_en; + uint32_t aq_neg_ratio; + uint32_t aq_pos_ratio; + uint32_t aq_qpdelta_lmt; + uint32_t aq_init_frm_avg_svar; + struct mvx_color_conv_coef yuv2rbg_csc_coef; + struct mvx_rgb2yuv_color_conv_coef rgb2yuv_params; + uint32_t forced_uv_value; + uint32_t dsl_interp_mode; + struct mvx_crop_cfg enc_src_crop; + struct mvx_crop_cfg dec_dst_crop; + uint32_t adaptive_intra_block; + struct mvx_osd_config osd_config; + uint32_t change_pos; + }; +}; +#define MVX_FW_COLOR_DESC_DISPLAY_VALID 0x1 +#define MVX_FW_COLOR_DESC_CONTENT_VALID 0x2 + +/** + * enum mvx_fw_code - Codes for messages sent between driver and firmware. + */ +enum mvx_fw_code { + MVX_FW_CODE_ALLOC_PARAM, /* Driver <- Firmware. */ + MVX_FW_CODE_BUFFER, /* Driver <-> Firmware. */ + MVX_FW_CODE_ERROR, /* Driver <- Firmware. */ + MVX_FW_CODE_IDLE, /* Driver <- Firmware. */ + MVX_FW_CODE_FLUSH, /* Driver <-> Firmware. */ + MVX_FW_CODE_JOB, /* Driver -> Firmware. */ + MVX_FW_CODE_PING, /* Driver -> Firmware. */ + MVX_FW_CODE_PONG, /* Driver <- Firmware. */ + MVX_FW_CODE_SEQ_PARAM, /* Driver <- Firmware. */ + MVX_FW_CODE_SET_OPTION, /* Driver <-> Firmware. */ + MVX_FW_CODE_STATE_CHANGE, /* Driver <-> Firmware. */ + MVX_FW_CODE_SWITCH_IN, /* Driver <- Firmware. */ + MVX_FW_CODE_SWITCH_OUT, /* Driver <-> Firmware. */ + MVX_FW_CODE_IDLE_ACK, /* Driver -> Firmware. */ + MVX_FW_CODE_EOS, /* Driver <-> Firmware. */ + MVX_FW_CODE_COLOR_DESC, /* Driver <- Firmware. */ + MVX_FW_CODE_DUMP, /* Driver <-> Firmware. */ + MVX_FW_CODE_DEBUG, /* Driver <-> Firmware. */ + MVX_FW_CODE_BUFFER_GENERAL, /* Driver <-> Firmware. */ + MVX_FW_CODE_DISPLAY_SIZE, /* Driver <- Firmware. */ + MVX_FW_CODE_UNKNOWN, /* Driver <- Firmware. */ + MVX_FW_CODE_MAX +}; + +/** + * struct mvx_fw_msg - Union of all message types. + */ +struct mvx_fw_msg { + enum mvx_fw_code code; + union { + enum mvx_fw_state state; + struct mvx_fw_job job; + struct mvx_fw_error error; + struct mvx_fw_set_option set_option; + struct mvx_fw_flush flush; + struct mvx_fw_alloc_param alloc_param; + struct mvx_fw_seq_param seq_param; + struct mvx_fw_color_desc color_desc; + struct mvx_buffer *buf; + struct mvx_fw_display_size disp_size; + uint32_t arg; + bool eos_is_frame; + }; +}; + +/**************************************************************************** + * Types + ****************************************************************************/ + +struct device; +struct mvx_fw_bin; +struct mvx_mmu; +struct mvx_mmu_pages; +struct mvx_session; + +/** + * enum mvx_fw_region - Firmware memory regions. + */ +enum mvx_fw_region { + MVX_FW_REGION_CORE_0, + MVX_FW_REGION_CORE_1, + MVX_FW_REGION_CORE_2, + MVX_FW_REGION_CORE_3, + MVX_FW_REGION_CORE_4, + MVX_FW_REGION_CORE_5, + MVX_FW_REGION_CORE_6, + MVX_FW_REGION_CORE_7, + MVX_FW_REGION_PROTECTED, + MVX_FW_REGION_FRAMEBUF, + MVX_FW_REGION_MSG_HOST, + MVX_FW_REGION_MSG_MVE, + MVX_FW_REGION_BUF_IN_HOST, + MVX_FW_REGION_BUF_IN_MVE, + MVX_FW_REGION_BUF_OUT_HOST, + MVX_FW_REGION_BUF_OUT_MVE, + MVX_FW_REGION_RPC, + MVX_FW_REGION_PRINT_RAM +}; + +/** + * struct mvx_fw - Firmware class. + * @dev: Pointer to device. + * @fw_bin: Pointer to firmware binary. + * @mmu: Pointer to MMU object. + * @session: Pointer to session. + * @client_ops: Client operations. + * @csession: Client session this firmware instance is connected to. + * @text: Pages allocated for the text segment. + * @bss: Pages allocated for the bss segment. + * @bss_shared: Pages allocated for the shared bss segment. + * @dentry: Debugfs entry for the "fw" directory. + * @msg_host: Host message queue. + * @msg_mve: MVE message queue. + * @buf_in_host: Input buffer queue. Host enqueue filled buffers. + * @buf_in_mve: Input buffer queue. MVE return empty buffers. + * @buf_out_host: Output buffer queue. Host enqueue empty buffers. + * @buf_out_mve: Out buffer queue. MVE return filled buffers. + * @rpc: RPC communication area. + * @ncores: Number of cores the firmware has been mapped for. + * @rpc_mem: Keeps track of RPC allocated memory. Maps MVE virtual + * address to 'struct mvx_mmu_pages' object. + * @msg_pending: A subset of the messages that we are waiting for a + * response to. + * @ops: Public firmware interface. + * @ops_priv: Private firmware interface. + * + * There is one firmware instance per active session. The function pointers + * below are not reentrant and should be protected by the session mutex. + */ +struct mvx_fw { + struct device *dev; + const struct mvx_fw_bin *fw_bin; + struct mvx_mmu *mmu; + struct mvx_session *session; + struct mvx_client_ops *client_ops; + struct mvx_client_session *csession; + struct mvx_mmu_pages *text; + struct mvx_mmu_pages *bss; + struct mvx_mmu_pages *bss_shared; + struct dentry *dentry; + void *msg_host; + void *msg_mve; + void *buf_in_host; + void *buf_in_mve; + void *buf_out_host; + void *buf_out_mve; + void *rpc; + void *fw_print_ram; + unsigned int ncores; + DECLARE_HASHTABLE(rpc_mem, MVX_FW_HTABLE_BITS); + struct mutex rpcmem_mutex; + unsigned int msg_pending; + uint32_t latest_used_region_protected_pages; + uint32_t latest_used_region_outbuf_pages; + + struct { + /** + * map_protocol() - MMU map firmware. + * @fw: Pointer to firmware object. + */ + int (*map_protocol)(struct mvx_fw *fw); + + /** + * unmap_protocol() - MMU unmap firmware. + * @fw: Pointer to firmware object. + */ + void (*unmap_protocol)(struct mvx_fw *fw); + + /** + * get_region() - Get begin and end address for memory region. + * @region: Which memory region to get addresses for. + * @begin: MVE virtual begin address. + * @end: MVE virtual end address. + * + * Return: 0 on success, else error code. + */ + int (*get_region)(enum mvx_fw_region region, + uint32_t *begin, + uint32_t *end); + + /** + * get_message() - Read message from firmware message queue. + * @fw: Pointer to firmware object. + * @msg: Firmware message. + * + * Return: 1 if message was received, 0 if no message was + * received, else error code. + */ + int (*get_message)(struct mvx_fw *fw, + struct mvx_fw_msg *msg); + + /** + * put_message() - Write message to firmware message queue. + * @fw: Pointer to firmware object. + * @msg: Firmware message. + * + * Return: 0 on success, else error code. + */ + int (*put_message)(struct mvx_fw *fw, + struct mvx_fw_msg *msg); + + /** + * handle_rpc() - Handle RPC message. + * @fw: Pointer to firmware object. + * + * Return: 1 RPC message handled, 0 no RPC message, + * else error code. + */ + int (*handle_rpc)(struct mvx_fw *fw); + + /** + * handle_fw_ram_print() - Print firmware log from share ram. + * @fw: Pointer to firmware object. + * + * Return: 1 FW ram log printed, 0 no FW ram log printed, + * else error code. + */ + int (*handle_fw_ram_print)(struct mvx_fw *fw); + + /** + * print_stat() - Print debug stats to seq-file. + * @fw: Pointer to firmware object. + * @ind: Indentation level. + * s: Pointer to seq-file. + * + * Return: 0 on success, else error code. + */ + int (*print_stat)(struct mvx_fw *fw, + int ind, + struct seq_file *s); + + /** + * print_debug() - Print debug information. + * @fw: Pointer to firmware object. + */ + void (*print_debug)(struct mvx_fw *fw); + } ops; + + struct { + /** + * send_idle_ack() - Send IDLE ACK message. + * @fw: Pointer to firmware object. + * + * IDLE ACK message will be sent to the firmware if it is + * supported by a host protocol, otherwise the call will be + * ignored. + * + * Return: 0 on success, else error code. + */ + int (*send_idle_ack)(struct mvx_fw *fw); + + /** + * to_mve_profile() - Convert MVX profile to MVE value. + * @mvx_profile: MVX profile. + * @mvx_profile: MVE profile. + * + * Return: 0 on success, else error code. + */ + int (*to_mve_profile)(unsigned int mvx_profile, + uint16_t *mve_profile); + + /** + * to_mve_level() - Convert MVX level to MVE value. + * @mvx_level: MVX level. + * @mvx_level: MVE level. + * + * Return: 0 on success, else error code. + */ + int (*to_mve_level)(unsigned int mvx_level, + uint16_t *mve_level); + } ops_priv; +}; + +/**************************************************************************** + * Exported functions + ****************************************************************************/ + +/** + * mvx_fw_factory() - Construct a firmware object. + * @fw: Pointer to fw. + * @fw:_bin Pointer for firmware binary. + * @mmu: Pointer to MMU instance. + * @session: Pointer to session. + * @client_ops: Pointer to client operations. + * @csession: Client session this firmware instance is registered to. + * @ncores: Number of cores to configure. + * @parent: Debugfs entry for parent debugfs directory entry. + * + * Return: 0 on success, else error code. + */ +int mvx_fw_factory(struct mvx_fw *fw, + struct mvx_fw_bin *fw_bin, + struct mvx_mmu *mmu, + struct mvx_session *session, + struct mvx_client_ops *client_ops, + struct mvx_client_session *csession, + unsigned int ncores, + struct dentry *parent); + +/** + * mvx_fw_destruct() - Destroy firmware interface instance. + * @fw: Pointer to fw. + */ +void mvx_fw_destruct(struct mvx_fw *fw); + +#endif /* _MVX_FIRMWARE_H_ */ diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_firmware_cache.c b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_firmware_cache.c new file mode 100755 index 000000000..6b3dbfe72 --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_firmware_cache.c @@ -0,0 +1,737 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +/**************************************************************************** + * Includes + ****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "mvx_log_group.h" +#include "mvx_firmware_cache.h" +#include "mvx_log_ram.h" +#include "mvx_mmu.h" +#include "mvx_secure.h" +#include "mvx_seq.h" + +extern const unsigned int fw_h264dec[]; +extern const unsigned int fw_hevcdec[]; +extern const unsigned int fw_jpegdec[]; +extern const unsigned int fw_h264enc[]; +extern const unsigned int fw_hevcenc[]; +extern const unsigned int fw_jpegenc[]; +extern const int fw_h264dec_size; +extern const int fw_hevcdec_size; +extern const int fw_jpegdec_size; +extern const int fw_h264enc_size; +extern const int fw_hevcenc_size; +extern const int fw_jpegenc_size; + +/**************************************************************************** + * Defines + ****************************************************************************/ + +#define CACHE_CLEANUP_INTERVAL_MS 5000 + +#define MVX_SECURE_NUMCORES 8 + +/**************************************************************************** + * Private functions + ****************************************************************************/ + +/* + * Backwards compliance with older kernels. + */ +#if (KERNEL_VERSION(4, 11, 0) > LINUX_VERSION_CODE) +static unsigned int kref_read(const struct kref *kref) +{ + return atomic_read(&kref->refcount); +} + +#endif + +/** + * test_bit_32() - 32 bit version Linux test_bit. + * + * Test if bit is set in bitmap array. + */ +static bool test_bit_32(int bit, + uint32_t *addr) +{ + return 0 != (addr[bit >> 5] & (1 << (bit & 0x1f))); +} + +/** + * hw_id_to_name() - Convert HW id to string + */ +static const char *hw_id_to_string(enum mvx_hw_id id) +{ + switch (id) { + case MVE_v500: + return "v500"; + case MVE_v550: + return "v550"; + case MVE_v61: + return "v61"; + case MVE_v52_v76: + return "v52_v76"; + default: + return "unknown"; + } +} + +static struct mvx_fw_bin *kobj_to_fw_bin(struct kobject *kobj) +{ + return container_of(kobj, struct mvx_fw_bin, kobj); +} + +/** + * fw_bin_destroy() - Destroy instance of firmware binary. + */ +static void fw_bin_destroy(struct kobject *kobj) +{ + struct mvx_fw_bin *fw_bin = kobj_to_fw_bin(kobj); + + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_INFO, + "Releasing firmware binary. bin=0x%p.", fw_bin); + + if (fw_bin->securevideo == false && + IS_ERR_OR_NULL(fw_bin->nonsecure.fw) == false) + kfree(fw_bin->nonsecure.fw); + + if (fw_bin->securevideo != false && + IS_ERR_OR_NULL(fw_bin->secure.securefw) == false) + mvx_secure_release_firmware(fw_bin->secure.securefw); + + list_del(&fw_bin->cache_head); + devm_kfree(fw_bin->dev, fw_bin); +} + +static int fw_bin_validate(const struct firmware *fw, + struct device *dev) +{ + struct mvx_fw_header *header = (struct mvx_fw_header *)fw->data; + + if (fw->size < sizeof(*header)) { + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "Firmware binary size smaller than firmware header. size=%zu.", + fw->size); + return -EFAULT; + } + + if (header->text_length > fw->size) { + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "Firmware text length larger than firmware binary size. text_length=%u, size=%zu.", + header->text_length, + fw->size); + return -EFAULT; + } + + return 0; +} + +/** + * fw_bin_callback() - Call firmware ready callback. + */ +static void fw_bin_callback(struct mvx_fw_bin *fw_bin) +{ + struct mvx_fw_event *event; + struct mvx_fw_event *tmp; + int ret; + + /* + * Continue even if lock fails, or else any waiting session will + * be blocked forever. + */ + ret = mutex_lock_interruptible(&fw_bin->mutex); + + /* + * Inform all clients that the firmware has been loaded. This must be + * done even if the firmware load fails, or else the clients will hung + * waiting for a firmware load the will never happen. + */ + list_for_each_entry_safe(event, tmp, &fw_bin->event_list, head) { + list_del(&event->head); + event->fw_bin_ready(fw_bin, event->arg, false); + } + + if (ret == 0) + mutex_unlock(&fw_bin->mutex); +} + +static void request_firmware_done(const struct firmware *fw, + void *arg) +{ + struct mvx_fw_bin *fw_bin = arg; + struct mvx_fw_header *header; + mvx_mmu_va va; + int ret; + uint32_t i; + + BUG_ON(!arg); + + if (fw == NULL) { + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "Failed to load firmware binary. filename=%s.", + fw_bin->filename); + fw = ERR_PTR(-EINVAL); + goto fw_ready_callback; + } + + ret = fw_bin_validate(fw, fw_bin->dev); + if (ret != 0) { + release_firmware(fw); + fw = ERR_PTR(ret); + goto fw_ready_callback; + } + + header = (struct mvx_fw_header *)fw->data; + fw_bin->nonsecure.header = header; + + /* Calculate number of pages needed for the text segment. */ + fw_bin->nonsecure.text_cnt = + (header->text_length + MVE_PAGE_SIZE - 1) >> MVE_PAGE_SHIFT; + + /* Calculate number of pages needed for the BSS segments. */ + va = header->bss_start_address; + for (i = 0; i < header->bss_bitmap_size; i++) { + if (va >= header->master_rw_start_address && + va < (header->master_rw_start_address + + header->master_rw_size)) + fw_bin->nonsecure.sbss_cnt++; + else if (test_bit_32(i, header->bss_bitmap)) + fw_bin->nonsecure.bss_cnt++; + + va += MVE_PAGE_SIZE; + } + + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_INFO, + "Loaded firmware binary. bin=0x%p, major=%u, minor=%u, info=\"%s\", jump=0x%x, pages={text=%u, bss=%u, shared=%u}, text_length=%u, bss=0x%x.", + fw_bin, + header->protocol_major, + header->protocol_minor, + header->info_string, + header->rasc_jmp, + fw_bin->nonsecure.text_cnt, + fw_bin->nonsecure.bss_cnt, + fw_bin->nonsecure.sbss_cnt, + header->text_length, + header->bss_start_address); + +fw_ready_callback: + fw_bin->nonsecure.fw = fw; + + fw_bin_callback(fw_bin); +} + +static void secure_request_firmware_done(struct mvx_secure_firmware *securefw, + void *arg) +{ + struct mvx_fw_bin *fw_bin = arg; + + if (securefw == NULL) { + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "Failed to load secure firmware binary. filename=%s.", + fw_bin->filename); + securefw = ERR_PTR(-EINVAL); + goto fw_bin_callback; + } + +fw_bin_callback: + fw_bin->secure.securefw = securefw; + + fw_bin_callback(fw_bin); +} + + +/** + * hwvercmp() - Compare two hardware versions. + * + * Semantic of this function equivalent to strcmp(). + */ +static int hwvercmp(struct mvx_hw_ver *v1, + struct mvx_hw_ver *v2) +{ + if (v1->id != v2->id) + return v1->id - v2->id; + + if (v1->revision != v2->revision) + return v1->revision - v2->revision; + + if (v1->patch != v2->patch) + return v1->patch - v2->patch; + + return 0; +} + +static ssize_t path_show(struct kobject *kobj, + struct kobj_attribute *attr, + char *buf) +{ + struct mvx_fw_bin *fw_bin = kobj_to_fw_bin(kobj); + + return scnprintf(buf, PAGE_SIZE, "%s\n", fw_bin->filename); +} + +static ssize_t hw_ver_show(struct kobject *kobj, + struct kobj_attribute *attr, + char *buf) +{ + struct mvx_fw_bin *fw_bin = kobj_to_fw_bin(kobj); + struct mvx_hw_ver *hw_ver = &fw_bin->hw_ver; + + return scnprintf(buf, PAGE_SIZE, "%s-%u-%u\n", + hw_id_to_string(hw_ver->id), + hw_ver->revision, + hw_ver->patch); +} + +static ssize_t count_show(struct kobject *kobj, + struct kobj_attribute *attr, + char *buf) +{ + return scnprintf(buf, PAGE_SIZE, "%d\n", + kref_read(&kobj->kref) - 1); +} + +static ssize_t dirty_show(struct kobject *kobj, + struct kobj_attribute *attr, + char *buf) +{ + struct mvx_fw_bin *fw_bin = kobj_to_fw_bin(kobj); + int dirty = 0; + + if (atomic_read(&fw_bin->flush_cnt) != + atomic_read(&fw_bin->cache->flush_cnt)) + dirty = 1; + + return scnprintf(buf, PAGE_SIZE, "%d\n", dirty); +} + +static struct kobj_attribute path_attr = __ATTR_RO(path); +static struct kobj_attribute count_attr = __ATTR_RO(count); +static struct kobj_attribute hw_ver = __ATTR_RO(hw_ver); +static struct kobj_attribute dirty_attr = __ATTR_RO(dirty); + +static struct attribute *fw_bin_attrs[] = { + &path_attr.attr, + &count_attr.attr, + &hw_ver.attr, + &dirty_attr.attr, + NULL +}; + +static struct kobj_type fw_bin_ktype = { + .release = fw_bin_destroy, + .sysfs_ops = &kobj_sysfs_ops, + // .default_attrs = fw_bin_attrs +}; + +/** + * fw_bin_create() - Create a new firmware binary instance. + */ +static struct mvx_fw_bin *fw_bin_create(struct mvx_fw_cache *cache, + enum mvx_format format, + enum mvx_direction dir, + struct mvx_hw_ver *hw_ver, + bool securevideo) +{ + struct mvx_fw_bin *fw_bin; + int ret; + struct firmware *fw; + + /* Allocate object and initialize members. */ + fw_bin = devm_kzalloc(cache->dev, sizeof(*fw_bin), GFP_KERNEL); + if (fw_bin == NULL) + return ERR_PTR(-ENOMEM); + + fw_bin->dev = cache->dev; + fw_bin->cache = cache; + fw_bin->format = format; + fw_bin->dir = dir; + fw_bin->hw_ver = *hw_ver; + atomic_set(&fw_bin->flush_cnt, atomic_read(&cache->flush_cnt)); + mutex_init(&fw_bin->mutex); + INIT_LIST_HEAD(&fw_bin->cache_head); + INIT_LIST_HEAD(&fw_bin->event_list); + + fw_bin->securevideo = securevideo; + if (securevideo != false) + fw_bin->secure.secure = cache->secure; + + ret = kobject_init_and_add(&fw_bin->kobj, &fw_bin_ktype, &cache->kobj, + "%p", fw_bin); + if (ret != 0) + goto free_fw_bin; + + fw = kzalloc(sizeof(struct firmware), GFP_KERNEL); + + switch (format) + { + case MVX_FORMAT_H264: + if (dir == MVX_DIR_INPUT) + { + fw->data = (void *)fw_h264dec; + fw->size = fw_h264dec_size; + } + else + { + fw->data = (void *)fw_h264enc; + fw->size = fw_h264enc_size; + } + break; + case MVX_FORMAT_HEVC: + if (dir == MVX_DIR_INPUT) + { + fw->data = (void *)fw_hevcdec; + fw->size = fw_hevcdec_size; + } + else + { + fw->data = (void *)fw_hevcenc; + fw->size = fw_hevcenc_size; + } + break; + case MVX_FORMAT_JPEG: + if (dir == MVX_DIR_INPUT) + { + fw->data = (void *)fw_jpegdec; + fw->size = fw_jpegdec_size; + } + else + { + fw->data = (void *)fw_jpegenc; + fw->size = fw_jpegenc_size; + } + break; + default: + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_ERROR, "wrong format %d.", format); + break; + } + + kobject_get(&fw_bin->kobj); + + request_firmware_done(fw, fw_bin); + + return fw_bin; + +free_fw_bin: + kobject_put(&fw_bin->kobj); + + return ERR_PTR(ret); +} + +/** + * fw_bin_get() - Get reference to firmware binary. + * + * If firmware binary has already been loaded the reference count is increased, + * else the function tries to create a new descriptor and load the firmware + * into memory. + */ +static struct mvx_fw_bin *fw_bin_get(struct mvx_fw_cache *cache, + enum mvx_format format, + enum mvx_direction dir, + struct mvx_hw_ver *hw_ver, + bool securevideo) +{ + struct mvx_fw_bin *fw_bin = NULL; + struct mvx_fw_bin *tmp; + int ret; + + ret = mutex_lock_interruptible(&cache->mutex); + if (ret != 0) + return ERR_PTR(ret); + + /* Search if firmware binary has already been loaded. */ + list_for_each_entry(tmp, &cache->fw_bin_list, cache_head) { + if (tmp->format == format && tmp->dir == dir && + hwvercmp(&tmp->hw_ver, hw_ver) == 0 && + tmp->securevideo == securevideo && + atomic_read(&tmp->flush_cnt) == + atomic_read(&cache->flush_cnt)) { + fw_bin = tmp; + break; + } + } + + /* If firmware was not found, then try to request firmware. */ + if (fw_bin == NULL) { + fw_bin = fw_bin_create(cache, format, dir, hw_ver, securevideo); + if (!IS_ERR(fw_bin)) + list_add(&fw_bin->cache_head, &cache->fw_bin_list); + } else { + kobject_get(&fw_bin->kobj); + } + + mutex_unlock(&cache->mutex); + + return fw_bin; +} + +/**************************************************************************** + * Private functions + ****************************************************************************/ + +static struct mvx_fw_cache *kobj_to_fw_cache(struct kobject *kobj) +{ + return container_of(kobj, struct mvx_fw_cache, kobj); +} + +/** + * cache_flush_show() - FW cache flush status is always 0. + */ +static ssize_t cache_flush_show(struct kobject *kobj, + struct kobj_attribute *attr, + char *buf) +{ + return scnprintf(buf, PAGE_SIZE, "0\n"); +} + +/** + * cache_flush_store() - Trigger FW cache flush. + */ +static ssize_t cache_flush_store(struct kobject *kobj, + struct kobj_attribute *attr, + const char *buf, + size_t size) +{ + struct mvx_fw_cache *cache = kobj_to_fw_cache(kobj); + + atomic_inc(&cache->flush_cnt); + return size; +} + +/** + * Sysfs attribute which triggers FW cache flush. + */ +static struct kobj_attribute cache_flush = + __ATTR(flush, 0600, cache_flush_show, cache_flush_store); + +static struct attribute *cache_attrs[] = { + &cache_flush.attr, + NULL +}; + +static void cache_release(struct kobject *kobj) +{ + struct mvx_fw_cache *cache = kobj_to_fw_cache(kobj); + + kthread_stop(cache->cache_thread); + kobject_put(cache->kobj_parent); +} + +static struct kobj_type cache_ktype = { + .release = cache_release, + .sysfs_ops = &kobj_sysfs_ops, + // .default_attrs = cache_attrs +}; + +static void cache_update(struct mvx_fw_cache *cache) +{ + struct mvx_fw_bin *fw_bin; + struct mvx_fw_bin *tmp; + int ret; + + ret = mutex_lock_interruptible(&cache->mutex); + if (ret != 0) + return; + + list_for_each_entry_safe(fw_bin, tmp, &cache->fw_bin_list, cache_head) { + int ref; + + ref = kref_read(&fw_bin->kobj.kref); + if (ref == 1) + kobject_put(&fw_bin->kobj); + } + + mutex_unlock(&cache->mutex); +} + +static int cache_thread(void *v) +{ + struct mvx_fw_cache *cache = (struct mvx_fw_cache *)v; + + while (!kthread_should_stop()) { + cache_update(cache); + msleep_interruptible(CACHE_CLEANUP_INTERVAL_MS); + } + + return 0; +} + +/**************************************************************************** + * Exported functions + ****************************************************************************/ + +int mvx_fw_cache_construct(struct mvx_fw_cache *cache, + struct device *dev, + struct mvx_secure *secure, + struct kobject *kobj_parent) +{ + int ret; + + cache->dev = dev; + cache->secure = secure; + cache->kobj_parent = kobject_get(kobj_parent); + atomic_set(&cache->flush_cnt, 0); + mutex_init(&cache->mutex); + INIT_LIST_HEAD(&cache->fw_bin_list); + + ret = kobject_init_and_add(&cache->kobj, &cache_ktype, + kobj_parent, "fw_cache"); + if (ret != 0) + goto kobj_put; + + cache->cache_thread = kthread_run(cache_thread, cache, "fw_cache"); + if (IS_ERR(cache->cache_thread)) + goto kobj_put; + + return 0; + +kobj_put: + kobject_put(&cache->kobj); + kobject_put(cache->kobj_parent); + return -EFAULT; +} + +void mvx_fw_cache_destruct(struct mvx_fw_cache *cache) +{ + kobject_put(&cache->kobj); +} + +int mvx_fw_cache_get(struct mvx_fw_cache *cache, + enum mvx_format format, + enum mvx_direction dir, + struct mvx_fw_event *event, + struct mvx_hw_ver *hw_ver, + bool securevideo) +{ + int ret; + struct mvx_fw_bin *fw_bin; + + /* Allocate a new firmware binary or get handle to existing object. */ + fw_bin = fw_bin_get(cache, format, dir, hw_ver, securevideo); + if (IS_ERR(fw_bin)) + return PTR_ERR(fw_bin); + + ret = mutex_lock_interruptible(&fw_bin->mutex); + if (ret != 0) { + mvx_fw_cache_put(cache, fw_bin); + return ret; + } + + /* + * If the firmware binary has already been loaded, then the callback + * routine can be called right away. + * Else the callback and argument is enqueued to the firmware + * notification list. + */ + if ((fw_bin->securevideo != false && + IS_ERR_OR_NULL(fw_bin->secure.securefw) == false)) { + mutex_unlock(&fw_bin->mutex); + event->fw_bin_ready(fw_bin, event->arg, true); + } else if (fw_bin->securevideo == false && + IS_ERR_OR_NULL(fw_bin->nonsecure.fw) == false) { + mutex_unlock(&fw_bin->mutex); + event->fw_bin_ready(fw_bin, event->arg, true); + } else { + list_add(&event->head, &fw_bin->event_list); + mutex_unlock(&fw_bin->mutex); + } + + return 0; +} + +void mvx_fw_cache_put(struct mvx_fw_cache *cache, + struct mvx_fw_bin *fw_bin) +{ + int ret; + + ret = mutex_lock_interruptible(&cache->mutex); + + kobject_put(&fw_bin->kobj); + + if (ret == 0) + mutex_unlock(&cache->mutex); +} + +void mvx_fw_cache_log(struct mvx_fw_bin *fw_bin, + struct mvx_client_session *csession) +{ + struct mvx_log_header header; + struct mvx_log_fw_binary fw_binary; + struct timespec64 timespec; + struct iovec vec[3]; + + if (fw_bin->securevideo != false) + return; + + ktime_get_real_ts64(×pec); + + header.magic = MVX_LOG_MAGIC; + header.length = sizeof(fw_binary) + sizeof(*fw_bin->nonsecure.header); + header.type = MVX_LOG_TYPE_FW_BINARY; + header.severity = MVX_LOG_INFO; + header.timestamp.sec = timespec.tv_sec; + header.timestamp.nsec = timespec.tv_nsec; + + fw_binary.session = (uintptr_t)csession; + + vec[0].iov_base = &header; + vec[0].iov_len = sizeof(header); + + vec[1].iov_base = &fw_binary; + vec[1].iov_len = sizeof(fw_binary); + + vec[2].iov_base = (void *)fw_bin->nonsecure.header; + vec[2].iov_len = sizeof(*fw_bin->nonsecure.header); + + MVX_LOG_DATA(&mvx_log_fwif_if, MVX_LOG_INFO, vec, 3); +} + +void mvx_fw_cache_get_formats(struct mvx_fw_cache *cache, + enum mvx_direction direction, + uint64_t *formats) +{ + /* Support all formats by default. */ + *formats = (1ull << MVX_FORMAT_MAX) - 1ull; + + /* TODO remove formats we can't find any firmware for. */ +} diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_firmware_cache.h b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_firmware_cache.h new file mode 100755 index 000000000..cd0ce8f8b --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_firmware_cache.h @@ -0,0 +1,246 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef _MVX_FIRMWARE_CACHE_H_ +#define _MVX_FIRMWARE_CACHE_H_ + +/**************************************************************************** + * Includes + ****************************************************************************/ + +#include +#include +#include +#include +#include "mvx_if.h" + +/**************************************************************************** + * Types + ****************************************************************************/ + +struct device; +struct firmware; +struct mvx_client_session; +struct mvx_secure; +struct mvx_secure_firmware; + +/** + * struct mvx_fw_cache - Firmware cache. + * + * There is exactly one firmware context per device. It keeps track of the + * firmware binaries. + */ +struct mvx_fw_cache { + struct device *dev; + struct mvx_secure *secure; + struct mutex mutex; + struct list_head fw_bin_list; + struct kobject kobj; + struct kobject *kobj_parent; + atomic_t flush_cnt; + struct task_struct *cache_thread; +}; + +/** + * struct mvx_fw_header - Firmware binary header. + * @rasc_jmp: Start address. + * @protocol_minor: Host internface protocol minor version. + * @protocol_major: Host internface protocol major version. + * @reserved: Reserved for future use. Always 0. + * @info_string: Human readable codec information. + * @part_number: Part number. + * @svn_revision: SVN revision. + * @version_string: Firmware version. + * @text_length: Length in bytes of the read-only part of the firmware. + * @bss_start_address: Start address for BSS segment. This is always + * page-aligned. + * @bss_bitmap_size: The number of bits used in 'bss_bitmap'. + * @bss_bitmap: Bitmap which pages that shall be allocated and MMU + * mapped. If bit N is set, then a page shall be allocated + * and MMU mapped to VA address + * FW_BASE + bss_start_address + N * MVE_PAGE_SIZE. + * @master_rw_start_address: Defines a region of shared pages. + * @master_rw_size: Defines a region of shared pages. + */ +struct mvx_fw_header { + uint32_t rasc_jmp; + uint8_t protocol_minor; + uint8_t protocol_major; + uint8_t reserved[2]; + uint8_t info_string[56]; + uint8_t part_number[8]; + uint8_t svn_revision[8]; + uint8_t version_string[16]; + uint32_t text_length; + uint32_t bss_start_address; + uint32_t bss_bitmap_size; + uint32_t bss_bitmap[16]; + uint32_t master_rw_start_address; + uint32_t master_rw_size; +}; + +/** + * struct mvx_fw_bin - Structure describing a loaded firmware binary. + * + * Multiple sessions may share the same firmware binary. + */ +struct mvx_fw_bin { + struct device *dev; + struct mvx_fw_cache *cache; + struct mutex mutex; + struct kobject kobj; + struct list_head cache_head; + struct list_head event_list; + char filename[128]; + enum mvx_format format; + enum mvx_direction dir; + struct mvx_hw_ver hw_ver; + atomic_t flush_cnt; + bool securevideo; + struct { + const struct firmware *fw; + const struct mvx_fw_header *header; + unsigned int text_cnt; + unsigned int bss_cnt; + unsigned int sbss_cnt; + } nonsecure; + struct { + struct mvx_secure *secure; + struct mvx_secure_firmware *securefw; + } secure; +}; + +/** + * struct mvx_fw_event - Firmware load event notification. + * @head: Used by the firmware loader. Should not be used + * by the client. + * @fw_bin_ready: Callback routine invoked after the firmware binary has + * finished loading. Will be called both on success and + * failure. + * @arg: Argument passed to fw_bin_ready. Client may set this + * pointer to any value. + * + * Structure used to keep track of clients that have subscribed to event + * notification after the firmware binary has been loaded. + */ +struct mvx_fw_event { + struct list_head head; + void (*fw_bin_ready)(struct mvx_fw_bin *fw_bin, + void *arg, + bool same_thread); + void *arg; +}; + +/**************************************************************************** + * Exported functions + ****************************************************************************/ + +/** + * mvx_fw_cache_construct() - Construct the firmware object. + * @cache: Pointer to firmware cache. + * @dev: Pointer to device. + * @secure: Pointer to secure video. + * @kobj: Pointer to parent kobj. + * + * When FW cache is constructed, corresponding sysfs entry will be created + * and attached as a child to kobj. + * + * Return: 0 on success, else error code. + */ +int mvx_fw_cache_construct(struct mvx_fw_cache *cache, + struct device *dev, + struct mvx_secure *secure, + struct kobject *kobj); + +/** + * mvx_fw_cache_destruct() - Destroy the firmware object. + * @cache: Pointer to firmware cache. + */ +void mvx_fw_cache_destruct(struct mvx_fw_cache *cache); + +/** + * mvx_fw_cache_get() - Get a reference to a firmware binary. + * @cache: Pointer for firmware cache. + * @format: Format used on the bitstream port. + * @dir: Which port that is configured as bitstream port. + * @event: Callback routine and argument that will be invoded after + * the firmware binary has been loaded. + * @hw_ver: MVE hardware version. + * @securevideo:Secure video enabled. + * + * Loading a firmware binary is an asynchronous operation. The client will be + * informed through a callback routine when the binary is ready. + * + * If the firmware binary is already in the cache, then the callback routine + * will be called directly from mvx_fw_cache_get(). The client must take care + * not to reaquire any mutexes already held. + * + * If the firmware binary was not found in the cache, then the callback routine + * will be called from a separete thread context. The client must make sure + * its data is protected by a mutex. + * + * Return: 0 on success, else error code. + */ +int mvx_fw_cache_get(struct mvx_fw_cache *cache, + enum mvx_format format, + enum mvx_direction dir, + struct mvx_fw_event *event, + struct mvx_hw_ver *hw_ver, + bool securevideo); + +/** + * mvx_fw_cache_put() - Return firmware binary to cache and decrement the + * reference count. + * @cache: Pointer to firmware cache. + * @fw:_bin Pointer to firmware binary. + */ +void mvx_fw_cache_put(struct mvx_fw_cache *cache, + struct mvx_fw_bin *fw_bin); + +/** + * mvx_fw_cache_log() - Log firmware binary to ram log. + * @fw_bin: Pointer to firmware binary. + * @csession: Pointer to client session. + */ +void mvx_fw_cache_log(struct mvx_fw_bin *fw_bin, + struct mvx_client_session *csession); + +/** + * mvx_fw_cache_get_formats() - Get supported formats. + * @cache: Pointer to firmware cache. + * @direction: Input or output port. + * @formats: Pointer to bitmask listing supported formats. + */ +void mvx_fw_cache_get_formats(struct mvx_fw_cache *cache, + enum mvx_direction direction, + uint64_t *formats); + +#endif /* _MVX_FIRMWARE_CACHE_H_ */ diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_firmware_priv.h b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_firmware_priv.h new file mode 100755 index 000000000..50a5976aa --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_firmware_priv.h @@ -0,0 +1,163 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef _MVX_FIRMWARE_PRIV_H_ +#define _MVX_FIRMWARE_PRIV_H_ + +/**************************************************************************** + * Includes + ****************************************************************************/ + +#include "mvx_firmware.h" + +/**************************************************************************** + * Defines + ****************************************************************************/ + +#if !defined(MVE_REQUEST_CODE_IDLE_ACK) +#define MVE_REQUEST_CODE_IDLE_ACK (1012) +#endif + +/**************************************************************************** + * Firmware + ****************************************************************************/ + +struct mvx_client_ops; +struct mvx_client_session; +struct mvx_fw_bin; +struct mvx_mmu; +struct mvx_session; + +/** + * mvx_firmware_construct() - Firmware constructor. + * @fw: Pointer to firmware object. + * @fw_bin: Pointer to firmware binary. + * @mmu: Pointer to MMU. + * @session: Pointer to session. + * @client_ops: Pointer to client operations. + * @csession: Pointer to client session. + * ncores: Number of cores. + * + * Return: 0 on success, else error code. + */ +int mvx_fw_construct(struct mvx_fw *fw, + struct mvx_fw_bin *fw_bin, + struct mvx_mmu *mmu, + struct mvx_session *session, + struct mvx_client_ops *client_ops, + struct mvx_client_session *csession, + unsigned int ncores); + +/**************************************************************************** + * Firmware v2 + ****************************************************************************/ + +/** + * mvx_fw_construct_v2() - Construct the object for the firmware v2 interface. + * @fw: Pointer to firmware object. + * @fw_bin: Pointer to firmware binary. + * @mmu: Pointer to MMU. + * @session: Pointer to session. + * @client_ops: Pointer to client operations. + * @csession: Pointer to client session. + * ncores: Number of cores. + * @major: Major firmware version. + * @minor: Minor firmware version. + * + * Return: 0 on success, else error code. + */ +int mvx_fw_construct_v2(struct mvx_fw *fw, + struct mvx_fw_bin *fw_bin, + struct mvx_mmu *mmu, + struct mvx_session *session, + struct mvx_client_ops *client_ops, + struct mvx_client_session *csession, + unsigned int ncores, + unsigned char major, + unsigned char minor); + +/** + * mvx_fw_send_idle_ack_v2() - Send idle ack. + * @fw: Pointer to firmware object. + * + * Return: 0 on success, else error code. + */ +int mvx_fw_send_idle_ack_v2(struct mvx_fw *fw); + +/** + * mvx_fw_to_mve_profile_v2() - Convert MVX to MVE profile. + * @mvx_profile: Input profile. + * @mve_profile: Output profile. + * + * Return: 0 on success, else error code. + */ +int mvx_fw_to_mve_profile_v2(unsigned int mvx_profile, + uint16_t *mve_profile); + +/** + * mvx_fw_to_mve_level_v2() - Convert MVX to MVE level. + * @mvx_level: Input level. + * @mve_level: Output level. + * + * Return: 0 on success, else error code. + */ +int mvx_fw_to_mve_level_v2(unsigned int mvx_level, + uint16_t *mve_level); + +/**************************************************************************** + * Firmware v3 + ****************************************************************************/ + +/** + * mvx_fw_construct_v3() - Construct the object for the firmware v3 interface. + * @fw: Pointer to firmware object. + * @fw_bin: Pointer to firmware binary. + * @mmu: Pointer to MMU. + * @session: Pointer to session. + * @client_ops: Pointer to client operations. + * @csession: Pointer to client session. + * ncores: Number of cores. + * @major: Major firmware version. + * @minor: Minor firmware version. + * + * Return: 0 on sucess, else error code. + */ +int mvx_fw_construct_v3(struct mvx_fw *fw, + struct mvx_fw_bin *fw_bin, + struct mvx_mmu *mmu, + struct mvx_session *session, + struct mvx_client_ops *client_ops, + struct mvx_client_session *csession, + unsigned int ncores, + unsigned char major, + unsigned char minor); + +#endif diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_firmware_v2.c b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_firmware_v2.c new file mode 100755 index 000000000..696512867 --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_firmware_v2.c @@ -0,0 +1,3824 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +/**************************************************************************** + * Includes + ****************************************************************************/ + +#include +#include +#include +#include +#include "mve_protocol_def_v2.h" +#include "mvx_firmware_cache.h" +#include "mvx_firmware_priv.h" +#include "mvx_log_group.h" +#include "mvx_log_ram.h" +#include "mvx_mmu.h" +#include "mvx_secure.h" +#include "mvx_seq.h" +#include "mvx_session.h" + +/**************************************************************************** + * Static functions + ****************************************************************************/ + +/** + * is_afbc() - Detect if format is AFBC. + * @format: Color format. + * + * Return: True if AFBC, else false. + */ +static bool is_afbc(unsigned int format) +{ + return (format & (1 << MVE_FORMAT_BF_A)) != 0; +} + +/** + * log_message() - Log a message. + * @session: Pointer to session. + * @channel: The type of the firmware interface message; + * message, input buffer, output buffer or RPC + * @direction: The type of the firmware interface message; + * host->firmware or firware->host. + * @msg_header: The header of the message. + * @data: Pointer to the message data. + */ +static void log_message(struct mvx_session *session, + enum mvx_log_fwif_channel channel, + enum mvx_log_fwif_direction direction, + struct mve_msg_header *msg_header, + void *data) +{ + struct mvx_log_header header; + struct mvx_log_fwif fwif; + struct iovec vec[4]; + struct timespec64 timespec; + + ktime_get_real_ts64(×pec); + + header.magic = MVX_LOG_MAGIC; + header.length = sizeof(fwif) + sizeof(*msg_header) + msg_header->size; + header.type = MVX_LOG_TYPE_FWIF; + header.severity = MVX_LOG_INFO; + header.timestamp.sec = timespec.tv_sec; + header.timestamp.nsec = timespec.tv_nsec; + + fwif.version_major = 2; + fwif.version_minor = 0; + fwif.channel = channel; + fwif.direction = direction; + fwif.session = (uintptr_t)session; + + vec[0].iov_base = &header; + vec[0].iov_len = sizeof(header); + + vec[1].iov_base = &fwif; + vec[1].iov_len = sizeof(fwif); + + vec[2].iov_base = msg_header; + vec[2].iov_len = sizeof(*msg_header); + + vec[3].iov_base = data; + vec[3].iov_len = msg_header->size; + + MVX_LOG_DATA(&mvx_log_fwif_if, MVX_LOG_INFO, vec, 4); +} + +/** + * log_rpc() - Log a RPC message. + * @session: Pointer to session. + * @direction: The type of the firmware interface message; + * host->firmware or firware->host. + * @rpc: RPC message. + */ +static void log_rpc(struct mvx_session *session, + enum mvx_log_fwif_direction direction, + struct mve_rpc_communication_area *rpc) +{ + struct mvx_log_header header; + struct mvx_log_fwif fwif; + size_t rpc_size; + struct iovec vec[3]; + struct timespec64 timespec; + + rpc_size = offsetof(typeof(*rpc), params) + rpc->size; + + if (rpc_size > sizeof(*rpc)) + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "RPC message size is too large. size=%u.", + rpc->size); + + ktime_get_real_ts64(×pec); + + header.magic = MVX_LOG_MAGIC; + header.length = sizeof(fwif) + rpc_size; + header.type = MVX_LOG_TYPE_FWIF; + header.severity = MVX_LOG_INFO; + header.timestamp.sec = timespec.tv_sec; + header.timestamp.nsec = timespec.tv_nsec; + + fwif.version_major = 2; + fwif.version_minor = 0; + fwif.channel = MVX_LOG_FWIF_CHANNEL_RPC; + fwif.direction = direction; + fwif.session = (uintptr_t)session; + + vec[0].iov_base = &header; + vec[0].iov_len = sizeof(header); + + vec[1].iov_base = &fwif; + vec[1].iov_len = sizeof(fwif); + + vec[2].iov_base = rpc; + vec[2].iov_len = rpc_size; + + MVX_LOG_DATA(&mvx_log_fwif_if, MVX_LOG_INFO, vec, 3); +} + +static int get_stride90(enum mvx_format format, + uint8_t *nplanes, + unsigned int stride[MVX_BUFFER_NPLANES][2]) +{ + switch (format) { + case MVX_FORMAT_YUV420_I420: + *nplanes = 3; + stride[0][0] = 2; + stride[0][1] = 2; + stride[1][0] = 1; + stride[1][1] = 1; + stride[2][0] = 1; + stride[2][1] = 1; + break; + case MVX_FORMAT_YUV420_NV12: + case MVX_FORMAT_YUV420_NV21: + *nplanes = 2; + stride[0][0] = 2; + stride[0][1] = 2; + stride[1][0] = 2; + stride[1][1] = 1; + stride[2][0] = 0; + stride[2][1] = 0; + break; + case MVX_FORMAT_YUV420_P010: + case MVX_FORMAT_YUV420_2P_10: + *nplanes = 2; + stride[0][0] = 4; + stride[0][1] = 2; + stride[1][0] = 4; + stride[1][1] = 1; + stride[2][0] = 0; + stride[2][1] = 0; + break; + case MVX_FORMAT_YUV420_Y0L2: + case MVX_FORMAT_YUV420_AQB1: + *nplanes = 1; + stride[0][0] = 8; + stride[0][1] = 1; + stride[1][0] = 0; + stride[1][1] = 0; + stride[2][0] = 0; + stride[2][1] = 0; + break; + case MVX_FORMAT_YUV422_YUY2: + case MVX_FORMAT_YUV422_UYVY: + *nplanes = 1; + stride[0][0] = 4; + stride[0][1] = 2; + stride[1][0] = 0; + stride[1][1] = 0; + stride[2][0] = 0; + stride[2][1] = 0; + break; + case MVX_FORMAT_YUV422_Y210: + case MVX_FORMAT_YUV422_1P_10: + case MVX_FORMAT_RGBA_8888: + case MVX_FORMAT_BGRA_8888: + case MVX_FORMAT_ARGB_8888: + case MVX_FORMAT_ABGR_8888: + *nplanes = 1; + stride[0][0] = 8; + stride[0][1] = 2; + stride[1][0] = 0; + stride[1][1] = 0; + stride[2][0] = 0; + stride[2][1] = 0; + break; + case MVX_FORMAT_RGB_888: + case MVX_FORMAT_BGR_888: + *nplanes = 1; + stride[0][0] = 6; + stride[0][1] = 2; + stride[1][0] = 0; + stride[1][1] = 0; + stride[2][0] = 0; + stride[2][1] = 0; + break; + case MVX_FORMAT_RGB_888_3P: + case MVX_FORMAT_YUV444: + *nplanes = 3; + stride[0][0] = 2; + stride[0][1] = 2; + stride[1][0] = 2; + stride[1][1] = 2; + stride[2][0] = 2; + stride[2][1] = 2; + break; + case MVX_FORMAT_Y: + *nplanes = 1; + stride[0][0] = 2; + stride[0][1] = 2; + stride[1][0] = 0; + stride[1][1] = 0; + stride[2][0] = 0; + stride[2][1] = 0; + break; + case MVX_FORMAT_Y_10: + *nplanes = 1; + stride[0][0] = 4; + stride[0][1] = 2; + stride[1][0] = 0; + stride[1][1] = 0; + stride[2][0] = 0; + stride[2][1] = 0; + break; + case MVX_FORMAT_YUV444_10: + *nplanes = 3; + stride[0][0] = 4; + stride[0][1] = 2; + stride[1][0] = 4; + stride[1][1] = 2; + stride[2][0] = 4; + stride[2][1] = 2; + break; + case MVX_FORMAT_YUV420_I420_10: + *nplanes = 3; + stride[0][0] = 4; + stride[0][1] = 2; + stride[1][0] = 2; + stride[1][1] = 1; + stride[2][0] = 2; + stride[2][1] = 1; + break; + default: + return -EINVAL; + } + + return 0; +} + +/** + * read32n() - Read a number of bytes from 'src' to 'dst'. + * @src: Pointer to circular buffer of source data. + * @offset: Current offset in the circular buffer. + * @dst: Pointer to destination buffer. + * @size: Size in bytes. + * + * Return: New offset in the circular buffer. + */ +static unsigned int read32n(volatile uint32_t *src, + unsigned int offset, + uint32_t *dst, + size_t size) +{ + for (; size >= sizeof(uint32_t); size -= sizeof(uint32_t)) { + *dst++ = src[offset]; + offset = (offset + 1) % MVE_COMM_QUEUE_SIZE_IN_WORDS; + } + + if (size != 0) { + memcpy(dst, (void *)&src[offset], size); + offset = (offset + 1) % MVE_COMM_QUEUE_SIZE_IN_WORDS; + } + + return offset; +} + +/** + * read_message() - Read message from firmware message queue. + * @fw: Pointer to firmware object. + * @host: Host communication area. + * @mve: MVE communication area. + * @code: Pointer to where the message code shall be placed. + * @data: Pointer to where message data shall be placed. + * @size: Input: the size of the data. Output: The size of the message. + * @channel: Firmware interface message type to log. + * + * Return: 1 if a message was read, 0 if no message was read, else error code. + */ +static int read_message(struct mvx_fw *fw, + struct mve_comm_area_host *host, + struct mve_comm_area_mve *mve, + unsigned int *code, + void *data, + size_t *size, + enum mvx_log_fwif_channel channel) +{ + struct mve_msg_header header; + unsigned int rpos; + ssize_t capacity; + + dma_sync_single_for_cpu(fw->dev, + virt_to_phys(mve), + MVE_PAGE_SIZE, DMA_FROM_DEVICE); + + rpos = host->out_rpos; + + /* Calculate how much data that is available in the buffer. */ + capacity = mve->out_wpos - rpos; + if (capacity < 0) + capacity += MVE_COMM_QUEUE_SIZE_IN_WORDS; + + if (capacity <= 0) + return 0; + + /* Read the header. */ + rpos = read32n(mve->out_data, rpos, (uint32_t *)&header, + sizeof(header)); + + /* Make sure there is enough space for both header and message. */ + capacity -= DIV_ROUND_UP(sizeof(header) + header.size, + sizeof(uint32_t)); + if (capacity < 0) { + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "Firmware v2 msg larger than capacity. code=%u, size=%u, wpos=%u, rpos=%u.", + header.code, header.size, mve->out_wpos, + host->out_rpos); + return -EFAULT; + } + + if (header.size > *size) { + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "Firmware v2 message does not fit in buffer. code=%u, msg_size=%u, size=%zu.", + header.code, header.size, *size); + return -ENOMEM; + } + + /* Read message body. */ + rpos = read32n(mve->out_data, rpos, data, header.size); + host->out_rpos = rpos; + + /* + * Make sure the read pointer has been written before the cache is + * flushed. + */ + wmb(); + dma_sync_single_for_device(fw->dev, + virt_to_phys(&host->out_rpos), + sizeof(host->out_rpos), DMA_TO_DEVICE); + + *code = header.code; + *size = header.size; + + /* Log firmware message. */ + MVX_LOG_EXECUTE(&mvx_log_fwif_if, MVX_LOG_INFO, + log_message(fw->session, channel, + MVX_LOG_FWIF_DIRECTION_FIRMWARE_TO_HOST, + &header, data)); + + return 1; +} + +/** + * write32n() - Write a number of bytes to 'dst' from 'src'. + * @dst: Pointer to circular buffer of destination data. + * @offset: Current offset in the circular buffer. + * @src: Pointer to source buffer. + * @size: Size in bytes. + * + * Return: New offset in the circular buffer. + */ +static unsigned int write32n(volatile uint32_t *dst, + unsigned int offset, + uint32_t *src, + size_t size) +{ + for (; size >= sizeof(uint32_t); size -= sizeof(uint32_t)) { + dst[offset] = *src++; + offset = (offset + 1) % MVE_COMM_QUEUE_SIZE_IN_WORDS; + } + + if (size != 0) { + memcpy((void *)&dst[offset], src, size); + offset = (offset + 1) % MVE_COMM_QUEUE_SIZE_IN_WORDS; + } + + return offset; +} + +/** + * write_message() - Write message to firmware message queue. + * @fw: Pointer to firmware object. + * @host: Host communication area. + * @mve: MVE communication area. + * @code: Message code. + * @data: Pointer to message data. May be NULL if size if 0. + * @size: Size in bytes of data. + * @channel: Firmware interface message type to log. + * + * Return: 0 on success, else error code. + */ +static int write_message(struct mvx_fw *fw, + struct mve_comm_area_host *host, + struct mve_comm_area_mve *mve, + unsigned int code, + void *data, + size_t size, + enum mvx_log_fwif_channel channel) +{ + struct mve_msg_header header = { code = code, .size = size }; + ssize_t capacity; + unsigned int wpos; + + dma_sync_single_for_cpu(fw->dev, + virt_to_phys(&mve->in_rpos), + sizeof(mve->in_rpos), DMA_FROM_DEVICE); + + wpos = host->in_wpos; + + /* Calculate how much space that is available in the buffer. */ + capacity = mve->in_rpos - wpos; + if (capacity <= 0) + capacity += MVE_COMM_QUEUE_SIZE_IN_WORDS; + + /* Make sure there is enough space for both header and message. */ + capacity -= DIV_ROUND_UP(sizeof(header) + size, sizeof(uint32_t)); + if (capacity < 0) + return -ENOMEM; + + /* Write header. */ + wpos = write32n(host->in_data, wpos, (uint32_t *)&header, + sizeof(header)); + + /* Write message. */ + wpos = write32n(host->in_data, wpos, data, size); + + /* + * Make sure all message data has been written before the cache is + * flushed. + */ + wmb(); + dma_sync_single_for_device(fw->dev, + virt_to_phys(host), + MVE_PAGE_SIZE, DMA_TO_DEVICE); + + host->in_wpos = wpos; + + /* + * Make sure the write pointer has been written before the cache is + * flushed. + */ + wmb(); + dma_sync_single_for_device(fw->dev, + virt_to_phys(&host->in_wpos), + sizeof(host->in_wpos), DMA_TO_DEVICE); + + /* Log firmware message. */ + MVX_LOG_EXECUTE(&mvx_log_fwif_if, MVX_LOG_INFO, + log_message(fw->session, channel, + MVX_LOG_FWIF_DIRECTION_HOST_TO_FIRMWARE, + &header, data)); + + return 0; +} + +static int get_region_v2(enum mvx_fw_region region, + uint32_t *begin, + uint32_t *end) +{ + switch (region) { + case MVX_FW_REGION_CORE_0: + *begin = MVE_MEM_REGION_FW_INSTANCE0_ADDR_BEGIN; + *end = MVE_MEM_REGION_FW_INSTANCE0_ADDR_END; + break; + case MVX_FW_REGION_CORE_1: + *begin = MVE_MEM_REGION_FW_INSTANCE1_ADDR_BEGIN; + *end = MVE_MEM_REGION_FW_INSTANCE1_ADDR_END; + break; + case MVX_FW_REGION_CORE_2: + *begin = MVE_MEM_REGION_FW_INSTANCE2_ADDR_BEGIN; + *end = MVE_MEM_REGION_FW_INSTANCE2_ADDR_END; + break; + case MVX_FW_REGION_CORE_3: + *begin = MVE_MEM_REGION_FW_INSTANCE3_ADDR_BEGIN; + *end = MVE_MEM_REGION_FW_INSTANCE3_ADDR_END; + break; + case MVX_FW_REGION_CORE_4: + *begin = MVE_MEM_REGION_FW_INSTANCE4_ADDR_BEGIN; + *end = MVE_MEM_REGION_FW_INSTANCE4_ADDR_END; + break; + case MVX_FW_REGION_CORE_5: + *begin = MVE_MEM_REGION_FW_INSTANCE5_ADDR_BEGIN; + *end = MVE_MEM_REGION_FW_INSTANCE5_ADDR_END; + break; + case MVX_FW_REGION_CORE_6: + *begin = MVE_MEM_REGION_FW_INSTANCE6_ADDR_BEGIN; + *end = MVE_MEM_REGION_FW_INSTANCE6_ADDR_END; + break; + case MVX_FW_REGION_CORE_7: + *begin = MVE_MEM_REGION_FW_INSTANCE7_ADDR_BEGIN; + *end = MVE_MEM_REGION_FW_INSTANCE7_ADDR_END; + break; + case MVX_FW_REGION_PROTECTED: + *begin = MVE_MEM_REGION_PROTECTED_ADDR_BEGIN; + *end = MVE_MEM_REGION_PROTECTED_ADDR_END; + break; + case MVX_FW_REGION_FRAMEBUF: + *begin = MVE_MEM_REGION_FRAMEBUF_ADDR_BEGIN; + *end = MVE_MEM_REGION_FRAMEBUF_ADDR_END; + break; + case MVX_FW_REGION_MSG_HOST: + *begin = MVE_COMM_MSG_INQ_ADDR; + *end = MVE_COMM_MSG_INQ_ADDR + MVE_PAGE_SIZE; + break; + case MVX_FW_REGION_MSG_MVE: + *begin = MVE_COMM_MSG_OUTQ_ADDR; + *end = MVE_COMM_MSG_OUTQ_ADDR + MVE_PAGE_SIZE; + break; + case MVX_FW_REGION_BUF_IN_HOST: + *begin = MVE_COMM_BUF_INQ_ADDR; + *end = MVE_COMM_BUF_INQ_ADDR + MVE_PAGE_SIZE; + break; + case MVX_FW_REGION_BUF_IN_MVE: + *begin = MVE_COMM_BUF_INRQ_ADDR; + *end = MVE_COMM_BUF_INRQ_ADDR + MVE_PAGE_SIZE; + break; + case MVX_FW_REGION_BUF_OUT_HOST: + *begin = MVE_COMM_BUF_OUTQ_ADDR; + *end = MVE_COMM_BUF_OUTQ_ADDR + MVE_PAGE_SIZE; + break; + case MVX_FW_REGION_BUF_OUT_MVE: + *begin = MVE_COMM_BUF_OUTRQ_ADDR; + *end = MVE_COMM_BUF_OUTRQ_ADDR + MVE_PAGE_SIZE; + break; + case MVX_FW_REGION_RPC: + *begin = MVE_COMM_RPC_ADDR; + *end = MVE_COMM_RPC_ADDR + MVE_PAGE_SIZE; + break; + case MVX_FW_REGION_PRINT_RAM: + *begin = MVE_FW_PRINT_RAM_ADDR; + *end = MVE_FW_PRINT_RAM_ADDR + MVE_FW_PRINT_RAM_SIZE; + break; + default: + return -EINVAL; + } + + return 0; +} + +static void convert_buffer_general(struct mvx_fw *fw, + enum mvx_direction dir, + struct mvx_fw_msg *msg, + struct mve_buffer_general *g) { + struct mvx_buffer *buf = (struct mvx_buffer *)g->header.host_handle; + + if (g->header.host_handle == MVX_FW_CODE_EOS) + return; + + WARN_ON(buf->dir != dir); + + msg->code = MVX_FW_CODE_BUFFER_GENERAL; + msg->buf = buf; + if(buf->dir == MVX_DIR_OUTPUT && mvx_is_frame(buf->format)) + { + buf->general.header.buffer_size = g->header.buffer_size; + buf->general.header.config_size = g->header.config_size; + buf->general.header.type = g->header.type; + if(buf->general.header.type == MVX_BUFFER_GENERAL_TYPE_AD_STATS && g->header.config_size == sizeof(g->config.ad_stats)) + { + buf->general.config.ad_stats.frame_averages =g->config.ad_stats.frame_averages; + buf->general.config.ad_stats.thumbnail_width =g->config.ad_stats.thumbnail_width; + buf->general.config.ad_stats.thumbnail_height =g->config.ad_stats.thumbnail_height; + buf->general.config.ad_stats.ad_stats_flags =g->config.ad_stats.ad_stats_flags; + } + } +} + + +static void convert_buffer_frame(struct mvx_fw *fw, + enum mvx_direction dir, + struct mvx_fw_msg *msg, + struct mve_buffer_frame *f) +{ + struct mvx_buffer *buf = (struct mvx_buffer *)f->host_handle; + + if (f->host_handle == MVX_FW_CODE_EOS) + return; + + WARN_ON(buf->dir != dir); + + msg->code = MVX_FW_CODE_BUFFER; + msg->buf = buf; + + if (dir == MVX_DIR_OUTPUT) { + unsigned int i; + + buf->width = f->visible_frame_width; + buf->height = f->visible_frame_height; + if (buf->width == 0 || buf->height == 0 || + (f->frame_flags & (MVE_BUFFER_FRAME_FLAG_TOP_PRESENT | MVE_BUFFER_FRAME_FLAG_BOT_PRESENT)) == 0) + for (i = 0; i < buf->nplanes; i++) + (void)mvx_buffer_filled_set(buf, i, 0, 0); + + if (is_afbc(f->format) != false) { + struct mve_buffer_frame_afbc *afbc = &f->data.afbc; + + buf->crop_left = afbc->cropx; + buf->crop_top = afbc->cropy; + } + + if(f->frame_flags & MVE_BUFFER_FRAME_FLAG_ROTATION_90 || f->frame_flags & MVE_BUFFER_FRAME_FLAG_ROTATION_270) + { + struct mve_buffer_frame_planar *planar = &f->data.planar; + struct mvx_buffer_plane *plane; + for(i=0;inplanes;i++) + { + plane = &buf->planes[i]; + plane->stride = planar->stride[i]; + } + } + } + + buf->user_data = f->user_data_tag; + buf->flags = 0; + if (f->frame_flags & MVE_BUFFER_FRAME_FLAG_EOS) + buf->flags |= MVX_BUFFER_EOS; + + if (f->frame_flags & MVE_BUFFER_FRAME_FLAG_REJECTED) + buf->flags |= MVX_BUFFER_REJECTED; + + if (f->frame_flags & MVE_BUFFER_FRAME_FLAG_CORRUPT) + buf->flags |= MVX_BUFFER_CORRUPT; + + if (f->frame_flags & MVE_BUFFER_FRAME_FLAG_DECODE_ONLY) + buf->flags |= MVX_BUFFER_DECODE_ONLY; + + if (f->frame_flags & (MVE_BUFFER_FRAME_FLAG_TOP_PRESENT | MVE_BUFFER_FRAME_FLAG_BOT_PRESENT)) { + buf->flags |= MVX_BUFFER_FRAME_PRESENT; + } + + if (is_afbc(f->format) != false) { + struct mve_buffer_frame_afbc *afbc = &f->data.afbc; + + if (afbc->afbc_params & MVE_BUFFER_FRAME_AFBC_TILED_HEADER) + buf->flags |= MVX_BUFFER_AFBC_TILED_HEADERS; + + if (afbc->afbc_params & MVE_BUFFER_FRAME_AFBC_TILED_BODY) + buf->flags |= MVX_BUFFER_AFBC_TILED_BODY; + + if (afbc->afbc_params & MVE_BUFFER_FRAME_AFBC_32X8_SUPERBLOCK) + buf->flags |= MVX_BUFFER_AFBC_32X8_SUPERBLOCK; + } +} + +static void convert_buffer_bitstream(struct mvx_fw *fw, + enum mvx_direction dir, + struct mvx_fw_msg *msg, + struct mve_buffer_bitstream *b) +{ + struct mvx_buffer *buf = (struct mvx_buffer *)b->host_handle; + + if (b->host_handle == MVX_FW_CODE_EOS) + return; + + WARN_ON(buf->dir != dir); + + msg->code = MVX_FW_CODE_BUFFER; + msg->buf = buf; + + if (dir == MVX_DIR_OUTPUT) + mvx_buffer_filled_set(buf, 0, b->bitstream_filled_len, + b->bitstream_offset); + + buf->user_data = b->user_data_tag; + buf->flags = 0; + + if (b->bitstream_flags & MVE_BUFFER_BITSTREAM_FLAG_EOS) + buf->flags |= MVX_BUFFER_EOS; + + if (b->bitstream_flags & MVE_BUFFER_BITSTREAM_FLAG_ENDOFFRAME || + b->bitstream_flags & MVE_BUFFER_BITSTREAM_FLAG_BSEOF) + buf->flags |= MVX_BUFFER_EOF; + + if (b->bitstream_flags & MVE_BUFFER_BITSTREAM_FLAG_CODECCONFIG) + buf->flags |= MVX_BUFFER_CODEC_CONFIG; + + if (b->bitstream_flags & MVE_BUFFER_BITSTREAM_FLAG_ENC_STATS) + { + buf->flags |= MVX_BUFFER_ENC_STATS; + } + buf->frame_type = b->frame_type; + buf->src_transform = b->src_transform; + buf->bitstream_remaining_kb = b->bitstream_remaining_kb; +} + +static int convert_buffer_param(struct mvx_fw *fw, + struct mvx_fw_msg *msg, + struct mve_buffer_param *p) +{ + switch (p->type) { + case MVE_BUFFER_PARAM_TYPE_DISPLAY_SIZE: { + struct mve_buffer_param_display_size *size = + &p->data.display_size; + struct mvx_fw_display_size *d = &msg->disp_size; + msg->code = MVX_FW_CODE_DISPLAY_SIZE; + d->display_height = size->display_height; + d->display_width = size->display_width; + break; + } + case MVE_BUFFER_PARAM_TYPE_COLOUR_DESCRIPTION: { + struct mve_buffer_param_colour_description *c = + &p->data.colour_description; + struct mvx_fw_color_desc *d = &msg->color_desc; + + d->flags = 0; + + switch (c->range) { + case MVE_BUFFER_PARAM_COLOUR_RANGE_UNSPECIFIED: + d->range = MVX_FW_RANGE_UNSPECIFIED; + break; + case MVE_BUFFER_PARAM_COLOUR_RANGE_LIMITED: + d->range = MVX_FW_RANGE_LIMITED; + break; + case MVE_BUFFER_PARAM_COLOUR_RANGE_FULL: + d->range = MVX_FW_RANGE_FULL; + break; + default: + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "Unknown fw buffer param color desc range. range=%u.", + c->range); + return -EINVAL; + } + + /* Color primaries according to HEVC E.3.1. */ + switch (c->colour_primaries) { + case 1: + d->primaries = MVX_FW_PRIMARIES_BT709; + break; + case 4: + d->primaries = MVX_FW_PRIMARIES_BT470M; + break; + case 5: + d->primaries = MVX_FW_PRIMARIES_BT601_625; + break; + case 6: + d->primaries = MVX_FW_PRIMARIES_BT601_525; + break; + case 8: + d->primaries = MVX_FW_PRIMARIES_GENERIC_FILM; + break; + case 9: + d->primaries = MVX_FW_PRIMARIES_BT2020; + break; + default: + d->primaries = MVX_FW_PRIMARIES_UNSPECIFIED; + break; + } + + /* Transfer characteristics according to HEVC E.3.1. */ + switch (c->transfer_characteristics) { + case 1: + d->transfer = MVX_FW_TRANSFER_BT1361; + break; + case 4: + d->transfer = MVX_FW_TRANSFER_GAMMA22; + break; + case 5: + d->transfer = MVX_FW_TRANSFER_GAMMA28; + break; + case 6: + case 14: + case 15: + d->transfer = MVX_FW_TRANSFER_SMPTE170M; + break; + case 7: + d->transfer = MVX_FW_TRANSFER_SMPTE240M; + break; + case 8: + d->transfer = MVX_FW_TRANSFER_LINEAR; + break; + case 9: + case 10: + case 18: + d->transfer = MVX_FW_TRANSFER_HLG; + break; + case 11: + d->transfer = MVX_FW_TRANSFER_XVYCC; + break; + case 13: + d->transfer = MVX_FW_TRANSFER_SRGB; + break; + case 16: + d->transfer = MVX_FW_TRANSFER_ST2084; + break; + case 17: + d->transfer = MVX_FW_TRANSFER_ST428; + break; + default: + d->transfer = MVX_FW_TRANSFER_UNSPECIFIED; + break; + } + + /* Matrix coefficient according to HEVC E.3.1. */ + switch (c->matrix_coeff) { + case 1: + d->matrix = MVX_FW_MATRIX_BT709; + break; + case 5: + d->matrix = MVX_FW_MATRIX_BT470M; + break; + case 6: + d->matrix = MVX_FW_MATRIX_BT709; + break; + case 7: + d->matrix = MVX_FW_MATRIX_SMPTE240M; + break; + case 9: + d->matrix = MVX_FW_MATRIX_BT2020; + break; + case 10: + d->matrix = MVX_FW_MATRIX_BT2020Constant; + break; + default: + d->matrix = MVX_FW_MATRIX_UNSPECIFIED; + break; + } + + if (c->flags & + MVE_BUFFER_PARAM_COLOUR_FLAG_MASTERING_DISPLAY_DATA_VALID) { + d->flags |= MVX_FW_COLOR_DESC_DISPLAY_VALID; + + d->display.r.x = c->mastering_display_primaries_x[0]; + d->display.r.y = c->mastering_display_primaries_y[0]; + d->display.g.x = c->mastering_display_primaries_x[1]; + d->display.g.y = c->mastering_display_primaries_y[1]; + d->display.b.x = c->mastering_display_primaries_x[2]; + d->display.b.y = c->mastering_display_primaries_y[2]; + d->display.w.x = c->mastering_white_point_x; + d->display.w.y = c->mastering_white_point_y; + + d->display.luminance_min = + c->min_display_mastering_luminance; + d->display.luminance_max = + c->max_display_mastering_luminance; + } + + if (c->flags & + MVE_BUFFER_PARAM_COLOUR_FLAG_CONTENT_LIGHT_DATA_VALID) { + d->flags |= MVX_FW_COLOR_DESC_CONTENT_VALID; + + d->content.luminance_max = c->max_content_light_level; + d->content.luminance_average = + c->avg_content_light_level; + } + + msg->code = MVX_FW_CODE_COLOR_DESC; + break; + } + default: + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_INFO, + "Default buffer param. type=%d", p->type); + break; + } + + return 1; +} + +static int get_buffer(struct mvx_fw *fw, + struct mve_comm_area_host *host, + struct mve_comm_area_mve *mve, + enum mvx_direction dir, + struct mvx_fw_msg *msg, + enum mvx_log_fwif_channel channel) +{ + unsigned int code; + union { + struct mve_buffer_frame frame; + struct mve_buffer_bitstream bitstream; + struct mve_buffer_param param; + struct mve_buffer_general general; + } fw_msg; + size_t size = sizeof(fw_msg); + int ret; + + ret = read_message(fw, host, mve, &code, &fw_msg, &size, channel); + if (ret <= 0) + return ret; + + switch (code) { + case MVE_BUFFER_CODE_FRAME: + convert_buffer_frame(fw, dir, msg, &fw_msg.frame); + break; + case MVE_BUFFER_CODE_BITSTREAM: + convert_buffer_bitstream(fw, dir, msg, &fw_msg.bitstream); + break; + case MVE_BUFFER_CODE_PARAM: + convert_buffer_param(fw, msg, &fw_msg.param); + break; + case MVE_BUFFER_CODE_GENERAL: + convert_buffer_general(fw, dir, msg, &fw_msg.general); + break; + default: + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "Unknown fw buffer code. code=%u.", code); + break; + } + + return 1; +} + +static int get_message_v2(struct mvx_fw *fw, + struct mvx_fw_msg *msg) +{ + unsigned int code; + union { + struct mve_request_job job; + struct mve_response_state_change state_change; + struct mve_response_error error; + struct mve_response_frame_alloc_parameters alloc_param; + struct mve_response_sequence_parameters seq_param; + struct mve_response_set_option_fail set_option_fail; + struct mve_buffer_param buffer_param; + struct mve_response_event event; + } fw_msg; + size_t size = sizeof(fw_msg); + int ret; + struct mvx_session *session = fw->session; + + ret = read_message(fw, fw->msg_host, fw->msg_mve, &code, &fw_msg, + &size, MVX_LOG_FWIF_CHANNEL_MESSAGE); + if (ret <= 0) + return ret; + + msg->code = MVX_FW_CODE_MAX; + + switch (code) { + case MVE_RESPONSE_CODE_SWITCHED_IN: + msg->code = MVX_FW_CODE_SWITCH_IN; + break; + case MVE_RESPONSE_CODE_SWITCHED_OUT: + msg->code = MVX_FW_CODE_SWITCH_OUT; + break; + case MVE_RESPONSE_CODE_SET_OPTION_CONFIRM: + msg->code = MVX_FW_CODE_SET_OPTION; + fw->msg_pending--; + break; + case MVE_RESPONSE_CODE_SET_OPTION_FAIL: { + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "Firmware set option failed. index=%u, msg=%s.", + fw_msg.set_option_fail.index, + fw_msg.set_option_fail.message); + msg->code = MVX_FW_CODE_SET_OPTION; + fw->msg_pending--; + break; + } + case MVE_RESPONSE_CODE_JOB_DEQUEUED: + msg->code = MVX_FW_CODE_JOB; + break; + case MVE_RESPONSE_CODE_INPUT: + ret = get_buffer(fw, fw->buf_in_host, fw->buf_in_mve, + MVX_DIR_INPUT, msg, + MVX_LOG_FWIF_CHANNEL_INPUT_BUFFER); + break; + case MVE_RESPONSE_CODE_OUTPUT: + ret = get_buffer(fw, fw->buf_out_host, fw->buf_out_mve, + MVX_DIR_OUTPUT, msg, + MVX_LOG_FWIF_CHANNEL_OUTPUT_BUFFER); + break; + case MVE_BUFFER_CODE_PARAM: + ret = convert_buffer_param(fw, msg, &fw_msg.buffer_param); + break; + case MVE_RESPONSE_CODE_INPUT_FLUSHED: + msg->code = MVX_FW_CODE_FLUSH; + msg->flush.dir = MVX_DIR_INPUT; + fw->msg_pending--; + break; + case MVE_RESPONSE_CODE_OUTPUT_FLUSHED: + msg->code = MVX_FW_CODE_FLUSH; + msg->flush.dir = MVX_DIR_OUTPUT; + fw->msg_pending--; + break; + case MVE_RESPONSE_CODE_PONG: + msg->code = MVX_FW_CODE_PONG; + break; + case MVE_RESPONSE_CODE_ERROR: { + msg->code = MVX_FW_CODE_ERROR; + + switch (fw_msg.error.error_code) { + case MVE_ERROR_ABORT: + msg->error.error_code = MVX_FW_ERROR_ABORT; + break; + case MVE_ERROR_OUT_OF_MEMORY: + msg->error.error_code = MVX_FW_ERROR_OUT_OF_MEMORY; + break; + case MVE_ERROR_ASSERT: + msg->error.error_code = MVX_FW_ERROR_ASSERT; + break; + case MVE_ERROR_UNSUPPORTED: + msg->error.error_code = MVX_FW_ERROR_UNSUPPORTED; + break; + case MVE_ERROR_INVALID_BUFFER: + msg->error.error_code = MVX_FW_ERROR_INVALID_BUFFER; + break; + case MVE_ERROR_INVALID_STATE: + msg->error.error_code = MVX_FW_ERROR_INVALID_STATE; + break; + case MVE_ERROR_WATCHDOG: + msg->error.error_code = MVX_FW_ERROR_WATCHDOG; + break; + default: + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "Unsupported fw error code. code=%u.", + fw_msg.error.error_code); + break; + } + + strlcpy(msg->error.message, fw_msg.error.message, + min(sizeof(msg->error.message), + sizeof(fw_msg.error.message))); + + break; + } + case MVE_RESPONSE_CODE_STATE_CHANGE: { + msg->code = MVX_FW_CODE_STATE_CHANGE; + + if (fw_msg.state_change.new_state == MVE_STATE_STOPPED) + msg->state = MVX_FW_STATE_STOPPED; + else + msg->state = MVX_FW_STATE_RUNNING; + + fw->msg_pending--; + break; + } + case MVE_RESPONSE_CODE_DUMP: + msg->code = MVX_FW_CODE_DUMP; + fw->msg_pending--; + break; + case MVE_RESPONSE_CODE_DEBUG: + msg->code = MVX_FW_CODE_DEBUG; + fw->msg_pending--; + break; + case MVE_RESPONSE_CODE_IDLE: + msg->code = MVX_FW_CODE_IDLE; + break; + case MVE_RESPONSE_CODE_FRAME_ALLOC_PARAM: + msg->code = MVX_FW_CODE_ALLOC_PARAM; + msg->alloc_param.width = + fw_msg.alloc_param.planar_alloc_frame_width; + msg->alloc_param.height = + fw_msg.alloc_param.planar_alloc_frame_height; + msg->alloc_param.afbc_alloc_bytes = + fw_msg.alloc_param.afbc_alloc_bytes; + msg->alloc_param.afbc_width = + fw_msg.alloc_param.afbc_width_in_superblocks; + + break; + case MVE_RESPONSE_CODE_SEQUENCE_PARAMETERS: + msg->code = MVX_FW_CODE_SEQ_PARAM; + msg->seq_param.planar.buffers_min = + fw_msg.seq_param.num_buffers_planar; + msg->seq_param.afbc.buffers_min = + fw_msg.seq_param.num_buffers_afbc; + session->port[MVX_DIR_OUTPUT].interlaced = fw_msg.seq_param.interlace; + break; + case MVE_RESPONSE_CODE_EVENT: + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_INFO, + "EVENT code=%d. %s", + fw_msg.event.event_code, + (MVE_EVENT_ERROR_STREAM_CORRUPT == fw_msg.event.event_code + || MVE_EVENT_ERROR_STREAM_NOT_SUPPORTED == fw_msg.event.event_code) ? fw_msg.event.event_data.message : ""); + break; + case MVE_RESPONSE_CODE_REF_FRAME_UNUSED: + break; + default: + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "Unknown fw message code. code=%u, size=%u.", + code, size); + msg->code = MVX_FW_CODE_UNKNOWN; + break; + } + + return ret; +} + +static int put_buffer_general(struct mvx_fw *fw, + struct mve_comm_area_host *host, + struct mve_comm_area_mve *mve, + struct mvx_fw_msg *msg, + enum mvx_log_fwif_channel channel) +{ + int ret=0; + struct mve_buffer_general g = { 0 }; + struct mvx_buffer *buf = msg->buf; + g.header.host_handle = (ptrdiff_t)buf; + g.header.user_data_tag = buf->user_data; + g.header.buffer_ptr = mvx_buffer_va(buf, 0); + g.header.buffer_size = buf->general.header.buffer_size; + g.header.config_size = buf->general.header.config_size; + g.header.type = buf->general.header.type; + + if((g.header.type == MVE_BUFFER_GENERAL_TYPE_BLOCK_CONFIGS && g.header.config_size == sizeof(g.config.block_configs)) + || (g.header.type == MVE_BUFFER_GENERAL_TYPE_AD_STATS && g.header.config_size == sizeof(g.config.ad_stats))) + { + memcpy(&g.config, &buf->general.config, g.header.config_size); + ret = write_message(fw, host, mve, MVE_BUFFER_CODE_GENERAL, &g, + sizeof(struct mve_buffer_general_hdr) + g.header.config_size, channel); + } + + return ret; +} + + + +static int put_buffer_frame(struct mvx_fw *fw, + struct mve_comm_area_host *host, + struct mve_comm_area_mve *mve, + struct mvx_fw_msg *msg, + enum mvx_log_fwif_channel channel) +{ + struct mve_buffer_frame f = { 0 }; + struct mvx_buffer *buf = msg->buf; + struct mvx_session *session = fw->session; + int ret; + int stride_shift = 0, stride = 0; + unsigned int strideRot[MVX_BUFFER_NPLANES]; + int max_height; + uint32_t scaling_shift = 0; + uint32_t rotation = (buf->flags & MVX_BUFFER_FRAME_FLAG_ROTATION_MASK) >> 12; + scaling_shift = (buf->flags & MVX_BUFFER_FRAME_FLAG_SCALING_MASK) >> 14; + f.host_handle = (ptrdiff_t)buf; + f.user_data_tag = buf->user_data; + memset(strideRot,0,sizeof(strideRot)); + if (buf->dir == MVX_DIR_INPUT) { + f.visible_frame_width = (session->visible_width > 0) && (session->visible_width <= buf->width) ? + session->visible_width : buf->width; + f.visible_frame_height = (session->visible_height > 0) && (session->visible_height <= buf->height) ? + session->visible_height : buf->height; + + if (buf->flags & MVX_BUFFER_EOS) + f.frame_flags |= MVE_BUFFER_FRAME_FLAG_EOS; + + if (buf->planes[0].filled != 0) + f.frame_flags |= MVE_BUFFER_FRAME_FLAG_TOP_PRESENT; + + if (buf->flags & MVX_BUFFER_FRAME_FLAG_FORCE_IDR) + f.frame_flags |= MVE_BUFFER_FRAME_FLAG_FORCE_IDR; + } + + if (buf->dir == MVX_DIR_OUTPUT && (session->dsl_ratio.hor != 1 || session->dsl_ratio.ver != 1)) { + f.frame_flags |= ((session->dsl_ratio.hor - 1) << 24 | (session->dsl_ratio.ver - 1) << 17); + } + if (buf->flags & MVX_BUFFER_INTERLACE) + f.frame_flags |= MVE_BUFFER_FRAME_FLAG_INTERLACE; + + f.frame_flags |= (buf->flags & MVX_BUFFER_FRAME_FLAG_ROTATION_MASK) >> 8; + f.frame_flags |= (buf->flags & MVX_BUFFER_FRAME_FLAG_MIRROR_MASK) >> 8; + f.frame_flags |= (buf->flags & MVX_BUFFER_FRAME_FLAG_SCALING_MASK) >> 8; + f.frame_flags |= (buf->flags & MVX_BUFFER_FRAME_FLAG_GOP_REST) ? MVE_BUFFER_FRAME_FLAG_RESET_GOP : 0; + f.frame_flags |= (buf->flags & MVX_BUFFER_FRAME_FLAG_LTR_REST) ? MVE_BUFFER_FRAME_FLAG_RESET_LTR_PEROID : 0; + if (buf->dir == MVX_DIR_OUTPUT && (rotation == 1 || rotation == 3)) { + uint8_t nplanes = 0; + unsigned int stride90[MVX_BUFFER_NPLANES][2]; + int i; + memset(strideRot,0,sizeof(strideRot)); + get_stride90(buf->format, &nplanes, stride90); + for (i = 0; i < buf->nplanes; i++) { + const unsigned int stride_align = 1; + unsigned int tmp = DIV_ROUND_UP(buf->height * stride90[i][0], 2); + strideRot[i] = round_up(tmp, stride_align); + } + } + + switch (buf->format) { + case MVX_FORMAT_YUV420_AFBC_8: + f.format = MVE_FORMAT_YUV420_AFBC_8; + break; + case MVX_FORMAT_YUV420_AFBC_10: + f.format = MVE_FORMAT_YUV420_AFBC_10; + break; + case MVX_FORMAT_YUV422_AFBC_8: + f.format = MVE_FORMAT_YUV422_AFBC_8; + break; + case MVX_FORMAT_YUV422_AFBC_10: + f.format = MVE_FORMAT_YUV422_AFBC_10; + break; + case MVX_FORMAT_YUV420_I420: + f.format = MVE_FORMAT_YUV420_I420; + break; + case MVX_FORMAT_YUV420_NV12: + f.format = MVE_FORMAT_YUV420_NV12; + break; + case MVX_FORMAT_YUV420_NV21: + f.format = MVE_FORMAT_YUV420_NV21; + break; + case MVX_FORMAT_YUV420_P010: + f.format = MVE_FORMAT_YUV420_P010; + break; + case MVX_FORMAT_YUV420_Y0L2: + f.format = MVE_FORMAT_YUV420_Y0L2; + break; + case MVX_FORMAT_YUV420_AQB1: + f.format = MVE_FORMAT_YUV420_AQB1; + break; + case MVX_FORMAT_YUV422_YUY2: + f.format = MVE_FORMAT_YUV422_YUY2; + break; + case MVX_FORMAT_YUV422_UYVY: + f.format = MVE_FORMAT_YUV422_UYVY; + break; + case MVX_FORMAT_YUV422_Y210: + f.format = MVE_FORMAT_YUV422_Y210; + break; + case MVX_FORMAT_RGBA_8888: + f.format = MVE_FORMAT_RGBA_8888; + break; + case MVX_FORMAT_BGRA_8888: + f.format = MVE_FORMAT_BGRA_8888; + break; + case MVX_FORMAT_ARGB_8888: + f.format = MVE_FORMAT_ARGB_8888; + break; + case MVX_FORMAT_ABGR_8888: + f.format = MVE_FORMAT_ABGR_8888; + break; + case MVX_FORMAT_RGB_888: + f.format = MVE_FORMAT_RGB_888; + break; + case MVX_FORMAT_BGR_888: + f.format = MVE_FORMAT_BGR_888; + break; + case MVX_FORMAT_RGB_888_3P: + f.format = MVE_FORMAT_RGB_3P; + break; + case MVX_FORMAT_ARGB_1555: + f.format = MVE_FORMAT_ARGB_1555; + break; + case MVX_FORMAT_ARGB_4444: + f.format = MVE_FORMAT_ARGB_4444; + break; + case MVX_FORMAT_RGB_565: + f.format = MVE_FORMAT_RGB_565; + break; + case MVX_FORMAT_Y: + f.format = MVE_FORMAT_Y; + break; + case MVX_FORMAT_Y_10: + f.format = MVE_FORMAT_Y_10; + break; + case MVX_FORMAT_YUV444: + f.format = MVE_FORMAT_YUV444; + break; + case MVX_FORMAT_YUV444_10: + f.format = MVE_FORMAT_YUV444_10; + break; + case MVX_FORMAT_YUV420_2P_10: + f.format = MVE_FORMAT_YUV420_2P_10; + break; + case MVX_FORMAT_YUV422_1P_10: + f.format = MVE_FORMAT_YUV422_1P_10; + break; + case MVX_FORMAT_YUV420_I420_10: + f.format = MVE_FORMAT_YUV420_I420_10; + break; + default: + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "Unsupported frame format. format=%u.", + buf->format); + return -EINVAL; + } + + if (is_afbc(f.format) == false) { + struct mve_buffer_frame_planar *planar = &f.data.planar; + int i; + + if (f.frame_flags & MVE_BUFFER_FRAME_FLAG_INTERLACE){ + max_height = buf->width; + stride_shift = 1; + max_height >>= 1; + } +#if 0 + for (i = 0; i < buf->nplanes; i++) { + struct mvx_buffer_plane *plane = &buf->planes[i]; + + if (plane->stride > 0) + planar->plane_top[i] = mvx_buffer_va(buf, i); + + planar->stride[i] = plane->stride; + planar->plane_bot[i] = 0; + + if (f.frame_flags & MVE_BUFFER_FRAME_FLAG_INTERLACE) + + planar->plane_bot[i] = planar->plane_top[i] + + DIV_ROUND_UP( + plane->filled, 2); + } +#else + for (i = 0; i < buf->nplanes; i++) { + struct mvx_buffer_plane *plane = &buf->planes[i]; + + if (plane->stride > 0) { + planar->plane_top[i] = mvx_buffer_va(buf, i); + } + + if (f.frame_flags & MVE_BUFFER_FRAME_FLAG_INTERLACE) { + // interlace mode + stride = plane->stride; + //stride_shift = 1; + if (stride_shift) { + stride = round_up(stride, 2) << stride_shift; + } + planar->stride[i] = stride; + planar->plane_bot[i] = planar->plane_top[i] + + (round_up(stride, 2) >> stride_shift); + if (buf->dir == MVX_DIR_OUTPUT && (rotation == 1 || rotation == 3)) { + planar->stride[i] = strideRot[i]; + } + } else { + // frame mode + if (buf->dir == MVX_DIR_OUTPUT && (rotation == 1 || rotation == 3)){ + planar->stride[i] = strideRot[i]; + } else { + planar->stride[i] = plane->stride; + } + planar->plane_bot[i] = 0; + + } + } + +#endif + if (buf->dir == MVX_DIR_OUTPUT && (rotation == 1 || rotation == 3)){ + planar->max_frame_width = buf->height; + planar->max_frame_height = buf->width; + } else { + planar->max_frame_width = buf->width; + planar->max_frame_height = buf->height; + } + f.mini_frame_y_start = (uint16_t)(buf->offset >> 16); + f.mini_frame_y_end = (uint16_t)(buf->offset & 0xFFFF); + } else { + struct mve_buffer_frame_afbc *afbc = &f.data.afbc; + + afbc->afbc_width_in_superblocks[0] = buf->planes[0].afbc_width; + afbc->plane[0] = mvx_buffer_va(buf, 0); + + if (f.frame_flags & MVE_BUFFER_FRAME_FLAG_INTERLACE) { + afbc->alloc_bytes[0] = + ALIGN((buf->planes[0].filled / 2), 32); + afbc->alloc_bytes[1] = + buf->planes[0].filled - afbc->alloc_bytes[0]; + afbc->plane[1] = + afbc->plane[0] + afbc->alloc_bytes[0]; + afbc->afbc_width_in_superblocks[1] = + afbc->afbc_width_in_superblocks[0]; + } else { + afbc->alloc_bytes[0] = buf->planes[0].filled; + } + + afbc->afbc_params = 0; + if (buf->flags & MVX_BUFFER_AFBC_TILED_HEADERS) + afbc->afbc_params |= MVE_BUFFER_FRAME_AFBC_TILED_HEADER; + + if (buf->flags & MVX_BUFFER_AFBC_TILED_BODY) + afbc->afbc_params |= MVE_BUFFER_FRAME_AFBC_TILED_BODY; + + if (buf->flags & MVX_BUFFER_AFBC_32X8_SUPERBLOCK) + afbc->afbc_params |= + MVE_BUFFER_FRAME_AFBC_32X8_SUPERBLOCK; + } + + if (buf->flags & MVX_BUFFER_FRAME_FLAG_OSD_1) { + f.visible_frame_width = f.data.planar.max_frame_width = session->osd_info.width_osd[0]; + f.visible_frame_height = f.data.planar.max_frame_height = session->osd_info.height_osd[0]; + f.data.planar.stride[0] = session->osd_info.width_osd[0] * 2; + f.data.planar.stride[1] = f.data.planar.stride[2] = 0; + f.data.planar.plane_top[1] = f.data.planar.plane_top[2] = 0; + f.frame_flags_ext |= OSD0_TAG; + switch (session->osd_info.inputFormat_osd[0]){ + case MVX_FORMAT_ARGB_1555: + f.format = MVE_FORMAT_ARGB_1555; + break; + case MVX_FORMAT_ARGB_4444: + f.format = MVE_FORMAT_ARGB_4444; + break; + case MVX_FORMAT_RGB_565: + f.format = MVE_FORMAT_RGB_565; + break; + default: + f.format = MVE_FORMAT_ARGB_1555; + break; + } + } else if (buf->flags & MVX_BUFFER_FRAME_FLAG_OSD_2) { + f.visible_frame_width = f.data.planar.max_frame_width = session->osd_info.width_osd[1]; + f.visible_frame_height = f.data.planar.max_frame_height = session->osd_info.height_osd[1]; + f.data.planar.stride[0] = session->osd_info.width_osd[1] * 2; + f.data.planar.stride[1] = f.data.planar.stride[2] = 0; + f.data.planar.plane_top[1] = f.data.planar.plane_top[2] = 0; + f.frame_flags_ext |= OSD1_TAG; + switch (session->osd_info.inputFormat_osd[1]){ + case MVX_FORMAT_ARGB_1555: + f.format = MVE_FORMAT_ARGB_1555; + break; + case MVX_FORMAT_ARGB_4444: + f.format = MVE_FORMAT_ARGB_4444; + break; + case MVX_FORMAT_RGB_565: + f.format = MVE_FORMAT_RGB_565; + break; + default: + f.format = MVE_FORMAT_ARGB_1555; + break; + } + } + + ret = write_message(fw, host, mve, MVE_BUFFER_CODE_FRAME, + &f, sizeof(f), channel); + + return ret; +} + +static int put_buffer_bitstream(struct mvx_fw *fw, + struct mve_comm_area_host *host, + struct mve_comm_area_mve *mve, + struct mvx_fw_msg *msg, + enum mvx_log_fwif_channel channel) +{ + struct mve_buffer_bitstream b = { 0 }; + struct mvx_buffer *buf = msg->buf; + int ret; + + if (buf->dir == MVX_DIR_INPUT) + b.bitstream_filled_len = buf->planes[0].filled; + + b.host_handle = (ptrdiff_t)buf; + b.user_data_tag = buf->user_data; + b.bitstream_alloc_bytes = mvx_buffer_size(buf, 0); + b.bitstream_buf_addr = mvx_buffer_va(buf, 0); + + if (buf->flags & MVX_BUFFER_EOS) + b.bitstream_flags |= MVE_BUFFER_BITSTREAM_FLAG_EOS; + + if (buf->flags & MVX_BUFFER_EOF){ + b.bitstream_flags |= MVE_BUFFER_BITSTREAM_FLAG_ENDOFFRAME; + b.bitstream_flags |= MVE_BUFFER_BITSTREAM_FLAG_BSEOF; + } + if (buf->flags & MVX_BUFFER_END_OF_SUB_FRAME) { + b.bitstream_flags |= MVE_BUFFER_BITSTREAM_FLAG_ENDOFSUBFRAME; + } + if (buf->flags & MVX_BUFFER_CODEC_CONFIG) { + b.bitstream_flags |= MVE_BUFFER_BITSTREAM_FLAG_CODECCONFIG; + b.bitstream_flags |= MVE_BUFFER_BITSTREAM_FLAG_ENDOFSUBFRAME; + } + + ret = write_message(fw, host, mve, MVE_BUFFER_CODE_BITSTREAM, &b, + sizeof(b), channel); + + return ret; +} + +static int to_mve_nalu_format(enum mvx_nalu_format fmt, + int *mve_val) +{ + switch (fmt) { + case MVX_NALU_FORMAT_START_CODES: + *mve_val = MVE_OPT_NALU_FORMAT_START_CODES; + break; + case MVX_NALU_FORMAT_ONE_NALU_PER_BUFFER: + *mve_val = MVE_OPT_NALU_FORMAT_ONE_NALU_PER_BUFFER; + break; + case MVX_NALU_FORMAT_ONE_BYTE_LENGTH_FIELD: + *mve_val = MVE_OPT_NALU_FORMAT_ONE_BYTE_LENGTH_FIELD; + break; + case MVX_NALU_FORMAT_TWO_BYTE_LENGTH_FIELD: + *mve_val = MVE_OPT_NALU_FORMAT_TWO_BYTE_LENGTH_FIELD; + break; + case MVX_NALU_FORMAT_FOUR_BYTE_LENGTH_FIELD: + *mve_val = MVE_OPT_NALU_FORMAT_FOUR_BYTE_LENGTH_FIELD; + break; + default: + return -EINVAL; + } + + return 0; +} + +int mvx_fw_to_mve_profile_v2(unsigned int mvx_profile, + uint16_t *mve_profile) +{ + switch (mvx_profile) { + case MVX_PROFILE_H264_BASELINE: + *mve_profile = MVE_OPT_PROFILE_H264_BASELINE; + break; + case MVX_PROFILE_H264_MAIN: + *mve_profile = MVE_OPT_PROFILE_H264_MAIN; + break; + case MVX_PROFILE_H264_HIGH: + *mve_profile = MVE_OPT_PROFILE_H264_HIGH; + break; + case MVX_PROFILE_H265_MAIN: + *mve_profile = MVE_OPT_PROFILE_H265_MAIN; + break; + case MVX_PROFILE_H265_MAIN_STILL: + *mve_profile = MVE_OPT_PROFILE_H265_MAIN_STILL; + break; + case MVX_PROFILE_H265_MAIN_INTRA: + *mve_profile = MVE_OPT_PROFILE_H265_MAIN_INTRA; + break; + case MVX_PROFILE_H265_MAIN_10: + *mve_profile = MVE_OPT_PROFILE_H265_MAIN_10; + break; + case MVX_PROFILE_VC1_SIMPLE: + *mve_profile = MVE_OPT_PROFILE_VC1_SIMPLE; + break; + case MVX_PROFILE_VC1_MAIN: + *mve_profile = MVE_OPT_PROFILE_VC1_MAIN; + break; + case MVX_PROFILE_VC1_ADVANCED: + *mve_profile = MVE_OPT_PROFILE_VC1_ADVANCED; + break; + case MVX_PROFILE_VP8_MAIN: + *mve_profile = MVE_OPT_PROFILE_VP8_MAIN; + break; + default: + return -EINVAL; + } + + return 0; +} + +int mvx_fw_to_mve_level_v2(unsigned int mvx_level, + uint16_t *mve_level) +{ + switch (mvx_level) { + case MVX_LEVEL_NONE: + *mve_level = 0; + break; + case MVX_LEVEL_H264_1: + *mve_level = MVE_OPT_LEVEL_H264_1; + break; + case MVX_LEVEL_H264_1b: + *mve_level = MVE_OPT_LEVEL_H264_1b; + break; + case MVX_LEVEL_H264_11: + *mve_level = MVE_OPT_LEVEL_H264_11; + break; + case MVX_LEVEL_H264_12: + *mve_level = MVE_OPT_LEVEL_H264_12; + break; + case MVX_LEVEL_H264_13: + *mve_level = MVE_OPT_LEVEL_H264_13; + break; + case MVX_LEVEL_H264_2: + *mve_level = MVE_OPT_LEVEL_H264_2; + break; + case MVX_LEVEL_H264_21: + *mve_level = MVE_OPT_LEVEL_H264_21; + break; + case MVX_LEVEL_H264_22: + *mve_level = MVE_OPT_LEVEL_H264_22; + break; + case MVX_LEVEL_H264_3: + *mve_level = MVE_OPT_LEVEL_H264_3; + break; + case MVX_LEVEL_H264_31: + *mve_level = MVE_OPT_LEVEL_H264_31; + break; + case MVX_LEVEL_H264_32: + *mve_level = MVE_OPT_LEVEL_H264_32; + break; + case MVX_LEVEL_H264_4: + *mve_level = MVE_OPT_LEVEL_H264_4; + break; + case MVX_LEVEL_H264_41: + *mve_level = MVE_OPT_LEVEL_H264_41; + break; + case MVX_LEVEL_H264_42: + *mve_level = MVE_OPT_LEVEL_H264_42; + break; + case MVX_LEVEL_H264_5: + *mve_level = MVE_OPT_LEVEL_H264_5; + break; + case MVX_LEVEL_H264_51: + *mve_level = MVE_OPT_LEVEL_H264_51; + break; + + /** + * Levels supported by the HW but not by V4L2 controls API. + * + * case MVX_LEVEL_H264_52: + * mve_level = MVE_OPT_LEVEL_H264_52; + * break; + * case MVX_LEVEL_H264_6: + * mve_level = MVE_OPT_LEVEL_H264_6; + * break; + * case MVX_LEVEL_H264_61: + * mve_level = MVE_OPT_LEVEL_H264_61; + * break; + * case MVX_LEVEL_H264_62: + * mve_level = MVE_OPT_LEVEL_H264_62; + * break; + */ + case MVX_LEVEL_H265_MAIN_1: + *mve_level = MVE_OPT_LEVEL_H265_MAIN_TIER_1; + break; + case MVX_LEVEL_H265_HIGH_1: + *mve_level = MVE_OPT_LEVEL_H265_HIGH_TIER_1; + break; + case MVX_LEVEL_H265_MAIN_2: + *mve_level = MVE_OPT_LEVEL_H265_MAIN_TIER_2; + break; + case MVX_LEVEL_H265_HIGH_2: + *mve_level = MVE_OPT_LEVEL_H265_HIGH_TIER_2; + break; + case MVX_LEVEL_H265_MAIN_21: + *mve_level = MVE_OPT_LEVEL_H265_MAIN_TIER_21; + break; + case MVX_LEVEL_H265_HIGH_21: + *mve_level = MVE_OPT_LEVEL_H265_HIGH_TIER_21; + break; + case MVX_LEVEL_H265_MAIN_3: + *mve_level = MVE_OPT_LEVEL_H265_MAIN_TIER_3; + break; + case MVX_LEVEL_H265_HIGH_3: + *mve_level = MVE_OPT_LEVEL_H265_HIGH_TIER_3; + break; + case MVX_LEVEL_H265_MAIN_31: + *mve_level = MVE_OPT_LEVEL_H265_MAIN_TIER_31; + break; + case MVX_LEVEL_H265_HIGH_31: + *mve_level = MVE_OPT_LEVEL_H265_HIGH_TIER_31; + break; + case MVX_LEVEL_H265_MAIN_4: + *mve_level = MVE_OPT_LEVEL_H265_MAIN_TIER_4; + break; + case MVX_LEVEL_H265_HIGH_4: + *mve_level = MVE_OPT_LEVEL_H265_HIGH_TIER_4; + break; + case MVX_LEVEL_H265_MAIN_41: + *mve_level = MVE_OPT_LEVEL_H265_MAIN_TIER_41; + break; + case MVX_LEVEL_H265_HIGH_41: + *mve_level = MVE_OPT_LEVEL_H265_HIGH_TIER_41; + break; + case MVX_LEVEL_H265_MAIN_5: + *mve_level = MVE_OPT_LEVEL_H265_MAIN_TIER_5; + break; + case MVX_LEVEL_H265_HIGH_5: + *mve_level = MVE_OPT_LEVEL_H265_HIGH_TIER_5; + break; + case MVX_LEVEL_H265_MAIN_51: + *mve_level = MVE_OPT_LEVEL_H265_MAIN_TIER_51; + break; + case MVX_LEVEL_H265_HIGH_51: + *mve_level = MVE_OPT_LEVEL_H265_HIGH_TIER_51; + break; + case MVX_LEVEL_H265_MAIN_52: + *mve_level = MVE_OPT_LEVEL_H265_MAIN_TIER_52; + break; + case MVX_LEVEL_H265_HIGH_52: + *mve_level = MVE_OPT_LEVEL_H265_HIGH_TIER_52; + break; + case MVX_LEVEL_H265_MAIN_6: + *mve_level = MVE_OPT_LEVEL_H265_MAIN_TIER_6; + break; + case MVX_LEVEL_H265_HIGH_6: + *mve_level = MVE_OPT_LEVEL_H265_HIGH_TIER_6; + break; + case MVX_LEVEL_H265_MAIN_61: + *mve_level = MVE_OPT_LEVEL_H265_MAIN_TIER_61; + break; + case MVX_LEVEL_H265_HIGH_61: + *mve_level = MVE_OPT_LEVEL_H265_HIGH_TIER_61; + break; + case MVX_LEVEL_H265_MAIN_62: + *mve_level = MVE_OPT_LEVEL_H265_MAIN_TIER_62; + break; + case MVX_LEVEL_H265_HIGH_62: + *mve_level = MVE_OPT_LEVEL_H265_HIGH_TIER_62; + break; + default: + return -EINVAL; + } + + return 0; +} + +static int to_mve_gop_type(enum mvx_gop_type gop, + unsigned int *mve_arg) +{ + switch (gop) { + case MVX_GOP_TYPE_BIDIRECTIONAL: + *mve_arg = MVE_OPT_GOP_TYPE_BIDIRECTIONAL; + break; + case MVX_GOP_TYPE_LOW_DELAY: + *mve_arg = MVE_OPT_GOP_TYPE_LOW_DELAY; + break; + case MVX_GOP_TYPE_PYRAMID: + *mve_arg = MVE_OPT_GOP_TYPE_PYRAMID; + break; + case MVX_GOP_TYPE_SVCT3: + *mve_arg = MVE_OPT_GOP_TYPE_SVCT3; + break; + case MVX_GOP_TYPE_GDR: + *mve_arg = MVE_OPT_GOP_TYPE_GDR; + break; + default: + return -EINVAL; + } + + return 0; +} + +static int to_mve_h264_cabac(enum mvx_entropy_mode entropy_mode, + unsigned int *mve_arg) +{ + switch (entropy_mode) { + case MVX_ENTROPY_MODE_CABAC: + *mve_arg = 1; + break; + case MVX_ENTROPY_MODE_CAVLC: + *mve_arg = 0; + break; + default: + return -EINVAL; + } + + return 0; +} + +static int to_mve_vp9_prob_update(enum mvx_vp9_prob_update prob_update, + unsigned int *mve_arg) +{ + switch (prob_update) { + case MVX_VP9_PROB_UPDATE_DISABLED: + *mve_arg = MVE_OPT_VP9_PROB_UPDATE_DISABLED; + break; + case MVX_VP9_PROB_UPDATE_IMPLICIT: + *mve_arg = MVE_OPT_VP9_PROB_UPDATE_IMPLICIT; + break; + case MVX_VP9_PROB_UPDATE_EXPLICIT: + *mve_arg = MVE_OPT_VP9_PROB_UPDATE_EXPLICIT; + break; + default: + return -EINVAL; + } + + return 0; +} + +static int put_fw_opt(struct mvx_fw *fw, + struct mve_request_set_option *opt, + size_t size) +{ + int ret; + + ret = write_message(fw, fw->msg_host, fw->msg_mve, + MVE_REQUEST_CODE_SET_OPTION, + opt, offsetof(typeof(*opt), data) + size, + MVX_LOG_FWIF_CHANNEL_MESSAGE); + + if (ret == 0) + fw->msg_pending++; + + return ret; +} + +static int put_fw_buf_param(struct mvx_fw *fw, + struct mve_buffer_param *param, + size_t size) +{ + return write_message(fw, fw->buf_in_host, fw->buf_in_mve, + MVE_BUFFER_CODE_PARAM, + param, offsetof(typeof(*param), data) + size, + MVX_LOG_FWIF_CHANNEL_MESSAGE); +} + +static int put_message_v2(struct mvx_fw *fw, + struct mvx_fw_msg *msg) +{ + int ret = 0; + struct mve_request_set_option opt; + struct mve_buffer_param param; + struct mve_request_job job; + + memset(¶m, 0, sizeof(struct mve_buffer_param)); + memset(&opt, 0, sizeof(struct mve_request_set_option)); + memset(&job, 0, sizeof(struct mve_request_job)); + + switch (msg->code) { + case MVX_FW_CODE_STATE_CHANGE: { + unsigned int code = msg->state == MVX_FW_STATE_STOPPED ? + MVE_REQUEST_CODE_STOP : + MVE_REQUEST_CODE_GO; + + ret = write_message(fw, fw->msg_host, fw->msg_mve, + code, NULL, 0, + MVX_LOG_FWIF_CHANNEL_MESSAGE); + if (ret == 0) + fw->msg_pending++; + + break; + } + case MVX_FW_CODE_JOB: { + + job.cores = msg->job.cores; + job.frames = msg->job.frames; + job.flags = 0; + + ret = write_message(fw, fw->msg_host, fw->msg_mve, + MVE_REQUEST_CODE_JOB, &job, sizeof(job), + MVX_LOG_FWIF_CHANNEL_MESSAGE); + break; + } + case MVX_FW_CODE_SWITCH_OUT: { + ret = write_message(fw, fw->msg_host, fw->msg_mve, + MVE_REQUEST_CODE_SWITCH, NULL, 0, + MVX_LOG_FWIF_CHANNEL_MESSAGE); + break; + } + case MVX_FW_CODE_PING: { + ret = write_message(fw, fw->msg_host, fw->msg_mve, + MVE_REQUEST_CODE_PING, NULL, 0, + MVX_LOG_FWIF_CHANNEL_MESSAGE); + break; + } + case MVX_FW_CODE_SET_OPTION: { + switch (msg->set_option.code) { + case MVX_FW_SET_FRAME_RATE: { + + param.type = MVE_BUFFER_PARAM_TYPE_FRAME_RATE; + param.data.arg = msg->set_option.frame_rate; + ret = put_fw_buf_param(fw, ¶m, + sizeof(param.data.arg)); + break; + } + case MVX_FW_SET_TARGET_BITRATE: { + + param.type = MVE_BUFFER_PARAM_TYPE_RATE_CONTROL; + if (msg->set_option.target_bitrate == 0) { + param.data.rate_control.rate_control_mode = + MVE_OPT_RATE_CONTROL_MODE_OFF; + param.data.rate_control.target_bitrate = 0; + } else { + param.data.rate_control.rate_control_mode = + MVE_OPT_RATE_CONTROL_MODE_STANDARD; + param.data.rate_control.target_bitrate = + msg->set_option.target_bitrate; + } + + ret = put_fw_buf_param(fw, ¶m, + sizeof(param.data.rate_control)); + break; + } + case MVX_FW_SET_RATE_CONTROL_CHANGE_POS: { + + param.type = MVE_BUFFER_PARAM_TYPE_RATE_CONTROL_CHANGE_POS; + param.data.arg = msg->set_option.change_pos; + ret = put_fw_buf_param(fw, ¶m, + sizeof(param.data.arg)); + + break; + } + case MVX_FW_SET_RATE_CONTROL_JPEG: { + + opt.index = MVE_SET_OPT_INDEX_ENC_JPEG_RC; + + opt.data.jpeg_rate_control.fps = msg->set_option.jpeg_rc.fps; + opt.data.jpeg_rate_control.qscale = msg->set_option.jpeg_rc.qscale; + opt.data.jpeg_rate_control.qscale_luma = msg->set_option.jpeg_rc.qscale_luma; + opt.data.jpeg_rate_control.qscale_chroma = msg->set_option.jpeg_rc.qscale_chroma; + opt.data.jpeg_rate_control.change_pos = msg->set_option.jpeg_rc.change_pos; + ret = put_fw_opt(fw, &opt, sizeof(opt.data.jpeg_rate_control)); + break; + } + case MVX_FW_SET_RATE_CONTROL: { + + param.type = MVE_BUFFER_PARAM_TYPE_RATE_CONTROL; + if (msg->set_option.rate_control.target_bitrate == 0) { + param.data.rate_control.rate_control_mode = + MVE_OPT_RATE_CONTROL_MODE_OFF; + param.data.rate_control.target_bitrate = 0; + } else { + param.data.rate_control.rate_control_mode = + msg->set_option.rate_control.rate_control_mode; + param.data.rate_control.target_bitrate = + msg->set_option.rate_control.target_bitrate; + if (msg->set_option.rate_control.rate_control_mode == MVX_OPT_RATE_CONTROL_MODE_C_VARIABLE) { + param.data.rate_control.maximum_bitrate = + msg->set_option.rate_control.maximum_bitrate; + } + } + + ret = put_fw_buf_param(fw, ¶m, + sizeof(param.data.rate_control)); + break; + + } + case MVX_FW_SET_CROP_LEFT: { + + + opt.index = MVE_SET_OPT_INDEX_ENC_CROP_RARAM_LEFT; + opt.data.arg = msg->set_option.crop_left; + + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + break; + } + case MVX_FW_SET_CROP_RIGHT: { + + + opt.index = MVE_SET_OPT_INDEX_ENC_CROP_RARAM_RIGHT; + opt.data.arg = msg->set_option.crop_right; + + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + break; + } + case MVX_FW_SET_CROP_TOP: { + + + opt.index = MVE_SET_OPT_INDEX_ENC_CROP_RARAM_TOP; + opt.data.arg = msg->set_option.crop_top; + + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + + break; + } + case MVX_FW_SET_CROP_BOTTOM: { + + + opt.index = MVE_SET_OPT_INDEX_ENC_CROP_RARAM_BOTTOM; + opt.data.arg = msg->set_option.crop_bottom; + + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + + break; + } + case MVX_FW_SET_RC_BIT_I_MODE: { + + + opt.index = MVE_SET_OPT_INDEX_ENC_RC_I_BIT_MODE; + opt.data.arg = msg->set_option.rc_bit_i_mode; + + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + break; + } + case MVX_FW_SET_RC_BIT_I_RATIO: { + + + opt.index = MVE_SET_OPT_INDEX_ENC_RC_I_BIT_RATIO; + opt.data.arg = msg->set_option.rc_bit_i_ratio; + + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + + break; + } + case MVX_FW_SET_HRD_BUF_SIZE: { + + param.type = MVE_BUFFER_PARAM_TYPE_RATE_CONTROL_HRD_BUF_SIZE; + param.data.arg = msg->set_option.nHRDBufsize; + ret = put_fw_buf_param(fw, ¶m, + sizeof(param.data.arg)); + break; + } + case MVX_FW_SET_COLOUR_DESC: { + + param.type = MVE_BUFFER_PARAM_TYPE_COLOUR_DESCRIPTION; + param.data.colour_description.flags = msg->set_option.colour_desc.flags; + switch (msg->set_option.colour_desc.range) + { + case MVX_FW_RANGE_UNSPECIFIED: + param.data.colour_description.range = MVE_BUFFER_PARAM_COLOUR_RANGE_UNSPECIFIED; + break; + case MVX_FW_RANGE_LIMITED: + param.data.colour_description.range = MVE_BUFFER_PARAM_COLOUR_RANGE_LIMITED; + break; + case MVX_FW_RANGE_FULL: + param.data.colour_description.range = MVE_BUFFER_PARAM_COLOUR_RANGE_FULL; + break; + default: + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "Unknown fw buffer param color desc range. range=%u.", + msg->set_option.colour_desc.range); + return -EINVAL; + } + /* Color primaries according to HEVC E.3.1. */ + switch (msg->set_option.colour_desc.primaries) { + case MVX_FW_PRIMARIES_BT709: + param.data.colour_description.colour_primaries = 1; + break; + case MVX_FW_PRIMARIES_BT470M: + param.data.colour_description.colour_primaries = 4; + break; + case MVX_FW_PRIMARIES_BT601_625: + param.data.colour_description.colour_primaries = 5; + break; + case MVX_FW_PRIMARIES_BT601_525: + param.data.colour_description.colour_primaries = 6; + break; + case MVX_FW_PRIMARIES_GENERIC_FILM: + param.data.colour_description.colour_primaries = 8; + break; + case MVX_FW_PRIMARIES_BT2020: + param.data.colour_description.colour_primaries = 9; + break; + default: + param.data.colour_description.colour_primaries = 2; + break; + } + /* Transfer characteristics according to HEVC E.3.1. */ + switch (msg->set_option.colour_desc.transfer) { + case MVX_FW_TRANSFER_BT1361: + param.data.colour_description.transfer_characteristics = 1; + break; + case MVX_FW_TRANSFER_GAMMA22: + param.data.colour_description.transfer_characteristics = 4; + break; + case MVX_FW_TRANSFER_GAMMA28: + param.data.colour_description.transfer_characteristics = 5; + break; + case MVX_FW_TRANSFER_SMPTE170M: + param.data.colour_description.transfer_characteristics = 6; + break; + case MVX_FW_TRANSFER_SMPTE240M: + param.data.colour_description.transfer_characteristics = 7; + break; + case MVX_FW_TRANSFER_LINEAR: + param.data.colour_description.transfer_characteristics = 8; + break; + case MVX_FW_TRANSFER_HLG: + param.data.colour_description.transfer_characteristics = 9; + break; + case MVX_FW_TRANSFER_XVYCC: + param.data.colour_description.transfer_characteristics = 11; + break; + case MVX_FW_TRANSFER_SRGB: + param.data.colour_description.transfer_characteristics = 13; + break; + case MVX_FW_TRANSFER_ST2084: + param.data.colour_description.transfer_characteristics = 16; + break; + case MVX_FW_TRANSFER_ST428: + param.data.colour_description.transfer_characteristics = 17; + break; + default: + param.data.colour_description.transfer_characteristics = 2; + break; + } + /* Matrix coefficient according to HEVC E.3.1. */ + switch (msg->set_option.colour_desc.matrix) { + case MVX_FW_MATRIX_BT709: + param.data.colour_description.matrix_coeff = 1; + break; + case MVX_FW_MATRIX_BT470M: + param.data.colour_description.matrix_coeff = 5; + break; + case MVX_FW_MATRIX_BT601: + param.data.colour_description.matrix_coeff = 6; + break; + case MVX_FW_MATRIX_SMPTE240M: + param.data.colour_description.matrix_coeff = 7; + break; + case MVX_FW_MATRIX_BT2020: + param.data.colour_description.matrix_coeff = 9; + break; + case MVX_FW_MATRIX_BT2020Constant: + param.data.colour_description.matrix_coeff = 10; + break; + default: + param.data.colour_description.matrix_coeff = 2; + break; + } + param.data.colour_description.sar_height = msg->set_option.colour_desc.sar_height; + param.data.colour_description.sar_width = msg->set_option.colour_desc.sar_width; + if (msg->set_option.colour_desc.aspect_ratio_idc != 0) { + param.data.colour_description.aspect_ratio_idc = msg->set_option.colour_desc.aspect_ratio_idc; + param.data.colour_description.aspect_ratio_info_present_flag = 1; + } + if (msg->set_option.colour_desc.video_format != 0) { + param.data.colour_description.video_format = msg->set_option.colour_desc.video_format; + param.data.colour_description.video_format_present_flag = 1; + } + if (msg->set_option.colour_desc.time_scale != 0 || msg->set_option.colour_desc.num_units_in_tick != 0) { + param.data.colour_description.time_scale = msg->set_option.colour_desc.time_scale; + param.data.colour_description.num_units_in_tick = msg->set_option.colour_desc.num_units_in_tick; + param.data.colour_description.timing_flag_info_present_flag = 1; + } + if (msg->set_option.colour_desc.flags & MVX_FW_COLOR_DESC_CONTENT_VALID) { + param.data.colour_description.avg_content_light_level = + msg->set_option.colour_desc.content.luminance_average; + param.data.colour_description.max_content_light_level = + msg->set_option.colour_desc.content.luminance_max; + } + if (msg->set_option.colour_desc.flags & MVX_FW_COLOR_DESC_DISPLAY_VALID) { + param.data.colour_description.mastering_display_primaries_x[0] = + msg->set_option.colour_desc.display.r.x; + param.data.colour_description.mastering_display_primaries_x[1] = + msg->set_option.colour_desc.display.g.x; + param.data.colour_description.mastering_display_primaries_x[2] = + msg->set_option.colour_desc.display.b.x; + param.data.colour_description.mastering_display_primaries_y[0] = + msg->set_option.colour_desc.display.r.y; + param.data.colour_description.mastering_display_primaries_y[1] = + msg->set_option.colour_desc.display.g.y; + param.data.colour_description.mastering_display_primaries_y[2] = + msg->set_option.colour_desc.display.b.y; + param.data.colour_description.mastering_white_point_x = + msg->set_option.colour_desc.display.w.x; + param.data.colour_description.mastering_white_point_y = + msg->set_option.colour_desc.display.w.y; + param.data.colour_description.max_display_mastering_luminance = + msg->set_option.colour_desc.display.luminance_min; + param.data.colour_description.min_display_mastering_luminance = + msg->set_option.colour_desc.display.luminance_max; + } + ret = put_fw_buf_param(fw, ¶m, + sizeof(param.data.colour_description)); + + break; + + } + case MVX_FW_SET_OSD_CONFIG: { + + param.type = MVE_BUFFER_PARAM_TYPE_OSD_RECTANGLES; + memcpy(¶m.data.osd_rectangles_buff, &msg->set_option.osd_config.osd_single_cfg, + sizeof(param.data.osd_rectangles_buff)); + ret = put_fw_buf_param(fw, ¶m, + sizeof(param.data.osd_rectangles_buff)); + break; + } + case MVX_FW_SET_SEI_USERDATA: { + + param.type = MVE_BUFFER_PARAM_TYPE_SEI_USER_DATA_UNREGISTERED; + param.data.user_data_unregistered.user_data_len = msg->set_option.userdata.user_data_len; + param.data.user_data_unregistered.flags = msg->set_option.userdata.flags; + memcpy(¶m.data.user_data_unregistered.uuid, &msg->set_option.userdata.uuid, + sizeof(param.data.user_data_unregistered.uuid)); + memcpy(¶m.data.user_data_unregistered.user_data, &msg->set_option.userdata.user_data, + sizeof(param.data.user_data_unregistered.user_data)); + ret = put_fw_buf_param(fw, ¶m, + sizeof(param.data.user_data_unregistered)); + break; + } + case MVX_FW_SET_NALU_FORMAT: { + + + opt.index = MVE_SET_OPT_INDEX_NALU_FORMAT; + ret = to_mve_nalu_format(msg->set_option.nalu_format, + &opt.data.arg); + + if (ret == 0) + ret = put_fw_opt(fw, &opt, + sizeof(opt.data.arg)); + break; + } + case MVX_FW_SET_STREAM_ESCAPING: { + + + opt.index = MVE_SET_OPT_INDEX_STREAM_ESCAPING; + opt.data.arg = msg->set_option.stream_escaping ? 1 : 0; + + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + break; + } + case MVX_FW_SET_PROFILE_LEVEL: { + + + opt.index = MVE_SET_OPT_INDEX_PROFILE_LEVEL; + ret = fw->ops_priv.to_mve_profile( + msg->set_option.profile_level.profile, + &opt.data.profile_level.profile); + if (ret != 0) + return ret; + + ret = fw->ops_priv.to_mve_level( + msg->set_option.profile_level.level, + &opt.data.profile_level.level); + if (ret != 0) + return ret; + + ret = put_fw_opt( + fw, &opt, + sizeof(opt.data.profile_level)); + + break; + } + case MVX_FW_SET_IGNORE_STREAM_HEADERS: { + + + opt.index = MVE_SET_OPT_INDEX_IGNORE_STREAM_HEADERS; + opt.data.arg = + msg->set_option.ignore_stream_headers ? 1 : 0; + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + break; + } + case MVX_FW_SET_FRAME_REORDERING: { + + + opt.index = MVE_SET_OPT_INDEX_FRAME_REORDERING; + opt.data.arg = msg->set_option.frame_reordering ? 1 : 0; + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + break; + } + case MVX_FW_SET_INTBUF_SIZE: { + + + opt.index = MVE_SET_OPT_INDEX_INTBUF_SIZE; + opt.data.arg = msg->set_option.intbuf_size; + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + break; + } + case MVX_FW_SET_P_FRAMES: { + + + opt.index = MVE_SET_OPT_INDEX_ENC_P_FRAMES; + opt.data.arg = msg->set_option.pb_frames; + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + break; + } + case MVX_FW_SET_PROFILING: { + + + opt.index = MVE_SET_OPT_INDEX_PROFILING; + opt.data.arg = msg->set_option.profiling; + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + break; + } + case MVX_FW_SET_B_FRAMES: { + + + opt.index = MVE_SET_OPT_INDEX_ENC_B_FRAMES; + opt.data.arg = msg->set_option.pb_frames; + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + break; + } + case MVX_FW_SET_GOP_TYPE: { + + + opt.index = MVE_SET_OPT_INDEX_GOP_TYPE; + ret = to_mve_gop_type(msg->set_option.gop_type, + &opt.data.arg); + if (ret == 0) + ret = put_fw_opt(fw, &opt, + sizeof(opt.data.arg)); + + break; + } + case MVX_FW_SET_SVCT3_LEVEL1_PERIOD: { + + + opt.index = MVE_SET_OPT_INDEX_ENC_SVCT3_LEVEL1_PEROID; + opt.data.arg = msg->set_option.svct3_level1_period; + if (ret == 0) + ret = put_fw_opt(fw, &opt, + sizeof(opt.data.arg)); + break; + } + case MVX_FW_SET_INTER_MED_BUF_SIZE: { + + + opt.index = MVE_SET_OPT_INDEX_INTBUF_SIZE; + opt.data.arg = msg->set_option.inter_med_buf_size; + + if (ret == 0) + ret = put_fw_opt(fw, &opt, + sizeof(opt.data.arg)); + break; + } + case MVX_FW_SET_GOP_PFRAMES: { + + + param.type = MVE_BUFFER_PARAM_TYPE_GOP_RESET_DYNAMIC; + param.data.reset_gop_dynamic.reset_gop_pframes = msg->set_option.reset_gop_pframes; + ret = put_fw_buf_param(fw, ¶m, + sizeof(param.data.reset_gop_dynamic)); + break; + } + case MVX_FW_SET_LTR_PERIOD: { + + + param.type = MVE_BUFFER_PARAM_TYPE_GOP_RESET_LTR_PEROID_DYNAMIC; + param.data.reset_ltr_peroid_dynamic.reset_ltr_peroid_pframes = msg->set_option.reset_ltr_period; + ret = put_fw_buf_param(fw, ¶m, + sizeof(param.data.reset_ltr_peroid_dynamic)); + break; + } + case MVX_FW_SET_INTRA_MB_REFRESH: { + + + opt.index = MVE_SET_OPT_INDEX_INTRA_MB_REFRESH; + opt.data.arg = msg->set_option.intra_mb_refresh; + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + break; + } + case MVX_FW_SET_CONSTR_IPRED: { + + + opt.index = MVE_SET_OPT_INDEX_ENC_CONSTR_IPRED; + opt.data.arg = msg->set_option.constr_ipred ? 1 : 0; + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + break; + } + case MVX_FW_SET_ENTROPY_SYNC: { + + + opt.index = MVE_SET_OPT_INDEX_ENC_ENTROPY_SYNC; + opt.data.arg = msg->set_option.entropy_sync ? 1 : 0; + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + break; + } + case MVX_FW_SET_TEMPORAL_MVP: { + + + opt.index = MVE_SET_OPT_INDEX_ENC_TEMPORAL_MVP; + opt.data.arg = msg->set_option.temporal_mvp ? 1 : 0; + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + break; + } + case MVX_FW_SET_TILES: { + + + opt.index = MVE_SET_OPT_INDEX_TILES; + opt.data.tiles.tile_rows = msg->set_option.tile.rows; + opt.data.tiles.tile_cols = msg->set_option.tile.cols; + ret = put_fw_opt(fw, &opt, sizeof(opt.data.tiles)); + break; + } + case MVX_FW_SET_MIN_LUMA_CB_SIZE: { + + + opt.index = MVE_SET_OPT_INDEX_ENC_MIN_LUMA_CB_SIZE; + opt.data.arg = msg->set_option.min_luma_cb_size; + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + break; + } + case MVX_FW_SET_QP_RANGE: { + + + param.type = + MVE_BUFFER_PARAM_TYPE_RATE_CONTROL_QP_RANGE; + param.data.rate_control_qp_range.qp_min = + msg->set_option.qp_range.min; + param.data.rate_control_qp_range.qp_max = + msg->set_option.qp_range.max; + ret = put_fw_buf_param( + fw, ¶m, + sizeof(param.data.rate_control_qp_range)); + break; + } + case MVX_FW_SET_QP_RANGE_I: { + + + param.type = + MVE_BUFFER_PARAM_TYPE_RATE_CONTROL_QP_RANGE_I; + param.data.rate_control_qp_range.qp_min = + msg->set_option.qp_range.min; + param.data.rate_control_qp_range.qp_max = + msg->set_option.qp_range.max; + ret = put_fw_buf_param( + fw, ¶m, + sizeof(param.data.rate_control_qp_range)); + break; + } + case MVX_FW_SET_ENTROPY_MODE: { + + + opt.index = MVE_SET_OPT_INDEX_ENC_H264_CABAC; + ret = to_mve_h264_cabac(msg->set_option.entropy_mode, + &opt.data.arg); + if (ret == 0) + ret = put_fw_opt(fw, &opt, + sizeof(opt.data.arg)); + + break; + } + case MVX_FW_SET_SLICE_SPACING_MB: { + + + opt.index = MVE_SET_OPT_INDEX_ENC_SLICE_SPACING; + opt.data.arg = msg->set_option.slice_spacing_mb; + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + break; + } + case MVX_FW_SET_VP9_PROB_UPDATE: { + + + opt.index = MVE_SET_OPT_INDEX_ENC_VP9_PROB_UPDATE; + ret = to_mve_vp9_prob_update( + msg->set_option.vp9_prob_update, + &opt.data.arg); + if (ret == 0) + ret = put_fw_opt(fw, &opt, + sizeof(opt.data.arg)); + + break; + } + case MVX_FW_SET_MV_SEARCH_RANGE: { + + + opt.index = MVE_SET_OPT_INDEX_MV_SEARCH_RANGE; + opt.data.motion_vector_search_range.mv_search_range_x = + msg->set_option.mv.x; + opt.data.motion_vector_search_range.mv_search_range_y = + msg->set_option.mv.y; + ret = put_fw_opt( + fw, &opt, + sizeof(opt.data.motion_vector_search_range)); + break; + } + case MVX_FW_SET_BITDEPTH: { + + + opt.index = MVE_SET_OPT_INDEX_ENC_STREAM_BITDEPTH; + opt.data.bitdepth.luma_bitdepth = + msg->set_option.bitdepth.luma; + opt.data.bitdepth.chroma_bitdepth = + msg->set_option.bitdepth.chroma; + ret = put_fw_opt(fw, &opt, sizeof(opt.data.bitdepth)); + break; + } + case MVX_FW_SET_CHROMA_FORMAT: { + + + opt.index = MVE_SET_OPT_INDEX_ENC_STREAM_CHROMA_FORMAT; + opt.data.arg = msg->set_option.chroma_format; + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + break; + } + case MVX_FW_SET_RGB_TO_YUV_MODE: { + + int i = 0; + opt.index = MVE_SET_OPT_INDEX_ENC_RGB_TO_YUV_MODE; + opt.data.rgb2yuv_params.rgb2yuv_mode = 0; // no use + for( ; i < 9; i++){ + opt.data.rgb2yuv_params.coef[i] = msg->set_option.rgb2yuv_params.coef[i]; + } + + opt.data.rgb2yuv_params.luma_range[0] = msg->set_option.rgb2yuv_params.luma_range[0]; + opt.data.rgb2yuv_params.luma_range[1] = msg->set_option.rgb2yuv_params.luma_range[1]; + opt.data.rgb2yuv_params.chroma_range[0] = msg->set_option.rgb2yuv_params.chroma_range[0]; + opt.data.rgb2yuv_params.chroma_range[1] = msg->set_option.rgb2yuv_params.chroma_range[1]; + opt.data.rgb2yuv_params.rgb_range[0] = msg->set_option.rgb2yuv_params.rgb_range[0]; + opt.data.rgb2yuv_params.rgb_range[1] = msg->set_option.rgb2yuv_params.rgb_range[1]; + ret = put_fw_opt(fw, &opt, sizeof(opt.index) + sizeof(opt.data.rgb2yuv_params)); + break; + } + case MVX_FW_SET_BAND_LIMIT: { + + + opt.index = MVE_SET_OPT_INDEX_ENC_BANDWIDTH_LIMIT; + opt.data.arg = msg->set_option.band_limit; + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + break; + } + case MVX_FW_SET_CABAC_INIT_IDC: { + + + opt.index = MVE_SET_OPT_INDEX_ENC_CABAC_INIT_IDC; + opt.data.arg = msg->set_option.cabac_init_idc; + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + break; + } + case MVX_FW_SET_QP_I: { + + param.type = MVE_BUFFER_PARAM_TYPE_QP_I; + param.data.qp.qp = msg->set_option.qp; + ret = put_fw_buf_param(fw, ¶m, + sizeof(param.data.qp)); + break; + } + case MVX_FW_SET_QP_P: { + + param.type = MVE_BUFFER_PARAM_TYPE_QP_P; + param.data.qp.qp = msg->set_option.qp; + ret = put_fw_buf_param(fw, ¶m, + sizeof(param.data.qp)); + break; + } + case MVX_FW_SET_QP_B: { + + param.type = MVE_BUFFER_PARAM_TYPE_QP_B; + param.data.qp.qp = msg->set_option.qp; + ret = put_fw_buf_param(fw, ¶m, + sizeof(param.data.qp)); + break; + } + case MVX_FW_SET_FIXED_QP: { + + + opt.index = MVE_SET_OPT_INDEX_ENC_FIXED_QP; + opt.data.arg = msg->set_option.fixedqp; + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + break; + + } + case MVX_FW_SET_INIT_QP_I: { + + + opt.index = MVE_SET_OPT_INDEX_ENC_INIT_QPI; + opt.data.arg = msg->set_option.init_qpi; + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + break; + } + case MVX_FW_SET_INIT_QP_P: { + + + opt.index = MVE_SET_OPT_INDEX_ENC_INIT_QPP; + opt.data.arg = msg->set_option.init_qpp; + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + break; + } + case MVX_FW_SET_SAO_LUMA: { + + + opt.index = MVE_SET_OPT_INDEX_ENC_SAO_LUMA_EN; + opt.data.arg = msg->set_option.sao_luma; + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + break; + } + case MVX_FW_SET_SAO_CHROMA: { + + + opt.index = MVE_SET_OPT_INDEX_ENC_SAO_CHROMA_EN; + opt.data.arg = msg->set_option.sao_chroma; + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + break; + } + case MVX_FW_SET_QP_DELTA_I_P: { + + + opt.index = MVE_SET_OPT_INDEX_QP_DELTA_I_P; + opt.data.arg = msg->set_option.qp_delta_i_p; + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + break; + } + case MVX_FW_SET_QP_REF_RB_EN: { + + + opt.index = MVE_SET_OPT_INDEX_ENC_REF_RING_BUFFER; + opt.data.arg = msg->set_option.ref_rb_en; + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + break; + } + case MVX_FW_SET_RC_CLIP_TOP: { + + + opt.index = MVE_SET_OPT_INDEX_ENC_RC_CLIP_TOP; + opt.data.arg = msg->set_option.rc_qp_clip_top; + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + break; + } + case MVX_FW_SET_RC_CLIP_BOT: { + + + opt.index = MVE_SET_OPT_INDEX_ENC_RC_CLIP_BOTTOM; + opt.data.arg = msg->set_option.rc_qp_clip_bot; + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + break; + } + case MVX_FW_SET_QP_MAP_CLIP_TOP: { + + + opt.index = MVE_SET_OPT_INDEX_ENC_QPMAP_CLIP_TOP; + opt.data.arg = msg->set_option.qpmap_qp_clip_top; + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + break; + } + case MVX_FW_SET_QP_MAP_CLIP_BOT: { + + + opt.index = MVE_SET_OPT_INDEX_ENC_QPMAP_CLIP_BOTTOM; + opt.data.arg = msg->set_option.qpmap_qp_clip_bot; + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + break; + } + case MVX_FW_SET_RESYNC_INTERVAL: { + + + opt.index = MVE_SET_OPT_INDEX_RESYNC_INTERVAL; + opt.data.arg = msg->set_option.resync_interval; + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + break; + } + case MVX_FW_SET_QUANT_TABLE: { + + + opt.index = MVE_SET_OPT_INDEX_QUANT_TABLE; + + opt.data.quant_table.type = MVE_OPT_QUANT_TABLE_LUMA; + memcpy(opt.data.quant_table.matrix, + msg->set_option.quant_tbl.luma, + sizeof(opt.data.quant_table.matrix)); + ret = put_fw_opt(fw, &opt, + sizeof(opt.data.quant_table)); + if (ret != 0) + break; + + opt.data.quant_table.type = MVE_OPT_QUANT_TABLE_CHROMA; + memcpy(opt.data.quant_table.matrix, + msg->set_option.quant_tbl.chroma, + sizeof(opt.data.quant_table.matrix)); + ret = put_fw_opt(fw, &opt, + sizeof(opt.data.quant_table)); + break; + } + case MVX_FW_SET_HUFF_TABLE: { + + opt.index = MVE_SET_OPT_INDEX_HUFFMAN_TABLE; + if (msg->set_option.huff_table.type & MVX_OPT_HUFFMAN_TABLE_DC_LUMA) { + opt.data.huffman_table.type = MVE_OPT_HUFFMAN_TABLE_DC_LUMA; + memcpy(opt.data.huffman_table.number_of_huffman_of_code_length, + msg->set_option.huff_table.dc_luma_code_lenght, + sizeof(msg->set_option.huff_table.dc_luma_code_lenght)); + memcpy(opt.data.huffman_table.table, + msg->set_option.huff_table.dc_luma_table, + sizeof(msg->set_option.huff_table.dc_luma_table)); + ret = put_fw_opt(fw, &opt, + sizeof(opt.index) + sizeof(opt.data.huffman_table.type) + + sizeof(opt.data.huffman_table.number_of_huffman_of_code_length) + 12); + } + if (msg->set_option.huff_table.type & MVX_OPT_HUFFMAN_TABLE_AC_LUMA) { + opt.data.huffman_table.type = MVE_OPT_HUFFMAN_TABLE_AC_LUMA; + memcpy(opt.data.huffman_table.number_of_huffman_of_code_length, + msg->set_option.huff_table.ac_luma_code_lenght, + sizeof(msg->set_option.huff_table.ac_luma_code_lenght)); + memcpy(opt.data.huffman_table.table, + msg->set_option.huff_table.ac_luma_table, + sizeof(msg->set_option.huff_table.ac_luma_table)); + ret = put_fw_opt(fw, &opt, + sizeof(opt.index) + sizeof(opt.data.huffman_table.type) + + sizeof(opt.data.huffman_table.number_of_huffman_of_code_length) + 162); + } + if (msg->set_option.huff_table.type & MVX_OPT_HUFFMAN_TABLE_DC_CHROMA) { + opt.data.huffman_table.type = MVE_OPT_HUFFMAN_TABLE_DC_CHROMA; + memcpy(opt.data.huffman_table.number_of_huffman_of_code_length, + msg->set_option.huff_table.dc_chroma_code_lenght, + sizeof(msg->set_option.huff_table.dc_chroma_code_lenght)); + memcpy(opt.data.huffman_table.table, + msg->set_option.huff_table.dc_chroma_table, + sizeof(msg->set_option.huff_table.dc_chroma_table)); + ret = put_fw_opt(fw, &opt, + sizeof(opt.index) + sizeof(opt.data.huffman_table.type) + + sizeof(opt.data.huffman_table.number_of_huffman_of_code_length) + 12); + } + if (msg->set_option.huff_table.type & MVX_OPT_HUFFMAN_TABLE_AC_CHROMA) { + opt.data.huffman_table.type = MVE_OPT_HUFFMAN_TABLE_AC_CHROMA; + memcpy(opt.data.huffman_table.number_of_huffman_of_code_length, + msg->set_option.huff_table.ac_chroma_code_lenght, + sizeof(msg->set_option.huff_table.ac_chroma_code_lenght)); + memcpy(opt.data.huffman_table.table, + msg->set_option.huff_table.ac_chroma_table, + sizeof(msg->set_option.huff_table.ac_chroma_table)); + ret = put_fw_opt(fw, &opt, + sizeof(opt.index) + sizeof(opt.data.huffman_table.type) + + sizeof(opt.data.huffman_table.number_of_huffman_of_code_length) + 162); + } + + break; + } + case MVX_FW_SET_WATCHDOG_TIMEOUT: { + + + opt.index = MVE_SET_OPT_INDEX_WATCHDOG_TIMEOUT; + opt.data.arg = msg->set_option.watchdog_timeout; + + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + + opt.index = MVE_SET_OPT_INDEX_HOST_PROTOCOL_PRINTS; + opt.data.arg = 1; + ret = put_fw_opt(fw, &opt,sizeof(opt.data.arg)); + break; + } + case MVX_FW_SET_ROI_REGIONS: { + int i = 0; + param.type = MVE_BUFFER_PARAM_TYPE_REGIONS; + param.data.regions.n_regions = msg->set_option.roi_config.num_roi; + for (;i < msg->set_option.roi_config.num_roi; i++) { + param.data.regions.region[i].mbx_left = msg->set_option.roi_config.roi[i].mbx_left; + param.data.regions.region[i].mbx_right = msg->set_option.roi_config.roi[i].mbx_right; + param.data.regions.region[i].mby_top = msg->set_option.roi_config.roi[i].mby_top; + param.data.regions.region[i].mby_bottom = msg->set_option.roi_config.roi[i].mby_bottom; + param.data.regions.region[i].qp_delta = msg->set_option.roi_config.roi[i].qp_delta; + param.data.regions.region[i].prio = msg->set_option.roi_config.roi[i].prio; + param.data.regions.region[i].force_intra = msg->set_option.roi_config.roi[i].force_intra; + } + ret = put_fw_buf_param(fw, ¶m, + sizeof(param.data.regions)); + break; + } + case MVX_FW_SET_QP_REGION: { + + param.type = MVE_BUFFER_PARAM_TYPE_QP; + param.data.qp.qp = msg->set_option.qp; + param.data.qp.epr_iframe_enable = 0; + ret = put_fw_buf_param(fw, ¶m, + sizeof(param.data.qp)); + break; + } + case MVX_FW_SET_EPR_QP: { + + param.type = MVE_BUFFER_PARAM_TYPE_QP; + param.data.qp.qp = msg->set_option.qp; + param.data.qp.epr_iframe_enable = msg->set_option.epr_qp.epr_iframe_enable; + ret = put_fw_buf_param(fw, ¶m, + sizeof(param.data.qp)); + break; + + } + case MVX_FW_SET_CHR_CFG: { + + param.type = MVE_BUFFER_PARAM_TYPE_CHANGE_RECTANGLES; + param.data.change_rectangles.n_rectangles = msg->set_option.chr_cfg.num_chr; + memcpy(param.data.change_rectangles.rectangles, msg->set_option.chr_cfg.rectangle, sizeof(msg->set_option.chr_cfg.rectangle)); + ret = put_fw_buf_param(fw, ¶m, + sizeof(param.data.regions)); + break; + } + case MVX_FW_SET_DSL_FRAME: { + + opt.index = MVE_SET_OPT_INDEX_DEC_DOWNSCALE; + opt.data.downscaled_frame.width = msg->set_option.dsl_frame.width; + opt.data.downscaled_frame.height = msg->set_option.dsl_frame.height; + ret = put_fw_opt(fw, &opt, sizeof(opt.index) + sizeof(opt.data.downscaled_frame)); + break; + } + case MVX_FW_SET_LONG_TERM_REF: { + + if (msg->set_option.ltr.mode >= 1 && msg->set_option.ltr.mode <= 8) { + opt.index = MVE_SET_OPT_INDEX_ENC_LTR_MODE; + opt.data.arg = msg->set_option.ltr.mode; + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + } + if (msg->set_option.ltr.period >= 1 && msg->set_option.ltr.period <= 255) { + opt.index = MVE_SET_OPT_INDEX_ENC_LTR_PERIOD; + opt.data.arg = msg->set_option.ltr.period; + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + } + break; + } + case MVX_FW_SET_DSL_MODE: { + + opt.index = MVE_SET_OPT_INDEX_DEC_DOWNSCALE_POS_MODE; + opt.data.dsl_pos.mode = msg->set_option.dsl_pos_mode; + ret = put_fw_opt(fw, &opt, sizeof(opt.index) + sizeof(opt.data.dsl_pos)); + break; + } + case MVX_FW_SET_DSL_INTERP_MODE:{ + + opt.index = MVE_SET_OPT_INDEX_DEC_DSL_INTERP_MODE; + opt.data.interp_mode.mode = msg->set_option.dsl_interp_mode; + ret = put_fw_opt(fw, &opt, sizeof(opt.index) + sizeof(opt.data.interp_mode)); + break; + } + case MVX_FW_SET_MINI_FRAME_HEIGHT: { + + opt.index = MVE_SET_OPT_INDEX_MINI_FRAME_HEIGHT_PIX; + opt.data.arg = msg->set_option.mini_frame_height; + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + break; + } + case MVX_FW_SET_STATS_MODE: { + + param.type = MVE_BUFFER_PARAM_TYPE_ENC_STATS; + param.data.enc_stats.mms_buffer_size = msg->set_option.enc_stats.mms_buffer_size; + param.data.enc_stats.bitcost_buffer_size = msg->set_option.enc_stats.bitcost_buffer_size; + param.data.enc_stats.qp_buffer_size = msg->set_option.enc_stats.qp_buffer_size; + param.data.enc_stats.flags = msg->set_option.enc_stats.flags; + ret = put_fw_buf_param(fw, ¶m, + sizeof(param.data.enc_stats)); + + break; + } + case MVX_FW_SET_GDR_NUMBER: { + + opt.index = MVE_SET_OPT_INDEX_ENC_GDR_NUMBER; + opt.data.arg = msg->set_option.gdr_number; + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + break; + } + case MVX_FW_SET_GDR_PERIOD: { + + opt.index = MVE_SET_OPT_INDEX_ENC_GDR_PERIOD; + opt.data.arg = msg->set_option.gdr_period; + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + break; + } + case MVX_FW_SET_MULTI_SPS_PPS:{ + + opt.index = MVE_SET_OPT_INDEX_ENC_MULTI_SPS_PPS; + opt.data.arg = msg->set_option.multi_sps_pps; + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + break; + } + case MVX_FW_SET_VISUAL_ENABLE:{ + + opt.index = MVE_SET_OPT_iNDEX_ENC_VISUAL_ENABLE; + opt.data.arg = msg->set_option.enable_visual; + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + break; + } + case MVX_FW_SET_VISUAL_ENABLE_ADAPTIVE_INTRA_BLOCK:{ + + opt.index = MVE_SET_OPT_INDEX_SCD_ADAPTIVE_I; + opt.data.arg = msg->set_option.adaptive_intra_block; + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + break; + } + case MVX_FW_SET_ADPTIVE_QUANTISATION:{ + + opt.index = MVE_SET_OPT_INDEX_ENC_ADPTIVE_QUANTISATION; + opt.data.arg = msg->set_option.adapt_qnt; + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + break; + } + case MVX_FW_SET_DISABLE_FEATURES:{ + + opt.index = MVE_SET_OPT_INDEX_DISABLE_FEATURES; + opt.data.arg = msg->set_option.disabled_features; + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + break; + } + case MVX_FW_SET_SCD_ENABLE:{ + + opt.index = MVE_SET_OPT_INDEX_SCD_ENABLE; + opt.data.arg = msg->set_option.scd_enable; + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + break; + } + case MVX_FW_SET_SCD_PERCENT:{ + + opt.index = MVE_SET_OPT_INDEX_SCD_PERCENT; + opt.data.arg = msg->set_option.scd_percent; + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + break; + } + case MVX_FW_SET_SCD_THRESHOLD:{ + + opt.index = MVE_SET_OPT_INDEX_SCD_THRESHOLD; + opt.data.arg = msg->set_option.scd_threshold; + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + break; + } + case MVX_FW_SET_AQ_SSIM_EN:{ + + opt.index = MVE_SET_OPT_INDEX_ENC_AQ_SSIM_EN; + opt.data.arg = msg->set_option.aq_ssim_en; + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + break; + } + case MVX_FW_SET_AQ_NEG_RATIO:{ + + opt.index = MVE_SET_OPT_INDEX_ENC_AQ_NEG_RATIO; + opt.data.arg = msg->set_option.aq_neg_ratio; + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + break; + } + case MVX_FW_SET_AQ_POS_RATIO:{ + + opt.index = MVE_SET_OPT_INDEX_ENC_AQ_POS_RATIO; + opt.data.arg = msg->set_option.aq_pos_ratio; + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + break; + } + case MVX_FW_SET_AQ_QPDELTA_LMT:{ + + opt.index = MVE_SET_OPT_INDEX_ENC_AQ_QPDELTA_LMT; + opt.data.arg = msg->set_option.aq_qpdelta_lmt; + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + break; + } + case MVX_FW_SET_AQ_INIT_FRM_AVG_SVAR:{ + + opt.index = MVE_SET_OPT_INDEX_ENC_AQ_INIT_FRM_AVG_SVAR; + opt.data.arg = msg->set_option.aq_init_frm_avg_svar; + ret = put_fw_opt(fw, &opt, sizeof(opt.data.arg)); + break; + } + case MVX_FW_SET_DEC_YUV2RGB_PARAMS:{ + + opt.index = MVE_SET_OPT_INDEX_DEC_YUV2RGB_PARAMS; + memcpy(&opt.data.yuv2rgb_params,&msg->set_option.yuv2rbg_csc_coef,sizeof(struct mvx_color_conv_coef)); + ret = put_fw_opt(fw, &opt, sizeof(opt.index) + sizeof(opt.data.yuv2rgb_params)); + break; + } + case MVX_FW_SET_ENC_FORCED_UV_VAL:{ + + opt.index = MVE_SET_OPT_INDEX_ENC_FORCED_UV_VAL; + opt.data.gray_uv_value.value = msg->set_option.forced_uv_value; + ret = put_fw_opt(fw, &opt, sizeof(opt.index) + sizeof(opt.data.gray_uv_value)); + break; + } + case MVX_FW_SET_ENC_SRC_CROPPING:{ + + opt.index = MVE_SET_OPT_INDEX_ENC_SRC_CROPPING; + memcpy(&opt.data.enc_src_crop,&msg->set_option.enc_src_crop,sizeof(struct mvx_crop_cfg)); + ret = put_fw_opt(fw, &opt, sizeof(opt.index) + sizeof(opt.data.enc_src_crop)); + break; + } + case MVX_FW_SET_DEC_DST_CROPPING:{ + + opt.index = MVE_SET_OPT_INDEX_DEC_DST_CROPPING; + memcpy(&opt.data.dec_dst_crop,&msg->set_option.dec_dst_crop,sizeof(struct mvx_crop_cfg)); + ret = put_fw_opt(fw, &opt, sizeof(opt.index) + sizeof(opt.data.dec_dst_crop)); + break; + } + default: + ret = -EINVAL; + } + + break; + } + case MVX_FW_CODE_FLUSH: { + switch (msg->flush.dir) { + case MVX_DIR_INPUT: + ret = write_message(fw, fw->msg_host, fw->msg_mve, + MVE_REQUEST_CODE_INPUT_FLUSH, NULL, + 0, MVX_LOG_FWIF_CHANNEL_MESSAGE); + break; + case MVX_DIR_OUTPUT: + ret = write_message(fw, fw->msg_host, fw->msg_mve, + MVE_REQUEST_CODE_OUTPUT_FLUSH, NULL, + 0, MVX_LOG_FWIF_CHANNEL_MESSAGE); + break; + default: + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "Invalid flush direction. dir=%d.", + msg->flush.dir); + return -EINVAL; + } + + if (ret == 0) + fw->msg_pending++; + + break; + } + case MVX_FW_CODE_BUFFER: { + struct mve_comm_area_host *host; + struct mve_comm_area_mve *mve; + enum mvx_log_fwif_channel channel; + + if (msg->buf->dir == MVX_DIR_INPUT) { + host = fw->buf_in_host; + mve = fw->buf_in_mve; + channel = MVX_LOG_FWIF_CHANNEL_INPUT_BUFFER; + } else { + host = fw->buf_out_host; + mve = fw->buf_out_mve; + channel = MVX_LOG_FWIF_CHANNEL_OUTPUT_BUFFER; + } + + if (mvx_is_frame(msg->buf->format)) + { + if(msg->buf->dir == MVX_DIR_OUTPUT) + { + if ((msg->buf->flags & MVX_BUFFER_FRAME_FLAG_GENERAL) == MVX_BUFFER_FRAME_FLAG_GENERAL) + { + ret = put_buffer_general(fw, host, mve, msg, channel); + ret = put_buffer_frame(fw, host, mve, msg, channel); + } + else + { + ret = put_buffer_frame(fw, host, mve, msg, channel); + } + } + else + { + if ((msg->buf->flags & MVX_BUFFER_FRAME_FLAG_GENERAL) == MVX_BUFFER_FRAME_FLAG_GENERAL) + { + ret = put_buffer_general(fw, host, mve, msg, channel); + } + else + { + ret = put_buffer_frame(fw, host, mve, msg, channel); + } + } + } + else + { + ret = put_buffer_bitstream(fw, host, mve, msg, channel); + } + break; + } + case MVX_FW_CODE_IDLE_ACK: { + if (fw->ops_priv.send_idle_ack != NULL) + ret = fw->ops_priv.send_idle_ack(fw); + + break; + } + case MVX_FW_CODE_EOS: { + struct mve_comm_area_host *host; + struct mve_comm_area_mve *mve; + enum mvx_log_fwif_channel channel; + + /* The message is on the MVX_DIR_INPUT side. */ + host = fw->buf_in_host; + mve = fw->buf_in_mve; + channel = MVX_LOG_FWIF_CHANNEL_INPUT_BUFFER; + + if (msg->eos_is_frame != false) { + struct mve_buffer_frame f = { + .host_handle = MVX_FW_CODE_EOS, + .frame_flags = MVE_BUFFER_FRAME_FLAG_EOS, + .format = MVE_FORMAT_YUV420_NV12 + }; + + ret = write_message(fw, host, mve, + MVE_BUFFER_CODE_FRAME, + &f, sizeof(f), channel); + } else { + struct mve_buffer_bitstream b = { + .host_handle = MVX_FW_CODE_EOS, + .bitstream_buf_addr = + MVE_MEM_REGION_PROTECTED_ADDR_BEGIN, + .bitstream_flags = + MVE_BUFFER_BITSTREAM_FLAG_EOS + }; + + ret = write_message(fw, host, mve, + MVE_BUFFER_CODE_BITSTREAM, &b, + sizeof(b), channel); + } + + break; + } + case MVX_FW_CODE_DUMP: { + ret = write_message(fw, fw->msg_host, fw->msg_mve, + MVE_REQUEST_CODE_DUMP, NULL, + 0, MVX_LOG_FWIF_CHANNEL_MESSAGE); + fw->msg_pending++; + break; + } + case MVX_FW_CODE_DEBUG: { + ret = write_message(fw, fw->msg_host, fw->msg_mve, + MVE_REQUEST_CODE_DEBUG, &msg->arg, + sizeof(msg->arg), MVX_LOG_FWIF_CHANNEL_MESSAGE); + fw->msg_pending++; + break; + } + default: { + ret = -EINVAL; + break; + } + } + + if (ret != 0) + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "Firmware put message failed. ret=%d.", ret); + + return ret; +} + +/** + * find_pages() - Find a page allocate in the map. + * @fw: Pointer to firmware object. + * @va: MVE virtual address. + * + * Return: Pointer to pages, NULL if not found. + */ +static struct mvx_mmu_pages *find_pages(struct mvx_fw *fw, + mvx_mmu_va va) +{ + struct mvx_mmu_pages *pages; + + hash_for_each_possible(fw->rpc_mem, pages, node, va) { + if (pages->va == va) + return pages; + } + + return NULL; +} + +static void rpc_mem_alloc(struct mvx_fw *fw, + struct mve_rpc_communication_area *rpc_area) +{ + union mve_rpc_params *p = &rpc_area->params; + enum mvx_fw_region region; + struct mvx_mmu_pages *pages; + size_t npages; + size_t max_pages; + mvx_mmu_va va = 0; + mvx_mmu_va va0,va_next; + mvx_mmu_va end; + int ret; + uint8_t log2_alignment; + uint32_t alignment_pages; + uint32_t alignment_bytes; + uint32_t total_used_pages = 0; + + if (IS_ENABLED(CONFIG_DEBUG_FS)) { + ret = mutex_lock_interruptible(&fw->rpcmem_mutex); + if (ret != 0) { + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_ERROR, + "Cannot protect RPC alloc list."); + goto out; + } + } + + switch (p->mem_alloc.region) { + case MVE_MEM_REGION_PROTECTED: + region = MVX_FW_REGION_PROTECTED; + total_used_pages = fw->latest_used_region_protected_pages; + break; + case MVE_MEM_REGION_OUTBUF: + region = MVX_FW_REGION_FRAMEBUF; + total_used_pages = fw->latest_used_region_outbuf_pages; + break; + default: + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "Unsupported RPC mem alloc region. region=%u.", + p->mem_alloc.region); + goto unlock_mutex; + } + + ret = fw->ops.get_region(region, &va, &end); + if (ret != 0) + goto unlock_mutex; + + va0 = va; + + npages = DIV_ROUND_UP(p->mem_alloc.size, MVE_PAGE_SIZE); + max_pages = DIV_ROUND_UP(p->mem_alloc.max_size, MVE_PAGE_SIZE); + + if (fw->fw_bin->securevideo != false) { + struct dma_buf *dmabuf; + + dmabuf = mvx_secure_mem_alloc(fw->fw_bin->secure.secure, + p->mem_alloc.size); + if (IS_ERR(dmabuf)) + goto unlock_mutex; + + pages = mvx_mmu_alloc_pages_dma_buf(fw->dev, dmabuf, max_pages); + if (IS_ERR(pages)) { + dma_buf_put(dmabuf); + goto unlock_mutex; + } + } else { + pages = mvx_mmu_alloc_pages(fw->dev, npages, max_pages); + if (IS_ERR(pages)) + goto unlock_mutex; + } + + va += (total_used_pages << MVE_PAGE_SHIFT); + log2_alignment = p->mem_alloc.log2_alignment <= MVE_PAGE_SHIFT ? MVE_PAGE_SHIFT : p->mem_alloc.log2_alignment; + alignment_bytes = 1 << log2_alignment; + alignment_pages = alignment_bytes >> MVE_PAGE_SHIFT; + ret = -EINVAL; + while (va < end) { + va = (va + alignment_bytes - 1) & ~(alignment_bytes - 1); + ret = mvx_mmu_map_pages(fw->mmu, va, pages, MVX_ATTR_SHARED_RW, + MVX_ACCESS_READ_WRITE); + if (ret == 0){ + va_next = va + MVE_PAGE_SIZE * pages->capacity; + total_used_pages = (va_next - va0) >> MVE_PAGE_SHIFT; + break; + } + + //va += 16 * 1024 * 1024; /* 16MB */ + va += alignment_bytes; + } + + if (ret != 0) { + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "Failed to find memory region for RPC alloc."); + mvx_mmu_free_pages(pages); + va = 0; + goto unlock_mutex; + } + + switch (p->mem_alloc.region) { + case MVE_MEM_REGION_PROTECTED: + fw->latest_used_region_protected_pages = total_used_pages; + break; + case MVE_MEM_REGION_OUTBUF: + fw->latest_used_region_outbuf_pages = total_used_pages; + break; + default: + break; + } + + hash_add(fw->rpc_mem, &pages->node, pages->va); + + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_INFO, + "RPC alloc memory. size=%u, max_size=%u, region=%u, npages=%zu, va=0x%x.", + p->mem_alloc.size, p->mem_alloc.max_size, + p->mem_alloc.region, npages, va); + +unlock_mutex: + if (IS_ENABLED(CONFIG_DEBUG_FS)) + mutex_unlock(&fw->rpcmem_mutex); + +out: + rpc_area->size = sizeof(uint32_t); + p->data[0] = va; +} + +static void rpc_mem_resize(struct mvx_fw *fw, + struct mve_rpc_communication_area *rpc_area) +{ + union mve_rpc_params *p = &rpc_area->params; + struct mvx_mmu_pages *pages; + mvx_mmu_va va = 0; + int ret; + + if (IS_ENABLED(CONFIG_DEBUG_FS)) { + ret = mutex_lock_interruptible(&fw->rpcmem_mutex); + if (ret != 0) { + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_ERROR, + "Cannot protect RPC alloc list."); + goto out; + } + } + + pages = find_pages(fw, p->mem_resize.ve_pointer); + if (pages != 0) { + size_t size; + size_t npages; + int ret; + + if (fw->fw_bin->securevideo != false) { + size = mvx_mmu_size_pages(pages); + + /* The size of RPC memory is only increased. */ + if (size < p->mem_resize.new_size) { + struct dma_buf *dmabuf; + + size = p->mem_resize.new_size - size; + + /* Allocate a new secure DMA buffer. */ + dmabuf = mvx_secure_mem_alloc( + fw->fw_bin->secure.secure, size); + if (IS_ERR(dmabuf)) + goto unlock_mutex; + + ret = mvx_mmu_pages_append_dma_buf( + pages, dmabuf); + if (ret != 0) { + dma_buf_put(dmabuf); + goto unlock_mutex; + } + } + } else { + /* Resize the allocated pages. */ + npages = DIV_ROUND_UP(p->mem_resize.new_size, + MVE_PAGE_SIZE); + ret = mvx_mmu_resize_pages(pages, npages); + if (ret != 0) { + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "Failed to resize RPC mapped pages. ret=%d.", + ret); + goto unlock_mutex; + } + } + + va = pages->va; + } else { + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "Could not find pages for RPC resize. va=0x%x.", + p->mem_resize.ve_pointer); + } + + fw->client_ops->flush_mmu(fw->csession); + + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_INFO, + "RPC resize memory. va=0x%x, new_size=%u.", + p->mem_resize.ve_pointer, p->mem_resize.new_size); + +unlock_mutex: + if (IS_ENABLED(CONFIG_DEBUG_FS)) + mutex_unlock(&fw->rpcmem_mutex); + +out: + rpc_area->size = sizeof(uint32_t); + p->data[0] = va; +} + +static void rpc_mem_free(struct mvx_fw *fw, + struct mve_rpc_communication_area *rpc_area) +{ + union mve_rpc_params *p = &rpc_area->params; + struct mvx_mmu_pages *pages; + int ret; + + if (IS_ENABLED(CONFIG_DEBUG_FS)) { + ret = mutex_lock_interruptible(&fw->rpcmem_mutex); + if (ret != 0) { + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_ERROR, + "Cannot protect RPC alloc list."); + return; + } + } + + pages = find_pages(fw, p->mem_free.ve_pointer); + if (pages != NULL) { + hash_del(&pages->node); + if(MVE_MEM_REGION_PROTECTED_ADDR_BEGIN <= p->mem_free.ve_pointer && p->mem_free.ve_pointer < MVE_MEM_REGION_PROTECTED_ADDR_END){ + fw->latest_used_region_protected_pages = fw->latest_used_region_protected_pages > pages->capacity ? fw->latest_used_region_protected_pages - pages->capacity : 0; + } else if(MVE_MEM_REGION_FRAMEBUF_ADDR_BEGIN <= p->mem_free.ve_pointer && p->mem_free.ve_pointer < MVE_MEM_REGION_FRAMEBUF_ADDR_END){ + fw->latest_used_region_outbuf_pages = fw->latest_used_region_outbuf_pages > pages->capacity ? fw->latest_used_region_outbuf_pages - pages->capacity : 0; + } + mvx_mmu_free_pages(pages); + } else { + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "Could not find pages for RPC free. va=0x%x.", + p->mem_free.ve_pointer); + } + + fw->client_ops->flush_mmu(fw->csession); + + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_INFO, + "RPC free memory. va=0x%x.", p->mem_free.ve_pointer); + + rpc_area->size = 0; + if (IS_ENABLED(CONFIG_DEBUG_FS)) + mutex_unlock(&fw->rpcmem_mutex); +} + +/** + * rstrip() - Remove trailing chars from string. + * @s: String to be stripped. + * @t: String containing chars to be stripped. + * + * Return: Pointer to stripped string. + */ +static char *rstrip(char *str, + char *trim) +{ + size_t l = strlen(str); + + while (l-- > 0) { + char *t; + + for (t = trim; *t != '\0'; t++) + if (str[l] == *t) { + str[l] = '\0'; + break; + } + + if (*t == '\0') + break; + } + + return str; +} + +static int handle_rpc_v2(struct mvx_fw *fw) +{ + struct mve_rpc_communication_area *rpc_area = fw->rpc; + int ret = 0; + + dma_sync_single_for_cpu(fw->dev, + virt_to_phys(rpc_area), sizeof(*rpc_area), + DMA_FROM_DEVICE); + + if (rpc_area->state == MVE_RPC_STATE_PARAM) { + ret = 1; + + /* Log RPC request. */ + MVX_LOG_EXECUTE(&mvx_log_fwif_if, MVX_LOG_INFO, + log_rpc(fw->session, + MVX_LOG_FWIF_DIRECTION_FIRMWARE_TO_HOST, + rpc_area)); + + switch (rpc_area->call_id) { + case MVE_RPC_FUNCTION_DEBUG_PRINTF: { + VPU_LOG2MEM("RPC_PRINT=%s\n", rstrip(rpc_area->params.debug_print.string,"\n\r")); + MVX_LOG_PRINT( + &mvx_log_if, MVX_LOG_INFO, + "RPC_PRINT=%s", + rstrip(rpc_area->params.debug_print.string, + "\n\r")); + break; + } + case MVE_RPC_FUNCTION_MEM_ALLOC: { + rpc_mem_alloc(fw, rpc_area); + break; + } + case MVE_RPC_FUNCTION_MEM_RESIZE: { + rpc_mem_resize(fw, rpc_area); + break; + } + case MVE_RPC_FUNCTION_MEM_FREE: { + rpc_mem_free(fw, rpc_area); + break; + } + default: + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_INFO, + "Unsupported RPC request. call_id=%u.", + rpc_area->call_id); + ret = -EINVAL; + break; + } + + /* + * Make sure the whole RPC message body has been written before + * the RPC message area is returned to the firmware. + */ + wmb(); + rpc_area->state = MVE_RPC_STATE_RETURN; + + /* Make sure state is written before memory is flushed. */ + wmb(); + dma_sync_single_for_device( + fw->dev, + virt_to_phys(rpc_area), sizeof(*rpc_area), + DMA_TO_DEVICE); + + /* Log RPC response. */ + MVX_LOG_EXECUTE(&mvx_log_fwif_if, MVX_LOG_INFO, + log_rpc(fw->session, + MVX_LOG_FWIF_DIRECTION_HOST_TO_FIRMWARE, + rpc_area)); + + fw->client_ops->send_irq(fw->csession); + } + + return ret; +} + +#define RAM_PRINTBUF_SIZE MVE_FW_PRINT_RAM_SIZE +#define RAM_PRINT_MAX_LEN (128) +#define RAM_PRINT_BUF_CNT ((RAM_PRINTBUF_SIZE / RAM_PRINT_MAX_LEN) - 1) +#define RAM_PRINT_FLAG (0x11223356) +static int handle_fw_ram_print_v2(struct mvx_fw *fw) +{ + struct mve_fw_ram_print_head_aera *rpt_area = fw->fw_print_ram; + int ret = 0; + uint32_t wr_cnt; + uint32_t rd_cnt = 0; + uint32_t cnt; + uint32_t rd_idx; + char *print_buf = NULL; + + dma_sync_single_for_cpu(fw->dev, + virt_to_phys(rpt_area), sizeof(*rpt_area), + DMA_FROM_DEVICE); + + wr_cnt = rpt_area->wr_cnt; + rd_cnt = rpt_area->rd_cnt; + cnt = (rd_cnt <= wr_cnt) ? wr_cnt - rd_cnt : wr_cnt - rd_cnt + (uint32_t)~0u; + + if(RAM_PRINT_FLAG == rpt_area->flag && RAM_PRINT_BUF_CNT > rpt_area->index && cnt){ + //printk("RPT:flag=%x, idx=%u, wr_cnt=%u, rd_cnt=%u.\n", rpt_area->flag, rpt_area->index, wr_cnt, rd_cnt); + + while(cnt--){ + rd_idx = rd_cnt % RAM_PRINT_BUF_CNT; + print_buf = (fw->fw_print_ram + RAM_PRINT_MAX_LEN ) + rd_idx * RAM_PRINT_MAX_LEN; + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, "FW-%u: %s\n", rd_cnt, print_buf); + rd_cnt++; + } + + rpt_area->rd_cnt = rd_cnt; + /* Make sure rpt_area->rd_cnt is written before memory is flushed. */ + wmb(); + dma_sync_single_for_device( + fw->dev, + virt_to_phys(&rpt_area->rd_cnt), sizeof(rpt_area->rd_cnt), + DMA_TO_DEVICE); + + ret = 1; + } + + return ret; +} + +static void unmap_msq(struct mvx_fw *fw, + void **data, + enum mvx_fw_region region) +{ + int ret; + mvx_mmu_va begin; + mvx_mmu_va end; + + if (*data == NULL) + return; + + ret = fw->ops.get_region(region, &begin, &end); + if (ret == 0) + mvx_mmu_unmap_va(fw->mmu, begin, MVE_PAGE_SIZE); + + mvx_mmu_free_page(fw->dev, virt_to_phys(*data)); + + *data = NULL; +} + +static int map_msq(struct mvx_fw *fw, + void **data, + enum mvx_fw_region region) +{ + phys_addr_t page; + mvx_mmu_va begin; + mvx_mmu_va end; + int ret; + + /* Get virtual address where the message queue is to be mapped. */ + ret = fw->ops.get_region(region, &begin, &end); + if (ret != 0) + return ret; + + /* Allocate page and store Linux logical address in 'data'. */ + page = mvx_mmu_alloc_page(fw->dev); + if (page == 0) + return -ENOMEM; + + /* Memory map region. */ + ret = mvx_mmu_map_pa(fw->mmu, begin, page, MVE_PAGE_SIZE, + MVX_ATTR_SHARED_RW, MVX_ACCESS_READ_WRITE); + if (ret != 0) { + mvx_mmu_free_page(fw->dev, page); + return ret; + } + + *data = phys_to_virt(page); + + return 0; +} + +static void unmap_fw_print_ram(struct mvx_fw *fw, + void **data, + enum mvx_fw_region region) +{ + int ret; + mvx_mmu_va begin; + mvx_mmu_va end; + + if (*data == NULL) + return; + + ret = fw->ops.get_region(region, &begin, &end); + if (ret == 0) + mvx_mmu_unmap_va(fw->mmu, begin, MVE_FW_PRINT_RAM_SIZE); + + mvx_mmu_free_contiguous_pages(fw->dev, virt_to_phys(*data), MVE_FW_PRINT_RAM_SIZE >> PAGE_SHIFT); + + *data = NULL; +} + +static int map_fw_print_ram(struct mvx_fw *fw, + void **data, + enum mvx_fw_region region) +{ + phys_addr_t page; + mvx_mmu_va begin; + mvx_mmu_va end; + int ret; + + /* Get virtual address where the message queue is to be mapped. */ + ret = fw->ops.get_region(region, &begin, &end); + if (ret != 0) + return ret; + + /* Allocate pages and store Linux logical address in 'data'. */ + page = mvx_mmu_alloc_contiguous_pages(fw->dev, MVE_FW_PRINT_RAM_SIZE >> PAGE_SHIFT); + if (page == 0) + return -ENOMEM; + + /* Memory map region. */ + ret = mvx_mmu_map_pa(fw->mmu, begin, page, MVE_FW_PRINT_RAM_SIZE, + MVX_ATTR_SHARED_RW, MVX_ACCESS_READ_WRITE); + if (ret != 0) { + mvx_mmu_free_contiguous_pages(fw->dev, page, MVE_FW_PRINT_RAM_SIZE >> PAGE_SHIFT); + return ret; + } + + *data = phys_to_virt(page); + + return 0; +} + +static void unmap_protocol_v2(struct mvx_fw *fw) +{ + struct mvx_mmu_pages *pages; + struct hlist_node *tmp; + int bkt; + + unmap_msq(fw, &fw->msg_host, MVX_FW_REGION_MSG_HOST); + unmap_msq(fw, &fw->msg_mve, MVX_FW_REGION_MSG_MVE); + unmap_msq(fw, &fw->buf_in_host, MVX_FW_REGION_BUF_IN_HOST); + unmap_msq(fw, &fw->buf_in_mve, MVX_FW_REGION_BUF_IN_MVE); + unmap_msq(fw, &fw->buf_out_host, MVX_FW_REGION_BUF_OUT_HOST); + unmap_msq(fw, &fw->buf_out_mve, MVX_FW_REGION_BUF_OUT_MVE); + unmap_msq(fw, &fw->rpc, MVX_FW_REGION_RPC); + unmap_fw_print_ram(fw, &fw->fw_print_ram, MVX_FW_REGION_PRINT_RAM); + + fw->latest_used_region_protected_pages = 0; + fw->latest_used_region_outbuf_pages = 0; + + hash_for_each_safe(fw->rpc_mem, bkt, tmp, pages, node) { + hash_del(&pages->node); + mvx_mmu_free_pages(pages); + } +} + +static int map_protocol_v2(struct mvx_fw *fw) +{ + int ret; + + ret = map_msq(fw, &fw->msg_host, MVX_FW_REGION_MSG_HOST); + if (ret != 0) + goto unmap_fw; + + ret = map_msq(fw, &fw->msg_mve, MVX_FW_REGION_MSG_MVE); + if (ret != 0) + goto unmap_fw; + + ret = map_msq(fw, &fw->buf_in_host, MVX_FW_REGION_BUF_IN_HOST); + if (ret != 0) + goto unmap_fw; + + ret = map_msq(fw, &fw->buf_in_mve, MVX_FW_REGION_BUF_IN_MVE); + if (ret != 0) + goto unmap_fw; + + ret = map_msq(fw, &fw->buf_out_host, MVX_FW_REGION_BUF_OUT_HOST); + if (ret != 0) + goto unmap_fw; + + ret = map_msq(fw, &fw->buf_out_mve, MVX_FW_REGION_BUF_OUT_MVE); + if (ret != 0) + goto unmap_fw; + + ret = map_msq(fw, &fw->rpc, MVX_FW_REGION_RPC); + if (ret != 0) + goto unmap_fw; + + ret = map_fw_print_ram(fw, &fw->fw_print_ram, MVX_FW_REGION_PRINT_RAM); + if (ret != 0) + goto unmap_fw; + + return 0; + +unmap_fw: + unmap_protocol_v2(fw); + + return ret; +} + +static void print_pair(char *name_in, + char *name_out, + struct device *device, + struct mve_comm_area_host *host, + struct mve_comm_area_mve *mve, + int ind, + struct seq_file *s) +{ + dma_sync_single_for_cpu(device, virt_to_phys(mve), + MVE_PAGE_SIZE, DMA_FROM_DEVICE); + mvx_seq_printf(s, name_in, ind, "wr=%10d, rd=%10d, avail=%10d\n", + host->in_wpos, mve->in_rpos, + (uint16_t)(host->in_wpos - mve->in_rpos)); + mvx_seq_printf(s, name_out, ind, "wr=%10d, rd=%10d, avail=%10d\n", + mve->out_wpos, host->out_rpos, + (uint16_t)(mve->out_wpos - host->out_rpos)); +} + +static int print_stat_v2(struct mvx_fw *fw, + int ind, + struct seq_file *s) +{ + print_pair("Msg host->mve", "Msg host<-mve", + fw->dev, fw->msg_host, fw->msg_mve, + ind, s); + print_pair("Inbuf host->mve", "Inbuf host<-mve", + fw->dev, fw->buf_in_host, fw->buf_in_mve, + ind, s); + print_pair("Outbuf host->mve", "Outbuf host<-mve", + fw->dev, fw->buf_out_host, fw->buf_out_mve, + ind, s); + + return 0; +} + +static ssize_t get_capacity(int rpos, + int wpos) +{ + ssize_t capacity; + + capacity = wpos - rpos; + if (capacity < 0) + capacity += MVE_COMM_QUEUE_SIZE_IN_WORDS; + + return capacity * sizeof(uint32_t); +} + +static void print_debug_v2(struct mvx_fw *fw) +{ + struct mve_comm_area_host *msg_host = fw->msg_host; + struct mve_comm_area_mve *msg_mve = fw->msg_mve; + unsigned int rpos, wpos; + ssize_t capacity; + struct mve_msg_header header; + + dma_sync_single_for_cpu(fw->dev, virt_to_phys(msg_mve), + MVE_PAGE_SIZE, DMA_FROM_DEVICE); + + MVX_LOG_PRINT_SESSION(&mvx_log_session_if, MVX_LOG_WARNING, fw->session, + "Dump message queue. msg={host={out_rpos=%u, in_wpos=%u}, mve={out_wpos=%u, in_rpos=%u}}", + msg_host->out_rpos, msg_host->in_wpos, + msg_mve->out_wpos, msg_mve->in_rpos); + + rpos = msg_host->out_rpos; + wpos = msg_mve->out_wpos; + + while ((capacity = get_capacity(rpos, wpos)) >= sizeof(header)) { + unsigned int pos; + + pos = read32n(msg_mve->out_data, rpos, (uint32_t *)&header, + sizeof(header)); + + MVX_LOG_PRINT_SESSION(&mvx_log_session_if, MVX_LOG_WARNING, + fw->session, + "queue={rpos=%u, wpos=%u, capacity=%u}, msg={code=%u, size=%u}", + rpos, wpos, capacity, + header.code, header.size); + + capacity = get_capacity(pos, wpos); + if (header.size > capacity) { + MVX_LOG_PRINT_SESSION( + &mvx_log_session_if, MVX_LOG_WARNING, + fw->session, + "Size is larger than capacity. capacity=%zd, size=%u.", + capacity, header.size); + return; + } + + rpos = (pos + DIV_ROUND_UP(header.size, sizeof(uint32_t))) % + MVE_COMM_QUEUE_SIZE_IN_WORDS; + } +} + +int mvx_fw_send_idle_ack_v2(struct mvx_fw *fw) +{ + int ret = 0; + + ret = write_message(fw, fw->msg_host, fw->msg_mve, + MVE_REQUEST_CODE_IDLE_ACK, + NULL, 0, + MVX_LOG_FWIF_CHANNEL_MESSAGE); + + return ret; +} + +/**************************************************************************** + * Exported functions + ****************************************************************************/ + +int mvx_fw_construct_v2(struct mvx_fw *fw, + struct mvx_fw_bin *fw_bin, + struct mvx_mmu *mmu, + struct mvx_session *session, + struct mvx_client_ops *client_ops, + struct mvx_client_session *csession, + unsigned int ncores, + unsigned char major, + unsigned char minor) +{ + int ret; + + ret = mvx_fw_construct(fw, fw_bin, mmu, session, client_ops, csession, + ncores); + if (ret != 0) + return ret; + + fw->ops.map_protocol = map_protocol_v2; + fw->ops.unmap_protocol = unmap_protocol_v2; + fw->ops.get_region = get_region_v2; + fw->ops.get_message = get_message_v2; + fw->ops.put_message = put_message_v2; + fw->ops.handle_rpc = handle_rpc_v2; + fw->ops.handle_fw_ram_print = handle_fw_ram_print_v2; + fw->ops.print_stat = print_stat_v2; + fw->ops.print_debug = print_debug_v2; + fw->ops_priv.send_idle_ack = NULL; + fw->ops_priv.to_mve_profile = mvx_fw_to_mve_profile_v2; + fw->ops_priv.to_mve_level = mvx_fw_to_mve_level_v2; + + if (major == 2 && minor >= 4) + fw->ops_priv.send_idle_ack = mvx_fw_send_idle_ack_v2; + + return 0; +} diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_firmware_v3.c b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_firmware_v3.c new file mode 100755 index 000000000..f3dd9cc69 --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_firmware_v3.c @@ -0,0 +1,171 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +/**************************************************************************** + * Includes + ****************************************************************************/ + +#include "mvx_firmware_priv.h" +#include "mve_protocol_def_v3.h" + +/**************************************************************************** + * Static functions + ****************************************************************************/ + +static int get_region_v3(enum mvx_fw_region region, + uint32_t *begin, + uint32_t *end) +{ + switch (region) { + case MVX_FW_REGION_CORE_0: + *begin = MVE_MEM_REGION_FW_INSTANCE0_ADDR_BEGIN; + *end = MVE_MEM_REGION_FW_INSTANCE0_ADDR_END; + break; + case MVX_FW_REGION_CORE_1: + *begin = MVE_MEM_REGION_FW_INSTANCE1_ADDR_BEGIN; + *end = MVE_MEM_REGION_FW_INSTANCE1_ADDR_END; + break; + case MVX_FW_REGION_CORE_2: + *begin = MVE_MEM_REGION_FW_INSTANCE2_ADDR_BEGIN; + *end = MVE_MEM_REGION_FW_INSTANCE2_ADDR_END; + break; + case MVX_FW_REGION_CORE_3: + *begin = MVE_MEM_REGION_FW_INSTANCE3_ADDR_BEGIN; + *end = MVE_MEM_REGION_FW_INSTANCE3_ADDR_END; + break; + case MVX_FW_REGION_CORE_4: + *begin = MVE_MEM_REGION_FW_INSTANCE4_ADDR_BEGIN; + *end = MVE_MEM_REGION_FW_INSTANCE4_ADDR_END; + break; + case MVX_FW_REGION_CORE_5: + *begin = MVE_MEM_REGION_FW_INSTANCE5_ADDR_BEGIN; + *end = MVE_MEM_REGION_FW_INSTANCE5_ADDR_END; + break; + case MVX_FW_REGION_CORE_6: + *begin = MVE_MEM_REGION_FW_INSTANCE6_ADDR_BEGIN; + *end = MVE_MEM_REGION_FW_INSTANCE6_ADDR_END; + break; + case MVX_FW_REGION_CORE_7: + *begin = MVE_MEM_REGION_FW_INSTANCE7_ADDR_BEGIN; + *end = MVE_MEM_REGION_FW_INSTANCE7_ADDR_END; + break; + case MVX_FW_REGION_PROTECTED: + *begin = MVE_MEM_REGION_PROTECTED_ADDR_BEGIN; + *end = MVE_MEM_REGION_PROTECTED_ADDR_END; + break; + case MVX_FW_REGION_FRAMEBUF: + *begin = MVE_MEM_REGION_FRAMEBUF_ADDR_BEGIN; + *end = MVE_MEM_REGION_FRAMEBUF_ADDR_END; + break; + case MVX_FW_REGION_MSG_HOST: + *begin = MVE_COMM_MSG_INQ_ADDR; + *end = MVE_COMM_MSG_INQ_ADDR + MVE_PAGE_SIZE; + break; + case MVX_FW_REGION_MSG_MVE: + *begin = MVE_COMM_MSG_OUTQ_ADDR; + *end = MVE_COMM_MSG_OUTQ_ADDR + MVE_PAGE_SIZE; + break; + case MVX_FW_REGION_BUF_IN_HOST: + *begin = MVE_COMM_BUF_INQ_ADDR; + *end = MVE_COMM_BUF_INQ_ADDR + MVE_PAGE_SIZE; + break; + case MVX_FW_REGION_BUF_IN_MVE: + *begin = MVE_COMM_BUF_INRQ_ADDR; + *end = MVE_COMM_BUF_INRQ_ADDR + MVE_PAGE_SIZE; + break; + case MVX_FW_REGION_BUF_OUT_HOST: + *begin = MVE_COMM_BUF_OUTQ_ADDR; + *end = MVE_COMM_BUF_OUTQ_ADDR + MVE_PAGE_SIZE; + break; + case MVX_FW_REGION_BUF_OUT_MVE: + *begin = MVE_COMM_BUF_OUTRQ_ADDR; + *end = MVE_COMM_BUF_OUTRQ_ADDR + MVE_PAGE_SIZE; + break; + case MVX_FW_REGION_RPC: + *begin = MVE_COMM_RPC_ADDR; + *end = MVE_COMM_RPC_ADDR + MVE_PAGE_SIZE; + break; + case MVX_FW_REGION_PRINT_RAM: + *begin = MVE_FW_PRINT_RAM_ADDR; + *end = MVE_FW_PRINT_RAM_ADDR + MVE_FW_PRINT_RAM_SIZE; + break; + default: + return -EINVAL; + } + + return 0; +} + +static int to_mve_profile_v3(unsigned int mvx_profile, + uint16_t *mve_profile) +{ + int ret = 0; + + switch (mvx_profile) { + case MVX_PROFILE_H264_HIGH_10: + *mve_profile = MVE_OPT_PROFILE_H264_HIGH;//MVE_OPT_PROFILE_H264_HIGH_10 + break; + default: + ret = mvx_fw_to_mve_profile_v2(mvx_profile, mve_profile); + } + + return ret; +} + +/**************************************************************************** + * Exported functions + ****************************************************************************/ + +int mvx_fw_construct_v3(struct mvx_fw *fw, + struct mvx_fw_bin *fw_bin, + struct mvx_mmu *mmu, + struct mvx_session *session, + struct mvx_client_ops *client_ops, + struct mvx_client_session *csession, + unsigned int ncores, + unsigned char major, + unsigned char minor) +{ + int ret; + + ret = mvx_fw_construct_v2(fw, fw_bin, mmu, session, client_ops, + csession, ncores, major, minor); + if (ret != 0) + return ret; + + fw->ops.get_region = get_region_v3; + fw->ops_priv.to_mve_profile = to_mve_profile_v3; + + if (major == 3 && minor >= 1) + fw->ops_priv.send_idle_ack = mvx_fw_send_idle_ack_v2; + + return 0; +} diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_hwreg.c b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_hwreg.c new file mode 100755 index 000000000..0b423f702 --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_hwreg.c @@ -0,0 +1,461 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +/**************************************************************************** + * Includes + ****************************************************************************/ + +#include +#include +#include "mvx_log_group.h" +#include "mvx_hwreg.h" +#include "mvx_hwreg_v500.h" +#include "mvx_hwreg_v550.h" +#include "mvx_hwreg_v61.h" +#include "mvx_hwreg_v52_v76.h" +#include "mvx_pm_runtime.h" + +/**************************************************************************** + * Static functions + ****************************************************************************/ + +static unsigned int get_offset(enum mvx_hwreg_what what) +{ + switch (what) { + case MVX_HWREG_HARDWARE_ID: + return 0x0; + case MVX_HWREG_ENABLE: + return 0x4; + case MVX_HWREG_NCORES: + return 0x8; + case MVX_HWREG_NLSID: + return 0xc; + case MVX_HWREG_CORELSID: + return 0x10; + case MVX_HWREG_JOBQUEUE: + return 0x14; + case MVX_HWREG_IRQVE: + return 0x18; + case MVX_HWREG_CLKFORCE: + return 0x24; + case MVX_HWREG_FUSE: + return 0x34; + case MVX_HWREG_PROTCTRL: + return 0x40; + case MVX_HWREG_RESET: + return 0x50; + default: + return 0; + } +} + +static unsigned int get_lsid_offset(unsigned int lsid, + enum mvx_hwreg_lsid what) +{ + unsigned int offset = 0x0200 + 0x40 * lsid; + + switch (what) { + case MVX_HWREG_CTRL: + offset += 0x0; + break; + case MVX_HWREG_MMU_CTRL: + offset += 0x4; + break; + case MVX_HWREG_NPROT: + offset += 0x8; + break; + case MVX_HWREG_ALLOC: + offset += 0xc; + break; + case MVX_HWREG_FLUSH_ALL: + offset += 0x10; + break; + case MVX_HWREG_SCHED: + offset += 0x14; + break; + case MVX_HWREG_TERMINATE: + offset += 0x18; + break; + case MVX_HWREG_LIRQVE: + offset += 0x1c; + break; + case MVX_HWREG_IRQHOST: + offset += 0x20; + break; + case MVX_HWREG_INTSIG: + offset += 0x24; + break; + case MVX_HWREG_STREAMID: + offset += 0x2c; + break; + case MVX_HWREG_BUSATTR_0: + offset += 0x30; + break; + case MVX_HWREG_BUSATTR_1: + offset += 0x34; + break; + case MVX_HWREG_BUSATTR_2: + offset += 0x38; + break; + case MVX_HWREG_BUSATTR_3: + offset += 0x3c; + break; + default: + return 0; + } + + return offset; +} + +static enum mvx_hw_id get_hw_id(void *registers, + uint32_t *revision, + uint32_t *patch) +{ + uint32_t value; + + value = readl(registers); + + if (revision != NULL) + *revision = (value >> 8) & 0xff; + + if (patch != NULL) + *patch = value & 0xff; + + switch (value >> 16) { + case 0x5650: + return MVE_v500; + case 0x5655: + return MVE_v550; + case 0x5660: + case 0x5661: + return MVE_v61; + case 0x5662: + case 0x5663: + case 0x5664: + return MVE_v52_v76; + default: + MVX_LOG_PRINT(&mvx_log_dev, MVX_LOG_ERROR, + "Unknown hardware version. version=0x%08x.", + value); + break; + } + + return MVE_Unknown; +} + +static int regs_show(struct seq_file *s, + void *v) +{ + struct mvx_hwreg *hwreg = (struct mvx_hwreg *)s->private; + int ret; + + ret = mvx_pm_runtime_get_sync(hwreg->dev); + if (ret < 0) + return 0; + + seq_printf(s, "HARDWARE_ID = 0x%08x\n", + mvx_hwreg_read(hwreg, MVX_HWREG_HARDWARE_ID)); + seq_printf(s, "ENABLE = 0x%08x\n", + mvx_hwreg_read(hwreg, MVX_HWREG_ENABLE)); + seq_printf(s, "NCORES = 0x%08x\n", + mvx_hwreg_read(hwreg, MVX_HWREG_NCORES)); + seq_printf(s, "NLSID = 0x%08x\n", + mvx_hwreg_read(hwreg, MVX_HWREG_NLSID)); + seq_printf(s, "CORELSID = 0x%08x\n", + mvx_hwreg_read(hwreg, MVX_HWREG_CORELSID)); + seq_printf(s, "JOBQUEUE = 0x%08x\n", + mvx_hwreg_read(hwreg, MVX_HWREG_JOBQUEUE)); + seq_printf(s, "IRQVE = 0x%08x\n", + mvx_hwreg_read(hwreg, MVX_HWREG_IRQVE)); + seq_printf(s, "CLKFORCE = 0x%08x\n", + mvx_hwreg_read(hwreg, MVX_HWREG_CLKFORCE)); + seq_printf(s, "FUSE = 0x%08x\n", + mvx_hwreg_read(hwreg, MVX_HWREG_FUSE)); + seq_printf(s, "PROTCTRL = 0x%08x\n", + mvx_hwreg_read(hwreg, MVX_HWREG_PROTCTRL)); + seq_printf(s, "RESET = 0x%08x\n", + mvx_hwreg_read(hwreg, MVX_HWREG_RESET)); + seq_puts(s, "\n"); + + mvx_pm_runtime_put_sync(hwreg->dev); + + return 0; +} + +static int regs_open(struct inode *inode, + struct file *file) +{ + return single_open(file, regs_show, inode->i_private); +} + +static const struct file_operations regs_fops = { + .open = regs_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release +}; + +static int regs_debugfs_init(struct mvx_hwreg *hwreg, + struct dentry *parent) +{ + struct dentry *dentry; + + dentry = debugfs_create_file("regs", 0400, parent, hwreg, + ®s_fops); + if (IS_ERR_OR_NULL(dentry)) + return -ENOMEM; + + return 0; +} + +static int lsid_regs_show(struct seq_file *s, + void *v) +{ + struct mvx_lsid_hwreg *lsid_hwreg = (struct mvx_lsid_hwreg *)s->private; + struct mvx_hwreg *hwreg = lsid_hwreg->hwreg; + int lsid = lsid_hwreg->lsid; + int ret; + + ret = mvx_pm_runtime_get_sync(hwreg->dev); + if (ret < 0) + return 0; + + seq_printf(s, "CTRL = 0x%08x\n", + mvx_hwreg_read_lsid(hwreg, lsid, MVX_HWREG_CTRL)); + seq_printf(s, "MMU_CTRL = 0x%08x\n", + mvx_hwreg_read_lsid(hwreg, lsid, MVX_HWREG_MMU_CTRL)); + seq_printf(s, "NPROT = 0x%08x\n", + mvx_hwreg_read_lsid(hwreg, lsid, MVX_HWREG_NPROT)); + seq_printf(s, "ALLOC = 0x%08x\n", + mvx_hwreg_read_lsid(hwreg, lsid, MVX_HWREG_ALLOC)); + seq_printf(s, "FLUSH_ALL = 0x%08x\n", + mvx_hwreg_read_lsid(hwreg, lsid, MVX_HWREG_FLUSH_ALL)); + seq_printf(s, "SCHED = 0x%08x\n", + mvx_hwreg_read_lsid(hwreg, lsid, MVX_HWREG_SCHED)); + seq_printf(s, "TERMINATE = 0x%08x\n", + mvx_hwreg_read_lsid(hwreg, lsid, MVX_HWREG_TERMINATE)); + seq_printf(s, "LIRQVE = 0x%08x\n", + mvx_hwreg_read_lsid(hwreg, lsid, MVX_HWREG_LIRQVE)); + seq_printf(s, "IRQHOST = 0x%08x\n", + mvx_hwreg_read_lsid(hwreg, lsid, MVX_HWREG_IRQHOST)); + seq_printf(s, "INTSIG = 0x%08x\n", + mvx_hwreg_read_lsid(hwreg, lsid, MVX_HWREG_INTSIG)); + seq_printf(s, "STREAMID = 0x%08x\n", + mvx_hwreg_read_lsid(hwreg, lsid, MVX_HWREG_STREAMID)); + seq_printf(s, "BUSATTR_0 = 0x%08x\n", + mvx_hwreg_read_lsid(hwreg, lsid, MVX_HWREG_BUSATTR_0)); + seq_printf(s, "BUSATTR_1 = 0x%08x\n", + mvx_hwreg_read_lsid(hwreg, lsid, MVX_HWREG_BUSATTR_1)); + seq_printf(s, "BUSATTR_2 = 0x%08x\n", + mvx_hwreg_read_lsid(hwreg, lsid, MVX_HWREG_BUSATTR_2)); + seq_printf(s, "BUSATTR_3 = 0x%08x\n", + mvx_hwreg_read_lsid(hwreg, lsid, MVX_HWREG_BUSATTR_3)); + seq_puts(s, "\n"); + + mvx_pm_runtime_put_sync(hwreg->dev); + + return 0; +} + +static int lsid_regs_open(struct inode *inode, + struct file *file) +{ + return single_open(file, lsid_regs_show, inode->i_private); +} + +static const struct file_operations lsid_regs_fops = { + .open = lsid_regs_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release +}; + +static int lsid_regs_debugfs_init(struct mvx_lsid_hwreg *lsid_hwreg, + struct dentry *parent) +{ + struct dentry *dentry; + char name[20]; + + scnprintf(name, sizeof(name), "lsid%u_regs", lsid_hwreg->lsid); + + dentry = debugfs_create_file(name, 0400, parent, lsid_hwreg, + &lsid_regs_fops); + if (IS_ERR_OR_NULL(dentry)) + return -ENOMEM; + + return 0; +} + +int debugfs_init(struct mvx_hwreg *hwreg, + struct dentry *parent) +{ + int ret; + + if (IS_ENABLED(CONFIG_DEBUG_FS)) { + int lsid; + + ret = regs_debugfs_init(hwreg, parent); + if (ret != 0) + return ret; + + for (lsid = 0; lsid < MVX_LSID_MAX; ++lsid) { + ret = lsid_regs_debugfs_init(&hwreg->lsid_hwreg[lsid], + parent); + if (ret != 0) + return ret; + } + } + + return 0; +} + +/**************************************************************************** + * Exported functions + ****************************************************************************/ + +int mvx_hwreg_construct(struct mvx_hwreg *hwreg, + struct device *dev, + struct resource *res, + struct dentry *parent) +{ + char const *name = dev_name(dev); + enum mvx_hw_id hw_id; + int ret; + int lsid; + + hwreg->dev = dev; + + hwreg->res = request_mem_region(res->start, resource_size(res), name); + if (hwreg->res == NULL) { + MVX_LOG_PRINT(&mvx_log_dev, MVX_LOG_ERROR, + "Failed to request mem region. start=0x%llx, size=0x%llx.", + res->start, resource_size(res)); + return -EINVAL; + } + + hwreg->registers = ioremap(res->start, resource_size(res)); + if (hwreg->registers == NULL) { + MVX_LOG_PRINT(&mvx_log_dev, MVX_LOG_ERROR, + "Failed to iomap region. start=0x%llx, size=0x%llx.", + res->start, resource_size(res)); + ret = -ENOMEM; + goto release_mem; + } + + hw_id = get_hw_id(hwreg->registers, NULL, NULL); + switch (hw_id) { + case MVE_v500: + hwreg->ops.get_formats = mvx_hwreg_get_formats_v500; + break; + case MVE_v550: + hwreg->ops.get_formats = mvx_hwreg_get_formats_v550; + break; + case MVE_v61: + hwreg->ops.get_formats = mvx_hwreg_get_formats_v61; + break; + case MVE_v52_v76: + hwreg->ops.get_formats = mvx_hwreg_get_formats_v52_v76; + break; + default: + ret = -EINVAL; + goto unmap_io; + } + + for (lsid = 0; lsid < MVX_LSID_MAX; ++lsid) { + hwreg->lsid_hwreg[lsid].hwreg = hwreg; + hwreg->lsid_hwreg[lsid].lsid = lsid; + } + + if (IS_ENABLED(CONFIG_DEBUG_FS)) { + ret = debugfs_init(hwreg, parent); + if (ret != 0) + goto unmap_io; + } + + return 0; + +unmap_io: + iounmap(hwreg->registers); + +release_mem: + release_mem_region(res->start, resource_size(res)); + + return ret; +} + +void mvx_hwreg_destruct(struct mvx_hwreg *hwreg) +{ + iounmap(hwreg->registers); + release_mem_region(hwreg->res->start, resource_size(hwreg->res)); +} + +uint32_t mvx_hwreg_read(struct mvx_hwreg *hwreg, + enum mvx_hwreg_what what) +{ + unsigned int offset = get_offset(what); + + return readl(hwreg->registers + offset); +} + +void mvx_hwreg_write(struct mvx_hwreg *hwreg, + enum mvx_hwreg_what what, + uint32_t value) +{ + unsigned int offset = get_offset(what); + + writel(value, hwreg->registers + offset); +} + +uint32_t mvx_hwreg_read_lsid(struct mvx_hwreg *hwreg, + unsigned int lsid, + enum mvx_hwreg_lsid what) +{ + unsigned int offset = get_lsid_offset(lsid, what); + + return readl(hwreg->registers + offset); +} + +void mvx_hwreg_write_lsid(struct mvx_hwreg *hwreg, + unsigned int lsid, + enum mvx_hwreg_lsid what, + uint32_t value) +{ + unsigned int offset = get_lsid_offset(lsid, what); + + writel(value, hwreg->registers + offset); +} + +enum mvx_hw_id mvx_hwreg_get_hw_id(struct mvx_hwreg *hwreg, + uint32_t *revision, + uint32_t *patch) +{ + return get_hw_id(hwreg->registers, revision, patch); +} diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_hwreg.h b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_hwreg.h new file mode 100755 index 000000000..f5464d7dd --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_hwreg.h @@ -0,0 +1,229 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef _MVX_HW_REG_ +#define _MVX_HW_REG_ + +/**************************************************************************** + * Includes + ****************************************************************************/ + +#include +#include +#include +#include "mvx_if.h" +#include "mvx_lsid.h" + +/**************************************************************************** + * Defines + ****************************************************************************/ + +#define MVX_HWREG_FUSE_DISABLE_AFBC (1 << 0) +#define MVX_HWREG_FUSE_DISABLE_REAL (1 << 1) +#define MVX_HWREG_FUSE_DISABLE_VPX (1 << 2) +#define MVX_HWREG_FUSE_DISABLE_HEVC (1 << 3) + +#define MVE_JOBQUEUE_JOB_BITS 8 +#define MVE_JOBQUEUE_JOB_MASK ((1 << MVE_JOBQUEUE_JOB_BITS) - 1) +#define MVE_JOBQUEUE_JOB_INVALID 0xf +#define MVE_JOBQUEUE_NJOBS 4 +#define MVE_JOBQUEUE_LSID_SHIFT 0 +#define MVE_JOBQUEUE_LSID_BITS 4 +#define MVE_JOBQUEUE_LSID_MASK ((1 << MVE_JOBQUEUE_LSID_BITS) - 1) +#define MVE_JOBQUEUE_NCORES_SHIFT 4 +#define MVE_JOBQUEUE_NCORES_BITS 4 + +#define MVE_CORELSID_LSID_BITS 4 +#define MVX_CORELSID_LSID_MASK ((1 << MVE_CORELSID_LSID_BITS) - 1) + +#define MVE_CTRL_DISALLOW_SHIFT 0 +#define MVE_CTRL_DISALLOW_BITS 8 +#define MVE_CTRL_DISALLOW_MASK ((1 << MVE_CTRL_DISALLOW_BITS) - 1) +#define MVE_CTRL_MAXCORES_SHIFT 8 +#define MVE_CTRL_MAXCORES_BITS 4 +#define MVE_CTRL_MAXCORES_MASK ((1 << MVE_CTRL_MAXCORES_BITS) - 1) + +#define MVE_ALLOC_FREE 0 +#define MVE_ALLOC_NON_PROTECTED 1 +#define MVE_ALLOC_PROTECTED 2 + +/**************************************************************************** + * Types + ****************************************************************************/ + +struct device; + +/** + * enum mvx_hwreg_what - Hardware registers that can be read or written. + */ +enum mvx_hwreg_what { + MVX_HWREG_HARDWARE_ID, + MVX_HWREG_ENABLE, + MVX_HWREG_NCORES, + MVX_HWREG_NLSID, + MVX_HWREG_CORELSID, + MVX_HWREG_JOBQUEUE, + MVX_HWREG_IRQVE, + MVX_HWREG_CLKFORCE, + MVX_HWREG_FUSE, + MVX_HWREG_PROTCTRL, + MVX_HWREG_RESET, + MVX_HWREG_WHAT_MAX +}; + +/** + * enum mvx_hwreg_lsid - Hardware registers per LSID. + */ +enum mvx_hwreg_lsid { + MVX_HWREG_CTRL, + MVX_HWREG_MMU_CTRL, + MVX_HWREG_NPROT, + MVX_HWREG_ALLOC, + MVX_HWREG_FLUSH_ALL, + MVX_HWREG_SCHED, + MVX_HWREG_TERMINATE, + MVX_HWREG_LIRQVE, + MVX_HWREG_IRQHOST, + MVX_HWREG_INTSIG, + MVX_HWREG_STREAMID, + MVX_HWREG_BUSATTR_0, + MVX_HWREG_BUSATTR_1, + MVX_HWREG_BUSATTR_2, + MVX_HWREG_BUSATTR_3, + MVX_HWREG_LSID_MAX +}; + +struct mvx_hwreg; + +/** + * struct mvx_lsid_hwreg - Helper struct used for debugfs reading of lsid + * dependent registers. + */ +struct mvx_lsid_hwreg { + struct mvx_hwreg *hwreg; + unsigned int lsid; +}; + +/** + * struct mvx_hwreg - Context class for the hardware register interface. + */ +struct mvx_hwreg { + struct device *dev; + struct resource *res; + void *registers; + struct mvx_lsid_hwreg lsid_hwreg[MVX_LSID_MAX]; + struct { + void (*get_formats)(enum mvx_direction direction, + uint64_t *formats); + } ops; +}; + +/**************************************************************************** + * Exported functions + ****************************************************************************/ + +/** + * mvx_hwreg_construct() - Construct the hardware register object. + * @hwreg: Pointer to hwreg object. + * @dev: Pointer to device struct. + * @res: Memory resource. + * @parent: Parent debugfs directory entry. + * + * Return: 0 on success, else error code. + */ +int mvx_hwreg_construct(struct mvx_hwreg *hwreg, + struct device *dev, + struct resource *res, + struct dentry *parent); + +/** + * mvx_hwreg_destruct() - Destroy the hardware register object. + * @hwreg: Pointer to hwreg object. + */ +void mvx_hwreg_destruct(struct mvx_hwreg *hwreg); + +/** + * mvx_hwreg_read() - Read hardware register. + * @hwreg: Pointer to hwreg object. + * @what: Which register to read. + * + * Return: Value of register. + */ +uint32_t mvx_hwreg_read(struct mvx_hwreg *hwreg, + enum mvx_hwreg_what what); + +/** + * mvx_hwreg_write() - Write hardware register. + * @hwreg: Pointer to hwreg object. + * @what: Which register to write. + * @value: Value to write. + */ +void mvx_hwreg_write(struct mvx_hwreg *hwreg, + enum mvx_hwreg_what what, + uint32_t value); + +/** + * mvx_hwreg_read_lsid() - Read LSID hardware register. + * @hwreg: Pointer to hwreg object. + * @lsid: LSID register index. + * @what: Which register to read. + * + * Return: Value of register. + */ +uint32_t mvx_hwreg_read_lsid(struct mvx_hwreg *hwreg, + unsigned int lsid, + enum mvx_hwreg_lsid what); + +/** + * mvx_hwreg_write_lsid() - Write LSID hardware register. + * @hwreg: Pointer to hwreg object. + * @lsid: LSID register index. + * @what: Which register to write. + * @value: Value to write. + */ +void mvx_hwreg_write_lsid(struct mvx_hwreg *hwreg, + unsigned int lsid, + enum mvx_hwreg_lsid what, + uint32_t value); + +/** + * mvx_hwreg_get_hw_id() - Get hardware id. + * @hwreg: Pointer to hwreg object. + * @revision: Hardware revision. + * @patch: Hardware patch revision. + * + * Return: Hardware id. + */ +enum mvx_hw_id mvx_hwreg_get_hw_id(struct mvx_hwreg *hwreg, + uint32_t *revision, + uint32_t *patch); + +#endif /* _MVX_HW_REG_ */ diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_hwreg_v500.c b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_hwreg_v500.c new file mode 100755 index 000000000..195f8adc0 --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_hwreg_v500.c @@ -0,0 +1,65 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +/**************************************************************************** + * Includes + ****************************************************************************/ + +#include "mvx_bitops.h" +#include "mvx_hwreg_v500.h" + +/**************************************************************************** + * Exported functions + ****************************************************************************/ + +void mvx_hwreg_get_formats_v500(enum mvx_direction direction, + uint64_t *formats) +{ + if (direction == MVX_DIR_INPUT) { + mvx_set_bit(MVX_FORMAT_H263, formats); + mvx_set_bit(MVX_FORMAT_H264, formats); + mvx_set_bit(MVX_FORMAT_MPEG2, formats); + mvx_set_bit(MVX_FORMAT_MPEG4, formats); + mvx_set_bit(MVX_FORMAT_RV, formats); + mvx_set_bit(MVX_FORMAT_VC1, formats); + mvx_set_bit(MVX_FORMAT_VP8, formats); + mvx_set_bit(MVX_FORMAT_YUV420_I420, formats); + mvx_set_bit(MVX_FORMAT_YUV420_NV12, formats); + } else { + mvx_set_bit(MVX_FORMAT_H264, formats); + mvx_set_bit(MVX_FORMAT_HEVC, formats); + mvx_set_bit(MVX_FORMAT_VP8, formats); + mvx_set_bit(MVX_FORMAT_YUV420_AFBC_8, formats); + mvx_set_bit(MVX_FORMAT_YUV422_AFBC_8, formats); + mvx_set_bit(MVX_FORMAT_YUV420_I420, formats); + mvx_set_bit(MVX_FORMAT_YUV420_NV12, formats); + } +} diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_hwreg_v500.h b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_hwreg_v500.h new file mode 100755 index 000000000..8b442aff3 --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_hwreg_v500.h @@ -0,0 +1,48 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef _MVX_HWREG_V500_H_ +#define _MVX_HWREG_V500_H_ + +/**************************************************************************** + * Includes + ****************************************************************************/ + +#include "mvx_if.h" + +/**************************************************************************** + * Exported functions + ****************************************************************************/ + +void mvx_hwreg_get_formats_v500(enum mvx_direction direction, + uint64_t *formats); + +#endif /* _MVX_HWREG_V500_H_ */ diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_hwreg_v52_v76.c b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_hwreg_v52_v76.c new file mode 100755 index 000000000..2ac6900d3 --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_hwreg_v52_v76.c @@ -0,0 +1,118 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +/**************************************************************************** + * Includes + ****************************************************************************/ + +#include +#include "mvx_bitops.h" +#include "mvx_hwreg_v52_v76.h" + +/**************************************************************************** + * Exported functions + ****************************************************************************/ + +void mvx_hwreg_get_formats_v52_v76(enum mvx_direction direction, + uint64_t *formats) +{ + if (direction == MVX_DIR_INPUT) { + mvx_set_bit(MVX_FORMAT_AVS, formats); + mvx_set_bit(MVX_FORMAT_AVS2, formats); + mvx_set_bit(MVX_FORMAT_H263, formats); + mvx_set_bit(MVX_FORMAT_H264, formats); + mvx_set_bit(MVX_FORMAT_HEVC, formats); + mvx_set_bit(MVX_FORMAT_JPEG, formats); + mvx_set_bit(MVX_FORMAT_MPEG2, formats); + mvx_set_bit(MVX_FORMAT_MPEG4, formats); + mvx_set_bit(MVX_FORMAT_RV, formats); + mvx_set_bit(MVX_FORMAT_VC1, formats); + mvx_set_bit(MVX_FORMAT_VP8, formats); + mvx_set_bit(MVX_FORMAT_VP9, formats); + mvx_set_bit(MVX_FORMAT_AV1, formats); + mvx_set_bit(MVX_FORMAT_YUV420_AFBC_8, formats); + mvx_set_bit(MVX_FORMAT_YUV420_AFBC_10, formats); + mvx_set_bit(MVX_FORMAT_YUV422_AFBC_8, formats); + mvx_set_bit(MVX_FORMAT_YUV422_AFBC_10, formats); + mvx_set_bit(MVX_FORMAT_YUV420_I420, formats); + mvx_set_bit(MVX_FORMAT_YUV420_NV12, formats); + mvx_set_bit(MVX_FORMAT_YUV420_NV21, formats); + mvx_set_bit(MVX_FORMAT_YUV420_P010, formats); + mvx_set_bit(MVX_FORMAT_YUV420_Y0L2, formats); + mvx_set_bit(MVX_FORMAT_YUV420_AQB1, formats); + mvx_set_bit(MVX_FORMAT_YUV422_YUY2, formats); + mvx_set_bit(MVX_FORMAT_YUV422_UYVY, formats); + mvx_set_bit(MVX_FORMAT_YUV422_Y210, formats); + mvx_set_bit(MVX_FORMAT_RGBA_8888, formats); + mvx_set_bit(MVX_FORMAT_BGRA_8888, formats); + mvx_set_bit(MVX_FORMAT_ARGB_8888, formats); + mvx_set_bit(MVX_FORMAT_ABGR_8888, formats); + + mvx_set_bit(MVX_FORMAT_RGB_888_3P, formats); + mvx_set_bit(MVX_FORMAT_Y, formats); + mvx_set_bit(MVX_FORMAT_YUV444, formats); + mvx_set_bit(MVX_FORMAT_YUV420_I420_10, formats); + mvx_set_bit(MVX_FORMAT_YUV420_2P_10, formats); + mvx_set_bit(MVX_FORMAT_YUV422_1P_10, formats); + mvx_set_bit(MVX_FORMAT_Y_10, formats); + mvx_set_bit(MVX_FORMAT_YUV444_10, formats); + + } else { + mvx_set_bit(MVX_FORMAT_H264, formats); + mvx_set_bit(MVX_FORMAT_HEVC, formats); + mvx_set_bit(MVX_FORMAT_JPEG, formats); + mvx_set_bit(MVX_FORMAT_VP8, formats); + mvx_set_bit(MVX_FORMAT_VP9, formats); + mvx_set_bit(MVX_FORMAT_YUV420_AFBC_8, formats); + mvx_set_bit(MVX_FORMAT_YUV420_AFBC_10, formats); + mvx_set_bit(MVX_FORMAT_YUV422_AFBC_8, formats); + mvx_set_bit(MVX_FORMAT_YUV422_AFBC_10, formats); + mvx_set_bit(MVX_FORMAT_YUV420_I420, formats); + mvx_set_bit(MVX_FORMAT_YUV420_NV12, formats); + mvx_set_bit(MVX_FORMAT_YUV420_NV21, formats); + mvx_set_bit(MVX_FORMAT_YUV420_P010, formats); + mvx_set_bit(MVX_FORMAT_YUV420_Y0L2, formats); + mvx_set_bit(MVX_FORMAT_YUV420_AQB1, formats); + mvx_set_bit(MVX_FORMAT_YUV422_YUY2, formats); + mvx_set_bit(MVX_FORMAT_YUV422_UYVY, formats); + mvx_set_bit(MVX_FORMAT_YUV422_Y210, formats); + mvx_set_bit(MVX_FORMAT_RGB_888, formats); + mvx_set_bit(MVX_FORMAT_BGR_888, formats); + mvx_set_bit(MVX_FORMAT_RGB_888_3P, formats); + mvx_set_bit(MVX_FORMAT_Y, formats); + mvx_set_bit(MVX_FORMAT_Y_10, formats); + mvx_set_bit(MVX_FORMAT_YUV444, formats); + mvx_set_bit(MVX_FORMAT_YUV444_10, formats); + mvx_set_bit(MVX_FORMAT_YUV420_2P_10, formats); + mvx_set_bit(MVX_FORMAT_YUV422_1P_10, formats); + + } +} diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_hwreg_v52_v76.h b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_hwreg_v52_v76.h new file mode 100755 index 000000000..5bf066fcb --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_hwreg_v52_v76.h @@ -0,0 +1,49 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef _MVX_HWREG_V52_V76_H_ +#define _MVX_HWREG_V52_V76_H_ + +/**************************************************************************** + * Includes + ****************************************************************************/ + +#include "mvx_hwreg.h" +#include "mvx_if.h" + +/**************************************************************************** + * Exported functions + ****************************************************************************/ + +void mvx_hwreg_get_formats_v52_v76(enum mvx_direction direction, + uint64_t *formats); + +#endif /* _MVX_HWREG_V52_V76_H_ */ diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_hwreg_v550.c b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_hwreg_v550.c new file mode 100755 index 000000000..46eda4410 --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_hwreg_v550.c @@ -0,0 +1,82 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +/**************************************************************************** + * Includes + ****************************************************************************/ + +#include "mvx_bitops.h" +#include "mvx_hwreg_v550.h" + +/**************************************************************************** + * Exported functions + ****************************************************************************/ + +void mvx_hwreg_get_formats_v550(enum mvx_direction direction, + uint64_t *formats) +{ + if (direction == MVX_DIR_INPUT) { + mvx_set_bit(MVX_FORMAT_H263, formats); + mvx_set_bit(MVX_FORMAT_H264, formats); + mvx_set_bit(MVX_FORMAT_HEVC, formats); + mvx_set_bit(MVX_FORMAT_JPEG, formats); + mvx_set_bit(MVX_FORMAT_MPEG2, formats); + mvx_set_bit(MVX_FORMAT_MPEG4, formats); + mvx_set_bit(MVX_FORMAT_RV, formats); + mvx_set_bit(MVX_FORMAT_VC1, formats); + mvx_set_bit(MVX_FORMAT_VP8, formats); + mvx_set_bit(MVX_FORMAT_YUV420_I420, formats); + mvx_set_bit(MVX_FORMAT_YUV420_NV12, formats); + mvx_set_bit(MVX_FORMAT_YUV420_NV21, formats); + mvx_set_bit(MVX_FORMAT_YUV420_P010, formats); + mvx_set_bit(MVX_FORMAT_YUV420_Y0L2, formats); + mvx_set_bit(MVX_FORMAT_YUV420_AQB1, formats); + mvx_set_bit(MVX_FORMAT_YUV422_YUY2, formats); + mvx_set_bit(MVX_FORMAT_YUV422_UYVY, formats); + mvx_set_bit(MVX_FORMAT_YUV422_Y210, formats); + } else { + mvx_set_bit(MVX_FORMAT_H264, formats); + mvx_set_bit(MVX_FORMAT_VP8, formats); + mvx_set_bit(MVX_FORMAT_YUV420_AFBC_8, formats); + mvx_set_bit(MVX_FORMAT_YUV420_AFBC_10, formats); + mvx_set_bit(MVX_FORMAT_YUV422_AFBC_8, formats); + mvx_set_bit(MVX_FORMAT_YUV422_AFBC_10, formats); + mvx_set_bit(MVX_FORMAT_YUV420_I420, formats); + mvx_set_bit(MVX_FORMAT_YUV420_NV12, formats); + mvx_set_bit(MVX_FORMAT_YUV420_NV21, formats); + mvx_set_bit(MVX_FORMAT_YUV420_P010, formats); + mvx_set_bit(MVX_FORMAT_YUV420_Y0L2, formats); + mvx_set_bit(MVX_FORMAT_YUV420_AQB1, formats); + mvx_set_bit(MVX_FORMAT_YUV422_YUY2, formats); + mvx_set_bit(MVX_FORMAT_YUV422_UYVY, formats); + mvx_set_bit(MVX_FORMAT_YUV422_Y210, formats); + } +} diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_hwreg_v550.h b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_hwreg_v550.h new file mode 100755 index 000000000..1133b8c34 --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_hwreg_v550.h @@ -0,0 +1,48 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef _MVX_HWREG_V550_H_ +#define _MVX_HWREG_V550_H_ + +/**************************************************************************** + * Includes + ****************************************************************************/ + +#include "mvx_if.h" + +/**************************************************************************** + * Exported functions + ****************************************************************************/ + +void mvx_hwreg_get_formats_v550(enum mvx_direction direction, + uint64_t *formats); + +#endif /* _MVX_HWREG_V550_H_ */ diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_hwreg_v61.c b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_hwreg_v61.c new file mode 100755 index 000000000..408f68609 --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_hwreg_v61.c @@ -0,0 +1,95 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +/**************************************************************************** + * Includes + ****************************************************************************/ + +#include +#include "mvx_bitops.h" +#include "mvx_hwreg_v61.h" + +/**************************************************************************** + * Exported functions + ****************************************************************************/ + +void mvx_hwreg_get_formats_v61(enum mvx_direction direction, + uint64_t *formats) +{ + if (direction == MVX_DIR_INPUT) { + mvx_set_bit(MVX_FORMAT_H263, formats); + mvx_set_bit(MVX_FORMAT_H264, formats); + mvx_set_bit(MVX_FORMAT_HEVC, formats); + mvx_set_bit(MVX_FORMAT_JPEG, formats); + mvx_set_bit(MVX_FORMAT_MPEG2, formats); + mvx_set_bit(MVX_FORMAT_MPEG4, formats); + mvx_set_bit(MVX_FORMAT_RV, formats); + mvx_set_bit(MVX_FORMAT_VC1, formats); + mvx_set_bit(MVX_FORMAT_VP8, formats); + mvx_set_bit(MVX_FORMAT_VP9, formats); + mvx_set_bit(MVX_FORMAT_YUV420_AFBC_8, formats); + mvx_set_bit(MVX_FORMAT_YUV420_AFBC_10, formats); + mvx_set_bit(MVX_FORMAT_YUV422_AFBC_8, formats); + mvx_set_bit(MVX_FORMAT_YUV422_AFBC_10, formats); + mvx_set_bit(MVX_FORMAT_YUV420_I420, formats); + mvx_set_bit(MVX_FORMAT_YUV420_NV12, formats); + mvx_set_bit(MVX_FORMAT_YUV420_NV21, formats); + mvx_set_bit(MVX_FORMAT_YUV420_P010, formats); + mvx_set_bit(MVX_FORMAT_YUV420_Y0L2, formats); + mvx_set_bit(MVX_FORMAT_YUV420_AQB1, formats); + mvx_set_bit(MVX_FORMAT_YUV422_YUY2, formats); + mvx_set_bit(MVX_FORMAT_YUV422_UYVY, formats); + mvx_set_bit(MVX_FORMAT_YUV422_Y210, formats); + mvx_set_bit(MVX_FORMAT_RGBA_8888, formats); + mvx_set_bit(MVX_FORMAT_BGRA_8888, formats); + mvx_set_bit(MVX_FORMAT_ARGB_8888, formats); + mvx_set_bit(MVX_FORMAT_ABGR_8888, formats); + } else { + mvx_set_bit(MVX_FORMAT_H264, formats); + mvx_set_bit(MVX_FORMAT_HEVC, formats); + mvx_set_bit(MVX_FORMAT_JPEG, formats); + mvx_set_bit(MVX_FORMAT_VP8, formats); + mvx_set_bit(MVX_FORMAT_VP9, formats); + mvx_set_bit(MVX_FORMAT_YUV420_AFBC_8, formats); + mvx_set_bit(MVX_FORMAT_YUV420_AFBC_10, formats); + mvx_set_bit(MVX_FORMAT_YUV422_AFBC_8, formats); + mvx_set_bit(MVX_FORMAT_YUV422_AFBC_10, formats); + mvx_set_bit(MVX_FORMAT_YUV420_I420, formats); + mvx_set_bit(MVX_FORMAT_YUV420_NV12, formats); + mvx_set_bit(MVX_FORMAT_YUV420_NV21, formats); + mvx_set_bit(MVX_FORMAT_YUV420_P010, formats); + mvx_set_bit(MVX_FORMAT_YUV420_Y0L2, formats); + mvx_set_bit(MVX_FORMAT_YUV420_AQB1, formats); + mvx_set_bit(MVX_FORMAT_YUV422_YUY2, formats); + mvx_set_bit(MVX_FORMAT_YUV422_UYVY, formats); + mvx_set_bit(MVX_FORMAT_YUV422_Y210, formats); + } +} diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_hwreg_v61.h b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_hwreg_v61.h new file mode 100755 index 000000000..7ef544534 --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_hwreg_v61.h @@ -0,0 +1,49 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef _MVX_HWREG_V61_H_ +#define _MVX_HWREG_V61_H_ + +/**************************************************************************** + * Includes + ****************************************************************************/ + +#include "mvx_hwreg.h" +#include "mvx_if.h" + +/**************************************************************************** + * Exported functions + ****************************************************************************/ + +void mvx_hwreg_get_formats_v61(enum mvx_direction direction, + uint64_t *formats); + +#endif /* _MVX_HWREG_V61_H_ */ diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_if.c b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_if.c new file mode 100755 index 000000000..8ae22abc2 --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_if.c @@ -0,0 +1,244 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +/**************************************************************************** + * Includes + ****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include "mvx_ext_if.h" +#include "mvx_if.h" +#include "mvx_log_group.h" +#include "mvx_firmware.h" +#include "mvx_firmware_cache.h" +#include "mvx_secure.h" +#include "mvx_session.h" + +/**************************************************************************** + * Types + ****************************************************************************/ + +/** + * struct mvx_if_ctx - Device context. + * + * There is one instance of this structure for each device. + */ +struct mvx_if_ctx { + struct device *dev; + struct mvx_ext_if ext; + struct mvx_fw_cache firmware; + struct mvx_client_ops *client_ops; + struct mvx_if_ops if_ops; + struct mvx_secure secure; + struct kobject kobj; + struct completion kobj_unregister; + struct dentry *dentry; +}; + +/**************************************************************************** + * Static variables and functions + ****************************************************************************/ + +/* Physical hardware can handle 40 physical bits. */ +static uint64_t mvx_if_dma_mask = DMA_BIT_MASK(40); + +static struct mvx_if_ctx *if_ops_to_if_ctx(struct mvx_if_ops *ops) +{ + return container_of(ops, struct mvx_if_ctx, if_ops); +} + +static void if_release(struct kobject *kobj) +{ + struct mvx_if_ctx *ctx = container_of(kobj, struct mvx_if_ctx, kobj); + + complete(&ctx->kobj_unregister); +} + +static struct kobj_type if_ktype = { + .release = if_release, + .sysfs_ops = &kobj_sysfs_ops +}; + +/**************************************************************************** + * Exported variables and functions + ****************************************************************************/ + +struct mvx_if_ops *mvx_if_create(struct device *dev, + struct mvx_client_ops *client_ops, + void *priv) +{ + struct mvx_if_ctx *ctx; + int ret; + + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_INFO, "probe"); + + dev->dma_mask = &mvx_if_dma_mask; + dev->coherent_dma_mask = mvx_if_dma_mask; + + /* + * This parameter is indirectly used by DMA-API to limit a lookup + * through a hash table with allocated DMA regions. If the value is + * not high enough, a lookup will be terminated too early and a false + * negative warning will be generated for every DMA operation. + * + * To prevent this behavior vb2-dma-contig allocator keeps this value + * set to the maximum requested buffer size. Unfortunately this is not + * done for vb2-dma-sg which we are using, so we have to implement the + * same logic. + * + * In this change I set a value permanently to 2Gb, but in the next + * commit a functionality similar to vb2-dma-contig will be added. + * + * Mentioned structure also has one more member: segment_boundary_mask. + * It has to be investigated if any value should be assigned to it. + * + * See the following kernel commit for the reference: + * 3f03396918962b2f8b888d02b23cd1e0c88bf5e5 + */ + dev->dma_parms = devm_kzalloc(dev, sizeof(*dev->dma_parms), GFP_KERNEL); + if (dev->dma_parms == NULL) + return ERR_PTR(-ENOMEM); + + dma_set_max_seg_size(dev, SZ_2G); + +#if 0 +#if (KERNEL_VERSION(4, 1, 0) <= LINUX_VERSION_CODE) && IS_ENABLED(CONFIG_OF) + of_dma_configure(dev, dev->of_node); +#endif +#else +#if IS_ENABLED(CONFIG_OF) + of_dma_configure(dev, dev->of_node, true); +#endif +#endif + + /* Create device context and store pointer in device private data. */ + ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL); + if (ctx == NULL) { + ret = -ENOMEM; + goto free_dma_parms; + } + + if (IS_ENABLED(CONFIG_DEBUG_FS)) { + char name[20]; + + scnprintf(name, sizeof(name), "%s%u", MVX_IF_NAME, dev->id); + ctx->dentry = debugfs_create_dir(name, NULL); + if (IS_ERR_OR_NULL(ctx->dentry)) { + ret = -EINVAL; + goto free_ctx; + } + } + + /* Store context in device private data. */ + ctx->dev = dev; + ctx->client_ops = client_ops; + + /* Initialize if ops. */ + ctx->if_ops.irq = mvx_session_irq; + + init_completion(&ctx->kobj_unregister); + + /* Create sysfs entry for the device */ + ret = kobject_init_and_add(&ctx->kobj, &if_ktype, + kernel_kobj, "amvx%u", dev->id); + if (ret != 0) { + kobject_put(&ctx->kobj); + goto remove_debugfs; + } + + /* Initialize secure video. */ + ret = mvx_secure_construct(&ctx->secure, dev); + if (ret != 0) + goto delete_kobject; + + /* Initialize firmware cache. */ + ret = mvx_fw_cache_construct(&ctx->firmware, dev, &ctx->secure, + &ctx->kobj); + if (ret != 0) + goto destroy_secure; + + /* Create the external device interface. */ + ret = mvx_ext_if_construct(&ctx->ext, dev, &ctx->firmware, + ctx->client_ops, ctx->dentry); + if (ret != 0) + goto destroy_fw_cache; + + return &ctx->if_ops; + +destroy_fw_cache: + mvx_fw_cache_destruct(&ctx->firmware); + +destroy_secure: + mvx_secure_destruct(&ctx->secure); + +delete_kobject: + kobject_put(&ctx->kobj); + +remove_debugfs: + if (IS_ENABLED(CONFIG_DEBUG_FS)) + debugfs_remove_recursive(ctx->dentry); + +free_ctx: + devm_kfree(dev, ctx); + +free_dma_parms: + devm_kfree(dev, dev->dma_parms); + + return ERR_PTR(ret); +} + +void mvx_if_destroy(struct mvx_if_ops *if_ops) +{ + struct mvx_if_ctx *ctx = if_ops_to_if_ctx(if_ops); + struct device *dev = ctx->dev; + + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_INFO, "remove"); + + mvx_ext_if_destruct(&ctx->ext); + mvx_fw_cache_destruct(&ctx->firmware); + mvx_secure_destruct(&ctx->secure); + kobject_put(&ctx->kobj); + wait_for_completion(&ctx->kobj_unregister); + if (IS_ENABLED(CONFIG_DEBUG_FS)) + debugfs_remove_recursive(ctx->dentry); + + devm_kfree(dev, dev->dma_parms); + devm_kfree(dev, ctx); + + dev->dma_mask = NULL; + dev->coherent_dma_mask = 0; +} diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_if.h b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_if.h new file mode 100755 index 000000000..7283aa4c7 --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_if.h @@ -0,0 +1,525 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef _MVX_IF_H_ +#define _MVX_IF_H_ + +/**************************************************************************** + * Includes + ****************************************************************************/ + +#include +#include +#include "mvx_mmu.h" + +/**************************************************************************** + * Defines + ****************************************************************************/ + +/** + * The name of the device driver. + */ +#define MVX_IF_NAME "amvx_if" +/**************************************************************************** + * Types + ****************************************************************************/ + +struct device; +struct mvx_client_ops; +struct mvx_client_session; +struct mvx_if_ctx; +struct platform_device; + +/** + * enum mvx_direction - Direction from the point of view of the hardware block. + */ +enum mvx_direction { + MVX_DIR_INPUT, + MVX_DIR_OUTPUT, + MVX_DIR_MAX +}; + +/** + * enum mvx_tristate - Tristate boolean variable. + */ +enum mvx_tristate { + MVX_TRI_UNSET = -1, + MVX_TRI_TRUE = 0, + MVX_TRI_FALSE = 1 +}; + +/** + * enum mvx_format - List of compressed formats and frame formats. + * + * Enumeration of formats that are supported by all know hardware revisions. + * + * The enumeration should start at 0 and should not contain any gaps. + */ +enum mvx_format { + /* Compressed formats. */ + MVX_FORMAT_BITSTREAM_FIRST, + MVX_FORMAT_AVS = MVX_FORMAT_BITSTREAM_FIRST, + MVX_FORMAT_AVS2, + MVX_FORMAT_H263, + MVX_FORMAT_H264, + MVX_FORMAT_HEVC, + MVX_FORMAT_JPEG, + MVX_FORMAT_MPEG2, + MVX_FORMAT_MPEG4, + MVX_FORMAT_RV, + MVX_FORMAT_VC1, + MVX_FORMAT_VP8, + MVX_FORMAT_VP9, + MVX_FORMAT_AV1, + MVX_FORMAT_BITSTREAM_LAST = MVX_FORMAT_AV1, + + /* Uncompressed formats. */ + MVX_FORMAT_FRAME_FIRST, + MVX_FORMAT_YUV420_AFBC_8 = MVX_FORMAT_FRAME_FIRST, + MVX_FORMAT_YUV420_AFBC_10, + MVX_FORMAT_YUV422_AFBC_8, + MVX_FORMAT_YUV422_AFBC_10, + MVX_FORMAT_YUV420_I420, + MVX_FORMAT_YUV420_NV12, + MVX_FORMAT_YUV420_NV21, + MVX_FORMAT_YUV420_P010, + MVX_FORMAT_YUV420_Y0L2, + MVX_FORMAT_YUV420_AQB1, + MVX_FORMAT_YUV422_YUY2, + MVX_FORMAT_YUV422_UYVY, + MVX_FORMAT_YUV422_Y210, + MVX_FORMAT_RGBA_8888, + MVX_FORMAT_BGRA_8888, + MVX_FORMAT_ARGB_8888, + MVX_FORMAT_ABGR_8888, + MVX_FORMAT_RGB_888, + MVX_FORMAT_BGR_888, + MVX_FORMAT_RGB_888_3P, + MVX_FORMAT_ARGB_1555, + MVX_FORMAT_ARGB_4444, + MVX_FORMAT_RGB_565, + MVX_FORMAT_Y, + MVX_FORMAT_Y_10, + MVX_FORMAT_YUV444, + MVX_FORMAT_YUV444_10, + MVX_FORMAT_YUV420_2P_10, + MVX_FORMAT_YUV422_1P_10, + MVX_FORMAT_YUV420_I420_10, + MVX_FORMAT_FRAME_LAST = MVX_FORMAT_YUV420_I420_10, + + MVX_FORMAT_MAX +}; + +/** + * enum mvx_hw_id - Enumeration of known hardware revisions. + */ +enum mvx_hw_id { + MVE_Unknown = 0x0, + MVE_v500 = 0x500, + MVE_v550 = 0x550, + MVE_v61 = 0x61, + MVE_v52_v76 = 0x5276 +}; + +/** + * struct mvx_hw_ver - Hardware version. + */ +struct mvx_hw_ver { + enum mvx_hw_id id; + uint32_t revision; + uint32_t patch; +}; + +/** + * enum mvx_nalu_format - NALU format. + */ +enum mvx_nalu_format { + MVX_NALU_FORMAT_UNDEFINED, + MVX_NALU_FORMAT_START_CODES, + MVX_NALU_FORMAT_ONE_NALU_PER_BUFFER, + MVX_NALU_FORMAT_ONE_BYTE_LENGTH_FIELD, + MVX_NALU_FORMAT_TWO_BYTE_LENGTH_FIELD, + MVX_NALU_FORMAT_FOUR_BYTE_LENGTH_FIELD +}; + +/** + * enum mvx_profile - Profile for encoder. + */ +enum mvx_profile { + MVX_PROFILE_NONE, + + MVX_PROFILE_H264_BASELINE, + MVX_PROFILE_H264_MAIN, + MVX_PROFILE_H264_HIGH, + MVX_PROFILE_H264_HIGH_10, + + MVX_PROFILE_H265_MAIN, + MVX_PROFILE_H265_MAIN_STILL, + MVX_PROFILE_H265_MAIN_INTRA, + MVX_PROFILE_H265_MAIN_10, + + MVX_PROFILE_VC1_SIMPLE, + MVX_PROFILE_VC1_MAIN, + MVX_PROFILE_VC1_ADVANCED, + + MVX_PROFILE_VP8_MAIN +}; + +/** + * enum mvx_level - Level for encoder. + */ +enum mvx_level { + MVX_LEVEL_NONE, + + MVX_LEVEL_H264_1, + MVX_LEVEL_H264_1b, + MVX_LEVEL_H264_11, + MVX_LEVEL_H264_12, + MVX_LEVEL_H264_13, + MVX_LEVEL_H264_2, + MVX_LEVEL_H264_21, + MVX_LEVEL_H264_22, + MVX_LEVEL_H264_3, + MVX_LEVEL_H264_31, + MVX_LEVEL_H264_32, + MVX_LEVEL_H264_4, + MVX_LEVEL_H264_41, + MVX_LEVEL_H264_42, + MVX_LEVEL_H264_5, + MVX_LEVEL_H264_51, + MVX_LEVEL_H264_52, + MVX_LEVEL_H264_6, + MVX_LEVEL_H264_61, + MVX_LEVEL_H264_62, + + MVX_LEVEL_H265_MAIN_1, + MVX_LEVEL_H265_HIGH_1, + MVX_LEVEL_H265_MAIN_2, + MVX_LEVEL_H265_HIGH_2, + MVX_LEVEL_H265_MAIN_21, + MVX_LEVEL_H265_HIGH_21, + MVX_LEVEL_H265_MAIN_3, + MVX_LEVEL_H265_HIGH_3, + MVX_LEVEL_H265_MAIN_31, + MVX_LEVEL_H265_HIGH_31, + MVX_LEVEL_H265_MAIN_4, + MVX_LEVEL_H265_HIGH_4, + MVX_LEVEL_H265_MAIN_41, + MVX_LEVEL_H265_HIGH_41, + MVX_LEVEL_H265_MAIN_5, + MVX_LEVEL_H265_HIGH_5, + MVX_LEVEL_H265_MAIN_51, + MVX_LEVEL_H265_HIGH_51, + MVX_LEVEL_H265_MAIN_52, + MVX_LEVEL_H265_HIGH_52, + MVX_LEVEL_H265_MAIN_6, + MVX_LEVEL_H265_HIGH_6, + MVX_LEVEL_H265_MAIN_61, + MVX_LEVEL_H265_HIGH_61, + MVX_LEVEL_H265_MAIN_62, + MVX_LEVEL_H265_HIGH_62 +}; + +/** + * enum mvx_gop_type - GOP type for encoder. + */ +enum mvx_gop_type { + MVX_GOP_TYPE_NONE, + MVX_GOP_TYPE_BIDIRECTIONAL, + MVX_GOP_TYPE_LOW_DELAY, + MVX_GOP_TYPE_PYRAMID, + MVX_GOP_TYPE_SVCT3, + MVX_GOP_TYPE_GDR +}; + +/** + * enum mvx_entropy_mode - Entropy mode for encoder. + */ +enum mvx_entropy_mode { + MVX_ENTROPY_MODE_NONE, + MVX_ENTROPY_MODE_CAVLC, + MVX_ENTROPY_MODE_CABAC +}; + +/** + * enum mvx_multi_slice_mode - Multi slice mode. + */ +enum mvx_multi_slice_mode { + MVX_MULTI_SLICE_MODE_SINGLE, + MVX_MULTI_SLICE_MODE_MAX_MB +}; + +/** + * enum mvx_vp9_prob_update - Probability update method. + */ +enum mvx_vp9_prob_update { + MVX_VP9_PROB_UPDATE_DISABLED, + MVX_VP9_PROB_UPDATE_IMPLICIT, + MVX_VP9_PROB_UPDATE_EXPLICIT +}; + +/** + * enum mvx_rgb_to_yuv_mode - RGB to YUV conversion mode. + */ +enum mvx_rgb_to_yuv_mode { + MVX_RGB_TO_YUV_MODE_BT601_STUDIO, + MVX_RGB_TO_YUV_MODE_BT601_FULL, + MVX_RGB_TO_YUV_MODE_BT709_STUDIO, + MVX_RGB_TO_YUV_MODE_BT709_FULL, + MVX_RGB_TO_YUV_MODE_BT2020_STUDIO, + MVX_RGB_TO_YUV_MODE_BT2020_FULL, + MVX_RGB_TO_YUV_MODE_MAX +}; + +/** + * enum mvx_yuv_to_rgb_mode - YUV to RGB conversion mode. + */ +enum mvx_yuv_to_rgb_mode { + MVX_YUV_TO_RGB_MODE_BT601_LIMT, + MVX_YUV_TO_RGB_MODE_BT601_FULL, + MVX_YUV_TO_RGB_MODE_BT709_LIMT, + MVX_YUV_TO_RGB_MODE_BT709_FULL, + MVX_YUV_TO_RGB_MODE_BT2020_LIMT, + MVX_YUV_TO_RGB_MODE_BT2020_FULL, + MVX_YUV_TO_RGB_MODE_MAX +}; + +/** + * enum use_cust_yuv_to_rgb_mode - YUV to RGB conversion mode. + */ +enum use_cust_yuv_to_rgb_mode { + MVX_CUST_YUV2RGB_MODE_UNSET, + MVX_CUST_YUV2RGB_MODE_STANDARD, + MVX_CUST_YUV2RGB_MODE_CUSTOMIZED +}; + + +/** + * struct mvx_if_session - Structure holding members needed to map a session to + * a hardare device. + * @kref: Reference counter for the session object. + * @release: Function pointer that shall be passed to kref_put. If the + * reference count reaches 0 this function will be called to + * destruct and deallocate the object. + * @ncores: Number of cores this session has been mapped to. + * @l0_pte: Level 0 page table entry. This value is written to the hardware + * MMU CTRL register to point out the location of the L1 page table + * and to set access permissions and bus attributes. + * @securevideo:Secure video enabled. + */ +struct mvx_if_session { + struct kref kref; + struct mutex *mutex; + void (*release)(struct kref *kref); + unsigned int ncores; + mvx_mmu_pte l0_pte; + bool securevideo; +}; + +/** + * struct mvx_if_ops - Functions pointers the registered device may use to call + * the if device. + */ +struct mvx_if_ops { + /** + * irq() - Handle IRQ sent from firmware to driver. + */ + void (*irq)(struct mvx_if_session *session); +}; + +/** + * struct mvx_client_ops - Functions pointers the if device may use to call + * the registered device. + */ +struct mvx_client_ops { + struct list_head list; + + /** + * get_hw_ver() - Get MVE hardware version + */ + void (*get_hw_ver)(struct mvx_client_ops *client, + struct mvx_hw_ver *version); + + /** + * get_formats() - Get list of supported formats. + * + * Return: 0 on success, else error code. + */ + void (*get_formats)(struct mvx_client_ops *client, + enum mvx_direction direction, + uint64_t *formats); + + /** + * get_ncores() - Get number of cores. + * + * Return: Number of cores on success, else error code. + */ + unsigned int (*get_ncores)(struct mvx_client_ops *client); + + /* + * SESSION. + */ + + /** + * register_session() - Register if session with client. + * + * Return: Client session handle on success, else ERR_PTR. + */ + struct mvx_client_session + *(*register_session)(struct mvx_client_ops *client, + struct mvx_if_session *session); + + /** + * unregister_session() - Unregister session. + * + * Return: 0 on success, else error code. + */ + void (*unregister_session)(struct mvx_client_session *session); + + /** + * switch_in() - Switch in session. + * + * After a session has been switched in it must wait for a 'switched + * out' event before it is allowed to requested to be switched in again. + * Switching in a already switched in session is regarded as an error. + * + * Return: 0 on success, else error code. + */ + int (*switch_in)(struct mvx_client_session *session); + + /** + * send_irq() - Send IRQ from driver to firmware. + * + * Return: 0 on success, else error code. + */ + int (*send_irq)(struct mvx_client_session *session); + + /** + * flush_mmu() - Flush MMU tables. + * + * Flushing MMU tables is only required if pages have been removed + * from the page tables. + * + * Return: 0 on success, else error code. + */ + int (*flush_mmu)(struct mvx_client_session *session); + + /** + * print_debug() - Print debug information. + * + * Return: 0 on success, else error code. + */ + void (*print_debug)(struct mvx_client_session *session); +}; + +/**************************************************************************** + * Static functions + ****************************************************************************/ + +/** + * mvx_is_bitstream(): Detect if format is of type bitstream. + * @format: Format. + * + * Return: True if format is bitstream, else false. + */ +static inline bool mvx_is_bitstream(enum mvx_format format) +{ + return (format >= MVX_FORMAT_BITSTREAM_FIRST) && + (format <= MVX_FORMAT_BITSTREAM_LAST); +} + +/** + * mvx_is_frame(): Detect if format is of type frame. + * @format: Format. + * + * Return: True if format is frame, else false. + */ +static inline bool mvx_is_frame(enum mvx_format format) +{ + return (format >= MVX_FORMAT_FRAME_FIRST) && + (format <= MVX_FORMAT_FRAME_LAST); +} + +/** + * mvx_is_rgb(): Detect if format is of type RGB. + * @format: Format. + * + * Return: True if format is RGB, else false. + */ +static inline bool mvx_is_rgb(enum mvx_format format) +{ + return (format >= MVX_FORMAT_RGBA_8888) && + (format <= MVX_FORMAT_ABGR_8888); +} + +/** + * mvx_is_rgb24(): Detect if format is of type RGB24. + * @format: Format. + * + * Return: True if format is RGB24, else false. + */ + +static inline bool mvx_is_rgb24(enum mvx_format format) +{ + return (format >= MVX_FORMAT_RGB_888) && + (format <= MVX_FORMAT_RGB_888_3P); +} + + +/** + * mvx_is_afbc(): Detect if format is of type AFBC. + * @format: Format. + * + * Return: True if format is AFBC, else false. + */ +static inline bool mvx_is_afbc(enum mvx_format format) +{ + return (format >= MVX_FORMAT_YUV420_AFBC_8) && + (format <= MVX_FORMAT_YUV422_AFBC_10); +} + +/**************************************************************************** + * Exported functions + ****************************************************************************/ + +/** + * mvx_if_create() - Create IF device. + */ +struct mvx_if_ops *mvx_if_create(struct device *dev, + struct mvx_client_ops *client_ops, + void *priv); + +/** + * mvx_if_destroy() - Destroy IF device. + */ +void mvx_if_destroy(struct mvx_if_ops *if_ops); + +#endif /* _MVX_IF_H_ */ diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_log.c b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_log.c new file mode 100755 index 000000000..cd326e002 --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_log.c @@ -0,0 +1,950 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +/****************************************************************************** + * Includes + ******************************************************************************/ + +#include "mvx_log.h" +#include "mvx_log_ram.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/****************************************************************************** + * Defines + ******************************************************************************/ + +#ifndef UNUSED +#define UNUSED(x) (void)(x) +#endif /* UNUSED */ + +/****************************************************************************** + * Types + ******************************************************************************/ + +/****************************************************************************** + * Variables + ******************************************************************************/ + +#ifdef MVX_LOG_FTRACE_ENABLE + +/** + * Map severity to string. + */ +static const char *const severity_to_name[] = { + "Panic", + "Error", + "Warning", + "Info", + "Debug", + "Verbose" +}; +#endif /* MVX_LOG_FTRACE_ENABLE */ + +/** + * Map severity to kernel log level. + */ +static const char *const severity_to_kern_level[] = { + KERN_EMERG, + KERN_ERR, + KERN_WARNING, + KERN_NOTICE, + KERN_INFO, + KERN_DEBUG +}; + +/****************************************************************************** + * Static functions + ******************************************************************************/ + +/****************************************************************************** + * Log + * + * Directory i_node->i_private + * -------------------------------------------------------- + * mvx struct mvx_log * + * +-- group + * | +-- struct mvx_log_group * + * | +-- severity + * | +-- drain + * +-- drain + * +-- struct mvx_log_drain * + * + ******************************************************************************/ + +/** + * trim() - Trim of trailing new line. + * @str: Pointer to string. + */ +static void trim(char *str) +{ + size_t len = strlen(str); + + while (len-- > 0) { + if (str[len] != '\n') + break; + + str[len] = '\0'; + } +} + +/** + * lookup() - Search for child dentry with matching name. + * @parent: Pointer to parent dentry. + * @name: Name of dentry to look for. + * + * Return: Pointer to dentry, NULL if not found. + */ +static struct dentry *lookup(struct dentry *parent, + const char *name) +{ + struct dentry *child; + + /* Loop over directory entries in mvx/drain/. */ +#if (KERNEL_VERSION(3, 18, 0) <= LINUX_VERSION_CODE) + list_for_each_entry(child, &parent->d_subdirs, d_child) +#else + list_for_each_entry(child, &parent->d_subdirs, d_u.d_child) +#endif + { + if (strcmp(name, child->d_name.name) == 0) + return child; + } + + return NULL; +} + +/** + * get_inode_private() - Get inode private member of parent directory. + * @file: File pointer. + * @parent: Number of parent directories. + * + * Return: Inode private member, or NULL on error. + */ +static void *get_inode_private(struct file *file, + int parent) +{ + struct dentry *d = file->f_path.dentry; + + while (d != NULL && parent-- > 0) + d = d->d_parent; + + if (d == NULL || d->d_inode == NULL) + return NULL; + + return d->d_inode->i_private; +} + +/** + * readme_read() - Read handle function for mvx/group//drain. The + * function returns the usage instruction message. + * @file: File pointer. + * @user_buffer: The user space buffer that is read to. + * @count: The maximum number of bytes to read. + * @position: The current position in the buffer. + */ +static ssize_t readme_read(struct file *file, + char __user *user_buffer, + size_t count, + loff_t *position) +{ + static const char msg[] = + "LOG GROUPS\n" + "\n" + "The avaible log groups can be found under 'group'.\n" + "$ ls group\n" + "\n" + "SEVERITY LEVELS\n" + " 0 - Panic\n" + " 1 - Error\n" + " 2 - Warning\n" + " 3 - Info\n" + " 4 - Debug\n" + " 5 - Verbose\n" + "\n" + "The severity level for a log group can be read and set at runtime.\n" + "$ cat group/general/severity\n" + "$ echo 3 > group/general/severity\n"; + + return simple_read_from_buffer(user_buffer, count, position, msg, + sizeof(msg)); +} + +/** + * group_drain_read() - Read handle function for mvx/group//drain. The + * function returns the name of the currently configured + * drain. + * @file: File pointer. + * @user_buffer: The user space buffer that is read to. + * @count: The maximum number of bytes to read. + * @position: The current position in the buffer. + */ +static ssize_t group_drain_read(struct file *file, + char __user *user_buffer, + size_t count, + loff_t *position) +{ + /* File path mvx/group//drain. */ + struct mvx_log_group *group = get_inode_private(file, 1); + struct mvx_log_drain *drain = group->drain; + char name[100]; + size_t len; + + if (drain == NULL || drain->dentry == NULL) { + pr_err("MVX: No drain assigned to log group.\n"); + return -EINVAL; + } + + len = scnprintf(name, sizeof(name), "%s\n", drain->dentry->d_name.name); + + return simple_read_from_buffer(user_buffer, count, position, name, len); +} + +/** + * group_drain_write() - Write handle function for mvx/group//drain. The + * function sets the drain for the group. If the drain + * does not match any registered drain, then error is + * returned to user space. + * @file: File pointer. + * @user_buffer: The user space buffer that is written to. + * @count: The maximum number of bytes to write. + * @position: The current position in the buffer. + */ +static ssize_t group_drain_write(struct file *file, + const char __user *user_buffer, + size_t count, + loff_t *position) +{ + /* File path mvx/group//drain. */ + struct mvx_log_group *group = get_inode_private(file, 1); + struct mvx_log *log = get_inode_private(file, 3); + struct dentry *dentry; + char drain_str[100]; + ssize_t size; + + /* Check that input is not larger that path buffer. */ + if (count > (sizeof(drain_str) - 1)) { + pr_err("MVX: Input overflow.\n"); + + return -EINVAL; + } + + /* Append input to path. */ + size = simple_write_to_buffer(drain_str, sizeof(drain_str) - 1, + position, user_buffer, count); + drain_str[count] = '\0'; + trim(drain_str); + + dentry = lookup(log->drain_dir, drain_str); + + if (IS_ERR_OR_NULL(dentry)) { + pr_warn("MVX: No drain matching '%s'.\n", drain_str); + return -EINVAL; + } + + /* Assign drain to log group. */ + group->drain = dentry->d_inode->i_private; + + return size; +} + +/** + * drain_ram_read() - Read the RAM buffer. + * @drain: The RAM buffer drain. + * @user_buffer: The user space buffer that is read to. + * @count: The maximum number of bytes to read. + * @position: The current position in the buffer. + * @pos: The last used position of the drain buffer + */ +static ssize_t drain_ram_read(struct mvx_log_drain_ram *drain, + char __user *user_buffer, + size_t count, + loff_t *position, + size_t pos) +{ + ssize_t n = 0; + + /* Make sure position is not beyond end of file. */ + if (*position > pos) + return -EINVAL; + + /* If position is more than BUFFER_SIZE bytes behind, then fast forward + * to current position minus BUFFER_SIZE. + */ + if ((pos - *position) > drain->buffer_size) + *position = pos - drain->buffer_size; + + /* Copy data to user space. */ + while ((n < count) && (*position < pos)) { + size_t offset; + size_t length; + + /* Offset in circular buffer. */ + offset = *position & (drain->buffer_size - 1); + + /* Available number of bytes. */ + length = min((size_t)(pos - *position), count - n); + + /* Make sure length does not go beyond end of circular buffer. + */ + length = min(length, drain->buffer_size - offset); + + /* Copy data from kernel- to user space. */ + length -= copy_to_user(&user_buffer[n], &drain->buf[offset], + length); + + /* No bytes were copied. Return error. */ + if (length == 0) + return -EINVAL; + + *position += length; + n += length; + } + + return n; +} + +/** + * drain_ram_read_msg() - Read of the RAM file. + * @file: File pointer. + * @user_buffer: The user space buffer that is read to. + * @count: The maximum number of bytes to read. + * @position: The current position in the buffer. + */ +static ssize_t drain_ram_read_msg(struct file *file, + char __user *user_buffer, + size_t count, + loff_t *position) +{ + struct mvx_log_drain_ram *drain = get_inode_private(file, 1); + + while (*position == drain->write_pos) { + int ret; + + if (file->f_flags & O_NONBLOCK) + return -EAGAIN; + + /* Block until there is data available. */ + ret = wait_event_interruptible(drain->queue, + *position < drain->write_pos); + if (ret != 0) + return -EINTR; + } + + return drain_ram_read(drain, user_buffer, count, position, + drain->write_pos); +} + +/** + * drain_ram_msg_poll() - Handle poll. + * @file: File pointer. + * @wait: The poll table to which the wait queue is added. + */ +static unsigned int drain_ram_msg_poll(struct file *file, + poll_table *wait) +{ + unsigned int mask = 0; + struct mvx_log_drain_ram *drain = get_inode_private(file, 1); + + poll_wait(file, &drain->queue, wait); + + if (file->f_pos < drain->write_pos) + mask |= POLLIN | POLLRDNORM; + else if (file->f_pos > drain->write_pos) + mask |= POLLERR; + + return mask; +} + +/** + * drain_ram_ioctl() - Handle IOCTL. + * @file: File pointer. + * @cmd: The value of the command to be handled. + * @arg: Extra argument. + */ +static long drain_ram_ioctl(struct file *file, + unsigned int cmd, + unsigned long arg) +{ + struct mvx_log_drain_ram *drain_ram = get_inode_private(file, 1); + + switch (cmd) { + case MVX_LOG_IOCTL_CLEAR: + drain_ram->read_pos = drain_ram->write_pos; + break; + default: + return -EINVAL; + } + + return 0; +} + +/** + * drain_ram_open() - Open file handle function. + * @inode: The inode associated with the file. + * @file: Pointer to the opened file. + * + * Return: 0 Always succeeds. + */ +static int drain_ram_open(struct inode *inode, + struct file *file) +{ + struct mvx_log_drain_ram *drain_ram = get_inode_private(file, 1); + + file->f_pos = drain_ram->read_pos; + + return 0; +} + +/****************************************************************************** + * External interface + ******************************************************************************/ + +int mvx_log_construct(struct mvx_log *log, + const char *entry_name) +{ + int ret; + static const struct file_operations readme_fops = { + .read = readme_read + }; + struct dentry *dentry; + + if (!IS_ENABLED(CONFIG_DEBUG_FS)) { + pr_info( + "MVX: Debugfs is not enabled. '%s' dir is not created.\n", + entry_name); + return 0; + } + + log->mvx_dir = debugfs_create_dir(entry_name, NULL); + if (IS_ERR_OR_NULL(log->mvx_dir)) { + pr_err("MVX: Failed to create '%s' dir.\n", entry_name); + return -ENOMEM; + } + + log->log_dir = debugfs_create_dir("log", log->mvx_dir); + if (IS_ERR_OR_NULL(log->log_dir)) { + pr_err("MVX: Failed to create 'log' dir.\n"); + ret = -ENOMEM; + goto error; + } + + log->log_dir->d_inode->i_private = log; + + log->drain_dir = debugfs_create_dir("drain", log->log_dir); + if (IS_ERR_OR_NULL(log->drain_dir)) { + pr_err("MVX: Failed to create 'drain' dir.\n"); + ret = -ENOMEM; + goto error; + } + + log->group_dir = debugfs_create_dir("group", log->log_dir); + if (IS_ERR_OR_NULL(log->group_dir)) { + pr_err("MVX: Failed to create 'group' dir.\n"); + ret = -ENOMEM; + goto error; + } + + /* Create /drain. */ + dentry = debugfs_create_file("README", 0400, log->log_dir, NULL, + &readme_fops); + if (IS_ERR_OR_NULL(dentry)) { + pr_err("MVX: Failed to create 'README'.\n"); + ret = -ENOMEM; + goto error; + } + + return 0; + +error: + debugfs_remove_recursive(log->mvx_dir); + return ret; +} + +void mvx_log_destruct(struct mvx_log *log) +{ + if (IS_ENABLED(CONFIG_DEBUG_FS)) + debugfs_remove_recursive(log->mvx_dir); +} + +/****************************************************************************** + * Log Drain + ******************************************************************************/ + +static int drain_construct(struct mvx_log_drain *drain, + mvx_print_fptr print, + mvx_data_fptr data) +{ + drain->print = print; + drain->data = data; + + return 0; +} + +static void drain_destruct(struct mvx_log_drain *drain) +{ + UNUSED(drain); +} + +static void drain_dmesg_print(struct mvx_log_drain *drain, + enum mvx_log_severity severity, + const char *tag, + const char *msg, + const unsigned int n_args, + ...) +{ + va_list args; + char fmt[500]; + + severity = min_t(int, severity, MVX_LOG_VERBOSE); + + snprintf(fmt, sizeof(fmt), "%s%s: %s\n", + severity_to_kern_level[severity], tag, msg); + fmt[sizeof(fmt) - 1] = '\0'; + + va_start(args, n_args); + vprintk(fmt, args); + va_end(args); +} + +static void drain_dmesg_data(struct mvx_log_drain *drain, + enum mvx_log_severity severity, + struct iovec *vec, + size_t count) +{ + size_t i; + + pr_info("count=%zu\n", count); + + for (i = 0; i < count; ++i) { + const char *p = vec[i].iov_base; + size_t length = vec[i].iov_len; + + pr_info(" length=%zu\n", length); + + while (length > 0) { + size_t j = min_t(size_t, length, 32); +#if 0 + char buf[3 + j * 3 + 1]; + size_t n = 0; +#else + char *buf; + size_t n = 0; + buf = vmalloc(3 + j * 3 + 1); + +#endif + length -= j; + + n += scnprintf(&buf[n], sizeof(buf) - n, " "); + + while (j-- > 0) + n += scnprintf(&buf[n], sizeof(buf) - n, + " %02x", *p++); + + pr_info("%s\n", buf); + } + } +} + +int mvx_log_drain_dmesg_construct(struct mvx_log_drain *drain) +{ + return drain_construct(drain, drain_dmesg_print, drain_dmesg_data); +} + +void mvx_log_drain_dmesg_destruct(struct mvx_log_drain *drain) +{ + drain_destruct(drain); +} + +int mvx_log_drain_add(struct mvx_log *log, + const char *name, + struct mvx_log_drain *drain) +{ + if (!IS_ENABLED(CONFIG_DEBUG_FS)) { + pr_info( + "MVX: Debugfs is not enabled. '%s' dir is not created.\n", + name); + return 0; + } + + /* Create directory. */ + drain->dentry = debugfs_create_dir(name, log->drain_dir); + if (IS_ERR_OR_NULL(drain->dentry)) { + pr_err("MVX: Failed to create '%s' dir.\n", name); + return -ENOMEM; + } + + /* Store pointer to drain object in inode private data. */ + drain->dentry->d_inode->i_private = drain; + + return 0; +} + +static void drain_ram_data(struct mvx_log_drain *drain, + enum mvx_log_severity severity, + struct iovec *vec, + size_t count) +{ + struct mvx_log_drain_ram *drain_ram = + (struct mvx_log_drain_ram *)drain; + size_t i; + size_t length; + size_t pos; + int sem_taken; + + if (!IS_ENABLED(CONFIG_DEBUG_FS)) + return; + + /* Calculate the total length of the output. */ + for (i = 0, length = 0; i < count; ++i) + length += vec[i].iov_len; + + /* Round up to next 32-bit boundary. */ + length = (length + 3) & ~3; + + if (length > drain_ram->buffer_size) { + pr_err( + "MVX: Logged data larger than output buffer. length=%zu, buffer_length=%zu.\n", + length, + (size_t)drain_ram->buffer_size); + return; + } + + sem_taken = down_interruptible(&drain_ram->sem); + + pos = drain_ram->write_pos & (drain_ram->buffer_size - 1); + + /* Loop over scatter input. */ + for (i = 0; i < count; ++i) { + const char *buf = vec[i].iov_base; + size_t len = vec[i].iov_len; + + /* Copy log message to output buffer. */ + while (len > 0) { + size_t n = min(len, drain_ram->buffer_size - pos); + + memcpy(&drain_ram->buf[pos], buf, n); + + len -= n; + buf += n; + pos = (pos + n) & (drain_ram->buffer_size - 1); + } + } + + /* Update write_pos. Length has already been 4 byte aligned */ + drain_ram->write_pos += length; + + if (sem_taken == 0) + up(&drain_ram->sem); + + wake_up_interruptible(&drain_ram->queue); +} + +static void drain_ram_print(struct mvx_log_drain *drain, + enum mvx_log_severity severity, + const char *tag, + const char *msg, + const unsigned int n_args, + ...) +{ + char buf[500]; + va_list args; + size_t n = 0; + struct mvx_log_header header; + struct iovec vec[2]; + struct timespec64 timespec; + + if (!IS_ENABLED(CONFIG_DEBUG_FS)) + return; + + /* Write the log message. */ + va_start(args, n_args); + n += vscnprintf(buf, sizeof(buf), msg, args); + va_end(args); + + ktime_get_real_ts64(×pec); + + header.magic = MVX_LOG_MAGIC; + header.length = n; + header.type = MVX_LOG_TYPE_TEXT; + header.severity = severity; + header.timestamp.sec = timespec.tv_sec; + header.timestamp.nsec = timespec.tv_nsec; + + vec[0].iov_base = &header; + vec[0].iov_len = sizeof(header); + + vec[1].iov_base = buf; + vec[1].iov_len = n; + + drain_ram_data(drain, severity, vec, 2); +} + +int mvx_log_drain_ram_construct(struct mvx_log_drain_ram *drain, + size_t buffer_size) +{ + int ret; + + ret = drain_construct(&drain->base, drain_ram_print, drain_ram_data); + if (ret != 0) + return ret; + + if (!IS_ENABLED(CONFIG_DEBUG_FS)) { + pr_info("MVX: No Debugfs no RAM drain.\n"); + return 0; + } + + drain->buf = vmalloc(buffer_size); + if (drain->buf == NULL) + return -ENOMEM; + + *(size_t *) &drain->buffer_size = buffer_size; + drain->read_pos = 0; + drain->write_pos = 0; + init_waitqueue_head(&drain->queue); + sema_init(&drain->sem, 1); + + return 0; +} + +void mvx_log_drain_ram_destruct(struct mvx_log_drain_ram *drain) +{ + if (IS_ENABLED(CONFIG_DEBUG_FS)) + vfree(drain->buf); + + drain_destruct(&drain->base); +} + +int mvx_log_drain_ram_add(struct mvx_log *log, + const char *name, + struct mvx_log_drain_ram *drain) +{ + static const struct file_operations drain_ram_msg = { + .read = drain_ram_read_msg, + .poll = drain_ram_msg_poll, + .open = drain_ram_open, + .unlocked_ioctl = drain_ram_ioctl + }; + struct dentry *dentry; + int ret; + + if (!IS_ENABLED(CONFIG_DEBUG_FS)) { + pr_info( + "MVX: Debugfs is not enabled. RAM drain dirs are not created.\n"); + return 0; + } + + ret = mvx_log_drain_add(log, name, &drain->base); + if (ret != 0) + return ret; + + /* Create dentry. */ + dentry = debugfs_create_file("msg", 0600, drain->base.dentry, NULL, + &drain_ram_msg); + if (IS_ERR_OR_NULL(dentry)) { + pr_err("MVX: Failed to create '%s/msg.\n", name); + ret = -ENOMEM; + goto error; + } + + return 0; + +error: + debugfs_remove_recursive(drain->base.dentry); + + return ret; +} + +#ifdef MVX_LOG_FTRACE_ENABLE +static void drain_ftrace_print(struct mvx_log_drain *drain, + enum mvx_log_severity severity, + const char *tag, + const char *msg, + const unsigned int n_args, + ...) +{ + va_list args; + char fmt[500]; + + severity = min_t(int, severity, MVX_LOG_VERBOSE); + + snprintf(fmt, sizeof(fmt), "%s %s: %s\n", severity_to_name[severity], + tag, msg); + fmt[sizeof(fmt) - 1] = '\0'; + + va_start(args, n_args); + ftrace_vprintk(fmt, args); + va_end(args); +} + +static void drain_ftrace_data(struct mvx_log_drain *drain, + enum mvx_log_severity severity, + struct iovec *vec, + size_t count) +{ + size_t i; + + trace_printk("count=%zu\n", count); + + for (i = 0; i < count; ++i) { + const char *p = vec[i].iov_base; + size_t length = vec[i].iov_len; + + trace_printk(" length=%zu\n", length); + + while (length > 0) { + size_t j = min_t(size_t, length, 32); + char buf[3 + j * 3 + 1]; + size_t n = 0; + + length -= j; + + n += scnprintf(&buf[n], sizeof(buf) - n, " "); + + while (j-- > 0) + n += scnprintf(&buf[n], sizeof(buf) - n, + " %02x", *p++); + + trace_printk("%s\n", buf); + } + } +} + +int mvx_log_drain_ftrace_construct(struct mvx_log_drain *drain) +{ + return drain_construct(drain, drain_ftrace_print, drain_ftrace_data); +} + +void mvx_log_drain_ftrace_destruct(struct mvx_log_drain *drain) +{ + drain_destruct(drain); +} + +#endif /* MVX_LOG_FTRACE_ENABLE */ + +/****************************************************************************** + * Log Group + ******************************************************************************/ + +void mvx_log_group_construct(struct mvx_log_group *group, + const char *tag, + const enum mvx_log_severity severity, + struct mvx_log_drain *drain) +{ + group->tag = tag; + group->severity = severity; + group->drain = drain; +} + +int mvx_log_group_add(struct mvx_log *log, + const char *name, + struct mvx_log_group *group) +{ + static const struct file_operations group_drain_fops = { + .read = group_drain_read, + .write = group_drain_write + }; + struct dentry *dentry; + int ret; + + if (!IS_ENABLED(CONFIG_DEBUG_FS)) { + pr_info( + "MVX: Debugfs is not enabled. '%s' dir is not created.\n", + name); + return 0; + } + + /* Create directory. */ + group->dentry = debugfs_create_dir(name, log->group_dir); + if (IS_ERR_OR_NULL(group->dentry)) { + pr_err("MVX: Failed to create '%s' dir.\n", name); + ret = -ENOMEM; + goto error; + } + + /* Store reference to group object in inode private data. */ + group->dentry->d_inode->i_private = group; + + /* Create /severity. */ +#if 0 + dentry = debugfs_create_u32("severity", 0600, group->dentry, + &group->severity); + if (IS_ERR_OR_NULL(dentry)) { + pr_err("MVX: Failed to create '%s/severity' value.\n", + name); + ret = -ENOMEM; + goto error; + } +#else + debugfs_create_u32("severity", 0600, group->dentry, + &group->severity); +#endif + + /* Create /drain. */ + dentry = debugfs_create_file("drain", 0600, group->dentry, NULL, + &group_drain_fops); + if (IS_ERR_OR_NULL(dentry)) { + pr_err("MVX: Failed to create '%s/severity' value.\n", + name); + ret = -ENOMEM; + goto error; + } + + return 0; + +error: + mvx_log_group_destruct(group); + return ret; +} + +void mvx_log_group_destruct(struct mvx_log_group *group) +{ + UNUSED(group); +} + +const char *mvx_log_strrchr(const char *s) +{ + const char *p = strrchr(s, '/'); + + return (p == NULL) ? s : p + 1; +} diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_log.h b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_log.h new file mode 100755 index 000000000..fe450e08b --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_log.h @@ -0,0 +1,395 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef MVX_LOG_H +#define MVX_LOG_H + +/****************************************************************************** + * Includes + ******************************************************************************/ + +#include +#include +#include +#include +#include + +/****************************************************************************** + * Defines + ******************************************************************************/ +#define ENABLE_PM_CLK 1 + +// #define ENABLE_LOG_TO_MEM 1 +#ifdef ENABLE_LOG_TO_MEM +int vpuLog2Mem(const char *format, ...); +#define VPU_LOG2MEM(ARGS...) vpuLog2Mem(ARGS); +#else +#define VPU_LOG2MEM(ARGS...) +#endif + +/** + * Print a log message. + * + * @_lg: Pointer to log group. + * @_severity: Severity. + * @_fmt: Format string. + */ +#define MVX_LOG_PRINT(_lg, _severity, _fmt, ...) \ + do { \ + if ((_severity) <= (_lg)->severity) { \ + __MVX_LOG_PRINT(_lg, _severity, _fmt, ## __VA_ARGS__); \ + } \ + } while (0) + +/** + * Print a log message for a session. + * + * @_lg: Pointer to log group. + * @_severity: Severity. + * @_session: Pointer to session. + * @_fmt: Format string. + */ +#define MVX_LOG_PRINT_SESSION(_lg, _severity, _session, _fmt, ...) \ + do { \ + if ((_severity) <= (_lg)->severity) { \ + __MVX_LOG_PRINT(_lg, _severity, "%p " _fmt, _session, \ + ## __VA_ARGS__); \ + } \ + } while (0) + +/** + * Print binary data. + * + * @_lg: Pointer to log group. + * @_severity: Severity. + * @_vec: Scatter input vector data. + * @_count: _vec array size. + */ +#define MVX_LOG_DATA(_lg, _severity, _vec, _count) \ + do { \ + if ((_severity) <= (_lg)->severity) { \ + (_lg)->drain->data((_lg)->drain, _severity, _vec, \ + _count); \ + } \ + } while (0) + +/** + * Check if severity level for log group is enabled. + * + * @_lg: Pointer to log group. + * @_severity: Severity. + */ +#define MVX_LOG_ENABLED(_lg, _severity) \ + ((_severity) <= (_lg)->severity) + +/** + * Execute function if log group is enabled. + * + * @_lg: Pointer to log group. + * @_severity: Severity. + * @_exec: The function to be executed. + */ +#define MVX_LOG_EXECUTE(_lg, _severity, _exec) \ + do { \ + if (MVX_LOG_ENABLED(_lg, _severity)) { \ + _exec; \ + } \ + } while (0) + +#ifdef MVX_LOG_PRINT_FILE_ENABLE +#define __MVX_LOG_PRINT(_lg, _severity, _fmt, ...) \ + ((_lg)->drain->print((_lg)->drain, _severity, (_lg)->tag, \ + _fmt " (%s:%d)", \ + __MVX_LOG_N_ARGS(__VA_ARGS__), \ + ## __VA_ARGS__, \ + mvx_log_strrchr(__FILE__), __LINE__)) +#else +#define __MVX_LOG_PRINT(_lg, _severity, _fmt, ...) \ + ((_lg)->drain->print((_lg)->drain, _severity, (_lg)->tag, _fmt, \ + __MVX_LOG_N_ARGS(__VA_ARGS__), \ + ## __VA_ARGS__)) +#endif /* MVX_LOG_PRINT_FILE_ENABLE */ + +#define __MVX_LOG_N_ARGS(...) \ + __MVX_LOG_COUNT(dummy, ## __VA_ARGS__, 8, 7, 6, 5, 4, 3, 2, 1, 0) + +#define __MVX_LOG_COUNT(_0, _1, _2, _3, _4, _5, _6, _7, _8, N, ...) N + +/****************************************************************************** + * Types + ******************************************************************************/ + +/** + * enum mvx_log_severity - Severity levels. + */ +enum mvx_log_severity { + MVX_LOG_PANIC, + MVX_LOG_ERROR, + MVX_LOG_WARNING, + MVX_LOG_INFO, + MVX_LOG_DEBUG, + MVX_LOG_VERBOSE, + MVX_LOG_MAX +}; + +struct mvx_log_drain; + +/** + * mvx_print_fptr() - Function pointer to output text messages. + * + * @drain: Pointer to drain. + * @severity: Severity level. + * @tag: Log group tag. + * @fmt: Format string. + * @n_args: Number of arguments to format string. + */ +typedef void (*mvx_print_fptr)(struct mvx_log_drain *drain, + enum mvx_log_severity severity, + const char *tag, + const char *fmt, + const unsigned int n_args, + ...); + +/** + * mvx_data_fptr() - Function pointer to output binary data. + * + * @drain: Pointer to drain. + * @severity: Severity level. + * @vec: Pointer to the buffers that are copied. + * @count: The number of vec buffers. + */ +typedef void (*mvx_data_fptr)(struct mvx_log_drain *drain, + enum mvx_log_severity severity, + struct iovec *vec, + size_t count); + +/** + * struct mvx_log_drain - Structure with information about the drain. The drain + * handles the formatting and redirection of the log + * messages. + * @print: Print function pointer. + * @data: Data function pointer. + * @dentry: Debugfs dentry. + */ +struct mvx_log_drain { + mvx_print_fptr print; + mvx_data_fptr data; + struct dentry *dentry; +}; + +/** + * struct mvx_log_drain_ram - Structure describing a specialized RAM drain. + * @base: Base class. + * @buf: Pointer to output buffer. + * @buffer_size: Size of the buffer. Must be power of 2. + * @read_pos: Read position when a new file handle is opened. Is + * updated when the buffer is cleared. + * @write_pos: Current write position in RAM buffer. + * @queue: Wait queue for blocking IO. + * @sem: Semaphore to prevent concurrent writes. + */ +struct mvx_log_drain_ram { + struct mvx_log_drain base; + char *buf; + const size_t buffer_size; + size_t read_pos; + size_t write_pos; + wait_queue_head_t queue; + struct semaphore sem; +}; + +/** + * struct mvx_log_group - Structure describing log group. The log group filters + * which log messages that shall be forwarded to the + * drain. + * @tag: Name of log group. + * @severity: Severity level. + * @drain: Drain. + * @dentry: Debugfs dentry. + */ +struct mvx_log_group { + const char *tag; + enum mvx_log_severity severity; + struct mvx_log_drain *drain; + struct dentry *dentry; +}; + +/** + * struct mvx_log - Log class that keeps track of registered groups and drains. + */ +struct mvx_log { + struct dentry *mvx_dir; + struct dentry *log_dir; + struct dentry *drain_dir; + struct dentry *group_dir; +}; + +/**************************************************************************** + * Log + ****************************************************************************/ + +/** + * mvx_log_construct() - Log constructor. + * @log: Pointer to log. + * @entry_name: The name of the directory + * + * Return: 0 on success, else error code. + */ +int mvx_log_construct(struct mvx_log *log, + const char *entry_name); + +/** + * mvx_log_destruct() - Log destructor. + * @log: Pointer to log. + */ +void mvx_log_destruct(struct mvx_log *log); + +/**************************************************************************** + * Drain + ****************************************************************************/ + +/** + * mvx_log_drain_dmesg_construct() - Dmesg drain constructor. + * @drain: Pointer to drain. + * + * Return: 0 on success, else error code. + */ +int mvx_log_drain_dmesg_construct(struct mvx_log_drain *drain); + +/** + * mvx_log_drain_dmesg_destruct() - Dmesg drain destructor. + * @drain: Pointer to drain. + */ +void mvx_log_drain_dmesg_destruct(struct mvx_log_drain *drain); + +/** + * mvx_log_drain_add() - Add drain to log. + * @log: Pointer to log. + * @name: Name of drain. + * @drain: Pointer to drain. + * + * Return: 0 on success, else error code. + */ +int mvx_log_drain_add(struct mvx_log *log, + const char *name, + struct mvx_log_drain *drain); + +/** + * mvx_log_drain_ram_construct() - RAM drain constructor. + * @drain: Pointer to drain. + * @print: Print function pointer. + * @data: Data function pointer. + * @buffer_size: The size of the RAM drain buffer. + * + * Return: 0 on success, else error code. + */ +int mvx_log_drain_ram_construct(struct mvx_log_drain_ram *drain, + size_t buffer_size); + +/** + * mvx_log_drain_ram_destruct() - RAM drain destructor. + * @drain: Pointer to drain. + */ +void mvx_log_drain_ram_destruct(struct mvx_log_drain_ram *drain); + +/** + * mvx_log_drain_ram_add() - Derived function to add RAM drain to log. + * @log: Pointer to log. + * @name: Name of drain. + * @drain: Pointer to drain. + * + * Return: 0 on success, else error code. + */ +int mvx_log_drain_ram_add(struct mvx_log *log, + const char *name, + struct mvx_log_drain_ram *drain); + +#ifdef MVX_LOG_FTRACE_ENABLE + +/** + * mvx_log_drain_ftrace_construct() - Ftrace drain constructor. + * @drain: Pointer to drain. + * + * Return: 0 on success, else error code. + */ +int mvx_log_drain_ftrace_construct(struct mvx_log_drain *drain); + +/** + * mvx_log_drain_ftrace_destruct() - Ftrace drain destructor. + * @drain: Pointer to drain. + */ +void mvx_log_drain_ftrace_destruct(struct mvx_log_drain *drain); + +#endif /* MVX_LOG_FTRACE_ENABLE */ + +/**************************************************************************** + * Group + ****************************************************************************/ + +/** + * mvx_log_group_construct() - Group constructor. + * @group: Pointer to group. + * @tag: Name of the group, to be used in log messages. + * @severity: Minimum severity to output log message. + * @drain: Pointer to drain. + */ +void mvx_log_group_construct(struct mvx_log_group *group, + const char *tag, + const enum mvx_log_severity severity, + struct mvx_log_drain *drain); + +/** + * mvx_log_group_add() - Add a group with given name to log. + * @log: Pointer to log. + * @name: Name of group. + * @group: Pointer to group. + * + * Return: 0 on success, else error code. + */ +int mvx_log_group_add(struct mvx_log *log, + const char *name, + struct mvx_log_group *group); + +/** + * mvx_log_group_destruct() - Group destructor. + * @group: Pointer to group. + */ +void mvx_log_group_destruct(struct mvx_log_group *group); + +/** + * mvx_log_strrchr() - Find last occurrence of '/' in string. + * @s: Pointer to string. + * + * Return: Pointer to '/'+1, or pointer to begin of string. + */ +const char *mvx_log_strrchr(const char *s); + +#endif /* MVX_LOG_H */ diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_log_group.c b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_log_group.c new file mode 100755 index 000000000..5ccccd449 --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_log_group.c @@ -0,0 +1,168 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +/****************************************************************************** + * Includes + ******************************************************************************/ + +#include "mvx_log.h" + +/****************************************************************************** + * Private variables + ******************************************************************************/ + +static struct mvx_log log; + +static struct mvx_log_drain drain_dmesg_if; +static struct mvx_log_drain_ram drain_ram0_if; + +#ifdef MVX_LOG_FTRACE_ENABLE +static struct mvx_log_drain drain_ftrace_if; +#endif /* MVX_LOG_FTRACE_ENABLE */ + +struct mvx_log_group mvx_log_if; +struct mvx_log_group mvx_log_fwif_if; +struct mvx_log_group mvx_log_session_if; +struct mvx_log_group mvx_log_dev; + +/****************************************************************************** + * External interface + ******************************************************************************/ + +int mvx_log_group_init(const char *entry_name) +{ + int ret; + struct mvx_log_drain *drain_default = &drain_dmesg_if; + struct mvx_log_drain *drain_ram = &drain_ram0_if.base; + +#ifdef MVX_LOG_FTRACE_ENABLE + drain_default = &drain_ftrace_if; +#endif /* MVX_LOG_FTRACE_ENABLE */ + + /* Construct log object. */ + ret = mvx_log_construct(&log, entry_name); + if (ret != 0) + return ret; + + /* Construct drain objects and add them to log. */ + mvx_log_drain_dmesg_construct(&drain_dmesg_if); + ret = mvx_log_drain_add(&log, "dmesg", &drain_dmesg_if); + if (ret != 0) + goto delete_log_entry; + + mvx_log_drain_ram_construct(&drain_ram0_if, 64 * 1024); + ret = mvx_log_drain_ram_add(&log, "ram0", &drain_ram0_if); + if (ret != 0) + goto delete_dmesg_drain; + +#ifdef MVX_LOG_FTRACE_ENABLE + mvx_log_drain_ftrace_construct(&drain_ftrace_if); + mvx_log_drain_add(&log, "ftrace", &drain_ftrace_if); + if (ret != 0) + goto delete_ram_drain; + +#endif /* MVX_LOG_FTRACE_ENABLE */ + + /* Construct group objects. */ + mvx_log_group_construct(&mvx_log_if, "MVX if", MVX_LOG_WARNING, + drain_default); + ret = mvx_log_group_add(&log, "generic", &mvx_log_if); + if (ret != 0) + goto delete_ftrace_drain; + + mvx_log_group_construct(&mvx_log_fwif_if, "MVX fwif", MVX_LOG_INFO, + drain_ram); + ret = mvx_log_group_add(&log, "firmware_interface", + &mvx_log_fwif_if); + if (ret != 0) + goto delete_generic_group; + + mvx_log_group_construct(&mvx_log_session_if, "MVX session", + MVX_LOG_WARNING, + drain_default); + ret = mvx_log_group_add(&log, "session", + &mvx_log_session_if); + if (ret != 0) + goto delete_fwif_group; + + mvx_log_group_construct(&mvx_log_dev, "MVX dev", MVX_LOG_WARNING, + drain_default); + ret = mvx_log_group_add(&log, "dev", &mvx_log_dev); + if (ret != 0) + goto delete_session_group; + + return 0; + +delete_session_group: + mvx_log_group_destruct(&mvx_log_session_if); + +delete_fwif_group: + mvx_log_group_destruct(&mvx_log_fwif_if); + +delete_generic_group: + mvx_log_group_destruct(&mvx_log_if); + +delete_ftrace_drain: + +#ifdef MVX_LOG_FTRACE_ENABLE + mvx_log_drain_ftrace_destruct(&drain_ftrace_if); + +delete_ram_drain: +#endif /* MVX_LOG_FTRACE_ENABLE */ + + mvx_log_drain_ram_destruct(&drain_ram0_if); + +delete_dmesg_drain: + mvx_log_drain_dmesg_destruct(&drain_dmesg_if); + +delete_log_entry: + mvx_log_destruct(&log); + + return ret; +} + +void mvx_log_group_deinit(void) +{ + /* Destroy objects in reverse order. */ + mvx_log_group_destruct(&mvx_log_dev); + mvx_log_group_destruct(&mvx_log_session_if); + mvx_log_group_destruct(&mvx_log_fwif_if); + mvx_log_group_destruct(&mvx_log_if); + +#ifdef MVX_LOG_FTRACE_ENABLE + mvx_log_drain_ftrace_destruct(&drain_ftrace_if); +#endif /* MVX_LOG_FTRACE_ENABLE */ + + mvx_log_drain_ram_destruct(&drain_ram0_if); + mvx_log_drain_dmesg_destruct(&drain_dmesg_if); + + mvx_log_destruct(&log); +} diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_log_group.h b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_log_group.h new file mode 100755 index 000000000..49b1a2e2a --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_log_group.h @@ -0,0 +1,68 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef _MVX_LOG_GROUP_H_ +#define _MVX_LOG_GROUP_H_ + +/**************************************************************************** + * Includes + ****************************************************************************/ + +#include "mvx_log.h" + +/****************************************************************************** + * Prototypes + ******************************************************************************/ + +extern struct mvx_log_group mvx_log_if; +extern struct mvx_log_group mvx_log_fwif_if; +extern struct mvx_log_group mvx_log_session_if; +extern struct mvx_log_group mvx_log_dev; + +/**************************************************************************** + * Exported functions + ****************************************************************************/ + +/** + * mvx_log_group_init() - Initialize log module. This function must be called + * before any of the log groups is used. + * @entry_name: The name of the directory + * + * Return: 0 on success, else error code. + */ +int mvx_log_group_init(const char *entry_name); + +/** + * mvx_log_group_deinit() - Destroy log module. + */ +void mvx_log_group_deinit(void); + +#endif /* _MVX_LOG_GROUP_H_ */ diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_log_ram.h b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_log_ram.h new file mode 100755 index 000000000..1f0d95d39 --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_log_ram.h @@ -0,0 +1,212 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef MVX_LOG_RAM_H +#define MVX_LOG_RAM_H + +/****************************************************************************** + * Includes + ******************************************************************************/ + +#ifndef __KERNEL__ +#include +#include +#include +#else +#include +#include +#endif + +/****************************************************************************** + * Defines + ******************************************************************************/ + +/** + * Magic word "MVXL" that prefix all messages. + * + * Messages are stored in native byte order. The magic word can be used to + * detect if the log has been stored in the same byte order as the application + * unpacking the log is using. + */ +#define MVX_LOG_MAGIC 0x4d56584c + +/** + * The maximum message length. + */ +#define MVX_LOG_MESSAGE_LENGTH_MAX 4096 + +/****************************************************************************** + * Types + ******************************************************************************/ + +/** + * enum mvx_log_ioctl - IOCTL commands. + * @MVX_LOG_IOCTL_CLEAR: Clear the log. + */ +enum mvx_log_ioctl { + MVX_LOG_IOCTL_CLEAR +}; + +/** + * enum mvx_log_type - Message type. The definitions are assigned values that + * are not allowed to change. + */ +enum mvx_log_type { + MVX_LOG_TYPE_TEXT = 0, + MVX_LOG_TYPE_FWIF = 1, + MVX_LOG_TYPE_FW_BINARY = 2, + MVX_LOG_TYPE_MAX +}; + +/** + * struct mvx_log_timeval - Portable time value format. + * @sec: Seconds since 1970-01-01, Unix time epoch. + * @nsec: Nano seconds. + */ +struct mvx_log_timeval { + uint64_t sec; + uint64_t nsec; +} +__attribute__((packed)); + +/** + * struct mvx_log_header - Common header for all messages stored in RAM buffer. + * @magic: Magic word. + * @length: Length of message, excluding this header. + * @type: Message type. + * @severity: Message severity. + * @timestamp: Time stamp. + */ +struct mvx_log_header { + uint32_t magic; + uint16_t length; + uint8_t type; + uint8_t severity; + struct mvx_log_timeval timestamp; +} +__attribute__((packed)); + +/****************************************************************************** + * Text message + ******************************************************************************/ + +/** + * struct mvx_log_text - ASCII text message. + * @message[0]: ASCII text message. + * + * The message shall be header.length long and should end with a standard ASCII + * character. The parser of the log will add new line and null terminate + * the string. + */ +struct mvx_log_text { + char message[0]; +} +__attribute__((packed)); + +/****************************************************************************** + * Firmware interface + ******************************************************************************/ + +/** + * enum mvx_log_fwif_channel - Firmware interface message types. + */ +enum mvx_log_fwif_channel { + MVX_LOG_FWIF_CHANNEL_MESSAGE, + MVX_LOG_FWIF_CHANNEL_INPUT_BUFFER, + MVX_LOG_FWIF_CHANNEL_OUTPUT_BUFFER, + MVX_LOG_FWIF_CHANNEL_RPC +}; + +/** + * enum mvx_log_fwif_direction - Firmware interface message types. + */ +enum mvx_log_fwif_direction { + MVX_LOG_FWIF_DIRECTION_HOST_TO_FIRMWARE, + MVX_LOG_FWIF_DIRECTION_FIRMWARE_TO_HOST +}; + +/** + * enum mvx_log_fwif_code - Special message codes for message types not defined + * by the firmware interface. + */ +enum mvx_log_fwif_code { + MVX_LOG_FWIF_CODE_STAT = 16000 +}; + +/** + * struct mvx_log_fwif - Firmware interface header type. + * @version_minor: Protocol version. + * @version_major: Protocol version. + * @channel: @see enum mvx_log_fwif_channel. + * @direction: @see enum mvx_log_fwif_direction. + * @session: Session id. + * @data[0]: Data following the firmware interface message + * header. + */ +struct mvx_log_fwif { + uint8_t version_minor; + uint8_t version_major; + uint8_t channel; + uint8_t direction; + uint64_t session; + uint8_t data[0]; +} +__attribute__((packed)); + +/** + * struct mvx_log_fwif_stat - Firmware interface statistics. + * @handle: Buffer handle. + * @queued: Number of buffers currently queued to the firmware. + */ +struct mvx_log_fwif_stat { + uint64_t handle; + uint32_t queued; +} +__attribute__((packed)); + +/****************************************************************************** + * Firmware binary header + ******************************************************************************/ + +/** + * struct mvx_log_fw_binary - Firmware binary header. + * @session: Session id. + * @data[0]: Firmware binary, byte 0..length. + * + * The first ~100 bytes of the firmware binary contain information describing + * the codec. + */ +struct mvx_log_fw_binary { + uint64_t session; + uint8_t data[0]; +}; + +#endif /* MVX_LOG_RAM_H */ diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_lsid.c b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_lsid.c new file mode 100755 index 000000000..baa99468c --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_lsid.c @@ -0,0 +1,341 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +/**************************************************************************** + * Includes + ****************************************************************************/ + +#include +#include +#include "mvx_if.h" +#include "mvx_hwreg.h" +#include "mvx_lsid.h" +#include "mvx_log_group.h" +#include "mvx_session.h" + +/**************************************************************************** + * Private functions + ****************************************************************************/ + +static bool is_alloc(struct mvx_lsid *lsid) +{ + uint32_t alloc; + + alloc = mvx_hwreg_read_lsid(lsid->hwreg, lsid->lsid, + MVX_HWREG_ALLOC); + + return alloc != MVE_ALLOC_FREE; +} + +static uint32_t get_core_lsid(uint32_t reg, + unsigned int core) +{ + return (reg >> (MVE_CORELSID_LSID_BITS * core)) & + MVX_CORELSID_LSID_MASK; +} + +static uint32_t get_jobqueue_job(uint32_t reg, + unsigned int nr) +{ + return (reg >> (MVE_JOBQUEUE_JOB_BITS * nr)) & MVE_JOBQUEUE_JOB_MASK; +} + +static uint32_t set_jobqueue_job(uint32_t reg, + unsigned int nr, + uint32_t job) +{ + reg &= ~(MVE_JOBQUEUE_JOB_MASK << (nr * MVE_JOBQUEUE_JOB_BITS)); + reg |= job << (MVE_JOBQUEUE_JOB_BITS * nr); + return reg; +} + +static uint32_t get_jobqueue_lsid(uint32_t reg, + unsigned int nr) +{ + return (reg >> (MVE_JOBQUEUE_JOB_BITS * nr + MVE_JOBQUEUE_LSID_SHIFT)) & + MVE_JOBQUEUE_LSID_MASK; +} + +static uint32_t set_lsid_ncores(uint32_t reg, + unsigned int nr, + unsigned int lsid, + unsigned int ncores) +{ + reg &= ~(MVE_JOBQUEUE_JOB_MASK << (nr * MVE_JOBQUEUE_JOB_BITS)); + reg |= ((lsid << MVE_JOBQUEUE_LSID_SHIFT) | + ((ncores - 1) << MVE_JOBQUEUE_NCORES_SHIFT)) << + (nr * MVE_JOBQUEUE_JOB_BITS); + + return reg; +} + +/**************************************************************************** + * Exported functions + ****************************************************************************/ + +int mvx_lsid_construct(struct mvx_lsid *lsid, + struct device *dev, + struct mvx_hwreg *hwreg, + unsigned int id) +{ + lsid->dev = dev; + lsid->hwreg = hwreg; + lsid->session = NULL; + lsid->lsid = id; + + return 0; +} + +void mvx_lsid_destruct(struct mvx_lsid *lsid) +{} + +int mvx_lsid_map(struct mvx_lsid *lsid, + struct mvx_lsid_pcb *pcb) +{ + struct mvx_hwreg *hwreg = lsid->hwreg; + uint32_t alloc; + uint32_t busattr[4]; + int ret; + + /* Check that the LSID is not already allocated. */ + if (is_alloc(lsid)) { + MVX_LOG_PRINT(&mvx_log_dev, MVX_LOG_WARNING, + "Failed to map session to LSID. LSID already allocated. lsid=%u.", + lsid->lsid); + return -EFAULT; + } + + /* Allocate LSID. */ + alloc = pcb->nprot == 0 ? MVE_ALLOC_PROTECTED : MVE_ALLOC_NON_PROTECTED; + mvx_hwreg_write_lsid(hwreg, lsid->lsid, MVX_HWREG_ALLOC, alloc); + + mvx_hwreg_write_lsid(hwreg, lsid->lsid, MVX_HWREG_TERMINATE, 1); + do { + ret = mvx_hwreg_read_lsid(hwreg, lsid->lsid, + MVX_HWREG_TERMINATE); + } while (ret != 0); + + /* Configure number of cores to use and which to cores to disable. */ + mvx_hwreg_write_lsid(hwreg, lsid->lsid, MVX_HWREG_CTRL, + pcb->ctrl); + + /* Configure MMU L0 entry and flush MMU tables. */ + mvx_hwreg_write_lsid(hwreg, lsid->lsid, MVX_HWREG_MMU_CTRL, + pcb->mmu_ctrl); + mvx_hwreg_write_lsid(hwreg, lsid->lsid, MVX_HWREG_FLUSH_ALL, 0); + + if (of_property_read_u32_array(lsid->dev->of_node, "busattr", busattr, + ARRAY_SIZE(busattr))) { + MVX_LOG_PRINT(&mvx_log_dev, MVX_LOG_INFO, + "busattr in of_node is not available."); + + /* We apply default values in this case. */ + busattr[0] = 0; + busattr[1] = 0; + busattr[2] = 0x33; + busattr[3] = 0x33; + } else { + int i; + + for (i = 0; i < ARRAY_SIZE(busattr); i++) + MVX_LOG_PRINT(&mvx_log_dev, MVX_LOG_VERBOSE, + "busattr[%d] = 0x%x.", i, + busattr[i]); + } + + mvx_hwreg_write_lsid(hwreg, lsid->lsid, MVX_HWREG_BUSATTR_0, + busattr[0]); + mvx_hwreg_write_lsid(hwreg, lsid->lsid, MVX_HWREG_BUSATTR_1, + busattr[1]); + mvx_hwreg_write_lsid(hwreg, lsid->lsid, MVX_HWREG_BUSATTR_2, + busattr[2]); + mvx_hwreg_write_lsid(hwreg, lsid->lsid, MVX_HWREG_BUSATTR_3, + busattr[3]); + + /* Restore interrupt registers. */ + mvx_hwreg_write_lsid(hwreg, lsid->lsid, MVX_HWREG_IRQVE, 0); + mvx_hwreg_write_lsid(hwreg, lsid->lsid, MVX_HWREG_IRQHOST, + pcb->irqhost); + + /* + * Make sure all register writes have completed before scheduling is + * enabled. + */ + wmb(); + + /* Enable scheduling. */ + mvx_hwreg_write_lsid(hwreg, lsid->lsid, MVX_HWREG_SCHED, 1); + + return 0; +} + +void mvx_lsid_unmap(struct mvx_lsid *lsid, + struct mvx_lsid_pcb *pcb) +{ + struct mvx_hwreg *hwreg = lsid->hwreg; + + if (!is_alloc(lsid)) { + MVX_LOG_PRINT(&mvx_log_dev, MVX_LOG_WARNING, + "LSID was not allocated. lsid=%u.", + lsid->lsid); + return; + } + + /* Disable scheduling. */ + mvx_hwreg_write_lsid(hwreg, lsid->lsid, MVX_HWREG_SCHED, 0); + + /* Store registers in process control block. */ + pcb->ctrl = mvx_hwreg_read_lsid(hwreg, lsid->lsid, MVX_HWREG_CTRL); + pcb->mmu_ctrl = mvx_hwreg_read_lsid(hwreg, lsid->lsid, + MVX_HWREG_MMU_CTRL); + pcb->irqhost = mvx_hwreg_read_lsid(hwreg, lsid->lsid, + MVX_HWREG_IRQHOST); + pcb->nprot = mvx_hwreg_read_lsid(hwreg, lsid->lsid, MVX_HWREG_NPROT); + + /* Deallocate LSID. */ + mvx_hwreg_write_lsid(hwreg, lsid->lsid, MVX_HWREG_ALLOC, + MVE_ALLOC_FREE); +} + +int mvx_lsid_jobqueue_add(struct mvx_lsid *lsid, + unsigned int ncores) +{ + struct mvx_hwreg *hwreg = lsid->hwreg; + uint32_t jobqueue; + int i; + + /* Disable scheduling. */ + mvx_hwreg_write(hwreg, MVX_HWREG_ENABLE, 0); + + jobqueue = mvx_hwreg_read(hwreg, MVX_HWREG_JOBQUEUE); + + /* Search if the LSID is already in the job queue. */ + for (i = 0; i < MVE_JOBQUEUE_NJOBS; i++) + if (get_jobqueue_lsid(jobqueue, i) == lsid->lsid) + goto jobqueue_enable; + + /* Search for a free slot in the job queue. */ + for (i = 0; i < MVE_JOBQUEUE_NJOBS; i++) + if (get_jobqueue_lsid(jobqueue, i) == + MVE_JOBQUEUE_JOB_INVALID) { + jobqueue = set_lsid_ncores(jobqueue, i, lsid->lsid, + ncores); + mvx_hwreg_write(hwreg, MVX_HWREG_JOBQUEUE, jobqueue); + break; + } + +jobqueue_enable: + /* Reenable scheduling. */ + mvx_hwreg_write(hwreg, MVX_HWREG_ENABLE, 1); + + return i < MVE_JOBQUEUE_NJOBS ? 0 : -EAGAIN; +} + +void mvx_lsid_send_irq(struct mvx_lsid *lsid) +{ + struct mvx_hwreg *hwreg = lsid->hwreg; + + mvx_hwreg_write_lsid(hwreg, lsid->lsid, MVX_HWREG_IRQHOST, 1); +} + +void mvx_lsid_flush_mmu(struct mvx_lsid *lsid) +{ + struct mvx_hwreg *hwreg = lsid->hwreg; + + mvx_hwreg_write_lsid(hwreg, lsid->lsid, MVX_HWREG_FLUSH_ALL, 0); +} + +void mvx_lsid_terminate(struct mvx_lsid *lsid) +{ + struct mvx_hwreg *hwreg = lsid->hwreg; + uint32_t ret; + + mvx_hwreg_write_lsid(hwreg, lsid->lsid, MVX_HWREG_TERMINATE, 1); + + do { + ret = mvx_hwreg_read_lsid(hwreg, lsid->lsid, + MVX_HWREG_TERMINATE); + } while (ret != 0); +} + +void mvx_lsid_jobqueue_remove(struct mvx_lsid *lsid) +{ + struct mvx_hwreg *hwreg = lsid->hwreg; + uint32_t jobqueue; + int i; + int j; + + /* Disable scheduling. */ + mvx_hwreg_write(hwreg, MVX_HWREG_ENABLE, 0); + + jobqueue = mvx_hwreg_read(hwreg, MVX_HWREG_JOBQUEUE); + + /* Copy job entries that do not match the LSID to be removed. */ + for (i = 0, j = 0; i < MVE_JOBQUEUE_NJOBS; i++) + if (get_jobqueue_lsid(jobqueue, i) != lsid->lsid) + jobqueue = set_jobqueue_job( + jobqueue, j++, get_jobqueue_job(jobqueue, i)); + + /* Blank out remaining job entries. */ + for (; j < MVE_JOBQUEUE_NJOBS; j++) + jobqueue = set_lsid_ncores(jobqueue, i, + MVE_JOBQUEUE_JOB_INVALID, 0); + + mvx_hwreg_write(hwreg, MVX_HWREG_JOBQUEUE, jobqueue); + + /* Reenable scheduling. */ + mvx_hwreg_write(hwreg, MVX_HWREG_ENABLE, 1); +} + +bool mvx_lsid_idle(struct mvx_lsid *lsid) +{ + struct mvx_hwreg *hwreg = lsid->hwreg; + uint32_t jobqueue; + uint32_t corelsid; + uint32_t ncores; + uint32_t i; + + jobqueue = mvx_hwreg_read(hwreg, MVX_HWREG_JOBQUEUE); + corelsid = mvx_hwreg_read(hwreg, MVX_HWREG_CORELSID); + ncores = mvx_hwreg_read(hwreg, MVX_HWREG_NCORES); + + /* Check if LSID is found in job queue. */ + for (i = 0; i < MVE_JOBQUEUE_NJOBS; i++) + if (get_jobqueue_lsid(jobqueue, i) == lsid->lsid) + return false; + + /* Check if LSID is found in core lsid. */ + for (i = 0; i < ncores; i++) + if (get_core_lsid(corelsid, i) == lsid->lsid) + return false; + + return true; +} diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_lsid.h b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_lsid.h new file mode 100755 index 000000000..35245ea1b --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_lsid.h @@ -0,0 +1,166 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef _MVX_LSID_H_ +#define _MVX_LSID_H_ + +/**************************************************************************** + * Includes + ****************************************************************************/ + +#include + +/**************************************************************************** + * Defines + ****************************************************************************/ + +#define MVX_LSID_MAX 4 + +/**************************************************************************** + * Types + ****************************************************************************/ + +struct device; +struct mvx_hwreg; +struct mvx_sched_session; + +/** + * struct mvx_lsid_pcb - LSID process control block. + * + * This structure is used to store the register map when a session is unmapped + * from a LSID, so it can be restored again when the session is remapped. + */ +struct mvx_lsid_pcb { + uint32_t ctrl; + uint32_t mmu_ctrl; + uint32_t irqhost; + uint32_t nprot; +}; + +/** + * struct mvx_lsid - LSID class. + */ +struct mvx_lsid { + struct device *dev; + struct mvx_hwreg *hwreg; + struct mvx_sched_session *session; + unsigned int lsid; +}; + +/**************************************************************************** + * Exported functions + ****************************************************************************/ + +/** + * mvx_lsid_construct() - Construct the LSID object. + * @lsid: Pointer to LSID object. + * @dev: Pointer to device. + * @hwreg: Pointer to hwreg object. + * @id: LSID number. + * + * Return: 0 on success, else error code. + */ +int mvx_lsid_construct(struct mvx_lsid *lsid, + struct device *dev, + struct mvx_hwreg *hwreg, + unsigned int id); + +/** + * mvx_lsid_destruct() - Destruct the LSID object. + * @lsid: Pointer to LSID object. + */ +void mvx_lsid_destruct(struct mvx_lsid *lsid); + +/** + * mvx_lsid_map() - Map a session to this LSID. + * @lsid: Pointer to LSID object. + * @pcb: Process control block to be restored. + * + * Return: 0 on success, else error code. + */ +int mvx_lsid_map(struct mvx_lsid *lsid, + struct mvx_lsid_pcb *pcb); + +/** + * mvx_lsid_unmap() - Unmap session from LSID. + * @lsid: Pointer to LSID object. + * @pcb: Process control block where the registers are stored. + * + * A LSID must not be unmapped if it is present in the job queue or core LSID. + * It is the responsibility of the scheduler to guarantee that the LSID is idle + * before it is unmapped. + */ +void mvx_lsid_unmap(struct mvx_lsid *lsid, + struct mvx_lsid_pcb *pcb); + +/** + * mvx_lsid_jobqueue_add() - Add LSID to job queue. + * @lsid: Pointer to LSID object. + * @ncores: Number of cores to request. + * + * Return: 0 on success, else error code. + */ +int mvx_lsid_jobqueue_add(struct mvx_lsid *lsid, + unsigned int ncores); + +/** + * mvx_lsid_send_irq() - Send IRQ to firmware. + * @lsid: Pointer to LSID object. + */ +void mvx_lsid_send_irq(struct mvx_lsid *lsid); + +/** + * mvx_lsid_flush_mmu() - Flush MMU tables. + * @lsid: Pointer to LSID object. + */ +void mvx_lsid_flush_mmu(struct mvx_lsid *lsid); + +/** + * mvx_lsid_terminate() - Terminate the LSID. + * @lsid: Pointer to LSID object. + */ +void mvx_lsid_terminate(struct mvx_lsid *lsid); + +/** + * mvx_lsid_jobqueue_remove() - Remove LSID from job queue. + * @lsid: Pointer to LSID object. + */ +void mvx_lsid_jobqueue_remove(struct mvx_lsid *lsid); + +/** + * mvx_lsid_idle() - Check if LSID is idle. + * @lsid: Pointer to LSID object. + * + * Return: true if LSID is idle, else false. + */ +bool mvx_lsid_idle(struct mvx_lsid *lsid); + +#endif /* _MVX_LSID_H_ */ diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_mmu.c b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_mmu.c new file mode 100755 index 000000000..e3de36cc6 --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_mmu.c @@ -0,0 +1,1306 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +/**************************************************************************** + * Includes + ****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "mvx_mmu.h" +#include "mvx_log_group.h" + +/**************************************************************************** + * Defines + ****************************************************************************/ + +/* Number of bits for the physical address space. */ +#define MVE_PA_BITS 40 +#define MVE_PA_MASK GENMASK_ULL(MVE_PA_BITS - 1, 0) + +/* Number of bits for the virtual address space. */ +#define MVE_VA_BITS 32 +#define MVE_VA_MASK GENMASK(MVE_VA_BITS - 1, 0) + +/* Number of bits from the VA used to index a PTE in a page. */ +#define MVE_INDEX_SHIFT 10 +#define MVE_INDEX_SIZE (1 << MVE_INDEX_SHIFT) +#define MVE_INDEX_MASK GENMASK(MVE_INDEX_SHIFT - 1, 0) + +/* Access permission defines. */ +#define MVE_PTE_AP_SHIFT 0 +#define MVE_PTE_AP_BITS 2 +#define MVE_PTE_AP_MASK ((1 << MVE_PTE_AP_BITS) - 1) + +/* Physical address defines. */ +#define MVE_PTE_PHYSADDR_SHIFT 2 +#define MVE_PTE_PHYSADDR_BITS 28 +#define MVE_PTE_PHYSADDR_MASK ((1 << MVE_PTE_PHYSADDR_BITS) - 1) + +/* Attributes defines. */ +#define MVE_PTE_ATTR_SHIFT 30 +#define MVE_PTE_ATTR_BITS 2 +#define MVE_PTE_ATTR_MASK ((1 << MVE_PTE_ATTR_BITS) - 1) + +/* Number of levels for Page Table Walk. */ +#define MVE_PTW_LEVELS 2 + +/* + * A Linux physical page can be equal in size or larger than the MVE page size. + * This define calculates how many MVE pages that fit in one Linux page. + */ +#define MVX_PAGES_PER_PAGE (PAGE_SIZE / MVE_PAGE_SIZE) + +/**************************************************************************** + * Types + ****************************************************************************/ + +/** + * struct mvx_mmu_dma_buf - MVX DMA buffer. + * + * Adds a list head to keep track of DMA buffers. + */ +struct mvx_mmu_dma_buf { + struct list_head head; + struct dma_buf *dmabuf; +}; + +/**************************************************************************** + * Static functions + ****************************************************************************/ + +/** + * get_index() - Return the PTE index for a given level. + * @va: Virtual address. + * @level: Level (L1=0, L2=1). + * + * 22 12 0 + * +-------------------+-------------------+-----------------------+ + * | Level 1 | Level 2 | Page offset | + * +-------------------+-------------------+-----------------------+ + */ +static unsigned int get_index(const mvx_mmu_va va, + const unsigned int level) +{ + return (va >> (MVE_PAGE_SHIFT + (MVE_PTW_LEVELS - level - 1) * + MVE_INDEX_SHIFT)) & MVE_INDEX_MASK; +} + +/** + * get_offset() - Return the page offset. + * @va: Virtual address. + * + * 22 12 0 + * +-------------------+-------------------+-----------------------+ + * | Level 1 | Level 2 | Page offset | + * +-------------------+-------------------+-----------------------+ + */ +static unsigned int get_offset(const mvx_mmu_va va) +{ + return va & MVE_PAGE_MASK; +} + +/** + * get_pa() - Return physical address stored in PTE. + */ +static phys_addr_t get_pa(const mvx_mmu_pte pte) +{ + return (((phys_addr_t)pte >> MVE_PTE_PHYSADDR_SHIFT) & + MVE_PTE_PHYSADDR_MASK) << MVE_PAGE_SHIFT; +} + +/* LCOV_EXCL_START */ + +/** + * get_attr() - Return attributes stored in PTE. + */ +static enum mvx_mmu_attr get_attr(const mvx_mmu_pte pte) +{ + return (pte >> MVE_PTE_ATTR_SHIFT) & MVE_PTE_ATTR_MASK; +} + +/** + * get_ap() - Return access permissions stored in PTE. + */ +static enum mvx_mmu_access get_ap(const mvx_mmu_pte pte) +{ + return (pte >> MVE_PTE_AP_SHIFT) & MVE_PTE_AP_MASK; +} + +/* LCOV_EXCL_STOP */ + +/** + * ptw() - Perform Page Table Walk and return pointer to L2 PTE. + * @mmu: Pointer to MMU context. + * @va: Virtual address. + * @alloc: True if missing L2 page should be allocated. + * + * Return: Pointer to PTE, ERR_PTR on error. + */ +static mvx_mmu_pte *ptw(struct mvx_mmu *mmu, + mvx_mmu_va va, + bool alloc) +{ + phys_addr_t l2; + mvx_mmu_pte *pte = mmu->page_table; + unsigned int index; + + /* Level 1. */ + index = get_index(va, 0); + l2 = get_pa(pte[index]); + + /* We should never perform a page table walk for a protected page. */ + if (test_bit(index, mmu->l2_page_is_external) != 0) { + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "PTW virtual address to secure L2 page. va=0x%x.", + va); + return ERR_PTR(-EINVAL); + } + + /* Map in L2 page if it is missing. */ + if (l2 == 0) { + if (alloc == false) { + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "Missing L2 page in PTW. va=0x%x.", + va); + return ERR_PTR(-EFAULT); + } + + l2 = mvx_mmu_alloc_page(mmu->dev); + if (l2 == 0) { + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "Failed to allocate L2 page. va=0x%x.", + va); + return ERR_PTR(-ENOMEM); + } + + pte[index] = mvx_mmu_set_pte(MVX_ATTR_PRIVATE, l2, + MVX_ACCESS_READ_ONLY); + dma_sync_single_for_device(mmu->dev, + virt_to_phys(&pte[index]), + sizeof(pte[index]), DMA_TO_DEVICE); + } + + /* Level 2. */ + index = get_index(va, 1); + pte = phys_to_virt(l2); + + return &pte[index]; +} + +/** + * map_page() - Map physical- to virtual address. + * @mmu: Pointer to MMU context. + * @va: MVE virtual address to map. + * @pa: Linux kernel physical address to map. + * @attr: MMU attributes. + * @access: MMU access permissions. + * + * Create new L1 and L2 entries if necessary. If mapping already exist, then + * error is returned. + * + * Return: 0 on success, else error code. + */ +static int map_page(struct mvx_mmu *mmu, + mvx_mmu_va va, + phys_addr_t pa, + enum mvx_mmu_attr attr, + enum mvx_mmu_access access) +{ + mvx_mmu_pte *pte; + phys_addr_t page; + + /* Check that both VA and PA are page aligned. */ + if ((va | pa) & MVE_PAGE_MASK) { + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "VA and PA must be page aligned. va=0x%x, pa=0x%llx.", + va, pa); + return -EFAULT; + } + + /* Check that VA is within valid address range. */ + if (va & ~MVE_VA_MASK) { + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "VA out of valid range. va=0x%x.", + va); + return -EFAULT; + } + + /* Check that PA is within valid address range. */ + if (pa & ~MVE_PA_MASK) { + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "PA out of valid range. pa=0x%llx.", + pa); + return -EFAULT; + } + + pte = ptw(mmu, va, true); + if (IS_ERR(pte)) + return PTR_ERR(pte); + + /* Return error if page already exists. */ + page = get_pa(*pte); + if (page != 0) + return -EAGAIN; + + /* Map in physical address and flush data. */ + *pte = mvx_mmu_set_pte(attr, pa, access); + dma_sync_single_for_device(mmu->dev, virt_to_phys(pte), sizeof(*pte), + DMA_TO_DEVICE); + + return 0; +} + +/** + * unmap_page() - Unmap a page from the virtual address space. + * @mmu: Pointer to MMU context. + * @va: Virtual address. + */ +static void unmap_page(struct mvx_mmu *mmu, + mvx_mmu_va va) +{ + mvx_mmu_pte *pte; + + pte = ptw(mmu, va, false); + if (IS_ERR(pte)) + return; + + /* Unmap virtual address and flush data. */ + *pte = 0; + dma_sync_single_for_device(mmu->dev, virt_to_phys(pte), sizeof(*pte), + DMA_TO_DEVICE); +} + +/** + * remap_page() - Remap virtual address. + * @mmu: Pointer to MMU context. + * @va: MVE virtual address to map. + * @pa: Linux kernel physical address to map. + * @attr: MMU attributes. + * @access: MMU access permissions. + * + * Return: 0 on success, else error code. + */ +static int remap_page(struct mvx_mmu *mmu, + mvx_mmu_va va, + phys_addr_t pa, + enum mvx_mmu_attr attr, + enum mvx_mmu_access access) +{ + unmap_page(mmu, va); + return map_page(mmu, va, pa, attr, access); +} + +/** + * remap_pages() - Remap virtual address range. + * @pages: Pointer to pages object. + * @oldcount: Count before object was resized. + * + * Return: 0 on success, else error code. + */ +static int remap_pages(struct mvx_mmu_pages *pages, + size_t oldcount) +{ + int ret; + + if (pages->mmu == NULL) + return 0; + + /* Remap pages to no access if new count is smaller than old count. */ + while (pages->count < oldcount) { + oldcount--; + + ret = remap_page(pages->mmu, + pages->va + oldcount * MVE_PAGE_SIZE, + MVE_PAGE_SIZE, MVX_ATTR_PRIVATE, + MVX_ACCESS_NO); + if (ret != 0) + return ret; + } + + /* Map up pages if new count is larger than old count. */ + while (pages->count > oldcount) { + ret = remap_page(pages->mmu, + pages->va + oldcount * MVE_PAGE_SIZE, + pages->pages[oldcount], pages->attr, + pages->access); + if (ret != 0) + return ret; + + oldcount++; + } + + return 0; +} + +/** + * mapped_count() - Check if level 2 table entries point to mmu mapped pages. + * @pa: Physical address of the table entry to be checked. + * + * Return: the number of mapped pages found. + */ +static int mapped_count(phys_addr_t pa) +{ + int count = 0; + + if (pa != 0) { + int j; + phys_addr_t pa2; + mvx_mmu_pte *l2 = phys_to_virt(pa); + + for (j = 0; j < MVE_INDEX_SIZE; j++) { + pa2 = get_pa(l2[j]); + if (pa2 != 0 && pa2 != MVE_PAGE_SIZE) + count++; + } + } + + return count; +} + +/** + * get_sg_table_npages() - Count number of pages in SG table. + * @sgt: Pointer to scatter gather table. + * + * Return: Number of pages. + */ +static size_t get_sg_table_npages(struct sg_table *sgt) +{ + struct sg_page_iter piter; + size_t count = 0; + + for_each_sg_page(sgt->sgl, &piter, sgt->nents, 0) { + count++; + } + + return count; +} + +/** + * append_sg_table() - Append SG table to pages object. + * @pages: Pointer to pages object. + * @sgt: Pointer to scatter gather table. + * + * Return: 0 on success, else error code. + */ +static int append_sg_table(struct mvx_mmu_pages *pages, + struct sg_table *sgt) +{ + size_t count; + //struct sg_page_iter piter; + struct sg_dma_page_iter piter; + + count = get_sg_table_npages(sgt) * MVX_PAGES_PER_PAGE; + + if ((pages->count + count) > pages->capacity) { + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "Failed to append SG table. Pages capacity too small. count=%zu, capacity=%zu, append=%zu.", + pages->count, pages->capacity, count); + return -ENOMEM; + } +#if 0 + for_each_sg_page(sgt->sgl, &piter, sgt->nents, 0) { +#else + for_each_sg_dma_page(sgt->sgl, &piter, sgt->nents, 0) { +#endif + int j; + phys_addr_t base; + + base = (phys_addr_t)sg_page_iter_dma_address(&piter) & + PAGE_MASK; + + for (j = 0; j < MVX_PAGES_PER_PAGE; ++j) + pages->pages[pages->count++] = + base + j * MVE_PAGE_SIZE; + } + + return 0; +} + +/** + * stat_show() - Print debugfs info into seq-file. + * + * This is a callback used by debugfs subsystem. + * + * @s: Seq-file + * @v: Unused + * return: 0 on success, else error code. + */ +static int stat_show(struct seq_file *s, + void *v) +{ + struct mvx_mmu_pages *pages = s->private; + + seq_printf(s, "va: %08x\n", pages->va); + seq_printf(s, "capacity: %zu\n", pages->capacity); + seq_printf(s, "count: %zu\n", pages->count); + + if (pages->mmu != NULL) { + seq_printf(s, "attr: %d\n", pages->attr); + seq_printf(s, "access: %d\n", pages->access); + } + + return 0; +} + +/** + * stat_open() - Open debugfs file. + * + * This is a callback used by debugfs subsystem. + * + * @inode: Inode + * @file: File + * return: 0 on success, else error code. + */ +static int stat_open(struct inode *inode, + struct file *file) +{ + return single_open(file, stat_show, inode->i_private); +} + +/** + * File operations for debugfs entry. + */ +static const struct file_operations stat_fops = { + .open = stat_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release +}; + +/** + * pages_seq_start() - Iterator over pages list. + */ +static void *pages_seq_start(struct seq_file *s, + loff_t *pos) +{ + struct mvx_mmu_pages *pages = s->private; + + if (*pos >= pages->count) + return NULL; + + seq_puts(s, + "#Page: [ va_start - va_end] -> [ pa_start - pa_end]\n"); + return pos; +} + +/** + * pages_seq_start() - Iterator over pages list. + */ +static void *pages_seq_next(struct seq_file *s, + void *v, + loff_t *pos) +{ + struct mvx_mmu_pages *pages = s->private; + + ++*pos; + if (*pos >= pages->count) + return NULL; + + return pos; +} + +/** + * pages_seq_start() - Iterator over pages list. + */ +static void pages_seq_stop(struct seq_file *s, + void *v) +{} + +/** + * pages_seq_start() - Iterator over pages list. + */ +static int pages_seq_show(struct seq_file *s, + void *v) +{ + struct mvx_mmu_pages *pages = s->private; + loff_t pos = *(loff_t *)v; + + mvx_mmu_va va_start = pages->va + pos * MVE_PAGE_SIZE; + mvx_mmu_va va_end = va_start + MVE_PAGE_SIZE - 1; + phys_addr_t pa_start = pages->pages[pos]; + phys_addr_t pa_end = pa_start + MVE_PAGE_SIZE - 1; + + seq_printf(s, "%5llu: [0x%08x - 0x%08x] -> [%pap - %pap]\n", pos, + va_start, va_end, &pa_start, &pa_end); + return 0; +} + +/** + * mpages_seq_ops - Callbacks used by an iterator over pages list. + */ +static const struct seq_operations pages_seq_ops = { + .start = pages_seq_start, + .next = pages_seq_next, + .stop = pages_seq_stop, + .show = pages_seq_show +}; + +/** + * list_open() - Callback for debugfs entry. + */ +static int list_open(struct inode *inode, + struct file *file) +{ + int ret; + struct seq_file *s; + + ret = seq_open(file, &pages_seq_ops); + if (ret != 0) + return ret; + + s = (struct seq_file *)file->private_data; + s->private = inode->i_private; + + return 0; +} + +/** + * File operations for a debugfs entry. + */ +static const struct file_operations list_fops = { + .open = list_open, + .read = seq_read, + .llseek = seq_lseek, + .release = seq_release +}; + +/**************************************************************************** + * Exported functions + ****************************************************************************/ + +int mvx_mmu_construct(struct mvx_mmu *mmu, + struct device *dev) +{ + phys_addr_t page_table; + + mmu->dev = dev; + + /* Allocate Page Table Base (the L1 table). */ + page_table = mvx_mmu_alloc_page(dev); + if (page_table == 0) + return -ENOMEM; + + mmu->page_table = phys_to_virt(page_table); + + return 0; +} + +void mvx_mmu_destruct(struct mvx_mmu *mmu) +{ + mvx_mmu_pte *pte = mmu->page_table; + phys_addr_t pa; + int i; + int count = 0; + + for (i = 0; i < MVE_INDEX_SIZE; i++) { + pa = get_pa(pte[i]); + + /* Only free pages we have allocated ourselves. */ + if (test_bit(i, mmu->l2_page_is_external) == 0) { + count += mapped_count(pa); + mvx_mmu_free_page(mmu->dev, pa); + } + } + + pa = virt_to_phys(mmu->page_table); + mvx_mmu_free_page(mmu->dev, pa); + + WARN_ON(count > 0); +} + +phys_addr_t mvx_mmu_alloc_page(struct device *dev) +{ + struct page *page; + phys_addr_t pa; + dma_addr_t dma_handle; + + page = alloc_page(GFP_KERNEL | __GFP_ZERO | __GFP_NORETRY); + if (page == NULL) + return 0; + + dma_handle = dma_map_page(dev, page, 0, PAGE_SIZE, DMA_BIDIRECTIONAL); + if (dma_mapping_error(dev, dma_handle) != 0) { + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "Cannot map page to DMA address space. page=%p.", + page); + goto free_page; + } + + pa = (phys_addr_t)dma_handle; + + dma_sync_single_for_device(dev, pa, PAGE_SIZE, DMA_TO_DEVICE); + + return pa; + +free_page: + __free_page(page); + return 0; +} + +void mvx_mmu_free_contiguous_pages(struct device *dev, phys_addr_t pa, size_t npages) +{ + struct page *page; + + if (pa == 0) + return; + + page = phys_to_page(pa); + + dma_unmap_page(dev, pa, npages << PAGE_SHIFT, DMA_BIDIRECTIONAL); + __free_pages(page, get_order(npages << PAGE_SHIFT)); +} + +phys_addr_t mvx_mmu_alloc_contiguous_pages(struct device *dev, size_t npages) +{ + struct page *page; + phys_addr_t pa; + dma_addr_t dma_handle; + size_t size = (npages << PAGE_SHIFT); + + page = alloc_pages(GFP_KERNEL | __GFP_ZERO | __GFP_NORETRY, get_order(size)); + if (page == NULL) + return 0; + + dma_handle = dma_map_page(dev, page, 0, size, DMA_BIDIRECTIONAL); + if (dma_mapping_error(dev, dma_handle) != 0) { + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "Cannot map page to DMA address space. page=%p.", + page); + goto free_pages; + } + + pa = (phys_addr_t)dma_handle; + + dma_sync_single_for_device(dev, pa, size, DMA_TO_DEVICE); + + return pa; + +free_pages: + __free_pages(page, get_order(size)); + return 0; +} + +void mvx_mmu_free_page(struct device *dev, + phys_addr_t pa) +{ + struct page *page; + + if (pa == 0) + return; + + page = phys_to_page(pa); + + dma_unmap_page(dev, pa, PAGE_SIZE, DMA_BIDIRECTIONAL); + __free_page(page); +} + +struct mvx_mmu_pages *mvx_mmu_alloc_pages(struct device *dev, + size_t count, + size_t capacity) +{ + struct mvx_mmu_pages *pages; + int ret; + + count = roundup(count, MVX_PAGES_PER_PAGE); + capacity = roundup(capacity, MVX_PAGES_PER_PAGE); + capacity = max(count, capacity); + + pages = devm_kzalloc(dev, + sizeof(*pages) + sizeof(phys_addr_t) * capacity, + GFP_KERNEL); + if (pages == NULL) + return ERR_PTR(-ENOMEM); + + pages->dev = dev; + pages->capacity = capacity; + INIT_LIST_HEAD(&pages->dmabuf); + + for (pages->count = 0; pages->count < count; ) { + phys_addr_t page; + unsigned int i; + + /* + * Allocate a Linux page. It will typically be of the same size + * as the MVE page, but could also be larger. + */ + page = mvx_mmu_alloc_page(dev); + if (page == 0) { + ret = -ENOMEM; + goto release_pages; + } + + /* + * If the Linux page is larger than the MVE page, then + * we iterate and add physical addresses with an offset from + * the Linux page. + */ + for (i = 0; i < MVX_PAGES_PER_PAGE; i++) + pages->pages[pages->count++] = + page + i * MVE_PAGE_SIZE; + } + + return pages; + +release_pages: + mvx_mmu_free_pages(pages); + + return ERR_PTR(ret); +} + +struct mvx_mmu_pages *mvx_mmu_alloc_pages_sg(struct device *dev, + struct sg_table *sgt, + size_t capacity) +{ + struct mvx_mmu_pages *pages; + size_t count; + int ret; + + count = get_sg_table_npages(sgt) * MVX_PAGES_PER_PAGE; + capacity = roundup(capacity, MVX_PAGES_PER_PAGE); + capacity = max(count, capacity); + + pages = devm_kzalloc(dev, + sizeof(*pages) + sizeof(phys_addr_t) * capacity, + GFP_KERNEL); + if (pages == NULL) + return ERR_PTR(-ENOMEM); + + pages->dev = dev; + pages->capacity = capacity; + pages->is_external = true; + pages->offset = sgt->sgl != NULL ? sgt->sgl->offset : 0; + INIT_LIST_HEAD(&pages->dmabuf); + + ret = append_sg_table(pages, sgt); + if (ret != 0) { + devm_kfree(dev, pages); + return ERR_PTR(ret); + } + + return pages; +} + +struct mvx_mmu_pages *mvx_mmu_alloc_pages_dma_buf(struct device *dev, + struct dma_buf *dmabuf, + size_t capacity) +{ + struct mvx_mmu_pages *pages; + struct dma_buf_attachment *attach; + struct sg_table *sgt; + struct mvx_mmu_dma_buf *mbuf; + + attach = dma_buf_attach(dmabuf, dev); + if (IS_ERR(attach)) { + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "Failed to attach DMA buffer."); + return (struct mvx_mmu_pages *)attach; + } + + sgt = dma_buf_map_attachment(attach, DMA_BIDIRECTIONAL); + if (IS_ERR(sgt)) { + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "Failed to get SG table from DMA buffer."); + pages = (struct mvx_mmu_pages *)sgt; + goto detach; + } + + pages = mvx_mmu_alloc_pages_sg(dev, sgt, capacity); + if (IS_ERR(pages)) + goto unmap; + + mbuf = devm_kzalloc(dev, sizeof(*mbuf), GFP_KERNEL); + if (mbuf == NULL) { + mvx_mmu_free_pages(pages); + pages = ERR_PTR(-ENOMEM); + goto unmap; + } + + mbuf->dmabuf = dmabuf; + list_add_tail(&mbuf->head, &pages->dmabuf); + +unmap: + dma_buf_unmap_attachment(attach, sgt, DMA_BIDIRECTIONAL); + +detach: + dma_buf_detach(dmabuf, attach); + + return pages; +} + +int mvx_mmu_pages_append_dma_buf(struct mvx_mmu_pages *pages, + struct dma_buf *dmabuf) +{ + struct dma_buf_attachment *attach; + struct sg_table *sgt; + struct mvx_mmu_dma_buf *mbuf; + size_t oldcount = pages->count; + int ret; + + if (pages->is_external == false) { + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "Can't append DMA buffer to internal pages object."); + return -EINVAL; + } + + attach = dma_buf_attach(dmabuf, pages->dev); + if (IS_ERR(attach)) { + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "Failed to attach DMA buffer."); + return PTR_ERR(attach); + } + + sgt = dma_buf_map_attachment(attach, DMA_BIDIRECTIONAL); + if (IS_ERR(sgt)) { + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "Failed to get SG table from DMA buffer."); + ret = PTR_ERR(sgt); + goto detach; + } + + ret = append_sg_table(pages, sgt); + if (ret != 0) + goto unmap; + + ret = remap_pages(pages, oldcount); + if (ret != 0) + goto unmap; + + mbuf = devm_kzalloc(pages->dev, sizeof(*mbuf), GFP_KERNEL); + if (mbuf == NULL) { + ret = -ENOMEM; + goto unmap; + } + + mbuf->dmabuf = dmabuf; + list_add_tail(&mbuf->head, &pages->dmabuf); + +unmap: + dma_buf_unmap_attachment(attach, sgt, DMA_BIDIRECTIONAL); + +detach: + dma_buf_detach(dmabuf, attach); + + return ret; +} + +int mvx_mmu_resize_pages(struct mvx_mmu_pages *pages, + size_t npages) +{ + size_t oldcount = pages->count; + + if (pages->is_external != false) { + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "MMU with externally managed pages cannot be resized."); + return -EINVAL; + } + + npages = roundup(npages, MVX_PAGES_PER_PAGE); + + if (npages > pages->capacity) { + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "New MMU pages size is larger than capacity. npages=%zu, capacity=%zu.", + npages, pages->capacity); + return -ENOMEM; + } + + /* Free pages if npage is smaller than allocated pages. */ + while (pages->count > npages) { + pages->count--; + + if ((pages->count % MVX_PAGES_PER_PAGE) == 0) + mvx_mmu_free_page(pages->dev, + pages->pages[pages->count]); + + pages->pages[pages->count] = 0; + } + + /* Allocate pages if npage is larger than allocated pages. */ + while (pages->count < npages) { + phys_addr_t page; + unsigned int i; + + page = mvx_mmu_alloc_page(pages->dev); + if (page == 0) + return -ENOMEM; + + for (i = 0; i < MVX_PAGES_PER_PAGE; i++) + pages->pages[pages->count++] = + page + i * MVE_PAGE_SIZE; + } + + return remap_pages(pages, oldcount); +} + +void mvx_mmu_free_pages(struct mvx_mmu_pages *pages) +{ + struct mvx_mmu_dma_buf *mbuf; + struct mvx_mmu_dma_buf *tmp; + unsigned int i; + + mvx_mmu_unmap_pages(pages); + + if (pages->is_external == false) + for (i = 0; i < pages->count; i += MVX_PAGES_PER_PAGE) + mvx_mmu_free_page(pages->dev, pages->pages[i]); + + list_for_each_entry_safe(mbuf, tmp, &pages->dmabuf, head) { + dma_buf_put(mbuf->dmabuf); + devm_kfree(pages->dev, mbuf); + } + + devm_kfree(pages->dev, pages); +} + +size_t mvx_mmu_size_pages(struct mvx_mmu_pages *pages) +{ + return pages->count * MVE_PAGE_SIZE; +} + +int mvx_mmu_synch_pages(struct mvx_mmu_pages *pages, + enum dma_data_direction dir) +{ + size_t i; + + if (dir == DMA_FROM_DEVICE) { + for (i = 0; i < pages->count; i += MVX_PAGES_PER_PAGE) + dma_sync_single_for_cpu(pages->dev, pages->pages[i], + PAGE_SIZE, DMA_FROM_DEVICE); + } else if (dir == DMA_TO_DEVICE) { + for (i = 0; i < pages->count; i += MVX_PAGES_PER_PAGE) + dma_sync_single_for_device(pages->dev, pages->pages[i], + PAGE_SIZE, DMA_TO_DEVICE); + } else { + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "Unsupported MMU flush direction. dir=%u.", + dir); + return -EINVAL; + } + + return 0; +} + +int mvx_mmu_map_pages(struct mvx_mmu *mmu, + mvx_mmu_va va, + struct mvx_mmu_pages *pages, + enum mvx_mmu_attr attr, + enum mvx_mmu_access access) +{ + size_t i; + int ret; + + /* Map the allocated pages. */ + for (i = 0; i < pages->count; i++) { + ret = map_page(mmu, va + i * MVE_PAGE_SIZE, pages->pages[i], + attr, access); + if (ret != 0) + goto unmap_pages; + } + + /* + * Reserve the rest of the address range. Adding a dummy page with + * physical address 'PAGE_SIZE' should not lead to memory corruption, + * because the page is marked as 'no access'. + */ + for (; i < pages->capacity; i++) { + ret = map_page(mmu, va + i * MVE_PAGE_SIZE, MVE_PAGE_SIZE, + MVX_ATTR_PRIVATE, MVX_ACCESS_NO); + if (ret != 0) + goto unmap_pages; + } + + pages->mmu = mmu; + pages->va = va; + pages->attr = attr; + pages->access = access; + + return 0; + +unmap_pages: + while (i-- > 0) + unmap_page(mmu, va + i * MVE_PAGE_SIZE); + + return ret; +} + +void mvx_mmu_unmap_pages(struct mvx_mmu_pages *pages) +{ + size_t i; + + if (pages->mmu == NULL) + return; + + for (i = 0; i < pages->capacity; i++) + unmap_page(pages->mmu, pages->va + i * MVE_PAGE_SIZE); + + pages->mmu = NULL; + pages->va = 0; +} + +int mvx_mmu_map_pa(struct mvx_mmu *mmu, + mvx_mmu_va va, + phys_addr_t pa, + size_t size, + enum mvx_mmu_attr attr, + enum mvx_mmu_access access) +{ + int ret; + size_t offset; + + for (offset = 0; offset < size; offset += MVE_PAGE_SIZE) { + ret = map_page(mmu, va + offset, pa + offset, + attr, access); + if (ret != 0) + goto unmap_pages; + } + + return 0; + +unmap_pages: + /* Unroll mapped pages. */ + while (offset > 0) { + offset -= MVE_PAGE_SIZE; + unmap_page(mmu, va + offset); + } + + return ret; +} + +int mvx_mmu_map_l2(struct mvx_mmu *mmu, + mvx_mmu_va va, + phys_addr_t pa) +{ + phys_addr_t l2; + mvx_mmu_pte *pte = mmu->page_table; + unsigned int index; + + /* Level 1. */ + index = get_index(va, 0); + l2 = get_pa(pte[index]); + + if (l2 != 0) { + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_ERROR, + "Failed to map L2 page. Page already exists."); + return -EINVAL; + } + + set_bit(index, mmu->l2_page_is_external); + + pte[index] = mvx_mmu_set_pte(MVX_ATTR_PRIVATE, pa, + MVX_ACCESS_READ_ONLY); + dma_sync_single_for_device(mmu->dev, + virt_to_phys(&pte[index]), + sizeof(pte[index]), DMA_TO_DEVICE); + + return 0; +} + +void mvx_mmu_unmap_va(struct mvx_mmu *mmu, + mvx_mmu_va va, + size_t size) +{ + size_t offset; + + for (offset = 0; offset < size; offset += MVE_PAGE_SIZE) + unmap_page(mmu, va + offset); +} + +int mvx_mmu_va_to_pa(struct mvx_mmu *mmu, + mvx_mmu_va va, + phys_addr_t *pa) +{ + mvx_mmu_pte *pte; + phys_addr_t page; + + pte = ptw(mmu, va, false); + if (IS_ERR(pte)) + return PTR_ERR(pte); + + page = get_pa(*pte); + if (page == 0) + return -EFAULT; + + *pa = page | get_offset(va); + + return 0; +} + +/* LCOV_EXCL_START */ +int mvx_mmu_read(struct mvx_mmu *mmu, + mvx_mmu_va va, + void *data, + size_t size) +{ + mvx_mmu_va end = va + size; + + while (va < end) { + int ret; + size_t n; + phys_addr_t pa = 0; + void *src; + + /* Calculate number of bytes to be copied. */ + n = min(end - va, MVE_PAGE_SIZE - (va & MVE_PAGE_MASK)); + + /* Translate virtual- to physical address. */ + ret = mvx_mmu_va_to_pa(mmu, va, &pa); + if (ret != 0) + return ret; + + /* Invalidate the data range. */ + dma_sync_single_for_cpu(mmu->dev, pa, n, DMA_FROM_DEVICE); + + /* Convert from physical to Linux logical address. */ + src = phys_to_virt(pa); + memcpy(data, src, n); + + va += n; + data += n; + } + + return 0; +} + +/* LCOV_EXCL_STOP */ + +int mvx_mmu_write(struct mvx_mmu *mmu, + mvx_mmu_va va, + const void *data, + size_t size) +{ + mvx_mmu_va end = va + size; + + while (va < end) { + int ret; + size_t n; + phys_addr_t pa = 0; + void *dst; + + /* Calculate number of bytes to be copied. */ + n = min(end - va, MVE_PAGE_SIZE - (va & MVE_PAGE_MASK)); + + /* Translate virtual- to physical address. */ + ret = mvx_mmu_va_to_pa(mmu, va, &pa); + if (ret != 0) + return ret; + + /* Convert from physical to Linux logical address. */ + dst = phys_to_virt(pa); + memcpy(dst, data, n); + + /* Flush the data to memory. */ + dma_sync_single_for_device(mmu->dev, pa, n, DMA_TO_DEVICE); + + va += n; + data += n; + } + + return 0; +} + +mvx_mmu_pte mvx_mmu_set_pte(enum mvx_mmu_attr attr, + phys_addr_t pa, + enum mvx_mmu_access access) +{ + return (attr << MVE_PTE_ATTR_SHIFT) | + ((pa >> MVE_PAGE_SHIFT) << MVE_PTE_PHYSADDR_SHIFT) | + (access << MVE_PTE_AP_SHIFT); +} + +/* LCOV_EXCL_START */ +void mvx_mmu_print(struct mvx_mmu *mmu) +{ + unsigned int i; + mvx_mmu_pte *l1 = mmu->page_table; + + for (i = 0; i < MVE_INDEX_SIZE; i++) { + phys_addr_t pa = get_pa(l1[i]); + unsigned int j; + + if (pa != 0) { + mvx_mmu_pte *l2 = phys_to_virt(pa); + + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_INFO, + "%-4u: PA=0x%llx, ATTR=%u, ACC=%u", + i, pa, get_attr(l1[i]), get_ap(l1[i])); + + for (j = 0; j < MVE_INDEX_SIZE; j++) { + pa = get_pa(l2[j]); + if (pa != 0) { + mvx_mmu_va va; + + va = (i << (MVE_INDEX_SHIFT + + MVE_PAGE_SHIFT)) | + (j << MVE_PAGE_SHIFT); + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_INFO, + "|------ %-4u: VA=0x%08x, PA=0x%llx, ATTR=%u, ACC=%u", + j, + va, + pa, + get_attr(l2[j]), + get_ap(l2[j])); + } + } + } + } +} + +/* LCOV_EXCL_STOP */ + +int mvx_mmu_pages_debugfs_init(struct mvx_mmu_pages *pages, + char *name, + struct dentry *parent) +{ + struct dentry *dpages; + struct dentry *dentry; + + dpages = debugfs_create_dir(name, parent); + if (IS_ERR_OR_NULL(dpages)) + return -ENOMEM; + + dentry = debugfs_create_file("stat", 0400, dpages, pages, + &stat_fops); + if (IS_ERR_OR_NULL(dentry)) + return -ENOMEM; + + dentry = debugfs_create_file("list", 0400, dpages, pages, + &list_fops); + if (IS_ERR_OR_NULL(dentry)) + return -ENOMEM; + + return 0; +} diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_mmu.h b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_mmu.h new file mode 100755 index 000000000..8a0705a6d --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_mmu.h @@ -0,0 +1,451 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef _MVX_MMU_H_ +#define _MVX_MMU_H_ + +/**************************************************************************** + * Includes + ****************************************************************************/ + +#include +#include +#include + +/**************************************************************************** + * Defines + ****************************************************************************/ + +/* Page size in bits. 2^12 = 4kB. */ +#define MVE_PAGE_SHIFT 12 +#define MVE_PAGE_SIZE (1 << MVE_PAGE_SHIFT) +#define MVE_PAGE_MASK (MVE_PAGE_SIZE - 1) + +/* Number of page table entries per page. */ +#define MVE_PAGE_PTE_PER_PAGE (MVE_PAGE_SIZE / sizeof(mvx_mmu_pte)) + +/**************************************************************************** + * Types + ****************************************************************************/ + +struct device; +struct dma_buf; +struct mvx_mmu; +struct page; + +/** + * typedef mvx_mmu_va - 32 bit virtual address. + * + * This is the address the firmware/MVE will use. + */ +typedef uint32_t mvx_mmu_va; + +/** + * typedef mvx_mmu_pte - Page table entry. + * + * A PTE pointer should always point at a Linux kernel virtual address. + * + * AT - Attribute. + * PA - Physical address. + * AP - Access permission. + * + * 30 2 0 + * +---+-------------------------------------------------------+---+ + * | AT| PA 39:12 | AP| + * +---+-------------------------------------------------------+---+ + */ +typedef uint32_t mvx_mmu_pte; + +enum mvx_mmu_attr { + MVX_ATTR_PRIVATE = 0, + MVX_ATTR_REFFRAME = 1, + MVX_ATTR_SHARED_RO = 2, + MVX_ATTR_SHARED_RW = 3 +}; + +enum mvx_mmu_access { + MVX_ACCESS_NO = 0, + MVX_ACCESS_READ_ONLY = 1, + MVX_ACCESS_EXECUTABLE = 2, + MVX_ACCESS_READ_WRITE = 3 +}; + +/** + * struct mvx_mmu_pages - Structure used to allocate an array of pages. + * @dev: Pointer to device. + * @node: Hash table node. Used to keep track of allocated pages objects. + * @mmu: Pointer to MMU instance. + * @va: MVE virtual address. Set to 0 if objects is unmapped. + * @offset: Offset from mapped VA to where the data begins. + * @attr: Page table attributes. + * @access: Page table access. + * @capacity: Maximum number of MVE pages this object can hold. + * @count: Current number of allocated pages. + * @is_external:If the physical pages have been externally allocated. + * @dmabuf: List of DMA buffers. + * @pages: Array of pages. + */ +struct mvx_mmu_pages { + struct device *dev; + struct hlist_node node; + struct mvx_mmu *mmu; + mvx_mmu_va va; + size_t offset; + enum mvx_mmu_attr attr; + enum mvx_mmu_access access; + size_t capacity; + size_t count; + bool is_external; + struct list_head dmabuf; + phys_addr_t pages[0]; +}; + +/** + * struct mvx_mmu - MMU context. + * @dev: Pointer to device. + * @page_table: Virtual address to L1 page. + * @l2_page_is_external: Bitmap of which L2 pages that have been mapped + * externally. + */ +struct mvx_mmu { + struct device *dev; + mvx_mmu_pte *page_table; + DECLARE_BITMAP(l2_page_is_external, MVE_PAGE_PTE_PER_PAGE); +}; + +/**************************************************************************** + * Static functions + ****************************************************************************/ + +#ifndef phys_to_page + +/** + * phys_to_page() - Convert a physical address to a pointer to a page. + * @pa: Physical address. + * + * Return: Pointer to page struct. + */ +static inline struct page *phys_to_page(unsigned long pa) +{ + return pfn_to_page(__phys_to_pfn(pa)); +} + +#endif + +/**************************************************************************** + * Exported functions + ****************************************************************************/ + +/** + * mvx_mmu_construct() - Construct the MMU object. + * @mmu: Pointer to MMU object. + * @dev: Pointer to device. + * + * Return: 0 on success, else error code. + */ +int mvx_mmu_construct(struct mvx_mmu *mmu, + struct device *dev); + +/** + * mvx_mmu_destruct() - Destroy the MMU object. + * @mmu: Pointer to MMU object. + */ +void mvx_mmu_destruct(struct mvx_mmu *mmu); + +/** + * mvx_mmu_alloc_contiguous_pages() - Allocate contiguous pages. + * dev: Pointer to device. + * npages: Number of pages to allocate. + * Return: Physical page address on success, else 0. + */ +phys_addr_t mvx_mmu_alloc_contiguous_pages(struct device *dev, size_t npages); + +/* + * mvx_mmu_free_contiguous_pages() - Free contiguous pages. + * + * dev: Pointer to device. + * pa: Physical page address or 0. + * npages: Number of pages to free. + */ +void mvx_mmu_free_contiguous_pages(struct device *dev, phys_addr_t pa, size_t npages); + +/** + * mvx_mmu_alloc_page() - Allocate one page. + * dev: Pointer to device. + * + * Return: Physical page address on success, else 0. + */ +phys_addr_t mvx_mmu_alloc_page(struct device *dev); + +/* + * mvx_mmu_free_page() - Free one page. + * + * dev: Pointer to device. + * pa: Physical page address or 0. + */ +void mvx_mmu_free_page(struct device *dev, + phys_addr_t pa); + +/** + * mvx_mmu_alloc_pages() - Allocate array of pages. + * @dev: Pointer to device. + * @npages Number of pages to allocate. + * @capacity: Maximum number of pages this allocation can be resized + * to. If this value is 0 or smaller than npages, then it will be + * set to npages. + * + * Pages are not guaranteed to be physically continuous. + * + * Return: Valid pointer on success, else ERR_PTR. + */ +struct mvx_mmu_pages *mvx_mmu_alloc_pages(struct device *dev, + size_t npages, + size_t capacity); + +/** + * mvx_mmu_alloc_pages_sg() - Allocate array of pages from SG table. + * @dev: Pointer to device. + * @sgt: Scatter-gatter table with pre-allocated memory pages. + * @capacity: Maximum number of pages this allocation can be resized + * to. If this value is 0 or smaller than number of pages + * in scatter gather table, then it will be rounded up to + * to SG table size. + * + * Pages are not guaranteed to be physically continuous. + * + * Return: Valid pointer on success, else ERR_PTR. + */ +struct mvx_mmu_pages *mvx_mmu_alloc_pages_sg(struct device *dev, + struct sg_table *sgt, + size_t capacity); + +/** + * mvx_mmu_alloc_pages_dma_buf() - Allocate pages object from DMA buffer. + * @dev: Pointer to device. + * @dma_buf: Pointer to DMA buffer. + * @capacity: Maximum number of pages this allocation can be resized + * to. If this value is 0 or smaller than number of pages + * in DMA buffer, then it will be rounded up to DMA buffer + * size. + * + * The pages object will take ownership of the DMA buffer and call + * dma_put_buf() when the pages object is destructed. + * + * Return: Valid pointer on success, else ERR_PTR. + */ +struct mvx_mmu_pages *mvx_mmu_alloc_pages_dma_buf(struct device *dev, + struct dma_buf *dmabuf, + size_t capacity); + +/** + * mvx_mmu_pages_append_dma_buf() - Append DMA buffer to pages object. + * @pages: Pointer to pages object. + * @dma_buf: Pointer to DMA buffer. + * + * Return: 0 on success, else error code. + */ +int mvx_mmu_pages_append_dma_buf(struct mvx_mmu_pages *pages, + struct dma_buf *dmabuf); + +/** + * mvx_mmu_resize_pages() - Resize the page allocation. + * @pages: Pointer to pages object. + * @npages: Number of pages to allocate. + * + * If the number of pages is smaller, then pages will be freed. + * + * If the number of pages is larger, then additional memory will be allocated. + * The already allocates pages will keep their physical addresses. + * + * Return: 0 on success, else error code. + */ +int mvx_mmu_resize_pages(struct mvx_mmu_pages *pages, + size_t npages); + +/** + * mvx_mmu_free_pages() - Free pages. + * @pages: Pointer to pages object. + */ +void mvx_mmu_free_pages(struct mvx_mmu_pages *pages); + +/** + * mvx_mmu_size_pages() - Get number of allocated bytes. + * @pages: Pointer to pages object. + * + * Return: Size in bytes of pages. + */ +size_t mvx_mmu_size_pages(struct mvx_mmu_pages *pages); + +/** + * mvx_buffer_synch() - Synch data caches. + * @pages: Pointer to pages object. + * @dir: Which direction to synch. + * + * Return: 0 on success, else error code. + */ +int mvx_mmu_synch_pages(struct mvx_mmu_pages *pages, + enum dma_data_direction dir); + +/** + * mvx_mmu_map_pages() - Map an array of pages to a virtual address. + * @mmu: Pointer to MMU object. + * @va: Virtual address. + * @pages: Pointer to pages object. + * @attr: Bus attributes. + * @access: Access permission. + * + * Return: 0 on success, else error code. + */ +int mvx_mmu_map_pages(struct mvx_mmu *mmu, + mvx_mmu_va va, + struct mvx_mmu_pages *pages, + enum mvx_mmu_attr attr, + enum mvx_mmu_access access); + +/** + * mvx_mmu_unmap_pages() - Unmap pages object. + * @pages: Pointer to pages object. + */ +void mvx_mmu_unmap_pages(struct mvx_mmu_pages *pages); + +/** + * mvx_mmu_map_pa() - Map a physical- to a virtual address. + * @mmu: Pointer to MMU object. + * @va: Virtual address. + * @pa: Physical address. + * @size: Size of area to map. + * @attr: Bus attributes. + * @access: Access permission. + * + * Both the VA and PA must be page aligned. + * + * Return: 0 on success, else error code. + */ +int mvx_mmu_map_pa(struct mvx_mmu *mmu, + mvx_mmu_va va, + phys_addr_t pa, + size_t size, + enum mvx_mmu_attr attr, + enum mvx_mmu_access access); + +/** + * mvx_mmu_map_l2() - Map a L2 page. + * @mmu: Pointer to MMU object. + * @va: Virtual address. + * @pa: Physical address. + * + * Return: 0 on success, else error code. + */ +int mvx_mmu_map_l2(struct mvx_mmu *mmu, + mvx_mmu_va va, + phys_addr_t pa); + +/** + * mvx_mmu_unmap_va() - Unmap a virtual address range. + * @mmu: Pointer to MMU object. + * @va: Virtual address. + * @size: Size of area to unmap. + */ +void mvx_mmu_unmap_va(struct mvx_mmu *mmu, + mvx_mmu_va va, + size_t size); + +/** + * mvx_mmu_va_to_pa() - Map a virtual- to a physical address. + * @mmu: Pointer to MMU object. + * @va: Virtual address. + * @pa: Pointer to physical address. + * + * Return: 0 on success, else error code. + */ +int mvx_mmu_va_to_pa(struct mvx_mmu *mmu, + mvx_mmu_va va, + phys_addr_t *pa); + +/** + * mvx_mmu_read() - Read size bytes from virtual address. + * @mmu: Pointer to MMU object. + * @va: Source virtual address. + * @data: Pointer to destination data. + * @size: Number of bytes to copy. + * + * Return: 0 on success, else error code. + */ +int mvx_mmu_read(struct mvx_mmu *mmu, + mvx_mmu_va va, + void *data, + size_t size); + +/** + * mvx_mmu_write() - Write size bytes to virtual address. + * @mmu: Pointer to MMU object. + * @va: Destination virtual address. + * @data: Pointer to source data. + * @size: Number of bytes to copy. + * + * Return: 0 on success, else error code. + */ +int mvx_mmu_write(struct mvx_mmu *mmu, + mvx_mmu_va va, + const void *data, + size_t size); + +/** + * mvx_mmu_set_pte() - Construct PTE and return PTE value. + * @attr: Bus attributes. + * @pa: Physical address. + * @access: Access permission. + * + * Return: Page table entry. + */ +mvx_mmu_pte mvx_mmu_set_pte(enum mvx_mmu_attr attr, + phys_addr_t pa, + enum mvx_mmu_access access); + +/** + * mvx_mmu_print() - Print the MMU table. + * @mmu: Pointer to MMU object. + */ +void mvx_mmu_print(struct mvx_mmu *mmu); + +/** + * mvx_mmu_pages_debugfs_init() - Init debugfs entry. + * @pages: Pointer to MMU pages. + * @name: Name of debugfs entry. + * @parent: Parent debugfs entry. + * + * Return: 0 on success, else error code. + */ +int mvx_mmu_pages_debugfs_init(struct mvx_mmu_pages *pages, + char *name, + struct dentry *parent); + +#endif /* _MVX_MMU_H_ */ diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_pm_runtime.c b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_pm_runtime.c new file mode 100755 index 000000000..80c513e78 --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_pm_runtime.c @@ -0,0 +1,65 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include +#include "mvx_log_group.h" + +int mvx_pm_runtime_get_sync(struct device *dev) +{ +#ifdef ENABLE_PM_CLK + int ret; + + ret = pm_runtime_get_sync(dev); + if (ret < 0) + MVX_LOG_PRINT(&mvx_log_dev, MVX_LOG_WARNING, + "PM runtime get sync failed! ret=%d", ret); + + return ret; +#else /* !CONFIG_PM */ + return 1; +#endif /* CONFIG_PM */ +} + +int mvx_pm_runtime_put_sync(struct device *dev) +{ +#ifdef ENABLE_PM_CLK + int ret; + + ret = pm_runtime_put_sync(dev); + if (ret < 0) + MVX_LOG_PRINT(&mvx_log_dev, MVX_LOG_WARNING, + "PM runtime put sync failed! ret=%d", ret); + + return ret; +#else /* !CONFIG_PM */ + return 0; +#endif /* CONFIG_PM */ +} diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_pm_runtime.h b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_pm_runtime.h new file mode 100755 index 000000000..17da61a12 --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_pm_runtime.h @@ -0,0 +1,67 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef _MVX_PM_RUNTIME_H_ +#define _MVX_PM_RUNTIME_H_ + +/**************************************************************************** + * Types + ****************************************************************************/ + +struct device; + +/**************************************************************************** + * Exported functions + ****************************************************************************/ + +/** + * mvx_pm_runtime_get_sync() - The same function as pm_runtime_get_sync(), but + * with the addon that it prints a log line when + * error happens. + * @dev: Pointer to device. + * + * Return: 0 on success, 1 if already 'active', else error code. + */ +int mvx_pm_runtime_get_sync(struct device *dev); + +/** + * mvx_pm_runtime_put_sync() - The same function as pm_runtime_put_sync(), but + * with the addon that it prints a log line when + * error happens. + * It will not return error if CONFIG_PM is + * undefined. + * @dev: Pointer to device. + * + * Return: 0 on success, 1 if already 'suspended', else error code. + */ +int mvx_pm_runtime_put_sync(struct device *dev); + +#endif /* _MVX_PM_RUNTIME_H_ */ diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_scheduler.c b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_scheduler.c new file mode 100755 index 000000000..cc14c210a --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_scheduler.c @@ -0,0 +1,723 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +/**************************************************************************** + * Includes + ****************************************************************************/ + +#include +#include +#include +#include +#include "mvx_if.h" +#include "mvx_hwreg.h" +#include "mvx_mmu.h" +#include "mvx_scheduler.h" +#include "mvx_session.h" +#include "mvx_seq.h" +#include "mvx_pm_runtime.h" +#include "mvx_log_group.h" + +/**************************************************************************** + * Static functions + ****************************************************************************/ + +static struct mvx_lsid *find_free_lsid(struct mvx_sched *sched) +{ + unsigned int i; + + for (i = 0; i < sched->nlsid; i++) + if (sched->lsid[i].session == NULL) + return &sched->lsid[i]; + + return NULL; +} + +static struct mvx_lsid *find_idle_lsid(struct mvx_sched *sched) +{ + unsigned int i; + + for (i = 0; i < sched->nlsid; i++) { + bool idle; + + idle = mvx_lsid_idle(&sched->lsid[i]); + if (idle != false) + return &sched->lsid[i]; + } + + return NULL; +} + +static int map_session(struct mvx_sched *sched, + struct mvx_sched_session *session, + struct mvx_lsid *lsid) +{ + int ret; + + MVX_LOG_PRINT(&mvx_log_dev, MVX_LOG_INFO, + "%p Map LSID. lsid=%u, jobqueue=%08x, corelsid=%08x.", + mvx_if_session_to_session(session->isession), + lsid->lsid, + mvx_hwreg_read(sched->hwreg, MVX_HWREG_JOBQUEUE), + mvx_hwreg_read(sched->hwreg, MVX_HWREG_CORELSID)); + + ret = mvx_lsid_map(lsid, &session->pcb); + if (ret != 0) + return ret; + + session->lsid = lsid; + lsid->session = session; + + return 0; +} + +static void unmap_session(struct mvx_sched *sched, + struct mvx_sched_session *session) +{ + struct mvx_lsid *lsid = session->lsid; + + if (lsid == NULL) + return; + + MVX_LOG_PRINT(&mvx_log_dev, MVX_LOG_INFO, + "%p Unmap LSID. lsid=%u, jobqueue=%08x, corelsid=%08x.", + mvx_if_session_to_session(session->isession), + lsid->lsid, + mvx_hwreg_read(sched->hwreg, MVX_HWREG_JOBQUEUE), + mvx_hwreg_read(sched->hwreg, MVX_HWREG_CORELSID)); + + mvx_lsid_unmap(lsid, &session->pcb); + session->lsid = NULL; + lsid->session = NULL; +} + +static struct list_head *list_find_node(struct list_head *list, + struct list_head *node) +{ + struct list_head *i; + + list_for_each(i, list) { + if (i == node) + return i; + } + + return NULL; +} + +/** + * pending list is only updated when sched is locked. + * a session can only be added once + * + * notify_list = [] + * lock_sched + * for pending in pending_list: + * if is_mapped(pending): + * jobqueue.add(pending) + * pending_list.remove(pending) + * continue + * + * l = free_lsid + * if l is Nul: + * l = idle_lsid + * if l is Nul: + * break + * if is_mapped(l): + * s = session[l] + * unmap(s) + * notify_list.add(s) + * + * map(pending) + * jobqueue.add(pending) + * pending_list.remove(pending) + * unlock_sched + * + * for s in notify_list: + * session_notify(s) + * notify_list.remove(s) + */ +static void sched_task(struct work_struct *ws) +{ + struct mvx_sched *sched = + container_of(ws, struct mvx_sched, sched_task); + struct mvx_sched_session *pending; + struct mvx_sched_session *unmapped; + struct mvx_sched_session *tmp; + LIST_HEAD(notify_list); + int ret; + + mvx_pm_runtime_get_sync(sched->dev); + ret = mutex_lock_interruptible(&sched->mutex); + if (ret != 0) { + mvx_pm_runtime_put_sync(sched->dev); + return; + } + + /* + * Try to map sessions from pending queue while possible. + */ + list_for_each_entry_safe(pending, tmp, &sched->pending, pending) { + struct mvx_lsid *lsid; + + /* + * This session is already mapped to LSID. + * Just make sure it is scheduled. + */ + if (pending->lsid != NULL) { + ret = mvx_lsid_jobqueue_add(pending->lsid, + pending->isession->ncores); + if (ret != 0) { + MVX_LOG_PRINT(&mvx_log_dev, MVX_LOG_WARNING, + "Cannot add pending session to job queue. csession=%p, mvx_session=%p", + pending, + mvx_if_session_to_session( + pending->isession)); + continue; + } + + pending->in_pending = false; + list_del(&pending->pending); + continue; + } + + /* Find LSID to be used for the pending session. */ + lsid = find_free_lsid(sched); + if (lsid == NULL) + lsid = find_idle_lsid(sched); + + if (lsid == NULL) + break; + + /* + * This LSID was mapped to some session. We have to notify + * the session about an irq in case there are messages in + * a message queue. + * + * Notifications are done after pending list is processed. + */ + if (lsid->session != NULL) { + struct mvx_sched_session *unmapped = lsid->session; + + unmap_session(sched, unmapped); + + /* + * If the reference count is 0, then the session is + * about to be removed and should be ignored. + */ + ret = kref_get_unless_zero(&unmapped->isession->kref); + if (ret != 0) { + if (list_find_node(¬ify_list, + &unmapped->notify)) + /* + * Consider a situation when a session + * that was unmapped from LSID and added + * notify_list was also present in the + * pending_list. It is possible that + * such a session will be mapped to the + * new LSID, executed by the hardware + * and switched to idle state while + * this function is still looping + * through pending list. + * + * If it happens, then this session + * might be unmapped again in order to + * make a room for another pending + * session. As a result we will try to + * add this session to notify_list + * again. This will break notify list + * and could lead to crashes or hangs. + * + * However, it is safe just to skip + * adding the session to notify_list if + * it is already there, because it will + * be processed anyway. + */ + kref_put(&unmapped->isession->kref, + unmapped->isession->release); + else + list_add_tail(&unmapped->notify, + ¬ify_list); + } else { + MVX_LOG_PRINT(&mvx_log_dev, MVX_LOG_WARNING, + "Ref is zero. csession=%p", + unmapped); + } + } + + ret = map_session(sched, pending, lsid); + if (ret != 0) { + MVX_LOG_PRINT(&mvx_log_dev, MVX_LOG_WARNING, + "Cannot map pending session. csession=%p, mvx_session=%p", + pending, + mvx_if_session_to_session( + pending->isession)); + break; + } + + ret = mvx_lsid_jobqueue_add(lsid, pending->isession->ncores); + if (ret != 0) { + MVX_LOG_PRINT(&mvx_log_dev, MVX_LOG_WARNING, + "Cannot add pending session to job queue. csession=%p, mvx_session=%p", + pending, + mvx_if_session_to_session( + pending->isession)); + continue; + } + + pending->in_pending = false; + list_del(&pending->pending); + } + + /* + * It is important that the scheduler mutex is released before the + * callbacks to the if-module are invoked. The if-module may issue + * requests to the dev-module (for example switch_in()) that would + * otherwise deadlock. + */ + mutex_unlock(&sched->mutex); + + list_for_each_entry_safe(unmapped, tmp, ¬ify_list, notify) { + struct mvx_if_session *iunmapped = unmapped->isession; + + list_del(&unmapped->notify); + + mutex_lock(iunmapped->mutex); + sched->if_ops->irq(iunmapped); + ret = kref_put(&iunmapped->kref, iunmapped->release); + if (ret == 0) + mutex_unlock(iunmapped->mutex); + } + + mvx_pm_runtime_put_sync(sched->dev); +} + +static void sched_session_print(struct seq_file *s, + struct mvx_sched_session *session, + struct mvx_hwreg *hwreg, + int ind) +{ + struct mvx_lsid *lsid; + + if (session == NULL) + return; + + mvx_seq_printf(s, "Client session", ind, "%p\n", session->isession); + mvx_seq_printf(s, "Dev session", ind, "%p\n", session); + mvx_seq_printf(s, "MVX session", ind, "%p\n", + mvx_if_session_to_session(session->isession)); + + lsid = session->lsid; + if (lsid == NULL) + return; + + mvx_seq_printf(s, "IRQ host", ind, "%d\n", + mvx_hwreg_read_lsid(hwreg, lsid->lsid, + MVX_HWREG_IRQHOST)); + mvx_seq_printf(s, "IRQ MVE", ind, "%d\n", + mvx_hwreg_read_lsid(hwreg, lsid->lsid, + MVX_HWREG_IRQVE)); +} + +static int sched_show(struct seq_file *s, + void *v) +{ + struct mvx_sched *sched = (struct mvx_sched *)s->private; + struct mvx_hwreg *hwreg = sched->hwreg; + struct mvx_sched_session *session; + int i; + int ret; + + ret = mvx_pm_runtime_get_sync(hwreg->dev); + if (ret < 0) + return 0; + + ret = mutex_lock_interruptible(&sched->mutex); + if (ret != 0) { + mvx_pm_runtime_put_sync(hwreg->dev); + return ret; + } + + mvx_seq_printf(s, "Core LSID", 0, "%08x\n", + mvx_hwreg_read(hwreg, MVX_HWREG_CORELSID)); + mvx_seq_printf(s, "Job queue", 0, "%08x\n", + mvx_hwreg_read(hwreg, MVX_HWREG_JOBQUEUE)); + seq_puts(s, "\n"); + + seq_puts(s, "scheduled:\n"); + for (i = 0; i < sched->nlsid; ++i) { + mvx_seq_printf(s, "LSID", 1, "%d\n", i); + session = sched->lsid[i].session; + sched_session_print(s, session, hwreg, 2); + } + + seq_puts(s, "pending:\n"); + i = 0; + list_for_each_entry(session, &sched->pending, pending) { + char tmp[10]; + + scnprintf(tmp, sizeof(tmp), "%d", i++); + mvx_seq_printf(s, tmp, 1, "\n"); + sched_session_print(s, session, hwreg, 2); + } + + mutex_unlock(&sched->mutex); + mvx_pm_runtime_put_sync(hwreg->dev); + + return 0; +} + +static int sched_open(struct inode *inode, + struct file *file) +{ + return single_open(file, sched_show, inode->i_private); +} + +static const struct file_operations sched_fops = { + .open = sched_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release +}; + +int sched_debugfs_init(struct mvx_sched *sched, + struct dentry *parent) +{ + struct dentry *dentry; + + dentry = debugfs_create_file("sched", 0400, parent, sched, + &sched_fops); + if (IS_ERR_OR_NULL(dentry)) + return -ENOMEM; + + return 0; +} + +/**************************************************************************** + * Exported functions + ****************************************************************************/ + +int mvx_sched_construct(struct mvx_sched *sched, + struct device *dev, + struct mvx_if_ops *if_ops, + struct mvx_hwreg *hwreg, + struct dentry *parent) +{ + unsigned int lsid; + int ret; + + sched->dev = dev; + sched->hwreg = hwreg; + sched->if_ops = if_ops; + mutex_init(&sched->mutex); + INIT_LIST_HEAD(&sched->pending); + INIT_WORK(&sched->sched_task, sched_task); + sched->sched_queue = create_singlethread_workqueue("mvx_sched"); + if (!sched->sched_queue) { + MVX_LOG_PRINT(&mvx_log_dev, MVX_LOG_WARNING, + "Cannot create work queue"); + return -EINVAL; + } + + sched->nlsid = mvx_hwreg_read(hwreg, MVX_HWREG_NLSID); + + for (lsid = 0; lsid < sched->nlsid; lsid++) { + ret = mvx_lsid_construct(&sched->lsid[lsid], dev, hwreg, lsid); + if (ret != 0) + goto destruct_lsid; + } + + if (IS_ENABLED(CONFIG_DEBUG_FS)) { + ret = sched_debugfs_init(sched, parent); + if (ret != 0) + goto destruct_lsid; + } + + mvx_hwreg_write(hwreg, MVX_HWREG_RESET, 1); + mvx_hwreg_write(hwreg, MVX_HWREG_CLKFORCE, 0); + + return 0; + +destruct_lsid: + while (lsid-- > 0) + mvx_lsid_destruct(&sched->lsid[lsid]); + + return ret; +} + +void mvx_sched_destruct(struct mvx_sched *sched) +{ + destroy_workqueue(sched->sched_queue); + + while (sched->nlsid-- > 0) + mvx_lsid_destruct(&sched->lsid[sched->nlsid]); +} + +int mvx_sched_session_construct(struct mvx_sched_session *session, + struct mvx_if_session *isession) +{ + uint32_t disallow; + uint32_t maxcores; + + session->isession = isession; + INIT_LIST_HEAD(&session->pending); + INIT_LIST_HEAD(&session->notify); + session->lsid = NULL; + session->in_pending = false; + + memset(&session->pcb, 0, sizeof(session->pcb)); + + disallow = (0xffffffff << isession->ncores) & MVE_CTRL_DISALLOW_MASK; + maxcores = isession->ncores & MVE_CTRL_MAXCORES_MASK; + session->pcb.ctrl = (disallow << MVE_CTRL_DISALLOW_SHIFT) | + (maxcores << MVE_CTRL_MAXCORES_SHIFT); + + session->pcb.mmu_ctrl = isession->l0_pte; + session->pcb.nprot = isession->securevideo == false; + + return 0; +} + +void mvx_sched_session_destruct(struct mvx_sched_session *session) +{} + +int mvx_sched_switch_in(struct mvx_sched *sched, + struct mvx_sched_session *session) +{ + int ret; + + MVX_LOG_PRINT(&mvx_log_dev, MVX_LOG_INFO, + "%p Switch in session. jobqueue=%08x, coreslid=%08x.", + mvx_if_session_to_session(session->isession), + mvx_hwreg_read(sched->hwreg, MVX_HWREG_JOBQUEUE), + mvx_hwreg_read(sched->hwreg, MVX_HWREG_CORELSID)); + + ret = mutex_lock_interruptible(&sched->mutex); + if (ret != 0) + return ret; + + if (session->in_pending) { + MVX_LOG_PRINT(&mvx_log_dev, MVX_LOG_VERBOSE, + "Session is already in pending state."); + goto unlock_mutex; + } + + session->in_pending = true; + list_add_tail(&session->pending, &sched->pending); + queue_work(sched->sched_queue, &sched->sched_task); + +unlock_mutex: + mutex_unlock(&sched->mutex); + return 0; +} + +int mvx_sched_send_irq(struct mvx_sched *sched, + struct mvx_sched_session *session) +{ + mutex_lock(&sched->mutex); + + MVX_LOG_PRINT(&mvx_log_dev, MVX_LOG_DEBUG, + "%p Send irq. lsid=%d, jobqueue=%08x, corelsid=%08x.", + mvx_if_session_to_session(session->isession), + session->lsid == NULL ? -1 : session->lsid->lsid, + mvx_hwreg_read(sched->hwreg, MVX_HWREG_JOBQUEUE), + mvx_hwreg_read(sched->hwreg, MVX_HWREG_CORELSID)); + + if (session->lsid == NULL) + session->pcb.irqhost = 1; + else + mvx_lsid_send_irq(session->lsid); + + mutex_unlock(&sched->mutex); + + return 0; +} + +int mvx_sched_flush_mmu(struct mvx_sched *sched, + struct mvx_sched_session *session) +{ + mutex_lock(&sched->mutex); + + if (session->lsid != NULL) + mvx_lsid_flush_mmu(session->lsid); + + mutex_unlock(&sched->mutex); + + return 0; +} + +static void print_session(struct mvx_sched *sched, + struct mvx_sched_session *session, + struct mvx_session *s) +{ + int lsid = -1; + uint32_t irqve = 0; + uint32_t irqhost = 0; + + if (session != NULL && session->lsid != NULL) { + struct mvx_hwreg *hwreg = sched->hwreg; + + lsid = session->lsid->lsid; + irqve = mvx_hwreg_read_lsid(hwreg, lsid, MVX_HWREG_LIRQVE); + irqhost = mvx_hwreg_read_lsid(hwreg, lsid, MVX_HWREG_IRQHOST); + } + + MVX_LOG_PRINT(&mvx_log_dev, MVX_LOG_WARNING, + "%p session=%p, lsid=%d, irqve=%08x, irqhost=%08x", + s, mvx_if_session_to_session(session->isession), lsid, + irqve, irqhost); +} + +void mvx_sched_print_debug(struct mvx_sched *sched, + struct mvx_sched_session *session) +{ + struct mvx_hwreg *hwreg = sched->hwreg; + struct mvx_sched_session *pending; + struct mvx_sched_session *tmp; + struct mvx_session *s = mvx_if_session_to_session(session->isession); + unsigned int i; + int ret; + + mvx_pm_runtime_get_sync(sched->dev); + + ret = mutex_lock_interruptible(&sched->mutex); + if (ret != 0) { + mvx_pm_runtime_put_sync(sched->dev); + return; + } + + MVX_LOG_PRINT(&mvx_log_dev, MVX_LOG_WARNING, "%p Current session:", s); + print_session(sched, session, s); + + MVX_LOG_PRINT(&mvx_log_dev, MVX_LOG_WARNING, "%p Pending queue:", s); + list_for_each_entry_safe(pending, tmp, &sched->pending, pending) { + print_session(sched, pending, s); + } + + MVX_LOG_PRINT(&mvx_log_dev, MVX_LOG_WARNING, "%p Print register:", s); + + MVX_LOG_PRINT(&mvx_log_dev, MVX_LOG_WARNING, + "%p jobqueue=%08x, corelsid=%08x, irqve=%08x, irqhost=%08x", + s, + mvx_hwreg_read(hwreg, MVX_HWREG_JOBQUEUE), + mvx_hwreg_read(hwreg, MVX_HWREG_CORELSID), + mvx_hwreg_read(hwreg, MVX_HWREG_IRQVE), + mvx_hwreg_read(hwreg, MVX_HWREG_IRQHOST)); + + for (i = 0; i < sched->nlsid; i++) { + struct mvx_sched_session *ss = sched->lsid[i].session; + struct mvx_session *ls = NULL; + + if (ss != NULL) + ls = mvx_if_session_to_session(ss->isession); + + MVX_LOG_PRINT( + &mvx_log_dev, MVX_LOG_WARNING, + "%p lsid=%u, session=%p, irqve=%08x, irqhost=%08x", + s, i, ls, + mvx_hwreg_read_lsid(hwreg, i, MVX_HWREG_LIRQVE), + mvx_hwreg_read_lsid(hwreg, i, MVX_HWREG_IRQHOST)); + } + + mutex_unlock(&sched->mutex); + + mvx_pm_runtime_put_sync(sched->dev); +} + +void mvx_sched_handle_irq(struct mvx_sched *sched, + unsigned int lsid) +{ + struct mvx_sched_session *session; + struct mvx_if_session *isession = NULL; + int ret; + + ret = mutex_lock_interruptible(&sched->mutex); + if (ret != 0) + return; + + /* + * If a session has been terminated/unmapped just before the IRQ bottom + * handler has been executed, then the session pointer will be NULL or + * may even point at a different session. This is an unharmful + * situation. + * + * If the reference count is 0, then the session is about to be removed + * and should be ignored. + */ + session = sched->lsid[lsid].session; + if (session != NULL) { + ret = kref_get_unless_zero(&session->isession->kref); + if (ret != 0) + isession = session->isession; + } + + /* + * It is important that the scheduler mutex is released before the + * callbacks to the if-module are invoked. The if-module may issue + * requests to the dev-module (for example switch_in()) that would + * otherwise deadlock. + */ + mutex_unlock(&sched->mutex); + + /* Inform if-session that an IRQ was received. */ + if (isession != NULL) { + mutex_lock(isession->mutex); + sched->if_ops->irq(isession); + ret = kref_put(&isession->kref, isession->release); + + if (ret == 0) + mutex_unlock(isession->mutex); + } + + queue_work(sched->sched_queue, &sched->sched_task); +} + +void mvx_sched_terminate(struct mvx_sched *sched, + struct mvx_sched_session *session) +{ + struct list_head *head; + struct list_head *tmp; + + mutex_lock(&sched->mutex); + + if (session->lsid != NULL) { + mvx_lsid_jobqueue_remove(session->lsid); + mvx_lsid_terminate(session->lsid); + unmap_session(sched, session); + } + + list_for_each_safe(head, tmp, &sched->pending) { + if (head == &session->pending) { + list_del(head); + break; + } + } + + mutex_unlock(&sched->mutex); +} diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_scheduler.h b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_scheduler.h new file mode 100755 index 000000000..0855433f1 --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_scheduler.h @@ -0,0 +1,194 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef _MVX_SCHEDULER_H_ +#define _MVX_SCHEDULER_H_ + +/**************************************************************************** + * Includes + ****************************************************************************/ + +#include +#include +#include +#include "mvx_lsid.h" + +/**************************************************************************** + * Types + ****************************************************************************/ + +struct mvx_if_ops; +struct mvx_hwreg; + +/** + * struct mvx_sched - Scheduler class. + * @dev: Pointer to device. + * @if_ops: Pointer to if module operations. + * @hwreg: Pointer to hwreg. + * @mutex: Mutex protecting the scheduler. + * @pending: List if sessions pending scheduling. + * @nlsid: Number of LSID. + * @lsid: Array of LSID instances. + */ +struct mvx_sched { + struct device *dev; + struct mvx_if_ops *if_ops; + struct mvx_hwreg *hwreg; + struct mutex mutex; + struct list_head pending; + unsigned int nlsid; + struct mvx_lsid lsid[MVX_LSID_MAX]; + struct work_struct sched_task; + struct workqueue_struct *sched_queue; +}; + +/** + * struct mvx_sched_session - Client session class. + * @isession: Pointer to if session. + * @head: List head used to insert session into scheduler pending list. + * @lsid: Pointer to LSID the session is mapped to. + * @pcb: LSID pcb. + * + * This struct is used to keep track of sessions specific information. + */ +struct mvx_sched_session { + struct mvx_if_session *isession; + struct list_head pending; + struct list_head notify; + struct mvx_lsid *lsid; + struct mvx_lsid_pcb pcb; + bool in_pending; +}; + +/**************************************************************************** + * Exported functions + ****************************************************************************/ + +/** + * mvx_sched_construct() - Construct the scheduler object. + * @sched: Pointer to scheduler object. + * @dev: Pointer to device. + * @if_ops: Pointer to if ops. + * @hwreg: Pointer to hwreg. + * @parent: Pointer to parent debugfs directory entry. + * + * Return: 0 on success, else errorr code. + */ +int mvx_sched_construct(struct mvx_sched *sched, + struct device *dev, + struct mvx_if_ops *if_ops, + struct mvx_hwreg *hwreg, + struct dentry *parent); + +/** + * mvx_sched_destruct() - Destruct the scheduler object. + * @sched: Pointer to scheduler object. + */ +void mvx_sched_destruct(struct mvx_sched *sched); + +/** + * mvx_sched_session_construct() - Construct the scheduler session object. + * @if_ops: If module operations. + * @session: Pointer to session object. + * @isession: Pointer to if session. + * + * Return: 0 on success, else error code. + */ +int mvx_sched_session_construct(struct mvx_sched_session *session, + struct mvx_if_session *isession); + +/** + * mvx_sched_session_destruct() - Destruct the scheduler session object. + * @session: Pointer to session object. + * + * The client must make sure the session is terminated before the destructor + * is called. + */ +void mvx_sched_session_destruct(struct mvx_sched_session *session); + +/** + * mvx_sched_switch_in() - Switch in a session. + * @sched: Pointer to scheduler object. + * @session: Pointer to session object. + * + * Map a session to a LSID and schedule session for execution. If no LSID + * is available the session is placed in the pending queue. + * + * Return: 0 on success, else error code. + */ +int mvx_sched_switch_in(struct mvx_sched *sched, + struct mvx_sched_session *session); + +/** + * mvx_sched_send_irq() - Send IRQ to session. + * @sched: Pointer to scheduler object. + * @session: Pointer to session object. + * + * Return: 0 on success, else error code. + */ +int mvx_sched_send_irq(struct mvx_sched *sched, + struct mvx_sched_session *session); + +/** + * mvx_sched_flush_mmu() - Flush MMU tables. + * @sched: Pointer to scheduler object. + * @session: Pointer to session object. + * + * Return: 0 on success, else error code. + */ +int mvx_sched_flush_mmu(struct mvx_sched *sched, + struct mvx_sched_session *session); + +/** + * mvx_sched_handle_irq() - Handle interrupt for a LSID. + * @sched: Pointer to scheduler object. + * @lsid: LSID number. + */ +void mvx_sched_handle_irq(struct mvx_sched *sched, + unsigned int lsid); + +/** + * mvx_sched_terminate() - Terminate a session. + * @sched: Pointer to scheduler object. + * @session: Pointer to session object. + */ +void mvx_sched_terminate(struct mvx_sched *sched, + struct mvx_sched_session *session); + +/** + * mvx_sched_print_debug() - Print debug information. + * @sched: Pointer to scheduler object. + * @session: Pointer to session object. + */ +void mvx_sched_print_debug(struct mvx_sched *sched, + struct mvx_sched_session *session); + +#endif /* _MVX_SCHEDULER_H_ */ diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_secure.c b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_secure.c new file mode 100755 index 000000000..980e42f99 --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_secure.c @@ -0,0 +1,402 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +/**************************************************************************** + * Includes + ****************************************************************************/ + +#include +#include +#include +#include +#include +#include "mvx_log_group.h" +#include "mvx_secure.h" + +/**************************************************************************** + * Types + ****************************************************************************/ + +#pragma pack(push, 1) +struct secure_firmware_desc { + int32_t fd; + uint32_t l2pages; + struct { + uint32_t major; + uint32_t minor; + } protocol; +}; +#pragma pack(pop) + +struct mvx_secure_firmware_priv { + struct device *dev; + struct kobject kobj; + struct work_struct work; + wait_queue_head_t wait_queue; + struct mvx_secure_firmware fw; + mvx_secure_firmware_done done; + void *done_arg; +}; + +struct mvx_secure_mem { + struct device *dev; + struct kobject kobj; + wait_queue_head_t wait_queue; + struct dma_buf *dmabuf; +}; + +/**************************************************************************** + * Secure + ****************************************************************************/ + +int mvx_secure_construct(struct mvx_secure *secure, + struct device *dev) +{ + secure->dev = dev; + secure->kset = kset_create_and_add("securevideo", NULL, &dev->kobj); + if (secure->kset == NULL) { + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "Failed to create securevideo kset."); + return -EINVAL; + } + + secure->workqueue = alloc_workqueue("mvx_securevideo", + WQ_UNBOUND | WQ_MEM_RECLAIM, 1); + if (secure->workqueue == NULL) { + kset_unregister(secure->kset); + return -EINVAL; + } + + return 0; +} + +void mvx_secure_destruct(struct mvx_secure *secure) +{ + destroy_workqueue(secure->workqueue); + kset_unregister(secure->kset); +} + +/**************************************************************************** + * Secure firmware + ****************************************************************************/ + +/** + * firmware_store() - Firmware sysfs store function. + * + * Store values from firmware descriptor, get the DMA handle and wake up any + * waiting process. + */ +static ssize_t firmware_store(struct kobject *kobj, + struct kobj_attribute *attr, + const char *buf, + size_t size) +{ + struct mvx_secure_firmware_priv *securefw = + container_of(kobj, struct mvx_secure_firmware_priv, kobj); + const struct secure_firmware_desc *desc = (const void *)buf; + + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_INFO, + "Loaded secure firmware. fd=%d, l2=0x%llx, major=%u, minor=%u.", + desc->fd, desc->l2pages, desc->protocol.major, + desc->protocol.minor); + + securefw->fw.l2pages = desc->l2pages; + securefw->fw.protocol.major = desc->protocol.major; + securefw->fw.protocol.minor = desc->protocol.minor; + securefw->fw.dmabuf = dma_buf_get(desc->fd); + if (IS_ERR_OR_NULL(securefw->fw.dmabuf)) + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "Failed to get DMA buffer from fd. fd=%d.", + desc->fd); + + wake_up_interruptible(&securefw->wait_queue); + + return size; +} + +/** + * secure_firmware_release() - Release secure firmware. + * kobj: Pointer to kobject. + */ +static void secure_firmware_release(struct kobject *kobj) +{ + struct mvx_secure_firmware_priv *securefw = + container_of(kobj, struct mvx_secure_firmware_priv, kobj); + + if (IS_ERR_OR_NULL(securefw->fw.dmabuf) == false) + dma_buf_put(securefw->fw.dmabuf); + + devm_kfree(securefw->dev, securefw); +} + +/** + * secure_firmware_wait() - Wait for firmware load. + * @work: Pointer to work member in mvx_secure_firmware_priv. + * + * Worker thread used to wait for a secure firmware load to complete. + */ +static void secure_firmware_wait(struct work_struct *work) +{ + struct mvx_secure_firmware_priv *securefw = + container_of(work, struct mvx_secure_firmware_priv, work); + int ret; + + ret = wait_event_interruptible_timeout(securefw->wait_queue, + securefw->fw.dmabuf != NULL, + msecs_to_jiffies(10000)); + if (ret == 0) + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "Firmware load timed out."); + + kobject_del(&securefw->kobj); + + if (securefw->done != NULL) + securefw->done(&securefw->fw, securefw->done_arg); +} + +/** + * secure_firmware_create() - Create a secure firmware object. + * @secure: Pointer to secure context. + * @name: Name for secure firmware binary. + * @ncores: Number of cores to setup. + * @arg: User argument to callback routine. + * @done: Firware load callback routine. + * + * Return: Valid pointer on success, else ERR_PTR. + */ +static struct mvx_secure_firmware_priv *secure_firmware_create( + struct mvx_secure *secure, + const char *name, + unsigned int ncores, + void *arg, + mvx_secure_firmware_done done) +{ + static struct kobj_attribute attr = __ATTR_WO(firmware); + static struct attribute *attrs[] = { + &attr.attr, + NULL + }; + static struct kobj_type secure_ktype = { + .sysfs_ops = &kobj_sysfs_ops, + .release = secure_firmware_release, + // .default_attrs = attrs + }; + struct mvx_secure_firmware_priv *securefw; + char numcores_env[32]; + char fw_env[140]; + char *env[] = { "TYPE=firmware", numcores_env, fw_env, NULL }; + size_t n; + int ret; + + n = snprintf(fw_env, sizeof(fw_env), "FIRMWARE=%s.enc", name); + if (n >= sizeof(fw_env)) + return ERR_PTR(-EINVAL); + + n = snprintf(numcores_env, sizeof(numcores_env), "NUMCORES=%u", ncores); + if (n >= sizeof(numcores_env)) + return ERR_PTR(-EINVAL); + + /* Allocate and initialize the secure firmware object. */ + securefw = devm_kzalloc(secure->dev, sizeof(*securefw), GFP_KERNEL); + if (securefw == NULL) + return ERR_PTR(-ENOMEM); + + securefw->dev = secure->dev; + securefw->kobj.kset = secure->kset; + securefw->fw.ncores = ncores; + securefw->done = done; + securefw->done_arg = arg; + init_waitqueue_head(&securefw->wait_queue); + + /* Create kobject that the user space helper can interact with. */ + ret = kobject_init_and_add(&securefw->kobj, &secure_ktype, NULL, "%p", + securefw); + if (ret != 0) + goto put_kobject; + + /* Notify user space helper about the secure firmware load. */ + ret = kobject_uevent_env(&securefw->kobj, KOBJ_ADD, env); + if (ret != 0) { + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "Failed to send secure firmware uevent. ret=%d.", + ret); + goto put_kobject; + } + + return securefw; + +put_kobject: + kobject_put(&securefw->kobj); + devm_kfree(secure->dev, securefw); + + return ERR_PTR(ret); +} + +int mvx_secure_request_firmware_nowait(struct mvx_secure *secure, + const char *name, + unsigned int ncores, + void *arg, + mvx_secure_firmware_done done) +{ + struct mvx_secure_firmware_priv *securefw; + + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_INFO, + "Request secure firmware load nowait. firmware=%s.enc.", + name); + + securefw = secure_firmware_create(secure, name, ncores, arg, done); + if (IS_ERR(securefw)) + return PTR_ERR(securefw); + + INIT_WORK(&securefw->work, secure_firmware_wait); + queue_work(secure->workqueue, &securefw->work); + + return 0; +} + +void mvx_secure_release_firmware(struct mvx_secure_firmware *securefw) +{ + struct mvx_secure_firmware_priv *sfw = + container_of(securefw, struct mvx_secure_firmware_priv, fw); + + kobject_put(&sfw->kobj); +} + +/**************************************************************************** + * Secure memory + ****************************************************************************/ + +/** + * secure_mem_release() - Release the secure memory object. + */ +static void secure_mem_release(struct kobject *kobj) +{ + struct mvx_secure_mem *smem = + container_of(kobj, struct mvx_secure_mem, kobj); + + devm_kfree(smem->dev, smem); +} + +/** + * memory_store() - Memory sysfs store function. + * + * Store values from memory descriptor, get the DMA handle and wake up any + * waiting process. + */ +static ssize_t memory_store(struct kobject *kobj, + struct kobj_attribute *attr, + const char *buf, + size_t size) +{ + struct mvx_secure_mem *smem = + container_of(kobj, struct mvx_secure_mem, kobj); + const int32_t *fd = (const int32_t *)buf; + + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_INFO, + "Secure memory allocated. fd=%d.", + *fd); + + smem->dmabuf = dma_buf_get(*fd); + if (IS_ERR_OR_NULL(smem->dmabuf)) + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "Failed to get DMA buffer."); + + wake_up_interruptible(&smem->wait_queue); + + return size; +} + +struct dma_buf *mvx_secure_mem_alloc(struct mvx_secure *secure, + size_t size) +{ + static struct kobj_attribute attr = __ATTR_WO(memory); + static struct attribute *attrs[] = { + &attr.attr, + NULL + }; + static struct kobj_type secure_mem_ktype = { + .release = secure_mem_release, + .sysfs_ops = &kobj_sysfs_ops, + // .default_attrs = attrs + }; + struct mvx_secure_mem *smem; + char size_env[32]; + char *env[] = { "TYPE=memory", size_env, NULL }; + struct dma_buf *dmabuf = ERR_PTR(-EINVAL); + size_t n; + int ret; + + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_INFO, + "Request secure memory. size=%zu.", size); + + n = snprintf(size_env, sizeof(size_env), "SIZE=%zu", size); + if (n >= sizeof(size_env)) + return ERR_PTR(-EINVAL); + + smem = devm_kzalloc(secure->dev, sizeof(*smem), GFP_KERNEL); + if (smem == NULL) + return ERR_PTR(-ENOMEM); + + smem->dev = secure->dev; + smem->kobj.kset = secure->kset; + init_waitqueue_head(&smem->wait_queue); + + /* Create kobject that the user space helper can interact with. */ + ret = kobject_init_and_add(&smem->kobj, &secure_mem_ktype, NULL, "%p", + &smem->kobj); + if (ret != 0) + goto put_kobject; + + /* Notify user space helper about the secure firmware load. */ + ret = kobject_uevent_env(&smem->kobj, KOBJ_ADD, env); + if (ret != 0) { + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "Failed to send secure memory uevent. ret=%d.", + ret); + goto put_kobject; + } + + ret = wait_event_interruptible_timeout(smem->wait_queue, + smem->dmabuf != NULL, + msecs_to_jiffies(1000)); + if (ret == 0) { + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "Secure memory allocation timed out."); + goto put_kobject; + } + + dmabuf = smem->dmabuf; + +put_kobject: + kobject_put(&smem->kobj); + + return dmabuf; +} diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_secure.h b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_secure.h new file mode 100755 index 000000000..1d5c814bc --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_secure.h @@ -0,0 +1,139 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef _MVX_SECURE_H_ +#define _MVX_SECURE_H_ + +/**************************************************************************** + * Includes + ****************************************************************************/ + +#include + +/**************************************************************************** + * Types + ****************************************************************************/ + +struct device; +struct dma_buf; +struct kset; +struct mvx_secure_firmware; +struct workqueue_struct; + +/** + * struct mvx_secure - Secure video. + * @dev: Pointer to device. + * @kset: Kset that allows uevents to be sent. + * @workqueue: Work queue used to wait for firmware load. + */ +struct mvx_secure { + struct device *dev; + struct kset *kset; + struct workqueue_struct *workqueue; +}; + +/** + * typedef firmware_done - Firmware load callback. + */ +typedef void (*mvx_secure_firmware_done)(struct mvx_secure_firmware *, + void *arg); + +/** + * struct mvx_secure_firmware - Secure firmware. + * @dmabuf: Pointer to DMA buffer. + * @l2pages: Array of L2 pages. One per core. + * @ncores: Maximum number of cores. + * @major: Firmware protocol major version. + * @minor: Firmware protocol minor version. + */ +struct mvx_secure_firmware { + struct dma_buf *dmabuf; + phys_addr_t l2pages; + unsigned int ncores; + struct { + unsigned int major; + unsigned int minor; + } protocol; +}; + +/**************************************************************************** + * Exported functions + ****************************************************************************/ + +/** + * mvx_secure_construct() - Construct the secure object. + * @secure: Pointer to secure object. + * @dev: Pointer to device. + * + * Return: 0 on success, else error code. + */ +int mvx_secure_construct(struct mvx_secure *secure, + struct device *dev); + +/** + * mvx_secure_destruct() - Destruct the secure object. + * @secure: Pointer to secure object. + */ +void mvx_secure_destruct(struct mvx_secure *secure); + +/** + * mvx_secure_request_firmware_nowait() - Request secure firmware. + * @secure: Pointer to secure object. + * @name: Name of firmware binary. + * @ncores: Number of cores to setup. + * @arg: Callback argument. + * @done: Done callback. + * + * Return: 0 on success, else error code. + */ +int mvx_secure_request_firmware_nowait(struct mvx_secure *secure, + const char *name, + unsigned int ncores, + void *arg, + mvx_secure_firmware_done done); + +/** + * mvx_secure_release_firmware() - Release secure firmware. + * @securefw: Pointer to secure firmware. + */ +void mvx_secure_release_firmware(struct mvx_secure_firmware *securefw); + +/** + * mvx_secure_mem_alloc() - Secure memory allocation. + * @secure: Pointer to secure object. + * @size: Size in bytes to allocate. + * + * Return: Valid pointer on success, else ERR_PTR. + */ +struct dma_buf *mvx_secure_mem_alloc(struct mvx_secure *secure, + size_t size); + +#endif /* _MVX_SECURE_H_ */ diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_seq.c b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_seq.c new file mode 100755 index 000000000..f7074e7d0 --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_seq.c @@ -0,0 +1,95 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include +#include +#include "mvx_seq.h" + +struct mvx_seq_hash_it *mvx_seq_hash_start(struct device *dev, + struct hlist_head *head, + size_t size, + loff_t pos) +{ + struct mvx_seq_hash_it *it; + size_t i; + + it = devm_kzalloc(dev, sizeof(*it), GFP_KERNEL); + if (it == NULL) + return ERR_PTR(-ENOMEM); + + it->dev = dev; + for (i = 0; i < size; ++i) { + it->i = i; + hlist_for_each(it->node, &head[i]) { + if (pos-- == 0) + return it; + } + } + + devm_kfree(dev, it); + return NULL; +} + +struct mvx_seq_hash_it *mvx_seq_hash_next(void *v, + struct hlist_head *head, + size_t size, + loff_t *pos) +{ + struct mvx_seq_hash_it *it = v; + + ++*pos; + it->node = it->node->next; + + if (it->node != NULL) + return it; + + do { + ++it->i; + } while ((it->i < size) && hlist_empty(&head[it->i])); + + if (it->i == size) { + devm_kfree(it->dev, it); + return NULL; + } + + it->node = head[it->i].first; + return it; +} + +void mvx_seq_hash_stop(void *v) +{ + struct mvx_seq_hash_it *it = v; + + if (it == NULL) + return; + + devm_kfree(it->dev, it); +} diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_seq.h b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_seq.h new file mode 100755 index 000000000..3713621b6 --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_seq.h @@ -0,0 +1,94 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef _MVX_SEQ_H_ +#define _MVX_SEQ_H_ + +/**************************************************************************** + * Defines + ****************************************************************************/ + +#define mvx_seq_printf(s, tag, ind, fmt, ...) \ + seq_printf(s, "%-*s%-*s: " fmt, (3 * (ind)), "", 30 - (3 * (ind)), \ + tag, ## __VA_ARGS__) + +/**************************************************************************** + * Types + ****************************************************************************/ + +/** + * struct mvx_seq_hash_it - Iterator over hash table. + */ +struct mvx_seq_hash_it { + struct hlist_node *node; + size_t i; + struct device *dev; +}; + +/** + * mvx_seq_hash_start() - Initialize iterator. + * @dev: Pointer to device. + * @head: Pointer to a head of a hash table. + * @size: Size of a hash table. + * @pos: Position to start. + * + * Iterator created by this function should be provided to + * mvx_seq_hash_start and mvx_seq_hash_stop as the first parameter. + * + * Return: Pointer to an iterator on success or ERR_PTR(). + */ +struct mvx_seq_hash_it *mvx_seq_hash_start(struct device *dev, + struct hlist_head *head, + size_t size, + loff_t pos); + +/** + * mvx_seq_hash_next() - Move iterator to the next element. + * @v: Pointer to an iterator. + * @head: Pointer to a head of a hash table. + * @size: Size of a hash table. + * @pos: Position. + * + * Return: Iterator which points to a new element or NULL when the table + * is over. + */ +struct mvx_seq_hash_it *mvx_seq_hash_next(void *v, + struct hlist_head *head, + size_t size, + loff_t *pos); + +/** + * mvx_seq_hash_stop() - Close an iterator. + * @v: Pointer to an iterator. + */ +void mvx_seq_hash_stop(void *v); + +#endif /* _MVX_SEQ_H_ */ diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_session.c b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_session.c new file mode 100755 index 000000000..62fbd7d9d --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_session.c @@ -0,0 +1,4914 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +/**************************************************************************** + * Includes + ****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "mvx-v4l2-controls.h" +#include "mvx_bitops.h" +#include "mvx_firmware.h" +#include "mvx_firmware_cache.h" +#include "mvx_session.h" +#include "mvx_seq.h" + +/**************************************************************************** + * Private variables + ****************************************************************************/ + +static int session_watchdog_timeout = 30000; +module_param(session_watchdog_timeout, int, 0660); + +static int fw_watchdog_timeout; +module_param(fw_watchdog_timeout, int, 0660); + +/**************************************************************************** + * Private functions + ****************************************************************************/ + +static void watchdog_start(struct mvx_session *session, + unsigned int timeout_ms) +{ + int ret; + + if (session->error != 0) + return; + + MVX_SESSION_DEBUG(session, "Watchdog start. timeout_ms=%u.", + timeout_ms); + + ret = mod_timer(&session->watchdog_timer, + jiffies + msecs_to_jiffies(timeout_ms)); + if (ret != 0) { + MVX_SESSION_WARN(session, "Failed to start watchdog. ret=%d", + ret); + return; + } + + session->watchdog_count = 0; + + kref_get(&session->isession.kref); +} + +static void watchdog_stop(struct mvx_session *session) +{ + int ret; + + ret = del_timer_sync(&session->watchdog_timer); + + /* ret: 0=watchdog expired, 1=watchdog still running */ + MVX_SESSION_DEBUG(session, "Watchdog stop. ret=%d", ret); + + /* Decrement the kref if the watchdog was still running. */ + if (ret != 0) + kref_put(&session->isession.kref, session->isession.release); +} + +static void watchdog_update(struct mvx_session *session, + unsigned int timeout_ms) +{ + int ret; + + ret = mod_timer_pending(&session->watchdog_timer, + jiffies + msecs_to_jiffies(timeout_ms)); + + session->watchdog_count = 0; + + /* ret: 0=no restart, 1=restarted */ + MVX_SESSION_DEBUG(session, "Watchdog update. ret=%d, timeout_ms=%u.", + ret, timeout_ms); +} + +static bool is_fw_loaded(struct mvx_session *session) +{ + return (IS_ERR_OR_NULL(session->fw_bin) == false); +} + +static void print_debug(struct mvx_session *session) +{ + MVX_SESSION_INFO(session, "Print debug."); + + if (session->csession != NULL) + session->client_ops->print_debug(session->csession); + + if (is_fw_loaded(session)) + session->fw.ops.print_debug(&session->fw); +} + +static void send_event_error(struct mvx_session *session, + long error) +{ + session->error = error; + wake_up(&session->waitq); + session->event(session, MVX_SESSION_EVENT_ERROR, + (void *)session->error); +} + +static void session_unregister(struct mvx_session *session) +{ + if (!IS_ERR_OR_NULL(session->csession)) { + session->client_ops->unregister_session(session->csession); + session->csession = NULL; + } +} + +static void release_fw_bin(struct mvx_session *session) +{ + if (is_fw_loaded(session) != false) { + MVX_SESSION_INFO(session, "Release firmware binary."); + + mvx_fw_destruct(&session->fw); + mvx_fw_cache_put(session->cache, session->fw_bin); + session->fw_bin = NULL; + } + + watchdog_stop(session); + session_unregister(session); +} + +static struct mvx_session *kref_to_session(struct kref *kref) +{ + return container_of(kref, struct mvx_session, isession.kref); +} + +static void session_destructor(struct kref *kref) +{ + struct mvx_session *session = kref_to_session(kref); + + session->destructor(session); +} + +static const char *state_to_string(enum mvx_fw_state state) +{ + switch (state) { + case MVX_FW_STATE_STOPPED: + return "Stopped"; + case MVX_FW_STATE_RUNNING: + return "Running"; + default: + return "Unknown"; + } +} + +static enum mvx_direction get_bitstream_port(struct mvx_session *session) +{ + if (mvx_is_bitstream(session->port[MVX_DIR_INPUT].format) && + mvx_is_frame(session->port[MVX_DIR_OUTPUT].format)) + return MVX_DIR_INPUT; + else if (mvx_is_frame(session->port[MVX_DIR_INPUT].format) && + mvx_is_bitstream(session->port[MVX_DIR_OUTPUT].format)) + return MVX_DIR_OUTPUT; + + return MVX_DIR_MAX; +} + +static bool is_stream_on(struct mvx_session *session) +{ + return session->port[MVX_DIR_INPUT].stream_on && + session->port[MVX_DIR_OUTPUT].stream_on; +} + +/** + * wait_pending() - Wait for procedure to finish. + * + * Wait for the number of pending firmware messages to reach 0, or for an error + * to happen. + * + * Return: 0 on success, else error code. + */ +static int wait_pending(struct mvx_session *session) +{ + int ret = 0; + + while (is_fw_loaded(session) != false && + session->fw.msg_pending > 0 && + session->error == 0) { + mutex_unlock(session->isession.mutex); + + ret = wait_event_timeout( + session->waitq, + is_fw_loaded(session) == false || + session->fw.msg_pending == 0 || + session->error != 0, + msecs_to_jiffies(10000)); + + if (ret < 0) + goto lock_mutex; + + if (ret == 0) { + send_event_error(session, -ETIME); + ret = -ETIME; + goto lock_mutex; + } + + mutex_lock(session->isession.mutex); + } + + return session->error; + +lock_mutex: + mutex_lock(session->isession.mutex); + + if (ret < 0) + MVX_SESSION_WARN(session, + "Wait pending returned error. ret=%d, error=%d, msg_pending=%d.", + ret, session->error, session->fw.msg_pending); + + return ret; +} + +static int send_irq(struct mvx_session *session) +{ + if (IS_ERR_OR_NULL(session->csession)) + return -EINVAL; + + return session->client_ops->send_irq(session->csession); +} + +/** + * switch_in() - Request the client device to switch in the session. + * + * Return: 0 on success, else error code. + */ +static int switch_in(struct mvx_session *session) +{ + int ret; + + session->idle_count = 0; + + if (session->switched_in != false) + return 0; + + MVX_SESSION_INFO(session, "Switch in."); + + ret = session->client_ops->switch_in(session->csession); + if (ret != 0) { + MVX_SESSION_WARN(session, "Failed to switch in session."); + send_event_error(session, ret); + return ret; + } + + session->switched_in = true; + + return 0; +} + +/** + * fw_send_msg() - Send firmware message and signal IRQ. + * + * Return: 0 on success, else error code. + */ +static int fw_send_msg(struct mvx_session *session, + struct mvx_fw_msg *msg) +{ + int ret; + + if (session->error != 0) + return session->error; + + ret = session->fw.ops.put_message(&session->fw, msg); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to queue firmware message."); + goto send_error; + } + + ret = send_irq(session); + if (ret != 0) { + MVX_SESSION_WARN(session, "Failed to send irq."); + goto send_error; + } + + return switch_in(session); + +send_error: + send_event_error(session, ret); + return ret; +} + +static int fw_send_msg_simple(struct mvx_session *session, + enum mvx_fw_code code, + const char *str) +{ + struct mvx_fw_msg msg = { .code = code }; + + MVX_SESSION_INFO(session, "Firmware req: %s.", str); + + return fw_send_msg(session, &msg); +} + +static int fw_flush(struct mvx_session *session, + enum mvx_direction dir) +{ + struct mvx_fw_msg msg = { .code = MVX_FW_CODE_FLUSH, .flush.dir = dir }; + int ret; + + MVX_SESSION_INFO(session, "Firmware req: Flush. dir=%d.", dir); + + ret = fw_send_msg(session, &msg); + if (ret != 0) + return ret; + + session->port[dir].is_flushing = true; + + return 0; +} + +static int fw_state_change(struct mvx_session *session, + enum mvx_fw_state state) +{ + struct mvx_fw_msg msg = { + .code = MVX_FW_CODE_STATE_CHANGE, + .state = state + }; + int ret = 0; + + if (state != session->fw_state) { + MVX_SESSION_INFO(session, + "Firmware req: State change. current=%d, new=%d.", + session->fw_state, state); + ret = fw_send_msg(session, &msg); + } + + return ret; +} + +static int fw_job(struct mvx_session *session, + unsigned int frames) +{ + struct mvx_fw_msg msg = { + .code = MVX_FW_CODE_JOB, + .job.cores = session->isession.ncores, + .job.frames = frames + }; + + MVX_SESSION_INFO(session, "Firmware req: Job. frames=%u.", frames); + + return fw_send_msg(session, &msg); +} + +static int fw_switch_out(struct mvx_session *session) +{ + unsigned int idle_count = session->idle_count; + int ret; + + ret = fw_send_msg_simple(session, MVX_FW_CODE_SWITCH_OUT, + "Switch out"); + + /* + * Restore idle count. Switch out is the only message where we do not + * want to reset the idle counter. + */ + session->idle_count = idle_count; + + return ret; +} + +static int fw_ping(struct mvx_session *session) +{ + return fw_send_msg_simple(session, MVX_FW_CODE_PING, "Ping"); +} + +static int fw_dump(struct mvx_session *session) +{ + return fw_send_msg_simple(session, MVX_FW_CODE_DUMP, "Dump"); +} + +static int fw_set_debug(struct mvx_session *session, uint32_t debug_level) +{ + struct mvx_fw_msg msg = { + .code = MVX_FW_CODE_DEBUG, + .arg = debug_level + }; + + MVX_SESSION_INFO(session, "Firmware req: Set debug. debug_level=%d.", debug_level); + + return fw_send_msg(session, &msg); +} + +static int fw_set_option(struct mvx_session *session, + struct mvx_fw_set_option *option) +{ + struct mvx_fw_msg msg = { + .code = MVX_FW_CODE_SET_OPTION, + .set_option = *option + }; + + MVX_SESSION_INFO(session, "Firmware req: Set option. code=%d.", + option->code); + + return fw_send_msg(session, &msg); +} + +static bool is_encoder(struct mvx_session *session) +{ + return get_bitstream_port(session) == MVX_DIR_OUTPUT; +} + +static int fw_eos(struct mvx_session *session) +{ + struct mvx_fw_msg msg = { + .code = MVX_FW_CODE_EOS, + .eos_is_frame = is_encoder(session) ? true : false + }; + int ret; + + MVX_SESSION_INFO(session, "Firmware req: Buffer EOS."); + + ret = fw_send_msg(session, &msg); + if (ret != 0) + return ret; + + session->port[MVX_DIR_INPUT].flushed = false; + + return 0; +} + +static int fw_set_epr_qp(struct mvx_session *session, + int code, + struct mvx_buffer_param_qp qp) +{ + struct mvx_fw_set_option option; + int ret; + + if (qp.qp < 0) + return -EINVAL; + + if (qp.qp == 0) + return 0; + + option.code = code; + option.epr_qp = qp; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set EPR QP. code=%d, ret=%d.", + code, ret); + return ret; + } + + return 0; +} +static int fw_set_qp(struct mvx_session *session, + int code, + int qp) +{ + struct mvx_fw_set_option option; + int ret; + + if (qp < 0) + return -EINVAL; + + if (qp == 0) + return 0; + + option.code = code; + option.qp = qp; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set QP. code=%d, ret=%d.", + code, ret); + return ret; + } + + return 0; +} + +static int fw_set_osd_config(struct mvx_session *session, + int code, + struct mvx_osd_config *osd) +{ + struct mvx_fw_set_option option; + int ret; + + option.code = code; + option.osd_config = *osd; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set OSD config. code=%d, ret=%d.", + code, ret); + return ret; + } + + return 0; +} + +static int fw_set_roi_regions(struct mvx_session *session, + int code, + struct mvx_roi_config *roi) +{ + struct mvx_fw_set_option option; + int ret; + + if (roi->num_roi < 0) + return -EINVAL; + + if (roi->num_roi == 0) + return 0; + + option.code = code; + option.roi_config = *roi; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set ROI. code=%d, ret=%d.", + code, ret); + return ret; + } + + return 0; +} + +static int fw_set_chr_cfg(struct mvx_session *session, + int code, + struct mvx_chr_cfg *chr) +{ + struct mvx_fw_set_option option; + int ret; + + if (chr->num_chr < 0) + return -EINVAL; + + if (chr->num_chr == 0) + return 0; + + option.code = code; + option.chr_cfg = *chr; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set CHR CFG. code=%d, ret=%d.", + code, ret); + return ret; + } + + return 0; +} + +static int fw_set_enc_stats(struct mvx_session *session, + int code, + struct mvx_enc_stats *stats) +{ + struct mvx_fw_set_option option; + int ret; + + if (stats->flags == 0) + return 0; + + option.code = code; + option.enc_stats = *stats; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set enc stats param. code=%d, ret=%d.", + code, ret); + return ret; + } + + return 0; +} + +static int fw_common_setup(struct mvx_session *session) +{ + int ret = 0; + struct mvx_fw_set_option option; + + if (session->nalu_format != MVX_NALU_FORMAT_UNDEFINED && + session->port[MVX_DIR_INPUT].format != MVX_FORMAT_AV1) { + option.code = MVX_FW_SET_NALU_FORMAT; + option.nalu_format = session->nalu_format; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set NALU format."); + return ret; + } + } + + if (session->stream_escaping != MVX_TRI_UNSET) { + option.code = MVX_FW_SET_STREAM_ESCAPING; + option.stream_escaping = session->stream_escaping; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set stream escaping."); + return ret; + } + } + + if (session->profiling != 0) { + option.code = MVX_FW_SET_PROFILING; + option.profiling = session->profiling; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to enable FW profiling."); + return ret; + } + } + return ret; +} + +/* JPEG standard, Annex K */ +static const uint8_t qtbl_chroma_ref[MVX_FW_QUANT_LEN] = { + 17, 18, 24, 47, 99, 99, 99, 99, + 18, 21, 26, 66, 99, 99, 99, 99, + 24, 26, 56, 99, 99, 99, 99, 99, + 47, 66, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99 +}; + +static const uint8_t qtbl_luma_ref[MVX_FW_QUANT_LEN] = { + 16, 11, 10, 16, 24, 40, 51, 61, + 12, 12, 14, 19, 26, 58, 60, 55, + 14, 13, 16, 24, 40, 57, 69, 56, + 14, 17, 22, 29, 51, 87, 80, 62, + 18, 22, 37, 56, 68, 109, 103, 77, + 24, 35, 55, 64, 81, 104, 113, 92, + 49, 64, 78, 87, 103, 121, 120, 101, + 72, 92, 95, 98, 112, 100, 103, 99 +}; + +void generate_quant_tbl(int quality, + const uint8_t qtbl_ref[MVX_FW_QUANT_LEN], + uint8_t qtbl[MVX_FW_QUANT_LEN]) +{ + int i; + int q; + + q = (quality < 50) ? (5000 / quality) : (200 - 2 * quality); + + for (i = 0; i < MVX_FW_QUANT_LEN; ++i) { + qtbl[i] = ((qtbl_ref[i] * q) + 50) / 100; + qtbl[i] = min_t(int, qtbl[i], 255); + qtbl[i] = max_t(int, qtbl[i], 1); + } +} + +static int generate_standards_yuv2rgb_coef(enum mvx_yuv_to_rgb_mode mode,struct mvx_color_conv_coef *color_conv_coef) +{ + static struct mvx_color_conv_coef color_standards[] = + { + { {{4769, 4769, 4769}, {0, -1605, 8263}, {6537, -3330, 0}}, {16, 128, 128}}, + { {{4096, 4096, 4096}, {0, -1410, 7258}, {5743, -2925, 0}}, {0 , 128, 128}}, + { {{4769, 4769, 4769}, {0, -873, 8652}, {7343, -2183, 0}}, {16, 128, 128}}, + { {{4096, 4096, 4096}, {0, -767, 7601}, {6450, -1917, 0}}, {0 , 128, 128}}, + { {{4769, 4769, 4769}, {0, -767, 8773}, {6876, -2664, 0}}, {16, 128, 128}}, + { {{4096, 4096, 4096}, {0, -674, 7706}, {6040, -2340, 0}}, {0 , 128, 128}}, + }; + + if(mode =MVX_YUV_TO_RGB_MODE_MAX) + { + mode =MVX_YUV_TO_RGB_MODE_BT601_LIMT; + //return -EINVAL; + } + + memcpy(color_conv_coef,&color_standards[mode],sizeof(struct mvx_color_conv_coef)); + + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_DEBUG, + "generate_standards_yuv2rgb_coef.mode indx=%d 3x3=[%d %d %d, %d %d %d,%d %d %d],offset=[%d %d %d]",mode, + color_conv_coef->coef[0][0], + color_conv_coef->coef[0][1], + color_conv_coef->coef[0][2], + color_conv_coef->coef[1][0], + color_conv_coef->coef[1][1], + color_conv_coef->coef[1][2], + color_conv_coef->coef[2][0], + color_conv_coef->coef[2][1], + color_conv_coef->coef[2][2], + color_conv_coef->offset[0], + color_conv_coef->offset[1], + color_conv_coef->offset[2]); + + return 0; +} + +static int generate_standards_rgb2yuv_coef(enum mvx_rgb_to_yuv_mode mode,struct mvx_rgb2yuv_color_conv_coef *color_conv_coef) +{ + static struct mvx_rgb2yuv_color_conv_coef color_standards[] = + { + {{1052, 2065, 401, -607, -1192, 1799, 1799, -1506, -293}, {16,235},{16,240}, {0, 255}}, + {{1225, 2404, 467, -691, -1357, 2048, 2048, -1715, -333}, { 0,255},{ 0,255}, {0, 255}}, + {{ 748, 2516, 254, -412, -1387, 1799, 1799, -1634, -165}, {16,235},{16,240}, {0, 255}}, + {{ 871, 2929, 296, -469, -1579, 2048, 2048, -1860, -188}, { 0,255},{ 0,255}, {0, 255}}, + {{ 924, 2385, 209, -502, -1297, 1799, 1799, -1654, -145}, {16,235},{16,240}, {0, 255}}, + {{1076, 2777, 243, -572, -1476, 2048, 2048, -1883, -165}, { 0,255},{ 0,255}, {0, 255}}, + }; + + if(mode =MVX_RGB_TO_YUV_MODE_MAX) + { + mode =MVX_RGB_TO_YUV_MODE_BT601_STUDIO; + } + + memcpy(color_conv_coef,&color_standards[mode],sizeof(struct mvx_rgb2yuv_color_conv_coef)); + + return 0; +} + +static int fw_encoder_setup(struct mvx_session *session) +{ + int ret; + enum mvx_format codec; + struct mvx_fw_set_option option; + enum mvx_direction dir; + + dir = get_bitstream_port(session); + codec = session->port[dir].format; + +#if 0 + pr_info("%s>encoder settings:\n", __func__); + pr_info("codec %d\n", codec); + pr_info("frame_rate 0x%lx\n", session->frame_rate); + pr_info("target_bitrate %d\n", session->target_bitrate); + pr_info("maximum_bitrate %d\n", session->maximum_bitrate); + pr_info("rc_enabled %d\n", session->rc_enabled); + pr_info("rc_type %d\n", session->rc_type); + pr_info("profile %d\n", session->profile[codec]); + pr_info("level %d\n", session->level[codec]); + pr_info("nalu_format %d\n", session->nalu_format); + pr_info("stream_escaping %d\n", session->stream_escaping); + pr_info("ignore_stream_headers %d\n", session->ignore_stream_headers); + pr_info("frame_reordering %d\n", session->frame_reordering); + pr_info("intbuf_size %ld\n", session->intbuf_size); + pr_info("p_frames %d\n", session->p_frames); + pr_info("b_frames %d\n", session->b_frames); + pr_info("gop_type %d\n", session->gop_type); + pr_info("cyclic_intra_refresh_mb %d\n", session->cyclic_intra_refresh_mb); + pr_info("constr_ipred %d\n", session->constr_ipred); + pr_info("entropy_sync %d\n", session->entropy_sync); + pr_info("temporal_mvp %d\n", session->temporal_mvp); + pr_info("tile_rows %d\n", session->tile_rows); + pr_info("tile_cols %d\n", session->tile_cols); + pr_info("min_luma_cb_size %d\n", session->min_luma_cb_size); + pr_info("mb_mask %d\n", session->mb_mask); + pr_info("entropy_mode %d\n", session->entropy_mode); + pr_info("multi_slice_mode %d\n", session->multi_slice_mode); + pr_info("multi_slice_max_mb %d\n", session->multi_slice_max_mb); + pr_info("vp9_prob_update %d\n", session->vp9_prob_update); + pr_info("mv_h_search_range %d\n", session->mv_h_search_range); + pr_info("mv_v_search_range %d\n", session->mv_v_search_range); + pr_info("bitdepth_chroma %d\n", session->bitdepth_chroma); + pr_info("bitdepth_luma %d\n", session->bitdepth_luma); + pr_info("force_chroma_format %d\n", session->force_chroma_format); + pr_info("rgb_to_yuv %d\n", session->rgb_to_yuv); + pr_info("band_limit %d\n", session->band_limit); + pr_info("cabac_init_idc %d\n", session->cabac_init_idc); + pr_info("qp %d, %d, %d, %d, %d\n", session->qp[codec].i_frame, session->qp[codec].p_frame, session->qp[codec].b_frame, session->qp[codec].min, session->qp[codec].max); + pr_info("resync_interval %d\n", session->resync_interval); + pr_info("jpeg_quality %d\n", session->jpeg_quality); + pr_info("color_desc %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d\n", + session->color_desc.flags, session->color_desc.range, session->color_desc.primaries, session->color_desc.transfer, session->color_desc.matrix, + session->color_desc.video_format, session->color_desc.aspect_ratio_idc, session->color_desc.sar_width, session->color_desc.sar_height, + session->color_desc.num_units_in_tick, session->color_desc.time_scale); + pr_info("crop_left %d\n", session->crop_left); + pr_info("crop_right %d\n", session->crop_right); + pr_info("crop_top %d\n", session->crop_top); + pr_info("crop_bottom %d\n", session->crop_bottom); + pr_info("sei_userdata %d\n", session->sei_userdata.flags); + pr_info("nHRDBufsize %d\n", session->nHRDBufsize); + pr_info("dsl_frame %d, %d\n", session->dsl_frame.width, session->dsl_frame.height); + pr_info("dsl_ratio %d, %d\n", session->dsl_ratio.hor, session->dsl_ratio.ver); + pr_info("mvx_ltr %d, %d\n", session->mvx_ltr.mode, session->mvx_ltr.period); + pr_info("dsl_pos_mode %d\n", session->dsl_pos_mode); + pr_info("mini_frame_height %d\n", session->mini_frame_height); + pr_info("init_qpi %d\n", session->init_qpi); + pr_info("init_qpp %d\n", session->init_qpp); + pr_info("sao_luma %d\n", session->sao_luma); + pr_info("sao_chroma %d\n", session->sao_chroma); + pr_info("qp_delta_i_p %d\n", session->qp_delta_i_p); + pr_info("ref_rb_en %d\n", session->ref_rb_en); + pr_info("qpmap_qp_clip_top %d\n", session->qpmap_qp_clip_top); + pr_info("qpmap_qp_clip_bot %d\n", session->qpmap_qp_clip_bot); + pr_info("rc_qp_clip_top %d\n", session->rc_qp_clip_top); + pr_info("rc_qp_clip_bot %d\n", session->rc_qp_clip_bot); + pr_info("max_qp_i %d\n", session->max_qp_i); + pr_info("min_qp_i %d\n", session->min_qp_i); + pr_info("profiling %d\n", session->profiling); + pr_info("visible_width %d\n", session->visible_width); + pr_info("visible_height %d\n", session->visible_height); + pr_info("rc_bit_i_mode %d\n", session->rc_bit_i_mode); + pr_info("rc_bit_i_ratio %d\n", session->rc_bit_i_ratio); + pr_info("inter_med_buf_size %d\n", session->inter_med_buf_size); + pr_info("svct3_level1_period %d\n", session->svct3_level1_period); + pr_info("reset_gop_pframes %d\n", session->reset_gop_pframes); + pr_info("reset_ltr_period %d\n", session->reset_ltr_period); + pr_info("fixedqp %d\n", session->fixedqp); + pr_info("gdr_number %d\n", session->gdr_number); + pr_info("gdr_period %d\n", session->gdr_period); + pr_info("multi_sps_pps %d\n", session->multi_sps_pps); + pr_info("enable_visual %d\n", session->enable_visual); + pr_info("scd_enable %d\n", session->scd_enable); + pr_info("scd_percent %d\n", session->scd_percent); + pr_info("scd_threshold %d\n", session->scd_threshold); + pr_info("aq_ssim_en %d\n", session->aq_ssim_en); + pr_info("aq_neg_ratio %d\n", session->aq_neg_ratio); + pr_info("aq_pos_ratio %d\n", session->aq_pos_ratio); + pr_info("aq_qpdelta_lmt %d\n", session->aq_qpdelta_lmt); + pr_info("aq_init_frm_avg_svar %d\n", session->aq_init_frm_avg_svar); + pr_info("adaptive_intra_block %d\n", session->adaptive_intra_block); + pr_info("seamless_mode %d, w %d, h %d\n", session->seamless_target.seamless_mode, session->seamless_target.target_width, session->seamless_target.target_height); + pr_info("color_conv_mode %d\n", session->color_conv_mode); + pr_info("use_cust_rgb_to_yuv_mode %d\n", session->use_cust_rgb_to_yuv_mode); + pr_info("use_cust_color_conv_coef %d\n", session->use_cust_color_conv_coef); + pr_info("forced_uv_value %d\n", session->forced_uv_value); + pr_info("dsl_interp_mode %d\n", session->dsl_interp_mode); + pr_info("disabled_features %d\n", session->disabled_features); + pr_info("change_pos %d\n", session->change_pos); + pr_info("enc_src_crop.crop_en %d\n", session->enc_src_crop.crop_en); +#endif + + if (session->profile[codec] != MVX_PROFILE_NONE) { + option.code = MVX_FW_SET_PROFILE_LEVEL; + option.profile_level.profile = session->profile[codec]; + option.profile_level.level = session->level[codec]; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set profile/level."); + return ret; + } + } + + if (codec != MVX_FORMAT_JPEG) { + if (session->rc_type) { + option.code = MVX_FW_SET_RATE_CONTROL; + option.rate_control.target_bitrate = + session->rc_type ? session->target_bitrate:0; + option.rate_control.rate_control_mode = session->rc_type; + if (session->rc_type == MVX_OPT_RATE_CONTROL_MODE_C_VARIABLE) { + option.rate_control.maximum_bitrate = session->maximum_bitrate; + } + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to put target bitrate."); + return ret; + } + } + + option.code = MVX_FW_SET_FRAME_RATE; + option.frame_rate = session->frame_rate; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to put frame rate."); + return ret; + } + + if (session->rc_bit_i_mode != 0) { + option.code = MVX_FW_SET_RC_BIT_I_MODE; + option.rc_bit_i_mode = session->rc_bit_i_mode; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to put rc bit i mode."); + return ret; + } + } + if (session->rc_bit_i_ratio != 0) { + option.code = MVX_FW_SET_RC_BIT_I_RATIO; + option.rc_bit_i_ratio = session->rc_bit_i_ratio; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to put rc bit i ratio."); + return ret; + } + } + + if (session->multi_sps_pps != 0) { + option.code = MVX_FW_SET_MULTI_SPS_PPS; + option.multi_sps_pps = session->multi_sps_pps; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to support multi SPS PSS."); + return ret; + } + } + + if (session->scd_enable != 0) { + option.code = MVX_FW_SET_SCD_ENABLE; + option.scd_enable = session->scd_enable; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to enable SCD."); + return ret; + } + } + + if (session->scd_enable != 0 && session->scd_percent >= 0 && session->scd_percent <= 10) { + option.code = MVX_FW_SET_SCD_PERCENT; + option.scd_percent = session->scd_percent; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set SCD percent."); + return ret; + } + } + + if (session->scd_enable != 0 && session->scd_threshold >=0 && session->scd_threshold <= 2047) { + option.code = MVX_FW_SET_SCD_THRESHOLD; + option.scd_threshold = session->scd_threshold; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set SCD threshold."); + return ret; + } + } + + if (session->aq_ssim_en != 0 && + (codec == MVX_FORMAT_H264 || + codec == MVX_FORMAT_HEVC)) { + option.code = MVX_FW_SET_AQ_SSIM_EN; + option.aq_ssim_en = session->aq_ssim_en; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to enable SSIM."); + return ret; + } + } + + if (session->aq_ssim_en != 0 && session->aq_neg_ratio >= 0 && + session->aq_neg_ratio <= 63 && + (codec == MVX_FORMAT_H264 || + codec == MVX_FORMAT_HEVC)) { + option.code = MVX_FW_SET_AQ_NEG_RATIO; + option.aq_neg_ratio = session->aq_neg_ratio; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set AQ negative ratio."); + return ret; + } + } + + if (session->aq_ssim_en != 0 && session->aq_pos_ratio >= 0 && + session->aq_pos_ratio <= 63 && + (codec == MVX_FORMAT_H264 || + codec == MVX_FORMAT_HEVC)) { + option.code = MVX_FW_SET_AQ_POS_RATIO; + option.aq_pos_ratio = session->aq_pos_ratio; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set AQ positive ratio."); + return ret; + } + } + + if (session->aq_ssim_en != 0 && session->aq_qpdelta_lmt >= 0 && + session->aq_qpdelta_lmt <= 7 && + (codec == MVX_FORMAT_H264 || + codec == MVX_FORMAT_HEVC)) { + option.code = MVX_FW_SET_AQ_QPDELTA_LMT; + option.aq_qpdelta_lmt = session->aq_qpdelta_lmt; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set AQ QPDelta LMT."); + return ret; + } + } + + if (session->aq_ssim_en != 0 && session->aq_init_frm_avg_svar >= 0 && + session->aq_init_frm_avg_svar <=15 && + (codec == MVX_FORMAT_H264 || + codec == MVX_FORMAT_HEVC)) { + option.code = MVX_FW_SET_AQ_INIT_FRM_AVG_SVAR; + option.aq_init_frm_avg_svar = session->aq_init_frm_avg_svar; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to initial frame variance."); + return ret; + } + } + + if (session->enable_visual != 0) { + option.code = MVX_FW_SET_VISUAL_ENABLE; + option.enable_visual = session->enable_visual; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to enable visual."); + return ret; + } + option.code = MVX_FW_SET_ADPTIVE_QUANTISATION; + option.adapt_qnt = 3;//set to 3 if enable visual + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set adaptive quantisation."); + return ret; + } + } + + if (session->adaptive_intra_block != 0) { + option.code = MVX_FW_SET_VISUAL_ENABLE_ADAPTIVE_INTRA_BLOCK; + option.adaptive_intra_block = session->adaptive_intra_block; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to enable adaptive intra block."); + return ret; + } + } + + if (session->rc_enabled != false) { + if (session->qp[codec].min < session->qp[codec].max) { + option.code = MVX_FW_SET_QP_RANGE; + option.qp_range.min = session->qp[codec].min; + option.qp_range.max = session->qp[codec].max; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set qp range."); + return ret; + } + } + } + if (session->fixedqp != 0) { + ret = fw_set_qp(session, MVX_FW_SET_FIXED_QP, + session->fixedqp); + if (ret != 0) + return ret; + } else { + if (session->qp[codec].i_frame != 0) { + ret = fw_set_qp(session, MVX_FW_SET_QP_I, + session->qp[codec].i_frame); + if (ret != 0) + return ret; + } + if (session->qp[codec].p_frame != 0) { + ret = fw_set_qp(session, MVX_FW_SET_QP_P, + session->qp[codec].p_frame); + if (ret != 0) + return ret; + } + if (session->qp[codec].b_frame != 0) { + ret = fw_set_qp(session, MVX_FW_SET_QP_B, + session->qp[codec].b_frame); + if (ret != 0) + return ret; + } + } + + if ((session->min_qp_i <= session->max_qp_i) && (session->max_qp_i != 0)) { + option.code = MVX_FW_SET_QP_RANGE_I; + option.qp_range.min = session->min_qp_i; + option.qp_range.max = session->max_qp_i; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set qp range."); + return ret; + } + } + + { + option.code = MVX_FW_SET_P_FRAMES; + option.pb_frames = session->p_frames; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set P frames."); + return ret; + } + } + + if (session->b_frames != 0) { + option.code = MVX_FW_SET_B_FRAMES; + option.pb_frames = session->b_frames; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set B frames."); + return ret; + } + } + + if (session->gop_type != MVX_GOP_TYPE_NONE) { + option.code = MVX_FW_SET_GOP_TYPE; + option.gop_type = session->gop_type; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set GOP type."); + return ret; + } + } + + if (session->inter_med_buf_size != 0) { + option.code = MVX_FW_SET_INTER_MED_BUF_SIZE; + option.inter_med_buf_size = session->inter_med_buf_size; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set inter mediate buffer size."); + return ret; + } + } + + if (session->svct3_level1_period != 0) { + option.code = MVX_FW_SET_SVCT3_LEVEL1_PERIOD; + option.svct3_level1_period = session->svct3_level1_period; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set svct3_level1_period."); + return ret; + } + } + + if (session->reset_ltr_period != 0) { + option.code = MVX_FW_SET_LTR_PERIOD; + option.reset_ltr_period = session->reset_ltr_period; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set ltr period."); + return ret; + } + } + + if (session->reset_gop_pframes != 0) { + option.code = MVX_FW_SET_GOP_PFRAMES; + option.reset_gop_pframes = session->reset_gop_pframes; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set gop pframes."); + return ret; + } + } + + if (session->cyclic_intra_refresh_mb != 0) { + option.code = MVX_FW_SET_INTRA_MB_REFRESH; + option.intra_mb_refresh = + session->cyclic_intra_refresh_mb; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set cyclic intra refresh Mb."); + return ret; + } + } + + if (session->constr_ipred != MVX_TRI_UNSET && + (codec == MVX_FORMAT_H264 || codec == MVX_FORMAT_HEVC)) { + option.code = MVX_FW_SET_CONSTR_IPRED; + option.constr_ipred = session->constr_ipred; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set constr ipred."); + return ret; + } + } + if (session->change_pos != 0) { + option.code = MVX_FW_SET_RATE_CONTROL_CHANGE_POS; + option.change_pos = session->change_pos; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set change pos for jpeg rc"); + return ret; + } + } + } + + if (codec == MVX_FORMAT_HEVC) { + if (session->entropy_sync != MVX_TRI_UNSET) { + option.code = MVX_FW_SET_ENTROPY_SYNC; + option.entropy_sync = session->entropy_sync; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set entropy sync."); + return ret; + } + } + + if (session->temporal_mvp != MVX_TRI_UNSET) { + option.code = MVX_FW_SET_TEMPORAL_MVP; + option.temporal_mvp = session->temporal_mvp; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set temporal mvp."); + return ret; + } + } + if (session->min_luma_cb_size != 0) { + option.code = MVX_FW_SET_MIN_LUMA_CB_SIZE; + option.min_luma_cb_size = session->min_luma_cb_size; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set min luma cb size."); + return ret; + } + } + } + + if ((codec == MVX_FORMAT_HEVC || + codec == MVX_FORMAT_VP9) && + (session->tile_rows != 0 || + session->tile_cols != 0)) { + option.code = MVX_FW_SET_TILES; + option.tile.rows = session->tile_rows; + option.tile.cols = session->tile_cols; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set tile dims."); + return ret; + } + } + + if (session->entropy_mode != MVX_ENTROPY_MODE_NONE && + codec == MVX_FORMAT_H264) { + option.code = MVX_FW_SET_ENTROPY_MODE; + option.entropy_mode = session->entropy_mode; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set entropy mode."); + return ret; + } + } + + if (codec == MVX_FORMAT_H264 || + codec == MVX_FORMAT_HEVC) { + option.code = MVX_FW_SET_SLICE_SPACING_MB; + if (session->multi_slice_mode == + MVX_MULTI_SLICE_MODE_SINGLE) + option.slice_spacing_mb = 0; + else + option.slice_spacing_mb = + session->multi_slice_max_mb; + + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set slice spacing."); + return ret; + } + + option.code = MVX_FW_SET_CABAC_INIT_IDC; + option.cabac_init_idc = session->cabac_init_idc; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set CABAC init IDC."); + return ret; + } + if (session->crop_left != 0) { + option.code = MVX_FW_SET_CROP_LEFT; + option.crop_left = session->crop_left; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set crop left"); + return ret; + } + } + if (session->crop_right != 0) { + option.code = MVX_FW_SET_CROP_RIGHT; + option.crop_right = session->crop_right; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set crop right"); + return ret; + } + } + if (session->crop_top != 0) { + option.code = MVX_FW_SET_CROP_TOP; + option.crop_top = session->crop_top; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set crop top"); + return ret; + } + } + if (session->crop_bottom != 0) { + option.code = MVX_FW_SET_CROP_BOTTOM; + option.crop_bottom = session->crop_bottom; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set crop bottom"); + return ret; + } + } + if (session->nHRDBufsize != 0) { + option.code = MVX_FW_SET_HRD_BUF_SIZE; + option.nHRDBufsize = session->nHRDBufsize; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set HRD Buffer Size"); + return ret; + } + } + if (session->color_desc.range != 0 || session->color_desc.matrix != 0 || + session->color_desc.primaries != 0 || session->color_desc.transfer != 0 || + session->color_desc.sar_height != 0 || session->color_desc.sar_width != 0 || + session->color_desc.aspect_ratio_idc != 0) { + struct mvx_fw_set_option option; + + option.code = MVX_FW_SET_COLOUR_DESC; + option.colour_desc = session->color_desc; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set vui colour description"); + return ret; + } + } + + if (session->sei_userdata.flags) { + option.code = MVX_FW_SET_SEI_USERDATA; + option.userdata = session->sei_userdata; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set sei userdata"); + return ret; + } + } + + if (session->mvx_ltr.mode != 0 || session->mvx_ltr.period != 0){ + option.code = MVX_FW_SET_LONG_TERM_REF; + option.ltr.mode = session->mvx_ltr.mode; + option.ltr.period = session->mvx_ltr.period; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set ltr mode/period"); + return ret; + } + } + + if (session->gdr_number > 1 && session->gdr_period > 1){ + option.code = MVX_FW_SET_GDR_NUMBER; + option.gdr_number = session->gdr_number; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set gdr number"); + return ret; + } + option.code = MVX_FW_SET_GDR_PERIOD; + option.gdr_period = session->gdr_period; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set gdr period"); + return ret; + } + } + + } + + if (codec == MVX_FORMAT_VP9) { + MVX_SESSION_WARN(session, "VP9 option!"); + option.code = MVX_FW_SET_VP9_PROB_UPDATE; + option.vp9_prob_update = session->vp9_prob_update; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set VP9 prob update mode."); + return ret; + } + } + + if (session->mv_h_search_range != 0 && + session->mv_v_search_range != 0) { + option.code = MVX_FW_SET_MV_SEARCH_RANGE; + option.mv.x = session->mv_h_search_range; + option.mv.y = session->mv_v_search_range; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set motion vector search range."); + return ret; + } + } + + if (session->bitdepth_chroma != 0 && + session->bitdepth_luma != 0) { + option.code = MVX_FW_SET_BITDEPTH; + option.bitdepth.chroma = session->bitdepth_chroma; + option.bitdepth.luma = session->bitdepth_luma; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set bitdepth."); + return ret; + } + } + + if (session->force_chroma_format != 0) { + option.code = MVX_FW_SET_CHROMA_FORMAT; + option.chroma_format = session->force_chroma_format; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set chroma format."); + return ret; + } + } + + if( session->use_cust_rgb_to_yuv_mode == MVX_CUST_YUV2RGB_MODE_STANDARD ) + { + option.code = MVX_FW_SET_RGB_TO_YUV_MODE; + generate_standards_rgb2yuv_coef(session->rgb_to_yuv,&option.rgb2yuv_params); + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set rgb2yuv color conversion mode."); + return ret; + } + } + else if(session->use_cust_rgb_to_yuv_mode == MVX_CUST_YUV2RGB_MODE_CUSTOMIZED){ + option.code = MVX_FW_SET_RGB_TO_YUV_MODE; + memcpy(&option.rgb2yuv_params,&session->rgb2yuv_color_conv_coef,sizeof(struct mvx_rgb2yuv_color_conv_coef)); + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set rgb2yuv color conversion mode."); + return ret; + } + } + + if (session->band_limit != 0) { + option.code = MVX_FW_SET_BAND_LIMIT; + option.band_limit = session->band_limit; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set bandwidth limit."); + return ret; + } + } + + if (session->init_qpi != 0){ + option.code = MVX_FW_SET_INIT_QP_I; + option.init_qpi = session->init_qpi; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set init qp for I frame."); + return ret; + } + } + if (session->init_qpp != 0){ + option.code = MVX_FW_SET_INIT_QP_P; + option.init_qpp = session->init_qpp; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set init qp for P frame."); + return ret; + } + } + if (session->sao_luma != 0){ + option.code = MVX_FW_SET_SAO_LUMA; + option.sao_luma = session->sao_luma; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set sao luma."); + return ret; + } + } + if (session->sao_chroma != 0){ + option.code = MVX_FW_SET_SAO_CHROMA; + option.sao_chroma = session->sao_chroma; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set sao chroma."); + return ret; + } + } + if (session->qp_delta_i_p != 0){ + option.code = MVX_FW_SET_QP_DELTA_I_P; + option.qp_delta_i_p = session->qp_delta_i_p; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set delta qp for I frame and P frame."); + return ret; + } + } + if (session->ref_rb_en != 0){ + option.code = MVX_FW_SET_QP_REF_RB_EN; + option.ref_rb_en = session->ref_rb_en; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set ref_rb_en."); + return ret; + } + } + if (session->rc_qp_clip_top != 0){ + option.code = MVX_FW_SET_RC_CLIP_TOP; + option.rc_qp_clip_top = session->rc_qp_clip_top; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set rc_qp_clip_top."); + return ret; + } + } + if (session->rc_qp_clip_bot != 0){ + option.code = MVX_FW_SET_RC_CLIP_BOT; + option.rc_qp_clip_bot = session->rc_qp_clip_bot; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set rc_qp_clip_bot."); + return ret; + } + } + if (session->qpmap_qp_clip_top != 0){ + option.code = MVX_FW_SET_QP_MAP_CLIP_TOP; + option.qpmap_qp_clip_top = session->qpmap_qp_clip_top; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set qpmap_qp_clip_top."); + return ret; + } + } + if (session->qpmap_qp_clip_top != 0){ + option.code = MVX_FW_SET_QP_MAP_CLIP_BOT; + option.qpmap_qp_clip_bot = session->qpmap_qp_clip_bot; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set qpmap_qp_clip_bot."); + return ret; + } + } + if (codec == MVX_FORMAT_JPEG) { + if (session->resync_interval >= 0) { + option.code = MVX_FW_SET_RESYNC_INTERVAL; + option.resync_interval = session->resync_interval; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set resync interval."); + return ret; + } + } + + if (session->jpeg_quality != 0 || session->jpeg_quality_luma != 0 || session->jpeg_quality_chroma != 0) { + uint8_t qtbl_chroma[MVX_FW_QUANT_LEN]; + uint8_t qtbl_luma[MVX_FW_QUANT_LEN]; + uint32_t quality_luma = session->jpeg_quality_luma != 0 ? session->jpeg_quality_luma : session->jpeg_quality; + uint32_t quality_chroma = session->jpeg_quality_chroma != 0 ? session->jpeg_quality_chroma : session->jpeg_quality; + option.code = MVX_FW_SET_QUANT_TABLE; + if(quality_luma) { + generate_quant_tbl(quality_luma, + qtbl_luma_ref, qtbl_luma); + option.quant_tbl.luma = qtbl_luma; + } + if (quality_chroma) { + generate_quant_tbl(quality_chroma, + qtbl_chroma_ref, qtbl_chroma); + option.quant_tbl.chroma = qtbl_chroma; + } + + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set quantization table."); + return ret; + } + } + if (session->huff_table.type != 0) { + option.code = MVX_FW_SET_HUFF_TABLE; + memcpy(&option.huff_table, &session->huff_table, sizeof(struct mvx_huff_table)); + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set huff table."); + return ret; + } + } + } + + if ((session->port[MVX_DIR_INPUT].format ==MVX_FORMAT_YUV444 + ||session->port[MVX_DIR_INPUT].format ==MVX_FORMAT_YUV444_10 + ||session->port[MVX_DIR_INPUT].format ==MVX_FORMAT_YUV420_I420 + ||session->port[MVX_DIR_INPUT].format ==MVX_FORMAT_YUV420_I420_10 + ||session->port[MVX_DIR_INPUT].format ==MVX_FORMAT_Y + ||session->port[MVX_DIR_INPUT].format ==MVX_FORMAT_Y_10) + && session->forced_uv_value >= 0 && session->forced_uv_value < 0x400 ) { + option.code = MVX_FW_SET_ENC_FORCED_UV_VAL; + option.forced_uv_value = session->forced_uv_value; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set forced to uv value."); + return ret; + } + } + + if (session->enc_src_crop.width != 0 + && session->enc_src_crop.height !=0 + && session->enc_src_crop.crop_en !=0) { + option.code = MVX_FW_SET_ENC_SRC_CROPPING; + memcpy(&option.enc_src_crop,&session->enc_src_crop,sizeof(struct mvx_crop_cfg)); + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set enc src crop."); + return ret; + } + } + + if (session->mini_frame_height >= 64) { + option.code = MVX_FW_SET_MINI_FRAME_HEIGHT; + option.mini_frame_height = session->mini_frame_height; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set mini frame buffer cnt."); + return ret; + } + } + + ret = fw_common_setup(session); + + return ret; +} + +static int fw_decoder_setup(struct mvx_session *session) +{ + int ret; + struct mvx_fw_set_option option; + + enum mvx_format codec; + enum mvx_direction dir; + + dir = get_bitstream_port(session); + codec = session->port[dir].format; + + if (codec == MVX_FORMAT_VC1 && + session->profile[codec] != MVX_PROFILE_NONE) { + option.code = MVX_FW_SET_PROFILE_LEVEL; + option.profile_level.profile = session->profile[codec]; + option.profile_level.level = session->level[codec]; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set profile/level."); + return ret; + } + } + if (codec == MVX_FORMAT_AV1 ) { + option.code = MVX_FW_SET_DISABLE_FEATURES; + option.disabled_features = 0x100; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set disabled features AFBC_LEGACY_REF for AV1."); + return ret; + } + } + + if (session->ignore_stream_headers != MVX_TRI_UNSET) { + option.code = MVX_FW_SET_IGNORE_STREAM_HEADERS; + option.ignore_stream_headers = session->ignore_stream_headers; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set ignore stream headers."); + return ret; + } + } + + if (session->frame_reordering != MVX_TRI_UNSET) { + option.code = MVX_FW_SET_FRAME_REORDERING; + option.frame_reordering = session->frame_reordering; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set frame reordering."); + return ret; + } + } + + if (session->intbuf_size != 0) { + option.code = MVX_FW_SET_INTBUF_SIZE; + option.intbuf_size = session->intbuf_size; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set internal buffer size."); + return ret; + } + } + + if (session->dsl_frame.width != 0 && session->dsl_frame.height != 0) { + option.code = MVX_FW_SET_DSL_FRAME; + option.dsl_frame.width = session->dsl_frame.width; + option.dsl_frame.height = session->dsl_frame.height; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set DSL frame width/height."); + return ret; + } + } + + if (session->dsl_pos_mode >= 0 && session->dsl_pos_mode <= 2) { + option.code = MVX_FW_SET_DSL_MODE; + option.dsl_pos_mode = session->dsl_pos_mode; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set DSL mode."); + return ret; + } + } + + if (session->dsl_interp_mode >= 0 && session->dsl_interp_mode <= 1) { + option.code = MVX_FW_SET_DSL_INTERP_MODE; + option.dsl_interp_mode = session->dsl_interp_mode; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set DSL INTERP mode."); + return ret; + } + } + + if( mvx_is_rgb24(session->port[MVX_DIR_OUTPUT].format)) + { + option.code = MVX_FW_SET_DEC_YUV2RGB_PARAMS; + + if(session->use_cust_color_conv_coef) + { + ret =0; + memcpy(&option.yuv2rbg_csc_coef,&session->color_conv_coef,sizeof(struct mvx_color_conv_coef)); + } + else + { + ret =generate_standards_yuv2rgb_coef(session->color_conv_mode,&option.yuv2rbg_csc_coef); + } + if(0==ret) + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set yuv2rgb color conversion mode."); + return ret; + } + } + if (session->disabled_features != 0) { + option.code = MVX_FW_SET_DISABLE_FEATURES; + option.disabled_features = session->disabled_features; + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set disabled features."); + return ret; + } + } + + if (session->dec_dst_crop.crop_en !=0 + && session->dec_dst_crop.width > 0 + && session->dec_dst_crop.height > 0) { + option.code = MVX_FW_SET_DEC_DST_CROPPING; + memcpy(&option.dec_dst_crop,&session->dec_dst_crop,sizeof(struct mvx_crop_cfg)); + ret = fw_set_option(session, &option); + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to set dec dst crop."); + return ret; + } + } + + ret = fw_common_setup(session); + + return ret; +} + +static int fw_initial_setup(struct mvx_session *session) +{ + int ret; + enum mvx_direction dir; + enum mvx_format codec; + struct mvx_fw_set_option option; + + MVX_SESSION_INFO(session, "Firmware initial setup."); + + fw_set_debug(session, 5); + + option.code = MVX_FW_SET_WATCHDOG_TIMEOUT; + option.watchdog_timeout = fw_watchdog_timeout; + ret = fw_set_option(session, &option); + if (ret != 0) + return ret; + + dir = get_bitstream_port(session); + codec = session->port[dir].format; + + ret = fw_job(session, 1); + if (ret != 0) + return ret; + + if (is_encoder(session)) + ret = fw_encoder_setup(session); + else + ret = fw_decoder_setup(session); + + if (ret != 0) { + MVX_SESSION_WARN(session, + "Failed to perform initial setup.\n"); + return ret; + } + + ret = fw_state_change(session, MVX_FW_STATE_RUNNING); + if (ret != 0) { + MVX_SESSION_WARN(session, "Failed to queue state change."); + return ret; + } + + ret = fw_ping(session); + if (ret != 0) { + MVX_SESSION_WARN(session, "Failed to put ping message."); + send_event_error(session, ret); + return ret; + } + + return ret; +} + +/** + * map_buffer() - Memory map buffer to MVE address space. + * + * Return 0 on success, else error code. + */ +static int map_buffer(struct mvx_session *session, + enum mvx_direction dir, + struct mvx_buffer *buf) +{ + mvx_mmu_va begin; + mvx_mmu_va end; + enum mvx_fw_region region; + int ret; + + if (mvx_is_bitstream(session->port[dir].format)) + region = MVX_FW_REGION_PROTECTED; + else if (mvx_is_frame(session->port[dir].format)) + region = MVX_FW_REGION_FRAMEBUF; + else + return -EINVAL; + + ret = session->fw.ops.get_region(region, &begin, &end); + if (ret != 0) + return ret; + + ret = mvx_buffer_map(buf, begin, end); + if (ret != 0) + return ret; + + return 0; +} +static int queue_osd_config(struct mvx_session *session, + struct mvx_osd_config *osd_cfg) +{ + int ret = 0; + ret = fw_set_osd_config(session, MVX_FW_SET_OSD_CONFIG, + osd_cfg); + return ret; +} + +static int queue_roi_regions(struct mvx_session *session, + struct mvx_roi_config *roi_cfg) +{ + int ret = 0; + if ( roi_cfg->qp_present ) { + ret = fw_set_qp(session, MVX_FW_SET_QP_REGION, + roi_cfg->qp); + } + if ( roi_cfg->roi_present ) { + ret = fw_set_roi_regions(session, MVX_FW_SET_ROI_REGIONS, + roi_cfg); + } + return ret; +} + +static int queue_qp_epr(struct mvx_session *session, + struct mvx_buffer_param_qp *qp) +{ + int ret = 0; + ret = fw_set_epr_qp(session, MVX_FW_SET_EPR_QP, + *qp); + + return ret; +} + +static int queue_chr_cfg(struct mvx_session *session, + struct mvx_chr_cfg *chr_cfg) +{ + int ret = 0; + + ret = fw_set_chr_cfg(session, MVX_FW_SET_CHR_CFG, + chr_cfg); + return ret; +} + +static int queue_enc_stats(struct mvx_session *session, + struct mvx_enc_stats *stats) +{ + int ret = 0; + + ret = fw_set_enc_stats(session, MVX_FW_SET_STATS_MODE, + stats); + return ret; +} +/** + * queue_buffer() - Put buffer to firmware queue. + * + * Return: 0 on success, else error code. + */ +static int queue_buffer(struct mvx_session *session, + enum mvx_direction dir, + struct mvx_buffer *buf) +{ + struct mvx_session_port *port = &session->port[dir]; + struct mvx_fw_msg msg; + struct mvx_seamless_target *seamless = &session->seamless_target; + unsigned int width; + unsigned int height; + unsigned int stride[MVX_BUFFER_NPLANES]; + unsigned i; + /* + * Vb2 cannot allocate buffers with bidirectional mapping, therefore + * proper direction should be set. + */ + enum dma_data_direction dma_dir = + (dir == MVX_DIR_OUTPUT) ? DMA_FROM_DEVICE : DMA_TO_DEVICE; + + int ret; + memset(stride,0,sizeof(stride)); + if (dir == MVX_DIR_OUTPUT) { + port->scaling_shift = (buf->flags & MVX_BUFFER_FRAME_FLAG_SCALING_MASK) >> 14; + } + if (mvx_buffer_is_mapped(buf) == false) { + ret = map_buffer(session, dir, buf); + if (ret != 0) + return ret; + } + if (dir == MVX_DIR_OUTPUT && port->buffer_allocated < port->buffer_min) { + buf->flags |= MVX_BUFFER_FRAME_NEED_REALLOC; + return -EAGAIN; + } + /* + * Update frame dimensions. They might have changed due to a resolution + * change. + */ + if(MVX_DIR_OUTPUT == dir + && session->port[MVX_DIR_INPUT].format <= MVX_FORMAT_BITSTREAM_LAST + && seamless->seamless_mode !=0) + { + width = seamless->target_width < port->width ? port->width : seamless->target_width; + height = seamless->target_height < port->height ? port->height : seamless->target_height; + for(i=0;itarget_stride[i] < port->stride[i] ? port->stride[i] : seamless->target_stride[i]; + } + } + else + { + width = port->width; + height = port->height; + for(i=0;istride[i]; + } + } + if (mvx_is_afbc(port->format) != false) { + port->afbc_width = DIV_ROUND_UP(width, 16 << (!!(buf->flags & MVX_BUFFER_AFBC_32X8_SUPERBLOCK))); + ret = mvx_buffer_afbc_set(buf, port->format, width, + height, port->afbc_width, + port->size[0], port->interlaced); + if (ret != 0) + return ret; + } else if (mvx_is_frame(port->format) != false) { + ret = mvx_buffer_frame_set(buf, port->format, width, + height, stride, + port->size, + port->interlaced); + if (ret != 0) + return ret; + + } + + ret = mvx_buffer_synch(buf, dma_dir); + if (ret != 0) + return ret; + + msg.code = MVX_FW_CODE_BUFFER; + msg.buf = buf; + + MVX_SESSION_INFO(session, + "Firmware req: Buffer. dir=%u, len=[%u, %u, %u], flags=0x%08x, eos=%u, interlace=%u", + buf->dir, + buf->planes[0].filled, + buf->planes[1].filled, + buf->planes[2].filled, + buf->flags, + (buf->flags & MVX_BUFFER_EOS) != 0, + (buf->flags & MVX_BUFFER_INTERLACE) != 0); + + ret = session->fw.ops.put_message(&session->fw, &msg); + if (ret != 0) + goto send_error; + + port->buffer_count++; + port->flushed = false; + if (dir == MVX_DIR_OUTPUT && port->isreallocting == true) { + port->isreallocting = false; + } + ret = send_irq(session); + if (ret != 0) + goto send_error; + + return 0; + +send_error: + send_event_error(session, ret); + return ret; +} + +/** + * queue_pending_buffers() - Queue pending buffers. + * + * Buffer that are queued when the port is still stream off will be put in the + * pending queue. Once both input- and output ports are stream on the pending + * buffers will be forwarded to the firmware. + * + * Return: 0 on success, else error code. + */ +static int queue_pending_buffers(struct mvx_session *session, + enum mvx_direction dir) +{ + struct mvx_buffer *buf; + struct mvx_buffer *tmp; + int roi_config_num = 0; + int roi_config_index = 0; + int qp_num = 0; + int qp_index = 0; + int chr_cfg_num = 0; + int chr_cfg_index = 0; + int enc_stats_num = 0; + int enc_stats_index = 0; + int osd_cfg_index = 0; + int osd_cfg_num = 0; + int pending_buf_idx = 0; + int osd_buffer_idx = 0; + struct mvx_roi_config roi_config; + int ret = 0; + + if (dir == MVX_DIR_INPUT && session->port[dir].roi_config_num > 0) { + roi_config_num = session->port[dir].roi_config_num; + } + if (dir == MVX_DIR_INPUT && session->port[dir].qp_num > 0) { + qp_num = session->port[dir].qp_num; + } + if (dir == MVX_DIR_INPUT && session->port[dir].chr_cfg_num > 0) { + chr_cfg_num = session->port[dir].chr_cfg_num; + } + if (dir == MVX_DIR_INPUT && session->port[dir].enc_stats_num > 0) { + enc_stats_num = session->port[dir].enc_stats_num; + } + if (dir == MVX_DIR_INPUT && session->port[dir].osd_cfg_num > 0) { + osd_cfg_num = session->port[dir].osd_cfg_num; + } + list_for_each_entry_safe(buf, tmp, &session->port[dir].buffer_queue, + head) { + if ((buf->flags & MVX_BUFFER_FRAME_FLAG_ROI) == MVX_BUFFER_FRAME_FLAG_ROI && + roi_config_index < roi_config_num) { + roi_config = session->port[dir].roi_config_queue[roi_config_index]; + ret = queue_roi_regions(session, &roi_config); + roi_config_index++; + } + if ((buf->flags & MVX_BUFFER_FRAME_FLAG_GENERAL) == MVX_BUFFER_FRAME_FLAG_GENERAL && + qp_index < qp_num && dir == MVX_DIR_INPUT) { + ret = queue_qp_epr(session, &session->port[dir].qp_queue[qp_index]); + qp_index++; + } + if ((buf->flags & MVX_BUFFER_FRAME_FLAG_CHR) == MVX_BUFFER_FRAME_FLAG_CHR && + chr_cfg_index < chr_cfg_num) { + ret = queue_chr_cfg(session, &session->port[dir].chr_cfg_queue[chr_cfg_index]); + chr_cfg_index++; + } + if (enc_stats_index < enc_stats_num && + session->port[dir].enc_stats_queue[enc_stats_index].pic_index == pending_buf_idx ) { + ret = queue_enc_stats(session, &session->port[dir].enc_stats_queue[enc_stats_index]); + enc_stats_index++; + } + if (osd_cfg_index < osd_cfg_num && + session->port[dir].osd_cfg_queue[osd_cfg_index].pic_index == osd_buffer_idx ) { + ret = queue_osd_config(session, &session->port[dir].osd_cfg_queue[osd_cfg_index]); + osd_cfg_index++; + } + ret = queue_buffer(session, dir, buf); + pending_buf_idx++; + if (!(buf->flags & MVX_BUFFER_FRAME_FLAG_OSD_MASK)) { + osd_buffer_idx++;//check for yuv bffer + } + if ((buf->flags & MVX_BUFFER_FRAME_NEED_REALLOC) == MVX_BUFFER_FRAME_NEED_REALLOC) { + session->event(session, MVX_SESSION_EVENT_BUFFER, buf); + } else if (ret != 0) { + break; + } + list_del(&buf->head); + } + + session->port[dir].roi_config_num = 0; + session->port[dir].qp_num = 0; + session->port[dir].chr_cfg_num = 0; + session->port[dir].enc_stats_num = 0; + return ret; +} + +/** + * fw_bin_ready() - Complete firmware configuration. + * + * The firmware binary load has completed and the firmware configuration can + * begin. + * + * If the session is no longer 'stream on' (someone issued 'stream off' before + * the firmware load completed) the firmware binary is put back to the cache. + * + * Else the the client session is registered and the firmware instance is + * constructed. + */ +static void fw_bin_ready(struct mvx_fw_bin *bin, + void *arg, + bool same_thread) +{ + struct mvx_session *session = arg; + int lock_failed = 1; + int ret; + + /* + * Only lock the mutex if the firmware binary was loaded by a + * background thread. + */ + if (same_thread == false) { + lock_failed = mutex_lock_interruptible(session->isession.mutex); + if (lock_failed != 0) { + send_event_error(session, lock_failed); + goto put_fw_bin; + } + } + + /* Return firmware binary if session is no longer 'stream on'. */ + if (!is_stream_on(session)) + goto put_fw_bin; + + /* Create client session. */ + session->isession.ncores = session->client_ops->get_ncores( + session->client_ops); + session->isession.l0_pte = mvx_mmu_set_pte( + MVX_ATTR_PRIVATE, virt_to_phys(session->mmu.page_table), + MVX_ACCESS_READ_WRITE); + + session->csession = session->client_ops->register_session( + session->client_ops, &session->isession); + if (IS_ERR(session->csession)) { + ret = PTR_ERR(session->csession); + send_event_error(session, ret); + goto put_fw_bin; + } + + /* Construct the firmware instance. */ + ret = mvx_fw_factory(&session->fw, bin, &session->mmu, + session, session->client_ops, session->csession, + session->isession.ncores, + session->dentry); + if (ret != 0) { + send_event_error(session, ret); + goto unregister_csession; + } + + session->fw_bin = bin; + + mvx_fw_cache_log(bin, session->csession); + + ret = fw_initial_setup(session); + if (ret != 0) + goto unregister_csession; + + ret = queue_pending_buffers(session, MVX_DIR_INPUT); + if (ret != 0) + goto unregister_csession; + + ret = queue_pending_buffers(session, MVX_DIR_OUTPUT); + if (ret != 0) + goto unregister_csession; + + if (lock_failed == 0) + mutex_unlock(session->isession.mutex); + + mvx_session_put(session); + + return; + +unregister_csession: + session->client_ops->unregister_session(session->csession); + session->csession = NULL; + +put_fw_bin: + mvx_fw_cache_put(session->cache, bin); + session->fw_bin = NULL; + + if (lock_failed == 0) + mutex_unlock(session->isession.mutex); + + mvx_session_put(session); +} + +static int calc_afbc_size(struct mvx_session *session, + enum mvx_format format, + unsigned int width, + unsigned int height, + bool tiled_headers, + bool tiled_body, + bool superblock, + bool interlaced) +{ + static const unsigned int mb_header_size = 16; + unsigned int payload_align = 128; + unsigned int mb_size; + int size; + + /* Calculate width and height in super blocks. */ + if (superblock != false) { + width = DIV_ROUND_UP(width, 32); + height = DIV_ROUND_UP(height, 8) + 1; + } else { + width = DIV_ROUND_UP(width, 16); + height = DIV_ROUND_UP(height, 16) + 1; + } + + /* Round up size to 8x8 tiles. */ + if (tiled_headers != false || tiled_body != false) { + width = roundup(width, 8); + height = roundup(height, 8); + } + + switch (format) { + case MVX_FORMAT_YUV420_AFBC_8: + mb_size = 384; + break; + case MVX_FORMAT_YUV420_AFBC_10: + mb_size = 480; + break; + case MVX_FORMAT_YUV422_AFBC_8: + mb_size = 512; + break; + case MVX_FORMAT_YUV422_AFBC_10: + mb_size = 656; + break; + default: + MVX_SESSION_WARN(session, + "Unsupported AFBC format. format=%u.", + format); + return -EINVAL; + } + + /* Round up tiled body to 128 byte boundary. */ + if (tiled_body != false) + mb_size = roundup(mb_size, payload_align); + + if (interlaced != false) + height = DIV_ROUND_UP(height, 2); + + /* Calculate size of AFBC makroblock headers. */ + size = roundup(width * height * mb_header_size, payload_align); + size += roundup(width * height * mb_size, payload_align); + + if (interlaced != false) + size *= 2; + + return size; +} + +static int try_format(struct mvx_session *session, + enum mvx_direction dir, + enum mvx_format format, + unsigned int *width, + unsigned int *height, + uint8_t *nplanes, + unsigned int *stride, + unsigned int *size, + bool *interlaced) +{ + int ret = 0; + + /* Limit width and height to 8k. */ + *width = min_t(unsigned int, *width, 32768); + *height = min_t(unsigned int, *height, 32768); + + /* Stream dimensions are dictated by the input port. */ + if (dir == MVX_DIR_OUTPUT) { + *width = session->port[MVX_DIR_INPUT].width >> session->port[MVX_DIR_OUTPUT].scaling_shift; + *height = session->port[MVX_DIR_INPUT].height >> session->port[MVX_DIR_OUTPUT].scaling_shift; + } + if (session->dsl_frame.width != 0 && session->dsl_frame.height != 0) { + *width = session->dsl_frame.width; + *height = session->dsl_frame.height; + } else if (dir == MVX_DIR_OUTPUT && (session->dsl_ratio.hor != 1 || session->dsl_ratio.ver != 1)) { + *width = session->port[MVX_DIR_INPUT].width / session->dsl_ratio.hor; + *height = session->port[MVX_DIR_INPUT].height / session->dsl_ratio.ver; + *width &= ~(1); + *height &= ~(1); + } + if(dir == MVX_DIR_OUTPUT && mvx_is_frame(format)) + { + if( session->dec_dst_crop.crop_en !=0 + && session->dec_dst_crop.width >0 + && session->dec_dst_crop.height >0 + && session->dec_dst_crop.width +session->dec_dst_crop.x <= session->port[MVX_DIR_INPUT].width + && session->dec_dst_crop.height +session->dec_dst_crop.y <= session->port[MVX_DIR_INPUT].height) + { + *width=session->dec_dst_crop.width; + *height=session->dec_dst_crop.height; + } + } + /* Interlaced input is not supported by the firmware. */ + if (dir == MVX_DIR_INPUT) + *interlaced = false; + + if (mvx_is_afbc(format) != false) { + unsigned int afbc_alloc_bytes = + session->port[dir].afbc_alloc_bytes; + if (*nplanes <= 0) + size[0] = 0; + + if (dir == MVX_DIR_INPUT) { + /* it is basically a worst-case calcualtion based on a size rounded up to tile size*/ + int s1 = calc_afbc_size(session, format, *width, + *height, true, true, false, //*height, false, false, false, + *interlaced); + int s2 = calc_afbc_size(session, format, *width, + *height, true, true, true, //*height, false, false, false, + *interlaced); + int s = max_t(unsigned int, s1, s2); + if (s < 0) + return s; + + size[0] = max_t(unsigned int, size[0], s); + } + + if (*interlaced != false) + afbc_alloc_bytes *= 2; + + size[0] = max_t(unsigned int, size[0], + afbc_alloc_bytes); + size[0] = roundup(size[0], PAGE_SIZE); + + *nplanes = 1; + } else if (mvx_is_frame(format) != false) { + uint32_t tmp_height = session->mini_frame_height >= 64? session->mini_frame_height : *height; + ret = mvx_buffer_frame_dim(format, *width, tmp_height, nplanes, + stride, size, session->setting_stride); + } else { + /* + * For compressed formats the size should be the maximum number + * of bytes an image is expected to become. This is calculated + * as width * height * 2 B/px / 2. Size should be at least one + * page. + */ + + stride[0] = 0; + + if (*nplanes <= 0) + size[0] = 0; + + size[0] = max_t(unsigned int, size[0], PAGE_SIZE); + size[0] = max_t(unsigned int, size[0], (*width) * (*height)); + size[0] = min_t(unsigned int, size[0], (8192) * (8192));////for large jpeg,bit stream buffer no need to set too large,just clip to 8k*8k + size[0] = roundup(size[0], PAGE_SIZE); + + *nplanes = 1; + } + + return ret; +} + +static void watchdog_work(struct work_struct *work) +{ + struct mvx_session *session = + container_of(work, struct mvx_session, watchdog_work); + int ret; + + mutex_lock(session->isession.mutex); + + MVX_SESSION_WARN(session, "Watchdog timeout. count=%u.", + session->watchdog_count); + + /* Print debug information. */ + print_debug(session); + + if (session->watchdog_count++ < 2) { + /* Request firmware to dump its state. */ + fw_dump(session); + + /* Restart watchdog. */ + watchdog_start(session, 3000); + } else { + send_event_error(session, -ETIME); + } + + ret = kref_put(&session->isession.kref, session->isession.release); + if (ret != 0) + return; + + mutex_unlock(session->isession.mutex); +} + +static void watchdog_timeout(struct timer_list *timer) +{ + struct mvx_session *session = + container_of(timer, struct mvx_session, watchdog_timer); + + queue_work(system_unbound_wq, &session->watchdog_work); +} + +#if KERNEL_VERSION(4, 14, 0) > LINUX_VERSION_CODE +static void watchdog_timeout_legacy(unsigned long data) +{ + watchdog_timeout((struct timer_list *)data); +} + +#endif + +/**************************************************************************** + * Exported functions + ****************************************************************************/ + +int mvx_session_construct(struct mvx_session *session, + struct device *dev, + struct mvx_client_ops *client_ops, + struct mvx_fw_cache *cache, + struct mutex *mutex, + void (*destructor)(struct mvx_session *session), + void (*event)(struct mvx_session *session, + enum mvx_session_event event, + void *arg), + struct dentry *dentry) +{ + int i; + int ret; + + if (event == NULL || destructor == NULL) + return -EINVAL; + + memset(session, 0, sizeof(*session)); + memset(session->setting_stride, 0, sizeof(session->setting_stride)); + memset(session->port[MVX_DIR_INPUT].stride, 0, sizeof(session->port[MVX_DIR_INPUT].stride)); + memset(session->port[MVX_DIR_INPUT].size, 0, sizeof(session->port[MVX_DIR_INPUT].size)); + memset(session->port[MVX_DIR_OUTPUT].stride, 0, sizeof(session->port[MVX_DIR_OUTPUT].stride)); + memset(session->port[MVX_DIR_OUTPUT].size, 0, sizeof(session->port[MVX_DIR_OUTPUT].size)); + memset(session->port[MVX_DIR_INPUT].display_size, 0, sizeof(session->port[MVX_DIR_INPUT].display_size)); + memset(session->port[MVX_DIR_OUTPUT].display_size, 0, sizeof(session->port[MVX_DIR_OUTPUT].display_size)); + session->dev = dev; + session->client_ops = client_ops; + session->cache = cache; + kref_init(&session->isession.kref); + session->isession.release = session_destructor; + session->isession.mutex = mutex; + session->destructor = destructor; + session->event = event; + session->fw_event.fw_bin_ready = fw_bin_ready; + session->fw_event.arg = session; + session->fw_state = MVX_FW_STATE_STOPPED; + init_waitqueue_head(&session->waitq); + session->dentry = dentry; + session->port[MVX_DIR_INPUT].buffer_min = 1; + session->port[MVX_DIR_OUTPUT].buffer_min = 1; + session->port[MVX_DIR_INPUT].buffer_allocated = 0;//1; + session->port[MVX_DIR_OUTPUT].buffer_allocated = 0;//1; + session->port[MVX_DIR_INPUT].scaling_shift = 0; + session->port[MVX_DIR_OUTPUT].scaling_shift = 0; + session->stream_escaping = MVX_TRI_UNSET; + session->ignore_stream_headers = MVX_TRI_UNSET; + session->frame_reordering = MVX_TRI_UNSET; + session->constr_ipred = MVX_TRI_UNSET; + session->entropy_sync = MVX_TRI_UNSET; + session->temporal_mvp = MVX_TRI_UNSET; + session->resync_interval = -1; + session->port[MVX_DIR_OUTPUT].roi_config_num = 0; + session->port[MVX_DIR_INPUT].roi_config_num = 0; + session->port[MVX_DIR_OUTPUT].qp_num = 0; + session->port[MVX_DIR_INPUT].qp_num = 0; + session->crop_left = 0; + session->crop_right = 0; + session->crop_top = 0; + session->crop_bottom = 0; + session->dsl_ratio.hor = 1; + session->dsl_ratio.ver = 1; + session->dsl_pos_mode = -1;//disable by default + session->profiling = 0; + session->rc_bit_i_mode = 0; + session->rc_bit_i_ratio = 0; + session->multi_sps_pps = 0; + session->enable_visual = 0; + session->forced_uv_value =0x400; + session->dsl_interp_mode =0xffff; + session->color_conv_mode = MVX_YUV_TO_RGB_MODE_BT601_LIMT; + session->use_cust_color_conv_coef =false; + session->use_cust_rgb_to_yuv_mode = MVX_CUST_YUV2RGB_MODE_UNSET; + memset(&session->color_conv_coef,0,sizeof(struct mvx_color_conv_coef)); + memset(&session->enc_src_crop,0,sizeof(struct mvx_crop_cfg)); + memset(&session->dec_dst_crop,0,sizeof(struct mvx_crop_cfg)); + memset(&session->seamless_target,0,sizeof(struct mvx_seamless_target)); + memset(&session->osd_info, 0, sizeof(session->osd_info)); + memset(&session->huff_table, 0, sizeof(session->huff_table)); + memset(&session->sei_userdata, 0, sizeof(session->sei_userdata)); + memset(&session->color_desc, 0, sizeof(session->color_desc)); + + ret = mvx_mmu_construct(&session->mmu, session->dev); + if (ret != 0) + return ret; + + for (i = 0; i < MVX_DIR_MAX; i++) + INIT_LIST_HEAD(&session->port[i].buffer_queue); + +#if KERNEL_VERSION(4, 14, 0) <= LINUX_VERSION_CODE + timer_setup(&session->watchdog_timer, watchdog_timeout, 0); +#else + setup_timer(&session->watchdog_timer, watchdog_timeout_legacy, + (uintptr_t)&session->watchdog_timer); +#endif + INIT_WORK(&session->watchdog_work, watchdog_work); + + return 0; +} + +void mvx_session_destruct(struct mvx_session *session) +{ + /* Destruct the session object. */ + + MVX_SESSION_INFO(session, "Destroy session."); + + release_fw_bin(session); + mvx_mmu_destruct(&session->mmu); +} + +void mvx_session_get(struct mvx_session *session) +{ + kref_get(&session->isession.kref); +} + +int mvx_session_put(struct mvx_session *session) +{ + return kref_put(&session->isession.kref, + session->isession.release); +} + +void mvx_session_get_formats(struct mvx_session *session, + enum mvx_direction dir, + uint64_t *formats) +{ + uint64_t fw_formats; + + session->client_ops->get_formats(session->client_ops, dir, formats); + mvx_fw_cache_get_formats(session->cache, dir, &fw_formats); + + *formats &= fw_formats; +} + +int mvx_session_try_format(struct mvx_session *session, + enum mvx_direction dir, + enum mvx_format format, + unsigned int *width, + unsigned int *height, + uint8_t *nplanes, + unsigned int *stride, + unsigned int *size, + bool *interlaced) +{ + return try_format(session, dir, format, width, height, nplanes, + stride, size, interlaced); +} + +int mvx_session_set_format(struct mvx_session *session, + enum mvx_direction dir, + enum mvx_format format, + unsigned int *width, + unsigned int *height, + uint8_t *nplanes, + unsigned int *stride, + unsigned int *size, + bool *interlaced) +{ + struct mvx_session_port *port = &session->port[dir]; + int ret; + + if (session->error != 0) + return session->error; + + if (is_stream_on(session) != false) + return -EBUSY; + + ret = try_format(session, dir, format, width, height, nplanes, + stride, size, interlaced); + if (ret != 0) + return ret; + + /* + * If the bitstream format changes, then the firmware binary must be + * released. + */ + if (mvx_is_bitstream(port->format) != false && + format != port->format) { + if (IS_ERR(session->fw_bin) != false) { + MVX_SESSION_WARN(session, + "Can't set format when firmware binary is pending. dir=%d.", + dir); + return -EINVAL; + } + + release_fw_bin(session); + } + + /* Update port settings. */ + port->format = format; + port->width = *width; + port->height = *height; + port->nplanes = *nplanes; + port->interlaced = *interlaced; + memcpy(port->stride, stride, sizeof(*stride) * MVX_BUFFER_NPLANES); + memcpy(port->size, size, sizeof(*size) * MVX_BUFFER_NPLANES); + + /* TODO AFBC width will have to be provided by user space. */ + if (dir == MVX_DIR_INPUT) + port->afbc_width = DIV_ROUND_UP(*width, 16); + + /* Input dimensions dictate output dimensions. */ + if (dir == MVX_DIR_INPUT) { + struct mvx_session_port *p = &session->port[MVX_DIR_OUTPUT]; + (void)try_format(session, MVX_DIR_OUTPUT, p->format, &p->width, + &p->height, &p->nplanes, p->stride, p->size, + &p->interlaced); + } + + return 0; +} + +int mvx_session_qbuf(struct mvx_session *session, + enum mvx_direction dir, + struct mvx_buffer *buf) +{ + int ret; + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) == false || + session->port[dir].is_flushing != false) { + list_add_tail(&buf->head, &session->port[dir].buffer_queue); + return 0; + } + + ret = queue_buffer(session, dir, buf); + if (ret != 0) + return ret; + + ret = switch_in(session); + if (ret != 0) + return ret; + + return 0; +} + +int mvx_session_send_eos(struct mvx_session *session) +{ + struct mvx_session_port *port = &session->port[MVX_DIR_OUTPUT]; + struct mvx_buffer *buf; + + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return fw_eos(session); + + if (list_empty(&port->buffer_queue) != false) { + MVX_SESSION_WARN(session, + "Unable to signal EOS. Output buffer queue empty."); + return 0; + } + + buf = list_first_entry(&port->buffer_queue, struct mvx_buffer, head); + list_del(&buf->head); + + mvx_buffer_clear(buf); + buf->flags |= MVX_BUFFER_EOS; + + session->event(session, MVX_SESSION_EVENT_BUFFER, buf); + + return 0; +} + +int mvx_session_streamon(struct mvx_session *session, + enum mvx_direction dir) +{ + enum mvx_direction bdir; + struct mvx_hw_ver hw_ver; + enum mvx_direction i; + int ret; + + MVX_SESSION_INFO(session, "Stream on. dir=%u.", dir); + + /* Verify that we don't enable an already activated port. */ + if (session->port[dir].stream_on != false) + return 0; + + session->port[dir].stream_on = true; + + /* Check that both ports are stream on. */ + if (!is_stream_on(session)) + return 0; + + /* Verify that a firmware binary load is not in progress. */ + if (IS_ERR(session->fw_bin)) { + ret = PTR_ERR(session->fw_bin); + goto disable_port; + } + + /* If a firmware binary is already loaded, then we are done. */ + if (session->fw_bin != NULL) { + ret = wait_pending(session); + if (ret != 0) + goto disable_port; + + ret = fw_state_change(session, MVX_FW_STATE_RUNNING); + if (ret != 0) + goto disable_port; + + return 0; + } + + bdir = get_bitstream_port(session); + if (bdir >= MVX_DIR_MAX) { + MVX_SESSION_WARN(session, + "Session only support decoding and encoding, but not transcoding. input_format=%u, output_format=%u.", + session->port[MVX_DIR_INPUT].format, + session->port[MVX_DIR_OUTPUT].format); + ret = -EINVAL; + goto disable_port; + } + + /* Verify that client can handle input and output formats. */ + for (i = MVX_DIR_INPUT; i < MVX_DIR_MAX; i++) { + uint64_t formats; + + session->client_ops->get_formats(session->client_ops, + i, &formats); + + if (!mvx_test_bit(session->port[i].format, &formats)) { + MVX_SESSION_WARN(session, + "Client cannot support requested formats. input_format=%u, output_format=%u.", + session->port[MVX_DIR_INPUT].format, + session->port[MVX_DIR_OUTPUT].format); + ret = -ENODEV; + goto disable_port; + } + } + + /* Increment session reference count and flag fw bin as pending. */ + mvx_session_get(session); + session->fw_bin = ERR_PTR(-EINPROGRESS); + session->client_ops->get_hw_ver(session->client_ops, &hw_ver); + + /* Requesting firmware binary to be loaded. */ + ret = mvx_fw_cache_get(session->cache, session->port[bdir].format, + bdir, &session->fw_event, &hw_ver, + session->isession.securevideo); + if (ret != 0) { + session->port[dir].stream_on = false; + session->fw_bin = NULL; + mvx_session_put(session); + return ret; + } + + return 0; + +disable_port: + session->port[dir].stream_on = false; + + return ret; +} + +int mvx_session_streamoff(struct mvx_session *session, + enum mvx_direction dir) +{ + struct mvx_session_port *port = &session->port[dir]; + struct mvx_buffer *buf; + struct mvx_buffer *tmp; + int ret = 0; + + MVX_SESSION_INFO(session, "Stream off. dir=%u.", dir); + + port->stream_on = false; + + if (is_fw_loaded(session) != false) { + /* + * Flush the ports if at least one buffer has been queued + * since last flush. + */ + if (port->flushed == false && port->is_flushing == false) { + ret = wait_pending(session); + if (ret != 0) + goto dequeue_buffers; + if (!(dir == MVX_DIR_OUTPUT && port->isreallocting == true)) { + ret = fw_state_change(session, MVX_FW_STATE_STOPPED); + if (ret != 0) + goto dequeue_buffers; + + ret = fw_flush(session, dir); + if (ret != 0) + goto dequeue_buffers; + } + ret = wait_pending(session); + if (ret != 0) + goto dequeue_buffers; + + send_irq(session); + } + } +dequeue_buffers: + if (ret != 0) + session_unregister(session); + + /* Return buffers in pending queue. */ + list_for_each_entry_safe(buf, tmp, &port->buffer_queue, head) { + list_del(&buf->head); + session->event(session, MVX_SESSION_EVENT_BUFFER, buf); + } + + return 0; +} + +static void handle_fw_message(struct mvx_session *session, + struct mvx_fw_msg *msg) +{ + switch (msg->code) { + case MVX_FW_CODE_ALLOC_PARAM: { + struct mvx_session_port *input = &session->port[MVX_DIR_INPUT]; + struct mvx_session_port *output = + &session->port[MVX_DIR_OUTPUT]; + /* Update input port. */ + input->width = msg->alloc_param.width; + input->height = msg->alloc_param.height; + + try_format(session, MVX_DIR_INPUT, input->format, &input->width, + &input->height, &input->nplanes, input->stride, + input->size, &input->interlaced); + + /* + * Update output port. Set number of valid planes to 0 to force + * stride to be recalculated. + */ + + output->nplanes = 0; + output->afbc_alloc_bytes = msg->alloc_param.afbc_alloc_bytes; + output->afbc_width = msg->alloc_param.afbc_width; + try_format(session, MVX_DIR_OUTPUT, output->format, + &output->width, &output->height, &output->nplanes, + output->stride, output->size, + &output->interlaced); + + MVX_SESSION_INFO(session, + "Firmware rsp: Alloc param. width=%u, height=%u, nplanes=%u, size=[%u, %u, %u], stride=[%u, %u, %u], interlaced=%d.", + msg->alloc_param.width, + msg->alloc_param.height, + output->nplanes, + output->size[0], + output->size[1], + output->size[2], + output->stride[0], + output->stride[1], + output->stride[2], + output->interlaced); + session->event(session, MVX_SESSION_EVENT_PORT_CHANGED, + (void *)MVX_DIR_OUTPUT); + break; + } + case MVX_FW_CODE_BUFFER_GENERAL: { + struct mvx_buffer *buf = msg->buf; + if(buf->dir == MVX_DIR_INPUT) + { + session->port[buf->dir].buffer_count--; + session->event(session, MVX_SESSION_EVENT_BUFFER, buf); + } + else + { + if( mvx_is_frame(buf->format)) + { + if(buf->general.header.type ==MVX_BUFFER_GENERAL_TYPE_AD_STATS) + { + MVX_SESSION_INFO(session, + "Firmware rsp: Buffer GENERAL. dir=%u, type=%u,frame_averages =0x%x thumbnail w/h=[%u, %u], ad_stats_flags=%x", + buf->dir, + buf->general.header.type, + buf->general.config.ad_stats.frame_averages, + buf->general.config.ad_stats.thumbnail_width, + buf->general.config.ad_stats.thumbnail_height, + buf->general.config.ad_stats.ad_stats_flags); + } + } + } + break; + } + case MVX_FW_CODE_BUFFER: { + struct mvx_buffer *buf = msg->buf; + struct mvx_session_port *output = + &session->port[MVX_DIR_OUTPUT]; + + /* + * There is no point to flush or invalidate input buffer + * after it was returned from the HW. + */ + if(buf->dir == MVX_DIR_OUTPUT && mvx_is_frame(buf->format)) { + if (!(buf->flags & MVX_BUFFER_FRAME_PRESENT)) { + int i=0; + for(i=0;inplanes;i++) + { + if (output->size[i] > mvx_buffer_size(buf, i) + || session->port[buf->dir].buffer_allocated < session->port[buf->dir].buffer_min) + { + buf->flags |= MVX_BUFFER_FRAME_NEED_REALLOC; + //output->isreallocting = true; + } + } + } + } + if (buf->dir == MVX_DIR_OUTPUT && session->port[MVX_DIR_INPUT].format == MVX_FORMAT_AV1 && + (buf->width != output->width || buf->height != output->height)) + { + uint32_t i; + uint32_t filled[MVX_BUFFER_NPLANES]; + uint32_t stride[MVX_BUFFER_NPLANES]; + memset(filled,0,sizeof(filled)); + memset(stride,0,sizeof(stride)); + output->nplanes = 0; + mvx_buffer_frame_dim(output->format, buf->width, buf->height, &output->nplanes, + stride, filled, session->setting_stride); + for (i = 0; i < buf->nplanes; i++) + { + (void)mvx_buffer_filled_set(buf, i, filled[i], 0); + } + + MVX_SESSION_INFO(session, + "Firmware rsp: Buffer. dir=%u, len=[%u, %u, %u], flags=0x%08x, eos=%u", + buf->dir, + filled[0], + filled[1], + filled[2], + buf->flags, + (buf->flags & MVX_BUFFER_EOS) != 0); + } + session->port[buf->dir].buffer_count--; + + MVX_SESSION_INFO(session, + "Firmware rsp: Buffer. dir=%u, len=[%u, %u, %u], flags=0x%08x, eos=%u", + buf->dir, + buf->planes[0].filled, + buf->planes[1].filled, + buf->planes[2].filled, + buf->flags, + (buf->flags & MVX_BUFFER_EOS) != 0); + if (buf->dir == MVX_DIR_OUTPUT) + mvx_buffer_synch(buf, DMA_FROM_DEVICE); + + session->event(session, MVX_SESSION_EVENT_BUFFER, buf); + break; + } + case MVX_FW_CODE_DISPLAY_SIZE: { + if (session->port[MVX_DIR_INPUT].format == MVX_FORMAT_AV1) { + uint32_t stride[MVX_BUFFER_NPLANES]; + uint32_t i; + struct mvx_session_port *output = + &session->port[MVX_DIR_OUTPUT]; + + output->nplanes = 0; + memset(stride,0,sizeof(stride)); + mvx_buffer_frame_dim(output->format, msg->disp_size.display_width, msg->disp_size.display_height, + &output->nplanes, stride, output->display_size, session->setting_stride); + for (i = 0; i < MVX_BUFFER_NPLANES; i++) + { + session->setting_stride[i] = max_t(unsigned int, session->setting_stride[i], stride[i]); + } + MVX_SESSION_INFO(session, + "Firmware rsp: display size. len=[%u, %u, %u]", + output->display_size[0], + output->display_size[1], + output->display_size[2]); + } + break; + } + case MVX_FW_CODE_COLOR_DESC: { + MVX_SESSION_INFO(session, + "Firmware rsp: Color desc."); + session->color_desc = msg->color_desc; + session->event(session, MVX_SESSION_EVENT_COLOR_DESC, NULL); + break; + } + case MVX_FW_CODE_ERROR: { + MVX_SESSION_WARN(session, + "Firmware rsp: Error. code=%u, message=%s.", + msg->error.error_code, msg->error.message); + + /* + * Release the dev session. It will prevent a dead session from + * blocking the scheduler. + */ + watchdog_stop(session); + session_unregister(session); + send_event_error(session, -EINVAL); + break; + } + case MVX_FW_CODE_FLUSH: { + MVX_SESSION_INFO(session, "Firmware rsp: Flushed. dir=%d.", + msg->flush.dir); + session->port[msg->flush.dir].is_flushing = false; + session->port[msg->flush.dir].flushed = true; + (void)queue_pending_buffers(session, msg->flush.dir); + break; + } + case MVX_FW_CODE_IDLE: { + int ret; + struct mvx_fw_msg msg_ack; + + MVX_SESSION_INFO(session, "Firmware rsp: Idle."); + + session->idle_count++; + + if (session->idle_count == 2) + fw_switch_out(session); + + msg_ack.code = MVX_FW_CODE_IDLE_ACK; + ret = session->fw.ops.put_message(&session->fw, &msg_ack); + if (ret == 0) + ret = send_irq(session); + + if (ret != 0) + send_event_error(session, ret); + + break; + } + case MVX_FW_CODE_JOB: { + MVX_SESSION_INFO(session, "Firmware rsp: Job."); + (void)fw_job(session, 1); + break; + } + case MVX_FW_CODE_PONG: + MVX_SESSION_INFO(session, "Firmware rsp: Pong."); + break; + case MVX_FW_CODE_SEQ_PARAM: { + struct mvx_session_port *p = &session->port[MVX_DIR_OUTPUT]; + + MVX_SESSION_INFO(session, + "Firmware rsp: Seq param. planar={buffers_min=%u}, afbc={buffers_min=%u}, interlaced=%d.", + msg->seq_param.planar.buffers_min, + msg->seq_param.afbc.buffers_min, + p->interlaced); + + if (mvx_is_afbc(p->format) != false) + p->buffer_min = msg->seq_param.afbc.buffers_min; + else + p->buffer_min = msg->seq_param.planar.buffers_min; + + (void)fw_flush(session, MVX_DIR_OUTPUT); + break; + } + case MVX_FW_CODE_SET_OPTION: { + MVX_SESSION_INFO(session, "Firmware rsp: Set option."); + break; + } + case MVX_FW_CODE_STATE_CHANGE: { + MVX_SESSION_INFO(session, + "Firmware rsp: State changed. old=%s, new=%s.", + state_to_string(session->fw_state), + state_to_string(msg->state)); + session->fw_state = msg->state; + break; + } + case MVX_FW_CODE_SWITCH_IN: { + watchdog_start(session, session_watchdog_timeout); + break; + } + case MVX_FW_CODE_SWITCH_OUT: { + MVX_SESSION_INFO(session, "Firmware rsp: Switched out."); + + watchdog_stop(session); + session->switched_in = false; + + if ((session->fw_state == MVX_FW_STATE_RUNNING && + session->idle_count < 2) || + session->fw.msg_pending > 0) + switch_in(session); + + break; + } + case MVX_FW_CODE_DUMP: + break; + case MVX_FW_CODE_DEBUG: + break; + case MVX_FW_CODE_UNKNOWN: { + print_debug(session); + break; + } + case MVX_FW_CODE_MAX: + break; + default: + MVX_SESSION_WARN(session, "Unknown fw msg code. code=%u.", + msg->code); + } +} + +void mvx_session_irq(struct mvx_if_session *isession) +{ + struct mvx_session *session = mvx_if_session_to_session(isession); + int ret; + + if (is_fw_loaded(session) == false) + return; + + ret = session->fw.ops.handle_rpc(&session->fw); + if (ret < 0) { + send_event_error(session, ret); + return; + } + + do { + struct mvx_fw_msg msg; + + watchdog_update(session, session_watchdog_timeout); + + ret = session->fw.ops.get_message(&session->fw, &msg); + if (ret < 0) { + session_unregister(session); + send_event_error(session, ret); + return; + } + + if (ret > 0) + handle_fw_message(session, &msg); + } while (ret > 0 && session->error == 0); + + ret = session->fw.ops.handle_fw_ram_print(&session->fw); + if (ret < 0) { + send_event_error(session, ret); + return; + } + + wake_up(&session->waitq); +} + +void mvx_session_port_show(struct mvx_session_port *port, + struct seq_file *s) +{ + mvx_seq_printf(s, "mvx_session_port", 0, "%p\n", port); + mvx_seq_printf(s, "format", 1, "%08x\n", port->format); + mvx_seq_printf(s, "width", 1, "%u\n", port->width); + mvx_seq_printf(s, "height", 1, "%u\n", port->height); + mvx_seq_printf(s, "buffer_min", 1, "%u\n", port->buffer_min); + mvx_seq_printf(s, "buffer_count", 1, "%u\n", port->buffer_count); +} + +int mvx_session_set_securevideo(struct mvx_session *session, + bool securevideo) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->isession.securevideo = securevideo; + + return 0; +} + +int mvx_session_set_frame_rate(struct mvx_session *session, + int64_t frame_rate) +{ + int ret; + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) { + struct mvx_fw_set_option option; + + option.code = MVX_FW_SET_FRAME_RATE; + option.frame_rate = frame_rate; + ret = fw_set_option(session, &option); + if (ret != 0) + return ret; + } + + session->frame_rate = frame_rate; + + return 0; +} + +int mvx_session_set_rate_control(struct mvx_session *session, + bool enabled) +{ + if (session->error != 0) + return session->error; + + session->rc_enabled = enabled; + + return 0; +} + +int mvx_session_set_bitrate(struct mvx_session *session, + int bitrate) +{ + int ret; + + if (session->error != 0) + return session->error; + + session->target_bitrate = bitrate; + + if (is_fw_loaded(session) != false && session->rc_enabled != false) { + struct mvx_fw_set_option option; + + option.code = MVX_FW_SET_RATE_CONTROL; + option.rate_control.target_bitrate = session->target_bitrate; + option.rate_control.rate_control_mode = session->rc_type; + + ret = fw_set_option(session, &option); + if (ret != 0) + return ret; + } + + return 0; +} + +int mvx_session_set_bitrate_control(struct mvx_session *session, + struct mvx_buffer_param_rate_control *rc){ + int ret; + + if (session->error != 0) + return session->error; + + session->rc_type = rc->rate_control_mode; + session->target_bitrate = rc->target_bitrate; + session->maximum_bitrate = rc->maximum_bitrate; + if (is_fw_loaded(session) != false && session->port[get_bitstream_port(session)].format != MVX_FORMAT_JPEG) { + struct mvx_fw_set_option option; + + option.code = MVX_FW_SET_RATE_CONTROL; + option.rate_control.target_bitrate = rc->target_bitrate; + option.rate_control.rate_control_mode = rc->rate_control_mode; + if (rc->rate_control_mode == MVX_OPT_RATE_CONTROL_MODE_C_VARIABLE) { + option.rate_control.maximum_bitrate = rc->maximum_bitrate; + } + ret = fw_set_option(session, &option); + if (ret != 0) + return ret; + } + return 0; +} + +int mvx_session_set_crop_left(struct mvx_session * session, int32_t left){ + + if (session->error != 0) + return session->error; + + session->crop_left = left; + + if (is_fw_loaded(session) != false) { + return -EBUSY; + } + return 0; + +} + +int mvx_session_set_crop_right(struct mvx_session * session, int32_t right){ + + if (session->error != 0) + return session->error; + + session->crop_right = right; + + if (is_fw_loaded(session) != false) { + return -EBUSY; + } + return 0; + +} + +int mvx_session_set_crop_top(struct mvx_session * session, int32_t top){ + + if (session->error != 0) + return session->error; + + session->crop_top = top; + + if (is_fw_loaded(session) != false) { + return -EBUSY; + } + return 0; + +} + +int mvx_session_set_crop_bottom(struct mvx_session * session, int32_t bottom){ + + if (session->error != 0) + return session->error; + + session->crop_bottom = bottom; + + if (is_fw_loaded(session) != false) { + return -EBUSY; + } + return 0; + +} + +int mvx_session_set_rc_bit_i_mode(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + session->rc_bit_i_mode = val; + + if (is_fw_loaded(session) != false) { + return -EBUSY; + } + return 0; +} + +int mvx_session_set_rc_bit_i_ratio(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + session->rc_bit_i_ratio = val; + + if (is_fw_loaded(session) != false) { + return -EBUSY; + } + return 0; +} + +int mvx_session_set_inter_med_buf_size(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + session->inter_med_buf_size = val; + + if (is_fw_loaded(session) != false) { + return -EBUSY; + } + return 0; +} + +int mvx_session_set_svct3_level1_period(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + session->svct3_level1_period = val; + + if (is_fw_loaded(session) != false) { + return -EBUSY; + } + return 0; +} + +int mvx_session_set_nalu_format(struct mvx_session *session, + enum mvx_nalu_format fmt) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->nalu_format = fmt; + + return 0; +} + +int mvx_session_set_stream_escaping(struct mvx_session *session, + enum mvx_tristate status) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->stream_escaping = status; + + return 0; +} + +int mvx_session_set_profile(struct mvx_session *session, + enum mvx_format format, + enum mvx_profile profile) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->profile[format] = profile; + + return 0; +} + +int mvx_session_set_level(struct mvx_session *session, + enum mvx_format format, + enum mvx_level level) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->level[format] = level; + + return 0; +} + +int mvx_session_set_ignore_stream_headers(struct mvx_session *session, + enum mvx_tristate status) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->ignore_stream_headers = status; + + return 0; +} + +int mvx_session_set_frame_reordering(struct mvx_session *session, + enum mvx_tristate status) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->frame_reordering = status; + + return 0; +} + +int mvx_session_set_intbuf_size(struct mvx_session *session, + int size) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->intbuf_size = size; + + return 0; +} + +int mvx_session_set_p_frames(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->p_frames = val; + + return 0; +} + +int mvx_session_set_b_frames(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->b_frames = val; + + return 0; +} + +int mvx_session_set_gop_type(struct mvx_session *session, + enum mvx_gop_type gop_type) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->gop_type = gop_type; + + return 0; +} + +int mvx_session_set_cyclic_intra_refresh_mb(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->cyclic_intra_refresh_mb = val; + return 0; +} + +int mvx_session_set_constr_ipred(struct mvx_session *session, + enum mvx_tristate status) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->constr_ipred = status; + + return 0; +} + +int mvx_session_set_entropy_sync(struct mvx_session *session, + enum mvx_tristate status) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->entropy_sync = status; + + return 0; +} + +int mvx_session_set_temporal_mvp(struct mvx_session *session, + enum mvx_tristate status) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->temporal_mvp = status; + + return 0; +} + +int mvx_session_set_tile_rows(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->tile_rows = val; + + return 0; +} + +int mvx_session_set_tile_cols(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->tile_cols = val; + + return 0; +} + +int mvx_session_set_min_luma_cb_size(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + if (val == 8 || val == 16){ + session->min_luma_cb_size = val; + } else { + session->min_luma_cb_size = 0; + } + return 0; +} + +int mvx_session_set_mb_mask(struct mvx_session *session, + int val) +{ + /* + * This controls is not implemented. + */ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->mb_mask = val; + + return 0; +} + +int mvx_session_set_entropy_mode(struct mvx_session *session, + enum mvx_entropy_mode mode) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->entropy_mode = mode; + + return 0; +} + +int mvx_session_set_multi_slice_mode(struct mvx_session *session, + enum mvx_multi_slice_mode mode) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->multi_slice_mode = mode; + + return 0; +} + +int mvx_session_set_multi_slice_max_mb(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->multi_slice_max_mb = val; + + return 0; +} + +int mvx_session_set_vp9_prob_update(struct mvx_session *session, + enum mvx_vp9_prob_update mode) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->vp9_prob_update = mode; + + return 0; +} + +int mvx_session_set_mv_h_search_range(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->mv_h_search_range = val; + + return 0; +} + +int mvx_session_set_mv_v_search_range(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->mv_v_search_range = val; + + return 0; +} + +int mvx_session_set_bitdepth_chroma(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->bitdepth_chroma = val; + + return 0; +} + +int mvx_session_set_bitdepth_luma(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->bitdepth_luma = val; + + return 0; +} + +int mvx_session_set_force_chroma_format(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->force_chroma_format = val; + + return 0; +} + +int mvx_session_set_rgb_to_yuv_mode(struct mvx_session *session, + enum mvx_rgb_to_yuv_mode mode) +{ + if(mode == MVX_RGB_TO_YUV_MODE_MAX) + return 0; + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->rgb_to_yuv = mode; + session->use_cust_rgb_to_yuv_mode = MVX_CUST_YUV2RGB_MODE_STANDARD; + + return 0; +} + +int mvx_session_set_band_limit(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->band_limit = val; + + return 0; +} + +int mvx_session_set_cabac_init_idc(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->cabac_init_idc = val; + + return 0; +} + +int mvx_session_set_i_frame_qp(struct mvx_session *session, + enum mvx_format fmt, + int qp) +{ + int ret; + + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) { + enum mvx_direction dir = get_bitstream_port(session); + + fmt = session->port[dir].format; + ret = fw_set_qp(session, MVX_FW_SET_QP_I, qp); + if (ret != 0) + return ret; + } + + session->qp[fmt].i_frame = qp; + + return 0; +} + +int mvx_session_set_p_frame_qp(struct mvx_session *session, + enum mvx_format fmt, + int qp) +{ + int ret; + + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) { + enum mvx_direction dir = get_bitstream_port(session); + + fmt = session->port[dir].format; + ret = fw_set_qp(session, MVX_FW_SET_QP_P, qp); + if (ret != 0) + return ret; + } + + session->qp[fmt].p_frame = qp; + + return 0; +} + +int mvx_session_set_b_frame_qp(struct mvx_session *session, + enum mvx_format fmt, + int qp) +{ + int ret; + + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) { + enum mvx_direction dir = get_bitstream_port(session); + + fmt = session->port[dir].format; + ret = fw_set_qp(session, MVX_FW_SET_QP_B, qp); + if (ret != 0) + return ret; + } + + session->qp[fmt].b_frame = qp; + + return 0; +} + +int mvx_session_set_min_qp(struct mvx_session *session, + enum mvx_format fmt, + int qp) +{ + int ret; + + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) { + struct mvx_fw_set_option option; + enum mvx_direction dir = get_bitstream_port(session); + int codec = session->port[dir].format; + + option.code = MVX_FW_SET_QP_RANGE; + option.qp_range.min = qp; + option.qp_range.max = session->qp[codec].max; + ret = fw_set_option(session, &option); + if (ret != 0) + return ret; + } + + session->qp[fmt].min = qp; + + return 0; +} + +int mvx_session_set_max_qp(struct mvx_session *session, + enum mvx_format fmt, + int qp) +{ + int ret; + + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) { + struct mvx_fw_set_option option; + enum mvx_direction dir = get_bitstream_port(session); + int codec = session->port[dir].format; + + option.code = MVX_FW_SET_QP_RANGE; + option.qp_range.min = session->qp[codec].min; + option.qp_range.max = qp; + ret = fw_set_option(session, &option); + if (ret != 0) + return ret; + } + + session->qp[fmt].max = qp; + + return 0; +} + +int mvx_session_set_resync_interval(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->resync_interval = val; + + return 0; +} + +int mvx_session_set_jpeg_quality(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->jpeg_quality = val; + + return 0; +} + +int mvx_session_set_jpeg_quality_luma(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->jpeg_quality_luma = val; + + return 0; +} + +int mvx_session_set_jpeg_quality_chroma(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->jpeg_quality_chroma = val; + + return 0; +} + + +int mvx_session_get_color_desc(struct mvx_session *session, + struct mvx_fw_color_desc *color_desc) +{ + *color_desc = session->color_desc; + return 0; +} + +int mvx_session_set_color_desc(struct mvx_session *session, + struct mvx_fw_color_desc *color_desc) +{ + int ret = 0; + if (session->error != 0) + return session->error; + + session->color_desc = *color_desc; + if (is_fw_loaded(session) != false) { + struct mvx_fw_set_option option; + + option.code = MVX_FW_SET_COLOUR_DESC; + option.colour_desc = *color_desc; + ret = fw_set_option(session, &option); + if (ret != 0) + return ret; + } + return 0; +} + +int mvx_session_set_osd_config(struct mvx_session *session, + struct mvx_osd_config *osd) +{ + int ret = 0; + int osd_cfg_num = 0; + if (is_fw_loaded(session) == false || + session->port[MVX_DIR_INPUT].is_flushing != false) { + osd_cfg_num = session->port[MVX_DIR_INPUT].osd_cfg_num; + if (osd_cfg_num < MVX_ROI_QP_NUMS) { + MVX_SESSION_INFO(session, "fw is not ready!!!, pending osd num:%d",osd_cfg_num); + session->port[MVX_DIR_INPUT].osd_cfg_queue[osd_cfg_num] = *osd; + session->port[MVX_DIR_INPUT].osd_cfg_num++; + } else { + MVX_SESSION_ERR(session, "fw is not ready for long time, too many osd pending:%d",osd_cfg_num); + } + return 0; + } + ret = queue_osd_config(session, osd); + return ret; +} + +int mvx_session_set_osd_info(struct mvx_session *session, + struct mvx_osd_info *osd) +{ + session->osd_info = *osd; + return 0; +}; + +int mvx_session_set_roi_regions(struct mvx_session *session, + struct mvx_roi_config *roi) +{ + int ret = 0; + int roi_config_num = 0; + if (is_fw_loaded(session) == false || + session->port[MVX_DIR_INPUT].is_flushing != false) { + roi_config_num = session->port[MVX_DIR_INPUT].roi_config_num; + if (roi_config_num < MVX_ROI_QP_NUMS) { + MVX_SESSION_INFO(session, "fw is not ready!!!, pending roi num:%d",roi_config_num); + session->port[MVX_DIR_INPUT].roi_config_queue[roi_config_num] = *roi; + session->port[MVX_DIR_INPUT].roi_config_num++; + } else { + MVX_SESSION_ERR(session, "fw is not ready for long time, too many roi pending:%d",roi_config_num); + } + return 0; + } + ret = queue_roi_regions(session, roi); + return 0; +} + +int mvx_session_set_qp_epr(struct mvx_session *session, + struct mvx_buffer_param_qp *qp) +{ + int ret = 0; + int qp_num = 0; + if (is_fw_loaded(session) == false || + session->port[MVX_DIR_INPUT].is_flushing != false) { + qp_num = session->port[MVX_DIR_INPUT].qp_num; + if (qp_num < MVX_ROI_QP_NUMS) { + MVX_SESSION_WARN(session, "fw is not ready!!!, pending qp num:%d",qp_num); + session->port[MVX_DIR_INPUT].qp_queue[qp_num] = *qp; + session->port[MVX_DIR_INPUT].qp_num++; + } else { + MVX_SESSION_ERR(session, "fw is not ready for long time, too many qp pending:%d",qp_num); + } + return 0; + } + ret = queue_qp_epr(session, qp); + return 0; +} + +int mvx_session_set_sei_userdata(struct mvx_session *session, + struct mvx_sei_userdata *userdata) +{ + int ret = 0; + if (session->error != 0) + return session->error; + + session->sei_userdata = *userdata; + if (is_fw_loaded(session) != false) { + struct mvx_fw_set_option option; + + option.code = MVX_FW_SET_SEI_USERDATA; + option.userdata = *userdata; + ret = fw_set_option(session, &option); + if (ret != 0) + return ret; + } + return ret; +} + +int mvx_session_set_hrd_buffer_size(struct mvx_session *session, + int size) +{ + int ret; + + if (session->error != 0) + return session->error; + + session->nHRDBufsize = size; + + if (is_fw_loaded(session) != false) { + struct mvx_fw_set_option option; + + option.code = MVX_FW_SET_HRD_BUF_SIZE; + option.nHRDBufsize = size; + ret = fw_set_option(session, &option); + if (ret != 0) + return ret; + } + return 0; +} + +int mvx_session_set_dsl_frame(struct mvx_session *session, + struct mvx_dsl_frame *dsl) +{ + if (session->error != 0) + return session->error; + + session->dsl_frame.width = dsl->width; + session->dsl_frame.height = dsl->height; + if (is_fw_loaded(session) != false) { + return -EBUSY; + } + return 0; +} + +int mvx_session_set_dsl_ratio(struct mvx_session *session, + struct mvx_dsl_ratio *dsl) +{ + if (session->error != 0) + return session->error; + + session->dsl_ratio.hor = dsl->hor; + session->dsl_ratio.ver = dsl->ver; + return 0; +} + +int mvx_session_set_long_term_ref(struct mvx_session *session, + struct mvx_long_term_ref *ltr) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) { + return -EBUSY; + } + + session->mvx_ltr.mode = ltr->mode; + session->mvx_ltr.period = ltr->period; + return 0; +} + +int mvx_session_set_dsl_mode(struct mvx_session *session, + int *mode) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->dsl_pos_mode = *mode; + + return 0; +} + +int mvx_session_set_mini_frame_height(struct mvx_session *session, + int *height) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->mini_frame_height = *height; + return 0; +} + +int mvx_session_set_stats_mode(struct mvx_session *session, + struct mvx_enc_stats *stats) +{ + int ret = 0; + int enc_stats_num = 0; + if (is_fw_loaded(session) == false || + session->port[MVX_DIR_INPUT].is_flushing != false) { + enc_stats_num = session->port[MVX_DIR_INPUT].enc_stats_num; + if (enc_stats_num < MVX_ROI_QP_NUMS) { + MVX_SESSION_INFO(session, "fw is not ready!!!, pending enc stats num:%d",enc_stats_num); + session->port[MVX_DIR_INPUT].enc_stats_queue[enc_stats_num] = *stats; + session->port[MVX_DIR_INPUT].enc_stats_num++; + } else { + MVX_SESSION_ERR(session, "fw is not ready for long time, too many enc stats pending:%d",enc_stats_num); + } + return 0; + } + ret = queue_enc_stats(session, stats); + return ret; +} + +int mvx_session_set_chr_cfg(struct mvx_session *session, + struct mvx_chr_cfg *chr_cfg) +{ + int ret = 0; + int chr_cfg_num = 0; + if (is_fw_loaded(session) == false || + session->port[MVX_DIR_INPUT].is_flushing != false) { + chr_cfg_num = session->port[MVX_DIR_INPUT].chr_cfg_num; + if (chr_cfg_num < MVX_ROI_QP_NUMS) { + MVX_SESSION_INFO(session, "fw is not ready!!!, pending chr cfg num:%d",chr_cfg_num); + session->port[MVX_DIR_INPUT].chr_cfg_queue[chr_cfg_num] = *chr_cfg; + session->port[MVX_DIR_INPUT].chr_cfg_num++; + } else { + MVX_SESSION_ERR(session, "fw is not ready for long time, too many chr cfg pending:%d",chr_cfg_num); + } + return 0; + } + ret = queue_chr_cfg(session, chr_cfg); + return ret; +} + +int mvx_session_set_huff_table (struct mvx_session *session, + struct mvx_huff_table *table) +{ + if (is_fw_loaded(session) !=false) + return -EBUSY; + memcpy(&session->huff_table, table, sizeof(struct mvx_huff_table)); + return 0; +} + +int mvx_session_set_seamless_target (struct mvx_session *session, + struct mvx_seamless_target *seamless) +{ + if (is_fw_loaded(session) !=false) + return -EBUSY; + memcpy(&session->seamless_target, seamless, sizeof(struct mvx_seamless_target)); + return 0; +} + +int mvx_session_set_init_qp_i(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->init_qpi = val; + + return 0; +} + +int mvx_session_set_init_qp_p(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->init_qpp = val; + + return 0; +} + +int mvx_session_set_sao_luma(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->sao_luma = val; + + return 0; +} + +int mvx_session_set_sao_chroma(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->sao_chroma = val; + + return 0; +} + +int mvx_session_set_delta_I_P(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->qp_delta_i_p = val; + + return 0; +} + +int mvx_session_set_ref_rb_eb(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->ref_rb_en = val; + + return 0; +} + +int mvx_session_set_rc_clip_top(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->rc_qp_clip_top = val; + + return 0; +} + +int mvx_session_set_rc_clip_bot(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->rc_qp_clip_bot = val; + + return 0; +} + +int mvx_session_set_qpmap_clip_top(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->qpmap_qp_clip_top = val; + + return 0; +} + +int mvx_session_set_qpmap_clip_bot(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->qpmap_qp_clip_bot = val; + + return 0; +} +int mvx_session_set_max_qp_i(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + { + int ret; + struct mvx_fw_set_option option; + option.code = MVX_FW_SET_QP_RANGE_I; + option.qp_range.min = session->min_qp_i; + option.qp_range.max = val; + ret = fw_set_option(session, &option); + if (ret != 0) + return ret; + } + session->max_qp_i = val; + + return 0; + +} + +int mvx_session_set_min_qp_i(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + { + int ret; + struct mvx_fw_set_option option; + option.code = MVX_FW_SET_QP_RANGE_I; + option.qp_range.min = val; + option.qp_range.max = session->max_qp_i; + ret = fw_set_option(session, &option); + if (ret != 0) + return ret; + } + + session->min_qp_i = val; + + return 0; +} + +int mvx_session_set_fixedqp(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->fixedqp = val; + + return 0; + +} +int mvx_session_set_fw_profiling(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->profiling = val; + + return 0; + +} + +int mvx_session_set_visible_width(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + session->visible_width = val; + + return 0; + +} + +int mvx_session_set_visible_height(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + session->visible_height = val; + + return 0; + +} + +int mvx_session_set_gop_reset_pframes(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + { + int ret; + struct mvx_fw_set_option option; + option.code = MVX_FW_SET_GOP_PFRAMES; + option.reset_gop_pframes = val; + ret = fw_set_option(session, &option); + if (ret != 0) + return ret; + } + + session->reset_gop_pframes = val; + return 0; +} + +int mvx_session_set_ltr_reset_period(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + { + int ret; + struct mvx_fw_set_option option; + option.code = MVX_FW_SET_LTR_PERIOD; + option.reset_ltr_period = val; + ret = fw_set_option(session, &option); + if (ret != 0) + return ret; + } + + session->reset_ltr_period = val; + return 0; +} + +int mvx_session_set_gdr_number(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->gdr_number = val; + + return 0; +} + +int mvx_session_set_gdr_period(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->gdr_period = val; + + return 0; +} + +int mvx_session_set_multi_sps_pps(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->multi_sps_pps = val; + + return 0; +} + +int mvx_session_set_enable_visual(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->enable_visual = val; + + return 0; +} + +int mvx_session_set_adaptive_intra_block(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->adaptive_intra_block = val; + + return 0; + +} + +int mvx_session_set_scd_enable(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->scd_enable = val; + + return 0; +} + +int mvx_session_set_scd_percent(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->scd_percent = val; + + return 0; +} + +int mvx_session_set_scd_threshold(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->scd_threshold = val; + + return 0; +} + +int mvx_session_set_aq_ssim_en(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->aq_ssim_en = val; + + return 0; +} + +int mvx_session_set_aq_neg_ratio(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->aq_neg_ratio = val; + + return 0; +} + +int mvx_session_set_aq_pos_ratio(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->aq_pos_ratio = val; + + return 0; +} + +int mvx_session_set_aq_qpdelta_lmt(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->aq_qpdelta_lmt = val; + + return 0; +} + +int mvx_session_set_aq_init_frm_avg_svar(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->aq_init_frm_avg_svar = val; + + return 0; +} + +int mvx_session_set_color_conversion(struct mvx_session *session, + enum mvx_yuv_to_rgb_mode mode) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + session->color_conv_mode = mode; + session->use_cust_color_conv_coef=false; + + return 0; +} + +int mvx_session_set_color_conversion_ceof(struct mvx_session *session, + struct mvx_color_conv_coef *conv_coef) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + memcpy(&session->color_conv_coef, conv_coef, sizeof(struct mvx_color_conv_coef)); + session->use_cust_color_conv_coef=true; + + return 0; +} + +int mvx_session_set_rgb_conv_yuv_coef(struct mvx_session *session, + struct mvx_rgb2yuv_color_conv_coef *conv_coef) +{ + if (session->error != 0) + return session->error; + if (is_fw_loaded(session) != false) + return -EBUSY; + + memcpy(&session->rgb2yuv_color_conv_coef, conv_coef, sizeof(struct mvx_rgb2yuv_color_conv_coef)); + session->use_cust_color_conv_coef=true; + session->use_cust_rgb_to_yuv_mode = MVX_CUST_YUV2RGB_MODE_CUSTOMIZED; + + return 0; +} + +int mvx_session_set_forced_uv_value(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->forced_uv_value = val; + + return 0; +} + +int mvx_session_set_dsl_interpolation_mode(struct mvx_session *session, + int mode) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->dsl_interp_mode = mode; + + return 0; +} + +int mvx_session_set_disabled_features(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->disabled_features = val; + + return 0; +} + +int mvx_session_set_change_pos(struct mvx_session *session, + int val) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + session->change_pos = val; + + return 0; +} + +int mvx_session_set_enc_src_crop(struct mvx_session *session, + struct mvx_crop_cfg *crop) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + memcpy(&session->enc_src_crop, crop, sizeof(struct mvx_crop_cfg)); + + return 0; +} + +int mvx_session_set_dec_dst_crop(struct mvx_session *session, + struct mvx_crop_cfg *crop) +{ + if (session->error != 0) + return session->error; + + if (is_fw_loaded(session) != false) + return -EBUSY; + + memcpy(&session->dec_dst_crop, crop, sizeof(struct mvx_crop_cfg)); + + return 0; +} diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_session.h b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_session.h new file mode 100755 index 000000000..f76f5cf59 --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_session.h @@ -0,0 +1,1311 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef _MVX_SESSION_H_ +#define _MVX_SESSION_H_ + +/**************************************************************************** + * Includes + ****************************************************************************/ + +#include +#include +#include +#include +#include +#include "mvx_buffer.h" +#include "mvx_firmware.h" +#include "mvx_firmware_cache.h" +#include "mvx_if.h" +#include "mvx_log_group.h" + +/**************************************************************************** + * Defines + ****************************************************************************/ + +#define MVX_SESSION_LOG(severity, session, msg, ...) \ + MVX_LOG_PRINT_SESSION(&mvx_log_session_if, severity, session, \ + msg, ## __VA_ARGS__) + +#define MVX_SESSION_VERBOSE(session, msg, ...) \ + MVX_SESSION_LOG(MVX_LOG_VERBOSE, session, msg, ## __VA_ARGS__) + +#define MVX_SESSION_DEBUG(session, msg, ...) \ + MVX_SESSION_LOG(MVX_LOG_DEBUG, session, msg, ## __VA_ARGS__) + +#define MVX_SESSION_INFO(session, msg, ...) \ + MVX_SESSION_LOG(MVX_LOG_INFO, session, msg, ## __VA_ARGS__) + +#define MVX_SESSION_WARN(session, msg, ...) \ + MVX_SESSION_LOG(MVX_LOG_WARNING, session, msg, ## __VA_ARGS__) + +#define MVX_SESSION_ERR(session, msg, ...) \ + MVX_SESSION_LOG(MVX_LOG_ERROR, session, msg, ## __VA_ARGS__) + +/**************************************************************************** + * Types + ****************************************************************************/ + +struct device; +struct file; +struct mvx_csched; +struct mvx_fw_cache; +struct poll_table_struct; + +/** + * enum mvx_session_event - Session events. + * @MVX_SESSION_EVENT_BUFFER: struct mvx_buffer. + * @MVX_SESSION_EVENT_PORT_CHANGED: enum mvx_direction. + * @MVX_SESSION_EVENT_COLOR_DESC: struct mvx_fw_color_desc. + * @MVX_SESSION_EVENT_ERROR: void + */ +enum mvx_session_event { + MVX_SESSION_EVENT_BUFFER, + MVX_SESSION_EVENT_PORT_CHANGED, + MVX_SESSION_EVENT_COLOR_DESC, + MVX_SESSION_EVENT_ERROR +}; + +/** + * struct mvx_session_port - Session input and output port settings. + * @format: Port format. + * @width: Width in pixels. + * @height: Height in pixels. + * @nplanes: Number for planes for current format. + * @stride: Stride per line in bytes for each plane. + * @size: Size in bytes for each plane. + * @afbc_alloc_bytes: Minimum number of bytes required for AFBC. + * @afbc_width: AFBC width in superblocks. + * @stream_on: Boolean if the port has been enabled. + * @buffer_min: Minimum number of buffers required. + * @buffer_count: Number of buffers currently queued to firmware. + * @buffer_queue: Buffers waiting to be queued to the firmware. + * @is_flushing: Set true when port is waiting for a fw flush confirm. + * @flushed: Port has been flushed an no buffers have been queued. + * @interlaced: True if frames are interlaced. + */ +struct mvx_session_port { + enum mvx_format format; + unsigned int width; + unsigned int height; + uint8_t nplanes; + unsigned int stride[MVX_BUFFER_NPLANES]; + unsigned int size[MVX_BUFFER_NPLANES]; + unsigned int afbc_alloc_bytes; + unsigned int afbc_width; + bool stream_on; + unsigned int buffer_min; + unsigned int buffer_count; + unsigned int buffer_allocated; + struct list_head buffer_queue; + bool is_flushing; + bool flushed; + bool interlaced; + unsigned int scaling_shift; + struct mvx_roi_config roi_config_queue[MVX_ROI_QP_NUMS]; + struct mvx_chr_cfg chr_cfg_queue[MVX_ROI_QP_NUMS]; + struct mvx_enc_stats enc_stats_queue[MVX_ROI_QP_NUMS]; + struct mvx_buffer_param_qp qp_queue[MVX_ROI_QP_NUMS]; + struct mvx_osd_config osd_cfg_queue[MVX_ROI_QP_NUMS]; + unsigned int roi_config_num; + unsigned int qp_num; + unsigned int chr_cfg_num; + unsigned int enc_stats_num; + unsigned int osd_cfg_num; + bool isreallocting; + unsigned int display_size[MVX_BUFFER_NPLANES]; +}; + +/** + * struct mvx_session_qp - QP settings. + * @i_frame: QP for I frame. + * @p_frame: QP for P frame. + * @b_frame: QP for B frame. + * @min: Minimum QP value. + * @max: Maximum QP value. + */ +struct mvx_session_qp { + int i_frame; + int p_frame; + int b_frame; + int min; + int max; +}; + +/** + * struct mvx_session - Session instance. + * @dev: Pointer to device. + * @cache: Pointer to firmware cache. + * @isession: This instance is used to register the session to the + * client. + * @client_ops: Client operations. + * @csession: Client session. + * @destructor: When the isession.kref reaches zero and after the + * session + * object has been destructed, this callback routine is + * invoked + * to allow the owner of the session object to clean up any + * allocated resources. + * @event: Event callback routine. + * @mutex: Mutex protecting the session objects. + * @port: Input and output port settings. + * @mmu: MMU instance. + * @fw: Firmware instance. + * @fw_bin: Pointer to firmware binary. + * @fw_event: Event handler for loading a firmware binary. + * @fw_state: Current firmware state. + * @waitq: Wait queue to signal changes to the session. + * @dentry: Debugfs directory entry for the session. + * @frame_rate: Frame rate in Q16 format. + * @target_bitrate: Bitrate. + * @rc_enabled: Defines if rate control is enabled for the session. + * @profile: Profile for encoder. + * @level: Level for encoder. + * @nalu_format: NALU format. + * @stream_escaping: Defines if stream escaping is enabled. + * @ignore_stream_headers:Defines if decoder should ignore stream headers. + * @frame_reordering: Defines if decoder should reorder frames. + * @intbuf_size: Suggested internal buffer size. + * @p_frames: Number of P-frames for encoder. + * @b_frames: Number of B-frames for encoder. + * @gop_type: GOP type. + * @cyclic_intra_refresh_mb:Intra MB refresh. + * @constr_ipred: Constrained intra prediction. + * @entropy_sync: Enabled entropy synchronization. + * @temporal_mvp: Enable temporal motion vector prediction. + * @tile_rows: Tile size. + * @tile_cols: Tile size. + * @min_luma_cb_size: Minimum luma coding block size. + * @mb_mask: MB mask. + * @entropy_mode: Entropy mode. + * @multi_slice_mode: Multi slice mode. + * @multi_slice_max_mb: Maximum number of macroblocks in a slice. + * @vp9_prob_update: Probability update method. + * @mv_h_search_range: Horizontal search range. + * @mv_v_search_range: Vertical search range. + * @bitdepth_chroma: Bitdepth for chroma. + * @bitdepth_luma: Bitdepth for luma. + * @force_chroma_format:Chroma format. + * @rgb_to_yuv: RGB to YUV conversion mode. + * @band_limit: Maximum bandwidth limit. + * @cabac_init_idc: CABAC initialization table. + * @qp: QP settings per codec. + * @resync_interval: JPEG resync interval. + * @jpeg_quality: JPEG quality level. + * @color_desc: HDR color description. + * + * There is one session for each file handle that has been opened from the + * video device. + * + * There is a separate set of QP controls for every codec. There is no + * information on which codec will be used when controls are initialized with + * their default values. That's why a set of QP-settings is maintained for + * every codec. + */ +struct mvx_session { + struct device *dev; + struct mvx_fw_cache *cache; + struct mvx_if_session isession; + struct mvx_client_ops *client_ops; + struct mvx_client_session *csession; + void (*destructor)(struct mvx_session *session); + void (*event)(struct mvx_session *session, + enum mvx_session_event event, + void *arg); + struct mvx_session_port port[MVX_DIR_MAX]; + struct mvx_mmu mmu; + struct mvx_fw fw; + struct mvx_fw_bin *fw_bin; + struct mvx_fw_event fw_event; + enum mvx_fw_state fw_state; + wait_queue_head_t waitq; + struct timer_list watchdog_timer; + struct work_struct watchdog_work; + unsigned int watchdog_count; + bool switched_in; + unsigned int setting_stride[MVX_BUFFER_NPLANES];//upstream setting stride + unsigned int idle_count; + long error; + struct dentry *dentry; + + int64_t frame_rate; + unsigned int target_bitrate; + unsigned int maximum_bitrate; + bool rc_enabled; + int rc_type; + enum mvx_profile profile[MVX_FORMAT_BITSTREAM_LAST + 1]; + enum mvx_level level[MVX_FORMAT_BITSTREAM_LAST + 1]; + enum mvx_nalu_format nalu_format; + enum mvx_tristate stream_escaping; + enum mvx_tristate ignore_stream_headers; + enum mvx_tristate frame_reordering; + int64_t intbuf_size; + int p_frames; + int b_frames; + enum mvx_gop_type gop_type; + int cyclic_intra_refresh_mb; + enum mvx_tristate constr_ipred; + enum mvx_tristate entropy_sync; + enum mvx_tristate temporal_mvp; + int tile_rows; + int tile_cols; + int min_luma_cb_size; + int mb_mask; + enum mvx_entropy_mode entropy_mode; + enum mvx_multi_slice_mode multi_slice_mode; + int multi_slice_max_mb; + enum mvx_vp9_prob_update vp9_prob_update; + int mv_h_search_range; + int mv_v_search_range; + int bitdepth_chroma; + int bitdepth_luma; + int force_chroma_format; + enum mvx_rgb_to_yuv_mode rgb_to_yuv; + int band_limit; + int cabac_init_idc; + struct mvx_session_qp qp[MVX_FORMAT_BITSTREAM_LAST + 1]; + int resync_interval; + int jpeg_quality; + int jpeg_quality_luma; + int jpeg_quality_chroma; + struct mvx_fw_color_desc color_desc; + unsigned int crop_left; + unsigned int crop_right; + unsigned int crop_top; + unsigned int crop_bottom; + struct mvx_sei_userdata sei_userdata; + unsigned int nHRDBufsize; + struct mvx_dsl_frame dsl_frame; + struct mvx_dsl_ratio dsl_ratio; + struct mvx_long_term_ref mvx_ltr; + int dsl_pos_mode; + uint32_t mini_frame_height; + uint32_t init_qpi; + uint32_t init_qpp; + uint32_t sao_luma; + uint32_t sao_chroma; + uint32_t qp_delta_i_p; + uint32_t ref_rb_en; + uint32_t qpmap_qp_clip_top; + uint32_t qpmap_qp_clip_bot; + uint32_t rc_qp_clip_top; + uint32_t rc_qp_clip_bot; + uint32_t max_qp_i; + uint32_t min_qp_i; + uint32_t profiling; + uint32_t visible_width; + uint32_t visible_height; + struct mvx_huff_table huff_table; + uint32_t rc_bit_i_mode; + uint32_t rc_bit_i_ratio; + uint32_t inter_med_buf_size; + uint32_t svct3_level1_period; + uint32_t reset_gop_pframes; + uint32_t reset_ltr_period; + uint32_t fixedqp; + uint32_t gdr_number; + uint32_t gdr_period; + uint32_t multi_sps_pps; + uint32_t enable_visual; + uint32_t scd_enable; + uint32_t scd_percent; + uint32_t scd_threshold; + uint32_t aq_ssim_en; + uint32_t aq_neg_ratio; + uint32_t aq_pos_ratio; + uint32_t aq_qpdelta_lmt; + uint32_t aq_init_frm_avg_svar; + uint32_t adaptive_intra_block; + struct mvx_seamless_target seamless_target; + enum mvx_yuv_to_rgb_mode color_conv_mode; + enum use_cust_yuv_to_rgb_mode use_cust_rgb_to_yuv_mode; + bool use_cust_color_conv_coef; + struct mvx_color_conv_coef color_conv_coef; + struct mvx_rgb2yuv_color_conv_coef rgb2yuv_color_conv_coef; + uint32_t forced_uv_value; + uint32_t dsl_interp_mode; + uint32_t disabled_features; + uint32_t change_pos; + struct mvx_crop_cfg enc_src_crop; + struct mvx_crop_cfg dec_dst_crop; + struct mvx_osd_info osd_info; +}; + +/**************************************************************************** + * Exported functions + ****************************************************************************/ + +/** + * mvx_session_construct - Construct the session object. + * @session: Pointer to session. + * @dev: Pointer to device. + * @client_ops: Pointer to client ops. + * @cache: Pointer to firmware cache. + * @mutex: Pointer to mutex protecting the session object. + * @destructor: Destructor that will be invoked after the session referece count + * has reached zero. The destructor may be NULL if the owner of the + * session object does not need to be notified. + * @event: Event notification from the session to the client. This function + * must not call session API which could take mvx_session mutex. + * @dsession: Debugfs directory entry for the session. + * + * Return: 0 on success, else error code. + */ +int mvx_session_construct(struct mvx_session *session, + struct device *dev, + struct mvx_client_ops *client_ops, + struct mvx_fw_cache *cache, + struct mutex *mutex, + void (*destructor)(struct mvx_session *session), + void (*event)(struct mvx_session *session, + enum mvx_session_event event, + void *arg), + struct dentry *dsession); + +/** + * mvx_session_construct - Destruct the session object. + * @session: Pointer to session. + */ +void mvx_session_destruct(struct mvx_session *session); + +/** + * mvx_session_get - Increment the session reference count. + * @session: Pointer to session. + */ +void mvx_session_get(struct mvx_session *session); + +/** + * mvx_session_put - Decrement the session reference count. + * @session: Pointer to session. + * + * If the reference count reaches 0 the session object will be destructed. + * + * Return: 1 if session was removed, else 0. + */ +int mvx_session_put(struct mvx_session *session); + +/** + * mvx_session_get_formats() - Get bitmask of supported formats. + * @session: Pointer to session. + * @dir: Which direction to get formats for. + * @formats: Pointer to bitmask listing supported formats. + */ +void mvx_session_get_formats(struct mvx_session *session, + enum mvx_direction dir, + uint64_t *formats); + +/** + * mvx_session_try_format() - Validate port format. + * @session: Pointer to session. + * @dir: Which direction to get formats for. + * @format: MVX format. + * @width: Width. Only valid for frame formats. + * @height: Height. Only valid for frame formats. + * @nplanes: Number for planes. + * @stride: Horizonal stride in bytes for each plane. + * @size: Size in bytes for each plane. + * @interlace: True if frames are interlaced. + * + * Return: 0 on success, else error code. + */ +int mvx_session_try_format(struct mvx_session *session, + enum mvx_direction dir, + enum mvx_format format, + unsigned int *width, + unsigned int *height, + uint8_t *nplanes, + unsigned int *stride, + unsigned int *size, + bool *interlaced); + +/** + * mvx_session_set_format() - Validate and set port format. + * @session: Pointer to session. + * @dir: Which direction to get formats for. + * @format: MVX format. + * @width: Width. Only valid for frame formats. + * @height: Height. Only valid for frame formats. + * @nplanes: Number for planes. + * @stride: Horizonal stride in bytes for each plane. + * @size: Size in bytes for each plane. + * @interlaced: True if frames are interlaced. + * + * If *nplanes is 0, then the values of stride and size should be ignored, else + * size and stride should be used when setting the format. + * + * Return: 0 on success, else error code. + */ +int mvx_session_set_format(struct mvx_session *session, + enum mvx_direction dir, + enum mvx_format format, + unsigned int *width, + unsigned int *height, + uint8_t *nplanes, + unsigned int *stride, + unsigned int *size, + bool *interlaced); + +/** + * mvx_session_qbuf() - Queue a buffer. + * @session: Pointer to session. + * @buf: Pointer to buffer. + * + * Return: 0 on success, else error code. + */ +int mvx_session_qbuf(struct mvx_session *session, + enum mvx_direction dir, + struct mvx_buffer *buf); + +/** + * mvx_session_send_eos() - Queue an empty buffer with EOS flag. + * @session: Pointer to session. + * + * If firmware is loaded an empty input buffer will be queued with the EOS flag + * set. EOS will be propagated by the firmware to the output queue. + * + * If the firmware is not loaded a buffer will be dequeued from the output + * queue, cleared and returned with the EOS flag set. + * + * Return: 0 on success, else error code. + */ +int mvx_session_send_eos(struct mvx_session *session); + +/** + * mvx_session_streamon() - Enable stream on input or output port. + * @session: Pointer to session. + * @dir: Port direction. + * + * Both input and output ports must be enabled for streaming to begin. + * + * Return: 0 on success, else error code. + */ +int mvx_session_streamon(struct mvx_session *session, + enum mvx_direction dir); + +/** + * mvx_session_streamoff() - Disable stream on input or output port. + * @session: Pointer to session. + * @dir: Port direction. + * + * Return: 0 on success, else error code. + */ +int mvx_session_streamoff(struct mvx_session *session, + enum mvx_direction dir); + +/** + * mvx_session_irq() - Handle IRQ event from the client. + * @isession: Pointer to if-session. + */ +void mvx_session_irq(struct mvx_if_session *isession); + +/** + * mvx_if_session_to_session() - Convert mvx_is_session to mvx_session. + * @session: Pointer to mvx_if_session object. + * + * Return: Pointer to mvx_session object. + */ +static inline struct mvx_session *mvx_if_session_to_session( + struct mvx_if_session *session) +{ + return container_of(session, struct mvx_session, isession); +} + +/** + * mvx_session_port_show() - Print debug information into seq-file. + * @port: Pointer to port. + * @s: Seq-file to print to. + */ +void mvx_session_port_show(struct mvx_session_port *port, + struct seq_file *s); + +/* + * Functions bellow implement different settings for a session. + * + * Most of options could be set only when the FW is in STOPPED state or not + * loaded. In this case the value will be stored in mvx_session structure + * and applied lated in fw_initial_setup(). + * + * Some options support runtime modification. For them we issue a command + * to mvx_fw module if the FW is loaded. For others we return -EBUSY if the + * FW is loaded. + * + * ATTENTION. Currently there is no way to querry from mvx_fw API of from + * mvx_session API if the option supports runtime configuration. + */ + +/** + * mvx_session_set_securevideo() - Enabled or disable secure video. + * @session: Session. + * @securevideo:Enable or disable secure video. + * + * Return: 0 on success, else error code. + */ +int mvx_session_set_securevideo(struct mvx_session *session, + bool securevideo); + +/** + * mvx_session_set_frame_rate() - Set frame rate. + * @session: Session. + * @frame_rate: Frame rate in Q16 format. + * + * This option could be set in runtime. + * + * Return: 0 in case of success, error code otherwise. + */ +int mvx_session_set_frame_rate(struct mvx_session *session, + int64_t frame_rate); + +/** + * mvx_session_set_rate_control() - Enable/disable rate controller. + * @session: Session. + * @enabled: Rate controller status. + * + * This option could be set in runtime. + * + * Return: 0 in case of success, error code otherwise. + */ +int mvx_session_set_rate_control(struct mvx_session *session, + bool enabled); + +/** + * mvx_session_set_bitrate() - Set bitrate rate. + * @session: Session. + * @bitrate: Bitrate in bits per second. + * + * This option could be set in runtime. + * + * Return: 0 in case of success, error code otherwise. + */ +int mvx_session_set_bitrate(struct mvx_session *session, + int bitrate); + +/** + * mvx_session_set_bitrate() - Set bitrate rate control. + * @session: Session. + * @rc_type: bitrate rate control type. + * + * This option could be set in runtime. + * + * Return: 0 in case of success, error code otherwise. + */ + +int mvx_session_set_bitrate_control(struct mvx_session *session, + struct mvx_buffer_param_rate_control *rc_type); +/** + * mvx_session_set_crop_left() - Set crop left. + * @session: Session. + * @left: encoder SPS crop param, left offset. + * + * Return: 0 in case of success, error code otherwise. + */ + +int mvx_session_set_crop_left(struct mvx_session *session, + int32_t left); + +/** + * mvx_session_set_crop_right() - Set crop right. + * @session: Session. + * @right: encoder SPS crop param, right offset. + * + * Return: 0 in case of success, error code otherwise. + */ + +int mvx_session_set_crop_right(struct mvx_session *session, + int32_t right); + +/** + * mvx_session_set_crop_top() - Set crop top. + * @session: Session. + * @top: encoder SPS crop param, top offset. + * + * Return: 0 in case of success, error code otherwise. + */ + +int mvx_session_set_crop_top(struct mvx_session *session, + int32_t top); + +/** + * mvx_session_set_crop_bottom() - Set crop bottom. + * @session: Session. + * @top: encoder SPS crop param, bottom offset. + * + * Return: 0 in case of success, error code otherwise. + */ + +int mvx_session_set_crop_bottom(struct mvx_session *session, + int32_t bottom); +/** + * mvx_session_set_nalu_format() - Set NALU format. + * @session: Session. + * @fmt: NALU format. + * + * Return: 0 in case of success, error code otherwise. + */ +int mvx_session_set_nalu_format(struct mvx_session *session, + enum mvx_nalu_format fmt); + +/** + * mvx_session_set_stream_escaping() - Enable/disable stream escaping + * @session: Session. + * @status: Status + * + * Return: 0 in case of success, error code otherwise. + */ +int mvx_session_set_stream_escaping(struct mvx_session *session, + enum mvx_tristate status); + +/** + * mvx_session_set_profile() - Set profile for encoder. + * @session: Session. + * @format: Format. + * @profile: Encoder profile. + * + * Return: 0 in case of success, error code otherwise. + */ +int mvx_session_set_profile(struct mvx_session *session, + enum mvx_format format, + enum mvx_profile profile); + +/** + * mvx_session_set_level() - Set level for encoder. + * + * @session: Session. + * @format: Format. + * @level: Encoder level. + * + * Return: 0 in case of success, error code otherwise. + */ +int mvx_session_set_level(struct mvx_session *session, + enum mvx_format format, + enum mvx_level level); + +/** + * mvx_session_set_ignore_stream_headers() - Enable/disable stream headers + * ignore. + * @session: Session. + * @status: Status. + * + * Return: 0 in case of success, error code otherwise. + */ +int mvx_session_set_ignore_stream_headers(struct mvx_session *session, + enum mvx_tristate status); + +/** + * mvx_session_set_frame_reordering() - Enable/disable frames reordering. + * @session: Session. + * @status: Status. + * + * Return: 0 in case of success, error code otherwise. + */ +int mvx_session_set_frame_reordering(struct mvx_session *session, + enum mvx_tristate status); + +/** + * mvx_session_set_intbuf_size() - Set internal buffer size. + * @session: Session. + * @size: Size. + * + * Return: 0 in case of success, error code otherwise. + */ +int mvx_session_set_intbuf_size(struct mvx_session *session, + int size); + +/** + * mvx_session_set_p_frame() - Set number of P-frames. + * @session: Session. + * @val: Number of P-frames. + * + * Return: 0 in case of success, error code otherwise. + */ +int mvx_session_set_p_frames(struct mvx_session *session, + int val); + +/** + * mvx_session_set_b_frame() - Set number of B-frames. + * @session: Session. + * @val: Number of B-frames. + * + * Return: 0 in case of success, error code otherwise. + */ +int mvx_session_set_b_frames(struct mvx_session *session, + int val); + +/** + * mvx_session_set_gop_type() - Set GOP type. + * @session: Session. + * @gop_type: GOP type. + * + * Return: 0 in case of success, error code otherwise. + */ +int mvx_session_set_gop_type(struct mvx_session *session, + enum mvx_gop_type gop_type); + +/** + * mvx_session_set_cyclic_intra_refresh_mb() - Set intra MB refresh. + * @session: Session. + * @val: Value. + * + * Return: 0 in case of success, error code otherwise. + */ +int mvx_session_set_cyclic_intra_refresh_mb(struct mvx_session *session, + int val); + +/** + * mvx_session_set_constr_ipred() - Enabled/disable constrained intra + * prediction. + * @session: Session. + * @status: Status. + * + * Return: 0 in case of success, error code otherwise. + */ +int mvx_session_set_constr_ipred(struct mvx_session *session, + enum mvx_tristate status); + +/** + * mvx_session_set_entropy_sync() - Enable/disable entropy synchronization. + * @session: Session. + * @status: Status. + * + * Return: 0 in case of success, error code otherwise. + */ +int mvx_session_set_entropy_sync(struct mvx_session *session, + enum mvx_tristate status); + +/** + * mvx_session_set_temporal_mvp() - Enable/disable temporal MVP. + * @session: Session. + * @status: Status. + * + * Return: 0 in case of success, error code otherwise. + */ +int mvx_session_set_temporal_mvp(struct mvx_session *session, + enum mvx_tristate status); + +/** + * mvx_session_set_tile_rows() - Set tile size. + * @session: Session. + * @val: Value. + * + * Return: 0 in case of success, error code otherwise. + */ +int mvx_session_set_tile_rows(struct mvx_session *session, + int val); + +/** + * mvx_session_set_tile_cols() - Set tile size. + * @session: Session. + * @val: Value. + * + * Return: 0 in case of success, error code otherwise. + */ +int mvx_session_set_tile_cols(struct mvx_session *session, + int val); + +/** + * mvx_session_set_min_luma_cb_size() - Set minimum luma coding block size. + * @session: Session. + * @val: Value. + * + * Return: 0 in case of success, error code otherwise. + */ +int mvx_session_set_min_luma_cb_size(struct mvx_session *session, + int val); + +/** + * mvx_session_set_mb_mask() - Set MB mask. + * @session: Session. + * @val: Value. + * + * Return: 0 in case of success, error code otherwise. + */ +int mvx_session_set_mb_mask(struct mvx_session *session, + int val); + +/** + * mvx_session_set_entropy_mode() - Set entropy mode. + * @session: Session. + * @mode: Entropy mode. + * + * Return: 0 in case of success, error code otherwise. + */ +int mvx_session_set_entropy_mode(struct mvx_session *session, + enum mvx_entropy_mode mode); + +/** + * mvx_session_set_multi_slice_mode() - Set multi slice mode. + * @session: Session. + * @mode: Mode. + * + * Return: 0 in case of success, error code otherwise. + */ +int mvx_session_set_multi_slice_mode(struct mvx_session *session, + enum mvx_multi_slice_mode mode); + +/** + * mvx_session_set_multi_slice_max_mb() - Set suggested number of CTUs in a + * slice. + * @session: Session. + * @val: Value. + * + * Return: 0 in case of success, error code otherwise. + */ +int mvx_session_set_multi_slice_max_mb(struct mvx_session *session, + int val); + +/** + * mvx_session_set_vp9_prob_update() - Set probability update mode. + * @session: Session. + * @mode: Mode. + * + * Return: 0 in case of success, error code otherwise. + */ +int mvx_session_set_vp9_prob_update(struct mvx_session *session, + enum mvx_vp9_prob_update mode); + +/** + * mvx_session_set_mv_h_search_range() - Set horizontal search range for motion + * vectors. + * @session: Session. + * @val: Value. + * + * Return: 0 in case of success, error code otherwise. + */ +int mvx_session_set_mv_h_search_range(struct mvx_session *session, + int val); + +/** + * mvx_session_set_mv_v_search_range() - Set vertical search range for motion + * vectors. + * @session: Session. + * @val: Value. + * + * Return: 0 in case of success, error code otherwise. + */ +int mvx_session_set_mv_v_search_range(struct mvx_session *session, + int val); + +/** + * mvx_session_set_bitdepth_chroma() - Set bitdepth. + * @session: Session. + * @val: Value. + * + * Return: 0 in case of success, error code otherwise. + */ +int mvx_session_set_bitdepth_chroma(struct mvx_session *session, + int val); + +/** + * mvx_session_set_bitdepth_luma() - Set bitdepth. + * @session: Session. + * @val: Value. + * + * Return: 0 in case of success, error code otherwise. + */ +int mvx_session_set_bitdepth_luma(struct mvx_session *session, + int val); + +/** + * mvx_session_set_force_chroma_format() - Set chroma format. + * @session: Session. + * @fmt: chroma format. + * + * Return: 0 in case of success, error code otherwise. + */ +int mvx_session_set_force_chroma_format(struct mvx_session *session, + int fmt); + +/** + * mvx_session_set_rgb_to_yuv_mode() - Set RGB to YUV conversion mode. + * @session: Session. + * @mode: Mode. + * + * Return: 0 in case of success, error code otherwise. + */ +int mvx_session_set_rgb_to_yuv_mode(struct mvx_session *session, + enum mvx_rgb_to_yuv_mode mode); + +/** + * mvx_session_set_band_limit() - Set maximum bandwidth limit. + * @session: Session. + * @val: Value. + * + * Return: 0 in case of success, error code otherwise. + */ +int mvx_session_set_band_limit(struct mvx_session *session, + int val); + +/** + * mvx_session_set_cabac_init_idc() - Set CABAC initialization table. + * @session: Session. + * @val: Value. + * + * Return: 0 in case of success, error code otherwise. + */ +int mvx_session_set_cabac_init_idc(struct mvx_session *session, + int val); + +/** + * mvx_session_set_i_frame_qp() - Set QP for I frames. + * @session: Session. + * @format: Format. + * @qp: Quantization parameter. + * + * This option could be set in runtime. + * + * Return: 0 in case of success, error code otherwise. + */ +int mvx_session_set_i_frame_qp(struct mvx_session *session, + enum mvx_format format, + int qp); + +/** + * mvx_session_set_p_frame_qp() - Set QP for P frames. + * @session: Session. + * @format: Format. + * @qp: Quantization parameter. + * + * This option could be set in runtime. + * + * Return: 0 in case of success, error code otherwise. + */ +int mvx_session_set_p_frame_qp(struct mvx_session *session, + enum mvx_format format, + int qp); + +/** + * mvx_session_set_b_frame_qp() - Set QP for B frames. + * @session: Session. + * @format: Format. + * @qp: Quantization parameter. + * + * This option could be set in runtime. + * + * Return: 0 in case of success, error code otherwise. + */ +int mvx_session_set_b_frame_qp(struct mvx_session *session, + enum mvx_format format, + int qp); + +/** + * mvx_session_set_min_qp() - Set minimum value of QP range. + * @session: Session. + * @format: Format. + * @qp: Quantization parameter. + * + * This option could be set in runtime. + * + * Return: 0 in case of success, error code otherwise. + */ +int mvx_session_set_min_qp(struct mvx_session *session, + enum mvx_format format, + int qp); + +/** + * mvx_session_set_max_qp() - Set maximum value of QP range. + * @session: Session. + * @format: Format. + * @qp: Quantization parameter. + * + * This option could be set in runtime. + * + * Return: 0 in case of success, error code otherwise. + */ +int mvx_session_set_max_qp(struct mvx_session *session, + enum mvx_format format, + int qp); + +/** + * mvx_session_set_resync_interval() - Set resync interval for JPEG encoder. + * @session: Session. + * @val: Resync interval. + * + * Return: 0 in case of success, error code otherwise. + */ +int mvx_session_set_resync_interval(struct mvx_session *session, + int val); + +/** + * mvx_session_set_jpeg_quality() - Set JPEG quality. + * @session: Session. + * @val: Quality level (1-100). + * + * Return: 0 in case of success, error otherwise. + */ +int mvx_session_set_jpeg_quality(struct mvx_session *session, + int val); + +/** + * mvx_session_set_jpeg_quality_luma() - Set JPEG quality. + * @session: Session. + * @val: Quality level (1-100). + * + * Return: 0 in case of success, error otherwise. + */ + +int mvx_session_set_jpeg_quality_luma(struct mvx_session *session, + int val); +/** + * mvx_session_set_jpeg_quality_chroma() - Set JPEG quality. + * @session: Session. + * @val: Quality level (1-100). + * + * Return: 0 in case of success, error otherwise. + */ + +int mvx_session_set_jpeg_quality_chroma(struct mvx_session *session, + int val); + +/** + * mvx_session_get_color_desc() - Get color description. + * @session: Pointer to session. + * @color_desc: Color description. + * + * Return: 0 on success, else error code. + */ +int mvx_session_get_color_desc(struct mvx_session *session, + struct mvx_fw_color_desc *color_desc); + +/** + * mvx_session_set_color_desc() - Set color description. + * @session: Pointer to session. + * @color_desc: Color description. + * + * Return: 0 on success, else error code. + */ +int mvx_session_set_color_desc(struct mvx_session *session, + struct mvx_fw_color_desc *color_desc); + +/** + * mvx_session_set_roi_regions() - Set ROI regions. + * @session: Pointer to session. + * @roi: ROI regions. + * + * Return: 0 on success, else error code. + */ +int mvx_session_set_roi_regions(struct mvx_session *session, + struct mvx_roi_config *roi); + +/** + * mvx_session_set_qp_epr() - Set qp for epr config. + * @session: Pointer to session. + * @qp: qp. + * + * Return: 0 on success, else error code. + */ + +int mvx_session_set_qp_epr(struct mvx_session *session, + struct mvx_buffer_param_qp *qp); + +/** + * mvx_session_set_sei_userdata() - Set SEI userdata. + * @session: Pointer to session. + * @userdata: SEI userdata. + * + * Return: 0 on success, else error code. + */ + +int mvx_session_set_sei_userdata(struct mvx_session *session, + struct mvx_sei_userdata *userdata); + +/** + * mvx_session_set_hrd_buffer_size() - Set hrd buffer size. + * @session: Pointer to session. + * @size: hrd buffer size. + * + * Return: 0 on success, else error code. + */ + +int mvx_session_set_hrd_buffer_size(struct mvx_session *session, + int size); + +/** + * mvx_session_set_dsl_frame() - Set DownScale dst frame. + * @session: Pointer to session. + * @dsl: DownScale dst frame. + * + * Return: 0 on success, else error code. + */ + +int mvx_session_set_dsl_frame(struct mvx_session *session, + struct mvx_dsl_frame *dsl); + +/** + * mvx_session_set_dsl_ratio() - Set DownScale ratio. + * @session: Pointer to session. + * @dsl: DownScale ratio. + * + * Return: 0 on success, else error code. + */ + +int mvx_session_set_dsl_ratio(struct mvx_session *session, + struct mvx_dsl_ratio *dsl); + +/** + * mvx_session_set_long_term_ref() - Set long term ref. + * @session: Pointer to session. + * @ltr: long term ref. + * + * Return: 0 on success, else error code. + */ + +int mvx_session_set_long_term_ref(struct mvx_session *session, + struct mvx_long_term_ref *ltr); + +/** + * mvx_session_set_dsl_mode() - Set DownScale mode. + * @session: Pointer to session. + * @mode: DownScale mode, oly enable on high precision mode. + * + * Return: 0 on success, else error code. + */ + +int mvx_session_set_dsl_mode(struct mvx_session *session, + int *mode); +/** + * mvx_session_set_dsl_mode() - Set DownScale mode. + * @session: Pointer to session. + * @cnt: Mini Frame BUffer cnt. + * + * Return: 0 on success, else error code. + */ + +int mvx_session_set_mini_frame_height(struct mvx_session *session, + int *cnt); + +/** + * mvx_session_set_stats_mode() - Set Stats mode. + * @session: Pointer to session. + * @mode: Stats mode. + * + * Return: 0 on success, else error code. + */ + +int mvx_session_set_stats_mode(struct mvx_session *session, + struct mvx_enc_stats *stats); +int mvx_session_set_chr_cfg(struct mvx_session *session, + struct mvx_chr_cfg *chr_cfg); +int mvx_session_set_init_qp_i(struct mvx_session *session, + int val); +int mvx_session_set_init_qp_p(struct mvx_session *session, + int val); +int mvx_session_set_sao_luma(struct mvx_session *session, + int val); +int mvx_session_set_sao_chroma(struct mvx_session *session, + int val); +int mvx_session_set_delta_I_P(struct mvx_session *session, + int val); +int mvx_session_set_ref_rb_eb(struct mvx_session *session, + int val); +int mvx_session_set_rc_clip_top(struct mvx_session *session, + int val); +int mvx_session_set_rc_clip_bot(struct mvx_session *session, + int val); +int mvx_session_set_qpmap_clip_top(struct mvx_session *session, + int val); +int mvx_session_set_qpmap_clip_bot(struct mvx_session *session, + int val); +int mvx_session_set_max_qp_i(struct mvx_session *session, + int val); +int mvx_session_set_min_qp_i(struct mvx_session *session, + int val); +int mvx_session_set_fixedqp(struct mvx_session *session, + int val); +int mvx_session_set_fw_profiling(struct mvx_session *session, + int val); +int mvx_session_set_visible_width(struct mvx_session *session, + int val); +int mvx_session_set_visible_height(struct mvx_session *session, + int val); +int mvx_session_set_huff_table (struct mvx_session *session, + struct mvx_huff_table *table); +int mvx_session_set_rc_bit_i_mode(struct mvx_session *session, + int val); +int mvx_session_set_rc_bit_i_ratio(struct mvx_session *session, + int val); +int mvx_session_set_inter_med_buf_size(struct mvx_session *session, + int val); +int mvx_session_set_svct3_level1_period(struct mvx_session *session, + int val); +int mvx_session_set_gop_reset_pframes(struct mvx_session *session, + int val); +int mvx_session_set_ltr_reset_period(struct mvx_session *session, + int val); +int mvx_session_set_gdr_number(struct mvx_session *session, + int val); +int mvx_session_set_gdr_period(struct mvx_session *session, + int val); +int mvx_session_set_multi_sps_pps(struct mvx_session *session, + int val); +int mvx_session_set_enable_visual(struct mvx_session *session, + int val); +int mvx_session_set_scd_enable(struct mvx_session *session, + int val); +int mvx_session_set_scd_percent(struct mvx_session *session, + int val); +int mvx_session_set_scd_threshold(struct mvx_session *session, + int val); +int mvx_session_set_aq_ssim_en(struct mvx_session *session, + int val); +int mvx_session_set_aq_neg_ratio(struct mvx_session *session, + int val); +int mvx_session_set_aq_pos_ratio(struct mvx_session *session, + int val); +int mvx_session_set_aq_qpdelta_lmt(struct mvx_session *session, + int val); +int mvx_session_set_aq_init_frm_avg_svar(struct mvx_session *session, + int val); +int mvx_session_set_adaptive_intra_block(struct mvx_session *session, + int val); +int mvx_session_set_seamless_target(struct mvx_session *session, + struct mvx_seamless_target * seamless); +int mvx_session_set_color_conversion(struct mvx_session *session, + enum mvx_yuv_to_rgb_mode mode); +int mvx_session_set_color_conversion_ceof(struct mvx_session *session, + struct mvx_color_conv_coef *conv_coef); +int mvx_session_set_rgb_conv_yuv_coef(struct mvx_session *session, + struct mvx_rgb2yuv_color_conv_coef *conv_coef); +int mvx_session_set_forced_uv_value(struct mvx_session *session, + int val); +int mvx_session_set_dsl_interpolation_mode(struct mvx_session *session, + int mode); +int mvx_session_set_disabled_features(struct mvx_session *session, + int val); +int mvx_session_set_enc_src_crop(struct mvx_session *session, + struct mvx_crop_cfg *crop); +int mvx_session_set_dec_dst_crop(struct mvx_session *session, + struct mvx_crop_cfg *crop); +int mvx_session_set_osd_config(struct mvx_session *session, + struct mvx_osd_config *osd); +int mvx_session_set_osd_info(struct mvx_session *session, + struct mvx_osd_info *osd_info); +int mvx_session_set_change_pos(struct mvx_session *session, + int val); +#endif /* _MVX_SESSION_H_ */ diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_v4l2_buffer.c b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_v4l2_buffer.c new file mode 100755 index 000000000..51c27b167 --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_v4l2_buffer.c @@ -0,0 +1,506 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include +#include +#include "mvx_ext_if.h" +#include "mvx_log_group.h" +#include "mvx_seq.h" +#include "mvx_v4l2_buffer.h" +#include "mvx-v4l2-controls.h" + +/**************************************************************************** + * Static functions and variables + ****************************************************************************/ + +static void v4l2_buffer_show(struct mvx_v4l2_buffer *buffer, + struct seq_file *s) +{ + struct vb2_v4l2_buffer *v4l2 = &buffer->vb2_v4l2_buffer; + struct vb2_buffer *vb2 = &v4l2->vb2_buf; + int is_multi = V4L2_TYPE_IS_MULTIPLANAR(vb2->type); + int i; + int ind = 0; + + mvx_seq_printf(s, "mvx_v4l2_buffer", ind, "%p\n", buffer); + + ind++; + mvx_seq_printf(s, "vb2", ind, "%p\n", vb2); + + ind++; + mvx_seq_printf(s, "index", ind, "%u\n", vb2->index); + mvx_seq_printf(s, "type", ind, "%u (multi: %s)\n", + vb2->type, is_multi ? "yes" : "no"); + mvx_seq_printf(s, "flags", ind, "0x%08x\n", v4l2->flags); + mvx_seq_printf(s, "field", ind, "%u\n", v4l2->field); + +#if 1 //KERNEL_VERSION(4, 5, 0) <= LINUX_VERSION_CODE + mvx_seq_printf(s, "timestamp", ind, "%llu\n", vb2->timestamp); +#else + mvx_seq_printf(s, "timestamp", ind, "\n"); + ind++; + mvx_seq_printf(s, "tv_sec", ind, "%lu\n", v4l2->timestamp.tv_sec); + mvx_seq_printf(s, "tv_usec", ind, "%lu\n", v4l2->timestamp.tv_usec); + ind--; +#endif + mvx_seq_printf(s, "timecode", ind, "\n"); + ind++; + mvx_seq_printf(s, "type", ind, "%u\n", v4l2->timecode.type); + mvx_seq_printf(s, "flags", ind, "%u\n", v4l2->timecode.flags); + mvx_seq_printf(s, "frames", ind, "%u\n", v4l2->timecode.frames); + mvx_seq_printf(s, "seconds", ind, "%u\n", v4l2->timecode.seconds); + mvx_seq_printf(s, "minutes", ind, "%u\n", v4l2->timecode.minutes); + mvx_seq_printf(s, "hours", ind, "%u\n", v4l2->timecode.hours); + ind--; + + mvx_seq_printf(s, "sequence", ind, "%u\n", v4l2->sequence); + mvx_seq_printf(s, "memory", ind, "%u\n", vb2->memory); + + mvx_seq_printf(s, "num_planes", ind, "%u\n", vb2->num_planes); + + mvx_seq_printf(s, "planes", ind, "\n"); + ind++; + for (i = 0; i < vb2->num_planes; ++i) { + char tag[10]; + struct vb2_plane *plane = &vb2->planes[i]; + + scnprintf(tag, sizeof(tag), "#%d", i); + mvx_seq_printf(s, tag, ind, + "bytesused: %10u, length: %10u, m.offset: %10u, m.userptr: %10lu, m.fd: %10d, data_offset: %10u\n", + plane->bytesused, + plane->length, + plane->m.offset, + plane->m.userptr, + plane->m.fd, + plane->data_offset); + } + + ind--; +} + +static int buffer_stat_show(struct seq_file *s, + void *v) +{ + struct mvx_v4l2_buffer *vbuf = s->private; + + v4l2_buffer_show(vbuf, s); + seq_puts(s, "\n"); + mvx_buffer_show(&vbuf->buf, s); + + return 0; +} + +static int buffer_stat_open(struct inode *inode, + struct file *file) +{ + return single_open(file, buffer_stat_show, inode->i_private); +} + +static const struct file_operations buffer_stat_fops = { + .open = buffer_stat_open, + .read = seq_read, + .llseek = seq_lseek, + .release = seq_release +}; + +static int buffer_debugfs_init(struct dentry *parent, + struct mvx_v4l2_buffer *vbuf) +{ + char name[20]; + struct dentry *dentry; + + scnprintf(name, sizeof(name), "buffer%u", to_vb2_buf(vbuf)->index); + vbuf->dentry = debugfs_create_dir(name, parent); + if (IS_ERR_OR_NULL(vbuf->dentry)) + return -ENOMEM; + + dentry = debugfs_create_file("stat", 0400, vbuf->dentry, vbuf, + &buffer_stat_fops); + if (IS_ERR_OR_NULL(dentry)) + return -ENOMEM; + + return 0; +} + +/** + * get_bytesused() - Get total number of bytes used for Vb2 buffer. + */ +static size_t get_bytesused(struct vb2_buffer *b) +{ + size_t size; + uint32_t i; + + for (i = 0, size = 0; i < b->num_planes; i++) + size += b->planes[i].bytesused; + + return size; +} + +static int clear_bytesused(struct vb2_buffer *b) +{ + uint32_t i; + + for (i = 0; i < b->num_planes; i++) + b->planes[i].bytesused = 0; + + return 0; +} + +/* Update mvx_buffer flags from vb2_buffer flags */ +static int update_mvx_flags(struct mvx_buffer *buf, + struct vb2_buffer *b) +{ + struct vb2_v4l2_buffer *vb2_v4l2 = to_vb2_v4l2_buffer(b); + __u32 flags = vb2_v4l2->flags; + __u32 osd_flags = (buf->flags & MVX_BUFFER_FRAME_FLAG_OSD_MASK); + __u32 general_flags = (buf->flags & MVX_BUFFER_FRAME_FLAG_GENERAL); + buf->flags = osd_flags; + buf->flags |=general_flags; + if (V4L2_TYPE_IS_OUTPUT(b->type) != false && get_bytesused(b) == 0) + flags |= V4L2_BUF_FLAG_LAST; + + if (flags & V4L2_BUF_FLAG_LAST) + buf->flags |= MVX_BUFFER_EOS; + + if (mvx_is_afbc(buf->format)) { + if ((flags & V4L2_BUF_FLAG_MVX_AFBC_TILED_HEADERS) == V4L2_BUF_FLAG_MVX_AFBC_TILED_HEADERS) + buf->flags |= MVX_BUFFER_AFBC_TILED_HEADERS; + + if ((flags & V4L2_BUF_FLAG_MVX_AFBC_TILED_BODY) == V4L2_BUF_FLAG_MVX_AFBC_TILED_BODY) + buf->flags |= MVX_BUFFER_AFBC_TILED_BODY; + + if ((flags & V4L2_BUF_FLAG_MVX_AFBC_32X8_SUPERBLOCK) == V4L2_BUF_FLAG_MVX_AFBC_32X8_SUPERBLOCK) + buf->flags |= MVX_BUFFER_AFBC_32X8_SUPERBLOCK; + } else if (mvx_is_bitstream(buf->format)) { + if (buf->dir == MVX_DIR_INPUT) { + //decode bitstream port + if ((flags & V4L2_BUF_FLAG_END_OF_SUB_FRAME) == V4L2_BUF_FLAG_END_OF_SUB_FRAME){ + buf->flags |= MVX_BUFFER_END_OF_SUB_FRAME; + } + if (flags & V4L2_BUF_FLAG_KEYFRAME) + buf->flags |= MVX_BUFFER_EOF; + if ((flags & V4L2_BUF_FLAG_MVX_CODEC_CONFIG) == V4L2_BUF_FLAG_MVX_CODEC_CONFIG) + buf->flags |= MVX_BUFFER_CODEC_CONFIG; + } + } else if (mvx_is_frame(buf->format)) { + if (buf->dir == MVX_DIR_OUTPUT) { + //decode frame port + if (flags & V4L2_BUF_FRAME_FLAG_ROTATION_MASK) { + if ((flags & V4L2_BUF_FRAME_FLAG_ROTATION_MASK) == V4L2_BUF_FRAME_FLAG_ROTATION_90) { + buf->flags |= MVX_BUFFER_FRAME_FLAG_ROTATION_90; + } else if ((flags & V4L2_BUF_FRAME_FLAG_ROTATION_MASK) == V4L2_BUF_FRAME_FLAG_ROTATION_180) { + buf->flags |= MVX_BUFFER_FRAME_FLAG_ROTATION_180; + } else if ((flags & V4L2_BUF_FRAME_FLAG_ROTATION_MASK) == V4L2_BUF_FRAME_FLAG_ROTATION_270) { + buf->flags |= MVX_BUFFER_FRAME_FLAG_ROTATION_270; + } + } + if (flags & V4L2_BUF_FRAME_FLAG_SCALING_MASK) { + if ((flags & V4L2_BUF_FRAME_FLAG_SCALING_MASK) == V4L2_BUF_FRAME_FLAG_SCALING_2) { + buf->flags |= MVX_BUFFER_FRAME_FLAG_SCALING_2; + } else if ((flags & V4L2_BUF_FRAME_FLAG_SCALING_MASK) == V4L2_BUF_FRAME_FLAG_SCALING_4) { + buf->flags |= MVX_BUFFER_FRAME_FLAG_SCALING_4; + } + } + } else if (buf->dir == MVX_DIR_INPUT) { + if (flags & V4L2_BUF_FLAG_KEYFRAME){ + //encode frame port for idr flag + buf->flags |= MVX_BUFFER_FRAME_FLAG_FORCE_IDR; + } + //encode frame port + if (flags & V4L2_BUF_FRAME_FLAG_MIRROR_MASK) { + if ((flags & V4L2_BUF_FRAME_FLAG_MIRROR_MASK) == V4L2_BUF_FRAME_FLAG_MIRROR_HORI) { + buf->flags |= MVX_BUFFER_FRAME_FLAG_MIRROR_HORI; + } else if ((flags & V4L2_BUF_FRAME_FLAG_MIRROR_MASK) == V4L2_BUF_FRAME_FLAG_MIRROR_VERT) { + buf->flags |= MVX_BUFFER_FRAME_FLAG_MIRROR_VERT; + } + } + if (flags & V4L2_BUF_ENCODE_FLAG_ROTATION_MASK) { + if ((flags & V4L2_BUF_ENCODE_FLAG_ROTATION_MASK) == V4L2_BUF_ENCODE_FLAG_ROTATION_90) { + buf->flags |= MVX_BUFFER_FRAME_FLAG_ROTATION_90; + } else if ((flags & V4L2_BUF_ENCODE_FLAG_ROTATION_MASK) == V4L2_BUF_ENCODE_FLAG_ROTATION_180) { + buf->flags |= MVX_BUFFER_FRAME_FLAG_ROTATION_180; + } else if ((flags & V4L2_BUF_ENCODE_FLAG_ROTATION_MASK) == V4L2_BUF_ENCODE_FLAG_ROTATION_270) { + buf->flags |= MVX_BUFFER_FRAME_FLAG_ROTATION_270; + } + } + if ((flags & V4L2_BUF_FLAG_MVX_BUFFER_EPR) == V4L2_BUF_FLAG_MVX_BUFFER_EPR) { + buf->flags |= MVX_BUFFER_FRAME_FLAG_GENERAL; + } + if ((flags & V4L2_BUF_FLAG_MVX_BUFFER_ROI) == V4L2_BUF_FLAG_MVX_BUFFER_ROI) { + buf->flags |= MVX_BUFFER_FRAME_FLAG_ROI; + } + if ((flags & V4L2_BUF_FLAG_MVX_BUFFER_CHR) == V4L2_BUF_FLAG_MVX_BUFFER_CHR) { + buf->flags |= MVX_BUFFER_FRAME_FLAG_CHR; + } + if ((flags & V4L2_BUF_FLAG_MVX_BUFFER_GOP_RESET) == V4L2_BUF_FLAG_MVX_BUFFER_GOP_RESET) + { + buf->flags |= MVX_BUFFER_FRAME_FLAG_GOP_REST; + } + if ((flags & V4L2_BUF_FLAG_MVX_BUFFER_LTR_RESET) == V4L2_BUF_FLAG_MVX_BUFFER_LTR_RESET) + { + buf->flags |= MVX_BUFFER_FRAME_FLAG_LTR_REST; + } + } + + } else { + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "unrecognized buffer format!."); + + } + + return 0; +} + +/* Update mvx_buffer from mvx_v4l2_buffer */ +static int update_mvx_buffer(struct mvx_v4l2_buffer *vbuf) +{ + struct vb2_buffer *vb2 = to_vb2_buf(vbuf); + struct mvx_buffer *mvx_buf = &vbuf->buf; + int i; + int ret; + + if (vb2->num_planes != mvx_buf->nplanes) { + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "VB2 and MVX buffers have different number of planes. vb2_planes=%u, mvx_planes=%u.", + vb2->num_planes, mvx_buf->nplanes); + return -EINVAL; + } + +#if 1 //KERNEL_VERSION(4, 5, 0) <= LINUX_VERSION_CODE + mvx_buf->user_data = vb2->timestamp; +#else + { + struct timeval *ts = &vbuf->vb2_v4l2_buffer.timestamp; + + mvx_buf->user_data = ((uint64_t)ts->tv_sec << 32) | + (ts->tv_usec & 0xffffffff); + } +#endif + + for (i = 0; i < vb2->num_planes; i++) { + unsigned int offset = vb2->planes[i].data_offset; + + /* + * For single planar mmap buffers the offset is carried by + * the lower part of the offset. + */ + if (vb2->memory == V4L2_MEMORY_MMAP) + offset += vb2->planes[i].m.offset & ~PAGE_MASK; + + ret = mvx_buffer_filled_set(mvx_buf, i, + vb2->planes[i].bytesused, offset); + if (ret != 0) + return ret; + } + + ret = update_mvx_flags(mvx_buf, to_vb2_buf(vbuf)); + if (ret != 0) + return 0; + + return 0; +} + +static int update_v4l2_bytesused(struct mvx_v4l2_buffer *vbuf) +{ + struct vb2_buffer *b = to_vb2_buf(vbuf); + struct mvx_buffer *buf = &vbuf->buf; + int i; + + if (b->num_planes != buf->nplanes) { + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "VB2 and MVX buffers have different number of planes. vb2_planes=%u, mvx_planes=%u.", + b->num_planes, buf->nplanes); + return -EINVAL; + } + + /* + * MVX filled is the number of bytes excluding the offset. The total + * length is calculated as 'filled + offset' and should be <= length. + * + * V4L2 bytesused is the total length including the offset. + * bytesused should be <= length and bytesused >= offset. + */ + + for (i = 0; i < b->num_planes; i++) { + b->planes[i].bytesused = + buf->planes[i].filled + buf->planes[i].offset; + b->planes[i].data_offset = buf->planes[i].offset; + } + + return 0; +} + +static int update_vb2_flags(struct mvx_v4l2_buffer *vbuf) +{ + struct vb2_v4l2_buffer *b = &vbuf->vb2_v4l2_buffer; + struct mvx_buffer *buf = &vbuf->buf; + + b->flags &= ~(V4L2_BUF_FLAG_ERROR | + V4L2_BUF_FLAG_KEYFRAME | + V4L2_BUF_FLAG_LAST); + + if (buf->flags & MVX_BUFFER_EOS) + b->flags |= V4L2_BUF_FLAG_LAST; + + if (buf->flags & MVX_BUFFER_EOF) + b->flags |= V4L2_BUF_FLAG_KEYFRAME; + + if (buf->flags & MVX_BUFFER_CORRUPT) + b->flags |= V4L2_BUF_FLAG_ERROR; + + if (buf->flags & MVX_BUFFER_REJECTED) + clear_bytesused(&b->vb2_buf); + + if (buf->flags & MVX_BUFFER_DECODE_ONLY) + b->flags |= V4L2_BUF_FLAG_MVX_DECODE_ONLY; + + if (buf->flags & MVX_BUFFER_CODEC_CONFIG) + b->flags |= V4L2_BUF_FLAG_MVX_CODEC_CONFIG; + + if (buf->flags & MVX_BUFFER_AFBC_TILED_HEADERS) + b->flags |= V4L2_BUF_FLAG_MVX_AFBC_TILED_HEADERS; + + if (buf->flags & MVX_BUFFER_AFBC_TILED_BODY) + b->flags |= V4L2_BUF_FLAG_MVX_AFBC_TILED_BODY; + + if (buf->flags & MVX_BUFFER_AFBC_32X8_SUPERBLOCK) + b->flags |= V4L2_BUF_FLAG_MVX_AFBC_32X8_SUPERBLOCK; + + if (buf->flags & MVX_BUFFER_FRAME_PRESENT) + b->flags |= V4L2_BUF_FLAG_MVX_BUFFER_FRAME_PRESENT; + + if (buf->flags & MVX_BUFFER_FRAME_NEED_REALLOC) + b->flags |= V4L2_BUF_FLAG_MVX_BUFFER_NEED_REALLOC; + + if (buf->flags & MVX_BUFFER_ENC_STATS) + b->flags |= V4L2_BUF_FLAG_MVX_BUFFER_ENC_STATS; + + return 0; +} + +/**************************************************************************** + * Exported functions and variables + ****************************************************************************/ + +int mvx_v4l2_buffer_construct(struct mvx_v4l2_buffer *vbuf, + struct mvx_v4l2_session *vsession, + enum mvx_direction dir, + unsigned int nplanes, + struct sg_table **sgt) +{ + int ret; + + ret = mvx_buffer_construct(&vbuf->buf, vsession->ext->dev, + &vsession->session.mmu, dir, + nplanes, sgt); + if (ret != 0) + return ret; + + if (IS_ENABLED(CONFIG_DEBUG_FS)) { + struct mvx_v4l2_port *vport = &vsession->port[dir]; + + ret = buffer_debugfs_init(vport->dentry, vbuf); + if (ret != 0) { + MVX_SESSION_WARN(&vsession->session, + "Failed to create buffer debugfs entry."); + goto destruct_buffer; + } + } + + return 0; + +destruct_buffer: + mvx_buffer_destruct(&vbuf->buf); + + return ret; +} + +void mvx_v4l2_buffer_destruct(struct mvx_v4l2_buffer *vbuf) +{ + mvx_buffer_destruct(&vbuf->buf); + + if (IS_ENABLED(CONFIG_DEBUG_FS)) + debugfs_remove_recursive(vbuf->dentry); +} + +struct mvx_v4l2_buffer *mvx_buffer_to_v4l2_buffer(struct mvx_buffer *buffer) +{ + return container_of(buffer, struct mvx_v4l2_buffer, buf); +} + +/* Update mvx_v4l2_buffer from vb2_buffer */ +int mvx_v4l2_buffer_set(struct mvx_v4l2_buffer *vbuf, + struct vb2_buffer *b) +{ + int ret; + + ret = update_mvx_buffer(vbuf); + if (ret != 0) + return ret; + + return 0; +} + +enum vb2_buffer_state mvx_v4l2_buffer_update(struct mvx_v4l2_buffer *vbuf) +{ + struct vb2_buffer *vb2 = to_vb2_buf(vbuf); + struct mvx_buffer *mvx_buf = &vbuf->buf; + int ret; + + if (V4L2_TYPE_IS_OUTPUT(vb2->type) != false) + ret = clear_bytesused(vb2); + else + ret = update_v4l2_bytesused(vbuf); + + if (ret != 0) + goto error; + + ret = update_vb2_flags(vbuf); + if (ret != 0 || + (vbuf->vb2_v4l2_buffer.flags & V4L2_BUF_FLAG_ERROR) != 0) + goto error; + +#if 1 //KERNEL_VERSION(4, 5, 0) <= LINUX_VERSION_CODE + vb2->timestamp = mvx_buf->user_data; +#else + { + struct timeval *ts = &vbuf->vb2_v4l2_buffer.timestamp; + + ts->tv_sec = mvx_buf->user_data >> 32; + ts->tv_usec = mvx_buf->user_data & 0xffffffff; + } +#endif + + return VB2_BUF_STATE_DONE; + +error: + return VB2_BUF_STATE_ERROR; +} diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_v4l2_buffer.h b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_v4l2_buffer.h new file mode 100755 index 000000000..d150da515 --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_v4l2_buffer.h @@ -0,0 +1,167 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef _MVX_V4L2_BUFFER_H_ +#define _MVX_V4L2_BUFFER_H_ + +/**************************************************************************** + * Includes + ****************************************************************************/ + +#include +#include +#include "mvx_buffer.h" +#include "mvx_if.h" +#include "mvx_v4l2_session.h" + +/**************************************************************************** + * Types + ****************************************************************************/ + +#define vb2_v4l2_to_mvx_v4l2_buffer(v4l2) \ + container_of(v4l2, struct mvx_v4l2_buffer, vb2_v4l2_buffer) + +#define vb2_to_mvx_v4l2_buffer(vb2) \ + vb2_v4l2_to_mvx_v4l2_buffer(to_vb2_v4l2_buffer(vb2)) + +#define to_vb2_buf(vbuf) (&((vbuf)->vb2_v4l2_buffer.vb2_buf)) + +/** + * struct mvx_v4l2_buffer - MVX V4L2 buffer. + * @vb2_v4l2_buffer: VB2 V4L2 buffer. + * @buf: MVX buffer. + * @dentry: Debug file system entry. + */ +struct mvx_v4l2_buffer { + struct vb2_v4l2_buffer vb2_v4l2_buffer; + struct mvx_buffer buf; + struct dentry *dentry; +}; + +/**************************************************************************** + * Exported functions + ****************************************************************************/ + +/** + * mvx_v4l2_buffer_construct() - Construct MVX V4L2 buffer object. + * @vbuf: Pointer to MVX V4L2 buffer. + * @vsession: Pointer to V4L2 session. + * @dir: Direction of the buffer. + * @nplanes: Number of planes. + * @sgt: Array of pointers to scatter-gatter lists. Each SG list + * contains memory pages for a corresponding plane. + * + * Return: 0 on success, else error code. + */ +int mvx_v4l2_buffer_construct(struct mvx_v4l2_buffer *vbuf, + struct mvx_v4l2_session *vsession, + enum mvx_direction dir, + unsigned int nplanes, + struct sg_table **sgt); + +/** + * mvx_v4l2_buffer_destruct() - Destruct v4l2 buffer object. + * @vbuf: Pointer to MVX V4L2 buffer. + */ +void mvx_v4l2_buffer_destruct(struct mvx_v4l2_buffer *vbuf); + +/** + * mvx_buffer_to_v4l2_buffer() - Cast mvx_buffer to mvx_v4l2_buffer. + * @buf: Pointer MVX buffer. + * + * This function casts a pointer to struct mvx_buffer to a pointer to + * a corresponding struct mvx_v4l2_buffer. + * + * Return: Pointer to corresponding mvx_v4l2_buffer object. + */ +struct mvx_v4l2_buffer *mvx_buffer_to_v4l2_buffer(struct mvx_buffer *buf); + +/** + * mvx_v4l2_buffer_set_status() - Set status for a buffer. + * @vbuf: Pointer to MVX V4L2 buffer. + * @status: Status to set. + * + * Status is a combination of the following flags: + * V4L2_BUF_FLAG_QUEUED, + * V4L2_BUF_FLAG_DONE, + * V4L2_BUF_FLAG_PREPARED, + * V4L2_BUF_FLAG_ERROR + */ +void mvx_v4l2_buffer_set_status(struct mvx_v4l2_buffer *vbuf, + uint32_t status); + +/** + * mvx_v4l2_buffer_get_status() - Get the buffer status. + * @vbuf: Pointer to MVX V4L2 buffer. + * + * Return: Buffer status. + */ +uint32_t mvx_v4l2_buffer_get_status(struct mvx_v4l2_buffer *vbuf); + +/** + * mvx_v4l2_buffer_set() - Copy Vb2 buffer to VBUF. + * @vbuf: Destination MVX V4L2 buffer. + * @b: Source Vb2 buffer. + * + * Copies and validates paramters from 'b' to 'vbuf'. + * + * Return: 0 on success, else error code. + */ +int mvx_v4l2_buffer_set(struct mvx_v4l2_buffer *vbuf, + struct vb2_buffer *b); + +/** + * mvx_v4l2_buffer_get() - Copy VBUF to V4L2 buffer. + * @vbuf: Source MVX V4L2 buffer. + * @b: Destination V4L2 buffer. + * + * Copies parameters from 'vbuf' to 'b'. + */ +void mvx_v4l2_buffer_get(struct mvx_v4l2_buffer *vbuf, + struct v4l2_buffer *b); + +/** + * mvx_v4l2_buffer_update() - Update the V4L2 buffer. + * @vbuf: Pointer to MVX V4L2 buffer. + * + * This function copies parameters from the MVX buffer to the V4L2 buffer. + * It also sets the time stamp and validates that the buffer length is correct. + * If an error is detectd the buffer length is cleared and the error flag + * is set. + * + * This function should be called after the MVX buffer has changed, for example + * after it has been returned by the firmware or flushed. + * + * Return: VB2_BUF_STATE_DONE on success, else VB2_BUF_STATE_ERROR. + */ +enum vb2_buffer_state mvx_v4l2_buffer_update(struct mvx_v4l2_buffer *vbuf); + +#endif /* _MVX_V4L2_BUFFER_H_ */ diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_v4l2_ctrls.c b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_v4l2_ctrls.c new file mode 100755 index 000000000..af38b87b9 --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_v4l2_ctrls.c @@ -0,0 +1,1849 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +/**************************************************************************** + * Includes + ****************************************************************************/ +#include + +#include "mvx_bitops.h" +#include "mvx_v4l2_ctrls.h" +#include "mvx_v4l2_session.h" +#include "mvx-v4l2-controls.h" + +/**************************************************************************** + * Static functions and variables + ****************************************************************************/ + +/* + * V4L2_CID_MVE_VIDEO_NALU_FORMAT control defines. + */ +static const char *const nalu_format_str[] = { + "Start codes", + "One nalu per buffer", + "One byte length field", + "Two byte length field", + "Four byte length field" +}; + +static const enum mvx_nalu_format mvx_nalu_format_list[] = { + MVX_NALU_FORMAT_START_CODES, + MVX_NALU_FORMAT_ONE_NALU_PER_BUFFER, + MVX_NALU_FORMAT_ONE_BYTE_LENGTH_FIELD, + MVX_NALU_FORMAT_TWO_BYTE_LENGTH_FIELD, + MVX_NALU_FORMAT_FOUR_BYTE_LENGTH_FIELD +}; + +/* + * V4L2_CID_MVE_VIDEO_H265_PROFILE control defines. + */ +static const char *const h265_profile_str[] = { + "Main", + "Main still", + "Main intra", + "Main10" +}; + +static const int mvx_h265_profile_list[] = { + MVX_PROFILE_H265_MAIN, + MVX_PROFILE_H265_MAIN_STILL, + MVX_PROFILE_H265_MAIN_INTRA, + MVX_PROFILE_H265_MAIN_10, +}; + +/* + * V4L2_CID_MVE_VIDEO_VC1_PROFILE control defines. + */ +static const char *const vc1_profile_str[] = { + "Simple", + "Main", + "Advanced" +}; + +static const int mvx_vc1_profile_list[] = { + MVX_PROFILE_VC1_SIMPLE, + MVX_PROFILE_VC1_MAIN, + MVX_PROFILE_VC1_ADVANCED +}; + +/* + * V4L2_CID_MPEG_VIDEO_H264_PROFILE control defines. + */ +static const uint8_t h264_profile_list[] = { + V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE, + V4L2_MPEG_VIDEO_H264_PROFILE_MAIN, + V4L2_MPEG_VIDEO_H264_PROFILE_HIGH, + V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10 +}; + +static const enum mvx_profile mvx_h264_profile_list[] = { + MVX_PROFILE_H264_BASELINE, + MVX_PROFILE_H264_MAIN, + MVX_PROFILE_H264_HIGH, + MVX_PROFILE_H264_HIGH_10 +}; + +/* + * V4L2_CID_MPEG_VIDEO_H264_LEVEL control defines. + */ +static uint8_t h264_level_list[] = { + V4L2_MPEG_VIDEO_H264_LEVEL_1_0, + V4L2_MPEG_VIDEO_H264_LEVEL_1B, + V4L2_MPEG_VIDEO_H264_LEVEL_1_1, + V4L2_MPEG_VIDEO_H264_LEVEL_1_2, + V4L2_MPEG_VIDEO_H264_LEVEL_1_3, + V4L2_MPEG_VIDEO_H264_LEVEL_2_0, + V4L2_MPEG_VIDEO_H264_LEVEL_2_1, + V4L2_MPEG_VIDEO_H264_LEVEL_2_2, + V4L2_MPEG_VIDEO_H264_LEVEL_3_0, + V4L2_MPEG_VIDEO_H264_LEVEL_3_1, + V4L2_MPEG_VIDEO_H264_LEVEL_3_2, + V4L2_MPEG_VIDEO_H264_LEVEL_4_0, + V4L2_MPEG_VIDEO_H264_LEVEL_4_1, + V4L2_MPEG_VIDEO_H264_LEVEL_4_2, + V4L2_MPEG_VIDEO_H264_LEVEL_5_0, + V4L2_MPEG_VIDEO_H264_LEVEL_5_1 +}; + +static const int mvx_h264_level_list[] = { + MVX_LEVEL_H264_1, + MVX_LEVEL_H264_1b, + MVX_LEVEL_H264_11, + MVX_LEVEL_H264_12, + MVX_LEVEL_H264_13, + MVX_LEVEL_H264_2, + MVX_LEVEL_H264_21, + MVX_LEVEL_H264_22, + MVX_LEVEL_H264_3, + MVX_LEVEL_H264_31, + MVX_LEVEL_H264_32, + MVX_LEVEL_H264_4, + MVX_LEVEL_H264_41, + MVX_LEVEL_H264_42, + MVX_LEVEL_H264_5, + MVX_LEVEL_H264_51 +}; + +/* + * V4L2_CID_MVE_VIDEO_H265_LEVEL control defines. + */ +static const char *const h265_level_str[] = { + "None", + + "Main 1", + "High 1", + + "Main 2", + "High 2", + "Main 2.1", + "High 2.1", + + "Main 3", + "High 3", + "Main 3.1", + "High 3.1", + + "Main 4", + "High 4", + "Main 4.1", + "High 4.1", + + "Main 5", + "High 5", + "Main 5.1", + "High 5.1", + "Main 5.2", + "High 5.2", + + "Main 6", + "High 6", + "Main 6.1", + "High 6.1", + "Main 6.2", + "High 6.2" +}; + +static const int mvx_h265_level_list[] = { + MVX_LEVEL_NONE, + + MVX_LEVEL_H265_MAIN_1, + MVX_LEVEL_H265_HIGH_1, + + MVX_LEVEL_H265_MAIN_2, + MVX_LEVEL_H265_HIGH_2, + MVX_LEVEL_H265_MAIN_21, + MVX_LEVEL_H265_HIGH_21, + + MVX_LEVEL_H265_MAIN_3, + MVX_LEVEL_H265_HIGH_3, + MVX_LEVEL_H265_MAIN_31, + MVX_LEVEL_H265_HIGH_31, + + MVX_LEVEL_H265_MAIN_4, + MVX_LEVEL_H265_HIGH_4, + MVX_LEVEL_H265_MAIN_41, + MVX_LEVEL_H265_HIGH_41, + + MVX_LEVEL_H265_MAIN_5, + MVX_LEVEL_H265_HIGH_5, + MVX_LEVEL_H265_MAIN_51, + MVX_LEVEL_H265_HIGH_51, + MVX_LEVEL_H265_MAIN_52, + MVX_LEVEL_H265_HIGH_52, + + MVX_LEVEL_H265_MAIN_6, + MVX_LEVEL_H265_HIGH_6, + MVX_LEVEL_H265_MAIN_61, + MVX_LEVEL_H265_HIGH_61, + MVX_LEVEL_H265_MAIN_62, + MVX_LEVEL_H265_HIGH_62 +}; + +/* + * V4L2_CID_MVE_VIDEO_GOP_TYPE control defines. + */ +static const char *const gop_type_str[] = { + "None", + "Bidirectional", + "Low delay", + "Pyramid", + "svct3", + "gdr" +}; + +static const enum mvx_gop_type mvx_gop_type_list[] = { + MVX_GOP_TYPE_NONE, + MVX_GOP_TYPE_BIDIRECTIONAL, + MVX_GOP_TYPE_LOW_DELAY, + MVX_GOP_TYPE_PYRAMID, + MVX_GOP_TYPE_SVCT3, + MVX_GOP_TYPE_GDR +}; + +/* + * V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE control defines. + */ +#define V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_NONE 2 + +static const uint8_t h264_entropy_mode_list[] = { + V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC, + V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC, + V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_NONE +}; + +static const enum mvx_entropy_mode mvx_h264_entropy_mode_list[] = { + MVX_ENTROPY_MODE_CAVLC, + MVX_ENTROPY_MODE_CABAC, + MVX_ENTROPY_MODE_NONE +}; + +static const char *const h264_entropy_mode_str[] = { + "CAVLC", + "CABAC", + "None" +}; + +/* + * V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE controls list. + */ +static uint8_t multi_slice_mode_list[] = { + V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE, + + /* Misspelling in the header file */ + V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_MAX_MB +}; + +static const enum mvx_multi_slice_mode mvx_multi_slice_mode_list[] = { + MVX_MULTI_SLICE_MODE_SINGLE, + MVX_MULTI_SLICE_MODE_MAX_MB +}; + +/* + * V4L2_CID_MVE_VIDEO_VP9_PROB_UPDATE control defines. + */ +static const char *const vp9_prob_update_str[] = { + "Disabled", + "Implicit", + "Explicit" +}; + +static const enum mvx_vp9_prob_update mvx_vp9_prob_update_list[] = { + MVX_VP9_PROB_UPDATE_DISABLED, + MVX_VP9_PROB_UPDATE_IMPLICIT, + MVX_VP9_PROB_UPDATE_EXPLICIT +}; + +/* + * V4L2_CID_MVE_VIDEO_RGB_TO_YUV_MODE control defines. + */ +static const char *const rgb_to_yuv_mode_str[] = { + "BT601 studio", + "BT601 full", + "BT709 studio", + "BT709 full", + "BT2020 studio", + "BT2020 full", + "rgb to yuv mode max" +}; + +static const enum mvx_rgb_to_yuv_mode mvx_rgb_to_yuv_mode_list[] = { + MVX_RGB_TO_YUV_MODE_BT601_STUDIO, + MVX_RGB_TO_YUV_MODE_BT601_FULL, + MVX_RGB_TO_YUV_MODE_BT709_STUDIO, + MVX_RGB_TO_YUV_MODE_BT709_FULL, + MVX_RGB_TO_YUV_MODE_BT2020_STUDIO, + MVX_RGB_TO_YUV_MODE_BT2020_FULL, + MVX_RGB_TO_YUV_MODE_MAX +}; + +/** + * find_idx() - Find index of a value in an array. + * @list: Pointer to an array. + * @size: Size of an array. + * @val: Value to look for. + * + * Return: Index of the first occurrence of 'val' in 'list', + * or -EINVAL when not found. + */ +static int find_idx(const uint8_t *list, + size_t size, + uint8_t val) +{ + while (size--) + if (list[size] == val) + return size; + + return -EINVAL; +} + +/** + * set_ctrl() - Callback used by V4L2 framework to set a control. + * @ctrl: V4L2 control. + * + * Return: 0 on success, error code otherwise. + */ +static int set_ctrl(struct v4l2_ctrl *ctrl) +{ + int ret = 0; + struct mvx_v4l2_session *vsession = + container_of(ctrl->handler, struct mvx_v4l2_session, + v4l2_ctrl); + struct mvx_session *session = &vsession->session; + enum mvx_nalu_format nalu_fmt; + enum mvx_profile mvx_profile; + enum mvx_level mvx_level; + enum mvx_gop_type gop_type; + enum mvx_entropy_mode entropy_mode; + enum mvx_multi_slice_mode multi_slice_mode; + enum mvx_vp9_prob_update vp9_prob_update; + enum mvx_rgb_to_yuv_mode rgb_to_yuv_mode; + int32_t i32_val; + int64_t i64_val; + bool bool_val; + enum mvx_tristate tri_val; + struct mvx_buffer_param_rate_control rc; + + ret = mutex_lock_interruptible(&vsession->mutex); + if (ret != 0) + return ret; + switch (ctrl->id) { + case V4L2_CID_MPEG_VIDEO_GOP_SIZE: + i32_val = *ctrl->p_new.p_s32 - 1; + ret = mvx_session_set_p_frames(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_SECURE_VIDEO: + bool_val = *ctrl->p_new.p_s32 != 0; + ret = mvx_session_set_securevideo(session, bool_val); + break; + case V4L2_CID_MVE_VIDEO_FRAME_RATE: + i64_val = *ctrl->p_new.p_s64; + ret = mvx_session_set_frame_rate(session, i64_val); + break; + case V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE: + bool_val = *ctrl->p_new.p_s32 != 0; + ret = mvx_session_set_rate_control(session, bool_val); + break; + case V4L2_CID_MPEG_VIDEO_BITRATE: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_bitrate(session, i32_val); + rc.rate_control_mode = MVX_OPT_RATE_CONTROL_MODE_CONSTANT; + rc.target_bitrate = i32_val; + rc.maximum_bitrate = rc.target_bitrate; + ret = mvx_session_set_bitrate_control(session, &rc); + break; + case V4L2_CID_MVE_VIDEO_CROP_LEFT: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_crop_left(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_CROP_RIGHT: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_crop_right(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_CROP_TOP: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_crop_top(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_CROP_BOTTOM: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_crop_bottom(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_RC_I_MODE: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_rc_bit_i_mode(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_RC_I_RATIO: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_rc_bit_i_ratio(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_INTER_MED_BUF_SIZE: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_inter_med_buf_size(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_SVCT3_LEVEL1_PERIOD: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_svct3_level1_period(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_HRD_BUFFER_SIZE: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_hrd_buffer_size(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_NALU_FORMAT: + i32_val = *ctrl->p_new.p_s32; + nalu_fmt = mvx_nalu_format_list[i32_val]; + ret = mvx_session_set_nalu_format(session, nalu_fmt); + break; + case V4L2_CID_MVE_VIDEO_STREAM_ESCAPING: + tri_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_stream_escaping(session, tri_val); + break; + case V4L2_CID_MPEG_VIDEO_H264_PROFILE: + i32_val = *ctrl->p_new.p_s32; + ret = find_idx(h264_profile_list, + ARRAY_SIZE(h264_profile_list), i32_val); + if (ret == -EINVAL) + goto unlock_mutex; + + mvx_profile = mvx_h264_profile_list[ret]; + ret = mvx_session_set_profile(session, + MVX_FORMAT_H264, + mvx_profile); + break; + case V4L2_CID_MVE_VIDEO_H265_PROFILE: + i32_val = *ctrl->p_new.p_s32; + mvx_profile = mvx_h265_profile_list[i32_val]; + ret = mvx_session_set_profile(session, + MVX_FORMAT_HEVC, + mvx_profile); + break; + case V4L2_CID_MVE_VIDEO_VC1_PROFILE: + i32_val = *ctrl->p_new.p_s32; + mvx_profile = mvx_vc1_profile_list[i32_val]; + ret = mvx_session_set_profile(session, + MVX_FORMAT_VC1, + mvx_profile); + break; + case V4L2_CID_MPEG_VIDEO_H264_LEVEL: + i32_val = *ctrl->p_new.p_s32; + ret = find_idx(h264_level_list, + ARRAY_SIZE(h264_level_list), i32_val); + if (ret == -EINVAL) + goto unlock_mutex; + + mvx_level = mvx_h264_level_list[ret]; + ret = mvx_session_set_level(session, + MVX_FORMAT_H264, + mvx_level); + break; + case V4L2_CID_MVE_VIDEO_H265_LEVEL: + i32_val = *ctrl->p_new.p_s32; + mvx_level = mvx_h265_level_list[i32_val]; + ret = mvx_session_set_level(session, + MVX_FORMAT_HEVC, + mvx_level); + break; + case V4L2_CID_MVE_VIDEO_IGNORE_STREAM_HEADERS: + tri_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_ignore_stream_headers(session, tri_val); + break; + case V4L2_CID_MVE_VIDEO_FRAME_REORDERING: + tri_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_frame_reordering(session, tri_val); + break; + case V4L2_CID_MVE_VIDEO_INTBUF_SIZE: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_intbuf_size(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_P_FRAMES: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_p_frames(session, i32_val); + break; + case V4L2_CID_MPEG_VIDEO_B_FRAMES: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_b_frames(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_GOP_TYPE: + i32_val = *ctrl->p_new.p_s32; + gop_type = mvx_gop_type_list[i32_val]; + ret = mvx_session_set_gop_type(session, gop_type); + break; + case V4L2_CID_MPEG_VIDEO_CYCLIC_INTRA_REFRESH_MB: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_cyclic_intra_refresh_mb(session, + i32_val); + break; + case V4L2_CID_MVE_VIDEO_CONSTR_IPRED: + tri_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_constr_ipred(session, tri_val); + break; + case V4L2_CID_MVE_VIDEO_ENTROPY_SYNC: + tri_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_entropy_sync(session, tri_val); + break; + case V4L2_CID_MVE_VIDEO_TEMPORAL_MVP: + tri_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_temporal_mvp(session, tri_val); + break; + case V4L2_CID_MVE_VIDEO_TILE_ROWS: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_tile_rows(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_TILE_COLS: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_tile_cols(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_MIN_LUMA_CB_SIZE: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_min_luma_cb_size(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_MB_MASK: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_mb_mask(session, i32_val); + break; + case V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE: + i32_val = *ctrl->p_new.p_s32; + ret = find_idx(h264_entropy_mode_list, + ARRAY_SIZE(h264_entropy_mode_list), i32_val); + if (ret == -EINVAL) + goto unlock_mutex; + + entropy_mode = mvx_h264_entropy_mode_list[ret]; + ret = mvx_session_set_entropy_mode(session, entropy_mode); + break; + case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE: + i32_val = *ctrl->p_new.p_s32; + ret = find_idx(multi_slice_mode_list, + ARRAY_SIZE(multi_slice_mode_list), i32_val); + if (ret == -EINVAL) + goto unlock_mutex; + + multi_slice_mode = mvx_multi_slice_mode_list[ret]; + ret = mvx_session_set_multi_slice_mode(session, + multi_slice_mode); + break; + case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_multi_slice_max_mb(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_VP9_PROB_UPDATE: + i32_val = *ctrl->p_new.p_s32; + vp9_prob_update = mvx_vp9_prob_update_list[i32_val]; + ret = mvx_session_set_vp9_prob_update(session, + vp9_prob_update); + break; + case V4L2_CID_MPEG_VIDEO_MV_H_SEARCH_RANGE: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_mv_h_search_range(session, i32_val); + break; + case V4L2_CID_MPEG_VIDEO_MV_V_SEARCH_RANGE: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_mv_v_search_range(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_BITDEPTH_CHROMA: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_bitdepth_chroma(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_BITDEPTH_LUMA: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_bitdepth_luma(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_GOP_RESET_PFRAMES: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_gop_reset_pframes(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_LTR_RESET_PERIOD: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_ltr_reset_period(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_FORCE_CHROMA_FORMAT: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_force_chroma_format(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_RGB_TO_YUV_MODE: + i32_val = *ctrl->p_new.p_s32; + rgb_to_yuv_mode = mvx_rgb_to_yuv_mode_list[i32_val]; + ret = mvx_session_set_rgb_to_yuv_mode(session, + rgb_to_yuv_mode); + break; + case V4L2_CID_MVE_VIDEO_BANDWIDTH_LIMIT: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_band_limit(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_CABAC_INIT_IDC: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_cabac_init_idc(session, i32_val); + break; + case V4L2_CID_MPEG_VIDEO_H263_I_FRAME_QP: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_i_frame_qp(session, MVX_FORMAT_H263, + i32_val); + break; + case V4L2_CID_MPEG_VIDEO_H263_P_FRAME_QP: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_p_frame_qp(session, MVX_FORMAT_H263, + i32_val); + break; + case V4L2_CID_MPEG_VIDEO_H263_B_FRAME_QP: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_b_frame_qp(session, MVX_FORMAT_H263, + i32_val); + break; + case V4L2_CID_MPEG_VIDEO_H263_MIN_QP: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_min_qp(session, MVX_FORMAT_H263, + i32_val); + break; + case V4L2_CID_MPEG_VIDEO_H263_MAX_QP: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_max_qp(session, MVX_FORMAT_H263, + i32_val); + break; + case V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_i_frame_qp(session, MVX_FORMAT_H264, + i32_val); + break; + case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_p_frame_qp(session, MVX_FORMAT_H264, + i32_val); + break; + case V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_b_frame_qp(session, MVX_FORMAT_H264, + i32_val); + break; + case V4L2_CID_MPEG_VIDEO_H264_MIN_QP: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_min_qp(session, MVX_FORMAT_H264, + i32_val); + break; + case V4L2_CID_MPEG_VIDEO_H264_MAX_QP: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_max_qp(session, MVX_FORMAT_H264, + i32_val); + break; + case V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_QP: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_i_frame_qp(session, MVX_FORMAT_HEVC, + i32_val); + break; + case V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_QP: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_p_frame_qp(session, MVX_FORMAT_HEVC, + i32_val); + break; + case V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QP: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_b_frame_qp(session, MVX_FORMAT_HEVC, + i32_val); + break; + case V4L2_CID_MPEG_VIDEO_HEVC_MIN_QP: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_min_qp(session, MVX_FORMAT_HEVC, + i32_val); + break; + case V4L2_CID_MPEG_VIDEO_HEVC_MAX_QP: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_max_qp(session, MVX_FORMAT_HEVC, + i32_val); + break; + case V4L2_CID_MPEG_VIDEO_VPX_I_FRAME_QP: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_i_frame_qp(session, MVX_FORMAT_VP9, + i32_val); + break; + case V4L2_CID_MPEG_VIDEO_VPX_P_FRAME_QP: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_p_frame_qp(session, MVX_FORMAT_VP9, + i32_val); + break; + case V4L2_CID_MVE_VIDEO_VPX_B_FRAME_QP: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_b_frame_qp(session, MVX_FORMAT_VP9, + i32_val); + break; + case V4L2_CID_MPEG_VIDEO_VPX_MIN_QP: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_min_qp(session, MVX_FORMAT_VP9, + i32_val); + break; + case V4L2_CID_MPEG_VIDEO_VPX_MAX_QP: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_max_qp(session, MVX_FORMAT_VP9, + i32_val); + break; + case V4L2_CID_JPEG_RESTART_INTERVAL: + i32_val = *ctrl->p_new.p_s32; + if (i32_val != -1) + ret = mvx_session_set_resync_interval(session, i32_val); + + break; + case V4L2_CID_MVE_VIDEO_INIT_QP_I: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_init_qp_i(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_INIT_QP_P: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_init_qp_p(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_SAO_LUMA: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_sao_luma(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_SAO_CHROMA: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_sao_chroma(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_QP_DELTA_I_P: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_delta_I_P(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_QP_REF_RB_EN: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_ref_rb_eb(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_RC_CLIP_TOP: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_rc_clip_top(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_RC_CLIP_BOT: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_rc_clip_bot(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_QP_MAP_CLIP_TOP: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_qpmap_clip_top(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_QP_MAP_CLIP_BOT: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_qpmap_clip_bot(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_MAX_QP_I: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_max_qp_i(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_MIN_QP_I: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_min_qp_i(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_QP_FIXED: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_fixedqp(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_FW_PROFILING: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_fw_profiling(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_VISIBLE_WIDTH: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_visible_width(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_VISIBLE_HEIGHT: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_visible_height(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_GDR_NUMBER: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_gdr_number(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_SCD_ENABLE: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_scd_enable(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_SCD_PERCENT: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_scd_percent(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_SCD_THRESHOLD: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_scd_threshold(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_AQ_SSIM_EN: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_aq_ssim_en(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_AQ_NEG_RATIO: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_aq_neg_ratio(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_AQ_POS_RATIO: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_aq_pos_ratio(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_AQ_QPDELTA_LMT: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_aq_qpdelta_lmt(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_AQ_INIT_FRM_AVG_SVAR: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_aq_init_frm_avg_svar(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_GDR_PERIOD: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_gdr_period(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_MULTI_SPS_PPS: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_multi_sps_pps(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_ENABLE_VISUAL: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_enable_visual(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_ENABLE_ADAPTIVE_INTRA_BLOCK: + i32_val = *ctrl->p_new.p_s32; + if (i32_val != 0) + ret = mvx_session_set_adaptive_intra_block(session, i32_val); + break; + case V4L2_CID_JPEG_COMPRESSION_QUALITY: + i32_val = *ctrl->p_new.p_s32; + if (i32_val != 0) + ret = mvx_session_set_jpeg_quality(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_JPEG_QUALITY_LUMA: + i32_val = *ctrl->p_new.p_s32; + if (i32_val != 0) + ret = mvx_session_set_jpeg_quality_luma(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_JPEG_QUALITY_CHROMA: + i32_val = *ctrl->p_new.p_s32; + if (i32_val != 0) + ret = mvx_session_set_jpeg_quality_chroma(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_COLOR_CONVERSION: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_color_conversion(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_FORCED_UV_VALUE: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_forced_uv_value(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_DSL_INTERP_MODE: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_dsl_interpolation_mode(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_DISABLED_FEATURES: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_disabled_features(session, i32_val); + break; + case V4L2_CID_MVE_VIDEO_CHANGE_POS: + i32_val = *ctrl->p_new.p_s32; + ret = mvx_session_set_change_pos(session, i32_val); + break; + } +unlock_mutex: + mutex_unlock(&vsession->mutex); + + return ret; +} + +/** + * get_volatile_ctrl() - Get control value. + * @ctrl: V4L2 control. + * + * Return: 0 on success, else error code. + */ +static int get_volatile_ctrl(struct v4l2_ctrl *ctrl) +{ + struct mvx_v4l2_session *vsession = + container_of(ctrl->handler, struct mvx_v4l2_session, + v4l2_ctrl); + + switch (ctrl->id) { + case V4L2_CID_MIN_BUFFERS_FOR_OUTPUT: + ctrl->val = vsession->session.port[MVX_DIR_INPUT].buffer_min; + break; + case V4L2_CID_MIN_BUFFERS_FOR_CAPTURE: + ctrl->val = vsession->session.port[MVX_DIR_OUTPUT].buffer_min; + break; + default: + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "Unsupported get control. id=%u.", + ctrl->id); + return -EINVAL; + } + + return 0; +} + +/* + * Callbacks required by V4L2 framework to implement controls support. + */ +static const struct v4l2_ctrl_ops ctrl_ops = { + .g_volatile_ctrl = get_volatile_ctrl, + .s_ctrl = set_ctrl +}; + +/** + * get_skip_mask() - Calculate V4L2 menu skip mask. + * @list: Array of menu items. + * @cnt: Number of menu items. + * + * Return: V4L2 menu skip mask. + */ +static uint64_t get_skip_mask(const uint8_t *list, + size_t cnt) +{ + uint64_t mask = 0; + int i; + + for (i = 0; i < cnt; ++i) + mvx_set_bit(list[i], &mask); + + return ~mask; +} + +/** + * mvx_v4l2_ctrl_new_custom_int() - Create custom V4L2 integer control. + * @hnd: V4L2 handler. + * @id: Id of a control. + * @name: Name of a control. + * @min: Minimum allowed value. + * @max: Maximum allowed value. + * @def: Default value. + * @step: Step. + * + * Return: Pointer to v4l2_ctrl structure in case of success, + * or NULL in case of failure. + */ +static struct v4l2_ctrl *mvx_v4l2_ctrl_new_custom_int( + struct v4l2_ctrl_handler *hnd, + int id, + const char *name, + int64_t min, + int64_t max, + int64_t def, + int32_t step) +{ + struct v4l2_ctrl_config cfg; + + memset(&cfg, 0, sizeof(cfg)); + + cfg.id = id; + cfg.ops = &ctrl_ops; + cfg.type = V4L2_CTRL_TYPE_INTEGER; + cfg.name = name; + cfg.min = min; + cfg.max = max; + cfg.def = def; + cfg.step = step; + + return v4l2_ctrl_new_custom(hnd, &cfg, NULL); +} + +/** + * mvx_v4l2_ctrl_new_custom_tristate() - Create custom V4L2 tristate control. + * @hnd: V4L2 handler. + * @id: Id of a control. + * @name: Name of a control. + * @def: Default value. + * + * Return: Pointer to v4l2_ctrl structure in case of success, + * or NULL in case of failure. + */ +static struct v4l2_ctrl *mvx_v4l2_ctrl_new_custom_tristate( + struct v4l2_ctrl_handler *hnd, + int id, + const char *name, + enum mvx_tristate def) +{ + struct v4l2_ctrl_config cfg; + + memset(&cfg, 0, sizeof(cfg)); + + cfg.id = id; + cfg.ops = &ctrl_ops; + cfg.type = V4L2_CTRL_TYPE_INTEGER; + cfg.name = name; + cfg.min = -1; + cfg.max = 1; + cfg.def = def; + cfg.step = 1; + + return v4l2_ctrl_new_custom(hnd, &cfg, NULL); +} + +/**************************************************************************** + * Exported functions + ****************************************************************************/ + +int mvx_v4l2_ctrls_init(struct v4l2_ctrl_handler *hnd) +{ + int ret; + struct v4l2_ctrl_config cfg; + struct v4l2_ctrl *ctrl; + + ret = v4l2_ctrl_handler_init(hnd, 128); + if (ret != 0) + return ret; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_SECURE_VIDEO, + "secure video", 0, 1, 0, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_FRAME_RATE, + "frame rate", 0, 0x10000000, 30 << 16, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_CROP_LEFT, + "video crop left", 0, 10000000, 0, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_CROP_RIGHT, + "video crop right", 0, 10000000, 0, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_CROP_TOP, + "video crop top", 0, 10000000, 0, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_CROP_BOTTOM, + "video crop bottom", 0, 10000000, 0, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_RC_I_MODE, + "i frame bit mode of rc", 0, 1, 0, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_RC_I_RATIO, + "i frame bit ratio of rc", 0, 100, 0, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_INTER_MED_BUF_SIZE, + "intermediate buffer size", 0, 1073741823, 0, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_SVCT3_LEVEL1_PERIOD, + "svct3 level1 period", 0, 255, 0, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_HRD_BUFFER_SIZE, + "HRD buffer size", 0, 1073741823, 0, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = v4l2_ctrl_new_std( + hnd, &ctrl_ops, V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE, + 0, 1, 1, 0); + if (ctrl == NULL) + goto handler_free; + + ctrl = v4l2_ctrl_new_std( + hnd, &ctrl_ops, V4L2_CID_MPEG_VIDEO_BITRATE, + 1000, 1000000000, 1, 2500000); + if (ctrl == NULL) + goto handler_free; + + ctrl = v4l2_ctrl_new_std( + hnd, &ctrl_ops, V4L2_CID_MPEG_VIDEO_GOP_SIZE, + 0, 10000, 1, 29); + if (ctrl == NULL) + goto handler_free; + + memset(&cfg, 0, sizeof(cfg)); + cfg.id = V4L2_CID_MVE_VIDEO_NALU_FORMAT; + cfg.ops = &ctrl_ops; + cfg.type = V4L2_CTRL_TYPE_MENU; + cfg.name = "nalu format"; + cfg.max = ARRAY_SIZE(nalu_format_str) - 1; + cfg.def = 0; + cfg.qmenu = nalu_format_str; + ctrl = v4l2_ctrl_new_custom(hnd, &cfg, NULL); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_tristate( + hnd, V4L2_CID_MVE_VIDEO_STREAM_ESCAPING, + "stream escaping", MVX_TRI_UNSET); + if (ctrl == NULL) + goto handler_free; + + ctrl = v4l2_ctrl_new_std_menu( + hnd, &ctrl_ops, V4L2_CID_MPEG_VIDEO_H264_PROFILE, + V4L2_MPEG_VIDEO_H264_PROFILE_HIGH_10, + get_skip_mask(h264_profile_list, + ARRAY_SIZE(h264_profile_list)), + V4L2_MPEG_VIDEO_H264_PROFILE_HIGH); + if (ctrl == NULL) + goto handler_free; + + memset(&cfg, 0, sizeof(cfg)); + cfg.id = V4L2_CID_MVE_VIDEO_H265_PROFILE; + cfg.ops = &ctrl_ops; + cfg.type = V4L2_CTRL_TYPE_MENU; + cfg.name = "h265 profile"; + cfg.max = ARRAY_SIZE(h265_profile_str) - 1; + cfg.def = 0; + cfg.qmenu = h265_profile_str; + ctrl = v4l2_ctrl_new_custom(hnd, &cfg, NULL); + if (ctrl == NULL) + goto handler_free; + + memset(&cfg, 0, sizeof(cfg)); + cfg.id = V4L2_CID_MVE_VIDEO_VC1_PROFILE; + cfg.ops = &ctrl_ops; + cfg.type = V4L2_CTRL_TYPE_MENU; + cfg.name = "vc1 profile"; + cfg.max = ARRAY_SIZE(vc1_profile_str) - 1; + cfg.def = 0; + cfg.qmenu = vc1_profile_str; + ctrl = v4l2_ctrl_new_custom(hnd, &cfg, NULL); + if (ctrl == NULL) + goto handler_free; + + ctrl = v4l2_ctrl_new_std_menu( + hnd, &ctrl_ops, V4L2_CID_MPEG_VIDEO_H264_LEVEL, + V4L2_MPEG_VIDEO_H264_LEVEL_5_1, + get_skip_mask(h264_level_list, ARRAY_SIZE(h264_level_list)), + V4L2_MPEG_VIDEO_H264_LEVEL_5_1); + if (ctrl == NULL) + goto handler_free; + + memset(&cfg, 0, sizeof(cfg)); + cfg.id = V4L2_CID_MVE_VIDEO_H265_LEVEL; + cfg.ops = &ctrl_ops; + cfg.type = V4L2_CTRL_TYPE_MENU; + cfg.name = "h265 level"; + cfg.max = ARRAY_SIZE(h265_level_str) - 1; + cfg.def = 17; //"Main 5.1" + cfg.qmenu = h265_level_str; + ctrl = v4l2_ctrl_new_custom(hnd, &cfg, NULL); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_tristate( + hnd, V4L2_CID_MVE_VIDEO_IGNORE_STREAM_HEADERS, + "ignore stream headers", MVX_TRI_UNSET); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_tristate( + hnd, V4L2_CID_MVE_VIDEO_FRAME_REORDERING, + "frame reordering", MVX_TRI_UNSET); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_INTBUF_SIZE, + "internal buffer size", 0, INT_MAX, 0, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_P_FRAMES, + "video P frames", 0, INT_MAX, 0, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = v4l2_ctrl_new_std( + hnd, &ctrl_ops, V4L2_CID_MPEG_VIDEO_B_FRAMES, + 0, INT_MAX, 1, 0); + if (ctrl == NULL) + goto handler_free; + + memset(&cfg, 0, sizeof(cfg)); + cfg.id = V4L2_CID_MVE_VIDEO_GOP_TYPE; + cfg.ops = &ctrl_ops; + cfg.type = V4L2_CTRL_TYPE_MENU; + cfg.name = "GOP type"; + cfg.max = ARRAY_SIZE(gop_type_str) - 1; + cfg.def = 0; + cfg.qmenu = gop_type_str; + ctrl = v4l2_ctrl_new_custom(hnd, &cfg, NULL); + if (ctrl == NULL) + goto handler_free; + + ctrl = v4l2_ctrl_new_std( + hnd, &ctrl_ops, V4L2_CID_MPEG_VIDEO_CYCLIC_INTRA_REFRESH_MB, + 0, INT_MAX, 1, 0); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_tristate( + hnd, V4L2_CID_MVE_VIDEO_CONSTR_IPRED, + "constrained intra prediction", MVX_TRI_UNSET); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_tristate( + hnd, V4L2_CID_MVE_VIDEO_ENTROPY_SYNC, "entropy sync", + MVX_TRI_UNSET); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_tristate( + hnd, V4L2_CID_MVE_VIDEO_TEMPORAL_MVP, + "temporal mvp", MVX_TRI_UNSET); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_TILE_ROWS, + "tile rows", 0, 65536, 0, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_TILE_COLS, + "tile columns", 0, 65536, 0, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_MIN_LUMA_CB_SIZE, + "min luma cb size", 0, 16, 0, 8); + if (ctrl == NULL) + goto handler_free; + + memset(&cfg, 0, sizeof(cfg)); + cfg.id = V4L2_CID_MVE_VIDEO_MB_MASK; + cfg.ops = &ctrl_ops; + cfg.type = V4L2_CTRL_TYPE_BITMASK; + cfg.name = "macroblocks mask"; + cfg.def = 0x7fff; + cfg.min = 0; + cfg.max = 0x7fff; + cfg.step = 0; + ctrl = v4l2_ctrl_new_custom(hnd, &cfg, NULL); + if (ctrl == NULL) + goto handler_free; + + memset(&cfg, 0, sizeof(cfg)); + cfg.id = V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE; + cfg.ops = &ctrl_ops; + cfg.type = V4L2_CTRL_TYPE_MENU; + cfg.name = "H264 Entropy Mode"; + cfg.max = ARRAY_SIZE(h264_entropy_mode_str) - 1; + cfg.def = V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_NONE; + cfg.qmenu = h264_entropy_mode_str; + ctrl = v4l2_ctrl_new_custom(hnd, &cfg, NULL); + if (ctrl == NULL) + goto handler_free; + + ctrl = v4l2_ctrl_new_std_menu( + hnd, &ctrl_ops, V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE, + V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_MAX_MB, + + get_skip_mask(multi_slice_mode_list, + ARRAY_SIZE(multi_slice_mode_list)), + V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE); + if (ctrl == NULL) + goto handler_free; + + ctrl = v4l2_ctrl_new_std( + hnd, &ctrl_ops, V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB, + 0, INT_MAX, 1, 0); + if (ctrl == NULL) + goto handler_free; + + memset(&cfg, 0, sizeof(cfg)); + cfg.id = V4L2_CID_MVE_VIDEO_VP9_PROB_UPDATE; + cfg.ops = &ctrl_ops; + cfg.type = V4L2_CTRL_TYPE_MENU; + cfg.name = "VP9 prob update"; + cfg.max = ARRAY_SIZE(vp9_prob_update_str) - 1; + cfg.def = cfg.max; + cfg.qmenu = vp9_prob_update_str; + ctrl = v4l2_ctrl_new_custom(hnd, &cfg, NULL); + if (ctrl == NULL) + goto handler_free; + + ctrl = v4l2_ctrl_new_std( + hnd, &ctrl_ops, V4L2_CID_MPEG_VIDEO_MV_H_SEARCH_RANGE, + 0, INT_MAX, 1, 0); + if (ctrl == NULL) + goto handler_free; + + ctrl = v4l2_ctrl_new_std( + hnd, &ctrl_ops, V4L2_CID_MPEG_VIDEO_MV_V_SEARCH_RANGE, + 0, INT_MAX, 1, 0); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_BITDEPTH_CHROMA, + "bitdepth chroma", 0, 0xff, 0, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_BITDEPTH_LUMA, + "bitdepth luma", 0, 0xff, 0, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_GOP_RESET_PFRAMES, + "gop reset p frames", 0, 0xff, 0, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_LTR_RESET_PERIOD, + "ltr reset period", 0, 0xffff, 0, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_FORCE_CHROMA_FORMAT, + "force chroma format", -1, INT_MAX, 0, 1); + if (ctrl == NULL) + goto handler_free; + + memset(&cfg, 0, sizeof(cfg)); + cfg.id = V4L2_CID_MVE_VIDEO_RGB_TO_YUV_MODE; + cfg.ops = &ctrl_ops; + cfg.type = V4L2_CTRL_TYPE_MENU; + cfg.name = "RGB to YUV conversion mode"; + cfg.max = ARRAY_SIZE(rgb_to_yuv_mode_str) - 1; + cfg.def = MVX_RGB_TO_YUV_MODE_MAX; + cfg.qmenu = rgb_to_yuv_mode_str; + ctrl = v4l2_ctrl_new_custom(hnd, &cfg, NULL); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_BANDWIDTH_LIMIT, + "bandwidth limit", 0, INT_MAX, 0, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_CABAC_INIT_IDC, + "CABAC init IDC", 0, 4, 0, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = v4l2_ctrl_new_std( + hnd, &ctrl_ops, V4L2_CID_MPEG_VIDEO_H263_I_FRAME_QP, + 0, 31, 1, 0); + if (ctrl == NULL) + goto handler_free; + + ctrl = v4l2_ctrl_new_std( + hnd, &ctrl_ops, V4L2_CID_MPEG_VIDEO_H263_P_FRAME_QP, + 0, 31, 1, 0); + if (ctrl == NULL) + goto handler_free; + + ctrl = v4l2_ctrl_new_std( + hnd, &ctrl_ops, V4L2_CID_MPEG_VIDEO_H263_B_FRAME_QP, + 0, 31, 1, 0); + if (ctrl == NULL) + goto handler_free; + + ctrl = v4l2_ctrl_new_std( + hnd, &ctrl_ops, V4L2_CID_MPEG_VIDEO_H263_MIN_QP, + 1, 31, 1, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = v4l2_ctrl_new_std( + hnd, &ctrl_ops, V4L2_CID_MPEG_VIDEO_H263_MAX_QP, + 1, 31, 1, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = v4l2_ctrl_new_std( + hnd, &ctrl_ops, V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP, + 0, 51, 1, 0); + if (ctrl == NULL) + goto handler_free; + + ctrl = v4l2_ctrl_new_std( + hnd, &ctrl_ops, V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP, + 0, 51, 1, 0); + if (ctrl == NULL) + goto handler_free; + + ctrl = v4l2_ctrl_new_std( + hnd, &ctrl_ops, V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP, + 0, 51, 1, 0); + if (ctrl == NULL) + goto handler_free; + + ctrl = v4l2_ctrl_new_std( + hnd, &ctrl_ops, V4L2_CID_MPEG_VIDEO_H264_MIN_QP, + 1, 51, 1, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = v4l2_ctrl_new_std( + hnd, &ctrl_ops, V4L2_CID_MPEG_VIDEO_H264_MAX_QP, + 1, 51, 1, 1); + if (ctrl == NULL) + goto handler_free; + +#if (KERNEL_VERSION(4, 17, 0) > LINUX_VERSION_CODE) + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_QP, + "HEVC I frame QP value", + 0, 51, 0, 1); + if (ctrl == NULL) + goto handler_free; + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_QP, + "HEVC P frame QP value", + 0, 51, 0, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QP, + "HEVC B frame QP value", + 0, 51, 0, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MPEG_VIDEO_HEVC_MIN_QP, + "HEVC min QP value", + 1, 51, 1, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MPEG_VIDEO_HEVC_MAX_QP, + "HEVC max QP value", + 1, 51, 1, 1); + if (ctrl == NULL) + goto handler_free; +#else + ctrl = v4l2_ctrl_new_std( + hnd, &ctrl_ops, V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_QP, + 0, 51, 1, 0); + if (ctrl == NULL) + goto handler_free; + else + ctrl->is_private = 0; + + ctrl = v4l2_ctrl_new_std( + hnd, &ctrl_ops, V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_QP, + 0, 51, 1, 0); + if (ctrl == NULL) + goto handler_free; + else + ctrl->is_private = 0; + + ctrl = v4l2_ctrl_new_std( + hnd, &ctrl_ops, V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QP, + 0, 51, 1, 0); + if (ctrl == NULL) + goto handler_free; + else + ctrl->is_private = 0; + + ctrl = v4l2_ctrl_new_std( + hnd, &ctrl_ops, V4L2_CID_MPEG_VIDEO_HEVC_MIN_QP, + 1, 51, 1, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = v4l2_ctrl_new_std( + hnd, &ctrl_ops, V4L2_CID_MPEG_VIDEO_HEVC_MAX_QP, + 1, 51, 1, 1); + if (ctrl == NULL) + goto handler_free; +#endif + ctrl = v4l2_ctrl_new_std( + hnd, &ctrl_ops, V4L2_CID_MPEG_VIDEO_VPX_I_FRAME_QP, + 0, 51, 1, 0); + if (ctrl == NULL) + goto handler_free; + + ctrl = v4l2_ctrl_new_std( + hnd, &ctrl_ops, V4L2_CID_MPEG_VIDEO_VPX_P_FRAME_QP, + 0, 51, 1, 0); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_VPX_B_FRAME_QP, + "VPx B frame QP value", + 0, 51, 0, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = v4l2_ctrl_new_std( + hnd, &ctrl_ops, V4L2_CID_MPEG_VIDEO_VPX_MIN_QP, + 1, 51, 1, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = v4l2_ctrl_new_std( + hnd, &ctrl_ops, V4L2_CID_MPEG_VIDEO_VPX_MAX_QP, + 1, 51, 1, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_QP_FIXED, + "fixed qp", + 0, 51, 0, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = v4l2_ctrl_new_std( + hnd, &ctrl_ops, V4L2_CID_MIN_BUFFERS_FOR_OUTPUT, + 1, 32, 1, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY | V4L2_CTRL_FLAG_VOLATILE; + + ctrl = v4l2_ctrl_new_std( + hnd, &ctrl_ops, V4L2_CID_MIN_BUFFERS_FOR_CAPTURE, + 1, 32, 1, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY | V4L2_CTRL_FLAG_VOLATILE; + + ctrl = v4l2_ctrl_new_std( + hnd, &ctrl_ops, V4L2_CID_JPEG_RESTART_INTERVAL, + -1, 0xffff, 1, -1); + if (ctrl == NULL) + goto handler_free; + + ctrl = v4l2_ctrl_new_std( + hnd, &ctrl_ops, V4L2_CID_JPEG_COMPRESSION_QUALITY, + 0, 100, 1, 45); + if (ctrl == NULL) + goto handler_free; +#if 0 + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_JPEG_QUALITY_LUMA, + "JPEG compress luma quality", + 0, 100, 0, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_JPEG_QUALITY_CHROMA, + "JPEG compress chroma quality", + 0, 100, 0, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_VPX_B_FRAME_QP, + "VPx B frame QP value", + 0, 51, 0, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_INIT_QP_I, + "init qp of I frame", + 0, 51, 0, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_INIT_QP_P, + "init qp of P frame", + 0, 51, 0, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_SAO_LUMA, + "sao luma", + 0, 0xffff, 0, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_SAO_CHROMA, + "sao chroma", + 0, 0xffff, 0, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_QP_DELTA_I_P, + "delta qp of I and P frame", + 0, 51, 0, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_QP_REF_RB_EN, + "qp ref rb en", + 0, 51, 0, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_RC_CLIP_TOP, + "rc clip top", + 0, 0xff, 0, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_RC_CLIP_BOT, + "rc clip bot", + 0, 0xff, 0, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_QP_MAP_CLIP_TOP, + "qp map clip top", + 0, 0xff, 0, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_QP_MAP_CLIP_BOT, + "qp map clip bot", + 0, 0xff, 0, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_MAX_QP_I, + "qp max for I frame", + 0, 51, 0, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_MIN_QP_I, + "qp min for I frame", + 0, 51, 0, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_VISIBLE_WIDTH, + "visible width for encode", + 0, 0xffff, 0, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_VISIBLE_HEIGHT, + "visible height for encode", + 0, 0xffff, 0, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_GDR_NUMBER, + "gdr number", + 0, 0xffff, 1, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_GDR_PERIOD, + "gdr period", + 0, 0xffff, 1, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_SCD_ENABLE, + "scd enable", + 0, 1, 0, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_SCD_PERCENT, + "scd percent", + 0, 10, 3, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_SCD_THRESHOLD, + "scd threshold", + 0, 2047, 100, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_AQ_SSIM_EN, + "aq ssim enable", + 0, 1, 0, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_AQ_NEG_RATIO, + "aq neg ratio", + 0, 63, 24, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_AQ_POS_RATIO, + "aq pos ratio", + 0, 63, 24, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_AQ_QPDELTA_LMT, + "aq qpdelta lmt", + 0, 7, 7, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_AQ_INIT_FRM_AVG_SVAR, + "aq init frm avg svar", + 0, 15, 0, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_MULTI_SPS_PPS, + "sps pps", + 0, 0xffff, 0, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_ENABLE_VISUAL, + "enable visual", + 0, 0x1f, 0, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_ENABLE_ADAPTIVE_INTRA_BLOCK, + "enable adaptive intra block", + 0, 1, 0, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_FW_PROFILING, + "fw profiling", + 0, 1, 0, 1); + if (ctrl == NULL) + goto handler_free; + + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_COLOR_CONVERSION, + "yuv2rgb color conversion", + 0, 0x1f, 0, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_FORCED_UV_VALUE, + "forced uv value", + 0, 0x400, 0x400, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_DSL_INTERP_MODE, + "dsl interp mode", + 0, 0xff, 0xff, 1); + if (ctrl == NULL) + goto handler_free; + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_DISABLED_FEATURES, + "disabled features", + 0, INT_MAX, 0, 1); + if (ctrl == NULL) + goto handler_free; + + ctrl = mvx_v4l2_ctrl_new_custom_int( + hnd, V4L2_CID_MVE_VIDEO_CHANGE_POS, + "change pos", + 0, 100, 0, 1); + if (ctrl == NULL) + goto handler_free; +#endif + ret = v4l2_ctrl_handler_setup(hnd); + if (ret != 0) + goto handler_free; + + return 0; + +handler_free: + v4l2_ctrl_handler_free(hnd); + return -EINVAL; +} + +void mvx_v4l2_ctrls_done(struct v4l2_ctrl_handler *hnd) +{ + v4l2_ctrl_handler_free(hnd); +} diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_v4l2_ctrls.h b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_v4l2_ctrls.h new file mode 100755 index 000000000..f716c4d7b --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_v4l2_ctrls.h @@ -0,0 +1,64 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef _MVX_V4L2_CTRLS_H_ +#define _MVX_V4L2_CTRLS_H_ + +/**************************************************************************** + * Includes + ****************************************************************************/ + +#include + +/**************************************************************************** + * Exported functions + ****************************************************************************/ + +/** + * mvx_v4l2_ctrls_init() - Initialize V4L2 control handler. + * @hnd: V4L2 control handler. + * + * This function initializes V4L2 controls for handler @hnd. + * Controls set to their default values. + * + * Return: 0 on success, error code otherwise. + */ +int mvx_v4l2_ctrls_init(struct v4l2_ctrl_handler *hnd); + +/** + * mvx_v4l2_ctrls_done() - Destroy V4L2 control handler. + * @hnd: V4L2 control handler. + * + * This function destroys V4L2 control handler. + */ +void mvx_v4l2_ctrls_done(struct v4l2_ctrl_handler *hnd); + +#endif /* _MVX_V4L2_CTRLS_H_ */ diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_v4l2_fops.c b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_v4l2_fops.c new file mode 100755 index 000000000..9e2b759f2 --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_v4l2_fops.c @@ -0,0 +1,257 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include +#include +#include +#include "mvx_ext_if.h" +#include "mvx_v4l2_buffer.h" +#include "mvx_v4l2_ctrls.h" +#include "mvx_v4l2_fops.h" +#include "mvx_v4l2_session.h" +#include "mvx_v4l2_vidioc.h" +#include "mvx_log_group.h" + +#ifdef ENABLE_LOG_TO_MEM +static uint64_t vpu_get_ticks(void) +{ + volatile uint64_t time_elapsed; + __asm__ __volatile__( + "rdtime %0" + : "=r"(time_elapsed)); + return time_elapsed; +} + +static loff_t pos = 0; +struct file *mvx_filep = NULL; + +int vpuLog2Mem(const char *format, ...) +{ + int length = 0; + char buffer[1024]; + va_list args; + size_t ret; + + // sprintf(buffer, "[%10llu] ", vpu_get_ticks()); + + va_start(args, format); + // vsprintf(&buffer[13], (char *)format, args); + vsprintf(&buffer[0], (char *)format, args); + length = strlen(buffer); + + if(mvx_filep) { + ret = kernel_write(mvx_filep, buffer, length, &pos); + if (pos < 0) { + pr_info("Write data to file is failed\n"); + } + } + + return length; +} +#endif + +/**************************************************************************** + * Exported functions and variables + ****************************************************************************/ + +int mvx_v4l2_open(struct file *file) +{ + struct mvx_ext_if *ctx = video_drvdata(file); + struct mvx_v4l2_session *session; + struct v4l2_format fmt = { 0 }; + int ret; + +#ifdef ENABLE_LOG_TO_MEM + if(mvx_filep == NULL) { + mvx_filep = filp_open("/sharefs/vpu.txt", O_RDWR | O_APPEND | O_CREAT, 0644); + if (IS_ERR(mvx_filep)) { + pr_info("Open file error\n"); + } + } +#endif + session = devm_kzalloc(ctx->dev, sizeof(*session), GFP_KERNEL); + if (session == NULL) { + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "Failed to allocate V4L2 session."); + return -ENOMEM; + } + + MVX_SESSION_INFO(&session->session, "v4l2: Open device. id=%u.", + ctx->dev->id); + + ret = mvx_v4l2_session_construct(session, ctx); + if (ret != 0) + goto free_session; + + file->private_data = &session->fh; + v4l2_fh_init(&session->fh, &ctx->vdev); + v4l2_fh_add(&session->fh); + + /* Set default port formats. */ + fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT; + fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUV420M; + fmt.fmt.pix.width = 2; + fmt.fmt.pix.height = 2; + (void)mvx_v4l2_vidioc_s_fmt_vid_out(file, NULL, &fmt); + + fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + (void)mvx_v4l2_vidioc_s_fmt_vid_cap(file, NULL, &fmt); + + ret = mvx_v4l2_ctrls_init(&session->v4l2_ctrl); + if (ret != 0) { + MVX_SESSION_WARN(&session->session, + "Failed to register V4L2 controls handler. ret=%x", + ret); + goto put_session; + } + + session->fh.ctrl_handler = &session->v4l2_ctrl; + + return 0; + +put_session: + + /* + * Session was completely constructed, so we have to destroy it + * gracefully using reference counting. + */ + mvx_session_put(&session->session); + return ret; + +free_session: + devm_kfree(ctx->dev, session); + + return ret; +} + +int mvx_v4l2_release(struct file *file) +{ + struct mvx_v4l2_session *vsession = file_to_session(file); + int i; + int ret; + +#ifdef ENABLE_LOG_TO_MEM + if(mvx_filep) { + filp_close(mvx_filep, NULL); + mvx_filep = NULL; + } +#endif + MVX_SESSION_INFO(&vsession->session, "v4l2: Release."); + + mutex_lock(&vsession->mutex); + + mvx_v4l2_ctrls_done(vsession->fh.ctrl_handler); + + for (i = 0; i < MVX_DIR_MAX; i++) + if (vsession->port[i].q_set != false) { + vb2_queue_release(&vsession->port[i].vb2_queue); + vsession->port[i].q_set = false; + } + + ret = mvx_session_put(&vsession->session); + if (ret == 0) + mutex_unlock(&vsession->mutex); + + file->private_data = NULL; + + MVX_SESSION_INFO(&vsession->session, "v4l2: Release exit."); + + return 0; +} + +unsigned int mvx_v4l2_poll(struct file *file, + struct poll_table_struct *wait) +{ + struct mvx_v4l2_session *vsession = file_to_session(file); + unsigned long events = poll_requested_events(wait); + unsigned int revents = 0; + int ret; + + ret = mutex_lock_interruptible(&vsession->mutex); + if (ret != 0) + return POLLERR; + + if (vsession->session.error != 0) { + revents = POLLERR; + goto unlock_mutex; + } + + /* POLLPRI events are handled by Vb2 */ + revents |= vb2_poll(&vsession->port[MVX_DIR_INPUT].vb2_queue, + file, wait); + revents |= vb2_poll(&vsession->port[MVX_DIR_OUTPUT].vb2_queue, + file, wait); + + MVX_SESSION_VERBOSE(&vsession->session, + "v4l2: Poll. events=0x%lx, revents=0x%x, nevents=%d.", + events, revents, v4l2_event_pending(&vsession->fh)); + +unlock_mutex: + mutex_unlock(&vsession->mutex); + + return revents; +} + +int mvx_v4l2_mmap(struct file *file, + struct vm_area_struct *vma) +{ + struct mvx_v4l2_session *session = file_to_session(file); + unsigned long offset = vma->vm_pgoff << PAGE_SHIFT; + enum mvx_direction dir; + struct mvx_v4l2_port *vport; + struct vb2_queue *q; + int ret; + + MVX_SESSION_INFO(&session->session, + "v4l2: Memory map. start=0x%08lx, end=0x%08lx, pgoff=0x%08lx, flags=0x%08lx.", + vma->vm_start, vma->vm_end, + vma->vm_pgoff, vma->vm_flags); + + if (offset >= DST_QUEUE_OFF_BASE) { + dir = MVX_DIR_OUTPUT; + vma->vm_pgoff -= (DST_QUEUE_OFF_BASE >> PAGE_SHIFT); + } else { + dir = MVX_DIR_INPUT; + } + + vport = &session->port[dir]; + q = &vport->vb2_queue; + + ret = vb2_mmap(q, vma); + if (ret != 0) { + MVX_SESSION_WARN(&session->session, + "Failed to memory map buffer. q=%p, pgoff=0x%08lx, dir=%d, ret=%d", + q, vma->vm_pgoff, dir, ret); + return ret; + } + + return 0; +} diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_v4l2_fops.h b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_v4l2_fops.h new file mode 100755 index 000000000..b9306c3f4 --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_v4l2_fops.h @@ -0,0 +1,64 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef _MVX_V4L2_FOPS_H_ +#define _MVX_V4L2_FOPS_H_ + +/* + * Callbacks for struct v4l2_file_operations. + * + * Prototypes declared bellow represent callbacks required by v4l2 framework. + * They are needed to implement certain syscalls. + */ + +/** + * mvx_v4l2_open() - Callback needed to implement the open() syscall. + */ +int mvx_v4l2_open(struct file *file); + +/** + * mvx_v4l2_release() - Callback needed to implement the release() syscall. + */ +int mvx_v4l2_release(struct file *file); + +/** + * mvx_v4l2_poll() - Callback needed to implement the poll() syscall. + */ +unsigned int mvx_v4l2_poll(struct file *file, + struct poll_table_struct *wait); + +/** + * mvx_v4l2_mmap() - Callback needed to implement the mmap() syscall. + */ +int mvx_v4l2_mmap(struct file *file, + struct vm_area_struct *vma); + +#endif /* _MVX_V4L2_FOPS_H_ */ diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_v4l2_session.c b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_v4l2_session.c new file mode 100755 index 000000000..2c63e9dd6 --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_v4l2_session.c @@ -0,0 +1,685 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +/**************************************************************************** + * Includes + ****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "mvx_ext_if.h" +#include "mvx_seq.h" +#include "mvx_v4l2_buffer.h" +#include "mvx_v4l2_session.h" +#include "mvx_log_group.h" +#include "mvx-v4l2-controls.h" + +extern void vb2_queue_error(struct vb2_queue *q); + +/**************************************************************************** + * Exported and static functions + ****************************************************************************/ + +static void set_format(struct v4l2_pix_format_mplane *pix_mp, + unsigned int width, + unsigned int height, + unsigned int num_planes, + unsigned int *sizeimage, + unsigned int *bytesperline) +{ + int i; + + pix_mp->width = width; + pix_mp->height = height; + pix_mp->num_planes = num_planes; + + for (i = 0; i < num_planes; ++i) { + pix_mp->plane_fmt[i].sizeimage = sizeimage[i]; + pix_mp->plane_fmt[i].bytesperline = bytesperline[i]; + } +} + +static void v4l2_port_show(struct mvx_v4l2_port *port, + struct seq_file *s) +{ + mvx_seq_printf(s, "mvx_v4l2_port", 0, "%p\n", port); + mvx_seq_printf(s, "pixelformat", 1, "0x%x\n", + port->pix_mp.pixelformat); + mvx_seq_printf(s, "vb2_queue", 1, "\n"); + mvx_seq_printf(s, "memory", 2, "%u\n", + port->vb2_queue.memory); + mvx_seq_printf(s, "min_buffers_needed", 2, "%u\n", + port->vb2_queue.min_buffers_needed); + mvx_seq_printf(s, "num_buffers", 2, "%u\n", + port->vb2_queue.num_buffers); + mvx_seq_printf(s, "queued_count", 2, "%u\n", + port->vb2_queue.queued_count); + mvx_seq_printf(s, "streaming", 2, "%u\n", + port->vb2_queue.streaming); + mvx_seq_printf(s, "error", 2, "%u\n", + port->vb2_queue.error); + mvx_seq_printf(s, "last_buffer_dequeued", 2, "%u\n", + port->vb2_queue.last_buffer_dequeued); +} + +static int port_stat_show(struct seq_file *s, + void *v) +{ + struct mvx_v4l2_port *vport = s->private; + struct mvx_session_port *sport = vport->port; + + mvx_session_port_show(sport, s); + seq_puts(s, "\n"); + v4l2_port_show(vport, s); + + return 0; +} + +static int port_stat_open(struct inode *inode, + struct file *file) +{ + return single_open(file, port_stat_show, inode->i_private); +} + +static const struct file_operations port_stat_fops = { + .open = port_stat_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release +}; + +static int port_debugfs_init(struct device *dev, + unsigned int i, + struct mvx_v4l2_port *vport, + struct mvx_session_port *sport, + struct dentry *parent) +{ + char name[20]; + struct dentry *dentry; + + scnprintf(name, sizeof(name), "port%u", i); + vport->dentry = debugfs_create_dir(name, parent); + if (IS_ERR_OR_NULL(vport->dentry)) + return -ENOMEM; + + dentry = debugfs_create_file("stat", 0400, vport->dentry, vport, + &port_stat_fops); + if (IS_ERR_OR_NULL(dentry)) + return -ENOMEM; + + return 0; +} + +static int session_debugfs_init(struct mvx_v4l2_session *session, + struct dentry *parent) +{ + int ret; + char name[20]; + int i; + + scnprintf(name, sizeof(name), "%p", &session->session); + session->dentry = debugfs_create_dir(name, parent); + if (IS_ERR_OR_NULL(session->dentry)) + return -ENOMEM; + + for (i = 0; i < MVX_DIR_MAX; i++) { + struct mvx_v4l2_port *vport = &session->port[i]; + struct mvx_session_port *mport = &session->session.port[i]; + + ret = port_debugfs_init(session->ext->dev, i, vport, mport, + session->dentry); + if (ret != 0) + goto remove_dentry; + } + + return 0; + +remove_dentry: + debugfs_remove_recursive(session->dentry); + return ret; +} + +static struct mvx_v4l2_session *mvx_session_to_v4l2_session( + struct mvx_session *session) +{ + return container_of(session, struct mvx_v4l2_session, session); +} + +static void free_session(struct mvx_session *session) +{ + struct mvx_v4l2_session *s = mvx_session_to_v4l2_session(session); + + MVX_SESSION_INFO(session, "v4l2: Destroy session."); + + mvx_session_destruct(session); + + if (IS_ENABLED(CONFIG_DEBUG_FS)) + debugfs_remove_recursive(s->dentry); + + v4l2_fh_del(&s->fh); + v4l2_fh_exit(&s->fh); + if (mutex_is_locked(&s->mutex)) { + mutex_unlock(&s->mutex); + } + devm_kfree(s->ext->dev, s); +} + +static void handle_event(struct mvx_session *session, + enum mvx_session_event event, + void *arg) +{ + struct mvx_v4l2_session *vsession = + mvx_session_to_v4l2_session(session); + + MVX_SESSION_INFO(&vsession->session, + "Event. event=%d, arg=%p.", event, arg); + + switch (event) { + case MVX_SESSION_EVENT_BUFFER: { + struct mvx_v4l2_buffer *vbuf = mvx_buffer_to_v4l2_buffer(arg); + struct vb2_buffer *vb = &vbuf->vb2_v4l2_buffer.vb2_buf; + struct mvx_buffer *buf = (struct mvx_buffer *)arg; + /* + * When streaming is stopped we don't always receive all + * buffers from FW back. So we just return them all to Vb2. + * If the FW later returns a buffer to us, we could silently + * skip it. + */ + if (vb->state != VB2_BUF_STATE_DEQUEUED) { + enum vb2_buffer_state state = + mvx_v4l2_buffer_update(vbuf); + + vb2_buffer_done(vb, state); + } + + VPU_LOG2MEM("%s>dir %d, filled %d\n", __func__, buf->dir, buf->planes[0].filled); + + break; + } + case MVX_SESSION_EVENT_PORT_CHANGED: { + enum mvx_direction dir = (enum mvx_direction)arg; + struct mvx_v4l2_port *vport = &vsession->port[dir]; + struct mvx_session_port *port = &session->port[dir]; + const struct v4l2_event event = { + .type = V4L2_EVENT_SOURCE_CHANGE, + .u.src_change.changes = V4L2_EVENT_SRC_CH_RESOLUTION + }; + struct v4l2_pix_format_mplane *p = &vport->pix_mp; + p->field = port->interlaced ? V4L2_FIELD_SEQ_TB : V4L2_FIELD_NONE; + set_format(&vport->pix_mp, port->width, port->height, + port->nplanes, port->size, port->stride); + v4l2_event_queue_fh(&vsession->fh, &event); + break; + } + case MVX_SESSION_EVENT_COLOR_DESC: { + const struct v4l2_event event = { + .type = V4L2_EVENT_MVX_COLOR_DESC, + }; + + v4l2_event_queue_fh(&vsession->fh, &event); + break; + } + case MVX_SESSION_EVENT_ERROR: { + int i; + for (i = 0; i < MVX_DIR_MAX; ++i) { + struct vb2_queue *q = &vsession->port[i].vb2_queue; + + vb2_queue_error(q); + } + break; + } + default: + MVX_SESSION_WARN(&vsession->session, + "Unsupported session event. event=%d", event); + } +} + +int mvx_v4l2_session_construct(struct mvx_v4l2_session *vsession, + struct mvx_ext_if *ctx) +{ + int i; + int ret; + + vsession->ext = ctx; + mutex_init(&vsession->mutex); + + for (i = 0; i < MVX_DIR_MAX; i++) { + struct mvx_v4l2_port *vport = &vsession->port[i]; + + vport->port = &vsession->session.port[i]; + vport->vsession = vsession; + vport->dir = i; + vport->q_set = false; + } + + if (IS_ENABLED(CONFIG_DEBUG_FS)) { + ret = session_debugfs_init(vsession, ctx->dsessions); + if (ret != 0) + return ret; + } + + ret = mvx_session_construct(&vsession->session, ctx->dev, + ctx->client_ops, ctx->cache, + &vsession->mutex, + free_session, handle_event, + vsession->dentry); + if (ret != 0) + goto remove_dentry; + + return 0; + +remove_dentry: + if (IS_ENABLED(CONFIG_DEBUG_FS)) + debugfs_remove_recursive(vsession->dentry); + + return ret; +} + +struct mvx_v4l2_session *v4l2_fh_to_session(struct v4l2_fh *fh) +{ + return container_of(fh, struct mvx_v4l2_session, fh); +} + +struct mvx_v4l2_session *file_to_session(struct file *file) +{ + return v4l2_fh_to_session(file->private_data); +} + +int mvx_v4l2_session_get_color_desc(struct mvx_v4l2_session *vsession, + struct v4l2_mvx_color_desc *c) +{ + int ret; + struct mvx_fw_color_desc cd; + + ret = mvx_session_get_color_desc(&vsession->session, &cd); + if (ret != 0) + return ret; + + c->flags = 0; + + /* Convert between generic fw_color_desc and V4L2 color desc. */ + c->range = cd.range; + c->primaries = cd.primaries; + c->transfer = cd.transfer; + c->matrix = cd.matrix; + + if (cd.flags & MVX_FW_COLOR_DESC_DISPLAY_VALID) { + c->flags |= V4L2_MVX_COLOR_DESC_DISPLAY_VALID; + c->display.r.x = cd.display.r.x; + c->display.r.y = cd.display.r.y; + c->display.g.x = cd.display.g.x; + c->display.g.y = cd.display.g.y; + c->display.b.x = cd.display.b.x; + c->display.b.y = cd.display.b.y; + c->display.w.x = cd.display.w.x; + c->display.w.y = cd.display.w.y; + c->display.luminance_min = cd.display.luminance_min; + c->display.luminance_max = cd.display.luminance_max; + } + + if (cd.flags & MVX_FW_COLOR_DESC_CONTENT_VALID) { + c->flags |= V4L2_MVX_COLOR_DESC_CONTENT_VALID; + c->content.luminance_max = cd.content.luminance_max; + c->content.luminance_average = cd.content.luminance_average; + } + + return 0; +} + +int mvx_v4l2_session_set_color_desc(struct mvx_v4l2_session *vsession, + struct v4l2_mvx_color_desc *c){ + int ret; + struct mvx_fw_color_desc cd; + memset(&cd, 0, sizeof(cd)); + cd.flags = c->flags; + cd.range = c->range; + cd.matrix = c->matrix; + cd.primaries = c->primaries; + cd.transfer = c->transfer; + cd.aspect_ratio_idc = c->aspect_ratio_idc; + cd.num_units_in_tick = c->num_units_in_tick; + cd.sar_height = c->sar_height; + cd.sar_width = c->sar_width; + cd.video_format = c->video_format; + cd.time_scale = c->time_scale; + cd.content.luminance_average = c->content.luminance_average; + cd.content.luminance_max = c->content.luminance_max; + //memcpy(&cd.display, &c->display, sizeof(c->display)); + cd.display.r.x = c->display.r.x; + cd.display.r.y = c->display.r.y; + cd.display.g.x = c->display.g.x; + cd.display.g.y = c->display.g.y; + cd.display.b.x = c->display.b.x; + cd.display.b.y = c->display.b.y; + cd.display.w.x = c->display.w.x; + cd.display.w.y = c->display.w.y; + cd.display.luminance_min = c->display.luminance_min; + cd.display.luminance_max = c->display.luminance_max; + ret = mvx_session_set_color_desc(&vsession->session, &cd); + return ret; +} + +int mvx_v4l2_session_set_roi_regions(struct mvx_v4l2_session *vsession, + struct v4l2_mvx_roi_regions *roi) +{ + int ret; + struct mvx_roi_config roi_regions; + roi_regions.pic_index = roi->pic_index; + roi_regions.num_roi = roi->num_roi; + roi_regions.qp_present = roi->qp_present; + roi_regions.roi_present = roi->roi_present; + roi_regions.qp = roi->qp; + + if (roi_regions.roi_present && roi_regions.num_roi > 0) { + int i = 0; + for (;i < roi_regions.num_roi; i++) { + roi_regions.roi[i].mbx_left = roi->roi[i].mbx_left; + roi_regions.roi[i].mbx_right = roi->roi[i].mbx_right; + roi_regions.roi[i].mby_top = roi->roi[i].mby_top; + roi_regions.roi[i].mby_bottom = roi->roi[i].mby_bottom; + roi_regions.roi[i].qp_delta = roi->roi[i].qp_delta; + roi_regions.roi[i].prio = roi->roi[i].prio; + roi_regions.roi[i].force_intra = roi->roi[i].force_intra; + } + } + ret = mvx_session_set_roi_regions(&vsession->session, &roi_regions); + if (ret != 0) + return ret; + + return 0; +} + +int mvx_v4l2_session_set_qp_epr(struct mvx_v4l2_session *vsession, + struct v4l2_buffer_param_qp *qp) +{ + int ret; + struct mvx_buffer_param_qp epr_qp; + epr_qp.qp = qp->qp; + epr_qp.epr_iframe_enable = qp->epr_iframe_enable; + ret = mvx_session_set_qp_epr(&vsession->session, &epr_qp); + if (ret != 0) + return ret; + + return 0; +} + +int mvx_v4l2_session_set_sei_userdata(struct mvx_v4l2_session *vsession, + struct v4l2_sei_user_data *sei_userdata) +{ + int ret; + struct mvx_sei_userdata userdata; + userdata.flags = sei_userdata->flags; + userdata.user_data_len = sei_userdata->user_data_len; + memcpy(&userdata.user_data, &sei_userdata->user_data, sizeof(userdata.user_data)); + memcpy(&userdata.uuid, &sei_userdata->uuid, sizeof(userdata.uuid)); + ret = mvx_session_set_sei_userdata(&vsession->session, &userdata); + if (ret != 0) + return ret; + + return 0; +} + +int mvx_v4l2_session_set_rate_control(struct mvx_v4l2_session *vsession, + struct v4l2_rate_control *rc) +{ + int ret; + struct mvx_buffer_param_rate_control mvx_rc; + mvx_rc.rate_control_mode = rc->rc_type; + mvx_rc.target_bitrate = rc->target_bitrate; + mvx_rc.maximum_bitrate = rc->maximum_bitrate; + ret = mvx_session_set_bitrate_control(&vsession->session, &mvx_rc); + if (ret != 0) + return ret; + + return 0; +} + +int mvx_v4l2_session_set_dsl_frame(struct mvx_v4l2_session *vsession, + struct v4l2_mvx_dsl_frame *dsl) +{ + int ret; + struct mvx_dsl_frame dsl_frame; + dsl_frame.width = dsl->width; + dsl_frame.height = dsl->height; + ret = mvx_session_set_dsl_frame(&vsession->session, &dsl_frame); + if (ret != 0) + return ret; + + return 0; +} + +int mvx_v4l2_session_set_dsl_ratio(struct mvx_v4l2_session *vsession, + struct v4l2_mvx_dsl_ratio *dsl) +{ + int ret; + struct mvx_dsl_ratio dsl_ratio; + dsl_ratio.hor = dsl->hor; + dsl_ratio.ver = dsl->ver; + + ret = mvx_session_set_dsl_ratio(&vsession->session, &dsl_ratio); + if (ret != 0) + return ret; + + return 0; +} + +int mvx_v4l2_session_set_long_term_ref(struct mvx_v4l2_session *vsession, + struct v4l2_mvx_long_term_ref *ltr) +{ + int ret; + struct mvx_long_term_ref mvx_ltr; + mvx_ltr.mode = ltr->mode; + mvx_ltr.period = ltr->period; + ret = mvx_session_set_long_term_ref(&vsession->session, &mvx_ltr); + if (ret != 0) + return ret; + + return 0; + +} + +int mvx_v4l2_session_set_dsl_mode(struct mvx_v4l2_session *vsession, + int *mode) +{ + int ret; + ret = mvx_session_set_dsl_mode(&vsession->session, mode); + if (ret != 0) + return ret; + + return 0; +} + +int mvx_v4l2_session_set_mini_frame_height(struct mvx_v4l2_session *vsession, + int *cnt) +{ + int ret; + ret = mvx_session_set_mini_frame_height(&vsession->session, cnt); + if (ret != 0) + return ret; + + return 0; +} + +int mvx_v4l2_session_set_stats_mode(struct mvx_v4l2_session *vsession, + struct v4l2_buffer_param_enc_stats *stats) +{ + int ret; + struct mvx_enc_stats enc_stats; + memcpy(&enc_stats, stats, sizeof(struct mvx_enc_stats)); + ret = mvx_session_set_stats_mode(&vsession->session, &enc_stats); + if (ret != 0) + return ret; + + return 0; +} + +int mvx_v4l2_session_set_chr_cfg(struct mvx_v4l2_session *vsession, + struct v4l2_mvx_chr_config *chr) +{ + int ret; + struct mvx_chr_cfg chr_cfg; + chr_cfg.pic_index = chr->pic_index; + chr_cfg.num_chr = chr->num_chr; + + memcpy(chr_cfg.rectangle, chr->rectangle, sizeof(chr->rectangle)); + ret = mvx_session_set_chr_cfg(&vsession->session, &chr_cfg); + if (ret != 0) + return ret; + + return 0; +} + +int mvx_v4l2_session_set_huff_table(struct mvx_v4l2_session *vsession, + struct v4l2_mvx_huff_table *table) +{ + int ret; + struct mvx_huff_table huff_table; + + memcpy(&huff_table, table, sizeof(struct mvx_huff_table)); + ret = mvx_session_set_huff_table(&vsession->session, &huff_table); + if (ret != 0) + return ret; + + return 0; +} +int mvx_v4l2_session_set_seamless_target(struct mvx_v4l2_session *vsession, + struct v4l2_mvx_seamless_target *seamless) +{ + int ret; + struct mvx_seamless_target seamless_target; + + memcpy(&seamless_target, seamless, sizeof(struct v4l2_mvx_seamless_target)); + ret = mvx_session_set_seamless_target(&vsession->session, &seamless_target); + if (ret != 0) + return ret; + + return 0; +} + +int mvx_v4l2_session_set_color_conv_coef(struct mvx_v4l2_session *vsession, + struct v4l2_mvx_color_conv_coef *coef) +{ + int ret; + struct mvx_color_conv_coef conv_coef; + + memcpy(&conv_coef, coef, sizeof(struct mvx_color_conv_coef)); + ret = mvx_session_set_color_conversion_ceof(&vsession->session, &conv_coef); + if (ret != 0) + return ret; + + return 0; +} + +int mvx_v4l2_session_set_rgb_conv_yuv_coef(struct mvx_v4l2_session *vsession, + struct v4l2_mvx_rgb2yuv_color_conv_coef *coef) +{ + int ret; + struct mvx_rgb2yuv_color_conv_coef conv_coef; + + memcpy(&conv_coef, coef, sizeof(struct mvx_rgb2yuv_color_conv_coef)); + ret = mvx_session_set_rgb_conv_yuv_coef(&vsession->session, &conv_coef); + if (ret != 0) + return ret; + + return 0; +} + +int mvx_v4l2_session_set_osd_config(struct mvx_v4l2_session *vsession, + struct v4l2_osd_config *osd_cfg) +{ + int ret; + struct mvx_osd_config osd; + + memcpy(&osd, osd_cfg, sizeof(struct v4l2_osd_config)); + ret = mvx_session_set_osd_config(&vsession->session, &osd); + if (ret != 0) + return ret; + + return 0; +} + +int mvx_v4l2_session_set_osd_info(struct mvx_v4l2_session *vsession, + struct v4l2_osd_info *info, enum mvx_format* osd_fmt) +{ + int ret; + int i; + struct mvx_osd_info osd_info; + for (i = 0; i < V4L2_MAX_FRAME_OSD_REGION; i++) + { + osd_info.width_osd[i] = info->width_osd[i]; + osd_info.height_osd[i] = info->height_osd[i]; + osd_info.inputFormat_osd[i] = osd_fmt[i]; + } + ret = mvx_session_set_osd_info(&vsession->session, &osd_info); + if (ret != 0) + return ret; + + return 0; +} + +int mvx_v4l2_session_set_enc_src_crop(struct mvx_v4l2_session *vsession, + struct v4l2_mvx_crop_cfg *crop) +{ + int ret; + struct mvx_crop_cfg mvx_crop; + + memcpy(&mvx_crop, crop, sizeof(struct mvx_crop_cfg)); + ret = mvx_session_set_enc_src_crop(&vsession->session, &mvx_crop); + if (ret != 0) + return ret; + + return 0; +} + +int mvx_v4l2_session_set_dec_dst_crop(struct mvx_v4l2_session *vsession, + struct v4l2_mvx_crop_cfg *crop) +{ + int ret; + struct mvx_crop_cfg mvx_crop; + + memcpy(&mvx_crop, crop, sizeof(struct mvx_crop_cfg)); + ret = mvx_session_set_dec_dst_crop(&vsession->session, &mvx_crop); + if (ret != 0) + return ret; + + return 0; +} diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_v4l2_session.h b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_v4l2_session.h new file mode 100755 index 000000000..dd627fdc9 --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_v4l2_session.h @@ -0,0 +1,286 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef _MVX_V4L2_SESSION_H_ +#define _MVX_V4L2_SESSION_H_ + +/**************************************************************************** + * Includes + ****************************************************************************/ + +#include +#include +#include +#include +#include +#include + +#include "mvx_session.h" +#include "mvx-v4l2-controls.h" + +/**************************************************************************** + * Types + ****************************************************************************/ + +/** + * Offset used to distinguish between input and output port. + */ +#if 0 +#define DST_QUEUE_OFF_BASE (1 << 30) +#else +#define DST_QUEUE_OFF_BASE (1 << 30) +#endif +/** + * struct mvx_v4l2_port - V4L2 port type. + * + * Most of this structure will become redundant when buffer management + * is transferred to Vb2 framework. + * + * @vsession: Pointer to corresponding session. + * @port: Pointer to corresponding mvx port. + * @dir: Direction of a port. + * @type: V4L2 port type. + * @pix_mp: V4L2 multi planar pixel format. + * @crop: V4L2 cropping information. + * @dentry: Debugfs directory entry for the port. + * @q_set: Indicates of Vb2 queue was setup. + * @vb2_queue: Vb2 queue. + */ +struct mvx_v4l2_port { + struct mvx_v4l2_session *vsession; + struct mvx_session_port *port; + enum mvx_direction dir; + enum v4l2_buf_type type; + struct v4l2_pix_format_mplane pix_mp; + struct v4l2_rect crop; + struct dentry *dentry; + bool q_set; + struct vb2_queue vb2_queue; +}; + +/** + * struct mvx_v4l2_session - V4L2 session type. + * @ext: Pointer to external interface object. + * @fh: V4L2 file handler. + * @mutex: Mutex protecting the session object. + * @session: Session object. + * @port: Array of v4l2 ports. + * @dentry: Debugfs directory entry representing a session. + * @v4l2_ctrl: v4l2 controls handler. + */ +struct mvx_v4l2_session { + struct mvx_ext_if *ext; + struct v4l2_fh fh; + struct mutex mutex; + struct mvx_session session; + struct mvx_v4l2_port port[MVX_DIR_MAX]; + struct dentry *dentry; + struct v4l2_ctrl_handler v4l2_ctrl; +}; + +/**************************************************************************** + * Exported functions + ****************************************************************************/ + +/** + * mvx_v4l2_session_construct() - Construct v4l2 session object. + * @vsession: Pointer to a session object. + * @ctx: Pointer to an external interface object. + * + * Return: 0 on success, else error code. + */ +int mvx_v4l2_session_construct(struct mvx_v4l2_session *vsession, + struct mvx_ext_if *ctx); + +/** + * v4l2_fh_to_session() - Cast v4l2 file handler to mvx_v4l2_session. + * @fh: v4l2 file handler. + * + * Return: Pointer to a corresponding mvx_v4l2_session object. + */ +struct mvx_v4l2_session *v4l2_fh_to_session(struct v4l2_fh *fh); + +/** + * file_to_session() - Cast file object to mvx_v4l2_session. + * @file: Pointer to a file object. + * + * Return: Pointer to a corresponding mvx_v4l2_session object. + */ +struct mvx_v4l2_session *file_to_session(struct file *file); + +/** + * mvx_v4l2_session_get_color_desc() - Get color description. + * @vsession: Pointer to v4l2 session. + * @color: Color description. + * + * Return: 0 on success, else error code. + */ +int mvx_v4l2_session_get_color_desc(struct mvx_v4l2_session *vsession, + struct v4l2_mvx_color_desc *color_desc); + +/** + * mvx_v4l2_session_set_color_desc() - Set color description. + * @vsession: Pointer to v4l2 session. + * @color: Color description. + * + * Return: 0 on success, else error code. + */ + +int mvx_v4l2_session_set_color_desc(struct mvx_v4l2_session *vsession, + struct v4l2_mvx_color_desc *color_desc); + +/** + * mvx_v4l2_session_set_sei_userdata() - Set SEI userdata. + * @vsession: Pointer to v4l2 session. + * @sei_userdata: SEI userdata. + * + * Return: 0 on success, else error code. + */ + +int mvx_v4l2_session_set_sei_userdata(struct mvx_v4l2_session *vsession, + struct v4l2_sei_user_data *sei_userdata); + +/** + * mvx_v4l2_session_set_roi_regions() - Set Roi Regions. + * @vsession: Pointer to v4l2 session. + * @roi: ROI regions. + * + * Return: 0 on success, else error code. + */ +int mvx_v4l2_session_set_roi_regions(struct mvx_v4l2_session *vsession, + struct v4l2_mvx_roi_regions *roi); + +/** + * mvx_v4l2_session_set_qp_epr() - Set qp. + * @vsession: Pointer to v4l2 session. + * @qp: qp value. + * + * Return: 0 on success, else error code. + */ + +int mvx_v4l2_session_set_qp_epr(struct mvx_v4l2_session *vsession, + struct v4l2_buffer_param_qp *qp); + +/** + * mvx_v4l2_session_set_rate_control() - Set rate Control. + * @vsession: Pointer to v4l2 session. + * @rc: rate control type. + * + * Return: 0 on success, else error code. + */ + +int mvx_v4l2_session_set_rate_control(struct mvx_v4l2_session *vsession, + struct v4l2_rate_control *rc); + +/** + * mvx_v4l2_session_set_dsl_frame() - Set DownScale dst frame. + * @vsession: Pointer to v4l2 session. + * @dsl: DownScale dst frame. + * + * Return: 0 on success, else error code. + */ + +int mvx_v4l2_session_set_dsl_frame(struct mvx_v4l2_session *vsession, + struct v4l2_mvx_dsl_frame *dsl); + +/** + * mvx_v4l2_session_set_dsl_ratio() - Set DownScale ratio. + * @vsession: Pointer to v4l2 session. + * @dsl: DownScale ratio. + * + * Return: 0 on success, else error code. + */ + +int mvx_v4l2_session_set_dsl_ratio(struct mvx_v4l2_session *vsession, + struct v4l2_mvx_dsl_ratio *dsl); + +/** + * mvx_v4l2_session_set_long_term_ref() - Set long term ref. + * @vsession: Pointer to v4l2 session. + * @ltr: long term ref. + * + * Return: 0 on success, else error code. + */ + +int mvx_v4l2_session_set_long_term_ref(struct mvx_v4l2_session *vsession, + struct v4l2_mvx_long_term_ref *ltr); + +/** + * mvx_v4l2_session_set_dsl_mode() - Set DownScale mode. + * @vsession: Pointer to v4l2 session. + * @mode: DownScale mode, oly enable on high precision mode. + * + * Return: 0 on success, else error code. + */ + +int mvx_v4l2_session_set_dsl_mode(struct mvx_v4l2_session *vsession, + int *mode); + +/** + * mvx_v4l2_session_set_mini_frame_cnt() - Set DownScale mode. + * @vsession: Pointer to v4l2 session. + * @cnt: Mini Frame buffer cnt. + * + * Return: 0 on success, else error code. + */ + +int mvx_v4l2_session_set_mini_frame_height(struct mvx_v4l2_session *vsession, + int *cnt); + +/** + * mvx_v4l2_session_set_stats_mode() - Set Stats mode. + * @vsession: Pointer to v4l2 session. + * @mode: stats mode. + * + * Return: 0 on success, else error code. + */ + +int mvx_v4l2_session_set_stats_mode(struct mvx_v4l2_session *vsession, + struct v4l2_buffer_param_enc_stats *stats); +int mvx_v4l2_session_set_chr_cfg(struct mvx_v4l2_session *vsession, + struct v4l2_mvx_chr_config *chr); +int mvx_v4l2_session_set_huff_table(struct mvx_v4l2_session *vsession, + struct v4l2_mvx_huff_table *table); +int mvx_v4l2_session_set_seamless_target(struct mvx_v4l2_session *vsession, + struct v4l2_mvx_seamless_target *seamless); +int mvx_v4l2_session_set_color_conv_coef(struct mvx_v4l2_session *vsession, + struct v4l2_mvx_color_conv_coef *coef); +int mvx_v4l2_session_set_rgb_conv_yuv_coef(struct mvx_v4l2_session *vsession, + struct v4l2_mvx_rgb2yuv_color_conv_coef *coef); +int mvx_v4l2_session_set_enc_src_crop(struct mvx_v4l2_session *vsession, + struct v4l2_mvx_crop_cfg *crop); +int mvx_v4l2_session_set_dec_dst_crop(struct mvx_v4l2_session *vsession, + struct v4l2_mvx_crop_cfg *crop); +int mvx_v4l2_session_set_osd_config(struct mvx_v4l2_session *vsession, + struct v4l2_osd_config *osd_cfg); +int mvx_v4l2_session_set_osd_info(struct mvx_v4l2_session *vsession, + struct v4l2_osd_info *info, enum mvx_format* osd_fmt); +#endif /* _MVX_V4L2_SESSION_H_ */ diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_v4l2_vidioc.c b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_v4l2_vidioc.c new file mode 100755 index 000000000..2f593582c --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_v4l2_vidioc.c @@ -0,0 +1,1832 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +/**************************************************************************** + * Includes + ****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "mvx_bitops.h" +#include "mvx_ext_if.h" +#include "mvx_if.h" +#include "mvx_v4l2_buffer.h" +#include "mvx_v4l2_session.h" +#include "mvx_v4l2_vidioc.h" +#include "mvx-v4l2-controls.h" + +/**************************************************************************** + * Types + ****************************************************************************/ + +struct mvx_format_map { + enum mvx_format format; + uint32_t flags; + uint32_t pixelformat; + const char *description; +}; + +/**************************************************************************** + * Static functions and variables + ****************************************************************************/ + +struct mvx_format_map mvx_fmts[] = { + { MVX_FORMAT_AVS, + V4L2_FMT_FLAG_COMPRESSED, + V4L2_PIX_FMT_AVS, + "AVS" }, + { MVX_FORMAT_AVS2, + V4L2_FMT_FLAG_COMPRESSED, + V4L2_PIX_FMT_AVS2, + "AVS2" }, + { MVX_FORMAT_H263, + V4L2_FMT_FLAG_COMPRESSED, + V4L2_PIX_FMT_H263, + "H.263" }, + { MVX_FORMAT_H264, + V4L2_FMT_FLAG_COMPRESSED, + V4L2_PIX_FMT_H264, + "H.264" }, + { MVX_FORMAT_H264, + V4L2_FMT_FLAG_COMPRESSED, + V4L2_PIX_FMT_H264_MVC, + "H.264 MVC" }, + { MVX_FORMAT_H264, + V4L2_FMT_FLAG_COMPRESSED, + V4L2_PIX_FMT_H264_NO_SC, + "H.264 (No Start Codes)" }, + { MVX_FORMAT_HEVC, + V4L2_FMT_FLAG_COMPRESSED, + V4L2_PIX_FMT_HEVC, + "HEVC" }, + { MVX_FORMAT_MPEG2, + V4L2_FMT_FLAG_COMPRESSED, + V4L2_PIX_FMT_MPEG2, + "MPEG-2 ES" }, + { MVX_FORMAT_MPEG4, + V4L2_FMT_FLAG_COMPRESSED, + V4L2_PIX_FMT_MPEG4, + "MPEG-4 part 2 ES" }, + { MVX_FORMAT_RV, + V4L2_FMT_FLAG_COMPRESSED, + V4L2_PIX_FMT_RV, + "Real Video" }, + { MVX_FORMAT_VC1, + V4L2_FMT_FLAG_COMPRESSED, + V4L2_PIX_FMT_VC1_ANNEX_G, + "VC-1 (SMPTE 412M Annex G)" }, + { MVX_FORMAT_VC1, + V4L2_FMT_FLAG_COMPRESSED, + V4L2_PIX_FMT_VC1_ANNEX_L, + "VC-1 (SMPTE 412M Annex L)" }, + { MVX_FORMAT_VP8, + V4L2_FMT_FLAG_COMPRESSED, + V4L2_PIX_FMT_VP8, + "VP8" }, + { MVX_FORMAT_VP9, + V4L2_FMT_FLAG_COMPRESSED, + V4L2_PIX_FMT_VP9, + "VP9" }, + { MVX_FORMAT_AV1, + V4L2_FMT_FLAG_COMPRESSED, + V4L2_PIX_FMT_AV1, + "AV1" }, + { MVX_FORMAT_JPEG, + V4L2_FMT_FLAG_COMPRESSED, + V4L2_PIX_FMT_JPEG, + "JPEG" }, + { MVX_FORMAT_JPEG, + V4L2_FMT_FLAG_COMPRESSED, + V4L2_PIX_FMT_MJPEG, + "MJPEG" }, + { MVX_FORMAT_YUV420_AFBC_8, + 0, + V4L2_PIX_FMT_YUV420_AFBC_8, + "YUV420 AFBC 8 bit" }, + { MVX_FORMAT_YUV420_AFBC_10, + 0, + V4L2_PIX_FMT_YUV420_AFBC_10, + "YUV420 AFBC 10 bit" }, + { MVX_FORMAT_YUV422_AFBC_8, + 0, + V4L2_PIX_FMT_YUV422_AFBC_8, + "YUV422 AFBC 8 bit" }, + { MVX_FORMAT_YUV422_AFBC_10, + 0, + V4L2_PIX_FMT_YUV422_AFBC_10, + "YUV422 AFBC 10 bit" }, + { MVX_FORMAT_YUV420_I420, + 0, + V4L2_PIX_FMT_YUV420M, + "Planar YUV 4:2:0 (N-C)" }, + { MVX_FORMAT_YUV420_I420, + 0, + V4L2_PIX_FMT_YUV420, + "Planar YUV 4:2:0 (N-C)" }, + { MVX_FORMAT_YUV420_NV12, + 0, + V4L2_PIX_FMT_NV12, + "Y/CbCr 4:2:0" }, + { MVX_FORMAT_YUV420_NV21, + 0, + V4L2_PIX_FMT_NV21, + "Y/CrCb 4:2:0 (N-C)" }, + { MVX_FORMAT_YUV420_P010, + 0, + V4L2_PIX_FMT_P010, + "YUV 4:2:0 P010 (Microsoft format)" }, + { MVX_FORMAT_YUV420_Y0L2, + 0, + V4L2_PIX_FMT_Y0L2, + "YUV 4:2:0 Y0L2 (ARM format)" }, + { MVX_FORMAT_YUV420_AQB1, + 0, + V4L2_PIX_FMT_AQB1, + "YUV 4:2:0 AQB1 (ARM format)" }, + { MVX_FORMAT_YUV422_YUY2, + 0, + V4L2_PIX_FMT_YUYV, + "YYUV 4:2:2" }, + { MVX_FORMAT_YUV422_UYVY, + 0, + V4L2_PIX_FMT_UYVY, + "UYVY 4:2:2" }, + { MVX_FORMAT_YUV422_Y210, + 0, + V4L2_PIX_FMT_Y210, + "YUV 4:2:2 Y210 (Microsoft format)" }, + + /* ARGB */ + { MVX_FORMAT_ARGB_8888, + 0, + DRM_FORMAT_BGRA8888, /* Equal to V4L2_PIX_FMT_ARGB32. */ + "32-bit ARGB 8-8-8-8" }, + { MVX_FORMAT_ARGB_8888, + 0, + V4L2_PIX_FMT_RGB32, + "32-bit ARGB 8-8-8-8" }, + + /* ABGR */ + { MVX_FORMAT_ABGR_8888, + 0, + DRM_FORMAT_RGBA8888, + "32-bit ABGR-8-8-8-8" }, + + /* RGBA */ + { MVX_FORMAT_RGBA_8888, + 0, + DRM_FORMAT_ABGR8888, + "32-bit RGBA 8-8-8-8" }, + + /* BGRA (new and legacy format) */ + { MVX_FORMAT_BGRA_8888, + 0, + DRM_FORMAT_ARGB8888, /* Equal to V4L2_PIX_FMT_ABGR32. */ + "32-bit BGRA 8-8-8-8" }, + { MVX_FORMAT_BGRA_8888, + 0, + V4L2_PIX_FMT_BGR32, + "32-bit BGRA 8-8-8-8" }, + + /* RGB888 */ + { MVX_FORMAT_RGB_888, + 0, + V4L2_PIX_FMT_RGB24, + "24-bit RGB 8-8-8" }, + + /*BGR888 */ + { MVX_FORMAT_BGR_888, + 0, + V4L2_PIX_FMT_BGR24, + "24-bit BGR 8-8-8" }, + + /*RGB888 3 PLANNER */ + { MVX_FORMAT_RGB_888_3P, + 0, + V4L2_PIX_FMT_RGB_3P, + "24-bit RGB 8-8-8 3PLANNER" }, + + /*ARGB1555 1 PLANNER */ + { MVX_FORMAT_ARGB_1555, + 0, + V4L2_PIX_FMT_ARGB555, + "16-bit ARGB 1-5-5-5 1PLANNER" }, + + /*ARGB 1 PLANNER */ + { MVX_FORMAT_ARGB_4444, + 0, + V4L2_PIX_FMT_ARGB444, + "16-bit ARGB 4-4-4-4 1PLANNER" }, + + /*RGB888 3 PLANNER */ + { MVX_FORMAT_RGB_565, + 0, + V4L2_PIX_FMT_RGB565, + "16-bit RGB 5-6-5 1PLANNER" }, + + /*MVX_FORMAT_Y 1 PLANNER */ + { MVX_FORMAT_Y, + 0, + V4L2_PIX_FMT_GREY, + "8-bit GREY 1PLANNER" }, + + /*MVX_FORMAT_Y_10 1 PLANNER */ + { MVX_FORMAT_Y_10, + 0, + V4L2_PIX_FMT_Y10_LE, + "10-bit GREY 16BIT LSB 1PLANNER" }, + + /*MVX_FORMAT_YUV444 3 PLANNER */ + { MVX_FORMAT_YUV444, + 0, + V4L2_PIX_FMT_YUV444M, + "8-bit YUV444 3PLANNER" }, //double confirm this maping? + + /*MVX_FORMAT_YUV444_10 3 PLANNER */ + { MVX_FORMAT_YUV444_10, + 0, + V4L2_PIX_FMT_YUV444_10, + "10-bit YUV444 16BIT LSB 3PLANNER" }, + + /*MVX_FORMAT_YUV420_2P_10 2 PLANNER */ + { MVX_FORMAT_YUV420_2P_10, + 0, + V4L2_PIX_FMT_YUV420_2P_10, + "10-bit YUV420 16BIT LSB 2PLANNER" }, + + /*MVX_FORMAT_YUV422_1P_10 1 PLANNER */ + { MVX_FORMAT_YUV422_1P_10, + 0, + V4L2_PIX_FMT_YUV422_1P_10, + "10-bit YUV422 16BIT LSB 1PLANNER" }, + + /*MVX_FORMAT_YUV420_I420_10 3 PLANNER */ + { MVX_FORMAT_YUV420_I420_10, + 0, + V4L2_PIX_FMT_YUV420_I420_10, + "10-bit YUV420 16BIT LSB 3PLANNER" } +}; + +/* + * Search for format map that matches given pixel format. + */ +static struct mvx_format_map *mvx_find_format(uint32_t pixelformat) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(mvx_fmts); i++) + if (mvx_fmts[i].pixelformat == pixelformat) + return &mvx_fmts[i]; + + return ERR_PTR(-EINVAL); +} + +static int to_v4l2_format(struct v4l2_format *f, + enum v4l2_buf_type type, + struct v4l2_pix_format_mplane *pix, + unsigned int *stride, + unsigned int *size, + bool interlaced) +{ + f->type = type; + + switch (f->type) { + case V4L2_BUF_TYPE_VIDEO_OUTPUT: + case V4L2_BUF_TYPE_VIDEO_CAPTURE: { + struct v4l2_pix_format *p = &f->fmt.pix; + uint32_t i; + + p->width = pix->width; + p->height = pix->height; + p->pixelformat = pix->pixelformat; + p->field = interlaced ? V4L2_FIELD_SEQ_TB : V4L2_FIELD_NONE; + p->colorspace = pix->colorspace; + p->flags = pix->flags; + p->ycbcr_enc = pix->ycbcr_enc; + p->quantization = pix->quantization; + p->xfer_func = pix->xfer_func; + + p->sizeimage = 0; + p->bytesperline = stride[0]; + for (i = 0; i < pix->num_planes; ++i) + p->sizeimage += size[i]; + + break; + } + case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE: + case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE: { + struct v4l2_pix_format_mplane *p = &f->fmt.pix_mp; + int i; + + memcpy(p, pix, sizeof(*p)); + memset(p->reserved, 0, sizeof(p->reserved)); + p->field = interlaced ? V4L2_FIELD_SEQ_TB : V4L2_FIELD_NONE; + + for (i = 0; i < pix->num_planes; i++) { + p->plane_fmt[i].bytesperline = stride[i]; + p->plane_fmt[i].sizeimage = size[i]; + memset(p->plane_fmt[i].reserved, 0, + sizeof(p->plane_fmt[i].reserved)); + } + + break; + } + default: + return -EINVAL; + } + + return 0; +} + +static int from_v4l2_format(struct mvx_v4l2_session *vsession, + struct v4l2_format *f, + struct v4l2_pix_format_mplane *pix, + enum mvx_format *format, + unsigned int *stride, + unsigned int *size, + bool *interlaced) +{ + struct mvx_format_map *map; + + switch (f->type) { + case V4L2_BUF_TYPE_VIDEO_OUTPUT: + case V4L2_BUF_TYPE_VIDEO_CAPTURE: { + struct v4l2_pix_format *p = &f->fmt.pix; + + memset(pix, 0, sizeof(*pix)); + + pix->width = p->width; + pix->height = p->height; + pix->pixelformat = p->pixelformat; + pix->field = p->field; + pix->colorspace = p->colorspace; + pix->flags = p->flags; + + if (p->priv != V4L2_PIX_FMT_PRIV_MAGIC) { + pix->ycbcr_enc = V4L2_COLORSPACE_DEFAULT; + pix->quantization = V4L2_QUANTIZATION_DEFAULT; + pix->xfer_func = V4L2_XFER_FUNC_DEFAULT; + } + + pix->num_planes = 1; + pix->plane_fmt[0].sizeimage = p->sizeimage; + pix->plane_fmt[0].bytesperline = p->bytesperline; + + size[0] = p->sizeimage; + stride[0] = p->bytesperline; + + break; + } + case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE: + case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE: { + struct v4l2_pix_format_mplane *p = &f->fmt.pix_mp; + unsigned int i; + + if (p->num_planes > MVX_BUFFER_NPLANES) + MVX_SESSION_WARN(&vsession->session, + "Too many planes for format. format=0x%08x, num_planes=%u.", + pix->pixelformat, p->num_planes); + + memcpy(pix, p, sizeof(*pix)); + + for (i = 0; + i < min_t(unsigned int, MVX_BUFFER_NPLANES, p->num_planes); + i++) { + size[i] = p->plane_fmt[i].sizeimage; + stride[i] = p->plane_fmt[i].bytesperline; + vsession->session.setting_stride[i] = stride[i]; + } + + break; + } + default: + return -EINVAL; + } + + /* Adjust default field and color spaces. */ + + if (pix->field == V4L2_FIELD_SEQ_TB) { + *interlaced = true; + } else { + pix->field = V4L2_FIELD_NONE; + *interlaced = false; + } + + if (pix->colorspace == V4L2_COLORSPACE_DEFAULT) + pix->colorspace = V4L2_COLORSPACE_REC709; + + if (pix->ycbcr_enc == V4L2_YCBCR_ENC_DEFAULT) + pix->ycbcr_enc = V4L2_YCBCR_ENC_709; + + if (pix->quantization == V4L2_QUANTIZATION_DEFAULT) + pix->quantization = V4L2_QUANTIZATION_FULL_RANGE; + + if (pix->xfer_func == V4L2_XFER_FUNC_DEFAULT) + pix->xfer_func = V4L2_XFER_FUNC_709; + + /* Find mapping between pixel format and mvx format. */ + map = mvx_find_format(pix->pixelformat); + if (IS_ERR(map)) { + MVX_SESSION_WARN(&vsession->session, + "Unsupported V4L2 pixel format. format=0x%08x.", + pix->pixelformat); + return PTR_ERR(map); + } + + *format = map->format; + + return 0; +} + +/** + * print_format() - Print V4L2 format. + * @session: Pointer to MVX session. + * @f: V4L2 format. + * @prefix: Prefix string. + */ +static void print_format(struct mvx_session *session, + struct v4l2_format *f, + const char *prefix) +{ + if (V4L2_TYPE_IS_MULTIPLANAR(f->type) != false) { + struct v4l2_pix_format_mplane *p = &f->fmt.pix_mp; + + MVX_SESSION_INFO(session, + "v4l2: %s. type=%u, pixelformat=0x%08x, width=%u, height=%u, num_planes=%u.", + prefix, + f->type, p->pixelformat, + p->width, p->height, + p->num_planes); + } else { + struct v4l2_pix_format *p = &f->fmt.pix; + + MVX_SESSION_INFO(session, + "v4l2: %s. type=%u, pixelformat=0x%08x, width=%u, height=%u.", + prefix, + f->type, p->pixelformat, + p->width, p->height); + } +} + +/** + * queue_setup() - Initialize or verify queue parameters. + * @q: Videobuf2 queue. + * @buf_cnt: Requested/requered buffers count. + * @plane_cnt: Required number of planes. + * @plane_size: Required size of each plane. + * @alloc_devs: Device to allocate memory from. + * + * This callback is used to query parameters of a queue from the driver. + * Vb2 sets buf_cnt to requested amount of buffers, but a driver is free to + * choose another value and return it. Vb2 will then call queue_setup() again + * to verify that the new value is accepted by a driver. + * + * Vb2 also uses plane_cnt parameter to signal if queue_setup() was called + * from create_bufs() of reqbufs(). + * + * No locking is required in this function. The reason is that will be called + * from within vb2_reqbufs() or vb2_create_bufs() which are executed from our + * code with session mutex already taken. + * + * Return: 0 on success, else error code. + */ +#if KERNEL_VERSION(4, 5, 0) <= LINUX_VERSION_CODE +static int queue_setup(struct vb2_queue *q, + unsigned int *buf_cnt, + unsigned int *plane_cnt, + unsigned int plane_size[], + struct device *alloc_devs[]) +#else +static int queue_setup(struct vb2_queue *q, + const void *unused, + unsigned int *buf_cnt, + unsigned int *plane_cnt, + unsigned int plane_size[], + void *alloc_devs[]) +#endif +{ + struct mvx_v4l2_port *vport = vb2_get_drv_priv(q); + struct mvx_session_port *port = vport->port; + struct mvx_v4l2_session *vsession = vport->vsession; + struct mvx_session *session = &vsession->session; + unsigned int i; + + /* + * If the output frame resolution is not known, then there is no need + * to allocate buffers yet. But 1 buffer will be needed to carry + * information about 'resolution change' and 'end of stream'. + */ + if (vport->dir == MVX_DIR_OUTPUT && + mvx_is_frame(port->format) != false && + (port->width == 0 || port->height == 0)) + *buf_cnt = 1; + + memset(plane_size, 0, sizeof(plane_size[0]) * VB2_MAX_PLANES); + *plane_cnt = port->nplanes; + for (i = 0; i < port->nplanes; ++i) { + /* Vb2 allocator does not handle well buffers of zero size. */ + plane_size[i] = max_t(unsigned int, port->size[i], 1); + plane_size[i] = max_t(unsigned int, port->display_size[i], plane_size[i]); + if(session->seamless_target.seamless_mode !=0 + && vport->dir == MVX_DIR_OUTPUT + && vsession->port[MVX_DIR_INPUT].port->format <= MVX_FORMAT_BITSTREAM_LAST) + { + plane_size[i] = plane_size[i] < session->seamless_target.target_size[i] ? session->seamless_target.target_size[i] : plane_size[i]; + } + alloc_devs[i] = session->dev; + } + + MVX_SESSION_VERBOSE(session, + "queue_setup. vsession=%p, vport=%p, vb2_queue=%p, dir=%d, format=0x%x, width=%u, height=%u, nplanes=%u, plane_size=[%u, %u, %u]", + vsession, vport, q, vport->dir, port->format, + port->width, port->height, port->nplanes, + plane_size[0], plane_size[1], plane_size[2]); + + return 0; +} + +/** + * buf_init() - Perform initilization for Vb2 buffer. + * @b: Pointer to Vb2 buffer. + * + * Vb2 framework calls this function once for every allocated buffer. + * A driver fetches a list of memory pages and constructs MVX V4L2 buffers. + * + * No locking is required in this function. The reason is that will be called + * from within vb2_reqbufs() or vb2_create_bufs() which are executed from our + * code with session mutex already taken. + * + * Return: 0 in case of success, error code otherwise. + */ +static int buf_init(struct vb2_buffer *b) +{ + struct mvx_v4l2_buffer *vbuf = vb2_to_mvx_v4l2_buffer(b); + + int ret; + unsigned int i; + struct sg_table *sgt[MVX_BUFFER_NPLANES] = { 0 }; + struct vb2_queue *q = b->vb2_queue; + struct mvx_v4l2_port *vport = vb2_get_drv_priv(q); + struct mvx_v4l2_session *vsession = vport->vsession; + struct mvx_session *session = &vsession->session; + + MVX_SESSION_VERBOSE(session, + "v4l2: Initialize buffer. vb=%p, type=%u, index=%u, num_planes=%u.", + b, b->type, b->index, b->num_planes); + + if (b->num_planes > MVX_BUFFER_NPLANES) { + MVX_SESSION_WARN(session, + "Failed to initialize buffer. Too many planes. vb=%p, num_planes=%u.", + b, b->num_planes); + return -EINVAL; + } + + for (i = 0; i < b->num_planes; ++i) { + sgt[i] = vb2_dma_sg_plane_desc(b, i); + if (sgt[i] == NULL) { + MVX_SESSION_WARN(session, + "Cannot fetch SG descriptor. vb=%p, plane=%u.", + b, i); + return -ENOMEM; + } + } + + ret = mvx_v4l2_buffer_construct(vbuf, vsession, vport->dir, + b->num_planes, sgt); + + return ret; +} + +/** + * buf_cleanup() - Destroy data associated to Vb2 buffer. + * @b: Pointer to Vb2 buffer. + * + * Vb2 framework calls this function while destroying a buffer. + */ +static void buf_cleanup(struct vb2_buffer *b) +{ + struct vb2_queue *q = b->vb2_queue; + struct mvx_v4l2_port *vport = vb2_get_drv_priv(q); + struct mvx_v4l2_session *vsession = vport->vsession; + struct mvx_session *session = &vsession->session; + struct mvx_v4l2_buffer *vbuf = vb2_to_mvx_v4l2_buffer(b); + + MVX_SESSION_VERBOSE(session, + "v4l2: Cleanup buffer. vb=%p, index=%u, vbuf=%p, type=%u.", + b, b->type, b->index, vbuf); + + mvx_v4l2_buffer_destruct(vbuf); +} + +/** + * start_streaming() - Start streaming for queue. + * @q: Pointer to a queue. + * @cnt: Amount of buffers already owned by a driver. + * + * Vb2 calls this function when it is ready to start streaming for a queue. + * Vb2 ensures that minimum required amount of buffers were enqueued to the + * driver before calling this function. + * + * Return: 0 in case of success, error code otherwise. + */ +static int start_streaming(struct vb2_queue *q, + unsigned int cnt) +{ + /* + * Parameter cnt is not used so far. + */ + struct mvx_v4l2_port *vport = vb2_get_drv_priv(q); + struct mvx_v4l2_session *vsession = vport->vsession; + struct mvx_session *session = &vsession->session; + int ret; + + MVX_SESSION_VERBOSE(session, + "v4l2: Start streaming. queue=%p, type=%u, cnt=%u.", + q, q->type, cnt); + + ret = mvx_session_streamon(&vsession->session, vport->dir); + + /* + * If attempt was not successful, we should return all owned buffers + * to Vb2 with vb2_buffer_done() with state VB2_BUF_STATE_QUEUED. + */ + if (ret != 0 && atomic_read(&q->owned_by_drv_count) > 0) { + int i; + + for (i = 0; i < q->num_buffers; ++i) + if (q->bufs[i]->state == VB2_BUF_STATE_ACTIVE) + vb2_buffer_done(q->bufs[i], + VB2_BUF_STATE_QUEUED); + + WARN_ON(atomic_read(&q->owned_by_drv_count)); + } + + return ret; +} + +/** + * stop_streaming() - Stop streaming for a queue. + * @q: Pointer to a queue. + * + * Vb2 calls this function when streaming should be terminated. + * The driver must ensure that no DMA transfers are ongoing and + * return all buffers to Vb2 with vb2_buffer_done(). + */ +static void stop_streaming(struct vb2_queue *q) +{ + struct mvx_v4l2_port *vport = vb2_get_drv_priv(q); + struct mvx_v4l2_session *vsession = vport->vsession; + struct mvx_session *session = &vsession->session; + + MVX_SESSION_VERBOSE(session, + "v4l2: Stop streaming. queue=%p, type=%u.", + q, q->type); + + mvx_session_streamoff(&vsession->session, vport->dir); + + /* + * We have to return all owned buffers to Vb2 before exiting from + * this callback. + * + * Note: there must be no access to buffers after they are returned. + */ + if (atomic_read(&q->owned_by_drv_count) > 0) { + int i; + + for (i = 0; i < q->num_buffers; ++i) + if (q->bufs[i]->state == VB2_BUF_STATE_ACTIVE) + vb2_buffer_done(q->bufs[i], + VB2_BUF_STATE_ERROR); + + WARN_ON(atomic_read(&q->owned_by_drv_count)); + } +} + +/** + * buf_queue() - Enqueue buffer to a driver. + * @b: Pointer to Vb2 buffer structure. + * + * Vb2 calls this function to enqueue a buffer to a driver. + * A driver should later return a buffer to Vb2 with vb2_buffer_done(). + * + * Return: 0 in case of success, error code otherwise. + */ +static void buf_queue(struct vb2_buffer *b) +{ + struct vb2_queue *q = b->vb2_queue; + struct mvx_v4l2_port *vport = vb2_get_drv_priv(q); + struct mvx_session_port *port = vport->port; + enum mvx_direction dir = vport->dir; + struct mvx_v4l2_session *vsession = vport->vsession; + struct mvx_session *session = &vsession->session; + struct mvx_v4l2_buffer *vbuf = vb2_to_mvx_v4l2_buffer(b); + + int ret; + + MVX_SESSION_VERBOSE(session, + "v4l2: Queue buffer. b=%p, type=%u, index=%u.", + b, b->type, b->index); + vbuf->buf.format = vport->port->format; + ret = mvx_v4l2_buffer_set(vbuf, b); + if (ret != 0) { + goto failed; + } + ret = mvx_session_qbuf(&vsession->session, dir, &vbuf->buf); + if (ret != 0) { + goto failed; + } + return; + +failed: + if (vbuf->buf.flags & MVX_BUFFER_FRAME_NEED_REALLOC) { + vbuf->vb2_v4l2_buffer.flags |= V4L2_BUF_FLAG_MVX_BUFFER_NEED_REALLOC; + port->isreallocting = true; + vb2_buffer_done(b, VB2_BUF_STATE_DONE); + return; + } + vb2_buffer_done(b, VB2_BUF_STATE_ERROR); +} + +/** + * buf_finish() - Finish buffer before it is returned to user space. + * @vb: Pointer to Vb2 buffer structure. + */ +static void buf_finish(struct vb2_buffer *vb) +{ + struct mvx_v4l2_port *vport = vb2_get_drv_priv(vb->vb2_queue); + struct mvx_v4l2_buffer *vbuf = vb2_to_mvx_v4l2_buffer(vb); + + vport->crop.left = vbuf->buf.crop_left; + vport->crop.top = vbuf->buf.crop_top; +} + +/** + * wait_prepare() - Prepare driver for waiting + * @q: Pointer to Vb2 queue. + * + * Vb2 calls this function when it is about to wait for more buffers to + * be received. A driver should release any locks taken while calling Vb2 + * functions. + * This is required to avoid a deadlock. + * + * This is unused for now and will be called from Vb2. + */ +static void wait_prepare(struct vb2_queue *q) +{ + struct mvx_v4l2_port *vport = vb2_get_drv_priv(q); + struct mvx_v4l2_session *vsession = vport->vsession; + struct mvx_session *session = &vsession->session; + + MVX_SESSION_VERBOSE(session, "v4l2: Wait prepare. queue=%p.", q); + + mutex_unlock(&vsession->mutex); +} + +/** + * wait_finish() - Wake up after sleep. + * @q: Pointer to Vb2 queue. + * + * Require mutexes release before. + * + * This is unused for now and will be called from Vb2. + */ +static void wait_finish(struct vb2_queue *q) +{ + struct mvx_v4l2_port *vport = vb2_get_drv_priv(q); + struct mvx_v4l2_session *vsession = vport->vsession; + struct mvx_session *session = &vsession->session; + int ignore; + + MVX_SESSION_VERBOSE(session, "v4l2: Wait finish. queue=%p.", q); + + /* + * mutex_lock_interruptible is declared with attribute + * warn_unused_result, but we have no way to return a status + * from wait_finish(). + */ + ignore = mutex_lock_interruptible(&vsession->mutex); +} + +/** + * mvx_vb2_ops - Callbacks for Vb2 framework + * Not all possible callbacks are implemented as some of them are optional. + */ +const struct vb2_ops mvx_vb2_ops = { + .queue_setup = queue_setup, + .buf_init = buf_init, + .buf_finish = buf_finish, + .buf_cleanup = buf_cleanup, + .start_streaming = start_streaming, + .stop_streaming = stop_streaming, + .buf_queue = buf_queue, + .wait_prepare = wait_prepare, + .wait_finish = wait_finish +}; + +/** + * setup_vb2_queue() - Initialize vb2_queue before it can be used by Vb2. + */ +static int setup_vb2_queue(struct mvx_v4l2_port *vport) +{ + struct vb2_queue *q = &vport->vb2_queue; +#if KERNEL_VERSION(4, 5, 0) <= LINUX_VERSION_CODE + struct device *dev = vport->vsession->ext->dev; +#endif + int ret; + + q->drv_priv = vport; + q->type = vport->type; + q->io_modes = VB2_MMAP | VB2_USERPTR | VB2_DMABUF; +#if KERNEL_VERSION(4, 5, 0) <= LINUX_VERSION_CODE + q->dev = dev; +#endif + q->ops = &mvx_vb2_ops; + q->mem_ops = &vb2_dma_sg_memops; + q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY; + q->allow_zero_bytesused = true; + + /* Let Vb2 handle mvx_v4l2_buffer allocations. */ + q->buf_struct_size = sizeof(struct mvx_v4l2_buffer); + + ret = vb2_queue_init(q); + return ret; +} + +/**************************************************************************** + * Exported functions and variables + ****************************************************************************/ + +int mvx_v4l2_vidioc_querycap(struct file *file, + void *fh, + struct v4l2_capability *cap) +{ + struct mvx_v4l2_session *session = file_to_session(file); + + MVX_SESSION_INFO(&session->session, "v4l2: Query capabilities."); + + strlcpy(cap->driver, "mvx", sizeof(cap->driver)); + strlcpy(cap->card, "Linlon Video device", sizeof(cap->card)); + strlcpy(cap->bus_info, "platform:mvx", sizeof(cap->bus_info)); + + cap->capabilities = V4L2_CAP_DEVICE_CAPS | + V4L2_CAP_VIDEO_M2M | + V4L2_CAP_VIDEO_M2M_MPLANE | + V4L2_CAP_EXT_PIX_FORMAT | + V4L2_CAP_STREAMING; + cap->device_caps = cap->capabilities & ~V4L2_CAP_DEVICE_CAPS; + + return 0; +} + +/* + * Loop over the mvx_fmts searching for pixelformat at offset f->index. + * + * Formats that are not present in the 'formats' bitmask will be skipped. + * Which pixelformat that is mapped to which index will consequently depend + * on which mvx_formats that are enabled. + */ +static int mvx_v4l2_vidioc_enum_fmt_vid(struct mvx_v4l2_session *session, + struct v4l2_fmtdesc *f, + enum mvx_direction dir) +{ + uint64_t formats; + int index; + int i; + + mvx_session_get_formats(&session->session, dir, &formats); + + for (i = 0, index = 0; i < ARRAY_SIZE(mvx_fmts); i++) + if (mvx_test_bit(mvx_fmts[i].format, &formats)) { + if (f->index == index) { + f->flags = mvx_fmts[i].flags; + f->pixelformat = mvx_fmts[i].pixelformat; + strlcpy(f->description, mvx_fmts[i].description, + sizeof(f->description)); + break; + } + + index++; + } + + if (i >= ARRAY_SIZE(mvx_fmts)) + return -EINVAL; + + return 0; +} + +int mvx_v4l2_vidioc_enum_fmt_vid_cap(struct file *file, + void *fh, + struct v4l2_fmtdesc *f) +{ + struct mvx_v4l2_session *session = file_to_session(file); + int ret; + + ret = mvx_v4l2_vidioc_enum_fmt_vid(session, f, MVX_DIR_OUTPUT); + + return ret; +} + +int mvx_v4l2_vidioc_enum_fmt_vid_out(struct file *file, + void *fh, + struct v4l2_fmtdesc *f) +{ + struct mvx_v4l2_session *session = file_to_session(file); + int ret; + + ret = mvx_v4l2_vidioc_enum_fmt_vid(session, f, MVX_DIR_INPUT); + + return ret; +} + +int mvx_v4l2_vidioc_enum_framesizes(struct file *file, + void *fh, + struct v4l2_frmsizeenum *fsize) +{ + struct mvx_format_map *format; + + /* Verify that format is supported. */ + format = mvx_find_format(fsize->pixel_format); + if (IS_ERR(format)) + return PTR_ERR(format); + + /* For stepwise/continuous frame size the index must be 0. */ + if (fsize->index != 0) + return -EINVAL; + + fsize->type = V4L2_FRMSIZE_TYPE_STEPWISE; + fsize->stepwise.min_width = 2; + fsize->stepwise.max_width = 32768; + fsize->stepwise.step_width = 2; + fsize->stepwise.min_height = 2; + fsize->stepwise.max_height = 32768; + fsize->stepwise.step_height = 2; + + return 0; +} + +static int mvx_v4l2_vidioc_g_fmt_vid(struct file *file, + struct v4l2_format *f, + enum mvx_direction dir) +{ + struct mvx_v4l2_session *vsession = file_to_session(file); + struct mvx_v4l2_port *vport = &vsession->port[dir]; + struct mvx_session_port *port = &vsession->session.port[dir]; + int ret; + + ret = mutex_lock_interruptible(&vsession->mutex); + if (ret != 0) + return ret; + + to_v4l2_format(f, f->type, &vport->pix_mp, port->stride, port->size, + port->interlaced); + + mutex_unlock(&vsession->mutex); + + print_format(&vsession->session, f, "Get format"); + + return 0; +} + +int mvx_v4l2_vidioc_g_fmt_vid_cap(struct file *file, + void *fh, + struct v4l2_format *f) +{ + return mvx_v4l2_vidioc_g_fmt_vid(file, f, MVX_DIR_OUTPUT); +} + +int mvx_v4l2_vidioc_g_fmt_vid_out(struct file *file, + void *fh, + struct v4l2_format *f) +{ + return mvx_v4l2_vidioc_g_fmt_vid(file, f, MVX_DIR_INPUT); +} + +static int mvx_v4l2_vidioc_s_fmt_vid(struct file *file, + struct v4l2_format *f, + enum mvx_direction dir) +{ + struct mvx_v4l2_session *vsession = file_to_session(file); + struct mvx_v4l2_port *vport = &vsession->port[dir]; + struct v4l2_pix_format_mplane pix_mp; + enum mvx_format format; + unsigned int stride[MVX_BUFFER_NPLANES]; + unsigned int size[MVX_BUFFER_NPLANES]; + bool interlaced = false; + int ret; + memset(stride,0,sizeof(stride)); + memset(size,0,sizeof(size)); + ret = mutex_lock_interruptible(&vsession->mutex); + if (ret != 0) + return ret; + + if (vport->q_set != false && vb2_is_busy(&vport->vb2_queue) != false) { + MVX_SESSION_WARN(&vsession->session, + "Can't set format when there there buffers allocated to the port."); + ret = -EBUSY; + goto unlock_mutex; + } + + /* Convert V4L2 format to V4L2 multi planar pixel format. */ + ret = from_v4l2_format(vsession, f, &pix_mp, &format, stride, size, + &interlaced); + if (ret != 0) + goto unlock_mutex; + + /* Validate and adjust settings. */ + ret = mvx_session_set_format(&vsession->session, dir, format, + &pix_mp.width, &pix_mp.height, + &pix_mp.num_planes, + stride, size, &interlaced); + if (ret != 0) + goto unlock_mutex; + + /* Convert V4L2 multi planar pixel format to format. */ + ret = to_v4l2_format(f, f->type, &pix_mp, stride, size, interlaced); + if (ret != 0) + goto unlock_mutex; + + vport->type = f->type; + vport->pix_mp = pix_mp; + +unlock_mutex: + mutex_unlock(&vsession->mutex); + + print_format(&vsession->session, f, "Set format"); + + return ret; +} + +int mvx_v4l2_vidioc_s_fmt_vid_cap(struct file *file, + void *fh, + struct v4l2_format *f) +{ + return mvx_v4l2_vidioc_s_fmt_vid(file, f, MVX_DIR_OUTPUT); +} + +int mvx_v4l2_vidioc_s_fmt_vid_out(struct file *file, + void *fh, + struct v4l2_format *f) +{ + struct mvx_v4l2_session *vsession = file_to_session(file); + struct v4l2_pix_format_mplane *in = + &vsession->port[MVX_DIR_INPUT].pix_mp; + struct v4l2_pix_format_mplane *out = + &vsession->port[MVX_DIR_OUTPUT].pix_mp; + int ret; + + ret = mvx_v4l2_vidioc_s_fmt_vid(file, f, MVX_DIR_INPUT); + if (ret != 0) + return ret; + + /* Copy input formats to output port. */ + out->colorspace = in->colorspace; + out->ycbcr_enc = in->ycbcr_enc; + out->quantization = in->quantization; + out->xfer_func = in->xfer_func; + + return 0; +} + +static int mvx_v4l2_vidioc_try_fmt_vid(struct file *file, + struct v4l2_format *f, + enum mvx_direction dir) +{ + struct mvx_v4l2_session *vsession = file_to_session(file); + struct v4l2_pix_format_mplane pix; + enum mvx_format format; + unsigned int stride[MVX_BUFFER_NPLANES]; + unsigned int size[MVX_BUFFER_NPLANES]; + bool interlaced = false; + int ret; + memset(stride,0,sizeof(stride)); + memset(size,0,sizeof(size)); + ret = mutex_lock_interruptible(&vsession->mutex); + if (ret != 0) + return ret; + + ret = from_v4l2_format(vsession, f, &pix, &format, stride, size, + &interlaced); + if (ret != 0) + goto unlock_mutex; + + ret = mvx_session_try_format(&vsession->session, dir, format, + &pix.width, &pix.height, &pix.num_planes, + stride, size, &interlaced); + if (ret != 0) + goto unlock_mutex; + + ret = to_v4l2_format(f, f->type, &pix, stride, size, interlaced); + if (ret != 0) + goto unlock_mutex; + +unlock_mutex: + mutex_unlock(&vsession->mutex); + + print_format(&vsession->session, f, "Try format"); + + return ret; +} + +int mvx_v4l2_vidioc_try_fmt_vid_cap(struct file *file, + void *fh, + struct v4l2_format *f) +{ + return mvx_v4l2_vidioc_try_fmt_vid(file, f, MVX_DIR_OUTPUT); +} + +int mvx_v4l2_vidioc_try_fmt_vid_out(struct file *file, + void *fh, + struct v4l2_format *f) +{ + return mvx_v4l2_vidioc_try_fmt_vid(file, f, MVX_DIR_INPUT); +} + +int mvx_v4l2_vidioc_g_crop(struct file *file, + void *fh, + struct v4l2_crop *a) +{ + struct mvx_v4l2_session *vsession = file_to_session(file); + enum mvx_direction dir = V4L2_TYPE_IS_OUTPUT(a->type) ? + MVX_DIR_INPUT : MVX_DIR_OUTPUT; + struct mvx_v4l2_port *vport = &vsession->port[dir]; + struct mvx_session_port *port = &vsession->session.port[dir]; + int ret; + + ret = mutex_lock_interruptible(&vsession->mutex); + if (ret != 0) + return ret; + + a->c.left = vport->crop.left; + a->c.top = vport->crop.top; + a->c.width = port->width - vport->crop.left; + a->c.height = port->height - vport->crop.top; + + mutex_unlock(&vsession->mutex); + + MVX_SESSION_INFO(&vsession->session, + "v4l2: Get crop. dir=%u, crop={left=%u, top=%u, width=%u, height=%u.", + dir, a->c.left, a->c.top, a->c.width, a->c.height); + + return 0; +} + +int mvx_v4l2_vidioc_g_selection(struct file *file, + void *fh, + struct v4l2_selection *a) +{ + struct mvx_v4l2_session *vsession = file_to_session(file); + enum mvx_direction dir = V4L2_TYPE_IS_OUTPUT(a->type) ? + MVX_DIR_INPUT : MVX_DIR_OUTPUT; + struct mvx_v4l2_port *vport = &vsession->port[dir]; + struct mvx_session_port *port = &vsession->session.port[dir]; + int ret; + + ret = mutex_lock_interruptible(&vsession->mutex); + if (ret != 0) + return ret; + + a->r.left = vport->crop.left; + a->r.top = vport->crop.top; + a->r.width = port->width - vport->crop.left; + a->r.height = port->height - vport->crop.top; + + mutex_unlock(&vsession->mutex); + + MVX_SESSION_INFO(&vsession->session, + "v4l2: Get crop. dir=%u, crop={left=%u, top=%u, width=%u, height=%u.", + dir, a->r.left, a->r.top, a->r.width, a->r.height); + + return 0; +} + +int mvx_v4l2_vidioc_streamon(struct file *file, + void *priv, + enum v4l2_buf_type type) +{ + struct mvx_v4l2_session *vsession = file_to_session(file); + enum mvx_direction dir = V4L2_TYPE_IS_OUTPUT(type) ? + MVX_DIR_INPUT : MVX_DIR_OUTPUT; + int ret; + + MVX_SESSION_INFO(&vsession->session, "v4l2: Stream on. dir=%u.", dir); + + ret = mutex_lock_interruptible(&vsession->mutex); + if (ret != 0) + return ret; + + ret = vb2_streamon(&vsession->port[dir].vb2_queue, type); + if (ret != 0) + MVX_SESSION_WARN(&vsession->session, + "v4l2: Failed to stream on. dir=%u.", dir); + + mutex_unlock(&vsession->mutex); + + return ret; +} + +int mvx_v4l2_vidioc_streamoff(struct file *file, + void *priv, + enum v4l2_buf_type type) +{ + struct mvx_v4l2_session *vsession = file_to_session(file); + enum mvx_direction dir = V4L2_TYPE_IS_OUTPUT(type) ? + MVX_DIR_INPUT : MVX_DIR_OUTPUT; + int ret; + + MVX_SESSION_INFO(&vsession->session, "v4l2: Stream off. dir=%u.", dir); + + ret = mutex_lock_interruptible(&vsession->mutex); + if (ret != 0) + return ret; + + ret = vb2_streamoff(&vsession->port[dir].vb2_queue, type); + if (ret != 0) + MVX_SESSION_WARN(&vsession->session, + "v4l2: Failed to stream off. dir=%u.", dir); + + MVX_SESSION_INFO(&vsession->session, + "v4l2: Stream off exit. dir=%u, ret=%d.", + dir, ret); + + mutex_unlock(&vsession->mutex); + + return ret; +} + +int mvx_v4l2_vidioc_encoder_cmd(struct file *file, + void *priv, + struct v4l2_encoder_cmd *cmd) +{ + struct mvx_v4l2_session *vsession = file_to_session(file); + int ret; + + MVX_SESSION_INFO(&vsession->session, "v4l2: encoder cmd: %u.", + cmd->cmd); + + ret = mutex_lock_interruptible(&vsession->mutex); + if (ret != 0) + return ret; + + switch (cmd->cmd) { + case V4L2_ENC_CMD_STOP: + ret = mvx_session_send_eos(&vsession->session); + break; + default: + MVX_SESSION_WARN(&vsession->session, + "Unsupported command. cmd: %u.", cmd->cmd); + ret = -EINVAL; + } + + mutex_unlock(&vsession->mutex); + + return ret; +} + +int mvx_v4l2_vidioc_try_encoder_cmd(struct file *file, + void *priv, + struct v4l2_encoder_cmd *cmd) +{ + switch (cmd->cmd) { + case V4L2_ENC_CMD_STOP: + return 0; + default: + return -EINVAL; + } +} + +int mvx_v4l2_vidioc_decoder_cmd(struct file *file, + void *priv, + struct v4l2_decoder_cmd *cmd) +{ + struct mvx_v4l2_session *vsession = file_to_session(file); + int ret; + + MVX_SESSION_INFO(&vsession->session, "v4l2: decoder cmd: %u.", + cmd->cmd); + + ret = mutex_lock_interruptible(&vsession->mutex); + if (ret != 0) + return ret; + + switch (cmd->cmd) { + case V4L2_DEC_CMD_STOP: + ret = mvx_session_send_eos(&vsession->session); + break; + default: + MVX_SESSION_INFO(&vsession->session, + "Unsupported command. cmd: %u.", cmd->cmd); + ret = -EINVAL; + } + + mutex_unlock(&vsession->mutex); + + return ret; +} + +int mvx_v4l2_vidioc_try_decoder_cmd(struct file *file, + void *priv, + struct v4l2_decoder_cmd *cmd) +{ + switch (cmd->cmd) { + case V4L2_DEC_CMD_STOP: + return 0; + default: + return -EINVAL; + } +} + +int mvx_v4l2_vidioc_reqbufs(struct file *file, + void *fh, + struct v4l2_requestbuffers *b) +{ + struct mvx_v4l2_session *vsession = file_to_session(file); + enum mvx_direction dir = V4L2_TYPE_IS_OUTPUT(b->type) ? + MVX_DIR_INPUT : MVX_DIR_OUTPUT; + struct mvx_v4l2_port *vport = &vsession->port[dir]; + int ret; + + MVX_SESSION_INFO(&vsession->session, + "v4l2: Request buffers. dir=%d, type=%u, memory=%u, count=%u.", + dir, b->type, b->memory, b->count); + + ret = mutex_lock_interruptible(&vsession->mutex); + if (ret != 0) + return ret; + + if (b->count == 0) { + if (vport->q_set != false) { + vb2_queue_release(&vport->vb2_queue); + vport->q_set = false; + } + } else { + if (vport->q_set == false) { + ret = setup_vb2_queue(vport); + if (ret != 0) + goto unlock_mutex; + + vport->q_set = true; + } + + ret = vb2_reqbufs(&vport->vb2_queue, b); + } + vport->port->buffer_allocated = b->count; +unlock_mutex: + mutex_unlock(&vsession->mutex); + + return ret; +} + +int mvx_v4l2_vidioc_create_bufs(struct file *file, + void *fh, + struct v4l2_create_buffers *b) +{ + struct mvx_v4l2_session *vsession = file_to_session(file); + enum mvx_direction dir = V4L2_TYPE_IS_OUTPUT(b->format.type) ? + MVX_DIR_INPUT : MVX_DIR_OUTPUT; + struct mvx_v4l2_port *vport = &vsession->port[dir]; + int ret; + + MVX_SESSION_INFO(&vsession->session, + "v4l2: Create buffers. dir=%d, type=%u, memory=%u, count=%u.", + dir, b->format.type, b->memory, b->count); + + ret = mutex_lock_interruptible(&vsession->mutex); + if (ret != 0) + return ret; + + if (vport->q_set == false) + ret = setup_vb2_queue(vport); + + if (ret != 0) + goto unlock_mutex; + + vport->q_set = true; + + ret = vb2_create_bufs(&vport->vb2_queue, b); + vport->port->buffer_allocated += b->count; + MVX_SESSION_INFO(&vsession->session,"count =%d,buffer_allocated=%d",b->count,vport->port->buffer_allocated); +unlock_mutex: + mutex_unlock(&vsession->mutex); + + return ret; +} + +int mvx_v4l2_vidioc_querybuf(struct file *file, + void *fh, + struct v4l2_buffer *b) +{ + struct mvx_v4l2_session *vsession = file_to_session(file); + enum mvx_direction dir = V4L2_TYPE_IS_OUTPUT(b->type) ? + MVX_DIR_INPUT : MVX_DIR_OUTPUT; + struct mvx_v4l2_port *vport = &vsession->port[dir]; + int ret; + + MVX_SESSION_INFO(&vsession->session, + "v4l2: Query buffer. dir=%d, type=%u, memory=%u, index=%u.", + dir, b->type, b->memory, b->index); + + ret = mutex_lock_interruptible(&vsession->mutex); + if (ret != 0) + return ret; + + ret = vb2_querybuf(&vport->vb2_queue, b); + if (ret != 0) + goto unlock_mutex; + + /* + * When user space wants to mmap() a buffer, we have to be able to + * determine a direction of coresponding port. To make it easier we + * adjust mem_offset on output port by DST_QUEUE_OFF_BASE for all + * buffers. + */ + if (dir == MVX_DIR_OUTPUT) { + if (V4L2_TYPE_IS_MULTIPLANAR(b->type)) { + int i; + + for (i = 0; i < b->length; ++i) + { + b->m.planes[i].m.mem_offset += + DST_QUEUE_OFF_BASE; + } + } else { + b->m.offset += DST_QUEUE_OFF_BASE; + } + } + +unlock_mutex: + mutex_unlock(&vsession->mutex); + + return ret; +} + +int mvx_v4l2_vidioc_qbuf(struct file *file, + void *fh, + struct v4l2_buffer *b) +{ + struct mvx_v4l2_session *vsession = file_to_session(file); + enum mvx_direction dir = V4L2_TYPE_IS_OUTPUT(b->type) ? + MVX_DIR_INPUT : MVX_DIR_OUTPUT; + struct mvx_v4l2_port *vport = &vsession->port[dir]; + struct mvx_v4l2_buffer *vbuf; + struct mvx_buffer *buf; + struct vb2_buffer *vb; + struct v4l2_core_buffer_header_general *v4l2_general; + int ret; + + MVX_SESSION_INFO(&vsession->session, + "v4l2: Queue buffer. dir=%d, type=%u, index=%u, flags=0x%x.", + dir, b->type, b->index, b->flags); + + ret = mutex_lock_interruptible(&vsession->mutex); + if (ret != 0) + return ret; + + if ((b->flags & V4L2_BUF_FLAG_MVX_BUFFER_GENERAL) == V4L2_BUF_FLAG_MVX_BUFFER_GENERAL ){ + vb = vport->vb2_queue.bufs[b->index]; + vbuf = vb2_to_mvx_v4l2_buffer(vb); + buf = &vbuf->buf; + v4l2_general = (struct v4l2_core_buffer_header_general *)&b->m.planes[0].reserved[0]; + buf->general.header.buffer_size = v4l2_general->buffer_size; + buf->general.header.config_size = v4l2_general->config_size; + buf->general.header.type = v4l2_general->type; + + if (v4l2_general->type == V4L2_BUFFER_GENERAL_TYPE_BLOCK_CONFIGS) { + memcpy(&buf->general.config.block_configs, &v4l2_general->config.config, sizeof(v4l2_general->config.config)); + MVX_SESSION_INFO(&vsession->session, + "v4l2: Queue buffer. type:%d, config size:%d, buffer size:%d, cfg_type:0x%x, cols and rows:%d, %d", + v4l2_general->type ,v4l2_general->config_size, v4l2_general->buffer_size, + v4l2_general->config.config.blk_cfg_type,v4l2_general->config.config.blk_cfgs.rows_uncomp.n_cols_minus1, + v4l2_general->config.config.blk_cfgs.rows_uncomp.n_rows_minus1); + } else { + MVX_SESSION_ERR(&vsession->session, + "v4l2: Queue buffer. Unknow general buffer type:%d", v4l2_general->type); + } + } + if(vsession->port[MVX_DIR_INPUT].port->format <= MVX_FORMAT_BITSTREAM_LAST && + dir == MVX_DIR_OUTPUT && V4L2_TYPE_IS_MULTIPLANAR(b->type)) + { + if ((b->reserved2 & V4L2_BUF_FLAG_MVX_AD_STATS) == V4L2_BUF_FLAG_MVX_AD_STATS ) + { + vb = vport->vb2_queue.bufs[b->index]; + vbuf = vb2_to_mvx_v4l2_buffer(vb); + buf = &vbuf->buf; + v4l2_general = (struct v4l2_core_buffer_header_general *)&b->m.planes[0].reserved[0]; + buf->general.header.buffer_size = v4l2_general->buffer_size; + buf->general.header.config_size = v4l2_general->config_size; + buf->general.header.type = v4l2_general->type; + if(v4l2_general->type == V4L2_BUFFER_GENERAL_TYPE_AD_STATS) + { + buf->flags |= MVX_BUFFER_FRAME_FLAG_GENERAL; + memcpy(&buf->general.config.ad_stats, &v4l2_general->config.ad_stats, sizeof(v4l2_general->config.ad_stats)); + MVX_SESSION_INFO(&vsession->session, + "v4l2: Queue buffer with general buffer. type:%d, config size:%d, buffer size:%d, frame_averages:%u, thumbnail width and height:%u, %u, ad_stats_flags:0x%x", + v4l2_general->type ,v4l2_general->config_size, v4l2_general->buffer_size, + v4l2_general->config.ad_stats.frame_averages,v4l2_general->config.ad_stats.thumbnail_width, + v4l2_general->config.ad_stats.thumbnail_height,v4l2_general->config.ad_stats.ad_stats_flags); + } + else { + buf->flags &= ~MVX_BUFFER_FRAME_FLAG_GENERAL; + MVX_SESSION_ERR(&vsession->session, + "v4l2: Queue buffer. Unknow general buffer type:%d", v4l2_general->type); + } + } + } + if (dir == MVX_DIR_INPUT && V4L2_TYPE_IS_MULTIPLANAR(b->type)) { + vb = vport->vb2_queue.bufs[b->index]; + vbuf = vb2_to_mvx_v4l2_buffer(vb); + buf = &vbuf->buf; + if (b->reserved2 & V4L2_BUF_FLAG_MVX_MINIFRAME) { + //this is miniframe encode mode. + buf->offset = b->m.planes[0].reserved[10]; + } else { + buf->offset = 0; + } + if (b->reserved2 & V4L2_BUF_FLAG_MVX_OSD_MASK) { + buf->flags |= b->reserved2 & V4L2_BUF_FLAG_MVX_OSD_1 ? MVX_BUFFER_FRAME_FLAG_OSD_1 : 0; + buf->flags |= b->reserved2 & V4L2_BUF_FLAG_MVX_OSD_2 ? MVX_BUFFER_FRAME_FLAG_OSD_2 : 0; + } else { + buf->flags &= ~MVX_BUFFER_FRAME_FLAG_OSD_MASK; + } + } +#if 0 + ret = vb2_qbuf(&vport->vb2_queue, b); +#else + ret = vb2_qbuf(&vport->vb2_queue,vsession->ext->vdev.v4l2_dev->mdev, b); +#endif + mutex_unlock(&vsession->mutex); + + return ret; +} + +int mvx_v4l2_vidioc_dqbuf(struct file *file, + void *fh, + struct v4l2_buffer *b) +{ + struct mvx_v4l2_session *vsession = file_to_session(file); + struct mvx_ext_if *ctx = vsession->ext; + enum mvx_direction dir = V4L2_TYPE_IS_OUTPUT(b->type) ? + MVX_DIR_INPUT : MVX_DIR_OUTPUT; + struct mvx_v4l2_port *vport = &vsession->port[dir]; + struct vb2_buffer *vb; + struct mvx_v4l2_buffer *vbuf; + struct mvx_buffer *buf; + int ret; + uint32_t i; + + MVX_SESSION_INFO(&vsession->session, + "v4l2: Dequeue buffer. dir=%d, type=%u.", + dir, b->type); + + ret = mutex_lock_interruptible(&vsession->mutex); + if (ret != 0) + return ret; + + ret = vb2_dqbuf(&vport->vb2_queue, b, file->f_flags & O_NONBLOCK); + if (ret != 0) + goto unlock_mutex; + + if ((dir == MVX_DIR_OUTPUT) && (b->flags & V4L2_BUF_FLAG_LAST)) { + const struct v4l2_event event = { + .type = V4L2_EVENT_EOS + }; + v4l2_event_queue(&ctx->vdev, &event); + } + + /* + * For single planar buffers there is no data offset. Instead the + * offset is added to the memory pointer and subtraced from the + * bytesused. + */ + vb = vport->vb2_queue.bufs[b->index]; + if (V4L2_TYPE_IS_MULTIPLANAR(vb->type) == false) { + b->bytesused -= vb->planes[0].data_offset; + + switch (vb->type) { + case V4L2_MEMORY_MMAP: + b->m.offset += vb->planes[0].data_offset; + break; + case V4L2_MEMORY_USERPTR: + b->m.userptr += vb->planes[0].data_offset; + break; + default: + break; + } + } + + if (dir == MVX_DIR_OUTPUT && !V4L2_TYPE_IS_MULTIPLANAR(b->type)) { + vbuf = vb2_to_mvx_v4l2_buffer(vb); + buf = &vbuf->buf; + b->reserved2 = 0; + b->reserved2 = (buf->frame_type << 24) | (buf->src_transform << 16) | (buf->bitstream_remaining_kb); + } + if (vsession->port[MVX_DIR_INPUT].port->format <= MVX_FORMAT_BITSTREAM_LAST && + dir == MVX_DIR_OUTPUT && V4L2_TYPE_IS_MULTIPLANAR(b->type)) { + vbuf = vb2_to_mvx_v4l2_buffer(vb); + buf = &vbuf->buf; + for (i = 0; i < b->length; i++) + { + b->m.planes[i].reserved[0] = buf->planes[i].stride; + } + b->m.planes[0].reserved[1] =(buf->width << 16) | (buf->height); + //for ad_stats + if(buf->general.header.type == MVX_BUFFER_GENERAL_TYPE_AD_STATS) + { + b->reserved2 |= V4L2_BUF_FLAG_MVX_AD_STATS; + b->m.planes[0].reserved[2] = buf->general.header.buffer_size; + b->m.planes[0].reserved[3] = (buf->general.header.type << 16) | buf->general.header.config_size; + b->m.planes[0].reserved[4] = buf->general.config.ad_stats.frame_averages; + b->m.planes[0].reserved[5] = (buf->general.config.ad_stats.thumbnail_width << 16) | buf->general.config.ad_stats.thumbnail_height; + b->m.planes[0].reserved[6] = buf->general.config.ad_stats.ad_stats_flags; + + MVX_SESSION_INFO(&vsession->session, + "v4l2: DeQueue buffer with general buffer. type:%d, config size:%d, buffer size:%d, frame_averages:%u, thumbnail width and height:%u, %u, ad_stats_flags:0x%x", + buf->general.header.type ,buf->general.header.config_size, buf->general.header.buffer_size, + buf->general.config.ad_stats.frame_averages,buf->general.config.ad_stats.thumbnail_width, + buf->general.config.ad_stats.thumbnail_height,buf->general.config.ad_stats.ad_stats_flags); + } + + } + +unlock_mutex: + mutex_unlock(&vsession->mutex); + + MVX_SESSION_INFO(&vsession->session, + "v4l2: Dequeued buffer. dir=%d, type=%u, index=%u, flags=0x%x, nevents=%u, fh=%p.", + dir, b->type, b->index, b->flags, + v4l2_event_pending(&vsession->fh), fh); + + return ret; +} + +int mvx_v4l2_vidioc_subscribe_event(struct v4l2_fh *fh, + const struct v4l2_event_subscription *sub) +{ + struct mvx_v4l2_session *session = v4l2_fh_to_session(fh); + + MVX_SESSION_INFO(&session->session, + "v4l2: Subscribe event. fh=%p, type=%u.", fh, + sub->type); + + switch (sub->type) { + case V4L2_EVENT_CTRL: + return v4l2_ctrl_subscribe_event(fh, sub); + case V4L2_EVENT_EOS: + case V4L2_EVENT_SOURCE_CHANGE: + case V4L2_EVENT_MVX_COLOR_DESC: + return v4l2_event_subscribe(fh, sub, 2, NULL); + default: + MVX_SESSION_WARN(&session->session, + "Can't register for unsupported event. type=%u.", + sub->type); + return -EINVAL; + } + + return 0; +} + +long mvx_v4l2_vidioc_default(struct file *file, + void *fh, + bool valid_prio, + unsigned int cmd, + void *arg) +{ + struct mvx_v4l2_session *vsession = file_to_session(file); + int ret; + MVX_SESSION_INFO(&vsession->session, + "Custom ioctl. cmd=0x%x, arg=0x%p.", cmd, arg); + + switch (cmd) { + case VIDIOC_G_MVX_COLORDESC: { + ret = mvx_v4l2_session_get_color_desc(vsession, arg); + break; + } + case VIDIOC_S_MVX_ROI_REGIONS: { + ret = mvx_v4l2_session_set_roi_regions(vsession, arg); + break; + } + case VIDIOC_S_MVX_QP_EPR: { + ret = mvx_v4l2_session_set_qp_epr(vsession, arg); + break; + } + case VIDIOC_S_MVX_COLORDESC: { + ret = mvx_v4l2_session_set_color_desc(vsession, arg); + break; + } + case VIDIOC_S_MVX_SEI_USERDATA: { + ret = mvx_v4l2_session_set_sei_userdata(vsession, arg); + break; + } + case VIDIOC_S_MVX_RATE_CONTROL: { + ret = mvx_v4l2_session_set_rate_control(vsession, arg); + break; + } + case VIDIOC_S_MVX_DSL_FRAME: { + ret = mvx_v4l2_session_set_dsl_frame(vsession, arg); + break; + } + case VIDIOC_S_MVX_DSL_RATIO: { + ret = mvx_v4l2_session_set_dsl_ratio(vsession, arg); + break; + } + case VIDIOC_S_MVX_LONG_TERM_REF: { + ret = mvx_v4l2_session_set_long_term_ref(vsession, arg); + break; + } + case VIDIOC_S_MVX_DSL_MODE: { + ret = mvx_v4l2_session_set_dsl_mode(vsession, arg); + break; + } + case VIDIOC_S_MVX_MINI_FRAME_HEIGHT: { + ret = mvx_v4l2_session_set_mini_frame_height(vsession, arg); + break; + } + case VIDIOC_S_MVX_STATS_MODE: { + ret = mvx_v4l2_session_set_stats_mode(vsession, arg); + break; + } + case VIDIOC_S_MVX_CHR_CFG: { + ret = mvx_v4l2_session_set_chr_cfg(vsession, arg); + break; + } + case VIDIOC_S_MVX_HUFF_TABLE: { + ret = mvx_v4l2_session_set_huff_table(vsession, arg); + break; + } + case VIDIOC_S_MVX_SEAMLESS_TARGET: { + ret = mvx_v4l2_session_set_seamless_target(vsession, arg); + break; + } + case VIDIOC_S_MVX_COLOR_CONV_COEF: { + ret = mvx_v4l2_session_set_color_conv_coef(vsession, arg); + break; + } + case VIDIOC_S_MVX_RGB2YUV_COLOR_CONV_COEF: { + ret = mvx_v4l2_session_set_rgb_conv_yuv_coef(vsession, arg); + break; + } + case VIDIOC_S_MVX_ENC_SRC_CROP: { + ret = mvx_v4l2_session_set_enc_src_crop(vsession, arg); + break; + } + case VIDIOC_S_MVX_DEC_DST_CROP: { + ret = mvx_v4l2_session_set_dec_dst_crop(vsession, arg); + break; + } + case VIDIOC_S_MVX_OSD_CONFIG: { + ret = mvx_v4l2_session_set_osd_config(vsession, arg); + break; + } + case VIDIOC_S_MVX_OSD_INFO: { + struct v4l2_osd_info* osd_info = (struct v4l2_osd_info*)arg; + enum mvx_format osd_fmt[MVX_MAX_FRAME_OSD_REGION]; + int i; + struct mvx_format_map* osd_map; + for (i = 0; i < MVX_MAX_FRAME_OSD_REGION; i++) { + osd_map = mvx_find_format(osd_info->inputFormat_osd[i]); + osd_fmt[i] = osd_map->format; + } + ret = mvx_v4l2_session_set_osd_info(vsession, arg, osd_fmt); + break; + } + default: + MVX_LOG_PRINT(&mvx_log_if, MVX_LOG_WARNING, + "Unsupported IOCTL. cmd=0x%x", cmd); + return -ENOTTY; + } + + return ret; +} diff --git a/src/little/linux/drivers/media/platform/canaan-vpu/mvx_v4l2_vidioc.h b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_v4l2_vidioc.h new file mode 100755 index 000000000..d77cc82a4 --- /dev/null +++ b/src/little/linux/drivers/media/platform/canaan-vpu/mvx_v4l2_vidioc.h @@ -0,0 +1,145 @@ +/* + * The confidential and proprietary information contained in this file may + * only be used by a person authorised under and to the extent permitted + * by a subsisting licensing agreement from Arm Technology (China) Co., Ltd. + * + * (C) COPYRIGHT 2021-2021 Arm Technology (China) Co., Ltd. + * ALL RIGHTS RESERVED + * + * This entire notice must be reproduced on all copies of this file + * and copies of this file may only be made by a person if such person is + * permitted to do so under the terms of a subsisting license agreement + * from Arm Technology (China) Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-only + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef _MVX_V4L2_VIDIOC_H_ +#define _MVX_V4L2_VIDIOC_H_ + +/**************************************************************************** + * Exported functions + * + * Callbacks for struct v4l2_ioctl_ops. + * + * Prototypes declared bellow implement certain v4l2 ioctls and used to + * initialize members of v4l2_ioctl_ops structure. + ****************************************************************************/ + +int mvx_v4l2_vidioc_querycap(struct file *file, + void *fh, + struct v4l2_capability *cap); + +int mvx_v4l2_vidioc_enum_fmt_vid_cap(struct file *file, + void *fh, + struct v4l2_fmtdesc *f); + +int mvx_v4l2_vidioc_enum_fmt_vid_out(struct file *file, + void *fh, + struct v4l2_fmtdesc *f); + +int mvx_v4l2_vidioc_enum_framesizes(struct file *file, + void *fh, + struct v4l2_frmsizeenum *fsize); + +int mvx_v4l2_vidioc_g_fmt_vid_cap(struct file *file, + void *fh, + struct v4l2_format *f); + +int mvx_v4l2_vidioc_g_fmt_vid_out(struct file *file, + void *fh, + struct v4l2_format *f); + +int mvx_v4l2_vidioc_s_fmt_vid_cap(struct file *file, + void *fh, + struct v4l2_format *f); + +int mvx_v4l2_vidioc_s_fmt_vid_out(struct file *file, + void *fh, + struct v4l2_format *f); + +int mvx_v4l2_vidioc_try_fmt_vid_cap(struct file *file, + void *fh, + struct v4l2_format *f); + +int mvx_v4l2_vidioc_try_fmt_vid_out(struct file *file, + void *fh, + struct v4l2_format *f); + +int mvx_v4l2_vidioc_g_crop(struct file *file, + void *fh, + struct v4l2_crop *a); + +int mvx_v4l2_vidioc_g_selection(struct file *file, + void *fh, + struct v4l2_selection *a); + +int mvx_v4l2_vidioc_streamon(struct file *file, + void *priv, + enum v4l2_buf_type type); + +int mvx_v4l2_vidioc_streamoff(struct file *file, + void *priv, + enum v4l2_buf_type type); + +int mvx_v4l2_vidioc_encoder_cmd(struct file *file, + void *priv, + struct v4l2_encoder_cmd *cmd); + +int mvx_v4l2_vidioc_try_encoder_cmd(struct file *file, + void *priv, + struct v4l2_encoder_cmd *cmd); + +int mvx_v4l2_vidioc_decoder_cmd(struct file *file, + void *priv, + struct v4l2_decoder_cmd *cmd); + +int mvx_v4l2_vidioc_try_decoder_cmd(struct file *file, + void *priv, + struct v4l2_decoder_cmd *cmd); + +int mvx_v4l2_vidioc_reqbufs(struct file *file, + void *fh, + struct v4l2_requestbuffers *b); + +int mvx_v4l2_vidioc_create_bufs(struct file *file, + void *fh, + struct v4l2_create_buffers *b); + +int mvx_v4l2_vidioc_querybuf(struct file *file, + void *fh, + struct v4l2_buffer *b); + +int mvx_v4l2_vidioc_qbuf(struct file *file, + void *fh, + struct v4l2_buffer *b); + +int mvx_v4l2_vidioc_dqbuf(struct file *file, + void *fh, + struct v4l2_buffer *b); + +int mvx_v4l2_vidioc_subscribe_event(struct v4l2_fh *fh, + const struct v4l2_event_subscription *sub); + +long mvx_v4l2_vidioc_default(struct file *file, + void *fh, + bool valid_prio, + unsigned int cmd, + void *arg); + +#endif /* _MVX_V4L2_VIDIOC_H_ */ diff --git a/src/little/linux/drivers/net/usb/r8152.c b/src/little/linux/drivers/net/usb/r8152.c index 8bee1a513..84a0900db 100644 --- a/src/little/linux/drivers/net/usb/r8152.c +++ b/src/little/linux/drivers/net/usb/r8152.c @@ -1497,6 +1497,25 @@ static int vendor_mac_passthru_addr_read(struct r8152 *tp, struct sockaddr *sa) return ret; } +static unsigned char mac_addr_str[18] = {0}; +static char mac_addr_hex[6] = {0}; +static int __init param_mac_setup(char *val) +{ + if(!strcmp(val, "") || (17 != strlen(val))) // xx:xx:xx:xx:xx:xx + { + pr_info("rtl8152 mac get failed\n"); + return -EINVAL; + } + strncpy(mac_addr_str, val, 17); + sscanf(mac_addr_str, "%02x:%02x:%02x:%02x:%02x:%02x", + (unsigned int *)&mac_addr_hex[0], (unsigned int *)&mac_addr_hex[1], + (unsigned int *)&mac_addr_hex[2], (unsigned int *)&mac_addr_hex[3], + (unsigned int *)&mac_addr_hex[4], (unsigned int *)&mac_addr_hex[5]); + return 1; +} + +__setup("ethaddr=", param_mac_setup); + static int determine_ethernet_addr(struct r8152 *tp, struct sockaddr *sa) { struct net_device *dev = tp->netdev; @@ -1512,23 +1531,37 @@ static int determine_ethernet_addr(struct r8152 *tp, struct sockaddr *sa) /* if device doesn't support MAC pass through this will * be expected to be non-zero */ - // ret = vendor_mac_passthru_addr_read(tp, sa); - // if (ret < 0) - // ret = pla_ocp_read(tp, PLA_BACKUP, 8, - // sa->sa_data); + ret = vendor_mac_passthru_addr_read(tp, sa); + if (ret < 0) + ret = pla_ocp_read(tp, PLA_BACKUP, 8, + sa->sa_data); ret = 0; } } if (ret < 0) { netif_err(tp, probe, dev, "Get ether addr fail\n"); - // } else if (!is_valid_ether_addr(sa->sa_data)) { - } else { - netif_err(tp, probe, dev, "Invalid ether addr %pM\n", - sa->sa_data); - eth_hw_addr_random(dev); - ether_addr_copy(sa->sa_data, dev->dev_addr); - netif_info(tp, probe, dev, "Random ether addr %pM\n", + } else if (!is_valid_ether_addr(sa->sa_data)) { + // netif_err(tp, probe, dev, "Invalid ether addr %pM\n", + // sa->sa_data); + // eth_hw_addr_random(dev); + // ether_addr_copy(sa->sa_data, dev->dev_addr); + // netif_info(tp, probe, dev, "Random ether addr %pM\n", + // sa->sa_data); + if(!is_valid_ether_addr(mac_addr_hex)) + { + void __iomem *trng_addr = ioremap(0x91213300, 0x100); + unsigned int trng_data = readl(trng_addr); + iounmap(trng_addr); + mac_addr_hex[0] = 0x00; + mac_addr_hex[1] = 0xe0; + mac_addr_hex[2] = 0x4c; + mac_addr_hex[3] = trng_data & 0xff; + mac_addr_hex[4] = (trng_data>>8) & 0xff; + mac_addr_hex[5] = (trng_data>>16) & 0xff; + } + ether_addr_copy(sa->sa_data, mac_addr_hex); + netif_info(tp, probe, dev, "rtl8152 ether addr %pM\n", sa->sa_data); return 0; } diff --git a/src/little/linux/drivers/net/wireless/rtl8189fs/Makefile b/src/little/linux/drivers/net/wireless/rtl8189fs/Makefile index a88f084c6..44be9dbd5 100755 --- a/src/little/linux/drivers/net/wireless/rtl8189fs/Makefile +++ b/src/little/linux/drivers/net/wireless/rtl8189fs/Makefile @@ -133,7 +133,7 @@ EXTRA_CFLAGS += -DCONFIG_RTW_ANDROID=$(CONFIG_RTW_ANDROID) endif ########################## Debug ########################### -CONFIG_RTW_DEBUG = y +CONFIG_RTW_DEBUG = n # default log level is _DRV_INFO_ = 4, # please refer to "How_to_set_driver_debug_log_level.doc" to set the available level. CONFIG_RTW_LOG_LEVEL = 2 diff --git a/src/little/linux/drivers/pwm/pwm-k230.c b/src/little/linux/drivers/pwm/pwm-k230.c index f5c547e8f..66388f5fe 100755 --- a/src/little/linux/drivers/pwm/pwm-k230.c +++ b/src/little/linux/drivers/pwm/pwm-k230.c @@ -170,7 +170,6 @@ static int k230_pwm_probe(struct platform_device *pdev) { struct k230_pwm_chip *k230_pwm; int ret; - k230_pwm_t *reg; k230_pwm = devm_kzalloc(&pdev->dev, sizeof(*k230_pwm), GFP_KERNEL); if (k230_pwm == NULL) @@ -198,17 +197,6 @@ static int k230_pwm_probe(struct platform_device *pdev) k230_pwm->chip.base = -1; k230_pwm->chip.npwm = 6; - reg = (k230_pwm_t*)k230_pwm->addr; - reg->pwmcmp0 = 0; - reg->pwmcmp1 = 0; - reg->pwmcmp2 = 0; - reg->pwmcmp3 = 0; - reg = (k230_pwm_t*)((void*)reg + 0x40); - reg->pwmcmp0 = 0; - reg->pwmcmp1 = 0; - reg->pwmcmp2 = 0; - reg->pwmcmp3 = 0; - ret = pwmchip_add(&k230_pwm->chip); if (ret < 0) return ret; diff --git a/src/little/linux/drivers/soc/canaan/k230_pm_domains.c b/src/little/linux/drivers/soc/canaan/k230_pm_domains.c index da55e216e..988ed95a1 100644 --- a/src/little/linux/drivers/soc/canaan/k230_pm_domains.c +++ b/src/little/linux/drivers/soc/canaan/k230_pm_domains.c @@ -199,14 +199,17 @@ int k230_pd_probe(struct platform_device *pdev, k230_pm_domains[K230_PM_DOMAIN_CPU1]->flags |= GENPD_FLAG_ALWAYS_ON; k230_pm_domains[K230_PM_DOMAIN_AI]->flags |= GENPD_FLAG_ALWAYS_ON; - k230_pm_domains[K230_PM_DOMAIN_VPU]->flags |= GENPD_FLAG_ALWAYS_ON; + // k230_pm_domains[K230_PM_DOMAIN_VPU]->flags |= GENPD_FLAG_ALWAYS_ON; k230_pm_domains[K230_PM_DOMAIN_DPU]->flags |= GENPD_FLAG_ALWAYS_ON; for (i = 0; i < domain_num; ++i) { k230_pm_domains[i]->power_on = k230_power_on; k230_pm_domains[i]->power_off = k230_power_off; - pm_genpd_init(k230_pm_domains[i], NULL, i != K230_PM_DOMAIN_DISP ? false : true); + if (i == K230_PM_DOMAIN_DISP || i == K230_PM_DOMAIN_VPU) + pm_genpd_init(k230_pm_domains[i], NULL, true); + else + pm_genpd_init(k230_pm_domains[i], NULL, false); } of_genpd_add_provider_onecell(pdev->dev.of_node, genpd_data); diff --git a/src/little/uboot/arch/riscv/Kconfig b/src/little/uboot/arch/riscv/Kconfig index b7b233276..d2873961a 100755 --- a/src/little/uboot/arch/riscv/Kconfig +++ b/src/little/uboot/arch/riscv/Kconfig @@ -33,21 +33,31 @@ config TARGET_OPENPITON_RISCV64 config TARGET_K230_FPGA bool "Support k230_fpga" + select SYS_CACHE_SHIFT_6 config TARGET_K230_EVB bool "Support k230_evb" + select SYS_CACHE_SHIFT_6 config TARGET_K230_CANMV bool "Support k230_CANMV(K230PI)" + select SYS_CACHE_SHIFT_6 +config TARGET_K230_CANMV_01STUDIO + bool "Support k230_CANMV(01STUDIO)" + select SYS_CACHE_SHIFT_6 + config TARGET_K230D_CANMV bool "Support k230D_CANMV(K230PI zero)" + select SYS_CACHE_SHIFT_6 config TARGET_K230_UNSIPLP4 bool "Support usiplp4" + select SYS_CACHE_SHIFT_6 config TARGET_K230_SIPLP4 bool "Support sip lp4" + select SYS_CACHE_SHIFT_6 endchoice @@ -86,6 +96,7 @@ source "board/sipeed/maix/Kconfig" source "board/canaan/k230_fpga/Kconfig" source "board/canaan/k230_evb/Kconfig" source "board/canaan/k230_canmv/Kconfig" +source "board/canaan/k230_canmv_01studio/Kconfig" source "board/canaan/k230d_canmv/Kconfig" source "board/canaan/k230_unsiplp4/Kconfig" source "board/canaan/k230_siplp4/Kconfig" diff --git a/src/little/uboot/arch/riscv/cpu/k230/Makefile b/src/little/uboot/arch/riscv/cpu/k230/Makefile index f77559634..651281c34 100755 --- a/src/little/uboot/arch/riscv/cpu/k230/Makefile +++ b/src/little/uboot/arch/riscv/cpu/k230/Makefile @@ -36,6 +36,7 @@ obj-y += puf_fw/pufs_ecp/pufs_ecp.o obj-y += puf_fw/pufs_hmac/pufs_hmac.o obj-y += puf_fw/pufs_ka/pufs_ka.o obj-y += puf_fw/pufs_rt/pufs_rt.o +obj-y += puf_fw/pufs_rt/pufs_rt_cde.o obj-y += puf_fw/pufs_sm2/pufs_sm2.o obj-y += puf_fw/pufs_sp38a/pufs_sp38a.o obj-y += puf_fw/pufs_sp38d/pufs_sp38d.o @@ -58,3 +59,5 @@ EXTRA_CFLAGS += -I$(srctree)/arch/$(ARCH)/cpu/k230/puf_fw/pufs_hmac EXTRA_CFLAGS += -I$(srctree)/arch/$(ARCH)/cpu/k230/puf_fw/pufs_ka EXTRA_CFLAGS += -I$(srctree)/arch/$(ARCH)/cpu/k230/puf_fw/pufs_rt EXTRA_CFLAGS += -I$(srctree)/arch/$(ARCH)/cpu/k230/puf_fw/pufs_sm2 + +obj-$(CONFIG_$(SPL_)DFU_VIRT) += dfu_otp.o diff --git a/src/little/uboot/arch/riscv/cpu/k230/config.mk b/src/little/uboot/arch/riscv/cpu/k230/config.mk index 8a2a5504c..d616316ba 100755 --- a/src/little/uboot/arch/riscv/cpu/k230/config.mk +++ b/src/little/uboot/arch/riscv/cpu/k230/config.mk @@ -1,6 +1,8 @@ ifndef CONFIG_SPL_BUILD ifndef CONFIG_TARGET_K230_FPGA - INPUTS-y += add_firmware_head + ifdef CONFIG_SPL + INPUTS-y += add_firmware_head + endif endif endif add_firmware_head: u-boot.bin spl/u-boot-spl.bin u-boot.img @@ -23,6 +25,14 @@ add_firmware_head: u-boot.bin spl/u-boot-spl.bin u-boot.img dd if=u-boot-spl-k230.bin of=sd.iso bs=512 seek=$$((0x100000/512)) dd if=fn_u-boot.img of=sd.iso bs=512 seek=$$((0x200000/512)) + #生成vpu测试程序 + # dd if=ddr_dma_cpu_read_write.bin of=sd.iso bs=512 seek=$$((0x1000000/512)) + # dd if=kpu_ddr_test_evblp3_cpu0.bin of=sd.iso bs=512 seek=$$((0x2000000/512)) + # dd if=vpu_jpegenc_8k_loop_512MB.bin of=sd.iso bs=512 seek=$$((0x3000000/512)) + # mmc dev 0; mmc read 0x80200000 0x8000 0x400; boot_baremetal 0 0x80200000 0x80000; + # mmc dev 0; mmc read 0 0x10000 0x40000; boot_baremetal 0 0 0x8000000; + # mmc dev 0; mmc read 0 0x18000 0x40000; boot_baremetal 0 0 0x8000000; + # board/canaan/common/k230_spl.c device_disable diff --git a/src/little/uboot/arch/riscv/cpu/k230/cpu.c b/src/little/uboot/arch/riscv/cpu/k230/cpu.c index dcc9ebf95..28ee5d90f 100755 --- a/src/little/uboot/arch/riscv/cpu/k230/cpu.c +++ b/src/little/uboot/arch/riscv/cpu/k230/cpu.c @@ -75,13 +75,21 @@ void harts_early_init(void) /*enable mtimer clk*/ writel(0x1, (volatile void __iomem *)0x91108020);//CPU0 writel(0x1, (volatile void __iomem *)0x91108030);//CPU1 + // enable stc0 + writel(0x69, (volatile void __iomem *)0x91108000); + record_boot_time_info_to_sram("et"); writel(0x80199805, (void*)0x91100004); + + writel(0x0, (void*)SYSCTL_PWR_BASE_ADDR + 0x158); +// This address space only allows write access by the k230_burntool. +#ifndef CONFIG_CMD_DFU csr_write(pmpaddr0, 0x24484dff);//start addr:0x24484c00<<2=0x91213000 len=1<<9 * 8 = 4KB csr_write(pmpaddr1, 0x244851ff);//start addr:0x24485000<<2=0x91214000 len=1<<9 * 8 = 4KB csr_write(pmpcfg0, 0x9999); +#endif //improving_cpu_performance(); } diff --git a/src/little/uboot/arch/riscv/cpu/k230/dfu_otp.c b/src/little/uboot/arch/riscv/cpu/k230/dfu_otp.c new file mode 100755 index 000000000..7fec10abb --- /dev/null +++ b/src/little/uboot/arch/riscv/cpu/k230/dfu_otp.c @@ -0,0 +1,168 @@ +#include +#include +#include +#include +#include +#include "pufs_rt.h" + +#define ALT_OTP 0 +#define ALT_OTP_LOCK 1 +#define ALT_CDE 2 +#define ALT_CDE_LOCK 3 + +int dfu_write_medium_virt(struct dfu_entity *dfu, u64 offset, + void *buf, long *len) +{ + printf("%s: dev_num=%d off=0x%llx, len=0x%x\n", __func__, dfu->data.virt.dev_num, offset, (u32)*len); + if(offset !=0) + { + return 0; + } + if(dfu->data.virt.dev_num == ALT_OTP) + { + if(*len == 1024) + { + pufs_program_otp(buf, 1024, 0); + } + } + else if(dfu->data.virt.dev_num == ALT_OTP_LOCK) + { + if(*len == 1024) + { + uint32_t *otp_rwlck = buf; + for(int i=0; i<1024/4; i++) + { + if(otp_rwlck[i] == 0x12345678) + { + pufs_lock_otp(i*4, 4, RO); + } + else if(otp_rwlck[i] == 0x9abcdef0) + { + pufs_lock_otp(i*4, 4, NA); + } + } + } + } + else if(dfu->data.virt.dev_num == ALT_CDE) + { + if(*len == 3072) + { + pufs_program_cde(buf, 3072, 0); + } + } + else if(dfu->data.virt.dev_num == ALT_CDE_LOCK) + { + if(*len == 96) + { + uint32_t *cde_rolck = buf; + for(int i=0; i<96/4; i++) + { + if(cde_rolck[i] == 0x12345678) + { + rt_cde_write_lock(i*128, 128, RO); + } + } + } + } + else + { + printf("%s: dev_num=%d\n", __func__, dfu->data.virt.dev_num); + } + + return 0; +} + +int dfu_get_medium_size_virt(struct dfu_entity *dfu, u64 *size) +{ + printf("%s: dev_num=%d\n", __func__, dfu->data.virt.dev_num); + if(dfu->data.virt.dev_num == ALT_OTP) + { + *size = 1024; + } + else if(dfu->data.virt.dev_num == ALT_OTP_LOCK) + { + *size = 1024;//1024B 4B为一个保护单位,每个保护单位使用4B; + } + else if(dfu->data.virt.dev_num == ALT_CDE) + { + *size = 3072; + } + else if(dfu->data.virt.dev_num == ALT_CDE_LOCK) + { + *size = 3072/128*4; //3072B 128B为一个保护单位,每个保护单位使用4B;96 + } + else + { + printf("%s: dev_num=%d\n", __func__, dfu->data.virt.dev_num); + } + + return 0; +} + +int dfu_read_medium_virt(struct dfu_entity *dfu, u64 offset, + void *buf, long *len) +{ + printf("%s: dev_num=%d off=0x%llx, len=0x%x\n", __func__, dfu->data.virt.dev_num, offset, (u32)*len); + if(offset !=0) + { + return 0; + } + if(dfu->data.virt.dev_num == ALT_OTP) + { + pufs_read_otp(buf, 1024, 0); + *len = 1024; + } + else if(dfu->data.virt.dev_num == ALT_OTP_LOCK) + { + uint32_t *otp_rwlck = buf; + for(int i=0; i<1024/4; i++) + { + pufs_otp_lock_t rwclk = pufs_get_otp_rwlck(i*4); + if( rwclk == RO) + { + otp_rwlck[i] = 0x12345678; + } + else if( rwclk == NA) + { + otp_rwlck[i] = 0x9abcdef0; + } + else { + otp_rwlck[i] = 0x0; + } + + } + + *len = 1024; + } + else if(dfu->data.virt.dev_num == ALT_CDE) + { + pufs_read_cde(buf, 3072, 0); + *len = 3072; + } + else if(dfu->data.virt.dev_num == ALT_CDE_LOCK) + { + uint32_t *cde_rolck = buf; + for(int i=0; i<3072/128; i++) + { + if(rt_cde_read_lock(i*128) == RO) + { + cde_rolck[i] = 0x12345678; + } + else { + cde_rolck[i] = 0x0; + } + + } + + *len = 3072/128*4; + } + else + { + printf("%s: dev_num=%d\n", __func__, dfu->data.virt.dev_num); + *len = 0; + } + + + + return 0; +} \ No newline at end of file diff --git a/src/little/uboot/arch/riscv/cpu/k230/dram.c b/src/little/uboot/arch/riscv/cpu/k230/dram.c index bb8a9dceb..03503d46b 100755 --- a/src/little/uboot/arch/riscv/cpu/k230/dram.c +++ b/src/little/uboot/arch/riscv/cpu/k230/dram.c @@ -91,6 +91,9 @@ void ddr_init_2667(void); void sip_ddr_init_3200_have_wodt(void); void sip_ddr_init_3200_have_all_odt(void); void pi_ddr_init_2133(void); +void sip_ddr_init_1600(void); +void sip_ddr_init_2667(void); +void canmv_01studio_ddr_init_2133(void); __weak int ddr_init_training(void) { @@ -127,6 +130,8 @@ __weak int ddr_init_training(void) sip_ddr_init_3200_have_all_odt(); #elif defined(CONFIG_CANMV_LPDDR3_2133) pi_ddr_init_2133(); + #elif defined(CONFIG_CANMV_01STUDIO_LPDDR3_2133) + canmv_01studio_ddr_init_2133(); #elif defined(CONFIG_SIPLP4_1600) sip_ddr_init_1600(); #elif defined(CONFIG_SIPLP4_2667) @@ -139,7 +144,9 @@ __weak int ddr_init_training(void) int dram_init(void) { - //ddr_init_training(); +#ifndef CONFIG_SPL + ddr_init_training(); +#endif return fdtdec_setup_mem_size_base(); } diff --git a/src/little/uboot/arch/riscv/cpu/k230/puf_fw/pufs_rt/pufs_rt.c b/src/little/uboot/arch/riscv/cpu/k230/puf_fw/pufs_rt/pufs_rt.c index 91840609a..02d8f0365 100755 --- a/src/little/uboot/arch/riscv/cpu/k230/puf_fw/pufs_rt/pufs_rt.c +++ b/src/little/uboot/arch/riscv/cpu/k230/puf_fw/pufs_rt/pufs_rt.c @@ -190,6 +190,16 @@ void rt_write_pdstb(bool off) { pufs_ptm_cfg_set(PTM_CFG_REG_PDSTB_MASK, off, (off ? true : false)); } + +// Program protectΪ˱֤Ѿ¼Ϊ1cellһΡ +// Program ignoreΪ˱֤Ϊ0cellٵ·stress +// ֪Ϊʲôip̲ΪĬʹ +// ڽб֮ǰȷprogram protect (done at factory) Լprogram ignore(enable config reg) +void puf_pgm_ign_ctrl(bool on) +{ + pufs_ptm_cfg_set(PTM_CFG_REG_PGM_IGN_MASK, on); +} +//puf_pgm_ign_ctrl(true) to enable PGM_IGN /** * @brief Read mode control * @@ -312,7 +322,7 @@ pufs_status_t pufs_program_otp(const uint8_t* inbuf, uint32_t len, if ((check = otp_range_check(addr, len)) != SUCCESS) return check; - + puf_pgm_ign_ctrl(true); // program for (uint32_t i=0;i=0;j--) // reserve, default 0xff otp_word.byte[j] = ((i+3-j) < len) ? inbuf[i+3-j] : 0xff; - + + if(otp_word.word == 0x0) continue; + if(rt_regs->otp[start_index + (i/4)] == otp_word.word) continue; + + // printf("[%d]:0x%x \n", start_index + (i/4), otp_word.word); rt_regs->otp[start_index + (i/4)] = otp_word.word; } diff --git a/src/little/uboot/arch/riscv/cpu/k230/puf_fw/pufs_rt/pufs_rt_cde.c b/src/little/uboot/arch/riscv/cpu/k230/puf_fw/pufs_rt/pufs_rt_cde.c new file mode 100755 index 000000000..707d35659 --- /dev/null +++ b/src/little/uboot/arch/riscv/cpu/k230/puf_fw/pufs_rt/pufs_rt_cde.c @@ -0,0 +1,135 @@ + +#include "pufs_internal.h" +#include "pufs_rt_internal.h" +#include "platform.h" +// for PSIOT_012CW01D_B12C project + +#define PUFS_CDE_SEGMENT 128 // 1K bits +#define PIF_CDE_RWLCK_START_INDEX 4 +#define PIF_CDE_RWLCK_MAX_GROUP 24 + +struct pufs_rt_cde_regs *rt_cde_regs = (struct pufs_rt_cde_regs *)(PUFIOT_ADDR_START+CDE_ADDR_OFFSET); +static int rt_cde_select_index(uint32_t idx) +{ + uint32_t group = idx / RWLOCK_GROUP_OTP; + + if (group >= PIF_CDE_RWLCK_MAX_GROUP) + return -1; + + return PIF_CDE_RWLCK_START_INDEX + group; +} + +/** + * pufs_read_otp() + */ +pufs_status_t pufs_read_cde(uint8_t* outbuf, uint32_t len, uint32_t addr) +{ + for (uint32_t index = 0; index < len; index+=4) + { + *(uint32_t* )(outbuf + index) = rt_cde_regs->otp[(addr+index)/4]; + } + + return SUCCESS; +} + +/** + * pufs_program_otp() + */ +pufs_status_t pufs_program_cde(const uint8_t* inbuf, uint32_t len, uint32_t addr) +{ + for (uint32_t index = 0; index < len; index+=4) + { + if(*(uint32_t* )(inbuf + index) == 0) continue; + if(rt_cde_regs->otp[(addr+index)/4] == *(uint32_t* )(inbuf + index)) continue; + + // printf("cde[%d]:0x%x \n", (addr+index)/4, *(uint32_t* )(inbuf + index)); + rt_cde_regs->otp[(addr+index)/4] = *(uint32_t* )(inbuf + index); + } + + return SUCCESS; +} + +pufs_status_t rt_cde_write_lock(uint32_t offset, uint32_t length, pufs_otp_lock_t lock) +{ + uint32_t lock_val = 0, end = 0, start = 0, val32 = 0, rwlock_index, shift, mask = 0; + + switch (lock) + { + case RO: + lock_val = PUFRT_VALUE4(0xC); + break; + case RW: + lock_val = PUFRT_VALUE4(0xF); + break; + default: + return E_INVALID; + } + + end = (length + (PUFS_CDE_SEGMENT - 1)) / PUFS_CDE_SEGMENT; + start = offset / PUFS_CDE_SEGMENT; + + for (uint32_t i = 0; i < end; i++) + { + int idx = start + i; + rwlock_index = rt_cde_select_index(idx); + + shift = (idx % RWLOCK_GROUP_OTP) * 4; + val32 |= lock_val << shift; + mask |= 0xF << shift; + + if (shift == 28 || i == end - 1) + { + val32 |= (rt_regs->pif[rwlock_index] & (~mask)); + rt_regs->pif[rwlock_index] = val32; + + val32 = 0; + mask = 0; + } + } + return SUCCESS; +} + +pufs_otp_lock_t rt_cde_read_lock(uint32_t offset) +{ + int idx; + uint32_t group_index, lck; + + idx = offset / PUFS_CDE_SEGMENT; + group_index = idx % RWLOCK_GROUP_OTP; + + if ((idx = rt_cde_select_index(idx)) == -1) + return N_OTP_LOCK_T; + + lck = (rt_regs->pif[idx] >> (group_index * 4)) & 0xF; + + switch (lck) + { + case PUFRT_VALUE4(0x0): + return RO; + case PUFRT_VALUE4(0xC): + return RO; + case PUFRT_VALUE4(0xF): + return RW; + default: + return N_OTP_LOCK_T; + } + return N_OTP_LOCK_T; +} + +// mask 1K bits(128 bytes) segment starting from offset input +pufs_status_t rt_cde_write_mask(uint32_t offset) +{ + uint32_t index, group, reg, group_index; + index = offset / PUFS_CDE_SEGMENT; + group = index / 16; // 2 bit for each code segment mask of 32 bit register + group_index = index % 16; + + if (group > 1) + return E_INVALID; + + reg = rt_regs->ptm[group]; + reg |= 0x3 << (group_index * 2); + rt_regs->ptm[group] = reg; + + return SUCCESS; +} diff --git a/src/little/uboot/arch/riscv/cpu/k230/puf_fw/pufs_rt/pufs_rt_internal.h b/src/little/uboot/arch/riscv/cpu/k230/puf_fw/pufs_rt/pufs_rt_internal.h index d74dacfc6..1c5ec97b7 100755 --- a/src/little/uboot/arch/riscv/cpu/k230/puf_fw/pufs_rt/pufs_rt_internal.h +++ b/src/little/uboot/arch/riscv/cpu/k230/puf_fw/pufs_rt/pufs_rt_internal.h @@ -133,6 +133,7 @@ void pufs_ptr_ptc_ctrl(bool on); * @param[in] on Turn on/off deep-standby mode when true/false is specified. */ void rt_write_pdstb(bool on); +void puf_pgm_ign_ctrl(bool on); /** * @brief Read mode control * diff --git a/src/little/uboot/arch/riscv/dts/k230.dtsi b/src/little/uboot/arch/riscv/dts/k230.dtsi index 9d8735af4..8f3b80ee6 100755 --- a/src/little/uboot/arch/riscv/dts/k230.dtsi +++ b/src/little/uboot/arch/riscv/dts/k230.dtsi @@ -212,7 +212,9 @@ g-tx-fifo-size = <128 128 128 128 128 128>; dr_mode = "otg"; otg-rev = <0x200>; +#ifndef CONFIG_CMD_DFU status = "disabled"; +#endif }; usbotg1: usb-otg@91540000 { @@ -232,5 +234,45 @@ pinctrl-single,function-mask = <0xffffffff>; u-boot,dm-pre-reloc; }; + + pmu_iomux: pmu_iomux@91000080 { + compatible = "pinctrl-single"; + reg = <0x0 0x91000080 0x0 0x20>; + #pinctrl-cells = <1>; + pinctrl-single,register-width = <32>; + pinctrl-single,function-mask = <0xffffffff>; + status = "disabled"; + u-boot,dm-pre-reloc; + + pinctrl-names = "default"; + pinctrl-0 = <&pmu_pins>; + pmu_pins: pmu_pins { + u-boot,dm-pre-reloc; + pinctrl-single,pins = < + (IO64) ( PMU_IOSEL_INT<; + }; + }; + + pwm0: pwm@9140a000 { + compatible = "kendryte,pwm"; + reg = <0x0 0x9140a000 0x0 0x40>; + clocks = <&def_100mhz>; + status = "disabled"; + }; + + pwm1: pwm@9140a040 { + compatible = "kendryte,pwm"; + reg = <0x0 0x9140a040 0x0 0x40>; + clocks = <&def_100mhz>; + status = "disabled"; + }; }; }; diff --git a/src/little/uboot/arch/riscv/dts/k230_canmv.dts b/src/little/uboot/arch/riscv/dts/k230_canmv.dts index 6db3eed61..89c3ae8a0 100755 --- a/src/little/uboot/arch/riscv/dts/k230_canmv.dts +++ b/src/little/uboot/arch/riscv/dts/k230_canmv.dts @@ -43,6 +43,7 @@ reg = < 0x0 0x8000000 0x0 0x7fff000 /*MEM_LINUX_SYS*/ 0x0 0x200000 0x0 0x7dff000 /*MEM_RTT_SYS*/ + 0x0 0x10000000 0x0 0x10000000 >; }; }; @@ -88,9 +89,9 @@ // JP1-PIN12 PWM2/3/4 (IO7 ) ( 1< + +#define BANK_VOLTAGE_IO0_IO1 K230_MSC_1V8 // FIXED +#define BANK_VOLTAGE_IO2_IO13 K230_MSC_3V3 +#define BANK_VOLTAGE_IO14_IO25 K230_MSC_3V3 +#define BANK_VOLTAGE_IO26_IO37 K230_MSC_3V3 +#define BANK_VOLTAGE_IO38_IO49 K230_MSC_3V3 +#define BANK_VOLTAGE_IO50_IO61 K230_MSC_3V3 +#define BANK_VOLTAGE_IO62_IO63 K230_MSC_1V8 +#include "k230.dtsi" + +/ { + model = "kendryte k230 canmv 01studio"; + compatible = "kendryte,k230_canmv_01studio"; + + memory@0 { + device_type = "memory"; + reg = < + 0x0 0x8000000 0x0 0x7fff000 /*MEM_LINUX_SYS*/ + 0x0 0x200000 0x0 0x7dff000 /*MEM_RTT_SYS*/ + >; + }; +}; + +&mmc0 { + status = "okay"; +}; + +&iomux { + pinctrl-names = "default"; + pinctrl-0 = <&pins>; + +// Please pay attention to the bank voltage! will damage the chip. + pins: iomux_pins { + u-boot,dm-pre-reloc; + pinctrl-single,pins = < + + // S3 KEY + (IO0 ) ( 0< camera + (IO40) ( 2< camera + (IO41) ( 2< WIFI + (IO54) ( 2<; + }; +}; diff --git a/src/little/uboot/arch/riscv/dts/k230_canmv_v2.dts b/src/little/uboot/arch/riscv/dts/k230_canmv_v2.dts new file mode 100755 index 000000000..51e47ad4f --- /dev/null +++ b/src/little/uboot/arch/riscv/dts/k230_canmv_v2.dts @@ -0,0 +1,190 @@ +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/dts-v1/; +#include + +#define BANK_VOLTAGE_IO0_IO1 K230_MSC_1V8 // FIXED +#define BANK_VOLTAGE_IO2_IO13 K230_MSC_3V3 +#define BANK_VOLTAGE_IO14_IO25 K230_MSC_3V3 +#define BANK_VOLTAGE_IO26_IO37 K230_MSC_3V3 +#define BANK_VOLTAGE_IO38_IO49 K230_MSC_3V3 +#define BANK_VOLTAGE_IO50_IO61 K230_MSC_3V3 +#define BANK_VOLTAGE_IO62_IO63 K230_MSC_3V3 +#include "k230.dtsi" + +/ { + model = "kendryte k230 canmv v2"; + compatible = "kendryte,k230_canmv_v2"; + + memory@0 { + device_type = "memory"; + reg = < + 0x0 0x8000000 0x0 0x7fff000 /*MEM_LINUX_SYS*/ + 0x0 0x200000 0x0 0x7dff000 /*MEM_RTT_SYS*/ + >; + }; +}; + +&mmc0 { + status = "okay"; +}; + +&mmc1 { + status = "okay"; +}; + +&usbotg1 { + status = "okay"; +}; + +&iomux { + pinctrl-names = "default"; + pinctrl-0 = <&pins>; + +// Please pay attention to the bank voltage! will damage the chip. + pins: iomux_pins { + u-boot,dm-pre-reloc; + pinctrl-single,pins = < + + // SW3 + (IO0 ) ( 0< OV5647 + (IO13) ( 1< camera + (IO40) ( 2< camera + (IO41) ( 2< TFCARD + (IO54) ( 2<; + }; +}; diff --git a/src/little/uboot/arch/riscv/dts/k230_evb.dts b/src/little/uboot/arch/riscv/dts/k230_evb.dts index 9335428c4..1ba821042 100755 --- a/src/little/uboot/arch/riscv/dts/k230_evb.dts +++ b/src/little/uboot/arch/riscv/dts/k230_evb.dts @@ -37,3 +37,4 @@ >; }; }; + diff --git a/src/little/uboot/arch/riscv/dts/k230_evb.dtsi b/src/little/uboot/arch/riscv/dts/k230_evb.dtsi index 54e514be2..d4b67da44 100755 --- a/src/little/uboot/arch/riscv/dts/k230_evb.dtsi +++ b/src/little/uboot/arch/riscv/dts/k230_evb.dtsi @@ -146,12 +146,12 @@ (IO31) ( 0< TP (IO36) ( 1< CAM (IO48) ( 1< +#include +#include +#include //weak int mmc_get_env_dev(void) @@ -60,7 +63,9 @@ enum env_location arch_env_get_location(enum env_operation op, int prio) if(0 != prio){ return ENVL_UNKNOWN; } - +#ifdef CONFIG_ENV_IS_NOWHERE + return ENVL_NOWHERE; +#endif if(g_bootmod == SYSCTL_BOOT_NORFLASH){ return ENVL_SPI_FLASH; } @@ -117,9 +122,9 @@ static int k230_boot_prepare_args(int argc, char *const argv[], ulong buff, } *sys = BOOT_SYS_ADDR; return 0; - }else if (!strcmp(argv[1], "sd")) + }else if (!strcmp(argv[1], "sdio1")) *bootmod=SYSCTL_BOOT_SDIO1; - else if (!strcmp(argv[1], "emmc")) + else if (!strcmp(argv[1], "sdio0")) *bootmod=SYSCTL_BOOT_SDIO0; else if (!strcmp(argv[1], "spinor")) *bootmod=SYSCTL_BOOT_NORFLASH; @@ -184,7 +189,7 @@ static int do_k230_boot(struct cmd_tbl *cmdtp, int flag, int argc, return ret; } -#define K230_BOOT_HELP " [len]\n" \ +#define K230_BOOT_HELP " [len]\n" \ "qbc---quick boot cfg\n" \ "fdb---face database\n" \ "sensor---sensor cfg\n" \ @@ -194,7 +199,7 @@ static int do_k230_boot(struct cmd_tbl *cmdtp, int flag, int argc, "auto_boot---auto boot\n" \ "uboot---boot uboot\n" /* -boot sd/mmc/spinor/spinand/mem add +boot sdio1/sdio0/spinor/spinand/mem add k230_boot auto rtt ;k230_boot auto linux; 先实现从sd启动吧; */ @@ -205,6 +210,155 @@ U_BOOT_CMD_COMPLETE( ); #endif +#ifndef CONFIG_SPL_BUILD +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +typedef enum kburnUsbIspCommandTaget +{ + KBURN_USB_ISP_SDIO0 = 0x00, + KBURN_USB_ISP_SDIO1 = 0x01, + KBURN_USB_ISP_NAND = 0x02, + KBURN_USB_ISP_NOR = 0x03, +} kburnUsbIspCommandTaget; + +struct BurnImageConfigItem { + uint32_t address; + uint32_t size; + char altName[32]; +}; + +struct BurnImageConfig { + uint32_t cfgMagic; + uint32_t cfgTarget; + uint32_t cfgCount; + uint32_t cfgCrc32; + struct BurnImageConfigItem cfgs[0]; +}; + +static int do_k230_dfu(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) +{ + char alt_info[1024]; + int alt_info_len = 0; + + struct BurnImageConfig *cfg = NULL; + struct BurnImageConfig *cfgOrig = (struct BurnImageConfig *)0x80250000; + uint32_t cfgMagic = readl((volatile void *)&cfgOrig->cfgMagic); + uint32_t cfgCount = readl((volatile void *)&cfgOrig->cfgCount); + + if(MAGIC_NUM == cfgMagic && (20 > cfgCount)) { + uint32_t size = sizeof(struct BurnImageConfig) + cfgCount * sizeof(struct BurnImageConfigItem); + + cfg = (struct BurnImageConfig *)malloc(size); + if(NULL == cfg) { + free(cfg); + printf("malloc failed\n"); + return -1; + } + + uint32_t *pDst = (uint32_t *)cfg; + uint32_t *pSrc = (uint32_t *)0x80250000; + + for(int i = 0; i < (size / 4); i++) { + pDst[i] = readl((volatile void *)(pSrc + i)); + } + + uint32_t crc = crc32(0, (const unsigned char *)&cfg->cfgs[0], cfg->cfgCount * sizeof(struct BurnImageConfigItem)); + if(cfg->cfgCrc32 != crc) { + free(cfg); + printf("invaild cfg crc32 %x != %x\n", cfg->cfgCrc32, crc); + return -1; + } + /* + "#dfu_alt_info=mmc raw 0 2097152 \0" \ + "#bootcmd=dfu 0 mmc 0 \0" \ + "#dfu_alt_info=sf raw 0 2000000 \0" \ + "#bootcmd=dfu 0 sf 0:0 \0" \ + */ + int sector = 1; + char *pInfo = &alt_info[0]; + + switch (cfg->cfgTarget) + { + case KBURN_USB_ISP_SDIO0: + sector = 512; + alt_info_len = sprintf(pInfo, "%s", "mmc 0="); + pInfo += alt_info_len; + break; + case KBURN_USB_ISP_SDIO1: + sector = 512; + alt_info_len = sprintf(pInfo, "%s", "mmc 1="); + pInfo += alt_info_len; + break; + case KBURN_USB_ISP_NAND: + alt_info_len = sprintf(pInfo, "%s", "mtd spi-nand0="); + pInfo += alt_info_len; + break; + case KBURN_USB_ISP_NOR: + alt_info_len = sprintf(pInfo, "%s", "sf 0:0:50000000:0="); + pInfo += alt_info_len; + break; + default: + break; + } + bool has_firmware = false; + for(int i = 0; i < cfg->cfgCount; i++) { + struct BurnImageConfigItem *item = (struct BurnImageConfigItem *)&cfg->cfgs[i]; + + printf("item %d, address %x, size %x, altName %s\n", i, item->address, item->size, item->altName); + if(!strcmp(item->altName, "otp")) continue; + if(!strcmp(item->altName, "otp_lock")) continue; + if(!strcmp(item->altName, "cde")) continue; + if(!strcmp(item->altName, "cde_lock")) continue; + has_firmware = true; + alt_info_len = sprintf(pInfo, "%s raw 0x%x 0x%x", item->altName, item->address / sector, (item->size+sector-1) / sector); + pInfo += alt_info_len; + // if(i != (cfg->cfgCount - 1)) + { + pInfo[0] = ';'; + pInfo ++; + } + } + if(has_firmware) + { + pInfo[-1] = '&'; + } + else { + pInfo = &alt_info[0]; + } + sprintf(pInfo, "%s", "virt 0=otp&virt 1=otp_lock&virt 2=cde&virt 3=cde_lock"); + + printf("alt_info \'%s\'\n", alt_info); + + env_set("dfu_alt_info", alt_info); + + switch (cfg->cfgTarget) + { + case KBURN_USB_ISP_NAND: + run_command("mtd list;dfu 0", 0); + break; + case KBURN_USB_ISP_SDIO0: + case KBURN_USB_ISP_SDIO1: + case KBURN_USB_ISP_NOR: + run_command("dfu 0", 0); + break; + default: + break; + } + } else { + printf("invaild cfg maigc %x != %x, or cfgCount %d > 20\n", cfgMagic, MAGIC_NUM, cfgCount); + return -1; + } + + return 0; +} + +U_BOOT_CMD( + k230_dfu, CONFIG_SYS_MAXARGS, 0, do_k230_dfu, + "k230 burntool enter dfu", + "k230 burntool enter dfu" +); +#endif \ No newline at end of file diff --git a/src/little/uboot/board/canaan/common/k230_board_common.h b/src/little/uboot/board/canaan/common/k230_board_common.h index 09c0c84f1..050eeef3d 100755 --- a/src/little/uboot/board/canaan/common/k230_board_common.h +++ b/src/little/uboot/board/canaan/common/k230_board_common.h @@ -94,12 +94,15 @@ typedef enum _en___boot_type{ #define BLKSZ 512 #define HD_BLK_NUM DIV_ROUND_UP(sizeof(firmware_head_s), BLKSZ) +#define UBOOT_SYS_IN_IMG_OFF_SEC (2*1024*1024/BLKSZ) #define RTT_SYS_IN_IMG_OFF_SEC (10*1024*1024/BLKSZ) #define LINUX_SYS_IN_IMG_OFF_SEC (30*1024*1024/BLKSZ) +#define UBOOT_SYS_IN_SPI_NOR_OFF 0x80000 #define RTT_SYS_IN_SPI_NOR_OFF CONFIG_SPI_NOR_RTTK_BASE #define LINUX_SYS_IN_SPI_NOR_OFF CONFIG_MEM_LINUX_SYS_BASE +#define UBOOT_SYS_IN_SPI_NAND_OFF 0x80000 #define LINUX_SYS_IN_SPI_NAND_OFF 0x00a00000 #define RTT_SYS_IN_SPI_NAND_OFF 0x00200000 diff --git a/src/little/uboot/board/canaan/common/k230_img.c b/src/little/uboot/board/canaan/common/k230_img.c index 4c0f692e5..400af7b5a 100755 --- a/src/little/uboot/board/canaan/common/k230_img.c +++ b/src/little/uboot/board/canaan/common/k230_img.c @@ -270,7 +270,12 @@ static int k230_boot_uboot_uimage(image_header_t *pUh) //do_timeinfo(0,0,0,0); #if defined(CONFIG_LINUX_RUN_CORE_ID) && (CONFIG_LINUX_RUN_CORE_ID == 1) de_reset_big_core(image_get_load(pUh)); - while(1) udelay(100); + + while(1) + { + asm volatile("wfi"); + } + #endif uboot(0, (void*)OPENSBI_DTB_ADDR); } @@ -496,7 +501,7 @@ __weak ulong get_blk_start_by_boot_firmre_type(en_boot_sys_t sys) blk_s = RTT_SYS_IN_IMG_OFF_SEC; break; case BOOT_SYS_UBOOT: - blk_s = CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR; + blk_s = UBOOT_SYS_IN_IMG_OFF_SEC; break; default:break; } @@ -595,7 +600,7 @@ __weak ulong get_flash_offset_by_boot_firmre_type(en_boot_sys_t sys) #endif break; case BOOT_SYS_UBOOT: - offset = CONFIG_SYS_SPI_U_BOOT_OFFS; + offset = UBOOT_SYS_IN_SPI_NOR_OFF; break; default:break; } @@ -654,7 +659,7 @@ __weak ulong get_nand_start_by_boot_firmre_type(en_boot_sys_t sys) blk_s = RTT_SYS_IN_SPI_NAND_OFF; break; case BOOT_SYS_UBOOT: - blk_s = CONFIG_SYS_SPI_U_BOOT_OFFS; + blk_s = UBOOT_SYS_IN_SPI_NAND_OFF; break; default:break; } @@ -792,7 +797,12 @@ __weak int k230_img_load_boot_sys_auot_boot(en_boot_sys_t sys) #if defined(CONFIG_SUPPORT_RTSMART) && !defined(CONFIG_SUPPORT_LINUX) if(ret == 0) - while(1) udelay(100); + { + while(1) + { + asm volatile("wfi"); + } + } #endif diff --git a/src/little/uboot/board/canaan/k230_canmv/board.c b/src/little/uboot/board/canaan/k230_canmv/board.c index 59b75cf95..860fa7b88 100644 --- a/src/little/uboot/board/canaan/k230_canmv/board.c +++ b/src/little/uboot/board/canaan/k230_canmv/board.c @@ -22,6 +22,7 @@ // #include "k230_board_common.h" #include #include +#include sysctl_boot_mode_e sysctl_boot_get_boot_mode(void) { @@ -31,18 +32,37 @@ sysctl_boot_mode_e sysctl_boot_get_boot_mode(void) #ifdef CONFIG_BOARD_LATE_INIT int board_late_init(void) { - u32 wifi_regon_gpio1_dir = readl((void*)(GPIO_BASE_ADDR0 + 0x4)); - wifi_regon_gpio1_dir |= 1 << 1; - writel(wifi_regon_gpio1_dir, (void*)(GPIO_BASE_ADDR0 + 0x4)); + ofnode node; + + node = ofnode_by_compatible(ofnode_null(), "kendryte,k230_canmv_v2"); + if (ofnode_valid(node)) { +#define SDHCI_EMMC_BASE 0x91580000 +#define SDHCI_EMMC_CTRL_R 0x52C +#define EMMC_RST_N_OE 3 +#define EMMC_RST_N 2 + u32 wifi_regon_ctrl = readl((void*)(SDHCI_EMMC_BASE + SDHCI_EMMC_CTRL_R)); + wifi_regon_ctrl |= (1< WIFI REGON + u32 wifi_regon_gpio1_data = readl((void*)(GPIO_BASE_ADDR0 + 0x0)); + wifi_regon_gpio1_data &= ~(1 << 1); + writel(wifi_regon_gpio1_data, (void*)(GPIO_BASE_ADDR0 + 0x0)); + mdelay(10); + // reset gpio1 -> WIFI REGON + wifi_regon_gpio1_data |= 1 << 1; + writel(wifi_regon_gpio1_data, (void*)(GPIO_BASE_ADDR0 + 0x0)); + } - // reset gpio1 -> WIFI REGON - u32 wifi_regon_gpio1_data = readl((void*)(GPIO_BASE_ADDR0 + 0x0)); - wifi_regon_gpio1_data &= ~(1 << 1); - writel(wifi_regon_gpio1_data, (void*)(GPIO_BASE_ADDR0 + 0x0)); - mdelay(10); - // reset gpio1 -> WIFI REGON - wifi_regon_gpio1_data |= 1 << 1; - writel(wifi_regon_gpio1_data, (void*)(GPIO_BASE_ADDR0 + 0x0)); return 0; } #endif diff --git a/src/little/uboot/board/canaan/k230_canmv_01studio/Kconfig b/src/little/uboot/board/canaan/k230_canmv_01studio/Kconfig new file mode 100755 index 000000000..731275e78 --- /dev/null +++ b/src/little/uboot/board/canaan/k230_canmv_01studio/Kconfig @@ -0,0 +1,30 @@ +if TARGET_K230_CANMV_01STUDIO + +config SYS_CPU + default "k230" + +config SYS_VENDOR + default "canaan" + +config SYS_BOARD + default "k230_canmv_01studio" + +config SYS_CONFIG_NAME + default "k230_evb" + + +config BOARD_SPECIFIC_OPTIONS # dummy + def_bool y + select RISCV_THEAD +choice + prompt "ddr typy freq" + default CANMV_01STUDIO_LPDDR3_2133 + +config CANMV_01STUDIO_LPDDR3_2133 + bool 2133 +config CANMV_01STUDIO_LPDDR3_1600 + bool 1600 +config CANMV_01STUDIO_LPDDR3_800 + bool 800 +endchoice +endif diff --git a/src/little/uboot/board/canaan/k230_canmv_01studio/Makefile b/src/little/uboot/board/canaan/k230_canmv_01studio/Makefile new file mode 100755 index 000000000..ebafb87b7 --- /dev/null +++ b/src/little/uboot/board/canaan/k230_canmv_01studio/Makefile @@ -0,0 +1,51 @@ +# /* Copyright (c) 2023, Canaan Bright Sight Co., Ltd +# * +# * Redistribution and use in source and binary forms, with or without +# * modification, are permitted provided that the following conditions are met: +# * 1. Redistributions of source code must retain the above copyright +# * notice, this list of conditions and the following disclaimer. +# * 2. Redistributions in binary form must reproduce the above copyright +# * notice, this list of conditions and the following disclaimer in the +# * documentation and/or other materials provided with the distribution. +# * +# * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND +# * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +# * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +# * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# */ + +obj-y += board.o + +obj-$(CONFIG_CANMV_01STUDIO_LPDDR3_2133) += gen_canmv_01studio_lpddr3_2133.o +obj-$(CONFIG_CANMV_01STUDIO_LPDDR3_1600) += gen_canmv_01studio_lpddr3_1600.o +obj-$(CONFIG_CANMV_01STUDIO_LPDDR3_800) += gen_canmv_01studio_lpddr3_800.o + +$(obj)/gen_canmv_01studio_lpddr3_2133.c: $(src)/canmv_01studio_ddr_init_2133.c $(srctree)/arch/riscv/cpu/k230/ddr.sh + ($(srctree)/arch/riscv/cpu/k230/ddr.sh $< $@ 0x50000 0x53fff 0x54000 0x54359 || exit 1) +$(obj)/gen_canmv_01studio_lpddr3_1600.c: $(src)/canmv_01studio_ddr_init_1600.c $(srctree)/arch/riscv/cpu/k230/ddr.sh + ($(srctree)/arch/riscv/cpu/k230/ddr.sh $< $@ 0x50000 0x53fff 0x54000 0x54359 || exit 1) #cp $< $@ +$(obj)/gen_canmv_01studio_lpddr3_800.c: $(src)/canmv_01studio_ddr_init_800.c $(srctree)/arch/riscv/cpu/k230/ddr.sh + ($(srctree)/arch/riscv/cpu/k230/ddr.sh $< $@ 0x50000 0x53fff 0x54000 0x54359 || exit 1) + +EXTRA_CFLAGS += -I$(srctree)/arch/$(ARCH)/cpu/k230/ +EXTRA_CFLAGS += -I$(srctree)/arch/$(ARCH)/cpu/k230/puf_fw/pufs_common +EXTRA_CFLAGS += -I$(srctree)/arch/$(ARCH)/cpu/k230/puf_fw/pufs_crypto +EXTRA_CFLAGS += -I$(srctree)/arch/$(ARCH)/cpu/k230/puf_fw/pufs_dma +EXTRA_CFLAGS += -I$(srctree)/arch/$(ARCH)/cpu/k230/puf_fw/pufs_ka +EXTRA_CFLAGS += -I$(srctree)/arch/$(ARCH)/cpu/k230/puf_fw/pufs_rt +EXTRA_CFLAGS += -I$(srctree)/arch/$(ARCH)/cpu/k230/puf_fw/pufs_ecc +EXTRA_CFLAGS += -I$(srctree)/arch/$(ARCH)/cpu/k230/puf_fw/pufs_hmac +EXTRA_CFLAGS += -I$(srctree)/arch/$(ARCH)/cpu/k230/puf_fw/pufs_ecp +EXTRA_CFLAGS += -I$(srctree)/arch/$(ARCH)/cpu/k230/puf_fw/pufs_sm2 +EXTRA_CFLAGS += -I$(srctree)/arch/$(ARCH)/cpu/k230/puf_fw/pufs_sp38a +EXTRA_CFLAGS += -I$(srctree)/arch/$(ARCH)/cpu/k230/puf_fw/pufs_sp38d + diff --git a/src/little/uboot/board/canaan/k230_canmv_01studio/board.c b/src/little/uboot/board/canaan/k230_canmv_01studio/board.c new file mode 100755 index 000000000..3a953e5ef --- /dev/null +++ b/src/little/uboot/board/canaan/k230_canmv_01studio/board.c @@ -0,0 +1,57 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "sysctl.h" + +#include +#include +#include +#include "pufs_sm2.h" +#include +#include +#include +// #include "sdk_autoconf.h" +// #include "k230_board_common.h" +#include +#include + +int ddr_init_training(void) +{ + #if defined(CONFIG_TARGET_K230_FPGA) + return 0; //fpga not need init; + #endif + if( (readl((const volatile void __iomem *)0x980001bcULL) & 0x1 ) != 0 ){ + return 0; //have init ,not need reinit; + } + #ifdef CONFIG_LPDDR3_800 + printf("CONFIG_LPDDR3_800 \n"); + ddr_init_800(); + #elif defined(CONFIG_CANMV_01STUDIO_LPDDR3_2133) + canmv_01studio_ddr_init_2133(); + #elif defined(CONFIG_CANMV_01STUDIO_LPDDR3_1600) + canmv_01studio_ddr_init_1600(); + #elif defined(CONFIG_CANMV_01STUDIO_LPDDR3_800) + canmv_01studio_ddr_init_800(); + #endif + return 0; +} +sysctl_boot_mode_e sysctl_boot_get_boot_mode(void) +{ + return SYSCTL_BOOT_SDIO0; +} + +#ifdef CONFIG_BOARD_LATE_INIT +int board_late_init(void) +{ + + return 0; +} +#endif diff --git a/src/little/uboot/board/canaan/k230_canmv_01studio/canmv_01studio_ddr_init_1600.c b/src/little/uboot/board/canaan/k230_canmv_01studio/canmv_01studio_ddr_init_1600.c new file mode 100755 index 000000000..701229e82 --- /dev/null +++ b/src/little/uboot/board/canaan/k230_canmv_01studio/canmv_01studio_ddr_init_1600.c @@ -0,0 +1,18422 @@ +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include +#include +//#include +//#include +#define DDR_REG_BASE 0x98000000 +//with odt +#define reg_write( addr,v) \ + { \ + (*(volatile uint32_t *)((size_t)(addr))) = (v); \ + } + + +#define reg_read( addr,v) \ + { \ + v =readl ((const volatile void __iomem *) addr ); \ + } + +void canmv_01studio_ddr_init_1600() +{ +int data; +int train_data=0; + +printf("ddr 1600 with odt date %s\n", __func__); + + reg_read (0x91100060,data); + data =data & 0xfffffffc; + data =data | 0x400; + data =data | 0x80000000; + reg_write(0x91100060,data); + + +reg_write( DDR_REG_BASE + 0x00000304 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x00000030 , 0x00000001 ); +reg_read ( DDR_REG_BASE + 0x00000004 , data); +reg_write( DDR_REG_BASE + 0x00000000 , 0x01040008 ); +reg_write( DDR_REG_BASE + 0x00000010 , 0x0000e030 ); +reg_write( DDR_REG_BASE + 0x00000014 , 0x00007563 ); +reg_write( DDR_REG_BASE + 0x00000020 , 0x00001100 ); +reg_write( DDR_REG_BASE + 0x00000024 , 0xb4b04b13 ); +reg_write( DDR_REG_BASE + 0x00000028 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x0000002c , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00000030 , 0x00000020 ); +reg_write( DDR_REG_BASE + 0x00000034 , 0x00405f04 ); +reg_write( DDR_REG_BASE + 0x00000038 , 0x00a80002 ); +reg_write( DDR_REG_BASE + 0x0000003c , 0x00010050 ); +reg_write( DDR_REG_BASE + 0x00000050 , 0x90210000 ); +reg_write( DDR_REG_BASE + 0x00000054 , 0x002c0027 ); +reg_write( DDR_REG_BASE + 0x00000060 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x00000064 , 0x00300034 ); +reg_write( DDR_REG_BASE + 0x00000068 , 0x005b0000 ); +reg_write( DDR_REG_BASE + 0x000000c0 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000000d0 , 0xc0020002 ); +reg_write( DDR_REG_BASE + 0x000000d4 , 0x00010002 ); +reg_write( DDR_REG_BASE + 0x000000d8 , 0x00000d00 ); +reg_write( DDR_REG_BASE + 0x000000dc , 0x0043001a ); +reg_write( DDR_REG_BASE + 0x000000e0 , 0x00020000 ); +reg_write( DDR_REG_BASE + 0x000000e4 , 0x000e0005 ); +reg_write( DDR_REG_BASE + 0x000000e8 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000000ec , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000000f0 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000000f4 , 0x0000023f ); +reg_write( DDR_REG_BASE + 0x000000f8 , 0x00000002 ); +reg_write( DDR_REG_BASE + 0x00000100 , 0x0b141a11 ); +reg_write( DDR_REG_BASE + 0x00000104 , 0x0003031a ); +reg_write( DDR_REG_BASE + 0x00000108 , 0x03060809 ); +reg_write( DDR_REG_BASE + 0x0000010c , 0x00506006 ); +reg_write( DDR_REG_BASE + 0x00000110 , 0x08020408 ); +reg_write( DDR_REG_BASE + 0x00000114 , 0x01010606 ); +reg_write( DDR_REG_BASE + 0x00000118 , 0x01010004 ); +reg_write( DDR_REG_BASE + 0x0000011c , 0x00000101 ); +reg_write( DDR_REG_BASE + 0x00000120 , 0x00000101 ); +reg_write( DDR_REG_BASE + 0x00000130 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00000134 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00000138 , 0x00000038 ); +reg_write( DDR_REG_BASE + 0x0000013c , 0x80000000 ); +reg_write( DDR_REG_BASE + 0x00000144 , 0x00000094 ); +reg_write( DDR_REG_BASE + 0x00000180 , 0xe0900024 ); +reg_write( DDR_REG_BASE + 0x00000184 , 0x0140c892 ); +reg_write( DDR_REG_BASE + 0x00000188 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00000190 , 0x03878202 ); +reg_write( DDR_REG_BASE + 0x00000194 , 0x00070202 ); +reg_write( DDR_REG_BASE + 0x00000198 , 0x07a09110 ); +reg_write( DDR_REG_BASE + 0x000001a0 , 0xa0400018 ); +reg_write( DDR_REG_BASE + 0x000001a4 , 0x00760085 ); +reg_write( DDR_REG_BASE + 0x000001a8 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000001b0 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000001b4 , 0x00000702 ); +reg_write( DDR_REG_BASE + 0x000001c0 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000001c4 , 0x85000000 ); +#if 0 +reg_write( DDR_REG_BASE + 0x00000200 , 0x0000001f ); +reg_write( DDR_REG_BASE + 0x00000204 , 0x00090909 ); +reg_write( DDR_REG_BASE + 0x00000208 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x0000020c , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00000210 , 0x00001f00 ); +reg_write( DDR_REG_BASE + 0x00000214 , 0x080f0808 ); +reg_write( DDR_REG_BASE + 0x00000218 , 0x0f0f0808 ); +reg_write( DDR_REG_BASE + 0x0000021c , 0x00000f0f ); +reg_write( DDR_REG_BASE + 0x00000224 , 0x08080808 ); +reg_write( DDR_REG_BASE + 0x00000228 , 0x08080808 ); +reg_write( DDR_REG_BASE + 0x0000022c , 0x00000008 ); +#else +reg_write( DDR_REG_BASE + 0x00000200 , 0x0000001f ); +reg_write( DDR_REG_BASE + 0x00000204 , 0x00080808 ); +reg_write( DDR_REG_BASE + 0x00000208 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x0000020c , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00000210 , 0x00001f1f ); +reg_write( DDR_REG_BASE + 0x00000214 , 0x070f0707 ); +reg_write( DDR_REG_BASE + 0x00000218 , 0x0f0f0707 ); +reg_write( DDR_REG_BASE + 0x0000021c , 0x00000f0f ); +reg_write( DDR_REG_BASE + 0x00000224 , 0x07070707 ); +reg_write( DDR_REG_BASE + 0x00000228 , 0x07070707 ); +reg_write( DDR_REG_BASE + 0x0000022c , 0x00000007 ); +#endif +reg_write( DDR_REG_BASE + 0x00000240 , 0x06030924 ); +reg_write( DDR_REG_BASE + 0x00000244 , 0x00002301 ); +reg_write( DDR_REG_BASE + 0x00000250 , 0x80c31f18 ); +reg_write( DDR_REG_BASE + 0x00000254 , 0x00002000 ); +reg_write( DDR_REG_BASE + 0x0000025c , 0x0f000001 ); +reg_write( DDR_REG_BASE + 0x00000264 , 0x0f00007f ); +reg_write( DDR_REG_BASE + 0x0000026c , 0x0f00007f ); +reg_write( DDR_REG_BASE + 0x00000270 , 0x04040208 ); +reg_write( DDR_REG_BASE + 0x00000274 , 0x08400810 ); +reg_write( DDR_REG_BASE + 0x00000300 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00000304 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x0000030c , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00000320 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x00000328 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x0000036c , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00000490 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x00000540 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000005f0 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000006a0 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x00000750 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x00002020 , 0x00001100 ); +reg_write( DDR_REG_BASE + 0x00002024 , 0xb4b04b13 ); +reg_write( DDR_REG_BASE + 0x00002034 , 0x00405f04 ); +reg_write( DDR_REG_BASE + 0x00002050 , 0x30210000 ); +reg_write( DDR_REG_BASE + 0x00002064 , 0x00300034 ); +reg_write( DDR_REG_BASE + 0x00002068 , 0x005b0000 ); +reg_write( DDR_REG_BASE + 0x000020dc , 0x0043001a ); +reg_write( DDR_REG_BASE + 0x000020e0 , 0x00020000 ); +reg_write( DDR_REG_BASE + 0x000020e8 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000020ec , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000020f4 , 0x0000023f ); +reg_write( DDR_REG_BASE + 0x000020f8 , 0x00000002 ); +reg_write( DDR_REG_BASE + 0x00002100 , 0x0b141a11 ); +reg_write( DDR_REG_BASE + 0x00002104 , 0x0003031a ); +reg_write( DDR_REG_BASE + 0x00002108 , 0x03060809 ); +reg_write( DDR_REG_BASE + 0x0000210c , 0x00506006 ); +reg_write( DDR_REG_BASE + 0x00002110 , 0x08020408 ); +reg_write( DDR_REG_BASE + 0x00002114 , 0x01010606 ); +reg_write( DDR_REG_BASE + 0x00002118 , 0x01010004 ); +reg_write( DDR_REG_BASE + 0x0000211c , 0x00000101 ); +reg_write( DDR_REG_BASE + 0x00002120 , 0x00000101 ); +reg_write( DDR_REG_BASE + 0x00002130 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00002134 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00002138 , 0x00000038 ); +reg_write( DDR_REG_BASE + 0x0000213c , 0x80000000 ); +reg_write( DDR_REG_BASE + 0x00002144 , 0x00000094 ); +reg_write( DDR_REG_BASE + 0x00002180 , 0xe0900024 ); +reg_write( DDR_REG_BASE + 0x00002190 , 0x03878202 ); +reg_write( DDR_REG_BASE + 0x00002194 , 0x00070202 ); +reg_write( DDR_REG_BASE + 0x000021b4 , 0x00000702 ); +reg_write( DDR_REG_BASE + 0x00002240 , 0x06030924 ); +reg_write( DDR_REG_BASE + 0x00003020 , 0x00001100 ); +reg_write( DDR_REG_BASE + 0x00003024 , 0xb4b04b13 ); +reg_write( DDR_REG_BASE + 0x00003034 , 0x00405f04 ); +reg_write( DDR_REG_BASE + 0x00003050 , 0xc0210000 ); +reg_write( DDR_REG_BASE + 0x00003064 , 0x00300034 ); +reg_write( DDR_REG_BASE + 0x00003068 , 0x005b0000 ); +reg_write( DDR_REG_BASE + 0x000030dc , 0x0043001a ); +reg_write( DDR_REG_BASE + 0x000030e0 , 0x00020000 ); +reg_write( DDR_REG_BASE + 0x000030e8 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000030ec , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000030f4 , 0x0000023f ); +reg_write( DDR_REG_BASE + 0x000030f8 , 0x00000002 ); +reg_write( DDR_REG_BASE + 0x00003100 , 0x0b141a11 ); +reg_write( DDR_REG_BASE + 0x00003104 , 0x0003031a ); +reg_write( DDR_REG_BASE + 0x00003108 , 0x03060809 ); +reg_write( DDR_REG_BASE + 0x0000310c , 0x00506006 ); +reg_write( DDR_REG_BASE + 0x00003110 , 0x08020408 ); +reg_write( DDR_REG_BASE + 0x00003114 , 0x01010606 ); +reg_write( DDR_REG_BASE + 0x00003118 , 0x01010004 ); +reg_write( DDR_REG_BASE + 0x0000311c , 0x00000101 ); +reg_write( DDR_REG_BASE + 0x00003120 , 0x00000101 ); +reg_write( DDR_REG_BASE + 0x00003130 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00003134 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00003138 , 0x00000038 ); +reg_write( DDR_REG_BASE + 0x0000313c , 0x80000000 ); +reg_write( DDR_REG_BASE + 0x00003144 , 0x00000094 ); +reg_write( DDR_REG_BASE + 0x00003180 , 0xe0900024 ); +reg_write( DDR_REG_BASE + 0x00003190 , 0x03878202 ); +reg_write( DDR_REG_BASE + 0x00003194 , 0x00070202 ); +reg_write( DDR_REG_BASE + 0x000031b4 , 0x00000702 ); +reg_write( DDR_REG_BASE + 0x00003240 , 0x06030924 ); +reg_write( DDR_REG_BASE + 0x00004020 , 0x00001100 ); +reg_write( DDR_REG_BASE + 0x00004024 , 0xb4b04b13 ); +reg_write( DDR_REG_BASE + 0x00004034 , 0x00405f04 ); +reg_write( DDR_REG_BASE + 0x00004050 , 0xa8210000 ); +reg_write( DDR_REG_BASE + 0x00004064 , 0x00308034 ); +reg_write( DDR_REG_BASE + 0x00004068 , 0x005b0000 ); +reg_write( DDR_REG_BASE + 0x000040dc , 0x0043001a ); +reg_write( DDR_REG_BASE + 0x000040e0 , 0x00020000 ); +reg_write( DDR_REG_BASE + 0x000040e8 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000040ec , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000040f4 , 0x0000023f ); +reg_write( DDR_REG_BASE + 0x000040f8 , 0x00000002 ); +reg_write( DDR_REG_BASE + 0x00004100 , 0x0b141a11 ); +reg_write( DDR_REG_BASE + 0x00004104 , 0x0003031a ); +reg_write( DDR_REG_BASE + 0x00004108 , 0x03060809 ); +reg_write( DDR_REG_BASE + 0x0000410c , 0x00506006 ); +reg_write( DDR_REG_BASE + 0x00004110 , 0x08020408 ); +reg_write( DDR_REG_BASE + 0x00004114 , 0x01010606 ); +reg_write( DDR_REG_BASE + 0x00004118 , 0x01010004 ); +reg_write( DDR_REG_BASE + 0x0000411c , 0x00000101 ); +reg_write( DDR_REG_BASE + 0x00004120 , 0x00000101 ); +reg_write( DDR_REG_BASE + 0x00004130 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00004134 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00004138 , 0x00000038 ); +reg_write( DDR_REG_BASE + 0x0000413c , 0x80000000 ); +reg_write( DDR_REG_BASE + 0x00004144 , 0x00000094 ); +reg_write( DDR_REG_BASE + 0x00004180 , 0xe0900024 ); +reg_write( DDR_REG_BASE + 0x00004190 , 0x03878202 ); +reg_write( DDR_REG_BASE + 0x00004194 , 0x00070202 ); +reg_write( DDR_REG_BASE + 0x000041b4 , 0x00000702 ); +reg_write( DDR_REG_BASE + 0x00004240 , 0x06030924 ); +reg_read ( DDR_REG_BASE + 0x00000060 , data); +reg_write( DDR_REG_BASE + 0x00000400 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00000404 , 0x0000400f ); +reg_write( DDR_REG_BASE + 0x000004b4 , 0x0000400f ); +reg_write( DDR_REG_BASE + 0x00000564 , 0x0000400f ); +reg_write( DDR_REG_BASE + 0x00000614 , 0x0000400f ); +reg_write( DDR_REG_BASE + 0x000006c4 , 0x0000400f ); +reg_write( DDR_REG_BASE + 0x00000404 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x000004b4 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x00000564 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x00000614 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x000006c4 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x00000404 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x000004b4 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x00000564 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x00000614 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x000006c4 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x00000404 , 0x0000100f ); +reg_write( DDR_REG_BASE + 0x000004b4 , 0x0000100f ); +reg_write( DDR_REG_BASE + 0x00000564 , 0x0000100f ); +reg_write( DDR_REG_BASE + 0x00000614 , 0x0000100f ); +reg_write( DDR_REG_BASE + 0x000006c4 , 0x0000100f ); +reg_write( DDR_REG_BASE + 0x00000408 , 0x0000400f ); +reg_write( DDR_REG_BASE + 0x000004b8 , 0x0000400f ); +reg_write( DDR_REG_BASE + 0x00000568 , 0x0000400f ); +reg_write( DDR_REG_BASE + 0x00000618 , 0x0000400f ); +reg_write( DDR_REG_BASE + 0x000006c8 , 0x0000400f ); +reg_write( DDR_REG_BASE + 0x00000408 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x000004b8 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x00000568 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x00000618 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x000006c8 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x00000408 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x000004b8 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x00000568 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x00000618 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x000006c8 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x00000408 , 0x0000100f ); +reg_write( DDR_REG_BASE + 0x000004b8 , 0x0000100f ); +reg_write( DDR_REG_BASE + 0x00000568 , 0x0000100f ); +reg_write( DDR_REG_BASE + 0x00000618 , 0x0000100f ); +reg_write( DDR_REG_BASE + 0x000006c8 , 0x0000100f ); +reg_read ( DDR_REG_BASE + 0x00000030 , data); +reg_write( DDR_REG_BASE + 0x00000030 , 0x00000020 ); + + +reg_read ( 0x9110309c, data ); + data=data|0x00020000; +reg_write ( 0x9110309c, data ); + + + + + +reg_write( DDR_REG_BASE + 0x00000304 , 0x00000000 ); +reg_read ( DDR_REG_BASE + 0x00000030 , data); +reg_write( DDR_REG_BASE + 0x00000030 , 0x00000020 ); +reg_read ( DDR_REG_BASE + 0x00000030 , data ); +reg_write( DDR_REG_BASE + 0x00000030 , 0x00000020 ); +reg_read ( DDR_REG_BASE + 0x000001c4 , data); +reg_write( DDR_REG_BASE + 0x000001c4 , 0x85000000 ); +reg_write( DDR_REG_BASE + 0x00000320 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000001b0 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000001b0 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00000304 , 0x00000002 ); +reg_read ( DDR_REG_BASE + 0x000000d0 , data); +reg_read ( DDR_REG_BASE + 0x000001c0 , data); +reg_read ( DDR_REG_BASE + 0x00000000 , data); +reg_read ( DDR_REG_BASE + 0x000000dc , data); +reg_read ( DDR_REG_BASE + 0x000000dc , data); +reg_read ( DDR_REG_BASE + 0x000000e0 , data); +reg_read ( DDR_REG_BASE + 0x000000d0 , data); +reg_read ( DDR_REG_BASE + 0x000001c0 , data); +reg_read ( DDR_REG_BASE + 0x00000000 , data); +reg_read ( DDR_REG_BASE + 0x000000dc , data); +reg_read ( DDR_REG_BASE + 0x000000dc , data); +reg_read ( DDR_REG_BASE + 0x000000e0 , data); +reg_read ( DDR_REG_BASE + 0x000000d0 , data); + +/////////////////////////////phy init begin///////////////////// + +reg_write( DDR_REG_BASE + 0x1005f*4+0x02000000,0x2ff); +reg_write( DDR_REG_BASE + 0x1015f*4+0x02000000,0x2ff); +reg_write( DDR_REG_BASE + 0x1105f*4+0x02000000,0x2ff); +reg_write( DDR_REG_BASE + 0x1115f*4+0x02000000,0x2ff); +reg_write( DDR_REG_BASE + 0x1205f*4+0x02000000,0x2ff); +reg_write( DDR_REG_BASE + 0x1215f*4+0x02000000,0x2ff); +reg_write( DDR_REG_BASE + 0x1305f*4+0x02000000,0x2ff); +reg_write( DDR_REG_BASE + 0x1315f*4+0x02000000,0x2ff); +reg_write( DDR_REG_BASE + 0x55 *4+0x02000000,0x3ff); +reg_write( DDR_REG_BASE + 0x1055 *4+0x02000000,0xff); +reg_write( DDR_REG_BASE + 0x2055 *4+0x02000000,0x3ff); +reg_write( DDR_REG_BASE + 0x3055 *4+0x02000000,0x3ff); +reg_write( DDR_REG_BASE + 0x4055 *4+0x02000000,0x3ff); +reg_write( DDR_REG_BASE + 0x5055 *4+0x02000000,0x3ff); +reg_write( DDR_REG_BASE + 0x6055 *4+0x02000000,0xff); +reg_write( DDR_REG_BASE + 0x7055 *4+0x02000000,0x3ff); +reg_write( DDR_REG_BASE + 0x8055 *4+0x02000000,0x3ff); +reg_write( DDR_REG_BASE + 0x9055 *4+0x02000000,0x3ff); +reg_write( DDR_REG_BASE + 0x200c5*4+0x02000000,0xb); +reg_write( DDR_REG_BASE + 0x2002e*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x20024*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x2003a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x2007d*4+0x02000000,0x212); +reg_write( DDR_REG_BASE + 0x2007c*4+0x02000000,0x61); +reg_write( DDR_REG_BASE + 0x20056*4+0x02000000,0xa); +//iteration place +//PHY ODT --pull up +//00_1000 0x01 Pullup/Down:480 +//00_1000 0x02 Pullup/Down:240 +//00_1000 0x08 Pullup/Down:120 +//00_1010 0x0a Pullup/Down:80 +//01_1000 0x18 Pullup/Down:60 +//01_1010 0x1a Pullup/Down:48 +//11_1000 0x38 Pullup/Down:40 +//11_1010 0x3a Pullup/Down:34.3 +reg_write( DDR_REG_BASE + 0x1004d*4+0x02000000,0x18); +reg_write( DDR_REG_BASE + 0x1014d*4+0x02000000,0x18); +reg_write( DDR_REG_BASE + 0x1104d*4+0x02000000,0x18); +reg_write( DDR_REG_BASE + 0x1114d*4+0x02000000,0x18); +reg_write( DDR_REG_BASE + 0x1204d*4+0x02000000,0x18); +reg_write( DDR_REG_BASE + 0x1214d*4+0x02000000,0x18); +reg_write( DDR_REG_BASE + 0x1304d*4+0x02000000,0x18); +reg_write( DDR_REG_BASE + 0x1314d*4+0x02000000,0x18); +// // [phyinit_C_initPhyConfig] Pstate=0, Memclk=800MHz, Programming TxImpedanceCtrl1::DrvStrenFSDqP to 0x18 +// // [phyinit_C_initPhyConfig] Pstate=0, Memclk=800MHz, Programming TxImpedanceCtrl1::DrvStrenFSDqN to 0x18 + +//iteration place +//PHY TX output impedence +//0010_00 00_1000 0x208 Pullup/Down:120 +//0010_10 00_1010 0x28a Pullup/Down:80 +//0110_00 01_1000 0x618 Pullup/Down:60 +//0110_10 01_1010 0x69a Pullup/Down:48 +//1110_00 11_1000 0xe38 Pullup/Down:40 +//1110_10 11_1010 0xeba Pullup/Down:34.3 + +reg_write( DDR_REG_BASE + 0x10049*4+0x02000000,0x618); +reg_write( DDR_REG_BASE + 0x10149*4+0x02000000,0x618); +reg_write( DDR_REG_BASE + 0x11049*4+0x02000000,0x618); +reg_write( DDR_REG_BASE + 0x11149*4+0x02000000,0x618); +reg_write( DDR_REG_BASE + 0x12049*4+0x02000000,0x618); +reg_write( DDR_REG_BASE + 0x12149*4+0x02000000,0x618); +reg_write( DDR_REG_BASE + 0x13049*4+0x02000000,0x618); +reg_write( DDR_REG_BASE + 0x13149*4+0x02000000,0x618); + + +//iteration place +// PHY AC/CLK output impedence +//00000_00000 0x0 120 +//00001_00001 0x21 60 +//00011_00011 0x63 40 +//00111_00111 0xe7 30 +//01111_01111 0x1ef 24 +//11111_11111 0x3ff 20 + +// // [phyinit_C_initPhyConfig] Programming ATxImpedance::ADrvStrenP to 0x1 +// // [phyinit_C_initPhyConfig] Programming ATxImpedance::ADrvStrenN to 0x1 +reg_write( DDR_REG_BASE + 0x43 *4+0x02000000,0x63); +reg_write( DDR_REG_BASE + 0x1043 *4+0x02000000,0x63); +reg_write( DDR_REG_BASE + 0x2043 *4+0x02000000,0x63); +reg_write( DDR_REG_BASE + 0x3043 *4+0x02000000,0x63); +reg_write( DDR_REG_BASE + 0x4043 *4+0x02000000,0x63); +reg_write( DDR_REG_BASE + 0x5043 *4+0x02000000,0x63); +reg_write( DDR_REG_BASE + 0x6043 *4+0x02000000,0x63); +reg_write( DDR_REG_BASE + 0x7043 *4+0x02000000,0x63); +reg_write( DDR_REG_BASE + 0x8043 *4+0x02000000,0x63); +reg_write( DDR_REG_BASE + 0x9043 *4+0x02000000,0x63); + + +reg_write( DDR_REG_BASE + 0x20018*4+0x02000000,0x5); +reg_write( DDR_REG_BASE + 0x20075*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x20050*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x20008*4+0x02000000,0x190); +reg_write( DDR_REG_BASE + 0x20088*4+0x02000000,0x9); +//iteration place +//PHY VERF +//INSEL VREFIN ALL Ratio +//---(0.005*X+0.345)VDDQ --- +//0x0 0x51 0x288 75% (GlobalVrefInSel to 0x0) +//0x0 0x41 0x208 67% (GlobalVrefInSel to 0x0) +//---(0.005*(X-1)VDDQ---- +//0x4 0x65 0x32c 50% (GlobalVrefInSel to 0x4) +//0x4 0x33 0x19c 25% (GlobalVrefInSel to 0x4) + + +// // [phyinit_C_initPhyConfig] Pstate=0, Programming VrefInGlobal::GlobalVrefInDAC to 0x51 +// // [phyinit_C_initPhyConfig] Pstate=0, Programming VrefInGlobal to 0x288 + +//reg_write( DDR_REG_BASE + 0x200b2*4+0x02000000,0x32c);//hyg +//reg_write( DDR_REG_BASE + 0x200b2*4+0x02000000,0x208);//hyg +//reg_write( DDR_REG_BASE + 0x200b2*4+0x02000000,0x32C);//hyg +reg_write( DDR_REG_BASE + 0x200b2*4+0x02000000,0x288); + +reg_write( DDR_REG_BASE + 0x10043*4+0x02000000,0x5b1); +reg_write( DDR_REG_BASE + 0x10143*4+0x02000000,0x5b1); +reg_write( DDR_REG_BASE + 0x11043*4+0x02000000,0x5b1); +reg_write( DDR_REG_BASE + 0x11143*4+0x02000000,0x5b1); +reg_write( DDR_REG_BASE + 0x12043*4+0x02000000,0x5b1); +reg_write( DDR_REG_BASE + 0x12143*4+0x02000000,0x5b1); +reg_write( DDR_REG_BASE + 0x13043*4+0x02000000,0x5b1); +reg_write( DDR_REG_BASE + 0x13143*4+0x02000000,0x5b1); +reg_write( DDR_REG_BASE + 0x200fa*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x20019*4+0x02000000,0x1); //hyg +reg_write( DDR_REG_BASE + 0x200f0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x200f1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x200f2*4+0x02000000,0x4444); +reg_write( DDR_REG_BASE + 0x200f3*4+0x02000000,0x8888); +reg_write( DDR_REG_BASE + 0x200f4*4+0x02000000,0x5555); +reg_write( DDR_REG_BASE + 0x200f5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x200f6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x200f7*4+0x02000000,0xf000); +reg_write( DDR_REG_BASE + 0x1004a*4+0x02000000,0x500); +reg_write( DDR_REG_BASE + 0x1104a*4+0x02000000,0x500); +reg_write( DDR_REG_BASE + 0x1204a*4+0x02000000,0x500); +reg_write( DDR_REG_BASE + 0x1304a*4+0x02000000,0x500); +reg_write( DDR_REG_BASE + 0x20025*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x2002c*4+0x02000000,0x0); + + +reg_write( DDR_REG_BASE + 0x20100*4+0x02000000,0x9); //CA0 +reg_write( DDR_REG_BASE + 0x20101*4+0x02000000,0x8); //CA1 +reg_write( DDR_REG_BASE + 0x20102*4+0x02000000,0x7); //CA2 +reg_write( DDR_REG_BASE + 0x20103*4+0x02000000,0x6); //CA3 +reg_write( DDR_REG_BASE + 0x20104*4+0x02000000,0x5); //CA4 +reg_write( DDR_REG_BASE + 0x20105*4+0x02000000,0x4); //CA5 +reg_write( DDR_REG_BASE + 0x20106*4+0x02000000,0x3); //CA6 +reg_write( DDR_REG_BASE + 0x20107*4+0x02000000,0x2); //CA7 +reg_write( DDR_REG_BASE + 0x20108*4+0x02000000,0x1); //CA8 +reg_write( DDR_REG_BASE + 0x20109*4+0x02000000,0x0); //CA9 + + reg_write(DDR_REG_BASE + 0x120a0 * 4 + 0x2000000, 0x0); //lndq =1 dq0(颗粒)---c17(k230)--dq0 + reg_write(DDR_REG_BASE + 0x120a1 * 4 + 0x2000000, 0x6); //CA1 =0 dq1---b19(k230)---dq6 + reg_write(DDR_REG_BASE + 0x120a2 * 4 + 0x2000000, 0x1); //CA1 =0 dq2--d16-dq1 + reg_write(DDR_REG_BASE + 0x120a3 * 4 + 0x2000000, 0x3); //CA1 =0` dq3--c18-dq3 + reg_write(DDR_REG_BASE + 0x120a4 * 4 + 0x2000000, 0x2); //CA1 =0 dq4--c17--dq2 + reg_write(DDR_REG_BASE + 0x120a5 * 4 + 0x2000000, 0x5); //CA1 =0 dq5--e17-dq5 + reg_write(DDR_REG_BASE + 0x120a6 * 4 + 0x2000000, 0x4); //CA1 =0 dq6--e18--dq4 + reg_write(DDR_REG_BASE + 0x120a7 * 4 + 0x2000000, 0x7); //CA1 =0 dq7--c19--dq7 + + reg_write(DDR_REG_BASE + 0x110a0 * 4 + 0x2000000, 0x0); //lndq =1 dq8_0--r17--dq10_2 + reg_write(DDR_REG_BASE + 0x110a1 * 4 + 0x2000000, 0x1); //CA1 =0 dq9_1--t18--dq12_4 + reg_write(DDR_REG_BASE + 0x110a2 * 4 + 0x2000000, 0x2); //CA1 =0 dq10--R18--dq8_0 + reg_write(DDR_REG_BASE + 0x110a3 * 4 + 0x2000000, 0x6); //CA1 =0 dq11--P16--dq9_1 + reg_write(DDR_REG_BASE + 0x110a4 * 4 + 0x2000000, 0x4); //CA1 =0 dq12--w19--dq11_3 + reg_write(DDR_REG_BASE + 0x110a5 * 4 + 0x2000000, 0x3); //CA1 =0 dq13--u20--dq13_5 + reg_write(DDR_REG_BASE + 0x110a6 * 4 + 0x2000000, 0x5); //CA1 =0 dq14--u18--dq14_6 + reg_write(DDR_REG_BASE + 0x110a7 * 4 + 0x2000000, 0x7); //CA1 =0 dq15--t17--dq15_7 + + reg_write(DDR_REG_BASE + 0x130a0 * 4 + 0x2000000, 0x0); //lndq =1 dq16--c14--dq16_0 + reg_write(DDR_REG_BASE + 0x130a1 * 4 + 0x2000000, 0x1); //CA1 =0 dq17--d14--dq20_4 + reg_write(DDR_REG_BASE + 0x130a2 * 4 + 0x2000000, 0x6); //CA1 =0 dq18--c16--dq18_2 + reg_write(DDR_REG_BASE + 0x130a3 * 4 + 0x2000000, 0x3); //CA1 =0 dq19--a14--dq21_5 + reg_write(DDR_REG_BASE + 0x130a4 * 4 + 0x2000000, 0x2); //CA1 =0 dq20--b14--dq17_1 + reg_write(DDR_REG_BASE + 0x130a5 * 4 + 0x2000000, 0x5); //CA1 =0 dq21--b16--dq23_7 + reg_write(DDR_REG_BASE + 0x130a6 * 4 + 0x2000000, 0x4); //CA1 =0 dq22--a17--dq19_3 + reg_write(DDR_REG_BASE + 0x130a7 * 4 + 0x2000000, 0x7); //CA1 =0 dq23--b17--dq22_6 + + reg_write(DDR_REG_BASE + 0x100a0 * 4 + 0x2000000, 0x6); //lndq =1 dq24--t16--dq30_6 + reg_write(DDR_REG_BASE + 0x100a1 * 4 + 0x2000000, 0x2); //CA1 =0 dq25--v18--dq25_1 + reg_write(DDR_REG_BASE + 0x100a2 * 4 + 0x2000000, 0x0); //CA1 =0 dq26--u17--dq29_5 + reg_write(DDR_REG_BASE + 0x100a3 * 4 + 0x2000000, 0x4); //CA1 =0 dq27--y16--dq27_3 + reg_write(DDR_REG_BASE + 0x100a4 * 4 + 0x2000000, 0x3); //CA1 =0 dq28--e18--dq24_0 + reg_write(DDR_REG_BASE + 0x100a5 * 4 + 0x2000000, 0x1); //CA1 =0 dq29--y18--dq28_4 + reg_write(DDR_REG_BASE + 0x100a6 * 4 + 0x2000000, 0x5); //CA1 =0 dq30--v16--dq26_2 + reg_write(DDR_REG_BASE + 0x100a7 * 4 + 0x2000000, 0x7); //CA1 =0 dq31--u16--dq31_7 + + +reg_write( DDR_REG_BASE + 0x20060*4+0x02000000,0x2); + + + +reg_write( DDR_REG_BASE + 0xd0000*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50000*4+0x02000000,0xb0); +reg_write( DDR_REG_BASE + 0x50001*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50002*4+0x02000000,0x50); +reg_write( DDR_REG_BASE + 0x50003*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50004*4+0x02000000,0x50); +reg_write( DDR_REG_BASE + 0x50005*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50006*4+0x02000000,0x50); +reg_write( DDR_REG_BASE + 0x50007*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50008*4+0x02000000,0x50); +reg_write( DDR_REG_BASE + 0x50009*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5000a*4+0x02000000,0x50); +reg_write( DDR_REG_BASE + 0x5000b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5000c*4+0x02000000,0x50); +reg_write( DDR_REG_BASE + 0x5000d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5000e*4+0x02000000,0x50); +reg_write( DDR_REG_BASE + 0x5000f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50010*4+0x02000000,0x50); +reg_write( DDR_REG_BASE + 0x50011*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50012*4+0x02000000,0x50); +reg_write( DDR_REG_BASE + 0x50013*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50014*4+0x02000000,0x50); +reg_write( DDR_REG_BASE + 0x50015*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50016*4+0x02000000,0x50); +reg_write( DDR_REG_BASE + 0x50017*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50018*4+0x02000000,0x50); +reg_write( DDR_REG_BASE + 0x50019*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5001a*4+0x02000000,0x50); +reg_write( DDR_REG_BASE + 0x5001b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5001c*4+0x02000000,0x50); +reg_write( DDR_REG_BASE + 0x5001d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5001e*4+0x02000000,0x50); +reg_write( DDR_REG_BASE + 0x5001f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50020*4+0x02000000,0x50); +reg_write( DDR_REG_BASE + 0x50021*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50022*4+0x02000000,0x50); +reg_write( DDR_REG_BASE + 0x50023*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50024*4+0x02000000,0x50); +reg_write( DDR_REG_BASE + 0x50025*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50026*4+0x02000000,0x50); +reg_write( DDR_REG_BASE + 0x50027*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50028*4+0x02000000,0x2069); +reg_write( DDR_REG_BASE + 0x50029*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x5002a*4+0x02000000,0x264a); +reg_write( DDR_REG_BASE + 0x5002b*4+0x02000000,0x7000); +reg_write( DDR_REG_BASE + 0x5002c*4+0x02000000,0x264a); +reg_write( DDR_REG_BASE + 0x5002d*4+0x02000000,0x7000); +reg_write( DDR_REG_BASE + 0x5002e*4+0x02000000,0x264a); +reg_write( DDR_REG_BASE + 0x5002f*4+0x02000000,0x7000); +reg_write( DDR_REG_BASE + 0x50030*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50031*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50032*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50033*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50034*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50035*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50036*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50037*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50038*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50039*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5003a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5003b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5003c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5003d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5003e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5003f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50040*4+0x02000000,0x7054); +reg_write( DDR_REG_BASE + 0x50041*4+0x02000000,0x7ce0); +reg_write( DDR_REG_BASE + 0x50042*4+0x02000000,0x4300); +reg_write( DDR_REG_BASE + 0x50043*4+0x02000000,0x1101); +reg_write( DDR_REG_BASE + 0x50044*4+0x02000000,0x48c); +reg_write( DDR_REG_BASE + 0x50045*4+0x02000000,0x2242); +reg_write( DDR_REG_BASE + 0x50046*4+0x02000000,0x8042); +reg_write( DDR_REG_BASE + 0x50047*4+0x02000000,0x1b01); +reg_write( DDR_REG_BASE + 0x50048*4+0x02000000,0x312); +reg_write( DDR_REG_BASE + 0x50049*4+0x02000000,0xf5fb); +reg_write( DDR_REG_BASE + 0x5004a*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x5004b*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x5004c*4+0x02000000,0x2244); +reg_write( DDR_REG_BASE + 0x5004d*4+0x02000000,0x8ffc); +reg_write( DDR_REG_BASE + 0x5004e*4+0x02000000,0x264a); +reg_write( DDR_REG_BASE + 0x5004f*4+0x02000000,0x7000); +reg_write( DDR_REG_BASE + 0x50050*4+0x02000000,0x20e8); +reg_write( DDR_REG_BASE + 0x50051*4+0x02000000,0x1a2); +reg_write( DDR_REG_BASE + 0x50052*4+0x02000000,0x202f); +reg_write( DDR_REG_BASE + 0x50053*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50054*4+0x02000000,0x212f); +reg_write( DDR_REG_BASE + 0x50055*4+0x02000000,0x4b); +reg_write( DDR_REG_BASE + 0x50056*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x50057*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x50058*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x50059*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x5005a*4+0x02000000,0x706c); +reg_write( DDR_REG_BASE + 0x5005b*4+0x02000000,0x704d); +reg_write( DDR_REG_BASE + 0x5005c*4+0x02000000,0x706d); +reg_write( DDR_REG_BASE + 0x5005d*4+0x02000000,0x708d); +reg_write( DDR_REG_BASE + 0x5005e*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x5005f*4+0x02000000,0x70cd); +reg_write( DDR_REG_BASE + 0x50060*4+0x02000000,0x70ed); +reg_write( DDR_REG_BASE + 0x50061*4+0x02000000,0x206a); +reg_write( DDR_REG_BASE + 0x50062*4+0x02000000,0x280); +reg_write( DDR_REG_BASE + 0x50063*4+0x02000000,0xb88d); +reg_write( DDR_REG_BASE + 0x50064*4+0x02000000,0x2029); +reg_write( DDR_REG_BASE + 0x50065*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50066*4+0x02000000,0x44db); +reg_write( DDR_REG_BASE + 0x50067*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50068*4+0x02000000,0x4000); +reg_write( DDR_REG_BASE + 0x50069*4+0x02000000,0x42db); +reg_write( DDR_REG_BASE + 0x5006a*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5006b*4+0x02000000,0x400); +reg_write( DDR_REG_BASE + 0x5006c*4+0x02000000,0x706f); +reg_write( DDR_REG_BASE + 0x5006d*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x5006e*4+0x02000000,0x2022); +reg_write( DDR_REG_BASE + 0x5006f*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x50070*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50071*4+0x02000000,0x2130); +reg_write( DDR_REG_BASE + 0x50072*4+0x02000000,0x2069); +reg_write( DDR_REG_BASE + 0x50073*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x50074*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x50075*4+0x02000000,0xf1fe); +reg_write( DDR_REG_BASE + 0x50076*4+0x02000000,0xc3e1); +reg_write( DDR_REG_BASE + 0x50077*4+0x02000000,0xc2e1); +reg_write( DDR_REG_BASE + 0x50078*4+0x02000000,0xc1e1); +reg_write( DDR_REG_BASE + 0x50079*4+0x02000000,0xc0e1); +reg_write( DDR_REG_BASE + 0x5007a*4+0x02000000,0xc0f1); +reg_write( DDR_REG_BASE + 0x5007b*4+0x02000000,0xc1a1); +reg_write( DDR_REG_BASE + 0x5007c*4+0x02000000,0xe805); +reg_write( DDR_REG_BASE + 0x5007d*4+0x02000000,0x7487); +reg_write( DDR_REG_BASE + 0x5007e*4+0x02000000,0xc0d1); +reg_write( DDR_REG_BASE + 0x5007f*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x50080*4+0x02000000,0xc0a4); +reg_write( DDR_REG_BASE + 0x50081*4+0x02000000,0xda23); +reg_write( DDR_REG_BASE + 0x50082*4+0x02000000,0xba9f); +reg_write( DDR_REG_BASE + 0x50083*4+0x02000000,0x8a60); +reg_write( DDR_REG_BASE + 0x50084*4+0x02000000,0x1226); +reg_write( DDR_REG_BASE + 0x50085*4+0x02000000,0x80); +reg_write( DDR_REG_BASE + 0x50086*4+0x02000000,0x7865); +reg_write( DDR_REG_BASE + 0x50087*4+0x02000000,0x1aec); +reg_write( DDR_REG_BASE + 0x50088*4+0x02000000,0x8002); +reg_write( DDR_REG_BASE + 0x50089*4+0x02000000,0x12ef); +reg_write( DDR_REG_BASE + 0x5008a*4+0x02000000,0x8080); +reg_write( DDR_REG_BASE + 0x5008b*4+0x02000000,0x208c); +reg_write( DDR_REG_BASE + 0x5008c*4+0x02000000,0x8fc3); +reg_write( DDR_REG_BASE + 0x5008d*4+0x02000000,0xf20e); +reg_write( DDR_REG_BASE + 0x5008e*4+0x02000000,0xc084); +reg_write( DDR_REG_BASE + 0x5008f*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x50090*4+0x02000000,0x4020); +reg_write( DDR_REG_BASE + 0x50091*4+0x02000000,0x9ca); +reg_write( DDR_REG_BASE + 0x50092*4+0x02000000,0x260); +reg_write( DDR_REG_BASE + 0x50093*4+0x02000000,0xc184); +reg_write( DDR_REG_BASE + 0x50094*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x50095*4+0x02000000,0x402); +reg_write( DDR_REG_BASE + 0x50096*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50097*4+0x02000000,0xf36); +reg_write( DDR_REG_BASE + 0x50098*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x50099*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x5009a*4+0x02000000,0x94e); +reg_write( DDR_REG_BASE + 0x5009b*4+0x02000000,0x260); +reg_write( DDR_REG_BASE + 0x5009c*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x5009d*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x5009e*4+0x02000000,0x20ab); +reg_write( DDR_REG_BASE + 0x5009f*4+0x02000000,0xc4); +reg_write( DDR_REG_BASE + 0x500a0*4+0x02000000,0x7fff); +reg_write( DDR_REG_BASE + 0x500a1*4+0x02000000,0xf000); +reg_write( DDR_REG_BASE + 0x500a2*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x500a3*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x500a4*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x500a5*4+0x02000000,0xc1a8); +reg_write( DDR_REG_BASE + 0x500a6*4+0x02000000,0xc243); +reg_write( DDR_REG_BASE + 0x500a7*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE + 0x500a8*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x500a9*4+0x02000000,0xc147); +reg_write( DDR_REG_BASE + 0x500aa*4+0x02000000,0xa100); +reg_write( DDR_REG_BASE + 0x500ab*4+0x02000000,0xc345); +reg_write( DDR_REG_BASE + 0x500ac*4+0x02000000,0xc103); +reg_write( DDR_REG_BASE + 0x500ad*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x500ae*4+0x02000000,0x1a7); +reg_write( DDR_REG_BASE + 0x500af*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x500b0*4+0x02000000,0xa100); +reg_write( DDR_REG_BASE + 0x500b1*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE + 0x500b2*4+0x02000000,0x815); +reg_write( DDR_REG_BASE + 0x500b3*4+0x02000000,0x70); +reg_write( DDR_REG_BASE + 0x500b4*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x500b5*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE + 0x500b6*4+0x02000000,0xe88b); +reg_write( DDR_REG_BASE + 0x500b7*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x500b8*4+0x02000000,0x218a); +reg_write( DDR_REG_BASE + 0x500b9*4+0x02000000,0xfcf); +reg_write( DDR_REG_BASE + 0x500ba*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x500bb*4+0x02000000,0xf005); +reg_write( DDR_REG_BASE + 0x500bc*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x500bd*4+0x02000000,0x228a); +reg_write( DDR_REG_BASE + 0x500be*4+0x02000000,0xfcf); +reg_write( DDR_REG_BASE + 0x500bf*4+0x02000000,0xf8e); +reg_write( DDR_REG_BASE + 0x500c0*4+0x02000000,0x280); +reg_write( DDR_REG_BASE + 0x500c1*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x500c2*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x500c3*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x500c4*4+0x02000000,0x79d); +reg_write( DDR_REG_BASE + 0x500c5*4+0x02000000,0xc046); +reg_write( DDR_REG_BASE + 0x500c6*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x500c7*4+0x02000000,0x4318); +reg_write( DDR_REG_BASE + 0x500c8*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x500c9*4+0x02000000,0xf058); +reg_write( DDR_REG_BASE + 0x500ca*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x500cb*4+0x02000000,0x7000); +reg_write( DDR_REG_BASE + 0x500cc*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x500cd*4+0x02000000,0x7a0); +reg_write( DDR_REG_BASE + 0x500ce*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE + 0x500cf*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x500d0*4+0x02000000,0x54); +reg_write( DDR_REG_BASE + 0x500d1*4+0x02000000,0x2032); +reg_write( DDR_REG_BASE + 0x500d2*4+0x02000000,0x6c1); +reg_write( DDR_REG_BASE + 0x500d3*4+0x02000000,0x211a); +reg_write( DDR_REG_BASE + 0x500d4*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x500d5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x500d6*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE + 0x500d7*4+0x02000000,0x78c5); +reg_write( DDR_REG_BASE + 0x500d8*4+0x02000000,0x9000); +reg_write( DDR_REG_BASE + 0x500d9*4+0x02000000,0xef6); +reg_write( DDR_REG_BASE + 0x500da*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x500db*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x500dc*4+0x02000000,0x4508); +reg_write( DDR_REG_BASE + 0x500dd*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x500de*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x500df*4+0x02000000,0x7a0); +reg_write( DDR_REG_BASE + 0x500e0*4+0x02000000,0x8002); +reg_write( DDR_REG_BASE + 0x500e1*4+0x02000000,0x2032); +reg_write( DDR_REG_BASE + 0x500e2*4+0x02000000,0x6c1); +reg_write( DDR_REG_BASE + 0x500e3*4+0x02000000,0x211a); +reg_write( DDR_REG_BASE + 0x500e4*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x500e5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x500e6*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE + 0x500e7*4+0x02000000,0x7e05); +reg_write( DDR_REG_BASE + 0x500e8*4+0x02000000,0x9600); +reg_write( DDR_REG_BASE + 0x500e9*4+0x02000000,0xed6); +reg_write( DDR_REG_BASE + 0x500ea*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x500eb*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x500ec*4+0x02000000,0xc105); +reg_write( DDR_REG_BASE + 0x500ed*4+0x02000000,0x42eb); +reg_write( DDR_REG_BASE + 0x500ee*4+0x02000000,0xf86c); +reg_write( DDR_REG_BASE + 0x500ef*4+0x02000000,0x4759); +reg_write( DDR_REG_BASE + 0x500f0*4+0x02000000,0xe90b); +reg_write( DDR_REG_BASE + 0x500f1*4+0x02000000,0x2344); +reg_write( DDR_REG_BASE + 0x500f2*4+0x02000000,0x80); +reg_write( DDR_REG_BASE + 0x500f3*4+0x02000000,0x7f05); +reg_write( DDR_REG_BASE + 0x500f4*4+0x02000000,0x2544); +reg_write( DDR_REG_BASE + 0x500f5*4+0x02000000,0x1080); +reg_write( DDR_REG_BASE + 0x500f6*4+0x02000000,0x7a05); +reg_write( DDR_REG_BASE + 0x500f7*4+0x02000000,0x2247); +reg_write( DDR_REG_BASE + 0x500f8*4+0x02000000,0xc1); +reg_write( DDR_REG_BASE + 0x500f9*4+0x02000000,0x79e5); +reg_write( DDR_REG_BASE + 0x500fa*4+0x02000000,0xf017); +reg_write( DDR_REG_BASE + 0x500fb*4+0x02000000,0x42eb); +reg_write( DDR_REG_BASE + 0x500fc*4+0x02000000,0xf85a); +reg_write( DDR_REG_BASE + 0x500fd*4+0x02000000,0x4759); +reg_write( DDR_REG_BASE + 0x500fe*4+0x02000000,0xc142); +reg_write( DDR_REG_BASE + 0x500ff*4+0x02000000,0x42eb); +reg_write( DDR_REG_BASE + 0x50100*4+0x02000000,0xf845); +reg_write( DDR_REG_BASE + 0x50101*4+0x02000000,0x4759); +reg_write( DDR_REG_BASE + 0x50102*4+0x02000000,0x272f); +reg_write( DDR_REG_BASE + 0x50103*4+0x02000000,0x3382); +reg_write( DDR_REG_BASE + 0x50104*4+0x02000000,0x2744); +reg_write( DDR_REG_BASE + 0x50105*4+0x02000000,0x3201); +reg_write( DDR_REG_BASE + 0x50106*4+0x02000000,0x7985); +reg_write( DDR_REG_BASE + 0x50107*4+0x02000000,0xc402); +reg_write( DDR_REG_BASE + 0x50108*4+0x02000000,0x42eb); +reg_write( DDR_REG_BASE + 0x50109*4+0x02000000,0xf84b); +reg_write( DDR_REG_BASE + 0x5010a*4+0x02000000,0x4759); +reg_write( DDR_REG_BASE + 0x5010b*4+0x02000000,0x2744); +reg_write( DDR_REG_BASE + 0x5010c*4+0x02000000,0x3102); +reg_write( DDR_REG_BASE + 0x5010d*4+0x02000000,0x42eb); +reg_write( DDR_REG_BASE + 0x5010e*4+0x02000000,0xf858); +reg_write( DDR_REG_BASE + 0x5010f*4+0x02000000,0x4759); +reg_write( DDR_REG_BASE + 0x50110*4+0x02000000,0x7905); +reg_write( DDR_REG_BASE + 0x50111*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE + 0x50112*4+0x02000000,0x4220); +reg_write( DDR_REG_BASE + 0x50113*4+0x02000000,0x7167); +reg_write( DDR_REG_BASE + 0x50114*4+0x02000000,0x205a); +reg_write( DDR_REG_BASE + 0x50115*4+0x02000000,0x200); +reg_write( DDR_REG_BASE + 0x50116*4+0x02000000,0xb8c4); +reg_write( DDR_REG_BASE + 0x50117*4+0x02000000,0xe806); +reg_write( DDR_REG_BASE + 0x50118*4+0x02000000,0xb861); +reg_write( DDR_REG_BASE + 0x50119*4+0x02000000,0x801); +reg_write( DDR_REG_BASE + 0x5011a*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x5011b*4+0x02000000,0x7a5b); +reg_write( DDR_REG_BASE + 0x5011c*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE + 0x5011d*4+0x02000000,0x8020); +reg_write( DDR_REG_BASE + 0x5011e*4+0x02000000,0x7945); +reg_write( DDR_REG_BASE + 0x5011f*4+0x02000000,0xa020); +reg_write( DDR_REG_BASE + 0x50120*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE + 0x50121*4+0x02000000,0x230c); +reg_write( DDR_REG_BASE + 0x50122*4+0x02000000,0xb000); +reg_write( DDR_REG_BASE + 0x50123*4+0x02000000,0x750); +reg_write( DDR_REG_BASE + 0x50124*4+0x02000000,0xffc5); +reg_write( DDR_REG_BASE + 0x50125*4+0x02000000,0xf052); +reg_write( DDR_REG_BASE + 0x50126*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x50127*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50128*4+0x02000000,0x7a0); +reg_write( DDR_REG_BASE + 0x50129*4+0x02000000,0x8021); +reg_write( DDR_REG_BASE + 0x5012a*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x5012b*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE + 0x5012c*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x5012d*4+0x02000000,0x54); +reg_write( DDR_REG_BASE + 0x5012e*4+0x02000000,0x42eb); +reg_write( DDR_REG_BASE + 0x5012f*4+0x02000000,0xf851); +reg_write( DDR_REG_BASE + 0x50130*4+0x02000000,0x4759); +reg_write( DDR_REG_BASE + 0x50131*4+0x02000000,0xe46); +reg_write( DDR_REG_BASE + 0x50132*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x50133*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x50134*4+0x02000000,0x4508); +reg_write( DDR_REG_BASE + 0x50135*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x50136*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50137*4+0x02000000,0x7a0); +reg_write( DDR_REG_BASE + 0x50138*4+0x02000000,0x8023); +reg_write( DDR_REG_BASE + 0x50139*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x5013a*4+0x02000000,0x42eb); +reg_write( DDR_REG_BASE + 0x5013b*4+0x02000000,0xf84b); +reg_write( DDR_REG_BASE + 0x5013c*4+0x02000000,0x4759); +reg_write( DDR_REG_BASE + 0x5013d*4+0x02000000,0xe2e); +reg_write( DDR_REG_BASE + 0x5013e*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x5013f*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x50140*4+0x02000000,0xc105); +reg_write( DDR_REG_BASE + 0x50141*4+0x02000000,0x42eb); +reg_write( DDR_REG_BASE + 0x50142*4+0x02000000,0xf842); +reg_write( DDR_REG_BASE + 0x50143*4+0x02000000,0x4759); +reg_write( DDR_REG_BASE + 0x50144*4+0x02000000,0xe90b); +reg_write( DDR_REG_BASE + 0x50145*4+0x02000000,0x2344); +reg_write( DDR_REG_BASE + 0x50146*4+0x02000000,0x80); +reg_write( DDR_REG_BASE + 0x50147*4+0x02000000,0x7f05); +reg_write( DDR_REG_BASE + 0x50148*4+0x02000000,0x2544); +reg_write( DDR_REG_BASE + 0x50149*4+0x02000000,0x1080); +reg_write( DDR_REG_BASE + 0x5014a*4+0x02000000,0x7845); +reg_write( DDR_REG_BASE + 0x5014b*4+0x02000000,0x2047); +reg_write( DDR_REG_BASE + 0x5014c*4+0x02000000,0xc0); +reg_write( DDR_REG_BASE + 0x5014d*4+0x02000000,0x78e5); +reg_write( DDR_REG_BASE + 0x5014e*4+0x02000000,0xf017); +reg_write( DDR_REG_BASE + 0x5014f*4+0x02000000,0x42eb); +reg_write( DDR_REG_BASE + 0x50150*4+0x02000000,0xf830); +reg_write( DDR_REG_BASE + 0x50151*4+0x02000000,0x4759); +reg_write( DDR_REG_BASE + 0x50152*4+0x02000000,0xc142); +reg_write( DDR_REG_BASE + 0x50153*4+0x02000000,0x42eb); +reg_write( DDR_REG_BASE + 0x50154*4+0x02000000,0xf81b); +reg_write( DDR_REG_BASE + 0x50155*4+0x02000000,0x4759); +reg_write( DDR_REG_BASE + 0x50156*4+0x02000000,0x272f); +reg_write( DDR_REG_BASE + 0x50157*4+0x02000000,0x3382); +reg_write( DDR_REG_BASE + 0x50158*4+0x02000000,0x2744); +reg_write( DDR_REG_BASE + 0x50159*4+0x02000000,0x3201); +reg_write( DDR_REG_BASE + 0x5015a*4+0x02000000,0x7985); +reg_write( DDR_REG_BASE + 0x5015b*4+0x02000000,0xc402); +reg_write( DDR_REG_BASE + 0x5015c*4+0x02000000,0x42eb); +reg_write( DDR_REG_BASE + 0x5015d*4+0x02000000,0xf821); +reg_write( DDR_REG_BASE + 0x5015e*4+0x02000000,0x4759); +reg_write( DDR_REG_BASE + 0x5015f*4+0x02000000,0x2744); +reg_write( DDR_REG_BASE + 0x50160*4+0x02000000,0x3102); +reg_write( DDR_REG_BASE + 0x50161*4+0x02000000,0x42eb); +reg_write( DDR_REG_BASE + 0x50162*4+0x02000000,0xf82e); +reg_write( DDR_REG_BASE + 0x50163*4+0x02000000,0x4759); +reg_write( DDR_REG_BASE + 0x50164*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x50165*4+0x02000000,0xc100); +reg_write( DDR_REG_BASE + 0x50166*4+0x02000000,0x215a); +reg_write( DDR_REG_BASE + 0x50167*4+0x02000000,0x201); +reg_write( DDR_REG_BASE + 0x50168*4+0x02000000,0xb9c4); +reg_write( DDR_REG_BASE + 0x50169*4+0x02000000,0xe906); +reg_write( DDR_REG_BASE + 0x5016a*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE + 0x5016b*4+0x02000000,0x901); +reg_write( DDR_REG_BASE + 0x5016c*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x5016d*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x5016e*4+0x02000000,0xc103); +reg_write( DDR_REG_BASE + 0x5016f*4+0x02000000,0x8120); +reg_write( DDR_REG_BASE + 0x50170*4+0x02000000,0x7905); +reg_write( DDR_REG_BASE + 0x50171*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE + 0x50172*4+0x02000000,0xa020); +reg_write( DDR_REG_BASE + 0x50173*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x50174*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE + 0x50175*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x50176*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x50177*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50178*4+0x02000000,0x79d); +reg_write( DDR_REG_BASE + 0x50179*4+0x02000000,0x8821); +reg_write( DDR_REG_BASE + 0x5017a*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x5017b*4+0x02000000,0x7030); +reg_write( DDR_REG_BASE + 0x5017c*4+0x02000000,0x754); +reg_write( DDR_REG_BASE + 0x5017d*4+0x02000000,0xffc5); +reg_write( DDR_REG_BASE + 0x5017e*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE + 0x5017f*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE + 0x50180*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x50181*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE + 0x50182*4+0x02000000,0x7214); +reg_write( DDR_REG_BASE + 0x50183*4+0x02000000,0x65e); +reg_write( DDR_REG_BASE + 0x50184*4+0x02000000,0xffc5); +reg_write( DDR_REG_BASE + 0x50185*4+0x02000000,0xc0a8); +reg_write( DDR_REG_BASE + 0x50186*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x50187*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x50188*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x50189*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x5018a*4+0x02000000,0x2144); +reg_write( DDR_REG_BASE + 0x5018b*4+0x02000000,0x801); +reg_write( DDR_REG_BASE + 0x5018c*4+0x02000000,0x79c5); +reg_write( DDR_REG_BASE + 0x5018d*4+0x02000000,0x7c25); +reg_write( DDR_REG_BASE + 0x5018e*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE + 0x5018f*4+0x02000000,0x7964); +reg_write( DDR_REG_BASE + 0x50190*4+0x02000000,0x7985); +reg_write( DDR_REG_BASE + 0x50191*4+0x02000000,0x7f25); +reg_write( DDR_REG_BASE + 0x50192*4+0x02000000,0x2644); +reg_write( DDR_REG_BASE + 0x50193*4+0x02000000,0x308c); +reg_write( DDR_REG_BASE + 0x50194*4+0x02000000,0x791d); +reg_write( DDR_REG_BASE + 0x50195*4+0x02000000,0x7ce5); +reg_write( DDR_REG_BASE + 0x50196*4+0x02000000,0x7f3d); +reg_write( DDR_REG_BASE + 0x50197*4+0x02000000,0x2744); +reg_write( DDR_REG_BASE + 0x50198*4+0x02000000,0x1101); +reg_write( DDR_REG_BASE + 0x50199*4+0x02000000,0x7c25); +reg_write( DDR_REG_BASE + 0x5019a*4+0x02000000,0x791d); +reg_write( DDR_REG_BASE + 0x5019b*4+0x02000000,0x7e3d); +reg_write( DDR_REG_BASE + 0x5019c*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x5019d*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x5019e*4+0x02000000,0x2384); +reg_write( DDR_REG_BASE + 0x5019f*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x501a0*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x501a1*4+0x02000000,0x2444); +reg_write( DDR_REG_BASE + 0x501a2*4+0x02000000,0x140c); +reg_write( DDR_REG_BASE + 0x501a3*4+0x02000000,0x7d85); +reg_write( DDR_REG_BASE + 0x501a4*4+0x02000000,0x2344); +reg_write( DDR_REG_BASE + 0x501a5*4+0x02000000,0x180c); +reg_write( DDR_REG_BASE + 0x501a6*4+0x02000000,0x7ca5); +reg_write( DDR_REG_BASE + 0x501a7*4+0x02000000,0x7c65); +reg_write( DDR_REG_BASE + 0x501a8*4+0x02000000,0x2744); +reg_write( DDR_REG_BASE + 0x501a9*4+0x02000000,0x1083); +reg_write( DDR_REG_BASE + 0x501aa*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x501ab*4+0x02000000,0x7b85); +reg_write( DDR_REG_BASE + 0x501ac*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x501ad*4+0x02000000,0x7b45); +reg_write( DDR_REG_BASE + 0x501ae*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x501af*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x501b0*4+0x02000000,0x255e); +reg_write( DDR_REG_BASE + 0x501b1*4+0x02000000,0x1401); +reg_write( DDR_REG_BASE + 0x501b2*4+0x02000000,0x255a); +reg_write( DDR_REG_BASE + 0x501b3*4+0x02000000,0x110b); +reg_write( DDR_REG_BASE + 0x501b4*4+0x02000000,0xdc40); +reg_write( DDR_REG_BASE + 0x501b5*4+0x02000000,0x2144); +reg_write( DDR_REG_BASE + 0x501b6*4+0x02000000,0x40e); +reg_write( DDR_REG_BASE + 0x501b7*4+0x02000000,0x255e); +reg_write( DDR_REG_BASE + 0x501b8*4+0x02000000,0x1201); +reg_write( DDR_REG_BASE + 0x501b9*4+0x02000000,0x2404); +reg_write( DDR_REG_BASE + 0x501ba*4+0x02000000,0x12cc); +reg_write( DDR_REG_BASE + 0x501bb*4+0x02000000,0x2584); +reg_write( DDR_REG_BASE + 0x501bc*4+0x02000000,0x1002); +reg_write( DDR_REG_BASE + 0x501bd*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x501be*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x501bf*4+0x02000000,0x7a65); +reg_write( DDR_REG_BASE + 0x501c0*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE + 0x501c1*4+0x02000000,0x200); +reg_write( DDR_REG_BASE + 0x501c2*4+0x02000000,0x7845); +reg_write( DDR_REG_BASE + 0x501c3*4+0x02000000,0x2087); +reg_write( DDR_REG_BASE + 0x501c4*4+0x02000000,0xfc3); +reg_write( DDR_REG_BASE + 0x501c5*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x501c6*4+0x02000000,0x7c1d); +reg_write( DDR_REG_BASE + 0x501c7*4+0x02000000,0x2444); +reg_write( DDR_REG_BASE + 0x501c8*4+0x02000000,0x1042); +reg_write( DDR_REG_BASE + 0x501c9*4+0x02000000,0x260a); +reg_write( DDR_REG_BASE + 0x501ca*4+0x02000000,0x3300); +reg_write( DDR_REG_BASE + 0x501cb*4+0x02000000,0x7bbb); +reg_write( DDR_REG_BASE + 0x501cc*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE + 0x501cd*4+0x02000000,0x4f); +reg_write( DDR_REG_BASE + 0x501ce*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x501cf*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x501d0*4+0x02000000,0x6109); +reg_write( DDR_REG_BASE + 0x501d1*4+0x02000000,0x211a); +reg_write( DDR_REG_BASE + 0x501d2*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x501d3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x501d4*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE + 0x501d5*4+0x02000000,0x78c5); +reg_write( DDR_REG_BASE + 0x501d6*4+0x02000000,0x9000); +reg_write( DDR_REG_BASE + 0x501d7*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x501d8*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x501d9*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x501da*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x501db*4+0x02000000,0x2482); +reg_write( DDR_REG_BASE + 0x501dc*4+0x02000000,0x3c0c); +reg_write( DDR_REG_BASE + 0x501dd*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x501de*4+0x02000000,0x7100); +reg_write( DDR_REG_BASE + 0x501df*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x501e0*4+0x02000000,0xaa); +reg_write( DDR_REG_BASE + 0x501e1*4+0x02000000,0x70cd); +reg_write( DDR_REG_BASE + 0x501e2*4+0x02000000,0x2456); +reg_write( DDR_REG_BASE + 0x501e3*4+0x02000000,0x3c02); +reg_write( DDR_REG_BASE + 0x501e4*4+0x02000000,0xc04b); +reg_write( DDR_REG_BASE + 0x501e5*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x501e6*4+0x02000000,0x7384); +reg_write( DDR_REG_BASE + 0x501e7*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE + 0x501e8*4+0x02000000,0xe0aa); +reg_write( DDR_REG_BASE + 0x501e9*4+0x02000000,0x206f); +reg_write( DDR_REG_BASE + 0x501ea*4+0x02000000,0x243); +reg_write( DDR_REG_BASE + 0x501eb*4+0x02000000,0x88a0); +reg_write( DDR_REG_BASE + 0x501ec*4+0x02000000,0x1045); +reg_write( DDR_REG_BASE + 0x501ed*4+0x02000000,0x81); +reg_write( DDR_REG_BASE + 0x501ee*4+0x02000000,0x881f); +reg_write( DDR_REG_BASE + 0x501ef*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x501f0*4+0x02000000,0x3f83); +reg_write( DDR_REG_BASE + 0x501f1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x501f2*4+0x02000000,0x53); +reg_write( DDR_REG_BASE + 0x501f3*4+0x02000000,0xc148); +reg_write( DDR_REG_BASE + 0x501f4*4+0x02000000,0xc049); +reg_write( DDR_REG_BASE + 0x501f5*4+0x02000000,0xc095); +reg_write( DDR_REG_BASE + 0x501f6*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x501f7*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x501f8*4+0x02000000,0x3f81); +reg_write( DDR_REG_BASE + 0x501f9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x501fa*4+0x02000000,0x18c); +reg_write( DDR_REG_BASE + 0x501fb*4+0x02000000,0xac6); +reg_write( DDR_REG_BASE + 0x501fc*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x501fd*4+0x02000000,0x2456); +reg_write( DDR_REG_BASE + 0x501fe*4+0x02000000,0x3cc0); +reg_write( DDR_REG_BASE + 0x501ff*4+0x02000000,0xf00e); +reg_write( DDR_REG_BASE + 0x50200*4+0x02000000,0x265a); +reg_write( DDR_REG_BASE + 0x50201*4+0x02000000,0x1602); +reg_write( DDR_REG_BASE + 0x50202*4+0x02000000,0xf006); +reg_write( DDR_REG_BASE + 0x50203*4+0x02000000,0x6058); +reg_write( DDR_REG_BASE + 0x50204*4+0x02000000,0x6038); +reg_write( DDR_REG_BASE + 0x50205*4+0x02000000,0x1800); +reg_write( DDR_REG_BASE + 0x50206*4+0x02000000,0x3); +reg_write( DDR_REG_BASE + 0x50207*4+0x02000000,0x7124); +reg_write( DDR_REG_BASE + 0x50208*4+0x02000000,0x9f7); +reg_write( DDR_REG_BASE + 0x50209*4+0x02000000,0x8634); +reg_write( DDR_REG_BASE + 0x5020a*4+0x02000000,0xc098); +reg_write( DDR_REG_BASE + 0x5020b*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE + 0x5020c*4+0x02000000,0xee9); +reg_write( DDR_REG_BASE + 0x5020d*4+0x02000000,0x9334); +reg_write( DDR_REG_BASE + 0x5020e*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x5020f*4+0x02000000,0x251a); +reg_write( DDR_REG_BASE + 0x50210*4+0x02000000,0x1f80); +reg_write( DDR_REG_BASE + 0x50211*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x50212*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50213*4+0x02000000,0x70ed); +reg_write( DDR_REG_BASE + 0x50214*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x50215*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x50216*4+0x02000000,0x9001); +reg_write( DDR_REG_BASE + 0x50217*4+0x02000000,0xe100); +reg_write( DDR_REG_BASE + 0x50218*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE + 0x50219*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x5021a*4+0x02000000,0xc04a); +reg_write( DDR_REG_BASE + 0x5021b*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x5021c*4+0x02000000,0xb0e0); +reg_write( DDR_REG_BASE + 0x5021d*4+0x02000000,0xc109); +reg_write( DDR_REG_BASE + 0x5021e*4+0x02000000,0xc008); +reg_write( DDR_REG_BASE + 0x5021f*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x50220*4+0x02000000,0xc04c); +reg_write( DDR_REG_BASE + 0x50221*4+0x02000000,0x251a); +reg_write( DDR_REG_BASE + 0x50222*4+0x02000000,0x1f80); +reg_write( DDR_REG_BASE + 0x50223*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x50224*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50225*4+0x02000000,0xb887); +reg_write( DDR_REG_BASE + 0x50226*4+0x02000000,0xa2a); +reg_write( DDR_REG_BASE + 0x50227*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x50228*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE + 0x50229*4+0x02000000,0x563); +reg_write( DDR_REG_BASE + 0x5022a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5022b*4+0x02000000,0xc00c); +reg_write( DDR_REG_BASE + 0x5022c*4+0x02000000,0x2011); +reg_write( DDR_REG_BASE + 0x5022d*4+0x02000000,0x83c0); +reg_write( DDR_REG_BASE + 0x5022e*4+0x02000000,0x554); +reg_write( DDR_REG_BASE + 0x5022f*4+0x02000000,0x21); +reg_write( DDR_REG_BASE + 0x50230*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x50231*4+0x02000000,0x2744); +reg_write( DDR_REG_BASE + 0x50232*4+0x02000000,0x17c1); +reg_write( DDR_REG_BASE + 0x50233*4+0x02000000,0xe906); +reg_write( DDR_REG_BASE + 0x50234*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE + 0x50235*4+0x02000000,0x901); +reg_write( DDR_REG_BASE + 0x50236*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x50237*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x50238*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x50239*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x5023a*4+0x02000000,0xf009); +reg_write( DDR_REG_BASE + 0x5023b*4+0x02000000,0x2456); +reg_write( DDR_REG_BASE + 0x5023c*4+0x02000000,0x3d82); +reg_write( DDR_REG_BASE + 0x5023d*4+0x02000000,0x7a34); +reg_write( DDR_REG_BASE + 0x5023e*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x5023f*4+0x02000000,0x1ac0); +reg_write( DDR_REG_BASE + 0x50240*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x50241*4+0x02000000,0xb200); +reg_write( DDR_REG_BASE + 0x50242*4+0x02000000,0x7124); +reg_write( DDR_REG_BASE + 0x50243*4+0x02000000,0xe1e0); +reg_write( DDR_REG_BASE + 0x50244*4+0x02000000,0xf7b7); +reg_write( DDR_REG_BASE + 0x50245*4+0x02000000,0xc101); +reg_write( DDR_REG_BASE + 0x50246*4+0x02000000,0xc009); +reg_write( DDR_REG_BASE + 0x50247*4+0x02000000,0x2004); +reg_write( DDR_REG_BASE + 0x50248*4+0x02000000,0x8040); +reg_write( DDR_REG_BASE + 0x50249*4+0x02000000,0xc046); +reg_write( DDR_REG_BASE + 0x5024a*4+0x02000000,0xc008); +reg_write( DDR_REG_BASE + 0x5024b*4+0x02000000,0x7824); +reg_write( DDR_REG_BASE + 0x5024c*4+0x02000000,0xc047); +reg_write( DDR_REG_BASE + 0x5024d*4+0x02000000,0x2079); +reg_write( DDR_REG_BASE + 0x5024e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5024f*4+0x02000000,0x232f); +reg_write( DDR_REG_BASE + 0x50250*4+0x02000000,0x3000); +reg_write( DDR_REG_BASE + 0x50251*4+0x02000000,0x23c5); +reg_write( DDR_REG_BASE + 0x50252*4+0x02000000,0x3062); +reg_write( DDR_REG_BASE + 0x50253*4+0x02000000,0xf76); +reg_write( DDR_REG_BASE + 0x50254*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x50255*4+0x02000000,0x4063); +reg_write( DDR_REG_BASE + 0x50256*4+0x02000000,0x42c3); +reg_write( DDR_REG_BASE + 0x50257*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50258*4+0x02000000,0x758); +reg_write( DDR_REG_BASE + 0x50259*4+0x02000000,0x6748); +reg_write( DDR_REG_BASE + 0x5025a*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x5025b*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5025c*4+0x02000000,0x79d); +reg_write( DDR_REG_BASE + 0x5025d*4+0x02000000,0x45cb); +reg_write( DDR_REG_BASE + 0x5025e*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5025f*4+0x02000000,0x7a0); +reg_write( DDR_REG_BASE + 0x50260*4+0x02000000,0xa900); +reg_write( DDR_REG_BASE + 0x50261*4+0x02000000,0x62f8); +reg_write( DDR_REG_BASE + 0x50262*4+0x02000000,0x8862); +reg_write( DDR_REG_BASE + 0x50263*4+0x02000000,0x4a6c); +reg_write( DDR_REG_BASE + 0x50264*4+0x02000000,0x78f6); +reg_write( DDR_REG_BASE + 0x50265*4+0x02000000,0xa503); +reg_write( DDR_REG_BASE + 0x50266*4+0x02000000,0x4a4c); +reg_write( DDR_REG_BASE + 0x50267*4+0x02000000,0x78f6); +reg_write( DDR_REG_BASE + 0x50268*4+0x02000000,0xa502); +reg_write( DDR_REG_BASE + 0x50269*4+0x02000000,0x4a2c); +reg_write( DDR_REG_BASE + 0x5026a*4+0x02000000,0x78f6); +reg_write( DDR_REG_BASE + 0x5026b*4+0x02000000,0xa501); +reg_write( DDR_REG_BASE + 0x5026c*4+0x02000000,0x6a04); +reg_write( DDR_REG_BASE + 0x5026d*4+0x02000000,0x78f6); +reg_write( DDR_REG_BASE + 0x5026e*4+0x02000000,0xa500); +reg_write( DDR_REG_BASE + 0x5026f*4+0x02000000,0x4063); +reg_write( DDR_REG_BASE + 0x50270*4+0x02000000,0xf3a); +reg_write( DDR_REG_BASE + 0x50271*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x50272*4+0x02000000,0xa961); +reg_write( DDR_REG_BASE + 0x50273*4+0x02000000,0xe524); +reg_write( DDR_REG_BASE + 0x50274*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x50275*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE + 0x50276*4+0x02000000,0x70cd); +reg_write( DDR_REG_BASE + 0x50277*4+0x02000000,0xd929); +reg_write( DDR_REG_BASE + 0x50278*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x50279*4+0x02000000,0x7382); +reg_write( DDR_REG_BASE + 0x5027a*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5027b*4+0x02000000,0x6b4); +reg_write( DDR_REG_BASE + 0x5027c*4+0x02000000,0xe7a); +reg_write( DDR_REG_BASE + 0x5027d*4+0x02000000,0x1e0); +reg_write( DDR_REG_BASE + 0x5027e*4+0x02000000,0xdaa4); +reg_write( DDR_REG_BASE + 0x5027f*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x50280*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x50281*4+0x02000000,0x774c); +reg_write( DDR_REG_BASE + 0x50282*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x50283*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE + 0x50284*4+0x02000000,0x780); +reg_write( DDR_REG_BASE + 0x50285*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x50286*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x50287*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE + 0x50288*4+0x02000000,0x1e0); +reg_write( DDR_REG_BASE + 0x50289*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE + 0x5028a*4+0x02000000,0x90a0); +reg_write( DDR_REG_BASE + 0x5028b*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x5028c*4+0x02000000,0x238a); +reg_write( DDR_REG_BASE + 0x5028d*4+0x02000000,0xff7); +reg_write( DDR_REG_BASE + 0x5028e*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x5028f*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x50290*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x50291*4+0x02000000,0xad2); +reg_write( DDR_REG_BASE + 0x50292*4+0x02000000,0x2a0); +reg_write( DDR_REG_BASE + 0x50293*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE + 0x50294*4+0x02000000,0x2504); +reg_write( DDR_REG_BASE + 0x50295*4+0x02000000,0x1f8d); +reg_write( DDR_REG_BASE + 0x50296*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50297*4+0x02000000,0xffbf); +reg_write( DDR_REG_BASE + 0x50298*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE + 0x50299*4+0x02000000,0xfc7); +reg_write( DDR_REG_BASE + 0x5029a*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x5029b*4+0x02000000,0x7344); +reg_write( DDR_REG_BASE + 0x5029c*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE + 0x5029d*4+0x02000000,0xe1e0); +reg_write( DDR_REG_BASE + 0x5029e*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x5029f*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x502a0*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x502a1*4+0x02000000,0xe048); +reg_write( DDR_REG_BASE + 0x502a2*4+0x02000000,0x91e); +reg_write( DDR_REG_BASE + 0x502a3*4+0x02000000,0x120); +reg_write( DDR_REG_BASE + 0x502a4*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x502a5*4+0x02000000,0xae6); +reg_write( DDR_REG_BASE + 0x502a6*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x502a7*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x502a8*4+0x02000000,0x7382); +reg_write( DDR_REG_BASE + 0x502a9*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x502aa*4+0x02000000,0x6b4); +reg_write( DDR_REG_BASE + 0x502ab*4+0x02000000,0xec6); +reg_write( DDR_REG_BASE + 0x502ac*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x502ad*4+0x02000000,0x4063); +reg_write( DDR_REG_BASE + 0x502ae*4+0x02000000,0x906); +reg_write( DDR_REG_BASE + 0x502af*4+0x02000000,0x120); +reg_write( DDR_REG_BASE + 0x502b0*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x502b1*4+0x02000000,0x289); +reg_write( DDR_REG_BASE + 0x502b2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x502b3*4+0x02000000,0x22b); +reg_write( DDR_REG_BASE + 0x502b4*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x502b5*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x502b6*4+0x02000000,0xd840); +reg_write( DDR_REG_BASE + 0x502b7*4+0x02000000,0x1453); +reg_write( DDR_REG_BASE + 0x502b8*4+0x02000000,0x3083); +reg_write( DDR_REG_BASE + 0x502b9*4+0x02000000,0x7824); +reg_write( DDR_REG_BASE + 0x502ba*4+0x02000000,0x2553); +reg_write( DDR_REG_BASE + 0x502bb*4+0x02000000,0x110c); +reg_write( DDR_REG_BASE + 0x502bc*4+0x02000000,0x4338); +reg_write( DDR_REG_BASE + 0x502bd*4+0x02000000,0x7c05); +reg_write( DDR_REG_BASE + 0x502be*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x502bf*4+0x02000000,0xf012); +reg_write( DDR_REG_BASE + 0x502c0*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x502c1*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE + 0x502c2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x502c3*4+0x02000000,0x18c); +reg_write( DDR_REG_BASE + 0x502c4*4+0x02000000,0x6049); +reg_write( DDR_REG_BASE + 0x502c5*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE + 0x502c6*4+0x02000000,0x7144); +reg_write( DDR_REG_BASE + 0x502c7*4+0x02000000,0x211a); +reg_write( DDR_REG_BASE + 0x502c8*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x502c9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x502ca*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x502cb*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x502cc*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x502cd*4+0x02000000,0xb89c); +reg_write( DDR_REG_BASE + 0x502ce*4+0x02000000,0xb89f); +reg_write( DDR_REG_BASE + 0x502cf*4+0x02000000,0xb080); +reg_write( DDR_REG_BASE + 0x502d0*4+0x02000000,0xae1); +reg_write( DDR_REG_BASE + 0x502d1*4+0x02000000,0x80c4); +reg_write( DDR_REG_BASE + 0x502d2*4+0x02000000,0x8d2); +reg_write( DDR_REG_BASE + 0x502d3*4+0x02000000,0x80); +reg_write( DDR_REG_BASE + 0x502d4*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x502d5*4+0x02000000,0x7bcf); +reg_write( DDR_REG_BASE + 0x502d6*4+0x02000000,0xc18d); +reg_write( DDR_REG_BASE + 0x502d7*4+0x02000000,0xb9a); +reg_write( DDR_REG_BASE + 0x502d8*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x502d9*4+0x02000000,0xc293); +reg_write( DDR_REG_BASE + 0x502da*4+0x02000000,0xeeb); +reg_write( DDR_REG_BASE + 0x502db*4+0x02000000,0x1010); +reg_write( DDR_REG_BASE + 0x502dc*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE + 0x502dd*4+0x02000000,0xe838); +reg_write( DDR_REG_BASE + 0x502de*4+0x02000000,0xc40d); +reg_write( DDR_REG_BASE + 0x502df*4+0x02000000,0x2456); +reg_write( DDR_REG_BASE + 0x502e0*4+0x02000000,0x3d82); +reg_write( DDR_REG_BASE + 0x502e1*4+0x02000000,0x22f4); +reg_write( DDR_REG_BASE + 0x502e2*4+0x02000000,0x343); +reg_write( DDR_REG_BASE + 0x502e3*4+0x02000000,0x4081); +reg_write( DDR_REG_BASE + 0x502e4*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x502e5*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x502e6*4+0x02000000,0x245e); +reg_write( DDR_REG_BASE + 0x502e7*4+0x02000000,0x1401); +reg_write( DDR_REG_BASE + 0x502e8*4+0x02000000,0x7263); +reg_write( DDR_REG_BASE + 0x502e9*4+0x02000000,0x2144); +reg_write( DDR_REG_BASE + 0x502ea*4+0x02000000,0x401); +reg_write( DDR_REG_BASE + 0x502eb*4+0x02000000,0x2084); +reg_write( DDR_REG_BASE + 0x502ec*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x502ed*4+0x02000000,0x7965); +reg_write( DDR_REG_BASE + 0x502ee*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x502ef*4+0x02000000,0xb200); +reg_write( DDR_REG_BASE + 0x502f0*4+0x02000000,0x789d); +reg_write( DDR_REG_BASE + 0x502f1*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x502f2*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x502f3*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x502f4*4+0x02000000,0x238a); +reg_write( DDR_REG_BASE + 0x502f5*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x502f6*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE + 0x502f7*4+0x02000000,0x401); +reg_write( DDR_REG_BASE + 0x502f8*4+0x02000000,0x1240); +reg_write( DDR_REG_BASE + 0x502f9*4+0x02000000,0x100); +reg_write( DDR_REG_BASE + 0x502fa*4+0x02000000,0x7b84); +reg_write( DDR_REG_BASE + 0x502fb*4+0x02000000,0x7965); +reg_write( DDR_REG_BASE + 0x502fc*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x502fd*4+0x02000000,0x1a40); +reg_write( DDR_REG_BASE + 0x502fe*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x502ff*4+0x02000000,0x4081); +reg_write( DDR_REG_BASE + 0x50300*4+0x02000000,0xd908); +reg_write( DDR_REG_BASE + 0x50301*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE + 0x50302*4+0x02000000,0x9ff); +reg_write( DDR_REG_BASE + 0x50303*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE + 0x50304*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x50305*4+0x02000000,0xd90c); +reg_write( DDR_REG_BASE + 0x50306*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE + 0x50307*4+0x02000000,0x901); +reg_write( DDR_REG_BASE + 0x50308*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x50309*4+0x02000000,0x7c9d); +reg_write( DDR_REG_BASE + 0x5030a*4+0x02000000,0x2084); +reg_write( DDR_REG_BASE + 0x5030b*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x5030c*4+0x02000000,0x2444); +reg_write( DDR_REG_BASE + 0x5030d*4+0x02000000,0x1401); +reg_write( DDR_REG_BASE + 0x5030e*4+0x02000000,0x7905); +reg_write( DDR_REG_BASE + 0x5030f*4+0x02000000,0x1280); +reg_write( DDR_REG_BASE + 0x50310*4+0x02000000,0x100); +reg_write( DDR_REG_BASE + 0x50311*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x50312*4+0x02000000,0x1a80); +reg_write( DDR_REG_BASE + 0x50313*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x50314*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE + 0x50315*4+0x02000000,0x7014); +reg_write( DDR_REG_BASE + 0x50316*4+0x02000000,0xf2b0); +reg_write( DDR_REG_BASE + 0x50317*4+0x02000000,0xc113); +reg_write( DDR_REG_BASE + 0x50318*4+0x02000000,0x228a); +reg_write( DDR_REG_BASE + 0x50319*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x5031a*4+0x02000000,0xdc0c); +reg_write( DDR_REG_BASE + 0x5031b*4+0x02000000,0x783d); +reg_write( DDR_REG_BASE + 0x5031c*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x5031d*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x5031e*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x5031f*4+0x02000000,0x7a24); +reg_write( DDR_REG_BASE + 0x50320*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE + 0x50321*4+0x02000000,0x400); +reg_write( DDR_REG_BASE + 0x50322*4+0x02000000,0x7845); +reg_write( DDR_REG_BASE + 0x50323*4+0x02000000,0x2456); +reg_write( DDR_REG_BASE + 0x50324*4+0x02000000,0x3d82); +reg_write( DDR_REG_BASE + 0x50325*4+0x02000000,0x7263); +reg_write( DDR_REG_BASE + 0x50326*4+0x02000000,0x2255); +reg_write( DDR_REG_BASE + 0x50327*4+0x02000000,0xc02); +reg_write( DDR_REG_BASE + 0x50328*4+0x02000000,0x1240); +reg_write( DDR_REG_BASE + 0x50329*4+0x02000000,0x103); +reg_write( DDR_REG_BASE + 0x5032a*4+0x02000000,0x7865); +reg_write( DDR_REG_BASE + 0x5032b*4+0x02000000,0x1a40); +reg_write( DDR_REG_BASE + 0x5032c*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x5032d*4+0x02000000,0x4020); +reg_write( DDR_REG_BASE + 0x5032e*4+0x02000000,0xdb08); +reg_write( DDR_REG_BASE + 0x5032f*4+0x02000000,0xbb61); +reg_write( DDR_REG_BASE + 0x50330*4+0x02000000,0xbff); +reg_write( DDR_REG_BASE + 0x50331*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE + 0x50332*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x50333*4+0x02000000,0x4320); +reg_write( DDR_REG_BASE + 0x50334*4+0x02000000,0xbc61); +reg_write( DDR_REG_BASE + 0x50335*4+0x02000000,0xc01); +reg_write( DDR_REG_BASE + 0x50336*4+0x02000000,0x1031); +reg_write( DDR_REG_BASE + 0x50337*4+0x02000000,0x7b7d); +reg_write( DDR_REG_BASE + 0x50338*4+0x02000000,0x2084); +reg_write( DDR_REG_BASE + 0x50339*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x5033a*4+0x02000000,0x2344); +reg_write( DDR_REG_BASE + 0x5033b*4+0x02000000,0x403); +reg_write( DDR_REG_BASE + 0x5033c*4+0x02000000,0x7b05); +reg_write( DDR_REG_BASE + 0x5033d*4+0x02000000,0x1280); +reg_write( DDR_REG_BASE + 0x5033e*4+0x02000000,0x100); +reg_write( DDR_REG_BASE + 0x5033f*4+0x02000000,0x7865); +reg_write( DDR_REG_BASE + 0x50340*4+0x02000000,0x1a80); +reg_write( DDR_REG_BASE + 0x50341*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x50342*4+0x02000000,0x215e); +reg_write( DDR_REG_BASE + 0x50343*4+0x02000000,0x400); +reg_write( DDR_REG_BASE + 0x50344*4+0x02000000,0x219a); +reg_write( DDR_REG_BASE + 0x50345*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x50346*4+0x02000000,0x9260); +reg_write( DDR_REG_BASE + 0x50347*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE + 0x50348*4+0x02000000,0x400); +reg_write( DDR_REG_BASE + 0x50349*4+0x02000000,0x2184); +reg_write( DDR_REG_BASE + 0x5034a*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x5034b*4+0x02000000,0x7865); +reg_write( DDR_REG_BASE + 0x5034c*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x5034d*4+0x02000000,0xb200); +reg_write( DDR_REG_BASE + 0x5034e*4+0x02000000,0xf078); +reg_write( DDR_REG_BASE + 0x5034f*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE + 0x50350*4+0x02000000,0xe83a); +reg_write( DDR_REG_BASE + 0x50351*4+0x02000000,0xc40d); +reg_write( DDR_REG_BASE + 0x50352*4+0x02000000,0x2456); +reg_write( DDR_REG_BASE + 0x50353*4+0x02000000,0x3d83); +reg_write( DDR_REG_BASE + 0x50354*4+0x02000000,0x23f4); +reg_write( DDR_REG_BASE + 0x50355*4+0x02000000,0x342); +reg_write( DDR_REG_BASE + 0x50356*4+0x02000000,0x789b); +reg_write( DDR_REG_BASE + 0x50357*4+0x02000000,0x2453); +reg_write( DDR_REG_BASE + 0x50358*4+0x02000000,0x10c1); +reg_write( DDR_REG_BASE + 0x50359*4+0x02000000,0x2084); +reg_write( DDR_REG_BASE + 0x5035a*4+0x02000000,0x807); +reg_write( DDR_REG_BASE + 0x5035b*4+0x02000000,0x7945); +reg_write( DDR_REG_BASE + 0x5035c*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x5035d*4+0x02000000,0x7363); +reg_write( DDR_REG_BASE + 0x5035e*4+0x02000000,0xb300); +reg_write( DDR_REG_BASE + 0x5035f*4+0x02000000,0x789d); +reg_write( DDR_REG_BASE + 0x50360*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x50361*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x50362*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x50363*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x50364*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x50365*4+0x02000000,0x4181); +reg_write( DDR_REG_BASE + 0x50366*4+0x02000000,0xda08); +reg_write( DDR_REG_BASE + 0x50367*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x50368*4+0x02000000,0xba61); +reg_write( DDR_REG_BASE + 0x50369*4+0x02000000,0xa01); +reg_write( DDR_REG_BASE + 0x5036a*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x5036b*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE + 0x5036c*4+0x02000000,0x2084); +reg_write( DDR_REG_BASE + 0x5036d*4+0x02000000,0x807); +reg_write( DDR_REG_BASE + 0x5036e*4+0x02000000,0xb9c3); +reg_write( DDR_REG_BASE + 0x5036f*4+0x02000000,0x7905); +reg_write( DDR_REG_BASE + 0x50370*4+0x02000000,0x1340); +reg_write( DDR_REG_BASE + 0x50371*4+0x02000000,0x100); +reg_write( DDR_REG_BASE + 0x50372*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x50373*4+0x02000000,0x1b40); +reg_write( DDR_REG_BASE + 0x50374*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x50375*4+0x02000000,0x4081); +reg_write( DDR_REG_BASE + 0x50376*4+0x02000000,0xd910); +reg_write( DDR_REG_BASE + 0x50377*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE + 0x50378*4+0x02000000,0x9ff); +reg_write( DDR_REG_BASE + 0x50379*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE + 0x5037a*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x5037b*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x5037c*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE + 0x5037d*4+0x02000000,0x901); +reg_write( DDR_REG_BASE + 0x5037e*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x5037f*4+0x02000000,0x7c9d); +reg_write( DDR_REG_BASE + 0x50380*4+0x02000000,0x2084); +reg_write( DDR_REG_BASE + 0x50381*4+0x02000000,0xc03); +reg_write( DDR_REG_BASE + 0x50382*4+0x02000000,0x2444); +reg_write( DDR_REG_BASE + 0x50383*4+0x02000000,0x1781); +reg_write( DDR_REG_BASE + 0x50384*4+0x02000000,0x7905); +reg_write( DDR_REG_BASE + 0x50385*4+0x02000000,0x1380); +reg_write( DDR_REG_BASE + 0x50386*4+0x02000000,0x100); +reg_write( DDR_REG_BASE + 0x50387*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x50388*4+0x02000000,0x1b80); +reg_write( DDR_REG_BASE + 0x50389*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x5038a*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE + 0x5038b*4+0x02000000,0xe83c); +reg_write( DDR_REG_BASE + 0x5038c*4+0x02000000,0xc213); +reg_write( DDR_REG_BASE + 0x5038d*4+0x02000000,0xdb08); +reg_write( DDR_REG_BASE + 0x5038e*4+0x02000000,0xdc0f); +reg_write( DDR_REG_BASE + 0x5038f*4+0x02000000,0x785d); +reg_write( DDR_REG_BASE + 0x50390*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x50391*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x50392*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x50393*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x50394*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x50395*4+0x02000000,0x4140); +reg_write( DDR_REG_BASE + 0x50396*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x50397*4+0x02000000,0xbb61); +reg_write( DDR_REG_BASE + 0x50398*4+0x02000000,0xbff); +reg_write( DDR_REG_BASE + 0x50399*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE + 0x5039a*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE + 0x5039b*4+0x02000000,0x2084); +reg_write( DDR_REG_BASE + 0x5039c*4+0x02000000,0x807); +reg_write( DDR_REG_BASE + 0x5039d*4+0x02000000,0xb9c3); +reg_write( DDR_REG_BASE + 0x5039e*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x5039f*4+0x02000000,0x2456); +reg_write( DDR_REG_BASE + 0x503a0*4+0x02000000,0x3d81); +reg_write( DDR_REG_BASE + 0x503a1*4+0x02000000,0x7163); +reg_write( DDR_REG_BASE + 0x503a2*4+0x02000000,0x2155); +reg_write( DDR_REG_BASE + 0x503a3*4+0x02000000,0xc01); +reg_write( DDR_REG_BASE + 0x503a4*4+0x02000000,0x1140); +reg_write( DDR_REG_BASE + 0x503a5*4+0x02000000,0x103); +reg_write( DDR_REG_BASE + 0x503a6*4+0x02000000,0x7865); +reg_write( DDR_REG_BASE + 0x503a7*4+0x02000000,0x1940); +reg_write( DDR_REG_BASE + 0x503a8*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x503a9*4+0x02000000,0x4040); +reg_write( DDR_REG_BASE + 0x503aa*4+0x02000000,0xdb10); +reg_write( DDR_REG_BASE + 0x503ab*4+0x02000000,0xbb61); +reg_write( DDR_REG_BASE + 0x503ac*4+0x02000000,0xbff); +reg_write( DDR_REG_BASE + 0x503ad*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE + 0x503ae*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x503af*4+0x02000000,0x4340); +reg_write( DDR_REG_BASE + 0x503b0*4+0x02000000,0xbc61); +reg_write( DDR_REG_BASE + 0x503b1*4+0x02000000,0xc01); +reg_write( DDR_REG_BASE + 0x503b2*4+0x02000000,0x1031); +reg_write( DDR_REG_BASE + 0x503b3*4+0x02000000,0x7b7d); +reg_write( DDR_REG_BASE + 0x503b4*4+0x02000000,0x2084); +reg_write( DDR_REG_BASE + 0x503b5*4+0x02000000,0xc03); +reg_write( DDR_REG_BASE + 0x503b6*4+0x02000000,0x2344); +reg_write( DDR_REG_BASE + 0x503b7*4+0x02000000,0x783); +reg_write( DDR_REG_BASE + 0x503b8*4+0x02000000,0x7b05); +reg_write( DDR_REG_BASE + 0x503b9*4+0x02000000,0x1180); +reg_write( DDR_REG_BASE + 0x503ba*4+0x02000000,0x100); +reg_write( DDR_REG_BASE + 0x503bb*4+0x02000000,0x7865); +reg_write( DDR_REG_BASE + 0x503bc*4+0x02000000,0x1980); +reg_write( DDR_REG_BASE + 0x503bd*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x503be*4+0x02000000,0x9100); +reg_write( DDR_REG_BASE + 0x503bf*4+0x02000000,0x7b5b); +reg_write( DDR_REG_BASE + 0x503c0*4+0x02000000,0xbac3); +reg_write( DDR_REG_BASE + 0x503c1*4+0x02000000,0x2384); +reg_write( DDR_REG_BASE + 0x503c2*4+0x02000000,0x807); +reg_write( DDR_REG_BASE + 0x503c3*4+0x02000000,0x7845); +reg_write( DDR_REG_BASE + 0x503c4*4+0x02000000,0x7865); +reg_write( DDR_REG_BASE + 0x503c5*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE + 0x503c6*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE + 0x503c7*4+0x02000000,0xe5c0); +reg_write( DDR_REG_BASE + 0x503c8*4+0x02000000,0x5dc); +reg_write( DDR_REG_BASE + 0x503c9*4+0x02000000,0xffe5); +reg_write( DDR_REG_BASE + 0x503ca*4+0x02000000,0x79bb); +reg_write( DDR_REG_BASE + 0x503cb*4+0x02000000,0xeea9); +reg_write( DDR_REG_BASE + 0x503cc*4+0x02000000,0xeca); +reg_write( DDR_REG_BASE + 0x503cd*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x503ce*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x503cf*4+0x02000000,0xfe2); +reg_write( DDR_REG_BASE + 0x503d0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x503d1*4+0x02000000,0xec2); +reg_write( DDR_REG_BASE + 0x503d2*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x503d3*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x503d4*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE + 0x503d5*4+0x02000000,0xd930); +reg_write( DDR_REG_BASE + 0x503d6*4+0x02000000,0xbc6); +reg_write( DDR_REG_BASE + 0x503d7*4+0x02000000,0x1e0); +reg_write( DDR_REG_BASE + 0x503d8*4+0x02000000,0xdac0); +reg_write( DDR_REG_BASE + 0x503d9*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x503da*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x503db*4+0x02000000,0x774c); +reg_write( DDR_REG_BASE + 0x503dc*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE + 0x503dd*4+0x02000000,0xfffe); +reg_write( DDR_REG_BASE + 0x503de*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE + 0x503df*4+0x02000000,0x90a0); +reg_write( DDR_REG_BASE + 0x503e0*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x503e1*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x503e2*4+0x02000000,0x82e); +reg_write( DDR_REG_BASE + 0x503e3*4+0x02000000,0x2a0); +reg_write( DDR_REG_BASE + 0x503e4*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE + 0x503e5*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x503e6*4+0x02000000,0x2504); +reg_write( DDR_REG_BASE + 0x503e7*4+0x02000000,0x1f8d); +reg_write( DDR_REG_BASE + 0x503e8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x503e9*4+0x02000000,0xffbf); +reg_write( DDR_REG_BASE + 0x503ea*4+0x02000000,0xb0a0); +reg_write( DDR_REG_BASE + 0x503eb*4+0x02000000,0xe8e); +reg_write( DDR_REG_BASE + 0x503ec*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x503ed*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x503ee*4+0x02000000,0x852); +reg_write( DDR_REG_BASE + 0x503ef*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x503f0*4+0x02000000,0xe82); +reg_write( DDR_REG_BASE + 0x503f1*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x503f2*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x503f3*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE + 0x503f4*4+0x02000000,0x72d5); +reg_write( DDR_REG_BASE + 0x503f5*4+0x02000000,0x57e); +reg_write( DDR_REG_BASE + 0x503f6*4+0x02000000,0xffc5); +reg_write( DDR_REG_BASE + 0x503f7*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x503f8*4+0x02000000,0x70cd); +reg_write( DDR_REG_BASE + 0x503f9*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x503fa*4+0x02000000,0x7043); +reg_write( DDR_REG_BASE + 0x503fb*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x503fc*4+0x02000000,0x6b4); +reg_write( DDR_REG_BASE + 0x503fd*4+0x02000000,0xe7e); +reg_write( DDR_REG_BASE + 0x503fe*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x503ff*4+0x02000000,0xb0c0); +reg_write( DDR_REG_BASE + 0x50400*4+0x02000000,0xe62); +reg_write( DDR_REG_BASE + 0x50401*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x50402*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x50403*4+0x02000000,0xf7a); +reg_write( DDR_REG_BASE + 0x50404*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50405*4+0x02000000,0xe5a); +reg_write( DDR_REG_BASE + 0x50406*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x50407*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x50408*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE + 0x50409*4+0x02000000,0xd92a); +reg_write( DDR_REG_BASE + 0x5040a*4+0x02000000,0xb5e); +reg_write( DDR_REG_BASE + 0x5040b*4+0x02000000,0x1e0); +reg_write( DDR_REG_BASE + 0x5040c*4+0x02000000,0xdaa8); +reg_write( DDR_REG_BASE + 0x5040d*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x5040e*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x5040f*4+0x02000000,0x774c); +reg_write( DDR_REG_BASE + 0x50410*4+0x02000000,0x238a); +reg_write( DDR_REG_BASE + 0x50411*4+0x02000000,0xfef); +reg_write( DDR_REG_BASE + 0x50412*4+0x02000000,0x90a0); +reg_write( DDR_REG_BASE + 0x50413*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x50414*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x50415*4+0x02000000,0xfca); +reg_write( DDR_REG_BASE + 0x50416*4+0x02000000,0x260); +reg_write( DDR_REG_BASE + 0x50417*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE + 0x50418*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x50419*4+0x02000000,0x2504); +reg_write( DDR_REG_BASE + 0x5041a*4+0x02000000,0x1f8d); +reg_write( DDR_REG_BASE + 0x5041b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5041c*4+0x02000000,0xffbf); +reg_write( DDR_REG_BASE + 0x5041d*4+0x02000000,0xb0a0); +reg_write( DDR_REG_BASE + 0x5041e*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x5041f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50420*4+0x02000000,0xbb8); +reg_write( DDR_REG_BASE + 0x50421*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x50422*4+0x02000000,0x7384); +reg_write( DDR_REG_BASE + 0x50423*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x50424*4+0x02000000,0xe048); +reg_write( DDR_REG_BASE + 0x50425*4+0x02000000,0xe72); +reg_write( DDR_REG_BASE + 0x50426*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x50427*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x50428*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x50429*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x5042a*4+0x02000000,0x94); +reg_write( DDR_REG_BASE + 0x5042b*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5042c*4+0x02000000,0x80a); +reg_write( DDR_REG_BASE + 0x5042d*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x5042e*4+0x02000000,0x42e1); +reg_write( DDR_REG_BASE + 0x5042f*4+0x02000000,0xf0a5); +reg_write( DDR_REG_BASE + 0x50430*4+0x02000000,0x2332); +reg_write( DDR_REG_BASE + 0x50431*4+0x02000000,0x3380); +reg_write( DDR_REG_BASE + 0x50432*4+0x02000000,0x208c); +reg_write( DDR_REG_BASE + 0x50433*4+0x02000000,0x8fc3); +reg_write( DDR_REG_BASE + 0x50434*4+0x02000000,0xf29e); +reg_write( DDR_REG_BASE + 0x50435*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE + 0x50436*4+0x02000000,0x899); +reg_write( DDR_REG_BASE + 0x50437*4+0x02000000,0x30); +reg_write( DDR_REG_BASE + 0x50438*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x50439*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x5043a*4+0x02000000,0x95); +reg_write( DDR_REG_BASE + 0x5043b*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5043c*4+0x02000000,0xfea); +reg_write( DDR_REG_BASE + 0x5043d*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x5043e*4+0x02000000,0x42c1); +reg_write( DDR_REG_BASE + 0x5043f*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x50440*4+0x02000000,0xf038); +reg_write( DDR_REG_BASE + 0x50441*4+0x02000000,0x706c); +reg_write( DDR_REG_BASE + 0x50442*4+0x02000000,0x708d); +reg_write( DDR_REG_BASE + 0x50443*4+0x02000000,0xf019); +reg_write( DDR_REG_BASE + 0x50444*4+0x02000000,0x2456); +reg_write( DDR_REG_BASE + 0x50445*4+0x02000000,0x3d81); +reg_write( DDR_REG_BASE + 0x50446*4+0x02000000,0x21f4); +reg_write( DDR_REG_BASE + 0x50447*4+0x02000000,0x81); +reg_write( DDR_REG_BASE + 0x50448*4+0x02000000,0x2644); +reg_write( DDR_REG_BASE + 0x50449*4+0x02000000,0x17c3); +reg_write( DDR_REG_BASE + 0x5044a*4+0x02000000,0x7144); +reg_write( DDR_REG_BASE + 0x5044b*4+0x02000000,0xeb06); +reg_write( DDR_REG_BASE + 0x5044c*4+0x02000000,0xbb61); +reg_write( DDR_REG_BASE + 0x5044d*4+0x02000000,0xb01); +reg_write( DDR_REG_BASE + 0x5044e*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x5044f*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE + 0x50450*4+0x02000000,0xb9c0); +reg_write( DDR_REG_BASE + 0x50451*4+0x02000000,0x4320); +reg_write( DDR_REG_BASE + 0x50452*4+0x02000000,0x2444); +reg_write( DDR_REG_BASE + 0x50453*4+0x02000000,0x17c1); +reg_write( DDR_REG_BASE + 0x50454*4+0x02000000,0xe905); +reg_write( DDR_REG_BASE + 0x50455*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE + 0x50456*4+0x02000000,0x9ff); +reg_write( DDR_REG_BASE + 0x50457*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE + 0x50458*4+0x02000000,0x7b7b); +reg_write( DDR_REG_BASE + 0x50459*4+0x02000000,0x7185); +reg_write( DDR_REG_BASE + 0x5045a*4+0x02000000,0x7b05); +reg_write( DDR_REG_BASE + 0x5045b*4+0x02000000,0xcd5); +reg_write( DDR_REG_BASE + 0x5045c*4+0x02000000,0x9234); +reg_write( DDR_REG_BASE + 0x5045d*4+0x02000000,0x786f); +reg_write( DDR_REG_BASE + 0x5045e*4+0x02000000,0x2332); +reg_write( DDR_REG_BASE + 0x5045f*4+0x02000000,0x3382); +reg_write( DDR_REG_BASE + 0x50460*4+0x02000000,0x2456); +reg_write( DDR_REG_BASE + 0x50461*4+0x02000000,0x3c01); +reg_write( DDR_REG_BASE + 0x50462*4+0x02000000,0x6149); +reg_write( DDR_REG_BASE + 0x50463*4+0x02000000,0x215f); +reg_write( DDR_REG_BASE + 0x50464*4+0x02000000,0x602); +reg_write( DDR_REG_BASE + 0x50465*4+0x02000000,0xc198); +reg_write( DDR_REG_BASE + 0x50466*4+0x02000000,0x6159); +reg_write( DDR_REG_BASE + 0x50467*4+0x02000000,0x7abd); +reg_write( DDR_REG_BASE + 0x50468*4+0x02000000,0x7a5d); +reg_write( DDR_REG_BASE + 0x50469*4+0x02000000,0x7a5d); +reg_write( DDR_REG_BASE + 0x5046a*4+0x02000000,0x623a); +reg_write( DDR_REG_BASE + 0x5046b*4+0x02000000,0x8a20); +reg_write( DDR_REG_BASE + 0x5046c*4+0x02000000,0x7965); +reg_write( DDR_REG_BASE + 0x5046d*4+0x02000000,0xed2); +reg_write( DDR_REG_BASE + 0x5046e*4+0x02000000,0x1a0); +reg_write( DDR_REG_BASE + 0x5046f*4+0x02000000,0xaa20); +reg_write( DDR_REG_BASE + 0x50470*4+0x02000000,0x4200); +reg_write( DDR_REG_BASE + 0x50471*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x50472*4+0x02000000,0x96); +reg_write( DDR_REG_BASE + 0x50473*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x50474*4+0x02000000,0xf7a); +reg_write( DDR_REG_BASE + 0x50475*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x50476*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x50477*4+0x02000000,0xe508); +reg_write( DDR_REG_BASE + 0x50478*4+0x02000000,0xe5e0); +reg_write( DDR_REG_BASE + 0x50479*4+0x02000000,0x792); +reg_write( DDR_REG_BASE + 0x5047a*4+0x02000000,0xffe5); +reg_write( DDR_REG_BASE + 0x5047b*4+0x02000000,0x42a1); +reg_write( DDR_REG_BASE + 0x5047c*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x5047d*4+0x02000000,0x97); +reg_write( DDR_REG_BASE + 0x5047e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5047f*4+0x02000000,0xf66); +reg_write( DDR_REG_BASE + 0x50480*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x50481*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x50482*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE + 0x50483*4+0x02000000,0x8a1); +reg_write( DDR_REG_BASE + 0x50484*4+0x02000000,0x30); +reg_write( DDR_REG_BASE + 0x50485*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x50486*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x50487*4+0x02000000,0x98); +reg_write( DDR_REG_BASE + 0x50488*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x50489*4+0x02000000,0xf52); +reg_write( DDR_REG_BASE + 0x5048a*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x5048b*4+0x02000000,0x42c1); +reg_write( DDR_REG_BASE + 0x5048c*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x5048d*4+0x02000000,0xf03c); +reg_write( DDR_REG_BASE + 0x5048e*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x5048f*4+0x02000000,0x708d); +reg_write( DDR_REG_BASE + 0x50490*4+0x02000000,0xf019); +reg_write( DDR_REG_BASE + 0x50491*4+0x02000000,0x2456); +reg_write( DDR_REG_BASE + 0x50492*4+0x02000000,0x3d81); +reg_write( DDR_REG_BASE + 0x50493*4+0x02000000,0x7974); +reg_write( DDR_REG_BASE + 0x50494*4+0x02000000,0x11c0); +reg_write( DDR_REG_BASE + 0x50495*4+0x02000000,0x101); +reg_write( DDR_REG_BASE + 0x50496*4+0x02000000,0x2644); +reg_write( DDR_REG_BASE + 0x50497*4+0x02000000,0x17c2); +reg_write( DDR_REG_BASE + 0x50498*4+0x02000000,0x7164); +reg_write( DDR_REG_BASE + 0x50499*4+0x02000000,0xea06); +reg_write( DDR_REG_BASE + 0x5049a*4+0x02000000,0xba61); +reg_write( DDR_REG_BASE + 0x5049b*4+0x02000000,0xa01); +reg_write( DDR_REG_BASE + 0x5049c*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x5049d*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE + 0x5049e*4+0x02000000,0xb9c0); +reg_write( DDR_REG_BASE + 0x5049f*4+0x02000000,0x4220); +reg_write( DDR_REG_BASE + 0x504a0*4+0x02000000,0x2444); +reg_write( DDR_REG_BASE + 0x504a1*4+0x02000000,0x17c1); +reg_write( DDR_REG_BASE + 0x504a2*4+0x02000000,0xe905); +reg_write( DDR_REG_BASE + 0x504a3*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE + 0x504a4*4+0x02000000,0x9ff); +reg_write( DDR_REG_BASE + 0x504a5*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE + 0x504a6*4+0x02000000,0x7a5b); +reg_write( DDR_REG_BASE + 0x504a7*4+0x02000000,0x7185); +reg_write( DDR_REG_BASE + 0x504a8*4+0x02000000,0x7a05); +reg_write( DDR_REG_BASE + 0x504a9*4+0x02000000,0xcd3); +reg_write( DDR_REG_BASE + 0x504aa*4+0x02000000,0x9234); +reg_write( DDR_REG_BASE + 0x504ab*4+0x02000000,0x784f); +reg_write( DDR_REG_BASE + 0x504ac*4+0x02000000,0x2456); +reg_write( DDR_REG_BASE + 0x504ad*4+0x02000000,0x3cc1); +reg_write( DDR_REG_BASE + 0x504ae*4+0x02000000,0x61d9); +reg_write( DDR_REG_BASE + 0x504af*4+0x02000000,0x896c); +reg_write( DDR_REG_BASE + 0x504b0*4+0x02000000,0x2456); +reg_write( DDR_REG_BASE + 0x504b1*4+0x02000000,0x3c01); +reg_write( DDR_REG_BASE + 0x504b2*4+0x02000000,0x6169); +reg_write( DDR_REG_BASE + 0x504b3*4+0x02000000,0x215f); +reg_write( DDR_REG_BASE + 0x504b4*4+0x02000000,0x603); +reg_write( DDR_REG_BASE + 0x504b5*4+0x02000000,0xc198); +reg_write( DDR_REG_BASE + 0x504b6*4+0x02000000,0x6179); +reg_write( DDR_REG_BASE + 0x504b7*4+0x02000000,0x7bbd); +reg_write( DDR_REG_BASE + 0x504b8*4+0x02000000,0x7b7d); +reg_write( DDR_REG_BASE + 0x504b9*4+0x02000000,0x7b7d); +reg_write( DDR_REG_BASE + 0x504ba*4+0x02000000,0x633b); +reg_write( DDR_REG_BASE + 0x504bb*4+0x02000000,0x8b20); +reg_write( DDR_REG_BASE + 0x504bc*4+0x02000000,0x7945); +reg_write( DDR_REG_BASE + 0x504bd*4+0x02000000,0xe32); +reg_write( DDR_REG_BASE + 0x504be*4+0x02000000,0x1a0); +reg_write( DDR_REG_BASE + 0x504bf*4+0x02000000,0xab20); +reg_write( DDR_REG_BASE + 0x504c0*4+0x02000000,0x4200); +reg_write( DDR_REG_BASE + 0x504c1*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x504c2*4+0x02000000,0x99); +reg_write( DDR_REG_BASE + 0x504c3*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x504c4*4+0x02000000,0xeda); +reg_write( DDR_REG_BASE + 0x504c5*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x504c6*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x504c7*4+0x02000000,0xe508); +reg_write( DDR_REG_BASE + 0x504c8*4+0x02000000,0xe5e0); +reg_write( DDR_REG_BASE + 0x504c9*4+0x02000000,0x78c); +reg_write( DDR_REG_BASE + 0x504ca*4+0x02000000,0xffe5); +reg_write( DDR_REG_BASE + 0x504cb*4+0x02000000,0x43a1); +reg_write( DDR_REG_BASE + 0x504cc*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x504cd*4+0x02000000,0x9a); +reg_write( DDR_REG_BASE + 0x504ce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x504cf*4+0x02000000,0xec6); +reg_write( DDR_REG_BASE + 0x504d0*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x504d1*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x504d2*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE + 0x504d3*4+0x02000000,0xe689); +reg_write( DDR_REG_BASE + 0x504d4*4+0x02000000,0x6b8); +reg_write( DDR_REG_BASE + 0x504d5*4+0x02000000,0xffee); +reg_write( DDR_REG_BASE + 0x504d6*4+0x02000000,0x2456); +reg_write( DDR_REG_BASE + 0x504d7*4+0x02000000,0x3cdb); +reg_write( DDR_REG_BASE + 0x504d8*4+0x02000000,0x71e5); +reg_write( DDR_REG_BASE + 0x504d9*4+0x02000000,0x72f5); +reg_write( DDR_REG_BASE + 0x504da*4+0x02000000,0x2a2); +reg_write( DDR_REG_BASE + 0x504db*4+0x02000000,0xffe5); +reg_write( DDR_REG_BASE + 0x504dc*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x504dd*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x504de*4+0x02000000,0xcba); +reg_write( DDR_REG_BASE + 0x504df*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x504e0*4+0x02000000,0xb0a0); +reg_write( DDR_REG_BASE + 0x504e1*4+0x02000000,0xf0c1); +reg_write( DDR_REG_BASE + 0x504e2*4+0x02000000,0x1453); +reg_write( DDR_REG_BASE + 0x504e3*4+0x02000000,0x308e); +reg_write( DDR_REG_BASE + 0x504e4*4+0x02000000,0x706f); +reg_write( DDR_REG_BASE + 0x504e5*4+0x02000000,0xf062); +reg_write( DDR_REG_BASE + 0x504e6*4+0x02000000,0xc095); +reg_write( DDR_REG_BASE + 0x504e7*4+0x02000000,0x2032); +reg_write( DDR_REG_BASE + 0x504e8*4+0x02000000,0x6c0); +reg_write( DDR_REG_BASE + 0x504e9*4+0x02000000,0xdbb); +reg_write( DDR_REG_BASE + 0x504ea*4+0x02000000,0x1021); +reg_write( DDR_REG_BASE + 0x504eb*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x504ec*4+0x02000000,0xdbff); +reg_write( DDR_REG_BASE + 0x504ed*4+0x02000000,0x708d); +reg_write( DDR_REG_BASE + 0x504ee*4+0x02000000,0x4718); +reg_write( DDR_REG_BASE + 0x504ef*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x504f0*4+0x02000000,0xf031); +reg_write( DDR_REG_BASE + 0x504f1*4+0x02000000,0xf20f); +reg_write( DDR_REG_BASE + 0x504f2*4+0x02000000,0x2144); +reg_write( DDR_REG_BASE + 0x504f3*4+0x02000000,0x7ca); +reg_write( DDR_REG_BASE + 0x504f4*4+0x02000000,0x41e3); +reg_write( DDR_REG_BASE + 0x504f5*4+0x02000000,0xa11); +reg_write( DDR_REG_BASE + 0x504f6*4+0x02000000,0x1010); +reg_write( DDR_REG_BASE + 0x504f7*4+0x02000000,0x2242); +reg_write( DDR_REG_BASE + 0x504f8*4+0x02000000,0x104a); +reg_write( DDR_REG_BASE + 0x504f9*4+0x02000000,0xaff); +reg_write( DDR_REG_BASE + 0x504fa*4+0x02000000,0x9031); +reg_write( DDR_REG_BASE + 0x504fb*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE + 0x504fc*4+0x02000000,0x2144); +reg_write( DDR_REG_BASE + 0x504fd*4+0x02000000,0x4b); +reg_write( DDR_REG_BASE + 0x504fe*4+0x02000000,0xf00e); +reg_write( DDR_REG_BASE + 0x504ff*4+0x02000000,0x2454); +reg_write( DDR_REG_BASE + 0x50500*4+0x02000000,0x3c0b); +reg_write( DDR_REG_BASE + 0x50501*4+0x02000000,0x235a); +reg_write( DDR_REG_BASE + 0x50502*4+0x02000000,0x3601); +reg_write( DDR_REG_BASE + 0x50503*4+0x02000000,0x2300); +reg_write( DDR_REG_BASE + 0x50504*4+0x02000000,0x104b); +reg_write( DDR_REG_BASE + 0x50505*4+0x02000000,0x795d); +reg_write( DDR_REG_BASE + 0x50506*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE + 0x50507*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE + 0x50508*4+0x02000000,0x2332); +reg_write( DDR_REG_BASE + 0x50509*4+0x02000000,0x105f); +reg_write( DDR_REG_BASE + 0x5050a*4+0x02000000,0x2744); +reg_write( DDR_REG_BASE + 0x5050b*4+0x02000000,0x304b); +reg_write( DDR_REG_BASE + 0x5050c*4+0x02000000,0x7970); +reg_write( DDR_REG_BASE + 0x5050d*4+0x02000000,0x218c); +reg_write( DDR_REG_BASE + 0x5050e*4+0x02000000,0x8fc3); +reg_write( DDR_REG_BASE + 0x5050f*4+0x02000000,0xf408); +reg_write( DDR_REG_BASE + 0x50510*4+0x02000000,0xb21); +reg_write( DDR_REG_BASE + 0x50511*4+0x02000000,0x1031); +reg_write( DDR_REG_BASE + 0x50512*4+0x02000000,0xdbff); +reg_write( DDR_REG_BASE + 0x50513*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x50514*4+0x02000000,0x4340); +reg_write( DDR_REG_BASE + 0x50515*4+0x02000000,0xf00c); +reg_write( DDR_REG_BASE + 0x50516*4+0x02000000,0x7075); +reg_write( DDR_REG_BASE + 0x50517*4+0x02000000,0x20c0); +reg_write( DDR_REG_BASE + 0x50518*4+0x02000000,0x61); +reg_write( DDR_REG_BASE + 0x50519*4+0x02000000,0xf208); +reg_write( DDR_REG_BASE + 0x5051a*4+0x02000000,0x7910); +reg_write( DDR_REG_BASE + 0x5051b*4+0x02000000,0x2108); +reg_write( DDR_REG_BASE + 0x5051c*4+0x02000000,0x830c); +reg_write( DDR_REG_BASE + 0x5051d*4+0x02000000,0x27ca); +reg_write( DDR_REG_BASE + 0x5051e*4+0x02000000,0x10c9); +reg_write( DDR_REG_BASE + 0x5051f*4+0x02000000,0xdbff); +reg_write( DDR_REG_BASE + 0x50520*4+0x02000000,0x7144); +reg_write( DDR_REG_BASE + 0x50521*4+0x02000000,0xe2e0); +reg_write( DDR_REG_BASE + 0x50522*4+0x02000000,0x79e); +reg_write( DDR_REG_BASE + 0x50523*4+0x02000000,0xffe5); +reg_write( DDR_REG_BASE + 0x50524*4+0x02000000,0x2253); +reg_write( DDR_REG_BASE + 0x50525*4+0x02000000,0x8081); +reg_write( DDR_REG_BASE + 0x50526*4+0x02000000,0x262f); +reg_write( DDR_REG_BASE + 0x50527*4+0x02000000,0xf008); +reg_write( DDR_REG_BASE + 0x50528*4+0x02000000,0x2479); +reg_write( DDR_REG_BASE + 0x50529*4+0x02000000,0x1001); +reg_write( DDR_REG_BASE + 0x5052a*4+0x02000000,0x21c5); +reg_write( DDR_REG_BASE + 0x5052b*4+0x02000000,0x61); +reg_write( DDR_REG_BASE + 0x5052c*4+0x02000000,0x7034); +reg_write( DDR_REG_BASE + 0x5052d*4+0x02000000,0x709d); +reg_write( DDR_REG_BASE + 0x5052e*4+0x02000000,0x262f); +reg_write( DDR_REG_BASE + 0x5052f*4+0x02000000,0xf008); +reg_write( DDR_REG_BASE + 0x50530*4+0x02000000,0xf213); +reg_write( DDR_REG_BASE + 0x50531*4+0x02000000,0xb9e0); +reg_write( DDR_REG_BASE + 0x50532*4+0x02000000,0x2004); +reg_write( DDR_REG_BASE + 0x50533*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x50534*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50535*4+0x02000000,0xfffe); +reg_write( DDR_REG_BASE + 0x50536*4+0x02000000,0x73fd); +reg_write( DDR_REG_BASE + 0x50537*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x50538*4+0x02000000,0x6078); +reg_write( DDR_REG_BASE + 0x50539*4+0x02000000,0xc18d); +reg_write( DDR_REG_BASE + 0x5053a*4+0x02000000,0x208b); +reg_write( DDR_REG_BASE + 0x5053b*4+0x02000000,0x8803); +reg_write( DDR_REG_BASE + 0x5053c*4+0x02000000,0x7a0f); +reg_write( DDR_REG_BASE + 0x5053d*4+0x02000000,0x2114); +reg_write( DDR_REG_BASE + 0x5053e*4+0x02000000,0x6c1); +reg_write( DDR_REG_BASE + 0x5053f*4+0x02000000,0x26ca); +reg_write( DDR_REG_BASE + 0x50540*4+0x02000000,0x3061); +reg_write( DDR_REG_BASE + 0x50541*4+0x02000000,0xb140); +reg_write( DDR_REG_BASE + 0x50542*4+0x02000000,0xf003); +reg_write( DDR_REG_BASE + 0x50543*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x50544*4+0x02000000,0xc04a); +reg_write( DDR_REG_BASE + 0x50545*4+0x02000000,0x7167); +reg_write( DDR_REG_BASE + 0x50546*4+0x02000000,0xb41); +reg_write( DDR_REG_BASE + 0x50547*4+0x02000000,0xb3a4); +reg_write( DDR_REG_BASE + 0x50548*4+0x02000000,0x70ed); +reg_write( DDR_REG_BASE + 0x50549*4+0x02000000,0xe77); +reg_write( DDR_REG_BASE + 0x5054a*4+0x02000000,0x3030); +reg_write( DDR_REG_BASE + 0x5054b*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x5054c*4+0x02000000,0xea5); +reg_write( DDR_REG_BASE + 0x5054d*4+0x02000000,0x3071); +reg_write( DDR_REG_BASE + 0x5054e*4+0x02000000,0x2456); +reg_write( DDR_REG_BASE + 0x5054f*4+0x02000000,0x3cc0); +reg_write( DDR_REG_BASE + 0x50550*4+0x02000000,0x255a); +reg_write( DDR_REG_BASE + 0x50551*4+0x02000000,0x1301); +reg_write( DDR_REG_BASE + 0x50552*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE + 0x50553*4+0x02000000,0x9000); +reg_write( DDR_REG_BASE + 0x50554*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50555*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50556*4+0x02000000,0x890a); +reg_write( DDR_REG_BASE + 0x50557*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x50558*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE + 0x50559*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5055a*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x5055b*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE + 0x5055c*4+0x02000000,0x7845); +reg_write( DDR_REG_BASE + 0x5055d*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x5055e*4+0x02000000,0x7865); +reg_write( DDR_REG_BASE + 0x5055f*4+0x02000000,0xda40); +reg_write( DDR_REG_BASE + 0x50560*4+0x02000000,0xb040); +reg_write( DDR_REG_BASE + 0x50561*4+0x02000000,0x890b); +reg_write( DDR_REG_BASE + 0x50562*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x50563*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x50564*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50565*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x50566*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE + 0x50567*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x50568*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x50569*4+0x02000000,0x7865); +reg_write( DDR_REG_BASE + 0x5056a*4+0x02000000,0xb040); +reg_write( DDR_REG_BASE + 0x5056b*4+0x02000000,0xca01); +reg_write( DDR_REG_BASE + 0x5056c*4+0x02000000,0x865); +reg_write( DDR_REG_BASE + 0x5056d*4+0x02000000,0x311); +reg_write( DDR_REG_BASE + 0x5056e*4+0x02000000,0x251a); +reg_write( DDR_REG_BASE + 0x5056f*4+0x02000000,0x1f81); +reg_write( DDR_REG_BASE + 0x50570*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50571*4+0x02000000,0xb000); +reg_write( DDR_REG_BASE + 0x50572*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE + 0x50573*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x50574*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x50575*4+0x02000000,0x7865); +reg_write( DDR_REG_BASE + 0x50576*4+0x02000000,0xb040); +reg_write( DDR_REG_BASE + 0x50577*4+0x02000000,0xf028); +reg_write( DDR_REG_BASE + 0x50578*4+0x02000000,0x6028); +reg_write( DDR_REG_BASE + 0x50579*4+0x02000000,0xd15); +reg_write( DDR_REG_BASE + 0x5057a*4+0x02000000,0x1021); +reg_write( DDR_REG_BASE + 0x5057b*4+0x02000000,0xc08d); +reg_write( DDR_REG_BASE + 0x5057c*4+0x02000000,0x20f4); +reg_write( DDR_REG_BASE + 0x5057d*4+0x02000000,0x42); +reg_write( DDR_REG_BASE + 0x5057e*4+0x02000000,0x7834); +reg_write( DDR_REG_BASE + 0x5057f*4+0x02000000,0x2242); +reg_write( DDR_REG_BASE + 0x50580*4+0x02000000,0x802); +reg_write( DDR_REG_BASE + 0x50581*4+0x02000000,0xb040); +reg_write( DDR_REG_BASE + 0x50582*4+0x02000000,0x7124); +reg_write( DDR_REG_BASE + 0x50583*4+0x02000000,0x9ed); +reg_write( DDR_REG_BASE + 0x50584*4+0x02000000,0x83a4); +reg_write( DDR_REG_BASE + 0x50585*4+0x02000000,0xc095); +reg_write( DDR_REG_BASE + 0x50586*4+0x02000000,0xf018); +reg_write( DDR_REG_BASE + 0x50587*4+0x02000000,0xc095); +reg_write( DDR_REG_BASE + 0x50588*4+0x02000000,0x60e8); +reg_write( DDR_REG_BASE + 0x50589*4+0x02000000,0xd2b); +reg_write( DDR_REG_BASE + 0x5058a*4+0x02000000,0x1021); +reg_write( DDR_REG_BASE + 0x5058b*4+0x02000000,0xc08d); +reg_write( DDR_REG_BASE + 0x5058c*4+0x02000000,0x20f4); +reg_write( DDR_REG_BASE + 0x5058d*4+0x02000000,0x3c1); +reg_write( DDR_REG_BASE + 0x5058e*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x5058f*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE + 0x50590*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50591*4+0x02000000,0x18c); +reg_write( DDR_REG_BASE + 0x50592*4+0x02000000,0x60e8); +reg_write( DDR_REG_BASE + 0x50593*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x50594*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE + 0x50595*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50596*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x50597*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE + 0x50598*4+0x02000000,0x7845); +reg_write( DDR_REG_BASE + 0x50599*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x5059a*4+0x02000000,0xb89c); +reg_write( DDR_REG_BASE + 0x5059b*4+0x02000000,0xb89f); +reg_write( DDR_REG_BASE + 0x5059c*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE + 0x5059d*4+0x02000000,0x71e5); +reg_write( DDR_REG_BASE + 0x5059e*4+0x02000000,0xfd3); +reg_write( DDR_REG_BASE + 0x5059f*4+0x02000000,0x9384); +reg_write( DDR_REG_BASE + 0x505a0*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE + 0x505a1*4+0x02000000,0x72b5); +reg_write( DDR_REG_BASE + 0x505a2*4+0x02000000,0x680); +reg_write( DDR_REG_BASE + 0x505a3*4+0x02000000,0xffe5); +reg_write( DDR_REG_BASE + 0x505a4*4+0x02000000,0x264a); +reg_write( DDR_REG_BASE + 0x505a5*4+0x02000000,0x3000); +reg_write( DDR_REG_BASE + 0x505a6*4+0x02000000,0xc00a); +reg_write( DDR_REG_BASE + 0x505a7*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x505a8*4+0x02000000,0xa9); +reg_write( DDR_REG_BASE + 0x505a9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x505aa*4+0x02000000,0xd9a); +reg_write( DDR_REG_BASE + 0x505ab*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE + 0x505ac*4+0x02000000,0x2078); +reg_write( DDR_REG_BASE + 0x505ad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x505ae*4+0x02000000,0xb1a); +reg_write( DDR_REG_BASE + 0x505af*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x505b0*4+0x02000000,0xc7e); +reg_write( DDR_REG_BASE + 0x505b1*4+0x02000000,0x180); +reg_write( DDR_REG_BASE + 0x505b2*4+0x02000000,0xc00b); +reg_write( DDR_REG_BASE + 0x505b3*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x505b4*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x505b5*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE + 0x505b6*4+0x02000000,0xe0aa); +reg_write( DDR_REG_BASE + 0x505b7*4+0x02000000,0x2480); +reg_write( DDR_REG_BASE + 0x505b8*4+0x02000000,0x3c0c); +reg_write( DDR_REG_BASE + 0x505b9*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x505ba*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x505bb*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x505bc*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x505bd*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x505be*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x505bf*4+0x02000000,0xc1b5); +reg_write( DDR_REG_BASE + 0x505c0*4+0x02000000,0xc254); +reg_write( DDR_REG_BASE + 0x505c1*4+0x02000000,0x4528); +reg_write( DDR_REG_BASE + 0x505c2*4+0x02000000,0x4200); +reg_write( DDR_REG_BASE + 0x505c3*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x505c4*4+0x02000000,0xee); +reg_write( DDR_REG_BASE + 0x505c5*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x505c6*4+0x02000000,0xcd6); +reg_write( DDR_REG_BASE + 0x505c7*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x505c8*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x505c9*4+0x02000000,0x706f); +reg_write( DDR_REG_BASE + 0x505ca*4+0x02000000,0xf035); +reg_write( DDR_REG_BASE + 0x505cb*4+0x02000000,0x4261); +reg_write( DDR_REG_BASE + 0x505cc*4+0x02000000,0xf009); +reg_write( DDR_REG_BASE + 0x505cd*4+0x02000000,0xc014); +reg_write( DDR_REG_BASE + 0x505ce*4+0x02000000,0x20f4); +reg_write( DDR_REG_BASE + 0x505cf*4+0x02000000,0x83); +reg_write( DDR_REG_BASE + 0x505d0*4+0x02000000,0xc08e); +reg_write( DDR_REG_BASE + 0x505d1*4+0x02000000,0x7834); +reg_write( DDR_REG_BASE + 0x505d2*4+0x02000000,0xb060); +reg_write( DDR_REG_BASE + 0x505d3*4+0x02000000,0x62ba); +reg_write( DDR_REG_BASE + 0x505d4*4+0x02000000,0x7124); +reg_write( DDR_REG_BASE + 0x505d5*4+0x02000000,0x9f3); +reg_write( DDR_REG_BASE + 0x505d6*4+0x02000000,0x8294); +reg_write( DDR_REG_BASE + 0x505d7*4+0x02000000,0x4183); +reg_write( DDR_REG_BASE + 0x505d8*4+0x02000000,0x911c); +reg_write( DDR_REG_BASE + 0x505d9*4+0x02000000,0x1446); +reg_write( DDR_REG_BASE + 0x505da*4+0x02000000,0x3103); +reg_write( DDR_REG_BASE + 0x505db*4+0x02000000,0x915f); +reg_write( DDR_REG_BASE + 0x505dc*4+0x02000000,0xc053); +reg_write( DDR_REG_BASE + 0x505dd*4+0x02000000,0x1448); +reg_write( DDR_REG_BASE + 0x505de*4+0x02000000,0x3101); +reg_write( DDR_REG_BASE + 0x505df*4+0x02000000,0x144a); +reg_write( DDR_REG_BASE + 0x505e0*4+0x02000000,0x3100); +reg_write( DDR_REG_BASE + 0x505e1*4+0x02000000,0x143a); +reg_write( DDR_REG_BASE + 0x505e2*4+0x02000000,0x311f); +reg_write( DDR_REG_BASE + 0x505e3*4+0x02000000,0x143c); +reg_write( DDR_REG_BASE + 0x505e4*4+0x02000000,0x311e); +reg_write( DDR_REG_BASE + 0x505e5*4+0x02000000,0x1440); +reg_write( DDR_REG_BASE + 0x505e6*4+0x02000000,0x310f); +reg_write( DDR_REG_BASE + 0x505e7*4+0x02000000,0x1442); +reg_write( DDR_REG_BASE + 0x505e8*4+0x02000000,0x310e); +reg_write( DDR_REG_BASE + 0x505e9*4+0x02000000,0x1444); +reg_write( DDR_REG_BASE + 0x505ea*4+0x02000000,0x310c); +reg_write( DDR_REG_BASE + 0x505eb*4+0x02000000,0xc346); +reg_write( DDR_REG_BASE + 0x505ec*4+0x02000000,0xc313); +reg_write( DDR_REG_BASE + 0x505ed*4+0x02000000,0xc048); +reg_write( DDR_REG_BASE + 0x505ee*4+0x02000000,0xc147); +reg_write( DDR_REG_BASE + 0x505ef*4+0x02000000,0xc242); +reg_write( DDR_REG_BASE + 0x505f0*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x505f1*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x505f2*4+0x02000000,0xef); +reg_write( DDR_REG_BASE + 0x505f3*4+0x02000000,0xb); +reg_write( DDR_REG_BASE + 0x505f4*4+0x02000000,0xc445); +reg_write( DDR_REG_BASE + 0x505f5*4+0x02000000,0xc644); +reg_write( DDR_REG_BASE + 0x505f6*4+0x02000000,0xc743); +reg_write( DDR_REG_BASE + 0x505f7*4+0x02000000,0x1c04); +reg_write( DDR_REG_BASE + 0x505f8*4+0x02000000,0x3780); +reg_write( DDR_REG_BASE + 0x505f9*4+0x02000000,0x1c00); +reg_write( DDR_REG_BASE + 0x505fa*4+0x02000000,0x37c0); +reg_write( DDR_REG_BASE + 0x505fb*4+0x02000000,0xc6e); +reg_write( DDR_REG_BASE + 0x505fc*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x505fd*4+0x02000000,0x4261); +reg_write( DDR_REG_BASE + 0x505fe*4+0x02000000,0x7167); +reg_write( DDR_REG_BASE + 0x505ff*4+0x02000000,0x232f); +reg_write( DDR_REG_BASE + 0x50600*4+0x02000000,0x16c8); +reg_write( DDR_REG_BASE + 0x50601*4+0x02000000,0xb97); +reg_write( DDR_REG_BASE + 0x50602*4+0x02000000,0x9364); +reg_write( DDR_REG_BASE + 0x50603*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x50604*4+0x02000000,0xc0b5); +reg_write( DDR_REG_BASE + 0x50605*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x50606*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x50607*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x50608*4+0x02000000,0xc2e4); +reg_write( DDR_REG_BASE + 0x50609*4+0x02000000,0x4308); +reg_write( DDR_REG_BASE + 0x5060a*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x5060b*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE + 0x5060c*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE + 0x5060d*4+0x02000000,0x1e4); +reg_write( DDR_REG_BASE + 0x5060e*4+0x02000000,0x218c); +reg_write( DDR_REG_BASE + 0x5060f*4+0x02000000,0x8fc3); +reg_write( DDR_REG_BASE + 0x50610*4+0x02000000,0xb6a0); +reg_write( DDR_REG_BASE + 0x50611*4+0x02000000,0xb6a1); +reg_write( DDR_REG_BASE + 0x50612*4+0x02000000,0xb6a2); +reg_write( DDR_REG_BASE + 0x50613*4+0x02000000,0xf224); +reg_write( DDR_REG_BASE + 0x50614*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x50615*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x50616*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50617*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x50618*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x50619*4+0x02000000,0xf83); +reg_write( DDR_REG_BASE + 0x5061a*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x5061b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5061c*4+0x02000000,0x2305); +reg_write( DDR_REG_BASE + 0x5061d*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x5061e*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x5061f*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x50620*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE + 0x50621*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x50622*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50623*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE + 0x50624*4+0x02000000,0x8881); +reg_write( DDR_REG_BASE + 0x50625*4+0x02000000,0x8800); +reg_write( DDR_REG_BASE + 0x50626*4+0x02000000,0xf00c); +reg_write( DDR_REG_BASE + 0x50627*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x50628*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE + 0x50629*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5062a*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE + 0x5062b*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE + 0x5062c*4+0x02000000,0x7a65); +reg_write( DDR_REG_BASE + 0x5062d*4+0x02000000,0x2205); +reg_write( DDR_REG_BASE + 0x5062e*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE + 0x5062f*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x50630*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x50631*4+0x02000000,0xb220); +reg_write( DDR_REG_BASE + 0x50632*4+0x02000000,0xceb); +reg_write( DDR_REG_BASE + 0x50633*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE + 0x50634*4+0x02000000,0xb76); +reg_write( DDR_REG_BASE + 0x50635*4+0x02000000,0x180); +reg_write( DDR_REG_BASE + 0x50636*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE + 0x50637*4+0x02000000,0x21a); +reg_write( DDR_REG_BASE + 0x50638*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x50639*4+0x02000000,0x900e); +reg_write( DDR_REG_BASE + 0x5063a*4+0x02000000,0x2a); +reg_write( DDR_REG_BASE + 0x5063b*4+0x02000000,0x1efc); +reg_write( DDR_REG_BASE + 0x5063c*4+0x02000000,0x92c4); +reg_write( DDR_REG_BASE + 0x5063d*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE + 0x5063e*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x5063f*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50640*4+0x02000000,0x440); +reg_write( DDR_REG_BASE + 0x50641*4+0x02000000,0xa8a0); +reg_write( DDR_REG_BASE + 0x50642*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x50643*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50644*4+0x02000000,0xfac); +reg_write( DDR_REG_BASE + 0x50645*4+0x02000000,0xb101); +reg_write( DDR_REG_BASE + 0x50646*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x50647*4+0x02000000,0xc6c4); +reg_write( DDR_REG_BASE + 0x50648*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x50649*4+0x02000000,0x7210); +reg_write( DDR_REG_BASE + 0x5064a*4+0x02000000,0x20e0); +reg_write( DDR_REG_BASE + 0x5064b*4+0x02000000,0x7ca); +reg_write( DDR_REG_BASE + 0x5064c*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x5064d*4+0x02000000,0x7101); +reg_write( DDR_REG_BASE + 0x5064e*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE + 0x5064f*4+0x02000000,0x1d6); +reg_write( DDR_REG_BASE + 0x50650*4+0x02000000,0x9f3); +reg_write( DDR_REG_BASE + 0x50651*4+0x02000000,0x803e); +reg_write( DDR_REG_BASE + 0x50652*4+0x02000000,0x7144); +reg_write( DDR_REG_BASE + 0x50653*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x50654*4+0x02000000,0xc2e2); +reg_write( DDR_REG_BASE + 0x50655*4+0x02000000,0x4328); +reg_write( DDR_REG_BASE + 0x50656*4+0x02000000,0x9ca); +reg_write( DDR_REG_BASE + 0x50657*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x50658*4+0x02000000,0x260a); +reg_write( DDR_REG_BASE + 0x50659*4+0x02000000,0x3000); +reg_write( DDR_REG_BASE + 0x5065a*4+0x02000000,0x45cb); +reg_write( DDR_REG_BASE + 0x5065b*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x5065c*4+0x02000000,0xf2); +reg_write( DDR_REG_BASE + 0x5065d*4+0x02000000,0x1d00); +reg_write( DDR_REG_BASE + 0x5065e*4+0x02000000,0x1045); +reg_write( DDR_REG_BASE + 0x5065f*4+0x02000000,0x1d00); +reg_write( DDR_REG_BASE + 0x50660*4+0x02000000,0x1005); +reg_write( DDR_REG_BASE + 0x50661*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x50662*4+0x02000000,0x7784); +reg_write( DDR_REG_BASE + 0x50663*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE + 0x50664*4+0x02000000,0x1e2); +reg_write( DDR_REG_BASE + 0x50665*4+0x02000000,0x99a); +reg_write( DDR_REG_BASE + 0x50666*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x50667*4+0x02000000,0x760c); +reg_write( DDR_REG_BASE + 0x50668*4+0x02000000,0xb17); +reg_write( DDR_REG_BASE + 0x50669*4+0x02000000,0x1030); +reg_write( DDR_REG_BASE + 0x5066a*4+0x02000000,0x1d10); +reg_write( DDR_REG_BASE + 0x5066b*4+0x02000000,0x1045); +reg_write( DDR_REG_BASE + 0x5066c*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x5066d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5066e*4+0x02000000,0x61a8); +reg_write( DDR_REG_BASE + 0x5066f*4+0x02000000,0xfb6); +reg_write( DDR_REG_BASE + 0x50670*4+0x02000000,0xffcf); +reg_write( DDR_REG_BASE + 0x50671*4+0x02000000,0x1d10); +reg_write( DDR_REG_BASE + 0x50672*4+0x02000000,0x1005); +reg_write( DDR_REG_BASE + 0x50673*4+0x02000000,0xc6c2); +reg_write( DDR_REG_BASE + 0x50674*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x50675*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x50676*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x50677*4+0x02000000,0xc1a2); +reg_write( DDR_REG_BASE + 0x50678*4+0x02000000,0xc341); +reg_write( DDR_REG_BASE + 0x50679*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x5067a*4+0x02000000,0x7083); +reg_write( DDR_REG_BASE + 0x5067b*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5067c*4+0x02000000,0x440); +reg_write( DDR_REG_BASE + 0x5067d*4+0x02000000,0x208c); +reg_write( DDR_REG_BASE + 0x5067e*4+0x02000000,0x8fc3); +reg_write( DDR_REG_BASE + 0x5067f*4+0x02000000,0x4308); +reg_write( DDR_REG_BASE + 0x50680*4+0x02000000,0x23ca); +reg_write( DDR_REG_BASE + 0x50681*4+0x02000000,0x10c1); +reg_write( DDR_REG_BASE + 0x50682*4+0x02000000,0xc30a); +reg_write( DDR_REG_BASE + 0x50683*4+0x02000000,0x1424); +reg_write( DDR_REG_BASE + 0x50684*4+0x02000000,0x301b); +reg_write( DDR_REG_BASE + 0x50685*4+0x02000000,0xc508); +reg_write( DDR_REG_BASE + 0x50686*4+0x02000000,0xc607); +reg_write( DDR_REG_BASE + 0x50687*4+0x02000000,0x70ef); +reg_write( DDR_REG_BASE + 0x50688*4+0x02000000,0xac5); +reg_write( DDR_REG_BASE + 0x50689*4+0x02000000,0x171); +reg_write( DDR_REG_BASE + 0x5068a*4+0x02000000,0xc340); +reg_write( DDR_REG_BASE + 0x5068b*4+0x02000000,0x70ed); +reg_write( DDR_REG_BASE + 0x5068c*4+0x02000000,0x706c); +reg_write( DDR_REG_BASE + 0x5068d*4+0x02000000,0x262f); +reg_write( DDR_REG_BASE + 0x5068e*4+0x02000000,0x3042); +reg_write( DDR_REG_BASE + 0x5068f*4+0x02000000,0x2644); +reg_write( DDR_REG_BASE + 0x50690*4+0x02000000,0x3e1f); +reg_write( DDR_REG_BASE + 0x50691*4+0x02000000,0x214b); +reg_write( DDR_REG_BASE + 0x50692*4+0x02000000,0x8c00); +reg_write( DDR_REG_BASE + 0x50693*4+0x02000000,0xdc58); +reg_write( DDR_REG_BASE + 0x50694*4+0x02000000,0x27cf); +reg_write( DDR_REG_BASE + 0x50695*4+0x02000000,0x31e2); +reg_write( DDR_REG_BASE + 0x50696*4+0x02000000,0x7c24); +reg_write( DDR_REG_BASE + 0x50697*4+0x02000000,0x2684); +reg_write( DDR_REG_BASE + 0x50698*4+0x02000000,0x3001); +reg_write( DDR_REG_BASE + 0x50699*4+0x02000000,0x2405); +reg_write( DDR_REG_BASE + 0x5069a*4+0x02000000,0x17cc); +reg_write( DDR_REG_BASE + 0x5069b*4+0x02000000,0x2305); +reg_write( DDR_REG_BASE + 0x5069c*4+0x02000000,0x783); +reg_write( DDR_REG_BASE + 0x5069d*4+0x02000000,0x7b85); +reg_write( DDR_REG_BASE + 0x5069e*4+0x02000000,0x7c3d); +reg_write( DDR_REG_BASE + 0x5069f*4+0x02000000,0x7c9d); +reg_write( DDR_REG_BASE + 0x506a0*4+0x02000000,0x7c9d); +reg_write( DDR_REG_BASE + 0x506a1*4+0x02000000,0x239a); +reg_write( DDR_REG_BASE + 0x506a2*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x506a3*4+0x02000000,0x2404); +reg_write( DDR_REG_BASE + 0x506a4*4+0x02000000,0x1f9e); +reg_write( DDR_REG_BASE + 0x506a5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x506a6*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE + 0x506a7*4+0x02000000,0xc401); +reg_write( DDR_REG_BASE + 0x506a8*4+0x02000000,0x272f); +reg_write( DDR_REG_BASE + 0x506a9*4+0x02000000,0x32c0); +reg_write( DDR_REG_BASE + 0x506aa*4+0x02000000,0x251a); +reg_write( DDR_REG_BASE + 0x506ab*4+0x02000000,0x1f8d); +reg_write( DDR_REG_BASE + 0x506ac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x506ad*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x506ae*4+0x02000000,0x2405); +reg_write( DDR_REG_BASE + 0x506af*4+0x02000000,0x178c); +reg_write( DDR_REG_BASE + 0x506b0*4+0x02000000,0x2405); +reg_write( DDR_REG_BASE + 0x506b1*4+0x02000000,0x10de); +reg_write( DDR_REG_BASE + 0x506b2*4+0x02000000,0x44cb); +reg_write( DDR_REG_BASE + 0x506b3*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE + 0x506b4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x506b5*4+0x02000000,0x2705); +reg_write( DDR_REG_BASE + 0x506b6*4+0x02000000,0x3303); +reg_write( DDR_REG_BASE + 0x506b7*4+0x02000000,0x1b00); +reg_write( DDR_REG_BASE + 0x506b8*4+0x02000000,0x784); +reg_write( DDR_REG_BASE + 0x506b9*4+0x02000000,0x260a); +reg_write( DDR_REG_BASE + 0x506ba*4+0x02000000,0x3040); +reg_write( DDR_REG_BASE + 0x506bb*4+0x02000000,0x269a); +reg_write( DDR_REG_BASE + 0x506bc*4+0x02000000,0x3004); +reg_write( DDR_REG_BASE + 0x506bd*4+0x02000000,0x2353); +reg_write( DDR_REG_BASE + 0x506be*4+0x02000000,0x30c3); +reg_write( DDR_REG_BASE + 0x506bf*4+0x02000000,0x7be5); +reg_write( DDR_REG_BASE + 0x506c0*4+0x02000000,0x7554); +reg_write( DDR_REG_BASE + 0x506c1*4+0x02000000,0x2604); +reg_write( DDR_REG_BASE + 0x506c2*4+0x02000000,0x3f9e); +reg_write( DDR_REG_BASE + 0x506c3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x506c4*4+0x02000000,0xf00); +reg_write( DDR_REG_BASE + 0x506c5*4+0x02000000,0x2505); +reg_write( DDR_REG_BASE + 0x506c6*4+0x02000000,0x178d); +reg_write( DDR_REG_BASE + 0x506c7*4+0x02000000,0x7d65); +reg_write( DDR_REG_BASE + 0x506c8*4+0x02000000,0x2754); +reg_write( DDR_REG_BASE + 0x506c9*4+0x02000000,0x3803); +reg_write( DDR_REG_BASE + 0x506ca*4+0x02000000,0x2755); +reg_write( DDR_REG_BASE + 0x506cb*4+0x02000000,0x3802); +reg_write( DDR_REG_BASE + 0x506cc*4+0x02000000,0x7b85); +reg_write( DDR_REG_BASE + 0x506cd*4+0x02000000,0x26c5); +reg_write( DDR_REG_BASE + 0x506ce*4+0x02000000,0x1e21); +reg_write( DDR_REG_BASE + 0x506cf*4+0x02000000,0x7a85); +reg_write( DDR_REG_BASE + 0x506d0*4+0x02000000,0xb3a0); +reg_write( DDR_REG_BASE + 0x506d1*4+0x02000000,0xb2c0); +reg_write( DDR_REG_BASE + 0x506d2*4+0x02000000,0x2104); +reg_write( DDR_REG_BASE + 0x506d3*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE + 0x506d4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x506d5*4+0x02000000,0xff00); +reg_write( DDR_REG_BASE + 0x506d6*4+0x02000000,0xc100); +reg_write( DDR_REG_BASE + 0x506d7*4+0x02000000,0x208c); +reg_write( DDR_REG_BASE + 0x506d8*4+0x02000000,0x8fc3); +reg_write( DDR_REG_BASE + 0x506d9*4+0x02000000,0x7a25); +reg_write( DDR_REG_BASE + 0x506da*4+0x02000000,0x2755); +reg_write( DDR_REG_BASE + 0x506db*4+0x02000000,0x3c01); +reg_write( DDR_REG_BASE + 0x506dc*4+0x02000000,0x7c25); +reg_write( DDR_REG_BASE + 0x506dd*4+0x02000000,0x2340); +reg_write( DDR_REG_BASE + 0x506de*4+0x02000000,0x1041); +reg_write( DDR_REG_BASE + 0x506df*4+0x02000000,0xb440); +reg_write( DDR_REG_BASE + 0x506e0*4+0x02000000,0xf405); +reg_write( DDR_REG_BASE + 0x506e1*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x506e2*4+0x02000000,0x7042); +reg_write( DDR_REG_BASE + 0x506e3*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x506e4*4+0x02000000,0x440); +reg_write( DDR_REG_BASE + 0x506e5*4+0x02000000,0x782f); +reg_write( DDR_REG_BASE + 0x506e6*4+0x02000000,0xc0a2); +reg_write( DDR_REG_BASE + 0x506e7*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x506e8*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x506e9*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x506ea*4+0x02000000,0xa0d); +reg_write( DDR_REG_BASE + 0x506eb*4+0x02000000,0xf0); +reg_write( DDR_REG_BASE + 0x506ec*4+0x02000000,0xdf10); +reg_write( DDR_REG_BASE + 0x506ed*4+0x02000000,0xa09); +reg_write( DDR_REG_BASE + 0x506ee*4+0x02000000,0x310); +reg_write( DDR_REG_BASE + 0x506ef*4+0x02000000,0x70ed); +reg_write( DDR_REG_BASE + 0x506f0*4+0x02000000,0xa57); +reg_write( DDR_REG_BASE + 0x506f1*4+0x02000000,0x5f5); +reg_write( DDR_REG_BASE + 0x506f2*4+0x02000000,0x264a); +reg_write( DDR_REG_BASE + 0x506f3*4+0x02000000,0x31c0); +reg_write( DDR_REG_BASE + 0x506f4*4+0x02000000,0x728d); +reg_write( DDR_REG_BASE + 0x506f5*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x506f6*4+0x02000000,0x2025); +reg_write( DDR_REG_BASE + 0x506f7*4+0x02000000,0x80); +reg_write( DDR_REG_BASE + 0x506f8*4+0x02000000,0xf195); +reg_write( DDR_REG_BASE + 0x506f9*4+0x02000000,0xf01a); +reg_write( DDR_REG_BASE + 0x506fa*4+0x02000000,0xf017); +reg_write( DDR_REG_BASE + 0x506fb*4+0x02000000,0xf015); +reg_write( DDR_REG_BASE + 0x506fc*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE + 0x506fd*4+0x02000000,0xf01f); +reg_write( DDR_REG_BASE + 0x506fe*4+0x02000000,0xf02b); +reg_write( DDR_REG_BASE + 0x506ff*4+0x02000000,0xf02d); +reg_write( DDR_REG_BASE + 0x50700*4+0x02000000,0xf027); +reg_write( DDR_REG_BASE + 0x50701*4+0x02000000,0xf02d); +reg_write( DDR_REG_BASE + 0x50702*4+0x02000000,0xf02d); +reg_write( DDR_REG_BASE + 0x50703*4+0x02000000,0xf02f); +reg_write( DDR_REG_BASE + 0x50704*4+0x02000000,0xf00b); +reg_write( DDR_REG_BASE + 0x50705*4+0x02000000,0xf01c); +reg_write( DDR_REG_BASE + 0x50706*4+0x02000000,0xf021); +reg_write( DDR_REG_BASE + 0x50707*4+0x02000000,0xf015); +reg_write( DDR_REG_BASE + 0x50708*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE + 0x50709*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE + 0x5070a*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE + 0x5070b*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE + 0x5070c*4+0x02000000,0xf00f); +reg_write( DDR_REG_BASE + 0x5070d*4+0x02000000,0xf006); +reg_write( DDR_REG_BASE + 0x5070e*4+0x02000000,0xf003); +reg_write( DDR_REG_BASE + 0x5070f*4+0x02000000,0xdc07); +reg_write( DDR_REG_BASE + 0x50710*4+0x02000000,0xf002); +reg_write( DDR_REG_BASE + 0x50711*4+0x02000000,0x738d); +reg_write( DDR_REG_BASE + 0x50712*4+0x02000000,0xa11); +reg_write( DDR_REG_BASE + 0x50713*4+0x02000000,0xf1); +reg_write( DDR_REG_BASE + 0x50714*4+0x02000000,0x43a1); +reg_write( DDR_REG_BASE + 0x50715*4+0x02000000,0x239a); +reg_write( DDR_REG_BASE + 0x50716*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x50717*4+0x02000000,0x7e65); +reg_write( DDR_REG_BASE + 0x50718*4+0x02000000,0x4381); +reg_write( DDR_REG_BASE + 0x50719*4+0x02000000,0xf175); +reg_write( DDR_REG_BASE + 0x5071a*4+0x02000000,0x4799); +reg_write( DDR_REG_BASE + 0x5071b*4+0x02000000,0xe28d); +reg_write( DDR_REG_BASE + 0x5071c*4+0x02000000,0x260a); +reg_write( DDR_REG_BASE + 0x5071d*4+0x02000000,0x37c0); +reg_write( DDR_REG_BASE + 0x5071e*4+0x02000000,0x43e3); +reg_write( DDR_REG_BASE + 0x5071f*4+0x02000000,0xf56f); +reg_write( DDR_REG_BASE + 0x50720*4+0x02000000,0x43a1); +reg_write( DDR_REG_BASE + 0x50721*4+0x02000000,0x239a); +reg_write( DDR_REG_BASE + 0x50722*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x50723*4+0x02000000,0x7e65); +reg_write( DDR_REG_BASE + 0x50724*4+0x02000000,0x230a); +reg_write( DDR_REG_BASE + 0x50725*4+0x02000000,0x780); +reg_write( DDR_REG_BASE + 0x50726*4+0x02000000,0xf167); +reg_write( DDR_REG_BASE + 0x50727*4+0x02000000,0x766c); +reg_write( DDR_REG_BASE + 0x50728*4+0x02000000,0xf165); +reg_write( DDR_REG_BASE + 0x50729*4+0x02000000,0x756c); +reg_write( DDR_REG_BASE + 0x5072a*4+0x02000000,0xf163); +reg_write( DDR_REG_BASE + 0x5072b*4+0x02000000,0x716c); +reg_write( DDR_REG_BASE + 0x5072c*4+0x02000000,0xf161); +reg_write( DDR_REG_BASE + 0x5072d*4+0x02000000,0xdb16); +reg_write( DDR_REG_BASE + 0x5072e*4+0x02000000,0xf15f); +reg_write( DDR_REG_BASE + 0x5072f*4+0x02000000,0xdb08); +reg_write( DDR_REG_BASE + 0x50730*4+0x02000000,0xf15d); +reg_write( DDR_REG_BASE + 0x50731*4+0x02000000,0xdb20); +reg_write( DDR_REG_BASE + 0x50732*4+0x02000000,0xf15b); +reg_write( DDR_REG_BASE + 0x50733*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x50734*4+0x02000000,0xc0f1); +reg_write( DDR_REG_BASE + 0x50735*4+0x02000000,0xc1a4); +reg_write( DDR_REG_BASE + 0x50736*4+0x02000000,0xc408); +reg_write( DDR_REG_BASE + 0x50737*4+0x02000000,0xc443); +reg_write( DDR_REG_BASE + 0x50738*4+0x02000000,0xc407); +reg_write( DDR_REG_BASE + 0x50739*4+0x02000000,0xc442); +reg_write( DDR_REG_BASE + 0x5073a*4+0x02000000,0xc406); +reg_write( DDR_REG_BASE + 0x5073b*4+0x02000000,0xc441); +reg_write( DDR_REG_BASE + 0x5073c*4+0x02000000,0xc405); +reg_write( DDR_REG_BASE + 0x5073d*4+0x02000000,0xe72); +reg_write( DDR_REG_BASE + 0x5073e*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x5073f*4+0x02000000,0xc440); +reg_write( DDR_REG_BASE + 0x50740*4+0x02000000,0xc0a4); +reg_write( DDR_REG_BASE + 0x50741*4+0x02000000,0xc0d1); +reg_write( DDR_REG_BASE + 0x50742*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x50743*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x50744*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x50745*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50746*4+0x02000000,0x440); +reg_write( DDR_REG_BASE + 0x50747*4+0x02000000,0x8920); +reg_write( DDR_REG_BASE + 0x50748*4+0x02000000,0x208c); +reg_write( DDR_REG_BASE + 0x50749*4+0x02000000,0x8fc3); +reg_write( DDR_REG_BASE + 0x5074a*4+0x02000000,0x20ca); +reg_write( DDR_REG_BASE + 0x5074b*4+0x02000000,0x41); +reg_write( DDR_REG_BASE + 0x5074c*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x5074d*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x5074e*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE + 0x5074f*4+0x02000000,0x1e8); +reg_write( DDR_REG_BASE + 0x50750*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x50751*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x50752*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x50753*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50754*4+0x02000000,0x440); +reg_write( DDR_REG_BASE + 0x50755*4+0x02000000,0x8920); +reg_write( DDR_REG_BASE + 0x50756*4+0x02000000,0x208c); +reg_write( DDR_REG_BASE + 0x50757*4+0x02000000,0x8fc3); +reg_write( DDR_REG_BASE + 0x50758*4+0x02000000,0x20ca); +reg_write( DDR_REG_BASE + 0x50759*4+0x02000000,0x41); +reg_write( DDR_REG_BASE + 0x5075a*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x5075b*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x5075c*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE + 0x5075d*4+0x02000000,0x1e6); +reg_write( DDR_REG_BASE + 0x5075e*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x5075f*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x50760*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x50761*4+0x02000000,0x900e); +reg_write( DDR_REG_BASE + 0x50762*4+0x02000000,0x4c); +reg_write( DDR_REG_BASE + 0x50763*4+0x02000000,0x9160); +reg_write( DDR_REG_BASE + 0x50764*4+0x02000000,0x9141); +reg_write( DDR_REG_BASE + 0x50765*4+0x02000000,0x221a); +reg_write( DDR_REG_BASE + 0x50766*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x50767*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x50768*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50769*4+0x02000000,0x7965); +reg_write( DDR_REG_BASE + 0x5076a*4+0x02000000,0xe807); +reg_write( DDR_REG_BASE + 0x5076b*4+0x02000000,0x231a); +reg_write( DDR_REG_BASE + 0x5076c*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x5076d*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5076e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5076f*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE + 0x50770*4+0x02000000,0xf008); +reg_write( DDR_REG_BASE + 0x50771*4+0x02000000,0x4040); +reg_write( DDR_REG_BASE + 0x50772*4+0x02000000,0xda0f); +reg_write( DDR_REG_BASE + 0x50773*4+0x02000000,0xba61); +reg_write( DDR_REG_BASE + 0x50774*4+0x02000000,0xaff); +reg_write( DDR_REG_BASE + 0x50775*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE + 0x50776*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x50777*4+0x02000000,0x793b); +reg_write( DDR_REG_BASE + 0x50778*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x50779*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x5077a*4+0x02000000,0x900f); +reg_write( DDR_REG_BASE + 0x5077b*4+0x02000000,0xfe4c); +reg_write( DDR_REG_BASE + 0x5077c*4+0x02000000,0xda10); +reg_write( DDR_REG_BASE + 0x5077d*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE + 0x5077e*4+0x02000000,0xba61); +reg_write( DDR_REG_BASE + 0x5077f*4+0x02000000,0xa01); +reg_write( DDR_REG_BASE + 0x50780*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x50781*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x50782*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x50783*4+0x02000000,0xb101); +reg_write( DDR_REG_BASE + 0x50784*4+0x02000000,0xc2e4); +reg_write( DDR_REG_BASE + 0x50785*4+0x02000000,0x8830); +reg_write( DDR_REG_BASE + 0x50786*4+0x02000000,0x96d); +reg_write( DDR_REG_BASE + 0x50787*4+0x02000000,0x110); +reg_write( DDR_REG_BASE + 0x50788*4+0x02000000,0x8008); +reg_write( DDR_REG_BASE + 0x50789*4+0x02000000,0x869); +reg_write( DDR_REG_BASE + 0x5078a*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x5078b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5078c*4+0x02000000,0x800); +reg_write( DDR_REG_BASE + 0x5078d*4+0x02000000,0x45cb); +reg_write( DDR_REG_BASE + 0x5078e*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5078f*4+0x02000000,0x7b1); +reg_write( DDR_REG_BASE + 0x50790*4+0x02000000,0x8d00); +reg_write( DDR_REG_BASE + 0x50791*4+0x02000000,0x8ea); +reg_write( DDR_REG_BASE + 0x50792*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x50793*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x50794*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x50795*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE + 0x50796*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50797*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x50798*4+0x02000000,0x8d64); +reg_write( DDR_REG_BASE + 0x50799*4+0x02000000,0x8da3); +reg_write( DDR_REG_BASE + 0x5079a*4+0x02000000,0x211a); +reg_write( DDR_REG_BASE + 0x5079b*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE + 0x5079c*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x5079d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5079e*4+0x02000000,0xf018); +reg_write( DDR_REG_BASE + 0x5079f*4+0x02000000,0x251a); +reg_write( DDR_REG_BASE + 0x507a0*4+0x02000000,0x1f81); +reg_write( DDR_REG_BASE + 0x507a1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x507a2*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE + 0x507a3*4+0x02000000,0x7e45); +reg_write( DDR_REG_BASE + 0x507a4*4+0x02000000,0x2105); +reg_write( DDR_REG_BASE + 0x507a5*4+0x02000000,0xf8c); +reg_write( DDR_REG_BASE + 0x507a6*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x507a7*4+0x02000000,0x1064); +reg_write( DDR_REG_BASE + 0x507a8*4+0x02000000,0x251a); +reg_write( DDR_REG_BASE + 0x507a9*4+0x02000000,0x1f81); +reg_write( DDR_REG_BASE + 0x507aa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x507ab*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x507ac*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE + 0x507ad*4+0x02000000,0x79c5); +reg_write( DDR_REG_BASE + 0x507ae*4+0x02000000,0x793b); +reg_write( DDR_REG_BASE + 0x507af*4+0x02000000,0x2105); +reg_write( DDR_REG_BASE + 0x507b0*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x507b1*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x507b2*4+0x02000000,0x200); +reg_write( DDR_REG_BASE + 0x507b3*4+0x02000000,0x9120); +reg_write( DDR_REG_BASE + 0x507b4*4+0x02000000,0xb9c5); +reg_write( DDR_REG_BASE + 0x507b5*4+0x02000000,0xb420); +reg_write( DDR_REG_BASE + 0x507b6*4+0x02000000,0xbd3); +reg_write( DDR_REG_BASE + 0x507b7*4+0x02000000,0x8365); +reg_write( DDR_REG_BASE + 0x507b8*4+0x02000000,0x2055); +reg_write( DDR_REG_BASE + 0x507b9*4+0x02000000,0xd0e); +reg_write( DDR_REG_BASE + 0x507ba*4+0x02000000,0xea6); +reg_write( DDR_REG_BASE + 0x507bb*4+0x02000000,0xc0); +reg_write( DDR_REG_BASE + 0x507bc*4+0x02000000,0xc6c4); +reg_write( DDR_REG_BASE + 0x507bd*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x507be*4+0x02000000,0xc0f1); +reg_write( DDR_REG_BASE + 0x507bf*4+0x02000000,0xc1a4); +reg_write( DDR_REG_BASE + 0x507c0*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x507c1*4+0x02000000,0xc92); +reg_write( DDR_REG_BASE + 0x507c2*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x507c3*4+0x02000000,0xd9ff); +reg_write( DDR_REG_BASE + 0x507c4*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x507c5*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE + 0x507c6*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x507c7*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x507c8*4+0x02000000,0xd85a); +reg_write( DDR_REG_BASE + 0x507c9*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x507ca*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x507cb*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE + 0x507cc*4+0x02000000,0xda0a); +reg_write( DDR_REG_BASE + 0x507cd*4+0x02000000,0xd52); +reg_write( DDR_REG_BASE + 0x507ce*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x507cf*4+0x02000000,0xdb20); +reg_write( DDR_REG_BASE + 0x507d0*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x507d1*4+0x02000000,0xd0a); +reg_write( DDR_REG_BASE + 0x507d2*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x507d3*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x507d4*4+0x02000000,0xc0a4); +reg_write( DDR_REG_BASE + 0x507d5*4+0x02000000,0xc0d1); +reg_write( DDR_REG_BASE + 0x507d6*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x507d7*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x507d8*4+0x02000000,0x7014); +reg_write( DDR_REG_BASE + 0x507d9*4+0x02000000,0x20c0); +reg_write( DDR_REG_BASE + 0x507da*4+0x02000000,0xfe9); +reg_write( DDR_REG_BASE + 0x507db*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x507dc*4+0x02000000,0x2884); +reg_write( DDR_REG_BASE + 0x507dd*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x507de*4+0x02000000,0x917); +reg_write( DDR_REG_BASE + 0x507df*4+0x02000000,0x3f0); +reg_write( DDR_REG_BASE + 0x507e0*4+0x02000000,0x228a); +reg_write( DDR_REG_BASE + 0x507e1*4+0x02000000,0xfc7); +reg_write( DDR_REG_BASE + 0x507e2*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE + 0x507e3*4+0x02000000,0xb9c4); +reg_write( DDR_REG_BASE + 0x507e4*4+0x02000000,0xe905); +reg_write( DDR_REG_BASE + 0x507e5*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE + 0x507e6*4+0x02000000,0x9ff); +reg_write( DDR_REG_BASE + 0x507e7*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE + 0x507e8*4+0x02000000,0x7a5b); +reg_write( DDR_REG_BASE + 0x507e9*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x507ea*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x507eb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x507ec*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE + 0x507ed*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x507ee*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x507ef*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x507f0*4+0x02000000,0x16a); +reg_write( DDR_REG_BASE + 0x507f1*4+0x02000000,0x224f); +reg_write( DDR_REG_BASE + 0x507f2*4+0x02000000,0x240); +reg_write( DDR_REG_BASE + 0x507f3*4+0x02000000,0x1900); +reg_write( DDR_REG_BASE + 0x507f4*4+0x02000000,0x5); +reg_write( DDR_REG_BASE + 0x507f5*4+0x02000000,0xb140); +reg_write( DDR_REG_BASE + 0x507f6*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE + 0x507f7*4+0x02000000,0xb140); +reg_write( DDR_REG_BASE + 0x507f8*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x507f9*4+0x02000000,0x1900); +reg_write( DDR_REG_BASE + 0x507fa*4+0x02000000,0x5); +reg_write( DDR_REG_BASE + 0x507fb*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x507fc*4+0x02000000,0x80d); +reg_write( DDR_REG_BASE + 0x507fd*4+0x02000000,0x72); +reg_write( DDR_REG_BASE + 0x507fe*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x507ff*4+0x02000000,0x48ff); +reg_write( DDR_REG_BASE + 0x50800*4+0x02000000,0x2984); +reg_write( DDR_REG_BASE + 0x50801*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x50802*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x50803*4+0x02000000,0x782e); +reg_write( DDR_REG_BASE + 0x50804*4+0x02000000,0xc0f1); +reg_write( DDR_REG_BASE + 0x50805*4+0x02000000,0x4200); +reg_write( DDR_REG_BASE + 0x50806*4+0x02000000,0x95a); +reg_write( DDR_REG_BASE + 0x50807*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x50808*4+0x02000000,0x4020); +reg_write( DDR_REG_BASE + 0x50809*4+0x02000000,0x795b); +reg_write( DDR_REG_BASE + 0x5080a*4+0x02000000,0x2144); +reg_write( DDR_REG_BASE + 0x5080b*4+0x02000000,0x181); +reg_write( DDR_REG_BASE + 0x5080c*4+0x02000000,0xb9c4); +reg_write( DDR_REG_BASE + 0x5080d*4+0x02000000,0xe906); +reg_write( DDR_REG_BASE + 0x5080e*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE + 0x5080f*4+0x02000000,0x901); +reg_write( DDR_REG_BASE + 0x50810*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x50811*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x50812*4+0x02000000,0xc0d1); +reg_write( DDR_REG_BASE + 0x50813*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x50814*4+0x02000000,0xb8c1); +reg_write( DDR_REG_BASE + 0x50815*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x50816*4+0x02000000,0xc0f1); +reg_write( DDR_REG_BASE + 0x50817*4+0x02000000,0xc1a4); +reg_write( DDR_REG_BASE + 0x50818*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x50819*4+0x02000000,0xbe2); +reg_write( DDR_REG_BASE + 0x5081a*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x5081b*4+0x02000000,0xd9ff); +reg_write( DDR_REG_BASE + 0x5081c*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x5081d*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE + 0x5081e*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x5081f*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x50820*4+0x02000000,0xd85a); +reg_write( DDR_REG_BASE + 0x50821*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x50822*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x50823*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE + 0x50824*4+0x02000000,0xda09); +reg_write( DDR_REG_BASE + 0x50825*4+0x02000000,0xca2); +reg_write( DDR_REG_BASE + 0x50826*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x50827*4+0x02000000,0xdb20); +reg_write( DDR_REG_BASE + 0x50828*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x50829*4+0x02000000,0xc5a); +reg_write( DDR_REG_BASE + 0x5082a*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x5082b*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x5082c*4+0x02000000,0xc0a4); +reg_write( DDR_REG_BASE + 0x5082d*4+0x02000000,0xc0d1); +reg_write( DDR_REG_BASE + 0x5082e*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x5082f*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x50830*4+0x02000000,0xc3e1); +reg_write( DDR_REG_BASE + 0x50831*4+0x02000000,0xc2e1); +reg_write( DDR_REG_BASE + 0x50832*4+0x02000000,0xc1e1); +reg_write( DDR_REG_BASE + 0x50833*4+0x02000000,0xc0e1); +reg_write( DDR_REG_BASE + 0x50834*4+0x02000000,0xc0f1); +reg_write( DDR_REG_BASE + 0x50835*4+0x02000000,0xc1a1); +reg_write( DDR_REG_BASE + 0x50836*4+0x02000000,0x4220); +reg_write( DDR_REG_BASE + 0x50837*4+0x02000000,0xc184); +reg_write( DDR_REG_BASE + 0x50838*4+0x02000000,0xc140); +reg_write( DDR_REG_BASE + 0x50839*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x5083a*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE + 0x5083b*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5083c*4+0x02000000,0x12); +reg_write( DDR_REG_BASE + 0x5083d*4+0x02000000,0x80f); +reg_write( DDR_REG_BASE + 0x5083e*4+0x02000000,0x64); +reg_write( DDR_REG_BASE + 0x5083f*4+0x02000000,0x4040); +reg_write( DDR_REG_BASE + 0x50840*4+0x02000000,0xa6a); +reg_write( DDR_REG_BASE + 0x50841*4+0x02000000,0x1e0); +reg_write( DDR_REG_BASE + 0x50842*4+0x02000000,0xc100); +reg_write( DDR_REG_BASE + 0x50843*4+0x02000000,0x7487); +reg_write( DDR_REG_BASE + 0x50844*4+0x02000000,0xc0d1); +reg_write( DDR_REG_BASE + 0x50845*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x50846*4+0x02000000,0xc0a4); +reg_write( DDR_REG_BASE + 0x50847*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x50848*4+0x02000000,0x791d); +reg_write( DDR_REG_BASE + 0x50849*4+0x02000000,0x216c); +reg_write( DDR_REG_BASE + 0x5084a*4+0x02000000,0x102); +reg_write( DDR_REG_BASE + 0x5084b*4+0x02000000,0x206c); +reg_write( DDR_REG_BASE + 0x5084c*4+0x02000000,0x141); +reg_write( DDR_REG_BASE + 0x5084d*4+0x02000000,0x7822); +reg_write( DDR_REG_BASE + 0x5084e*4+0x02000000,0x621a); +reg_write( DDR_REG_BASE + 0x5084f*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x50850*4+0x02000000,0x784e); +reg_write( DDR_REG_BASE + 0x50851*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x50852*4+0x02000000,0xc0e6); +reg_write( DDR_REG_BASE + 0x50853*4+0x02000000,0x215f); +reg_write( DDR_REG_BASE + 0x50854*4+0x02000000,0x483); +reg_write( DDR_REG_BASE + 0x50855*4+0x02000000,0x44cb); +reg_write( DDR_REG_BASE + 0x50856*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50857*4+0x02000000,0x6b4); +reg_write( DDR_REG_BASE + 0x50858*4+0x02000000,0x70cd); +reg_write( DDR_REG_BASE + 0x50859*4+0x02000000,0x647a); +reg_write( DDR_REG_BASE + 0x5085a*4+0x02000000,0x8aa2); +reg_write( DDR_REG_BASE + 0x5085b*4+0x02000000,0x8a43); +reg_write( DDR_REG_BASE + 0x5085c*4+0x02000000,0x7d04); +reg_write( DDR_REG_BASE + 0x5085d*4+0x02000000,0xf00b); +reg_write( DDR_REG_BASE + 0x5085e*4+0x02000000,0x6199); +reg_write( DDR_REG_BASE + 0x5085f*4+0x02000000,0x89e4); +reg_write( DDR_REG_BASE + 0x50860*4+0x02000000,0x7f0b); +reg_write( DDR_REG_BASE + 0x50861*4+0x02000000,0xf206); +reg_write( DDR_REG_BASE + 0x50862*4+0x02000000,0x89e5); +reg_write( DDR_REG_BASE + 0x50863*4+0x02000000,0x79af); +reg_write( DDR_REG_BASE + 0x50864*4+0x02000000,0x210f); +reg_write( DDR_REG_BASE + 0x50865*4+0x02000000,0x3cd); +reg_write( DDR_REG_BASE + 0x50866*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE + 0x50867*4+0x02000000,0xef1); +reg_write( DDR_REG_BASE + 0x50868*4+0x02000000,0x90a4); +reg_write( DDR_REG_BASE + 0x50869*4+0x02000000,0x2314); +reg_write( DDR_REG_BASE + 0x5086a*4+0x02000000,0x381); +reg_write( DDR_REG_BASE + 0x5086b*4+0x02000000,0x78af); +reg_write( DDR_REG_BASE + 0x5086c*4+0x02000000,0xc4c6); +reg_write( DDR_REG_BASE + 0x5086d*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x5086e*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x5086f*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x50870*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x50871*4+0x02000000,0x206f); +reg_write( DDR_REG_BASE + 0x50872*4+0x02000000,0x843); +reg_write( DDR_REG_BASE + 0x50873*4+0x02000000,0x90e0); +reg_write( DDR_REG_BASE + 0x50874*4+0x02000000,0x10f1); +reg_write( DDR_REG_BASE + 0x50875*4+0x02000000,0x809b); +reg_write( DDR_REG_BASE + 0x50876*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x50877*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50878*4+0x02000000,0x7c4); +reg_write( DDR_REG_BASE + 0x50879*4+0x02000000,0xbea); +reg_write( DDR_REG_BASE + 0x5087a*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x5087b*4+0x02000000,0xc1a2); +reg_write( DDR_REG_BASE + 0x5087c*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x5087d*4+0x02000000,0x70c5); +reg_write( DDR_REG_BASE + 0x5087e*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x5087f*4+0x02000000,0xc0); +reg_write( DDR_REG_BASE + 0x50880*4+0x02000000,0xdca); +reg_write( DDR_REG_BASE + 0x50881*4+0x02000000,0x80); +reg_write( DDR_REG_BASE + 0x50882*4+0x02000000,0xb15); +reg_write( DDR_REG_BASE + 0x50883*4+0x02000000,0x307e); +reg_write( DDR_REG_BASE + 0x50884*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x50885*4+0x02000000,0x896); +reg_write( DDR_REG_BASE + 0x50886*4+0x02000000,0x80); +reg_write( DDR_REG_BASE + 0x50887*4+0x02000000,0xd56); +reg_write( DDR_REG_BASE + 0x50888*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x50889*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x5088a*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x5088b*4+0x02000000,0xf00f); +reg_write( DDR_REG_BASE + 0x5088c*4+0x02000000,0x886); +reg_write( DDR_REG_BASE + 0x5088d*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x5088e*4+0x02000000,0xd8c8); +reg_write( DDR_REG_BASE + 0x5088f*4+0x02000000,0xd46); +reg_write( DDR_REG_BASE + 0x50890*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x50891*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x50892*4+0x02000000,0x87a); +reg_write( DDR_REG_BASE + 0x50893*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x50894*4+0x02000000,0xd862); +reg_write( DDR_REG_BASE + 0x50895*4+0x02000000,0xd3a); +reg_write( DDR_REG_BASE + 0x50896*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x50897*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x50898*4+0x02000000,0x720c); +reg_write( DDR_REG_BASE + 0x50899*4+0x02000000,0x86e); +reg_write( DDR_REG_BASE + 0x5089a*4+0x02000000,0x80); +reg_write( DDR_REG_BASE + 0x5089b*4+0x02000000,0xd2e); +reg_write( DDR_REG_BASE + 0x5089c*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x5089d*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x5089e*4+0x02000000,0xe42); +reg_write( DDR_REG_BASE + 0x5089f*4+0x02000000,0xffcf); +reg_write( DDR_REG_BASE + 0x508a0*4+0x02000000,0xb09); +reg_write( DDR_REG_BASE + 0x508a1*4+0x02000000,0x307e); +reg_write( DDR_REG_BASE + 0x508a2*4+0x02000000,0x720c); +reg_write( DDR_REG_BASE + 0x508a3*4+0x02000000,0xf005); +reg_write( DDR_REG_BASE + 0x508a4*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x508a5*4+0x02000000,0x3); +reg_write( DDR_REG_BASE + 0x508a6*4+0x02000000,0xd40); +reg_write( DDR_REG_BASE + 0x508a7*4+0x02000000,0x852); +reg_write( DDR_REG_BASE + 0x508a8*4+0x02000000,0x80); +reg_write( DDR_REG_BASE + 0x508a9*4+0x02000000,0xd12); +reg_write( DDR_REG_BASE + 0x508aa*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x508ab*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x508ac*4+0x02000000,0xd823); +reg_write( DDR_REG_BASE + 0x508ad*4+0x02000000,0xb89f); +reg_write( DDR_REG_BASE + 0x508ae*4+0x02000000,0x8820); +reg_write( DDR_REG_BASE + 0x508af*4+0x02000000,0x1026); +reg_write( DDR_REG_BASE + 0x508b0*4+0x02000000,0x80); +reg_write( DDR_REG_BASE + 0x508b1*4+0x02000000,0x70cd); +reg_write( DDR_REG_BASE + 0x508b2*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x508b3*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x508b4*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x508b5*4+0x02000000,0xf010); +reg_write( DDR_REG_BASE + 0x508b6*4+0x02000000,0x2544); +reg_write( DDR_REG_BASE + 0x508b7*4+0x02000000,0x17c1); +reg_write( DDR_REG_BASE + 0x508b8*4+0x02000000,0xe905); +reg_write( DDR_REG_BASE + 0x508b9*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE + 0x508ba*4+0x02000000,0x9ff); +reg_write( DDR_REG_BASE + 0x508bb*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE + 0x508bc*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x508bd*4+0x02000000,0xc101); +reg_write( DDR_REG_BASE + 0x508be*4+0x02000000,0x782b); +reg_write( DDR_REG_BASE + 0x508bf*4+0x02000000,0xf205); +reg_write( DDR_REG_BASE + 0x508c0*4+0x02000000,0xd56); +reg_write( DDR_REG_BASE + 0x508c1*4+0x02000000,0x220); +reg_write( DDR_REG_BASE + 0x508c2*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x508c3*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE + 0x508c4*4+0x02000000,0xde5); +reg_write( DDR_REG_BASE + 0x508c5*4+0x02000000,0x90b4); +reg_write( DDR_REG_BASE + 0x508c6*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x508c7*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE + 0x508c8*4+0x02000000,0x4100); +reg_write( DDR_REG_BASE + 0x508c9*4+0x02000000,0x2644); +reg_write( DDR_REG_BASE + 0x508ca*4+0x02000000,0x17c0); +reg_write( DDR_REG_BASE + 0x508cb*4+0x02000000,0xe806); +reg_write( DDR_REG_BASE + 0x508cc*4+0x02000000,0xb861); +reg_write( DDR_REG_BASE + 0x508cd*4+0x02000000,0x801); +reg_write( DDR_REG_BASE + 0x508ce*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x508cf*4+0x02000000,0x793b); +reg_write( DDR_REG_BASE + 0x508d0*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x508d1*4+0x02000000,0x790b); +reg_write( DDR_REG_BASE + 0x508d2*4+0x02000000,0xf204); +reg_write( DDR_REG_BASE + 0x508d3*4+0x02000000,0xdae); +reg_write( DDR_REG_BASE + 0x508d4*4+0x02000000,0x220); +reg_write( DDR_REG_BASE + 0x508d5*4+0x02000000,0x782f); +reg_write( DDR_REG_BASE + 0x508d6*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE + 0x508d7*4+0x02000000,0xee5); +reg_write( DDR_REG_BASE + 0x508d8*4+0x02000000,0x90b4); +reg_write( DDR_REG_BASE + 0x508d9*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x508da*4+0x02000000,0xb09); +reg_write( DDR_REG_BASE + 0x508db*4+0x02000000,0x307e); +reg_write( DDR_REG_BASE + 0x508dc*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE + 0x508dd*4+0x02000000,0xf004); +reg_write( DDR_REG_BASE + 0x508de*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE + 0x508df*4+0x02000000,0xa0f); +reg_write( DDR_REG_BASE + 0x508e0*4+0x02000000,0xfde); +reg_write( DDR_REG_BASE + 0x508e1*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x508e2*4+0x02000000,0xc9e); +reg_write( DDR_REG_BASE + 0x508e3*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x508e4*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x508e5*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x508e6*4+0x02000000,0xf010); +reg_write( DDR_REG_BASE + 0x508e7*4+0x02000000,0x4100); +reg_write( DDR_REG_BASE + 0x508e8*4+0x02000000,0x2544); +reg_write( DDR_REG_BASE + 0x508e9*4+0x02000000,0x17c0); +reg_write( DDR_REG_BASE + 0x508ea*4+0x02000000,0xe805); +reg_write( DDR_REG_BASE + 0x508eb*4+0x02000000,0xb861); +reg_write( DDR_REG_BASE + 0x508ec*4+0x02000000,0x8ff); +reg_write( DDR_REG_BASE + 0x508ed*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE + 0x508ee*4+0x02000000,0x793b); +reg_write( DDR_REG_BASE + 0x508ef*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x508f0*4+0x02000000,0x790b); +reg_write( DDR_REG_BASE + 0x508f1*4+0x02000000,0xf205); +reg_write( DDR_REG_BASE + 0x508f2*4+0x02000000,0xcf2); +reg_write( DDR_REG_BASE + 0x508f3*4+0x02000000,0x220); +reg_write( DDR_REG_BASE + 0x508f4*4+0x02000000,0x782f); +reg_write( DDR_REG_BASE + 0x508f5*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE + 0x508f6*4+0x02000000,0xde3); +reg_write( DDR_REG_BASE + 0x508f7*4+0x02000000,0x90b4); +reg_write( DDR_REG_BASE + 0x508f8*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x508f9*4+0x02000000,0xb0b); +reg_write( DDR_REG_BASE + 0x508fa*4+0x02000000,0x307e); +reg_write( DDR_REG_BASE + 0x508fb*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x508fc*4+0x02000000,0xf004); +reg_write( DDR_REG_BASE + 0x508fd*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x508fe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x508ff*4+0x02000000,0x2710); +reg_write( DDR_REG_BASE + 0x50900*4+0x02000000,0xf9e); +reg_write( DDR_REG_BASE + 0x50901*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x50902*4+0x02000000,0xc5e); +reg_write( DDR_REG_BASE + 0x50903*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x50904*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x50905*4+0x02000000,0xf11); +reg_write( DDR_REG_BASE + 0x50906*4+0x02000000,0x131e); +reg_write( DDR_REG_BASE + 0x50907*4+0x02000000,0x9a6); +reg_write( DDR_REG_BASE + 0x50908*4+0x02000000,0xff8f); +reg_write( DDR_REG_BASE + 0x50909*4+0x02000000,0xbca); +reg_write( DDR_REG_BASE + 0x5090a*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x5090b*4+0x02000000,0xd80d); +reg_write( DDR_REG_BASE + 0x5090c*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x5090d*4+0x02000000,0xf01c); +reg_write( DDR_REG_BASE + 0x5090e*4+0x02000000,0x4100); +reg_write( DDR_REG_BASE + 0x5090f*4+0x02000000,0x2544); +reg_write( DDR_REG_BASE + 0x50910*4+0x02000000,0x17c0); +reg_write( DDR_REG_BASE + 0x50911*4+0x02000000,0xe806); +reg_write( DDR_REG_BASE + 0x50912*4+0x02000000,0xb861); +reg_write( DDR_REG_BASE + 0x50913*4+0x02000000,0x801); +reg_write( DDR_REG_BASE + 0x50914*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x50915*4+0x02000000,0x793b); +reg_write( DDR_REG_BASE + 0x50916*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x50917*4+0x02000000,0x790b); +reg_write( DDR_REG_BASE + 0x50918*4+0x02000000,0xf20f); +reg_write( DDR_REG_BASE + 0x50919*4+0x02000000,0xd8a); +reg_write( DDR_REG_BASE + 0x5091a*4+0x02000000,0x220); +reg_write( DDR_REG_BASE + 0x5091b*4+0x02000000,0x782f); +reg_write( DDR_REG_BASE + 0x5091c*4+0x02000000,0xb09); +reg_write( DDR_REG_BASE + 0x5091d*4+0x02000000,0x307e); +reg_write( DDR_REG_BASE + 0x5091e*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x5091f*4+0x02000000,0xf004); +reg_write( DDR_REG_BASE + 0x50920*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE + 0x50921*4+0x02000000,0xa0f); +reg_write( DDR_REG_BASE + 0x50922*4+0x02000000,0xf5a); +reg_write( DDR_REG_BASE + 0x50923*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x50924*4+0x02000000,0xc1a); +reg_write( DDR_REG_BASE + 0x50925*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x50926*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x50927*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE + 0x50928*4+0x02000000,0xdcd); +reg_write( DDR_REG_BASE + 0x50929*4+0x02000000,0x90b4); +reg_write( DDR_REG_BASE + 0x5092a*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x5092b*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x5092c*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x5092d*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x5092e*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5092f*4+0x02000000,0x7c4); +reg_write( DDR_REG_BASE + 0x50930*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x50931*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE + 0x50932*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x50933*4+0x02000000,0x600); +reg_write( DDR_REG_BASE + 0x50934*4+0x02000000,0xd8a); +reg_write( DDR_REG_BASE + 0x50935*4+0x02000000,0x220); +reg_write( DDR_REG_BASE + 0x50936*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x50937*4+0x02000000,0xc0a2); +reg_write( DDR_REG_BASE + 0x50938*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x50939*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x5093a*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x5093b*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x5093c*4+0x02000000,0xca04); +reg_write( DDR_REG_BASE + 0x5093d*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x5093e*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE + 0x5093f*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50940*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE + 0x50941*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE + 0x50942*4+0x02000000,0x8b20); +reg_write( DDR_REG_BASE + 0x50943*4+0x02000000,0xa0d); +reg_write( DDR_REG_BASE + 0x50944*4+0x02000000,0x44); +reg_write( DDR_REG_BASE + 0x50945*4+0x02000000,0x8b21); +reg_write( DDR_REG_BASE + 0x50946*4+0x02000000,0x919); +reg_write( DDR_REG_BASE + 0x50947*4+0x02000000,0x85); +reg_write( DDR_REG_BASE + 0x50948*4+0x02000000,0x221a); +reg_write( DDR_REG_BASE + 0x50949*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x5094a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5094b*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE + 0x5094c*4+0x02000000,0x2105); +reg_write( DDR_REG_BASE + 0x5094d*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x5094e*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x5094f*4+0x02000000,0x1f64); +reg_write( DDR_REG_BASE + 0x50950*4+0x02000000,0x1900); +reg_write( DDR_REG_BASE + 0x50951*4+0x02000000,0x5); +reg_write( DDR_REG_BASE + 0x50952*4+0x02000000,0x7144); +reg_write( DDR_REG_BASE + 0x50953*4+0x02000000,0xae1); +reg_write( DDR_REG_BASE + 0x50954*4+0x02000000,0x8004); +reg_write( DDR_REG_BASE + 0x50955*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x50956*4+0x02000000,0xc0f1); +reg_write( DDR_REG_BASE + 0x50957*4+0x02000000,0xc1a5); +reg_write( DDR_REG_BASE + 0x50958*4+0x02000000,0x4300); +reg_write( DDR_REG_BASE + 0x50959*4+0x02000000,0xc080); +reg_write( DDR_REG_BASE + 0x5095a*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x5095b*4+0x02000000,0xdde); +reg_write( DDR_REG_BASE + 0x5095c*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x5095d*4+0x02000000,0xda14); +reg_write( DDR_REG_BASE + 0x5095e*4+0x02000000,0x231a); +reg_write( DDR_REG_BASE + 0x5095f*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x50960*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x50961*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50962*4+0x02000000,0xc180); +reg_write( DDR_REG_BASE + 0x50963*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE + 0x50964*4+0x02000000,0xbea); +reg_write( DDR_REG_BASE + 0x50965*4+0x02000000,0x160); +reg_write( DDR_REG_BASE + 0x50966*4+0x02000000,0xb885); +reg_write( DDR_REG_BASE + 0x50967*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x50968*4+0x02000000,0xf6); +reg_write( DDR_REG_BASE + 0x50969*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5096a*4+0x02000000,0xd8e); +reg_write( DDR_REG_BASE + 0x5096b*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x5096c*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x5096d*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x5096e*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x5096f*4+0x02000000,0x89e); +reg_write( DDR_REG_BASE + 0x50970*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x50971*4+0x02000000,0xc280); +reg_write( DDR_REG_BASE + 0x50972*4+0x02000000,0xc0a5); +reg_write( DDR_REG_BASE + 0x50973*4+0x02000000,0xc0d1); +reg_write( DDR_REG_BASE + 0x50974*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x50975*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x50976*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x50977*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x50978*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x50979*4+0x02000000,0x2482); +reg_write( DDR_REG_BASE + 0x5097a*4+0x02000000,0x3d02); +reg_write( DDR_REG_BASE + 0x5097b*4+0x02000000,0x4748); +reg_write( DDR_REG_BASE + 0x5097c*4+0x02000000,0x4338); +reg_write( DDR_REG_BASE + 0x5097d*4+0x02000000,0x4308); +reg_write( DDR_REG_BASE + 0x5097e*4+0x02000000,0xc080); +reg_write( DDR_REG_BASE + 0x5097f*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x50980*4+0x02000000,0xd92); +reg_write( DDR_REG_BASE + 0x50981*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x50982*4+0x02000000,0xdab4); +reg_write( DDR_REG_BASE + 0x50983*4+0x02000000,0xb25); +reg_write( DDR_REG_BASE + 0x50984*4+0x02000000,0x10b1); +reg_write( DDR_REG_BASE + 0x50985*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x50986*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x50987*4+0x02000000,0xf2); +reg_write( DDR_REG_BASE + 0x50988*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x50989*4+0x02000000,0xd52); +reg_write( DDR_REG_BASE + 0x5098a*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x5098b*4+0x02000000,0x4260); +reg_write( DDR_REG_BASE + 0x5098c*4+0x02000000,0xc080); +reg_write( DDR_REG_BASE + 0x5098d*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x5098e*4+0x02000000,0xbe6); +reg_write( DDR_REG_BASE + 0x5098f*4+0x02000000,0x160); +reg_write( DDR_REG_BASE + 0x50990*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE + 0x50991*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x50992*4+0x02000000,0xd909); +reg_write( DDR_REG_BASE + 0x50993*4+0x02000000,0xf036); +reg_write( DDR_REG_BASE + 0x50994*4+0x02000000,0x231a); +reg_write( DDR_REG_BASE + 0x50995*4+0x02000000,0x3f9b); +reg_write( DDR_REG_BASE + 0x50996*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x50997*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50998*4+0x02000000,0xb1b); +reg_write( DDR_REG_BASE + 0x50999*4+0x02000000,0x1030); +reg_write( DDR_REG_BASE + 0x5099a*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x5099b*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x5099c*4+0x02000000,0xf4); +reg_write( DDR_REG_BASE + 0x5099d*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5099e*4+0x02000000,0xd26); +reg_write( DDR_REG_BASE + 0x5099f*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x509a0*4+0x02000000,0x4260); +reg_write( DDR_REG_BASE + 0x509a1*4+0x02000000,0xdd09); +reg_write( DDR_REG_BASE + 0x509a2*4+0x02000000,0xdec0); +reg_write( DDR_REG_BASE + 0x509a3*4+0x02000000,0xd8d0); +reg_write( DDR_REG_BASE + 0x509a4*4+0x02000000,0xf00a); +reg_write( DDR_REG_BASE + 0x509a5*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x509a6*4+0x02000000,0xf3); +reg_write( DDR_REG_BASE + 0x509a7*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x509a8*4+0x02000000,0xd12); +reg_write( DDR_REG_BASE + 0x509a9*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x509aa*4+0x02000000,0x4260); +reg_write( DDR_REG_BASE + 0x509ab*4+0x02000000,0x72ad); +reg_write( DDR_REG_BASE + 0x509ac*4+0x02000000,0xde8c); +reg_write( DDR_REG_BASE + 0x509ad*4+0x02000000,0xd880); +reg_write( DDR_REG_BASE + 0x509ae*4+0x02000000,0x60f8); +reg_write( DDR_REG_BASE + 0x509af*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x509b0*4+0x02000000,0x6c0); +reg_write( DDR_REG_BASE + 0x509b1*4+0x02000000,0xc180); +reg_write( DDR_REG_BASE + 0x509b2*4+0x02000000,0xb4e); +reg_write( DDR_REG_BASE + 0x509b3*4+0x02000000,0x160); +reg_write( DDR_REG_BASE + 0x509b4*4+0x02000000,0x724c); +reg_write( DDR_REG_BASE + 0x509b5*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x509b6*4+0x02000000,0x722c); +reg_write( DDR_REG_BASE + 0x509b7*4+0x02000000,0x80e); +reg_write( DDR_REG_BASE + 0x509b8*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x509b9*4+0x02000000,0xc280); +reg_write( DDR_REG_BASE + 0x509ba*4+0x02000000,0xc080); +reg_write( DDR_REG_BASE + 0x509bb*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x509bc*4+0x02000000,0xd1a); +reg_write( DDR_REG_BASE + 0x509bd*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x509be*4+0x02000000,0xdab4); +reg_write( DDR_REG_BASE + 0x509bf*4+0x02000000,0x66fe); +reg_write( DDR_REG_BASE + 0x509c0*4+0x02000000,0x2605); +reg_write( DDR_REG_BASE + 0x509c1*4+0x02000000,0x16c0); +reg_write( DDR_REG_BASE + 0x509c2*4+0x02000000,0xc180); +reg_write( DDR_REG_BASE + 0x509c3*4+0x02000000,0xb2e); +reg_write( DDR_REG_BASE + 0x509c4*4+0x02000000,0x160); +reg_write( DDR_REG_BASE + 0x509c5*4+0x02000000,0x42a1); +reg_write( DDR_REG_BASE + 0x509c6*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x509c7*4+0x02000000,0x41a1); +reg_write( DDR_REG_BASE + 0x509c8*4+0x02000000,0xfea); +reg_write( DDR_REG_BASE + 0x509c9*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE + 0x509ca*4+0x02000000,0xc280); +reg_write( DDR_REG_BASE + 0x509cb*4+0x02000000,0x2480); +reg_write( DDR_REG_BASE + 0x509cc*4+0x02000000,0x3d02); +reg_write( DDR_REG_BASE + 0x509cd*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x509ce*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x509cf*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x509d0*4+0x02000000,0xc3e2); +reg_write( DDR_REG_BASE + 0x509d1*4+0x02000000,0x2482); +reg_write( DDR_REG_BASE + 0x509d2*4+0x02000000,0x3d02); +reg_write( DDR_REG_BASE + 0x509d3*4+0x02000000,0x4528); +reg_write( DDR_REG_BASE + 0x509d4*4+0x02000000,0x4300); +reg_write( DDR_REG_BASE + 0x509d5*4+0x02000000,0xc080); +reg_write( DDR_REG_BASE + 0x509d6*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x509d7*4+0x02000000,0xce6); +reg_write( DDR_REG_BASE + 0x509d8*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x509d9*4+0x02000000,0xdab4); +reg_write( DDR_REG_BASE + 0x509da*4+0x02000000,0x2354); +reg_write( DDR_REG_BASE + 0x509db*4+0x02000000,0xd00); +reg_write( DDR_REG_BASE + 0x509dc*4+0x02000000,0xc180); +reg_write( DDR_REG_BASE + 0x509dd*4+0x02000000,0xafa); +reg_write( DDR_REG_BASE + 0x509de*4+0x02000000,0x160); +reg_write( DDR_REG_BASE + 0x509df*4+0x02000000,0xda09); +reg_write( DDR_REG_BASE + 0x509e0*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x509e1*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x509e2*4+0x02000000,0xf5); +reg_write( DDR_REG_BASE + 0x509e3*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x509e4*4+0x02000000,0xc9a); +reg_write( DDR_REG_BASE + 0x509e5*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x509e6*4+0x02000000,0x42a1); +reg_write( DDR_REG_BASE + 0x509e7*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x509e8*4+0x02000000,0xd909); +reg_write( DDR_REG_BASE + 0x509e9*4+0x02000000,0xfaa); +reg_write( DDR_REG_BASE + 0x509ea*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE + 0x509eb*4+0x02000000,0xc280); +reg_write( DDR_REG_BASE + 0x509ec*4+0x02000000,0xc7c2); +reg_write( DDR_REG_BASE + 0x509ed*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x509ee*4+0x02000000,0xc0f1); +reg_write( DDR_REG_BASE + 0x509ef*4+0x02000000,0x2482); +reg_write( DDR_REG_BASE + 0x509f0*4+0x02000000,0x3d02); +reg_write( DDR_REG_BASE + 0x509f1*4+0x02000000,0xc080); +reg_write( DDR_REG_BASE + 0x509f2*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x509f3*4+0x02000000,0xcae); +reg_write( DDR_REG_BASE + 0x509f4*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x509f5*4+0x02000000,0xdab4); +reg_write( DDR_REG_BASE + 0x509f6*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x509f7*4+0x02000000,0xf7); +reg_write( DDR_REG_BASE + 0x509f8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x509f9*4+0x02000000,0xc72); +reg_write( DDR_REG_BASE + 0x509fa*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x509fb*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x509fc*4+0x02000000,0xd840); +reg_write( DDR_REG_BASE + 0x509fd*4+0x02000000,0xc180); +reg_write( DDR_REG_BASE + 0x509fe*4+0x02000000,0xab6); +reg_write( DDR_REG_BASE + 0x509ff*4+0x02000000,0x160); +reg_write( DDR_REG_BASE + 0x50a00*4+0x02000000,0xda09); +reg_write( DDR_REG_BASE + 0x50a01*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x50a02*4+0x02000000,0xd909); +reg_write( DDR_REG_BASE + 0x50a03*4+0x02000000,0xf76); +reg_write( DDR_REG_BASE + 0x50a04*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE + 0x50a05*4+0x02000000,0xc280); +reg_write( DDR_REG_BASE + 0x50a06*4+0x02000000,0x2480); +reg_write( DDR_REG_BASE + 0x50a07*4+0x02000000,0x3d02); +reg_write( DDR_REG_BASE + 0x50a08*4+0x02000000,0xc0d1); +reg_write( DDR_REG_BASE + 0x50a09*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x50a0a*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x50a0b*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x50a0c*4+0x02000000,0x42eb); +reg_write( DDR_REG_BASE + 0x50a0d*4+0x02000000,0xc0e6); +reg_write( DDR_REG_BASE + 0x50a0e*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE + 0x50a0f*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x50a10*4+0x02000000,0xe4); +reg_write( DDR_REG_BASE + 0x50a11*4+0x02000000,0x42c3); +reg_write( DDR_REG_BASE + 0x50a12*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50a13*4+0x02000000,0x7b2); +reg_write( DDR_REG_BASE + 0x50a14*4+0x02000000,0x833); +reg_write( DDR_REG_BASE + 0x50a15*4+0x02000000,0xb0); +reg_write( DDR_REG_BASE + 0x50a16*4+0x02000000,0x718d); +reg_write( DDR_REG_BASE + 0x50a17*4+0x02000000,0x7114); +reg_write( DDR_REG_BASE + 0x50a18*4+0x02000000,0xd823); +reg_write( DDR_REG_BASE + 0x50a19*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE + 0x50a1a*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x50a1b*4+0x02000000,0x30); +reg_write( DDR_REG_BASE + 0x50a1c*4+0x02000000,0xb89f); +reg_write( DDR_REG_BASE + 0x50a1d*4+0x02000000,0xf427); +reg_write( DDR_REG_BASE + 0x50a1e*4+0x02000000,0x8a25); +reg_write( DDR_REG_BASE + 0x50a1f*4+0x02000000,0xaa23); +reg_write( DDR_REG_BASE + 0x50a20*4+0x02000000,0x8aa4); +reg_write( DDR_REG_BASE + 0x50a21*4+0x02000000,0x7c34); +reg_write( DDR_REG_BASE + 0x50a22*4+0x02000000,0xaaa2); +reg_write( DDR_REG_BASE + 0x50a23*4+0x02000000,0x96c0); +reg_write( DDR_REG_BASE + 0x50a24*4+0x02000000,0x88e0); +reg_write( DDR_REG_BASE + 0x50a25*4+0x02000000,0x78bb); +reg_write( DDR_REG_BASE + 0x50a26*4+0x02000000,0xb3e0); +reg_write( DDR_REG_BASE + 0x50a27*4+0x02000000,0xaa00); +reg_write( DDR_REG_BASE + 0x50a28*4+0x02000000,0xe4d); +reg_write( DDR_REG_BASE + 0x50a29*4+0x02000000,0x1171); +reg_write( DDR_REG_BASE + 0x50a2a*4+0x02000000,0xaa81); +reg_write( DDR_REG_BASE + 0x50a2b*4+0x02000000,0xb3e1); +reg_write( DDR_REG_BASE + 0x50a2c*4+0x02000000,0xf024); +reg_write( DDR_REG_BASE + 0x50a2d*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x50a2e*4+0x02000000,0xb300); +reg_write( DDR_REG_BASE + 0x50a2f*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x50a30*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE + 0x50a31*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50a32*4+0x02000000,0x49); +reg_write( DDR_REG_BASE + 0x50a33*4+0x02000000,0xb321); +reg_write( DDR_REG_BASE + 0x50a34*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE + 0x50a35*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x50a36*4+0x02000000,0xf6); +reg_write( DDR_REG_BASE + 0x50a37*4+0x02000000,0xb300); +reg_write( DDR_REG_BASE + 0x50a38*4+0x02000000,0xb304); +reg_write( DDR_REG_BASE + 0x50a39*4+0x02000000,0x1b06); +reg_write( DDR_REG_BASE + 0x50a3a*4+0x02000000,0x3c5); +reg_write( DDR_REG_BASE + 0x50a3b*4+0x02000000,0x8a27); +reg_write( DDR_REG_BASE + 0x50a3c*4+0x02000000,0xaa23); +reg_write( DDR_REG_BASE + 0x50a3d*4+0x02000000,0x8a06); +reg_write( DDR_REG_BASE + 0x50a3e*4+0x02000000,0xf818); +reg_write( DDR_REG_BASE + 0x50a3f*4+0x02000000,0x1bfe); +reg_write( DDR_REG_BASE + 0x50a40*4+0x02000000,0x83c5); +reg_write( DDR_REG_BASE + 0x50a41*4+0x02000000,0x4759); +reg_write( DDR_REG_BASE + 0x50a42*4+0x02000000,0xc4c6); +reg_write( DDR_REG_BASE + 0x50a43*4+0x02000000,0x88a0); +reg_write( DDR_REG_BASE + 0x50a44*4+0x02000000,0xb3a0); +reg_write( DDR_REG_BASE + 0x50a45*4+0x02000000,0x8a27); +reg_write( DDR_REG_BASE + 0x50a46*4+0x02000000,0xaa23); +reg_write( DDR_REG_BASE + 0x50a47*4+0x02000000,0x8a04); +reg_write( DDR_REG_BASE + 0x50a48*4+0x02000000,0xf813); +reg_write( DDR_REG_BASE + 0x50a49*4+0x02000000,0x9600); +reg_write( DDR_REG_BASE + 0x50a4a*4+0x02000000,0x827); +reg_write( DDR_REG_BASE + 0x50a4b*4+0x02000000,0x151); +reg_write( DDR_REG_BASE + 0x50a4c*4+0x02000000,0xb3a1); +reg_write( DDR_REG_BASE + 0x50a4d*4+0x02000000,0xf016); +reg_write( DDR_REG_BASE + 0x50a4e*4+0x02000000,0x1b02); +reg_write( DDR_REG_BASE + 0x50a4f*4+0x02000000,0x5); +reg_write( DDR_REG_BASE + 0x50a50*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x50a51*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x50a52*4+0x02000000,0xfe); +reg_write( DDR_REG_BASE + 0x50a53*4+0x02000000,0x1800); +reg_write( DDR_REG_BASE + 0x50a54*4+0x02000000,0x3c5); +reg_write( DDR_REG_BASE + 0x50a55*4+0x02000000,0x18f8); +reg_write( DDR_REG_BASE + 0x50a56*4+0x02000000,0x83c5); +reg_write( DDR_REG_BASE + 0x50a57*4+0x02000000,0x18f6); +reg_write( DDR_REG_BASE + 0x50a58*4+0x02000000,0x8005); +reg_write( DDR_REG_BASE + 0x50a59*4+0x02000000,0x18fe); +reg_write( DDR_REG_BASE + 0x50a5a*4+0x02000000,0x8005); +reg_write( DDR_REG_BASE + 0x50a5b*4+0x02000000,0x4759); +reg_write( DDR_REG_BASE + 0x50a5c*4+0x02000000,0xc4c6); +reg_write( DDR_REG_BASE + 0x50a5d*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x50a5e*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x50a5f*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50a60*4+0x02000000,0x49); +reg_write( DDR_REG_BASE + 0x50a61*4+0x02000000,0xb301); +reg_write( DDR_REG_BASE + 0x50a62*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x50a63*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x50a64*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x50a65*4+0x02000000,0xf6); +reg_write( DDR_REG_BASE + 0x50a66*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE + 0x50a67*4+0x02000000,0xb024); +reg_write( DDR_REG_BASE + 0x50a68*4+0x02000000,0x18fe); +reg_write( DDR_REG_BASE + 0x50a69*4+0x02000000,0x8044); +reg_write( DDR_REG_BASE + 0x50a6a*4+0x02000000,0xb023); +reg_write( DDR_REG_BASE + 0x50a6b*4+0x02000000,0x4759); +reg_write( DDR_REG_BASE + 0x50a6c*4+0x02000000,0xc4c6); +reg_write( DDR_REG_BASE + 0x50a6d*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x50a6e*4+0x02000000,0x7c34); +reg_write( DDR_REG_BASE + 0x50a6f*4+0x02000000,0xaa02); +reg_write( DDR_REG_BASE + 0x50a70*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x50a71*4+0x02000000,0xaa00); +reg_write( DDR_REG_BASE + 0x50a72*4+0x02000000,0xaa81); +reg_write( DDR_REG_BASE + 0x50a73*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x50a74*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x50a75*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x50a76*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x50a77*4+0x02000000,0x47cb); +reg_write( DDR_REG_BASE + 0x50a78*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x50a79*4+0x02000000,0x1e0); +reg_write( DDR_REG_BASE + 0x50a7a*4+0x02000000,0x9720); +reg_write( DDR_REG_BASE + 0x50a7b*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x50a7c*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x50a7d*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50a7e*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x50a7f*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x50a80*4+0x02000000,0x205f); +reg_write( DDR_REG_BASE + 0x50a81*4+0x02000000,0x100); +reg_write( DDR_REG_BASE + 0x50a82*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE + 0x50a83*4+0x02000000,0x7c2); +reg_write( DDR_REG_BASE + 0x50a84*4+0x02000000,0x4020); +reg_write( DDR_REG_BASE + 0x50a85*4+0x02000000,0xea06); +reg_write( DDR_REG_BASE + 0x50a86*4+0x02000000,0xba61); +reg_write( DDR_REG_BASE + 0x50a87*4+0x02000000,0xa01); +reg_write( DDR_REG_BASE + 0x50a88*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x50a89*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x50a8a*4+0x02000000,0xb8c3); +reg_write( DDR_REG_BASE + 0x50a8b*4+0x02000000,0x80f); +reg_write( DDR_REG_BASE + 0x50a8c*4+0x02000000,0x70); +reg_write( DDR_REG_BASE + 0x50a8d*4+0x02000000,0xc1a1); +reg_write( DDR_REG_BASE + 0x50a8e*4+0x02000000,0x807); +reg_write( DDR_REG_BASE + 0x50a8f*4+0x02000000,0x190); +reg_write( DDR_REG_BASE + 0x50a90*4+0x02000000,0x71ad); +reg_write( DDR_REG_BASE + 0x50a91*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x50a92*4+0x02000000,0x996); +reg_write( DDR_REG_BASE + 0x50a93*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x50a94*4+0x02000000,0xd940); +reg_write( DDR_REG_BASE + 0x50a95*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE + 0x50a96*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE + 0x50a97*4+0x02000000,0xe112); +reg_write( DDR_REG_BASE + 0x50a98*4+0x02000000,0x1ede); +reg_write( DDR_REG_BASE + 0x50a99*4+0x02000000,0x1055); +reg_write( DDR_REG_BASE + 0x50a9a*4+0x02000000,0x1ea6); +reg_write( DDR_REG_BASE + 0x50a9b*4+0x02000000,0x9055); +reg_write( DDR_REG_BASE + 0x50a9c*4+0x02000000,0x17b6); +reg_write( DDR_REG_BASE + 0x50a9d*4+0x02000000,0x9100); +reg_write( DDR_REG_BASE + 0x50a9e*4+0x02000000,0x716f); +reg_write( DDR_REG_BASE + 0x50a9f*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x50aa0*4+0x02000000,0xed29); +reg_write( DDR_REG_BASE + 0x50aa1*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE + 0x50aa2*4+0x02000000,0x84f); +reg_write( DDR_REG_BASE + 0x50aa3*4+0x02000000,0x3bf); +reg_write( DDR_REG_BASE + 0x50aa4*4+0x02000000,0xd91c); +reg_write( DDR_REG_BASE + 0x50aa5*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE + 0x50aa6*4+0x02000000,0x2084); +reg_write( DDR_REG_BASE + 0x50aa7*4+0x02000000,0xc07); +reg_write( DDR_REG_BASE + 0x50aa8*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x50aa9*4+0x02000000,0xb88f); +reg_write( DDR_REG_BASE + 0x50aaa*4+0x02000000,0xb600); +reg_write( DDR_REG_BASE + 0x50aab*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x50aac*4+0x02000000,0x962); +reg_write( DDR_REG_BASE + 0x50aad*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x50aae*4+0x02000000,0x1ef6); +reg_write( DDR_REG_BASE + 0x50aaf*4+0x02000000,0x9205); +reg_write( DDR_REG_BASE + 0x50ab0*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x50ab1*4+0x02000000,0xf); +reg_write( DDR_REG_BASE + 0x50ab2*4+0x02000000,0x4240); +reg_write( DDR_REG_BASE + 0x50ab3*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x50ab4*4+0x02000000,0x952); +reg_write( DDR_REG_BASE + 0x50ab5*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x50ab6*4+0x02000000,0x1ef6); +reg_write( DDR_REG_BASE + 0x50ab7*4+0x02000000,0x9245); +reg_write( DDR_REG_BASE + 0x50ab8*4+0x02000000,0x17be); +reg_write( DDR_REG_BASE + 0x50ab9*4+0x02000000,0x9100); +reg_write( DDR_REG_BASE + 0x50aba*4+0x02000000,0x1ef0); +reg_write( DDR_REG_BASE + 0x50abb*4+0x02000000,0x9045); +reg_write( DDR_REG_BASE + 0x50abc*4+0x02000000,0x1ef6); +reg_write( DDR_REG_BASE + 0x50abd*4+0x02000000,0x9205); +reg_write( DDR_REG_BASE + 0x50abe*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x50abf*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x50ac0*4+0x02000000,0x2004); +reg_write( DDR_REG_BASE + 0x50ac1*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x50ac2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50ac3*4+0x02000000,0x3e00); +reg_write( DDR_REG_BASE + 0x50ac4*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE + 0x50ac5*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x50ac6*4+0x02000000,0xb88e); +reg_write( DDR_REG_BASE + 0x50ac7*4+0x02000000,0xb600); +reg_write( DDR_REG_BASE + 0x50ac8*4+0x02000000,0xf005); +reg_write( DDR_REG_BASE + 0x50ac9*4+0x02000000,0x1ef6); +reg_write( DDR_REG_BASE + 0x50aca*4+0x02000000,0x9205); +reg_write( DDR_REG_BASE + 0x50acb*4+0x02000000,0x1ef0); +reg_write( DDR_REG_BASE + 0x50acc*4+0x02000000,0x9045); +reg_write( DDR_REG_BASE + 0x50acd*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x50ace*4+0x02000000,0x76c4); +reg_write( DDR_REG_BASE + 0x50acf*4+0x02000000,0x9013); +reg_write( DDR_REG_BASE + 0x50ad0*4+0x02000000,0xe050); +reg_write( DDR_REG_BASE + 0x50ad1*4+0x02000000,0x7487); +reg_write( DDR_REG_BASE + 0x50ad2*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x50ad3*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x50ad4*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x50ad5*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x50ad6*4+0x02000000,0xc2e2); +reg_write( DDR_REG_BASE + 0x50ad7*4+0x02000000,0xc1a4); +reg_write( DDR_REG_BASE + 0x50ad8*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x50ad9*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x50ada*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x50adb*4+0x02000000,0xdb08); +reg_write( DDR_REG_BASE + 0x50adc*4+0x02000000,0x4528); +reg_write( DDR_REG_BASE + 0x50add*4+0x02000000,0xc143); +reg_write( DDR_REG_BASE + 0x50ade*4+0x02000000,0xc142); +reg_write( DDR_REG_BASE + 0x50adf*4+0x02000000,0xc141); +reg_write( DDR_REG_BASE + 0x50ae0*4+0x02000000,0xf2a); +reg_write( DDR_REG_BASE + 0x50ae1*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE + 0x50ae2*4+0x02000000,0xc140); +reg_write( DDR_REG_BASE + 0x50ae3*4+0x02000000,0xd90c); +reg_write( DDR_REG_BASE + 0x50ae4*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x50ae5*4+0x02000000,0xb990); +reg_write( DDR_REG_BASE + 0x50ae6*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE + 0x50ae7*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x50ae8*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x50ae9*4+0x02000000,0x1c08); +reg_write( DDR_REG_BASE + 0x50aea*4+0x02000000,0x3101); +reg_write( DDR_REG_BASE + 0x50aeb*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x50aec*4+0x02000000,0xf12); +reg_write( DDR_REG_BASE + 0x50aed*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE + 0x50aee*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x50aef*4+0x02000000,0xc0a4); +reg_write( DDR_REG_BASE + 0x50af0*4+0x02000000,0xc6c2); +reg_write( DDR_REG_BASE + 0x50af1*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x50af2*4+0x02000000,0xc2e4); +reg_write( DDR_REG_BASE + 0x50af3*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x50af4*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x50af5*4+0x02000000,0x256f); +reg_write( DDR_REG_BASE + 0x50af6*4+0x02000000,0x1343); +reg_write( DDR_REG_BASE + 0x50af7*4+0x02000000,0x4320); +reg_write( DDR_REG_BASE + 0x50af8*4+0x02000000,0x9520); +reg_write( DDR_REG_BASE + 0x50af9*4+0x02000000,0x218c); +reg_write( DDR_REG_BASE + 0x50afa*4+0x02000000,0x864a); +reg_write( DDR_REG_BASE + 0x50afb*4+0x02000000,0x7a); +reg_write( DDR_REG_BASE + 0x50afc*4+0x02000000,0x2d); +reg_write( DDR_REG_BASE + 0x50afd*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x50afe*4+0x02000000,0xa0e); +reg_write( DDR_REG_BASE + 0x50aff*4+0x02000000,0xffcf); +reg_write( DDR_REG_BASE + 0x50b00*4+0x02000000,0x260a); +reg_write( DDR_REG_BASE + 0x50b01*4+0x02000000,0x3000); +reg_write( DDR_REG_BASE + 0x50b02*4+0x02000000,0x15fe); +reg_write( DDR_REG_BASE + 0x50b03*4+0x02000000,0x9080); +reg_write( DDR_REG_BASE + 0x50b04*4+0x02000000,0x706f); +reg_write( DDR_REG_BASE + 0x50b05*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x50b06*4+0x02000000,0xf8d); +reg_write( DDR_REG_BASE + 0x50b07*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x50b08*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50b09*4+0x02000000,0xf02b); +reg_write( DDR_REG_BASE + 0x50b0a*4+0x02000000,0x231a); +reg_write( DDR_REG_BASE + 0x50b0b*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x50b0c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50b0d*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x50b0e*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x50b0f*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x50b10*4+0x02000000,0x341); +reg_write( DDR_REG_BASE + 0x50b11*4+0x02000000,0x4063); +reg_write( DDR_REG_BASE + 0x50b12*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x50b13*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x50b14*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x50b15*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x50b16*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x50b17*4+0x02000000,0xf8e); +reg_write( DDR_REG_BASE + 0x50b18*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x50b19*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50b1a*4+0x02000000,0xa5e); +reg_write( DDR_REG_BASE + 0x50b1b*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x50b1c*4+0x02000000,0x9600); +reg_write( DDR_REG_BASE + 0x50b1d*4+0x02000000,0xe01c); +reg_write( DDR_REG_BASE + 0x50b1e*4+0x02000000,0x7a0e); +reg_write( DDR_REG_BASE + 0x50b1f*4+0x02000000,0x785c); +reg_write( DDR_REG_BASE + 0x50b20*4+0x02000000,0x781c); +reg_write( DDR_REG_BASE + 0x50b21*4+0x02000000,0x781c); +reg_write( DDR_REG_BASE + 0x50b22*4+0x02000000,0x781c); +reg_write( DDR_REG_BASE + 0x50b23*4+0x02000000,0x4100); +reg_write( DDR_REG_BASE + 0x50b24*4+0x02000000,0xd81b); +reg_write( DDR_REG_BASE + 0x50b25*4+0x02000000,0xb861); +reg_write( DDR_REG_BASE + 0x50b26*4+0x02000000,0x8ff); +reg_write( DDR_REG_BASE + 0x50b27*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE + 0x50b28*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE + 0x50b29*4+0x02000000,0x7167); +reg_write( DDR_REG_BASE + 0x50b2a*4+0x02000000,0x6238); +reg_write( DDR_REG_BASE + 0x50b2b*4+0x02000000,0xb8c4); +reg_write( DDR_REG_BASE + 0x50b2c*4+0x02000000,0x4831); +reg_write( DDR_REG_BASE + 0x50b2d*4+0x02000000,0x2a44); +reg_write( DDR_REG_BASE + 0x50b2e*4+0x02000000,0x800); +reg_write( DDR_REG_BASE + 0x50b2f*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x50b30*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x50b31*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x50b32*4+0x02000000,0xb600); +reg_write( DDR_REG_BASE + 0x50b33*4+0x02000000,0xbb1); +reg_write( DDR_REG_BASE + 0x50b34*4+0x02000000,0xb0b4); +reg_write( DDR_REG_BASE + 0x50b35*4+0x02000000,0x2655); +reg_write( DDR_REG_BASE + 0x50b36*4+0x02000000,0x3800); +reg_write( DDR_REG_BASE + 0x50b37*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x50b38*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x50b39*4+0x02000000,0xc6c4); +reg_write( DDR_REG_BASE + 0x50b3a*4+0x02000000,0xc2e2); +reg_write( DDR_REG_BASE + 0x50b3b*4+0x02000000,0x45cb); +reg_write( DDR_REG_BASE + 0x50b3c*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x50b3d*4+0x02000000,0x6); +reg_write( DDR_REG_BASE + 0x50b3e*4+0x02000000,0xd820); +reg_write( DDR_REG_BASE + 0x50b3f*4+0x02000000,0xfe6); +reg_write( DDR_REG_BASE + 0x50b40*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x50b41*4+0x02000000,0x1d00); +reg_write( DDR_REG_BASE + 0x50b42*4+0x02000000,0x1045); +reg_write( DDR_REG_BASE + 0x50b43*4+0x02000000,0x1d00); +reg_write( DDR_REG_BASE + 0x50b44*4+0x02000000,0x1005); +reg_write( DDR_REG_BASE + 0x50b45*4+0x02000000,0xc6c2); +reg_write( DDR_REG_BASE + 0x50b46*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x50b47*4+0x02000000,0x45cb); +reg_write( DDR_REG_BASE + 0x50b48*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x50b49*4+0x02000000,0x1c6); +reg_write( DDR_REG_BASE + 0x50b4a*4+0x02000000,0x95c0); +reg_write( DDR_REG_BASE + 0x50b4b*4+0x02000000,0xbecb); +reg_write( DDR_REG_BASE + 0x50b4c*4+0x02000000,0x264f); +reg_write( DDR_REG_BASE + 0x50b4d*4+0x02000000,0x12cf); +reg_write( DDR_REG_BASE + 0x50b4e*4+0x02000000,0x2605); +reg_write( DDR_REG_BASE + 0x50b4f*4+0x02000000,0x1f80); +reg_write( DDR_REG_BASE + 0x50b50*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50b51*4+0x02000000,0xc00); +reg_write( DDR_REG_BASE + 0x50b52*4+0x02000000,0xb5e0); +reg_write( DDR_REG_BASE + 0x50b53*4+0x02000000,0xb500); +reg_write( DDR_REG_BASE + 0x50b54*4+0x02000000,0xfba); +reg_write( DDR_REG_BASE + 0x50b55*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x50b56*4+0x02000000,0xd80a); +reg_write( DDR_REG_BASE + 0x50b57*4+0x02000000,0xb5e0); +reg_write( DDR_REG_BASE + 0x50b58*4+0x02000000,0x9501); +reg_write( DDR_REG_BASE + 0x50b59*4+0x02000000,0xb5c0); +reg_write( DDR_REG_BASE + 0x50b5a*4+0x02000000,0xb8c9); +reg_write( DDR_REG_BASE + 0x50b5b*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x50b5c*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x50b5d*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x50b5e*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x50b5f*4+0x02000000,0xc1a6); +reg_write( DDR_REG_BASE + 0x50b60*4+0x02000000,0x4378); +reg_write( DDR_REG_BASE + 0x50b61*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x50b62*4+0x02000000,0x7103); +reg_write( DDR_REG_BASE + 0x50b63*4+0x02000000,0x9018); +reg_write( DDR_REG_BASE + 0x50b64*4+0x02000000,0x1dc); +reg_write( DDR_REG_BASE + 0x50b65*4+0x02000000,0x1201); +reg_write( DDR_REG_BASE + 0x50b66*4+0x02000000,0x308d); +reg_write( DDR_REG_BASE + 0x50b67*4+0x02000000,0xc70b); +reg_write( DDR_REG_BASE + 0x50b68*4+0x02000000,0x264a); +reg_write( DDR_REG_BASE + 0x50b69*4+0x02000000,0x3000); +reg_write( DDR_REG_BASE + 0x50b6a*4+0x02000000,0x706c); +reg_write( DDR_REG_BASE + 0x50b6b*4+0x02000000,0x47db); +reg_write( DDR_REG_BASE + 0x50b6c*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x50b6d*4+0x02000000,0x200); +reg_write( DDR_REG_BASE + 0x50b6e*4+0x02000000,0xf00f); +reg_write( DDR_REG_BASE + 0x50b6f*4+0x02000000,0x2305); +reg_write( DDR_REG_BASE + 0x50b70*4+0x02000000,0x17cc); +reg_write( DDR_REG_BASE + 0x50b71*4+0x02000000,0x9480); +reg_write( DDR_REG_BASE + 0x50b72*4+0x02000000,0xc680); +reg_write( DDR_REG_BASE + 0x50b73*4+0x02000000,0x667e); +reg_write( DDR_REG_BASE + 0x50b74*4+0x02000000,0xae80); +reg_write( DDR_REG_BASE + 0x50b75*4+0x02000000,0x2740); +reg_write( DDR_REG_BASE + 0x50b76*4+0x02000000,0x380c); +reg_write( DDR_REG_BASE + 0x50b77*4+0x02000000,0x2405); +reg_write( DDR_REG_BASE + 0x50b78*4+0x02000000,0x12cc); +reg_write( DDR_REG_BASE + 0x50b79*4+0x02000000,0x9480); +reg_write( DDR_REG_BASE + 0x50b7a*4+0x02000000,0x7164); +reg_write( DDR_REG_BASE + 0x50b7b*4+0x02000000,0xe40c); +reg_write( DDR_REG_BASE + 0x50b7c*4+0x02000000,0xae8c); +reg_write( DDR_REG_BASE + 0x50b7d*4+0x02000000,0xbe7); +reg_write( DDR_REG_BASE + 0x50b7e*4+0x02000000,0x82b4); +reg_write( DDR_REG_BASE + 0x50b7f*4+0x02000000,0x232f); +reg_write( DDR_REG_BASE + 0x50b80*4+0x02000000,0x10c0); +reg_write( DDR_REG_BASE + 0x50b81*4+0x02000000,0xe58c); +reg_write( DDR_REG_BASE + 0x50b82*4+0x02000000,0x256); +reg_write( DDR_REG_BASE + 0x50b83*4+0x02000000,0x2d); +reg_write( DDR_REG_BASE + 0x50b84*4+0x02000000,0x238a); +reg_write( DDR_REG_BASE + 0x50b85*4+0x02000000,0x205); +reg_write( DDR_REG_BASE + 0x50b86*4+0x02000000,0xb7f); +reg_write( DDR_REG_BASE + 0x50b87*4+0x02000000,0x36e); +reg_write( DDR_REG_BASE + 0x50b88*4+0x02000000,0x738d); +reg_write( DDR_REG_BASE + 0x50b89*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x50b8a*4+0x02000000,0x72ad); +reg_write( DDR_REG_BASE + 0x50b8b*4+0x02000000,0x1b00); +reg_write( DDR_REG_BASE + 0x50b8c*4+0x02000000,0x3302); +reg_write( DDR_REG_BASE + 0x50b8d*4+0x02000000,0x1f02); +reg_write( DDR_REG_BASE + 0x50b8e*4+0x02000000,0x1782); +reg_write( DDR_REG_BASE + 0x50b8f*4+0x02000000,0x1f01); +reg_write( DDR_REG_BASE + 0x50b90*4+0x02000000,0x1782); +reg_write( DDR_REG_BASE + 0x50b91*4+0x02000000,0x1f00); +reg_write( DDR_REG_BASE + 0x50b92*4+0x02000000,0x1782); +reg_write( DDR_REG_BASE + 0x50b93*4+0x02000000,0xa962); +reg_write( DDR_REG_BASE + 0x50b94*4+0x02000000,0xa981); +reg_write( DDR_REG_BASE + 0x50b95*4+0x02000000,0xa9a0); +reg_write( DDR_REG_BASE + 0x50b96*4+0x02000000,0xaaa4); +reg_write( DDR_REG_BASE + 0x50b97*4+0x02000000,0x1a03); +reg_write( DDR_REG_BASE + 0x50b98*4+0x02000000,0x43); +reg_write( DDR_REG_BASE + 0x50b99*4+0x02000000,0x1a02); +reg_write( DDR_REG_BASE + 0x50b9a*4+0x02000000,0x782); +reg_write( DDR_REG_BASE + 0x50b9b*4+0x02000000,0xc120); +reg_write( DDR_REG_BASE + 0x50b9c*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50b9d*4+0x02000000,0xa9a0); +reg_write( DDR_REG_BASE + 0x50b9e*4+0x02000000,0x1401); +reg_write( DDR_REG_BASE + 0x50b9f*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50ba0*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50ba1*4+0x02000000,0xa9a0); +reg_write( DDR_REG_BASE + 0x50ba2*4+0x02000000,0x1402); +reg_write( DDR_REG_BASE + 0x50ba3*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50ba4*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50ba5*4+0x02000000,0xa9a0); +reg_write( DDR_REG_BASE + 0x50ba6*4+0x02000000,0x1403); +reg_write( DDR_REG_BASE + 0x50ba7*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50ba8*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50ba9*4+0x02000000,0xa9a0); +reg_write( DDR_REG_BASE + 0x50baa*4+0x02000000,0xc121); +reg_write( DDR_REG_BASE + 0x50bab*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50bac*4+0x02000000,0xa980); +reg_write( DDR_REG_BASE + 0x50bad*4+0x02000000,0x1405); +reg_write( DDR_REG_BASE + 0x50bae*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50baf*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50bb0*4+0x02000000,0xa980); +reg_write( DDR_REG_BASE + 0x50bb1*4+0x02000000,0x1406); +reg_write( DDR_REG_BASE + 0x50bb2*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50bb3*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50bb4*4+0x02000000,0xa980); +reg_write( DDR_REG_BASE + 0x50bb5*4+0x02000000,0x1407); +reg_write( DDR_REG_BASE + 0x50bb6*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50bb7*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50bb8*4+0x02000000,0xa980); +reg_write( DDR_REG_BASE + 0x50bb9*4+0x02000000,0xc122); +reg_write( DDR_REG_BASE + 0x50bba*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50bbb*4+0x02000000,0xa960); +reg_write( DDR_REG_BASE + 0x50bbc*4+0x02000000,0x1409); +reg_write( DDR_REG_BASE + 0x50bbd*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50bbe*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50bbf*4+0x02000000,0xa960); +reg_write( DDR_REG_BASE + 0x50bc0*4+0x02000000,0x180b); +reg_write( DDR_REG_BASE + 0x50bc1*4+0x02000000,0x782); +reg_write( DDR_REG_BASE + 0x50bc2*4+0x02000000,0x180a); +reg_write( DDR_REG_BASE + 0x50bc3*4+0x02000000,0x43); +reg_write( DDR_REG_BASE + 0x50bc4*4+0x02000000,0xf0e9); +reg_write( DDR_REG_BASE + 0x50bc5*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE + 0x50bc6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50bc7*4+0x02000000,0x1400); +reg_write( DDR_REG_BASE + 0x50bc8*4+0x02000000,0x2311); +reg_write( DDR_REG_BASE + 0x50bc9*4+0x02000000,0x8340); +reg_write( DDR_REG_BASE + 0x50bca*4+0x02000000,0xf2e3); +reg_write( DDR_REG_BASE + 0x50bcb*4+0x02000000,0x718d); +reg_write( DDR_REG_BASE + 0x50bcc*4+0x02000000,0xaf85); +reg_write( DDR_REG_BASE + 0x50bcd*4+0x02000000,0xaf84); +reg_write( DDR_REG_BASE + 0x50bce*4+0x02000000,0xaf83); +reg_write( DDR_REG_BASE + 0x50bcf*4+0x02000000,0x1f02); +reg_write( DDR_REG_BASE + 0x50bd0*4+0x02000000,0x1782); +reg_write( DDR_REG_BASE + 0x50bd1*4+0x02000000,0x1f01); +reg_write( DDR_REG_BASE + 0x50bd2*4+0x02000000,0x1782); +reg_write( DDR_REG_BASE + 0x50bd3*4+0x02000000,0x1f00); +reg_write( DDR_REG_BASE + 0x50bd4*4+0x02000000,0x1782); +reg_write( DDR_REG_BASE + 0x50bd5*4+0x02000000,0x76ef); +reg_write( DDR_REG_BASE + 0x50bd6*4+0x02000000,0xe58c); +reg_write( DDR_REG_BASE + 0x50bd7*4+0x02000000,0xde08); +reg_write( DDR_REG_BASE + 0x50bd8*4+0x02000000,0xdf07); +reg_write( DDR_REG_BASE + 0x50bd9*4+0x02000000,0x73ad); +reg_write( DDR_REG_BASE + 0x50bda*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE + 0x50bdb*4+0x02000000,0x746d); +reg_write( DDR_REG_BASE + 0x50bdc*4+0x02000000,0x1b00); +reg_write( DDR_REG_BASE + 0x50bdd*4+0x02000000,0x37c2); +reg_write( DDR_REG_BASE + 0x50bde*4+0x02000000,0xf467); +reg_write( DDR_REG_BASE + 0x50bdf*4+0x02000000,0xa9c5); +reg_write( DDR_REG_BASE + 0x50be0*4+0x02000000,0xa9e4); +reg_write( DDR_REG_BASE + 0x50be1*4+0x02000000,0x1903); +reg_write( DDR_REG_BASE + 0x50be2*4+0x02000000,0x7c2); +reg_write( DDR_REG_BASE + 0x50be3*4+0x02000000,0xa9a2); +reg_write( DDR_REG_BASE + 0x50be4*4+0x02000000,0xa961); +reg_write( DDR_REG_BASE + 0x50be5*4+0x02000000,0xa980); +reg_write( DDR_REG_BASE + 0x50be6*4+0x02000000,0x752c); +reg_write( DDR_REG_BASE + 0x50be7*4+0x02000000,0xaa28); +reg_write( DDR_REG_BASE + 0x50be8*4+0x02000000,0x1a07); +reg_write( DDR_REG_BASE + 0x50be9*4+0x02000000,0x2c2); +reg_write( DDR_REG_BASE + 0x50bea*4+0x02000000,0xaaa6); +reg_write( DDR_REG_BASE + 0x50beb*4+0x02000000,0xaa63); +reg_write( DDR_REG_BASE + 0x50bec*4+0x02000000,0xaa82); +reg_write( DDR_REG_BASE + 0x50bed*4+0x02000000,0x1a01); +reg_write( DDR_REG_BASE + 0x50bee*4+0x02000000,0x782); +reg_write( DDR_REG_BASE + 0x50bef*4+0x02000000,0xc120); +reg_write( DDR_REG_BASE + 0x50bf0*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50bf1*4+0x02000000,0xa9a0); +reg_write( DDR_REG_BASE + 0x50bf2*4+0x02000000,0x1401); +reg_write( DDR_REG_BASE + 0x50bf3*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50bf4*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50bf5*4+0x02000000,0xa980); +reg_write( DDR_REG_BASE + 0x50bf6*4+0x02000000,0x1402); +reg_write( DDR_REG_BASE + 0x50bf7*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50bf8*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50bf9*4+0x02000000,0xa9a0); +reg_write( DDR_REG_BASE + 0x50bfa*4+0x02000000,0x1403); +reg_write( DDR_REG_BASE + 0x50bfb*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50bfc*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50bfd*4+0x02000000,0xa960); +reg_write( DDR_REG_BASE + 0x50bfe*4+0x02000000,0xc121); +reg_write( DDR_REG_BASE + 0x50bff*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c00*4+0x02000000,0xa960); +reg_write( DDR_REG_BASE + 0x50c01*4+0x02000000,0x1405); +reg_write( DDR_REG_BASE + 0x50c02*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50c03*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c04*4+0x02000000,0xa980); +reg_write( DDR_REG_BASE + 0x50c05*4+0x02000000,0x1406); +reg_write( DDR_REG_BASE + 0x50c06*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50c07*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c08*4+0x02000000,0xa960); +reg_write( DDR_REG_BASE + 0x50c09*4+0x02000000,0x1407); +reg_write( DDR_REG_BASE + 0x50c0a*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50c0b*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c0c*4+0x02000000,0xa960); +reg_write( DDR_REG_BASE + 0x50c0d*4+0x02000000,0xc122); +reg_write( DDR_REG_BASE + 0x50c0e*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c0f*4+0x02000000,0xa980); +reg_write( DDR_REG_BASE + 0x50c10*4+0x02000000,0x1409); +reg_write( DDR_REG_BASE + 0x50c11*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50c12*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c13*4+0x02000000,0xa980); +reg_write( DDR_REG_BASE + 0x50c14*4+0x02000000,0x180b); +reg_write( DDR_REG_BASE + 0x50c15*4+0x02000000,0x243); +reg_write( DDR_REG_BASE + 0x50c16*4+0x02000000,0x180a); +reg_write( DDR_REG_BASE + 0x50c17*4+0x02000000,0x2c2); +reg_write( DDR_REG_BASE + 0x50c18*4+0x02000000,0xc123); +reg_write( DDR_REG_BASE + 0x50c19*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c1a*4+0x02000000,0xa9e0); +reg_write( DDR_REG_BASE + 0x50c1b*4+0x02000000,0x140d); +reg_write( DDR_REG_BASE + 0x50c1c*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50c1d*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c1e*4+0x02000000,0xa9c0); +reg_write( DDR_REG_BASE + 0x50c1f*4+0x02000000,0x140e); +reg_write( DDR_REG_BASE + 0x50c20*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50c21*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c22*4+0x02000000,0xa9c0); +reg_write( DDR_REG_BASE + 0x50c23*4+0x02000000,0x140f); +reg_write( DDR_REG_BASE + 0x50c24*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50c25*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c26*4+0x02000000,0xa9c0); +reg_write( DDR_REG_BASE + 0x50c27*4+0x02000000,0xc124); +reg_write( DDR_REG_BASE + 0x50c28*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c29*4+0x02000000,0xa9e0); +reg_write( DDR_REG_BASE + 0x50c2a*4+0x02000000,0x1411); +reg_write( DDR_REG_BASE + 0x50c2b*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50c2c*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c2d*4+0x02000000,0x1900); +reg_write( DDR_REG_BASE + 0x50c2e*4+0x02000000,0x7c2); +reg_write( DDR_REG_BASE + 0x50c2f*4+0x02000000,0x1412); +reg_write( DDR_REG_BASE + 0x50c30*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50c31*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c32*4+0x02000000,0x1900); +reg_write( DDR_REG_BASE + 0x50c33*4+0x02000000,0x7c2); +reg_write( DDR_REG_BASE + 0x50c34*4+0x02000000,0x1413); +reg_write( DDR_REG_BASE + 0x50c35*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50c36*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c37*4+0x02000000,0xa9e0); +reg_write( DDR_REG_BASE + 0x50c38*4+0x02000000,0xc125); +reg_write( DDR_REG_BASE + 0x50c39*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c3a*4+0x02000000,0x1900); +reg_write( DDR_REG_BASE + 0x50c3b*4+0x02000000,0x7c2); +reg_write( DDR_REG_BASE + 0x50c3c*4+0x02000000,0x1415); +reg_write( DDR_REG_BASE + 0x50c3d*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50c3e*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c3f*4+0x02000000,0xa9e0); +reg_write( DDR_REG_BASE + 0x50c40*4+0x02000000,0x752c); +reg_write( DDR_REG_BASE + 0x50c41*4+0x02000000,0x1817); +reg_write( DDR_REG_BASE + 0x50c42*4+0x02000000,0x283); +reg_write( DDR_REG_BASE + 0x50c43*4+0x02000000,0xa836); +reg_write( DDR_REG_BASE + 0x50c44*4+0x02000000,0xf069); +reg_write( DDR_REG_BASE + 0x50c45*4+0x02000000,0x234a); +reg_write( DDR_REG_BASE + 0x50c46*4+0x02000000,0x3240); +reg_write( DDR_REG_BASE + 0x50c47*4+0x02000000,0x1905); +reg_write( DDR_REG_BASE + 0x50c48*4+0x02000000,0x6c2); +reg_write( DDR_REG_BASE + 0x50c49*4+0x02000000,0xa9c4); +reg_write( DDR_REG_BASE + 0x50c4a*4+0x02000000,0xa9e3); +reg_write( DDR_REG_BASE + 0x50c4b*4+0x02000000,0x1902); +reg_write( DDR_REG_BASE + 0x50c4c*4+0x02000000,0x2c2); +reg_write( DDR_REG_BASE + 0x50c4d*4+0x02000000,0xa9a1); +reg_write( DDR_REG_BASE + 0x50c4e*4+0x02000000,0xa960); +reg_write( DDR_REG_BASE + 0x50c4f*4+0x02000000,0x752c); +reg_write( DDR_REG_BASE + 0x50c50*4+0x02000000,0xaa29); +reg_write( DDR_REG_BASE + 0x50c51*4+0x02000000,0x1a08); +reg_write( DDR_REG_BASE + 0x50c52*4+0x02000000,0x2c2); +reg_write( DDR_REG_BASE + 0x50c53*4+0x02000000,0xaaa7); +reg_write( DDR_REG_BASE + 0x50c54*4+0x02000000,0xaa64); +reg_write( DDR_REG_BASE + 0x50c55*4+0x02000000,0xaa83); +reg_write( DDR_REG_BASE + 0x50c56*4+0x02000000,0x1a02); +reg_write( DDR_REG_BASE + 0x50c57*4+0x02000000,0x782); +reg_write( DDR_REG_BASE + 0x50c58*4+0x02000000,0xc120); +reg_write( DDR_REG_BASE + 0x50c59*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c5a*4+0x02000000,0xa960); +reg_write( DDR_REG_BASE + 0x50c5b*4+0x02000000,0x1401); +reg_write( DDR_REG_BASE + 0x50c5c*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50c5d*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c5e*4+0x02000000,0xa960); +reg_write( DDR_REG_BASE + 0x50c5f*4+0x02000000,0x1402); +reg_write( DDR_REG_BASE + 0x50c60*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50c61*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c62*4+0x02000000,0xa960); +reg_write( DDR_REG_BASE + 0x50c63*4+0x02000000,0x1403); +reg_write( DDR_REG_BASE + 0x50c64*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50c65*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c66*4+0x02000000,0xa960); +reg_write( DDR_REG_BASE + 0x50c67*4+0x02000000,0xc121); +reg_write( DDR_REG_BASE + 0x50c68*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c69*4+0x02000000,0xa9a0); +reg_write( DDR_REG_BASE + 0x50c6a*4+0x02000000,0x1405); +reg_write( DDR_REG_BASE + 0x50c6b*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50c6c*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c6d*4+0x02000000,0xa9a0); +reg_write( DDR_REG_BASE + 0x50c6e*4+0x02000000,0x1406); +reg_write( DDR_REG_BASE + 0x50c6f*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50c70*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c71*4+0x02000000,0xa9a0); +reg_write( DDR_REG_BASE + 0x50c72*4+0x02000000,0x1407); +reg_write( DDR_REG_BASE + 0x50c73*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50c74*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c75*4+0x02000000,0xa9a0); +reg_write( DDR_REG_BASE + 0x50c76*4+0x02000000,0xc122); +reg_write( DDR_REG_BASE + 0x50c77*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c78*4+0x02000000,0x1900); +reg_write( DDR_REG_BASE + 0x50c79*4+0x02000000,0x2c2); +reg_write( DDR_REG_BASE + 0x50c7a*4+0x02000000,0x1409); +reg_write( DDR_REG_BASE + 0x50c7b*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50c7c*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c7d*4+0x02000000,0x1900); +reg_write( DDR_REG_BASE + 0x50c7e*4+0x02000000,0x2c2); +reg_write( DDR_REG_BASE + 0x50c7f*4+0x02000000,0x180b); +reg_write( DDR_REG_BASE + 0x50c80*4+0x02000000,0x782); +reg_write( DDR_REG_BASE + 0x50c81*4+0x02000000,0xa88a); +reg_write( DDR_REG_BASE + 0x50c82*4+0x02000000,0xc123); +reg_write( DDR_REG_BASE + 0x50c83*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c84*4+0x02000000,0xa9e0); +reg_write( DDR_REG_BASE + 0x50c85*4+0x02000000,0x140d); +reg_write( DDR_REG_BASE + 0x50c86*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50c87*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c88*4+0x02000000,0xa9e0); +reg_write( DDR_REG_BASE + 0x50c89*4+0x02000000,0x140e); +reg_write( DDR_REG_BASE + 0x50c8a*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50c8b*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c8c*4+0x02000000,0xa9e0); +reg_write( DDR_REG_BASE + 0x50c8d*4+0x02000000,0x140f); +reg_write( DDR_REG_BASE + 0x50c8e*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50c8f*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c90*4+0x02000000,0xa9e0); +reg_write( DDR_REG_BASE + 0x50c91*4+0x02000000,0xc124); +reg_write( DDR_REG_BASE + 0x50c92*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c93*4+0x02000000,0xa9c0); +reg_write( DDR_REG_BASE + 0x50c94*4+0x02000000,0x1411); +reg_write( DDR_REG_BASE + 0x50c95*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50c96*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c97*4+0x02000000,0xa9c0); +reg_write( DDR_REG_BASE + 0x50c98*4+0x02000000,0x1412); +reg_write( DDR_REG_BASE + 0x50c99*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50c9a*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c9b*4+0x02000000,0xa9c0); +reg_write( DDR_REG_BASE + 0x50c9c*4+0x02000000,0x1413); +reg_write( DDR_REG_BASE + 0x50c9d*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50c9e*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c9f*4+0x02000000,0xa9c0); +reg_write( DDR_REG_BASE + 0x50ca0*4+0x02000000,0xc125); +reg_write( DDR_REG_BASE + 0x50ca1*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50ca2*4+0x02000000,0x1900); +reg_write( DDR_REG_BASE + 0x50ca3*4+0x02000000,0x6c2); +reg_write( DDR_REG_BASE + 0x50ca4*4+0x02000000,0x1415); +reg_write( DDR_REG_BASE + 0x50ca5*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50ca6*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50ca7*4+0x02000000,0x1900); +reg_write( DDR_REG_BASE + 0x50ca8*4+0x02000000,0x6c2); +reg_write( DDR_REG_BASE + 0x50ca9*4+0x02000000,0x752c); +reg_write( DDR_REG_BASE + 0x50caa*4+0x02000000,0xa837); +reg_write( DDR_REG_BASE + 0x50cab*4+0x02000000,0x1816); +reg_write( DDR_REG_BASE + 0x50cac*4+0x02000000,0x7c2); +reg_write( DDR_REG_BASE + 0x50cad*4+0x02000000,0xc0a6); +reg_write( DDR_REG_BASE + 0x50cae*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x50caf*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x50cb0*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x50cb1*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x50cb2*4+0x02000000,0x7014); +reg_write( DDR_REG_BASE + 0x50cb3*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x50cb4*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x50cb5*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50cb6*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x50cb7*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x50cb8*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x50cb9*4+0x02000000,0x168); +reg_write( DDR_REG_BASE + 0x50cba*4+0x02000000,0x21c2); +reg_write( DDR_REG_BASE + 0x50cbb*4+0x02000000,0x222); +reg_write( DDR_REG_BASE + 0x50cbc*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x50cbd*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x50cbe*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x50cbf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50cc0*4+0x02000000,0x7905); +reg_write( DDR_REG_BASE + 0x50cc1*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x50cc2*4+0x02000000,0x9100); +reg_write( DDR_REG_BASE + 0x50cc3*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x50cc4*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x50cc5*4+0x02000000,0x7100); +reg_write( DDR_REG_BASE + 0x50cc6*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50cc7*4+0x02000000,0x6e); +reg_write( DDR_REG_BASE + 0x50cc8*4+0x02000000,0x7014); +reg_write( DDR_REG_BASE + 0x50cc9*4+0x02000000,0x7de0); +reg_write( DDR_REG_BASE + 0x50cca*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x50ccb*4+0x02000000,0x7100); +reg_write( DDR_REG_BASE + 0x50ccc*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x50ccd*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x50cce*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x50ccf*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x50cd0*4+0x02000000,0xc2e4); +reg_write( DDR_REG_BASE + 0x50cd1*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE + 0x50cd2*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50cd3*4+0x02000000,0x7b1); +reg_write( DDR_REG_BASE + 0x50cd4*4+0x02000000,0x8b00); +reg_write( DDR_REG_BASE + 0x50cd5*4+0x02000000,0xe62); +reg_write( DDR_REG_BASE + 0x50cd6*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE + 0x50cd7*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x50cd8*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x50cd9*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE + 0x50cda*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50cdb*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x50cdc*4+0x02000000,0x8b82); +reg_write( DDR_REG_BASE + 0x50cdd*4+0x02000000,0x8b41); +reg_write( DDR_REG_BASE + 0x50cde*4+0x02000000,0x211a); +reg_write( DDR_REG_BASE + 0x50cdf*4+0x02000000,0xf8d); +reg_write( DDR_REG_BASE + 0x50ce0*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x50ce1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50ce2*4+0x02000000,0x776c); +reg_write( DDR_REG_BASE + 0x50ce3*4+0x02000000,0xf01c); +reg_write( DDR_REG_BASE + 0x50ce4*4+0x02000000,0x221a); +reg_write( DDR_REG_BASE + 0x50ce5*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x50ce6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50ce7*4+0x02000000,0x800); +reg_write( DDR_REG_BASE + 0x50ce8*4+0x02000000,0x2104); +reg_write( DDR_REG_BASE + 0x50ce9*4+0x02000000,0xf8e); +reg_write( DDR_REG_BASE + 0x50cea*4+0x02000000,0x37fe); +reg_write( DDR_REG_BASE + 0x50ceb*4+0x02000000,0xf000); +reg_write( DDR_REG_BASE + 0x50cec*4+0x02000000,0x2055); +reg_write( DDR_REG_BASE + 0x50ced*4+0x02000000,0x801); +reg_write( DDR_REG_BASE + 0x50cee*4+0x02000000,0x79a5); +reg_write( DDR_REG_BASE + 0x50cef*4+0x02000000,0x79c5); +reg_write( DDR_REG_BASE + 0x50cf0*4+0x02000000,0x6ac1); +reg_write( DDR_REG_BASE + 0x50cf1*4+0x02000000,0x229a); +reg_write( DDR_REG_BASE + 0x50cf2*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x50cf3*4+0x02000000,0x2284); +reg_write( DDR_REG_BASE + 0x50cf4*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x50cf5*4+0x02000000,0x7a25); +reg_write( DDR_REG_BASE + 0x50cf6*4+0x02000000,0x795b); +reg_write( DDR_REG_BASE + 0x50cf7*4+0x02000000,0xb991); +reg_write( DDR_REG_BASE + 0x50cf8*4+0x02000000,0xb99c); +reg_write( DDR_REG_BASE + 0x50cf9*4+0x02000000,0xb99f); +reg_write( DDR_REG_BASE + 0x50cfa*4+0x02000000,0x9120); +reg_write( DDR_REG_BASE + 0x50cfb*4+0x02000000,0x42c1); +reg_write( DDR_REG_BASE + 0x50cfc*4+0x02000000,0x2108); +reg_write( DDR_REG_BASE + 0x50cfd*4+0x02000000,0xc3); +reg_write( DDR_REG_BASE + 0x50cfe*4+0x02000000,0xccd); +reg_write( DDR_REG_BASE + 0x50cff*4+0x02000000,0x9085); +reg_write( DDR_REG_BASE + 0x50d00*4+0x02000000,0x4060); +reg_write( DDR_REG_BASE + 0x50d01*4+0x02000000,0xd908); +reg_write( DDR_REG_BASE + 0x50d02*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE + 0x50d03*4+0x02000000,0x901); +reg_write( DDR_REG_BASE + 0x50d04*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x50d05*4+0x02000000,0x781c); +reg_write( DDR_REG_BASE + 0x50d06*4+0x02000000,0x796f); +reg_write( DDR_REG_BASE + 0x50d07*4+0x02000000,0x2179); +reg_write( DDR_REG_BASE + 0x50d08*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x50d09*4+0x02000000,0x6038); +reg_write( DDR_REG_BASE + 0x50d0a*4+0x02000000,0x7204); +reg_write( DDR_REG_BASE + 0x50d0b*4+0x02000000,0xc6c4); +reg_write( DDR_REG_BASE + 0x50d0c*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x50d0d*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x50d0e*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50d0f*4+0x02000000,0x32); +reg_write( DDR_REG_BASE + 0x50d10*4+0x02000000,0x5); +reg_write( DDR_REG_BASE + 0x50d11*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50d12*4+0x02000000,0xb8c3); +reg_write( DDR_REG_BASE + 0x50d13*4+0x02000000,0x6829); +reg_write( DDR_REG_BASE + 0x50d14*4+0x02000000,0x92b); +reg_write( DDR_REG_BASE + 0x50d15*4+0x02000000,0x3b5); +reg_write( DDR_REG_BASE + 0x50d16*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE + 0x50d17*4+0x02000000,0x2025); +reg_write( DDR_REG_BASE + 0x50d18*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x50d19*4+0x02000000,0xf012); +reg_write( DDR_REG_BASE + 0x50d1a*4+0x02000000,0xf00f); +reg_write( DDR_REG_BASE + 0x50d1b*4+0x02000000,0xf00f); +reg_write( DDR_REG_BASE + 0x50d1c*4+0x02000000,0xf00b); +reg_write( DDR_REG_BASE + 0x50d1d*4+0x02000000,0xf00f); +reg_write( DDR_REG_BASE + 0x50d1e*4+0x02000000,0xf00f); +reg_write( DDR_REG_BASE + 0x50d1f*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE + 0x50d20*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE + 0x50d21*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE + 0x50d22*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE + 0x50d23*4+0x02000000,0xf007); +reg_write( DDR_REG_BASE + 0x50d24*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE + 0x50d25*4+0x02000000,0xf005); +reg_write( DDR_REG_BASE + 0x50d26*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE + 0x50d27*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x50d28*4+0x02000000,0x760c); +reg_write( DDR_REG_BASE + 0x50d29*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x50d2a*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x50d2b*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x50d2c*4+0x02000000,0xd807); +reg_write( DDR_REG_BASE + 0x50d2d*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x50d2e*4+0x02000000,0xd808); +reg_write( DDR_REG_BASE + 0x50d2f*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x50d30*4+0x02000000,0xd809); +reg_write( DDR_REG_BASE + 0x50d31*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x50d32*4+0x02000000,0xd80a); +reg_write( DDR_REG_BASE + 0x50d33*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x50d34*4+0x02000000,0xd80b); +reg_write( DDR_REG_BASE + 0x50d35*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x50d36*4+0x02000000,0xd80c); +reg_write( DDR_REG_BASE + 0x50d37*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x50d38*4+0x02000000,0xd80e); +reg_write( DDR_REG_BASE + 0x50d39*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x50d3a*4+0x02000000,0xd810); +reg_write( DDR_REG_BASE + 0x50d3b*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x50d3c*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x50d3d*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x50d3e*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50d3f*4+0x02000000,0x32); +reg_write( DDR_REG_BASE + 0x50d40*4+0x02000000,0x5); +reg_write( DDR_REG_BASE + 0x50d41*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50d42*4+0x02000000,0x2053); +reg_write( DDR_REG_BASE + 0x50d43*4+0x02000000,0xc1); +reg_write( DDR_REG_BASE + 0x50d44*4+0x02000000,0x6949); +reg_write( DDR_REG_BASE + 0x50d45*4+0x02000000,0xa3f); +reg_write( DDR_REG_BASE + 0x50d46*4+0x02000000,0x3b5); +reg_write( DDR_REG_BASE + 0x50d47*4+0x02000000,0x791d); +reg_write( DDR_REG_BASE + 0x50d48*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE + 0x50d49*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE + 0x50d4a*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE + 0x50d4b*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE + 0x50d4c*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE + 0x50d4d*4+0x02000000,0x720c); +reg_write( DDR_REG_BASE + 0x50d4e*4+0x02000000,0x2025); +reg_write( DDR_REG_BASE + 0x50d4f*4+0x02000000,0x80); +reg_write( DDR_REG_BASE + 0x50d50*4+0x02000000,0xf014); +reg_write( DDR_REG_BASE + 0x50d51*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE + 0x50d52*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE + 0x50d53*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE + 0x50d54*4+0x02000000,0xf00a); +reg_write( DDR_REG_BASE + 0x50d55*4+0x02000000,0xf00a); +reg_write( DDR_REG_BASE + 0x50d56*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE + 0x50d57*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE + 0x50d58*4+0x02000000,0xf008); +reg_write( DDR_REG_BASE + 0x50d59*4+0x02000000,0xf008); +reg_write( DDR_REG_BASE + 0x50d5a*4+0x02000000,0xf009); +reg_write( DDR_REG_BASE + 0x50d5b*4+0x02000000,0xf014); +reg_write( DDR_REG_BASE + 0x50d5c*4+0x02000000,0xf007); +reg_write( DDR_REG_BASE + 0x50d5d*4+0x02000000,0xf015); +reg_write( DDR_REG_BASE + 0x50d5e*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x50d5f*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x50d60*4+0x02000000,0xb9e0); +reg_write( DDR_REG_BASE + 0x50d61*4+0x02000000,0xd80a); +reg_write( DDR_REG_BASE + 0x50d62*4+0x02000000,0xf009); +reg_write( DDR_REG_BASE + 0x50d63*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x50d64*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x50d65*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x50d66*4+0x02000000,0x740c); +reg_write( DDR_REG_BASE + 0x50d67*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x50d68*4+0x02000000,0x760c); +reg_write( DDR_REG_BASE + 0x50d69*4+0x02000000,0xb9e0); +reg_write( DDR_REG_BASE + 0x50d6a*4+0x02000000,0xd809); +reg_write( DDR_REG_BASE + 0x50d6b*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x50d6c*4+0x02000000,0x20ca); +reg_write( DDR_REG_BASE + 0x50d6d*4+0x02000000,0x1e1); +reg_write( DDR_REG_BASE + 0x50d6e*4+0x02000000,0xb9e0); +reg_write( DDR_REG_BASE + 0x50d6f*4+0x02000000,0xd80c); +reg_write( DDR_REG_BASE + 0x50d70*4+0x02000000,0xf003); +reg_write( DDR_REG_BASE + 0x50d71*4+0x02000000,0xb9e0); +reg_write( DDR_REG_BASE + 0x50d72*4+0x02000000,0xd80e); +reg_write( DDR_REG_BASE + 0x50d73*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x50d74*4+0x02000000,0x20ca); +reg_write( DDR_REG_BASE + 0x50d75*4+0x02000000,0x261); +reg_write( DDR_REG_BASE + 0x50d76*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x50d77*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50d78*4+0x02000000,0x7b2); +reg_write( DDR_REG_BASE + 0x50d79*4+0x02000000,0x8881); +reg_write( DDR_REG_BASE + 0x50d7a*4+0x02000000,0x8860); +reg_write( DDR_REG_BASE + 0x50d7b*4+0x02000000,0xf022); +reg_write( DDR_REG_BASE + 0x50d7c*4+0x02000000,0x231a); +reg_write( DDR_REG_BASE + 0x50d7d*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x50d7e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50d7f*4+0x02000000,0x800); +reg_write( DDR_REG_BASE + 0x50d80*4+0x02000000,0x2004); +reg_write( DDR_REG_BASE + 0x50d81*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x50d82*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50d83*4+0x02000000,0x800); +reg_write( DDR_REG_BASE + 0x50d84*4+0x02000000,0x231a); +reg_write( DDR_REG_BASE + 0x50d85*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x50d86*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50d87*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x50d88*4+0x02000000,0x2004); +reg_write( DDR_REG_BASE + 0x50d89*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x50d8a*4+0x02000000,0x6ffd); +reg_write( DDR_REG_BASE + 0x50d8b*4+0x02000000,0xe000); +reg_write( DDR_REG_BASE + 0x50d8c*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x50d8d*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x50d8e*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE + 0x50d8f*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x50d90*4+0x02000000,0x64); +reg_write( DDR_REG_BASE + 0x50d91*4+0x02000000,0x9220); +reg_write( DDR_REG_BASE + 0x50d92*4+0x02000000,0x4928); +reg_write( DDR_REG_BASE + 0x50d93*4+0x02000000,0x208b); +reg_write( DDR_REG_BASE + 0x50d94*4+0x02000000,0x880f); +reg_write( DDR_REG_BASE + 0x50d95*4+0x02000000,0xf206); +reg_write( DDR_REG_BASE + 0x50d96*4+0x02000000,0x2142); +reg_write( DDR_REG_BASE + 0x50d97*4+0x02000000,0x400); +reg_write( DDR_REG_BASE + 0x50d98*4+0x02000000,0x2080); +reg_write( DDR_REG_BASE + 0x50d99*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x50d9a*4+0x02000000,0xb200); +reg_write( DDR_REG_BASE + 0x50d9b*4+0x02000000,0x7164); +reg_write( DDR_REG_BASE + 0x50d9c*4+0x02000000,0xcc1); +reg_write( DDR_REG_BASE + 0x50d9d*4+0x02000000,0x90c5); +reg_write( DDR_REG_BASE + 0x50d9e*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x50d9f*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x50da0*4+0x02000000,0xc0e4); +reg_write( DDR_REG_BASE + 0x50da1*4+0x02000000,0x4508); +reg_write( DDR_REG_BASE + 0x50da2*4+0x02000000,0x259a); +reg_write( DDR_REG_BASE + 0x50da3*4+0x02000000,0x1008); +reg_write( DDR_REG_BASE + 0x50da4*4+0x02000000,0x44cb); +reg_write( DDR_REG_BASE + 0x50da5*4+0x02000000,0x900e); +reg_write( DDR_REG_BASE + 0x50da6*4+0x02000000,0x48); +reg_write( DDR_REG_BASE + 0x50da7*4+0x02000000,0x2505); +reg_write( DDR_REG_BASE + 0x50da8*4+0x02000000,0x130e); +reg_write( DDR_REG_BASE + 0x50da9*4+0x02000000,0xb620); +reg_write( DDR_REG_BASE + 0x50daa*4+0x02000000,0x6c22); +reg_write( DDR_REG_BASE + 0x50dab*4+0x02000000,0x2505); +reg_write( DDR_REG_BASE + 0x50dac*4+0x02000000,0x104c); +reg_write( DDR_REG_BASE + 0x50dad*4+0x02000000,0x7224); +reg_write( DDR_REG_BASE + 0x50dae*4+0x02000000,0xb440); +reg_write( DDR_REG_BASE + 0x50daf*4+0x02000000,0x2505); +reg_write( DDR_REG_BASE + 0x50db0*4+0x02000000,0x1042); +reg_write( DDR_REG_BASE + 0x50db1*4+0x02000000,0xb260); +reg_write( DDR_REG_BASE + 0x50db2*4+0x02000000,0x6962); +reg_write( DDR_REG_BASE + 0x50db3*4+0x02000000,0xc102); +reg_write( DDR_REG_BASE + 0x50db4*4+0x02000000,0x7d65); +reg_write( DDR_REG_BASE + 0x50db5*4+0x02000000,0x80f); +reg_write( DDR_REG_BASE + 0x50db6*4+0x02000000,0x3f1); +reg_write( DDR_REG_BASE + 0x50db7*4+0x02000000,0xb520); +reg_write( DDR_REG_BASE + 0x50db8*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE + 0x50db9*4+0x02000000,0xfc7); +reg_write( DDR_REG_BASE + 0x50dba*4+0x02000000,0xf005); +reg_write( DDR_REG_BASE + 0x50dbb*4+0x02000000,0x137c); +reg_write( DDR_REG_BASE + 0x50dbc*4+0x02000000,0x101); +reg_write( DDR_REG_BASE + 0x50dbd*4+0x02000000,0x210f); +reg_write( DDR_REG_BASE + 0x50dbe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50dbf*4+0x02000000,0x1b7c); +reg_write( DDR_REG_BASE + 0x50dc0*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x50dc1*4+0x02000000,0xc4c4); +reg_write( DDR_REG_BASE + 0x50dc2*4+0x02000000,0x44cb); +reg_write( DDR_REG_BASE + 0x50dc3*4+0x02000000,0x900e); +reg_write( DDR_REG_BASE + 0x50dc4*4+0x02000000,0xc2); +reg_write( DDR_REG_BASE + 0x50dc5*4+0x02000000,0x1c02); +reg_write( DDR_REG_BASE + 0x50dc6*4+0x02000000,0x1014); +reg_write( DDR_REG_BASE + 0x50dc7*4+0x02000000,0xb420); +reg_write( DDR_REG_BASE + 0x50dc8*4+0x02000000,0xb441); +reg_write( DDR_REG_BASE + 0x50dc9*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x50dca*4+0x02000000,0xb462); +reg_write( DDR_REG_BASE + 0x50dcb*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x50dcc*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x50dcd*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x50dce*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x50dcf*4+0x02000000,0x4608); +reg_write( DDR_REG_BASE + 0x50dd0*4+0x02000000,0xca08); +reg_write( DDR_REG_BASE + 0x50dd1*4+0x02000000,0x4358); +reg_write( DDR_REG_BASE + 0x50dd2*4+0x02000000,0xda08); +reg_write( DDR_REG_BASE + 0x50dd3*4+0x02000000,0x7a16); +reg_write( DDR_REG_BASE + 0x50dd4*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x50dd5*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x50dd6*4+0x02000000,0xe024); +reg_write( DDR_REG_BASE + 0x50dd7*4+0x02000000,0xb040); +reg_write( DDR_REG_BASE + 0x50dd8*4+0x02000000,0x228a); +reg_write( DDR_REG_BASE + 0x50dd9*4+0x02000000,0xfc7); +reg_write( DDR_REG_BASE + 0x50dda*4+0x02000000,0x180c); +reg_write( DDR_REG_BASE + 0x50ddb*4+0x02000000,0x45); +reg_write( DDR_REG_BASE + 0x50ddc*4+0x02000000,0x18fe); +reg_write( DDR_REG_BASE + 0x50ddd*4+0x02000000,0x8084); +reg_write( DDR_REG_BASE + 0x50dde*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x50ddf*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50de0*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE + 0x50de1*4+0x02000000,0x8861); +reg_write( DDR_REG_BASE + 0x50de2*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x50de3*4+0x02000000,0x708c); +reg_write( DDR_REG_BASE + 0x50de4*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50de5*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE + 0x50de6*4+0x02000000,0x86e0); +reg_write( DDR_REG_BASE + 0x50de7*4+0x02000000,0x71ad); +reg_write( DDR_REG_BASE + 0x50de8*4+0x02000000,0xf022); +reg_write( DDR_REG_BASE + 0x50de9*4+0x02000000,0x241a); +reg_write( DDR_REG_BASE + 0x50dea*4+0x02000000,0x1f82); +reg_write( DDR_REG_BASE + 0x50deb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50dec*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE + 0x50ded*4+0x02000000,0x21f4); +reg_write( DDR_REG_BASE + 0x50dee*4+0x02000000,0x30b); +reg_write( DDR_REG_BASE + 0x50def*4+0x02000000,0x2205); +reg_write( DDR_REG_BASE + 0x50df0*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x50df1*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x50df2*4+0x02000000,0x1064); +reg_write( DDR_REG_BASE + 0x50df3*4+0x02000000,0x1800); +reg_write( DDR_REG_BASE + 0x50df4*4+0x02000000,0x2c4); +reg_write( DDR_REG_BASE + 0x50df5*4+0x02000000,0x2205); +reg_write( DDR_REG_BASE + 0x50df6*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE + 0x50df7*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x50df8*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x50df9*4+0x02000000,0xb17); +reg_write( DDR_REG_BASE + 0x50dfa*4+0x02000000,0x3030); +reg_write( DDR_REG_BASE + 0x50dfb*4+0x02000000,0x21f4); +reg_write( DDR_REG_BASE + 0x50dfc*4+0x02000000,0x300); +reg_write( DDR_REG_BASE + 0x50dfd*4+0x02000000,0x815); +reg_write( DDR_REG_BASE + 0x50dfe*4+0x02000000,0xf84); +reg_write( DDR_REG_BASE + 0x50dff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50e00*4+0x02000000,0xfc00); +reg_write( DDR_REG_BASE + 0x50e01*4+0x02000000,0xd820); +reg_write( DDR_REG_BASE + 0x50e02*4+0x02000000,0xf006); +reg_write( DDR_REG_BASE + 0x50e03*4+0x02000000,0x208c); +reg_write( DDR_REG_BASE + 0x50e04*4+0x02000000,0x8010); +reg_write( DDR_REG_BASE + 0x50e05*4+0x02000000,0xf7bd); +reg_write( DDR_REG_BASE + 0x50e06*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE + 0x50e07*4+0x02000000,0x808); +reg_write( DDR_REG_BASE + 0x50e08*4+0x02000000,0xb200); +reg_write( DDR_REG_BASE + 0x50e09*4+0x02000000,0x7185); +reg_write( DDR_REG_BASE + 0x50e0a*4+0x02000000,0xbbf); +reg_write( DDR_REG_BASE + 0x50e0b*4+0x02000000,0x8305); +reg_write( DDR_REG_BASE + 0x50e0c*4+0x02000000,0xa02); +reg_write( DDR_REG_BASE + 0x50e0d*4+0x02000000,0x80); +reg_write( DDR_REG_BASE + 0x50e0e*4+0x02000000,0xb0b); +reg_write( DDR_REG_BASE + 0x50e0f*4+0x02000000,0x3030); +reg_write( DDR_REG_BASE + 0x50e10*4+0x02000000,0x8629); +reg_write( DDR_REG_BASE + 0x50e11*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE + 0x50e12*4+0x02000000,0xf002); +reg_write( DDR_REG_BASE + 0x50e13*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x50e14*4+0x02000000,0xf72); +reg_write( DDR_REG_BASE + 0x50e15*4+0x02000000,0x100); +reg_write( DDR_REG_BASE + 0x50e16*4+0x02000000,0xbfc4); +reg_write( DDR_REG_BASE + 0x50e17*4+0x02000000,0xef06); +reg_write( DDR_REG_BASE + 0x50e18*4+0x02000000,0xbf61); +reg_write( DDR_REG_BASE + 0x50e19*4+0x02000000,0xf01); +reg_write( DDR_REG_BASE + 0x50e1a*4+0x02000000,0x1031); +reg_write( DDR_REG_BASE + 0x50e1b*4+0x02000000,0x7dbb); +reg_write( DDR_REG_BASE + 0x50e1c*4+0x02000000,0x70ed); +reg_write( DDR_REG_BASE + 0x50e1d*4+0x02000000,0x8607); +reg_write( DDR_REG_BASE + 0x50e1e*4+0x02000000,0xf6d); +reg_write( DDR_REG_BASE + 0x50e1f*4+0x02000000,0x1023); +reg_write( DDR_REG_BASE + 0x50e20*4+0x02000000,0x78af); +reg_write( DDR_REG_BASE + 0x50e21*4+0x02000000,0xd92); +reg_write( DDR_REG_BASE + 0x50e22*4+0x02000000,0x180); +reg_write( DDR_REG_BASE + 0x50e23*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x50e24*4+0x02000000,0xb76); +reg_write( DDR_REG_BASE + 0x50e25*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE + 0x50e26*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x50e27*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x50e28*4+0x02000000,0x85a); +reg_write( DDR_REG_BASE + 0x50e29*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE + 0x50e2a*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x50e2b*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x50e2c*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50e2d*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE + 0x50e2e*4+0x02000000,0x8841); +reg_write( DDR_REG_BASE + 0x50e2f*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x50e30*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE + 0x50e31*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50e32*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE + 0x50e33*4+0x02000000,0x716d); +reg_write( DDR_REG_BASE + 0x50e34*4+0x02000000,0xf01a); +reg_write( DDR_REG_BASE + 0x50e35*4+0x02000000,0x211a); +reg_write( DDR_REG_BASE + 0x50e36*4+0x02000000,0xf8c); +reg_write( DDR_REG_BASE + 0x50e37*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50e38*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE + 0x50e39*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x50e3a*4+0x02000000,0xf00c); +reg_write( DDR_REG_BASE + 0x50e3b*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x50e3c*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x50e3d*4+0x02000000,0x7885); +reg_write( DDR_REG_BASE + 0x50e3e*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x50e3f*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x50e40*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x50e41*4+0x02000000,0x166); +reg_write( DDR_REG_BASE + 0x50e42*4+0x02000000,0x9000); +reg_write( DDR_REG_BASE + 0x50e43*4+0x02000000,0x631b); +reg_write( DDR_REG_BASE + 0x50e44*4+0x02000000,0x200a); +reg_write( DDR_REG_BASE + 0x50e45*4+0x02000000,0x780); +reg_write( DDR_REG_BASE + 0x50e46*4+0x02000000,0x8eb); +reg_write( DDR_REG_BASE + 0x50e47*4+0x02000000,0x8234); +reg_write( DDR_REG_BASE + 0x50e48*4+0x02000000,0x2040); +reg_write( DDR_REG_BASE + 0x50e49*4+0x02000000,0x5e); +reg_write( DDR_REG_BASE + 0x50e4a*4+0x02000000,0x7074); +reg_write( DDR_REG_BASE + 0x50e4b*4+0x02000000,0x23ca); +reg_write( DDR_REG_BASE + 0x50e4c*4+0x02000000,0x1021); +reg_write( DDR_REG_BASE + 0x50e4d*4+0x02000000,0x7124); +reg_write( DDR_REG_BASE + 0x50e4e*4+0x02000000,0xacf); +reg_write( DDR_REG_BASE + 0x50e4f*4+0x02000000,0x8065); +reg_write( DDR_REG_BASE + 0x50e50*4+0x02000000,0x706c); +reg_write( DDR_REG_BASE + 0x50e51*4+0x02000000,0xb9b); +reg_write( DDR_REG_BASE + 0x50e52*4+0x02000000,0x9030); +reg_write( DDR_REG_BASE + 0x50e53*4+0x02000000,0x71e5); +reg_write( DDR_REG_BASE + 0x50e54*4+0x02000000,0xb0b); +reg_write( DDR_REG_BASE + 0x50e55*4+0x02000000,0x3030); +reg_write( DDR_REG_BASE + 0x50e56*4+0x02000000,0x8e58); +reg_write( DDR_REG_BASE + 0x50e57*4+0x02000000,0x8602); +reg_write( DDR_REG_BASE + 0x50e58*4+0x02000000,0xf002); +reg_write( DDR_REG_BASE + 0x50e59*4+0x02000000,0x8601); +reg_write( DDR_REG_BASE + 0x50e5a*4+0x02000000,0xa4e); +reg_write( DDR_REG_BASE + 0x50e5b*4+0x02000000,0x120); +reg_write( DDR_REG_BASE + 0x50e5c*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x50e5d*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x50e5e*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x50e5f*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x50e60*4+0x02000000,0x219a); +reg_write( DDR_REG_BASE + 0x50e61*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x50e62*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x50e63*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x50e64*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x50e65*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x50e66*4+0x02000000,0xe064); +reg_write( DDR_REG_BASE + 0x50e67*4+0x02000000,0x2145); +reg_write( DDR_REG_BASE + 0x50e68*4+0x02000000,0x7c1); +reg_write( DDR_REG_BASE + 0x50e69*4+0x02000000,0x149); +reg_write( DDR_REG_BASE + 0x50e6a*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x50e6b*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE + 0x50e6c*4+0x02000000,0x706c); +reg_write( DDR_REG_BASE + 0x50e6d*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x50e6e*4+0x02000000,0xf003); +reg_write( DDR_REG_BASE + 0x50e6f*4+0x02000000,0xb260); +reg_write( DDR_REG_BASE + 0x50e70*4+0x02000000,0x7124); +reg_write( DDR_REG_BASE + 0x50e71*4+0x02000000,0x9ff); +reg_write( DDR_REG_BASE + 0x50e72*4+0x02000000,0x8cb4); +reg_write( DDR_REG_BASE + 0x50e73*4+0x02000000,0x2014); +reg_write( DDR_REG_BASE + 0x50e74*4+0x02000000,0x42); +reg_write( DDR_REG_BASE + 0x50e75*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x50e76*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE + 0x50e77*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50e78*4+0x02000000,0x16); +reg_write( DDR_REG_BASE + 0x50e79*4+0x02000000,0x9f3); +reg_write( DDR_REG_BASE + 0x50e7a*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x50e7b*4+0x02000000,0xda31); +reg_write( DDR_REG_BASE + 0x50e7c*4+0x02000000,0xba9f); +reg_write( DDR_REG_BASE + 0x50e7d*4+0x02000000,0x1201); +reg_write( DDR_REG_BASE + 0x50e7e*4+0x02000000,0x481); +reg_write( DDR_REG_BASE + 0x50e7f*4+0x02000000,0xa821); +reg_write( DDR_REG_BASE + 0x50e80*4+0x02000000,0x1201); +reg_write( DDR_REG_BASE + 0x50e81*4+0x02000000,0x481); +reg_write( DDR_REG_BASE + 0x50e82*4+0x02000000,0xa822); +reg_write( DDR_REG_BASE + 0x50e83*4+0x02000000,0x1202); +reg_write( DDR_REG_BASE + 0x50e84*4+0x02000000,0x481); +reg_write( DDR_REG_BASE + 0x50e85*4+0x02000000,0xa823); +reg_write( DDR_REG_BASE + 0x50e86*4+0x02000000,0x1201); +reg_write( DDR_REG_BASE + 0x50e87*4+0x02000000,0x481); +reg_write( DDR_REG_BASE + 0x50e88*4+0x02000000,0xa82b); +reg_write( DDR_REG_BASE + 0x50e89*4+0x02000000,0x1201); +reg_write( DDR_REG_BASE + 0x50e8a*4+0x02000000,0x481); +reg_write( DDR_REG_BASE + 0x50e8b*4+0x02000000,0xa830); +reg_write( DDR_REG_BASE + 0x50e8c*4+0x02000000,0x1202); +reg_write( DDR_REG_BASE + 0x50e8d*4+0x02000000,0x481); +reg_write( DDR_REG_BASE + 0x50e8e*4+0x02000000,0xa831); +reg_write( DDR_REG_BASE + 0x50e8f*4+0x02000000,0x1201); +reg_write( DDR_REG_BASE + 0x50e90*4+0x02000000,0x481); +reg_write( DDR_REG_BASE + 0x50e91*4+0x02000000,0x1833); +reg_write( DDR_REG_BASE + 0x50e92*4+0x02000000,0x42); +reg_write( DDR_REG_BASE + 0x50e93*4+0x02000000,0x1201); +reg_write( DDR_REG_BASE + 0x50e94*4+0x02000000,0x481); +reg_write( DDR_REG_BASE + 0x50e95*4+0x02000000,0x1834); +reg_write( DDR_REG_BASE + 0x50e96*4+0x02000000,0x42); +reg_write( DDR_REG_BASE + 0x50e97*4+0x02000000,0x1202); +reg_write( DDR_REG_BASE + 0x50e98*4+0x02000000,0x481); +reg_write( DDR_REG_BASE + 0x50e99*4+0x02000000,0x1835); +reg_write( DDR_REG_BASE + 0x50e9a*4+0x02000000,0x42); +reg_write( DDR_REG_BASE + 0x50e9b*4+0x02000000,0x1201); +reg_write( DDR_REG_BASE + 0x50e9c*4+0x02000000,0x481); +reg_write( DDR_REG_BASE + 0x50e9d*4+0x02000000,0x183d); +reg_write( DDR_REG_BASE + 0x50e9e*4+0x02000000,0x42); +reg_write( DDR_REG_BASE + 0x50e9f*4+0x02000000,0x1201); +reg_write( DDR_REG_BASE + 0x50ea0*4+0x02000000,0x481); +reg_write( DDR_REG_BASE + 0x50ea1*4+0x02000000,0x1842); +reg_write( DDR_REG_BASE + 0x50ea2*4+0x02000000,0x42); +reg_write( DDR_REG_BASE + 0x50ea3*4+0x02000000,0x1218); +reg_write( DDR_REG_BASE + 0x50ea4*4+0x02000000,0x481); +reg_write( DDR_REG_BASE + 0x50ea5*4+0x02000000,0x1843); +reg_write( DDR_REG_BASE + 0x50ea6*4+0x02000000,0x42); +reg_write( DDR_REG_BASE + 0x50ea7*4+0x02000000,0x1201); +reg_write( DDR_REG_BASE + 0x50ea8*4+0x02000000,0x481); +reg_write( DDR_REG_BASE + 0x50ea9*4+0x02000000,0x1865); +reg_write( DDR_REG_BASE + 0x50eaa*4+0x02000000,0x42); +reg_write( DDR_REG_BASE + 0x50eab*4+0x02000000,0x1201); +reg_write( DDR_REG_BASE + 0x50eac*4+0x02000000,0x481); +reg_write( DDR_REG_BASE + 0x50ead*4+0x02000000,0x1866); +reg_write( DDR_REG_BASE + 0x50eae*4+0x02000000,0x42); +reg_write( DDR_REG_BASE + 0x50eaf*4+0x02000000,0x1202); +reg_write( DDR_REG_BASE + 0x50eb0*4+0x02000000,0x481); +reg_write( DDR_REG_BASE + 0x50eb1*4+0x02000000,0x1867); +reg_write( DDR_REG_BASE + 0x50eb2*4+0x02000000,0x42); +reg_write( DDR_REG_BASE + 0x50eb3*4+0x02000000,0x1201); +reg_write( DDR_REG_BASE + 0x50eb4*4+0x02000000,0x481); +reg_write( DDR_REG_BASE + 0x50eb5*4+0x02000000,0x186f); +reg_write( DDR_REG_BASE + 0x50eb6*4+0x02000000,0x42); +reg_write( DDR_REG_BASE + 0x50eb7*4+0x02000000,0x1201); +reg_write( DDR_REG_BASE + 0x50eb8*4+0x02000000,0x481); +reg_write( DDR_REG_BASE + 0x50eb9*4+0x02000000,0x1874); +reg_write( DDR_REG_BASE + 0x50eba*4+0x02000000,0x42); +reg_write( DDR_REG_BASE + 0x50ebb*4+0x02000000,0x1202); +reg_write( DDR_REG_BASE + 0x50ebc*4+0x02000000,0x481); +reg_write( DDR_REG_BASE + 0x50ebd*4+0x02000000,0x1875); +reg_write( DDR_REG_BASE + 0x50ebe*4+0x02000000,0x42); +reg_write( DDR_REG_BASE + 0x50ebf*4+0x02000000,0x1201); +reg_write( DDR_REG_BASE + 0x50ec0*4+0x02000000,0x481); +reg_write( DDR_REG_BASE + 0x50ec1*4+0x02000000,0x1897); +reg_write( DDR_REG_BASE + 0x50ec2*4+0x02000000,0x42); +reg_write( DDR_REG_BASE + 0x50ec3*4+0x02000000,0x1201); +reg_write( DDR_REG_BASE + 0x50ec4*4+0x02000000,0x481); +reg_write( DDR_REG_BASE + 0x50ec5*4+0x02000000,0x1898); +reg_write( DDR_REG_BASE + 0x50ec6*4+0x02000000,0x42); +reg_write( DDR_REG_BASE + 0x50ec7*4+0x02000000,0x1202); +reg_write( DDR_REG_BASE + 0x50ec8*4+0x02000000,0x481); +reg_write( DDR_REG_BASE + 0x50ec9*4+0x02000000,0x1899); +reg_write( DDR_REG_BASE + 0x50eca*4+0x02000000,0x42); +reg_write( DDR_REG_BASE + 0x50ecb*4+0x02000000,0x8a20); +reg_write( DDR_REG_BASE + 0x50ecc*4+0x02000000,0x18a1); +reg_write( DDR_REG_BASE + 0x50ecd*4+0x02000000,0x42); +reg_write( DDR_REG_BASE + 0x50ece*4+0x02000000,0x8a21); +reg_write( DDR_REG_BASE + 0x50ecf*4+0x02000000,0x18a6); +reg_write( DDR_REG_BASE + 0x50ed0*4+0x02000000,0x42); +reg_write( DDR_REG_BASE + 0x50ed1*4+0x02000000,0x8a22); +reg_write( DDR_REG_BASE + 0x50ed2*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x50ed3*4+0x02000000,0x18a7); +reg_write( DDR_REG_BASE + 0x50ed4*4+0x02000000,0x42); +reg_write( DDR_REG_BASE + 0x50ed5*4+0x02000000,0x219a); +reg_write( DDR_REG_BASE + 0x50ed6*4+0x02000000,0x901); +reg_write( DDR_REG_BASE + 0x50ed7*4+0x02000000,0x603a); +reg_write( DDR_REG_BASE + 0x50ed8*4+0x02000000,0x235a); +reg_write( DDR_REG_BASE + 0x50ed9*4+0x02000000,0x1c81); +reg_write( DDR_REG_BASE + 0x50eda*4+0x02000000,0x7165); +reg_write( DDR_REG_BASE + 0x50edb*4+0x02000000,0x623c); +reg_write( DDR_REG_BASE + 0x50edc*4+0x02000000,0xd931); +reg_write( DDR_REG_BASE + 0x50edd*4+0x02000000,0xb99f); +reg_write( DDR_REG_BASE + 0x50ede*4+0x02000000,0x1101); +reg_write( DDR_REG_BASE + 0x50edf*4+0x02000000,0x482); +reg_write( DDR_REG_BASE + 0x50ee0*4+0x02000000,0xac41); +reg_write( DDR_REG_BASE + 0x50ee1*4+0x02000000,0x1101); +reg_write( DDR_REG_BASE + 0x50ee2*4+0x02000000,0x482); +reg_write( DDR_REG_BASE + 0x50ee3*4+0x02000000,0xac42); +reg_write( DDR_REG_BASE + 0x50ee4*4+0x02000000,0x1102); +reg_write( DDR_REG_BASE + 0x50ee5*4+0x02000000,0x482); +reg_write( DDR_REG_BASE + 0x50ee6*4+0x02000000,0xac43); +reg_write( DDR_REG_BASE + 0x50ee7*4+0x02000000,0x8940); +reg_write( DDR_REG_BASE + 0x50ee8*4+0x02000000,0xac4b); +reg_write( DDR_REG_BASE + 0x50ee9*4+0x02000000,0x8941); +reg_write( DDR_REG_BASE + 0x50eea*4+0x02000000,0xac50); +reg_write( DDR_REG_BASE + 0x50eeb*4+0x02000000,0x8922); +reg_write( DDR_REG_BASE + 0x50eec*4+0x02000000,0xac31); +reg_write( DDR_REG_BASE + 0x50eed*4+0x02000000,0xbd3); +reg_write( DDR_REG_BASE + 0x50eee*4+0x02000000,0x90b4); +reg_write( DDR_REG_BASE + 0x50eef*4+0x02000000,0x4160); +reg_write( DDR_REG_BASE + 0x50ef0*4+0x02000000,0x7164); +reg_write( DDR_REG_BASE + 0x50ef1*4+0x02000000,0xbfb); +reg_write( DDR_REG_BASE + 0x50ef2*4+0x02000000,0x80b4); +reg_write( DDR_REG_BASE + 0x50ef3*4+0x02000000,0x706d); +reg_write( DDR_REG_BASE + 0x50ef4*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x50ef5*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x50ef6*4+0x02000000,0xc3e4); +reg_write( DDR_REG_BASE + 0x50ef7*4+0x02000000,0xc1ab); +reg_write( DDR_REG_BASE + 0x50ef8*4+0x02000000,0xc080); +reg_write( DDR_REG_BASE + 0x50ef9*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x50efa*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50efb*4+0x02000000,0x689); +reg_write( DDR_REG_BASE + 0x50efc*4+0x02000000,0xa8a); +reg_write( DDR_REG_BASE + 0x50efd*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x50efe*4+0x02000000,0xda2a); +reg_write( DDR_REG_BASE + 0x50eff*4+0x02000000,0xc080); +reg_write( DDR_REG_BASE + 0x50f00*4+0x02000000,0xb8a); +reg_write( DDR_REG_BASE + 0x50f01*4+0x02000000,0x1e0); +reg_write( DDR_REG_BASE + 0x50f02*4+0x02000000,0xd92a); +reg_write( DDR_REG_BASE + 0x50f03*4+0x02000000,0xc16); +reg_write( DDR_REG_BASE + 0x50f04*4+0x02000000,0xffcf); +reg_write( DDR_REG_BASE + 0x50f05*4+0x02000000,0xc72); +reg_write( DDR_REG_BASE + 0x50f06*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x50f07*4+0x02000000,0x4300); +reg_write( DDR_REG_BASE + 0x50f08*4+0x02000000,0x4100); +reg_write( DDR_REG_BASE + 0x50f09*4+0x02000000,0xc52); +reg_write( DDR_REG_BASE + 0x50f0a*4+0x02000000,0x120); +reg_write( DDR_REG_BASE + 0x50f0b*4+0x02000000,0x4060); +reg_write( DDR_REG_BASE + 0x50f0c*4+0x02000000,0xdd23); +reg_write( DDR_REG_BASE + 0x50f0d*4+0x02000000,0xbd9f); +reg_write( DDR_REG_BASE + 0x50f0e*4+0x02000000,0x8d00); +reg_write( DDR_REG_BASE + 0x50f0f*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE + 0x50f10*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x50f11*4+0x02000000,0xe4); +reg_write( DDR_REG_BASE + 0x50f12*4+0x02000000,0xb600); +reg_write( DDR_REG_BASE + 0x50f13*4+0x02000000,0x1526); +reg_write( DDR_REG_BASE + 0x50f14*4+0x02000000,0x1080); +reg_write( DDR_REG_BASE + 0x50f15*4+0x02000000,0xb601); +reg_write( DDR_REG_BASE + 0x50f16*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x50f17*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x50f18*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x50f19*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x50f1a*4+0x02000000,0xe154); +reg_write( DDR_REG_BASE + 0x50f1b*4+0x02000000,0xb56); +reg_write( DDR_REG_BASE + 0x50f1c*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x50f1d*4+0x02000000,0x1e42); +reg_write( DDR_REG_BASE + 0x50f1e*4+0x02000000,0x905d); +reg_write( DDR_REG_BASE + 0x50f1f*4+0x02000000,0x2053); +reg_write( DDR_REG_BASE + 0x50f20*4+0x02000000,0xc1); +reg_write( DDR_REG_BASE + 0x50f21*4+0x02000000,0x1a01); +reg_write( DDR_REG_BASE + 0x50f22*4+0x02000000,0x3042); +reg_write( DDR_REG_BASE + 0x50f23*4+0x02000000,0x791d); +reg_write( DDR_REG_BASE + 0x50f24*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE + 0x50f25*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE + 0x50f26*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE + 0x50f27*4+0x02000000,0xb9c3); +reg_write( DDR_REG_BASE + 0x50f28*4+0x02000000,0x1a02); +reg_write( DDR_REG_BASE + 0x50f29*4+0x02000000,0x3042); +reg_write( DDR_REG_BASE + 0x50f2a*4+0x02000000,0xd908); +reg_write( DDR_REG_BASE + 0x50f2b*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE + 0x50f2c*4+0x02000000,0x9ff); +reg_write( DDR_REG_BASE + 0x50f2d*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE + 0x50f2e*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x50f2f*4+0x02000000,0xb8c1); +reg_write( DDR_REG_BASE + 0x50f30*4+0x02000000,0xef6); +reg_write( DDR_REG_BASE + 0x50f31*4+0x02000000,0x120); +reg_write( DDR_REG_BASE + 0x50f32*4+0x02000000,0x1a06); +reg_write( DDR_REG_BASE + 0x50f33*4+0x02000000,0x3002); +reg_write( DDR_REG_BASE + 0x50f34*4+0x02000000,0x83a); +reg_write( DDR_REG_BASE + 0x50f35*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50f36*4+0x02000000,0xb72); +reg_write( DDR_REG_BASE + 0x50f37*4+0x02000000,0x100); +reg_write( DDR_REG_BASE + 0x50f38*4+0x02000000,0x164c); +reg_write( DDR_REG_BASE + 0x50f39*4+0x02000000,0x9100); +reg_write( DDR_REG_BASE + 0x50f3a*4+0x02000000,0x80b); +reg_write( DDR_REG_BASE + 0x50f3b*4+0x02000000,0x151); +reg_write( DDR_REG_BASE + 0x50f3c*4+0x02000000,0x8d00); +reg_write( DDR_REG_BASE + 0x50f3d*4+0x02000000,0xb600); +reg_write( DDR_REG_BASE + 0x50f3e*4+0x02000000,0xb601); +reg_write( DDR_REG_BASE + 0x50f3f*4+0x02000000,0xc7c4); +reg_write( DDR_REG_BASE + 0x50f40*4+0x02000000,0xc0f1); +reg_write( DDR_REG_BASE + 0x50f41*4+0x02000000,0xc1bd); +reg_write( DDR_REG_BASE + 0x50f42*4+0x02000000,0xc080); +reg_write( DDR_REG_BASE + 0x50f43*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x50f44*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50f45*4+0x02000000,0x50a); +reg_write( DDR_REG_BASE + 0x50f46*4+0x02000000,0x9f6); +reg_write( DDR_REG_BASE + 0x50f47*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x50f48*4+0x02000000,0xda72); +reg_write( DDR_REG_BASE + 0x50f49*4+0x02000000,0xc080); +reg_write( DDR_REG_BASE + 0x50f4a*4+0x02000000,0xaf6); +reg_write( DDR_REG_BASE + 0x50f4b*4+0x02000000,0x1e0); +reg_write( DDR_REG_BASE + 0x50f4c*4+0x02000000,0xd972); +reg_write( DDR_REG_BASE + 0x50f4d*4+0x02000000,0xc0bd); +reg_write( DDR_REG_BASE + 0x50f4e*4+0x02000000,0xc0d1); +reg_write( DDR_REG_BASE + 0x50f4f*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x50f50*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x50f51*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x50f52*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x50f53*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x50f54*4+0x02000000,0x7101); +reg_write( DDR_REG_BASE + 0x50f55*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x50f56*4+0x02000000,0x1e0); +reg_write( DDR_REG_BASE + 0x50f57*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x50f58*4+0x02000000,0x7082); +reg_write( DDR_REG_BASE + 0x50f59*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50f5a*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x50f5b*4+0x02000000,0x225f); +reg_write( DDR_REG_BASE + 0x50f5c*4+0x02000000,0x100); +reg_write( DDR_REG_BASE + 0x50f5d*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE + 0x50f5e*4+0x02000000,0x7c3); +reg_write( DDR_REG_BASE + 0x50f5f*4+0x02000000,0x4020); +reg_write( DDR_REG_BASE + 0x50f60*4+0x02000000,0xeb05); +reg_write( DDR_REG_BASE + 0x50f61*4+0x02000000,0xbb61); +reg_write( DDR_REG_BASE + 0x50f62*4+0x02000000,0xbff); +reg_write( DDR_REG_BASE + 0x50f63*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE + 0x50f64*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x50f65*4+0x02000000,0xb8c3); +reg_write( DDR_REG_BASE + 0x50f66*4+0x02000000,0x80b); +reg_write( DDR_REG_BASE + 0x50f67*4+0x02000000,0x190); +reg_write( DDR_REG_BASE + 0x50f68*4+0x02000000,0x877); +reg_write( DDR_REG_BASE + 0x50f69*4+0x02000000,0x71); +reg_write( DDR_REG_BASE + 0x50f6a*4+0x02000000,0xdf18); +reg_write( DDR_REG_BASE + 0x50f6b*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE + 0x50f6c*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x50f6d*4+0x02000000,0x116); +reg_write( DDR_REG_BASE + 0x50f6e*4+0x02000000,0x1e08); +reg_write( DDR_REG_BASE + 0x50f6f*4+0x02000000,0x1094); +reg_write( DDR_REG_BASE + 0x50f70*4+0x02000000,0x71ad); +reg_write( DDR_REG_BASE + 0x50f71*4+0x02000000,0x1e02); +reg_write( DDR_REG_BASE + 0x50f72*4+0x02000000,0x1055); +reg_write( DDR_REG_BASE + 0x50f73*4+0x02000000,0xd829); +reg_write( DDR_REG_BASE + 0x50f74*4+0x02000000,0xb6a0); +reg_write( DDR_REG_BASE + 0x50f75*4+0x02000000,0x1e6c); +reg_write( DDR_REG_BASE + 0x50f76*4+0x02000000,0x1205); +reg_write( DDR_REG_BASE + 0x50f77*4+0x02000000,0x1e6c); +reg_write( DDR_REG_BASE + 0x50f78*4+0x02000000,0x1004); +reg_write( DDR_REG_BASE + 0x50f79*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x50f7a*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x50f7b*4+0x02000000,0x98); +reg_write( DDR_REG_BASE + 0x50f7c*4+0x02000000,0x9680); +reg_write( DDR_REG_BASE + 0x50f7d*4+0x02000000,0x4328); +reg_write( DDR_REG_BASE + 0x50f7e*4+0x02000000,0x1ef2); +reg_write( DDR_REG_BASE + 0x50f7f*4+0x02000000,0x9044); +reg_write( DDR_REG_BASE + 0x50f80*4+0x02000000,0xfba); +reg_write( DDR_REG_BASE + 0x50f81*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x50f82*4+0x02000000,0x1e66); +reg_write( DDR_REG_BASE + 0x50f83*4+0x02000000,0x1044); +reg_write( DDR_REG_BASE + 0x50f84*4+0x02000000,0xd8a9); +reg_write( DDR_REG_BASE + 0x50f85*4+0x02000000,0x1e6c); +reg_write( DDR_REG_BASE + 0x50f86*4+0x02000000,0x1004); +reg_write( DDR_REG_BASE + 0x50f87*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE + 0x50f88*4+0x02000000,0xa46); +reg_write( DDR_REG_BASE + 0x50f89*4+0x02000000,0x1e6c); +reg_write( DDR_REG_BASE + 0x50f8a*4+0x02000000,0x1004); +reg_write( DDR_REG_BASE + 0x50f8b*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE + 0x50f8c*4+0x02000000,0xa44); +reg_write( DDR_REG_BASE + 0x50f8d*4+0x02000000,0x1e6c); +reg_write( DDR_REG_BASE + 0x50f8e*4+0x02000000,0x1004); +reg_write( DDR_REG_BASE + 0x50f8f*4+0x02000000,0x1e6c); +reg_write( DDR_REG_BASE + 0x50f90*4+0x02000000,0x1004); +reg_write( DDR_REG_BASE + 0x50f91*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x50f92*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50f93*4+0x02000000,0x6000); +reg_write( DDR_REG_BASE + 0x50f94*4+0x02000000,0x1e72); +reg_write( DDR_REG_BASE + 0x50f95*4+0x02000000,0x935c); +reg_write( DDR_REG_BASE + 0x50f96*4+0x02000000,0x1ed0); +reg_write( DDR_REG_BASE + 0x50f97*4+0x02000000,0x9344); +reg_write( DDR_REG_BASE + 0x50f98*4+0x02000000,0x1e72); +reg_write( DDR_REG_BASE + 0x50f99*4+0x02000000,0x90dd); +reg_write( DDR_REG_BASE + 0x50f9a*4+0x02000000,0xf2e); +reg_write( DDR_REG_BASE + 0x50f9b*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x50f9c*4+0x02000000,0x1ed0); +reg_write( DDR_REG_BASE + 0x50f9d*4+0x02000000,0x92c4); +reg_write( DDR_REG_BASE + 0x50f9e*4+0x02000000,0x1e72); +reg_write( DDR_REG_BASE + 0x50f9f*4+0x02000000,0x935c); +reg_write( DDR_REG_BASE + 0x50fa0*4+0x02000000,0x1e72); +reg_write( DDR_REG_BASE + 0x50fa1*4+0x02000000,0x92dc); +reg_write( DDR_REG_BASE + 0x50fa2*4+0x02000000,0xf046); +reg_write( DDR_REG_BASE + 0x50fa3*4+0x02000000,0x45cb); +reg_write( DDR_REG_BASE + 0x50fa4*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x50fa5*4+0x02000000,0x116); +reg_write( DDR_REG_BASE + 0x50fa6*4+0x02000000,0x1d08); +reg_write( DDR_REG_BASE + 0x50fa7*4+0x02000000,0x1094); +reg_write( DDR_REG_BASE + 0x50fa8*4+0x02000000,0x71cd); +reg_write( DDR_REG_BASE + 0x50fa9*4+0x02000000,0x1d02); +reg_write( DDR_REG_BASE + 0x50faa*4+0x02000000,0x1055); +reg_write( DDR_REG_BASE + 0x50fab*4+0x02000000,0x234a); +reg_write( DDR_REG_BASE + 0x50fac*4+0x02000000,0x1200); +reg_write( DDR_REG_BASE + 0x50fad*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x50fae*4+0x02000000,0xbf8b); +reg_write( DDR_REG_BASE + 0x50faf*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x50fb0*4+0x02000000,0xf); +reg_write( DDR_REG_BASE + 0x50fb1*4+0x02000000,0x4240); +reg_write( DDR_REG_BASE + 0x50fb2*4+0x02000000,0xb5c0); +reg_write( DDR_REG_BASE + 0x50fb3*4+0x02000000,0x1d6c); +reg_write( DDR_REG_BASE + 0x50fb4*4+0x02000000,0x12c4); +reg_write( DDR_REG_BASE + 0x50fb5*4+0x02000000,0x260a); +reg_write( DDR_REG_BASE + 0x50fb6*4+0x02000000,0x3040); +reg_write( DDR_REG_BASE + 0x50fb7*4+0x02000000,0x1df2); +reg_write( DDR_REG_BASE + 0x50fb8*4+0x02000000,0x9044); +reg_write( DDR_REG_BASE + 0x50fb9*4+0x02000000,0x1d66); +reg_write( DDR_REG_BASE + 0x50fba*4+0x02000000,0x1044); +reg_write( DDR_REG_BASE + 0x50fbb*4+0x02000000,0x1d6c); +reg_write( DDR_REG_BASE + 0x50fbc*4+0x02000000,0x13c4); +reg_write( DDR_REG_BASE + 0x50fbd*4+0x02000000,0xf42); +reg_write( DDR_REG_BASE + 0x50fbe*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x50fbf*4+0x02000000,0x4318); +reg_write( DDR_REG_BASE + 0x50fc0*4+0x02000000,0xbf70); +reg_write( DDR_REG_BASE + 0x50fc1*4+0x02000000,0x202f); +reg_write( DDR_REG_BASE + 0x50fc2*4+0x02000000,0x6c2); +reg_write( DDR_REG_BASE + 0x50fc3*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x50fc4*4+0x02000000,0xf32); +reg_write( DDR_REG_BASE + 0x50fc5*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x50fc6*4+0x02000000,0x1d6c); +reg_write( DDR_REG_BASE + 0x50fc7*4+0x02000000,0x13c4); +reg_write( DDR_REG_BASE + 0x50fc8*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x50fc9*4+0x02000000,0x98); +reg_write( DDR_REG_BASE + 0x50fca*4+0x02000000,0x9680); +reg_write( DDR_REG_BASE + 0x50fcb*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x50fcc*4+0x02000000,0xf22); +reg_write( DDR_REG_BASE + 0x50fcd*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x50fce*4+0x02000000,0x1d6c); +reg_write( DDR_REG_BASE + 0x50fcf*4+0x02000000,0x12c4); +reg_write( DDR_REG_BASE + 0x50fd0*4+0x02000000,0xd888); +reg_write( DDR_REG_BASE + 0x50fd1*4+0x02000000,0x1d6c); +reg_write( DDR_REG_BASE + 0x50fd2*4+0x02000000,0x1004); +reg_write( DDR_REG_BASE + 0x50fd3*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x50fd4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50fd5*4+0x02000000,0x6000); +reg_write( DDR_REG_BASE + 0x50fd6*4+0x02000000,0x1d6c); +reg_write( DDR_REG_BASE + 0x50fd7*4+0x02000000,0x12c4); +reg_write( DDR_REG_BASE + 0x50fd8*4+0x02000000,0x1d6c); +reg_write( DDR_REG_BASE + 0x50fd9*4+0x02000000,0x1784); +reg_write( DDR_REG_BASE + 0x50fda*4+0x02000000,0x1d72); +reg_write( DDR_REG_BASE + 0x50fdb*4+0x02000000,0x939c); +reg_write( DDR_REG_BASE + 0x50fdc*4+0x02000000,0x1dd0); +reg_write( DDR_REG_BASE + 0x50fdd*4+0x02000000,0x9384); +reg_write( DDR_REG_BASE + 0x50fde*4+0x02000000,0x1d72); +reg_write( DDR_REG_BASE + 0x50fdf*4+0x02000000,0x90dd); +reg_write( DDR_REG_BASE + 0x50fe0*4+0x02000000,0xea2); +reg_write( DDR_REG_BASE + 0x50fe1*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x50fe2*4+0x02000000,0x1dd0); +reg_write( DDR_REG_BASE + 0x50fe3*4+0x02000000,0x9784); +reg_write( DDR_REG_BASE + 0x50fe4*4+0x02000000,0x1d72); +reg_write( DDR_REG_BASE + 0x50fe5*4+0x02000000,0x939c); +reg_write( DDR_REG_BASE + 0x50fe6*4+0x02000000,0x1d72); +reg_write( DDR_REG_BASE + 0x50fe7*4+0x02000000,0x979c); +reg_write( DDR_REG_BASE + 0x50fe8*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x50fe9*4+0x02000000,0xeea); +reg_write( DDR_REG_BASE + 0x50fea*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x50feb*4+0x02000000,0xd920); +reg_write( DDR_REG_BASE + 0x50fec*4+0x02000000,0x45cb); +reg_write( DDR_REG_BASE + 0x50fed*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x50fee*4+0x02000000,0x1f0); +reg_write( DDR_REG_BASE + 0x50fef*4+0x02000000,0xd820); +reg_write( DDR_REG_BASE + 0x50ff0*4+0x02000000,0xe82); +reg_write( DDR_REG_BASE + 0x50ff1*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x50ff2*4+0x02000000,0x1d00); +reg_write( DDR_REG_BASE + 0x50ff3*4+0x02000000,0x1005); +reg_write( DDR_REG_BASE + 0x50ff4*4+0x02000000,0xd820); +reg_write( DDR_REG_BASE + 0x50ff5*4+0x02000000,0xe7a); +reg_write( DDR_REG_BASE + 0x50ff6*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x50ff7*4+0x02000000,0x1d00); +reg_write( DDR_REG_BASE + 0x50ff8*4+0x02000000,0x1045); +reg_write( DDR_REG_BASE + 0x50ff9*4+0x02000000,0x740c); +reg_write( DDR_REG_BASE + 0x50ffa*4+0x02000000,0xe6e); +reg_write( DDR_REG_BASE + 0x50ffb*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x50ffc*4+0x02000000,0x1d00); +reg_write( DDR_REG_BASE + 0x50ffd*4+0x02000000,0x1005); +reg_write( DDR_REG_BASE + 0x50ffe*4+0x02000000,0x1d0a); +reg_write( DDR_REG_BASE + 0x50fff*4+0x02000000,0x909d); +reg_write( DDR_REG_BASE + 0x51000*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x51001*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x51002*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x51003*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x51004*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x51005*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x51006*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x51007*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51008*4+0x02000000,0x7b6); +reg_write( DDR_REG_BASE + 0x51009*4+0x02000000,0xdc22); +reg_write( DDR_REG_BASE + 0x5100a*4+0x02000000,0xa940); +reg_write( DDR_REG_BASE + 0x5100b*4+0x02000000,0xbc9f); +reg_write( DDR_REG_BASE + 0x5100c*4+0x02000000,0x8c00); +reg_write( DDR_REG_BASE + 0x5100d*4+0x02000000,0x45cb); +reg_write( DDR_REG_BASE + 0x5100e*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5100f*4+0x02000000,0x758); +reg_write( DDR_REG_BASE + 0x51010*4+0x02000000,0xe007); +reg_write( DDR_REG_BASE + 0x51011*4+0x02000000,0x7e1d); +reg_write( DDR_REG_BASE + 0x51012*4+0x02000000,0x7edd); +reg_write( DDR_REG_BASE + 0x51013*4+0x02000000,0x7edd); +reg_write( DDR_REG_BASE + 0x51014*4+0x02000000,0x6e09); +reg_write( DDR_REG_BASE + 0x51015*4+0x02000000,0xa901); +reg_write( DDR_REG_BASE + 0x51016*4+0x02000000,0x1427); +reg_write( DDR_REG_BASE + 0x51017*4+0x02000000,0x1083); +reg_write( DDR_REG_BASE + 0x51018*4+0x02000000,0x7074); +reg_write( DDR_REG_BASE + 0x51019*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE + 0x5101a*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5101b*4+0x02000000,0x77c); +reg_write( DDR_REG_BASE + 0x5101c*4+0x02000000,0xf223); +reg_write( DDR_REG_BASE + 0x5101d*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE + 0x5101e*4+0x02000000,0x44); +reg_write( DDR_REG_BASE + 0x5101f*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51020*4+0x02000000,0x708f); +reg_write( DDR_REG_BASE + 0x51021*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51022*4+0x02000000,0x48); +reg_write( DDR_REG_BASE + 0x51023*4+0x02000000,0xb501); +reg_write( DDR_REG_BASE + 0x51024*4+0x02000000,0xca02); +reg_write( DDR_REG_BASE + 0x51025*4+0x02000000,0x7e1d); +reg_write( DDR_REG_BASE + 0x51026*4+0x02000000,0x6f07); +reg_write( DDR_REG_BASE + 0x51027*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x51028*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x51029*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x5102a*4+0x02000000,0x60d8); +reg_write( DDR_REG_BASE + 0x5102b*4+0x02000000,0x7704); +reg_write( DDR_REG_BASE + 0x5102c*4+0x02000000,0xa9c2); +reg_write( DDR_REG_BASE + 0x5102d*4+0x02000000,0xa903); +reg_write( DDR_REG_BASE + 0x5102e*4+0x02000000,0x8c00); +reg_write( DDR_REG_BASE + 0x5102f*4+0x02000000,0x82b); +reg_write( DDR_REG_BASE + 0x51030*4+0x02000000,0x474); +reg_write( DDR_REG_BASE + 0x51031*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x51032*4+0x02000000,0xd06); +reg_write( DDR_REG_BASE + 0x51033*4+0x02000000,0x100); +reg_write( DDR_REG_BASE + 0x51034*4+0x02000000,0xad14); +reg_write( DDR_REG_BASE + 0x51035*4+0x02000000,0xd02); +reg_write( DDR_REG_BASE + 0x51036*4+0x02000000,0x120); +reg_write( DDR_REG_BASE + 0x51037*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x51038*4+0x02000000,0xad1c); +reg_write( DDR_REG_BASE + 0x51039*4+0x02000000,0xcfa); +reg_write( DDR_REG_BASE + 0x5103a*4+0x02000000,0x120); +reg_write( DDR_REG_BASE + 0x5103b*4+0x02000000,0x740c); +reg_write( DDR_REG_BASE + 0x5103c*4+0x02000000,0xab10); +reg_write( DDR_REG_BASE + 0x5103d*4+0x02000000,0x740c); +reg_write( DDR_REG_BASE + 0x5103e*4+0x02000000,0xf012); +reg_write( DDR_REG_BASE + 0x5103f*4+0x02000000,0xa903); +reg_write( DDR_REG_BASE + 0x51040*4+0x02000000,0xa9c2); +reg_write( DDR_REG_BASE + 0x51041*4+0x02000000,0xb541); +reg_write( DDR_REG_BASE + 0x51042*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE + 0x51043*4+0x02000000,0xce6); +reg_write( DDR_REG_BASE + 0x51044*4+0x02000000,0x120); +reg_write( DDR_REG_BASE + 0x51045*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE + 0x51046*4+0x02000000,0xad14); +reg_write( DDR_REG_BASE + 0x51047*4+0x02000000,0xcde); +reg_write( DDR_REG_BASE + 0x51048*4+0x02000000,0x120); +reg_write( DDR_REG_BASE + 0x51049*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE + 0x5104a*4+0x02000000,0xad1c); +reg_write( DDR_REG_BASE + 0x5104b*4+0x02000000,0xcd6); +reg_write( DDR_REG_BASE + 0x5104c*4+0x02000000,0x120); +reg_write( DDR_REG_BASE + 0x5104d*4+0x02000000,0x720c); +reg_write( DDR_REG_BASE + 0x5104e*4+0x02000000,0xab10); +reg_write( DDR_REG_BASE + 0x5104f*4+0x02000000,0x720c); +reg_write( DDR_REG_BASE + 0x51050*4+0x02000000,0xcca); +reg_write( DDR_REG_BASE + 0x51051*4+0x02000000,0x100); +reg_write( DDR_REG_BASE + 0x51052*4+0x02000000,0xab18); +reg_write( DDR_REG_BASE + 0x51053*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51054*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x51055*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51056*4+0x02000000,0x23); +reg_write( DDR_REG_BASE + 0x51057*4+0x02000000,0xe816); +reg_write( DDR_REG_BASE + 0x51058*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE + 0x51059*4+0x02000000,0x44); +reg_write( DDR_REG_BASE + 0x5105a*4+0x02000000,0xb500); +reg_write( DDR_REG_BASE + 0x5105b*4+0x02000000,0xcb6); +reg_write( DDR_REG_BASE + 0x5105c*4+0x02000000,0x120); +reg_write( DDR_REG_BASE + 0x5105d*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x5105e*4+0x02000000,0xad04); +reg_write( DDR_REG_BASE + 0x5105f*4+0x02000000,0xcae); +reg_write( DDR_REG_BASE + 0x51060*4+0x02000000,0x120); +reg_write( DDR_REG_BASE + 0x51061*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x51062*4+0x02000000,0xad0c); +reg_write( DDR_REG_BASE + 0x51063*4+0x02000000,0xca6); +reg_write( DDR_REG_BASE + 0x51064*4+0x02000000,0x120); +reg_write( DDR_REG_BASE + 0x51065*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x51066*4+0x02000000,0xab00); +reg_write( DDR_REG_BASE + 0x51067*4+0x02000000,0xc9e); +reg_write( DDR_REG_BASE + 0x51068*4+0x02000000,0x120); +reg_write( DDR_REG_BASE + 0x51069*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x5106a*4+0x02000000,0xab08); +reg_write( DDR_REG_BASE + 0x5106b*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x5106c*4+0x02000000,0xb540); +reg_write( DDR_REG_BASE + 0x5106d*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x5106e*4+0x02000000,0xc2e2); +reg_write( DDR_REG_BASE + 0x5106f*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51070*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE + 0x51071*4+0x02000000,0x7c2); +reg_write( DDR_REG_BASE + 0x51072*4+0x02000000,0x4020); +reg_write( DDR_REG_BASE + 0x51073*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x51074*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51075*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE + 0x51076*4+0x02000000,0x8920); +reg_write( DDR_REG_BASE + 0x51077*4+0x02000000,0xea06); +reg_write( DDR_REG_BASE + 0x51078*4+0x02000000,0xba61); +reg_write( DDR_REG_BASE + 0x51079*4+0x02000000,0xa01); +reg_write( DDR_REG_BASE + 0x5107a*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x5107b*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x5107c*4+0x02000000,0x917); +reg_write( DDR_REG_BASE + 0x5107d*4+0x02000000,0x70); +reg_write( DDR_REG_BASE + 0x5107e*4+0x02000000,0x72ad); +reg_write( DDR_REG_BASE + 0x5107f*4+0x02000000,0x73ad); +reg_write( DDR_REG_BASE + 0x51080*4+0x02000000,0xe98e); +reg_write( DDR_REG_BASE + 0x51081*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51082*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE + 0x51083*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51084*4+0x02000000,0x23); +reg_write( DDR_REG_BASE + 0x51085*4+0x02000000,0x71ad); +reg_write( DDR_REG_BASE + 0x51086*4+0x02000000,0xf005); +reg_write( DDR_REG_BASE + 0x51087*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51088*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE + 0x51089*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5108a*4+0x02000000,0x49); +reg_write( DDR_REG_BASE + 0x5108b*4+0x02000000,0x782b); +reg_write( DDR_REG_BASE + 0x5108c*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x5108d*4+0x02000000,0xf20a); +reg_write( DDR_REG_BASE + 0x5108e*4+0x02000000,0xf12); +reg_write( DDR_REG_BASE + 0x5108f*4+0x02000000,0xff4f); +reg_write( DDR_REG_BASE + 0x51090*4+0x02000000,0xafa); +reg_write( DDR_REG_BASE + 0x51091*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE + 0x51092*4+0x02000000,0x40a1); +reg_write( DDR_REG_BASE + 0x51093*4+0x02000000,0xe5a); +reg_write( DDR_REG_BASE + 0x51094*4+0x02000000,0xff4f); +reg_write( DDR_REG_BASE + 0x51095*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x51096*4+0x02000000,0xc6c2); +reg_write( DDR_REG_BASE + 0x51097*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x51098*4+0x02000000,0xc0f1); +reg_write( DDR_REG_BASE + 0x51099*4+0x02000000,0xf72); +reg_write( DDR_REG_BASE + 0x5109a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5109b*4+0x02000000,0xc0d1); +reg_write( DDR_REG_BASE + 0x5109c*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x5109d*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x5109e*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x5109f*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x510a0*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x510a1*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x510a2*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE + 0x510a3*4+0x02000000,0x1e8); +reg_write( DDR_REG_BASE + 0x510a4*4+0x02000000,0x9020); +reg_write( DDR_REG_BASE + 0x510a5*4+0x02000000,0x2059); +reg_write( DDR_REG_BASE + 0x510a6*4+0x02000000,0xf40); +reg_write( DDR_REG_BASE + 0x510a7*4+0x02000000,0x7724); +reg_write( DDR_REG_BASE + 0x510a8*4+0x02000000,0x7930); +reg_write( DDR_REG_BASE + 0x510a9*4+0x02000000,0x793b); +reg_write( DDR_REG_BASE + 0x510aa*4+0x02000000,0x2155); +reg_write( DDR_REG_BASE + 0x510ab*4+0x02000000,0xc0d); +reg_write( DDR_REG_BASE + 0x510ac*4+0x02000000,0x2105); +reg_write( DDR_REG_BASE + 0x510ad*4+0x02000000,0xe); +reg_write( DDR_REG_BASE + 0x510ae*4+0x02000000,0x7d05); +reg_write( DDR_REG_BASE + 0x510af*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x510b0*4+0x02000000,0x111b); +reg_write( DDR_REG_BASE + 0x510b1*4+0x02000000,0x95e0); +reg_write( DDR_REG_BASE + 0x510b2*4+0x02000000,0x83a); +reg_write( DDR_REG_BASE + 0x510b3*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x510b4*4+0x02000000,0xd896); +reg_write( DDR_REG_BASE + 0x510b5*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x510b6*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x510b7*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x510b8*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x510b9*4+0x02000000,0x6822); +reg_write( DDR_REG_BASE + 0x510ba*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE + 0x510bb*4+0x02000000,0xb8e0); +reg_write( DDR_REG_BASE + 0x510bc*4+0x02000000,0x21ca); +reg_write( DDR_REG_BASE + 0x510bd*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x510be*4+0x02000000,0x782f); +reg_write( DDR_REG_BASE + 0x510bf*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x510c0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x510c1*4+0x02000000,0xff00); +reg_write( DDR_REG_BASE + 0x510c2*4+0x02000000,0x2304); +reg_write( DDR_REG_BASE + 0x510c3*4+0x02000000,0x305b); +reg_write( DDR_REG_BASE + 0x510c4*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x510c5*4+0x02000000,0x6c0); +reg_write( DDR_REG_BASE + 0x510c6*4+0x02000000,0x79e4); +reg_write( DDR_REG_BASE + 0x510c7*4+0x02000000,0xb600); +reg_write( DDR_REG_BASE + 0x510c8*4+0x02000000,0x2145); +reg_write( DDR_REG_BASE + 0x510c9*4+0x02000000,0x3c0); +reg_write( DDR_REG_BASE + 0x510ca*4+0x02000000,0xb500); +reg_write( DDR_REG_BASE + 0x510cb*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x510cc*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x510cd*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x510ce*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x510cf*4+0x02000000,0x7101); +reg_write( DDR_REG_BASE + 0x510d0*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x510d1*4+0x02000000,0x6); +reg_write( DDR_REG_BASE + 0x510d2*4+0x02000000,0x790c); +reg_write( DDR_REG_BASE + 0x510d3*4+0x02000000,0x2985); +reg_write( DDR_REG_BASE + 0x510d4*4+0x02000000,0x41f); +reg_write( DDR_REG_BASE + 0x510d5*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x510d6*4+0x02000000,0x6901); +reg_write( DDR_REG_BASE + 0x510d7*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x510d8*4+0x02000000,0x2042); +reg_write( DDR_REG_BASE + 0x510d9*4+0x02000000,0x701); +reg_write( DDR_REG_BASE + 0x510da*4+0x02000000,0x939); +reg_write( DDR_REG_BASE + 0x510db*4+0x02000000,0x454); +reg_write( DDR_REG_BASE + 0x510dc*4+0x02000000,0x889); +reg_write( DDR_REG_BASE + 0x510dd*4+0x02000000,0xc30); +reg_write( DDR_REG_BASE + 0x510de*4+0x02000000,0xd91a); +reg_write( DDR_REG_BASE + 0x510df*4+0x02000000,0x885); +reg_write( DDR_REG_BASE + 0x510e0*4+0x02000000,0xd70); +reg_write( DDR_REG_BASE + 0x510e1*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x510e2*4+0x02000000,0x87d); +reg_write( DDR_REG_BASE + 0x510e3*4+0x02000000,0xf30); +reg_write( DDR_REG_BASE + 0x510e4*4+0x02000000,0xd918); +reg_write( DDR_REG_BASE + 0x510e5*4+0x02000000,0xe0c5); +reg_write( DDR_REG_BASE + 0x510e6*4+0x02000000,0xf227); +reg_write( DDR_REG_BASE + 0x510e7*4+0x02000000,0xe0d0); +reg_write( DDR_REG_BASE + 0x510e8*4+0x02000000,0xf227); +reg_write( DDR_REG_BASE + 0x510e9*4+0x02000000,0xe0e0); +reg_write( DDR_REG_BASE + 0x510ea*4+0x02000000,0xf227); +reg_write( DDR_REG_BASE + 0x510eb*4+0x02000000,0xe0f8); +reg_write( DDR_REG_BASE + 0x510ec*4+0x02000000,0xf227); +reg_write( DDR_REG_BASE + 0x510ed*4+0x02000000,0x208c); +reg_write( DDR_REG_BASE + 0x510ee*4+0x02000000,0x8c03); +reg_write( DDR_REG_BASE + 0x510ef*4+0x02000000,0x722c); +reg_write( DDR_REG_BASE + 0x510f0*4+0x02000000,0xf230); +reg_write( DDR_REG_BASE + 0x510f1*4+0x02000000,0x208c); +reg_write( DDR_REG_BASE + 0x510f2*4+0x02000000,0x8802); +reg_write( DDR_REG_BASE + 0x510f3*4+0x02000000,0xf419); +reg_write( DDR_REG_BASE + 0x510f4*4+0x02000000,0x732c); +reg_write( DDR_REG_BASE + 0x510f5*4+0x02000000,0xf02c); +reg_write( DDR_REG_BASE + 0x510f6*4+0x02000000,0x2025); +reg_write( DDR_REG_BASE + 0x510f7*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x510f8*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE + 0x510f9*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE + 0x510fa*4+0x02000000,0xf01b); +reg_write( DDR_REG_BASE + 0x510fb*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE + 0x510fc*4+0x02000000,0xf01b); +reg_write( DDR_REG_BASE + 0x510fd*4+0x02000000,0xf00f); +reg_write( DDR_REG_BASE + 0x510fe*4+0x02000000,0xf01b); +reg_write( DDR_REG_BASE + 0x510ff*4+0x02000000,0xf00d); +reg_write( DDR_REG_BASE + 0x51100*4+0x02000000,0xf00b); +reg_write( DDR_REG_BASE + 0x51101*4+0x02000000,0xf01b); +reg_write( DDR_REG_BASE + 0x51102*4+0x02000000,0xf009); +reg_write( DDR_REG_BASE + 0x51103*4+0x02000000,0xf009); +reg_write( DDR_REG_BASE + 0x51104*4+0x02000000,0xf019); +reg_write( DDR_REG_BASE + 0x51105*4+0x02000000,0xf007); +reg_write( DDR_REG_BASE + 0x51106*4+0x02000000,0xf005); +reg_write( DDR_REG_BASE + 0x51107*4+0x02000000,0xf005); +reg_write( DDR_REG_BASE + 0x51108*4+0x02000000,0xf017); +reg_write( DDR_REG_BASE + 0x51109*4+0x02000000,0xd93f); +reg_write( DDR_REG_BASE + 0x5110a*4+0x02000000,0xf016); +reg_write( DDR_REG_BASE + 0x5110b*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x5110c*4+0x02000000,0xf014); +reg_write( DDR_REG_BASE + 0x5110d*4+0x02000000,0xd90b); +reg_write( DDR_REG_BASE + 0x5110e*4+0x02000000,0xf012); +reg_write( DDR_REG_BASE + 0x5110f*4+0x02000000,0xd90a); +reg_write( DDR_REG_BASE + 0x51110*4+0x02000000,0xf010); +reg_write( DDR_REG_BASE + 0x51111*4+0x02000000,0xd907); +reg_write( DDR_REG_BASE + 0x51112*4+0x02000000,0xf00e); +reg_write( DDR_REG_BASE + 0x51113*4+0x02000000,0xd908); +reg_write( DDR_REG_BASE + 0x51114*4+0x02000000,0xf00c); +reg_write( DDR_REG_BASE + 0x51115*4+0x02000000,0xd93e); +reg_write( DDR_REG_BASE + 0x51116*4+0x02000000,0xf00a); +reg_write( DDR_REG_BASE + 0x51117*4+0x02000000,0xd93b); +reg_write( DDR_REG_BASE + 0x51118*4+0x02000000,0xf008); +reg_write( DDR_REG_BASE + 0x51119*4+0x02000000,0xd93a); +reg_write( DDR_REG_BASE + 0x5111a*4+0x02000000,0xf006); +reg_write( DDR_REG_BASE + 0x5111b*4+0x02000000,0xd91f); +reg_write( DDR_REG_BASE + 0x5111c*4+0x02000000,0xf004); +reg_write( DDR_REG_BASE + 0x5111d*4+0x02000000,0xd938); +reg_write( DDR_REG_BASE + 0x5111e*4+0x02000000,0xf002); +reg_write( DDR_REG_BASE + 0x5111f*4+0x02000000,0xd91b); +reg_write( DDR_REG_BASE + 0x51120*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x51121*4+0x02000000,0x4020); +reg_write( DDR_REG_BASE + 0x51122*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x51123*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x51124*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x51125*4+0x02000000,0x2482); +reg_write( DDR_REG_BASE + 0x51126*4+0x02000000,0x330f); +reg_write( DDR_REG_BASE + 0x51127*4+0x02000000,0xa8e); +reg_write( DDR_REG_BASE + 0x51128*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x51129*4+0x02000000,0xc083); +reg_write( DDR_REG_BASE + 0x5112a*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x5112b*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x5112c*4+0x02000000,0xc083); +reg_write( DDR_REG_BASE + 0x5112d*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x5112e*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE + 0x5112f*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x51130*4+0x02000000,0x600); +reg_write( DDR_REG_BASE + 0x51131*4+0x02000000,0xd92); +reg_write( DDR_REG_BASE + 0x51132*4+0x02000000,0x1a0); +reg_write( DDR_REG_BASE + 0x51133*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x51134*4+0x02000000,0xc62); +reg_write( DDR_REG_BASE + 0x51135*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51136*4+0x02000000,0xb2a); +reg_write( DDR_REG_BASE + 0x51137*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x51138*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x51139*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x5113a*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x5113b*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x5113c*4+0x02000000,0xdc); +reg_write( DDR_REG_BASE + 0x5113d*4+0x02000000,0x315); +reg_write( DDR_REG_BASE + 0x5113e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5113f*4+0x02000000,0xe90b); +reg_write( DDR_REG_BASE + 0x51140*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51141*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE + 0x51142*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51143*4+0x02000000,0x49); +reg_write( DDR_REG_BASE + 0x51144*4+0x02000000,0x7034); +reg_write( DDR_REG_BASE + 0x51145*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51146*4+0x02000000,0xf40b); +reg_write( DDR_REG_BASE + 0x51147*4+0x02000000,0x2ff); +reg_write( DDR_REG_BASE + 0x51148*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51149*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x5114a*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE + 0x5114b*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5114c*4+0x02000000,0x23); +reg_write( DDR_REG_BASE + 0x5114d*4+0x02000000,0x7034); +reg_write( DDR_REG_BASE + 0x5114e*4+0x02000000,0x2ee); +reg_write( DDR_REG_BASE + 0x5114f*4+0x02000000,0x21); +reg_write( DDR_REG_BASE + 0x51150*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x51151*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE + 0x51152*4+0x02000000,0x976); +reg_write( DDR_REG_BASE + 0x51153*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE + 0x51154*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x51155*4+0x02000000,0x216f); +reg_write( DDR_REG_BASE + 0x51156*4+0x02000000,0xc3); +reg_write( DDR_REG_BASE + 0x51157*4+0x02000000,0x1100); +reg_write( DDR_REG_BASE + 0x51158*4+0x02000000,0xc0); +reg_write( DDR_REG_BASE + 0x51159*4+0x02000000,0x89c3); +reg_write( DDR_REG_BASE + 0x5115a*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x5115b*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x5115c*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x5115d*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE + 0x5115e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5115f*4+0x02000000,0x32c); +reg_write( DDR_REG_BASE + 0x51160*4+0x02000000,0xdd2); +reg_write( DDR_REG_BASE + 0x51161*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x51162*4+0x02000000,0xdaa0); +reg_write( DDR_REG_BASE + 0x51163*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x51164*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE + 0x51165*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51166*4+0x02000000,0x28c); +reg_write( DDR_REG_BASE + 0x51167*4+0x02000000,0xdc6); +reg_write( DDR_REG_BASE + 0x51168*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x51169*4+0x02000000,0xdaa0); +reg_write( DDR_REG_BASE + 0x5116a*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x5116b*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE + 0x5116c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5116d*4+0x02000000,0x1ec); +reg_write( DDR_REG_BASE + 0x5116e*4+0x02000000,0xdb6); +reg_write( DDR_REG_BASE + 0x5116f*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x51170*4+0x02000000,0xdaa0); +reg_write( DDR_REG_BASE + 0x51171*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x51172*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE + 0x51173*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51174*4+0x02000000,0x14c); +reg_write( DDR_REG_BASE + 0x51175*4+0x02000000,0xdaa); +reg_write( DDR_REG_BASE + 0x51176*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x51177*4+0x02000000,0xdaa0); +reg_write( DDR_REG_BASE + 0x51178*4+0x02000000,0x261a); +reg_write( DDR_REG_BASE + 0x51179*4+0x02000000,0x1f8e); +reg_write( DDR_REG_BASE + 0x5117a*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x5117b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5117c*4+0x02000000,0x4338); +reg_write( DDR_REG_BASE + 0x5117d*4+0x02000000,0xf072); +reg_write( DDR_REG_BASE + 0x5117e*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x5117f*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE + 0x51180*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51181*4+0x02000000,0x124); +reg_write( DDR_REG_BASE + 0x51182*4+0x02000000,0xd8e); +reg_write( DDR_REG_BASE + 0x51183*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x51184*4+0x02000000,0xda28); +reg_write( DDR_REG_BASE + 0x51185*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE + 0x51186*4+0x02000000,0x3fc0); +reg_write( DDR_REG_BASE + 0x51187*4+0x02000000,0xd86); +reg_write( DDR_REG_BASE + 0x51188*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x51189*4+0x02000000,0xda28); +reg_write( DDR_REG_BASE + 0x5118a*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE + 0x5118b*4+0x02000000,0x3d40); +reg_write( DDR_REG_BASE + 0x5118c*4+0x02000000,0xd7a); +reg_write( DDR_REG_BASE + 0x5118d*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x5118e*4+0x02000000,0xda28); +reg_write( DDR_REG_BASE + 0x5118f*4+0x02000000,0x2355); +reg_write( DDR_REG_BASE + 0x51190*4+0x02000000,0x3800); +reg_write( DDR_REG_BASE + 0x51191*4+0x02000000,0x78c5); +reg_write( DDR_REG_BASE + 0x51192*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x51193*4+0x02000000,0x3f81); +reg_write( DDR_REG_BASE + 0x51194*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51195*4+0x02000000,0x124); +reg_write( DDR_REG_BASE + 0x51196*4+0x02000000,0xb86); +reg_write( DDR_REG_BASE + 0x51197*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x51198*4+0x02000000,0x724c); +reg_write( DDR_REG_BASE + 0x51199*4+0x02000000,0x2355); +reg_write( DDR_REG_BASE + 0x5119a*4+0x02000000,0x38c0); +reg_write( DDR_REG_BASE + 0x5119b*4+0x02000000,0x78c5); +reg_write( DDR_REG_BASE + 0x5119c*4+0x02000000,0xb7a); +reg_write( DDR_REG_BASE + 0x5119d*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x5119e*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE + 0x5119f*4+0x02000000,0x3fc1); +reg_write( DDR_REG_BASE + 0x511a0*4+0x02000000,0x2355); +reg_write( DDR_REG_BASE + 0x511a1*4+0x02000000,0x3d00); +reg_write( DDR_REG_BASE + 0x511a2*4+0x02000000,0x78c5); +reg_write( DDR_REG_BASE + 0x511a3*4+0x02000000,0xb6e); +reg_write( DDR_REG_BASE + 0x511a4*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x511a5*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE + 0x511a6*4+0x02000000,0x3d41); +reg_write( DDR_REG_BASE + 0x511a7*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x511a8*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x511a9*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE + 0x511aa*4+0x02000000,0x1003); +reg_write( DDR_REG_BASE + 0x511ab*4+0x02000000,0x8b); +reg_write( DDR_REG_BASE + 0x511ac*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x511ad*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x511ae*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE + 0x511af*4+0x02000000,0x8862); +reg_write( DDR_REG_BASE + 0x511b0*4+0x02000000,0xf03b); +reg_write( DDR_REG_BASE + 0x511b1*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x511b2*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE + 0x511b3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x511b4*4+0x02000000,0x124); +reg_write( DDR_REG_BASE + 0x511b5*4+0x02000000,0x20f4); +reg_write( DDR_REG_BASE + 0x511b6*4+0x02000000,0xde); +reg_write( DDR_REG_BASE + 0x511b7*4+0x02000000,0xd26); +reg_write( DDR_REG_BASE + 0x511b8*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x511b9*4+0x02000000,0x200a); +reg_write( DDR_REG_BASE + 0x511ba*4+0x02000000,0x780); +reg_write( DDR_REG_BASE + 0x511bb*4+0x02000000,0x4708); +reg_write( DDR_REG_BASE + 0x511bc*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE + 0x511bd*4+0x02000000,0x3fc0); +reg_write( DDR_REG_BASE + 0x511be*4+0x02000000,0x20f4); +reg_write( DDR_REG_BASE + 0x511bf*4+0x02000000,0xcd); +reg_write( DDR_REG_BASE + 0x511c0*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE + 0x511c1*4+0x02000000,0x3d40); +reg_write( DDR_REG_BASE + 0x511c2*4+0x02000000,0x20f4); +reg_write( DDR_REG_BASE + 0x511c3*4+0x02000000,0xc0); +reg_write( DDR_REG_BASE + 0x511c4*4+0x02000000,0xbdc5); +reg_write( DDR_REG_BASE + 0x511c5*4+0x02000000,0xd0a); +reg_write( DDR_REG_BASE + 0x511c6*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x511c7*4+0x02000000,0x65fd); +reg_write( DDR_REG_BASE + 0x511c8*4+0x02000000,0x235a); +reg_write( DDR_REG_BASE + 0x511c9*4+0x02000000,0x3a02); +reg_write( DDR_REG_BASE + 0x511ca*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x511cb*4+0x02000000,0x3f81); +reg_write( DDR_REG_BASE + 0x511cc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x511cd*4+0x02000000,0x32c); +reg_write( DDR_REG_BASE + 0x511ce*4+0x02000000,0x6159); +reg_write( DDR_REG_BASE + 0x511cf*4+0x02000000,0x7974); +reg_write( DDR_REG_BASE + 0x511d0*4+0x02000000,0xb1a0); +reg_write( DDR_REG_BASE + 0x511d1*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x511d2*4+0x02000000,0x3f81); +reg_write( DDR_REG_BASE + 0x511d3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x511d4*4+0x02000000,0x28c); +reg_write( DDR_REG_BASE + 0x511d5*4+0x02000000,0x615c); +reg_write( DDR_REG_BASE + 0x511d6*4+0x02000000,0x212f); +reg_write( DDR_REG_BASE + 0x511d7*4+0x02000000,0x782); +reg_write( DDR_REG_BASE + 0x511d8*4+0x02000000,0x7c74); +reg_write( DDR_REG_BASE + 0x511d9*4+0x02000000,0x216c); +reg_write( DDR_REG_BASE + 0x511da*4+0x02000000,0x101); +reg_write( DDR_REG_BASE + 0x511db*4+0x02000000,0xb420); +reg_write( DDR_REG_BASE + 0x511dc*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x511dd*4+0x02000000,0x3f81); +reg_write( DDR_REG_BASE + 0x511de*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x511df*4+0x02000000,0x1ec); +reg_write( DDR_REG_BASE + 0x511e0*4+0x02000000,0x6159); +reg_write( DDR_REG_BASE + 0x511e1*4+0x02000000,0x7974); +reg_write( DDR_REG_BASE + 0x511e2*4+0x02000000,0xb1e0); +reg_write( DDR_REG_BASE + 0x511e3*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x511e4*4+0x02000000,0x3f81); +reg_write( DDR_REG_BASE + 0x511e5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x511e6*4+0x02000000,0x14c); +reg_write( DDR_REG_BASE + 0x511e7*4+0x02000000,0x6159); +reg_write( DDR_REG_BASE + 0x511e8*4+0x02000000,0x7974); +reg_write( DDR_REG_BASE + 0x511e9*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE + 0x511ea*4+0x02000000,0x7164); +reg_write( DDR_REG_BASE + 0x511eb*4+0x02000000,0xb8f); +reg_write( DDR_REG_BASE + 0x511ec*4+0x02000000,0x90c5); +reg_write( DDR_REG_BASE + 0x511ed*4+0x02000000,0x7167); +reg_write( DDR_REG_BASE + 0x511ee*4+0x02000000,0xb21); +reg_write( DDR_REG_BASE + 0x511ef*4+0x02000000,0xb134); +reg_write( DDR_REG_BASE + 0x511f0*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x511f1*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x511f2*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x511f3*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x511f4*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE + 0x511f5*4+0x02000000,0xd92e); +reg_write( DDR_REG_BASE + 0x511f6*4+0x02000000,0xb99f); +reg_write( DDR_REG_BASE + 0x511f7*4+0x02000000,0x2140); +reg_write( DDR_REG_BASE + 0x511f8*4+0x02000000,0x98e); +reg_write( DDR_REG_BASE + 0x511f9*4+0x02000000,0x7014); +reg_write( DDR_REG_BASE + 0x511fa*4+0x02000000,0x2642); +reg_write( DDR_REG_BASE + 0x511fb*4+0x02000000,0x1283); +reg_write( DDR_REG_BASE + 0x511fc*4+0x02000000,0x2142); +reg_write( DDR_REG_BASE + 0x511fd*4+0x02000000,0x280); +reg_write( DDR_REG_BASE + 0x511fe*4+0x02000000,0x23ca); +reg_write( DDR_REG_BASE + 0x511ff*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x51200*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x51201*4+0x02000000,0x26ca); +reg_write( DDR_REG_BASE + 0x51202*4+0x02000000,0x1041); +reg_write( DDR_REG_BASE + 0x51203*4+0x02000000,0x4308); +reg_write( DDR_REG_BASE + 0x51204*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x51205*4+0x02000000,0xf05e); +reg_write( DDR_REG_BASE + 0x51206*4+0x02000000,0xdb1); +reg_write( DDR_REG_BASE + 0x51207*4+0x02000000,0x12e0); +reg_write( DDR_REG_BASE + 0x51208*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x51209*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x5120a*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5120b*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE + 0x5120c*4+0x02000000,0x1003); +reg_write( DDR_REG_BASE + 0x5120d*4+0x02000000,0x9f); +reg_write( DDR_REG_BASE + 0x5120e*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x5120f*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51210*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE + 0x51211*4+0x02000000,0x8882); +reg_write( DDR_REG_BASE + 0x51212*4+0x02000000,0xba8f); +reg_write( DDR_REG_BASE + 0x51213*4+0x02000000,0x4358); +reg_write( DDR_REG_BASE + 0x51214*4+0x02000000,0xf031); +reg_write( DDR_REG_BASE + 0x51215*4+0x02000000,0x255a); +reg_write( DDR_REG_BASE + 0x51216*4+0x02000000,0x1a0f); +reg_write( DDR_REG_BASE + 0x51217*4+0x02000000,0xc101); +reg_write( DDR_REG_BASE + 0x51218*4+0x02000000,0x921); +reg_write( DDR_REG_BASE + 0x51219*4+0x02000000,0x32); +reg_write( DDR_REG_BASE + 0x5121a*4+0x02000000,0x235a); +reg_write( DDR_REG_BASE + 0x5121b*4+0x02000000,0x1a00); +reg_write( DDR_REG_BASE + 0x5121c*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x5121d*4+0x02000000,0x3f81); +reg_write( DDR_REG_BASE + 0x5121e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5121f*4+0x02000000,0x28c); +reg_write( DDR_REG_BASE + 0x51220*4+0x02000000,0x61f9); +reg_write( DDR_REG_BASE + 0x51221*4+0x02000000,0x21f4); +reg_write( DDR_REG_BASE + 0x51222*4+0x02000000,0x302); +reg_write( DDR_REG_BASE + 0x51223*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x51224*4+0x02000000,0x3f81); +reg_write( DDR_REG_BASE + 0x51225*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51226*4+0x02000000,0x32c); +reg_write( DDR_REG_BASE + 0x51227*4+0x02000000,0xf009); +reg_write( DDR_REG_BASE + 0x51228*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x51229*4+0x02000000,0x3f81); +reg_write( DDR_REG_BASE + 0x5122a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5122b*4+0x02000000,0x1ec); +reg_write( DDR_REG_BASE + 0x5122c*4+0x02000000,0x61fa); +reg_write( DDR_REG_BASE + 0x5122d*4+0x02000000,0x22f4); +reg_write( DDR_REG_BASE + 0x5122e*4+0x02000000,0x302); +reg_write( DDR_REG_BASE + 0x5122f*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x51230*4+0x02000000,0x21f4); +reg_write( DDR_REG_BASE + 0x51231*4+0x02000000,0x301); +reg_write( DDR_REG_BASE + 0x51232*4+0x02000000,0x7942); +reg_write( DDR_REG_BASE + 0x51233*4+0x02000000,0x2608); +reg_write( DDR_REG_BASE + 0x51234*4+0x02000000,0x3042); +reg_write( DDR_REG_BASE + 0x51235*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x51236*4+0x02000000,0x3f81); +reg_write( DDR_REG_BASE + 0x51237*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51238*4+0x02000000,0x14c); +reg_write( DDR_REG_BASE + 0x51239*4+0x02000000,0x673f); +reg_write( DDR_REG_BASE + 0x5123a*4+0x02000000,0x6038); +reg_write( DDR_REG_BASE + 0x5123b*4+0x02000000,0x27f4); +reg_write( DDR_REG_BASE + 0x5123c*4+0x02000000,0x130f); +reg_write( DDR_REG_BASE + 0x5123d*4+0x02000000,0x20f4); +reg_write( DDR_REG_BASE + 0x5123e*4+0x02000000,0x300); +reg_write( DDR_REG_BASE + 0x5123f*4+0x02000000,0x212f); +reg_write( DDR_REG_BASE + 0x51240*4+0x02000000,0x6c6); +reg_write( DDR_REG_BASE + 0x51241*4+0x02000000,0x7185); +reg_write( DDR_REG_BASE + 0x51242*4+0x02000000,0x78e2); +reg_write( DDR_REG_BASE + 0x51243*4+0x02000000,0x2108); +reg_write( DDR_REG_BASE + 0x51244*4+0x02000000,0x1b); +reg_write( DDR_REG_BASE + 0x51245*4+0x02000000,0xfa3); +reg_write( DDR_REG_BASE + 0x51246*4+0x02000000,0xb325); +reg_write( DDR_REG_BASE + 0x51247*4+0x02000000,0x262f); +reg_write( DDR_REG_BASE + 0x51248*4+0x02000000,0x3086); +reg_write( DDR_REG_BASE + 0x51249*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x5124a*4+0x02000000,0x80f); +reg_write( DDR_REG_BASE + 0x5124b*4+0x02000000,0x32); +reg_write( DDR_REG_BASE + 0x5124c*4+0x02000000,0x200a); +reg_write( DDR_REG_BASE + 0x5124d*4+0x02000000,0x780); +reg_write( DDR_REG_BASE + 0x5124e*4+0x02000000,0xb5e); +reg_write( DDR_REG_BASE + 0x5124f*4+0x02000000,0xff4f); +reg_write( DDR_REG_BASE + 0x51250*4+0x02000000,0xf005); +reg_write( DDR_REG_BASE + 0x51251*4+0x02000000,0xb12); +reg_write( DDR_REG_BASE + 0x51252*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x51253*4+0x02000000,0x200a); +reg_write( DDR_REG_BASE + 0x51254*4+0x02000000,0x780); +reg_write( DDR_REG_BASE + 0x51255*4+0x02000000,0x4100); +reg_write( DDR_REG_BASE + 0x51256*4+0x02000000,0xb06); +reg_write( DDR_REG_BASE + 0x51257*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x51258*4+0x02000000,0x202f); +reg_write( DDR_REG_BASE + 0x51259*4+0x02000000,0x6c6); +reg_write( DDR_REG_BASE + 0x5125a*4+0x02000000,0x1b01); +reg_write( DDR_REG_BASE + 0x5125b*4+0x02000000,0x52); +reg_write( DDR_REG_BASE + 0x5125c*4+0x02000000,0x1e01); +reg_write( DDR_REG_BASE + 0x5125d*4+0x02000000,0x1012); +reg_write( DDR_REG_BASE + 0x5125e*4+0x02000000,0x77a5); +reg_write( DDR_REG_BASE + 0x5125f*4+0x02000000,0xd51); +reg_write( DDR_REG_BASE + 0x51260*4+0x02000000,0x9013); +reg_write( DDR_REG_BASE + 0x51261*4+0x02000000,0x7765); +reg_write( DDR_REG_BASE + 0x51262*4+0x02000000,0xbfb); +reg_write( DDR_REG_BASE + 0x51263*4+0x02000000,0x9033); +reg_write( DDR_REG_BASE + 0x51264*4+0x02000000,0x71ad); +reg_write( DDR_REG_BASE + 0x51265*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51266*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x51267*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51268*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE + 0x51269*4+0x02000000,0xd92a); +reg_write( DDR_REG_BASE + 0x5126a*4+0x02000000,0xb99f); +reg_write( DDR_REG_BASE + 0x5126b*4+0x02000000,0x2140); +reg_write( DDR_REG_BASE + 0x5126c*4+0x02000000,0x98b); +reg_write( DDR_REG_BASE + 0x5126d*4+0x02000000,0x7014); +reg_write( DDR_REG_BASE + 0x5126e*4+0x02000000,0x2342); +reg_write( DDR_REG_BASE + 0x5126f*4+0x02000000,0x1100); +reg_write( DDR_REG_BASE + 0x51270*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x51271*4+0x02000000,0x23ca); +reg_write( DDR_REG_BASE + 0x51272*4+0x02000000,0x1041); +reg_write( DDR_REG_BASE + 0x51273*4+0x02000000,0x690c); +reg_write( DDR_REG_BASE + 0x51274*4+0x02000000,0xc101); +reg_write( DDR_REG_BASE + 0x51275*4+0x02000000,0x21ca); +reg_write( DDR_REG_BASE + 0x51276*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x51277*4+0x02000000,0xc141); +reg_write( DDR_REG_BASE + 0x51278*4+0x02000000,0xf045); +reg_write( DDR_REG_BASE + 0x51279*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x5127a*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5127b*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE + 0x5127c*4+0x02000000,0x1003); +reg_write( DDR_REG_BASE + 0x5127d*4+0x02000000,0x9e); +reg_write( DDR_REG_BASE + 0x5127e*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x5127f*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51280*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE + 0x51281*4+0x02000000,0x8842); +reg_write( DDR_REG_BASE + 0x51282*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x51283*4+0x02000000,0xb88f); +reg_write( DDR_REG_BASE + 0x51284*4+0x02000000,0x4100); +reg_write( DDR_REG_BASE + 0x51285*4+0x02000000,0xf023); +reg_write( DDR_REG_BASE + 0x51286*4+0x02000000,0xc602); +reg_write( DDR_REG_BASE + 0x51287*4+0x02000000,0x235a); +reg_write( DDR_REG_BASE + 0x51288*4+0x02000000,0x3a0c); +reg_write( DDR_REG_BASE + 0x51289*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x5128a*4+0x02000000,0x3f8d); +reg_write( DDR_REG_BASE + 0x5128b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5128c*4+0x02000000,0x1ec); +reg_write( DDR_REG_BASE + 0x5128d*4+0x02000000,0x265a); +reg_write( DDR_REG_BASE + 0x5128e*4+0x02000000,0x1a0e); +reg_write( DDR_REG_BASE + 0x5128f*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x51290*4+0x02000000,0x3f8f); +reg_write( DDR_REG_BASE + 0x51291*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51292*4+0x02000000,0x14c); +reg_write( DDR_REG_BASE + 0x51293*4+0x02000000,0x6599); +reg_write( DDR_REG_BASE + 0x51294*4+0x02000000,0x21f4); +reg_write( DDR_REG_BASE + 0x51295*4+0x02000000,0x9f); +reg_write( DDR_REG_BASE + 0x51296*4+0x02000000,0x67d9); +reg_write( DDR_REG_BASE + 0x51297*4+0x02000000,0x21f4); +reg_write( DDR_REG_BASE + 0x51298*4+0x02000000,0x81); +reg_write( DDR_REG_BASE + 0x51299*4+0x02000000,0x64fc); +reg_write( DDR_REG_BASE + 0x5129a*4+0x02000000,0x65dd); +reg_write( DDR_REG_BASE + 0x5129b*4+0x02000000,0x2102); +reg_write( DDR_REG_BASE + 0x5129c*4+0x02000000,0x7c1); +reg_write( DDR_REG_BASE + 0x5129d*4+0x02000000,0x2308); +reg_write( DDR_REG_BASE + 0x5129e*4+0x02000000,0x41); +reg_write( DDR_REG_BASE + 0x5129f*4+0x02000000,0x24f4); +reg_write( DDR_REG_BASE + 0x512a0*4+0x02000000,0x108c); +reg_write( DDR_REG_BASE + 0x512a1*4+0x02000000,0x25f4); +reg_write( DDR_REG_BASE + 0x512a2*4+0x02000000,0x1083); +reg_write( DDR_REG_BASE + 0x512a3*4+0x02000000,0x7144); +reg_write( DDR_REG_BASE + 0x512a4*4+0x02000000,0x7b82); +reg_write( DDR_REG_BASE + 0x512a5*4+0x02000000,0x2008); +reg_write( DDR_REG_BASE + 0x512a6*4+0x02000000,0xc0); +reg_write( DDR_REG_BASE + 0x512a7*4+0x02000000,0x780e); +reg_write( DDR_REG_BASE + 0x512a8*4+0x02000000,0xebd); +reg_write( DDR_REG_BASE + 0x512a9*4+0x02000000,0xb0a5); +reg_write( DDR_REG_BASE + 0x512aa*4+0x02000000,0x7b2e); +reg_write( DDR_REG_BASE + 0x512ab*4+0x02000000,0xa5e); +reg_write( DDR_REG_BASE + 0x512ac*4+0x02000000,0xff4f); +reg_write( DDR_REG_BASE + 0x512ad*4+0x02000000,0x4200); +reg_write( DDR_REG_BASE + 0x512ae*4+0x02000000,0xa56); +reg_write( DDR_REG_BASE + 0x512af*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x512b0*4+0x02000000,0x4060); +reg_write( DDR_REG_BASE + 0x512b1*4+0x02000000,0xc101); +reg_write( DDR_REG_BASE + 0x512b2*4+0x02000000,0x7767); +reg_write( DDR_REG_BASE + 0x512b3*4+0x02000000,0x1901); +reg_write( DDR_REG_BASE + 0x512b4*4+0x02000000,0x92); +reg_write( DDR_REG_BASE + 0x512b5*4+0x02000000,0xc141); +reg_write( DDR_REG_BASE + 0x512b6*4+0x02000000,0x1b01); +reg_write( DDR_REG_BASE + 0x512b7*4+0x02000000,0x1012); +reg_write( DDR_REG_BASE + 0x512b8*4+0x02000000,0xb83); +reg_write( DDR_REG_BASE + 0x512b9*4+0x02000000,0xb013); +reg_write( DDR_REG_BASE + 0x512ba*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE + 0x512bb*4+0x02000000,0x7704); +reg_write( DDR_REG_BASE + 0x512bc*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x512bd*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE + 0x512be*4+0x02000000,0x8f5); +reg_write( DDR_REG_BASE + 0x512bf*4+0x02000000,0x8033); +reg_write( DDR_REG_BASE + 0x512c0*4+0x02000000,0x716f); +reg_write( DDR_REG_BASE + 0x512c1*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x512c2*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE + 0x512c3*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x512c4*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE + 0x512c5*4+0x02000000,0x6901); +reg_write( DDR_REG_BASE + 0x512c6*4+0x02000000,0x790f); +reg_write( DDR_REG_BASE + 0x512c7*4+0x02000000,0x7134); +reg_write( DDR_REG_BASE + 0x512c8*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x512c9*4+0x02000000,0x7002); +reg_write( DDR_REG_BASE + 0x512ca*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x512cb*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE + 0x512cc*4+0x02000000,0x4e6); +reg_write( DDR_REG_BASE + 0x512cd*4+0x02000000,0xffce); +reg_write( DDR_REG_BASE + 0x512ce*4+0x02000000,0xe7e); +reg_write( DDR_REG_BASE + 0x512cf*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x512d0*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE + 0x512d1*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x512d2*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x512d3*4+0x02000000,0x7344); +reg_write( DDR_REG_BASE + 0x512d4*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x512d5*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE + 0x512d6*4+0x02000000,0xe8a); +reg_write( DDR_REG_BASE + 0x512d7*4+0x02000000,0xc0); +reg_write( DDR_REG_BASE + 0x512d8*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x512d9*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x512da*4+0x02000000,0xe174); +reg_write( DDR_REG_BASE + 0x512db*4+0x02000000,0xb0a0); +reg_write( DDR_REG_BASE + 0x512dc*4+0x02000000,0xf32); +reg_write( DDR_REG_BASE + 0x512dd*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x512de*4+0x02000000,0xb0a1); +reg_write( DDR_REG_BASE + 0x512df*4+0x02000000,0x2480); +reg_write( DDR_REG_BASE + 0x512e0*4+0x02000000,0x330f); +reg_write( DDR_REG_BASE + 0x512e1*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x512e2*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x512e3*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x512e4*4+0x02000000,0xc2e4); +reg_write( DDR_REG_BASE + 0x512e5*4+0x02000000,0xc1a4); +reg_write( DDR_REG_BASE + 0x512e6*4+0x02000000,0x4608); +reg_write( DDR_REG_BASE + 0x512e7*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x512e8*4+0x02000000,0xe42); +reg_write( DDR_REG_BASE + 0x512e9*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x512ea*4+0x02000000,0xd9ff); +reg_write( DDR_REG_BASE + 0x512eb*4+0x02000000,0x1200); +reg_write( DDR_REG_BASE + 0x512ec*4+0x02000000,0x3083); +reg_write( DDR_REG_BASE + 0x512ed*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x512ee*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x512ef*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x512f0*4+0x02000000,0x4528); +reg_write( DDR_REG_BASE + 0x512f1*4+0x02000000,0xc143); +reg_write( DDR_REG_BASE + 0x512f2*4+0x02000000,0xc142); +reg_write( DDR_REG_BASE + 0x512f3*4+0x02000000,0xc141); +reg_write( DDR_REG_BASE + 0x512f4*4+0x02000000,0xf02); +reg_write( DDR_REG_BASE + 0x512f5*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x512f6*4+0x02000000,0xc140); +reg_write( DDR_REG_BASE + 0x512f7*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x512f8*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE + 0x512f9*4+0x02000000,0x764c); +reg_write( DDR_REG_BASE + 0x512fa*4+0x02000000,0xdb20); +reg_write( DDR_REG_BASE + 0x512fb*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x512fc*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x512fd*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x512fe*4+0x02000000,0xeee); +reg_write( DDR_REG_BASE + 0x512ff*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x51300*4+0x02000000,0x1c00); +reg_write( DDR_REG_BASE + 0x51301*4+0x02000000,0x3041); +reg_write( DDR_REG_BASE + 0x51302*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x51303*4+0x02000000,0xea6); +reg_write( DDR_REG_BASE + 0x51304*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x51305*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51306*4+0x02000000,0xc0a4); +reg_write( DDR_REG_BASE + 0x51307*4+0x02000000,0xc6c4); +reg_write( DDR_REG_BASE + 0x51308*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x51309*4+0x02000000,0xc1a4); +reg_write( DDR_REG_BASE + 0x5130a*4+0x02000000,0xd849); +reg_write( DDR_REG_BASE + 0x5130b*4+0x02000000,0xb89f); +reg_write( DDR_REG_BASE + 0x5130c*4+0x02000000,0x88e0); +reg_write( DDR_REG_BASE + 0x5130d*4+0x02000000,0x10da); +reg_write( DDR_REG_BASE + 0x5130e*4+0x02000000,0x808e); +reg_write( DDR_REG_BASE + 0x5130f*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x51310*4+0x02000000,0xdf2); +reg_write( DDR_REG_BASE + 0x51311*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x51312*4+0x02000000,0xd9ff); +reg_write( DDR_REG_BASE + 0x51313*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x51314*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x51315*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x51316*4+0x02000000,0x736c); +reg_write( DDR_REG_BASE + 0x51317*4+0x02000000,0x4528); +reg_write( DDR_REG_BASE + 0x51318*4+0x02000000,0xc143); +reg_write( DDR_REG_BASE + 0x51319*4+0x02000000,0xc142); +reg_write( DDR_REG_BASE + 0x5131a*4+0x02000000,0xc141); +reg_write( DDR_REG_BASE + 0x5131b*4+0x02000000,0xeb6); +reg_write( DDR_REG_BASE + 0x5131c*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x5131d*4+0x02000000,0xc140); +reg_write( DDR_REG_BASE + 0x5131e*4+0x02000000,0x7ee5); +reg_write( DDR_REG_BASE + 0x5131f*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x51320*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE + 0x51321*4+0x02000000,0xda09); +reg_write( DDR_REG_BASE + 0x51322*4+0x02000000,0xdb20); +reg_write( DDR_REG_BASE + 0x51323*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x51324*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x51325*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x51326*4+0x02000000,0xe9e); +reg_write( DDR_REG_BASE + 0x51327*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x51328*4+0x02000000,0x1c00); +reg_write( DDR_REG_BASE + 0x51329*4+0x02000000,0x3041); +reg_write( DDR_REG_BASE + 0x5132a*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x5132b*4+0x02000000,0xe56); +reg_write( DDR_REG_BASE + 0x5132c*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x5132d*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x5132e*4+0x02000000,0xc0a4); +reg_write( DDR_REG_BASE + 0x5132f*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x51330*4+0x02000000,0x21aa); +reg_write( DDR_REG_BASE + 0x51331*4+0x02000000,0xc4); +reg_write( DDR_REG_BASE + 0x51332*4+0x02000000,0x911); +reg_write( DDR_REG_BASE + 0x51333*4+0x02000000,0x3f); +reg_write( DDR_REG_BASE + 0x51334*4+0x02000000,0x722c); +reg_write( DDR_REG_BASE + 0x51335*4+0x02000000,0x21ab); +reg_write( DDR_REG_BASE + 0x51336*4+0x02000000,0xc4); +reg_write( DDR_REG_BASE + 0x51337*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51338*4+0x02000000,0x21ab); +reg_write( DDR_REG_BASE + 0x51339*4+0x02000000,0xc4); +reg_write( DDR_REG_BASE + 0x5133a*4+0x02000000,0x80f); +reg_write( DDR_REG_BASE + 0x5133b*4+0x02000000,0x415); +reg_write( DDR_REG_BASE + 0x5133c*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x5133d*4+0x02000000,0x7100); +reg_write( DDR_REG_BASE + 0x5133e*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE + 0x5133f*4+0x02000000,0x1d6); +reg_write( DDR_REG_BASE + 0x51340*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x51341*4+0x02000000,0x21aa); +reg_write( DDR_REG_BASE + 0x51342*4+0x02000000,0x104); +reg_write( DDR_REG_BASE + 0x51343*4+0x02000000,0x7b32); +reg_write( DDR_REG_BASE + 0x51344*4+0x02000000,0xb19); +reg_write( DDR_REG_BASE + 0x51345*4+0x02000000,0x25); +reg_write( DDR_REG_BASE + 0x51346*4+0x02000000,0x24aa); +reg_write( DDR_REG_BASE + 0x51347*4+0x02000000,0x1144); +reg_write( DDR_REG_BASE + 0x51348*4+0x02000000,0x22aa); +reg_write( DDR_REG_BASE + 0x51349*4+0x02000000,0x104); +reg_write( DDR_REG_BASE + 0x5134a*4+0x02000000,0x9fd); +reg_write( DDR_REG_BASE + 0x5134b*4+0x02000000,0x8084); +reg_write( DDR_REG_BASE + 0x5134c*4+0x02000000,0x7862); +reg_write( DDR_REG_BASE + 0x5134d*4+0x02000000,0x24aa); +reg_write( DDR_REG_BASE + 0x5134e*4+0x02000000,0x1144); +reg_write( DDR_REG_BASE + 0x5134f*4+0x02000000,0xf003); +reg_write( DDR_REG_BASE + 0x51350*4+0x02000000,0x6038); +reg_write( DDR_REG_BASE + 0x51351*4+0x02000000,0x21aa); +reg_write( DDR_REG_BASE + 0x51352*4+0x02000000,0x104); +reg_write( DDR_REG_BASE + 0x51353*4+0x02000000,0x7110); +reg_write( DDR_REG_BASE + 0x51354*4+0x02000000,0x20e1); +reg_write( DDR_REG_BASE + 0x51355*4+0x02000000,0x7c6); +reg_write( DDR_REG_BASE + 0x51356*4+0x02000000,0x22aa); +reg_write( DDR_REG_BASE + 0x51357*4+0x02000000,0x144); +reg_write( DDR_REG_BASE + 0x51358*4+0x02000000,0xcf3); +reg_write( DDR_REG_BASE + 0x51359*4+0x02000000,0x9080); +reg_write( DDR_REG_BASE + 0x5135a*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x5135b*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x5135c*4+0x02000000,0xc0f1); +reg_write( DDR_REG_BASE + 0x5135d*4+0x02000000,0x822); +reg_write( DDR_REG_BASE + 0x5135e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5135f*4+0x02000000,0xfa6); +reg_write( DDR_REG_BASE + 0x51360*4+0x02000000,0xffcf); +reg_write( DDR_REG_BASE + 0x51361*4+0x02000000,0xc0d1); +reg_write( DDR_REG_BASE + 0x51362*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x51363*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x51364*4+0x02000000,0xc0f1); +reg_write( DDR_REG_BASE + 0x51365*4+0x02000000,0xf4a); +reg_write( DDR_REG_BASE + 0x51366*4+0x02000000,0xffcf); +reg_write( DDR_REG_BASE + 0x51367*4+0x02000000,0xf96); +reg_write( DDR_REG_BASE + 0x51368*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x51369*4+0x02000000,0xd814); +reg_write( DDR_REG_BASE + 0x5136a*4+0x02000000,0xc0d1); +reg_write( DDR_REG_BASE + 0x5136b*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x5136c*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x5136d*4+0x02000000,0x7103); +reg_write( DDR_REG_BASE + 0x5136e*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5136f*4+0x02000000,0x6); +reg_write( DDR_REG_BASE + 0x51370*4+0x02000000,0x231a); +reg_write( DDR_REG_BASE + 0x51371*4+0x02000000,0x2); +reg_write( DDR_REG_BASE + 0x51372*4+0x02000000,0x2a05); +reg_write( DDR_REG_BASE + 0x51373*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE + 0x51374*4+0x02000000,0x1e); +reg_write( DDR_REG_BASE + 0x51375*4+0x02000000,0x8480); +reg_write( DDR_REG_BASE + 0x51376*4+0x02000000,0x815); +reg_write( DDR_REG_BASE + 0x51377*4+0x02000000,0xf84); +reg_write( DDR_REG_BASE + 0x51378*4+0x02000000,0x3); +reg_write( DDR_REG_BASE + 0x51379*4+0x02000000,0xd41); +reg_write( DDR_REG_BASE + 0x5137a*4+0x02000000,0x2885); +reg_write( DDR_REG_BASE + 0x5137b*4+0x02000000,0xa0f); +reg_write( DDR_REG_BASE + 0x5137c*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x5137d*4+0x02000000,0xc2); +reg_write( DDR_REG_BASE + 0x5137e*4+0x02000000,0x2a85); +reg_write( DDR_REG_BASE + 0x5137f*4+0x02000000,0x41f); +reg_write( DDR_REG_BASE + 0x51380*4+0x02000000,0x783d); +reg_write( DDR_REG_BASE + 0x51381*4+0x02000000,0x7050); +reg_write( DDR_REG_BASE + 0x51382*4+0x02000000,0x22ca); +reg_write( DDR_REG_BASE + 0x51383*4+0x02000000,0xd); +reg_write( DDR_REG_BASE + 0x51384*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x51385*4+0x02000000,0x6a01); +reg_write( DDR_REG_BASE + 0x51386*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x51387*4+0x02000000,0xa7e); +reg_write( DDR_REG_BASE + 0x51388*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE + 0x51389*4+0x02000000,0xc1a4); +reg_write( DDR_REG_BASE + 0x5138a*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x5138b*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x5138c*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x5138d*4+0x02000000,0x791d); +reg_write( DDR_REG_BASE + 0x5138e*4+0x02000000,0xb9c3); +reg_write( DDR_REG_BASE + 0x5138f*4+0x02000000,0xdd49); +reg_write( DDR_REG_BASE + 0x51390*4+0x02000000,0x1a02); +reg_write( DDR_REG_BASE + 0x51391*4+0x02000000,0x3042); +reg_write( DDR_REG_BASE + 0x51392*4+0x02000000,0xbd9f); +reg_write( DDR_REG_BASE + 0x51393*4+0x02000000,0x8d00); +reg_write( DDR_REG_BASE + 0x51394*4+0x02000000,0xe80b); +reg_write( DDR_REG_BASE + 0x51395*4+0x02000000,0x215f); +reg_write( DDR_REG_BASE + 0x51396*4+0x02000000,0x100); +reg_write( DDR_REG_BASE + 0x51397*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51398*4+0x02000000,0x7082); +reg_write( DDR_REG_BASE + 0x51399*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5139a*4+0x02000000,0x48); +reg_write( DDR_REG_BASE + 0x5139b*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE + 0x5139c*4+0x02000000,0xe00); +reg_write( DDR_REG_BASE + 0x5139d*4+0x02000000,0x621e); +reg_write( DDR_REG_BASE + 0x5139e*4+0x02000000,0xf005); +reg_write( DDR_REG_BASE + 0x5139f*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x513a0*4+0x02000000,0x708e); +reg_write( DDR_REG_BASE + 0x513a1*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x513a2*4+0x02000000,0x22); +reg_write( DDR_REG_BASE + 0x513a3*4+0x02000000,0xa46); +reg_write( DDR_REG_BASE + 0x513a4*4+0x02000000,0xff8f); +reg_write( DDR_REG_BASE + 0x513a5*4+0x02000000,0x79cf); +reg_write( DDR_REG_BASE + 0x513a6*4+0x02000000,0x7b3d); +reg_write( DDR_REG_BASE + 0x513a7*4+0x02000000,0x7a3d); +reg_write( DDR_REG_BASE + 0x513a8*4+0x02000000,0x2653); +reg_write( DDR_REG_BASE + 0x513a9*4+0x02000000,0x907e); +reg_write( DDR_REG_BASE + 0x513aa*4+0x02000000,0x7b7d); +reg_write( DDR_REG_BASE + 0x513ab*4+0x02000000,0x7a5d); +reg_write( DDR_REG_BASE + 0x513ac*4+0x02000000,0x23c0); +reg_write( DDR_REG_BASE + 0x513ad*4+0x02000000,0x62); +reg_write( DDR_REG_BASE + 0x513ae*4+0x02000000,0x7a5d); +reg_write( DDR_REG_BASE + 0x513af*4+0x02000000,0x2653); +reg_write( DDR_REG_BASE + 0x513b0*4+0x02000000,0x9081); +reg_write( DDR_REG_BASE + 0x513b1*4+0x02000000,0xb8c3); +reg_write( DDR_REG_BASE + 0x513b2*4+0x02000000,0x22c0); +reg_write( DDR_REG_BASE + 0x513b3*4+0x02000000,0x62); +reg_write( DDR_REG_BASE + 0x513b4*4+0x02000000,0x1a03); +reg_write( DDR_REG_BASE + 0x513b5*4+0x02000000,0x3002); +reg_write( DDR_REG_BASE + 0x513b6*4+0x02000000,0x1a05); +reg_write( DDR_REG_BASE + 0x513b7*4+0x02000000,0x30c2); +reg_write( DDR_REG_BASE + 0x513b8*4+0x02000000,0x1a07); +reg_write( DDR_REG_BASE + 0x513b9*4+0x02000000,0x3042); +reg_write( DDR_REG_BASE + 0x513ba*4+0x02000000,0x1a04); +reg_write( DDR_REG_BASE + 0x513bb*4+0x02000000,0x3082); +reg_write( DDR_REG_BASE + 0x513bc*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x513bd*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x513be*4+0x02000000,0x53); +reg_write( DDR_REG_BASE + 0x513bf*4+0x02000000,0x3); +reg_write( DDR_REG_BASE + 0x513c0*4+0x02000000,0x8e2); +reg_write( DDR_REG_BASE + 0x513c1*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x513c2*4+0x02000000,0xd80a); +reg_write( DDR_REG_BASE + 0x513c3*4+0x02000000,0x216f); +reg_write( DDR_REG_BASE + 0x513c4*4+0x02000000,0xc3); +reg_write( DDR_REG_BASE + 0x513c5*4+0x02000000,0x8900); +reg_write( DDR_REG_BASE + 0x513c6*4+0x02000000,0xb8e2); +reg_write( DDR_REG_BASE + 0x513c7*4+0x02000000,0xd87f); +reg_write( DDR_REG_BASE + 0x513c8*4+0x02000000,0x20ca); +reg_write( DDR_REG_BASE + 0x513c9*4+0x02000000,0x1e2); +reg_write( DDR_REG_BASE + 0x513ca*4+0x02000000,0x1a08); +reg_write( DDR_REG_BASE + 0x513cb*4+0x02000000,0x3002); +reg_write( DDR_REG_BASE + 0x513cc*4+0x02000000,0x1122); +reg_write( DDR_REG_BASE + 0x513cd*4+0x02000000,0x48f); +reg_write( DDR_REG_BASE + 0x513ce*4+0x02000000,0x8d60); +reg_write( DDR_REG_BASE + 0x513cf*4+0x02000000,0x4528); +reg_write( DDR_REG_BASE + 0x513d0*4+0x02000000,0x2142); +reg_write( DDR_REG_BASE + 0x513d1*4+0x02000000,0x4c0); +reg_write( DDR_REG_BASE + 0x513d2*4+0x02000000,0x2142); +reg_write( DDR_REG_BASE + 0x513d3*4+0x02000000,0x74e); +reg_write( DDR_REG_BASE + 0x513d4*4+0x02000000,0x150e); +reg_write( DDR_REG_BASE + 0x513d5*4+0x02000000,0x148b); +reg_write( DDR_REG_BASE + 0x513d6*4+0x02000000,0x9080); +reg_write( DDR_REG_BASE + 0x513d7*4+0x02000000,0x8842); +reg_write( DDR_REG_BASE + 0x513d8*4+0x02000000,0x9600); +reg_write( DDR_REG_BASE + 0x513d9*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x513da*4+0x02000000,0x54); +reg_write( DDR_REG_BASE + 0x513db*4+0x02000000,0x6); +reg_write( DDR_REG_BASE + 0x513dc*4+0x02000000,0xc241); +reg_write( DDR_REG_BASE + 0x513dd*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE + 0x513de*4+0x02000000,0xd80a); +reg_write( DDR_REG_BASE + 0x513df*4+0x02000000,0x4261); +reg_write( DDR_REG_BASE + 0x513e0*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE + 0x513e1*4+0x02000000,0x8a2); +reg_write( DDR_REG_BASE + 0x513e2*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x513e3*4+0x02000000,0xc440); +reg_write( DDR_REG_BASE + 0x513e4*4+0x02000000,0x1501); +reg_write( DDR_REG_BASE + 0x513e5*4+0x02000000,0x1483); +reg_write( DDR_REG_BASE + 0x513e6*4+0x02000000,0x8d21); +reg_write( DDR_REG_BASE + 0x513e7*4+0x02000000,0x8d03); +reg_write( DDR_REG_BASE + 0x513e8*4+0x02000000,0x16fe); +reg_write( DDR_REG_BASE + 0x513e9*4+0x02000000,0x9082); +reg_write( DDR_REG_BASE + 0x513ea*4+0x02000000,0x8d80); +reg_write( DDR_REG_BASE + 0x513eb*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x513ec*4+0x02000000,0xc141); +reg_write( DDR_REG_BASE + 0x513ed*4+0x02000000,0xd80a); +reg_write( DDR_REG_BASE + 0x513ee*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x513ef*4+0x02000000,0x59); +reg_write( DDR_REG_BASE + 0x513f0*4+0x02000000,0x5); +reg_write( DDR_REG_BASE + 0x513f1*4+0x02000000,0x882); +reg_write( DDR_REG_BASE + 0x513f2*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x513f3*4+0x02000000,0xc440); +reg_write( DDR_REG_BASE + 0x513f4*4+0x02000000,0x706c); +reg_write( DDR_REG_BASE + 0x513f5*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x513f6*4+0x02000000,0xf01f); +reg_write( DDR_REG_BASE + 0x513f7*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x513f8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x513f9*4+0x02000000,0x3000); +reg_write( DDR_REG_BASE + 0x513fa*4+0x02000000,0xf212); +reg_write( DDR_REG_BASE + 0x513fb*4+0x02000000,0x221a); +reg_write( DDR_REG_BASE + 0x513fc*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x513fd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x513fe*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x513ff*4+0x02000000,0x2244); +reg_write( DDR_REG_BASE + 0x51400*4+0x02000000,0x7cc); +reg_write( DDR_REG_BASE + 0x51401*4+0x02000000,0x200f); +reg_write( DDR_REG_BASE + 0x51402*4+0x02000000,0x81); +reg_write( DDR_REG_BASE + 0x51403*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x51404*4+0x02000000,0xec05); +reg_write( DDR_REG_BASE + 0x51405*4+0x02000000,0xbc61); +reg_write( DDR_REG_BASE + 0x51406*4+0x02000000,0xcff); +reg_write( DDR_REG_BASE + 0x51407*4+0x02000000,0x9031); +reg_write( DDR_REG_BASE + 0x51408*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x51409*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x5140a*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x5140b*4+0x02000000,0x7905); +reg_write( DDR_REG_BASE + 0x5140c*4+0x02000000,0x785b); +reg_write( DDR_REG_BASE + 0x5140d*4+0x02000000,0x2056); +reg_write( DDR_REG_BASE + 0x5140e*4+0x02000000,0xd00); +reg_write( DDR_REG_BASE + 0x5140f*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x51410*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x51411*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE + 0x51412*4+0x02000000,0xe000); +reg_write( DDR_REG_BASE + 0x51413*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE + 0x51414*4+0x02000000,0x7144); +reg_write( DDR_REG_BASE + 0x51415*4+0x02000000,0x7354); +reg_write( DDR_REG_BASE + 0x51416*4+0x02000000,0xf7e1); +reg_write( DDR_REG_BASE + 0x51417*4+0x02000000,0xf00b); +reg_write( DDR_REG_BASE + 0x51418*4+0x02000000,0x2056); +reg_write( DDR_REG_BASE + 0x51419*4+0x02000000,0xe00); +reg_write( DDR_REG_BASE + 0x5141a*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x5141b*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x5141c*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE + 0x5141d*4+0x02000000,0xe000); +reg_write( DDR_REG_BASE + 0x5141e*4+0x02000000,0x7164); +reg_write( DDR_REG_BASE + 0x5141f*4+0x02000000,0x1800); +reg_write( DDR_REG_BASE + 0x51420*4+0x02000000,0x3c5); +reg_write( DDR_REG_BASE + 0x51421*4+0x02000000,0xbf1); +reg_write( DDR_REG_BASE + 0x51422*4+0x02000000,0x80b4); +reg_write( DDR_REG_BASE + 0x51423*4+0x02000000,0x787b); +reg_write( DDR_REG_BASE + 0x51424*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x51425*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x51426*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x51427*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE + 0x51428*4+0x02000000,0xe1c4); +reg_write( DDR_REG_BASE + 0x51429*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE + 0x5142a*4+0x02000000,0xf00a); +reg_write( DDR_REG_BASE + 0x5142b*4+0x02000000,0x2156); +reg_write( DDR_REG_BASE + 0x5142c*4+0x02000000,0xe01); +reg_write( DDR_REG_BASE + 0x5142d*4+0x02000000,0x2105); +reg_write( DDR_REG_BASE + 0x5142e*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x5142f*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE + 0x51430*4+0x02000000,0xe000); +reg_write( DDR_REG_BASE + 0x51431*4+0x02000000,0x1900); +reg_write( DDR_REG_BASE + 0x51432*4+0x02000000,0x5); +reg_write( DDR_REG_BASE + 0x51433*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE + 0x51434*4+0x02000000,0x8ef); +reg_write( DDR_REG_BASE + 0x51435*4+0x02000000,0x8234); +reg_write( DDR_REG_BASE + 0x51436*4+0x02000000,0x791b); +reg_write( DDR_REG_BASE + 0x51437*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE + 0x51438*4+0x02000000,0x3cc); +reg_write( DDR_REG_BASE + 0x51439*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x5143a*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x5143b*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE + 0x5143c*4+0x02000000,0xe180); +reg_write( DDR_REG_BASE + 0x5143d*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x5143e*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE + 0x5143f*4+0x02000000,0xe0ee); +reg_write( DDR_REG_BASE + 0x51440*4+0x02000000,0x1800); +reg_write( DDR_REG_BASE + 0x51441*4+0x02000000,0x45); +reg_write( DDR_REG_BASE + 0x51442*4+0x02000000,0xe46); +reg_write( DDR_REG_BASE + 0x51443*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x51444*4+0x02000000,0x18fc); +reg_write( DDR_REG_BASE + 0x51445*4+0x02000000,0x8045); +reg_write( DDR_REG_BASE + 0x51446*4+0x02000000,0xc0a4); +reg_write( DDR_REG_BASE + 0x51447*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x51448*4+0x02000000,0x621a); +reg_write( DDR_REG_BASE + 0x51449*4+0x02000000,0xf004); +reg_write( DDR_REG_BASE + 0x5144a*4+0x02000000,0x1801); +reg_write( DDR_REG_BASE + 0x5144b*4+0x02000000,0x52); +reg_write( DDR_REG_BASE + 0x5144c*4+0x02000000,0x8fd); +reg_write( DDR_REG_BASE + 0x5144d*4+0x02000000,0x8084); +reg_write( DDR_REG_BASE + 0x5144e*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x5144f*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x51450*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x51451*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x51452*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x51453*4+0x02000000,0xc1a7); +reg_write( DDR_REG_BASE + 0x51454*4+0x02000000,0xda07); +reg_write( DDR_REG_BASE + 0x51455*4+0x02000000,0xba8c); +reg_write( DDR_REG_BASE + 0x51456*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x51457*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51458*4+0x02000000,0x9f38); +reg_write( DDR_REG_BASE + 0x51459*4+0x02000000,0x45cb); +reg_write( DDR_REG_BASE + 0x5145a*4+0x02000000,0x9012); +reg_write( DDR_REG_BASE + 0x5145b*4+0x02000000,0x328); +reg_write( DDR_REG_BASE + 0x5145c*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x5145d*4+0x02000000,0x7084); +reg_write( DDR_REG_BASE + 0x5145e*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5145f*4+0x02000000,0x2); +reg_write( DDR_REG_BASE + 0x51460*4+0x02000000,0xb500); +reg_write( DDR_REG_BASE + 0x51461*4+0x02000000,0xd858); +reg_write( DDR_REG_BASE + 0x51462*4+0x02000000,0xb501); +reg_write( DDR_REG_BASE + 0x51463*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x51464*4+0x02000000,0xb7); +reg_write( DDR_REG_BASE + 0x51465*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x51466*4+0x02000000,0xf96); +reg_write( DDR_REG_BASE + 0x51467*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x51468*4+0x02000000,0xd80a); +reg_write( DDR_REG_BASE + 0x51469*4+0x02000000,0xcc1e); +reg_write( DDR_REG_BASE + 0x5146a*4+0x02000000,0x9520); +reg_write( DDR_REG_BASE + 0x5146b*4+0x02000000,0x7030); +reg_write( DDR_REG_BASE + 0x5146c*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x5146d*4+0x02000000,0xf406); +reg_write( DDR_REG_BASE + 0x5146e*4+0x02000000,0xcc1f); +reg_write( DDR_REG_BASE + 0x5146f*4+0x02000000,0x9521); +reg_write( DDR_REG_BASE + 0x51470*4+0x02000000,0x2038); +reg_write( DDR_REG_BASE + 0x51471*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x51472*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x51473*4+0x02000000,0xb9); +reg_write( DDR_REG_BASE + 0x51474*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51475*4+0x02000000,0x806); +reg_write( DDR_REG_BASE + 0x51476*4+0x02000000,0xfecf); +reg_write( DDR_REG_BASE + 0x51477*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x51478*4+0x02000000,0x7003); +reg_write( DDR_REG_BASE + 0x51479*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5147a*4+0x02000000,0x6b4); +reg_write( DDR_REG_BASE + 0x5147b*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x5147c*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x5147d*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5147e*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x5147f*4+0x02000000,0x1a00); +reg_write( DDR_REG_BASE + 0x51480*4+0x02000000,0x3103); +reg_write( DDR_REG_BASE + 0x51481*4+0x02000000,0x216f); +reg_write( DDR_REG_BASE + 0x51482*4+0x02000000,0x243); +reg_write( DDR_REG_BASE + 0x51483*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x51484*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x51485*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x51486*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x51487*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51488*4+0x02000000,0x9126); +reg_write( DDR_REG_BASE + 0x51489*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x5148a*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x5148b*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x5148c*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x5148d*4+0x02000000,0x32); +reg_write( DDR_REG_BASE + 0x5148e*4+0x02000000,0xc140); +reg_write( DDR_REG_BASE + 0x5148f*4+0x02000000,0x9000); +reg_write( DDR_REG_BASE + 0x51490*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE + 0x51491*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x51492*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x51493*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x51494*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x51495*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x51496*4+0x02000000,0x9000); +reg_write( DDR_REG_BASE + 0x51497*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE + 0x51498*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE + 0x51499*4+0x02000000,0xb8e0); +reg_write( DDR_REG_BASE + 0x5149a*4+0x02000000,0x214); +reg_write( DDR_REG_BASE + 0x5149b*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5149c*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x5149d*4+0x02000000,0xc103); +reg_write( DDR_REG_BASE + 0x5149e*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x5149f*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x514a0*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE + 0x514a1*4+0x02000000,0xe032); +reg_write( DDR_REG_BASE + 0x514a2*4+0x02000000,0xb980); +reg_write( DDR_REG_BASE + 0x514a3*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE + 0x514a4*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x514a5*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x514a6*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x514a7*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x514a8*4+0x02000000,0xe090); +reg_write( DDR_REG_BASE + 0x514a9*4+0x02000000,0xc46); +reg_write( DDR_REG_BASE + 0x514aa*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x514ab*4+0x02000000,0x1800); +reg_write( DDR_REG_BASE + 0x514ac*4+0x02000000,0x5); +reg_write( DDR_REG_BASE + 0x514ad*4+0x02000000,0xdb6); +reg_write( DDR_REG_BASE + 0x514ae*4+0x02000000,0xffcf); +reg_write( DDR_REG_BASE + 0x514af*4+0x02000000,0xc92); +reg_write( DDR_REG_BASE + 0x514b0*4+0x02000000,0xff8f); +reg_write( DDR_REG_BASE + 0x514b1*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x514b2*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x514b3*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x514b4*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x514b5*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x514b6*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE + 0x514b7*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x514b8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x514b9*4+0x02000000,0xc046); +reg_write( DDR_REG_BASE + 0x514ba*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x514bb*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x514bc*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x514bd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x514be*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE + 0x514bf*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x514c0*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x514c1*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x514c2*4+0x02000000,0x86); +reg_write( DDR_REG_BASE + 0x514c3*4+0x02000000,0x90a0); +reg_write( DDR_REG_BASE + 0x514c4*4+0x02000000,0x78bd); +reg_write( DDR_REG_BASE + 0x514c5*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x514c6*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x514c7*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x514c8*4+0x02000000,0xb8c2); +reg_write( DDR_REG_BASE + 0x514c9*4+0x02000000,0x827); +reg_write( DDR_REG_BASE + 0x514ca*4+0x02000000,0x90); +reg_write( DDR_REG_BASE + 0x514cb*4+0x02000000,0x835); +reg_write( DDR_REG_BASE + 0x514cc*4+0x02000000,0xf1); +reg_write( DDR_REG_BASE + 0x514cd*4+0x02000000,0x218b); +reg_write( DDR_REG_BASE + 0x514ce*4+0x02000000,0x803e); +reg_write( DDR_REG_BASE + 0x514cf*4+0x02000000,0xce08); +reg_write( DDR_REG_BASE + 0x514d0*4+0x02000000,0x47cb); +reg_write( DDR_REG_BASE + 0x514d1*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x514d2*4+0x02000000,0x41c); +reg_write( DDR_REG_BASE + 0x514d3*4+0x02000000,0x771c); +reg_write( DDR_REG_BASE + 0x514d4*4+0x02000000,0x1a03); +reg_write( DDR_REG_BASE + 0x514d5*4+0x02000000,0x33d8); +reg_write( DDR_REG_BASE + 0x514d6*4+0x02000000,0xce0e); +reg_write( DDR_REG_BASE + 0x514d7*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE + 0x514d8*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x514d9*4+0x02000000,0x434); +reg_write( DDR_REG_BASE + 0x514da*4+0x02000000,0xf017); +reg_write( DDR_REG_BASE + 0x514db*4+0x02000000,0x47cb); +reg_write( DDR_REG_BASE + 0x514dc*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x514dd*4+0x02000000,0x418); +reg_write( DDR_REG_BASE + 0x514de*4+0x02000000,0x1a03); +reg_write( DDR_REG_BASE + 0x514df*4+0x02000000,0x33d8); +reg_write( DDR_REG_BASE + 0x514e0*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE + 0x514e1*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x514e2*4+0x02000000,0x430); +reg_write( DDR_REG_BASE + 0x514e3*4+0x02000000,0xf010); +reg_write( DDR_REG_BASE + 0x514e4*4+0x02000000,0x218b); +reg_write( DDR_REG_BASE + 0x514e5*4+0x02000000,0x803e); +reg_write( DDR_REG_BASE + 0x514e6*4+0x02000000,0xce05); +reg_write( DDR_REG_BASE + 0x514e7*4+0x02000000,0x47cb); +reg_write( DDR_REG_BASE + 0x514e8*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x514e9*4+0x02000000,0x410); +reg_write( DDR_REG_BASE + 0x514ea*4+0x02000000,0x771c); +reg_write( DDR_REG_BASE + 0x514eb*4+0x02000000,0xce0b); +reg_write( DDR_REG_BASE + 0x514ec*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE + 0x514ed*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x514ee*4+0x02000000,0x428); +reg_write( DDR_REG_BASE + 0x514ef*4+0x02000000,0x1a03); +reg_write( DDR_REG_BASE + 0x514f0*4+0x02000000,0x33d8); +reg_write( DDR_REG_BASE + 0x514f1*4+0x02000000,0x761c); +reg_write( DDR_REG_BASE + 0x514f2*4+0x02000000,0x1a09); +reg_write( DDR_REG_BASE + 0x514f3*4+0x02000000,0x3398); +reg_write( DDR_REG_BASE + 0x514f4*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x514f5*4+0x02000000,0x7082); +reg_write( DDR_REG_BASE + 0x514f6*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x514f7*4+0x02000000,0xc); +reg_write( DDR_REG_BASE + 0x514f8*4+0x02000000,0x218b); +reg_write( DDR_REG_BASE + 0x514f9*4+0x02000000,0x803e); +reg_write( DDR_REG_BASE + 0x514fa*4+0x02000000,0x221a); +reg_write( DDR_REG_BASE + 0x514fb*4+0x02000000,0xf9b); +reg_write( DDR_REG_BASE + 0x514fc*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x514fd*4+0x02000000,0x86a0); +reg_write( DDR_REG_BASE + 0x514fe*4+0x02000000,0xf20a); +reg_write( DDR_REG_BASE + 0x514ff*4+0x02000000,0x233c); +reg_write( DDR_REG_BASE + 0x51500*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE + 0x51501*4+0x02000000,0x79); +reg_write( DDR_REG_BASE + 0x51502*4+0x02000000,0xae00); +reg_write( DDR_REG_BASE + 0x51503*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x51504*4+0x02000000,0x142); +reg_write( DDR_REG_BASE + 0x51505*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x51506*4+0x02000000,0xee2); +reg_write( DDR_REG_BASE + 0x51507*4+0x02000000,0xfe8f); +reg_write( DDR_REG_BASE + 0x51508*4+0x02000000,0x222f); +reg_write( DDR_REG_BASE + 0x51509*4+0x02000000,0x6c2); +reg_write( DDR_REG_BASE + 0x5150a*4+0x02000000,0x7a5d); +reg_write( DDR_REG_BASE + 0x5150b*4+0x02000000,0x7a5d); +reg_write( DDR_REG_BASE + 0x5150c*4+0x02000000,0x7a5d); +reg_write( DDR_REG_BASE + 0x5150d*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE + 0x5150e*4+0x02000000,0x7a5d); +reg_write( DDR_REG_BASE + 0x5150f*4+0x02000000,0x7a5d); +reg_write( DDR_REG_BASE + 0x51510*4+0x02000000,0x7a5d); +reg_write( DDR_REG_BASE + 0x51511*4+0x02000000,0xe894); +reg_write( DDR_REG_BASE + 0x51512*4+0x02000000,0x2544); +reg_write( DDR_REG_BASE + 0x51513*4+0x02000000,0x1080); +reg_write( DDR_REG_BASE + 0x51514*4+0x02000000,0x6711); +reg_write( DDR_REG_BASE + 0x51515*4+0x02000000,0x6610); +reg_write( DDR_REG_BASE + 0x51516*4+0x02000000,0x4a10); +reg_write( DDR_REG_BASE + 0x51517*4+0x02000000,0x2048); +reg_write( DDR_REG_BASE + 0x51518*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51519*4+0x02000000,0x2805); +reg_write( DDR_REG_BASE + 0x5151a*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x5151b*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x5151c*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x5151d*4+0x02000000,0xfe80); +reg_write( DDR_REG_BASE + 0x5151e*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x5151f*4+0x02000000,0x2089); +reg_write( DDR_REG_BASE + 0x51520*4+0x02000000,0xfc1); +reg_write( DDR_REG_BASE + 0x51521*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE + 0x51522*4+0x02000000,0x19e0); +reg_write( DDR_REG_BASE + 0x51523*4+0x02000000,0x8004); +reg_write( DDR_REG_BASE + 0x51524*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE + 0x51525*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x51526*4+0x02000000,0xf8d); +reg_write( DDR_REG_BASE + 0x51527*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x51528*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51529*4+0x02000000,0x2b05); +reg_write( DDR_REG_BASE + 0x5152a*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE + 0x5152b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5152c*4+0x02000000,0xfa00); +reg_write( DDR_REG_BASE + 0x5152d*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE + 0x5152e*4+0x02000000,0x81f); +reg_write( DDR_REG_BASE + 0x5152f*4+0x02000000,0x1fe); +reg_write( DDR_REG_BASE + 0x51530*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x51531*4+0x02000000,0x2200); +reg_write( DDR_REG_BASE + 0x51532*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x51533*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE + 0x51534*4+0x02000000,0x793c); +reg_write( DDR_REG_BASE + 0x51535*4+0x02000000,0x208c); +reg_write( DDR_REG_BASE + 0x51536*4+0x02000000,0x8d47); +reg_write( DDR_REG_BASE + 0x51537*4+0x02000000,0x706c); +reg_write( DDR_REG_BASE + 0x51538*4+0x02000000,0xf684); +reg_write( DDR_REG_BASE + 0x51539*4+0x02000000,0x2885); +reg_write( DDR_REG_BASE + 0x5153a*4+0x02000000,0xd07); +reg_write( DDR_REG_BASE + 0x5153b*4+0x02000000,0xf003); +reg_write( DDR_REG_BASE + 0x5153c*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x5153d*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x5153e*4+0x02000000,0x2089); +reg_write( DDR_REG_BASE + 0x5153f*4+0x02000000,0xfc1); +reg_write( DDR_REG_BASE + 0x51540*4+0x02000000,0x205a); +reg_write( DDR_REG_BASE + 0x51541*4+0x02000000,0x200); +reg_write( DDR_REG_BASE + 0x51542*4+0x02000000,0xc105); +reg_write( DDR_REG_BASE + 0x51543*4+0x02000000,0x2105); +reg_write( DDR_REG_BASE + 0x51544*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE + 0x51545*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE + 0x51546*4+0x02000000,0xe164); +reg_write( DDR_REG_BASE + 0x51547*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x51548*4+0x02000000,0xc1); +reg_write( DDR_REG_BASE + 0x51549*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x5154a*4+0x02000000,0x7100); +reg_write( DDR_REG_BASE + 0x5154b*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x5154c*4+0x02000000,0x164); +reg_write( DDR_REG_BASE + 0x5154d*4+0x02000000,0xb8c1); +reg_write( DDR_REG_BASE + 0x5154e*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x5154f*4+0x02000000,0xb200); +reg_write( DDR_REG_BASE + 0x51550*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x51551*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x51552*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x51553*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x51554*4+0x02000000,0x86); +reg_write( DDR_REG_BASE + 0x51555*4+0x02000000,0x88a); +reg_write( DDR_REG_BASE + 0x51556*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x51557*4+0x02000000,0x90c0); +reg_write( DDR_REG_BASE + 0x51558*4+0x02000000,0x81a); +reg_write( DDR_REG_BASE + 0x51559*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x5155a*4+0x02000000,0x40a1); +reg_write( DDR_REG_BASE + 0x5155b*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x5155c*4+0x02000000,0xbe80); +reg_write( DDR_REG_BASE + 0x5155d*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x5155e*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x5155f*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x51560*4+0x02000000,0xfe86); +reg_write( DDR_REG_BASE + 0x51561*4+0x02000000,0xaf6); +reg_write( DDR_REG_BASE + 0x51562*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x51563*4+0x02000000,0xb0c0); +reg_write( DDR_REG_BASE + 0x51564*4+0x02000000,0xd42); +reg_write( DDR_REG_BASE + 0x51565*4+0x02000000,0xff8f); +reg_write( DDR_REG_BASE + 0x51566*4+0x02000000,0xca04); +reg_write( DDR_REG_BASE + 0x51567*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x51568*4+0x02000000,0x708d); +reg_write( DDR_REG_BASE + 0x51569*4+0x02000000,0xf034); +reg_write( DDR_REG_BASE + 0x5156a*4+0x02000000,0x245a); +reg_write( DDR_REG_BASE + 0x5156b*4+0x02000000,0x149e); +reg_write( DDR_REG_BASE + 0x5156c*4+0x02000000,0x2600); +reg_write( DDR_REG_BASE + 0x5156d*4+0x02000000,0x3f83); +reg_write( DDR_REG_BASE + 0x5156e*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5156f*4+0x02000000,0x6b4); +reg_write( DDR_REG_BASE + 0x51570*4+0x02000000,0xb341); +reg_write( DDR_REG_BASE + 0x51571*4+0x02000000,0xf029); +reg_write( DDR_REG_BASE + 0x51572*4+0x02000000,0x241a); +reg_write( DDR_REG_BASE + 0x51573*4+0x02000000,0x1f81); +reg_write( DDR_REG_BASE + 0x51574*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51575*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x51576*4+0x02000000,0x79a5); +reg_write( DDR_REG_BASE + 0x51577*4+0x02000000,0x793b); +reg_write( DDR_REG_BASE + 0x51578*4+0x02000000,0x2105); +reg_write( DDR_REG_BASE + 0x51579*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x5157a*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x5157b*4+0x02000000,0x140); +reg_write( DDR_REG_BASE + 0x5157c*4+0x02000000,0x9120); +reg_write( DDR_REG_BASE + 0x5157d*4+0x02000000,0x7e2f); +reg_write( DDR_REG_BASE + 0x5157e*4+0x02000000,0xd11); +reg_write( DDR_REG_BASE + 0x5157f*4+0x02000000,0x13a1); +reg_write( DDR_REG_BASE + 0x51580*4+0x02000000,0xbec4); +reg_write( DDR_REG_BASE + 0x51581*4+0x02000000,0x8b22); +reg_write( DDR_REG_BASE + 0x51582*4+0x02000000,0x210f); +reg_write( DDR_REG_BASE + 0x51583*4+0x02000000,0x341); +reg_write( DDR_REG_BASE + 0x51584*4+0x02000000,0xab22); +reg_write( DDR_REG_BASE + 0x51585*4+0x02000000,0xf014); +reg_write( DDR_REG_BASE + 0x51586*4+0x02000000,0x8b23); +reg_write( DDR_REG_BASE + 0x51587*4+0x02000000,0x7124); +reg_write( DDR_REG_BASE + 0x51588*4+0x02000000,0xab23); +reg_write( DDR_REG_BASE + 0x51589*4+0x02000000,0x792f); +reg_write( DDR_REG_BASE + 0x5158a*4+0x02000000,0x2614); +reg_write( DDR_REG_BASE + 0x5158b*4+0x02000000,0x3041); +reg_write( DDR_REG_BASE + 0x5158c*4+0x02000000,0x2100); +reg_write( DDR_REG_BASE + 0x5158d*4+0x02000000,0xf8f); +reg_write( DDR_REG_BASE + 0x5158e*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5158f*4+0x02000000,0x6b4); +reg_write( DDR_REG_BASE + 0x51590*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51591*4+0x02000000,0xafa3); +reg_write( DDR_REG_BASE + 0x51592*4+0x02000000,0xee05); +reg_write( DDR_REG_BASE + 0x51593*4+0x02000000,0xbe61); +reg_write( DDR_REG_BASE + 0x51594*4+0x02000000,0xeff); +reg_write( DDR_REG_BASE + 0x51595*4+0x02000000,0x9031); +reg_write( DDR_REG_BASE + 0x51596*4+0x02000000,0x793b); +reg_write( DDR_REG_BASE + 0x51597*4+0x02000000,0xaf22); +reg_write( DDR_REG_BASE + 0x51598*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE + 0x51599*4+0x02000000,0xdb5); +reg_write( DDR_REG_BASE + 0x5159a*4+0x02000000,0x9214); +reg_write( DDR_REG_BASE + 0x5159b*4+0x02000000,0x7185); +reg_write( DDR_REG_BASE + 0x5159c*4+0x02000000,0xc9d); +reg_write( DDR_REG_BASE + 0x5159d*4+0x02000000,0x9024); +reg_write( DDR_REG_BASE + 0x5159e*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x5159f*4+0x02000000,0xda2); +reg_write( DDR_REG_BASE + 0x515a0*4+0x02000000,0xff0f); +reg_write( DDR_REG_BASE + 0x515a1*4+0x02000000,0xa9a); +reg_write( DDR_REG_BASE + 0x515a2*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x515a3*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x515a4*4+0x02000000,0xca04); +reg_write( DDR_REG_BASE + 0x515a5*4+0x02000000,0x264a); +reg_write( DDR_REG_BASE + 0x515a6*4+0x02000000,0x3000); +reg_write( DDR_REG_BASE + 0x515a7*4+0x02000000,0x706c); +reg_write( DDR_REG_BASE + 0x515a8*4+0x02000000,0xf019); +reg_write( DDR_REG_BASE + 0x515a9*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x515aa*4+0x02000000,0xf014); +reg_write( DDR_REG_BASE + 0x515ab*4+0x02000000,0x231a); +reg_write( DDR_REG_BASE + 0x515ac*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x515ad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x515ae*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x515af*4+0x02000000,0x2300); +reg_write( DDR_REG_BASE + 0x515b0*4+0x02000000,0x1f8d); +reg_write( DDR_REG_BASE + 0x515b1*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x515b2*4+0x02000000,0x88c); +reg_write( DDR_REG_BASE + 0x515b3*4+0x02000000,0x7165); +reg_write( DDR_REG_BASE + 0x515b4*4+0x02000000,0x7945); +reg_write( DDR_REG_BASE + 0x515b5*4+0x02000000,0x793b); +reg_write( DDR_REG_BASE + 0x515b6*4+0x02000000,0x2105); +reg_write( DDR_REG_BASE + 0x515b7*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x515b8*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x515b9*4+0x02000000,0x140); +reg_write( DDR_REG_BASE + 0x515ba*4+0x02000000,0x9180); +reg_write( DDR_REG_BASE + 0x515bb*4+0x02000000,0xad80); +reg_write( DDR_REG_BASE + 0x515bc*4+0x02000000,0xb140); +reg_write( DDR_REG_BASE + 0x515bd*4+0x02000000,0x7144); +reg_write( DDR_REG_BASE + 0x515be*4+0x02000000,0xadb); +reg_write( DDR_REG_BASE + 0x515bf*4+0x02000000,0x8214); +reg_write( DDR_REG_BASE + 0x515c0*4+0x02000000,0x7164); +reg_write( DDR_REG_BASE + 0x515c1*4+0x02000000,0xbd3); +reg_write( DDR_REG_BASE + 0x515c2*4+0x02000000,0x8024); +reg_write( DDR_REG_BASE + 0x515c3*4+0x02000000,0x2616); +reg_write( DDR_REG_BASE + 0x515c4*4+0x02000000,0x30cb); +reg_write( DDR_REG_BASE + 0x515c5*4+0x02000000,0x88e); +reg_write( DDR_REG_BASE + 0x515c6*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x515c7*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x515c8*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE + 0x515c9*4+0x02000000,0x813); +reg_write( DDR_REG_BASE + 0x515ca*4+0x02000000,0xbe); +reg_write( DDR_REG_BASE + 0x515cb*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x515cc*4+0x02000000,0x9e6); +reg_write( DDR_REG_BASE + 0x515cd*4+0x02000000,0xc0); +reg_write( DDR_REG_BASE + 0x515ce*4+0x02000000,0xa3e); +reg_write( DDR_REG_BASE + 0x515cf*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x515d0*4+0x02000000,0x720c); +reg_write( DDR_REG_BASE + 0x515d1*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE + 0x515d2*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE + 0x515d3*4+0x02000000,0x808e); +reg_write( DDR_REG_BASE + 0x515d4*4+0x02000000,0xf207); +reg_write( DDR_REG_BASE + 0x515d5*4+0x02000000,0x9d6); +reg_write( DDR_REG_BASE + 0x515d6*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x515d7*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x515d8*4+0x02000000,0xa2a); +reg_write( DDR_REG_BASE + 0x515d9*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x515da*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x515db*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x515dc*4+0x02000000,0x7045); +reg_write( DDR_REG_BASE + 0x515dd*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE + 0x515de*4+0x02000000,0xe044); +reg_write( DDR_REG_BASE + 0x515df*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE + 0x515e0*4+0x02000000,0x81b); +reg_write( DDR_REG_BASE + 0x515e1*4+0x02000000,0x21e); +reg_write( DDR_REG_BASE + 0x515e2*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x515e3*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x515e4*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x515e5*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x515e6*4+0x02000000,0xe887); +reg_write( DDR_REG_BASE + 0x515e7*4+0x02000000,0x9b2); +reg_write( DDR_REG_BASE + 0x515e8*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x515e9*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE + 0x515ea*4+0x02000000,0xa06); +reg_write( DDR_REG_BASE + 0x515eb*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x515ec*4+0x02000000,0xd80a); +reg_write( DDR_REG_BASE + 0x515ed*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE + 0x515ee*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE + 0x515ef*4+0x02000000,0x820d); +reg_write( DDR_REG_BASE + 0x515f0*4+0x02000000,0xf207); +reg_write( DDR_REG_BASE + 0x515f1*4+0x02000000,0x99e); +reg_write( DDR_REG_BASE + 0x515f2*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x515f3*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x515f4*4+0x02000000,0x9f2); +reg_write( DDR_REG_BASE + 0x515f5*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x515f6*4+0x02000000,0xd8fd); +reg_write( DDR_REG_BASE + 0x515f7*4+0x02000000,0xee08); +reg_write( DDR_REG_BASE + 0x515f8*4+0x02000000,0x98e); +reg_write( DDR_REG_BASE + 0x515f9*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x515fa*4+0x02000000,0x720c); +reg_write( DDR_REG_BASE + 0x515fb*4+0x02000000,0x9e6); +reg_write( DDR_REG_BASE + 0x515fc*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x515fd*4+0x02000000,0xd8fe); +reg_write( DDR_REG_BASE + 0x515fe*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE + 0x515ff*4+0x02000000,0x813); +reg_write( DDR_REG_BASE + 0x51600*4+0x02000000,0x13e); +reg_write( DDR_REG_BASE + 0x51601*4+0x02000000,0x760c); +reg_write( DDR_REG_BASE + 0x51602*4+0x02000000,0x97a); +reg_write( DDR_REG_BASE + 0x51603*4+0x02000000,0xc0); +reg_write( DDR_REG_BASE + 0x51604*4+0x02000000,0x9d2); +reg_write( DDR_REG_BASE + 0x51605*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x51606*4+0x02000000,0x740c); +reg_write( DDR_REG_BASE + 0x51607*4+0x02000000,0xed08); +reg_write( DDR_REG_BASE + 0x51608*4+0x02000000,0x96e); +reg_write( DDR_REG_BASE + 0x51609*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x5160a*4+0x02000000,0x740c); +reg_write( DDR_REG_BASE + 0x5160b*4+0x02000000,0x9c6); +reg_write( DDR_REG_BASE + 0x5160c*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x5160d*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE + 0x5160e*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE + 0x5160f*4+0x02000000,0x827); +reg_write( DDR_REG_BASE + 0x51610*4+0x02000000,0x27f); +reg_write( DDR_REG_BASE + 0x51611*4+0x02000000,0x71ad); +reg_write( DDR_REG_BASE + 0x51612*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51613*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x51614*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51615*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x51616*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x51617*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x51618*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x51619*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5161a*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x5161b*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x5161c*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x5161d*4+0x02000000,0xe040); +reg_write( DDR_REG_BASE + 0x5161e*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x5161f*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE + 0x51620*4+0x02000000,0xf03c); +reg_write( DDR_REG_BASE + 0x51621*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51622*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x51623*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51624*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x51625*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE + 0x51626*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51627*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE + 0x51628*4+0x02000000,0xb8e2); +reg_write( DDR_REG_BASE + 0x51629*4+0x02000000,0x25ca); +reg_write( DDR_REG_BASE + 0x5162a*4+0x02000000,0x13e1); +reg_write( DDR_REG_BASE + 0x5162b*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x5162c*4+0x02000000,0xae00); +reg_write( DDR_REG_BASE + 0x5162d*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x5162e*4+0x02000000,0x847); +reg_write( DDR_REG_BASE + 0x5162f*4+0x02000000,0x95); +reg_write( DDR_REG_BASE + 0x51630*4+0x02000000,0xe819); +reg_write( DDR_REG_BASE + 0x51631*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51632*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x51633*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51634*4+0x02000000,0x49); +reg_write( DDR_REG_BASE + 0x51635*4+0x02000000,0x7014); +reg_write( DDR_REG_BASE + 0x51636*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x51637*4+0x02000000,0xf211); +reg_write( DDR_REG_BASE + 0x51638*4+0x02000000,0xbbe); +reg_write( DDR_REG_BASE + 0x51639*4+0x02000000,0xff0f); +reg_write( DDR_REG_BASE + 0x5163a*4+0x02000000,0x8e00); +reg_write( DDR_REG_BASE + 0x5163b*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE + 0x5163c*4+0x02000000,0xfa2); +reg_write( DDR_REG_BASE + 0x5163d*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x5163e*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x5163f*4+0x02000000,0xb02); +reg_write( DDR_REG_BASE + 0x51640*4+0x02000000,0xff0f); +reg_write( DDR_REG_BASE + 0x51641*4+0x02000000,0x40a1); +reg_write( DDR_REG_BASE + 0x51642*4+0x02000000,0xaf6); +reg_write( DDR_REG_BASE + 0x51643*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x51644*4+0x02000000,0x1e01); +reg_write( DDR_REG_BASE + 0x51645*4+0x02000000,0x1003); +reg_write( DDR_REG_BASE + 0x51646*4+0x02000000,0x8e00); +reg_write( DDR_REG_BASE + 0x51647*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE + 0x51648*4+0x02000000,0xf1e4); +reg_write( DDR_REG_BASE + 0x51649*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x5164a*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x5164b*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5164c*4+0x02000000,0x23); +reg_write( DDR_REG_BASE + 0x5164d*4+0x02000000,0x7014); +reg_write( DDR_REG_BASE + 0x5164e*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x5164f*4+0x02000000,0xf5ea); +reg_write( DDR_REG_BASE + 0x51650*4+0x02000000,0xf1f7); +reg_write( DDR_REG_BASE + 0x51651*4+0x02000000,0xf7a); +reg_write( DDR_REG_BASE + 0x51652*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x51653*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE + 0x51654*4+0x02000000,0xca09); +reg_write( DDR_REG_BASE + 0x51655*4+0x02000000,0xe885); +reg_write( DDR_REG_BASE + 0x51656*4+0x02000000,0xe02); +reg_write( DDR_REG_BASE + 0x51657*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x51658*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE + 0x51659*4+0x02000000,0x92a); +reg_write( DDR_REG_BASE + 0x5165a*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x5165b*4+0x02000000,0xd809); +reg_write( DDR_REG_BASE + 0x5165c*4+0x02000000,0xca09); +reg_write( DDR_REG_BASE + 0x5165d*4+0x02000000,0xe837); +reg_write( DDR_REG_BASE + 0x5165e*4+0x02000000,0xd923); +reg_write( DDR_REG_BASE + 0x5165f*4+0x02000000,0xb99f); +reg_write( DDR_REG_BASE + 0x51660*4+0x02000000,0x8900); +reg_write( DDR_REG_BASE + 0x51661*4+0x02000000,0x1126); +reg_write( DDR_REG_BASE + 0x51662*4+0x02000000,0x8f); +reg_write( DDR_REG_BASE + 0x51663*4+0x02000000,0x70cd); +reg_write( DDR_REG_BASE + 0x51664*4+0x02000000,0x7f05); +reg_write( DDR_REG_BASE + 0x51665*4+0x02000000,0xf022); +reg_write( DDR_REG_BASE + 0x51666*4+0x02000000,0x2644); +reg_write( DDR_REG_BASE + 0x51667*4+0x02000000,0x17c1); +reg_write( DDR_REG_BASE + 0x51668*4+0x02000000,0xe905); +reg_write( DDR_REG_BASE + 0x51669*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE + 0x5166a*4+0x02000000,0x9ff); +reg_write( DDR_REG_BASE + 0x5166b*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE + 0x5166c*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x5166d*4+0x02000000,0x78eb); +reg_write( DDR_REG_BASE + 0x5166e*4+0x02000000,0xf217); +reg_write( DDR_REG_BASE + 0x5166f*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE + 0x51670*4+0x02000000,0xb2a); +reg_write( DDR_REG_BASE + 0x51671*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x51672*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51673*4+0x02000000,0xc102); +reg_write( DDR_REG_BASE + 0x51674*4+0x02000000,0x4508); +reg_write( DDR_REG_BASE + 0x51675*4+0x02000000,0x7bcf); +reg_write( DDR_REG_BASE + 0x51676*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x51677*4+0x02000000,0x42a1); +reg_write( DDR_REG_BASE + 0x51678*4+0x02000000,0xdfe); +reg_write( DDR_REG_BASE + 0x51679*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x5167a*4+0x02000000,0x4378); +reg_write( DDR_REG_BASE + 0x5167b*4+0x02000000,0xc102); +reg_write( DDR_REG_BASE + 0x5167c*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x5167d*4+0x02000000,0x42a1); +reg_write( DDR_REG_BASE + 0x5167e*4+0x02000000,0xdf2); +reg_write( DDR_REG_BASE + 0x5167f*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x51680*4+0x02000000,0x4363); +reg_write( DDR_REG_BASE + 0x51681*4+0x02000000,0x4163); +reg_write( DDR_REG_BASE + 0x51682*4+0x02000000,0xe9e); +reg_write( DDR_REG_BASE + 0x51683*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x51684*4+0x02000000,0x40a1); +reg_write( DDR_REG_BASE + 0x51685*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE + 0x51686*4+0x02000000,0xec1); +reg_write( DDR_REG_BASE + 0x51687*4+0x02000000,0x90b4); +reg_write( DDR_REG_BASE + 0x51688*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x51689*4+0x02000000,0xd9e); +reg_write( DDR_REG_BASE + 0x5168a*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x5168b*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE + 0x5168c*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x5168d*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x5168e*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5168f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51690*4+0x02000000,0xb8e5); +reg_write( DDR_REG_BASE + 0x51691*4+0x02000000,0xebc); +reg_write( DDR_REG_BASE + 0x51692*4+0x02000000,0xff02); +reg_write( DDR_REG_BASE + 0x51693*4+0x02000000,0xd22); +reg_write( DDR_REG_BASE + 0x51694*4+0x02000000,0xff8f); +reg_write( DDR_REG_BASE + 0x51695*4+0x02000000,0x706f); +reg_write( DDR_REG_BASE + 0x51696*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x51697*4+0x02000000,0x76c4); +reg_write( DDR_REG_BASE + 0x51698*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE + 0x51699*4+0x02000000,0xe044); +reg_write( DDR_REG_BASE + 0x5169a*4+0x02000000,0xca04); +reg_write( DDR_REG_BASE + 0x5169b*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x5169c*4+0x02000000,0xf017); +reg_write( DDR_REG_BASE + 0x5169d*4+0x02000000,0x706c); +reg_write( DDR_REG_BASE + 0x5169e*4+0x02000000,0xf012); +reg_write( DDR_REG_BASE + 0x5169f*4+0x02000000,0x221a); +reg_write( DDR_REG_BASE + 0x516a0*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x516a1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x516a2*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x516a3*4+0x02000000,0x7965); +reg_write( DDR_REG_BASE + 0x516a4*4+0x02000000,0x793b); +reg_write( DDR_REG_BASE + 0x516a5*4+0x02000000,0x2105); +reg_write( DDR_REG_BASE + 0x516a6*4+0x02000000,0xf8c); +reg_write( DDR_REG_BASE + 0x516a7*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x516a8*4+0x02000000,0x140); +reg_write( DDR_REG_BASE + 0x516a9*4+0x02000000,0x2332); +reg_write( DDR_REG_BASE + 0x516aa*4+0x02000000,0x1f81); +reg_write( DDR_REG_BASE + 0x516ab*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x516ac*4+0x02000000,0x88c); +reg_write( DDR_REG_BASE + 0x516ad*4+0x02000000,0x7164); +reg_write( DDR_REG_BASE + 0x516ae*4+0x02000000,0x7165); +reg_write( DDR_REG_BASE + 0x516af*4+0x02000000,0xb420); +reg_write( DDR_REG_BASE + 0x516b0*4+0x02000000,0xbdf); +reg_write( DDR_REG_BASE + 0x516b1*4+0x02000000,0x8214); +reg_write( DDR_REG_BASE + 0x516b2*4+0x02000000,0x7144); +reg_write( DDR_REG_BASE + 0x516b3*4+0x02000000,0xad7); +reg_write( DDR_REG_BASE + 0x516b4*4+0x02000000,0x8024); +reg_write( DDR_REG_BASE + 0x516b5*4+0x02000000,0x2316); +reg_write( DDR_REG_BASE + 0x516b6*4+0x02000000,0x308b); +reg_write( DDR_REG_BASE + 0x516b7*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x516b8*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x516b9*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x516ba*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE + 0x516bb*4+0x02000000,0xe032); +reg_write( DDR_REG_BASE + 0x516bc*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE + 0x516bd*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE + 0x516be*4+0x02000000,0xe9a); +reg_write( DDR_REG_BASE + 0x516bf*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x516c0*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x516c1*4+0x02000000,0xcde); +reg_write( DDR_REG_BASE + 0x516c2*4+0x02000000,0x80); +reg_write( DDR_REG_BASE + 0x516c3*4+0x02000000,0xcfe); +reg_write( DDR_REG_BASE + 0x516c4*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x516c5*4+0x02000000,0xd807); +reg_write( DDR_REG_BASE + 0x516c6*4+0x02000000,0x23ab); +reg_write( DDR_REG_BASE + 0x516c7*4+0x02000000,0x30c4); +reg_write( DDR_REG_BASE + 0x516c8*4+0x02000000,0x7fff); +reg_write( DDR_REG_BASE + 0x516c9*4+0x02000000,0xf000); +reg_write( DDR_REG_BASE + 0x516ca*4+0x02000000,0xc2e2); +reg_write( DDR_REG_BASE + 0x516cb*4+0x02000000,0x45cb); +reg_write( DDR_REG_BASE + 0x516cc*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x516cd*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x516ce*4+0x02000000,0x9500); +reg_write( DDR_REG_BASE + 0x516cf*4+0x02000000,0xb8a1); +reg_write( DDR_REG_BASE + 0x516d0*4+0x02000000,0xb500); +reg_write( DDR_REG_BASE + 0x516d1*4+0x02000000,0x8c2); +reg_write( DDR_REG_BASE + 0x516d2*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x516d3*4+0x02000000,0x740c); +reg_write( DDR_REG_BASE + 0x516d4*4+0x02000000,0xd81f); +reg_write( DDR_REG_BASE + 0x516d5*4+0x02000000,0x8ba); +reg_write( DDR_REG_BASE + 0x516d6*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x516d7*4+0x02000000,0x1df6); +reg_write( DDR_REG_BASE + 0x516d8*4+0x02000000,0x105d); +reg_write( DDR_REG_BASE + 0x516d9*4+0x02000000,0xc6c2); +reg_write( DDR_REG_BASE + 0x516da*4+0x02000000,0xc2e2); +reg_write( DDR_REG_BASE + 0x516db*4+0x02000000,0x8ae); +reg_write( DDR_REG_BASE + 0x516dc*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x516dd*4+0x02000000,0xd81f); +reg_write( DDR_REG_BASE + 0x516de*4+0x02000000,0x45cb); +reg_write( DDR_REG_BASE + 0x516df*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x516e0*4+0x02000000,0x1f0); +reg_write( DDR_REG_BASE + 0x516e1*4+0x02000000,0x740c); +reg_write( DDR_REG_BASE + 0x516e2*4+0x02000000,0x89e); +reg_write( DDR_REG_BASE + 0x516e3*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x516e4*4+0x02000000,0x1d00); +reg_write( DDR_REG_BASE + 0x516e5*4+0x02000000,0x1005); +reg_write( DDR_REG_BASE + 0x516e6*4+0x02000000,0x150a); +reg_write( DDR_REG_BASE + 0x516e7*4+0x02000000,0x9700); +reg_write( DDR_REG_BASE + 0x516e8*4+0x02000000,0xb881); +reg_write( DDR_REG_BASE + 0x516e9*4+0x02000000,0x1d0a); +reg_write( DDR_REG_BASE + 0x516ea*4+0x02000000,0x901c); +reg_write( DDR_REG_BASE + 0x516eb*4+0x02000000,0xc6c2); +reg_write( DDR_REG_BASE + 0x516ec*4+0x02000000,0xc0f1); +reg_write( DDR_REG_BASE + 0x516ed*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x516ee*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE + 0x516ef*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x516f0*4+0x02000000,0x12); +reg_write( DDR_REG_BASE + 0x516f1*4+0x02000000,0x218c); +reg_write( DDR_REG_BASE + 0x516f2*4+0x02000000,0x8203); +reg_write( DDR_REG_BASE + 0x516f3*4+0x02000000,0xc9c); +reg_write( DDR_REG_BASE + 0x516f4*4+0x02000000,0xce); +reg_write( DDR_REG_BASE + 0x516f5*4+0x02000000,0x80e); +reg_write( DDR_REG_BASE + 0x516f6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x516f7*4+0x02000000,0xc0d1); +reg_write( DDR_REG_BASE + 0x516f8*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x516f9*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x516fa*4+0x02000000,0xc2e2); +reg_write( DDR_REG_BASE + 0x516fb*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x516fc*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x516fd*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x516fe*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x516ff*4+0x02000000,0x81b); +reg_write( DDR_REG_BASE + 0x51700*4+0x02000000,0x3e); +reg_write( DDR_REG_BASE + 0x51701*4+0x02000000,0xd80a); +reg_write( DDR_REG_BASE + 0x51702*4+0x02000000,0x45cb); +reg_write( DDR_REG_BASE + 0x51703*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE + 0x51704*4+0x02000000,0xe036); +reg_write( DDR_REG_BASE + 0x51705*4+0x02000000,0x85a); +reg_write( DDR_REG_BASE + 0x51706*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x51707*4+0x02000000,0x1d00); +reg_write( DDR_REG_BASE + 0x51708*4+0x02000000,0x1045); +reg_write( DDR_REG_BASE + 0x51709*4+0x02000000,0x1d00); +reg_write( DDR_REG_BASE + 0x5170a*4+0x02000000,0x1005); +reg_write( DDR_REG_BASE + 0x5170b*4+0x02000000,0xc6c2); +reg_write( DDR_REG_BASE + 0x5170c*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x5170d*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x5170e*4+0x02000000,0xf2); +reg_write( DDR_REG_BASE + 0x5170f*4+0x02000000,0x1800); +reg_write( DDR_REG_BASE + 0x51710*4+0x02000000,0x45); +reg_write( DDR_REG_BASE + 0x51711*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x51712*4+0x02000000,0x1800); +reg_write( DDR_REG_BASE + 0x51713*4+0x02000000,0x5); +reg_write( DDR_REG_BASE + 0x51714*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x51715*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x51716*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x51717*4+0x02000000,0xc1bd); +reg_write( DDR_REG_BASE + 0x51718*4+0x02000000,0xc350); +reg_write( DDR_REG_BASE + 0x51719*4+0x02000000,0x4648); +reg_write( DDR_REG_BASE + 0x5171a*4+0x02000000,0x4728); +reg_write( DDR_REG_BASE + 0x5171b*4+0x02000000,0x84e); +reg_write( DDR_REG_BASE + 0x5171c*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE + 0x5171d*4+0x02000000,0x4508); +reg_write( DDR_REG_BASE + 0x5171e*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x5171f*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x51720*4+0x02000000,0xe0c4); +reg_write( DDR_REG_BASE + 0x51721*4+0x02000000,0x1800); +reg_write( DDR_REG_BASE + 0x51722*4+0x02000000,0x3c5); +reg_write( DDR_REG_BASE + 0x51723*4+0x02000000,0xb88b); +reg_write( DDR_REG_BASE + 0x51724*4+0x02000000,0xd9f0); +reg_write( DDR_REG_BASE + 0x51725*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE + 0x51726*4+0x02000000,0xc093); +reg_write( DDR_REG_BASE + 0x51727*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x51728*4+0x02000000,0xda28); +reg_write( DDR_REG_BASE + 0x51729*4+0x02000000,0xa42); +reg_write( DDR_REG_BASE + 0x5172a*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x5172b*4+0x02000000,0xc393); +reg_write( DDR_REG_BASE + 0x5172c*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x5172d*4+0x02000000,0xc04c); +reg_write( DDR_REG_BASE + 0x5172e*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x5172f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51730*4+0x02000000,0xf00); +reg_write( DDR_REG_BASE + 0x51731*4+0x02000000,0xc04b); +reg_write( DDR_REG_BASE + 0x51732*4+0x02000000,0xd820); +reg_write( DDR_REG_BASE + 0x51733*4+0x02000000,0xc04a); +reg_write( DDR_REG_BASE + 0x51734*4+0x02000000,0x1490); +reg_write( DDR_REG_BASE + 0x51735*4+0x02000000,0x3000); +reg_write( DDR_REG_BASE + 0x51736*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x51737*4+0x02000000,0xbdc4); +reg_write( DDR_REG_BASE + 0x51738*4+0x02000000,0xc04e); +reg_write( DDR_REG_BASE + 0x51739*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE + 0x5173a*4+0x02000000,0x148c); +reg_write( DDR_REG_BASE + 0x5173b*4+0x02000000,0x3000); +reg_write( DDR_REG_BASE + 0x5173c*4+0x02000000,0x41c1); +reg_write( DDR_REG_BASE + 0x5173d*4+0x02000000,0x1c24); +reg_write( DDR_REG_BASE + 0x5173e*4+0x02000000,0x3003); +reg_write( DDR_REG_BASE + 0x5173f*4+0x02000000,0xc04f); +reg_write( DDR_REG_BASE + 0x51740*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE + 0x51741*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x51742*4+0x02000000,0xed05); +reg_write( DDR_REG_BASE + 0x51743*4+0x02000000,0xbd61); +reg_write( DDR_REG_BASE + 0x51744*4+0x02000000,0xdff); +reg_write( DDR_REG_BASE + 0x51745*4+0x02000000,0x9031); +reg_write( DDR_REG_BASE + 0x51746*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x51747*4+0x02000000,0xc748); +reg_write( DDR_REG_BASE + 0x51748*4+0x02000000,0x7d0f); +reg_write( DDR_REG_BASE + 0x51749*4+0x02000000,0x40a1); +reg_write( DDR_REG_BASE + 0x5174a*4+0x02000000,0x1c1c); +reg_write( DDR_REG_BASE + 0x5174b*4+0x02000000,0x3103); +reg_write( DDR_REG_BASE + 0x5174c*4+0x02000000,0xc346); +reg_write( DDR_REG_BASE + 0x5174d*4+0x02000000,0x1c25); +reg_write( DDR_REG_BASE + 0x5174e*4+0x02000000,0x3382); +reg_write( DDR_REG_BASE + 0x5174f*4+0x02000000,0x1c34); +reg_write( DDR_REG_BASE + 0x51750*4+0x02000000,0x3043); +reg_write( DDR_REG_BASE + 0x51751*4+0x02000000,0x942); +reg_write( DDR_REG_BASE + 0x51752*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x51753*4+0x02000000,0x43b9); +reg_write( DDR_REG_BASE + 0x51754*4+0x02000000,0xd5e); +reg_write( DDR_REG_BASE + 0x51755*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x51756*4+0x02000000,0xc083); +reg_write( DDR_REG_BASE + 0x51757*4+0x02000000,0x47cb); +reg_write( DDR_REG_BASE + 0x51758*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51759*4+0x02000000,0x7b2); +reg_write( DDR_REG_BASE + 0x5175a*4+0x02000000,0x8f21); +reg_write( DDR_REG_BASE + 0x5175b*4+0x02000000,0x8f40); +reg_write( DDR_REG_BASE + 0x5175c*4+0x02000000,0x1488); +reg_write( DDR_REG_BASE + 0x5175d*4+0x02000000,0x3000); +reg_write( DDR_REG_BASE + 0x5175e*4+0x02000000,0xc051); +reg_write( DDR_REG_BASE + 0x5175f*4+0x02000000,0xf00f); +reg_write( DDR_REG_BASE + 0x51760*4+0x02000000,0xc30f); +reg_write( DDR_REG_BASE + 0x51761*4+0x02000000,0x7b54); +reg_write( DDR_REG_BASE + 0x51762*4+0x02000000,0x9300); +reg_write( DDR_REG_BASE + 0x51763*4+0x02000000,0xe88a); +reg_write( DDR_REG_BASE + 0x51764*4+0x02000000,0xc093); +reg_write( DDR_REG_BASE + 0x51765*4+0x02000000,0x20f5); +reg_write( DDR_REG_BASE + 0x51766*4+0x02000000,0x80); +reg_write( DDR_REG_BASE + 0x51767*4+0x02000000,0x80d); +reg_write( DDR_REG_BASE + 0x51768*4+0x02000000,0x833); +reg_write( DDR_REG_BASE + 0x51769*4+0x02000000,0x2042); +reg_write( DDR_REG_BASE + 0x5176a*4+0x02000000,0x800); +reg_write( DDR_REG_BASE + 0x5176b*4+0x02000000,0xb300); +reg_write( DDR_REG_BASE + 0x5176c*4+0x02000000,0x7144); +reg_write( DDR_REG_BASE + 0x5176d*4+0x02000000,0x9e9); +reg_write( DDR_REG_BASE + 0x5176e*4+0x02000000,0x80a5); +reg_write( DDR_REG_BASE + 0x5176f*4+0x02000000,0x6e09); +reg_write( DDR_REG_BASE + 0x51770*4+0x02000000,0x835); +reg_write( DDR_REG_BASE + 0x51771*4+0x02000000,0xb5); +reg_write( DDR_REG_BASE + 0x51772*4+0x02000000,0x72d5); +reg_write( DDR_REG_BASE + 0x51773*4+0x02000000,0x45cb); +reg_write( DDR_REG_BASE + 0x51774*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51775*4+0x02000000,0xf0f0); +reg_write( DDR_REG_BASE + 0x51776*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE + 0x51777*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51778*4+0x02000000,0xff00); +reg_write( DDR_REG_BASE + 0x51779*4+0x02000000,0x23ca); +reg_write( DDR_REG_BASE + 0x5177a*4+0x02000000,0x341); +reg_write( DDR_REG_BASE + 0x5177b*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x5177c*4+0x02000000,0x41a1); +reg_write( DDR_REG_BASE + 0x5177d*4+0x02000000,0x42a1); +reg_write( DDR_REG_BASE + 0x5177e*4+0x02000000,0xc46); +reg_write( DDR_REG_BASE + 0x5177f*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x51780*4+0x02000000,0xc340); +reg_write( DDR_REG_BASE + 0x51781*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE + 0x51782*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51783*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE + 0x51784*4+0x02000000,0xd808); +reg_write( DDR_REG_BASE + 0x51785*4+0x02000000,0x41a1); +reg_write( DDR_REG_BASE + 0x51786*4+0x02000000,0x42a1); +reg_write( DDR_REG_BASE + 0x51787*4+0x02000000,0xc36); +reg_write( DDR_REG_BASE + 0x51788*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x51789*4+0x02000000,0xc340); +reg_write( DDR_REG_BASE + 0x5178a*4+0x02000000,0xc083); +reg_write( DDR_REG_BASE + 0x5178b*4+0x02000000,0xf0e); +reg_write( DDR_REG_BASE + 0x5178c*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x5178d*4+0x02000000,0x6eab); +reg_write( DDR_REG_BASE + 0x5178e*4+0x02000000,0x8f41); +reg_write( DDR_REG_BASE + 0x5178f*4+0x02000000,0x8f20); +reg_write( DDR_REG_BASE + 0x51790*4+0x02000000,0xf00e); +reg_write( DDR_REG_BASE + 0x51791*4+0x02000000,0xc30e); +reg_write( DDR_REG_BASE + 0x51792*4+0x02000000,0x7b34); +reg_write( DDR_REG_BASE + 0x51793*4+0x02000000,0x9300); +reg_write( DDR_REG_BASE + 0x51794*4+0x02000000,0x813); +reg_write( DDR_REG_BASE + 0x51795*4+0x02000000,0x7f1); +reg_write( DDR_REG_BASE + 0x51796*4+0x02000000,0xc093); +reg_write( DDR_REG_BASE + 0x51797*4+0x02000000,0x20f5); +reg_write( DDR_REG_BASE + 0x51798*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x51799*4+0x02000000,0x80b); +reg_write( DDR_REG_BASE + 0x5179a*4+0x02000000,0x833); +reg_write( DDR_REG_BASE + 0x5179b*4+0x02000000,0xe020); +reg_write( DDR_REG_BASE + 0x5179c*4+0x02000000,0xb300); +reg_write( DDR_REG_BASE + 0x5179d*4+0x02000000,0x7124); +reg_write( DDR_REG_BASE + 0x5179e*4+0x02000000,0xae7); +reg_write( DDR_REG_BASE + 0x5179f*4+0x02000000,0x8065); +reg_write( DDR_REG_BASE + 0x517a0*4+0x02000000,0x73b5); +reg_write( DDR_REG_BASE + 0x517a1*4+0x02000000,0xe88); +reg_write( DDR_REG_BASE + 0x517a2*4+0x02000000,0xffad); +reg_write( DDR_REG_BASE + 0x517a3*4+0x02000000,0x4063); +reg_write( DDR_REG_BASE + 0x517a4*4+0x02000000,0xc010); +reg_write( DDR_REG_BASE + 0x517a5*4+0x02000000,0xe808); +reg_write( DDR_REG_BASE + 0x517a6*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x517a7*4+0x02000000,0x36); +reg_write( DDR_REG_BASE + 0x517a8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x517a9*4+0x02000000,0x912); +reg_write( DDR_REG_BASE + 0x517aa*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x517ab*4+0x02000000,0x740c); +reg_write( DDR_REG_BASE + 0x517ac*4+0x02000000,0x8fc0); +reg_write( DDR_REG_BASE + 0x517ad*4+0x02000000,0xf036); +reg_write( DDR_REG_BASE + 0x517ae*4+0x02000000,0xc00f); +reg_write( DDR_REG_BASE + 0x517af*4+0x02000000,0x7ddd); +reg_write( DDR_REG_BASE + 0x517b0*4+0x02000000,0x20f5); +reg_write( DDR_REG_BASE + 0x517b1*4+0x02000000,0x382); +reg_write( DDR_REG_BASE + 0x517b2*4+0x02000000,0xc00e); +reg_write( DDR_REG_BASE + 0x517b3*4+0x02000000,0x20f5); +reg_write( DDR_REG_BASE + 0x517b4*4+0x02000000,0x383); +reg_write( DDR_REG_BASE + 0x517b5*4+0x02000000,0x6358); +reg_write( DDR_REG_BASE + 0x517b6*4+0x02000000,0x781c); +reg_write( DDR_REG_BASE + 0x517b7*4+0x02000000,0x2048); +reg_write( DDR_REG_BASE + 0x517b8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x517b9*4+0x02000000,0x2049); +reg_write( DDR_REG_BASE + 0x517ba*4+0x02000000,0x7c1); +reg_write( DDR_REG_BASE + 0x517bb*4+0x02000000,0xc011); +reg_write( DDR_REG_BASE + 0x517bc*4+0x02000000,0x78d4); +reg_write( DDR_REG_BASE + 0x517bd*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE + 0x517be*4+0x02000000,0x4b50); +reg_write( DDR_REG_BASE + 0x517bf*4+0x02000000,0x2048); +reg_write( DDR_REG_BASE + 0x517c0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x517c1*4+0x02000000,0xc052); +reg_write( DDR_REG_BASE + 0x517c2*4+0x02000000,0xc010); +reg_write( DDR_REG_BASE + 0x517c3*4+0x02000000,0xe813); +reg_write( DDR_REG_BASE + 0x517c4*4+0x02000000,0xc00f); +reg_write( DDR_REG_BASE + 0x517c5*4+0x02000000,0x4363); +reg_write( DDR_REG_BASE + 0x517c6*4+0x02000000,0x20f5); +reg_write( DDR_REG_BASE + 0x517c7*4+0x02000000,0x382); +reg_write( DDR_REG_BASE + 0x517c8*4+0x02000000,0xc00e); +reg_write( DDR_REG_BASE + 0x517c9*4+0x02000000,0x20f5); +reg_write( DDR_REG_BASE + 0x517ca*4+0x02000000,0x380); +reg_write( DDR_REG_BASE + 0x517cb*4+0x02000000,0xc142); +reg_write( DDR_REG_BASE + 0x517cc*4+0x02000000,0xc240); +reg_write( DDR_REG_BASE + 0x517cd*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x517ce*4+0x02000000,0x740c); +reg_write( DDR_REG_BASE + 0x517cf*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x517d0*4+0x02000000,0x38); +reg_write( DDR_REG_BASE + 0x517d1*4+0x02000000,0x5); +reg_write( DDR_REG_BASE + 0x517d2*4+0x02000000,0x8be); +reg_write( DDR_REG_BASE + 0x517d3*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x517d4*4+0x02000000,0x42a1); +reg_write( DDR_REG_BASE + 0x517d5*4+0x02000000,0xc012); +reg_write( DDR_REG_BASE + 0x517d6*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x517d7*4+0x02000000,0x39); +reg_write( DDR_REG_BASE + 0x517d8*4+0x02000000,0x3); +reg_write( DDR_REG_BASE + 0x517d9*4+0x02000000,0x42a1); +reg_write( DDR_REG_BASE + 0x517da*4+0x02000000,0x780e); +reg_write( DDR_REG_BASE + 0x517db*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x517dc*4+0x02000000,0x207f); +reg_write( DDR_REG_BASE + 0x517dd*4+0x02000000,0x140); +reg_write( DDR_REG_BASE + 0x517de*4+0x02000000,0x932); +reg_write( DDR_REG_BASE + 0x517df*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x517e0*4+0x02000000,0x4363); +reg_write( DDR_REG_BASE + 0x517e1*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE + 0x517e2*4+0x02000000,0x8f01); +reg_write( DDR_REG_BASE + 0x517e3*4+0x02000000,0x899); +reg_write( DDR_REG_BASE + 0x517e4*4+0x02000000,0x83a5); +reg_write( DDR_REG_BASE + 0x517e5*4+0x02000000,0x2644); +reg_write( DDR_REG_BASE + 0x517e6*4+0x02000000,0x105b); +reg_write( DDR_REG_BASE + 0x517e7*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x517e8*4+0x02000000,0x7005); +reg_write( DDR_REG_BASE + 0x517e9*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x517ea*4+0x02000000,0xe004); +reg_write( DDR_REG_BASE + 0x517eb*4+0x02000000,0xc0bd); +reg_write( DDR_REG_BASE + 0x517ec*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x517ed*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x517ee*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x517ef*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x517f0*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x517f1*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x517f2*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x517f3*4+0x02000000,0xc1ab); +reg_write( DDR_REG_BASE + 0x517f4*4+0x02000000,0xc047); +reg_write( DDR_REG_BASE + 0x517f5*4+0x02000000,0x690b); +reg_write( DDR_REG_BASE + 0x517f6*4+0x02000000,0x4338); +reg_write( DDR_REG_BASE + 0x517f7*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE + 0x517f8*4+0x02000000,0x9b2); +reg_write( DDR_REG_BASE + 0x517f9*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x517fa*4+0x02000000,0x7e0f); +reg_write( DDR_REG_BASE + 0x517fb*4+0x02000000,0xc048); +reg_write( DDR_REG_BASE + 0x517fc*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x517fd*4+0x02000000,0x83f); +reg_write( DDR_REG_BASE + 0x517fe*4+0x02000000,0x134); +reg_write( DDR_REG_BASE + 0x517ff*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x51800*4+0x02000000,0xc12); +reg_write( DDR_REG_BASE + 0x51801*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51802*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x51803*4+0x02000000,0x1200); +reg_write( DDR_REG_BASE + 0x51804*4+0x02000000,0x3083); +reg_write( DDR_REG_BASE + 0x51805*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51806*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x51807*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x51808*4+0x02000000,0xb98e); +reg_write( DDR_REG_BASE + 0x51809*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x5180a*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x5180b*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x5180c*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x5180d*4+0x02000000,0xcd2); +reg_write( DDR_REG_BASE + 0x5180e*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x5180f*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x51810*4+0x02000000,0xf8f6); +reg_write( DDR_REG_BASE + 0x51811*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x51812*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x51813*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x51814*4+0x02000000,0xcc2); +reg_write( DDR_REG_BASE + 0x51815*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51816*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x51817*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x51818*4+0x02000000,0xc7a); +reg_write( DDR_REG_BASE + 0x51819*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x5181a*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x5181b*4+0x02000000,0x2342); +reg_write( DDR_REG_BASE + 0x5181c*4+0x02000000,0x3040); +reg_write( DDR_REG_BASE + 0x5181d*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE + 0x5181e*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x5181f*4+0x02000000,0x267c); +reg_write( DDR_REG_BASE + 0x51820*4+0x02000000,0x1101); +reg_write( DDR_REG_BASE + 0x51821*4+0x02000000,0x207c); +reg_write( DDR_REG_BASE + 0x51822*4+0x02000000,0x80); +reg_write( DDR_REG_BASE + 0x51823*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x51824*4+0x02000000,0x804d); +reg_write( DDR_REG_BASE + 0x51825*4+0x02000000,0xdf08); +reg_write( DDR_REG_BASE + 0x51826*4+0x02000000,0x9ce); +reg_write( DDR_REG_BASE + 0x51827*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x51828*4+0x02000000,0x27ca); +reg_write( DDR_REG_BASE + 0x51829*4+0x02000000,0x1062); +reg_write( DDR_REG_BASE + 0x5182a*4+0x02000000,0xa26); +reg_write( DDR_REG_BASE + 0x5182b*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x5182c*4+0x02000000,0x4608); +reg_write( DDR_REG_BASE + 0x5182d*4+0x02000000,0x70b5); +reg_write( DDR_REG_BASE + 0x5182e*4+0x02000000,0x218a); +reg_write( DDR_REG_BASE + 0x5182f*4+0x02000000,0xfc7); +reg_write( DDR_REG_BASE + 0x51830*4+0x02000000,0x42c3); +reg_write( DDR_REG_BASE + 0x51831*4+0x02000000,0x900f); +reg_write( DDR_REG_BASE + 0x51832*4+0x02000000,0xe0c0); +reg_write( DDR_REG_BASE + 0x51833*4+0x02000000,0x21ca); +reg_write( DDR_REG_BASE + 0x51834*4+0x02000000,0x21); +reg_write( DDR_REG_BASE + 0x51835*4+0x02000000,0xb2e0); +reg_write( DDR_REG_BASE + 0x51836*4+0x02000000,0xb225); +reg_write( DDR_REG_BASE + 0x51837*4+0x02000000,0xc108); +reg_write( DDR_REG_BASE + 0x51838*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE + 0x51839*4+0x02000000,0x4d); +reg_write( DDR_REG_BASE + 0x5183a*4+0x02000000,0x651d); +reg_write( DDR_REG_BASE + 0x5183b*4+0x02000000,0x2614); +reg_write( DDR_REG_BASE + 0x5183c*4+0x02000000,0x1042); +reg_write( DDR_REG_BASE + 0x5183d*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x5183e*4+0x02000000,0x4ad8); +reg_write( DDR_REG_BASE + 0x5183f*4+0x02000000,0x2144); +reg_write( DDR_REG_BASE + 0x51840*4+0x02000000,0x4e); +reg_write( DDR_REG_BASE + 0x51841*4+0x02000000,0x82f); +reg_write( DDR_REG_BASE + 0x51842*4+0x02000000,0xb5); +reg_write( DDR_REG_BASE + 0x51843*4+0x02000000,0x665e); +reg_write( DDR_REG_BASE + 0x51844*4+0x02000000,0x47cb); +reg_write( DDR_REG_BASE + 0x51845*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51846*4+0x02000000,0xf0f0); +reg_write( DDR_REG_BASE + 0x51847*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x51848*4+0x02000000,0x41e1); +reg_write( DDR_REG_BASE + 0x51849*4+0x02000000,0x42e1); +reg_write( DDR_REG_BASE + 0x5184a*4+0x02000000,0x43e1); +reg_write( DDR_REG_BASE + 0x5184b*4+0x02000000,0xaae); +reg_write( DDR_REG_BASE + 0x5184c*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x5184d*4+0x02000000,0xc740); +reg_write( DDR_REG_BASE + 0x5184e*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE + 0x5184f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51850*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE + 0x51851*4+0x02000000,0xd808); +reg_write( DDR_REG_BASE + 0x51852*4+0x02000000,0x41e1); +reg_write( DDR_REG_BASE + 0x51853*4+0x02000000,0x42e1); +reg_write( DDR_REG_BASE + 0x51854*4+0x02000000,0xa9a); +reg_write( DDR_REG_BASE + 0x51855*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x51856*4+0x02000000,0xc340); +reg_write( DDR_REG_BASE + 0x51857*4+0x02000000,0x4e58); +reg_write( DDR_REG_BASE + 0x51858*4+0x02000000,0xc049); +reg_write( DDR_REG_BASE + 0x51859*4+0x02000000,0x234f); +reg_write( DDR_REG_BASE + 0x5185a*4+0x02000000,0x3040); +reg_write( DDR_REG_BASE + 0x5185b*4+0x02000000,0xe510); +reg_write( DDR_REG_BASE + 0x5185c*4+0x02000000,0x7214); +reg_write( DDR_REG_BASE + 0x5185d*4+0x02000000,0x70cd); +reg_write( DDR_REG_BASE + 0x5185e*4+0x02000000,0xc54a); +reg_write( DDR_REG_BASE + 0x5185f*4+0x02000000,0xf479); +reg_write( DDR_REG_BASE + 0x51860*4+0x02000000,0xc008); +reg_write( DDR_REG_BASE + 0x51861*4+0x02000000,0x790f); +reg_write( DDR_REG_BASE + 0x51862*4+0x02000000,0xb4e); +reg_write( DDR_REG_BASE + 0x51863*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51864*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x51865*4+0x02000000,0x1200); +reg_write( DDR_REG_BASE + 0x51866*4+0x02000000,0x3083); +reg_write( DDR_REG_BASE + 0x51867*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x51868*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x51869*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x5186a*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE + 0x5186b*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x5186c*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x5186d*4+0x02000000,0xc12); +reg_write( DDR_REG_BASE + 0x5186e*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x5186f*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x51870*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE + 0x51871*4+0x02000000,0xf8b8); +reg_write( DDR_REG_BASE + 0x51872*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE + 0x51873*4+0x02000000,0x3041); +reg_write( DDR_REG_BASE + 0x51874*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x51875*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x51876*4+0x02000000,0xbfe); +reg_write( DDR_REG_BASE + 0x51877*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51878*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x51879*4+0x02000000,0xdb6); +reg_write( DDR_REG_BASE + 0x5187a*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x5187b*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x5187c*4+0x02000000,0xbfaa); +reg_write( DDR_REG_BASE + 0x5187d*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x5187e*4+0x02000000,0x41e1); +reg_write( DDR_REG_BASE + 0x5187f*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x51880*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE + 0x51881*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE + 0x51882*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x51883*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x51884*4+0x02000000,0xbe2); +reg_write( DDR_REG_BASE + 0x51885*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51886*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x51887*4+0x02000000,0xca08); +reg_write( DDR_REG_BASE + 0x51888*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x51889*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5188a*4+0x02000000,0x7500); +reg_write( DDR_REG_BASE + 0x5188b*4+0x02000000,0x724c); +reg_write( DDR_REG_BASE + 0x5188c*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE + 0x5188d*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x5188e*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x5188f*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x51890*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x51891*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x51892*4+0x02000000,0xbc6); +reg_write( DDR_REG_BASE + 0x51893*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51894*4+0x02000000,0x4338); +reg_write( DDR_REG_BASE + 0x51895*4+0x02000000,0xc86); +reg_write( DDR_REG_BASE + 0x51896*4+0x02000000,0xff0f); +reg_write( DDR_REG_BASE + 0x51897*4+0x02000000,0xc00a); +reg_write( DDR_REG_BASE + 0x51898*4+0x02000000,0x41e1); +reg_write( DDR_REG_BASE + 0x51899*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x5189a*4+0x02000000,0x7b0f); +reg_write( DDR_REG_BASE + 0x5189b*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x5189c*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE + 0x5189d*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x5189e*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x5189f*4+0x02000000,0xbae); +reg_write( DDR_REG_BASE + 0x518a0*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x518a1*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x518a2*4+0x02000000,0xca08); +reg_write( DDR_REG_BASE + 0x518a3*4+0x02000000,0x2350); +reg_write( DDR_REG_BASE + 0x518a4*4+0x02000000,0x3301); +reg_write( DDR_REG_BASE + 0x518a5*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE + 0x518a6*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE + 0x518a7*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x518a8*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x518a9*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x518aa*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x518ab*4+0x02000000,0xb96); +reg_write( DDR_REG_BASE + 0x518ac*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x518ad*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x518ae*4+0x02000000,0xc009); +reg_write( DDR_REG_BASE + 0x518af*4+0x02000000,0xf8a4); +reg_write( DDR_REG_BASE + 0x518b0*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE + 0x518b1*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x518b2*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x518b3*4+0x02000000,0xb86); +reg_write( DDR_REG_BASE + 0x518b4*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x518b5*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x518b6*4+0x02000000,0xf89d); +reg_write( DDR_REG_BASE + 0x518b7*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE + 0x518b8*4+0x02000000,0x30c1); +reg_write( DDR_REG_BASE + 0x518b9*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x518ba*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x518bb*4+0x02000000,0xb76); +reg_write( DDR_REG_BASE + 0x518bc*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x518bd*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x518be*4+0x02000000,0xf896); +reg_write( DDR_REG_BASE + 0x518bf*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE + 0x518c0*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x518c1*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x518c2*4+0x02000000,0xb66); +reg_write( DDR_REG_BASE + 0x518c3*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x518c4*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x518c5*4+0x02000000,0xd02); +reg_write( DDR_REG_BASE + 0x518c6*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x518c7*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x518c8*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE + 0x518c9*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x518ca*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x518cb*4+0x02000000,0x1c00); +reg_write( DDR_REG_BASE + 0x518cc*4+0x02000000,0x3041); +reg_write( DDR_REG_BASE + 0x518cd*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x518ce*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE + 0x518cf*4+0x02000000,0x764c); +reg_write( DDR_REG_BASE + 0x518d0*4+0x02000000,0xdb20); +reg_write( DDR_REG_BASE + 0x518d1*4+0x02000000,0xb4a); +reg_write( DDR_REG_BASE + 0x518d2*4+0x02000000,0xfecf); +reg_write( DDR_REG_BASE + 0x518d3*4+0x02000000,0xc0ab); +reg_write( DDR_REG_BASE + 0x518d4*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x518d5*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x518d6*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x518d7*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x518d8*4+0x02000000,0x811); +reg_write( DDR_REG_BASE + 0x518d9*4+0x02000000,0x135); +reg_write( DDR_REG_BASE + 0x518da*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x518db*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x518dc*4+0x02000000,0xf36); +reg_write( DDR_REG_BASE + 0x518dd*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE + 0x518de*4+0x02000000,0xb992); +reg_write( DDR_REG_BASE + 0x518df*4+0x02000000,0xf1f5); +reg_write( DDR_REG_BASE + 0x518e0*4+0x02000000,0xbe7); +reg_write( DDR_REG_BASE + 0x518e1*4+0x02000000,0xb071); +reg_write( DDR_REG_BASE + 0x518e2*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x518e3*4+0x02000000,0x736f); +reg_write( DDR_REG_BASE + 0x518e4*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE + 0x518e5*4+0x02000000,0xf092); +reg_write( DDR_REG_BASE + 0x518e6*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x518e7*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x518e8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x518e9*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE + 0x518ea*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE + 0x518eb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x518ec*4+0x02000000,0xff00); +reg_write( DDR_REG_BASE + 0x518ed*4+0x02000000,0x7014); +reg_write( DDR_REG_BASE + 0x518ee*4+0x02000000,0x21ca); +reg_write( DDR_REG_BASE + 0x518ef*4+0x02000000,0x21); +reg_write( DDR_REG_BASE + 0x518f0*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x518f1*4+0x02000000,0x4220); +reg_write( DDR_REG_BASE + 0x518f2*4+0x02000000,0x95e); +reg_write( DDR_REG_BASE + 0x518f3*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x518f4*4+0x02000000,0xc340); +reg_write( DDR_REG_BASE + 0x518f5*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x518f6*4+0x02000000,0xa26); +reg_write( DDR_REG_BASE + 0x518f7*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x518f8*4+0x02000000,0x41a1); +reg_write( DDR_REG_BASE + 0x518f9*4+0x02000000,0x1200); +reg_write( DDR_REG_BASE + 0x518fa*4+0x02000000,0x3083); +reg_write( DDR_REG_BASE + 0x518fb*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x518fc*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x518fd*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x518fe*4+0x02000000,0x4528); +reg_write( DDR_REG_BASE + 0x518ff*4+0x02000000,0xc143); +reg_write( DDR_REG_BASE + 0x51900*4+0x02000000,0xc142); +reg_write( DDR_REG_BASE + 0x51901*4+0x02000000,0xc141); +reg_write( DDR_REG_BASE + 0x51902*4+0x02000000,0xae6); +reg_write( DDR_REG_BASE + 0x51903*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51904*4+0x02000000,0xc140); +reg_write( DDR_REG_BASE + 0x51905*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE + 0x51906*4+0x02000000,0x47cb); +reg_write( DDR_REG_BASE + 0x51907*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51908*4+0x02000000,0x4400); +reg_write( DDR_REG_BASE + 0x51909*4+0x02000000,0x41e1); +reg_write( DDR_REG_BASE + 0x5190a*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x5190b*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE + 0x5190c*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x5190d*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x5190e*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x5190f*4+0x02000000,0xdb7c); +reg_write( DDR_REG_BASE + 0x51910*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE + 0x51911*4+0x02000000,0x3041); +reg_write( DDR_REG_BASE + 0x51912*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x51913*4+0x02000000,0xac6); +reg_write( DDR_REG_BASE + 0x51914*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51915*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x51916*4+0x02000000,0xbfaa); +reg_write( DDR_REG_BASE + 0x51917*4+0x02000000,0xc746); +reg_write( DDR_REG_BASE + 0x51918*4+0x02000000,0xc106); +reg_write( DDR_REG_BASE + 0x51919*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x5191a*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x5191b*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE + 0x5191c*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x5191d*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x5191e*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x5191f*4+0x02000000,0xaae); +reg_write( DDR_REG_BASE + 0x51920*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51921*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x51922*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x51923*4+0x02000000,0xc106); +reg_write( DDR_REG_BASE + 0x51924*4+0x02000000,0x724c); +reg_write( DDR_REG_BASE + 0x51925*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x51926*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x51927*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x51928*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE + 0x51929*4+0x02000000,0x36c0); +reg_write( DDR_REG_BASE + 0x5192a*4+0x02000000,0x2079); +reg_write( DDR_REG_BASE + 0x5192b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5192c*4+0x02000000,0x205f); +reg_write( DDR_REG_BASE + 0x5192d*4+0x02000000,0x20f); +reg_write( DDR_REG_BASE + 0x5192e*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x5192f*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x51930*4+0x02000000,0xa8a); +reg_write( DDR_REG_BASE + 0x51931*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51932*4+0x02000000,0xc740); +reg_write( DDR_REG_BASE + 0x51933*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x51934*4+0x02000000,0xc106); +reg_write( DDR_REG_BASE + 0x51935*4+0x02000000,0x724c); +reg_write( DDR_REG_BASE + 0x51936*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x51937*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x51938*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x51939*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE + 0x5193a*4+0x02000000,0x36c0); +reg_write( DDR_REG_BASE + 0x5193b*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x5193c*4+0x02000000,0xa72); +reg_write( DDR_REG_BASE + 0x5193d*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x5193e*4+0x02000000,0xc740); +reg_write( DDR_REG_BASE + 0x5193f*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x51940*4+0x02000000,0xc106); +reg_write( DDR_REG_BASE + 0x51941*4+0x02000000,0x724c); +reg_write( DDR_REG_BASE + 0x51942*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x51943*4+0x02000000,0xb990); +reg_write( DDR_REG_BASE + 0x51944*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x51945*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x51946*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE + 0x51947*4+0x02000000,0x36c0); +reg_write( DDR_REG_BASE + 0x51948*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x51949*4+0x02000000,0xa5a); +reg_write( DDR_REG_BASE + 0x5194a*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x5194b*4+0x02000000,0xc740); +reg_write( DDR_REG_BASE + 0x5194c*4+0x02000000,0xb16); +reg_write( DDR_REG_BASE + 0x5194d*4+0x02000000,0xff0f); +reg_write( DDR_REG_BASE + 0x5194e*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x5194f*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x51950*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x51951*4+0x02000000,0xdb20); +reg_write( DDR_REG_BASE + 0x51952*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x51953*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x51954*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x51955*4+0x02000000,0xa42); +reg_write( DDR_REG_BASE + 0x51956*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51957*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x51958*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x51959*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x5195a*4+0x02000000,0x764c); +reg_write( DDR_REG_BASE + 0x5195b*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x5195c*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x5195d*4+0x02000000,0xdb26); +reg_write( DDR_REG_BASE + 0x5195e*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x5195f*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x51960*4+0x02000000,0xa2a); +reg_write( DDR_REG_BASE + 0x51961*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51962*4+0x02000000,0x1c00); +reg_write( DDR_REG_BASE + 0x51963*4+0x02000000,0x3041); +reg_write( DDR_REG_BASE + 0x51964*4+0x02000000,0xc00a); +reg_write( DDR_REG_BASE + 0x51965*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE + 0x51966*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x51967*4+0x02000000,0x7b0f); +reg_write( DDR_REG_BASE + 0x51968*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x51969*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x5196a*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x5196b*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x5196c*4+0x02000000,0xa12); +reg_write( DDR_REG_BASE + 0x5196d*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x5196e*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x5196f*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x51970*4+0x02000000,0x9ca); +reg_write( DDR_REG_BASE + 0x51971*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51972*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51973*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x51974*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE + 0x51975*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE + 0x51976*4+0x02000000,0xc008); +reg_write( DDR_REG_BASE + 0x51977*4+0x02000000,0x7d0f); +reg_write( DDR_REG_BASE + 0x51978*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x51979*4+0x02000000,0x7214); +reg_write( DDR_REG_BASE + 0x5197a*4+0x02000000,0x6d8); +reg_write( DDR_REG_BASE + 0x5197b*4+0x02000000,0xffc5); +reg_write( DDR_REG_BASE + 0x5197c*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x5197d*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x5197e*4+0x02000000,0x7105); +reg_write( DDR_REG_BASE + 0x5197f*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE + 0x51980*4+0x02000000,0xe1f2); +reg_write( DDR_REG_BASE + 0x51981*4+0x02000000,0x912); +reg_write( DDR_REG_BASE + 0x51982*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51983*4+0x02000000,0x41a1); +reg_write( DDR_REG_BASE + 0x51984*4+0x02000000,0x1200); +reg_write( DDR_REG_BASE + 0x51985*4+0x02000000,0x3083); +reg_write( DDR_REG_BASE + 0x51986*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x51987*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x51988*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x51989*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE + 0x5198a*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x5198b*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x5198c*4+0x02000000,0x9d2); +reg_write( DDR_REG_BASE + 0x5198d*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x5198e*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x5198f*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE + 0x51990*4+0x02000000,0xf828); +reg_write( DDR_REG_BASE + 0x51991*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE + 0x51992*4+0x02000000,0x3041); +reg_write( DDR_REG_BASE + 0x51993*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x51994*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x51995*4+0x02000000,0x9c2); +reg_write( DDR_REG_BASE + 0x51996*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51997*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x51998*4+0x02000000,0xb76); +reg_write( DDR_REG_BASE + 0x51999*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x5199a*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x5199b*4+0x02000000,0xbfaa); +reg_write( DDR_REG_BASE + 0x5199c*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x5199d*4+0x02000000,0x41e1); +reg_write( DDR_REG_BASE + 0x5199e*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x5199f*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE + 0x519a0*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE + 0x519a1*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x519a2*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x519a3*4+0x02000000,0x9a6); +reg_write( DDR_REG_BASE + 0x519a4*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x519a5*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x519a6*4+0x02000000,0xca08); +reg_write( DDR_REG_BASE + 0x519a7*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x519a8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x519a9*4+0x02000000,0x6100); +reg_write( DDR_REG_BASE + 0x519aa*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE + 0x519ab*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE + 0x519ac*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x519ad*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x519ae*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x519af*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x519b0*4+0x02000000,0x98a); +reg_write( DDR_REG_BASE + 0x519b1*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x519b2*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x519b3*4+0x02000000,0xc009); +reg_write( DDR_REG_BASE + 0x519b4*4+0x02000000,0xf821); +reg_write( DDR_REG_BASE + 0x519b5*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE + 0x519b6*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x519b7*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x519b8*4+0x02000000,0x97a); +reg_write( DDR_REG_BASE + 0x519b9*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x519ba*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x519bb*4+0x02000000,0xf81b); +reg_write( DDR_REG_BASE + 0x519bc*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE + 0x519bd*4+0x02000000,0x30c1); +reg_write( DDR_REG_BASE + 0x519be*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x519bf*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x519c0*4+0x02000000,0x96a); +reg_write( DDR_REG_BASE + 0x519c1*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x519c2*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x519c3*4+0x02000000,0xf814); +reg_write( DDR_REG_BASE + 0x519c4*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE + 0x519c5*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x519c6*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x519c7*4+0x02000000,0x95e); +reg_write( DDR_REG_BASE + 0x519c8*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x519c9*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x519ca*4+0x02000000,0xaf6); +reg_write( DDR_REG_BASE + 0x519cb*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x519cc*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x519cd*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x519ce*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x519cf*4+0x02000000,0x764c); +reg_write( DDR_REG_BASE + 0x519d0*4+0x02000000,0xdb26); +reg_write( DDR_REG_BASE + 0x519d1*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE + 0x519d2*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x519d3*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x519d4*4+0x02000000,0x942); +reg_write( DDR_REG_BASE + 0x519d5*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x519d6*4+0x02000000,0x1c00); +reg_write( DDR_REG_BASE + 0x519d7*4+0x02000000,0x3041); +reg_write( DDR_REG_BASE + 0x519d8*4+0x02000000,0xf812); +reg_write( DDR_REG_BASE + 0x519d9*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE + 0x519da*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x519db*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x519dc*4+0x02000000,0x5eb); +reg_write( DDR_REG_BASE + 0x519dd*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x519de*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x519df*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x519e0*4+0x02000000,0x47cb); +reg_write( DDR_REG_BASE + 0x519e1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x519e2*4+0x02000000,0x4400); +reg_write( DDR_REG_BASE + 0x519e3*4+0x02000000,0x41e1); +reg_write( DDR_REG_BASE + 0x519e4*4+0x02000000,0x7d0f); +reg_write( DDR_REG_BASE + 0x519e5*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x519e6*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x519e7*4+0x02000000,0xdb7c); +reg_write( DDR_REG_BASE + 0x519e8*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x519e9*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x519ea*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x519eb*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x519ec*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x519ed*4+0x02000000,0xdb10); +reg_write( DDR_REG_BASE + 0x519ee*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x519ef*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x519f0*4+0x02000000,0x79fb); +reg_write( DDR_REG_BASE + 0x519f1*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x519f2*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x519f3*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE + 0x519f4*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x519f5*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x519f6*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x519f7*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x519f8*4+0x02000000,0x7b0f); +reg_write( DDR_REG_BASE + 0x519f9*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x519fa*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x519fb*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x519fc*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x519fd*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE + 0x519fe*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x519ff*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x51a00*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x51a01*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x51a02*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x51a03*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x51a04*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x51a05*4+0x02000000,0xc1a6); +reg_write( DDR_REG_BASE + 0x51a06*4+0x02000000,0x4608); +reg_write( DDR_REG_BASE + 0x51a07*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51a08*4+0x02000000,0x7100); +reg_write( DDR_REG_BASE + 0x51a09*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE + 0x51a0a*4+0x02000000,0x1e0); +reg_write( DDR_REG_BASE + 0x51a0b*4+0x02000000,0x218a); +reg_write( DDR_REG_BASE + 0x51a0c*4+0x02000000,0xffd); +reg_write( DDR_REG_BASE + 0x51a0d*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE + 0x51a0e*4+0x02000000,0x7824); +reg_write( DDR_REG_BASE + 0x51a0f*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x51a10*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51a11*4+0x02000000,0x7100); +reg_write( DDR_REG_BASE + 0x51a12*4+0x02000000,0x900e); +reg_write( DDR_REG_BASE + 0x51a13*4+0x02000000,0x4c); +reg_write( DDR_REG_BASE + 0x51a14*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x51a15*4+0x02000000,0x8e19); +reg_write( DDR_REG_BASE + 0x51a16*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE + 0x51a17*4+0x02000000,0x8e10); +reg_write( DDR_REG_BASE + 0x51a18*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE + 0x51a19*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x51a1a*4+0x02000000,0x900e); +reg_write( DDR_REG_BASE + 0x51a1b*4+0x02000000,0x4c); +reg_write( DDR_REG_BASE + 0x51a1c*4+0x02000000,0x9001); +reg_write( DDR_REG_BASE + 0x51a1d*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x51a1e*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x51a1f*4+0x02000000,0xe88a); +reg_write( DDR_REG_BASE + 0x51a20*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x51a21*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51a22*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE + 0x51a23*4+0x02000000,0x4100); +reg_write( DDR_REG_BASE + 0x51a24*4+0x02000000,0x4200); +reg_write( DDR_REG_BASE + 0x51a25*4+0x02000000,0xf3e); +reg_write( DDR_REG_BASE + 0x51a26*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x51a27*4+0x02000000,0x4300); +reg_write( DDR_REG_BASE + 0x51a28*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x51a29*4+0x02000000,0xb6e); +reg_write( DDR_REG_BASE + 0x51a2a*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51a2b*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x51a2c*4+0x02000000,0x8608); +reg_write( DDR_REG_BASE + 0x51a2d*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x51a2e*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x51a2f*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x51a30*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x51a31*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x51a32*4+0x02000000,0xe064); +reg_write( DDR_REG_BASE + 0x51a33*4+0x02000000,0x9b6); +reg_write( DDR_REG_BASE + 0x51a34*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x51a35*4+0x02000000,0xb0a0); +reg_write( DDR_REG_BASE + 0x51a36*4+0x02000000,0xa9e); +reg_write( DDR_REG_BASE + 0x51a37*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51a38*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE + 0x51a39*4+0x02000000,0x8629); +reg_write( DDR_REG_BASE + 0x51a3a*4+0x02000000,0xf26); +reg_write( DDR_REG_BASE + 0x51a3b*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x51a3c*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x51a3d*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE + 0x51a3e*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51a3f*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x51a40*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x51a41*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE + 0x51a42*4+0x02000000,0xe1e0); +reg_write( DDR_REG_BASE + 0x51a43*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x51a44*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x51a45*4+0x02000000,0xe064); +reg_write( DDR_REG_BASE + 0x51a46*4+0x02000000,0x2042); +reg_write( DDR_REG_BASE + 0x51a47*4+0x02000000,0x98f); +reg_write( DDR_REG_BASE + 0x51a48*4+0x02000000,0xb7a0); +reg_write( DDR_REG_BASE + 0x51a49*4+0x02000000,0xb7a0); +reg_write( DDR_REG_BASE + 0x51a4a*4+0x02000000,0x1f9c); +reg_write( DDR_REG_BASE + 0x51a4b*4+0x02000000,0x135c); +reg_write( DDR_REG_BASE + 0x51a4c*4+0x02000000,0x1f9b); +reg_write( DDR_REG_BASE + 0x51a4d*4+0x02000000,0x135c); +reg_write( DDR_REG_BASE + 0x51a4e*4+0x02000000,0x1fe6); +reg_write( DDR_REG_BASE + 0x51a4f*4+0x02000000,0x9f84); +reg_write( DDR_REG_BASE + 0x51a50*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51a51*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE + 0x51a52*4+0x02000000,0x1ff2); +reg_write( DDR_REG_BASE + 0x51a53*4+0x02000000,0x9044); +reg_write( DDR_REG_BASE + 0x51a54*4+0x02000000,0x1fe4); +reg_write( DDR_REG_BASE + 0x51a55*4+0x02000000,0x9044); +reg_write( DDR_REG_BASE + 0x51a56*4+0x02000000,0xffe); +reg_write( DDR_REG_BASE + 0x51a57*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x51a58*4+0x02000000,0x960e); +reg_write( DDR_REG_BASE + 0x51a59*4+0x02000000,0xc100); +reg_write( DDR_REG_BASE + 0x51a5a*4+0x02000000,0xc201); +reg_write( DDR_REG_BASE + 0x51a5b*4+0x02000000,0xade); +reg_write( DDR_REG_BASE + 0x51a5c*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x51a5d*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE + 0x51a5e*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x51a5f*4+0x02000000,0xb02); +reg_write( DDR_REG_BASE + 0x51a60*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51a61*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x51a62*4+0x02000000,0x8629); +reg_write( DDR_REG_BASE + 0x51a63*4+0x02000000,0xed6); +reg_write( DDR_REG_BASE + 0x51a64*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x51a65*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x51a66*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x51a67*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51a68*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x51a69*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x51a6a*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE + 0x51a6b*4+0x02000000,0xe1e0); +reg_write( DDR_REG_BASE + 0x51a6c*4+0x02000000,0xb7a0); +reg_write( DDR_REG_BASE + 0x51a6d*4+0x02000000,0x1fe6); +reg_write( DDR_REG_BASE + 0x51a6e*4+0x02000000,0x9f84); +reg_write( DDR_REG_BASE + 0x51a6f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51a70*4+0x02000000,0xff00); +reg_write( DDR_REG_BASE + 0x51a71*4+0x02000000,0x1ff2); +reg_write( DDR_REG_BASE + 0x51a72*4+0x02000000,0x9044); +reg_write( DDR_REG_BASE + 0x51a73*4+0x02000000,0x1fe4); +reg_write( DDR_REG_BASE + 0x51a74*4+0x02000000,0x9044); +reg_write( DDR_REG_BASE + 0x51a75*4+0x02000000,0xfc2); +reg_write( DDR_REG_BASE + 0x51a76*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x51a77*4+0x02000000,0x960a); +reg_write( DDR_REG_BASE + 0x51a78*4+0x02000000,0x8e58); +reg_write( DDR_REG_BASE + 0x51a79*4+0x02000000,0x8601); +reg_write( DDR_REG_BASE + 0x51a7a*4+0x02000000,0xa0e); +reg_write( DDR_REG_BASE + 0x51a7b*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x51a7c*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51a7d*4+0x02000000,0xc100); +reg_write( DDR_REG_BASE + 0x51a7e*4+0x02000000,0xc201); +reg_write( DDR_REG_BASE + 0x51a7f*4+0x02000000,0xa96); +reg_write( DDR_REG_BASE + 0x51a80*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x51a81*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE + 0x51a82*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x51a83*4+0x02000000,0xaba); +reg_write( DDR_REG_BASE + 0x51a84*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51a85*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x51a86*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x51a87*4+0x02000000,0xe808); +reg_write( DDR_REG_BASE + 0x51a88*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE + 0x51a89*4+0x02000000,0x9b2); +reg_write( DDR_REG_BASE + 0x51a8a*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51a8b*4+0x02000000,0x2078); +reg_write( DDR_REG_BASE + 0x51a8c*4+0x02000000,0x100); +reg_write( DDR_REG_BASE + 0x51a8d*4+0x02000000,0xf012); +reg_write( DDR_REG_BASE + 0x51a8e*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE + 0x51a8f*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x51a90*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51a91*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE + 0x51a92*4+0x02000000,0x4220); +reg_write( DDR_REG_BASE + 0x51a93*4+0x02000000,0x7414); +reg_write( DDR_REG_BASE + 0x51a94*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x51a95*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51a96*4+0x02000000,0xfffe); +reg_write( DDR_REG_BASE + 0x51a97*4+0x02000000,0x22ca); +reg_write( DDR_REG_BASE + 0x51a98*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x51a99*4+0x02000000,0x20ca); +reg_write( DDR_REG_BASE + 0x51a9a*4+0x02000000,0x41); +reg_write( DDR_REG_BASE + 0x51a9b*4+0x02000000,0xe52); +reg_write( DDR_REG_BASE + 0x51a9c*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x51a9d*4+0x02000000,0x4320); +reg_write( DDR_REG_BASE + 0x51a9e*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51a9f*4+0x02000000,0x7100); +reg_write( DDR_REG_BASE + 0x51aa0*4+0x02000000,0x900e); +reg_write( DDR_REG_BASE + 0x51aa1*4+0x02000000,0x4c); +reg_write( DDR_REG_BASE + 0x51aa2*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x51aa3*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x51aa4*4+0x02000000,0x900e); +reg_write( DDR_REG_BASE + 0x51aa5*4+0x02000000,0x4c); +reg_write( DDR_REG_BASE + 0x51aa6*4+0x02000000,0x9001); +reg_write( DDR_REG_BASE + 0x51aa7*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x51aa8*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE + 0x51aa9*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x51aaa*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x51aab*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE + 0x51aac*4+0x02000000,0xe1e0); +reg_write( DDR_REG_BASE + 0x51aad*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE + 0x51aae*4+0x02000000,0x8629); +reg_write( DDR_REG_BASE + 0x51aaf*4+0x02000000,0x2078); +reg_write( DDR_REG_BASE + 0x51ab0*4+0x02000000,0x100); +reg_write( DDR_REG_BASE + 0x51ab1*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x51ab2*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x51ab3*4+0x02000000,0x7504); +reg_write( DDR_REG_BASE + 0x51ab4*4+0x02000000,0xe32); +reg_write( DDR_REG_BASE + 0x51ab5*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x51ab6*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x51ab7*4+0x02000000,0x8608); +reg_write( DDR_REG_BASE + 0x51ab8*4+0x02000000,0x706f); +reg_write( DDR_REG_BASE + 0x51ab9*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x51aba*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x51abb*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x51abc*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x51abd*4+0x02000000,0xe064); +reg_write( DDR_REG_BASE + 0x51abe*4+0x02000000,0x89e); +reg_write( DDR_REG_BASE + 0x51abf*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x51ac0*4+0x02000000,0x1800); +reg_write( DDR_REG_BASE + 0x51ac1*4+0x02000000,0x6c4); +reg_write( DDR_REG_BASE + 0x51ac2*4+0x02000000,0x986); +reg_write( DDR_REG_BASE + 0x51ac3*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51ac4*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE + 0x51ac5*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51ac6*4+0x02000000,0x1f00); +reg_write( DDR_REG_BASE + 0x51ac7*4+0x02000000,0x16c4); +reg_write( DDR_REG_BASE + 0x51ac8*4+0x02000000,0x1f9c); +reg_write( DDR_REG_BASE + 0x51ac9*4+0x02000000,0x16dc); +reg_write( DDR_REG_BASE + 0x51aca*4+0x02000000,0x1f9b); +reg_write( DDR_REG_BASE + 0x51acb*4+0x02000000,0x16dc); +reg_write( DDR_REG_BASE + 0x51acc*4+0x02000000,0x1fe6); +reg_write( DDR_REG_BASE + 0x51acd*4+0x02000000,0x9f84); +reg_write( DDR_REG_BASE + 0x51ace*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51acf*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE + 0x51ad0*4+0x02000000,0x1ff2); +reg_write( DDR_REG_BASE + 0x51ad1*4+0x02000000,0x9044); +reg_write( DDR_REG_BASE + 0x51ad2*4+0x02000000,0x1fe4); +reg_write( DDR_REG_BASE + 0x51ad3*4+0x02000000,0x9044); +reg_write( DDR_REG_BASE + 0x51ad4*4+0x02000000,0x960e); +reg_write( DDR_REG_BASE + 0x51ad5*4+0x02000000,0xf02); +reg_write( DDR_REG_BASE + 0x51ad6*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x51ad7*4+0x02000000,0x4528); +reg_write( DDR_REG_BASE + 0x51ad8*4+0x02000000,0xc100); +reg_write( DDR_REG_BASE + 0x51ad9*4+0x02000000,0xc201); +reg_write( DDR_REG_BASE + 0x51ada*4+0x02000000,0x9de); +reg_write( DDR_REG_BASE + 0x51adb*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x51adc*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE + 0x51add*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x51ade*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x51adf*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x51ae0*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x51ae1*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE + 0x51ae2*4+0x02000000,0xe1e0); +reg_write( DDR_REG_BASE + 0x51ae3*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x51ae4*4+0x02000000,0x9f6); +reg_write( DDR_REG_BASE + 0x51ae5*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51ae6*4+0x02000000,0x1f00); +reg_write( DDR_REG_BASE + 0x51ae7*4+0x02000000,0x16c4); +reg_write( DDR_REG_BASE + 0x51ae8*4+0x02000000,0x8629); +reg_write( DDR_REG_BASE + 0x51ae9*4+0x02000000,0xdca); +reg_write( DDR_REG_BASE + 0x51aea*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x51aeb*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE + 0x51aec*4+0x02000000,0x1fe6); +reg_write( DDR_REG_BASE + 0x51aed*4+0x02000000,0x9f84); +reg_write( DDR_REG_BASE + 0x51aee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51aef*4+0x02000000,0xff00); +reg_write( DDR_REG_BASE + 0x51af0*4+0x02000000,0x1ff2); +reg_write( DDR_REG_BASE + 0x51af1*4+0x02000000,0x9344); +reg_write( DDR_REG_BASE + 0x51af2*4+0x02000000,0x1fe4); +reg_write( DDR_REG_BASE + 0x51af3*4+0x02000000,0x9344); +reg_write( DDR_REG_BASE + 0x51af4*4+0x02000000,0x8605); +reg_write( DDR_REG_BASE + 0x51af5*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51af6*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE + 0x51af7*4+0x02000000,0xebe); +reg_write( DDR_REG_BASE + 0x51af8*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x51af9*4+0x02000000,0x7810); +reg_write( DDR_REG_BASE + 0x51afa*4+0x02000000,0xc100); +reg_write( DDR_REG_BASE + 0x51afb*4+0x02000000,0xc201); +reg_write( DDR_REG_BASE + 0x51afc*4+0x02000000,0x99a); +reg_write( DDR_REG_BASE + 0x51afd*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x51afe*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE + 0x51aff*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x51b00*4+0x02000000,0xe806); +reg_write( DDR_REG_BASE + 0x51b01*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE + 0x51b02*4+0x02000000,0x8be); +reg_write( DDR_REG_BASE + 0x51b03*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51b04*4+0x02000000,0x2079); +reg_write( DDR_REG_BASE + 0x51b05*4+0x02000000,0x100); +reg_write( DDR_REG_BASE + 0x51b06*4+0x02000000,0x8e58); +reg_write( DDR_REG_BASE + 0x51b07*4+0x02000000,0x8603); +reg_write( DDR_REG_BASE + 0x51b08*4+0x02000000,0x8f2); +reg_write( DDR_REG_BASE + 0x51b09*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x51b0a*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51b0b*4+0x02000000,0xc0a6); +reg_write( DDR_REG_BASE + 0x51b0c*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x51b0d*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x51b0e*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x51b0f*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x51b10*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x51b11*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x51b12*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x51b13*4+0x02000000,0xc1a8); +reg_write( DDR_REG_BASE + 0x51b14*4+0x02000000,0x4608); +reg_write( DDR_REG_BASE + 0x51b15*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51b16*4+0x02000000,0x7100); +reg_write( DDR_REG_BASE + 0x51b17*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE + 0x51b18*4+0x02000000,0x1e0); +reg_write( DDR_REG_BASE + 0x51b19*4+0x02000000,0x218a); +reg_write( DDR_REG_BASE + 0x51b1a*4+0x02000000,0xffd); +reg_write( DDR_REG_BASE + 0x51b1b*4+0x02000000,0xc047); +reg_write( DDR_REG_BASE + 0x51b1c*4+0x02000000,0x7824); +reg_write( DDR_REG_BASE + 0x51b1d*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE + 0x51b1e*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51b1f*4+0x02000000,0x7100); +reg_write( DDR_REG_BASE + 0x51b20*4+0x02000000,0x900e); +reg_write( DDR_REG_BASE + 0x51b21*4+0x02000000,0x4c); +reg_write( DDR_REG_BASE + 0x51b22*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x51b23*4+0x02000000,0x8e19); +reg_write( DDR_REG_BASE + 0x51b24*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE + 0x51b25*4+0x02000000,0x8e10); +reg_write( DDR_REG_BASE + 0x51b26*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x51b27*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x51b28*4+0x02000000,0x900e); +reg_write( DDR_REG_BASE + 0x51b29*4+0x02000000,0x4c); +reg_write( DDR_REG_BASE + 0x51b2a*4+0x02000000,0x9001); +reg_write( DDR_REG_BASE + 0x51b2b*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x51b2c*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE + 0x51b2d*4+0x02000000,0xe88a); +reg_write( DDR_REG_BASE + 0x51b2e*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x51b2f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51b30*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE + 0x51b31*4+0x02000000,0x4100); +reg_write( DDR_REG_BASE + 0x51b32*4+0x02000000,0x4200); +reg_write( DDR_REG_BASE + 0x51b33*4+0x02000000,0xd22); +reg_write( DDR_REG_BASE + 0x51b34*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x51b35*4+0x02000000,0x4300); +reg_write( DDR_REG_BASE + 0x51b36*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x51b37*4+0x02000000,0x952); +reg_write( DDR_REG_BASE + 0x51b38*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51b39*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x51b3a*4+0x02000000,0xc102); +reg_write( DDR_REG_BASE + 0x51b3b*4+0x02000000,0x8608); +reg_write( DDR_REG_BASE + 0x51b3c*4+0x02000000,0x2179); +reg_write( DDR_REG_BASE + 0x51b3d*4+0x02000000,0x101); +reg_write( DDR_REG_BASE + 0x51b3e*4+0x02000000,0xe46); +reg_write( DDR_REG_BASE + 0x51b3f*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x51b40*4+0x02000000,0xc144); +reg_write( DDR_REG_BASE + 0x51b41*4+0x02000000,0x88a); +reg_write( DDR_REG_BASE + 0x51b42*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51b43*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE + 0x51b44*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x51b45*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x51b46*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x51b47*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE + 0x51b48*4+0x02000000,0xe1e0); +reg_write( DDR_REG_BASE + 0x51b49*4+0x02000000,0x8629); +reg_write( DDR_REG_BASE + 0x51b4a*4+0x02000000,0xd06); +reg_write( DDR_REG_BASE + 0x51b4b*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x51b4c*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE + 0x51b4d*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x51b4e*4+0x02000000,0x47cb); +reg_write( DDR_REG_BASE + 0x51b4f*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x51b50*4+0x02000000,0xe03e); +reg_write( DDR_REG_BASE + 0x51b51*4+0x02000000,0xb7a0); +reg_write( DDR_REG_BASE + 0x51b52*4+0x02000000,0x1f9b); +reg_write( DDR_REG_BASE + 0x51b53*4+0x02000000,0x135c); +reg_write( DDR_REG_BASE + 0x51b54*4+0x02000000,0x1f9c); +reg_write( DDR_REG_BASE + 0x51b55*4+0x02000000,0x135c); +reg_write( DDR_REG_BASE + 0x51b56*4+0x02000000,0x1fe6); +reg_write( DDR_REG_BASE + 0x51b57*4+0x02000000,0x9f84); +reg_write( DDR_REG_BASE + 0x51b58*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51b59*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE + 0x51b5a*4+0x02000000,0x1ff2); +reg_write( DDR_REG_BASE + 0x51b5b*4+0x02000000,0x9045); +reg_write( DDR_REG_BASE + 0x51b5c*4+0x02000000,0x1fe4); +reg_write( DDR_REG_BASE + 0x51b5d*4+0x02000000,0x9045); +reg_write( DDR_REG_BASE + 0x51b5e*4+0x02000000,0x960e); +reg_write( DDR_REG_BASE + 0x51b5f*4+0x02000000,0xdee); +reg_write( DDR_REG_BASE + 0x51b60*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x51b61*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51b62*4+0x02000000,0xc100); +reg_write( DDR_REG_BASE + 0x51b63*4+0x02000000,0xc201); +reg_write( DDR_REG_BASE + 0x51b64*4+0x02000000,0x8ca); +reg_write( DDR_REG_BASE + 0x51b65*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x51b66*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE + 0x51b67*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x51b68*4+0x02000000,0x8ee); +reg_write( DDR_REG_BASE + 0x51b69*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51b6a*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x51b6b*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE + 0x51b6c*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51b6d*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x51b6e*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x51b6f*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE + 0x51b70*4+0x02000000,0xe1e0); +reg_write( DDR_REG_BASE + 0x51b71*4+0x02000000,0xb7a0); +reg_write( DDR_REG_BASE + 0x51b72*4+0x02000000,0xdc6); +reg_write( DDR_REG_BASE + 0x51b73*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x51b74*4+0x02000000,0x960a); +reg_write( DDR_REG_BASE + 0x51b75*4+0x02000000,0x8e58); +reg_write( DDR_REG_BASE + 0x51b76*4+0x02000000,0x8602); +reg_write( DDR_REG_BASE + 0x51b77*4+0x02000000,0x816); +reg_write( DDR_REG_BASE + 0x51b78*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x51b79*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51b7a*4+0x02000000,0xc100); +reg_write( DDR_REG_BASE + 0x51b7b*4+0x02000000,0xc201); +reg_write( DDR_REG_BASE + 0x51b7c*4+0x02000000,0x89a); +reg_write( DDR_REG_BASE + 0x51b7d*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x51b7e*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE + 0x51b7f*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x51b80*4+0x02000000,0x8be); +reg_write( DDR_REG_BASE + 0x51b81*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51b82*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x51b83*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE + 0x51b84*4+0x02000000,0xe805); +reg_write( DDR_REG_BASE + 0x51b85*4+0x02000000,0xfba); +reg_write( DDR_REG_BASE + 0x51b86*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x51b87*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x51b88*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE + 0x51b89*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE + 0x51b8a*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x51b8b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51b8c*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE + 0x51b8d*4+0x02000000,0x42c3); +reg_write( DDR_REG_BASE + 0x51b8e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51b8f*4+0x02000000,0xfffe); +reg_write( DDR_REG_BASE + 0x51b90*4+0x02000000,0x7414); +reg_write( DDR_REG_BASE + 0x51b91*4+0x02000000,0x4020); +reg_write( DDR_REG_BASE + 0x51b92*4+0x02000000,0x20ca); +reg_write( DDR_REG_BASE + 0x51b93*4+0x02000000,0x81); +reg_write( DDR_REG_BASE + 0x51b94*4+0x02000000,0x22ca); +reg_write( DDR_REG_BASE + 0x51b95*4+0x02000000,0x41); +reg_write( DDR_REG_BASE + 0x51b96*4+0x02000000,0xc5a); +reg_write( DDR_REG_BASE + 0x51b97*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x51b98*4+0x02000000,0x4320); +reg_write( DDR_REG_BASE + 0x51b99*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51b9a*4+0x02000000,0x7100); +reg_write( DDR_REG_BASE + 0x51b9b*4+0x02000000,0x900e); +reg_write( DDR_REG_BASE + 0x51b9c*4+0x02000000,0x4c); +reg_write( DDR_REG_BASE + 0x51b9d*4+0x02000000,0xc046); +reg_write( DDR_REG_BASE + 0x51b9e*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x51b9f*4+0x02000000,0x900e); +reg_write( DDR_REG_BASE + 0x51ba0*4+0x02000000,0x4c); +reg_write( DDR_REG_BASE + 0x51ba1*4+0x02000000,0x9001); +reg_write( DDR_REG_BASE + 0x51ba2*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x51ba3*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x51ba4*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x51ba5*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x51ba6*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE + 0x51ba7*4+0x02000000,0xe1e0); +reg_write( DDR_REG_BASE + 0x51ba8*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x51ba9*4+0x02000000,0x8629); +reg_write( DDR_REG_BASE + 0x51baa*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x51bab*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x51bac*4+0x02000000,0xe007); +reg_write( DDR_REG_BASE + 0x51bad*4+0x02000000,0xc42); +reg_write( DDR_REG_BASE + 0x51bae*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x51baf*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x51bb0*4+0x02000000,0x8608); +reg_write( DDR_REG_BASE + 0x51bb1*4+0x02000000,0xd62); +reg_write( DDR_REG_BASE + 0x51bb2*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x51bb3*4+0x02000000,0xc104); +reg_write( DDR_REG_BASE + 0x51bb4*4+0x02000000,0xfa2); +reg_write( DDR_REG_BASE + 0x51bb5*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x51bb6*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE + 0x51bb7*4+0x02000000,0x706f); +reg_write( DDR_REG_BASE + 0x51bb8*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51bb9*4+0x02000000,0x1f00); +reg_write( DDR_REG_BASE + 0x51bba*4+0x02000000,0x16c4); +reg_write( DDR_REG_BASE + 0x51bbb*4+0x02000000,0x1f9b); +reg_write( DDR_REG_BASE + 0x51bbc*4+0x02000000,0x16dc); +reg_write( DDR_REG_BASE + 0x51bbd*4+0x02000000,0x1f9c); +reg_write( DDR_REG_BASE + 0x51bbe*4+0x02000000,0x16dc); +reg_write( DDR_REG_BASE + 0x51bbf*4+0x02000000,0x1fe6); +reg_write( DDR_REG_BASE + 0x51bc0*4+0x02000000,0x9f84); +reg_write( DDR_REG_BASE + 0x51bc1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51bc2*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE + 0x51bc3*4+0x02000000,0x1ff2); +reg_write( DDR_REG_BASE + 0x51bc4*4+0x02000000,0x9044); +reg_write( DDR_REG_BASE + 0x51bc5*4+0x02000000,0x1fe4); +reg_write( DDR_REG_BASE + 0x51bc6*4+0x02000000,0x9044); +reg_write( DDR_REG_BASE + 0x51bc7*4+0x02000000,0x960e); +reg_write( DDR_REG_BASE + 0x51bc8*4+0x02000000,0xd1a); +reg_write( DDR_REG_BASE + 0x51bc9*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x51bca*4+0x02000000,0x4528); +reg_write( DDR_REG_BASE + 0x51bcb*4+0x02000000,0xc106); +reg_write( DDR_REG_BASE + 0x51bcc*4+0x02000000,0xc200); +reg_write( DDR_REG_BASE + 0x51bcd*4+0x02000000,0xffa); +reg_write( DDR_REG_BASE + 0x51bce*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x51bcf*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE + 0x51bd0*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE + 0x51bd1*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x51bd2*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x51bd3*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x51bd4*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE + 0x51bd5*4+0x02000000,0xe1e0); +reg_write( DDR_REG_BASE + 0x51bd6*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x51bd7*4+0x02000000,0x812); +reg_write( DDR_REG_BASE + 0x51bd8*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51bd9*4+0x02000000,0x1f00); +reg_write( DDR_REG_BASE + 0x51bda*4+0x02000000,0x16c4); +reg_write( DDR_REG_BASE + 0x51bdb*4+0x02000000,0x8629); +reg_write( DDR_REG_BASE + 0x51bdc*4+0x02000000,0xbe2); +reg_write( DDR_REG_BASE + 0x51bdd*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x51bde*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x51bdf*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x51be0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51be1*4+0x02000000,0xff00); +reg_write( DDR_REG_BASE + 0x51be2*4+0x02000000,0x1fe6); +reg_write( DDR_REG_BASE + 0x51be3*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x51be4*4+0x02000000,0x1ff2); +reg_write( DDR_REG_BASE + 0x51be5*4+0x02000000,0x9344); +reg_write( DDR_REG_BASE + 0x51be6*4+0x02000000,0x1fe4); +reg_write( DDR_REG_BASE + 0x51be7*4+0x02000000,0x9344); +reg_write( DDR_REG_BASE + 0x51be8*4+0x02000000,0x8605); +reg_write( DDR_REG_BASE + 0x51be9*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51bea*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE + 0x51beb*4+0x02000000,0xcd6); +reg_write( DDR_REG_BASE + 0x51bec*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x51bed*4+0x02000000,0x7810); +reg_write( DDR_REG_BASE + 0x51bee*4+0x02000000,0xc106); +reg_write( DDR_REG_BASE + 0x51bef*4+0x02000000,0xc200); +reg_write( DDR_REG_BASE + 0x51bf0*4+0x02000000,0xfb2); +reg_write( DDR_REG_BASE + 0x51bf1*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x51bf2*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE + 0x51bf3*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE + 0x51bf4*4+0x02000000,0xe806); +reg_write( DDR_REG_BASE + 0x51bf5*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE + 0x51bf6*4+0x02000000,0xed6); +reg_write( DDR_REG_BASE + 0x51bf7*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x51bf8*4+0x02000000,0x2078); +reg_write( DDR_REG_BASE + 0x51bf9*4+0x02000000,0x100); +reg_write( DDR_REG_BASE + 0x51bfa*4+0x02000000,0x8e58); +reg_write( DDR_REG_BASE + 0x51bfb*4+0x02000000,0x8603); +reg_write( DDR_REG_BASE + 0x51bfc*4+0x02000000,0xf0a); +reg_write( DDR_REG_BASE + 0x51bfd*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x51bfe*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51bff*4+0x02000000,0xc0a8); +reg_write( DDR_REG_BASE + 0x51c00*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x51c01*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x51c02*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x51c03*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x51c04*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x51c05*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x51c06*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x51c07*4+0x02000000,0x2482); +reg_write( DDR_REG_BASE + 0x51c08*4+0x02000000,0x3403); +reg_write( DDR_REG_BASE + 0x51c09*4+0x02000000,0xffa); +reg_write( DDR_REG_BASE + 0x51c0a*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x51c0b*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51c0c*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51c0d*4+0x02000000,0x7083); +reg_write( DDR_REG_BASE + 0x51c0e*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51c0f*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x51c10*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE + 0x51c11*4+0x02000000,0xc087); +reg_write( DDR_REG_BASE + 0x51c12*4+0x02000000,0xd9ff); +reg_write( DDR_REG_BASE + 0x51c13*4+0x02000000,0x86e); +reg_write( DDR_REG_BASE + 0x51c14*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE + 0x51c15*4+0x02000000,0xdab4); +reg_write( DDR_REG_BASE + 0x51c16*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x51c17*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51c18*4+0x02000000,0x2100); +reg_write( DDR_REG_BASE + 0x51c19*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x51c1a*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x51c1b*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x51c1c*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x51c1d*4+0x02000000,0xe004); +reg_write( DDR_REG_BASE + 0x51c1e*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x51c1f*4+0x02000000,0x7084); +reg_write( DDR_REG_BASE + 0x51c20*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x51c21*4+0x02000000,0xfec4); +reg_write( DDR_REG_BASE + 0x51c22*4+0x02000000,0xca08); +reg_write( DDR_REG_BASE + 0x51c23*4+0x02000000,0xf014); +reg_write( DDR_REG_BASE + 0x51c24*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51c25*4+0x02000000,0x4528); +reg_write( DDR_REG_BASE + 0x51c26*4+0x02000000,0x2244); +reg_write( DDR_REG_BASE + 0x51c27*4+0x02000000,0x7c1); +reg_write( DDR_REG_BASE + 0x51c28*4+0x02000000,0x6a81); +reg_write( DDR_REG_BASE + 0x51c29*4+0x02000000,0x229a); +reg_write( DDR_REG_BASE + 0x51c2a*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x51c2b*4+0x02000000,0xe906); +reg_write( DDR_REG_BASE + 0x51c2c*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE + 0x51c2d*4+0x02000000,0x901); +reg_write( DDR_REG_BASE + 0x51c2e*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x51c2f*4+0x02000000,0x7dbb); +reg_write( DDR_REG_BASE + 0x51c30*4+0x02000000,0x2205); +reg_write( DDR_REG_BASE + 0x51c31*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x51c32*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x51c33*4+0x02000000,0xe0c4); +reg_write( DDR_REG_BASE + 0x51c34*4+0x02000000,0xb1a0); +reg_write( DDR_REG_BASE + 0x51c35*4+0x02000000,0x4281); +reg_write( DDR_REG_BASE + 0x51c36*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51c37*4+0x02000000,0xadd); +reg_write( DDR_REG_BASE + 0x51c38*4+0x02000000,0x8234); +reg_write( DDR_REG_BASE + 0x51c39*4+0x02000000,0xc140); +reg_write( DDR_REG_BASE + 0x51c3a*4+0x02000000,0x231a); +reg_write( DDR_REG_BASE + 0x51c3b*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x51c3c*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x51c3d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51c3e*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51c3f*4+0x02000000,0x709b); +reg_write( DDR_REG_BASE + 0x51c40*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51c41*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE + 0x51c42*4+0x02000000,0xc145); +reg_write( DDR_REG_BASE + 0x51c43*4+0x02000000,0xd907); +reg_write( DDR_REG_BASE + 0x51c44*4+0x02000000,0x7916); +reg_write( DDR_REG_BASE + 0x51c45*4+0x02000000,0xc143); +reg_write( DDR_REG_BASE + 0x51c46*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE + 0x51c47*4+0x02000000,0xe098); +reg_write( DDR_REG_BASE + 0x51c48*4+0x02000000,0x1b4); +reg_write( DDR_REG_BASE + 0x51c49*4+0x02000000,0xd); +reg_write( DDR_REG_BASE + 0x51c4a*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x51c4b*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51c4c*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE + 0x51c4d*4+0x02000000,0x8821); +reg_write( DDR_REG_BASE + 0x51c4e*4+0x02000000,0xf016); +reg_write( DDR_REG_BASE + 0x51c4f*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x51c50*4+0x02000000,0x2055); +reg_write( DDR_REG_BASE + 0x51c51*4+0x02000000,0x8c2); +reg_write( DDR_REG_BASE + 0x51c52*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x51c53*4+0x02000000,0x7a05); +reg_write( DDR_REG_BASE + 0x51c54*4+0x02000000,0xd8ef); +reg_write( DDR_REG_BASE + 0x51c55*4+0x02000000,0x2004); +reg_write( DDR_REG_BASE + 0x51c56*4+0x02000000,0x6c0); +reg_write( DDR_REG_BASE + 0x51c57*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x51c58*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x51c59*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51c5a*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x51c5b*4+0x02000000,0x7167); +reg_write( DDR_REG_BASE + 0x51c5c*4+0x02000000,0x7845); +reg_write( DDR_REG_BASE + 0x51c5d*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x51c5e*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x51c5f*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE + 0x51c60*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x51c61*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x51c62*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE + 0x51c63*4+0x02000000,0xb200); +reg_write( DDR_REG_BASE + 0x51c64*4+0x02000000,0x202f); +reg_write( DDR_REG_BASE + 0x51c65*4+0x02000000,0x6c7); +reg_write( DDR_REG_BASE + 0x51c66*4+0x02000000,0x9d3); +reg_write( DDR_REG_BASE + 0x51c67*4+0x02000000,0x8005); +reg_write( DDR_REG_BASE + 0x51c68*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x51c69*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51c6a*4+0x02000000,0x2100); +reg_write( DDR_REG_BASE + 0x51c6b*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x51c6c*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x51c6d*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x51c6e*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x51c6f*4+0x02000000,0xe004); +reg_write( DDR_REG_BASE + 0x51c70*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x51c71*4+0x02000000,0x7344); +reg_write( DDR_REG_BASE + 0x51c72*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x51c73*4+0x02000000,0xfe64); +reg_write( DDR_REG_BASE + 0x51c74*4+0x02000000,0xd32); +reg_write( DDR_REG_BASE + 0x51c75*4+0x02000000,0xff8f); +reg_write( DDR_REG_BASE + 0x51c76*4+0x02000000,0xd2e); +reg_write( DDR_REG_BASE + 0x51c77*4+0x02000000,0xff8f); +reg_write( DDR_REG_BASE + 0x51c78*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x51c79*4+0x02000000,0xece); +reg_write( DDR_REG_BASE + 0x51c7a*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x51c7b*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x51c7c*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE + 0x51c7d*4+0x02000000,0xaa2); +reg_write( DDR_REG_BASE + 0x51c7e*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x51c7f*4+0x02000000,0x218a); +reg_write( DDR_REG_BASE + 0x51c80*4+0x02000000,0xfc7); +reg_write( DDR_REG_BASE + 0x51c81*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE + 0x51c82*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE + 0x51c83*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x51c84*4+0x02000000,0xe024); +reg_write( DDR_REG_BASE + 0x51c85*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51c86*4+0x02000000,0xb600); +reg_write( DDR_REG_BASE + 0x51c87*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x51c88*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x51c89*4+0x02000000,0xb606); +reg_write( DDR_REG_BASE + 0x51c8a*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE + 0x51c8b*4+0x02000000,0x3c4); +reg_write( DDR_REG_BASE + 0x51c8c*4+0x02000000,0x1efe); +reg_write( DDR_REG_BASE + 0x51c8d*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x51c8e*4+0x02000000,0xb8e); +reg_write( DDR_REG_BASE + 0x51c8f*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x51c90*4+0x02000000,0xd818); +reg_write( DDR_REG_BASE + 0x51c91*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE + 0x51c92*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x51c93*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x51c94*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x51c95*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x51c96*4+0x02000000,0xe004); +reg_write( DDR_REG_BASE + 0x51c97*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x51c98*4+0x02000000,0xe8e); +reg_write( DDR_REG_BASE + 0x51c99*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x51c9a*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x51c9b*4+0x02000000,0xd807); +reg_write( DDR_REG_BASE + 0x51c9c*4+0x02000000,0xb72); +reg_write( DDR_REG_BASE + 0x51c9d*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x51c9e*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51c9f*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE + 0x51ca0*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x51ca1*4+0x02000000,0xb600); +reg_write( DDR_REG_BASE + 0x51ca2*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x51ca3*4+0x02000000,0xb606); +reg_write( DDR_REG_BASE + 0x51ca4*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x51ca5*4+0x02000000,0xe76); +reg_write( DDR_REG_BASE + 0x51ca6*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x51ca7*4+0x02000000,0x1efe); +reg_write( DDR_REG_BASE + 0x51ca8*4+0x02000000,0x93c5); +reg_write( DDR_REG_BASE + 0x51ca9*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE + 0x51caa*4+0x02000000,0xb56); +reg_write( DDR_REG_BASE + 0x51cab*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x51cac*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51cad*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x51cae*4+0x02000000,0xe62); +reg_write( DDR_REG_BASE + 0x51caf*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x51cb0*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x51cb1*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x51cb2*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51cb3*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x51cb4*4+0x02000000,0x1fc5); +reg_write( DDR_REG_BASE + 0x51cb5*4+0x02000000,0x1e0c); +reg_write( DDR_REG_BASE + 0x51cb6*4+0x02000000,0x1fc5); +reg_write( DDR_REG_BASE + 0x51cb7*4+0x02000000,0xb3e); +reg_write( DDR_REG_BASE + 0x51cb8*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x51cb9*4+0x02000000,0x1efe); +reg_write( DDR_REG_BASE + 0x51cba*4+0x02000000,0x9344); +reg_write( DDR_REG_BASE + 0x51cbb*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x51cbc*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51cbd*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE + 0x51cbe*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51cbf*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE + 0x51cc0*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51cc1*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE + 0x51cc2*4+0x02000000,0x8801); +reg_write( DDR_REG_BASE + 0x51cc3*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE + 0x51cc4*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x51cc5*4+0x02000000,0x64); +reg_write( DDR_REG_BASE + 0x51cc6*4+0x02000000,0x4338); +reg_write( DDR_REG_BASE + 0x51cc7*4+0x02000000,0xc046); +reg_write( DDR_REG_BASE + 0x51cc8*4+0x02000000,0xf04f); +reg_write( DDR_REG_BASE + 0x51cc9*4+0x02000000,0x221a); +reg_write( DDR_REG_BASE + 0x51cca*4+0x02000000,0xf9e); +reg_write( DDR_REG_BASE + 0x51ccb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51ccc*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x51ccd*4+0x02000000,0x708d); +reg_write( DDR_REG_BASE + 0x51cce*4+0x02000000,0x716d); +reg_write( DDR_REG_BASE + 0x51ccf*4+0x02000000,0xf046); +reg_write( DDR_REG_BASE + 0x51cd0*4+0x02000000,0x225f); +reg_write( DDR_REG_BASE + 0x51cd1*4+0x02000000,0x480); +reg_write( DDR_REG_BASE + 0x51cd2*4+0x02000000,0x74b5); +reg_write( DDR_REG_BASE + 0x51cd3*4+0x02000000,0x24c0); +reg_write( DDR_REG_BASE + 0x51cd4*4+0x02000000,0x1061); +reg_write( DDR_REG_BASE + 0x51cd5*4+0x02000000,0x23ca); +reg_write( DDR_REG_BASE + 0x51cd6*4+0x02000000,0x1061); +reg_write( DDR_REG_BASE + 0x51cd7*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x51cd8*4+0x02000000,0xc301); +reg_write( DDR_REG_BASE + 0x51cd9*4+0x02000000,0xc087); +reg_write( DDR_REG_BASE + 0x51cda*4+0x02000000,0x631b); +reg_write( DDR_REG_BASE + 0x51cdb*4+0x02000000,0x7bb4); +reg_write( DDR_REG_BASE + 0x51cdc*4+0x02000000,0x9300); +reg_write( DDR_REG_BASE + 0x51cdd*4+0x02000000,0xe0c0); +reg_write( DDR_REG_BASE + 0x51cde*4+0x02000000,0x6a); +reg_write( DDR_REG_BASE + 0x51cdf*4+0x02000000,0x25); +reg_write( DDR_REG_BASE + 0x51ce0*4+0x02000000,0x40a1); +reg_write( DDR_REG_BASE + 0x51ce1*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x51ce2*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x51ce3*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x51ce4*4+0x02000000,0x780); +reg_write( DDR_REG_BASE + 0x51ce5*4+0x02000000,0x7f1b); +reg_write( DDR_REG_BASE + 0x51ce6*4+0x02000000,0x7fc5); +reg_write( DDR_REG_BASE + 0x51ce7*4+0x02000000,0x9700); +reg_write( DDR_REG_BASE + 0x51ce8*4+0x02000000,0x7014); +reg_write( DDR_REG_BASE + 0x51ce9*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE + 0x51cea*4+0x02000000,0x23ca); +reg_write( DDR_REG_BASE + 0x51ceb*4+0x02000000,0x1021); +reg_write( DDR_REG_BASE + 0x51cec*4+0x02000000,0x20ca); +reg_write( DDR_REG_BASE + 0x51ced*4+0x02000000,0x21); +reg_write( DDR_REG_BASE + 0x51cee*4+0x02000000,0xb43); +reg_write( DDR_REG_BASE + 0x51cef*4+0x02000000,0x1030); +reg_write( DDR_REG_BASE + 0x51cf0*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x51cf1*4+0x02000000,0x78af); +reg_write( DDR_REG_BASE + 0x51cf2*4+0x02000000,0x80d); +reg_write( DDR_REG_BASE + 0x51cf3*4+0x02000000,0xd0); +reg_write( DDR_REG_BASE + 0x51cf4*4+0x02000000,0x83b); +reg_write( DDR_REG_BASE + 0x51cf5*4+0x02000000,0x210); +reg_write( DDR_REG_BASE + 0x51cf6*4+0x02000000,0x83b); +reg_write( DDR_REG_BASE + 0x51cf7*4+0x02000000,0x1d1); +reg_write( DDR_REG_BASE + 0x51cf8*4+0x02000000,0x788f); +reg_write( DDR_REG_BASE + 0x51cf9*4+0x02000000,0x2079); +reg_write( DDR_REG_BASE + 0x51cfa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51cfb*4+0x02000000,0x205f); +reg_write( DDR_REG_BASE + 0x51cfc*4+0x02000000,0x100); +reg_write( DDR_REG_BASE + 0x51cfd*4+0x02000000,0xf00f); +reg_write( DDR_REG_BASE + 0x51cfe*4+0x02000000,0xc301); +reg_write( DDR_REG_BASE + 0x51cff*4+0x02000000,0x677f); +reg_write( DDR_REG_BASE + 0x51d00*4+0x02000000,0x7f14); +reg_write( DDR_REG_BASE + 0x51d01*4+0x02000000,0x6861); +reg_write( DDR_REG_BASE + 0x51d02*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x51d03*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x51d04*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x51d05*4+0x02000000,0x780); +reg_write( DDR_REG_BASE + 0x51d06*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x51d07*4+0x02000000,0x78c5); +reg_write( DDR_REG_BASE + 0x51d08*4+0x02000000,0x9000); +reg_write( DDR_REG_BASE + 0x51d09*4+0x02000000,0xb700); +reg_write( DDR_REG_BASE + 0x51d0a*4+0x02000000,0x4060); +reg_write( DDR_REG_BASE + 0x51d0b*4+0x02000000,0xde9); +reg_write( DDR_REG_BASE + 0x51d0c*4+0x02000000,0x9025); +reg_write( DDR_REG_BASE + 0x51d0d*4+0x02000000,0xc787); +reg_write( DDR_REG_BASE + 0x51d0e*4+0x02000000,0xf005); +reg_write( DDR_REG_BASE + 0x51d0f*4+0x02000000,0x706d); +reg_write( DDR_REG_BASE + 0x51d10*4+0x02000000,0xf003); +reg_write( DDR_REG_BASE + 0x51d11*4+0x02000000,0x9700); +reg_write( DDR_REG_BASE + 0x51d12*4+0x02000000,0xb300); +reg_write( DDR_REG_BASE + 0x51d13*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE + 0x51d14*4+0x02000000,0xd79); +reg_write( DDR_REG_BASE + 0x51d15*4+0x02000000,0x9214); +reg_write( DDR_REG_BASE + 0x51d16*4+0x02000000,0x7124); +reg_write( DDR_REG_BASE + 0x51d17*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE + 0x51d18*4+0x02000000,0x7a2f); +reg_write( DDR_REG_BASE + 0x51d19*4+0x02000000,0x863); +reg_write( DDR_REG_BASE + 0x51d1a*4+0x02000000,0x80a5); +reg_write( DDR_REG_BASE + 0x51d1b*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x51d1c*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE + 0x51d1d*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE + 0x51d1e*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x51d1f*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE + 0x51d20*4+0x02000000,0x7014); +reg_write( DDR_REG_BASE + 0x51d21*4+0x02000000,0xf326); +reg_write( DDR_REG_BASE + 0x51d22*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51d23*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x51d24*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51d25*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51d26*4+0x02000000,0xb8c3); +reg_write( DDR_REG_BASE + 0x51d27*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x51d28*4+0x02000000,0xf02c); +reg_write( DDR_REG_BASE + 0x51d29*4+0x02000000,0x275f); +reg_write( DDR_REG_BASE + 0x51d2a*4+0x02000000,0x1480); +reg_write( DDR_REG_BASE + 0x51d2b*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x51d2c*4+0x02000000,0x47); +reg_write( DDR_REG_BASE + 0x51d2d*4+0x02000000,0x2); +reg_write( DDR_REG_BASE + 0x51d2e*4+0x02000000,0x42e1); +reg_write( DDR_REG_BASE + 0x51d2f*4+0x02000000,0x661e); +reg_write( DDR_REG_BASE + 0x51d30*4+0x02000000,0x26f4); +reg_write( DDR_REG_BASE + 0x51d31*4+0x02000000,0x1340); +reg_write( DDR_REG_BASE + 0x51d32*4+0x02000000,0x43a1); +reg_write( DDR_REG_BASE + 0x51d33*4+0x02000000,0xe8a); +reg_write( DDR_REG_BASE + 0x51d34*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE + 0x51d35*4+0x02000000,0x20bc); +reg_write( DDR_REG_BASE + 0x51d36*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x51d37*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x51d38*4+0x02000000,0x271a); +reg_write( DDR_REG_BASE + 0x51d39*4+0x02000000,0x1f81); +reg_write( DDR_REG_BASE + 0x51d3a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51d3b*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x51d3c*4+0x02000000,0x26f4); +reg_write( DDR_REG_BASE + 0x51d3d*4+0x02000000,0x1342); +reg_write( DDR_REG_BASE + 0x51d3e*4+0x02000000,0x2054); +reg_write( DDR_REG_BASE + 0x51d3f*4+0x02000000,0xd00); +reg_write( DDR_REG_BASE + 0x51d40*4+0x02000000,0x7905); +reg_write( DDR_REG_BASE + 0x51d41*4+0x02000000,0x40a1); +reg_write( DDR_REG_BASE + 0x51d42*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x51d43*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x51d44*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE + 0x51d45*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x51d46*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x51d47*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x51d48*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x51d49*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x51d4a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51d4b*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x51d4c*4+0x02000000,0x6058); +reg_write( DDR_REG_BASE + 0x51d4d*4+0x02000000,0x2049); +reg_write( DDR_REG_BASE + 0x51d4e*4+0x02000000,0xfc0); +reg_write( DDR_REG_BASE + 0x51d4f*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE + 0x51d50*4+0x02000000,0xdb3); +reg_write( DDR_REG_BASE + 0x51d51*4+0x02000000,0x9234); +reg_write( DDR_REG_BASE + 0x51d52*4+0x02000000,0xc687); +reg_write( DDR_REG_BASE + 0x51d53*4+0x02000000,0x7167); +reg_write( DDR_REG_BASE + 0x51d54*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x51d55*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51d56*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE + 0x51d57*4+0x02000000,0x8801); +reg_write( DDR_REG_BASE + 0x51d58*4+0x02000000,0x272f); +reg_write( DDR_REG_BASE + 0x51d59*4+0x02000000,0x16c7); +reg_write( DDR_REG_BASE + 0x51d5a*4+0x02000000,0x8ed); +reg_write( DDR_REG_BASE + 0x51d5b*4+0x02000000,0x83e5); +reg_write( DDR_REG_BASE + 0x51d5c*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x51d5d*4+0x02000000,0x2480); +reg_write( DDR_REG_BASE + 0x51d5e*4+0x02000000,0x3403); +reg_write( DDR_REG_BASE + 0x51d5f*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x51d60*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x51d61*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x51d62*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x51d63*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x51d64*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x51d65*4+0x02000000,0x2482); +reg_write( DDR_REG_BASE + 0x51d66*4+0x02000000,0x390a); +reg_write( DDR_REG_BASE + 0x51d67*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x51d68*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51d69*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x51d6a*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51d6b*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x51d6c*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x51d6d*4+0x02000000,0x4a); +reg_write( DDR_REG_BASE + 0x51d6e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51d6f*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x51d70*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x51d71*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x51d72*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51d73*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x51d74*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x51d75*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x51d76*4+0x02000000,0x86); +reg_write( DDR_REG_BASE + 0x51d77*4+0x02000000,0x9000); +reg_write( DDR_REG_BASE + 0x51d78*4+0x02000000,0x2084); +reg_write( DDR_REG_BASE + 0x51d79*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x51d7a*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x51d7b*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x51d7c*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x51d7d*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x51d7e*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x51d7f*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x51d80*4+0x02000000,0xdee); +reg_write( DDR_REG_BASE + 0x51d81*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE + 0x51d82*4+0x02000000,0x2052); +reg_write( DDR_REG_BASE + 0x51d83*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51d84*4+0x02000000,0xb7a); +reg_write( DDR_REG_BASE + 0x51d85*4+0x02000000,0xff0f); +reg_write( DDR_REG_BASE + 0x51d86*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x51d87*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x51d88*4+0x02000000,0x7005); +reg_write( DDR_REG_BASE + 0x51d89*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x51d8a*4+0x02000000,0xe004); +reg_write( DDR_REG_BASE + 0x51d8b*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x51d8c*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x51d8d*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x51d8e*4+0x02000000,0xff68); +reg_write( DDR_REG_BASE + 0x51d8f*4+0x02000000,0xca0a); +reg_write( DDR_REG_BASE + 0x51d90*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE + 0x51d91*4+0x02000000,0x208c); +reg_write( DDR_REG_BASE + 0x51d92*4+0x02000000,0x8fc3); +reg_write( DDR_REG_BASE + 0x51d93*4+0x02000000,0xf40f); +reg_write( DDR_REG_BASE + 0x51d94*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51d95*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x51d96*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51d97*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51d98*4+0x02000000,0xb8e5); +reg_write( DDR_REG_BASE + 0x51d99*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x51d9a*4+0x02000000,0xf207); +reg_write( DDR_REG_BASE + 0x51d9b*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51d9c*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x51d9d*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51d9e*4+0x02000000,0x7b1); +reg_write( DDR_REG_BASE + 0x51d9f*4+0x02000000,0x1a0a); +reg_write( DDR_REG_BASE + 0x51da0*4+0x02000000,0x3002); +reg_write( DDR_REG_BASE + 0x51da1*4+0x02000000,0xc102); +reg_write( DDR_REG_BASE + 0x51da2*4+0x02000000,0x2144); +reg_write( DDR_REG_BASE + 0x51da3*4+0x02000000,0x7c3); +reg_write( DDR_REG_BASE + 0x51da4*4+0x02000000,0x4140); +reg_write( DDR_REG_BASE + 0x51da5*4+0x02000000,0xeb06); +reg_write( DDR_REG_BASE + 0x51da6*4+0x02000000,0xbb61); +reg_write( DDR_REG_BASE + 0x51da7*4+0x02000000,0xb01); +reg_write( DDR_REG_BASE + 0x51da8*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x51da9*4+0x02000000,0x793b); +reg_write( DDR_REG_BASE + 0x51daa*4+0x02000000,0xc145); +reg_write( DDR_REG_BASE + 0x51dab*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51dac*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE + 0x51dad*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51dae*4+0x02000000,0x7b1); +reg_write( DDR_REG_BASE + 0x51daf*4+0x02000000,0x33b); +reg_write( DDR_REG_BASE + 0x51db0*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x51db1*4+0x02000000,0x2139); +reg_write( DDR_REG_BASE + 0x51db2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51db3*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x51db4*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x51db5*4+0x02000000,0xc7a); +reg_write( DDR_REG_BASE + 0x51db6*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE + 0x51db7*4+0x02000000,0xc046); +reg_write( DDR_REG_BASE + 0x51db8*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE + 0x51db9*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x51dba*4+0x02000000,0xed06); +reg_write( DDR_REG_BASE + 0x51dbb*4+0x02000000,0xc96); +reg_write( DDR_REG_BASE + 0x51dbc*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x51dbd*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x51dbe*4+0x02000000,0x311); +reg_write( DDR_REG_BASE + 0x51dbf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51dc0*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51dc1*4+0x02000000,0xc8a); +reg_write( DDR_REG_BASE + 0x51dc2*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x51dc3*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x51dc4*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51dc5*4+0x02000000,0x709b); +reg_write( DDR_REG_BASE + 0x51dc6*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51dc7*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x51dc8*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE + 0x51dc9*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x51dca*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE + 0x51dcb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51dcc*4+0x02000000,0x248); +reg_write( DDR_REG_BASE + 0x51dcd*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x51dce*4+0x02000000,0xcf6); +reg_write( DDR_REG_BASE + 0x51dcf*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x51dd0*4+0x02000000,0xda5a); +reg_write( DDR_REG_BASE + 0x51dd1*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x51dd2*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE + 0x51dd3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51dd4*4+0x02000000,0x194); +reg_write( DDR_REG_BASE + 0x51dd5*4+0x02000000,0xcea); +reg_write( DDR_REG_BASE + 0x51dd6*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x51dd7*4+0x02000000,0xdab4); +reg_write( DDR_REG_BASE + 0x51dd8*4+0x02000000,0xdee); +reg_write( DDR_REG_BASE + 0x51dd9*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x51dda*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE + 0x51ddb*4+0x02000000,0xb04); +reg_write( DDR_REG_BASE + 0x51ddc*4+0x02000000,0xd86); +reg_write( DDR_REG_BASE + 0x51ddd*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x51dde*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE + 0x51ddf*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x51de0*4+0x02000000,0x7344); +reg_write( DDR_REG_BASE + 0x51de1*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x51de2*4+0x02000000,0xfec4); +reg_write( DDR_REG_BASE + 0x51de3*4+0x02000000,0xca08); +reg_write( DDR_REG_BASE + 0x51de4*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x51de5*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE + 0x51de6*4+0x02000000,0x4200); +reg_write( DDR_REG_BASE + 0x51de7*4+0x02000000,0x2544); +reg_write( DDR_REG_BASE + 0x51de8*4+0x02000000,0x17c0); +reg_write( DDR_REG_BASE + 0x51de9*4+0x02000000,0x6d21); +reg_write( DDR_REG_BASE + 0x51dea*4+0x02000000,0x259a); +reg_write( DDR_REG_BASE + 0x51deb*4+0x02000000,0x1008); +reg_write( DDR_REG_BASE + 0x51dec*4+0x02000000,0xe805); +reg_write( DDR_REG_BASE + 0x51ded*4+0x02000000,0xb861); +reg_write( DDR_REG_BASE + 0x51dee*4+0x02000000,0x8ff); +reg_write( DDR_REG_BASE + 0x51def*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE + 0x51df0*4+0x02000000,0x7a5b); +reg_write( DDR_REG_BASE + 0x51df1*4+0x02000000,0x2505); +reg_write( DDR_REG_BASE + 0x51df2*4+0x02000000,0x1f80); +reg_write( DDR_REG_BASE + 0x51df3*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x51df4*4+0x02000000,0xe0c4); +reg_write( DDR_REG_BASE + 0x51df5*4+0x02000000,0xb040); +reg_write( DDR_REG_BASE + 0x51df6*4+0x02000000,0x4528); +reg_write( DDR_REG_BASE + 0x51df7*4+0x02000000,0xde1); +reg_write( DDR_REG_BASE + 0x51df8*4+0x02000000,0x9234); +reg_write( DDR_REG_BASE + 0x51df9*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x51dfa*4+0x02000000,0xd880); +reg_write( DDR_REG_BASE + 0x51dfb*4+0x02000000,0xb88e); +reg_write( DDR_REG_BASE + 0x51dfc*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x51dfd*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x51dfe*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x51dff*4+0x02000000,0xe004); +reg_write( DDR_REG_BASE + 0x51e00*4+0x02000000,0x231a); +reg_write( DDR_REG_BASE + 0x51e01*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE + 0x51e02*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x51e03*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51e04*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE + 0x51e05*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE + 0x51e06*4+0x02000000,0xe1c6); +reg_write( DDR_REG_BASE + 0x51e07*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x51e08*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x51e09*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x51e0a*4+0x02000000,0xfe86); +reg_write( DDR_REG_BASE + 0x51e0b*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x51e0c*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x51e0d*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x51e0e*4+0x02000000,0x86); +reg_write( DDR_REG_BASE + 0x51e0f*4+0x02000000,0x9000); +reg_write( DDR_REG_BASE + 0x51e10*4+0x02000000,0xb8a0); +reg_write( DDR_REG_BASE + 0x51e11*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE + 0x51e12*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51e13*4+0x02000000,0x710d); +reg_write( DDR_REG_BASE + 0x51e14*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x51e15*4+0x02000000,0x1c6); +reg_write( DDR_REG_BASE + 0x51e16*4+0x02000000,0xd80a); +reg_write( DDR_REG_BASE + 0x51e17*4+0x02000000,0xbdc9); +reg_write( DDR_REG_BASE + 0x51e18*4+0x02000000,0x254f); +reg_write( DDR_REG_BASE + 0x51e19*4+0x02000000,0x12cf); +reg_write( DDR_REG_BASE + 0x51e1a*4+0x02000000,0xa2e); +reg_write( DDR_REG_BASE + 0x51e1b*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x51e1c*4+0x02000000,0xb6e0); +reg_write( DDR_REG_BASE + 0x51e1d*4+0x02000000,0x2505); +reg_write( DDR_REG_BASE + 0x51e1e*4+0x02000000,0x1f80); +reg_write( DDR_REG_BASE + 0x51e1f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51e20*4+0x02000000,0xc00); +reg_write( DDR_REG_BASE + 0x51e21*4+0x02000000,0xb600); +reg_write( DDR_REG_BASE + 0x51e22*4+0x02000000,0xa1e); +reg_write( DDR_REG_BASE + 0x51e23*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x51e24*4+0x02000000,0xd80a); +reg_write( DDR_REG_BASE + 0x51e25*4+0x02000000,0xd80a); +reg_write( DDR_REG_BASE + 0x51e26*4+0x02000000,0xa16); +reg_write( DDR_REG_BASE + 0x51e27*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x51e28*4+0x02000000,0xb6e0); +reg_write( DDR_REG_BASE + 0x51e29*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51e2a*4+0x02000000,0x7101); +reg_write( DDR_REG_BASE + 0x51e2b*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x51e2c*4+0x02000000,0x1c8); +reg_write( DDR_REG_BASE + 0x51e2d*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE + 0x51e2e*4+0x02000000,0xf0f); +reg_write( DDR_REG_BASE + 0x51e2f*4+0x02000000,0xda3f); +reg_write( DDR_REG_BASE + 0x51e30*4+0x02000000,0x7824); +reg_write( DDR_REG_BASE + 0x51e31*4+0x02000000,0x208c); +reg_write( DDR_REG_BASE + 0x51e32*4+0x02000000,0x8f03); +reg_write( DDR_REG_BASE + 0x51e33*4+0x02000000,0xb6a0); +reg_write( DDR_REG_BASE + 0x51e34*4+0x02000000,0xf745); +reg_write( DDR_REG_BASE + 0x51e35*4+0x02000000,0x2184); +reg_write( DDR_REG_BASE + 0x51e36*4+0x02000000,0xf03); +reg_write( DDR_REG_BASE + 0x51e37*4+0x02000000,0x7a3d); +reg_write( DDR_REG_BASE + 0x51e38*4+0x02000000,0x7a5d); +reg_write( DDR_REG_BASE + 0x51e39*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE + 0x51e3a*4+0x02000000,0xdb07); +reg_write( DDR_REG_BASE + 0x51e3b*4+0x02000000,0x231a); +reg_write( DDR_REG_BASE + 0x51e3c*4+0x02000000,0x3f9b); +reg_write( DDR_REG_BASE + 0x51e3d*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x51e3e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51e3f*4+0x02000000,0x7b16); +reg_write( DDR_REG_BASE + 0x51e40*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x51e41*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51e42*4+0x02000000,0x7b1); +reg_write( DDR_REG_BASE + 0x51e43*4+0x02000000,0x8824); +reg_write( DDR_REG_BASE + 0x51e44*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x51e45*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51e46*4+0x02000000,0x7b1); +reg_write( DDR_REG_BASE + 0x51e47*4+0x02000000,0x88c3); +reg_write( DDR_REG_BASE + 0x51e48*4+0x02000000,0x1c1c); +reg_write( DDR_REG_BASE + 0x51e49*4+0x02000000,0x36c0); +reg_write( DDR_REG_BASE + 0x51e4a*4+0x02000000,0x44c9); +reg_write( DDR_REG_BASE + 0x51e4b*4+0x02000000,0xf012); +reg_write( DDR_REG_BASE + 0x51e4c*4+0x02000000,0x7884); +reg_write( DDR_REG_BASE + 0x51e4d*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x51e4e*4+0x02000000,0xf8d); +reg_write( DDR_REG_BASE + 0x51e4f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51e50*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x51e51*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x51e52*4+0x02000000,0x7185); +reg_write( DDR_REG_BASE + 0x51e53*4+0x02000000,0x2054); +reg_write( DDR_REG_BASE + 0x51e54*4+0x02000000,0xd00); +reg_write( DDR_REG_BASE + 0x51e55*4+0x02000000,0x78a5); +reg_write( DDR_REG_BASE + 0x51e56*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x51e57*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x51e58*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x51e59*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x51e5a*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x51e5b*4+0x02000000,0xb040); +reg_write( DDR_REG_BASE + 0x51e5c*4+0x02000000,0x788f); +reg_write( DDR_REG_BASE + 0x51e5d*4+0x02000000,0x9e1); +reg_write( DDR_REG_BASE + 0x51e5e*4+0x02000000,0x8025); +reg_write( DDR_REG_BASE + 0x51e5f*4+0x02000000,0xd8ef); +reg_write( DDR_REG_BASE + 0x51e60*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x51e61*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x51e62*4+0x02000000,0xe024); +reg_write( DDR_REG_BASE + 0x51e63*4+0x02000000,0x228a); +reg_write( DDR_REG_BASE + 0x51e64*4+0x02000000,0x3c4); +reg_write( DDR_REG_BASE + 0x51e65*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x51e66*4+0x02000000,0xb060); +reg_write( DDR_REG_BASE + 0x51e67*4+0x02000000,0x180c); +reg_write( DDR_REG_BASE + 0x51e68*4+0x02000000,0x45); +reg_write( DDR_REG_BASE + 0x51e69*4+0x02000000,0x18fe); +reg_write( DDR_REG_BASE + 0x51e6a*4+0x02000000,0x8084); +reg_write( DDR_REG_BASE + 0x51e6b*4+0x02000000,0xf0a0); +reg_write( DDR_REG_BASE + 0x51e6c*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x51e6d*4+0x02000000,0x2055); +reg_write( DDR_REG_BASE + 0x51e6e*4+0x02000000,0x8c2); +reg_write( DDR_REG_BASE + 0x51e6f*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE + 0x51e70*4+0x02000000,0x7a05); +reg_write( DDR_REG_BASE + 0x51e71*4+0x02000000,0xd8ef); +reg_write( DDR_REG_BASE + 0x51e72*4+0x02000000,0x78c4); +reg_write( DDR_REG_BASE + 0x51e73*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x51e74*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x51e75*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51e76*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x51e77*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE + 0x51e78*4+0x02000000,0x7845); +reg_write( DDR_REG_BASE + 0x51e79*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x51e7a*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x51e7b*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x51e7c*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x51e7d*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x51e7e*4+0x02000000,0xb0a0); +reg_write( DDR_REG_BASE + 0x51e7f*4+0x02000000,0x78cf); +reg_write( DDR_REG_BASE + 0x51e80*4+0x02000000,0x9d9); +reg_write( DDR_REG_BASE + 0x51e81*4+0x02000000,0x8005); +reg_write( DDR_REG_BASE + 0x51e82*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x51e83*4+0x02000000,0xaba); +reg_write( DDR_REG_BASE + 0x51e84*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x51e85*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x51e86*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE + 0x51e87*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x51e88*4+0x02000000,0xfe64); +reg_write( DDR_REG_BASE + 0x51e89*4+0x02000000,0x90a); +reg_write( DDR_REG_BASE + 0x51e8a*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE + 0x51e8b*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x51e8c*4+0x02000000,0x1005); +reg_write( DDR_REG_BASE + 0x51e8d*4+0x02000000,0x902); +reg_write( DDR_REG_BASE + 0x51e8e*4+0x02000000,0xff8f); +reg_write( DDR_REG_BASE + 0x51e8f*4+0x02000000,0x946); +reg_write( DDR_REG_BASE + 0x51e90*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x51e91*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE + 0x51e92*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x51e93*4+0x02000000,0xe76); +reg_write( DDR_REG_BASE + 0x51e94*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x51e95*4+0x02000000,0x218a); +reg_write( DDR_REG_BASE + 0x51e96*4+0x02000000,0xfc7); +reg_write( DDR_REG_BASE + 0x51e97*4+0x02000000,0xd820); +reg_write( DDR_REG_BASE + 0x51e98*4+0x02000000,0xf7a); +reg_write( DDR_REG_BASE + 0x51e99*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE + 0x51e9a*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51e9b*4+0x02000000,0xc08b); +reg_write( DDR_REG_BASE + 0x51e9c*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x51e9d*4+0x02000000,0x9ca); +reg_write( DDR_REG_BASE + 0x51e9e*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x51e9f*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE + 0x51ea0*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x51ea1*4+0x02000000,0xa7e); +reg_write( DDR_REG_BASE + 0x51ea2*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x51ea3*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x51ea4*4+0x02000000,0xd87f); +reg_write( DDR_REG_BASE + 0x51ea5*4+0x02000000,0x8d2); +reg_write( DDR_REG_BASE + 0x51ea6*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE + 0x51ea7*4+0x02000000,0xb600); +reg_write( DDR_REG_BASE + 0x51ea8*4+0x02000000,0x8ca); +reg_write( DDR_REG_BASE + 0x51ea9*4+0x02000000,0xff8f); +reg_write( DDR_REG_BASE + 0x51eaa*4+0x02000000,0x90e); +reg_write( DDR_REG_BASE + 0x51eab*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x51eac*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE + 0x51ead*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE + 0x51eae*4+0x02000000,0xe3e); +reg_write( DDR_REG_BASE + 0x51eaf*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x51eb0*4+0x02000000,0x218a); +reg_write( DDR_REG_BASE + 0x51eb1*4+0x02000000,0xfc7); +reg_write( DDR_REG_BASE + 0x51eb2*4+0x02000000,0xd820); +reg_write( DDR_REG_BASE + 0x51eb3*4+0x02000000,0xf46); +reg_write( DDR_REG_BASE + 0x51eb4*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE + 0x51eb5*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51eb6*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE + 0x51eb7*4+0x02000000,0x3e00); +reg_write( DDR_REG_BASE + 0x51eb8*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x51eb9*4+0x02000000,0x992); +reg_write( DDR_REG_BASE + 0x51eba*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x51ebb*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE + 0x51ebc*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x51ebd*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51ebe*4+0x02000000,0x7b1); +reg_write( DDR_REG_BASE + 0x51ebf*4+0x02000000,0x8863); +reg_write( DDR_REG_BASE + 0x51ec0*4+0x02000000,0x235f); +reg_write( DDR_REG_BASE + 0x51ec1*4+0x02000000,0x240); +reg_write( DDR_REG_BASE + 0x51ec2*4+0x02000000,0xf03a); +reg_write( DDR_REG_BASE + 0x51ec3*4+0x02000000,0xc088); +reg_write( DDR_REG_BASE + 0x51ec4*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x51ec5*4+0x02000000,0xb0a); +reg_write( DDR_REG_BASE + 0x51ec6*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x51ec7*4+0x02000000,0xda09); +reg_write( DDR_REG_BASE + 0x51ec8*4+0x02000000,0xc700); +reg_write( DDR_REG_BASE + 0x51ec9*4+0x02000000,0x70cd); +reg_write( DDR_REG_BASE + 0x51eca*4+0x02000000,0xf02d); +reg_write( DDR_REG_BASE + 0x51ecb*4+0x02000000,0x78fb); +reg_write( DDR_REG_BASE + 0x51ecc*4+0x02000000,0x2084); +reg_write( DDR_REG_BASE + 0x51ecd*4+0x02000000,0xf87); +reg_write( DDR_REG_BASE + 0x51ece*4+0x02000000,0xc18b); +reg_write( DDR_REG_BASE + 0x51ecf*4+0x02000000,0x2135); +reg_write( DDR_REG_BASE + 0x51ed0*4+0x02000000,0x1e); +reg_write( DDR_REG_BASE + 0x51ed1*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE + 0x51ed2*4+0x02000000,0x3e01); +reg_write( DDR_REG_BASE + 0x51ed3*4+0x02000000,0x2135); +reg_write( DDR_REG_BASE + 0x51ed4*4+0x02000000,0xb); +reg_write( DDR_REG_BASE + 0x51ed5*4+0x02000000,0x235f); +reg_write( DDR_REG_BASE + 0x51ed6*4+0x02000000,0x3241); +reg_write( DDR_REG_BASE + 0x51ed7*4+0x02000000,0x2302); +reg_write( DDR_REG_BASE + 0x51ed8*4+0x02000000,0x1780); +reg_write( DDR_REG_BASE + 0x51ed9*4+0x02000000,0x2048); +reg_write( DDR_REG_BASE + 0x51eda*4+0x02000000,0x2); +reg_write( DDR_REG_BASE + 0x51edb*4+0x02000000,0xc088); +reg_write( DDR_REG_BASE + 0x51edc*4+0x02000000,0x60d8); +reg_write( DDR_REG_BASE + 0x51edd*4+0x02000000,0xa840); +reg_write( DDR_REG_BASE + 0x51ede*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x51edf*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE + 0x51ee0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51ee1*4+0x02000000,0x248); +reg_write( DDR_REG_BASE + 0x51ee2*4+0x02000000,0x6038); +reg_write( DDR_REG_BASE + 0x51ee3*4+0x02000000,0x60d8); +reg_write( DDR_REG_BASE + 0x51ee4*4+0x02000000,0x8820); +reg_write( DDR_REG_BASE + 0x51ee5*4+0x02000000,0x7c4f); +reg_write( DDR_REG_BASE + 0x51ee6*4+0x02000000,0x91f); +reg_write( DDR_REG_BASE + 0x51ee7*4+0x02000000,0x305); +reg_write( DDR_REG_BASE + 0x51ee8*4+0x02000000,0x235f); +reg_write( DDR_REG_BASE + 0x51ee9*4+0x02000000,0x3481); +reg_write( DDR_REG_BASE + 0x51eea*4+0x02000000,0xa840); +reg_write( DDR_REG_BASE + 0x51eeb*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x51eec*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE + 0x51eed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51eee*4+0x02000000,0x194); +reg_write( DDR_REG_BASE + 0x51eef*4+0x02000000,0x6038); +reg_write( DDR_REG_BASE + 0x51ef0*4+0x02000000,0x2600); +reg_write( DDR_REG_BASE + 0x51ef1*4+0x02000000,0x32c1); +reg_write( DDR_REG_BASE + 0x51ef2*4+0x02000000,0x78d4); +reg_write( DDR_REG_BASE + 0x51ef3*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE + 0x51ef4*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE + 0x51ef5*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE + 0x51ef6*4+0x02000000,0x71e5); +reg_write( DDR_REG_BASE + 0x51ef7*4+0x02000000,0xeab); +reg_write( DDR_REG_BASE + 0x51ef8*4+0x02000000,0x9214); +reg_write( DDR_REG_BASE + 0x51ef9*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE + 0x51efa*4+0x02000000,0x7164); +reg_write( DDR_REG_BASE + 0x51efb*4+0x02000000,0xe009); +reg_write( DDR_REG_BASE + 0x51efc*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x51efd*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x51efe*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51eff*4+0x02000000,0x7b1); +reg_write( DDR_REG_BASE + 0x51f00*4+0x02000000,0x8824); +reg_write( DDR_REG_BASE + 0x51f01*4+0x02000000,0x786f); +reg_write( DDR_REG_BASE + 0x51f02*4+0x02000000,0x983); +reg_write( DDR_REG_BASE + 0x51f03*4+0x02000000,0x8025); +reg_write( DDR_REG_BASE + 0x51f04*4+0x02000000,0x4318); +reg_write( DDR_REG_BASE + 0x51f05*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x51f06*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51f07*4+0x02000000,0x7b1); +reg_write( DDR_REG_BASE + 0x51f08*4+0x02000000,0x88c3); +reg_write( DDR_REG_BASE + 0x51f09*4+0x02000000,0x74a5); +reg_write( DDR_REG_BASE + 0x51f0a*4+0x02000000,0xe59e); +reg_write( DDR_REG_BASE + 0x51f0b*4+0x02000000,0x6ea); +reg_write( DDR_REG_BASE + 0x51f0c*4+0x02000000,0xffce); +reg_write( DDR_REG_BASE + 0x51f0d*4+0x02000000,0xf036); +reg_write( DDR_REG_BASE + 0x51f0e*4+0x02000000,0x255f); +reg_write( DDR_REG_BASE + 0x51f0f*4+0x02000000,0x1241); +reg_write( DDR_REG_BASE + 0x51f10*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x51f11*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE + 0x51f12*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51f13*4+0x02000000,0x248); +reg_write( DDR_REG_BASE + 0x51f14*4+0x02000000,0x43e1); +reg_write( DDR_REG_BASE + 0x51f15*4+0x02000000,0x6038); +reg_write( DDR_REG_BASE + 0x51f16*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x51f17*4+0x02000000,0x3e); +reg_write( DDR_REG_BASE + 0x51f18*4+0x02000000,0x2); +reg_write( DDR_REG_BASE + 0x51f19*4+0x02000000,0xabe); +reg_write( DDR_REG_BASE + 0x51f1a*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE + 0x51f1b*4+0x02000000,0x60e8); +reg_write( DDR_REG_BASE + 0x51f1c*4+0x02000000,0x40e1); +reg_write( DDR_REG_BASE + 0x51f1d*4+0x02000000,0x251a); +reg_write( DDR_REG_BASE + 0x51f1e*4+0x02000000,0x1f82); +reg_write( DDR_REG_BASE + 0x51f1f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51f20*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE + 0x51f21*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x51f22*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x51f23*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x51f24*4+0x02000000,0x3f83); +reg_write( DDR_REG_BASE + 0x51f25*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51f26*4+0x02000000,0x194); +reg_write( DDR_REG_BASE + 0x51f27*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x51f28*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x51f29*4+0x02000000,0x80); +reg_write( DDR_REG_BASE + 0x51f2a*4+0x02000000,0x7a05); +reg_write( DDR_REG_BASE + 0x51f2b*4+0x02000000,0x255f); +reg_write( DDR_REG_BASE + 0x51f2c*4+0x02000000,0x1480); +reg_write( DDR_REG_BASE + 0x51f2d*4+0x02000000,0x2205); +reg_write( DDR_REG_BASE + 0x51f2e*4+0x02000000,0x4c); +reg_write( DDR_REG_BASE + 0x51f2f*4+0x02000000,0x2142); +reg_write( DDR_REG_BASE + 0x51f30*4+0x02000000,0x801); +reg_write( DDR_REG_BASE + 0x51f31*4+0x02000000,0x7945); +reg_write( DDR_REG_BASE + 0x51f32*4+0x02000000,0x631b); +reg_write( DDR_REG_BASE + 0x51f33*4+0x02000000,0x23f4); +reg_write( DDR_REG_BASE + 0x51f34*4+0x02000000,0x3c0); +reg_write( DDR_REG_BASE + 0x51f35*4+0x02000000,0xb400); +reg_write( DDR_REG_BASE + 0x51f36*4+0x02000000,0x23f4); +reg_write( DDR_REG_BASE + 0x51f37*4+0x02000000,0x3c0); +reg_write( DDR_REG_BASE + 0x51f38*4+0x02000000,0x71e5); +reg_write( DDR_REG_BASE + 0x51f39*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE + 0x51f3a*4+0x02000000,0xfa9); +reg_write( DDR_REG_BASE + 0x51f3b*4+0x02000000,0x9234); +reg_write( DDR_REG_BASE + 0x51f3c*4+0x02000000,0x42a1); +reg_write( DDR_REG_BASE + 0x51f3d*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x51f3e*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51f3f*4+0x02000000,0x7b1); +reg_write( DDR_REG_BASE + 0x51f40*4+0x02000000,0x8824); +reg_write( DDR_REG_BASE + 0x51f41*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE + 0x51f42*4+0x02000000,0x7dcf); +reg_write( DDR_REG_BASE + 0x51f43*4+0x02000000,0x9f1); +reg_write( DDR_REG_BASE + 0x51f44*4+0x02000000,0x8365); +reg_write( DDR_REG_BASE + 0x51f45*4+0x02000000,0x70ed); +reg_write( DDR_REG_BASE + 0x51f46*4+0x02000000,0xf3e); +reg_write( DDR_REG_BASE + 0x51f47*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x51f48*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE + 0x51f49*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x51f4a*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE + 0x51f4b*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x51f4c*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x51f4d*4+0x02000000,0x7d0f); +reg_write( DDR_REG_BASE + 0x51f4e*4+0x02000000,0x72b5); +reg_write( DDR_REG_BASE + 0x51f4f*4+0x02000000,0x4ca); +reg_write( DDR_REG_BASE + 0x51f50*4+0x02000000,0xffe5); +reg_write( DDR_REG_BASE + 0x51f51*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51f52*4+0x02000000,0x2480); +reg_write( DDR_REG_BASE + 0x51f53*4+0x02000000,0x390a); +reg_write( DDR_REG_BASE + 0x51f54*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x51f55*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x51f56*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x51f57*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x51f58*4+0x02000000,0xc0e6); +reg_write( DDR_REG_BASE + 0x51f59*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE + 0x51f5a*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51f5b*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE + 0x51f5c*4+0x02000000,0x8ba0); +reg_write( DDR_REG_BASE + 0x51f5d*4+0x02000000,0x8b81); +reg_write( DDR_REG_BASE + 0x51f5e*4+0x02000000,0x251f); +reg_write( DDR_REG_BASE + 0x51f5f*4+0x02000000,0x108f); +reg_write( DDR_REG_BASE + 0x51f60*4+0x02000000,0xf01b); +reg_write( DDR_REG_BASE + 0x51f61*4+0x02000000,0x251a); +reg_write( DDR_REG_BASE + 0x51f62*4+0x02000000,0x1f9e); +reg_write( DDR_REG_BASE + 0x51f63*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51f64*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x51f65*4+0x02000000,0x239a); +reg_write( DDR_REG_BASE + 0x51f66*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x51f67*4+0x02000000,0x2114); +reg_write( DDR_REG_BASE + 0x51f68*4+0x02000000,0x38e); +reg_write( DDR_REG_BASE + 0x51f69*4+0x02000000,0x2605); +reg_write( DDR_REG_BASE + 0x51f6a*4+0x02000000,0x301e); +reg_write( DDR_REG_BASE + 0x51f6b*4+0x02000000,0x2305); +reg_write( DDR_REG_BASE + 0x51f6c*4+0x02000000,0x783); +reg_write( DDR_REG_BASE + 0x51f6d*4+0x02000000,0x7b7b); +reg_write( DDR_REG_BASE + 0x51f6e*4+0x02000000,0xbb91); +reg_write( DDR_REG_BASE + 0x51f6f*4+0x02000000,0xbb9c); +reg_write( DDR_REG_BASE + 0x51f70*4+0x02000000,0xbb9f); +reg_write( DDR_REG_BASE + 0x51f71*4+0x02000000,0x9360); +reg_write( DDR_REG_BASE + 0x51f72*4+0x02000000,0x71e5); +reg_write( DDR_REG_BASE + 0x51f73*4+0x02000000,0x7165); +reg_write( DDR_REG_BASE + 0x51f74*4+0x02000000,0xb660); +reg_write( DDR_REG_BASE + 0x51f75*4+0x02000000,0x232f); +reg_write( DDR_REG_BASE + 0x51f76*4+0x02000000,0x2c7); +reg_write( DDR_REG_BASE + 0x51f77*4+0x02000000,0xbd7); +reg_write( DDR_REG_BASE + 0x51f78*4+0x02000000,0x80a4); +reg_write( DDR_REG_BASE + 0x51f79*4+0x02000000,0x7ef0); +reg_write( DDR_REG_BASE + 0x51f7a*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE + 0x51f7b*4+0x02000000,0xcf7); +reg_write( DDR_REG_BASE + 0x51f7c*4+0x02000000,0x9365); +reg_write( DDR_REG_BASE + 0x51f7d*4+0x02000000,0x706d); +reg_write( DDR_REG_BASE + 0x51f7e*4+0x02000000,0xc4c6); +reg_write( DDR_REG_BASE + 0x51f7f*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x51f80*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x51f81*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x51f82*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x51f83*4+0x02000000,0x45cb); +reg_write( DDR_REG_BASE + 0x51f84*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51f85*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE + 0x51f86*4+0x02000000,0x8d80); +reg_write( DDR_REG_BASE + 0x51f87*4+0x02000000,0x4338); +reg_write( DDR_REG_BASE + 0x51f88*4+0x02000000,0x4718); +reg_write( DDR_REG_BASE + 0x51f89*4+0x02000000,0x706d); +reg_write( DDR_REG_BASE + 0x51f8a*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x51f8b*4+0x02000000,0xea0d); +reg_write( DDR_REG_BASE + 0x51f8c*4+0x02000000,0x245f); +reg_write( DDR_REG_BASE + 0x51f8d*4+0x02000000,0x1243); +reg_write( DDR_REG_BASE + 0x51f8e*4+0x02000000,0xa1b); +reg_write( DDR_REG_BASE + 0x51f8f*4+0x02000000,0xb1); +reg_write( DDR_REG_BASE + 0x51f90*4+0x02000000,0xd908); +reg_write( DDR_REG_BASE + 0x51f91*4+0x02000000,0xe308); +reg_write( DDR_REG_BASE + 0x51f92*4+0x02000000,0xd809); +reg_write( DDR_REG_BASE + 0x51f93*4+0x02000000,0x71ed); +reg_write( DDR_REG_BASE + 0x51f94*4+0x02000000,0x234a); +reg_write( DDR_REG_BASE + 0x51f95*4+0x02000000,0x1200); +reg_write( DDR_REG_BASE + 0x51f96*4+0x02000000,0xf006); +reg_write( DDR_REG_BASE + 0x51f97*4+0x02000000,0x7b9b); +reg_write( DDR_REG_BASE + 0x51f98*4+0x02000000,0x74ed); +reg_write( DDR_REG_BASE + 0x51f99*4+0x02000000,0x742c); +reg_write( DDR_REG_BASE + 0x51f9a*4+0x02000000,0xf002); +reg_write( DDR_REG_BASE + 0x51f9b*4+0x02000000,0x71ed); +reg_write( DDR_REG_BASE + 0x51f9c*4+0x02000000,0x1501); +reg_write( DDR_REG_BASE + 0x51f9d*4+0x02000000,0x109e); +reg_write( DDR_REG_BASE + 0x51f9e*4+0x02000000,0xf023); +reg_write( DDR_REG_BASE + 0x51f9f*4+0x02000000,0x45c9); +reg_write( DDR_REG_BASE + 0x51fa0*4+0x02000000,0x259a); +reg_write( DDR_REG_BASE + 0x51fa1*4+0x02000000,0x1008); +reg_write( DDR_REG_BASE + 0x51fa2*4+0x02000000,0x241a); +reg_write( DDR_REG_BASE + 0x51fa3*4+0x02000000,0x1f82); +reg_write( DDR_REG_BASE + 0x51fa4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51fa5*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE + 0x51fa6*4+0x02000000,0x7aa5); +reg_write( DDR_REG_BASE + 0x51fa7*4+0x02000000,0x2205); +reg_write( DDR_REG_BASE + 0x51fa8*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE + 0x51fa9*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x51faa*4+0x02000000,0x64); +reg_write( DDR_REG_BASE + 0x51fab*4+0x02000000,0xb1f); +reg_write( DDR_REG_BASE + 0x51fac*4+0x02000000,0x3030); +reg_write( DDR_REG_BASE + 0x51fad*4+0x02000000,0x9a40); +reg_write( DDR_REG_BASE + 0x51fae*4+0x02000000,0x258a); +reg_write( DDR_REG_BASE + 0x51faf*4+0x02000000,0x1fcf); +reg_write( DDR_REG_BASE + 0x51fb0*4+0x02000000,0x7d44); +reg_write( DDR_REG_BASE + 0x51fb1*4+0x02000000,0x7a5d); +reg_write( DDR_REG_BASE + 0x51fb2*4+0x02000000,0x7a5d); +reg_write( DDR_REG_BASE + 0x51fb3*4+0x02000000,0x7a5d); +reg_write( DDR_REG_BASE + 0x51fb4*4+0x02000000,0x7a5d); +reg_write( DDR_REG_BASE + 0x51fb5*4+0x02000000,0x7a5d); +reg_write( DDR_REG_BASE + 0x51fb6*4+0x02000000,0x2284); +reg_write( DDR_REG_BASE + 0x51fb7*4+0x02000000,0x81f); +reg_write( DDR_REG_BASE + 0x51fb8*4+0x02000000,0x62ba); +reg_write( DDR_REG_BASE + 0x51fb9*4+0x02000000,0x2714); +reg_write( DDR_REG_BASE + 0x51fba*4+0x02000000,0x30cd); +reg_write( DDR_REG_BASE + 0x51fbb*4+0x02000000,0xb540); +reg_write( DDR_REG_BASE + 0x51fbc*4+0x02000000,0x66fe); +reg_write( DDR_REG_BASE + 0x51fbd*4+0x02000000,0x631b); +reg_write( DDR_REG_BASE + 0x51fbe*4+0x02000000,0x9c3); +reg_write( DDR_REG_BASE + 0x51fbf*4+0x02000000,0x8385); +reg_write( DDR_REG_BASE + 0x51fc0*4+0x02000000,0x7185); +reg_write( DDR_REG_BASE + 0x51fc1*4+0x02000000,0xefd); +reg_write( DDR_REG_BASE + 0x51fc2*4+0x02000000,0xb325); +reg_write( DDR_REG_BASE + 0x51fc3*4+0x02000000,0x4669); +reg_write( DDR_REG_BASE + 0x51fc4*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x51fc5*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x51fc6*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x51fc7*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x51fc8*4+0x02000000,0x8819); +reg_write( DDR_REG_BASE + 0x51fc9*4+0x02000000,0xb863); +reg_write( DDR_REG_BASE + 0x51fca*4+0x02000000,0x7314); +reg_write( DDR_REG_BASE + 0x51fcb*4+0x02000000,0x20e0); +reg_write( DDR_REG_BASE + 0x51fcc*4+0x02000000,0x7cd); +reg_write( DDR_REG_BASE + 0x51fcd*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x51fce*4+0x02000000,0x900e); +reg_write( DDR_REG_BASE + 0x51fcf*4+0x02000000,0x1e4c); +reg_write( DDR_REG_BASE + 0x51fd0*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE + 0x51fd1*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x51fd2*4+0x02000000,0xb041); +reg_write( DDR_REG_BASE + 0x51fd3*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x51fd4*4+0x02000000,0x791b); +reg_write( DDR_REG_BASE + 0x51fd5*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x51fd6*4+0x02000000,0x2184); +reg_write( DDR_REG_BASE + 0x51fd7*4+0x02000000,0xa82); +reg_write( DDR_REG_BASE + 0x51fd8*4+0x02000000,0x2046); +reg_write( DDR_REG_BASE + 0x51fd9*4+0x02000000,0xa80); +reg_write( DDR_REG_BASE + 0x51fda*4+0x02000000,0x7905); +reg_write( DDR_REG_BASE + 0x51fdb*4+0x02000000,0x215a); +reg_write( DDR_REG_BASE + 0x51fdc*4+0x02000000,0x100); +reg_write( DDR_REG_BASE + 0x51fdd*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE + 0x51fde*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE + 0x51fdf*4+0x02000000,0x2144); +reg_write( DDR_REG_BASE + 0x51fe0*4+0x02000000,0xcc1); +reg_write( DDR_REG_BASE + 0x51fe1*4+0x02000000,0x2084); +reg_write( DDR_REG_BASE + 0x51fe2*4+0x02000000,0x303); +reg_write( DDR_REG_BASE + 0x51fe3*4+0x02000000,0x7905); +reg_write( DDR_REG_BASE + 0x51fe4*4+0x02000000,0x215f); +reg_write( DDR_REG_BASE + 0x51fe5*4+0x02000000,0x400); +reg_write( DDR_REG_BASE + 0x51fe6*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE + 0x51fe7*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE + 0x51fe8*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE + 0x51fe9*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE + 0x51fea*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x51feb*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x51fec*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x51fed*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x51fee*4+0x02000000,0xc2e2); +reg_write( DDR_REG_BASE + 0x51fef*4+0x02000000,0x45cb); +reg_write( DDR_REG_BASE + 0x51ff0*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE + 0x51ff1*4+0x02000000,0xe000); +reg_write( DDR_REG_BASE + 0x51ff2*4+0x02000000,0xd820); +reg_write( DDR_REG_BASE + 0x51ff3*4+0x02000000,0xe7e); +reg_write( DDR_REG_BASE + 0x51ff4*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x51ff5*4+0x02000000,0x1d00); +reg_write( DDR_REG_BASE + 0x51ff6*4+0x02000000,0x1045); +reg_write( DDR_REG_BASE + 0x51ff7*4+0x02000000,0x1d00); +reg_write( DDR_REG_BASE + 0x51ff8*4+0x02000000,0x1005); +reg_write( DDR_REG_BASE + 0x51ff9*4+0x02000000,0xc6c2); +reg_write( DDR_REG_BASE + 0x51ffa*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x51ffb*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x51ffc*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x51ffd*4+0x02000000,0x2482); +reg_write( DDR_REG_BASE + 0x51ffe*4+0x02000000,0x3702); +reg_write( DDR_REG_BASE + 0x51fff*4+0x02000000,0xc140); +reg_write( DDR_REG_BASE + 0x52000*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x52001*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x52002*4+0x02000000,0x7100); +reg_write( DDR_REG_BASE + 0x52003*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x52004*4+0x02000000,0xaa); +reg_write( DDR_REG_BASE + 0x52005*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x52006*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52007*4+0x02000000,0x57c); +reg_write( DDR_REG_BASE + 0x52008*4+0x02000000,0xda78); +reg_write( DDR_REG_BASE + 0x52009*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x5200a*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x5200b*4+0x02000000,0x7085); +reg_write( DDR_REG_BASE + 0x5200c*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE + 0x5200d*4+0x02000000,0xe0aa); +reg_write( DDR_REG_BASE + 0x5200e*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x5200f*4+0x02000000,0x709b); +reg_write( DDR_REG_BASE + 0x52010*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52011*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x52012*4+0x02000000,0x85e); +reg_write( DDR_REG_BASE + 0x52013*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE + 0x52014*4+0x02000000,0xc089); +reg_write( DDR_REG_BASE + 0x52015*4+0x02000000,0xc089); +reg_write( DDR_REG_BASE + 0x52016*4+0x02000000,0x95e); +reg_write( DDR_REG_BASE + 0x52017*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x52018*4+0x02000000,0xd978); +reg_write( DDR_REG_BASE + 0x52019*4+0x02000000,0xa4a); +reg_write( DDR_REG_BASE + 0x5201a*4+0x02000000,0xfe8f); +reg_write( DDR_REG_BASE + 0x5201b*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x5201c*4+0x02000000,0xf86); +reg_write( DDR_REG_BASE + 0x5201d*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE + 0x5201e*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x5201f*4+0x02000000,0xdde); +reg_write( DDR_REG_BASE + 0x52020*4+0x02000000,0xff4f); +reg_write( DDR_REG_BASE + 0x52021*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x52022*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x52023*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x52024*4+0x02000000,0xe024); +reg_write( DDR_REG_BASE + 0x52025*4+0x02000000,0x228a); +reg_write( DDR_REG_BASE + 0x52026*4+0x02000000,0x44); +reg_write( DDR_REG_BASE + 0x52027*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE + 0x52028*4+0x02000000,0xb026); +reg_write( DDR_REG_BASE + 0x52029*4+0x02000000,0x18fe); +reg_write( DDR_REG_BASE + 0x5202a*4+0x02000000,0x8084); +reg_write( DDR_REG_BASE + 0x5202b*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x5202c*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE + 0x5202d*4+0x02000000,0x7c2); +reg_write( DDR_REG_BASE + 0x5202e*4+0x02000000,0x4020); +reg_write( DDR_REG_BASE + 0x5202f*4+0x02000000,0xea06); +reg_write( DDR_REG_BASE + 0x52030*4+0x02000000,0xba61); +reg_write( DDR_REG_BASE + 0x52031*4+0x02000000,0xa01); +reg_write( DDR_REG_BASE + 0x52032*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x52033*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x52034*4+0x02000000,0x7d0f); +reg_write( DDR_REG_BASE + 0x52035*4+0x02000000,0x40a1); +reg_write( DDR_REG_BASE + 0x52036*4+0x02000000,0xc62); +reg_write( DDR_REG_BASE + 0x52037*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x52038*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52039*4+0x02000000,0xd830); +reg_write( DDR_REG_BASE + 0x5203a*4+0x02000000,0xc36); +reg_write( DDR_REG_BASE + 0x5203b*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE + 0x5203c*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x5203d*4+0x02000000,0xa76); +reg_write( DDR_REG_BASE + 0x5203e*4+0x02000000,0xfecf); +reg_write( DDR_REG_BASE + 0x5203f*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52040*4+0x02000000,0xf005); +reg_write( DDR_REG_BASE + 0x52041*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x52042*4+0x02000000,0x1900); +reg_write( DDR_REG_BASE + 0x52043*4+0x02000000,0xfc3); +reg_write( DDR_REG_BASE + 0x52044*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE + 0x52045*4+0x02000000,0x8fb); +reg_write( DDR_REG_BASE + 0x52046*4+0x02000000,0x8534); +reg_write( DDR_REG_BASE + 0x52047*4+0x02000000,0xc184); +reg_write( DDR_REG_BASE + 0x52048*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52049*4+0x02000000,0xc1a); +reg_write( DDR_REG_BASE + 0x5204a*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE + 0x5204b*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x5204c*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x5204d*4+0x02000000,0xf26); +reg_write( DDR_REG_BASE + 0x5204e*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE + 0x5204f*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x52050*4+0x02000000,0x40a1); +reg_write( DDR_REG_BASE + 0x52051*4+0x02000000,0xc2e); +reg_write( DDR_REG_BASE + 0x52052*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x52053*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x52054*4+0x02000000,0x231a); +reg_write( DDR_REG_BASE + 0x52055*4+0x02000000,0x3f9b); +reg_write( DDR_REG_BASE + 0x52056*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x52057*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52058*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE + 0x52059*4+0x02000000,0xfc7); +reg_write( DDR_REG_BASE + 0x5205a*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE + 0x5205b*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x5205c*4+0x02000000,0xe174); +reg_write( DDR_REG_BASE + 0x5205d*4+0x02000000,0x70ed); +reg_write( DDR_REG_BASE + 0x5205e*4+0x02000000,0x45cb); +reg_write( DDR_REG_BASE + 0x5205f*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52060*4+0x02000000,0x7b2); +reg_write( DDR_REG_BASE + 0x52061*4+0x02000000,0xb600); +reg_write( DDR_REG_BASE + 0x52062*4+0x02000000,0xb601); +reg_write( DDR_REG_BASE + 0x52063*4+0x02000000,0x1e59); +reg_write( DDR_REG_BASE + 0x52064*4+0x02000000,0x93dc); +reg_write( DDR_REG_BASE + 0x52065*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE + 0x52066*4+0x02000000,0x36c0); +reg_write( DDR_REG_BASE + 0x52067*4+0x02000000,0xf7f); +reg_write( DDR_REG_BASE + 0x52068*4+0x02000000,0x1a35); +reg_write( DDR_REG_BASE + 0x52069*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x5206a*4+0x02000000,0xbd6); +reg_write( DDR_REG_BASE + 0x5206b*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE + 0x5206c*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x5206d*4+0x02000000,0x1501); +reg_write( DDR_REG_BASE + 0x5206e*4+0x02000000,0x108b); +reg_write( DDR_REG_BASE + 0x5206f*4+0x02000000,0x8d80); +reg_write( DDR_REG_BASE + 0x52070*4+0x02000000,0x706f); +reg_write( DDR_REG_BASE + 0x52071*4+0x02000000,0xf02b); +reg_write( DDR_REG_BASE + 0x52072*4+0x02000000,0x241a); +reg_write( DDR_REG_BASE + 0x52073*4+0x02000000,0x1f80); +reg_write( DDR_REG_BASE + 0x52074*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52075*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x52076*4+0x02000000,0x206c); +reg_write( DDR_REG_BASE + 0x52077*4+0x02000000,0x302); +reg_write( DDR_REG_BASE + 0x52078*4+0x02000000,0x2205); +reg_write( DDR_REG_BASE + 0x52079*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x5207a*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x5207b*4+0x02000000,0x166); +reg_write( DDR_REG_BASE + 0x5207c*4+0x02000000,0x9000); +reg_write( DDR_REG_BASE + 0x5207d*4+0x02000000,0x2079); +reg_write( DDR_REG_BASE + 0x5207e*4+0x02000000,0x3); +reg_write( DDR_REG_BASE + 0x5207f*4+0x02000000,0xc084); +reg_write( DDR_REG_BASE + 0x52080*4+0x02000000,0x6098); +reg_write( DDR_REG_BASE + 0x52081*4+0x02000000,0x8820); +reg_write( DDR_REG_BASE + 0x52082*4+0x02000000,0x793b); +reg_write( DDR_REG_BASE + 0x52083*4+0x02000000,0x7965); +reg_write( DDR_REG_BASE + 0x52084*4+0x02000000,0xa820); +reg_write( DDR_REG_BASE + 0x52085*4+0x02000000,0x241a); +reg_write( DDR_REG_BASE + 0x52086*4+0x02000000,0x1f80); +reg_write( DDR_REG_BASE + 0x52087*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52088*4+0x02000000,0x800); +reg_write( DDR_REG_BASE + 0x52089*4+0x02000000,0x2153); +reg_write( DDR_REG_BASE + 0x5208a*4+0x02000000,0x80be); +reg_write( DDR_REG_BASE + 0x5208b*4+0x02000000,0x2004); +reg_write( DDR_REG_BASE + 0x5208c*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x5208d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5208e*4+0x02000000,0x800); +reg_write( DDR_REG_BASE + 0x5208f*4+0x02000000,0x7a05); +reg_write( DDR_REG_BASE + 0x52090*4+0x02000000,0x2205); +reg_write( DDR_REG_BASE + 0x52091*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE + 0x52092*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x52093*4+0x02000000,0x64); +reg_write( DDR_REG_BASE + 0x52094*4+0x02000000,0x9200); +reg_write( DDR_REG_BASE + 0x52095*4+0x02000000,0xf206); +reg_write( DDR_REG_BASE + 0x52096*4+0x02000000,0x2080); +reg_write( DDR_REG_BASE + 0x52097*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x52098*4+0x02000000,0x716f); +reg_write( DDR_REG_BASE + 0x52099*4+0x02000000,0xb200); +reg_write( DDR_REG_BASE + 0x5209a*4+0x02000000,0x7185); +reg_write( DDR_REG_BASE + 0x5209b*4+0x02000000,0xbb1); +reg_write( DDR_REG_BASE + 0x5209c*4+0x02000000,0x9325); +reg_write( DDR_REG_BASE + 0x5209d*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x5209e*4+0x02000000,0xe82); +reg_write( DDR_REG_BASE + 0x5209f*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE + 0x520a0*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x520a1*4+0x02000000,0xb8f); +reg_write( DDR_REG_BASE + 0x520a2*4+0x02000000,0xb031); +reg_write( DDR_REG_BASE + 0x520a3*4+0x02000000,0x71e5); +reg_write( DDR_REG_BASE + 0x520a4*4+0x02000000,0x706f); +reg_write( DDR_REG_BASE + 0x520a5*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x520a6*4+0x02000000,0x6e); +reg_write( DDR_REG_BASE + 0x520a7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x520a8*4+0x02000000,0xf9e); +reg_write( DDR_REG_BASE + 0x520a9*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x520aa*4+0x02000000,0x2378); +reg_write( DDR_REG_BASE + 0x520ab*4+0x02000000,0x3000); +reg_write( DDR_REG_BASE + 0x520ac*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x520ad*4+0x02000000,0xb600); +reg_write( DDR_REG_BASE + 0x520ae*4+0x02000000,0x992); +reg_write( DDR_REG_BASE + 0x520af*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x520b0*4+0x02000000,0xb601); +reg_write( DDR_REG_BASE + 0x520b1*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x520b2*4+0x02000000,0x92e); +reg_write( DDR_REG_BASE + 0x520b3*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x520b4*4+0x02000000,0x732c); +reg_write( DDR_REG_BASE + 0x520b5*4+0x02000000,0xd820); +reg_write( DDR_REG_BASE + 0x520b6*4+0x02000000,0xb3e); +reg_write( DDR_REG_BASE + 0x520b7*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE + 0x520b8*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x520b9*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE + 0x520ba*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x520bb*4+0x02000000,0xd8e); +reg_write( DDR_REG_BASE + 0x520bc*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x520bd*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x520be*4+0x02000000,0x8d61); +reg_write( DDR_REG_BASE + 0x520bf*4+0x02000000,0x8d20); +reg_write( DDR_REG_BASE + 0x520c0*4+0x02000000,0xf00a); +reg_write( DDR_REG_BASE + 0x520c1*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE + 0x520c2*4+0x02000000,0x20f4); +reg_write( DDR_REG_BASE + 0x520c3*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x520c4*4+0x02000000,0x2042); +reg_write( DDR_REG_BASE + 0x520c5*4+0x02000000,0x802); +reg_write( DDR_REG_BASE + 0x520c6*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE + 0x520c7*4+0x02000000,0x7834); +reg_write( DDR_REG_BASE + 0x520c8*4+0x02000000,0xb040); +reg_write( DDR_REG_BASE + 0x520c9*4+0x02000000,0x7124); +reg_write( DDR_REG_BASE + 0x520ca*4+0x02000000,0xbef); +reg_write( DDR_REG_BASE + 0x520cb*4+0x02000000,0x8045); +reg_write( DDR_REG_BASE + 0x520cc*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x520cd*4+0x02000000,0xe72); +reg_write( DDR_REG_BASE + 0x520ce*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE + 0x520cf*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x520d0*4+0x02000000,0xc103); +reg_write( DDR_REG_BASE + 0x520d1*4+0x02000000,0x2055); +reg_write( DDR_REG_BASE + 0x520d2*4+0x02000000,0x800); +reg_write( DDR_REG_BASE + 0x520d3*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE + 0x520d4*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x520d5*4+0x02000000,0xc100); +reg_write( DDR_REG_BASE + 0x520d6*4+0x02000000,0x83a); +reg_write( DDR_REG_BASE + 0x520d7*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x520d8*4+0x02000000,0x716c); +reg_write( DDR_REG_BASE + 0x520d9*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x520da*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x520db*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x520dc*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x520dd*4+0x02000000,0xe004); +reg_write( DDR_REG_BASE + 0x520de*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x520df*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x520e0*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE + 0x520e1*4+0x02000000,0xe076); +reg_write( DDR_REG_BASE + 0x520e2*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE + 0x520e3*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x520e4*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x520e5*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE + 0x520e6*4+0x02000000,0xe0aa); +reg_write( DDR_REG_BASE + 0x520e7*4+0x02000000,0xe12); +reg_write( DDR_REG_BASE + 0x520e8*4+0x02000000,0xffcf); +reg_write( DDR_REG_BASE + 0x520e9*4+0x02000000,0x2480); +reg_write( DDR_REG_BASE + 0x520ea*4+0x02000000,0x3702); +reg_write( DDR_REG_BASE + 0x520eb*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x520ec*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x520ed*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x520ee*4+0x02000000,0xc2e2); +reg_write( DDR_REG_BASE + 0x520ef*4+0x02000000,0xcb2); +reg_write( DDR_REG_BASE + 0x520f0*4+0x02000000,0xfe8f); +reg_write( DDR_REG_BASE + 0x520f1*4+0x02000000,0x256f); +reg_write( DDR_REG_BASE + 0x520f2*4+0x02000000,0x1343); +reg_write( DDR_REG_BASE + 0x520f3*4+0x02000000,0x9560); +reg_write( DDR_REG_BASE + 0x520f4*4+0x02000000,0xda20); +reg_write( DDR_REG_BASE + 0x520f5*4+0x02000000,0xd940); +reg_write( DDR_REG_BASE + 0x520f6*4+0x02000000,0x238c); +reg_write( DDR_REG_BASE + 0x520f7*4+0x02000000,0x85ca); +reg_write( DDR_REG_BASE + 0x520f8*4+0x02000000,0x22ca); +reg_write( DDR_REG_BASE + 0x520f9*4+0x02000000,0xc2d); +reg_write( DDR_REG_BASE + 0x520fa*4+0x02000000,0x238c); +reg_write( DDR_REG_BASE + 0x520fb*4+0x02000000,0x89d0); +reg_write( DDR_REG_BASE + 0x520fc*4+0x02000000,0x22ca); +reg_write( DDR_REG_BASE + 0x520fd*4+0x02000000,0x4d); +reg_write( DDR_REG_BASE + 0x520fe*4+0x02000000,0x238c); +reg_write( DDR_REG_BASE + 0x520ff*4+0x02000000,0x8fd8); +reg_write( DDR_REG_BASE + 0x52100*4+0x02000000,0xd950); +reg_write( DDR_REG_BASE + 0x52101*4+0x02000000,0x22ca); +reg_write( DDR_REG_BASE + 0x52102*4+0x02000000,0x4d); +reg_write( DDR_REG_BASE + 0x52103*4+0x02000000,0x218a); +reg_write( DDR_REG_BASE + 0x52104*4+0x02000000,0x5ca); +reg_write( DDR_REG_BASE + 0x52105*4+0x02000000,0x213c); +reg_write( DDR_REG_BASE + 0x52106*4+0x02000000,0xc1); +reg_write( DDR_REG_BASE + 0x52107*4+0x02000000,0x238c); +reg_write( DDR_REG_BASE + 0x52108*4+0x02000000,0x89d0); +reg_write( DDR_REG_BASE + 0x52109*4+0x02000000,0x21ca); +reg_write( DDR_REG_BASE + 0x5210a*4+0x02000000,0xad); +reg_write( DDR_REG_BASE + 0x5210b*4+0x02000000,0x238c); +reg_write( DDR_REG_BASE + 0x5210c*4+0x02000000,0x8fd8); +reg_write( DDR_REG_BASE + 0x5210d*4+0x02000000,0x21ca); +reg_write( DDR_REG_BASE + 0x5210e*4+0x02000000,0xed); +reg_write( DDR_REG_BASE + 0x5210f*4+0x02000000,0x73d3); +reg_write( DDR_REG_BASE + 0x52110*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52111*4+0x02000000,0x95f); +reg_write( DDR_REG_BASE + 0x52112*4+0x02000000,0x21ca); +reg_write( DDR_REG_BASE + 0x52113*4+0x02000000,0x12d); +reg_write( DDR_REG_BASE + 0x52114*4+0x02000000,0x2105); +reg_write( DDR_REG_BASE + 0x52115*4+0x02000000,0x8c); +reg_write( DDR_REG_BASE + 0x52116*4+0x02000000,0x15fe); +reg_write( DDR_REG_BASE + 0x52117*4+0x02000000,0x9081); +reg_write( DDR_REG_BASE + 0x52118*4+0x02000000,0x205a); +reg_write( DDR_REG_BASE + 0x52119*4+0x02000000,0x400); +reg_write( DDR_REG_BASE + 0x5211a*4+0x02000000,0x211a); +reg_write( DDR_REG_BASE + 0x5211b*4+0x02000000,0xf83); +reg_write( DDR_REG_BASE + 0x5211c*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x5211d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5211e*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x5211f*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x52120*4+0x02000000,0xf8); +reg_write( DDR_REG_BASE + 0x52121*4+0x02000000,0x2004); +reg_write( DDR_REG_BASE + 0x52122*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x52123*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52124*4+0x02000000,0x1ff0); +reg_write( DDR_REG_BASE + 0x52125*4+0x02000000,0xb881); +reg_write( DDR_REG_BASE + 0x52126*4+0x02000000,0x2305); +reg_write( DDR_REG_BASE + 0x52127*4+0x02000000,0x42); +reg_write( DDR_REG_BASE + 0x52128*4+0x02000000,0x7224); +reg_write( DDR_REG_BASE + 0x52129*4+0x02000000,0x7965); +reg_write( DDR_REG_BASE + 0x5212a*4+0x02000000,0xb280); +reg_write( DDR_REG_BASE + 0x5212b*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE + 0x5212c*4+0x02000000,0xc6c2); +reg_write( DDR_REG_BASE + 0x5212d*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x5212e*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x5212f*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x52130*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE + 0x52131*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE + 0x52132*4+0x02000000,0x1ea); +reg_write( DDR_REG_BASE + 0x52133*4+0x02000000,0x9340); +reg_write( DDR_REG_BASE + 0x52134*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x52135*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x52136*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE + 0x52137*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x52138*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52139*4+0x02000000,0xfb00); +reg_write( DDR_REG_BASE + 0x5213a*4+0x02000000,0x2204); +reg_write( DDR_REG_BASE + 0x5213b*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE + 0x5213c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5213d*4+0x02000000,0xc0ff); +reg_write( DDR_REG_BASE + 0x5213e*4+0x02000000,0x7845); +reg_write( DDR_REG_BASE + 0x5213f*4+0x02000000,0x9341); +reg_write( DDR_REG_BASE + 0x52140*4+0x02000000,0xb300); +reg_write( DDR_REG_BASE + 0x52141*4+0x02000000,0xb965); +reg_write( DDR_REG_BASE + 0x52142*4+0x02000000,0x226c); +reg_write( DDR_REG_BASE + 0x52143*4+0x02000000,0x140); +reg_write( DDR_REG_BASE + 0x52144*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x52145*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x52146*4+0x02000000,0xb301); +reg_write( DDR_REG_BASE + 0x52147*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x52148*4+0x02000000,0x7a1b); +reg_write( DDR_REG_BASE + 0x52149*4+0x02000000,0x2205); +reg_write( DDR_REG_BASE + 0x5214a*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE + 0x5214b*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x5214c*4+0x02000000,0xe164); +reg_write( DDR_REG_BASE + 0x5214d*4+0x02000000,0x1a00); +reg_write( DDR_REG_BASE + 0x5214e*4+0x02000000,0x5); +reg_write( DDR_REG_BASE + 0x5214f*4+0x02000000,0x42c3); +reg_write( DDR_REG_BASE + 0x52150*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52151*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE + 0x52152*4+0x02000000,0x8a61); +reg_write( DDR_REG_BASE + 0x52153*4+0x02000000,0x8a80); +reg_write( DDR_REG_BASE + 0x52154*4+0x02000000,0xf00d); +reg_write( DDR_REG_BASE + 0x52155*4+0x02000000,0x241a); +reg_write( DDR_REG_BASE + 0x52156*4+0x02000000,0x1f82); +reg_write( DDR_REG_BASE + 0x52157*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52158*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x52159*4+0x02000000,0x7185); +reg_write( DDR_REG_BASE + 0x5215a*4+0x02000000,0x7a05); +reg_write( DDR_REG_BASE + 0x5215b*4+0x02000000,0x7a5b); +reg_write( DDR_REG_BASE + 0x5215c*4+0x02000000,0x2205); +reg_write( DDR_REG_BASE + 0x5215d*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE + 0x5215e*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x5215f*4+0x02000000,0x164); +reg_write( DDR_REG_BASE + 0x52160*4+0x02000000,0xb220); +reg_write( DDR_REG_BASE + 0x52161*4+0x02000000,0xbeb); +reg_write( DDR_REG_BASE + 0x52162*4+0x02000000,0x8305); +reg_write( DDR_REG_BASE + 0x52163*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x52164*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x52165*4+0x02000000,0x266f); +reg_write( DDR_REG_BASE + 0x52166*4+0x02000000,0x15c3); +reg_write( DDR_REG_BASE + 0x52167*4+0x02000000,0x8e40); +reg_write( DDR_REG_BASE + 0x52168*4+0x02000000,0x4508); +reg_write( DDR_REG_BASE + 0x52169*4+0x02000000,0xea17); +reg_write( DDR_REG_BASE + 0x5216a*4+0x02000000,0xede); +reg_write( DDR_REG_BASE + 0x5216b*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x5216c*4+0x02000000,0x4040); +reg_write( DDR_REG_BASE + 0x5216d*4+0x02000000,0x4708); +reg_write( DDR_REG_BASE + 0x5216e*4+0x02000000,0xe887); +reg_write( DDR_REG_BASE + 0x5216f*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x52170*4+0x02000000,0xd6); +reg_write( DDR_REG_BASE + 0x52171*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x52172*4+0x02000000,0xe0a); +reg_write( DDR_REG_BASE + 0x52173*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x52174*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52175*4+0x02000000,0x40e1); +reg_write( DDR_REG_BASE + 0x52176*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x52177*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x52178*4+0x02000000,0x7f05); +reg_write( DDR_REG_BASE + 0x52179*4+0x02000000,0x78bb); +reg_write( DDR_REG_BASE + 0x5217a*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x5217b*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x5217c*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x5217d*4+0x02000000,0xfe92); +reg_write( DDR_REG_BASE + 0x5217e*4+0x02000000,0xb0e0); +reg_write( DDR_REG_BASE + 0x5217f*4+0x02000000,0x16ff); +reg_write( DDR_REG_BASE + 0x52180*4+0x02000000,0x9082); +reg_write( DDR_REG_BASE + 0x52181*4+0x02000000,0xea16); +reg_write( DDR_REG_BASE + 0x52182*4+0x02000000,0xeae); +reg_write( DDR_REG_BASE + 0x52183*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x52184*4+0x02000000,0x4040); +reg_write( DDR_REG_BASE + 0x52185*4+0x02000000,0x228c); +reg_write( DDR_REG_BASE + 0x52186*4+0x02000000,0x8fc3); +reg_write( DDR_REG_BASE + 0x52187*4+0x02000000,0xf209); +reg_write( DDR_REG_BASE + 0x52188*4+0x02000000,0xe888); +reg_write( DDR_REG_BASE + 0x52189*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x5218a*4+0x02000000,0xd7); +reg_write( DDR_REG_BASE + 0x5218b*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5218c*4+0x02000000,0xdd6); +reg_write( DDR_REG_BASE + 0x5218d*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x5218e*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x5218f*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52190*4+0x02000000,0x79bb); +reg_write( DDR_REG_BASE + 0x52191*4+0x02000000,0x2105); +reg_write( DDR_REG_BASE + 0x52192*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x52193*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x52194*4+0x02000000,0xfe9a); +reg_write( DDR_REG_BASE + 0x52195*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE + 0x52196*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x52197*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x52198*4+0x02000000,0xc0f1); +reg_write( DDR_REG_BASE + 0x52199*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x5219a*4+0x02000000,0x7082); +reg_write( DDR_REG_BASE + 0x5219b*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5219c*4+0x02000000,0x9); +reg_write( DDR_REG_BASE + 0x5219d*4+0x02000000,0xea1a); +reg_write( DDR_REG_BASE + 0x5219e*4+0x02000000,0xa23); +reg_write( DDR_REG_BASE + 0x5219f*4+0x02000000,0xa30); +reg_write( DDR_REG_BASE + 0x521a0*4+0x02000000,0x720c); +reg_write( DDR_REG_BASE + 0x521a1*4+0x02000000,0x228c); +reg_write( DDR_REG_BASE + 0x521a2*4+0x02000000,0x8c03); +reg_write( DDR_REG_BASE + 0x521a3*4+0x02000000,0xf20c); +reg_write( DDR_REG_BASE + 0x521a4*4+0x02000000,0xe2f8); +reg_write( DDR_REG_BASE + 0x521a5*4+0x02000000,0xf404); +reg_write( DDR_REG_BASE + 0x521a6*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x521a7*4+0x02000000,0xf009); +reg_write( DDR_REG_BASE + 0x521a8*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x521a9*4+0x02000000,0xd8); +reg_write( DDR_REG_BASE + 0x521aa*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x521ab*4+0x02000000,0xd9a); +reg_write( DDR_REG_BASE + 0x521ac*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x521ad*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x521ae*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x521af*4+0x02000000,0x205f); +reg_write( DDR_REG_BASE + 0x521b0*4+0x02000000,0x401); +reg_write( DDR_REG_BASE + 0x521b1*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x521b2*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x521b3*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x521b4*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE + 0x521b5*4+0x02000000,0xe0a0); +reg_write( DDR_REG_BASE + 0x521b6*4+0x02000000,0xc0d1); +reg_write( DDR_REG_BASE + 0x521b7*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x521b8*4+0x02000000,0xc0e2); +reg_write( DDR_REG_BASE + 0x521b9*4+0x02000000,0x706d); +reg_write( DDR_REG_BASE + 0x521ba*4+0x02000000,0xf00e); +reg_write( DDR_REG_BASE + 0x521bb*4+0x02000000,0x239a); +reg_write( DDR_REG_BASE + 0x521bc*4+0x02000000,0x901); +reg_write( DDR_REG_BASE + 0x521bd*4+0x02000000,0x607d); +reg_write( DDR_REG_BASE + 0x521be*4+0x02000000,0x245a); +reg_write( DDR_REG_BASE + 0x521bf*4+0x02000000,0x1c83); +reg_write( DDR_REG_BASE + 0x521c0*4+0x02000000,0x7185); +reg_write( DDR_REG_BASE + 0x521c1*4+0x02000000,0x63bb); +reg_write( DDR_REG_BASE + 0x521c2*4+0x02000000,0x633b); +reg_write( DDR_REG_BASE + 0x521c3*4+0x02000000,0xab40); +reg_write( DDR_REG_BASE + 0x521c4*4+0x02000000,0xcef); +reg_write( DDR_REG_BASE + 0x521c5*4+0x02000000,0x90b4); +reg_write( DDR_REG_BASE + 0x521c6*4+0x02000000,0x4361); +reg_write( DDR_REG_BASE + 0x521c7*4+0x02000000,0x7165); +reg_write( DDR_REG_BASE + 0x521c8*4+0x02000000,0xbf9); +reg_write( DDR_REG_BASE + 0x521c9*4+0x02000000,0x90b4); +reg_write( DDR_REG_BASE + 0x521ca*4+0x02000000,0x708d); +reg_write( DDR_REG_BASE + 0x521cb*4+0x02000000,0xc4c2); +reg_write( DDR_REG_BASE + 0x521cc*4+0x02000000,0xc0e6); +reg_write( DDR_REG_BASE + 0x521cd*4+0x02000000,0x4328); +reg_write( DDR_REG_BASE + 0x521ce*4+0x02000000,0x70ed); +reg_write( DDR_REG_BASE + 0x521cf*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x521d0*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x521d1*4+0x02000000,0xff64); +reg_write( DDR_REG_BASE + 0x521d2*4+0x02000000,0xb1e0); +reg_write( DDR_REG_BASE + 0x521d3*4+0x02000000,0x1904); +reg_write( DDR_REG_BASE + 0x521d4*4+0x02000000,0x45); +reg_write( DDR_REG_BASE + 0x521d5*4+0x02000000,0x42c3); +reg_write( DDR_REG_BASE + 0x521d6*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x521d7*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE + 0x521d8*4+0x02000000,0x8a21); +reg_write( DDR_REG_BASE + 0x521d9*4+0x02000000,0x8ac0); +reg_write( DDR_REG_BASE + 0x521da*4+0x02000000,0xf03b); +reg_write( DDR_REG_BASE + 0x521db*4+0x02000000,0x228c); +reg_write( DDR_REG_BASE + 0x521dc*4+0x02000000,0x8fc3); +reg_write( DDR_REG_BASE + 0x521dd*4+0x02000000,0xf41a); +reg_write( DDR_REG_BASE + 0x521de*4+0x02000000,0x261a); +reg_write( DDR_REG_BASE + 0x521df*4+0x02000000,0x1f83); +reg_write( DDR_REG_BASE + 0x521e0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x521e1*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE + 0x521e2*4+0x02000000,0x42c3); +reg_write( DDR_REG_BASE + 0x521e3*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x521e4*4+0x02000000,0x1f64); +reg_write( DDR_REG_BASE + 0x521e5*4+0x02000000,0x2305); +reg_write( DDR_REG_BASE + 0x521e6*4+0x02000000,0x8c); +reg_write( DDR_REG_BASE + 0x521e7*4+0x02000000,0x7444); +reg_write( DDR_REG_BASE + 0x521e8*4+0x02000000,0x7a65); +reg_write( DDR_REG_BASE + 0x521e9*4+0x02000000,0xb400); +reg_write( DDR_REG_BASE + 0x521ea*4+0x02000000,0xb2e0); +reg_write( DDR_REG_BASE + 0x521eb*4+0x02000000,0x42c3); +reg_write( DDR_REG_BASE + 0x521ec*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x521ed*4+0x02000000,0x1164); +reg_write( DDR_REG_BASE + 0x521ee*4+0x02000000,0x2305); +reg_write( DDR_REG_BASE + 0x521ef*4+0x02000000,0x8c); +reg_write( DDR_REG_BASE + 0x521f0*4+0x02000000,0x7444); +reg_write( DDR_REG_BASE + 0x521f1*4+0x02000000,0x7a65); +reg_write( DDR_REG_BASE + 0x521f2*4+0x02000000,0xb4e0); +reg_write( DDR_REG_BASE + 0x521f3*4+0x02000000,0x1a00); +reg_write( DDR_REG_BASE + 0x521f4*4+0x02000000,0x45); +reg_write( DDR_REG_BASE + 0x521f5*4+0x02000000,0xf020); +reg_write( DDR_REG_BASE + 0x521f6*4+0x02000000,0x260a); +reg_write( DDR_REG_BASE + 0x521f7*4+0x02000000,0x32c0); +reg_write( DDR_REG_BASE + 0x521f8*4+0x02000000,0x708d); +reg_write( DDR_REG_BASE + 0x521f9*4+0x02000000,0xf016); +reg_write( DDR_REG_BASE + 0x521fa*4+0x02000000,0xf753); +reg_write( DDR_REG_BASE + 0x521fb*4+0x02000000,0x4381); +reg_write( DDR_REG_BASE + 0x521fc*4+0x02000000,0x261a); +reg_write( DDR_REG_BASE + 0x521fd*4+0x02000000,0x1f82); +reg_write( DDR_REG_BASE + 0x521fe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x521ff*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE + 0x52200*4+0x02000000,0x239a); +reg_write( DDR_REG_BASE + 0x52201*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x52202*4+0x02000000,0x7b45); +reg_write( DDR_REG_BASE + 0x52203*4+0x02000000,0x42c3); +reg_write( DDR_REG_BASE + 0x52204*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x52205*4+0x02000000,0x164); +reg_write( DDR_REG_BASE + 0x52206*4+0x02000000,0x2305); +reg_write( DDR_REG_BASE + 0x52207*4+0x02000000,0x8d); +reg_write( DDR_REG_BASE + 0x52208*4+0x02000000,0x7444); +reg_write( DDR_REG_BASE + 0x52209*4+0x02000000,0x7b45); +reg_write( DDR_REG_BASE + 0x5220a*4+0x02000000,0xb500); +reg_write( DDR_REG_BASE + 0x5220b*4+0x02000000,0x1b00); +reg_write( DDR_REG_BASE + 0x5220c*4+0x02000000,0x5); +reg_write( DDR_REG_BASE + 0x5220d*4+0x02000000,0x7185); +reg_write( DDR_REG_BASE + 0x5220e*4+0x02000000,0xe0d); +reg_write( DDR_REG_BASE + 0x5220f*4+0x02000000,0x3010); +reg_write( DDR_REG_BASE + 0x52210*4+0x02000000,0xcd5); +reg_write( DDR_REG_BASE + 0x52211*4+0x02000000,0x9274); +reg_write( DDR_REG_BASE + 0x52212*4+0x02000000,0x262f); +reg_write( DDR_REG_BASE + 0x52213*4+0x02000000,0xb782); +reg_write( DDR_REG_BASE + 0x52214*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE + 0x52215*4+0x02000000,0x98f); +reg_write( DDR_REG_BASE + 0x52216*4+0x02000000,0x83a5); +reg_write( DDR_REG_BASE + 0x52217*4+0x02000000,0x222f); +reg_write( DDR_REG_BASE + 0x52218*4+0x02000000,0x2c7); +reg_write( DDR_REG_BASE + 0x52219*4+0x02000000,0xc4c6); +reg_write( DDR_REG_BASE + 0x5221a*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x5221b*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x5221c*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x5221d*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x5221e*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x5221f*4+0x02000000,0x30); +reg_write( DDR_REG_BASE + 0x52220*4+0x02000000,0x10b4); +reg_write( DDR_REG_BASE + 0x52221*4+0x02000000,0x501); +reg_write( DDR_REG_BASE + 0x52222*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x52223*4+0x02000000,0x708d); +reg_write( DDR_REG_BASE + 0x52224*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52225*4+0x02000000,0x23); +reg_write( DDR_REG_BASE + 0x52226*4+0x02000000,0x90b); +reg_write( DDR_REG_BASE + 0x52227*4+0x02000000,0x171); +reg_write( DDR_REG_BASE + 0x52228*4+0x02000000,0xb0a0); +reg_write( DDR_REG_BASE + 0x52229*4+0x02000000,0xb0a1); +reg_write( DDR_REG_BASE + 0x5222a*4+0x02000000,0xf006); +reg_write( DDR_REG_BASE + 0x5222b*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x5222c*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE + 0x5222d*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5222e*4+0x02000000,0x49); +reg_write( DDR_REG_BASE + 0x5222f*4+0x02000000,0xb021); +reg_write( DDR_REG_BASE + 0x52230*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE + 0x52231*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52232*4+0x02000000,0x7b6); +reg_write( DDR_REG_BASE + 0x52233*4+0x02000000,0xed21); +reg_write( DDR_REG_BASE + 0x52234*4+0x02000000,0x8ee0); +reg_write( DDR_REG_BASE + 0x52235*4+0x02000000,0x2544); +reg_write( DDR_REG_BASE + 0x52236*4+0x02000000,0x108b); +reg_write( DDR_REG_BASE + 0x52237*4+0x02000000,0x2544); +reg_write( DDR_REG_BASE + 0x52238*4+0x02000000,0x105b); +reg_write( DDR_REG_BASE + 0x52239*4+0x02000000,0xf017); +reg_write( DDR_REG_BASE + 0x5223a*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x5223b*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x5223c*4+0x02000000,0x2553); +reg_write( DDR_REG_BASE + 0x5223d*4+0x02000000,0x1041); +reg_write( DDR_REG_BASE + 0x5223e*4+0x02000000,0x7905); +reg_write( DDR_REG_BASE + 0x5223f*4+0x02000000,0x4061); +reg_write( DDR_REG_BASE + 0x52240*4+0x02000000,0xf82d); +reg_write( DDR_REG_BASE + 0x52241*4+0x02000000,0xb11); +reg_write( DDR_REG_BASE + 0x52242*4+0x02000000,0x3030); +reg_write( DDR_REG_BASE + 0x52243*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE + 0x52244*4+0x02000000,0x79ef); +reg_write( DDR_REG_BASE + 0x52245*4+0x02000000,0x95e); +reg_write( DDR_REG_BASE + 0x52246*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x52247*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52248*4+0x02000000,0xb0d); +reg_write( DDR_REG_BASE + 0x52249*4+0x02000000,0x1030); +reg_write( DDR_REG_BASE + 0x5224a*4+0x02000000,0x79ef); +reg_write( DDR_REG_BASE + 0x5224b*4+0x02000000,0x952); +reg_write( DDR_REG_BASE + 0x5224c*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x5224d*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x5224e*4+0x02000000,0x71e5); +reg_write( DDR_REG_BASE + 0x5224f*4+0x02000000,0x8e01); +reg_write( DDR_REG_BASE + 0x52250*4+0x02000000,0x8d5); +reg_write( DDR_REG_BASE + 0x52251*4+0x02000000,0x83e5); +reg_write( DDR_REG_BASE + 0x52252*4+0x02000000,0x4063); +reg_write( DDR_REG_BASE + 0x52253*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x52254*4+0x02000000,0x708b); +reg_write( DDR_REG_BASE + 0x52255*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52256*4+0x02000000,0x49); +reg_write( DDR_REG_BASE + 0x52257*4+0x02000000,0xb43); +reg_write( DDR_REG_BASE + 0x52258*4+0x02000000,0x1030); +reg_write( DDR_REG_BASE + 0x52259*4+0x02000000,0x2344); +reg_write( DDR_REG_BASE + 0x5225a*4+0x02000000,0x109b); +reg_write( DDR_REG_BASE + 0x5225b*4+0x02000000,0x8ee2); +reg_write( DDR_REG_BASE + 0x5225c*4+0x02000000,0x2344); +reg_write( DDR_REG_BASE + 0x5225d*4+0x02000000,0x104d); +reg_write( DDR_REG_BASE + 0x5225e*4+0x02000000,0xf015); +reg_write( DDR_REG_BASE + 0x5225f*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x52260*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x52261*4+0x02000000,0x2353); +reg_write( DDR_REG_BASE + 0x52262*4+0x02000000,0x1041); +reg_write( DDR_REG_BASE + 0x52263*4+0x02000000,0x7905); +reg_write( DDR_REG_BASE + 0x52264*4+0x02000000,0x4063); +reg_write( DDR_REG_BASE + 0x52265*4+0x02000000,0xf81b); +reg_write( DDR_REG_BASE + 0x52266*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE + 0x52267*4+0x02000000,0xed06); +reg_write( DDR_REG_BASE + 0x52268*4+0x02000000,0x79ef); +reg_write( DDR_REG_BASE + 0x52269*4+0x02000000,0x916); +reg_write( DDR_REG_BASE + 0x5226a*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x5226b*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x5226c*4+0x02000000,0xb0d); +reg_write( DDR_REG_BASE + 0x5226d*4+0x02000000,0x3030); +reg_write( DDR_REG_BASE + 0x5226e*4+0x02000000,0x79ef); +reg_write( DDR_REG_BASE + 0x5226f*4+0x02000000,0x90a); +reg_write( DDR_REG_BASE + 0x52270*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x52271*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x52272*4+0x02000000,0x71e5); +reg_write( DDR_REG_BASE + 0x52273*4+0x02000000,0x8e03); +reg_write( DDR_REG_BASE + 0x52274*4+0x02000000,0x8d7); +reg_write( DDR_REG_BASE + 0x52275*4+0x02000000,0x83e5); +reg_write( DDR_REG_BASE + 0x52276*4+0x02000000,0x40a1); +reg_write( DDR_REG_BASE + 0x52277*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE + 0x52278*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE + 0x52279*4+0x02000000,0x1ea); +reg_write( DDR_REG_BASE + 0x5227a*4+0x02000000,0x9300); +reg_write( DDR_REG_BASE + 0x5227b*4+0x02000000,0x42c3); +reg_write( DDR_REG_BASE + 0x5227c*4+0x02000000,0x9012); +reg_write( DDR_REG_BASE + 0x5227d*4+0x02000000,0x402); +reg_write( DDR_REG_BASE + 0x5227e*4+0x02000000,0x2004); +reg_write( DDR_REG_BASE + 0x5227f*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x52280*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52281*4+0x02000000,0x3f00); +reg_write( DDR_REG_BASE + 0x52282*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x52283*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x52284*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52285*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x52286*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x52287*4+0x02000000,0xf8c); +reg_write( DDR_REG_BASE + 0x52288*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x52289*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5228a*4+0x02000000,0x2405); +reg_write( DDR_REG_BASE + 0x5228b*4+0x02000000,0x1080); +reg_write( DDR_REG_BASE + 0x5228c*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE + 0x5228d*4+0x02000000,0x6a04); +reg_write( DDR_REG_BASE + 0x5228e*4+0x02000000,0x2196); +reg_write( DDR_REG_BASE + 0x5228f*4+0x02000000,0x6); +reg_write( DDR_REG_BASE + 0x52290*4+0x02000000,0x7885); +reg_write( DDR_REG_BASE + 0x52291*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE + 0x52292*4+0x02000000,0x9321); +reg_write( DDR_REG_BASE + 0x52293*4+0x02000000,0x6a02); +reg_write( DDR_REG_BASE + 0x52294*4+0x02000000,0x7885); +reg_write( DDR_REG_BASE + 0x52295*4+0x02000000,0xb9c5); +reg_write( DDR_REG_BASE + 0x52296*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE + 0x52297*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x52298*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x52299*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x5229a*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x5229b*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x5229c*4+0x02000000,0x2105); +reg_write( DDR_REG_BASE + 0x5229d*4+0x02000000,0x2); +reg_write( DDR_REG_BASE + 0x5229e*4+0x02000000,0x271a); +reg_write( DDR_REG_BASE + 0x5229f*4+0x02000000,0x1f80); +reg_write( DDR_REG_BASE + 0x522a0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x522a1*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE + 0x522a2*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x522a3*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x522a4*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x522a5*4+0x02000000,0x154); +reg_write( DDR_REG_BASE + 0x522a6*4+0x02000000,0x9100); +reg_write( DDR_REG_BASE + 0x522a7*4+0x02000000,0x7845); +reg_write( DDR_REG_BASE + 0x522a8*4+0x02000000,0xb88a); +reg_write( DDR_REG_BASE + 0x522a9*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x522aa*4+0x02000000,0x42c3); +reg_write( DDR_REG_BASE + 0x522ab*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x522ac*4+0x02000000,0x110); +reg_write( DDR_REG_BASE + 0x522ad*4+0x02000000,0x9200); +reg_write( DDR_REG_BASE + 0x522ae*4+0x02000000,0x204f); +reg_write( DDR_REG_BASE + 0x522af*4+0x02000000,0x101); +reg_write( DDR_REG_BASE + 0x522b0*4+0x02000000,0xb8a4); +reg_write( DDR_REG_BASE + 0x522b1*4+0x02000000,0xb220); +reg_write( DDR_REG_BASE + 0x522b2*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x522b3*4+0x02000000,0xb200); +reg_write( DDR_REG_BASE + 0x522b4*4+0x02000000,0x2032); +reg_write( DDR_REG_BASE + 0x522b5*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x522b6*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x522b7*4+0x02000000,0x18); +reg_write( DDR_REG_BASE + 0x522b8*4+0x02000000,0xb9e7); +reg_write( DDR_REG_BASE + 0x522b9*4+0x02000000,0x7ce0); +reg_write( DDR_REG_BASE + 0x522ba*4+0x02000000,0xb9c6); +reg_write( DDR_REG_BASE + 0x522bb*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x522bc*4+0x02000000,0x4020); +reg_write( DDR_REG_BASE + 0x522bd*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x522be*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x522bf*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x522c0*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x522c1*4+0x02000000,0x2482); +reg_write( DDR_REG_BASE + 0x522c2*4+0x02000000,0x3409); +reg_write( DDR_REG_BASE + 0x522c3*4+0x02000000,0x216f); +reg_write( DDR_REG_BASE + 0x522c4*4+0x02000000,0x243); +reg_write( DDR_REG_BASE + 0x522c5*4+0x02000000,0x4508); +reg_write( DDR_REG_BASE + 0x522c6*4+0x02000000,0x8900); +reg_write( DDR_REG_BASE + 0x522c7*4+0x02000000,0x11fd); +reg_write( DDR_REG_BASE + 0x522c8*4+0x02000000,0x808f); +reg_write( DDR_REG_BASE + 0x522c9*4+0x02000000,0x1145); +reg_write( DDR_REG_BASE + 0x522ca*4+0x02000000,0x83); +reg_write( DDR_REG_BASE + 0x522cb*4+0x02000000,0x89df); +reg_write( DDR_REG_BASE + 0x522cc*4+0x02000000,0x1209); +reg_write( DDR_REG_BASE + 0x522cd*4+0x02000000,0x309e); +reg_write( DDR_REG_BASE + 0x522ce*4+0x02000000,0xc046); +reg_write( DDR_REG_BASE + 0x522cf*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE + 0x522d0*4+0x02000000,0x3e80); +reg_write( DDR_REG_BASE + 0x522d1*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x522d2*4+0x02000000,0xaee); +reg_write( DDR_REG_BASE + 0x522d3*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x522d4*4+0x02000000,0xdab4); +reg_write( DDR_REG_BASE + 0x522d5*4+0x02000000,0xc08d); +reg_write( DDR_REG_BASE + 0x522d6*4+0x02000000,0xae6); +reg_write( DDR_REG_BASE + 0x522d7*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x522d8*4+0x02000000,0xdab4); +reg_write( DDR_REG_BASE + 0x522d9*4+0x02000000,0x2578); +reg_write( DDR_REG_BASE + 0x522da*4+0x02000000,0x1140); +reg_write( DDR_REG_BASE + 0x522db*4+0x02000000,0xc048); +reg_write( DDR_REG_BASE + 0x522dc*4+0x02000000,0x254f); +reg_write( DDR_REG_BASE + 0x522dd*4+0x02000000,0x1080); +reg_write( DDR_REG_BASE + 0x522de*4+0x02000000,0x2078); +reg_write( DDR_REG_BASE + 0x522df*4+0x02000000,0x101); +reg_write( DDR_REG_BASE + 0x522e0*4+0x02000000,0xc008); +reg_write( DDR_REG_BASE + 0x522e1*4+0x02000000,0xbfe2); +reg_write( DDR_REG_BASE + 0x522e2*4+0x02000000,0x7bc5); +reg_write( DDR_REG_BASE + 0x522e3*4+0x02000000,0x7905); +reg_write( DDR_REG_BASE + 0x522e4*4+0x02000000,0x2578); +reg_write( DDR_REG_BASE + 0x522e5*4+0x02000000,0x10c0); +reg_write( DDR_REG_BASE + 0x522e6*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x522e7*4+0x02000000,0xc047); +reg_write( DDR_REG_BASE + 0x522e8*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x522e9*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE + 0x522ea*4+0x02000000,0x20ca); +reg_write( DDR_REG_BASE + 0x522eb*4+0x02000000,0x3e1); +reg_write( DDR_REG_BASE + 0x522ec*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE + 0x522ed*4+0x02000000,0x2579); +reg_write( DDR_REG_BASE + 0x522ee*4+0x02000000,0x1180); +reg_write( DDR_REG_BASE + 0x522ef*4+0x02000000,0xc04b); +reg_write( DDR_REG_BASE + 0x522f0*4+0x02000000,0x2542); +reg_write( DDR_REG_BASE + 0x522f1*4+0x02000000,0x1240); +reg_write( DDR_REG_BASE + 0x522f2*4+0x02000000,0xc049); +reg_write( DDR_REG_BASE + 0x522f3*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE + 0x522f4*4+0x02000000,0x2678); +reg_write( DDR_REG_BASE + 0x522f5*4+0x02000000,0x301b); +reg_write( DDR_REG_BASE + 0x522f6*4+0x02000000,0x70ed); +reg_write( DDR_REG_BASE + 0x522f7*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x522f8*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x522f9*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x522fa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x522fb*4+0x02000000,0x70cd); +reg_write( DDR_REG_BASE + 0x522fc*4+0x02000000,0xc34a); +reg_write( DDR_REG_BASE + 0x522fd*4+0x02000000,0xc04c); +reg_write( DDR_REG_BASE + 0x522fe*4+0x02000000,0xf0a5); +reg_write( DDR_REG_BASE + 0x522ff*4+0x02000000,0x4300); +reg_write( DDR_REG_BASE + 0x52300*4+0x02000000,0x2744); +reg_write( DDR_REG_BASE + 0x52301*4+0x02000000,0x17c0); +reg_write( DDR_REG_BASE + 0x52302*4+0x02000000,0xc107); +reg_write( DDR_REG_BASE + 0x52303*4+0x02000000,0xe806); +reg_write( DDR_REG_BASE + 0x52304*4+0x02000000,0xb861); +reg_write( DDR_REG_BASE + 0x52305*4+0x02000000,0x801); +reg_write( DDR_REG_BASE + 0x52306*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x52307*4+0x02000000,0x7b7b); +reg_write( DDR_REG_BASE + 0x52308*4+0x02000000,0x9fa); +reg_write( DDR_REG_BASE + 0x52309*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE + 0x5230a*4+0x02000000,0x40e1); +reg_write( DDR_REG_BASE + 0x5230b*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE + 0x5230c*4+0x02000000,0xc00a); +reg_write( DDR_REG_BASE + 0x5230d*4+0x02000000,0x7b0b); +reg_write( DDR_REG_BASE + 0x5230e*4+0x02000000,0xf294); +reg_write( DDR_REG_BASE + 0x5230f*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52310*4+0x02000000,0xf073); +reg_write( DDR_REG_BASE + 0x52311*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52312*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x52313*4+0x02000000,0xaba); +reg_write( DDR_REG_BASE + 0x52314*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x52315*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE + 0x52316*4+0x02000000,0x8d1); +reg_write( DDR_REG_BASE + 0x52317*4+0x02000000,0x30); +reg_write( DDR_REG_BASE + 0x52318*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52319*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x5231a*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5231b*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE + 0x5231c*4+0x02000000,0xa8e1); +reg_write( DDR_REG_BASE + 0x5231d*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x5231e*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE + 0x5231f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52320*4+0x02000000,0x19c); +reg_write( DDR_REG_BASE + 0x52321*4+0x02000000,0xa52); +reg_write( DDR_REG_BASE + 0x52322*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x52323*4+0x02000000,0xdab4); +reg_write( DDR_REG_BASE + 0x52324*4+0x02000000,0xd3f); +reg_write( DDR_REG_BASE + 0x52325*4+0x02000000,0x11f5); +reg_write( DDR_REG_BASE + 0x52326*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52327*4+0x02000000,0x2025); +reg_write( DDR_REG_BASE + 0x52328*4+0x02000000,0x340); +reg_write( DDR_REG_BASE + 0x52329*4+0x02000000,0xf020); +reg_write( DDR_REG_BASE + 0x5232a*4+0x02000000,0xf026); +reg_write( DDR_REG_BASE + 0x5232b*4+0x02000000,0xf02e); +reg_write( DDR_REG_BASE + 0x5232c*4+0x02000000,0xf030); +reg_write( DDR_REG_BASE + 0x5232d*4+0x02000000,0xf004); +reg_write( DDR_REG_BASE + 0x5232e*4+0x02000000,0xf002); +reg_write( DDR_REG_BASE + 0x5232f*4+0x02000000,0xf033); +reg_write( DDR_REG_BASE + 0x52330*4+0x02000000,0xc08d); +reg_write( DDR_REG_BASE + 0x52331*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x52332*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE + 0x52333*4+0x02000000,0x3e80); +reg_write( DDR_REG_BASE + 0x52334*4+0x02000000,0xc103); +reg_write( DDR_REG_BASE + 0x52335*4+0x02000000,0xc208); +reg_write( DDR_REG_BASE + 0x52336*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x52337*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x52338*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE + 0x52339*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5233a*4+0x02000000,0x19c); +reg_write( DDR_REG_BASE + 0x5233b*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x5233c*4+0x02000000,0x40e1); +reg_write( DDR_REG_BASE + 0x5233d*4+0x02000000,0xfb2); +reg_write( DDR_REG_BASE + 0x5233e*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x5233f*4+0x02000000,0x4363); +reg_write( DDR_REG_BASE + 0x52340*4+0x02000000,0x716d); +reg_write( DDR_REG_BASE + 0x52341*4+0x02000000,0xd88c); +reg_write( DDR_REG_BASE + 0x52342*4+0x02000000,0xf02f); +reg_write( DDR_REG_BASE + 0x52343*4+0x02000000,0x70d5); +reg_write( DDR_REG_BASE + 0x52344*4+0x02000000,0x43c9); +reg_write( DDR_REG_BASE + 0x52345*4+0x02000000,0x70cd); +reg_write( DDR_REG_BASE + 0x52346*4+0x02000000,0xf42b); +reg_write( DDR_REG_BASE + 0x52347*4+0x02000000,0xf038); +reg_write( DDR_REG_BASE + 0x52348*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x52349*4+0x02000000,0x3f81); +reg_write( DDR_REG_BASE + 0x5234a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5234b*4+0x02000000,0x19c); +reg_write( DDR_REG_BASE + 0x5234c*4+0x02000000,0x95e); +reg_write( DDR_REG_BASE + 0x5234d*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x5234e*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x5234f*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE + 0x52350*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x52351*4+0x02000000,0x3f81); +reg_write( DDR_REG_BASE + 0x52352*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52353*4+0x02000000,0x19c); +reg_write( DDR_REG_BASE + 0x52354*4+0x02000000,0xf56); +reg_write( DDR_REG_BASE + 0x52355*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x52356*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x52357*4+0x02000000,0xf009); +reg_write( DDR_REG_BASE + 0x52358*4+0x02000000,0xbe2); +reg_write( DDR_REG_BASE + 0x52359*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x5235a*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x5235b*4+0x02000000,0xf005); +reg_write( DDR_REG_BASE + 0x5235c*4+0x02000000,0xc0e); +reg_write( DDR_REG_BASE + 0x5235d*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE + 0x5235e*4+0x02000000,0x40e1); +reg_write( DDR_REG_BASE + 0x5235f*4+0x02000000,0x70cd); +reg_write( DDR_REG_BASE + 0x52360*4+0x02000000,0xf01e); +reg_write( DDR_REG_BASE + 0x52361*4+0x02000000,0xc08d); +reg_write( DDR_REG_BASE + 0x52362*4+0x02000000,0xc103); +reg_write( DDR_REG_BASE + 0x52363*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x52364*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE + 0x52365*4+0x02000000,0x3e80); +reg_write( DDR_REG_BASE + 0x52366*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x52367*4+0x02000000,0x40e1); +reg_write( DDR_REG_BASE + 0x52368*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x52369*4+0x02000000,0x3f83); +reg_write( DDR_REG_BASE + 0x5236a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5236b*4+0x02000000,0x19c); +reg_write( DDR_REG_BASE + 0x5236c*4+0x02000000,0xf4e); +reg_write( DDR_REG_BASE + 0x5236d*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x5236e*4+0x02000000,0x4263); +reg_write( DDR_REG_BASE + 0x5236f*4+0x02000000,0x716d); +reg_write( DDR_REG_BASE + 0x52370*4+0x02000000,0xd8c0); +reg_write( DDR_REG_BASE + 0x52371*4+0x02000000,0xc104); +reg_write( DDR_REG_BASE + 0x52372*4+0x02000000,0xc20b); +reg_write( DDR_REG_BASE + 0x52373*4+0x02000000,0x6038); +reg_write( DDR_REG_BASE + 0x52374*4+0x02000000,0xc10c); +reg_write( DDR_REG_BASE + 0x52375*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x52376*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x52377*4+0x02000000,0x3f81); +reg_write( DDR_REG_BASE + 0x52378*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52379*4+0x02000000,0x19c); +reg_write( DDR_REG_BASE + 0x5237a*4+0x02000000,0xaf2); +reg_write( DDR_REG_BASE + 0x5237b*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x5237c*4+0x02000000,0x716c); +reg_write( DDR_REG_BASE + 0x5237d*4+0x02000000,0x4669); +reg_write( DDR_REG_BASE + 0x5237e*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x5237f*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x52380*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52381*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE + 0x52382*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE + 0x52383*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x52384*4+0x02000000,0x7002); +reg_write( DDR_REG_BASE + 0x52385*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52386*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE + 0x52387*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x52388*4+0x02000000,0x813); +reg_write( DDR_REG_BASE + 0x52389*4+0x02000000,0x80b4); +reg_write( DDR_REG_BASE + 0x5238a*4+0x02000000,0x78ef); +reg_write( DDR_REG_BASE + 0x5238b*4+0x02000000,0xd06); +reg_write( DDR_REG_BASE + 0x5238c*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE + 0x5238d*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE + 0x5238e*4+0x02000000,0xca09); +reg_write( DDR_REG_BASE + 0x5238f*4+0x02000000,0xe894); +reg_write( DDR_REG_BASE + 0x52390*4+0x02000000,0xd0f); +reg_write( DDR_REG_BASE + 0x52391*4+0x02000000,0x10f1); +reg_write( DDR_REG_BASE + 0x52392*4+0x02000000,0x79ef); +reg_write( DDR_REG_BASE + 0x52393*4+0x02000000,0xc7e); +reg_write( DDR_REG_BASE + 0x52394*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE + 0x52395*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x52396*4+0x02000000,0xf00c); +reg_write( DDR_REG_BASE + 0x52397*4+0x02000000,0xc009); +reg_write( DDR_REG_BASE + 0x52398*4+0x02000000,0x815); +reg_write( DDR_REG_BASE + 0x52399*4+0x02000000,0x134); +reg_write( DDR_REG_BASE + 0x5239a*4+0x02000000,0x7bef); +reg_write( DDR_REG_BASE + 0x5239b*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE + 0x5239c*4+0x02000000,0xc106); +reg_write( DDR_REG_BASE + 0x5239d*4+0x02000000,0xc204); +reg_write( DDR_REG_BASE + 0x5239e*4+0x02000000,0xbb2); +reg_write( DDR_REG_BASE + 0x5239f*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE + 0x523a0*4+0x02000000,0x2052); +reg_write( DDR_REG_BASE + 0x523a1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x523a2*4+0x02000000,0x71e5); +reg_write( DDR_REG_BASE + 0x523a3*4+0x02000000,0x72f5); +reg_write( DDR_REG_BASE + 0x523a4*4+0x02000000,0x6b6); +reg_write( DDR_REG_BASE + 0x523a5*4+0x02000000,0xffe5); +reg_write( DDR_REG_BASE + 0x523a6*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x523a7*4+0x02000000,0xd19); +reg_write( DDR_REG_BASE + 0x523a8*4+0x02000000,0x10d1); +reg_write( DDR_REG_BASE + 0x523a9*4+0x02000000,0xca09); +reg_write( DDR_REG_BASE + 0x523aa*4+0x02000000,0xe888); +reg_write( DDR_REG_BASE + 0x523ab*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x523ac*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x523ad*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x523ae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x523af*4+0x02000000,0xb8e5); +reg_write( DDR_REG_BASE + 0x523b0*4+0x02000000,0xc7c); +reg_write( DDR_REG_BASE + 0x523b1*4+0x02000000,0xfe42); +reg_write( DDR_REG_BASE + 0x523b2*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x523b3*4+0x02000000,0x7003); +reg_write( DDR_REG_BASE + 0x523b4*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x523b5*4+0x02000000,0xf); +reg_write( DDR_REG_BASE + 0x523b6*4+0x02000000,0x2480); +reg_write( DDR_REG_BASE + 0x523b7*4+0x02000000,0x3409); +reg_write( DDR_REG_BASE + 0x523b8*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x523b9*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x523ba*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x523bb*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x523bc*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x523bd*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x523be*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x523bf*4+0x02000000,0xc1b0); +reg_write( DDR_REG_BASE + 0x523c0*4+0x02000000,0xc04f); +reg_write( DDR_REG_BASE + 0x523c1*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x523c2*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x523c3*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x523c4*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x523c5*4+0x02000000,0xefa); +reg_write( DDR_REG_BASE + 0x523c6*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x523c7*4+0x02000000,0xc046); +reg_write( DDR_REG_BASE + 0x523c8*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x523c9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x523ca*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE + 0x523cb*4+0x02000000,0x4100); +reg_write( DDR_REG_BASE + 0x523cc*4+0x02000000,0x4200); +reg_write( DDR_REG_BASE + 0x523cd*4+0x02000000,0xbee); +reg_write( DDR_REG_BASE + 0x523ce*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x523cf*4+0x02000000,0x4300); +reg_write( DDR_REG_BASE + 0x523d0*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x523d1*4+0x02000000,0x81e); +reg_write( DDR_REG_BASE + 0x523d2*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE + 0x523d3*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x523d4*4+0x02000000,0x47cb); +reg_write( DDR_REG_BASE + 0x523d5*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x523d6*4+0x02000000,0xe004); +reg_write( DDR_REG_BASE + 0x523d7*4+0x02000000,0x1f22); +reg_write( DDR_REG_BASE + 0x523d8*4+0x02000000,0x1015); +reg_write( DDR_REG_BASE + 0x523d9*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE + 0x523da*4+0x02000000,0xfc7); +reg_write( DDR_REG_BASE + 0x523db*4+0x02000000,0x1fa7); +reg_write( DDR_REG_BASE + 0x523dc*4+0x02000000,0x101c); +reg_write( DDR_REG_BASE + 0x523dd*4+0x02000000,0x1fa8); +reg_write( DDR_REG_BASE + 0x523de*4+0x02000000,0x101c); +reg_write( DDR_REG_BASE + 0x523df*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x523e0*4+0x02000000,0xd9ff); +reg_write( DDR_REG_BASE + 0x523e1*4+0x02000000,0xb700); +reg_write( DDR_REG_BASE + 0x523e2*4+0x02000000,0x1ffe); +reg_write( DDR_REG_BASE + 0x523e3*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x523e4*4+0x02000000,0xb705); +reg_write( DDR_REG_BASE + 0x523e5*4+0x02000000,0xbd2); +reg_write( DDR_REG_BASE + 0x523e6*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x523e7*4+0x02000000,0x1ffc); +reg_write( DDR_REG_BASE + 0x523e8*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x523e9*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE + 0x523ea*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x523eb*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE + 0x523ec*4+0x02000000,0x8e04); +reg_write( DDR_REG_BASE + 0x523ed*4+0x02000000,0xc048); +reg_write( DDR_REG_BASE + 0x523ee*4+0x02000000,0x206f); +reg_write( DDR_REG_BASE + 0x523ef*4+0x02000000,0x243); +reg_write( DDR_REG_BASE + 0x523f0*4+0x02000000,0x10fd); +reg_write( DDR_REG_BASE + 0x523f1*4+0x02000000,0x809e); +reg_write( DDR_REG_BASE + 0x523f2*4+0x02000000,0x1420); +reg_write( DDR_REG_BASE + 0x523f3*4+0x02000000,0x301b); +reg_write( DDR_REG_BASE + 0x523f4*4+0x02000000,0x265f); +reg_write( DDR_REG_BASE + 0x523f5*4+0x02000000,0x3100); +reg_write( DDR_REG_BASE + 0x523f6*4+0x02000000,0x780d); +reg_write( DDR_REG_BASE + 0x523f7*4+0x02000000,0x791c); +reg_write( DDR_REG_BASE + 0x523f8*4+0x02000000,0x793c); +reg_write( DDR_REG_BASE + 0x523f9*4+0x02000000,0x793c); +reg_write( DDR_REG_BASE + 0x523fa*4+0x02000000,0x793c); +reg_write( DDR_REG_BASE + 0x523fb*4+0x02000000,0x793c); +reg_write( DDR_REG_BASE + 0x523fc*4+0x02000000,0x8e05); +reg_write( DDR_REG_BASE + 0x523fd*4+0x02000000,0x793c); +reg_write( DDR_REG_BASE + 0x523fe*4+0x02000000,0x793c); +reg_write( DDR_REG_BASE + 0x523ff*4+0x02000000,0xc04d); +reg_write( DDR_REG_BASE + 0x52400*4+0x02000000,0x7824); +reg_write( DDR_REG_BASE + 0x52401*4+0x02000000,0xc04e); +reg_write( DDR_REG_BASE + 0x52402*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE + 0x52403*4+0x02000000,0x2304); +reg_write( DDR_REG_BASE + 0x52404*4+0x02000000,0x305b); +reg_write( DDR_REG_BASE + 0x52405*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x52406*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x52407*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x52408*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52409*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE + 0x5240a*4+0x02000000,0x8e03); +reg_write( DDR_REG_BASE + 0x5240b*4+0x02000000,0xc04c); +reg_write( DDR_REG_BASE + 0x5240c*4+0x02000000,0x8e02); +reg_write( DDR_REG_BASE + 0x5240d*4+0x02000000,0x235); +reg_write( DDR_REG_BASE + 0x5240e*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x5240f*4+0x02000000,0xc04b); +reg_write( DDR_REG_BASE + 0x52410*4+0x02000000,0xe17); +reg_write( DDR_REG_BASE + 0x52411*4+0x02000000,0x317e); +reg_write( DDR_REG_BASE + 0x52412*4+0x02000000,0x202f); +reg_write( DDR_REG_BASE + 0x52413*4+0x02000000,0x6c0); +reg_write( DDR_REG_BASE + 0x52414*4+0x02000000,0x1e05); +reg_write( DDR_REG_BASE + 0x52415*4+0x02000000,0x16c2); +reg_write( DDR_REG_BASE + 0x52416*4+0x02000000,0x1e04); +reg_write( DDR_REG_BASE + 0x52417*4+0x02000000,0x16c2); +reg_write( DDR_REG_BASE + 0x52418*4+0x02000000,0xae02); +reg_write( DDR_REG_BASE + 0x52419*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE + 0x5241a*4+0x02000000,0xae03); +reg_write( DDR_REG_BASE + 0x5241b*4+0x02000000,0x770c); +reg_write( DDR_REG_BASE + 0x5241c*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x5241d*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x5241e*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x5241f*4+0x02000000,0xf0bb); +reg_write( DDR_REG_BASE + 0x52420*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x52421*4+0x02000000,0xc101); +reg_write( DDR_REG_BASE + 0x52422*4+0x02000000,0xae01); +reg_write( DDR_REG_BASE + 0x52423*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x52424*4+0x02000000,0x4200); +reg_write( DDR_REG_BASE + 0x52425*4+0x02000000,0x8e00); +reg_write( DDR_REG_BASE + 0x52426*4+0x02000000,0xb9c4); +reg_write( DDR_REG_BASE + 0x52427*4+0x02000000,0xe906); +reg_write( DDR_REG_BASE + 0x52428*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE + 0x52429*4+0x02000000,0x901); +reg_write( DDR_REG_BASE + 0x5242a*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x5242b*4+0x02000000,0x7a5b); +reg_write( DDR_REG_BASE + 0x5242c*4+0x02000000,0xe806); +reg_write( DDR_REG_BASE + 0x5242d*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x5242e*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE + 0x5242f*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52430*4+0x02000000,0x49); +reg_write( DDR_REG_BASE + 0x52431*4+0x02000000,0xf006); +reg_write( DDR_REG_BASE + 0x52432*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x52433*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE + 0x52434*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52435*4+0x02000000,0x23); +reg_write( DDR_REG_BASE + 0x52436*4+0x02000000,0x784f); +reg_write( DDR_REG_BASE + 0x52437*4+0x02000000,0x790b); +reg_write( DDR_REG_BASE + 0x52438*4+0x02000000,0xc04a); +reg_write( DDR_REG_BASE + 0x52439*4+0x02000000,0xf29f); +reg_write( DDR_REG_BASE + 0x5243a*4+0x02000000,0xc00a); +reg_write( DDR_REG_BASE + 0x5243b*4+0x02000000,0xf6e); +reg_write( DDR_REG_BASE + 0x5243c*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x5243d*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x5243e*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x5243f*4+0x02000000,0xc2e); +reg_write( DDR_REG_BASE + 0x52440*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE + 0x52441*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x52442*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52443*4+0x02000000,0xc049); +reg_write( DDR_REG_BASE + 0x52444*4+0x02000000,0xf002); +reg_write( DDR_REG_BASE + 0x52445*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE + 0x52446*4+0x02000000,0xe59f); +reg_write( DDR_REG_BASE + 0x52447*4+0x02000000,0x10c); +reg_write( DDR_REG_BASE + 0x52448*4+0x02000000,0x9); +reg_write( DDR_REG_BASE + 0x52449*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE + 0x5244a*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x5244b*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x5244c*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x5244d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5244e*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x5244f*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x52450*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE + 0x52451*4+0x02000000,0xe040); +reg_write( DDR_REG_BASE + 0x52452*4+0x02000000,0xb0a0); +reg_write( DDR_REG_BASE + 0x52453*4+0x02000000,0x206f); +reg_write( DDR_REG_BASE + 0x52454*4+0x02000000,0x243); +reg_write( DDR_REG_BASE + 0x52455*4+0x02000000,0x10fd); +reg_write( DDR_REG_BASE + 0x52456*4+0x02000000,0x8080); +reg_write( DDR_REG_BASE + 0x52457*4+0x02000000,0x82d); +reg_write( DDR_REG_BASE + 0x52458*4+0x02000000,0x15f); +reg_write( DDR_REG_BASE + 0x52459*4+0x02000000,0x8e25); +reg_write( DDR_REG_BASE + 0x5245a*4+0x02000000,0x8e44); +reg_write( DDR_REG_BASE + 0x5245b*4+0x02000000,0xf00f); +reg_write( DDR_REG_BASE + 0x5245c*4+0x02000000,0x221a); +reg_write( DDR_REG_BASE + 0x5245d*4+0x02000000,0xf83); +reg_write( DDR_REG_BASE + 0x5245e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5245f*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x52460*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x52461*4+0x02000000,0x7144); +reg_write( DDR_REG_BASE + 0x52462*4+0x02000000,0x7865); +reg_write( DDR_REG_BASE + 0x52463*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x52464*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x52465*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x52466*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x52467*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x52468*4+0x02000000,0xb0a0); +reg_write( DDR_REG_BASE + 0x52469*4+0x02000000,0x9e9); +reg_write( DDR_REG_BASE + 0x5246a*4+0x02000000,0x8085); +reg_write( DDR_REG_BASE + 0x5246b*4+0x02000000,0xf00e); +reg_write( DDR_REG_BASE + 0x5246c*4+0x02000000,0x231a); +reg_write( DDR_REG_BASE + 0x5246d*4+0x02000000,0x3f81); +reg_write( DDR_REG_BASE + 0x5246e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5246f*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x52470*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x52471*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x52472*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x52473*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x52474*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x52475*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x52476*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x52477*4+0x02000000,0xb0a0); +reg_write( DDR_REG_BASE + 0x52478*4+0x02000000,0xd72); +reg_write( DDR_REG_BASE + 0x52479*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x5247a*4+0x02000000,0xd814); +reg_write( DDR_REG_BASE + 0x5247b*4+0x02000000,0xeea); +reg_write( DDR_REG_BASE + 0x5247c*4+0x02000000,0xff8f); +reg_write( DDR_REG_BASE + 0x5247d*4+0x02000000,0xc00f); +reg_write( DDR_REG_BASE + 0x5247e*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x5247f*4+0x02000000,0xbae); +reg_write( DDR_REG_BASE + 0x52480*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE + 0x52481*4+0x02000000,0x7810); +reg_write( DDR_REG_BASE + 0x52482*4+0x02000000,0x8e04); +reg_write( DDR_REG_BASE + 0x52483*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE + 0x52484*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52485*4+0x02000000,0xc047); +reg_write( DDR_REG_BASE + 0x52486*4+0x02000000,0xf034); +reg_write( DDR_REG_BASE + 0x52487*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE + 0x52488*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x52489*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x5248a*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x5248b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5248c*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE + 0x5248d*4+0x02000000,0x2105); +reg_write( DDR_REG_BASE + 0x5248e*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x5248f*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x52490*4+0x02000000,0x170); +reg_write( DDR_REG_BASE + 0x52491*4+0x02000000,0x9000); +reg_write( DDR_REG_BASE + 0x52492*4+0x02000000,0xc245); +reg_write( DDR_REG_BASE + 0x52493*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE + 0x52494*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x52495*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x52496*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x52497*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x52498*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x52499*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x5249a*4+0x02000000,0x166); +reg_write( DDR_REG_BASE + 0x5249b*4+0x02000000,0x9000); +reg_write( DDR_REG_BASE + 0x5249c*4+0x02000000,0xe806); +reg_write( DDR_REG_BASE + 0x5249d*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x5249e*4+0x02000000,0x7810); +reg_write( DDR_REG_BASE + 0x5249f*4+0x02000000,0x200f); +reg_write( DDR_REG_BASE + 0x524a0*4+0x02000000,0x80); +reg_write( DDR_REG_BASE + 0x524a1*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE + 0x524a2*4+0x02000000,0x7144); +reg_write( DDR_REG_BASE + 0x524a3*4+0x02000000,0xae5); +reg_write( DDR_REG_BASE + 0x524a4*4+0x02000000,0x8234); +reg_write( DDR_REG_BASE + 0x524a5*4+0x02000000,0x4040); +reg_write( DDR_REG_BASE + 0x524a6*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x524a7*4+0x02000000,0x262f); +reg_write( DDR_REG_BASE + 0x524a8*4+0x02000000,0xf008); +reg_write( DDR_REG_BASE + 0x524a9*4+0x02000000,0xf40b); +reg_write( DDR_REG_BASE + 0x524aa*4+0x02000000,0xc201); +reg_write( DDR_REG_BASE + 0x524ab*4+0x02000000,0xc303); +reg_write( DDR_REG_BASE + 0x524ac*4+0x02000000,0x740c); +reg_write( DDR_REG_BASE + 0x524ad*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x524ae*4+0x02000000,0xe); +reg_write( DDR_REG_BASE + 0x524af*4+0x02000000,0x3); +reg_write( DDR_REG_BASE + 0x524b0*4+0x02000000,0xf02); +reg_write( DDR_REG_BASE + 0x524b1*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE + 0x524b2*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x524b3*4+0x02000000,0xc105); +reg_write( DDR_REG_BASE + 0x524b4*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE + 0x524b5*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x524b6*4+0x02000000,0xc047); +reg_write( DDR_REG_BASE + 0x524b7*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE + 0x524b8*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE + 0x524b9*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE + 0x524ba*4+0x02000000,0x8e25); +reg_write( DDR_REG_BASE + 0x524bb*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE + 0x524bc*4+0x02000000,0x997); +reg_write( DDR_REG_BASE + 0x524bd*4+0x02000000,0x8025); +reg_write( DDR_REG_BASE + 0x524be*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x524bf*4+0x02000000,0xe42); +reg_write( DDR_REG_BASE + 0x524c0*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE + 0x524c1*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x524c2*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE + 0x524c3*4+0x02000000,0x262f); +reg_write( DDR_REG_BASE + 0x524c4*4+0x02000000,0xf008); +reg_write( DDR_REG_BASE + 0x524c5*4+0x02000000,0xf581); +reg_write( DDR_REG_BASE + 0x524c6*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE + 0x524c7*4+0x02000000,0x2008); +reg_write( DDR_REG_BASE + 0x524c8*4+0x02000000,0x340); +reg_write( DDR_REG_BASE + 0x524c9*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x524ca*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x524cb*4+0x02000000,0xc049); +reg_write( DDR_REG_BASE + 0x524cc*4+0x02000000,0xc009); +reg_write( DDR_REG_BASE + 0x524cd*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x524ce*4+0x02000000,0x11); +reg_write( DDR_REG_BASE + 0x524cf*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x524d0*4+0x02000000,0xf4e); +reg_write( DDR_REG_BASE + 0x524d1*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x524d2*4+0x02000000,0xc201); +reg_write( DDR_REG_BASE + 0x524d3*4+0x02000000,0xc26); +reg_write( DDR_REG_BASE + 0x524d4*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x524d5*4+0x02000000,0xc00a); +reg_write( DDR_REG_BASE + 0x524d6*4+0x02000000,0xc502); +reg_write( DDR_REG_BASE + 0x524d7*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x524d8*4+0x02000000,0x7704); +reg_write( DDR_REG_BASE + 0x524d9*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x524da*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x524db*4+0x02000000,0x7014); +reg_write( DDR_REG_BASE + 0x524dc*4+0x02000000,0x688); +reg_write( DDR_REG_BASE + 0x524dd*4+0x02000000,0xffca); +reg_write( DDR_REG_BASE + 0x524de*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE + 0x524df*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x524e0*4+0x02000000,0x13); +reg_write( DDR_REG_BASE + 0x524e1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x524e2*4+0x02000000,0x7812); +reg_write( DDR_REG_BASE + 0x524e3*4+0x02000000,0x202f); +reg_write( DDR_REG_BASE + 0x524e4*4+0x02000000,0xd); +reg_write( DDR_REG_BASE + 0x524e5*4+0x02000000,0xf26); +reg_write( DDR_REG_BASE + 0x524e6*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x524e7*4+0x02000000,0xb8c0); +reg_write( DDR_REG_BASE + 0x524e8*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE + 0x524e9*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x524ea*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE + 0x524eb*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x524ec*4+0x02000000,0x14); +reg_write( DDR_REG_BASE + 0x524ed*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x524ee*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x524ef*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x524f0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x524f1*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x524f2*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE + 0x524f3*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE + 0x524f4*4+0x02000000,0xe040); +reg_write( DDR_REG_BASE + 0x524f5*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE + 0x524f6*4+0x02000000,0x6038); +reg_write( DDR_REG_BASE + 0x524f7*4+0x02000000,0x2049); +reg_write( DDR_REG_BASE + 0x524f8*4+0x02000000,0x7c1); +reg_write( DDR_REG_BASE + 0x524f9*4+0x02000000,0xb220); +reg_write( DDR_REG_BASE + 0x524fa*4+0x02000000,0x206f); +reg_write( DDR_REG_BASE + 0x524fb*4+0x02000000,0x243); +reg_write( DDR_REG_BASE + 0x524fc*4+0x02000000,0x10fd); +reg_write( DDR_REG_BASE + 0x524fd*4+0x02000000,0x809e); +reg_write( DDR_REG_BASE + 0x524fe*4+0x02000000,0xe37); +reg_write( DDR_REG_BASE + 0x524ff*4+0x02000000,0x315f); +reg_write( DDR_REG_BASE + 0x52500*4+0x02000000,0x8e45); +reg_write( DDR_REG_BASE + 0x52501*4+0x02000000,0x8e64); +reg_write( DDR_REG_BASE + 0x52502*4+0x02000000,0xf00e); +reg_write( DDR_REG_BASE + 0x52503*4+0x02000000,0x231a); +reg_write( DDR_REG_BASE + 0x52504*4+0x02000000,0xf8c); +reg_write( DDR_REG_BASE + 0x52505*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52506*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x52507*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x52508*4+0x02000000,0x7164); +reg_write( DDR_REG_BASE + 0x52509*4+0x02000000,0x7885); +reg_write( DDR_REG_BASE + 0x5250a*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x5250b*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x5250c*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x5250d*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x5250e*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x5250f*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE + 0x52510*4+0x02000000,0xae7); +reg_write( DDR_REG_BASE + 0x52511*4+0x02000000,0x80c5); +reg_write( DDR_REG_BASE + 0x52512*4+0x02000000,0xdba); +reg_write( DDR_REG_BASE + 0x52513*4+0x02000000,0xff8f); +reg_write( DDR_REG_BASE + 0x52514*4+0x02000000,0x206f); +reg_write( DDR_REG_BASE + 0x52515*4+0x02000000,0x243); +reg_write( DDR_REG_BASE + 0x52516*4+0x02000000,0x10fd); +reg_write( DDR_REG_BASE + 0x52517*4+0x02000000,0x809e); +reg_write( DDR_REG_BASE + 0x52518*4+0x02000000,0xf00d); +reg_write( DDR_REG_BASE + 0x52519*4+0x02000000,0x231a); +reg_write( DDR_REG_BASE + 0x5251a*4+0x02000000,0x3f82); +reg_write( DDR_REG_BASE + 0x5251b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5251c*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x5251d*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x5251e*4+0x02000000,0x7845); +reg_write( DDR_REG_BASE + 0x5251f*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x52520*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x52521*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x52522*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x52523*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x52524*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE + 0x52525*4+0x02000000,0x7167); +reg_write( DDR_REG_BASE + 0x52526*4+0x02000000,0xc00e); +reg_write( DDR_REG_BASE + 0x52527*4+0x02000000,0x230c); +reg_write( DDR_REG_BASE + 0x52528*4+0x02000000,0xb000); +reg_write( DDR_REG_BASE + 0x52529*4+0x02000000,0x5d0); +reg_write( DDR_REG_BASE + 0x5252a*4+0x02000000,0xffce); +reg_write( DDR_REG_BASE + 0x5252b*4+0x02000000,0xe17); +reg_write( DDR_REG_BASE + 0x5252c*4+0x02000000,0x315e); +reg_write( DDR_REG_BASE + 0x5252d*4+0x02000000,0xc00d); +reg_write( DDR_REG_BASE + 0x5252e*4+0x02000000,0xae05); +reg_write( DDR_REG_BASE + 0x5252f*4+0x02000000,0xc008); +reg_write( DDR_REG_BASE + 0x52530*4+0x02000000,0xae04); +reg_write( DDR_REG_BASE + 0x52531*4+0x02000000,0xc00c); +reg_write( DDR_REG_BASE + 0x52532*4+0x02000000,0xae03); +reg_write( DDR_REG_BASE + 0x52533*4+0x02000000,0xc00b); +reg_write( DDR_REG_BASE + 0x52534*4+0x02000000,0xae02); +reg_write( DDR_REG_BASE + 0x52535*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52536*4+0x02000000,0x1fa7); +reg_write( DDR_REG_BASE + 0x52537*4+0x02000000,0x101c); +reg_write( DDR_REG_BASE + 0x52538*4+0x02000000,0x1fa8); +reg_write( DDR_REG_BASE + 0x52539*4+0x02000000,0x101c); +reg_write( DDR_REG_BASE + 0x5253a*4+0x02000000,0xb700); +reg_write( DDR_REG_BASE + 0x5253b*4+0x02000000,0xc0b0); +reg_write( DDR_REG_BASE + 0x5253c*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x5253d*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x5253e*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x5253f*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x52540*4+0x02000000,0x208c); +reg_write( DDR_REG_BASE + 0x52541*4+0x02000000,0x8fc3); +reg_write( DDR_REG_BASE + 0x52542*4+0x02000000,0xf209); +reg_write( DDR_REG_BASE + 0x52543*4+0x02000000,0x821); +reg_write( DDR_REG_BASE + 0x52544*4+0x02000000,0x1d1); +reg_write( DDR_REG_BASE + 0x52545*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x52546*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x52547*4+0x02000000,0x238); +reg_write( DDR_REG_BASE + 0x52548*4+0x02000000,0x1900); +reg_write( DDR_REG_BASE + 0x52549*4+0x02000000,0x45); +reg_write( DDR_REG_BASE + 0x5254a*4+0x02000000,0xf006); +reg_write( DDR_REG_BASE + 0x5254b*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x5254c*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x5254d*4+0x02000000,0x238); +reg_write( DDR_REG_BASE + 0x5254e*4+0x02000000,0x1900); +reg_write( DDR_REG_BASE + 0x5254f*4+0x02000000,0x105); +reg_write( DDR_REG_BASE + 0x52550*4+0x02000000,0x1900); +reg_write( DDR_REG_BASE + 0x52551*4+0x02000000,0x5); +reg_write( DDR_REG_BASE + 0x52552*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x52553*4+0x02000000,0x9018); +reg_write( DDR_REG_BASE + 0x52554*4+0x02000000,0x64); +reg_write( DDR_REG_BASE + 0x52555*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE + 0x52556*4+0x02000000,0x25); +reg_write( DDR_REG_BASE + 0x52557*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x52558*4+0x02000000,0x1902); +reg_write( DDR_REG_BASE + 0x52559*4+0x02000000,0x5); +reg_write( DDR_REG_BASE + 0x5255a*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x5255b*4+0x02000000,0x9018); +reg_write( DDR_REG_BASE + 0x5255c*4+0x02000000,0x64); +reg_write( DDR_REG_BASE + 0x5255d*4+0x02000000,0xda10); +reg_write( DDR_REG_BASE + 0x5255e*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE + 0x5255f*4+0x02000000,0xba61); +reg_write( DDR_REG_BASE + 0x52560*4+0x02000000,0xaff); +reg_write( DDR_REG_BASE + 0x52561*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE + 0x52562*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x52563*4+0x02000000,0xb102); +reg_write( DDR_REG_BASE + 0x52564*4+0x02000000,0x9); +reg_write( DDR_REG_BASE + 0x52565*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x52566*4+0x02000000,0x1902); +reg_write( DDR_REG_BASE + 0x52567*4+0x02000000,0x5); +reg_write( DDR_REG_BASE + 0x52568*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x52569*4+0x02000000,0x9018); +reg_write( DDR_REG_BASE + 0x5256a*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x5256b*4+0x02000000,0x9100); +reg_write( DDR_REG_BASE + 0x5256c*4+0x02000000,0x8ff); +reg_write( DDR_REG_BASE + 0x5256d*4+0x02000000,0x801f); +reg_write( DDR_REG_BASE + 0x5256e*4+0x02000000,0x195e); +reg_write( DDR_REG_BASE + 0x5256f*4+0x02000000,0x45); +reg_write( DDR_REG_BASE + 0x52570*4+0x02000000,0x9100); +reg_write( DDR_REG_BASE + 0x52571*4+0x02000000,0x801); +reg_write( DDR_REG_BASE + 0x52572*4+0x02000000,0x1e); +reg_write( DDR_REG_BASE + 0x52573*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x52574*4+0x02000000,0xc2e2); +reg_write( DDR_REG_BASE + 0x52575*4+0x02000000,0x4200); +reg_write( DDR_REG_BASE + 0x52576*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x52577*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x52578*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52579*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5257a*4+0x02000000,0x827); +reg_write( DDR_REG_BASE + 0x5257b*4+0x02000000,0x13f); +reg_write( DDR_REG_BASE + 0x5257c*4+0x02000000,0x4328); +reg_write( DDR_REG_BASE + 0x5257d*4+0x02000000,0xd808); +reg_write( DDR_REG_BASE + 0x5257e*4+0x02000000,0xf86); +reg_write( DDR_REG_BASE + 0x5257f*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x52580*4+0x02000000,0x7d50); +reg_write( DDR_REG_BASE + 0x52581*4+0x02000000,0xfb6); +reg_write( DDR_REG_BASE + 0x52582*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x52583*4+0x02000000,0x4040); +reg_write( DDR_REG_BASE + 0x52584*4+0x02000000,0x706c); +reg_write( DDR_REG_BASE + 0x52585*4+0x02000000,0xf007); +reg_write( DDR_REG_BASE + 0x52586*4+0x02000000,0xfaa); +reg_write( DDR_REG_BASE + 0x52587*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x52588*4+0x02000000,0x1304); +reg_write( DDR_REG_BASE + 0x52589*4+0x02000000,0x1400); +reg_write( DDR_REG_BASE + 0x5258a*4+0x02000000,0x7164); +reg_write( DDR_REG_BASE + 0x5258b*4+0x02000000,0xbf9); +reg_write( DDR_REG_BASE + 0x5258c*4+0x02000000,0x8344); +reg_write( DDR_REG_BASE + 0x5258d*4+0x02000000,0xc6c2); +reg_write( DDR_REG_BASE + 0x5258e*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x5258f*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x52590*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x52591*4+0x02000000,0x2482); +reg_write( DDR_REG_BASE + 0x52592*4+0x02000000,0x3a03); +reg_write( DDR_REG_BASE + 0x52593*4+0x02000000,0xc255); +reg_write( DDR_REG_BASE + 0x52594*4+0x02000000,0xc152); +reg_write( DDR_REG_BASE + 0x52595*4+0x02000000,0xc050); +reg_write( DDR_REG_BASE + 0x52596*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE + 0x52597*4+0x02000000,0x3800); +reg_write( DDR_REG_BASE + 0x52598*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x52599*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5259a*4+0x02000000,0x4a4); +reg_write( DDR_REG_BASE + 0x5259b*4+0x02000000,0xda66); +reg_write( DDR_REG_BASE + 0x5259c*4+0x02000000,0xd4a); +reg_write( DDR_REG_BASE + 0x5259d*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x5259e*4+0x02000000,0xc353); +reg_write( DDR_REG_BASE + 0x5259f*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE + 0x525a0*4+0x02000000,0x3800); +reg_write( DDR_REG_BASE + 0x525a1*4+0x02000000,0xe4a); +reg_write( DDR_REG_BASE + 0x525a2*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x525a3*4+0x02000000,0xd966); +reg_write( DDR_REG_BASE + 0x525a4*4+0x02000000,0x47cb); +reg_write( DDR_REG_BASE + 0x525a5*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x525a6*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE + 0x525a7*4+0x02000000,0x8f40); +reg_write( DDR_REG_BASE + 0x525a8*4+0x02000000,0x8f21); +reg_write( DDR_REG_BASE + 0x525a9*4+0x02000000,0x14fc); +reg_write( DDR_REG_BASE + 0x525aa*4+0x02000000,0x3000); +reg_write( DDR_REG_BASE + 0x525ab*4+0x02000000,0x225f); +reg_write( DDR_REG_BASE + 0x525ac*4+0x02000000,0x243); +reg_write( DDR_REG_BASE + 0x525ad*4+0x02000000,0xc054); +reg_write( DDR_REG_BASE + 0x525ae*4+0x02000000,0xf03a); +reg_write( DDR_REG_BASE + 0x525af*4+0x02000000,0x44cb); +reg_write( DDR_REG_BASE + 0x525b0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x525b1*4+0x02000000,0x7fff); +reg_write( DDR_REG_BASE + 0x525b2*4+0x02000000,0x6c01); +reg_write( DDR_REG_BASE + 0x525b3*4+0x02000000,0x4368); +reg_write( DDR_REG_BASE + 0x525b4*4+0x02000000,0xf00a); +reg_write( DDR_REG_BASE + 0x525b5*4+0x02000000,0xc015); +reg_write( DDR_REG_BASE + 0x525b6*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE + 0x525b7*4+0x02000000,0x20f5); +reg_write( DDR_REG_BASE + 0x525b8*4+0x02000000,0x2c0); +reg_write( DDR_REG_BASE + 0x525b9*4+0x02000000,0x7165); +reg_write( DDR_REG_BASE + 0x525ba*4+0x02000000,0x2009); +reg_write( DDR_REG_BASE + 0x525bb*4+0x02000000,0x30c); +reg_write( DDR_REG_BASE + 0x525bc*4+0x02000000,0x2008); +reg_write( DDR_REG_BASE + 0x525bd*4+0x02000000,0x340); +reg_write( DDR_REG_BASE + 0x525be*4+0x02000000,0xeef); +reg_write( DDR_REG_BASE + 0x525bf*4+0x02000000,0x9234); +reg_write( DDR_REG_BASE + 0x525c0*4+0x02000000,0x7d0e); +reg_write( DDR_REG_BASE + 0x525c1*4+0x02000000,0x64b8); +reg_write( DDR_REG_BASE + 0x525c2*4+0x02000000,0x2844); +reg_write( DDR_REG_BASE + 0x525c3*4+0x02000000,0x8d); +reg_write( DDR_REG_BASE + 0x525c4*4+0x02000000,0xe309); +reg_write( DDR_REG_BASE + 0x525c5*4+0x02000000,0x7eae); +reg_write( DDR_REG_BASE + 0x525c6*4+0x02000000,0x78dc); +reg_write( DDR_REG_BASE + 0x525c7*4+0x02000000,0x781c); +reg_write( DDR_REG_BASE + 0x525c8*4+0x02000000,0x781c); +reg_write( DDR_REG_BASE + 0x525c9*4+0x02000000,0x781c); +reg_write( DDR_REG_BASE + 0x525ca*4+0x02000000,0x4408); +reg_write( DDR_REG_BASE + 0x525cb*4+0x02000000,0xd81b); +reg_write( DDR_REG_BASE + 0x525cc*4+0x02000000,0xb861); +reg_write( DDR_REG_BASE + 0x525cd*4+0x02000000,0x801); +reg_write( DDR_REG_BASE + 0x525ce*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x525cf*4+0x02000000,0x7c9d); +reg_write( DDR_REG_BASE + 0x525d0*4+0x02000000,0x6698); +reg_write( DDR_REG_BASE + 0x525d1*4+0x02000000,0xb8c4); +reg_write( DDR_REG_BASE + 0x525d2*4+0x02000000,0x4894); +reg_write( DDR_REG_BASE + 0x525d3*4+0x02000000,0x2e44); +reg_write( DDR_REG_BASE + 0x525d4*4+0x02000000,0x1800); +reg_write( DDR_REG_BASE + 0x525d5*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x525d6*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x525d7*4+0x02000000,0x7c05); +reg_write( DDR_REG_BASE + 0x525d8*4+0x02000000,0x221a); +reg_write( DDR_REG_BASE + 0x525d9*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x525da*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x525db*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE + 0x525dc*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x525dd*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x525de*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x525df*4+0x02000000,0x1064); +reg_write( DDR_REG_BASE + 0x525e0*4+0x02000000,0xb080); +reg_write( DDR_REG_BASE + 0x525e1*4+0x02000000,0xc096); +reg_write( DDR_REG_BASE + 0x525e2*4+0x02000000,0x7854); +reg_write( DDR_REG_BASE + 0x525e3*4+0x02000000,0xb0a0); +reg_write( DDR_REG_BASE + 0x525e4*4+0x02000000,0xc09b); +reg_write( DDR_REG_BASE + 0x525e5*4+0x02000000,0x7854); +reg_write( DDR_REG_BASE + 0x525e6*4+0x02000000,0xb080); +reg_write( DDR_REG_BASE + 0x525e7*4+0x02000000,0x7144); +reg_write( DDR_REG_BASE + 0x525e8*4+0x02000000,0x98f); +reg_write( DDR_REG_BASE + 0x525e9*4+0x02000000,0x80a5); +reg_write( DDR_REG_BASE + 0x525ea*4+0x02000000,0x70cd); +reg_write( DDR_REG_BASE + 0x525eb*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x525ec*4+0x02000000,0x83a); +reg_write( DDR_REG_BASE + 0x525ed*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE + 0x525ee*4+0x02000000,0xd9ff); +reg_write( DDR_REG_BASE + 0x525ef*4+0x02000000,0x1200); +reg_write( DDR_REG_BASE + 0x525f0*4+0x02000000,0x3083); +reg_write( DDR_REG_BASE + 0x525f1*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x525f2*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x525f3*4+0x02000000,0xb98e); +reg_write( DDR_REG_BASE + 0x525f4*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x525f5*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE + 0x525f6*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x525f7*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x525f8*4+0x02000000,0x8fa); +reg_write( DDR_REG_BASE + 0x525f9*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE + 0x525fa*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x525fb*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x525fc*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE + 0x525fd*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x525fe*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x525ff*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE + 0x52600*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x52601*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x52602*4+0x02000000,0x8e6); +reg_write( DDR_REG_BASE + 0x52603*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE + 0x52604*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x52605*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52606*4+0x02000000,0x89e); +reg_write( DDR_REG_BASE + 0x52607*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE + 0x52608*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x52609*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x5260a*4+0x02000000,0xf86); +reg_write( DDR_REG_BASE + 0x5260b*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE + 0x5260c*4+0x02000000,0xd9ff); +reg_write( DDR_REG_BASE + 0x5260d*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE + 0x5260e*4+0x02000000,0xfc7); +reg_write( DDR_REG_BASE + 0x5260f*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x52610*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x52611*4+0x02000000,0xe174); +reg_write( DDR_REG_BASE + 0x52612*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x52613*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x52614*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x52615*4+0x02000000,0xe174); +reg_write( DDR_REG_BASE + 0x52616*4+0x02000000,0xb101); +reg_write( DDR_REG_BASE + 0x52617*4+0x02000000,0xc010); +reg_write( DDR_REG_BASE + 0x52618*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x52619*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE + 0x5261a*4+0x02000000,0x7cd); +reg_write( DDR_REG_BASE + 0x5261b*4+0x02000000,0x4020); +reg_write( DDR_REG_BASE + 0x5261c*4+0x02000000,0xed05); +reg_write( DDR_REG_BASE + 0x5261d*4+0x02000000,0xbd61); +reg_write( DDR_REG_BASE + 0x5261e*4+0x02000000,0xdff); +reg_write( DDR_REG_BASE + 0x5261f*4+0x02000000,0x9031); +reg_write( DDR_REG_BASE + 0x52620*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x52621*4+0x02000000,0xc051); +reg_write( DDR_REG_BASE + 0x52622*4+0x02000000,0xef3); +reg_write( DDR_REG_BASE + 0x52623*4+0x02000000,0x1155); +reg_write( DDR_REG_BASE + 0x52624*4+0x02000000,0xc011); +reg_write( DDR_REG_BASE + 0x52625*4+0x02000000,0xd8a); +reg_write( DDR_REG_BASE + 0x52626*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x52627*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x52628*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x52629*4+0x02000000,0xb6e); +reg_write( DDR_REG_BASE + 0x5262a*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE + 0x5262b*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x5262c*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x5262d*4+0x02000000,0x852); +reg_write( DDR_REG_BASE + 0x5262e*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE + 0x5262f*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x52630*4+0x02000000,0x8fa0); +reg_write( DDR_REG_BASE + 0x52631*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52632*4+0x02000000,0xc04f); +reg_write( DDR_REG_BASE + 0x52633*4+0x02000000,0xf061); +reg_write( DDR_REG_BASE + 0x52634*4+0x02000000,0x251a); +reg_write( DDR_REG_BASE + 0x52635*4+0x02000000,0x1f81); +reg_write( DDR_REG_BASE + 0x52636*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52637*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE + 0x52638*4+0x02000000,0x4318); +reg_write( DDR_REG_BASE + 0x52639*4+0x02000000,0xf00d); +reg_write( DDR_REG_BASE + 0x5263a*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x5263b*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x5263c*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x5263d*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x5263e*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x5263f*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x52640*4+0x02000000,0x166); +reg_write( DDR_REG_BASE + 0x52641*4+0x02000000,0x9000); +reg_write( DDR_REG_BASE + 0x52642*4+0x02000000,0x2300); +reg_write( DDR_REG_BASE + 0x52643*4+0x02000000,0x301b); +reg_write( DDR_REG_BASE + 0x52644*4+0x02000000,0x4040); +reg_write( DDR_REG_BASE + 0x52645*4+0x02000000,0x8ed); +reg_write( DDR_REG_BASE + 0x52646*4+0x02000000,0x8234); +reg_write( DDR_REG_BASE + 0x52647*4+0x02000000,0x6841); +reg_write( DDR_REG_BASE + 0x52648*4+0x02000000,0xb8f); +reg_write( DDR_REG_BASE + 0x52649*4+0x02000000,0x3010); +reg_write( DDR_REG_BASE + 0x5264a*4+0x02000000,0xe21); +reg_write( DDR_REG_BASE + 0x5264b*4+0x02000000,0x1070); +reg_write( DDR_REG_BASE + 0x5264c*4+0x02000000,0xc096); +reg_write( DDR_REG_BASE + 0x5264d*4+0x02000000,0xe25); +reg_write( DDR_REG_BASE + 0x5264e*4+0x02000000,0x10f0); +reg_write( DDR_REG_BASE + 0x5264f*4+0x02000000,0xc096); +reg_write( DDR_REG_BASE + 0x52650*4+0x02000000,0xe25); +reg_write( DDR_REG_BASE + 0x52651*4+0x02000000,0x1131); +reg_write( DDR_REG_BASE + 0x52652*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52653*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x52654*4+0x02000000,0x24); +reg_write( DDR_REG_BASE + 0x52655*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x52656*4+0x02000000,0xc42); +reg_write( DDR_REG_BASE + 0x52657*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52658*4+0x02000000,0x42a1); +reg_write( DDR_REG_BASE + 0x52659*4+0x02000000,0xf037); +reg_write( DDR_REG_BASE + 0x5265a*4+0x02000000,0x20f4); +reg_write( DDR_REG_BASE + 0x5265b*4+0x02000000,0x340); +reg_write( DDR_REG_BASE + 0x5265c*4+0x02000000,0x7404); +reg_write( DDR_REG_BASE + 0x5265d*4+0x02000000,0xf014); +reg_write( DDR_REG_BASE + 0x5265e*4+0x02000000,0x20f4); +reg_write( DDR_REG_BASE + 0x5265f*4+0x02000000,0x340); +reg_write( DDR_REG_BASE + 0x52660*4+0x02000000,0xe008); +reg_write( DDR_REG_BASE + 0x52661*4+0x02000000,0xf010); +reg_write( DDR_REG_BASE + 0x52662*4+0x02000000,0xc096); +reg_write( DDR_REG_BASE + 0x52663*4+0x02000000,0x20f4); +reg_write( DDR_REG_BASE + 0x52664*4+0x02000000,0x341); +reg_write( DDR_REG_BASE + 0x52665*4+0x02000000,0xee08); +reg_write( DDR_REG_BASE + 0x52666*4+0x02000000,0x915); +reg_write( DDR_REG_BASE + 0x52667*4+0x02000000,0x274); +reg_write( DDR_REG_BASE + 0x52668*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52669*4+0x02000000,0x2142); +reg_write( DDR_REG_BASE + 0x5266a*4+0x02000000,0x200); +reg_write( DDR_REG_BASE + 0x5266b*4+0x02000000,0xf006); +reg_write( DDR_REG_BASE + 0x5266c*4+0x02000000,0x909); +reg_write( DDR_REG_BASE + 0x5266d*4+0x02000000,0x174); +reg_write( DDR_REG_BASE + 0x5266e*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x5266f*4+0x02000000,0x690c); +reg_write( DDR_REG_BASE + 0x52670*4+0x02000000,0x7a0e); +reg_write( DDR_REG_BASE + 0x52671*4+0x02000000,0x785c); +reg_write( DDR_REG_BASE + 0x52672*4+0x02000000,0x781c); +reg_write( DDR_REG_BASE + 0x52673*4+0x02000000,0x781c); +reg_write( DDR_REG_BASE + 0x52674*4+0x02000000,0x781c); +reg_write( DDR_REG_BASE + 0x52675*4+0x02000000,0x4100); +reg_write( DDR_REG_BASE + 0x52676*4+0x02000000,0xd81b); +reg_write( DDR_REG_BASE + 0x52677*4+0x02000000,0xb861); +reg_write( DDR_REG_BASE + 0x52678*4+0x02000000,0x8ff); +reg_write( DDR_REG_BASE + 0x52679*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE + 0x5267a*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE + 0x5267b*4+0x02000000,0x6238); +reg_write( DDR_REG_BASE + 0x5267c*4+0x02000000,0xb8c4); +reg_write( DDR_REG_BASE + 0x5267d*4+0x02000000,0x4831); +reg_write( DDR_REG_BASE + 0x5267e*4+0x02000000,0x2a44); +reg_write( DDR_REG_BASE + 0x5267f*4+0x02000000,0x800); +reg_write( DDR_REG_BASE + 0x52680*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x52681*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x52682*4+0x02000000,0x7905); +reg_write( DDR_REG_BASE + 0x52683*4+0x02000000,0x251a); +reg_write( DDR_REG_BASE + 0x52684*4+0x02000000,0x1f80); +reg_write( DDR_REG_BASE + 0x52685*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52686*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE + 0x52687*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x52688*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x52689*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x5268a*4+0x02000000,0x1064); +reg_write( DDR_REG_BASE + 0x5268b*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE + 0x5268c*4+0x02000000,0xc09b); +reg_write( DDR_REG_BASE + 0x5268d*4+0x02000000,0x78b4); +reg_write( DDR_REG_BASE + 0x5268e*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE + 0x5268f*4+0x02000000,0xc00f); +reg_write( DDR_REG_BASE + 0x52690*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE + 0x52691*4+0x02000000,0x7063); +reg_write( DDR_REG_BASE + 0x52692*4+0x02000000,0xc04f); +reg_write( DDR_REG_BASE + 0x52693*4+0x02000000,0x8f01); +reg_write( DDR_REG_BASE + 0x52694*4+0x02000000,0x841); +reg_write( DDR_REG_BASE + 0x52695*4+0x02000000,0x8365); +reg_write( DDR_REG_BASE + 0x52696*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52697*4+0x02000000,0xc00f); +reg_write( DDR_REG_BASE + 0x52698*4+0x02000000,0x815); +reg_write( DDR_REG_BASE + 0x52699*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE + 0x5269a*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE + 0x5269b*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x5269c*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x5269d*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x5269e*4+0x02000000,0xe174); +reg_write( DDR_REG_BASE + 0x5269f*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x526a0*4+0x02000000,0x7044); +reg_write( DDR_REG_BASE + 0x526a1*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x526a2*4+0x02000000,0xe174); +reg_write( DDR_REG_BASE + 0x526a3*4+0x02000000,0xb021); +reg_write( DDR_REG_BASE + 0x526a4*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x526a5*4+0x02000000,0xc04d); +reg_write( DDR_REG_BASE + 0x526a6*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x526a7*4+0x02000000,0xb88b); +reg_write( DDR_REG_BASE + 0x526a8*4+0x02000000,0xc04c); +reg_write( DDR_REG_BASE + 0x526a9*4+0x02000000,0xd840); +reg_write( DDR_REG_BASE + 0x526aa*4+0x02000000,0xc04b); +reg_write( DDR_REG_BASE + 0x526ab*4+0x02000000,0xc014); +reg_write( DDR_REG_BASE + 0x526ac*4+0x02000000,0xc16e); +reg_write( DDR_REG_BASE + 0x526ad*4+0x02000000,0xc149); +reg_write( DDR_REG_BASE + 0x526ae*4+0x02000000,0xc046); +reg_write( DDR_REG_BASE + 0x526af*4+0x02000000,0xc013); +reg_write( DDR_REG_BASE + 0x526b0*4+0x02000000,0xc168); +reg_write( DDR_REG_BASE + 0x526b1*4+0x02000000,0xc147); +reg_write( DDR_REG_BASE + 0x526b2*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE + 0x526b3*4+0x02000000,0xc010); +reg_write( DDR_REG_BASE + 0x526b4*4+0x02000000,0xc19b); +reg_write( DDR_REG_BASE + 0x526b5*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE + 0x526b6*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE + 0x526b7*4+0x02000000,0xc084); +reg_write( DDR_REG_BASE + 0x526b8*4+0x02000000,0xe2a); +reg_write( DDR_REG_BASE + 0x526b9*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE + 0x526ba*4+0x02000000,0x1c28); +reg_write( DDR_REG_BASE + 0x526bb*4+0x02000000,0x3085); +reg_write( DDR_REG_BASE + 0x526bc*4+0x02000000,0xc084); +reg_write( DDR_REG_BASE + 0x526bd*4+0x02000000,0xc19b); +reg_write( DDR_REG_BASE + 0x526be*4+0x02000000,0xe1e); +reg_write( DDR_REG_BASE + 0x526bf*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE + 0x526c0*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x526c1*4+0x02000000,0xc011); +reg_write( DDR_REG_BASE + 0x526c2*4+0x02000000,0x8fa0); +reg_write( DDR_REG_BASE + 0x526c3*4+0x02000000,0x8fc1); +reg_write( DDR_REG_BASE + 0x526c4*4+0x02000000,0x842); +reg_write( DDR_REG_BASE + 0x526c5*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x526c6*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x526c7*4+0x02000000,0x265f); +reg_write( DDR_REG_BASE + 0x526c8*4+0x02000000,0x125b); +reg_write( DDR_REG_BASE + 0x526c9*4+0x02000000,0x255f); +reg_write( DDR_REG_BASE + 0x526ca*4+0x02000000,0x124d); +reg_write( DDR_REG_BASE + 0x526cb*4+0x02000000,0xc012); +reg_write( DDR_REG_BASE + 0x526cc*4+0x02000000,0xe807); +reg_write( DDR_REG_BASE + 0x526cd*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x526ce*4+0x02000000,0x25); +reg_write( DDR_REG_BASE + 0x526cf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x526d0*4+0x02000000,0xac2); +reg_write( DDR_REG_BASE + 0x526d1*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE + 0x526d2*4+0x02000000,0x740c); +reg_write( DDR_REG_BASE + 0x526d3*4+0x02000000,0x8fc0); +reg_write( DDR_REG_BASE + 0x526d4*4+0x02000000,0x2340); +reg_write( DDR_REG_BASE + 0x526d5*4+0x02000000,0x321b); +reg_write( DDR_REG_BASE + 0x526d6*4+0x02000000,0xe508); +reg_write( DDR_REG_BASE + 0x526d7*4+0x02000000,0xf02c); +reg_write( DDR_REG_BASE + 0x526d8*4+0x02000000,0xc013); +reg_write( DDR_REG_BASE + 0x526d9*4+0x02000000,0x20f5); +reg_write( DDR_REG_BASE + 0x526da*4+0x02000000,0x341); +reg_write( DDR_REG_BASE + 0x526db*4+0x02000000,0xc014); +reg_write( DDR_REG_BASE + 0x526dc*4+0x02000000,0x20f5); +reg_write( DDR_REG_BASE + 0x526dd*4+0x02000000,0x342); +reg_write( DDR_REG_BASE + 0x526de*4+0x02000000,0x6238); +reg_write( DDR_REG_BASE + 0x526df*4+0x02000000,0x7b1c); +reg_write( DDR_REG_BASE + 0x526e0*4+0x02000000,0xc015); +reg_write( DDR_REG_BASE + 0x526e1*4+0x02000000,0x2348); +reg_write( DDR_REG_BASE + 0x526e2*4+0x02000000,0xc); +reg_write( DDR_REG_BASE + 0x526e3*4+0x02000000,0x78b4); +reg_write( DDR_REG_BASE + 0x526e4*4+0x02000000,0xb080); +reg_write( DDR_REG_BASE + 0x526e5*4+0x02000000,0x4a30); +reg_write( DDR_REG_BASE + 0x526e6*4+0x02000000,0x2048); +reg_write( DDR_REG_BASE + 0x526e7*4+0x02000000,0xf); +reg_write( DDR_REG_BASE + 0x526e8*4+0x02000000,0xc012); +reg_write( DDR_REG_BASE + 0x526e9*4+0x02000000,0xe80d); +reg_write( DDR_REG_BASE + 0x526ea*4+0x02000000,0xc342); +reg_write( DDR_REG_BASE + 0x526eb*4+0x02000000,0xc241); +reg_write( DDR_REG_BASE + 0x526ec*4+0x02000000,0xc140); +reg_write( DDR_REG_BASE + 0x526ed*4+0x02000000,0x740c); +reg_write( DDR_REG_BASE + 0x526ee*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x526ef*4+0x02000000,0x27); +reg_write( DDR_REG_BASE + 0x526f0*4+0x02000000,0x5); +reg_write( DDR_REG_BASE + 0x526f1*4+0x02000000,0x42c1); +reg_write( DDR_REG_BASE + 0x526f2*4+0x02000000,0xa7e); +reg_write( DDR_REG_BASE + 0x526f3*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE + 0x526f4*4+0x02000000,0xdb08); +reg_write( DDR_REG_BASE + 0x526f5*4+0x02000000,0x78ee); +reg_write( DDR_REG_BASE + 0x526f6*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x526f7*4+0x02000000,0x207f); +reg_write( DDR_REG_BASE + 0x526f8*4+0x02000000,0x140); +reg_write( DDR_REG_BASE + 0x526f9*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x526fa*4+0x02000000,0x28); +reg_write( DDR_REG_BASE + 0x526fb*4+0x02000000,0x3); +reg_write( DDR_REG_BASE + 0x526fc*4+0x02000000,0x42c1); +reg_write( DDR_REG_BASE + 0x526fd*4+0x02000000,0xaf6); +reg_write( DDR_REG_BASE + 0x526fe*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x526ff*4+0x02000000,0xdb08); +reg_write( DDR_REG_BASE + 0x52700*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE + 0x52701*4+0x02000000,0xe509); +reg_write( DDR_REG_BASE + 0x52702*4+0x02000000,0xbad); +reg_write( DDR_REG_BASE + 0x52703*4+0x02000000,0xb345); +reg_write( DDR_REG_BASE + 0x52704*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x52705*4+0x02000000,0x7005); +reg_write( DDR_REG_BASE + 0x52706*4+0x02000000,0x900f); +reg_write( DDR_REG_BASE + 0x52707*4+0x02000000,0xe022); +reg_write( DDR_REG_BASE + 0x52708*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x52709*4+0x02000000,0x7005); +reg_write( DDR_REG_BASE + 0x5270a*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x5270b*4+0x02000000,0xe004); +reg_write( DDR_REG_BASE + 0x5270c*4+0x02000000,0x2480); +reg_write( DDR_REG_BASE + 0x5270d*4+0x02000000,0x3a03); +reg_write( DDR_REG_BASE + 0x5270e*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x5270f*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x52710*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x52711*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x52712*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x52713*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x52714*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x52715*4+0x02000000,0x2482); +reg_write( DDR_REG_BASE + 0x52716*4+0x02000000,0x3606); +reg_write( DDR_REG_BASE + 0x52717*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x52718*4+0x02000000,0xc350); +reg_write( DDR_REG_BASE + 0x52719*4+0x02000000,0xc257); +reg_write( DDR_REG_BASE + 0x5271a*4+0x02000000,0xc052); +reg_write( DDR_REG_BASE + 0x5271b*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x5271c*4+0x02000000,0x7344); +reg_write( DDR_REG_BASE + 0x5271d*4+0x02000000,0x900f); +reg_write( DDR_REG_BASE + 0x5271e*4+0x02000000,0xe022); +reg_write( DDR_REG_BASE + 0x5271f*4+0x02000000,0x206f); +reg_write( DDR_REG_BASE + 0x52720*4+0x02000000,0x43); +reg_write( DDR_REG_BASE + 0x52721*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x52722*4+0x02000000,0x9b); +reg_write( DDR_REG_BASE + 0x52723*4+0x02000000,0x8804); +reg_write( DDR_REG_BASE + 0x52724*4+0x02000000,0x4728); +reg_write( DDR_REG_BASE + 0x52725*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52726*4+0x02000000,0xc051); +reg_write( DDR_REG_BASE + 0x52727*4+0x02000000,0x9be); +reg_write( DDR_REG_BASE + 0x52728*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE + 0x52729*4+0x02000000,0xc012); +reg_write( DDR_REG_BASE + 0x5272a*4+0x02000000,0xc05a); +reg_write( DDR_REG_BASE + 0x5272b*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE + 0x5272c*4+0x02000000,0x3e40); +reg_write( DDR_REG_BASE + 0x5272d*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x5272e*4+0x02000000,0xa36); +reg_write( DDR_REG_BASE + 0x5272f*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x52730*4+0x02000000,0xdab4); +reg_write( DDR_REG_BASE + 0x52731*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE + 0x52732*4+0x02000000,0x3840); +reg_write( DDR_REG_BASE + 0x52733*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x52734*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52735*4+0x02000000,0x444); +reg_write( DDR_REG_BASE + 0x52736*4+0x02000000,0xa16); +reg_write( DDR_REG_BASE + 0x52737*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52738*4+0x02000000,0xda60); +reg_write( DDR_REG_BASE + 0x52739*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE + 0x5273a*4+0x02000000,0x3840); +reg_write( DDR_REG_BASE + 0x5273b*4+0x02000000,0xb16); +reg_write( DDR_REG_BASE + 0x5273c*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x5273d*4+0x02000000,0xd960); +reg_write( DDR_REG_BASE + 0x5273e*4+0x02000000,0x146c); +reg_write( DDR_REG_BASE + 0x5273f*4+0x02000000,0x3600); +reg_write( DDR_REG_BASE + 0x52740*4+0x02000000,0x71cd); +reg_write( DDR_REG_BASE + 0x52741*4+0x02000000,0xc04e); +reg_write( DDR_REG_BASE + 0x52742*4+0x02000000,0x146b); +reg_write( DDR_REG_BASE + 0x52743*4+0x02000000,0x3600); +reg_write( DDR_REG_BASE + 0x52744*4+0x02000000,0xc04f); +reg_write( DDR_REG_BASE + 0x52745*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE + 0x52746*4+0x02000000,0x6d21); +reg_write( DDR_REG_BASE + 0x52747*4+0x02000000,0x259a); +reg_write( DDR_REG_BASE + 0x52748*4+0x02000000,0x1008); +reg_write( DDR_REG_BASE + 0x52749*4+0x02000000,0x42c1); +reg_write( DDR_REG_BASE + 0x5274a*4+0x02000000,0xe805); +reg_write( DDR_REG_BASE + 0x5274b*4+0x02000000,0xb861); +reg_write( DDR_REG_BASE + 0x5274c*4+0x02000000,0x8ff); +reg_write( DDR_REG_BASE + 0x5274d*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE + 0x5274e*4+0x02000000,0x7a5b); +reg_write( DDR_REG_BASE + 0x5274f*4+0x02000000,0x2505); +reg_write( DDR_REG_BASE + 0x52750*4+0x02000000,0x1f80); +reg_write( DDR_REG_BASE + 0x52751*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x52752*4+0x02000000,0xe0c4); +reg_write( DDR_REG_BASE + 0x52753*4+0x02000000,0xb040); +reg_write( DDR_REG_BASE + 0x52754*4+0x02000000,0x4528); +reg_write( DDR_REG_BASE + 0x52755*4+0x02000000,0xde5); +reg_write( DDR_REG_BASE + 0x52756*4+0x02000000,0x9234); +reg_write( DDR_REG_BASE + 0x52757*4+0x02000000,0x2544); +reg_write( DDR_REG_BASE + 0x52758*4+0x02000000,0x17c0); +reg_write( DDR_REG_BASE + 0x52759*4+0x02000000,0xc012); +reg_write( DDR_REG_BASE + 0x5275a*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE + 0x5275b*4+0x02000000,0x7c1); +reg_write( DDR_REG_BASE + 0x5275c*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE + 0x5275d*4+0x02000000,0xe906); +reg_write( DDR_REG_BASE + 0x5275e*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE + 0x5275f*4+0x02000000,0x901); +reg_write( DDR_REG_BASE + 0x52760*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x52761*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x52762*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x52763*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52764*4+0x02000000,0x91a); +reg_write( DDR_REG_BASE + 0x52765*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x52766*4+0x02000000,0xc059); +reg_write( DDR_REG_BASE + 0x52767*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52768*4+0x02000000,0xc06d); +reg_write( DDR_REG_BASE + 0x52769*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x5276a*4+0x02000000,0xc04c); +reg_write( DDR_REG_BASE + 0x5276b*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x5276c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5276d*4+0x02000000,0xf00); +reg_write( DDR_REG_BASE + 0x5276e*4+0x02000000,0xc04b); +reg_write( DDR_REG_BASE + 0x5276f*4+0x02000000,0xd840); +reg_write( DDR_REG_BASE + 0x52770*4+0x02000000,0xc04a); +reg_write( DDR_REG_BASE + 0x52771*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE + 0x52772*4+0x02000000,0x3e40); +reg_write( DDR_REG_BASE + 0x52773*4+0x02000000,0xc046); +reg_write( DDR_REG_BASE + 0x52774*4+0x02000000,0xc00e); +reg_write( DDR_REG_BASE + 0x52775*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x52776*4+0x02000000,0x708c); +reg_write( DDR_REG_BASE + 0x52777*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52778*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE + 0x52779*4+0x02000000,0xc748); +reg_write( DDR_REG_BASE + 0x5277a*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE + 0x5277b*4+0x02000000,0xc00f); +reg_write( DDR_REG_BASE + 0x5277c*4+0x02000000,0x1c1c); +reg_write( DDR_REG_BASE + 0x5277d*4+0x02000000,0x3183); +reg_write( DDR_REG_BASE + 0x5277e*4+0x02000000,0x1c24); +reg_write( DDR_REG_BASE + 0x5277f*4+0x02000000,0x3384); +reg_write( DDR_REG_BASE + 0x52780*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE + 0x52781*4+0x02000000,0xc012); +reg_write( DDR_REG_BASE + 0x52782*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE + 0x52783*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x52784*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52785*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE + 0x52786*4+0x02000000,0x8821); +reg_write( DDR_REG_BASE + 0x52787*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52788*4+0x02000000,0xf00a); +reg_write( DDR_REG_BASE + 0x52789*4+0x02000000,0x205a); +reg_write( DDR_REG_BASE + 0x5278a*4+0x02000000,0x402); +reg_write( DDR_REG_BASE + 0x5278b*4+0x02000000,0x7074); +reg_write( DDR_REG_BASE + 0x5278c*4+0x02000000,0xc39d); +reg_write( DDR_REG_BASE + 0x5278d*4+0x02000000,0x22ce); +reg_write( DDR_REG_BASE + 0x5278e*4+0x02000000,0x21); +reg_write( DDR_REG_BASE + 0x5278f*4+0x02000000,0x631b); +reg_write( DDR_REG_BASE + 0x52790*4+0x02000000,0xab40); +reg_write( DDR_REG_BASE + 0x52791*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE + 0x52792*4+0x02000000,0x8ef); +reg_write( DDR_REG_BASE + 0x52793*4+0x02000000,0x8134); +reg_write( DDR_REG_BASE + 0x52794*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE + 0x52795*4+0x02000000,0x43); +reg_write( DDR_REG_BASE + 0x52796*4+0x02000000,0x202f); +reg_write( DDR_REG_BASE + 0x52797*4+0x02000000,0x6c2); +reg_write( DDR_REG_BASE + 0x52798*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x52799*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x5279a*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x5279b*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x5279c*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x5279d*4+0x02000000,0x716f); +reg_write( DDR_REG_BASE + 0x5279e*4+0x02000000,0x2306); +reg_write( DDR_REG_BASE + 0x5279f*4+0x02000000,0x3000); +reg_write( DDR_REG_BASE + 0x527a0*4+0x02000000,0xc055); +reg_write( DDR_REG_BASE + 0x527a1*4+0x02000000,0xc011); +reg_write( DDR_REG_BASE + 0x527a2*4+0x02000000,0x245f); +reg_write( DDR_REG_BASE + 0x527a3*4+0x02000000,0x124e); +reg_write( DDR_REG_BASE + 0x527a4*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x527a5*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x527a6*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x527a7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x527a8*4+0x02000000,0xc05b); +reg_write( DDR_REG_BASE + 0x527a9*4+0x02000000,0x215f); +reg_write( DDR_REG_BASE + 0x527aa*4+0x02000000,0x240); +reg_write( DDR_REG_BASE + 0x527ab*4+0x02000000,0xe008); +reg_write( DDR_REG_BASE + 0x527ac*4+0x02000000,0xc058); +reg_write( DDR_REG_BASE + 0x527ad*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x527ae*4+0x02000000,0xf0b1); +reg_write( DDR_REG_BASE + 0x527af*4+0x02000000,0xcaa); +reg_write( DDR_REG_BASE + 0x527b0*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x527b1*4+0x02000000,0xc083); +reg_write( DDR_REG_BASE + 0x527b2*4+0x02000000,0x41c1); +reg_write( DDR_REG_BASE + 0x527b3*4+0x02000000,0xf012); +reg_write( DDR_REG_BASE + 0x527b4*4+0x02000000,0xc20f); +reg_write( DDR_REG_BASE + 0x527b5*4+0x02000000,0x7a34); +reg_write( DDR_REG_BASE + 0x527b6*4+0x02000000,0x9200); +reg_write( DDR_REG_BASE + 0x527b7*4+0x02000000,0xe88d); +reg_write( DDR_REG_BASE + 0x527b8*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE + 0x527b9*4+0x02000000,0x3e40); +reg_write( DDR_REG_BASE + 0x527ba*4+0x02000000,0x20f4); +reg_write( DDR_REG_BASE + 0x527bb*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x527bc*4+0x02000000,0x2042); +reg_write( DDR_REG_BASE + 0x527bd*4+0x02000000,0x800); +reg_write( DDR_REG_BASE + 0x527be*4+0x02000000,0x262f); +reg_write( DDR_REG_BASE + 0x527bf*4+0x02000000,0xf006); +reg_write( DDR_REG_BASE + 0x527c0*4+0x02000000,0x6); +reg_write( DDR_REG_BASE + 0x527c1*4+0x02000000,0x3); +reg_write( DDR_REG_BASE + 0x527c2*4+0x02000000,0xb200); +reg_write( DDR_REG_BASE + 0x527c3*4+0x02000000,0x7124); +reg_write( DDR_REG_BASE + 0x527c4*4+0x02000000,0xc018); +reg_write( DDR_REG_BASE + 0x527c5*4+0x02000000,0x8e1); +reg_write( DDR_REG_BASE + 0x527c6*4+0x02000000,0x8065); +reg_write( DDR_REG_BASE + 0x527c7*4+0x02000000,0xc083); +reg_write( DDR_REG_BASE + 0x527c8*4+0x02000000,0xe92); +reg_write( DDR_REG_BASE + 0x527c9*4+0x02000000,0xff0f); +reg_write( DDR_REG_BASE + 0x527ca*4+0x02000000,0x41c1); +reg_write( DDR_REG_BASE + 0x527cb*4+0x02000000,0xf010); +reg_write( DDR_REG_BASE + 0x527cc*4+0x02000000,0xc20e); +reg_write( DDR_REG_BASE + 0x527cd*4+0x02000000,0x7a34); +reg_write( DDR_REG_BASE + 0x527ce*4+0x02000000,0x9200); +reg_write( DDR_REG_BASE + 0x527cf*4+0x02000000,0x817); +reg_write( DDR_REG_BASE + 0x527d0*4+0x02000000,0xff1); +reg_write( DDR_REG_BASE + 0x527d1*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE + 0x527d2*4+0x02000000,0x3e40); +reg_write( DDR_REG_BASE + 0x527d3*4+0x02000000,0x20f5); +reg_write( DDR_REG_BASE + 0x527d4*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x527d5*4+0x02000000,0x80b); +reg_write( DDR_REG_BASE + 0x527d6*4+0x02000000,0x832); +reg_write( DDR_REG_BASE + 0x527d7*4+0x02000000,0xe020); +reg_write( DDR_REG_BASE + 0x527d8*4+0x02000000,0xb200); +reg_write( DDR_REG_BASE + 0x527d9*4+0x02000000,0x7124); +reg_write( DDR_REG_BASE + 0x527da*4+0x02000000,0xc018); +reg_write( DDR_REG_BASE + 0x527db*4+0x02000000,0x8e5); +reg_write( DDR_REG_BASE + 0x527dc*4+0x02000000,0x8065); +reg_write( DDR_REG_BASE + 0x527dd*4+0x02000000,0x706f); +reg_write( DDR_REG_BASE + 0x527de*4+0x02000000,0xc013); +reg_write( DDR_REG_BASE + 0x527df*4+0x02000000,0xc651); +reg_write( DDR_REG_BASE + 0x527e0*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x527e1*4+0x02000000,0xc05c); +reg_write( DDR_REG_BASE + 0x527e2*4+0x02000000,0x7314); +reg_write( DDR_REG_BASE + 0x527e3*4+0x02000000,0xc015); +reg_write( DDR_REG_BASE + 0x527e4*4+0x02000000,0x20ca); +reg_write( DDR_REG_BASE + 0x527e5*4+0x02000000,0x61); +reg_write( DDR_REG_BASE + 0x527e6*4+0x02000000,0xc055); +reg_write( DDR_REG_BASE + 0x527e7*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x527e8*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x527e9*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x527ea*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE + 0x527eb*4+0x02000000,0xc054); +reg_write( DDR_REG_BASE + 0x527ec*4+0x02000000,0xf064); +reg_write( DDR_REG_BASE + 0x527ed*4+0x02000000,0x722c); +reg_write( DDR_REG_BASE + 0x527ee*4+0x02000000,0x70ed); +reg_write( DDR_REG_BASE + 0x527ef*4+0x02000000,0xf05d); +reg_write( DDR_REG_BASE + 0x527f0*4+0x02000000,0xc011); +reg_write( DDR_REG_BASE + 0x527f1*4+0x02000000,0xf15); +reg_write( DDR_REG_BASE + 0x527f2*4+0x02000000,0x1231); +reg_write( DDR_REG_BASE + 0x527f3*4+0x02000000,0x7a10); +reg_write( DDR_REG_BASE + 0x527f4*4+0x02000000,0xc010); +reg_write( DDR_REG_BASE + 0x527f5*4+0x02000000,0x7854); +reg_write( DDR_REG_BASE + 0x527f6*4+0x02000000,0x10f0); +reg_write( DDR_REG_BASE + 0x527f7*4+0x02000000,0x8102); +reg_write( DDR_REG_BASE + 0x527f8*4+0x02000000,0xb040); +reg_write( DDR_REG_BASE + 0x527f9*4+0x02000000,0xf04f); +reg_write( DDR_REG_BASE + 0x527fa*4+0x02000000,0xc00f); +reg_write( DDR_REG_BASE + 0x527fb*4+0x02000000,0x20f5); +reg_write( DDR_REG_BASE + 0x527fc*4+0x02000000,0x83); +reg_write( DDR_REG_BASE + 0x527fd*4+0x02000000,0xc00e); +reg_write( DDR_REG_BASE + 0x527fe*4+0x02000000,0x20f5); +reg_write( DDR_REG_BASE + 0x527ff*4+0x02000000,0x8c); +reg_write( DDR_REG_BASE + 0x52800*4+0x02000000,0x4c70); +reg_write( DDR_REG_BASE + 0x52801*4+0x02000000,0x2048); +reg_write( DDR_REG_BASE + 0x52802*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52803*4+0x02000000,0x7d0e); +reg_write( DDR_REG_BASE + 0x52804*4+0x02000000,0xd77); +reg_write( DDR_REG_BASE + 0x52805*4+0x02000000,0x11b3); +reg_write( DDR_REG_BASE + 0x52806*4+0x02000000,0x43a9); +reg_write( DDR_REG_BASE + 0x52807*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE + 0x52808*4+0x02000000,0x203c); +reg_write( DDR_REG_BASE + 0x52809*4+0x02000000,0x3cd); +reg_write( DDR_REG_BASE + 0x5280a*4+0x02000000,0x97b); +reg_write( DDR_REG_BASE + 0x5280b*4+0x02000000,0x360); +reg_write( DDR_REG_BASE + 0x5280c*4+0x02000000,0x43e1); +reg_write( DDR_REG_BASE + 0x5280d*4+0x02000000,0xc015); +reg_write( DDR_REG_BASE + 0x5280e*4+0x02000000,0xc216); +reg_write( DDR_REG_BASE + 0x5280f*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x52810*4+0x02000000,0x1c); +reg_write( DDR_REG_BASE + 0x52811*4+0x02000000,0x3); +reg_write( DDR_REG_BASE + 0x52812*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x52813*4+0x02000000,0x2078); +reg_write( DDR_REG_BASE + 0x52814*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52815*4+0x02000000,0x8c6); +reg_write( DDR_REG_BASE + 0x52816*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52817*4+0x02000000,0x1c00); +reg_write( DDR_REG_BASE + 0x52818*4+0x02000000,0x32c0); +reg_write( DDR_REG_BASE + 0x52819*4+0x02000000,0x40e1); +reg_write( DDR_REG_BASE + 0x5281a*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x5281b*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5281c*4+0x02000000,0x716f); +reg_write( DDR_REG_BASE + 0x5281d*4+0x02000000,0x2004); +reg_write( DDR_REG_BASE + 0x5281e*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x5281f*4+0x02000000,0x37fe); +reg_write( DDR_REG_BASE + 0x52820*4+0x02000000,0xff00); +reg_write( DDR_REG_BASE + 0x52821*4+0x02000000,0xc01a); +reg_write( DDR_REG_BASE + 0x52822*4+0x02000000,0x2055); +reg_write( DDR_REG_BASE + 0x52823*4+0x02000000,0x8c2); +reg_write( DDR_REG_BASE + 0x52824*4+0x02000000,0xc01b); +reg_write( DDR_REG_BASE + 0x52825*4+0x02000000,0x7a05); +reg_write( DDR_REG_BASE + 0x52826*4+0x02000000,0xc016); +reg_write( DDR_REG_BASE + 0x52827*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x52828*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x52829*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5282a*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x5282b*4+0x02000000,0x7845); +reg_write( DDR_REG_BASE + 0x5282c*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x5282d*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x5282e*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x5282f*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE + 0x52830*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x52831*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52832*4+0x02000000,0x9260); +reg_write( DDR_REG_BASE + 0x52833*4+0x02000000,0xc01c); +reg_write( DDR_REG_BASE + 0x52834*4+0x02000000,0xc19d); +reg_write( DDR_REG_BASE + 0x52835*4+0x02000000,0x2133); +reg_write( DDR_REG_BASE + 0x52836*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52837*4+0x02000000,0x41a1); +reg_write( DDR_REG_BASE + 0x52838*4+0x02000000,0x6078); +reg_write( DDR_REG_BASE + 0x52839*4+0x02000000,0x780e); +reg_write( DDR_REG_BASE + 0x5283a*4+0x02000000,0x2048); +reg_write( DDR_REG_BASE + 0x5283b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5283c*4+0x02000000,0x2049); +reg_write( DDR_REG_BASE + 0x5283d*4+0x02000000,0x800); +reg_write( DDR_REG_BASE + 0x5283e*4+0x02000000,0xf008); +reg_write( DDR_REG_BASE + 0x5283f*4+0x02000000,0xc010); +reg_write( DDR_REG_BASE + 0x52840*4+0x02000000,0x2014); +reg_write( DDR_REG_BASE + 0x52841*4+0x02000000,0x82); +reg_write( DDR_REG_BASE + 0x52842*4+0x02000000,0x6478); +reg_write( DDR_REG_BASE + 0x52843*4+0x02000000,0x781c); +reg_write( DDR_REG_BASE + 0x52844*4+0x02000000,0x2048); +reg_write( DDR_REG_BASE + 0x52845*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52846*4+0x02000000,0xb200); +reg_write( DDR_REG_BASE + 0x52847*4+0x02000000,0xc011); +reg_write( DDR_REG_BASE + 0x52848*4+0x02000000,0x71e5); +reg_write( DDR_REG_BASE + 0x52849*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE + 0x5284a*4+0x02000000,0xc051); +reg_write( DDR_REG_BASE + 0x5284b*4+0x02000000,0xf4d); +reg_write( DDR_REG_BASE + 0x5284c*4+0x02000000,0x9254); +reg_write( DDR_REG_BASE + 0x5284d*4+0x02000000,0xc014); +reg_write( DDR_REG_BASE + 0x5284e*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE + 0x5284f*4+0x02000000,0xc054); +reg_write( DDR_REG_BASE + 0x52850*4+0x02000000,0xc014); +reg_write( DDR_REG_BASE + 0x52851*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x52852*4+0x02000000,0xc056); +reg_write( DDR_REG_BASE + 0x52853*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x52854*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52855*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE + 0x52856*4+0x02000000,0x8821); +reg_write( DDR_REG_BASE + 0x52857*4+0x02000000,0xc016); +reg_write( DDR_REG_BASE + 0x52858*4+0x02000000,0x92b); +reg_write( DDR_REG_BASE + 0x52859*4+0x02000000,0x8025); +reg_write( DDR_REG_BASE + 0x5285a*4+0x02000000,0x7077); +reg_write( DDR_REG_BASE + 0x5285b*4+0x02000000,0xd64); +reg_write( DDR_REG_BASE + 0x5285c*4+0x02000000,0xfec2); +reg_write( DDR_REG_BASE + 0x5285d*4+0x02000000,0xc013); +reg_write( DDR_REG_BASE + 0x5285e*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE + 0x5285f*4+0x02000000,0xc053); +reg_write( DDR_REG_BASE + 0x52860*4+0x02000000,0x7077); +reg_write( DDR_REG_BASE + 0x52861*4+0x02000000,0xf54f); +reg_write( DDR_REG_BASE + 0x52862*4+0x02000000,0xc017); +reg_write( DDR_REG_BASE + 0x52863*4+0x02000000,0xe837); +reg_write( DDR_REG_BASE + 0x52864*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x52865*4+0x02000000,0x1d); +reg_write( DDR_REG_BASE + 0x52866*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52867*4+0x02000000,0xf96); +reg_write( DDR_REG_BASE + 0x52868*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x52869*4+0x02000000,0x740c); +reg_write( DDR_REG_BASE + 0x5286a*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x5286b*4+0x02000000,0x709b); +reg_write( DDR_REG_BASE + 0x5286c*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5286d*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE + 0x5286e*4+0x02000000,0xf022); +reg_write( DDR_REG_BASE + 0x5286f*4+0x02000000,0xd39); +reg_write( DDR_REG_BASE + 0x52870*4+0x02000000,0x1230); +reg_write( DDR_REG_BASE + 0x52871*4+0x02000000,0x78db); +reg_write( DDR_REG_BASE + 0x52872*4+0x02000000,0x2004); +reg_write( DDR_REG_BASE + 0x52873*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x52874*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x52875*4+0x02000000,0xfffe); +reg_write( DDR_REG_BASE + 0x52876*4+0x02000000,0xc00f); +reg_write( DDR_REG_BASE + 0x52877*4+0x02000000,0x2035); +reg_write( DDR_REG_BASE + 0x52878*4+0x02000000,0x42); +reg_write( DDR_REG_BASE + 0x52879*4+0x02000000,0xc00e); +reg_write( DDR_REG_BASE + 0x5287a*4+0x02000000,0x2035); +reg_write( DDR_REG_BASE + 0x5287b*4+0x02000000,0x43); +reg_write( DDR_REG_BASE + 0x5287c*4+0x02000000,0xc010); +reg_write( DDR_REG_BASE + 0x5287d*4+0x02000000,0x2035); +reg_write( DDR_REG_BASE + 0x5287e*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x5287f*4+0x02000000,0xc341); +reg_write( DDR_REG_BASE + 0x52880*4+0x02000000,0xc240); +reg_write( DDR_REG_BASE + 0x52881*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x52882*4+0x02000000,0x740c); +reg_write( DDR_REG_BASE + 0x52883*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x52884*4+0x02000000,0x1f); +reg_write( DDR_REG_BASE + 0x52885*4+0x02000000,0x5); +reg_write( DDR_REG_BASE + 0x52886*4+0x02000000,0x42e1); +reg_write( DDR_REG_BASE + 0x52887*4+0x02000000,0xf56); +reg_write( DDR_REG_BASE + 0x52888*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x52889*4+0x02000000,0x43a1); +reg_write( DDR_REG_BASE + 0x5288a*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE + 0x5288b*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE + 0x5288c*4+0x02000000,0xdc7); +reg_write( DDR_REG_BASE + 0x5288d*4+0x02000000,0x9254); +reg_write( DDR_REG_BASE + 0x5288e*4+0x02000000,0x7167); +reg_write( DDR_REG_BASE + 0x5288f*4+0x02000000,0x7ed0); +reg_write( DDR_REG_BASE + 0x52890*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x52891*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52892*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE + 0x52893*4+0x02000000,0x8801); +reg_write( DDR_REG_BASE + 0x52894*4+0x02000000,0x272f); +reg_write( DDR_REG_BASE + 0x52895*4+0x02000000,0x16c7); +reg_write( DDR_REG_BASE + 0x52896*4+0x02000000,0x8ed); +reg_write( DDR_REG_BASE + 0x52897*4+0x02000000,0x83e5); +reg_write( DDR_REG_BASE + 0x52898*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x52899*4+0x02000000,0xc9a); +reg_write( DDR_REG_BASE + 0x5289a*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x5289b*4+0x02000000,0xc019); +reg_write( DDR_REG_BASE + 0x5289c*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x5289d*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x5289e*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x5289f*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x528a0*4+0x02000000,0xe004); +reg_write( DDR_REG_BASE + 0x528a1*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x528a2*4+0x02000000,0x7082); +reg_write( DDR_REG_BASE + 0x528a3*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x528a4*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE + 0x528a5*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x528a6*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x528a7*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE + 0x528a8*4+0x02000000,0x8821); +reg_write( DDR_REG_BASE + 0x528a9*4+0x02000000,0x225f); +reg_write( DDR_REG_BASE + 0x528aa*4+0x02000000,0x243); +reg_write( DDR_REG_BASE + 0x528ab*4+0x02000000,0xf02e); +reg_write( DDR_REG_BASE + 0x528ac*4+0x02000000,0x260a); +reg_write( DDR_REG_BASE + 0x528ad*4+0x02000000,0x30c0); +reg_write( DDR_REG_BASE + 0x528ae*4+0x02000000,0xf026); +reg_write( DDR_REG_BASE + 0x528af*4+0x02000000,0xc010); +reg_write( DDR_REG_BASE + 0x528b0*4+0x02000000,0x20f5); +reg_write( DDR_REG_BASE + 0x528b1*4+0x02000000,0x78e); +reg_write( DDR_REG_BASE + 0x528b2*4+0x02000000,0x2640); +reg_write( DDR_REG_BASE + 0x528b3*4+0x02000000,0x305e); +reg_write( DDR_REG_BASE + 0x528b4*4+0x02000000,0x78dc); +reg_write( DDR_REG_BASE + 0x528b5*4+0x02000000,0x781c); +reg_write( DDR_REG_BASE + 0x528b6*4+0x02000000,0x781c); +reg_write( DDR_REG_BASE + 0x528b7*4+0x02000000,0x781c); +reg_write( DDR_REG_BASE + 0x528b8*4+0x02000000,0x4508); +reg_write( DDR_REG_BASE + 0x528b9*4+0x02000000,0xd81b); +reg_write( DDR_REG_BASE + 0x528ba*4+0x02000000,0xb861); +reg_write( DDR_REG_BASE + 0x528bb*4+0x02000000,0x801); +reg_write( DDR_REG_BASE + 0x528bc*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x528bd*4+0x02000000,0x7dbd); +reg_write( DDR_REG_BASE + 0x528be*4+0x02000000,0x66b8); +reg_write( DDR_REG_BASE + 0x528bf*4+0x02000000,0xb8c4); +reg_write( DDR_REG_BASE + 0x528c0*4+0x02000000,0x48b5); +reg_write( DDR_REG_BASE + 0x528c1*4+0x02000000,0x2e44); +reg_write( DDR_REG_BASE + 0x528c2*4+0x02000000,0x1800); +reg_write( DDR_REG_BASE + 0x528c3*4+0x02000000,0x6cc1); +reg_write( DDR_REG_BASE + 0x528c4*4+0x02000000,0x249a); +reg_write( DDR_REG_BASE + 0x528c5*4+0x02000000,0x1008); +reg_write( DDR_REG_BASE + 0x528c6*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x528c7*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x528c8*4+0x02000000,0x7d05); +reg_write( DDR_REG_BASE + 0x528c9*4+0x02000000,0x221a); +reg_write( DDR_REG_BASE + 0x528ca*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x528cb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x528cc*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE + 0x528cd*4+0x02000000,0x7885); +reg_write( DDR_REG_BASE + 0x528ce*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x528cf*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x528d0*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x528d1*4+0x02000000,0x64); +reg_write( DDR_REG_BASE + 0x528d2*4+0x02000000,0xb0a0); +reg_write( DDR_REG_BASE + 0x528d3*4+0x02000000,0x44c9); +reg_write( DDR_REG_BASE + 0x528d4*4+0x02000000,0xcb7); +reg_write( DDR_REG_BASE + 0x528d5*4+0x02000000,0x9214); +reg_write( DDR_REG_BASE + 0x528d6*4+0x02000000,0x7144); +reg_write( DDR_REG_BASE + 0x528d7*4+0x02000000,0xe309); +reg_write( DDR_REG_BASE + 0x528d8*4+0x02000000,0x9a9); +reg_write( DDR_REG_BASE + 0x528d9*4+0x02000000,0x80a5); +reg_write( DDR_REG_BASE + 0x528da*4+0x02000000,0x708d); +reg_write( DDR_REG_BASE + 0x528db*4+0x02000000,0xc00e); +reg_write( DDR_REG_BASE + 0x528dc*4+0x02000000,0xc117); +reg_write( DDR_REG_BASE + 0x528dd*4+0x02000000,0xc210); +reg_write( DDR_REG_BASE + 0x528de*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x528df*4+0x02000000,0xc012); +reg_write( DDR_REG_BASE + 0x528e0*4+0x02000000,0x95e); +reg_write( DDR_REG_BASE + 0x528e1*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x528e2*4+0x02000000,0xc30f); +reg_write( DDR_REG_BASE + 0x528e3*4+0x02000000,0x2480); +reg_write( DDR_REG_BASE + 0x528e4*4+0x02000000,0x3606); +reg_write( DDR_REG_BASE + 0x528e5*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x528e6*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x528e7*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x528e8*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x528e9*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x528ea*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x528eb*4+0x02000000,0xc1a8); +reg_write( DDR_REG_BASE + 0x528ec*4+0x02000000,0xfca); +reg_write( DDR_REG_BASE + 0x528ed*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE + 0x528ee*4+0x02000000,0x4708); +reg_write( DDR_REG_BASE + 0x528ef*4+0x02000000,0x83e); +reg_write( DDR_REG_BASE + 0x528f0*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE + 0x528f1*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE + 0x528f2*4+0x02000000,0x896); +reg_write( DDR_REG_BASE + 0x528f3*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE + 0x528f4*4+0x02000000,0xc047); +reg_write( DDR_REG_BASE + 0x528f5*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x528f6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x528f7*4+0x02000000,0xcccc); +reg_write( DDR_REG_BASE + 0x528f8*4+0x02000000,0x4608); +reg_write( DDR_REG_BASE + 0x528f9*4+0x02000000,0x706c); +reg_write( DDR_REG_BASE + 0x528fa*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x528fb*4+0x02000000,0x4220); +reg_write( DDR_REG_BASE + 0x528fc*4+0x02000000,0x4568); +reg_write( DDR_REG_BASE + 0x528fd*4+0x02000000,0x94a); +reg_write( DDR_REG_BASE + 0x528fe*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE + 0x528ff*4+0x02000000,0xc340); +reg_write( DDR_REG_BASE + 0x52900*4+0x02000000,0xd808); +reg_write( DDR_REG_BASE + 0x52901*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52902*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x52903*4+0x02000000,0x706c); +reg_write( DDR_REG_BASE + 0x52904*4+0x02000000,0x93a); +reg_write( DDR_REG_BASE + 0x52905*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE + 0x52906*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x52907*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x52908*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x52909*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE + 0x5290a*4+0x02000000,0xc105); +reg_write( DDR_REG_BASE + 0x5290b*4+0x02000000,0x9fe); +reg_write( DDR_REG_BASE + 0x5290c*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x5290d*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x5290e*4+0x02000000,0x1200); +reg_write( DDR_REG_BASE + 0x5290f*4+0x02000000,0x3083); +reg_write( DDR_REG_BASE + 0x52910*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52911*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52912*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x52913*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x52914*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x52915*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x52916*4+0x02000000,0xabe); +reg_write( DDR_REG_BASE + 0x52917*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x52918*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x52919*4+0x02000000,0x7fef); +reg_write( DDR_REG_BASE + 0x5291a*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x5291b*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x5291c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5291d*4+0x02000000,0x4400); +reg_write( DDR_REG_BASE + 0x5291e*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x5291f*4+0x02000000,0xdb7c); +reg_write( DDR_REG_BASE + 0x52920*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE + 0x52921*4+0x02000000,0x3041); +reg_write( DDR_REG_BASE + 0x52922*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE + 0x52923*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x52924*4+0x02000000,0xaa2); +reg_write( DDR_REG_BASE + 0x52925*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x52926*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x52927*4+0x02000000,0xca08); +reg_write( DDR_REG_BASE + 0x52928*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x52929*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5292a*4+0x02000000,0x7500); +reg_write( DDR_REG_BASE + 0x5292b*4+0x02000000,0x724c); +reg_write( DDR_REG_BASE + 0x5292c*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE + 0x5292d*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x5292e*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x5292f*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE + 0x52930*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x52931*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x52932*4+0x02000000,0xa86); +reg_write( DDR_REG_BASE + 0x52933*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x52934*4+0x02000000,0x4338); +reg_write( DDR_REG_BASE + 0x52935*4+0x02000000,0xb46); +reg_write( DDR_REG_BASE + 0x52936*4+0x02000000,0xfe0f); +reg_write( DDR_REG_BASE + 0x52937*4+0x02000000,0x2644); +reg_write( DDR_REG_BASE + 0x52938*4+0x02000000,0x1040); +reg_write( DDR_REG_BASE + 0x52939*4+0x02000000,0x60d8); +reg_write( DDR_REG_BASE + 0x5293a*4+0x02000000,0xe010); +reg_write( DDR_REG_BASE + 0x5293b*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x5293c*4+0x02000000,0xc046); +reg_write( DDR_REG_BASE + 0x5293d*4+0x02000000,0xc306); +reg_write( DDR_REG_BASE + 0x5293e*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x5293f*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE + 0x52940*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x52941*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x52942*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x52943*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x52944*4+0x02000000,0xa62); +reg_write( DDR_REG_BASE + 0x52945*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x52946*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x52947*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52948*4+0x02000000,0xa1a); +reg_write( DDR_REG_BASE + 0x52949*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x5294a*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x5294b*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x5294c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5294d*4+0x02000000,0x3333); +reg_write( DDR_REG_BASE + 0x5294e*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE + 0x5294f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52950*4+0x02000000,0x9999); +reg_write( DDR_REG_BASE + 0x52951*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x52952*4+0x02000000,0x4220); +reg_write( DDR_REG_BASE + 0x52953*4+0x02000000,0x89e); +reg_write( DDR_REG_BASE + 0x52954*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE + 0x52955*4+0x02000000,0xc340); +reg_write( DDR_REG_BASE + 0x52956*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x52957*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52958*4+0x02000000,0xaaaa); +reg_write( DDR_REG_BASE + 0x52959*4+0x02000000,0xd808); +reg_write( DDR_REG_BASE + 0x5295a*4+0x02000000,0x4220); +reg_write( DDR_REG_BASE + 0x5295b*4+0x02000000,0x706c); +reg_write( DDR_REG_BASE + 0x5295c*4+0x02000000,0x88a); +reg_write( DDR_REG_BASE + 0x5295d*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE + 0x5295e*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x5295f*4+0x02000000,0xc105); +reg_write( DDR_REG_BASE + 0x52960*4+0x02000000,0x952); +reg_write( DDR_REG_BASE + 0x52961*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x52962*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52963*4+0x02000000,0x1200); +reg_write( DDR_REG_BASE + 0x52964*4+0x02000000,0x3083); +reg_write( DDR_REG_BASE + 0x52965*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52966*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52967*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x52968*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x52969*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x5296a*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x5296b*4+0x02000000,0xa16); +reg_write( DDR_REG_BASE + 0x5296c*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x5296d*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x5296e*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE + 0x5296f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52970*4+0x02000000,0x4400); +reg_write( DDR_REG_BASE + 0x52971*4+0x02000000,0xbeaa); +reg_write( DDR_REG_BASE + 0x52972*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52973*4+0x02000000,0x41c1); +reg_write( DDR_REG_BASE + 0x52974*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x52975*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE + 0x52976*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x52977*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x52978*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x52979*4+0x02000000,0x9fa); +reg_write( DDR_REG_BASE + 0x5297a*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x5297b*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x5297c*4+0x02000000,0xca08); +reg_write( DDR_REG_BASE + 0x5297d*4+0x02000000,0x4163); +reg_write( DDR_REG_BASE + 0x5297e*4+0x02000000,0x724c); +reg_write( DDR_REG_BASE + 0x5297f*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE + 0x52980*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52981*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x52982*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE + 0x52983*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x52984*4+0x02000000,0x9e2); +reg_write( DDR_REG_BASE + 0x52985*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x52986*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x52987*4+0x02000000,0xaa2); +reg_write( DDR_REG_BASE + 0x52988*4+0x02000000,0xfe0f); +reg_write( DDR_REG_BASE + 0x52989*4+0x02000000,0xc306); +reg_write( DDR_REG_BASE + 0x5298a*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x5298b*4+0x02000000,0x41c1); +reg_write( DDR_REG_BASE + 0x5298c*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x5298d*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x5298e*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE + 0x5298f*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x52990*4+0x02000000,0x9ca); +reg_write( DDR_REG_BASE + 0x52991*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x52992*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x52993*4+0x02000000,0xca08); +reg_write( DDR_REG_BASE + 0x52994*4+0x02000000,0x2350); +reg_write( DDR_REG_BASE + 0x52995*4+0x02000000,0x3301); +reg_write( DDR_REG_BASE + 0x52996*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE + 0x52997*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE + 0x52998*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52999*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x5299a*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE + 0x5299b*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x5299c*4+0x02000000,0x9b2); +reg_write( DDR_REG_BASE + 0x5299d*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x5299e*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x5299f*4+0x02000000,0xc104); +reg_write( DDR_REG_BASE + 0x529a0*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE + 0x529a1*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x529a2*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x529a3*4+0x02000000,0x2014); +reg_write( DDR_REG_BASE + 0x529a4*4+0x02000000,0x41); +reg_write( DDR_REG_BASE + 0x529a5*4+0x02000000,0x4958); +reg_write( DDR_REG_BASE + 0x529a6*4+0x02000000,0xb8c0); +reg_write( DDR_REG_BASE + 0x529a7*4+0x02000000,0x6038); +reg_write( DDR_REG_BASE + 0x529a8*4+0x02000000,0xe028); +reg_write( DDR_REG_BASE + 0x529a9*4+0x02000000,0x7b0f); +reg_write( DDR_REG_BASE + 0x529aa*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x529ab*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x529ac*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x529ad*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x529ae*4+0x02000000,0x98e); +reg_write( DDR_REG_BASE + 0x529af*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x529b0*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x529b1*4+0x02000000,0x79db); +reg_write( DDR_REG_BASE + 0x529b2*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x529b3*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x529b4*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE + 0x529b5*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE + 0x529b6*4+0x02000000,0x30c1); +reg_write( DDR_REG_BASE + 0x529b7*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x529b8*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x529b9*4+0x02000000,0x97a); +reg_write( DDR_REG_BASE + 0x529ba*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x529bb*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x529bc*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x529bd*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x529be*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x529bf*4+0x02000000,0xdb10); +reg_write( DDR_REG_BASE + 0x529c0*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x529c1*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x529c2*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x529c3*4+0x02000000,0x966); +reg_write( DDR_REG_BASE + 0x529c4*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x529c5*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x529c6*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x529c7*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x529c8*4+0x02000000,0x764c); +reg_write( DDR_REG_BASE + 0x529c9*4+0x02000000,0xdb26); +reg_write( DDR_REG_BASE + 0x529ca*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x529cb*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE + 0x529cc*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x529cd*4+0x02000000,0x952); +reg_write( DDR_REG_BASE + 0x529ce*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x529cf*4+0x02000000,0x1c00); +reg_write( DDR_REG_BASE + 0x529d0*4+0x02000000,0x3041); +reg_write( DDR_REG_BASE + 0x529d1*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x529d2*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE + 0x529d3*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x529d4*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x529d5*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x529d6*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x529d7*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x529d8*4+0x02000000,0x93a); +reg_write( DDR_REG_BASE + 0x529d9*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x529da*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x529db*4+0x02000000,0xc0a8); +reg_write( DDR_REG_BASE + 0x529dc*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x529dd*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x529de*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x529df*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x529e0*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x529e1*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x529e2*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x529e3*4+0x02000000,0xc1a6); +reg_write( DDR_REG_BASE + 0x529e4*4+0x02000000,0xc144); +reg_write( DDR_REG_BASE + 0x529e5*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x529e6*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x529e7*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE + 0x529e8*4+0x02000000,0x8920); +reg_write( DDR_REG_BASE + 0x529e9*4+0x02000000,0x4358); +reg_write( DDR_REG_BASE + 0x529ea*4+0x02000000,0x7034); +reg_write( DDR_REG_BASE + 0x529eb*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x529ec*4+0x02000000,0xf206); +reg_write( DDR_REG_BASE + 0x529ed*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x529ee*4+0x02000000,0x708f); +reg_write( DDR_REG_BASE + 0x529ef*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x529f0*4+0x02000000,0x49); +reg_write( DDR_REG_BASE + 0x529f1*4+0x02000000,0xf006); +reg_write( DDR_REG_BASE + 0x529f2*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x529f3*4+0x02000000,0x708f); +reg_write( DDR_REG_BASE + 0x529f4*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x529f5*4+0x02000000,0x23); +reg_write( DDR_REG_BASE + 0x529f6*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE + 0x529f7*4+0x02000000,0x7c2); +reg_write( DDR_REG_BASE + 0x529f8*4+0x02000000,0x4020); +reg_write( DDR_REG_BASE + 0x529f9*4+0x02000000,0xea06); +reg_write( DDR_REG_BASE + 0x529fa*4+0x02000000,0xba61); +reg_write( DDR_REG_BASE + 0x529fb*4+0x02000000,0xa01); +reg_write( DDR_REG_BASE + 0x529fc*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x529fd*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x529fe*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE + 0x529ff*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52a00*4+0x02000000,0x812); +reg_write( DDR_REG_BASE + 0x52a01*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x52a02*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52a03*4+0x02000000,0x70cd); +reg_write( DDR_REG_BASE + 0x52a04*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x52a05*4+0x02000000,0xf02a); +reg_write( DDR_REG_BASE + 0x52a06*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x52a07*4+0x02000000,0x2012); +reg_write( DDR_REG_BASE + 0x52a08*4+0x02000000,0x340); +reg_write( DDR_REG_BASE + 0x52a09*4+0x02000000,0x262f); +reg_write( DDR_REG_BASE + 0x52a0a*4+0x02000000,0xf007); +reg_write( DDR_REG_BASE + 0x52a0b*4+0x02000000,0xf47); +reg_write( DDR_REG_BASE + 0x52a0c*4+0x02000000,0x136e); +reg_write( DDR_REG_BASE + 0x52a0d*4+0x02000000,0x26ca); +reg_write( DDR_REG_BASE + 0x52a0e*4+0x02000000,0x1341); +reg_write( DDR_REG_BASE + 0x52a0f*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x52a10*4+0x02000000,0x4200); +reg_write( DDR_REG_BASE + 0x52a11*4+0x02000000,0x2544); +reg_write( DDR_REG_BASE + 0x52a12*4+0x02000000,0x17c0); +reg_write( DDR_REG_BASE + 0x52a13*4+0x02000000,0xe806); +reg_write( DDR_REG_BASE + 0x52a14*4+0x02000000,0xb861); +reg_write( DDR_REG_BASE + 0x52a15*4+0x02000000,0x801); +reg_write( DDR_REG_BASE + 0x52a16*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x52a17*4+0x02000000,0x7a5b); +reg_write( DDR_REG_BASE + 0x52a18*4+0x02000000,0x255a); +reg_write( DDR_REG_BASE + 0x52a19*4+0x02000000,0x1c81); +reg_write( DDR_REG_BASE + 0x52a1a*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x52a1b*4+0x02000000,0x7077); +reg_write( DDR_REG_BASE + 0x52a1c*4+0x02000000,0xdb18); +reg_write( DDR_REG_BASE + 0x52a1d*4+0x02000000,0x6038); +reg_write( DDR_REG_BASE + 0x52a1e*4+0x02000000,0x880b); +reg_write( DDR_REG_BASE + 0x52a1f*4+0x02000000,0x794f); +reg_write( DDR_REG_BASE + 0x52a20*4+0x02000000,0xc142); +reg_write( DDR_REG_BASE + 0x52a21*4+0x02000000,0x20ec); +reg_write( DDR_REG_BASE + 0x52a22*4+0x02000000,0x62); +reg_write( DDR_REG_BASE + 0x52a23*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x52a24*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52a25*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52a26*4+0x02000000,0x734c); +reg_write( DDR_REG_BASE + 0x52a27*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE + 0x52a28*4+0x02000000,0x3001); +reg_write( DDR_REG_BASE + 0x52a29*4+0x02000000,0xa1a); +reg_write( DDR_REG_BASE + 0x52a2a*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x52a2b*4+0x02000000,0x1c04); +reg_write( DDR_REG_BASE + 0x52a2c*4+0x02000000,0x32c1); +reg_write( DDR_REG_BASE + 0x52a2d*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE + 0x52a2e*4+0x02000000,0xdb1); +reg_write( DDR_REG_BASE + 0x52a2f*4+0x02000000,0x90b4); +reg_write( DDR_REG_BASE + 0x52a30*4+0x02000000,0x7077); +reg_write( DDR_REG_BASE + 0x52a31*4+0x02000000,0x265a); +reg_write( DDR_REG_BASE + 0x52a32*4+0x02000000,0x1c8e); +reg_write( DDR_REG_BASE + 0x52a33*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x52a34*4+0x02000000,0x734c); +reg_write( DDR_REG_BASE + 0x52a35*4+0x02000000,0x60d8); +reg_write( DDR_REG_BASE + 0x52a36*4+0x02000000,0x8822); +reg_write( DDR_REG_BASE + 0x52a37*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52a38*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE + 0x52a39*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x52a3a*4+0x02000000,0x21cf); +reg_write( DDR_REG_BASE + 0x52a3b*4+0x02000000,0x1e2); +reg_write( DDR_REG_BASE + 0x52a3c*4+0x02000000,0xc140); +reg_write( DDR_REG_BASE + 0x52a3d*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x52a3e*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x52a3f*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52a40*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52a41*4+0x02000000,0xdb18); +reg_write( DDR_REG_BASE + 0x52a42*4+0x02000000,0x9e6); +reg_write( DDR_REG_BASE + 0x52a43*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x52a44*4+0x02000000,0x1c04); +reg_write( DDR_REG_BASE + 0x52a45*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x52a46*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52a47*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x52a48*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x52a49*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x52a4a*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52a4b*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52a4c*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x52a4d*4+0x02000000,0xdb31); +reg_write( DDR_REG_BASE + 0x52a4e*4+0x02000000,0x84e); +reg_write( DDR_REG_BASE + 0x52a4f*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x52a50*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE + 0x52a51*4+0x02000000,0x3401); +reg_write( DDR_REG_BASE + 0x52a52*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52a53*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE + 0x52a54*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x52a55*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x52a56*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x52a57*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52a58*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE + 0x52a59*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x52a5a*4+0x02000000,0x836); +reg_write( DDR_REG_BASE + 0x52a5b*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x52a5c*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x52a5d*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52a5e*4+0x02000000,0xfee); +reg_write( DDR_REG_BASE + 0x52a5f*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52a60*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x52a61*4+0x02000000,0xc0a6); +reg_write( DDR_REG_BASE + 0x52a62*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x52a63*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x52a64*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x52a65*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x52a66*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x52a67*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x52a68*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x52a69*4+0x02000000,0xc1a4); +reg_write( DDR_REG_BASE + 0x52a6a*4+0x02000000,0x4528); +reg_write( DDR_REG_BASE + 0x52a6b*4+0x02000000,0xd46); +reg_write( DDR_REG_BASE + 0x52a6c*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE + 0x52a6d*4+0x02000000,0x4608); +reg_write( DDR_REG_BASE + 0x52a6e*4+0x02000000,0x4318); +reg_write( DDR_REG_BASE + 0x52a6f*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52a70*4+0x02000000,0xf32); +reg_write( DDR_REG_BASE + 0x52a71*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52a72*4+0x02000000,0xd908); +reg_write( DDR_REG_BASE + 0x52a73*4+0x02000000,0x70ed); +reg_write( DDR_REG_BASE + 0x52a74*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52a75*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52a76*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x52a77*4+0x02000000,0xdb7c); +reg_write( DDR_REG_BASE + 0x52a78*4+0x02000000,0xc743); +reg_write( DDR_REG_BASE + 0x52a79*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x52a7a*4+0x02000000,0xc741); +reg_write( DDR_REG_BASE + 0x52a7b*4+0x02000000,0xff6); +reg_write( DDR_REG_BASE + 0x52a7c*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52a7d*4+0x02000000,0xc740); +reg_write( DDR_REG_BASE + 0x52a7e*4+0x02000000,0x9aa); +reg_write( DDR_REG_BASE + 0x52a7f*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x52a80*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52a81*4+0x02000000,0x2344); +reg_write( DDR_REG_BASE + 0x52a82*4+0x02000000,0x3040); +reg_write( DDR_REG_BASE + 0x52a83*4+0x02000000,0x7063); +reg_write( DDR_REG_BASE + 0x52a84*4+0x02000000,0x2040); +reg_write( DDR_REG_BASE + 0x52a85*4+0x02000000,0xb9b); +reg_write( DDR_REG_BASE + 0x52a86*4+0x02000000,0xed12); +reg_write( DDR_REG_BASE + 0x52a87*4+0x02000000,0xf82c); +reg_write( DDR_REG_BASE + 0x52a88*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE + 0x52a89*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x52a8a*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x52a8b*4+0x02000000,0xc741); +reg_write( DDR_REG_BASE + 0x52a8c*4+0x02000000,0xfd2); +reg_write( DDR_REG_BASE + 0x52a8d*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52a8e*4+0x02000000,0xc740); +reg_write( DDR_REG_BASE + 0x52a8f*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52a90*4+0x02000000,0xd90c); +reg_write( DDR_REG_BASE + 0x52a91*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE + 0x52a92*4+0x02000000,0x756c); +reg_write( DDR_REG_BASE + 0x52a93*4+0x02000000,0xc743); +reg_write( DDR_REG_BASE + 0x52a94*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x52a95*4+0x02000000,0xc741); +reg_write( DDR_REG_BASE + 0x52a96*4+0x02000000,0xc740); +reg_write( DDR_REG_BASE + 0x52a97*4+0x02000000,0xf008); +reg_write( DDR_REG_BASE + 0x52a98*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE + 0x52a99*4+0x02000000,0x3101); +reg_write( DDR_REG_BASE + 0x52a9a*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x52a9b*4+0x02000000,0xc741); +reg_write( DDR_REG_BASE + 0x52a9c*4+0x02000000,0xc740); +reg_write( DDR_REG_BASE + 0x52a9d*4+0x02000000,0xf821); +reg_write( DDR_REG_BASE + 0x52a9e*4+0x02000000,0xfae); +reg_write( DDR_REG_BASE + 0x52a9f*4+0x02000000,0xfd8f); +reg_write( DDR_REG_BASE + 0x52aa0*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52aa1*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52aa2*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE + 0x52aa3*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x52aa4*4+0x02000000,0xc743); +reg_write( DDR_REG_BASE + 0x52aa5*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x52aa6*4+0x02000000,0xc741); +reg_write( DDR_REG_BASE + 0x52aa7*4+0x02000000,0xf9e); +reg_write( DDR_REG_BASE + 0x52aa8*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52aa9*4+0x02000000,0xc740); +reg_write( DDR_REG_BASE + 0x52aaa*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x52aab*4+0x02000000,0x232f); +reg_write( DDR_REG_BASE + 0x52aac*4+0x02000000,0x6c7); +reg_write( DDR_REG_BASE + 0x52aad*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52aae*4+0x02000000,0xd90c); +reg_write( DDR_REG_BASE + 0x52aaf*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE + 0x52ab0*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x52ab1*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x52ab2*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x52ab3*4+0x02000000,0xf86); +reg_write( DDR_REG_BASE + 0x52ab4*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52ab5*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x52ab6*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52ab7*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52ab8*4+0x02000000,0xb98f); +reg_write( DDR_REG_BASE + 0x52ab9*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x52aba*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE + 0x52abb*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE + 0x52abc*4+0x02000000,0x30c1); +reg_write( DDR_REG_BASE + 0x52abd*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x52abe*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x52abf*4+0x02000000,0xf6e); +reg_write( DDR_REG_BASE + 0x52ac0*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52ac1*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x52ac2*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52ac3*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52ac4*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x52ac5*4+0x02000000,0xdb10); +reg_write( DDR_REG_BASE + 0x52ac6*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x52ac7*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x52ac8*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x52ac9*4+0x02000000,0xf5a); +reg_write( DDR_REG_BASE + 0x52aca*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52acb*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x52acc*4+0x02000000,0x8f2); +reg_write( DDR_REG_BASE + 0x52acd*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x52ace*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52acf*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52ad0*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE + 0x52ad1*4+0x02000000,0x764c); +reg_write( DDR_REG_BASE + 0x52ad2*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x52ad3*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x52ad4*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x52ad5*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x52ad6*4+0x02000000,0xf3e); +reg_write( DDR_REG_BASE + 0x52ad7*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52ad8*4+0x02000000,0x1c00); +reg_write( DDR_REG_BASE + 0x52ad9*4+0x02000000,0x3041); +reg_write( DDR_REG_BASE + 0x52ada*4+0x02000000,0xc0a4); +reg_write( DDR_REG_BASE + 0x52adb*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x52adc*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x52add*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x52ade*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52adf*4+0x02000000,0xd90c); +reg_write( DDR_REG_BASE + 0x52ae0*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE + 0x52ae1*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x52ae2*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x52ae3*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x52ae4*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x52ae5*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x52ae6*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x52ae7*4+0x02000000,0xc1aa); +reg_write( DDR_REG_BASE + 0x52ae8*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE + 0x52ae9*4+0x02000000,0xc00f); +reg_write( DDR_REG_BASE + 0x52aea*4+0x02000000,0xc147); +reg_write( DDR_REG_BASE + 0x52aeb*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x52aec*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x52aed*4+0x02000000,0x600); +reg_write( DDR_REG_BASE + 0x52aee*4+0x02000000,0x7906); +reg_write( DDR_REG_BASE + 0x52aef*4+0x02000000,0xc348); +reg_write( DDR_REG_BASE + 0x52af0*4+0x02000000,0xc246); +reg_write( DDR_REG_BASE + 0x52af1*4+0x02000000,0xc049); +reg_write( DDR_REG_BASE + 0x52af2*4+0x02000000,0xe983); +reg_write( DDR_REG_BASE + 0x52af3*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52af4*4+0x02000000,0xf002); +reg_write( DDR_REG_BASE + 0x52af5*4+0x02000000,0xd840); +reg_write( DDR_REG_BASE + 0x52af6*4+0x02000000,0xe26); +reg_write( DDR_REG_BASE + 0x52af7*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52af8*4+0x02000000,0xd9ff); +reg_write( DDR_REG_BASE + 0x52af9*4+0x02000000,0x70ed); +reg_write( DDR_REG_BASE + 0x52afa*4+0x02000000,0x43f9); +reg_write( DDR_REG_BASE + 0x52afb*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x52afc*4+0x02000000,0xf03e); +reg_write( DDR_REG_BASE + 0x52afd*4+0x02000000,0x2332); +reg_write( DDR_REG_BASE + 0x52afe*4+0x02000000,0x3f8e); +reg_write( DDR_REG_BASE + 0x52aff*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52b00*4+0x02000000,0x680); +reg_write( DDR_REG_BASE + 0x52b01*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52b02*4+0x02000000,0xa96); +reg_write( DDR_REG_BASE + 0x52b03*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x52b04*4+0x02000000,0x42c1); +reg_write( DDR_REG_BASE + 0x52b05*4+0x02000000,0xc209); +reg_write( DDR_REG_BASE + 0x52b06*4+0x02000000,0x7944); +reg_write( DDR_REG_BASE + 0x52b07*4+0x02000000,0xc208); +reg_write( DDR_REG_BASE + 0x52b08*4+0x02000000,0x7844); +reg_write( DDR_REG_BASE + 0x52b09*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x52b0a*4+0x02000000,0x807e); +reg_write( DDR_REG_BASE + 0x52b0b*4+0x02000000,0xf42f); +reg_write( DDR_REG_BASE + 0x52b0c*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE + 0x52b0d*4+0x02000000,0x60c8); +reg_write( DDR_REG_BASE + 0x52b0e*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE + 0x52b0f*4+0x02000000,0x2342); +reg_write( DDR_REG_BASE + 0x52b10*4+0x02000000,0x3180); +reg_write( DDR_REG_BASE + 0x52b11*4+0x02000000,0x83b); +reg_write( DDR_REG_BASE + 0x52b12*4+0x02000000,0xf5); +reg_write( DDR_REG_BASE + 0x52b13*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52b14*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x52b15*4+0x02000000,0x734c); +reg_write( DDR_REG_BASE + 0x52b16*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x52b17*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52b18*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE + 0x52b19*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x52b1a*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x52b1b*4+0x02000000,0x836); +reg_write( DDR_REG_BASE + 0x52b1c*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x52b1d*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x52b1e*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x52b1f*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52b20*4+0x02000000,0x734c); +reg_write( DDR_REG_BASE + 0x52b21*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x52b22*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x52b23*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE + 0x52b24*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x52b25*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x52b26*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52b27*4+0x02000000,0x81e); +reg_write( DDR_REG_BASE + 0x52b28*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x52b29*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x52b2a*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x52b2b*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x52b2c*4+0x02000000,0xf004); +reg_write( DDR_REG_BASE + 0x52b2d*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x52b2e*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x52b2f*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x52b30*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x52b31*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52b32*4+0x02000000,0x734c); +reg_write( DDR_REG_BASE + 0x52b33*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x52b34*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52b35*4+0x02000000,0xdb18); +reg_write( DDR_REG_BASE + 0x52b36*4+0x02000000,0xffe); +reg_write( DDR_REG_BASE + 0x52b37*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52b38*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x52b39*4+0x02000000,0x7167); +reg_write( DDR_REG_BASE + 0x52b3a*4+0x02000000,0xb87); +reg_write( DDR_REG_BASE + 0x52b3b*4+0x02000000,0xb274); +reg_write( DDR_REG_BASE + 0x52b3c*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x52b3d*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE + 0x52b3e*4+0x02000000,0xe80e); +reg_write( DDR_REG_BASE + 0x52b3f*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x52b40*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52b41*4+0x02000000,0x734c); +reg_write( DDR_REG_BASE + 0x52b42*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x52b43*4+0x02000000,0xd856); +reg_write( DDR_REG_BASE + 0x52b44*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x52b45*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52b46*4+0x02000000,0xdb18); +reg_write( DDR_REG_BASE + 0x52b47*4+0x02000000,0xc743); +reg_write( DDR_REG_BASE + 0x52b48*4+0x02000000,0xe5a); +reg_write( DDR_REG_BASE + 0x52b49*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52b4a*4+0x02000000,0x1c04); +reg_write( DDR_REG_BASE + 0x52b4b*4+0x02000000,0x3281); +reg_write( DDR_REG_BASE + 0x52b4c*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52b4d*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52b4e*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x52b4f*4+0x02000000,0xdb41); +reg_write( DDR_REG_BASE + 0x52b50*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE + 0x52b51*4+0x02000000,0x3401); +reg_write( DDR_REG_BASE + 0x52b52*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE + 0x52b53*4+0x02000000,0xc741); +reg_write( DDR_REG_BASE + 0x52b54*4+0x02000000,0xe42); +reg_write( DDR_REG_BASE + 0x52b55*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52b56*4+0x02000000,0xc740); +reg_write( DDR_REG_BASE + 0x52b57*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52b58*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE + 0x52b59*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x52b5a*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x52b5b*4+0x02000000,0xc743); +reg_write( DDR_REG_BASE + 0x52b5c*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE + 0x52b5d*4+0x02000000,0xc741); +reg_write( DDR_REG_BASE + 0x52b5e*4+0x02000000,0xe2e); +reg_write( DDR_REG_BASE + 0x52b5f*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52b60*4+0x02000000,0xc740); +reg_write( DDR_REG_BASE + 0x52b61*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52b62*4+0x02000000,0xde6); +reg_write( DDR_REG_BASE + 0x52b63*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52b64*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x52b65*4+0x02000000,0xc0aa); +reg_write( DDR_REG_BASE + 0x52b66*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x52b67*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x52b68*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x52b69*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x52b6a*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x52b6b*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x52b6c*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x52b6d*4+0x02000000,0xc1a5); +reg_write( DDR_REG_BASE + 0x52b6e*4+0x02000000,0x4608); +reg_write( DDR_REG_BASE + 0x52b6f*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52b70*4+0x02000000,0xd32); +reg_write( DDR_REG_BASE + 0x52b71*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52b72*4+0x02000000,0xd9ff); +reg_write( DDR_REG_BASE + 0x52b73*4+0x02000000,0x47cb); +reg_write( DDR_REG_BASE + 0x52b74*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE + 0x52b75*4+0x02000000,0x1e0); +reg_write( DDR_REG_BASE + 0x52b76*4+0x02000000,0x9700); +reg_write( DDR_REG_BASE + 0x52b77*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x52b78*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x52b79*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x52b7a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52b7b*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE + 0x52b7c*4+0x02000000,0xb886); +reg_write( DDR_REG_BASE + 0x52b7d*4+0x02000000,0xb700); +reg_write( DDR_REG_BASE + 0x52b7e*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52b7f*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x52b80*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE + 0x52b81*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x52b82*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x52b83*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x52b84*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x52b85*4+0x02000000,0xde2); +reg_write( DDR_REG_BASE + 0x52b86*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52b87*4+0x02000000,0x4338); +reg_write( DDR_REG_BASE + 0x52b88*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52b89*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52b8a*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x52b8b*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE + 0x52b8c*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x52b8d*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x52b8e*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x52b8f*4+0x02000000,0xdce); +reg_write( DDR_REG_BASE + 0x52b90*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52b91*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x52b92*4+0x02000000,0x2355); +reg_write( DDR_REG_BASE + 0x52b93*4+0x02000000,0x3801); +reg_write( DDR_REG_BASE + 0x52b94*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52b95*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x52b96*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE + 0x52b97*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x52b98*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x52b99*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x52b9a*4+0x02000000,0xdb6); +reg_write( DDR_REG_BASE + 0x52b9b*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52b9c*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x52b9d*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52b9e*4+0x02000000,0xd6e); +reg_write( DDR_REG_BASE + 0x52b9f*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52ba0*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x52ba1*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x52ba2*4+0x02000000,0xb700); +reg_write( DDR_REG_BASE + 0x52ba3*4+0x02000000,0xc0a5); +reg_write( DDR_REG_BASE + 0x52ba4*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x52ba5*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x52ba6*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x52ba7*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x52ba8*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x52ba9*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x52baa*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x52bab*4+0x02000000,0xc1a4); +reg_write( DDR_REG_BASE + 0x52bac*4+0x02000000,0x4608); +reg_write( DDR_REG_BASE + 0x52bad*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52bae*4+0x02000000,0xcb6); +reg_write( DDR_REG_BASE + 0x52baf*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52bb0*4+0x02000000,0xd9ff); +reg_write( DDR_REG_BASE + 0x52bb1*4+0x02000000,0x47cb); +reg_write( DDR_REG_BASE + 0x52bb2*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE + 0x52bb3*4+0x02000000,0x1e0); +reg_write( DDR_REG_BASE + 0x52bb4*4+0x02000000,0x1700); +reg_write( DDR_REG_BASE + 0x52bb5*4+0x02000000,0x111b); +reg_write( DDR_REG_BASE + 0x52bb6*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52bb7*4+0x02000000,0xda0c); +reg_write( DDR_REG_BASE + 0x52bb8*4+0x02000000,0x234f); +reg_write( DDR_REG_BASE + 0x52bb9*4+0x02000000,0x3180); +reg_write( DDR_REG_BASE + 0x52bba*4+0x02000000,0xb700); +reg_write( DDR_REG_BASE + 0x52bbb*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x52bbc*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE + 0x52bbd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52bbe*4+0x02000000,0x3ffc); +reg_write( DDR_REG_BASE + 0x52bbf*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52bc0*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE + 0x52bc1*4+0x02000000,0x4528); +reg_write( DDR_REG_BASE + 0x52bc2*4+0x02000000,0xc143); +reg_write( DDR_REG_BASE + 0x52bc3*4+0x02000000,0xc141); +reg_write( DDR_REG_BASE + 0x52bc4*4+0x02000000,0xd62); +reg_write( DDR_REG_BASE + 0x52bc5*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52bc6*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x52bc7*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52bc8*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE + 0x52bc9*4+0x02000000,0xda0c); +reg_write( DDR_REG_BASE + 0x52bca*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE + 0x52bcb*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x52bcc*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x52bcd*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x52bce*4+0x02000000,0xd4e); +reg_write( DDR_REG_BASE + 0x52bcf*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52bd0*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x52bd1*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52bd2*4+0x02000000,0xd06); +reg_write( DDR_REG_BASE + 0x52bd3*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52bd4*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x52bd5*4+0x02000000,0x1f00); +reg_write( DDR_REG_BASE + 0x52bd6*4+0x02000000,0x16c4); +reg_write( DDR_REG_BASE + 0x52bd7*4+0x02000000,0xc0a4); +reg_write( DDR_REG_BASE + 0x52bd8*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x52bd9*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x52bda*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x52bdb*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x52bdc*4+0x02000000,0xc2e2); +reg_write( DDR_REG_BASE + 0x52bdd*4+0x02000000,0xc1a4); +reg_write( DDR_REG_BASE + 0x52bde*4+0x02000000,0x4508); +reg_write( DDR_REG_BASE + 0x52bdf*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52be0*4+0x02000000,0xc52); +reg_write( DDR_REG_BASE + 0x52be1*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52be2*4+0x02000000,0xd9ff); +reg_write( DDR_REG_BASE + 0x52be3*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x52be4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52be5*4+0x02000000,0xaff); +reg_write( DDR_REG_BASE + 0x52be6*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x52be7*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52be8*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE + 0x52be9*4+0x02000000,0xda0c); +reg_write( DDR_REG_BASE + 0x52bea*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x52beb*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE + 0x52bec*4+0x02000000,0x3001); +reg_write( DDR_REG_BASE + 0x52bed*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x52bee*4+0x02000000,0xd0e); +reg_write( DDR_REG_BASE + 0x52bef*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52bf0*4+0x02000000,0x1c04); +reg_write( DDR_REG_BASE + 0x52bf1*4+0x02000000,0x3001); +reg_write( DDR_REG_BASE + 0x52bf2*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52bf3*4+0x02000000,0xcc6); +reg_write( DDR_REG_BASE + 0x52bf4*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52bf5*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x52bf6*4+0x02000000,0xc0a4); +reg_write( DDR_REG_BASE + 0x52bf7*4+0x02000000,0xc6c2); +reg_write( DDR_REG_BASE + 0x52bf8*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x52bf9*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x52bfa*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x52bfb*4+0x02000000,0xc1a8); +reg_write( DDR_REG_BASE + 0x52bfc*4+0x02000000,0xc144); +reg_write( DDR_REG_BASE + 0x52bfd*4+0x02000000,0xd949); +reg_write( DDR_REG_BASE + 0x52bfe*4+0x02000000,0xb99f); +reg_write( DDR_REG_BASE + 0x52bff*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE + 0x52c00*4+0x02000000,0x8900); +reg_write( DDR_REG_BASE + 0x52c01*4+0x02000000,0x11da); +reg_write( DDR_REG_BASE + 0x52c02*4+0x02000000,0x808f); +reg_write( DDR_REG_BASE + 0x52c03*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x52c04*4+0x02000000,0xc046); +reg_write( DDR_REG_BASE + 0x52c05*4+0x02000000,0xc00d); +reg_write( DDR_REG_BASE + 0x52c06*4+0x02000000,0x71cd); +reg_write( DDR_REG_BASE + 0x52c07*4+0x02000000,0xc342); +reg_write( DDR_REG_BASE + 0x52c08*4+0x02000000,0xc243); +reg_write( DDR_REG_BASE + 0x52c09*4+0x02000000,0xc047); +reg_write( DDR_REG_BASE + 0x52c0a*4+0x02000000,0xf033); +reg_write( DDR_REG_BASE + 0x52c0b*4+0x02000000,0x2544); +reg_write( DDR_REG_BASE + 0x52c0c*4+0x02000000,0x17c1); +reg_write( DDR_REG_BASE + 0x52c0d*4+0x02000000,0x706f); +reg_write( DDR_REG_BASE + 0x52c0e*4+0x02000000,0xe905); +reg_write( DDR_REG_BASE + 0x52c0f*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE + 0x52c10*4+0x02000000,0x9ff); +reg_write( DDR_REG_BASE + 0x52c11*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE + 0x52c12*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x52c13*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x52c14*4+0x02000000,0xf026); +reg_write( DDR_REG_BASE + 0x52c15*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE + 0x52c16*4+0x02000000,0xc201); +reg_write( DDR_REG_BASE + 0x52c17*4+0x02000000,0xc107); +reg_write( DDR_REG_BASE + 0x52c18*4+0x02000000,0x7077); +reg_write( DDR_REG_BASE + 0x52c19*4+0x02000000,0x20ca); +reg_write( DDR_REG_BASE + 0x52c1a*4+0x02000000,0x3c1); +reg_write( DDR_REG_BASE + 0x52c1b*4+0x02000000,0x7944); +reg_write( DDR_REG_BASE + 0x52c1c*4+0x02000000,0x790b); +reg_write( DDR_REG_BASE + 0x52c1d*4+0x02000000,0xf21d); +reg_write( DDR_REG_BASE + 0x52c1e*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE + 0x52c1f*4+0x02000000,0x2344); +reg_write( DDR_REG_BASE + 0x52c20*4+0x02000000,0x37c1); +reg_write( DDR_REG_BASE + 0x52c21*4+0x02000000,0xe906); +reg_write( DDR_REG_BASE + 0x52c22*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE + 0x52c23*4+0x02000000,0x901); +reg_write( DDR_REG_BASE + 0x52c24*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x52c25*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x52c26*4+0x02000000,0xbce); +reg_write( DDR_REG_BASE + 0x52c27*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x52c28*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x52c29*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE + 0x52c2a*4+0x02000000,0xc105); +reg_write( DDR_REG_BASE + 0x52c2b*4+0x02000000,0xc204); +reg_write( DDR_REG_BASE + 0x52c2c*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x52c2d*4+0x02000000,0x4063); +reg_write( DDR_REG_BASE + 0x52c2e*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x52c2f*4+0x02000000,0x901); +reg_write( DDR_REG_BASE + 0x52c30*4+0x02000000,0xc303); +reg_write( DDR_REG_BASE + 0x52c31*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x52c32*4+0x02000000,0x255a); +reg_write( DDR_REG_BASE + 0x52c33*4+0x02000000,0x1c80); +reg_write( DDR_REG_BASE + 0x52c34*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x52c35*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x52c36*4+0x02000000,0xd5e); +reg_write( DDR_REG_BASE + 0x52c37*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x52c38*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x52c39*4+0x02000000,0x7167); +reg_write( DDR_REG_BASE + 0x52c3a*4+0x02000000,0xbb7); +reg_write( DDR_REG_BASE + 0x52c3b*4+0x02000000,0xb094); +reg_write( DDR_REG_BASE + 0x52c3c*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE + 0x52c3d*4+0x02000000,0xd9f); +reg_write( DDR_REG_BASE + 0x52c3e*4+0x02000000,0x90b4); +reg_write( DDR_REG_BASE + 0x52c3f*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE + 0x52c40*4+0x02000000,0xb9a); +reg_write( DDR_REG_BASE + 0x52c41*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x52c42*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE + 0x52c43*4+0x02000000,0xc0a8); +reg_write( DDR_REG_BASE + 0x52c44*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x52c45*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x52c46*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x52c47*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x52c48*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x52c49*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x52c4a*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x52c4b*4+0x02000000,0xc1a4); +reg_write( DDR_REG_BASE + 0x52c4c*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x52c4d*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x52c4e*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52c4f*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE + 0x52c50*4+0x02000000,0x8800); +reg_write( DDR_REG_BASE + 0x52c51*4+0x02000000,0x4378); +reg_write( DDR_REG_BASE + 0x52c52*4+0x02000000,0x4748); +reg_write( DDR_REG_BASE + 0x52c53*4+0x02000000,0xc143); +reg_write( DDR_REG_BASE + 0x52c54*4+0x02000000,0xe806); +reg_write( DDR_REG_BASE + 0x52c55*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x52c56*4+0x02000000,0x708e); +reg_write( DDR_REG_BASE + 0x52c57*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52c58*4+0x02000000,0x49); +reg_write( DDR_REG_BASE + 0x52c59*4+0x02000000,0xf006); +reg_write( DDR_REG_BASE + 0x52c5a*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x52c5b*4+0x02000000,0x708e); +reg_write( DDR_REG_BASE + 0x52c5c*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52c5d*4+0x02000000,0x23); +reg_write( DDR_REG_BASE + 0x52c5e*4+0x02000000,0xc009); +reg_write( DDR_REG_BASE + 0x52c5f*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x52c60*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x52c61*4+0x02000000,0xf01d); +reg_write( DDR_REG_BASE + 0x52c62*4+0x02000000,0xe35); +reg_write( DDR_REG_BASE + 0x52c63*4+0x02000000,0x136e); +reg_write( DDR_REG_BASE + 0x52c64*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x52c65*4+0x02000000,0x4200); +reg_write( DDR_REG_BASE + 0x52c66*4+0x02000000,0x2544); +reg_write( DDR_REG_BASE + 0x52c67*4+0x02000000,0x17c0); +reg_write( DDR_REG_BASE + 0x52c68*4+0x02000000,0xe805); +reg_write( DDR_REG_BASE + 0x52c69*4+0x02000000,0xb861); +reg_write( DDR_REG_BASE + 0x52c6a*4+0x02000000,0x8ff); +reg_write( DDR_REG_BASE + 0x52c6b*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE + 0x52c6c*4+0x02000000,0x7a5b); +reg_write( DDR_REG_BASE + 0x52c6d*4+0x02000000,0xc103); +reg_write( DDR_REG_BASE + 0x52c6e*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x52c6f*4+0x02000000,0x4363); +reg_write( DDR_REG_BASE + 0x52c70*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x52c71*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE + 0x52c72*4+0x02000000,0x209f); +reg_write( DDR_REG_BASE + 0x52c73*4+0x02000000,0x901); +reg_write( DDR_REG_BASE + 0x52c74*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x52c75*4+0x02000000,0x255a); +reg_write( DDR_REG_BASE + 0x52c76*4+0x02000000,0x1c80); +reg_write( DDR_REG_BASE + 0x52c77*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x52c78*4+0x02000000,0x784f); +reg_write( DDR_REG_BASE + 0x52c79*4+0x02000000,0xcda); +reg_write( DDR_REG_BASE + 0x52c7a*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x52c7b*4+0x02000000,0x42e1); +reg_write( DDR_REG_BASE + 0x52c7c*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE + 0x52c7d*4+0x02000000,0xdcd); +reg_write( DDR_REG_BASE + 0x52c7e*4+0x02000000,0x9094); +reg_write( DDR_REG_BASE + 0x52c7f*4+0x02000000,0xc0a4); +reg_write( DDR_REG_BASE + 0x52c80*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x52c81*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x52c82*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x52c83*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x52c84*4+0x02000000,0xc2e4); +reg_write( DDR_REG_BASE + 0x52c85*4+0x02000000,0xc1a4); +reg_write( DDR_REG_BASE + 0x52c86*4+0x02000000,0x4508); +reg_write( DDR_REG_BASE + 0x52c87*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x52c88*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x52c89*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52c8a*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x52c8b*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x52c8c*4+0x02000000,0xf83); +reg_write( DDR_REG_BASE + 0x52c8d*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x52c8e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52c8f*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x52c90*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE + 0x52c91*4+0x02000000,0x100); +reg_write( DDR_REG_BASE + 0x52c92*4+0x02000000,0x2305); +reg_write( DDR_REG_BASE + 0x52c93*4+0x02000000,0xc); +reg_write( DDR_REG_BASE + 0x52c94*4+0x02000000,0x7204); +reg_write( DDR_REG_BASE + 0x52c95*4+0x02000000,0x7865); +reg_write( DDR_REG_BASE + 0x52c96*4+0x02000000,0xb420); +reg_write( DDR_REG_BASE + 0x52c97*4+0x02000000,0xb040); +reg_write( DDR_REG_BASE + 0x52c98*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52c99*4+0x02000000,0xae2); +reg_write( DDR_REG_BASE + 0x52c9a*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52c9b*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52c9c*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52c9d*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52c9e*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x52c9f*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE + 0x52ca0*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE + 0x52ca1*4+0x02000000,0x30c1); +reg_write( DDR_REG_BASE + 0x52ca2*4+0x02000000,0x4628); +reg_write( DDR_REG_BASE + 0x52ca3*4+0x02000000,0xc142); +reg_write( DDR_REG_BASE + 0x52ca4*4+0x02000000,0xc141); +reg_write( DDR_REG_BASE + 0x52ca5*4+0x02000000,0xba2); +reg_write( DDR_REG_BASE + 0x52ca6*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52ca7*4+0x02000000,0xc140); +reg_write( DDR_REG_BASE + 0x52ca8*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52ca9*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52caa*4+0x02000000,0xb98d); +reg_write( DDR_REG_BASE + 0x52cab*4+0x02000000,0x734c); +reg_write( DDR_REG_BASE + 0x52cac*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x52cad*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE + 0x52cae*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x52caf*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x52cb0*4+0x02000000,0xb8a); +reg_write( DDR_REG_BASE + 0x52cb1*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52cb2*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x52cb3*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52cb4*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE + 0x52cb5*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x52cb6*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE + 0x52cb7*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE + 0x52cb8*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x52cb9*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x52cba*4+0x02000000,0xb76); +reg_write( DDR_REG_BASE + 0x52cbb*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52cbc*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x52cbd*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52cbe*4+0x02000000,0xb2e); +reg_write( DDR_REG_BASE + 0x52cbf*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52cc0*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x52cc1*4+0x02000000,0xc0a4); +reg_write( DDR_REG_BASE + 0x52cc2*4+0x02000000,0xc6c4); +reg_write( DDR_REG_BASE + 0x52cc3*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x52cc4*4+0x02000000,0xc2e2); +reg_write( DDR_REG_BASE + 0x52cc5*4+0x02000000,0x260a); +reg_write( DDR_REG_BASE + 0x52cc6*4+0x02000000,0x3040); +reg_write( DDR_REG_BASE + 0x52cc7*4+0x02000000,0x4308); +reg_write( DDR_REG_BASE + 0x52cc8*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x52cc9*4+0x02000000,0xf024); +reg_write( DDR_REG_BASE + 0x52cca*4+0x02000000,0x255a); +reg_write( DDR_REG_BASE + 0x52ccb*4+0x02000000,0x1182); +reg_write( DDR_REG_BASE + 0x52ccc*4+0x02000000,0x7261); +reg_write( DDR_REG_BASE + 0x52ccd*4+0x02000000,0x8a01); +reg_write( DDR_REG_BASE + 0x52cce*4+0x02000000,0x8a60); +reg_write( DDR_REG_BASE + 0x52ccf*4+0x02000000,0x8a22); +reg_write( DDR_REG_BASE + 0x52cd0*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x52cd1*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x52cd2*4+0x02000000,0x7b05); +reg_write( DDR_REG_BASE + 0x52cd3*4+0x02000000,0x8a03); +reg_write( DDR_REG_BASE + 0x52cd4*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x52cd5*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x52cd6*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x52cd7*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x52cd8*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x52cd9*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x52cda*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52cdb*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x52cdc*4+0x02000000,0xc1); +reg_write( DDR_REG_BASE + 0x52cdd*4+0x02000000,0x8a05); +reg_write( DDR_REG_BASE + 0x52cde*4+0x02000000,0x8a64); +reg_write( DDR_REG_BASE + 0x52cdf*4+0x02000000,0x7734); +reg_write( DDR_REG_BASE + 0x52ce0*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x52ce1*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x52ce2*4+0x02000000,0x7865); +reg_write( DDR_REG_BASE + 0x52ce3*4+0x02000000,0xf207); +reg_write( DDR_REG_BASE + 0x52ce4*4+0x02000000,0x793b); +reg_write( DDR_REG_BASE + 0x52ce5*4+0x02000000,0xb99c); +reg_write( DDR_REG_BASE + 0x52ce6*4+0x02000000,0xb99f); +reg_write( DDR_REG_BASE + 0x52ce7*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE + 0x52ce8*4+0x02000000,0xf003); +reg_write( DDR_REG_BASE + 0x52ce9*4+0x02000000,0xc92); +reg_write( DDR_REG_BASE + 0x52cea*4+0x02000000,0xfe4f); +reg_write( DDR_REG_BASE + 0x52ceb*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE + 0x52cec*4+0x02000000,0x2e45); +reg_write( DDR_REG_BASE + 0x52ced*4+0x02000000,0x3180); +reg_write( DDR_REG_BASE + 0x52cee*4+0x02000000,0xdb9); +reg_write( DDR_REG_BASE + 0x52cef*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x52cf0*4+0x02000000,0xc6c2); +reg_write( DDR_REG_BASE + 0x52cf1*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x52cf2*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x52cf3*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x52cf4*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x52cf5*4+0x02000000,0xc1a1); +reg_write( DDR_REG_BASE + 0x52cf6*4+0x02000000,0x4718); +reg_write( DDR_REG_BASE + 0x52cf7*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x52cf8*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52cf9*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE + 0x52cfa*4+0x02000000,0x88c0); +reg_write( DDR_REG_BASE + 0x52cfb*4+0x02000000,0x4338); +reg_write( DDR_REG_BASE + 0x52cfc*4+0x02000000,0xc340); +reg_write( DDR_REG_BASE + 0x52cfd*4+0x02000000,0xea04); +reg_write( DDR_REG_BASE + 0x52cfe*4+0x02000000,0x79db); +reg_write( DDR_REG_BASE + 0x52cff*4+0x02000000,0xf004); +reg_write( DDR_REG_BASE + 0x52d00*4+0x02000000,0x265f); +reg_write( DDR_REG_BASE + 0x52d01*4+0x02000000,0x1241); +reg_write( DDR_REG_BASE + 0x52d02*4+0x02000000,0x1001); +reg_write( DDR_REG_BASE + 0x52d03*4+0x02000000,0x9e); +reg_write( DDR_REG_BASE + 0x52d04*4+0x02000000,0x7054); +reg_write( DDR_REG_BASE + 0x52d05*4+0x02000000,0xdd08); +reg_write( DDR_REG_BASE + 0x52d06*4+0x02000000,0x25ca); +reg_write( DDR_REG_BASE + 0x52d07*4+0x02000000,0x1062); +reg_write( DDR_REG_BASE + 0x52d08*4+0x02000000,0xf039); +reg_write( DDR_REG_BASE + 0x52d09*4+0x02000000,0x40e1); +reg_write( DDR_REG_BASE + 0x52d0a*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x52d0b*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x52d0c*4+0x02000000,0xc300); +reg_write( DDR_REG_BASE + 0x52d0d*4+0x02000000,0x23f5); +reg_write( DDR_REG_BASE + 0x52d0e*4+0x02000000,0x3042); +reg_write( DDR_REG_BASE + 0x52d0f*4+0x02000000,0xeb13); +reg_write( DDR_REG_BASE + 0x52d10*4+0x02000000,0x7c5c); +reg_write( DDR_REG_BASE + 0x52d11*4+0x02000000,0x7c9c); +reg_write( DDR_REG_BASE + 0x52d12*4+0x02000000,0x7c9c); +reg_write( DDR_REG_BASE + 0x52d13*4+0x02000000,0x7c9c); +reg_write( DDR_REG_BASE + 0x52d14*4+0x02000000,0x224a); +reg_write( DDR_REG_BASE + 0x52d15*4+0x02000000,0x16c0); +reg_write( DDR_REG_BASE + 0x52d16*4+0x02000000,0x2a44); +reg_write( DDR_REG_BASE + 0x52d17*4+0x02000000,0x803); +reg_write( DDR_REG_BASE + 0x52d18*4+0x02000000,0x2242); +reg_write( DDR_REG_BASE + 0x52d19*4+0x02000000,0x104a); +reg_write( DDR_REG_BASE + 0x52d1a*4+0x02000000,0xafd); +reg_write( DDR_REG_BASE + 0x52d1b*4+0x02000000,0x9031); +reg_write( DDR_REG_BASE + 0x52d1c*4+0x02000000,0x7c9d); +reg_write( DDR_REG_BASE + 0x52d1d*4+0x02000000,0x629a); +reg_write( DDR_REG_BASE + 0x52d1e*4+0x02000000,0xbac4); +reg_write( DDR_REG_BASE + 0x52d1f*4+0x02000000,0x4a94); +reg_write( DDR_REG_BASE + 0x52d20*4+0x02000000,0xf00d); +reg_write( DDR_REG_BASE + 0x52d21*4+0x02000000,0x248a); +reg_write( DDR_REG_BASE + 0x52d22*4+0x02000000,0x1fcf); +reg_write( DDR_REG_BASE + 0x52d23*4+0x02000000,0x7c44); +reg_write( DDR_REG_BASE + 0x52d24*4+0x02000000,0x2204); +reg_write( DDR_REG_BASE + 0x52d25*4+0x02000000,0xf83); +reg_write( DDR_REG_BASE + 0x52d26*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52d27*4+0x02000000,0xfc00); +reg_write( DDR_REG_BASE + 0x52d28*4+0x02000000,0xda0a); +reg_write( DDR_REG_BASE + 0x52d29*4+0x02000000,0xba61); +reg_write( DDR_REG_BASE + 0x52d2a*4+0x02000000,0xaff); +reg_write( DDR_REG_BASE + 0x52d2b*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE + 0x52d2c*4+0x02000000,0x7b7d); +reg_write( DDR_REG_BASE + 0x52d2d*4+0x02000000,0x261a); +reg_write( DDR_REG_BASE + 0x52d2e*4+0x02000000,0x1f82); +reg_write( DDR_REG_BASE + 0x52d2f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52d30*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x52d31*4+0x02000000,0x239a); +reg_write( DDR_REG_BASE + 0x52d32*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x52d33*4+0x02000000,0x71e5); +reg_write( DDR_REG_BASE + 0x52d34*4+0x02000000,0x7124); +reg_write( DDR_REG_BASE + 0x52d35*4+0x02000000,0x2205); +reg_write( DDR_REG_BASE + 0x52d36*4+0x02000000,0x7c2); +reg_write( DDR_REG_BASE + 0x52d37*4+0x02000000,0x7845); +reg_write( DDR_REG_BASE + 0x52d38*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x52d39*4+0x02000000,0xb891); +reg_write( DDR_REG_BASE + 0x52d3a*4+0x02000000,0xb89c); +reg_write( DDR_REG_BASE + 0x52d3b*4+0x02000000,0x7b85); +reg_write( DDR_REG_BASE + 0x52d3c*4+0x02000000,0xb89f); +reg_write( DDR_REG_BASE + 0x52d3d*4+0x02000000,0xb060); +reg_write( DDR_REG_BASE + 0x52d3e*4+0x02000000,0xd97); +reg_write( DDR_REG_BASE + 0x52d3f*4+0x02000000,0x93c5); +reg_write( DDR_REG_BASE + 0x52d40*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE + 0x52d41*4+0x02000000,0xefd); +reg_write( DDR_REG_BASE + 0x52d42*4+0x02000000,0xb3a5); +reg_write( DDR_REG_BASE + 0x52d43*4+0x02000000,0x70ed); +reg_write( DDR_REG_BASE + 0x52d44*4+0x02000000,0x7487); +reg_write( DDR_REG_BASE + 0x52d45*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x52d46*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x52d47*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x52d48*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x52d49*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x52d4a*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x52d4b*4+0x02000000,0xc1a9); +reg_write( DDR_REG_BASE + 0x52d4c*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52d4d*4+0x02000000,0xd72); +reg_write( DDR_REG_BASE + 0x52d4e*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52d4f*4+0x02000000,0x4318); +reg_write( DDR_REG_BASE + 0x52d50*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE + 0x52d51*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x52d52*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52d53*4+0x02000000,0x7b2); +reg_write( DDR_REG_BASE + 0x52d54*4+0x02000000,0x1003); +reg_write( DDR_REG_BASE + 0x52d55*4+0x02000000,0x8b); +reg_write( DDR_REG_BASE + 0x52d56*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x52d57*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52d58*4+0x02000000,0x7b2); +reg_write( DDR_REG_BASE + 0x52d59*4+0x02000000,0x88c2); +reg_write( DDR_REG_BASE + 0x52d5a*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x52d5b*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x52d5c*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52d5d*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x52d5e*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x52d5f*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x52d60*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x52d61*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52d62*4+0x02000000,0xc046); +reg_write( DDR_REG_BASE + 0x52d63*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52d64*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE + 0x52d65*4+0x02000000,0xf039); +reg_write( DDR_REG_BASE + 0x52d66*4+0x02000000,0x708d); +reg_write( DDR_REG_BASE + 0x52d67*4+0x02000000,0xf034); +reg_write( DDR_REG_BASE + 0x52d68*4+0x02000000,0x271a); +reg_write( DDR_REG_BASE + 0x52d69*4+0x02000000,0x1f8d); +reg_write( DDR_REG_BASE + 0x52d6a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52d6b*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x52d6c*4+0x02000000,0x224f); +reg_write( DDR_REG_BASE + 0x52d6d*4+0x02000000,0x80); +reg_write( DDR_REG_BASE + 0x52d6e*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x52d6f*4+0x02000000,0x82d); +reg_write( DDR_REG_BASE + 0x52d70*4+0x02000000,0x111); +reg_write( DDR_REG_BASE + 0x52d71*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x52d72*4+0x02000000,0x2055); +reg_write( DDR_REG_BASE + 0x52d73*4+0x02000000,0xd01); +reg_write( DDR_REG_BASE + 0x52d74*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE + 0x52d75*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x52d76*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x52d77*4+0x02000000,0x341); +reg_write( DDR_REG_BASE + 0x52d78*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE + 0x52d79*4+0x02000000,0x203c); +reg_write( DDR_REG_BASE + 0x52d7a*4+0x02000000,0x80); +reg_write( DDR_REG_BASE + 0x52d7b*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x52d7c*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x52d7d*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x52d7e*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x52d7f*4+0x02000000,0xb891); +reg_write( DDR_REG_BASE + 0x52d80*4+0x02000000,0xb89c); +reg_write( DDR_REG_BASE + 0x52d81*4+0x02000000,0xb89f); +reg_write( DDR_REG_BASE + 0x52d82*4+0x02000000,0x9080); +reg_write( DDR_REG_BASE + 0x52d83*4+0x02000000,0xbcc4); +reg_write( DDR_REG_BASE + 0x52d84*4+0x02000000,0x4c38); +reg_write( DDR_REG_BASE + 0x52d85*4+0x02000000,0x791b); +reg_write( DDR_REG_BASE + 0x52d86*4+0x02000000,0x216c); +reg_write( DDR_REG_BASE + 0x52d87*4+0x02000000,0x143); +reg_write( DDR_REG_BASE + 0x52d88*4+0x02000000,0xb8c4); +reg_write( DDR_REG_BASE + 0x52d89*4+0x02000000,0x7b05); +reg_write( DDR_REG_BASE + 0x52d8a*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x52d8b*4+0x02000000,0x2055); +reg_write( DDR_REG_BASE + 0x52d8c*4+0x02000000,0xc01); +reg_write( DDR_REG_BASE + 0x52d8d*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE + 0x52d8e*4+0x02000000,0x7905); +reg_write( DDR_REG_BASE + 0x52d8f*4+0x02000000,0x6a01); +reg_write( DDR_REG_BASE + 0x52d90*4+0x02000000,0x229a); +reg_write( DDR_REG_BASE + 0x52d91*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x52d92*4+0x02000000,0x7a25); +reg_write( DDR_REG_BASE + 0x52d93*4+0x02000000,0x7d45); +reg_write( DDR_REG_BASE + 0x52d94*4+0x02000000,0x79bb); +reg_write( DDR_REG_BASE + 0x52d95*4+0x02000000,0xb991); +reg_write( DDR_REG_BASE + 0x52d96*4+0x02000000,0xb99c); +reg_write( DDR_REG_BASE + 0x52d97*4+0x02000000,0xb99f); +reg_write( DDR_REG_BASE + 0x52d98*4+0x02000000,0xb160); +reg_write( DDR_REG_BASE + 0x52d99*4+0x02000000,0x4200); +reg_write( DDR_REG_BASE + 0x52d9a*4+0x02000000,0xa9d); +reg_write( DDR_REG_BASE + 0x52d9b*4+0x02000000,0x8254); +reg_write( DDR_REG_BASE + 0x52d9c*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE + 0x52d9d*4+0x02000000,0x7fcf); +reg_write( DDR_REG_BASE + 0x52d9e*4+0x02000000,0xb91); +reg_write( DDR_REG_BASE + 0x52d9f*4+0x02000000,0x93e5); +reg_write( DDR_REG_BASE + 0x52da0*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x52da1*4+0x02000000,0xa92); +reg_write( DDR_REG_BASE + 0x52da2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52da3*4+0x02000000,0xf36); +reg_write( DDR_REG_BASE + 0x52da4*4+0x02000000,0xfd8f); +reg_write( DDR_REG_BASE + 0x52da5*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x52da6*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x52da7*4+0x02000000,0xe004); +reg_write( DDR_REG_BASE + 0x52da8*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52da9*4+0x02000000,0x47cb); +reg_write( DDR_REG_BASE + 0x52daa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52dab*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE + 0x52dac*4+0x02000000,0x71cd); +reg_write( DDR_REG_BASE + 0x52dad*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE + 0x52dae*4+0x02000000,0xb1f0); +reg_write( DDR_REG_BASE + 0x52daf*4+0x02000000,0xb1d6); +reg_write( DDR_REG_BASE + 0x52db0*4+0x02000000,0xb1cf); +reg_write( DDR_REG_BASE + 0x52db1*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x52db2*4+0x02000000,0x710d); +reg_write( DDR_REG_BASE + 0x52db3*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x52db4*4+0x02000000,0x4a); +reg_write( DDR_REG_BASE + 0x52db5*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x52db6*4+0x02000000,0x41e1); +reg_write( DDR_REG_BASE + 0x52db7*4+0x02000000,0x42e1); +reg_write( DDR_REG_BASE + 0x52db8*4+0x02000000,0x43e1); +reg_write( DDR_REG_BASE + 0x52db9*4+0x02000000,0xfd2); +reg_write( DDR_REG_BASE + 0x52dba*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x52dbb*4+0x02000000,0xc740); +reg_write( DDR_REG_BASE + 0x52dbc*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52dbd*4+0x02000000,0xd9ff); +reg_write( DDR_REG_BASE + 0x52dbe*4+0x02000000,0x42c3); +reg_write( DDR_REG_BASE + 0x52dbf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52dc0*4+0x02000000,0xf000); +reg_write( DDR_REG_BASE + 0x52dc1*4+0x02000000,0x43e1); +reg_write( DDR_REG_BASE + 0x52dc2*4+0x02000000,0xfbe); +reg_write( DDR_REG_BASE + 0x52dc3*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x52dc4*4+0x02000000,0xc740); +reg_write( DDR_REG_BASE + 0x52dc5*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x52dc6*4+0x02000000,0x2344); +reg_write( DDR_REG_BASE + 0x52dc7*4+0x02000000,0x37ca); +reg_write( DDR_REG_BASE + 0x52dc8*4+0x02000000,0x43d9); +reg_write( DDR_REG_BASE + 0x52dc9*4+0x02000000,0xa13); +reg_write( DDR_REG_BASE + 0x52dca*4+0x02000000,0x1010); +reg_write( DDR_REG_BASE + 0x52dcb*4+0x02000000,0x2242); +reg_write( DDR_REG_BASE + 0x52dcc*4+0x02000000,0x104a); +reg_write( DDR_REG_BASE + 0x52dcd*4+0x02000000,0xaff); +reg_write( DDR_REG_BASE + 0x52dce*4+0x02000000,0x9031); +reg_write( DDR_REG_BASE + 0x52dcf*4+0x02000000,0x232f); +reg_write( DDR_REG_BASE + 0x52dd0*4+0x02000000,0x36c0); +reg_write( DDR_REG_BASE + 0x52dd1*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE + 0x52dd2*4+0x02000000,0x7ca); +reg_write( DDR_REG_BASE + 0x52dd3*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE + 0x52dd4*4+0x02000000,0xa0f); +reg_write( DDR_REG_BASE + 0x52dd5*4+0x02000000,0x1010); +reg_write( DDR_REG_BASE + 0x52dd6*4+0x02000000,0x2242); +reg_write( DDR_REG_BASE + 0x52dd7*4+0x02000000,0x104a); +reg_write( DDR_REG_BASE + 0x52dd8*4+0x02000000,0xafd); +reg_write( DDR_REG_BASE + 0x52dd9*4+0x02000000,0x9031); +reg_write( DDR_REG_BASE + 0x52dda*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x52ddb*4+0x02000000,0x2004); +reg_write( DDR_REG_BASE + 0x52ddc*4+0x02000000,0x8340); +reg_write( DDR_REG_BASE + 0x52ddd*4+0x02000000,0xc048); +reg_write( DDR_REG_BASE + 0x52dde*4+0x02000000,0xf20a); +reg_write( DDR_REG_BASE + 0x52ddf*4+0x02000000,0x740c); +reg_write( DDR_REG_BASE + 0x52de0*4+0x02000000,0xd9ff); +reg_write( DDR_REG_BASE + 0x52de1*4+0x02000000,0x42c3); +reg_write( DDR_REG_BASE + 0x52de2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52de3*4+0x02000000,0xf000); +reg_write( DDR_REG_BASE + 0x52de4*4+0x02000000,0x43e1); +reg_write( DDR_REG_BASE + 0x52de5*4+0x02000000,0xf7a); +reg_write( DDR_REG_BASE + 0x52de6*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x52de7*4+0x02000000,0xc740); +reg_write( DDR_REG_BASE + 0x52de8*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x52de9*4+0x02000000,0xbee); +reg_write( DDR_REG_BASE + 0x52dea*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52deb*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x52dec*4+0x02000000,0xea2); +reg_write( DDR_REG_BASE + 0x52ded*4+0x02000000,0xfdcf); +reg_write( DDR_REG_BASE + 0x52dee*4+0x02000000,0xc047); +reg_write( DDR_REG_BASE + 0x52def*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52df0*4+0x02000000,0x832); +reg_write( DDR_REG_BASE + 0x52df1*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52df2*4+0x02000000,0xd91f); +reg_write( DDR_REG_BASE + 0x52df3*4+0x02000000,0xca00); +reg_write( DDR_REG_BASE + 0x52df4*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x52df5*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52df6*4+0x02000000,0x7604); +reg_write( DDR_REG_BASE + 0x52df7*4+0x02000000,0xbd8e); +reg_write( DDR_REG_BASE + 0x52df8*4+0x02000000,0xc143); +reg_write( DDR_REG_BASE + 0x52df9*4+0x02000000,0x272f); +reg_write( DDR_REG_BASE + 0x52dfa*4+0x02000000,0x16c7); +reg_write( DDR_REG_BASE + 0x52dfb*4+0x02000000,0xc141); +reg_write( DDR_REG_BASE + 0x52dfc*4+0x02000000,0xc140); +reg_write( DDR_REG_BASE + 0x52dfd*4+0x02000000,0x7b0f); +reg_write( DDR_REG_BASE + 0x52dfe*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52dff*4+0x02000000,0x41a1); +reg_write( DDR_REG_BASE + 0x52e00*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x52e01*4+0x02000000,0x8ea); +reg_write( DDR_REG_BASE + 0x52e02*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52e03*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE + 0x52e04*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52e05*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x52e06*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x52e07*4+0x02000000,0x254f); +reg_write( DDR_REG_BASE + 0x52e08*4+0x02000000,0x1281); +reg_write( DDR_REG_BASE + 0x52e09*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52e0a*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x52e0b*4+0x02000000,0xdb7c); +reg_write( DDR_REG_BASE + 0x52e0c*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE + 0x52e0d*4+0x02000000,0x8d2); +reg_write( DDR_REG_BASE + 0x52e0e*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52e0f*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE + 0x52e10*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x52e11*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE + 0x52e12*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52e13*4+0x02000000,0x4400); +reg_write( DDR_REG_BASE + 0x52e14*4+0x02000000,0xf031); +reg_write( DDR_REG_BASE + 0x52e15*4+0x02000000,0x41c1); +reg_write( DDR_REG_BASE + 0x52e16*4+0x02000000,0x724c); +reg_write( DDR_REG_BASE + 0x52e17*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x52e18*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE + 0x52e19*4+0x02000000,0x30c1); +reg_write( DDR_REG_BASE + 0x52e1a*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE + 0x52e1b*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x52e1c*4+0x02000000,0x8b2); +reg_write( DDR_REG_BASE + 0x52e1d*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52e1e*4+0x02000000,0x1c00); +reg_write( DDR_REG_BASE + 0x52e1f*4+0x02000000,0x3201); +reg_write( DDR_REG_BASE + 0x52e20*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52e21*4+0x02000000,0x41c1); +reg_write( DDR_REG_BASE + 0x52e22*4+0x02000000,0x724c); +reg_write( DDR_REG_BASE + 0x52e23*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x52e24*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x52e25*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE + 0x52e26*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x52e27*4+0x02000000,0x89e); +reg_write( DDR_REG_BASE + 0x52e28*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52e29*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x52e2a*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52e2b*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52e2c*4+0x02000000,0xb990); +reg_write( DDR_REG_BASE + 0x52e2d*4+0x02000000,0x724c); +reg_write( DDR_REG_BASE + 0x52e2e*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x52e2f*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE + 0x52e30*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x52e31*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE + 0x52e32*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x52e33*4+0x02000000,0x886); +reg_write( DDR_REG_BASE + 0x52e34*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52e35*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x52e36*4+0x02000000,0x942); +reg_write( DDR_REG_BASE + 0x52e37*4+0x02000000,0xfdcf); +reg_write( DDR_REG_BASE + 0x52e38*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52e39*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52e3a*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x52e3b*4+0x02000000,0xdb10); +reg_write( DDR_REG_BASE + 0x52e3c*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x52e3d*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x52e3e*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x52e3f*4+0x02000000,0x86e); +reg_write( DDR_REG_BASE + 0x52e40*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52e41*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x52e42*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x52e43*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE + 0x52e44*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE + 0x52e45*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x52e46*4+0x02000000,0x89f); +reg_write( DDR_REG_BASE + 0x52e47*4+0x02000000,0x80b4); +reg_write( DDR_REG_BASE + 0x52e48*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52e49*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE + 0x52e4a*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x52e4b*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x52e4c*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE + 0x52e4d*4+0x02000000,0x41); +reg_write( DDR_REG_BASE + 0x52e4e*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x52e4f*4+0x02000000,0x496e); +reg_write( DDR_REG_BASE + 0x52e50*4+0x02000000,0x7b0f); +reg_write( DDR_REG_BASE + 0x52e51*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52e52*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52e53*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x52e54*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x52e55*4+0x02000000,0x842); +reg_write( DDR_REG_BASE + 0x52e56*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52e57*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x52e58*4+0x02000000,0x76ad); +reg_write( DDR_REG_BASE + 0x52e59*4+0x02000000,0x70cd); +reg_write( DDR_REG_BASE + 0x52e5a*4+0x02000000,0x43db); +reg_write( DDR_REG_BASE + 0x52e5b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52e5c*4+0x02000000,0x4400); +reg_write( DDR_REG_BASE + 0x52e5d*4+0x02000000,0xf016); +reg_write( DDR_REG_BASE + 0x52e5e*4+0x02000000,0x4163); +reg_write( DDR_REG_BASE + 0x52e5f*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE + 0x52e60*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x52e61*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE + 0x52e62*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE + 0x52e63*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x52e64*4+0x02000000,0x822); +reg_write( DDR_REG_BASE + 0x52e65*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52e66*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x52e67*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52e68*4+0x02000000,0x4163); +reg_write( DDR_REG_BASE + 0x52e69*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE + 0x52e6a*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x52e6b*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE + 0x52e6c*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE + 0x52e6d*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x52e6e*4+0x02000000,0x80e); +reg_write( DDR_REG_BASE + 0x52e6f*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52e70*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x52e71*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE + 0x52e72*4+0x02000000,0xdd9); +reg_write( DDR_REG_BASE + 0x52e73*4+0x02000000,0x9234); +reg_write( DDR_REG_BASE + 0x52e74*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52e75*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52e76*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x52e77*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52e78*4+0x02000000,0x440c); +reg_write( DDR_REG_BASE + 0x52e79*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE + 0x52e7a*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x52e7b*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE + 0x52e7c*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE + 0x52e7d*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x52e7e*4+0x02000000,0xfee); +reg_write( DDR_REG_BASE + 0x52e7f*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x52e80*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x52e81*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52e82*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52e83*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x52e84*4+0x02000000,0xdbb0); +reg_write( DDR_REG_BASE + 0x52e85*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE + 0x52e86*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x52e87*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x52e88*4+0x02000000,0xfda); +reg_write( DDR_REG_BASE + 0x52e89*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x52e8a*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x52e8b*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52e8c*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE + 0x52e8d*4+0x02000000,0x764c); +reg_write( DDR_REG_BASE + 0x52e8e*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x52e8f*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE + 0x52e90*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE + 0x52e91*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x52e92*4+0x02000000,0xfc6); +reg_write( DDR_REG_BASE + 0x52e93*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x52e94*4+0x02000000,0x1c00); +reg_write( DDR_REG_BASE + 0x52e95*4+0x02000000,0x3041); +reg_write( DDR_REG_BASE + 0x52e96*4+0x02000000,0xe8f); +reg_write( DDR_REG_BASE + 0x52e97*4+0x02000000,0x1235); +reg_write( DDR_REG_BASE + 0x52e98*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52e99*4+0x02000000,0xf7a); +reg_write( DDR_REG_BASE + 0x52e9a*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x52e9b*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x52e9c*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x52e9d*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52e9e*4+0x02000000,0x7b2); +reg_write( DDR_REG_BASE + 0x52e9f*4+0x02000000,0x1001); +reg_write( DDR_REG_BASE + 0x52ea0*4+0x02000000,0x8b); +reg_write( DDR_REG_BASE + 0x52ea1*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x52ea2*4+0x02000000,0x708c); +reg_write( DDR_REG_BASE + 0x52ea3*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52ea4*4+0x02000000,0x7b2); +reg_write( DDR_REG_BASE + 0x52ea5*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x52ea6*4+0x02000000,0xf02b); +reg_write( DDR_REG_BASE + 0x52ea7*4+0x02000000,0x241a); +reg_write( DDR_REG_BASE + 0x52ea8*4+0x02000000,0x1f80); +reg_write( DDR_REG_BASE + 0x52ea9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52eaa*4+0x02000000,0x800); +reg_write( DDR_REG_BASE + 0x52eab*4+0x02000000,0x2444); +reg_write( DDR_REG_BASE + 0x52eac*4+0x02000000,0x1042); +reg_write( DDR_REG_BASE + 0x52ead*4+0x02000000,0xc108); +reg_write( DDR_REG_BASE + 0x52eae*4+0x02000000,0x206c); +reg_write( DDR_REG_BASE + 0x52eaf*4+0x02000000,0x2c3); +reg_write( DDR_REG_BASE + 0x52eb0*4+0x02000000,0x4040); +reg_write( DDR_REG_BASE + 0x52eb1*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x52eb2*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x52eb3*4+0x02000000,0x7034); +reg_write( DDR_REG_BASE + 0x52eb4*4+0x02000000,0x20ca); +reg_write( DDR_REG_BASE + 0x52eb5*4+0x02000000,0x21); +reg_write( DDR_REG_BASE + 0x52eb6*4+0x02000000,0x7865); +reg_write( DDR_REG_BASE + 0x52eb7*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x52eb8*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x52eb9*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x52eba*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x52ebb*4+0x02000000,0x166); +reg_write( DDR_REG_BASE + 0x52ebc*4+0x02000000,0x90e0); +reg_write( DDR_REG_BASE + 0x52ebd*4+0x02000000,0xef13); +reg_write( DDR_REG_BASE + 0x52ebe*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x52ebf*4+0x02000000,0x229a); +reg_write( DDR_REG_BASE + 0x52ec0*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x52ec1*4+0x02000000,0x2055); +reg_write( DDR_REG_BASE + 0x52ec2*4+0x02000000,0xd01); +reg_write( DDR_REG_BASE + 0x52ec3*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE + 0x52ec4*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x52ec5*4+0x02000000,0x7b05); +reg_write( DDR_REG_BASE + 0x52ec6*4+0x02000000,0x7a65); +reg_write( DDR_REG_BASE + 0x52ec7*4+0x02000000,0x785b); +reg_write( DDR_REG_BASE + 0x52ec8*4+0x02000000,0xb891); +reg_write( DDR_REG_BASE + 0x52ec9*4+0x02000000,0xb89c); +reg_write( DDR_REG_BASE + 0x52eca*4+0x02000000,0xb89f); +reg_write( DDR_REG_BASE + 0x52ecb*4+0x02000000,0x9020); +reg_write( DDR_REG_BASE + 0x52ecc*4+0x02000000,0x2155); +reg_write( DDR_REG_BASE + 0x52ecd*4+0x02000000,0x801); +reg_write( DDR_REG_BASE + 0x52ece*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE + 0x52ecf*4+0x02000000,0x65fd); +reg_write( DDR_REG_BASE + 0x52ed0*4+0x02000000,0x7185); +reg_write( DDR_REG_BASE + 0x52ed1*4+0x02000000,0xbaf); +reg_write( DDR_REG_BASE + 0x52ed2*4+0x02000000,0x9325); +reg_write( DDR_REG_BASE + 0x52ed3*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x52ed4*4+0x02000000,0xa16); +reg_write( DDR_REG_BASE + 0x52ed5*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52ed6*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x52ed7*4+0x02000000,0x86e); +reg_write( DDR_REG_BASE + 0x52ed8*4+0x02000000,0xfe8f); +reg_write( DDR_REG_BASE + 0x52ed9*4+0x02000000,0xd7d); +reg_write( DDR_REG_BASE + 0x52eda*4+0x02000000,0x9031); +reg_write( DDR_REG_BASE + 0x52edb*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE + 0x52edc*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x52edd*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x52ede*4+0x02000000,0x16b); +reg_write( DDR_REG_BASE + 0x52edf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52ee0*4+0x02000000,0xb2e); +reg_write( DDR_REG_BASE + 0x52ee1*4+0x02000000,0xfd2f); +reg_write( DDR_REG_BASE + 0x52ee2*4+0x02000000,0x2578); +reg_write( DDR_REG_BASE + 0x52ee3*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x52ee4*4+0x02000000,0xc0a9); +reg_write( DDR_REG_BASE + 0x52ee5*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x52ee6*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x52ee7*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x52ee8*4+0x02000000,0xc0f1); +reg_write( DDR_REG_BASE + 0x52ee9*4+0x02000000,0x2482); +reg_write( DDR_REG_BASE + 0x52eea*4+0x02000000,0x3302); +reg_write( DDR_REG_BASE + 0x52eeb*4+0x02000000,0xc080); +reg_write( DDR_REG_BASE + 0x52eec*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x52eed*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52eee*4+0x02000000,0x5f4); +reg_write( DDR_REG_BASE + 0x52eef*4+0x02000000,0xaa6); +reg_write( DDR_REG_BASE + 0x52ef0*4+0x02000000,0xfd2f); +reg_write( DDR_REG_BASE + 0x52ef1*4+0x02000000,0xda8a); +reg_write( DDR_REG_BASE + 0x52ef2*4+0x02000000,0xc080); +reg_write( DDR_REG_BASE + 0x52ef3*4+0x02000000,0xba6); +reg_write( DDR_REG_BASE + 0x52ef4*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x52ef5*4+0x02000000,0xd98a); +reg_write( DDR_REG_BASE + 0x52ef6*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x52ef7*4+0x02000000,0x9d2); +reg_write( DDR_REG_BASE + 0x52ef8*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52ef9*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x52efa*4+0x02000000,0x2480); +reg_write( DDR_REG_BASE + 0x52efb*4+0x02000000,0x3302); +reg_write( DDR_REG_BASE + 0x52efc*4+0x02000000,0xc0d1); +reg_write( DDR_REG_BASE + 0x52efd*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x52efe*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x52eff*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x52f00*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x52f01*4+0x02000000,0x2482); +reg_write( DDR_REG_BASE + 0x52f02*4+0x02000000,0x3502); +reg_write( DDR_REG_BASE + 0x52f03*4+0x02000000,0xc147); +reg_write( DDR_REG_BASE + 0x52f04*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52f05*4+0x02000000,0xa02); +reg_write( DDR_REG_BASE + 0x52f06*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52f07*4+0x02000000,0x4318); +reg_write( DDR_REG_BASE + 0x52f08*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE + 0x52f09*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x52f0a*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x52f0b*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52f0c*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x52f0d*4+0x02000000,0xc62); +reg_write( DDR_REG_BASE + 0x52f0e*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x52f0f*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE + 0x52f10*4+0x02000000,0x208c); +reg_write( DDR_REG_BASE + 0x52f11*4+0x02000000,0x8e82); +reg_write( DDR_REG_BASE + 0x52f12*4+0x02000000,0x71ad); +reg_write( DDR_REG_BASE + 0x52f13*4+0x02000000,0xdffe); +reg_write( DDR_REG_BASE + 0x52f14*4+0x02000000,0xf705); +reg_write( DDR_REG_BASE + 0x52f15*4+0x02000000,0xc52); +reg_write( DDR_REG_BASE + 0x52f16*4+0x02000000,0xfdcf); +reg_write( DDR_REG_BASE + 0x52f17*4+0x02000000,0x2054); +reg_write( DDR_REG_BASE + 0x52f18*4+0x02000000,0x88f); +reg_write( DDR_REG_BASE + 0x52f19*4+0x02000000,0x2344); +reg_write( DDR_REG_BASE + 0x52f1a*4+0x02000000,0x37c0); +reg_write( DDR_REG_BASE + 0x52f1b*4+0x02000000,0xe806); +reg_write( DDR_REG_BASE + 0x52f1c*4+0x02000000,0xb861); +reg_write( DDR_REG_BASE + 0x52f1d*4+0x02000000,0x801); +reg_write( DDR_REG_BASE + 0x52f1e*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x52f1f*4+0x02000000,0x7dbb); +reg_write( DDR_REG_BASE + 0x52f20*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x52f21*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x52f22*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x52f23*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x52f24*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52f25*4+0x02000000,0xc049); +reg_write( DDR_REG_BASE + 0x52f26*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x52f27*4+0x02000000,0x7100); +reg_write( DDR_REG_BASE + 0x52f28*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x52f29*4+0x02000000,0xaa); +reg_write( DDR_REG_BASE + 0x52f2a*4+0x02000000,0xc04a); +reg_write( DDR_REG_BASE + 0x52f2b*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x52f2c*4+0x02000000,0x7045); +reg_write( DDR_REG_BASE + 0x52f2d*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE + 0x52f2e*4+0x02000000,0xe0aa); +reg_write( DDR_REG_BASE + 0x52f2f*4+0x02000000,0xf76); +reg_write( DDR_REG_BASE + 0x52f30*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x52f31*4+0x02000000,0x70cd); +reg_write( DDR_REG_BASE + 0x52f32*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52f33*4+0x02000000,0xb88f); +reg_write( DDR_REG_BASE + 0x52f34*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x52f35*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x52f36*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x52f37*4+0x02000000,0xe002); +reg_write( DDR_REG_BASE + 0x52f38*4+0x02000000,0xd940); +reg_write( DDR_REG_BASE + 0x52f39*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x52f3a*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x52f3b*4+0x02000000,0xe002); +reg_write( DDR_REG_BASE + 0x52f3c*4+0x02000000,0xc02); +reg_write( DDR_REG_BASE + 0x52f3d*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52f3e*4+0x02000000,0xb032); +reg_write( DDR_REG_BASE + 0x52f3f*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52f40*4+0x02000000,0xf009); +reg_write( DDR_REG_BASE + 0x52f41*4+0x02000000,0x2156); +reg_write( DDR_REG_BASE + 0x52f42*4+0x02000000,0xe01); +reg_write( DDR_REG_BASE + 0x52f43*4+0x02000000,0x2105); +reg_write( DDR_REG_BASE + 0x52f44*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x52f45*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE + 0x52f46*4+0x02000000,0xe000); +reg_write( DDR_REG_BASE + 0x52f47*4+0x02000000,0xb1c0); +reg_write( DDR_REG_BASE + 0x52f48*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE + 0x52f49*4+0x02000000,0x8f3); +reg_write( DDR_REG_BASE + 0x52f4a*4+0x02000000,0x80f4); +reg_write( DDR_REG_BASE + 0x52f4b*4+0x02000000,0x791b); +reg_write( DDR_REG_BASE + 0x52f4c*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x52f4d*4+0x02000000,0x7101); +reg_write( DDR_REG_BASE + 0x52f4e*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x52f4f*4+0x02000000,0x4a); +reg_write( DDR_REG_BASE + 0x52f50*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x52f51*4+0x02000000,0x2111); +reg_write( DDR_REG_BASE + 0x52f52*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52f53*4+0x02000000,0xd9aa); +reg_write( DDR_REG_BASE + 0x52f54*4+0x02000000,0xd898); +reg_write( DDR_REG_BASE + 0x52f55*4+0x02000000,0x20ca); +reg_write( DDR_REG_BASE + 0x52f56*4+0x02000000,0x41); +reg_write( DDR_REG_BASE + 0x52f57*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x52f58*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x52f59*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE + 0x52f5a*4+0x02000000,0xe04c); +reg_write( DDR_REG_BASE + 0x52f5b*4+0x02000000,0x202f); +reg_write( DDR_REG_BASE + 0x52f5c*4+0x02000000,0x6c0); +reg_write( DDR_REG_BASE + 0x52f5d*4+0x02000000,0x2056); +reg_write( DDR_REG_BASE + 0x52f5e*4+0x02000000,0xe00); +reg_write( DDR_REG_BASE + 0x52f5f*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x52f60*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE + 0x52f61*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52f62*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x52f63*4+0x02000000,0x9000); +reg_write( DDR_REG_BASE + 0x52f64*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE + 0x52f65*4+0x02000000,0x11e9); +reg_write( DDR_REG_BASE + 0x52f66*4+0x02000000,0x700); +reg_write( DDR_REG_BASE + 0x52f67*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x52f68*4+0x02000000,0xc046); +reg_write( DDR_REG_BASE + 0x52f69*4+0x02000000,0xd42); +reg_write( DDR_REG_BASE + 0x52f6a*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x52f6b*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE + 0x52f6c*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x52f6d*4+0x02000000,0x1200); +reg_write( DDR_REG_BASE + 0x52f6e*4+0x02000000,0x3083); +reg_write( DDR_REG_BASE + 0x52f6f*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52f70*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52f71*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x52f72*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE + 0x52f73*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x52f74*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x52f75*4+0x02000000,0xe02); +reg_write( DDR_REG_BASE + 0x52f76*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x52f77*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x52f78*4+0x02000000,0x78af); +reg_write( DDR_REG_BASE + 0x52f79*4+0x02000000,0xc048); +reg_write( DDR_REG_BASE + 0x52f7a*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x52f7b*4+0x02000000,0x2744); +reg_write( DDR_REG_BASE + 0x52f7c*4+0x02000000,0x1040); +reg_write( DDR_REG_BASE + 0x52f7d*4+0x02000000,0x671f); +reg_write( DDR_REG_BASE + 0x52f7e*4+0x02000000,0x78ef); +reg_write( DDR_REG_BASE + 0x52f7f*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE + 0x52f80*4+0x02000000,0xc305); +reg_write( DDR_REG_BASE + 0x52f81*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE + 0x52f82*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52f83*4+0x02000000,0xb990); +reg_write( DDR_REG_BASE + 0x52f84*4+0x02000000,0x724c); +reg_write( DDR_REG_BASE + 0x52f85*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE + 0x52f86*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x52f87*4+0x02000000,0xdde); +reg_write( DDR_REG_BASE + 0x52f88*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x52f89*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x52f8a*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52f8b*4+0x02000000,0xd96); +reg_write( DDR_REG_BASE + 0x52f8c*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x52f8d*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x52f8e*4+0x02000000,0x47cb); +reg_write( DDR_REG_BASE + 0x52f8f*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52f90*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE + 0x52f91*4+0x02000000,0x8f20); +reg_write( DDR_REG_BASE + 0x52f92*4+0x02000000,0xf00a); +reg_write( DDR_REG_BASE + 0x52f93*4+0x02000000,0x60da); +reg_write( DDR_REG_BASE + 0x52f94*4+0x02000000,0x4020); +reg_write( DDR_REG_BASE + 0x52f95*4+0x02000000,0x209f); +reg_write( DDR_REG_BASE + 0x52f96*4+0x02000000,0x901); +reg_write( DDR_REG_BASE + 0x52f97*4+0x02000000,0x60d8); +reg_write( DDR_REG_BASE + 0x52f98*4+0x02000000,0x60f8); +reg_write( DDR_REG_BASE + 0x52f99*4+0x02000000,0x8814); +reg_write( DDR_REG_BASE + 0x52f9a*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE + 0x52f9b*4+0x02000000,0xaa00); +reg_write( DDR_REG_BASE + 0x52f9c*4+0x02000000,0xe6e3); +reg_write( DDR_REG_BASE + 0x52f9d*4+0x02000000,0xc08c); +reg_write( DDR_REG_BASE + 0x52f9e*4+0x02000000,0xf7f5); +reg_write( DDR_REG_BASE + 0x52f9f*4+0x02000000,0x4063); +reg_write( DDR_REG_BASE + 0x52fa0*4+0x02000000,0xc18c); +reg_write( DDR_REG_BASE + 0x52fa1*4+0x02000000,0xc82); +reg_write( DDR_REG_BASE + 0x52fa2*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE + 0x52fa3*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE + 0x52fa4*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x52fa5*4+0x02000000,0x7100); +reg_write( DDR_REG_BASE + 0x52fa6*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE + 0x52fa7*4+0x02000000,0x1e0); +reg_write( DDR_REG_BASE + 0x52fa8*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE + 0x52fa9*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE + 0x52faa*4+0x02000000,0xe1e0); +reg_write( DDR_REG_BASE + 0x52fab*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x52fac*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE + 0x52fad*4+0x02000000,0xf0ff); +reg_write( DDR_REG_BASE + 0x52fae*4+0x02000000,0xc04b); +reg_write( DDR_REG_BASE + 0x52faf*4+0x02000000,0xb888); +reg_write( DDR_REG_BASE + 0x52fb0*4+0x02000000,0xb600); +reg_write( DDR_REG_BASE + 0x52fb1*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x52fb2*4+0x02000000,0xc206); +reg_write( DDR_REG_BASE + 0x52fb3*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x52fb4*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x52fb5*4+0x02000000,0x7a24); +reg_write( DDR_REG_BASE + 0x52fb6*4+0x02000000,0x7932); +reg_write( DDR_REG_BASE + 0x52fb7*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE + 0x52fb8*4+0x02000000,0x7824); +reg_write( DDR_REG_BASE + 0x52fb9*4+0x02000000,0x7845); +reg_write( DDR_REG_BASE + 0x52fba*4+0x02000000,0xc046); +reg_write( DDR_REG_BASE + 0x52fbb*4+0x02000000,0xb887); +reg_write( DDR_REG_BASE + 0x52fbc*4+0x02000000,0x1ef2); +reg_write( DDR_REG_BASE + 0x52fbd*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x52fbe*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x52fbf*4+0x02000000,0x7045); +reg_write( DDR_REG_BASE + 0x52fc0*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE + 0x52fc1*4+0x02000000,0xe0e8); +reg_write( DDR_REG_BASE + 0x52fc2*4+0x02000000,0xa96); +reg_write( DDR_REG_BASE + 0x52fc3*4+0x02000000,0xfdcf); +reg_write( DDR_REG_BASE + 0x52fc4*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE + 0x52fc5*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE + 0x52fc6*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x52fc7*4+0x02000000,0xc86); +reg_write( DDR_REG_BASE + 0x52fc8*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x52fc9*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x52fca*4+0x02000000,0x1200); +reg_write( DDR_REG_BASE + 0x52fcb*4+0x02000000,0x3083); +reg_write( DDR_REG_BASE + 0x52fcc*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52fcd*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52fce*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x52fcf*4+0x02000000,0x4528); +reg_write( DDR_REG_BASE + 0x52fd0*4+0x02000000,0xc143); +reg_write( DDR_REG_BASE + 0x52fd1*4+0x02000000,0xc142); +reg_write( DDR_REG_BASE + 0x52fd2*4+0x02000000,0xc141); +reg_write( DDR_REG_BASE + 0x52fd3*4+0x02000000,0xd46); +reg_write( DDR_REG_BASE + 0x52fd4*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x52fd5*4+0x02000000,0xc140); +reg_write( DDR_REG_BASE + 0x52fd6*4+0x02000000,0xefa); +reg_write( DDR_REG_BASE + 0x52fd7*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x52fd8*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52fd9*4+0x02000000,0xc008); +reg_write( DDR_REG_BASE + 0x52fda*4+0x02000000,0xc305); +reg_write( DDR_REG_BASE + 0x52fdb*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52fdc*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x52fdd*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52fde*4+0x02000000,0xb990); +reg_write( DDR_REG_BASE + 0x52fdf*4+0x02000000,0x724c); +reg_write( DDR_REG_BASE + 0x52fe0*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x52fe1*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x52fe2*4+0x02000000,0xd26); +reg_write( DDR_REG_BASE + 0x52fe3*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x52fe4*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x52fe5*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x52fe6*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE + 0x52fe7*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x52fe8*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE + 0x52fe9*4+0x02000000,0x41); +reg_write( DDR_REG_BASE + 0x52fea*4+0x02000000,0x6038); +reg_write( DDR_REG_BASE + 0x52feb*4+0x02000000,0xe01e); +reg_write( DDR_REG_BASE + 0x52fec*4+0x02000000,0x7b0f); +reg_write( DDR_REG_BASE + 0x52fed*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52fee*4+0x02000000,0x742c); +reg_write( DDR_REG_BASE + 0x52fef*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x52ff0*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x52ff1*4+0x02000000,0xd0a); +reg_write( DDR_REG_BASE + 0x52ff2*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x52ff3*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x52ff4*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52ff5*4+0x02000000,0xb890); +reg_write( DDR_REG_BASE + 0x52ff6*4+0x02000000,0x791d); +reg_write( DDR_REG_BASE + 0x52ff7*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52ff8*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x52ff9*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE + 0x52ffa*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE + 0x52ffb*4+0x02000000,0x30c1); +reg_write( DDR_REG_BASE + 0x52ffc*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x52ffd*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x52ffe*4+0x02000000,0xcee); +reg_write( DDR_REG_BASE + 0x52fff*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x53000*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x53001*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x53002*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x53003*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x53004*4+0x02000000,0xdb10); +reg_write( DDR_REG_BASE + 0x53005*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x53006*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x53007*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x53008*4+0x02000000,0xcda); +reg_write( DDR_REG_BASE + 0x53009*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x5300a*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x5300b*4+0x02000000,0xe76); +reg_write( DDR_REG_BASE + 0x5300c*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x5300d*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x5300e*4+0x02000000,0xf852); +reg_write( DDR_REG_BASE + 0x5300f*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x53010*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x53011*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x53012*4+0x02000000,0xcc6); +reg_write( DDR_REG_BASE + 0x53013*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x53014*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x53015*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x53016*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53017*4+0x02000000,0x6210); +reg_write( DDR_REG_BASE + 0x53018*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x53019*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x5301a*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x5301b*4+0x02000000,0xe004); +reg_write( DDR_REG_BASE + 0x5301c*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE + 0x5301d*4+0x02000000,0xc72); +reg_write( DDR_REG_BASE + 0x5301e*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x5301f*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x53020*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE + 0x53021*4+0x02000000,0x408); +reg_write( DDR_REG_BASE + 0x53022*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x53023*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x53024*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x53025*4+0x02000000,0xe004); +reg_write( DDR_REG_BASE + 0x53026*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x53027*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x53028*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x53029*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5302a*4+0x02000000,0x80b); +reg_write( DDR_REG_BASE + 0x5302b*4+0x02000000,0xbf); +reg_write( DDR_REG_BASE + 0x5302c*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE + 0x5302d*4+0x02000000,0x606); +reg_write( DDR_REG_BASE + 0x5302e*4+0x02000000,0xf002); +reg_write( DDR_REG_BASE + 0x5302f*4+0x02000000,0xd833); +reg_write( DDR_REG_BASE + 0x53030*4+0x02000000,0xc4a); +reg_write( DDR_REG_BASE + 0x53031*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x53032*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x53033*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE + 0x53034*4+0x02000000,0xc18c); +reg_write( DDR_REG_BASE + 0x53035*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x53036*4+0x02000000,0x1ef2); +reg_write( DDR_REG_BASE + 0x53037*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x53038*4+0x02000000,0xb52); +reg_write( DDR_REG_BASE + 0x53039*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE + 0x5303a*4+0x02000000,0x4063); +reg_write( DDR_REG_BASE + 0x5303b*4+0x02000000,0x8f00); +reg_write( DDR_REG_BASE + 0x5303c*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x5303d*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5303e*4+0x02000000,0x600); +reg_write( DDR_REG_BASE + 0x5303f*4+0x02000000,0xc140); +reg_write( DDR_REG_BASE + 0x53040*4+0x02000000,0x4fac); +reg_write( DDR_REG_BASE + 0x53041*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x53042*4+0x02000000,0x80e); +reg_write( DDR_REG_BASE + 0x53043*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x53044*4+0x02000000,0x706c); +reg_write( DDR_REG_BASE + 0x53045*4+0x02000000,0xc00a); +reg_write( DDR_REG_BASE + 0x53046*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x53047*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x53048*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x53049*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x5304a*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE + 0x5304b*4+0x02000000,0xe0aa); +reg_write( DDR_REG_BASE + 0x5304c*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x5304d*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x5304e*4+0x02000000,0xe002); +reg_write( DDR_REG_BASE + 0x5304f*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x53050*4+0x02000000,0x7344); +reg_write( DDR_REG_BASE + 0x53051*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x53052*4+0x02000000,0xe002); +reg_write( DDR_REG_BASE + 0x53053*4+0x02000000,0xb0b2); +reg_write( DDR_REG_BASE + 0x53054*4+0x02000000,0xb6a); +reg_write( DDR_REG_BASE + 0x53055*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x53056*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE + 0x53057*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x53058*4+0x02000000,0x1200); +reg_write( DDR_REG_BASE + 0x53059*4+0x02000000,0x3083); +reg_write( DDR_REG_BASE + 0x5305a*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x5305b*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x5305c*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x5305d*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x5305e*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x5305f*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x53060*4+0x02000000,0xc2a); +reg_write( DDR_REG_BASE + 0x53061*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x53062*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x53063*4+0x02000000,0xc008); +reg_write( DDR_REG_BASE + 0x53064*4+0x02000000,0xc305); +reg_write( DDR_REG_BASE + 0x53065*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x53066*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x53067*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x53068*4+0x02000000,0xb990); +reg_write( DDR_REG_BASE + 0x53069*4+0x02000000,0x724c); +reg_write( DDR_REG_BASE + 0x5306a*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x5306b*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x5306c*4+0x02000000,0xc12); +reg_write( DDR_REG_BASE + 0x5306d*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x5306e*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x5306f*4+0x02000000,0xf822); +reg_write( DDR_REG_BASE + 0x53070*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x53071*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x53072*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x53073*4+0x02000000,0xc06); +reg_write( DDR_REG_BASE + 0x53074*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x53075*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x53076*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x53077*4+0x02000000,0xbbe); +reg_write( DDR_REG_BASE + 0x53078*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x53079*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x5307a*4+0x02000000,0xc00b); +reg_write( DDR_REG_BASE + 0x5307b*4+0x02000000,0xb600); +reg_write( DDR_REG_BASE + 0x5307c*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x5307d*4+0x02000000,0x7344); +reg_write( DDR_REG_BASE + 0x5307e*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE + 0x5307f*4+0x02000000,0xe0e8); +reg_write( DDR_REG_BASE + 0x53080*4+0x02000000,0xf00a); +reg_write( DDR_REG_BASE + 0x53081*4+0x02000000,0x2056); +reg_write( DDR_REG_BASE + 0x53082*4+0x02000000,0xe00); +reg_write( DDR_REG_BASE + 0x53083*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x53084*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x53085*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE + 0x53086*4+0x02000000,0xe000); +reg_write( DDR_REG_BASE + 0x53087*4+0x02000000,0x1800); +reg_write( DDR_REG_BASE + 0x53088*4+0x02000000,0x3c5); +reg_write( DDR_REG_BASE + 0x53089*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE + 0x5308a*4+0x02000000,0xdef); +reg_write( DDR_REG_BASE + 0x5308b*4+0x02000000,0x90b4); +reg_write( DDR_REG_BASE + 0x5308c*4+0x02000000,0x78bb); +reg_write( DDR_REG_BASE + 0x5308d*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x5308e*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x5308f*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x53090*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE + 0x53091*4+0x02000000,0xe1c4); +reg_write( DDR_REG_BASE + 0x53092*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x53093*4+0x02000000,0x7005); +reg_write( DDR_REG_BASE + 0x53094*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x53095*4+0x02000000,0xe004); +reg_write( DDR_REG_BASE + 0x53096*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE + 0x53097*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x53098*4+0x02000000,0xdd2); +reg_write( DDR_REG_BASE + 0x53099*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x5309a*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x5309b*4+0x02000000,0x4063); +reg_write( DDR_REG_BASE + 0x5309c*4+0x02000000,0xed2); +reg_write( DDR_REG_BASE + 0x5309d*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x5309e*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x5309f*4+0x02000000,0xc109); +reg_write( DDR_REG_BASE + 0x530a0*4+0x02000000,0x2055); +reg_write( DDR_REG_BASE + 0x530a1*4+0x02000000,0xd00); +reg_write( DDR_REG_BASE + 0x530a2*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE + 0x530a3*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x530a4*4+0x02000000,0xc107); +reg_write( DDR_REG_BASE + 0x530a5*4+0x02000000,0x89e); +reg_write( DDR_REG_BASE + 0x530a6*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x530a7*4+0x02000000,0x706c); +reg_write( DDR_REG_BASE + 0x530a8*4+0x02000000,0xcca); +reg_write( DDR_REG_BASE + 0x530a9*4+0x02000000,0xfe4f); +reg_write( DDR_REG_BASE + 0x530aa*4+0x02000000,0xe8a); +reg_write( DDR_REG_BASE + 0x530ab*4+0x02000000,0xfecf); +reg_write( DDR_REG_BASE + 0x530ac*4+0x02000000,0x2480); +reg_write( DDR_REG_BASE + 0x530ad*4+0x02000000,0x3502); +reg_write( DDR_REG_BASE + 0x530ae*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x530af*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x530b0*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x530b1*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x530b2*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x530b3*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE + 0x530b4*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x530b5*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x530b6*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x530b7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530b8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530b9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530ba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530bb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530bc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530bd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530be*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530bf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530c0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530c1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530c2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530c3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530c4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530c5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530c6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530c7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530c8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530c9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530ca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530cb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530cc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530cd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530ce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530cf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530d0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530d1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530d2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530d3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530d4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530d5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530d6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530d7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530d8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530d9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530da*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530db*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530dc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530dd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530de*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530df*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530e0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530e1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530e2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530e3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530e4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530e5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530e6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530e7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530e8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530e9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530ea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530eb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530ec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530ed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530ee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530ef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530f0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530f1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530f2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530f3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530f4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530f5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530f6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530f7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530f8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530f9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530fa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530fb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530fc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530fd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530fe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530ff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53100*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53101*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53102*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53103*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53104*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53105*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53106*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53107*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53108*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53109*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5310a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5310b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5310c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5310d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5310e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5310f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53110*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53111*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53112*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53113*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53114*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53115*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53116*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53117*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53118*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53119*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5311a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5311b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5311c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5311d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5311e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5311f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53120*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53121*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53122*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53123*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53124*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53125*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53126*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53127*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53128*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53129*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5312a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5312b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5312c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5312d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5312e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5312f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53130*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53131*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53132*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53133*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53134*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53135*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53136*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53137*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53138*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53139*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5313a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5313b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5313c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5313d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5313e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5313f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53140*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53141*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53142*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53143*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53144*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53145*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53146*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53147*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53148*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53149*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5314a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5314b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5314c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5314d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5314e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5314f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53150*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53151*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53152*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53153*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53154*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53155*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53156*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53157*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53158*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53159*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5315a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5315b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5315c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5315d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5315e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5315f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53160*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53161*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53162*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53163*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53164*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53165*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53166*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53167*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53168*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53169*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5316a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5316b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5316c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5316d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5316e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5316f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53170*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53171*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53172*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53173*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53174*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53175*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53176*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53177*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53178*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53179*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5317a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5317b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5317c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5317d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5317e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5317f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53180*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53181*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53182*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53183*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53184*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53185*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53186*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53187*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53188*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53189*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5318a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5318b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5318c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5318d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5318e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5318f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53190*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53191*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53192*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53193*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53194*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53195*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53196*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53197*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53198*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53199*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5319a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5319b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5319c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5319d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5319e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5319f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531a0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531a1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531a2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531a3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531a4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531a5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531a6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531a7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531a8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531a9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531aa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531ab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531ac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531ad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531ae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531af*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531b0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531b1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531b2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531b3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531b4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531b5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531b6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531b7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531b8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531b9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531ba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531bb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531bc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531bd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531be*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531bf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531c0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531c1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531c2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531c3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531c4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531c5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531c6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531c7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531c8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531c9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531ca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531cb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531cc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531cd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531ce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531cf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531d0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531d1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531d2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531d3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531d4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531d5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531d6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531d7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531d8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531d9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531da*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531db*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531dc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531dd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531de*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531df*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531e0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531e1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531e2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531e3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531e4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531e5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531e6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531e7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531e8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531e9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531ea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531eb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531ec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531ed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531ee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531ef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531f0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531f1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531f2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531f3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531f4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531f5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531f6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531f7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531f8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531f9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531fa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531fb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531fc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531fd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531fe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531ff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53200*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53201*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53202*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53203*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53204*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53205*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53206*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53207*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53208*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53209*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5320a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5320b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5320c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5320d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5320e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5320f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53210*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53211*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53212*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53213*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53214*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53215*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53216*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53217*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53218*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53219*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5321a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5321b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5321c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5321d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5321e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5321f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53220*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53221*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53222*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53223*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53224*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53225*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53226*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53227*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53228*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53229*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5322a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5322b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5322c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5322d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5322e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5322f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53230*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53231*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53232*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53233*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53234*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53235*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53236*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53237*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53238*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53239*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5323a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5323b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5323c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5323d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5323e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5323f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53240*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53241*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53242*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53243*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53244*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53245*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53246*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53247*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53248*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53249*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5324a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5324b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5324c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5324d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5324e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5324f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53250*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53251*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53252*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53253*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53254*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53255*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53256*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53257*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53258*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53259*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5325a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5325b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5325c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5325d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5325e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5325f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53260*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53261*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53262*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53263*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53264*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53265*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53266*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53267*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53268*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53269*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5326a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5326b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5326c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5326d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5326e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5326f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53270*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53271*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53272*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53273*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53274*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53275*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53276*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53277*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53278*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53279*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5327a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5327b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5327c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5327d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5327e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5327f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53280*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53281*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53282*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53283*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53284*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53285*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53286*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53287*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53288*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53289*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5328a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5328b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5328c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5328d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5328e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5328f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53290*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53291*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53292*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53293*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53294*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53295*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53296*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53297*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53298*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53299*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5329a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5329b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5329c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5329d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5329e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5329f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532a0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532a1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532a2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532a3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532a4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532a5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532a6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532a7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532a8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532a9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532aa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532ab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532ac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532ad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532ae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532af*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532b0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532b1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532b2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532b3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532b4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532b5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532b6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532b7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532b8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532b9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532ba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532bb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532bc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532bd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532be*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532bf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532c0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532c1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532c2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532c3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532c4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532c5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532c6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532c7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532c8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532c9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532ca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532cb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532cc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532cd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532ce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532cf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532d0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532d1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532d2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532d3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532d4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532d5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532d6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532d7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532d8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532d9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532da*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532db*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532dc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532dd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532de*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532df*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532e0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532e1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532e2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532e3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532e4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532e5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532e6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532e7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532e8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532e9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532ea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532eb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532ec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532ed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532ee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532ef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532f0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532f1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532f2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532f3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532f4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532f5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532f6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532f7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532f8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532f9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532fa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532fb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532fc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532fd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532fe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532ff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53300*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53301*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53302*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53303*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53304*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53305*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53306*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53307*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53308*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53309*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5330a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5330b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5330c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5330d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5330e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5330f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53310*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53311*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53312*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53313*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53314*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53315*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53316*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53317*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53318*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53319*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5331a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5331b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5331c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5331d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5331e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5331f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53320*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53321*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53322*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53323*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53324*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53325*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53326*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53327*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53328*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53329*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5332a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5332b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5332c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5332d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5332e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5332f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53330*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53331*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53332*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53333*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53334*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53335*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53336*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53337*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53338*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53339*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5333a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5333b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5333c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5333d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5333e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5333f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53340*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53341*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53342*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53343*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53344*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53345*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53346*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53347*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53348*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53349*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5334a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5334b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5334c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5334d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5334e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5334f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53350*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53351*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53352*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53353*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53354*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53355*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53356*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53357*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53358*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53359*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5335a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5335b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5335c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5335d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5335e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5335f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53360*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53361*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53362*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53363*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53364*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53365*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53366*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53367*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53368*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53369*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5336a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5336b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5336c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5336d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5336e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5336f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53370*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53371*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53372*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53373*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53374*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53375*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53376*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53377*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53378*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53379*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5337a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5337b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5337c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5337d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5337e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5337f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53380*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53381*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53382*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53383*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53384*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53385*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53386*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53387*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53388*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53389*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5338a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5338b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5338c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5338d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5338e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5338f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53390*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53391*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53392*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53393*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53394*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53395*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53396*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53397*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53398*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53399*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5339a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5339b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5339c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5339d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5339e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5339f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533a0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533a1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533a2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533a3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533a4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533a5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533a6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533a7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533a8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533a9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533aa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533ab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533ac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533ad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533ae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533af*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533b0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533b1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533b2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533b3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533b4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533b5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533b6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533b7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533b8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533b9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533ba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533bb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533bc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533bd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533be*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533bf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533c0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533c1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533c2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533c3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533c4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533c5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533c6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533c7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533c8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533c9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533ca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533cb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533cc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533cd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533ce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533cf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533d0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533d1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533d2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533d3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533d4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533d5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533d6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533d7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533d8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533d9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533da*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533db*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533dc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533dd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533de*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533df*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533e0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533e1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533e2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533e3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533e4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533e5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533e6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533e7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533e8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533e9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533ea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533eb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533ec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533ed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533ee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533ef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533f0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533f1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533f2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533f3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533f4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533f5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533f6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533f7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533f8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533f9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533fa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533fb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533fc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533fd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533fe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533ff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53400*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53401*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53402*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53403*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53404*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53405*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53406*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53407*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53408*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53409*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5340a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5340b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5340c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5340d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5340e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5340f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53410*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53411*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53412*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53413*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53414*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53415*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53416*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53417*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53418*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53419*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5341a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5341b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5341c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5341d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5341e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5341f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53420*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53421*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53422*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53423*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53424*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53425*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53426*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53427*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53428*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53429*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5342a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5342b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5342c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5342d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5342e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5342f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53430*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53431*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53432*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53433*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53434*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53435*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53436*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53437*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53438*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53439*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5343a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5343b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5343c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5343d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5343e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5343f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53440*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53441*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53442*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53443*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53444*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53445*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53446*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53447*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53448*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53449*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5344a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5344b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5344c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5344d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5344e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5344f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53450*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53451*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53452*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53453*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53454*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53455*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53456*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53457*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53458*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53459*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5345a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5345b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5345c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5345d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5345e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5345f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53460*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53461*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53462*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53463*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53464*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53465*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53466*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53467*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53468*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53469*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5346a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5346b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5346c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5346d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5346e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5346f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53470*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53471*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53472*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53473*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53474*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53475*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53476*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53477*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53478*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53479*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5347a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5347b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5347c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5347d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5347e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5347f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53480*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53481*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53482*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53483*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53484*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53485*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53486*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53487*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53488*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53489*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5348a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5348b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5348c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5348d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5348e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5348f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53490*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53491*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53492*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53493*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53494*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53495*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53496*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53497*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53498*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53499*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5349a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5349b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5349c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5349d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5349e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5349f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534a0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534a1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534a2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534a3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534a4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534a5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534a6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534a7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534a8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534a9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534aa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534ab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534ac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534ad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534ae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534af*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534b0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534b1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534b2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534b3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534b4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534b5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534b6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534b7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534b8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534b9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534ba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534bb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534bc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534bd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534be*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534bf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534c0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534c1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534c2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534c3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534c4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534c5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534c6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534c7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534c8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534c9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534ca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534cb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534cc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534cd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534ce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534cf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534d0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534d1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534d2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534d3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534d4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534d5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534d6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534d7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534d8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534d9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534da*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534db*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534dc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534dd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534de*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534df*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534e0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534e1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534e2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534e3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534e4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534e5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534e6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534e7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534e8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534e9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534ea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534eb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534ec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534ed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534ee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534ef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534f0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534f1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534f2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534f3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534f4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534f5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534f6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534f7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534f8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534f9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534fa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534fb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534fc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534fd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534fe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534ff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53500*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53501*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53502*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53503*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53504*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53505*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53506*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53507*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53508*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53509*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5350a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5350b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5350c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5350d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5350e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5350f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53510*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53511*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53512*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53513*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53514*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53515*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53516*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53517*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53518*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53519*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5351a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5351b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5351c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5351d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5351e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5351f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53520*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53521*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53522*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53523*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53524*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53525*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53526*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53527*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53528*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53529*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5352a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5352b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5352c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5352d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5352e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5352f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53530*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53531*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53532*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53533*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53534*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53535*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53536*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53537*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53538*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53539*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5353a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5353b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5353c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5353d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5353e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5353f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53540*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53541*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53542*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53543*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53544*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53545*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53546*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53547*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53548*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53549*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5354a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5354b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5354c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5354d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5354e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5354f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53550*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53551*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53552*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53553*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53554*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53555*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53556*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53557*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53558*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53559*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5355a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5355b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5355c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5355d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5355e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5355f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53560*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53561*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53562*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53563*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53564*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53565*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53566*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53567*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53568*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53569*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5356a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5356b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5356c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5356d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5356e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5356f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53570*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53571*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53572*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53573*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53574*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53575*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53576*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53577*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53578*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53579*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5357a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5357b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5357c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5357d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5357e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5357f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53580*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53581*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53582*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53583*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53584*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53585*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53586*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53587*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53588*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53589*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5358a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5358b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5358c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5358d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5358e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5358f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53590*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53591*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53592*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53593*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53594*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53595*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53596*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53597*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53598*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53599*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5359a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5359b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5359c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5359d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5359e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5359f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535a0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535a1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535a2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535a3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535a4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535a5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535a6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535a7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535a8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535a9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535aa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535ab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535ac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535ad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535ae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535af*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535b0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535b1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535b2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535b3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535b4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535b5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535b6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535b7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535b8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535b9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535ba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535bb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535bc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535bd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535be*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535bf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535c0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535c1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535c2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535c3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535c4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535c5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535c6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535c7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535c8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535c9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535ca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535cb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535cc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535cd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535ce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535cf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535d0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535d1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535d2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535d3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535d4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535d5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535d6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535d7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535d8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535d9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535da*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535db*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535dc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535dd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535de*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535df*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535e0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535e1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535e2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535e3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535e4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535e5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535e6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535e7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535e8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535e9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535ea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535eb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535ec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535ed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535ee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535ef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535f0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535f1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535f2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535f3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535f4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535f5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535f6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535f7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535f8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535f9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535fa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535fb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535fc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535fd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535fe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535ff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53600*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53601*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53602*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53603*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53604*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53605*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53606*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53607*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53608*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53609*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5360a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5360b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5360c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5360d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5360e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5360f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53610*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53611*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53612*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53613*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53614*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53615*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53616*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53617*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53618*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53619*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5361a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5361b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5361c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5361d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5361e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5361f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53620*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53621*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53622*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53623*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53624*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53625*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53626*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53627*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53628*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53629*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5362a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5362b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5362c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5362d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5362e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5362f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53630*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53631*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53632*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53633*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53634*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53635*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53636*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53637*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53638*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53639*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5363a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5363b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5363c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5363d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5363e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5363f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53640*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53641*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53642*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53643*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53644*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53645*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53646*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53647*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53648*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53649*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5364a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5364b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5364c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5364d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5364e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5364f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53650*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53651*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53652*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53653*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53654*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53655*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53656*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53657*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53658*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53659*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5365a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5365b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5365c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5365d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5365e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5365f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53660*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53661*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53662*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53663*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53664*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53665*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53666*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53667*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53668*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53669*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5366a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5366b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5366c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5366d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5366e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5366f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53670*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53671*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53672*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53673*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53674*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53675*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53676*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53677*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53678*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53679*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5367a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5367b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5367c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5367d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5367e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5367f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53680*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53681*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53682*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53683*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53684*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53685*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53686*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53687*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53688*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53689*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5368a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5368b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5368c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5368d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5368e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5368f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53690*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53691*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53692*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53693*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53694*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53695*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53696*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53697*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53698*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53699*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5369a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5369b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5369c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5369d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5369e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5369f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536a0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536a1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536a2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536a3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536a4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536a5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536a6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536a7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536a8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536a9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536aa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536ab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536ac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536ad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536ae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536af*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536b0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536b1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536b2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536b3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536b4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536b5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536b6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536b7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536b8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536b9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536ba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536bb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536bc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536bd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536be*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536bf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536c0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536c1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536c2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536c3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536c4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536c5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536c6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536c7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536c8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536c9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536ca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536cb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536cc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536cd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536ce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536cf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536d0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536d1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536d2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536d3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536d4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536d5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536d6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536d7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536d8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536d9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536da*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536db*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536dc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536dd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536de*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536df*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536e0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536e1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536e2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536e3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536e4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536e5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536e6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536e7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536e8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536e9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536ea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536eb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536ec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536ed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536ee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536ef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536f0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536f1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536f2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536f3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536f4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536f5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536f6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536f7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536f8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536f9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536fa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536fb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536fc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536fd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536fe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536ff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53700*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53701*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53702*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53703*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53704*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53705*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53706*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53707*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53708*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53709*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5370a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5370b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5370c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5370d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5370e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5370f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53710*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53711*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53712*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53713*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53714*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53715*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53716*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53717*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53718*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53719*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5371a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5371b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5371c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5371d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5371e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5371f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53720*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53721*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53722*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53723*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53724*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53725*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53726*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53727*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53728*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53729*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5372a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5372b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5372c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5372d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5372e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5372f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53730*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53731*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53732*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53733*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53734*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53735*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53736*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53737*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53738*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53739*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5373a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5373b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5373c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5373d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5373e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5373f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53740*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53741*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53742*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53743*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53744*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53745*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53746*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53747*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53748*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53749*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5374a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5374b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5374c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5374d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5374e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5374f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53750*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53751*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53752*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53753*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53754*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53755*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53756*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53757*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53758*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53759*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5375a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5375b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5375c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5375d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5375e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5375f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53760*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53761*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53762*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53763*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53764*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53765*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53766*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53767*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53768*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53769*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5376a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5376b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5376c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5376d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5376e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5376f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53770*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53771*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53772*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53773*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53774*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53775*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53776*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53777*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53778*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53779*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5377a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5377b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5377c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5377d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5377e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5377f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53780*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53781*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53782*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53783*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53784*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53785*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53786*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53787*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53788*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53789*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5378a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5378b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5378c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5378d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5378e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5378f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53790*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53791*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53792*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53793*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53794*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53795*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53796*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53797*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53798*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53799*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5379a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5379b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5379c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5379d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5379e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5379f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537a0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537a1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537a2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537a3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537a4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537a5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537a6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537a7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537a8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537a9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537aa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537ab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537ac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537ad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537ae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537af*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537b0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537b1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537b2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537b3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537b4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537b5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537b6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537b7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537b8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537b9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537ba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537bb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537bc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537bd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537be*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537bf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537c0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537c1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537c2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537c3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537c4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537c5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537c6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537c7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537c8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537c9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537ca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537cb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537cc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537cd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537ce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537cf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537d0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537d1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537d2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537d3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537d4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537d5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537d6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537d7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537d8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537d9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537da*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537db*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537dc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537dd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537de*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537df*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537e0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537e1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537e2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537e3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537e4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537e5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537e6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537e7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537e8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537e9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537ea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537eb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537ec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537ed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537ee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537ef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537f0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537f1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537f2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537f3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537f4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537f5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537f6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537f7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537f8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537f9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537fa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537fb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537fc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537fd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537fe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537ff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53800*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53801*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53802*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53803*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53804*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53805*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53806*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53807*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53808*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53809*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5380a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5380b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5380c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5380d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5380e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5380f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53810*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53811*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53812*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53813*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53814*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53815*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53816*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53817*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53818*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53819*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5381a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5381b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5381c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5381d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5381e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5381f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53820*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53821*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53822*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53823*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53824*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53825*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53826*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53827*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53828*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53829*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5382a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5382b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5382c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5382d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5382e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5382f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53830*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53831*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53832*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53833*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53834*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53835*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53836*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53837*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53838*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53839*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5383a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5383b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5383c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5383d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5383e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5383f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53840*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53841*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53842*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53843*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53844*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53845*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53846*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53847*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53848*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53849*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5384a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5384b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5384c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5384d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5384e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5384f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53850*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53851*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53852*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53853*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53854*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53855*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53856*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53857*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53858*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53859*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5385a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5385b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5385c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5385d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5385e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5385f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53860*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53861*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53862*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53863*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53864*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53865*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53866*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53867*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53868*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53869*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5386a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5386b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5386c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5386d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5386e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5386f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53870*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53871*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53872*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53873*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53874*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53875*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53876*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53877*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53878*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53879*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5387a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5387b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5387c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5387d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5387e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5387f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53880*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53881*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53882*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53883*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53884*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53885*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53886*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53887*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53888*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53889*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5388a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5388b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5388c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5388d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5388e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5388f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53890*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53891*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53892*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53893*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53894*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53895*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53896*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53897*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53898*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53899*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5389a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5389b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5389c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5389d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5389e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5389f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538a0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538a1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538a2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538a3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538a4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538a5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538a6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538a7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538a8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538a9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538aa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538ab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538ac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538ad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538ae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538af*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538b0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538b1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538b2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538b3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538b4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538b5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538b6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538b7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538b8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538b9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538ba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538bb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538bc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538bd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538be*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538bf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538c0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538c1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538c2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538c3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538c4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538c5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538c6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538c7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538c8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538c9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538ca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538cb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538cc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538cd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538ce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538cf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538d0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538d1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538d2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538d3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538d4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538d5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538d6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538d7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538d8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538d9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538da*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538db*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538dc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538dd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538de*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538df*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538e0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538e1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538e2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538e3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538e4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538e5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538e6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538e7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538e8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538e9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538ea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538eb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538ec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538ed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538ee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538ef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538f0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538f1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538f2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538f3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538f4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538f5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538f6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538f7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538f8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538f9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538fa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538fb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538fc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538fd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538fe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538ff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53900*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53901*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53902*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53903*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53904*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53905*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53906*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53907*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53908*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53909*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5390a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5390b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5390c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5390d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5390e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5390f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53910*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53911*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53912*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53913*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53914*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53915*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53916*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53917*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53918*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53919*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5391a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5391b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5391c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5391d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5391e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5391f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53920*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53921*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53922*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53923*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53924*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53925*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53926*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53927*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53928*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53929*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5392a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5392b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5392c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5392d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5392e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5392f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53930*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53931*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53932*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53933*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53934*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53935*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53936*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53937*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53938*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53939*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5393a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5393b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5393c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5393d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5393e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5393f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53940*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53941*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53942*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53943*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53944*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53945*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53946*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53947*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53948*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53949*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5394a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5394b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5394c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5394d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5394e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5394f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53950*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53951*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53952*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53953*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53954*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53955*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53956*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53957*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53958*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53959*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5395a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5395b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5395c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5395d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5395e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5395f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53960*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53961*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53962*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53963*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53964*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53965*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53966*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53967*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53968*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53969*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5396a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5396b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5396c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5396d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5396e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5396f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53970*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53971*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53972*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53973*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53974*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53975*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53976*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53977*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53978*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53979*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5397a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5397b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5397c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5397d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5397e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5397f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53980*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53981*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53982*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53983*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53984*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53985*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53986*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53987*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53988*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53989*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5398a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5398b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5398c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5398d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5398e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5398f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53990*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53991*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53992*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53993*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53994*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53995*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53996*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53997*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53998*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53999*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5399a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5399b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5399c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5399d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5399e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5399f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539a0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539a1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539a2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539a3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539a4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539a5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539a6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539a7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539a8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539a9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539aa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539ab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539ac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539ad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539ae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539af*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539b0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539b1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539b2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539b3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539b4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539b5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539b6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539b7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539b8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539b9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539ba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539bb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539bc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539bd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539be*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539bf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539c0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539c1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539c2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539c3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539c4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539c5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539c6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539c7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539c8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539c9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539ca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539cb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539cc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539cd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539ce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539cf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539d0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539d1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539d2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539d3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539d4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539d5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539d6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539d7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539d8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539d9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539da*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539db*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539dc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539dd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539de*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539df*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539e0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539e1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539e2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539e3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539e4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539e5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539e6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539e7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539e8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539e9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539ea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539eb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539ec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539ed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539ee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539ef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539f0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539f1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539f2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539f3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539f4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539f5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539f6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539f7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539f8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539f9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539fa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539fb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539fc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539fd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539fe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539ff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a00*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a01*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a02*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a03*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a04*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a05*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a06*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a07*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a08*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a09*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a0a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a0b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a0c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a0d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a0e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a0f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a10*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a11*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a12*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a13*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a14*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a15*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a16*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a17*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a18*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a19*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a1a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a1b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a1c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a1d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a1e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a1f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a20*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a21*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a22*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a23*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a24*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a25*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a26*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a27*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a28*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a29*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a2a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a2b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a2c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a2d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a2e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a2f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a30*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a31*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a32*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a33*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a34*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a35*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a36*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a37*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a38*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a39*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a3a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a3b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a3c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a3d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a3e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a3f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a40*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a41*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a42*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a43*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a44*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a45*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a46*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a47*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a48*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a49*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a4a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a4b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a4c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a4d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a4e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a4f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a50*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a51*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a52*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a53*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a54*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a55*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a56*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a57*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a58*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a59*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a5a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a5b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a5c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a5d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a5e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a5f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a60*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a61*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a62*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a63*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a64*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a65*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a66*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a67*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a68*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a69*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a6a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a6b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a6c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a6d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a6e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a6f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a70*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a71*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a72*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a73*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a74*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a75*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a76*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a77*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a78*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a79*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a7a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a7b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a7c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a7d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a7e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a7f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a80*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a81*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a82*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a83*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a84*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a85*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a86*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a87*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a88*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a89*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a8a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a8b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a8c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a8d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a8e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a8f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a90*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a91*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a92*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a93*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a94*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a95*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a96*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a97*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a98*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a99*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a9a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a9b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a9c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a9d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a9e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a9f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53aa0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53aa1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53aa2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53aa3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53aa4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53aa5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53aa6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53aa7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53aa8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53aa9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53aaa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53aab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53aac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53aad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53aae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53aaf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ab0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ab1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ab2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ab3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ab4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ab5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ab6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ab7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ab8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ab9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53aba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53abb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53abc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53abd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53abe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53abf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ac0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ac1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ac2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ac3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ac4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ac5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ac6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ac7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ac8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ac9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53aca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53acb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53acc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53acd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ace*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53acf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ad0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ad1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ad2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ad3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ad4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ad5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ad6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ad7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ad8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ad9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ada*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53adb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53adc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53add*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ade*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53adf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ae0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ae1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ae2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ae3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ae4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ae5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ae6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ae7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ae8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ae9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53aea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53aeb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53aec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53aed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53aee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53aef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53af0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53af1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53af2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53af3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53af4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53af5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53af6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53af7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53af8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53af9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53afa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53afb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53afc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53afd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53afe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53aff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b00*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b01*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b02*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b03*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b04*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b05*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b06*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b07*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b08*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b09*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b0a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b0b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b0c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b0d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b0e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b0f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b10*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b11*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b12*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b13*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b14*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b15*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b16*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b17*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b18*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b19*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b1a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b1b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b1c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b1d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b1e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b1f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b20*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b21*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b22*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b23*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b24*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b25*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b26*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b27*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b28*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b29*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b2a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b2b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b2c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b2d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b2e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b2f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b30*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b31*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b32*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b33*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b34*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b35*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b36*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b37*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b38*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b39*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b3a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b3b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b3c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b3d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b3e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b3f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b40*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b41*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b42*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b43*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b44*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b45*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b46*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b47*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b48*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b49*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b4a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b4b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b4c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b4d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b4e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b4f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b50*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b51*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b52*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b53*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b54*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b55*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b56*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b57*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b58*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b59*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b5a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b5b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b5c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b5d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b5e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b5f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b60*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b61*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b62*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b63*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b64*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b65*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b66*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b67*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b68*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b69*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b6a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b6b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b6c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b6d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b6e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b6f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b70*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b71*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b72*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b73*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b74*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b75*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b76*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b77*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b78*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b79*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b7a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b7b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b7c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b7d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b7e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b7f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b80*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b81*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b82*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b83*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b84*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b85*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b86*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b87*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b88*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b89*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b8a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b8b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b8c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b8d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b8e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b8f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b90*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b91*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b92*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b93*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b94*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b95*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b96*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b97*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b98*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b99*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b9a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b9b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b9c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b9d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b9e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b9f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ba0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ba1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ba2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ba3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ba4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ba5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ba6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ba7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ba8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ba9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53baa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53baf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bb0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bb1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bb2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bb3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bb4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bb5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bb6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bb7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bb8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bb9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bbb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bbc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bbd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bbe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bbf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bc0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bc1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bc2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bc3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bc4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bc5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bc6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bc7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bc8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bc9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bcb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bcc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bcd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bcf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bd0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bd1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bd2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bd3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bd4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bd5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bd6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bd7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bd8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bd9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bda*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bdb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bdc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bdd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bde*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bdf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53be0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53be1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53be2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53be3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53be4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53be5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53be6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53be7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53be8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53be9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53beb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bf0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bf1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bf2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bf3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bf4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bf5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bf6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bf7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bf8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bf9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bfa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bfb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bfc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bfd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bfe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c00*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c01*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c02*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c03*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c04*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c05*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c06*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c07*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c08*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c09*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c0a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c0b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c0c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c0d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c0e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c0f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c10*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c11*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c12*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c13*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c14*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c15*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c16*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c17*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c18*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c19*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c1a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c1b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c1c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c1d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c1e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c1f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c20*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c21*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c22*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c23*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c24*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c25*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c26*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c27*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c28*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c29*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c2a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c2b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c2c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c2d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c2e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c2f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c30*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c31*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c32*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c33*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c34*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c35*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c36*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c37*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c38*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c39*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c3a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c3b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c3c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c3d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c3e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c3f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c40*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c41*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c42*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c43*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c44*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c45*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c46*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c47*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c48*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c49*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c4a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c4b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c4c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c4d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c4e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c4f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c50*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c51*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c52*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c53*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c54*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c55*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c56*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c57*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c58*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c59*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c5a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c5b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c5c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c5d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c5e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c5f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c60*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c61*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c62*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c63*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c64*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c65*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c66*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c67*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c68*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c69*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c6a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c6b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c6c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c6d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c6e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c6f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c70*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c71*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c72*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c73*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c74*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c75*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c76*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c77*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c78*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c79*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c7a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c7b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c7c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c7d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c7e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c7f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c80*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c81*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c82*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c83*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c84*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c85*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c86*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c87*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c88*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c89*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c8a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c8b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c8c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c8d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c8e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c8f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c90*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c91*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c92*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c93*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c94*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c95*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c96*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c97*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c98*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c99*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c9a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c9b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c9c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c9d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c9e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c9f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ca0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ca1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ca2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ca3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ca4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ca5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ca6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ca7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ca8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ca9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53caa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53caf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cb0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cb1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cb2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cb3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cb4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cb5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cb6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cb7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cb8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cb9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cbb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cbc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cbd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cbe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cbf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cc0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cc1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cc2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cc3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cc4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cc5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cc6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cc7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cc8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cc9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ccb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ccc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ccd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ccf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cd0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cd1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cd2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cd3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cd4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cd5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cd6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cd7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cd8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cd9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cda*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cdb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cdc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cdd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cde*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cdf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ce0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ce1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ce2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ce3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ce4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ce5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ce6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ce7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ce8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ce9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ceb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ced*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cf0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cf1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cf2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cf3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cf4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cf5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cf6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cf7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cf8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cf9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cfa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cfb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cfc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cfd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cfe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d00*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d01*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d02*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d03*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d04*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d05*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d06*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d07*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d08*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d09*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d0a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d0b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d0c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d0d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d0e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d0f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d10*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d11*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d12*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d13*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d14*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d15*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d16*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d17*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d18*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d19*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d1a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d1b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d1c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d1d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d1e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d1f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d20*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d21*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d22*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d23*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d24*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d25*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d26*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d27*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d28*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d29*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d2a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d2b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d2c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d2d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d2e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d2f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d30*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d31*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d32*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d33*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d34*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d35*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d36*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d37*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d38*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d39*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d3a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d3b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d3c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d3d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d3e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d3f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d40*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d41*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d42*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d43*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d44*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d45*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d46*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d47*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d48*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d49*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d4a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d4b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d4c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d4d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d4e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d4f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d50*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d51*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d52*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d53*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d54*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d55*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d56*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d57*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d58*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d59*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d5a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d5b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d5c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d5d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d5e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d5f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d60*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d61*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d62*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d63*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d64*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d65*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d66*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d67*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d68*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d69*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d6a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d6b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d6c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d6d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d6e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d6f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d70*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d71*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d72*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d73*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d74*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d75*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d76*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d77*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d78*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d79*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d7a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d7b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d7c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d7d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d7e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d7f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d80*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d81*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d82*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d83*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d84*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d85*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d86*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d87*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d88*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d89*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d8a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d8b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d8c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d8d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d8e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d8f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d90*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d91*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d92*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d93*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d94*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d95*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d96*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d97*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d98*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d99*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d9a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d9b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d9c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d9d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d9e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d9f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53da0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53da1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53da2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53da3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53da4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53da5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53da6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53da7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53da8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53da9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53daa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53daf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53db0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53db1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53db2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53db3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53db4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53db5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53db6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53db7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53db8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53db9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dbb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dbc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dbd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dbe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dbf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dc0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dc1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dc2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dc3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dc4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dc5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dc6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dc7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dc8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dc9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dcb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dcc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dcd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dcf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dd0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dd1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dd2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dd3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dd4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dd5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dd6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dd7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dd8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dd9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dda*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ddb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ddc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ddd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dde*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ddf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53de0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53de1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53de2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53de3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53de4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53de5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53de6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53de7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53de8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53de9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53deb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ded*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53def*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53df0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53df1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53df2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53df3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53df4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53df5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53df6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53df7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53df8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53df9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dfa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dfb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dfc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dfd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dfe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e00*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e01*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e02*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e03*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e04*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e05*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e06*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e07*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e08*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e09*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e0a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e0b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e0c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e0d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e0e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e0f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e10*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e11*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e12*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e13*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e14*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e15*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e16*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e17*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e18*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e19*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e1a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e1b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e1c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e1d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e1e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e1f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e20*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e21*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e22*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e23*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e24*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e25*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e26*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e27*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e28*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e29*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e2a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e2b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e2c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e2d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e2e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e2f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e30*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e31*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e32*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e33*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e34*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e35*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e36*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e37*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e38*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e39*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e3a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e3b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e3c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e3d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e3e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e3f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e40*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e41*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e42*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e43*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e44*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e45*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e46*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e47*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e48*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e49*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e4a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e4b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e4c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e4d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e4e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e4f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e50*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e51*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e52*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e53*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e54*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e55*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e56*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e57*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e58*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e59*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e5a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e5b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e5c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e5d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e5e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e5f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e60*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e61*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e62*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e63*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e64*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e65*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e66*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e67*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e68*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e69*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e6a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e6b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e6c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e6d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e6e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e6f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e70*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e71*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e72*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e73*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e74*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e75*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e76*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e77*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e78*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e79*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e7a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e7b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e7c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e7d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e7e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e7f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e80*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e81*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e82*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e83*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e84*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e85*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e86*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e87*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e88*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e89*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e8a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e8b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e8c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e8d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e8e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e8f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e90*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e91*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e92*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e93*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e94*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e95*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e96*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e97*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e98*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e99*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e9a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e9b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e9c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e9d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e9e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e9f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ea0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ea1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ea2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ea3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ea4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ea5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ea6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ea7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ea8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ea9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53eaa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53eab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53eac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ead*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53eae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53eaf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53eb0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53eb1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53eb2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53eb3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53eb4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53eb5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53eb6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53eb7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53eb8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53eb9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53eba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ebb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ebc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ebd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ebe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ebf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ec0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ec1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ec2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ec3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ec4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ec5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ec6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ec7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ec8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ec9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53eca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ecb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ecc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ecd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ece*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ecf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ed0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ed1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ed2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ed3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ed4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ed5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ed6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ed7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ed8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ed9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53eda*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53edb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53edc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53edd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ede*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53edf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ee0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ee1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ee2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ee3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ee4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ee5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ee6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ee7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ee8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ee9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53eea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53eeb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53eec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53eed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53eee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53eef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ef0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ef1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ef2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ef3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ef4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ef5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ef6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ef7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ef8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ef9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53efa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53efb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53efc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53efd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53efe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53eff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f00*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f01*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f02*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f03*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f04*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f05*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f06*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f07*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f08*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f09*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f0a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f0b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f0c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f0d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f0e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f0f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f10*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f11*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f12*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f13*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f14*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f15*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f16*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f17*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f18*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f19*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f1a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f1b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f1c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f1d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f1e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f1f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f20*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f21*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f22*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f23*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f24*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f25*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f26*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f27*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f28*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f29*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f2a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f2b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f2c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f2d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f2e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f2f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f30*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f31*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f32*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f33*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f34*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f35*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f36*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f37*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f38*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f39*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f3a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f3b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f3c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f3d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f3e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f3f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f40*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f41*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f42*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f43*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f44*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f45*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f46*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f47*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f48*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f49*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f4a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f4b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f4c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f4d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f4e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f4f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f50*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f51*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f52*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f53*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f54*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f55*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f56*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f57*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f58*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f59*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f5a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f5b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f5c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f5d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f5e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f5f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f60*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f61*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f62*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f63*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f64*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f65*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f66*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f67*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f68*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f69*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f6a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f6b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f6c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f6d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f6e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f6f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f70*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f71*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f72*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f73*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f74*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f75*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f76*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f77*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f78*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f79*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f7a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f7b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f7c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f7d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f7e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f7f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f80*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f81*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f82*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f83*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f84*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f85*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f86*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f87*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f88*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f89*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f8a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f8b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f8c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f8d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f8e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f8f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f90*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f91*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f92*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f93*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f94*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f95*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f96*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f97*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f98*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f99*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f9a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f9b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f9c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f9d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f9e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f9f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fa0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fa1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fa2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fa3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fa4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fa5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fa6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fa7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fa8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fa9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53faa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53faf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fb0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fb1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fb2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fb3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fb4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fb5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fb6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fb7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fb8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fb9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fbb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fbc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fbd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fbe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fbf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fc0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fc1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fc2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fc3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fc4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fc5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fc6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fc7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fc8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fc9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fcb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fcc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fcd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fcf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fd0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fd1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fd2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fd3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fd4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fd5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fd6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fd7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fd8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fd9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fda*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fdb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fdc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fdd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fde*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fdf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fe0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fe1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fe2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fe3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fe4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fe5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fe6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fe7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fe8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fe9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53feb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ff0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ff1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ff2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ff3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ff4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ff5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ff6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ff7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ff8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ff9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ffa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ffb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ffc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ffd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ffe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0xd0000*4+0x02000000,0x1); + +reg_write( DDR_REG_BASE + 0xd0000*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54000*4+0x02000000,0x000); +reg_write( DDR_REG_BASE + 0x54001*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54002*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54003*4+0x02000000,0x640); +reg_write( DDR_REG_BASE + 0x54004*4+0x02000000,0x2); +reg_write( DDR_REG_BASE + 0x54005*4+0x02000000,0x0); +//iteration place +//PHY VREF +// 0x40 50% +// 0x60 75% +// 0x56 67% +// 0x20 25% +reg_write( DDR_REG_BASE + 0x54006*4+0x02000000,0x60); + +reg_write( DDR_REG_BASE + 0x54007*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54008*4+0x02000000,0x131f); +reg_write( DDR_REG_BASE + 0x54009*4+0x02000000,0xc8); +reg_write( DDR_REG_BASE + 0x5400a*4+0x02000000,0x2); +reg_write( DDR_REG_BASE + 0x5400b*4+0x02000000,0x0); + +//swap dbyte +reg_write( DDR_REG_BASE + 0x5400d*4+0x02000000,0x8083); +reg_write( DDR_REG_BASE + 0x5400c*4+0x02000000,0x8182); + +reg_write( DDR_REG_BASE + 0x5400e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5400f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54010*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54011*4+0x02000000,0x120); +reg_write( DDR_REG_BASE + 0x54012*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54013*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54014*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54015*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54016*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54017*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54018*4+0x02000000,0x4300); +// iteration place +// DRAM DSEL Output Impedance -higher 8 bit +// MR3_A0/A1/B0/B1 + //0x2:(default: output driver impedance 40 pulldown&pullup) + //0x1:(34.3 pulldown&pullup ) + //0x3:(48) + //0x4:(reserve for 60) optional + //0x6:(reserve for 80) optional + //0x9:(34.3 pulldown & 40 pull up + //0xa:(40 pulldown & 48 pull up + //0xb:(34.3 pulldown & 48 pull up +reg_write( DDR_REG_BASE + 0x54019*4+0x02000000,0x21a); +reg_write( DDR_REG_BASE + 0x5401d*4+0x02000000,0x21a); +reg_write( DDR_REG_BASE + 0x5402c*4+0x02000000,0x21a); +reg_write( DDR_REG_BASE + 0x54030*4+0x02000000,0x21a); +//iteration place +//DRAM DQ ODT -higher 8 bit + //0x0:(default: DQ odt disable) + //0x5:(ODT:60) + //0x6:(ODT:120) + //0x7:(ODT:240) +reg_write( DDR_REG_BASE + 0x5401a*4+0x02000000,0x600); +reg_write( DDR_REG_BASE + 0x5401e*4+0x02000000,0x600); +reg_write( DDR_REG_BASE + 0x5402d*4+0x02000000,0x600); +reg_write( DDR_REG_BASE + 0x54031*4+0x02000000,0x600); + +reg_write( DDR_REG_BASE + 0x5401b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5401c*4+0x02000000,0x4300); + + +reg_write( DDR_REG_BASE + 0x5401f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54020*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54021*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54022*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54023*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54024*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54025*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54026*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54027*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54028*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54029*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5402a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5402b*4+0x02000000,0x4300); + + +reg_write( DDR_REG_BASE + 0x5402e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5402f*4+0x02000000,0x4300); + + +reg_write( DDR_REG_BASE + 0x54032*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54033*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54034*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54035*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54036*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54037*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54038*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54039*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5403a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5403b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5403c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5403d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5403e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5403f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54040*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54041*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54042*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54043*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54044*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54045*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54046*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54047*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54048*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54049*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5404a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5404b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5404c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5404d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5404e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5404f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54050*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54051*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54052*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54053*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54054*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54055*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54056*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54057*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54058*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54059*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5405a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5405b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5405c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5405d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5405e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5405f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54060*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54061*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54062*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54063*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54064*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54065*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54066*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54067*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54068*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54069*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5406a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5406b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5406c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5406d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5406e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5406f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54070*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54071*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54072*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54073*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54074*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54075*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54076*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54077*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54078*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54079*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5407a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5407b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5407c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5407d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5407e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5407f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54080*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54081*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54082*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54083*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54084*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54085*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54086*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54087*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54088*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54089*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5408a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5408b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5408c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5408d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5408e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5408f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54090*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54091*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54092*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54093*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54094*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54095*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54096*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54097*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54098*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54099*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5409a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5409b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5409c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5409d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5409e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5409f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540a0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540a1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540a2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540a3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540a4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540a5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540a6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540a7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540a8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540a9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540aa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540ab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540ac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540ad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540ae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540af*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540b0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540b1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540b2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540b3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540b4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540b5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540b6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540b7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540b8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540b9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540ba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540bb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540bc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540bd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540be*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540bf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540c0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540c1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540c2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540c3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540c4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540c5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540c6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540c7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540c8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540c9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540ca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540cb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540cc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540cd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540ce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540cf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540d0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540d1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540d2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540d3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540d4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540d5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540d6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540d7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540d8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540d9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540da*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540db*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540dc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540dd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540de*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540df*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540e0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540e1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540e2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540e3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540e4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540e5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540e6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540e7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540e8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540e9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540ea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540eb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540ec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540ed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540ee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540ef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540f0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540f1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540f2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540f3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540f4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540f5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540f6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540f7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540f8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540f9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540fa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540fb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540fc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540fd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540fe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540ff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54100*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54101*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54102*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54103*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54104*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54105*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54106*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54107*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54108*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54109*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5410a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5410b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5410c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5410d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5410e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5410f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54110*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54111*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54112*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54113*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54114*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54115*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54116*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54117*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54118*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54119*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5411a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5411b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5411c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5411d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5411e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5411f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54120*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54121*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54122*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54123*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54124*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54125*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54126*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54127*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54128*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54129*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5412a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5412b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5412c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5412d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5412e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5412f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54130*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54131*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54132*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54133*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54134*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54135*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54136*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54137*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54138*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54139*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5413a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5413b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5413c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5413d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5413e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5413f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54140*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54141*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54142*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54143*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54144*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54145*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54146*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54147*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54148*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54149*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5414a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5414b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5414c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5414d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5414e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5414f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54150*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54151*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54152*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54153*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54154*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54155*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54156*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54157*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54158*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54159*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5415a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5415b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5415c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5415d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5415e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5415f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54160*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54161*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54162*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54163*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54164*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54165*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54166*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54167*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54168*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54169*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5416a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5416b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5416c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5416d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5416e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5416f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54170*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54171*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54172*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54173*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54174*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54175*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54176*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54177*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54178*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54179*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5417a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5417b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5417c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5417d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5417e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5417f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54180*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54181*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54182*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54183*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54184*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54185*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54186*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54187*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54188*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54189*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5418a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5418b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5418c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5418d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5418e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5418f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54190*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54191*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54192*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54193*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54194*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54195*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54196*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54197*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54198*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54199*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5419a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5419b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5419c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5419d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5419e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5419f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541a0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541a1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541a2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541a3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541a4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541a5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541a6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541a7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541a8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541a9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541aa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541ab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541ac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541ad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541ae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541af*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541b0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541b1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541b2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541b3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541b4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541b5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541b6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541b7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541b8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541b9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541ba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541bb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541bc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541bd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541be*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541bf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541c0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541c1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541c2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541c3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541c4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541c5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541c6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541c7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541c8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541c9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541ca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541cb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541cc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541cd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541ce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541cf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541d0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541d1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541d2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541d3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541d4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541d5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541d6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541d7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541d8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541d9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541da*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541db*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541dc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541dd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541de*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541df*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541e0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541e1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541e2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541e3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541e4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541e5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541e6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541e7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541e8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541e9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541ea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541eb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541ec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541ed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541ee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541ef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541f0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541f1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541f2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541f3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541f4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541f5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541f6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541f7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541f8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541f9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541fa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541fb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541fc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541fd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541fe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541ff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54200*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54201*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54202*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54203*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54204*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54205*4+0x02000000,0xff); +reg_write( DDR_REG_BASE + 0x54206*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54207*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54208*4+0x02000000,0x14a); +reg_write( DDR_REG_BASE + 0x54209*4+0x02000000,0x181); +reg_write( DDR_REG_BASE + 0x5420a*4+0x02000000,0x118); +reg_write( DDR_REG_BASE + 0x5420b*4+0x02000000,0x118); +reg_write( DDR_REG_BASE + 0x5420c*4+0x02000000,0x16f); +reg_write( DDR_REG_BASE + 0x5420d*4+0x02000000,0x16f); +reg_write( DDR_REG_BASE + 0x5420e*4+0x02000000,0x159); +reg_write( DDR_REG_BASE + 0x5420f*4+0x02000000,0x181); +reg_write( DDR_REG_BASE + 0x54210*4+0x02000000,0x120); +reg_write( DDR_REG_BASE + 0x54211*4+0x02000000,0x120); +reg_write( DDR_REG_BASE + 0x54212*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54213*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54214*4+0x02000000,0x701c); +reg_write( DDR_REG_BASE + 0x54215*4+0x02000000,0x61a8); +reg_write( DDR_REG_BASE + 0x54216*4+0x02000000,0x35ac); +reg_write( DDR_REG_BASE + 0x54217*4+0x02000000,0x35ac); +reg_write( DDR_REG_BASE + 0x54218*4+0x02000000,0x125c); +reg_write( DDR_REG_BASE + 0x54219*4+0x02000000,0x125c); +reg_write( DDR_REG_BASE + 0x5421a*4+0x02000000,0xc738); +reg_write( DDR_REG_BASE + 0x5421b*4+0x02000000,0xb0f4); +reg_write( DDR_REG_BASE + 0x5421c*4+0x02000000,0x6590); +reg_write( DDR_REG_BASE + 0x5421d*4+0x02000000,0x6590); +reg_write( DDR_REG_BASE + 0x5421e*4+0x02000000,0x9f38); +reg_write( DDR_REG_BASE + 0x5421f*4+0x02000000,0x58); +reg_write( DDR_REG_BASE + 0x54220*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54221*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54222*4+0x02000000,0xf01f); +reg_write( DDR_REG_BASE + 0x54223*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54224*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54225*4+0x02000000,0xffb4); +reg_write( DDR_REG_BASE + 0x54226*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54227*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54228*4+0x02000000,0xf0b4); +reg_write( DDR_REG_BASE + 0x54229*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5422a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5422b*4+0x02000000,0xf4b4); +reg_write( DDR_REG_BASE + 0x5422c*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5422d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5422e*4+0x02000000,0xf0b9); +reg_write( DDR_REG_BASE + 0x5422f*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54230*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54231*4+0x02000000,0xf0ba); +reg_write( DDR_REG_BASE + 0x54232*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54233*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54234*4+0x02000000,0xf0bb); +reg_write( DDR_REG_BASE + 0x54235*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54236*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54237*4+0x02000000,0xf001); +reg_write( DDR_REG_BASE + 0x54238*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54239*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5423a*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE + 0x5423b*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5423c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5423d*4+0x02000000,0xf0f9); +reg_write( DDR_REG_BASE + 0x5423e*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x5423f*4+0x02000000,0x200); +reg_write( DDR_REG_BASE + 0x54240*4+0x02000000,0xf0fa); +reg_write( DDR_REG_BASE + 0x54241*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x54242*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54243*4+0x02000000,0xf0fb); +reg_write( DDR_REG_BASE + 0x54244*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x54245*4+0x02000000,0x400); +reg_write( DDR_REG_BASE + 0x54246*4+0x02000000,0xf060); +reg_write( DDR_REG_BASE + 0x54247*4+0x02000000,0x7); +reg_write( DDR_REG_BASE + 0x54248*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x54249*4+0x02000000,0xf065); +reg_write( DDR_REG_BASE + 0x5424a*4+0x02000000,0x7); +reg_write( DDR_REG_BASE + 0x5424b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5424c*4+0x02000000,0xff62); +reg_write( DDR_REG_BASE + 0x5424d*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5424e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5424f*4+0x02000000,0xf002); +reg_write( DDR_REG_BASE + 0x54250*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54251*4+0x02000000,0x220); +reg_write( DDR_REG_BASE + 0x54252*4+0x02000000,0xf01f); +reg_write( DDR_REG_BASE + 0x54253*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54254*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54255*4+0x02000000,0xffb4); +reg_write( DDR_REG_BASE + 0x54256*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54257*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54258*4+0x02000000,0xf0b4); +reg_write( DDR_REG_BASE + 0x54259*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5425a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5425b*4+0x02000000,0xf4b4); +reg_write( DDR_REG_BASE + 0x5425c*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5425d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5425e*4+0x02000000,0xf0b9); +reg_write( DDR_REG_BASE + 0x5425f*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54260*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54261*4+0x02000000,0xf0ba); +reg_write( DDR_REG_BASE + 0x54262*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54263*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54264*4+0x02000000,0xf0bb); +reg_write( DDR_REG_BASE + 0x54265*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54266*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54267*4+0x02000000,0xf001); +reg_write( DDR_REG_BASE + 0x54268*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54269*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5426a*4+0x02000000,0xf0f9); +reg_write( DDR_REG_BASE + 0x5426b*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x5426c*4+0x02000000,0x200); +reg_write( DDR_REG_BASE + 0x5426d*4+0x02000000,0xf0fa); +reg_write( DDR_REG_BASE + 0x5426e*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x5426f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54270*4+0x02000000,0xf0fb); +reg_write( DDR_REG_BASE + 0x54271*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x54272*4+0x02000000,0x400); +reg_write( DDR_REG_BASE + 0x54273*4+0x02000000,0xf060); +reg_write( DDR_REG_BASE + 0x54274*4+0x02000000,0x7); +reg_write( DDR_REG_BASE + 0x54275*4+0x02000000,0x5); +reg_write( DDR_REG_BASE + 0x54276*4+0x02000000,0xf065); +reg_write( DDR_REG_BASE + 0x54277*4+0x02000000,0x7); +reg_write( DDR_REG_BASE + 0x54278*4+0x02000000,0x1ff); +reg_write( DDR_REG_BASE + 0x54279*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE + 0x5427a*4+0x02000000,0x7); +reg_write( DDR_REG_BASE + 0x5427b*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x5427c*4+0x02000000,0xff62); +reg_write( DDR_REG_BASE + 0x5427d*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5427e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5427f*4+0x02000000,0xf862); +reg_write( DDR_REG_BASE + 0x54280*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54281*4+0x02000000,0xfd); +reg_write( DDR_REG_BASE + 0x54282*4+0x02000000,0xf002); +reg_write( DDR_REG_BASE + 0x54283*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54284*4+0x02000000,0x220); +reg_write( DDR_REG_BASE + 0x54285*4+0x02000000,0xf01f); +reg_write( DDR_REG_BASE + 0x54286*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54287*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54288*4+0x02000000,0xffb4); +reg_write( DDR_REG_BASE + 0x54289*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5428a*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5428b*4+0x02000000,0xf0b4); +reg_write( DDR_REG_BASE + 0x5428c*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5428d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5428e*4+0x02000000,0xf4b4); +reg_write( DDR_REG_BASE + 0x5428f*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54290*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54291*4+0x02000000,0xf0b9); +reg_write( DDR_REG_BASE + 0x54292*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54293*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54294*4+0x02000000,0xf0ba); +reg_write( DDR_REG_BASE + 0x54295*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54296*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54297*4+0x02000000,0xf0bb); +reg_write( DDR_REG_BASE + 0x54298*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54299*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5429a*4+0x02000000,0xf001); +reg_write( DDR_REG_BASE + 0x5429b*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5429c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5429d*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE + 0x5429e*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5429f*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542a0*4+0x02000000,0xf012); +reg_write( DDR_REG_BASE + 0x542a1*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542a2*4+0x02000000,0xf000); +reg_write( DDR_REG_BASE + 0x542a3*4+0x02000000,0xf018); +reg_write( DDR_REG_BASE + 0x542a4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542a5*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542a6*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE + 0x542a7*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542a8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x542a9*4+0x02000000,0xf0f9); +reg_write( DDR_REG_BASE + 0x542aa*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x542ab*4+0x02000000,0x200); +reg_write( DDR_REG_BASE + 0x542ac*4+0x02000000,0xf0fa); +reg_write( DDR_REG_BASE + 0x542ad*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x542ae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x542af*4+0x02000000,0xf0fb); +reg_write( DDR_REG_BASE + 0x542b0*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x542b1*4+0x02000000,0x400); +reg_write( DDR_REG_BASE + 0x542b2*4+0x02000000,0xff62); +reg_write( DDR_REG_BASE + 0x542b3*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542b4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x542b5*4+0x02000000,0xf062); +reg_write( DDR_REG_BASE + 0x542b6*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542b7*4+0x02000000,0xf); +reg_write( DDR_REG_BASE + 0x542b8*4+0x02000000,0xf462); +reg_write( DDR_REG_BASE + 0x542b9*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542ba*4+0x02000000,0xf0); +reg_write( DDR_REG_BASE + 0x542bb*4+0x02000000,0xf002); +reg_write( DDR_REG_BASE + 0x542bc*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542bd*4+0x02000000,0x204); +reg_write( DDR_REG_BASE + 0x542be*4+0x02000000,0xf01f); +reg_write( DDR_REG_BASE + 0x542bf*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542c0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x542c1*4+0x02000000,0xf03b); +reg_write( DDR_REG_BASE + 0x542c2*4+0x02000000,0x2); +reg_write( DDR_REG_BASE + 0x542c3*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542c4*4+0x02000000,0xffb2); +reg_write( DDR_REG_BASE + 0x542c5*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542c6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x542c7*4+0x02000000,0xf0b2); +reg_write( DDR_REG_BASE + 0x542c8*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542c9*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542ca*4+0x02000000,0xffb4); +reg_write( DDR_REG_BASE + 0x542cb*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542cc*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542cd*4+0x02000000,0xf0b4); +reg_write( DDR_REG_BASE + 0x542ce*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542cf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x542d0*4+0x02000000,0xf0b9); +reg_write( DDR_REG_BASE + 0x542d1*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542d2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x542d3*4+0x02000000,0xf0ba); +reg_write( DDR_REG_BASE + 0x542d4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542d5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x542d6*4+0x02000000,0xf0bb); +reg_write( DDR_REG_BASE + 0x542d7*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542d8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x542d9*4+0x02000000,0xf001); +reg_write( DDR_REG_BASE + 0x542da*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542db*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x542dc*4+0x02000000,0xf060); +reg_write( DDR_REG_BASE + 0x542dd*4+0x02000000,0x7); +reg_write( DDR_REG_BASE + 0x542de*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542df*4+0x02000000,0xf065); +reg_write( DDR_REG_BASE + 0x542e0*4+0x02000000,0x7); +reg_write( DDR_REG_BASE + 0x542e1*4+0x02000000,0x1ff); +reg_write( DDR_REG_BASE + 0x542e2*4+0x02000000,0xff26); +reg_write( DDR_REG_BASE + 0x542e3*4+0x02000000,0x7); +reg_write( DDR_REG_BASE + 0x542e4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x542e5*4+0x02000000,0xff27); +reg_write( DDR_REG_BASE + 0x542e6*4+0x02000000,0x7); +reg_write( DDR_REG_BASE + 0x542e7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x542e8*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE + 0x542e9*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542ea*4+0x02000000,0x2); +reg_write( DDR_REG_BASE + 0x542eb*4+0x02000000,0xff32); +reg_write( DDR_REG_BASE + 0x542ec*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542ed*4+0x02000000,0x800); +reg_write( DDR_REG_BASE + 0x542ee*4+0x02000000,0xff62); +reg_write( DDR_REG_BASE + 0x542ef*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542f0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x542f1*4+0x02000000,0xf062); +reg_write( DDR_REG_BASE + 0x542f2*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542f3*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542f4*4+0x02000000,0xf462); +reg_write( DDR_REG_BASE + 0x542f5*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542f6*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542f7*4+0x02000000,0xf002); +reg_write( DDR_REG_BASE + 0x542f8*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542f9*4+0x02000000,0x208); +reg_write( DDR_REG_BASE + 0x542fa*4+0x02000000,0xf01f); +reg_write( DDR_REG_BASE + 0x542fb*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542fc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x542fd*4+0x02000000,0xffb2); +reg_write( DDR_REG_BASE + 0x542fe*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542ff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54300*4+0x02000000,0xf0b2); +reg_write( DDR_REG_BASE + 0x54301*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54302*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54303*4+0x02000000,0xf4b2); +reg_write( DDR_REG_BASE + 0x54304*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54305*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54306*4+0x02000000,0xffb4); +reg_write( DDR_REG_BASE + 0x54307*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54308*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54309*4+0x02000000,0xf0b4); +reg_write( DDR_REG_BASE + 0x5430a*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5430b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5430c*4+0x02000000,0xf4b4); +reg_write( DDR_REG_BASE + 0x5430d*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5430e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5430f*4+0x02000000,0xf0b9); +reg_write( DDR_REG_BASE + 0x54310*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54311*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54312*4+0x02000000,0xf0ba); +reg_write( DDR_REG_BASE + 0x54313*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54314*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54315*4+0x02000000,0xf0bb); +reg_write( DDR_REG_BASE + 0x54316*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54317*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54318*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE + 0x54319*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5431a*4+0x02000000,0x101); +reg_write( DDR_REG_BASE + 0x5431b*4+0x02000000,0xf012); +reg_write( DDR_REG_BASE + 0x5431c*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5431d*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5431e*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE + 0x5431f*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54320*4+0x02000000,0x2); +reg_write( DDR_REG_BASE + 0x54321*4+0x02000000,0xf018); +reg_write( DDR_REG_BASE + 0x54322*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54323*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54324*4+0x02000000,0xf060); +reg_write( DDR_REG_BASE + 0x54325*4+0x02000000,0x7); +reg_write( DDR_REG_BASE + 0x54326*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54327*4+0x02000000,0xf065); +reg_write( DDR_REG_BASE + 0x54328*4+0x02000000,0x7); +reg_write( DDR_REG_BASE + 0x54329*4+0x02000000,0x1ff); +reg_write( DDR_REG_BASE + 0x5432a*4+0x02000000,0xff26); +reg_write( DDR_REG_BASE + 0x5432b*4+0x02000000,0x7); +reg_write( DDR_REG_BASE + 0x5432c*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE + 0x5432d*4+0x02000000,0xff27); +reg_write( DDR_REG_BASE + 0x5432e*4+0x02000000,0x7); +reg_write( DDR_REG_BASE + 0x5432f*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE + 0x54330*4+0x02000000,0xff62); +reg_write( DDR_REG_BASE + 0x54331*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54332*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54333*4+0x02000000,0xf062); +reg_write( DDR_REG_BASE + 0x54334*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54335*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54336*4+0x02000000,0xf462); +reg_write( DDR_REG_BASE + 0x54337*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54338*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x54339*4+0x02000000,0xff32); +reg_write( DDR_REG_BASE + 0x5433a*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5433b*4+0x02000000,0x800); +reg_write( DDR_REG_BASE + 0x5433c*4+0x02000000,0xf002); +reg_write( DDR_REG_BASE + 0x5433d*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5433e*4+0x02000000,0x210); +reg_write( DDR_REG_BASE + 0x5433f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54340*4+0x02000000,0x201); +reg_write( DDR_REG_BASE + 0x54341*4+0x02000000,0xb03); +reg_write( DDR_REG_BASE + 0x54342*4+0x02000000,0x1110); +reg_write( DDR_REG_BASE + 0x54343*4+0x02000000,0x2a29); +reg_write( DDR_REG_BASE + 0x54344*4+0x02000000,0x6e30); +reg_write( DDR_REG_BASE + 0x54345*4+0x02000000,0x200); +reg_write( DDR_REG_BASE + 0x54346*4+0x02000000,0x100); +reg_write( DDR_REG_BASE + 0x54347*4+0x02000000,0xfd00); +reg_write( DDR_REG_BASE + 0x54348*4+0x02000000,0x400); +reg_write( DDR_REG_BASE + 0x54349*4+0x02000000,0xf00); +reg_write( DDR_REG_BASE + 0x5434a*4+0x02000000,0x6000); +reg_write( DDR_REG_BASE + 0x5434b*4+0x02000000,0x700); +reg_write( DDR_REG_BASE + 0x5434c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5434d*4+0x02000000,0xe800); +reg_write( DDR_REG_BASE + 0x5434e*4+0x02000000,0x400); +reg_write( DDR_REG_BASE + 0x5434f*4+0x02000000,0xff00); +reg_write( DDR_REG_BASE + 0x54350*4+0x02000000,0xfc00); +reg_write( DDR_REG_BASE + 0x54351*4+0x02000000,0x400); +reg_write( DDR_REG_BASE + 0x54352*4+0x02000000,0x400); +reg_write( DDR_REG_BASE + 0x54353*4+0x02000000,0x3a04); +reg_write( DDR_REG_BASE + 0x54354*4+0x02000000,0x200); +reg_write( DDR_REG_BASE + 0x54355*4+0x02000000,0x200); +reg_write( DDR_REG_BASE + 0x54356*4+0x02000000,0x1100); +reg_write( DDR_REG_BASE + 0x54357*4+0x02000000,0x700); +reg_write( DDR_REG_BASE + 0x54358*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54359*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0xd0000*4+0x02000000,0x1); + +reg_write( DDR_REG_BASE + 0x000d0000*4+0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000d0099*4+0x02000000 , 0x00000009 ); +reg_write( DDR_REG_BASE + 0x000d0099*4+0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000d0099*4+0x02000000 , 0x00000000 ); + + + + +while((train_data&0x7) !=0x07) { + + reg_read ( DDR_REG_BASE + 0x000d0004*4+0x02000000 , data ); + while((data&0x1) !=0x0) { + reg_read ( DDR_REG_BASE + 0x000d0004*4+0x02000000 , data ); + } + + + + reg_read ( DDR_REG_BASE + 0x000d0032*4+0x02000000 , train_data ); + switch(train_data) + { + case 0x00000000: printf("%08X: PMU Major Msg: End of initialization \n",train_data);break; + case 0x00000001: printf("%08X: PMU Major Msg: End of fine write leveling \n",train_data);break; + case 0x00000002: printf("%08X: PMU Major Msg: End of read enable training \n",train_data);break; + case 0x00000003: printf("%08X: PMU Major Msg: End of read delay center optimization \n",train_data);break; + case 0x00000004: printf("%08X: PMU Major Msg: End of write delay center optimization \n",train_data);break; + case 0x00000005: printf("%08X: PMU Major Msg: End of 2D read delay/voltage center optimization \n",train_data);break; + case 0x00000006: printf("%08X: PMU Major Msg: End of 2D write delay /voltage center optimization \n",train_data);break; + case 0x00000007: printf("%08X: PMU Major Msg: Firmware run has completed \n",train_data);break; + case 0x00000008: printf("%08X: PMU Major Msg: Enter streaming message mode \n",train_data);break; + case 0x00000009: printf("%08X: PMU Major Msg: End of max read latency training \n",train_data);break; + case 0x0000000a: printf("%08X: PMU Major Msg: End of read dq deskew training \n",train_data);break; + case 0x0000000b: printf("%08X: PMU Major Msg: End of LCDL offset calibration \n",train_data);break; + case 0x0000000c: printf("%08X: PMU Major Msg: End of LRDIMM Specific training (DWL, MREP, MRD and MWD) \n",train_data);break; + case 0x0000000d: printf("%08X: PMU Major Msg: End of CA training \n",train_data);break; + case 0x000000fd: printf("%08X: PMU Major Msg: End of MPR read delay center optimization \n",train_data);break; + case 0x000000fe: printf("%08X: PMU Major Msg: End of Write leveling coarse delay \n",train_data);break; + case 0x000000ff: printf("%08X: PMU Major Msg: FATAL ERROR. \n",train_data);break; + default: printf("%08X: PMU Major Msg: Un-recognized message... ! \n",train_data);break; + } + + + reg_write( DDR_REG_BASE + 0x000d0031*4+0x02000000 , 0x00000000 ); + reg_read ( DDR_REG_BASE + 0x000d0004*4+0x02000000 , data ); + while((data&0x1) ==0x0) { + reg_read ( DDR_REG_BASE + 0x000d0004*4+0x02000000 , data ); + } + reg_write( DDR_REG_BASE + 0x000d0031*4+0x02000000 , 0x00000001 ); + +} + +train_data=0; + + + + + + +reg_write( DDR_REG_BASE + 0xd0099*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0xd0000*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0xd0000*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0xd0000*4+0x02000000,0x0); + +reg_write( DDR_REG_BASE + 0x90000*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x90001*4+0x02000000,0x400); +reg_write( DDR_REG_BASE + 0x90002*4+0x02000000,0x10e); +reg_write( DDR_REG_BASE + 0x90003*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x90004*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x90005*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x90029*4+0x02000000,0xb); +reg_write( DDR_REG_BASE + 0x9002a*4+0x02000000,0x480); +reg_write( DDR_REG_BASE + 0x9002b*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x9002c*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x9002d*4+0x02000000,0x448); +reg_write( DDR_REG_BASE + 0x9002e*4+0x02000000,0x139); +reg_write( DDR_REG_BASE + 0x9002f*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x90030*4+0x02000000,0x478); +reg_write( DDR_REG_BASE + 0x90031*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x90032*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x90033*4+0x02000000,0xe8); +reg_write( DDR_REG_BASE + 0x90034*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x90035*4+0x02000000,0x2); +reg_write( DDR_REG_BASE + 0x90036*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x90037*4+0x02000000,0x139); +reg_write( DDR_REG_BASE + 0x90038*4+0x02000000,0xb); +reg_write( DDR_REG_BASE + 0x90039*4+0x02000000,0x7c0); +reg_write( DDR_REG_BASE + 0x9003a*4+0x02000000,0x139); +reg_write( DDR_REG_BASE + 0x9003b*4+0x02000000,0x44); +reg_write( DDR_REG_BASE + 0x9003c*4+0x02000000,0x633); +reg_write( DDR_REG_BASE + 0x9003d*4+0x02000000,0x159); +reg_write( DDR_REG_BASE + 0x9003e*4+0x02000000,0x14f); +reg_write( DDR_REG_BASE + 0x9003f*4+0x02000000,0x630); +reg_write( DDR_REG_BASE + 0x90040*4+0x02000000,0x159); +reg_write( DDR_REG_BASE + 0x90041*4+0x02000000,0x47); +reg_write( DDR_REG_BASE + 0x90042*4+0x02000000,0x633); +reg_write( DDR_REG_BASE + 0x90043*4+0x02000000,0x149); +reg_write( DDR_REG_BASE + 0x90044*4+0x02000000,0x4f); +reg_write( DDR_REG_BASE + 0x90045*4+0x02000000,0x633); +reg_write( DDR_REG_BASE + 0x90046*4+0x02000000,0x179); +reg_write( DDR_REG_BASE + 0x90047*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x90048*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x90049*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x9004a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x9004b*4+0x02000000,0x7c8); +reg_write( DDR_REG_BASE + 0x9004c*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x9004d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x9004e*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x9004f*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x90050*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x90051*4+0x02000000,0x45a); +reg_write( DDR_REG_BASE + 0x90052*4+0x02000000,0x9); +reg_write( DDR_REG_BASE + 0x90053*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x90054*4+0x02000000,0x448); +reg_write( DDR_REG_BASE + 0x90055*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x90056*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x90057*4+0x02000000,0x633); +reg_write( DDR_REG_BASE + 0x90058*4+0x02000000,0x179); +reg_write( DDR_REG_BASE + 0x90059*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x9005a*4+0x02000000,0x618); +reg_write( DDR_REG_BASE + 0x9005b*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x9005c*4+0x02000000,0x40c0); +reg_write( DDR_REG_BASE + 0x9005d*4+0x02000000,0x633); +reg_write( DDR_REG_BASE + 0x9005e*4+0x02000000,0x149); +reg_write( DDR_REG_BASE + 0x9005f*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x90060*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x90061*4+0x02000000,0x48); +reg_write( DDR_REG_BASE + 0x90062*4+0x02000000,0x4040); +reg_write( DDR_REG_BASE + 0x90063*4+0x02000000,0x633); +reg_write( DDR_REG_BASE + 0x90064*4+0x02000000,0x149); +reg_write( DDR_REG_BASE + 0x90065*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x90066*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x90067*4+0x02000000,0x48); +reg_write( DDR_REG_BASE + 0x90068*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x90069*4+0x02000000,0x633); +reg_write( DDR_REG_BASE + 0x9006a*4+0x02000000,0x149); +reg_write( DDR_REG_BASE + 0x9006b*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x9006c*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x9006d*4+0x02000000,0x18); +reg_write( DDR_REG_BASE + 0x9006e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x9006f*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x90070*4+0x02000000,0x78); +reg_write( DDR_REG_BASE + 0x90071*4+0x02000000,0x549); +reg_write( DDR_REG_BASE + 0x90072*4+0x02000000,0x633); +reg_write( DDR_REG_BASE + 0x90073*4+0x02000000,0x159); +reg_write( DDR_REG_BASE + 0x90074*4+0x02000000,0xd49); +reg_write( DDR_REG_BASE + 0x90075*4+0x02000000,0x633); +reg_write( DDR_REG_BASE + 0x90076*4+0x02000000,0x159); +reg_write( DDR_REG_BASE + 0x90077*4+0x02000000,0x94a); +reg_write( DDR_REG_BASE + 0x90078*4+0x02000000,0x633); +reg_write( DDR_REG_BASE + 0x90079*4+0x02000000,0x159); +reg_write( DDR_REG_BASE + 0x9007a*4+0x02000000,0x441); +reg_write( DDR_REG_BASE + 0x9007b*4+0x02000000,0x633); +reg_write( DDR_REG_BASE + 0x9007c*4+0x02000000,0x149); +reg_write( DDR_REG_BASE + 0x9007d*4+0x02000000,0x42); +reg_write( DDR_REG_BASE + 0x9007e*4+0x02000000,0x633); +reg_write( DDR_REG_BASE + 0x9007f*4+0x02000000,0x149); +reg_write( DDR_REG_BASE + 0x90080*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x90081*4+0x02000000,0x633); +reg_write( DDR_REG_BASE + 0x90082*4+0x02000000,0x149); +reg_write( DDR_REG_BASE + 0x90083*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x90084*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x90085*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x90086*4+0x02000000,0xa); +reg_write( DDR_REG_BASE + 0x90087*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x90088*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x90089*4+0x02000000,0x9); +reg_write( DDR_REG_BASE + 0x9008a*4+0x02000000,0x3c0); +reg_write( DDR_REG_BASE + 0x9008b*4+0x02000000,0x149); +reg_write( DDR_REG_BASE + 0x9008c*4+0x02000000,0x9); +reg_write( DDR_REG_BASE + 0x9008d*4+0x02000000,0x3c0); +reg_write( DDR_REG_BASE + 0x9008e*4+0x02000000,0x159); +reg_write( DDR_REG_BASE + 0x9008f*4+0x02000000,0x18); +reg_write( DDR_REG_BASE + 0x90090*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x90091*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x90092*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x90093*4+0x02000000,0x3c0); +reg_write( DDR_REG_BASE + 0x90094*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x90095*4+0x02000000,0x18); +reg_write( DDR_REG_BASE + 0x90096*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x90097*4+0x02000000,0x48); +reg_write( DDR_REG_BASE + 0x90098*4+0x02000000,0x18); +reg_write( DDR_REG_BASE + 0x90099*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x9009a*4+0x02000000,0x58); +reg_write( DDR_REG_BASE + 0x9009b*4+0x02000000,0xb); +reg_write( DDR_REG_BASE + 0x9009c*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x9009d*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x9009e*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x9009f*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x900a0*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x900a1*4+0x02000000,0x5); +reg_write( DDR_REG_BASE + 0x900a2*4+0x02000000,0x7c0); +reg_write( DDR_REG_BASE + 0x900a3*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x40000*4+0x02000000,0x8ec); +reg_write( DDR_REG_BASE + 0x40020*4+0x02000000,0x800); +reg_write( DDR_REG_BASE + 0x40040*4+0x02000000,0x38); +reg_write( DDR_REG_BASE + 0x40060*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x40001*4+0x02000000,0x70a); +reg_write( DDR_REG_BASE + 0x40021*4+0x02000000,0x15); +reg_write( DDR_REG_BASE + 0x40041*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x40061*4+0x02000000,0x2003); +reg_write( DDR_REG_BASE + 0x40002*4+0x02000000,0x764); +reg_write( DDR_REG_BASE + 0x40022*4+0x02000000,0x15); +reg_write( DDR_REG_BASE + 0x40042*4+0x02000000,0xa56); +reg_write( DDR_REG_BASE + 0x40062*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x40003*4+0x02000000,0x70a); +reg_write( DDR_REG_BASE + 0x40023*4+0x02000000,0x1a); +reg_write( DDR_REG_BASE + 0x40043*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x40063*4+0x02000000,0x2003); +reg_write( DDR_REG_BASE + 0x40004*4+0x02000000,0x4764); +reg_write( DDR_REG_BASE + 0x40024*4+0x02000000,0x1a); +reg_write( DDR_REG_BASE + 0x40044*4+0x02000000,0xa56); +reg_write( DDR_REG_BASE + 0x40064*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x40005*4+0x02000000,0xf05); +reg_write( DDR_REG_BASE + 0x40025*4+0x02000000,0xc05); +reg_write( DDR_REG_BASE + 0x40045*4+0x02000000,0x2800); +reg_write( DDR_REG_BASE + 0x40065*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x40006*4+0x02000000,0x728); +reg_write( DDR_REG_BASE + 0x40026*4+0x02000000,0x5); +reg_write( DDR_REG_BASE + 0x40046*4+0x02000000,0x2800); +reg_write( DDR_REG_BASE + 0x40066*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x40007*4+0x02000000,0x4028); +reg_write( DDR_REG_BASE + 0x40027*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x40047*4+0x02000000,0x38); +reg_write( DDR_REG_BASE + 0x40067*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x40008*4+0x02000000,0xf05); +reg_write( DDR_REG_BASE + 0x40028*4+0x02000000,0xc0a); +reg_write( DDR_REG_BASE + 0x40048*4+0x02000000,0x2800); +reg_write( DDR_REG_BASE + 0x40068*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x40009*4+0x02000000,0x728); +reg_write( DDR_REG_BASE + 0x40029*4+0x02000000,0xa); +reg_write( DDR_REG_BASE + 0x40049*4+0x02000000,0x2800); +reg_write( DDR_REG_BASE + 0x40069*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x4000a*4+0x02000000,0x4028); +reg_write( DDR_REG_BASE + 0x4002a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x4004a*4+0x02000000,0x38); +reg_write( DDR_REG_BASE + 0x4006a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x4000b*4+0x02000000,0xee0); +reg_write( DDR_REG_BASE + 0x4002b*4+0x02000000,0xc0f); +reg_write( DDR_REG_BASE + 0x4004b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x4006b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x4000c*4+0x02000000,0x5620); +reg_write( DDR_REG_BASE + 0x4002c*4+0x02000000,0x3); +reg_write( DDR_REG_BASE + 0x4004c*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x4006c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x900a4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x900a5*4+0x02000000,0x790); +reg_write( DDR_REG_BASE + 0x900a6*4+0x02000000,0x10a); +reg_write( DDR_REG_BASE + 0x900a7*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x900a8*4+0x02000000,0x7aa); +reg_write( DDR_REG_BASE + 0x900a9*4+0x02000000,0xa); +reg_write( DDR_REG_BASE + 0x900aa*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x900ab*4+0x02000000,0x7b2); +reg_write( DDR_REG_BASE + 0x900ac*4+0x02000000,0xa); +reg_write( DDR_REG_BASE + 0x900ad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x900ae*4+0x02000000,0x7c8); +reg_write( DDR_REG_BASE + 0x900af*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x900b0*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x900b1*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x900b2*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x900b3*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x900b4*4+0x02000000,0x2a8); +reg_write( DDR_REG_BASE + 0x900b5*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x900b6*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x900b7*4+0x02000000,0x370); +reg_write( DDR_REG_BASE + 0x900b8*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x900b9*4+0x02000000,0xa); +reg_write( DDR_REG_BASE + 0x900ba*4+0x02000000,0x3c8); +reg_write( DDR_REG_BASE + 0x900bb*4+0x02000000,0x1a9); +reg_write( DDR_REG_BASE + 0x900bc*4+0x02000000,0xc); +reg_write( DDR_REG_BASE + 0x900bd*4+0x02000000,0x408); +reg_write( DDR_REG_BASE + 0x900be*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x900bf*4+0x02000000,0x3e); +reg_write( DDR_REG_BASE + 0x900c0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x900c1*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x900c2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x900c3*4+0x02000000,0x408); +reg_write( DDR_REG_BASE + 0x900c4*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x900c5*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x900c6*4+0x02000000,0x8568); +reg_write( DDR_REG_BASE + 0x900c7*4+0x02000000,0x108); +reg_write( DDR_REG_BASE + 0x900c8*4+0x02000000,0x28); +reg_write( DDR_REG_BASE + 0x900c9*4+0x02000000,0x790); +reg_write( DDR_REG_BASE + 0x900ca*4+0x02000000,0x16a); +reg_write( DDR_REG_BASE + 0x900cb*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x900cc*4+0x02000000,0x1d8); +reg_write( DDR_REG_BASE + 0x900cd*4+0x02000000,0x169); +reg_write( DDR_REG_BASE + 0x900ce*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x900cf*4+0x02000000,0x8558); +reg_write( DDR_REG_BASE + 0x900d0*4+0x02000000,0x168); +reg_write( DDR_REG_BASE + 0x900d1*4+0x02000000,0x70); +reg_write( DDR_REG_BASE + 0x900d2*4+0x02000000,0x788); +reg_write( DDR_REG_BASE + 0x900d3*4+0x02000000,0x16a); +reg_write( DDR_REG_BASE + 0x900d4*4+0x02000000,0x1ff8); +reg_write( DDR_REG_BASE + 0x900d5*4+0x02000000,0x85a8); +reg_write( DDR_REG_BASE + 0x900d6*4+0x02000000,0x1e8); +reg_write( DDR_REG_BASE + 0x900d7*4+0x02000000,0x28); +reg_write( DDR_REG_BASE + 0x900d8*4+0x02000000,0x798); +reg_write( DDR_REG_BASE + 0x900d9*4+0x02000000,0x16a); +reg_write( DDR_REG_BASE + 0x900da*4+0x02000000,0x38); +reg_write( DDR_REG_BASE + 0x900db*4+0x02000000,0x7a0); +reg_write( DDR_REG_BASE + 0x900dc*4+0x02000000,0x16a); +reg_write( DDR_REG_BASE + 0x900dd*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x900de*4+0x02000000,0x8310); +reg_write( DDR_REG_BASE + 0x900df*4+0x02000000,0x168); +reg_write( DDR_REG_BASE + 0x900e0*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x900e1*4+0x02000000,0xa310); +reg_write( DDR_REG_BASE + 0x900e2*4+0x02000000,0x168); +reg_write( DDR_REG_BASE + 0x900e3*4+0x02000000,0xa); +reg_write( DDR_REG_BASE + 0x900e4*4+0x02000000,0x408); +reg_write( DDR_REG_BASE + 0x900e5*4+0x02000000,0x169); +reg_write( DDR_REG_BASE + 0x900e6*4+0x02000000,0x55); +reg_write( DDR_REG_BASE + 0x900e7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x900e8*4+0x02000000,0x68); +reg_write( DDR_REG_BASE + 0x900e9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x900ea*4+0x02000000,0x408); +reg_write( DDR_REG_BASE + 0x900eb*4+0x02000000,0x169); +reg_write( DDR_REG_BASE + 0x900ec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x900ed*4+0x02000000,0x8310); +reg_write( DDR_REG_BASE + 0x900ee*4+0x02000000,0x168); +reg_write( DDR_REG_BASE + 0x900ef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x900f0*4+0x02000000,0xa310); +reg_write( DDR_REG_BASE + 0x900f1*4+0x02000000,0x168); +reg_write( DDR_REG_BASE + 0x900f2*4+0x02000000,0x1ff8); +reg_write( DDR_REG_BASE + 0x900f3*4+0x02000000,0x85a8); +reg_write( DDR_REG_BASE + 0x900f4*4+0x02000000,0x1e8); +reg_write( DDR_REG_BASE + 0x900f5*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x900f6*4+0x02000000,0x798); +reg_write( DDR_REG_BASE + 0x900f7*4+0x02000000,0x16a); +reg_write( DDR_REG_BASE + 0x900f8*4+0x02000000,0x50); +reg_write( DDR_REG_BASE + 0x900f9*4+0x02000000,0x7a0); +reg_write( DDR_REG_BASE + 0x900fa*4+0x02000000,0x16a); +reg_write( DDR_REG_BASE + 0x900fb*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x900fc*4+0x02000000,0x790); +reg_write( DDR_REG_BASE + 0x900fd*4+0x02000000,0x16a); +reg_write( DDR_REG_BASE + 0x900fe*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x900ff*4+0x02000000,0x8b10); +reg_write( DDR_REG_BASE + 0x90100*4+0x02000000,0x168); +reg_write( DDR_REG_BASE + 0x90101*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x90102*4+0x02000000,0xab10); +reg_write( DDR_REG_BASE + 0x90103*4+0x02000000,0x168); +reg_write( DDR_REG_BASE + 0x90104*4+0x02000000,0xa); +reg_write( DDR_REG_BASE + 0x90105*4+0x02000000,0x408); +reg_write( DDR_REG_BASE + 0x90106*4+0x02000000,0x169); +reg_write( DDR_REG_BASE + 0x90107*4+0x02000000,0x55); +reg_write( DDR_REG_BASE + 0x90108*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x90109*4+0x02000000,0x68); +reg_write( DDR_REG_BASE + 0x9010a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x9010b*4+0x02000000,0x408); +reg_write( DDR_REG_BASE + 0x9010c*4+0x02000000,0x169); +reg_write( DDR_REG_BASE + 0x9010d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x9010e*4+0x02000000,0x8b10); +reg_write( DDR_REG_BASE + 0x9010f*4+0x02000000,0x168); +reg_write( DDR_REG_BASE + 0x90110*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x90111*4+0x02000000,0xab10); +reg_write( DDR_REG_BASE + 0x90112*4+0x02000000,0x168); +reg_write( DDR_REG_BASE + 0x90113*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x90114*4+0x02000000,0x1d8); +reg_write( DDR_REG_BASE + 0x90115*4+0x02000000,0x169); +reg_write( DDR_REG_BASE + 0x90116*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x90117*4+0x02000000,0x8568); +reg_write( DDR_REG_BASE + 0x90118*4+0x02000000,0x108); +reg_write( DDR_REG_BASE + 0x90119*4+0x02000000,0xa); +reg_write( DDR_REG_BASE + 0x9011a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x9011b*4+0x02000000,0x189); +reg_write( DDR_REG_BASE + 0x9011c*4+0x02000000,0x58); +reg_write( DDR_REG_BASE + 0x9011d*4+0x02000000,0x790); +reg_write( DDR_REG_BASE + 0x9011e*4+0x02000000,0x10a); +reg_write( DDR_REG_BASE + 0x9011f*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x90120*4+0x02000000,0x408); +reg_write( DDR_REG_BASE + 0x90121*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x90122*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x90123*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x90124*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x90125*4+0x02000000,0x2); +reg_write( DDR_REG_BASE + 0x90126*4+0x02000000,0x408); +reg_write( DDR_REG_BASE + 0x90127*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x90128*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x90129*4+0x02000000,0x8558); +reg_write( DDR_REG_BASE + 0x9012a*4+0x02000000,0x168); +reg_write( DDR_REG_BASE + 0x9012b*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x9012c*4+0x02000000,0x3c8); +reg_write( DDR_REG_BASE + 0x9012d*4+0x02000000,0x1a9); +reg_write( DDR_REG_BASE + 0x9012e*4+0x02000000,0x3); +reg_write( DDR_REG_BASE + 0x9012f*4+0x02000000,0x370); +reg_write( DDR_REG_BASE + 0x90130*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x90131*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x90132*4+0x02000000,0x2a8); +reg_write( DDR_REG_BASE + 0x90133*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x90134*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x90135*4+0x02000000,0xe8); +reg_write( DDR_REG_BASE + 0x90136*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x90137*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x90138*4+0x02000000,0x8140); +reg_write( DDR_REG_BASE + 0x90139*4+0x02000000,0x10c); +reg_write( DDR_REG_BASE + 0x9013a*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x9013b*4+0x02000000,0x8138); +reg_write( DDR_REG_BASE + 0x9013c*4+0x02000000,0x104); +reg_write( DDR_REG_BASE + 0x9013d*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x9013e*4+0x02000000,0x448); +reg_write( DDR_REG_BASE + 0x9013f*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x90140*4+0x02000000,0xf); +reg_write( DDR_REG_BASE + 0x90141*4+0x02000000,0x7c0); +reg_write( DDR_REG_BASE + 0x90142*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x90143*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x90144*4+0x02000000,0xe8); +reg_write( DDR_REG_BASE + 0x90145*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x90146*4+0x02000000,0x47); +reg_write( DDR_REG_BASE + 0x90147*4+0x02000000,0x630); +reg_write( DDR_REG_BASE + 0x90148*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x90149*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x9014a*4+0x02000000,0x618); +reg_write( DDR_REG_BASE + 0x9014b*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x9014c*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x9014d*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x9014e*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x9014f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x90150*4+0x02000000,0x7c8); +reg_write( DDR_REG_BASE + 0x90151*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x90152*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x90153*4+0x02000000,0x8140); +reg_write( DDR_REG_BASE + 0x90154*4+0x02000000,0x10c); +reg_write( DDR_REG_BASE + 0x90155*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x90156*4+0x02000000,0x478); +reg_write( DDR_REG_BASE + 0x90157*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x90158*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x90159*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x9015a*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x9015b*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x9015c*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x9015d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x90006*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x90007*4+0x02000000,0x7c8); +reg_write( DDR_REG_BASE + 0x90008*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x90009*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x9000a*4+0x02000000,0x400); +reg_write( DDR_REG_BASE + 0x9000b*4+0x02000000,0x106); +reg_write( DDR_REG_BASE + 0xd00e7*4+0x02000000,0x400); +reg_write( DDR_REG_BASE + 0x90017*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x9001f*4+0x02000000,0x29); +reg_write( DDR_REG_BASE + 0x90026*4+0x02000000,0x5c); +reg_write( DDR_REG_BASE + 0x400d0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x400d1*4+0x02000000,0x101); +reg_write( DDR_REG_BASE + 0x400d2*4+0x02000000,0x105); +reg_write( DDR_REG_BASE + 0x400d3*4+0x02000000,0x107); +reg_write( DDR_REG_BASE + 0x400d4*4+0x02000000,0x10f); +reg_write( DDR_REG_BASE + 0x400d5*4+0x02000000,0x202); +reg_write( DDR_REG_BASE + 0x400d6*4+0x02000000,0x20a); +reg_write( DDR_REG_BASE + 0x400d7*4+0x02000000,0x20b); +reg_write( DDR_REG_BASE + 0x2000b*4+0x02000000,0x32); +reg_write( DDR_REG_BASE + 0x2000c*4+0x02000000,0x64); +reg_write( DDR_REG_BASE + 0x2000d*4+0x02000000,0x3e8); +reg_write( DDR_REG_BASE + 0x2000e*4+0x02000000,0x2c); +reg_write( DDR_REG_BASE + 0x9000c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x9000d*4+0x02000000,0x173); +reg_write( DDR_REG_BASE + 0x9000e*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x9000f*4+0x02000000,0x6110); +reg_write( DDR_REG_BASE + 0x90010*4+0x02000000,0x2152); +reg_write( DDR_REG_BASE + 0x90011*4+0x02000000,0xdfbd); +reg_write( DDR_REG_BASE + 0x90012*4+0x02000000,0x2060); +reg_write( DDR_REG_BASE + 0x90013*4+0x02000000,0x6152); +reg_write( DDR_REG_BASE + 0x20010*4+0x02000000,0x5a); +reg_write( DDR_REG_BASE + 0x20011*4+0x02000000,0x3); +reg_write( DDR_REG_BASE + 0x40080*4+0x02000000,0xb0); +//iteration +//DRAM DQ ODT +//(default: DQ odt disable) -> 0 +//(ODT:60) -> 0x14 +//(ODT:120) -> 0x18 +//(ODT:240) -> 0x1c +reg_write( DDR_REG_BASE + 0x40081*4+0x02000000,0x18); +reg_write( DDR_REG_BASE + 0x40082*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x40083*4+0x02000000,0x10c); +reg_write( DDR_REG_BASE + 0x40084*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x40085*4+0x02000000,0x68); +reg_write( DDR_REG_BASE + 0x40086*4+0x02000000,0x30); +//iteration +// DSEL 34.3 -> 0x04 +// DSEL 40 -> 0x08 +// DSEL 48 -> 0x0c +// DSEL 60 -> 0x10 +// DSEL 80 -> 0x18 +//reg_write( DDR_REG_BASE + 0x40087*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x40087*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x400fd*4+0x02000000,0xf); +reg_write( DDR_REG_BASE + 0x10011*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x10012*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x10013*4+0x02000000,0x80); +reg_write( DDR_REG_BASE + 0x10018*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x10002*4+0x02000000,0x6209); +reg_write( DDR_REG_BASE + 0x100b2*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x101b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x102b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x103b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x104b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x105b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x106b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x107b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x108b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x400e0*4+0x02000000,0xf); +reg_write( DDR_REG_BASE + 0x11011*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x11012*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x11013*4+0x02000000,0x80); +reg_write( DDR_REG_BASE + 0x11018*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x11002*4+0x02000000,0x6209); +reg_write( DDR_REG_BASE + 0x110b2*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x111b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x112b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x113b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x114b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x115b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x116b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x117b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x118b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x400e1*4+0x02000000,0xf); +reg_write( DDR_REG_BASE + 0x12011*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x12012*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x12013*4+0x02000000,0x80); +reg_write( DDR_REG_BASE + 0x12018*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x12002*4+0x02000000,0x6209); +reg_write( DDR_REG_BASE + 0x120b2*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x121b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x122b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x123b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x124b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x125b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x126b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x127b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x128b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x400e2*4+0x02000000,0xff); +reg_write( DDR_REG_BASE + 0x13011*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x13012*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x13013*4+0x02000000,0x80); +reg_write( DDR_REG_BASE + 0x13018*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x13002*4+0x02000000,0x6209); +reg_write( DDR_REG_BASE + 0x130b2*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x131b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x132b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x133b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x134b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x135b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x136b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x137b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x138b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x400e3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x20089*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x20088*4+0x02000000,0x19); +reg_write( DDR_REG_BASE + 0xc0080*4+0x02000000,0x2); +reg_write( DDR_REG_BASE + 0xd0000*4+0x02000000,0x1); + +reg_write( DDR_REG_BASE + 0x000d0000*4+0x02000000 , 0x00000000 ); +reg_read ( DDR_REG_BASE + 0x00020010*4+0x02000000 , data ); +reg_write( DDR_REG_BASE + 0x00020010*4+0x02000000 , 0x0000006a ); +reg_write( DDR_REG_BASE + 0x00020010*4+0x02000000 , 0x0000006a ); +reg_read ( DDR_REG_BASE + 0x0002001d*4+0x02000000 , data ); +reg_write( DDR_REG_BASE + 0x0002001d*4+0x02000000 , 0x00000001 ); +reg_read ( DDR_REG_BASE + 0x00020097*4+0x02000000 , data ); + + + + +//////////////////////////dangdalong/////////////////////////////// + + + +reg_write( DDR_REG_BASE + 0x000001b0 , 0x00000020 ); + + +reg_read (DDR_REG_BASE + 0x000001bc , data ); +while((data&0x1) !=0x1){ + reg_read (DDR_REG_BASE + 0x000001bc , data ); +} + + +reg_write( DDR_REG_BASE + 0x000001b0 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000001b0 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x00000030 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00000030 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00000320 , 0x00000001 ); + + + + reg_read (DDR_REG_BASE + 0x00000324 , data ); + while((data&0x1) !=0x1){ + reg_read (DDR_REG_BASE + 0x00000324 , data ); + } + +reg_read (DDR_REG_BASE + 0x00000004 , data ); + while((data&0x1) !=0x1){ + reg_read (DDR_REG_BASE + 0x00000004 , data ); + } + + + + +reg_write( DDR_REG_BASE + 0x000001c4 , 0x85000000 ); +reg_write( DDR_REG_BASE + 0x00000320 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000000d0 , 0x00020002 ); +reg_write( DDR_REG_BASE + 0x00000320 , 0x00000001 ); + + + reg_read (DDR_REG_BASE + 0x00000324 , data ); + while((data&0x1) !=0x1){ + reg_read (DDR_REG_BASE + 0x00000324 , data ); + } + + + +reg_write( DDR_REG_BASE + 0x00000304 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00000030 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00000030 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00000490 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x00000540 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000005f0 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000006a0 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x00000750 , 0x00000001 ); + +reg_write( DDR_REG_BASE + 0x00000060 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00000050 , 0x98210000 ); +} diff --git a/src/little/uboot/board/canaan/k230_canmv_01studio/canmv_01studio_ddr_init_2133.c b/src/little/uboot/board/canaan/k230_canmv_01studio/canmv_01studio_ddr_init_2133.c new file mode 100755 index 000000000..0a2ee52e7 --- /dev/null +++ b/src/little/uboot/board/canaan/k230_canmv_01studio/canmv_01studio_ddr_init_2133.c @@ -0,0 +1,18402 @@ +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include +#include +//#include +//#include +#include +#define DDR_REG_BASE 0x98000000 + +#define reg_write( addr,v) \ + { \ + (*(volatile uint32_t *)((size_t)(addr))) = (v); \ + } + + +#define reg_read( addr,v) \ + { \ + v =readl ((const volatile void __iomem *) addr ); \ + } + +void canmv_01studio_ddr_init_2133(void) +{ +int data; +int train_data=0; + +reg_write( DDR_REG_BASE + 0x00000304 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x00000030 , 0x00000001 ); +reg_read ( DDR_REG_BASE + 0x00000004 , data); +reg_write( DDR_REG_BASE + 0x00000000 , 0x01040008 ); +reg_write( DDR_REG_BASE + 0x00000010 , 0x0000e030 ); +reg_write( DDR_REG_BASE + 0x00000014 , 0x00007563 ); +reg_write( DDR_REG_BASE + 0x00000020 , 0x00001100 ); +reg_write( DDR_REG_BASE + 0x00000024 , 0xb4b04b13 ); +reg_write( DDR_REG_BASE + 0x00000028 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x0000002c , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00000030 , 0x00000020 ); +reg_write( DDR_REG_BASE + 0x00000034 , 0x00405f04 ); +reg_write( DDR_REG_BASE + 0x00000038 , 0x00a80002 ); +reg_write( DDR_REG_BASE + 0x0000003c , 0x00010050 ); +reg_write( DDR_REG_BASE + 0x00000050 , 0x90210000 ); +reg_write( DDR_REG_BASE + 0x00000054 , 0x003b0035 ); +reg_write( DDR_REG_BASE + 0x00000060 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x00000064 , 0x00400046 ); +reg_write( DDR_REG_BASE + 0x00000068 , 0x005b0000 ); +reg_write( DDR_REG_BASE + 0x000000c0 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000000d0 , 0xc0020002 ); +reg_write( DDR_REG_BASE + 0x000000d4 , 0x00010002 ); +reg_write( DDR_REG_BASE + 0x000000d8 , 0x00001200 ); +reg_write( DDR_REG_BASE + 0x000000dc , 0x00c3001e ); +reg_write( DDR_REG_BASE + 0x000000e0 , 0x00020000 ); +reg_write( DDR_REG_BASE + 0x000000e4 , 0x00120007 ); +reg_write( DDR_REG_BASE + 0x000000e8 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000000ec , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000000f0 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000000f4 , 0x0000023f ); +reg_write( DDR_REG_BASE + 0x000000f8 , 0x00000002 ); +reg_write( DDR_REG_BASE + 0x00000100 , 0x0e1b2316 ); +reg_write( DDR_REG_BASE + 0x00000104 , 0x00040422 ); +reg_write( DDR_REG_BASE + 0x00000108 , 0x04080a0b ); +reg_write( DDR_REG_BASE + 0x0000010c , 0x00508006 ); +reg_write( DDR_REG_BASE + 0x00000110 , 0x0a02060b ); +reg_write( DDR_REG_BASE + 0x00000114 , 0x01010808 ); +reg_write( DDR_REG_BASE + 0x00000118 , 0x01010005 ); +reg_write( DDR_REG_BASE + 0x0000011c , 0x00000101 ); +reg_write( DDR_REG_BASE + 0x00000120 , 0x00000101 ); +reg_write( DDR_REG_BASE + 0x00000130 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00000134 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00000138 , 0x0000004b ); +reg_write( DDR_REG_BASE + 0x0000013c , 0x80000000 ); +reg_write( DDR_REG_BASE + 0x00000144 , 0x00000094 ); +reg_write( DDR_REG_BASE + 0x00000180 , 0xe0c00030 ); +reg_write( DDR_REG_BASE + 0x00000184 , 0x01b0c892 ); +reg_write( DDR_REG_BASE + 0x00000188 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00000190 , 0x038b8204 ); +reg_write( DDR_REG_BASE + 0x00000194 , 0x00070202 ); +reg_write( DDR_REG_BASE + 0x00000198 , 0x07a09110 ); +reg_write( DDR_REG_BASE + 0x000001a0 , 0xa0400018 ); +reg_write( DDR_REG_BASE + 0x000001a4 , 0x00760085 ); +reg_write( DDR_REG_BASE + 0x000001a8 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000001b0 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000001b4 , 0x00000b04 ); +reg_write( DDR_REG_BASE + 0x000001c0 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000001c4 , 0x85000000 ); +#if 0 +reg_write( DDR_REG_BASE + 0x00000200 , 0x0000001f ); +reg_write( DDR_REG_BASE + 0x00000204 , 0x00090909 ); +reg_write( DDR_REG_BASE + 0x00000208 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x0000020c , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00000210 , 0x00001f00 ); +reg_write( DDR_REG_BASE + 0x00000214 , 0x080f0808 ); +reg_write( DDR_REG_BASE + 0x00000218 , 0x0f0f0808 ); +reg_write( DDR_REG_BASE + 0x0000021c , 0x00000f0f ); +reg_write( DDR_REG_BASE + 0x00000224 , 0x08080808 ); +reg_write( DDR_REG_BASE + 0x00000228 , 0x08080808 ); +reg_write( DDR_REG_BASE + 0x0000022c , 0x00000008 ); +#else +reg_write( DDR_REG_BASE + 0x00000200 , 0x0000001f ); +reg_write( DDR_REG_BASE + 0x00000204 , 0x00080808 ); +reg_write( DDR_REG_BASE + 0x00000208 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x0000020c , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00000210 , 0x00001f1f ); +reg_write( DDR_REG_BASE + 0x00000214 , 0x070f0707 ); +reg_write( DDR_REG_BASE + 0x00000218 , 0x0f0f0707 ); +reg_write( DDR_REG_BASE + 0x0000021c , 0x00000f0f ); +reg_write( DDR_REG_BASE + 0x00000224 , 0x07070707 ); +reg_write( DDR_REG_BASE + 0x00000228 , 0x07070707 ); +reg_write( DDR_REG_BASE + 0x0000022c , 0x00000007 ); +#endif +reg_write( DDR_REG_BASE + 0x00000240 , 0x06040a30 ); +reg_write( DDR_REG_BASE + 0x00000244 , 0x00002301 ); +reg_write( DDR_REG_BASE + 0x00000250 , 0x80c31f18 ); +reg_write( DDR_REG_BASE + 0x00000254 , 0x00002000 ); +reg_write( DDR_REG_BASE + 0x0000025c , 0x0f000001 ); +reg_write( DDR_REG_BASE + 0x00000264 , 0x0f00007f ); +reg_write( DDR_REG_BASE + 0x0000026c , 0x0f00007f ); +reg_write( DDR_REG_BASE + 0x00000270 , 0x04040208 ); +reg_write( DDR_REG_BASE + 0x00000274 , 0x08400810 ); +reg_write( DDR_REG_BASE + 0x00000300 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00000304 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x0000030c , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00000320 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x00000328 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x0000036c , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00000490 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x00000540 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000005f0 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000006a0 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x00000750 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x00002020 , 0x00001100 ); +reg_write( DDR_REG_BASE + 0x00002024 , 0xb4b04b13 ); +reg_write( DDR_REG_BASE + 0x00002034 , 0x00405f04 ); +reg_write( DDR_REG_BASE + 0x00002050 , 0x30210000 ); +reg_write( DDR_REG_BASE + 0x00002064 , 0x00400046 ); +reg_write( DDR_REG_BASE + 0x00002068 , 0x005b0000 ); +reg_write( DDR_REG_BASE + 0x000020dc , 0x00c3001e ); +reg_write( DDR_REG_BASE + 0x000020e0 , 0x00020000 ); +reg_write( DDR_REG_BASE + 0x000020e8 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000020ec , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000020f4 , 0x0000023f ); +reg_write( DDR_REG_BASE + 0x000020f8 , 0x00000002 ); +reg_write( DDR_REG_BASE + 0x00002100 , 0x0e1b2316 ); +reg_write( DDR_REG_BASE + 0x00002104 , 0x00040422 ); +reg_write( DDR_REG_BASE + 0x00002108 , 0x04080a0b ); +reg_write( DDR_REG_BASE + 0x0000210c , 0x00508006 ); +reg_write( DDR_REG_BASE + 0x00002110 , 0x0a02060b ); +reg_write( DDR_REG_BASE + 0x00002114 , 0x01010808 ); +reg_write( DDR_REG_BASE + 0x00002118 , 0x01010005 ); +reg_write( DDR_REG_BASE + 0x0000211c , 0x00000101 ); +reg_write( DDR_REG_BASE + 0x00002120 , 0x00000101 ); +reg_write( DDR_REG_BASE + 0x00002130 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00002134 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00002138 , 0x0000004b ); +reg_write( DDR_REG_BASE + 0x0000213c , 0x80000000 ); +reg_write( DDR_REG_BASE + 0x00002144 , 0x00000094 ); +reg_write( DDR_REG_BASE + 0x00002180 , 0xe0c00030 ); +reg_write( DDR_REG_BASE + 0x00002190 , 0x038b8204 ); +reg_write( DDR_REG_BASE + 0x00002194 , 0x00070202 ); +reg_write( DDR_REG_BASE + 0x000021b4 , 0x00000b04 ); +reg_write( DDR_REG_BASE + 0x00002240 , 0x06040a30 ); +reg_write( DDR_REG_BASE + 0x00003020 , 0x00001100 ); +reg_write( DDR_REG_BASE + 0x00003024 , 0xb4b04b13 ); +reg_write( DDR_REG_BASE + 0x00003034 , 0x00405f04 ); +reg_write( DDR_REG_BASE + 0x00003050 , 0xc0210000 ); +reg_write( DDR_REG_BASE + 0x00003064 , 0x00400046 ); +reg_write( DDR_REG_BASE + 0x00003068 , 0x005b0000 ); +reg_write( DDR_REG_BASE + 0x000030dc , 0x00c3001e ); +reg_write( DDR_REG_BASE + 0x000030e0 , 0x00020000 ); +reg_write( DDR_REG_BASE + 0x000030e8 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000030ec , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000030f4 , 0x0000023f ); +reg_write( DDR_REG_BASE + 0x000030f8 , 0x00000002 ); +reg_write( DDR_REG_BASE + 0x00003100 , 0x0e1b2316 ); +reg_write( DDR_REG_BASE + 0x00003104 , 0x00040422 ); +reg_write( DDR_REG_BASE + 0x00003108 , 0x04080a0b ); +reg_write( DDR_REG_BASE + 0x0000310c , 0x00508006 ); +reg_write( DDR_REG_BASE + 0x00003110 , 0x0a02060b ); +reg_write( DDR_REG_BASE + 0x00003114 , 0x01010808 ); +reg_write( DDR_REG_BASE + 0x00003118 , 0x01010005 ); +reg_write( DDR_REG_BASE + 0x0000311c , 0x00000101 ); +reg_write( DDR_REG_BASE + 0x00003120 , 0x00000101 ); +reg_write( DDR_REG_BASE + 0x00003130 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00003134 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00003138 , 0x0000004b ); +reg_write( DDR_REG_BASE + 0x0000313c , 0x80000000 ); +reg_write( DDR_REG_BASE + 0x00003144 , 0x00000094 ); +reg_write( DDR_REG_BASE + 0x00003180 , 0xe0c00030 ); +reg_write( DDR_REG_BASE + 0x00003190 , 0x038b8204 ); +reg_write( DDR_REG_BASE + 0x00003194 , 0x00070202 ); +reg_write( DDR_REG_BASE + 0x000031b4 , 0x00000b04 ); +reg_write( DDR_REG_BASE + 0x00003240 , 0x06040a30 ); +reg_write( DDR_REG_BASE + 0x00004020 , 0x00001100 ); +reg_write( DDR_REG_BASE + 0x00004024 , 0xb4b04b13 ); +reg_write( DDR_REG_BASE + 0x00004034 , 0x00405f04 ); +reg_write( DDR_REG_BASE + 0x00004050 , 0xa8210000 ); +reg_write( DDR_REG_BASE + 0x00004064 , 0x00408046 ); +reg_write( DDR_REG_BASE + 0x00004068 , 0x005b0000 ); +reg_write( DDR_REG_BASE + 0x000040dc , 0x00c3001e ); +reg_write( DDR_REG_BASE + 0x000040e0 , 0x00020000 ); +reg_write( DDR_REG_BASE + 0x000040e8 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000040ec , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000040f4 , 0x0000023f ); +reg_write( DDR_REG_BASE + 0x000040f8 , 0x00000002 ); +reg_write( DDR_REG_BASE + 0x00004100 , 0x0e1b2316 ); +reg_write( DDR_REG_BASE + 0x00004104 , 0x00040422 ); +reg_write( DDR_REG_BASE + 0x00004108 , 0x04080a0b ); +reg_write( DDR_REG_BASE + 0x0000410c , 0x00508006 ); +reg_write( DDR_REG_BASE + 0x00004110 , 0x0a02060b ); +reg_write( DDR_REG_BASE + 0x00004114 , 0x01010808 ); +reg_write( DDR_REG_BASE + 0x00004118 , 0x01010005 ); +reg_write( DDR_REG_BASE + 0x0000411c , 0x00000101 ); +reg_write( DDR_REG_BASE + 0x00004120 , 0x00000101 ); +reg_write( DDR_REG_BASE + 0x00004130 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00004134 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00004138 , 0x0000004b ); +reg_write( DDR_REG_BASE + 0x0000413c , 0x80000000 ); +reg_write( DDR_REG_BASE + 0x00004144 , 0x00000094 ); +reg_write( DDR_REG_BASE + 0x00004180 , 0xe0c00030 ); +reg_write( DDR_REG_BASE + 0x00004190 , 0x038b8204 ); +reg_write( DDR_REG_BASE + 0x00004194 , 0x00070202 ); +reg_write( DDR_REG_BASE + 0x000041b4 , 0x00000b04 ); +reg_write( DDR_REG_BASE + 0x00004240 , 0x06040a30 ); +reg_read ( DDR_REG_BASE + 0x00000060 , data ); +reg_write( DDR_REG_BASE + 0x00000400 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00000404 , 0x0000400f ); +reg_write( DDR_REG_BASE + 0x000004b4 , 0x0000400f ); +reg_write( DDR_REG_BASE + 0x00000564 , 0x0000400f ); +reg_write( DDR_REG_BASE + 0x00000614 , 0x0000400f ); +reg_write( DDR_REG_BASE + 0x000006c4 , 0x0000400f ); +reg_write( DDR_REG_BASE + 0x00000404 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x000004b4 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x00000564 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x00000614 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x000006c4 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x00000404 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x000004b4 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x00000564 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x00000614 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x000006c4 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x00000404 , 0x0000100f ); +reg_write( DDR_REG_BASE + 0x000004b4 , 0x0000100f ); +reg_write( DDR_REG_BASE + 0x00000564 , 0x0000100f ); +reg_write( DDR_REG_BASE + 0x00000614 , 0x0000100f ); +reg_write( DDR_REG_BASE + 0x000006c4 , 0x0000100f ); +reg_write( DDR_REG_BASE + 0x00000408 , 0x0000400f ); +reg_write( DDR_REG_BASE + 0x000004b8 , 0x0000400f ); +reg_write( DDR_REG_BASE + 0x00000568 , 0x0000400f ); +reg_write( DDR_REG_BASE + 0x00000618 , 0x0000400f ); +reg_write( DDR_REG_BASE + 0x000006c8 , 0x0000400f ); +reg_write( DDR_REG_BASE + 0x00000408 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x000004b8 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x00000568 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x00000618 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x000006c8 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x00000408 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x000004b8 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x00000568 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x00000618 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x000006c8 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x00000408 , 0x0000100f ); +reg_write( DDR_REG_BASE + 0x000004b8 , 0x0000100f ); +reg_write( DDR_REG_BASE + 0x00000568 , 0x0000100f ); +reg_write( DDR_REG_BASE + 0x00000618 , 0x0000100f ); +reg_write( DDR_REG_BASE + 0x000006c8 , 0x0000100f ); +reg_read ( DDR_REG_BASE + 0x00000030 , data ); +reg_write( DDR_REG_BASE + 0x00000030 , 0x00000020 ); +//////////////////////////////////////////////////////// + + reg_read ( 0x9110309c, data ); + data=data|0x00020000; + reg_write ( 0x9110309c, data ); + + + +reg_write( DDR_REG_BASE + 0x00000304 , 0x00000000 ); +reg_read ( DDR_REG_BASE + 0x00000030 , data); +reg_write( DDR_REG_BASE + 0x00000030 , 0x00000020 ); +reg_read ( DDR_REG_BASE + 0x00000030 , data ); +reg_write( DDR_REG_BASE + 0x00000030 , 0x00000020 ); +reg_read ( DDR_REG_BASE + 0x000001c4 , data ); +reg_write( DDR_REG_BASE + 0x000001c4 , 0x85000000 ); +reg_write( DDR_REG_BASE + 0x00000320 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000001b0 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000001b0 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00000304 , 0x00000002 ); +reg_read ( DDR_REG_BASE + 0x000000d0 , data ); +reg_read ( DDR_REG_BASE + 0x000001c0 , data ); +reg_read ( DDR_REG_BASE + 0x00000000 , data ); +reg_read ( DDR_REG_BASE + 0x000000dc , data ); +reg_read ( DDR_REG_BASE + 0x000000dc , data ); +reg_read ( DDR_REG_BASE + 0x000000e0 , data ); +reg_read ( DDR_REG_BASE + 0x000000d0 , data ); +reg_read ( DDR_REG_BASE + 0x000001c0 , data ); +reg_read ( DDR_REG_BASE + 0x00000000 , data ); +reg_read ( DDR_REG_BASE + 0x000000dc , data ); +reg_read ( DDR_REG_BASE + 0x000000dc , data ); +reg_read ( DDR_REG_BASE + 0x000000e0 , data ); +reg_read ( DDR_REG_BASE + 0x000000d0 , data ); + + + + +reg_write( DDR_REG_BASE + 0x0001005f*4 +0x02000000 , 0x000002ff ); +reg_write( DDR_REG_BASE + 0x0001015f*4 +0x02000000 , 0x000002ff ); +reg_write( DDR_REG_BASE + 0x0001105f*4 +0x02000000 , 0x000002ff ); +reg_write( DDR_REG_BASE + 0x0001115f*4 +0x02000000 , 0x000002ff ); +reg_write( DDR_REG_BASE + 0x0001205f*4 +0x02000000 , 0x000002ff ); +reg_write( DDR_REG_BASE + 0x0001215f*4 +0x02000000 , 0x000002ff ); +reg_write( DDR_REG_BASE + 0x0001305f*4 +0x02000000 , 0x000002ff ); +reg_write( DDR_REG_BASE + 0x0001315f*4 +0x02000000 , 0x000002ff ); +reg_write( DDR_REG_BASE + 0x00000055*4 +0x02000000 , 0x000003ff ); +reg_write( DDR_REG_BASE + 0x00001055*4 +0x02000000 , 0x000000ff ); +reg_write( DDR_REG_BASE + 0x00002055*4 +0x02000000 , 0x000003ff ); +reg_write( DDR_REG_BASE + 0x00003055*4 +0x02000000 , 0x000003ff ); +reg_write( DDR_REG_BASE + 0x00004055*4 +0x02000000 , 0x000003ff ); +reg_write( DDR_REG_BASE + 0x00005055*4 +0x02000000 , 0x000003ff ); +reg_write( DDR_REG_BASE + 0x00006055*4 +0x02000000 , 0x000000ff ); +reg_write( DDR_REG_BASE + 0x00007055*4 +0x02000000 , 0x000003ff ); +reg_write( DDR_REG_BASE + 0x00008055*4 +0x02000000 , 0x000003ff ); +reg_write( DDR_REG_BASE + 0x00009055*4 +0x02000000 , 0x000003ff ); +reg_write( DDR_REG_BASE + 0x000200c5*4 +0x02000000 , 0x0000000a ); +reg_write( DDR_REG_BASE + 0x0002002e*4 +0x02000000 , 0x00000002 ); +reg_write( DDR_REG_BASE + 0x00020024*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x0002003a*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x0002007d*4 +0x02000000 , 0x00000212 ); +reg_write( DDR_REG_BASE + 0x0002007c*4 +0x02000000 , 0x00000061 ); +reg_write( DDR_REG_BASE + 0x00020056*4 +0x02000000 , 0x00000006 ); +//iteration place +//PHY ODT --pull up +//00_1000 0x08 Pullup/Down:120 +//00_1010 0x0a Pullup/Down:80 +//01_1000 0x18 Pullup/Down:60 +//01_1010 0x1a Pullup/Down:48 +//11_1000 0x38 Pullup/Down:40 +//11_1010 0x3a Pullup/Down:34.3 +reg_write( DDR_REG_BASE + 0x0001004d*4 +0x02000000 , 0x00000018 ); +reg_write( DDR_REG_BASE + 0x0001014d*4 +0x02000000 , 0x00000018 ); +reg_write( DDR_REG_BASE + 0x0001104d*4 +0x02000000 , 0x00000018 ); +reg_write( DDR_REG_BASE + 0x0001114d*4 +0x02000000 , 0x00000018 ); +reg_write( DDR_REG_BASE + 0x0001204d*4 +0x02000000 , 0x00000018 ); +reg_write( DDR_REG_BASE + 0x0001214d*4 +0x02000000 , 0x00000018 ); +reg_write( DDR_REG_BASE + 0x0001304d*4 +0x02000000 , 0x00000018 ); +reg_write( DDR_REG_BASE + 0x0001314d*4 +0x02000000 , 0x00000018 ); +// // [phyinit_C_initPhyConfig] Pstate=0, Memclk=800MHz, Programming TxImpedanceCtrl1::DrvStrenFSDqP to 0x18 +// // [phyinit_C_initPhyConfig] Pstate=0, Memclk=800MHz, Programming TxImpedanceCtrl1::DrvStrenFSDqN to 0x18 + +//iteration place +//PHY TX output impedence +//0010_00 00_1000 0x208 Pullup/Down:120 +//0010_10 00_1010 0x28a Pullup/Down:80 +//0110_00 01_1000 0x618 Pullup/Down:60 +//0110_10 01_1010 0x69a Pullup/Down:48 +//1110_00 11_1000 0xe38 Pullup/Down:40 +//1110_10 11_1010 0xeba Pullup/Down:34.3 +reg_write( DDR_REG_BASE + 0x00010049*4 +0x02000000 , 0x00000E38 ); +reg_write( DDR_REG_BASE + 0x00010149*4 +0x02000000 , 0x00000E38 ); +reg_write( DDR_REG_BASE + 0x00011049*4 +0x02000000 , 0x00000E38 ); +reg_write( DDR_REG_BASE + 0x00011149*4 +0x02000000 , 0x00000E38 ); +reg_write( DDR_REG_BASE + 0x00012049*4 +0x02000000 , 0x00000E38 ); +reg_write( DDR_REG_BASE + 0x00012149*4 +0x02000000 , 0x00000E38 ); +reg_write( DDR_REG_BASE + 0x00013049*4 +0x02000000 , 0x00000E38 ); +reg_write( DDR_REG_BASE + 0x00013149*4 +0x02000000 , 0x00000E38 ); +//iteration place +// PHY AC/CLK output impedence +//00000_00000 0x0 120 +//00001_00001 0x21 60 +//00011_00011 0x63 40 +//00111_00111 0xe7 30 +//01111_01111 0x1ef 24 +//11111_11111 0x3ff 20 +// // [phyinit_C_initPhyConfig] Programming ATxImpedance::ADrvStrenP to 0x1 +// // [phyinit_C_initPhyConfig] Programming ATxImpedance::ADrvStrenN to 0x1 +reg_write( DDR_REG_BASE + 0x43 *4+0x02000000,0x63); +reg_write( DDR_REG_BASE + 0x1043 *4+0x02000000,0x63); +reg_write( DDR_REG_BASE + 0x2043 *4+0x02000000,0x63); +reg_write( DDR_REG_BASE + 0x3043 *4+0x02000000,0x63); +reg_write( DDR_REG_BASE + 0x4043 *4+0x02000000,0x63); +reg_write( DDR_REG_BASE + 0x5043 *4+0x02000000,0x63); +reg_write( DDR_REG_BASE + 0x6043 *4+0x02000000,0x63); +reg_write( DDR_REG_BASE + 0x7043 *4+0x02000000,0x63); +reg_write( DDR_REG_BASE + 0x8043 *4+0x02000000,0x63); +reg_write( DDR_REG_BASE + 0x9043 *4+0x02000000,0x63); + +reg_write( DDR_REG_BASE + 0x00020018*4 +0x02000000 , 0x00000005 ); +reg_write( DDR_REG_BASE + 0x00020075*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x00020050*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00020008*4 +0x02000000 , 0x00000215 ); +reg_write( DDR_REG_BASE + 0x00020088*4 +0x02000000 , 0x00000009 ); +//iteration place +//PHY VERF +//INSEL VREFIN ALL Ratio +//---(0.005*X+0.345)VDDQ --- +//0x0 0x51 0x288 75% (GlobalVrefInSel to 0x0) +//0x0 0x41 0x208 67% (GlobalVrefInSel to 0x0) +//---(0.005*(X-1)VDDQ---- +//0x4 0x65 0x32c 50% (GlobalVrefInSel to 0x4) +//0x4 0x33 0x19c 25% (GlobalVrefInSel to 0x4) + + +// // [phyinit_C_initPhyConfig] Pstate=0, Programming VrefInGlobal::GlobalVrefInDAC to 0x51 +// // [phyinit_C_initPhyConfig] Pstate=0, Programming VrefInGlobal to 0x288 + +//reg_write( DDR_REG_BASE + 0x200b2*4+0x02000000,0x32c);//hyg +//reg_write( DDR_REG_BASE + 0x200b2*4+0x02000000,0x208);//hyg +//reg_write( DDR_REG_BASE + 0x200b2*4+0x02000000,0x32C);//hyg +reg_write( DDR_REG_BASE + 0x000200b2*4 +0x02000000 , 0x00000288 ); +reg_write( DDR_REG_BASE + 0x00010043*4 +0x02000000 , 0x000005b1 ); +reg_write( DDR_REG_BASE + 0x00010143*4 +0x02000000 , 0x000005b1 ); +reg_write( DDR_REG_BASE + 0x00011043*4 +0x02000000 , 0x000005b1 ); +reg_write( DDR_REG_BASE + 0x00011143*4 +0x02000000 , 0x000005b1 ); +reg_write( DDR_REG_BASE + 0x00012043*4 +0x02000000 , 0x000005b1 ); +reg_write( DDR_REG_BASE + 0x00012143*4 +0x02000000 , 0x000005b1 ); +reg_write( DDR_REG_BASE + 0x00013043*4 +0x02000000 , 0x000005b1 ); +reg_write( DDR_REG_BASE + 0x00013143*4 +0x02000000 , 0x000005b1 ); +reg_write( DDR_REG_BASE + 0x000200fa*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x00020019*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000200f0*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000200f1*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000200f2*4 +0x02000000 , 0x00004444 ); +reg_write( DDR_REG_BASE + 0x000200f3*4 +0x02000000 , 0x00008888 ); +reg_write( DDR_REG_BASE + 0x000200f4*4 +0x02000000 , 0x00005555 ); +reg_write( DDR_REG_BASE + 0x000200f5*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000200f6*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000200f7*4 +0x02000000 , 0x0000f000 ); +reg_write( DDR_REG_BASE + 0x0001004a*4 +0x02000000 , 0x00000500 ); +reg_write( DDR_REG_BASE + 0x0001104a*4 +0x02000000 , 0x00000500 ); +reg_write( DDR_REG_BASE + 0x0001204a*4 +0x02000000 , 0x00000500 ); +reg_write( DDR_REG_BASE + 0x0001304a*4 +0x02000000 , 0x00000500 ); +reg_write( DDR_REG_BASE + 0x00020025*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x0002002c*4 +0x02000000 , 0x00000000 ); + +reg_write(DDR_REG_BASE + 0x20100*4+0x02000000,0x9); //CA0 +reg_write(DDR_REG_BASE + 0x20101*4+0x02000000,0x8); //CA1 +reg_write(DDR_REG_BASE + 0x20102*4+0x02000000,0x7); //CA2 +reg_write(DDR_REG_BASE + 0x20103*4+0x02000000,0x6); //CA3 +reg_write(DDR_REG_BASE + 0x20104*4+0x02000000,0x5); //CA4 +reg_write(DDR_REG_BASE + 0x20105*4+0x02000000,0x4); //CA5 +reg_write(DDR_REG_BASE + 0x20106*4+0x02000000,0x3); //CA6 +reg_write(DDR_REG_BASE + 0x20107*4+0x02000000,0x2); //CA7 +reg_write(DDR_REG_BASE + 0x20108*4+0x02000000,0x1); //CA8 +reg_write(DDR_REG_BASE + 0x20109*4+0x02000000,0x0); //CA9 + reg_write(DDR_REG_BASE + 0x120a0 * 4 + 0x2000000, 0x0); //lndq =1 dq0()---c17(k230)--dq0 + reg_write(DDR_REG_BASE + 0x120a1 * 4 + 0x2000000, 0x6); //CA1 =0 dq1---b19(k230)---dq6 + reg_write(DDR_REG_BASE + 0x120a2 * 4 + 0x2000000, 0x1); //CA1 =0 dq2--d16-dq1 + reg_write(DDR_REG_BASE + 0x120a3 * 4 + 0x2000000, 0x3); //CA1 =0` dq3--c18-dq3 + reg_write(DDR_REG_BASE + 0x120a4 * 4 + 0x2000000, 0x2); //CA1 =0 dq4--c17--dq2 + reg_write(DDR_REG_BASE + 0x120a5 * 4 + 0x2000000, 0x5); //CA1 =0 dq5--e17-dq5 + reg_write(DDR_REG_BASE + 0x120a6 * 4 + 0x2000000, 0x4); //CA1 =0 dq6--e18--dq4 + reg_write(DDR_REG_BASE + 0x120a7 * 4 + 0x2000000, 0x7); //CA1 =0 dq7--c19--dq7 + + reg_write(DDR_REG_BASE + 0x110a0 * 4 + 0x2000000, 0x0); //lndq =1 dq8_0--r17--dq10_2 + reg_write(DDR_REG_BASE + 0x110a1 * 4 + 0x2000000, 0x1); //CA1 =0 dq9_1--t18--dq12_4 + reg_write(DDR_REG_BASE + 0x110a2 * 4 + 0x2000000, 0x2); //CA1 =0 dq10--R18--dq8_0 + reg_write(DDR_REG_BASE + 0x110a3 * 4 + 0x2000000, 0x6); //CA1 =0 dq11--P16--dq9_1 + reg_write(DDR_REG_BASE + 0x110a4 * 4 + 0x2000000, 0x4); //CA1 =0 dq12--w19--dq11_3 + reg_write(DDR_REG_BASE + 0x110a5 * 4 + 0x2000000, 0x3); //CA1 =0 dq13--u20--dq13_5 + reg_write(DDR_REG_BASE + 0x110a6 * 4 + 0x2000000, 0x5); //CA1 =0 dq14--u18--dq14_6 + reg_write(DDR_REG_BASE + 0x110a7 * 4 + 0x2000000, 0x7); //CA1 =0 dq15--t17--dq15_7 + + reg_write(DDR_REG_BASE + 0x130a0 * 4 + 0x2000000, 0x0); //lndq =1 dq16--c14--dq16_0 + reg_write(DDR_REG_BASE + 0x130a1 * 4 + 0x2000000, 0x1); //CA1 =0 dq17--d14--dq20_4 + reg_write(DDR_REG_BASE + 0x130a2 * 4 + 0x2000000, 0x6); //CA1 =0 dq18--c16--dq18_2 + reg_write(DDR_REG_BASE + 0x130a3 * 4 + 0x2000000, 0x3); //CA1 =0 dq19--a14--dq21_5 + reg_write(DDR_REG_BASE + 0x130a4 * 4 + 0x2000000, 0x2); //CA1 =0 dq20--b14--dq17_1 + reg_write(DDR_REG_BASE + 0x130a5 * 4 + 0x2000000, 0x5); //CA1 =0 dq21--b16--dq23_7 + reg_write(DDR_REG_BASE + 0x130a6 * 4 + 0x2000000, 0x4); //CA1 =0 dq22--a17--dq19_3 + reg_write(DDR_REG_BASE + 0x130a7 * 4 + 0x2000000, 0x7); //CA1 =0 dq23--b17--dq22_6 + + reg_write(DDR_REG_BASE + 0x100a0 * 4 + 0x2000000, 0x6); //lndq =1 dq24--t16--dq30_6 + reg_write(DDR_REG_BASE + 0x100a1 * 4 + 0x2000000, 0x2); //CA1 =0 dq25--v18--dq25_1 + reg_write(DDR_REG_BASE + 0x100a2 * 4 + 0x2000000, 0x0); //CA1 =0 dq26--u17--dq29_5 + reg_write(DDR_REG_BASE + 0x100a3 * 4 + 0x2000000, 0x4); //CA1 =0 dq27--y16--dq27_3 + reg_write(DDR_REG_BASE + 0x100a4 * 4 + 0x2000000, 0x3); //CA1 =0 dq28--e18--dq24_0 + reg_write(DDR_REG_BASE + 0x100a5 * 4 + 0x2000000, 0x1); //CA1 =0 dq29--y18--dq28_4 + reg_write(DDR_REG_BASE + 0x100a6 * 4 + 0x2000000, 0x5); //CA1 =0 dq30--v16--dq26_2 + reg_write(DDR_REG_BASE + 0x100a7 * 4 + 0x2000000, 0x7); //CA1 =0 dq31--u16--dq31_7 + +reg_write( DDR_REG_BASE + 0x00020060*4 +0x02000000 , 0x00000002 ); + +reg_write( DDR_REG_BASE + 0x000d0000*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE +0x50000*4+0x02000000,0xb0); +reg_write( DDR_REG_BASE +0x50001*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50002*4+0x02000000,0x50); +reg_write( DDR_REG_BASE +0x50003*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50004*4+0x02000000,0x50); +reg_write( DDR_REG_BASE +0x50005*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50006*4+0x02000000,0x50); +reg_write( DDR_REG_BASE +0x50007*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50008*4+0x02000000,0x50); +reg_write( DDR_REG_BASE +0x50009*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5000a*4+0x02000000,0x50); +reg_write( DDR_REG_BASE +0x5000b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5000c*4+0x02000000,0x50); +reg_write( DDR_REG_BASE +0x5000d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5000e*4+0x02000000,0x50); +reg_write( DDR_REG_BASE +0x5000f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50010*4+0x02000000,0x50); +reg_write( DDR_REG_BASE +0x50011*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50012*4+0x02000000,0x50); +reg_write( DDR_REG_BASE +0x50013*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50014*4+0x02000000,0x50); +reg_write( DDR_REG_BASE +0x50015*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50016*4+0x02000000,0x50); +reg_write( DDR_REG_BASE +0x50017*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50018*4+0x02000000,0x50); +reg_write( DDR_REG_BASE +0x50019*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5001a*4+0x02000000,0x50); +reg_write( DDR_REG_BASE +0x5001b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5001c*4+0x02000000,0x50); +reg_write( DDR_REG_BASE +0x5001d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5001e*4+0x02000000,0x50); +reg_write( DDR_REG_BASE +0x5001f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50020*4+0x02000000,0x50); +reg_write( DDR_REG_BASE +0x50021*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50022*4+0x02000000,0x50); +reg_write( DDR_REG_BASE +0x50023*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50024*4+0x02000000,0x50); +reg_write( DDR_REG_BASE +0x50025*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50026*4+0x02000000,0x50); +reg_write( DDR_REG_BASE +0x50027*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50028*4+0x02000000,0x2069); +reg_write( DDR_REG_BASE +0x50029*4+0x02000000,0x40); +reg_write( DDR_REG_BASE +0x5002a*4+0x02000000,0x264a); +reg_write( DDR_REG_BASE +0x5002b*4+0x02000000,0x7000); +reg_write( DDR_REG_BASE +0x5002c*4+0x02000000,0x264a); +reg_write( DDR_REG_BASE +0x5002d*4+0x02000000,0x7000); +reg_write( DDR_REG_BASE +0x5002e*4+0x02000000,0x264a); +reg_write( DDR_REG_BASE +0x5002f*4+0x02000000,0x7000); +reg_write( DDR_REG_BASE +0x50030*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50031*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50032*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50033*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50034*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50035*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50036*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50037*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50038*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50039*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5003a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5003b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5003c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5003d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5003e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5003f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50040*4+0x02000000,0x7054); +reg_write( DDR_REG_BASE +0x50041*4+0x02000000,0x7ce0); +reg_write( DDR_REG_BASE +0x50042*4+0x02000000,0x4300); +reg_write( DDR_REG_BASE +0x50043*4+0x02000000,0x1101); +reg_write( DDR_REG_BASE +0x50044*4+0x02000000,0x48c); +reg_write( DDR_REG_BASE +0x50045*4+0x02000000,0x2242); +reg_write( DDR_REG_BASE +0x50046*4+0x02000000,0x8042); +reg_write( DDR_REG_BASE +0x50047*4+0x02000000,0x1b01); +reg_write( DDR_REG_BASE +0x50048*4+0x02000000,0x312); +reg_write( DDR_REG_BASE +0x50049*4+0x02000000,0xf5fb); +reg_write( DDR_REG_BASE +0x5004a*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE +0x5004b*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x5004c*4+0x02000000,0x2244); +reg_write( DDR_REG_BASE +0x5004d*4+0x02000000,0x8ffc); +reg_write( DDR_REG_BASE +0x5004e*4+0x02000000,0x264a); +reg_write( DDR_REG_BASE +0x5004f*4+0x02000000,0x7000); +reg_write( DDR_REG_BASE +0x50050*4+0x02000000,0x20e8); +reg_write( DDR_REG_BASE +0x50051*4+0x02000000,0x1a2); +reg_write( DDR_REG_BASE +0x50052*4+0x02000000,0x202f); +reg_write( DDR_REG_BASE +0x50053*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x50054*4+0x02000000,0x212f); +reg_write( DDR_REG_BASE +0x50055*4+0x02000000,0x4b); +reg_write( DDR_REG_BASE +0x50056*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE +0x50057*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x50058*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x50059*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE +0x5005a*4+0x02000000,0x706c); +reg_write( DDR_REG_BASE +0x5005b*4+0x02000000,0x704d); +reg_write( DDR_REG_BASE +0x5005c*4+0x02000000,0x706d); +reg_write( DDR_REG_BASE +0x5005d*4+0x02000000,0x708d); +reg_write( DDR_REG_BASE +0x5005e*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE +0x5005f*4+0x02000000,0x70cd); +reg_write( DDR_REG_BASE +0x50060*4+0x02000000,0x70ed); +reg_write( DDR_REG_BASE +0x50061*4+0x02000000,0x206a); +reg_write( DDR_REG_BASE +0x50062*4+0x02000000,0x280); +reg_write( DDR_REG_BASE +0x50063*4+0x02000000,0xb88d); +reg_write( DDR_REG_BASE +0x50064*4+0x02000000,0x2029); +reg_write( DDR_REG_BASE +0x50065*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x50066*4+0x02000000,0x44db); +reg_write( DDR_REG_BASE +0x50067*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x50068*4+0x02000000,0x4000); +reg_write( DDR_REG_BASE +0x50069*4+0x02000000,0x42db); +reg_write( DDR_REG_BASE +0x5006a*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x5006b*4+0x02000000,0x400); +reg_write( DDR_REG_BASE +0x5006c*4+0x02000000,0x706f); +reg_write( DDR_REG_BASE +0x5006d*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x5006e*4+0x02000000,0x2022); +reg_write( DDR_REG_BASE +0x5006f*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x50070*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50071*4+0x02000000,0x2130); +reg_write( DDR_REG_BASE +0x50072*4+0x02000000,0x2069); +reg_write( DDR_REG_BASE +0x50073*4+0x02000000,0x40); +reg_write( DDR_REG_BASE +0x50074*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x50075*4+0x02000000,0xf1fe); +reg_write( DDR_REG_BASE +0x50076*4+0x02000000,0xc3e1); +reg_write( DDR_REG_BASE +0x50077*4+0x02000000,0xc2e1); +reg_write( DDR_REG_BASE +0x50078*4+0x02000000,0xc1e1); +reg_write( DDR_REG_BASE +0x50079*4+0x02000000,0xc0e1); +reg_write( DDR_REG_BASE +0x5007a*4+0x02000000,0xc0f1); +reg_write( DDR_REG_BASE +0x5007b*4+0x02000000,0xc1a1); +reg_write( DDR_REG_BASE +0x5007c*4+0x02000000,0xe805); +reg_write( DDR_REG_BASE +0x5007d*4+0x02000000,0x7487); +reg_write( DDR_REG_BASE +0x5007e*4+0x02000000,0xc0d1); +reg_write( DDR_REG_BASE +0x5007f*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE +0x50080*4+0x02000000,0xc0a4); +reg_write( DDR_REG_BASE +0x50081*4+0x02000000,0xda23); +reg_write( DDR_REG_BASE +0x50082*4+0x02000000,0xba9f); +reg_write( DDR_REG_BASE +0x50083*4+0x02000000,0x8a60); +reg_write( DDR_REG_BASE +0x50084*4+0x02000000,0x1226); +reg_write( DDR_REG_BASE +0x50085*4+0x02000000,0x80); +reg_write( DDR_REG_BASE +0x50086*4+0x02000000,0x7865); +reg_write( DDR_REG_BASE +0x50087*4+0x02000000,0x1aec); +reg_write( DDR_REG_BASE +0x50088*4+0x02000000,0x8002); +reg_write( DDR_REG_BASE +0x50089*4+0x02000000,0x12ef); +reg_write( DDR_REG_BASE +0x5008a*4+0x02000000,0x8080); +reg_write( DDR_REG_BASE +0x5008b*4+0x02000000,0x208c); +reg_write( DDR_REG_BASE +0x5008c*4+0x02000000,0x8fc3); +reg_write( DDR_REG_BASE +0x5008d*4+0x02000000,0xf20e); +reg_write( DDR_REG_BASE +0x5008e*4+0x02000000,0xc084); +reg_write( DDR_REG_BASE +0x5008f*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE +0x50090*4+0x02000000,0x4020); +reg_write( DDR_REG_BASE +0x50091*4+0x02000000,0x9ca); +reg_write( DDR_REG_BASE +0x50092*4+0x02000000,0x260); +reg_write( DDR_REG_BASE +0x50093*4+0x02000000,0xc184); +reg_write( DDR_REG_BASE +0x50094*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x50095*4+0x02000000,0x402); +reg_write( DDR_REG_BASE +0x50096*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50097*4+0x02000000,0xf36); +reg_write( DDR_REG_BASE +0x50098*4+0x02000000,0x60); +reg_write( DDR_REG_BASE +0x50099*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x5009a*4+0x02000000,0x94e); +reg_write( DDR_REG_BASE +0x5009b*4+0x02000000,0x260); +reg_write( DDR_REG_BASE +0x5009c*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x5009d*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x5009e*4+0x02000000,0x20ab); +reg_write( DDR_REG_BASE +0x5009f*4+0x02000000,0xc4); +reg_write( DDR_REG_BASE +0x500a0*4+0x02000000,0x7fff); +reg_write( DDR_REG_BASE +0x500a1*4+0x02000000,0xf000); +reg_write( DDR_REG_BASE +0x500a2*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE +0x500a3*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE +0x500a4*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE +0x500a5*4+0x02000000,0xc1a8); +reg_write( DDR_REG_BASE +0x500a6*4+0x02000000,0xc243); +reg_write( DDR_REG_BASE +0x500a7*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE +0x500a8*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x500a9*4+0x02000000,0xc147); +reg_write( DDR_REG_BASE +0x500aa*4+0x02000000,0xa100); +reg_write( DDR_REG_BASE +0x500ab*4+0x02000000,0xc345); +reg_write( DDR_REG_BASE +0x500ac*4+0x02000000,0xc103); +reg_write( DDR_REG_BASE +0x500ad*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE +0x500ae*4+0x02000000,0x1a7); +reg_write( DDR_REG_BASE +0x500af*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x500b0*4+0x02000000,0xa100); +reg_write( DDR_REG_BASE +0x500b1*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE +0x500b2*4+0x02000000,0x815); +reg_write( DDR_REG_BASE +0x500b3*4+0x02000000,0x70); +reg_write( DDR_REG_BASE +0x500b4*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x500b5*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE +0x500b6*4+0x02000000,0xe88b); +reg_write( DDR_REG_BASE +0x500b7*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE +0x500b8*4+0x02000000,0x218a); +reg_write( DDR_REG_BASE +0x500b9*4+0x02000000,0xfcf); +reg_write( DDR_REG_BASE +0x500ba*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE +0x500bb*4+0x02000000,0xf005); +reg_write( DDR_REG_BASE +0x500bc*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE +0x500bd*4+0x02000000,0x228a); +reg_write( DDR_REG_BASE +0x500be*4+0x02000000,0xfcf); +reg_write( DDR_REG_BASE +0x500bf*4+0x02000000,0xf8e); +reg_write( DDR_REG_BASE +0x500c0*4+0x02000000,0x280); +reg_write( DDR_REG_BASE +0x500c1*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x500c2*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE +0x500c3*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x500c4*4+0x02000000,0x79d); +reg_write( DDR_REG_BASE +0x500c5*4+0x02000000,0xc046); +reg_write( DDR_REG_BASE +0x500c6*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x500c7*4+0x02000000,0x4318); +reg_write( DDR_REG_BASE +0x500c8*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE +0x500c9*4+0x02000000,0xf058); +reg_write( DDR_REG_BASE +0x500ca*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x500cb*4+0x02000000,0x7000); +reg_write( DDR_REG_BASE +0x500cc*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x500cd*4+0x02000000,0x7a0); +reg_write( DDR_REG_BASE +0x500ce*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE +0x500cf*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE +0x500d0*4+0x02000000,0x54); +reg_write( DDR_REG_BASE +0x500d1*4+0x02000000,0x2032); +reg_write( DDR_REG_BASE +0x500d2*4+0x02000000,0x6c1); +reg_write( DDR_REG_BASE +0x500d3*4+0x02000000,0x211a); +reg_write( DDR_REG_BASE +0x500d4*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x500d5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x500d6*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE +0x500d7*4+0x02000000,0x78c5); +reg_write( DDR_REG_BASE +0x500d8*4+0x02000000,0x9000); +reg_write( DDR_REG_BASE +0x500d9*4+0x02000000,0xef6); +reg_write( DDR_REG_BASE +0x500da*4+0x02000000,0x60); +reg_write( DDR_REG_BASE +0x500db*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE +0x500dc*4+0x02000000,0x4508); +reg_write( DDR_REG_BASE +0x500dd*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x500de*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x500df*4+0x02000000,0x7a0); +reg_write( DDR_REG_BASE +0x500e0*4+0x02000000,0x8002); +reg_write( DDR_REG_BASE +0x500e1*4+0x02000000,0x2032); +reg_write( DDR_REG_BASE +0x500e2*4+0x02000000,0x6c1); +reg_write( DDR_REG_BASE +0x500e3*4+0x02000000,0x211a); +reg_write( DDR_REG_BASE +0x500e4*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x500e5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x500e6*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE +0x500e7*4+0x02000000,0x7e05); +reg_write( DDR_REG_BASE +0x500e8*4+0x02000000,0x9600); +reg_write( DDR_REG_BASE +0x500e9*4+0x02000000,0xed6); +reg_write( DDR_REG_BASE +0x500ea*4+0x02000000,0x60); +reg_write( DDR_REG_BASE +0x500eb*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE +0x500ec*4+0x02000000,0xc105); +reg_write( DDR_REG_BASE +0x500ed*4+0x02000000,0x42eb); +reg_write( DDR_REG_BASE +0x500ee*4+0x02000000,0xf86c); +reg_write( DDR_REG_BASE +0x500ef*4+0x02000000,0x4759); +reg_write( DDR_REG_BASE +0x500f0*4+0x02000000,0xe90b); +reg_write( DDR_REG_BASE +0x500f1*4+0x02000000,0x2344); +reg_write( DDR_REG_BASE +0x500f2*4+0x02000000,0x80); +reg_write( DDR_REG_BASE +0x500f3*4+0x02000000,0x7f05); +reg_write( DDR_REG_BASE +0x500f4*4+0x02000000,0x2544); +reg_write( DDR_REG_BASE +0x500f5*4+0x02000000,0x1080); +reg_write( DDR_REG_BASE +0x500f6*4+0x02000000,0x7a05); +reg_write( DDR_REG_BASE +0x500f7*4+0x02000000,0x2247); +reg_write( DDR_REG_BASE +0x500f8*4+0x02000000,0xc1); +reg_write( DDR_REG_BASE +0x500f9*4+0x02000000,0x79e5); +reg_write( DDR_REG_BASE +0x500fa*4+0x02000000,0xf017); +reg_write( DDR_REG_BASE +0x500fb*4+0x02000000,0x42eb); +reg_write( DDR_REG_BASE +0x500fc*4+0x02000000,0xf85a); +reg_write( DDR_REG_BASE +0x500fd*4+0x02000000,0x4759); +reg_write( DDR_REG_BASE +0x500fe*4+0x02000000,0xc142); +reg_write( DDR_REG_BASE +0x500ff*4+0x02000000,0x42eb); +reg_write( DDR_REG_BASE +0x50100*4+0x02000000,0xf845); +reg_write( DDR_REG_BASE +0x50101*4+0x02000000,0x4759); +reg_write( DDR_REG_BASE +0x50102*4+0x02000000,0x272f); +reg_write( DDR_REG_BASE +0x50103*4+0x02000000,0x3382); +reg_write( DDR_REG_BASE +0x50104*4+0x02000000,0x2744); +reg_write( DDR_REG_BASE +0x50105*4+0x02000000,0x3201); +reg_write( DDR_REG_BASE +0x50106*4+0x02000000,0x7985); +reg_write( DDR_REG_BASE +0x50107*4+0x02000000,0xc402); +reg_write( DDR_REG_BASE +0x50108*4+0x02000000,0x42eb); +reg_write( DDR_REG_BASE +0x50109*4+0x02000000,0xf84b); +reg_write( DDR_REG_BASE +0x5010a*4+0x02000000,0x4759); +reg_write( DDR_REG_BASE +0x5010b*4+0x02000000,0x2744); +reg_write( DDR_REG_BASE +0x5010c*4+0x02000000,0x3102); +reg_write( DDR_REG_BASE +0x5010d*4+0x02000000,0x42eb); +reg_write( DDR_REG_BASE +0x5010e*4+0x02000000,0xf858); +reg_write( DDR_REG_BASE +0x5010f*4+0x02000000,0x4759); +reg_write( DDR_REG_BASE +0x50110*4+0x02000000,0x7905); +reg_write( DDR_REG_BASE +0x50111*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE +0x50112*4+0x02000000,0x4220); +reg_write( DDR_REG_BASE +0x50113*4+0x02000000,0x7167); +reg_write( DDR_REG_BASE +0x50114*4+0x02000000,0x205a); +reg_write( DDR_REG_BASE +0x50115*4+0x02000000,0x200); +reg_write( DDR_REG_BASE +0x50116*4+0x02000000,0xb8c4); +reg_write( DDR_REG_BASE +0x50117*4+0x02000000,0xe806); +reg_write( DDR_REG_BASE +0x50118*4+0x02000000,0xb861); +reg_write( DDR_REG_BASE +0x50119*4+0x02000000,0x801); +reg_write( DDR_REG_BASE +0x5011a*4+0x02000000,0x31); +reg_write( DDR_REG_BASE +0x5011b*4+0x02000000,0x7a5b); +reg_write( DDR_REG_BASE +0x5011c*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE +0x5011d*4+0x02000000,0x8020); +reg_write( DDR_REG_BASE +0x5011e*4+0x02000000,0x7945); +reg_write( DDR_REG_BASE +0x5011f*4+0x02000000,0xa020); +reg_write( DDR_REG_BASE +0x50120*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE +0x50121*4+0x02000000,0x230c); +reg_write( DDR_REG_BASE +0x50122*4+0x02000000,0xb000); +reg_write( DDR_REG_BASE +0x50123*4+0x02000000,0x750); +reg_write( DDR_REG_BASE +0x50124*4+0x02000000,0xffc5); +reg_write( DDR_REG_BASE +0x50125*4+0x02000000,0xf052); +reg_write( DDR_REG_BASE +0x50126*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x50127*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x50128*4+0x02000000,0x7a0); +reg_write( DDR_REG_BASE +0x50129*4+0x02000000,0x8021); +reg_write( DDR_REG_BASE +0x5012a*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE +0x5012b*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE +0x5012c*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE +0x5012d*4+0x02000000,0x54); +reg_write( DDR_REG_BASE +0x5012e*4+0x02000000,0x42eb); +reg_write( DDR_REG_BASE +0x5012f*4+0x02000000,0xf851); +reg_write( DDR_REG_BASE +0x50130*4+0x02000000,0x4759); +reg_write( DDR_REG_BASE +0x50131*4+0x02000000,0xe46); +reg_write( DDR_REG_BASE +0x50132*4+0x02000000,0x60); +reg_write( DDR_REG_BASE +0x50133*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE +0x50134*4+0x02000000,0x4508); +reg_write( DDR_REG_BASE +0x50135*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x50136*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x50137*4+0x02000000,0x7a0); +reg_write( DDR_REG_BASE +0x50138*4+0x02000000,0x8023); +reg_write( DDR_REG_BASE +0x50139*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE +0x5013a*4+0x02000000,0x42eb); +reg_write( DDR_REG_BASE +0x5013b*4+0x02000000,0xf84b); +reg_write( DDR_REG_BASE +0x5013c*4+0x02000000,0x4759); +reg_write( DDR_REG_BASE +0x5013d*4+0x02000000,0xe2e); +reg_write( DDR_REG_BASE +0x5013e*4+0x02000000,0x60); +reg_write( DDR_REG_BASE +0x5013f*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE +0x50140*4+0x02000000,0xc105); +reg_write( DDR_REG_BASE +0x50141*4+0x02000000,0x42eb); +reg_write( DDR_REG_BASE +0x50142*4+0x02000000,0xf842); +reg_write( DDR_REG_BASE +0x50143*4+0x02000000,0x4759); +reg_write( DDR_REG_BASE +0x50144*4+0x02000000,0xe90b); +reg_write( DDR_REG_BASE +0x50145*4+0x02000000,0x2344); +reg_write( DDR_REG_BASE +0x50146*4+0x02000000,0x80); +reg_write( DDR_REG_BASE +0x50147*4+0x02000000,0x7f05); +reg_write( DDR_REG_BASE +0x50148*4+0x02000000,0x2544); +reg_write( DDR_REG_BASE +0x50149*4+0x02000000,0x1080); +reg_write( DDR_REG_BASE +0x5014a*4+0x02000000,0x7845); +reg_write( DDR_REG_BASE +0x5014b*4+0x02000000,0x2047); +reg_write( DDR_REG_BASE +0x5014c*4+0x02000000,0xc0); +reg_write( DDR_REG_BASE +0x5014d*4+0x02000000,0x78e5); +reg_write( DDR_REG_BASE +0x5014e*4+0x02000000,0xf017); +reg_write( DDR_REG_BASE +0x5014f*4+0x02000000,0x42eb); +reg_write( DDR_REG_BASE +0x50150*4+0x02000000,0xf830); +reg_write( DDR_REG_BASE +0x50151*4+0x02000000,0x4759); +reg_write( DDR_REG_BASE +0x50152*4+0x02000000,0xc142); +reg_write( DDR_REG_BASE +0x50153*4+0x02000000,0x42eb); +reg_write( DDR_REG_BASE +0x50154*4+0x02000000,0xf81b); +reg_write( DDR_REG_BASE +0x50155*4+0x02000000,0x4759); +reg_write( DDR_REG_BASE +0x50156*4+0x02000000,0x272f); +reg_write( DDR_REG_BASE +0x50157*4+0x02000000,0x3382); +reg_write( DDR_REG_BASE +0x50158*4+0x02000000,0x2744); +reg_write( DDR_REG_BASE +0x50159*4+0x02000000,0x3201); +reg_write( DDR_REG_BASE +0x5015a*4+0x02000000,0x7985); +reg_write( DDR_REG_BASE +0x5015b*4+0x02000000,0xc402); +reg_write( DDR_REG_BASE +0x5015c*4+0x02000000,0x42eb); +reg_write( DDR_REG_BASE +0x5015d*4+0x02000000,0xf821); +reg_write( DDR_REG_BASE +0x5015e*4+0x02000000,0x4759); +reg_write( DDR_REG_BASE +0x5015f*4+0x02000000,0x2744); +reg_write( DDR_REG_BASE +0x50160*4+0x02000000,0x3102); +reg_write( DDR_REG_BASE +0x50161*4+0x02000000,0x42eb); +reg_write( DDR_REG_BASE +0x50162*4+0x02000000,0xf82e); +reg_write( DDR_REG_BASE +0x50163*4+0x02000000,0x4759); +reg_write( DDR_REG_BASE +0x50164*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE +0x50165*4+0x02000000,0xc100); +reg_write( DDR_REG_BASE +0x50166*4+0x02000000,0x215a); +reg_write( DDR_REG_BASE +0x50167*4+0x02000000,0x201); +reg_write( DDR_REG_BASE +0x50168*4+0x02000000,0xb9c4); +reg_write( DDR_REG_BASE +0x50169*4+0x02000000,0xe906); +reg_write( DDR_REG_BASE +0x5016a*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE +0x5016b*4+0x02000000,0x901); +reg_write( DDR_REG_BASE +0x5016c*4+0x02000000,0x31); +reg_write( DDR_REG_BASE +0x5016d*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE +0x5016e*4+0x02000000,0xc103); +reg_write( DDR_REG_BASE +0x5016f*4+0x02000000,0x8120); +reg_write( DDR_REG_BASE +0x50170*4+0x02000000,0x7905); +reg_write( DDR_REG_BASE +0x50171*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE +0x50172*4+0x02000000,0xa020); +reg_write( DDR_REG_BASE +0x50173*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE +0x50174*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE +0x50175*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE +0x50176*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x50177*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x50178*4+0x02000000,0x79d); +reg_write( DDR_REG_BASE +0x50179*4+0x02000000,0x8821); +reg_write( DDR_REG_BASE +0x5017a*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE +0x5017b*4+0x02000000,0x7030); +reg_write( DDR_REG_BASE +0x5017c*4+0x02000000,0x754); +reg_write( DDR_REG_BASE +0x5017d*4+0x02000000,0xffc5); +reg_write( DDR_REG_BASE +0x5017e*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE +0x5017f*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE +0x50180*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE +0x50181*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE +0x50182*4+0x02000000,0x7214); +reg_write( DDR_REG_BASE +0x50183*4+0x02000000,0x65e); +reg_write( DDR_REG_BASE +0x50184*4+0x02000000,0xffc5); +reg_write( DDR_REG_BASE +0x50185*4+0x02000000,0xc0a8); +reg_write( DDR_REG_BASE +0x50186*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE +0x50187*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE +0x50188*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE +0x50189*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x5018a*4+0x02000000,0x2144); +reg_write( DDR_REG_BASE +0x5018b*4+0x02000000,0x801); +reg_write( DDR_REG_BASE +0x5018c*4+0x02000000,0x79c5); +reg_write( DDR_REG_BASE +0x5018d*4+0x02000000,0x7c25); +reg_write( DDR_REG_BASE +0x5018e*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE +0x5018f*4+0x02000000,0x7964); +reg_write( DDR_REG_BASE +0x50190*4+0x02000000,0x7985); +reg_write( DDR_REG_BASE +0x50191*4+0x02000000,0x7f25); +reg_write( DDR_REG_BASE +0x50192*4+0x02000000,0x2644); +reg_write( DDR_REG_BASE +0x50193*4+0x02000000,0x308c); +reg_write( DDR_REG_BASE +0x50194*4+0x02000000,0x791d); +reg_write( DDR_REG_BASE +0x50195*4+0x02000000,0x7ce5); +reg_write( DDR_REG_BASE +0x50196*4+0x02000000,0x7f3d); +reg_write( DDR_REG_BASE +0x50197*4+0x02000000,0x2744); +reg_write( DDR_REG_BASE +0x50198*4+0x02000000,0x1101); +reg_write( DDR_REG_BASE +0x50199*4+0x02000000,0x7c25); +reg_write( DDR_REG_BASE +0x5019a*4+0x02000000,0x791d); +reg_write( DDR_REG_BASE +0x5019b*4+0x02000000,0x7e3d); +reg_write( DDR_REG_BASE +0x5019c*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE +0x5019d*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x5019e*4+0x02000000,0x2384); +reg_write( DDR_REG_BASE +0x5019f*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x501a0*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x501a1*4+0x02000000,0x2444); +reg_write( DDR_REG_BASE +0x501a2*4+0x02000000,0x140c); +reg_write( DDR_REG_BASE +0x501a3*4+0x02000000,0x7d85); +reg_write( DDR_REG_BASE +0x501a4*4+0x02000000,0x2344); +reg_write( DDR_REG_BASE +0x501a5*4+0x02000000,0x180c); +reg_write( DDR_REG_BASE +0x501a6*4+0x02000000,0x7ca5); +reg_write( DDR_REG_BASE +0x501a7*4+0x02000000,0x7c65); +reg_write( DDR_REG_BASE +0x501a8*4+0x02000000,0x2744); +reg_write( DDR_REG_BASE +0x501a9*4+0x02000000,0x1083); +reg_write( DDR_REG_BASE +0x501aa*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x501ab*4+0x02000000,0x7b85); +reg_write( DDR_REG_BASE +0x501ac*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x501ad*4+0x02000000,0x7b45); +reg_write( DDR_REG_BASE +0x501ae*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE +0x501af*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x501b0*4+0x02000000,0x255e); +reg_write( DDR_REG_BASE +0x501b1*4+0x02000000,0x1401); +reg_write( DDR_REG_BASE +0x501b2*4+0x02000000,0x255a); +reg_write( DDR_REG_BASE +0x501b3*4+0x02000000,0x110b); +reg_write( DDR_REG_BASE +0x501b4*4+0x02000000,0xdc40); +reg_write( DDR_REG_BASE +0x501b5*4+0x02000000,0x2144); +reg_write( DDR_REG_BASE +0x501b6*4+0x02000000,0x40e); +reg_write( DDR_REG_BASE +0x501b7*4+0x02000000,0x255e); +reg_write( DDR_REG_BASE +0x501b8*4+0x02000000,0x1201); +reg_write( DDR_REG_BASE +0x501b9*4+0x02000000,0x2404); +reg_write( DDR_REG_BASE +0x501ba*4+0x02000000,0x12cc); +reg_write( DDR_REG_BASE +0x501bb*4+0x02000000,0x2584); +reg_write( DDR_REG_BASE +0x501bc*4+0x02000000,0x1002); +reg_write( DDR_REG_BASE +0x501bd*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE +0x501be*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x501bf*4+0x02000000,0x7a65); +reg_write( DDR_REG_BASE +0x501c0*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE +0x501c1*4+0x02000000,0x200); +reg_write( DDR_REG_BASE +0x501c2*4+0x02000000,0x7845); +reg_write( DDR_REG_BASE +0x501c3*4+0x02000000,0x2087); +reg_write( DDR_REG_BASE +0x501c4*4+0x02000000,0xfc3); +reg_write( DDR_REG_BASE +0x501c5*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE +0x501c6*4+0x02000000,0x7c1d); +reg_write( DDR_REG_BASE +0x501c7*4+0x02000000,0x2444); +reg_write( DDR_REG_BASE +0x501c8*4+0x02000000,0x1042); +reg_write( DDR_REG_BASE +0x501c9*4+0x02000000,0x260a); +reg_write( DDR_REG_BASE +0x501ca*4+0x02000000,0x3300); +reg_write( DDR_REG_BASE +0x501cb*4+0x02000000,0x7bbb); +reg_write( DDR_REG_BASE +0x501cc*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE +0x501cd*4+0x02000000,0x4f); +reg_write( DDR_REG_BASE +0x501ce*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE +0x501cf*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x501d0*4+0x02000000,0x6109); +reg_write( DDR_REG_BASE +0x501d1*4+0x02000000,0x211a); +reg_write( DDR_REG_BASE +0x501d2*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x501d3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x501d4*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE +0x501d5*4+0x02000000,0x78c5); +reg_write( DDR_REG_BASE +0x501d6*4+0x02000000,0x9000); +reg_write( DDR_REG_BASE +0x501d7*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE +0x501d8*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE +0x501d9*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE +0x501da*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE +0x501db*4+0x02000000,0x2482); +reg_write( DDR_REG_BASE +0x501dc*4+0x02000000,0x3c0c); +reg_write( DDR_REG_BASE +0x501dd*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x501de*4+0x02000000,0x7100); +reg_write( DDR_REG_BASE +0x501df*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE +0x501e0*4+0x02000000,0xaa); +reg_write( DDR_REG_BASE +0x501e1*4+0x02000000,0x70cd); +reg_write( DDR_REG_BASE +0x501e2*4+0x02000000,0x2456); +reg_write( DDR_REG_BASE +0x501e3*4+0x02000000,0x3c02); +reg_write( DDR_REG_BASE +0x501e4*4+0x02000000,0xc04b); +reg_write( DDR_REG_BASE +0x501e5*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x501e6*4+0x02000000,0x7384); +reg_write( DDR_REG_BASE +0x501e7*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE +0x501e8*4+0x02000000,0xe0aa); +reg_write( DDR_REG_BASE +0x501e9*4+0x02000000,0x206f); +reg_write( DDR_REG_BASE +0x501ea*4+0x02000000,0x243); +reg_write( DDR_REG_BASE +0x501eb*4+0x02000000,0x88a0); +reg_write( DDR_REG_BASE +0x501ec*4+0x02000000,0x1045); +reg_write( DDR_REG_BASE +0x501ed*4+0x02000000,0x81); +reg_write( DDR_REG_BASE +0x501ee*4+0x02000000,0x881f); +reg_write( DDR_REG_BASE +0x501ef*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE +0x501f0*4+0x02000000,0x3f83); +reg_write( DDR_REG_BASE +0x501f1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x501f2*4+0x02000000,0x53); +reg_write( DDR_REG_BASE +0x501f3*4+0x02000000,0xc148); +reg_write( DDR_REG_BASE +0x501f4*4+0x02000000,0xc049); +reg_write( DDR_REG_BASE +0x501f5*4+0x02000000,0xc095); +reg_write( DDR_REG_BASE +0x501f6*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE +0x501f7*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE +0x501f8*4+0x02000000,0x3f81); +reg_write( DDR_REG_BASE +0x501f9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x501fa*4+0x02000000,0x18c); +reg_write( DDR_REG_BASE +0x501fb*4+0x02000000,0xac6); +reg_write( DDR_REG_BASE +0x501fc*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE +0x501fd*4+0x02000000,0x2456); +reg_write( DDR_REG_BASE +0x501fe*4+0x02000000,0x3cc0); +reg_write( DDR_REG_BASE +0x501ff*4+0x02000000,0xf00e); +reg_write( DDR_REG_BASE +0x50200*4+0x02000000,0x265a); +reg_write( DDR_REG_BASE +0x50201*4+0x02000000,0x1602); +reg_write( DDR_REG_BASE +0x50202*4+0x02000000,0xf006); +reg_write( DDR_REG_BASE +0x50203*4+0x02000000,0x6058); +reg_write( DDR_REG_BASE +0x50204*4+0x02000000,0x6038); +reg_write( DDR_REG_BASE +0x50205*4+0x02000000,0x1800); +reg_write( DDR_REG_BASE +0x50206*4+0x02000000,0x3); +reg_write( DDR_REG_BASE +0x50207*4+0x02000000,0x7124); +reg_write( DDR_REG_BASE +0x50208*4+0x02000000,0x9f7); +reg_write( DDR_REG_BASE +0x50209*4+0x02000000,0x8634); +reg_write( DDR_REG_BASE +0x5020a*4+0x02000000,0xc098); +reg_write( DDR_REG_BASE +0x5020b*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE +0x5020c*4+0x02000000,0xee9); +reg_write( DDR_REG_BASE +0x5020d*4+0x02000000,0x9334); +reg_write( DDR_REG_BASE +0x5020e*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x5020f*4+0x02000000,0x251a); +reg_write( DDR_REG_BASE +0x50210*4+0x02000000,0x1f80); +reg_write( DDR_REG_BASE +0x50211*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x50212*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50213*4+0x02000000,0x70ed); +reg_write( DDR_REG_BASE +0x50214*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x50215*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x50216*4+0x02000000,0x9001); +reg_write( DDR_REG_BASE +0x50217*4+0x02000000,0xe100); +reg_write( DDR_REG_BASE +0x50218*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE +0x50219*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x5021a*4+0x02000000,0xc04a); +reg_write( DDR_REG_BASE +0x5021b*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE +0x5021c*4+0x02000000,0xb0e0); +reg_write( DDR_REG_BASE +0x5021d*4+0x02000000,0xc109); +reg_write( DDR_REG_BASE +0x5021e*4+0x02000000,0xc008); +reg_write( DDR_REG_BASE +0x5021f*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE +0x50220*4+0x02000000,0xc04c); +reg_write( DDR_REG_BASE +0x50221*4+0x02000000,0x251a); +reg_write( DDR_REG_BASE +0x50222*4+0x02000000,0x1f80); +reg_write( DDR_REG_BASE +0x50223*4+0x02000000,0x10); +reg_write( DDR_REG_BASE +0x50224*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50225*4+0x02000000,0xb887); +reg_write( DDR_REG_BASE +0x50226*4+0x02000000,0xa2a); +reg_write( DDR_REG_BASE +0x50227*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE +0x50228*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE +0x50229*4+0x02000000,0x563); +reg_write( DDR_REG_BASE +0x5022a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5022b*4+0x02000000,0xc00c); +reg_write( DDR_REG_BASE +0x5022c*4+0x02000000,0x2011); +reg_write( DDR_REG_BASE +0x5022d*4+0x02000000,0x83c0); +reg_write( DDR_REG_BASE +0x5022e*4+0x02000000,0x554); +reg_write( DDR_REG_BASE +0x5022f*4+0x02000000,0x21); +reg_write( DDR_REG_BASE +0x50230*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE +0x50231*4+0x02000000,0x2744); +reg_write( DDR_REG_BASE +0x50232*4+0x02000000,0x17c1); +reg_write( DDR_REG_BASE +0x50233*4+0x02000000,0xe906); +reg_write( DDR_REG_BASE +0x50234*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE +0x50235*4+0x02000000,0x901); +reg_write( DDR_REG_BASE +0x50236*4+0x02000000,0x31); +reg_write( DDR_REG_BASE +0x50237*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE +0x50238*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE +0x50239*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x5023a*4+0x02000000,0xf009); +reg_write( DDR_REG_BASE +0x5023b*4+0x02000000,0x2456); +reg_write( DDR_REG_BASE +0x5023c*4+0x02000000,0x3d82); +reg_write( DDR_REG_BASE +0x5023d*4+0x02000000,0x7a34); +reg_write( DDR_REG_BASE +0x5023e*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x5023f*4+0x02000000,0x1ac0); +reg_write( DDR_REG_BASE +0x50240*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x50241*4+0x02000000,0xb200); +reg_write( DDR_REG_BASE +0x50242*4+0x02000000,0x7124); +reg_write( DDR_REG_BASE +0x50243*4+0x02000000,0xe1e0); +reg_write( DDR_REG_BASE +0x50244*4+0x02000000,0xf7b7); +reg_write( DDR_REG_BASE +0x50245*4+0x02000000,0xc101); +reg_write( DDR_REG_BASE +0x50246*4+0x02000000,0xc009); +reg_write( DDR_REG_BASE +0x50247*4+0x02000000,0x2004); +reg_write( DDR_REG_BASE +0x50248*4+0x02000000,0x8040); +reg_write( DDR_REG_BASE +0x50249*4+0x02000000,0xc046); +reg_write( DDR_REG_BASE +0x5024a*4+0x02000000,0xc008); +reg_write( DDR_REG_BASE +0x5024b*4+0x02000000,0x7824); +reg_write( DDR_REG_BASE +0x5024c*4+0x02000000,0xc047); +reg_write( DDR_REG_BASE +0x5024d*4+0x02000000,0x2079); +reg_write( DDR_REG_BASE +0x5024e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5024f*4+0x02000000,0x232f); +reg_write( DDR_REG_BASE +0x50250*4+0x02000000,0x3000); +reg_write( DDR_REG_BASE +0x50251*4+0x02000000,0x23c5); +reg_write( DDR_REG_BASE +0x50252*4+0x02000000,0x3062); +reg_write( DDR_REG_BASE +0x50253*4+0x02000000,0xf76); +reg_write( DDR_REG_BASE +0x50254*4+0x02000000,0x60); +reg_write( DDR_REG_BASE +0x50255*4+0x02000000,0x4063); +reg_write( DDR_REG_BASE +0x50256*4+0x02000000,0x42c3); +reg_write( DDR_REG_BASE +0x50257*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x50258*4+0x02000000,0x758); +reg_write( DDR_REG_BASE +0x50259*4+0x02000000,0x6748); +reg_write( DDR_REG_BASE +0x5025a*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x5025b*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x5025c*4+0x02000000,0x79d); +reg_write( DDR_REG_BASE +0x5025d*4+0x02000000,0x45cb); +reg_write( DDR_REG_BASE +0x5025e*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x5025f*4+0x02000000,0x7a0); +reg_write( DDR_REG_BASE +0x50260*4+0x02000000,0xa900); +reg_write( DDR_REG_BASE +0x50261*4+0x02000000,0x62f8); +reg_write( DDR_REG_BASE +0x50262*4+0x02000000,0x8862); +reg_write( DDR_REG_BASE +0x50263*4+0x02000000,0x4a6c); +reg_write( DDR_REG_BASE +0x50264*4+0x02000000,0x78f6); +reg_write( DDR_REG_BASE +0x50265*4+0x02000000,0xa503); +reg_write( DDR_REG_BASE +0x50266*4+0x02000000,0x4a4c); +reg_write( DDR_REG_BASE +0x50267*4+0x02000000,0x78f6); +reg_write( DDR_REG_BASE +0x50268*4+0x02000000,0xa502); +reg_write( DDR_REG_BASE +0x50269*4+0x02000000,0x4a2c); +reg_write( DDR_REG_BASE +0x5026a*4+0x02000000,0x78f6); +reg_write( DDR_REG_BASE +0x5026b*4+0x02000000,0xa501); +reg_write( DDR_REG_BASE +0x5026c*4+0x02000000,0x6a04); +reg_write( DDR_REG_BASE +0x5026d*4+0x02000000,0x78f6); +reg_write( DDR_REG_BASE +0x5026e*4+0x02000000,0xa500); +reg_write( DDR_REG_BASE +0x5026f*4+0x02000000,0x4063); +reg_write( DDR_REG_BASE +0x50270*4+0x02000000,0xf3a); +reg_write( DDR_REG_BASE +0x50271*4+0x02000000,0x60); +reg_write( DDR_REG_BASE +0x50272*4+0x02000000,0xa961); +reg_write( DDR_REG_BASE +0x50273*4+0x02000000,0xe524); +reg_write( DDR_REG_BASE +0x50274*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE +0x50275*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE +0x50276*4+0x02000000,0x70cd); +reg_write( DDR_REG_BASE +0x50277*4+0x02000000,0xd929); +reg_write( DDR_REG_BASE +0x50278*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x50279*4+0x02000000,0x7382); +reg_write( DDR_REG_BASE +0x5027a*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x5027b*4+0x02000000,0x6b4); +reg_write( DDR_REG_BASE +0x5027c*4+0x02000000,0xe7a); +reg_write( DDR_REG_BASE +0x5027d*4+0x02000000,0x1e0); +reg_write( DDR_REG_BASE +0x5027e*4+0x02000000,0xdaa4); +reg_write( DDR_REG_BASE +0x5027f*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE +0x50280*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x50281*4+0x02000000,0x774c); +reg_write( DDR_REG_BASE +0x50282*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE +0x50283*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE +0x50284*4+0x02000000,0x780); +reg_write( DDR_REG_BASE +0x50285*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x50286*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x50287*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE +0x50288*4+0x02000000,0x1e0); +reg_write( DDR_REG_BASE +0x50289*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE +0x5028a*4+0x02000000,0x90a0); +reg_write( DDR_REG_BASE +0x5028b*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE +0x5028c*4+0x02000000,0x238a); +reg_write( DDR_REG_BASE +0x5028d*4+0x02000000,0xff7); +reg_write( DDR_REG_BASE +0x5028e*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE +0x5028f*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE +0x50290*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE +0x50291*4+0x02000000,0xad2); +reg_write( DDR_REG_BASE +0x50292*4+0x02000000,0x2a0); +reg_write( DDR_REG_BASE +0x50293*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE +0x50294*4+0x02000000,0x2504); +reg_write( DDR_REG_BASE +0x50295*4+0x02000000,0x1f8d); +reg_write( DDR_REG_BASE +0x50296*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50297*4+0x02000000,0xffbf); +reg_write( DDR_REG_BASE +0x50298*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE +0x50299*4+0x02000000,0xfc7); +reg_write( DDR_REG_BASE +0x5029a*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x5029b*4+0x02000000,0x7344); +reg_write( DDR_REG_BASE +0x5029c*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE +0x5029d*4+0x02000000,0xe1e0); +reg_write( DDR_REG_BASE +0x5029e*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x5029f*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE +0x502a0*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x502a1*4+0x02000000,0xe048); +reg_write( DDR_REG_BASE +0x502a2*4+0x02000000,0x91e); +reg_write( DDR_REG_BASE +0x502a3*4+0x02000000,0x120); +reg_write( DDR_REG_BASE +0x502a4*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE +0x502a5*4+0x02000000,0xae6); +reg_write( DDR_REG_BASE +0x502a6*4+0x02000000,0x40); +reg_write( DDR_REG_BASE +0x502a7*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x502a8*4+0x02000000,0x7382); +reg_write( DDR_REG_BASE +0x502a9*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x502aa*4+0x02000000,0x6b4); +reg_write( DDR_REG_BASE +0x502ab*4+0x02000000,0xec6); +reg_write( DDR_REG_BASE +0x502ac*4+0x02000000,0x60); +reg_write( DDR_REG_BASE +0x502ad*4+0x02000000,0x4063); +reg_write( DDR_REG_BASE +0x502ae*4+0x02000000,0x906); +reg_write( DDR_REG_BASE +0x502af*4+0x02000000,0x120); +reg_write( DDR_REG_BASE +0x502b0*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE +0x502b1*4+0x02000000,0x289); +reg_write( DDR_REG_BASE +0x502b2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x502b3*4+0x02000000,0x22b); +reg_write( DDR_REG_BASE +0x502b4*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x502b5*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE +0x502b6*4+0x02000000,0xd840); +reg_write( DDR_REG_BASE +0x502b7*4+0x02000000,0x1453); +reg_write( DDR_REG_BASE +0x502b8*4+0x02000000,0x3083); +reg_write( DDR_REG_BASE +0x502b9*4+0x02000000,0x7824); +reg_write( DDR_REG_BASE +0x502ba*4+0x02000000,0x2553); +reg_write( DDR_REG_BASE +0x502bb*4+0x02000000,0x110c); +reg_write( DDR_REG_BASE +0x502bc*4+0x02000000,0x4338); +reg_write( DDR_REG_BASE +0x502bd*4+0x02000000,0x7c05); +reg_write( DDR_REG_BASE +0x502be*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE +0x502bf*4+0x02000000,0xf012); +reg_write( DDR_REG_BASE +0x502c0*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE +0x502c1*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE +0x502c2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x502c3*4+0x02000000,0x18c); +reg_write( DDR_REG_BASE +0x502c4*4+0x02000000,0x6049); +reg_write( DDR_REG_BASE +0x502c5*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE +0x502c6*4+0x02000000,0x7144); +reg_write( DDR_REG_BASE +0x502c7*4+0x02000000,0x211a); +reg_write( DDR_REG_BASE +0x502c8*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE +0x502c9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x502ca*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE +0x502cb*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE +0x502cc*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE +0x502cd*4+0x02000000,0xb89c); +reg_write( DDR_REG_BASE +0x502ce*4+0x02000000,0xb89f); +reg_write( DDR_REG_BASE +0x502cf*4+0x02000000,0xb080); +reg_write( DDR_REG_BASE +0x502d0*4+0x02000000,0xae1); +reg_write( DDR_REG_BASE +0x502d1*4+0x02000000,0x80c4); +reg_write( DDR_REG_BASE +0x502d2*4+0x02000000,0x8d2); +reg_write( DDR_REG_BASE +0x502d3*4+0x02000000,0x80); +reg_write( DDR_REG_BASE +0x502d4*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE +0x502d5*4+0x02000000,0x7bcf); +reg_write( DDR_REG_BASE +0x502d6*4+0x02000000,0xc18d); +reg_write( DDR_REG_BASE +0x502d7*4+0x02000000,0xb9a); +reg_write( DDR_REG_BASE +0x502d8*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE +0x502d9*4+0x02000000,0xc293); +reg_write( DDR_REG_BASE +0x502da*4+0x02000000,0xeeb); +reg_write( DDR_REG_BASE +0x502db*4+0x02000000,0x1010); +reg_write( DDR_REG_BASE +0x502dc*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE +0x502dd*4+0x02000000,0xe838); +reg_write( DDR_REG_BASE +0x502de*4+0x02000000,0xc40d); +reg_write( DDR_REG_BASE +0x502df*4+0x02000000,0x2456); +reg_write( DDR_REG_BASE +0x502e0*4+0x02000000,0x3d82); +reg_write( DDR_REG_BASE +0x502e1*4+0x02000000,0x22f4); +reg_write( DDR_REG_BASE +0x502e2*4+0x02000000,0x343); +reg_write( DDR_REG_BASE +0x502e3*4+0x02000000,0x4081); +reg_write( DDR_REG_BASE +0x502e4*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE +0x502e5*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x502e6*4+0x02000000,0x245e); +reg_write( DDR_REG_BASE +0x502e7*4+0x02000000,0x1401); +reg_write( DDR_REG_BASE +0x502e8*4+0x02000000,0x7263); +reg_write( DDR_REG_BASE +0x502e9*4+0x02000000,0x2144); +reg_write( DDR_REG_BASE +0x502ea*4+0x02000000,0x401); +reg_write( DDR_REG_BASE +0x502eb*4+0x02000000,0x2084); +reg_write( DDR_REG_BASE +0x502ec*4+0x02000000,0x8); +reg_write( DDR_REG_BASE +0x502ed*4+0x02000000,0x7965); +reg_write( DDR_REG_BASE +0x502ee*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE +0x502ef*4+0x02000000,0xb200); +reg_write( DDR_REG_BASE +0x502f0*4+0x02000000,0x789d); +reg_write( DDR_REG_BASE +0x502f1*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x502f2*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x502f3*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x502f4*4+0x02000000,0x238a); +reg_write( DDR_REG_BASE +0x502f5*4+0x02000000,0x8); +reg_write( DDR_REG_BASE +0x502f6*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE +0x502f7*4+0x02000000,0x401); +reg_write( DDR_REG_BASE +0x502f8*4+0x02000000,0x1240); +reg_write( DDR_REG_BASE +0x502f9*4+0x02000000,0x100); +reg_write( DDR_REG_BASE +0x502fa*4+0x02000000,0x7b84); +reg_write( DDR_REG_BASE +0x502fb*4+0x02000000,0x7965); +reg_write( DDR_REG_BASE +0x502fc*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE +0x502fd*4+0x02000000,0x1a40); +reg_write( DDR_REG_BASE +0x502fe*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x502ff*4+0x02000000,0x4081); +reg_write( DDR_REG_BASE +0x50300*4+0x02000000,0xd908); +reg_write( DDR_REG_BASE +0x50301*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE +0x50302*4+0x02000000,0x9ff); +reg_write( DDR_REG_BASE +0x50303*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE +0x50304*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x50305*4+0x02000000,0xd90c); +reg_write( DDR_REG_BASE +0x50306*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE +0x50307*4+0x02000000,0x901); +reg_write( DDR_REG_BASE +0x50308*4+0x02000000,0x31); +reg_write( DDR_REG_BASE +0x50309*4+0x02000000,0x7c9d); +reg_write( DDR_REG_BASE +0x5030a*4+0x02000000,0x2084); +reg_write( DDR_REG_BASE +0x5030b*4+0x02000000,0x8); +reg_write( DDR_REG_BASE +0x5030c*4+0x02000000,0x2444); +reg_write( DDR_REG_BASE +0x5030d*4+0x02000000,0x1401); +reg_write( DDR_REG_BASE +0x5030e*4+0x02000000,0x7905); +reg_write( DDR_REG_BASE +0x5030f*4+0x02000000,0x1280); +reg_write( DDR_REG_BASE +0x50310*4+0x02000000,0x100); +reg_write( DDR_REG_BASE +0x50311*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE +0x50312*4+0x02000000,0x1a80); +reg_write( DDR_REG_BASE +0x50313*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x50314*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE +0x50315*4+0x02000000,0x7014); +reg_write( DDR_REG_BASE +0x50316*4+0x02000000,0xf2b0); +reg_write( DDR_REG_BASE +0x50317*4+0x02000000,0xc113); +reg_write( DDR_REG_BASE +0x50318*4+0x02000000,0x228a); +reg_write( DDR_REG_BASE +0x50319*4+0x02000000,0x8); +reg_write( DDR_REG_BASE +0x5031a*4+0x02000000,0xdc0c); +reg_write( DDR_REG_BASE +0x5031b*4+0x02000000,0x783d); +reg_write( DDR_REG_BASE +0x5031c*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x5031d*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x5031e*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x5031f*4+0x02000000,0x7a24); +reg_write( DDR_REG_BASE +0x50320*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE +0x50321*4+0x02000000,0x400); +reg_write( DDR_REG_BASE +0x50322*4+0x02000000,0x7845); +reg_write( DDR_REG_BASE +0x50323*4+0x02000000,0x2456); +reg_write( DDR_REG_BASE +0x50324*4+0x02000000,0x3d82); +reg_write( DDR_REG_BASE +0x50325*4+0x02000000,0x7263); +reg_write( DDR_REG_BASE +0x50326*4+0x02000000,0x2255); +reg_write( DDR_REG_BASE +0x50327*4+0x02000000,0xc02); +reg_write( DDR_REG_BASE +0x50328*4+0x02000000,0x1240); +reg_write( DDR_REG_BASE +0x50329*4+0x02000000,0x103); +reg_write( DDR_REG_BASE +0x5032a*4+0x02000000,0x7865); +reg_write( DDR_REG_BASE +0x5032b*4+0x02000000,0x1a40); +reg_write( DDR_REG_BASE +0x5032c*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x5032d*4+0x02000000,0x4020); +reg_write( DDR_REG_BASE +0x5032e*4+0x02000000,0xdb08); +reg_write( DDR_REG_BASE +0x5032f*4+0x02000000,0xbb61); +reg_write( DDR_REG_BASE +0x50330*4+0x02000000,0xbff); +reg_write( DDR_REG_BASE +0x50331*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE +0x50332*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x50333*4+0x02000000,0x4320); +reg_write( DDR_REG_BASE +0x50334*4+0x02000000,0xbc61); +reg_write( DDR_REG_BASE +0x50335*4+0x02000000,0xc01); +reg_write( DDR_REG_BASE +0x50336*4+0x02000000,0x1031); +reg_write( DDR_REG_BASE +0x50337*4+0x02000000,0x7b7d); +reg_write( DDR_REG_BASE +0x50338*4+0x02000000,0x2084); +reg_write( DDR_REG_BASE +0x50339*4+0x02000000,0x8); +reg_write( DDR_REG_BASE +0x5033a*4+0x02000000,0x2344); +reg_write( DDR_REG_BASE +0x5033b*4+0x02000000,0x403); +reg_write( DDR_REG_BASE +0x5033c*4+0x02000000,0x7b05); +reg_write( DDR_REG_BASE +0x5033d*4+0x02000000,0x1280); +reg_write( DDR_REG_BASE +0x5033e*4+0x02000000,0x100); +reg_write( DDR_REG_BASE +0x5033f*4+0x02000000,0x7865); +reg_write( DDR_REG_BASE +0x50340*4+0x02000000,0x1a80); +reg_write( DDR_REG_BASE +0x50341*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x50342*4+0x02000000,0x215e); +reg_write( DDR_REG_BASE +0x50343*4+0x02000000,0x400); +reg_write( DDR_REG_BASE +0x50344*4+0x02000000,0x219a); +reg_write( DDR_REG_BASE +0x50345*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x50346*4+0x02000000,0x9260); +reg_write( DDR_REG_BASE +0x50347*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE +0x50348*4+0x02000000,0x400); +reg_write( DDR_REG_BASE +0x50349*4+0x02000000,0x2184); +reg_write( DDR_REG_BASE +0x5034a*4+0x02000000,0x8); +reg_write( DDR_REG_BASE +0x5034b*4+0x02000000,0x7865); +reg_write( DDR_REG_BASE +0x5034c*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE +0x5034d*4+0x02000000,0xb200); +reg_write( DDR_REG_BASE +0x5034e*4+0x02000000,0xf078); +reg_write( DDR_REG_BASE +0x5034f*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE +0x50350*4+0x02000000,0xe83a); +reg_write( DDR_REG_BASE +0x50351*4+0x02000000,0xc40d); +reg_write( DDR_REG_BASE +0x50352*4+0x02000000,0x2456); +reg_write( DDR_REG_BASE +0x50353*4+0x02000000,0x3d83); +reg_write( DDR_REG_BASE +0x50354*4+0x02000000,0x23f4); +reg_write( DDR_REG_BASE +0x50355*4+0x02000000,0x342); +reg_write( DDR_REG_BASE +0x50356*4+0x02000000,0x789b); +reg_write( DDR_REG_BASE +0x50357*4+0x02000000,0x2453); +reg_write( DDR_REG_BASE +0x50358*4+0x02000000,0x10c1); +reg_write( DDR_REG_BASE +0x50359*4+0x02000000,0x2084); +reg_write( DDR_REG_BASE +0x5035a*4+0x02000000,0x807); +reg_write( DDR_REG_BASE +0x5035b*4+0x02000000,0x7945); +reg_write( DDR_REG_BASE +0x5035c*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE +0x5035d*4+0x02000000,0x7363); +reg_write( DDR_REG_BASE +0x5035e*4+0x02000000,0xb300); +reg_write( DDR_REG_BASE +0x5035f*4+0x02000000,0x789d); +reg_write( DDR_REG_BASE +0x50360*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x50361*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x50362*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x50363*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x50364*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x50365*4+0x02000000,0x4181); +reg_write( DDR_REG_BASE +0x50366*4+0x02000000,0xda08); +reg_write( DDR_REG_BASE +0x50367*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x50368*4+0x02000000,0xba61); +reg_write( DDR_REG_BASE +0x50369*4+0x02000000,0xa01); +reg_write( DDR_REG_BASE +0x5036a*4+0x02000000,0x31); +reg_write( DDR_REG_BASE +0x5036b*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE +0x5036c*4+0x02000000,0x2084); +reg_write( DDR_REG_BASE +0x5036d*4+0x02000000,0x807); +reg_write( DDR_REG_BASE +0x5036e*4+0x02000000,0xb9c3); +reg_write( DDR_REG_BASE +0x5036f*4+0x02000000,0x7905); +reg_write( DDR_REG_BASE +0x50370*4+0x02000000,0x1340); +reg_write( DDR_REG_BASE +0x50371*4+0x02000000,0x100); +reg_write( DDR_REG_BASE +0x50372*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE +0x50373*4+0x02000000,0x1b40); +reg_write( DDR_REG_BASE +0x50374*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x50375*4+0x02000000,0x4081); +reg_write( DDR_REG_BASE +0x50376*4+0x02000000,0xd910); +reg_write( DDR_REG_BASE +0x50377*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE +0x50378*4+0x02000000,0x9ff); +reg_write( DDR_REG_BASE +0x50379*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE +0x5037a*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x5037b*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE +0x5037c*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE +0x5037d*4+0x02000000,0x901); +reg_write( DDR_REG_BASE +0x5037e*4+0x02000000,0x31); +reg_write( DDR_REG_BASE +0x5037f*4+0x02000000,0x7c9d); +reg_write( DDR_REG_BASE +0x50380*4+0x02000000,0x2084); +reg_write( DDR_REG_BASE +0x50381*4+0x02000000,0xc03); +reg_write( DDR_REG_BASE +0x50382*4+0x02000000,0x2444); +reg_write( DDR_REG_BASE +0x50383*4+0x02000000,0x1781); +reg_write( DDR_REG_BASE +0x50384*4+0x02000000,0x7905); +reg_write( DDR_REG_BASE +0x50385*4+0x02000000,0x1380); +reg_write( DDR_REG_BASE +0x50386*4+0x02000000,0x100); +reg_write( DDR_REG_BASE +0x50387*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE +0x50388*4+0x02000000,0x1b80); +reg_write( DDR_REG_BASE +0x50389*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x5038a*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE +0x5038b*4+0x02000000,0xe83c); +reg_write( DDR_REG_BASE +0x5038c*4+0x02000000,0xc213); +reg_write( DDR_REG_BASE +0x5038d*4+0x02000000,0xdb08); +reg_write( DDR_REG_BASE +0x5038e*4+0x02000000,0xdc0f); +reg_write( DDR_REG_BASE +0x5038f*4+0x02000000,0x785d); +reg_write( DDR_REG_BASE +0x50390*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x50391*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x50392*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x50393*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x50394*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x50395*4+0x02000000,0x4140); +reg_write( DDR_REG_BASE +0x50396*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x50397*4+0x02000000,0xbb61); +reg_write( DDR_REG_BASE +0x50398*4+0x02000000,0xbff); +reg_write( DDR_REG_BASE +0x50399*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE +0x5039a*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE +0x5039b*4+0x02000000,0x2084); +reg_write( DDR_REG_BASE +0x5039c*4+0x02000000,0x807); +reg_write( DDR_REG_BASE +0x5039d*4+0x02000000,0xb9c3); +reg_write( DDR_REG_BASE +0x5039e*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE +0x5039f*4+0x02000000,0x2456); +reg_write( DDR_REG_BASE +0x503a0*4+0x02000000,0x3d81); +reg_write( DDR_REG_BASE +0x503a1*4+0x02000000,0x7163); +reg_write( DDR_REG_BASE +0x503a2*4+0x02000000,0x2155); +reg_write( DDR_REG_BASE +0x503a3*4+0x02000000,0xc01); +reg_write( DDR_REG_BASE +0x503a4*4+0x02000000,0x1140); +reg_write( DDR_REG_BASE +0x503a5*4+0x02000000,0x103); +reg_write( DDR_REG_BASE +0x503a6*4+0x02000000,0x7865); +reg_write( DDR_REG_BASE +0x503a7*4+0x02000000,0x1940); +reg_write( DDR_REG_BASE +0x503a8*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x503a9*4+0x02000000,0x4040); +reg_write( DDR_REG_BASE +0x503aa*4+0x02000000,0xdb10); +reg_write( DDR_REG_BASE +0x503ab*4+0x02000000,0xbb61); +reg_write( DDR_REG_BASE +0x503ac*4+0x02000000,0xbff); +reg_write( DDR_REG_BASE +0x503ad*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE +0x503ae*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x503af*4+0x02000000,0x4340); +reg_write( DDR_REG_BASE +0x503b0*4+0x02000000,0xbc61); +reg_write( DDR_REG_BASE +0x503b1*4+0x02000000,0xc01); +reg_write( DDR_REG_BASE +0x503b2*4+0x02000000,0x1031); +reg_write( DDR_REG_BASE +0x503b3*4+0x02000000,0x7b7d); +reg_write( DDR_REG_BASE +0x503b4*4+0x02000000,0x2084); +reg_write( DDR_REG_BASE +0x503b5*4+0x02000000,0xc03); +reg_write( DDR_REG_BASE +0x503b6*4+0x02000000,0x2344); +reg_write( DDR_REG_BASE +0x503b7*4+0x02000000,0x783); +reg_write( DDR_REG_BASE +0x503b8*4+0x02000000,0x7b05); +reg_write( DDR_REG_BASE +0x503b9*4+0x02000000,0x1180); +reg_write( DDR_REG_BASE +0x503ba*4+0x02000000,0x100); +reg_write( DDR_REG_BASE +0x503bb*4+0x02000000,0x7865); +reg_write( DDR_REG_BASE +0x503bc*4+0x02000000,0x1980); +reg_write( DDR_REG_BASE +0x503bd*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x503be*4+0x02000000,0x9100); +reg_write( DDR_REG_BASE +0x503bf*4+0x02000000,0x7b5b); +reg_write( DDR_REG_BASE +0x503c0*4+0x02000000,0xbac3); +reg_write( DDR_REG_BASE +0x503c1*4+0x02000000,0x2384); +reg_write( DDR_REG_BASE +0x503c2*4+0x02000000,0x807); +reg_write( DDR_REG_BASE +0x503c3*4+0x02000000,0x7845); +reg_write( DDR_REG_BASE +0x503c4*4+0x02000000,0x7865); +reg_write( DDR_REG_BASE +0x503c5*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE +0x503c6*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE +0x503c7*4+0x02000000,0xe5c0); +reg_write( DDR_REG_BASE +0x503c8*4+0x02000000,0x5dc); +reg_write( DDR_REG_BASE +0x503c9*4+0x02000000,0xffe5); +reg_write( DDR_REG_BASE +0x503ca*4+0x02000000,0x79bb); +reg_write( DDR_REG_BASE +0x503cb*4+0x02000000,0xeea9); +reg_write( DDR_REG_BASE +0x503cc*4+0x02000000,0xeca); +reg_write( DDR_REG_BASE +0x503cd*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE +0x503ce*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE +0x503cf*4+0x02000000,0xfe2); +reg_write( DDR_REG_BASE +0x503d0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x503d1*4+0x02000000,0xec2); +reg_write( DDR_REG_BASE +0x503d2*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE +0x503d3*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE +0x503d4*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE +0x503d5*4+0x02000000,0xd930); +reg_write( DDR_REG_BASE +0x503d6*4+0x02000000,0xbc6); +reg_write( DDR_REG_BASE +0x503d7*4+0x02000000,0x1e0); +reg_write( DDR_REG_BASE +0x503d8*4+0x02000000,0xdac0); +reg_write( DDR_REG_BASE +0x503d9*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE +0x503da*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x503db*4+0x02000000,0x774c); +reg_write( DDR_REG_BASE +0x503dc*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE +0x503dd*4+0x02000000,0xfffe); +reg_write( DDR_REG_BASE +0x503de*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE +0x503df*4+0x02000000,0x90a0); +reg_write( DDR_REG_BASE +0x503e0*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE +0x503e1*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE +0x503e2*4+0x02000000,0x82e); +reg_write( DDR_REG_BASE +0x503e3*4+0x02000000,0x2a0); +reg_write( DDR_REG_BASE +0x503e4*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE +0x503e5*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE +0x503e6*4+0x02000000,0x2504); +reg_write( DDR_REG_BASE +0x503e7*4+0x02000000,0x1f8d); +reg_write( DDR_REG_BASE +0x503e8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x503e9*4+0x02000000,0xffbf); +reg_write( DDR_REG_BASE +0x503ea*4+0x02000000,0xb0a0); +reg_write( DDR_REG_BASE +0x503eb*4+0x02000000,0xe8e); +reg_write( DDR_REG_BASE +0x503ec*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE +0x503ed*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE +0x503ee*4+0x02000000,0x852); +reg_write( DDR_REG_BASE +0x503ef*4+0x02000000,0x40); +reg_write( DDR_REG_BASE +0x503f0*4+0x02000000,0xe82); +reg_write( DDR_REG_BASE +0x503f1*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE +0x503f2*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE +0x503f3*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE +0x503f4*4+0x02000000,0x72d5); +reg_write( DDR_REG_BASE +0x503f5*4+0x02000000,0x57e); +reg_write( DDR_REG_BASE +0x503f6*4+0x02000000,0xffc5); +reg_write( DDR_REG_BASE +0x503f7*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE +0x503f8*4+0x02000000,0x70cd); +reg_write( DDR_REG_BASE +0x503f9*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x503fa*4+0x02000000,0x7043); +reg_write( DDR_REG_BASE +0x503fb*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x503fc*4+0x02000000,0x6b4); +reg_write( DDR_REG_BASE +0x503fd*4+0x02000000,0xe7e); +reg_write( DDR_REG_BASE +0x503fe*4+0x02000000,0x60); +reg_write( DDR_REG_BASE +0x503ff*4+0x02000000,0xb0c0); +reg_write( DDR_REG_BASE +0x50400*4+0x02000000,0xe62); +reg_write( DDR_REG_BASE +0x50401*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE +0x50402*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE +0x50403*4+0x02000000,0xf7a); +reg_write( DDR_REG_BASE +0x50404*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50405*4+0x02000000,0xe5a); +reg_write( DDR_REG_BASE +0x50406*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE +0x50407*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE +0x50408*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE +0x50409*4+0x02000000,0xd92a); +reg_write( DDR_REG_BASE +0x5040a*4+0x02000000,0xb5e); +reg_write( DDR_REG_BASE +0x5040b*4+0x02000000,0x1e0); +reg_write( DDR_REG_BASE +0x5040c*4+0x02000000,0xdaa8); +reg_write( DDR_REG_BASE +0x5040d*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE +0x5040e*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x5040f*4+0x02000000,0x774c); +reg_write( DDR_REG_BASE +0x50410*4+0x02000000,0x238a); +reg_write( DDR_REG_BASE +0x50411*4+0x02000000,0xfef); +reg_write( DDR_REG_BASE +0x50412*4+0x02000000,0x90a0); +reg_write( DDR_REG_BASE +0x50413*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE +0x50414*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE +0x50415*4+0x02000000,0xfca); +reg_write( DDR_REG_BASE +0x50416*4+0x02000000,0x260); +reg_write( DDR_REG_BASE +0x50417*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE +0x50418*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE +0x50419*4+0x02000000,0x2504); +reg_write( DDR_REG_BASE +0x5041a*4+0x02000000,0x1f8d); +reg_write( DDR_REG_BASE +0x5041b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5041c*4+0x02000000,0xffbf); +reg_write( DDR_REG_BASE +0x5041d*4+0x02000000,0xb0a0); +reg_write( DDR_REG_BASE +0x5041e*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x5041f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50420*4+0x02000000,0xbb8); +reg_write( DDR_REG_BASE +0x50421*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x50422*4+0x02000000,0x7384); +reg_write( DDR_REG_BASE +0x50423*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x50424*4+0x02000000,0xe048); +reg_write( DDR_REG_BASE +0x50425*4+0x02000000,0xe72); +reg_write( DDR_REG_BASE +0x50426*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE +0x50427*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x50428*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE +0x50429*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x5042a*4+0x02000000,0x94); +reg_write( DDR_REG_BASE +0x5042b*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x5042c*4+0x02000000,0x80a); +reg_write( DDR_REG_BASE +0x5042d*4+0x02000000,0x60); +reg_write( DDR_REG_BASE +0x5042e*4+0x02000000,0x42e1); +reg_write( DDR_REG_BASE +0x5042f*4+0x02000000,0xf0a5); +reg_write( DDR_REG_BASE +0x50430*4+0x02000000,0x2332); +reg_write( DDR_REG_BASE +0x50431*4+0x02000000,0x3380); +reg_write( DDR_REG_BASE +0x50432*4+0x02000000,0x208c); +reg_write( DDR_REG_BASE +0x50433*4+0x02000000,0x8fc3); +reg_write( DDR_REG_BASE +0x50434*4+0x02000000,0xf29e); +reg_write( DDR_REG_BASE +0x50435*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE +0x50436*4+0x02000000,0x899); +reg_write( DDR_REG_BASE +0x50437*4+0x02000000,0x30); +reg_write( DDR_REG_BASE +0x50438*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE +0x50439*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x5043a*4+0x02000000,0x95); +reg_write( DDR_REG_BASE +0x5043b*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x5043c*4+0x02000000,0xfea); +reg_write( DDR_REG_BASE +0x5043d*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x5043e*4+0x02000000,0x42c1); +reg_write( DDR_REG_BASE +0x5043f*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE +0x50440*4+0x02000000,0xf038); +reg_write( DDR_REG_BASE +0x50441*4+0x02000000,0x706c); +reg_write( DDR_REG_BASE +0x50442*4+0x02000000,0x708d); +reg_write( DDR_REG_BASE +0x50443*4+0x02000000,0xf019); +reg_write( DDR_REG_BASE +0x50444*4+0x02000000,0x2456); +reg_write( DDR_REG_BASE +0x50445*4+0x02000000,0x3d81); +reg_write( DDR_REG_BASE +0x50446*4+0x02000000,0x21f4); +reg_write( DDR_REG_BASE +0x50447*4+0x02000000,0x81); +reg_write( DDR_REG_BASE +0x50448*4+0x02000000,0x2644); +reg_write( DDR_REG_BASE +0x50449*4+0x02000000,0x17c3); +reg_write( DDR_REG_BASE +0x5044a*4+0x02000000,0x7144); +reg_write( DDR_REG_BASE +0x5044b*4+0x02000000,0xeb06); +reg_write( DDR_REG_BASE +0x5044c*4+0x02000000,0xbb61); +reg_write( DDR_REG_BASE +0x5044d*4+0x02000000,0xb01); +reg_write( DDR_REG_BASE +0x5044e*4+0x02000000,0x31); +reg_write( DDR_REG_BASE +0x5044f*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE +0x50450*4+0x02000000,0xb9c0); +reg_write( DDR_REG_BASE +0x50451*4+0x02000000,0x4320); +reg_write( DDR_REG_BASE +0x50452*4+0x02000000,0x2444); +reg_write( DDR_REG_BASE +0x50453*4+0x02000000,0x17c1); +reg_write( DDR_REG_BASE +0x50454*4+0x02000000,0xe905); +reg_write( DDR_REG_BASE +0x50455*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE +0x50456*4+0x02000000,0x9ff); +reg_write( DDR_REG_BASE +0x50457*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE +0x50458*4+0x02000000,0x7b7b); +reg_write( DDR_REG_BASE +0x50459*4+0x02000000,0x7185); +reg_write( DDR_REG_BASE +0x5045a*4+0x02000000,0x7b05); +reg_write( DDR_REG_BASE +0x5045b*4+0x02000000,0xcd5); +reg_write( DDR_REG_BASE +0x5045c*4+0x02000000,0x9234); +reg_write( DDR_REG_BASE +0x5045d*4+0x02000000,0x786f); +reg_write( DDR_REG_BASE +0x5045e*4+0x02000000,0x2332); +reg_write( DDR_REG_BASE +0x5045f*4+0x02000000,0x3382); +reg_write( DDR_REG_BASE +0x50460*4+0x02000000,0x2456); +reg_write( DDR_REG_BASE +0x50461*4+0x02000000,0x3c01); +reg_write( DDR_REG_BASE +0x50462*4+0x02000000,0x6149); +reg_write( DDR_REG_BASE +0x50463*4+0x02000000,0x215f); +reg_write( DDR_REG_BASE +0x50464*4+0x02000000,0x602); +reg_write( DDR_REG_BASE +0x50465*4+0x02000000,0xc198); +reg_write( DDR_REG_BASE +0x50466*4+0x02000000,0x6159); +reg_write( DDR_REG_BASE +0x50467*4+0x02000000,0x7abd); +reg_write( DDR_REG_BASE +0x50468*4+0x02000000,0x7a5d); +reg_write( DDR_REG_BASE +0x50469*4+0x02000000,0x7a5d); +reg_write( DDR_REG_BASE +0x5046a*4+0x02000000,0x623a); +reg_write( DDR_REG_BASE +0x5046b*4+0x02000000,0x8a20); +reg_write( DDR_REG_BASE +0x5046c*4+0x02000000,0x7965); +reg_write( DDR_REG_BASE +0x5046d*4+0x02000000,0xed2); +reg_write( DDR_REG_BASE +0x5046e*4+0x02000000,0x1a0); +reg_write( DDR_REG_BASE +0x5046f*4+0x02000000,0xaa20); +reg_write( DDR_REG_BASE +0x50470*4+0x02000000,0x4200); +reg_write( DDR_REG_BASE +0x50471*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x50472*4+0x02000000,0x96); +reg_write( DDR_REG_BASE +0x50473*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x50474*4+0x02000000,0xf7a); +reg_write( DDR_REG_BASE +0x50475*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x50476*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE +0x50477*4+0x02000000,0xe508); +reg_write( DDR_REG_BASE +0x50478*4+0x02000000,0xe5e0); +reg_write( DDR_REG_BASE +0x50479*4+0x02000000,0x792); +reg_write( DDR_REG_BASE +0x5047a*4+0x02000000,0xffe5); +reg_write( DDR_REG_BASE +0x5047b*4+0x02000000,0x42a1); +reg_write( DDR_REG_BASE +0x5047c*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x5047d*4+0x02000000,0x97); +reg_write( DDR_REG_BASE +0x5047e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5047f*4+0x02000000,0xf66); +reg_write( DDR_REG_BASE +0x50480*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x50481*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE +0x50482*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE +0x50483*4+0x02000000,0x8a1); +reg_write( DDR_REG_BASE +0x50484*4+0x02000000,0x30); +reg_write( DDR_REG_BASE +0x50485*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE +0x50486*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x50487*4+0x02000000,0x98); +reg_write( DDR_REG_BASE +0x50488*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x50489*4+0x02000000,0xf52); +reg_write( DDR_REG_BASE +0x5048a*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x5048b*4+0x02000000,0x42c1); +reg_write( DDR_REG_BASE +0x5048c*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE +0x5048d*4+0x02000000,0xf03c); +reg_write( DDR_REG_BASE +0x5048e*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE +0x5048f*4+0x02000000,0x708d); +reg_write( DDR_REG_BASE +0x50490*4+0x02000000,0xf019); +reg_write( DDR_REG_BASE +0x50491*4+0x02000000,0x2456); +reg_write( DDR_REG_BASE +0x50492*4+0x02000000,0x3d81); +reg_write( DDR_REG_BASE +0x50493*4+0x02000000,0x7974); +reg_write( DDR_REG_BASE +0x50494*4+0x02000000,0x11c0); +reg_write( DDR_REG_BASE +0x50495*4+0x02000000,0x101); +reg_write( DDR_REG_BASE +0x50496*4+0x02000000,0x2644); +reg_write( DDR_REG_BASE +0x50497*4+0x02000000,0x17c2); +reg_write( DDR_REG_BASE +0x50498*4+0x02000000,0x7164); +reg_write( DDR_REG_BASE +0x50499*4+0x02000000,0xea06); +reg_write( DDR_REG_BASE +0x5049a*4+0x02000000,0xba61); +reg_write( DDR_REG_BASE +0x5049b*4+0x02000000,0xa01); +reg_write( DDR_REG_BASE +0x5049c*4+0x02000000,0x31); +reg_write( DDR_REG_BASE +0x5049d*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE +0x5049e*4+0x02000000,0xb9c0); +reg_write( DDR_REG_BASE +0x5049f*4+0x02000000,0x4220); +reg_write( DDR_REG_BASE +0x504a0*4+0x02000000,0x2444); +reg_write( DDR_REG_BASE +0x504a1*4+0x02000000,0x17c1); +reg_write( DDR_REG_BASE +0x504a2*4+0x02000000,0xe905); +reg_write( DDR_REG_BASE +0x504a3*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE +0x504a4*4+0x02000000,0x9ff); +reg_write( DDR_REG_BASE +0x504a5*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE +0x504a6*4+0x02000000,0x7a5b); +reg_write( DDR_REG_BASE +0x504a7*4+0x02000000,0x7185); +reg_write( DDR_REG_BASE +0x504a8*4+0x02000000,0x7a05); +reg_write( DDR_REG_BASE +0x504a9*4+0x02000000,0xcd3); +reg_write( DDR_REG_BASE +0x504aa*4+0x02000000,0x9234); +reg_write( DDR_REG_BASE +0x504ab*4+0x02000000,0x784f); +reg_write( DDR_REG_BASE +0x504ac*4+0x02000000,0x2456); +reg_write( DDR_REG_BASE +0x504ad*4+0x02000000,0x3cc1); +reg_write( DDR_REG_BASE +0x504ae*4+0x02000000,0x61d9); +reg_write( DDR_REG_BASE +0x504af*4+0x02000000,0x896c); +reg_write( DDR_REG_BASE +0x504b0*4+0x02000000,0x2456); +reg_write( DDR_REG_BASE +0x504b1*4+0x02000000,0x3c01); +reg_write( DDR_REG_BASE +0x504b2*4+0x02000000,0x6169); +reg_write( DDR_REG_BASE +0x504b3*4+0x02000000,0x215f); +reg_write( DDR_REG_BASE +0x504b4*4+0x02000000,0x603); +reg_write( DDR_REG_BASE +0x504b5*4+0x02000000,0xc198); +reg_write( DDR_REG_BASE +0x504b6*4+0x02000000,0x6179); +reg_write( DDR_REG_BASE +0x504b7*4+0x02000000,0x7bbd); +reg_write( DDR_REG_BASE +0x504b8*4+0x02000000,0x7b7d); +reg_write( DDR_REG_BASE +0x504b9*4+0x02000000,0x7b7d); +reg_write( DDR_REG_BASE +0x504ba*4+0x02000000,0x633b); +reg_write( DDR_REG_BASE +0x504bb*4+0x02000000,0x8b20); +reg_write( DDR_REG_BASE +0x504bc*4+0x02000000,0x7945); +reg_write( DDR_REG_BASE +0x504bd*4+0x02000000,0xe32); +reg_write( DDR_REG_BASE +0x504be*4+0x02000000,0x1a0); +reg_write( DDR_REG_BASE +0x504bf*4+0x02000000,0xab20); +reg_write( DDR_REG_BASE +0x504c0*4+0x02000000,0x4200); +reg_write( DDR_REG_BASE +0x504c1*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x504c2*4+0x02000000,0x99); +reg_write( DDR_REG_BASE +0x504c3*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x504c4*4+0x02000000,0xeda); +reg_write( DDR_REG_BASE +0x504c5*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x504c6*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE +0x504c7*4+0x02000000,0xe508); +reg_write( DDR_REG_BASE +0x504c8*4+0x02000000,0xe5e0); +reg_write( DDR_REG_BASE +0x504c9*4+0x02000000,0x78c); +reg_write( DDR_REG_BASE +0x504ca*4+0x02000000,0xffe5); +reg_write( DDR_REG_BASE +0x504cb*4+0x02000000,0x43a1); +reg_write( DDR_REG_BASE +0x504cc*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x504cd*4+0x02000000,0x9a); +reg_write( DDR_REG_BASE +0x504ce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x504cf*4+0x02000000,0xec6); +reg_write( DDR_REG_BASE +0x504d0*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x504d1*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE +0x504d2*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE +0x504d3*4+0x02000000,0xe689); +reg_write( DDR_REG_BASE +0x504d4*4+0x02000000,0x6b8); +reg_write( DDR_REG_BASE +0x504d5*4+0x02000000,0xffee); +reg_write( DDR_REG_BASE +0x504d6*4+0x02000000,0x2456); +reg_write( DDR_REG_BASE +0x504d7*4+0x02000000,0x3cdb); +reg_write( DDR_REG_BASE +0x504d8*4+0x02000000,0x71e5); +reg_write( DDR_REG_BASE +0x504d9*4+0x02000000,0x72f5); +reg_write( DDR_REG_BASE +0x504da*4+0x02000000,0x2a2); +reg_write( DDR_REG_BASE +0x504db*4+0x02000000,0xffe5); +reg_write( DDR_REG_BASE +0x504dc*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE +0x504dd*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE +0x504de*4+0x02000000,0xcba); +reg_write( DDR_REG_BASE +0x504df*4+0x02000000,0x60); +reg_write( DDR_REG_BASE +0x504e0*4+0x02000000,0xb0a0); +reg_write( DDR_REG_BASE +0x504e1*4+0x02000000,0xf0c1); +reg_write( DDR_REG_BASE +0x504e2*4+0x02000000,0x1453); +reg_write( DDR_REG_BASE +0x504e3*4+0x02000000,0x308e); +reg_write( DDR_REG_BASE +0x504e4*4+0x02000000,0x706f); +reg_write( DDR_REG_BASE +0x504e5*4+0x02000000,0xf062); +reg_write( DDR_REG_BASE +0x504e6*4+0x02000000,0xc095); +reg_write( DDR_REG_BASE +0x504e7*4+0x02000000,0x2032); +reg_write( DDR_REG_BASE +0x504e8*4+0x02000000,0x6c0); +reg_write( DDR_REG_BASE +0x504e9*4+0x02000000,0xdbb); +reg_write( DDR_REG_BASE +0x504ea*4+0x02000000,0x1021); +reg_write( DDR_REG_BASE +0x504eb*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x504ec*4+0x02000000,0xdbff); +reg_write( DDR_REG_BASE +0x504ed*4+0x02000000,0x708d); +reg_write( DDR_REG_BASE +0x504ee*4+0x02000000,0x4718); +reg_write( DDR_REG_BASE +0x504ef*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE +0x504f0*4+0x02000000,0xf031); +reg_write( DDR_REG_BASE +0x504f1*4+0x02000000,0xf20f); +reg_write( DDR_REG_BASE +0x504f2*4+0x02000000,0x2144); +reg_write( DDR_REG_BASE +0x504f3*4+0x02000000,0x7ca); +reg_write( DDR_REG_BASE +0x504f4*4+0x02000000,0x41e3); +reg_write( DDR_REG_BASE +0x504f5*4+0x02000000,0xa11); +reg_write( DDR_REG_BASE +0x504f6*4+0x02000000,0x1010); +reg_write( DDR_REG_BASE +0x504f7*4+0x02000000,0x2242); +reg_write( DDR_REG_BASE +0x504f8*4+0x02000000,0x104a); +reg_write( DDR_REG_BASE +0x504f9*4+0x02000000,0xaff); +reg_write( DDR_REG_BASE +0x504fa*4+0x02000000,0x9031); +reg_write( DDR_REG_BASE +0x504fb*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE +0x504fc*4+0x02000000,0x2144); +reg_write( DDR_REG_BASE +0x504fd*4+0x02000000,0x4b); +reg_write( DDR_REG_BASE +0x504fe*4+0x02000000,0xf00e); +reg_write( DDR_REG_BASE +0x504ff*4+0x02000000,0x2454); +reg_write( DDR_REG_BASE +0x50500*4+0x02000000,0x3c0b); +reg_write( DDR_REG_BASE +0x50501*4+0x02000000,0x235a); +reg_write( DDR_REG_BASE +0x50502*4+0x02000000,0x3601); +reg_write( DDR_REG_BASE +0x50503*4+0x02000000,0x2300); +reg_write( DDR_REG_BASE +0x50504*4+0x02000000,0x104b); +reg_write( DDR_REG_BASE +0x50505*4+0x02000000,0x795d); +reg_write( DDR_REG_BASE +0x50506*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE +0x50507*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE +0x50508*4+0x02000000,0x2332); +reg_write( DDR_REG_BASE +0x50509*4+0x02000000,0x105f); +reg_write( DDR_REG_BASE +0x5050a*4+0x02000000,0x2744); +reg_write( DDR_REG_BASE +0x5050b*4+0x02000000,0x304b); +reg_write( DDR_REG_BASE +0x5050c*4+0x02000000,0x7970); +reg_write( DDR_REG_BASE +0x5050d*4+0x02000000,0x218c); +reg_write( DDR_REG_BASE +0x5050e*4+0x02000000,0x8fc3); +reg_write( DDR_REG_BASE +0x5050f*4+0x02000000,0xf408); +reg_write( DDR_REG_BASE +0x50510*4+0x02000000,0xb21); +reg_write( DDR_REG_BASE +0x50511*4+0x02000000,0x1031); +reg_write( DDR_REG_BASE +0x50512*4+0x02000000,0xdbff); +reg_write( DDR_REG_BASE +0x50513*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x50514*4+0x02000000,0x4340); +reg_write( DDR_REG_BASE +0x50515*4+0x02000000,0xf00c); +reg_write( DDR_REG_BASE +0x50516*4+0x02000000,0x7075); +reg_write( DDR_REG_BASE +0x50517*4+0x02000000,0x20c0); +reg_write( DDR_REG_BASE +0x50518*4+0x02000000,0x61); +reg_write( DDR_REG_BASE +0x50519*4+0x02000000,0xf208); +reg_write( DDR_REG_BASE +0x5051a*4+0x02000000,0x7910); +reg_write( DDR_REG_BASE +0x5051b*4+0x02000000,0x2108); +reg_write( DDR_REG_BASE +0x5051c*4+0x02000000,0x830c); +reg_write( DDR_REG_BASE +0x5051d*4+0x02000000,0x27ca); +reg_write( DDR_REG_BASE +0x5051e*4+0x02000000,0x10c9); +reg_write( DDR_REG_BASE +0x5051f*4+0x02000000,0xdbff); +reg_write( DDR_REG_BASE +0x50520*4+0x02000000,0x7144); +reg_write( DDR_REG_BASE +0x50521*4+0x02000000,0xe2e0); +reg_write( DDR_REG_BASE +0x50522*4+0x02000000,0x79e); +reg_write( DDR_REG_BASE +0x50523*4+0x02000000,0xffe5); +reg_write( DDR_REG_BASE +0x50524*4+0x02000000,0x2253); +reg_write( DDR_REG_BASE +0x50525*4+0x02000000,0x8081); +reg_write( DDR_REG_BASE +0x50526*4+0x02000000,0x262f); +reg_write( DDR_REG_BASE +0x50527*4+0x02000000,0xf008); +reg_write( DDR_REG_BASE +0x50528*4+0x02000000,0x2479); +reg_write( DDR_REG_BASE +0x50529*4+0x02000000,0x1001); +reg_write( DDR_REG_BASE +0x5052a*4+0x02000000,0x21c5); +reg_write( DDR_REG_BASE +0x5052b*4+0x02000000,0x61); +reg_write( DDR_REG_BASE +0x5052c*4+0x02000000,0x7034); +reg_write( DDR_REG_BASE +0x5052d*4+0x02000000,0x709d); +reg_write( DDR_REG_BASE +0x5052e*4+0x02000000,0x262f); +reg_write( DDR_REG_BASE +0x5052f*4+0x02000000,0xf008); +reg_write( DDR_REG_BASE +0x50530*4+0x02000000,0xf213); +reg_write( DDR_REG_BASE +0x50531*4+0x02000000,0xb9e0); +reg_write( DDR_REG_BASE +0x50532*4+0x02000000,0x2004); +reg_write( DDR_REG_BASE +0x50533*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x50534*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50535*4+0x02000000,0xfffe); +reg_write( DDR_REG_BASE +0x50536*4+0x02000000,0x73fd); +reg_write( DDR_REG_BASE +0x50537*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x50538*4+0x02000000,0x6078); +reg_write( DDR_REG_BASE +0x50539*4+0x02000000,0xc18d); +reg_write( DDR_REG_BASE +0x5053a*4+0x02000000,0x208b); +reg_write( DDR_REG_BASE +0x5053b*4+0x02000000,0x8803); +reg_write( DDR_REG_BASE +0x5053c*4+0x02000000,0x7a0f); +reg_write( DDR_REG_BASE +0x5053d*4+0x02000000,0x2114); +reg_write( DDR_REG_BASE +0x5053e*4+0x02000000,0x6c1); +reg_write( DDR_REG_BASE +0x5053f*4+0x02000000,0x26ca); +reg_write( DDR_REG_BASE +0x50540*4+0x02000000,0x3061); +reg_write( DDR_REG_BASE +0x50541*4+0x02000000,0xb140); +reg_write( DDR_REG_BASE +0x50542*4+0x02000000,0xf003); +reg_write( DDR_REG_BASE +0x50543*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE +0x50544*4+0x02000000,0xc04a); +reg_write( DDR_REG_BASE +0x50545*4+0x02000000,0x7167); +reg_write( DDR_REG_BASE +0x50546*4+0x02000000,0xb41); +reg_write( DDR_REG_BASE +0x50547*4+0x02000000,0xb3a4); +reg_write( DDR_REG_BASE +0x50548*4+0x02000000,0x70ed); +reg_write( DDR_REG_BASE +0x50549*4+0x02000000,0xe77); +reg_write( DDR_REG_BASE +0x5054a*4+0x02000000,0x3030); +reg_write( DDR_REG_BASE +0x5054b*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x5054c*4+0x02000000,0xea5); +reg_write( DDR_REG_BASE +0x5054d*4+0x02000000,0x3071); +reg_write( DDR_REG_BASE +0x5054e*4+0x02000000,0x2456); +reg_write( DDR_REG_BASE +0x5054f*4+0x02000000,0x3cc0); +reg_write( DDR_REG_BASE +0x50550*4+0x02000000,0x255a); +reg_write( DDR_REG_BASE +0x50551*4+0x02000000,0x1301); +reg_write( DDR_REG_BASE +0x50552*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE +0x50553*4+0x02000000,0x9000); +reg_write( DDR_REG_BASE +0x50554*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50555*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50556*4+0x02000000,0x890a); +reg_write( DDR_REG_BASE +0x50557*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE +0x50558*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE +0x50559*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5055a*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE +0x5055b*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE +0x5055c*4+0x02000000,0x7845); +reg_write( DDR_REG_BASE +0x5055d*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE +0x5055e*4+0x02000000,0x7865); +reg_write( DDR_REG_BASE +0x5055f*4+0x02000000,0xda40); +reg_write( DDR_REG_BASE +0x50560*4+0x02000000,0xb040); +reg_write( DDR_REG_BASE +0x50561*4+0x02000000,0x890b); +reg_write( DDR_REG_BASE +0x50562*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE +0x50563*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE +0x50564*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50565*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE +0x50566*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE +0x50567*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE +0x50568*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE +0x50569*4+0x02000000,0x7865); +reg_write( DDR_REG_BASE +0x5056a*4+0x02000000,0xb040); +reg_write( DDR_REG_BASE +0x5056b*4+0x02000000,0xca01); +reg_write( DDR_REG_BASE +0x5056c*4+0x02000000,0x865); +reg_write( DDR_REG_BASE +0x5056d*4+0x02000000,0x311); +reg_write( DDR_REG_BASE +0x5056e*4+0x02000000,0x251a); +reg_write( DDR_REG_BASE +0x5056f*4+0x02000000,0x1f81); +reg_write( DDR_REG_BASE +0x50570*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50571*4+0x02000000,0xb000); +reg_write( DDR_REG_BASE +0x50572*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE +0x50573*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE +0x50574*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE +0x50575*4+0x02000000,0x7865); +reg_write( DDR_REG_BASE +0x50576*4+0x02000000,0xb040); +reg_write( DDR_REG_BASE +0x50577*4+0x02000000,0xf028); +reg_write( DDR_REG_BASE +0x50578*4+0x02000000,0x6028); +reg_write( DDR_REG_BASE +0x50579*4+0x02000000,0xd15); +reg_write( DDR_REG_BASE +0x5057a*4+0x02000000,0x1021); +reg_write( DDR_REG_BASE +0x5057b*4+0x02000000,0xc08d); +reg_write( DDR_REG_BASE +0x5057c*4+0x02000000,0x20f4); +reg_write( DDR_REG_BASE +0x5057d*4+0x02000000,0x42); +reg_write( DDR_REG_BASE +0x5057e*4+0x02000000,0x7834); +reg_write( DDR_REG_BASE +0x5057f*4+0x02000000,0x2242); +reg_write( DDR_REG_BASE +0x50580*4+0x02000000,0x802); +reg_write( DDR_REG_BASE +0x50581*4+0x02000000,0xb040); +reg_write( DDR_REG_BASE +0x50582*4+0x02000000,0x7124); +reg_write( DDR_REG_BASE +0x50583*4+0x02000000,0x9ed); +reg_write( DDR_REG_BASE +0x50584*4+0x02000000,0x83a4); +reg_write( DDR_REG_BASE +0x50585*4+0x02000000,0xc095); +reg_write( DDR_REG_BASE +0x50586*4+0x02000000,0xf018); +reg_write( DDR_REG_BASE +0x50587*4+0x02000000,0xc095); +reg_write( DDR_REG_BASE +0x50588*4+0x02000000,0x60e8); +reg_write( DDR_REG_BASE +0x50589*4+0x02000000,0xd2b); +reg_write( DDR_REG_BASE +0x5058a*4+0x02000000,0x1021); +reg_write( DDR_REG_BASE +0x5058b*4+0x02000000,0xc08d); +reg_write( DDR_REG_BASE +0x5058c*4+0x02000000,0x20f4); +reg_write( DDR_REG_BASE +0x5058d*4+0x02000000,0x3c1); +reg_write( DDR_REG_BASE +0x5058e*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE +0x5058f*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE +0x50590*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50591*4+0x02000000,0x18c); +reg_write( DDR_REG_BASE +0x50592*4+0x02000000,0x60e8); +reg_write( DDR_REG_BASE +0x50593*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE +0x50594*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE +0x50595*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50596*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE +0x50597*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE +0x50598*4+0x02000000,0x7845); +reg_write( DDR_REG_BASE +0x50599*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE +0x5059a*4+0x02000000,0xb89c); +reg_write( DDR_REG_BASE +0x5059b*4+0x02000000,0xb89f); +reg_write( DDR_REG_BASE +0x5059c*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE +0x5059d*4+0x02000000,0x71e5); +reg_write( DDR_REG_BASE +0x5059e*4+0x02000000,0xfd3); +reg_write( DDR_REG_BASE +0x5059f*4+0x02000000,0x9384); +reg_write( DDR_REG_BASE +0x505a0*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE +0x505a1*4+0x02000000,0x72b5); +reg_write( DDR_REG_BASE +0x505a2*4+0x02000000,0x680); +reg_write( DDR_REG_BASE +0x505a3*4+0x02000000,0xffe5); +reg_write( DDR_REG_BASE +0x505a4*4+0x02000000,0x264a); +reg_write( DDR_REG_BASE +0x505a5*4+0x02000000,0x3000); +reg_write( DDR_REG_BASE +0x505a6*4+0x02000000,0xc00a); +reg_write( DDR_REG_BASE +0x505a7*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x505a8*4+0x02000000,0xa9); +reg_write( DDR_REG_BASE +0x505a9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x505aa*4+0x02000000,0xd9a); +reg_write( DDR_REG_BASE +0x505ab*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE +0x505ac*4+0x02000000,0x2078); +reg_write( DDR_REG_BASE +0x505ad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x505ae*4+0x02000000,0xb1a); +reg_write( DDR_REG_BASE +0x505af*4+0x02000000,0x40); +reg_write( DDR_REG_BASE +0x505b0*4+0x02000000,0xc7e); +reg_write( DDR_REG_BASE +0x505b1*4+0x02000000,0x180); +reg_write( DDR_REG_BASE +0x505b2*4+0x02000000,0xc00b); +reg_write( DDR_REG_BASE +0x505b3*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x505b4*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE +0x505b5*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE +0x505b6*4+0x02000000,0xe0aa); +reg_write( DDR_REG_BASE +0x505b7*4+0x02000000,0x2480); +reg_write( DDR_REG_BASE +0x505b8*4+0x02000000,0x3c0c); +reg_write( DDR_REG_BASE +0x505b9*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE +0x505ba*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE +0x505bb*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE +0x505bc*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE +0x505bd*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE +0x505be*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE +0x505bf*4+0x02000000,0xc1b5); +reg_write( DDR_REG_BASE +0x505c0*4+0x02000000,0xc254); +reg_write( DDR_REG_BASE +0x505c1*4+0x02000000,0x4528); +reg_write( DDR_REG_BASE +0x505c2*4+0x02000000,0x4200); +reg_write( DDR_REG_BASE +0x505c3*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x505c4*4+0x02000000,0xee); +reg_write( DDR_REG_BASE +0x505c5*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x505c6*4+0x02000000,0xcd6); +reg_write( DDR_REG_BASE +0x505c7*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x505c8*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE +0x505c9*4+0x02000000,0x706f); +reg_write( DDR_REG_BASE +0x505ca*4+0x02000000,0xf035); +reg_write( DDR_REG_BASE +0x505cb*4+0x02000000,0x4261); +reg_write( DDR_REG_BASE +0x505cc*4+0x02000000,0xf009); +reg_write( DDR_REG_BASE +0x505cd*4+0x02000000,0xc014); +reg_write( DDR_REG_BASE +0x505ce*4+0x02000000,0x20f4); +reg_write( DDR_REG_BASE +0x505cf*4+0x02000000,0x83); +reg_write( DDR_REG_BASE +0x505d0*4+0x02000000,0xc08e); +reg_write( DDR_REG_BASE +0x505d1*4+0x02000000,0x7834); +reg_write( DDR_REG_BASE +0x505d2*4+0x02000000,0xb060); +reg_write( DDR_REG_BASE +0x505d3*4+0x02000000,0x62ba); +reg_write( DDR_REG_BASE +0x505d4*4+0x02000000,0x7124); +reg_write( DDR_REG_BASE +0x505d5*4+0x02000000,0x9f3); +reg_write( DDR_REG_BASE +0x505d6*4+0x02000000,0x8294); +reg_write( DDR_REG_BASE +0x505d7*4+0x02000000,0x4183); +reg_write( DDR_REG_BASE +0x505d8*4+0x02000000,0x911c); +reg_write( DDR_REG_BASE +0x505d9*4+0x02000000,0x1446); +reg_write( DDR_REG_BASE +0x505da*4+0x02000000,0x3103); +reg_write( DDR_REG_BASE +0x505db*4+0x02000000,0x915f); +reg_write( DDR_REG_BASE +0x505dc*4+0x02000000,0xc053); +reg_write( DDR_REG_BASE +0x505dd*4+0x02000000,0x1448); +reg_write( DDR_REG_BASE +0x505de*4+0x02000000,0x3101); +reg_write( DDR_REG_BASE +0x505df*4+0x02000000,0x144a); +reg_write( DDR_REG_BASE +0x505e0*4+0x02000000,0x3100); +reg_write( DDR_REG_BASE +0x505e1*4+0x02000000,0x143a); +reg_write( DDR_REG_BASE +0x505e2*4+0x02000000,0x311f); +reg_write( DDR_REG_BASE +0x505e3*4+0x02000000,0x143c); +reg_write( DDR_REG_BASE +0x505e4*4+0x02000000,0x311e); +reg_write( DDR_REG_BASE +0x505e5*4+0x02000000,0x1440); +reg_write( DDR_REG_BASE +0x505e6*4+0x02000000,0x310f); +reg_write( DDR_REG_BASE +0x505e7*4+0x02000000,0x1442); +reg_write( DDR_REG_BASE +0x505e8*4+0x02000000,0x310e); +reg_write( DDR_REG_BASE +0x505e9*4+0x02000000,0x1444); +reg_write( DDR_REG_BASE +0x505ea*4+0x02000000,0x310c); +reg_write( DDR_REG_BASE +0x505eb*4+0x02000000,0xc346); +reg_write( DDR_REG_BASE +0x505ec*4+0x02000000,0xc313); +reg_write( DDR_REG_BASE +0x505ed*4+0x02000000,0xc048); +reg_write( DDR_REG_BASE +0x505ee*4+0x02000000,0xc147); +reg_write( DDR_REG_BASE +0x505ef*4+0x02000000,0xc242); +reg_write( DDR_REG_BASE +0x505f0*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE +0x505f1*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x505f2*4+0x02000000,0xef); +reg_write( DDR_REG_BASE +0x505f3*4+0x02000000,0xb); +reg_write( DDR_REG_BASE +0x505f4*4+0x02000000,0xc445); +reg_write( DDR_REG_BASE +0x505f5*4+0x02000000,0xc644); +reg_write( DDR_REG_BASE +0x505f6*4+0x02000000,0xc743); +reg_write( DDR_REG_BASE +0x505f7*4+0x02000000,0x1c04); +reg_write( DDR_REG_BASE +0x505f8*4+0x02000000,0x3780); +reg_write( DDR_REG_BASE +0x505f9*4+0x02000000,0x1c00); +reg_write( DDR_REG_BASE +0x505fa*4+0x02000000,0x37c0); +reg_write( DDR_REG_BASE +0x505fb*4+0x02000000,0xc6e); +reg_write( DDR_REG_BASE +0x505fc*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x505fd*4+0x02000000,0x4261); +reg_write( DDR_REG_BASE +0x505fe*4+0x02000000,0x7167); +reg_write( DDR_REG_BASE +0x505ff*4+0x02000000,0x232f); +reg_write( DDR_REG_BASE +0x50600*4+0x02000000,0x16c8); +reg_write( DDR_REG_BASE +0x50601*4+0x02000000,0xb97); +reg_write( DDR_REG_BASE +0x50602*4+0x02000000,0x9364); +reg_write( DDR_REG_BASE +0x50603*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x50604*4+0x02000000,0xc0b5); +reg_write( DDR_REG_BASE +0x50605*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE +0x50606*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE +0x50607*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE +0x50608*4+0x02000000,0xc2e4); +reg_write( DDR_REG_BASE +0x50609*4+0x02000000,0x4308); +reg_write( DDR_REG_BASE +0x5060a*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE +0x5060b*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE +0x5060c*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE +0x5060d*4+0x02000000,0x1e4); +reg_write( DDR_REG_BASE +0x5060e*4+0x02000000,0x218c); +reg_write( DDR_REG_BASE +0x5060f*4+0x02000000,0x8fc3); +reg_write( DDR_REG_BASE +0x50610*4+0x02000000,0xb6a0); +reg_write( DDR_REG_BASE +0x50611*4+0x02000000,0xb6a1); +reg_write( DDR_REG_BASE +0x50612*4+0x02000000,0xb6a2); +reg_write( DDR_REG_BASE +0x50613*4+0x02000000,0xf224); +reg_write( DDR_REG_BASE +0x50614*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x50615*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE +0x50616*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x50617*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x50618*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE +0x50619*4+0x02000000,0xf83); +reg_write( DDR_REG_BASE +0x5061a*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x5061b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5061c*4+0x02000000,0x2305); +reg_write( DDR_REG_BASE +0x5061d*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x5061e*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE +0x5061f*4+0x02000000,0x40); +reg_write( DDR_REG_BASE +0x50620*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE +0x50621*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x50622*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x50623*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE +0x50624*4+0x02000000,0x8881); +reg_write( DDR_REG_BASE +0x50625*4+0x02000000,0x8800); +reg_write( DDR_REG_BASE +0x50626*4+0x02000000,0xf00c); +reg_write( DDR_REG_BASE +0x50627*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE +0x50628*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE +0x50629*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5062a*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE +0x5062b*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE +0x5062c*4+0x02000000,0x7a65); +reg_write( DDR_REG_BASE +0x5062d*4+0x02000000,0x2205); +reg_write( DDR_REG_BASE +0x5062e*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE +0x5062f*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE +0x50630*4+0x02000000,0x40); +reg_write( DDR_REG_BASE +0x50631*4+0x02000000,0xb220); +reg_write( DDR_REG_BASE +0x50632*4+0x02000000,0xceb); +reg_write( DDR_REG_BASE +0x50633*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE +0x50634*4+0x02000000,0xb76); +reg_write( DDR_REG_BASE +0x50635*4+0x02000000,0x180); +reg_write( DDR_REG_BASE +0x50636*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE +0x50637*4+0x02000000,0x21a); +reg_write( DDR_REG_BASE +0x50638*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x50639*4+0x02000000,0x900e); +reg_write( DDR_REG_BASE +0x5063a*4+0x02000000,0x2a); +reg_write( DDR_REG_BASE +0x5063b*4+0x02000000,0x1efc); +reg_write( DDR_REG_BASE +0x5063c*4+0x02000000,0x92c4); +reg_write( DDR_REG_BASE +0x5063d*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE +0x5063e*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x5063f*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x50640*4+0x02000000,0x440); +reg_write( DDR_REG_BASE +0x50641*4+0x02000000,0xa8a0); +reg_write( DDR_REG_BASE +0x50642*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x50643*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50644*4+0x02000000,0xfac); +reg_write( DDR_REG_BASE +0x50645*4+0x02000000,0xb101); +reg_write( DDR_REG_BASE +0x50646*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x50647*4+0x02000000,0xc6c4); +reg_write( DDR_REG_BASE +0x50648*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE +0x50649*4+0x02000000,0x7210); +reg_write( DDR_REG_BASE +0x5064a*4+0x02000000,0x20e0); +reg_write( DDR_REG_BASE +0x5064b*4+0x02000000,0x7ca); +reg_write( DDR_REG_BASE +0x5064c*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x5064d*4+0x02000000,0x7101); +reg_write( DDR_REG_BASE +0x5064e*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE +0x5064f*4+0x02000000,0x1d6); +reg_write( DDR_REG_BASE +0x50650*4+0x02000000,0x9f3); +reg_write( DDR_REG_BASE +0x50651*4+0x02000000,0x803e); +reg_write( DDR_REG_BASE +0x50652*4+0x02000000,0x7144); +reg_write( DDR_REG_BASE +0x50653*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE +0x50654*4+0x02000000,0xc2e2); +reg_write( DDR_REG_BASE +0x50655*4+0x02000000,0x4328); +reg_write( DDR_REG_BASE +0x50656*4+0x02000000,0x9ca); +reg_write( DDR_REG_BASE +0x50657*4+0x02000000,0x60); +reg_write( DDR_REG_BASE +0x50658*4+0x02000000,0x260a); +reg_write( DDR_REG_BASE +0x50659*4+0x02000000,0x3000); +reg_write( DDR_REG_BASE +0x5065a*4+0x02000000,0x45cb); +reg_write( DDR_REG_BASE +0x5065b*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE +0x5065c*4+0x02000000,0xf2); +reg_write( DDR_REG_BASE +0x5065d*4+0x02000000,0x1d00); +reg_write( DDR_REG_BASE +0x5065e*4+0x02000000,0x1045); +reg_write( DDR_REG_BASE +0x5065f*4+0x02000000,0x1d00); +reg_write( DDR_REG_BASE +0x50660*4+0x02000000,0x1005); +reg_write( DDR_REG_BASE +0x50661*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x50662*4+0x02000000,0x7784); +reg_write( DDR_REG_BASE +0x50663*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE +0x50664*4+0x02000000,0x1e2); +reg_write( DDR_REG_BASE +0x50665*4+0x02000000,0x99a); +reg_write( DDR_REG_BASE +0x50666*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE +0x50667*4+0x02000000,0x760c); +reg_write( DDR_REG_BASE +0x50668*4+0x02000000,0xb17); +reg_write( DDR_REG_BASE +0x50669*4+0x02000000,0x1030); +reg_write( DDR_REG_BASE +0x5066a*4+0x02000000,0x1d10); +reg_write( DDR_REG_BASE +0x5066b*4+0x02000000,0x1045); +reg_write( DDR_REG_BASE +0x5066c*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x5066d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5066e*4+0x02000000,0x61a8); +reg_write( DDR_REG_BASE +0x5066f*4+0x02000000,0xfb6); +reg_write( DDR_REG_BASE +0x50670*4+0x02000000,0xffcf); +reg_write( DDR_REG_BASE +0x50671*4+0x02000000,0x1d10); +reg_write( DDR_REG_BASE +0x50672*4+0x02000000,0x1005); +reg_write( DDR_REG_BASE +0x50673*4+0x02000000,0xc6c2); +reg_write( DDR_REG_BASE +0x50674*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE +0x50675*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE +0x50676*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE +0x50677*4+0x02000000,0xc1a2); +reg_write( DDR_REG_BASE +0x50678*4+0x02000000,0xc341); +reg_write( DDR_REG_BASE +0x50679*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x5067a*4+0x02000000,0x7083); +reg_write( DDR_REG_BASE +0x5067b*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x5067c*4+0x02000000,0x440); +reg_write( DDR_REG_BASE +0x5067d*4+0x02000000,0x208c); +reg_write( DDR_REG_BASE +0x5067e*4+0x02000000,0x8fc3); +reg_write( DDR_REG_BASE +0x5067f*4+0x02000000,0x4308); +reg_write( DDR_REG_BASE +0x50680*4+0x02000000,0x23ca); +reg_write( DDR_REG_BASE +0x50681*4+0x02000000,0x10c1); +reg_write( DDR_REG_BASE +0x50682*4+0x02000000,0xc30a); +reg_write( DDR_REG_BASE +0x50683*4+0x02000000,0x1424); +reg_write( DDR_REG_BASE +0x50684*4+0x02000000,0x301b); +reg_write( DDR_REG_BASE +0x50685*4+0x02000000,0xc508); +reg_write( DDR_REG_BASE +0x50686*4+0x02000000,0xc607); +reg_write( DDR_REG_BASE +0x50687*4+0x02000000,0x70ef); +reg_write( DDR_REG_BASE +0x50688*4+0x02000000,0xac5); +reg_write( DDR_REG_BASE +0x50689*4+0x02000000,0x171); +reg_write( DDR_REG_BASE +0x5068a*4+0x02000000,0xc340); +reg_write( DDR_REG_BASE +0x5068b*4+0x02000000,0x70ed); +reg_write( DDR_REG_BASE +0x5068c*4+0x02000000,0x706c); +reg_write( DDR_REG_BASE +0x5068d*4+0x02000000,0x262f); +reg_write( DDR_REG_BASE +0x5068e*4+0x02000000,0x3042); +reg_write( DDR_REG_BASE +0x5068f*4+0x02000000,0x2644); +reg_write( DDR_REG_BASE +0x50690*4+0x02000000,0x3e1f); +reg_write( DDR_REG_BASE +0x50691*4+0x02000000,0x214b); +reg_write( DDR_REG_BASE +0x50692*4+0x02000000,0x8c00); +reg_write( DDR_REG_BASE +0x50693*4+0x02000000,0xdc58); +reg_write( DDR_REG_BASE +0x50694*4+0x02000000,0x27cf); +reg_write( DDR_REG_BASE +0x50695*4+0x02000000,0x31e2); +reg_write( DDR_REG_BASE +0x50696*4+0x02000000,0x7c24); +reg_write( DDR_REG_BASE +0x50697*4+0x02000000,0x2684); +reg_write( DDR_REG_BASE +0x50698*4+0x02000000,0x3001); +reg_write( DDR_REG_BASE +0x50699*4+0x02000000,0x2405); +reg_write( DDR_REG_BASE +0x5069a*4+0x02000000,0x17cc); +reg_write( DDR_REG_BASE +0x5069b*4+0x02000000,0x2305); +reg_write( DDR_REG_BASE +0x5069c*4+0x02000000,0x783); +reg_write( DDR_REG_BASE +0x5069d*4+0x02000000,0x7b85); +reg_write( DDR_REG_BASE +0x5069e*4+0x02000000,0x7c3d); +reg_write( DDR_REG_BASE +0x5069f*4+0x02000000,0x7c9d); +reg_write( DDR_REG_BASE +0x506a0*4+0x02000000,0x7c9d); +reg_write( DDR_REG_BASE +0x506a1*4+0x02000000,0x239a); +reg_write( DDR_REG_BASE +0x506a2*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x506a3*4+0x02000000,0x2404); +reg_write( DDR_REG_BASE +0x506a4*4+0x02000000,0x1f9e); +reg_write( DDR_REG_BASE +0x506a5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x506a6*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE +0x506a7*4+0x02000000,0xc401); +reg_write( DDR_REG_BASE +0x506a8*4+0x02000000,0x272f); +reg_write( DDR_REG_BASE +0x506a9*4+0x02000000,0x32c0); +reg_write( DDR_REG_BASE +0x506aa*4+0x02000000,0x251a); +reg_write( DDR_REG_BASE +0x506ab*4+0x02000000,0x1f8d); +reg_write( DDR_REG_BASE +0x506ac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x506ad*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE +0x506ae*4+0x02000000,0x2405); +reg_write( DDR_REG_BASE +0x506af*4+0x02000000,0x178c); +reg_write( DDR_REG_BASE +0x506b0*4+0x02000000,0x2405); +reg_write( DDR_REG_BASE +0x506b1*4+0x02000000,0x10de); +reg_write( DDR_REG_BASE +0x506b2*4+0x02000000,0x44cb); +reg_write( DDR_REG_BASE +0x506b3*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE +0x506b4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x506b5*4+0x02000000,0x2705); +reg_write( DDR_REG_BASE +0x506b6*4+0x02000000,0x3303); +reg_write( DDR_REG_BASE +0x506b7*4+0x02000000,0x1b00); +reg_write( DDR_REG_BASE +0x506b8*4+0x02000000,0x784); +reg_write( DDR_REG_BASE +0x506b9*4+0x02000000,0x260a); +reg_write( DDR_REG_BASE +0x506ba*4+0x02000000,0x3040); +reg_write( DDR_REG_BASE +0x506bb*4+0x02000000,0x269a); +reg_write( DDR_REG_BASE +0x506bc*4+0x02000000,0x3004); +reg_write( DDR_REG_BASE +0x506bd*4+0x02000000,0x2353); +reg_write( DDR_REG_BASE +0x506be*4+0x02000000,0x30c3); +reg_write( DDR_REG_BASE +0x506bf*4+0x02000000,0x7be5); +reg_write( DDR_REG_BASE +0x506c0*4+0x02000000,0x7554); +reg_write( DDR_REG_BASE +0x506c1*4+0x02000000,0x2604); +reg_write( DDR_REG_BASE +0x506c2*4+0x02000000,0x3f9e); +reg_write( DDR_REG_BASE +0x506c3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x506c4*4+0x02000000,0xf00); +reg_write( DDR_REG_BASE +0x506c5*4+0x02000000,0x2505); +reg_write( DDR_REG_BASE +0x506c6*4+0x02000000,0x178d); +reg_write( DDR_REG_BASE +0x506c7*4+0x02000000,0x7d65); +reg_write( DDR_REG_BASE +0x506c8*4+0x02000000,0x2754); +reg_write( DDR_REG_BASE +0x506c9*4+0x02000000,0x3803); +reg_write( DDR_REG_BASE +0x506ca*4+0x02000000,0x2755); +reg_write( DDR_REG_BASE +0x506cb*4+0x02000000,0x3802); +reg_write( DDR_REG_BASE +0x506cc*4+0x02000000,0x7b85); +reg_write( DDR_REG_BASE +0x506cd*4+0x02000000,0x26c5); +reg_write( DDR_REG_BASE +0x506ce*4+0x02000000,0x1e21); +reg_write( DDR_REG_BASE +0x506cf*4+0x02000000,0x7a85); +reg_write( DDR_REG_BASE +0x506d0*4+0x02000000,0xb3a0); +reg_write( DDR_REG_BASE +0x506d1*4+0x02000000,0xb2c0); +reg_write( DDR_REG_BASE +0x506d2*4+0x02000000,0x2104); +reg_write( DDR_REG_BASE +0x506d3*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE +0x506d4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x506d5*4+0x02000000,0xff00); +reg_write( DDR_REG_BASE +0x506d6*4+0x02000000,0xc100); +reg_write( DDR_REG_BASE +0x506d7*4+0x02000000,0x208c); +reg_write( DDR_REG_BASE +0x506d8*4+0x02000000,0x8fc3); +reg_write( DDR_REG_BASE +0x506d9*4+0x02000000,0x7a25); +reg_write( DDR_REG_BASE +0x506da*4+0x02000000,0x2755); +reg_write( DDR_REG_BASE +0x506db*4+0x02000000,0x3c01); +reg_write( DDR_REG_BASE +0x506dc*4+0x02000000,0x7c25); +reg_write( DDR_REG_BASE +0x506dd*4+0x02000000,0x2340); +reg_write( DDR_REG_BASE +0x506de*4+0x02000000,0x1041); +reg_write( DDR_REG_BASE +0x506df*4+0x02000000,0xb440); +reg_write( DDR_REG_BASE +0x506e0*4+0x02000000,0xf405); +reg_write( DDR_REG_BASE +0x506e1*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x506e2*4+0x02000000,0x7042); +reg_write( DDR_REG_BASE +0x506e3*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x506e4*4+0x02000000,0x440); +reg_write( DDR_REG_BASE +0x506e5*4+0x02000000,0x782f); +reg_write( DDR_REG_BASE +0x506e6*4+0x02000000,0xc0a2); +reg_write( DDR_REG_BASE +0x506e7*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE +0x506e8*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE +0x506e9*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE +0x506ea*4+0x02000000,0xa0d); +reg_write( DDR_REG_BASE +0x506eb*4+0x02000000,0xf0); +reg_write( DDR_REG_BASE +0x506ec*4+0x02000000,0xdf10); +reg_write( DDR_REG_BASE +0x506ed*4+0x02000000,0xa09); +reg_write( DDR_REG_BASE +0x506ee*4+0x02000000,0x310); +reg_write( DDR_REG_BASE +0x506ef*4+0x02000000,0x70ed); +reg_write( DDR_REG_BASE +0x506f0*4+0x02000000,0xa57); +reg_write( DDR_REG_BASE +0x506f1*4+0x02000000,0x5f5); +reg_write( DDR_REG_BASE +0x506f2*4+0x02000000,0x264a); +reg_write( DDR_REG_BASE +0x506f3*4+0x02000000,0x31c0); +reg_write( DDR_REG_BASE +0x506f4*4+0x02000000,0x728d); +reg_write( DDR_REG_BASE +0x506f5*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE +0x506f6*4+0x02000000,0x2025); +reg_write( DDR_REG_BASE +0x506f7*4+0x02000000,0x80); +reg_write( DDR_REG_BASE +0x506f8*4+0x02000000,0xf195); +reg_write( DDR_REG_BASE +0x506f9*4+0x02000000,0xf01a); +reg_write( DDR_REG_BASE +0x506fa*4+0x02000000,0xf017); +reg_write( DDR_REG_BASE +0x506fb*4+0x02000000,0xf015); +reg_write( DDR_REG_BASE +0x506fc*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE +0x506fd*4+0x02000000,0xf01f); +reg_write( DDR_REG_BASE +0x506fe*4+0x02000000,0xf02b); +reg_write( DDR_REG_BASE +0x506ff*4+0x02000000,0xf02d); +reg_write( DDR_REG_BASE +0x50700*4+0x02000000,0xf027); +reg_write( DDR_REG_BASE +0x50701*4+0x02000000,0xf02d); +reg_write( DDR_REG_BASE +0x50702*4+0x02000000,0xf02d); +reg_write( DDR_REG_BASE +0x50703*4+0x02000000,0xf02f); +reg_write( DDR_REG_BASE +0x50704*4+0x02000000,0xf00b); +reg_write( DDR_REG_BASE +0x50705*4+0x02000000,0xf01c); +reg_write( DDR_REG_BASE +0x50706*4+0x02000000,0xf021); +reg_write( DDR_REG_BASE +0x50707*4+0x02000000,0xf015); +reg_write( DDR_REG_BASE +0x50708*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE +0x50709*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE +0x5070a*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE +0x5070b*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE +0x5070c*4+0x02000000,0xf00f); +reg_write( DDR_REG_BASE +0x5070d*4+0x02000000,0xf006); +reg_write( DDR_REG_BASE +0x5070e*4+0x02000000,0xf003); +reg_write( DDR_REG_BASE +0x5070f*4+0x02000000,0xdc07); +reg_write( DDR_REG_BASE +0x50710*4+0x02000000,0xf002); +reg_write( DDR_REG_BASE +0x50711*4+0x02000000,0x738d); +reg_write( DDR_REG_BASE +0x50712*4+0x02000000,0xa11); +reg_write( DDR_REG_BASE +0x50713*4+0x02000000,0xf1); +reg_write( DDR_REG_BASE +0x50714*4+0x02000000,0x43a1); +reg_write( DDR_REG_BASE +0x50715*4+0x02000000,0x239a); +reg_write( DDR_REG_BASE +0x50716*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x50717*4+0x02000000,0x7e65); +reg_write( DDR_REG_BASE +0x50718*4+0x02000000,0x4381); +reg_write( DDR_REG_BASE +0x50719*4+0x02000000,0xf175); +reg_write( DDR_REG_BASE +0x5071a*4+0x02000000,0x4799); +reg_write( DDR_REG_BASE +0x5071b*4+0x02000000,0xe28d); +reg_write( DDR_REG_BASE +0x5071c*4+0x02000000,0x260a); +reg_write( DDR_REG_BASE +0x5071d*4+0x02000000,0x37c0); +reg_write( DDR_REG_BASE +0x5071e*4+0x02000000,0x43e3); +reg_write( DDR_REG_BASE +0x5071f*4+0x02000000,0xf56f); +reg_write( DDR_REG_BASE +0x50720*4+0x02000000,0x43a1); +reg_write( DDR_REG_BASE +0x50721*4+0x02000000,0x239a); +reg_write( DDR_REG_BASE +0x50722*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x50723*4+0x02000000,0x7e65); +reg_write( DDR_REG_BASE +0x50724*4+0x02000000,0x230a); +reg_write( DDR_REG_BASE +0x50725*4+0x02000000,0x780); +reg_write( DDR_REG_BASE +0x50726*4+0x02000000,0xf167); +reg_write( DDR_REG_BASE +0x50727*4+0x02000000,0x766c); +reg_write( DDR_REG_BASE +0x50728*4+0x02000000,0xf165); +reg_write( DDR_REG_BASE +0x50729*4+0x02000000,0x756c); +reg_write( DDR_REG_BASE +0x5072a*4+0x02000000,0xf163); +reg_write( DDR_REG_BASE +0x5072b*4+0x02000000,0x716c); +reg_write( DDR_REG_BASE +0x5072c*4+0x02000000,0xf161); +reg_write( DDR_REG_BASE +0x5072d*4+0x02000000,0xdb16); +reg_write( DDR_REG_BASE +0x5072e*4+0x02000000,0xf15f); +reg_write( DDR_REG_BASE +0x5072f*4+0x02000000,0xdb08); +reg_write( DDR_REG_BASE +0x50730*4+0x02000000,0xf15d); +reg_write( DDR_REG_BASE +0x50731*4+0x02000000,0xdb20); +reg_write( DDR_REG_BASE +0x50732*4+0x02000000,0xf15b); +reg_write( DDR_REG_BASE +0x50733*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x50734*4+0x02000000,0xc0f1); +reg_write( DDR_REG_BASE +0x50735*4+0x02000000,0xc1a4); +reg_write( DDR_REG_BASE +0x50736*4+0x02000000,0xc408); +reg_write( DDR_REG_BASE +0x50737*4+0x02000000,0xc443); +reg_write( DDR_REG_BASE +0x50738*4+0x02000000,0xc407); +reg_write( DDR_REG_BASE +0x50739*4+0x02000000,0xc442); +reg_write( DDR_REG_BASE +0x5073a*4+0x02000000,0xc406); +reg_write( DDR_REG_BASE +0x5073b*4+0x02000000,0xc441); +reg_write( DDR_REG_BASE +0x5073c*4+0x02000000,0xc405); +reg_write( DDR_REG_BASE +0x5073d*4+0x02000000,0xe72); +reg_write( DDR_REG_BASE +0x5073e*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE +0x5073f*4+0x02000000,0xc440); +reg_write( DDR_REG_BASE +0x50740*4+0x02000000,0xc0a4); +reg_write( DDR_REG_BASE +0x50741*4+0x02000000,0xc0d1); +reg_write( DDR_REG_BASE +0x50742*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE +0x50743*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x50744*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x50745*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x50746*4+0x02000000,0x440); +reg_write( DDR_REG_BASE +0x50747*4+0x02000000,0x8920); +reg_write( DDR_REG_BASE +0x50748*4+0x02000000,0x208c); +reg_write( DDR_REG_BASE +0x50749*4+0x02000000,0x8fc3); +reg_write( DDR_REG_BASE +0x5074a*4+0x02000000,0x20ca); +reg_write( DDR_REG_BASE +0x5074b*4+0x02000000,0x41); +reg_write( DDR_REG_BASE +0x5074c*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x5074d*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE +0x5074e*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE +0x5074f*4+0x02000000,0x1e8); +reg_write( DDR_REG_BASE +0x50750*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE +0x50751*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x50752*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x50753*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x50754*4+0x02000000,0x440); +reg_write( DDR_REG_BASE +0x50755*4+0x02000000,0x8920); +reg_write( DDR_REG_BASE +0x50756*4+0x02000000,0x208c); +reg_write( DDR_REG_BASE +0x50757*4+0x02000000,0x8fc3); +reg_write( DDR_REG_BASE +0x50758*4+0x02000000,0x20ca); +reg_write( DDR_REG_BASE +0x50759*4+0x02000000,0x41); +reg_write( DDR_REG_BASE +0x5075a*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x5075b*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE +0x5075c*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE +0x5075d*4+0x02000000,0x1e6); +reg_write( DDR_REG_BASE +0x5075e*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE +0x5075f*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x50760*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x50761*4+0x02000000,0x900e); +reg_write( DDR_REG_BASE +0x50762*4+0x02000000,0x4c); +reg_write( DDR_REG_BASE +0x50763*4+0x02000000,0x9160); +reg_write( DDR_REG_BASE +0x50764*4+0x02000000,0x9141); +reg_write( DDR_REG_BASE +0x50765*4+0x02000000,0x221a); +reg_write( DDR_REG_BASE +0x50766*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE +0x50767*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x50768*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50769*4+0x02000000,0x7965); +reg_write( DDR_REG_BASE +0x5076a*4+0x02000000,0xe807); +reg_write( DDR_REG_BASE +0x5076b*4+0x02000000,0x231a); +reg_write( DDR_REG_BASE +0x5076c*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x5076d*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x5076e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5076f*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE +0x50770*4+0x02000000,0xf008); +reg_write( DDR_REG_BASE +0x50771*4+0x02000000,0x4040); +reg_write( DDR_REG_BASE +0x50772*4+0x02000000,0xda0f); +reg_write( DDR_REG_BASE +0x50773*4+0x02000000,0xba61); +reg_write( DDR_REG_BASE +0x50774*4+0x02000000,0xaff); +reg_write( DDR_REG_BASE +0x50775*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE +0x50776*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x50777*4+0x02000000,0x793b); +reg_write( DDR_REG_BASE +0x50778*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE +0x50779*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x5077a*4+0x02000000,0x900f); +reg_write( DDR_REG_BASE +0x5077b*4+0x02000000,0xfe4c); +reg_write( DDR_REG_BASE +0x5077c*4+0x02000000,0xda10); +reg_write( DDR_REG_BASE +0x5077d*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE +0x5077e*4+0x02000000,0xba61); +reg_write( DDR_REG_BASE +0x5077f*4+0x02000000,0xa01); +reg_write( DDR_REG_BASE +0x50780*4+0x02000000,0x31); +reg_write( DDR_REG_BASE +0x50781*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x50782*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE +0x50783*4+0x02000000,0xb101); +reg_write( DDR_REG_BASE +0x50784*4+0x02000000,0xc2e4); +reg_write( DDR_REG_BASE +0x50785*4+0x02000000,0x8830); +reg_write( DDR_REG_BASE +0x50786*4+0x02000000,0x96d); +reg_write( DDR_REG_BASE +0x50787*4+0x02000000,0x110); +reg_write( DDR_REG_BASE +0x50788*4+0x02000000,0x8008); +reg_write( DDR_REG_BASE +0x50789*4+0x02000000,0x869); +reg_write( DDR_REG_BASE +0x5078a*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x5078b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5078c*4+0x02000000,0x800); +reg_write( DDR_REG_BASE +0x5078d*4+0x02000000,0x45cb); +reg_write( DDR_REG_BASE +0x5078e*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x5078f*4+0x02000000,0x7b1); +reg_write( DDR_REG_BASE +0x50790*4+0x02000000,0x8d00); +reg_write( DDR_REG_BASE +0x50791*4+0x02000000,0x8ea); +reg_write( DDR_REG_BASE +0x50792*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x50793*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x50794*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x50795*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE +0x50796*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x50797*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x50798*4+0x02000000,0x8d64); +reg_write( DDR_REG_BASE +0x50799*4+0x02000000,0x8da3); +reg_write( DDR_REG_BASE +0x5079a*4+0x02000000,0x211a); +reg_write( DDR_REG_BASE +0x5079b*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE +0x5079c*4+0x02000000,0x10); +reg_write( DDR_REG_BASE +0x5079d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5079e*4+0x02000000,0xf018); +reg_write( DDR_REG_BASE +0x5079f*4+0x02000000,0x251a); +reg_write( DDR_REG_BASE +0x507a0*4+0x02000000,0x1f81); +reg_write( DDR_REG_BASE +0x507a1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x507a2*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE +0x507a3*4+0x02000000,0x7e45); +reg_write( DDR_REG_BASE +0x507a4*4+0x02000000,0x2105); +reg_write( DDR_REG_BASE +0x507a5*4+0x02000000,0xf8c); +reg_write( DDR_REG_BASE +0x507a6*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE +0x507a7*4+0x02000000,0x1064); +reg_write( DDR_REG_BASE +0x507a8*4+0x02000000,0x251a); +reg_write( DDR_REG_BASE +0x507a9*4+0x02000000,0x1f81); +reg_write( DDR_REG_BASE +0x507aa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x507ab*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE +0x507ac*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE +0x507ad*4+0x02000000,0x79c5); +reg_write( DDR_REG_BASE +0x507ae*4+0x02000000,0x793b); +reg_write( DDR_REG_BASE +0x507af*4+0x02000000,0x2105); +reg_write( DDR_REG_BASE +0x507b0*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE +0x507b1*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE +0x507b2*4+0x02000000,0x200); +reg_write( DDR_REG_BASE +0x507b3*4+0x02000000,0x9120); +reg_write( DDR_REG_BASE +0x507b4*4+0x02000000,0xb9c5); +reg_write( DDR_REG_BASE +0x507b5*4+0x02000000,0xb420); +reg_write( DDR_REG_BASE +0x507b6*4+0x02000000,0xbd3); +reg_write( DDR_REG_BASE +0x507b7*4+0x02000000,0x8365); +reg_write( DDR_REG_BASE +0x507b8*4+0x02000000,0x2055); +reg_write( DDR_REG_BASE +0x507b9*4+0x02000000,0xd0e); +reg_write( DDR_REG_BASE +0x507ba*4+0x02000000,0xea6); +reg_write( DDR_REG_BASE +0x507bb*4+0x02000000,0xc0); +reg_write( DDR_REG_BASE +0x507bc*4+0x02000000,0xc6c4); +reg_write( DDR_REG_BASE +0x507bd*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x507be*4+0x02000000,0xc0f1); +reg_write( DDR_REG_BASE +0x507bf*4+0x02000000,0xc1a4); +reg_write( DDR_REG_BASE +0x507c0*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x507c1*4+0x02000000,0xc92); +reg_write( DDR_REG_BASE +0x507c2*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE +0x507c3*4+0x02000000,0xd9ff); +reg_write( DDR_REG_BASE +0x507c4*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x507c5*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE +0x507c6*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE +0x507c7*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE +0x507c8*4+0x02000000,0xd85a); +reg_write( DDR_REG_BASE +0x507c9*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE +0x507ca*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x507cb*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE +0x507cc*4+0x02000000,0xda0a); +reg_write( DDR_REG_BASE +0x507cd*4+0x02000000,0xd52); +reg_write( DDR_REG_BASE +0x507ce*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE +0x507cf*4+0x02000000,0xdb20); +reg_write( DDR_REG_BASE +0x507d0*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x507d1*4+0x02000000,0xd0a); +reg_write( DDR_REG_BASE +0x507d2*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE +0x507d3*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x507d4*4+0x02000000,0xc0a4); +reg_write( DDR_REG_BASE +0x507d5*4+0x02000000,0xc0d1); +reg_write( DDR_REG_BASE +0x507d6*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE +0x507d7*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x507d8*4+0x02000000,0x7014); +reg_write( DDR_REG_BASE +0x507d9*4+0x02000000,0x20c0); +reg_write( DDR_REG_BASE +0x507da*4+0x02000000,0xfe9); +reg_write( DDR_REG_BASE +0x507db*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE +0x507dc*4+0x02000000,0x2884); +reg_write( DDR_REG_BASE +0x507dd*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x507de*4+0x02000000,0x917); +reg_write( DDR_REG_BASE +0x507df*4+0x02000000,0x3f0); +reg_write( DDR_REG_BASE +0x507e0*4+0x02000000,0x228a); +reg_write( DDR_REG_BASE +0x507e1*4+0x02000000,0xfc7); +reg_write( DDR_REG_BASE +0x507e2*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE +0x507e3*4+0x02000000,0xb9c4); +reg_write( DDR_REG_BASE +0x507e4*4+0x02000000,0xe905); +reg_write( DDR_REG_BASE +0x507e5*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE +0x507e6*4+0x02000000,0x9ff); +reg_write( DDR_REG_BASE +0x507e7*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE +0x507e8*4+0x02000000,0x7a5b); +reg_write( DDR_REG_BASE +0x507e9*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE +0x507ea*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x507eb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x507ec*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE +0x507ed*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x507ee*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE +0x507ef*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE +0x507f0*4+0x02000000,0x16a); +reg_write( DDR_REG_BASE +0x507f1*4+0x02000000,0x224f); +reg_write( DDR_REG_BASE +0x507f2*4+0x02000000,0x240); +reg_write( DDR_REG_BASE +0x507f3*4+0x02000000,0x1900); +reg_write( DDR_REG_BASE +0x507f4*4+0x02000000,0x5); +reg_write( DDR_REG_BASE +0x507f5*4+0x02000000,0xb140); +reg_write( DDR_REG_BASE +0x507f6*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE +0x507f7*4+0x02000000,0xb140); +reg_write( DDR_REG_BASE +0x507f8*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE +0x507f9*4+0x02000000,0x1900); +reg_write( DDR_REG_BASE +0x507fa*4+0x02000000,0x5); +reg_write( DDR_REG_BASE +0x507fb*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x507fc*4+0x02000000,0x80d); +reg_write( DDR_REG_BASE +0x507fd*4+0x02000000,0x72); +reg_write( DDR_REG_BASE +0x507fe*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x507ff*4+0x02000000,0x48ff); +reg_write( DDR_REG_BASE +0x50800*4+0x02000000,0x2984); +reg_write( DDR_REG_BASE +0x50801*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x50802*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE +0x50803*4+0x02000000,0x782e); +reg_write( DDR_REG_BASE +0x50804*4+0x02000000,0xc0f1); +reg_write( DDR_REG_BASE +0x50805*4+0x02000000,0x4200); +reg_write( DDR_REG_BASE +0x50806*4+0x02000000,0x95a); +reg_write( DDR_REG_BASE +0x50807*4+0x02000000,0x60); +reg_write( DDR_REG_BASE +0x50808*4+0x02000000,0x4020); +reg_write( DDR_REG_BASE +0x50809*4+0x02000000,0x795b); +reg_write( DDR_REG_BASE +0x5080a*4+0x02000000,0x2144); +reg_write( DDR_REG_BASE +0x5080b*4+0x02000000,0x181); +reg_write( DDR_REG_BASE +0x5080c*4+0x02000000,0xb9c4); +reg_write( DDR_REG_BASE +0x5080d*4+0x02000000,0xe906); +reg_write( DDR_REG_BASE +0x5080e*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE +0x5080f*4+0x02000000,0x901); +reg_write( DDR_REG_BASE +0x50810*4+0x02000000,0x31); +reg_write( DDR_REG_BASE +0x50811*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x50812*4+0x02000000,0xc0d1); +reg_write( DDR_REG_BASE +0x50813*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE +0x50814*4+0x02000000,0xb8c1); +reg_write( DDR_REG_BASE +0x50815*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x50816*4+0x02000000,0xc0f1); +reg_write( DDR_REG_BASE +0x50817*4+0x02000000,0xc1a4); +reg_write( DDR_REG_BASE +0x50818*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x50819*4+0x02000000,0xbe2); +reg_write( DDR_REG_BASE +0x5081a*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE +0x5081b*4+0x02000000,0xd9ff); +reg_write( DDR_REG_BASE +0x5081c*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x5081d*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE +0x5081e*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE +0x5081f*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE +0x50820*4+0x02000000,0xd85a); +reg_write( DDR_REG_BASE +0x50821*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE +0x50822*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x50823*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE +0x50824*4+0x02000000,0xda09); +reg_write( DDR_REG_BASE +0x50825*4+0x02000000,0xca2); +reg_write( DDR_REG_BASE +0x50826*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE +0x50827*4+0x02000000,0xdb20); +reg_write( DDR_REG_BASE +0x50828*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x50829*4+0x02000000,0xc5a); +reg_write( DDR_REG_BASE +0x5082a*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE +0x5082b*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x5082c*4+0x02000000,0xc0a4); +reg_write( DDR_REG_BASE +0x5082d*4+0x02000000,0xc0d1); +reg_write( DDR_REG_BASE +0x5082e*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE +0x5082f*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x50830*4+0x02000000,0xc3e1); +reg_write( DDR_REG_BASE +0x50831*4+0x02000000,0xc2e1); +reg_write( DDR_REG_BASE +0x50832*4+0x02000000,0xc1e1); +reg_write( DDR_REG_BASE +0x50833*4+0x02000000,0xc0e1); +reg_write( DDR_REG_BASE +0x50834*4+0x02000000,0xc0f1); +reg_write( DDR_REG_BASE +0x50835*4+0x02000000,0xc1a1); +reg_write( DDR_REG_BASE +0x50836*4+0x02000000,0x4220); +reg_write( DDR_REG_BASE +0x50837*4+0x02000000,0xc184); +reg_write( DDR_REG_BASE +0x50838*4+0x02000000,0xc140); +reg_write( DDR_REG_BASE +0x50839*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x5083a*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE +0x5083b*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x5083c*4+0x02000000,0x12); +reg_write( DDR_REG_BASE +0x5083d*4+0x02000000,0x80f); +reg_write( DDR_REG_BASE +0x5083e*4+0x02000000,0x64); +reg_write( DDR_REG_BASE +0x5083f*4+0x02000000,0x4040); +reg_write( DDR_REG_BASE +0x50840*4+0x02000000,0xa6a); +reg_write( DDR_REG_BASE +0x50841*4+0x02000000,0x1e0); +reg_write( DDR_REG_BASE +0x50842*4+0x02000000,0xc100); +reg_write( DDR_REG_BASE +0x50843*4+0x02000000,0x7487); +reg_write( DDR_REG_BASE +0x50844*4+0x02000000,0xc0d1); +reg_write( DDR_REG_BASE +0x50845*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE +0x50846*4+0x02000000,0xc0a4); +reg_write( DDR_REG_BASE +0x50847*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x50848*4+0x02000000,0x791d); +reg_write( DDR_REG_BASE +0x50849*4+0x02000000,0x216c); +reg_write( DDR_REG_BASE +0x5084a*4+0x02000000,0x102); +reg_write( DDR_REG_BASE +0x5084b*4+0x02000000,0x206c); +reg_write( DDR_REG_BASE +0x5084c*4+0x02000000,0x141); +reg_write( DDR_REG_BASE +0x5084d*4+0x02000000,0x7822); +reg_write( DDR_REG_BASE +0x5084e*4+0x02000000,0x621a); +reg_write( DDR_REG_BASE +0x5084f*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE +0x50850*4+0x02000000,0x784e); +reg_write( DDR_REG_BASE +0x50851*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x50852*4+0x02000000,0xc0e6); +reg_write( DDR_REG_BASE +0x50853*4+0x02000000,0x215f); +reg_write( DDR_REG_BASE +0x50854*4+0x02000000,0x483); +reg_write( DDR_REG_BASE +0x50855*4+0x02000000,0x44cb); +reg_write( DDR_REG_BASE +0x50856*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x50857*4+0x02000000,0x6b4); +reg_write( DDR_REG_BASE +0x50858*4+0x02000000,0x70cd); +reg_write( DDR_REG_BASE +0x50859*4+0x02000000,0x647a); +reg_write( DDR_REG_BASE +0x5085a*4+0x02000000,0x8aa2); +reg_write( DDR_REG_BASE +0x5085b*4+0x02000000,0x8a43); +reg_write( DDR_REG_BASE +0x5085c*4+0x02000000,0x7d04); +reg_write( DDR_REG_BASE +0x5085d*4+0x02000000,0xf00b); +reg_write( DDR_REG_BASE +0x5085e*4+0x02000000,0x6199); +reg_write( DDR_REG_BASE +0x5085f*4+0x02000000,0x89e4); +reg_write( DDR_REG_BASE +0x50860*4+0x02000000,0x7f0b); +reg_write( DDR_REG_BASE +0x50861*4+0x02000000,0xf206); +reg_write( DDR_REG_BASE +0x50862*4+0x02000000,0x89e5); +reg_write( DDR_REG_BASE +0x50863*4+0x02000000,0x79af); +reg_write( DDR_REG_BASE +0x50864*4+0x02000000,0x210f); +reg_write( DDR_REG_BASE +0x50865*4+0x02000000,0x3cd); +reg_write( DDR_REG_BASE +0x50866*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE +0x50867*4+0x02000000,0xef1); +reg_write( DDR_REG_BASE +0x50868*4+0x02000000,0x90a4); +reg_write( DDR_REG_BASE +0x50869*4+0x02000000,0x2314); +reg_write( DDR_REG_BASE +0x5086a*4+0x02000000,0x381); +reg_write( DDR_REG_BASE +0x5086b*4+0x02000000,0x78af); +reg_write( DDR_REG_BASE +0x5086c*4+0x02000000,0xc4c6); +reg_write( DDR_REG_BASE +0x5086d*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x5086e*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE +0x5086f*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE +0x50870*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE +0x50871*4+0x02000000,0x206f); +reg_write( DDR_REG_BASE +0x50872*4+0x02000000,0x843); +reg_write( DDR_REG_BASE +0x50873*4+0x02000000,0x90e0); +reg_write( DDR_REG_BASE +0x50874*4+0x02000000,0x10f1); +reg_write( DDR_REG_BASE +0x50875*4+0x02000000,0x809b); +reg_write( DDR_REG_BASE +0x50876*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x50877*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x50878*4+0x02000000,0x7c4); +reg_write( DDR_REG_BASE +0x50879*4+0x02000000,0xbea); +reg_write( DDR_REG_BASE +0x5087a*4+0x02000000,0x60); +reg_write( DDR_REG_BASE +0x5087b*4+0x02000000,0xc1a2); +reg_write( DDR_REG_BASE +0x5087c*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x5087d*4+0x02000000,0x70c5); +reg_write( DDR_REG_BASE +0x5087e*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE +0x5087f*4+0x02000000,0xc0); +reg_write( DDR_REG_BASE +0x50880*4+0x02000000,0xdca); +reg_write( DDR_REG_BASE +0x50881*4+0x02000000,0x80); +reg_write( DDR_REG_BASE +0x50882*4+0x02000000,0xb15); +reg_write( DDR_REG_BASE +0x50883*4+0x02000000,0x307e); +reg_write( DDR_REG_BASE +0x50884*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE +0x50885*4+0x02000000,0x896); +reg_write( DDR_REG_BASE +0x50886*4+0x02000000,0x80); +reg_write( DDR_REG_BASE +0x50887*4+0x02000000,0xd56); +reg_write( DDR_REG_BASE +0x50888*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE +0x50889*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x5088a*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE +0x5088b*4+0x02000000,0xf00f); +reg_write( DDR_REG_BASE +0x5088c*4+0x02000000,0x886); +reg_write( DDR_REG_BASE +0x5088d*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE +0x5088e*4+0x02000000,0xd8c8); +reg_write( DDR_REG_BASE +0x5088f*4+0x02000000,0xd46); +reg_write( DDR_REG_BASE +0x50890*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE +0x50891*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x50892*4+0x02000000,0x87a); +reg_write( DDR_REG_BASE +0x50893*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE +0x50894*4+0x02000000,0xd862); +reg_write( DDR_REG_BASE +0x50895*4+0x02000000,0xd3a); +reg_write( DDR_REG_BASE +0x50896*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE +0x50897*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x50898*4+0x02000000,0x720c); +reg_write( DDR_REG_BASE +0x50899*4+0x02000000,0x86e); +reg_write( DDR_REG_BASE +0x5089a*4+0x02000000,0x80); +reg_write( DDR_REG_BASE +0x5089b*4+0x02000000,0xd2e); +reg_write( DDR_REG_BASE +0x5089c*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE +0x5089d*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x5089e*4+0x02000000,0xe42); +reg_write( DDR_REG_BASE +0x5089f*4+0x02000000,0xffcf); +reg_write( DDR_REG_BASE +0x508a0*4+0x02000000,0xb09); +reg_write( DDR_REG_BASE +0x508a1*4+0x02000000,0x307e); +reg_write( DDR_REG_BASE +0x508a2*4+0x02000000,0x720c); +reg_write( DDR_REG_BASE +0x508a3*4+0x02000000,0xf005); +reg_write( DDR_REG_BASE +0x508a4*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x508a5*4+0x02000000,0x3); +reg_write( DDR_REG_BASE +0x508a6*4+0x02000000,0xd40); +reg_write( DDR_REG_BASE +0x508a7*4+0x02000000,0x852); +reg_write( DDR_REG_BASE +0x508a8*4+0x02000000,0x80); +reg_write( DDR_REG_BASE +0x508a9*4+0x02000000,0xd12); +reg_write( DDR_REG_BASE +0x508aa*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE +0x508ab*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x508ac*4+0x02000000,0xd823); +reg_write( DDR_REG_BASE +0x508ad*4+0x02000000,0xb89f); +reg_write( DDR_REG_BASE +0x508ae*4+0x02000000,0x8820); +reg_write( DDR_REG_BASE +0x508af*4+0x02000000,0x1026); +reg_write( DDR_REG_BASE +0x508b0*4+0x02000000,0x80); +reg_write( DDR_REG_BASE +0x508b1*4+0x02000000,0x70cd); +reg_write( DDR_REG_BASE +0x508b2*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE +0x508b3*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE +0x508b4*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE +0x508b5*4+0x02000000,0xf010); +reg_write( DDR_REG_BASE +0x508b6*4+0x02000000,0x2544); +reg_write( DDR_REG_BASE +0x508b7*4+0x02000000,0x17c1); +reg_write( DDR_REG_BASE +0x508b8*4+0x02000000,0xe905); +reg_write( DDR_REG_BASE +0x508b9*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE +0x508ba*4+0x02000000,0x9ff); +reg_write( DDR_REG_BASE +0x508bb*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE +0x508bc*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE +0x508bd*4+0x02000000,0xc101); +reg_write( DDR_REG_BASE +0x508be*4+0x02000000,0x782b); +reg_write( DDR_REG_BASE +0x508bf*4+0x02000000,0xf205); +reg_write( DDR_REG_BASE +0x508c0*4+0x02000000,0xd56); +reg_write( DDR_REG_BASE +0x508c1*4+0x02000000,0x220); +reg_write( DDR_REG_BASE +0x508c2*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE +0x508c3*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE +0x508c4*4+0x02000000,0xde5); +reg_write( DDR_REG_BASE +0x508c5*4+0x02000000,0x90b4); +reg_write( DDR_REG_BASE +0x508c6*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE +0x508c7*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE +0x508c8*4+0x02000000,0x4100); +reg_write( DDR_REG_BASE +0x508c9*4+0x02000000,0x2644); +reg_write( DDR_REG_BASE +0x508ca*4+0x02000000,0x17c0); +reg_write( DDR_REG_BASE +0x508cb*4+0x02000000,0xe806); +reg_write( DDR_REG_BASE +0x508cc*4+0x02000000,0xb861); +reg_write( DDR_REG_BASE +0x508cd*4+0x02000000,0x801); +reg_write( DDR_REG_BASE +0x508ce*4+0x02000000,0x31); +reg_write( DDR_REG_BASE +0x508cf*4+0x02000000,0x793b); +reg_write( DDR_REG_BASE +0x508d0*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE +0x508d1*4+0x02000000,0x790b); +reg_write( DDR_REG_BASE +0x508d2*4+0x02000000,0xf204); +reg_write( DDR_REG_BASE +0x508d3*4+0x02000000,0xdae); +reg_write( DDR_REG_BASE +0x508d4*4+0x02000000,0x220); +reg_write( DDR_REG_BASE +0x508d5*4+0x02000000,0x782f); +reg_write( DDR_REG_BASE +0x508d6*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE +0x508d7*4+0x02000000,0xee5); +reg_write( DDR_REG_BASE +0x508d8*4+0x02000000,0x90b4); +reg_write( DDR_REG_BASE +0x508d9*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE +0x508da*4+0x02000000,0xb09); +reg_write( DDR_REG_BASE +0x508db*4+0x02000000,0x307e); +reg_write( DDR_REG_BASE +0x508dc*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE +0x508dd*4+0x02000000,0xf004); +reg_write( DDR_REG_BASE +0x508de*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE +0x508df*4+0x02000000,0xa0f); +reg_write( DDR_REG_BASE +0x508e0*4+0x02000000,0xfde); +reg_write( DDR_REG_BASE +0x508e1*4+0x02000000,0x40); +reg_write( DDR_REG_BASE +0x508e2*4+0x02000000,0xc9e); +reg_write( DDR_REG_BASE +0x508e3*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE +0x508e4*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x508e5*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE +0x508e6*4+0x02000000,0xf010); +reg_write( DDR_REG_BASE +0x508e7*4+0x02000000,0x4100); +reg_write( DDR_REG_BASE +0x508e8*4+0x02000000,0x2544); +reg_write( DDR_REG_BASE +0x508e9*4+0x02000000,0x17c0); +reg_write( DDR_REG_BASE +0x508ea*4+0x02000000,0xe805); +reg_write( DDR_REG_BASE +0x508eb*4+0x02000000,0xb861); +reg_write( DDR_REG_BASE +0x508ec*4+0x02000000,0x8ff); +reg_write( DDR_REG_BASE +0x508ed*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE +0x508ee*4+0x02000000,0x793b); +reg_write( DDR_REG_BASE +0x508ef*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE +0x508f0*4+0x02000000,0x790b); +reg_write( DDR_REG_BASE +0x508f1*4+0x02000000,0xf205); +reg_write( DDR_REG_BASE +0x508f2*4+0x02000000,0xcf2); +reg_write( DDR_REG_BASE +0x508f3*4+0x02000000,0x220); +reg_write( DDR_REG_BASE +0x508f4*4+0x02000000,0x782f); +reg_write( DDR_REG_BASE +0x508f5*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE +0x508f6*4+0x02000000,0xde3); +reg_write( DDR_REG_BASE +0x508f7*4+0x02000000,0x90b4); +reg_write( DDR_REG_BASE +0x508f8*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE +0x508f9*4+0x02000000,0xb0b); +reg_write( DDR_REG_BASE +0x508fa*4+0x02000000,0x307e); +reg_write( DDR_REG_BASE +0x508fb*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE +0x508fc*4+0x02000000,0xf004); +reg_write( DDR_REG_BASE +0x508fd*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x508fe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x508ff*4+0x02000000,0x2710); +reg_write( DDR_REG_BASE +0x50900*4+0x02000000,0xf9e); +reg_write( DDR_REG_BASE +0x50901*4+0x02000000,0x40); +reg_write( DDR_REG_BASE +0x50902*4+0x02000000,0xc5e); +reg_write( DDR_REG_BASE +0x50903*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE +0x50904*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x50905*4+0x02000000,0xf11); +reg_write( DDR_REG_BASE +0x50906*4+0x02000000,0x131e); +reg_write( DDR_REG_BASE +0x50907*4+0x02000000,0x9a6); +reg_write( DDR_REG_BASE +0x50908*4+0x02000000,0xff8f); +reg_write( DDR_REG_BASE +0x50909*4+0x02000000,0xbca); +reg_write( DDR_REG_BASE +0x5090a*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE +0x5090b*4+0x02000000,0xd80d); +reg_write( DDR_REG_BASE +0x5090c*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE +0x5090d*4+0x02000000,0xf01c); +reg_write( DDR_REG_BASE +0x5090e*4+0x02000000,0x4100); +reg_write( DDR_REG_BASE +0x5090f*4+0x02000000,0x2544); +reg_write( DDR_REG_BASE +0x50910*4+0x02000000,0x17c0); +reg_write( DDR_REG_BASE +0x50911*4+0x02000000,0xe806); +reg_write( DDR_REG_BASE +0x50912*4+0x02000000,0xb861); +reg_write( DDR_REG_BASE +0x50913*4+0x02000000,0x801); +reg_write( DDR_REG_BASE +0x50914*4+0x02000000,0x31); +reg_write( DDR_REG_BASE +0x50915*4+0x02000000,0x793b); +reg_write( DDR_REG_BASE +0x50916*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE +0x50917*4+0x02000000,0x790b); +reg_write( DDR_REG_BASE +0x50918*4+0x02000000,0xf20f); +reg_write( DDR_REG_BASE +0x50919*4+0x02000000,0xd8a); +reg_write( DDR_REG_BASE +0x5091a*4+0x02000000,0x220); +reg_write( DDR_REG_BASE +0x5091b*4+0x02000000,0x782f); +reg_write( DDR_REG_BASE +0x5091c*4+0x02000000,0xb09); +reg_write( DDR_REG_BASE +0x5091d*4+0x02000000,0x307e); +reg_write( DDR_REG_BASE +0x5091e*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE +0x5091f*4+0x02000000,0xf004); +reg_write( DDR_REG_BASE +0x50920*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE +0x50921*4+0x02000000,0xa0f); +reg_write( DDR_REG_BASE +0x50922*4+0x02000000,0xf5a); +reg_write( DDR_REG_BASE +0x50923*4+0x02000000,0x40); +reg_write( DDR_REG_BASE +0x50924*4+0x02000000,0xc1a); +reg_write( DDR_REG_BASE +0x50925*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE +0x50926*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x50927*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE +0x50928*4+0x02000000,0xdcd); +reg_write( DDR_REG_BASE +0x50929*4+0x02000000,0x90b4); +reg_write( DDR_REG_BASE +0x5092a*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE +0x5092b*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x5092c*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE +0x5092d*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x5092e*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x5092f*4+0x02000000,0x7c4); +reg_write( DDR_REG_BASE +0x50930*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x50931*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE +0x50932*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x50933*4+0x02000000,0x600); +reg_write( DDR_REG_BASE +0x50934*4+0x02000000,0xd8a); +reg_write( DDR_REG_BASE +0x50935*4+0x02000000,0x220); +reg_write( DDR_REG_BASE +0x50936*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE +0x50937*4+0x02000000,0xc0a2); +reg_write( DDR_REG_BASE +0x50938*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE +0x50939*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE +0x5093a*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE +0x5093b*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x5093c*4+0x02000000,0xca04); +reg_write( DDR_REG_BASE +0x5093d*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE +0x5093e*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE +0x5093f*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x50940*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE +0x50941*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE +0x50942*4+0x02000000,0x8b20); +reg_write( DDR_REG_BASE +0x50943*4+0x02000000,0xa0d); +reg_write( DDR_REG_BASE +0x50944*4+0x02000000,0x44); +reg_write( DDR_REG_BASE +0x50945*4+0x02000000,0x8b21); +reg_write( DDR_REG_BASE +0x50946*4+0x02000000,0x919); +reg_write( DDR_REG_BASE +0x50947*4+0x02000000,0x85); +reg_write( DDR_REG_BASE +0x50948*4+0x02000000,0x221a); +reg_write( DDR_REG_BASE +0x50949*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE +0x5094a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5094b*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE +0x5094c*4+0x02000000,0x2105); +reg_write( DDR_REG_BASE +0x5094d*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE +0x5094e*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE +0x5094f*4+0x02000000,0x1f64); +reg_write( DDR_REG_BASE +0x50950*4+0x02000000,0x1900); +reg_write( DDR_REG_BASE +0x50951*4+0x02000000,0x5); +reg_write( DDR_REG_BASE +0x50952*4+0x02000000,0x7144); +reg_write( DDR_REG_BASE +0x50953*4+0x02000000,0xae1); +reg_write( DDR_REG_BASE +0x50954*4+0x02000000,0x8004); +reg_write( DDR_REG_BASE +0x50955*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE +0x50956*4+0x02000000,0xc0f1); +reg_write( DDR_REG_BASE +0x50957*4+0x02000000,0xc1a5); +reg_write( DDR_REG_BASE +0x50958*4+0x02000000,0x4300); +reg_write( DDR_REG_BASE +0x50959*4+0x02000000,0xc080); +reg_write( DDR_REG_BASE +0x5095a*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x5095b*4+0x02000000,0xdde); +reg_write( DDR_REG_BASE +0x5095c*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE +0x5095d*4+0x02000000,0xda14); +reg_write( DDR_REG_BASE +0x5095e*4+0x02000000,0x231a); +reg_write( DDR_REG_BASE +0x5095f*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x50960*4+0x02000000,0x10); +reg_write( DDR_REG_BASE +0x50961*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50962*4+0x02000000,0xc180); +reg_write( DDR_REG_BASE +0x50963*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE +0x50964*4+0x02000000,0xbea); +reg_write( DDR_REG_BASE +0x50965*4+0x02000000,0x160); +reg_write( DDR_REG_BASE +0x50966*4+0x02000000,0xb885); +reg_write( DDR_REG_BASE +0x50967*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x50968*4+0x02000000,0xf6); +reg_write( DDR_REG_BASE +0x50969*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5096a*4+0x02000000,0xd8e); +reg_write( DDR_REG_BASE +0x5096b*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE +0x5096c*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE +0x5096d*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x5096e*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x5096f*4+0x02000000,0x89e); +reg_write( DDR_REG_BASE +0x50970*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE +0x50971*4+0x02000000,0xc280); +reg_write( DDR_REG_BASE +0x50972*4+0x02000000,0xc0a5); +reg_write( DDR_REG_BASE +0x50973*4+0x02000000,0xc0d1); +reg_write( DDR_REG_BASE +0x50974*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE +0x50975*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x50976*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE +0x50977*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE +0x50978*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE +0x50979*4+0x02000000,0x2482); +reg_write( DDR_REG_BASE +0x5097a*4+0x02000000,0x3d02); +reg_write( DDR_REG_BASE +0x5097b*4+0x02000000,0x4748); +reg_write( DDR_REG_BASE +0x5097c*4+0x02000000,0x4338); +reg_write( DDR_REG_BASE +0x5097d*4+0x02000000,0x4308); +reg_write( DDR_REG_BASE +0x5097e*4+0x02000000,0xc080); +reg_write( DDR_REG_BASE +0x5097f*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x50980*4+0x02000000,0xd92); +reg_write( DDR_REG_BASE +0x50981*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE +0x50982*4+0x02000000,0xdab4); +reg_write( DDR_REG_BASE +0x50983*4+0x02000000,0xb25); +reg_write( DDR_REG_BASE +0x50984*4+0x02000000,0x10b1); +reg_write( DDR_REG_BASE +0x50985*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE +0x50986*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x50987*4+0x02000000,0xf2); +reg_write( DDR_REG_BASE +0x50988*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x50989*4+0x02000000,0xd52); +reg_write( DDR_REG_BASE +0x5098a*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE +0x5098b*4+0x02000000,0x4260); +reg_write( DDR_REG_BASE +0x5098c*4+0x02000000,0xc080); +reg_write( DDR_REG_BASE +0x5098d*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x5098e*4+0x02000000,0xbe6); +reg_write( DDR_REG_BASE +0x5098f*4+0x02000000,0x160); +reg_write( DDR_REG_BASE +0x50990*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE +0x50991*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x50992*4+0x02000000,0xd909); +reg_write( DDR_REG_BASE +0x50993*4+0x02000000,0xf036); +reg_write( DDR_REG_BASE +0x50994*4+0x02000000,0x231a); +reg_write( DDR_REG_BASE +0x50995*4+0x02000000,0x3f9b); +reg_write( DDR_REG_BASE +0x50996*4+0x02000000,0x10); +reg_write( DDR_REG_BASE +0x50997*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50998*4+0x02000000,0xb1b); +reg_write( DDR_REG_BASE +0x50999*4+0x02000000,0x1030); +reg_write( DDR_REG_BASE +0x5099a*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE +0x5099b*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x5099c*4+0x02000000,0xf4); +reg_write( DDR_REG_BASE +0x5099d*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x5099e*4+0x02000000,0xd26); +reg_write( DDR_REG_BASE +0x5099f*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE +0x509a0*4+0x02000000,0x4260); +reg_write( DDR_REG_BASE +0x509a1*4+0x02000000,0xdd09); +reg_write( DDR_REG_BASE +0x509a2*4+0x02000000,0xdec0); +reg_write( DDR_REG_BASE +0x509a3*4+0x02000000,0xd8d0); +reg_write( DDR_REG_BASE +0x509a4*4+0x02000000,0xf00a); +reg_write( DDR_REG_BASE +0x509a5*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x509a6*4+0x02000000,0xf3); +reg_write( DDR_REG_BASE +0x509a7*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x509a8*4+0x02000000,0xd12); +reg_write( DDR_REG_BASE +0x509a9*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE +0x509aa*4+0x02000000,0x4260); +reg_write( DDR_REG_BASE +0x509ab*4+0x02000000,0x72ad); +reg_write( DDR_REG_BASE +0x509ac*4+0x02000000,0xde8c); +reg_write( DDR_REG_BASE +0x509ad*4+0x02000000,0xd880); +reg_write( DDR_REG_BASE +0x509ae*4+0x02000000,0x60f8); +reg_write( DDR_REG_BASE +0x509af*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x509b0*4+0x02000000,0x6c0); +reg_write( DDR_REG_BASE +0x509b1*4+0x02000000,0xc180); +reg_write( DDR_REG_BASE +0x509b2*4+0x02000000,0xb4e); +reg_write( DDR_REG_BASE +0x509b3*4+0x02000000,0x160); +reg_write( DDR_REG_BASE +0x509b4*4+0x02000000,0x724c); +reg_write( DDR_REG_BASE +0x509b5*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x509b6*4+0x02000000,0x722c); +reg_write( DDR_REG_BASE +0x509b7*4+0x02000000,0x80e); +reg_write( DDR_REG_BASE +0x509b8*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE +0x509b9*4+0x02000000,0xc280); +reg_write( DDR_REG_BASE +0x509ba*4+0x02000000,0xc080); +reg_write( DDR_REG_BASE +0x509bb*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x509bc*4+0x02000000,0xd1a); +reg_write( DDR_REG_BASE +0x509bd*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE +0x509be*4+0x02000000,0xdab4); +reg_write( DDR_REG_BASE +0x509bf*4+0x02000000,0x66fe); +reg_write( DDR_REG_BASE +0x509c0*4+0x02000000,0x2605); +reg_write( DDR_REG_BASE +0x509c1*4+0x02000000,0x16c0); +reg_write( DDR_REG_BASE +0x509c2*4+0x02000000,0xc180); +reg_write( DDR_REG_BASE +0x509c3*4+0x02000000,0xb2e); +reg_write( DDR_REG_BASE +0x509c4*4+0x02000000,0x160); +reg_write( DDR_REG_BASE +0x509c5*4+0x02000000,0x42a1); +reg_write( DDR_REG_BASE +0x509c6*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE +0x509c7*4+0x02000000,0x41a1); +reg_write( DDR_REG_BASE +0x509c8*4+0x02000000,0xfea); +reg_write( DDR_REG_BASE +0x509c9*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE +0x509ca*4+0x02000000,0xc280); +reg_write( DDR_REG_BASE +0x509cb*4+0x02000000,0x2480); +reg_write( DDR_REG_BASE +0x509cc*4+0x02000000,0x3d02); +reg_write( DDR_REG_BASE +0x509cd*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE +0x509ce*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE +0x509cf*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE +0x509d0*4+0x02000000,0xc3e2); +reg_write( DDR_REG_BASE +0x509d1*4+0x02000000,0x2482); +reg_write( DDR_REG_BASE +0x509d2*4+0x02000000,0x3d02); +reg_write( DDR_REG_BASE +0x509d3*4+0x02000000,0x4528); +reg_write( DDR_REG_BASE +0x509d4*4+0x02000000,0x4300); +reg_write( DDR_REG_BASE +0x509d5*4+0x02000000,0xc080); +reg_write( DDR_REG_BASE +0x509d6*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x509d7*4+0x02000000,0xce6); +reg_write( DDR_REG_BASE +0x509d8*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE +0x509d9*4+0x02000000,0xdab4); +reg_write( DDR_REG_BASE +0x509da*4+0x02000000,0x2354); +reg_write( DDR_REG_BASE +0x509db*4+0x02000000,0xd00); +reg_write( DDR_REG_BASE +0x509dc*4+0x02000000,0xc180); +reg_write( DDR_REG_BASE +0x509dd*4+0x02000000,0xafa); +reg_write( DDR_REG_BASE +0x509de*4+0x02000000,0x160); +reg_write( DDR_REG_BASE +0x509df*4+0x02000000,0xda09); +reg_write( DDR_REG_BASE +0x509e0*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE +0x509e1*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x509e2*4+0x02000000,0xf5); +reg_write( DDR_REG_BASE +0x509e3*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x509e4*4+0x02000000,0xc9a); +reg_write( DDR_REG_BASE +0x509e5*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE +0x509e6*4+0x02000000,0x42a1); +reg_write( DDR_REG_BASE +0x509e7*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x509e8*4+0x02000000,0xd909); +reg_write( DDR_REG_BASE +0x509e9*4+0x02000000,0xfaa); +reg_write( DDR_REG_BASE +0x509ea*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE +0x509eb*4+0x02000000,0xc280); +reg_write( DDR_REG_BASE +0x509ec*4+0x02000000,0xc7c2); +reg_write( DDR_REG_BASE +0x509ed*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x509ee*4+0x02000000,0xc0f1); +reg_write( DDR_REG_BASE +0x509ef*4+0x02000000,0x2482); +reg_write( DDR_REG_BASE +0x509f0*4+0x02000000,0x3d02); +reg_write( DDR_REG_BASE +0x509f1*4+0x02000000,0xc080); +reg_write( DDR_REG_BASE +0x509f2*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x509f3*4+0x02000000,0xcae); +reg_write( DDR_REG_BASE +0x509f4*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE +0x509f5*4+0x02000000,0xdab4); +reg_write( DDR_REG_BASE +0x509f6*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x509f7*4+0x02000000,0xf7); +reg_write( DDR_REG_BASE +0x509f8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x509f9*4+0x02000000,0xc72); +reg_write( DDR_REG_BASE +0x509fa*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE +0x509fb*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE +0x509fc*4+0x02000000,0xd840); +reg_write( DDR_REG_BASE +0x509fd*4+0x02000000,0xc180); +reg_write( DDR_REG_BASE +0x509fe*4+0x02000000,0xab6); +reg_write( DDR_REG_BASE +0x509ff*4+0x02000000,0x160); +reg_write( DDR_REG_BASE +0x50a00*4+0x02000000,0xda09); +reg_write( DDR_REG_BASE +0x50a01*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x50a02*4+0x02000000,0xd909); +reg_write( DDR_REG_BASE +0x50a03*4+0x02000000,0xf76); +reg_write( DDR_REG_BASE +0x50a04*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE +0x50a05*4+0x02000000,0xc280); +reg_write( DDR_REG_BASE +0x50a06*4+0x02000000,0x2480); +reg_write( DDR_REG_BASE +0x50a07*4+0x02000000,0x3d02); +reg_write( DDR_REG_BASE +0x50a08*4+0x02000000,0xc0d1); +reg_write( DDR_REG_BASE +0x50a09*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE +0x50a0a*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE +0x50a0b*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x50a0c*4+0x02000000,0x42eb); +reg_write( DDR_REG_BASE +0x50a0d*4+0x02000000,0xc0e6); +reg_write( DDR_REG_BASE +0x50a0e*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE +0x50a0f*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE +0x50a10*4+0x02000000,0xe4); +reg_write( DDR_REG_BASE +0x50a11*4+0x02000000,0x42c3); +reg_write( DDR_REG_BASE +0x50a12*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x50a13*4+0x02000000,0x7b2); +reg_write( DDR_REG_BASE +0x50a14*4+0x02000000,0x833); +reg_write( DDR_REG_BASE +0x50a15*4+0x02000000,0xb0); +reg_write( DDR_REG_BASE +0x50a16*4+0x02000000,0x718d); +reg_write( DDR_REG_BASE +0x50a17*4+0x02000000,0x7114); +reg_write( DDR_REG_BASE +0x50a18*4+0x02000000,0xd823); +reg_write( DDR_REG_BASE +0x50a19*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE +0x50a1a*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE +0x50a1b*4+0x02000000,0x30); +reg_write( DDR_REG_BASE +0x50a1c*4+0x02000000,0xb89f); +reg_write( DDR_REG_BASE +0x50a1d*4+0x02000000,0xf427); +reg_write( DDR_REG_BASE +0x50a1e*4+0x02000000,0x8a25); +reg_write( DDR_REG_BASE +0x50a1f*4+0x02000000,0xaa23); +reg_write( DDR_REG_BASE +0x50a20*4+0x02000000,0x8aa4); +reg_write( DDR_REG_BASE +0x50a21*4+0x02000000,0x7c34); +reg_write( DDR_REG_BASE +0x50a22*4+0x02000000,0xaaa2); +reg_write( DDR_REG_BASE +0x50a23*4+0x02000000,0x96c0); +reg_write( DDR_REG_BASE +0x50a24*4+0x02000000,0x88e0); +reg_write( DDR_REG_BASE +0x50a25*4+0x02000000,0x78bb); +reg_write( DDR_REG_BASE +0x50a26*4+0x02000000,0xb3e0); +reg_write( DDR_REG_BASE +0x50a27*4+0x02000000,0xaa00); +reg_write( DDR_REG_BASE +0x50a28*4+0x02000000,0xe4d); +reg_write( DDR_REG_BASE +0x50a29*4+0x02000000,0x1171); +reg_write( DDR_REG_BASE +0x50a2a*4+0x02000000,0xaa81); +reg_write( DDR_REG_BASE +0x50a2b*4+0x02000000,0xb3e1); +reg_write( DDR_REG_BASE +0x50a2c*4+0x02000000,0xf024); +reg_write( DDR_REG_BASE +0x50a2d*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x50a2e*4+0x02000000,0xb300); +reg_write( DDR_REG_BASE +0x50a2f*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x50a30*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE +0x50a31*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x50a32*4+0x02000000,0x49); +reg_write( DDR_REG_BASE +0x50a33*4+0x02000000,0xb321); +reg_write( DDR_REG_BASE +0x50a34*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE +0x50a35*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE +0x50a36*4+0x02000000,0xf6); +reg_write( DDR_REG_BASE +0x50a37*4+0x02000000,0xb300); +reg_write( DDR_REG_BASE +0x50a38*4+0x02000000,0xb304); +reg_write( DDR_REG_BASE +0x50a39*4+0x02000000,0x1b06); +reg_write( DDR_REG_BASE +0x50a3a*4+0x02000000,0x3c5); +reg_write( DDR_REG_BASE +0x50a3b*4+0x02000000,0x8a27); +reg_write( DDR_REG_BASE +0x50a3c*4+0x02000000,0xaa23); +reg_write( DDR_REG_BASE +0x50a3d*4+0x02000000,0x8a06); +reg_write( DDR_REG_BASE +0x50a3e*4+0x02000000,0xf818); +reg_write( DDR_REG_BASE +0x50a3f*4+0x02000000,0x1bfe); +reg_write( DDR_REG_BASE +0x50a40*4+0x02000000,0x83c5); +reg_write( DDR_REG_BASE +0x50a41*4+0x02000000,0x4759); +reg_write( DDR_REG_BASE +0x50a42*4+0x02000000,0xc4c6); +reg_write( DDR_REG_BASE +0x50a43*4+0x02000000,0x88a0); +reg_write( DDR_REG_BASE +0x50a44*4+0x02000000,0xb3a0); +reg_write( DDR_REG_BASE +0x50a45*4+0x02000000,0x8a27); +reg_write( DDR_REG_BASE +0x50a46*4+0x02000000,0xaa23); +reg_write( DDR_REG_BASE +0x50a47*4+0x02000000,0x8a04); +reg_write( DDR_REG_BASE +0x50a48*4+0x02000000,0xf813); +reg_write( DDR_REG_BASE +0x50a49*4+0x02000000,0x9600); +reg_write( DDR_REG_BASE +0x50a4a*4+0x02000000,0x827); +reg_write( DDR_REG_BASE +0x50a4b*4+0x02000000,0x151); +reg_write( DDR_REG_BASE +0x50a4c*4+0x02000000,0xb3a1); +reg_write( DDR_REG_BASE +0x50a4d*4+0x02000000,0xf016); +reg_write( DDR_REG_BASE +0x50a4e*4+0x02000000,0x1b02); +reg_write( DDR_REG_BASE +0x50a4f*4+0x02000000,0x5); +reg_write( DDR_REG_BASE +0x50a50*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x50a51*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE +0x50a52*4+0x02000000,0xfe); +reg_write( DDR_REG_BASE +0x50a53*4+0x02000000,0x1800); +reg_write( DDR_REG_BASE +0x50a54*4+0x02000000,0x3c5); +reg_write( DDR_REG_BASE +0x50a55*4+0x02000000,0x18f8); +reg_write( DDR_REG_BASE +0x50a56*4+0x02000000,0x83c5); +reg_write( DDR_REG_BASE +0x50a57*4+0x02000000,0x18f6); +reg_write( DDR_REG_BASE +0x50a58*4+0x02000000,0x8005); +reg_write( DDR_REG_BASE +0x50a59*4+0x02000000,0x18fe); +reg_write( DDR_REG_BASE +0x50a5a*4+0x02000000,0x8005); +reg_write( DDR_REG_BASE +0x50a5b*4+0x02000000,0x4759); +reg_write( DDR_REG_BASE +0x50a5c*4+0x02000000,0xc4c6); +reg_write( DDR_REG_BASE +0x50a5d*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x50a5e*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE +0x50a5f*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x50a60*4+0x02000000,0x49); +reg_write( DDR_REG_BASE +0x50a61*4+0x02000000,0xb301); +reg_write( DDR_REG_BASE +0x50a62*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x50a63*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x50a64*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE +0x50a65*4+0x02000000,0xf6); +reg_write( DDR_REG_BASE +0x50a66*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE +0x50a67*4+0x02000000,0xb024); +reg_write( DDR_REG_BASE +0x50a68*4+0x02000000,0x18fe); +reg_write( DDR_REG_BASE +0x50a69*4+0x02000000,0x8044); +reg_write( DDR_REG_BASE +0x50a6a*4+0x02000000,0xb023); +reg_write( DDR_REG_BASE +0x50a6b*4+0x02000000,0x4759); +reg_write( DDR_REG_BASE +0x50a6c*4+0x02000000,0xc4c6); +reg_write( DDR_REG_BASE +0x50a6d*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x50a6e*4+0x02000000,0x7c34); +reg_write( DDR_REG_BASE +0x50a6f*4+0x02000000,0xaa02); +reg_write( DDR_REG_BASE +0x50a70*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE +0x50a71*4+0x02000000,0xaa00); +reg_write( DDR_REG_BASE +0x50a72*4+0x02000000,0xaa81); +reg_write( DDR_REG_BASE +0x50a73*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE +0x50a74*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE +0x50a75*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE +0x50a76*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE +0x50a77*4+0x02000000,0x47cb); +reg_write( DDR_REG_BASE +0x50a78*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE +0x50a79*4+0x02000000,0x1e0); +reg_write( DDR_REG_BASE +0x50a7a*4+0x02000000,0x9720); +reg_write( DDR_REG_BASE +0x50a7b*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x50a7c*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE +0x50a7d*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x50a7e*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x50a7f*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE +0x50a80*4+0x02000000,0x205f); +reg_write( DDR_REG_BASE +0x50a81*4+0x02000000,0x100); +reg_write( DDR_REG_BASE +0x50a82*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE +0x50a83*4+0x02000000,0x7c2); +reg_write( DDR_REG_BASE +0x50a84*4+0x02000000,0x4020); +reg_write( DDR_REG_BASE +0x50a85*4+0x02000000,0xea06); +reg_write( DDR_REG_BASE +0x50a86*4+0x02000000,0xba61); +reg_write( DDR_REG_BASE +0x50a87*4+0x02000000,0xa01); +reg_write( DDR_REG_BASE +0x50a88*4+0x02000000,0x31); +reg_write( DDR_REG_BASE +0x50a89*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x50a8a*4+0x02000000,0xb8c3); +reg_write( DDR_REG_BASE +0x50a8b*4+0x02000000,0x80f); +reg_write( DDR_REG_BASE +0x50a8c*4+0x02000000,0x70); +reg_write( DDR_REG_BASE +0x50a8d*4+0x02000000,0xc1a1); +reg_write( DDR_REG_BASE +0x50a8e*4+0x02000000,0x807); +reg_write( DDR_REG_BASE +0x50a8f*4+0x02000000,0x190); +reg_write( DDR_REG_BASE +0x50a90*4+0x02000000,0x71ad); +reg_write( DDR_REG_BASE +0x50a91*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x50a92*4+0x02000000,0x996); +reg_write( DDR_REG_BASE +0x50a93*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE +0x50a94*4+0x02000000,0xd940); +reg_write( DDR_REG_BASE +0x50a95*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE +0x50a96*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE +0x50a97*4+0x02000000,0xe112); +reg_write( DDR_REG_BASE +0x50a98*4+0x02000000,0x1ede); +reg_write( DDR_REG_BASE +0x50a99*4+0x02000000,0x1055); +reg_write( DDR_REG_BASE +0x50a9a*4+0x02000000,0x1ea6); +reg_write( DDR_REG_BASE +0x50a9b*4+0x02000000,0x9055); +reg_write( DDR_REG_BASE +0x50a9c*4+0x02000000,0x17b6); +reg_write( DDR_REG_BASE +0x50a9d*4+0x02000000,0x9100); +reg_write( DDR_REG_BASE +0x50a9e*4+0x02000000,0x716f); +reg_write( DDR_REG_BASE +0x50a9f*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE +0x50aa0*4+0x02000000,0xed29); +reg_write( DDR_REG_BASE +0x50aa1*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE +0x50aa2*4+0x02000000,0x84f); +reg_write( DDR_REG_BASE +0x50aa3*4+0x02000000,0x3bf); +reg_write( DDR_REG_BASE +0x50aa4*4+0x02000000,0xd91c); +reg_write( DDR_REG_BASE +0x50aa5*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE +0x50aa6*4+0x02000000,0x2084); +reg_write( DDR_REG_BASE +0x50aa7*4+0x02000000,0xc07); +reg_write( DDR_REG_BASE +0x50aa8*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE +0x50aa9*4+0x02000000,0xb88f); +reg_write( DDR_REG_BASE +0x50aaa*4+0x02000000,0xb600); +reg_write( DDR_REG_BASE +0x50aab*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x50aac*4+0x02000000,0x962); +reg_write( DDR_REG_BASE +0x50aad*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE +0x50aae*4+0x02000000,0x1ef6); +reg_write( DDR_REG_BASE +0x50aaf*4+0x02000000,0x9205); +reg_write( DDR_REG_BASE +0x50ab0*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x50ab1*4+0x02000000,0xf); +reg_write( DDR_REG_BASE +0x50ab2*4+0x02000000,0x4240); +reg_write( DDR_REG_BASE +0x50ab3*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x50ab4*4+0x02000000,0x952); +reg_write( DDR_REG_BASE +0x50ab5*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE +0x50ab6*4+0x02000000,0x1ef6); +reg_write( DDR_REG_BASE +0x50ab7*4+0x02000000,0x9245); +reg_write( DDR_REG_BASE +0x50ab8*4+0x02000000,0x17be); +reg_write( DDR_REG_BASE +0x50ab9*4+0x02000000,0x9100); +reg_write( DDR_REG_BASE +0x50aba*4+0x02000000,0x1ef0); +reg_write( DDR_REG_BASE +0x50abb*4+0x02000000,0x9045); +reg_write( DDR_REG_BASE +0x50abc*4+0x02000000,0x1ef6); +reg_write( DDR_REG_BASE +0x50abd*4+0x02000000,0x9205); +reg_write( DDR_REG_BASE +0x50abe*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE +0x50abf*4+0x02000000,0x8); +reg_write( DDR_REG_BASE +0x50ac0*4+0x02000000,0x2004); +reg_write( DDR_REG_BASE +0x50ac1*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE +0x50ac2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50ac3*4+0x02000000,0x3e00); +reg_write( DDR_REG_BASE +0x50ac4*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE +0x50ac5*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE +0x50ac6*4+0x02000000,0xb88e); +reg_write( DDR_REG_BASE +0x50ac7*4+0x02000000,0xb600); +reg_write( DDR_REG_BASE +0x50ac8*4+0x02000000,0xf005); +reg_write( DDR_REG_BASE +0x50ac9*4+0x02000000,0x1ef6); +reg_write( DDR_REG_BASE +0x50aca*4+0x02000000,0x9205); +reg_write( DDR_REG_BASE +0x50acb*4+0x02000000,0x1ef0); +reg_write( DDR_REG_BASE +0x50acc*4+0x02000000,0x9045); +reg_write( DDR_REG_BASE +0x50acd*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x50ace*4+0x02000000,0x76c4); +reg_write( DDR_REG_BASE +0x50acf*4+0x02000000,0x9013); +reg_write( DDR_REG_BASE +0x50ad0*4+0x02000000,0xe050); +reg_write( DDR_REG_BASE +0x50ad1*4+0x02000000,0x7487); +reg_write( DDR_REG_BASE +0x50ad2*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE +0x50ad3*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE +0x50ad4*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE +0x50ad5*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x50ad6*4+0x02000000,0xc2e2); +reg_write( DDR_REG_BASE +0x50ad7*4+0x02000000,0xc1a4); +reg_write( DDR_REG_BASE +0x50ad8*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x50ad9*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x50ada*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE +0x50adb*4+0x02000000,0xdb08); +reg_write( DDR_REG_BASE +0x50adc*4+0x02000000,0x4528); +reg_write( DDR_REG_BASE +0x50add*4+0x02000000,0xc143); +reg_write( DDR_REG_BASE +0x50ade*4+0x02000000,0xc142); +reg_write( DDR_REG_BASE +0x50adf*4+0x02000000,0xc141); +reg_write( DDR_REG_BASE +0x50ae0*4+0x02000000,0xf2a); +reg_write( DDR_REG_BASE +0x50ae1*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE +0x50ae2*4+0x02000000,0xc140); +reg_write( DDR_REG_BASE +0x50ae3*4+0x02000000,0xd90c); +reg_write( DDR_REG_BASE +0x50ae4*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x50ae5*4+0x02000000,0xb990); +reg_write( DDR_REG_BASE +0x50ae6*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE +0x50ae7*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE +0x50ae8*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE +0x50ae9*4+0x02000000,0x1c08); +reg_write( DDR_REG_BASE +0x50aea*4+0x02000000,0x3101); +reg_write( DDR_REG_BASE +0x50aeb*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE +0x50aec*4+0x02000000,0xf12); +reg_write( DDR_REG_BASE +0x50aed*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE +0x50aee*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE +0x50aef*4+0x02000000,0xc0a4); +reg_write( DDR_REG_BASE +0x50af0*4+0x02000000,0xc6c2); +reg_write( DDR_REG_BASE +0x50af1*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x50af2*4+0x02000000,0xc2e4); +reg_write( DDR_REG_BASE +0x50af3*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE +0x50af4*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE +0x50af5*4+0x02000000,0x256f); +reg_write( DDR_REG_BASE +0x50af6*4+0x02000000,0x1343); +reg_write( DDR_REG_BASE +0x50af7*4+0x02000000,0x4320); +reg_write( DDR_REG_BASE +0x50af8*4+0x02000000,0x9520); +reg_write( DDR_REG_BASE +0x50af9*4+0x02000000,0x218c); +reg_write( DDR_REG_BASE +0x50afa*4+0x02000000,0x864a); +reg_write( DDR_REG_BASE +0x50afb*4+0x02000000,0x7a); +reg_write( DDR_REG_BASE +0x50afc*4+0x02000000,0x2d); +reg_write( DDR_REG_BASE +0x50afd*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x50afe*4+0x02000000,0xa0e); +reg_write( DDR_REG_BASE +0x50aff*4+0x02000000,0xffcf); +reg_write( DDR_REG_BASE +0x50b00*4+0x02000000,0x260a); +reg_write( DDR_REG_BASE +0x50b01*4+0x02000000,0x3000); +reg_write( DDR_REG_BASE +0x50b02*4+0x02000000,0x15fe); +reg_write( DDR_REG_BASE +0x50b03*4+0x02000000,0x9080); +reg_write( DDR_REG_BASE +0x50b04*4+0x02000000,0x706f); +reg_write( DDR_REG_BASE +0x50b05*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE +0x50b06*4+0x02000000,0xf8d); +reg_write( DDR_REG_BASE +0x50b07*4+0x02000000,0x10); +reg_write( DDR_REG_BASE +0x50b08*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50b09*4+0x02000000,0xf02b); +reg_write( DDR_REG_BASE +0x50b0a*4+0x02000000,0x231a); +reg_write( DDR_REG_BASE +0x50b0b*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE +0x50b0c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50b0d*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE +0x50b0e*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE +0x50b0f*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x50b10*4+0x02000000,0x341); +reg_write( DDR_REG_BASE +0x50b11*4+0x02000000,0x4063); +reg_write( DDR_REG_BASE +0x50b12*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE +0x50b13*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x50b14*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE +0x50b15*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE +0x50b16*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x50b17*4+0x02000000,0xf8e); +reg_write( DDR_REG_BASE +0x50b18*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE +0x50b19*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50b1a*4+0x02000000,0xa5e); +reg_write( DDR_REG_BASE +0x50b1b*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE +0x50b1c*4+0x02000000,0x9600); +reg_write( DDR_REG_BASE +0x50b1d*4+0x02000000,0xe01c); +reg_write( DDR_REG_BASE +0x50b1e*4+0x02000000,0x7a0e); +reg_write( DDR_REG_BASE +0x50b1f*4+0x02000000,0x785c); +reg_write( DDR_REG_BASE +0x50b20*4+0x02000000,0x781c); +reg_write( DDR_REG_BASE +0x50b21*4+0x02000000,0x781c); +reg_write( DDR_REG_BASE +0x50b22*4+0x02000000,0x781c); +reg_write( DDR_REG_BASE +0x50b23*4+0x02000000,0x4100); +reg_write( DDR_REG_BASE +0x50b24*4+0x02000000,0xd81b); +reg_write( DDR_REG_BASE +0x50b25*4+0x02000000,0xb861); +reg_write( DDR_REG_BASE +0x50b26*4+0x02000000,0x8ff); +reg_write( DDR_REG_BASE +0x50b27*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE +0x50b28*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE +0x50b29*4+0x02000000,0x7167); +reg_write( DDR_REG_BASE +0x50b2a*4+0x02000000,0x6238); +reg_write( DDR_REG_BASE +0x50b2b*4+0x02000000,0xb8c4); +reg_write( DDR_REG_BASE +0x50b2c*4+0x02000000,0x4831); +reg_write( DDR_REG_BASE +0x50b2d*4+0x02000000,0x2a44); +reg_write( DDR_REG_BASE +0x50b2e*4+0x02000000,0x800); +reg_write( DDR_REG_BASE +0x50b2f*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE +0x50b30*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x50b31*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE +0x50b32*4+0x02000000,0xb600); +reg_write( DDR_REG_BASE +0x50b33*4+0x02000000,0xbb1); +reg_write( DDR_REG_BASE +0x50b34*4+0x02000000,0xb0b4); +reg_write( DDR_REG_BASE +0x50b35*4+0x02000000,0x2655); +reg_write( DDR_REG_BASE +0x50b36*4+0x02000000,0x3800); +reg_write( DDR_REG_BASE +0x50b37*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE +0x50b38*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE +0x50b39*4+0x02000000,0xc6c4); +reg_write( DDR_REG_BASE +0x50b3a*4+0x02000000,0xc2e2); +reg_write( DDR_REG_BASE +0x50b3b*4+0x02000000,0x45cb); +reg_write( DDR_REG_BASE +0x50b3c*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE +0x50b3d*4+0x02000000,0x6); +reg_write( DDR_REG_BASE +0x50b3e*4+0x02000000,0xd820); +reg_write( DDR_REG_BASE +0x50b3f*4+0x02000000,0xfe6); +reg_write( DDR_REG_BASE +0x50b40*4+0x02000000,0x60); +reg_write( DDR_REG_BASE +0x50b41*4+0x02000000,0x1d00); +reg_write( DDR_REG_BASE +0x50b42*4+0x02000000,0x1045); +reg_write( DDR_REG_BASE +0x50b43*4+0x02000000,0x1d00); +reg_write( DDR_REG_BASE +0x50b44*4+0x02000000,0x1005); +reg_write( DDR_REG_BASE +0x50b45*4+0x02000000,0xc6c2); +reg_write( DDR_REG_BASE +0x50b46*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE +0x50b47*4+0x02000000,0x45cb); +reg_write( DDR_REG_BASE +0x50b48*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE +0x50b49*4+0x02000000,0x1c6); +reg_write( DDR_REG_BASE +0x50b4a*4+0x02000000,0x95c0); +reg_write( DDR_REG_BASE +0x50b4b*4+0x02000000,0xbecb); +reg_write( DDR_REG_BASE +0x50b4c*4+0x02000000,0x264f); +reg_write( DDR_REG_BASE +0x50b4d*4+0x02000000,0x12cf); +reg_write( DDR_REG_BASE +0x50b4e*4+0x02000000,0x2605); +reg_write( DDR_REG_BASE +0x50b4f*4+0x02000000,0x1f80); +reg_write( DDR_REG_BASE +0x50b50*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50b51*4+0x02000000,0xc00); +reg_write( DDR_REG_BASE +0x50b52*4+0x02000000,0xb5e0); +reg_write( DDR_REG_BASE +0x50b53*4+0x02000000,0xb500); +reg_write( DDR_REG_BASE +0x50b54*4+0x02000000,0xfba); +reg_write( DDR_REG_BASE +0x50b55*4+0x02000000,0x60); +reg_write( DDR_REG_BASE +0x50b56*4+0x02000000,0xd80a); +reg_write( DDR_REG_BASE +0x50b57*4+0x02000000,0xb5e0); +reg_write( DDR_REG_BASE +0x50b58*4+0x02000000,0x9501); +reg_write( DDR_REG_BASE +0x50b59*4+0x02000000,0xb5c0); +reg_write( DDR_REG_BASE +0x50b5a*4+0x02000000,0xb8c9); +reg_write( DDR_REG_BASE +0x50b5b*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE +0x50b5c*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE +0x50b5d*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE +0x50b5e*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE +0x50b5f*4+0x02000000,0xc1a6); +reg_write( DDR_REG_BASE +0x50b60*4+0x02000000,0x4378); +reg_write( DDR_REG_BASE +0x50b61*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x50b62*4+0x02000000,0x7103); +reg_write( DDR_REG_BASE +0x50b63*4+0x02000000,0x9018); +reg_write( DDR_REG_BASE +0x50b64*4+0x02000000,0x1dc); +reg_write( DDR_REG_BASE +0x50b65*4+0x02000000,0x1201); +reg_write( DDR_REG_BASE +0x50b66*4+0x02000000,0x308d); +reg_write( DDR_REG_BASE +0x50b67*4+0x02000000,0xc70b); +reg_write( DDR_REG_BASE +0x50b68*4+0x02000000,0x264a); +reg_write( DDR_REG_BASE +0x50b69*4+0x02000000,0x3000); +reg_write( DDR_REG_BASE +0x50b6a*4+0x02000000,0x706c); +reg_write( DDR_REG_BASE +0x50b6b*4+0x02000000,0x47db); +reg_write( DDR_REG_BASE +0x50b6c*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE +0x50b6d*4+0x02000000,0x200); +reg_write( DDR_REG_BASE +0x50b6e*4+0x02000000,0xf00f); +reg_write( DDR_REG_BASE +0x50b6f*4+0x02000000,0x2305); +reg_write( DDR_REG_BASE +0x50b70*4+0x02000000,0x17cc); +reg_write( DDR_REG_BASE +0x50b71*4+0x02000000,0x9480); +reg_write( DDR_REG_BASE +0x50b72*4+0x02000000,0xc680); +reg_write( DDR_REG_BASE +0x50b73*4+0x02000000,0x667e); +reg_write( DDR_REG_BASE +0x50b74*4+0x02000000,0xae80); +reg_write( DDR_REG_BASE +0x50b75*4+0x02000000,0x2740); +reg_write( DDR_REG_BASE +0x50b76*4+0x02000000,0x380c); +reg_write( DDR_REG_BASE +0x50b77*4+0x02000000,0x2405); +reg_write( DDR_REG_BASE +0x50b78*4+0x02000000,0x12cc); +reg_write( DDR_REG_BASE +0x50b79*4+0x02000000,0x9480); +reg_write( DDR_REG_BASE +0x50b7a*4+0x02000000,0x7164); +reg_write( DDR_REG_BASE +0x50b7b*4+0x02000000,0xe40c); +reg_write( DDR_REG_BASE +0x50b7c*4+0x02000000,0xae8c); +reg_write( DDR_REG_BASE +0x50b7d*4+0x02000000,0xbe7); +reg_write( DDR_REG_BASE +0x50b7e*4+0x02000000,0x82b4); +reg_write( DDR_REG_BASE +0x50b7f*4+0x02000000,0x232f); +reg_write( DDR_REG_BASE +0x50b80*4+0x02000000,0x10c0); +reg_write( DDR_REG_BASE +0x50b81*4+0x02000000,0xe58c); +reg_write( DDR_REG_BASE +0x50b82*4+0x02000000,0x256); +reg_write( DDR_REG_BASE +0x50b83*4+0x02000000,0x2d); +reg_write( DDR_REG_BASE +0x50b84*4+0x02000000,0x238a); +reg_write( DDR_REG_BASE +0x50b85*4+0x02000000,0x205); +reg_write( DDR_REG_BASE +0x50b86*4+0x02000000,0xb7f); +reg_write( DDR_REG_BASE +0x50b87*4+0x02000000,0x36e); +reg_write( DDR_REG_BASE +0x50b88*4+0x02000000,0x738d); +reg_write( DDR_REG_BASE +0x50b89*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE +0x50b8a*4+0x02000000,0x72ad); +reg_write( DDR_REG_BASE +0x50b8b*4+0x02000000,0x1b00); +reg_write( DDR_REG_BASE +0x50b8c*4+0x02000000,0x3302); +reg_write( DDR_REG_BASE +0x50b8d*4+0x02000000,0x1f02); +reg_write( DDR_REG_BASE +0x50b8e*4+0x02000000,0x1782); +reg_write( DDR_REG_BASE +0x50b8f*4+0x02000000,0x1f01); +reg_write( DDR_REG_BASE +0x50b90*4+0x02000000,0x1782); +reg_write( DDR_REG_BASE +0x50b91*4+0x02000000,0x1f00); +reg_write( DDR_REG_BASE +0x50b92*4+0x02000000,0x1782); +reg_write( DDR_REG_BASE +0x50b93*4+0x02000000,0xa962); +reg_write( DDR_REG_BASE +0x50b94*4+0x02000000,0xa981); +reg_write( DDR_REG_BASE +0x50b95*4+0x02000000,0xa9a0); +reg_write( DDR_REG_BASE +0x50b96*4+0x02000000,0xaaa4); +reg_write( DDR_REG_BASE +0x50b97*4+0x02000000,0x1a03); +reg_write( DDR_REG_BASE +0x50b98*4+0x02000000,0x43); +reg_write( DDR_REG_BASE +0x50b99*4+0x02000000,0x1a02); +reg_write( DDR_REG_BASE +0x50b9a*4+0x02000000,0x782); +reg_write( DDR_REG_BASE +0x50b9b*4+0x02000000,0xc120); +reg_write( DDR_REG_BASE +0x50b9c*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50b9d*4+0x02000000,0xa9a0); +reg_write( DDR_REG_BASE +0x50b9e*4+0x02000000,0x1401); +reg_write( DDR_REG_BASE +0x50b9f*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE +0x50ba0*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50ba1*4+0x02000000,0xa9a0); +reg_write( DDR_REG_BASE +0x50ba2*4+0x02000000,0x1402); +reg_write( DDR_REG_BASE +0x50ba3*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE +0x50ba4*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50ba5*4+0x02000000,0xa9a0); +reg_write( DDR_REG_BASE +0x50ba6*4+0x02000000,0x1403); +reg_write( DDR_REG_BASE +0x50ba7*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE +0x50ba8*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50ba9*4+0x02000000,0xa9a0); +reg_write( DDR_REG_BASE +0x50baa*4+0x02000000,0xc121); +reg_write( DDR_REG_BASE +0x50bab*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50bac*4+0x02000000,0xa980); +reg_write( DDR_REG_BASE +0x50bad*4+0x02000000,0x1405); +reg_write( DDR_REG_BASE +0x50bae*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE +0x50baf*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50bb0*4+0x02000000,0xa980); +reg_write( DDR_REG_BASE +0x50bb1*4+0x02000000,0x1406); +reg_write( DDR_REG_BASE +0x50bb2*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE +0x50bb3*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50bb4*4+0x02000000,0xa980); +reg_write( DDR_REG_BASE +0x50bb5*4+0x02000000,0x1407); +reg_write( DDR_REG_BASE +0x50bb6*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE +0x50bb7*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50bb8*4+0x02000000,0xa980); +reg_write( DDR_REG_BASE +0x50bb9*4+0x02000000,0xc122); +reg_write( DDR_REG_BASE +0x50bba*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50bbb*4+0x02000000,0xa960); +reg_write( DDR_REG_BASE +0x50bbc*4+0x02000000,0x1409); +reg_write( DDR_REG_BASE +0x50bbd*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE +0x50bbe*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50bbf*4+0x02000000,0xa960); +reg_write( DDR_REG_BASE +0x50bc0*4+0x02000000,0x180b); +reg_write( DDR_REG_BASE +0x50bc1*4+0x02000000,0x782); +reg_write( DDR_REG_BASE +0x50bc2*4+0x02000000,0x180a); +reg_write( DDR_REG_BASE +0x50bc3*4+0x02000000,0x43); +reg_write( DDR_REG_BASE +0x50bc4*4+0x02000000,0xf0e9); +reg_write( DDR_REG_BASE +0x50bc5*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE +0x50bc6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50bc7*4+0x02000000,0x1400); +reg_write( DDR_REG_BASE +0x50bc8*4+0x02000000,0x2311); +reg_write( DDR_REG_BASE +0x50bc9*4+0x02000000,0x8340); +reg_write( DDR_REG_BASE +0x50bca*4+0x02000000,0xf2e3); +reg_write( DDR_REG_BASE +0x50bcb*4+0x02000000,0x718d); +reg_write( DDR_REG_BASE +0x50bcc*4+0x02000000,0xaf85); +reg_write( DDR_REG_BASE +0x50bcd*4+0x02000000,0xaf84); +reg_write( DDR_REG_BASE +0x50bce*4+0x02000000,0xaf83); +reg_write( DDR_REG_BASE +0x50bcf*4+0x02000000,0x1f02); +reg_write( DDR_REG_BASE +0x50bd0*4+0x02000000,0x1782); +reg_write( DDR_REG_BASE +0x50bd1*4+0x02000000,0x1f01); +reg_write( DDR_REG_BASE +0x50bd2*4+0x02000000,0x1782); +reg_write( DDR_REG_BASE +0x50bd3*4+0x02000000,0x1f00); +reg_write( DDR_REG_BASE +0x50bd4*4+0x02000000,0x1782); +reg_write( DDR_REG_BASE +0x50bd5*4+0x02000000,0x76ef); +reg_write( DDR_REG_BASE +0x50bd6*4+0x02000000,0xe58c); +reg_write( DDR_REG_BASE +0x50bd7*4+0x02000000,0xde08); +reg_write( DDR_REG_BASE +0x50bd8*4+0x02000000,0xdf07); +reg_write( DDR_REG_BASE +0x50bd9*4+0x02000000,0x73ad); +reg_write( DDR_REG_BASE +0x50bda*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE +0x50bdb*4+0x02000000,0x746d); +reg_write( DDR_REG_BASE +0x50bdc*4+0x02000000,0x1b00); +reg_write( DDR_REG_BASE +0x50bdd*4+0x02000000,0x37c2); +reg_write( DDR_REG_BASE +0x50bde*4+0x02000000,0xf467); +reg_write( DDR_REG_BASE +0x50bdf*4+0x02000000,0xa9c5); +reg_write( DDR_REG_BASE +0x50be0*4+0x02000000,0xa9e4); +reg_write( DDR_REG_BASE +0x50be1*4+0x02000000,0x1903); +reg_write( DDR_REG_BASE +0x50be2*4+0x02000000,0x7c2); +reg_write( DDR_REG_BASE +0x50be3*4+0x02000000,0xa9a2); +reg_write( DDR_REG_BASE +0x50be4*4+0x02000000,0xa961); +reg_write( DDR_REG_BASE +0x50be5*4+0x02000000,0xa980); +reg_write( DDR_REG_BASE +0x50be6*4+0x02000000,0x752c); +reg_write( DDR_REG_BASE +0x50be7*4+0x02000000,0xaa28); +reg_write( DDR_REG_BASE +0x50be8*4+0x02000000,0x1a07); +reg_write( DDR_REG_BASE +0x50be9*4+0x02000000,0x2c2); +reg_write( DDR_REG_BASE +0x50bea*4+0x02000000,0xaaa6); +reg_write( DDR_REG_BASE +0x50beb*4+0x02000000,0xaa63); +reg_write( DDR_REG_BASE +0x50bec*4+0x02000000,0xaa82); +reg_write( DDR_REG_BASE +0x50bed*4+0x02000000,0x1a01); +reg_write( DDR_REG_BASE +0x50bee*4+0x02000000,0x782); +reg_write( DDR_REG_BASE +0x50bef*4+0x02000000,0xc120); +reg_write( DDR_REG_BASE +0x50bf0*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50bf1*4+0x02000000,0xa9a0); +reg_write( DDR_REG_BASE +0x50bf2*4+0x02000000,0x1401); +reg_write( DDR_REG_BASE +0x50bf3*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE +0x50bf4*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50bf5*4+0x02000000,0xa980); +reg_write( DDR_REG_BASE +0x50bf6*4+0x02000000,0x1402); +reg_write( DDR_REG_BASE +0x50bf7*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE +0x50bf8*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50bf9*4+0x02000000,0xa9a0); +reg_write( DDR_REG_BASE +0x50bfa*4+0x02000000,0x1403); +reg_write( DDR_REG_BASE +0x50bfb*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE +0x50bfc*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50bfd*4+0x02000000,0xa960); +reg_write( DDR_REG_BASE +0x50bfe*4+0x02000000,0xc121); +reg_write( DDR_REG_BASE +0x50bff*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50c00*4+0x02000000,0xa960); +reg_write( DDR_REG_BASE +0x50c01*4+0x02000000,0x1405); +reg_write( DDR_REG_BASE +0x50c02*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE +0x50c03*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50c04*4+0x02000000,0xa980); +reg_write( DDR_REG_BASE +0x50c05*4+0x02000000,0x1406); +reg_write( DDR_REG_BASE +0x50c06*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE +0x50c07*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50c08*4+0x02000000,0xa960); +reg_write( DDR_REG_BASE +0x50c09*4+0x02000000,0x1407); +reg_write( DDR_REG_BASE +0x50c0a*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE +0x50c0b*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50c0c*4+0x02000000,0xa960); +reg_write( DDR_REG_BASE +0x50c0d*4+0x02000000,0xc122); +reg_write( DDR_REG_BASE +0x50c0e*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50c0f*4+0x02000000,0xa980); +reg_write( DDR_REG_BASE +0x50c10*4+0x02000000,0x1409); +reg_write( DDR_REG_BASE +0x50c11*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE +0x50c12*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50c13*4+0x02000000,0xa980); +reg_write( DDR_REG_BASE +0x50c14*4+0x02000000,0x180b); +reg_write( DDR_REG_BASE +0x50c15*4+0x02000000,0x243); +reg_write( DDR_REG_BASE +0x50c16*4+0x02000000,0x180a); +reg_write( DDR_REG_BASE +0x50c17*4+0x02000000,0x2c2); +reg_write( DDR_REG_BASE +0x50c18*4+0x02000000,0xc123); +reg_write( DDR_REG_BASE +0x50c19*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50c1a*4+0x02000000,0xa9e0); +reg_write( DDR_REG_BASE +0x50c1b*4+0x02000000,0x140d); +reg_write( DDR_REG_BASE +0x50c1c*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE +0x50c1d*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50c1e*4+0x02000000,0xa9c0); +reg_write( DDR_REG_BASE +0x50c1f*4+0x02000000,0x140e); +reg_write( DDR_REG_BASE +0x50c20*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE +0x50c21*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50c22*4+0x02000000,0xa9c0); +reg_write( DDR_REG_BASE +0x50c23*4+0x02000000,0x140f); +reg_write( DDR_REG_BASE +0x50c24*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE +0x50c25*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50c26*4+0x02000000,0xa9c0); +reg_write( DDR_REG_BASE +0x50c27*4+0x02000000,0xc124); +reg_write( DDR_REG_BASE +0x50c28*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50c29*4+0x02000000,0xa9e0); +reg_write( DDR_REG_BASE +0x50c2a*4+0x02000000,0x1411); +reg_write( DDR_REG_BASE +0x50c2b*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE +0x50c2c*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50c2d*4+0x02000000,0x1900); +reg_write( DDR_REG_BASE +0x50c2e*4+0x02000000,0x7c2); +reg_write( DDR_REG_BASE +0x50c2f*4+0x02000000,0x1412); +reg_write( DDR_REG_BASE +0x50c30*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE +0x50c31*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50c32*4+0x02000000,0x1900); +reg_write( DDR_REG_BASE +0x50c33*4+0x02000000,0x7c2); +reg_write( DDR_REG_BASE +0x50c34*4+0x02000000,0x1413); +reg_write( DDR_REG_BASE +0x50c35*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE +0x50c36*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50c37*4+0x02000000,0xa9e0); +reg_write( DDR_REG_BASE +0x50c38*4+0x02000000,0xc125); +reg_write( DDR_REG_BASE +0x50c39*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50c3a*4+0x02000000,0x1900); +reg_write( DDR_REG_BASE +0x50c3b*4+0x02000000,0x7c2); +reg_write( DDR_REG_BASE +0x50c3c*4+0x02000000,0x1415); +reg_write( DDR_REG_BASE +0x50c3d*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE +0x50c3e*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50c3f*4+0x02000000,0xa9e0); +reg_write( DDR_REG_BASE +0x50c40*4+0x02000000,0x752c); +reg_write( DDR_REG_BASE +0x50c41*4+0x02000000,0x1817); +reg_write( DDR_REG_BASE +0x50c42*4+0x02000000,0x283); +reg_write( DDR_REG_BASE +0x50c43*4+0x02000000,0xa836); +reg_write( DDR_REG_BASE +0x50c44*4+0x02000000,0xf069); +reg_write( DDR_REG_BASE +0x50c45*4+0x02000000,0x234a); +reg_write( DDR_REG_BASE +0x50c46*4+0x02000000,0x3240); +reg_write( DDR_REG_BASE +0x50c47*4+0x02000000,0x1905); +reg_write( DDR_REG_BASE +0x50c48*4+0x02000000,0x6c2); +reg_write( DDR_REG_BASE +0x50c49*4+0x02000000,0xa9c4); +reg_write( DDR_REG_BASE +0x50c4a*4+0x02000000,0xa9e3); +reg_write( DDR_REG_BASE +0x50c4b*4+0x02000000,0x1902); +reg_write( DDR_REG_BASE +0x50c4c*4+0x02000000,0x2c2); +reg_write( DDR_REG_BASE +0x50c4d*4+0x02000000,0xa9a1); +reg_write( DDR_REG_BASE +0x50c4e*4+0x02000000,0xa960); +reg_write( DDR_REG_BASE +0x50c4f*4+0x02000000,0x752c); +reg_write( DDR_REG_BASE +0x50c50*4+0x02000000,0xaa29); +reg_write( DDR_REG_BASE +0x50c51*4+0x02000000,0x1a08); +reg_write( DDR_REG_BASE +0x50c52*4+0x02000000,0x2c2); +reg_write( DDR_REG_BASE +0x50c53*4+0x02000000,0xaaa7); +reg_write( DDR_REG_BASE +0x50c54*4+0x02000000,0xaa64); +reg_write( DDR_REG_BASE +0x50c55*4+0x02000000,0xaa83); +reg_write( DDR_REG_BASE +0x50c56*4+0x02000000,0x1a02); +reg_write( DDR_REG_BASE +0x50c57*4+0x02000000,0x782); +reg_write( DDR_REG_BASE +0x50c58*4+0x02000000,0xc120); +reg_write( DDR_REG_BASE +0x50c59*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50c5a*4+0x02000000,0xa960); +reg_write( DDR_REG_BASE +0x50c5b*4+0x02000000,0x1401); +reg_write( DDR_REG_BASE +0x50c5c*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE +0x50c5d*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50c5e*4+0x02000000,0xa960); +reg_write( DDR_REG_BASE +0x50c5f*4+0x02000000,0x1402); +reg_write( DDR_REG_BASE +0x50c60*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE +0x50c61*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50c62*4+0x02000000,0xa960); +reg_write( DDR_REG_BASE +0x50c63*4+0x02000000,0x1403); +reg_write( DDR_REG_BASE +0x50c64*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE +0x50c65*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50c66*4+0x02000000,0xa960); +reg_write( DDR_REG_BASE +0x50c67*4+0x02000000,0xc121); +reg_write( DDR_REG_BASE +0x50c68*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50c69*4+0x02000000,0xa9a0); +reg_write( DDR_REG_BASE +0x50c6a*4+0x02000000,0x1405); +reg_write( DDR_REG_BASE +0x50c6b*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE +0x50c6c*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50c6d*4+0x02000000,0xa9a0); +reg_write( DDR_REG_BASE +0x50c6e*4+0x02000000,0x1406); +reg_write( DDR_REG_BASE +0x50c6f*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE +0x50c70*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50c71*4+0x02000000,0xa9a0); +reg_write( DDR_REG_BASE +0x50c72*4+0x02000000,0x1407); +reg_write( DDR_REG_BASE +0x50c73*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE +0x50c74*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50c75*4+0x02000000,0xa9a0); +reg_write( DDR_REG_BASE +0x50c76*4+0x02000000,0xc122); +reg_write( DDR_REG_BASE +0x50c77*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50c78*4+0x02000000,0x1900); +reg_write( DDR_REG_BASE +0x50c79*4+0x02000000,0x2c2); +reg_write( DDR_REG_BASE +0x50c7a*4+0x02000000,0x1409); +reg_write( DDR_REG_BASE +0x50c7b*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE +0x50c7c*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50c7d*4+0x02000000,0x1900); +reg_write( DDR_REG_BASE +0x50c7e*4+0x02000000,0x2c2); +reg_write( DDR_REG_BASE +0x50c7f*4+0x02000000,0x180b); +reg_write( DDR_REG_BASE +0x50c80*4+0x02000000,0x782); +reg_write( DDR_REG_BASE +0x50c81*4+0x02000000,0xa88a); +reg_write( DDR_REG_BASE +0x50c82*4+0x02000000,0xc123); +reg_write( DDR_REG_BASE +0x50c83*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50c84*4+0x02000000,0xa9e0); +reg_write( DDR_REG_BASE +0x50c85*4+0x02000000,0x140d); +reg_write( DDR_REG_BASE +0x50c86*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE +0x50c87*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50c88*4+0x02000000,0xa9e0); +reg_write( DDR_REG_BASE +0x50c89*4+0x02000000,0x140e); +reg_write( DDR_REG_BASE +0x50c8a*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE +0x50c8b*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50c8c*4+0x02000000,0xa9e0); +reg_write( DDR_REG_BASE +0x50c8d*4+0x02000000,0x140f); +reg_write( DDR_REG_BASE +0x50c8e*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE +0x50c8f*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50c90*4+0x02000000,0xa9e0); +reg_write( DDR_REG_BASE +0x50c91*4+0x02000000,0xc124); +reg_write( DDR_REG_BASE +0x50c92*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50c93*4+0x02000000,0xa9c0); +reg_write( DDR_REG_BASE +0x50c94*4+0x02000000,0x1411); +reg_write( DDR_REG_BASE +0x50c95*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE +0x50c96*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50c97*4+0x02000000,0xa9c0); +reg_write( DDR_REG_BASE +0x50c98*4+0x02000000,0x1412); +reg_write( DDR_REG_BASE +0x50c99*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE +0x50c9a*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50c9b*4+0x02000000,0xa9c0); +reg_write( DDR_REG_BASE +0x50c9c*4+0x02000000,0x1413); +reg_write( DDR_REG_BASE +0x50c9d*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE +0x50c9e*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50c9f*4+0x02000000,0xa9c0); +reg_write( DDR_REG_BASE +0x50ca0*4+0x02000000,0xc125); +reg_write( DDR_REG_BASE +0x50ca1*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50ca2*4+0x02000000,0x1900); +reg_write( DDR_REG_BASE +0x50ca3*4+0x02000000,0x6c2); +reg_write( DDR_REG_BASE +0x50ca4*4+0x02000000,0x1415); +reg_write( DDR_REG_BASE +0x50ca5*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE +0x50ca6*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x50ca7*4+0x02000000,0x1900); +reg_write( DDR_REG_BASE +0x50ca8*4+0x02000000,0x6c2); +reg_write( DDR_REG_BASE +0x50ca9*4+0x02000000,0x752c); +reg_write( DDR_REG_BASE +0x50caa*4+0x02000000,0xa837); +reg_write( DDR_REG_BASE +0x50cab*4+0x02000000,0x1816); +reg_write( DDR_REG_BASE +0x50cac*4+0x02000000,0x7c2); +reg_write( DDR_REG_BASE +0x50cad*4+0x02000000,0xc0a6); +reg_write( DDR_REG_BASE +0x50cae*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE +0x50caf*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE +0x50cb0*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE +0x50cb1*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x50cb2*4+0x02000000,0x7014); +reg_write( DDR_REG_BASE +0x50cb3*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x50cb4*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE +0x50cb5*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x50cb6*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x50cb7*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x50cb8*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE +0x50cb9*4+0x02000000,0x168); +reg_write( DDR_REG_BASE +0x50cba*4+0x02000000,0x21c2); +reg_write( DDR_REG_BASE +0x50cbb*4+0x02000000,0x222); +reg_write( DDR_REG_BASE +0x50cbc*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE +0x50cbd*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x50cbe*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x50cbf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50cc0*4+0x02000000,0x7905); +reg_write( DDR_REG_BASE +0x50cc1*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE +0x50cc2*4+0x02000000,0x9100); +reg_write( DDR_REG_BASE +0x50cc3*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x50cc4*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x50cc5*4+0x02000000,0x7100); +reg_write( DDR_REG_BASE +0x50cc6*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x50cc7*4+0x02000000,0x6e); +reg_write( DDR_REG_BASE +0x50cc8*4+0x02000000,0x7014); +reg_write( DDR_REG_BASE +0x50cc9*4+0x02000000,0x7de0); +reg_write( DDR_REG_BASE +0x50cca*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x50ccb*4+0x02000000,0x7100); +reg_write( DDR_REG_BASE +0x50ccc*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE +0x50ccd*4+0x02000000,0x8); +reg_write( DDR_REG_BASE +0x50cce*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE +0x50ccf*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x50cd0*4+0x02000000,0xc2e4); +reg_write( DDR_REG_BASE +0x50cd1*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE +0x50cd2*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x50cd3*4+0x02000000,0x7b1); +reg_write( DDR_REG_BASE +0x50cd4*4+0x02000000,0x8b00); +reg_write( DDR_REG_BASE +0x50cd5*4+0x02000000,0xe62); +reg_write( DDR_REG_BASE +0x50cd6*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE +0x50cd7*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x50cd8*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x50cd9*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE +0x50cda*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x50cdb*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x50cdc*4+0x02000000,0x8b82); +reg_write( DDR_REG_BASE +0x50cdd*4+0x02000000,0x8b41); +reg_write( DDR_REG_BASE +0x50cde*4+0x02000000,0x211a); +reg_write( DDR_REG_BASE +0x50cdf*4+0x02000000,0xf8d); +reg_write( DDR_REG_BASE +0x50ce0*4+0x02000000,0x10); +reg_write( DDR_REG_BASE +0x50ce1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50ce2*4+0x02000000,0x776c); +reg_write( DDR_REG_BASE +0x50ce3*4+0x02000000,0xf01c); +reg_write( DDR_REG_BASE +0x50ce4*4+0x02000000,0x221a); +reg_write( DDR_REG_BASE +0x50ce5*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE +0x50ce6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50ce7*4+0x02000000,0x800); +reg_write( DDR_REG_BASE +0x50ce8*4+0x02000000,0x2104); +reg_write( DDR_REG_BASE +0x50ce9*4+0x02000000,0xf8e); +reg_write( DDR_REG_BASE +0x50cea*4+0x02000000,0x37fe); +reg_write( DDR_REG_BASE +0x50ceb*4+0x02000000,0xf000); +reg_write( DDR_REG_BASE +0x50cec*4+0x02000000,0x2055); +reg_write( DDR_REG_BASE +0x50ced*4+0x02000000,0x801); +reg_write( DDR_REG_BASE +0x50cee*4+0x02000000,0x79a5); +reg_write( DDR_REG_BASE +0x50cef*4+0x02000000,0x79c5); +reg_write( DDR_REG_BASE +0x50cf0*4+0x02000000,0x6ac1); +reg_write( DDR_REG_BASE +0x50cf1*4+0x02000000,0x229a); +reg_write( DDR_REG_BASE +0x50cf2*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x50cf3*4+0x02000000,0x2284); +reg_write( DDR_REG_BASE +0x50cf4*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x50cf5*4+0x02000000,0x7a25); +reg_write( DDR_REG_BASE +0x50cf6*4+0x02000000,0x795b); +reg_write( DDR_REG_BASE +0x50cf7*4+0x02000000,0xb991); +reg_write( DDR_REG_BASE +0x50cf8*4+0x02000000,0xb99c); +reg_write( DDR_REG_BASE +0x50cf9*4+0x02000000,0xb99f); +reg_write( DDR_REG_BASE +0x50cfa*4+0x02000000,0x9120); +reg_write( DDR_REG_BASE +0x50cfb*4+0x02000000,0x42c1); +reg_write( DDR_REG_BASE +0x50cfc*4+0x02000000,0x2108); +reg_write( DDR_REG_BASE +0x50cfd*4+0x02000000,0xc3); +reg_write( DDR_REG_BASE +0x50cfe*4+0x02000000,0xccd); +reg_write( DDR_REG_BASE +0x50cff*4+0x02000000,0x9085); +reg_write( DDR_REG_BASE +0x50d00*4+0x02000000,0x4060); +reg_write( DDR_REG_BASE +0x50d01*4+0x02000000,0xd908); +reg_write( DDR_REG_BASE +0x50d02*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE +0x50d03*4+0x02000000,0x901); +reg_write( DDR_REG_BASE +0x50d04*4+0x02000000,0x31); +reg_write( DDR_REG_BASE +0x50d05*4+0x02000000,0x781c); +reg_write( DDR_REG_BASE +0x50d06*4+0x02000000,0x796f); +reg_write( DDR_REG_BASE +0x50d07*4+0x02000000,0x2179); +reg_write( DDR_REG_BASE +0x50d08*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x50d09*4+0x02000000,0x6038); +reg_write( DDR_REG_BASE +0x50d0a*4+0x02000000,0x7204); +reg_write( DDR_REG_BASE +0x50d0b*4+0x02000000,0xc6c4); +reg_write( DDR_REG_BASE +0x50d0c*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x50d0d*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE +0x50d0e*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x50d0f*4+0x02000000,0x32); +reg_write( DDR_REG_BASE +0x50d10*4+0x02000000,0x5); +reg_write( DDR_REG_BASE +0x50d11*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50d12*4+0x02000000,0xb8c3); +reg_write( DDR_REG_BASE +0x50d13*4+0x02000000,0x6829); +reg_write( DDR_REG_BASE +0x50d14*4+0x02000000,0x92b); +reg_write( DDR_REG_BASE +0x50d15*4+0x02000000,0x3b5); +reg_write( DDR_REG_BASE +0x50d16*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE +0x50d17*4+0x02000000,0x2025); +reg_write( DDR_REG_BASE +0x50d18*4+0x02000000,0x40); +reg_write( DDR_REG_BASE +0x50d19*4+0x02000000,0xf012); +reg_write( DDR_REG_BASE +0x50d1a*4+0x02000000,0xf00f); +reg_write( DDR_REG_BASE +0x50d1b*4+0x02000000,0xf00f); +reg_write( DDR_REG_BASE +0x50d1c*4+0x02000000,0xf00b); +reg_write( DDR_REG_BASE +0x50d1d*4+0x02000000,0xf00f); +reg_write( DDR_REG_BASE +0x50d1e*4+0x02000000,0xf00f); +reg_write( DDR_REG_BASE +0x50d1f*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE +0x50d20*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE +0x50d21*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE +0x50d22*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE +0x50d23*4+0x02000000,0xf007); +reg_write( DDR_REG_BASE +0x50d24*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE +0x50d25*4+0x02000000,0xf005); +reg_write( DDR_REG_BASE +0x50d26*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE +0x50d27*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE +0x50d28*4+0x02000000,0x760c); +reg_write( DDR_REG_BASE +0x50d29*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x50d2a*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE +0x50d2b*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE +0x50d2c*4+0x02000000,0xd807); +reg_write( DDR_REG_BASE +0x50d2d*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE +0x50d2e*4+0x02000000,0xd808); +reg_write( DDR_REG_BASE +0x50d2f*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE +0x50d30*4+0x02000000,0xd809); +reg_write( DDR_REG_BASE +0x50d31*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE +0x50d32*4+0x02000000,0xd80a); +reg_write( DDR_REG_BASE +0x50d33*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE +0x50d34*4+0x02000000,0xd80b); +reg_write( DDR_REG_BASE +0x50d35*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE +0x50d36*4+0x02000000,0xd80c); +reg_write( DDR_REG_BASE +0x50d37*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE +0x50d38*4+0x02000000,0xd80e); +reg_write( DDR_REG_BASE +0x50d39*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE +0x50d3a*4+0x02000000,0xd810); +reg_write( DDR_REG_BASE +0x50d3b*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x50d3c*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x50d3d*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE +0x50d3e*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x50d3f*4+0x02000000,0x32); +reg_write( DDR_REG_BASE +0x50d40*4+0x02000000,0x5); +reg_write( DDR_REG_BASE +0x50d41*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50d42*4+0x02000000,0x2053); +reg_write( DDR_REG_BASE +0x50d43*4+0x02000000,0xc1); +reg_write( DDR_REG_BASE +0x50d44*4+0x02000000,0x6949); +reg_write( DDR_REG_BASE +0x50d45*4+0x02000000,0xa3f); +reg_write( DDR_REG_BASE +0x50d46*4+0x02000000,0x3b5); +reg_write( DDR_REG_BASE +0x50d47*4+0x02000000,0x791d); +reg_write( DDR_REG_BASE +0x50d48*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE +0x50d49*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE +0x50d4a*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE +0x50d4b*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE +0x50d4c*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE +0x50d4d*4+0x02000000,0x720c); +reg_write( DDR_REG_BASE +0x50d4e*4+0x02000000,0x2025); +reg_write( DDR_REG_BASE +0x50d4f*4+0x02000000,0x80); +reg_write( DDR_REG_BASE +0x50d50*4+0x02000000,0xf014); +reg_write( DDR_REG_BASE +0x50d51*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE +0x50d52*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE +0x50d53*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE +0x50d54*4+0x02000000,0xf00a); +reg_write( DDR_REG_BASE +0x50d55*4+0x02000000,0xf00a); +reg_write( DDR_REG_BASE +0x50d56*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE +0x50d57*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE +0x50d58*4+0x02000000,0xf008); +reg_write( DDR_REG_BASE +0x50d59*4+0x02000000,0xf008); +reg_write( DDR_REG_BASE +0x50d5a*4+0x02000000,0xf009); +reg_write( DDR_REG_BASE +0x50d5b*4+0x02000000,0xf014); +reg_write( DDR_REG_BASE +0x50d5c*4+0x02000000,0xf007); +reg_write( DDR_REG_BASE +0x50d5d*4+0x02000000,0xf015); +reg_write( DDR_REG_BASE +0x50d5e*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE +0x50d5f*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE +0x50d60*4+0x02000000,0xb9e0); +reg_write( DDR_REG_BASE +0x50d61*4+0x02000000,0xd80a); +reg_write( DDR_REG_BASE +0x50d62*4+0x02000000,0xf009); +reg_write( DDR_REG_BASE +0x50d63*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE +0x50d64*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE +0x50d65*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE +0x50d66*4+0x02000000,0x740c); +reg_write( DDR_REG_BASE +0x50d67*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE +0x50d68*4+0x02000000,0x760c); +reg_write( DDR_REG_BASE +0x50d69*4+0x02000000,0xb9e0); +reg_write( DDR_REG_BASE +0x50d6a*4+0x02000000,0xd809); +reg_write( DDR_REG_BASE +0x50d6b*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE +0x50d6c*4+0x02000000,0x20ca); +reg_write( DDR_REG_BASE +0x50d6d*4+0x02000000,0x1e1); +reg_write( DDR_REG_BASE +0x50d6e*4+0x02000000,0xb9e0); +reg_write( DDR_REG_BASE +0x50d6f*4+0x02000000,0xd80c); +reg_write( DDR_REG_BASE +0x50d70*4+0x02000000,0xf003); +reg_write( DDR_REG_BASE +0x50d71*4+0x02000000,0xb9e0); +reg_write( DDR_REG_BASE +0x50d72*4+0x02000000,0xd80e); +reg_write( DDR_REG_BASE +0x50d73*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE +0x50d74*4+0x02000000,0x20ca); +reg_write( DDR_REG_BASE +0x50d75*4+0x02000000,0x261); +reg_write( DDR_REG_BASE +0x50d76*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x50d77*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x50d78*4+0x02000000,0x7b2); +reg_write( DDR_REG_BASE +0x50d79*4+0x02000000,0x8881); +reg_write( DDR_REG_BASE +0x50d7a*4+0x02000000,0x8860); +reg_write( DDR_REG_BASE +0x50d7b*4+0x02000000,0xf022); +reg_write( DDR_REG_BASE +0x50d7c*4+0x02000000,0x231a); +reg_write( DDR_REG_BASE +0x50d7d*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x50d7e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50d7f*4+0x02000000,0x800); +reg_write( DDR_REG_BASE +0x50d80*4+0x02000000,0x2004); +reg_write( DDR_REG_BASE +0x50d81*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE +0x50d82*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50d83*4+0x02000000,0x800); +reg_write( DDR_REG_BASE +0x50d84*4+0x02000000,0x231a); +reg_write( DDR_REG_BASE +0x50d85*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x50d86*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50d87*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE +0x50d88*4+0x02000000,0x2004); +reg_write( DDR_REG_BASE +0x50d89*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x50d8a*4+0x02000000,0x6ffd); +reg_write( DDR_REG_BASE +0x50d8b*4+0x02000000,0xe000); +reg_write( DDR_REG_BASE +0x50d8c*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE +0x50d8d*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x50d8e*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE +0x50d8f*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE +0x50d90*4+0x02000000,0x64); +reg_write( DDR_REG_BASE +0x50d91*4+0x02000000,0x9220); +reg_write( DDR_REG_BASE +0x50d92*4+0x02000000,0x4928); +reg_write( DDR_REG_BASE +0x50d93*4+0x02000000,0x208b); +reg_write( DDR_REG_BASE +0x50d94*4+0x02000000,0x880f); +reg_write( DDR_REG_BASE +0x50d95*4+0x02000000,0xf206); +reg_write( DDR_REG_BASE +0x50d96*4+0x02000000,0x2142); +reg_write( DDR_REG_BASE +0x50d97*4+0x02000000,0x400); +reg_write( DDR_REG_BASE +0x50d98*4+0x02000000,0x2080); +reg_write( DDR_REG_BASE +0x50d99*4+0x02000000,0x10); +reg_write( DDR_REG_BASE +0x50d9a*4+0x02000000,0xb200); +reg_write( DDR_REG_BASE +0x50d9b*4+0x02000000,0x7164); +reg_write( DDR_REG_BASE +0x50d9c*4+0x02000000,0xcc1); +reg_write( DDR_REG_BASE +0x50d9d*4+0x02000000,0x90c5); +reg_write( DDR_REG_BASE +0x50d9e*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE +0x50d9f*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x50da0*4+0x02000000,0xc0e4); +reg_write( DDR_REG_BASE +0x50da1*4+0x02000000,0x4508); +reg_write( DDR_REG_BASE +0x50da2*4+0x02000000,0x259a); +reg_write( DDR_REG_BASE +0x50da3*4+0x02000000,0x1008); +reg_write( DDR_REG_BASE +0x50da4*4+0x02000000,0x44cb); +reg_write( DDR_REG_BASE +0x50da5*4+0x02000000,0x900e); +reg_write( DDR_REG_BASE +0x50da6*4+0x02000000,0x48); +reg_write( DDR_REG_BASE +0x50da7*4+0x02000000,0x2505); +reg_write( DDR_REG_BASE +0x50da8*4+0x02000000,0x130e); +reg_write( DDR_REG_BASE +0x50da9*4+0x02000000,0xb620); +reg_write( DDR_REG_BASE +0x50daa*4+0x02000000,0x6c22); +reg_write( DDR_REG_BASE +0x50dab*4+0x02000000,0x2505); +reg_write( DDR_REG_BASE +0x50dac*4+0x02000000,0x104c); +reg_write( DDR_REG_BASE +0x50dad*4+0x02000000,0x7224); +reg_write( DDR_REG_BASE +0x50dae*4+0x02000000,0xb440); +reg_write( DDR_REG_BASE +0x50daf*4+0x02000000,0x2505); +reg_write( DDR_REG_BASE +0x50db0*4+0x02000000,0x1042); +reg_write( DDR_REG_BASE +0x50db1*4+0x02000000,0xb260); +reg_write( DDR_REG_BASE +0x50db2*4+0x02000000,0x6962); +reg_write( DDR_REG_BASE +0x50db3*4+0x02000000,0xc102); +reg_write( DDR_REG_BASE +0x50db4*4+0x02000000,0x7d65); +reg_write( DDR_REG_BASE +0x50db5*4+0x02000000,0x80f); +reg_write( DDR_REG_BASE +0x50db6*4+0x02000000,0x3f1); +reg_write( DDR_REG_BASE +0x50db7*4+0x02000000,0xb520); +reg_write( DDR_REG_BASE +0x50db8*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE +0x50db9*4+0x02000000,0xfc7); +reg_write( DDR_REG_BASE +0x50dba*4+0x02000000,0xf005); +reg_write( DDR_REG_BASE +0x50dbb*4+0x02000000,0x137c); +reg_write( DDR_REG_BASE +0x50dbc*4+0x02000000,0x101); +reg_write( DDR_REG_BASE +0x50dbd*4+0x02000000,0x210f); +reg_write( DDR_REG_BASE +0x50dbe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50dbf*4+0x02000000,0x1b7c); +reg_write( DDR_REG_BASE +0x50dc0*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x50dc1*4+0x02000000,0xc4c4); +reg_write( DDR_REG_BASE +0x50dc2*4+0x02000000,0x44cb); +reg_write( DDR_REG_BASE +0x50dc3*4+0x02000000,0x900e); +reg_write( DDR_REG_BASE +0x50dc4*4+0x02000000,0xc2); +reg_write( DDR_REG_BASE +0x50dc5*4+0x02000000,0x1c02); +reg_write( DDR_REG_BASE +0x50dc6*4+0x02000000,0x1014); +reg_write( DDR_REG_BASE +0x50dc7*4+0x02000000,0xb420); +reg_write( DDR_REG_BASE +0x50dc8*4+0x02000000,0xb441); +reg_write( DDR_REG_BASE +0x50dc9*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE +0x50dca*4+0x02000000,0xb462); +reg_write( DDR_REG_BASE +0x50dcb*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x50dcc*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE +0x50dcd*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE +0x50dce*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE +0x50dcf*4+0x02000000,0x4608); +reg_write( DDR_REG_BASE +0x50dd0*4+0x02000000,0xca08); +reg_write( DDR_REG_BASE +0x50dd1*4+0x02000000,0x4358); +reg_write( DDR_REG_BASE +0x50dd2*4+0x02000000,0xda08); +reg_write( DDR_REG_BASE +0x50dd3*4+0x02000000,0x7a16); +reg_write( DDR_REG_BASE +0x50dd4*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x50dd5*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x50dd6*4+0x02000000,0xe024); +reg_write( DDR_REG_BASE +0x50dd7*4+0x02000000,0xb040); +reg_write( DDR_REG_BASE +0x50dd8*4+0x02000000,0x228a); +reg_write( DDR_REG_BASE +0x50dd9*4+0x02000000,0xfc7); +reg_write( DDR_REG_BASE +0x50dda*4+0x02000000,0x180c); +reg_write( DDR_REG_BASE +0x50ddb*4+0x02000000,0x45); +reg_write( DDR_REG_BASE +0x50ddc*4+0x02000000,0x18fe); +reg_write( DDR_REG_BASE +0x50ddd*4+0x02000000,0x8084); +reg_write( DDR_REG_BASE +0x50dde*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x50ddf*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x50de0*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE +0x50de1*4+0x02000000,0x8861); +reg_write( DDR_REG_BASE +0x50de2*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x50de3*4+0x02000000,0x708c); +reg_write( DDR_REG_BASE +0x50de4*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x50de5*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE +0x50de6*4+0x02000000,0x86e0); +reg_write( DDR_REG_BASE +0x50de7*4+0x02000000,0x71ad); +reg_write( DDR_REG_BASE +0x50de8*4+0x02000000,0xf022); +reg_write( DDR_REG_BASE +0x50de9*4+0x02000000,0x241a); +reg_write( DDR_REG_BASE +0x50dea*4+0x02000000,0x1f82); +reg_write( DDR_REG_BASE +0x50deb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50dec*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE +0x50ded*4+0x02000000,0x21f4); +reg_write( DDR_REG_BASE +0x50dee*4+0x02000000,0x30b); +reg_write( DDR_REG_BASE +0x50def*4+0x02000000,0x2205); +reg_write( DDR_REG_BASE +0x50df0*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x50df1*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE +0x50df2*4+0x02000000,0x1064); +reg_write( DDR_REG_BASE +0x50df3*4+0x02000000,0x1800); +reg_write( DDR_REG_BASE +0x50df4*4+0x02000000,0x2c4); +reg_write( DDR_REG_BASE +0x50df5*4+0x02000000,0x2205); +reg_write( DDR_REG_BASE +0x50df6*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE +0x50df7*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE +0x50df8*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x50df9*4+0x02000000,0xb17); +reg_write( DDR_REG_BASE +0x50dfa*4+0x02000000,0x3030); +reg_write( DDR_REG_BASE +0x50dfb*4+0x02000000,0x21f4); +reg_write( DDR_REG_BASE +0x50dfc*4+0x02000000,0x300); +reg_write( DDR_REG_BASE +0x50dfd*4+0x02000000,0x815); +reg_write( DDR_REG_BASE +0x50dfe*4+0x02000000,0xf84); +reg_write( DDR_REG_BASE +0x50dff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50e00*4+0x02000000,0xfc00); +reg_write( DDR_REG_BASE +0x50e01*4+0x02000000,0xd820); +reg_write( DDR_REG_BASE +0x50e02*4+0x02000000,0xf006); +reg_write( DDR_REG_BASE +0x50e03*4+0x02000000,0x208c); +reg_write( DDR_REG_BASE +0x50e04*4+0x02000000,0x8010); +reg_write( DDR_REG_BASE +0x50e05*4+0x02000000,0xf7bd); +reg_write( DDR_REG_BASE +0x50e06*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE +0x50e07*4+0x02000000,0x808); +reg_write( DDR_REG_BASE +0x50e08*4+0x02000000,0xb200); +reg_write( DDR_REG_BASE +0x50e09*4+0x02000000,0x7185); +reg_write( DDR_REG_BASE +0x50e0a*4+0x02000000,0xbbf); +reg_write( DDR_REG_BASE +0x50e0b*4+0x02000000,0x8305); +reg_write( DDR_REG_BASE +0x50e0c*4+0x02000000,0xa02); +reg_write( DDR_REG_BASE +0x50e0d*4+0x02000000,0x80); +reg_write( DDR_REG_BASE +0x50e0e*4+0x02000000,0xb0b); +reg_write( DDR_REG_BASE +0x50e0f*4+0x02000000,0x3030); +reg_write( DDR_REG_BASE +0x50e10*4+0x02000000,0x8629); +reg_write( DDR_REG_BASE +0x50e11*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE +0x50e12*4+0x02000000,0xf002); +reg_write( DDR_REG_BASE +0x50e13*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE +0x50e14*4+0x02000000,0xf72); +reg_write( DDR_REG_BASE +0x50e15*4+0x02000000,0x100); +reg_write( DDR_REG_BASE +0x50e16*4+0x02000000,0xbfc4); +reg_write( DDR_REG_BASE +0x50e17*4+0x02000000,0xef06); +reg_write( DDR_REG_BASE +0x50e18*4+0x02000000,0xbf61); +reg_write( DDR_REG_BASE +0x50e19*4+0x02000000,0xf01); +reg_write( DDR_REG_BASE +0x50e1a*4+0x02000000,0x1031); +reg_write( DDR_REG_BASE +0x50e1b*4+0x02000000,0x7dbb); +reg_write( DDR_REG_BASE +0x50e1c*4+0x02000000,0x70ed); +reg_write( DDR_REG_BASE +0x50e1d*4+0x02000000,0x8607); +reg_write( DDR_REG_BASE +0x50e1e*4+0x02000000,0xf6d); +reg_write( DDR_REG_BASE +0x50e1f*4+0x02000000,0x1023); +reg_write( DDR_REG_BASE +0x50e20*4+0x02000000,0x78af); +reg_write( DDR_REG_BASE +0x50e21*4+0x02000000,0xd92); +reg_write( DDR_REG_BASE +0x50e22*4+0x02000000,0x180); +reg_write( DDR_REG_BASE +0x50e23*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE +0x50e24*4+0x02000000,0xb76); +reg_write( DDR_REG_BASE +0x50e25*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE +0x50e26*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE +0x50e27*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x50e28*4+0x02000000,0x85a); +reg_write( DDR_REG_BASE +0x50e29*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE +0x50e2a*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x50e2b*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x50e2c*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x50e2d*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE +0x50e2e*4+0x02000000,0x8841); +reg_write( DDR_REG_BASE +0x50e2f*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x50e30*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE +0x50e31*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x50e32*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE +0x50e33*4+0x02000000,0x716d); +reg_write( DDR_REG_BASE +0x50e34*4+0x02000000,0xf01a); +reg_write( DDR_REG_BASE +0x50e35*4+0x02000000,0x211a); +reg_write( DDR_REG_BASE +0x50e36*4+0x02000000,0xf8c); +reg_write( DDR_REG_BASE +0x50e37*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50e38*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE +0x50e39*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x50e3a*4+0x02000000,0xf00c); +reg_write( DDR_REG_BASE +0x50e3b*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE +0x50e3c*4+0x02000000,0x8); +reg_write( DDR_REG_BASE +0x50e3d*4+0x02000000,0x7885); +reg_write( DDR_REG_BASE +0x50e3e*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x50e3f*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x50e40*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE +0x50e41*4+0x02000000,0x166); +reg_write( DDR_REG_BASE +0x50e42*4+0x02000000,0x9000); +reg_write( DDR_REG_BASE +0x50e43*4+0x02000000,0x631b); +reg_write( DDR_REG_BASE +0x50e44*4+0x02000000,0x200a); +reg_write( DDR_REG_BASE +0x50e45*4+0x02000000,0x780); +reg_write( DDR_REG_BASE +0x50e46*4+0x02000000,0x8eb); +reg_write( DDR_REG_BASE +0x50e47*4+0x02000000,0x8234); +reg_write( DDR_REG_BASE +0x50e48*4+0x02000000,0x2040); +reg_write( DDR_REG_BASE +0x50e49*4+0x02000000,0x5e); +reg_write( DDR_REG_BASE +0x50e4a*4+0x02000000,0x7074); +reg_write( DDR_REG_BASE +0x50e4b*4+0x02000000,0x23ca); +reg_write( DDR_REG_BASE +0x50e4c*4+0x02000000,0x1021); +reg_write( DDR_REG_BASE +0x50e4d*4+0x02000000,0x7124); +reg_write( DDR_REG_BASE +0x50e4e*4+0x02000000,0xacf); +reg_write( DDR_REG_BASE +0x50e4f*4+0x02000000,0x8065); +reg_write( DDR_REG_BASE +0x50e50*4+0x02000000,0x706c); +reg_write( DDR_REG_BASE +0x50e51*4+0x02000000,0xb9b); +reg_write( DDR_REG_BASE +0x50e52*4+0x02000000,0x9030); +reg_write( DDR_REG_BASE +0x50e53*4+0x02000000,0x71e5); +reg_write( DDR_REG_BASE +0x50e54*4+0x02000000,0xb0b); +reg_write( DDR_REG_BASE +0x50e55*4+0x02000000,0x3030); +reg_write( DDR_REG_BASE +0x50e56*4+0x02000000,0x8e58); +reg_write( DDR_REG_BASE +0x50e57*4+0x02000000,0x8602); +reg_write( DDR_REG_BASE +0x50e58*4+0x02000000,0xf002); +reg_write( DDR_REG_BASE +0x50e59*4+0x02000000,0x8601); +reg_write( DDR_REG_BASE +0x50e5a*4+0x02000000,0xa4e); +reg_write( DDR_REG_BASE +0x50e5b*4+0x02000000,0x120); +reg_write( DDR_REG_BASE +0x50e5c*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x50e5d*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE +0x50e5e*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE +0x50e5f*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE +0x50e60*4+0x02000000,0x219a); +reg_write( DDR_REG_BASE +0x50e61*4+0x02000000,0x10); +reg_write( DDR_REG_BASE +0x50e62*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE +0x50e63*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x50e64*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x50e65*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x50e66*4+0x02000000,0xe064); +reg_write( DDR_REG_BASE +0x50e67*4+0x02000000,0x2145); +reg_write( DDR_REG_BASE +0x50e68*4+0x02000000,0x7c1); +reg_write( DDR_REG_BASE +0x50e69*4+0x02000000,0x149); +reg_write( DDR_REG_BASE +0x50e6a*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE +0x50e6b*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE +0x50e6c*4+0x02000000,0x706c); +reg_write( DDR_REG_BASE +0x50e6d*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x50e6e*4+0x02000000,0xf003); +reg_write( DDR_REG_BASE +0x50e6f*4+0x02000000,0xb260); +reg_write( DDR_REG_BASE +0x50e70*4+0x02000000,0x7124); +reg_write( DDR_REG_BASE +0x50e71*4+0x02000000,0x9ff); +reg_write( DDR_REG_BASE +0x50e72*4+0x02000000,0x8cb4); +reg_write( DDR_REG_BASE +0x50e73*4+0x02000000,0x2014); +reg_write( DDR_REG_BASE +0x50e74*4+0x02000000,0x42); +reg_write( DDR_REG_BASE +0x50e75*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x50e76*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE +0x50e77*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x50e78*4+0x02000000,0x16); +reg_write( DDR_REG_BASE +0x50e79*4+0x02000000,0x9f3); +reg_write( DDR_REG_BASE +0x50e7a*4+0x02000000,0x31); +reg_write( DDR_REG_BASE +0x50e7b*4+0x02000000,0xda31); +reg_write( DDR_REG_BASE +0x50e7c*4+0x02000000,0xba9f); +reg_write( DDR_REG_BASE +0x50e7d*4+0x02000000,0x1201); +reg_write( DDR_REG_BASE +0x50e7e*4+0x02000000,0x481); +reg_write( DDR_REG_BASE +0x50e7f*4+0x02000000,0xa821); +reg_write( DDR_REG_BASE +0x50e80*4+0x02000000,0x1201); +reg_write( DDR_REG_BASE +0x50e81*4+0x02000000,0x481); +reg_write( DDR_REG_BASE +0x50e82*4+0x02000000,0xa822); +reg_write( DDR_REG_BASE +0x50e83*4+0x02000000,0x1202); +reg_write( DDR_REG_BASE +0x50e84*4+0x02000000,0x481); +reg_write( DDR_REG_BASE +0x50e85*4+0x02000000,0xa823); +reg_write( DDR_REG_BASE +0x50e86*4+0x02000000,0x1201); +reg_write( DDR_REG_BASE +0x50e87*4+0x02000000,0x481); +reg_write( DDR_REG_BASE +0x50e88*4+0x02000000,0xa82b); +reg_write( DDR_REG_BASE +0x50e89*4+0x02000000,0x1201); +reg_write( DDR_REG_BASE +0x50e8a*4+0x02000000,0x481); +reg_write( DDR_REG_BASE +0x50e8b*4+0x02000000,0xa830); +reg_write( DDR_REG_BASE +0x50e8c*4+0x02000000,0x1202); +reg_write( DDR_REG_BASE +0x50e8d*4+0x02000000,0x481); +reg_write( DDR_REG_BASE +0x50e8e*4+0x02000000,0xa831); +reg_write( DDR_REG_BASE +0x50e8f*4+0x02000000,0x1201); +reg_write( DDR_REG_BASE +0x50e90*4+0x02000000,0x481); +reg_write( DDR_REG_BASE +0x50e91*4+0x02000000,0x1833); +reg_write( DDR_REG_BASE +0x50e92*4+0x02000000,0x42); +reg_write( DDR_REG_BASE +0x50e93*4+0x02000000,0x1201); +reg_write( DDR_REG_BASE +0x50e94*4+0x02000000,0x481); +reg_write( DDR_REG_BASE +0x50e95*4+0x02000000,0x1834); +reg_write( DDR_REG_BASE +0x50e96*4+0x02000000,0x42); +reg_write( DDR_REG_BASE +0x50e97*4+0x02000000,0x1202); +reg_write( DDR_REG_BASE +0x50e98*4+0x02000000,0x481); +reg_write( DDR_REG_BASE +0x50e99*4+0x02000000,0x1835); +reg_write( DDR_REG_BASE +0x50e9a*4+0x02000000,0x42); +reg_write( DDR_REG_BASE +0x50e9b*4+0x02000000,0x1201); +reg_write( DDR_REG_BASE +0x50e9c*4+0x02000000,0x481); +reg_write( DDR_REG_BASE +0x50e9d*4+0x02000000,0x183d); +reg_write( DDR_REG_BASE +0x50e9e*4+0x02000000,0x42); +reg_write( DDR_REG_BASE +0x50e9f*4+0x02000000,0x1201); +reg_write( DDR_REG_BASE +0x50ea0*4+0x02000000,0x481); +reg_write( DDR_REG_BASE +0x50ea1*4+0x02000000,0x1842); +reg_write( DDR_REG_BASE +0x50ea2*4+0x02000000,0x42); +reg_write( DDR_REG_BASE +0x50ea3*4+0x02000000,0x1218); +reg_write( DDR_REG_BASE +0x50ea4*4+0x02000000,0x481); +reg_write( DDR_REG_BASE +0x50ea5*4+0x02000000,0x1843); +reg_write( DDR_REG_BASE +0x50ea6*4+0x02000000,0x42); +reg_write( DDR_REG_BASE +0x50ea7*4+0x02000000,0x1201); +reg_write( DDR_REG_BASE +0x50ea8*4+0x02000000,0x481); +reg_write( DDR_REG_BASE +0x50ea9*4+0x02000000,0x1865); +reg_write( DDR_REG_BASE +0x50eaa*4+0x02000000,0x42); +reg_write( DDR_REG_BASE +0x50eab*4+0x02000000,0x1201); +reg_write( DDR_REG_BASE +0x50eac*4+0x02000000,0x481); +reg_write( DDR_REG_BASE +0x50ead*4+0x02000000,0x1866); +reg_write( DDR_REG_BASE +0x50eae*4+0x02000000,0x42); +reg_write( DDR_REG_BASE +0x50eaf*4+0x02000000,0x1202); +reg_write( DDR_REG_BASE +0x50eb0*4+0x02000000,0x481); +reg_write( DDR_REG_BASE +0x50eb1*4+0x02000000,0x1867); +reg_write( DDR_REG_BASE +0x50eb2*4+0x02000000,0x42); +reg_write( DDR_REG_BASE +0x50eb3*4+0x02000000,0x1201); +reg_write( DDR_REG_BASE +0x50eb4*4+0x02000000,0x481); +reg_write( DDR_REG_BASE +0x50eb5*4+0x02000000,0x186f); +reg_write( DDR_REG_BASE +0x50eb6*4+0x02000000,0x42); +reg_write( DDR_REG_BASE +0x50eb7*4+0x02000000,0x1201); +reg_write( DDR_REG_BASE +0x50eb8*4+0x02000000,0x481); +reg_write( DDR_REG_BASE +0x50eb9*4+0x02000000,0x1874); +reg_write( DDR_REG_BASE +0x50eba*4+0x02000000,0x42); +reg_write( DDR_REG_BASE +0x50ebb*4+0x02000000,0x1202); +reg_write( DDR_REG_BASE +0x50ebc*4+0x02000000,0x481); +reg_write( DDR_REG_BASE +0x50ebd*4+0x02000000,0x1875); +reg_write( DDR_REG_BASE +0x50ebe*4+0x02000000,0x42); +reg_write( DDR_REG_BASE +0x50ebf*4+0x02000000,0x1201); +reg_write( DDR_REG_BASE +0x50ec0*4+0x02000000,0x481); +reg_write( DDR_REG_BASE +0x50ec1*4+0x02000000,0x1897); +reg_write( DDR_REG_BASE +0x50ec2*4+0x02000000,0x42); +reg_write( DDR_REG_BASE +0x50ec3*4+0x02000000,0x1201); +reg_write( DDR_REG_BASE +0x50ec4*4+0x02000000,0x481); +reg_write( DDR_REG_BASE +0x50ec5*4+0x02000000,0x1898); +reg_write( DDR_REG_BASE +0x50ec6*4+0x02000000,0x42); +reg_write( DDR_REG_BASE +0x50ec7*4+0x02000000,0x1202); +reg_write( DDR_REG_BASE +0x50ec8*4+0x02000000,0x481); +reg_write( DDR_REG_BASE +0x50ec9*4+0x02000000,0x1899); +reg_write( DDR_REG_BASE +0x50eca*4+0x02000000,0x42); +reg_write( DDR_REG_BASE +0x50ecb*4+0x02000000,0x8a20); +reg_write( DDR_REG_BASE +0x50ecc*4+0x02000000,0x18a1); +reg_write( DDR_REG_BASE +0x50ecd*4+0x02000000,0x42); +reg_write( DDR_REG_BASE +0x50ece*4+0x02000000,0x8a21); +reg_write( DDR_REG_BASE +0x50ecf*4+0x02000000,0x18a6); +reg_write( DDR_REG_BASE +0x50ed0*4+0x02000000,0x42); +reg_write( DDR_REG_BASE +0x50ed1*4+0x02000000,0x8a22); +reg_write( DDR_REG_BASE +0x50ed2*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE +0x50ed3*4+0x02000000,0x18a7); +reg_write( DDR_REG_BASE +0x50ed4*4+0x02000000,0x42); +reg_write( DDR_REG_BASE +0x50ed5*4+0x02000000,0x219a); +reg_write( DDR_REG_BASE +0x50ed6*4+0x02000000,0x901); +reg_write( DDR_REG_BASE +0x50ed7*4+0x02000000,0x603a); +reg_write( DDR_REG_BASE +0x50ed8*4+0x02000000,0x235a); +reg_write( DDR_REG_BASE +0x50ed9*4+0x02000000,0x1c81); +reg_write( DDR_REG_BASE +0x50eda*4+0x02000000,0x7165); +reg_write( DDR_REG_BASE +0x50edb*4+0x02000000,0x623c); +reg_write( DDR_REG_BASE +0x50edc*4+0x02000000,0xd931); +reg_write( DDR_REG_BASE +0x50edd*4+0x02000000,0xb99f); +reg_write( DDR_REG_BASE +0x50ede*4+0x02000000,0x1101); +reg_write( DDR_REG_BASE +0x50edf*4+0x02000000,0x482); +reg_write( DDR_REG_BASE +0x50ee0*4+0x02000000,0xac41); +reg_write( DDR_REG_BASE +0x50ee1*4+0x02000000,0x1101); +reg_write( DDR_REG_BASE +0x50ee2*4+0x02000000,0x482); +reg_write( DDR_REG_BASE +0x50ee3*4+0x02000000,0xac42); +reg_write( DDR_REG_BASE +0x50ee4*4+0x02000000,0x1102); +reg_write( DDR_REG_BASE +0x50ee5*4+0x02000000,0x482); +reg_write( DDR_REG_BASE +0x50ee6*4+0x02000000,0xac43); +reg_write( DDR_REG_BASE +0x50ee7*4+0x02000000,0x8940); +reg_write( DDR_REG_BASE +0x50ee8*4+0x02000000,0xac4b); +reg_write( DDR_REG_BASE +0x50ee9*4+0x02000000,0x8941); +reg_write( DDR_REG_BASE +0x50eea*4+0x02000000,0xac50); +reg_write( DDR_REG_BASE +0x50eeb*4+0x02000000,0x8922); +reg_write( DDR_REG_BASE +0x50eec*4+0x02000000,0xac31); +reg_write( DDR_REG_BASE +0x50eed*4+0x02000000,0xbd3); +reg_write( DDR_REG_BASE +0x50eee*4+0x02000000,0x90b4); +reg_write( DDR_REG_BASE +0x50eef*4+0x02000000,0x4160); +reg_write( DDR_REG_BASE +0x50ef0*4+0x02000000,0x7164); +reg_write( DDR_REG_BASE +0x50ef1*4+0x02000000,0xbfb); +reg_write( DDR_REG_BASE +0x50ef2*4+0x02000000,0x80b4); +reg_write( DDR_REG_BASE +0x50ef3*4+0x02000000,0x706d); +reg_write( DDR_REG_BASE +0x50ef4*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE +0x50ef5*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x50ef6*4+0x02000000,0xc3e4); +reg_write( DDR_REG_BASE +0x50ef7*4+0x02000000,0xc1ab); +reg_write( DDR_REG_BASE +0x50ef8*4+0x02000000,0xc080); +reg_write( DDR_REG_BASE +0x50ef9*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x50efa*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x50efb*4+0x02000000,0x689); +reg_write( DDR_REG_BASE +0x50efc*4+0x02000000,0xa8a); +reg_write( DDR_REG_BASE +0x50efd*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE +0x50efe*4+0x02000000,0xda2a); +reg_write( DDR_REG_BASE +0x50eff*4+0x02000000,0xc080); +reg_write( DDR_REG_BASE +0x50f00*4+0x02000000,0xb8a); +reg_write( DDR_REG_BASE +0x50f01*4+0x02000000,0x1e0); +reg_write( DDR_REG_BASE +0x50f02*4+0x02000000,0xd92a); +reg_write( DDR_REG_BASE +0x50f03*4+0x02000000,0xc16); +reg_write( DDR_REG_BASE +0x50f04*4+0x02000000,0xffcf); +reg_write( DDR_REG_BASE +0x50f05*4+0x02000000,0xc72); +reg_write( DDR_REG_BASE +0x50f06*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE +0x50f07*4+0x02000000,0x4300); +reg_write( DDR_REG_BASE +0x50f08*4+0x02000000,0x4100); +reg_write( DDR_REG_BASE +0x50f09*4+0x02000000,0xc52); +reg_write( DDR_REG_BASE +0x50f0a*4+0x02000000,0x120); +reg_write( DDR_REG_BASE +0x50f0b*4+0x02000000,0x4060); +reg_write( DDR_REG_BASE +0x50f0c*4+0x02000000,0xdd23); +reg_write( DDR_REG_BASE +0x50f0d*4+0x02000000,0xbd9f); +reg_write( DDR_REG_BASE +0x50f0e*4+0x02000000,0x8d00); +reg_write( DDR_REG_BASE +0x50f0f*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE +0x50f10*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE +0x50f11*4+0x02000000,0xe4); +reg_write( DDR_REG_BASE +0x50f12*4+0x02000000,0xb600); +reg_write( DDR_REG_BASE +0x50f13*4+0x02000000,0x1526); +reg_write( DDR_REG_BASE +0x50f14*4+0x02000000,0x1080); +reg_write( DDR_REG_BASE +0x50f15*4+0x02000000,0xb601); +reg_write( DDR_REG_BASE +0x50f16*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x50f17*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x50f18*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE +0x50f19*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x50f1a*4+0x02000000,0xe154); +reg_write( DDR_REG_BASE +0x50f1b*4+0x02000000,0xb56); +reg_write( DDR_REG_BASE +0x50f1c*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE +0x50f1d*4+0x02000000,0x1e42); +reg_write( DDR_REG_BASE +0x50f1e*4+0x02000000,0x905d); +reg_write( DDR_REG_BASE +0x50f1f*4+0x02000000,0x2053); +reg_write( DDR_REG_BASE +0x50f20*4+0x02000000,0xc1); +reg_write( DDR_REG_BASE +0x50f21*4+0x02000000,0x1a01); +reg_write( DDR_REG_BASE +0x50f22*4+0x02000000,0x3042); +reg_write( DDR_REG_BASE +0x50f23*4+0x02000000,0x791d); +reg_write( DDR_REG_BASE +0x50f24*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE +0x50f25*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE +0x50f26*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE +0x50f27*4+0x02000000,0xb9c3); +reg_write( DDR_REG_BASE +0x50f28*4+0x02000000,0x1a02); +reg_write( DDR_REG_BASE +0x50f29*4+0x02000000,0x3042); +reg_write( DDR_REG_BASE +0x50f2a*4+0x02000000,0xd908); +reg_write( DDR_REG_BASE +0x50f2b*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE +0x50f2c*4+0x02000000,0x9ff); +reg_write( DDR_REG_BASE +0x50f2d*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE +0x50f2e*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x50f2f*4+0x02000000,0xb8c1); +reg_write( DDR_REG_BASE +0x50f30*4+0x02000000,0xef6); +reg_write( DDR_REG_BASE +0x50f31*4+0x02000000,0x120); +reg_write( DDR_REG_BASE +0x50f32*4+0x02000000,0x1a06); +reg_write( DDR_REG_BASE +0x50f33*4+0x02000000,0x3002); +reg_write( DDR_REG_BASE +0x50f34*4+0x02000000,0x83a); +reg_write( DDR_REG_BASE +0x50f35*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50f36*4+0x02000000,0xb72); +reg_write( DDR_REG_BASE +0x50f37*4+0x02000000,0x100); +reg_write( DDR_REG_BASE +0x50f38*4+0x02000000,0x164c); +reg_write( DDR_REG_BASE +0x50f39*4+0x02000000,0x9100); +reg_write( DDR_REG_BASE +0x50f3a*4+0x02000000,0x80b); +reg_write( DDR_REG_BASE +0x50f3b*4+0x02000000,0x151); +reg_write( DDR_REG_BASE +0x50f3c*4+0x02000000,0x8d00); +reg_write( DDR_REG_BASE +0x50f3d*4+0x02000000,0xb600); +reg_write( DDR_REG_BASE +0x50f3e*4+0x02000000,0xb601); +reg_write( DDR_REG_BASE +0x50f3f*4+0x02000000,0xc7c4); +reg_write( DDR_REG_BASE +0x50f40*4+0x02000000,0xc0f1); +reg_write( DDR_REG_BASE +0x50f41*4+0x02000000,0xc1bd); +reg_write( DDR_REG_BASE +0x50f42*4+0x02000000,0xc080); +reg_write( DDR_REG_BASE +0x50f43*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x50f44*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x50f45*4+0x02000000,0x50a); +reg_write( DDR_REG_BASE +0x50f46*4+0x02000000,0x9f6); +reg_write( DDR_REG_BASE +0x50f47*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE +0x50f48*4+0x02000000,0xda72); +reg_write( DDR_REG_BASE +0x50f49*4+0x02000000,0xc080); +reg_write( DDR_REG_BASE +0x50f4a*4+0x02000000,0xaf6); +reg_write( DDR_REG_BASE +0x50f4b*4+0x02000000,0x1e0); +reg_write( DDR_REG_BASE +0x50f4c*4+0x02000000,0xd972); +reg_write( DDR_REG_BASE +0x50f4d*4+0x02000000,0xc0bd); +reg_write( DDR_REG_BASE +0x50f4e*4+0x02000000,0xc0d1); +reg_write( DDR_REG_BASE +0x50f4f*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE +0x50f50*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE +0x50f51*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE +0x50f52*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE +0x50f53*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x50f54*4+0x02000000,0x7101); +reg_write( DDR_REG_BASE +0x50f55*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE +0x50f56*4+0x02000000,0x1e0); +reg_write( DDR_REG_BASE +0x50f57*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x50f58*4+0x02000000,0x7082); +reg_write( DDR_REG_BASE +0x50f59*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x50f5a*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x50f5b*4+0x02000000,0x225f); +reg_write( DDR_REG_BASE +0x50f5c*4+0x02000000,0x100); +reg_write( DDR_REG_BASE +0x50f5d*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE +0x50f5e*4+0x02000000,0x7c3); +reg_write( DDR_REG_BASE +0x50f5f*4+0x02000000,0x4020); +reg_write( DDR_REG_BASE +0x50f60*4+0x02000000,0xeb05); +reg_write( DDR_REG_BASE +0x50f61*4+0x02000000,0xbb61); +reg_write( DDR_REG_BASE +0x50f62*4+0x02000000,0xbff); +reg_write( DDR_REG_BASE +0x50f63*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE +0x50f64*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x50f65*4+0x02000000,0xb8c3); +reg_write( DDR_REG_BASE +0x50f66*4+0x02000000,0x80b); +reg_write( DDR_REG_BASE +0x50f67*4+0x02000000,0x190); +reg_write( DDR_REG_BASE +0x50f68*4+0x02000000,0x877); +reg_write( DDR_REG_BASE +0x50f69*4+0x02000000,0x71); +reg_write( DDR_REG_BASE +0x50f6a*4+0x02000000,0xdf18); +reg_write( DDR_REG_BASE +0x50f6b*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE +0x50f6c*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE +0x50f6d*4+0x02000000,0x116); +reg_write( DDR_REG_BASE +0x50f6e*4+0x02000000,0x1e08); +reg_write( DDR_REG_BASE +0x50f6f*4+0x02000000,0x1094); +reg_write( DDR_REG_BASE +0x50f70*4+0x02000000,0x71ad); +reg_write( DDR_REG_BASE +0x50f71*4+0x02000000,0x1e02); +reg_write( DDR_REG_BASE +0x50f72*4+0x02000000,0x1055); +reg_write( DDR_REG_BASE +0x50f73*4+0x02000000,0xd829); +reg_write( DDR_REG_BASE +0x50f74*4+0x02000000,0xb6a0); +reg_write( DDR_REG_BASE +0x50f75*4+0x02000000,0x1e6c); +reg_write( DDR_REG_BASE +0x50f76*4+0x02000000,0x1205); +reg_write( DDR_REG_BASE +0x50f77*4+0x02000000,0x1e6c); +reg_write( DDR_REG_BASE +0x50f78*4+0x02000000,0x1004); +reg_write( DDR_REG_BASE +0x50f79*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x50f7a*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x50f7b*4+0x02000000,0x98); +reg_write( DDR_REG_BASE +0x50f7c*4+0x02000000,0x9680); +reg_write( DDR_REG_BASE +0x50f7d*4+0x02000000,0x4328); +reg_write( DDR_REG_BASE +0x50f7e*4+0x02000000,0x1ef2); +reg_write( DDR_REG_BASE +0x50f7f*4+0x02000000,0x9044); +reg_write( DDR_REG_BASE +0x50f80*4+0x02000000,0xfba); +reg_write( DDR_REG_BASE +0x50f81*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x50f82*4+0x02000000,0x1e66); +reg_write( DDR_REG_BASE +0x50f83*4+0x02000000,0x1044); +reg_write( DDR_REG_BASE +0x50f84*4+0x02000000,0xd8a9); +reg_write( DDR_REG_BASE +0x50f85*4+0x02000000,0x1e6c); +reg_write( DDR_REG_BASE +0x50f86*4+0x02000000,0x1004); +reg_write( DDR_REG_BASE +0x50f87*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE +0x50f88*4+0x02000000,0xa46); +reg_write( DDR_REG_BASE +0x50f89*4+0x02000000,0x1e6c); +reg_write( DDR_REG_BASE +0x50f8a*4+0x02000000,0x1004); +reg_write( DDR_REG_BASE +0x50f8b*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE +0x50f8c*4+0x02000000,0xa44); +reg_write( DDR_REG_BASE +0x50f8d*4+0x02000000,0x1e6c); +reg_write( DDR_REG_BASE +0x50f8e*4+0x02000000,0x1004); +reg_write( DDR_REG_BASE +0x50f8f*4+0x02000000,0x1e6c); +reg_write( DDR_REG_BASE +0x50f90*4+0x02000000,0x1004); +reg_write( DDR_REG_BASE +0x50f91*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x50f92*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50f93*4+0x02000000,0x6000); +reg_write( DDR_REG_BASE +0x50f94*4+0x02000000,0x1e72); +reg_write( DDR_REG_BASE +0x50f95*4+0x02000000,0x935c); +reg_write( DDR_REG_BASE +0x50f96*4+0x02000000,0x1ed0); +reg_write( DDR_REG_BASE +0x50f97*4+0x02000000,0x9344); +reg_write( DDR_REG_BASE +0x50f98*4+0x02000000,0x1e72); +reg_write( DDR_REG_BASE +0x50f99*4+0x02000000,0x90dd); +reg_write( DDR_REG_BASE +0x50f9a*4+0x02000000,0xf2e); +reg_write( DDR_REG_BASE +0x50f9b*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x50f9c*4+0x02000000,0x1ed0); +reg_write( DDR_REG_BASE +0x50f9d*4+0x02000000,0x92c4); +reg_write( DDR_REG_BASE +0x50f9e*4+0x02000000,0x1e72); +reg_write( DDR_REG_BASE +0x50f9f*4+0x02000000,0x935c); +reg_write( DDR_REG_BASE +0x50fa0*4+0x02000000,0x1e72); +reg_write( DDR_REG_BASE +0x50fa1*4+0x02000000,0x92dc); +reg_write( DDR_REG_BASE +0x50fa2*4+0x02000000,0xf046); +reg_write( DDR_REG_BASE +0x50fa3*4+0x02000000,0x45cb); +reg_write( DDR_REG_BASE +0x50fa4*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE +0x50fa5*4+0x02000000,0x116); +reg_write( DDR_REG_BASE +0x50fa6*4+0x02000000,0x1d08); +reg_write( DDR_REG_BASE +0x50fa7*4+0x02000000,0x1094); +reg_write( DDR_REG_BASE +0x50fa8*4+0x02000000,0x71cd); +reg_write( DDR_REG_BASE +0x50fa9*4+0x02000000,0x1d02); +reg_write( DDR_REG_BASE +0x50faa*4+0x02000000,0x1055); +reg_write( DDR_REG_BASE +0x50fab*4+0x02000000,0x234a); +reg_write( DDR_REG_BASE +0x50fac*4+0x02000000,0x1200); +reg_write( DDR_REG_BASE +0x50fad*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x50fae*4+0x02000000,0xbf8b); +reg_write( DDR_REG_BASE +0x50faf*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x50fb0*4+0x02000000,0xf); +reg_write( DDR_REG_BASE +0x50fb1*4+0x02000000,0x4240); +reg_write( DDR_REG_BASE +0x50fb2*4+0x02000000,0xb5c0); +reg_write( DDR_REG_BASE +0x50fb3*4+0x02000000,0x1d6c); +reg_write( DDR_REG_BASE +0x50fb4*4+0x02000000,0x12c4); +reg_write( DDR_REG_BASE +0x50fb5*4+0x02000000,0x260a); +reg_write( DDR_REG_BASE +0x50fb6*4+0x02000000,0x3040); +reg_write( DDR_REG_BASE +0x50fb7*4+0x02000000,0x1df2); +reg_write( DDR_REG_BASE +0x50fb8*4+0x02000000,0x9044); +reg_write( DDR_REG_BASE +0x50fb9*4+0x02000000,0x1d66); +reg_write( DDR_REG_BASE +0x50fba*4+0x02000000,0x1044); +reg_write( DDR_REG_BASE +0x50fbb*4+0x02000000,0x1d6c); +reg_write( DDR_REG_BASE +0x50fbc*4+0x02000000,0x13c4); +reg_write( DDR_REG_BASE +0x50fbd*4+0x02000000,0xf42); +reg_write( DDR_REG_BASE +0x50fbe*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x50fbf*4+0x02000000,0x4318); +reg_write( DDR_REG_BASE +0x50fc0*4+0x02000000,0xbf70); +reg_write( DDR_REG_BASE +0x50fc1*4+0x02000000,0x202f); +reg_write( DDR_REG_BASE +0x50fc2*4+0x02000000,0x6c2); +reg_write( DDR_REG_BASE +0x50fc3*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x50fc4*4+0x02000000,0xf32); +reg_write( DDR_REG_BASE +0x50fc5*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x50fc6*4+0x02000000,0x1d6c); +reg_write( DDR_REG_BASE +0x50fc7*4+0x02000000,0x13c4); +reg_write( DDR_REG_BASE +0x50fc8*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x50fc9*4+0x02000000,0x98); +reg_write( DDR_REG_BASE +0x50fca*4+0x02000000,0x9680); +reg_write( DDR_REG_BASE +0x50fcb*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x50fcc*4+0x02000000,0xf22); +reg_write( DDR_REG_BASE +0x50fcd*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x50fce*4+0x02000000,0x1d6c); +reg_write( DDR_REG_BASE +0x50fcf*4+0x02000000,0x12c4); +reg_write( DDR_REG_BASE +0x50fd0*4+0x02000000,0xd888); +reg_write( DDR_REG_BASE +0x50fd1*4+0x02000000,0x1d6c); +reg_write( DDR_REG_BASE +0x50fd2*4+0x02000000,0x1004); +reg_write( DDR_REG_BASE +0x50fd3*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x50fd4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x50fd5*4+0x02000000,0x6000); +reg_write( DDR_REG_BASE +0x50fd6*4+0x02000000,0x1d6c); +reg_write( DDR_REG_BASE +0x50fd7*4+0x02000000,0x12c4); +reg_write( DDR_REG_BASE +0x50fd8*4+0x02000000,0x1d6c); +reg_write( DDR_REG_BASE +0x50fd9*4+0x02000000,0x1784); +reg_write( DDR_REG_BASE +0x50fda*4+0x02000000,0x1d72); +reg_write( DDR_REG_BASE +0x50fdb*4+0x02000000,0x939c); +reg_write( DDR_REG_BASE +0x50fdc*4+0x02000000,0x1dd0); +reg_write( DDR_REG_BASE +0x50fdd*4+0x02000000,0x9384); +reg_write( DDR_REG_BASE +0x50fde*4+0x02000000,0x1d72); +reg_write( DDR_REG_BASE +0x50fdf*4+0x02000000,0x90dd); +reg_write( DDR_REG_BASE +0x50fe0*4+0x02000000,0xea2); +reg_write( DDR_REG_BASE +0x50fe1*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x50fe2*4+0x02000000,0x1dd0); +reg_write( DDR_REG_BASE +0x50fe3*4+0x02000000,0x9784); +reg_write( DDR_REG_BASE +0x50fe4*4+0x02000000,0x1d72); +reg_write( DDR_REG_BASE +0x50fe5*4+0x02000000,0x939c); +reg_write( DDR_REG_BASE +0x50fe6*4+0x02000000,0x1d72); +reg_write( DDR_REG_BASE +0x50fe7*4+0x02000000,0x979c); +reg_write( DDR_REG_BASE +0x50fe8*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x50fe9*4+0x02000000,0xeea); +reg_write( DDR_REG_BASE +0x50fea*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x50feb*4+0x02000000,0xd920); +reg_write( DDR_REG_BASE +0x50fec*4+0x02000000,0x45cb); +reg_write( DDR_REG_BASE +0x50fed*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE +0x50fee*4+0x02000000,0x1f0); +reg_write( DDR_REG_BASE +0x50fef*4+0x02000000,0xd820); +reg_write( DDR_REG_BASE +0x50ff0*4+0x02000000,0xe82); +reg_write( DDR_REG_BASE +0x50ff1*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x50ff2*4+0x02000000,0x1d00); +reg_write( DDR_REG_BASE +0x50ff3*4+0x02000000,0x1005); +reg_write( DDR_REG_BASE +0x50ff4*4+0x02000000,0xd820); +reg_write( DDR_REG_BASE +0x50ff5*4+0x02000000,0xe7a); +reg_write( DDR_REG_BASE +0x50ff6*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x50ff7*4+0x02000000,0x1d00); +reg_write( DDR_REG_BASE +0x50ff8*4+0x02000000,0x1045); +reg_write( DDR_REG_BASE +0x50ff9*4+0x02000000,0x740c); +reg_write( DDR_REG_BASE +0x50ffa*4+0x02000000,0xe6e); +reg_write( DDR_REG_BASE +0x50ffb*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x50ffc*4+0x02000000,0x1d00); +reg_write( DDR_REG_BASE +0x50ffd*4+0x02000000,0x1005); +reg_write( DDR_REG_BASE +0x50ffe*4+0x02000000,0x1d0a); +reg_write( DDR_REG_BASE +0x50fff*4+0x02000000,0x909d); +reg_write( DDR_REG_BASE +0x51000*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE +0x51001*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE +0x51002*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE +0x51003*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x51004*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE +0x51005*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE +0x51006*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x51007*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x51008*4+0x02000000,0x7b6); +reg_write( DDR_REG_BASE +0x51009*4+0x02000000,0xdc22); +reg_write( DDR_REG_BASE +0x5100a*4+0x02000000,0xa940); +reg_write( DDR_REG_BASE +0x5100b*4+0x02000000,0xbc9f); +reg_write( DDR_REG_BASE +0x5100c*4+0x02000000,0x8c00); +reg_write( DDR_REG_BASE +0x5100d*4+0x02000000,0x45cb); +reg_write( DDR_REG_BASE +0x5100e*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x5100f*4+0x02000000,0x758); +reg_write( DDR_REG_BASE +0x51010*4+0x02000000,0xe007); +reg_write( DDR_REG_BASE +0x51011*4+0x02000000,0x7e1d); +reg_write( DDR_REG_BASE +0x51012*4+0x02000000,0x7edd); +reg_write( DDR_REG_BASE +0x51013*4+0x02000000,0x7edd); +reg_write( DDR_REG_BASE +0x51014*4+0x02000000,0x6e09); +reg_write( DDR_REG_BASE +0x51015*4+0x02000000,0xa901); +reg_write( DDR_REG_BASE +0x51016*4+0x02000000,0x1427); +reg_write( DDR_REG_BASE +0x51017*4+0x02000000,0x1083); +reg_write( DDR_REG_BASE +0x51018*4+0x02000000,0x7074); +reg_write( DDR_REG_BASE +0x51019*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE +0x5101a*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x5101b*4+0x02000000,0x77c); +reg_write( DDR_REG_BASE +0x5101c*4+0x02000000,0xf223); +reg_write( DDR_REG_BASE +0x5101d*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE +0x5101e*4+0x02000000,0x44); +reg_write( DDR_REG_BASE +0x5101f*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x51020*4+0x02000000,0x708f); +reg_write( DDR_REG_BASE +0x51021*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x51022*4+0x02000000,0x48); +reg_write( DDR_REG_BASE +0x51023*4+0x02000000,0xb501); +reg_write( DDR_REG_BASE +0x51024*4+0x02000000,0xca02); +reg_write( DDR_REG_BASE +0x51025*4+0x02000000,0x7e1d); +reg_write( DDR_REG_BASE +0x51026*4+0x02000000,0x6f07); +reg_write( DDR_REG_BASE +0x51027*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x51028*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x51029*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x5102a*4+0x02000000,0x60d8); +reg_write( DDR_REG_BASE +0x5102b*4+0x02000000,0x7704); +reg_write( DDR_REG_BASE +0x5102c*4+0x02000000,0xa9c2); +reg_write( DDR_REG_BASE +0x5102d*4+0x02000000,0xa903); +reg_write( DDR_REG_BASE +0x5102e*4+0x02000000,0x8c00); +reg_write( DDR_REG_BASE +0x5102f*4+0x02000000,0x82b); +reg_write( DDR_REG_BASE +0x51030*4+0x02000000,0x474); +reg_write( DDR_REG_BASE +0x51031*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE +0x51032*4+0x02000000,0xd06); +reg_write( DDR_REG_BASE +0x51033*4+0x02000000,0x100); +reg_write( DDR_REG_BASE +0x51034*4+0x02000000,0xad14); +reg_write( DDR_REG_BASE +0x51035*4+0x02000000,0xd02); +reg_write( DDR_REG_BASE +0x51036*4+0x02000000,0x120); +reg_write( DDR_REG_BASE +0x51037*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE +0x51038*4+0x02000000,0xad1c); +reg_write( DDR_REG_BASE +0x51039*4+0x02000000,0xcfa); +reg_write( DDR_REG_BASE +0x5103a*4+0x02000000,0x120); +reg_write( DDR_REG_BASE +0x5103b*4+0x02000000,0x740c); +reg_write( DDR_REG_BASE +0x5103c*4+0x02000000,0xab10); +reg_write( DDR_REG_BASE +0x5103d*4+0x02000000,0x740c); +reg_write( DDR_REG_BASE +0x5103e*4+0x02000000,0xf012); +reg_write( DDR_REG_BASE +0x5103f*4+0x02000000,0xa903); +reg_write( DDR_REG_BASE +0x51040*4+0x02000000,0xa9c2); +reg_write( DDR_REG_BASE +0x51041*4+0x02000000,0xb541); +reg_write( DDR_REG_BASE +0x51042*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE +0x51043*4+0x02000000,0xce6); +reg_write( DDR_REG_BASE +0x51044*4+0x02000000,0x120); +reg_write( DDR_REG_BASE +0x51045*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE +0x51046*4+0x02000000,0xad14); +reg_write( DDR_REG_BASE +0x51047*4+0x02000000,0xcde); +reg_write( DDR_REG_BASE +0x51048*4+0x02000000,0x120); +reg_write( DDR_REG_BASE +0x51049*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE +0x5104a*4+0x02000000,0xad1c); +reg_write( DDR_REG_BASE +0x5104b*4+0x02000000,0xcd6); +reg_write( DDR_REG_BASE +0x5104c*4+0x02000000,0x120); +reg_write( DDR_REG_BASE +0x5104d*4+0x02000000,0x720c); +reg_write( DDR_REG_BASE +0x5104e*4+0x02000000,0xab10); +reg_write( DDR_REG_BASE +0x5104f*4+0x02000000,0x720c); +reg_write( DDR_REG_BASE +0x51050*4+0x02000000,0xcca); +reg_write( DDR_REG_BASE +0x51051*4+0x02000000,0x100); +reg_write( DDR_REG_BASE +0x51052*4+0x02000000,0xab18); +reg_write( DDR_REG_BASE +0x51053*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x51054*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE +0x51055*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x51056*4+0x02000000,0x23); +reg_write( DDR_REG_BASE +0x51057*4+0x02000000,0xe816); +reg_write( DDR_REG_BASE +0x51058*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE +0x51059*4+0x02000000,0x44); +reg_write( DDR_REG_BASE +0x5105a*4+0x02000000,0xb500); +reg_write( DDR_REG_BASE +0x5105b*4+0x02000000,0xcb6); +reg_write( DDR_REG_BASE +0x5105c*4+0x02000000,0x120); +reg_write( DDR_REG_BASE +0x5105d*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE +0x5105e*4+0x02000000,0xad04); +reg_write( DDR_REG_BASE +0x5105f*4+0x02000000,0xcae); +reg_write( DDR_REG_BASE +0x51060*4+0x02000000,0x120); +reg_write( DDR_REG_BASE +0x51061*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE +0x51062*4+0x02000000,0xad0c); +reg_write( DDR_REG_BASE +0x51063*4+0x02000000,0xca6); +reg_write( DDR_REG_BASE +0x51064*4+0x02000000,0x120); +reg_write( DDR_REG_BASE +0x51065*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x51066*4+0x02000000,0xab00); +reg_write( DDR_REG_BASE +0x51067*4+0x02000000,0xc9e); +reg_write( DDR_REG_BASE +0x51068*4+0x02000000,0x120); +reg_write( DDR_REG_BASE +0x51069*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x5106a*4+0x02000000,0xab08); +reg_write( DDR_REG_BASE +0x5106b*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE +0x5106c*4+0x02000000,0xb540); +reg_write( DDR_REG_BASE +0x5106d*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE +0x5106e*4+0x02000000,0xc2e2); +reg_write( DDR_REG_BASE +0x5106f*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x51070*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE +0x51071*4+0x02000000,0x7c2); +reg_write( DDR_REG_BASE +0x51072*4+0x02000000,0x4020); +reg_write( DDR_REG_BASE +0x51073*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x51074*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x51075*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE +0x51076*4+0x02000000,0x8920); +reg_write( DDR_REG_BASE +0x51077*4+0x02000000,0xea06); +reg_write( DDR_REG_BASE +0x51078*4+0x02000000,0xba61); +reg_write( DDR_REG_BASE +0x51079*4+0x02000000,0xa01); +reg_write( DDR_REG_BASE +0x5107a*4+0x02000000,0x31); +reg_write( DDR_REG_BASE +0x5107b*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE +0x5107c*4+0x02000000,0x917); +reg_write( DDR_REG_BASE +0x5107d*4+0x02000000,0x70); +reg_write( DDR_REG_BASE +0x5107e*4+0x02000000,0x72ad); +reg_write( DDR_REG_BASE +0x5107f*4+0x02000000,0x73ad); +reg_write( DDR_REG_BASE +0x51080*4+0x02000000,0xe98e); +reg_write( DDR_REG_BASE +0x51081*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x51082*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE +0x51083*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x51084*4+0x02000000,0x23); +reg_write( DDR_REG_BASE +0x51085*4+0x02000000,0x71ad); +reg_write( DDR_REG_BASE +0x51086*4+0x02000000,0xf005); +reg_write( DDR_REG_BASE +0x51087*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x51088*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE +0x51089*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x5108a*4+0x02000000,0x49); +reg_write( DDR_REG_BASE +0x5108b*4+0x02000000,0x782b); +reg_write( DDR_REG_BASE +0x5108c*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x5108d*4+0x02000000,0xf20a); +reg_write( DDR_REG_BASE +0x5108e*4+0x02000000,0xf12); +reg_write( DDR_REG_BASE +0x5108f*4+0x02000000,0xff4f); +reg_write( DDR_REG_BASE +0x51090*4+0x02000000,0xafa); +reg_write( DDR_REG_BASE +0x51091*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE +0x51092*4+0x02000000,0x40a1); +reg_write( DDR_REG_BASE +0x51093*4+0x02000000,0xe5a); +reg_write( DDR_REG_BASE +0x51094*4+0x02000000,0xff4f); +reg_write( DDR_REG_BASE +0x51095*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE +0x51096*4+0x02000000,0xc6c2); +reg_write( DDR_REG_BASE +0x51097*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x51098*4+0x02000000,0xc0f1); +reg_write( DDR_REG_BASE +0x51099*4+0x02000000,0xf72); +reg_write( DDR_REG_BASE +0x5109a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5109b*4+0x02000000,0xc0d1); +reg_write( DDR_REG_BASE +0x5109c*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE +0x5109d*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x5109e*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE +0x5109f*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE +0x510a0*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE +0x510a1*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x510a2*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE +0x510a3*4+0x02000000,0x1e8); +reg_write( DDR_REG_BASE +0x510a4*4+0x02000000,0x9020); +reg_write( DDR_REG_BASE +0x510a5*4+0x02000000,0x2059); +reg_write( DDR_REG_BASE +0x510a6*4+0x02000000,0xf40); +reg_write( DDR_REG_BASE +0x510a7*4+0x02000000,0x7724); +reg_write( DDR_REG_BASE +0x510a8*4+0x02000000,0x7930); +reg_write( DDR_REG_BASE +0x510a9*4+0x02000000,0x793b); +reg_write( DDR_REG_BASE +0x510aa*4+0x02000000,0x2155); +reg_write( DDR_REG_BASE +0x510ab*4+0x02000000,0xc0d); +reg_write( DDR_REG_BASE +0x510ac*4+0x02000000,0x2105); +reg_write( DDR_REG_BASE +0x510ad*4+0x02000000,0xe); +reg_write( DDR_REG_BASE +0x510ae*4+0x02000000,0x7d05); +reg_write( DDR_REG_BASE +0x510af*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x510b0*4+0x02000000,0x111b); +reg_write( DDR_REG_BASE +0x510b1*4+0x02000000,0x95e0); +reg_write( DDR_REG_BASE +0x510b2*4+0x02000000,0x83a); +reg_write( DDR_REG_BASE +0x510b3*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x510b4*4+0x02000000,0xd896); +reg_write( DDR_REG_BASE +0x510b5*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x510b6*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x510b7*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x510b8*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x510b9*4+0x02000000,0x6822); +reg_write( DDR_REG_BASE +0x510ba*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE +0x510bb*4+0x02000000,0xb8e0); +reg_write( DDR_REG_BASE +0x510bc*4+0x02000000,0x21ca); +reg_write( DDR_REG_BASE +0x510bd*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x510be*4+0x02000000,0x782f); +reg_write( DDR_REG_BASE +0x510bf*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x510c0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x510c1*4+0x02000000,0xff00); +reg_write( DDR_REG_BASE +0x510c2*4+0x02000000,0x2304); +reg_write( DDR_REG_BASE +0x510c3*4+0x02000000,0x305b); +reg_write( DDR_REG_BASE +0x510c4*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x510c5*4+0x02000000,0x6c0); +reg_write( DDR_REG_BASE +0x510c6*4+0x02000000,0x79e4); +reg_write( DDR_REG_BASE +0x510c7*4+0x02000000,0xb600); +reg_write( DDR_REG_BASE +0x510c8*4+0x02000000,0x2145); +reg_write( DDR_REG_BASE +0x510c9*4+0x02000000,0x3c0); +reg_write( DDR_REG_BASE +0x510ca*4+0x02000000,0xb500); +reg_write( DDR_REG_BASE +0x510cb*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE +0x510cc*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE +0x510cd*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE +0x510ce*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x510cf*4+0x02000000,0x7101); +reg_write( DDR_REG_BASE +0x510d0*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x510d1*4+0x02000000,0x6); +reg_write( DDR_REG_BASE +0x510d2*4+0x02000000,0x790c); +reg_write( DDR_REG_BASE +0x510d3*4+0x02000000,0x2985); +reg_write( DDR_REG_BASE +0x510d4*4+0x02000000,0x41f); +reg_write( DDR_REG_BASE +0x510d5*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE +0x510d6*4+0x02000000,0x6901); +reg_write( DDR_REG_BASE +0x510d7*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x510d8*4+0x02000000,0x2042); +reg_write( DDR_REG_BASE +0x510d9*4+0x02000000,0x701); +reg_write( DDR_REG_BASE +0x510da*4+0x02000000,0x939); +reg_write( DDR_REG_BASE +0x510db*4+0x02000000,0x454); +reg_write( DDR_REG_BASE +0x510dc*4+0x02000000,0x889); +reg_write( DDR_REG_BASE +0x510dd*4+0x02000000,0xc30); +reg_write( DDR_REG_BASE +0x510de*4+0x02000000,0xd91a); +reg_write( DDR_REG_BASE +0x510df*4+0x02000000,0x885); +reg_write( DDR_REG_BASE +0x510e0*4+0x02000000,0xd70); +reg_write( DDR_REG_BASE +0x510e1*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE +0x510e2*4+0x02000000,0x87d); +reg_write( DDR_REG_BASE +0x510e3*4+0x02000000,0xf30); +reg_write( DDR_REG_BASE +0x510e4*4+0x02000000,0xd918); +reg_write( DDR_REG_BASE +0x510e5*4+0x02000000,0xe0c5); +reg_write( DDR_REG_BASE +0x510e6*4+0x02000000,0xf227); +reg_write( DDR_REG_BASE +0x510e7*4+0x02000000,0xe0d0); +reg_write( DDR_REG_BASE +0x510e8*4+0x02000000,0xf227); +reg_write( DDR_REG_BASE +0x510e9*4+0x02000000,0xe0e0); +reg_write( DDR_REG_BASE +0x510ea*4+0x02000000,0xf227); +reg_write( DDR_REG_BASE +0x510eb*4+0x02000000,0xe0f8); +reg_write( DDR_REG_BASE +0x510ec*4+0x02000000,0xf227); +reg_write( DDR_REG_BASE +0x510ed*4+0x02000000,0x208c); +reg_write( DDR_REG_BASE +0x510ee*4+0x02000000,0x8c03); +reg_write( DDR_REG_BASE +0x510ef*4+0x02000000,0x722c); +reg_write( DDR_REG_BASE +0x510f0*4+0x02000000,0xf230); +reg_write( DDR_REG_BASE +0x510f1*4+0x02000000,0x208c); +reg_write( DDR_REG_BASE +0x510f2*4+0x02000000,0x8802); +reg_write( DDR_REG_BASE +0x510f3*4+0x02000000,0xf419); +reg_write( DDR_REG_BASE +0x510f4*4+0x02000000,0x732c); +reg_write( DDR_REG_BASE +0x510f5*4+0x02000000,0xf02c); +reg_write( DDR_REG_BASE +0x510f6*4+0x02000000,0x2025); +reg_write( DDR_REG_BASE +0x510f7*4+0x02000000,0x40); +reg_write( DDR_REG_BASE +0x510f8*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE +0x510f9*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE +0x510fa*4+0x02000000,0xf01b); +reg_write( DDR_REG_BASE +0x510fb*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE +0x510fc*4+0x02000000,0xf01b); +reg_write( DDR_REG_BASE +0x510fd*4+0x02000000,0xf00f); +reg_write( DDR_REG_BASE +0x510fe*4+0x02000000,0xf01b); +reg_write( DDR_REG_BASE +0x510ff*4+0x02000000,0xf00d); +reg_write( DDR_REG_BASE +0x51100*4+0x02000000,0xf00b); +reg_write( DDR_REG_BASE +0x51101*4+0x02000000,0xf01b); +reg_write( DDR_REG_BASE +0x51102*4+0x02000000,0xf009); +reg_write( DDR_REG_BASE +0x51103*4+0x02000000,0xf009); +reg_write( DDR_REG_BASE +0x51104*4+0x02000000,0xf019); +reg_write( DDR_REG_BASE +0x51105*4+0x02000000,0xf007); +reg_write( DDR_REG_BASE +0x51106*4+0x02000000,0xf005); +reg_write( DDR_REG_BASE +0x51107*4+0x02000000,0xf005); +reg_write( DDR_REG_BASE +0x51108*4+0x02000000,0xf017); +reg_write( DDR_REG_BASE +0x51109*4+0x02000000,0xd93f); +reg_write( DDR_REG_BASE +0x5110a*4+0x02000000,0xf016); +reg_write( DDR_REG_BASE +0x5110b*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x5110c*4+0x02000000,0xf014); +reg_write( DDR_REG_BASE +0x5110d*4+0x02000000,0xd90b); +reg_write( DDR_REG_BASE +0x5110e*4+0x02000000,0xf012); +reg_write( DDR_REG_BASE +0x5110f*4+0x02000000,0xd90a); +reg_write( DDR_REG_BASE +0x51110*4+0x02000000,0xf010); +reg_write( DDR_REG_BASE +0x51111*4+0x02000000,0xd907); +reg_write( DDR_REG_BASE +0x51112*4+0x02000000,0xf00e); +reg_write( DDR_REG_BASE +0x51113*4+0x02000000,0xd908); +reg_write( DDR_REG_BASE +0x51114*4+0x02000000,0xf00c); +reg_write( DDR_REG_BASE +0x51115*4+0x02000000,0xd93e); +reg_write( DDR_REG_BASE +0x51116*4+0x02000000,0xf00a); +reg_write( DDR_REG_BASE +0x51117*4+0x02000000,0xd93b); +reg_write( DDR_REG_BASE +0x51118*4+0x02000000,0xf008); +reg_write( DDR_REG_BASE +0x51119*4+0x02000000,0xd93a); +reg_write( DDR_REG_BASE +0x5111a*4+0x02000000,0xf006); +reg_write( DDR_REG_BASE +0x5111b*4+0x02000000,0xd91f); +reg_write( DDR_REG_BASE +0x5111c*4+0x02000000,0xf004); +reg_write( DDR_REG_BASE +0x5111d*4+0x02000000,0xd938); +reg_write( DDR_REG_BASE +0x5111e*4+0x02000000,0xf002); +reg_write( DDR_REG_BASE +0x5111f*4+0x02000000,0xd91b); +reg_write( DDR_REG_BASE +0x51120*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE +0x51121*4+0x02000000,0x4020); +reg_write( DDR_REG_BASE +0x51122*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE +0x51123*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE +0x51124*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE +0x51125*4+0x02000000,0x2482); +reg_write( DDR_REG_BASE +0x51126*4+0x02000000,0x330f); +reg_write( DDR_REG_BASE +0x51127*4+0x02000000,0xa8e); +reg_write( DDR_REG_BASE +0x51128*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE +0x51129*4+0x02000000,0xc083); +reg_write( DDR_REG_BASE +0x5112a*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x5112b*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE +0x5112c*4+0x02000000,0xc083); +reg_write( DDR_REG_BASE +0x5112d*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x5112e*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE +0x5112f*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x51130*4+0x02000000,0x600); +reg_write( DDR_REG_BASE +0x51131*4+0x02000000,0xd92); +reg_write( DDR_REG_BASE +0x51132*4+0x02000000,0x1a0); +reg_write( DDR_REG_BASE +0x51133*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE +0x51134*4+0x02000000,0xc62); +reg_write( DDR_REG_BASE +0x51135*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51136*4+0x02000000,0xb2a); +reg_write( DDR_REG_BASE +0x51137*4+0x02000000,0x40); +reg_write( DDR_REG_BASE +0x51138*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x51139*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x5113a*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE +0x5113b*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE +0x5113c*4+0x02000000,0xdc); +reg_write( DDR_REG_BASE +0x5113d*4+0x02000000,0x315); +reg_write( DDR_REG_BASE +0x5113e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5113f*4+0x02000000,0xe90b); +reg_write( DDR_REG_BASE +0x51140*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x51141*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE +0x51142*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x51143*4+0x02000000,0x49); +reg_write( DDR_REG_BASE +0x51144*4+0x02000000,0x7034); +reg_write( DDR_REG_BASE +0x51145*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x51146*4+0x02000000,0xf40b); +reg_write( DDR_REG_BASE +0x51147*4+0x02000000,0x2ff); +reg_write( DDR_REG_BASE +0x51148*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51149*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x5114a*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE +0x5114b*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x5114c*4+0x02000000,0x23); +reg_write( DDR_REG_BASE +0x5114d*4+0x02000000,0x7034); +reg_write( DDR_REG_BASE +0x5114e*4+0x02000000,0x2ee); +reg_write( DDR_REG_BASE +0x5114f*4+0x02000000,0x21); +reg_write( DDR_REG_BASE +0x51150*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x51151*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE +0x51152*4+0x02000000,0x976); +reg_write( DDR_REG_BASE +0x51153*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE +0x51154*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE +0x51155*4+0x02000000,0x216f); +reg_write( DDR_REG_BASE +0x51156*4+0x02000000,0xc3); +reg_write( DDR_REG_BASE +0x51157*4+0x02000000,0x1100); +reg_write( DDR_REG_BASE +0x51158*4+0x02000000,0xc0); +reg_write( DDR_REG_BASE +0x51159*4+0x02000000,0x89c3); +reg_write( DDR_REG_BASE +0x5115a*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x5115b*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE +0x5115c*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE +0x5115d*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE +0x5115e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5115f*4+0x02000000,0x32c); +reg_write( DDR_REG_BASE +0x51160*4+0x02000000,0xdd2); +reg_write( DDR_REG_BASE +0x51161*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x51162*4+0x02000000,0xdaa0); +reg_write( DDR_REG_BASE +0x51163*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE +0x51164*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE +0x51165*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51166*4+0x02000000,0x28c); +reg_write( DDR_REG_BASE +0x51167*4+0x02000000,0xdc6); +reg_write( DDR_REG_BASE +0x51168*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x51169*4+0x02000000,0xdaa0); +reg_write( DDR_REG_BASE +0x5116a*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE +0x5116b*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE +0x5116c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5116d*4+0x02000000,0x1ec); +reg_write( DDR_REG_BASE +0x5116e*4+0x02000000,0xdb6); +reg_write( DDR_REG_BASE +0x5116f*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x51170*4+0x02000000,0xdaa0); +reg_write( DDR_REG_BASE +0x51171*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE +0x51172*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE +0x51173*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51174*4+0x02000000,0x14c); +reg_write( DDR_REG_BASE +0x51175*4+0x02000000,0xdaa); +reg_write( DDR_REG_BASE +0x51176*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x51177*4+0x02000000,0xdaa0); +reg_write( DDR_REG_BASE +0x51178*4+0x02000000,0x261a); +reg_write( DDR_REG_BASE +0x51179*4+0x02000000,0x1f8e); +reg_write( DDR_REG_BASE +0x5117a*4+0x02000000,0x10); +reg_write( DDR_REG_BASE +0x5117b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5117c*4+0x02000000,0x4338); +reg_write( DDR_REG_BASE +0x5117d*4+0x02000000,0xf072); +reg_write( DDR_REG_BASE +0x5117e*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE +0x5117f*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE +0x51180*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51181*4+0x02000000,0x124); +reg_write( DDR_REG_BASE +0x51182*4+0x02000000,0xd8e); +reg_write( DDR_REG_BASE +0x51183*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x51184*4+0x02000000,0xda28); +reg_write( DDR_REG_BASE +0x51185*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE +0x51186*4+0x02000000,0x3fc0); +reg_write( DDR_REG_BASE +0x51187*4+0x02000000,0xd86); +reg_write( DDR_REG_BASE +0x51188*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x51189*4+0x02000000,0xda28); +reg_write( DDR_REG_BASE +0x5118a*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE +0x5118b*4+0x02000000,0x3d40); +reg_write( DDR_REG_BASE +0x5118c*4+0x02000000,0xd7a); +reg_write( DDR_REG_BASE +0x5118d*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x5118e*4+0x02000000,0xda28); +reg_write( DDR_REG_BASE +0x5118f*4+0x02000000,0x2355); +reg_write( DDR_REG_BASE +0x51190*4+0x02000000,0x3800); +reg_write( DDR_REG_BASE +0x51191*4+0x02000000,0x78c5); +reg_write( DDR_REG_BASE +0x51192*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE +0x51193*4+0x02000000,0x3f81); +reg_write( DDR_REG_BASE +0x51194*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51195*4+0x02000000,0x124); +reg_write( DDR_REG_BASE +0x51196*4+0x02000000,0xb86); +reg_write( DDR_REG_BASE +0x51197*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE +0x51198*4+0x02000000,0x724c); +reg_write( DDR_REG_BASE +0x51199*4+0x02000000,0x2355); +reg_write( DDR_REG_BASE +0x5119a*4+0x02000000,0x38c0); +reg_write( DDR_REG_BASE +0x5119b*4+0x02000000,0x78c5); +reg_write( DDR_REG_BASE +0x5119c*4+0x02000000,0xb7a); +reg_write( DDR_REG_BASE +0x5119d*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE +0x5119e*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE +0x5119f*4+0x02000000,0x3fc1); +reg_write( DDR_REG_BASE +0x511a0*4+0x02000000,0x2355); +reg_write( DDR_REG_BASE +0x511a1*4+0x02000000,0x3d00); +reg_write( DDR_REG_BASE +0x511a2*4+0x02000000,0x78c5); +reg_write( DDR_REG_BASE +0x511a3*4+0x02000000,0xb6e); +reg_write( DDR_REG_BASE +0x511a4*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE +0x511a5*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE +0x511a6*4+0x02000000,0x3d41); +reg_write( DDR_REG_BASE +0x511a7*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x511a8*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x511a9*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE +0x511aa*4+0x02000000,0x1003); +reg_write( DDR_REG_BASE +0x511ab*4+0x02000000,0x8b); +reg_write( DDR_REG_BASE +0x511ac*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x511ad*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x511ae*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE +0x511af*4+0x02000000,0x8862); +reg_write( DDR_REG_BASE +0x511b0*4+0x02000000,0xf03b); +reg_write( DDR_REG_BASE +0x511b1*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE +0x511b2*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE +0x511b3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x511b4*4+0x02000000,0x124); +reg_write( DDR_REG_BASE +0x511b5*4+0x02000000,0x20f4); +reg_write( DDR_REG_BASE +0x511b6*4+0x02000000,0xde); +reg_write( DDR_REG_BASE +0x511b7*4+0x02000000,0xd26); +reg_write( DDR_REG_BASE +0x511b8*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE +0x511b9*4+0x02000000,0x200a); +reg_write( DDR_REG_BASE +0x511ba*4+0x02000000,0x780); +reg_write( DDR_REG_BASE +0x511bb*4+0x02000000,0x4708); +reg_write( DDR_REG_BASE +0x511bc*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE +0x511bd*4+0x02000000,0x3fc0); +reg_write( DDR_REG_BASE +0x511be*4+0x02000000,0x20f4); +reg_write( DDR_REG_BASE +0x511bf*4+0x02000000,0xcd); +reg_write( DDR_REG_BASE +0x511c0*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE +0x511c1*4+0x02000000,0x3d40); +reg_write( DDR_REG_BASE +0x511c2*4+0x02000000,0x20f4); +reg_write( DDR_REG_BASE +0x511c3*4+0x02000000,0xc0); +reg_write( DDR_REG_BASE +0x511c4*4+0x02000000,0xbdc5); +reg_write( DDR_REG_BASE +0x511c5*4+0x02000000,0xd0a); +reg_write( DDR_REG_BASE +0x511c6*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE +0x511c7*4+0x02000000,0x65fd); +reg_write( DDR_REG_BASE +0x511c8*4+0x02000000,0x235a); +reg_write( DDR_REG_BASE +0x511c9*4+0x02000000,0x3a02); +reg_write( DDR_REG_BASE +0x511ca*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE +0x511cb*4+0x02000000,0x3f81); +reg_write( DDR_REG_BASE +0x511cc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x511cd*4+0x02000000,0x32c); +reg_write( DDR_REG_BASE +0x511ce*4+0x02000000,0x6159); +reg_write( DDR_REG_BASE +0x511cf*4+0x02000000,0x7974); +reg_write( DDR_REG_BASE +0x511d0*4+0x02000000,0xb1a0); +reg_write( DDR_REG_BASE +0x511d1*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE +0x511d2*4+0x02000000,0x3f81); +reg_write( DDR_REG_BASE +0x511d3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x511d4*4+0x02000000,0x28c); +reg_write( DDR_REG_BASE +0x511d5*4+0x02000000,0x615c); +reg_write( DDR_REG_BASE +0x511d6*4+0x02000000,0x212f); +reg_write( DDR_REG_BASE +0x511d7*4+0x02000000,0x782); +reg_write( DDR_REG_BASE +0x511d8*4+0x02000000,0x7c74); +reg_write( DDR_REG_BASE +0x511d9*4+0x02000000,0x216c); +reg_write( DDR_REG_BASE +0x511da*4+0x02000000,0x101); +reg_write( DDR_REG_BASE +0x511db*4+0x02000000,0xb420); +reg_write( DDR_REG_BASE +0x511dc*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE +0x511dd*4+0x02000000,0x3f81); +reg_write( DDR_REG_BASE +0x511de*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x511df*4+0x02000000,0x1ec); +reg_write( DDR_REG_BASE +0x511e0*4+0x02000000,0x6159); +reg_write( DDR_REG_BASE +0x511e1*4+0x02000000,0x7974); +reg_write( DDR_REG_BASE +0x511e2*4+0x02000000,0xb1e0); +reg_write( DDR_REG_BASE +0x511e3*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE +0x511e4*4+0x02000000,0x3f81); +reg_write( DDR_REG_BASE +0x511e5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x511e6*4+0x02000000,0x14c); +reg_write( DDR_REG_BASE +0x511e7*4+0x02000000,0x6159); +reg_write( DDR_REG_BASE +0x511e8*4+0x02000000,0x7974); +reg_write( DDR_REG_BASE +0x511e9*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE +0x511ea*4+0x02000000,0x7164); +reg_write( DDR_REG_BASE +0x511eb*4+0x02000000,0xb8f); +reg_write( DDR_REG_BASE +0x511ec*4+0x02000000,0x90c5); +reg_write( DDR_REG_BASE +0x511ed*4+0x02000000,0x7167); +reg_write( DDR_REG_BASE +0x511ee*4+0x02000000,0xb21); +reg_write( DDR_REG_BASE +0x511ef*4+0x02000000,0xb134); +reg_write( DDR_REG_BASE +0x511f0*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x511f1*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x511f2*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE +0x511f3*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x511f4*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE +0x511f5*4+0x02000000,0xd92e); +reg_write( DDR_REG_BASE +0x511f6*4+0x02000000,0xb99f); +reg_write( DDR_REG_BASE +0x511f7*4+0x02000000,0x2140); +reg_write( DDR_REG_BASE +0x511f8*4+0x02000000,0x98e); +reg_write( DDR_REG_BASE +0x511f9*4+0x02000000,0x7014); +reg_write( DDR_REG_BASE +0x511fa*4+0x02000000,0x2642); +reg_write( DDR_REG_BASE +0x511fb*4+0x02000000,0x1283); +reg_write( DDR_REG_BASE +0x511fc*4+0x02000000,0x2142); +reg_write( DDR_REG_BASE +0x511fd*4+0x02000000,0x280); +reg_write( DDR_REG_BASE +0x511fe*4+0x02000000,0x23ca); +reg_write( DDR_REG_BASE +0x511ff*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x51200*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE +0x51201*4+0x02000000,0x26ca); +reg_write( DDR_REG_BASE +0x51202*4+0x02000000,0x1041); +reg_write( DDR_REG_BASE +0x51203*4+0x02000000,0x4308); +reg_write( DDR_REG_BASE +0x51204*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE +0x51205*4+0x02000000,0xf05e); +reg_write( DDR_REG_BASE +0x51206*4+0x02000000,0xdb1); +reg_write( DDR_REG_BASE +0x51207*4+0x02000000,0x12e0); +reg_write( DDR_REG_BASE +0x51208*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE +0x51209*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x5120a*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x5120b*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE +0x5120c*4+0x02000000,0x1003); +reg_write( DDR_REG_BASE +0x5120d*4+0x02000000,0x9f); +reg_write( DDR_REG_BASE +0x5120e*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x5120f*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x51210*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE +0x51211*4+0x02000000,0x8882); +reg_write( DDR_REG_BASE +0x51212*4+0x02000000,0xba8f); +reg_write( DDR_REG_BASE +0x51213*4+0x02000000,0x4358); +reg_write( DDR_REG_BASE +0x51214*4+0x02000000,0xf031); +reg_write( DDR_REG_BASE +0x51215*4+0x02000000,0x255a); +reg_write( DDR_REG_BASE +0x51216*4+0x02000000,0x1a0f); +reg_write( DDR_REG_BASE +0x51217*4+0x02000000,0xc101); +reg_write( DDR_REG_BASE +0x51218*4+0x02000000,0x921); +reg_write( DDR_REG_BASE +0x51219*4+0x02000000,0x32); +reg_write( DDR_REG_BASE +0x5121a*4+0x02000000,0x235a); +reg_write( DDR_REG_BASE +0x5121b*4+0x02000000,0x1a00); +reg_write( DDR_REG_BASE +0x5121c*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE +0x5121d*4+0x02000000,0x3f81); +reg_write( DDR_REG_BASE +0x5121e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5121f*4+0x02000000,0x28c); +reg_write( DDR_REG_BASE +0x51220*4+0x02000000,0x61f9); +reg_write( DDR_REG_BASE +0x51221*4+0x02000000,0x21f4); +reg_write( DDR_REG_BASE +0x51222*4+0x02000000,0x302); +reg_write( DDR_REG_BASE +0x51223*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE +0x51224*4+0x02000000,0x3f81); +reg_write( DDR_REG_BASE +0x51225*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51226*4+0x02000000,0x32c); +reg_write( DDR_REG_BASE +0x51227*4+0x02000000,0xf009); +reg_write( DDR_REG_BASE +0x51228*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE +0x51229*4+0x02000000,0x3f81); +reg_write( DDR_REG_BASE +0x5122a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5122b*4+0x02000000,0x1ec); +reg_write( DDR_REG_BASE +0x5122c*4+0x02000000,0x61fa); +reg_write( DDR_REG_BASE +0x5122d*4+0x02000000,0x22f4); +reg_write( DDR_REG_BASE +0x5122e*4+0x02000000,0x302); +reg_write( DDR_REG_BASE +0x5122f*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x51230*4+0x02000000,0x21f4); +reg_write( DDR_REG_BASE +0x51231*4+0x02000000,0x301); +reg_write( DDR_REG_BASE +0x51232*4+0x02000000,0x7942); +reg_write( DDR_REG_BASE +0x51233*4+0x02000000,0x2608); +reg_write( DDR_REG_BASE +0x51234*4+0x02000000,0x3042); +reg_write( DDR_REG_BASE +0x51235*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE +0x51236*4+0x02000000,0x3f81); +reg_write( DDR_REG_BASE +0x51237*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51238*4+0x02000000,0x14c); +reg_write( DDR_REG_BASE +0x51239*4+0x02000000,0x673f); +reg_write( DDR_REG_BASE +0x5123a*4+0x02000000,0x6038); +reg_write( DDR_REG_BASE +0x5123b*4+0x02000000,0x27f4); +reg_write( DDR_REG_BASE +0x5123c*4+0x02000000,0x130f); +reg_write( DDR_REG_BASE +0x5123d*4+0x02000000,0x20f4); +reg_write( DDR_REG_BASE +0x5123e*4+0x02000000,0x300); +reg_write( DDR_REG_BASE +0x5123f*4+0x02000000,0x212f); +reg_write( DDR_REG_BASE +0x51240*4+0x02000000,0x6c6); +reg_write( DDR_REG_BASE +0x51241*4+0x02000000,0x7185); +reg_write( DDR_REG_BASE +0x51242*4+0x02000000,0x78e2); +reg_write( DDR_REG_BASE +0x51243*4+0x02000000,0x2108); +reg_write( DDR_REG_BASE +0x51244*4+0x02000000,0x1b); +reg_write( DDR_REG_BASE +0x51245*4+0x02000000,0xfa3); +reg_write( DDR_REG_BASE +0x51246*4+0x02000000,0xb325); +reg_write( DDR_REG_BASE +0x51247*4+0x02000000,0x262f); +reg_write( DDR_REG_BASE +0x51248*4+0x02000000,0x3086); +reg_write( DDR_REG_BASE +0x51249*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE +0x5124a*4+0x02000000,0x80f); +reg_write( DDR_REG_BASE +0x5124b*4+0x02000000,0x32); +reg_write( DDR_REG_BASE +0x5124c*4+0x02000000,0x200a); +reg_write( DDR_REG_BASE +0x5124d*4+0x02000000,0x780); +reg_write( DDR_REG_BASE +0x5124e*4+0x02000000,0xb5e); +reg_write( DDR_REG_BASE +0x5124f*4+0x02000000,0xff4f); +reg_write( DDR_REG_BASE +0x51250*4+0x02000000,0xf005); +reg_write( DDR_REG_BASE +0x51251*4+0x02000000,0xb12); +reg_write( DDR_REG_BASE +0x51252*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE +0x51253*4+0x02000000,0x200a); +reg_write( DDR_REG_BASE +0x51254*4+0x02000000,0x780); +reg_write( DDR_REG_BASE +0x51255*4+0x02000000,0x4100); +reg_write( DDR_REG_BASE +0x51256*4+0x02000000,0xb06); +reg_write( DDR_REG_BASE +0x51257*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE +0x51258*4+0x02000000,0x202f); +reg_write( DDR_REG_BASE +0x51259*4+0x02000000,0x6c6); +reg_write( DDR_REG_BASE +0x5125a*4+0x02000000,0x1b01); +reg_write( DDR_REG_BASE +0x5125b*4+0x02000000,0x52); +reg_write( DDR_REG_BASE +0x5125c*4+0x02000000,0x1e01); +reg_write( DDR_REG_BASE +0x5125d*4+0x02000000,0x1012); +reg_write( DDR_REG_BASE +0x5125e*4+0x02000000,0x77a5); +reg_write( DDR_REG_BASE +0x5125f*4+0x02000000,0xd51); +reg_write( DDR_REG_BASE +0x51260*4+0x02000000,0x9013); +reg_write( DDR_REG_BASE +0x51261*4+0x02000000,0x7765); +reg_write( DDR_REG_BASE +0x51262*4+0x02000000,0xbfb); +reg_write( DDR_REG_BASE +0x51263*4+0x02000000,0x9033); +reg_write( DDR_REG_BASE +0x51264*4+0x02000000,0x71ad); +reg_write( DDR_REG_BASE +0x51265*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x51266*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE +0x51267*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x51268*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE +0x51269*4+0x02000000,0xd92a); +reg_write( DDR_REG_BASE +0x5126a*4+0x02000000,0xb99f); +reg_write( DDR_REG_BASE +0x5126b*4+0x02000000,0x2140); +reg_write( DDR_REG_BASE +0x5126c*4+0x02000000,0x98b); +reg_write( DDR_REG_BASE +0x5126d*4+0x02000000,0x7014); +reg_write( DDR_REG_BASE +0x5126e*4+0x02000000,0x2342); +reg_write( DDR_REG_BASE +0x5126f*4+0x02000000,0x1100); +reg_write( DDR_REG_BASE +0x51270*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE +0x51271*4+0x02000000,0x23ca); +reg_write( DDR_REG_BASE +0x51272*4+0x02000000,0x1041); +reg_write( DDR_REG_BASE +0x51273*4+0x02000000,0x690c); +reg_write( DDR_REG_BASE +0x51274*4+0x02000000,0xc101); +reg_write( DDR_REG_BASE +0x51275*4+0x02000000,0x21ca); +reg_write( DDR_REG_BASE +0x51276*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x51277*4+0x02000000,0xc141); +reg_write( DDR_REG_BASE +0x51278*4+0x02000000,0xf045); +reg_write( DDR_REG_BASE +0x51279*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x5127a*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x5127b*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE +0x5127c*4+0x02000000,0x1003); +reg_write( DDR_REG_BASE +0x5127d*4+0x02000000,0x9e); +reg_write( DDR_REG_BASE +0x5127e*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x5127f*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x51280*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE +0x51281*4+0x02000000,0x8842); +reg_write( DDR_REG_BASE +0x51282*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x51283*4+0x02000000,0xb88f); +reg_write( DDR_REG_BASE +0x51284*4+0x02000000,0x4100); +reg_write( DDR_REG_BASE +0x51285*4+0x02000000,0xf023); +reg_write( DDR_REG_BASE +0x51286*4+0x02000000,0xc602); +reg_write( DDR_REG_BASE +0x51287*4+0x02000000,0x235a); +reg_write( DDR_REG_BASE +0x51288*4+0x02000000,0x3a0c); +reg_write( DDR_REG_BASE +0x51289*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE +0x5128a*4+0x02000000,0x3f8d); +reg_write( DDR_REG_BASE +0x5128b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5128c*4+0x02000000,0x1ec); +reg_write( DDR_REG_BASE +0x5128d*4+0x02000000,0x265a); +reg_write( DDR_REG_BASE +0x5128e*4+0x02000000,0x1a0e); +reg_write( DDR_REG_BASE +0x5128f*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE +0x51290*4+0x02000000,0x3f8f); +reg_write( DDR_REG_BASE +0x51291*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51292*4+0x02000000,0x14c); +reg_write( DDR_REG_BASE +0x51293*4+0x02000000,0x6599); +reg_write( DDR_REG_BASE +0x51294*4+0x02000000,0x21f4); +reg_write( DDR_REG_BASE +0x51295*4+0x02000000,0x9f); +reg_write( DDR_REG_BASE +0x51296*4+0x02000000,0x67d9); +reg_write( DDR_REG_BASE +0x51297*4+0x02000000,0x21f4); +reg_write( DDR_REG_BASE +0x51298*4+0x02000000,0x81); +reg_write( DDR_REG_BASE +0x51299*4+0x02000000,0x64fc); +reg_write( DDR_REG_BASE +0x5129a*4+0x02000000,0x65dd); +reg_write( DDR_REG_BASE +0x5129b*4+0x02000000,0x2102); +reg_write( DDR_REG_BASE +0x5129c*4+0x02000000,0x7c1); +reg_write( DDR_REG_BASE +0x5129d*4+0x02000000,0x2308); +reg_write( DDR_REG_BASE +0x5129e*4+0x02000000,0x41); +reg_write( DDR_REG_BASE +0x5129f*4+0x02000000,0x24f4); +reg_write( DDR_REG_BASE +0x512a0*4+0x02000000,0x108c); +reg_write( DDR_REG_BASE +0x512a1*4+0x02000000,0x25f4); +reg_write( DDR_REG_BASE +0x512a2*4+0x02000000,0x1083); +reg_write( DDR_REG_BASE +0x512a3*4+0x02000000,0x7144); +reg_write( DDR_REG_BASE +0x512a4*4+0x02000000,0x7b82); +reg_write( DDR_REG_BASE +0x512a5*4+0x02000000,0x2008); +reg_write( DDR_REG_BASE +0x512a6*4+0x02000000,0xc0); +reg_write( DDR_REG_BASE +0x512a7*4+0x02000000,0x780e); +reg_write( DDR_REG_BASE +0x512a8*4+0x02000000,0xebd); +reg_write( DDR_REG_BASE +0x512a9*4+0x02000000,0xb0a5); +reg_write( DDR_REG_BASE +0x512aa*4+0x02000000,0x7b2e); +reg_write( DDR_REG_BASE +0x512ab*4+0x02000000,0xa5e); +reg_write( DDR_REG_BASE +0x512ac*4+0x02000000,0xff4f); +reg_write( DDR_REG_BASE +0x512ad*4+0x02000000,0x4200); +reg_write( DDR_REG_BASE +0x512ae*4+0x02000000,0xa56); +reg_write( DDR_REG_BASE +0x512af*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE +0x512b0*4+0x02000000,0x4060); +reg_write( DDR_REG_BASE +0x512b1*4+0x02000000,0xc101); +reg_write( DDR_REG_BASE +0x512b2*4+0x02000000,0x7767); +reg_write( DDR_REG_BASE +0x512b3*4+0x02000000,0x1901); +reg_write( DDR_REG_BASE +0x512b4*4+0x02000000,0x92); +reg_write( DDR_REG_BASE +0x512b5*4+0x02000000,0xc141); +reg_write( DDR_REG_BASE +0x512b6*4+0x02000000,0x1b01); +reg_write( DDR_REG_BASE +0x512b7*4+0x02000000,0x1012); +reg_write( DDR_REG_BASE +0x512b8*4+0x02000000,0xb83); +reg_write( DDR_REG_BASE +0x512b9*4+0x02000000,0xb013); +reg_write( DDR_REG_BASE +0x512ba*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE +0x512bb*4+0x02000000,0x7704); +reg_write( DDR_REG_BASE +0x512bc*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE +0x512bd*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE +0x512be*4+0x02000000,0x8f5); +reg_write( DDR_REG_BASE +0x512bf*4+0x02000000,0x8033); +reg_write( DDR_REG_BASE +0x512c0*4+0x02000000,0x716f); +reg_write( DDR_REG_BASE +0x512c1*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x512c2*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE +0x512c3*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x512c4*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE +0x512c5*4+0x02000000,0x6901); +reg_write( DDR_REG_BASE +0x512c6*4+0x02000000,0x790f); +reg_write( DDR_REG_BASE +0x512c7*4+0x02000000,0x7134); +reg_write( DDR_REG_BASE +0x512c8*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x512c9*4+0x02000000,0x7002); +reg_write( DDR_REG_BASE +0x512ca*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x512cb*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE +0x512cc*4+0x02000000,0x4e6); +reg_write( DDR_REG_BASE +0x512cd*4+0x02000000,0xffce); +reg_write( DDR_REG_BASE +0x512ce*4+0x02000000,0xe7e); +reg_write( DDR_REG_BASE +0x512cf*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE +0x512d0*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE +0x512d1*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE +0x512d2*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x512d3*4+0x02000000,0x7344); +reg_write( DDR_REG_BASE +0x512d4*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x512d5*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE +0x512d6*4+0x02000000,0xe8a); +reg_write( DDR_REG_BASE +0x512d7*4+0x02000000,0xc0); +reg_write( DDR_REG_BASE +0x512d8*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x512d9*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x512da*4+0x02000000,0xe174); +reg_write( DDR_REG_BASE +0x512db*4+0x02000000,0xb0a0); +reg_write( DDR_REG_BASE +0x512dc*4+0x02000000,0xf32); +reg_write( DDR_REG_BASE +0x512dd*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE +0x512de*4+0x02000000,0xb0a1); +reg_write( DDR_REG_BASE +0x512df*4+0x02000000,0x2480); +reg_write( DDR_REG_BASE +0x512e0*4+0x02000000,0x330f); +reg_write( DDR_REG_BASE +0x512e1*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE +0x512e2*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE +0x512e3*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE +0x512e4*4+0x02000000,0xc2e4); +reg_write( DDR_REG_BASE +0x512e5*4+0x02000000,0xc1a4); +reg_write( DDR_REG_BASE +0x512e6*4+0x02000000,0x4608); +reg_write( DDR_REG_BASE +0x512e7*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x512e8*4+0x02000000,0xe42); +reg_write( DDR_REG_BASE +0x512e9*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE +0x512ea*4+0x02000000,0xd9ff); +reg_write( DDR_REG_BASE +0x512eb*4+0x02000000,0x1200); +reg_write( DDR_REG_BASE +0x512ec*4+0x02000000,0x3083); +reg_write( DDR_REG_BASE +0x512ed*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x512ee*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x512ef*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE +0x512f0*4+0x02000000,0x4528); +reg_write( DDR_REG_BASE +0x512f1*4+0x02000000,0xc143); +reg_write( DDR_REG_BASE +0x512f2*4+0x02000000,0xc142); +reg_write( DDR_REG_BASE +0x512f3*4+0x02000000,0xc141); +reg_write( DDR_REG_BASE +0x512f4*4+0x02000000,0xf02); +reg_write( DDR_REG_BASE +0x512f5*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE +0x512f6*4+0x02000000,0xc140); +reg_write( DDR_REG_BASE +0x512f7*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x512f8*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE +0x512f9*4+0x02000000,0x764c); +reg_write( DDR_REG_BASE +0x512fa*4+0x02000000,0xdb20); +reg_write( DDR_REG_BASE +0x512fb*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE +0x512fc*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE +0x512fd*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE +0x512fe*4+0x02000000,0xeee); +reg_write( DDR_REG_BASE +0x512ff*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE +0x51300*4+0x02000000,0x1c00); +reg_write( DDR_REG_BASE +0x51301*4+0x02000000,0x3041); +reg_write( DDR_REG_BASE +0x51302*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x51303*4+0x02000000,0xea6); +reg_write( DDR_REG_BASE +0x51304*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE +0x51305*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x51306*4+0x02000000,0xc0a4); +reg_write( DDR_REG_BASE +0x51307*4+0x02000000,0xc6c4); +reg_write( DDR_REG_BASE +0x51308*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE +0x51309*4+0x02000000,0xc1a4); +reg_write( DDR_REG_BASE +0x5130a*4+0x02000000,0xd849); +reg_write( DDR_REG_BASE +0x5130b*4+0x02000000,0xb89f); +reg_write( DDR_REG_BASE +0x5130c*4+0x02000000,0x88e0); +reg_write( DDR_REG_BASE +0x5130d*4+0x02000000,0x10da); +reg_write( DDR_REG_BASE +0x5130e*4+0x02000000,0x808e); +reg_write( DDR_REG_BASE +0x5130f*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x51310*4+0x02000000,0xdf2); +reg_write( DDR_REG_BASE +0x51311*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE +0x51312*4+0x02000000,0xd9ff); +reg_write( DDR_REG_BASE +0x51313*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x51314*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x51315*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE +0x51316*4+0x02000000,0x736c); +reg_write( DDR_REG_BASE +0x51317*4+0x02000000,0x4528); +reg_write( DDR_REG_BASE +0x51318*4+0x02000000,0xc143); +reg_write( DDR_REG_BASE +0x51319*4+0x02000000,0xc142); +reg_write( DDR_REG_BASE +0x5131a*4+0x02000000,0xc141); +reg_write( DDR_REG_BASE +0x5131b*4+0x02000000,0xeb6); +reg_write( DDR_REG_BASE +0x5131c*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE +0x5131d*4+0x02000000,0xc140); +reg_write( DDR_REG_BASE +0x5131e*4+0x02000000,0x7ee5); +reg_write( DDR_REG_BASE +0x5131f*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x51320*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE +0x51321*4+0x02000000,0xda09); +reg_write( DDR_REG_BASE +0x51322*4+0x02000000,0xdb20); +reg_write( DDR_REG_BASE +0x51323*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE +0x51324*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE +0x51325*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE +0x51326*4+0x02000000,0xe9e); +reg_write( DDR_REG_BASE +0x51327*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE +0x51328*4+0x02000000,0x1c00); +reg_write( DDR_REG_BASE +0x51329*4+0x02000000,0x3041); +reg_write( DDR_REG_BASE +0x5132a*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x5132b*4+0x02000000,0xe56); +reg_write( DDR_REG_BASE +0x5132c*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE +0x5132d*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x5132e*4+0x02000000,0xc0a4); +reg_write( DDR_REG_BASE +0x5132f*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE +0x51330*4+0x02000000,0x21aa); +reg_write( DDR_REG_BASE +0x51331*4+0x02000000,0xc4); +reg_write( DDR_REG_BASE +0x51332*4+0x02000000,0x911); +reg_write( DDR_REG_BASE +0x51333*4+0x02000000,0x3f); +reg_write( DDR_REG_BASE +0x51334*4+0x02000000,0x722c); +reg_write( DDR_REG_BASE +0x51335*4+0x02000000,0x21ab); +reg_write( DDR_REG_BASE +0x51336*4+0x02000000,0xc4); +reg_write( DDR_REG_BASE +0x51337*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x51338*4+0x02000000,0x21ab); +reg_write( DDR_REG_BASE +0x51339*4+0x02000000,0xc4); +reg_write( DDR_REG_BASE +0x5133a*4+0x02000000,0x80f); +reg_write( DDR_REG_BASE +0x5133b*4+0x02000000,0x415); +reg_write( DDR_REG_BASE +0x5133c*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x5133d*4+0x02000000,0x7100); +reg_write( DDR_REG_BASE +0x5133e*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE +0x5133f*4+0x02000000,0x1d6); +reg_write( DDR_REG_BASE +0x51340*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE +0x51341*4+0x02000000,0x21aa); +reg_write( DDR_REG_BASE +0x51342*4+0x02000000,0x104); +reg_write( DDR_REG_BASE +0x51343*4+0x02000000,0x7b32); +reg_write( DDR_REG_BASE +0x51344*4+0x02000000,0xb19); +reg_write( DDR_REG_BASE +0x51345*4+0x02000000,0x25); +reg_write( DDR_REG_BASE +0x51346*4+0x02000000,0x24aa); +reg_write( DDR_REG_BASE +0x51347*4+0x02000000,0x1144); +reg_write( DDR_REG_BASE +0x51348*4+0x02000000,0x22aa); +reg_write( DDR_REG_BASE +0x51349*4+0x02000000,0x104); +reg_write( DDR_REG_BASE +0x5134a*4+0x02000000,0x9fd); +reg_write( DDR_REG_BASE +0x5134b*4+0x02000000,0x8084); +reg_write( DDR_REG_BASE +0x5134c*4+0x02000000,0x7862); +reg_write( DDR_REG_BASE +0x5134d*4+0x02000000,0x24aa); +reg_write( DDR_REG_BASE +0x5134e*4+0x02000000,0x1144); +reg_write( DDR_REG_BASE +0x5134f*4+0x02000000,0xf003); +reg_write( DDR_REG_BASE +0x51350*4+0x02000000,0x6038); +reg_write( DDR_REG_BASE +0x51351*4+0x02000000,0x21aa); +reg_write( DDR_REG_BASE +0x51352*4+0x02000000,0x104); +reg_write( DDR_REG_BASE +0x51353*4+0x02000000,0x7110); +reg_write( DDR_REG_BASE +0x51354*4+0x02000000,0x20e1); +reg_write( DDR_REG_BASE +0x51355*4+0x02000000,0x7c6); +reg_write( DDR_REG_BASE +0x51356*4+0x02000000,0x22aa); +reg_write( DDR_REG_BASE +0x51357*4+0x02000000,0x144); +reg_write( DDR_REG_BASE +0x51358*4+0x02000000,0xcf3); +reg_write( DDR_REG_BASE +0x51359*4+0x02000000,0x9080); +reg_write( DDR_REG_BASE +0x5135a*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE +0x5135b*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x5135c*4+0x02000000,0xc0f1); +reg_write( DDR_REG_BASE +0x5135d*4+0x02000000,0x822); +reg_write( DDR_REG_BASE +0x5135e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5135f*4+0x02000000,0xfa6); +reg_write( DDR_REG_BASE +0x51360*4+0x02000000,0xffcf); +reg_write( DDR_REG_BASE +0x51361*4+0x02000000,0xc0d1); +reg_write( DDR_REG_BASE +0x51362*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE +0x51363*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x51364*4+0x02000000,0xc0f1); +reg_write( DDR_REG_BASE +0x51365*4+0x02000000,0xf4a); +reg_write( DDR_REG_BASE +0x51366*4+0x02000000,0xffcf); +reg_write( DDR_REG_BASE +0x51367*4+0x02000000,0xf96); +reg_write( DDR_REG_BASE +0x51368*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE +0x51369*4+0x02000000,0xd814); +reg_write( DDR_REG_BASE +0x5136a*4+0x02000000,0xc0d1); +reg_write( DDR_REG_BASE +0x5136b*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE +0x5136c*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x5136d*4+0x02000000,0x7103); +reg_write( DDR_REG_BASE +0x5136e*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x5136f*4+0x02000000,0x6); +reg_write( DDR_REG_BASE +0x51370*4+0x02000000,0x231a); +reg_write( DDR_REG_BASE +0x51371*4+0x02000000,0x2); +reg_write( DDR_REG_BASE +0x51372*4+0x02000000,0x2a05); +reg_write( DDR_REG_BASE +0x51373*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE +0x51374*4+0x02000000,0x1e); +reg_write( DDR_REG_BASE +0x51375*4+0x02000000,0x8480); +reg_write( DDR_REG_BASE +0x51376*4+0x02000000,0x815); +reg_write( DDR_REG_BASE +0x51377*4+0x02000000,0xf84); +reg_write( DDR_REG_BASE +0x51378*4+0x02000000,0x3); +reg_write( DDR_REG_BASE +0x51379*4+0x02000000,0xd41); +reg_write( DDR_REG_BASE +0x5137a*4+0x02000000,0x2885); +reg_write( DDR_REG_BASE +0x5137b*4+0x02000000,0xa0f); +reg_write( DDR_REG_BASE +0x5137c*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE +0x5137d*4+0x02000000,0xc2); +reg_write( DDR_REG_BASE +0x5137e*4+0x02000000,0x2a85); +reg_write( DDR_REG_BASE +0x5137f*4+0x02000000,0x41f); +reg_write( DDR_REG_BASE +0x51380*4+0x02000000,0x783d); +reg_write( DDR_REG_BASE +0x51381*4+0x02000000,0x7050); +reg_write( DDR_REG_BASE +0x51382*4+0x02000000,0x22ca); +reg_write( DDR_REG_BASE +0x51383*4+0x02000000,0xd); +reg_write( DDR_REG_BASE +0x51384*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE +0x51385*4+0x02000000,0x6a01); +reg_write( DDR_REG_BASE +0x51386*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE +0x51387*4+0x02000000,0xa7e); +reg_write( DDR_REG_BASE +0x51388*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE +0x51389*4+0x02000000,0xc1a4); +reg_write( DDR_REG_BASE +0x5138a*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x5138b*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x5138c*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x5138d*4+0x02000000,0x791d); +reg_write( DDR_REG_BASE +0x5138e*4+0x02000000,0xb9c3); +reg_write( DDR_REG_BASE +0x5138f*4+0x02000000,0xdd49); +reg_write( DDR_REG_BASE +0x51390*4+0x02000000,0x1a02); +reg_write( DDR_REG_BASE +0x51391*4+0x02000000,0x3042); +reg_write( DDR_REG_BASE +0x51392*4+0x02000000,0xbd9f); +reg_write( DDR_REG_BASE +0x51393*4+0x02000000,0x8d00); +reg_write( DDR_REG_BASE +0x51394*4+0x02000000,0xe80b); +reg_write( DDR_REG_BASE +0x51395*4+0x02000000,0x215f); +reg_write( DDR_REG_BASE +0x51396*4+0x02000000,0x100); +reg_write( DDR_REG_BASE +0x51397*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x51398*4+0x02000000,0x7082); +reg_write( DDR_REG_BASE +0x51399*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x5139a*4+0x02000000,0x48); +reg_write( DDR_REG_BASE +0x5139b*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE +0x5139c*4+0x02000000,0xe00); +reg_write( DDR_REG_BASE +0x5139d*4+0x02000000,0x621e); +reg_write( DDR_REG_BASE +0x5139e*4+0x02000000,0xf005); +reg_write( DDR_REG_BASE +0x5139f*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x513a0*4+0x02000000,0x708e); +reg_write( DDR_REG_BASE +0x513a1*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x513a2*4+0x02000000,0x22); +reg_write( DDR_REG_BASE +0x513a3*4+0x02000000,0xa46); +reg_write( DDR_REG_BASE +0x513a4*4+0x02000000,0xff8f); +reg_write( DDR_REG_BASE +0x513a5*4+0x02000000,0x79cf); +reg_write( DDR_REG_BASE +0x513a6*4+0x02000000,0x7b3d); +reg_write( DDR_REG_BASE +0x513a7*4+0x02000000,0x7a3d); +reg_write( DDR_REG_BASE +0x513a8*4+0x02000000,0x2653); +reg_write( DDR_REG_BASE +0x513a9*4+0x02000000,0x907e); +reg_write( DDR_REG_BASE +0x513aa*4+0x02000000,0x7b7d); +reg_write( DDR_REG_BASE +0x513ab*4+0x02000000,0x7a5d); +reg_write( DDR_REG_BASE +0x513ac*4+0x02000000,0x23c0); +reg_write( DDR_REG_BASE +0x513ad*4+0x02000000,0x62); +reg_write( DDR_REG_BASE +0x513ae*4+0x02000000,0x7a5d); +reg_write( DDR_REG_BASE +0x513af*4+0x02000000,0x2653); +reg_write( DDR_REG_BASE +0x513b0*4+0x02000000,0x9081); +reg_write( DDR_REG_BASE +0x513b1*4+0x02000000,0xb8c3); +reg_write( DDR_REG_BASE +0x513b2*4+0x02000000,0x22c0); +reg_write( DDR_REG_BASE +0x513b3*4+0x02000000,0x62); +reg_write( DDR_REG_BASE +0x513b4*4+0x02000000,0x1a03); +reg_write( DDR_REG_BASE +0x513b5*4+0x02000000,0x3002); +reg_write( DDR_REG_BASE +0x513b6*4+0x02000000,0x1a05); +reg_write( DDR_REG_BASE +0x513b7*4+0x02000000,0x30c2); +reg_write( DDR_REG_BASE +0x513b8*4+0x02000000,0x1a07); +reg_write( DDR_REG_BASE +0x513b9*4+0x02000000,0x3042); +reg_write( DDR_REG_BASE +0x513ba*4+0x02000000,0x1a04); +reg_write( DDR_REG_BASE +0x513bb*4+0x02000000,0x3082); +reg_write( DDR_REG_BASE +0x513bc*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE +0x513bd*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x513be*4+0x02000000,0x53); +reg_write( DDR_REG_BASE +0x513bf*4+0x02000000,0x3); +reg_write( DDR_REG_BASE +0x513c0*4+0x02000000,0x8e2); +reg_write( DDR_REG_BASE +0x513c1*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE +0x513c2*4+0x02000000,0xd80a); +reg_write( DDR_REG_BASE +0x513c3*4+0x02000000,0x216f); +reg_write( DDR_REG_BASE +0x513c4*4+0x02000000,0xc3); +reg_write( DDR_REG_BASE +0x513c5*4+0x02000000,0x8900); +reg_write( DDR_REG_BASE +0x513c6*4+0x02000000,0xb8e2); +reg_write( DDR_REG_BASE +0x513c7*4+0x02000000,0xd87f); +reg_write( DDR_REG_BASE +0x513c8*4+0x02000000,0x20ca); +reg_write( DDR_REG_BASE +0x513c9*4+0x02000000,0x1e2); +reg_write( DDR_REG_BASE +0x513ca*4+0x02000000,0x1a08); +reg_write( DDR_REG_BASE +0x513cb*4+0x02000000,0x3002); +reg_write( DDR_REG_BASE +0x513cc*4+0x02000000,0x1122); +reg_write( DDR_REG_BASE +0x513cd*4+0x02000000,0x48f); +reg_write( DDR_REG_BASE +0x513ce*4+0x02000000,0x8d60); +reg_write( DDR_REG_BASE +0x513cf*4+0x02000000,0x4528); +reg_write( DDR_REG_BASE +0x513d0*4+0x02000000,0x2142); +reg_write( DDR_REG_BASE +0x513d1*4+0x02000000,0x4c0); +reg_write( DDR_REG_BASE +0x513d2*4+0x02000000,0x2142); +reg_write( DDR_REG_BASE +0x513d3*4+0x02000000,0x74e); +reg_write( DDR_REG_BASE +0x513d4*4+0x02000000,0x150e); +reg_write( DDR_REG_BASE +0x513d5*4+0x02000000,0x148b); +reg_write( DDR_REG_BASE +0x513d6*4+0x02000000,0x9080); +reg_write( DDR_REG_BASE +0x513d7*4+0x02000000,0x8842); +reg_write( DDR_REG_BASE +0x513d8*4+0x02000000,0x9600); +reg_write( DDR_REG_BASE +0x513d9*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x513da*4+0x02000000,0x54); +reg_write( DDR_REG_BASE +0x513db*4+0x02000000,0x6); +reg_write( DDR_REG_BASE +0x513dc*4+0x02000000,0xc241); +reg_write( DDR_REG_BASE +0x513dd*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE +0x513de*4+0x02000000,0xd80a); +reg_write( DDR_REG_BASE +0x513df*4+0x02000000,0x4261); +reg_write( DDR_REG_BASE +0x513e0*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE +0x513e1*4+0x02000000,0x8a2); +reg_write( DDR_REG_BASE +0x513e2*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE +0x513e3*4+0x02000000,0xc440); +reg_write( DDR_REG_BASE +0x513e4*4+0x02000000,0x1501); +reg_write( DDR_REG_BASE +0x513e5*4+0x02000000,0x1483); +reg_write( DDR_REG_BASE +0x513e6*4+0x02000000,0x8d21); +reg_write( DDR_REG_BASE +0x513e7*4+0x02000000,0x8d03); +reg_write( DDR_REG_BASE +0x513e8*4+0x02000000,0x16fe); +reg_write( DDR_REG_BASE +0x513e9*4+0x02000000,0x9082); +reg_write( DDR_REG_BASE +0x513ea*4+0x02000000,0x8d80); +reg_write( DDR_REG_BASE +0x513eb*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE +0x513ec*4+0x02000000,0xc141); +reg_write( DDR_REG_BASE +0x513ed*4+0x02000000,0xd80a); +reg_write( DDR_REG_BASE +0x513ee*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x513ef*4+0x02000000,0x59); +reg_write( DDR_REG_BASE +0x513f0*4+0x02000000,0x5); +reg_write( DDR_REG_BASE +0x513f1*4+0x02000000,0x882); +reg_write( DDR_REG_BASE +0x513f2*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE +0x513f3*4+0x02000000,0xc440); +reg_write( DDR_REG_BASE +0x513f4*4+0x02000000,0x706c); +reg_write( DDR_REG_BASE +0x513f5*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE +0x513f6*4+0x02000000,0xf01f); +reg_write( DDR_REG_BASE +0x513f7*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x513f8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x513f9*4+0x02000000,0x3000); +reg_write( DDR_REG_BASE +0x513fa*4+0x02000000,0xf212); +reg_write( DDR_REG_BASE +0x513fb*4+0x02000000,0x221a); +reg_write( DDR_REG_BASE +0x513fc*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x513fd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x513fe*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE +0x513ff*4+0x02000000,0x2244); +reg_write( DDR_REG_BASE +0x51400*4+0x02000000,0x7cc); +reg_write( DDR_REG_BASE +0x51401*4+0x02000000,0x200f); +reg_write( DDR_REG_BASE +0x51402*4+0x02000000,0x81); +reg_write( DDR_REG_BASE +0x51403*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE +0x51404*4+0x02000000,0xec05); +reg_write( DDR_REG_BASE +0x51405*4+0x02000000,0xbc61); +reg_write( DDR_REG_BASE +0x51406*4+0x02000000,0xcff); +reg_write( DDR_REG_BASE +0x51407*4+0x02000000,0x9031); +reg_write( DDR_REG_BASE +0x51408*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE +0x51409*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE +0x5140a*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x5140b*4+0x02000000,0x7905); +reg_write( DDR_REG_BASE +0x5140c*4+0x02000000,0x785b); +reg_write( DDR_REG_BASE +0x5140d*4+0x02000000,0x2056); +reg_write( DDR_REG_BASE +0x5140e*4+0x02000000,0xd00); +reg_write( DDR_REG_BASE +0x5140f*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x51410*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x51411*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE +0x51412*4+0x02000000,0xe000); +reg_write( DDR_REG_BASE +0x51413*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE +0x51414*4+0x02000000,0x7144); +reg_write( DDR_REG_BASE +0x51415*4+0x02000000,0x7354); +reg_write( DDR_REG_BASE +0x51416*4+0x02000000,0xf7e1); +reg_write( DDR_REG_BASE +0x51417*4+0x02000000,0xf00b); +reg_write( DDR_REG_BASE +0x51418*4+0x02000000,0x2056); +reg_write( DDR_REG_BASE +0x51419*4+0x02000000,0xe00); +reg_write( DDR_REG_BASE +0x5141a*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x5141b*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x5141c*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE +0x5141d*4+0x02000000,0xe000); +reg_write( DDR_REG_BASE +0x5141e*4+0x02000000,0x7164); +reg_write( DDR_REG_BASE +0x5141f*4+0x02000000,0x1800); +reg_write( DDR_REG_BASE +0x51420*4+0x02000000,0x3c5); +reg_write( DDR_REG_BASE +0x51421*4+0x02000000,0xbf1); +reg_write( DDR_REG_BASE +0x51422*4+0x02000000,0x80b4); +reg_write( DDR_REG_BASE +0x51423*4+0x02000000,0x787b); +reg_write( DDR_REG_BASE +0x51424*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x51425*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x51426*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE +0x51427*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE +0x51428*4+0x02000000,0xe1c4); +reg_write( DDR_REG_BASE +0x51429*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE +0x5142a*4+0x02000000,0xf00a); +reg_write( DDR_REG_BASE +0x5142b*4+0x02000000,0x2156); +reg_write( DDR_REG_BASE +0x5142c*4+0x02000000,0xe01); +reg_write( DDR_REG_BASE +0x5142d*4+0x02000000,0x2105); +reg_write( DDR_REG_BASE +0x5142e*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE +0x5142f*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE +0x51430*4+0x02000000,0xe000); +reg_write( DDR_REG_BASE +0x51431*4+0x02000000,0x1900); +reg_write( DDR_REG_BASE +0x51432*4+0x02000000,0x5); +reg_write( DDR_REG_BASE +0x51433*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE +0x51434*4+0x02000000,0x8ef); +reg_write( DDR_REG_BASE +0x51435*4+0x02000000,0x8234); +reg_write( DDR_REG_BASE +0x51436*4+0x02000000,0x791b); +reg_write( DDR_REG_BASE +0x51437*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE +0x51438*4+0x02000000,0x3cc); +reg_write( DDR_REG_BASE +0x51439*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x5143a*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE +0x5143b*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE +0x5143c*4+0x02000000,0xe180); +reg_write( DDR_REG_BASE +0x5143d*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x5143e*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE +0x5143f*4+0x02000000,0xe0ee); +reg_write( DDR_REG_BASE +0x51440*4+0x02000000,0x1800); +reg_write( DDR_REG_BASE +0x51441*4+0x02000000,0x45); +reg_write( DDR_REG_BASE +0x51442*4+0x02000000,0xe46); +reg_write( DDR_REG_BASE +0x51443*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE +0x51444*4+0x02000000,0x18fc); +reg_write( DDR_REG_BASE +0x51445*4+0x02000000,0x8045); +reg_write( DDR_REG_BASE +0x51446*4+0x02000000,0xc0a4); +reg_write( DDR_REG_BASE +0x51447*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE +0x51448*4+0x02000000,0x621a); +reg_write( DDR_REG_BASE +0x51449*4+0x02000000,0xf004); +reg_write( DDR_REG_BASE +0x5144a*4+0x02000000,0x1801); +reg_write( DDR_REG_BASE +0x5144b*4+0x02000000,0x52); +reg_write( DDR_REG_BASE +0x5144c*4+0x02000000,0x8fd); +reg_write( DDR_REG_BASE +0x5144d*4+0x02000000,0x8084); +reg_write( DDR_REG_BASE +0x5144e*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE +0x5144f*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x51450*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE +0x51451*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE +0x51452*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE +0x51453*4+0x02000000,0xc1a7); +reg_write( DDR_REG_BASE +0x51454*4+0x02000000,0xda07); +reg_write( DDR_REG_BASE +0x51455*4+0x02000000,0xba8c); +reg_write( DDR_REG_BASE +0x51456*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x51457*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51458*4+0x02000000,0x9f38); +reg_write( DDR_REG_BASE +0x51459*4+0x02000000,0x45cb); +reg_write( DDR_REG_BASE +0x5145a*4+0x02000000,0x9012); +reg_write( DDR_REG_BASE +0x5145b*4+0x02000000,0x328); +reg_write( DDR_REG_BASE +0x5145c*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x5145d*4+0x02000000,0x7084); +reg_write( DDR_REG_BASE +0x5145e*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x5145f*4+0x02000000,0x2); +reg_write( DDR_REG_BASE +0x51460*4+0x02000000,0xb500); +reg_write( DDR_REG_BASE +0x51461*4+0x02000000,0xd858); +reg_write( DDR_REG_BASE +0x51462*4+0x02000000,0xb501); +reg_write( DDR_REG_BASE +0x51463*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x51464*4+0x02000000,0xb7); +reg_write( DDR_REG_BASE +0x51465*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x51466*4+0x02000000,0xf96); +reg_write( DDR_REG_BASE +0x51467*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE +0x51468*4+0x02000000,0xd80a); +reg_write( DDR_REG_BASE +0x51469*4+0x02000000,0xcc1e); +reg_write( DDR_REG_BASE +0x5146a*4+0x02000000,0x9520); +reg_write( DDR_REG_BASE +0x5146b*4+0x02000000,0x7030); +reg_write( DDR_REG_BASE +0x5146c*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x5146d*4+0x02000000,0xf406); +reg_write( DDR_REG_BASE +0x5146e*4+0x02000000,0xcc1f); +reg_write( DDR_REG_BASE +0x5146f*4+0x02000000,0x9521); +reg_write( DDR_REG_BASE +0x51470*4+0x02000000,0x2038); +reg_write( DDR_REG_BASE +0x51471*4+0x02000000,0x40); +reg_write( DDR_REG_BASE +0x51472*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x51473*4+0x02000000,0xb9); +reg_write( DDR_REG_BASE +0x51474*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51475*4+0x02000000,0x806); +reg_write( DDR_REG_BASE +0x51476*4+0x02000000,0xfecf); +reg_write( DDR_REG_BASE +0x51477*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x51478*4+0x02000000,0x7003); +reg_write( DDR_REG_BASE +0x51479*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x5147a*4+0x02000000,0x6b4); +reg_write( DDR_REG_BASE +0x5147b*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x5147c*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE +0x5147d*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x5147e*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x5147f*4+0x02000000,0x1a00); +reg_write( DDR_REG_BASE +0x51480*4+0x02000000,0x3103); +reg_write( DDR_REG_BASE +0x51481*4+0x02000000,0x216f); +reg_write( DDR_REG_BASE +0x51482*4+0x02000000,0x243); +reg_write( DDR_REG_BASE +0x51483*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE +0x51484*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE +0x51485*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x51486*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x51487*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51488*4+0x02000000,0x9126); +reg_write( DDR_REG_BASE +0x51489*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE +0x5148a*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x5148b*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x5148c*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE +0x5148d*4+0x02000000,0x32); +reg_write( DDR_REG_BASE +0x5148e*4+0x02000000,0xc140); +reg_write( DDR_REG_BASE +0x5148f*4+0x02000000,0x9000); +reg_write( DDR_REG_BASE +0x51490*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE +0x51491*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE +0x51492*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x51493*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x51494*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE +0x51495*4+0x02000000,0x40); +reg_write( DDR_REG_BASE +0x51496*4+0x02000000,0x9000); +reg_write( DDR_REG_BASE +0x51497*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE +0x51498*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE +0x51499*4+0x02000000,0xb8e0); +reg_write( DDR_REG_BASE +0x5149a*4+0x02000000,0x214); +reg_write( DDR_REG_BASE +0x5149b*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x5149c*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE +0x5149d*4+0x02000000,0xc103); +reg_write( DDR_REG_BASE +0x5149e*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x5149f*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x514a0*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE +0x514a1*4+0x02000000,0xe032); +reg_write( DDR_REG_BASE +0x514a2*4+0x02000000,0xb980); +reg_write( DDR_REG_BASE +0x514a3*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE +0x514a4*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE +0x514a5*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x514a6*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x514a7*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x514a8*4+0x02000000,0xe090); +reg_write( DDR_REG_BASE +0x514a9*4+0x02000000,0xc46); +reg_write( DDR_REG_BASE +0x514aa*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x514ab*4+0x02000000,0x1800); +reg_write( DDR_REG_BASE +0x514ac*4+0x02000000,0x5); +reg_write( DDR_REG_BASE +0x514ad*4+0x02000000,0xdb6); +reg_write( DDR_REG_BASE +0x514ae*4+0x02000000,0xffcf); +reg_write( DDR_REG_BASE +0x514af*4+0x02000000,0xc92); +reg_write( DDR_REG_BASE +0x514b0*4+0x02000000,0xff8f); +reg_write( DDR_REG_BASE +0x514b1*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x514b2*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE +0x514b3*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x514b4*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x514b5*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x514b6*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE +0x514b7*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x514b8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x514b9*4+0x02000000,0xc046); +reg_write( DDR_REG_BASE +0x514ba*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE +0x514bb*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x514bc*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x514bd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x514be*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE +0x514bf*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x514c0*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x514c1*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE +0x514c2*4+0x02000000,0x86); +reg_write( DDR_REG_BASE +0x514c3*4+0x02000000,0x90a0); +reg_write( DDR_REG_BASE +0x514c4*4+0x02000000,0x78bd); +reg_write( DDR_REG_BASE +0x514c5*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x514c6*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x514c7*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x514c8*4+0x02000000,0xb8c2); +reg_write( DDR_REG_BASE +0x514c9*4+0x02000000,0x827); +reg_write( DDR_REG_BASE +0x514ca*4+0x02000000,0x90); +reg_write( DDR_REG_BASE +0x514cb*4+0x02000000,0x835); +reg_write( DDR_REG_BASE +0x514cc*4+0x02000000,0xf1); +reg_write( DDR_REG_BASE +0x514cd*4+0x02000000,0x218b); +reg_write( DDR_REG_BASE +0x514ce*4+0x02000000,0x803e); +reg_write( DDR_REG_BASE +0x514cf*4+0x02000000,0xce08); +reg_write( DDR_REG_BASE +0x514d0*4+0x02000000,0x47cb); +reg_write( DDR_REG_BASE +0x514d1*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x514d2*4+0x02000000,0x41c); +reg_write( DDR_REG_BASE +0x514d3*4+0x02000000,0x771c); +reg_write( DDR_REG_BASE +0x514d4*4+0x02000000,0x1a03); +reg_write( DDR_REG_BASE +0x514d5*4+0x02000000,0x33d8); +reg_write( DDR_REG_BASE +0x514d6*4+0x02000000,0xce0e); +reg_write( DDR_REG_BASE +0x514d7*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE +0x514d8*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x514d9*4+0x02000000,0x434); +reg_write( DDR_REG_BASE +0x514da*4+0x02000000,0xf017); +reg_write( DDR_REG_BASE +0x514db*4+0x02000000,0x47cb); +reg_write( DDR_REG_BASE +0x514dc*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x514dd*4+0x02000000,0x418); +reg_write( DDR_REG_BASE +0x514de*4+0x02000000,0x1a03); +reg_write( DDR_REG_BASE +0x514df*4+0x02000000,0x33d8); +reg_write( DDR_REG_BASE +0x514e0*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE +0x514e1*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x514e2*4+0x02000000,0x430); +reg_write( DDR_REG_BASE +0x514e3*4+0x02000000,0xf010); +reg_write( DDR_REG_BASE +0x514e4*4+0x02000000,0x218b); +reg_write( DDR_REG_BASE +0x514e5*4+0x02000000,0x803e); +reg_write( DDR_REG_BASE +0x514e6*4+0x02000000,0xce05); +reg_write( DDR_REG_BASE +0x514e7*4+0x02000000,0x47cb); +reg_write( DDR_REG_BASE +0x514e8*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x514e9*4+0x02000000,0x410); +reg_write( DDR_REG_BASE +0x514ea*4+0x02000000,0x771c); +reg_write( DDR_REG_BASE +0x514eb*4+0x02000000,0xce0b); +reg_write( DDR_REG_BASE +0x514ec*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE +0x514ed*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x514ee*4+0x02000000,0x428); +reg_write( DDR_REG_BASE +0x514ef*4+0x02000000,0x1a03); +reg_write( DDR_REG_BASE +0x514f0*4+0x02000000,0x33d8); +reg_write( DDR_REG_BASE +0x514f1*4+0x02000000,0x761c); +reg_write( DDR_REG_BASE +0x514f2*4+0x02000000,0x1a09); +reg_write( DDR_REG_BASE +0x514f3*4+0x02000000,0x3398); +reg_write( DDR_REG_BASE +0x514f4*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x514f5*4+0x02000000,0x7082); +reg_write( DDR_REG_BASE +0x514f6*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x514f7*4+0x02000000,0xc); +reg_write( DDR_REG_BASE +0x514f8*4+0x02000000,0x218b); +reg_write( DDR_REG_BASE +0x514f9*4+0x02000000,0x803e); +reg_write( DDR_REG_BASE +0x514fa*4+0x02000000,0x221a); +reg_write( DDR_REG_BASE +0x514fb*4+0x02000000,0xf9b); +reg_write( DDR_REG_BASE +0x514fc*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x514fd*4+0x02000000,0x86a0); +reg_write( DDR_REG_BASE +0x514fe*4+0x02000000,0xf20a); +reg_write( DDR_REG_BASE +0x514ff*4+0x02000000,0x233c); +reg_write( DDR_REG_BASE +0x51500*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE +0x51501*4+0x02000000,0x79); +reg_write( DDR_REG_BASE +0x51502*4+0x02000000,0xae00); +reg_write( DDR_REG_BASE +0x51503*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x51504*4+0x02000000,0x142); +reg_write( DDR_REG_BASE +0x51505*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x51506*4+0x02000000,0xee2); +reg_write( DDR_REG_BASE +0x51507*4+0x02000000,0xfe8f); +reg_write( DDR_REG_BASE +0x51508*4+0x02000000,0x222f); +reg_write( DDR_REG_BASE +0x51509*4+0x02000000,0x6c2); +reg_write( DDR_REG_BASE +0x5150a*4+0x02000000,0x7a5d); +reg_write( DDR_REG_BASE +0x5150b*4+0x02000000,0x7a5d); +reg_write( DDR_REG_BASE +0x5150c*4+0x02000000,0x7a5d); +reg_write( DDR_REG_BASE +0x5150d*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE +0x5150e*4+0x02000000,0x7a5d); +reg_write( DDR_REG_BASE +0x5150f*4+0x02000000,0x7a5d); +reg_write( DDR_REG_BASE +0x51510*4+0x02000000,0x7a5d); +reg_write( DDR_REG_BASE +0x51511*4+0x02000000,0xe894); +reg_write( DDR_REG_BASE +0x51512*4+0x02000000,0x2544); +reg_write( DDR_REG_BASE +0x51513*4+0x02000000,0x1080); +reg_write( DDR_REG_BASE +0x51514*4+0x02000000,0x6711); +reg_write( DDR_REG_BASE +0x51515*4+0x02000000,0x6610); +reg_write( DDR_REG_BASE +0x51516*4+0x02000000,0x4a10); +reg_write( DDR_REG_BASE +0x51517*4+0x02000000,0x2048); +reg_write( DDR_REG_BASE +0x51518*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51519*4+0x02000000,0x2805); +reg_write( DDR_REG_BASE +0x5151a*4+0x02000000,0x40); +reg_write( DDR_REG_BASE +0x5151b*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x5151c*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x5151d*4+0x02000000,0xfe80); +reg_write( DDR_REG_BASE +0x5151e*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE +0x5151f*4+0x02000000,0x2089); +reg_write( DDR_REG_BASE +0x51520*4+0x02000000,0xfc1); +reg_write( DDR_REG_BASE +0x51521*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE +0x51522*4+0x02000000,0x19e0); +reg_write( DDR_REG_BASE +0x51523*4+0x02000000,0x8004); +reg_write( DDR_REG_BASE +0x51524*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE +0x51525*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE +0x51526*4+0x02000000,0xf8d); +reg_write( DDR_REG_BASE +0x51527*4+0x02000000,0x10); +reg_write( DDR_REG_BASE +0x51528*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51529*4+0x02000000,0x2b05); +reg_write( DDR_REG_BASE +0x5152a*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE +0x5152b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5152c*4+0x02000000,0xfa00); +reg_write( DDR_REG_BASE +0x5152d*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE +0x5152e*4+0x02000000,0x81f); +reg_write( DDR_REG_BASE +0x5152f*4+0x02000000,0x1fe); +reg_write( DDR_REG_BASE +0x51530*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE +0x51531*4+0x02000000,0x2200); +reg_write( DDR_REG_BASE +0x51532*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x51533*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE +0x51534*4+0x02000000,0x793c); +reg_write( DDR_REG_BASE +0x51535*4+0x02000000,0x208c); +reg_write( DDR_REG_BASE +0x51536*4+0x02000000,0x8d47); +reg_write( DDR_REG_BASE +0x51537*4+0x02000000,0x706c); +reg_write( DDR_REG_BASE +0x51538*4+0x02000000,0xf684); +reg_write( DDR_REG_BASE +0x51539*4+0x02000000,0x2885); +reg_write( DDR_REG_BASE +0x5153a*4+0x02000000,0xd07); +reg_write( DDR_REG_BASE +0x5153b*4+0x02000000,0xf003); +reg_write( DDR_REG_BASE +0x5153c*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE +0x5153d*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE +0x5153e*4+0x02000000,0x2089); +reg_write( DDR_REG_BASE +0x5153f*4+0x02000000,0xfc1); +reg_write( DDR_REG_BASE +0x51540*4+0x02000000,0x205a); +reg_write( DDR_REG_BASE +0x51541*4+0x02000000,0x200); +reg_write( DDR_REG_BASE +0x51542*4+0x02000000,0xc105); +reg_write( DDR_REG_BASE +0x51543*4+0x02000000,0x2105); +reg_write( DDR_REG_BASE +0x51544*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE +0x51545*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE +0x51546*4+0x02000000,0xe164); +reg_write( DDR_REG_BASE +0x51547*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x51548*4+0x02000000,0xc1); +reg_write( DDR_REG_BASE +0x51549*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x5154a*4+0x02000000,0x7100); +reg_write( DDR_REG_BASE +0x5154b*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE +0x5154c*4+0x02000000,0x164); +reg_write( DDR_REG_BASE +0x5154d*4+0x02000000,0xb8c1); +reg_write( DDR_REG_BASE +0x5154e*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE +0x5154f*4+0x02000000,0xb200); +reg_write( DDR_REG_BASE +0x51550*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE +0x51551*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x51552*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x51553*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE +0x51554*4+0x02000000,0x86); +reg_write( DDR_REG_BASE +0x51555*4+0x02000000,0x88a); +reg_write( DDR_REG_BASE +0x51556*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE +0x51557*4+0x02000000,0x90c0); +reg_write( DDR_REG_BASE +0x51558*4+0x02000000,0x81a); +reg_write( DDR_REG_BASE +0x51559*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE +0x5155a*4+0x02000000,0x40a1); +reg_write( DDR_REG_BASE +0x5155b*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE +0x5155c*4+0x02000000,0xbe80); +reg_write( DDR_REG_BASE +0x5155d*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x5155e*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x5155f*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x51560*4+0x02000000,0xfe86); +reg_write( DDR_REG_BASE +0x51561*4+0x02000000,0xaf6); +reg_write( DDR_REG_BASE +0x51562*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x51563*4+0x02000000,0xb0c0); +reg_write( DDR_REG_BASE +0x51564*4+0x02000000,0xd42); +reg_write( DDR_REG_BASE +0x51565*4+0x02000000,0xff8f); +reg_write( DDR_REG_BASE +0x51566*4+0x02000000,0xca04); +reg_write( DDR_REG_BASE +0x51567*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE +0x51568*4+0x02000000,0x708d); +reg_write( DDR_REG_BASE +0x51569*4+0x02000000,0xf034); +reg_write( DDR_REG_BASE +0x5156a*4+0x02000000,0x245a); +reg_write( DDR_REG_BASE +0x5156b*4+0x02000000,0x149e); +reg_write( DDR_REG_BASE +0x5156c*4+0x02000000,0x2600); +reg_write( DDR_REG_BASE +0x5156d*4+0x02000000,0x3f83); +reg_write( DDR_REG_BASE +0x5156e*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x5156f*4+0x02000000,0x6b4); +reg_write( DDR_REG_BASE +0x51570*4+0x02000000,0xb341); +reg_write( DDR_REG_BASE +0x51571*4+0x02000000,0xf029); +reg_write( DDR_REG_BASE +0x51572*4+0x02000000,0x241a); +reg_write( DDR_REG_BASE +0x51573*4+0x02000000,0x1f81); +reg_write( DDR_REG_BASE +0x51574*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51575*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE +0x51576*4+0x02000000,0x79a5); +reg_write( DDR_REG_BASE +0x51577*4+0x02000000,0x793b); +reg_write( DDR_REG_BASE +0x51578*4+0x02000000,0x2105); +reg_write( DDR_REG_BASE +0x51579*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE +0x5157a*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE +0x5157b*4+0x02000000,0x140); +reg_write( DDR_REG_BASE +0x5157c*4+0x02000000,0x9120); +reg_write( DDR_REG_BASE +0x5157d*4+0x02000000,0x7e2f); +reg_write( DDR_REG_BASE +0x5157e*4+0x02000000,0xd11); +reg_write( DDR_REG_BASE +0x5157f*4+0x02000000,0x13a1); +reg_write( DDR_REG_BASE +0x51580*4+0x02000000,0xbec4); +reg_write( DDR_REG_BASE +0x51581*4+0x02000000,0x8b22); +reg_write( DDR_REG_BASE +0x51582*4+0x02000000,0x210f); +reg_write( DDR_REG_BASE +0x51583*4+0x02000000,0x341); +reg_write( DDR_REG_BASE +0x51584*4+0x02000000,0xab22); +reg_write( DDR_REG_BASE +0x51585*4+0x02000000,0xf014); +reg_write( DDR_REG_BASE +0x51586*4+0x02000000,0x8b23); +reg_write( DDR_REG_BASE +0x51587*4+0x02000000,0x7124); +reg_write( DDR_REG_BASE +0x51588*4+0x02000000,0xab23); +reg_write( DDR_REG_BASE +0x51589*4+0x02000000,0x792f); +reg_write( DDR_REG_BASE +0x5158a*4+0x02000000,0x2614); +reg_write( DDR_REG_BASE +0x5158b*4+0x02000000,0x3041); +reg_write( DDR_REG_BASE +0x5158c*4+0x02000000,0x2100); +reg_write( DDR_REG_BASE +0x5158d*4+0x02000000,0xf8f); +reg_write( DDR_REG_BASE +0x5158e*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x5158f*4+0x02000000,0x6b4); +reg_write( DDR_REG_BASE +0x51590*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x51591*4+0x02000000,0xafa3); +reg_write( DDR_REG_BASE +0x51592*4+0x02000000,0xee05); +reg_write( DDR_REG_BASE +0x51593*4+0x02000000,0xbe61); +reg_write( DDR_REG_BASE +0x51594*4+0x02000000,0xeff); +reg_write( DDR_REG_BASE +0x51595*4+0x02000000,0x9031); +reg_write( DDR_REG_BASE +0x51596*4+0x02000000,0x793b); +reg_write( DDR_REG_BASE +0x51597*4+0x02000000,0xaf22); +reg_write( DDR_REG_BASE +0x51598*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE +0x51599*4+0x02000000,0xdb5); +reg_write( DDR_REG_BASE +0x5159a*4+0x02000000,0x9214); +reg_write( DDR_REG_BASE +0x5159b*4+0x02000000,0x7185); +reg_write( DDR_REG_BASE +0x5159c*4+0x02000000,0xc9d); +reg_write( DDR_REG_BASE +0x5159d*4+0x02000000,0x9024); +reg_write( DDR_REG_BASE +0x5159e*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE +0x5159f*4+0x02000000,0xda2); +reg_write( DDR_REG_BASE +0x515a0*4+0x02000000,0xff0f); +reg_write( DDR_REG_BASE +0x515a1*4+0x02000000,0xa9a); +reg_write( DDR_REG_BASE +0x515a2*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x515a3*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x515a4*4+0x02000000,0xca04); +reg_write( DDR_REG_BASE +0x515a5*4+0x02000000,0x264a); +reg_write( DDR_REG_BASE +0x515a6*4+0x02000000,0x3000); +reg_write( DDR_REG_BASE +0x515a7*4+0x02000000,0x706c); +reg_write( DDR_REG_BASE +0x515a8*4+0x02000000,0xf019); +reg_write( DDR_REG_BASE +0x515a9*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE +0x515aa*4+0x02000000,0xf014); +reg_write( DDR_REG_BASE +0x515ab*4+0x02000000,0x231a); +reg_write( DDR_REG_BASE +0x515ac*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE +0x515ad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x515ae*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE +0x515af*4+0x02000000,0x2300); +reg_write( DDR_REG_BASE +0x515b0*4+0x02000000,0x1f8d); +reg_write( DDR_REG_BASE +0x515b1*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x515b2*4+0x02000000,0x88c); +reg_write( DDR_REG_BASE +0x515b3*4+0x02000000,0x7165); +reg_write( DDR_REG_BASE +0x515b4*4+0x02000000,0x7945); +reg_write( DDR_REG_BASE +0x515b5*4+0x02000000,0x793b); +reg_write( DDR_REG_BASE +0x515b6*4+0x02000000,0x2105); +reg_write( DDR_REG_BASE +0x515b7*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE +0x515b8*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE +0x515b9*4+0x02000000,0x140); +reg_write( DDR_REG_BASE +0x515ba*4+0x02000000,0x9180); +reg_write( DDR_REG_BASE +0x515bb*4+0x02000000,0xad80); +reg_write( DDR_REG_BASE +0x515bc*4+0x02000000,0xb140); +reg_write( DDR_REG_BASE +0x515bd*4+0x02000000,0x7144); +reg_write( DDR_REG_BASE +0x515be*4+0x02000000,0xadb); +reg_write( DDR_REG_BASE +0x515bf*4+0x02000000,0x8214); +reg_write( DDR_REG_BASE +0x515c0*4+0x02000000,0x7164); +reg_write( DDR_REG_BASE +0x515c1*4+0x02000000,0xbd3); +reg_write( DDR_REG_BASE +0x515c2*4+0x02000000,0x8024); +reg_write( DDR_REG_BASE +0x515c3*4+0x02000000,0x2616); +reg_write( DDR_REG_BASE +0x515c4*4+0x02000000,0x30cb); +reg_write( DDR_REG_BASE +0x515c5*4+0x02000000,0x88e); +reg_write( DDR_REG_BASE +0x515c6*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE +0x515c7*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE +0x515c8*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE +0x515c9*4+0x02000000,0x813); +reg_write( DDR_REG_BASE +0x515ca*4+0x02000000,0xbe); +reg_write( DDR_REG_BASE +0x515cb*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x515cc*4+0x02000000,0x9e6); +reg_write( DDR_REG_BASE +0x515cd*4+0x02000000,0xc0); +reg_write( DDR_REG_BASE +0x515ce*4+0x02000000,0xa3e); +reg_write( DDR_REG_BASE +0x515cf*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x515d0*4+0x02000000,0x720c); +reg_write( DDR_REG_BASE +0x515d1*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE +0x515d2*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE +0x515d3*4+0x02000000,0x808e); +reg_write( DDR_REG_BASE +0x515d4*4+0x02000000,0xf207); +reg_write( DDR_REG_BASE +0x515d5*4+0x02000000,0x9d6); +reg_write( DDR_REG_BASE +0x515d6*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE +0x515d7*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE +0x515d8*4+0x02000000,0xa2a); +reg_write( DDR_REG_BASE +0x515d9*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x515da*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE +0x515db*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x515dc*4+0x02000000,0x7045); +reg_write( DDR_REG_BASE +0x515dd*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE +0x515de*4+0x02000000,0xe044); +reg_write( DDR_REG_BASE +0x515df*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE +0x515e0*4+0x02000000,0x81b); +reg_write( DDR_REG_BASE +0x515e1*4+0x02000000,0x21e); +reg_write( DDR_REG_BASE +0x515e2*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x515e3*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE +0x515e4*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x515e5*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x515e6*4+0x02000000,0xe887); +reg_write( DDR_REG_BASE +0x515e7*4+0x02000000,0x9b2); +reg_write( DDR_REG_BASE +0x515e8*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE +0x515e9*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE +0x515ea*4+0x02000000,0xa06); +reg_write( DDR_REG_BASE +0x515eb*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x515ec*4+0x02000000,0xd80a); +reg_write( DDR_REG_BASE +0x515ed*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE +0x515ee*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE +0x515ef*4+0x02000000,0x820d); +reg_write( DDR_REG_BASE +0x515f0*4+0x02000000,0xf207); +reg_write( DDR_REG_BASE +0x515f1*4+0x02000000,0x99e); +reg_write( DDR_REG_BASE +0x515f2*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE +0x515f3*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE +0x515f4*4+0x02000000,0x9f2); +reg_write( DDR_REG_BASE +0x515f5*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x515f6*4+0x02000000,0xd8fd); +reg_write( DDR_REG_BASE +0x515f7*4+0x02000000,0xee08); +reg_write( DDR_REG_BASE +0x515f8*4+0x02000000,0x98e); +reg_write( DDR_REG_BASE +0x515f9*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE +0x515fa*4+0x02000000,0x720c); +reg_write( DDR_REG_BASE +0x515fb*4+0x02000000,0x9e6); +reg_write( DDR_REG_BASE +0x515fc*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x515fd*4+0x02000000,0xd8fe); +reg_write( DDR_REG_BASE +0x515fe*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE +0x515ff*4+0x02000000,0x813); +reg_write( DDR_REG_BASE +0x51600*4+0x02000000,0x13e); +reg_write( DDR_REG_BASE +0x51601*4+0x02000000,0x760c); +reg_write( DDR_REG_BASE +0x51602*4+0x02000000,0x97a); +reg_write( DDR_REG_BASE +0x51603*4+0x02000000,0xc0); +reg_write( DDR_REG_BASE +0x51604*4+0x02000000,0x9d2); +reg_write( DDR_REG_BASE +0x51605*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x51606*4+0x02000000,0x740c); +reg_write( DDR_REG_BASE +0x51607*4+0x02000000,0xed08); +reg_write( DDR_REG_BASE +0x51608*4+0x02000000,0x96e); +reg_write( DDR_REG_BASE +0x51609*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE +0x5160a*4+0x02000000,0x740c); +reg_write( DDR_REG_BASE +0x5160b*4+0x02000000,0x9c6); +reg_write( DDR_REG_BASE +0x5160c*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x5160d*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE +0x5160e*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE +0x5160f*4+0x02000000,0x827); +reg_write( DDR_REG_BASE +0x51610*4+0x02000000,0x27f); +reg_write( DDR_REG_BASE +0x51611*4+0x02000000,0x71ad); +reg_write( DDR_REG_BASE +0x51612*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x51613*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE +0x51614*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x51615*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x51616*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE +0x51617*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x51618*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x51619*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5161a*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x5161b*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE +0x5161c*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x5161d*4+0x02000000,0xe040); +reg_write( DDR_REG_BASE +0x5161e*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE +0x5161f*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE +0x51620*4+0x02000000,0xf03c); +reg_write( DDR_REG_BASE +0x51621*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x51622*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE +0x51623*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x51624*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x51625*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE +0x51626*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x51627*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE +0x51628*4+0x02000000,0xb8e2); +reg_write( DDR_REG_BASE +0x51629*4+0x02000000,0x25ca); +reg_write( DDR_REG_BASE +0x5162a*4+0x02000000,0x13e1); +reg_write( DDR_REG_BASE +0x5162b*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x5162c*4+0x02000000,0xae00); +reg_write( DDR_REG_BASE +0x5162d*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE +0x5162e*4+0x02000000,0x847); +reg_write( DDR_REG_BASE +0x5162f*4+0x02000000,0x95); +reg_write( DDR_REG_BASE +0x51630*4+0x02000000,0xe819); +reg_write( DDR_REG_BASE +0x51631*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x51632*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE +0x51633*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x51634*4+0x02000000,0x49); +reg_write( DDR_REG_BASE +0x51635*4+0x02000000,0x7014); +reg_write( DDR_REG_BASE +0x51636*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE +0x51637*4+0x02000000,0xf211); +reg_write( DDR_REG_BASE +0x51638*4+0x02000000,0xbbe); +reg_write( DDR_REG_BASE +0x51639*4+0x02000000,0xff0f); +reg_write( DDR_REG_BASE +0x5163a*4+0x02000000,0x8e00); +reg_write( DDR_REG_BASE +0x5163b*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE +0x5163c*4+0x02000000,0xfa2); +reg_write( DDR_REG_BASE +0x5163d*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE +0x5163e*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE +0x5163f*4+0x02000000,0xb02); +reg_write( DDR_REG_BASE +0x51640*4+0x02000000,0xff0f); +reg_write( DDR_REG_BASE +0x51641*4+0x02000000,0x40a1); +reg_write( DDR_REG_BASE +0x51642*4+0x02000000,0xaf6); +reg_write( DDR_REG_BASE +0x51643*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE +0x51644*4+0x02000000,0x1e01); +reg_write( DDR_REG_BASE +0x51645*4+0x02000000,0x1003); +reg_write( DDR_REG_BASE +0x51646*4+0x02000000,0x8e00); +reg_write( DDR_REG_BASE +0x51647*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE +0x51648*4+0x02000000,0xf1e4); +reg_write( DDR_REG_BASE +0x51649*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x5164a*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE +0x5164b*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x5164c*4+0x02000000,0x23); +reg_write( DDR_REG_BASE +0x5164d*4+0x02000000,0x7014); +reg_write( DDR_REG_BASE +0x5164e*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x5164f*4+0x02000000,0xf5ea); +reg_write( DDR_REG_BASE +0x51650*4+0x02000000,0xf1f7); +reg_write( DDR_REG_BASE +0x51651*4+0x02000000,0xf7a); +reg_write( DDR_REG_BASE +0x51652*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE +0x51653*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE +0x51654*4+0x02000000,0xca09); +reg_write( DDR_REG_BASE +0x51655*4+0x02000000,0xe885); +reg_write( DDR_REG_BASE +0x51656*4+0x02000000,0xe02); +reg_write( DDR_REG_BASE +0x51657*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE +0x51658*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE +0x51659*4+0x02000000,0x92a); +reg_write( DDR_REG_BASE +0x5165a*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x5165b*4+0x02000000,0xd809); +reg_write( DDR_REG_BASE +0x5165c*4+0x02000000,0xca09); +reg_write( DDR_REG_BASE +0x5165d*4+0x02000000,0xe837); +reg_write( DDR_REG_BASE +0x5165e*4+0x02000000,0xd923); +reg_write( DDR_REG_BASE +0x5165f*4+0x02000000,0xb99f); +reg_write( DDR_REG_BASE +0x51660*4+0x02000000,0x8900); +reg_write( DDR_REG_BASE +0x51661*4+0x02000000,0x1126); +reg_write( DDR_REG_BASE +0x51662*4+0x02000000,0x8f); +reg_write( DDR_REG_BASE +0x51663*4+0x02000000,0x70cd); +reg_write( DDR_REG_BASE +0x51664*4+0x02000000,0x7f05); +reg_write( DDR_REG_BASE +0x51665*4+0x02000000,0xf022); +reg_write( DDR_REG_BASE +0x51666*4+0x02000000,0x2644); +reg_write( DDR_REG_BASE +0x51667*4+0x02000000,0x17c1); +reg_write( DDR_REG_BASE +0x51668*4+0x02000000,0xe905); +reg_write( DDR_REG_BASE +0x51669*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE +0x5166a*4+0x02000000,0x9ff); +reg_write( DDR_REG_BASE +0x5166b*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE +0x5166c*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE +0x5166d*4+0x02000000,0x78eb); +reg_write( DDR_REG_BASE +0x5166e*4+0x02000000,0xf217); +reg_write( DDR_REG_BASE +0x5166f*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE +0x51670*4+0x02000000,0xb2a); +reg_write( DDR_REG_BASE +0x51671*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE +0x51672*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x51673*4+0x02000000,0xc102); +reg_write( DDR_REG_BASE +0x51674*4+0x02000000,0x4508); +reg_write( DDR_REG_BASE +0x51675*4+0x02000000,0x7bcf); +reg_write( DDR_REG_BASE +0x51676*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE +0x51677*4+0x02000000,0x42a1); +reg_write( DDR_REG_BASE +0x51678*4+0x02000000,0xdfe); +reg_write( DDR_REG_BASE +0x51679*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE +0x5167a*4+0x02000000,0x4378); +reg_write( DDR_REG_BASE +0x5167b*4+0x02000000,0xc102); +reg_write( DDR_REG_BASE +0x5167c*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x5167d*4+0x02000000,0x42a1); +reg_write( DDR_REG_BASE +0x5167e*4+0x02000000,0xdf2); +reg_write( DDR_REG_BASE +0x5167f*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE +0x51680*4+0x02000000,0x4363); +reg_write( DDR_REG_BASE +0x51681*4+0x02000000,0x4163); +reg_write( DDR_REG_BASE +0x51682*4+0x02000000,0xe9e); +reg_write( DDR_REG_BASE +0x51683*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE +0x51684*4+0x02000000,0x40a1); +reg_write( DDR_REG_BASE +0x51685*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE +0x51686*4+0x02000000,0xec1); +reg_write( DDR_REG_BASE +0x51687*4+0x02000000,0x90b4); +reg_write( DDR_REG_BASE +0x51688*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE +0x51689*4+0x02000000,0xd9e); +reg_write( DDR_REG_BASE +0x5168a*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE +0x5168b*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE +0x5168c*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x5168d*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE +0x5168e*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x5168f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51690*4+0x02000000,0xb8e5); +reg_write( DDR_REG_BASE +0x51691*4+0x02000000,0xebc); +reg_write( DDR_REG_BASE +0x51692*4+0x02000000,0xff02); +reg_write( DDR_REG_BASE +0x51693*4+0x02000000,0xd22); +reg_write( DDR_REG_BASE +0x51694*4+0x02000000,0xff8f); +reg_write( DDR_REG_BASE +0x51695*4+0x02000000,0x706f); +reg_write( DDR_REG_BASE +0x51696*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x51697*4+0x02000000,0x76c4); +reg_write( DDR_REG_BASE +0x51698*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE +0x51699*4+0x02000000,0xe044); +reg_write( DDR_REG_BASE +0x5169a*4+0x02000000,0xca04); +reg_write( DDR_REG_BASE +0x5169b*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE +0x5169c*4+0x02000000,0xf017); +reg_write( DDR_REG_BASE +0x5169d*4+0x02000000,0x706c); +reg_write( DDR_REG_BASE +0x5169e*4+0x02000000,0xf012); +reg_write( DDR_REG_BASE +0x5169f*4+0x02000000,0x221a); +reg_write( DDR_REG_BASE +0x516a0*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE +0x516a1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x516a2*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE +0x516a3*4+0x02000000,0x7965); +reg_write( DDR_REG_BASE +0x516a4*4+0x02000000,0x793b); +reg_write( DDR_REG_BASE +0x516a5*4+0x02000000,0x2105); +reg_write( DDR_REG_BASE +0x516a6*4+0x02000000,0xf8c); +reg_write( DDR_REG_BASE +0x516a7*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE +0x516a8*4+0x02000000,0x140); +reg_write( DDR_REG_BASE +0x516a9*4+0x02000000,0x2332); +reg_write( DDR_REG_BASE +0x516aa*4+0x02000000,0x1f81); +reg_write( DDR_REG_BASE +0x516ab*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x516ac*4+0x02000000,0x88c); +reg_write( DDR_REG_BASE +0x516ad*4+0x02000000,0x7164); +reg_write( DDR_REG_BASE +0x516ae*4+0x02000000,0x7165); +reg_write( DDR_REG_BASE +0x516af*4+0x02000000,0xb420); +reg_write( DDR_REG_BASE +0x516b0*4+0x02000000,0xbdf); +reg_write( DDR_REG_BASE +0x516b1*4+0x02000000,0x8214); +reg_write( DDR_REG_BASE +0x516b2*4+0x02000000,0x7144); +reg_write( DDR_REG_BASE +0x516b3*4+0x02000000,0xad7); +reg_write( DDR_REG_BASE +0x516b4*4+0x02000000,0x8024); +reg_write( DDR_REG_BASE +0x516b5*4+0x02000000,0x2316); +reg_write( DDR_REG_BASE +0x516b6*4+0x02000000,0x308b); +reg_write( DDR_REG_BASE +0x516b7*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE +0x516b8*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x516b9*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE +0x516ba*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE +0x516bb*4+0x02000000,0xe032); +reg_write( DDR_REG_BASE +0x516bc*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE +0x516bd*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE +0x516be*4+0x02000000,0xe9a); +reg_write( DDR_REG_BASE +0x516bf*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE +0x516c0*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x516c1*4+0x02000000,0xcde); +reg_write( DDR_REG_BASE +0x516c2*4+0x02000000,0x80); +reg_write( DDR_REG_BASE +0x516c3*4+0x02000000,0xcfe); +reg_write( DDR_REG_BASE +0x516c4*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE +0x516c5*4+0x02000000,0xd807); +reg_write( DDR_REG_BASE +0x516c6*4+0x02000000,0x23ab); +reg_write( DDR_REG_BASE +0x516c7*4+0x02000000,0x30c4); +reg_write( DDR_REG_BASE +0x516c8*4+0x02000000,0x7fff); +reg_write( DDR_REG_BASE +0x516c9*4+0x02000000,0xf000); +reg_write( DDR_REG_BASE +0x516ca*4+0x02000000,0xc2e2); +reg_write( DDR_REG_BASE +0x516cb*4+0x02000000,0x45cb); +reg_write( DDR_REG_BASE +0x516cc*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE +0x516cd*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x516ce*4+0x02000000,0x9500); +reg_write( DDR_REG_BASE +0x516cf*4+0x02000000,0xb8a1); +reg_write( DDR_REG_BASE +0x516d0*4+0x02000000,0xb500); +reg_write( DDR_REG_BASE +0x516d1*4+0x02000000,0x8c2); +reg_write( DDR_REG_BASE +0x516d2*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE +0x516d3*4+0x02000000,0x740c); +reg_write( DDR_REG_BASE +0x516d4*4+0x02000000,0xd81f); +reg_write( DDR_REG_BASE +0x516d5*4+0x02000000,0x8ba); +reg_write( DDR_REG_BASE +0x516d6*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE +0x516d7*4+0x02000000,0x1df6); +reg_write( DDR_REG_BASE +0x516d8*4+0x02000000,0x105d); +reg_write( DDR_REG_BASE +0x516d9*4+0x02000000,0xc6c2); +reg_write( DDR_REG_BASE +0x516da*4+0x02000000,0xc2e2); +reg_write( DDR_REG_BASE +0x516db*4+0x02000000,0x8ae); +reg_write( DDR_REG_BASE +0x516dc*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE +0x516dd*4+0x02000000,0xd81f); +reg_write( DDR_REG_BASE +0x516de*4+0x02000000,0x45cb); +reg_write( DDR_REG_BASE +0x516df*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE +0x516e0*4+0x02000000,0x1f0); +reg_write( DDR_REG_BASE +0x516e1*4+0x02000000,0x740c); +reg_write( DDR_REG_BASE +0x516e2*4+0x02000000,0x89e); +reg_write( DDR_REG_BASE +0x516e3*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE +0x516e4*4+0x02000000,0x1d00); +reg_write( DDR_REG_BASE +0x516e5*4+0x02000000,0x1005); +reg_write( DDR_REG_BASE +0x516e6*4+0x02000000,0x150a); +reg_write( DDR_REG_BASE +0x516e7*4+0x02000000,0x9700); +reg_write( DDR_REG_BASE +0x516e8*4+0x02000000,0xb881); +reg_write( DDR_REG_BASE +0x516e9*4+0x02000000,0x1d0a); +reg_write( DDR_REG_BASE +0x516ea*4+0x02000000,0x901c); +reg_write( DDR_REG_BASE +0x516eb*4+0x02000000,0xc6c2); +reg_write( DDR_REG_BASE +0x516ec*4+0x02000000,0xc0f1); +reg_write( DDR_REG_BASE +0x516ed*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x516ee*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE +0x516ef*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x516f0*4+0x02000000,0x12); +reg_write( DDR_REG_BASE +0x516f1*4+0x02000000,0x218c); +reg_write( DDR_REG_BASE +0x516f2*4+0x02000000,0x8203); +reg_write( DDR_REG_BASE +0x516f3*4+0x02000000,0xc9c); +reg_write( DDR_REG_BASE +0x516f4*4+0x02000000,0xce); +reg_write( DDR_REG_BASE +0x516f5*4+0x02000000,0x80e); +reg_write( DDR_REG_BASE +0x516f6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x516f7*4+0x02000000,0xc0d1); +reg_write( DDR_REG_BASE +0x516f8*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE +0x516f9*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x516fa*4+0x02000000,0xc2e2); +reg_write( DDR_REG_BASE +0x516fb*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x516fc*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE +0x516fd*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x516fe*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x516ff*4+0x02000000,0x81b); +reg_write( DDR_REG_BASE +0x51700*4+0x02000000,0x3e); +reg_write( DDR_REG_BASE +0x51701*4+0x02000000,0xd80a); +reg_write( DDR_REG_BASE +0x51702*4+0x02000000,0x45cb); +reg_write( DDR_REG_BASE +0x51703*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE +0x51704*4+0x02000000,0xe036); +reg_write( DDR_REG_BASE +0x51705*4+0x02000000,0x85a); +reg_write( DDR_REG_BASE +0x51706*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE +0x51707*4+0x02000000,0x1d00); +reg_write( DDR_REG_BASE +0x51708*4+0x02000000,0x1045); +reg_write( DDR_REG_BASE +0x51709*4+0x02000000,0x1d00); +reg_write( DDR_REG_BASE +0x5170a*4+0x02000000,0x1005); +reg_write( DDR_REG_BASE +0x5170b*4+0x02000000,0xc6c2); +reg_write( DDR_REG_BASE +0x5170c*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x5170d*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE +0x5170e*4+0x02000000,0xf2); +reg_write( DDR_REG_BASE +0x5170f*4+0x02000000,0x1800); +reg_write( DDR_REG_BASE +0x51710*4+0x02000000,0x45); +reg_write( DDR_REG_BASE +0x51711*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE +0x51712*4+0x02000000,0x1800); +reg_write( DDR_REG_BASE +0x51713*4+0x02000000,0x5); +reg_write( DDR_REG_BASE +0x51714*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE +0x51715*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE +0x51716*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE +0x51717*4+0x02000000,0xc1bd); +reg_write( DDR_REG_BASE +0x51718*4+0x02000000,0xc350); +reg_write( DDR_REG_BASE +0x51719*4+0x02000000,0x4648); +reg_write( DDR_REG_BASE +0x5171a*4+0x02000000,0x4728); +reg_write( DDR_REG_BASE +0x5171b*4+0x02000000,0x84e); +reg_write( DDR_REG_BASE +0x5171c*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE +0x5171d*4+0x02000000,0x4508); +reg_write( DDR_REG_BASE +0x5171e*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x5171f*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x51720*4+0x02000000,0xe0c4); +reg_write( DDR_REG_BASE +0x51721*4+0x02000000,0x1800); +reg_write( DDR_REG_BASE +0x51722*4+0x02000000,0x3c5); +reg_write( DDR_REG_BASE +0x51723*4+0x02000000,0xb88b); +reg_write( DDR_REG_BASE +0x51724*4+0x02000000,0xd9f0); +reg_write( DDR_REG_BASE +0x51725*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE +0x51726*4+0x02000000,0xc093); +reg_write( DDR_REG_BASE +0x51727*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x51728*4+0x02000000,0xda28); +reg_write( DDR_REG_BASE +0x51729*4+0x02000000,0xa42); +reg_write( DDR_REG_BASE +0x5172a*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE +0x5172b*4+0x02000000,0xc393); +reg_write( DDR_REG_BASE +0x5172c*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x5172d*4+0x02000000,0xc04c); +reg_write( DDR_REG_BASE +0x5172e*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x5172f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51730*4+0x02000000,0xf00); +reg_write( DDR_REG_BASE +0x51731*4+0x02000000,0xc04b); +reg_write( DDR_REG_BASE +0x51732*4+0x02000000,0xd820); +reg_write( DDR_REG_BASE +0x51733*4+0x02000000,0xc04a); +reg_write( DDR_REG_BASE +0x51734*4+0x02000000,0x1490); +reg_write( DDR_REG_BASE +0x51735*4+0x02000000,0x3000); +reg_write( DDR_REG_BASE +0x51736*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE +0x51737*4+0x02000000,0xbdc4); +reg_write( DDR_REG_BASE +0x51738*4+0x02000000,0xc04e); +reg_write( DDR_REG_BASE +0x51739*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE +0x5173a*4+0x02000000,0x148c); +reg_write( DDR_REG_BASE +0x5173b*4+0x02000000,0x3000); +reg_write( DDR_REG_BASE +0x5173c*4+0x02000000,0x41c1); +reg_write( DDR_REG_BASE +0x5173d*4+0x02000000,0x1c24); +reg_write( DDR_REG_BASE +0x5173e*4+0x02000000,0x3003); +reg_write( DDR_REG_BASE +0x5173f*4+0x02000000,0xc04f); +reg_write( DDR_REG_BASE +0x51740*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE +0x51741*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE +0x51742*4+0x02000000,0xed05); +reg_write( DDR_REG_BASE +0x51743*4+0x02000000,0xbd61); +reg_write( DDR_REG_BASE +0x51744*4+0x02000000,0xdff); +reg_write( DDR_REG_BASE +0x51745*4+0x02000000,0x9031); +reg_write( DDR_REG_BASE +0x51746*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE +0x51747*4+0x02000000,0xc748); +reg_write( DDR_REG_BASE +0x51748*4+0x02000000,0x7d0f); +reg_write( DDR_REG_BASE +0x51749*4+0x02000000,0x40a1); +reg_write( DDR_REG_BASE +0x5174a*4+0x02000000,0x1c1c); +reg_write( DDR_REG_BASE +0x5174b*4+0x02000000,0x3103); +reg_write( DDR_REG_BASE +0x5174c*4+0x02000000,0xc346); +reg_write( DDR_REG_BASE +0x5174d*4+0x02000000,0x1c25); +reg_write( DDR_REG_BASE +0x5174e*4+0x02000000,0x3382); +reg_write( DDR_REG_BASE +0x5174f*4+0x02000000,0x1c34); +reg_write( DDR_REG_BASE +0x51750*4+0x02000000,0x3043); +reg_write( DDR_REG_BASE +0x51751*4+0x02000000,0x942); +reg_write( DDR_REG_BASE +0x51752*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x51753*4+0x02000000,0x43b9); +reg_write( DDR_REG_BASE +0x51754*4+0x02000000,0xd5e); +reg_write( DDR_REG_BASE +0x51755*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x51756*4+0x02000000,0xc083); +reg_write( DDR_REG_BASE +0x51757*4+0x02000000,0x47cb); +reg_write( DDR_REG_BASE +0x51758*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x51759*4+0x02000000,0x7b2); +reg_write( DDR_REG_BASE +0x5175a*4+0x02000000,0x8f21); +reg_write( DDR_REG_BASE +0x5175b*4+0x02000000,0x8f40); +reg_write( DDR_REG_BASE +0x5175c*4+0x02000000,0x1488); +reg_write( DDR_REG_BASE +0x5175d*4+0x02000000,0x3000); +reg_write( DDR_REG_BASE +0x5175e*4+0x02000000,0xc051); +reg_write( DDR_REG_BASE +0x5175f*4+0x02000000,0xf00f); +reg_write( DDR_REG_BASE +0x51760*4+0x02000000,0xc30f); +reg_write( DDR_REG_BASE +0x51761*4+0x02000000,0x7b54); +reg_write( DDR_REG_BASE +0x51762*4+0x02000000,0x9300); +reg_write( DDR_REG_BASE +0x51763*4+0x02000000,0xe88a); +reg_write( DDR_REG_BASE +0x51764*4+0x02000000,0xc093); +reg_write( DDR_REG_BASE +0x51765*4+0x02000000,0x20f5); +reg_write( DDR_REG_BASE +0x51766*4+0x02000000,0x80); +reg_write( DDR_REG_BASE +0x51767*4+0x02000000,0x80d); +reg_write( DDR_REG_BASE +0x51768*4+0x02000000,0x833); +reg_write( DDR_REG_BASE +0x51769*4+0x02000000,0x2042); +reg_write( DDR_REG_BASE +0x5176a*4+0x02000000,0x800); +reg_write( DDR_REG_BASE +0x5176b*4+0x02000000,0xb300); +reg_write( DDR_REG_BASE +0x5176c*4+0x02000000,0x7144); +reg_write( DDR_REG_BASE +0x5176d*4+0x02000000,0x9e9); +reg_write( DDR_REG_BASE +0x5176e*4+0x02000000,0x80a5); +reg_write( DDR_REG_BASE +0x5176f*4+0x02000000,0x6e09); +reg_write( DDR_REG_BASE +0x51770*4+0x02000000,0x835); +reg_write( DDR_REG_BASE +0x51771*4+0x02000000,0xb5); +reg_write( DDR_REG_BASE +0x51772*4+0x02000000,0x72d5); +reg_write( DDR_REG_BASE +0x51773*4+0x02000000,0x45cb); +reg_write( DDR_REG_BASE +0x51774*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51775*4+0x02000000,0xf0f0); +reg_write( DDR_REG_BASE +0x51776*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE +0x51777*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51778*4+0x02000000,0xff00); +reg_write( DDR_REG_BASE +0x51779*4+0x02000000,0x23ca); +reg_write( DDR_REG_BASE +0x5177a*4+0x02000000,0x341); +reg_write( DDR_REG_BASE +0x5177b*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE +0x5177c*4+0x02000000,0x41a1); +reg_write( DDR_REG_BASE +0x5177d*4+0x02000000,0x42a1); +reg_write( DDR_REG_BASE +0x5177e*4+0x02000000,0xc46); +reg_write( DDR_REG_BASE +0x5177f*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE +0x51780*4+0x02000000,0xc340); +reg_write( DDR_REG_BASE +0x51781*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE +0x51782*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51783*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE +0x51784*4+0x02000000,0xd808); +reg_write( DDR_REG_BASE +0x51785*4+0x02000000,0x41a1); +reg_write( DDR_REG_BASE +0x51786*4+0x02000000,0x42a1); +reg_write( DDR_REG_BASE +0x51787*4+0x02000000,0xc36); +reg_write( DDR_REG_BASE +0x51788*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE +0x51789*4+0x02000000,0xc340); +reg_write( DDR_REG_BASE +0x5178a*4+0x02000000,0xc083); +reg_write( DDR_REG_BASE +0x5178b*4+0x02000000,0xf0e); +reg_write( DDR_REG_BASE +0x5178c*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x5178d*4+0x02000000,0x6eab); +reg_write( DDR_REG_BASE +0x5178e*4+0x02000000,0x8f41); +reg_write( DDR_REG_BASE +0x5178f*4+0x02000000,0x8f20); +reg_write( DDR_REG_BASE +0x51790*4+0x02000000,0xf00e); +reg_write( DDR_REG_BASE +0x51791*4+0x02000000,0xc30e); +reg_write( DDR_REG_BASE +0x51792*4+0x02000000,0x7b34); +reg_write( DDR_REG_BASE +0x51793*4+0x02000000,0x9300); +reg_write( DDR_REG_BASE +0x51794*4+0x02000000,0x813); +reg_write( DDR_REG_BASE +0x51795*4+0x02000000,0x7f1); +reg_write( DDR_REG_BASE +0x51796*4+0x02000000,0xc093); +reg_write( DDR_REG_BASE +0x51797*4+0x02000000,0x20f5); +reg_write( DDR_REG_BASE +0x51798*4+0x02000000,0x40); +reg_write( DDR_REG_BASE +0x51799*4+0x02000000,0x80b); +reg_write( DDR_REG_BASE +0x5179a*4+0x02000000,0x833); +reg_write( DDR_REG_BASE +0x5179b*4+0x02000000,0xe020); +reg_write( DDR_REG_BASE +0x5179c*4+0x02000000,0xb300); +reg_write( DDR_REG_BASE +0x5179d*4+0x02000000,0x7124); +reg_write( DDR_REG_BASE +0x5179e*4+0x02000000,0xae7); +reg_write( DDR_REG_BASE +0x5179f*4+0x02000000,0x8065); +reg_write( DDR_REG_BASE +0x517a0*4+0x02000000,0x73b5); +reg_write( DDR_REG_BASE +0x517a1*4+0x02000000,0xe88); +reg_write( DDR_REG_BASE +0x517a2*4+0x02000000,0xffad); +reg_write( DDR_REG_BASE +0x517a3*4+0x02000000,0x4063); +reg_write( DDR_REG_BASE +0x517a4*4+0x02000000,0xc010); +reg_write( DDR_REG_BASE +0x517a5*4+0x02000000,0xe808); +reg_write( DDR_REG_BASE +0x517a6*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x517a7*4+0x02000000,0x36); +reg_write( DDR_REG_BASE +0x517a8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x517a9*4+0x02000000,0x912); +reg_write( DDR_REG_BASE +0x517aa*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE +0x517ab*4+0x02000000,0x740c); +reg_write( DDR_REG_BASE +0x517ac*4+0x02000000,0x8fc0); +reg_write( DDR_REG_BASE +0x517ad*4+0x02000000,0xf036); +reg_write( DDR_REG_BASE +0x517ae*4+0x02000000,0xc00f); +reg_write( DDR_REG_BASE +0x517af*4+0x02000000,0x7ddd); +reg_write( DDR_REG_BASE +0x517b0*4+0x02000000,0x20f5); +reg_write( DDR_REG_BASE +0x517b1*4+0x02000000,0x382); +reg_write( DDR_REG_BASE +0x517b2*4+0x02000000,0xc00e); +reg_write( DDR_REG_BASE +0x517b3*4+0x02000000,0x20f5); +reg_write( DDR_REG_BASE +0x517b4*4+0x02000000,0x383); +reg_write( DDR_REG_BASE +0x517b5*4+0x02000000,0x6358); +reg_write( DDR_REG_BASE +0x517b6*4+0x02000000,0x781c); +reg_write( DDR_REG_BASE +0x517b7*4+0x02000000,0x2048); +reg_write( DDR_REG_BASE +0x517b8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x517b9*4+0x02000000,0x2049); +reg_write( DDR_REG_BASE +0x517ba*4+0x02000000,0x7c1); +reg_write( DDR_REG_BASE +0x517bb*4+0x02000000,0xc011); +reg_write( DDR_REG_BASE +0x517bc*4+0x02000000,0x78d4); +reg_write( DDR_REG_BASE +0x517bd*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE +0x517be*4+0x02000000,0x4b50); +reg_write( DDR_REG_BASE +0x517bf*4+0x02000000,0x2048); +reg_write( DDR_REG_BASE +0x517c0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x517c1*4+0x02000000,0xc052); +reg_write( DDR_REG_BASE +0x517c2*4+0x02000000,0xc010); +reg_write( DDR_REG_BASE +0x517c3*4+0x02000000,0xe813); +reg_write( DDR_REG_BASE +0x517c4*4+0x02000000,0xc00f); +reg_write( DDR_REG_BASE +0x517c5*4+0x02000000,0x4363); +reg_write( DDR_REG_BASE +0x517c6*4+0x02000000,0x20f5); +reg_write( DDR_REG_BASE +0x517c7*4+0x02000000,0x382); +reg_write( DDR_REG_BASE +0x517c8*4+0x02000000,0xc00e); +reg_write( DDR_REG_BASE +0x517c9*4+0x02000000,0x20f5); +reg_write( DDR_REG_BASE +0x517ca*4+0x02000000,0x380); +reg_write( DDR_REG_BASE +0x517cb*4+0x02000000,0xc142); +reg_write( DDR_REG_BASE +0x517cc*4+0x02000000,0xc240); +reg_write( DDR_REG_BASE +0x517cd*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE +0x517ce*4+0x02000000,0x740c); +reg_write( DDR_REG_BASE +0x517cf*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x517d0*4+0x02000000,0x38); +reg_write( DDR_REG_BASE +0x517d1*4+0x02000000,0x5); +reg_write( DDR_REG_BASE +0x517d2*4+0x02000000,0x8be); +reg_write( DDR_REG_BASE +0x517d3*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE +0x517d4*4+0x02000000,0x42a1); +reg_write( DDR_REG_BASE +0x517d5*4+0x02000000,0xc012); +reg_write( DDR_REG_BASE +0x517d6*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x517d7*4+0x02000000,0x39); +reg_write( DDR_REG_BASE +0x517d8*4+0x02000000,0x3); +reg_write( DDR_REG_BASE +0x517d9*4+0x02000000,0x42a1); +reg_write( DDR_REG_BASE +0x517da*4+0x02000000,0x780e); +reg_write( DDR_REG_BASE +0x517db*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE +0x517dc*4+0x02000000,0x207f); +reg_write( DDR_REG_BASE +0x517dd*4+0x02000000,0x140); +reg_write( DDR_REG_BASE +0x517de*4+0x02000000,0x932); +reg_write( DDR_REG_BASE +0x517df*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE +0x517e0*4+0x02000000,0x4363); +reg_write( DDR_REG_BASE +0x517e1*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE +0x517e2*4+0x02000000,0x8f01); +reg_write( DDR_REG_BASE +0x517e3*4+0x02000000,0x899); +reg_write( DDR_REG_BASE +0x517e4*4+0x02000000,0x83a5); +reg_write( DDR_REG_BASE +0x517e5*4+0x02000000,0x2644); +reg_write( DDR_REG_BASE +0x517e6*4+0x02000000,0x105b); +reg_write( DDR_REG_BASE +0x517e7*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x517e8*4+0x02000000,0x7005); +reg_write( DDR_REG_BASE +0x517e9*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x517ea*4+0x02000000,0xe004); +reg_write( DDR_REG_BASE +0x517eb*4+0x02000000,0xc0bd); +reg_write( DDR_REG_BASE +0x517ec*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE +0x517ed*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE +0x517ee*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE +0x517ef*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x517f0*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE +0x517f1*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE +0x517f2*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE +0x517f3*4+0x02000000,0xc1ab); +reg_write( DDR_REG_BASE +0x517f4*4+0x02000000,0xc047); +reg_write( DDR_REG_BASE +0x517f5*4+0x02000000,0x690b); +reg_write( DDR_REG_BASE +0x517f6*4+0x02000000,0x4338); +reg_write( DDR_REG_BASE +0x517f7*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE +0x517f8*4+0x02000000,0x9b2); +reg_write( DDR_REG_BASE +0x517f9*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE +0x517fa*4+0x02000000,0x7e0f); +reg_write( DDR_REG_BASE +0x517fb*4+0x02000000,0xc048); +reg_write( DDR_REG_BASE +0x517fc*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE +0x517fd*4+0x02000000,0x83f); +reg_write( DDR_REG_BASE +0x517fe*4+0x02000000,0x134); +reg_write( DDR_REG_BASE +0x517ff*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x51800*4+0x02000000,0xc12); +reg_write( DDR_REG_BASE +0x51801*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x51802*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x51803*4+0x02000000,0x1200); +reg_write( DDR_REG_BASE +0x51804*4+0x02000000,0x3083); +reg_write( DDR_REG_BASE +0x51805*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x51806*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE +0x51807*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x51808*4+0x02000000,0xb98e); +reg_write( DDR_REG_BASE +0x51809*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE +0x5180a*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE +0x5180b*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE +0x5180c*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE +0x5180d*4+0x02000000,0xcd2); +reg_write( DDR_REG_BASE +0x5180e*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x5180f*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE +0x51810*4+0x02000000,0xf8f6); +reg_write( DDR_REG_BASE +0x51811*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE +0x51812*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE +0x51813*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE +0x51814*4+0x02000000,0xcc2); +reg_write( DDR_REG_BASE +0x51815*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x51816*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE +0x51817*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x51818*4+0x02000000,0xc7a); +reg_write( DDR_REG_BASE +0x51819*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x5181a*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x5181b*4+0x02000000,0x2342); +reg_write( DDR_REG_BASE +0x5181c*4+0x02000000,0x3040); +reg_write( DDR_REG_BASE +0x5181d*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE +0x5181e*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE +0x5181f*4+0x02000000,0x267c); +reg_write( DDR_REG_BASE +0x51820*4+0x02000000,0x1101); +reg_write( DDR_REG_BASE +0x51821*4+0x02000000,0x207c); +reg_write( DDR_REG_BASE +0x51822*4+0x02000000,0x80); +reg_write( DDR_REG_BASE +0x51823*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x51824*4+0x02000000,0x804d); +reg_write( DDR_REG_BASE +0x51825*4+0x02000000,0xdf08); +reg_write( DDR_REG_BASE +0x51826*4+0x02000000,0x9ce); +reg_write( DDR_REG_BASE +0x51827*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE +0x51828*4+0x02000000,0x27ca); +reg_write( DDR_REG_BASE +0x51829*4+0x02000000,0x1062); +reg_write( DDR_REG_BASE +0x5182a*4+0x02000000,0xa26); +reg_write( DDR_REG_BASE +0x5182b*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE +0x5182c*4+0x02000000,0x4608); +reg_write( DDR_REG_BASE +0x5182d*4+0x02000000,0x70b5); +reg_write( DDR_REG_BASE +0x5182e*4+0x02000000,0x218a); +reg_write( DDR_REG_BASE +0x5182f*4+0x02000000,0xfc7); +reg_write( DDR_REG_BASE +0x51830*4+0x02000000,0x42c3); +reg_write( DDR_REG_BASE +0x51831*4+0x02000000,0x900f); +reg_write( DDR_REG_BASE +0x51832*4+0x02000000,0xe0c0); +reg_write( DDR_REG_BASE +0x51833*4+0x02000000,0x21ca); +reg_write( DDR_REG_BASE +0x51834*4+0x02000000,0x21); +reg_write( DDR_REG_BASE +0x51835*4+0x02000000,0xb2e0); +reg_write( DDR_REG_BASE +0x51836*4+0x02000000,0xb225); +reg_write( DDR_REG_BASE +0x51837*4+0x02000000,0xc108); +reg_write( DDR_REG_BASE +0x51838*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE +0x51839*4+0x02000000,0x4d); +reg_write( DDR_REG_BASE +0x5183a*4+0x02000000,0x651d); +reg_write( DDR_REG_BASE +0x5183b*4+0x02000000,0x2614); +reg_write( DDR_REG_BASE +0x5183c*4+0x02000000,0x1042); +reg_write( DDR_REG_BASE +0x5183d*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE +0x5183e*4+0x02000000,0x4ad8); +reg_write( DDR_REG_BASE +0x5183f*4+0x02000000,0x2144); +reg_write( DDR_REG_BASE +0x51840*4+0x02000000,0x4e); +reg_write( DDR_REG_BASE +0x51841*4+0x02000000,0x82f); +reg_write( DDR_REG_BASE +0x51842*4+0x02000000,0xb5); +reg_write( DDR_REG_BASE +0x51843*4+0x02000000,0x665e); +reg_write( DDR_REG_BASE +0x51844*4+0x02000000,0x47cb); +reg_write( DDR_REG_BASE +0x51845*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51846*4+0x02000000,0xf0f0); +reg_write( DDR_REG_BASE +0x51847*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE +0x51848*4+0x02000000,0x41e1); +reg_write( DDR_REG_BASE +0x51849*4+0x02000000,0x42e1); +reg_write( DDR_REG_BASE +0x5184a*4+0x02000000,0x43e1); +reg_write( DDR_REG_BASE +0x5184b*4+0x02000000,0xaae); +reg_write( DDR_REG_BASE +0x5184c*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE +0x5184d*4+0x02000000,0xc740); +reg_write( DDR_REG_BASE +0x5184e*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE +0x5184f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51850*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE +0x51851*4+0x02000000,0xd808); +reg_write( DDR_REG_BASE +0x51852*4+0x02000000,0x41e1); +reg_write( DDR_REG_BASE +0x51853*4+0x02000000,0x42e1); +reg_write( DDR_REG_BASE +0x51854*4+0x02000000,0xa9a); +reg_write( DDR_REG_BASE +0x51855*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE +0x51856*4+0x02000000,0xc340); +reg_write( DDR_REG_BASE +0x51857*4+0x02000000,0x4e58); +reg_write( DDR_REG_BASE +0x51858*4+0x02000000,0xc049); +reg_write( DDR_REG_BASE +0x51859*4+0x02000000,0x234f); +reg_write( DDR_REG_BASE +0x5185a*4+0x02000000,0x3040); +reg_write( DDR_REG_BASE +0x5185b*4+0x02000000,0xe510); +reg_write( DDR_REG_BASE +0x5185c*4+0x02000000,0x7214); +reg_write( DDR_REG_BASE +0x5185d*4+0x02000000,0x70cd); +reg_write( DDR_REG_BASE +0x5185e*4+0x02000000,0xc54a); +reg_write( DDR_REG_BASE +0x5185f*4+0x02000000,0xf479); +reg_write( DDR_REG_BASE +0x51860*4+0x02000000,0xc008); +reg_write( DDR_REG_BASE +0x51861*4+0x02000000,0x790f); +reg_write( DDR_REG_BASE +0x51862*4+0x02000000,0xb4e); +reg_write( DDR_REG_BASE +0x51863*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x51864*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x51865*4+0x02000000,0x1200); +reg_write( DDR_REG_BASE +0x51866*4+0x02000000,0x3083); +reg_write( DDR_REG_BASE +0x51867*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x51868*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x51869*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE +0x5186a*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE +0x5186b*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE +0x5186c*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE +0x5186d*4+0x02000000,0xc12); +reg_write( DDR_REG_BASE +0x5186e*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x5186f*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE +0x51870*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE +0x51871*4+0x02000000,0xf8b8); +reg_write( DDR_REG_BASE +0x51872*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE +0x51873*4+0x02000000,0x3041); +reg_write( DDR_REG_BASE +0x51874*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE +0x51875*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE +0x51876*4+0x02000000,0xbfe); +reg_write( DDR_REG_BASE +0x51877*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x51878*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE +0x51879*4+0x02000000,0xdb6); +reg_write( DDR_REG_BASE +0x5187a*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x5187b*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x5187c*4+0x02000000,0xbfaa); +reg_write( DDR_REG_BASE +0x5187d*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x5187e*4+0x02000000,0x41e1); +reg_write( DDR_REG_BASE +0x5187f*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE +0x51880*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE +0x51881*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE +0x51882*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE +0x51883*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE +0x51884*4+0x02000000,0xbe2); +reg_write( DDR_REG_BASE +0x51885*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x51886*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE +0x51887*4+0x02000000,0xca08); +reg_write( DDR_REG_BASE +0x51888*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x51889*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5188a*4+0x02000000,0x7500); +reg_write( DDR_REG_BASE +0x5188b*4+0x02000000,0x724c); +reg_write( DDR_REG_BASE +0x5188c*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE +0x5188d*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x5188e*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE +0x5188f*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE +0x51890*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE +0x51891*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE +0x51892*4+0x02000000,0xbc6); +reg_write( DDR_REG_BASE +0x51893*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x51894*4+0x02000000,0x4338); +reg_write( DDR_REG_BASE +0x51895*4+0x02000000,0xc86); +reg_write( DDR_REG_BASE +0x51896*4+0x02000000,0xff0f); +reg_write( DDR_REG_BASE +0x51897*4+0x02000000,0xc00a); +reg_write( DDR_REG_BASE +0x51898*4+0x02000000,0x41e1); +reg_write( DDR_REG_BASE +0x51899*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE +0x5189a*4+0x02000000,0x7b0f); +reg_write( DDR_REG_BASE +0x5189b*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x5189c*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE +0x5189d*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE +0x5189e*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE +0x5189f*4+0x02000000,0xbae); +reg_write( DDR_REG_BASE +0x518a0*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x518a1*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE +0x518a2*4+0x02000000,0xca08); +reg_write( DDR_REG_BASE +0x518a3*4+0x02000000,0x2350); +reg_write( DDR_REG_BASE +0x518a4*4+0x02000000,0x3301); +reg_write( DDR_REG_BASE +0x518a5*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE +0x518a6*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE +0x518a7*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x518a8*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE +0x518a9*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE +0x518aa*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE +0x518ab*4+0x02000000,0xb96); +reg_write( DDR_REG_BASE +0x518ac*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x518ad*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE +0x518ae*4+0x02000000,0xc009); +reg_write( DDR_REG_BASE +0x518af*4+0x02000000,0xf8a4); +reg_write( DDR_REG_BASE +0x518b0*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE +0x518b1*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE +0x518b2*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE +0x518b3*4+0x02000000,0xb86); +reg_write( DDR_REG_BASE +0x518b4*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x518b5*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE +0x518b6*4+0x02000000,0xf89d); +reg_write( DDR_REG_BASE +0x518b7*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE +0x518b8*4+0x02000000,0x30c1); +reg_write( DDR_REG_BASE +0x518b9*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE +0x518ba*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE +0x518bb*4+0x02000000,0xb76); +reg_write( DDR_REG_BASE +0x518bc*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x518bd*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE +0x518be*4+0x02000000,0xf896); +reg_write( DDR_REG_BASE +0x518bf*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE +0x518c0*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE +0x518c1*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE +0x518c2*4+0x02000000,0xb66); +reg_write( DDR_REG_BASE +0x518c3*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x518c4*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE +0x518c5*4+0x02000000,0xd02); +reg_write( DDR_REG_BASE +0x518c6*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x518c7*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x518c8*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE +0x518c9*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE +0x518ca*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE +0x518cb*4+0x02000000,0x1c00); +reg_write( DDR_REG_BASE +0x518cc*4+0x02000000,0x3041); +reg_write( DDR_REG_BASE +0x518cd*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x518ce*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE +0x518cf*4+0x02000000,0x764c); +reg_write( DDR_REG_BASE +0x518d0*4+0x02000000,0xdb20); +reg_write( DDR_REG_BASE +0x518d1*4+0x02000000,0xb4a); +reg_write( DDR_REG_BASE +0x518d2*4+0x02000000,0xfecf); +reg_write( DDR_REG_BASE +0x518d3*4+0x02000000,0xc0ab); +reg_write( DDR_REG_BASE +0x518d4*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE +0x518d5*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE +0x518d6*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE +0x518d7*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE +0x518d8*4+0x02000000,0x811); +reg_write( DDR_REG_BASE +0x518d9*4+0x02000000,0x135); +reg_write( DDR_REG_BASE +0x518da*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x518db*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x518dc*4+0x02000000,0xf36); +reg_write( DDR_REG_BASE +0x518dd*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE +0x518de*4+0x02000000,0xb992); +reg_write( DDR_REG_BASE +0x518df*4+0x02000000,0xf1f5); +reg_write( DDR_REG_BASE +0x518e0*4+0x02000000,0xbe7); +reg_write( DDR_REG_BASE +0x518e1*4+0x02000000,0xb071); +reg_write( DDR_REG_BASE +0x518e2*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x518e3*4+0x02000000,0x736f); +reg_write( DDR_REG_BASE +0x518e4*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE +0x518e5*4+0x02000000,0xf092); +reg_write( DDR_REG_BASE +0x518e6*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE +0x518e7*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x518e8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x518e9*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE +0x518ea*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE +0x518eb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x518ec*4+0x02000000,0xff00); +reg_write( DDR_REG_BASE +0x518ed*4+0x02000000,0x7014); +reg_write( DDR_REG_BASE +0x518ee*4+0x02000000,0x21ca); +reg_write( DDR_REG_BASE +0x518ef*4+0x02000000,0x21); +reg_write( DDR_REG_BASE +0x518f0*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE +0x518f1*4+0x02000000,0x4220); +reg_write( DDR_REG_BASE +0x518f2*4+0x02000000,0x95e); +reg_write( DDR_REG_BASE +0x518f3*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE +0x518f4*4+0x02000000,0xc340); +reg_write( DDR_REG_BASE +0x518f5*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x518f6*4+0x02000000,0xa26); +reg_write( DDR_REG_BASE +0x518f7*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x518f8*4+0x02000000,0x41a1); +reg_write( DDR_REG_BASE +0x518f9*4+0x02000000,0x1200); +reg_write( DDR_REG_BASE +0x518fa*4+0x02000000,0x3083); +reg_write( DDR_REG_BASE +0x518fb*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x518fc*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x518fd*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE +0x518fe*4+0x02000000,0x4528); +reg_write( DDR_REG_BASE +0x518ff*4+0x02000000,0xc143); +reg_write( DDR_REG_BASE +0x51900*4+0x02000000,0xc142); +reg_write( DDR_REG_BASE +0x51901*4+0x02000000,0xc141); +reg_write( DDR_REG_BASE +0x51902*4+0x02000000,0xae6); +reg_write( DDR_REG_BASE +0x51903*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x51904*4+0x02000000,0xc140); +reg_write( DDR_REG_BASE +0x51905*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE +0x51906*4+0x02000000,0x47cb); +reg_write( DDR_REG_BASE +0x51907*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51908*4+0x02000000,0x4400); +reg_write( DDR_REG_BASE +0x51909*4+0x02000000,0x41e1); +reg_write( DDR_REG_BASE +0x5190a*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE +0x5190b*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE +0x5190c*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE +0x5190d*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x5190e*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE +0x5190f*4+0x02000000,0xdb7c); +reg_write( DDR_REG_BASE +0x51910*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE +0x51911*4+0x02000000,0x3041); +reg_write( DDR_REG_BASE +0x51912*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE +0x51913*4+0x02000000,0xac6); +reg_write( DDR_REG_BASE +0x51914*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x51915*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE +0x51916*4+0x02000000,0xbfaa); +reg_write( DDR_REG_BASE +0x51917*4+0x02000000,0xc746); +reg_write( DDR_REG_BASE +0x51918*4+0x02000000,0xc106); +reg_write( DDR_REG_BASE +0x51919*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x5191a*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE +0x5191b*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE +0x5191c*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE +0x5191d*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE +0x5191e*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE +0x5191f*4+0x02000000,0xaae); +reg_write( DDR_REG_BASE +0x51920*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x51921*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE +0x51922*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE +0x51923*4+0x02000000,0xc106); +reg_write( DDR_REG_BASE +0x51924*4+0x02000000,0x724c); +reg_write( DDR_REG_BASE +0x51925*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE +0x51926*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE +0x51927*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE +0x51928*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE +0x51929*4+0x02000000,0x36c0); +reg_write( DDR_REG_BASE +0x5192a*4+0x02000000,0x2079); +reg_write( DDR_REG_BASE +0x5192b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5192c*4+0x02000000,0x205f); +reg_write( DDR_REG_BASE +0x5192d*4+0x02000000,0x20f); +reg_write( DDR_REG_BASE +0x5192e*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x5192f*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE +0x51930*4+0x02000000,0xa8a); +reg_write( DDR_REG_BASE +0x51931*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x51932*4+0x02000000,0xc740); +reg_write( DDR_REG_BASE +0x51933*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE +0x51934*4+0x02000000,0xc106); +reg_write( DDR_REG_BASE +0x51935*4+0x02000000,0x724c); +reg_write( DDR_REG_BASE +0x51936*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE +0x51937*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x51938*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE +0x51939*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE +0x5193a*4+0x02000000,0x36c0); +reg_write( DDR_REG_BASE +0x5193b*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE +0x5193c*4+0x02000000,0xa72); +reg_write( DDR_REG_BASE +0x5193d*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x5193e*4+0x02000000,0xc740); +reg_write( DDR_REG_BASE +0x5193f*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE +0x51940*4+0x02000000,0xc106); +reg_write( DDR_REG_BASE +0x51941*4+0x02000000,0x724c); +reg_write( DDR_REG_BASE +0x51942*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE +0x51943*4+0x02000000,0xb990); +reg_write( DDR_REG_BASE +0x51944*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x51945*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE +0x51946*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE +0x51947*4+0x02000000,0x36c0); +reg_write( DDR_REG_BASE +0x51948*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE +0x51949*4+0x02000000,0xa5a); +reg_write( DDR_REG_BASE +0x5194a*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x5194b*4+0x02000000,0xc740); +reg_write( DDR_REG_BASE +0x5194c*4+0x02000000,0xb16); +reg_write( DDR_REG_BASE +0x5194d*4+0x02000000,0xff0f); +reg_write( DDR_REG_BASE +0x5194e*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x5194f*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x51950*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE +0x51951*4+0x02000000,0xdb20); +reg_write( DDR_REG_BASE +0x51952*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE +0x51953*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE +0x51954*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE +0x51955*4+0x02000000,0xa42); +reg_write( DDR_REG_BASE +0x51956*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x51957*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE +0x51958*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE +0x51959*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x5195a*4+0x02000000,0x764c); +reg_write( DDR_REG_BASE +0x5195b*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE +0x5195c*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x5195d*4+0x02000000,0xdb26); +reg_write( DDR_REG_BASE +0x5195e*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE +0x5195f*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE +0x51960*4+0x02000000,0xa2a); +reg_write( DDR_REG_BASE +0x51961*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x51962*4+0x02000000,0x1c00); +reg_write( DDR_REG_BASE +0x51963*4+0x02000000,0x3041); +reg_write( DDR_REG_BASE +0x51964*4+0x02000000,0xc00a); +reg_write( DDR_REG_BASE +0x51965*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE +0x51966*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE +0x51967*4+0x02000000,0x7b0f); +reg_write( DDR_REG_BASE +0x51968*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x51969*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE +0x5196a*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE +0x5196b*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE +0x5196c*4+0x02000000,0xa12); +reg_write( DDR_REG_BASE +0x5196d*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x5196e*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE +0x5196f*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x51970*4+0x02000000,0x9ca); +reg_write( DDR_REG_BASE +0x51971*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x51972*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x51973*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE +0x51974*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE +0x51975*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE +0x51976*4+0x02000000,0xc008); +reg_write( DDR_REG_BASE +0x51977*4+0x02000000,0x7d0f); +reg_write( DDR_REG_BASE +0x51978*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE +0x51979*4+0x02000000,0x7214); +reg_write( DDR_REG_BASE +0x5197a*4+0x02000000,0x6d8); +reg_write( DDR_REG_BASE +0x5197b*4+0x02000000,0xffc5); +reg_write( DDR_REG_BASE +0x5197c*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x5197d*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x5197e*4+0x02000000,0x7105); +reg_write( DDR_REG_BASE +0x5197f*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE +0x51980*4+0x02000000,0xe1f2); +reg_write( DDR_REG_BASE +0x51981*4+0x02000000,0x912); +reg_write( DDR_REG_BASE +0x51982*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x51983*4+0x02000000,0x41a1); +reg_write( DDR_REG_BASE +0x51984*4+0x02000000,0x1200); +reg_write( DDR_REG_BASE +0x51985*4+0x02000000,0x3083); +reg_write( DDR_REG_BASE +0x51986*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x51987*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x51988*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE +0x51989*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE +0x5198a*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE +0x5198b*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE +0x5198c*4+0x02000000,0x9d2); +reg_write( DDR_REG_BASE +0x5198d*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x5198e*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE +0x5198f*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE +0x51990*4+0x02000000,0xf828); +reg_write( DDR_REG_BASE +0x51991*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE +0x51992*4+0x02000000,0x3041); +reg_write( DDR_REG_BASE +0x51993*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE +0x51994*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE +0x51995*4+0x02000000,0x9c2); +reg_write( DDR_REG_BASE +0x51996*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x51997*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE +0x51998*4+0x02000000,0xb76); +reg_write( DDR_REG_BASE +0x51999*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x5199a*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x5199b*4+0x02000000,0xbfaa); +reg_write( DDR_REG_BASE +0x5199c*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x5199d*4+0x02000000,0x41e1); +reg_write( DDR_REG_BASE +0x5199e*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE +0x5199f*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE +0x519a0*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE +0x519a1*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE +0x519a2*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE +0x519a3*4+0x02000000,0x9a6); +reg_write( DDR_REG_BASE +0x519a4*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x519a5*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE +0x519a6*4+0x02000000,0xca08); +reg_write( DDR_REG_BASE +0x519a7*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x519a8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x519a9*4+0x02000000,0x6100); +reg_write( DDR_REG_BASE +0x519aa*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE +0x519ab*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE +0x519ac*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x519ad*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE +0x519ae*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE +0x519af*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE +0x519b0*4+0x02000000,0x98a); +reg_write( DDR_REG_BASE +0x519b1*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x519b2*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE +0x519b3*4+0x02000000,0xc009); +reg_write( DDR_REG_BASE +0x519b4*4+0x02000000,0xf821); +reg_write( DDR_REG_BASE +0x519b5*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE +0x519b6*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE +0x519b7*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE +0x519b8*4+0x02000000,0x97a); +reg_write( DDR_REG_BASE +0x519b9*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x519ba*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE +0x519bb*4+0x02000000,0xf81b); +reg_write( DDR_REG_BASE +0x519bc*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE +0x519bd*4+0x02000000,0x30c1); +reg_write( DDR_REG_BASE +0x519be*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE +0x519bf*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE +0x519c0*4+0x02000000,0x96a); +reg_write( DDR_REG_BASE +0x519c1*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x519c2*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE +0x519c3*4+0x02000000,0xf814); +reg_write( DDR_REG_BASE +0x519c4*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE +0x519c5*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE +0x519c6*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE +0x519c7*4+0x02000000,0x95e); +reg_write( DDR_REG_BASE +0x519c8*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x519c9*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE +0x519ca*4+0x02000000,0xaf6); +reg_write( DDR_REG_BASE +0x519cb*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x519cc*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x519cd*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x519ce*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x519cf*4+0x02000000,0x764c); +reg_write( DDR_REG_BASE +0x519d0*4+0x02000000,0xdb26); +reg_write( DDR_REG_BASE +0x519d1*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE +0x519d2*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE +0x519d3*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE +0x519d4*4+0x02000000,0x942); +reg_write( DDR_REG_BASE +0x519d5*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x519d6*4+0x02000000,0x1c00); +reg_write( DDR_REG_BASE +0x519d7*4+0x02000000,0x3041); +reg_write( DDR_REG_BASE +0x519d8*4+0x02000000,0xf812); +reg_write( DDR_REG_BASE +0x519d9*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE +0x519da*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE +0x519db*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE +0x519dc*4+0x02000000,0x5eb); +reg_write( DDR_REG_BASE +0x519dd*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE +0x519de*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE +0x519df*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x519e0*4+0x02000000,0x47cb); +reg_write( DDR_REG_BASE +0x519e1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x519e2*4+0x02000000,0x4400); +reg_write( DDR_REG_BASE +0x519e3*4+0x02000000,0x41e1); +reg_write( DDR_REG_BASE +0x519e4*4+0x02000000,0x7d0f); +reg_write( DDR_REG_BASE +0x519e5*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x519e6*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE +0x519e7*4+0x02000000,0xdb7c); +reg_write( DDR_REG_BASE +0x519e8*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE +0x519e9*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x519ea*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x519eb*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x519ec*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE +0x519ed*4+0x02000000,0xdb10); +reg_write( DDR_REG_BASE +0x519ee*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE +0x519ef*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x519f0*4+0x02000000,0x79fb); +reg_write( DDR_REG_BASE +0x519f1*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x519f2*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE +0x519f3*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE +0x519f4*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE +0x519f5*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x519f6*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x519f7*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE +0x519f8*4+0x02000000,0x7b0f); +reg_write( DDR_REG_BASE +0x519f9*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x519fa*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE +0x519fb*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x519fc*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x519fd*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE +0x519fe*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE +0x519ff*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE +0x51a00*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE +0x51a01*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x51a02*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE +0x51a03*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE +0x51a04*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE +0x51a05*4+0x02000000,0xc1a6); +reg_write( DDR_REG_BASE +0x51a06*4+0x02000000,0x4608); +reg_write( DDR_REG_BASE +0x51a07*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x51a08*4+0x02000000,0x7100); +reg_write( DDR_REG_BASE +0x51a09*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE +0x51a0a*4+0x02000000,0x1e0); +reg_write( DDR_REG_BASE +0x51a0b*4+0x02000000,0x218a); +reg_write( DDR_REG_BASE +0x51a0c*4+0x02000000,0xffd); +reg_write( DDR_REG_BASE +0x51a0d*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE +0x51a0e*4+0x02000000,0x7824); +reg_write( DDR_REG_BASE +0x51a0f*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE +0x51a10*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x51a11*4+0x02000000,0x7100); +reg_write( DDR_REG_BASE +0x51a12*4+0x02000000,0x900e); +reg_write( DDR_REG_BASE +0x51a13*4+0x02000000,0x4c); +reg_write( DDR_REG_BASE +0x51a14*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE +0x51a15*4+0x02000000,0x8e19); +reg_write( DDR_REG_BASE +0x51a16*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE +0x51a17*4+0x02000000,0x8e10); +reg_write( DDR_REG_BASE +0x51a18*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE +0x51a19*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x51a1a*4+0x02000000,0x900e); +reg_write( DDR_REG_BASE +0x51a1b*4+0x02000000,0x4c); +reg_write( DDR_REG_BASE +0x51a1c*4+0x02000000,0x9001); +reg_write( DDR_REG_BASE +0x51a1d*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE +0x51a1e*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE +0x51a1f*4+0x02000000,0xe88a); +reg_write( DDR_REG_BASE +0x51a20*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x51a21*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51a22*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE +0x51a23*4+0x02000000,0x4100); +reg_write( DDR_REG_BASE +0x51a24*4+0x02000000,0x4200); +reg_write( DDR_REG_BASE +0x51a25*4+0x02000000,0xf3e); +reg_write( DDR_REG_BASE +0x51a26*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE +0x51a27*4+0x02000000,0x4300); +reg_write( DDR_REG_BASE +0x51a28*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE +0x51a29*4+0x02000000,0xb6e); +reg_write( DDR_REG_BASE +0x51a2a*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x51a2b*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE +0x51a2c*4+0x02000000,0x8608); +reg_write( DDR_REG_BASE +0x51a2d*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE +0x51a2e*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE +0x51a2f*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x51a30*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x51a31*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x51a32*4+0x02000000,0xe064); +reg_write( DDR_REG_BASE +0x51a33*4+0x02000000,0x9b6); +reg_write( DDR_REG_BASE +0x51a34*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE +0x51a35*4+0x02000000,0xb0a0); +reg_write( DDR_REG_BASE +0x51a36*4+0x02000000,0xa9e); +reg_write( DDR_REG_BASE +0x51a37*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x51a38*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE +0x51a39*4+0x02000000,0x8629); +reg_write( DDR_REG_BASE +0x51a3a*4+0x02000000,0xf26); +reg_write( DDR_REG_BASE +0x51a3b*4+0x02000000,0x60); +reg_write( DDR_REG_BASE +0x51a3c*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE +0x51a3d*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE +0x51a3e*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x51a3f*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x51a40*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE +0x51a41*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE +0x51a42*4+0x02000000,0xe1e0); +reg_write( DDR_REG_BASE +0x51a43*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x51a44*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x51a45*4+0x02000000,0xe064); +reg_write( DDR_REG_BASE +0x51a46*4+0x02000000,0x2042); +reg_write( DDR_REG_BASE +0x51a47*4+0x02000000,0x98f); +reg_write( DDR_REG_BASE +0x51a48*4+0x02000000,0xb7a0); +reg_write( DDR_REG_BASE +0x51a49*4+0x02000000,0xb7a0); +reg_write( DDR_REG_BASE +0x51a4a*4+0x02000000,0x1f9c); +reg_write( DDR_REG_BASE +0x51a4b*4+0x02000000,0x135c); +reg_write( DDR_REG_BASE +0x51a4c*4+0x02000000,0x1f9b); +reg_write( DDR_REG_BASE +0x51a4d*4+0x02000000,0x135c); +reg_write( DDR_REG_BASE +0x51a4e*4+0x02000000,0x1fe6); +reg_write( DDR_REG_BASE +0x51a4f*4+0x02000000,0x9f84); +reg_write( DDR_REG_BASE +0x51a50*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51a51*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE +0x51a52*4+0x02000000,0x1ff2); +reg_write( DDR_REG_BASE +0x51a53*4+0x02000000,0x9044); +reg_write( DDR_REG_BASE +0x51a54*4+0x02000000,0x1fe4); +reg_write( DDR_REG_BASE +0x51a55*4+0x02000000,0x9044); +reg_write( DDR_REG_BASE +0x51a56*4+0x02000000,0xffe); +reg_write( DDR_REG_BASE +0x51a57*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE +0x51a58*4+0x02000000,0x960e); +reg_write( DDR_REG_BASE +0x51a59*4+0x02000000,0xc100); +reg_write( DDR_REG_BASE +0x51a5a*4+0x02000000,0xc201); +reg_write( DDR_REG_BASE +0x51a5b*4+0x02000000,0xade); +reg_write( DDR_REG_BASE +0x51a5c*4+0x02000000,0x60); +reg_write( DDR_REG_BASE +0x51a5d*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE +0x51a5e*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE +0x51a5f*4+0x02000000,0xb02); +reg_write( DDR_REG_BASE +0x51a60*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x51a61*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE +0x51a62*4+0x02000000,0x8629); +reg_write( DDR_REG_BASE +0x51a63*4+0x02000000,0xed6); +reg_write( DDR_REG_BASE +0x51a64*4+0x02000000,0x60); +reg_write( DDR_REG_BASE +0x51a65*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE +0x51a66*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE +0x51a67*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x51a68*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x51a69*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE +0x51a6a*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE +0x51a6b*4+0x02000000,0xe1e0); +reg_write( DDR_REG_BASE +0x51a6c*4+0x02000000,0xb7a0); +reg_write( DDR_REG_BASE +0x51a6d*4+0x02000000,0x1fe6); +reg_write( DDR_REG_BASE +0x51a6e*4+0x02000000,0x9f84); +reg_write( DDR_REG_BASE +0x51a6f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51a70*4+0x02000000,0xff00); +reg_write( DDR_REG_BASE +0x51a71*4+0x02000000,0x1ff2); +reg_write( DDR_REG_BASE +0x51a72*4+0x02000000,0x9044); +reg_write( DDR_REG_BASE +0x51a73*4+0x02000000,0x1fe4); +reg_write( DDR_REG_BASE +0x51a74*4+0x02000000,0x9044); +reg_write( DDR_REG_BASE +0x51a75*4+0x02000000,0xfc2); +reg_write( DDR_REG_BASE +0x51a76*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE +0x51a77*4+0x02000000,0x960a); +reg_write( DDR_REG_BASE +0x51a78*4+0x02000000,0x8e58); +reg_write( DDR_REG_BASE +0x51a79*4+0x02000000,0x8601); +reg_write( DDR_REG_BASE +0x51a7a*4+0x02000000,0xa0e); +reg_write( DDR_REG_BASE +0x51a7b*4+0x02000000,0x60); +reg_write( DDR_REG_BASE +0x51a7c*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x51a7d*4+0x02000000,0xc100); +reg_write( DDR_REG_BASE +0x51a7e*4+0x02000000,0xc201); +reg_write( DDR_REG_BASE +0x51a7f*4+0x02000000,0xa96); +reg_write( DDR_REG_BASE +0x51a80*4+0x02000000,0x60); +reg_write( DDR_REG_BASE +0x51a81*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE +0x51a82*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE +0x51a83*4+0x02000000,0xaba); +reg_write( DDR_REG_BASE +0x51a84*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x51a85*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE +0x51a86*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE +0x51a87*4+0x02000000,0xe808); +reg_write( DDR_REG_BASE +0x51a88*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE +0x51a89*4+0x02000000,0x9b2); +reg_write( DDR_REG_BASE +0x51a8a*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x51a8b*4+0x02000000,0x2078); +reg_write( DDR_REG_BASE +0x51a8c*4+0x02000000,0x100); +reg_write( DDR_REG_BASE +0x51a8d*4+0x02000000,0xf012); +reg_write( DDR_REG_BASE +0x51a8e*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE +0x51a8f*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x51a90*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51a91*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE +0x51a92*4+0x02000000,0x4220); +reg_write( DDR_REG_BASE +0x51a93*4+0x02000000,0x7414); +reg_write( DDR_REG_BASE +0x51a94*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x51a95*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51a96*4+0x02000000,0xfffe); +reg_write( DDR_REG_BASE +0x51a97*4+0x02000000,0x22ca); +reg_write( DDR_REG_BASE +0x51a98*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x51a99*4+0x02000000,0x20ca); +reg_write( DDR_REG_BASE +0x51a9a*4+0x02000000,0x41); +reg_write( DDR_REG_BASE +0x51a9b*4+0x02000000,0xe52); +reg_write( DDR_REG_BASE +0x51a9c*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE +0x51a9d*4+0x02000000,0x4320); +reg_write( DDR_REG_BASE +0x51a9e*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x51a9f*4+0x02000000,0x7100); +reg_write( DDR_REG_BASE +0x51aa0*4+0x02000000,0x900e); +reg_write( DDR_REG_BASE +0x51aa1*4+0x02000000,0x4c); +reg_write( DDR_REG_BASE +0x51aa2*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE +0x51aa3*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x51aa4*4+0x02000000,0x900e); +reg_write( DDR_REG_BASE +0x51aa5*4+0x02000000,0x4c); +reg_write( DDR_REG_BASE +0x51aa6*4+0x02000000,0x9001); +reg_write( DDR_REG_BASE +0x51aa7*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE +0x51aa8*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE +0x51aa9*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x51aaa*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE +0x51aab*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE +0x51aac*4+0x02000000,0xe1e0); +reg_write( DDR_REG_BASE +0x51aad*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE +0x51aae*4+0x02000000,0x8629); +reg_write( DDR_REG_BASE +0x51aaf*4+0x02000000,0x2078); +reg_write( DDR_REG_BASE +0x51ab0*4+0x02000000,0x100); +reg_write( DDR_REG_BASE +0x51ab1*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE +0x51ab2*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE +0x51ab3*4+0x02000000,0x7504); +reg_write( DDR_REG_BASE +0x51ab4*4+0x02000000,0xe32); +reg_write( DDR_REG_BASE +0x51ab5*4+0x02000000,0x60); +reg_write( DDR_REG_BASE +0x51ab6*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE +0x51ab7*4+0x02000000,0x8608); +reg_write( DDR_REG_BASE +0x51ab8*4+0x02000000,0x706f); +reg_write( DDR_REG_BASE +0x51ab9*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE +0x51aba*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x51abb*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x51abc*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x51abd*4+0x02000000,0xe064); +reg_write( DDR_REG_BASE +0x51abe*4+0x02000000,0x89e); +reg_write( DDR_REG_BASE +0x51abf*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE +0x51ac0*4+0x02000000,0x1800); +reg_write( DDR_REG_BASE +0x51ac1*4+0x02000000,0x6c4); +reg_write( DDR_REG_BASE +0x51ac2*4+0x02000000,0x986); +reg_write( DDR_REG_BASE +0x51ac3*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x51ac4*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE +0x51ac5*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x51ac6*4+0x02000000,0x1f00); +reg_write( DDR_REG_BASE +0x51ac7*4+0x02000000,0x16c4); +reg_write( DDR_REG_BASE +0x51ac8*4+0x02000000,0x1f9c); +reg_write( DDR_REG_BASE +0x51ac9*4+0x02000000,0x16dc); +reg_write( DDR_REG_BASE +0x51aca*4+0x02000000,0x1f9b); +reg_write( DDR_REG_BASE +0x51acb*4+0x02000000,0x16dc); +reg_write( DDR_REG_BASE +0x51acc*4+0x02000000,0x1fe6); +reg_write( DDR_REG_BASE +0x51acd*4+0x02000000,0x9f84); +reg_write( DDR_REG_BASE +0x51ace*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51acf*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE +0x51ad0*4+0x02000000,0x1ff2); +reg_write( DDR_REG_BASE +0x51ad1*4+0x02000000,0x9044); +reg_write( DDR_REG_BASE +0x51ad2*4+0x02000000,0x1fe4); +reg_write( DDR_REG_BASE +0x51ad3*4+0x02000000,0x9044); +reg_write( DDR_REG_BASE +0x51ad4*4+0x02000000,0x960e); +reg_write( DDR_REG_BASE +0x51ad5*4+0x02000000,0xf02); +reg_write( DDR_REG_BASE +0x51ad6*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE +0x51ad7*4+0x02000000,0x4528); +reg_write( DDR_REG_BASE +0x51ad8*4+0x02000000,0xc100); +reg_write( DDR_REG_BASE +0x51ad9*4+0x02000000,0xc201); +reg_write( DDR_REG_BASE +0x51ada*4+0x02000000,0x9de); +reg_write( DDR_REG_BASE +0x51adb*4+0x02000000,0x60); +reg_write( DDR_REG_BASE +0x51adc*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE +0x51add*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE +0x51ade*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE +0x51adf*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x51ae0*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE +0x51ae1*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE +0x51ae2*4+0x02000000,0xe1e0); +reg_write( DDR_REG_BASE +0x51ae3*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE +0x51ae4*4+0x02000000,0x9f6); +reg_write( DDR_REG_BASE +0x51ae5*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x51ae6*4+0x02000000,0x1f00); +reg_write( DDR_REG_BASE +0x51ae7*4+0x02000000,0x16c4); +reg_write( DDR_REG_BASE +0x51ae8*4+0x02000000,0x8629); +reg_write( DDR_REG_BASE +0x51ae9*4+0x02000000,0xdca); +reg_write( DDR_REG_BASE +0x51aea*4+0x02000000,0x60); +reg_write( DDR_REG_BASE +0x51aeb*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE +0x51aec*4+0x02000000,0x1fe6); +reg_write( DDR_REG_BASE +0x51aed*4+0x02000000,0x9f84); +reg_write( DDR_REG_BASE +0x51aee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51aef*4+0x02000000,0xff00); +reg_write( DDR_REG_BASE +0x51af0*4+0x02000000,0x1ff2); +reg_write( DDR_REG_BASE +0x51af1*4+0x02000000,0x9344); +reg_write( DDR_REG_BASE +0x51af2*4+0x02000000,0x1fe4); +reg_write( DDR_REG_BASE +0x51af3*4+0x02000000,0x9344); +reg_write( DDR_REG_BASE +0x51af4*4+0x02000000,0x8605); +reg_write( DDR_REG_BASE +0x51af5*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x51af6*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE +0x51af7*4+0x02000000,0xebe); +reg_write( DDR_REG_BASE +0x51af8*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE +0x51af9*4+0x02000000,0x7810); +reg_write( DDR_REG_BASE +0x51afa*4+0x02000000,0xc100); +reg_write( DDR_REG_BASE +0x51afb*4+0x02000000,0xc201); +reg_write( DDR_REG_BASE +0x51afc*4+0x02000000,0x99a); +reg_write( DDR_REG_BASE +0x51afd*4+0x02000000,0x60); +reg_write( DDR_REG_BASE +0x51afe*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE +0x51aff*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE +0x51b00*4+0x02000000,0xe806); +reg_write( DDR_REG_BASE +0x51b01*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE +0x51b02*4+0x02000000,0x8be); +reg_write( DDR_REG_BASE +0x51b03*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x51b04*4+0x02000000,0x2079); +reg_write( DDR_REG_BASE +0x51b05*4+0x02000000,0x100); +reg_write( DDR_REG_BASE +0x51b06*4+0x02000000,0x8e58); +reg_write( DDR_REG_BASE +0x51b07*4+0x02000000,0x8603); +reg_write( DDR_REG_BASE +0x51b08*4+0x02000000,0x8f2); +reg_write( DDR_REG_BASE +0x51b09*4+0x02000000,0x60); +reg_write( DDR_REG_BASE +0x51b0a*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x51b0b*4+0x02000000,0xc0a6); +reg_write( DDR_REG_BASE +0x51b0c*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE +0x51b0d*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE +0x51b0e*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE +0x51b0f*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x51b10*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE +0x51b11*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE +0x51b12*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE +0x51b13*4+0x02000000,0xc1a8); +reg_write( DDR_REG_BASE +0x51b14*4+0x02000000,0x4608); +reg_write( DDR_REG_BASE +0x51b15*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x51b16*4+0x02000000,0x7100); +reg_write( DDR_REG_BASE +0x51b17*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE +0x51b18*4+0x02000000,0x1e0); +reg_write( DDR_REG_BASE +0x51b19*4+0x02000000,0x218a); +reg_write( DDR_REG_BASE +0x51b1a*4+0x02000000,0xffd); +reg_write( DDR_REG_BASE +0x51b1b*4+0x02000000,0xc047); +reg_write( DDR_REG_BASE +0x51b1c*4+0x02000000,0x7824); +reg_write( DDR_REG_BASE +0x51b1d*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE +0x51b1e*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x51b1f*4+0x02000000,0x7100); +reg_write( DDR_REG_BASE +0x51b20*4+0x02000000,0x900e); +reg_write( DDR_REG_BASE +0x51b21*4+0x02000000,0x4c); +reg_write( DDR_REG_BASE +0x51b22*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE +0x51b23*4+0x02000000,0x8e19); +reg_write( DDR_REG_BASE +0x51b24*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE +0x51b25*4+0x02000000,0x8e10); +reg_write( DDR_REG_BASE +0x51b26*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE +0x51b27*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x51b28*4+0x02000000,0x900e); +reg_write( DDR_REG_BASE +0x51b29*4+0x02000000,0x4c); +reg_write( DDR_REG_BASE +0x51b2a*4+0x02000000,0x9001); +reg_write( DDR_REG_BASE +0x51b2b*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE +0x51b2c*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE +0x51b2d*4+0x02000000,0xe88a); +reg_write( DDR_REG_BASE +0x51b2e*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x51b2f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51b30*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE +0x51b31*4+0x02000000,0x4100); +reg_write( DDR_REG_BASE +0x51b32*4+0x02000000,0x4200); +reg_write( DDR_REG_BASE +0x51b33*4+0x02000000,0xd22); +reg_write( DDR_REG_BASE +0x51b34*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE +0x51b35*4+0x02000000,0x4300); +reg_write( DDR_REG_BASE +0x51b36*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE +0x51b37*4+0x02000000,0x952); +reg_write( DDR_REG_BASE +0x51b38*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x51b39*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE +0x51b3a*4+0x02000000,0xc102); +reg_write( DDR_REG_BASE +0x51b3b*4+0x02000000,0x8608); +reg_write( DDR_REG_BASE +0x51b3c*4+0x02000000,0x2179); +reg_write( DDR_REG_BASE +0x51b3d*4+0x02000000,0x101); +reg_write( DDR_REG_BASE +0x51b3e*4+0x02000000,0xe46); +reg_write( DDR_REG_BASE +0x51b3f*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE +0x51b40*4+0x02000000,0xc144); +reg_write( DDR_REG_BASE +0x51b41*4+0x02000000,0x88a); +reg_write( DDR_REG_BASE +0x51b42*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x51b43*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE +0x51b44*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE +0x51b45*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x51b46*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE +0x51b47*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE +0x51b48*4+0x02000000,0xe1e0); +reg_write( DDR_REG_BASE +0x51b49*4+0x02000000,0x8629); +reg_write( DDR_REG_BASE +0x51b4a*4+0x02000000,0xd06); +reg_write( DDR_REG_BASE +0x51b4b*4+0x02000000,0x60); +reg_write( DDR_REG_BASE +0x51b4c*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE +0x51b4d*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE +0x51b4e*4+0x02000000,0x47cb); +reg_write( DDR_REG_BASE +0x51b4f*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x51b50*4+0x02000000,0xe03e); +reg_write( DDR_REG_BASE +0x51b51*4+0x02000000,0xb7a0); +reg_write( DDR_REG_BASE +0x51b52*4+0x02000000,0x1f9b); +reg_write( DDR_REG_BASE +0x51b53*4+0x02000000,0x135c); +reg_write( DDR_REG_BASE +0x51b54*4+0x02000000,0x1f9c); +reg_write( DDR_REG_BASE +0x51b55*4+0x02000000,0x135c); +reg_write( DDR_REG_BASE +0x51b56*4+0x02000000,0x1fe6); +reg_write( DDR_REG_BASE +0x51b57*4+0x02000000,0x9f84); +reg_write( DDR_REG_BASE +0x51b58*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51b59*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE +0x51b5a*4+0x02000000,0x1ff2); +reg_write( DDR_REG_BASE +0x51b5b*4+0x02000000,0x9045); +reg_write( DDR_REG_BASE +0x51b5c*4+0x02000000,0x1fe4); +reg_write( DDR_REG_BASE +0x51b5d*4+0x02000000,0x9045); +reg_write( DDR_REG_BASE +0x51b5e*4+0x02000000,0x960e); +reg_write( DDR_REG_BASE +0x51b5f*4+0x02000000,0xdee); +reg_write( DDR_REG_BASE +0x51b60*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE +0x51b61*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x51b62*4+0x02000000,0xc100); +reg_write( DDR_REG_BASE +0x51b63*4+0x02000000,0xc201); +reg_write( DDR_REG_BASE +0x51b64*4+0x02000000,0x8ca); +reg_write( DDR_REG_BASE +0x51b65*4+0x02000000,0x60); +reg_write( DDR_REG_BASE +0x51b66*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE +0x51b67*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE +0x51b68*4+0x02000000,0x8ee); +reg_write( DDR_REG_BASE +0x51b69*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x51b6a*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE +0x51b6b*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE +0x51b6c*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x51b6d*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x51b6e*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE +0x51b6f*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE +0x51b70*4+0x02000000,0xe1e0); +reg_write( DDR_REG_BASE +0x51b71*4+0x02000000,0xb7a0); +reg_write( DDR_REG_BASE +0x51b72*4+0x02000000,0xdc6); +reg_write( DDR_REG_BASE +0x51b73*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE +0x51b74*4+0x02000000,0x960a); +reg_write( DDR_REG_BASE +0x51b75*4+0x02000000,0x8e58); +reg_write( DDR_REG_BASE +0x51b76*4+0x02000000,0x8602); +reg_write( DDR_REG_BASE +0x51b77*4+0x02000000,0x816); +reg_write( DDR_REG_BASE +0x51b78*4+0x02000000,0x60); +reg_write( DDR_REG_BASE +0x51b79*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x51b7a*4+0x02000000,0xc100); +reg_write( DDR_REG_BASE +0x51b7b*4+0x02000000,0xc201); +reg_write( DDR_REG_BASE +0x51b7c*4+0x02000000,0x89a); +reg_write( DDR_REG_BASE +0x51b7d*4+0x02000000,0x60); +reg_write( DDR_REG_BASE +0x51b7e*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE +0x51b7f*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE +0x51b80*4+0x02000000,0x8be); +reg_write( DDR_REG_BASE +0x51b81*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x51b82*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE +0x51b83*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE +0x51b84*4+0x02000000,0xe805); +reg_write( DDR_REG_BASE +0x51b85*4+0x02000000,0xfba); +reg_write( DDR_REG_BASE +0x51b86*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE +0x51b87*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE +0x51b88*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE +0x51b89*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE +0x51b8a*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x51b8b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51b8c*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE +0x51b8d*4+0x02000000,0x42c3); +reg_write( DDR_REG_BASE +0x51b8e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51b8f*4+0x02000000,0xfffe); +reg_write( DDR_REG_BASE +0x51b90*4+0x02000000,0x7414); +reg_write( DDR_REG_BASE +0x51b91*4+0x02000000,0x4020); +reg_write( DDR_REG_BASE +0x51b92*4+0x02000000,0x20ca); +reg_write( DDR_REG_BASE +0x51b93*4+0x02000000,0x81); +reg_write( DDR_REG_BASE +0x51b94*4+0x02000000,0x22ca); +reg_write( DDR_REG_BASE +0x51b95*4+0x02000000,0x41); +reg_write( DDR_REG_BASE +0x51b96*4+0x02000000,0xc5a); +reg_write( DDR_REG_BASE +0x51b97*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE +0x51b98*4+0x02000000,0x4320); +reg_write( DDR_REG_BASE +0x51b99*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x51b9a*4+0x02000000,0x7100); +reg_write( DDR_REG_BASE +0x51b9b*4+0x02000000,0x900e); +reg_write( DDR_REG_BASE +0x51b9c*4+0x02000000,0x4c); +reg_write( DDR_REG_BASE +0x51b9d*4+0x02000000,0xc046); +reg_write( DDR_REG_BASE +0x51b9e*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x51b9f*4+0x02000000,0x900e); +reg_write( DDR_REG_BASE +0x51ba0*4+0x02000000,0x4c); +reg_write( DDR_REG_BASE +0x51ba1*4+0x02000000,0x9001); +reg_write( DDR_REG_BASE +0x51ba2*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE +0x51ba3*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE +0x51ba4*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x51ba5*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE +0x51ba6*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE +0x51ba7*4+0x02000000,0xe1e0); +reg_write( DDR_REG_BASE +0x51ba8*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE +0x51ba9*4+0x02000000,0x8629); +reg_write( DDR_REG_BASE +0x51baa*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE +0x51bab*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE +0x51bac*4+0x02000000,0xe007); +reg_write( DDR_REG_BASE +0x51bad*4+0x02000000,0xc42); +reg_write( DDR_REG_BASE +0x51bae*4+0x02000000,0x60); +reg_write( DDR_REG_BASE +0x51baf*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE +0x51bb0*4+0x02000000,0x8608); +reg_write( DDR_REG_BASE +0x51bb1*4+0x02000000,0xd62); +reg_write( DDR_REG_BASE +0x51bb2*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE +0x51bb3*4+0x02000000,0xc104); +reg_write( DDR_REG_BASE +0x51bb4*4+0x02000000,0xfa2); +reg_write( DDR_REG_BASE +0x51bb5*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE +0x51bb6*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE +0x51bb7*4+0x02000000,0x706f); +reg_write( DDR_REG_BASE +0x51bb8*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x51bb9*4+0x02000000,0x1f00); +reg_write( DDR_REG_BASE +0x51bba*4+0x02000000,0x16c4); +reg_write( DDR_REG_BASE +0x51bbb*4+0x02000000,0x1f9b); +reg_write( DDR_REG_BASE +0x51bbc*4+0x02000000,0x16dc); +reg_write( DDR_REG_BASE +0x51bbd*4+0x02000000,0x1f9c); +reg_write( DDR_REG_BASE +0x51bbe*4+0x02000000,0x16dc); +reg_write( DDR_REG_BASE +0x51bbf*4+0x02000000,0x1fe6); +reg_write( DDR_REG_BASE +0x51bc0*4+0x02000000,0x9f84); +reg_write( DDR_REG_BASE +0x51bc1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51bc2*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE +0x51bc3*4+0x02000000,0x1ff2); +reg_write( DDR_REG_BASE +0x51bc4*4+0x02000000,0x9044); +reg_write( DDR_REG_BASE +0x51bc5*4+0x02000000,0x1fe4); +reg_write( DDR_REG_BASE +0x51bc6*4+0x02000000,0x9044); +reg_write( DDR_REG_BASE +0x51bc7*4+0x02000000,0x960e); +reg_write( DDR_REG_BASE +0x51bc8*4+0x02000000,0xd1a); +reg_write( DDR_REG_BASE +0x51bc9*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE +0x51bca*4+0x02000000,0x4528); +reg_write( DDR_REG_BASE +0x51bcb*4+0x02000000,0xc106); +reg_write( DDR_REG_BASE +0x51bcc*4+0x02000000,0xc200); +reg_write( DDR_REG_BASE +0x51bcd*4+0x02000000,0xffa); +reg_write( DDR_REG_BASE +0x51bce*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x51bcf*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE +0x51bd0*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE +0x51bd1*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE +0x51bd2*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x51bd3*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE +0x51bd4*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE +0x51bd5*4+0x02000000,0xe1e0); +reg_write( DDR_REG_BASE +0x51bd6*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE +0x51bd7*4+0x02000000,0x812); +reg_write( DDR_REG_BASE +0x51bd8*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x51bd9*4+0x02000000,0x1f00); +reg_write( DDR_REG_BASE +0x51bda*4+0x02000000,0x16c4); +reg_write( DDR_REG_BASE +0x51bdb*4+0x02000000,0x8629); +reg_write( DDR_REG_BASE +0x51bdc*4+0x02000000,0xbe2); +reg_write( DDR_REG_BASE +0x51bdd*4+0x02000000,0x60); +reg_write( DDR_REG_BASE +0x51bde*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE +0x51bdf*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x51be0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51be1*4+0x02000000,0xff00); +reg_write( DDR_REG_BASE +0x51be2*4+0x02000000,0x1fe6); +reg_write( DDR_REG_BASE +0x51be3*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE +0x51be4*4+0x02000000,0x1ff2); +reg_write( DDR_REG_BASE +0x51be5*4+0x02000000,0x9344); +reg_write( DDR_REG_BASE +0x51be6*4+0x02000000,0x1fe4); +reg_write( DDR_REG_BASE +0x51be7*4+0x02000000,0x9344); +reg_write( DDR_REG_BASE +0x51be8*4+0x02000000,0x8605); +reg_write( DDR_REG_BASE +0x51be9*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x51bea*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE +0x51beb*4+0x02000000,0xcd6); +reg_write( DDR_REG_BASE +0x51bec*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE +0x51bed*4+0x02000000,0x7810); +reg_write( DDR_REG_BASE +0x51bee*4+0x02000000,0xc106); +reg_write( DDR_REG_BASE +0x51bef*4+0x02000000,0xc200); +reg_write( DDR_REG_BASE +0x51bf0*4+0x02000000,0xfb2); +reg_write( DDR_REG_BASE +0x51bf1*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x51bf2*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE +0x51bf3*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE +0x51bf4*4+0x02000000,0xe806); +reg_write( DDR_REG_BASE +0x51bf5*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE +0x51bf6*4+0x02000000,0xed6); +reg_write( DDR_REG_BASE +0x51bf7*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE +0x51bf8*4+0x02000000,0x2078); +reg_write( DDR_REG_BASE +0x51bf9*4+0x02000000,0x100); +reg_write( DDR_REG_BASE +0x51bfa*4+0x02000000,0x8e58); +reg_write( DDR_REG_BASE +0x51bfb*4+0x02000000,0x8603); +reg_write( DDR_REG_BASE +0x51bfc*4+0x02000000,0xf0a); +reg_write( DDR_REG_BASE +0x51bfd*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x51bfe*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x51bff*4+0x02000000,0xc0a8); +reg_write( DDR_REG_BASE +0x51c00*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE +0x51c01*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE +0x51c02*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE +0x51c03*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x51c04*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE +0x51c05*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE +0x51c06*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE +0x51c07*4+0x02000000,0x2482); +reg_write( DDR_REG_BASE +0x51c08*4+0x02000000,0x3403); +reg_write( DDR_REG_BASE +0x51c09*4+0x02000000,0xffa); +reg_write( DDR_REG_BASE +0x51c0a*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE +0x51c0b*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x51c0c*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x51c0d*4+0x02000000,0x7083); +reg_write( DDR_REG_BASE +0x51c0e*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x51c0f*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x51c10*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE +0x51c11*4+0x02000000,0xc087); +reg_write( DDR_REG_BASE +0x51c12*4+0x02000000,0xd9ff); +reg_write( DDR_REG_BASE +0x51c13*4+0x02000000,0x86e); +reg_write( DDR_REG_BASE +0x51c14*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE +0x51c15*4+0x02000000,0xdab4); +reg_write( DDR_REG_BASE +0x51c16*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x51c17*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51c18*4+0x02000000,0x2100); +reg_write( DDR_REG_BASE +0x51c19*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE +0x51c1a*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x51c1b*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE +0x51c1c*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x51c1d*4+0x02000000,0xe004); +reg_write( DDR_REG_BASE +0x51c1e*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x51c1f*4+0x02000000,0x7084); +reg_write( DDR_REG_BASE +0x51c20*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x51c21*4+0x02000000,0xfec4); +reg_write( DDR_REG_BASE +0x51c22*4+0x02000000,0xca08); +reg_write( DDR_REG_BASE +0x51c23*4+0x02000000,0xf014); +reg_write( DDR_REG_BASE +0x51c24*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x51c25*4+0x02000000,0x4528); +reg_write( DDR_REG_BASE +0x51c26*4+0x02000000,0x2244); +reg_write( DDR_REG_BASE +0x51c27*4+0x02000000,0x7c1); +reg_write( DDR_REG_BASE +0x51c28*4+0x02000000,0x6a81); +reg_write( DDR_REG_BASE +0x51c29*4+0x02000000,0x229a); +reg_write( DDR_REG_BASE +0x51c2a*4+0x02000000,0x8); +reg_write( DDR_REG_BASE +0x51c2b*4+0x02000000,0xe906); +reg_write( DDR_REG_BASE +0x51c2c*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE +0x51c2d*4+0x02000000,0x901); +reg_write( DDR_REG_BASE +0x51c2e*4+0x02000000,0x31); +reg_write( DDR_REG_BASE +0x51c2f*4+0x02000000,0x7dbb); +reg_write( DDR_REG_BASE +0x51c30*4+0x02000000,0x2205); +reg_write( DDR_REG_BASE +0x51c31*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE +0x51c32*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x51c33*4+0x02000000,0xe0c4); +reg_write( DDR_REG_BASE +0x51c34*4+0x02000000,0xb1a0); +reg_write( DDR_REG_BASE +0x51c35*4+0x02000000,0x4281); +reg_write( DDR_REG_BASE +0x51c36*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x51c37*4+0x02000000,0xadd); +reg_write( DDR_REG_BASE +0x51c38*4+0x02000000,0x8234); +reg_write( DDR_REG_BASE +0x51c39*4+0x02000000,0xc140); +reg_write( DDR_REG_BASE +0x51c3a*4+0x02000000,0x231a); +reg_write( DDR_REG_BASE +0x51c3b*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE +0x51c3c*4+0x02000000,0x10); +reg_write( DDR_REG_BASE +0x51c3d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51c3e*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x51c3f*4+0x02000000,0x709b); +reg_write( DDR_REG_BASE +0x51c40*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x51c41*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE +0x51c42*4+0x02000000,0xc145); +reg_write( DDR_REG_BASE +0x51c43*4+0x02000000,0xd907); +reg_write( DDR_REG_BASE +0x51c44*4+0x02000000,0x7916); +reg_write( DDR_REG_BASE +0x51c45*4+0x02000000,0xc143); +reg_write( DDR_REG_BASE +0x51c46*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE +0x51c47*4+0x02000000,0xe098); +reg_write( DDR_REG_BASE +0x51c48*4+0x02000000,0x1b4); +reg_write( DDR_REG_BASE +0x51c49*4+0x02000000,0xd); +reg_write( DDR_REG_BASE +0x51c4a*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x51c4b*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x51c4c*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE +0x51c4d*4+0x02000000,0x8821); +reg_write( DDR_REG_BASE +0x51c4e*4+0x02000000,0xf016); +reg_write( DDR_REG_BASE +0x51c4f*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE +0x51c50*4+0x02000000,0x2055); +reg_write( DDR_REG_BASE +0x51c51*4+0x02000000,0x8c2); +reg_write( DDR_REG_BASE +0x51c52*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE +0x51c53*4+0x02000000,0x7a05); +reg_write( DDR_REG_BASE +0x51c54*4+0x02000000,0xd8ef); +reg_write( DDR_REG_BASE +0x51c55*4+0x02000000,0x2004); +reg_write( DDR_REG_BASE +0x51c56*4+0x02000000,0x6c0); +reg_write( DDR_REG_BASE +0x51c57*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE +0x51c58*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x51c59*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51c5a*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE +0x51c5b*4+0x02000000,0x7167); +reg_write( DDR_REG_BASE +0x51c5c*4+0x02000000,0x7845); +reg_write( DDR_REG_BASE +0x51c5d*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE +0x51c5e*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x51c5f*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE +0x51c60*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE +0x51c61*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x51c62*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE +0x51c63*4+0x02000000,0xb200); +reg_write( DDR_REG_BASE +0x51c64*4+0x02000000,0x202f); +reg_write( DDR_REG_BASE +0x51c65*4+0x02000000,0x6c7); +reg_write( DDR_REG_BASE +0x51c66*4+0x02000000,0x9d3); +reg_write( DDR_REG_BASE +0x51c67*4+0x02000000,0x8005); +reg_write( DDR_REG_BASE +0x51c68*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x51c69*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51c6a*4+0x02000000,0x2100); +reg_write( DDR_REG_BASE +0x51c6b*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE +0x51c6c*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x51c6d*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE +0x51c6e*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x51c6f*4+0x02000000,0xe004); +reg_write( DDR_REG_BASE +0x51c70*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x51c71*4+0x02000000,0x7344); +reg_write( DDR_REG_BASE +0x51c72*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x51c73*4+0x02000000,0xfe64); +reg_write( DDR_REG_BASE +0x51c74*4+0x02000000,0xd32); +reg_write( DDR_REG_BASE +0x51c75*4+0x02000000,0xff8f); +reg_write( DDR_REG_BASE +0x51c76*4+0x02000000,0xd2e); +reg_write( DDR_REG_BASE +0x51c77*4+0x02000000,0xff8f); +reg_write( DDR_REG_BASE +0x51c78*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE +0x51c79*4+0x02000000,0xece); +reg_write( DDR_REG_BASE +0x51c7a*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE +0x51c7b*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE +0x51c7c*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE +0x51c7d*4+0x02000000,0xaa2); +reg_write( DDR_REG_BASE +0x51c7e*4+0x02000000,0x60); +reg_write( DDR_REG_BASE +0x51c7f*4+0x02000000,0x218a); +reg_write( DDR_REG_BASE +0x51c80*4+0x02000000,0xfc7); +reg_write( DDR_REG_BASE +0x51c81*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE +0x51c82*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE +0x51c83*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x51c84*4+0x02000000,0xe024); +reg_write( DDR_REG_BASE +0x51c85*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x51c86*4+0x02000000,0xb600); +reg_write( DDR_REG_BASE +0x51c87*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE +0x51c88*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE +0x51c89*4+0x02000000,0xb606); +reg_write( DDR_REG_BASE +0x51c8a*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE +0x51c8b*4+0x02000000,0x3c4); +reg_write( DDR_REG_BASE +0x51c8c*4+0x02000000,0x1efe); +reg_write( DDR_REG_BASE +0x51c8d*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE +0x51c8e*4+0x02000000,0xb8e); +reg_write( DDR_REG_BASE +0x51c8f*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE +0x51c90*4+0x02000000,0xd818); +reg_write( DDR_REG_BASE +0x51c91*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE +0x51c92*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x51c93*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x51c94*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE +0x51c95*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x51c96*4+0x02000000,0xe004); +reg_write( DDR_REG_BASE +0x51c97*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE +0x51c98*4+0x02000000,0xe8e); +reg_write( DDR_REG_BASE +0x51c99*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE +0x51c9a*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE +0x51c9b*4+0x02000000,0xd807); +reg_write( DDR_REG_BASE +0x51c9c*4+0x02000000,0xb72); +reg_write( DDR_REG_BASE +0x51c9d*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE +0x51c9e*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x51c9f*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE +0x51ca0*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE +0x51ca1*4+0x02000000,0xb600); +reg_write( DDR_REG_BASE +0x51ca2*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE +0x51ca3*4+0x02000000,0xb606); +reg_write( DDR_REG_BASE +0x51ca4*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE +0x51ca5*4+0x02000000,0xe76); +reg_write( DDR_REG_BASE +0x51ca6*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE +0x51ca7*4+0x02000000,0x1efe); +reg_write( DDR_REG_BASE +0x51ca8*4+0x02000000,0x93c5); +reg_write( DDR_REG_BASE +0x51ca9*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE +0x51caa*4+0x02000000,0xb56); +reg_write( DDR_REG_BASE +0x51cab*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE +0x51cac*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x51cad*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE +0x51cae*4+0x02000000,0xe62); +reg_write( DDR_REG_BASE +0x51caf*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE +0x51cb0*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE +0x51cb1*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x51cb2*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x51cb3*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x51cb4*4+0x02000000,0x1fc5); +reg_write( DDR_REG_BASE +0x51cb5*4+0x02000000,0x1e0c); +reg_write( DDR_REG_BASE +0x51cb6*4+0x02000000,0x1fc5); +reg_write( DDR_REG_BASE +0x51cb7*4+0x02000000,0xb3e); +reg_write( DDR_REG_BASE +0x51cb8*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE +0x51cb9*4+0x02000000,0x1efe); +reg_write( DDR_REG_BASE +0x51cba*4+0x02000000,0x9344); +reg_write( DDR_REG_BASE +0x51cbb*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x51cbc*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x51cbd*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE +0x51cbe*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x51cbf*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE +0x51cc0*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x51cc1*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE +0x51cc2*4+0x02000000,0x8801); +reg_write( DDR_REG_BASE +0x51cc3*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE +0x51cc4*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE +0x51cc5*4+0x02000000,0x64); +reg_write( DDR_REG_BASE +0x51cc6*4+0x02000000,0x4338); +reg_write( DDR_REG_BASE +0x51cc7*4+0x02000000,0xc046); +reg_write( DDR_REG_BASE +0x51cc8*4+0x02000000,0xf04f); +reg_write( DDR_REG_BASE +0x51cc9*4+0x02000000,0x221a); +reg_write( DDR_REG_BASE +0x51cca*4+0x02000000,0xf9e); +reg_write( DDR_REG_BASE +0x51ccb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51ccc*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE +0x51ccd*4+0x02000000,0x708d); +reg_write( DDR_REG_BASE +0x51cce*4+0x02000000,0x716d); +reg_write( DDR_REG_BASE +0x51ccf*4+0x02000000,0xf046); +reg_write( DDR_REG_BASE +0x51cd0*4+0x02000000,0x225f); +reg_write( DDR_REG_BASE +0x51cd1*4+0x02000000,0x480); +reg_write( DDR_REG_BASE +0x51cd2*4+0x02000000,0x74b5); +reg_write( DDR_REG_BASE +0x51cd3*4+0x02000000,0x24c0); +reg_write( DDR_REG_BASE +0x51cd4*4+0x02000000,0x1061); +reg_write( DDR_REG_BASE +0x51cd5*4+0x02000000,0x23ca); +reg_write( DDR_REG_BASE +0x51cd6*4+0x02000000,0x1061); +reg_write( DDR_REG_BASE +0x51cd7*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE +0x51cd8*4+0x02000000,0xc301); +reg_write( DDR_REG_BASE +0x51cd9*4+0x02000000,0xc087); +reg_write( DDR_REG_BASE +0x51cda*4+0x02000000,0x631b); +reg_write( DDR_REG_BASE +0x51cdb*4+0x02000000,0x7bb4); +reg_write( DDR_REG_BASE +0x51cdc*4+0x02000000,0x9300); +reg_write( DDR_REG_BASE +0x51cdd*4+0x02000000,0xe0c0); +reg_write( DDR_REG_BASE +0x51cde*4+0x02000000,0x6a); +reg_write( DDR_REG_BASE +0x51cdf*4+0x02000000,0x25); +reg_write( DDR_REG_BASE +0x51ce0*4+0x02000000,0x40a1); +reg_write( DDR_REG_BASE +0x51ce1*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE +0x51ce2*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x51ce3*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x51ce4*4+0x02000000,0x780); +reg_write( DDR_REG_BASE +0x51ce5*4+0x02000000,0x7f1b); +reg_write( DDR_REG_BASE +0x51ce6*4+0x02000000,0x7fc5); +reg_write( DDR_REG_BASE +0x51ce7*4+0x02000000,0x9700); +reg_write( DDR_REG_BASE +0x51ce8*4+0x02000000,0x7014); +reg_write( DDR_REG_BASE +0x51ce9*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE +0x51cea*4+0x02000000,0x23ca); +reg_write( DDR_REG_BASE +0x51ceb*4+0x02000000,0x1021); +reg_write( DDR_REG_BASE +0x51cec*4+0x02000000,0x20ca); +reg_write( DDR_REG_BASE +0x51ced*4+0x02000000,0x21); +reg_write( DDR_REG_BASE +0x51cee*4+0x02000000,0xb43); +reg_write( DDR_REG_BASE +0x51cef*4+0x02000000,0x1030); +reg_write( DDR_REG_BASE +0x51cf0*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE +0x51cf1*4+0x02000000,0x78af); +reg_write( DDR_REG_BASE +0x51cf2*4+0x02000000,0x80d); +reg_write( DDR_REG_BASE +0x51cf3*4+0x02000000,0xd0); +reg_write( DDR_REG_BASE +0x51cf4*4+0x02000000,0x83b); +reg_write( DDR_REG_BASE +0x51cf5*4+0x02000000,0x210); +reg_write( DDR_REG_BASE +0x51cf6*4+0x02000000,0x83b); +reg_write( DDR_REG_BASE +0x51cf7*4+0x02000000,0x1d1); +reg_write( DDR_REG_BASE +0x51cf8*4+0x02000000,0x788f); +reg_write( DDR_REG_BASE +0x51cf9*4+0x02000000,0x2079); +reg_write( DDR_REG_BASE +0x51cfa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51cfb*4+0x02000000,0x205f); +reg_write( DDR_REG_BASE +0x51cfc*4+0x02000000,0x100); +reg_write( DDR_REG_BASE +0x51cfd*4+0x02000000,0xf00f); +reg_write( DDR_REG_BASE +0x51cfe*4+0x02000000,0xc301); +reg_write( DDR_REG_BASE +0x51cff*4+0x02000000,0x677f); +reg_write( DDR_REG_BASE +0x51d00*4+0x02000000,0x7f14); +reg_write( DDR_REG_BASE +0x51d01*4+0x02000000,0x6861); +reg_write( DDR_REG_BASE +0x51d02*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE +0x51d03*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x51d04*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x51d05*4+0x02000000,0x780); +reg_write( DDR_REG_BASE +0x51d06*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE +0x51d07*4+0x02000000,0x78c5); +reg_write( DDR_REG_BASE +0x51d08*4+0x02000000,0x9000); +reg_write( DDR_REG_BASE +0x51d09*4+0x02000000,0xb700); +reg_write( DDR_REG_BASE +0x51d0a*4+0x02000000,0x4060); +reg_write( DDR_REG_BASE +0x51d0b*4+0x02000000,0xde9); +reg_write( DDR_REG_BASE +0x51d0c*4+0x02000000,0x9025); +reg_write( DDR_REG_BASE +0x51d0d*4+0x02000000,0xc787); +reg_write( DDR_REG_BASE +0x51d0e*4+0x02000000,0xf005); +reg_write( DDR_REG_BASE +0x51d0f*4+0x02000000,0x706d); +reg_write( DDR_REG_BASE +0x51d10*4+0x02000000,0xf003); +reg_write( DDR_REG_BASE +0x51d11*4+0x02000000,0x9700); +reg_write( DDR_REG_BASE +0x51d12*4+0x02000000,0xb300); +reg_write( DDR_REG_BASE +0x51d13*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE +0x51d14*4+0x02000000,0xd79); +reg_write( DDR_REG_BASE +0x51d15*4+0x02000000,0x9214); +reg_write( DDR_REG_BASE +0x51d16*4+0x02000000,0x7124); +reg_write( DDR_REG_BASE +0x51d17*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE +0x51d18*4+0x02000000,0x7a2f); +reg_write( DDR_REG_BASE +0x51d19*4+0x02000000,0x863); +reg_write( DDR_REG_BASE +0x51d1a*4+0x02000000,0x80a5); +reg_write( DDR_REG_BASE +0x51d1b*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE +0x51d1c*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE +0x51d1d*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE +0x51d1e*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE +0x51d1f*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE +0x51d20*4+0x02000000,0x7014); +reg_write( DDR_REG_BASE +0x51d21*4+0x02000000,0xf326); +reg_write( DDR_REG_BASE +0x51d22*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x51d23*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE +0x51d24*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x51d25*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51d26*4+0x02000000,0xb8c3); +reg_write( DDR_REG_BASE +0x51d27*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE +0x51d28*4+0x02000000,0xf02c); +reg_write( DDR_REG_BASE +0x51d29*4+0x02000000,0x275f); +reg_write( DDR_REG_BASE +0x51d2a*4+0x02000000,0x1480); +reg_write( DDR_REG_BASE +0x51d2b*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x51d2c*4+0x02000000,0x47); +reg_write( DDR_REG_BASE +0x51d2d*4+0x02000000,0x2); +reg_write( DDR_REG_BASE +0x51d2e*4+0x02000000,0x42e1); +reg_write( DDR_REG_BASE +0x51d2f*4+0x02000000,0x661e); +reg_write( DDR_REG_BASE +0x51d30*4+0x02000000,0x26f4); +reg_write( DDR_REG_BASE +0x51d31*4+0x02000000,0x1340); +reg_write( DDR_REG_BASE +0x51d32*4+0x02000000,0x43a1); +reg_write( DDR_REG_BASE +0x51d33*4+0x02000000,0xe8a); +reg_write( DDR_REG_BASE +0x51d34*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE +0x51d35*4+0x02000000,0x20bc); +reg_write( DDR_REG_BASE +0x51d36*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x51d37*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE +0x51d38*4+0x02000000,0x271a); +reg_write( DDR_REG_BASE +0x51d39*4+0x02000000,0x1f81); +reg_write( DDR_REG_BASE +0x51d3a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51d3b*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE +0x51d3c*4+0x02000000,0x26f4); +reg_write( DDR_REG_BASE +0x51d3d*4+0x02000000,0x1342); +reg_write( DDR_REG_BASE +0x51d3e*4+0x02000000,0x2054); +reg_write( DDR_REG_BASE +0x51d3f*4+0x02000000,0xd00); +reg_write( DDR_REG_BASE +0x51d40*4+0x02000000,0x7905); +reg_write( DDR_REG_BASE +0x51d41*4+0x02000000,0x40a1); +reg_write( DDR_REG_BASE +0x51d42*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE +0x51d43*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x51d44*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE +0x51d45*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE +0x51d46*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE +0x51d47*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x51d48*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE +0x51d49*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE +0x51d4a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51d4b*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE +0x51d4c*4+0x02000000,0x6058); +reg_write( DDR_REG_BASE +0x51d4d*4+0x02000000,0x2049); +reg_write( DDR_REG_BASE +0x51d4e*4+0x02000000,0xfc0); +reg_write( DDR_REG_BASE +0x51d4f*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE +0x51d50*4+0x02000000,0xdb3); +reg_write( DDR_REG_BASE +0x51d51*4+0x02000000,0x9234); +reg_write( DDR_REG_BASE +0x51d52*4+0x02000000,0xc687); +reg_write( DDR_REG_BASE +0x51d53*4+0x02000000,0x7167); +reg_write( DDR_REG_BASE +0x51d54*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x51d55*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x51d56*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE +0x51d57*4+0x02000000,0x8801); +reg_write( DDR_REG_BASE +0x51d58*4+0x02000000,0x272f); +reg_write( DDR_REG_BASE +0x51d59*4+0x02000000,0x16c7); +reg_write( DDR_REG_BASE +0x51d5a*4+0x02000000,0x8ed); +reg_write( DDR_REG_BASE +0x51d5b*4+0x02000000,0x83e5); +reg_write( DDR_REG_BASE +0x51d5c*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE +0x51d5d*4+0x02000000,0x2480); +reg_write( DDR_REG_BASE +0x51d5e*4+0x02000000,0x3403); +reg_write( DDR_REG_BASE +0x51d5f*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE +0x51d60*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE +0x51d61*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE +0x51d62*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE +0x51d63*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE +0x51d64*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE +0x51d65*4+0x02000000,0x2482); +reg_write( DDR_REG_BASE +0x51d66*4+0x02000000,0x390a); +reg_write( DDR_REG_BASE +0x51d67*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE +0x51d68*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x51d69*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE +0x51d6a*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x51d6b*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x51d6c*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x51d6d*4+0x02000000,0x4a); +reg_write( DDR_REG_BASE +0x51d6e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51d6f*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE +0x51d70*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x51d71*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x51d72*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51d73*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x51d74*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x51d75*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE +0x51d76*4+0x02000000,0x86); +reg_write( DDR_REG_BASE +0x51d77*4+0x02000000,0x9000); +reg_write( DDR_REG_BASE +0x51d78*4+0x02000000,0x2084); +reg_write( DDR_REG_BASE +0x51d79*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x51d7a*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x51d7b*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x51d7c*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x51d7d*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x51d7e*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x51d7f*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x51d80*4+0x02000000,0xdee); +reg_write( DDR_REG_BASE +0x51d81*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE +0x51d82*4+0x02000000,0x2052); +reg_write( DDR_REG_BASE +0x51d83*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51d84*4+0x02000000,0xb7a); +reg_write( DDR_REG_BASE +0x51d85*4+0x02000000,0xff0f); +reg_write( DDR_REG_BASE +0x51d86*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x51d87*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x51d88*4+0x02000000,0x7005); +reg_write( DDR_REG_BASE +0x51d89*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x51d8a*4+0x02000000,0xe004); +reg_write( DDR_REG_BASE +0x51d8b*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x51d8c*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE +0x51d8d*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x51d8e*4+0x02000000,0xff68); +reg_write( DDR_REG_BASE +0x51d8f*4+0x02000000,0xca0a); +reg_write( DDR_REG_BASE +0x51d90*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE +0x51d91*4+0x02000000,0x208c); +reg_write( DDR_REG_BASE +0x51d92*4+0x02000000,0x8fc3); +reg_write( DDR_REG_BASE +0x51d93*4+0x02000000,0xf40f); +reg_write( DDR_REG_BASE +0x51d94*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x51d95*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE +0x51d96*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x51d97*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51d98*4+0x02000000,0xb8e5); +reg_write( DDR_REG_BASE +0x51d99*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x51d9a*4+0x02000000,0xf207); +reg_write( DDR_REG_BASE +0x51d9b*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x51d9c*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE +0x51d9d*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x51d9e*4+0x02000000,0x7b1); +reg_write( DDR_REG_BASE +0x51d9f*4+0x02000000,0x1a0a); +reg_write( DDR_REG_BASE +0x51da0*4+0x02000000,0x3002); +reg_write( DDR_REG_BASE +0x51da1*4+0x02000000,0xc102); +reg_write( DDR_REG_BASE +0x51da2*4+0x02000000,0x2144); +reg_write( DDR_REG_BASE +0x51da3*4+0x02000000,0x7c3); +reg_write( DDR_REG_BASE +0x51da4*4+0x02000000,0x4140); +reg_write( DDR_REG_BASE +0x51da5*4+0x02000000,0xeb06); +reg_write( DDR_REG_BASE +0x51da6*4+0x02000000,0xbb61); +reg_write( DDR_REG_BASE +0x51da7*4+0x02000000,0xb01); +reg_write( DDR_REG_BASE +0x51da8*4+0x02000000,0x31); +reg_write( DDR_REG_BASE +0x51da9*4+0x02000000,0x793b); +reg_write( DDR_REG_BASE +0x51daa*4+0x02000000,0xc145); +reg_write( DDR_REG_BASE +0x51dab*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x51dac*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE +0x51dad*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x51dae*4+0x02000000,0x7b1); +reg_write( DDR_REG_BASE +0x51daf*4+0x02000000,0x33b); +reg_write( DDR_REG_BASE +0x51db0*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x51db1*4+0x02000000,0x2139); +reg_write( DDR_REG_BASE +0x51db2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51db3*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE +0x51db4*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE +0x51db5*4+0x02000000,0xc7a); +reg_write( DDR_REG_BASE +0x51db6*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE +0x51db7*4+0x02000000,0xc046); +reg_write( DDR_REG_BASE +0x51db8*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE +0x51db9*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE +0x51dba*4+0x02000000,0xed06); +reg_write( DDR_REG_BASE +0x51dbb*4+0x02000000,0xc96); +reg_write( DDR_REG_BASE +0x51dbc*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE +0x51dbd*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x51dbe*4+0x02000000,0x311); +reg_write( DDR_REG_BASE +0x51dbf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51dc0*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x51dc1*4+0x02000000,0xc8a); +reg_write( DDR_REG_BASE +0x51dc2*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE +0x51dc3*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE +0x51dc4*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x51dc5*4+0x02000000,0x709b); +reg_write( DDR_REG_BASE +0x51dc6*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x51dc7*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x51dc8*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE +0x51dc9*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE +0x51dca*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE +0x51dcb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51dcc*4+0x02000000,0x248); +reg_write( DDR_REG_BASE +0x51dcd*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x51dce*4+0x02000000,0xcf6); +reg_write( DDR_REG_BASE +0x51dcf*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE +0x51dd0*4+0x02000000,0xda5a); +reg_write( DDR_REG_BASE +0x51dd1*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE +0x51dd2*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE +0x51dd3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51dd4*4+0x02000000,0x194); +reg_write( DDR_REG_BASE +0x51dd5*4+0x02000000,0xcea); +reg_write( DDR_REG_BASE +0x51dd6*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE +0x51dd7*4+0x02000000,0xdab4); +reg_write( DDR_REG_BASE +0x51dd8*4+0x02000000,0xdee); +reg_write( DDR_REG_BASE +0x51dd9*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE +0x51dda*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE +0x51ddb*4+0x02000000,0xb04); +reg_write( DDR_REG_BASE +0x51ddc*4+0x02000000,0xd86); +reg_write( DDR_REG_BASE +0x51ddd*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE +0x51dde*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE +0x51ddf*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x51de0*4+0x02000000,0x7344); +reg_write( DDR_REG_BASE +0x51de1*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x51de2*4+0x02000000,0xfec4); +reg_write( DDR_REG_BASE +0x51de3*4+0x02000000,0xca08); +reg_write( DDR_REG_BASE +0x51de4*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE +0x51de5*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE +0x51de6*4+0x02000000,0x4200); +reg_write( DDR_REG_BASE +0x51de7*4+0x02000000,0x2544); +reg_write( DDR_REG_BASE +0x51de8*4+0x02000000,0x17c0); +reg_write( DDR_REG_BASE +0x51de9*4+0x02000000,0x6d21); +reg_write( DDR_REG_BASE +0x51dea*4+0x02000000,0x259a); +reg_write( DDR_REG_BASE +0x51deb*4+0x02000000,0x1008); +reg_write( DDR_REG_BASE +0x51dec*4+0x02000000,0xe805); +reg_write( DDR_REG_BASE +0x51ded*4+0x02000000,0xb861); +reg_write( DDR_REG_BASE +0x51dee*4+0x02000000,0x8ff); +reg_write( DDR_REG_BASE +0x51def*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE +0x51df0*4+0x02000000,0x7a5b); +reg_write( DDR_REG_BASE +0x51df1*4+0x02000000,0x2505); +reg_write( DDR_REG_BASE +0x51df2*4+0x02000000,0x1f80); +reg_write( DDR_REG_BASE +0x51df3*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x51df4*4+0x02000000,0xe0c4); +reg_write( DDR_REG_BASE +0x51df5*4+0x02000000,0xb040); +reg_write( DDR_REG_BASE +0x51df6*4+0x02000000,0x4528); +reg_write( DDR_REG_BASE +0x51df7*4+0x02000000,0xde1); +reg_write( DDR_REG_BASE +0x51df8*4+0x02000000,0x9234); +reg_write( DDR_REG_BASE +0x51df9*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE +0x51dfa*4+0x02000000,0xd880); +reg_write( DDR_REG_BASE +0x51dfb*4+0x02000000,0xb88e); +reg_write( DDR_REG_BASE +0x51dfc*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x51dfd*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE +0x51dfe*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x51dff*4+0x02000000,0xe004); +reg_write( DDR_REG_BASE +0x51e00*4+0x02000000,0x231a); +reg_write( DDR_REG_BASE +0x51e01*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE +0x51e02*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x51e03*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51e04*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE +0x51e05*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE +0x51e06*4+0x02000000,0xe1c6); +reg_write( DDR_REG_BASE +0x51e07*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x51e08*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE +0x51e09*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x51e0a*4+0x02000000,0xfe86); +reg_write( DDR_REG_BASE +0x51e0b*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x51e0c*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x51e0d*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE +0x51e0e*4+0x02000000,0x86); +reg_write( DDR_REG_BASE +0x51e0f*4+0x02000000,0x9000); +reg_write( DDR_REG_BASE +0x51e10*4+0x02000000,0xb8a0); +reg_write( DDR_REG_BASE +0x51e11*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE +0x51e12*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x51e13*4+0x02000000,0x710d); +reg_write( DDR_REG_BASE +0x51e14*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE +0x51e15*4+0x02000000,0x1c6); +reg_write( DDR_REG_BASE +0x51e16*4+0x02000000,0xd80a); +reg_write( DDR_REG_BASE +0x51e17*4+0x02000000,0xbdc9); +reg_write( DDR_REG_BASE +0x51e18*4+0x02000000,0x254f); +reg_write( DDR_REG_BASE +0x51e19*4+0x02000000,0x12cf); +reg_write( DDR_REG_BASE +0x51e1a*4+0x02000000,0xa2e); +reg_write( DDR_REG_BASE +0x51e1b*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE +0x51e1c*4+0x02000000,0xb6e0); +reg_write( DDR_REG_BASE +0x51e1d*4+0x02000000,0x2505); +reg_write( DDR_REG_BASE +0x51e1e*4+0x02000000,0x1f80); +reg_write( DDR_REG_BASE +0x51e1f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51e20*4+0x02000000,0xc00); +reg_write( DDR_REG_BASE +0x51e21*4+0x02000000,0xb600); +reg_write( DDR_REG_BASE +0x51e22*4+0x02000000,0xa1e); +reg_write( DDR_REG_BASE +0x51e23*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE +0x51e24*4+0x02000000,0xd80a); +reg_write( DDR_REG_BASE +0x51e25*4+0x02000000,0xd80a); +reg_write( DDR_REG_BASE +0x51e26*4+0x02000000,0xa16); +reg_write( DDR_REG_BASE +0x51e27*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE +0x51e28*4+0x02000000,0xb6e0); +reg_write( DDR_REG_BASE +0x51e29*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x51e2a*4+0x02000000,0x7101); +reg_write( DDR_REG_BASE +0x51e2b*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE +0x51e2c*4+0x02000000,0x1c8); +reg_write( DDR_REG_BASE +0x51e2d*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE +0x51e2e*4+0x02000000,0xf0f); +reg_write( DDR_REG_BASE +0x51e2f*4+0x02000000,0xda3f); +reg_write( DDR_REG_BASE +0x51e30*4+0x02000000,0x7824); +reg_write( DDR_REG_BASE +0x51e31*4+0x02000000,0x208c); +reg_write( DDR_REG_BASE +0x51e32*4+0x02000000,0x8f03); +reg_write( DDR_REG_BASE +0x51e33*4+0x02000000,0xb6a0); +reg_write( DDR_REG_BASE +0x51e34*4+0x02000000,0xf745); +reg_write( DDR_REG_BASE +0x51e35*4+0x02000000,0x2184); +reg_write( DDR_REG_BASE +0x51e36*4+0x02000000,0xf03); +reg_write( DDR_REG_BASE +0x51e37*4+0x02000000,0x7a3d); +reg_write( DDR_REG_BASE +0x51e38*4+0x02000000,0x7a5d); +reg_write( DDR_REG_BASE +0x51e39*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE +0x51e3a*4+0x02000000,0xdb07); +reg_write( DDR_REG_BASE +0x51e3b*4+0x02000000,0x231a); +reg_write( DDR_REG_BASE +0x51e3c*4+0x02000000,0x3f9b); +reg_write( DDR_REG_BASE +0x51e3d*4+0x02000000,0x10); +reg_write( DDR_REG_BASE +0x51e3e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51e3f*4+0x02000000,0x7b16); +reg_write( DDR_REG_BASE +0x51e40*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x51e41*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x51e42*4+0x02000000,0x7b1); +reg_write( DDR_REG_BASE +0x51e43*4+0x02000000,0x8824); +reg_write( DDR_REG_BASE +0x51e44*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x51e45*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x51e46*4+0x02000000,0x7b1); +reg_write( DDR_REG_BASE +0x51e47*4+0x02000000,0x88c3); +reg_write( DDR_REG_BASE +0x51e48*4+0x02000000,0x1c1c); +reg_write( DDR_REG_BASE +0x51e49*4+0x02000000,0x36c0); +reg_write( DDR_REG_BASE +0x51e4a*4+0x02000000,0x44c9); +reg_write( DDR_REG_BASE +0x51e4b*4+0x02000000,0xf012); +reg_write( DDR_REG_BASE +0x51e4c*4+0x02000000,0x7884); +reg_write( DDR_REG_BASE +0x51e4d*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE +0x51e4e*4+0x02000000,0xf8d); +reg_write( DDR_REG_BASE +0x51e4f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51e50*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE +0x51e51*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE +0x51e52*4+0x02000000,0x7185); +reg_write( DDR_REG_BASE +0x51e53*4+0x02000000,0x2054); +reg_write( DDR_REG_BASE +0x51e54*4+0x02000000,0xd00); +reg_write( DDR_REG_BASE +0x51e55*4+0x02000000,0x78a5); +reg_write( DDR_REG_BASE +0x51e56*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE +0x51e57*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x51e58*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x51e59*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE +0x51e5a*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x51e5b*4+0x02000000,0xb040); +reg_write( DDR_REG_BASE +0x51e5c*4+0x02000000,0x788f); +reg_write( DDR_REG_BASE +0x51e5d*4+0x02000000,0x9e1); +reg_write( DDR_REG_BASE +0x51e5e*4+0x02000000,0x8025); +reg_write( DDR_REG_BASE +0x51e5f*4+0x02000000,0xd8ef); +reg_write( DDR_REG_BASE +0x51e60*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x51e61*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x51e62*4+0x02000000,0xe024); +reg_write( DDR_REG_BASE +0x51e63*4+0x02000000,0x228a); +reg_write( DDR_REG_BASE +0x51e64*4+0x02000000,0x3c4); +reg_write( DDR_REG_BASE +0x51e65*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE +0x51e66*4+0x02000000,0xb060); +reg_write( DDR_REG_BASE +0x51e67*4+0x02000000,0x180c); +reg_write( DDR_REG_BASE +0x51e68*4+0x02000000,0x45); +reg_write( DDR_REG_BASE +0x51e69*4+0x02000000,0x18fe); +reg_write( DDR_REG_BASE +0x51e6a*4+0x02000000,0x8084); +reg_write( DDR_REG_BASE +0x51e6b*4+0x02000000,0xf0a0); +reg_write( DDR_REG_BASE +0x51e6c*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE +0x51e6d*4+0x02000000,0x2055); +reg_write( DDR_REG_BASE +0x51e6e*4+0x02000000,0x8c2); +reg_write( DDR_REG_BASE +0x51e6f*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE +0x51e70*4+0x02000000,0x7a05); +reg_write( DDR_REG_BASE +0x51e71*4+0x02000000,0xd8ef); +reg_write( DDR_REG_BASE +0x51e72*4+0x02000000,0x78c4); +reg_write( DDR_REG_BASE +0x51e73*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE +0x51e74*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x51e75*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51e76*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE +0x51e77*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE +0x51e78*4+0x02000000,0x7845); +reg_write( DDR_REG_BASE +0x51e79*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE +0x51e7a*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x51e7b*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x51e7c*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE +0x51e7d*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x51e7e*4+0x02000000,0xb0a0); +reg_write( DDR_REG_BASE +0x51e7f*4+0x02000000,0x78cf); +reg_write( DDR_REG_BASE +0x51e80*4+0x02000000,0x9d9); +reg_write( DDR_REG_BASE +0x51e81*4+0x02000000,0x8005); +reg_write( DDR_REG_BASE +0x51e82*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE +0x51e83*4+0x02000000,0xaba); +reg_write( DDR_REG_BASE +0x51e84*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE +0x51e85*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE +0x51e86*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE +0x51e87*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x51e88*4+0x02000000,0xfe64); +reg_write( DDR_REG_BASE +0x51e89*4+0x02000000,0x90a); +reg_write( DDR_REG_BASE +0x51e8a*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE +0x51e8b*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x51e8c*4+0x02000000,0x1005); +reg_write( DDR_REG_BASE +0x51e8d*4+0x02000000,0x902); +reg_write( DDR_REG_BASE +0x51e8e*4+0x02000000,0xff8f); +reg_write( DDR_REG_BASE +0x51e8f*4+0x02000000,0x946); +reg_write( DDR_REG_BASE +0x51e90*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE +0x51e91*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE +0x51e92*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE +0x51e93*4+0x02000000,0xe76); +reg_write( DDR_REG_BASE +0x51e94*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x51e95*4+0x02000000,0x218a); +reg_write( DDR_REG_BASE +0x51e96*4+0x02000000,0xfc7); +reg_write( DDR_REG_BASE +0x51e97*4+0x02000000,0xd820); +reg_write( DDR_REG_BASE +0x51e98*4+0x02000000,0xf7a); +reg_write( DDR_REG_BASE +0x51e99*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE +0x51e9a*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x51e9b*4+0x02000000,0xc08b); +reg_write( DDR_REG_BASE +0x51e9c*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x51e9d*4+0x02000000,0x9ca); +reg_write( DDR_REG_BASE +0x51e9e*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x51e9f*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE +0x51ea0*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE +0x51ea1*4+0x02000000,0xa7e); +reg_write( DDR_REG_BASE +0x51ea2*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE +0x51ea3*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE +0x51ea4*4+0x02000000,0xd87f); +reg_write( DDR_REG_BASE +0x51ea5*4+0x02000000,0x8d2); +reg_write( DDR_REG_BASE +0x51ea6*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE +0x51ea7*4+0x02000000,0xb600); +reg_write( DDR_REG_BASE +0x51ea8*4+0x02000000,0x8ca); +reg_write( DDR_REG_BASE +0x51ea9*4+0x02000000,0xff8f); +reg_write( DDR_REG_BASE +0x51eaa*4+0x02000000,0x90e); +reg_write( DDR_REG_BASE +0x51eab*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE +0x51eac*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE +0x51ead*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE +0x51eae*4+0x02000000,0xe3e); +reg_write( DDR_REG_BASE +0x51eaf*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x51eb0*4+0x02000000,0x218a); +reg_write( DDR_REG_BASE +0x51eb1*4+0x02000000,0xfc7); +reg_write( DDR_REG_BASE +0x51eb2*4+0x02000000,0xd820); +reg_write( DDR_REG_BASE +0x51eb3*4+0x02000000,0xf46); +reg_write( DDR_REG_BASE +0x51eb4*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE +0x51eb5*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x51eb6*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE +0x51eb7*4+0x02000000,0x3e00); +reg_write( DDR_REG_BASE +0x51eb8*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x51eb9*4+0x02000000,0x992); +reg_write( DDR_REG_BASE +0x51eba*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x51ebb*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE +0x51ebc*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x51ebd*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x51ebe*4+0x02000000,0x7b1); +reg_write( DDR_REG_BASE +0x51ebf*4+0x02000000,0x8863); +reg_write( DDR_REG_BASE +0x51ec0*4+0x02000000,0x235f); +reg_write( DDR_REG_BASE +0x51ec1*4+0x02000000,0x240); +reg_write( DDR_REG_BASE +0x51ec2*4+0x02000000,0xf03a); +reg_write( DDR_REG_BASE +0x51ec3*4+0x02000000,0xc088); +reg_write( DDR_REG_BASE +0x51ec4*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x51ec5*4+0x02000000,0xb0a); +reg_write( DDR_REG_BASE +0x51ec6*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE +0x51ec7*4+0x02000000,0xda09); +reg_write( DDR_REG_BASE +0x51ec8*4+0x02000000,0xc700); +reg_write( DDR_REG_BASE +0x51ec9*4+0x02000000,0x70cd); +reg_write( DDR_REG_BASE +0x51eca*4+0x02000000,0xf02d); +reg_write( DDR_REG_BASE +0x51ecb*4+0x02000000,0x78fb); +reg_write( DDR_REG_BASE +0x51ecc*4+0x02000000,0x2084); +reg_write( DDR_REG_BASE +0x51ecd*4+0x02000000,0xf87); +reg_write( DDR_REG_BASE +0x51ece*4+0x02000000,0xc18b); +reg_write( DDR_REG_BASE +0x51ecf*4+0x02000000,0x2135); +reg_write( DDR_REG_BASE +0x51ed0*4+0x02000000,0x1e); +reg_write( DDR_REG_BASE +0x51ed1*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE +0x51ed2*4+0x02000000,0x3e01); +reg_write( DDR_REG_BASE +0x51ed3*4+0x02000000,0x2135); +reg_write( DDR_REG_BASE +0x51ed4*4+0x02000000,0xb); +reg_write( DDR_REG_BASE +0x51ed5*4+0x02000000,0x235f); +reg_write( DDR_REG_BASE +0x51ed6*4+0x02000000,0x3241); +reg_write( DDR_REG_BASE +0x51ed7*4+0x02000000,0x2302); +reg_write( DDR_REG_BASE +0x51ed8*4+0x02000000,0x1780); +reg_write( DDR_REG_BASE +0x51ed9*4+0x02000000,0x2048); +reg_write( DDR_REG_BASE +0x51eda*4+0x02000000,0x2); +reg_write( DDR_REG_BASE +0x51edb*4+0x02000000,0xc088); +reg_write( DDR_REG_BASE +0x51edc*4+0x02000000,0x60d8); +reg_write( DDR_REG_BASE +0x51edd*4+0x02000000,0xa840); +reg_write( DDR_REG_BASE +0x51ede*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE +0x51edf*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE +0x51ee0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51ee1*4+0x02000000,0x248); +reg_write( DDR_REG_BASE +0x51ee2*4+0x02000000,0x6038); +reg_write( DDR_REG_BASE +0x51ee3*4+0x02000000,0x60d8); +reg_write( DDR_REG_BASE +0x51ee4*4+0x02000000,0x8820); +reg_write( DDR_REG_BASE +0x51ee5*4+0x02000000,0x7c4f); +reg_write( DDR_REG_BASE +0x51ee6*4+0x02000000,0x91f); +reg_write( DDR_REG_BASE +0x51ee7*4+0x02000000,0x305); +reg_write( DDR_REG_BASE +0x51ee8*4+0x02000000,0x235f); +reg_write( DDR_REG_BASE +0x51ee9*4+0x02000000,0x3481); +reg_write( DDR_REG_BASE +0x51eea*4+0x02000000,0xa840); +reg_write( DDR_REG_BASE +0x51eeb*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE +0x51eec*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE +0x51eed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51eee*4+0x02000000,0x194); +reg_write( DDR_REG_BASE +0x51eef*4+0x02000000,0x6038); +reg_write( DDR_REG_BASE +0x51ef0*4+0x02000000,0x2600); +reg_write( DDR_REG_BASE +0x51ef1*4+0x02000000,0x32c1); +reg_write( DDR_REG_BASE +0x51ef2*4+0x02000000,0x78d4); +reg_write( DDR_REG_BASE +0x51ef3*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE +0x51ef4*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE +0x51ef5*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE +0x51ef6*4+0x02000000,0x71e5); +reg_write( DDR_REG_BASE +0x51ef7*4+0x02000000,0xeab); +reg_write( DDR_REG_BASE +0x51ef8*4+0x02000000,0x9214); +reg_write( DDR_REG_BASE +0x51ef9*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE +0x51efa*4+0x02000000,0x7164); +reg_write( DDR_REG_BASE +0x51efb*4+0x02000000,0xe009); +reg_write( DDR_REG_BASE +0x51efc*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE +0x51efd*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x51efe*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x51eff*4+0x02000000,0x7b1); +reg_write( DDR_REG_BASE +0x51f00*4+0x02000000,0x8824); +reg_write( DDR_REG_BASE +0x51f01*4+0x02000000,0x786f); +reg_write( DDR_REG_BASE +0x51f02*4+0x02000000,0x983); +reg_write( DDR_REG_BASE +0x51f03*4+0x02000000,0x8025); +reg_write( DDR_REG_BASE +0x51f04*4+0x02000000,0x4318); +reg_write( DDR_REG_BASE +0x51f05*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x51f06*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x51f07*4+0x02000000,0x7b1); +reg_write( DDR_REG_BASE +0x51f08*4+0x02000000,0x88c3); +reg_write( DDR_REG_BASE +0x51f09*4+0x02000000,0x74a5); +reg_write( DDR_REG_BASE +0x51f0a*4+0x02000000,0xe59e); +reg_write( DDR_REG_BASE +0x51f0b*4+0x02000000,0x6ea); +reg_write( DDR_REG_BASE +0x51f0c*4+0x02000000,0xffce); +reg_write( DDR_REG_BASE +0x51f0d*4+0x02000000,0xf036); +reg_write( DDR_REG_BASE +0x51f0e*4+0x02000000,0x255f); +reg_write( DDR_REG_BASE +0x51f0f*4+0x02000000,0x1241); +reg_write( DDR_REG_BASE +0x51f10*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE +0x51f11*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE +0x51f12*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51f13*4+0x02000000,0x248); +reg_write( DDR_REG_BASE +0x51f14*4+0x02000000,0x43e1); +reg_write( DDR_REG_BASE +0x51f15*4+0x02000000,0x6038); +reg_write( DDR_REG_BASE +0x51f16*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x51f17*4+0x02000000,0x3e); +reg_write( DDR_REG_BASE +0x51f18*4+0x02000000,0x2); +reg_write( DDR_REG_BASE +0x51f19*4+0x02000000,0xabe); +reg_write( DDR_REG_BASE +0x51f1a*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE +0x51f1b*4+0x02000000,0x60e8); +reg_write( DDR_REG_BASE +0x51f1c*4+0x02000000,0x40e1); +reg_write( DDR_REG_BASE +0x51f1d*4+0x02000000,0x251a); +reg_write( DDR_REG_BASE +0x51f1e*4+0x02000000,0x1f82); +reg_write( DDR_REG_BASE +0x51f1f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51f20*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE +0x51f21*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE +0x51f22*4+0x02000000,0x8); +reg_write( DDR_REG_BASE +0x51f23*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE +0x51f24*4+0x02000000,0x3f83); +reg_write( DDR_REG_BASE +0x51f25*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51f26*4+0x02000000,0x194); +reg_write( DDR_REG_BASE +0x51f27*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x51f28*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE +0x51f29*4+0x02000000,0x80); +reg_write( DDR_REG_BASE +0x51f2a*4+0x02000000,0x7a05); +reg_write( DDR_REG_BASE +0x51f2b*4+0x02000000,0x255f); +reg_write( DDR_REG_BASE +0x51f2c*4+0x02000000,0x1480); +reg_write( DDR_REG_BASE +0x51f2d*4+0x02000000,0x2205); +reg_write( DDR_REG_BASE +0x51f2e*4+0x02000000,0x4c); +reg_write( DDR_REG_BASE +0x51f2f*4+0x02000000,0x2142); +reg_write( DDR_REG_BASE +0x51f30*4+0x02000000,0x801); +reg_write( DDR_REG_BASE +0x51f31*4+0x02000000,0x7945); +reg_write( DDR_REG_BASE +0x51f32*4+0x02000000,0x631b); +reg_write( DDR_REG_BASE +0x51f33*4+0x02000000,0x23f4); +reg_write( DDR_REG_BASE +0x51f34*4+0x02000000,0x3c0); +reg_write( DDR_REG_BASE +0x51f35*4+0x02000000,0xb400); +reg_write( DDR_REG_BASE +0x51f36*4+0x02000000,0x23f4); +reg_write( DDR_REG_BASE +0x51f37*4+0x02000000,0x3c0); +reg_write( DDR_REG_BASE +0x51f38*4+0x02000000,0x71e5); +reg_write( DDR_REG_BASE +0x51f39*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE +0x51f3a*4+0x02000000,0xfa9); +reg_write( DDR_REG_BASE +0x51f3b*4+0x02000000,0x9234); +reg_write( DDR_REG_BASE +0x51f3c*4+0x02000000,0x42a1); +reg_write( DDR_REG_BASE +0x51f3d*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x51f3e*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x51f3f*4+0x02000000,0x7b1); +reg_write( DDR_REG_BASE +0x51f40*4+0x02000000,0x8824); +reg_write( DDR_REG_BASE +0x51f41*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE +0x51f42*4+0x02000000,0x7dcf); +reg_write( DDR_REG_BASE +0x51f43*4+0x02000000,0x9f1); +reg_write( DDR_REG_BASE +0x51f44*4+0x02000000,0x8365); +reg_write( DDR_REG_BASE +0x51f45*4+0x02000000,0x70ed); +reg_write( DDR_REG_BASE +0x51f46*4+0x02000000,0xf3e); +reg_write( DDR_REG_BASE +0x51f47*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE +0x51f48*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE +0x51f49*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE +0x51f4a*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE +0x51f4b*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE +0x51f4c*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE +0x51f4d*4+0x02000000,0x7d0f); +reg_write( DDR_REG_BASE +0x51f4e*4+0x02000000,0x72b5); +reg_write( DDR_REG_BASE +0x51f4f*4+0x02000000,0x4ca); +reg_write( DDR_REG_BASE +0x51f50*4+0x02000000,0xffe5); +reg_write( DDR_REG_BASE +0x51f51*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x51f52*4+0x02000000,0x2480); +reg_write( DDR_REG_BASE +0x51f53*4+0x02000000,0x390a); +reg_write( DDR_REG_BASE +0x51f54*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE +0x51f55*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE +0x51f56*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE +0x51f57*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x51f58*4+0x02000000,0xc0e6); +reg_write( DDR_REG_BASE +0x51f59*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE +0x51f5a*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x51f5b*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE +0x51f5c*4+0x02000000,0x8ba0); +reg_write( DDR_REG_BASE +0x51f5d*4+0x02000000,0x8b81); +reg_write( DDR_REG_BASE +0x51f5e*4+0x02000000,0x251f); +reg_write( DDR_REG_BASE +0x51f5f*4+0x02000000,0x108f); +reg_write( DDR_REG_BASE +0x51f60*4+0x02000000,0xf01b); +reg_write( DDR_REG_BASE +0x51f61*4+0x02000000,0x251a); +reg_write( DDR_REG_BASE +0x51f62*4+0x02000000,0x1f9e); +reg_write( DDR_REG_BASE +0x51f63*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51f64*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE +0x51f65*4+0x02000000,0x239a); +reg_write( DDR_REG_BASE +0x51f66*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x51f67*4+0x02000000,0x2114); +reg_write( DDR_REG_BASE +0x51f68*4+0x02000000,0x38e); +reg_write( DDR_REG_BASE +0x51f69*4+0x02000000,0x2605); +reg_write( DDR_REG_BASE +0x51f6a*4+0x02000000,0x301e); +reg_write( DDR_REG_BASE +0x51f6b*4+0x02000000,0x2305); +reg_write( DDR_REG_BASE +0x51f6c*4+0x02000000,0x783); +reg_write( DDR_REG_BASE +0x51f6d*4+0x02000000,0x7b7b); +reg_write( DDR_REG_BASE +0x51f6e*4+0x02000000,0xbb91); +reg_write( DDR_REG_BASE +0x51f6f*4+0x02000000,0xbb9c); +reg_write( DDR_REG_BASE +0x51f70*4+0x02000000,0xbb9f); +reg_write( DDR_REG_BASE +0x51f71*4+0x02000000,0x9360); +reg_write( DDR_REG_BASE +0x51f72*4+0x02000000,0x71e5); +reg_write( DDR_REG_BASE +0x51f73*4+0x02000000,0x7165); +reg_write( DDR_REG_BASE +0x51f74*4+0x02000000,0xb660); +reg_write( DDR_REG_BASE +0x51f75*4+0x02000000,0x232f); +reg_write( DDR_REG_BASE +0x51f76*4+0x02000000,0x2c7); +reg_write( DDR_REG_BASE +0x51f77*4+0x02000000,0xbd7); +reg_write( DDR_REG_BASE +0x51f78*4+0x02000000,0x80a4); +reg_write( DDR_REG_BASE +0x51f79*4+0x02000000,0x7ef0); +reg_write( DDR_REG_BASE +0x51f7a*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE +0x51f7b*4+0x02000000,0xcf7); +reg_write( DDR_REG_BASE +0x51f7c*4+0x02000000,0x9365); +reg_write( DDR_REG_BASE +0x51f7d*4+0x02000000,0x706d); +reg_write( DDR_REG_BASE +0x51f7e*4+0x02000000,0xc4c6); +reg_write( DDR_REG_BASE +0x51f7f*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x51f80*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE +0x51f81*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE +0x51f82*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE +0x51f83*4+0x02000000,0x45cb); +reg_write( DDR_REG_BASE +0x51f84*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x51f85*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE +0x51f86*4+0x02000000,0x8d80); +reg_write( DDR_REG_BASE +0x51f87*4+0x02000000,0x4338); +reg_write( DDR_REG_BASE +0x51f88*4+0x02000000,0x4718); +reg_write( DDR_REG_BASE +0x51f89*4+0x02000000,0x706d); +reg_write( DDR_REG_BASE +0x51f8a*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE +0x51f8b*4+0x02000000,0xea0d); +reg_write( DDR_REG_BASE +0x51f8c*4+0x02000000,0x245f); +reg_write( DDR_REG_BASE +0x51f8d*4+0x02000000,0x1243); +reg_write( DDR_REG_BASE +0x51f8e*4+0x02000000,0xa1b); +reg_write( DDR_REG_BASE +0x51f8f*4+0x02000000,0xb1); +reg_write( DDR_REG_BASE +0x51f90*4+0x02000000,0xd908); +reg_write( DDR_REG_BASE +0x51f91*4+0x02000000,0xe308); +reg_write( DDR_REG_BASE +0x51f92*4+0x02000000,0xd809); +reg_write( DDR_REG_BASE +0x51f93*4+0x02000000,0x71ed); +reg_write( DDR_REG_BASE +0x51f94*4+0x02000000,0x234a); +reg_write( DDR_REG_BASE +0x51f95*4+0x02000000,0x1200); +reg_write( DDR_REG_BASE +0x51f96*4+0x02000000,0xf006); +reg_write( DDR_REG_BASE +0x51f97*4+0x02000000,0x7b9b); +reg_write( DDR_REG_BASE +0x51f98*4+0x02000000,0x74ed); +reg_write( DDR_REG_BASE +0x51f99*4+0x02000000,0x742c); +reg_write( DDR_REG_BASE +0x51f9a*4+0x02000000,0xf002); +reg_write( DDR_REG_BASE +0x51f9b*4+0x02000000,0x71ed); +reg_write( DDR_REG_BASE +0x51f9c*4+0x02000000,0x1501); +reg_write( DDR_REG_BASE +0x51f9d*4+0x02000000,0x109e); +reg_write( DDR_REG_BASE +0x51f9e*4+0x02000000,0xf023); +reg_write( DDR_REG_BASE +0x51f9f*4+0x02000000,0x45c9); +reg_write( DDR_REG_BASE +0x51fa0*4+0x02000000,0x259a); +reg_write( DDR_REG_BASE +0x51fa1*4+0x02000000,0x1008); +reg_write( DDR_REG_BASE +0x51fa2*4+0x02000000,0x241a); +reg_write( DDR_REG_BASE +0x51fa3*4+0x02000000,0x1f82); +reg_write( DDR_REG_BASE +0x51fa4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x51fa5*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE +0x51fa6*4+0x02000000,0x7aa5); +reg_write( DDR_REG_BASE +0x51fa7*4+0x02000000,0x2205); +reg_write( DDR_REG_BASE +0x51fa8*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE +0x51fa9*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE +0x51faa*4+0x02000000,0x64); +reg_write( DDR_REG_BASE +0x51fab*4+0x02000000,0xb1f); +reg_write( DDR_REG_BASE +0x51fac*4+0x02000000,0x3030); +reg_write( DDR_REG_BASE +0x51fad*4+0x02000000,0x9a40); +reg_write( DDR_REG_BASE +0x51fae*4+0x02000000,0x258a); +reg_write( DDR_REG_BASE +0x51faf*4+0x02000000,0x1fcf); +reg_write( DDR_REG_BASE +0x51fb0*4+0x02000000,0x7d44); +reg_write( DDR_REG_BASE +0x51fb1*4+0x02000000,0x7a5d); +reg_write( DDR_REG_BASE +0x51fb2*4+0x02000000,0x7a5d); +reg_write( DDR_REG_BASE +0x51fb3*4+0x02000000,0x7a5d); +reg_write( DDR_REG_BASE +0x51fb4*4+0x02000000,0x7a5d); +reg_write( DDR_REG_BASE +0x51fb5*4+0x02000000,0x7a5d); +reg_write( DDR_REG_BASE +0x51fb6*4+0x02000000,0x2284); +reg_write( DDR_REG_BASE +0x51fb7*4+0x02000000,0x81f); +reg_write( DDR_REG_BASE +0x51fb8*4+0x02000000,0x62ba); +reg_write( DDR_REG_BASE +0x51fb9*4+0x02000000,0x2714); +reg_write( DDR_REG_BASE +0x51fba*4+0x02000000,0x30cd); +reg_write( DDR_REG_BASE +0x51fbb*4+0x02000000,0xb540); +reg_write( DDR_REG_BASE +0x51fbc*4+0x02000000,0x66fe); +reg_write( DDR_REG_BASE +0x51fbd*4+0x02000000,0x631b); +reg_write( DDR_REG_BASE +0x51fbe*4+0x02000000,0x9c3); +reg_write( DDR_REG_BASE +0x51fbf*4+0x02000000,0x8385); +reg_write( DDR_REG_BASE +0x51fc0*4+0x02000000,0x7185); +reg_write( DDR_REG_BASE +0x51fc1*4+0x02000000,0xefd); +reg_write( DDR_REG_BASE +0x51fc2*4+0x02000000,0xb325); +reg_write( DDR_REG_BASE +0x51fc3*4+0x02000000,0x4669); +reg_write( DDR_REG_BASE +0x51fc4*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE +0x51fc5*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE +0x51fc6*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE +0x51fc7*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x51fc8*4+0x02000000,0x8819); +reg_write( DDR_REG_BASE +0x51fc9*4+0x02000000,0xb863); +reg_write( DDR_REG_BASE +0x51fca*4+0x02000000,0x7314); +reg_write( DDR_REG_BASE +0x51fcb*4+0x02000000,0x20e0); +reg_write( DDR_REG_BASE +0x51fcc*4+0x02000000,0x7cd); +reg_write( DDR_REG_BASE +0x51fcd*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x51fce*4+0x02000000,0x900e); +reg_write( DDR_REG_BASE +0x51fcf*4+0x02000000,0x1e4c); +reg_write( DDR_REG_BASE +0x51fd0*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE +0x51fd1*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE +0x51fd2*4+0x02000000,0xb041); +reg_write( DDR_REG_BASE +0x51fd3*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x51fd4*4+0x02000000,0x791b); +reg_write( DDR_REG_BASE +0x51fd5*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x51fd6*4+0x02000000,0x2184); +reg_write( DDR_REG_BASE +0x51fd7*4+0x02000000,0xa82); +reg_write( DDR_REG_BASE +0x51fd8*4+0x02000000,0x2046); +reg_write( DDR_REG_BASE +0x51fd9*4+0x02000000,0xa80); +reg_write( DDR_REG_BASE +0x51fda*4+0x02000000,0x7905); +reg_write( DDR_REG_BASE +0x51fdb*4+0x02000000,0x215a); +reg_write( DDR_REG_BASE +0x51fdc*4+0x02000000,0x100); +reg_write( DDR_REG_BASE +0x51fdd*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE +0x51fde*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE +0x51fdf*4+0x02000000,0x2144); +reg_write( DDR_REG_BASE +0x51fe0*4+0x02000000,0xcc1); +reg_write( DDR_REG_BASE +0x51fe1*4+0x02000000,0x2084); +reg_write( DDR_REG_BASE +0x51fe2*4+0x02000000,0x303); +reg_write( DDR_REG_BASE +0x51fe3*4+0x02000000,0x7905); +reg_write( DDR_REG_BASE +0x51fe4*4+0x02000000,0x215f); +reg_write( DDR_REG_BASE +0x51fe5*4+0x02000000,0x400); +reg_write( DDR_REG_BASE +0x51fe6*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE +0x51fe7*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE +0x51fe8*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE +0x51fe9*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE +0x51fea*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE +0x51feb*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE +0x51fec*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE +0x51fed*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x51fee*4+0x02000000,0xc2e2); +reg_write( DDR_REG_BASE +0x51fef*4+0x02000000,0x45cb); +reg_write( DDR_REG_BASE +0x51ff0*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE +0x51ff1*4+0x02000000,0xe000); +reg_write( DDR_REG_BASE +0x51ff2*4+0x02000000,0xd820); +reg_write( DDR_REG_BASE +0x51ff3*4+0x02000000,0xe7e); +reg_write( DDR_REG_BASE +0x51ff4*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE +0x51ff5*4+0x02000000,0x1d00); +reg_write( DDR_REG_BASE +0x51ff6*4+0x02000000,0x1045); +reg_write( DDR_REG_BASE +0x51ff7*4+0x02000000,0x1d00); +reg_write( DDR_REG_BASE +0x51ff8*4+0x02000000,0x1005); +reg_write( DDR_REG_BASE +0x51ff9*4+0x02000000,0xc6c2); +reg_write( DDR_REG_BASE +0x51ffa*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE +0x51ffb*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE +0x51ffc*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE +0x51ffd*4+0x02000000,0x2482); +reg_write( DDR_REG_BASE +0x51ffe*4+0x02000000,0x3702); +reg_write( DDR_REG_BASE +0x51fff*4+0x02000000,0xc140); +reg_write( DDR_REG_BASE +0x52000*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE +0x52001*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x52002*4+0x02000000,0x7100); +reg_write( DDR_REG_BASE +0x52003*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE +0x52004*4+0x02000000,0xaa); +reg_write( DDR_REG_BASE +0x52005*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x52006*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x52007*4+0x02000000,0x57c); +reg_write( DDR_REG_BASE +0x52008*4+0x02000000,0xda78); +reg_write( DDR_REG_BASE +0x52009*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE +0x5200a*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x5200b*4+0x02000000,0x7085); +reg_write( DDR_REG_BASE +0x5200c*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE +0x5200d*4+0x02000000,0xe0aa); +reg_write( DDR_REG_BASE +0x5200e*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x5200f*4+0x02000000,0x709b); +reg_write( DDR_REG_BASE +0x52010*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x52011*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x52012*4+0x02000000,0x85e); +reg_write( DDR_REG_BASE +0x52013*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE +0x52014*4+0x02000000,0xc089); +reg_write( DDR_REG_BASE +0x52015*4+0x02000000,0xc089); +reg_write( DDR_REG_BASE +0x52016*4+0x02000000,0x95e); +reg_write( DDR_REG_BASE +0x52017*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE +0x52018*4+0x02000000,0xd978); +reg_write( DDR_REG_BASE +0x52019*4+0x02000000,0xa4a); +reg_write( DDR_REG_BASE +0x5201a*4+0x02000000,0xfe8f); +reg_write( DDR_REG_BASE +0x5201b*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE +0x5201c*4+0x02000000,0xf86); +reg_write( DDR_REG_BASE +0x5201d*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE +0x5201e*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE +0x5201f*4+0x02000000,0xdde); +reg_write( DDR_REG_BASE +0x52020*4+0x02000000,0xff4f); +reg_write( DDR_REG_BASE +0x52021*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x52022*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x52023*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x52024*4+0x02000000,0xe024); +reg_write( DDR_REG_BASE +0x52025*4+0x02000000,0x228a); +reg_write( DDR_REG_BASE +0x52026*4+0x02000000,0x44); +reg_write( DDR_REG_BASE +0x52027*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE +0x52028*4+0x02000000,0xb026); +reg_write( DDR_REG_BASE +0x52029*4+0x02000000,0x18fe); +reg_write( DDR_REG_BASE +0x5202a*4+0x02000000,0x8084); +reg_write( DDR_REG_BASE +0x5202b*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE +0x5202c*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE +0x5202d*4+0x02000000,0x7c2); +reg_write( DDR_REG_BASE +0x5202e*4+0x02000000,0x4020); +reg_write( DDR_REG_BASE +0x5202f*4+0x02000000,0xea06); +reg_write( DDR_REG_BASE +0x52030*4+0x02000000,0xba61); +reg_write( DDR_REG_BASE +0x52031*4+0x02000000,0xa01); +reg_write( DDR_REG_BASE +0x52032*4+0x02000000,0x31); +reg_write( DDR_REG_BASE +0x52033*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE +0x52034*4+0x02000000,0x7d0f); +reg_write( DDR_REG_BASE +0x52035*4+0x02000000,0x40a1); +reg_write( DDR_REG_BASE +0x52036*4+0x02000000,0xc62); +reg_write( DDR_REG_BASE +0x52037*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE +0x52038*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x52039*4+0x02000000,0xd830); +reg_write( DDR_REG_BASE +0x5203a*4+0x02000000,0xc36); +reg_write( DDR_REG_BASE +0x5203b*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE +0x5203c*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x5203d*4+0x02000000,0xa76); +reg_write( DDR_REG_BASE +0x5203e*4+0x02000000,0xfecf); +reg_write( DDR_REG_BASE +0x5203f*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x52040*4+0x02000000,0xf005); +reg_write( DDR_REG_BASE +0x52041*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x52042*4+0x02000000,0x1900); +reg_write( DDR_REG_BASE +0x52043*4+0x02000000,0xfc3); +reg_write( DDR_REG_BASE +0x52044*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE +0x52045*4+0x02000000,0x8fb); +reg_write( DDR_REG_BASE +0x52046*4+0x02000000,0x8534); +reg_write( DDR_REG_BASE +0x52047*4+0x02000000,0xc184); +reg_write( DDR_REG_BASE +0x52048*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x52049*4+0x02000000,0xc1a); +reg_write( DDR_REG_BASE +0x5204a*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE +0x5204b*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x5204c*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE +0x5204d*4+0x02000000,0xf26); +reg_write( DDR_REG_BASE +0x5204e*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE +0x5204f*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE +0x52050*4+0x02000000,0x40a1); +reg_write( DDR_REG_BASE +0x52051*4+0x02000000,0xc2e); +reg_write( DDR_REG_BASE +0x52052*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE +0x52053*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x52054*4+0x02000000,0x231a); +reg_write( DDR_REG_BASE +0x52055*4+0x02000000,0x3f9b); +reg_write( DDR_REG_BASE +0x52056*4+0x02000000,0x10); +reg_write( DDR_REG_BASE +0x52057*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x52058*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE +0x52059*4+0x02000000,0xfc7); +reg_write( DDR_REG_BASE +0x5205a*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE +0x5205b*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x5205c*4+0x02000000,0xe174); +reg_write( DDR_REG_BASE +0x5205d*4+0x02000000,0x70ed); +reg_write( DDR_REG_BASE +0x5205e*4+0x02000000,0x45cb); +reg_write( DDR_REG_BASE +0x5205f*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x52060*4+0x02000000,0x7b2); +reg_write( DDR_REG_BASE +0x52061*4+0x02000000,0xb600); +reg_write( DDR_REG_BASE +0x52062*4+0x02000000,0xb601); +reg_write( DDR_REG_BASE +0x52063*4+0x02000000,0x1e59); +reg_write( DDR_REG_BASE +0x52064*4+0x02000000,0x93dc); +reg_write( DDR_REG_BASE +0x52065*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE +0x52066*4+0x02000000,0x36c0); +reg_write( DDR_REG_BASE +0x52067*4+0x02000000,0xf7f); +reg_write( DDR_REG_BASE +0x52068*4+0x02000000,0x1a35); +reg_write( DDR_REG_BASE +0x52069*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x5206a*4+0x02000000,0xbd6); +reg_write( DDR_REG_BASE +0x5206b*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE +0x5206c*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x5206d*4+0x02000000,0x1501); +reg_write( DDR_REG_BASE +0x5206e*4+0x02000000,0x108b); +reg_write( DDR_REG_BASE +0x5206f*4+0x02000000,0x8d80); +reg_write( DDR_REG_BASE +0x52070*4+0x02000000,0x706f); +reg_write( DDR_REG_BASE +0x52071*4+0x02000000,0xf02b); +reg_write( DDR_REG_BASE +0x52072*4+0x02000000,0x241a); +reg_write( DDR_REG_BASE +0x52073*4+0x02000000,0x1f80); +reg_write( DDR_REG_BASE +0x52074*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x52075*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE +0x52076*4+0x02000000,0x206c); +reg_write( DDR_REG_BASE +0x52077*4+0x02000000,0x302); +reg_write( DDR_REG_BASE +0x52078*4+0x02000000,0x2205); +reg_write( DDR_REG_BASE +0x52079*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x5207a*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE +0x5207b*4+0x02000000,0x166); +reg_write( DDR_REG_BASE +0x5207c*4+0x02000000,0x9000); +reg_write( DDR_REG_BASE +0x5207d*4+0x02000000,0x2079); +reg_write( DDR_REG_BASE +0x5207e*4+0x02000000,0x3); +reg_write( DDR_REG_BASE +0x5207f*4+0x02000000,0xc084); +reg_write( DDR_REG_BASE +0x52080*4+0x02000000,0x6098); +reg_write( DDR_REG_BASE +0x52081*4+0x02000000,0x8820); +reg_write( DDR_REG_BASE +0x52082*4+0x02000000,0x793b); +reg_write( DDR_REG_BASE +0x52083*4+0x02000000,0x7965); +reg_write( DDR_REG_BASE +0x52084*4+0x02000000,0xa820); +reg_write( DDR_REG_BASE +0x52085*4+0x02000000,0x241a); +reg_write( DDR_REG_BASE +0x52086*4+0x02000000,0x1f80); +reg_write( DDR_REG_BASE +0x52087*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x52088*4+0x02000000,0x800); +reg_write( DDR_REG_BASE +0x52089*4+0x02000000,0x2153); +reg_write( DDR_REG_BASE +0x5208a*4+0x02000000,0x80be); +reg_write( DDR_REG_BASE +0x5208b*4+0x02000000,0x2004); +reg_write( DDR_REG_BASE +0x5208c*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x5208d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5208e*4+0x02000000,0x800); +reg_write( DDR_REG_BASE +0x5208f*4+0x02000000,0x7a05); +reg_write( DDR_REG_BASE +0x52090*4+0x02000000,0x2205); +reg_write( DDR_REG_BASE +0x52091*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE +0x52092*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE +0x52093*4+0x02000000,0x64); +reg_write( DDR_REG_BASE +0x52094*4+0x02000000,0x9200); +reg_write( DDR_REG_BASE +0x52095*4+0x02000000,0xf206); +reg_write( DDR_REG_BASE +0x52096*4+0x02000000,0x2080); +reg_write( DDR_REG_BASE +0x52097*4+0x02000000,0x10); +reg_write( DDR_REG_BASE +0x52098*4+0x02000000,0x716f); +reg_write( DDR_REG_BASE +0x52099*4+0x02000000,0xb200); +reg_write( DDR_REG_BASE +0x5209a*4+0x02000000,0x7185); +reg_write( DDR_REG_BASE +0x5209b*4+0x02000000,0xbb1); +reg_write( DDR_REG_BASE +0x5209c*4+0x02000000,0x9325); +reg_write( DDR_REG_BASE +0x5209d*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE +0x5209e*4+0x02000000,0xe82); +reg_write( DDR_REG_BASE +0x5209f*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE +0x520a0*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE +0x520a1*4+0x02000000,0xb8f); +reg_write( DDR_REG_BASE +0x520a2*4+0x02000000,0xb031); +reg_write( DDR_REG_BASE +0x520a3*4+0x02000000,0x71e5); +reg_write( DDR_REG_BASE +0x520a4*4+0x02000000,0x706f); +reg_write( DDR_REG_BASE +0x520a5*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x520a6*4+0x02000000,0x6e); +reg_write( DDR_REG_BASE +0x520a7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x520a8*4+0x02000000,0xf9e); +reg_write( DDR_REG_BASE +0x520a9*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE +0x520aa*4+0x02000000,0x2378); +reg_write( DDR_REG_BASE +0x520ab*4+0x02000000,0x3000); +reg_write( DDR_REG_BASE +0x520ac*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x520ad*4+0x02000000,0xb600); +reg_write( DDR_REG_BASE +0x520ae*4+0x02000000,0x992); +reg_write( DDR_REG_BASE +0x520af*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x520b0*4+0x02000000,0xb601); +reg_write( DDR_REG_BASE +0x520b1*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x520b2*4+0x02000000,0x92e); +reg_write( DDR_REG_BASE +0x520b3*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x520b4*4+0x02000000,0x732c); +reg_write( DDR_REG_BASE +0x520b5*4+0x02000000,0xd820); +reg_write( DDR_REG_BASE +0x520b6*4+0x02000000,0xb3e); +reg_write( DDR_REG_BASE +0x520b7*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE +0x520b8*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x520b9*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE +0x520ba*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x520bb*4+0x02000000,0xd8e); +reg_write( DDR_REG_BASE +0x520bc*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE +0x520bd*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE +0x520be*4+0x02000000,0x8d61); +reg_write( DDR_REG_BASE +0x520bf*4+0x02000000,0x8d20); +reg_write( DDR_REG_BASE +0x520c0*4+0x02000000,0xf00a); +reg_write( DDR_REG_BASE +0x520c1*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE +0x520c2*4+0x02000000,0x20f4); +reg_write( DDR_REG_BASE +0x520c3*4+0x02000000,0x40); +reg_write( DDR_REG_BASE +0x520c4*4+0x02000000,0x2042); +reg_write( DDR_REG_BASE +0x520c5*4+0x02000000,0x802); +reg_write( DDR_REG_BASE +0x520c6*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE +0x520c7*4+0x02000000,0x7834); +reg_write( DDR_REG_BASE +0x520c8*4+0x02000000,0xb040); +reg_write( DDR_REG_BASE +0x520c9*4+0x02000000,0x7124); +reg_write( DDR_REG_BASE +0x520ca*4+0x02000000,0xbef); +reg_write( DDR_REG_BASE +0x520cb*4+0x02000000,0x8045); +reg_write( DDR_REG_BASE +0x520cc*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE +0x520cd*4+0x02000000,0xe72); +reg_write( DDR_REG_BASE +0x520ce*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE +0x520cf*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x520d0*4+0x02000000,0xc103); +reg_write( DDR_REG_BASE +0x520d1*4+0x02000000,0x2055); +reg_write( DDR_REG_BASE +0x520d2*4+0x02000000,0x800); +reg_write( DDR_REG_BASE +0x520d3*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE +0x520d4*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE +0x520d5*4+0x02000000,0xc100); +reg_write( DDR_REG_BASE +0x520d6*4+0x02000000,0x83a); +reg_write( DDR_REG_BASE +0x520d7*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE +0x520d8*4+0x02000000,0x716c); +reg_write( DDR_REG_BASE +0x520d9*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x520da*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x520db*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE +0x520dc*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x520dd*4+0x02000000,0xe004); +reg_write( DDR_REG_BASE +0x520de*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x520df*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE +0x520e0*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE +0x520e1*4+0x02000000,0xe076); +reg_write( DDR_REG_BASE +0x520e2*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE +0x520e3*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x520e4*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE +0x520e5*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE +0x520e6*4+0x02000000,0xe0aa); +reg_write( DDR_REG_BASE +0x520e7*4+0x02000000,0xe12); +reg_write( DDR_REG_BASE +0x520e8*4+0x02000000,0xffcf); +reg_write( DDR_REG_BASE +0x520e9*4+0x02000000,0x2480); +reg_write( DDR_REG_BASE +0x520ea*4+0x02000000,0x3702); +reg_write( DDR_REG_BASE +0x520eb*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE +0x520ec*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE +0x520ed*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE +0x520ee*4+0x02000000,0xc2e2); +reg_write( DDR_REG_BASE +0x520ef*4+0x02000000,0xcb2); +reg_write( DDR_REG_BASE +0x520f0*4+0x02000000,0xfe8f); +reg_write( DDR_REG_BASE +0x520f1*4+0x02000000,0x256f); +reg_write( DDR_REG_BASE +0x520f2*4+0x02000000,0x1343); +reg_write( DDR_REG_BASE +0x520f3*4+0x02000000,0x9560); +reg_write( DDR_REG_BASE +0x520f4*4+0x02000000,0xda20); +reg_write( DDR_REG_BASE +0x520f5*4+0x02000000,0xd940); +reg_write( DDR_REG_BASE +0x520f6*4+0x02000000,0x238c); +reg_write( DDR_REG_BASE +0x520f7*4+0x02000000,0x85ca); +reg_write( DDR_REG_BASE +0x520f8*4+0x02000000,0x22ca); +reg_write( DDR_REG_BASE +0x520f9*4+0x02000000,0xc2d); +reg_write( DDR_REG_BASE +0x520fa*4+0x02000000,0x238c); +reg_write( DDR_REG_BASE +0x520fb*4+0x02000000,0x89d0); +reg_write( DDR_REG_BASE +0x520fc*4+0x02000000,0x22ca); +reg_write( DDR_REG_BASE +0x520fd*4+0x02000000,0x4d); +reg_write( DDR_REG_BASE +0x520fe*4+0x02000000,0x238c); +reg_write( DDR_REG_BASE +0x520ff*4+0x02000000,0x8fd8); +reg_write( DDR_REG_BASE +0x52100*4+0x02000000,0xd950); +reg_write( DDR_REG_BASE +0x52101*4+0x02000000,0x22ca); +reg_write( DDR_REG_BASE +0x52102*4+0x02000000,0x4d); +reg_write( DDR_REG_BASE +0x52103*4+0x02000000,0x218a); +reg_write( DDR_REG_BASE +0x52104*4+0x02000000,0x5ca); +reg_write( DDR_REG_BASE +0x52105*4+0x02000000,0x213c); +reg_write( DDR_REG_BASE +0x52106*4+0x02000000,0xc1); +reg_write( DDR_REG_BASE +0x52107*4+0x02000000,0x238c); +reg_write( DDR_REG_BASE +0x52108*4+0x02000000,0x89d0); +reg_write( DDR_REG_BASE +0x52109*4+0x02000000,0x21ca); +reg_write( DDR_REG_BASE +0x5210a*4+0x02000000,0xad); +reg_write( DDR_REG_BASE +0x5210b*4+0x02000000,0x238c); +reg_write( DDR_REG_BASE +0x5210c*4+0x02000000,0x8fd8); +reg_write( DDR_REG_BASE +0x5210d*4+0x02000000,0x21ca); +reg_write( DDR_REG_BASE +0x5210e*4+0x02000000,0xed); +reg_write( DDR_REG_BASE +0x5210f*4+0x02000000,0x73d3); +reg_write( DDR_REG_BASE +0x52110*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x52111*4+0x02000000,0x95f); +reg_write( DDR_REG_BASE +0x52112*4+0x02000000,0x21ca); +reg_write( DDR_REG_BASE +0x52113*4+0x02000000,0x12d); +reg_write( DDR_REG_BASE +0x52114*4+0x02000000,0x2105); +reg_write( DDR_REG_BASE +0x52115*4+0x02000000,0x8c); +reg_write( DDR_REG_BASE +0x52116*4+0x02000000,0x15fe); +reg_write( DDR_REG_BASE +0x52117*4+0x02000000,0x9081); +reg_write( DDR_REG_BASE +0x52118*4+0x02000000,0x205a); +reg_write( DDR_REG_BASE +0x52119*4+0x02000000,0x400); +reg_write( DDR_REG_BASE +0x5211a*4+0x02000000,0x211a); +reg_write( DDR_REG_BASE +0x5211b*4+0x02000000,0xf83); +reg_write( DDR_REG_BASE +0x5211c*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x5211d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5211e*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x5211f*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE +0x52120*4+0x02000000,0xf8); +reg_write( DDR_REG_BASE +0x52121*4+0x02000000,0x2004); +reg_write( DDR_REG_BASE +0x52122*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x52123*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x52124*4+0x02000000,0x1ff0); +reg_write( DDR_REG_BASE +0x52125*4+0x02000000,0xb881); +reg_write( DDR_REG_BASE +0x52126*4+0x02000000,0x2305); +reg_write( DDR_REG_BASE +0x52127*4+0x02000000,0x42); +reg_write( DDR_REG_BASE +0x52128*4+0x02000000,0x7224); +reg_write( DDR_REG_BASE +0x52129*4+0x02000000,0x7965); +reg_write( DDR_REG_BASE +0x5212a*4+0x02000000,0xb280); +reg_write( DDR_REG_BASE +0x5212b*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE +0x5212c*4+0x02000000,0xc6c2); +reg_write( DDR_REG_BASE +0x5212d*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x5212e*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE +0x5212f*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x52130*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE +0x52131*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE +0x52132*4+0x02000000,0x1ea); +reg_write( DDR_REG_BASE +0x52133*4+0x02000000,0x9340); +reg_write( DDR_REG_BASE +0x52134*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE +0x52135*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x52136*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE +0x52137*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x52138*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x52139*4+0x02000000,0xfb00); +reg_write( DDR_REG_BASE +0x5213a*4+0x02000000,0x2204); +reg_write( DDR_REG_BASE +0x5213b*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE +0x5213c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5213d*4+0x02000000,0xc0ff); +reg_write( DDR_REG_BASE +0x5213e*4+0x02000000,0x7845); +reg_write( DDR_REG_BASE +0x5213f*4+0x02000000,0x9341); +reg_write( DDR_REG_BASE +0x52140*4+0x02000000,0xb300); +reg_write( DDR_REG_BASE +0x52141*4+0x02000000,0xb965); +reg_write( DDR_REG_BASE +0x52142*4+0x02000000,0x226c); +reg_write( DDR_REG_BASE +0x52143*4+0x02000000,0x140); +reg_write( DDR_REG_BASE +0x52144*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE +0x52145*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE +0x52146*4+0x02000000,0xb301); +reg_write( DDR_REG_BASE +0x52147*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x52148*4+0x02000000,0x7a1b); +reg_write( DDR_REG_BASE +0x52149*4+0x02000000,0x2205); +reg_write( DDR_REG_BASE +0x5214a*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE +0x5214b*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x5214c*4+0x02000000,0xe164); +reg_write( DDR_REG_BASE +0x5214d*4+0x02000000,0x1a00); +reg_write( DDR_REG_BASE +0x5214e*4+0x02000000,0x5); +reg_write( DDR_REG_BASE +0x5214f*4+0x02000000,0x42c3); +reg_write( DDR_REG_BASE +0x52150*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x52151*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE +0x52152*4+0x02000000,0x8a61); +reg_write( DDR_REG_BASE +0x52153*4+0x02000000,0x8a80); +reg_write( DDR_REG_BASE +0x52154*4+0x02000000,0xf00d); +reg_write( DDR_REG_BASE +0x52155*4+0x02000000,0x241a); +reg_write( DDR_REG_BASE +0x52156*4+0x02000000,0x1f82); +reg_write( DDR_REG_BASE +0x52157*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x52158*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE +0x52159*4+0x02000000,0x7185); +reg_write( DDR_REG_BASE +0x5215a*4+0x02000000,0x7a05); +reg_write( DDR_REG_BASE +0x5215b*4+0x02000000,0x7a5b); +reg_write( DDR_REG_BASE +0x5215c*4+0x02000000,0x2205); +reg_write( DDR_REG_BASE +0x5215d*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE +0x5215e*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE +0x5215f*4+0x02000000,0x164); +reg_write( DDR_REG_BASE +0x52160*4+0x02000000,0xb220); +reg_write( DDR_REG_BASE +0x52161*4+0x02000000,0xbeb); +reg_write( DDR_REG_BASE +0x52162*4+0x02000000,0x8305); +reg_write( DDR_REG_BASE +0x52163*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE +0x52164*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE +0x52165*4+0x02000000,0x266f); +reg_write( DDR_REG_BASE +0x52166*4+0x02000000,0x15c3); +reg_write( DDR_REG_BASE +0x52167*4+0x02000000,0x8e40); +reg_write( DDR_REG_BASE +0x52168*4+0x02000000,0x4508); +reg_write( DDR_REG_BASE +0x52169*4+0x02000000,0xea17); +reg_write( DDR_REG_BASE +0x5216a*4+0x02000000,0xede); +reg_write( DDR_REG_BASE +0x5216b*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x5216c*4+0x02000000,0x4040); +reg_write( DDR_REG_BASE +0x5216d*4+0x02000000,0x4708); +reg_write( DDR_REG_BASE +0x5216e*4+0x02000000,0xe887); +reg_write( DDR_REG_BASE +0x5216f*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x52170*4+0x02000000,0xd6); +reg_write( DDR_REG_BASE +0x52171*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x52172*4+0x02000000,0xe0a); +reg_write( DDR_REG_BASE +0x52173*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE +0x52174*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x52175*4+0x02000000,0x40e1); +reg_write( DDR_REG_BASE +0x52176*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE +0x52177*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x52178*4+0x02000000,0x7f05); +reg_write( DDR_REG_BASE +0x52179*4+0x02000000,0x78bb); +reg_write( DDR_REG_BASE +0x5217a*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x5217b*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x5217c*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x5217d*4+0x02000000,0xfe92); +reg_write( DDR_REG_BASE +0x5217e*4+0x02000000,0xb0e0); +reg_write( DDR_REG_BASE +0x5217f*4+0x02000000,0x16ff); +reg_write( DDR_REG_BASE +0x52180*4+0x02000000,0x9082); +reg_write( DDR_REG_BASE +0x52181*4+0x02000000,0xea16); +reg_write( DDR_REG_BASE +0x52182*4+0x02000000,0xeae); +reg_write( DDR_REG_BASE +0x52183*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x52184*4+0x02000000,0x4040); +reg_write( DDR_REG_BASE +0x52185*4+0x02000000,0x228c); +reg_write( DDR_REG_BASE +0x52186*4+0x02000000,0x8fc3); +reg_write( DDR_REG_BASE +0x52187*4+0x02000000,0xf209); +reg_write( DDR_REG_BASE +0x52188*4+0x02000000,0xe888); +reg_write( DDR_REG_BASE +0x52189*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x5218a*4+0x02000000,0xd7); +reg_write( DDR_REG_BASE +0x5218b*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x5218c*4+0x02000000,0xdd6); +reg_write( DDR_REG_BASE +0x5218d*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE +0x5218e*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x5218f*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x52190*4+0x02000000,0x79bb); +reg_write( DDR_REG_BASE +0x52191*4+0x02000000,0x2105); +reg_write( DDR_REG_BASE +0x52192*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE +0x52193*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x52194*4+0x02000000,0xfe9a); +reg_write( DDR_REG_BASE +0x52195*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE +0x52196*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE +0x52197*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x52198*4+0x02000000,0xc0f1); +reg_write( DDR_REG_BASE +0x52199*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x5219a*4+0x02000000,0x7082); +reg_write( DDR_REG_BASE +0x5219b*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x5219c*4+0x02000000,0x9); +reg_write( DDR_REG_BASE +0x5219d*4+0x02000000,0xea1a); +reg_write( DDR_REG_BASE +0x5219e*4+0x02000000,0xa23); +reg_write( DDR_REG_BASE +0x5219f*4+0x02000000,0xa30); +reg_write( DDR_REG_BASE +0x521a0*4+0x02000000,0x720c); +reg_write( DDR_REG_BASE +0x521a1*4+0x02000000,0x228c); +reg_write( DDR_REG_BASE +0x521a2*4+0x02000000,0x8c03); +reg_write( DDR_REG_BASE +0x521a3*4+0x02000000,0xf20c); +reg_write( DDR_REG_BASE +0x521a4*4+0x02000000,0xe2f8); +reg_write( DDR_REG_BASE +0x521a5*4+0x02000000,0xf404); +reg_write( DDR_REG_BASE +0x521a6*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE +0x521a7*4+0x02000000,0xf009); +reg_write( DDR_REG_BASE +0x521a8*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x521a9*4+0x02000000,0xd8); +reg_write( DDR_REG_BASE +0x521aa*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x521ab*4+0x02000000,0xd9a); +reg_write( DDR_REG_BASE +0x521ac*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE +0x521ad*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x521ae*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x521af*4+0x02000000,0x205f); +reg_write( DDR_REG_BASE +0x521b0*4+0x02000000,0x401); +reg_write( DDR_REG_BASE +0x521b1*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE +0x521b2*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x521b3*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE +0x521b4*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE +0x521b5*4+0x02000000,0xe0a0); +reg_write( DDR_REG_BASE +0x521b6*4+0x02000000,0xc0d1); +reg_write( DDR_REG_BASE +0x521b7*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE +0x521b8*4+0x02000000,0xc0e2); +reg_write( DDR_REG_BASE +0x521b9*4+0x02000000,0x706d); +reg_write( DDR_REG_BASE +0x521ba*4+0x02000000,0xf00e); +reg_write( DDR_REG_BASE +0x521bb*4+0x02000000,0x239a); +reg_write( DDR_REG_BASE +0x521bc*4+0x02000000,0x901); +reg_write( DDR_REG_BASE +0x521bd*4+0x02000000,0x607d); +reg_write( DDR_REG_BASE +0x521be*4+0x02000000,0x245a); +reg_write( DDR_REG_BASE +0x521bf*4+0x02000000,0x1c83); +reg_write( DDR_REG_BASE +0x521c0*4+0x02000000,0x7185); +reg_write( DDR_REG_BASE +0x521c1*4+0x02000000,0x63bb); +reg_write( DDR_REG_BASE +0x521c2*4+0x02000000,0x633b); +reg_write( DDR_REG_BASE +0x521c3*4+0x02000000,0xab40); +reg_write( DDR_REG_BASE +0x521c4*4+0x02000000,0xcef); +reg_write( DDR_REG_BASE +0x521c5*4+0x02000000,0x90b4); +reg_write( DDR_REG_BASE +0x521c6*4+0x02000000,0x4361); +reg_write( DDR_REG_BASE +0x521c7*4+0x02000000,0x7165); +reg_write( DDR_REG_BASE +0x521c8*4+0x02000000,0xbf9); +reg_write( DDR_REG_BASE +0x521c9*4+0x02000000,0x90b4); +reg_write( DDR_REG_BASE +0x521ca*4+0x02000000,0x708d); +reg_write( DDR_REG_BASE +0x521cb*4+0x02000000,0xc4c2); +reg_write( DDR_REG_BASE +0x521cc*4+0x02000000,0xc0e6); +reg_write( DDR_REG_BASE +0x521cd*4+0x02000000,0x4328); +reg_write( DDR_REG_BASE +0x521ce*4+0x02000000,0x70ed); +reg_write( DDR_REG_BASE +0x521cf*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x521d0*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x521d1*4+0x02000000,0xff64); +reg_write( DDR_REG_BASE +0x521d2*4+0x02000000,0xb1e0); +reg_write( DDR_REG_BASE +0x521d3*4+0x02000000,0x1904); +reg_write( DDR_REG_BASE +0x521d4*4+0x02000000,0x45); +reg_write( DDR_REG_BASE +0x521d5*4+0x02000000,0x42c3); +reg_write( DDR_REG_BASE +0x521d6*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x521d7*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE +0x521d8*4+0x02000000,0x8a21); +reg_write( DDR_REG_BASE +0x521d9*4+0x02000000,0x8ac0); +reg_write( DDR_REG_BASE +0x521da*4+0x02000000,0xf03b); +reg_write( DDR_REG_BASE +0x521db*4+0x02000000,0x228c); +reg_write( DDR_REG_BASE +0x521dc*4+0x02000000,0x8fc3); +reg_write( DDR_REG_BASE +0x521dd*4+0x02000000,0xf41a); +reg_write( DDR_REG_BASE +0x521de*4+0x02000000,0x261a); +reg_write( DDR_REG_BASE +0x521df*4+0x02000000,0x1f83); +reg_write( DDR_REG_BASE +0x521e0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x521e1*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE +0x521e2*4+0x02000000,0x42c3); +reg_write( DDR_REG_BASE +0x521e3*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE +0x521e4*4+0x02000000,0x1f64); +reg_write( DDR_REG_BASE +0x521e5*4+0x02000000,0x2305); +reg_write( DDR_REG_BASE +0x521e6*4+0x02000000,0x8c); +reg_write( DDR_REG_BASE +0x521e7*4+0x02000000,0x7444); +reg_write( DDR_REG_BASE +0x521e8*4+0x02000000,0x7a65); +reg_write( DDR_REG_BASE +0x521e9*4+0x02000000,0xb400); +reg_write( DDR_REG_BASE +0x521ea*4+0x02000000,0xb2e0); +reg_write( DDR_REG_BASE +0x521eb*4+0x02000000,0x42c3); +reg_write( DDR_REG_BASE +0x521ec*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE +0x521ed*4+0x02000000,0x1164); +reg_write( DDR_REG_BASE +0x521ee*4+0x02000000,0x2305); +reg_write( DDR_REG_BASE +0x521ef*4+0x02000000,0x8c); +reg_write( DDR_REG_BASE +0x521f0*4+0x02000000,0x7444); +reg_write( DDR_REG_BASE +0x521f1*4+0x02000000,0x7a65); +reg_write( DDR_REG_BASE +0x521f2*4+0x02000000,0xb4e0); +reg_write( DDR_REG_BASE +0x521f3*4+0x02000000,0x1a00); +reg_write( DDR_REG_BASE +0x521f4*4+0x02000000,0x45); +reg_write( DDR_REG_BASE +0x521f5*4+0x02000000,0xf020); +reg_write( DDR_REG_BASE +0x521f6*4+0x02000000,0x260a); +reg_write( DDR_REG_BASE +0x521f7*4+0x02000000,0x32c0); +reg_write( DDR_REG_BASE +0x521f8*4+0x02000000,0x708d); +reg_write( DDR_REG_BASE +0x521f9*4+0x02000000,0xf016); +reg_write( DDR_REG_BASE +0x521fa*4+0x02000000,0xf753); +reg_write( DDR_REG_BASE +0x521fb*4+0x02000000,0x4381); +reg_write( DDR_REG_BASE +0x521fc*4+0x02000000,0x261a); +reg_write( DDR_REG_BASE +0x521fd*4+0x02000000,0x1f82); +reg_write( DDR_REG_BASE +0x521fe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x521ff*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE +0x52200*4+0x02000000,0x239a); +reg_write( DDR_REG_BASE +0x52201*4+0x02000000,0x8); +reg_write( DDR_REG_BASE +0x52202*4+0x02000000,0x7b45); +reg_write( DDR_REG_BASE +0x52203*4+0x02000000,0x42c3); +reg_write( DDR_REG_BASE +0x52204*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE +0x52205*4+0x02000000,0x164); +reg_write( DDR_REG_BASE +0x52206*4+0x02000000,0x2305); +reg_write( DDR_REG_BASE +0x52207*4+0x02000000,0x8d); +reg_write( DDR_REG_BASE +0x52208*4+0x02000000,0x7444); +reg_write( DDR_REG_BASE +0x52209*4+0x02000000,0x7b45); +reg_write( DDR_REG_BASE +0x5220a*4+0x02000000,0xb500); +reg_write( DDR_REG_BASE +0x5220b*4+0x02000000,0x1b00); +reg_write( DDR_REG_BASE +0x5220c*4+0x02000000,0x5); +reg_write( DDR_REG_BASE +0x5220d*4+0x02000000,0x7185); +reg_write( DDR_REG_BASE +0x5220e*4+0x02000000,0xe0d); +reg_write( DDR_REG_BASE +0x5220f*4+0x02000000,0x3010); +reg_write( DDR_REG_BASE +0x52210*4+0x02000000,0xcd5); +reg_write( DDR_REG_BASE +0x52211*4+0x02000000,0x9274); +reg_write( DDR_REG_BASE +0x52212*4+0x02000000,0x262f); +reg_write( DDR_REG_BASE +0x52213*4+0x02000000,0xb782); +reg_write( DDR_REG_BASE +0x52214*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE +0x52215*4+0x02000000,0x98f); +reg_write( DDR_REG_BASE +0x52216*4+0x02000000,0x83a5); +reg_write( DDR_REG_BASE +0x52217*4+0x02000000,0x222f); +reg_write( DDR_REG_BASE +0x52218*4+0x02000000,0x2c7); +reg_write( DDR_REG_BASE +0x52219*4+0x02000000,0xc4c6); +reg_write( DDR_REG_BASE +0x5221a*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE +0x5221b*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE +0x5221c*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE +0x5221d*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x5221e*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE +0x5221f*4+0x02000000,0x30); +reg_write( DDR_REG_BASE +0x52220*4+0x02000000,0x10b4); +reg_write( DDR_REG_BASE +0x52221*4+0x02000000,0x501); +reg_write( DDR_REG_BASE +0x52222*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x52223*4+0x02000000,0x708d); +reg_write( DDR_REG_BASE +0x52224*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x52225*4+0x02000000,0x23); +reg_write( DDR_REG_BASE +0x52226*4+0x02000000,0x90b); +reg_write( DDR_REG_BASE +0x52227*4+0x02000000,0x171); +reg_write( DDR_REG_BASE +0x52228*4+0x02000000,0xb0a0); +reg_write( DDR_REG_BASE +0x52229*4+0x02000000,0xb0a1); +reg_write( DDR_REG_BASE +0x5222a*4+0x02000000,0xf006); +reg_write( DDR_REG_BASE +0x5222b*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x5222c*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE +0x5222d*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x5222e*4+0x02000000,0x49); +reg_write( DDR_REG_BASE +0x5222f*4+0x02000000,0xb021); +reg_write( DDR_REG_BASE +0x52230*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE +0x52231*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x52232*4+0x02000000,0x7b6); +reg_write( DDR_REG_BASE +0x52233*4+0x02000000,0xed21); +reg_write( DDR_REG_BASE +0x52234*4+0x02000000,0x8ee0); +reg_write( DDR_REG_BASE +0x52235*4+0x02000000,0x2544); +reg_write( DDR_REG_BASE +0x52236*4+0x02000000,0x108b); +reg_write( DDR_REG_BASE +0x52237*4+0x02000000,0x2544); +reg_write( DDR_REG_BASE +0x52238*4+0x02000000,0x105b); +reg_write( DDR_REG_BASE +0x52239*4+0x02000000,0xf017); +reg_write( DDR_REG_BASE +0x5223a*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE +0x5223b*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x5223c*4+0x02000000,0x2553); +reg_write( DDR_REG_BASE +0x5223d*4+0x02000000,0x1041); +reg_write( DDR_REG_BASE +0x5223e*4+0x02000000,0x7905); +reg_write( DDR_REG_BASE +0x5223f*4+0x02000000,0x4061); +reg_write( DDR_REG_BASE +0x52240*4+0x02000000,0xf82d); +reg_write( DDR_REG_BASE +0x52241*4+0x02000000,0xb11); +reg_write( DDR_REG_BASE +0x52242*4+0x02000000,0x3030); +reg_write( DDR_REG_BASE +0x52243*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE +0x52244*4+0x02000000,0x79ef); +reg_write( DDR_REG_BASE +0x52245*4+0x02000000,0x95e); +reg_write( DDR_REG_BASE +0x52246*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE +0x52247*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x52248*4+0x02000000,0xb0d); +reg_write( DDR_REG_BASE +0x52249*4+0x02000000,0x1030); +reg_write( DDR_REG_BASE +0x5224a*4+0x02000000,0x79ef); +reg_write( DDR_REG_BASE +0x5224b*4+0x02000000,0x952); +reg_write( DDR_REG_BASE +0x5224c*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE +0x5224d*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE +0x5224e*4+0x02000000,0x71e5); +reg_write( DDR_REG_BASE +0x5224f*4+0x02000000,0x8e01); +reg_write( DDR_REG_BASE +0x52250*4+0x02000000,0x8d5); +reg_write( DDR_REG_BASE +0x52251*4+0x02000000,0x83e5); +reg_write( DDR_REG_BASE +0x52252*4+0x02000000,0x4063); +reg_write( DDR_REG_BASE +0x52253*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x52254*4+0x02000000,0x708b); +reg_write( DDR_REG_BASE +0x52255*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x52256*4+0x02000000,0x49); +reg_write( DDR_REG_BASE +0x52257*4+0x02000000,0xb43); +reg_write( DDR_REG_BASE +0x52258*4+0x02000000,0x1030); +reg_write( DDR_REG_BASE +0x52259*4+0x02000000,0x2344); +reg_write( DDR_REG_BASE +0x5225a*4+0x02000000,0x109b); +reg_write( DDR_REG_BASE +0x5225b*4+0x02000000,0x8ee2); +reg_write( DDR_REG_BASE +0x5225c*4+0x02000000,0x2344); +reg_write( DDR_REG_BASE +0x5225d*4+0x02000000,0x104d); +reg_write( DDR_REG_BASE +0x5225e*4+0x02000000,0xf015); +reg_write( DDR_REG_BASE +0x5225f*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE +0x52260*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x52261*4+0x02000000,0x2353); +reg_write( DDR_REG_BASE +0x52262*4+0x02000000,0x1041); +reg_write( DDR_REG_BASE +0x52263*4+0x02000000,0x7905); +reg_write( DDR_REG_BASE +0x52264*4+0x02000000,0x4063); +reg_write( DDR_REG_BASE +0x52265*4+0x02000000,0xf81b); +reg_write( DDR_REG_BASE +0x52266*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE +0x52267*4+0x02000000,0xed06); +reg_write( DDR_REG_BASE +0x52268*4+0x02000000,0x79ef); +reg_write( DDR_REG_BASE +0x52269*4+0x02000000,0x916); +reg_write( DDR_REG_BASE +0x5226a*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE +0x5226b*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x5226c*4+0x02000000,0xb0d); +reg_write( DDR_REG_BASE +0x5226d*4+0x02000000,0x3030); +reg_write( DDR_REG_BASE +0x5226e*4+0x02000000,0x79ef); +reg_write( DDR_REG_BASE +0x5226f*4+0x02000000,0x90a); +reg_write( DDR_REG_BASE +0x52270*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE +0x52271*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE +0x52272*4+0x02000000,0x71e5); +reg_write( DDR_REG_BASE +0x52273*4+0x02000000,0x8e03); +reg_write( DDR_REG_BASE +0x52274*4+0x02000000,0x8d7); +reg_write( DDR_REG_BASE +0x52275*4+0x02000000,0x83e5); +reg_write( DDR_REG_BASE +0x52276*4+0x02000000,0x40a1); +reg_write( DDR_REG_BASE +0x52277*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE +0x52278*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE +0x52279*4+0x02000000,0x1ea); +reg_write( DDR_REG_BASE +0x5227a*4+0x02000000,0x9300); +reg_write( DDR_REG_BASE +0x5227b*4+0x02000000,0x42c3); +reg_write( DDR_REG_BASE +0x5227c*4+0x02000000,0x9012); +reg_write( DDR_REG_BASE +0x5227d*4+0x02000000,0x402); +reg_write( DDR_REG_BASE +0x5227e*4+0x02000000,0x2004); +reg_write( DDR_REG_BASE +0x5227f*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE +0x52280*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x52281*4+0x02000000,0x3f00); +reg_write( DDR_REG_BASE +0x52282*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x52283*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE +0x52284*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x52285*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x52286*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE +0x52287*4+0x02000000,0xf8c); +reg_write( DDR_REG_BASE +0x52288*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x52289*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5228a*4+0x02000000,0x2405); +reg_write( DDR_REG_BASE +0x5228b*4+0x02000000,0x1080); +reg_write( DDR_REG_BASE +0x5228c*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE +0x5228d*4+0x02000000,0x6a04); +reg_write( DDR_REG_BASE +0x5228e*4+0x02000000,0x2196); +reg_write( DDR_REG_BASE +0x5228f*4+0x02000000,0x6); +reg_write( DDR_REG_BASE +0x52290*4+0x02000000,0x7885); +reg_write( DDR_REG_BASE +0x52291*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE +0x52292*4+0x02000000,0x9321); +reg_write( DDR_REG_BASE +0x52293*4+0x02000000,0x6a02); +reg_write( DDR_REG_BASE +0x52294*4+0x02000000,0x7885); +reg_write( DDR_REG_BASE +0x52295*4+0x02000000,0xb9c5); +reg_write( DDR_REG_BASE +0x52296*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE +0x52297*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE +0x52298*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE +0x52299*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE +0x5229a*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE +0x5229b*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x5229c*4+0x02000000,0x2105); +reg_write( DDR_REG_BASE +0x5229d*4+0x02000000,0x2); +reg_write( DDR_REG_BASE +0x5229e*4+0x02000000,0x271a); +reg_write( DDR_REG_BASE +0x5229f*4+0x02000000,0x1f80); +reg_write( DDR_REG_BASE +0x522a0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x522a1*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE +0x522a2*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x522a3*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE +0x522a4*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE +0x522a5*4+0x02000000,0x154); +reg_write( DDR_REG_BASE +0x522a6*4+0x02000000,0x9100); +reg_write( DDR_REG_BASE +0x522a7*4+0x02000000,0x7845); +reg_write( DDR_REG_BASE +0x522a8*4+0x02000000,0xb88a); +reg_write( DDR_REG_BASE +0x522a9*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE +0x522aa*4+0x02000000,0x42c3); +reg_write( DDR_REG_BASE +0x522ab*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE +0x522ac*4+0x02000000,0x110); +reg_write( DDR_REG_BASE +0x522ad*4+0x02000000,0x9200); +reg_write( DDR_REG_BASE +0x522ae*4+0x02000000,0x204f); +reg_write( DDR_REG_BASE +0x522af*4+0x02000000,0x101); +reg_write( DDR_REG_BASE +0x522b0*4+0x02000000,0xb8a4); +reg_write( DDR_REG_BASE +0x522b1*4+0x02000000,0xb220); +reg_write( DDR_REG_BASE +0x522b2*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE +0x522b3*4+0x02000000,0xb200); +reg_write( DDR_REG_BASE +0x522b4*4+0x02000000,0x2032); +reg_write( DDR_REG_BASE +0x522b5*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE +0x522b6*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x522b7*4+0x02000000,0x18); +reg_write( DDR_REG_BASE +0x522b8*4+0x02000000,0xb9e7); +reg_write( DDR_REG_BASE +0x522b9*4+0x02000000,0x7ce0); +reg_write( DDR_REG_BASE +0x522ba*4+0x02000000,0xb9c6); +reg_write( DDR_REG_BASE +0x522bb*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE +0x522bc*4+0x02000000,0x4020); +reg_write( DDR_REG_BASE +0x522bd*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x522be*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE +0x522bf*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE +0x522c0*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE +0x522c1*4+0x02000000,0x2482); +reg_write( DDR_REG_BASE +0x522c2*4+0x02000000,0x3409); +reg_write( DDR_REG_BASE +0x522c3*4+0x02000000,0x216f); +reg_write( DDR_REG_BASE +0x522c4*4+0x02000000,0x243); +reg_write( DDR_REG_BASE +0x522c5*4+0x02000000,0x4508); +reg_write( DDR_REG_BASE +0x522c6*4+0x02000000,0x8900); +reg_write( DDR_REG_BASE +0x522c7*4+0x02000000,0x11fd); +reg_write( DDR_REG_BASE +0x522c8*4+0x02000000,0x808f); +reg_write( DDR_REG_BASE +0x522c9*4+0x02000000,0x1145); +reg_write( DDR_REG_BASE +0x522ca*4+0x02000000,0x83); +reg_write( DDR_REG_BASE +0x522cb*4+0x02000000,0x89df); +reg_write( DDR_REG_BASE +0x522cc*4+0x02000000,0x1209); +reg_write( DDR_REG_BASE +0x522cd*4+0x02000000,0x309e); +reg_write( DDR_REG_BASE +0x522ce*4+0x02000000,0xc046); +reg_write( DDR_REG_BASE +0x522cf*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE +0x522d0*4+0x02000000,0x3e80); +reg_write( DDR_REG_BASE +0x522d1*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x522d2*4+0x02000000,0xaee); +reg_write( DDR_REG_BASE +0x522d3*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE +0x522d4*4+0x02000000,0xdab4); +reg_write( DDR_REG_BASE +0x522d5*4+0x02000000,0xc08d); +reg_write( DDR_REG_BASE +0x522d6*4+0x02000000,0xae6); +reg_write( DDR_REG_BASE +0x522d7*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE +0x522d8*4+0x02000000,0xdab4); +reg_write( DDR_REG_BASE +0x522d9*4+0x02000000,0x2578); +reg_write( DDR_REG_BASE +0x522da*4+0x02000000,0x1140); +reg_write( DDR_REG_BASE +0x522db*4+0x02000000,0xc048); +reg_write( DDR_REG_BASE +0x522dc*4+0x02000000,0x254f); +reg_write( DDR_REG_BASE +0x522dd*4+0x02000000,0x1080); +reg_write( DDR_REG_BASE +0x522de*4+0x02000000,0x2078); +reg_write( DDR_REG_BASE +0x522df*4+0x02000000,0x101); +reg_write( DDR_REG_BASE +0x522e0*4+0x02000000,0xc008); +reg_write( DDR_REG_BASE +0x522e1*4+0x02000000,0xbfe2); +reg_write( DDR_REG_BASE +0x522e2*4+0x02000000,0x7bc5); +reg_write( DDR_REG_BASE +0x522e3*4+0x02000000,0x7905); +reg_write( DDR_REG_BASE +0x522e4*4+0x02000000,0x2578); +reg_write( DDR_REG_BASE +0x522e5*4+0x02000000,0x10c0); +reg_write( DDR_REG_BASE +0x522e6*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE +0x522e7*4+0x02000000,0xc047); +reg_write( DDR_REG_BASE +0x522e8*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE +0x522e9*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE +0x522ea*4+0x02000000,0x20ca); +reg_write( DDR_REG_BASE +0x522eb*4+0x02000000,0x3e1); +reg_write( DDR_REG_BASE +0x522ec*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE +0x522ed*4+0x02000000,0x2579); +reg_write( DDR_REG_BASE +0x522ee*4+0x02000000,0x1180); +reg_write( DDR_REG_BASE +0x522ef*4+0x02000000,0xc04b); +reg_write( DDR_REG_BASE +0x522f0*4+0x02000000,0x2542); +reg_write( DDR_REG_BASE +0x522f1*4+0x02000000,0x1240); +reg_write( DDR_REG_BASE +0x522f2*4+0x02000000,0xc049); +reg_write( DDR_REG_BASE +0x522f3*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE +0x522f4*4+0x02000000,0x2678); +reg_write( DDR_REG_BASE +0x522f5*4+0x02000000,0x301b); +reg_write( DDR_REG_BASE +0x522f6*4+0x02000000,0x70ed); +reg_write( DDR_REG_BASE +0x522f7*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE +0x522f8*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x522f9*4+0x02000000,0x10); +reg_write( DDR_REG_BASE +0x522fa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x522fb*4+0x02000000,0x70cd); +reg_write( DDR_REG_BASE +0x522fc*4+0x02000000,0xc34a); +reg_write( DDR_REG_BASE +0x522fd*4+0x02000000,0xc04c); +reg_write( DDR_REG_BASE +0x522fe*4+0x02000000,0xf0a5); +reg_write( DDR_REG_BASE +0x522ff*4+0x02000000,0x4300); +reg_write( DDR_REG_BASE +0x52300*4+0x02000000,0x2744); +reg_write( DDR_REG_BASE +0x52301*4+0x02000000,0x17c0); +reg_write( DDR_REG_BASE +0x52302*4+0x02000000,0xc107); +reg_write( DDR_REG_BASE +0x52303*4+0x02000000,0xe806); +reg_write( DDR_REG_BASE +0x52304*4+0x02000000,0xb861); +reg_write( DDR_REG_BASE +0x52305*4+0x02000000,0x801); +reg_write( DDR_REG_BASE +0x52306*4+0x02000000,0x31); +reg_write( DDR_REG_BASE +0x52307*4+0x02000000,0x7b7b); +reg_write( DDR_REG_BASE +0x52308*4+0x02000000,0x9fa); +reg_write( DDR_REG_BASE +0x52309*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE +0x5230a*4+0x02000000,0x40e1); +reg_write( DDR_REG_BASE +0x5230b*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE +0x5230c*4+0x02000000,0xc00a); +reg_write( DDR_REG_BASE +0x5230d*4+0x02000000,0x7b0b); +reg_write( DDR_REG_BASE +0x5230e*4+0x02000000,0xf294); +reg_write( DDR_REG_BASE +0x5230f*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x52310*4+0x02000000,0xf073); +reg_write( DDR_REG_BASE +0x52311*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x52312*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE +0x52313*4+0x02000000,0xaba); +reg_write( DDR_REG_BASE +0x52314*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x52315*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE +0x52316*4+0x02000000,0x8d1); +reg_write( DDR_REG_BASE +0x52317*4+0x02000000,0x30); +reg_write( DDR_REG_BASE +0x52318*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x52319*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x5231a*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x5231b*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE +0x5231c*4+0x02000000,0xa8e1); +reg_write( DDR_REG_BASE +0x5231d*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE +0x5231e*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE +0x5231f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x52320*4+0x02000000,0x19c); +reg_write( DDR_REG_BASE +0x52321*4+0x02000000,0xa52); +reg_write( DDR_REG_BASE +0x52322*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE +0x52323*4+0x02000000,0xdab4); +reg_write( DDR_REG_BASE +0x52324*4+0x02000000,0xd3f); +reg_write( DDR_REG_BASE +0x52325*4+0x02000000,0x11f5); +reg_write( DDR_REG_BASE +0x52326*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x52327*4+0x02000000,0x2025); +reg_write( DDR_REG_BASE +0x52328*4+0x02000000,0x340); +reg_write( DDR_REG_BASE +0x52329*4+0x02000000,0xf020); +reg_write( DDR_REG_BASE +0x5232a*4+0x02000000,0xf026); +reg_write( DDR_REG_BASE +0x5232b*4+0x02000000,0xf02e); +reg_write( DDR_REG_BASE +0x5232c*4+0x02000000,0xf030); +reg_write( DDR_REG_BASE +0x5232d*4+0x02000000,0xf004); +reg_write( DDR_REG_BASE +0x5232e*4+0x02000000,0xf002); +reg_write( DDR_REG_BASE +0x5232f*4+0x02000000,0xf033); +reg_write( DDR_REG_BASE +0x52330*4+0x02000000,0xc08d); +reg_write( DDR_REG_BASE +0x52331*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE +0x52332*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE +0x52333*4+0x02000000,0x3e80); +reg_write( DDR_REG_BASE +0x52334*4+0x02000000,0xc103); +reg_write( DDR_REG_BASE +0x52335*4+0x02000000,0xc208); +reg_write( DDR_REG_BASE +0x52336*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE +0x52337*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE +0x52338*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE +0x52339*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5233a*4+0x02000000,0x19c); +reg_write( DDR_REG_BASE +0x5233b*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE +0x5233c*4+0x02000000,0x40e1); +reg_write( DDR_REG_BASE +0x5233d*4+0x02000000,0xfb2); +reg_write( DDR_REG_BASE +0x5233e*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE +0x5233f*4+0x02000000,0x4363); +reg_write( DDR_REG_BASE +0x52340*4+0x02000000,0x716d); +reg_write( DDR_REG_BASE +0x52341*4+0x02000000,0xd88c); +reg_write( DDR_REG_BASE +0x52342*4+0x02000000,0xf02f); +reg_write( DDR_REG_BASE +0x52343*4+0x02000000,0x70d5); +reg_write( DDR_REG_BASE +0x52344*4+0x02000000,0x43c9); +reg_write( DDR_REG_BASE +0x52345*4+0x02000000,0x70cd); +reg_write( DDR_REG_BASE +0x52346*4+0x02000000,0xf42b); +reg_write( DDR_REG_BASE +0x52347*4+0x02000000,0xf038); +reg_write( DDR_REG_BASE +0x52348*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE +0x52349*4+0x02000000,0x3f81); +reg_write( DDR_REG_BASE +0x5234a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5234b*4+0x02000000,0x19c); +reg_write( DDR_REG_BASE +0x5234c*4+0x02000000,0x95e); +reg_write( DDR_REG_BASE +0x5234d*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE +0x5234e*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE +0x5234f*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE +0x52350*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE +0x52351*4+0x02000000,0x3f81); +reg_write( DDR_REG_BASE +0x52352*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x52353*4+0x02000000,0x19c); +reg_write( DDR_REG_BASE +0x52354*4+0x02000000,0xf56); +reg_write( DDR_REG_BASE +0x52355*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE +0x52356*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE +0x52357*4+0x02000000,0xf009); +reg_write( DDR_REG_BASE +0x52358*4+0x02000000,0xbe2); +reg_write( DDR_REG_BASE +0x52359*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE +0x5235a*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE +0x5235b*4+0x02000000,0xf005); +reg_write( DDR_REG_BASE +0x5235c*4+0x02000000,0xc0e); +reg_write( DDR_REG_BASE +0x5235d*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE +0x5235e*4+0x02000000,0x40e1); +reg_write( DDR_REG_BASE +0x5235f*4+0x02000000,0x70cd); +reg_write( DDR_REG_BASE +0x52360*4+0x02000000,0xf01e); +reg_write( DDR_REG_BASE +0x52361*4+0x02000000,0xc08d); +reg_write( DDR_REG_BASE +0x52362*4+0x02000000,0xc103); +reg_write( DDR_REG_BASE +0x52363*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE +0x52364*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE +0x52365*4+0x02000000,0x3e80); +reg_write( DDR_REG_BASE +0x52366*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE +0x52367*4+0x02000000,0x40e1); +reg_write( DDR_REG_BASE +0x52368*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE +0x52369*4+0x02000000,0x3f83); +reg_write( DDR_REG_BASE +0x5236a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5236b*4+0x02000000,0x19c); +reg_write( DDR_REG_BASE +0x5236c*4+0x02000000,0xf4e); +reg_write( DDR_REG_BASE +0x5236d*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x5236e*4+0x02000000,0x4263); +reg_write( DDR_REG_BASE +0x5236f*4+0x02000000,0x716d); +reg_write( DDR_REG_BASE +0x52370*4+0x02000000,0xd8c0); +reg_write( DDR_REG_BASE +0x52371*4+0x02000000,0xc104); +reg_write( DDR_REG_BASE +0x52372*4+0x02000000,0xc20b); +reg_write( DDR_REG_BASE +0x52373*4+0x02000000,0x6038); +reg_write( DDR_REG_BASE +0x52374*4+0x02000000,0xc10c); +reg_write( DDR_REG_BASE +0x52375*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE +0x52376*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE +0x52377*4+0x02000000,0x3f81); +reg_write( DDR_REG_BASE +0x52378*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x52379*4+0x02000000,0x19c); +reg_write( DDR_REG_BASE +0x5237a*4+0x02000000,0xaf2); +reg_write( DDR_REG_BASE +0x5237b*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE +0x5237c*4+0x02000000,0x716c); +reg_write( DDR_REG_BASE +0x5237d*4+0x02000000,0x4669); +reg_write( DDR_REG_BASE +0x5237e*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x5237f*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE +0x52380*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x52381*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE +0x52382*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE +0x52383*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x52384*4+0x02000000,0x7002); +reg_write( DDR_REG_BASE +0x52385*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x52386*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE +0x52387*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE +0x52388*4+0x02000000,0x813); +reg_write( DDR_REG_BASE +0x52389*4+0x02000000,0x80b4); +reg_write( DDR_REG_BASE +0x5238a*4+0x02000000,0x78ef); +reg_write( DDR_REG_BASE +0x5238b*4+0x02000000,0xd06); +reg_write( DDR_REG_BASE +0x5238c*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE +0x5238d*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE +0x5238e*4+0x02000000,0xca09); +reg_write( DDR_REG_BASE +0x5238f*4+0x02000000,0xe894); +reg_write( DDR_REG_BASE +0x52390*4+0x02000000,0xd0f); +reg_write( DDR_REG_BASE +0x52391*4+0x02000000,0x10f1); +reg_write( DDR_REG_BASE +0x52392*4+0x02000000,0x79ef); +reg_write( DDR_REG_BASE +0x52393*4+0x02000000,0xc7e); +reg_write( DDR_REG_BASE +0x52394*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE +0x52395*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE +0x52396*4+0x02000000,0xf00c); +reg_write( DDR_REG_BASE +0x52397*4+0x02000000,0xc009); +reg_write( DDR_REG_BASE +0x52398*4+0x02000000,0x815); +reg_write( DDR_REG_BASE +0x52399*4+0x02000000,0x134); +reg_write( DDR_REG_BASE +0x5239a*4+0x02000000,0x7bef); +reg_write( DDR_REG_BASE +0x5239b*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE +0x5239c*4+0x02000000,0xc106); +reg_write( DDR_REG_BASE +0x5239d*4+0x02000000,0xc204); +reg_write( DDR_REG_BASE +0x5239e*4+0x02000000,0xbb2); +reg_write( DDR_REG_BASE +0x5239f*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE +0x523a0*4+0x02000000,0x2052); +reg_write( DDR_REG_BASE +0x523a1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x523a2*4+0x02000000,0x71e5); +reg_write( DDR_REG_BASE +0x523a3*4+0x02000000,0x72f5); +reg_write( DDR_REG_BASE +0x523a4*4+0x02000000,0x6b6); +reg_write( DDR_REG_BASE +0x523a5*4+0x02000000,0xffe5); +reg_write( DDR_REG_BASE +0x523a6*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE +0x523a7*4+0x02000000,0xd19); +reg_write( DDR_REG_BASE +0x523a8*4+0x02000000,0x10d1); +reg_write( DDR_REG_BASE +0x523a9*4+0x02000000,0xca09); +reg_write( DDR_REG_BASE +0x523aa*4+0x02000000,0xe888); +reg_write( DDR_REG_BASE +0x523ab*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x523ac*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE +0x523ad*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x523ae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x523af*4+0x02000000,0xb8e5); +reg_write( DDR_REG_BASE +0x523b0*4+0x02000000,0xc7c); +reg_write( DDR_REG_BASE +0x523b1*4+0x02000000,0xfe42); +reg_write( DDR_REG_BASE +0x523b2*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x523b3*4+0x02000000,0x7003); +reg_write( DDR_REG_BASE +0x523b4*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x523b5*4+0x02000000,0xf); +reg_write( DDR_REG_BASE +0x523b6*4+0x02000000,0x2480); +reg_write( DDR_REG_BASE +0x523b7*4+0x02000000,0x3409); +reg_write( DDR_REG_BASE +0x523b8*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE +0x523b9*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE +0x523ba*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE +0x523bb*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x523bc*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE +0x523bd*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE +0x523be*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE +0x523bf*4+0x02000000,0xc1b0); +reg_write( DDR_REG_BASE +0x523c0*4+0x02000000,0xc04f); +reg_write( DDR_REG_BASE +0x523c1*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x523c2*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE +0x523c3*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x523c4*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x523c5*4+0x02000000,0xefa); +reg_write( DDR_REG_BASE +0x523c6*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE +0x523c7*4+0x02000000,0xc046); +reg_write( DDR_REG_BASE +0x523c8*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x523c9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x523ca*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE +0x523cb*4+0x02000000,0x4100); +reg_write( DDR_REG_BASE +0x523cc*4+0x02000000,0x4200); +reg_write( DDR_REG_BASE +0x523cd*4+0x02000000,0xbee); +reg_write( DDR_REG_BASE +0x523ce*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE +0x523cf*4+0x02000000,0x4300); +reg_write( DDR_REG_BASE +0x523d0*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE +0x523d1*4+0x02000000,0x81e); +reg_write( DDR_REG_BASE +0x523d2*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE +0x523d3*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE +0x523d4*4+0x02000000,0x47cb); +reg_write( DDR_REG_BASE +0x523d5*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x523d6*4+0x02000000,0xe004); +reg_write( DDR_REG_BASE +0x523d7*4+0x02000000,0x1f22); +reg_write( DDR_REG_BASE +0x523d8*4+0x02000000,0x1015); +reg_write( DDR_REG_BASE +0x523d9*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE +0x523da*4+0x02000000,0xfc7); +reg_write( DDR_REG_BASE +0x523db*4+0x02000000,0x1fa7); +reg_write( DDR_REG_BASE +0x523dc*4+0x02000000,0x101c); +reg_write( DDR_REG_BASE +0x523dd*4+0x02000000,0x1fa8); +reg_write( DDR_REG_BASE +0x523de*4+0x02000000,0x101c); +reg_write( DDR_REG_BASE +0x523df*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE +0x523e0*4+0x02000000,0xd9ff); +reg_write( DDR_REG_BASE +0x523e1*4+0x02000000,0xb700); +reg_write( DDR_REG_BASE +0x523e2*4+0x02000000,0x1ffe); +reg_write( DDR_REG_BASE +0x523e3*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE +0x523e4*4+0x02000000,0xb705); +reg_write( DDR_REG_BASE +0x523e5*4+0x02000000,0xbd2); +reg_write( DDR_REG_BASE +0x523e6*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE +0x523e7*4+0x02000000,0x1ffc); +reg_write( DDR_REG_BASE +0x523e8*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE +0x523e9*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE +0x523ea*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x523eb*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE +0x523ec*4+0x02000000,0x8e04); +reg_write( DDR_REG_BASE +0x523ed*4+0x02000000,0xc048); +reg_write( DDR_REG_BASE +0x523ee*4+0x02000000,0x206f); +reg_write( DDR_REG_BASE +0x523ef*4+0x02000000,0x243); +reg_write( DDR_REG_BASE +0x523f0*4+0x02000000,0x10fd); +reg_write( DDR_REG_BASE +0x523f1*4+0x02000000,0x809e); +reg_write( DDR_REG_BASE +0x523f2*4+0x02000000,0x1420); +reg_write( DDR_REG_BASE +0x523f3*4+0x02000000,0x301b); +reg_write( DDR_REG_BASE +0x523f4*4+0x02000000,0x265f); +reg_write( DDR_REG_BASE +0x523f5*4+0x02000000,0x3100); +reg_write( DDR_REG_BASE +0x523f6*4+0x02000000,0x780d); +reg_write( DDR_REG_BASE +0x523f7*4+0x02000000,0x791c); +reg_write( DDR_REG_BASE +0x523f8*4+0x02000000,0x793c); +reg_write( DDR_REG_BASE +0x523f9*4+0x02000000,0x793c); +reg_write( DDR_REG_BASE +0x523fa*4+0x02000000,0x793c); +reg_write( DDR_REG_BASE +0x523fb*4+0x02000000,0x793c); +reg_write( DDR_REG_BASE +0x523fc*4+0x02000000,0x8e05); +reg_write( DDR_REG_BASE +0x523fd*4+0x02000000,0x793c); +reg_write( DDR_REG_BASE +0x523fe*4+0x02000000,0x793c); +reg_write( DDR_REG_BASE +0x523ff*4+0x02000000,0xc04d); +reg_write( DDR_REG_BASE +0x52400*4+0x02000000,0x7824); +reg_write( DDR_REG_BASE +0x52401*4+0x02000000,0xc04e); +reg_write( DDR_REG_BASE +0x52402*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE +0x52403*4+0x02000000,0x2304); +reg_write( DDR_REG_BASE +0x52404*4+0x02000000,0x305b); +reg_write( DDR_REG_BASE +0x52405*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE +0x52406*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x52407*4+0x02000000,0x10); +reg_write( DDR_REG_BASE +0x52408*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x52409*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE +0x5240a*4+0x02000000,0x8e03); +reg_write( DDR_REG_BASE +0x5240b*4+0x02000000,0xc04c); +reg_write( DDR_REG_BASE +0x5240c*4+0x02000000,0x8e02); +reg_write( DDR_REG_BASE +0x5240d*4+0x02000000,0x235); +reg_write( DDR_REG_BASE +0x5240e*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x5240f*4+0x02000000,0xc04b); +reg_write( DDR_REG_BASE +0x52410*4+0x02000000,0xe17); +reg_write( DDR_REG_BASE +0x52411*4+0x02000000,0x317e); +reg_write( DDR_REG_BASE +0x52412*4+0x02000000,0x202f); +reg_write( DDR_REG_BASE +0x52413*4+0x02000000,0x6c0); +reg_write( DDR_REG_BASE +0x52414*4+0x02000000,0x1e05); +reg_write( DDR_REG_BASE +0x52415*4+0x02000000,0x16c2); +reg_write( DDR_REG_BASE +0x52416*4+0x02000000,0x1e04); +reg_write( DDR_REG_BASE +0x52417*4+0x02000000,0x16c2); +reg_write( DDR_REG_BASE +0x52418*4+0x02000000,0xae02); +reg_write( DDR_REG_BASE +0x52419*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE +0x5241a*4+0x02000000,0xae03); +reg_write( DDR_REG_BASE +0x5241b*4+0x02000000,0x770c); +reg_write( DDR_REG_BASE +0x5241c*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE +0x5241d*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE +0x5241e*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE +0x5241f*4+0x02000000,0xf0bb); +reg_write( DDR_REG_BASE +0x52420*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE +0x52421*4+0x02000000,0xc101); +reg_write( DDR_REG_BASE +0x52422*4+0x02000000,0xae01); +reg_write( DDR_REG_BASE +0x52423*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE +0x52424*4+0x02000000,0x4200); +reg_write( DDR_REG_BASE +0x52425*4+0x02000000,0x8e00); +reg_write( DDR_REG_BASE +0x52426*4+0x02000000,0xb9c4); +reg_write( DDR_REG_BASE +0x52427*4+0x02000000,0xe906); +reg_write( DDR_REG_BASE +0x52428*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE +0x52429*4+0x02000000,0x901); +reg_write( DDR_REG_BASE +0x5242a*4+0x02000000,0x31); +reg_write( DDR_REG_BASE +0x5242b*4+0x02000000,0x7a5b); +reg_write( DDR_REG_BASE +0x5242c*4+0x02000000,0xe806); +reg_write( DDR_REG_BASE +0x5242d*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x5242e*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE +0x5242f*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x52430*4+0x02000000,0x49); +reg_write( DDR_REG_BASE +0x52431*4+0x02000000,0xf006); +reg_write( DDR_REG_BASE +0x52432*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x52433*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE +0x52434*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x52435*4+0x02000000,0x23); +reg_write( DDR_REG_BASE +0x52436*4+0x02000000,0x784f); +reg_write( DDR_REG_BASE +0x52437*4+0x02000000,0x790b); +reg_write( DDR_REG_BASE +0x52438*4+0x02000000,0xc04a); +reg_write( DDR_REG_BASE +0x52439*4+0x02000000,0xf29f); +reg_write( DDR_REG_BASE +0x5243a*4+0x02000000,0xc00a); +reg_write( DDR_REG_BASE +0x5243b*4+0x02000000,0xf6e); +reg_write( DDR_REG_BASE +0x5243c*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE +0x5243d*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x5243e*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x5243f*4+0x02000000,0xc2e); +reg_write( DDR_REG_BASE +0x52440*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE +0x52441*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x52442*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x52443*4+0x02000000,0xc049); +reg_write( DDR_REG_BASE +0x52444*4+0x02000000,0xf002); +reg_write( DDR_REG_BASE +0x52445*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE +0x52446*4+0x02000000,0xe59f); +reg_write( DDR_REG_BASE +0x52447*4+0x02000000,0x10c); +reg_write( DDR_REG_BASE +0x52448*4+0x02000000,0x9); +reg_write( DDR_REG_BASE +0x52449*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE +0x5244a*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE +0x5244b*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x5244c*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x5244d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5244e*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x5244f*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x52450*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE +0x52451*4+0x02000000,0xe040); +reg_write( DDR_REG_BASE +0x52452*4+0x02000000,0xb0a0); +reg_write( DDR_REG_BASE +0x52453*4+0x02000000,0x206f); +reg_write( DDR_REG_BASE +0x52454*4+0x02000000,0x243); +reg_write( DDR_REG_BASE +0x52455*4+0x02000000,0x10fd); +reg_write( DDR_REG_BASE +0x52456*4+0x02000000,0x8080); +reg_write( DDR_REG_BASE +0x52457*4+0x02000000,0x82d); +reg_write( DDR_REG_BASE +0x52458*4+0x02000000,0x15f); +reg_write( DDR_REG_BASE +0x52459*4+0x02000000,0x8e25); +reg_write( DDR_REG_BASE +0x5245a*4+0x02000000,0x8e44); +reg_write( DDR_REG_BASE +0x5245b*4+0x02000000,0xf00f); +reg_write( DDR_REG_BASE +0x5245c*4+0x02000000,0x221a); +reg_write( DDR_REG_BASE +0x5245d*4+0x02000000,0xf83); +reg_write( DDR_REG_BASE +0x5245e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5245f*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE +0x52460*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE +0x52461*4+0x02000000,0x7144); +reg_write( DDR_REG_BASE +0x52462*4+0x02000000,0x7865); +reg_write( DDR_REG_BASE +0x52463*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE +0x52464*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x52465*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x52466*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE +0x52467*4+0x02000000,0x40); +reg_write( DDR_REG_BASE +0x52468*4+0x02000000,0xb0a0); +reg_write( DDR_REG_BASE +0x52469*4+0x02000000,0x9e9); +reg_write( DDR_REG_BASE +0x5246a*4+0x02000000,0x8085); +reg_write( DDR_REG_BASE +0x5246b*4+0x02000000,0xf00e); +reg_write( DDR_REG_BASE +0x5246c*4+0x02000000,0x231a); +reg_write( DDR_REG_BASE +0x5246d*4+0x02000000,0x3f81); +reg_write( DDR_REG_BASE +0x5246e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5246f*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE +0x52470*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE +0x52471*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE +0x52472*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE +0x52473*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x52474*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x52475*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE +0x52476*4+0x02000000,0x40); +reg_write( DDR_REG_BASE +0x52477*4+0x02000000,0xb0a0); +reg_write( DDR_REG_BASE +0x52478*4+0x02000000,0xd72); +reg_write( DDR_REG_BASE +0x52479*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x5247a*4+0x02000000,0xd814); +reg_write( DDR_REG_BASE +0x5247b*4+0x02000000,0xeea); +reg_write( DDR_REG_BASE +0x5247c*4+0x02000000,0xff8f); +reg_write( DDR_REG_BASE +0x5247d*4+0x02000000,0xc00f); +reg_write( DDR_REG_BASE +0x5247e*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x5247f*4+0x02000000,0xbae); +reg_write( DDR_REG_BASE +0x52480*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE +0x52481*4+0x02000000,0x7810); +reg_write( DDR_REG_BASE +0x52482*4+0x02000000,0x8e04); +reg_write( DDR_REG_BASE +0x52483*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE +0x52484*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x52485*4+0x02000000,0xc047); +reg_write( DDR_REG_BASE +0x52486*4+0x02000000,0xf034); +reg_write( DDR_REG_BASE +0x52487*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE +0x52488*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE +0x52489*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE +0x5248a*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE +0x5248b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5248c*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE +0x5248d*4+0x02000000,0x2105); +reg_write( DDR_REG_BASE +0x5248e*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x5248f*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE +0x52490*4+0x02000000,0x170); +reg_write( DDR_REG_BASE +0x52491*4+0x02000000,0x9000); +reg_write( DDR_REG_BASE +0x52492*4+0x02000000,0xc245); +reg_write( DDR_REG_BASE +0x52493*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE +0x52494*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE +0x52495*4+0x02000000,0x8); +reg_write( DDR_REG_BASE +0x52496*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE +0x52497*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x52498*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x52499*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE +0x5249a*4+0x02000000,0x166); +reg_write( DDR_REG_BASE +0x5249b*4+0x02000000,0x9000); +reg_write( DDR_REG_BASE +0x5249c*4+0x02000000,0xe806); +reg_write( DDR_REG_BASE +0x5249d*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE +0x5249e*4+0x02000000,0x7810); +reg_write( DDR_REG_BASE +0x5249f*4+0x02000000,0x200f); +reg_write( DDR_REG_BASE +0x524a0*4+0x02000000,0x80); +reg_write( DDR_REG_BASE +0x524a1*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE +0x524a2*4+0x02000000,0x7144); +reg_write( DDR_REG_BASE +0x524a3*4+0x02000000,0xae5); +reg_write( DDR_REG_BASE +0x524a4*4+0x02000000,0x8234); +reg_write( DDR_REG_BASE +0x524a5*4+0x02000000,0x4040); +reg_write( DDR_REG_BASE +0x524a6*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE +0x524a7*4+0x02000000,0x262f); +reg_write( DDR_REG_BASE +0x524a8*4+0x02000000,0xf008); +reg_write( DDR_REG_BASE +0x524a9*4+0x02000000,0xf40b); +reg_write( DDR_REG_BASE +0x524aa*4+0x02000000,0xc201); +reg_write( DDR_REG_BASE +0x524ab*4+0x02000000,0xc303); +reg_write( DDR_REG_BASE +0x524ac*4+0x02000000,0x740c); +reg_write( DDR_REG_BASE +0x524ad*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x524ae*4+0x02000000,0xe); +reg_write( DDR_REG_BASE +0x524af*4+0x02000000,0x3); +reg_write( DDR_REG_BASE +0x524b0*4+0x02000000,0xf02); +reg_write( DDR_REG_BASE +0x524b1*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE +0x524b2*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE +0x524b3*4+0x02000000,0xc105); +reg_write( DDR_REG_BASE +0x524b4*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE +0x524b5*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE +0x524b6*4+0x02000000,0xc047); +reg_write( DDR_REG_BASE +0x524b7*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE +0x524b8*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE +0x524b9*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE +0x524ba*4+0x02000000,0x8e25); +reg_write( DDR_REG_BASE +0x524bb*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE +0x524bc*4+0x02000000,0x997); +reg_write( DDR_REG_BASE +0x524bd*4+0x02000000,0x8025); +reg_write( DDR_REG_BASE +0x524be*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE +0x524bf*4+0x02000000,0xe42); +reg_write( DDR_REG_BASE +0x524c0*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE +0x524c1*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE +0x524c2*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE +0x524c3*4+0x02000000,0x262f); +reg_write( DDR_REG_BASE +0x524c4*4+0x02000000,0xf008); +reg_write( DDR_REG_BASE +0x524c5*4+0x02000000,0xf581); +reg_write( DDR_REG_BASE +0x524c6*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE +0x524c7*4+0x02000000,0x2008); +reg_write( DDR_REG_BASE +0x524c8*4+0x02000000,0x340); +reg_write( DDR_REG_BASE +0x524c9*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE +0x524ca*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE +0x524cb*4+0x02000000,0xc049); +reg_write( DDR_REG_BASE +0x524cc*4+0x02000000,0xc009); +reg_write( DDR_REG_BASE +0x524cd*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x524ce*4+0x02000000,0x11); +reg_write( DDR_REG_BASE +0x524cf*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x524d0*4+0x02000000,0xf4e); +reg_write( DDR_REG_BASE +0x524d1*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x524d2*4+0x02000000,0xc201); +reg_write( DDR_REG_BASE +0x524d3*4+0x02000000,0xc26); +reg_write( DDR_REG_BASE +0x524d4*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x524d5*4+0x02000000,0xc00a); +reg_write( DDR_REG_BASE +0x524d6*4+0x02000000,0xc502); +reg_write( DDR_REG_BASE +0x524d7*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE +0x524d8*4+0x02000000,0x7704); +reg_write( DDR_REG_BASE +0x524d9*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE +0x524da*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE +0x524db*4+0x02000000,0x7014); +reg_write( DDR_REG_BASE +0x524dc*4+0x02000000,0x688); +reg_write( DDR_REG_BASE +0x524dd*4+0x02000000,0xffca); +reg_write( DDR_REG_BASE +0x524de*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE +0x524df*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x524e0*4+0x02000000,0x13); +reg_write( DDR_REG_BASE +0x524e1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x524e2*4+0x02000000,0x7812); +reg_write( DDR_REG_BASE +0x524e3*4+0x02000000,0x202f); +reg_write( DDR_REG_BASE +0x524e4*4+0x02000000,0xd); +reg_write( DDR_REG_BASE +0x524e5*4+0x02000000,0xf26); +reg_write( DDR_REG_BASE +0x524e6*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x524e7*4+0x02000000,0xb8c0); +reg_write( DDR_REG_BASE +0x524e8*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE +0x524e9*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x524ea*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE +0x524eb*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x524ec*4+0x02000000,0x14); +reg_write( DDR_REG_BASE +0x524ed*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE +0x524ee*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x524ef*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x524f0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x524f1*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x524f2*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE +0x524f3*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE +0x524f4*4+0x02000000,0xe040); +reg_write( DDR_REG_BASE +0x524f5*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE +0x524f6*4+0x02000000,0x6038); +reg_write( DDR_REG_BASE +0x524f7*4+0x02000000,0x2049); +reg_write( DDR_REG_BASE +0x524f8*4+0x02000000,0x7c1); +reg_write( DDR_REG_BASE +0x524f9*4+0x02000000,0xb220); +reg_write( DDR_REG_BASE +0x524fa*4+0x02000000,0x206f); +reg_write( DDR_REG_BASE +0x524fb*4+0x02000000,0x243); +reg_write( DDR_REG_BASE +0x524fc*4+0x02000000,0x10fd); +reg_write( DDR_REG_BASE +0x524fd*4+0x02000000,0x809e); +reg_write( DDR_REG_BASE +0x524fe*4+0x02000000,0xe37); +reg_write( DDR_REG_BASE +0x524ff*4+0x02000000,0x315f); +reg_write( DDR_REG_BASE +0x52500*4+0x02000000,0x8e45); +reg_write( DDR_REG_BASE +0x52501*4+0x02000000,0x8e64); +reg_write( DDR_REG_BASE +0x52502*4+0x02000000,0xf00e); +reg_write( DDR_REG_BASE +0x52503*4+0x02000000,0x231a); +reg_write( DDR_REG_BASE +0x52504*4+0x02000000,0xf8c); +reg_write( DDR_REG_BASE +0x52505*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x52506*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE +0x52507*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE +0x52508*4+0x02000000,0x7164); +reg_write( DDR_REG_BASE +0x52509*4+0x02000000,0x7885); +reg_write( DDR_REG_BASE +0x5250a*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE +0x5250b*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x5250c*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x5250d*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE +0x5250e*4+0x02000000,0x40); +reg_write( DDR_REG_BASE +0x5250f*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE +0x52510*4+0x02000000,0xae7); +reg_write( DDR_REG_BASE +0x52511*4+0x02000000,0x80c5); +reg_write( DDR_REG_BASE +0x52512*4+0x02000000,0xdba); +reg_write( DDR_REG_BASE +0x52513*4+0x02000000,0xff8f); +reg_write( DDR_REG_BASE +0x52514*4+0x02000000,0x206f); +reg_write( DDR_REG_BASE +0x52515*4+0x02000000,0x243); +reg_write( DDR_REG_BASE +0x52516*4+0x02000000,0x10fd); +reg_write( DDR_REG_BASE +0x52517*4+0x02000000,0x809e); +reg_write( DDR_REG_BASE +0x52518*4+0x02000000,0xf00d); +reg_write( DDR_REG_BASE +0x52519*4+0x02000000,0x231a); +reg_write( DDR_REG_BASE +0x5251a*4+0x02000000,0x3f82); +reg_write( DDR_REG_BASE +0x5251b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5251c*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE +0x5251d*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE +0x5251e*4+0x02000000,0x7845); +reg_write( DDR_REG_BASE +0x5251f*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE +0x52520*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x52521*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x52522*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE +0x52523*4+0x02000000,0x40); +reg_write( DDR_REG_BASE +0x52524*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE +0x52525*4+0x02000000,0x7167); +reg_write( DDR_REG_BASE +0x52526*4+0x02000000,0xc00e); +reg_write( DDR_REG_BASE +0x52527*4+0x02000000,0x230c); +reg_write( DDR_REG_BASE +0x52528*4+0x02000000,0xb000); +reg_write( DDR_REG_BASE +0x52529*4+0x02000000,0x5d0); +reg_write( DDR_REG_BASE +0x5252a*4+0x02000000,0xffce); +reg_write( DDR_REG_BASE +0x5252b*4+0x02000000,0xe17); +reg_write( DDR_REG_BASE +0x5252c*4+0x02000000,0x315e); +reg_write( DDR_REG_BASE +0x5252d*4+0x02000000,0xc00d); +reg_write( DDR_REG_BASE +0x5252e*4+0x02000000,0xae05); +reg_write( DDR_REG_BASE +0x5252f*4+0x02000000,0xc008); +reg_write( DDR_REG_BASE +0x52530*4+0x02000000,0xae04); +reg_write( DDR_REG_BASE +0x52531*4+0x02000000,0xc00c); +reg_write( DDR_REG_BASE +0x52532*4+0x02000000,0xae03); +reg_write( DDR_REG_BASE +0x52533*4+0x02000000,0xc00b); +reg_write( DDR_REG_BASE +0x52534*4+0x02000000,0xae02); +reg_write( DDR_REG_BASE +0x52535*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x52536*4+0x02000000,0x1fa7); +reg_write( DDR_REG_BASE +0x52537*4+0x02000000,0x101c); +reg_write( DDR_REG_BASE +0x52538*4+0x02000000,0x1fa8); +reg_write( DDR_REG_BASE +0x52539*4+0x02000000,0x101c); +reg_write( DDR_REG_BASE +0x5253a*4+0x02000000,0xb700); +reg_write( DDR_REG_BASE +0x5253b*4+0x02000000,0xc0b0); +reg_write( DDR_REG_BASE +0x5253c*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE +0x5253d*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE +0x5253e*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE +0x5253f*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x52540*4+0x02000000,0x208c); +reg_write( DDR_REG_BASE +0x52541*4+0x02000000,0x8fc3); +reg_write( DDR_REG_BASE +0x52542*4+0x02000000,0xf209); +reg_write( DDR_REG_BASE +0x52543*4+0x02000000,0x821); +reg_write( DDR_REG_BASE +0x52544*4+0x02000000,0x1d1); +reg_write( DDR_REG_BASE +0x52545*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x52546*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE +0x52547*4+0x02000000,0x238); +reg_write( DDR_REG_BASE +0x52548*4+0x02000000,0x1900); +reg_write( DDR_REG_BASE +0x52549*4+0x02000000,0x45); +reg_write( DDR_REG_BASE +0x5254a*4+0x02000000,0xf006); +reg_write( DDR_REG_BASE +0x5254b*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x5254c*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE +0x5254d*4+0x02000000,0x238); +reg_write( DDR_REG_BASE +0x5254e*4+0x02000000,0x1900); +reg_write( DDR_REG_BASE +0x5254f*4+0x02000000,0x105); +reg_write( DDR_REG_BASE +0x52550*4+0x02000000,0x1900); +reg_write( DDR_REG_BASE +0x52551*4+0x02000000,0x5); +reg_write( DDR_REG_BASE +0x52552*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x52553*4+0x02000000,0x9018); +reg_write( DDR_REG_BASE +0x52554*4+0x02000000,0x64); +reg_write( DDR_REG_BASE +0x52555*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE +0x52556*4+0x02000000,0x25); +reg_write( DDR_REG_BASE +0x52557*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x52558*4+0x02000000,0x1902); +reg_write( DDR_REG_BASE +0x52559*4+0x02000000,0x5); +reg_write( DDR_REG_BASE +0x5255a*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x5255b*4+0x02000000,0x9018); +reg_write( DDR_REG_BASE +0x5255c*4+0x02000000,0x64); +reg_write( DDR_REG_BASE +0x5255d*4+0x02000000,0xda10); +reg_write( DDR_REG_BASE +0x5255e*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE +0x5255f*4+0x02000000,0xba61); +reg_write( DDR_REG_BASE +0x52560*4+0x02000000,0xaff); +reg_write( DDR_REG_BASE +0x52561*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE +0x52562*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x52563*4+0x02000000,0xb102); +reg_write( DDR_REG_BASE +0x52564*4+0x02000000,0x9); +reg_write( DDR_REG_BASE +0x52565*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x52566*4+0x02000000,0x1902); +reg_write( DDR_REG_BASE +0x52567*4+0x02000000,0x5); +reg_write( DDR_REG_BASE +0x52568*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x52569*4+0x02000000,0x9018); +reg_write( DDR_REG_BASE +0x5256a*4+0x02000000,0x8); +reg_write( DDR_REG_BASE +0x5256b*4+0x02000000,0x9100); +reg_write( DDR_REG_BASE +0x5256c*4+0x02000000,0x8ff); +reg_write( DDR_REG_BASE +0x5256d*4+0x02000000,0x801f); +reg_write( DDR_REG_BASE +0x5256e*4+0x02000000,0x195e); +reg_write( DDR_REG_BASE +0x5256f*4+0x02000000,0x45); +reg_write( DDR_REG_BASE +0x52570*4+0x02000000,0x9100); +reg_write( DDR_REG_BASE +0x52571*4+0x02000000,0x801); +reg_write( DDR_REG_BASE +0x52572*4+0x02000000,0x1e); +reg_write( DDR_REG_BASE +0x52573*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE +0x52574*4+0x02000000,0xc2e2); +reg_write( DDR_REG_BASE +0x52575*4+0x02000000,0x4200); +reg_write( DDR_REG_BASE +0x52576*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x52577*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE +0x52578*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x52579*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x5257a*4+0x02000000,0x827); +reg_write( DDR_REG_BASE +0x5257b*4+0x02000000,0x13f); +reg_write( DDR_REG_BASE +0x5257c*4+0x02000000,0x4328); +reg_write( DDR_REG_BASE +0x5257d*4+0x02000000,0xd808); +reg_write( DDR_REG_BASE +0x5257e*4+0x02000000,0xf86); +reg_write( DDR_REG_BASE +0x5257f*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE +0x52580*4+0x02000000,0x7d50); +reg_write( DDR_REG_BASE +0x52581*4+0x02000000,0xfb6); +reg_write( DDR_REG_BASE +0x52582*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE +0x52583*4+0x02000000,0x4040); +reg_write( DDR_REG_BASE +0x52584*4+0x02000000,0x706c); +reg_write( DDR_REG_BASE +0x52585*4+0x02000000,0xf007); +reg_write( DDR_REG_BASE +0x52586*4+0x02000000,0xfaa); +reg_write( DDR_REG_BASE +0x52587*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE +0x52588*4+0x02000000,0x1304); +reg_write( DDR_REG_BASE +0x52589*4+0x02000000,0x1400); +reg_write( DDR_REG_BASE +0x5258a*4+0x02000000,0x7164); +reg_write( DDR_REG_BASE +0x5258b*4+0x02000000,0xbf9); +reg_write( DDR_REG_BASE +0x5258c*4+0x02000000,0x8344); +reg_write( DDR_REG_BASE +0x5258d*4+0x02000000,0xc6c2); +reg_write( DDR_REG_BASE +0x5258e*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE +0x5258f*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE +0x52590*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE +0x52591*4+0x02000000,0x2482); +reg_write( DDR_REG_BASE +0x52592*4+0x02000000,0x3a03); +reg_write( DDR_REG_BASE +0x52593*4+0x02000000,0xc255); +reg_write( DDR_REG_BASE +0x52594*4+0x02000000,0xc152); +reg_write( DDR_REG_BASE +0x52595*4+0x02000000,0xc050); +reg_write( DDR_REG_BASE +0x52596*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE +0x52597*4+0x02000000,0x3800); +reg_write( DDR_REG_BASE +0x52598*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x52599*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x5259a*4+0x02000000,0x4a4); +reg_write( DDR_REG_BASE +0x5259b*4+0x02000000,0xda66); +reg_write( DDR_REG_BASE +0x5259c*4+0x02000000,0xd4a); +reg_write( DDR_REG_BASE +0x5259d*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x5259e*4+0x02000000,0xc353); +reg_write( DDR_REG_BASE +0x5259f*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE +0x525a0*4+0x02000000,0x3800); +reg_write( DDR_REG_BASE +0x525a1*4+0x02000000,0xe4a); +reg_write( DDR_REG_BASE +0x525a2*4+0x02000000,0x60); +reg_write( DDR_REG_BASE +0x525a3*4+0x02000000,0xd966); +reg_write( DDR_REG_BASE +0x525a4*4+0x02000000,0x47cb); +reg_write( DDR_REG_BASE +0x525a5*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x525a6*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE +0x525a7*4+0x02000000,0x8f40); +reg_write( DDR_REG_BASE +0x525a8*4+0x02000000,0x8f21); +reg_write( DDR_REG_BASE +0x525a9*4+0x02000000,0x14fc); +reg_write( DDR_REG_BASE +0x525aa*4+0x02000000,0x3000); +reg_write( DDR_REG_BASE +0x525ab*4+0x02000000,0x225f); +reg_write( DDR_REG_BASE +0x525ac*4+0x02000000,0x243); +reg_write( DDR_REG_BASE +0x525ad*4+0x02000000,0xc054); +reg_write( DDR_REG_BASE +0x525ae*4+0x02000000,0xf03a); +reg_write( DDR_REG_BASE +0x525af*4+0x02000000,0x44cb); +reg_write( DDR_REG_BASE +0x525b0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x525b1*4+0x02000000,0x7fff); +reg_write( DDR_REG_BASE +0x525b2*4+0x02000000,0x6c01); +reg_write( DDR_REG_BASE +0x525b3*4+0x02000000,0x4368); +reg_write( DDR_REG_BASE +0x525b4*4+0x02000000,0xf00a); +reg_write( DDR_REG_BASE +0x525b5*4+0x02000000,0xc015); +reg_write( DDR_REG_BASE +0x525b6*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE +0x525b7*4+0x02000000,0x20f5); +reg_write( DDR_REG_BASE +0x525b8*4+0x02000000,0x2c0); +reg_write( DDR_REG_BASE +0x525b9*4+0x02000000,0x7165); +reg_write( DDR_REG_BASE +0x525ba*4+0x02000000,0x2009); +reg_write( DDR_REG_BASE +0x525bb*4+0x02000000,0x30c); +reg_write( DDR_REG_BASE +0x525bc*4+0x02000000,0x2008); +reg_write( DDR_REG_BASE +0x525bd*4+0x02000000,0x340); +reg_write( DDR_REG_BASE +0x525be*4+0x02000000,0xeef); +reg_write( DDR_REG_BASE +0x525bf*4+0x02000000,0x9234); +reg_write( DDR_REG_BASE +0x525c0*4+0x02000000,0x7d0e); +reg_write( DDR_REG_BASE +0x525c1*4+0x02000000,0x64b8); +reg_write( DDR_REG_BASE +0x525c2*4+0x02000000,0x2844); +reg_write( DDR_REG_BASE +0x525c3*4+0x02000000,0x8d); +reg_write( DDR_REG_BASE +0x525c4*4+0x02000000,0xe309); +reg_write( DDR_REG_BASE +0x525c5*4+0x02000000,0x7eae); +reg_write( DDR_REG_BASE +0x525c6*4+0x02000000,0x78dc); +reg_write( DDR_REG_BASE +0x525c7*4+0x02000000,0x781c); +reg_write( DDR_REG_BASE +0x525c8*4+0x02000000,0x781c); +reg_write( DDR_REG_BASE +0x525c9*4+0x02000000,0x781c); +reg_write( DDR_REG_BASE +0x525ca*4+0x02000000,0x4408); +reg_write( DDR_REG_BASE +0x525cb*4+0x02000000,0xd81b); +reg_write( DDR_REG_BASE +0x525cc*4+0x02000000,0xb861); +reg_write( DDR_REG_BASE +0x525cd*4+0x02000000,0x801); +reg_write( DDR_REG_BASE +0x525ce*4+0x02000000,0x31); +reg_write( DDR_REG_BASE +0x525cf*4+0x02000000,0x7c9d); +reg_write( DDR_REG_BASE +0x525d0*4+0x02000000,0x6698); +reg_write( DDR_REG_BASE +0x525d1*4+0x02000000,0xb8c4); +reg_write( DDR_REG_BASE +0x525d2*4+0x02000000,0x4894); +reg_write( DDR_REG_BASE +0x525d3*4+0x02000000,0x2e44); +reg_write( DDR_REG_BASE +0x525d4*4+0x02000000,0x1800); +reg_write( DDR_REG_BASE +0x525d5*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE +0x525d6*4+0x02000000,0x10); +reg_write( DDR_REG_BASE +0x525d7*4+0x02000000,0x7c05); +reg_write( DDR_REG_BASE +0x525d8*4+0x02000000,0x221a); +reg_write( DDR_REG_BASE +0x525d9*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x525da*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x525db*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE +0x525dc*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x525dd*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x525de*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE +0x525df*4+0x02000000,0x1064); +reg_write( DDR_REG_BASE +0x525e0*4+0x02000000,0xb080); +reg_write( DDR_REG_BASE +0x525e1*4+0x02000000,0xc096); +reg_write( DDR_REG_BASE +0x525e2*4+0x02000000,0x7854); +reg_write( DDR_REG_BASE +0x525e3*4+0x02000000,0xb0a0); +reg_write( DDR_REG_BASE +0x525e4*4+0x02000000,0xc09b); +reg_write( DDR_REG_BASE +0x525e5*4+0x02000000,0x7854); +reg_write( DDR_REG_BASE +0x525e6*4+0x02000000,0xb080); +reg_write( DDR_REG_BASE +0x525e7*4+0x02000000,0x7144); +reg_write( DDR_REG_BASE +0x525e8*4+0x02000000,0x98f); +reg_write( DDR_REG_BASE +0x525e9*4+0x02000000,0x80a5); +reg_write( DDR_REG_BASE +0x525ea*4+0x02000000,0x70cd); +reg_write( DDR_REG_BASE +0x525eb*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x525ec*4+0x02000000,0x83a); +reg_write( DDR_REG_BASE +0x525ed*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE +0x525ee*4+0x02000000,0xd9ff); +reg_write( DDR_REG_BASE +0x525ef*4+0x02000000,0x1200); +reg_write( DDR_REG_BASE +0x525f0*4+0x02000000,0x3083); +reg_write( DDR_REG_BASE +0x525f1*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x525f2*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x525f3*4+0x02000000,0xb98e); +reg_write( DDR_REG_BASE +0x525f4*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE +0x525f5*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE +0x525f6*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE +0x525f7*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE +0x525f8*4+0x02000000,0x8fa); +reg_write( DDR_REG_BASE +0x525f9*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE +0x525fa*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE +0x525fb*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x525fc*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE +0x525fd*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE +0x525fe*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE +0x525ff*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE +0x52600*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE +0x52601*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE +0x52602*4+0x02000000,0x8e6); +reg_write( DDR_REG_BASE +0x52603*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE +0x52604*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE +0x52605*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x52606*4+0x02000000,0x89e); +reg_write( DDR_REG_BASE +0x52607*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE +0x52608*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x52609*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE +0x5260a*4+0x02000000,0xf86); +reg_write( DDR_REG_BASE +0x5260b*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE +0x5260c*4+0x02000000,0xd9ff); +reg_write( DDR_REG_BASE +0x5260d*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE +0x5260e*4+0x02000000,0xfc7); +reg_write( DDR_REG_BASE +0x5260f*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x52610*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x52611*4+0x02000000,0xe174); +reg_write( DDR_REG_BASE +0x52612*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x52613*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE +0x52614*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x52615*4+0x02000000,0xe174); +reg_write( DDR_REG_BASE +0x52616*4+0x02000000,0xb101); +reg_write( DDR_REG_BASE +0x52617*4+0x02000000,0xc010); +reg_write( DDR_REG_BASE +0x52618*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x52619*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE +0x5261a*4+0x02000000,0x7cd); +reg_write( DDR_REG_BASE +0x5261b*4+0x02000000,0x4020); +reg_write( DDR_REG_BASE +0x5261c*4+0x02000000,0xed05); +reg_write( DDR_REG_BASE +0x5261d*4+0x02000000,0xbd61); +reg_write( DDR_REG_BASE +0x5261e*4+0x02000000,0xdff); +reg_write( DDR_REG_BASE +0x5261f*4+0x02000000,0x9031); +reg_write( DDR_REG_BASE +0x52620*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE +0x52621*4+0x02000000,0xc051); +reg_write( DDR_REG_BASE +0x52622*4+0x02000000,0xef3); +reg_write( DDR_REG_BASE +0x52623*4+0x02000000,0x1155); +reg_write( DDR_REG_BASE +0x52624*4+0x02000000,0xc011); +reg_write( DDR_REG_BASE +0x52625*4+0x02000000,0xd8a); +reg_write( DDR_REG_BASE +0x52626*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x52627*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE +0x52628*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE +0x52629*4+0x02000000,0xb6e); +reg_write( DDR_REG_BASE +0x5262a*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE +0x5262b*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE +0x5262c*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x5262d*4+0x02000000,0x852); +reg_write( DDR_REG_BASE +0x5262e*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE +0x5262f*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x52630*4+0x02000000,0x8fa0); +reg_write( DDR_REG_BASE +0x52631*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x52632*4+0x02000000,0xc04f); +reg_write( DDR_REG_BASE +0x52633*4+0x02000000,0xf061); +reg_write( DDR_REG_BASE +0x52634*4+0x02000000,0x251a); +reg_write( DDR_REG_BASE +0x52635*4+0x02000000,0x1f81); +reg_write( DDR_REG_BASE +0x52636*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x52637*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE +0x52638*4+0x02000000,0x4318); +reg_write( DDR_REG_BASE +0x52639*4+0x02000000,0xf00d); +reg_write( DDR_REG_BASE +0x5263a*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE +0x5263b*4+0x02000000,0x8); +reg_write( DDR_REG_BASE +0x5263c*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE +0x5263d*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x5263e*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x5263f*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE +0x52640*4+0x02000000,0x166); +reg_write( DDR_REG_BASE +0x52641*4+0x02000000,0x9000); +reg_write( DDR_REG_BASE +0x52642*4+0x02000000,0x2300); +reg_write( DDR_REG_BASE +0x52643*4+0x02000000,0x301b); +reg_write( DDR_REG_BASE +0x52644*4+0x02000000,0x4040); +reg_write( DDR_REG_BASE +0x52645*4+0x02000000,0x8ed); +reg_write( DDR_REG_BASE +0x52646*4+0x02000000,0x8234); +reg_write( DDR_REG_BASE +0x52647*4+0x02000000,0x6841); +reg_write( DDR_REG_BASE +0x52648*4+0x02000000,0xb8f); +reg_write( DDR_REG_BASE +0x52649*4+0x02000000,0x3010); +reg_write( DDR_REG_BASE +0x5264a*4+0x02000000,0xe21); +reg_write( DDR_REG_BASE +0x5264b*4+0x02000000,0x1070); +reg_write( DDR_REG_BASE +0x5264c*4+0x02000000,0xc096); +reg_write( DDR_REG_BASE +0x5264d*4+0x02000000,0xe25); +reg_write( DDR_REG_BASE +0x5264e*4+0x02000000,0x10f0); +reg_write( DDR_REG_BASE +0x5264f*4+0x02000000,0xc096); +reg_write( DDR_REG_BASE +0x52650*4+0x02000000,0xe25); +reg_write( DDR_REG_BASE +0x52651*4+0x02000000,0x1131); +reg_write( DDR_REG_BASE +0x52652*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x52653*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x52654*4+0x02000000,0x24); +reg_write( DDR_REG_BASE +0x52655*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x52656*4+0x02000000,0xc42); +reg_write( DDR_REG_BASE +0x52657*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52658*4+0x02000000,0x42a1); +reg_write( DDR_REG_BASE +0x52659*4+0x02000000,0xf037); +reg_write( DDR_REG_BASE +0x5265a*4+0x02000000,0x20f4); +reg_write( DDR_REG_BASE +0x5265b*4+0x02000000,0x340); +reg_write( DDR_REG_BASE +0x5265c*4+0x02000000,0x7404); +reg_write( DDR_REG_BASE +0x5265d*4+0x02000000,0xf014); +reg_write( DDR_REG_BASE +0x5265e*4+0x02000000,0x20f4); +reg_write( DDR_REG_BASE +0x5265f*4+0x02000000,0x340); +reg_write( DDR_REG_BASE +0x52660*4+0x02000000,0xe008); +reg_write( DDR_REG_BASE +0x52661*4+0x02000000,0xf010); +reg_write( DDR_REG_BASE +0x52662*4+0x02000000,0xc096); +reg_write( DDR_REG_BASE +0x52663*4+0x02000000,0x20f4); +reg_write( DDR_REG_BASE +0x52664*4+0x02000000,0x341); +reg_write( DDR_REG_BASE +0x52665*4+0x02000000,0xee08); +reg_write( DDR_REG_BASE +0x52666*4+0x02000000,0x915); +reg_write( DDR_REG_BASE +0x52667*4+0x02000000,0x274); +reg_write( DDR_REG_BASE +0x52668*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x52669*4+0x02000000,0x2142); +reg_write( DDR_REG_BASE +0x5266a*4+0x02000000,0x200); +reg_write( DDR_REG_BASE +0x5266b*4+0x02000000,0xf006); +reg_write( DDR_REG_BASE +0x5266c*4+0x02000000,0x909); +reg_write( DDR_REG_BASE +0x5266d*4+0x02000000,0x174); +reg_write( DDR_REG_BASE +0x5266e*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x5266f*4+0x02000000,0x690c); +reg_write( DDR_REG_BASE +0x52670*4+0x02000000,0x7a0e); +reg_write( DDR_REG_BASE +0x52671*4+0x02000000,0x785c); +reg_write( DDR_REG_BASE +0x52672*4+0x02000000,0x781c); +reg_write( DDR_REG_BASE +0x52673*4+0x02000000,0x781c); +reg_write( DDR_REG_BASE +0x52674*4+0x02000000,0x781c); +reg_write( DDR_REG_BASE +0x52675*4+0x02000000,0x4100); +reg_write( DDR_REG_BASE +0x52676*4+0x02000000,0xd81b); +reg_write( DDR_REG_BASE +0x52677*4+0x02000000,0xb861); +reg_write( DDR_REG_BASE +0x52678*4+0x02000000,0x8ff); +reg_write( DDR_REG_BASE +0x52679*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE +0x5267a*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE +0x5267b*4+0x02000000,0x6238); +reg_write( DDR_REG_BASE +0x5267c*4+0x02000000,0xb8c4); +reg_write( DDR_REG_BASE +0x5267d*4+0x02000000,0x4831); +reg_write( DDR_REG_BASE +0x5267e*4+0x02000000,0x2a44); +reg_write( DDR_REG_BASE +0x5267f*4+0x02000000,0x800); +reg_write( DDR_REG_BASE +0x52680*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE +0x52681*4+0x02000000,0x10); +reg_write( DDR_REG_BASE +0x52682*4+0x02000000,0x7905); +reg_write( DDR_REG_BASE +0x52683*4+0x02000000,0x251a); +reg_write( DDR_REG_BASE +0x52684*4+0x02000000,0x1f80); +reg_write( DDR_REG_BASE +0x52685*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x52686*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE +0x52687*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x52688*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x52689*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE +0x5268a*4+0x02000000,0x1064); +reg_write( DDR_REG_BASE +0x5268b*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE +0x5268c*4+0x02000000,0xc09b); +reg_write( DDR_REG_BASE +0x5268d*4+0x02000000,0x78b4); +reg_write( DDR_REG_BASE +0x5268e*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE +0x5268f*4+0x02000000,0xc00f); +reg_write( DDR_REG_BASE +0x52690*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE +0x52691*4+0x02000000,0x7063); +reg_write( DDR_REG_BASE +0x52692*4+0x02000000,0xc04f); +reg_write( DDR_REG_BASE +0x52693*4+0x02000000,0x8f01); +reg_write( DDR_REG_BASE +0x52694*4+0x02000000,0x841); +reg_write( DDR_REG_BASE +0x52695*4+0x02000000,0x8365); +reg_write( DDR_REG_BASE +0x52696*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x52697*4+0x02000000,0xc00f); +reg_write( DDR_REG_BASE +0x52698*4+0x02000000,0x815); +reg_write( DDR_REG_BASE +0x52699*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE +0x5269a*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE +0x5269b*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x5269c*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x5269d*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x5269e*4+0x02000000,0xe174); +reg_write( DDR_REG_BASE +0x5269f*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x526a0*4+0x02000000,0x7044); +reg_write( DDR_REG_BASE +0x526a1*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x526a2*4+0x02000000,0xe174); +reg_write( DDR_REG_BASE +0x526a3*4+0x02000000,0xb021); +reg_write( DDR_REG_BASE +0x526a4*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x526a5*4+0x02000000,0xc04d); +reg_write( DDR_REG_BASE +0x526a6*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x526a7*4+0x02000000,0xb88b); +reg_write( DDR_REG_BASE +0x526a8*4+0x02000000,0xc04c); +reg_write( DDR_REG_BASE +0x526a9*4+0x02000000,0xd840); +reg_write( DDR_REG_BASE +0x526aa*4+0x02000000,0xc04b); +reg_write( DDR_REG_BASE +0x526ab*4+0x02000000,0xc014); +reg_write( DDR_REG_BASE +0x526ac*4+0x02000000,0xc16e); +reg_write( DDR_REG_BASE +0x526ad*4+0x02000000,0xc149); +reg_write( DDR_REG_BASE +0x526ae*4+0x02000000,0xc046); +reg_write( DDR_REG_BASE +0x526af*4+0x02000000,0xc013); +reg_write( DDR_REG_BASE +0x526b0*4+0x02000000,0xc168); +reg_write( DDR_REG_BASE +0x526b1*4+0x02000000,0xc147); +reg_write( DDR_REG_BASE +0x526b2*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE +0x526b3*4+0x02000000,0xc010); +reg_write( DDR_REG_BASE +0x526b4*4+0x02000000,0xc19b); +reg_write( DDR_REG_BASE +0x526b5*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE +0x526b6*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE +0x526b7*4+0x02000000,0xc084); +reg_write( DDR_REG_BASE +0x526b8*4+0x02000000,0xe2a); +reg_write( DDR_REG_BASE +0x526b9*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE +0x526ba*4+0x02000000,0x1c28); +reg_write( DDR_REG_BASE +0x526bb*4+0x02000000,0x3085); +reg_write( DDR_REG_BASE +0x526bc*4+0x02000000,0xc084); +reg_write( DDR_REG_BASE +0x526bd*4+0x02000000,0xc19b); +reg_write( DDR_REG_BASE +0x526be*4+0x02000000,0xe1e); +reg_write( DDR_REG_BASE +0x526bf*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE +0x526c0*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE +0x526c1*4+0x02000000,0xc011); +reg_write( DDR_REG_BASE +0x526c2*4+0x02000000,0x8fa0); +reg_write( DDR_REG_BASE +0x526c3*4+0x02000000,0x8fc1); +reg_write( DDR_REG_BASE +0x526c4*4+0x02000000,0x842); +reg_write( DDR_REG_BASE +0x526c5*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x526c6*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE +0x526c7*4+0x02000000,0x265f); +reg_write( DDR_REG_BASE +0x526c8*4+0x02000000,0x125b); +reg_write( DDR_REG_BASE +0x526c9*4+0x02000000,0x255f); +reg_write( DDR_REG_BASE +0x526ca*4+0x02000000,0x124d); +reg_write( DDR_REG_BASE +0x526cb*4+0x02000000,0xc012); +reg_write( DDR_REG_BASE +0x526cc*4+0x02000000,0xe807); +reg_write( DDR_REG_BASE +0x526cd*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x526ce*4+0x02000000,0x25); +reg_write( DDR_REG_BASE +0x526cf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x526d0*4+0x02000000,0xac2); +reg_write( DDR_REG_BASE +0x526d1*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE +0x526d2*4+0x02000000,0x740c); +reg_write( DDR_REG_BASE +0x526d3*4+0x02000000,0x8fc0); +reg_write( DDR_REG_BASE +0x526d4*4+0x02000000,0x2340); +reg_write( DDR_REG_BASE +0x526d5*4+0x02000000,0x321b); +reg_write( DDR_REG_BASE +0x526d6*4+0x02000000,0xe508); +reg_write( DDR_REG_BASE +0x526d7*4+0x02000000,0xf02c); +reg_write( DDR_REG_BASE +0x526d8*4+0x02000000,0xc013); +reg_write( DDR_REG_BASE +0x526d9*4+0x02000000,0x20f5); +reg_write( DDR_REG_BASE +0x526da*4+0x02000000,0x341); +reg_write( DDR_REG_BASE +0x526db*4+0x02000000,0xc014); +reg_write( DDR_REG_BASE +0x526dc*4+0x02000000,0x20f5); +reg_write( DDR_REG_BASE +0x526dd*4+0x02000000,0x342); +reg_write( DDR_REG_BASE +0x526de*4+0x02000000,0x6238); +reg_write( DDR_REG_BASE +0x526df*4+0x02000000,0x7b1c); +reg_write( DDR_REG_BASE +0x526e0*4+0x02000000,0xc015); +reg_write( DDR_REG_BASE +0x526e1*4+0x02000000,0x2348); +reg_write( DDR_REG_BASE +0x526e2*4+0x02000000,0xc); +reg_write( DDR_REG_BASE +0x526e3*4+0x02000000,0x78b4); +reg_write( DDR_REG_BASE +0x526e4*4+0x02000000,0xb080); +reg_write( DDR_REG_BASE +0x526e5*4+0x02000000,0x4a30); +reg_write( DDR_REG_BASE +0x526e6*4+0x02000000,0x2048); +reg_write( DDR_REG_BASE +0x526e7*4+0x02000000,0xf); +reg_write( DDR_REG_BASE +0x526e8*4+0x02000000,0xc012); +reg_write( DDR_REG_BASE +0x526e9*4+0x02000000,0xe80d); +reg_write( DDR_REG_BASE +0x526ea*4+0x02000000,0xc342); +reg_write( DDR_REG_BASE +0x526eb*4+0x02000000,0xc241); +reg_write( DDR_REG_BASE +0x526ec*4+0x02000000,0xc140); +reg_write( DDR_REG_BASE +0x526ed*4+0x02000000,0x740c); +reg_write( DDR_REG_BASE +0x526ee*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x526ef*4+0x02000000,0x27); +reg_write( DDR_REG_BASE +0x526f0*4+0x02000000,0x5); +reg_write( DDR_REG_BASE +0x526f1*4+0x02000000,0x42c1); +reg_write( DDR_REG_BASE +0x526f2*4+0x02000000,0xa7e); +reg_write( DDR_REG_BASE +0x526f3*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE +0x526f4*4+0x02000000,0xdb08); +reg_write( DDR_REG_BASE +0x526f5*4+0x02000000,0x78ee); +reg_write( DDR_REG_BASE +0x526f6*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE +0x526f7*4+0x02000000,0x207f); +reg_write( DDR_REG_BASE +0x526f8*4+0x02000000,0x140); +reg_write( DDR_REG_BASE +0x526f9*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x526fa*4+0x02000000,0x28); +reg_write( DDR_REG_BASE +0x526fb*4+0x02000000,0x3); +reg_write( DDR_REG_BASE +0x526fc*4+0x02000000,0x42c1); +reg_write( DDR_REG_BASE +0x526fd*4+0x02000000,0xaf6); +reg_write( DDR_REG_BASE +0x526fe*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x526ff*4+0x02000000,0xdb08); +reg_write( DDR_REG_BASE +0x52700*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE +0x52701*4+0x02000000,0xe509); +reg_write( DDR_REG_BASE +0x52702*4+0x02000000,0xbad); +reg_write( DDR_REG_BASE +0x52703*4+0x02000000,0xb345); +reg_write( DDR_REG_BASE +0x52704*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x52705*4+0x02000000,0x7005); +reg_write( DDR_REG_BASE +0x52706*4+0x02000000,0x900f); +reg_write( DDR_REG_BASE +0x52707*4+0x02000000,0xe022); +reg_write( DDR_REG_BASE +0x52708*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x52709*4+0x02000000,0x7005); +reg_write( DDR_REG_BASE +0x5270a*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x5270b*4+0x02000000,0xe004); +reg_write( DDR_REG_BASE +0x5270c*4+0x02000000,0x2480); +reg_write( DDR_REG_BASE +0x5270d*4+0x02000000,0x3a03); +reg_write( DDR_REG_BASE +0x5270e*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE +0x5270f*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE +0x52710*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE +0x52711*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x52712*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE +0x52713*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE +0x52714*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE +0x52715*4+0x02000000,0x2482); +reg_write( DDR_REG_BASE +0x52716*4+0x02000000,0x3606); +reg_write( DDR_REG_BASE +0x52717*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE +0x52718*4+0x02000000,0xc350); +reg_write( DDR_REG_BASE +0x52719*4+0x02000000,0xc257); +reg_write( DDR_REG_BASE +0x5271a*4+0x02000000,0xc052); +reg_write( DDR_REG_BASE +0x5271b*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x5271c*4+0x02000000,0x7344); +reg_write( DDR_REG_BASE +0x5271d*4+0x02000000,0x900f); +reg_write( DDR_REG_BASE +0x5271e*4+0x02000000,0xe022); +reg_write( DDR_REG_BASE +0x5271f*4+0x02000000,0x206f); +reg_write( DDR_REG_BASE +0x52720*4+0x02000000,0x43); +reg_write( DDR_REG_BASE +0x52721*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE +0x52722*4+0x02000000,0x9b); +reg_write( DDR_REG_BASE +0x52723*4+0x02000000,0x8804); +reg_write( DDR_REG_BASE +0x52724*4+0x02000000,0x4728); +reg_write( DDR_REG_BASE +0x52725*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x52726*4+0x02000000,0xc051); +reg_write( DDR_REG_BASE +0x52727*4+0x02000000,0x9be); +reg_write( DDR_REG_BASE +0x52728*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE +0x52729*4+0x02000000,0xc012); +reg_write( DDR_REG_BASE +0x5272a*4+0x02000000,0xc05a); +reg_write( DDR_REG_BASE +0x5272b*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE +0x5272c*4+0x02000000,0x3e40); +reg_write( DDR_REG_BASE +0x5272d*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x5272e*4+0x02000000,0xa36); +reg_write( DDR_REG_BASE +0x5272f*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x52730*4+0x02000000,0xdab4); +reg_write( DDR_REG_BASE +0x52731*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE +0x52732*4+0x02000000,0x3840); +reg_write( DDR_REG_BASE +0x52733*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x52734*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x52735*4+0x02000000,0x444); +reg_write( DDR_REG_BASE +0x52736*4+0x02000000,0xa16); +reg_write( DDR_REG_BASE +0x52737*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52738*4+0x02000000,0xda60); +reg_write( DDR_REG_BASE +0x52739*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE +0x5273a*4+0x02000000,0x3840); +reg_write( DDR_REG_BASE +0x5273b*4+0x02000000,0xb16); +reg_write( DDR_REG_BASE +0x5273c*4+0x02000000,0x60); +reg_write( DDR_REG_BASE +0x5273d*4+0x02000000,0xd960); +reg_write( DDR_REG_BASE +0x5273e*4+0x02000000,0x146c); +reg_write( DDR_REG_BASE +0x5273f*4+0x02000000,0x3600); +reg_write( DDR_REG_BASE +0x52740*4+0x02000000,0x71cd); +reg_write( DDR_REG_BASE +0x52741*4+0x02000000,0xc04e); +reg_write( DDR_REG_BASE +0x52742*4+0x02000000,0x146b); +reg_write( DDR_REG_BASE +0x52743*4+0x02000000,0x3600); +reg_write( DDR_REG_BASE +0x52744*4+0x02000000,0xc04f); +reg_write( DDR_REG_BASE +0x52745*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE +0x52746*4+0x02000000,0x6d21); +reg_write( DDR_REG_BASE +0x52747*4+0x02000000,0x259a); +reg_write( DDR_REG_BASE +0x52748*4+0x02000000,0x1008); +reg_write( DDR_REG_BASE +0x52749*4+0x02000000,0x42c1); +reg_write( DDR_REG_BASE +0x5274a*4+0x02000000,0xe805); +reg_write( DDR_REG_BASE +0x5274b*4+0x02000000,0xb861); +reg_write( DDR_REG_BASE +0x5274c*4+0x02000000,0x8ff); +reg_write( DDR_REG_BASE +0x5274d*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE +0x5274e*4+0x02000000,0x7a5b); +reg_write( DDR_REG_BASE +0x5274f*4+0x02000000,0x2505); +reg_write( DDR_REG_BASE +0x52750*4+0x02000000,0x1f80); +reg_write( DDR_REG_BASE +0x52751*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x52752*4+0x02000000,0xe0c4); +reg_write( DDR_REG_BASE +0x52753*4+0x02000000,0xb040); +reg_write( DDR_REG_BASE +0x52754*4+0x02000000,0x4528); +reg_write( DDR_REG_BASE +0x52755*4+0x02000000,0xde5); +reg_write( DDR_REG_BASE +0x52756*4+0x02000000,0x9234); +reg_write( DDR_REG_BASE +0x52757*4+0x02000000,0x2544); +reg_write( DDR_REG_BASE +0x52758*4+0x02000000,0x17c0); +reg_write( DDR_REG_BASE +0x52759*4+0x02000000,0xc012); +reg_write( DDR_REG_BASE +0x5275a*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE +0x5275b*4+0x02000000,0x7c1); +reg_write( DDR_REG_BASE +0x5275c*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE +0x5275d*4+0x02000000,0xe906); +reg_write( DDR_REG_BASE +0x5275e*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE +0x5275f*4+0x02000000,0x901); +reg_write( DDR_REG_BASE +0x52760*4+0x02000000,0x31); +reg_write( DDR_REG_BASE +0x52761*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE +0x52762*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE +0x52763*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x52764*4+0x02000000,0x91a); +reg_write( DDR_REG_BASE +0x52765*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE +0x52766*4+0x02000000,0xc059); +reg_write( DDR_REG_BASE +0x52767*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x52768*4+0x02000000,0xc06d); +reg_write( DDR_REG_BASE +0x52769*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x5276a*4+0x02000000,0xc04c); +reg_write( DDR_REG_BASE +0x5276b*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x5276c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5276d*4+0x02000000,0xf00); +reg_write( DDR_REG_BASE +0x5276e*4+0x02000000,0xc04b); +reg_write( DDR_REG_BASE +0x5276f*4+0x02000000,0xd840); +reg_write( DDR_REG_BASE +0x52770*4+0x02000000,0xc04a); +reg_write( DDR_REG_BASE +0x52771*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE +0x52772*4+0x02000000,0x3e40); +reg_write( DDR_REG_BASE +0x52773*4+0x02000000,0xc046); +reg_write( DDR_REG_BASE +0x52774*4+0x02000000,0xc00e); +reg_write( DDR_REG_BASE +0x52775*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x52776*4+0x02000000,0x708c); +reg_write( DDR_REG_BASE +0x52777*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x52778*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE +0x52779*4+0x02000000,0xc748); +reg_write( DDR_REG_BASE +0x5277a*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE +0x5277b*4+0x02000000,0xc00f); +reg_write( DDR_REG_BASE +0x5277c*4+0x02000000,0x1c1c); +reg_write( DDR_REG_BASE +0x5277d*4+0x02000000,0x3183); +reg_write( DDR_REG_BASE +0x5277e*4+0x02000000,0x1c24); +reg_write( DDR_REG_BASE +0x5277f*4+0x02000000,0x3384); +reg_write( DDR_REG_BASE +0x52780*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE +0x52781*4+0x02000000,0xc012); +reg_write( DDR_REG_BASE +0x52782*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE +0x52783*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x52784*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x52785*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE +0x52786*4+0x02000000,0x8821); +reg_write( DDR_REG_BASE +0x52787*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x52788*4+0x02000000,0xf00a); +reg_write( DDR_REG_BASE +0x52789*4+0x02000000,0x205a); +reg_write( DDR_REG_BASE +0x5278a*4+0x02000000,0x402); +reg_write( DDR_REG_BASE +0x5278b*4+0x02000000,0x7074); +reg_write( DDR_REG_BASE +0x5278c*4+0x02000000,0xc39d); +reg_write( DDR_REG_BASE +0x5278d*4+0x02000000,0x22ce); +reg_write( DDR_REG_BASE +0x5278e*4+0x02000000,0x21); +reg_write( DDR_REG_BASE +0x5278f*4+0x02000000,0x631b); +reg_write( DDR_REG_BASE +0x52790*4+0x02000000,0xab40); +reg_write( DDR_REG_BASE +0x52791*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE +0x52792*4+0x02000000,0x8ef); +reg_write( DDR_REG_BASE +0x52793*4+0x02000000,0x8134); +reg_write( DDR_REG_BASE +0x52794*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE +0x52795*4+0x02000000,0x43); +reg_write( DDR_REG_BASE +0x52796*4+0x02000000,0x202f); +reg_write( DDR_REG_BASE +0x52797*4+0x02000000,0x6c2); +reg_write( DDR_REG_BASE +0x52798*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x52799*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x5279a*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x5279b*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x5279c*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE +0x5279d*4+0x02000000,0x716f); +reg_write( DDR_REG_BASE +0x5279e*4+0x02000000,0x2306); +reg_write( DDR_REG_BASE +0x5279f*4+0x02000000,0x3000); +reg_write( DDR_REG_BASE +0x527a0*4+0x02000000,0xc055); +reg_write( DDR_REG_BASE +0x527a1*4+0x02000000,0xc011); +reg_write( DDR_REG_BASE +0x527a2*4+0x02000000,0x245f); +reg_write( DDR_REG_BASE +0x527a3*4+0x02000000,0x124e); +reg_write( DDR_REG_BASE +0x527a4*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE +0x527a5*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x527a6*4+0x02000000,0x10); +reg_write( DDR_REG_BASE +0x527a7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x527a8*4+0x02000000,0xc05b); +reg_write( DDR_REG_BASE +0x527a9*4+0x02000000,0x215f); +reg_write( DDR_REG_BASE +0x527aa*4+0x02000000,0x240); +reg_write( DDR_REG_BASE +0x527ab*4+0x02000000,0xe008); +reg_write( DDR_REG_BASE +0x527ac*4+0x02000000,0xc058); +reg_write( DDR_REG_BASE +0x527ad*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x527ae*4+0x02000000,0xf0b1); +reg_write( DDR_REG_BASE +0x527af*4+0x02000000,0xcaa); +reg_write( DDR_REG_BASE +0x527b0*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE +0x527b1*4+0x02000000,0xc083); +reg_write( DDR_REG_BASE +0x527b2*4+0x02000000,0x41c1); +reg_write( DDR_REG_BASE +0x527b3*4+0x02000000,0xf012); +reg_write( DDR_REG_BASE +0x527b4*4+0x02000000,0xc20f); +reg_write( DDR_REG_BASE +0x527b5*4+0x02000000,0x7a34); +reg_write( DDR_REG_BASE +0x527b6*4+0x02000000,0x9200); +reg_write( DDR_REG_BASE +0x527b7*4+0x02000000,0xe88d); +reg_write( DDR_REG_BASE +0x527b8*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE +0x527b9*4+0x02000000,0x3e40); +reg_write( DDR_REG_BASE +0x527ba*4+0x02000000,0x20f4); +reg_write( DDR_REG_BASE +0x527bb*4+0x02000000,0x40); +reg_write( DDR_REG_BASE +0x527bc*4+0x02000000,0x2042); +reg_write( DDR_REG_BASE +0x527bd*4+0x02000000,0x800); +reg_write( DDR_REG_BASE +0x527be*4+0x02000000,0x262f); +reg_write( DDR_REG_BASE +0x527bf*4+0x02000000,0xf006); +reg_write( DDR_REG_BASE +0x527c0*4+0x02000000,0x6); +reg_write( DDR_REG_BASE +0x527c1*4+0x02000000,0x3); +reg_write( DDR_REG_BASE +0x527c2*4+0x02000000,0xb200); +reg_write( DDR_REG_BASE +0x527c3*4+0x02000000,0x7124); +reg_write( DDR_REG_BASE +0x527c4*4+0x02000000,0xc018); +reg_write( DDR_REG_BASE +0x527c5*4+0x02000000,0x8e1); +reg_write( DDR_REG_BASE +0x527c6*4+0x02000000,0x8065); +reg_write( DDR_REG_BASE +0x527c7*4+0x02000000,0xc083); +reg_write( DDR_REG_BASE +0x527c8*4+0x02000000,0xe92); +reg_write( DDR_REG_BASE +0x527c9*4+0x02000000,0xff0f); +reg_write( DDR_REG_BASE +0x527ca*4+0x02000000,0x41c1); +reg_write( DDR_REG_BASE +0x527cb*4+0x02000000,0xf010); +reg_write( DDR_REG_BASE +0x527cc*4+0x02000000,0xc20e); +reg_write( DDR_REG_BASE +0x527cd*4+0x02000000,0x7a34); +reg_write( DDR_REG_BASE +0x527ce*4+0x02000000,0x9200); +reg_write( DDR_REG_BASE +0x527cf*4+0x02000000,0x817); +reg_write( DDR_REG_BASE +0x527d0*4+0x02000000,0xff1); +reg_write( DDR_REG_BASE +0x527d1*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE +0x527d2*4+0x02000000,0x3e40); +reg_write( DDR_REG_BASE +0x527d3*4+0x02000000,0x20f5); +reg_write( DDR_REG_BASE +0x527d4*4+0x02000000,0x40); +reg_write( DDR_REG_BASE +0x527d5*4+0x02000000,0x80b); +reg_write( DDR_REG_BASE +0x527d6*4+0x02000000,0x832); +reg_write( DDR_REG_BASE +0x527d7*4+0x02000000,0xe020); +reg_write( DDR_REG_BASE +0x527d8*4+0x02000000,0xb200); +reg_write( DDR_REG_BASE +0x527d9*4+0x02000000,0x7124); +reg_write( DDR_REG_BASE +0x527da*4+0x02000000,0xc018); +reg_write( DDR_REG_BASE +0x527db*4+0x02000000,0x8e5); +reg_write( DDR_REG_BASE +0x527dc*4+0x02000000,0x8065); +reg_write( DDR_REG_BASE +0x527dd*4+0x02000000,0x706f); +reg_write( DDR_REG_BASE +0x527de*4+0x02000000,0xc013); +reg_write( DDR_REG_BASE +0x527df*4+0x02000000,0xc651); +reg_write( DDR_REG_BASE +0x527e0*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE +0x527e1*4+0x02000000,0xc05c); +reg_write( DDR_REG_BASE +0x527e2*4+0x02000000,0x7314); +reg_write( DDR_REG_BASE +0x527e3*4+0x02000000,0xc015); +reg_write( DDR_REG_BASE +0x527e4*4+0x02000000,0x20ca); +reg_write( DDR_REG_BASE +0x527e5*4+0x02000000,0x61); +reg_write( DDR_REG_BASE +0x527e6*4+0x02000000,0xc055); +reg_write( DDR_REG_BASE +0x527e7*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x527e8*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE +0x527e9*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x527ea*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE +0x527eb*4+0x02000000,0xc054); +reg_write( DDR_REG_BASE +0x527ec*4+0x02000000,0xf064); +reg_write( DDR_REG_BASE +0x527ed*4+0x02000000,0x722c); +reg_write( DDR_REG_BASE +0x527ee*4+0x02000000,0x70ed); +reg_write( DDR_REG_BASE +0x527ef*4+0x02000000,0xf05d); +reg_write( DDR_REG_BASE +0x527f0*4+0x02000000,0xc011); +reg_write( DDR_REG_BASE +0x527f1*4+0x02000000,0xf15); +reg_write( DDR_REG_BASE +0x527f2*4+0x02000000,0x1231); +reg_write( DDR_REG_BASE +0x527f3*4+0x02000000,0x7a10); +reg_write( DDR_REG_BASE +0x527f4*4+0x02000000,0xc010); +reg_write( DDR_REG_BASE +0x527f5*4+0x02000000,0x7854); +reg_write( DDR_REG_BASE +0x527f6*4+0x02000000,0x10f0); +reg_write( DDR_REG_BASE +0x527f7*4+0x02000000,0x8102); +reg_write( DDR_REG_BASE +0x527f8*4+0x02000000,0xb040); +reg_write( DDR_REG_BASE +0x527f9*4+0x02000000,0xf04f); +reg_write( DDR_REG_BASE +0x527fa*4+0x02000000,0xc00f); +reg_write( DDR_REG_BASE +0x527fb*4+0x02000000,0x20f5); +reg_write( DDR_REG_BASE +0x527fc*4+0x02000000,0x83); +reg_write( DDR_REG_BASE +0x527fd*4+0x02000000,0xc00e); +reg_write( DDR_REG_BASE +0x527fe*4+0x02000000,0x20f5); +reg_write( DDR_REG_BASE +0x527ff*4+0x02000000,0x8c); +reg_write( DDR_REG_BASE +0x52800*4+0x02000000,0x4c70); +reg_write( DDR_REG_BASE +0x52801*4+0x02000000,0x2048); +reg_write( DDR_REG_BASE +0x52802*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x52803*4+0x02000000,0x7d0e); +reg_write( DDR_REG_BASE +0x52804*4+0x02000000,0xd77); +reg_write( DDR_REG_BASE +0x52805*4+0x02000000,0x11b3); +reg_write( DDR_REG_BASE +0x52806*4+0x02000000,0x43a9); +reg_write( DDR_REG_BASE +0x52807*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE +0x52808*4+0x02000000,0x203c); +reg_write( DDR_REG_BASE +0x52809*4+0x02000000,0x3cd); +reg_write( DDR_REG_BASE +0x5280a*4+0x02000000,0x97b); +reg_write( DDR_REG_BASE +0x5280b*4+0x02000000,0x360); +reg_write( DDR_REG_BASE +0x5280c*4+0x02000000,0x43e1); +reg_write( DDR_REG_BASE +0x5280d*4+0x02000000,0xc015); +reg_write( DDR_REG_BASE +0x5280e*4+0x02000000,0xc216); +reg_write( DDR_REG_BASE +0x5280f*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x52810*4+0x02000000,0x1c); +reg_write( DDR_REG_BASE +0x52811*4+0x02000000,0x3); +reg_write( DDR_REG_BASE +0x52812*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE +0x52813*4+0x02000000,0x2078); +reg_write( DDR_REG_BASE +0x52814*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x52815*4+0x02000000,0x8c6); +reg_write( DDR_REG_BASE +0x52816*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52817*4+0x02000000,0x1c00); +reg_write( DDR_REG_BASE +0x52818*4+0x02000000,0x32c0); +reg_write( DDR_REG_BASE +0x52819*4+0x02000000,0x40e1); +reg_write( DDR_REG_BASE +0x5281a*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE +0x5281b*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x5281c*4+0x02000000,0x716f); +reg_write( DDR_REG_BASE +0x5281d*4+0x02000000,0x2004); +reg_write( DDR_REG_BASE +0x5281e*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE +0x5281f*4+0x02000000,0x37fe); +reg_write( DDR_REG_BASE +0x52820*4+0x02000000,0xff00); +reg_write( DDR_REG_BASE +0x52821*4+0x02000000,0xc01a); +reg_write( DDR_REG_BASE +0x52822*4+0x02000000,0x2055); +reg_write( DDR_REG_BASE +0x52823*4+0x02000000,0x8c2); +reg_write( DDR_REG_BASE +0x52824*4+0x02000000,0xc01b); +reg_write( DDR_REG_BASE +0x52825*4+0x02000000,0x7a05); +reg_write( DDR_REG_BASE +0x52826*4+0x02000000,0xc016); +reg_write( DDR_REG_BASE +0x52827*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE +0x52828*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x52829*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5282a*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE +0x5282b*4+0x02000000,0x7845); +reg_write( DDR_REG_BASE +0x5282c*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE +0x5282d*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE +0x5282e*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x5282f*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE +0x52830*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE +0x52831*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x52832*4+0x02000000,0x9260); +reg_write( DDR_REG_BASE +0x52833*4+0x02000000,0xc01c); +reg_write( DDR_REG_BASE +0x52834*4+0x02000000,0xc19d); +reg_write( DDR_REG_BASE +0x52835*4+0x02000000,0x2133); +reg_write( DDR_REG_BASE +0x52836*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x52837*4+0x02000000,0x41a1); +reg_write( DDR_REG_BASE +0x52838*4+0x02000000,0x6078); +reg_write( DDR_REG_BASE +0x52839*4+0x02000000,0x780e); +reg_write( DDR_REG_BASE +0x5283a*4+0x02000000,0x2048); +reg_write( DDR_REG_BASE +0x5283b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5283c*4+0x02000000,0x2049); +reg_write( DDR_REG_BASE +0x5283d*4+0x02000000,0x800); +reg_write( DDR_REG_BASE +0x5283e*4+0x02000000,0xf008); +reg_write( DDR_REG_BASE +0x5283f*4+0x02000000,0xc010); +reg_write( DDR_REG_BASE +0x52840*4+0x02000000,0x2014); +reg_write( DDR_REG_BASE +0x52841*4+0x02000000,0x82); +reg_write( DDR_REG_BASE +0x52842*4+0x02000000,0x6478); +reg_write( DDR_REG_BASE +0x52843*4+0x02000000,0x781c); +reg_write( DDR_REG_BASE +0x52844*4+0x02000000,0x2048); +reg_write( DDR_REG_BASE +0x52845*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x52846*4+0x02000000,0xb200); +reg_write( DDR_REG_BASE +0x52847*4+0x02000000,0xc011); +reg_write( DDR_REG_BASE +0x52848*4+0x02000000,0x71e5); +reg_write( DDR_REG_BASE +0x52849*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE +0x5284a*4+0x02000000,0xc051); +reg_write( DDR_REG_BASE +0x5284b*4+0x02000000,0xf4d); +reg_write( DDR_REG_BASE +0x5284c*4+0x02000000,0x9254); +reg_write( DDR_REG_BASE +0x5284d*4+0x02000000,0xc014); +reg_write( DDR_REG_BASE +0x5284e*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE +0x5284f*4+0x02000000,0xc054); +reg_write( DDR_REG_BASE +0x52850*4+0x02000000,0xc014); +reg_write( DDR_REG_BASE +0x52851*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE +0x52852*4+0x02000000,0xc056); +reg_write( DDR_REG_BASE +0x52853*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x52854*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x52855*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE +0x52856*4+0x02000000,0x8821); +reg_write( DDR_REG_BASE +0x52857*4+0x02000000,0xc016); +reg_write( DDR_REG_BASE +0x52858*4+0x02000000,0x92b); +reg_write( DDR_REG_BASE +0x52859*4+0x02000000,0x8025); +reg_write( DDR_REG_BASE +0x5285a*4+0x02000000,0x7077); +reg_write( DDR_REG_BASE +0x5285b*4+0x02000000,0xd64); +reg_write( DDR_REG_BASE +0x5285c*4+0x02000000,0xfec2); +reg_write( DDR_REG_BASE +0x5285d*4+0x02000000,0xc013); +reg_write( DDR_REG_BASE +0x5285e*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE +0x5285f*4+0x02000000,0xc053); +reg_write( DDR_REG_BASE +0x52860*4+0x02000000,0x7077); +reg_write( DDR_REG_BASE +0x52861*4+0x02000000,0xf54f); +reg_write( DDR_REG_BASE +0x52862*4+0x02000000,0xc017); +reg_write( DDR_REG_BASE +0x52863*4+0x02000000,0xe837); +reg_write( DDR_REG_BASE +0x52864*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x52865*4+0x02000000,0x1d); +reg_write( DDR_REG_BASE +0x52866*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x52867*4+0x02000000,0xf96); +reg_write( DDR_REG_BASE +0x52868*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE +0x52869*4+0x02000000,0x740c); +reg_write( DDR_REG_BASE +0x5286a*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x5286b*4+0x02000000,0x709b); +reg_write( DDR_REG_BASE +0x5286c*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x5286d*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE +0x5286e*4+0x02000000,0xf022); +reg_write( DDR_REG_BASE +0x5286f*4+0x02000000,0xd39); +reg_write( DDR_REG_BASE +0x52870*4+0x02000000,0x1230); +reg_write( DDR_REG_BASE +0x52871*4+0x02000000,0x78db); +reg_write( DDR_REG_BASE +0x52872*4+0x02000000,0x2004); +reg_write( DDR_REG_BASE +0x52873*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE +0x52874*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x52875*4+0x02000000,0xfffe); +reg_write( DDR_REG_BASE +0x52876*4+0x02000000,0xc00f); +reg_write( DDR_REG_BASE +0x52877*4+0x02000000,0x2035); +reg_write( DDR_REG_BASE +0x52878*4+0x02000000,0x42); +reg_write( DDR_REG_BASE +0x52879*4+0x02000000,0xc00e); +reg_write( DDR_REG_BASE +0x5287a*4+0x02000000,0x2035); +reg_write( DDR_REG_BASE +0x5287b*4+0x02000000,0x43); +reg_write( DDR_REG_BASE +0x5287c*4+0x02000000,0xc010); +reg_write( DDR_REG_BASE +0x5287d*4+0x02000000,0x2035); +reg_write( DDR_REG_BASE +0x5287e*4+0x02000000,0x40); +reg_write( DDR_REG_BASE +0x5287f*4+0x02000000,0xc341); +reg_write( DDR_REG_BASE +0x52880*4+0x02000000,0xc240); +reg_write( DDR_REG_BASE +0x52881*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE +0x52882*4+0x02000000,0x740c); +reg_write( DDR_REG_BASE +0x52883*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x52884*4+0x02000000,0x1f); +reg_write( DDR_REG_BASE +0x52885*4+0x02000000,0x5); +reg_write( DDR_REG_BASE +0x52886*4+0x02000000,0x42e1); +reg_write( DDR_REG_BASE +0x52887*4+0x02000000,0xf56); +reg_write( DDR_REG_BASE +0x52888*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE +0x52889*4+0x02000000,0x43a1); +reg_write( DDR_REG_BASE +0x5288a*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE +0x5288b*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE +0x5288c*4+0x02000000,0xdc7); +reg_write( DDR_REG_BASE +0x5288d*4+0x02000000,0x9254); +reg_write( DDR_REG_BASE +0x5288e*4+0x02000000,0x7167); +reg_write( DDR_REG_BASE +0x5288f*4+0x02000000,0x7ed0); +reg_write( DDR_REG_BASE +0x52890*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x52891*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x52892*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE +0x52893*4+0x02000000,0x8801); +reg_write( DDR_REG_BASE +0x52894*4+0x02000000,0x272f); +reg_write( DDR_REG_BASE +0x52895*4+0x02000000,0x16c7); +reg_write( DDR_REG_BASE +0x52896*4+0x02000000,0x8ed); +reg_write( DDR_REG_BASE +0x52897*4+0x02000000,0x83e5); +reg_write( DDR_REG_BASE +0x52898*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE +0x52899*4+0x02000000,0xc9a); +reg_write( DDR_REG_BASE +0x5289a*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE +0x5289b*4+0x02000000,0xc019); +reg_write( DDR_REG_BASE +0x5289c*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x5289d*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x5289e*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE +0x5289f*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x528a0*4+0x02000000,0xe004); +reg_write( DDR_REG_BASE +0x528a1*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x528a2*4+0x02000000,0x7082); +reg_write( DDR_REG_BASE +0x528a3*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x528a4*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE +0x528a5*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x528a6*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x528a7*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE +0x528a8*4+0x02000000,0x8821); +reg_write( DDR_REG_BASE +0x528a9*4+0x02000000,0x225f); +reg_write( DDR_REG_BASE +0x528aa*4+0x02000000,0x243); +reg_write( DDR_REG_BASE +0x528ab*4+0x02000000,0xf02e); +reg_write( DDR_REG_BASE +0x528ac*4+0x02000000,0x260a); +reg_write( DDR_REG_BASE +0x528ad*4+0x02000000,0x30c0); +reg_write( DDR_REG_BASE +0x528ae*4+0x02000000,0xf026); +reg_write( DDR_REG_BASE +0x528af*4+0x02000000,0xc010); +reg_write( DDR_REG_BASE +0x528b0*4+0x02000000,0x20f5); +reg_write( DDR_REG_BASE +0x528b1*4+0x02000000,0x78e); +reg_write( DDR_REG_BASE +0x528b2*4+0x02000000,0x2640); +reg_write( DDR_REG_BASE +0x528b3*4+0x02000000,0x305e); +reg_write( DDR_REG_BASE +0x528b4*4+0x02000000,0x78dc); +reg_write( DDR_REG_BASE +0x528b5*4+0x02000000,0x781c); +reg_write( DDR_REG_BASE +0x528b6*4+0x02000000,0x781c); +reg_write( DDR_REG_BASE +0x528b7*4+0x02000000,0x781c); +reg_write( DDR_REG_BASE +0x528b8*4+0x02000000,0x4508); +reg_write( DDR_REG_BASE +0x528b9*4+0x02000000,0xd81b); +reg_write( DDR_REG_BASE +0x528ba*4+0x02000000,0xb861); +reg_write( DDR_REG_BASE +0x528bb*4+0x02000000,0x801); +reg_write( DDR_REG_BASE +0x528bc*4+0x02000000,0x31); +reg_write( DDR_REG_BASE +0x528bd*4+0x02000000,0x7dbd); +reg_write( DDR_REG_BASE +0x528be*4+0x02000000,0x66b8); +reg_write( DDR_REG_BASE +0x528bf*4+0x02000000,0xb8c4); +reg_write( DDR_REG_BASE +0x528c0*4+0x02000000,0x48b5); +reg_write( DDR_REG_BASE +0x528c1*4+0x02000000,0x2e44); +reg_write( DDR_REG_BASE +0x528c2*4+0x02000000,0x1800); +reg_write( DDR_REG_BASE +0x528c3*4+0x02000000,0x6cc1); +reg_write( DDR_REG_BASE +0x528c4*4+0x02000000,0x249a); +reg_write( DDR_REG_BASE +0x528c5*4+0x02000000,0x1008); +reg_write( DDR_REG_BASE +0x528c6*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE +0x528c7*4+0x02000000,0x10); +reg_write( DDR_REG_BASE +0x528c8*4+0x02000000,0x7d05); +reg_write( DDR_REG_BASE +0x528c9*4+0x02000000,0x221a); +reg_write( DDR_REG_BASE +0x528ca*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x528cb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x528cc*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE +0x528cd*4+0x02000000,0x7885); +reg_write( DDR_REG_BASE +0x528ce*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x528cf*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x528d0*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE +0x528d1*4+0x02000000,0x64); +reg_write( DDR_REG_BASE +0x528d2*4+0x02000000,0xb0a0); +reg_write( DDR_REG_BASE +0x528d3*4+0x02000000,0x44c9); +reg_write( DDR_REG_BASE +0x528d4*4+0x02000000,0xcb7); +reg_write( DDR_REG_BASE +0x528d5*4+0x02000000,0x9214); +reg_write( DDR_REG_BASE +0x528d6*4+0x02000000,0x7144); +reg_write( DDR_REG_BASE +0x528d7*4+0x02000000,0xe309); +reg_write( DDR_REG_BASE +0x528d8*4+0x02000000,0x9a9); +reg_write( DDR_REG_BASE +0x528d9*4+0x02000000,0x80a5); +reg_write( DDR_REG_BASE +0x528da*4+0x02000000,0x708d); +reg_write( DDR_REG_BASE +0x528db*4+0x02000000,0xc00e); +reg_write( DDR_REG_BASE +0x528dc*4+0x02000000,0xc117); +reg_write( DDR_REG_BASE +0x528dd*4+0x02000000,0xc210); +reg_write( DDR_REG_BASE +0x528de*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE +0x528df*4+0x02000000,0xc012); +reg_write( DDR_REG_BASE +0x528e0*4+0x02000000,0x95e); +reg_write( DDR_REG_BASE +0x528e1*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE +0x528e2*4+0x02000000,0xc30f); +reg_write( DDR_REG_BASE +0x528e3*4+0x02000000,0x2480); +reg_write( DDR_REG_BASE +0x528e4*4+0x02000000,0x3606); +reg_write( DDR_REG_BASE +0x528e5*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE +0x528e6*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE +0x528e7*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE +0x528e8*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE +0x528e9*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE +0x528ea*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE +0x528eb*4+0x02000000,0xc1a8); +reg_write( DDR_REG_BASE +0x528ec*4+0x02000000,0xfca); +reg_write( DDR_REG_BASE +0x528ed*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE +0x528ee*4+0x02000000,0x4708); +reg_write( DDR_REG_BASE +0x528ef*4+0x02000000,0x83e); +reg_write( DDR_REG_BASE +0x528f0*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE +0x528f1*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE +0x528f2*4+0x02000000,0x896); +reg_write( DDR_REG_BASE +0x528f3*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE +0x528f4*4+0x02000000,0xc047); +reg_write( DDR_REG_BASE +0x528f5*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x528f6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x528f7*4+0x02000000,0xcccc); +reg_write( DDR_REG_BASE +0x528f8*4+0x02000000,0x4608); +reg_write( DDR_REG_BASE +0x528f9*4+0x02000000,0x706c); +reg_write( DDR_REG_BASE +0x528fa*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE +0x528fb*4+0x02000000,0x4220); +reg_write( DDR_REG_BASE +0x528fc*4+0x02000000,0x4568); +reg_write( DDR_REG_BASE +0x528fd*4+0x02000000,0x94a); +reg_write( DDR_REG_BASE +0x528fe*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE +0x528ff*4+0x02000000,0xc340); +reg_write( DDR_REG_BASE +0x52900*4+0x02000000,0xd808); +reg_write( DDR_REG_BASE +0x52901*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x52902*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE +0x52903*4+0x02000000,0x706c); +reg_write( DDR_REG_BASE +0x52904*4+0x02000000,0x93a); +reg_write( DDR_REG_BASE +0x52905*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE +0x52906*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE +0x52907*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE +0x52908*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE +0x52909*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE +0x5290a*4+0x02000000,0xc105); +reg_write( DDR_REG_BASE +0x5290b*4+0x02000000,0x9fe); +reg_write( DDR_REG_BASE +0x5290c*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE +0x5290d*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x5290e*4+0x02000000,0x1200); +reg_write( DDR_REG_BASE +0x5290f*4+0x02000000,0x3083); +reg_write( DDR_REG_BASE +0x52910*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52911*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x52912*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE +0x52913*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE +0x52914*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE +0x52915*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE +0x52916*4+0x02000000,0xabe); +reg_write( DDR_REG_BASE +0x52917*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE +0x52918*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE +0x52919*4+0x02000000,0x7fef); +reg_write( DDR_REG_BASE +0x5291a*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x5291b*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x5291c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5291d*4+0x02000000,0x4400); +reg_write( DDR_REG_BASE +0x5291e*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE +0x5291f*4+0x02000000,0xdb7c); +reg_write( DDR_REG_BASE +0x52920*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE +0x52921*4+0x02000000,0x3041); +reg_write( DDR_REG_BASE +0x52922*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE +0x52923*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE +0x52924*4+0x02000000,0xaa2); +reg_write( DDR_REG_BASE +0x52925*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE +0x52926*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE +0x52927*4+0x02000000,0xca08); +reg_write( DDR_REG_BASE +0x52928*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x52929*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5292a*4+0x02000000,0x7500); +reg_write( DDR_REG_BASE +0x5292b*4+0x02000000,0x724c); +reg_write( DDR_REG_BASE +0x5292c*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE +0x5292d*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x5292e*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE +0x5292f*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE +0x52930*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE +0x52931*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE +0x52932*4+0x02000000,0xa86); +reg_write( DDR_REG_BASE +0x52933*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE +0x52934*4+0x02000000,0x4338); +reg_write( DDR_REG_BASE +0x52935*4+0x02000000,0xb46); +reg_write( DDR_REG_BASE +0x52936*4+0x02000000,0xfe0f); +reg_write( DDR_REG_BASE +0x52937*4+0x02000000,0x2644); +reg_write( DDR_REG_BASE +0x52938*4+0x02000000,0x1040); +reg_write( DDR_REG_BASE +0x52939*4+0x02000000,0x60d8); +reg_write( DDR_REG_BASE +0x5293a*4+0x02000000,0xe010); +reg_write( DDR_REG_BASE +0x5293b*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE +0x5293c*4+0x02000000,0xc046); +reg_write( DDR_REG_BASE +0x5293d*4+0x02000000,0xc306); +reg_write( DDR_REG_BASE +0x5293e*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x5293f*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE +0x52940*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE +0x52941*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE +0x52942*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE +0x52943*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE +0x52944*4+0x02000000,0xa62); +reg_write( DDR_REG_BASE +0x52945*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE +0x52946*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE +0x52947*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x52948*4+0x02000000,0xa1a); +reg_write( DDR_REG_BASE +0x52949*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE +0x5294a*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x5294b*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x5294c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5294d*4+0x02000000,0x3333); +reg_write( DDR_REG_BASE +0x5294e*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE +0x5294f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x52950*4+0x02000000,0x9999); +reg_write( DDR_REG_BASE +0x52951*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE +0x52952*4+0x02000000,0x4220); +reg_write( DDR_REG_BASE +0x52953*4+0x02000000,0x89e); +reg_write( DDR_REG_BASE +0x52954*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE +0x52955*4+0x02000000,0xc340); +reg_write( DDR_REG_BASE +0x52956*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x52957*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x52958*4+0x02000000,0xaaaa); +reg_write( DDR_REG_BASE +0x52959*4+0x02000000,0xd808); +reg_write( DDR_REG_BASE +0x5295a*4+0x02000000,0x4220); +reg_write( DDR_REG_BASE +0x5295b*4+0x02000000,0x706c); +reg_write( DDR_REG_BASE +0x5295c*4+0x02000000,0x88a); +reg_write( DDR_REG_BASE +0x5295d*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE +0x5295e*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE +0x5295f*4+0x02000000,0xc105); +reg_write( DDR_REG_BASE +0x52960*4+0x02000000,0x952); +reg_write( DDR_REG_BASE +0x52961*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE +0x52962*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x52963*4+0x02000000,0x1200); +reg_write( DDR_REG_BASE +0x52964*4+0x02000000,0x3083); +reg_write( DDR_REG_BASE +0x52965*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52966*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x52967*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE +0x52968*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE +0x52969*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE +0x5296a*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE +0x5296b*4+0x02000000,0xa16); +reg_write( DDR_REG_BASE +0x5296c*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE +0x5296d*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE +0x5296e*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE +0x5296f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x52970*4+0x02000000,0x4400); +reg_write( DDR_REG_BASE +0x52971*4+0x02000000,0xbeaa); +reg_write( DDR_REG_BASE +0x52972*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52973*4+0x02000000,0x41c1); +reg_write( DDR_REG_BASE +0x52974*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE +0x52975*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE +0x52976*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE +0x52977*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE +0x52978*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE +0x52979*4+0x02000000,0x9fa); +reg_write( DDR_REG_BASE +0x5297a*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE +0x5297b*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE +0x5297c*4+0x02000000,0xca08); +reg_write( DDR_REG_BASE +0x5297d*4+0x02000000,0x4163); +reg_write( DDR_REG_BASE +0x5297e*4+0x02000000,0x724c); +reg_write( DDR_REG_BASE +0x5297f*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE +0x52980*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52981*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE +0x52982*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE +0x52983*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE +0x52984*4+0x02000000,0x9e2); +reg_write( DDR_REG_BASE +0x52985*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE +0x52986*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE +0x52987*4+0x02000000,0xaa2); +reg_write( DDR_REG_BASE +0x52988*4+0x02000000,0xfe0f); +reg_write( DDR_REG_BASE +0x52989*4+0x02000000,0xc306); +reg_write( DDR_REG_BASE +0x5298a*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x5298b*4+0x02000000,0x41c1); +reg_write( DDR_REG_BASE +0x5298c*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE +0x5298d*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE +0x5298e*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE +0x5298f*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE +0x52990*4+0x02000000,0x9ca); +reg_write( DDR_REG_BASE +0x52991*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE +0x52992*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE +0x52993*4+0x02000000,0xca08); +reg_write( DDR_REG_BASE +0x52994*4+0x02000000,0x2350); +reg_write( DDR_REG_BASE +0x52995*4+0x02000000,0x3301); +reg_write( DDR_REG_BASE +0x52996*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE +0x52997*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE +0x52998*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52999*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE +0x5299a*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE +0x5299b*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE +0x5299c*4+0x02000000,0x9b2); +reg_write( DDR_REG_BASE +0x5299d*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE +0x5299e*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE +0x5299f*4+0x02000000,0xc104); +reg_write( DDR_REG_BASE +0x529a0*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE +0x529a1*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE +0x529a2*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE +0x529a3*4+0x02000000,0x2014); +reg_write( DDR_REG_BASE +0x529a4*4+0x02000000,0x41); +reg_write( DDR_REG_BASE +0x529a5*4+0x02000000,0x4958); +reg_write( DDR_REG_BASE +0x529a6*4+0x02000000,0xb8c0); +reg_write( DDR_REG_BASE +0x529a7*4+0x02000000,0x6038); +reg_write( DDR_REG_BASE +0x529a8*4+0x02000000,0xe028); +reg_write( DDR_REG_BASE +0x529a9*4+0x02000000,0x7b0f); +reg_write( DDR_REG_BASE +0x529aa*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x529ab*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x529ac*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE +0x529ad*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE +0x529ae*4+0x02000000,0x98e); +reg_write( DDR_REG_BASE +0x529af*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE +0x529b0*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE +0x529b1*4+0x02000000,0x79db); +reg_write( DDR_REG_BASE +0x529b2*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x529b3*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE +0x529b4*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE +0x529b5*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE +0x529b6*4+0x02000000,0x30c1); +reg_write( DDR_REG_BASE +0x529b7*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE +0x529b8*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE +0x529b9*4+0x02000000,0x97a); +reg_write( DDR_REG_BASE +0x529ba*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE +0x529bb*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE +0x529bc*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x529bd*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x529be*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE +0x529bf*4+0x02000000,0xdb10); +reg_write( DDR_REG_BASE +0x529c0*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE +0x529c1*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE +0x529c2*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE +0x529c3*4+0x02000000,0x966); +reg_write( DDR_REG_BASE +0x529c4*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE +0x529c5*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE +0x529c6*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x529c7*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x529c8*4+0x02000000,0x764c); +reg_write( DDR_REG_BASE +0x529c9*4+0x02000000,0xdb26); +reg_write( DDR_REG_BASE +0x529ca*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE +0x529cb*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE +0x529cc*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE +0x529cd*4+0x02000000,0x952); +reg_write( DDR_REG_BASE +0x529ce*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE +0x529cf*4+0x02000000,0x1c00); +reg_write( DDR_REG_BASE +0x529d0*4+0x02000000,0x3041); +reg_write( DDR_REG_BASE +0x529d1*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x529d2*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE +0x529d3*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE +0x529d4*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE +0x529d5*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE +0x529d6*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE +0x529d7*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE +0x529d8*4+0x02000000,0x93a); +reg_write( DDR_REG_BASE +0x529d9*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE +0x529da*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE +0x529db*4+0x02000000,0xc0a8); +reg_write( DDR_REG_BASE +0x529dc*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE +0x529dd*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE +0x529de*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE +0x529df*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x529e0*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE +0x529e1*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE +0x529e2*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE +0x529e3*4+0x02000000,0xc1a6); +reg_write( DDR_REG_BASE +0x529e4*4+0x02000000,0xc144); +reg_write( DDR_REG_BASE +0x529e5*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x529e6*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x529e7*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE +0x529e8*4+0x02000000,0x8920); +reg_write( DDR_REG_BASE +0x529e9*4+0x02000000,0x4358); +reg_write( DDR_REG_BASE +0x529ea*4+0x02000000,0x7034); +reg_write( DDR_REG_BASE +0x529eb*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x529ec*4+0x02000000,0xf206); +reg_write( DDR_REG_BASE +0x529ed*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x529ee*4+0x02000000,0x708f); +reg_write( DDR_REG_BASE +0x529ef*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x529f0*4+0x02000000,0x49); +reg_write( DDR_REG_BASE +0x529f1*4+0x02000000,0xf006); +reg_write( DDR_REG_BASE +0x529f2*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x529f3*4+0x02000000,0x708f); +reg_write( DDR_REG_BASE +0x529f4*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x529f5*4+0x02000000,0x23); +reg_write( DDR_REG_BASE +0x529f6*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE +0x529f7*4+0x02000000,0x7c2); +reg_write( DDR_REG_BASE +0x529f8*4+0x02000000,0x4020); +reg_write( DDR_REG_BASE +0x529f9*4+0x02000000,0xea06); +reg_write( DDR_REG_BASE +0x529fa*4+0x02000000,0xba61); +reg_write( DDR_REG_BASE +0x529fb*4+0x02000000,0xa01); +reg_write( DDR_REG_BASE +0x529fc*4+0x02000000,0x31); +reg_write( DDR_REG_BASE +0x529fd*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE +0x529fe*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE +0x529ff*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x52a00*4+0x02000000,0x812); +reg_write( DDR_REG_BASE +0x52a01*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE +0x52a02*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x52a03*4+0x02000000,0x70cd); +reg_write( DDR_REG_BASE +0x52a04*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE +0x52a05*4+0x02000000,0xf02a); +reg_write( DDR_REG_BASE +0x52a06*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE +0x52a07*4+0x02000000,0x2012); +reg_write( DDR_REG_BASE +0x52a08*4+0x02000000,0x340); +reg_write( DDR_REG_BASE +0x52a09*4+0x02000000,0x262f); +reg_write( DDR_REG_BASE +0x52a0a*4+0x02000000,0xf007); +reg_write( DDR_REG_BASE +0x52a0b*4+0x02000000,0xf47); +reg_write( DDR_REG_BASE +0x52a0c*4+0x02000000,0x136e); +reg_write( DDR_REG_BASE +0x52a0d*4+0x02000000,0x26ca); +reg_write( DDR_REG_BASE +0x52a0e*4+0x02000000,0x1341); +reg_write( DDR_REG_BASE +0x52a0f*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE +0x52a10*4+0x02000000,0x4200); +reg_write( DDR_REG_BASE +0x52a11*4+0x02000000,0x2544); +reg_write( DDR_REG_BASE +0x52a12*4+0x02000000,0x17c0); +reg_write( DDR_REG_BASE +0x52a13*4+0x02000000,0xe806); +reg_write( DDR_REG_BASE +0x52a14*4+0x02000000,0xb861); +reg_write( DDR_REG_BASE +0x52a15*4+0x02000000,0x801); +reg_write( DDR_REG_BASE +0x52a16*4+0x02000000,0x31); +reg_write( DDR_REG_BASE +0x52a17*4+0x02000000,0x7a5b); +reg_write( DDR_REG_BASE +0x52a18*4+0x02000000,0x255a); +reg_write( DDR_REG_BASE +0x52a19*4+0x02000000,0x1c81); +reg_write( DDR_REG_BASE +0x52a1a*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE +0x52a1b*4+0x02000000,0x7077); +reg_write( DDR_REG_BASE +0x52a1c*4+0x02000000,0xdb18); +reg_write( DDR_REG_BASE +0x52a1d*4+0x02000000,0x6038); +reg_write( DDR_REG_BASE +0x52a1e*4+0x02000000,0x880b); +reg_write( DDR_REG_BASE +0x52a1f*4+0x02000000,0x794f); +reg_write( DDR_REG_BASE +0x52a20*4+0x02000000,0xc142); +reg_write( DDR_REG_BASE +0x52a21*4+0x02000000,0x20ec); +reg_write( DDR_REG_BASE +0x52a22*4+0x02000000,0x62); +reg_write( DDR_REG_BASE +0x52a23*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE +0x52a24*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52a25*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x52a26*4+0x02000000,0x734c); +reg_write( DDR_REG_BASE +0x52a27*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE +0x52a28*4+0x02000000,0x3001); +reg_write( DDR_REG_BASE +0x52a29*4+0x02000000,0xa1a); +reg_write( DDR_REG_BASE +0x52a2a*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE +0x52a2b*4+0x02000000,0x1c04); +reg_write( DDR_REG_BASE +0x52a2c*4+0x02000000,0x32c1); +reg_write( DDR_REG_BASE +0x52a2d*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE +0x52a2e*4+0x02000000,0xdb1); +reg_write( DDR_REG_BASE +0x52a2f*4+0x02000000,0x90b4); +reg_write( DDR_REG_BASE +0x52a30*4+0x02000000,0x7077); +reg_write( DDR_REG_BASE +0x52a31*4+0x02000000,0x265a); +reg_write( DDR_REG_BASE +0x52a32*4+0x02000000,0x1c8e); +reg_write( DDR_REG_BASE +0x52a33*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE +0x52a34*4+0x02000000,0x734c); +reg_write( DDR_REG_BASE +0x52a35*4+0x02000000,0x60d8); +reg_write( DDR_REG_BASE +0x52a36*4+0x02000000,0x8822); +reg_write( DDR_REG_BASE +0x52a37*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x52a38*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE +0x52a39*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE +0x52a3a*4+0x02000000,0x21cf); +reg_write( DDR_REG_BASE +0x52a3b*4+0x02000000,0x1e2); +reg_write( DDR_REG_BASE +0x52a3c*4+0x02000000,0xc140); +reg_write( DDR_REG_BASE +0x52a3d*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE +0x52a3e*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE +0x52a3f*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52a40*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x52a41*4+0x02000000,0xdb18); +reg_write( DDR_REG_BASE +0x52a42*4+0x02000000,0x9e6); +reg_write( DDR_REG_BASE +0x52a43*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE +0x52a44*4+0x02000000,0x1c04); +reg_write( DDR_REG_BASE +0x52a45*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE +0x52a46*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x52a47*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE +0x52a48*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE +0x52a49*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE +0x52a4a*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52a4b*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x52a4c*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE +0x52a4d*4+0x02000000,0xdb31); +reg_write( DDR_REG_BASE +0x52a4e*4+0x02000000,0x84e); +reg_write( DDR_REG_BASE +0x52a4f*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE +0x52a50*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE +0x52a51*4+0x02000000,0x3401); +reg_write( DDR_REG_BASE +0x52a52*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x52a53*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE +0x52a54*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE +0x52a55*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE +0x52a56*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE +0x52a57*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52a58*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE +0x52a59*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE +0x52a5a*4+0x02000000,0x836); +reg_write( DDR_REG_BASE +0x52a5b*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE +0x52a5c*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE +0x52a5d*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x52a5e*4+0x02000000,0xfee); +reg_write( DDR_REG_BASE +0x52a5f*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52a60*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x52a61*4+0x02000000,0xc0a6); +reg_write( DDR_REG_BASE +0x52a62*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE +0x52a63*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE +0x52a64*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE +0x52a65*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x52a66*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE +0x52a67*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE +0x52a68*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE +0x52a69*4+0x02000000,0xc1a4); +reg_write( DDR_REG_BASE +0x52a6a*4+0x02000000,0x4528); +reg_write( DDR_REG_BASE +0x52a6b*4+0x02000000,0xd46); +reg_write( DDR_REG_BASE +0x52a6c*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE +0x52a6d*4+0x02000000,0x4608); +reg_write( DDR_REG_BASE +0x52a6e*4+0x02000000,0x4318); +reg_write( DDR_REG_BASE +0x52a6f*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x52a70*4+0x02000000,0xf32); +reg_write( DDR_REG_BASE +0x52a71*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52a72*4+0x02000000,0xd908); +reg_write( DDR_REG_BASE +0x52a73*4+0x02000000,0x70ed); +reg_write( DDR_REG_BASE +0x52a74*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52a75*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x52a76*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE +0x52a77*4+0x02000000,0xdb7c); +reg_write( DDR_REG_BASE +0x52a78*4+0x02000000,0xc743); +reg_write( DDR_REG_BASE +0x52a79*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE +0x52a7a*4+0x02000000,0xc741); +reg_write( DDR_REG_BASE +0x52a7b*4+0x02000000,0xff6); +reg_write( DDR_REG_BASE +0x52a7c*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52a7d*4+0x02000000,0xc740); +reg_write( DDR_REG_BASE +0x52a7e*4+0x02000000,0x9aa); +reg_write( DDR_REG_BASE +0x52a7f*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE +0x52a80*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52a81*4+0x02000000,0x2344); +reg_write( DDR_REG_BASE +0x52a82*4+0x02000000,0x3040); +reg_write( DDR_REG_BASE +0x52a83*4+0x02000000,0x7063); +reg_write( DDR_REG_BASE +0x52a84*4+0x02000000,0x2040); +reg_write( DDR_REG_BASE +0x52a85*4+0x02000000,0xb9b); +reg_write( DDR_REG_BASE +0x52a86*4+0x02000000,0xed12); +reg_write( DDR_REG_BASE +0x52a87*4+0x02000000,0xf82c); +reg_write( DDR_REG_BASE +0x52a88*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE +0x52a89*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE +0x52a8a*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE +0x52a8b*4+0x02000000,0xc741); +reg_write( DDR_REG_BASE +0x52a8c*4+0x02000000,0xfd2); +reg_write( DDR_REG_BASE +0x52a8d*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52a8e*4+0x02000000,0xc740); +reg_write( DDR_REG_BASE +0x52a8f*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52a90*4+0x02000000,0xd90c); +reg_write( DDR_REG_BASE +0x52a91*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE +0x52a92*4+0x02000000,0x756c); +reg_write( DDR_REG_BASE +0x52a93*4+0x02000000,0xc743); +reg_write( DDR_REG_BASE +0x52a94*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE +0x52a95*4+0x02000000,0xc741); +reg_write( DDR_REG_BASE +0x52a96*4+0x02000000,0xc740); +reg_write( DDR_REG_BASE +0x52a97*4+0x02000000,0xf008); +reg_write( DDR_REG_BASE +0x52a98*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE +0x52a99*4+0x02000000,0x3101); +reg_write( DDR_REG_BASE +0x52a9a*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE +0x52a9b*4+0x02000000,0xc741); +reg_write( DDR_REG_BASE +0x52a9c*4+0x02000000,0xc740); +reg_write( DDR_REG_BASE +0x52a9d*4+0x02000000,0xf821); +reg_write( DDR_REG_BASE +0x52a9e*4+0x02000000,0xfae); +reg_write( DDR_REG_BASE +0x52a9f*4+0x02000000,0xfd8f); +reg_write( DDR_REG_BASE +0x52aa0*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52aa1*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x52aa2*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE +0x52aa3*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE +0x52aa4*4+0x02000000,0xc743); +reg_write( DDR_REG_BASE +0x52aa5*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE +0x52aa6*4+0x02000000,0xc741); +reg_write( DDR_REG_BASE +0x52aa7*4+0x02000000,0xf9e); +reg_write( DDR_REG_BASE +0x52aa8*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52aa9*4+0x02000000,0xc740); +reg_write( DDR_REG_BASE +0x52aaa*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE +0x52aab*4+0x02000000,0x232f); +reg_write( DDR_REG_BASE +0x52aac*4+0x02000000,0x6c7); +reg_write( DDR_REG_BASE +0x52aad*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52aae*4+0x02000000,0xd90c); +reg_write( DDR_REG_BASE +0x52aaf*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE +0x52ab0*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE +0x52ab1*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE +0x52ab2*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE +0x52ab3*4+0x02000000,0xf86); +reg_write( DDR_REG_BASE +0x52ab4*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52ab5*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE +0x52ab6*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x52ab7*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52ab8*4+0x02000000,0xb98f); +reg_write( DDR_REG_BASE +0x52ab9*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE +0x52aba*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE +0x52abb*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE +0x52abc*4+0x02000000,0x30c1); +reg_write( DDR_REG_BASE +0x52abd*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE +0x52abe*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE +0x52abf*4+0x02000000,0xf6e); +reg_write( DDR_REG_BASE +0x52ac0*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52ac1*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE +0x52ac2*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52ac3*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x52ac4*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE +0x52ac5*4+0x02000000,0xdb10); +reg_write( DDR_REG_BASE +0x52ac6*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE +0x52ac7*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE +0x52ac8*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE +0x52ac9*4+0x02000000,0xf5a); +reg_write( DDR_REG_BASE +0x52aca*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52acb*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE +0x52acc*4+0x02000000,0x8f2); +reg_write( DDR_REG_BASE +0x52acd*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE +0x52ace*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52acf*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52ad0*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE +0x52ad1*4+0x02000000,0x764c); +reg_write( DDR_REG_BASE +0x52ad2*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE +0x52ad3*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE +0x52ad4*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE +0x52ad5*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE +0x52ad6*4+0x02000000,0xf3e); +reg_write( DDR_REG_BASE +0x52ad7*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52ad8*4+0x02000000,0x1c00); +reg_write( DDR_REG_BASE +0x52ad9*4+0x02000000,0x3041); +reg_write( DDR_REG_BASE +0x52ada*4+0x02000000,0xc0a4); +reg_write( DDR_REG_BASE +0x52adb*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE +0x52adc*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE +0x52add*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE +0x52ade*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52adf*4+0x02000000,0xd90c); +reg_write( DDR_REG_BASE +0x52ae0*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE +0x52ae1*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE +0x52ae2*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE +0x52ae3*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x52ae4*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE +0x52ae5*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE +0x52ae6*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE +0x52ae7*4+0x02000000,0xc1aa); +reg_write( DDR_REG_BASE +0x52ae8*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE +0x52ae9*4+0x02000000,0xc00f); +reg_write( DDR_REG_BASE +0x52aea*4+0x02000000,0xc147); +reg_write( DDR_REG_BASE +0x52aeb*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x52aec*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x52aed*4+0x02000000,0x600); +reg_write( DDR_REG_BASE +0x52aee*4+0x02000000,0x7906); +reg_write( DDR_REG_BASE +0x52aef*4+0x02000000,0xc348); +reg_write( DDR_REG_BASE +0x52af0*4+0x02000000,0xc246); +reg_write( DDR_REG_BASE +0x52af1*4+0x02000000,0xc049); +reg_write( DDR_REG_BASE +0x52af2*4+0x02000000,0xe983); +reg_write( DDR_REG_BASE +0x52af3*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x52af4*4+0x02000000,0xf002); +reg_write( DDR_REG_BASE +0x52af5*4+0x02000000,0xd840); +reg_write( DDR_REG_BASE +0x52af6*4+0x02000000,0xe26); +reg_write( DDR_REG_BASE +0x52af7*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52af8*4+0x02000000,0xd9ff); +reg_write( DDR_REG_BASE +0x52af9*4+0x02000000,0x70ed); +reg_write( DDR_REG_BASE +0x52afa*4+0x02000000,0x43f9); +reg_write( DDR_REG_BASE +0x52afb*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE +0x52afc*4+0x02000000,0xf03e); +reg_write( DDR_REG_BASE +0x52afd*4+0x02000000,0x2332); +reg_write( DDR_REG_BASE +0x52afe*4+0x02000000,0x3f8e); +reg_write( DDR_REG_BASE +0x52aff*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x52b00*4+0x02000000,0x680); +reg_write( DDR_REG_BASE +0x52b01*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x52b02*4+0x02000000,0xa96); +reg_write( DDR_REG_BASE +0x52b03*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE +0x52b04*4+0x02000000,0x42c1); +reg_write( DDR_REG_BASE +0x52b05*4+0x02000000,0xc209); +reg_write( DDR_REG_BASE +0x52b06*4+0x02000000,0x7944); +reg_write( DDR_REG_BASE +0x52b07*4+0x02000000,0xc208); +reg_write( DDR_REG_BASE +0x52b08*4+0x02000000,0x7844); +reg_write( DDR_REG_BASE +0x52b09*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x52b0a*4+0x02000000,0x807e); +reg_write( DDR_REG_BASE +0x52b0b*4+0x02000000,0xf42f); +reg_write( DDR_REG_BASE +0x52b0c*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE +0x52b0d*4+0x02000000,0x60c8); +reg_write( DDR_REG_BASE +0x52b0e*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE +0x52b0f*4+0x02000000,0x2342); +reg_write( DDR_REG_BASE +0x52b10*4+0x02000000,0x3180); +reg_write( DDR_REG_BASE +0x52b11*4+0x02000000,0x83b); +reg_write( DDR_REG_BASE +0x52b12*4+0x02000000,0xf5); +reg_write( DDR_REG_BASE +0x52b13*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x52b14*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE +0x52b15*4+0x02000000,0x734c); +reg_write( DDR_REG_BASE +0x52b16*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE +0x52b17*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52b18*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE +0x52b19*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE +0x52b1a*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE +0x52b1b*4+0x02000000,0x836); +reg_write( DDR_REG_BASE +0x52b1c*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE +0x52b1d*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE +0x52b1e*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE +0x52b1f*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x52b20*4+0x02000000,0x734c); +reg_write( DDR_REG_BASE +0x52b21*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE +0x52b22*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE +0x52b23*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE +0x52b24*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE +0x52b25*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE +0x52b26*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52b27*4+0x02000000,0x81e); +reg_write( DDR_REG_BASE +0x52b28*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE +0x52b29*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE +0x52b2a*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE +0x52b2b*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE +0x52b2c*4+0x02000000,0xf004); +reg_write( DDR_REG_BASE +0x52b2d*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE +0x52b2e*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE +0x52b2f*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE +0x52b30*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE +0x52b31*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x52b32*4+0x02000000,0x734c); +reg_write( DDR_REG_BASE +0x52b33*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE +0x52b34*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52b35*4+0x02000000,0xdb18); +reg_write( DDR_REG_BASE +0x52b36*4+0x02000000,0xffe); +reg_write( DDR_REG_BASE +0x52b37*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52b38*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE +0x52b39*4+0x02000000,0x7167); +reg_write( DDR_REG_BASE +0x52b3a*4+0x02000000,0xb87); +reg_write( DDR_REG_BASE +0x52b3b*4+0x02000000,0xb274); +reg_write( DDR_REG_BASE +0x52b3c*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE +0x52b3d*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE +0x52b3e*4+0x02000000,0xe80e); +reg_write( DDR_REG_BASE +0x52b3f*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE +0x52b40*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x52b41*4+0x02000000,0x734c); +reg_write( DDR_REG_BASE +0x52b42*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE +0x52b43*4+0x02000000,0xd856); +reg_write( DDR_REG_BASE +0x52b44*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE +0x52b45*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52b46*4+0x02000000,0xdb18); +reg_write( DDR_REG_BASE +0x52b47*4+0x02000000,0xc743); +reg_write( DDR_REG_BASE +0x52b48*4+0x02000000,0xe5a); +reg_write( DDR_REG_BASE +0x52b49*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52b4a*4+0x02000000,0x1c04); +reg_write( DDR_REG_BASE +0x52b4b*4+0x02000000,0x3281); +reg_write( DDR_REG_BASE +0x52b4c*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52b4d*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x52b4e*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE +0x52b4f*4+0x02000000,0xdb41); +reg_write( DDR_REG_BASE +0x52b50*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE +0x52b51*4+0x02000000,0x3401); +reg_write( DDR_REG_BASE +0x52b52*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE +0x52b53*4+0x02000000,0xc741); +reg_write( DDR_REG_BASE +0x52b54*4+0x02000000,0xe42); +reg_write( DDR_REG_BASE +0x52b55*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52b56*4+0x02000000,0xc740); +reg_write( DDR_REG_BASE +0x52b57*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52b58*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE +0x52b59*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE +0x52b5a*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE +0x52b5b*4+0x02000000,0xc743); +reg_write( DDR_REG_BASE +0x52b5c*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE +0x52b5d*4+0x02000000,0xc741); +reg_write( DDR_REG_BASE +0x52b5e*4+0x02000000,0xe2e); +reg_write( DDR_REG_BASE +0x52b5f*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52b60*4+0x02000000,0xc740); +reg_write( DDR_REG_BASE +0x52b61*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x52b62*4+0x02000000,0xde6); +reg_write( DDR_REG_BASE +0x52b63*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52b64*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x52b65*4+0x02000000,0xc0aa); +reg_write( DDR_REG_BASE +0x52b66*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE +0x52b67*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE +0x52b68*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE +0x52b69*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x52b6a*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE +0x52b6b*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE +0x52b6c*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE +0x52b6d*4+0x02000000,0xc1a5); +reg_write( DDR_REG_BASE +0x52b6e*4+0x02000000,0x4608); +reg_write( DDR_REG_BASE +0x52b6f*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x52b70*4+0x02000000,0xd32); +reg_write( DDR_REG_BASE +0x52b71*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52b72*4+0x02000000,0xd9ff); +reg_write( DDR_REG_BASE +0x52b73*4+0x02000000,0x47cb); +reg_write( DDR_REG_BASE +0x52b74*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE +0x52b75*4+0x02000000,0x1e0); +reg_write( DDR_REG_BASE +0x52b76*4+0x02000000,0x9700); +reg_write( DDR_REG_BASE +0x52b77*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE +0x52b78*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x52b79*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x52b7a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x52b7b*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE +0x52b7c*4+0x02000000,0xb886); +reg_write( DDR_REG_BASE +0x52b7d*4+0x02000000,0xb700); +reg_write( DDR_REG_BASE +0x52b7e*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52b7f*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE +0x52b80*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE +0x52b81*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE +0x52b82*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE +0x52b83*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE +0x52b84*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE +0x52b85*4+0x02000000,0xde2); +reg_write( DDR_REG_BASE +0x52b86*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52b87*4+0x02000000,0x4338); +reg_write( DDR_REG_BASE +0x52b88*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52b89*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x52b8a*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE +0x52b8b*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE +0x52b8c*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE +0x52b8d*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE +0x52b8e*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE +0x52b8f*4+0x02000000,0xdce); +reg_write( DDR_REG_BASE +0x52b90*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52b91*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE +0x52b92*4+0x02000000,0x2355); +reg_write( DDR_REG_BASE +0x52b93*4+0x02000000,0x3801); +reg_write( DDR_REG_BASE +0x52b94*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52b95*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE +0x52b96*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE +0x52b97*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE +0x52b98*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE +0x52b99*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE +0x52b9a*4+0x02000000,0xdb6); +reg_write( DDR_REG_BASE +0x52b9b*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52b9c*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE +0x52b9d*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x52b9e*4+0x02000000,0xd6e); +reg_write( DDR_REG_BASE +0x52b9f*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52ba0*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x52ba1*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE +0x52ba2*4+0x02000000,0xb700); +reg_write( DDR_REG_BASE +0x52ba3*4+0x02000000,0xc0a5); +reg_write( DDR_REG_BASE +0x52ba4*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE +0x52ba5*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE +0x52ba6*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE +0x52ba7*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x52ba8*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE +0x52ba9*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE +0x52baa*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE +0x52bab*4+0x02000000,0xc1a4); +reg_write( DDR_REG_BASE +0x52bac*4+0x02000000,0x4608); +reg_write( DDR_REG_BASE +0x52bad*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x52bae*4+0x02000000,0xcb6); +reg_write( DDR_REG_BASE +0x52baf*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52bb0*4+0x02000000,0xd9ff); +reg_write( DDR_REG_BASE +0x52bb1*4+0x02000000,0x47cb); +reg_write( DDR_REG_BASE +0x52bb2*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE +0x52bb3*4+0x02000000,0x1e0); +reg_write( DDR_REG_BASE +0x52bb4*4+0x02000000,0x1700); +reg_write( DDR_REG_BASE +0x52bb5*4+0x02000000,0x111b); +reg_write( DDR_REG_BASE +0x52bb6*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x52bb7*4+0x02000000,0xda0c); +reg_write( DDR_REG_BASE +0x52bb8*4+0x02000000,0x234f); +reg_write( DDR_REG_BASE +0x52bb9*4+0x02000000,0x3180); +reg_write( DDR_REG_BASE +0x52bba*4+0x02000000,0xb700); +reg_write( DDR_REG_BASE +0x52bbb*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE +0x52bbc*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE +0x52bbd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x52bbe*4+0x02000000,0x3ffc); +reg_write( DDR_REG_BASE +0x52bbf*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52bc0*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE +0x52bc1*4+0x02000000,0x4528); +reg_write( DDR_REG_BASE +0x52bc2*4+0x02000000,0xc143); +reg_write( DDR_REG_BASE +0x52bc3*4+0x02000000,0xc141); +reg_write( DDR_REG_BASE +0x52bc4*4+0x02000000,0xd62); +reg_write( DDR_REG_BASE +0x52bc5*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52bc6*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE +0x52bc7*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52bc8*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE +0x52bc9*4+0x02000000,0xda0c); +reg_write( DDR_REG_BASE +0x52bca*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE +0x52bcb*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE +0x52bcc*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE +0x52bcd*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE +0x52bce*4+0x02000000,0xd4e); +reg_write( DDR_REG_BASE +0x52bcf*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52bd0*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE +0x52bd1*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x52bd2*4+0x02000000,0xd06); +reg_write( DDR_REG_BASE +0x52bd3*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52bd4*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x52bd5*4+0x02000000,0x1f00); +reg_write( DDR_REG_BASE +0x52bd6*4+0x02000000,0x16c4); +reg_write( DDR_REG_BASE +0x52bd7*4+0x02000000,0xc0a4); +reg_write( DDR_REG_BASE +0x52bd8*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE +0x52bd9*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE +0x52bda*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE +0x52bdb*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x52bdc*4+0x02000000,0xc2e2); +reg_write( DDR_REG_BASE +0x52bdd*4+0x02000000,0xc1a4); +reg_write( DDR_REG_BASE +0x52bde*4+0x02000000,0x4508); +reg_write( DDR_REG_BASE +0x52bdf*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x52be0*4+0x02000000,0xc52); +reg_write( DDR_REG_BASE +0x52be1*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52be2*4+0x02000000,0xd9ff); +reg_write( DDR_REG_BASE +0x52be3*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x52be4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x52be5*4+0x02000000,0xaff); +reg_write( DDR_REG_BASE +0x52be6*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE +0x52be7*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52be8*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE +0x52be9*4+0x02000000,0xda0c); +reg_write( DDR_REG_BASE +0x52bea*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE +0x52beb*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE +0x52bec*4+0x02000000,0x3001); +reg_write( DDR_REG_BASE +0x52bed*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE +0x52bee*4+0x02000000,0xd0e); +reg_write( DDR_REG_BASE +0x52bef*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52bf0*4+0x02000000,0x1c04); +reg_write( DDR_REG_BASE +0x52bf1*4+0x02000000,0x3001); +reg_write( DDR_REG_BASE +0x52bf2*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x52bf3*4+0x02000000,0xcc6); +reg_write( DDR_REG_BASE +0x52bf4*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52bf5*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x52bf6*4+0x02000000,0xc0a4); +reg_write( DDR_REG_BASE +0x52bf7*4+0x02000000,0xc6c2); +reg_write( DDR_REG_BASE +0x52bf8*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE +0x52bf9*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE +0x52bfa*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE +0x52bfb*4+0x02000000,0xc1a8); +reg_write( DDR_REG_BASE +0x52bfc*4+0x02000000,0xc144); +reg_write( DDR_REG_BASE +0x52bfd*4+0x02000000,0xd949); +reg_write( DDR_REG_BASE +0x52bfe*4+0x02000000,0xb99f); +reg_write( DDR_REG_BASE +0x52bff*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE +0x52c00*4+0x02000000,0x8900); +reg_write( DDR_REG_BASE +0x52c01*4+0x02000000,0x11da); +reg_write( DDR_REG_BASE +0x52c02*4+0x02000000,0x808f); +reg_write( DDR_REG_BASE +0x52c03*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE +0x52c04*4+0x02000000,0xc046); +reg_write( DDR_REG_BASE +0x52c05*4+0x02000000,0xc00d); +reg_write( DDR_REG_BASE +0x52c06*4+0x02000000,0x71cd); +reg_write( DDR_REG_BASE +0x52c07*4+0x02000000,0xc342); +reg_write( DDR_REG_BASE +0x52c08*4+0x02000000,0xc243); +reg_write( DDR_REG_BASE +0x52c09*4+0x02000000,0xc047); +reg_write( DDR_REG_BASE +0x52c0a*4+0x02000000,0xf033); +reg_write( DDR_REG_BASE +0x52c0b*4+0x02000000,0x2544); +reg_write( DDR_REG_BASE +0x52c0c*4+0x02000000,0x17c1); +reg_write( DDR_REG_BASE +0x52c0d*4+0x02000000,0x706f); +reg_write( DDR_REG_BASE +0x52c0e*4+0x02000000,0xe905); +reg_write( DDR_REG_BASE +0x52c0f*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE +0x52c10*4+0x02000000,0x9ff); +reg_write( DDR_REG_BASE +0x52c11*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE +0x52c12*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE +0x52c13*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE +0x52c14*4+0x02000000,0xf026); +reg_write( DDR_REG_BASE +0x52c15*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE +0x52c16*4+0x02000000,0xc201); +reg_write( DDR_REG_BASE +0x52c17*4+0x02000000,0xc107); +reg_write( DDR_REG_BASE +0x52c18*4+0x02000000,0x7077); +reg_write( DDR_REG_BASE +0x52c19*4+0x02000000,0x20ca); +reg_write( DDR_REG_BASE +0x52c1a*4+0x02000000,0x3c1); +reg_write( DDR_REG_BASE +0x52c1b*4+0x02000000,0x7944); +reg_write( DDR_REG_BASE +0x52c1c*4+0x02000000,0x790b); +reg_write( DDR_REG_BASE +0x52c1d*4+0x02000000,0xf21d); +reg_write( DDR_REG_BASE +0x52c1e*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE +0x52c1f*4+0x02000000,0x2344); +reg_write( DDR_REG_BASE +0x52c20*4+0x02000000,0x37c1); +reg_write( DDR_REG_BASE +0x52c21*4+0x02000000,0xe906); +reg_write( DDR_REG_BASE +0x52c22*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE +0x52c23*4+0x02000000,0x901); +reg_write( DDR_REG_BASE +0x52c24*4+0x02000000,0x31); +reg_write( DDR_REG_BASE +0x52c25*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE +0x52c26*4+0x02000000,0xbce); +reg_write( DDR_REG_BASE +0x52c27*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE +0x52c28*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE +0x52c29*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE +0x52c2a*4+0x02000000,0xc105); +reg_write( DDR_REG_BASE +0x52c2b*4+0x02000000,0xc204); +reg_write( DDR_REG_BASE +0x52c2c*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE +0x52c2d*4+0x02000000,0x4063); +reg_write( DDR_REG_BASE +0x52c2e*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE +0x52c2f*4+0x02000000,0x901); +reg_write( DDR_REG_BASE +0x52c30*4+0x02000000,0xc303); +reg_write( DDR_REG_BASE +0x52c31*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x52c32*4+0x02000000,0x255a); +reg_write( DDR_REG_BASE +0x52c33*4+0x02000000,0x1c80); +reg_write( DDR_REG_BASE +0x52c34*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x52c35*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE +0x52c36*4+0x02000000,0xd5e); +reg_write( DDR_REG_BASE +0x52c37*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE +0x52c38*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE +0x52c39*4+0x02000000,0x7167); +reg_write( DDR_REG_BASE +0x52c3a*4+0x02000000,0xbb7); +reg_write( DDR_REG_BASE +0x52c3b*4+0x02000000,0xb094); +reg_write( DDR_REG_BASE +0x52c3c*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE +0x52c3d*4+0x02000000,0xd9f); +reg_write( DDR_REG_BASE +0x52c3e*4+0x02000000,0x90b4); +reg_write( DDR_REG_BASE +0x52c3f*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE +0x52c40*4+0x02000000,0xb9a); +reg_write( DDR_REG_BASE +0x52c41*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE +0x52c42*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE +0x52c43*4+0x02000000,0xc0a8); +reg_write( DDR_REG_BASE +0x52c44*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE +0x52c45*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE +0x52c46*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE +0x52c47*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x52c48*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE +0x52c49*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE +0x52c4a*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE +0x52c4b*4+0x02000000,0xc1a4); +reg_write( DDR_REG_BASE +0x52c4c*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE +0x52c4d*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x52c4e*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x52c4f*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE +0x52c50*4+0x02000000,0x8800); +reg_write( DDR_REG_BASE +0x52c51*4+0x02000000,0x4378); +reg_write( DDR_REG_BASE +0x52c52*4+0x02000000,0x4748); +reg_write( DDR_REG_BASE +0x52c53*4+0x02000000,0xc143); +reg_write( DDR_REG_BASE +0x52c54*4+0x02000000,0xe806); +reg_write( DDR_REG_BASE +0x52c55*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x52c56*4+0x02000000,0x708e); +reg_write( DDR_REG_BASE +0x52c57*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x52c58*4+0x02000000,0x49); +reg_write( DDR_REG_BASE +0x52c59*4+0x02000000,0xf006); +reg_write( DDR_REG_BASE +0x52c5a*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x52c5b*4+0x02000000,0x708e); +reg_write( DDR_REG_BASE +0x52c5c*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x52c5d*4+0x02000000,0x23); +reg_write( DDR_REG_BASE +0x52c5e*4+0x02000000,0xc009); +reg_write( DDR_REG_BASE +0x52c5f*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE +0x52c60*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE +0x52c61*4+0x02000000,0xf01d); +reg_write( DDR_REG_BASE +0x52c62*4+0x02000000,0xe35); +reg_write( DDR_REG_BASE +0x52c63*4+0x02000000,0x136e); +reg_write( DDR_REG_BASE +0x52c64*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE +0x52c65*4+0x02000000,0x4200); +reg_write( DDR_REG_BASE +0x52c66*4+0x02000000,0x2544); +reg_write( DDR_REG_BASE +0x52c67*4+0x02000000,0x17c0); +reg_write( DDR_REG_BASE +0x52c68*4+0x02000000,0xe805); +reg_write( DDR_REG_BASE +0x52c69*4+0x02000000,0xb861); +reg_write( DDR_REG_BASE +0x52c6a*4+0x02000000,0x8ff); +reg_write( DDR_REG_BASE +0x52c6b*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE +0x52c6c*4+0x02000000,0x7a5b); +reg_write( DDR_REG_BASE +0x52c6d*4+0x02000000,0xc103); +reg_write( DDR_REG_BASE +0x52c6e*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE +0x52c6f*4+0x02000000,0x4363); +reg_write( DDR_REG_BASE +0x52c70*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE +0x52c71*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE +0x52c72*4+0x02000000,0x209f); +reg_write( DDR_REG_BASE +0x52c73*4+0x02000000,0x901); +reg_write( DDR_REG_BASE +0x52c74*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x52c75*4+0x02000000,0x255a); +reg_write( DDR_REG_BASE +0x52c76*4+0x02000000,0x1c80); +reg_write( DDR_REG_BASE +0x52c77*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x52c78*4+0x02000000,0x784f); +reg_write( DDR_REG_BASE +0x52c79*4+0x02000000,0xcda); +reg_write( DDR_REG_BASE +0x52c7a*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE +0x52c7b*4+0x02000000,0x42e1); +reg_write( DDR_REG_BASE +0x52c7c*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE +0x52c7d*4+0x02000000,0xdcd); +reg_write( DDR_REG_BASE +0x52c7e*4+0x02000000,0x9094); +reg_write( DDR_REG_BASE +0x52c7f*4+0x02000000,0xc0a4); +reg_write( DDR_REG_BASE +0x52c80*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE +0x52c81*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE +0x52c82*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE +0x52c83*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x52c84*4+0x02000000,0xc2e4); +reg_write( DDR_REG_BASE +0x52c85*4+0x02000000,0xc1a4); +reg_write( DDR_REG_BASE +0x52c86*4+0x02000000,0x4508); +reg_write( DDR_REG_BASE +0x52c87*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x52c88*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE +0x52c89*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x52c8a*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x52c8b*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE +0x52c8c*4+0x02000000,0xf83); +reg_write( DDR_REG_BASE +0x52c8d*4+0x02000000,0x20); +reg_write( DDR_REG_BASE +0x52c8e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x52c8f*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x52c90*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE +0x52c91*4+0x02000000,0x100); +reg_write( DDR_REG_BASE +0x52c92*4+0x02000000,0x2305); +reg_write( DDR_REG_BASE +0x52c93*4+0x02000000,0xc); +reg_write( DDR_REG_BASE +0x52c94*4+0x02000000,0x7204); +reg_write( DDR_REG_BASE +0x52c95*4+0x02000000,0x7865); +reg_write( DDR_REG_BASE +0x52c96*4+0x02000000,0xb420); +reg_write( DDR_REG_BASE +0x52c97*4+0x02000000,0xb040); +reg_write( DDR_REG_BASE +0x52c98*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x52c99*4+0x02000000,0xae2); +reg_write( DDR_REG_BASE +0x52c9a*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52c9b*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x52c9c*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x52c9d*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52c9e*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE +0x52c9f*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE +0x52ca0*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE +0x52ca1*4+0x02000000,0x30c1); +reg_write( DDR_REG_BASE +0x52ca2*4+0x02000000,0x4628); +reg_write( DDR_REG_BASE +0x52ca3*4+0x02000000,0xc142); +reg_write( DDR_REG_BASE +0x52ca4*4+0x02000000,0xc141); +reg_write( DDR_REG_BASE +0x52ca5*4+0x02000000,0xba2); +reg_write( DDR_REG_BASE +0x52ca6*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52ca7*4+0x02000000,0xc140); +reg_write( DDR_REG_BASE +0x52ca8*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x52ca9*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52caa*4+0x02000000,0xb98d); +reg_write( DDR_REG_BASE +0x52cab*4+0x02000000,0x734c); +reg_write( DDR_REG_BASE +0x52cac*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE +0x52cad*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE +0x52cae*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE +0x52caf*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE +0x52cb0*4+0x02000000,0xb8a); +reg_write( DDR_REG_BASE +0x52cb1*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52cb2*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE +0x52cb3*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52cb4*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE +0x52cb5*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE +0x52cb6*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE +0x52cb7*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE +0x52cb8*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE +0x52cb9*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE +0x52cba*4+0x02000000,0xb76); +reg_write( DDR_REG_BASE +0x52cbb*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52cbc*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE +0x52cbd*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x52cbe*4+0x02000000,0xb2e); +reg_write( DDR_REG_BASE +0x52cbf*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52cc0*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x52cc1*4+0x02000000,0xc0a4); +reg_write( DDR_REG_BASE +0x52cc2*4+0x02000000,0xc6c4); +reg_write( DDR_REG_BASE +0x52cc3*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x52cc4*4+0x02000000,0xc2e2); +reg_write( DDR_REG_BASE +0x52cc5*4+0x02000000,0x260a); +reg_write( DDR_REG_BASE +0x52cc6*4+0x02000000,0x3040); +reg_write( DDR_REG_BASE +0x52cc7*4+0x02000000,0x4308); +reg_write( DDR_REG_BASE +0x52cc8*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE +0x52cc9*4+0x02000000,0xf024); +reg_write( DDR_REG_BASE +0x52cca*4+0x02000000,0x255a); +reg_write( DDR_REG_BASE +0x52ccb*4+0x02000000,0x1182); +reg_write( DDR_REG_BASE +0x52ccc*4+0x02000000,0x7261); +reg_write( DDR_REG_BASE +0x52ccd*4+0x02000000,0x8a01); +reg_write( DDR_REG_BASE +0x52cce*4+0x02000000,0x8a60); +reg_write( DDR_REG_BASE +0x52ccf*4+0x02000000,0x8a22); +reg_write( DDR_REG_BASE +0x52cd0*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE +0x52cd1*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x52cd2*4+0x02000000,0x7b05); +reg_write( DDR_REG_BASE +0x52cd3*4+0x02000000,0x8a03); +reg_write( DDR_REG_BASE +0x52cd4*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE +0x52cd5*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x52cd6*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE +0x52cd7*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE +0x52cd8*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x52cd9*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x52cda*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x52cdb*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x52cdc*4+0x02000000,0xc1); +reg_write( DDR_REG_BASE +0x52cdd*4+0x02000000,0x8a05); +reg_write( DDR_REG_BASE +0x52cde*4+0x02000000,0x8a64); +reg_write( DDR_REG_BASE +0x52cdf*4+0x02000000,0x7734); +reg_write( DDR_REG_BASE +0x52ce0*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE +0x52ce1*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x52ce2*4+0x02000000,0x7865); +reg_write( DDR_REG_BASE +0x52ce3*4+0x02000000,0xf207); +reg_write( DDR_REG_BASE +0x52ce4*4+0x02000000,0x793b); +reg_write( DDR_REG_BASE +0x52ce5*4+0x02000000,0xb99c); +reg_write( DDR_REG_BASE +0x52ce6*4+0x02000000,0xb99f); +reg_write( DDR_REG_BASE +0x52ce7*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE +0x52ce8*4+0x02000000,0xf003); +reg_write( DDR_REG_BASE +0x52ce9*4+0x02000000,0xc92); +reg_write( DDR_REG_BASE +0x52cea*4+0x02000000,0xfe4f); +reg_write( DDR_REG_BASE +0x52ceb*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE +0x52cec*4+0x02000000,0x2e45); +reg_write( DDR_REG_BASE +0x52ced*4+0x02000000,0x3180); +reg_write( DDR_REG_BASE +0x52cee*4+0x02000000,0xdb9); +reg_write( DDR_REG_BASE +0x52cef*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE +0x52cf0*4+0x02000000,0xc6c2); +reg_write( DDR_REG_BASE +0x52cf1*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x52cf2*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE +0x52cf3*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE +0x52cf4*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE +0x52cf5*4+0x02000000,0xc1a1); +reg_write( DDR_REG_BASE +0x52cf6*4+0x02000000,0x4718); +reg_write( DDR_REG_BASE +0x52cf7*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x52cf8*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x52cf9*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE +0x52cfa*4+0x02000000,0x88c0); +reg_write( DDR_REG_BASE +0x52cfb*4+0x02000000,0x4338); +reg_write( DDR_REG_BASE +0x52cfc*4+0x02000000,0xc340); +reg_write( DDR_REG_BASE +0x52cfd*4+0x02000000,0xea04); +reg_write( DDR_REG_BASE +0x52cfe*4+0x02000000,0x79db); +reg_write( DDR_REG_BASE +0x52cff*4+0x02000000,0xf004); +reg_write( DDR_REG_BASE +0x52d00*4+0x02000000,0x265f); +reg_write( DDR_REG_BASE +0x52d01*4+0x02000000,0x1241); +reg_write( DDR_REG_BASE +0x52d02*4+0x02000000,0x1001); +reg_write( DDR_REG_BASE +0x52d03*4+0x02000000,0x9e); +reg_write( DDR_REG_BASE +0x52d04*4+0x02000000,0x7054); +reg_write( DDR_REG_BASE +0x52d05*4+0x02000000,0xdd08); +reg_write( DDR_REG_BASE +0x52d06*4+0x02000000,0x25ca); +reg_write( DDR_REG_BASE +0x52d07*4+0x02000000,0x1062); +reg_write( DDR_REG_BASE +0x52d08*4+0x02000000,0xf039); +reg_write( DDR_REG_BASE +0x52d09*4+0x02000000,0x40e1); +reg_write( DDR_REG_BASE +0x52d0a*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE +0x52d0b*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x52d0c*4+0x02000000,0xc300); +reg_write( DDR_REG_BASE +0x52d0d*4+0x02000000,0x23f5); +reg_write( DDR_REG_BASE +0x52d0e*4+0x02000000,0x3042); +reg_write( DDR_REG_BASE +0x52d0f*4+0x02000000,0xeb13); +reg_write( DDR_REG_BASE +0x52d10*4+0x02000000,0x7c5c); +reg_write( DDR_REG_BASE +0x52d11*4+0x02000000,0x7c9c); +reg_write( DDR_REG_BASE +0x52d12*4+0x02000000,0x7c9c); +reg_write( DDR_REG_BASE +0x52d13*4+0x02000000,0x7c9c); +reg_write( DDR_REG_BASE +0x52d14*4+0x02000000,0x224a); +reg_write( DDR_REG_BASE +0x52d15*4+0x02000000,0x16c0); +reg_write( DDR_REG_BASE +0x52d16*4+0x02000000,0x2a44); +reg_write( DDR_REG_BASE +0x52d17*4+0x02000000,0x803); +reg_write( DDR_REG_BASE +0x52d18*4+0x02000000,0x2242); +reg_write( DDR_REG_BASE +0x52d19*4+0x02000000,0x104a); +reg_write( DDR_REG_BASE +0x52d1a*4+0x02000000,0xafd); +reg_write( DDR_REG_BASE +0x52d1b*4+0x02000000,0x9031); +reg_write( DDR_REG_BASE +0x52d1c*4+0x02000000,0x7c9d); +reg_write( DDR_REG_BASE +0x52d1d*4+0x02000000,0x629a); +reg_write( DDR_REG_BASE +0x52d1e*4+0x02000000,0xbac4); +reg_write( DDR_REG_BASE +0x52d1f*4+0x02000000,0x4a94); +reg_write( DDR_REG_BASE +0x52d20*4+0x02000000,0xf00d); +reg_write( DDR_REG_BASE +0x52d21*4+0x02000000,0x248a); +reg_write( DDR_REG_BASE +0x52d22*4+0x02000000,0x1fcf); +reg_write( DDR_REG_BASE +0x52d23*4+0x02000000,0x7c44); +reg_write( DDR_REG_BASE +0x52d24*4+0x02000000,0x2204); +reg_write( DDR_REG_BASE +0x52d25*4+0x02000000,0xf83); +reg_write( DDR_REG_BASE +0x52d26*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x52d27*4+0x02000000,0xfc00); +reg_write( DDR_REG_BASE +0x52d28*4+0x02000000,0xda0a); +reg_write( DDR_REG_BASE +0x52d29*4+0x02000000,0xba61); +reg_write( DDR_REG_BASE +0x52d2a*4+0x02000000,0xaff); +reg_write( DDR_REG_BASE +0x52d2b*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE +0x52d2c*4+0x02000000,0x7b7d); +reg_write( DDR_REG_BASE +0x52d2d*4+0x02000000,0x261a); +reg_write( DDR_REG_BASE +0x52d2e*4+0x02000000,0x1f82); +reg_write( DDR_REG_BASE +0x52d2f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x52d30*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE +0x52d31*4+0x02000000,0x239a); +reg_write( DDR_REG_BASE +0x52d32*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x52d33*4+0x02000000,0x71e5); +reg_write( DDR_REG_BASE +0x52d34*4+0x02000000,0x7124); +reg_write( DDR_REG_BASE +0x52d35*4+0x02000000,0x2205); +reg_write( DDR_REG_BASE +0x52d36*4+0x02000000,0x7c2); +reg_write( DDR_REG_BASE +0x52d37*4+0x02000000,0x7845); +reg_write( DDR_REG_BASE +0x52d38*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE +0x52d39*4+0x02000000,0xb891); +reg_write( DDR_REG_BASE +0x52d3a*4+0x02000000,0xb89c); +reg_write( DDR_REG_BASE +0x52d3b*4+0x02000000,0x7b85); +reg_write( DDR_REG_BASE +0x52d3c*4+0x02000000,0xb89f); +reg_write( DDR_REG_BASE +0x52d3d*4+0x02000000,0xb060); +reg_write( DDR_REG_BASE +0x52d3e*4+0x02000000,0xd97); +reg_write( DDR_REG_BASE +0x52d3f*4+0x02000000,0x93c5); +reg_write( DDR_REG_BASE +0x52d40*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE +0x52d41*4+0x02000000,0xefd); +reg_write( DDR_REG_BASE +0x52d42*4+0x02000000,0xb3a5); +reg_write( DDR_REG_BASE +0x52d43*4+0x02000000,0x70ed); +reg_write( DDR_REG_BASE +0x52d44*4+0x02000000,0x7487); +reg_write( DDR_REG_BASE +0x52d45*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE +0x52d46*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE +0x52d47*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE +0x52d48*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE +0x52d49*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE +0x52d4a*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE +0x52d4b*4+0x02000000,0xc1a9); +reg_write( DDR_REG_BASE +0x52d4c*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x52d4d*4+0x02000000,0xd72); +reg_write( DDR_REG_BASE +0x52d4e*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52d4f*4+0x02000000,0x4318); +reg_write( DDR_REG_BASE +0x52d50*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE +0x52d51*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x52d52*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x52d53*4+0x02000000,0x7b2); +reg_write( DDR_REG_BASE +0x52d54*4+0x02000000,0x1003); +reg_write( DDR_REG_BASE +0x52d55*4+0x02000000,0x8b); +reg_write( DDR_REG_BASE +0x52d56*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x52d57*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x52d58*4+0x02000000,0x7b2); +reg_write( DDR_REG_BASE +0x52d59*4+0x02000000,0x88c2); +reg_write( DDR_REG_BASE +0x52d5a*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x52d5b*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE +0x52d5c*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x52d5d*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x52d5e*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE +0x52d5f*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x52d60*4+0x02000000,0x10); +reg_write( DDR_REG_BASE +0x52d61*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x52d62*4+0x02000000,0xc046); +reg_write( DDR_REG_BASE +0x52d63*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x52d64*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE +0x52d65*4+0x02000000,0xf039); +reg_write( DDR_REG_BASE +0x52d66*4+0x02000000,0x708d); +reg_write( DDR_REG_BASE +0x52d67*4+0x02000000,0xf034); +reg_write( DDR_REG_BASE +0x52d68*4+0x02000000,0x271a); +reg_write( DDR_REG_BASE +0x52d69*4+0x02000000,0x1f8d); +reg_write( DDR_REG_BASE +0x52d6a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x52d6b*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE +0x52d6c*4+0x02000000,0x224f); +reg_write( DDR_REG_BASE +0x52d6d*4+0x02000000,0x80); +reg_write( DDR_REG_BASE +0x52d6e*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE +0x52d6f*4+0x02000000,0x82d); +reg_write( DDR_REG_BASE +0x52d70*4+0x02000000,0x111); +reg_write( DDR_REG_BASE +0x52d71*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE +0x52d72*4+0x02000000,0x2055); +reg_write( DDR_REG_BASE +0x52d73*4+0x02000000,0xd01); +reg_write( DDR_REG_BASE +0x52d74*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE +0x52d75*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE +0x52d76*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x52d77*4+0x02000000,0x341); +reg_write( DDR_REG_BASE +0x52d78*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE +0x52d79*4+0x02000000,0x203c); +reg_write( DDR_REG_BASE +0x52d7a*4+0x02000000,0x80); +reg_write( DDR_REG_BASE +0x52d7b*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE +0x52d7c*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x52d7d*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE +0x52d7e*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE +0x52d7f*4+0x02000000,0xb891); +reg_write( DDR_REG_BASE +0x52d80*4+0x02000000,0xb89c); +reg_write( DDR_REG_BASE +0x52d81*4+0x02000000,0xb89f); +reg_write( DDR_REG_BASE +0x52d82*4+0x02000000,0x9080); +reg_write( DDR_REG_BASE +0x52d83*4+0x02000000,0xbcc4); +reg_write( DDR_REG_BASE +0x52d84*4+0x02000000,0x4c38); +reg_write( DDR_REG_BASE +0x52d85*4+0x02000000,0x791b); +reg_write( DDR_REG_BASE +0x52d86*4+0x02000000,0x216c); +reg_write( DDR_REG_BASE +0x52d87*4+0x02000000,0x143); +reg_write( DDR_REG_BASE +0x52d88*4+0x02000000,0xb8c4); +reg_write( DDR_REG_BASE +0x52d89*4+0x02000000,0x7b05); +reg_write( DDR_REG_BASE +0x52d8a*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE +0x52d8b*4+0x02000000,0x2055); +reg_write( DDR_REG_BASE +0x52d8c*4+0x02000000,0xc01); +reg_write( DDR_REG_BASE +0x52d8d*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE +0x52d8e*4+0x02000000,0x7905); +reg_write( DDR_REG_BASE +0x52d8f*4+0x02000000,0x6a01); +reg_write( DDR_REG_BASE +0x52d90*4+0x02000000,0x229a); +reg_write( DDR_REG_BASE +0x52d91*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x52d92*4+0x02000000,0x7a25); +reg_write( DDR_REG_BASE +0x52d93*4+0x02000000,0x7d45); +reg_write( DDR_REG_BASE +0x52d94*4+0x02000000,0x79bb); +reg_write( DDR_REG_BASE +0x52d95*4+0x02000000,0xb991); +reg_write( DDR_REG_BASE +0x52d96*4+0x02000000,0xb99c); +reg_write( DDR_REG_BASE +0x52d97*4+0x02000000,0xb99f); +reg_write( DDR_REG_BASE +0x52d98*4+0x02000000,0xb160); +reg_write( DDR_REG_BASE +0x52d99*4+0x02000000,0x4200); +reg_write( DDR_REG_BASE +0x52d9a*4+0x02000000,0xa9d); +reg_write( DDR_REG_BASE +0x52d9b*4+0x02000000,0x8254); +reg_write( DDR_REG_BASE +0x52d9c*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE +0x52d9d*4+0x02000000,0x7fcf); +reg_write( DDR_REG_BASE +0x52d9e*4+0x02000000,0xb91); +reg_write( DDR_REG_BASE +0x52d9f*4+0x02000000,0x93e5); +reg_write( DDR_REG_BASE +0x52da0*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE +0x52da1*4+0x02000000,0xa92); +reg_write( DDR_REG_BASE +0x52da2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x52da3*4+0x02000000,0xf36); +reg_write( DDR_REG_BASE +0x52da4*4+0x02000000,0xfd8f); +reg_write( DDR_REG_BASE +0x52da5*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x52da6*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x52da7*4+0x02000000,0xe004); +reg_write( DDR_REG_BASE +0x52da8*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x52da9*4+0x02000000,0x47cb); +reg_write( DDR_REG_BASE +0x52daa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x52dab*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE +0x52dac*4+0x02000000,0x71cd); +reg_write( DDR_REG_BASE +0x52dad*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE +0x52dae*4+0x02000000,0xb1f0); +reg_write( DDR_REG_BASE +0x52daf*4+0x02000000,0xb1d6); +reg_write( DDR_REG_BASE +0x52db0*4+0x02000000,0xb1cf); +reg_write( DDR_REG_BASE +0x52db1*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x52db2*4+0x02000000,0x710d); +reg_write( DDR_REG_BASE +0x52db3*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE +0x52db4*4+0x02000000,0x4a); +reg_write( DDR_REG_BASE +0x52db5*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE +0x52db6*4+0x02000000,0x41e1); +reg_write( DDR_REG_BASE +0x52db7*4+0x02000000,0x42e1); +reg_write( DDR_REG_BASE +0x52db8*4+0x02000000,0x43e1); +reg_write( DDR_REG_BASE +0x52db9*4+0x02000000,0xfd2); +reg_write( DDR_REG_BASE +0x52dba*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE +0x52dbb*4+0x02000000,0xc740); +reg_write( DDR_REG_BASE +0x52dbc*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x52dbd*4+0x02000000,0xd9ff); +reg_write( DDR_REG_BASE +0x52dbe*4+0x02000000,0x42c3); +reg_write( DDR_REG_BASE +0x52dbf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x52dc0*4+0x02000000,0xf000); +reg_write( DDR_REG_BASE +0x52dc1*4+0x02000000,0x43e1); +reg_write( DDR_REG_BASE +0x52dc2*4+0x02000000,0xfbe); +reg_write( DDR_REG_BASE +0x52dc3*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE +0x52dc4*4+0x02000000,0xc740); +reg_write( DDR_REG_BASE +0x52dc5*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE +0x52dc6*4+0x02000000,0x2344); +reg_write( DDR_REG_BASE +0x52dc7*4+0x02000000,0x37ca); +reg_write( DDR_REG_BASE +0x52dc8*4+0x02000000,0x43d9); +reg_write( DDR_REG_BASE +0x52dc9*4+0x02000000,0xa13); +reg_write( DDR_REG_BASE +0x52dca*4+0x02000000,0x1010); +reg_write( DDR_REG_BASE +0x52dcb*4+0x02000000,0x2242); +reg_write( DDR_REG_BASE +0x52dcc*4+0x02000000,0x104a); +reg_write( DDR_REG_BASE +0x52dcd*4+0x02000000,0xaff); +reg_write( DDR_REG_BASE +0x52dce*4+0x02000000,0x9031); +reg_write( DDR_REG_BASE +0x52dcf*4+0x02000000,0x232f); +reg_write( DDR_REG_BASE +0x52dd0*4+0x02000000,0x36c0); +reg_write( DDR_REG_BASE +0x52dd1*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE +0x52dd2*4+0x02000000,0x7ca); +reg_write( DDR_REG_BASE +0x52dd3*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE +0x52dd4*4+0x02000000,0xa0f); +reg_write( DDR_REG_BASE +0x52dd5*4+0x02000000,0x1010); +reg_write( DDR_REG_BASE +0x52dd6*4+0x02000000,0x2242); +reg_write( DDR_REG_BASE +0x52dd7*4+0x02000000,0x104a); +reg_write( DDR_REG_BASE +0x52dd8*4+0x02000000,0xafd); +reg_write( DDR_REG_BASE +0x52dd9*4+0x02000000,0x9031); +reg_write( DDR_REG_BASE +0x52dda*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE +0x52ddb*4+0x02000000,0x2004); +reg_write( DDR_REG_BASE +0x52ddc*4+0x02000000,0x8340); +reg_write( DDR_REG_BASE +0x52ddd*4+0x02000000,0xc048); +reg_write( DDR_REG_BASE +0x52dde*4+0x02000000,0xf20a); +reg_write( DDR_REG_BASE +0x52ddf*4+0x02000000,0x740c); +reg_write( DDR_REG_BASE +0x52de0*4+0x02000000,0xd9ff); +reg_write( DDR_REG_BASE +0x52de1*4+0x02000000,0x42c3); +reg_write( DDR_REG_BASE +0x52de2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x52de3*4+0x02000000,0xf000); +reg_write( DDR_REG_BASE +0x52de4*4+0x02000000,0x43e1); +reg_write( DDR_REG_BASE +0x52de5*4+0x02000000,0xf7a); +reg_write( DDR_REG_BASE +0x52de6*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE +0x52de7*4+0x02000000,0xc740); +reg_write( DDR_REG_BASE +0x52de8*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE +0x52de9*4+0x02000000,0xbee); +reg_write( DDR_REG_BASE +0x52dea*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52deb*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE +0x52dec*4+0x02000000,0xea2); +reg_write( DDR_REG_BASE +0x52ded*4+0x02000000,0xfdcf); +reg_write( DDR_REG_BASE +0x52dee*4+0x02000000,0xc047); +reg_write( DDR_REG_BASE +0x52def*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x52df0*4+0x02000000,0x832); +reg_write( DDR_REG_BASE +0x52df1*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52df2*4+0x02000000,0xd91f); +reg_write( DDR_REG_BASE +0x52df3*4+0x02000000,0xca00); +reg_write( DDR_REG_BASE +0x52df4*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE +0x52df5*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x52df6*4+0x02000000,0x7604); +reg_write( DDR_REG_BASE +0x52df7*4+0x02000000,0xbd8e); +reg_write( DDR_REG_BASE +0x52df8*4+0x02000000,0xc143); +reg_write( DDR_REG_BASE +0x52df9*4+0x02000000,0x272f); +reg_write( DDR_REG_BASE +0x52dfa*4+0x02000000,0x16c7); +reg_write( DDR_REG_BASE +0x52dfb*4+0x02000000,0xc141); +reg_write( DDR_REG_BASE +0x52dfc*4+0x02000000,0xc140); +reg_write( DDR_REG_BASE +0x52dfd*4+0x02000000,0x7b0f); +reg_write( DDR_REG_BASE +0x52dfe*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52dff*4+0x02000000,0x41a1); +reg_write( DDR_REG_BASE +0x52e00*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE +0x52e01*4+0x02000000,0x8ea); +reg_write( DDR_REG_BASE +0x52e02*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52e03*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE +0x52e04*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x52e05*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE +0x52e06*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE +0x52e07*4+0x02000000,0x254f); +reg_write( DDR_REG_BASE +0x52e08*4+0x02000000,0x1281); +reg_write( DDR_REG_BASE +0x52e09*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52e0a*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE +0x52e0b*4+0x02000000,0xdb7c); +reg_write( DDR_REG_BASE +0x52e0c*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE +0x52e0d*4+0x02000000,0x8d2); +reg_write( DDR_REG_BASE +0x52e0e*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52e0f*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE +0x52e10*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE +0x52e11*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE +0x52e12*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x52e13*4+0x02000000,0x4400); +reg_write( DDR_REG_BASE +0x52e14*4+0x02000000,0xf031); +reg_write( DDR_REG_BASE +0x52e15*4+0x02000000,0x41c1); +reg_write( DDR_REG_BASE +0x52e16*4+0x02000000,0x724c); +reg_write( DDR_REG_BASE +0x52e17*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE +0x52e18*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE +0x52e19*4+0x02000000,0x30c1); +reg_write( DDR_REG_BASE +0x52e1a*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE +0x52e1b*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE +0x52e1c*4+0x02000000,0x8b2); +reg_write( DDR_REG_BASE +0x52e1d*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52e1e*4+0x02000000,0x1c00); +reg_write( DDR_REG_BASE +0x52e1f*4+0x02000000,0x3201); +reg_write( DDR_REG_BASE +0x52e20*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52e21*4+0x02000000,0x41c1); +reg_write( DDR_REG_BASE +0x52e22*4+0x02000000,0x724c); +reg_write( DDR_REG_BASE +0x52e23*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE +0x52e24*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE +0x52e25*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE +0x52e26*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE +0x52e27*4+0x02000000,0x89e); +reg_write( DDR_REG_BASE +0x52e28*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52e29*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE +0x52e2a*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x52e2b*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52e2c*4+0x02000000,0xb990); +reg_write( DDR_REG_BASE +0x52e2d*4+0x02000000,0x724c); +reg_write( DDR_REG_BASE +0x52e2e*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE +0x52e2f*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE +0x52e30*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE +0x52e31*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE +0x52e32*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE +0x52e33*4+0x02000000,0x886); +reg_write( DDR_REG_BASE +0x52e34*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52e35*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE +0x52e36*4+0x02000000,0x942); +reg_write( DDR_REG_BASE +0x52e37*4+0x02000000,0xfdcf); +reg_write( DDR_REG_BASE +0x52e38*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52e39*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x52e3a*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE +0x52e3b*4+0x02000000,0xdb10); +reg_write( DDR_REG_BASE +0x52e3c*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE +0x52e3d*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE +0x52e3e*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE +0x52e3f*4+0x02000000,0x86e); +reg_write( DDR_REG_BASE +0x52e40*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52e41*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE +0x52e42*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE +0x52e43*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE +0x52e44*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE +0x52e45*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE +0x52e46*4+0x02000000,0x89f); +reg_write( DDR_REG_BASE +0x52e47*4+0x02000000,0x80b4); +reg_write( DDR_REG_BASE +0x52e48*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52e49*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE +0x52e4a*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE +0x52e4b*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE +0x52e4c*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE +0x52e4d*4+0x02000000,0x41); +reg_write( DDR_REG_BASE +0x52e4e*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE +0x52e4f*4+0x02000000,0x496e); +reg_write( DDR_REG_BASE +0x52e50*4+0x02000000,0x7b0f); +reg_write( DDR_REG_BASE +0x52e51*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52e52*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x52e53*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE +0x52e54*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE +0x52e55*4+0x02000000,0x842); +reg_write( DDR_REG_BASE +0x52e56*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52e57*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE +0x52e58*4+0x02000000,0x76ad); +reg_write( DDR_REG_BASE +0x52e59*4+0x02000000,0x70cd); +reg_write( DDR_REG_BASE +0x52e5a*4+0x02000000,0x43db); +reg_write( DDR_REG_BASE +0x52e5b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x52e5c*4+0x02000000,0x4400); +reg_write( DDR_REG_BASE +0x52e5d*4+0x02000000,0xf016); +reg_write( DDR_REG_BASE +0x52e5e*4+0x02000000,0x4163); +reg_write( DDR_REG_BASE +0x52e5f*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE +0x52e60*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE +0x52e61*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE +0x52e62*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE +0x52e63*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE +0x52e64*4+0x02000000,0x822); +reg_write( DDR_REG_BASE +0x52e65*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52e66*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE +0x52e67*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52e68*4+0x02000000,0x4163); +reg_write( DDR_REG_BASE +0x52e69*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE +0x52e6a*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE +0x52e6b*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE +0x52e6c*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE +0x52e6d*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE +0x52e6e*4+0x02000000,0x80e); +reg_write( DDR_REG_BASE +0x52e6f*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52e70*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE +0x52e71*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE +0x52e72*4+0x02000000,0xdd9); +reg_write( DDR_REG_BASE +0x52e73*4+0x02000000,0x9234); +reg_write( DDR_REG_BASE +0x52e74*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52e75*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52e76*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x52e77*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x52e78*4+0x02000000,0x440c); +reg_write( DDR_REG_BASE +0x52e79*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE +0x52e7a*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE +0x52e7b*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE +0x52e7c*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE +0x52e7d*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE +0x52e7e*4+0x02000000,0xfee); +reg_write( DDR_REG_BASE +0x52e7f*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE +0x52e80*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE +0x52e81*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52e82*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x52e83*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE +0x52e84*4+0x02000000,0xdbb0); +reg_write( DDR_REG_BASE +0x52e85*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE +0x52e86*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE +0x52e87*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE +0x52e88*4+0x02000000,0xfda); +reg_write( DDR_REG_BASE +0x52e89*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE +0x52e8a*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE +0x52e8b*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52e8c*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE +0x52e8d*4+0x02000000,0x764c); +reg_write( DDR_REG_BASE +0x52e8e*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE +0x52e8f*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE +0x52e90*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE +0x52e91*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE +0x52e92*4+0x02000000,0xfc6); +reg_write( DDR_REG_BASE +0x52e93*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE +0x52e94*4+0x02000000,0x1c00); +reg_write( DDR_REG_BASE +0x52e95*4+0x02000000,0x3041); +reg_write( DDR_REG_BASE +0x52e96*4+0x02000000,0xe8f); +reg_write( DDR_REG_BASE +0x52e97*4+0x02000000,0x1235); +reg_write( DDR_REG_BASE +0x52e98*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x52e99*4+0x02000000,0xf7a); +reg_write( DDR_REG_BASE +0x52e9a*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE +0x52e9b*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x52e9c*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x52e9d*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x52e9e*4+0x02000000,0x7b2); +reg_write( DDR_REG_BASE +0x52e9f*4+0x02000000,0x1001); +reg_write( DDR_REG_BASE +0x52ea0*4+0x02000000,0x8b); +reg_write( DDR_REG_BASE +0x52ea1*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x52ea2*4+0x02000000,0x708c); +reg_write( DDR_REG_BASE +0x52ea3*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x52ea4*4+0x02000000,0x7b2); +reg_write( DDR_REG_BASE +0x52ea5*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE +0x52ea6*4+0x02000000,0xf02b); +reg_write( DDR_REG_BASE +0x52ea7*4+0x02000000,0x241a); +reg_write( DDR_REG_BASE +0x52ea8*4+0x02000000,0x1f80); +reg_write( DDR_REG_BASE +0x52ea9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x52eaa*4+0x02000000,0x800); +reg_write( DDR_REG_BASE +0x52eab*4+0x02000000,0x2444); +reg_write( DDR_REG_BASE +0x52eac*4+0x02000000,0x1042); +reg_write( DDR_REG_BASE +0x52ead*4+0x02000000,0xc108); +reg_write( DDR_REG_BASE +0x52eae*4+0x02000000,0x206c); +reg_write( DDR_REG_BASE +0x52eaf*4+0x02000000,0x2c3); +reg_write( DDR_REG_BASE +0x52eb0*4+0x02000000,0x4040); +reg_write( DDR_REG_BASE +0x52eb1*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE +0x52eb2*4+0x02000000,0x10); +reg_write( DDR_REG_BASE +0x52eb3*4+0x02000000,0x7034); +reg_write( DDR_REG_BASE +0x52eb4*4+0x02000000,0x20ca); +reg_write( DDR_REG_BASE +0x52eb5*4+0x02000000,0x21); +reg_write( DDR_REG_BASE +0x52eb6*4+0x02000000,0x7865); +reg_write( DDR_REG_BASE +0x52eb7*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE +0x52eb8*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x52eb9*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x52eba*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE +0x52ebb*4+0x02000000,0x166); +reg_write( DDR_REG_BASE +0x52ebc*4+0x02000000,0x90e0); +reg_write( DDR_REG_BASE +0x52ebd*4+0x02000000,0xef13); +reg_write( DDR_REG_BASE +0x52ebe*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE +0x52ebf*4+0x02000000,0x229a); +reg_write( DDR_REG_BASE +0x52ec0*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x52ec1*4+0x02000000,0x2055); +reg_write( DDR_REG_BASE +0x52ec2*4+0x02000000,0xd01); +reg_write( DDR_REG_BASE +0x52ec3*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE +0x52ec4*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE +0x52ec5*4+0x02000000,0x7b05); +reg_write( DDR_REG_BASE +0x52ec6*4+0x02000000,0x7a65); +reg_write( DDR_REG_BASE +0x52ec7*4+0x02000000,0x785b); +reg_write( DDR_REG_BASE +0x52ec8*4+0x02000000,0xb891); +reg_write( DDR_REG_BASE +0x52ec9*4+0x02000000,0xb89c); +reg_write( DDR_REG_BASE +0x52eca*4+0x02000000,0xb89f); +reg_write( DDR_REG_BASE +0x52ecb*4+0x02000000,0x9020); +reg_write( DDR_REG_BASE +0x52ecc*4+0x02000000,0x2155); +reg_write( DDR_REG_BASE +0x52ecd*4+0x02000000,0x801); +reg_write( DDR_REG_BASE +0x52ece*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE +0x52ecf*4+0x02000000,0x65fd); +reg_write( DDR_REG_BASE +0x52ed0*4+0x02000000,0x7185); +reg_write( DDR_REG_BASE +0x52ed1*4+0x02000000,0xbaf); +reg_write( DDR_REG_BASE +0x52ed2*4+0x02000000,0x9325); +reg_write( DDR_REG_BASE +0x52ed3*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE +0x52ed4*4+0x02000000,0xa16); +reg_write( DDR_REG_BASE +0x52ed5*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52ed6*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE +0x52ed7*4+0x02000000,0x86e); +reg_write( DDR_REG_BASE +0x52ed8*4+0x02000000,0xfe8f); +reg_write( DDR_REG_BASE +0x52ed9*4+0x02000000,0xd7d); +reg_write( DDR_REG_BASE +0x52eda*4+0x02000000,0x9031); +reg_write( DDR_REG_BASE +0x52edb*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE +0x52edc*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE +0x52edd*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x52ede*4+0x02000000,0x16b); +reg_write( DDR_REG_BASE +0x52edf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x52ee0*4+0x02000000,0xb2e); +reg_write( DDR_REG_BASE +0x52ee1*4+0x02000000,0xfd2f); +reg_write( DDR_REG_BASE +0x52ee2*4+0x02000000,0x2578); +reg_write( DDR_REG_BASE +0x52ee3*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE +0x52ee4*4+0x02000000,0xc0a9); +reg_write( DDR_REG_BASE +0x52ee5*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE +0x52ee6*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE +0x52ee7*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE +0x52ee8*4+0x02000000,0xc0f1); +reg_write( DDR_REG_BASE +0x52ee9*4+0x02000000,0x2482); +reg_write( DDR_REG_BASE +0x52eea*4+0x02000000,0x3302); +reg_write( DDR_REG_BASE +0x52eeb*4+0x02000000,0xc080); +reg_write( DDR_REG_BASE +0x52eec*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x52eed*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x52eee*4+0x02000000,0x5f4); +reg_write( DDR_REG_BASE +0x52eef*4+0x02000000,0xaa6); +reg_write( DDR_REG_BASE +0x52ef0*4+0x02000000,0xfd2f); +reg_write( DDR_REG_BASE +0x52ef1*4+0x02000000,0xda8a); +reg_write( DDR_REG_BASE +0x52ef2*4+0x02000000,0xc080); +reg_write( DDR_REG_BASE +0x52ef3*4+0x02000000,0xba6); +reg_write( DDR_REG_BASE +0x52ef4*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE +0x52ef5*4+0x02000000,0xd98a); +reg_write( DDR_REG_BASE +0x52ef6*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE +0x52ef7*4+0x02000000,0x9d2); +reg_write( DDR_REG_BASE +0x52ef8*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52ef9*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE +0x52efa*4+0x02000000,0x2480); +reg_write( DDR_REG_BASE +0x52efb*4+0x02000000,0x3302); +reg_write( DDR_REG_BASE +0x52efc*4+0x02000000,0xc0d1); +reg_write( DDR_REG_BASE +0x52efd*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE +0x52efe*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE +0x52eff*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE +0x52f00*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE +0x52f01*4+0x02000000,0x2482); +reg_write( DDR_REG_BASE +0x52f02*4+0x02000000,0x3502); +reg_write( DDR_REG_BASE +0x52f03*4+0x02000000,0xc147); +reg_write( DDR_REG_BASE +0x52f04*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x52f05*4+0x02000000,0xa02); +reg_write( DDR_REG_BASE +0x52f06*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52f07*4+0x02000000,0x4318); +reg_write( DDR_REG_BASE +0x52f08*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE +0x52f09*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x52f0a*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE +0x52f0b*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x52f0c*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x52f0d*4+0x02000000,0xc62); +reg_write( DDR_REG_BASE +0x52f0e*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE +0x52f0f*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE +0x52f10*4+0x02000000,0x208c); +reg_write( DDR_REG_BASE +0x52f11*4+0x02000000,0x8e82); +reg_write( DDR_REG_BASE +0x52f12*4+0x02000000,0x71ad); +reg_write( DDR_REG_BASE +0x52f13*4+0x02000000,0xdffe); +reg_write( DDR_REG_BASE +0x52f14*4+0x02000000,0xf705); +reg_write( DDR_REG_BASE +0x52f15*4+0x02000000,0xc52); +reg_write( DDR_REG_BASE +0x52f16*4+0x02000000,0xfdcf); +reg_write( DDR_REG_BASE +0x52f17*4+0x02000000,0x2054); +reg_write( DDR_REG_BASE +0x52f18*4+0x02000000,0x88f); +reg_write( DDR_REG_BASE +0x52f19*4+0x02000000,0x2344); +reg_write( DDR_REG_BASE +0x52f1a*4+0x02000000,0x37c0); +reg_write( DDR_REG_BASE +0x52f1b*4+0x02000000,0xe806); +reg_write( DDR_REG_BASE +0x52f1c*4+0x02000000,0xb861); +reg_write( DDR_REG_BASE +0x52f1d*4+0x02000000,0x801); +reg_write( DDR_REG_BASE +0x52f1e*4+0x02000000,0x31); +reg_write( DDR_REG_BASE +0x52f1f*4+0x02000000,0x7dbb); +reg_write( DDR_REG_BASE +0x52f20*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE +0x52f21*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE +0x52f22*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x52f23*4+0x02000000,0x10); +reg_write( DDR_REG_BASE +0x52f24*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x52f25*4+0x02000000,0xc049); +reg_write( DDR_REG_BASE +0x52f26*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x52f27*4+0x02000000,0x7100); +reg_write( DDR_REG_BASE +0x52f28*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE +0x52f29*4+0x02000000,0xaa); +reg_write( DDR_REG_BASE +0x52f2a*4+0x02000000,0xc04a); +reg_write( DDR_REG_BASE +0x52f2b*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x52f2c*4+0x02000000,0x7045); +reg_write( DDR_REG_BASE +0x52f2d*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE +0x52f2e*4+0x02000000,0xe0aa); +reg_write( DDR_REG_BASE +0x52f2f*4+0x02000000,0xf76); +reg_write( DDR_REG_BASE +0x52f30*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE +0x52f31*4+0x02000000,0x70cd); +reg_write( DDR_REG_BASE +0x52f32*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x52f33*4+0x02000000,0xb88f); +reg_write( DDR_REG_BASE +0x52f34*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x52f35*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE +0x52f36*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x52f37*4+0x02000000,0xe002); +reg_write( DDR_REG_BASE +0x52f38*4+0x02000000,0xd940); +reg_write( DDR_REG_BASE +0x52f39*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x52f3a*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x52f3b*4+0x02000000,0xe002); +reg_write( DDR_REG_BASE +0x52f3c*4+0x02000000,0xc02); +reg_write( DDR_REG_BASE +0x52f3d*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE +0x52f3e*4+0x02000000,0xb032); +reg_write( DDR_REG_BASE +0x52f3f*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x52f40*4+0x02000000,0xf009); +reg_write( DDR_REG_BASE +0x52f41*4+0x02000000,0x2156); +reg_write( DDR_REG_BASE +0x52f42*4+0x02000000,0xe01); +reg_write( DDR_REG_BASE +0x52f43*4+0x02000000,0x2105); +reg_write( DDR_REG_BASE +0x52f44*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE +0x52f45*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE +0x52f46*4+0x02000000,0xe000); +reg_write( DDR_REG_BASE +0x52f47*4+0x02000000,0xb1c0); +reg_write( DDR_REG_BASE +0x52f48*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE +0x52f49*4+0x02000000,0x8f3); +reg_write( DDR_REG_BASE +0x52f4a*4+0x02000000,0x80f4); +reg_write( DDR_REG_BASE +0x52f4b*4+0x02000000,0x791b); +reg_write( DDR_REG_BASE +0x52f4c*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x52f4d*4+0x02000000,0x7101); +reg_write( DDR_REG_BASE +0x52f4e*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE +0x52f4f*4+0x02000000,0x4a); +reg_write( DDR_REG_BASE +0x52f50*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE +0x52f51*4+0x02000000,0x2111); +reg_write( DDR_REG_BASE +0x52f52*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x52f53*4+0x02000000,0xd9aa); +reg_write( DDR_REG_BASE +0x52f54*4+0x02000000,0xd898); +reg_write( DDR_REG_BASE +0x52f55*4+0x02000000,0x20ca); +reg_write( DDR_REG_BASE +0x52f56*4+0x02000000,0x41); +reg_write( DDR_REG_BASE +0x52f57*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x52f58*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE +0x52f59*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE +0x52f5a*4+0x02000000,0xe04c); +reg_write( DDR_REG_BASE +0x52f5b*4+0x02000000,0x202f); +reg_write( DDR_REG_BASE +0x52f5c*4+0x02000000,0x6c0); +reg_write( DDR_REG_BASE +0x52f5d*4+0x02000000,0x2056); +reg_write( DDR_REG_BASE +0x52f5e*4+0x02000000,0xe00); +reg_write( DDR_REG_BASE +0x52f5f*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x52f60*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE +0x52f61*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x52f62*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE +0x52f63*4+0x02000000,0x9000); +reg_write( DDR_REG_BASE +0x52f64*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE +0x52f65*4+0x02000000,0x11e9); +reg_write( DDR_REG_BASE +0x52f66*4+0x02000000,0x700); +reg_write( DDR_REG_BASE +0x52f67*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x52f68*4+0x02000000,0xc046); +reg_write( DDR_REG_BASE +0x52f69*4+0x02000000,0xd42); +reg_write( DDR_REG_BASE +0x52f6a*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE +0x52f6b*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE +0x52f6c*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x52f6d*4+0x02000000,0x1200); +reg_write( DDR_REG_BASE +0x52f6e*4+0x02000000,0x3083); +reg_write( DDR_REG_BASE +0x52f6f*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52f70*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x52f71*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE +0x52f72*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE +0x52f73*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE +0x52f74*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE +0x52f75*4+0x02000000,0xe02); +reg_write( DDR_REG_BASE +0x52f76*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE +0x52f77*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE +0x52f78*4+0x02000000,0x78af); +reg_write( DDR_REG_BASE +0x52f79*4+0x02000000,0xc048); +reg_write( DDR_REG_BASE +0x52f7a*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE +0x52f7b*4+0x02000000,0x2744); +reg_write( DDR_REG_BASE +0x52f7c*4+0x02000000,0x1040); +reg_write( DDR_REG_BASE +0x52f7d*4+0x02000000,0x671f); +reg_write( DDR_REG_BASE +0x52f7e*4+0x02000000,0x78ef); +reg_write( DDR_REG_BASE +0x52f7f*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE +0x52f80*4+0x02000000,0xc305); +reg_write( DDR_REG_BASE +0x52f81*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE +0x52f82*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52f83*4+0x02000000,0xb990); +reg_write( DDR_REG_BASE +0x52f84*4+0x02000000,0x724c); +reg_write( DDR_REG_BASE +0x52f85*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE +0x52f86*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE +0x52f87*4+0x02000000,0xdde); +reg_write( DDR_REG_BASE +0x52f88*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE +0x52f89*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE +0x52f8a*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x52f8b*4+0x02000000,0xd96); +reg_write( DDR_REG_BASE +0x52f8c*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE +0x52f8d*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x52f8e*4+0x02000000,0x47cb); +reg_write( DDR_REG_BASE +0x52f8f*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x52f90*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE +0x52f91*4+0x02000000,0x8f20); +reg_write( DDR_REG_BASE +0x52f92*4+0x02000000,0xf00a); +reg_write( DDR_REG_BASE +0x52f93*4+0x02000000,0x60da); +reg_write( DDR_REG_BASE +0x52f94*4+0x02000000,0x4020); +reg_write( DDR_REG_BASE +0x52f95*4+0x02000000,0x209f); +reg_write( DDR_REG_BASE +0x52f96*4+0x02000000,0x901); +reg_write( DDR_REG_BASE +0x52f97*4+0x02000000,0x60d8); +reg_write( DDR_REG_BASE +0x52f98*4+0x02000000,0x60f8); +reg_write( DDR_REG_BASE +0x52f99*4+0x02000000,0x8814); +reg_write( DDR_REG_BASE +0x52f9a*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE +0x52f9b*4+0x02000000,0xaa00); +reg_write( DDR_REG_BASE +0x52f9c*4+0x02000000,0xe6e3); +reg_write( DDR_REG_BASE +0x52f9d*4+0x02000000,0xc08c); +reg_write( DDR_REG_BASE +0x52f9e*4+0x02000000,0xf7f5); +reg_write( DDR_REG_BASE +0x52f9f*4+0x02000000,0x4063); +reg_write( DDR_REG_BASE +0x52fa0*4+0x02000000,0xc18c); +reg_write( DDR_REG_BASE +0x52fa1*4+0x02000000,0xc82); +reg_write( DDR_REG_BASE +0x52fa2*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE +0x52fa3*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE +0x52fa4*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x52fa5*4+0x02000000,0x7100); +reg_write( DDR_REG_BASE +0x52fa6*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE +0x52fa7*4+0x02000000,0x1e0); +reg_write( DDR_REG_BASE +0x52fa8*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE +0x52fa9*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE +0x52faa*4+0x02000000,0xe1e0); +reg_write( DDR_REG_BASE +0x52fab*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x52fac*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE +0x52fad*4+0x02000000,0xf0ff); +reg_write( DDR_REG_BASE +0x52fae*4+0x02000000,0xc04b); +reg_write( DDR_REG_BASE +0x52faf*4+0x02000000,0xb888); +reg_write( DDR_REG_BASE +0x52fb0*4+0x02000000,0xb600); +reg_write( DDR_REG_BASE +0x52fb1*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE +0x52fb2*4+0x02000000,0xc206); +reg_write( DDR_REG_BASE +0x52fb3*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE +0x52fb4*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x52fb5*4+0x02000000,0x7a24); +reg_write( DDR_REG_BASE +0x52fb6*4+0x02000000,0x7932); +reg_write( DDR_REG_BASE +0x52fb7*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE +0x52fb8*4+0x02000000,0x7824); +reg_write( DDR_REG_BASE +0x52fb9*4+0x02000000,0x7845); +reg_write( DDR_REG_BASE +0x52fba*4+0x02000000,0xc046); +reg_write( DDR_REG_BASE +0x52fbb*4+0x02000000,0xb887); +reg_write( DDR_REG_BASE +0x52fbc*4+0x02000000,0x1ef2); +reg_write( DDR_REG_BASE +0x52fbd*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE +0x52fbe*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x52fbf*4+0x02000000,0x7045); +reg_write( DDR_REG_BASE +0x52fc0*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE +0x52fc1*4+0x02000000,0xe0e8); +reg_write( DDR_REG_BASE +0x52fc2*4+0x02000000,0xa96); +reg_write( DDR_REG_BASE +0x52fc3*4+0x02000000,0xfdcf); +reg_write( DDR_REG_BASE +0x52fc4*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE +0x52fc5*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE +0x52fc6*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x52fc7*4+0x02000000,0xc86); +reg_write( DDR_REG_BASE +0x52fc8*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE +0x52fc9*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x52fca*4+0x02000000,0x1200); +reg_write( DDR_REG_BASE +0x52fcb*4+0x02000000,0x3083); +reg_write( DDR_REG_BASE +0x52fcc*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x52fcd*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52fce*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE +0x52fcf*4+0x02000000,0x4528); +reg_write( DDR_REG_BASE +0x52fd0*4+0x02000000,0xc143); +reg_write( DDR_REG_BASE +0x52fd1*4+0x02000000,0xc142); +reg_write( DDR_REG_BASE +0x52fd2*4+0x02000000,0xc141); +reg_write( DDR_REG_BASE +0x52fd3*4+0x02000000,0xd46); +reg_write( DDR_REG_BASE +0x52fd4*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE +0x52fd5*4+0x02000000,0xc140); +reg_write( DDR_REG_BASE +0x52fd6*4+0x02000000,0xefa); +reg_write( DDR_REG_BASE +0x52fd7*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE +0x52fd8*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52fd9*4+0x02000000,0xc008); +reg_write( DDR_REG_BASE +0x52fda*4+0x02000000,0xc305); +reg_write( DDR_REG_BASE +0x52fdb*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x52fdc*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE +0x52fdd*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52fde*4+0x02000000,0xb990); +reg_write( DDR_REG_BASE +0x52fdf*4+0x02000000,0x724c); +reg_write( DDR_REG_BASE +0x52fe0*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE +0x52fe1*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE +0x52fe2*4+0x02000000,0xd26); +reg_write( DDR_REG_BASE +0x52fe3*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE +0x52fe4*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE +0x52fe5*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE +0x52fe6*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE +0x52fe7*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE +0x52fe8*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE +0x52fe9*4+0x02000000,0x41); +reg_write( DDR_REG_BASE +0x52fea*4+0x02000000,0x6038); +reg_write( DDR_REG_BASE +0x52feb*4+0x02000000,0xe01e); +reg_write( DDR_REG_BASE +0x52fec*4+0x02000000,0x7b0f); +reg_write( DDR_REG_BASE +0x52fed*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52fee*4+0x02000000,0x742c); +reg_write( DDR_REG_BASE +0x52fef*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE +0x52ff0*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE +0x52ff1*4+0x02000000,0xd0a); +reg_write( DDR_REG_BASE +0x52ff2*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE +0x52ff3*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE +0x52ff4*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x52ff5*4+0x02000000,0xb890); +reg_write( DDR_REG_BASE +0x52ff6*4+0x02000000,0x791d); +reg_write( DDR_REG_BASE +0x52ff7*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x52ff8*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE +0x52ff9*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE +0x52ffa*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE +0x52ffb*4+0x02000000,0x30c1); +reg_write( DDR_REG_BASE +0x52ffc*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE +0x52ffd*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE +0x52ffe*4+0x02000000,0xcee); +reg_write( DDR_REG_BASE +0x52fff*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE +0x53000*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE +0x53001*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x53002*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x53003*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE +0x53004*4+0x02000000,0xdb10); +reg_write( DDR_REG_BASE +0x53005*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE +0x53006*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE +0x53007*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE +0x53008*4+0x02000000,0xcda); +reg_write( DDR_REG_BASE +0x53009*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE +0x5300a*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE +0x5300b*4+0x02000000,0xe76); +reg_write( DDR_REG_BASE +0x5300c*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE +0x5300d*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x5300e*4+0x02000000,0xf852); +reg_write( DDR_REG_BASE +0x5300f*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE +0x53010*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE +0x53011*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE +0x53012*4+0x02000000,0xcc6); +reg_write( DDR_REG_BASE +0x53013*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE +0x53014*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE +0x53015*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x53016*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53017*4+0x02000000,0x6210); +reg_write( DDR_REG_BASE +0x53018*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x53019*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE +0x5301a*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x5301b*4+0x02000000,0xe004); +reg_write( DDR_REG_BASE +0x5301c*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE +0x5301d*4+0x02000000,0xc72); +reg_write( DDR_REG_BASE +0x5301e*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE +0x5301f*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x53020*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE +0x53021*4+0x02000000,0x408); +reg_write( DDR_REG_BASE +0x53022*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x53023*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE +0x53024*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x53025*4+0x02000000,0xe004); +reg_write( DDR_REG_BASE +0x53026*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE +0x53027*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE +0x53028*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE +0x53029*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x5302a*4+0x02000000,0x80b); +reg_write( DDR_REG_BASE +0x5302b*4+0x02000000,0xbf); +reg_write( DDR_REG_BASE +0x5302c*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE +0x5302d*4+0x02000000,0x606); +reg_write( DDR_REG_BASE +0x5302e*4+0x02000000,0xf002); +reg_write( DDR_REG_BASE +0x5302f*4+0x02000000,0xd833); +reg_write( DDR_REG_BASE +0x53030*4+0x02000000,0xc4a); +reg_write( DDR_REG_BASE +0x53031*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE +0x53032*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x53033*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE +0x53034*4+0x02000000,0xc18c); +reg_write( DDR_REG_BASE +0x53035*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE +0x53036*4+0x02000000,0x1ef2); +reg_write( DDR_REG_BASE +0x53037*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE +0x53038*4+0x02000000,0xb52); +reg_write( DDR_REG_BASE +0x53039*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE +0x5303a*4+0x02000000,0x4063); +reg_write( DDR_REG_BASE +0x5303b*4+0x02000000,0x8f00); +reg_write( DDR_REG_BASE +0x5303c*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE +0x5303d*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x5303e*4+0x02000000,0x600); +reg_write( DDR_REG_BASE +0x5303f*4+0x02000000,0xc140); +reg_write( DDR_REG_BASE +0x53040*4+0x02000000,0x4fac); +reg_write( DDR_REG_BASE +0x53041*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE +0x53042*4+0x02000000,0x80e); +reg_write( DDR_REG_BASE +0x53043*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE +0x53044*4+0x02000000,0x706c); +reg_write( DDR_REG_BASE +0x53045*4+0x02000000,0xc00a); +reg_write( DDR_REG_BASE +0x53046*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE +0x53047*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x53048*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x53049*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE +0x5304a*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE +0x5304b*4+0x02000000,0xe0aa); +reg_write( DDR_REG_BASE +0x5304c*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE +0x5304d*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x5304e*4+0x02000000,0xe002); +reg_write( DDR_REG_BASE +0x5304f*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x53050*4+0x02000000,0x7344); +reg_write( DDR_REG_BASE +0x53051*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x53052*4+0x02000000,0xe002); +reg_write( DDR_REG_BASE +0x53053*4+0x02000000,0xb0b2); +reg_write( DDR_REG_BASE +0x53054*4+0x02000000,0xb6a); +reg_write( DDR_REG_BASE +0x53055*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE +0x53056*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE +0x53057*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x53058*4+0x02000000,0x1200); +reg_write( DDR_REG_BASE +0x53059*4+0x02000000,0x3083); +reg_write( DDR_REG_BASE +0x5305a*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x5305b*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x5305c*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE +0x5305d*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE +0x5305e*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE +0x5305f*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE +0x53060*4+0x02000000,0xc2a); +reg_write( DDR_REG_BASE +0x53061*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE +0x53062*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE +0x53063*4+0x02000000,0xc008); +reg_write( DDR_REG_BASE +0x53064*4+0x02000000,0xc305); +reg_write( DDR_REG_BASE +0x53065*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x53066*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE +0x53067*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x53068*4+0x02000000,0xb990); +reg_write( DDR_REG_BASE +0x53069*4+0x02000000,0x724c); +reg_write( DDR_REG_BASE +0x5306a*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE +0x5306b*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE +0x5306c*4+0x02000000,0xc12); +reg_write( DDR_REG_BASE +0x5306d*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE +0x5306e*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE +0x5306f*4+0x02000000,0xf822); +reg_write( DDR_REG_BASE +0x53070*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE +0x53071*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE +0x53072*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE +0x53073*4+0x02000000,0xc06); +reg_write( DDR_REG_BASE +0x53074*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE +0x53075*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE +0x53076*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE +0x53077*4+0x02000000,0xbbe); +reg_write( DDR_REG_BASE +0x53078*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE +0x53079*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE +0x5307a*4+0x02000000,0xc00b); +reg_write( DDR_REG_BASE +0x5307b*4+0x02000000,0xb600); +reg_write( DDR_REG_BASE +0x5307c*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x5307d*4+0x02000000,0x7344); +reg_write( DDR_REG_BASE +0x5307e*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE +0x5307f*4+0x02000000,0xe0e8); +reg_write( DDR_REG_BASE +0x53080*4+0x02000000,0xf00a); +reg_write( DDR_REG_BASE +0x53081*4+0x02000000,0x2056); +reg_write( DDR_REG_BASE +0x53082*4+0x02000000,0xe00); +reg_write( DDR_REG_BASE +0x53083*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE +0x53084*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE +0x53085*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE +0x53086*4+0x02000000,0xe000); +reg_write( DDR_REG_BASE +0x53087*4+0x02000000,0x1800); +reg_write( DDR_REG_BASE +0x53088*4+0x02000000,0x3c5); +reg_write( DDR_REG_BASE +0x53089*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE +0x5308a*4+0x02000000,0xdef); +reg_write( DDR_REG_BASE +0x5308b*4+0x02000000,0x90b4); +reg_write( DDR_REG_BASE +0x5308c*4+0x02000000,0x78bb); +reg_write( DDR_REG_BASE +0x5308d*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x5308e*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x5308f*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE +0x53090*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE +0x53091*4+0x02000000,0xe1c4); +reg_write( DDR_REG_BASE +0x53092*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE +0x53093*4+0x02000000,0x7005); +reg_write( DDR_REG_BASE +0x53094*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE +0x53095*4+0x02000000,0xe004); +reg_write( DDR_REG_BASE +0x53096*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE +0x53097*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x53098*4+0x02000000,0xdd2); +reg_write( DDR_REG_BASE +0x53099*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE +0x5309a*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE +0x5309b*4+0x02000000,0x4063); +reg_write( DDR_REG_BASE +0x5309c*4+0x02000000,0xed2); +reg_write( DDR_REG_BASE +0x5309d*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE +0x5309e*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE +0x5309f*4+0x02000000,0xc109); +reg_write( DDR_REG_BASE +0x530a0*4+0x02000000,0x2055); +reg_write( DDR_REG_BASE +0x530a1*4+0x02000000,0xd00); +reg_write( DDR_REG_BASE +0x530a2*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE +0x530a3*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE +0x530a4*4+0x02000000,0xc107); +reg_write( DDR_REG_BASE +0x530a5*4+0x02000000,0x89e); +reg_write( DDR_REG_BASE +0x530a6*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE +0x530a7*4+0x02000000,0x706c); +reg_write( DDR_REG_BASE +0x530a8*4+0x02000000,0xcca); +reg_write( DDR_REG_BASE +0x530a9*4+0x02000000,0xfe4f); +reg_write( DDR_REG_BASE +0x530aa*4+0x02000000,0xe8a); +reg_write( DDR_REG_BASE +0x530ab*4+0x02000000,0xfecf); +reg_write( DDR_REG_BASE +0x530ac*4+0x02000000,0x2480); +reg_write( DDR_REG_BASE +0x530ad*4+0x02000000,0x3502); +reg_write( DDR_REG_BASE +0x530ae*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE +0x530af*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE +0x530b0*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE +0x530b1*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE +0x530b2*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE +0x530b3*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE +0x530b4*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE +0x530b5*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE +0x530b6*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE +0x530b7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530b8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530b9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530ba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530bb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530bc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530bd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530be*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530bf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530c0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530c1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530c2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530c3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530c4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530c5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530c6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530c7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530c8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530c9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530ca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530cb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530cc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530cd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530ce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530cf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530d0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530d1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530d2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530d3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530d4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530d5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530d6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530d7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530d8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530d9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530da*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530db*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530dc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530dd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530de*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530df*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530e0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530e1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530e2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530e3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530e4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530e5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530e6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530e7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530e8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530e9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530ea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530eb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530ec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530ed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530ee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530ef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530f0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530f1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530f2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530f3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530f4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530f5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530f6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530f7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530f8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530f9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530fa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530fb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530fc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530fd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530fe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x530ff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53100*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53101*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53102*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53103*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53104*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53105*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53106*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53107*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53108*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53109*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5310a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5310b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5310c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5310d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5310e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5310f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53110*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53111*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53112*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53113*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53114*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53115*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53116*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53117*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53118*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53119*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5311a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5311b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5311c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5311d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5311e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5311f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53120*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53121*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53122*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53123*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53124*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53125*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53126*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53127*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53128*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53129*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5312a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5312b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5312c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5312d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5312e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5312f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53130*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53131*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53132*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53133*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53134*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53135*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53136*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53137*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53138*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53139*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5313a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5313b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5313c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5313d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5313e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5313f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53140*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53141*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53142*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53143*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53144*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53145*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53146*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53147*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53148*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53149*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5314a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5314b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5314c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5314d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5314e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5314f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53150*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53151*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53152*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53153*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53154*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53155*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53156*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53157*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53158*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53159*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5315a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5315b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5315c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5315d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5315e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5315f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53160*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53161*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53162*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53163*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53164*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53165*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53166*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53167*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53168*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53169*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5316a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5316b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5316c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5316d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5316e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5316f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53170*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53171*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53172*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53173*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53174*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53175*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53176*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53177*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53178*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53179*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5317a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5317b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5317c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5317d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5317e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5317f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53180*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53181*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53182*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53183*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53184*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53185*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53186*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53187*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53188*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53189*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5318a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5318b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5318c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5318d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5318e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5318f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53190*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53191*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53192*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53193*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53194*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53195*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53196*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53197*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53198*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53199*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5319a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5319b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5319c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5319d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5319e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5319f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531a0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531a1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531a2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531a3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531a4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531a5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531a6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531a7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531a8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531a9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531aa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531ab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531ac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531ad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531ae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531af*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531b0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531b1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531b2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531b3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531b4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531b5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531b6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531b7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531b8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531b9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531ba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531bb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531bc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531bd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531be*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531bf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531c0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531c1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531c2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531c3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531c4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531c5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531c6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531c7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531c8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531c9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531ca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531cb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531cc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531cd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531ce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531cf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531d0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531d1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531d2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531d3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531d4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531d5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531d6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531d7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531d8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531d9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531da*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531db*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531dc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531dd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531de*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531df*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531e0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531e1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531e2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531e3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531e4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531e5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531e6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531e7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531e8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531e9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531ea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531eb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531ec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531ed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531ee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531ef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531f0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531f1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531f2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531f3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531f4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531f5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531f6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531f7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531f8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531f9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531fa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531fb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531fc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531fd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531fe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x531ff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53200*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53201*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53202*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53203*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53204*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53205*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53206*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53207*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53208*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53209*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5320a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5320b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5320c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5320d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5320e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5320f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53210*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53211*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53212*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53213*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53214*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53215*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53216*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53217*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53218*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53219*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5321a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5321b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5321c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5321d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5321e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5321f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53220*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53221*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53222*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53223*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53224*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53225*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53226*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53227*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53228*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53229*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5322a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5322b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5322c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5322d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5322e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5322f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53230*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53231*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53232*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53233*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53234*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53235*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53236*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53237*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53238*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53239*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5323a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5323b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5323c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5323d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5323e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5323f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53240*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53241*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53242*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53243*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53244*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53245*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53246*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53247*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53248*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53249*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5324a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5324b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5324c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5324d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5324e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5324f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53250*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53251*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53252*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53253*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53254*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53255*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53256*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53257*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53258*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53259*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5325a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5325b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5325c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5325d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5325e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5325f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53260*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53261*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53262*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53263*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53264*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53265*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53266*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53267*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53268*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53269*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5326a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5326b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5326c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5326d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5326e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5326f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53270*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53271*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53272*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53273*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53274*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53275*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53276*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53277*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53278*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53279*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5327a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5327b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5327c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5327d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5327e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5327f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53280*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53281*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53282*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53283*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53284*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53285*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53286*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53287*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53288*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53289*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5328a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5328b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5328c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5328d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5328e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5328f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53290*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53291*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53292*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53293*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53294*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53295*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53296*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53297*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53298*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53299*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5329a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5329b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5329c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5329d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5329e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5329f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532a0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532a1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532a2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532a3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532a4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532a5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532a6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532a7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532a8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532a9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532aa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532ab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532ac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532ad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532ae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532af*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532b0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532b1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532b2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532b3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532b4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532b5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532b6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532b7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532b8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532b9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532ba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532bb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532bc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532bd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532be*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532bf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532c0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532c1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532c2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532c3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532c4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532c5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532c6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532c7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532c8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532c9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532ca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532cb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532cc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532cd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532ce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532cf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532d0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532d1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532d2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532d3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532d4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532d5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532d6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532d7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532d8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532d9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532da*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532db*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532dc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532dd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532de*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532df*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532e0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532e1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532e2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532e3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532e4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532e5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532e6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532e7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532e8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532e9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532ea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532eb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532ec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532ed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532ee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532ef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532f0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532f1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532f2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532f3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532f4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532f5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532f6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532f7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532f8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532f9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532fa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532fb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532fc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532fd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532fe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x532ff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53300*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53301*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53302*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53303*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53304*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53305*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53306*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53307*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53308*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53309*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5330a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5330b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5330c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5330d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5330e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5330f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53310*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53311*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53312*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53313*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53314*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53315*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53316*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53317*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53318*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53319*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5331a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5331b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5331c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5331d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5331e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5331f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53320*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53321*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53322*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53323*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53324*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53325*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53326*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53327*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53328*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53329*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5332a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5332b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5332c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5332d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5332e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5332f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53330*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53331*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53332*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53333*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53334*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53335*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53336*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53337*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53338*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53339*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5333a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5333b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5333c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5333d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5333e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5333f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53340*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53341*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53342*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53343*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53344*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53345*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53346*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53347*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53348*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53349*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5334a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5334b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5334c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5334d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5334e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5334f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53350*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53351*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53352*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53353*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53354*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53355*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53356*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53357*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53358*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53359*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5335a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5335b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5335c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5335d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5335e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5335f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53360*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53361*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53362*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53363*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53364*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53365*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53366*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53367*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53368*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53369*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5336a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5336b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5336c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5336d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5336e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5336f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53370*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53371*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53372*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53373*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53374*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53375*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53376*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53377*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53378*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53379*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5337a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5337b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5337c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5337d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5337e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5337f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53380*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53381*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53382*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53383*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53384*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53385*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53386*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53387*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53388*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53389*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5338a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5338b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5338c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5338d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5338e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5338f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53390*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53391*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53392*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53393*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53394*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53395*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53396*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53397*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53398*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53399*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5339a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5339b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5339c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5339d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5339e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5339f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533a0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533a1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533a2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533a3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533a4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533a5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533a6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533a7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533a8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533a9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533aa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533ab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533ac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533ad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533ae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533af*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533b0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533b1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533b2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533b3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533b4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533b5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533b6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533b7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533b8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533b9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533ba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533bb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533bc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533bd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533be*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533bf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533c0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533c1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533c2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533c3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533c4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533c5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533c6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533c7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533c8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533c9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533ca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533cb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533cc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533cd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533ce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533cf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533d0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533d1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533d2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533d3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533d4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533d5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533d6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533d7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533d8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533d9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533da*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533db*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533dc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533dd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533de*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533df*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533e0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533e1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533e2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533e3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533e4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533e5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533e6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533e7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533e8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533e9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533ea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533eb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533ec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533ed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533ee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533ef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533f0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533f1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533f2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533f3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533f4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533f5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533f6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533f7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533f8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533f9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533fa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533fb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533fc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533fd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533fe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x533ff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53400*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53401*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53402*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53403*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53404*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53405*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53406*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53407*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53408*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53409*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5340a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5340b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5340c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5340d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5340e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5340f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53410*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53411*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53412*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53413*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53414*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53415*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53416*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53417*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53418*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53419*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5341a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5341b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5341c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5341d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5341e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5341f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53420*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53421*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53422*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53423*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53424*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53425*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53426*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53427*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53428*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53429*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5342a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5342b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5342c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5342d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5342e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5342f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53430*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53431*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53432*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53433*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53434*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53435*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53436*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53437*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53438*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53439*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5343a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5343b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5343c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5343d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5343e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5343f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53440*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53441*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53442*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53443*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53444*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53445*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53446*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53447*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53448*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53449*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5344a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5344b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5344c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5344d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5344e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5344f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53450*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53451*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53452*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53453*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53454*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53455*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53456*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53457*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53458*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53459*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5345a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5345b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5345c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5345d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5345e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5345f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53460*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53461*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53462*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53463*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53464*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53465*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53466*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53467*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53468*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53469*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5346a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5346b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5346c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5346d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5346e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5346f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53470*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53471*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53472*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53473*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53474*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53475*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53476*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53477*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53478*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53479*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5347a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5347b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5347c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5347d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5347e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5347f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53480*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53481*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53482*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53483*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53484*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53485*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53486*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53487*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53488*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53489*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5348a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5348b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5348c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5348d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5348e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5348f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53490*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53491*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53492*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53493*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53494*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53495*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53496*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53497*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53498*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53499*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5349a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5349b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5349c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5349d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5349e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5349f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534a0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534a1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534a2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534a3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534a4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534a5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534a6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534a7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534a8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534a9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534aa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534ab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534ac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534ad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534ae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534af*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534b0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534b1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534b2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534b3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534b4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534b5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534b6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534b7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534b8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534b9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534ba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534bb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534bc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534bd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534be*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534bf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534c0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534c1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534c2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534c3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534c4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534c5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534c6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534c7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534c8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534c9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534ca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534cb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534cc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534cd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534ce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534cf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534d0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534d1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534d2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534d3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534d4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534d5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534d6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534d7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534d8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534d9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534da*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534db*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534dc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534dd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534de*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534df*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534e0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534e1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534e2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534e3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534e4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534e5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534e6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534e7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534e8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534e9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534ea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534eb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534ec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534ed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534ee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534ef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534f0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534f1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534f2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534f3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534f4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534f5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534f6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534f7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534f8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534f9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534fa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534fb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534fc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534fd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534fe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x534ff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53500*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53501*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53502*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53503*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53504*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53505*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53506*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53507*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53508*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53509*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5350a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5350b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5350c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5350d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5350e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5350f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53510*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53511*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53512*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53513*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53514*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53515*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53516*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53517*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53518*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53519*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5351a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5351b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5351c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5351d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5351e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5351f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53520*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53521*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53522*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53523*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53524*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53525*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53526*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53527*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53528*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53529*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5352a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5352b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5352c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5352d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5352e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5352f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53530*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53531*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53532*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53533*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53534*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53535*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53536*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53537*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53538*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53539*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5353a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5353b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5353c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5353d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5353e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5353f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53540*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53541*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53542*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53543*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53544*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53545*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53546*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53547*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53548*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53549*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5354a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5354b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5354c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5354d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5354e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5354f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53550*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53551*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53552*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53553*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53554*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53555*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53556*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53557*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53558*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53559*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5355a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5355b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5355c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5355d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5355e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5355f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53560*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53561*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53562*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53563*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53564*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53565*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53566*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53567*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53568*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53569*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5356a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5356b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5356c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5356d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5356e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5356f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53570*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53571*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53572*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53573*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53574*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53575*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53576*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53577*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53578*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53579*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5357a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5357b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5357c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5357d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5357e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5357f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53580*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53581*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53582*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53583*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53584*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53585*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53586*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53587*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53588*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53589*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5358a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5358b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5358c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5358d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5358e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5358f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53590*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53591*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53592*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53593*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53594*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53595*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53596*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53597*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53598*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53599*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5359a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5359b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5359c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5359d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5359e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5359f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535a0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535a1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535a2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535a3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535a4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535a5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535a6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535a7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535a8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535a9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535aa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535ab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535ac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535ad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535ae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535af*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535b0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535b1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535b2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535b3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535b4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535b5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535b6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535b7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535b8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535b9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535ba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535bb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535bc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535bd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535be*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535bf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535c0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535c1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535c2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535c3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535c4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535c5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535c6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535c7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535c8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535c9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535ca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535cb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535cc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535cd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535ce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535cf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535d0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535d1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535d2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535d3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535d4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535d5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535d6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535d7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535d8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535d9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535da*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535db*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535dc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535dd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535de*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535df*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535e0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535e1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535e2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535e3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535e4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535e5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535e6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535e7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535e8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535e9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535ea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535eb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535ec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535ed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535ee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535ef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535f0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535f1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535f2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535f3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535f4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535f5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535f6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535f7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535f8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535f9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535fa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535fb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535fc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535fd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535fe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x535ff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53600*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53601*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53602*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53603*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53604*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53605*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53606*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53607*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53608*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53609*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5360a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5360b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5360c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5360d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5360e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5360f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53610*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53611*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53612*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53613*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53614*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53615*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53616*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53617*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53618*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53619*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5361a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5361b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5361c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5361d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5361e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5361f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53620*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53621*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53622*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53623*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53624*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53625*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53626*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53627*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53628*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53629*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5362a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5362b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5362c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5362d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5362e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5362f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53630*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53631*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53632*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53633*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53634*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53635*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53636*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53637*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53638*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53639*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5363a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5363b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5363c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5363d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5363e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5363f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53640*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53641*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53642*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53643*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53644*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53645*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53646*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53647*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53648*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53649*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5364a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5364b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5364c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5364d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5364e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5364f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53650*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53651*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53652*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53653*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53654*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53655*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53656*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53657*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53658*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53659*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5365a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5365b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5365c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5365d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5365e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5365f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53660*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53661*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53662*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53663*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53664*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53665*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53666*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53667*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53668*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53669*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5366a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5366b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5366c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5366d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5366e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5366f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53670*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53671*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53672*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53673*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53674*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53675*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53676*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53677*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53678*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53679*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5367a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5367b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5367c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5367d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5367e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5367f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53680*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53681*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53682*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53683*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53684*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53685*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53686*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53687*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53688*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53689*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5368a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5368b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5368c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5368d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5368e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5368f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53690*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53691*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53692*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53693*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53694*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53695*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53696*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53697*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53698*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53699*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5369a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5369b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5369c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5369d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5369e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5369f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536a0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536a1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536a2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536a3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536a4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536a5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536a6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536a7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536a8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536a9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536aa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536ab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536ac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536ad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536ae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536af*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536b0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536b1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536b2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536b3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536b4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536b5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536b6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536b7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536b8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536b9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536ba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536bb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536bc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536bd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536be*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536bf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536c0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536c1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536c2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536c3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536c4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536c5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536c6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536c7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536c8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536c9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536ca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536cb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536cc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536cd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536ce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536cf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536d0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536d1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536d2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536d3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536d4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536d5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536d6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536d7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536d8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536d9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536da*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536db*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536dc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536dd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536de*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536df*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536e0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536e1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536e2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536e3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536e4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536e5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536e6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536e7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536e8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536e9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536ea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536eb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536ec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536ed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536ee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536ef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536f0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536f1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536f2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536f3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536f4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536f5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536f6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536f7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536f8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536f9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536fa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536fb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536fc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536fd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536fe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x536ff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53700*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53701*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53702*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53703*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53704*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53705*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53706*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53707*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53708*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53709*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5370a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5370b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5370c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5370d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5370e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5370f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53710*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53711*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53712*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53713*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53714*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53715*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53716*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53717*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53718*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53719*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5371a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5371b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5371c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5371d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5371e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5371f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53720*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53721*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53722*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53723*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53724*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53725*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53726*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53727*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53728*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53729*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5372a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5372b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5372c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5372d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5372e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5372f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53730*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53731*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53732*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53733*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53734*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53735*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53736*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53737*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53738*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53739*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5373a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5373b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5373c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5373d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5373e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5373f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53740*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53741*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53742*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53743*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53744*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53745*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53746*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53747*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53748*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53749*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5374a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5374b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5374c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5374d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5374e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5374f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53750*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53751*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53752*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53753*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53754*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53755*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53756*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53757*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53758*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53759*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5375a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5375b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5375c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5375d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5375e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5375f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53760*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53761*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53762*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53763*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53764*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53765*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53766*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53767*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53768*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53769*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5376a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5376b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5376c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5376d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5376e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5376f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53770*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53771*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53772*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53773*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53774*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53775*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53776*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53777*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53778*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53779*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5377a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5377b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5377c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5377d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5377e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5377f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53780*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53781*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53782*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53783*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53784*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53785*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53786*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53787*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53788*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53789*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5378a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5378b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5378c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5378d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5378e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5378f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53790*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53791*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53792*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53793*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53794*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53795*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53796*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53797*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53798*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53799*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5379a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5379b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5379c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5379d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5379e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5379f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537a0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537a1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537a2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537a3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537a4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537a5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537a6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537a7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537a8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537a9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537aa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537ab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537ac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537ad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537ae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537af*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537b0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537b1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537b2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537b3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537b4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537b5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537b6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537b7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537b8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537b9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537ba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537bb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537bc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537bd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537be*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537bf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537c0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537c1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537c2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537c3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537c4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537c5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537c6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537c7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537c8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537c9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537ca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537cb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537cc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537cd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537ce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537cf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537d0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537d1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537d2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537d3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537d4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537d5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537d6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537d7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537d8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537d9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537da*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537db*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537dc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537dd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537de*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537df*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537e0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537e1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537e2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537e3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537e4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537e5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537e6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537e7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537e8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537e9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537ea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537eb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537ec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537ed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537ee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537ef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537f0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537f1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537f2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537f3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537f4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537f5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537f6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537f7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537f8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537f9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537fa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537fb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537fc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537fd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537fe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x537ff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53800*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53801*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53802*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53803*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53804*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53805*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53806*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53807*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53808*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53809*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5380a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5380b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5380c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5380d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5380e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5380f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53810*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53811*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53812*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53813*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53814*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53815*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53816*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53817*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53818*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53819*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5381a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5381b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5381c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5381d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5381e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5381f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53820*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53821*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53822*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53823*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53824*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53825*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53826*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53827*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53828*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53829*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5382a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5382b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5382c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5382d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5382e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5382f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53830*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53831*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53832*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53833*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53834*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53835*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53836*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53837*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53838*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53839*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5383a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5383b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5383c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5383d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5383e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5383f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53840*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53841*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53842*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53843*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53844*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53845*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53846*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53847*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53848*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53849*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5384a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5384b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5384c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5384d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5384e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5384f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53850*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53851*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53852*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53853*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53854*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53855*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53856*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53857*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53858*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53859*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5385a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5385b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5385c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5385d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5385e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5385f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53860*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53861*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53862*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53863*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53864*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53865*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53866*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53867*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53868*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53869*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5386a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5386b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5386c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5386d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5386e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5386f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53870*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53871*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53872*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53873*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53874*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53875*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53876*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53877*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53878*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53879*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5387a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5387b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5387c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5387d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5387e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5387f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53880*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53881*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53882*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53883*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53884*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53885*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53886*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53887*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53888*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53889*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5388a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5388b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5388c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5388d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5388e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5388f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53890*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53891*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53892*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53893*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53894*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53895*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53896*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53897*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53898*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53899*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5389a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5389b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5389c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5389d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5389e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5389f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538a0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538a1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538a2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538a3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538a4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538a5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538a6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538a7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538a8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538a9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538aa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538ab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538ac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538ad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538ae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538af*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538b0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538b1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538b2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538b3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538b4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538b5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538b6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538b7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538b8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538b9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538ba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538bb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538bc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538bd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538be*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538bf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538c0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538c1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538c2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538c3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538c4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538c5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538c6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538c7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538c8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538c9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538ca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538cb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538cc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538cd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538ce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538cf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538d0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538d1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538d2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538d3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538d4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538d5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538d6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538d7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538d8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538d9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538da*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538db*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538dc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538dd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538de*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538df*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538e0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538e1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538e2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538e3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538e4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538e5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538e6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538e7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538e8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538e9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538ea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538eb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538ec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538ed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538ee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538ef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538f0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538f1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538f2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538f3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538f4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538f5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538f6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538f7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538f8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538f9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538fa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538fb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538fc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538fd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538fe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x538ff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53900*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53901*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53902*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53903*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53904*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53905*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53906*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53907*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53908*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53909*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5390a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5390b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5390c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5390d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5390e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5390f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53910*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53911*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53912*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53913*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53914*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53915*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53916*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53917*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53918*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53919*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5391a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5391b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5391c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5391d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5391e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5391f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53920*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53921*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53922*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53923*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53924*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53925*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53926*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53927*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53928*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53929*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5392a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5392b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5392c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5392d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5392e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5392f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53930*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53931*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53932*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53933*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53934*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53935*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53936*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53937*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53938*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53939*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5393a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5393b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5393c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5393d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5393e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5393f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53940*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53941*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53942*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53943*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53944*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53945*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53946*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53947*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53948*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53949*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5394a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5394b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5394c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5394d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5394e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5394f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53950*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53951*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53952*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53953*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53954*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53955*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53956*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53957*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53958*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53959*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5395a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5395b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5395c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5395d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5395e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5395f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53960*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53961*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53962*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53963*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53964*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53965*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53966*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53967*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53968*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53969*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5396a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5396b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5396c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5396d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5396e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5396f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53970*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53971*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53972*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53973*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53974*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53975*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53976*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53977*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53978*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53979*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5397a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5397b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5397c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5397d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5397e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5397f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53980*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53981*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53982*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53983*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53984*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53985*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53986*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53987*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53988*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53989*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5398a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5398b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5398c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5398d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5398e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5398f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53990*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53991*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53992*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53993*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53994*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53995*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53996*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53997*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53998*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53999*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5399a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5399b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5399c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5399d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5399e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5399f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539a0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539a1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539a2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539a3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539a4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539a5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539a6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539a7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539a8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539a9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539aa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539ab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539ac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539ad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539ae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539af*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539b0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539b1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539b2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539b3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539b4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539b5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539b6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539b7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539b8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539b9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539ba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539bb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539bc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539bd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539be*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539bf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539c0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539c1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539c2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539c3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539c4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539c5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539c6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539c7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539c8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539c9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539ca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539cb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539cc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539cd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539ce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539cf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539d0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539d1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539d2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539d3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539d4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539d5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539d6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539d7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539d8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539d9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539da*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539db*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539dc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539dd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539de*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539df*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539e0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539e1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539e2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539e3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539e4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539e5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539e6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539e7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539e8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539e9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539ea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539eb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539ec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539ed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539ee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539ef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539f0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539f1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539f2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539f3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539f4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539f5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539f6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539f7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539f8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539f9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539fa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539fb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539fc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539fd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539fe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x539ff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a00*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a01*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a02*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a03*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a04*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a05*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a06*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a07*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a08*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a09*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a0a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a0b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a0c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a0d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a0e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a0f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a10*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a11*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a12*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a13*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a14*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a15*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a16*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a17*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a18*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a19*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a1a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a1b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a1c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a1d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a1e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a1f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a20*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a21*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a22*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a23*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a24*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a25*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a26*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a27*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a28*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a29*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a2a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a2b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a2c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a2d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a2e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a2f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a30*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a31*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a32*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a33*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a34*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a35*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a36*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a37*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a38*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a39*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a3a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a3b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a3c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a3d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a3e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a3f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a40*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a41*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a42*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a43*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a44*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a45*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a46*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a47*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a48*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a49*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a4a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a4b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a4c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a4d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a4e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a4f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a50*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a51*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a52*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a53*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a54*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a55*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a56*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a57*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a58*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a59*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a5a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a5b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a5c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a5d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a5e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a5f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a60*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a61*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a62*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a63*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a64*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a65*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a66*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a67*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a68*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a69*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a6a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a6b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a6c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a6d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a6e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a6f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a70*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a71*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a72*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a73*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a74*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a75*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a76*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a77*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a78*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a79*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a7a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a7b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a7c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a7d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a7e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a7f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a80*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a81*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a82*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a83*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a84*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a85*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a86*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a87*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a88*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a89*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a8a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a8b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a8c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a8d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a8e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a8f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a90*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a91*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a92*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a93*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a94*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a95*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a96*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a97*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a98*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a99*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a9a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a9b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a9c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a9d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a9e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53a9f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53aa0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53aa1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53aa2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53aa3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53aa4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53aa5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53aa6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53aa7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53aa8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53aa9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53aaa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53aab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53aac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53aad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53aae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53aaf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ab0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ab1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ab2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ab3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ab4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ab5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ab6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ab7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ab8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ab9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53aba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53abb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53abc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53abd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53abe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53abf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ac0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ac1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ac2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ac3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ac4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ac5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ac6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ac7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ac8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ac9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53aca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53acb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53acc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53acd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ace*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53acf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ad0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ad1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ad2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ad3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ad4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ad5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ad6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ad7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ad8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ad9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ada*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53adb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53adc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53add*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ade*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53adf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ae0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ae1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ae2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ae3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ae4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ae5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ae6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ae7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ae8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ae9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53aea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53aeb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53aec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53aed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53aee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53aef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53af0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53af1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53af2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53af3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53af4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53af5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53af6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53af7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53af8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53af9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53afa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53afb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53afc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53afd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53afe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53aff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b00*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b01*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b02*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b03*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b04*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b05*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b06*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b07*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b08*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b09*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b0a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b0b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b0c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b0d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b0e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b0f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b10*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b11*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b12*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b13*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b14*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b15*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b16*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b17*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b18*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b19*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b1a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b1b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b1c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b1d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b1e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b1f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b20*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b21*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b22*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b23*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b24*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b25*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b26*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b27*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b28*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b29*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b2a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b2b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b2c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b2d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b2e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b2f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b30*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b31*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b32*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b33*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b34*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b35*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b36*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b37*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b38*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b39*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b3a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b3b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b3c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b3d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b3e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b3f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b40*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b41*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b42*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b43*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b44*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b45*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b46*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b47*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b48*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b49*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b4a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b4b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b4c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b4d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b4e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b4f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b50*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b51*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b52*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b53*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b54*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b55*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b56*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b57*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b58*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b59*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b5a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b5b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b5c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b5d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b5e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b5f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b60*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b61*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b62*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b63*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b64*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b65*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b66*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b67*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b68*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b69*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b6a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b6b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b6c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b6d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b6e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b6f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b70*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b71*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b72*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b73*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b74*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b75*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b76*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b77*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b78*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b79*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b7a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b7b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b7c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b7d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b7e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b7f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b80*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b81*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b82*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b83*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b84*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b85*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b86*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b87*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b88*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b89*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b8a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b8b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b8c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b8d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b8e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b8f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b90*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b91*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b92*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b93*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b94*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b95*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b96*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b97*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b98*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b99*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b9a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b9b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b9c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b9d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b9e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53b9f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ba0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ba1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ba2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ba3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ba4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ba5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ba6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ba7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ba8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ba9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53baa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53baf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bb0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bb1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bb2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bb3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bb4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bb5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bb6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bb7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bb8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bb9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bbb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bbc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bbd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bbe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bbf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bc0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bc1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bc2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bc3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bc4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bc5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bc6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bc7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bc8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bc9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bcb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bcc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bcd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bcf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bd0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bd1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bd2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bd3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bd4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bd5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bd6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bd7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bd8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bd9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bda*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bdb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bdc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bdd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bde*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bdf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53be0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53be1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53be2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53be3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53be4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53be5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53be6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53be7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53be8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53be9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53beb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bf0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bf1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bf2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bf3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bf4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bf5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bf6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bf7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bf8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bf9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bfa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bfb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bfc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bfd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bfe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53bff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c00*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c01*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c02*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c03*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c04*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c05*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c06*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c07*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c08*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c09*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c0a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c0b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c0c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c0d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c0e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c0f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c10*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c11*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c12*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c13*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c14*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c15*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c16*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c17*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c18*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c19*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c1a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c1b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c1c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c1d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c1e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c1f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c20*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c21*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c22*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c23*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c24*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c25*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c26*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c27*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c28*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c29*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c2a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c2b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c2c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c2d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c2e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c2f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c30*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c31*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c32*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c33*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c34*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c35*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c36*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c37*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c38*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c39*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c3a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c3b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c3c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c3d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c3e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c3f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c40*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c41*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c42*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c43*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c44*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c45*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c46*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c47*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c48*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c49*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c4a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c4b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c4c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c4d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c4e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c4f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c50*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c51*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c52*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c53*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c54*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c55*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c56*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c57*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c58*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c59*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c5a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c5b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c5c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c5d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c5e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c5f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c60*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c61*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c62*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c63*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c64*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c65*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c66*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c67*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c68*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c69*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c6a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c6b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c6c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c6d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c6e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c6f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c70*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c71*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c72*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c73*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c74*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c75*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c76*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c77*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c78*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c79*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c7a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c7b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c7c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c7d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c7e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c7f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c80*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c81*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c82*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c83*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c84*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c85*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c86*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c87*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c88*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c89*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c8a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c8b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c8c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c8d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c8e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c8f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c90*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c91*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c92*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c93*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c94*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c95*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c96*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c97*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c98*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c99*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c9a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c9b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c9c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c9d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c9e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53c9f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ca0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ca1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ca2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ca3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ca4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ca5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ca6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ca7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ca8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ca9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53caa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53caf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cb0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cb1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cb2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cb3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cb4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cb5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cb6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cb7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cb8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cb9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cbb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cbc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cbd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cbe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cbf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cc0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cc1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cc2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cc3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cc4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cc5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cc6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cc7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cc8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cc9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ccb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ccc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ccd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ccf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cd0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cd1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cd2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cd3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cd4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cd5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cd6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cd7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cd8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cd9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cda*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cdb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cdc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cdd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cde*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cdf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ce0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ce1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ce2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ce3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ce4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ce5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ce6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ce7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ce8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ce9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ceb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ced*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cf0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cf1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cf2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cf3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cf4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cf5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cf6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cf7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cf8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cf9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cfa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cfb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cfc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cfd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cfe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53cff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d00*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d01*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d02*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d03*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d04*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d05*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d06*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d07*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d08*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d09*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d0a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d0b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d0c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d0d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d0e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d0f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d10*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d11*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d12*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d13*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d14*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d15*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d16*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d17*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d18*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d19*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d1a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d1b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d1c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d1d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d1e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d1f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d20*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d21*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d22*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d23*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d24*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d25*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d26*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d27*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d28*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d29*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d2a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d2b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d2c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d2d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d2e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d2f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d30*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d31*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d32*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d33*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d34*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d35*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d36*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d37*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d38*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d39*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d3a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d3b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d3c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d3d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d3e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d3f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d40*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d41*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d42*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d43*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d44*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d45*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d46*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d47*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d48*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d49*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d4a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d4b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d4c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d4d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d4e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d4f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d50*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d51*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d52*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d53*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d54*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d55*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d56*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d57*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d58*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d59*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d5a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d5b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d5c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d5d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d5e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d5f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d60*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d61*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d62*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d63*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d64*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d65*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d66*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d67*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d68*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d69*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d6a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d6b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d6c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d6d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d6e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d6f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d70*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d71*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d72*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d73*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d74*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d75*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d76*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d77*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d78*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d79*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d7a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d7b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d7c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d7d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d7e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d7f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d80*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d81*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d82*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d83*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d84*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d85*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d86*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d87*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d88*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d89*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d8a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d8b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d8c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d8d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d8e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d8f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d90*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d91*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d92*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d93*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d94*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d95*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d96*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d97*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d98*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d99*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d9a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d9b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d9c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d9d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d9e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53d9f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53da0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53da1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53da2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53da3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53da4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53da5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53da6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53da7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53da8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53da9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53daa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53dab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53dac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53dad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53dae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53daf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53db0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53db1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53db2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53db3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53db4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53db5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53db6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53db7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53db8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53db9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53dba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53dbb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53dbc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53dbd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53dbe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53dbf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53dc0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53dc1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53dc2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53dc3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53dc4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53dc5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53dc6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53dc7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53dc8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53dc9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53dca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53dcb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53dcc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53dcd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53dce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53dcf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53dd0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53dd1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53dd2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53dd3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53dd4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53dd5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53dd6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53dd7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53dd8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53dd9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53dda*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ddb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ddc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ddd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53dde*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ddf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53de0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53de1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53de2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53de3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53de4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53de5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53de6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53de7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53de8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53de9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53dea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53deb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53dec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ded*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53dee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53def*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53df0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53df1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53df2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53df3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53df4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53df5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53df6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53df7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53df8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53df9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53dfa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53dfb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53dfc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53dfd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53dfe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53dff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e00*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e01*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e02*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e03*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e04*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e05*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e06*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e07*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e08*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e09*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e0a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e0b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e0c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e0d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e0e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e0f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e10*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e11*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e12*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e13*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e14*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e15*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e16*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e17*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e18*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e19*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e1a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e1b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e1c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e1d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e1e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e1f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e20*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e21*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e22*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e23*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e24*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e25*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e26*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e27*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e28*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e29*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e2a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e2b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e2c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e2d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e2e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e2f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e30*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e31*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e32*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e33*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e34*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e35*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e36*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e37*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e38*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e39*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e3a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e3b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e3c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e3d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e3e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e3f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e40*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e41*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e42*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e43*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e44*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e45*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e46*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e47*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e48*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e49*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e4a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e4b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e4c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e4d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e4e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e4f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e50*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e51*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e52*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e53*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e54*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e55*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e56*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e57*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e58*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e59*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e5a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e5b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e5c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e5d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e5e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e5f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e60*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e61*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e62*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e63*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e64*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e65*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e66*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e67*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e68*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e69*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e6a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e6b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e6c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e6d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e6e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e6f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e70*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e71*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e72*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e73*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e74*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e75*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e76*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e77*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e78*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e79*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e7a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e7b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e7c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e7d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e7e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e7f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e80*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e81*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e82*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e83*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e84*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e85*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e86*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e87*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e88*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e89*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e8a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e8b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e8c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e8d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e8e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e8f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e90*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e91*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e92*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e93*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e94*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e95*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e96*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e97*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e98*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e99*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e9a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e9b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e9c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e9d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e9e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53e9f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ea0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ea1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ea2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ea3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ea4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ea5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ea6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ea7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ea8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ea9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53eaa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53eab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53eac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ead*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53eae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53eaf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53eb0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53eb1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53eb2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53eb3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53eb4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53eb5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53eb6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53eb7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53eb8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53eb9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53eba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ebb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ebc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ebd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ebe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ebf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ec0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ec1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ec2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ec3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ec4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ec5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ec6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ec7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ec8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ec9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53eca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ecb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ecc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ecd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ece*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ecf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ed0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ed1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ed2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ed3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ed4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ed5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ed6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ed7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ed8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ed9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53eda*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53edb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53edc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53edd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ede*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53edf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ee0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ee1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ee2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ee3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ee4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ee5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ee6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ee7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ee8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ee9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53eea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53eeb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53eec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53eed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53eee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53eef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ef0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ef1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ef2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ef3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ef4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ef5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ef6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ef7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ef8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ef9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53efa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53efb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53efc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53efd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53efe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53eff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f00*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f01*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f02*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f03*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f04*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f05*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f06*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f07*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f08*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f09*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f0a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f0b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f0c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f0d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f0e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f0f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f10*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f11*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f12*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f13*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f14*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f15*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f16*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f17*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f18*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f19*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f1a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f1b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f1c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f1d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f1e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f1f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f20*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f21*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f22*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f23*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f24*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f25*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f26*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f27*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f28*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f29*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f2a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f2b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f2c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f2d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f2e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f2f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f30*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f31*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f32*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f33*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f34*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f35*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f36*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f37*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f38*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f39*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f3a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f3b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f3c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f3d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f3e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f3f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f40*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f41*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f42*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f43*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f44*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f45*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f46*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f47*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f48*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f49*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f4a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f4b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f4c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f4d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f4e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f4f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f50*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f51*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f52*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f53*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f54*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f55*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f56*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f57*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f58*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f59*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f5a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f5b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f5c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f5d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f5e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f5f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f60*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f61*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f62*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f63*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f64*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f65*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f66*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f67*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f68*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f69*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f6a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f6b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f6c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f6d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f6e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f6f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f70*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f71*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f72*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f73*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f74*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f75*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f76*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f77*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f78*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f79*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f7a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f7b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f7c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f7d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f7e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f7f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f80*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f81*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f82*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f83*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f84*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f85*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f86*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f87*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f88*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f89*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f8a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f8b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f8c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f8d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f8e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f8f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f90*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f91*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f92*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f93*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f94*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f95*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f96*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f97*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f98*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f99*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f9a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f9b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f9c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f9d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f9e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53f9f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fa0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fa1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fa2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fa3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fa4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fa5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fa6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fa7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fa8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fa9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53faa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53faf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fb0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fb1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fb2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fb3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fb4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fb5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fb6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fb7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fb8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fb9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fbb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fbc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fbd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fbe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fbf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fc0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fc1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fc2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fc3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fc4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fc5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fc6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fc7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fc8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fc9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fcb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fcc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fcd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fcf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fd0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fd1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fd2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fd3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fd4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fd5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fd6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fd7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fd8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fd9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fda*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fdb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fdc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fdd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fde*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fdf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fe0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fe1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fe2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fe3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fe4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fe5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fe6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fe7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fe8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fe9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53feb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ff0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ff1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ff2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ff3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ff4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ff5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ff6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ff7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ff8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ff9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ffa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ffb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ffc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ffd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53ffe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x53fff*4+0x02000000,0x0); + + +reg_write( DDR_REG_BASE + 0x000d0000*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000d0000*4 +0x02000000 , 0x00000000 ); + +reg_write( DDR_REG_BASE +0x54000*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54001*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54002*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54003*4+0x02000000,0x854); +reg_write( DDR_REG_BASE +0x54004*4+0x02000000,0x2); +reg_write( DDR_REG_BASE +0x54005*4+0x02000000,0x0); +//iteration place +//PHY VREF +// 0x40 50% +// 0x60 75% +// 0x56 67% +// 0x20 25% +reg_write( DDR_REG_BASE + 0x54006*4+0x02000000,0x60); +reg_write( DDR_REG_BASE +0x54007*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54008*4+0x02000000,0x131f); +reg_write( DDR_REG_BASE +0x54009*4+0x02000000,0xc8); +reg_write( DDR_REG_BASE +0x5400a*4+0x02000000,0x2); +reg_write( DDR_REG_BASE +0x5400b*4+0x02000000,0x0); + +//swap dbyte +reg_write( DDR_REG_BASE + 0x5400d*4+0x02000000,0x8083); +reg_write( DDR_REG_BASE + 0x5400c*4+0x02000000,0x8182); +reg_write( DDR_REG_BASE +0x5400e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5400f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54010*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54011*4+0x02000000,0x120); +reg_write( DDR_REG_BASE +0x54012*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54013*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54014*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54015*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54016*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54017*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54018*4+0x02000000,0xc300); +// iteration place +// DRAM DSEL Output Impedance -higher 8 bit +// MR3_A0/A1/B0/B1 + //0x2:(default: output driver impedance 40 pulldown&pullup) + //0x1:(34.3 pulldown&pullup ) + //0x3:(48) + //0x4:(reserve for 60) optional + //0x6:(reserve for 80) optional + //0x9:(34.3 pulldown & 40 pull up + //0xa:(40 pulldown & 48 pull up + //0xb:(34.3 pulldown & 48 pull up +reg_write( DDR_REG_BASE +0x54019*4+0x02000000,0x41e); +reg_write( DDR_REG_BASE +0x5401d*4+0x02000000,0x41e); +reg_write( DDR_REG_BASE +0x5402c*4+0x02000000,0x41e); +reg_write( DDR_REG_BASE +0x54030*4+0x02000000,0x41e); + +//iteration place +//DRAM DQ ODT -higher 8 bit + //0x0:(default: DQ odt disable) + //0x5:(ODT:60) + //0x6:(ODT:120) + //0x7:(ODT:240) +reg_write( DDR_REG_BASE +0x5401a*4+0x02000000,0x600); +reg_write( DDR_REG_BASE +0x5401e*4+0x02000000,0x600); +reg_write( DDR_REG_BASE +0x5402d*4+0x02000000,0x600); +reg_write( DDR_REG_BASE +0x54031*4+0x02000000,0x600); + + +reg_write( DDR_REG_BASE +0x5401b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5401c*4+0x02000000,0xc300); + + + + +reg_write( DDR_REG_BASE +0x5401f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54020*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54021*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54022*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54023*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54024*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54025*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54026*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54027*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54028*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54029*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5402a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5402b*4+0x02000000,0xc300); + + +reg_write( DDR_REG_BASE +0x5402e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5402f*4+0x02000000,0xc300); + + +reg_write( DDR_REG_BASE +0x54032*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54033*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54034*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54035*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54036*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54037*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54038*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54039*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5403a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5403b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5403c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5403d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5403e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5403f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54040*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54041*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54042*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54043*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54044*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54045*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54046*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54047*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54048*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54049*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5404a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5404b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5404c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5404d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5404e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5404f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54050*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54051*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54052*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54053*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54054*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54055*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54056*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54057*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54058*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54059*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5405a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5405b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5405c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5405d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5405e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5405f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54060*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54061*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54062*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54063*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54064*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54065*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54066*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54067*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54068*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54069*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5406a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5406b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5406c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5406d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5406e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5406f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54070*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54071*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54072*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54073*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54074*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54075*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54076*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54077*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54078*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54079*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5407a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5407b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5407c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5407d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5407e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5407f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54080*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54081*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54082*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54083*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54084*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54085*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54086*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54087*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54088*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54089*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5408a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5408b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5408c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5408d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5408e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5408f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54090*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54091*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54092*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54093*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54094*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54095*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54096*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54097*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54098*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54099*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5409a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5409b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5409c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5409d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5409e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5409f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540a0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540a1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540a2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540a3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540a4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540a5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540a6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540a7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540a8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540a9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540aa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540ab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540ac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540ad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540ae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540af*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540b0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540b1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540b2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540b3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540b4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540b5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540b6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540b7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540b8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540b9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540ba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540bb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540bc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540bd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540be*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540bf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540c0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540c1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540c2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540c3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540c4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540c5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540c6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540c7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540c8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540c9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540ca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540cb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540cc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540cd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540ce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540cf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540d0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540d1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540d2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540d3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540d4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540d5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540d6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540d7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540d8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540d9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540da*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540db*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540dc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540dd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540de*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540df*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540e0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540e1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540e2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540e3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540e4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540e5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540e6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540e7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540e8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540e9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540ea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540eb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540ec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540ed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540ee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540ef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540f0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540f1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540f2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540f3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540f4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540f5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540f6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540f7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540f8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540f9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540fa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540fb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540fc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540fd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540fe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x540ff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54100*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54101*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54102*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54103*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54104*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54105*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54106*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54107*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54108*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54109*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5410a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5410b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5410c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5410d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5410e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5410f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54110*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54111*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54112*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54113*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54114*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54115*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54116*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54117*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54118*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54119*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5411a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5411b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5411c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5411d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5411e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5411f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54120*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54121*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54122*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54123*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54124*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54125*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54126*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54127*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54128*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54129*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5412a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5412b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5412c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5412d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5412e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5412f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54130*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54131*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54132*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54133*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54134*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54135*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54136*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54137*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54138*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54139*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5413a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5413b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5413c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5413d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5413e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5413f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54140*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54141*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54142*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54143*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54144*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54145*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54146*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54147*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54148*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54149*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5414a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5414b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5414c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5414d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5414e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5414f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54150*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54151*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54152*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54153*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54154*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54155*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54156*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54157*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54158*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54159*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5415a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5415b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5415c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5415d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5415e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5415f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54160*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54161*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54162*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54163*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54164*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54165*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54166*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54167*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54168*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54169*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5416a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5416b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5416c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5416d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5416e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5416f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54170*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54171*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54172*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54173*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54174*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54175*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54176*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54177*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54178*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54179*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5417a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5417b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5417c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5417d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5417e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5417f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54180*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54181*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54182*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54183*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54184*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54185*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54186*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54187*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54188*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54189*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5418a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5418b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5418c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5418d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5418e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5418f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54190*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54191*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54192*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54193*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54194*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54195*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54196*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54197*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54198*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54199*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5419a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5419b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5419c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5419d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5419e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5419f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541a0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541a1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541a2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541a3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541a4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541a5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541a6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541a7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541a8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541a9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541aa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541ab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541ac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541ad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541ae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541af*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541b0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541b1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541b2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541b3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541b4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541b5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541b6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541b7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541b8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541b9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541ba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541bb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541bc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541bd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541be*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541bf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541c0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541c1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541c2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541c3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541c4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541c5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541c6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541c7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541c8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541c9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541ca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541cb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541cc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541cd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541ce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541cf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541d0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541d1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541d2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541d3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541d4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541d5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541d6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541d7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541d8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541d9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541da*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541db*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541dc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541dd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541de*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541df*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541e0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541e1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541e2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541e3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541e4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541e5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541e6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541e7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541e8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541e9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541ea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541eb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541ec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541ed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541ee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541ef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541f0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541f1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541f2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541f3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541f4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541f5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541f6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541f7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541f8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541f9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541fa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541fb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541fc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541fd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541fe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x541ff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54200*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54201*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54202*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54203*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54204*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54205*4+0x02000000,0xff); +reg_write( DDR_REG_BASE +0x54206*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54207*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54208*4+0x02000000,0x14a); +reg_write( DDR_REG_BASE +0x54209*4+0x02000000,0x181); +reg_write( DDR_REG_BASE +0x5420a*4+0x02000000,0x118); +reg_write( DDR_REG_BASE +0x5420b*4+0x02000000,0x118); +reg_write( DDR_REG_BASE +0x5420c*4+0x02000000,0x16f); +reg_write( DDR_REG_BASE +0x5420d*4+0x02000000,0x16f); +reg_write( DDR_REG_BASE +0x5420e*4+0x02000000,0x159); +reg_write( DDR_REG_BASE +0x5420f*4+0x02000000,0x181); +reg_write( DDR_REG_BASE +0x54210*4+0x02000000,0x120); +reg_write( DDR_REG_BASE +0x54211*4+0x02000000,0x120); +reg_write( DDR_REG_BASE +0x54212*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54213*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54214*4+0x02000000,0x701c); +reg_write( DDR_REG_BASE +0x54215*4+0x02000000,0x61a8); +reg_write( DDR_REG_BASE +0x54216*4+0x02000000,0x35ac); +reg_write( DDR_REG_BASE +0x54217*4+0x02000000,0x35ac); +reg_write( DDR_REG_BASE +0x54218*4+0x02000000,0x125c); +reg_write( DDR_REG_BASE +0x54219*4+0x02000000,0x125c); +reg_write( DDR_REG_BASE +0x5421a*4+0x02000000,0xc738); +reg_write( DDR_REG_BASE +0x5421b*4+0x02000000,0xb0f4); +reg_write( DDR_REG_BASE +0x5421c*4+0x02000000,0x6590); +reg_write( DDR_REG_BASE +0x5421d*4+0x02000000,0x6590); +reg_write( DDR_REG_BASE +0x5421e*4+0x02000000,0x9f38); +reg_write( DDR_REG_BASE +0x5421f*4+0x02000000,0x58); +reg_write( DDR_REG_BASE +0x54220*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54221*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54222*4+0x02000000,0xf01f); +reg_write( DDR_REG_BASE +0x54223*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x54224*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54225*4+0x02000000,0xffb4); +reg_write( DDR_REG_BASE +0x54226*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x54227*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x54228*4+0x02000000,0xf0b4); +reg_write( DDR_REG_BASE +0x54229*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x5422a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5422b*4+0x02000000,0xf4b4); +reg_write( DDR_REG_BASE +0x5422c*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x5422d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5422e*4+0x02000000,0xf0b9); +reg_write( DDR_REG_BASE +0x5422f*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x54230*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54231*4+0x02000000,0xf0ba); +reg_write( DDR_REG_BASE +0x54232*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x54233*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54234*4+0x02000000,0xf0bb); +reg_write( DDR_REG_BASE +0x54235*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x54236*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54237*4+0x02000000,0xf001); +reg_write( DDR_REG_BASE +0x54238*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x54239*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5423a*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE +0x5423b*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x5423c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5423d*4+0x02000000,0xf0f9); +reg_write( DDR_REG_BASE +0x5423e*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x5423f*4+0x02000000,0x200); +reg_write( DDR_REG_BASE +0x54240*4+0x02000000,0xf0fa); +reg_write( DDR_REG_BASE +0x54241*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x54242*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54243*4+0x02000000,0xf0fb); +reg_write( DDR_REG_BASE +0x54244*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x54245*4+0x02000000,0x400); +reg_write( DDR_REG_BASE +0x54246*4+0x02000000,0xf060); +reg_write( DDR_REG_BASE +0x54247*4+0x02000000,0x7); +reg_write( DDR_REG_BASE +0x54248*4+0x02000000,0x8); +reg_write( DDR_REG_BASE +0x54249*4+0x02000000,0xf065); +reg_write( DDR_REG_BASE +0x5424a*4+0x02000000,0x7); +reg_write( DDR_REG_BASE +0x5424b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5424c*4+0x02000000,0xff62); +reg_write( DDR_REG_BASE +0x5424d*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x5424e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5424f*4+0x02000000,0xf002); +reg_write( DDR_REG_BASE +0x54250*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x54251*4+0x02000000,0x220); +reg_write( DDR_REG_BASE +0x54252*4+0x02000000,0xf01f); +reg_write( DDR_REG_BASE +0x54253*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x54254*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54255*4+0x02000000,0xffb4); +reg_write( DDR_REG_BASE +0x54256*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x54257*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x54258*4+0x02000000,0xf0b4); +reg_write( DDR_REG_BASE +0x54259*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x5425a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5425b*4+0x02000000,0xf4b4); +reg_write( DDR_REG_BASE +0x5425c*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x5425d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5425e*4+0x02000000,0xf0b9); +reg_write( DDR_REG_BASE +0x5425f*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x54260*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54261*4+0x02000000,0xf0ba); +reg_write( DDR_REG_BASE +0x54262*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x54263*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54264*4+0x02000000,0xf0bb); +reg_write( DDR_REG_BASE +0x54265*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x54266*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54267*4+0x02000000,0xf001); +reg_write( DDR_REG_BASE +0x54268*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x54269*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5426a*4+0x02000000,0xf0f9); +reg_write( DDR_REG_BASE +0x5426b*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x5426c*4+0x02000000,0x200); +reg_write( DDR_REG_BASE +0x5426d*4+0x02000000,0xf0fa); +reg_write( DDR_REG_BASE +0x5426e*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x5426f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54270*4+0x02000000,0xf0fb); +reg_write( DDR_REG_BASE +0x54271*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x54272*4+0x02000000,0x400); +reg_write( DDR_REG_BASE +0x54273*4+0x02000000,0xf060); +reg_write( DDR_REG_BASE +0x54274*4+0x02000000,0x7); +reg_write( DDR_REG_BASE +0x54275*4+0x02000000,0x5); +reg_write( DDR_REG_BASE +0x54276*4+0x02000000,0xf065); +reg_write( DDR_REG_BASE +0x54277*4+0x02000000,0x7); +reg_write( DDR_REG_BASE +0x54278*4+0x02000000,0x1ff); +reg_write( DDR_REG_BASE +0x54279*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE +0x5427a*4+0x02000000,0x7); +reg_write( DDR_REG_BASE +0x5427b*4+0x02000000,0x10); +reg_write( DDR_REG_BASE +0x5427c*4+0x02000000,0xff62); +reg_write( DDR_REG_BASE +0x5427d*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x5427e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5427f*4+0x02000000,0xf862); +reg_write( DDR_REG_BASE +0x54280*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x54281*4+0x02000000,0xfd); +reg_write( DDR_REG_BASE +0x54282*4+0x02000000,0xf002); +reg_write( DDR_REG_BASE +0x54283*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x54284*4+0x02000000,0x220); +reg_write( DDR_REG_BASE +0x54285*4+0x02000000,0xf01f); +reg_write( DDR_REG_BASE +0x54286*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x54287*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54288*4+0x02000000,0xffb4); +reg_write( DDR_REG_BASE +0x54289*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x5428a*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x5428b*4+0x02000000,0xf0b4); +reg_write( DDR_REG_BASE +0x5428c*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x5428d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5428e*4+0x02000000,0xf4b4); +reg_write( DDR_REG_BASE +0x5428f*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x54290*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54291*4+0x02000000,0xf0b9); +reg_write( DDR_REG_BASE +0x54292*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x54293*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54294*4+0x02000000,0xf0ba); +reg_write( DDR_REG_BASE +0x54295*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x54296*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54297*4+0x02000000,0xf0bb); +reg_write( DDR_REG_BASE +0x54298*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x54299*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5429a*4+0x02000000,0xf001); +reg_write( DDR_REG_BASE +0x5429b*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x5429c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5429d*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE +0x5429e*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x5429f*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x542a0*4+0x02000000,0xf012); +reg_write( DDR_REG_BASE +0x542a1*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x542a2*4+0x02000000,0xf000); +reg_write( DDR_REG_BASE +0x542a3*4+0x02000000,0xf018); +reg_write( DDR_REG_BASE +0x542a4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x542a5*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x542a6*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE +0x542a7*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x542a8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x542a9*4+0x02000000,0xf0f9); +reg_write( DDR_REG_BASE +0x542aa*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x542ab*4+0x02000000,0x200); +reg_write( DDR_REG_BASE +0x542ac*4+0x02000000,0xf0fa); +reg_write( DDR_REG_BASE +0x542ad*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x542ae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x542af*4+0x02000000,0xf0fb); +reg_write( DDR_REG_BASE +0x542b0*4+0x02000000,0x4); +reg_write( DDR_REG_BASE +0x542b1*4+0x02000000,0x400); +reg_write( DDR_REG_BASE +0x542b2*4+0x02000000,0xff62); +reg_write( DDR_REG_BASE +0x542b3*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x542b4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x542b5*4+0x02000000,0xf062); +reg_write( DDR_REG_BASE +0x542b6*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x542b7*4+0x02000000,0xf); +reg_write( DDR_REG_BASE +0x542b8*4+0x02000000,0xf462); +reg_write( DDR_REG_BASE +0x542b9*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x542ba*4+0x02000000,0xf0); +reg_write( DDR_REG_BASE +0x542bb*4+0x02000000,0xf002); +reg_write( DDR_REG_BASE +0x542bc*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x542bd*4+0x02000000,0x204); +reg_write( DDR_REG_BASE +0x542be*4+0x02000000,0xf01f); +reg_write( DDR_REG_BASE +0x542bf*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x542c0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x542c1*4+0x02000000,0xf03b); +reg_write( DDR_REG_BASE +0x542c2*4+0x02000000,0x2); +reg_write( DDR_REG_BASE +0x542c3*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x542c4*4+0x02000000,0xffb2); +reg_write( DDR_REG_BASE +0x542c5*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x542c6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x542c7*4+0x02000000,0xf0b2); +reg_write( DDR_REG_BASE +0x542c8*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x542c9*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x542ca*4+0x02000000,0xffb4); +reg_write( DDR_REG_BASE +0x542cb*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x542cc*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x542cd*4+0x02000000,0xf0b4); +reg_write( DDR_REG_BASE +0x542ce*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x542cf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x542d0*4+0x02000000,0xf0b9); +reg_write( DDR_REG_BASE +0x542d1*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x542d2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x542d3*4+0x02000000,0xf0ba); +reg_write( DDR_REG_BASE +0x542d4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x542d5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x542d6*4+0x02000000,0xf0bb); +reg_write( DDR_REG_BASE +0x542d7*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x542d8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x542d9*4+0x02000000,0xf001); +reg_write( DDR_REG_BASE +0x542da*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x542db*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x542dc*4+0x02000000,0xf060); +reg_write( DDR_REG_BASE +0x542dd*4+0x02000000,0x7); +reg_write( DDR_REG_BASE +0x542de*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x542df*4+0x02000000,0xf065); +reg_write( DDR_REG_BASE +0x542e0*4+0x02000000,0x7); +reg_write( DDR_REG_BASE +0x542e1*4+0x02000000,0x1ff); +reg_write( DDR_REG_BASE +0x542e2*4+0x02000000,0xff26); +reg_write( DDR_REG_BASE +0x542e3*4+0x02000000,0x7); +reg_write( DDR_REG_BASE +0x542e4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x542e5*4+0x02000000,0xff27); +reg_write( DDR_REG_BASE +0x542e6*4+0x02000000,0x7); +reg_write( DDR_REG_BASE +0x542e7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x542e8*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE +0x542e9*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x542ea*4+0x02000000,0x2); +reg_write( DDR_REG_BASE +0x542eb*4+0x02000000,0xff32); +reg_write( DDR_REG_BASE +0x542ec*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x542ed*4+0x02000000,0x800); +reg_write( DDR_REG_BASE +0x542ee*4+0x02000000,0xff62); +reg_write( DDR_REG_BASE +0x542ef*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x542f0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x542f1*4+0x02000000,0xf062); +reg_write( DDR_REG_BASE +0x542f2*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x542f3*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x542f4*4+0x02000000,0xf462); +reg_write( DDR_REG_BASE +0x542f5*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x542f6*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x542f7*4+0x02000000,0xf002); +reg_write( DDR_REG_BASE +0x542f8*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x542f9*4+0x02000000,0x208); +reg_write( DDR_REG_BASE +0x542fa*4+0x02000000,0xf01f); +reg_write( DDR_REG_BASE +0x542fb*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x542fc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x542fd*4+0x02000000,0xffb2); +reg_write( DDR_REG_BASE +0x542fe*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x542ff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54300*4+0x02000000,0xf0b2); +reg_write( DDR_REG_BASE +0x54301*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x54302*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x54303*4+0x02000000,0xf4b2); +reg_write( DDR_REG_BASE +0x54304*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x54305*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x54306*4+0x02000000,0xffb4); +reg_write( DDR_REG_BASE +0x54307*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x54308*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x54309*4+0x02000000,0xf0b4); +reg_write( DDR_REG_BASE +0x5430a*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x5430b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5430c*4+0x02000000,0xf4b4); +reg_write( DDR_REG_BASE +0x5430d*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x5430e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5430f*4+0x02000000,0xf0b9); +reg_write( DDR_REG_BASE +0x54310*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x54311*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54312*4+0x02000000,0xf0ba); +reg_write( DDR_REG_BASE +0x54313*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x54314*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54315*4+0x02000000,0xf0bb); +reg_write( DDR_REG_BASE +0x54316*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x54317*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54318*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE +0x54319*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x5431a*4+0x02000000,0x101); +reg_write( DDR_REG_BASE +0x5431b*4+0x02000000,0xf012); +reg_write( DDR_REG_BASE +0x5431c*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x5431d*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x5431e*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE +0x5431f*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x54320*4+0x02000000,0x2); +reg_write( DDR_REG_BASE +0x54321*4+0x02000000,0xf018); +reg_write( DDR_REG_BASE +0x54322*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x54323*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x54324*4+0x02000000,0xf060); +reg_write( DDR_REG_BASE +0x54325*4+0x02000000,0x7); +reg_write( DDR_REG_BASE +0x54326*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x54327*4+0x02000000,0xf065); +reg_write( DDR_REG_BASE +0x54328*4+0x02000000,0x7); +reg_write( DDR_REG_BASE +0x54329*4+0x02000000,0x1ff); +reg_write( DDR_REG_BASE +0x5432a*4+0x02000000,0xff26); +reg_write( DDR_REG_BASE +0x5432b*4+0x02000000,0x7); +reg_write( DDR_REG_BASE +0x5432c*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE +0x5432d*4+0x02000000,0xff27); +reg_write( DDR_REG_BASE +0x5432e*4+0x02000000,0x7); +reg_write( DDR_REG_BASE +0x5432f*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE +0x54330*4+0x02000000,0xff62); +reg_write( DDR_REG_BASE +0x54331*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x54332*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54333*4+0x02000000,0xf062); +reg_write( DDR_REG_BASE +0x54334*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x54335*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x54336*4+0x02000000,0xf462); +reg_write( DDR_REG_BASE +0x54337*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x54338*4+0x02000000,0x10); +reg_write( DDR_REG_BASE +0x54339*4+0x02000000,0xff32); +reg_write( DDR_REG_BASE +0x5433a*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x5433b*4+0x02000000,0x800); +reg_write( DDR_REG_BASE +0x5433c*4+0x02000000,0xf002); +reg_write( DDR_REG_BASE +0x5433d*4+0x02000000,0x1); +reg_write( DDR_REG_BASE +0x5433e*4+0x02000000,0x210); +reg_write( DDR_REG_BASE +0x5433f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54340*4+0x02000000,0x201); +reg_write( DDR_REG_BASE +0x54341*4+0x02000000,0xb03); +reg_write( DDR_REG_BASE +0x54342*4+0x02000000,0x1110); +reg_write( DDR_REG_BASE +0x54343*4+0x02000000,0x2a29); +reg_write( DDR_REG_BASE +0x54344*4+0x02000000,0x6e30); +reg_write( DDR_REG_BASE +0x54345*4+0x02000000,0x200); +reg_write( DDR_REG_BASE +0x54346*4+0x02000000,0x100); +reg_write( DDR_REG_BASE +0x54347*4+0x02000000,0xfd00); +reg_write( DDR_REG_BASE +0x54348*4+0x02000000,0x400); +reg_write( DDR_REG_BASE +0x54349*4+0x02000000,0xf00); +reg_write( DDR_REG_BASE +0x5434a*4+0x02000000,0x6000); +reg_write( DDR_REG_BASE +0x5434b*4+0x02000000,0x700); +reg_write( DDR_REG_BASE +0x5434c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x5434d*4+0x02000000,0xe800); +reg_write( DDR_REG_BASE +0x5434e*4+0x02000000,0x400); +reg_write( DDR_REG_BASE +0x5434f*4+0x02000000,0xff00); +reg_write( DDR_REG_BASE +0x54350*4+0x02000000,0xfc00); +reg_write( DDR_REG_BASE +0x54351*4+0x02000000,0x400); +reg_write( DDR_REG_BASE +0x54352*4+0x02000000,0x400); +reg_write( DDR_REG_BASE +0x54353*4+0x02000000,0x3a04); +reg_write( DDR_REG_BASE +0x54354*4+0x02000000,0x200); +reg_write( DDR_REG_BASE +0x54355*4+0x02000000,0x200); +reg_write( DDR_REG_BASE +0x54356*4+0x02000000,0x1100); +reg_write( DDR_REG_BASE +0x54357*4+0x02000000,0x700); +reg_write( DDR_REG_BASE +0x54358*4+0x02000000,0x0); +reg_write( DDR_REG_BASE +0x54359*4+0x02000000,0x0); + + +reg_write( DDR_REG_BASE + 0x000d0000*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000d0000*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000d0099*4 +0x02000000 , 0x00000009 ); +reg_write( DDR_REG_BASE + 0x000d0099*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000d0099*4 +0x02000000 , 0x00000000 ); + + + +while((train_data&0x7) !=0x07){ + + reg_read ( DDR_REG_BASE + 0x000d0004*4 +0x02000000 , data ); + while((data&0x1) !=0x0){ + reg_read ( DDR_REG_BASE + 0x000d0004*4 +0x02000000 , data ); + } + + + + reg_read ( DDR_REG_BASE + 0x000d0032*4 +0x02000000 , train_data ); + switch(train_data) + { + case 0x00000000: printf("%08X: PMU Major Msg: End of initialization \n",train_data);break; + case 0x00000001: printf("%08X: PMU Major Msg: End of fine write leveling \n",train_data);break; + case 0x00000002: printf("%08X: PMU Major Msg: End of read enable training \n",train_data);break; + case 0x00000003: printf("%08X: PMU Major Msg: End of read delay center optimization \n",train_data);break; + case 0x00000004: printf("%08X: PMU Major Msg: End of write delay center optimization \n",train_data);break; + case 0x00000005: printf("%08X: PMU Major Msg: End of 2D read delay/voltage center optimization \n",train_data);break; + case 0x00000006: printf("%08X: PMU Major Msg: End of 2D write delay /voltage center optimization \n",train_data);break; + case 0x00000007: printf("%08X: PMU Major Msg: Firmware run has completed \n",train_data);break; + case 0x00000008: printf("%08X: PMU Major Msg: Enter streaming message mode \n",train_data);break; + case 0x00000009: printf("%08X: PMU Major Msg: End of max read latency training \n",train_data);break; + case 0x0000000a: printf("%08X: PMU Major Msg: End of read dq deskew training \n",train_data);break; + case 0x0000000b: printf("%08X: PMU Major Msg: End of LCDL offset calibration \n",train_data);break; + case 0x0000000c: printf("%08X: PMU Major Msg: End of LRDIMM Specific training (DWL, MREP, MRD and MWD) \n",train_data);break; + case 0x0000000d: printf("%08X: PMU Major Msg: End of CA training \n",train_data);break; + case 0x000000fd: printf("%08X: PMU Major Msg: End of MPR read delay center optimization \n",train_data);break; + case 0x000000fe: printf("%08X: PMU Major Msg: End of Write leveling coarse delay \n",train_data);break; + case 0x000000ff: printf("%08X: PMU Major Msg: FATAL ERROR. \n",train_data);break; + default: printf("%08X: PMU Major Msg: Un-recognized message... ! \n",train_data);break; + } + + reg_write( DDR_REG_BASE + 0x000d0031*4 +0x02000000 , 0x00000000 ); + reg_read ( DDR_REG_BASE + 0x000d0004*4 +0x02000000 , data ); + while((data&0x1) ==0x0){ + reg_read ( DDR_REG_BASE + 0x000d0004*4 +0x02000000 , data ); + } + reg_write( DDR_REG_BASE + 0x000d0031*4 +0x02000000 , 0x00000001 ); + +} + +train_data=0; + + + +reg_write( DDR_REG_BASE + 0x000d0099*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000d0000*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000d0000*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000d0000*4 +0x02000000 , 0x00000000 ); + + + + +reg_write( DDR_REG_BASE + 0x00090000*4 +0x02000000 , 0x00000010 ); +reg_write( DDR_REG_BASE + 0x00090001*4 +0x02000000 , 0x00000400 ); +reg_write( DDR_REG_BASE + 0x00090002*4 +0x02000000 , 0x0000010e ); +reg_write( DDR_REG_BASE + 0x00090003*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00090004*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00090005*4 +0x02000000 , 0x00000008 ); +reg_write( DDR_REG_BASE + 0x00090029*4 +0x02000000 , 0x0000000b ); +reg_write( DDR_REG_BASE + 0x0009002a*4 +0x02000000 , 0x00000480 ); +reg_write( DDR_REG_BASE + 0x0009002b*4 +0x02000000 , 0x00000109 ); +reg_write( DDR_REG_BASE + 0x0009002c*4 +0x02000000 , 0x00000008 ); +reg_write( DDR_REG_BASE + 0x0009002d*4 +0x02000000 , 0x00000448 ); +reg_write( DDR_REG_BASE + 0x0009002e*4 +0x02000000 , 0x00000139 ); +reg_write( DDR_REG_BASE + 0x0009002f*4 +0x02000000 , 0x00000008 ); +reg_write( DDR_REG_BASE + 0x00090030*4 +0x02000000 , 0x00000478 ); +reg_write( DDR_REG_BASE + 0x00090031*4 +0x02000000 , 0x00000109 ); +reg_write( DDR_REG_BASE + 0x00090032*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00090033*4 +0x02000000 , 0x000000e8 ); +reg_write( DDR_REG_BASE + 0x00090034*4 +0x02000000 , 0x00000109 ); +reg_write( DDR_REG_BASE + 0x00090035*4 +0x02000000 , 0x00000002 ); +reg_write( DDR_REG_BASE + 0x00090036*4 +0x02000000 , 0x00000010 ); +reg_write( DDR_REG_BASE + 0x00090037*4 +0x02000000 , 0x00000139 ); +reg_write( DDR_REG_BASE + 0x00090038*4 +0x02000000 , 0x0000000b ); +reg_write( DDR_REG_BASE + 0x00090039*4 +0x02000000 , 0x000007c0 ); +reg_write( DDR_REG_BASE + 0x0009003a*4 +0x02000000 , 0x00000139 ); +reg_write( DDR_REG_BASE + 0x0009003b*4 +0x02000000 , 0x00000044 ); +reg_write( DDR_REG_BASE + 0x0009003c*4 +0x02000000 , 0x00000633 ); +reg_write( DDR_REG_BASE + 0x0009003d*4 +0x02000000 , 0x00000159 ); +reg_write( DDR_REG_BASE + 0x0009003e*4 +0x02000000 , 0x0000014f ); +reg_write( DDR_REG_BASE + 0x0009003f*4 +0x02000000 , 0x00000630 ); +reg_write( DDR_REG_BASE + 0x00090040*4 +0x02000000 , 0x00000159 ); +reg_write( DDR_REG_BASE + 0x00090041*4 +0x02000000 , 0x00000047 ); +reg_write( DDR_REG_BASE + 0x00090042*4 +0x02000000 , 0x00000633 ); +reg_write( DDR_REG_BASE + 0x00090043*4 +0x02000000 , 0x00000149 ); +reg_write( DDR_REG_BASE + 0x00090044*4 +0x02000000 , 0x0000004f ); +reg_write( DDR_REG_BASE + 0x00090045*4 +0x02000000 , 0x00000633 ); +reg_write( DDR_REG_BASE + 0x00090046*4 +0x02000000 , 0x00000179 ); +reg_write( DDR_REG_BASE + 0x00090047*4 +0x02000000 , 0x00000008 ); +reg_write( DDR_REG_BASE + 0x00090048*4 +0x02000000 , 0x000000e0 ); +reg_write( DDR_REG_BASE + 0x00090049*4 +0x02000000 , 0x00000109 ); +reg_write( DDR_REG_BASE + 0x0009004a*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x0009004b*4 +0x02000000 , 0x000007c8 ); +reg_write( DDR_REG_BASE + 0x0009004c*4 +0x02000000 , 0x00000109 ); +reg_write( DDR_REG_BASE + 0x0009004d*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x0009004e*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x0009004f*4 +0x02000000 , 0x00000008 ); +reg_write( DDR_REG_BASE + 0x00090050*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00090051*4 +0x02000000 , 0x0000045a ); +reg_write( DDR_REG_BASE + 0x00090052*4 +0x02000000 , 0x00000009 ); +reg_write( DDR_REG_BASE + 0x00090053*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00090054*4 +0x02000000 , 0x00000448 ); +reg_write( DDR_REG_BASE + 0x00090055*4 +0x02000000 , 0x00000109 ); +reg_write( DDR_REG_BASE + 0x00090056*4 +0x02000000 , 0x00000040 ); +reg_write( DDR_REG_BASE + 0x00090057*4 +0x02000000 , 0x00000633 ); +reg_write( DDR_REG_BASE + 0x00090058*4 +0x02000000 , 0x00000179 ); +reg_write( DDR_REG_BASE + 0x00090059*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x0009005a*4 +0x02000000 , 0x00000618 ); +reg_write( DDR_REG_BASE + 0x0009005b*4 +0x02000000 , 0x00000109 ); +reg_write( DDR_REG_BASE + 0x0009005c*4 +0x02000000 , 0x000040c0 ); +reg_write( DDR_REG_BASE + 0x0009005d*4 +0x02000000 , 0x00000633 ); +reg_write( DDR_REG_BASE + 0x0009005e*4 +0x02000000 , 0x00000149 ); +reg_write( DDR_REG_BASE + 0x0009005f*4 +0x02000000 , 0x00000008 ); +reg_write( DDR_REG_BASE + 0x00090060*4 +0x02000000 , 0x00000004 ); +reg_write( DDR_REG_BASE + 0x00090061*4 +0x02000000 , 0x00000048 ); +reg_write( DDR_REG_BASE + 0x00090062*4 +0x02000000 , 0x00004040 ); +reg_write( DDR_REG_BASE + 0x00090063*4 +0x02000000 , 0x00000633 ); +reg_write( DDR_REG_BASE + 0x00090064*4 +0x02000000 , 0x00000149 ); +reg_write( DDR_REG_BASE + 0x00090065*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00090066*4 +0x02000000 , 0x00000004 ); +reg_write( DDR_REG_BASE + 0x00090067*4 +0x02000000 , 0x00000048 ); +reg_write( DDR_REG_BASE + 0x00090068*4 +0x02000000 , 0x00000040 ); +reg_write( DDR_REG_BASE + 0x00090069*4 +0x02000000 , 0x00000633 ); +reg_write( DDR_REG_BASE + 0x0009006a*4 +0x02000000 , 0x00000149 ); +reg_write( DDR_REG_BASE + 0x0009006b*4 +0x02000000 , 0x00000010 ); +reg_write( DDR_REG_BASE + 0x0009006c*4 +0x02000000 , 0x00000004 ); +reg_write( DDR_REG_BASE + 0x0009006d*4 +0x02000000 , 0x00000018 ); +reg_write( DDR_REG_BASE + 0x0009006e*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x0009006f*4 +0x02000000 , 0x00000004 ); +reg_write( DDR_REG_BASE + 0x00090070*4 +0x02000000 , 0x00000078 ); +reg_write( DDR_REG_BASE + 0x00090071*4 +0x02000000 , 0x00000549 ); +reg_write( DDR_REG_BASE + 0x00090072*4 +0x02000000 , 0x00000633 ); +reg_write( DDR_REG_BASE + 0x00090073*4 +0x02000000 , 0x00000159 ); +reg_write( DDR_REG_BASE + 0x00090074*4 +0x02000000 , 0x00000d49 ); +reg_write( DDR_REG_BASE + 0x00090075*4 +0x02000000 , 0x00000633 ); +reg_write( DDR_REG_BASE + 0x00090076*4 +0x02000000 , 0x00000159 ); +reg_write( DDR_REG_BASE + 0x00090077*4 +0x02000000 , 0x0000094a ); +reg_write( DDR_REG_BASE + 0x00090078*4 +0x02000000 , 0x00000633 ); +reg_write( DDR_REG_BASE + 0x00090079*4 +0x02000000 , 0x00000159 ); +reg_write( DDR_REG_BASE + 0x0009007a*4 +0x02000000 , 0x00000441 ); +reg_write( DDR_REG_BASE + 0x0009007b*4 +0x02000000 , 0x00000633 ); +reg_write( DDR_REG_BASE + 0x0009007c*4 +0x02000000 , 0x00000149 ); +reg_write( DDR_REG_BASE + 0x0009007d*4 +0x02000000 , 0x00000042 ); +reg_write( DDR_REG_BASE + 0x0009007e*4 +0x02000000 , 0x00000633 ); +reg_write( DDR_REG_BASE + 0x0009007f*4 +0x02000000 , 0x00000149 ); +reg_write( DDR_REG_BASE + 0x00090080*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x00090081*4 +0x02000000 , 0x00000633 ); +reg_write( DDR_REG_BASE + 0x00090082*4 +0x02000000 , 0x00000149 ); +reg_write( DDR_REG_BASE + 0x00090083*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00090084*4 +0x02000000 , 0x000000e0 ); +reg_write( DDR_REG_BASE + 0x00090085*4 +0x02000000 , 0x00000109 ); +reg_write( DDR_REG_BASE + 0x00090086*4 +0x02000000 , 0x0000000a ); +reg_write( DDR_REG_BASE + 0x00090087*4 +0x02000000 , 0x00000010 ); +reg_write( DDR_REG_BASE + 0x00090088*4 +0x02000000 , 0x00000109 ); +reg_write( DDR_REG_BASE + 0x00090089*4 +0x02000000 , 0x00000009 ); +reg_write( DDR_REG_BASE + 0x0009008a*4 +0x02000000 , 0x000003c0 ); +reg_write( DDR_REG_BASE + 0x0009008b*4 +0x02000000 , 0x00000149 ); +reg_write( DDR_REG_BASE + 0x0009008c*4 +0x02000000 , 0x00000009 ); +reg_write( DDR_REG_BASE + 0x0009008d*4 +0x02000000 , 0x000003c0 ); +reg_write( DDR_REG_BASE + 0x0009008e*4 +0x02000000 , 0x00000159 ); +reg_write( DDR_REG_BASE + 0x0009008f*4 +0x02000000 , 0x00000018 ); +reg_write( DDR_REG_BASE + 0x00090090*4 +0x02000000 , 0x00000010 ); +reg_write( DDR_REG_BASE + 0x00090091*4 +0x02000000 , 0x00000109 ); +reg_write( DDR_REG_BASE + 0x00090092*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00090093*4 +0x02000000 , 0x000003c0 ); +reg_write( DDR_REG_BASE + 0x00090094*4 +0x02000000 , 0x00000109 ); +reg_write( DDR_REG_BASE + 0x00090095*4 +0x02000000 , 0x00000018 ); +reg_write( DDR_REG_BASE + 0x00090096*4 +0x02000000 , 0x00000004 ); +reg_write( DDR_REG_BASE + 0x00090097*4 +0x02000000 , 0x00000048 ); +reg_write( DDR_REG_BASE + 0x00090098*4 +0x02000000 , 0x00000018 ); +reg_write( DDR_REG_BASE + 0x00090099*4 +0x02000000 , 0x00000004 ); +reg_write( DDR_REG_BASE + 0x0009009a*4 +0x02000000 , 0x00000058 ); +reg_write( DDR_REG_BASE + 0x0009009b*4 +0x02000000 , 0x0000000b ); +reg_write( DDR_REG_BASE + 0x0009009c*4 +0x02000000 , 0x00000010 ); +reg_write( DDR_REG_BASE + 0x0009009d*4 +0x02000000 , 0x00000109 ); +reg_write( DDR_REG_BASE + 0x0009009e*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x0009009f*4 +0x02000000 , 0x00000010 ); +reg_write( DDR_REG_BASE + 0x000900a0*4 +0x02000000 , 0x00000109 ); +reg_write( DDR_REG_BASE + 0x000900a1*4 +0x02000000 , 0x00000005 ); +reg_write( DDR_REG_BASE + 0x000900a2*4 +0x02000000 , 0x000007c0 ); +reg_write( DDR_REG_BASE + 0x000900a3*4 +0x02000000 , 0x00000109 ); +reg_write( DDR_REG_BASE + 0x00040000*4 +0x02000000 , 0x000008ec ); +reg_write( DDR_REG_BASE + 0x00040020*4 +0x02000000 , 0x00000800 ); +reg_write( DDR_REG_BASE + 0x00040040*4 +0x02000000 , 0x00000038 ); +reg_write( DDR_REG_BASE + 0x00040060*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00040001*4 +0x02000000 , 0x0000070a ); +reg_write( DDR_REG_BASE + 0x00040021*4 +0x02000000 , 0x00000015 ); +reg_write( DDR_REG_BASE + 0x00040041*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00040061*4 +0x02000000 , 0x00002003 ); +reg_write( DDR_REG_BASE + 0x00040002*4 +0x02000000 , 0x00000764 ); +reg_write( DDR_REG_BASE + 0x00040022*4 +0x02000000 , 0x00000015 ); +reg_write( DDR_REG_BASE + 0x00040042*4 +0x02000000 , 0x00000a56 ); +reg_write( DDR_REG_BASE + 0x00040062*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00040003*4 +0x02000000 , 0x0000070a ); +reg_write( DDR_REG_BASE + 0x00040023*4 +0x02000000 , 0x0000001a ); +reg_write( DDR_REG_BASE + 0x00040043*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00040063*4 +0x02000000 , 0x00002003 ); +reg_write( DDR_REG_BASE + 0x00040004*4 +0x02000000 , 0x00004764 ); +reg_write( DDR_REG_BASE + 0x00040024*4 +0x02000000 , 0x0000001a ); +reg_write( DDR_REG_BASE + 0x00040044*4 +0x02000000 , 0x00000a56 ); +reg_write( DDR_REG_BASE + 0x00040064*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00040005*4 +0x02000000 , 0x00000f05 ); +reg_write( DDR_REG_BASE + 0x00040025*4 +0x02000000 , 0x00000c05 ); +reg_write( DDR_REG_BASE + 0x00040045*4 +0x02000000 , 0x00002800 ); +reg_write( DDR_REG_BASE + 0x00040065*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00040006*4 +0x02000000 , 0x00000728 ); +reg_write( DDR_REG_BASE + 0x00040026*4 +0x02000000 , 0x00000005 ); +reg_write( DDR_REG_BASE + 0x00040046*4 +0x02000000 , 0x00002800 ); +reg_write( DDR_REG_BASE + 0x00040066*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00040007*4 +0x02000000 , 0x00004028 ); +reg_write( DDR_REG_BASE + 0x00040027*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00040047*4 +0x02000000 , 0x00000038 ); +reg_write( DDR_REG_BASE + 0x00040067*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00040008*4 +0x02000000 , 0x00000f05 ); +reg_write( DDR_REG_BASE + 0x00040028*4 +0x02000000 , 0x00000c0a ); +reg_write( DDR_REG_BASE + 0x00040048*4 +0x02000000 , 0x00002800 ); +reg_write( DDR_REG_BASE + 0x00040068*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00040009*4 +0x02000000 , 0x00000728 ); +reg_write( DDR_REG_BASE + 0x00040029*4 +0x02000000 , 0x0000000a ); +reg_write( DDR_REG_BASE + 0x00040049*4 +0x02000000 , 0x00002800 ); +reg_write( DDR_REG_BASE + 0x00040069*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x0004000a*4 +0x02000000 , 0x00004028 ); +reg_write( DDR_REG_BASE + 0x0004002a*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x0004004a*4 +0x02000000 , 0x00000038 ); +reg_write( DDR_REG_BASE + 0x0004006a*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x0004000b*4 +0x02000000 , 0x00000ee0 ); +reg_write( DDR_REG_BASE + 0x0004002b*4 +0x02000000 , 0x00000c0f ); +reg_write( DDR_REG_BASE + 0x0004004b*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x0004006b*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x0004000c*4 +0x02000000 , 0x00005620 ); +reg_write( DDR_REG_BASE + 0x0004002c*4 +0x02000000 , 0x00000003 ); +reg_write( DDR_REG_BASE + 0x0004004c*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x0004006c*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000900a4*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000900a5*4 +0x02000000 , 0x00000790 ); +reg_write( DDR_REG_BASE + 0x000900a6*4 +0x02000000 , 0x0000010a ); +reg_write( DDR_REG_BASE + 0x000900a7*4 +0x02000000 , 0x00000008 ); +reg_write( DDR_REG_BASE + 0x000900a8*4 +0x02000000 , 0x000007aa ); +reg_write( DDR_REG_BASE + 0x000900a9*4 +0x02000000 , 0x0000000a ); +reg_write( DDR_REG_BASE + 0x000900aa*4 +0x02000000 , 0x00000010 ); +reg_write( DDR_REG_BASE + 0x000900ab*4 +0x02000000 , 0x000007b2 ); +reg_write( DDR_REG_BASE + 0x000900ac*4 +0x02000000 , 0x0000000a ); +reg_write( DDR_REG_BASE + 0x000900ad*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000900ae*4 +0x02000000 , 0x000007c8 ); +reg_write( DDR_REG_BASE + 0x000900af*4 +0x02000000 , 0x00000109 ); +reg_write( DDR_REG_BASE + 0x000900b0*4 +0x02000000 , 0x00000010 ); +reg_write( DDR_REG_BASE + 0x000900b1*4 +0x02000000 , 0x00000010 ); +reg_write( DDR_REG_BASE + 0x000900b2*4 +0x02000000 , 0x00000109 ); +reg_write( DDR_REG_BASE + 0x000900b3*4 +0x02000000 , 0x00000010 ); +reg_write( DDR_REG_BASE + 0x000900b4*4 +0x02000000 , 0x000002a8 ); +reg_write( DDR_REG_BASE + 0x000900b5*4 +0x02000000 , 0x00000109 ); +reg_write( DDR_REG_BASE + 0x000900b6*4 +0x02000000 , 0x00000008 ); +reg_write( DDR_REG_BASE + 0x000900b7*4 +0x02000000 , 0x00000370 ); +reg_write( DDR_REG_BASE + 0x000900b8*4 +0x02000000 , 0x00000109 ); +reg_write( DDR_REG_BASE + 0x000900b9*4 +0x02000000 , 0x0000000a ); +reg_write( DDR_REG_BASE + 0x000900ba*4 +0x02000000 , 0x000003c8 ); +reg_write( DDR_REG_BASE + 0x000900bb*4 +0x02000000 , 0x000001a9 ); +reg_write( DDR_REG_BASE + 0x000900bc*4 +0x02000000 , 0x0000000c ); +reg_write( DDR_REG_BASE + 0x000900bd*4 +0x02000000 , 0x00000408 ); +reg_write( DDR_REG_BASE + 0x000900be*4 +0x02000000 , 0x00000109 ); +reg_write( DDR_REG_BASE + 0x000900bf*4 +0x02000000 , 0x0000003e ); +reg_write( DDR_REG_BASE + 0x000900c0*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000900c1*4 +0x02000000 , 0x00000008 ); +reg_write( DDR_REG_BASE + 0x000900c2*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000900c3*4 +0x02000000 , 0x00000408 ); +reg_write( DDR_REG_BASE + 0x000900c4*4 +0x02000000 , 0x00000109 ); +reg_write( DDR_REG_BASE + 0x000900c5*4 +0x02000000 , 0x00000008 ); +reg_write( DDR_REG_BASE + 0x000900c6*4 +0x02000000 , 0x00008568 ); +reg_write( DDR_REG_BASE + 0x000900c7*4 +0x02000000 , 0x00000108 ); +reg_write( DDR_REG_BASE + 0x000900c8*4 +0x02000000 , 0x00000028 ); +reg_write( DDR_REG_BASE + 0x000900c9*4 +0x02000000 , 0x00000790 ); +reg_write( DDR_REG_BASE + 0x000900ca*4 +0x02000000 , 0x0000016a ); +reg_write( DDR_REG_BASE + 0x000900cb*4 +0x02000000 , 0x00000008 ); +reg_write( DDR_REG_BASE + 0x000900cc*4 +0x02000000 , 0x000001d8 ); +reg_write( DDR_REG_BASE + 0x000900cd*4 +0x02000000 , 0x00000169 ); +reg_write( DDR_REG_BASE + 0x000900ce*4 +0x02000000 , 0x00000010 ); +reg_write( DDR_REG_BASE + 0x000900cf*4 +0x02000000 , 0x00008558 ); +reg_write( DDR_REG_BASE + 0x000900d0*4 +0x02000000 , 0x00000168 ); +reg_write( DDR_REG_BASE + 0x000900d1*4 +0x02000000 , 0x00000070 ); +reg_write( DDR_REG_BASE + 0x000900d2*4 +0x02000000 , 0x00000788 ); +reg_write( DDR_REG_BASE + 0x000900d3*4 +0x02000000 , 0x0000016a ); +reg_write( DDR_REG_BASE + 0x000900d4*4 +0x02000000 , 0x00001ff8 ); +reg_write( DDR_REG_BASE + 0x000900d5*4 +0x02000000 , 0x000085a8 ); +reg_write( DDR_REG_BASE + 0x000900d6*4 +0x02000000 , 0x000001e8 ); +reg_write( DDR_REG_BASE + 0x000900d7*4 +0x02000000 , 0x00000028 ); +reg_write( DDR_REG_BASE + 0x000900d8*4 +0x02000000 , 0x00000798 ); +reg_write( DDR_REG_BASE + 0x000900d9*4 +0x02000000 , 0x0000016a ); +reg_write( DDR_REG_BASE + 0x000900da*4 +0x02000000 , 0x00000038 ); +reg_write( DDR_REG_BASE + 0x000900db*4 +0x02000000 , 0x000007a0 ); +reg_write( DDR_REG_BASE + 0x000900dc*4 +0x02000000 , 0x0000016a ); +reg_write( DDR_REG_BASE + 0x000900dd*4 +0x02000000 , 0x00000008 ); +reg_write( DDR_REG_BASE + 0x000900de*4 +0x02000000 , 0x00008310 ); +reg_write( DDR_REG_BASE + 0x000900df*4 +0x02000000 , 0x00000168 ); +reg_write( DDR_REG_BASE + 0x000900e0*4 +0x02000000 , 0x00000008 ); +reg_write( DDR_REG_BASE + 0x000900e1*4 +0x02000000 , 0x0000a310 ); +reg_write( DDR_REG_BASE + 0x000900e2*4 +0x02000000 , 0x00000168 ); +reg_write( DDR_REG_BASE + 0x000900e3*4 +0x02000000 , 0x0000000a ); +reg_write( DDR_REG_BASE + 0x000900e4*4 +0x02000000 , 0x00000408 ); +reg_write( DDR_REG_BASE + 0x000900e5*4 +0x02000000 , 0x00000169 ); +reg_write( DDR_REG_BASE + 0x000900e6*4 +0x02000000 , 0x00000055 ); +reg_write( DDR_REG_BASE + 0x000900e7*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000900e8*4 +0x02000000 , 0x00000068 ); +reg_write( DDR_REG_BASE + 0x000900e9*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000900ea*4 +0x02000000 , 0x00000408 ); +reg_write( DDR_REG_BASE + 0x000900eb*4 +0x02000000 , 0x00000169 ); +reg_write( DDR_REG_BASE + 0x000900ec*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000900ed*4 +0x02000000 , 0x00008310 ); +reg_write( DDR_REG_BASE + 0x000900ee*4 +0x02000000 , 0x00000168 ); +reg_write( DDR_REG_BASE + 0x000900ef*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000900f0*4 +0x02000000 , 0x0000a310 ); +reg_write( DDR_REG_BASE + 0x000900f1*4 +0x02000000 , 0x00000168 ); +reg_write( DDR_REG_BASE + 0x000900f2*4 +0x02000000 , 0x00001ff8 ); +reg_write( DDR_REG_BASE + 0x000900f3*4 +0x02000000 , 0x000085a8 ); +reg_write( DDR_REG_BASE + 0x000900f4*4 +0x02000000 , 0x000001e8 ); +reg_write( DDR_REG_BASE + 0x000900f5*4 +0x02000000 , 0x00000040 ); +reg_write( DDR_REG_BASE + 0x000900f6*4 +0x02000000 , 0x00000798 ); +reg_write( DDR_REG_BASE + 0x000900f7*4 +0x02000000 , 0x0000016a ); +reg_write( DDR_REG_BASE + 0x000900f8*4 +0x02000000 , 0x00000050 ); +reg_write( DDR_REG_BASE + 0x000900f9*4 +0x02000000 , 0x000007a0 ); +reg_write( DDR_REG_BASE + 0x000900fa*4 +0x02000000 , 0x0000016a ); +reg_write( DDR_REG_BASE + 0x000900fb*4 +0x02000000 , 0x00000040 ); +reg_write( DDR_REG_BASE + 0x000900fc*4 +0x02000000 , 0x00000790 ); +reg_write( DDR_REG_BASE + 0x000900fd*4 +0x02000000 , 0x0000016a ); +reg_write( DDR_REG_BASE + 0x000900fe*4 +0x02000000 , 0x00000008 ); +reg_write( DDR_REG_BASE + 0x000900ff*4 +0x02000000 , 0x00008b10 ); +reg_write( DDR_REG_BASE + 0x00090100*4 +0x02000000 , 0x00000168 ); +reg_write( DDR_REG_BASE + 0x00090101*4 +0x02000000 , 0x00000008 ); +reg_write( DDR_REG_BASE + 0x00090102*4 +0x02000000 , 0x0000ab10 ); +reg_write( DDR_REG_BASE + 0x00090103*4 +0x02000000 , 0x00000168 ); +reg_write( DDR_REG_BASE + 0x00090104*4 +0x02000000 , 0x0000000a ); +reg_write( DDR_REG_BASE + 0x00090105*4 +0x02000000 , 0x00000408 ); +reg_write( DDR_REG_BASE + 0x00090106*4 +0x02000000 , 0x00000169 ); +reg_write( DDR_REG_BASE + 0x00090107*4 +0x02000000 , 0x00000055 ); +reg_write( DDR_REG_BASE + 0x00090108*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00090109*4 +0x02000000 , 0x00000068 ); +reg_write( DDR_REG_BASE + 0x0009010a*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x0009010b*4 +0x02000000 , 0x00000408 ); +reg_write( DDR_REG_BASE + 0x0009010c*4 +0x02000000 , 0x00000169 ); +reg_write( DDR_REG_BASE + 0x0009010d*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x0009010e*4 +0x02000000 , 0x00008b10 ); +reg_write( DDR_REG_BASE + 0x0009010f*4 +0x02000000 , 0x00000168 ); +reg_write( DDR_REG_BASE + 0x00090110*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x00090111*4 +0x02000000 , 0x0000ab10 ); +reg_write( DDR_REG_BASE + 0x00090112*4 +0x02000000 , 0x00000168 ); +reg_write( DDR_REG_BASE + 0x00090113*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00090114*4 +0x02000000 , 0x000001d8 ); +reg_write( DDR_REG_BASE + 0x00090115*4 +0x02000000 , 0x00000169 ); +reg_write( DDR_REG_BASE + 0x00090116*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00090117*4 +0x02000000 , 0x00008568 ); +reg_write( DDR_REG_BASE + 0x00090118*4 +0x02000000 , 0x00000108 ); +reg_write( DDR_REG_BASE + 0x00090119*4 +0x02000000 , 0x0000000a ); +reg_write( DDR_REG_BASE + 0x0009011a*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x0009011b*4 +0x02000000 , 0x00000189 ); +reg_write( DDR_REG_BASE + 0x0009011c*4 +0x02000000 , 0x00000058 ); +reg_write( DDR_REG_BASE + 0x0009011d*4 +0x02000000 , 0x00000790 ); +reg_write( DDR_REG_BASE + 0x0009011e*4 +0x02000000 , 0x0000010a ); +reg_write( DDR_REG_BASE + 0x0009011f*4 +0x02000000 , 0x00000008 ); +reg_write( DDR_REG_BASE + 0x00090120*4 +0x02000000 , 0x00000408 ); +reg_write( DDR_REG_BASE + 0x00090121*4 +0x02000000 , 0x00000109 ); +reg_write( DDR_REG_BASE + 0x00090122*4 +0x02000000 , 0x00000020 ); +reg_write( DDR_REG_BASE + 0x00090123*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00090124*4 +0x02000000 , 0x00000008 ); +reg_write( DDR_REG_BASE + 0x00090125*4 +0x02000000 , 0x00000002 ); +reg_write( DDR_REG_BASE + 0x00090126*4 +0x02000000 , 0x00000408 ); +reg_write( DDR_REG_BASE + 0x00090127*4 +0x02000000 , 0x00000109 ); +reg_write( DDR_REG_BASE + 0x00090128*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00090129*4 +0x02000000 , 0x00008558 ); +reg_write( DDR_REG_BASE + 0x0009012a*4 +0x02000000 , 0x00000168 ); +reg_write( DDR_REG_BASE + 0x0009012b*4 +0x02000000 , 0x00000008 ); +reg_write( DDR_REG_BASE + 0x0009012c*4 +0x02000000 , 0x000003c8 ); +reg_write( DDR_REG_BASE + 0x0009012d*4 +0x02000000 , 0x000001a9 ); +reg_write( DDR_REG_BASE + 0x0009012e*4 +0x02000000 , 0x00000003 ); +reg_write( DDR_REG_BASE + 0x0009012f*4 +0x02000000 , 0x00000370 ); +reg_write( DDR_REG_BASE + 0x00090130*4 +0x02000000 , 0x00000109 ); +reg_write( DDR_REG_BASE + 0x00090131*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00090132*4 +0x02000000 , 0x000002a8 ); +reg_write( DDR_REG_BASE + 0x00090133*4 +0x02000000 , 0x00000109 ); +reg_write( DDR_REG_BASE + 0x00090134*4 +0x02000000 , 0x00000008 ); +reg_write( DDR_REG_BASE + 0x00090135*4 +0x02000000 , 0x000000e8 ); +reg_write( DDR_REG_BASE + 0x00090136*4 +0x02000000 , 0x00000109 ); +reg_write( DDR_REG_BASE + 0x00090137*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00090138*4 +0x02000000 , 0x00008140 ); +reg_write( DDR_REG_BASE + 0x00090139*4 +0x02000000 , 0x0000010c ); +reg_write( DDR_REG_BASE + 0x0009013a*4 +0x02000000 , 0x00000010 ); +reg_write( DDR_REG_BASE + 0x0009013b*4 +0x02000000 , 0x00008138 ); +reg_write( DDR_REG_BASE + 0x0009013c*4 +0x02000000 , 0x00000104 ); +reg_write( DDR_REG_BASE + 0x0009013d*4 +0x02000000 , 0x00000008 ); +reg_write( DDR_REG_BASE + 0x0009013e*4 +0x02000000 , 0x00000448 ); +reg_write( DDR_REG_BASE + 0x0009013f*4 +0x02000000 , 0x00000109 ); +reg_write( DDR_REG_BASE + 0x00090140*4 +0x02000000 , 0x0000000f ); +reg_write( DDR_REG_BASE + 0x00090141*4 +0x02000000 , 0x000007c0 ); +reg_write( DDR_REG_BASE + 0x00090142*4 +0x02000000 , 0x00000109 ); +reg_write( DDR_REG_BASE + 0x00090143*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00090144*4 +0x02000000 , 0x000000e8 ); +reg_write( DDR_REG_BASE + 0x00090145*4 +0x02000000 , 0x00000109 ); +reg_write( DDR_REG_BASE + 0x00090146*4 +0x02000000 , 0x00000047 ); +reg_write( DDR_REG_BASE + 0x00090147*4 +0x02000000 , 0x00000630 ); +reg_write( DDR_REG_BASE + 0x00090148*4 +0x02000000 , 0x00000109 ); +reg_write( DDR_REG_BASE + 0x00090149*4 +0x02000000 , 0x00000008 ); +reg_write( DDR_REG_BASE + 0x0009014a*4 +0x02000000 , 0x00000618 ); +reg_write( DDR_REG_BASE + 0x0009014b*4 +0x02000000 , 0x00000109 ); +reg_write( DDR_REG_BASE + 0x0009014c*4 +0x02000000 , 0x00000008 ); +reg_write( DDR_REG_BASE + 0x0009014d*4 +0x02000000 , 0x000000e0 ); +reg_write( DDR_REG_BASE + 0x0009014e*4 +0x02000000 , 0x00000109 ); +reg_write( DDR_REG_BASE + 0x0009014f*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00090150*4 +0x02000000 , 0x000007c8 ); +reg_write( DDR_REG_BASE + 0x00090151*4 +0x02000000 , 0x00000109 ); +reg_write( DDR_REG_BASE + 0x00090152*4 +0x02000000 , 0x00000008 ); +reg_write( DDR_REG_BASE + 0x00090153*4 +0x02000000 , 0x00008140 ); +reg_write( DDR_REG_BASE + 0x00090154*4 +0x02000000 , 0x0000010c ); +reg_write( DDR_REG_BASE + 0x00090155*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00090156*4 +0x02000000 , 0x00000478 ); +reg_write( DDR_REG_BASE + 0x00090157*4 +0x02000000 , 0x00000109 ); +reg_write( DDR_REG_BASE + 0x00090158*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00090159*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x0009015a*4 +0x02000000 , 0x00000008 ); +reg_write( DDR_REG_BASE + 0x0009015b*4 +0x02000000 , 0x00000008 ); +reg_write( DDR_REG_BASE + 0x0009015c*4 +0x02000000 , 0x00000004 ); +reg_write( DDR_REG_BASE + 0x0009015d*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00090006*4 +0x02000000 , 0x00000008 ); +reg_write( DDR_REG_BASE + 0x00090007*4 +0x02000000 , 0x000007c8 ); +reg_write( DDR_REG_BASE + 0x00090008*4 +0x02000000 , 0x00000109 ); +reg_write( DDR_REG_BASE + 0x00090009*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x0009000a*4 +0x02000000 , 0x00000400 ); +reg_write( DDR_REG_BASE + 0x0009000b*4 +0x02000000 , 0x00000106 ); +reg_write( DDR_REG_BASE + 0x000d00e7*4 +0x02000000 , 0x00000400 ); +reg_write( DDR_REG_BASE + 0x00090017*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x0009001f*4 +0x02000000 , 0x00000029 ); +reg_write( DDR_REG_BASE + 0x00090026*4 +0x02000000 , 0x0000005c ); +reg_write( DDR_REG_BASE + 0x000400d0*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000400d1*4 +0x02000000 , 0x00000101 ); +reg_write( DDR_REG_BASE + 0x000400d2*4 +0x02000000 , 0x00000105 ); +reg_write( DDR_REG_BASE + 0x000400d3*4 +0x02000000 , 0x00000107 ); +reg_write( DDR_REG_BASE + 0x000400d4*4 +0x02000000 , 0x0000010f ); +reg_write( DDR_REG_BASE + 0x000400d5*4 +0x02000000 , 0x00000202 ); +reg_write( DDR_REG_BASE + 0x000400d6*4 +0x02000000 , 0x0000020a ); +reg_write( DDR_REG_BASE + 0x000400d7*4 +0x02000000 , 0x0000020b ); +reg_write( DDR_REG_BASE + 0x0002000b*4 +0x02000000 , 0x00000042 ); +reg_write( DDR_REG_BASE + 0x0002000c*4 +0x02000000 , 0x00000085 ); +reg_write( DDR_REG_BASE + 0x0002000d*4 +0x02000000 , 0x00000534 ); // +reg_write( DDR_REG_BASE + 0x0002000e*4 +0x02000000 , 0x0000002c ); +reg_write( DDR_REG_BASE + 0x0009000c*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x0009000d*4 +0x02000000 , 0x00000173 ); +reg_write( DDR_REG_BASE + 0x0009000e*4 +0x02000000 , 0x00000060 ); +reg_write( DDR_REG_BASE + 0x0009000f*4 +0x02000000 , 0x00006110 ); +reg_write( DDR_REG_BASE + 0x00090010*4 +0x02000000 , 0x00002152 ); +reg_write( DDR_REG_BASE + 0x00090011*4 +0x02000000 , 0x0000dfbd ); +reg_write( DDR_REG_BASE + 0x00090012*4 +0x02000000 , 0x00002060 ); +reg_write( DDR_REG_BASE + 0x00090013*4 +0x02000000 , 0x00006152 ); + +reg_write( DDR_REG_BASE +0x20010*4+0x02000000,0x5a); +reg_write( DDR_REG_BASE +0x20011*4+0x02000000,0x3); + +reg_write( DDR_REG_BASE + 0x00040080*4 +0x02000000 , 0x000000b0 ); +//iteration +//DRAM DQ ODT +//(default: DQ odt disable) -> 0 +//(ODT:60) -> 0x14 +//(ODT:120) -> 0x18 +//(ODT:240) -> 0x1c +reg_write( DDR_REG_BASE + 0x00040081*4 +0x02000000 , 0x00000018 ); +reg_write( DDR_REG_BASE + 0x00040082*4 +0x02000000 , 0x00000010 ); +reg_write( DDR_REG_BASE + 0x00040083*4 +0x02000000 , 0x0000030c ); +reg_write( DDR_REG_BASE + 0x00040084*4 +0x02000000 , 0x00000020 ); +reg_write( DDR_REG_BASE + 0x00040085*4 +0x02000000 , 0x00000078 ); +reg_write( DDR_REG_BASE + 0x00040086*4 +0x02000000 , 0x00000030 ); +//iteration +// DSEL 34.3 -> 0x04 +// DSEL 40 -> 0x08 +// DSEL 48 -> 0x0c +// DSEL 60 -> 0x10 +// DSEL 80 -> 0x18 +reg_write( DDR_REG_BASE + 0x00040087*4 +0x02000000 , 0x00000010 ); // +reg_write( DDR_REG_BASE + 0x000400fd*4 +0x02000000 , 0x0000000f ); +reg_write( DDR_REG_BASE + 0x00010011*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x00010012*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x00010013*4 +0x02000000 , 0x00000080 ); +reg_write( DDR_REG_BASE + 0x00010018*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x00010002*4 +0x02000000 , 0x00006209 ); +reg_write( DDR_REG_BASE + 0x000100b2*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000101b4*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000102b4*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000103b4*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000104b4*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000105b4*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000106b4*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000107b4*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000108b4*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000400e0*4 +0x02000000 , 0x0000000f ); +reg_write( DDR_REG_BASE + 0x00011011*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x00011012*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x00011013*4 +0x02000000 , 0x00000080 ); +reg_write( DDR_REG_BASE + 0x00011018*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x00011002*4 +0x02000000 , 0x00006209 ); +reg_write( DDR_REG_BASE + 0x000110b2*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000111b4*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000112b4*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000113b4*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000114b4*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000115b4*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000116b4*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000117b4*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000118b4*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000400e1*4 +0x02000000 , 0x0000000f ); +reg_write( DDR_REG_BASE + 0x00012011*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x00012012*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x00012013*4 +0x02000000 , 0x00000080 ); +reg_write( DDR_REG_BASE + 0x00012018*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x00012002*4 +0x02000000 , 0x00006209 ); +reg_write( DDR_REG_BASE + 0x000120b2*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000121b4*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000122b4*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000123b4*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000124b4*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000125b4*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000126b4*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000127b4*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000128b4*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000400e2*4 +0x02000000 , 0x000000ff ); +reg_write( DDR_REG_BASE + 0x00013011*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x00013012*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x00013013*4 +0x02000000 , 0x00000080 ); +reg_write( DDR_REG_BASE + 0x00013018*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x00013002*4 +0x02000000 , 0x00006209 ); +reg_write( DDR_REG_BASE + 0x000130b2*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000131b4*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000132b4*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000133b4*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000134b4*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000135b4*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000136b4*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000137b4*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000138b4*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000400e3*4 +0x02000000 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00020089*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x00020088*4 +0x02000000 , 0x00000019 ); +reg_write( DDR_REG_BASE + 0x000c0080*4 +0x02000000 , 0x00000002 ); +reg_write( DDR_REG_BASE + 0x000d0000*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000d0000*4 +0x02000000 , 0x00000000 ); +reg_read ( DDR_REG_BASE + 0x00020010*4 +0x02000000 , data ); +reg_write( DDR_REG_BASE + 0x00020010*4 +0x02000000 , 0x0000006a ); +reg_write( DDR_REG_BASE + 0x00020010*4 +0x02000000 , 0x0000006a ); +reg_read ( DDR_REG_BASE + 0x0002001d*4 +0x02000000 , data ); +reg_write( DDR_REG_BASE + 0x0002001d*4 +0x02000000 , 0x00000001 ); +reg_read ( DDR_REG_BASE + 0x00020097*4 +0x02000000 , data ); + + + +//////////////////////////dangdalong/////////////////////////////// + + + +reg_write( DDR_REG_BASE + 0x000001b0 , 0x00000020 ); + + +reg_read (DDR_REG_BASE + 0x000001bc , data ); +while((data&0x1) !=0x1){ + reg_read (DDR_REG_BASE + 0x000001bc , data ); +} + + +reg_write( DDR_REG_BASE + 0x000001b0 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000001b0 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x00000030 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00000030 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00000320 , 0x00000001 ); + + + + reg_read (DDR_REG_BASE + 0x00000324 , data ); + while((data&0x1) !=0x1){ + reg_read (DDR_REG_BASE + 0x00000324 , data ); + } + +reg_read (DDR_REG_BASE + 0x00000004 , data ); + while((data&0x1) !=0x1){ + reg_read (DDR_REG_BASE + 0x00000004 , data ); + } + + + + +reg_write( DDR_REG_BASE + 0x000001c4 , 0x85000000 ); +reg_write( DDR_REG_BASE + 0x00000320 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000000d0 , 0x00020002 ); +reg_write( DDR_REG_BASE + 0x00000320 , 0x00000001 ); + + + reg_read (DDR_REG_BASE + 0x00000324 , data ); + while((data&0x1) !=0x1){ + reg_read (DDR_REG_BASE + 0x00000324 , data ); + } + + + +reg_write( DDR_REG_BASE + 0x00000304 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00000030 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00000030 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00000490 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x00000540 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000005f0 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000006a0 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x00000750 , 0x00000001 ); + +reg_write( DDR_REG_BASE + 0x00000060 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00000050 , 0x98210000 ); +} diff --git a/src/little/uboot/board/canaan/k230_canmv_01studio/canmv_01studio_ddr_init_800.c b/src/little/uboot/board/canaan/k230_canmv_01studio/canmv_01studio_ddr_init_800.c new file mode 100755 index 000000000..232c555bc --- /dev/null +++ b/src/little/uboot/board/canaan/k230_canmv_01studio/canmv_01studio_ddr_init_800.c @@ -0,0 +1,18459 @@ +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include +#include +//#include +//#include +#define DDR_REG_BASE 0x98000000 + +#define reg_write( addr,v) \ + { \ + (*(volatile uint32_t *)((size_t)(addr))) = (v); \ + } + + +#define reg_read( addr,v) \ + { \ + v =readl ((const volatile void __iomem *) addr ); \ + } + +void canmv_01studio_ddr_init_800() +{ +int data; +int train_data=0; + + printf("ddr 800 with odt date %s\n", __func__); + reg_read (0x91100060,data); + data =data & 0xfffffffc; + data =data | 0xc00; + data =data | 0x80000000; + reg_write(0x91100060,data); + + + +reg_write( DDR_REG_BASE + 0x00000304 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x00000030 , 0x00000001 ); +reg_read ( DDR_REG_BASE + 0x00000004 , data); +reg_write( DDR_REG_BASE + 0x00000000 , 0x01040008 ); +reg_write( DDR_REG_BASE + 0x00000010 , 0x0000e030 ); +reg_write( DDR_REG_BASE + 0x00000014 , 0x00007563 ); +reg_write( DDR_REG_BASE + 0x00000020 , 0x00001000 ); +reg_write( DDR_REG_BASE + 0x00000024 , 0xb4b04b13 ); +reg_write( DDR_REG_BASE + 0x00000028 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x0000002c , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00000030 , 0x00000020 ); +reg_write( DDR_REG_BASE + 0x00000034 , 0x00405f04 ); +reg_write( DDR_REG_BASE + 0x00000038 , 0x00a80002 ); +reg_write( DDR_REG_BASE + 0x0000003c , 0x00010050 ); +reg_write( DDR_REG_BASE + 0x00000050 , 0x90210000 ); +reg_write( DDR_REG_BASE + 0x00000054 , 0x00160013 ); +reg_write( DDR_REG_BASE + 0x00000060 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x00000064 , 0x0018001a ); +reg_write( DDR_REG_BASE + 0x00000068 , 0x005b0000 ); +reg_write( DDR_REG_BASE + 0x000000c0 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000000d0 , 0xc0020002 ); +reg_write( DDR_REG_BASE + 0x000000d4 , 0x00010002 ); +reg_write( DDR_REG_BASE + 0x000000d8 , 0x00000800 ); +reg_write( DDR_REG_BASE + 0x000000dc , 0x00830006 ); +reg_write( DDR_REG_BASE + 0x000000e0 , 0x00020000 ); +reg_write( DDR_REG_BASE + 0x000000e4 , 0x00080003 ); +reg_write( DDR_REG_BASE + 0x000000e8 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000000ec , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000000f0 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000000f4 , 0x0000022f ); +reg_write( DDR_REG_BASE + 0x000000f8 , 0x00000002 ); +reg_write( DDR_REG_BASE + 0x00000100 , 0x070a0d08 ); +reg_write( DDR_REG_BASE + 0x00000104 , 0x0002020d ); +reg_write( DDR_REG_BASE + 0x00000108 , 0x02040607 ); +reg_write( DDR_REG_BASE + 0x0000010c , 0x00505006 ); +reg_write( DDR_REG_BASE + 0x00000110 , 0x04020205 ); +reg_write( DDR_REG_BASE + 0x00000114 , 0x01010303 ); +reg_write( DDR_REG_BASE + 0x00000118 , 0x01010003 ); +reg_write( DDR_REG_BASE + 0x0000011c , 0x00000101 ); +reg_write( DDR_REG_BASE + 0x00000120 , 0x00000101 ); +reg_write( DDR_REG_BASE + 0x00000130 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00000134 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00000138 , 0x0000001c ); +reg_write( DDR_REG_BASE + 0x0000013c , 0x80000000 ); +reg_write( DDR_REG_BASE + 0x00000144 , 0x00000094 ); +reg_write( DDR_REG_BASE + 0x00000180 , 0xe0480012 ); +reg_write( DDR_REG_BASE + 0x00000184 , 0x00a0c892 ); +reg_write( DDR_REG_BASE + 0x00000188 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00000190 , 0x03838200 ); +reg_write( DDR_REG_BASE + 0x00000194 , 0x00070202 ); +reg_write( DDR_REG_BASE + 0x00000198 , 0x07a09110 ); +reg_write( DDR_REG_BASE + 0x000001a0 , 0xa0400018 ); +reg_write( DDR_REG_BASE + 0x000001a4 , 0x00760085 ); +reg_write( DDR_REG_BASE + 0x000001a8 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000001b0 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000001b4 , 0x00000300 ); +reg_write( DDR_REG_BASE + 0x000001c0 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000001c4 , 0x85000000 ); +reg_write( DDR_REG_BASE + 0x00000200 , 0x0000001f ); +reg_write( DDR_REG_BASE + 0x00000204 , 0x00080808 ); +reg_write( DDR_REG_BASE + 0x00000208 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x0000020c , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00000210 , 0x00001f1f ); +reg_write( DDR_REG_BASE + 0x00000214 , 0x070f0707 ); +reg_write( DDR_REG_BASE + 0x00000218 , 0x0f0f0707 ); +reg_write( DDR_REG_BASE + 0x0000021c , 0x00000f0f ); +reg_write( DDR_REG_BASE + 0x00000224 , 0x07070707 ); +reg_write( DDR_REG_BASE + 0x00000228 , 0x07070707 ); +reg_write( DDR_REG_BASE + 0x0000022c , 0x00000007 ); +reg_write( DDR_REG_BASE + 0x00000240 , 0x06020718 ); +reg_write( DDR_REG_BASE + 0x00000244 , 0x00002301 ); +reg_write( DDR_REG_BASE + 0x00000250 , 0x80c31f18 ); +reg_write( DDR_REG_BASE + 0x00000254 , 0x00002000 ); +reg_write( DDR_REG_BASE + 0x0000025c , 0x0f000001 ); +reg_write( DDR_REG_BASE + 0x00000264 , 0x0f00007f ); +reg_write( DDR_REG_BASE + 0x0000026c , 0x0f00007f ); +reg_write( DDR_REG_BASE + 0x00000270 , 0x04040208 ); +reg_write( DDR_REG_BASE + 0x00000274 , 0x08400810 ); +reg_write( DDR_REG_BASE + 0x00000300 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00000304 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x0000030c , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00000320 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x00000328 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x0000036c , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00000490 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x00000540 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000005f0 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000006a0 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x00000750 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x00002020 , 0x00001000 ); +reg_write( DDR_REG_BASE + 0x00002024 , 0xb4b04b13 ); +reg_write( DDR_REG_BASE + 0x00002034 , 0x00405f04 ); +reg_write( DDR_REG_BASE + 0x00002050 , 0x30210000 ); +reg_write( DDR_REG_BASE + 0x00002064 , 0x0018001a ); +reg_write( DDR_REG_BASE + 0x00002068 , 0x005b0000 ); +reg_write( DDR_REG_BASE + 0x000020dc , 0x00830006 ); +reg_write( DDR_REG_BASE + 0x000020e0 , 0x00020000 ); +reg_write( DDR_REG_BASE + 0x000020e8 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000020ec , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000020f4 , 0x0000022f ); +reg_write( DDR_REG_BASE + 0x000020f8 , 0x00000002 ); +reg_write( DDR_REG_BASE + 0x00002100 , 0x070a0d08 ); +reg_write( DDR_REG_BASE + 0x00002104 , 0x0002020d ); +reg_write( DDR_REG_BASE + 0x00002108 , 0x02040607 ); +reg_write( DDR_REG_BASE + 0x0000210c , 0x00505006 ); +reg_write( DDR_REG_BASE + 0x00002110 , 0x04020205 ); +reg_write( DDR_REG_BASE + 0x00002114 , 0x01010303 ); +reg_write( DDR_REG_BASE + 0x00002118 , 0x01010003 ); +reg_write( DDR_REG_BASE + 0x0000211c , 0x00000101 ); +reg_write( DDR_REG_BASE + 0x00002120 , 0x00000101 ); +reg_write( DDR_REG_BASE + 0x00002130 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00002134 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00002138 , 0x0000001c ); +reg_write( DDR_REG_BASE + 0x0000213c , 0x80000000 ); +reg_write( DDR_REG_BASE + 0x00002144 , 0x00000094 ); +reg_write( DDR_REG_BASE + 0x00002180 , 0xe0480012 ); +reg_write( DDR_REG_BASE + 0x00002190 , 0x03838200 ); +reg_write( DDR_REG_BASE + 0x00002194 , 0x00070202 ); +reg_write( DDR_REG_BASE + 0x000021b4 , 0x00000300 ); +reg_write( DDR_REG_BASE + 0x00002240 , 0x06020718 ); +reg_write( DDR_REG_BASE + 0x00003020 , 0x00001000 ); +reg_write( DDR_REG_BASE + 0x00003024 , 0xb4b04b13 ); +reg_write( DDR_REG_BASE + 0x00003034 , 0x00405f04 ); +reg_write( DDR_REG_BASE + 0x00003050 , 0xc0210000 ); +reg_write( DDR_REG_BASE + 0x00003064 , 0x0018001a ); +reg_write( DDR_REG_BASE + 0x00003068 , 0x005b0000 ); +reg_write( DDR_REG_BASE + 0x000030dc , 0x00830006 ); +reg_write( DDR_REG_BASE + 0x000030e0 , 0x00020000 ); +reg_write( DDR_REG_BASE + 0x000030e8 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000030ec , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000030f4 , 0x0000022f ); +reg_write( DDR_REG_BASE + 0x000030f8 , 0x00000002 ); +reg_write( DDR_REG_BASE + 0x00003100 , 0x070a0d08 ); +reg_write( DDR_REG_BASE + 0x00003104 , 0x0002020d ); +reg_write( DDR_REG_BASE + 0x00003108 , 0x02040607 ); +reg_write( DDR_REG_BASE + 0x0000310c , 0x00505006 ); +reg_write( DDR_REG_BASE + 0x00003110 , 0x04020205 ); +reg_write( DDR_REG_BASE + 0x00003114 , 0x01010303 ); +reg_write( DDR_REG_BASE + 0x00003118 , 0x01010003 ); +reg_write( DDR_REG_BASE + 0x0000311c , 0x00000101 ); +reg_write( DDR_REG_BASE + 0x00003120 , 0x00000101 ); +reg_write( DDR_REG_BASE + 0x00003130 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00003134 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00003138 , 0x0000001c ); +reg_write( DDR_REG_BASE + 0x0000313c , 0x80000000 ); +reg_write( DDR_REG_BASE + 0x00003144 , 0x00000094 ); +reg_write( DDR_REG_BASE + 0x00003180 , 0xe0480012 ); +reg_write( DDR_REG_BASE + 0x00003190 , 0x03838200 ); +reg_write( DDR_REG_BASE + 0x00003194 , 0x00070202 ); +reg_write( DDR_REG_BASE + 0x000031b4 , 0x00000300 ); +reg_write( DDR_REG_BASE + 0x00003240 , 0x06020718 ); +reg_write( DDR_REG_BASE + 0x00004020 , 0x00001000 ); +reg_write( DDR_REG_BASE + 0x00004024 , 0xb4b04b13 ); +reg_write( DDR_REG_BASE + 0x00004034 , 0x00405f04 ); +reg_write( DDR_REG_BASE + 0x00004050 , 0xa8210000 ); +reg_write( DDR_REG_BASE + 0x00004064 , 0x0018801a ); +reg_write( DDR_REG_BASE + 0x00004068 , 0x005b0000 ); +reg_write( DDR_REG_BASE + 0x000040dc , 0x00830006 ); +reg_write( DDR_REG_BASE + 0x000040e0 , 0x00020000 ); +reg_write( DDR_REG_BASE + 0x000040e8 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000040ec , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000040f4 , 0x0000022f ); +reg_write( DDR_REG_BASE + 0x000040f8 , 0x00000002 ); +reg_write( DDR_REG_BASE + 0x00004100 , 0x070a0d08 ); +reg_write( DDR_REG_BASE + 0x00004104 , 0x0002020d ); +reg_write( DDR_REG_BASE + 0x00004108 , 0x02040607 ); +reg_write( DDR_REG_BASE + 0x0000410c , 0x00505006 ); +reg_write( DDR_REG_BASE + 0x00004110 , 0x04020205 ); +reg_write( DDR_REG_BASE + 0x00004114 , 0x01010303 ); +reg_write( DDR_REG_BASE + 0x00004118 , 0x01010003 ); +reg_write( DDR_REG_BASE + 0x0000411c , 0x00000101 ); +reg_write( DDR_REG_BASE + 0x00004120 , 0x00000101 ); +reg_write( DDR_REG_BASE + 0x00004130 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00004134 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00004138 , 0x0000001c ); +reg_write( DDR_REG_BASE + 0x0000413c , 0x80000000 ); +reg_write( DDR_REG_BASE + 0x00004144 , 0x00000094 ); +reg_write( DDR_REG_BASE + 0x00004180 , 0xe0480012 ); +reg_write( DDR_REG_BASE + 0x00004190 , 0x03838200 ); +reg_write( DDR_REG_BASE + 0x00004194 , 0x00070202 ); +reg_write( DDR_REG_BASE + 0x000041b4 , 0x00000300 ); +reg_write( DDR_REG_BASE + 0x00004240 , 0x06020718 ); +reg_read ( DDR_REG_BASE + 0x00000060 , data); +reg_write( DDR_REG_BASE + 0x00000400 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00000404 , 0x0000400f ); +reg_write( DDR_REG_BASE + 0x000004b4 , 0x0000400f ); +reg_write( DDR_REG_BASE + 0x00000564 , 0x0000400f ); +reg_write( DDR_REG_BASE + 0x00000614 , 0x0000400f ); +reg_write( DDR_REG_BASE + 0x000006c4 , 0x0000400f ); +reg_write( DDR_REG_BASE + 0x00000404 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x000004b4 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x00000564 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x00000614 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x000006c4 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x00000404 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x000004b4 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x00000564 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x00000614 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x000006c4 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x00000404 , 0x0000100f ); +reg_write( DDR_REG_BASE + 0x000004b4 , 0x0000100f ); +reg_write( DDR_REG_BASE + 0x00000564 , 0x0000100f ); +reg_write( DDR_REG_BASE + 0x00000614 , 0x0000100f ); +reg_write( DDR_REG_BASE + 0x000006c4 , 0x0000100f ); +reg_write( DDR_REG_BASE + 0x00000408 , 0x0000400f ); +reg_write( DDR_REG_BASE + 0x000004b8 , 0x0000400f ); +reg_write( DDR_REG_BASE + 0x00000568 , 0x0000400f ); +reg_write( DDR_REG_BASE + 0x00000618 , 0x0000400f ); +reg_write( DDR_REG_BASE + 0x000006c8 , 0x0000400f ); +reg_write( DDR_REG_BASE + 0x00000408 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x000004b8 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x00000568 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x00000618 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x000006c8 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x00000408 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x000004b8 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x00000568 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x00000618 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x000006c8 , 0x0000500f ); +reg_write( DDR_REG_BASE + 0x00000408 , 0x0000100f ); +reg_write( DDR_REG_BASE + 0x000004b8 , 0x0000100f ); +reg_write( DDR_REG_BASE + 0x00000568 , 0x0000100f ); +reg_write( DDR_REG_BASE + 0x00000618 , 0x0000100f ); +reg_write( DDR_REG_BASE + 0x000006c8 , 0x0000100f ); +reg_read ( DDR_REG_BASE + 0x00000030 , data ); +reg_write( DDR_REG_BASE + 0x00000030 , 0x00000020 ); + +////////////////////rst dess//////////////////////////////////////// + reg_read ( 0x9110309c, data ); + data=data|0x00020000; + reg_write ( 0x9110309c, data ); + + +reg_write( DDR_REG_BASE + 0x00000304 , 0x00000000 ); +reg_read ( DDR_REG_BASE + 0x00000030 , data ); +reg_write( DDR_REG_BASE + 0x00000030 , 0x00000020 ); +reg_read ( DDR_REG_BASE + 0x00000030 , data ); +reg_write( DDR_REG_BASE + 0x00000030 , 0x00000020 ); +reg_read ( DDR_REG_BASE + 0x000001c4 , data ); +reg_write( DDR_REG_BASE + 0x000001c4 , 0x85000000 ); +reg_write( DDR_REG_BASE + 0x00000320 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000001b0 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000001b0 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00000304 , 0x00000002 ); +reg_read ( DDR_REG_BASE + 0x000000d0 , data ); +reg_read ( DDR_REG_BASE + 0x000001c0 , data ); +reg_read ( DDR_REG_BASE + 0x00000000 , data ); +reg_read ( DDR_REG_BASE + 0x000000dc , data ); +reg_read ( DDR_REG_BASE + 0x000000dc , data ); +reg_read ( DDR_REG_BASE + 0x000000e0 , data ); +reg_read ( DDR_REG_BASE + 0x000000d0 , data ); +reg_read ( DDR_REG_BASE + 0x000001c0 , data ); +reg_read ( DDR_REG_BASE + 0x00000000 , data ); +reg_read ( DDR_REG_BASE + 0x000000dc , data ); +reg_read ( DDR_REG_BASE + 0x000000dc , data ); +reg_read ( DDR_REG_BASE + 0x000000e0 , data ); +reg_read ( DDR_REG_BASE + 0x000000d0 , data ); + +////////////////////////// phy init begin///////// + + +reg_write( DDR_REG_BASE + 0x1005f*4+0x02000000,0x2ff); +reg_write( DDR_REG_BASE + 0x1015f*4+0x02000000,0x2ff); +reg_write( DDR_REG_BASE + 0x1105f*4+0x02000000,0x2ff); +reg_write( DDR_REG_BASE + 0x1115f*4+0x02000000,0x2ff); +reg_write( DDR_REG_BASE + 0x1205f*4+0x02000000,0x2ff); +reg_write( DDR_REG_BASE + 0x1215f*4+0x02000000,0x2ff); +reg_write( DDR_REG_BASE + 0x1305f*4+0x02000000,0x2ff); +reg_write( DDR_REG_BASE + 0x1315f*4+0x02000000,0x2ff); +reg_write( DDR_REG_BASE + 0x55 *4+0x02000000,0x3ff); +reg_write( DDR_REG_BASE + 0x1055 *4+0x02000000,0xff); +reg_write( DDR_REG_BASE + 0x2055 *4+0x02000000,0x3ff); +reg_write( DDR_REG_BASE + 0x3055 *4+0x02000000,0x3ff); +reg_write( DDR_REG_BASE + 0x4055 *4+0x02000000,0x3ff); +reg_write( DDR_REG_BASE + 0x5055 *4+0x02000000,0x3ff); +reg_write( DDR_REG_BASE + 0x6055 *4+0x02000000,0xff); +reg_write( DDR_REG_BASE + 0x7055 *4+0x02000000,0x3ff); +reg_write( DDR_REG_BASE + 0x8055 *4+0x02000000,0x3ff); +reg_write( DDR_REG_BASE + 0x9055 *4+0x02000000,0x3ff); +reg_write( DDR_REG_BASE + 0x200c5*4+0x02000000,0x7); +reg_write( DDR_REG_BASE + 0x2002e*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x20024*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x2003a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x2007d*4+0x02000000,0x212); +reg_write( DDR_REG_BASE + 0x2007c*4+0x02000000,0x61); +reg_write( DDR_REG_BASE + 0x20056*4+0x02000000,0xa); + +//iteration place +//PHY ODT --pull up +//00_1000 0x08 Pullup/Down:120 +//00_1010 0x0a Pullup/Down:80 +//01_1000 0x18 Pullup/Down:60 +//01_1010 0x1a Pullup/Down:48 +//11_1000 0x38 Pullup/Down:40 +//11_1010 0x3a Pullup/Down:34.3 +reg_write( DDR_REG_BASE + 0x1004d*4+0x02000000,0x18); +reg_write( DDR_REG_BASE + 0x1014d*4+0x02000000,0x18); +reg_write( DDR_REG_BASE + 0x1104d*4+0x02000000,0x18); +reg_write( DDR_REG_BASE + 0x1114d*4+0x02000000,0x18); +reg_write( DDR_REG_BASE + 0x1204d*4+0x02000000,0x18); +reg_write( DDR_REG_BASE + 0x1214d*4+0x02000000,0x18); +reg_write( DDR_REG_BASE + 0x1304d*4+0x02000000,0x18); +reg_write( DDR_REG_BASE + 0x1314d*4+0x02000000,0x18); + +// // [phyinit_C_initPhyConfig] Pstate=0, Memclk=800MHz, Programming TxImpedanceCtrl1::DrvStrenFSDqP to 0x18 +// // [phyinit_C_initPhyConfig] Pstate=0, Memclk=800MHz, Programming TxImpedanceCtrl1::DrvStrenFSDqN to 0x18 + +//iteration place +//PHY TX output impedence +//0010_00 00_1000 0x208 Pullup/Down:120 +//0010_10 00_1010 0x28a Pullup/Down:80 +//0110_00 01_1000 0x618 Pullup/Down:60 +//0110_10 01_1010 0x69a Pullup/Down:48 +//1110_00 11_1000 0xe38 Pullup/Down:40 +//1110_10 11_1010 0xeba Pullup/Down:34.3 +reg_write( DDR_REG_BASE + 0x10049*4+0x02000000,0x618); +reg_write( DDR_REG_BASE + 0x10149*4+0x02000000,0x618); +reg_write( DDR_REG_BASE + 0x11049*4+0x02000000,0x618); +reg_write( DDR_REG_BASE + 0x11149*4+0x02000000,0x618); +reg_write( DDR_REG_BASE + 0x12049*4+0x02000000,0x618); +reg_write( DDR_REG_BASE + 0x12149*4+0x02000000,0x618); +reg_write( DDR_REG_BASE + 0x13049*4+0x02000000,0x618); +reg_write( DDR_REG_BASE + 0x13149*4+0x02000000,0x618); + + +//iteration place +// PHY AC/CLK output impedence +//00000_00000 0x0 120 +//00001_00001 0x21 60 +//00011_00011 0x63 40 +//00111_00111 0xe7 30 +//01111_01111 0x1ef 24 +//11111_11111 0x3ff 20 + +// // [phyinit_C_initPhyConfig] Programming ATxImpedance::ADrvStrenP to 0x1 +// // [phyinit_C_initPhyConfig] Programming ATxImpedance::ADrvStrenN to 0x1 +reg_write( DDR_REG_BASE + 0x43 *4+0x02000000,0x63); //from 20 to 120 to 40 +reg_write( DDR_REG_BASE + 0x1043 *4+0x02000000,0x63); +reg_write( DDR_REG_BASE + 0x2043 *4+0x02000000,0x63); +reg_write( DDR_REG_BASE + 0x3043 *4+0x02000000,0x63); +reg_write( DDR_REG_BASE + 0x4043 *4+0x02000000,0x63); +reg_write( DDR_REG_BASE + 0x5043 *4+0x02000000,0x63); +reg_write( DDR_REG_BASE + 0x6043 *4+0x02000000,0x63); +reg_write( DDR_REG_BASE + 0x7043 *4+0x02000000,0x63); +reg_write( DDR_REG_BASE + 0x8043 *4+0x02000000,0x63); +reg_write( DDR_REG_BASE + 0x9043 *4+0x02000000,0x63); + +reg_write( DDR_REG_BASE + 0x20018*4+0x02000000,0x5); +reg_write( DDR_REG_BASE + 0x20075*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x20050*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x20008*4+0x02000000,0xc8); +reg_write( DDR_REG_BASE + 0x20088*4+0x02000000,0x9); + +//iteration place +//PHY VERF +//INSEL VREFIN ALL Ratio +//---(0.005*X+0.345)VDDQ --- +//0x0 0x51 0x288 75% (GlobalVrefInSel to 0x0) +//0x0 0x41 0x208 67% (GlobalVrefInSel to 0x0) +//---(0.005*(X-1)VDDQ---- +//0x4 0x65 0x32c 50% (GlobalVrefInSel to 0x4) +//0x4 0x33 0x19c 25% (GlobalVrefInSel to 0x4) + + +// // [phyinit_C_initPhyConfig] Pstate=0, Programming VrefInGlobal::GlobalVrefInDAC to 0x51 +// // [phyinit_C_initPhyConfig] Pstate=0, Programming VrefInGlobal to 0x288 + +//reg_write( DDR_REG_BASE + 0x200b2*4+0x02000000,0x32c);//hyg +//reg_write( DDR_REG_BASE + 0x200b2*4+0x02000000,0x208);//hyg +//reg_write( DDR_REG_BASE + 0x200b2*4+0x02000000,0x32C);//hyg +reg_write( DDR_REG_BASE + 0x200b2*4+0x02000000,0x288);//hyg + +reg_write( DDR_REG_BASE + 0x10043*4+0x02000000,0x5b1); +reg_write( DDR_REG_BASE + 0x10143*4+0x02000000,0x5b1); +reg_write( DDR_REG_BASE + 0x11043*4+0x02000000,0x5b1); +reg_write( DDR_REG_BASE + 0x11143*4+0x02000000,0x5b1); +reg_write( DDR_REG_BASE + 0x12043*4+0x02000000,0x5b1); +reg_write( DDR_REG_BASE + 0x12143*4+0x02000000,0x5b1); +reg_write( DDR_REG_BASE + 0x13043*4+0x02000000,0x5b1); +reg_write( DDR_REG_BASE + 0x13143*4+0x02000000,0x5b1); +reg_write( DDR_REG_BASE + 0x200fa*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x20019*4+0x02000000,0x0); //hyg +reg_write( DDR_REG_BASE + 0x200f0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x200f1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x200f2*4+0x02000000,0x4444); +reg_write( DDR_REG_BASE + 0x200f3*4+0x02000000,0x8888); +reg_write( DDR_REG_BASE + 0x200f4*4+0x02000000,0x5555); +reg_write( DDR_REG_BASE + 0x200f5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x200f6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x200f7*4+0x02000000,0xf000); +reg_write( DDR_REG_BASE + 0x1004a*4+0x02000000,0x500); +reg_write( DDR_REG_BASE + 0x1104a*4+0x02000000,0x500); +reg_write( DDR_REG_BASE + 0x1204a*4+0x02000000,0x500); +reg_write( DDR_REG_BASE + 0x1304a*4+0x02000000,0x500); +reg_write( DDR_REG_BASE + 0x20025*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x2002c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x20100*4+0x02000000,0x9); //CA0 +reg_write( DDR_REG_BASE + 0x20101*4+0x02000000,0x8); //CA1 +reg_write( DDR_REG_BASE + 0x20102*4+0x02000000,0x7); //CA2 +reg_write( DDR_REG_BASE + 0x20103*4+0x02000000,0x6); //CA3 +reg_write( DDR_REG_BASE + 0x20104*4+0x02000000,0x5); //CA4 +reg_write( DDR_REG_BASE + 0x20105*4+0x02000000,0x4); //CA5 +reg_write( DDR_REG_BASE + 0x20106*4+0x02000000,0x3); //CA6 +reg_write( DDR_REG_BASE + 0x20107*4+0x02000000,0x2); //CA7 +reg_write( DDR_REG_BASE + 0x20108*4+0x02000000,0x1); //CA8 +reg_write( DDR_REG_BASE + 0x20109*4+0x02000000,0x0); //CA9 + +#if 1 +//reg_write( DDR_REG_BASE + 0x110a0*4+0x02000000,0x2); //lndq =1 +//reg_write( DDR_REG_BASE + 0x110a1*4+0x02000000,0x4); //CA1 =0 +//reg_write( DDR_REG_BASE + 0x110a2*4+0x02000000,0x0); //CA1 =0 +//reg_write( DDR_REG_BASE + 0x110a3*4+0x02000000,0x5); //CA1 =0 +//reg_write( DDR_REG_BASE + 0x110a4*4+0x02000000,0x3); //CA1 =0 +//reg_write( DDR_REG_BASE + 0x110a5*4+0x02000000,0x6); //CA1 =0 +//reg_write( DDR_REG_BASE + 0x110a6*4+0x02000000,0x1); //CA1 =0 +//reg_write( DDR_REG_BASE + 0x110a7*4+0x02000000,0x7); //CA1 =0 +//reg_write( DDR_REG_BASE + 0x130a0*4+0x02000000,0x0); //lndq =1 +//reg_write( DDR_REG_BASE + 0x130a1*4+0x02000000,0x4); //CA1 =0 +//reg_write( DDR_REG_BASE + 0x130a2*4+0x02000000,0x1); //CA1 =0 +//reg_write( DDR_REG_BASE + 0x130a3*4+0x02000000,0x5); //CA1 =0 +//reg_write( DDR_REG_BASE + 0x130a4*4+0x02000000,0x3); //CA1 =0 +//reg_write( DDR_REG_BASE + 0x130a5*4+0x02000000,0x7); //CA1 =0 +//reg_write( DDR_REG_BASE + 0x130a6*4+0x02000000,0x2); //CA1 =0 +//reg_write( DDR_REG_BASE + 0x130a7*4+0x02000000,0x6); //CA1 =0 +//reg_write( DDR_REG_BASE + 0x100a0*4+0x02000000,0x5); //lndq =1 +//reg_write( DDR_REG_BASE + 0x100a1*4+0x02000000,0x4); //CA1 =0 +//reg_write( DDR_REG_BASE + 0x100a2*4+0x02000000,0x1); //CA1 =0 +//reg_write( DDR_REG_BASE + 0x100a3*4+0x02000000,0x0); //CA1 =0 +//reg_write( DDR_REG_BASE + 0x100a4*4+0x02000000,0x3); //CA1 =0 +//reg_write( DDR_REG_BASE + 0x100a5*4+0x02000000,0x2); //CA1 =0 +//reg_write( DDR_REG_BASE + 0x100a6*4+0x02000000,0x6); //CA1 =0 +//reg_write( DDR_REG_BASE + 0x100a7*4+0x02000000,0x7); //CA1 =0 + + reg_write(DDR_REG_BASE + 0x120a0 * 4 + 0x2000000, 0x0); //lndq =1 dq0(????)---c17(k230)--dq0 + reg_write(DDR_REG_BASE + 0x120a1 * 4 + 0x2000000, 0x6); //CA1 =0 dq1---b19(k230)---dq6 + reg_write(DDR_REG_BASE + 0x120a2 * 4 + 0x2000000, 0x1); //CA1 =0 dq2--d16-dq1 + reg_write(DDR_REG_BASE + 0x120a3 * 4 + 0x2000000, 0x3); //CA1 =0 + reg_write(DDR_REG_BASE + 0x120a4 * 4 + 0x2000000, 0x2); //CA1 =0 dq4--c17--dq2 + reg_write(DDR_REG_BASE + 0x120a5 * 4 + 0x2000000, 0x5); //CA1 =0 + reg_write(DDR_REG_BASE + 0x120a6 * 4 + 0x2000000, 0x4); //CA1 =0 dq6--e18--dq4 + reg_write(DDR_REG_BASE + 0x120a7 * 4 + 0x2000000, 0x7); //CA1 =0 + + reg_write(DDR_REG_BASE + 0x110a0 * 4 + 0x2000000, 0x0); //lndq =1 dq8_0--r17--dq10_2 + reg_write(DDR_REG_BASE + 0x110a1 * 4 + 0x2000000, 0x1); //CA1 =0 dq9_1--t18--dq12_4 + reg_write(DDR_REG_BASE + 0x110a2 * 4 + 0x2000000, 0x2); //CA1 =0 dq10--R18--dq8_0 + reg_write(DDR_REG_BASE + 0x110a3 * 4 + 0x2000000, 0x6); //CA1 =0 dq11--P16--dq9_1 + reg_write(DDR_REG_BASE + 0x110a4 * 4 + 0x2000000, 0x4); //CA1 =0 dq12--w19--dq11_3 + reg_write(DDR_REG_BASE + 0x110a5 * 4 + 0x2000000, 0x3); //CA1 =0 dq13--u20--dq13_5 + reg_write(DDR_REG_BASE + 0x110a6 * 4 + 0x2000000, 0x5); //CA1 =0 dq14--u18--dq14_6 + reg_write(DDR_REG_BASE + 0x110a7 * 4 + 0x2000000, 0x7); //CA1 =0 + + reg_write(DDR_REG_BASE + 0x130a0 * 4 + 0x2000000, 0x0); //lndq =1 + reg_write(DDR_REG_BASE + 0x130a1 * 4 + 0x2000000, 0x1); //CA1 =0 dq17--d14--dq20_4 + reg_write(DDR_REG_BASE + 0x130a2 * 4 + 0x2000000, 0x6); //CA1 =0 dq18--c16--dq18_2 + reg_write(DDR_REG_BASE + 0x130a3 * 4 + 0x2000000, 0x3); //CA1 =0 dq19--a14--dq21_5 + reg_write(DDR_REG_BASE + 0x130a4 * 4 + 0x2000000, 0x2); //CA1 =0 dq20--b14--dq17_1 + reg_write(DDR_REG_BASE + 0x130a5 * 4 + 0x2000000, 0x5); //CA1 =0 dq21--b16--dq23_7 + reg_write(DDR_REG_BASE + 0x130a6 * 4 + 0x2000000, 0x4); //CA1 =0 dq22--a17--dq19_3 + reg_write(DDR_REG_BASE + 0x130a7 * 4 + 0x2000000, 0x7); //CA1 =0 dq23--b17--dq22_6 + + reg_write(DDR_REG_BASE + 0x100a0 * 4 + 0x2000000, 0x6); //lndq =1 dq24--t16--dq30_6 + reg_write(DDR_REG_BASE + 0x100a1 * 4 + 0x2000000, 0x2); //CA1 =0 dq25--v18--dq25_1 + reg_write(DDR_REG_BASE + 0x100a2 * 4 + 0x2000000, 0x0); //CA1 =0 dq26--u17--dq29_5 + reg_write(DDR_REG_BASE + 0x100a3 * 4 + 0x2000000, 0x4); //CA1 =0 dq27--y16--dq27_3 + reg_write(DDR_REG_BASE + 0x100a4 * 4 + 0x2000000, 0x3); //CA1 =0 dq28--e18--dq24_0 + reg_write(DDR_REG_BASE + 0x100a5 * 4 + 0x2000000, 0x1); //CA1 =0 dq29--y18--dq28_4 + reg_write(DDR_REG_BASE + 0x100a6 * 4 + 0x2000000, 0x5); //CA1 =0 dq30--v16--dq26_2 + reg_write(DDR_REG_BASE + 0x100a7 * 4 + 0x2000000, 0x7); //CA1 =0 + + +#else + reg_write(DDR_REG_BASE + 0x100a0 * 4 + 0x2000000, 0x0); //lndq =1 + reg_write(DDR_REG_BASE + 0x100a1 * 4 + 0x2000000, 0x1); //CA1 =0 + reg_write(DDR_REG_BASE + 0x100a2 * 4 + 0x2000000, 0x2); //CA1 =0 + reg_write(DDR_REG_BASE + 0x100a3 * 4 + 0x2000000, 0x3); //CA1 =0 + reg_write(DDR_REG_BASE + 0x100a4 * 4 + 0x2000000, 0x4); //CA1 =0 + reg_write(DDR_REG_BASE + 0x100a5 * 4 + 0x2000000, 0x5); //CA1 =0 + reg_write(DDR_REG_BASE + 0x100a6 * 4 + 0x2000000, 0x6); //CA1 =0 + reg_write(DDR_REG_BASE + 0x100a7 * 4 + 0x2000000, 0x7); //CA1 =0 + + reg_write(DDR_REG_BASE + 0x110a0 * 4 + 0x2000000, 0x2); //lndq =1 + reg_write(DDR_REG_BASE + 0x110a1 * 4 + 0x2000000, 0x6); //CA1 =0 + reg_write(DDR_REG_BASE + 0x110a2 * 4 + 0x2000000, 0x0); //CA1 =0 + reg_write(DDR_REG_BASE + 0x110a3 * 4 + 0x2000000, 0x4); //CA1 =0 + reg_write(DDR_REG_BASE + 0x110a4 * 4 + 0x2000000, 0x1); //CA1 =0 + reg_write(DDR_REG_BASE + 0x110a5 * 4 + 0x2000000, 0x3); //CA1 =0 + reg_write(DDR_REG_BASE + 0x110a6 * 4 + 0x2000000, 0x5); //CA1 =0 + reg_write(DDR_REG_BASE + 0x110a7 * 4 + 0x2000000, 0x7); //CA1 =0 + + reg_write(DDR_REG_BASE + 0x120a0 * 4 + 0x2000000, 0x0); //lndq =1 + reg_write(DDR_REG_BASE + 0x120a1 * 4 + 0x2000000, 0x2); //CA1 =0 + reg_write(DDR_REG_BASE + 0x120a2 * 4 + 0x2000000, 0x6); //CA1 =0 + reg_write(DDR_REG_BASE + 0x120a3 * 4 + 0x2000000, 0x4); //CA1 =0 + reg_write(DDR_REG_BASE + 0x120a4 * 4 + 0x2000000, 0x1); //CA1 =0 + reg_write(DDR_REG_BASE + 0x120a5 * 4 + 0x2000000, 0x3); //CA1 =0 + reg_write(DDR_REG_BASE + 0x120a6 * 4 + 0x2000000, 0x7); //CA1 =0 + reg_write(DDR_REG_BASE + 0x120a7 * 4 + 0x2000000, 0x5); //CA1 =0 + + reg_write(DDR_REG_BASE + 0x130a0 * 4 + 0x2000000, 0x3); //lndq =1 + reg_write(DDR_REG_BASE + 0x130a1 * 4 + 0x2000000, 0x2); //CA1 =0 + reg_write(DDR_REG_BASE + 0x130a2 * 4 + 0x2000000, 0x5); //CA1 =0 + reg_write(DDR_REG_BASE + 0x130a3 * 4 + 0x2000000, 0x4); //CA1 =0 + reg_write(DDR_REG_BASE + 0x130a4 * 4 + 0x2000000, 0x1); //CA1 =0 + reg_write(DDR_REG_BASE + 0x130a5 * 4 + 0x2000000, 0x0); //CA1 =0 + reg_write(DDR_REG_BASE + 0x130a6 * 4 + 0x2000000, 0x6); //CA1 =0 + reg_write(DDR_REG_BASE + 0x130a7 * 4 + 0x2000000, 0x7); //CA1 =0 +#endif + +reg_write( DDR_REG_BASE + 0x20060*4+0x02000000,0x2); + + +reg_write( DDR_REG_BASE + 0xd0000*4+0x02000000,0x0); + +reg_write( DDR_REG_BASE + 0x50000*4+0x02000000,0xb0); +reg_write( DDR_REG_BASE + 0x50001*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50002*4+0x02000000,0x50); +reg_write( DDR_REG_BASE + 0x50003*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50004*4+0x02000000,0x50); +reg_write( DDR_REG_BASE + 0x50005*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50006*4+0x02000000,0x50); +reg_write( DDR_REG_BASE + 0x50007*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50008*4+0x02000000,0x50); +reg_write( DDR_REG_BASE + 0x50009*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5000a*4+0x02000000,0x50); +reg_write( DDR_REG_BASE + 0x5000b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5000c*4+0x02000000,0x50); +reg_write( DDR_REG_BASE + 0x5000d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5000e*4+0x02000000,0x50); +reg_write( DDR_REG_BASE + 0x5000f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50010*4+0x02000000,0x50); +reg_write( DDR_REG_BASE + 0x50011*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50012*4+0x02000000,0x50); +reg_write( DDR_REG_BASE + 0x50013*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50014*4+0x02000000,0x50); +reg_write( DDR_REG_BASE + 0x50015*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50016*4+0x02000000,0x50); +reg_write( DDR_REG_BASE + 0x50017*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50018*4+0x02000000,0x50); +reg_write( DDR_REG_BASE + 0x50019*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5001a*4+0x02000000,0x50); +reg_write( DDR_REG_BASE + 0x5001b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5001c*4+0x02000000,0x50); +reg_write( DDR_REG_BASE + 0x5001d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5001e*4+0x02000000,0x50); +reg_write( DDR_REG_BASE + 0x5001f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50020*4+0x02000000,0x50); +reg_write( DDR_REG_BASE + 0x50021*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50022*4+0x02000000,0x50); +reg_write( DDR_REG_BASE + 0x50023*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50024*4+0x02000000,0x50); +reg_write( DDR_REG_BASE + 0x50025*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50026*4+0x02000000,0x50); +reg_write( DDR_REG_BASE + 0x50027*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50028*4+0x02000000,0x2069); +reg_write( DDR_REG_BASE + 0x50029*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x5002a*4+0x02000000,0x264a); +reg_write( DDR_REG_BASE + 0x5002b*4+0x02000000,0x7000); +reg_write( DDR_REG_BASE + 0x5002c*4+0x02000000,0x264a); +reg_write( DDR_REG_BASE + 0x5002d*4+0x02000000,0x7000); +reg_write( DDR_REG_BASE + 0x5002e*4+0x02000000,0x264a); +reg_write( DDR_REG_BASE + 0x5002f*4+0x02000000,0x7000); +reg_write( DDR_REG_BASE + 0x50030*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50031*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50032*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50033*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50034*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50035*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50036*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50037*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50038*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50039*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5003a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5003b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5003c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5003d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5003e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5003f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50040*4+0x02000000,0x7054); +reg_write( DDR_REG_BASE + 0x50041*4+0x02000000,0x7ce0); +reg_write( DDR_REG_BASE + 0x50042*4+0x02000000,0x4300); +reg_write( DDR_REG_BASE + 0x50043*4+0x02000000,0x1101); +reg_write( DDR_REG_BASE + 0x50044*4+0x02000000,0x48c); +reg_write( DDR_REG_BASE + 0x50045*4+0x02000000,0x2242); +reg_write( DDR_REG_BASE + 0x50046*4+0x02000000,0x8042); +reg_write( DDR_REG_BASE + 0x50047*4+0x02000000,0x1b01); +reg_write( DDR_REG_BASE + 0x50048*4+0x02000000,0x312); +reg_write( DDR_REG_BASE + 0x50049*4+0x02000000,0xf5fb); +reg_write( DDR_REG_BASE + 0x5004a*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x5004b*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x5004c*4+0x02000000,0x2244); +reg_write( DDR_REG_BASE + 0x5004d*4+0x02000000,0x8ffc); +reg_write( DDR_REG_BASE + 0x5004e*4+0x02000000,0x264a); +reg_write( DDR_REG_BASE + 0x5004f*4+0x02000000,0x7000); +reg_write( DDR_REG_BASE + 0x50050*4+0x02000000,0x20e8); +reg_write( DDR_REG_BASE + 0x50051*4+0x02000000,0x1a2); +reg_write( DDR_REG_BASE + 0x50052*4+0x02000000,0x202f); +reg_write( DDR_REG_BASE + 0x50053*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50054*4+0x02000000,0x212f); +reg_write( DDR_REG_BASE + 0x50055*4+0x02000000,0x4b); +reg_write( DDR_REG_BASE + 0x50056*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x50057*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x50058*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x50059*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x5005a*4+0x02000000,0x706c); +reg_write( DDR_REG_BASE + 0x5005b*4+0x02000000,0x704d); +reg_write( DDR_REG_BASE + 0x5005c*4+0x02000000,0x706d); +reg_write( DDR_REG_BASE + 0x5005d*4+0x02000000,0x708d); +reg_write( DDR_REG_BASE + 0x5005e*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x5005f*4+0x02000000,0x70cd); +reg_write( DDR_REG_BASE + 0x50060*4+0x02000000,0x70ed); +reg_write( DDR_REG_BASE + 0x50061*4+0x02000000,0x206a); +reg_write( DDR_REG_BASE + 0x50062*4+0x02000000,0x280); +reg_write( DDR_REG_BASE + 0x50063*4+0x02000000,0xb88d); +reg_write( DDR_REG_BASE + 0x50064*4+0x02000000,0x2029); +reg_write( DDR_REG_BASE + 0x50065*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50066*4+0x02000000,0x44db); +reg_write( DDR_REG_BASE + 0x50067*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50068*4+0x02000000,0x4000); +reg_write( DDR_REG_BASE + 0x50069*4+0x02000000,0x42db); +reg_write( DDR_REG_BASE + 0x5006a*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5006b*4+0x02000000,0x400); +reg_write( DDR_REG_BASE + 0x5006c*4+0x02000000,0x706f); +reg_write( DDR_REG_BASE + 0x5006d*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x5006e*4+0x02000000,0x2022); +reg_write( DDR_REG_BASE + 0x5006f*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x50070*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50071*4+0x02000000,0x2130); +reg_write( DDR_REG_BASE + 0x50072*4+0x02000000,0x2069); +reg_write( DDR_REG_BASE + 0x50073*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x50074*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x50075*4+0x02000000,0xf1fe); +reg_write( DDR_REG_BASE + 0x50076*4+0x02000000,0xc3e1); +reg_write( DDR_REG_BASE + 0x50077*4+0x02000000,0xc2e1); +reg_write( DDR_REG_BASE + 0x50078*4+0x02000000,0xc1e1); +reg_write( DDR_REG_BASE + 0x50079*4+0x02000000,0xc0e1); +reg_write( DDR_REG_BASE + 0x5007a*4+0x02000000,0xc0f1); +reg_write( DDR_REG_BASE + 0x5007b*4+0x02000000,0xc1a1); +reg_write( DDR_REG_BASE + 0x5007c*4+0x02000000,0xe805); +reg_write( DDR_REG_BASE + 0x5007d*4+0x02000000,0x7487); +reg_write( DDR_REG_BASE + 0x5007e*4+0x02000000,0xc0d1); +reg_write( DDR_REG_BASE + 0x5007f*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x50080*4+0x02000000,0xc0a4); +reg_write( DDR_REG_BASE + 0x50081*4+0x02000000,0xda23); +reg_write( DDR_REG_BASE + 0x50082*4+0x02000000,0xba9f); +reg_write( DDR_REG_BASE + 0x50083*4+0x02000000,0x8a60); +reg_write( DDR_REG_BASE + 0x50084*4+0x02000000,0x1226); +reg_write( DDR_REG_BASE + 0x50085*4+0x02000000,0x80); +reg_write( DDR_REG_BASE + 0x50086*4+0x02000000,0x7865); +reg_write( DDR_REG_BASE + 0x50087*4+0x02000000,0x1aec); +reg_write( DDR_REG_BASE + 0x50088*4+0x02000000,0x8002); +reg_write( DDR_REG_BASE + 0x50089*4+0x02000000,0x12ef); +reg_write( DDR_REG_BASE + 0x5008a*4+0x02000000,0x8080); +reg_write( DDR_REG_BASE + 0x5008b*4+0x02000000,0x208c); +reg_write( DDR_REG_BASE + 0x5008c*4+0x02000000,0x8fc3); +reg_write( DDR_REG_BASE + 0x5008d*4+0x02000000,0xf20e); +reg_write( DDR_REG_BASE + 0x5008e*4+0x02000000,0xc084); +reg_write( DDR_REG_BASE + 0x5008f*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x50090*4+0x02000000,0x4020); +reg_write( DDR_REG_BASE + 0x50091*4+0x02000000,0x9ca); +reg_write( DDR_REG_BASE + 0x50092*4+0x02000000,0x260); +reg_write( DDR_REG_BASE + 0x50093*4+0x02000000,0xc184); +reg_write( DDR_REG_BASE + 0x50094*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x50095*4+0x02000000,0x402); +reg_write( DDR_REG_BASE + 0x50096*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50097*4+0x02000000,0xf36); +reg_write( DDR_REG_BASE + 0x50098*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x50099*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x5009a*4+0x02000000,0x94e); +reg_write( DDR_REG_BASE + 0x5009b*4+0x02000000,0x260); +reg_write( DDR_REG_BASE + 0x5009c*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x5009d*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x5009e*4+0x02000000,0x20ab); +reg_write( DDR_REG_BASE + 0x5009f*4+0x02000000,0xc4); +reg_write( DDR_REG_BASE + 0x500a0*4+0x02000000,0x7fff); +reg_write( DDR_REG_BASE + 0x500a1*4+0x02000000,0xf000); +reg_write( DDR_REG_BASE + 0x500a2*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x500a3*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x500a4*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x500a5*4+0x02000000,0xc1a8); +reg_write( DDR_REG_BASE + 0x500a6*4+0x02000000,0xc243); +reg_write( DDR_REG_BASE + 0x500a7*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE + 0x500a8*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x500a9*4+0x02000000,0xc147); +reg_write( DDR_REG_BASE + 0x500aa*4+0x02000000,0xa100); +reg_write( DDR_REG_BASE + 0x500ab*4+0x02000000,0xc345); +reg_write( DDR_REG_BASE + 0x500ac*4+0x02000000,0xc103); +reg_write( DDR_REG_BASE + 0x500ad*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x500ae*4+0x02000000,0x1a7); +reg_write( DDR_REG_BASE + 0x500af*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x500b0*4+0x02000000,0xa100); +reg_write( DDR_REG_BASE + 0x500b1*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE + 0x500b2*4+0x02000000,0x815); +reg_write( DDR_REG_BASE + 0x500b3*4+0x02000000,0x70); +reg_write( DDR_REG_BASE + 0x500b4*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x500b5*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE + 0x500b6*4+0x02000000,0xe88b); +reg_write( DDR_REG_BASE + 0x500b7*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x500b8*4+0x02000000,0x218a); +reg_write( DDR_REG_BASE + 0x500b9*4+0x02000000,0xfcf); +reg_write( DDR_REG_BASE + 0x500ba*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x500bb*4+0x02000000,0xf005); +reg_write( DDR_REG_BASE + 0x500bc*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x500bd*4+0x02000000,0x228a); +reg_write( DDR_REG_BASE + 0x500be*4+0x02000000,0xfcf); +reg_write( DDR_REG_BASE + 0x500bf*4+0x02000000,0xf8e); +reg_write( DDR_REG_BASE + 0x500c0*4+0x02000000,0x280); +reg_write( DDR_REG_BASE + 0x500c1*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x500c2*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x500c3*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x500c4*4+0x02000000,0x79d); +reg_write( DDR_REG_BASE + 0x500c5*4+0x02000000,0xc046); +reg_write( DDR_REG_BASE + 0x500c6*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x500c7*4+0x02000000,0x4318); +reg_write( DDR_REG_BASE + 0x500c8*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x500c9*4+0x02000000,0xf058); +reg_write( DDR_REG_BASE + 0x500ca*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x500cb*4+0x02000000,0x7000); +reg_write( DDR_REG_BASE + 0x500cc*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x500cd*4+0x02000000,0x7a0); +reg_write( DDR_REG_BASE + 0x500ce*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE + 0x500cf*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x500d0*4+0x02000000,0x54); +reg_write( DDR_REG_BASE + 0x500d1*4+0x02000000,0x2032); +reg_write( DDR_REG_BASE + 0x500d2*4+0x02000000,0x6c1); +reg_write( DDR_REG_BASE + 0x500d3*4+0x02000000,0x211a); +reg_write( DDR_REG_BASE + 0x500d4*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x500d5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x500d6*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE + 0x500d7*4+0x02000000,0x78c5); +reg_write( DDR_REG_BASE + 0x500d8*4+0x02000000,0x9000); +reg_write( DDR_REG_BASE + 0x500d9*4+0x02000000,0xef6); +reg_write( DDR_REG_BASE + 0x500da*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x500db*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x500dc*4+0x02000000,0x4508); +reg_write( DDR_REG_BASE + 0x500dd*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x500de*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x500df*4+0x02000000,0x7a0); +reg_write( DDR_REG_BASE + 0x500e0*4+0x02000000,0x8002); +reg_write( DDR_REG_BASE + 0x500e1*4+0x02000000,0x2032); +reg_write( DDR_REG_BASE + 0x500e2*4+0x02000000,0x6c1); +reg_write( DDR_REG_BASE + 0x500e3*4+0x02000000,0x211a); +reg_write( DDR_REG_BASE + 0x500e4*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x500e5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x500e6*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE + 0x500e7*4+0x02000000,0x7e05); +reg_write( DDR_REG_BASE + 0x500e8*4+0x02000000,0x9600); +reg_write( DDR_REG_BASE + 0x500e9*4+0x02000000,0xed6); +reg_write( DDR_REG_BASE + 0x500ea*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x500eb*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x500ec*4+0x02000000,0xc105); +reg_write( DDR_REG_BASE + 0x500ed*4+0x02000000,0x42eb); +reg_write( DDR_REG_BASE + 0x500ee*4+0x02000000,0xf86c); +reg_write( DDR_REG_BASE + 0x500ef*4+0x02000000,0x4759); +reg_write( DDR_REG_BASE + 0x500f0*4+0x02000000,0xe90b); +reg_write( DDR_REG_BASE + 0x500f1*4+0x02000000,0x2344); +reg_write( DDR_REG_BASE + 0x500f2*4+0x02000000,0x80); +reg_write( DDR_REG_BASE + 0x500f3*4+0x02000000,0x7f05); +reg_write( DDR_REG_BASE + 0x500f4*4+0x02000000,0x2544); +reg_write( DDR_REG_BASE + 0x500f5*4+0x02000000,0x1080); +reg_write( DDR_REG_BASE + 0x500f6*4+0x02000000,0x7a05); +reg_write( DDR_REG_BASE + 0x500f7*4+0x02000000,0x2247); +reg_write( DDR_REG_BASE + 0x500f8*4+0x02000000,0xc1); +reg_write( DDR_REG_BASE + 0x500f9*4+0x02000000,0x79e5); +reg_write( DDR_REG_BASE + 0x500fa*4+0x02000000,0xf017); +reg_write( DDR_REG_BASE + 0x500fb*4+0x02000000,0x42eb); +reg_write( DDR_REG_BASE + 0x500fc*4+0x02000000,0xf85a); +reg_write( DDR_REG_BASE + 0x500fd*4+0x02000000,0x4759); +reg_write( DDR_REG_BASE + 0x500fe*4+0x02000000,0xc142); +reg_write( DDR_REG_BASE + 0x500ff*4+0x02000000,0x42eb); +reg_write( DDR_REG_BASE + 0x50100*4+0x02000000,0xf845); +reg_write( DDR_REG_BASE + 0x50101*4+0x02000000,0x4759); +reg_write( DDR_REG_BASE + 0x50102*4+0x02000000,0x272f); +reg_write( DDR_REG_BASE + 0x50103*4+0x02000000,0x3382); +reg_write( DDR_REG_BASE + 0x50104*4+0x02000000,0x2744); +reg_write( DDR_REG_BASE + 0x50105*4+0x02000000,0x3201); +reg_write( DDR_REG_BASE + 0x50106*4+0x02000000,0x7985); +reg_write( DDR_REG_BASE + 0x50107*4+0x02000000,0xc402); +reg_write( DDR_REG_BASE + 0x50108*4+0x02000000,0x42eb); +reg_write( DDR_REG_BASE + 0x50109*4+0x02000000,0xf84b); +reg_write( DDR_REG_BASE + 0x5010a*4+0x02000000,0x4759); +reg_write( DDR_REG_BASE + 0x5010b*4+0x02000000,0x2744); +reg_write( DDR_REG_BASE + 0x5010c*4+0x02000000,0x3102); +reg_write( DDR_REG_BASE + 0x5010d*4+0x02000000,0x42eb); +reg_write( DDR_REG_BASE + 0x5010e*4+0x02000000,0xf858); +reg_write( DDR_REG_BASE + 0x5010f*4+0x02000000,0x4759); +reg_write( DDR_REG_BASE + 0x50110*4+0x02000000,0x7905); +reg_write( DDR_REG_BASE + 0x50111*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE + 0x50112*4+0x02000000,0x4220); +reg_write( DDR_REG_BASE + 0x50113*4+0x02000000,0x7167); +reg_write( DDR_REG_BASE + 0x50114*4+0x02000000,0x205a); +reg_write( DDR_REG_BASE + 0x50115*4+0x02000000,0x200); +reg_write( DDR_REG_BASE + 0x50116*4+0x02000000,0xb8c4); +reg_write( DDR_REG_BASE + 0x50117*4+0x02000000,0xe806); +reg_write( DDR_REG_BASE + 0x50118*4+0x02000000,0xb861); +reg_write( DDR_REG_BASE + 0x50119*4+0x02000000,0x801); +reg_write( DDR_REG_BASE + 0x5011a*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x5011b*4+0x02000000,0x7a5b); +reg_write( DDR_REG_BASE + 0x5011c*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE + 0x5011d*4+0x02000000,0x8020); +reg_write( DDR_REG_BASE + 0x5011e*4+0x02000000,0x7945); +reg_write( DDR_REG_BASE + 0x5011f*4+0x02000000,0xa020); +reg_write( DDR_REG_BASE + 0x50120*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE + 0x50121*4+0x02000000,0x230c); +reg_write( DDR_REG_BASE + 0x50122*4+0x02000000,0xb000); +reg_write( DDR_REG_BASE + 0x50123*4+0x02000000,0x750); +reg_write( DDR_REG_BASE + 0x50124*4+0x02000000,0xffc5); +reg_write( DDR_REG_BASE + 0x50125*4+0x02000000,0xf052); +reg_write( DDR_REG_BASE + 0x50126*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x50127*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50128*4+0x02000000,0x7a0); +reg_write( DDR_REG_BASE + 0x50129*4+0x02000000,0x8021); +reg_write( DDR_REG_BASE + 0x5012a*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x5012b*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE + 0x5012c*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x5012d*4+0x02000000,0x54); +reg_write( DDR_REG_BASE + 0x5012e*4+0x02000000,0x42eb); +reg_write( DDR_REG_BASE + 0x5012f*4+0x02000000,0xf851); +reg_write( DDR_REG_BASE + 0x50130*4+0x02000000,0x4759); +reg_write( DDR_REG_BASE + 0x50131*4+0x02000000,0xe46); +reg_write( DDR_REG_BASE + 0x50132*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x50133*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x50134*4+0x02000000,0x4508); +reg_write( DDR_REG_BASE + 0x50135*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x50136*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50137*4+0x02000000,0x7a0); +reg_write( DDR_REG_BASE + 0x50138*4+0x02000000,0x8023); +reg_write( DDR_REG_BASE + 0x50139*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x5013a*4+0x02000000,0x42eb); +reg_write( DDR_REG_BASE + 0x5013b*4+0x02000000,0xf84b); +reg_write( DDR_REG_BASE + 0x5013c*4+0x02000000,0x4759); +reg_write( DDR_REG_BASE + 0x5013d*4+0x02000000,0xe2e); +reg_write( DDR_REG_BASE + 0x5013e*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x5013f*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x50140*4+0x02000000,0xc105); +reg_write( DDR_REG_BASE + 0x50141*4+0x02000000,0x42eb); +reg_write( DDR_REG_BASE + 0x50142*4+0x02000000,0xf842); +reg_write( DDR_REG_BASE + 0x50143*4+0x02000000,0x4759); +reg_write( DDR_REG_BASE + 0x50144*4+0x02000000,0xe90b); +reg_write( DDR_REG_BASE + 0x50145*4+0x02000000,0x2344); +reg_write( DDR_REG_BASE + 0x50146*4+0x02000000,0x80); +reg_write( DDR_REG_BASE + 0x50147*4+0x02000000,0x7f05); +reg_write( DDR_REG_BASE + 0x50148*4+0x02000000,0x2544); +reg_write( DDR_REG_BASE + 0x50149*4+0x02000000,0x1080); +reg_write( DDR_REG_BASE + 0x5014a*4+0x02000000,0x7845); +reg_write( DDR_REG_BASE + 0x5014b*4+0x02000000,0x2047); +reg_write( DDR_REG_BASE + 0x5014c*4+0x02000000,0xc0); +reg_write( DDR_REG_BASE + 0x5014d*4+0x02000000,0x78e5); +reg_write( DDR_REG_BASE + 0x5014e*4+0x02000000,0xf017); +reg_write( DDR_REG_BASE + 0x5014f*4+0x02000000,0x42eb); +reg_write( DDR_REG_BASE + 0x50150*4+0x02000000,0xf830); +reg_write( DDR_REG_BASE + 0x50151*4+0x02000000,0x4759); +reg_write( DDR_REG_BASE + 0x50152*4+0x02000000,0xc142); +reg_write( DDR_REG_BASE + 0x50153*4+0x02000000,0x42eb); +reg_write( DDR_REG_BASE + 0x50154*4+0x02000000,0xf81b); +reg_write( DDR_REG_BASE + 0x50155*4+0x02000000,0x4759); +reg_write( DDR_REG_BASE + 0x50156*4+0x02000000,0x272f); +reg_write( DDR_REG_BASE + 0x50157*4+0x02000000,0x3382); +reg_write( DDR_REG_BASE + 0x50158*4+0x02000000,0x2744); +reg_write( DDR_REG_BASE + 0x50159*4+0x02000000,0x3201); +reg_write( DDR_REG_BASE + 0x5015a*4+0x02000000,0x7985); +reg_write( DDR_REG_BASE + 0x5015b*4+0x02000000,0xc402); +reg_write( DDR_REG_BASE + 0x5015c*4+0x02000000,0x42eb); +reg_write( DDR_REG_BASE + 0x5015d*4+0x02000000,0xf821); +reg_write( DDR_REG_BASE + 0x5015e*4+0x02000000,0x4759); +reg_write( DDR_REG_BASE + 0x5015f*4+0x02000000,0x2744); +reg_write( DDR_REG_BASE + 0x50160*4+0x02000000,0x3102); +reg_write( DDR_REG_BASE + 0x50161*4+0x02000000,0x42eb); +reg_write( DDR_REG_BASE + 0x50162*4+0x02000000,0xf82e); +reg_write( DDR_REG_BASE + 0x50163*4+0x02000000,0x4759); +reg_write( DDR_REG_BASE + 0x50164*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x50165*4+0x02000000,0xc100); +reg_write( DDR_REG_BASE + 0x50166*4+0x02000000,0x215a); +reg_write( DDR_REG_BASE + 0x50167*4+0x02000000,0x201); +reg_write( DDR_REG_BASE + 0x50168*4+0x02000000,0xb9c4); +reg_write( DDR_REG_BASE + 0x50169*4+0x02000000,0xe906); +reg_write( DDR_REG_BASE + 0x5016a*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE + 0x5016b*4+0x02000000,0x901); +reg_write( DDR_REG_BASE + 0x5016c*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x5016d*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x5016e*4+0x02000000,0xc103); +reg_write( DDR_REG_BASE + 0x5016f*4+0x02000000,0x8120); +reg_write( DDR_REG_BASE + 0x50170*4+0x02000000,0x7905); +reg_write( DDR_REG_BASE + 0x50171*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE + 0x50172*4+0x02000000,0xa020); +reg_write( DDR_REG_BASE + 0x50173*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x50174*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE + 0x50175*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x50176*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x50177*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50178*4+0x02000000,0x79d); +reg_write( DDR_REG_BASE + 0x50179*4+0x02000000,0x8821); +reg_write( DDR_REG_BASE + 0x5017a*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x5017b*4+0x02000000,0x7030); +reg_write( DDR_REG_BASE + 0x5017c*4+0x02000000,0x754); +reg_write( DDR_REG_BASE + 0x5017d*4+0x02000000,0xffc5); +reg_write( DDR_REG_BASE + 0x5017e*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE + 0x5017f*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE + 0x50180*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x50181*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE + 0x50182*4+0x02000000,0x7214); +reg_write( DDR_REG_BASE + 0x50183*4+0x02000000,0x65e); +reg_write( DDR_REG_BASE + 0x50184*4+0x02000000,0xffc5); +reg_write( DDR_REG_BASE + 0x50185*4+0x02000000,0xc0a8); +reg_write( DDR_REG_BASE + 0x50186*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x50187*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x50188*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x50189*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x5018a*4+0x02000000,0x2144); +reg_write( DDR_REG_BASE + 0x5018b*4+0x02000000,0x801); +reg_write( DDR_REG_BASE + 0x5018c*4+0x02000000,0x79c5); +reg_write( DDR_REG_BASE + 0x5018d*4+0x02000000,0x7c25); +reg_write( DDR_REG_BASE + 0x5018e*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE + 0x5018f*4+0x02000000,0x7964); +reg_write( DDR_REG_BASE + 0x50190*4+0x02000000,0x7985); +reg_write( DDR_REG_BASE + 0x50191*4+0x02000000,0x7f25); +reg_write( DDR_REG_BASE + 0x50192*4+0x02000000,0x2644); +reg_write( DDR_REG_BASE + 0x50193*4+0x02000000,0x308c); +reg_write( DDR_REG_BASE + 0x50194*4+0x02000000,0x791d); +reg_write( DDR_REG_BASE + 0x50195*4+0x02000000,0x7ce5); +reg_write( DDR_REG_BASE + 0x50196*4+0x02000000,0x7f3d); +reg_write( DDR_REG_BASE + 0x50197*4+0x02000000,0x2744); +reg_write( DDR_REG_BASE + 0x50198*4+0x02000000,0x1101); +reg_write( DDR_REG_BASE + 0x50199*4+0x02000000,0x7c25); +reg_write( DDR_REG_BASE + 0x5019a*4+0x02000000,0x791d); +reg_write( DDR_REG_BASE + 0x5019b*4+0x02000000,0x7e3d); +reg_write( DDR_REG_BASE + 0x5019c*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x5019d*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x5019e*4+0x02000000,0x2384); +reg_write( DDR_REG_BASE + 0x5019f*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x501a0*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x501a1*4+0x02000000,0x2444); +reg_write( DDR_REG_BASE + 0x501a2*4+0x02000000,0x140c); +reg_write( DDR_REG_BASE + 0x501a3*4+0x02000000,0x7d85); +reg_write( DDR_REG_BASE + 0x501a4*4+0x02000000,0x2344); +reg_write( DDR_REG_BASE + 0x501a5*4+0x02000000,0x180c); +reg_write( DDR_REG_BASE + 0x501a6*4+0x02000000,0x7ca5); +reg_write( DDR_REG_BASE + 0x501a7*4+0x02000000,0x7c65); +reg_write( DDR_REG_BASE + 0x501a8*4+0x02000000,0x2744); +reg_write( DDR_REG_BASE + 0x501a9*4+0x02000000,0x1083); +reg_write( DDR_REG_BASE + 0x501aa*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x501ab*4+0x02000000,0x7b85); +reg_write( DDR_REG_BASE + 0x501ac*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x501ad*4+0x02000000,0x7b45); +reg_write( DDR_REG_BASE + 0x501ae*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x501af*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x501b0*4+0x02000000,0x255e); +reg_write( DDR_REG_BASE + 0x501b1*4+0x02000000,0x1401); +reg_write( DDR_REG_BASE + 0x501b2*4+0x02000000,0x255a); +reg_write( DDR_REG_BASE + 0x501b3*4+0x02000000,0x110b); +reg_write( DDR_REG_BASE + 0x501b4*4+0x02000000,0xdc40); +reg_write( DDR_REG_BASE + 0x501b5*4+0x02000000,0x2144); +reg_write( DDR_REG_BASE + 0x501b6*4+0x02000000,0x40e); +reg_write( DDR_REG_BASE + 0x501b7*4+0x02000000,0x255e); +reg_write( DDR_REG_BASE + 0x501b8*4+0x02000000,0x1201); +reg_write( DDR_REG_BASE + 0x501b9*4+0x02000000,0x2404); +reg_write( DDR_REG_BASE + 0x501ba*4+0x02000000,0x12cc); +reg_write( DDR_REG_BASE + 0x501bb*4+0x02000000,0x2584); +reg_write( DDR_REG_BASE + 0x501bc*4+0x02000000,0x1002); +reg_write( DDR_REG_BASE + 0x501bd*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x501be*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x501bf*4+0x02000000,0x7a65); +reg_write( DDR_REG_BASE + 0x501c0*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE + 0x501c1*4+0x02000000,0x200); +reg_write( DDR_REG_BASE + 0x501c2*4+0x02000000,0x7845); +reg_write( DDR_REG_BASE + 0x501c3*4+0x02000000,0x2087); +reg_write( DDR_REG_BASE + 0x501c4*4+0x02000000,0xfc3); +reg_write( DDR_REG_BASE + 0x501c5*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x501c6*4+0x02000000,0x7c1d); +reg_write( DDR_REG_BASE + 0x501c7*4+0x02000000,0x2444); +reg_write( DDR_REG_BASE + 0x501c8*4+0x02000000,0x1042); +reg_write( DDR_REG_BASE + 0x501c9*4+0x02000000,0x260a); +reg_write( DDR_REG_BASE + 0x501ca*4+0x02000000,0x3300); +reg_write( DDR_REG_BASE + 0x501cb*4+0x02000000,0x7bbb); +reg_write( DDR_REG_BASE + 0x501cc*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE + 0x501cd*4+0x02000000,0x4f); +reg_write( DDR_REG_BASE + 0x501ce*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x501cf*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x501d0*4+0x02000000,0x6109); +reg_write( DDR_REG_BASE + 0x501d1*4+0x02000000,0x211a); +reg_write( DDR_REG_BASE + 0x501d2*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x501d3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x501d4*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE + 0x501d5*4+0x02000000,0x78c5); +reg_write( DDR_REG_BASE + 0x501d6*4+0x02000000,0x9000); +reg_write( DDR_REG_BASE + 0x501d7*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x501d8*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x501d9*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x501da*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x501db*4+0x02000000,0x2482); +reg_write( DDR_REG_BASE + 0x501dc*4+0x02000000,0x3c0c); +reg_write( DDR_REG_BASE + 0x501dd*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x501de*4+0x02000000,0x7100); +reg_write( DDR_REG_BASE + 0x501df*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x501e0*4+0x02000000,0xaa); +reg_write( DDR_REG_BASE + 0x501e1*4+0x02000000,0x70cd); +reg_write( DDR_REG_BASE + 0x501e2*4+0x02000000,0x2456); +reg_write( DDR_REG_BASE + 0x501e3*4+0x02000000,0x3c02); +reg_write( DDR_REG_BASE + 0x501e4*4+0x02000000,0xc04b); +reg_write( DDR_REG_BASE + 0x501e5*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x501e6*4+0x02000000,0x7384); +reg_write( DDR_REG_BASE + 0x501e7*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE + 0x501e8*4+0x02000000,0xe0aa); +reg_write( DDR_REG_BASE + 0x501e9*4+0x02000000,0x206f); +reg_write( DDR_REG_BASE + 0x501ea*4+0x02000000,0x243); +reg_write( DDR_REG_BASE + 0x501eb*4+0x02000000,0x88a0); +reg_write( DDR_REG_BASE + 0x501ec*4+0x02000000,0x1045); +reg_write( DDR_REG_BASE + 0x501ed*4+0x02000000,0x81); +reg_write( DDR_REG_BASE + 0x501ee*4+0x02000000,0x881f); +reg_write( DDR_REG_BASE + 0x501ef*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x501f0*4+0x02000000,0x3f83); +reg_write( DDR_REG_BASE + 0x501f1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x501f2*4+0x02000000,0x53); +reg_write( DDR_REG_BASE + 0x501f3*4+0x02000000,0xc148); +reg_write( DDR_REG_BASE + 0x501f4*4+0x02000000,0xc049); +reg_write( DDR_REG_BASE + 0x501f5*4+0x02000000,0xc095); +reg_write( DDR_REG_BASE + 0x501f6*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x501f7*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x501f8*4+0x02000000,0x3f81); +reg_write( DDR_REG_BASE + 0x501f9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x501fa*4+0x02000000,0x18c); +reg_write( DDR_REG_BASE + 0x501fb*4+0x02000000,0xac6); +reg_write( DDR_REG_BASE + 0x501fc*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x501fd*4+0x02000000,0x2456); +reg_write( DDR_REG_BASE + 0x501fe*4+0x02000000,0x3cc0); +reg_write( DDR_REG_BASE + 0x501ff*4+0x02000000,0xf00e); +reg_write( DDR_REG_BASE + 0x50200*4+0x02000000,0x265a); +reg_write( DDR_REG_BASE + 0x50201*4+0x02000000,0x1602); +reg_write( DDR_REG_BASE + 0x50202*4+0x02000000,0xf006); +reg_write( DDR_REG_BASE + 0x50203*4+0x02000000,0x6058); +reg_write( DDR_REG_BASE + 0x50204*4+0x02000000,0x6038); +reg_write( DDR_REG_BASE + 0x50205*4+0x02000000,0x1800); +reg_write( DDR_REG_BASE + 0x50206*4+0x02000000,0x3); +reg_write( DDR_REG_BASE + 0x50207*4+0x02000000,0x7124); +reg_write( DDR_REG_BASE + 0x50208*4+0x02000000,0x9f7); +reg_write( DDR_REG_BASE + 0x50209*4+0x02000000,0x8634); +reg_write( DDR_REG_BASE + 0x5020a*4+0x02000000,0xc098); +reg_write( DDR_REG_BASE + 0x5020b*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE + 0x5020c*4+0x02000000,0xee9); +reg_write( DDR_REG_BASE + 0x5020d*4+0x02000000,0x9334); +reg_write( DDR_REG_BASE + 0x5020e*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x5020f*4+0x02000000,0x251a); +reg_write( DDR_REG_BASE + 0x50210*4+0x02000000,0x1f80); +reg_write( DDR_REG_BASE + 0x50211*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x50212*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50213*4+0x02000000,0x70ed); +reg_write( DDR_REG_BASE + 0x50214*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x50215*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x50216*4+0x02000000,0x9001); +reg_write( DDR_REG_BASE + 0x50217*4+0x02000000,0xe100); +reg_write( DDR_REG_BASE + 0x50218*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE + 0x50219*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x5021a*4+0x02000000,0xc04a); +reg_write( DDR_REG_BASE + 0x5021b*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x5021c*4+0x02000000,0xb0e0); +reg_write( DDR_REG_BASE + 0x5021d*4+0x02000000,0xc109); +reg_write( DDR_REG_BASE + 0x5021e*4+0x02000000,0xc008); +reg_write( DDR_REG_BASE + 0x5021f*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x50220*4+0x02000000,0xc04c); +reg_write( DDR_REG_BASE + 0x50221*4+0x02000000,0x251a); +reg_write( DDR_REG_BASE + 0x50222*4+0x02000000,0x1f80); +reg_write( DDR_REG_BASE + 0x50223*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x50224*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50225*4+0x02000000,0xb887); +reg_write( DDR_REG_BASE + 0x50226*4+0x02000000,0xa2a); +reg_write( DDR_REG_BASE + 0x50227*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x50228*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE + 0x50229*4+0x02000000,0x563); +reg_write( DDR_REG_BASE + 0x5022a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5022b*4+0x02000000,0xc00c); +reg_write( DDR_REG_BASE + 0x5022c*4+0x02000000,0x2011); +reg_write( DDR_REG_BASE + 0x5022d*4+0x02000000,0x83c0); +reg_write( DDR_REG_BASE + 0x5022e*4+0x02000000,0x554); +reg_write( DDR_REG_BASE + 0x5022f*4+0x02000000,0x21); +reg_write( DDR_REG_BASE + 0x50230*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x50231*4+0x02000000,0x2744); +reg_write( DDR_REG_BASE + 0x50232*4+0x02000000,0x17c1); +reg_write( DDR_REG_BASE + 0x50233*4+0x02000000,0xe906); +reg_write( DDR_REG_BASE + 0x50234*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE + 0x50235*4+0x02000000,0x901); +reg_write( DDR_REG_BASE + 0x50236*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x50237*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x50238*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x50239*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x5023a*4+0x02000000,0xf009); +reg_write( DDR_REG_BASE + 0x5023b*4+0x02000000,0x2456); +reg_write( DDR_REG_BASE + 0x5023c*4+0x02000000,0x3d82); +reg_write( DDR_REG_BASE + 0x5023d*4+0x02000000,0x7a34); +reg_write( DDR_REG_BASE + 0x5023e*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x5023f*4+0x02000000,0x1ac0); +reg_write( DDR_REG_BASE + 0x50240*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x50241*4+0x02000000,0xb200); +reg_write( DDR_REG_BASE + 0x50242*4+0x02000000,0x7124); +reg_write( DDR_REG_BASE + 0x50243*4+0x02000000,0xe1e0); +reg_write( DDR_REG_BASE + 0x50244*4+0x02000000,0xf7b7); +reg_write( DDR_REG_BASE + 0x50245*4+0x02000000,0xc101); +reg_write( DDR_REG_BASE + 0x50246*4+0x02000000,0xc009); +reg_write( DDR_REG_BASE + 0x50247*4+0x02000000,0x2004); +reg_write( DDR_REG_BASE + 0x50248*4+0x02000000,0x8040); +reg_write( DDR_REG_BASE + 0x50249*4+0x02000000,0xc046); +reg_write( DDR_REG_BASE + 0x5024a*4+0x02000000,0xc008); +reg_write( DDR_REG_BASE + 0x5024b*4+0x02000000,0x7824); +reg_write( DDR_REG_BASE + 0x5024c*4+0x02000000,0xc047); +reg_write( DDR_REG_BASE + 0x5024d*4+0x02000000,0x2079); +reg_write( DDR_REG_BASE + 0x5024e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5024f*4+0x02000000,0x232f); +reg_write( DDR_REG_BASE + 0x50250*4+0x02000000,0x3000); +reg_write( DDR_REG_BASE + 0x50251*4+0x02000000,0x23c5); +reg_write( DDR_REG_BASE + 0x50252*4+0x02000000,0x3062); +reg_write( DDR_REG_BASE + 0x50253*4+0x02000000,0xf76); +reg_write( DDR_REG_BASE + 0x50254*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x50255*4+0x02000000,0x4063); +reg_write( DDR_REG_BASE + 0x50256*4+0x02000000,0x42c3); +reg_write( DDR_REG_BASE + 0x50257*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50258*4+0x02000000,0x758); +reg_write( DDR_REG_BASE + 0x50259*4+0x02000000,0x6748); +reg_write( DDR_REG_BASE + 0x5025a*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x5025b*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5025c*4+0x02000000,0x79d); +reg_write( DDR_REG_BASE + 0x5025d*4+0x02000000,0x45cb); +reg_write( DDR_REG_BASE + 0x5025e*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5025f*4+0x02000000,0x7a0); +reg_write( DDR_REG_BASE + 0x50260*4+0x02000000,0xa900); +reg_write( DDR_REG_BASE + 0x50261*4+0x02000000,0x62f8); +reg_write( DDR_REG_BASE + 0x50262*4+0x02000000,0x8862); +reg_write( DDR_REG_BASE + 0x50263*4+0x02000000,0x4a6c); +reg_write( DDR_REG_BASE + 0x50264*4+0x02000000,0x78f6); +reg_write( DDR_REG_BASE + 0x50265*4+0x02000000,0xa503); +reg_write( DDR_REG_BASE + 0x50266*4+0x02000000,0x4a4c); +reg_write( DDR_REG_BASE + 0x50267*4+0x02000000,0x78f6); +reg_write( DDR_REG_BASE + 0x50268*4+0x02000000,0xa502); +reg_write( DDR_REG_BASE + 0x50269*4+0x02000000,0x4a2c); +reg_write( DDR_REG_BASE + 0x5026a*4+0x02000000,0x78f6); +reg_write( DDR_REG_BASE + 0x5026b*4+0x02000000,0xa501); +reg_write( DDR_REG_BASE + 0x5026c*4+0x02000000,0x6a04); +reg_write( DDR_REG_BASE + 0x5026d*4+0x02000000,0x78f6); +reg_write( DDR_REG_BASE + 0x5026e*4+0x02000000,0xa500); +reg_write( DDR_REG_BASE + 0x5026f*4+0x02000000,0x4063); +reg_write( DDR_REG_BASE + 0x50270*4+0x02000000,0xf3a); +reg_write( DDR_REG_BASE + 0x50271*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x50272*4+0x02000000,0xa961); +reg_write( DDR_REG_BASE + 0x50273*4+0x02000000,0xe524); +reg_write( DDR_REG_BASE + 0x50274*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x50275*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE + 0x50276*4+0x02000000,0x70cd); +reg_write( DDR_REG_BASE + 0x50277*4+0x02000000,0xd929); +reg_write( DDR_REG_BASE + 0x50278*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x50279*4+0x02000000,0x7382); +reg_write( DDR_REG_BASE + 0x5027a*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5027b*4+0x02000000,0x6b4); +reg_write( DDR_REG_BASE + 0x5027c*4+0x02000000,0xe7a); +reg_write( DDR_REG_BASE + 0x5027d*4+0x02000000,0x1e0); +reg_write( DDR_REG_BASE + 0x5027e*4+0x02000000,0xdaa4); +reg_write( DDR_REG_BASE + 0x5027f*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x50280*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x50281*4+0x02000000,0x774c); +reg_write( DDR_REG_BASE + 0x50282*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x50283*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE + 0x50284*4+0x02000000,0x780); +reg_write( DDR_REG_BASE + 0x50285*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x50286*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x50287*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE + 0x50288*4+0x02000000,0x1e0); +reg_write( DDR_REG_BASE + 0x50289*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE + 0x5028a*4+0x02000000,0x90a0); +reg_write( DDR_REG_BASE + 0x5028b*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x5028c*4+0x02000000,0x238a); +reg_write( DDR_REG_BASE + 0x5028d*4+0x02000000,0xff7); +reg_write( DDR_REG_BASE + 0x5028e*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x5028f*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x50290*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x50291*4+0x02000000,0xad2); +reg_write( DDR_REG_BASE + 0x50292*4+0x02000000,0x2a0); +reg_write( DDR_REG_BASE + 0x50293*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE + 0x50294*4+0x02000000,0x2504); +reg_write( DDR_REG_BASE + 0x50295*4+0x02000000,0x1f8d); +reg_write( DDR_REG_BASE + 0x50296*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50297*4+0x02000000,0xffbf); +reg_write( DDR_REG_BASE + 0x50298*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE + 0x50299*4+0x02000000,0xfc7); +reg_write( DDR_REG_BASE + 0x5029a*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x5029b*4+0x02000000,0x7344); +reg_write( DDR_REG_BASE + 0x5029c*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE + 0x5029d*4+0x02000000,0xe1e0); +reg_write( DDR_REG_BASE + 0x5029e*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x5029f*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x502a0*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x502a1*4+0x02000000,0xe048); +reg_write( DDR_REG_BASE + 0x502a2*4+0x02000000,0x91e); +reg_write( DDR_REG_BASE + 0x502a3*4+0x02000000,0x120); +reg_write( DDR_REG_BASE + 0x502a4*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x502a5*4+0x02000000,0xae6); +reg_write( DDR_REG_BASE + 0x502a6*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x502a7*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x502a8*4+0x02000000,0x7382); +reg_write( DDR_REG_BASE + 0x502a9*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x502aa*4+0x02000000,0x6b4); +reg_write( DDR_REG_BASE + 0x502ab*4+0x02000000,0xec6); +reg_write( DDR_REG_BASE + 0x502ac*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x502ad*4+0x02000000,0x4063); +reg_write( DDR_REG_BASE + 0x502ae*4+0x02000000,0x906); +reg_write( DDR_REG_BASE + 0x502af*4+0x02000000,0x120); +reg_write( DDR_REG_BASE + 0x502b0*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x502b1*4+0x02000000,0x289); +reg_write( DDR_REG_BASE + 0x502b2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x502b3*4+0x02000000,0x22b); +reg_write( DDR_REG_BASE + 0x502b4*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x502b5*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x502b6*4+0x02000000,0xd840); +reg_write( DDR_REG_BASE + 0x502b7*4+0x02000000,0x1453); +reg_write( DDR_REG_BASE + 0x502b8*4+0x02000000,0x3083); +reg_write( DDR_REG_BASE + 0x502b9*4+0x02000000,0x7824); +reg_write( DDR_REG_BASE + 0x502ba*4+0x02000000,0x2553); +reg_write( DDR_REG_BASE + 0x502bb*4+0x02000000,0x110c); +reg_write( DDR_REG_BASE + 0x502bc*4+0x02000000,0x4338); +reg_write( DDR_REG_BASE + 0x502bd*4+0x02000000,0x7c05); +reg_write( DDR_REG_BASE + 0x502be*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x502bf*4+0x02000000,0xf012); +reg_write( DDR_REG_BASE + 0x502c0*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x502c1*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE + 0x502c2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x502c3*4+0x02000000,0x18c); +reg_write( DDR_REG_BASE + 0x502c4*4+0x02000000,0x6049); +reg_write( DDR_REG_BASE + 0x502c5*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE + 0x502c6*4+0x02000000,0x7144); +reg_write( DDR_REG_BASE + 0x502c7*4+0x02000000,0x211a); +reg_write( DDR_REG_BASE + 0x502c8*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x502c9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x502ca*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x502cb*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x502cc*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x502cd*4+0x02000000,0xb89c); +reg_write( DDR_REG_BASE + 0x502ce*4+0x02000000,0xb89f); +reg_write( DDR_REG_BASE + 0x502cf*4+0x02000000,0xb080); +reg_write( DDR_REG_BASE + 0x502d0*4+0x02000000,0xae1); +reg_write( DDR_REG_BASE + 0x502d1*4+0x02000000,0x80c4); +reg_write( DDR_REG_BASE + 0x502d2*4+0x02000000,0x8d2); +reg_write( DDR_REG_BASE + 0x502d3*4+0x02000000,0x80); +reg_write( DDR_REG_BASE + 0x502d4*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x502d5*4+0x02000000,0x7bcf); +reg_write( DDR_REG_BASE + 0x502d6*4+0x02000000,0xc18d); +reg_write( DDR_REG_BASE + 0x502d7*4+0x02000000,0xb9a); +reg_write( DDR_REG_BASE + 0x502d8*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x502d9*4+0x02000000,0xc293); +reg_write( DDR_REG_BASE + 0x502da*4+0x02000000,0xeeb); +reg_write( DDR_REG_BASE + 0x502db*4+0x02000000,0x1010); +reg_write( DDR_REG_BASE + 0x502dc*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE + 0x502dd*4+0x02000000,0xe838); +reg_write( DDR_REG_BASE + 0x502de*4+0x02000000,0xc40d); +reg_write( DDR_REG_BASE + 0x502df*4+0x02000000,0x2456); +reg_write( DDR_REG_BASE + 0x502e0*4+0x02000000,0x3d82); +reg_write( DDR_REG_BASE + 0x502e1*4+0x02000000,0x22f4); +reg_write( DDR_REG_BASE + 0x502e2*4+0x02000000,0x343); +reg_write( DDR_REG_BASE + 0x502e3*4+0x02000000,0x4081); +reg_write( DDR_REG_BASE + 0x502e4*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x502e5*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x502e6*4+0x02000000,0x245e); +reg_write( DDR_REG_BASE + 0x502e7*4+0x02000000,0x1401); +reg_write( DDR_REG_BASE + 0x502e8*4+0x02000000,0x7263); +reg_write( DDR_REG_BASE + 0x502e9*4+0x02000000,0x2144); +reg_write( DDR_REG_BASE + 0x502ea*4+0x02000000,0x401); +reg_write( DDR_REG_BASE + 0x502eb*4+0x02000000,0x2084); +reg_write( DDR_REG_BASE + 0x502ec*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x502ed*4+0x02000000,0x7965); +reg_write( DDR_REG_BASE + 0x502ee*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x502ef*4+0x02000000,0xb200); +reg_write( DDR_REG_BASE + 0x502f0*4+0x02000000,0x789d); +reg_write( DDR_REG_BASE + 0x502f1*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x502f2*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x502f3*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x502f4*4+0x02000000,0x238a); +reg_write( DDR_REG_BASE + 0x502f5*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x502f6*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE + 0x502f7*4+0x02000000,0x401); +reg_write( DDR_REG_BASE + 0x502f8*4+0x02000000,0x1240); +reg_write( DDR_REG_BASE + 0x502f9*4+0x02000000,0x100); +reg_write( DDR_REG_BASE + 0x502fa*4+0x02000000,0x7b84); +reg_write( DDR_REG_BASE + 0x502fb*4+0x02000000,0x7965); +reg_write( DDR_REG_BASE + 0x502fc*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x502fd*4+0x02000000,0x1a40); +reg_write( DDR_REG_BASE + 0x502fe*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x502ff*4+0x02000000,0x4081); +reg_write( DDR_REG_BASE + 0x50300*4+0x02000000,0xd908); +reg_write( DDR_REG_BASE + 0x50301*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE + 0x50302*4+0x02000000,0x9ff); +reg_write( DDR_REG_BASE + 0x50303*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE + 0x50304*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x50305*4+0x02000000,0xd90c); +reg_write( DDR_REG_BASE + 0x50306*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE + 0x50307*4+0x02000000,0x901); +reg_write( DDR_REG_BASE + 0x50308*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x50309*4+0x02000000,0x7c9d); +reg_write( DDR_REG_BASE + 0x5030a*4+0x02000000,0x2084); +reg_write( DDR_REG_BASE + 0x5030b*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x5030c*4+0x02000000,0x2444); +reg_write( DDR_REG_BASE + 0x5030d*4+0x02000000,0x1401); +reg_write( DDR_REG_BASE + 0x5030e*4+0x02000000,0x7905); +reg_write( DDR_REG_BASE + 0x5030f*4+0x02000000,0x1280); +reg_write( DDR_REG_BASE + 0x50310*4+0x02000000,0x100); +reg_write( DDR_REG_BASE + 0x50311*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x50312*4+0x02000000,0x1a80); +reg_write( DDR_REG_BASE + 0x50313*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x50314*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE + 0x50315*4+0x02000000,0x7014); +reg_write( DDR_REG_BASE + 0x50316*4+0x02000000,0xf2b0); +reg_write( DDR_REG_BASE + 0x50317*4+0x02000000,0xc113); +reg_write( DDR_REG_BASE + 0x50318*4+0x02000000,0x228a); +reg_write( DDR_REG_BASE + 0x50319*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x5031a*4+0x02000000,0xdc0c); +reg_write( DDR_REG_BASE + 0x5031b*4+0x02000000,0x783d); +reg_write( DDR_REG_BASE + 0x5031c*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x5031d*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x5031e*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x5031f*4+0x02000000,0x7a24); +reg_write( DDR_REG_BASE + 0x50320*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE + 0x50321*4+0x02000000,0x400); +reg_write( DDR_REG_BASE + 0x50322*4+0x02000000,0x7845); +reg_write( DDR_REG_BASE + 0x50323*4+0x02000000,0x2456); +reg_write( DDR_REG_BASE + 0x50324*4+0x02000000,0x3d82); +reg_write( DDR_REG_BASE + 0x50325*4+0x02000000,0x7263); +reg_write( DDR_REG_BASE + 0x50326*4+0x02000000,0x2255); +reg_write( DDR_REG_BASE + 0x50327*4+0x02000000,0xc02); +reg_write( DDR_REG_BASE + 0x50328*4+0x02000000,0x1240); +reg_write( DDR_REG_BASE + 0x50329*4+0x02000000,0x103); +reg_write( DDR_REG_BASE + 0x5032a*4+0x02000000,0x7865); +reg_write( DDR_REG_BASE + 0x5032b*4+0x02000000,0x1a40); +reg_write( DDR_REG_BASE + 0x5032c*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x5032d*4+0x02000000,0x4020); +reg_write( DDR_REG_BASE + 0x5032e*4+0x02000000,0xdb08); +reg_write( DDR_REG_BASE + 0x5032f*4+0x02000000,0xbb61); +reg_write( DDR_REG_BASE + 0x50330*4+0x02000000,0xbff); +reg_write( DDR_REG_BASE + 0x50331*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE + 0x50332*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x50333*4+0x02000000,0x4320); +reg_write( DDR_REG_BASE + 0x50334*4+0x02000000,0xbc61); +reg_write( DDR_REG_BASE + 0x50335*4+0x02000000,0xc01); +reg_write( DDR_REG_BASE + 0x50336*4+0x02000000,0x1031); +reg_write( DDR_REG_BASE + 0x50337*4+0x02000000,0x7b7d); +reg_write( DDR_REG_BASE + 0x50338*4+0x02000000,0x2084); +reg_write( DDR_REG_BASE + 0x50339*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x5033a*4+0x02000000,0x2344); +reg_write( DDR_REG_BASE + 0x5033b*4+0x02000000,0x403); +reg_write( DDR_REG_BASE + 0x5033c*4+0x02000000,0x7b05); +reg_write( DDR_REG_BASE + 0x5033d*4+0x02000000,0x1280); +reg_write( DDR_REG_BASE + 0x5033e*4+0x02000000,0x100); +reg_write( DDR_REG_BASE + 0x5033f*4+0x02000000,0x7865); +reg_write( DDR_REG_BASE + 0x50340*4+0x02000000,0x1a80); +reg_write( DDR_REG_BASE + 0x50341*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x50342*4+0x02000000,0x215e); +reg_write( DDR_REG_BASE + 0x50343*4+0x02000000,0x400); +reg_write( DDR_REG_BASE + 0x50344*4+0x02000000,0x219a); +reg_write( DDR_REG_BASE + 0x50345*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x50346*4+0x02000000,0x9260); +reg_write( DDR_REG_BASE + 0x50347*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE + 0x50348*4+0x02000000,0x400); +reg_write( DDR_REG_BASE + 0x50349*4+0x02000000,0x2184); +reg_write( DDR_REG_BASE + 0x5034a*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x5034b*4+0x02000000,0x7865); +reg_write( DDR_REG_BASE + 0x5034c*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x5034d*4+0x02000000,0xb200); +reg_write( DDR_REG_BASE + 0x5034e*4+0x02000000,0xf078); +reg_write( DDR_REG_BASE + 0x5034f*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE + 0x50350*4+0x02000000,0xe83a); +reg_write( DDR_REG_BASE + 0x50351*4+0x02000000,0xc40d); +reg_write( DDR_REG_BASE + 0x50352*4+0x02000000,0x2456); +reg_write( DDR_REG_BASE + 0x50353*4+0x02000000,0x3d83); +reg_write( DDR_REG_BASE + 0x50354*4+0x02000000,0x23f4); +reg_write( DDR_REG_BASE + 0x50355*4+0x02000000,0x342); +reg_write( DDR_REG_BASE + 0x50356*4+0x02000000,0x789b); +reg_write( DDR_REG_BASE + 0x50357*4+0x02000000,0x2453); +reg_write( DDR_REG_BASE + 0x50358*4+0x02000000,0x10c1); +reg_write( DDR_REG_BASE + 0x50359*4+0x02000000,0x2084); +reg_write( DDR_REG_BASE + 0x5035a*4+0x02000000,0x807); +reg_write( DDR_REG_BASE + 0x5035b*4+0x02000000,0x7945); +reg_write( DDR_REG_BASE + 0x5035c*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x5035d*4+0x02000000,0x7363); +reg_write( DDR_REG_BASE + 0x5035e*4+0x02000000,0xb300); +reg_write( DDR_REG_BASE + 0x5035f*4+0x02000000,0x789d); +reg_write( DDR_REG_BASE + 0x50360*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x50361*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x50362*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x50363*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x50364*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x50365*4+0x02000000,0x4181); +reg_write( DDR_REG_BASE + 0x50366*4+0x02000000,0xda08); +reg_write( DDR_REG_BASE + 0x50367*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x50368*4+0x02000000,0xba61); +reg_write( DDR_REG_BASE + 0x50369*4+0x02000000,0xa01); +reg_write( DDR_REG_BASE + 0x5036a*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x5036b*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE + 0x5036c*4+0x02000000,0x2084); +reg_write( DDR_REG_BASE + 0x5036d*4+0x02000000,0x807); +reg_write( DDR_REG_BASE + 0x5036e*4+0x02000000,0xb9c3); +reg_write( DDR_REG_BASE + 0x5036f*4+0x02000000,0x7905); +reg_write( DDR_REG_BASE + 0x50370*4+0x02000000,0x1340); +reg_write( DDR_REG_BASE + 0x50371*4+0x02000000,0x100); +reg_write( DDR_REG_BASE + 0x50372*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x50373*4+0x02000000,0x1b40); +reg_write( DDR_REG_BASE + 0x50374*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x50375*4+0x02000000,0x4081); +reg_write( DDR_REG_BASE + 0x50376*4+0x02000000,0xd910); +reg_write( DDR_REG_BASE + 0x50377*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE + 0x50378*4+0x02000000,0x9ff); +reg_write( DDR_REG_BASE + 0x50379*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE + 0x5037a*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x5037b*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x5037c*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE + 0x5037d*4+0x02000000,0x901); +reg_write( DDR_REG_BASE + 0x5037e*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x5037f*4+0x02000000,0x7c9d); +reg_write( DDR_REG_BASE + 0x50380*4+0x02000000,0x2084); +reg_write( DDR_REG_BASE + 0x50381*4+0x02000000,0xc03); +reg_write( DDR_REG_BASE + 0x50382*4+0x02000000,0x2444); +reg_write( DDR_REG_BASE + 0x50383*4+0x02000000,0x1781); +reg_write( DDR_REG_BASE + 0x50384*4+0x02000000,0x7905); +reg_write( DDR_REG_BASE + 0x50385*4+0x02000000,0x1380); +reg_write( DDR_REG_BASE + 0x50386*4+0x02000000,0x100); +reg_write( DDR_REG_BASE + 0x50387*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x50388*4+0x02000000,0x1b80); +reg_write( DDR_REG_BASE + 0x50389*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x5038a*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE + 0x5038b*4+0x02000000,0xe83c); +reg_write( DDR_REG_BASE + 0x5038c*4+0x02000000,0xc213); +reg_write( DDR_REG_BASE + 0x5038d*4+0x02000000,0xdb08); +reg_write( DDR_REG_BASE + 0x5038e*4+0x02000000,0xdc0f); +reg_write( DDR_REG_BASE + 0x5038f*4+0x02000000,0x785d); +reg_write( DDR_REG_BASE + 0x50390*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x50391*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x50392*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x50393*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x50394*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x50395*4+0x02000000,0x4140); +reg_write( DDR_REG_BASE + 0x50396*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x50397*4+0x02000000,0xbb61); +reg_write( DDR_REG_BASE + 0x50398*4+0x02000000,0xbff); +reg_write( DDR_REG_BASE + 0x50399*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE + 0x5039a*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE + 0x5039b*4+0x02000000,0x2084); +reg_write( DDR_REG_BASE + 0x5039c*4+0x02000000,0x807); +reg_write( DDR_REG_BASE + 0x5039d*4+0x02000000,0xb9c3); +reg_write( DDR_REG_BASE + 0x5039e*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x5039f*4+0x02000000,0x2456); +reg_write( DDR_REG_BASE + 0x503a0*4+0x02000000,0x3d81); +reg_write( DDR_REG_BASE + 0x503a1*4+0x02000000,0x7163); +reg_write( DDR_REG_BASE + 0x503a2*4+0x02000000,0x2155); +reg_write( DDR_REG_BASE + 0x503a3*4+0x02000000,0xc01); +reg_write( DDR_REG_BASE + 0x503a4*4+0x02000000,0x1140); +reg_write( DDR_REG_BASE + 0x503a5*4+0x02000000,0x103); +reg_write( DDR_REG_BASE + 0x503a6*4+0x02000000,0x7865); +reg_write( DDR_REG_BASE + 0x503a7*4+0x02000000,0x1940); +reg_write( DDR_REG_BASE + 0x503a8*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x503a9*4+0x02000000,0x4040); +reg_write( DDR_REG_BASE + 0x503aa*4+0x02000000,0xdb10); +reg_write( DDR_REG_BASE + 0x503ab*4+0x02000000,0xbb61); +reg_write( DDR_REG_BASE + 0x503ac*4+0x02000000,0xbff); +reg_write( DDR_REG_BASE + 0x503ad*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE + 0x503ae*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x503af*4+0x02000000,0x4340); +reg_write( DDR_REG_BASE + 0x503b0*4+0x02000000,0xbc61); +reg_write( DDR_REG_BASE + 0x503b1*4+0x02000000,0xc01); +reg_write( DDR_REG_BASE + 0x503b2*4+0x02000000,0x1031); +reg_write( DDR_REG_BASE + 0x503b3*4+0x02000000,0x7b7d); +reg_write( DDR_REG_BASE + 0x503b4*4+0x02000000,0x2084); +reg_write( DDR_REG_BASE + 0x503b5*4+0x02000000,0xc03); +reg_write( DDR_REG_BASE + 0x503b6*4+0x02000000,0x2344); +reg_write( DDR_REG_BASE + 0x503b7*4+0x02000000,0x783); +reg_write( DDR_REG_BASE + 0x503b8*4+0x02000000,0x7b05); +reg_write( DDR_REG_BASE + 0x503b9*4+0x02000000,0x1180); +reg_write( DDR_REG_BASE + 0x503ba*4+0x02000000,0x100); +reg_write( DDR_REG_BASE + 0x503bb*4+0x02000000,0x7865); +reg_write( DDR_REG_BASE + 0x503bc*4+0x02000000,0x1980); +reg_write( DDR_REG_BASE + 0x503bd*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x503be*4+0x02000000,0x9100); +reg_write( DDR_REG_BASE + 0x503bf*4+0x02000000,0x7b5b); +reg_write( DDR_REG_BASE + 0x503c0*4+0x02000000,0xbac3); +reg_write( DDR_REG_BASE + 0x503c1*4+0x02000000,0x2384); +reg_write( DDR_REG_BASE + 0x503c2*4+0x02000000,0x807); +reg_write( DDR_REG_BASE + 0x503c3*4+0x02000000,0x7845); +reg_write( DDR_REG_BASE + 0x503c4*4+0x02000000,0x7865); +reg_write( DDR_REG_BASE + 0x503c5*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE + 0x503c6*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE + 0x503c7*4+0x02000000,0xe5c0); +reg_write( DDR_REG_BASE + 0x503c8*4+0x02000000,0x5dc); +reg_write( DDR_REG_BASE + 0x503c9*4+0x02000000,0xffe5); +reg_write( DDR_REG_BASE + 0x503ca*4+0x02000000,0x79bb); +reg_write( DDR_REG_BASE + 0x503cb*4+0x02000000,0xeea9); +reg_write( DDR_REG_BASE + 0x503cc*4+0x02000000,0xeca); +reg_write( DDR_REG_BASE + 0x503cd*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x503ce*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x503cf*4+0x02000000,0xfe2); +reg_write( DDR_REG_BASE + 0x503d0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x503d1*4+0x02000000,0xec2); +reg_write( DDR_REG_BASE + 0x503d2*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x503d3*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x503d4*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE + 0x503d5*4+0x02000000,0xd930); +reg_write( DDR_REG_BASE + 0x503d6*4+0x02000000,0xbc6); +reg_write( DDR_REG_BASE + 0x503d7*4+0x02000000,0x1e0); +reg_write( DDR_REG_BASE + 0x503d8*4+0x02000000,0xdac0); +reg_write( DDR_REG_BASE + 0x503d9*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x503da*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x503db*4+0x02000000,0x774c); +reg_write( DDR_REG_BASE + 0x503dc*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE + 0x503dd*4+0x02000000,0xfffe); +reg_write( DDR_REG_BASE + 0x503de*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE + 0x503df*4+0x02000000,0x90a0); +reg_write( DDR_REG_BASE + 0x503e0*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x503e1*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x503e2*4+0x02000000,0x82e); +reg_write( DDR_REG_BASE + 0x503e3*4+0x02000000,0x2a0); +reg_write( DDR_REG_BASE + 0x503e4*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE + 0x503e5*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x503e6*4+0x02000000,0x2504); +reg_write( DDR_REG_BASE + 0x503e7*4+0x02000000,0x1f8d); +reg_write( DDR_REG_BASE + 0x503e8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x503e9*4+0x02000000,0xffbf); +reg_write( DDR_REG_BASE + 0x503ea*4+0x02000000,0xb0a0); +reg_write( DDR_REG_BASE + 0x503eb*4+0x02000000,0xe8e); +reg_write( DDR_REG_BASE + 0x503ec*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x503ed*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x503ee*4+0x02000000,0x852); +reg_write( DDR_REG_BASE + 0x503ef*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x503f0*4+0x02000000,0xe82); +reg_write( DDR_REG_BASE + 0x503f1*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x503f2*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x503f3*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE + 0x503f4*4+0x02000000,0x72d5); +reg_write( DDR_REG_BASE + 0x503f5*4+0x02000000,0x57e); +reg_write( DDR_REG_BASE + 0x503f6*4+0x02000000,0xffc5); +reg_write( DDR_REG_BASE + 0x503f7*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x503f8*4+0x02000000,0x70cd); +reg_write( DDR_REG_BASE + 0x503f9*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x503fa*4+0x02000000,0x7043); +reg_write( DDR_REG_BASE + 0x503fb*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x503fc*4+0x02000000,0x6b4); +reg_write( DDR_REG_BASE + 0x503fd*4+0x02000000,0xe7e); +reg_write( DDR_REG_BASE + 0x503fe*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x503ff*4+0x02000000,0xb0c0); +reg_write( DDR_REG_BASE + 0x50400*4+0x02000000,0xe62); +reg_write( DDR_REG_BASE + 0x50401*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x50402*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x50403*4+0x02000000,0xf7a); +reg_write( DDR_REG_BASE + 0x50404*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50405*4+0x02000000,0xe5a); +reg_write( DDR_REG_BASE + 0x50406*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x50407*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x50408*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE + 0x50409*4+0x02000000,0xd92a); +reg_write( DDR_REG_BASE + 0x5040a*4+0x02000000,0xb5e); +reg_write( DDR_REG_BASE + 0x5040b*4+0x02000000,0x1e0); +reg_write( DDR_REG_BASE + 0x5040c*4+0x02000000,0xdaa8); +reg_write( DDR_REG_BASE + 0x5040d*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x5040e*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x5040f*4+0x02000000,0x774c); +reg_write( DDR_REG_BASE + 0x50410*4+0x02000000,0x238a); +reg_write( DDR_REG_BASE + 0x50411*4+0x02000000,0xfef); +reg_write( DDR_REG_BASE + 0x50412*4+0x02000000,0x90a0); +reg_write( DDR_REG_BASE + 0x50413*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x50414*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x50415*4+0x02000000,0xfca); +reg_write( DDR_REG_BASE + 0x50416*4+0x02000000,0x260); +reg_write( DDR_REG_BASE + 0x50417*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE + 0x50418*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x50419*4+0x02000000,0x2504); +reg_write( DDR_REG_BASE + 0x5041a*4+0x02000000,0x1f8d); +reg_write( DDR_REG_BASE + 0x5041b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5041c*4+0x02000000,0xffbf); +reg_write( DDR_REG_BASE + 0x5041d*4+0x02000000,0xb0a0); +reg_write( DDR_REG_BASE + 0x5041e*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x5041f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50420*4+0x02000000,0xbb8); +reg_write( DDR_REG_BASE + 0x50421*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x50422*4+0x02000000,0x7384); +reg_write( DDR_REG_BASE + 0x50423*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x50424*4+0x02000000,0xe048); +reg_write( DDR_REG_BASE + 0x50425*4+0x02000000,0xe72); +reg_write( DDR_REG_BASE + 0x50426*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x50427*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x50428*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x50429*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x5042a*4+0x02000000,0x94); +reg_write( DDR_REG_BASE + 0x5042b*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5042c*4+0x02000000,0x80a); +reg_write( DDR_REG_BASE + 0x5042d*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x5042e*4+0x02000000,0x42e1); +reg_write( DDR_REG_BASE + 0x5042f*4+0x02000000,0xf0a5); +reg_write( DDR_REG_BASE + 0x50430*4+0x02000000,0x2332); +reg_write( DDR_REG_BASE + 0x50431*4+0x02000000,0x3380); +reg_write( DDR_REG_BASE + 0x50432*4+0x02000000,0x208c); +reg_write( DDR_REG_BASE + 0x50433*4+0x02000000,0x8fc3); +reg_write( DDR_REG_BASE + 0x50434*4+0x02000000,0xf29e); +reg_write( DDR_REG_BASE + 0x50435*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE + 0x50436*4+0x02000000,0x899); +reg_write( DDR_REG_BASE + 0x50437*4+0x02000000,0x30); +reg_write( DDR_REG_BASE + 0x50438*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x50439*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x5043a*4+0x02000000,0x95); +reg_write( DDR_REG_BASE + 0x5043b*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5043c*4+0x02000000,0xfea); +reg_write( DDR_REG_BASE + 0x5043d*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x5043e*4+0x02000000,0x42c1); +reg_write( DDR_REG_BASE + 0x5043f*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x50440*4+0x02000000,0xf038); +reg_write( DDR_REG_BASE + 0x50441*4+0x02000000,0x706c); +reg_write( DDR_REG_BASE + 0x50442*4+0x02000000,0x708d); +reg_write( DDR_REG_BASE + 0x50443*4+0x02000000,0xf019); +reg_write( DDR_REG_BASE + 0x50444*4+0x02000000,0x2456); +reg_write( DDR_REG_BASE + 0x50445*4+0x02000000,0x3d81); +reg_write( DDR_REG_BASE + 0x50446*4+0x02000000,0x21f4); +reg_write( DDR_REG_BASE + 0x50447*4+0x02000000,0x81); +reg_write( DDR_REG_BASE + 0x50448*4+0x02000000,0x2644); +reg_write( DDR_REG_BASE + 0x50449*4+0x02000000,0x17c3); +reg_write( DDR_REG_BASE + 0x5044a*4+0x02000000,0x7144); +reg_write( DDR_REG_BASE + 0x5044b*4+0x02000000,0xeb06); +reg_write( DDR_REG_BASE + 0x5044c*4+0x02000000,0xbb61); +reg_write( DDR_REG_BASE + 0x5044d*4+0x02000000,0xb01); +reg_write( DDR_REG_BASE + 0x5044e*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x5044f*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE + 0x50450*4+0x02000000,0xb9c0); +reg_write( DDR_REG_BASE + 0x50451*4+0x02000000,0x4320); +reg_write( DDR_REG_BASE + 0x50452*4+0x02000000,0x2444); +reg_write( DDR_REG_BASE + 0x50453*4+0x02000000,0x17c1); +reg_write( DDR_REG_BASE + 0x50454*4+0x02000000,0xe905); +reg_write( DDR_REG_BASE + 0x50455*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE + 0x50456*4+0x02000000,0x9ff); +reg_write( DDR_REG_BASE + 0x50457*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE + 0x50458*4+0x02000000,0x7b7b); +reg_write( DDR_REG_BASE + 0x50459*4+0x02000000,0x7185); +reg_write( DDR_REG_BASE + 0x5045a*4+0x02000000,0x7b05); +reg_write( DDR_REG_BASE + 0x5045b*4+0x02000000,0xcd5); +reg_write( DDR_REG_BASE + 0x5045c*4+0x02000000,0x9234); +reg_write( DDR_REG_BASE + 0x5045d*4+0x02000000,0x786f); +reg_write( DDR_REG_BASE + 0x5045e*4+0x02000000,0x2332); +reg_write( DDR_REG_BASE + 0x5045f*4+0x02000000,0x3382); +reg_write( DDR_REG_BASE + 0x50460*4+0x02000000,0x2456); +reg_write( DDR_REG_BASE + 0x50461*4+0x02000000,0x3c01); +reg_write( DDR_REG_BASE + 0x50462*4+0x02000000,0x6149); +reg_write( DDR_REG_BASE + 0x50463*4+0x02000000,0x215f); +reg_write( DDR_REG_BASE + 0x50464*4+0x02000000,0x602); +reg_write( DDR_REG_BASE + 0x50465*4+0x02000000,0xc198); +reg_write( DDR_REG_BASE + 0x50466*4+0x02000000,0x6159); +reg_write( DDR_REG_BASE + 0x50467*4+0x02000000,0x7abd); +reg_write( DDR_REG_BASE + 0x50468*4+0x02000000,0x7a5d); +reg_write( DDR_REG_BASE + 0x50469*4+0x02000000,0x7a5d); +reg_write( DDR_REG_BASE + 0x5046a*4+0x02000000,0x623a); +reg_write( DDR_REG_BASE + 0x5046b*4+0x02000000,0x8a20); +reg_write( DDR_REG_BASE + 0x5046c*4+0x02000000,0x7965); +reg_write( DDR_REG_BASE + 0x5046d*4+0x02000000,0xed2); +reg_write( DDR_REG_BASE + 0x5046e*4+0x02000000,0x1a0); +reg_write( DDR_REG_BASE + 0x5046f*4+0x02000000,0xaa20); +reg_write( DDR_REG_BASE + 0x50470*4+0x02000000,0x4200); +reg_write( DDR_REG_BASE + 0x50471*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x50472*4+0x02000000,0x96); +reg_write( DDR_REG_BASE + 0x50473*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x50474*4+0x02000000,0xf7a); +reg_write( DDR_REG_BASE + 0x50475*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x50476*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x50477*4+0x02000000,0xe508); +reg_write( DDR_REG_BASE + 0x50478*4+0x02000000,0xe5e0); +reg_write( DDR_REG_BASE + 0x50479*4+0x02000000,0x792); +reg_write( DDR_REG_BASE + 0x5047a*4+0x02000000,0xffe5); +reg_write( DDR_REG_BASE + 0x5047b*4+0x02000000,0x42a1); +reg_write( DDR_REG_BASE + 0x5047c*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x5047d*4+0x02000000,0x97); +reg_write( DDR_REG_BASE + 0x5047e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5047f*4+0x02000000,0xf66); +reg_write( DDR_REG_BASE + 0x50480*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x50481*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x50482*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE + 0x50483*4+0x02000000,0x8a1); +reg_write( DDR_REG_BASE + 0x50484*4+0x02000000,0x30); +reg_write( DDR_REG_BASE + 0x50485*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x50486*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x50487*4+0x02000000,0x98); +reg_write( DDR_REG_BASE + 0x50488*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x50489*4+0x02000000,0xf52); +reg_write( DDR_REG_BASE + 0x5048a*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x5048b*4+0x02000000,0x42c1); +reg_write( DDR_REG_BASE + 0x5048c*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x5048d*4+0x02000000,0xf03c); +reg_write( DDR_REG_BASE + 0x5048e*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x5048f*4+0x02000000,0x708d); +reg_write( DDR_REG_BASE + 0x50490*4+0x02000000,0xf019); +reg_write( DDR_REG_BASE + 0x50491*4+0x02000000,0x2456); +reg_write( DDR_REG_BASE + 0x50492*4+0x02000000,0x3d81); +reg_write( DDR_REG_BASE + 0x50493*4+0x02000000,0x7974); +reg_write( DDR_REG_BASE + 0x50494*4+0x02000000,0x11c0); +reg_write( DDR_REG_BASE + 0x50495*4+0x02000000,0x101); +reg_write( DDR_REG_BASE + 0x50496*4+0x02000000,0x2644); +reg_write( DDR_REG_BASE + 0x50497*4+0x02000000,0x17c2); +reg_write( DDR_REG_BASE + 0x50498*4+0x02000000,0x7164); +reg_write( DDR_REG_BASE + 0x50499*4+0x02000000,0xea06); +reg_write( DDR_REG_BASE + 0x5049a*4+0x02000000,0xba61); +reg_write( DDR_REG_BASE + 0x5049b*4+0x02000000,0xa01); +reg_write( DDR_REG_BASE + 0x5049c*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x5049d*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE + 0x5049e*4+0x02000000,0xb9c0); +reg_write( DDR_REG_BASE + 0x5049f*4+0x02000000,0x4220); +reg_write( DDR_REG_BASE + 0x504a0*4+0x02000000,0x2444); +reg_write( DDR_REG_BASE + 0x504a1*4+0x02000000,0x17c1); +reg_write( DDR_REG_BASE + 0x504a2*4+0x02000000,0xe905); +reg_write( DDR_REG_BASE + 0x504a3*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE + 0x504a4*4+0x02000000,0x9ff); +reg_write( DDR_REG_BASE + 0x504a5*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE + 0x504a6*4+0x02000000,0x7a5b); +reg_write( DDR_REG_BASE + 0x504a7*4+0x02000000,0x7185); +reg_write( DDR_REG_BASE + 0x504a8*4+0x02000000,0x7a05); +reg_write( DDR_REG_BASE + 0x504a9*4+0x02000000,0xcd3); +reg_write( DDR_REG_BASE + 0x504aa*4+0x02000000,0x9234); +reg_write( DDR_REG_BASE + 0x504ab*4+0x02000000,0x784f); +reg_write( DDR_REG_BASE + 0x504ac*4+0x02000000,0x2456); +reg_write( DDR_REG_BASE + 0x504ad*4+0x02000000,0x3cc1); +reg_write( DDR_REG_BASE + 0x504ae*4+0x02000000,0x61d9); +reg_write( DDR_REG_BASE + 0x504af*4+0x02000000,0x896c); +reg_write( DDR_REG_BASE + 0x504b0*4+0x02000000,0x2456); +reg_write( DDR_REG_BASE + 0x504b1*4+0x02000000,0x3c01); +reg_write( DDR_REG_BASE + 0x504b2*4+0x02000000,0x6169); +reg_write( DDR_REG_BASE + 0x504b3*4+0x02000000,0x215f); +reg_write( DDR_REG_BASE + 0x504b4*4+0x02000000,0x603); +reg_write( DDR_REG_BASE + 0x504b5*4+0x02000000,0xc198); +reg_write( DDR_REG_BASE + 0x504b6*4+0x02000000,0x6179); +reg_write( DDR_REG_BASE + 0x504b7*4+0x02000000,0x7bbd); +reg_write( DDR_REG_BASE + 0x504b8*4+0x02000000,0x7b7d); +reg_write( DDR_REG_BASE + 0x504b9*4+0x02000000,0x7b7d); +reg_write( DDR_REG_BASE + 0x504ba*4+0x02000000,0x633b); +reg_write( DDR_REG_BASE + 0x504bb*4+0x02000000,0x8b20); +reg_write( DDR_REG_BASE + 0x504bc*4+0x02000000,0x7945); +reg_write( DDR_REG_BASE + 0x504bd*4+0x02000000,0xe32); +reg_write( DDR_REG_BASE + 0x504be*4+0x02000000,0x1a0); +reg_write( DDR_REG_BASE + 0x504bf*4+0x02000000,0xab20); +reg_write( DDR_REG_BASE + 0x504c0*4+0x02000000,0x4200); +reg_write( DDR_REG_BASE + 0x504c1*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x504c2*4+0x02000000,0x99); +reg_write( DDR_REG_BASE + 0x504c3*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x504c4*4+0x02000000,0xeda); +reg_write( DDR_REG_BASE + 0x504c5*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x504c6*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x504c7*4+0x02000000,0xe508); +reg_write( DDR_REG_BASE + 0x504c8*4+0x02000000,0xe5e0); +reg_write( DDR_REG_BASE + 0x504c9*4+0x02000000,0x78c); +reg_write( DDR_REG_BASE + 0x504ca*4+0x02000000,0xffe5); +reg_write( DDR_REG_BASE + 0x504cb*4+0x02000000,0x43a1); +reg_write( DDR_REG_BASE + 0x504cc*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x504cd*4+0x02000000,0x9a); +reg_write( DDR_REG_BASE + 0x504ce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x504cf*4+0x02000000,0xec6); +reg_write( DDR_REG_BASE + 0x504d0*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x504d1*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x504d2*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE + 0x504d3*4+0x02000000,0xe689); +reg_write( DDR_REG_BASE + 0x504d4*4+0x02000000,0x6b8); +reg_write( DDR_REG_BASE + 0x504d5*4+0x02000000,0xffee); +reg_write( DDR_REG_BASE + 0x504d6*4+0x02000000,0x2456); +reg_write( DDR_REG_BASE + 0x504d7*4+0x02000000,0x3cdb); +reg_write( DDR_REG_BASE + 0x504d8*4+0x02000000,0x71e5); +reg_write( DDR_REG_BASE + 0x504d9*4+0x02000000,0x72f5); +reg_write( DDR_REG_BASE + 0x504da*4+0x02000000,0x2a2); +reg_write( DDR_REG_BASE + 0x504db*4+0x02000000,0xffe5); +reg_write( DDR_REG_BASE + 0x504dc*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x504dd*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x504de*4+0x02000000,0xcba); +reg_write( DDR_REG_BASE + 0x504df*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x504e0*4+0x02000000,0xb0a0); +reg_write( DDR_REG_BASE + 0x504e1*4+0x02000000,0xf0c1); +reg_write( DDR_REG_BASE + 0x504e2*4+0x02000000,0x1453); +reg_write( DDR_REG_BASE + 0x504e3*4+0x02000000,0x308e); +reg_write( DDR_REG_BASE + 0x504e4*4+0x02000000,0x706f); +reg_write( DDR_REG_BASE + 0x504e5*4+0x02000000,0xf062); +reg_write( DDR_REG_BASE + 0x504e6*4+0x02000000,0xc095); +reg_write( DDR_REG_BASE + 0x504e7*4+0x02000000,0x2032); +reg_write( DDR_REG_BASE + 0x504e8*4+0x02000000,0x6c0); +reg_write( DDR_REG_BASE + 0x504e9*4+0x02000000,0xdbb); +reg_write( DDR_REG_BASE + 0x504ea*4+0x02000000,0x1021); +reg_write( DDR_REG_BASE + 0x504eb*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x504ec*4+0x02000000,0xdbff); +reg_write( DDR_REG_BASE + 0x504ed*4+0x02000000,0x708d); +reg_write( DDR_REG_BASE + 0x504ee*4+0x02000000,0x4718); +reg_write( DDR_REG_BASE + 0x504ef*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x504f0*4+0x02000000,0xf031); +reg_write( DDR_REG_BASE + 0x504f1*4+0x02000000,0xf20f); +reg_write( DDR_REG_BASE + 0x504f2*4+0x02000000,0x2144); +reg_write( DDR_REG_BASE + 0x504f3*4+0x02000000,0x7ca); +reg_write( DDR_REG_BASE + 0x504f4*4+0x02000000,0x41e3); +reg_write( DDR_REG_BASE + 0x504f5*4+0x02000000,0xa11); +reg_write( DDR_REG_BASE + 0x504f6*4+0x02000000,0x1010); +reg_write( DDR_REG_BASE + 0x504f7*4+0x02000000,0x2242); +reg_write( DDR_REG_BASE + 0x504f8*4+0x02000000,0x104a); +reg_write( DDR_REG_BASE + 0x504f9*4+0x02000000,0xaff); +reg_write( DDR_REG_BASE + 0x504fa*4+0x02000000,0x9031); +reg_write( DDR_REG_BASE + 0x504fb*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE + 0x504fc*4+0x02000000,0x2144); +reg_write( DDR_REG_BASE + 0x504fd*4+0x02000000,0x4b); +reg_write( DDR_REG_BASE + 0x504fe*4+0x02000000,0xf00e); +reg_write( DDR_REG_BASE + 0x504ff*4+0x02000000,0x2454); +reg_write( DDR_REG_BASE + 0x50500*4+0x02000000,0x3c0b); +reg_write( DDR_REG_BASE + 0x50501*4+0x02000000,0x235a); +reg_write( DDR_REG_BASE + 0x50502*4+0x02000000,0x3601); +reg_write( DDR_REG_BASE + 0x50503*4+0x02000000,0x2300); +reg_write( DDR_REG_BASE + 0x50504*4+0x02000000,0x104b); +reg_write( DDR_REG_BASE + 0x50505*4+0x02000000,0x795d); +reg_write( DDR_REG_BASE + 0x50506*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE + 0x50507*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE + 0x50508*4+0x02000000,0x2332); +reg_write( DDR_REG_BASE + 0x50509*4+0x02000000,0x105f); +reg_write( DDR_REG_BASE + 0x5050a*4+0x02000000,0x2744); +reg_write( DDR_REG_BASE + 0x5050b*4+0x02000000,0x304b); +reg_write( DDR_REG_BASE + 0x5050c*4+0x02000000,0x7970); +reg_write( DDR_REG_BASE + 0x5050d*4+0x02000000,0x218c); +reg_write( DDR_REG_BASE + 0x5050e*4+0x02000000,0x8fc3); +reg_write( DDR_REG_BASE + 0x5050f*4+0x02000000,0xf408); +reg_write( DDR_REG_BASE + 0x50510*4+0x02000000,0xb21); +reg_write( DDR_REG_BASE + 0x50511*4+0x02000000,0x1031); +reg_write( DDR_REG_BASE + 0x50512*4+0x02000000,0xdbff); +reg_write( DDR_REG_BASE + 0x50513*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x50514*4+0x02000000,0x4340); +reg_write( DDR_REG_BASE + 0x50515*4+0x02000000,0xf00c); +reg_write( DDR_REG_BASE + 0x50516*4+0x02000000,0x7075); +reg_write( DDR_REG_BASE + 0x50517*4+0x02000000,0x20c0); +reg_write( DDR_REG_BASE + 0x50518*4+0x02000000,0x61); +reg_write( DDR_REG_BASE + 0x50519*4+0x02000000,0xf208); +reg_write( DDR_REG_BASE + 0x5051a*4+0x02000000,0x7910); +reg_write( DDR_REG_BASE + 0x5051b*4+0x02000000,0x2108); +reg_write( DDR_REG_BASE + 0x5051c*4+0x02000000,0x830c); +reg_write( DDR_REG_BASE + 0x5051d*4+0x02000000,0x27ca); +reg_write( DDR_REG_BASE + 0x5051e*4+0x02000000,0x10c9); +reg_write( DDR_REG_BASE + 0x5051f*4+0x02000000,0xdbff); +reg_write( DDR_REG_BASE + 0x50520*4+0x02000000,0x7144); +reg_write( DDR_REG_BASE + 0x50521*4+0x02000000,0xe2e0); +reg_write( DDR_REG_BASE + 0x50522*4+0x02000000,0x79e); +reg_write( DDR_REG_BASE + 0x50523*4+0x02000000,0xffe5); +reg_write( DDR_REG_BASE + 0x50524*4+0x02000000,0x2253); +reg_write( DDR_REG_BASE + 0x50525*4+0x02000000,0x8081); +reg_write( DDR_REG_BASE + 0x50526*4+0x02000000,0x262f); +reg_write( DDR_REG_BASE + 0x50527*4+0x02000000,0xf008); +reg_write( DDR_REG_BASE + 0x50528*4+0x02000000,0x2479); +reg_write( DDR_REG_BASE + 0x50529*4+0x02000000,0x1001); +reg_write( DDR_REG_BASE + 0x5052a*4+0x02000000,0x21c5); +reg_write( DDR_REG_BASE + 0x5052b*4+0x02000000,0x61); +reg_write( DDR_REG_BASE + 0x5052c*4+0x02000000,0x7034); +reg_write( DDR_REG_BASE + 0x5052d*4+0x02000000,0x709d); +reg_write( DDR_REG_BASE + 0x5052e*4+0x02000000,0x262f); +reg_write( DDR_REG_BASE + 0x5052f*4+0x02000000,0xf008); +reg_write( DDR_REG_BASE + 0x50530*4+0x02000000,0xf213); +reg_write( DDR_REG_BASE + 0x50531*4+0x02000000,0xb9e0); +reg_write( DDR_REG_BASE + 0x50532*4+0x02000000,0x2004); +reg_write( DDR_REG_BASE + 0x50533*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x50534*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50535*4+0x02000000,0xfffe); +reg_write( DDR_REG_BASE + 0x50536*4+0x02000000,0x73fd); +reg_write( DDR_REG_BASE + 0x50537*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x50538*4+0x02000000,0x6078); +reg_write( DDR_REG_BASE + 0x50539*4+0x02000000,0xc18d); +reg_write( DDR_REG_BASE + 0x5053a*4+0x02000000,0x208b); +reg_write( DDR_REG_BASE + 0x5053b*4+0x02000000,0x8803); +reg_write( DDR_REG_BASE + 0x5053c*4+0x02000000,0x7a0f); +reg_write( DDR_REG_BASE + 0x5053d*4+0x02000000,0x2114); +reg_write( DDR_REG_BASE + 0x5053e*4+0x02000000,0x6c1); +reg_write( DDR_REG_BASE + 0x5053f*4+0x02000000,0x26ca); +reg_write( DDR_REG_BASE + 0x50540*4+0x02000000,0x3061); +reg_write( DDR_REG_BASE + 0x50541*4+0x02000000,0xb140); +reg_write( DDR_REG_BASE + 0x50542*4+0x02000000,0xf003); +reg_write( DDR_REG_BASE + 0x50543*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x50544*4+0x02000000,0xc04a); +reg_write( DDR_REG_BASE + 0x50545*4+0x02000000,0x7167); +reg_write( DDR_REG_BASE + 0x50546*4+0x02000000,0xb41); +reg_write( DDR_REG_BASE + 0x50547*4+0x02000000,0xb3a4); +reg_write( DDR_REG_BASE + 0x50548*4+0x02000000,0x70ed); +reg_write( DDR_REG_BASE + 0x50549*4+0x02000000,0xe77); +reg_write( DDR_REG_BASE + 0x5054a*4+0x02000000,0x3030); +reg_write( DDR_REG_BASE + 0x5054b*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x5054c*4+0x02000000,0xea5); +reg_write( DDR_REG_BASE + 0x5054d*4+0x02000000,0x3071); +reg_write( DDR_REG_BASE + 0x5054e*4+0x02000000,0x2456); +reg_write( DDR_REG_BASE + 0x5054f*4+0x02000000,0x3cc0); +reg_write( DDR_REG_BASE + 0x50550*4+0x02000000,0x255a); +reg_write( DDR_REG_BASE + 0x50551*4+0x02000000,0x1301); +reg_write( DDR_REG_BASE + 0x50552*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE + 0x50553*4+0x02000000,0x9000); +reg_write( DDR_REG_BASE + 0x50554*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50555*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50556*4+0x02000000,0x890a); +reg_write( DDR_REG_BASE + 0x50557*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x50558*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE + 0x50559*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5055a*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x5055b*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE + 0x5055c*4+0x02000000,0x7845); +reg_write( DDR_REG_BASE + 0x5055d*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x5055e*4+0x02000000,0x7865); +reg_write( DDR_REG_BASE + 0x5055f*4+0x02000000,0xda40); +reg_write( DDR_REG_BASE + 0x50560*4+0x02000000,0xb040); +reg_write( DDR_REG_BASE + 0x50561*4+0x02000000,0x890b); +reg_write( DDR_REG_BASE + 0x50562*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x50563*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x50564*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50565*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x50566*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE + 0x50567*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x50568*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x50569*4+0x02000000,0x7865); +reg_write( DDR_REG_BASE + 0x5056a*4+0x02000000,0xb040); +reg_write( DDR_REG_BASE + 0x5056b*4+0x02000000,0xca01); +reg_write( DDR_REG_BASE + 0x5056c*4+0x02000000,0x865); +reg_write( DDR_REG_BASE + 0x5056d*4+0x02000000,0x311); +reg_write( DDR_REG_BASE + 0x5056e*4+0x02000000,0x251a); +reg_write( DDR_REG_BASE + 0x5056f*4+0x02000000,0x1f81); +reg_write( DDR_REG_BASE + 0x50570*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50571*4+0x02000000,0xb000); +reg_write( DDR_REG_BASE + 0x50572*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE + 0x50573*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x50574*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x50575*4+0x02000000,0x7865); +reg_write( DDR_REG_BASE + 0x50576*4+0x02000000,0xb040); +reg_write( DDR_REG_BASE + 0x50577*4+0x02000000,0xf028); +reg_write( DDR_REG_BASE + 0x50578*4+0x02000000,0x6028); +reg_write( DDR_REG_BASE + 0x50579*4+0x02000000,0xd15); +reg_write( DDR_REG_BASE + 0x5057a*4+0x02000000,0x1021); +reg_write( DDR_REG_BASE + 0x5057b*4+0x02000000,0xc08d); +reg_write( DDR_REG_BASE + 0x5057c*4+0x02000000,0x20f4); +reg_write( DDR_REG_BASE + 0x5057d*4+0x02000000,0x42); +reg_write( DDR_REG_BASE + 0x5057e*4+0x02000000,0x7834); +reg_write( DDR_REG_BASE + 0x5057f*4+0x02000000,0x2242); +reg_write( DDR_REG_BASE + 0x50580*4+0x02000000,0x802); +reg_write( DDR_REG_BASE + 0x50581*4+0x02000000,0xb040); +reg_write( DDR_REG_BASE + 0x50582*4+0x02000000,0x7124); +reg_write( DDR_REG_BASE + 0x50583*4+0x02000000,0x9ed); +reg_write( DDR_REG_BASE + 0x50584*4+0x02000000,0x83a4); +reg_write( DDR_REG_BASE + 0x50585*4+0x02000000,0xc095); +reg_write( DDR_REG_BASE + 0x50586*4+0x02000000,0xf018); +reg_write( DDR_REG_BASE + 0x50587*4+0x02000000,0xc095); +reg_write( DDR_REG_BASE + 0x50588*4+0x02000000,0x60e8); +reg_write( DDR_REG_BASE + 0x50589*4+0x02000000,0xd2b); +reg_write( DDR_REG_BASE + 0x5058a*4+0x02000000,0x1021); +reg_write( DDR_REG_BASE + 0x5058b*4+0x02000000,0xc08d); +reg_write( DDR_REG_BASE + 0x5058c*4+0x02000000,0x20f4); +reg_write( DDR_REG_BASE + 0x5058d*4+0x02000000,0x3c1); +reg_write( DDR_REG_BASE + 0x5058e*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x5058f*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE + 0x50590*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50591*4+0x02000000,0x18c); +reg_write( DDR_REG_BASE + 0x50592*4+0x02000000,0x60e8); +reg_write( DDR_REG_BASE + 0x50593*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x50594*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE + 0x50595*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50596*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x50597*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE + 0x50598*4+0x02000000,0x7845); +reg_write( DDR_REG_BASE + 0x50599*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x5059a*4+0x02000000,0xb89c); +reg_write( DDR_REG_BASE + 0x5059b*4+0x02000000,0xb89f); +reg_write( DDR_REG_BASE + 0x5059c*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE + 0x5059d*4+0x02000000,0x71e5); +reg_write( DDR_REG_BASE + 0x5059e*4+0x02000000,0xfd3); +reg_write( DDR_REG_BASE + 0x5059f*4+0x02000000,0x9384); +reg_write( DDR_REG_BASE + 0x505a0*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE + 0x505a1*4+0x02000000,0x72b5); +reg_write( DDR_REG_BASE + 0x505a2*4+0x02000000,0x680); +reg_write( DDR_REG_BASE + 0x505a3*4+0x02000000,0xffe5); +reg_write( DDR_REG_BASE + 0x505a4*4+0x02000000,0x264a); +reg_write( DDR_REG_BASE + 0x505a5*4+0x02000000,0x3000); +reg_write( DDR_REG_BASE + 0x505a6*4+0x02000000,0xc00a); +reg_write( DDR_REG_BASE + 0x505a7*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x505a8*4+0x02000000,0xa9); +reg_write( DDR_REG_BASE + 0x505a9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x505aa*4+0x02000000,0xd9a); +reg_write( DDR_REG_BASE + 0x505ab*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE + 0x505ac*4+0x02000000,0x2078); +reg_write( DDR_REG_BASE + 0x505ad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x505ae*4+0x02000000,0xb1a); +reg_write( DDR_REG_BASE + 0x505af*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x505b0*4+0x02000000,0xc7e); +reg_write( DDR_REG_BASE + 0x505b1*4+0x02000000,0x180); +reg_write( DDR_REG_BASE + 0x505b2*4+0x02000000,0xc00b); +reg_write( DDR_REG_BASE + 0x505b3*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x505b4*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x505b5*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE + 0x505b6*4+0x02000000,0xe0aa); +reg_write( DDR_REG_BASE + 0x505b7*4+0x02000000,0x2480); +reg_write( DDR_REG_BASE + 0x505b8*4+0x02000000,0x3c0c); +reg_write( DDR_REG_BASE + 0x505b9*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x505ba*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x505bb*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x505bc*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x505bd*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x505be*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x505bf*4+0x02000000,0xc1b5); +reg_write( DDR_REG_BASE + 0x505c0*4+0x02000000,0xc254); +reg_write( DDR_REG_BASE + 0x505c1*4+0x02000000,0x4528); +reg_write( DDR_REG_BASE + 0x505c2*4+0x02000000,0x4200); +reg_write( DDR_REG_BASE + 0x505c3*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x505c4*4+0x02000000,0xee); +reg_write( DDR_REG_BASE + 0x505c5*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x505c6*4+0x02000000,0xcd6); +reg_write( DDR_REG_BASE + 0x505c7*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x505c8*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x505c9*4+0x02000000,0x706f); +reg_write( DDR_REG_BASE + 0x505ca*4+0x02000000,0xf035); +reg_write( DDR_REG_BASE + 0x505cb*4+0x02000000,0x4261); +reg_write( DDR_REG_BASE + 0x505cc*4+0x02000000,0xf009); +reg_write( DDR_REG_BASE + 0x505cd*4+0x02000000,0xc014); +reg_write( DDR_REG_BASE + 0x505ce*4+0x02000000,0x20f4); +reg_write( DDR_REG_BASE + 0x505cf*4+0x02000000,0x83); +reg_write( DDR_REG_BASE + 0x505d0*4+0x02000000,0xc08e); +reg_write( DDR_REG_BASE + 0x505d1*4+0x02000000,0x7834); +reg_write( DDR_REG_BASE + 0x505d2*4+0x02000000,0xb060); +reg_write( DDR_REG_BASE + 0x505d3*4+0x02000000,0x62ba); +reg_write( DDR_REG_BASE + 0x505d4*4+0x02000000,0x7124); +reg_write( DDR_REG_BASE + 0x505d5*4+0x02000000,0x9f3); +reg_write( DDR_REG_BASE + 0x505d6*4+0x02000000,0x8294); +reg_write( DDR_REG_BASE + 0x505d7*4+0x02000000,0x4183); +reg_write( DDR_REG_BASE + 0x505d8*4+0x02000000,0x911c); +reg_write( DDR_REG_BASE + 0x505d9*4+0x02000000,0x1446); +reg_write( DDR_REG_BASE + 0x505da*4+0x02000000,0x3103); +reg_write( DDR_REG_BASE + 0x505db*4+0x02000000,0x915f); +reg_write( DDR_REG_BASE + 0x505dc*4+0x02000000,0xc053); +reg_write( DDR_REG_BASE + 0x505dd*4+0x02000000,0x1448); +reg_write( DDR_REG_BASE + 0x505de*4+0x02000000,0x3101); +reg_write( DDR_REG_BASE + 0x505df*4+0x02000000,0x144a); +reg_write( DDR_REG_BASE + 0x505e0*4+0x02000000,0x3100); +reg_write( DDR_REG_BASE + 0x505e1*4+0x02000000,0x143a); +reg_write( DDR_REG_BASE + 0x505e2*4+0x02000000,0x311f); +reg_write( DDR_REG_BASE + 0x505e3*4+0x02000000,0x143c); +reg_write( DDR_REG_BASE + 0x505e4*4+0x02000000,0x311e); +reg_write( DDR_REG_BASE + 0x505e5*4+0x02000000,0x1440); +reg_write( DDR_REG_BASE + 0x505e6*4+0x02000000,0x310f); +reg_write( DDR_REG_BASE + 0x505e7*4+0x02000000,0x1442); +reg_write( DDR_REG_BASE + 0x505e8*4+0x02000000,0x310e); +reg_write( DDR_REG_BASE + 0x505e9*4+0x02000000,0x1444); +reg_write( DDR_REG_BASE + 0x505ea*4+0x02000000,0x310c); +reg_write( DDR_REG_BASE + 0x505eb*4+0x02000000,0xc346); +reg_write( DDR_REG_BASE + 0x505ec*4+0x02000000,0xc313); +reg_write( DDR_REG_BASE + 0x505ed*4+0x02000000,0xc048); +reg_write( DDR_REG_BASE + 0x505ee*4+0x02000000,0xc147); +reg_write( DDR_REG_BASE + 0x505ef*4+0x02000000,0xc242); +reg_write( DDR_REG_BASE + 0x505f0*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x505f1*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x505f2*4+0x02000000,0xef); +reg_write( DDR_REG_BASE + 0x505f3*4+0x02000000,0xb); +reg_write( DDR_REG_BASE + 0x505f4*4+0x02000000,0xc445); +reg_write( DDR_REG_BASE + 0x505f5*4+0x02000000,0xc644); +reg_write( DDR_REG_BASE + 0x505f6*4+0x02000000,0xc743); +reg_write( DDR_REG_BASE + 0x505f7*4+0x02000000,0x1c04); +reg_write( DDR_REG_BASE + 0x505f8*4+0x02000000,0x3780); +reg_write( DDR_REG_BASE + 0x505f9*4+0x02000000,0x1c00); +reg_write( DDR_REG_BASE + 0x505fa*4+0x02000000,0x37c0); +reg_write( DDR_REG_BASE + 0x505fb*4+0x02000000,0xc6e); +reg_write( DDR_REG_BASE + 0x505fc*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x505fd*4+0x02000000,0x4261); +reg_write( DDR_REG_BASE + 0x505fe*4+0x02000000,0x7167); +reg_write( DDR_REG_BASE + 0x505ff*4+0x02000000,0x232f); +reg_write( DDR_REG_BASE + 0x50600*4+0x02000000,0x16c8); +reg_write( DDR_REG_BASE + 0x50601*4+0x02000000,0xb97); +reg_write( DDR_REG_BASE + 0x50602*4+0x02000000,0x9364); +reg_write( DDR_REG_BASE + 0x50603*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x50604*4+0x02000000,0xc0b5); +reg_write( DDR_REG_BASE + 0x50605*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x50606*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x50607*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x50608*4+0x02000000,0xc2e4); +reg_write( DDR_REG_BASE + 0x50609*4+0x02000000,0x4308); +reg_write( DDR_REG_BASE + 0x5060a*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x5060b*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE + 0x5060c*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE + 0x5060d*4+0x02000000,0x1e4); +reg_write( DDR_REG_BASE + 0x5060e*4+0x02000000,0x218c); +reg_write( DDR_REG_BASE + 0x5060f*4+0x02000000,0x8fc3); +reg_write( DDR_REG_BASE + 0x50610*4+0x02000000,0xb6a0); +reg_write( DDR_REG_BASE + 0x50611*4+0x02000000,0xb6a1); +reg_write( DDR_REG_BASE + 0x50612*4+0x02000000,0xb6a2); +reg_write( DDR_REG_BASE + 0x50613*4+0x02000000,0xf224); +reg_write( DDR_REG_BASE + 0x50614*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x50615*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x50616*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50617*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x50618*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x50619*4+0x02000000,0xf83); +reg_write( DDR_REG_BASE + 0x5061a*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x5061b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5061c*4+0x02000000,0x2305); +reg_write( DDR_REG_BASE + 0x5061d*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x5061e*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x5061f*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x50620*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE + 0x50621*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x50622*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50623*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE + 0x50624*4+0x02000000,0x8881); +reg_write( DDR_REG_BASE + 0x50625*4+0x02000000,0x8800); +reg_write( DDR_REG_BASE + 0x50626*4+0x02000000,0xf00c); +reg_write( DDR_REG_BASE + 0x50627*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x50628*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE + 0x50629*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5062a*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE + 0x5062b*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE + 0x5062c*4+0x02000000,0x7a65); +reg_write( DDR_REG_BASE + 0x5062d*4+0x02000000,0x2205); +reg_write( DDR_REG_BASE + 0x5062e*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE + 0x5062f*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x50630*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x50631*4+0x02000000,0xb220); +reg_write( DDR_REG_BASE + 0x50632*4+0x02000000,0xceb); +reg_write( DDR_REG_BASE + 0x50633*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE + 0x50634*4+0x02000000,0xb76); +reg_write( DDR_REG_BASE + 0x50635*4+0x02000000,0x180); +reg_write( DDR_REG_BASE + 0x50636*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE + 0x50637*4+0x02000000,0x21a); +reg_write( DDR_REG_BASE + 0x50638*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x50639*4+0x02000000,0x900e); +reg_write( DDR_REG_BASE + 0x5063a*4+0x02000000,0x2a); +reg_write( DDR_REG_BASE + 0x5063b*4+0x02000000,0x1efc); +reg_write( DDR_REG_BASE + 0x5063c*4+0x02000000,0x92c4); +reg_write( DDR_REG_BASE + 0x5063d*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE + 0x5063e*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x5063f*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50640*4+0x02000000,0x440); +reg_write( DDR_REG_BASE + 0x50641*4+0x02000000,0xa8a0); +reg_write( DDR_REG_BASE + 0x50642*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x50643*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50644*4+0x02000000,0xfac); +reg_write( DDR_REG_BASE + 0x50645*4+0x02000000,0xb101); +reg_write( DDR_REG_BASE + 0x50646*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x50647*4+0x02000000,0xc6c4); +reg_write( DDR_REG_BASE + 0x50648*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x50649*4+0x02000000,0x7210); +reg_write( DDR_REG_BASE + 0x5064a*4+0x02000000,0x20e0); +reg_write( DDR_REG_BASE + 0x5064b*4+0x02000000,0x7ca); +reg_write( DDR_REG_BASE + 0x5064c*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x5064d*4+0x02000000,0x7101); +reg_write( DDR_REG_BASE + 0x5064e*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE + 0x5064f*4+0x02000000,0x1d6); +reg_write( DDR_REG_BASE + 0x50650*4+0x02000000,0x9f3); +reg_write( DDR_REG_BASE + 0x50651*4+0x02000000,0x803e); +reg_write( DDR_REG_BASE + 0x50652*4+0x02000000,0x7144); +reg_write( DDR_REG_BASE + 0x50653*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x50654*4+0x02000000,0xc2e2); +reg_write( DDR_REG_BASE + 0x50655*4+0x02000000,0x4328); +reg_write( DDR_REG_BASE + 0x50656*4+0x02000000,0x9ca); +reg_write( DDR_REG_BASE + 0x50657*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x50658*4+0x02000000,0x260a); +reg_write( DDR_REG_BASE + 0x50659*4+0x02000000,0x3000); +reg_write( DDR_REG_BASE + 0x5065a*4+0x02000000,0x45cb); +reg_write( DDR_REG_BASE + 0x5065b*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x5065c*4+0x02000000,0xf2); +reg_write( DDR_REG_BASE + 0x5065d*4+0x02000000,0x1d00); +reg_write( DDR_REG_BASE + 0x5065e*4+0x02000000,0x1045); +reg_write( DDR_REG_BASE + 0x5065f*4+0x02000000,0x1d00); +reg_write( DDR_REG_BASE + 0x50660*4+0x02000000,0x1005); +reg_write( DDR_REG_BASE + 0x50661*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x50662*4+0x02000000,0x7784); +reg_write( DDR_REG_BASE + 0x50663*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE + 0x50664*4+0x02000000,0x1e2); +reg_write( DDR_REG_BASE + 0x50665*4+0x02000000,0x99a); +reg_write( DDR_REG_BASE + 0x50666*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x50667*4+0x02000000,0x760c); +reg_write( DDR_REG_BASE + 0x50668*4+0x02000000,0xb17); +reg_write( DDR_REG_BASE + 0x50669*4+0x02000000,0x1030); +reg_write( DDR_REG_BASE + 0x5066a*4+0x02000000,0x1d10); +reg_write( DDR_REG_BASE + 0x5066b*4+0x02000000,0x1045); +reg_write( DDR_REG_BASE + 0x5066c*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x5066d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5066e*4+0x02000000,0x61a8); +reg_write( DDR_REG_BASE + 0x5066f*4+0x02000000,0xfb6); +reg_write( DDR_REG_BASE + 0x50670*4+0x02000000,0xffcf); +reg_write( DDR_REG_BASE + 0x50671*4+0x02000000,0x1d10); +reg_write( DDR_REG_BASE + 0x50672*4+0x02000000,0x1005); +reg_write( DDR_REG_BASE + 0x50673*4+0x02000000,0xc6c2); +reg_write( DDR_REG_BASE + 0x50674*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x50675*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x50676*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x50677*4+0x02000000,0xc1a2); +reg_write( DDR_REG_BASE + 0x50678*4+0x02000000,0xc341); +reg_write( DDR_REG_BASE + 0x50679*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x5067a*4+0x02000000,0x7083); +reg_write( DDR_REG_BASE + 0x5067b*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5067c*4+0x02000000,0x440); +reg_write( DDR_REG_BASE + 0x5067d*4+0x02000000,0x208c); +reg_write( DDR_REG_BASE + 0x5067e*4+0x02000000,0x8fc3); +reg_write( DDR_REG_BASE + 0x5067f*4+0x02000000,0x4308); +reg_write( DDR_REG_BASE + 0x50680*4+0x02000000,0x23ca); +reg_write( DDR_REG_BASE + 0x50681*4+0x02000000,0x10c1); +reg_write( DDR_REG_BASE + 0x50682*4+0x02000000,0xc30a); +reg_write( DDR_REG_BASE + 0x50683*4+0x02000000,0x1424); +reg_write( DDR_REG_BASE + 0x50684*4+0x02000000,0x301b); +reg_write( DDR_REG_BASE + 0x50685*4+0x02000000,0xc508); +reg_write( DDR_REG_BASE + 0x50686*4+0x02000000,0xc607); +reg_write( DDR_REG_BASE + 0x50687*4+0x02000000,0x70ef); +reg_write( DDR_REG_BASE + 0x50688*4+0x02000000,0xac5); +reg_write( DDR_REG_BASE + 0x50689*4+0x02000000,0x171); +reg_write( DDR_REG_BASE + 0x5068a*4+0x02000000,0xc340); +reg_write( DDR_REG_BASE + 0x5068b*4+0x02000000,0x70ed); +reg_write( DDR_REG_BASE + 0x5068c*4+0x02000000,0x706c); +reg_write( DDR_REG_BASE + 0x5068d*4+0x02000000,0x262f); +reg_write( DDR_REG_BASE + 0x5068e*4+0x02000000,0x3042); +reg_write( DDR_REG_BASE + 0x5068f*4+0x02000000,0x2644); +reg_write( DDR_REG_BASE + 0x50690*4+0x02000000,0x3e1f); +reg_write( DDR_REG_BASE + 0x50691*4+0x02000000,0x214b); +reg_write( DDR_REG_BASE + 0x50692*4+0x02000000,0x8c00); +reg_write( DDR_REG_BASE + 0x50693*4+0x02000000,0xdc58); +reg_write( DDR_REG_BASE + 0x50694*4+0x02000000,0x27cf); +reg_write( DDR_REG_BASE + 0x50695*4+0x02000000,0x31e2); +reg_write( DDR_REG_BASE + 0x50696*4+0x02000000,0x7c24); +reg_write( DDR_REG_BASE + 0x50697*4+0x02000000,0x2684); +reg_write( DDR_REG_BASE + 0x50698*4+0x02000000,0x3001); +reg_write( DDR_REG_BASE + 0x50699*4+0x02000000,0x2405); +reg_write( DDR_REG_BASE + 0x5069a*4+0x02000000,0x17cc); +reg_write( DDR_REG_BASE + 0x5069b*4+0x02000000,0x2305); +reg_write( DDR_REG_BASE + 0x5069c*4+0x02000000,0x783); +reg_write( DDR_REG_BASE + 0x5069d*4+0x02000000,0x7b85); +reg_write( DDR_REG_BASE + 0x5069e*4+0x02000000,0x7c3d); +reg_write( DDR_REG_BASE + 0x5069f*4+0x02000000,0x7c9d); +reg_write( DDR_REG_BASE + 0x506a0*4+0x02000000,0x7c9d); +reg_write( DDR_REG_BASE + 0x506a1*4+0x02000000,0x239a); +reg_write( DDR_REG_BASE + 0x506a2*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x506a3*4+0x02000000,0x2404); +reg_write( DDR_REG_BASE + 0x506a4*4+0x02000000,0x1f9e); +reg_write( DDR_REG_BASE + 0x506a5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x506a6*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE + 0x506a7*4+0x02000000,0xc401); +reg_write( DDR_REG_BASE + 0x506a8*4+0x02000000,0x272f); +reg_write( DDR_REG_BASE + 0x506a9*4+0x02000000,0x32c0); +reg_write( DDR_REG_BASE + 0x506aa*4+0x02000000,0x251a); +reg_write( DDR_REG_BASE + 0x506ab*4+0x02000000,0x1f8d); +reg_write( DDR_REG_BASE + 0x506ac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x506ad*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x506ae*4+0x02000000,0x2405); +reg_write( DDR_REG_BASE + 0x506af*4+0x02000000,0x178c); +reg_write( DDR_REG_BASE + 0x506b0*4+0x02000000,0x2405); +reg_write( DDR_REG_BASE + 0x506b1*4+0x02000000,0x10de); +reg_write( DDR_REG_BASE + 0x506b2*4+0x02000000,0x44cb); +reg_write( DDR_REG_BASE + 0x506b3*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE + 0x506b4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x506b5*4+0x02000000,0x2705); +reg_write( DDR_REG_BASE + 0x506b6*4+0x02000000,0x3303); +reg_write( DDR_REG_BASE + 0x506b7*4+0x02000000,0x1b00); +reg_write( DDR_REG_BASE + 0x506b8*4+0x02000000,0x784); +reg_write( DDR_REG_BASE + 0x506b9*4+0x02000000,0x260a); +reg_write( DDR_REG_BASE + 0x506ba*4+0x02000000,0x3040); +reg_write( DDR_REG_BASE + 0x506bb*4+0x02000000,0x269a); +reg_write( DDR_REG_BASE + 0x506bc*4+0x02000000,0x3004); +reg_write( DDR_REG_BASE + 0x506bd*4+0x02000000,0x2353); +reg_write( DDR_REG_BASE + 0x506be*4+0x02000000,0x30c3); +reg_write( DDR_REG_BASE + 0x506bf*4+0x02000000,0x7be5); +reg_write( DDR_REG_BASE + 0x506c0*4+0x02000000,0x7554); +reg_write( DDR_REG_BASE + 0x506c1*4+0x02000000,0x2604); +reg_write( DDR_REG_BASE + 0x506c2*4+0x02000000,0x3f9e); +reg_write( DDR_REG_BASE + 0x506c3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x506c4*4+0x02000000,0xf00); +reg_write( DDR_REG_BASE + 0x506c5*4+0x02000000,0x2505); +reg_write( DDR_REG_BASE + 0x506c6*4+0x02000000,0x178d); +reg_write( DDR_REG_BASE + 0x506c7*4+0x02000000,0x7d65); +reg_write( DDR_REG_BASE + 0x506c8*4+0x02000000,0x2754); +reg_write( DDR_REG_BASE + 0x506c9*4+0x02000000,0x3803); +reg_write( DDR_REG_BASE + 0x506ca*4+0x02000000,0x2755); +reg_write( DDR_REG_BASE + 0x506cb*4+0x02000000,0x3802); +reg_write( DDR_REG_BASE + 0x506cc*4+0x02000000,0x7b85); +reg_write( DDR_REG_BASE + 0x506cd*4+0x02000000,0x26c5); +reg_write( DDR_REG_BASE + 0x506ce*4+0x02000000,0x1e21); +reg_write( DDR_REG_BASE + 0x506cf*4+0x02000000,0x7a85); +reg_write( DDR_REG_BASE + 0x506d0*4+0x02000000,0xb3a0); +reg_write( DDR_REG_BASE + 0x506d1*4+0x02000000,0xb2c0); +reg_write( DDR_REG_BASE + 0x506d2*4+0x02000000,0x2104); +reg_write( DDR_REG_BASE + 0x506d3*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE + 0x506d4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x506d5*4+0x02000000,0xff00); +reg_write( DDR_REG_BASE + 0x506d6*4+0x02000000,0xc100); +reg_write( DDR_REG_BASE + 0x506d7*4+0x02000000,0x208c); +reg_write( DDR_REG_BASE + 0x506d8*4+0x02000000,0x8fc3); +reg_write( DDR_REG_BASE + 0x506d9*4+0x02000000,0x7a25); +reg_write( DDR_REG_BASE + 0x506da*4+0x02000000,0x2755); +reg_write( DDR_REG_BASE + 0x506db*4+0x02000000,0x3c01); +reg_write( DDR_REG_BASE + 0x506dc*4+0x02000000,0x7c25); +reg_write( DDR_REG_BASE + 0x506dd*4+0x02000000,0x2340); +reg_write( DDR_REG_BASE + 0x506de*4+0x02000000,0x1041); +reg_write( DDR_REG_BASE + 0x506df*4+0x02000000,0xb440); +reg_write( DDR_REG_BASE + 0x506e0*4+0x02000000,0xf405); +reg_write( DDR_REG_BASE + 0x506e1*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x506e2*4+0x02000000,0x7042); +reg_write( DDR_REG_BASE + 0x506e3*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x506e4*4+0x02000000,0x440); +reg_write( DDR_REG_BASE + 0x506e5*4+0x02000000,0x782f); +reg_write( DDR_REG_BASE + 0x506e6*4+0x02000000,0xc0a2); +reg_write( DDR_REG_BASE + 0x506e7*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x506e8*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x506e9*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x506ea*4+0x02000000,0xa0d); +reg_write( DDR_REG_BASE + 0x506eb*4+0x02000000,0xf0); +reg_write( DDR_REG_BASE + 0x506ec*4+0x02000000,0xdf10); +reg_write( DDR_REG_BASE + 0x506ed*4+0x02000000,0xa09); +reg_write( DDR_REG_BASE + 0x506ee*4+0x02000000,0x310); +reg_write( DDR_REG_BASE + 0x506ef*4+0x02000000,0x70ed); +reg_write( DDR_REG_BASE + 0x506f0*4+0x02000000,0xa57); +reg_write( DDR_REG_BASE + 0x506f1*4+0x02000000,0x5f5); +reg_write( DDR_REG_BASE + 0x506f2*4+0x02000000,0x264a); +reg_write( DDR_REG_BASE + 0x506f3*4+0x02000000,0x31c0); +reg_write( DDR_REG_BASE + 0x506f4*4+0x02000000,0x728d); +reg_write( DDR_REG_BASE + 0x506f5*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x506f6*4+0x02000000,0x2025); +reg_write( DDR_REG_BASE + 0x506f7*4+0x02000000,0x80); +reg_write( DDR_REG_BASE + 0x506f8*4+0x02000000,0xf195); +reg_write( DDR_REG_BASE + 0x506f9*4+0x02000000,0xf01a); +reg_write( DDR_REG_BASE + 0x506fa*4+0x02000000,0xf017); +reg_write( DDR_REG_BASE + 0x506fb*4+0x02000000,0xf015); +reg_write( DDR_REG_BASE + 0x506fc*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE + 0x506fd*4+0x02000000,0xf01f); +reg_write( DDR_REG_BASE + 0x506fe*4+0x02000000,0xf02b); +reg_write( DDR_REG_BASE + 0x506ff*4+0x02000000,0xf02d); +reg_write( DDR_REG_BASE + 0x50700*4+0x02000000,0xf027); +reg_write( DDR_REG_BASE + 0x50701*4+0x02000000,0xf02d); +reg_write( DDR_REG_BASE + 0x50702*4+0x02000000,0xf02d); +reg_write( DDR_REG_BASE + 0x50703*4+0x02000000,0xf02f); +reg_write( DDR_REG_BASE + 0x50704*4+0x02000000,0xf00b); +reg_write( DDR_REG_BASE + 0x50705*4+0x02000000,0xf01c); +reg_write( DDR_REG_BASE + 0x50706*4+0x02000000,0xf021); +reg_write( DDR_REG_BASE + 0x50707*4+0x02000000,0xf015); +reg_write( DDR_REG_BASE + 0x50708*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE + 0x50709*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE + 0x5070a*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE + 0x5070b*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE + 0x5070c*4+0x02000000,0xf00f); +reg_write( DDR_REG_BASE + 0x5070d*4+0x02000000,0xf006); +reg_write( DDR_REG_BASE + 0x5070e*4+0x02000000,0xf003); +reg_write( DDR_REG_BASE + 0x5070f*4+0x02000000,0xdc07); +reg_write( DDR_REG_BASE + 0x50710*4+0x02000000,0xf002); +reg_write( DDR_REG_BASE + 0x50711*4+0x02000000,0x738d); +reg_write( DDR_REG_BASE + 0x50712*4+0x02000000,0xa11); +reg_write( DDR_REG_BASE + 0x50713*4+0x02000000,0xf1); +reg_write( DDR_REG_BASE + 0x50714*4+0x02000000,0x43a1); +reg_write( DDR_REG_BASE + 0x50715*4+0x02000000,0x239a); +reg_write( DDR_REG_BASE + 0x50716*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x50717*4+0x02000000,0x7e65); +reg_write( DDR_REG_BASE + 0x50718*4+0x02000000,0x4381); +reg_write( DDR_REG_BASE + 0x50719*4+0x02000000,0xf175); +reg_write( DDR_REG_BASE + 0x5071a*4+0x02000000,0x4799); +reg_write( DDR_REG_BASE + 0x5071b*4+0x02000000,0xe28d); +reg_write( DDR_REG_BASE + 0x5071c*4+0x02000000,0x260a); +reg_write( DDR_REG_BASE + 0x5071d*4+0x02000000,0x37c0); +reg_write( DDR_REG_BASE + 0x5071e*4+0x02000000,0x43e3); +reg_write( DDR_REG_BASE + 0x5071f*4+0x02000000,0xf56f); +reg_write( DDR_REG_BASE + 0x50720*4+0x02000000,0x43a1); +reg_write( DDR_REG_BASE + 0x50721*4+0x02000000,0x239a); +reg_write( DDR_REG_BASE + 0x50722*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x50723*4+0x02000000,0x7e65); +reg_write( DDR_REG_BASE + 0x50724*4+0x02000000,0x230a); +reg_write( DDR_REG_BASE + 0x50725*4+0x02000000,0x780); +reg_write( DDR_REG_BASE + 0x50726*4+0x02000000,0xf167); +reg_write( DDR_REG_BASE + 0x50727*4+0x02000000,0x766c); +reg_write( DDR_REG_BASE + 0x50728*4+0x02000000,0xf165); +reg_write( DDR_REG_BASE + 0x50729*4+0x02000000,0x756c); +reg_write( DDR_REG_BASE + 0x5072a*4+0x02000000,0xf163); +reg_write( DDR_REG_BASE + 0x5072b*4+0x02000000,0x716c); +reg_write( DDR_REG_BASE + 0x5072c*4+0x02000000,0xf161); +reg_write( DDR_REG_BASE + 0x5072d*4+0x02000000,0xdb16); +reg_write( DDR_REG_BASE + 0x5072e*4+0x02000000,0xf15f); +reg_write( DDR_REG_BASE + 0x5072f*4+0x02000000,0xdb08); +reg_write( DDR_REG_BASE + 0x50730*4+0x02000000,0xf15d); +reg_write( DDR_REG_BASE + 0x50731*4+0x02000000,0xdb20); +reg_write( DDR_REG_BASE + 0x50732*4+0x02000000,0xf15b); +reg_write( DDR_REG_BASE + 0x50733*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x50734*4+0x02000000,0xc0f1); +reg_write( DDR_REG_BASE + 0x50735*4+0x02000000,0xc1a4); +reg_write( DDR_REG_BASE + 0x50736*4+0x02000000,0xc408); +reg_write( DDR_REG_BASE + 0x50737*4+0x02000000,0xc443); +reg_write( DDR_REG_BASE + 0x50738*4+0x02000000,0xc407); +reg_write( DDR_REG_BASE + 0x50739*4+0x02000000,0xc442); +reg_write( DDR_REG_BASE + 0x5073a*4+0x02000000,0xc406); +reg_write( DDR_REG_BASE + 0x5073b*4+0x02000000,0xc441); +reg_write( DDR_REG_BASE + 0x5073c*4+0x02000000,0xc405); +reg_write( DDR_REG_BASE + 0x5073d*4+0x02000000,0xe72); +reg_write( DDR_REG_BASE + 0x5073e*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x5073f*4+0x02000000,0xc440); +reg_write( DDR_REG_BASE + 0x50740*4+0x02000000,0xc0a4); +reg_write( DDR_REG_BASE + 0x50741*4+0x02000000,0xc0d1); +reg_write( DDR_REG_BASE + 0x50742*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x50743*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x50744*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x50745*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50746*4+0x02000000,0x440); +reg_write( DDR_REG_BASE + 0x50747*4+0x02000000,0x8920); +reg_write( DDR_REG_BASE + 0x50748*4+0x02000000,0x208c); +reg_write( DDR_REG_BASE + 0x50749*4+0x02000000,0x8fc3); +reg_write( DDR_REG_BASE + 0x5074a*4+0x02000000,0x20ca); +reg_write( DDR_REG_BASE + 0x5074b*4+0x02000000,0x41); +reg_write( DDR_REG_BASE + 0x5074c*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x5074d*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x5074e*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE + 0x5074f*4+0x02000000,0x1e8); +reg_write( DDR_REG_BASE + 0x50750*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x50751*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x50752*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x50753*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50754*4+0x02000000,0x440); +reg_write( DDR_REG_BASE + 0x50755*4+0x02000000,0x8920); +reg_write( DDR_REG_BASE + 0x50756*4+0x02000000,0x208c); +reg_write( DDR_REG_BASE + 0x50757*4+0x02000000,0x8fc3); +reg_write( DDR_REG_BASE + 0x50758*4+0x02000000,0x20ca); +reg_write( DDR_REG_BASE + 0x50759*4+0x02000000,0x41); +reg_write( DDR_REG_BASE + 0x5075a*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x5075b*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x5075c*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE + 0x5075d*4+0x02000000,0x1e6); +reg_write( DDR_REG_BASE + 0x5075e*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x5075f*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x50760*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x50761*4+0x02000000,0x900e); +reg_write( DDR_REG_BASE + 0x50762*4+0x02000000,0x4c); +reg_write( DDR_REG_BASE + 0x50763*4+0x02000000,0x9160); +reg_write( DDR_REG_BASE + 0x50764*4+0x02000000,0x9141); +reg_write( DDR_REG_BASE + 0x50765*4+0x02000000,0x221a); +reg_write( DDR_REG_BASE + 0x50766*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x50767*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x50768*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50769*4+0x02000000,0x7965); +reg_write( DDR_REG_BASE + 0x5076a*4+0x02000000,0xe807); +reg_write( DDR_REG_BASE + 0x5076b*4+0x02000000,0x231a); +reg_write( DDR_REG_BASE + 0x5076c*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x5076d*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5076e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5076f*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE + 0x50770*4+0x02000000,0xf008); +reg_write( DDR_REG_BASE + 0x50771*4+0x02000000,0x4040); +reg_write( DDR_REG_BASE + 0x50772*4+0x02000000,0xda0f); +reg_write( DDR_REG_BASE + 0x50773*4+0x02000000,0xba61); +reg_write( DDR_REG_BASE + 0x50774*4+0x02000000,0xaff); +reg_write( DDR_REG_BASE + 0x50775*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE + 0x50776*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x50777*4+0x02000000,0x793b); +reg_write( DDR_REG_BASE + 0x50778*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x50779*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x5077a*4+0x02000000,0x900f); +reg_write( DDR_REG_BASE + 0x5077b*4+0x02000000,0xfe4c); +reg_write( DDR_REG_BASE + 0x5077c*4+0x02000000,0xda10); +reg_write( DDR_REG_BASE + 0x5077d*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE + 0x5077e*4+0x02000000,0xba61); +reg_write( DDR_REG_BASE + 0x5077f*4+0x02000000,0xa01); +reg_write( DDR_REG_BASE + 0x50780*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x50781*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x50782*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x50783*4+0x02000000,0xb101); +reg_write( DDR_REG_BASE + 0x50784*4+0x02000000,0xc2e4); +reg_write( DDR_REG_BASE + 0x50785*4+0x02000000,0x8830); +reg_write( DDR_REG_BASE + 0x50786*4+0x02000000,0x96d); +reg_write( DDR_REG_BASE + 0x50787*4+0x02000000,0x110); +reg_write( DDR_REG_BASE + 0x50788*4+0x02000000,0x8008); +reg_write( DDR_REG_BASE + 0x50789*4+0x02000000,0x869); +reg_write( DDR_REG_BASE + 0x5078a*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x5078b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5078c*4+0x02000000,0x800); +reg_write( DDR_REG_BASE + 0x5078d*4+0x02000000,0x45cb); +reg_write( DDR_REG_BASE + 0x5078e*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5078f*4+0x02000000,0x7b1); +reg_write( DDR_REG_BASE + 0x50790*4+0x02000000,0x8d00); +reg_write( DDR_REG_BASE + 0x50791*4+0x02000000,0x8ea); +reg_write( DDR_REG_BASE + 0x50792*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x50793*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x50794*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x50795*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE + 0x50796*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50797*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x50798*4+0x02000000,0x8d64); +reg_write( DDR_REG_BASE + 0x50799*4+0x02000000,0x8da3); +reg_write( DDR_REG_BASE + 0x5079a*4+0x02000000,0x211a); +reg_write( DDR_REG_BASE + 0x5079b*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE + 0x5079c*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x5079d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5079e*4+0x02000000,0xf018); +reg_write( DDR_REG_BASE + 0x5079f*4+0x02000000,0x251a); +reg_write( DDR_REG_BASE + 0x507a0*4+0x02000000,0x1f81); +reg_write( DDR_REG_BASE + 0x507a1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x507a2*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE + 0x507a3*4+0x02000000,0x7e45); +reg_write( DDR_REG_BASE + 0x507a4*4+0x02000000,0x2105); +reg_write( DDR_REG_BASE + 0x507a5*4+0x02000000,0xf8c); +reg_write( DDR_REG_BASE + 0x507a6*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x507a7*4+0x02000000,0x1064); +reg_write( DDR_REG_BASE + 0x507a8*4+0x02000000,0x251a); +reg_write( DDR_REG_BASE + 0x507a9*4+0x02000000,0x1f81); +reg_write( DDR_REG_BASE + 0x507aa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x507ab*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x507ac*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE + 0x507ad*4+0x02000000,0x79c5); +reg_write( DDR_REG_BASE + 0x507ae*4+0x02000000,0x793b); +reg_write( DDR_REG_BASE + 0x507af*4+0x02000000,0x2105); +reg_write( DDR_REG_BASE + 0x507b0*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x507b1*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x507b2*4+0x02000000,0x200); +reg_write( DDR_REG_BASE + 0x507b3*4+0x02000000,0x9120); +reg_write( DDR_REG_BASE + 0x507b4*4+0x02000000,0xb9c5); +reg_write( DDR_REG_BASE + 0x507b5*4+0x02000000,0xb420); +reg_write( DDR_REG_BASE + 0x507b6*4+0x02000000,0xbd3); +reg_write( DDR_REG_BASE + 0x507b7*4+0x02000000,0x8365); +reg_write( DDR_REG_BASE + 0x507b8*4+0x02000000,0x2055); +reg_write( DDR_REG_BASE + 0x507b9*4+0x02000000,0xd0e); +reg_write( DDR_REG_BASE + 0x507ba*4+0x02000000,0xea6); +reg_write( DDR_REG_BASE + 0x507bb*4+0x02000000,0xc0); +reg_write( DDR_REG_BASE + 0x507bc*4+0x02000000,0xc6c4); +reg_write( DDR_REG_BASE + 0x507bd*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x507be*4+0x02000000,0xc0f1); +reg_write( DDR_REG_BASE + 0x507bf*4+0x02000000,0xc1a4); +reg_write( DDR_REG_BASE + 0x507c0*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x507c1*4+0x02000000,0xc92); +reg_write( DDR_REG_BASE + 0x507c2*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x507c3*4+0x02000000,0xd9ff); +reg_write( DDR_REG_BASE + 0x507c4*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x507c5*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE + 0x507c6*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x507c7*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x507c8*4+0x02000000,0xd85a); +reg_write( DDR_REG_BASE + 0x507c9*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x507ca*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x507cb*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE + 0x507cc*4+0x02000000,0xda0a); +reg_write( DDR_REG_BASE + 0x507cd*4+0x02000000,0xd52); +reg_write( DDR_REG_BASE + 0x507ce*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x507cf*4+0x02000000,0xdb20); +reg_write( DDR_REG_BASE + 0x507d0*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x507d1*4+0x02000000,0xd0a); +reg_write( DDR_REG_BASE + 0x507d2*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x507d3*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x507d4*4+0x02000000,0xc0a4); +reg_write( DDR_REG_BASE + 0x507d5*4+0x02000000,0xc0d1); +reg_write( DDR_REG_BASE + 0x507d6*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x507d7*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x507d8*4+0x02000000,0x7014); +reg_write( DDR_REG_BASE + 0x507d9*4+0x02000000,0x20c0); +reg_write( DDR_REG_BASE + 0x507da*4+0x02000000,0xfe9); +reg_write( DDR_REG_BASE + 0x507db*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x507dc*4+0x02000000,0x2884); +reg_write( DDR_REG_BASE + 0x507dd*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x507de*4+0x02000000,0x917); +reg_write( DDR_REG_BASE + 0x507df*4+0x02000000,0x3f0); +reg_write( DDR_REG_BASE + 0x507e0*4+0x02000000,0x228a); +reg_write( DDR_REG_BASE + 0x507e1*4+0x02000000,0xfc7); +reg_write( DDR_REG_BASE + 0x507e2*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE + 0x507e3*4+0x02000000,0xb9c4); +reg_write( DDR_REG_BASE + 0x507e4*4+0x02000000,0xe905); +reg_write( DDR_REG_BASE + 0x507e5*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE + 0x507e6*4+0x02000000,0x9ff); +reg_write( DDR_REG_BASE + 0x507e7*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE + 0x507e8*4+0x02000000,0x7a5b); +reg_write( DDR_REG_BASE + 0x507e9*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x507ea*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x507eb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x507ec*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE + 0x507ed*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x507ee*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x507ef*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x507f0*4+0x02000000,0x16a); +reg_write( DDR_REG_BASE + 0x507f1*4+0x02000000,0x224f); +reg_write( DDR_REG_BASE + 0x507f2*4+0x02000000,0x240); +reg_write( DDR_REG_BASE + 0x507f3*4+0x02000000,0x1900); +reg_write( DDR_REG_BASE + 0x507f4*4+0x02000000,0x5); +reg_write( DDR_REG_BASE + 0x507f5*4+0x02000000,0xb140); +reg_write( DDR_REG_BASE + 0x507f6*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE + 0x507f7*4+0x02000000,0xb140); +reg_write( DDR_REG_BASE + 0x507f8*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x507f9*4+0x02000000,0x1900); +reg_write( DDR_REG_BASE + 0x507fa*4+0x02000000,0x5); +reg_write( DDR_REG_BASE + 0x507fb*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x507fc*4+0x02000000,0x80d); +reg_write( DDR_REG_BASE + 0x507fd*4+0x02000000,0x72); +reg_write( DDR_REG_BASE + 0x507fe*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x507ff*4+0x02000000,0x48ff); +reg_write( DDR_REG_BASE + 0x50800*4+0x02000000,0x2984); +reg_write( DDR_REG_BASE + 0x50801*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x50802*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x50803*4+0x02000000,0x782e); +reg_write( DDR_REG_BASE + 0x50804*4+0x02000000,0xc0f1); +reg_write( DDR_REG_BASE + 0x50805*4+0x02000000,0x4200); +reg_write( DDR_REG_BASE + 0x50806*4+0x02000000,0x95a); +reg_write( DDR_REG_BASE + 0x50807*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x50808*4+0x02000000,0x4020); +reg_write( DDR_REG_BASE + 0x50809*4+0x02000000,0x795b); +reg_write( DDR_REG_BASE + 0x5080a*4+0x02000000,0x2144); +reg_write( DDR_REG_BASE + 0x5080b*4+0x02000000,0x181); +reg_write( DDR_REG_BASE + 0x5080c*4+0x02000000,0xb9c4); +reg_write( DDR_REG_BASE + 0x5080d*4+0x02000000,0xe906); +reg_write( DDR_REG_BASE + 0x5080e*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE + 0x5080f*4+0x02000000,0x901); +reg_write( DDR_REG_BASE + 0x50810*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x50811*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x50812*4+0x02000000,0xc0d1); +reg_write( DDR_REG_BASE + 0x50813*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x50814*4+0x02000000,0xb8c1); +reg_write( DDR_REG_BASE + 0x50815*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x50816*4+0x02000000,0xc0f1); +reg_write( DDR_REG_BASE + 0x50817*4+0x02000000,0xc1a4); +reg_write( DDR_REG_BASE + 0x50818*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x50819*4+0x02000000,0xbe2); +reg_write( DDR_REG_BASE + 0x5081a*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x5081b*4+0x02000000,0xd9ff); +reg_write( DDR_REG_BASE + 0x5081c*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x5081d*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE + 0x5081e*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x5081f*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x50820*4+0x02000000,0xd85a); +reg_write( DDR_REG_BASE + 0x50821*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x50822*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x50823*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE + 0x50824*4+0x02000000,0xda09); +reg_write( DDR_REG_BASE + 0x50825*4+0x02000000,0xca2); +reg_write( DDR_REG_BASE + 0x50826*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x50827*4+0x02000000,0xdb20); +reg_write( DDR_REG_BASE + 0x50828*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x50829*4+0x02000000,0xc5a); +reg_write( DDR_REG_BASE + 0x5082a*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x5082b*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x5082c*4+0x02000000,0xc0a4); +reg_write( DDR_REG_BASE + 0x5082d*4+0x02000000,0xc0d1); +reg_write( DDR_REG_BASE + 0x5082e*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x5082f*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x50830*4+0x02000000,0xc3e1); +reg_write( DDR_REG_BASE + 0x50831*4+0x02000000,0xc2e1); +reg_write( DDR_REG_BASE + 0x50832*4+0x02000000,0xc1e1); +reg_write( DDR_REG_BASE + 0x50833*4+0x02000000,0xc0e1); +reg_write( DDR_REG_BASE + 0x50834*4+0x02000000,0xc0f1); +reg_write( DDR_REG_BASE + 0x50835*4+0x02000000,0xc1a1); +reg_write( DDR_REG_BASE + 0x50836*4+0x02000000,0x4220); +reg_write( DDR_REG_BASE + 0x50837*4+0x02000000,0xc184); +reg_write( DDR_REG_BASE + 0x50838*4+0x02000000,0xc140); +reg_write( DDR_REG_BASE + 0x50839*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x5083a*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE + 0x5083b*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5083c*4+0x02000000,0x12); +reg_write( DDR_REG_BASE + 0x5083d*4+0x02000000,0x80f); +reg_write( DDR_REG_BASE + 0x5083e*4+0x02000000,0x64); +reg_write( DDR_REG_BASE + 0x5083f*4+0x02000000,0x4040); +reg_write( DDR_REG_BASE + 0x50840*4+0x02000000,0xa6a); +reg_write( DDR_REG_BASE + 0x50841*4+0x02000000,0x1e0); +reg_write( DDR_REG_BASE + 0x50842*4+0x02000000,0xc100); +reg_write( DDR_REG_BASE + 0x50843*4+0x02000000,0x7487); +reg_write( DDR_REG_BASE + 0x50844*4+0x02000000,0xc0d1); +reg_write( DDR_REG_BASE + 0x50845*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x50846*4+0x02000000,0xc0a4); +reg_write( DDR_REG_BASE + 0x50847*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x50848*4+0x02000000,0x791d); +reg_write( DDR_REG_BASE + 0x50849*4+0x02000000,0x216c); +reg_write( DDR_REG_BASE + 0x5084a*4+0x02000000,0x102); +reg_write( DDR_REG_BASE + 0x5084b*4+0x02000000,0x206c); +reg_write( DDR_REG_BASE + 0x5084c*4+0x02000000,0x141); +reg_write( DDR_REG_BASE + 0x5084d*4+0x02000000,0x7822); +reg_write( DDR_REG_BASE + 0x5084e*4+0x02000000,0x621a); +reg_write( DDR_REG_BASE + 0x5084f*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x50850*4+0x02000000,0x784e); +reg_write( DDR_REG_BASE + 0x50851*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x50852*4+0x02000000,0xc0e6); +reg_write( DDR_REG_BASE + 0x50853*4+0x02000000,0x215f); +reg_write( DDR_REG_BASE + 0x50854*4+0x02000000,0x483); +reg_write( DDR_REG_BASE + 0x50855*4+0x02000000,0x44cb); +reg_write( DDR_REG_BASE + 0x50856*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50857*4+0x02000000,0x6b4); +reg_write( DDR_REG_BASE + 0x50858*4+0x02000000,0x70cd); +reg_write( DDR_REG_BASE + 0x50859*4+0x02000000,0x647a); +reg_write( DDR_REG_BASE + 0x5085a*4+0x02000000,0x8aa2); +reg_write( DDR_REG_BASE + 0x5085b*4+0x02000000,0x8a43); +reg_write( DDR_REG_BASE + 0x5085c*4+0x02000000,0x7d04); +reg_write( DDR_REG_BASE + 0x5085d*4+0x02000000,0xf00b); +reg_write( DDR_REG_BASE + 0x5085e*4+0x02000000,0x6199); +reg_write( DDR_REG_BASE + 0x5085f*4+0x02000000,0x89e4); +reg_write( DDR_REG_BASE + 0x50860*4+0x02000000,0x7f0b); +reg_write( DDR_REG_BASE + 0x50861*4+0x02000000,0xf206); +reg_write( DDR_REG_BASE + 0x50862*4+0x02000000,0x89e5); +reg_write( DDR_REG_BASE + 0x50863*4+0x02000000,0x79af); +reg_write( DDR_REG_BASE + 0x50864*4+0x02000000,0x210f); +reg_write( DDR_REG_BASE + 0x50865*4+0x02000000,0x3cd); +reg_write( DDR_REG_BASE + 0x50866*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE + 0x50867*4+0x02000000,0xef1); +reg_write( DDR_REG_BASE + 0x50868*4+0x02000000,0x90a4); +reg_write( DDR_REG_BASE + 0x50869*4+0x02000000,0x2314); +reg_write( DDR_REG_BASE + 0x5086a*4+0x02000000,0x381); +reg_write( DDR_REG_BASE + 0x5086b*4+0x02000000,0x78af); +reg_write( DDR_REG_BASE + 0x5086c*4+0x02000000,0xc4c6); +reg_write( DDR_REG_BASE + 0x5086d*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x5086e*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x5086f*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x50870*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x50871*4+0x02000000,0x206f); +reg_write( DDR_REG_BASE + 0x50872*4+0x02000000,0x843); +reg_write( DDR_REG_BASE + 0x50873*4+0x02000000,0x90e0); +reg_write( DDR_REG_BASE + 0x50874*4+0x02000000,0x10f1); +reg_write( DDR_REG_BASE + 0x50875*4+0x02000000,0x809b); +reg_write( DDR_REG_BASE + 0x50876*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x50877*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50878*4+0x02000000,0x7c4); +reg_write( DDR_REG_BASE + 0x50879*4+0x02000000,0xbea); +reg_write( DDR_REG_BASE + 0x5087a*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x5087b*4+0x02000000,0xc1a2); +reg_write( DDR_REG_BASE + 0x5087c*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x5087d*4+0x02000000,0x70c5); +reg_write( DDR_REG_BASE + 0x5087e*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x5087f*4+0x02000000,0xc0); +reg_write( DDR_REG_BASE + 0x50880*4+0x02000000,0xdca); +reg_write( DDR_REG_BASE + 0x50881*4+0x02000000,0x80); +reg_write( DDR_REG_BASE + 0x50882*4+0x02000000,0xb15); +reg_write( DDR_REG_BASE + 0x50883*4+0x02000000,0x307e); +reg_write( DDR_REG_BASE + 0x50884*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x50885*4+0x02000000,0x896); +reg_write( DDR_REG_BASE + 0x50886*4+0x02000000,0x80); +reg_write( DDR_REG_BASE + 0x50887*4+0x02000000,0xd56); +reg_write( DDR_REG_BASE + 0x50888*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x50889*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x5088a*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x5088b*4+0x02000000,0xf00f); +reg_write( DDR_REG_BASE + 0x5088c*4+0x02000000,0x886); +reg_write( DDR_REG_BASE + 0x5088d*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x5088e*4+0x02000000,0xd8c8); +reg_write( DDR_REG_BASE + 0x5088f*4+0x02000000,0xd46); +reg_write( DDR_REG_BASE + 0x50890*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x50891*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x50892*4+0x02000000,0x87a); +reg_write( DDR_REG_BASE + 0x50893*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x50894*4+0x02000000,0xd862); +reg_write( DDR_REG_BASE + 0x50895*4+0x02000000,0xd3a); +reg_write( DDR_REG_BASE + 0x50896*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x50897*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x50898*4+0x02000000,0x720c); +reg_write( DDR_REG_BASE + 0x50899*4+0x02000000,0x86e); +reg_write( DDR_REG_BASE + 0x5089a*4+0x02000000,0x80); +reg_write( DDR_REG_BASE + 0x5089b*4+0x02000000,0xd2e); +reg_write( DDR_REG_BASE + 0x5089c*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x5089d*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x5089e*4+0x02000000,0xe42); +reg_write( DDR_REG_BASE + 0x5089f*4+0x02000000,0xffcf); +reg_write( DDR_REG_BASE + 0x508a0*4+0x02000000,0xb09); +reg_write( DDR_REG_BASE + 0x508a1*4+0x02000000,0x307e); +reg_write( DDR_REG_BASE + 0x508a2*4+0x02000000,0x720c); +reg_write( DDR_REG_BASE + 0x508a3*4+0x02000000,0xf005); +reg_write( DDR_REG_BASE + 0x508a4*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x508a5*4+0x02000000,0x3); +reg_write( DDR_REG_BASE + 0x508a6*4+0x02000000,0xd40); +reg_write( DDR_REG_BASE + 0x508a7*4+0x02000000,0x852); +reg_write( DDR_REG_BASE + 0x508a8*4+0x02000000,0x80); +reg_write( DDR_REG_BASE + 0x508a9*4+0x02000000,0xd12); +reg_write( DDR_REG_BASE + 0x508aa*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x508ab*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x508ac*4+0x02000000,0xd823); +reg_write( DDR_REG_BASE + 0x508ad*4+0x02000000,0xb89f); +reg_write( DDR_REG_BASE + 0x508ae*4+0x02000000,0x8820); +reg_write( DDR_REG_BASE + 0x508af*4+0x02000000,0x1026); +reg_write( DDR_REG_BASE + 0x508b0*4+0x02000000,0x80); +reg_write( DDR_REG_BASE + 0x508b1*4+0x02000000,0x70cd); +reg_write( DDR_REG_BASE + 0x508b2*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x508b3*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x508b4*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x508b5*4+0x02000000,0xf010); +reg_write( DDR_REG_BASE + 0x508b6*4+0x02000000,0x2544); +reg_write( DDR_REG_BASE + 0x508b7*4+0x02000000,0x17c1); +reg_write( DDR_REG_BASE + 0x508b8*4+0x02000000,0xe905); +reg_write( DDR_REG_BASE + 0x508b9*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE + 0x508ba*4+0x02000000,0x9ff); +reg_write( DDR_REG_BASE + 0x508bb*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE + 0x508bc*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x508bd*4+0x02000000,0xc101); +reg_write( DDR_REG_BASE + 0x508be*4+0x02000000,0x782b); +reg_write( DDR_REG_BASE + 0x508bf*4+0x02000000,0xf205); +reg_write( DDR_REG_BASE + 0x508c0*4+0x02000000,0xd56); +reg_write( DDR_REG_BASE + 0x508c1*4+0x02000000,0x220); +reg_write( DDR_REG_BASE + 0x508c2*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x508c3*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE + 0x508c4*4+0x02000000,0xde5); +reg_write( DDR_REG_BASE + 0x508c5*4+0x02000000,0x90b4); +reg_write( DDR_REG_BASE + 0x508c6*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x508c7*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE + 0x508c8*4+0x02000000,0x4100); +reg_write( DDR_REG_BASE + 0x508c9*4+0x02000000,0x2644); +reg_write( DDR_REG_BASE + 0x508ca*4+0x02000000,0x17c0); +reg_write( DDR_REG_BASE + 0x508cb*4+0x02000000,0xe806); +reg_write( DDR_REG_BASE + 0x508cc*4+0x02000000,0xb861); +reg_write( DDR_REG_BASE + 0x508cd*4+0x02000000,0x801); +reg_write( DDR_REG_BASE + 0x508ce*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x508cf*4+0x02000000,0x793b); +reg_write( DDR_REG_BASE + 0x508d0*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x508d1*4+0x02000000,0x790b); +reg_write( DDR_REG_BASE + 0x508d2*4+0x02000000,0xf204); +reg_write( DDR_REG_BASE + 0x508d3*4+0x02000000,0xdae); +reg_write( DDR_REG_BASE + 0x508d4*4+0x02000000,0x220); +reg_write( DDR_REG_BASE + 0x508d5*4+0x02000000,0x782f); +reg_write( DDR_REG_BASE + 0x508d6*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE + 0x508d7*4+0x02000000,0xee5); +reg_write( DDR_REG_BASE + 0x508d8*4+0x02000000,0x90b4); +reg_write( DDR_REG_BASE + 0x508d9*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x508da*4+0x02000000,0xb09); +reg_write( DDR_REG_BASE + 0x508db*4+0x02000000,0x307e); +reg_write( DDR_REG_BASE + 0x508dc*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE + 0x508dd*4+0x02000000,0xf004); +reg_write( DDR_REG_BASE + 0x508de*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE + 0x508df*4+0x02000000,0xa0f); +reg_write( DDR_REG_BASE + 0x508e0*4+0x02000000,0xfde); +reg_write( DDR_REG_BASE + 0x508e1*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x508e2*4+0x02000000,0xc9e); +reg_write( DDR_REG_BASE + 0x508e3*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x508e4*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x508e5*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x508e6*4+0x02000000,0xf010); +reg_write( DDR_REG_BASE + 0x508e7*4+0x02000000,0x4100); +reg_write( DDR_REG_BASE + 0x508e8*4+0x02000000,0x2544); +reg_write( DDR_REG_BASE + 0x508e9*4+0x02000000,0x17c0); +reg_write( DDR_REG_BASE + 0x508ea*4+0x02000000,0xe805); +reg_write( DDR_REG_BASE + 0x508eb*4+0x02000000,0xb861); +reg_write( DDR_REG_BASE + 0x508ec*4+0x02000000,0x8ff); +reg_write( DDR_REG_BASE + 0x508ed*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE + 0x508ee*4+0x02000000,0x793b); +reg_write( DDR_REG_BASE + 0x508ef*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x508f0*4+0x02000000,0x790b); +reg_write( DDR_REG_BASE + 0x508f1*4+0x02000000,0xf205); +reg_write( DDR_REG_BASE + 0x508f2*4+0x02000000,0xcf2); +reg_write( DDR_REG_BASE + 0x508f3*4+0x02000000,0x220); +reg_write( DDR_REG_BASE + 0x508f4*4+0x02000000,0x782f); +reg_write( DDR_REG_BASE + 0x508f5*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE + 0x508f6*4+0x02000000,0xde3); +reg_write( DDR_REG_BASE + 0x508f7*4+0x02000000,0x90b4); +reg_write( DDR_REG_BASE + 0x508f8*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x508f9*4+0x02000000,0xb0b); +reg_write( DDR_REG_BASE + 0x508fa*4+0x02000000,0x307e); +reg_write( DDR_REG_BASE + 0x508fb*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x508fc*4+0x02000000,0xf004); +reg_write( DDR_REG_BASE + 0x508fd*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x508fe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x508ff*4+0x02000000,0x2710); +reg_write( DDR_REG_BASE + 0x50900*4+0x02000000,0xf9e); +reg_write( DDR_REG_BASE + 0x50901*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x50902*4+0x02000000,0xc5e); +reg_write( DDR_REG_BASE + 0x50903*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x50904*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x50905*4+0x02000000,0xf11); +reg_write( DDR_REG_BASE + 0x50906*4+0x02000000,0x131e); +reg_write( DDR_REG_BASE + 0x50907*4+0x02000000,0x9a6); +reg_write( DDR_REG_BASE + 0x50908*4+0x02000000,0xff8f); +reg_write( DDR_REG_BASE + 0x50909*4+0x02000000,0xbca); +reg_write( DDR_REG_BASE + 0x5090a*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x5090b*4+0x02000000,0xd80d); +reg_write( DDR_REG_BASE + 0x5090c*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x5090d*4+0x02000000,0xf01c); +reg_write( DDR_REG_BASE + 0x5090e*4+0x02000000,0x4100); +reg_write( DDR_REG_BASE + 0x5090f*4+0x02000000,0x2544); +reg_write( DDR_REG_BASE + 0x50910*4+0x02000000,0x17c0); +reg_write( DDR_REG_BASE + 0x50911*4+0x02000000,0xe806); +reg_write( DDR_REG_BASE + 0x50912*4+0x02000000,0xb861); +reg_write( DDR_REG_BASE + 0x50913*4+0x02000000,0x801); +reg_write( DDR_REG_BASE + 0x50914*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x50915*4+0x02000000,0x793b); +reg_write( DDR_REG_BASE + 0x50916*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x50917*4+0x02000000,0x790b); +reg_write( DDR_REG_BASE + 0x50918*4+0x02000000,0xf20f); +reg_write( DDR_REG_BASE + 0x50919*4+0x02000000,0xd8a); +reg_write( DDR_REG_BASE + 0x5091a*4+0x02000000,0x220); +reg_write( DDR_REG_BASE + 0x5091b*4+0x02000000,0x782f); +reg_write( DDR_REG_BASE + 0x5091c*4+0x02000000,0xb09); +reg_write( DDR_REG_BASE + 0x5091d*4+0x02000000,0x307e); +reg_write( DDR_REG_BASE + 0x5091e*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x5091f*4+0x02000000,0xf004); +reg_write( DDR_REG_BASE + 0x50920*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE + 0x50921*4+0x02000000,0xa0f); +reg_write( DDR_REG_BASE + 0x50922*4+0x02000000,0xf5a); +reg_write( DDR_REG_BASE + 0x50923*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x50924*4+0x02000000,0xc1a); +reg_write( DDR_REG_BASE + 0x50925*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x50926*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x50927*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE + 0x50928*4+0x02000000,0xdcd); +reg_write( DDR_REG_BASE + 0x50929*4+0x02000000,0x90b4); +reg_write( DDR_REG_BASE + 0x5092a*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x5092b*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x5092c*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x5092d*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x5092e*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5092f*4+0x02000000,0x7c4); +reg_write( DDR_REG_BASE + 0x50930*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x50931*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE + 0x50932*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x50933*4+0x02000000,0x600); +reg_write( DDR_REG_BASE + 0x50934*4+0x02000000,0xd8a); +reg_write( DDR_REG_BASE + 0x50935*4+0x02000000,0x220); +reg_write( DDR_REG_BASE + 0x50936*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x50937*4+0x02000000,0xc0a2); +reg_write( DDR_REG_BASE + 0x50938*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x50939*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x5093a*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x5093b*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x5093c*4+0x02000000,0xca04); +reg_write( DDR_REG_BASE + 0x5093d*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x5093e*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE + 0x5093f*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50940*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE + 0x50941*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE + 0x50942*4+0x02000000,0x8b20); +reg_write( DDR_REG_BASE + 0x50943*4+0x02000000,0xa0d); +reg_write( DDR_REG_BASE + 0x50944*4+0x02000000,0x44); +reg_write( DDR_REG_BASE + 0x50945*4+0x02000000,0x8b21); +reg_write( DDR_REG_BASE + 0x50946*4+0x02000000,0x919); +reg_write( DDR_REG_BASE + 0x50947*4+0x02000000,0x85); +reg_write( DDR_REG_BASE + 0x50948*4+0x02000000,0x221a); +reg_write( DDR_REG_BASE + 0x50949*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x5094a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5094b*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE + 0x5094c*4+0x02000000,0x2105); +reg_write( DDR_REG_BASE + 0x5094d*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x5094e*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x5094f*4+0x02000000,0x1f64); +reg_write( DDR_REG_BASE + 0x50950*4+0x02000000,0x1900); +reg_write( DDR_REG_BASE + 0x50951*4+0x02000000,0x5); +reg_write( DDR_REG_BASE + 0x50952*4+0x02000000,0x7144); +reg_write( DDR_REG_BASE + 0x50953*4+0x02000000,0xae1); +reg_write( DDR_REG_BASE + 0x50954*4+0x02000000,0x8004); +reg_write( DDR_REG_BASE + 0x50955*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x50956*4+0x02000000,0xc0f1); +reg_write( DDR_REG_BASE + 0x50957*4+0x02000000,0xc1a5); +reg_write( DDR_REG_BASE + 0x50958*4+0x02000000,0x4300); +reg_write( DDR_REG_BASE + 0x50959*4+0x02000000,0xc080); +reg_write( DDR_REG_BASE + 0x5095a*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x5095b*4+0x02000000,0xdde); +reg_write( DDR_REG_BASE + 0x5095c*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x5095d*4+0x02000000,0xda14); +reg_write( DDR_REG_BASE + 0x5095e*4+0x02000000,0x231a); +reg_write( DDR_REG_BASE + 0x5095f*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x50960*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x50961*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50962*4+0x02000000,0xc180); +reg_write( DDR_REG_BASE + 0x50963*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE + 0x50964*4+0x02000000,0xbea); +reg_write( DDR_REG_BASE + 0x50965*4+0x02000000,0x160); +reg_write( DDR_REG_BASE + 0x50966*4+0x02000000,0xb885); +reg_write( DDR_REG_BASE + 0x50967*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x50968*4+0x02000000,0xf6); +reg_write( DDR_REG_BASE + 0x50969*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5096a*4+0x02000000,0xd8e); +reg_write( DDR_REG_BASE + 0x5096b*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x5096c*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x5096d*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x5096e*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x5096f*4+0x02000000,0x89e); +reg_write( DDR_REG_BASE + 0x50970*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x50971*4+0x02000000,0xc280); +reg_write( DDR_REG_BASE + 0x50972*4+0x02000000,0xc0a5); +reg_write( DDR_REG_BASE + 0x50973*4+0x02000000,0xc0d1); +reg_write( DDR_REG_BASE + 0x50974*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x50975*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x50976*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x50977*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x50978*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x50979*4+0x02000000,0x2482); +reg_write( DDR_REG_BASE + 0x5097a*4+0x02000000,0x3d02); +reg_write( DDR_REG_BASE + 0x5097b*4+0x02000000,0x4748); +reg_write( DDR_REG_BASE + 0x5097c*4+0x02000000,0x4338); +reg_write( DDR_REG_BASE + 0x5097d*4+0x02000000,0x4308); +reg_write( DDR_REG_BASE + 0x5097e*4+0x02000000,0xc080); +reg_write( DDR_REG_BASE + 0x5097f*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x50980*4+0x02000000,0xd92); +reg_write( DDR_REG_BASE + 0x50981*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x50982*4+0x02000000,0xdab4); +reg_write( DDR_REG_BASE + 0x50983*4+0x02000000,0xb25); +reg_write( DDR_REG_BASE + 0x50984*4+0x02000000,0x10b1); +reg_write( DDR_REG_BASE + 0x50985*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x50986*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x50987*4+0x02000000,0xf2); +reg_write( DDR_REG_BASE + 0x50988*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x50989*4+0x02000000,0xd52); +reg_write( DDR_REG_BASE + 0x5098a*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x5098b*4+0x02000000,0x4260); +reg_write( DDR_REG_BASE + 0x5098c*4+0x02000000,0xc080); +reg_write( DDR_REG_BASE + 0x5098d*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x5098e*4+0x02000000,0xbe6); +reg_write( DDR_REG_BASE + 0x5098f*4+0x02000000,0x160); +reg_write( DDR_REG_BASE + 0x50990*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE + 0x50991*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x50992*4+0x02000000,0xd909); +reg_write( DDR_REG_BASE + 0x50993*4+0x02000000,0xf036); +reg_write( DDR_REG_BASE + 0x50994*4+0x02000000,0x231a); +reg_write( DDR_REG_BASE + 0x50995*4+0x02000000,0x3f9b); +reg_write( DDR_REG_BASE + 0x50996*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x50997*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50998*4+0x02000000,0xb1b); +reg_write( DDR_REG_BASE + 0x50999*4+0x02000000,0x1030); +reg_write( DDR_REG_BASE + 0x5099a*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x5099b*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x5099c*4+0x02000000,0xf4); +reg_write( DDR_REG_BASE + 0x5099d*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5099e*4+0x02000000,0xd26); +reg_write( DDR_REG_BASE + 0x5099f*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x509a0*4+0x02000000,0x4260); +reg_write( DDR_REG_BASE + 0x509a1*4+0x02000000,0xdd09); +reg_write( DDR_REG_BASE + 0x509a2*4+0x02000000,0xdec0); +reg_write( DDR_REG_BASE + 0x509a3*4+0x02000000,0xd8d0); +reg_write( DDR_REG_BASE + 0x509a4*4+0x02000000,0xf00a); +reg_write( DDR_REG_BASE + 0x509a5*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x509a6*4+0x02000000,0xf3); +reg_write( DDR_REG_BASE + 0x509a7*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x509a8*4+0x02000000,0xd12); +reg_write( DDR_REG_BASE + 0x509a9*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x509aa*4+0x02000000,0x4260); +reg_write( DDR_REG_BASE + 0x509ab*4+0x02000000,0x72ad); +reg_write( DDR_REG_BASE + 0x509ac*4+0x02000000,0xde8c); +reg_write( DDR_REG_BASE + 0x509ad*4+0x02000000,0xd880); +reg_write( DDR_REG_BASE + 0x509ae*4+0x02000000,0x60f8); +reg_write( DDR_REG_BASE + 0x509af*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x509b0*4+0x02000000,0x6c0); +reg_write( DDR_REG_BASE + 0x509b1*4+0x02000000,0xc180); +reg_write( DDR_REG_BASE + 0x509b2*4+0x02000000,0xb4e); +reg_write( DDR_REG_BASE + 0x509b3*4+0x02000000,0x160); +reg_write( DDR_REG_BASE + 0x509b4*4+0x02000000,0x724c); +reg_write( DDR_REG_BASE + 0x509b5*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x509b6*4+0x02000000,0x722c); +reg_write( DDR_REG_BASE + 0x509b7*4+0x02000000,0x80e); +reg_write( DDR_REG_BASE + 0x509b8*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x509b9*4+0x02000000,0xc280); +reg_write( DDR_REG_BASE + 0x509ba*4+0x02000000,0xc080); +reg_write( DDR_REG_BASE + 0x509bb*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x509bc*4+0x02000000,0xd1a); +reg_write( DDR_REG_BASE + 0x509bd*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x509be*4+0x02000000,0xdab4); +reg_write( DDR_REG_BASE + 0x509bf*4+0x02000000,0x66fe); +reg_write( DDR_REG_BASE + 0x509c0*4+0x02000000,0x2605); +reg_write( DDR_REG_BASE + 0x509c1*4+0x02000000,0x16c0); +reg_write( DDR_REG_BASE + 0x509c2*4+0x02000000,0xc180); +reg_write( DDR_REG_BASE + 0x509c3*4+0x02000000,0xb2e); +reg_write( DDR_REG_BASE + 0x509c4*4+0x02000000,0x160); +reg_write( DDR_REG_BASE + 0x509c5*4+0x02000000,0x42a1); +reg_write( DDR_REG_BASE + 0x509c6*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x509c7*4+0x02000000,0x41a1); +reg_write( DDR_REG_BASE + 0x509c8*4+0x02000000,0xfea); +reg_write( DDR_REG_BASE + 0x509c9*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE + 0x509ca*4+0x02000000,0xc280); +reg_write( DDR_REG_BASE + 0x509cb*4+0x02000000,0x2480); +reg_write( DDR_REG_BASE + 0x509cc*4+0x02000000,0x3d02); +reg_write( DDR_REG_BASE + 0x509cd*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x509ce*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x509cf*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x509d0*4+0x02000000,0xc3e2); +reg_write( DDR_REG_BASE + 0x509d1*4+0x02000000,0x2482); +reg_write( DDR_REG_BASE + 0x509d2*4+0x02000000,0x3d02); +reg_write( DDR_REG_BASE + 0x509d3*4+0x02000000,0x4528); +reg_write( DDR_REG_BASE + 0x509d4*4+0x02000000,0x4300); +reg_write( DDR_REG_BASE + 0x509d5*4+0x02000000,0xc080); +reg_write( DDR_REG_BASE + 0x509d6*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x509d7*4+0x02000000,0xce6); +reg_write( DDR_REG_BASE + 0x509d8*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x509d9*4+0x02000000,0xdab4); +reg_write( DDR_REG_BASE + 0x509da*4+0x02000000,0x2354); +reg_write( DDR_REG_BASE + 0x509db*4+0x02000000,0xd00); +reg_write( DDR_REG_BASE + 0x509dc*4+0x02000000,0xc180); +reg_write( DDR_REG_BASE + 0x509dd*4+0x02000000,0xafa); +reg_write( DDR_REG_BASE + 0x509de*4+0x02000000,0x160); +reg_write( DDR_REG_BASE + 0x509df*4+0x02000000,0xda09); +reg_write( DDR_REG_BASE + 0x509e0*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x509e1*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x509e2*4+0x02000000,0xf5); +reg_write( DDR_REG_BASE + 0x509e3*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x509e4*4+0x02000000,0xc9a); +reg_write( DDR_REG_BASE + 0x509e5*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x509e6*4+0x02000000,0x42a1); +reg_write( DDR_REG_BASE + 0x509e7*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x509e8*4+0x02000000,0xd909); +reg_write( DDR_REG_BASE + 0x509e9*4+0x02000000,0xfaa); +reg_write( DDR_REG_BASE + 0x509ea*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE + 0x509eb*4+0x02000000,0xc280); +reg_write( DDR_REG_BASE + 0x509ec*4+0x02000000,0xc7c2); +reg_write( DDR_REG_BASE + 0x509ed*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x509ee*4+0x02000000,0xc0f1); +reg_write( DDR_REG_BASE + 0x509ef*4+0x02000000,0x2482); +reg_write( DDR_REG_BASE + 0x509f0*4+0x02000000,0x3d02); +reg_write( DDR_REG_BASE + 0x509f1*4+0x02000000,0xc080); +reg_write( DDR_REG_BASE + 0x509f2*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x509f3*4+0x02000000,0xcae); +reg_write( DDR_REG_BASE + 0x509f4*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x509f5*4+0x02000000,0xdab4); +reg_write( DDR_REG_BASE + 0x509f6*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x509f7*4+0x02000000,0xf7); +reg_write( DDR_REG_BASE + 0x509f8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x509f9*4+0x02000000,0xc72); +reg_write( DDR_REG_BASE + 0x509fa*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x509fb*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x509fc*4+0x02000000,0xd840); +reg_write( DDR_REG_BASE + 0x509fd*4+0x02000000,0xc180); +reg_write( DDR_REG_BASE + 0x509fe*4+0x02000000,0xab6); +reg_write( DDR_REG_BASE + 0x509ff*4+0x02000000,0x160); +reg_write( DDR_REG_BASE + 0x50a00*4+0x02000000,0xda09); +reg_write( DDR_REG_BASE + 0x50a01*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x50a02*4+0x02000000,0xd909); +reg_write( DDR_REG_BASE + 0x50a03*4+0x02000000,0xf76); +reg_write( DDR_REG_BASE + 0x50a04*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE + 0x50a05*4+0x02000000,0xc280); +reg_write( DDR_REG_BASE + 0x50a06*4+0x02000000,0x2480); +reg_write( DDR_REG_BASE + 0x50a07*4+0x02000000,0x3d02); +reg_write( DDR_REG_BASE + 0x50a08*4+0x02000000,0xc0d1); +reg_write( DDR_REG_BASE + 0x50a09*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x50a0a*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x50a0b*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x50a0c*4+0x02000000,0x42eb); +reg_write( DDR_REG_BASE + 0x50a0d*4+0x02000000,0xc0e6); +reg_write( DDR_REG_BASE + 0x50a0e*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE + 0x50a0f*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x50a10*4+0x02000000,0xe4); +reg_write( DDR_REG_BASE + 0x50a11*4+0x02000000,0x42c3); +reg_write( DDR_REG_BASE + 0x50a12*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50a13*4+0x02000000,0x7b2); +reg_write( DDR_REG_BASE + 0x50a14*4+0x02000000,0x833); +reg_write( DDR_REG_BASE + 0x50a15*4+0x02000000,0xb0); +reg_write( DDR_REG_BASE + 0x50a16*4+0x02000000,0x718d); +reg_write( DDR_REG_BASE + 0x50a17*4+0x02000000,0x7114); +reg_write( DDR_REG_BASE + 0x50a18*4+0x02000000,0xd823); +reg_write( DDR_REG_BASE + 0x50a19*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE + 0x50a1a*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x50a1b*4+0x02000000,0x30); +reg_write( DDR_REG_BASE + 0x50a1c*4+0x02000000,0xb89f); +reg_write( DDR_REG_BASE + 0x50a1d*4+0x02000000,0xf427); +reg_write( DDR_REG_BASE + 0x50a1e*4+0x02000000,0x8a25); +reg_write( DDR_REG_BASE + 0x50a1f*4+0x02000000,0xaa23); +reg_write( DDR_REG_BASE + 0x50a20*4+0x02000000,0x8aa4); +reg_write( DDR_REG_BASE + 0x50a21*4+0x02000000,0x7c34); +reg_write( DDR_REG_BASE + 0x50a22*4+0x02000000,0xaaa2); +reg_write( DDR_REG_BASE + 0x50a23*4+0x02000000,0x96c0); +reg_write( DDR_REG_BASE + 0x50a24*4+0x02000000,0x88e0); +reg_write( DDR_REG_BASE + 0x50a25*4+0x02000000,0x78bb); +reg_write( DDR_REG_BASE + 0x50a26*4+0x02000000,0xb3e0); +reg_write( DDR_REG_BASE + 0x50a27*4+0x02000000,0xaa00); +reg_write( DDR_REG_BASE + 0x50a28*4+0x02000000,0xe4d); +reg_write( DDR_REG_BASE + 0x50a29*4+0x02000000,0x1171); +reg_write( DDR_REG_BASE + 0x50a2a*4+0x02000000,0xaa81); +reg_write( DDR_REG_BASE + 0x50a2b*4+0x02000000,0xb3e1); +reg_write( DDR_REG_BASE + 0x50a2c*4+0x02000000,0xf024); +reg_write( DDR_REG_BASE + 0x50a2d*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x50a2e*4+0x02000000,0xb300); +reg_write( DDR_REG_BASE + 0x50a2f*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x50a30*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE + 0x50a31*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50a32*4+0x02000000,0x49); +reg_write( DDR_REG_BASE + 0x50a33*4+0x02000000,0xb321); +reg_write( DDR_REG_BASE + 0x50a34*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE + 0x50a35*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x50a36*4+0x02000000,0xf6); +reg_write( DDR_REG_BASE + 0x50a37*4+0x02000000,0xb300); +reg_write( DDR_REG_BASE + 0x50a38*4+0x02000000,0xb304); +reg_write( DDR_REG_BASE + 0x50a39*4+0x02000000,0x1b06); +reg_write( DDR_REG_BASE + 0x50a3a*4+0x02000000,0x3c5); +reg_write( DDR_REG_BASE + 0x50a3b*4+0x02000000,0x8a27); +reg_write( DDR_REG_BASE + 0x50a3c*4+0x02000000,0xaa23); +reg_write( DDR_REG_BASE + 0x50a3d*4+0x02000000,0x8a06); +reg_write( DDR_REG_BASE + 0x50a3e*4+0x02000000,0xf818); +reg_write( DDR_REG_BASE + 0x50a3f*4+0x02000000,0x1bfe); +reg_write( DDR_REG_BASE + 0x50a40*4+0x02000000,0x83c5); +reg_write( DDR_REG_BASE + 0x50a41*4+0x02000000,0x4759); +reg_write( DDR_REG_BASE + 0x50a42*4+0x02000000,0xc4c6); +reg_write( DDR_REG_BASE + 0x50a43*4+0x02000000,0x88a0); +reg_write( DDR_REG_BASE + 0x50a44*4+0x02000000,0xb3a0); +reg_write( DDR_REG_BASE + 0x50a45*4+0x02000000,0x8a27); +reg_write( DDR_REG_BASE + 0x50a46*4+0x02000000,0xaa23); +reg_write( DDR_REG_BASE + 0x50a47*4+0x02000000,0x8a04); +reg_write( DDR_REG_BASE + 0x50a48*4+0x02000000,0xf813); +reg_write( DDR_REG_BASE + 0x50a49*4+0x02000000,0x9600); +reg_write( DDR_REG_BASE + 0x50a4a*4+0x02000000,0x827); +reg_write( DDR_REG_BASE + 0x50a4b*4+0x02000000,0x151); +reg_write( DDR_REG_BASE + 0x50a4c*4+0x02000000,0xb3a1); +reg_write( DDR_REG_BASE + 0x50a4d*4+0x02000000,0xf016); +reg_write( DDR_REG_BASE + 0x50a4e*4+0x02000000,0x1b02); +reg_write( DDR_REG_BASE + 0x50a4f*4+0x02000000,0x5); +reg_write( DDR_REG_BASE + 0x50a50*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x50a51*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x50a52*4+0x02000000,0xfe); +reg_write( DDR_REG_BASE + 0x50a53*4+0x02000000,0x1800); +reg_write( DDR_REG_BASE + 0x50a54*4+0x02000000,0x3c5); +reg_write( DDR_REG_BASE + 0x50a55*4+0x02000000,0x18f8); +reg_write( DDR_REG_BASE + 0x50a56*4+0x02000000,0x83c5); +reg_write( DDR_REG_BASE + 0x50a57*4+0x02000000,0x18f6); +reg_write( DDR_REG_BASE + 0x50a58*4+0x02000000,0x8005); +reg_write( DDR_REG_BASE + 0x50a59*4+0x02000000,0x18fe); +reg_write( DDR_REG_BASE + 0x50a5a*4+0x02000000,0x8005); +reg_write( DDR_REG_BASE + 0x50a5b*4+0x02000000,0x4759); +reg_write( DDR_REG_BASE + 0x50a5c*4+0x02000000,0xc4c6); +reg_write( DDR_REG_BASE + 0x50a5d*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x50a5e*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x50a5f*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50a60*4+0x02000000,0x49); +reg_write( DDR_REG_BASE + 0x50a61*4+0x02000000,0xb301); +reg_write( DDR_REG_BASE + 0x50a62*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x50a63*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x50a64*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x50a65*4+0x02000000,0xf6); +reg_write( DDR_REG_BASE + 0x50a66*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE + 0x50a67*4+0x02000000,0xb024); +reg_write( DDR_REG_BASE + 0x50a68*4+0x02000000,0x18fe); +reg_write( DDR_REG_BASE + 0x50a69*4+0x02000000,0x8044); +reg_write( DDR_REG_BASE + 0x50a6a*4+0x02000000,0xb023); +reg_write( DDR_REG_BASE + 0x50a6b*4+0x02000000,0x4759); +reg_write( DDR_REG_BASE + 0x50a6c*4+0x02000000,0xc4c6); +reg_write( DDR_REG_BASE + 0x50a6d*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x50a6e*4+0x02000000,0x7c34); +reg_write( DDR_REG_BASE + 0x50a6f*4+0x02000000,0xaa02); +reg_write( DDR_REG_BASE + 0x50a70*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x50a71*4+0x02000000,0xaa00); +reg_write( DDR_REG_BASE + 0x50a72*4+0x02000000,0xaa81); +reg_write( DDR_REG_BASE + 0x50a73*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x50a74*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x50a75*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x50a76*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x50a77*4+0x02000000,0x47cb); +reg_write( DDR_REG_BASE + 0x50a78*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x50a79*4+0x02000000,0x1e0); +reg_write( DDR_REG_BASE + 0x50a7a*4+0x02000000,0x9720); +reg_write( DDR_REG_BASE + 0x50a7b*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x50a7c*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x50a7d*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50a7e*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x50a7f*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x50a80*4+0x02000000,0x205f); +reg_write( DDR_REG_BASE + 0x50a81*4+0x02000000,0x100); +reg_write( DDR_REG_BASE + 0x50a82*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE + 0x50a83*4+0x02000000,0x7c2); +reg_write( DDR_REG_BASE + 0x50a84*4+0x02000000,0x4020); +reg_write( DDR_REG_BASE + 0x50a85*4+0x02000000,0xea06); +reg_write( DDR_REG_BASE + 0x50a86*4+0x02000000,0xba61); +reg_write( DDR_REG_BASE + 0x50a87*4+0x02000000,0xa01); +reg_write( DDR_REG_BASE + 0x50a88*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x50a89*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x50a8a*4+0x02000000,0xb8c3); +reg_write( DDR_REG_BASE + 0x50a8b*4+0x02000000,0x80f); +reg_write( DDR_REG_BASE + 0x50a8c*4+0x02000000,0x70); +reg_write( DDR_REG_BASE + 0x50a8d*4+0x02000000,0xc1a1); +reg_write( DDR_REG_BASE + 0x50a8e*4+0x02000000,0x807); +reg_write( DDR_REG_BASE + 0x50a8f*4+0x02000000,0x190); +reg_write( DDR_REG_BASE + 0x50a90*4+0x02000000,0x71ad); +reg_write( DDR_REG_BASE + 0x50a91*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x50a92*4+0x02000000,0x996); +reg_write( DDR_REG_BASE + 0x50a93*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x50a94*4+0x02000000,0xd940); +reg_write( DDR_REG_BASE + 0x50a95*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE + 0x50a96*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE + 0x50a97*4+0x02000000,0xe112); +reg_write( DDR_REG_BASE + 0x50a98*4+0x02000000,0x1ede); +reg_write( DDR_REG_BASE + 0x50a99*4+0x02000000,0x1055); +reg_write( DDR_REG_BASE + 0x50a9a*4+0x02000000,0x1ea6); +reg_write( DDR_REG_BASE + 0x50a9b*4+0x02000000,0x9055); +reg_write( DDR_REG_BASE + 0x50a9c*4+0x02000000,0x17b6); +reg_write( DDR_REG_BASE + 0x50a9d*4+0x02000000,0x9100); +reg_write( DDR_REG_BASE + 0x50a9e*4+0x02000000,0x716f); +reg_write( DDR_REG_BASE + 0x50a9f*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x50aa0*4+0x02000000,0xed29); +reg_write( DDR_REG_BASE + 0x50aa1*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE + 0x50aa2*4+0x02000000,0x84f); +reg_write( DDR_REG_BASE + 0x50aa3*4+0x02000000,0x3bf); +reg_write( DDR_REG_BASE + 0x50aa4*4+0x02000000,0xd91c); +reg_write( DDR_REG_BASE + 0x50aa5*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE + 0x50aa6*4+0x02000000,0x2084); +reg_write( DDR_REG_BASE + 0x50aa7*4+0x02000000,0xc07); +reg_write( DDR_REG_BASE + 0x50aa8*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x50aa9*4+0x02000000,0xb88f); +reg_write( DDR_REG_BASE + 0x50aaa*4+0x02000000,0xb600); +reg_write( DDR_REG_BASE + 0x50aab*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x50aac*4+0x02000000,0x962); +reg_write( DDR_REG_BASE + 0x50aad*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x50aae*4+0x02000000,0x1ef6); +reg_write( DDR_REG_BASE + 0x50aaf*4+0x02000000,0x9205); +reg_write( DDR_REG_BASE + 0x50ab0*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x50ab1*4+0x02000000,0xf); +reg_write( DDR_REG_BASE + 0x50ab2*4+0x02000000,0x4240); +reg_write( DDR_REG_BASE + 0x50ab3*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x50ab4*4+0x02000000,0x952); +reg_write( DDR_REG_BASE + 0x50ab5*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x50ab6*4+0x02000000,0x1ef6); +reg_write( DDR_REG_BASE + 0x50ab7*4+0x02000000,0x9245); +reg_write( DDR_REG_BASE + 0x50ab8*4+0x02000000,0x17be); +reg_write( DDR_REG_BASE + 0x50ab9*4+0x02000000,0x9100); +reg_write( DDR_REG_BASE + 0x50aba*4+0x02000000,0x1ef0); +reg_write( DDR_REG_BASE + 0x50abb*4+0x02000000,0x9045); +reg_write( DDR_REG_BASE + 0x50abc*4+0x02000000,0x1ef6); +reg_write( DDR_REG_BASE + 0x50abd*4+0x02000000,0x9205); +reg_write( DDR_REG_BASE + 0x50abe*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x50abf*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x50ac0*4+0x02000000,0x2004); +reg_write( DDR_REG_BASE + 0x50ac1*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x50ac2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50ac3*4+0x02000000,0x3e00); +reg_write( DDR_REG_BASE + 0x50ac4*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE + 0x50ac5*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x50ac6*4+0x02000000,0xb88e); +reg_write( DDR_REG_BASE + 0x50ac7*4+0x02000000,0xb600); +reg_write( DDR_REG_BASE + 0x50ac8*4+0x02000000,0xf005); +reg_write( DDR_REG_BASE + 0x50ac9*4+0x02000000,0x1ef6); +reg_write( DDR_REG_BASE + 0x50aca*4+0x02000000,0x9205); +reg_write( DDR_REG_BASE + 0x50acb*4+0x02000000,0x1ef0); +reg_write( DDR_REG_BASE + 0x50acc*4+0x02000000,0x9045); +reg_write( DDR_REG_BASE + 0x50acd*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x50ace*4+0x02000000,0x76c4); +reg_write( DDR_REG_BASE + 0x50acf*4+0x02000000,0x9013); +reg_write( DDR_REG_BASE + 0x50ad0*4+0x02000000,0xe050); +reg_write( DDR_REG_BASE + 0x50ad1*4+0x02000000,0x7487); +reg_write( DDR_REG_BASE + 0x50ad2*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x50ad3*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x50ad4*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x50ad5*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x50ad6*4+0x02000000,0xc2e2); +reg_write( DDR_REG_BASE + 0x50ad7*4+0x02000000,0xc1a4); +reg_write( DDR_REG_BASE + 0x50ad8*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x50ad9*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x50ada*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x50adb*4+0x02000000,0xdb08); +reg_write( DDR_REG_BASE + 0x50adc*4+0x02000000,0x4528); +reg_write( DDR_REG_BASE + 0x50add*4+0x02000000,0xc143); +reg_write( DDR_REG_BASE + 0x50ade*4+0x02000000,0xc142); +reg_write( DDR_REG_BASE + 0x50adf*4+0x02000000,0xc141); +reg_write( DDR_REG_BASE + 0x50ae0*4+0x02000000,0xf2a); +reg_write( DDR_REG_BASE + 0x50ae1*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE + 0x50ae2*4+0x02000000,0xc140); +reg_write( DDR_REG_BASE + 0x50ae3*4+0x02000000,0xd90c); +reg_write( DDR_REG_BASE + 0x50ae4*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x50ae5*4+0x02000000,0xb990); +reg_write( DDR_REG_BASE + 0x50ae6*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE + 0x50ae7*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x50ae8*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x50ae9*4+0x02000000,0x1c08); +reg_write( DDR_REG_BASE + 0x50aea*4+0x02000000,0x3101); +reg_write( DDR_REG_BASE + 0x50aeb*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x50aec*4+0x02000000,0xf12); +reg_write( DDR_REG_BASE + 0x50aed*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE + 0x50aee*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x50aef*4+0x02000000,0xc0a4); +reg_write( DDR_REG_BASE + 0x50af0*4+0x02000000,0xc6c2); +reg_write( DDR_REG_BASE + 0x50af1*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x50af2*4+0x02000000,0xc2e4); +reg_write( DDR_REG_BASE + 0x50af3*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x50af4*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x50af5*4+0x02000000,0x256f); +reg_write( DDR_REG_BASE + 0x50af6*4+0x02000000,0x1343); +reg_write( DDR_REG_BASE + 0x50af7*4+0x02000000,0x4320); +reg_write( DDR_REG_BASE + 0x50af8*4+0x02000000,0x9520); +reg_write( DDR_REG_BASE + 0x50af9*4+0x02000000,0x218c); +reg_write( DDR_REG_BASE + 0x50afa*4+0x02000000,0x864a); +reg_write( DDR_REG_BASE + 0x50afb*4+0x02000000,0x7a); +reg_write( DDR_REG_BASE + 0x50afc*4+0x02000000,0x2d); +reg_write( DDR_REG_BASE + 0x50afd*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x50afe*4+0x02000000,0xa0e); +reg_write( DDR_REG_BASE + 0x50aff*4+0x02000000,0xffcf); +reg_write( DDR_REG_BASE + 0x50b00*4+0x02000000,0x260a); +reg_write( DDR_REG_BASE + 0x50b01*4+0x02000000,0x3000); +reg_write( DDR_REG_BASE + 0x50b02*4+0x02000000,0x15fe); +reg_write( DDR_REG_BASE + 0x50b03*4+0x02000000,0x9080); +reg_write( DDR_REG_BASE + 0x50b04*4+0x02000000,0x706f); +reg_write( DDR_REG_BASE + 0x50b05*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x50b06*4+0x02000000,0xf8d); +reg_write( DDR_REG_BASE + 0x50b07*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x50b08*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50b09*4+0x02000000,0xf02b); +reg_write( DDR_REG_BASE + 0x50b0a*4+0x02000000,0x231a); +reg_write( DDR_REG_BASE + 0x50b0b*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x50b0c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50b0d*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x50b0e*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x50b0f*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x50b10*4+0x02000000,0x341); +reg_write( DDR_REG_BASE + 0x50b11*4+0x02000000,0x4063); +reg_write( DDR_REG_BASE + 0x50b12*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x50b13*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x50b14*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x50b15*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x50b16*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x50b17*4+0x02000000,0xf8e); +reg_write( DDR_REG_BASE + 0x50b18*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x50b19*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50b1a*4+0x02000000,0xa5e); +reg_write( DDR_REG_BASE + 0x50b1b*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x50b1c*4+0x02000000,0x9600); +reg_write( DDR_REG_BASE + 0x50b1d*4+0x02000000,0xe01c); +reg_write( DDR_REG_BASE + 0x50b1e*4+0x02000000,0x7a0e); +reg_write( DDR_REG_BASE + 0x50b1f*4+0x02000000,0x785c); +reg_write( DDR_REG_BASE + 0x50b20*4+0x02000000,0x781c); +reg_write( DDR_REG_BASE + 0x50b21*4+0x02000000,0x781c); +reg_write( DDR_REG_BASE + 0x50b22*4+0x02000000,0x781c); +reg_write( DDR_REG_BASE + 0x50b23*4+0x02000000,0x4100); +reg_write( DDR_REG_BASE + 0x50b24*4+0x02000000,0xd81b); +reg_write( DDR_REG_BASE + 0x50b25*4+0x02000000,0xb861); +reg_write( DDR_REG_BASE + 0x50b26*4+0x02000000,0x8ff); +reg_write( DDR_REG_BASE + 0x50b27*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE + 0x50b28*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE + 0x50b29*4+0x02000000,0x7167); +reg_write( DDR_REG_BASE + 0x50b2a*4+0x02000000,0x6238); +reg_write( DDR_REG_BASE + 0x50b2b*4+0x02000000,0xb8c4); +reg_write( DDR_REG_BASE + 0x50b2c*4+0x02000000,0x4831); +reg_write( DDR_REG_BASE + 0x50b2d*4+0x02000000,0x2a44); +reg_write( DDR_REG_BASE + 0x50b2e*4+0x02000000,0x800); +reg_write( DDR_REG_BASE + 0x50b2f*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x50b30*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x50b31*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x50b32*4+0x02000000,0xb600); +reg_write( DDR_REG_BASE + 0x50b33*4+0x02000000,0xbb1); +reg_write( DDR_REG_BASE + 0x50b34*4+0x02000000,0xb0b4); +reg_write( DDR_REG_BASE + 0x50b35*4+0x02000000,0x2655); +reg_write( DDR_REG_BASE + 0x50b36*4+0x02000000,0x3800); +reg_write( DDR_REG_BASE + 0x50b37*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x50b38*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x50b39*4+0x02000000,0xc6c4); +reg_write( DDR_REG_BASE + 0x50b3a*4+0x02000000,0xc2e2); +reg_write( DDR_REG_BASE + 0x50b3b*4+0x02000000,0x45cb); +reg_write( DDR_REG_BASE + 0x50b3c*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x50b3d*4+0x02000000,0x6); +reg_write( DDR_REG_BASE + 0x50b3e*4+0x02000000,0xd820); +reg_write( DDR_REG_BASE + 0x50b3f*4+0x02000000,0xfe6); +reg_write( DDR_REG_BASE + 0x50b40*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x50b41*4+0x02000000,0x1d00); +reg_write( DDR_REG_BASE + 0x50b42*4+0x02000000,0x1045); +reg_write( DDR_REG_BASE + 0x50b43*4+0x02000000,0x1d00); +reg_write( DDR_REG_BASE + 0x50b44*4+0x02000000,0x1005); +reg_write( DDR_REG_BASE + 0x50b45*4+0x02000000,0xc6c2); +reg_write( DDR_REG_BASE + 0x50b46*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x50b47*4+0x02000000,0x45cb); +reg_write( DDR_REG_BASE + 0x50b48*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x50b49*4+0x02000000,0x1c6); +reg_write( DDR_REG_BASE + 0x50b4a*4+0x02000000,0x95c0); +reg_write( DDR_REG_BASE + 0x50b4b*4+0x02000000,0xbecb); +reg_write( DDR_REG_BASE + 0x50b4c*4+0x02000000,0x264f); +reg_write( DDR_REG_BASE + 0x50b4d*4+0x02000000,0x12cf); +reg_write( DDR_REG_BASE + 0x50b4e*4+0x02000000,0x2605); +reg_write( DDR_REG_BASE + 0x50b4f*4+0x02000000,0x1f80); +reg_write( DDR_REG_BASE + 0x50b50*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50b51*4+0x02000000,0xc00); +reg_write( DDR_REG_BASE + 0x50b52*4+0x02000000,0xb5e0); +reg_write( DDR_REG_BASE + 0x50b53*4+0x02000000,0xb500); +reg_write( DDR_REG_BASE + 0x50b54*4+0x02000000,0xfba); +reg_write( DDR_REG_BASE + 0x50b55*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x50b56*4+0x02000000,0xd80a); +reg_write( DDR_REG_BASE + 0x50b57*4+0x02000000,0xb5e0); +reg_write( DDR_REG_BASE + 0x50b58*4+0x02000000,0x9501); +reg_write( DDR_REG_BASE + 0x50b59*4+0x02000000,0xb5c0); +reg_write( DDR_REG_BASE + 0x50b5a*4+0x02000000,0xb8c9); +reg_write( DDR_REG_BASE + 0x50b5b*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x50b5c*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x50b5d*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x50b5e*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x50b5f*4+0x02000000,0xc1a6); +reg_write( DDR_REG_BASE + 0x50b60*4+0x02000000,0x4378); +reg_write( DDR_REG_BASE + 0x50b61*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x50b62*4+0x02000000,0x7103); +reg_write( DDR_REG_BASE + 0x50b63*4+0x02000000,0x9018); +reg_write( DDR_REG_BASE + 0x50b64*4+0x02000000,0x1dc); +reg_write( DDR_REG_BASE + 0x50b65*4+0x02000000,0x1201); +reg_write( DDR_REG_BASE + 0x50b66*4+0x02000000,0x308d); +reg_write( DDR_REG_BASE + 0x50b67*4+0x02000000,0xc70b); +reg_write( DDR_REG_BASE + 0x50b68*4+0x02000000,0x264a); +reg_write( DDR_REG_BASE + 0x50b69*4+0x02000000,0x3000); +reg_write( DDR_REG_BASE + 0x50b6a*4+0x02000000,0x706c); +reg_write( DDR_REG_BASE + 0x50b6b*4+0x02000000,0x47db); +reg_write( DDR_REG_BASE + 0x50b6c*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x50b6d*4+0x02000000,0x200); +reg_write( DDR_REG_BASE + 0x50b6e*4+0x02000000,0xf00f); +reg_write( DDR_REG_BASE + 0x50b6f*4+0x02000000,0x2305); +reg_write( DDR_REG_BASE + 0x50b70*4+0x02000000,0x17cc); +reg_write( DDR_REG_BASE + 0x50b71*4+0x02000000,0x9480); +reg_write( DDR_REG_BASE + 0x50b72*4+0x02000000,0xc680); +reg_write( DDR_REG_BASE + 0x50b73*4+0x02000000,0x667e); +reg_write( DDR_REG_BASE + 0x50b74*4+0x02000000,0xae80); +reg_write( DDR_REG_BASE + 0x50b75*4+0x02000000,0x2740); +reg_write( DDR_REG_BASE + 0x50b76*4+0x02000000,0x380c); +reg_write( DDR_REG_BASE + 0x50b77*4+0x02000000,0x2405); +reg_write( DDR_REG_BASE + 0x50b78*4+0x02000000,0x12cc); +reg_write( DDR_REG_BASE + 0x50b79*4+0x02000000,0x9480); +reg_write( DDR_REG_BASE + 0x50b7a*4+0x02000000,0x7164); +reg_write( DDR_REG_BASE + 0x50b7b*4+0x02000000,0xe40c); +reg_write( DDR_REG_BASE + 0x50b7c*4+0x02000000,0xae8c); +reg_write( DDR_REG_BASE + 0x50b7d*4+0x02000000,0xbe7); +reg_write( DDR_REG_BASE + 0x50b7e*4+0x02000000,0x82b4); +reg_write( DDR_REG_BASE + 0x50b7f*4+0x02000000,0x232f); +reg_write( DDR_REG_BASE + 0x50b80*4+0x02000000,0x10c0); +reg_write( DDR_REG_BASE + 0x50b81*4+0x02000000,0xe58c); +reg_write( DDR_REG_BASE + 0x50b82*4+0x02000000,0x256); +reg_write( DDR_REG_BASE + 0x50b83*4+0x02000000,0x2d); +reg_write( DDR_REG_BASE + 0x50b84*4+0x02000000,0x238a); +reg_write( DDR_REG_BASE + 0x50b85*4+0x02000000,0x205); +reg_write( DDR_REG_BASE + 0x50b86*4+0x02000000,0xb7f); +reg_write( DDR_REG_BASE + 0x50b87*4+0x02000000,0x36e); +reg_write( DDR_REG_BASE + 0x50b88*4+0x02000000,0x738d); +reg_write( DDR_REG_BASE + 0x50b89*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x50b8a*4+0x02000000,0x72ad); +reg_write( DDR_REG_BASE + 0x50b8b*4+0x02000000,0x1b00); +reg_write( DDR_REG_BASE + 0x50b8c*4+0x02000000,0x3302); +reg_write( DDR_REG_BASE + 0x50b8d*4+0x02000000,0x1f02); +reg_write( DDR_REG_BASE + 0x50b8e*4+0x02000000,0x1782); +reg_write( DDR_REG_BASE + 0x50b8f*4+0x02000000,0x1f01); +reg_write( DDR_REG_BASE + 0x50b90*4+0x02000000,0x1782); +reg_write( DDR_REG_BASE + 0x50b91*4+0x02000000,0x1f00); +reg_write( DDR_REG_BASE + 0x50b92*4+0x02000000,0x1782); +reg_write( DDR_REG_BASE + 0x50b93*4+0x02000000,0xa962); +reg_write( DDR_REG_BASE + 0x50b94*4+0x02000000,0xa981); +reg_write( DDR_REG_BASE + 0x50b95*4+0x02000000,0xa9a0); +reg_write( DDR_REG_BASE + 0x50b96*4+0x02000000,0xaaa4); +reg_write( DDR_REG_BASE + 0x50b97*4+0x02000000,0x1a03); +reg_write( DDR_REG_BASE + 0x50b98*4+0x02000000,0x43); +reg_write( DDR_REG_BASE + 0x50b99*4+0x02000000,0x1a02); +reg_write( DDR_REG_BASE + 0x50b9a*4+0x02000000,0x782); +reg_write( DDR_REG_BASE + 0x50b9b*4+0x02000000,0xc120); +reg_write( DDR_REG_BASE + 0x50b9c*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50b9d*4+0x02000000,0xa9a0); +reg_write( DDR_REG_BASE + 0x50b9e*4+0x02000000,0x1401); +reg_write( DDR_REG_BASE + 0x50b9f*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50ba0*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50ba1*4+0x02000000,0xa9a0); +reg_write( DDR_REG_BASE + 0x50ba2*4+0x02000000,0x1402); +reg_write( DDR_REG_BASE + 0x50ba3*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50ba4*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50ba5*4+0x02000000,0xa9a0); +reg_write( DDR_REG_BASE + 0x50ba6*4+0x02000000,0x1403); +reg_write( DDR_REG_BASE + 0x50ba7*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50ba8*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50ba9*4+0x02000000,0xa9a0); +reg_write( DDR_REG_BASE + 0x50baa*4+0x02000000,0xc121); +reg_write( DDR_REG_BASE + 0x50bab*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50bac*4+0x02000000,0xa980); +reg_write( DDR_REG_BASE + 0x50bad*4+0x02000000,0x1405); +reg_write( DDR_REG_BASE + 0x50bae*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50baf*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50bb0*4+0x02000000,0xa980); +reg_write( DDR_REG_BASE + 0x50bb1*4+0x02000000,0x1406); +reg_write( DDR_REG_BASE + 0x50bb2*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50bb3*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50bb4*4+0x02000000,0xa980); +reg_write( DDR_REG_BASE + 0x50bb5*4+0x02000000,0x1407); +reg_write( DDR_REG_BASE + 0x50bb6*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50bb7*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50bb8*4+0x02000000,0xa980); +reg_write( DDR_REG_BASE + 0x50bb9*4+0x02000000,0xc122); +reg_write( DDR_REG_BASE + 0x50bba*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50bbb*4+0x02000000,0xa960); +reg_write( DDR_REG_BASE + 0x50bbc*4+0x02000000,0x1409); +reg_write( DDR_REG_BASE + 0x50bbd*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50bbe*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50bbf*4+0x02000000,0xa960); +reg_write( DDR_REG_BASE + 0x50bc0*4+0x02000000,0x180b); +reg_write( DDR_REG_BASE + 0x50bc1*4+0x02000000,0x782); +reg_write( DDR_REG_BASE + 0x50bc2*4+0x02000000,0x180a); +reg_write( DDR_REG_BASE + 0x50bc3*4+0x02000000,0x43); +reg_write( DDR_REG_BASE + 0x50bc4*4+0x02000000,0xf0e9); +reg_write( DDR_REG_BASE + 0x50bc5*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE + 0x50bc6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50bc7*4+0x02000000,0x1400); +reg_write( DDR_REG_BASE + 0x50bc8*4+0x02000000,0x2311); +reg_write( DDR_REG_BASE + 0x50bc9*4+0x02000000,0x8340); +reg_write( DDR_REG_BASE + 0x50bca*4+0x02000000,0xf2e3); +reg_write( DDR_REG_BASE + 0x50bcb*4+0x02000000,0x718d); +reg_write( DDR_REG_BASE + 0x50bcc*4+0x02000000,0xaf85); +reg_write( DDR_REG_BASE + 0x50bcd*4+0x02000000,0xaf84); +reg_write( DDR_REG_BASE + 0x50bce*4+0x02000000,0xaf83); +reg_write( DDR_REG_BASE + 0x50bcf*4+0x02000000,0x1f02); +reg_write( DDR_REG_BASE + 0x50bd0*4+0x02000000,0x1782); +reg_write( DDR_REG_BASE + 0x50bd1*4+0x02000000,0x1f01); +reg_write( DDR_REG_BASE + 0x50bd2*4+0x02000000,0x1782); +reg_write( DDR_REG_BASE + 0x50bd3*4+0x02000000,0x1f00); +reg_write( DDR_REG_BASE + 0x50bd4*4+0x02000000,0x1782); +reg_write( DDR_REG_BASE + 0x50bd5*4+0x02000000,0x76ef); +reg_write( DDR_REG_BASE + 0x50bd6*4+0x02000000,0xe58c); +reg_write( DDR_REG_BASE + 0x50bd7*4+0x02000000,0xde08); +reg_write( DDR_REG_BASE + 0x50bd8*4+0x02000000,0xdf07); +reg_write( DDR_REG_BASE + 0x50bd9*4+0x02000000,0x73ad); +reg_write( DDR_REG_BASE + 0x50bda*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE + 0x50bdb*4+0x02000000,0x746d); +reg_write( DDR_REG_BASE + 0x50bdc*4+0x02000000,0x1b00); +reg_write( DDR_REG_BASE + 0x50bdd*4+0x02000000,0x37c2); +reg_write( DDR_REG_BASE + 0x50bde*4+0x02000000,0xf467); +reg_write( DDR_REG_BASE + 0x50bdf*4+0x02000000,0xa9c5); +reg_write( DDR_REG_BASE + 0x50be0*4+0x02000000,0xa9e4); +reg_write( DDR_REG_BASE + 0x50be1*4+0x02000000,0x1903); +reg_write( DDR_REG_BASE + 0x50be2*4+0x02000000,0x7c2); +reg_write( DDR_REG_BASE + 0x50be3*4+0x02000000,0xa9a2); +reg_write( DDR_REG_BASE + 0x50be4*4+0x02000000,0xa961); +reg_write( DDR_REG_BASE + 0x50be5*4+0x02000000,0xa980); +reg_write( DDR_REG_BASE + 0x50be6*4+0x02000000,0x752c); +reg_write( DDR_REG_BASE + 0x50be7*4+0x02000000,0xaa28); +reg_write( DDR_REG_BASE + 0x50be8*4+0x02000000,0x1a07); +reg_write( DDR_REG_BASE + 0x50be9*4+0x02000000,0x2c2); +reg_write( DDR_REG_BASE + 0x50bea*4+0x02000000,0xaaa6); +reg_write( DDR_REG_BASE + 0x50beb*4+0x02000000,0xaa63); +reg_write( DDR_REG_BASE + 0x50bec*4+0x02000000,0xaa82); +reg_write( DDR_REG_BASE + 0x50bed*4+0x02000000,0x1a01); +reg_write( DDR_REG_BASE + 0x50bee*4+0x02000000,0x782); +reg_write( DDR_REG_BASE + 0x50bef*4+0x02000000,0xc120); +reg_write( DDR_REG_BASE + 0x50bf0*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50bf1*4+0x02000000,0xa9a0); +reg_write( DDR_REG_BASE + 0x50bf2*4+0x02000000,0x1401); +reg_write( DDR_REG_BASE + 0x50bf3*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50bf4*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50bf5*4+0x02000000,0xa980); +reg_write( DDR_REG_BASE + 0x50bf6*4+0x02000000,0x1402); +reg_write( DDR_REG_BASE + 0x50bf7*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50bf8*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50bf9*4+0x02000000,0xa9a0); +reg_write( DDR_REG_BASE + 0x50bfa*4+0x02000000,0x1403); +reg_write( DDR_REG_BASE + 0x50bfb*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50bfc*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50bfd*4+0x02000000,0xa960); +reg_write( DDR_REG_BASE + 0x50bfe*4+0x02000000,0xc121); +reg_write( DDR_REG_BASE + 0x50bff*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c00*4+0x02000000,0xa960); +reg_write( DDR_REG_BASE + 0x50c01*4+0x02000000,0x1405); +reg_write( DDR_REG_BASE + 0x50c02*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50c03*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c04*4+0x02000000,0xa980); +reg_write( DDR_REG_BASE + 0x50c05*4+0x02000000,0x1406); +reg_write( DDR_REG_BASE + 0x50c06*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50c07*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c08*4+0x02000000,0xa960); +reg_write( DDR_REG_BASE + 0x50c09*4+0x02000000,0x1407); +reg_write( DDR_REG_BASE + 0x50c0a*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50c0b*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c0c*4+0x02000000,0xa960); +reg_write( DDR_REG_BASE + 0x50c0d*4+0x02000000,0xc122); +reg_write( DDR_REG_BASE + 0x50c0e*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c0f*4+0x02000000,0xa980); +reg_write( DDR_REG_BASE + 0x50c10*4+0x02000000,0x1409); +reg_write( DDR_REG_BASE + 0x50c11*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50c12*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c13*4+0x02000000,0xa980); +reg_write( DDR_REG_BASE + 0x50c14*4+0x02000000,0x180b); +reg_write( DDR_REG_BASE + 0x50c15*4+0x02000000,0x243); +reg_write( DDR_REG_BASE + 0x50c16*4+0x02000000,0x180a); +reg_write( DDR_REG_BASE + 0x50c17*4+0x02000000,0x2c2); +reg_write( DDR_REG_BASE + 0x50c18*4+0x02000000,0xc123); +reg_write( DDR_REG_BASE + 0x50c19*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c1a*4+0x02000000,0xa9e0); +reg_write( DDR_REG_BASE + 0x50c1b*4+0x02000000,0x140d); +reg_write( DDR_REG_BASE + 0x50c1c*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50c1d*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c1e*4+0x02000000,0xa9c0); +reg_write( DDR_REG_BASE + 0x50c1f*4+0x02000000,0x140e); +reg_write( DDR_REG_BASE + 0x50c20*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50c21*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c22*4+0x02000000,0xa9c0); +reg_write( DDR_REG_BASE + 0x50c23*4+0x02000000,0x140f); +reg_write( DDR_REG_BASE + 0x50c24*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50c25*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c26*4+0x02000000,0xa9c0); +reg_write( DDR_REG_BASE + 0x50c27*4+0x02000000,0xc124); +reg_write( DDR_REG_BASE + 0x50c28*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c29*4+0x02000000,0xa9e0); +reg_write( DDR_REG_BASE + 0x50c2a*4+0x02000000,0x1411); +reg_write( DDR_REG_BASE + 0x50c2b*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50c2c*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c2d*4+0x02000000,0x1900); +reg_write( DDR_REG_BASE + 0x50c2e*4+0x02000000,0x7c2); +reg_write( DDR_REG_BASE + 0x50c2f*4+0x02000000,0x1412); +reg_write( DDR_REG_BASE + 0x50c30*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50c31*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c32*4+0x02000000,0x1900); +reg_write( DDR_REG_BASE + 0x50c33*4+0x02000000,0x7c2); +reg_write( DDR_REG_BASE + 0x50c34*4+0x02000000,0x1413); +reg_write( DDR_REG_BASE + 0x50c35*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50c36*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c37*4+0x02000000,0xa9e0); +reg_write( DDR_REG_BASE + 0x50c38*4+0x02000000,0xc125); +reg_write( DDR_REG_BASE + 0x50c39*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c3a*4+0x02000000,0x1900); +reg_write( DDR_REG_BASE + 0x50c3b*4+0x02000000,0x7c2); +reg_write( DDR_REG_BASE + 0x50c3c*4+0x02000000,0x1415); +reg_write( DDR_REG_BASE + 0x50c3d*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50c3e*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c3f*4+0x02000000,0xa9e0); +reg_write( DDR_REG_BASE + 0x50c40*4+0x02000000,0x752c); +reg_write( DDR_REG_BASE + 0x50c41*4+0x02000000,0x1817); +reg_write( DDR_REG_BASE + 0x50c42*4+0x02000000,0x283); +reg_write( DDR_REG_BASE + 0x50c43*4+0x02000000,0xa836); +reg_write( DDR_REG_BASE + 0x50c44*4+0x02000000,0xf069); +reg_write( DDR_REG_BASE + 0x50c45*4+0x02000000,0x234a); +reg_write( DDR_REG_BASE + 0x50c46*4+0x02000000,0x3240); +reg_write( DDR_REG_BASE + 0x50c47*4+0x02000000,0x1905); +reg_write( DDR_REG_BASE + 0x50c48*4+0x02000000,0x6c2); +reg_write( DDR_REG_BASE + 0x50c49*4+0x02000000,0xa9c4); +reg_write( DDR_REG_BASE + 0x50c4a*4+0x02000000,0xa9e3); +reg_write( DDR_REG_BASE + 0x50c4b*4+0x02000000,0x1902); +reg_write( DDR_REG_BASE + 0x50c4c*4+0x02000000,0x2c2); +reg_write( DDR_REG_BASE + 0x50c4d*4+0x02000000,0xa9a1); +reg_write( DDR_REG_BASE + 0x50c4e*4+0x02000000,0xa960); +reg_write( DDR_REG_BASE + 0x50c4f*4+0x02000000,0x752c); +reg_write( DDR_REG_BASE + 0x50c50*4+0x02000000,0xaa29); +reg_write( DDR_REG_BASE + 0x50c51*4+0x02000000,0x1a08); +reg_write( DDR_REG_BASE + 0x50c52*4+0x02000000,0x2c2); +reg_write( DDR_REG_BASE + 0x50c53*4+0x02000000,0xaaa7); +reg_write( DDR_REG_BASE + 0x50c54*4+0x02000000,0xaa64); +reg_write( DDR_REG_BASE + 0x50c55*4+0x02000000,0xaa83); +reg_write( DDR_REG_BASE + 0x50c56*4+0x02000000,0x1a02); +reg_write( DDR_REG_BASE + 0x50c57*4+0x02000000,0x782); +reg_write( DDR_REG_BASE + 0x50c58*4+0x02000000,0xc120); +reg_write( DDR_REG_BASE + 0x50c59*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c5a*4+0x02000000,0xa960); +reg_write( DDR_REG_BASE + 0x50c5b*4+0x02000000,0x1401); +reg_write( DDR_REG_BASE + 0x50c5c*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50c5d*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c5e*4+0x02000000,0xa960); +reg_write( DDR_REG_BASE + 0x50c5f*4+0x02000000,0x1402); +reg_write( DDR_REG_BASE + 0x50c60*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50c61*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c62*4+0x02000000,0xa960); +reg_write( DDR_REG_BASE + 0x50c63*4+0x02000000,0x1403); +reg_write( DDR_REG_BASE + 0x50c64*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50c65*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c66*4+0x02000000,0xa960); +reg_write( DDR_REG_BASE + 0x50c67*4+0x02000000,0xc121); +reg_write( DDR_REG_BASE + 0x50c68*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c69*4+0x02000000,0xa9a0); +reg_write( DDR_REG_BASE + 0x50c6a*4+0x02000000,0x1405); +reg_write( DDR_REG_BASE + 0x50c6b*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50c6c*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c6d*4+0x02000000,0xa9a0); +reg_write( DDR_REG_BASE + 0x50c6e*4+0x02000000,0x1406); +reg_write( DDR_REG_BASE + 0x50c6f*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50c70*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c71*4+0x02000000,0xa9a0); +reg_write( DDR_REG_BASE + 0x50c72*4+0x02000000,0x1407); +reg_write( DDR_REG_BASE + 0x50c73*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50c74*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c75*4+0x02000000,0xa9a0); +reg_write( DDR_REG_BASE + 0x50c76*4+0x02000000,0xc122); +reg_write( DDR_REG_BASE + 0x50c77*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c78*4+0x02000000,0x1900); +reg_write( DDR_REG_BASE + 0x50c79*4+0x02000000,0x2c2); +reg_write( DDR_REG_BASE + 0x50c7a*4+0x02000000,0x1409); +reg_write( DDR_REG_BASE + 0x50c7b*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50c7c*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c7d*4+0x02000000,0x1900); +reg_write( DDR_REG_BASE + 0x50c7e*4+0x02000000,0x2c2); +reg_write( DDR_REG_BASE + 0x50c7f*4+0x02000000,0x180b); +reg_write( DDR_REG_BASE + 0x50c80*4+0x02000000,0x782); +reg_write( DDR_REG_BASE + 0x50c81*4+0x02000000,0xa88a); +reg_write( DDR_REG_BASE + 0x50c82*4+0x02000000,0xc123); +reg_write( DDR_REG_BASE + 0x50c83*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c84*4+0x02000000,0xa9e0); +reg_write( DDR_REG_BASE + 0x50c85*4+0x02000000,0x140d); +reg_write( DDR_REG_BASE + 0x50c86*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50c87*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c88*4+0x02000000,0xa9e0); +reg_write( DDR_REG_BASE + 0x50c89*4+0x02000000,0x140e); +reg_write( DDR_REG_BASE + 0x50c8a*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50c8b*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c8c*4+0x02000000,0xa9e0); +reg_write( DDR_REG_BASE + 0x50c8d*4+0x02000000,0x140f); +reg_write( DDR_REG_BASE + 0x50c8e*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50c8f*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c90*4+0x02000000,0xa9e0); +reg_write( DDR_REG_BASE + 0x50c91*4+0x02000000,0xc124); +reg_write( DDR_REG_BASE + 0x50c92*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c93*4+0x02000000,0xa9c0); +reg_write( DDR_REG_BASE + 0x50c94*4+0x02000000,0x1411); +reg_write( DDR_REG_BASE + 0x50c95*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50c96*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c97*4+0x02000000,0xa9c0); +reg_write( DDR_REG_BASE + 0x50c98*4+0x02000000,0x1412); +reg_write( DDR_REG_BASE + 0x50c99*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50c9a*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c9b*4+0x02000000,0xa9c0); +reg_write( DDR_REG_BASE + 0x50c9c*4+0x02000000,0x1413); +reg_write( DDR_REG_BASE + 0x50c9d*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50c9e*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50c9f*4+0x02000000,0xa9c0); +reg_write( DDR_REG_BASE + 0x50ca0*4+0x02000000,0xc125); +reg_write( DDR_REG_BASE + 0x50ca1*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50ca2*4+0x02000000,0x1900); +reg_write( DDR_REG_BASE + 0x50ca3*4+0x02000000,0x6c2); +reg_write( DDR_REG_BASE + 0x50ca4*4+0x02000000,0x1415); +reg_write( DDR_REG_BASE + 0x50ca5*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x50ca6*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x50ca7*4+0x02000000,0x1900); +reg_write( DDR_REG_BASE + 0x50ca8*4+0x02000000,0x6c2); +reg_write( DDR_REG_BASE + 0x50ca9*4+0x02000000,0x752c); +reg_write( DDR_REG_BASE + 0x50caa*4+0x02000000,0xa837); +reg_write( DDR_REG_BASE + 0x50cab*4+0x02000000,0x1816); +reg_write( DDR_REG_BASE + 0x50cac*4+0x02000000,0x7c2); +reg_write( DDR_REG_BASE + 0x50cad*4+0x02000000,0xc0a6); +reg_write( DDR_REG_BASE + 0x50cae*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x50caf*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x50cb0*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x50cb1*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x50cb2*4+0x02000000,0x7014); +reg_write( DDR_REG_BASE + 0x50cb3*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x50cb4*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x50cb5*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50cb6*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x50cb7*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x50cb8*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x50cb9*4+0x02000000,0x168); +reg_write( DDR_REG_BASE + 0x50cba*4+0x02000000,0x21c2); +reg_write( DDR_REG_BASE + 0x50cbb*4+0x02000000,0x222); +reg_write( DDR_REG_BASE + 0x50cbc*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x50cbd*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x50cbe*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x50cbf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50cc0*4+0x02000000,0x7905); +reg_write( DDR_REG_BASE + 0x50cc1*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x50cc2*4+0x02000000,0x9100); +reg_write( DDR_REG_BASE + 0x50cc3*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x50cc4*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x50cc5*4+0x02000000,0x7100); +reg_write( DDR_REG_BASE + 0x50cc6*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50cc7*4+0x02000000,0x6e); +reg_write( DDR_REG_BASE + 0x50cc8*4+0x02000000,0x7014); +reg_write( DDR_REG_BASE + 0x50cc9*4+0x02000000,0x7de0); +reg_write( DDR_REG_BASE + 0x50cca*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x50ccb*4+0x02000000,0x7100); +reg_write( DDR_REG_BASE + 0x50ccc*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x50ccd*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x50cce*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x50ccf*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x50cd0*4+0x02000000,0xc2e4); +reg_write( DDR_REG_BASE + 0x50cd1*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE + 0x50cd2*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50cd3*4+0x02000000,0x7b1); +reg_write( DDR_REG_BASE + 0x50cd4*4+0x02000000,0x8b00); +reg_write( DDR_REG_BASE + 0x50cd5*4+0x02000000,0xe62); +reg_write( DDR_REG_BASE + 0x50cd6*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE + 0x50cd7*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x50cd8*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x50cd9*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE + 0x50cda*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50cdb*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x50cdc*4+0x02000000,0x8b82); +reg_write( DDR_REG_BASE + 0x50cdd*4+0x02000000,0x8b41); +reg_write( DDR_REG_BASE + 0x50cde*4+0x02000000,0x211a); +reg_write( DDR_REG_BASE + 0x50cdf*4+0x02000000,0xf8d); +reg_write( DDR_REG_BASE + 0x50ce0*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x50ce1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50ce2*4+0x02000000,0x776c); +reg_write( DDR_REG_BASE + 0x50ce3*4+0x02000000,0xf01c); +reg_write( DDR_REG_BASE + 0x50ce4*4+0x02000000,0x221a); +reg_write( DDR_REG_BASE + 0x50ce5*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x50ce6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50ce7*4+0x02000000,0x800); +reg_write( DDR_REG_BASE + 0x50ce8*4+0x02000000,0x2104); +reg_write( DDR_REG_BASE + 0x50ce9*4+0x02000000,0xf8e); +reg_write( DDR_REG_BASE + 0x50cea*4+0x02000000,0x37fe); +reg_write( DDR_REG_BASE + 0x50ceb*4+0x02000000,0xf000); +reg_write( DDR_REG_BASE + 0x50cec*4+0x02000000,0x2055); +reg_write( DDR_REG_BASE + 0x50ced*4+0x02000000,0x801); +reg_write( DDR_REG_BASE + 0x50cee*4+0x02000000,0x79a5); +reg_write( DDR_REG_BASE + 0x50cef*4+0x02000000,0x79c5); +reg_write( DDR_REG_BASE + 0x50cf0*4+0x02000000,0x6ac1); +reg_write( DDR_REG_BASE + 0x50cf1*4+0x02000000,0x229a); +reg_write( DDR_REG_BASE + 0x50cf2*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x50cf3*4+0x02000000,0x2284); +reg_write( DDR_REG_BASE + 0x50cf4*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x50cf5*4+0x02000000,0x7a25); +reg_write( DDR_REG_BASE + 0x50cf6*4+0x02000000,0x795b); +reg_write( DDR_REG_BASE + 0x50cf7*4+0x02000000,0xb991); +reg_write( DDR_REG_BASE + 0x50cf8*4+0x02000000,0xb99c); +reg_write( DDR_REG_BASE + 0x50cf9*4+0x02000000,0xb99f); +reg_write( DDR_REG_BASE + 0x50cfa*4+0x02000000,0x9120); +reg_write( DDR_REG_BASE + 0x50cfb*4+0x02000000,0x42c1); +reg_write( DDR_REG_BASE + 0x50cfc*4+0x02000000,0x2108); +reg_write( DDR_REG_BASE + 0x50cfd*4+0x02000000,0xc3); +reg_write( DDR_REG_BASE + 0x50cfe*4+0x02000000,0xccd); +reg_write( DDR_REG_BASE + 0x50cff*4+0x02000000,0x9085); +reg_write( DDR_REG_BASE + 0x50d00*4+0x02000000,0x4060); +reg_write( DDR_REG_BASE + 0x50d01*4+0x02000000,0xd908); +reg_write( DDR_REG_BASE + 0x50d02*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE + 0x50d03*4+0x02000000,0x901); +reg_write( DDR_REG_BASE + 0x50d04*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x50d05*4+0x02000000,0x781c); +reg_write( DDR_REG_BASE + 0x50d06*4+0x02000000,0x796f); +reg_write( DDR_REG_BASE + 0x50d07*4+0x02000000,0x2179); +reg_write( DDR_REG_BASE + 0x50d08*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x50d09*4+0x02000000,0x6038); +reg_write( DDR_REG_BASE + 0x50d0a*4+0x02000000,0x7204); +reg_write( DDR_REG_BASE + 0x50d0b*4+0x02000000,0xc6c4); +reg_write( DDR_REG_BASE + 0x50d0c*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x50d0d*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x50d0e*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50d0f*4+0x02000000,0x32); +reg_write( DDR_REG_BASE + 0x50d10*4+0x02000000,0x5); +reg_write( DDR_REG_BASE + 0x50d11*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50d12*4+0x02000000,0xb8c3); +reg_write( DDR_REG_BASE + 0x50d13*4+0x02000000,0x6829); +reg_write( DDR_REG_BASE + 0x50d14*4+0x02000000,0x92b); +reg_write( DDR_REG_BASE + 0x50d15*4+0x02000000,0x3b5); +reg_write( DDR_REG_BASE + 0x50d16*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE + 0x50d17*4+0x02000000,0x2025); +reg_write( DDR_REG_BASE + 0x50d18*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x50d19*4+0x02000000,0xf012); +reg_write( DDR_REG_BASE + 0x50d1a*4+0x02000000,0xf00f); +reg_write( DDR_REG_BASE + 0x50d1b*4+0x02000000,0xf00f); +reg_write( DDR_REG_BASE + 0x50d1c*4+0x02000000,0xf00b); +reg_write( DDR_REG_BASE + 0x50d1d*4+0x02000000,0xf00f); +reg_write( DDR_REG_BASE + 0x50d1e*4+0x02000000,0xf00f); +reg_write( DDR_REG_BASE + 0x50d1f*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE + 0x50d20*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE + 0x50d21*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE + 0x50d22*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE + 0x50d23*4+0x02000000,0xf007); +reg_write( DDR_REG_BASE + 0x50d24*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE + 0x50d25*4+0x02000000,0xf005); +reg_write( DDR_REG_BASE + 0x50d26*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE + 0x50d27*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x50d28*4+0x02000000,0x760c); +reg_write( DDR_REG_BASE + 0x50d29*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x50d2a*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x50d2b*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x50d2c*4+0x02000000,0xd807); +reg_write( DDR_REG_BASE + 0x50d2d*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x50d2e*4+0x02000000,0xd808); +reg_write( DDR_REG_BASE + 0x50d2f*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x50d30*4+0x02000000,0xd809); +reg_write( DDR_REG_BASE + 0x50d31*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x50d32*4+0x02000000,0xd80a); +reg_write( DDR_REG_BASE + 0x50d33*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x50d34*4+0x02000000,0xd80b); +reg_write( DDR_REG_BASE + 0x50d35*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x50d36*4+0x02000000,0xd80c); +reg_write( DDR_REG_BASE + 0x50d37*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x50d38*4+0x02000000,0xd80e); +reg_write( DDR_REG_BASE + 0x50d39*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x50d3a*4+0x02000000,0xd810); +reg_write( DDR_REG_BASE + 0x50d3b*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x50d3c*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x50d3d*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x50d3e*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50d3f*4+0x02000000,0x32); +reg_write( DDR_REG_BASE + 0x50d40*4+0x02000000,0x5); +reg_write( DDR_REG_BASE + 0x50d41*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50d42*4+0x02000000,0x2053); +reg_write( DDR_REG_BASE + 0x50d43*4+0x02000000,0xc1); +reg_write( DDR_REG_BASE + 0x50d44*4+0x02000000,0x6949); +reg_write( DDR_REG_BASE + 0x50d45*4+0x02000000,0xa3f); +reg_write( DDR_REG_BASE + 0x50d46*4+0x02000000,0x3b5); +reg_write( DDR_REG_BASE + 0x50d47*4+0x02000000,0x791d); +reg_write( DDR_REG_BASE + 0x50d48*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE + 0x50d49*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE + 0x50d4a*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE + 0x50d4b*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE + 0x50d4c*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE + 0x50d4d*4+0x02000000,0x720c); +reg_write( DDR_REG_BASE + 0x50d4e*4+0x02000000,0x2025); +reg_write( DDR_REG_BASE + 0x50d4f*4+0x02000000,0x80); +reg_write( DDR_REG_BASE + 0x50d50*4+0x02000000,0xf014); +reg_write( DDR_REG_BASE + 0x50d51*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE + 0x50d52*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE + 0x50d53*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE + 0x50d54*4+0x02000000,0xf00a); +reg_write( DDR_REG_BASE + 0x50d55*4+0x02000000,0xf00a); +reg_write( DDR_REG_BASE + 0x50d56*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE + 0x50d57*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE + 0x50d58*4+0x02000000,0xf008); +reg_write( DDR_REG_BASE + 0x50d59*4+0x02000000,0xf008); +reg_write( DDR_REG_BASE + 0x50d5a*4+0x02000000,0xf009); +reg_write( DDR_REG_BASE + 0x50d5b*4+0x02000000,0xf014); +reg_write( DDR_REG_BASE + 0x50d5c*4+0x02000000,0xf007); +reg_write( DDR_REG_BASE + 0x50d5d*4+0x02000000,0xf015); +reg_write( DDR_REG_BASE + 0x50d5e*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x50d5f*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x50d60*4+0x02000000,0xb9e0); +reg_write( DDR_REG_BASE + 0x50d61*4+0x02000000,0xd80a); +reg_write( DDR_REG_BASE + 0x50d62*4+0x02000000,0xf009); +reg_write( DDR_REG_BASE + 0x50d63*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x50d64*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x50d65*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x50d66*4+0x02000000,0x740c); +reg_write( DDR_REG_BASE + 0x50d67*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x50d68*4+0x02000000,0x760c); +reg_write( DDR_REG_BASE + 0x50d69*4+0x02000000,0xb9e0); +reg_write( DDR_REG_BASE + 0x50d6a*4+0x02000000,0xd809); +reg_write( DDR_REG_BASE + 0x50d6b*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x50d6c*4+0x02000000,0x20ca); +reg_write( DDR_REG_BASE + 0x50d6d*4+0x02000000,0x1e1); +reg_write( DDR_REG_BASE + 0x50d6e*4+0x02000000,0xb9e0); +reg_write( DDR_REG_BASE + 0x50d6f*4+0x02000000,0xd80c); +reg_write( DDR_REG_BASE + 0x50d70*4+0x02000000,0xf003); +reg_write( DDR_REG_BASE + 0x50d71*4+0x02000000,0xb9e0); +reg_write( DDR_REG_BASE + 0x50d72*4+0x02000000,0xd80e); +reg_write( DDR_REG_BASE + 0x50d73*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x50d74*4+0x02000000,0x20ca); +reg_write( DDR_REG_BASE + 0x50d75*4+0x02000000,0x261); +reg_write( DDR_REG_BASE + 0x50d76*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x50d77*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50d78*4+0x02000000,0x7b2); +reg_write( DDR_REG_BASE + 0x50d79*4+0x02000000,0x8881); +reg_write( DDR_REG_BASE + 0x50d7a*4+0x02000000,0x8860); +reg_write( DDR_REG_BASE + 0x50d7b*4+0x02000000,0xf022); +reg_write( DDR_REG_BASE + 0x50d7c*4+0x02000000,0x231a); +reg_write( DDR_REG_BASE + 0x50d7d*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x50d7e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50d7f*4+0x02000000,0x800); +reg_write( DDR_REG_BASE + 0x50d80*4+0x02000000,0x2004); +reg_write( DDR_REG_BASE + 0x50d81*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x50d82*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50d83*4+0x02000000,0x800); +reg_write( DDR_REG_BASE + 0x50d84*4+0x02000000,0x231a); +reg_write( DDR_REG_BASE + 0x50d85*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x50d86*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50d87*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x50d88*4+0x02000000,0x2004); +reg_write( DDR_REG_BASE + 0x50d89*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x50d8a*4+0x02000000,0x6ffd); +reg_write( DDR_REG_BASE + 0x50d8b*4+0x02000000,0xe000); +reg_write( DDR_REG_BASE + 0x50d8c*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x50d8d*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x50d8e*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE + 0x50d8f*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x50d90*4+0x02000000,0x64); +reg_write( DDR_REG_BASE + 0x50d91*4+0x02000000,0x9220); +reg_write( DDR_REG_BASE + 0x50d92*4+0x02000000,0x4928); +reg_write( DDR_REG_BASE + 0x50d93*4+0x02000000,0x208b); +reg_write( DDR_REG_BASE + 0x50d94*4+0x02000000,0x880f); +reg_write( DDR_REG_BASE + 0x50d95*4+0x02000000,0xf206); +reg_write( DDR_REG_BASE + 0x50d96*4+0x02000000,0x2142); +reg_write( DDR_REG_BASE + 0x50d97*4+0x02000000,0x400); +reg_write( DDR_REG_BASE + 0x50d98*4+0x02000000,0x2080); +reg_write( DDR_REG_BASE + 0x50d99*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x50d9a*4+0x02000000,0xb200); +reg_write( DDR_REG_BASE + 0x50d9b*4+0x02000000,0x7164); +reg_write( DDR_REG_BASE + 0x50d9c*4+0x02000000,0xcc1); +reg_write( DDR_REG_BASE + 0x50d9d*4+0x02000000,0x90c5); +reg_write( DDR_REG_BASE + 0x50d9e*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x50d9f*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x50da0*4+0x02000000,0xc0e4); +reg_write( DDR_REG_BASE + 0x50da1*4+0x02000000,0x4508); +reg_write( DDR_REG_BASE + 0x50da2*4+0x02000000,0x259a); +reg_write( DDR_REG_BASE + 0x50da3*4+0x02000000,0x1008); +reg_write( DDR_REG_BASE + 0x50da4*4+0x02000000,0x44cb); +reg_write( DDR_REG_BASE + 0x50da5*4+0x02000000,0x900e); +reg_write( DDR_REG_BASE + 0x50da6*4+0x02000000,0x48); +reg_write( DDR_REG_BASE + 0x50da7*4+0x02000000,0x2505); +reg_write( DDR_REG_BASE + 0x50da8*4+0x02000000,0x130e); +reg_write( DDR_REG_BASE + 0x50da9*4+0x02000000,0xb620); +reg_write( DDR_REG_BASE + 0x50daa*4+0x02000000,0x6c22); +reg_write( DDR_REG_BASE + 0x50dab*4+0x02000000,0x2505); +reg_write( DDR_REG_BASE + 0x50dac*4+0x02000000,0x104c); +reg_write( DDR_REG_BASE + 0x50dad*4+0x02000000,0x7224); +reg_write( DDR_REG_BASE + 0x50dae*4+0x02000000,0xb440); +reg_write( DDR_REG_BASE + 0x50daf*4+0x02000000,0x2505); +reg_write( DDR_REG_BASE + 0x50db0*4+0x02000000,0x1042); +reg_write( DDR_REG_BASE + 0x50db1*4+0x02000000,0xb260); +reg_write( DDR_REG_BASE + 0x50db2*4+0x02000000,0x6962); +reg_write( DDR_REG_BASE + 0x50db3*4+0x02000000,0xc102); +reg_write( DDR_REG_BASE + 0x50db4*4+0x02000000,0x7d65); +reg_write( DDR_REG_BASE + 0x50db5*4+0x02000000,0x80f); +reg_write( DDR_REG_BASE + 0x50db6*4+0x02000000,0x3f1); +reg_write( DDR_REG_BASE + 0x50db7*4+0x02000000,0xb520); +reg_write( DDR_REG_BASE + 0x50db8*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE + 0x50db9*4+0x02000000,0xfc7); +reg_write( DDR_REG_BASE + 0x50dba*4+0x02000000,0xf005); +reg_write( DDR_REG_BASE + 0x50dbb*4+0x02000000,0x137c); +reg_write( DDR_REG_BASE + 0x50dbc*4+0x02000000,0x101); +reg_write( DDR_REG_BASE + 0x50dbd*4+0x02000000,0x210f); +reg_write( DDR_REG_BASE + 0x50dbe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50dbf*4+0x02000000,0x1b7c); +reg_write( DDR_REG_BASE + 0x50dc0*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x50dc1*4+0x02000000,0xc4c4); +reg_write( DDR_REG_BASE + 0x50dc2*4+0x02000000,0x44cb); +reg_write( DDR_REG_BASE + 0x50dc3*4+0x02000000,0x900e); +reg_write( DDR_REG_BASE + 0x50dc4*4+0x02000000,0xc2); +reg_write( DDR_REG_BASE + 0x50dc5*4+0x02000000,0x1c02); +reg_write( DDR_REG_BASE + 0x50dc6*4+0x02000000,0x1014); +reg_write( DDR_REG_BASE + 0x50dc7*4+0x02000000,0xb420); +reg_write( DDR_REG_BASE + 0x50dc8*4+0x02000000,0xb441); +reg_write( DDR_REG_BASE + 0x50dc9*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x50dca*4+0x02000000,0xb462); +reg_write( DDR_REG_BASE + 0x50dcb*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x50dcc*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x50dcd*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x50dce*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x50dcf*4+0x02000000,0x4608); +reg_write( DDR_REG_BASE + 0x50dd0*4+0x02000000,0xca08); +reg_write( DDR_REG_BASE + 0x50dd1*4+0x02000000,0x4358); +reg_write( DDR_REG_BASE + 0x50dd2*4+0x02000000,0xda08); +reg_write( DDR_REG_BASE + 0x50dd3*4+0x02000000,0x7a16); +reg_write( DDR_REG_BASE + 0x50dd4*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x50dd5*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x50dd6*4+0x02000000,0xe024); +reg_write( DDR_REG_BASE + 0x50dd7*4+0x02000000,0xb040); +reg_write( DDR_REG_BASE + 0x50dd8*4+0x02000000,0x228a); +reg_write( DDR_REG_BASE + 0x50dd9*4+0x02000000,0xfc7); +reg_write( DDR_REG_BASE + 0x50dda*4+0x02000000,0x180c); +reg_write( DDR_REG_BASE + 0x50ddb*4+0x02000000,0x45); +reg_write( DDR_REG_BASE + 0x50ddc*4+0x02000000,0x18fe); +reg_write( DDR_REG_BASE + 0x50ddd*4+0x02000000,0x8084); +reg_write( DDR_REG_BASE + 0x50dde*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x50ddf*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50de0*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE + 0x50de1*4+0x02000000,0x8861); +reg_write( DDR_REG_BASE + 0x50de2*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x50de3*4+0x02000000,0x708c); +reg_write( DDR_REG_BASE + 0x50de4*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50de5*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE + 0x50de6*4+0x02000000,0x86e0); +reg_write( DDR_REG_BASE + 0x50de7*4+0x02000000,0x71ad); +reg_write( DDR_REG_BASE + 0x50de8*4+0x02000000,0xf022); +reg_write( DDR_REG_BASE + 0x50de9*4+0x02000000,0x241a); +reg_write( DDR_REG_BASE + 0x50dea*4+0x02000000,0x1f82); +reg_write( DDR_REG_BASE + 0x50deb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50dec*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE + 0x50ded*4+0x02000000,0x21f4); +reg_write( DDR_REG_BASE + 0x50dee*4+0x02000000,0x30b); +reg_write( DDR_REG_BASE + 0x50def*4+0x02000000,0x2205); +reg_write( DDR_REG_BASE + 0x50df0*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x50df1*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x50df2*4+0x02000000,0x1064); +reg_write( DDR_REG_BASE + 0x50df3*4+0x02000000,0x1800); +reg_write( DDR_REG_BASE + 0x50df4*4+0x02000000,0x2c4); +reg_write( DDR_REG_BASE + 0x50df5*4+0x02000000,0x2205); +reg_write( DDR_REG_BASE + 0x50df6*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE + 0x50df7*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x50df8*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x50df9*4+0x02000000,0xb17); +reg_write( DDR_REG_BASE + 0x50dfa*4+0x02000000,0x3030); +reg_write( DDR_REG_BASE + 0x50dfb*4+0x02000000,0x21f4); +reg_write( DDR_REG_BASE + 0x50dfc*4+0x02000000,0x300); +reg_write( DDR_REG_BASE + 0x50dfd*4+0x02000000,0x815); +reg_write( DDR_REG_BASE + 0x50dfe*4+0x02000000,0xf84); +reg_write( DDR_REG_BASE + 0x50dff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50e00*4+0x02000000,0xfc00); +reg_write( DDR_REG_BASE + 0x50e01*4+0x02000000,0xd820); +reg_write( DDR_REG_BASE + 0x50e02*4+0x02000000,0xf006); +reg_write( DDR_REG_BASE + 0x50e03*4+0x02000000,0x208c); +reg_write( DDR_REG_BASE + 0x50e04*4+0x02000000,0x8010); +reg_write( DDR_REG_BASE + 0x50e05*4+0x02000000,0xf7bd); +reg_write( DDR_REG_BASE + 0x50e06*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE + 0x50e07*4+0x02000000,0x808); +reg_write( DDR_REG_BASE + 0x50e08*4+0x02000000,0xb200); +reg_write( DDR_REG_BASE + 0x50e09*4+0x02000000,0x7185); +reg_write( DDR_REG_BASE + 0x50e0a*4+0x02000000,0xbbf); +reg_write( DDR_REG_BASE + 0x50e0b*4+0x02000000,0x8305); +reg_write( DDR_REG_BASE + 0x50e0c*4+0x02000000,0xa02); +reg_write( DDR_REG_BASE + 0x50e0d*4+0x02000000,0x80); +reg_write( DDR_REG_BASE + 0x50e0e*4+0x02000000,0xb0b); +reg_write( DDR_REG_BASE + 0x50e0f*4+0x02000000,0x3030); +reg_write( DDR_REG_BASE + 0x50e10*4+0x02000000,0x8629); +reg_write( DDR_REG_BASE + 0x50e11*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE + 0x50e12*4+0x02000000,0xf002); +reg_write( DDR_REG_BASE + 0x50e13*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x50e14*4+0x02000000,0xf72); +reg_write( DDR_REG_BASE + 0x50e15*4+0x02000000,0x100); +reg_write( DDR_REG_BASE + 0x50e16*4+0x02000000,0xbfc4); +reg_write( DDR_REG_BASE + 0x50e17*4+0x02000000,0xef06); +reg_write( DDR_REG_BASE + 0x50e18*4+0x02000000,0xbf61); +reg_write( DDR_REG_BASE + 0x50e19*4+0x02000000,0xf01); +reg_write( DDR_REG_BASE + 0x50e1a*4+0x02000000,0x1031); +reg_write( DDR_REG_BASE + 0x50e1b*4+0x02000000,0x7dbb); +reg_write( DDR_REG_BASE + 0x50e1c*4+0x02000000,0x70ed); +reg_write( DDR_REG_BASE + 0x50e1d*4+0x02000000,0x8607); +reg_write( DDR_REG_BASE + 0x50e1e*4+0x02000000,0xf6d); +reg_write( DDR_REG_BASE + 0x50e1f*4+0x02000000,0x1023); +reg_write( DDR_REG_BASE + 0x50e20*4+0x02000000,0x78af); +reg_write( DDR_REG_BASE + 0x50e21*4+0x02000000,0xd92); +reg_write( DDR_REG_BASE + 0x50e22*4+0x02000000,0x180); +reg_write( DDR_REG_BASE + 0x50e23*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x50e24*4+0x02000000,0xb76); +reg_write( DDR_REG_BASE + 0x50e25*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE + 0x50e26*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x50e27*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x50e28*4+0x02000000,0x85a); +reg_write( DDR_REG_BASE + 0x50e29*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE + 0x50e2a*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x50e2b*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x50e2c*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50e2d*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE + 0x50e2e*4+0x02000000,0x8841); +reg_write( DDR_REG_BASE + 0x50e2f*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x50e30*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE + 0x50e31*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50e32*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE + 0x50e33*4+0x02000000,0x716d); +reg_write( DDR_REG_BASE + 0x50e34*4+0x02000000,0xf01a); +reg_write( DDR_REG_BASE + 0x50e35*4+0x02000000,0x211a); +reg_write( DDR_REG_BASE + 0x50e36*4+0x02000000,0xf8c); +reg_write( DDR_REG_BASE + 0x50e37*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50e38*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE + 0x50e39*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x50e3a*4+0x02000000,0xf00c); +reg_write( DDR_REG_BASE + 0x50e3b*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x50e3c*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x50e3d*4+0x02000000,0x7885); +reg_write( DDR_REG_BASE + 0x50e3e*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x50e3f*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x50e40*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x50e41*4+0x02000000,0x166); +reg_write( DDR_REG_BASE + 0x50e42*4+0x02000000,0x9000); +reg_write( DDR_REG_BASE + 0x50e43*4+0x02000000,0x631b); +reg_write( DDR_REG_BASE + 0x50e44*4+0x02000000,0x200a); +reg_write( DDR_REG_BASE + 0x50e45*4+0x02000000,0x780); +reg_write( DDR_REG_BASE + 0x50e46*4+0x02000000,0x8eb); +reg_write( DDR_REG_BASE + 0x50e47*4+0x02000000,0x8234); +reg_write( DDR_REG_BASE + 0x50e48*4+0x02000000,0x2040); +reg_write( DDR_REG_BASE + 0x50e49*4+0x02000000,0x5e); +reg_write( DDR_REG_BASE + 0x50e4a*4+0x02000000,0x7074); +reg_write( DDR_REG_BASE + 0x50e4b*4+0x02000000,0x23ca); +reg_write( DDR_REG_BASE + 0x50e4c*4+0x02000000,0x1021); +reg_write( DDR_REG_BASE + 0x50e4d*4+0x02000000,0x7124); +reg_write( DDR_REG_BASE + 0x50e4e*4+0x02000000,0xacf); +reg_write( DDR_REG_BASE + 0x50e4f*4+0x02000000,0x8065); +reg_write( DDR_REG_BASE + 0x50e50*4+0x02000000,0x706c); +reg_write( DDR_REG_BASE + 0x50e51*4+0x02000000,0xb9b); +reg_write( DDR_REG_BASE + 0x50e52*4+0x02000000,0x9030); +reg_write( DDR_REG_BASE + 0x50e53*4+0x02000000,0x71e5); +reg_write( DDR_REG_BASE + 0x50e54*4+0x02000000,0xb0b); +reg_write( DDR_REG_BASE + 0x50e55*4+0x02000000,0x3030); +reg_write( DDR_REG_BASE + 0x50e56*4+0x02000000,0x8e58); +reg_write( DDR_REG_BASE + 0x50e57*4+0x02000000,0x8602); +reg_write( DDR_REG_BASE + 0x50e58*4+0x02000000,0xf002); +reg_write( DDR_REG_BASE + 0x50e59*4+0x02000000,0x8601); +reg_write( DDR_REG_BASE + 0x50e5a*4+0x02000000,0xa4e); +reg_write( DDR_REG_BASE + 0x50e5b*4+0x02000000,0x120); +reg_write( DDR_REG_BASE + 0x50e5c*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x50e5d*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x50e5e*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x50e5f*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x50e60*4+0x02000000,0x219a); +reg_write( DDR_REG_BASE + 0x50e61*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x50e62*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x50e63*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x50e64*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x50e65*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x50e66*4+0x02000000,0xe064); +reg_write( DDR_REG_BASE + 0x50e67*4+0x02000000,0x2145); +reg_write( DDR_REG_BASE + 0x50e68*4+0x02000000,0x7c1); +reg_write( DDR_REG_BASE + 0x50e69*4+0x02000000,0x149); +reg_write( DDR_REG_BASE + 0x50e6a*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x50e6b*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE + 0x50e6c*4+0x02000000,0x706c); +reg_write( DDR_REG_BASE + 0x50e6d*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x50e6e*4+0x02000000,0xf003); +reg_write( DDR_REG_BASE + 0x50e6f*4+0x02000000,0xb260); +reg_write( DDR_REG_BASE + 0x50e70*4+0x02000000,0x7124); +reg_write( DDR_REG_BASE + 0x50e71*4+0x02000000,0x9ff); +reg_write( DDR_REG_BASE + 0x50e72*4+0x02000000,0x8cb4); +reg_write( DDR_REG_BASE + 0x50e73*4+0x02000000,0x2014); +reg_write( DDR_REG_BASE + 0x50e74*4+0x02000000,0x42); +reg_write( DDR_REG_BASE + 0x50e75*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x50e76*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE + 0x50e77*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50e78*4+0x02000000,0x16); +reg_write( DDR_REG_BASE + 0x50e79*4+0x02000000,0x9f3); +reg_write( DDR_REG_BASE + 0x50e7a*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x50e7b*4+0x02000000,0xda31); +reg_write( DDR_REG_BASE + 0x50e7c*4+0x02000000,0xba9f); +reg_write( DDR_REG_BASE + 0x50e7d*4+0x02000000,0x1201); +reg_write( DDR_REG_BASE + 0x50e7e*4+0x02000000,0x481); +reg_write( DDR_REG_BASE + 0x50e7f*4+0x02000000,0xa821); +reg_write( DDR_REG_BASE + 0x50e80*4+0x02000000,0x1201); +reg_write( DDR_REG_BASE + 0x50e81*4+0x02000000,0x481); +reg_write( DDR_REG_BASE + 0x50e82*4+0x02000000,0xa822); +reg_write( DDR_REG_BASE + 0x50e83*4+0x02000000,0x1202); +reg_write( DDR_REG_BASE + 0x50e84*4+0x02000000,0x481); +reg_write( DDR_REG_BASE + 0x50e85*4+0x02000000,0xa823); +reg_write( DDR_REG_BASE + 0x50e86*4+0x02000000,0x1201); +reg_write( DDR_REG_BASE + 0x50e87*4+0x02000000,0x481); +reg_write( DDR_REG_BASE + 0x50e88*4+0x02000000,0xa82b); +reg_write( DDR_REG_BASE + 0x50e89*4+0x02000000,0x1201); +reg_write( DDR_REG_BASE + 0x50e8a*4+0x02000000,0x481); +reg_write( DDR_REG_BASE + 0x50e8b*4+0x02000000,0xa830); +reg_write( DDR_REG_BASE + 0x50e8c*4+0x02000000,0x1202); +reg_write( DDR_REG_BASE + 0x50e8d*4+0x02000000,0x481); +reg_write( DDR_REG_BASE + 0x50e8e*4+0x02000000,0xa831); +reg_write( DDR_REG_BASE + 0x50e8f*4+0x02000000,0x1201); +reg_write( DDR_REG_BASE + 0x50e90*4+0x02000000,0x481); +reg_write( DDR_REG_BASE + 0x50e91*4+0x02000000,0x1833); +reg_write( DDR_REG_BASE + 0x50e92*4+0x02000000,0x42); +reg_write( DDR_REG_BASE + 0x50e93*4+0x02000000,0x1201); +reg_write( DDR_REG_BASE + 0x50e94*4+0x02000000,0x481); +reg_write( DDR_REG_BASE + 0x50e95*4+0x02000000,0x1834); +reg_write( DDR_REG_BASE + 0x50e96*4+0x02000000,0x42); +reg_write( DDR_REG_BASE + 0x50e97*4+0x02000000,0x1202); +reg_write( DDR_REG_BASE + 0x50e98*4+0x02000000,0x481); +reg_write( DDR_REG_BASE + 0x50e99*4+0x02000000,0x1835); +reg_write( DDR_REG_BASE + 0x50e9a*4+0x02000000,0x42); +reg_write( DDR_REG_BASE + 0x50e9b*4+0x02000000,0x1201); +reg_write( DDR_REG_BASE + 0x50e9c*4+0x02000000,0x481); +reg_write( DDR_REG_BASE + 0x50e9d*4+0x02000000,0x183d); +reg_write( DDR_REG_BASE + 0x50e9e*4+0x02000000,0x42); +reg_write( DDR_REG_BASE + 0x50e9f*4+0x02000000,0x1201); +reg_write( DDR_REG_BASE + 0x50ea0*4+0x02000000,0x481); +reg_write( DDR_REG_BASE + 0x50ea1*4+0x02000000,0x1842); +reg_write( DDR_REG_BASE + 0x50ea2*4+0x02000000,0x42); +reg_write( DDR_REG_BASE + 0x50ea3*4+0x02000000,0x1218); +reg_write( DDR_REG_BASE + 0x50ea4*4+0x02000000,0x481); +reg_write( DDR_REG_BASE + 0x50ea5*4+0x02000000,0x1843); +reg_write( DDR_REG_BASE + 0x50ea6*4+0x02000000,0x42); +reg_write( DDR_REG_BASE + 0x50ea7*4+0x02000000,0x1201); +reg_write( DDR_REG_BASE + 0x50ea8*4+0x02000000,0x481); +reg_write( DDR_REG_BASE + 0x50ea9*4+0x02000000,0x1865); +reg_write( DDR_REG_BASE + 0x50eaa*4+0x02000000,0x42); +reg_write( DDR_REG_BASE + 0x50eab*4+0x02000000,0x1201); +reg_write( DDR_REG_BASE + 0x50eac*4+0x02000000,0x481); +reg_write( DDR_REG_BASE + 0x50ead*4+0x02000000,0x1866); +reg_write( DDR_REG_BASE + 0x50eae*4+0x02000000,0x42); +reg_write( DDR_REG_BASE + 0x50eaf*4+0x02000000,0x1202); +reg_write( DDR_REG_BASE + 0x50eb0*4+0x02000000,0x481); +reg_write( DDR_REG_BASE + 0x50eb1*4+0x02000000,0x1867); +reg_write( DDR_REG_BASE + 0x50eb2*4+0x02000000,0x42); +reg_write( DDR_REG_BASE + 0x50eb3*4+0x02000000,0x1201); +reg_write( DDR_REG_BASE + 0x50eb4*4+0x02000000,0x481); +reg_write( DDR_REG_BASE + 0x50eb5*4+0x02000000,0x186f); +reg_write( DDR_REG_BASE + 0x50eb6*4+0x02000000,0x42); +reg_write( DDR_REG_BASE + 0x50eb7*4+0x02000000,0x1201); +reg_write( DDR_REG_BASE + 0x50eb8*4+0x02000000,0x481); +reg_write( DDR_REG_BASE + 0x50eb9*4+0x02000000,0x1874); +reg_write( DDR_REG_BASE + 0x50eba*4+0x02000000,0x42); +reg_write( DDR_REG_BASE + 0x50ebb*4+0x02000000,0x1202); +reg_write( DDR_REG_BASE + 0x50ebc*4+0x02000000,0x481); +reg_write( DDR_REG_BASE + 0x50ebd*4+0x02000000,0x1875); +reg_write( DDR_REG_BASE + 0x50ebe*4+0x02000000,0x42); +reg_write( DDR_REG_BASE + 0x50ebf*4+0x02000000,0x1201); +reg_write( DDR_REG_BASE + 0x50ec0*4+0x02000000,0x481); +reg_write( DDR_REG_BASE + 0x50ec1*4+0x02000000,0x1897); +reg_write( DDR_REG_BASE + 0x50ec2*4+0x02000000,0x42); +reg_write( DDR_REG_BASE + 0x50ec3*4+0x02000000,0x1201); +reg_write( DDR_REG_BASE + 0x50ec4*4+0x02000000,0x481); +reg_write( DDR_REG_BASE + 0x50ec5*4+0x02000000,0x1898); +reg_write( DDR_REG_BASE + 0x50ec6*4+0x02000000,0x42); +reg_write( DDR_REG_BASE + 0x50ec7*4+0x02000000,0x1202); +reg_write( DDR_REG_BASE + 0x50ec8*4+0x02000000,0x481); +reg_write( DDR_REG_BASE + 0x50ec9*4+0x02000000,0x1899); +reg_write( DDR_REG_BASE + 0x50eca*4+0x02000000,0x42); +reg_write( DDR_REG_BASE + 0x50ecb*4+0x02000000,0x8a20); +reg_write( DDR_REG_BASE + 0x50ecc*4+0x02000000,0x18a1); +reg_write( DDR_REG_BASE + 0x50ecd*4+0x02000000,0x42); +reg_write( DDR_REG_BASE + 0x50ece*4+0x02000000,0x8a21); +reg_write( DDR_REG_BASE + 0x50ecf*4+0x02000000,0x18a6); +reg_write( DDR_REG_BASE + 0x50ed0*4+0x02000000,0x42); +reg_write( DDR_REG_BASE + 0x50ed1*4+0x02000000,0x8a22); +reg_write( DDR_REG_BASE + 0x50ed2*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x50ed3*4+0x02000000,0x18a7); +reg_write( DDR_REG_BASE + 0x50ed4*4+0x02000000,0x42); +reg_write( DDR_REG_BASE + 0x50ed5*4+0x02000000,0x219a); +reg_write( DDR_REG_BASE + 0x50ed6*4+0x02000000,0x901); +reg_write( DDR_REG_BASE + 0x50ed7*4+0x02000000,0x603a); +reg_write( DDR_REG_BASE + 0x50ed8*4+0x02000000,0x235a); +reg_write( DDR_REG_BASE + 0x50ed9*4+0x02000000,0x1c81); +reg_write( DDR_REG_BASE + 0x50eda*4+0x02000000,0x7165); +reg_write( DDR_REG_BASE + 0x50edb*4+0x02000000,0x623c); +reg_write( DDR_REG_BASE + 0x50edc*4+0x02000000,0xd931); +reg_write( DDR_REG_BASE + 0x50edd*4+0x02000000,0xb99f); +reg_write( DDR_REG_BASE + 0x50ede*4+0x02000000,0x1101); +reg_write( DDR_REG_BASE + 0x50edf*4+0x02000000,0x482); +reg_write( DDR_REG_BASE + 0x50ee0*4+0x02000000,0xac41); +reg_write( DDR_REG_BASE + 0x50ee1*4+0x02000000,0x1101); +reg_write( DDR_REG_BASE + 0x50ee2*4+0x02000000,0x482); +reg_write( DDR_REG_BASE + 0x50ee3*4+0x02000000,0xac42); +reg_write( DDR_REG_BASE + 0x50ee4*4+0x02000000,0x1102); +reg_write( DDR_REG_BASE + 0x50ee5*4+0x02000000,0x482); +reg_write( DDR_REG_BASE + 0x50ee6*4+0x02000000,0xac43); +reg_write( DDR_REG_BASE + 0x50ee7*4+0x02000000,0x8940); +reg_write( DDR_REG_BASE + 0x50ee8*4+0x02000000,0xac4b); +reg_write( DDR_REG_BASE + 0x50ee9*4+0x02000000,0x8941); +reg_write( DDR_REG_BASE + 0x50eea*4+0x02000000,0xac50); +reg_write( DDR_REG_BASE + 0x50eeb*4+0x02000000,0x8922); +reg_write( DDR_REG_BASE + 0x50eec*4+0x02000000,0xac31); +reg_write( DDR_REG_BASE + 0x50eed*4+0x02000000,0xbd3); +reg_write( DDR_REG_BASE + 0x50eee*4+0x02000000,0x90b4); +reg_write( DDR_REG_BASE + 0x50eef*4+0x02000000,0x4160); +reg_write( DDR_REG_BASE + 0x50ef0*4+0x02000000,0x7164); +reg_write( DDR_REG_BASE + 0x50ef1*4+0x02000000,0xbfb); +reg_write( DDR_REG_BASE + 0x50ef2*4+0x02000000,0x80b4); +reg_write( DDR_REG_BASE + 0x50ef3*4+0x02000000,0x706d); +reg_write( DDR_REG_BASE + 0x50ef4*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x50ef5*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x50ef6*4+0x02000000,0xc3e4); +reg_write( DDR_REG_BASE + 0x50ef7*4+0x02000000,0xc1ab); +reg_write( DDR_REG_BASE + 0x50ef8*4+0x02000000,0xc080); +reg_write( DDR_REG_BASE + 0x50ef9*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x50efa*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50efb*4+0x02000000,0x689); +reg_write( DDR_REG_BASE + 0x50efc*4+0x02000000,0xa8a); +reg_write( DDR_REG_BASE + 0x50efd*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x50efe*4+0x02000000,0xda2a); +reg_write( DDR_REG_BASE + 0x50eff*4+0x02000000,0xc080); +reg_write( DDR_REG_BASE + 0x50f00*4+0x02000000,0xb8a); +reg_write( DDR_REG_BASE + 0x50f01*4+0x02000000,0x1e0); +reg_write( DDR_REG_BASE + 0x50f02*4+0x02000000,0xd92a); +reg_write( DDR_REG_BASE + 0x50f03*4+0x02000000,0xc16); +reg_write( DDR_REG_BASE + 0x50f04*4+0x02000000,0xffcf); +reg_write( DDR_REG_BASE + 0x50f05*4+0x02000000,0xc72); +reg_write( DDR_REG_BASE + 0x50f06*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x50f07*4+0x02000000,0x4300); +reg_write( DDR_REG_BASE + 0x50f08*4+0x02000000,0x4100); +reg_write( DDR_REG_BASE + 0x50f09*4+0x02000000,0xc52); +reg_write( DDR_REG_BASE + 0x50f0a*4+0x02000000,0x120); +reg_write( DDR_REG_BASE + 0x50f0b*4+0x02000000,0x4060); +reg_write( DDR_REG_BASE + 0x50f0c*4+0x02000000,0xdd23); +reg_write( DDR_REG_BASE + 0x50f0d*4+0x02000000,0xbd9f); +reg_write( DDR_REG_BASE + 0x50f0e*4+0x02000000,0x8d00); +reg_write( DDR_REG_BASE + 0x50f0f*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE + 0x50f10*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x50f11*4+0x02000000,0xe4); +reg_write( DDR_REG_BASE + 0x50f12*4+0x02000000,0xb600); +reg_write( DDR_REG_BASE + 0x50f13*4+0x02000000,0x1526); +reg_write( DDR_REG_BASE + 0x50f14*4+0x02000000,0x1080); +reg_write( DDR_REG_BASE + 0x50f15*4+0x02000000,0xb601); +reg_write( DDR_REG_BASE + 0x50f16*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x50f17*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x50f18*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x50f19*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x50f1a*4+0x02000000,0xe154); +reg_write( DDR_REG_BASE + 0x50f1b*4+0x02000000,0xb56); +reg_write( DDR_REG_BASE + 0x50f1c*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x50f1d*4+0x02000000,0x1e42); +reg_write( DDR_REG_BASE + 0x50f1e*4+0x02000000,0x905d); +reg_write( DDR_REG_BASE + 0x50f1f*4+0x02000000,0x2053); +reg_write( DDR_REG_BASE + 0x50f20*4+0x02000000,0xc1); +reg_write( DDR_REG_BASE + 0x50f21*4+0x02000000,0x1a01); +reg_write( DDR_REG_BASE + 0x50f22*4+0x02000000,0x3042); +reg_write( DDR_REG_BASE + 0x50f23*4+0x02000000,0x791d); +reg_write( DDR_REG_BASE + 0x50f24*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE + 0x50f25*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE + 0x50f26*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE + 0x50f27*4+0x02000000,0xb9c3); +reg_write( DDR_REG_BASE + 0x50f28*4+0x02000000,0x1a02); +reg_write( DDR_REG_BASE + 0x50f29*4+0x02000000,0x3042); +reg_write( DDR_REG_BASE + 0x50f2a*4+0x02000000,0xd908); +reg_write( DDR_REG_BASE + 0x50f2b*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE + 0x50f2c*4+0x02000000,0x9ff); +reg_write( DDR_REG_BASE + 0x50f2d*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE + 0x50f2e*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x50f2f*4+0x02000000,0xb8c1); +reg_write( DDR_REG_BASE + 0x50f30*4+0x02000000,0xef6); +reg_write( DDR_REG_BASE + 0x50f31*4+0x02000000,0x120); +reg_write( DDR_REG_BASE + 0x50f32*4+0x02000000,0x1a06); +reg_write( DDR_REG_BASE + 0x50f33*4+0x02000000,0x3002); +reg_write( DDR_REG_BASE + 0x50f34*4+0x02000000,0x83a); +reg_write( DDR_REG_BASE + 0x50f35*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50f36*4+0x02000000,0xb72); +reg_write( DDR_REG_BASE + 0x50f37*4+0x02000000,0x100); +reg_write( DDR_REG_BASE + 0x50f38*4+0x02000000,0x164c); +reg_write( DDR_REG_BASE + 0x50f39*4+0x02000000,0x9100); +reg_write( DDR_REG_BASE + 0x50f3a*4+0x02000000,0x80b); +reg_write( DDR_REG_BASE + 0x50f3b*4+0x02000000,0x151); +reg_write( DDR_REG_BASE + 0x50f3c*4+0x02000000,0x8d00); +reg_write( DDR_REG_BASE + 0x50f3d*4+0x02000000,0xb600); +reg_write( DDR_REG_BASE + 0x50f3e*4+0x02000000,0xb601); +reg_write( DDR_REG_BASE + 0x50f3f*4+0x02000000,0xc7c4); +reg_write( DDR_REG_BASE + 0x50f40*4+0x02000000,0xc0f1); +reg_write( DDR_REG_BASE + 0x50f41*4+0x02000000,0xc1bd); +reg_write( DDR_REG_BASE + 0x50f42*4+0x02000000,0xc080); +reg_write( DDR_REG_BASE + 0x50f43*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x50f44*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50f45*4+0x02000000,0x50a); +reg_write( DDR_REG_BASE + 0x50f46*4+0x02000000,0x9f6); +reg_write( DDR_REG_BASE + 0x50f47*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x50f48*4+0x02000000,0xda72); +reg_write( DDR_REG_BASE + 0x50f49*4+0x02000000,0xc080); +reg_write( DDR_REG_BASE + 0x50f4a*4+0x02000000,0xaf6); +reg_write( DDR_REG_BASE + 0x50f4b*4+0x02000000,0x1e0); +reg_write( DDR_REG_BASE + 0x50f4c*4+0x02000000,0xd972); +reg_write( DDR_REG_BASE + 0x50f4d*4+0x02000000,0xc0bd); +reg_write( DDR_REG_BASE + 0x50f4e*4+0x02000000,0xc0d1); +reg_write( DDR_REG_BASE + 0x50f4f*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x50f50*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x50f51*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x50f52*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x50f53*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x50f54*4+0x02000000,0x7101); +reg_write( DDR_REG_BASE + 0x50f55*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x50f56*4+0x02000000,0x1e0); +reg_write( DDR_REG_BASE + 0x50f57*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x50f58*4+0x02000000,0x7082); +reg_write( DDR_REG_BASE + 0x50f59*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x50f5a*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x50f5b*4+0x02000000,0x225f); +reg_write( DDR_REG_BASE + 0x50f5c*4+0x02000000,0x100); +reg_write( DDR_REG_BASE + 0x50f5d*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE + 0x50f5e*4+0x02000000,0x7c3); +reg_write( DDR_REG_BASE + 0x50f5f*4+0x02000000,0x4020); +reg_write( DDR_REG_BASE + 0x50f60*4+0x02000000,0xeb05); +reg_write( DDR_REG_BASE + 0x50f61*4+0x02000000,0xbb61); +reg_write( DDR_REG_BASE + 0x50f62*4+0x02000000,0xbff); +reg_write( DDR_REG_BASE + 0x50f63*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE + 0x50f64*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x50f65*4+0x02000000,0xb8c3); +reg_write( DDR_REG_BASE + 0x50f66*4+0x02000000,0x80b); +reg_write( DDR_REG_BASE + 0x50f67*4+0x02000000,0x190); +reg_write( DDR_REG_BASE + 0x50f68*4+0x02000000,0x877); +reg_write( DDR_REG_BASE + 0x50f69*4+0x02000000,0x71); +reg_write( DDR_REG_BASE + 0x50f6a*4+0x02000000,0xdf18); +reg_write( DDR_REG_BASE + 0x50f6b*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE + 0x50f6c*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x50f6d*4+0x02000000,0x116); +reg_write( DDR_REG_BASE + 0x50f6e*4+0x02000000,0x1e08); +reg_write( DDR_REG_BASE + 0x50f6f*4+0x02000000,0x1094); +reg_write( DDR_REG_BASE + 0x50f70*4+0x02000000,0x71ad); +reg_write( DDR_REG_BASE + 0x50f71*4+0x02000000,0x1e02); +reg_write( DDR_REG_BASE + 0x50f72*4+0x02000000,0x1055); +reg_write( DDR_REG_BASE + 0x50f73*4+0x02000000,0xd829); +reg_write( DDR_REG_BASE + 0x50f74*4+0x02000000,0xb6a0); +reg_write( DDR_REG_BASE + 0x50f75*4+0x02000000,0x1e6c); +reg_write( DDR_REG_BASE + 0x50f76*4+0x02000000,0x1205); +reg_write( DDR_REG_BASE + 0x50f77*4+0x02000000,0x1e6c); +reg_write( DDR_REG_BASE + 0x50f78*4+0x02000000,0x1004); +reg_write( DDR_REG_BASE + 0x50f79*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x50f7a*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x50f7b*4+0x02000000,0x98); +reg_write( DDR_REG_BASE + 0x50f7c*4+0x02000000,0x9680); +reg_write( DDR_REG_BASE + 0x50f7d*4+0x02000000,0x4328); +reg_write( DDR_REG_BASE + 0x50f7e*4+0x02000000,0x1ef2); +reg_write( DDR_REG_BASE + 0x50f7f*4+0x02000000,0x9044); +reg_write( DDR_REG_BASE + 0x50f80*4+0x02000000,0xfba); +reg_write( DDR_REG_BASE + 0x50f81*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x50f82*4+0x02000000,0x1e66); +reg_write( DDR_REG_BASE + 0x50f83*4+0x02000000,0x1044); +reg_write( DDR_REG_BASE + 0x50f84*4+0x02000000,0xd8a9); +reg_write( DDR_REG_BASE + 0x50f85*4+0x02000000,0x1e6c); +reg_write( DDR_REG_BASE + 0x50f86*4+0x02000000,0x1004); +reg_write( DDR_REG_BASE + 0x50f87*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE + 0x50f88*4+0x02000000,0xa46); +reg_write( DDR_REG_BASE + 0x50f89*4+0x02000000,0x1e6c); +reg_write( DDR_REG_BASE + 0x50f8a*4+0x02000000,0x1004); +reg_write( DDR_REG_BASE + 0x50f8b*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE + 0x50f8c*4+0x02000000,0xa44); +reg_write( DDR_REG_BASE + 0x50f8d*4+0x02000000,0x1e6c); +reg_write( DDR_REG_BASE + 0x50f8e*4+0x02000000,0x1004); +reg_write( DDR_REG_BASE + 0x50f8f*4+0x02000000,0x1e6c); +reg_write( DDR_REG_BASE + 0x50f90*4+0x02000000,0x1004); +reg_write( DDR_REG_BASE + 0x50f91*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x50f92*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50f93*4+0x02000000,0x6000); +reg_write( DDR_REG_BASE + 0x50f94*4+0x02000000,0x1e72); +reg_write( DDR_REG_BASE + 0x50f95*4+0x02000000,0x935c); +reg_write( DDR_REG_BASE + 0x50f96*4+0x02000000,0x1ed0); +reg_write( DDR_REG_BASE + 0x50f97*4+0x02000000,0x9344); +reg_write( DDR_REG_BASE + 0x50f98*4+0x02000000,0x1e72); +reg_write( DDR_REG_BASE + 0x50f99*4+0x02000000,0x90dd); +reg_write( DDR_REG_BASE + 0x50f9a*4+0x02000000,0xf2e); +reg_write( DDR_REG_BASE + 0x50f9b*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x50f9c*4+0x02000000,0x1ed0); +reg_write( DDR_REG_BASE + 0x50f9d*4+0x02000000,0x92c4); +reg_write( DDR_REG_BASE + 0x50f9e*4+0x02000000,0x1e72); +reg_write( DDR_REG_BASE + 0x50f9f*4+0x02000000,0x935c); +reg_write( DDR_REG_BASE + 0x50fa0*4+0x02000000,0x1e72); +reg_write( DDR_REG_BASE + 0x50fa1*4+0x02000000,0x92dc); +reg_write( DDR_REG_BASE + 0x50fa2*4+0x02000000,0xf046); +reg_write( DDR_REG_BASE + 0x50fa3*4+0x02000000,0x45cb); +reg_write( DDR_REG_BASE + 0x50fa4*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x50fa5*4+0x02000000,0x116); +reg_write( DDR_REG_BASE + 0x50fa6*4+0x02000000,0x1d08); +reg_write( DDR_REG_BASE + 0x50fa7*4+0x02000000,0x1094); +reg_write( DDR_REG_BASE + 0x50fa8*4+0x02000000,0x71cd); +reg_write( DDR_REG_BASE + 0x50fa9*4+0x02000000,0x1d02); +reg_write( DDR_REG_BASE + 0x50faa*4+0x02000000,0x1055); +reg_write( DDR_REG_BASE + 0x50fab*4+0x02000000,0x234a); +reg_write( DDR_REG_BASE + 0x50fac*4+0x02000000,0x1200); +reg_write( DDR_REG_BASE + 0x50fad*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x50fae*4+0x02000000,0xbf8b); +reg_write( DDR_REG_BASE + 0x50faf*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x50fb0*4+0x02000000,0xf); +reg_write( DDR_REG_BASE + 0x50fb1*4+0x02000000,0x4240); +reg_write( DDR_REG_BASE + 0x50fb2*4+0x02000000,0xb5c0); +reg_write( DDR_REG_BASE + 0x50fb3*4+0x02000000,0x1d6c); +reg_write( DDR_REG_BASE + 0x50fb4*4+0x02000000,0x12c4); +reg_write( DDR_REG_BASE + 0x50fb5*4+0x02000000,0x260a); +reg_write( DDR_REG_BASE + 0x50fb6*4+0x02000000,0x3040); +reg_write( DDR_REG_BASE + 0x50fb7*4+0x02000000,0x1df2); +reg_write( DDR_REG_BASE + 0x50fb8*4+0x02000000,0x9044); +reg_write( DDR_REG_BASE + 0x50fb9*4+0x02000000,0x1d66); +reg_write( DDR_REG_BASE + 0x50fba*4+0x02000000,0x1044); +reg_write( DDR_REG_BASE + 0x50fbb*4+0x02000000,0x1d6c); +reg_write( DDR_REG_BASE + 0x50fbc*4+0x02000000,0x13c4); +reg_write( DDR_REG_BASE + 0x50fbd*4+0x02000000,0xf42); +reg_write( DDR_REG_BASE + 0x50fbe*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x50fbf*4+0x02000000,0x4318); +reg_write( DDR_REG_BASE + 0x50fc0*4+0x02000000,0xbf70); +reg_write( DDR_REG_BASE + 0x50fc1*4+0x02000000,0x202f); +reg_write( DDR_REG_BASE + 0x50fc2*4+0x02000000,0x6c2); +reg_write( DDR_REG_BASE + 0x50fc3*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x50fc4*4+0x02000000,0xf32); +reg_write( DDR_REG_BASE + 0x50fc5*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x50fc6*4+0x02000000,0x1d6c); +reg_write( DDR_REG_BASE + 0x50fc7*4+0x02000000,0x13c4); +reg_write( DDR_REG_BASE + 0x50fc8*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x50fc9*4+0x02000000,0x98); +reg_write( DDR_REG_BASE + 0x50fca*4+0x02000000,0x9680); +reg_write( DDR_REG_BASE + 0x50fcb*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x50fcc*4+0x02000000,0xf22); +reg_write( DDR_REG_BASE + 0x50fcd*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x50fce*4+0x02000000,0x1d6c); +reg_write( DDR_REG_BASE + 0x50fcf*4+0x02000000,0x12c4); +reg_write( DDR_REG_BASE + 0x50fd0*4+0x02000000,0xd888); +reg_write( DDR_REG_BASE + 0x50fd1*4+0x02000000,0x1d6c); +reg_write( DDR_REG_BASE + 0x50fd2*4+0x02000000,0x1004); +reg_write( DDR_REG_BASE + 0x50fd3*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x50fd4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x50fd5*4+0x02000000,0x6000); +reg_write( DDR_REG_BASE + 0x50fd6*4+0x02000000,0x1d6c); +reg_write( DDR_REG_BASE + 0x50fd7*4+0x02000000,0x12c4); +reg_write( DDR_REG_BASE + 0x50fd8*4+0x02000000,0x1d6c); +reg_write( DDR_REG_BASE + 0x50fd9*4+0x02000000,0x1784); +reg_write( DDR_REG_BASE + 0x50fda*4+0x02000000,0x1d72); +reg_write( DDR_REG_BASE + 0x50fdb*4+0x02000000,0x939c); +reg_write( DDR_REG_BASE + 0x50fdc*4+0x02000000,0x1dd0); +reg_write( DDR_REG_BASE + 0x50fdd*4+0x02000000,0x9384); +reg_write( DDR_REG_BASE + 0x50fde*4+0x02000000,0x1d72); +reg_write( DDR_REG_BASE + 0x50fdf*4+0x02000000,0x90dd); +reg_write( DDR_REG_BASE + 0x50fe0*4+0x02000000,0xea2); +reg_write( DDR_REG_BASE + 0x50fe1*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x50fe2*4+0x02000000,0x1dd0); +reg_write( DDR_REG_BASE + 0x50fe3*4+0x02000000,0x9784); +reg_write( DDR_REG_BASE + 0x50fe4*4+0x02000000,0x1d72); +reg_write( DDR_REG_BASE + 0x50fe5*4+0x02000000,0x939c); +reg_write( DDR_REG_BASE + 0x50fe6*4+0x02000000,0x1d72); +reg_write( DDR_REG_BASE + 0x50fe7*4+0x02000000,0x979c); +reg_write( DDR_REG_BASE + 0x50fe8*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x50fe9*4+0x02000000,0xeea); +reg_write( DDR_REG_BASE + 0x50fea*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x50feb*4+0x02000000,0xd920); +reg_write( DDR_REG_BASE + 0x50fec*4+0x02000000,0x45cb); +reg_write( DDR_REG_BASE + 0x50fed*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x50fee*4+0x02000000,0x1f0); +reg_write( DDR_REG_BASE + 0x50fef*4+0x02000000,0xd820); +reg_write( DDR_REG_BASE + 0x50ff0*4+0x02000000,0xe82); +reg_write( DDR_REG_BASE + 0x50ff1*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x50ff2*4+0x02000000,0x1d00); +reg_write( DDR_REG_BASE + 0x50ff3*4+0x02000000,0x1005); +reg_write( DDR_REG_BASE + 0x50ff4*4+0x02000000,0xd820); +reg_write( DDR_REG_BASE + 0x50ff5*4+0x02000000,0xe7a); +reg_write( DDR_REG_BASE + 0x50ff6*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x50ff7*4+0x02000000,0x1d00); +reg_write( DDR_REG_BASE + 0x50ff8*4+0x02000000,0x1045); +reg_write( DDR_REG_BASE + 0x50ff9*4+0x02000000,0x740c); +reg_write( DDR_REG_BASE + 0x50ffa*4+0x02000000,0xe6e); +reg_write( DDR_REG_BASE + 0x50ffb*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x50ffc*4+0x02000000,0x1d00); +reg_write( DDR_REG_BASE + 0x50ffd*4+0x02000000,0x1005); +reg_write( DDR_REG_BASE + 0x50ffe*4+0x02000000,0x1d0a); +reg_write( DDR_REG_BASE + 0x50fff*4+0x02000000,0x909d); +reg_write( DDR_REG_BASE + 0x51000*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x51001*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x51002*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x51003*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x51004*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x51005*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x51006*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x51007*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51008*4+0x02000000,0x7b6); +reg_write( DDR_REG_BASE + 0x51009*4+0x02000000,0xdc22); +reg_write( DDR_REG_BASE + 0x5100a*4+0x02000000,0xa940); +reg_write( DDR_REG_BASE + 0x5100b*4+0x02000000,0xbc9f); +reg_write( DDR_REG_BASE + 0x5100c*4+0x02000000,0x8c00); +reg_write( DDR_REG_BASE + 0x5100d*4+0x02000000,0x45cb); +reg_write( DDR_REG_BASE + 0x5100e*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5100f*4+0x02000000,0x758); +reg_write( DDR_REG_BASE + 0x51010*4+0x02000000,0xe007); +reg_write( DDR_REG_BASE + 0x51011*4+0x02000000,0x7e1d); +reg_write( DDR_REG_BASE + 0x51012*4+0x02000000,0x7edd); +reg_write( DDR_REG_BASE + 0x51013*4+0x02000000,0x7edd); +reg_write( DDR_REG_BASE + 0x51014*4+0x02000000,0x6e09); +reg_write( DDR_REG_BASE + 0x51015*4+0x02000000,0xa901); +reg_write( DDR_REG_BASE + 0x51016*4+0x02000000,0x1427); +reg_write( DDR_REG_BASE + 0x51017*4+0x02000000,0x1083); +reg_write( DDR_REG_BASE + 0x51018*4+0x02000000,0x7074); +reg_write( DDR_REG_BASE + 0x51019*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE + 0x5101a*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5101b*4+0x02000000,0x77c); +reg_write( DDR_REG_BASE + 0x5101c*4+0x02000000,0xf223); +reg_write( DDR_REG_BASE + 0x5101d*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE + 0x5101e*4+0x02000000,0x44); +reg_write( DDR_REG_BASE + 0x5101f*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51020*4+0x02000000,0x708f); +reg_write( DDR_REG_BASE + 0x51021*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51022*4+0x02000000,0x48); +reg_write( DDR_REG_BASE + 0x51023*4+0x02000000,0xb501); +reg_write( DDR_REG_BASE + 0x51024*4+0x02000000,0xca02); +reg_write( DDR_REG_BASE + 0x51025*4+0x02000000,0x7e1d); +reg_write( DDR_REG_BASE + 0x51026*4+0x02000000,0x6f07); +reg_write( DDR_REG_BASE + 0x51027*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x51028*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x51029*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x5102a*4+0x02000000,0x60d8); +reg_write( DDR_REG_BASE + 0x5102b*4+0x02000000,0x7704); +reg_write( DDR_REG_BASE + 0x5102c*4+0x02000000,0xa9c2); +reg_write( DDR_REG_BASE + 0x5102d*4+0x02000000,0xa903); +reg_write( DDR_REG_BASE + 0x5102e*4+0x02000000,0x8c00); +reg_write( DDR_REG_BASE + 0x5102f*4+0x02000000,0x82b); +reg_write( DDR_REG_BASE + 0x51030*4+0x02000000,0x474); +reg_write( DDR_REG_BASE + 0x51031*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x51032*4+0x02000000,0xd06); +reg_write( DDR_REG_BASE + 0x51033*4+0x02000000,0x100); +reg_write( DDR_REG_BASE + 0x51034*4+0x02000000,0xad14); +reg_write( DDR_REG_BASE + 0x51035*4+0x02000000,0xd02); +reg_write( DDR_REG_BASE + 0x51036*4+0x02000000,0x120); +reg_write( DDR_REG_BASE + 0x51037*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x51038*4+0x02000000,0xad1c); +reg_write( DDR_REG_BASE + 0x51039*4+0x02000000,0xcfa); +reg_write( DDR_REG_BASE + 0x5103a*4+0x02000000,0x120); +reg_write( DDR_REG_BASE + 0x5103b*4+0x02000000,0x740c); +reg_write( DDR_REG_BASE + 0x5103c*4+0x02000000,0xab10); +reg_write( DDR_REG_BASE + 0x5103d*4+0x02000000,0x740c); +reg_write( DDR_REG_BASE + 0x5103e*4+0x02000000,0xf012); +reg_write( DDR_REG_BASE + 0x5103f*4+0x02000000,0xa903); +reg_write( DDR_REG_BASE + 0x51040*4+0x02000000,0xa9c2); +reg_write( DDR_REG_BASE + 0x51041*4+0x02000000,0xb541); +reg_write( DDR_REG_BASE + 0x51042*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE + 0x51043*4+0x02000000,0xce6); +reg_write( DDR_REG_BASE + 0x51044*4+0x02000000,0x120); +reg_write( DDR_REG_BASE + 0x51045*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE + 0x51046*4+0x02000000,0xad14); +reg_write( DDR_REG_BASE + 0x51047*4+0x02000000,0xcde); +reg_write( DDR_REG_BASE + 0x51048*4+0x02000000,0x120); +reg_write( DDR_REG_BASE + 0x51049*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE + 0x5104a*4+0x02000000,0xad1c); +reg_write( DDR_REG_BASE + 0x5104b*4+0x02000000,0xcd6); +reg_write( DDR_REG_BASE + 0x5104c*4+0x02000000,0x120); +reg_write( DDR_REG_BASE + 0x5104d*4+0x02000000,0x720c); +reg_write( DDR_REG_BASE + 0x5104e*4+0x02000000,0xab10); +reg_write( DDR_REG_BASE + 0x5104f*4+0x02000000,0x720c); +reg_write( DDR_REG_BASE + 0x51050*4+0x02000000,0xcca); +reg_write( DDR_REG_BASE + 0x51051*4+0x02000000,0x100); +reg_write( DDR_REG_BASE + 0x51052*4+0x02000000,0xab18); +reg_write( DDR_REG_BASE + 0x51053*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51054*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x51055*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51056*4+0x02000000,0x23); +reg_write( DDR_REG_BASE + 0x51057*4+0x02000000,0xe816); +reg_write( DDR_REG_BASE + 0x51058*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE + 0x51059*4+0x02000000,0x44); +reg_write( DDR_REG_BASE + 0x5105a*4+0x02000000,0xb500); +reg_write( DDR_REG_BASE + 0x5105b*4+0x02000000,0xcb6); +reg_write( DDR_REG_BASE + 0x5105c*4+0x02000000,0x120); +reg_write( DDR_REG_BASE + 0x5105d*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x5105e*4+0x02000000,0xad04); +reg_write( DDR_REG_BASE + 0x5105f*4+0x02000000,0xcae); +reg_write( DDR_REG_BASE + 0x51060*4+0x02000000,0x120); +reg_write( DDR_REG_BASE + 0x51061*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x51062*4+0x02000000,0xad0c); +reg_write( DDR_REG_BASE + 0x51063*4+0x02000000,0xca6); +reg_write( DDR_REG_BASE + 0x51064*4+0x02000000,0x120); +reg_write( DDR_REG_BASE + 0x51065*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x51066*4+0x02000000,0xab00); +reg_write( DDR_REG_BASE + 0x51067*4+0x02000000,0xc9e); +reg_write( DDR_REG_BASE + 0x51068*4+0x02000000,0x120); +reg_write( DDR_REG_BASE + 0x51069*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x5106a*4+0x02000000,0xab08); +reg_write( DDR_REG_BASE + 0x5106b*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x5106c*4+0x02000000,0xb540); +reg_write( DDR_REG_BASE + 0x5106d*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x5106e*4+0x02000000,0xc2e2); +reg_write( DDR_REG_BASE + 0x5106f*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51070*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE + 0x51071*4+0x02000000,0x7c2); +reg_write( DDR_REG_BASE + 0x51072*4+0x02000000,0x4020); +reg_write( DDR_REG_BASE + 0x51073*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x51074*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51075*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE + 0x51076*4+0x02000000,0x8920); +reg_write( DDR_REG_BASE + 0x51077*4+0x02000000,0xea06); +reg_write( DDR_REG_BASE + 0x51078*4+0x02000000,0xba61); +reg_write( DDR_REG_BASE + 0x51079*4+0x02000000,0xa01); +reg_write( DDR_REG_BASE + 0x5107a*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x5107b*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x5107c*4+0x02000000,0x917); +reg_write( DDR_REG_BASE + 0x5107d*4+0x02000000,0x70); +reg_write( DDR_REG_BASE + 0x5107e*4+0x02000000,0x72ad); +reg_write( DDR_REG_BASE + 0x5107f*4+0x02000000,0x73ad); +reg_write( DDR_REG_BASE + 0x51080*4+0x02000000,0xe98e); +reg_write( DDR_REG_BASE + 0x51081*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51082*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE + 0x51083*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51084*4+0x02000000,0x23); +reg_write( DDR_REG_BASE + 0x51085*4+0x02000000,0x71ad); +reg_write( DDR_REG_BASE + 0x51086*4+0x02000000,0xf005); +reg_write( DDR_REG_BASE + 0x51087*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51088*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE + 0x51089*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5108a*4+0x02000000,0x49); +reg_write( DDR_REG_BASE + 0x5108b*4+0x02000000,0x782b); +reg_write( DDR_REG_BASE + 0x5108c*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x5108d*4+0x02000000,0xf20a); +reg_write( DDR_REG_BASE + 0x5108e*4+0x02000000,0xf12); +reg_write( DDR_REG_BASE + 0x5108f*4+0x02000000,0xff4f); +reg_write( DDR_REG_BASE + 0x51090*4+0x02000000,0xafa); +reg_write( DDR_REG_BASE + 0x51091*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE + 0x51092*4+0x02000000,0x40a1); +reg_write( DDR_REG_BASE + 0x51093*4+0x02000000,0xe5a); +reg_write( DDR_REG_BASE + 0x51094*4+0x02000000,0xff4f); +reg_write( DDR_REG_BASE + 0x51095*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x51096*4+0x02000000,0xc6c2); +reg_write( DDR_REG_BASE + 0x51097*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x51098*4+0x02000000,0xc0f1); +reg_write( DDR_REG_BASE + 0x51099*4+0x02000000,0xf72); +reg_write( DDR_REG_BASE + 0x5109a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5109b*4+0x02000000,0xc0d1); +reg_write( DDR_REG_BASE + 0x5109c*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x5109d*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x5109e*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x5109f*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x510a0*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x510a1*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x510a2*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE + 0x510a3*4+0x02000000,0x1e8); +reg_write( DDR_REG_BASE + 0x510a4*4+0x02000000,0x9020); +reg_write( DDR_REG_BASE + 0x510a5*4+0x02000000,0x2059); +reg_write( DDR_REG_BASE + 0x510a6*4+0x02000000,0xf40); +reg_write( DDR_REG_BASE + 0x510a7*4+0x02000000,0x7724); +reg_write( DDR_REG_BASE + 0x510a8*4+0x02000000,0x7930); +reg_write( DDR_REG_BASE + 0x510a9*4+0x02000000,0x793b); +reg_write( DDR_REG_BASE + 0x510aa*4+0x02000000,0x2155); +reg_write( DDR_REG_BASE + 0x510ab*4+0x02000000,0xc0d); +reg_write( DDR_REG_BASE + 0x510ac*4+0x02000000,0x2105); +reg_write( DDR_REG_BASE + 0x510ad*4+0x02000000,0xe); +reg_write( DDR_REG_BASE + 0x510ae*4+0x02000000,0x7d05); +reg_write( DDR_REG_BASE + 0x510af*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x510b0*4+0x02000000,0x111b); +reg_write( DDR_REG_BASE + 0x510b1*4+0x02000000,0x95e0); +reg_write( DDR_REG_BASE + 0x510b2*4+0x02000000,0x83a); +reg_write( DDR_REG_BASE + 0x510b3*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x510b4*4+0x02000000,0xd896); +reg_write( DDR_REG_BASE + 0x510b5*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x510b6*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x510b7*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x510b8*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x510b9*4+0x02000000,0x6822); +reg_write( DDR_REG_BASE + 0x510ba*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE + 0x510bb*4+0x02000000,0xb8e0); +reg_write( DDR_REG_BASE + 0x510bc*4+0x02000000,0x21ca); +reg_write( DDR_REG_BASE + 0x510bd*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x510be*4+0x02000000,0x782f); +reg_write( DDR_REG_BASE + 0x510bf*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x510c0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x510c1*4+0x02000000,0xff00); +reg_write( DDR_REG_BASE + 0x510c2*4+0x02000000,0x2304); +reg_write( DDR_REG_BASE + 0x510c3*4+0x02000000,0x305b); +reg_write( DDR_REG_BASE + 0x510c4*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x510c5*4+0x02000000,0x6c0); +reg_write( DDR_REG_BASE + 0x510c6*4+0x02000000,0x79e4); +reg_write( DDR_REG_BASE + 0x510c7*4+0x02000000,0xb600); +reg_write( DDR_REG_BASE + 0x510c8*4+0x02000000,0x2145); +reg_write( DDR_REG_BASE + 0x510c9*4+0x02000000,0x3c0); +reg_write( DDR_REG_BASE + 0x510ca*4+0x02000000,0xb500); +reg_write( DDR_REG_BASE + 0x510cb*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x510cc*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x510cd*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x510ce*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x510cf*4+0x02000000,0x7101); +reg_write( DDR_REG_BASE + 0x510d0*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x510d1*4+0x02000000,0x6); +reg_write( DDR_REG_BASE + 0x510d2*4+0x02000000,0x790c); +reg_write( DDR_REG_BASE + 0x510d3*4+0x02000000,0x2985); +reg_write( DDR_REG_BASE + 0x510d4*4+0x02000000,0x41f); +reg_write( DDR_REG_BASE + 0x510d5*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x510d6*4+0x02000000,0x6901); +reg_write( DDR_REG_BASE + 0x510d7*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x510d8*4+0x02000000,0x2042); +reg_write( DDR_REG_BASE + 0x510d9*4+0x02000000,0x701); +reg_write( DDR_REG_BASE + 0x510da*4+0x02000000,0x939); +reg_write( DDR_REG_BASE + 0x510db*4+0x02000000,0x454); +reg_write( DDR_REG_BASE + 0x510dc*4+0x02000000,0x889); +reg_write( DDR_REG_BASE + 0x510dd*4+0x02000000,0xc30); +reg_write( DDR_REG_BASE + 0x510de*4+0x02000000,0xd91a); +reg_write( DDR_REG_BASE + 0x510df*4+0x02000000,0x885); +reg_write( DDR_REG_BASE + 0x510e0*4+0x02000000,0xd70); +reg_write( DDR_REG_BASE + 0x510e1*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x510e2*4+0x02000000,0x87d); +reg_write( DDR_REG_BASE + 0x510e3*4+0x02000000,0xf30); +reg_write( DDR_REG_BASE + 0x510e4*4+0x02000000,0xd918); +reg_write( DDR_REG_BASE + 0x510e5*4+0x02000000,0xe0c5); +reg_write( DDR_REG_BASE + 0x510e6*4+0x02000000,0xf227); +reg_write( DDR_REG_BASE + 0x510e7*4+0x02000000,0xe0d0); +reg_write( DDR_REG_BASE + 0x510e8*4+0x02000000,0xf227); +reg_write( DDR_REG_BASE + 0x510e9*4+0x02000000,0xe0e0); +reg_write( DDR_REG_BASE + 0x510ea*4+0x02000000,0xf227); +reg_write( DDR_REG_BASE + 0x510eb*4+0x02000000,0xe0f8); +reg_write( DDR_REG_BASE + 0x510ec*4+0x02000000,0xf227); +reg_write( DDR_REG_BASE + 0x510ed*4+0x02000000,0x208c); +reg_write( DDR_REG_BASE + 0x510ee*4+0x02000000,0x8c03); +reg_write( DDR_REG_BASE + 0x510ef*4+0x02000000,0x722c); +reg_write( DDR_REG_BASE + 0x510f0*4+0x02000000,0xf230); +reg_write( DDR_REG_BASE + 0x510f1*4+0x02000000,0x208c); +reg_write( DDR_REG_BASE + 0x510f2*4+0x02000000,0x8802); +reg_write( DDR_REG_BASE + 0x510f3*4+0x02000000,0xf419); +reg_write( DDR_REG_BASE + 0x510f4*4+0x02000000,0x732c); +reg_write( DDR_REG_BASE + 0x510f5*4+0x02000000,0xf02c); +reg_write( DDR_REG_BASE + 0x510f6*4+0x02000000,0x2025); +reg_write( DDR_REG_BASE + 0x510f7*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x510f8*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE + 0x510f9*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE + 0x510fa*4+0x02000000,0xf01b); +reg_write( DDR_REG_BASE + 0x510fb*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE + 0x510fc*4+0x02000000,0xf01b); +reg_write( DDR_REG_BASE + 0x510fd*4+0x02000000,0xf00f); +reg_write( DDR_REG_BASE + 0x510fe*4+0x02000000,0xf01b); +reg_write( DDR_REG_BASE + 0x510ff*4+0x02000000,0xf00d); +reg_write( DDR_REG_BASE + 0x51100*4+0x02000000,0xf00b); +reg_write( DDR_REG_BASE + 0x51101*4+0x02000000,0xf01b); +reg_write( DDR_REG_BASE + 0x51102*4+0x02000000,0xf009); +reg_write( DDR_REG_BASE + 0x51103*4+0x02000000,0xf009); +reg_write( DDR_REG_BASE + 0x51104*4+0x02000000,0xf019); +reg_write( DDR_REG_BASE + 0x51105*4+0x02000000,0xf007); +reg_write( DDR_REG_BASE + 0x51106*4+0x02000000,0xf005); +reg_write( DDR_REG_BASE + 0x51107*4+0x02000000,0xf005); +reg_write( DDR_REG_BASE + 0x51108*4+0x02000000,0xf017); +reg_write( DDR_REG_BASE + 0x51109*4+0x02000000,0xd93f); +reg_write( DDR_REG_BASE + 0x5110a*4+0x02000000,0xf016); +reg_write( DDR_REG_BASE + 0x5110b*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x5110c*4+0x02000000,0xf014); +reg_write( DDR_REG_BASE + 0x5110d*4+0x02000000,0xd90b); +reg_write( DDR_REG_BASE + 0x5110e*4+0x02000000,0xf012); +reg_write( DDR_REG_BASE + 0x5110f*4+0x02000000,0xd90a); +reg_write( DDR_REG_BASE + 0x51110*4+0x02000000,0xf010); +reg_write( DDR_REG_BASE + 0x51111*4+0x02000000,0xd907); +reg_write( DDR_REG_BASE + 0x51112*4+0x02000000,0xf00e); +reg_write( DDR_REG_BASE + 0x51113*4+0x02000000,0xd908); +reg_write( DDR_REG_BASE + 0x51114*4+0x02000000,0xf00c); +reg_write( DDR_REG_BASE + 0x51115*4+0x02000000,0xd93e); +reg_write( DDR_REG_BASE + 0x51116*4+0x02000000,0xf00a); +reg_write( DDR_REG_BASE + 0x51117*4+0x02000000,0xd93b); +reg_write( DDR_REG_BASE + 0x51118*4+0x02000000,0xf008); +reg_write( DDR_REG_BASE + 0x51119*4+0x02000000,0xd93a); +reg_write( DDR_REG_BASE + 0x5111a*4+0x02000000,0xf006); +reg_write( DDR_REG_BASE + 0x5111b*4+0x02000000,0xd91f); +reg_write( DDR_REG_BASE + 0x5111c*4+0x02000000,0xf004); +reg_write( DDR_REG_BASE + 0x5111d*4+0x02000000,0xd938); +reg_write( DDR_REG_BASE + 0x5111e*4+0x02000000,0xf002); +reg_write( DDR_REG_BASE + 0x5111f*4+0x02000000,0xd91b); +reg_write( DDR_REG_BASE + 0x51120*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x51121*4+0x02000000,0x4020); +reg_write( DDR_REG_BASE + 0x51122*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x51123*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x51124*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x51125*4+0x02000000,0x2482); +reg_write( DDR_REG_BASE + 0x51126*4+0x02000000,0x330f); +reg_write( DDR_REG_BASE + 0x51127*4+0x02000000,0xa8e); +reg_write( DDR_REG_BASE + 0x51128*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x51129*4+0x02000000,0xc083); +reg_write( DDR_REG_BASE + 0x5112a*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x5112b*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x5112c*4+0x02000000,0xc083); +reg_write( DDR_REG_BASE + 0x5112d*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x5112e*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE + 0x5112f*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x51130*4+0x02000000,0x600); +reg_write( DDR_REG_BASE + 0x51131*4+0x02000000,0xd92); +reg_write( DDR_REG_BASE + 0x51132*4+0x02000000,0x1a0); +reg_write( DDR_REG_BASE + 0x51133*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x51134*4+0x02000000,0xc62); +reg_write( DDR_REG_BASE + 0x51135*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51136*4+0x02000000,0xb2a); +reg_write( DDR_REG_BASE + 0x51137*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x51138*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x51139*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x5113a*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x5113b*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x5113c*4+0x02000000,0xdc); +reg_write( DDR_REG_BASE + 0x5113d*4+0x02000000,0x315); +reg_write( DDR_REG_BASE + 0x5113e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5113f*4+0x02000000,0xe90b); +reg_write( DDR_REG_BASE + 0x51140*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51141*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE + 0x51142*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51143*4+0x02000000,0x49); +reg_write( DDR_REG_BASE + 0x51144*4+0x02000000,0x7034); +reg_write( DDR_REG_BASE + 0x51145*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51146*4+0x02000000,0xf40b); +reg_write( DDR_REG_BASE + 0x51147*4+0x02000000,0x2ff); +reg_write( DDR_REG_BASE + 0x51148*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51149*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x5114a*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE + 0x5114b*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5114c*4+0x02000000,0x23); +reg_write( DDR_REG_BASE + 0x5114d*4+0x02000000,0x7034); +reg_write( DDR_REG_BASE + 0x5114e*4+0x02000000,0x2ee); +reg_write( DDR_REG_BASE + 0x5114f*4+0x02000000,0x21); +reg_write( DDR_REG_BASE + 0x51150*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x51151*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE + 0x51152*4+0x02000000,0x976); +reg_write( DDR_REG_BASE + 0x51153*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE + 0x51154*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x51155*4+0x02000000,0x216f); +reg_write( DDR_REG_BASE + 0x51156*4+0x02000000,0xc3); +reg_write( DDR_REG_BASE + 0x51157*4+0x02000000,0x1100); +reg_write( DDR_REG_BASE + 0x51158*4+0x02000000,0xc0); +reg_write( DDR_REG_BASE + 0x51159*4+0x02000000,0x89c3); +reg_write( DDR_REG_BASE + 0x5115a*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x5115b*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x5115c*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x5115d*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE + 0x5115e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5115f*4+0x02000000,0x32c); +reg_write( DDR_REG_BASE + 0x51160*4+0x02000000,0xdd2); +reg_write( DDR_REG_BASE + 0x51161*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x51162*4+0x02000000,0xdaa0); +reg_write( DDR_REG_BASE + 0x51163*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x51164*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE + 0x51165*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51166*4+0x02000000,0x28c); +reg_write( DDR_REG_BASE + 0x51167*4+0x02000000,0xdc6); +reg_write( DDR_REG_BASE + 0x51168*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x51169*4+0x02000000,0xdaa0); +reg_write( DDR_REG_BASE + 0x5116a*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x5116b*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE + 0x5116c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5116d*4+0x02000000,0x1ec); +reg_write( DDR_REG_BASE + 0x5116e*4+0x02000000,0xdb6); +reg_write( DDR_REG_BASE + 0x5116f*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x51170*4+0x02000000,0xdaa0); +reg_write( DDR_REG_BASE + 0x51171*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x51172*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE + 0x51173*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51174*4+0x02000000,0x14c); +reg_write( DDR_REG_BASE + 0x51175*4+0x02000000,0xdaa); +reg_write( DDR_REG_BASE + 0x51176*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x51177*4+0x02000000,0xdaa0); +reg_write( DDR_REG_BASE + 0x51178*4+0x02000000,0x261a); +reg_write( DDR_REG_BASE + 0x51179*4+0x02000000,0x1f8e); +reg_write( DDR_REG_BASE + 0x5117a*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x5117b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5117c*4+0x02000000,0x4338); +reg_write( DDR_REG_BASE + 0x5117d*4+0x02000000,0xf072); +reg_write( DDR_REG_BASE + 0x5117e*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x5117f*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE + 0x51180*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51181*4+0x02000000,0x124); +reg_write( DDR_REG_BASE + 0x51182*4+0x02000000,0xd8e); +reg_write( DDR_REG_BASE + 0x51183*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x51184*4+0x02000000,0xda28); +reg_write( DDR_REG_BASE + 0x51185*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE + 0x51186*4+0x02000000,0x3fc0); +reg_write( DDR_REG_BASE + 0x51187*4+0x02000000,0xd86); +reg_write( DDR_REG_BASE + 0x51188*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x51189*4+0x02000000,0xda28); +reg_write( DDR_REG_BASE + 0x5118a*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE + 0x5118b*4+0x02000000,0x3d40); +reg_write( DDR_REG_BASE + 0x5118c*4+0x02000000,0xd7a); +reg_write( DDR_REG_BASE + 0x5118d*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x5118e*4+0x02000000,0xda28); +reg_write( DDR_REG_BASE + 0x5118f*4+0x02000000,0x2355); +reg_write( DDR_REG_BASE + 0x51190*4+0x02000000,0x3800); +reg_write( DDR_REG_BASE + 0x51191*4+0x02000000,0x78c5); +reg_write( DDR_REG_BASE + 0x51192*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x51193*4+0x02000000,0x3f81); +reg_write( DDR_REG_BASE + 0x51194*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51195*4+0x02000000,0x124); +reg_write( DDR_REG_BASE + 0x51196*4+0x02000000,0xb86); +reg_write( DDR_REG_BASE + 0x51197*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x51198*4+0x02000000,0x724c); +reg_write( DDR_REG_BASE + 0x51199*4+0x02000000,0x2355); +reg_write( DDR_REG_BASE + 0x5119a*4+0x02000000,0x38c0); +reg_write( DDR_REG_BASE + 0x5119b*4+0x02000000,0x78c5); +reg_write( DDR_REG_BASE + 0x5119c*4+0x02000000,0xb7a); +reg_write( DDR_REG_BASE + 0x5119d*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x5119e*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE + 0x5119f*4+0x02000000,0x3fc1); +reg_write( DDR_REG_BASE + 0x511a0*4+0x02000000,0x2355); +reg_write( DDR_REG_BASE + 0x511a1*4+0x02000000,0x3d00); +reg_write( DDR_REG_BASE + 0x511a2*4+0x02000000,0x78c5); +reg_write( DDR_REG_BASE + 0x511a3*4+0x02000000,0xb6e); +reg_write( DDR_REG_BASE + 0x511a4*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x511a5*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE + 0x511a6*4+0x02000000,0x3d41); +reg_write( DDR_REG_BASE + 0x511a7*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x511a8*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x511a9*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE + 0x511aa*4+0x02000000,0x1003); +reg_write( DDR_REG_BASE + 0x511ab*4+0x02000000,0x8b); +reg_write( DDR_REG_BASE + 0x511ac*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x511ad*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x511ae*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE + 0x511af*4+0x02000000,0x8862); +reg_write( DDR_REG_BASE + 0x511b0*4+0x02000000,0xf03b); +reg_write( DDR_REG_BASE + 0x511b1*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x511b2*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE + 0x511b3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x511b4*4+0x02000000,0x124); +reg_write( DDR_REG_BASE + 0x511b5*4+0x02000000,0x20f4); +reg_write( DDR_REG_BASE + 0x511b6*4+0x02000000,0xde); +reg_write( DDR_REG_BASE + 0x511b7*4+0x02000000,0xd26); +reg_write( DDR_REG_BASE + 0x511b8*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x511b9*4+0x02000000,0x200a); +reg_write( DDR_REG_BASE + 0x511ba*4+0x02000000,0x780); +reg_write( DDR_REG_BASE + 0x511bb*4+0x02000000,0x4708); +reg_write( DDR_REG_BASE + 0x511bc*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE + 0x511bd*4+0x02000000,0x3fc0); +reg_write( DDR_REG_BASE + 0x511be*4+0x02000000,0x20f4); +reg_write( DDR_REG_BASE + 0x511bf*4+0x02000000,0xcd); +reg_write( DDR_REG_BASE + 0x511c0*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE + 0x511c1*4+0x02000000,0x3d40); +reg_write( DDR_REG_BASE + 0x511c2*4+0x02000000,0x20f4); +reg_write( DDR_REG_BASE + 0x511c3*4+0x02000000,0xc0); +reg_write( DDR_REG_BASE + 0x511c4*4+0x02000000,0xbdc5); +reg_write( DDR_REG_BASE + 0x511c5*4+0x02000000,0xd0a); +reg_write( DDR_REG_BASE + 0x511c6*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x511c7*4+0x02000000,0x65fd); +reg_write( DDR_REG_BASE + 0x511c8*4+0x02000000,0x235a); +reg_write( DDR_REG_BASE + 0x511c9*4+0x02000000,0x3a02); +reg_write( DDR_REG_BASE + 0x511ca*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x511cb*4+0x02000000,0x3f81); +reg_write( DDR_REG_BASE + 0x511cc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x511cd*4+0x02000000,0x32c); +reg_write( DDR_REG_BASE + 0x511ce*4+0x02000000,0x6159); +reg_write( DDR_REG_BASE + 0x511cf*4+0x02000000,0x7974); +reg_write( DDR_REG_BASE + 0x511d0*4+0x02000000,0xb1a0); +reg_write( DDR_REG_BASE + 0x511d1*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x511d2*4+0x02000000,0x3f81); +reg_write( DDR_REG_BASE + 0x511d3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x511d4*4+0x02000000,0x28c); +reg_write( DDR_REG_BASE + 0x511d5*4+0x02000000,0x615c); +reg_write( DDR_REG_BASE + 0x511d6*4+0x02000000,0x212f); +reg_write( DDR_REG_BASE + 0x511d7*4+0x02000000,0x782); +reg_write( DDR_REG_BASE + 0x511d8*4+0x02000000,0x7c74); +reg_write( DDR_REG_BASE + 0x511d9*4+0x02000000,0x216c); +reg_write( DDR_REG_BASE + 0x511da*4+0x02000000,0x101); +reg_write( DDR_REG_BASE + 0x511db*4+0x02000000,0xb420); +reg_write( DDR_REG_BASE + 0x511dc*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x511dd*4+0x02000000,0x3f81); +reg_write( DDR_REG_BASE + 0x511de*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x511df*4+0x02000000,0x1ec); +reg_write( DDR_REG_BASE + 0x511e0*4+0x02000000,0x6159); +reg_write( DDR_REG_BASE + 0x511e1*4+0x02000000,0x7974); +reg_write( DDR_REG_BASE + 0x511e2*4+0x02000000,0xb1e0); +reg_write( DDR_REG_BASE + 0x511e3*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x511e4*4+0x02000000,0x3f81); +reg_write( DDR_REG_BASE + 0x511e5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x511e6*4+0x02000000,0x14c); +reg_write( DDR_REG_BASE + 0x511e7*4+0x02000000,0x6159); +reg_write( DDR_REG_BASE + 0x511e8*4+0x02000000,0x7974); +reg_write( DDR_REG_BASE + 0x511e9*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE + 0x511ea*4+0x02000000,0x7164); +reg_write( DDR_REG_BASE + 0x511eb*4+0x02000000,0xb8f); +reg_write( DDR_REG_BASE + 0x511ec*4+0x02000000,0x90c5); +reg_write( DDR_REG_BASE + 0x511ed*4+0x02000000,0x7167); +reg_write( DDR_REG_BASE + 0x511ee*4+0x02000000,0xb21); +reg_write( DDR_REG_BASE + 0x511ef*4+0x02000000,0xb134); +reg_write( DDR_REG_BASE + 0x511f0*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x511f1*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x511f2*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x511f3*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x511f4*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE + 0x511f5*4+0x02000000,0xd92e); +reg_write( DDR_REG_BASE + 0x511f6*4+0x02000000,0xb99f); +reg_write( DDR_REG_BASE + 0x511f7*4+0x02000000,0x2140); +reg_write( DDR_REG_BASE + 0x511f8*4+0x02000000,0x98e); +reg_write( DDR_REG_BASE + 0x511f9*4+0x02000000,0x7014); +reg_write( DDR_REG_BASE + 0x511fa*4+0x02000000,0x2642); +reg_write( DDR_REG_BASE + 0x511fb*4+0x02000000,0x1283); +reg_write( DDR_REG_BASE + 0x511fc*4+0x02000000,0x2142); +reg_write( DDR_REG_BASE + 0x511fd*4+0x02000000,0x280); +reg_write( DDR_REG_BASE + 0x511fe*4+0x02000000,0x23ca); +reg_write( DDR_REG_BASE + 0x511ff*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x51200*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x51201*4+0x02000000,0x26ca); +reg_write( DDR_REG_BASE + 0x51202*4+0x02000000,0x1041); +reg_write( DDR_REG_BASE + 0x51203*4+0x02000000,0x4308); +reg_write( DDR_REG_BASE + 0x51204*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x51205*4+0x02000000,0xf05e); +reg_write( DDR_REG_BASE + 0x51206*4+0x02000000,0xdb1); +reg_write( DDR_REG_BASE + 0x51207*4+0x02000000,0x12e0); +reg_write( DDR_REG_BASE + 0x51208*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x51209*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x5120a*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5120b*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE + 0x5120c*4+0x02000000,0x1003); +reg_write( DDR_REG_BASE + 0x5120d*4+0x02000000,0x9f); +reg_write( DDR_REG_BASE + 0x5120e*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x5120f*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51210*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE + 0x51211*4+0x02000000,0x8882); +reg_write( DDR_REG_BASE + 0x51212*4+0x02000000,0xba8f); +reg_write( DDR_REG_BASE + 0x51213*4+0x02000000,0x4358); +reg_write( DDR_REG_BASE + 0x51214*4+0x02000000,0xf031); +reg_write( DDR_REG_BASE + 0x51215*4+0x02000000,0x255a); +reg_write( DDR_REG_BASE + 0x51216*4+0x02000000,0x1a0f); +reg_write( DDR_REG_BASE + 0x51217*4+0x02000000,0xc101); +reg_write( DDR_REG_BASE + 0x51218*4+0x02000000,0x921); +reg_write( DDR_REG_BASE + 0x51219*4+0x02000000,0x32); +reg_write( DDR_REG_BASE + 0x5121a*4+0x02000000,0x235a); +reg_write( DDR_REG_BASE + 0x5121b*4+0x02000000,0x1a00); +reg_write( DDR_REG_BASE + 0x5121c*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x5121d*4+0x02000000,0x3f81); +reg_write( DDR_REG_BASE + 0x5121e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5121f*4+0x02000000,0x28c); +reg_write( DDR_REG_BASE + 0x51220*4+0x02000000,0x61f9); +reg_write( DDR_REG_BASE + 0x51221*4+0x02000000,0x21f4); +reg_write( DDR_REG_BASE + 0x51222*4+0x02000000,0x302); +reg_write( DDR_REG_BASE + 0x51223*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x51224*4+0x02000000,0x3f81); +reg_write( DDR_REG_BASE + 0x51225*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51226*4+0x02000000,0x32c); +reg_write( DDR_REG_BASE + 0x51227*4+0x02000000,0xf009); +reg_write( DDR_REG_BASE + 0x51228*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x51229*4+0x02000000,0x3f81); +reg_write( DDR_REG_BASE + 0x5122a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5122b*4+0x02000000,0x1ec); +reg_write( DDR_REG_BASE + 0x5122c*4+0x02000000,0x61fa); +reg_write( DDR_REG_BASE + 0x5122d*4+0x02000000,0x22f4); +reg_write( DDR_REG_BASE + 0x5122e*4+0x02000000,0x302); +reg_write( DDR_REG_BASE + 0x5122f*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x51230*4+0x02000000,0x21f4); +reg_write( DDR_REG_BASE + 0x51231*4+0x02000000,0x301); +reg_write( DDR_REG_BASE + 0x51232*4+0x02000000,0x7942); +reg_write( DDR_REG_BASE + 0x51233*4+0x02000000,0x2608); +reg_write( DDR_REG_BASE + 0x51234*4+0x02000000,0x3042); +reg_write( DDR_REG_BASE + 0x51235*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x51236*4+0x02000000,0x3f81); +reg_write( DDR_REG_BASE + 0x51237*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51238*4+0x02000000,0x14c); +reg_write( DDR_REG_BASE + 0x51239*4+0x02000000,0x673f); +reg_write( DDR_REG_BASE + 0x5123a*4+0x02000000,0x6038); +reg_write( DDR_REG_BASE + 0x5123b*4+0x02000000,0x27f4); +reg_write( DDR_REG_BASE + 0x5123c*4+0x02000000,0x130f); +reg_write( DDR_REG_BASE + 0x5123d*4+0x02000000,0x20f4); +reg_write( DDR_REG_BASE + 0x5123e*4+0x02000000,0x300); +reg_write( DDR_REG_BASE + 0x5123f*4+0x02000000,0x212f); +reg_write( DDR_REG_BASE + 0x51240*4+0x02000000,0x6c6); +reg_write( DDR_REG_BASE + 0x51241*4+0x02000000,0x7185); +reg_write( DDR_REG_BASE + 0x51242*4+0x02000000,0x78e2); +reg_write( DDR_REG_BASE + 0x51243*4+0x02000000,0x2108); +reg_write( DDR_REG_BASE + 0x51244*4+0x02000000,0x1b); +reg_write( DDR_REG_BASE + 0x51245*4+0x02000000,0xfa3); +reg_write( DDR_REG_BASE + 0x51246*4+0x02000000,0xb325); +reg_write( DDR_REG_BASE + 0x51247*4+0x02000000,0x262f); +reg_write( DDR_REG_BASE + 0x51248*4+0x02000000,0x3086); +reg_write( DDR_REG_BASE + 0x51249*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x5124a*4+0x02000000,0x80f); +reg_write( DDR_REG_BASE + 0x5124b*4+0x02000000,0x32); +reg_write( DDR_REG_BASE + 0x5124c*4+0x02000000,0x200a); +reg_write( DDR_REG_BASE + 0x5124d*4+0x02000000,0x780); +reg_write( DDR_REG_BASE + 0x5124e*4+0x02000000,0xb5e); +reg_write( DDR_REG_BASE + 0x5124f*4+0x02000000,0xff4f); +reg_write( DDR_REG_BASE + 0x51250*4+0x02000000,0xf005); +reg_write( DDR_REG_BASE + 0x51251*4+0x02000000,0xb12); +reg_write( DDR_REG_BASE + 0x51252*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x51253*4+0x02000000,0x200a); +reg_write( DDR_REG_BASE + 0x51254*4+0x02000000,0x780); +reg_write( DDR_REG_BASE + 0x51255*4+0x02000000,0x4100); +reg_write( DDR_REG_BASE + 0x51256*4+0x02000000,0xb06); +reg_write( DDR_REG_BASE + 0x51257*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x51258*4+0x02000000,0x202f); +reg_write( DDR_REG_BASE + 0x51259*4+0x02000000,0x6c6); +reg_write( DDR_REG_BASE + 0x5125a*4+0x02000000,0x1b01); +reg_write( DDR_REG_BASE + 0x5125b*4+0x02000000,0x52); +reg_write( DDR_REG_BASE + 0x5125c*4+0x02000000,0x1e01); +reg_write( DDR_REG_BASE + 0x5125d*4+0x02000000,0x1012); +reg_write( DDR_REG_BASE + 0x5125e*4+0x02000000,0x77a5); +reg_write( DDR_REG_BASE + 0x5125f*4+0x02000000,0xd51); +reg_write( DDR_REG_BASE + 0x51260*4+0x02000000,0x9013); +reg_write( DDR_REG_BASE + 0x51261*4+0x02000000,0x7765); +reg_write( DDR_REG_BASE + 0x51262*4+0x02000000,0xbfb); +reg_write( DDR_REG_BASE + 0x51263*4+0x02000000,0x9033); +reg_write( DDR_REG_BASE + 0x51264*4+0x02000000,0x71ad); +reg_write( DDR_REG_BASE + 0x51265*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51266*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x51267*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51268*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE + 0x51269*4+0x02000000,0xd92a); +reg_write( DDR_REG_BASE + 0x5126a*4+0x02000000,0xb99f); +reg_write( DDR_REG_BASE + 0x5126b*4+0x02000000,0x2140); +reg_write( DDR_REG_BASE + 0x5126c*4+0x02000000,0x98b); +reg_write( DDR_REG_BASE + 0x5126d*4+0x02000000,0x7014); +reg_write( DDR_REG_BASE + 0x5126e*4+0x02000000,0x2342); +reg_write( DDR_REG_BASE + 0x5126f*4+0x02000000,0x1100); +reg_write( DDR_REG_BASE + 0x51270*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x51271*4+0x02000000,0x23ca); +reg_write( DDR_REG_BASE + 0x51272*4+0x02000000,0x1041); +reg_write( DDR_REG_BASE + 0x51273*4+0x02000000,0x690c); +reg_write( DDR_REG_BASE + 0x51274*4+0x02000000,0xc101); +reg_write( DDR_REG_BASE + 0x51275*4+0x02000000,0x21ca); +reg_write( DDR_REG_BASE + 0x51276*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x51277*4+0x02000000,0xc141); +reg_write( DDR_REG_BASE + 0x51278*4+0x02000000,0xf045); +reg_write( DDR_REG_BASE + 0x51279*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x5127a*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5127b*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE + 0x5127c*4+0x02000000,0x1003); +reg_write( DDR_REG_BASE + 0x5127d*4+0x02000000,0x9e); +reg_write( DDR_REG_BASE + 0x5127e*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x5127f*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51280*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE + 0x51281*4+0x02000000,0x8842); +reg_write( DDR_REG_BASE + 0x51282*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x51283*4+0x02000000,0xb88f); +reg_write( DDR_REG_BASE + 0x51284*4+0x02000000,0x4100); +reg_write( DDR_REG_BASE + 0x51285*4+0x02000000,0xf023); +reg_write( DDR_REG_BASE + 0x51286*4+0x02000000,0xc602); +reg_write( DDR_REG_BASE + 0x51287*4+0x02000000,0x235a); +reg_write( DDR_REG_BASE + 0x51288*4+0x02000000,0x3a0c); +reg_write( DDR_REG_BASE + 0x51289*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x5128a*4+0x02000000,0x3f8d); +reg_write( DDR_REG_BASE + 0x5128b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5128c*4+0x02000000,0x1ec); +reg_write( DDR_REG_BASE + 0x5128d*4+0x02000000,0x265a); +reg_write( DDR_REG_BASE + 0x5128e*4+0x02000000,0x1a0e); +reg_write( DDR_REG_BASE + 0x5128f*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x51290*4+0x02000000,0x3f8f); +reg_write( DDR_REG_BASE + 0x51291*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51292*4+0x02000000,0x14c); +reg_write( DDR_REG_BASE + 0x51293*4+0x02000000,0x6599); +reg_write( DDR_REG_BASE + 0x51294*4+0x02000000,0x21f4); +reg_write( DDR_REG_BASE + 0x51295*4+0x02000000,0x9f); +reg_write( DDR_REG_BASE + 0x51296*4+0x02000000,0x67d9); +reg_write( DDR_REG_BASE + 0x51297*4+0x02000000,0x21f4); +reg_write( DDR_REG_BASE + 0x51298*4+0x02000000,0x81); +reg_write( DDR_REG_BASE + 0x51299*4+0x02000000,0x64fc); +reg_write( DDR_REG_BASE + 0x5129a*4+0x02000000,0x65dd); +reg_write( DDR_REG_BASE + 0x5129b*4+0x02000000,0x2102); +reg_write( DDR_REG_BASE + 0x5129c*4+0x02000000,0x7c1); +reg_write( DDR_REG_BASE + 0x5129d*4+0x02000000,0x2308); +reg_write( DDR_REG_BASE + 0x5129e*4+0x02000000,0x41); +reg_write( DDR_REG_BASE + 0x5129f*4+0x02000000,0x24f4); +reg_write( DDR_REG_BASE + 0x512a0*4+0x02000000,0x108c); +reg_write( DDR_REG_BASE + 0x512a1*4+0x02000000,0x25f4); +reg_write( DDR_REG_BASE + 0x512a2*4+0x02000000,0x1083); +reg_write( DDR_REG_BASE + 0x512a3*4+0x02000000,0x7144); +reg_write( DDR_REG_BASE + 0x512a4*4+0x02000000,0x7b82); +reg_write( DDR_REG_BASE + 0x512a5*4+0x02000000,0x2008); +reg_write( DDR_REG_BASE + 0x512a6*4+0x02000000,0xc0); +reg_write( DDR_REG_BASE + 0x512a7*4+0x02000000,0x780e); +reg_write( DDR_REG_BASE + 0x512a8*4+0x02000000,0xebd); +reg_write( DDR_REG_BASE + 0x512a9*4+0x02000000,0xb0a5); +reg_write( DDR_REG_BASE + 0x512aa*4+0x02000000,0x7b2e); +reg_write( DDR_REG_BASE + 0x512ab*4+0x02000000,0xa5e); +reg_write( DDR_REG_BASE + 0x512ac*4+0x02000000,0xff4f); +reg_write( DDR_REG_BASE + 0x512ad*4+0x02000000,0x4200); +reg_write( DDR_REG_BASE + 0x512ae*4+0x02000000,0xa56); +reg_write( DDR_REG_BASE + 0x512af*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x512b0*4+0x02000000,0x4060); +reg_write( DDR_REG_BASE + 0x512b1*4+0x02000000,0xc101); +reg_write( DDR_REG_BASE + 0x512b2*4+0x02000000,0x7767); +reg_write( DDR_REG_BASE + 0x512b3*4+0x02000000,0x1901); +reg_write( DDR_REG_BASE + 0x512b4*4+0x02000000,0x92); +reg_write( DDR_REG_BASE + 0x512b5*4+0x02000000,0xc141); +reg_write( DDR_REG_BASE + 0x512b6*4+0x02000000,0x1b01); +reg_write( DDR_REG_BASE + 0x512b7*4+0x02000000,0x1012); +reg_write( DDR_REG_BASE + 0x512b8*4+0x02000000,0xb83); +reg_write( DDR_REG_BASE + 0x512b9*4+0x02000000,0xb013); +reg_write( DDR_REG_BASE + 0x512ba*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE + 0x512bb*4+0x02000000,0x7704); +reg_write( DDR_REG_BASE + 0x512bc*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x512bd*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE + 0x512be*4+0x02000000,0x8f5); +reg_write( DDR_REG_BASE + 0x512bf*4+0x02000000,0x8033); +reg_write( DDR_REG_BASE + 0x512c0*4+0x02000000,0x716f); +reg_write( DDR_REG_BASE + 0x512c1*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x512c2*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE + 0x512c3*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x512c4*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE + 0x512c5*4+0x02000000,0x6901); +reg_write( DDR_REG_BASE + 0x512c6*4+0x02000000,0x790f); +reg_write( DDR_REG_BASE + 0x512c7*4+0x02000000,0x7134); +reg_write( DDR_REG_BASE + 0x512c8*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x512c9*4+0x02000000,0x7002); +reg_write( DDR_REG_BASE + 0x512ca*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x512cb*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE + 0x512cc*4+0x02000000,0x4e6); +reg_write( DDR_REG_BASE + 0x512cd*4+0x02000000,0xffce); +reg_write( DDR_REG_BASE + 0x512ce*4+0x02000000,0xe7e); +reg_write( DDR_REG_BASE + 0x512cf*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x512d0*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE + 0x512d1*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x512d2*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x512d3*4+0x02000000,0x7344); +reg_write( DDR_REG_BASE + 0x512d4*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x512d5*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE + 0x512d6*4+0x02000000,0xe8a); +reg_write( DDR_REG_BASE + 0x512d7*4+0x02000000,0xc0); +reg_write( DDR_REG_BASE + 0x512d8*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x512d9*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x512da*4+0x02000000,0xe174); +reg_write( DDR_REG_BASE + 0x512db*4+0x02000000,0xb0a0); +reg_write( DDR_REG_BASE + 0x512dc*4+0x02000000,0xf32); +reg_write( DDR_REG_BASE + 0x512dd*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x512de*4+0x02000000,0xb0a1); +reg_write( DDR_REG_BASE + 0x512df*4+0x02000000,0x2480); +reg_write( DDR_REG_BASE + 0x512e0*4+0x02000000,0x330f); +reg_write( DDR_REG_BASE + 0x512e1*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x512e2*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x512e3*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x512e4*4+0x02000000,0xc2e4); +reg_write( DDR_REG_BASE + 0x512e5*4+0x02000000,0xc1a4); +reg_write( DDR_REG_BASE + 0x512e6*4+0x02000000,0x4608); +reg_write( DDR_REG_BASE + 0x512e7*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x512e8*4+0x02000000,0xe42); +reg_write( DDR_REG_BASE + 0x512e9*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x512ea*4+0x02000000,0xd9ff); +reg_write( DDR_REG_BASE + 0x512eb*4+0x02000000,0x1200); +reg_write( DDR_REG_BASE + 0x512ec*4+0x02000000,0x3083); +reg_write( DDR_REG_BASE + 0x512ed*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x512ee*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x512ef*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x512f0*4+0x02000000,0x4528); +reg_write( DDR_REG_BASE + 0x512f1*4+0x02000000,0xc143); +reg_write( DDR_REG_BASE + 0x512f2*4+0x02000000,0xc142); +reg_write( DDR_REG_BASE + 0x512f3*4+0x02000000,0xc141); +reg_write( DDR_REG_BASE + 0x512f4*4+0x02000000,0xf02); +reg_write( DDR_REG_BASE + 0x512f5*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x512f6*4+0x02000000,0xc140); +reg_write( DDR_REG_BASE + 0x512f7*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x512f8*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE + 0x512f9*4+0x02000000,0x764c); +reg_write( DDR_REG_BASE + 0x512fa*4+0x02000000,0xdb20); +reg_write( DDR_REG_BASE + 0x512fb*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x512fc*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x512fd*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x512fe*4+0x02000000,0xeee); +reg_write( DDR_REG_BASE + 0x512ff*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x51300*4+0x02000000,0x1c00); +reg_write( DDR_REG_BASE + 0x51301*4+0x02000000,0x3041); +reg_write( DDR_REG_BASE + 0x51302*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x51303*4+0x02000000,0xea6); +reg_write( DDR_REG_BASE + 0x51304*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x51305*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51306*4+0x02000000,0xc0a4); +reg_write( DDR_REG_BASE + 0x51307*4+0x02000000,0xc6c4); +reg_write( DDR_REG_BASE + 0x51308*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x51309*4+0x02000000,0xc1a4); +reg_write( DDR_REG_BASE + 0x5130a*4+0x02000000,0xd849); +reg_write( DDR_REG_BASE + 0x5130b*4+0x02000000,0xb89f); +reg_write( DDR_REG_BASE + 0x5130c*4+0x02000000,0x88e0); +reg_write( DDR_REG_BASE + 0x5130d*4+0x02000000,0x10da); +reg_write( DDR_REG_BASE + 0x5130e*4+0x02000000,0x808e); +reg_write( DDR_REG_BASE + 0x5130f*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x51310*4+0x02000000,0xdf2); +reg_write( DDR_REG_BASE + 0x51311*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x51312*4+0x02000000,0xd9ff); +reg_write( DDR_REG_BASE + 0x51313*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x51314*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x51315*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x51316*4+0x02000000,0x736c); +reg_write( DDR_REG_BASE + 0x51317*4+0x02000000,0x4528); +reg_write( DDR_REG_BASE + 0x51318*4+0x02000000,0xc143); +reg_write( DDR_REG_BASE + 0x51319*4+0x02000000,0xc142); +reg_write( DDR_REG_BASE + 0x5131a*4+0x02000000,0xc141); +reg_write( DDR_REG_BASE + 0x5131b*4+0x02000000,0xeb6); +reg_write( DDR_REG_BASE + 0x5131c*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x5131d*4+0x02000000,0xc140); +reg_write( DDR_REG_BASE + 0x5131e*4+0x02000000,0x7ee5); +reg_write( DDR_REG_BASE + 0x5131f*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x51320*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE + 0x51321*4+0x02000000,0xda09); +reg_write( DDR_REG_BASE + 0x51322*4+0x02000000,0xdb20); +reg_write( DDR_REG_BASE + 0x51323*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x51324*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x51325*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x51326*4+0x02000000,0xe9e); +reg_write( DDR_REG_BASE + 0x51327*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x51328*4+0x02000000,0x1c00); +reg_write( DDR_REG_BASE + 0x51329*4+0x02000000,0x3041); +reg_write( DDR_REG_BASE + 0x5132a*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x5132b*4+0x02000000,0xe56); +reg_write( DDR_REG_BASE + 0x5132c*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x5132d*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x5132e*4+0x02000000,0xc0a4); +reg_write( DDR_REG_BASE + 0x5132f*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x51330*4+0x02000000,0x21aa); +reg_write( DDR_REG_BASE + 0x51331*4+0x02000000,0xc4); +reg_write( DDR_REG_BASE + 0x51332*4+0x02000000,0x911); +reg_write( DDR_REG_BASE + 0x51333*4+0x02000000,0x3f); +reg_write( DDR_REG_BASE + 0x51334*4+0x02000000,0x722c); +reg_write( DDR_REG_BASE + 0x51335*4+0x02000000,0x21ab); +reg_write( DDR_REG_BASE + 0x51336*4+0x02000000,0xc4); +reg_write( DDR_REG_BASE + 0x51337*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51338*4+0x02000000,0x21ab); +reg_write( DDR_REG_BASE + 0x51339*4+0x02000000,0xc4); +reg_write( DDR_REG_BASE + 0x5133a*4+0x02000000,0x80f); +reg_write( DDR_REG_BASE + 0x5133b*4+0x02000000,0x415); +reg_write( DDR_REG_BASE + 0x5133c*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x5133d*4+0x02000000,0x7100); +reg_write( DDR_REG_BASE + 0x5133e*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE + 0x5133f*4+0x02000000,0x1d6); +reg_write( DDR_REG_BASE + 0x51340*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x51341*4+0x02000000,0x21aa); +reg_write( DDR_REG_BASE + 0x51342*4+0x02000000,0x104); +reg_write( DDR_REG_BASE + 0x51343*4+0x02000000,0x7b32); +reg_write( DDR_REG_BASE + 0x51344*4+0x02000000,0xb19); +reg_write( DDR_REG_BASE + 0x51345*4+0x02000000,0x25); +reg_write( DDR_REG_BASE + 0x51346*4+0x02000000,0x24aa); +reg_write( DDR_REG_BASE + 0x51347*4+0x02000000,0x1144); +reg_write( DDR_REG_BASE + 0x51348*4+0x02000000,0x22aa); +reg_write( DDR_REG_BASE + 0x51349*4+0x02000000,0x104); +reg_write( DDR_REG_BASE + 0x5134a*4+0x02000000,0x9fd); +reg_write( DDR_REG_BASE + 0x5134b*4+0x02000000,0x8084); +reg_write( DDR_REG_BASE + 0x5134c*4+0x02000000,0x7862); +reg_write( DDR_REG_BASE + 0x5134d*4+0x02000000,0x24aa); +reg_write( DDR_REG_BASE + 0x5134e*4+0x02000000,0x1144); +reg_write( DDR_REG_BASE + 0x5134f*4+0x02000000,0xf003); +reg_write( DDR_REG_BASE + 0x51350*4+0x02000000,0x6038); +reg_write( DDR_REG_BASE + 0x51351*4+0x02000000,0x21aa); +reg_write( DDR_REG_BASE + 0x51352*4+0x02000000,0x104); +reg_write( DDR_REG_BASE + 0x51353*4+0x02000000,0x7110); +reg_write( DDR_REG_BASE + 0x51354*4+0x02000000,0x20e1); +reg_write( DDR_REG_BASE + 0x51355*4+0x02000000,0x7c6); +reg_write( DDR_REG_BASE + 0x51356*4+0x02000000,0x22aa); +reg_write( DDR_REG_BASE + 0x51357*4+0x02000000,0x144); +reg_write( DDR_REG_BASE + 0x51358*4+0x02000000,0xcf3); +reg_write( DDR_REG_BASE + 0x51359*4+0x02000000,0x9080); +reg_write( DDR_REG_BASE + 0x5135a*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x5135b*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x5135c*4+0x02000000,0xc0f1); +reg_write( DDR_REG_BASE + 0x5135d*4+0x02000000,0x822); +reg_write( DDR_REG_BASE + 0x5135e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5135f*4+0x02000000,0xfa6); +reg_write( DDR_REG_BASE + 0x51360*4+0x02000000,0xffcf); +reg_write( DDR_REG_BASE + 0x51361*4+0x02000000,0xc0d1); +reg_write( DDR_REG_BASE + 0x51362*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x51363*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x51364*4+0x02000000,0xc0f1); +reg_write( DDR_REG_BASE + 0x51365*4+0x02000000,0xf4a); +reg_write( DDR_REG_BASE + 0x51366*4+0x02000000,0xffcf); +reg_write( DDR_REG_BASE + 0x51367*4+0x02000000,0xf96); +reg_write( DDR_REG_BASE + 0x51368*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x51369*4+0x02000000,0xd814); +reg_write( DDR_REG_BASE + 0x5136a*4+0x02000000,0xc0d1); +reg_write( DDR_REG_BASE + 0x5136b*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x5136c*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x5136d*4+0x02000000,0x7103); +reg_write( DDR_REG_BASE + 0x5136e*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5136f*4+0x02000000,0x6); +reg_write( DDR_REG_BASE + 0x51370*4+0x02000000,0x231a); +reg_write( DDR_REG_BASE + 0x51371*4+0x02000000,0x2); +reg_write( DDR_REG_BASE + 0x51372*4+0x02000000,0x2a05); +reg_write( DDR_REG_BASE + 0x51373*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE + 0x51374*4+0x02000000,0x1e); +reg_write( DDR_REG_BASE + 0x51375*4+0x02000000,0x8480); +reg_write( DDR_REG_BASE + 0x51376*4+0x02000000,0x815); +reg_write( DDR_REG_BASE + 0x51377*4+0x02000000,0xf84); +reg_write( DDR_REG_BASE + 0x51378*4+0x02000000,0x3); +reg_write( DDR_REG_BASE + 0x51379*4+0x02000000,0xd41); +reg_write( DDR_REG_BASE + 0x5137a*4+0x02000000,0x2885); +reg_write( DDR_REG_BASE + 0x5137b*4+0x02000000,0xa0f); +reg_write( DDR_REG_BASE + 0x5137c*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x5137d*4+0x02000000,0xc2); +reg_write( DDR_REG_BASE + 0x5137e*4+0x02000000,0x2a85); +reg_write( DDR_REG_BASE + 0x5137f*4+0x02000000,0x41f); +reg_write( DDR_REG_BASE + 0x51380*4+0x02000000,0x783d); +reg_write( DDR_REG_BASE + 0x51381*4+0x02000000,0x7050); +reg_write( DDR_REG_BASE + 0x51382*4+0x02000000,0x22ca); +reg_write( DDR_REG_BASE + 0x51383*4+0x02000000,0xd); +reg_write( DDR_REG_BASE + 0x51384*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x51385*4+0x02000000,0x6a01); +reg_write( DDR_REG_BASE + 0x51386*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x51387*4+0x02000000,0xa7e); +reg_write( DDR_REG_BASE + 0x51388*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE + 0x51389*4+0x02000000,0xc1a4); +reg_write( DDR_REG_BASE + 0x5138a*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x5138b*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x5138c*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x5138d*4+0x02000000,0x791d); +reg_write( DDR_REG_BASE + 0x5138e*4+0x02000000,0xb9c3); +reg_write( DDR_REG_BASE + 0x5138f*4+0x02000000,0xdd49); +reg_write( DDR_REG_BASE + 0x51390*4+0x02000000,0x1a02); +reg_write( DDR_REG_BASE + 0x51391*4+0x02000000,0x3042); +reg_write( DDR_REG_BASE + 0x51392*4+0x02000000,0xbd9f); +reg_write( DDR_REG_BASE + 0x51393*4+0x02000000,0x8d00); +reg_write( DDR_REG_BASE + 0x51394*4+0x02000000,0xe80b); +reg_write( DDR_REG_BASE + 0x51395*4+0x02000000,0x215f); +reg_write( DDR_REG_BASE + 0x51396*4+0x02000000,0x100); +reg_write( DDR_REG_BASE + 0x51397*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51398*4+0x02000000,0x7082); +reg_write( DDR_REG_BASE + 0x51399*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5139a*4+0x02000000,0x48); +reg_write( DDR_REG_BASE + 0x5139b*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE + 0x5139c*4+0x02000000,0xe00); +reg_write( DDR_REG_BASE + 0x5139d*4+0x02000000,0x621e); +reg_write( DDR_REG_BASE + 0x5139e*4+0x02000000,0xf005); +reg_write( DDR_REG_BASE + 0x5139f*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x513a0*4+0x02000000,0x708e); +reg_write( DDR_REG_BASE + 0x513a1*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x513a2*4+0x02000000,0x22); +reg_write( DDR_REG_BASE + 0x513a3*4+0x02000000,0xa46); +reg_write( DDR_REG_BASE + 0x513a4*4+0x02000000,0xff8f); +reg_write( DDR_REG_BASE + 0x513a5*4+0x02000000,0x79cf); +reg_write( DDR_REG_BASE + 0x513a6*4+0x02000000,0x7b3d); +reg_write( DDR_REG_BASE + 0x513a7*4+0x02000000,0x7a3d); +reg_write( DDR_REG_BASE + 0x513a8*4+0x02000000,0x2653); +reg_write( DDR_REG_BASE + 0x513a9*4+0x02000000,0x907e); +reg_write( DDR_REG_BASE + 0x513aa*4+0x02000000,0x7b7d); +reg_write( DDR_REG_BASE + 0x513ab*4+0x02000000,0x7a5d); +reg_write( DDR_REG_BASE + 0x513ac*4+0x02000000,0x23c0); +reg_write( DDR_REG_BASE + 0x513ad*4+0x02000000,0x62); +reg_write( DDR_REG_BASE + 0x513ae*4+0x02000000,0x7a5d); +reg_write( DDR_REG_BASE + 0x513af*4+0x02000000,0x2653); +reg_write( DDR_REG_BASE + 0x513b0*4+0x02000000,0x9081); +reg_write( DDR_REG_BASE + 0x513b1*4+0x02000000,0xb8c3); +reg_write( DDR_REG_BASE + 0x513b2*4+0x02000000,0x22c0); +reg_write( DDR_REG_BASE + 0x513b3*4+0x02000000,0x62); +reg_write( DDR_REG_BASE + 0x513b4*4+0x02000000,0x1a03); +reg_write( DDR_REG_BASE + 0x513b5*4+0x02000000,0x3002); +reg_write( DDR_REG_BASE + 0x513b6*4+0x02000000,0x1a05); +reg_write( DDR_REG_BASE + 0x513b7*4+0x02000000,0x30c2); +reg_write( DDR_REG_BASE + 0x513b8*4+0x02000000,0x1a07); +reg_write( DDR_REG_BASE + 0x513b9*4+0x02000000,0x3042); +reg_write( DDR_REG_BASE + 0x513ba*4+0x02000000,0x1a04); +reg_write( DDR_REG_BASE + 0x513bb*4+0x02000000,0x3082); +reg_write( DDR_REG_BASE + 0x513bc*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x513bd*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x513be*4+0x02000000,0x53); +reg_write( DDR_REG_BASE + 0x513bf*4+0x02000000,0x3); +reg_write( DDR_REG_BASE + 0x513c0*4+0x02000000,0x8e2); +reg_write( DDR_REG_BASE + 0x513c1*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x513c2*4+0x02000000,0xd80a); +reg_write( DDR_REG_BASE + 0x513c3*4+0x02000000,0x216f); +reg_write( DDR_REG_BASE + 0x513c4*4+0x02000000,0xc3); +reg_write( DDR_REG_BASE + 0x513c5*4+0x02000000,0x8900); +reg_write( DDR_REG_BASE + 0x513c6*4+0x02000000,0xb8e2); +reg_write( DDR_REG_BASE + 0x513c7*4+0x02000000,0xd87f); +reg_write( DDR_REG_BASE + 0x513c8*4+0x02000000,0x20ca); +reg_write( DDR_REG_BASE + 0x513c9*4+0x02000000,0x1e2); +reg_write( DDR_REG_BASE + 0x513ca*4+0x02000000,0x1a08); +reg_write( DDR_REG_BASE + 0x513cb*4+0x02000000,0x3002); +reg_write( DDR_REG_BASE + 0x513cc*4+0x02000000,0x1122); +reg_write( DDR_REG_BASE + 0x513cd*4+0x02000000,0x48f); +reg_write( DDR_REG_BASE + 0x513ce*4+0x02000000,0x8d60); +reg_write( DDR_REG_BASE + 0x513cf*4+0x02000000,0x4528); +reg_write( DDR_REG_BASE + 0x513d0*4+0x02000000,0x2142); +reg_write( DDR_REG_BASE + 0x513d1*4+0x02000000,0x4c0); +reg_write( DDR_REG_BASE + 0x513d2*4+0x02000000,0x2142); +reg_write( DDR_REG_BASE + 0x513d3*4+0x02000000,0x74e); +reg_write( DDR_REG_BASE + 0x513d4*4+0x02000000,0x150e); +reg_write( DDR_REG_BASE + 0x513d5*4+0x02000000,0x148b); +reg_write( DDR_REG_BASE + 0x513d6*4+0x02000000,0x9080); +reg_write( DDR_REG_BASE + 0x513d7*4+0x02000000,0x8842); +reg_write( DDR_REG_BASE + 0x513d8*4+0x02000000,0x9600); +reg_write( DDR_REG_BASE + 0x513d9*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x513da*4+0x02000000,0x54); +reg_write( DDR_REG_BASE + 0x513db*4+0x02000000,0x6); +reg_write( DDR_REG_BASE + 0x513dc*4+0x02000000,0xc241); +reg_write( DDR_REG_BASE + 0x513dd*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE + 0x513de*4+0x02000000,0xd80a); +reg_write( DDR_REG_BASE + 0x513df*4+0x02000000,0x4261); +reg_write( DDR_REG_BASE + 0x513e0*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE + 0x513e1*4+0x02000000,0x8a2); +reg_write( DDR_REG_BASE + 0x513e2*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x513e3*4+0x02000000,0xc440); +reg_write( DDR_REG_BASE + 0x513e4*4+0x02000000,0x1501); +reg_write( DDR_REG_BASE + 0x513e5*4+0x02000000,0x1483); +reg_write( DDR_REG_BASE + 0x513e6*4+0x02000000,0x8d21); +reg_write( DDR_REG_BASE + 0x513e7*4+0x02000000,0x8d03); +reg_write( DDR_REG_BASE + 0x513e8*4+0x02000000,0x16fe); +reg_write( DDR_REG_BASE + 0x513e9*4+0x02000000,0x9082); +reg_write( DDR_REG_BASE + 0x513ea*4+0x02000000,0x8d80); +reg_write( DDR_REG_BASE + 0x513eb*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x513ec*4+0x02000000,0xc141); +reg_write( DDR_REG_BASE + 0x513ed*4+0x02000000,0xd80a); +reg_write( DDR_REG_BASE + 0x513ee*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x513ef*4+0x02000000,0x59); +reg_write( DDR_REG_BASE + 0x513f0*4+0x02000000,0x5); +reg_write( DDR_REG_BASE + 0x513f1*4+0x02000000,0x882); +reg_write( DDR_REG_BASE + 0x513f2*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x513f3*4+0x02000000,0xc440); +reg_write( DDR_REG_BASE + 0x513f4*4+0x02000000,0x706c); +reg_write( DDR_REG_BASE + 0x513f5*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x513f6*4+0x02000000,0xf01f); +reg_write( DDR_REG_BASE + 0x513f7*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x513f8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x513f9*4+0x02000000,0x3000); +reg_write( DDR_REG_BASE + 0x513fa*4+0x02000000,0xf212); +reg_write( DDR_REG_BASE + 0x513fb*4+0x02000000,0x221a); +reg_write( DDR_REG_BASE + 0x513fc*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x513fd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x513fe*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x513ff*4+0x02000000,0x2244); +reg_write( DDR_REG_BASE + 0x51400*4+0x02000000,0x7cc); +reg_write( DDR_REG_BASE + 0x51401*4+0x02000000,0x200f); +reg_write( DDR_REG_BASE + 0x51402*4+0x02000000,0x81); +reg_write( DDR_REG_BASE + 0x51403*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x51404*4+0x02000000,0xec05); +reg_write( DDR_REG_BASE + 0x51405*4+0x02000000,0xbc61); +reg_write( DDR_REG_BASE + 0x51406*4+0x02000000,0xcff); +reg_write( DDR_REG_BASE + 0x51407*4+0x02000000,0x9031); +reg_write( DDR_REG_BASE + 0x51408*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x51409*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x5140a*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x5140b*4+0x02000000,0x7905); +reg_write( DDR_REG_BASE + 0x5140c*4+0x02000000,0x785b); +reg_write( DDR_REG_BASE + 0x5140d*4+0x02000000,0x2056); +reg_write( DDR_REG_BASE + 0x5140e*4+0x02000000,0xd00); +reg_write( DDR_REG_BASE + 0x5140f*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x51410*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x51411*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE + 0x51412*4+0x02000000,0xe000); +reg_write( DDR_REG_BASE + 0x51413*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE + 0x51414*4+0x02000000,0x7144); +reg_write( DDR_REG_BASE + 0x51415*4+0x02000000,0x7354); +reg_write( DDR_REG_BASE + 0x51416*4+0x02000000,0xf7e1); +reg_write( DDR_REG_BASE + 0x51417*4+0x02000000,0xf00b); +reg_write( DDR_REG_BASE + 0x51418*4+0x02000000,0x2056); +reg_write( DDR_REG_BASE + 0x51419*4+0x02000000,0xe00); +reg_write( DDR_REG_BASE + 0x5141a*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x5141b*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x5141c*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE + 0x5141d*4+0x02000000,0xe000); +reg_write( DDR_REG_BASE + 0x5141e*4+0x02000000,0x7164); +reg_write( DDR_REG_BASE + 0x5141f*4+0x02000000,0x1800); +reg_write( DDR_REG_BASE + 0x51420*4+0x02000000,0x3c5); +reg_write( DDR_REG_BASE + 0x51421*4+0x02000000,0xbf1); +reg_write( DDR_REG_BASE + 0x51422*4+0x02000000,0x80b4); +reg_write( DDR_REG_BASE + 0x51423*4+0x02000000,0x787b); +reg_write( DDR_REG_BASE + 0x51424*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x51425*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x51426*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x51427*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE + 0x51428*4+0x02000000,0xe1c4); +reg_write( DDR_REG_BASE + 0x51429*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE + 0x5142a*4+0x02000000,0xf00a); +reg_write( DDR_REG_BASE + 0x5142b*4+0x02000000,0x2156); +reg_write( DDR_REG_BASE + 0x5142c*4+0x02000000,0xe01); +reg_write( DDR_REG_BASE + 0x5142d*4+0x02000000,0x2105); +reg_write( DDR_REG_BASE + 0x5142e*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x5142f*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE + 0x51430*4+0x02000000,0xe000); +reg_write( DDR_REG_BASE + 0x51431*4+0x02000000,0x1900); +reg_write( DDR_REG_BASE + 0x51432*4+0x02000000,0x5); +reg_write( DDR_REG_BASE + 0x51433*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE + 0x51434*4+0x02000000,0x8ef); +reg_write( DDR_REG_BASE + 0x51435*4+0x02000000,0x8234); +reg_write( DDR_REG_BASE + 0x51436*4+0x02000000,0x791b); +reg_write( DDR_REG_BASE + 0x51437*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE + 0x51438*4+0x02000000,0x3cc); +reg_write( DDR_REG_BASE + 0x51439*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x5143a*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x5143b*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE + 0x5143c*4+0x02000000,0xe180); +reg_write( DDR_REG_BASE + 0x5143d*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x5143e*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE + 0x5143f*4+0x02000000,0xe0ee); +reg_write( DDR_REG_BASE + 0x51440*4+0x02000000,0x1800); +reg_write( DDR_REG_BASE + 0x51441*4+0x02000000,0x45); +reg_write( DDR_REG_BASE + 0x51442*4+0x02000000,0xe46); +reg_write( DDR_REG_BASE + 0x51443*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x51444*4+0x02000000,0x18fc); +reg_write( DDR_REG_BASE + 0x51445*4+0x02000000,0x8045); +reg_write( DDR_REG_BASE + 0x51446*4+0x02000000,0xc0a4); +reg_write( DDR_REG_BASE + 0x51447*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x51448*4+0x02000000,0x621a); +reg_write( DDR_REG_BASE + 0x51449*4+0x02000000,0xf004); +reg_write( DDR_REG_BASE + 0x5144a*4+0x02000000,0x1801); +reg_write( DDR_REG_BASE + 0x5144b*4+0x02000000,0x52); +reg_write( DDR_REG_BASE + 0x5144c*4+0x02000000,0x8fd); +reg_write( DDR_REG_BASE + 0x5144d*4+0x02000000,0x8084); +reg_write( DDR_REG_BASE + 0x5144e*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x5144f*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x51450*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x51451*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x51452*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x51453*4+0x02000000,0xc1a7); +reg_write( DDR_REG_BASE + 0x51454*4+0x02000000,0xda07); +reg_write( DDR_REG_BASE + 0x51455*4+0x02000000,0xba8c); +reg_write( DDR_REG_BASE + 0x51456*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x51457*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51458*4+0x02000000,0x9f38); +reg_write( DDR_REG_BASE + 0x51459*4+0x02000000,0x45cb); +reg_write( DDR_REG_BASE + 0x5145a*4+0x02000000,0x9012); +reg_write( DDR_REG_BASE + 0x5145b*4+0x02000000,0x328); +reg_write( DDR_REG_BASE + 0x5145c*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x5145d*4+0x02000000,0x7084); +reg_write( DDR_REG_BASE + 0x5145e*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5145f*4+0x02000000,0x2); +reg_write( DDR_REG_BASE + 0x51460*4+0x02000000,0xb500); +reg_write( DDR_REG_BASE + 0x51461*4+0x02000000,0xd858); +reg_write( DDR_REG_BASE + 0x51462*4+0x02000000,0xb501); +reg_write( DDR_REG_BASE + 0x51463*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x51464*4+0x02000000,0xb7); +reg_write( DDR_REG_BASE + 0x51465*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x51466*4+0x02000000,0xf96); +reg_write( DDR_REG_BASE + 0x51467*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x51468*4+0x02000000,0xd80a); +reg_write( DDR_REG_BASE + 0x51469*4+0x02000000,0xcc1e); +reg_write( DDR_REG_BASE + 0x5146a*4+0x02000000,0x9520); +reg_write( DDR_REG_BASE + 0x5146b*4+0x02000000,0x7030); +reg_write( DDR_REG_BASE + 0x5146c*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x5146d*4+0x02000000,0xf406); +reg_write( DDR_REG_BASE + 0x5146e*4+0x02000000,0xcc1f); +reg_write( DDR_REG_BASE + 0x5146f*4+0x02000000,0x9521); +reg_write( DDR_REG_BASE + 0x51470*4+0x02000000,0x2038); +reg_write( DDR_REG_BASE + 0x51471*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x51472*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x51473*4+0x02000000,0xb9); +reg_write( DDR_REG_BASE + 0x51474*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51475*4+0x02000000,0x806); +reg_write( DDR_REG_BASE + 0x51476*4+0x02000000,0xfecf); +reg_write( DDR_REG_BASE + 0x51477*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x51478*4+0x02000000,0x7003); +reg_write( DDR_REG_BASE + 0x51479*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5147a*4+0x02000000,0x6b4); +reg_write( DDR_REG_BASE + 0x5147b*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x5147c*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x5147d*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5147e*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x5147f*4+0x02000000,0x1a00); +reg_write( DDR_REG_BASE + 0x51480*4+0x02000000,0x3103); +reg_write( DDR_REG_BASE + 0x51481*4+0x02000000,0x216f); +reg_write( DDR_REG_BASE + 0x51482*4+0x02000000,0x243); +reg_write( DDR_REG_BASE + 0x51483*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x51484*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x51485*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x51486*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x51487*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51488*4+0x02000000,0x9126); +reg_write( DDR_REG_BASE + 0x51489*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x5148a*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x5148b*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x5148c*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x5148d*4+0x02000000,0x32); +reg_write( DDR_REG_BASE + 0x5148e*4+0x02000000,0xc140); +reg_write( DDR_REG_BASE + 0x5148f*4+0x02000000,0x9000); +reg_write( DDR_REG_BASE + 0x51490*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE + 0x51491*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x51492*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x51493*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x51494*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x51495*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x51496*4+0x02000000,0x9000); +reg_write( DDR_REG_BASE + 0x51497*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE + 0x51498*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE + 0x51499*4+0x02000000,0xb8e0); +reg_write( DDR_REG_BASE + 0x5149a*4+0x02000000,0x214); +reg_write( DDR_REG_BASE + 0x5149b*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5149c*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x5149d*4+0x02000000,0xc103); +reg_write( DDR_REG_BASE + 0x5149e*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x5149f*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x514a0*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE + 0x514a1*4+0x02000000,0xe032); +reg_write( DDR_REG_BASE + 0x514a2*4+0x02000000,0xb980); +reg_write( DDR_REG_BASE + 0x514a3*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE + 0x514a4*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x514a5*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x514a6*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x514a7*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x514a8*4+0x02000000,0xe090); +reg_write( DDR_REG_BASE + 0x514a9*4+0x02000000,0xc46); +reg_write( DDR_REG_BASE + 0x514aa*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x514ab*4+0x02000000,0x1800); +reg_write( DDR_REG_BASE + 0x514ac*4+0x02000000,0x5); +reg_write( DDR_REG_BASE + 0x514ad*4+0x02000000,0xdb6); +reg_write( DDR_REG_BASE + 0x514ae*4+0x02000000,0xffcf); +reg_write( DDR_REG_BASE + 0x514af*4+0x02000000,0xc92); +reg_write( DDR_REG_BASE + 0x514b0*4+0x02000000,0xff8f); +reg_write( DDR_REG_BASE + 0x514b1*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x514b2*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x514b3*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x514b4*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x514b5*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x514b6*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE + 0x514b7*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x514b8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x514b9*4+0x02000000,0xc046); +reg_write( DDR_REG_BASE + 0x514ba*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x514bb*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x514bc*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x514bd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x514be*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE + 0x514bf*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x514c0*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x514c1*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x514c2*4+0x02000000,0x86); +reg_write( DDR_REG_BASE + 0x514c3*4+0x02000000,0x90a0); +reg_write( DDR_REG_BASE + 0x514c4*4+0x02000000,0x78bd); +reg_write( DDR_REG_BASE + 0x514c5*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x514c6*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x514c7*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x514c8*4+0x02000000,0xb8c2); +reg_write( DDR_REG_BASE + 0x514c9*4+0x02000000,0x827); +reg_write( DDR_REG_BASE + 0x514ca*4+0x02000000,0x90); +reg_write( DDR_REG_BASE + 0x514cb*4+0x02000000,0x835); +reg_write( DDR_REG_BASE + 0x514cc*4+0x02000000,0xf1); +reg_write( DDR_REG_BASE + 0x514cd*4+0x02000000,0x218b); +reg_write( DDR_REG_BASE + 0x514ce*4+0x02000000,0x803e); +reg_write( DDR_REG_BASE + 0x514cf*4+0x02000000,0xce08); +reg_write( DDR_REG_BASE + 0x514d0*4+0x02000000,0x47cb); +reg_write( DDR_REG_BASE + 0x514d1*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x514d2*4+0x02000000,0x41c); +reg_write( DDR_REG_BASE + 0x514d3*4+0x02000000,0x771c); +reg_write( DDR_REG_BASE + 0x514d4*4+0x02000000,0x1a03); +reg_write( DDR_REG_BASE + 0x514d5*4+0x02000000,0x33d8); +reg_write( DDR_REG_BASE + 0x514d6*4+0x02000000,0xce0e); +reg_write( DDR_REG_BASE + 0x514d7*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE + 0x514d8*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x514d9*4+0x02000000,0x434); +reg_write( DDR_REG_BASE + 0x514da*4+0x02000000,0xf017); +reg_write( DDR_REG_BASE + 0x514db*4+0x02000000,0x47cb); +reg_write( DDR_REG_BASE + 0x514dc*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x514dd*4+0x02000000,0x418); +reg_write( DDR_REG_BASE + 0x514de*4+0x02000000,0x1a03); +reg_write( DDR_REG_BASE + 0x514df*4+0x02000000,0x33d8); +reg_write( DDR_REG_BASE + 0x514e0*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE + 0x514e1*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x514e2*4+0x02000000,0x430); +reg_write( DDR_REG_BASE + 0x514e3*4+0x02000000,0xf010); +reg_write( DDR_REG_BASE + 0x514e4*4+0x02000000,0x218b); +reg_write( DDR_REG_BASE + 0x514e5*4+0x02000000,0x803e); +reg_write( DDR_REG_BASE + 0x514e6*4+0x02000000,0xce05); +reg_write( DDR_REG_BASE + 0x514e7*4+0x02000000,0x47cb); +reg_write( DDR_REG_BASE + 0x514e8*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x514e9*4+0x02000000,0x410); +reg_write( DDR_REG_BASE + 0x514ea*4+0x02000000,0x771c); +reg_write( DDR_REG_BASE + 0x514eb*4+0x02000000,0xce0b); +reg_write( DDR_REG_BASE + 0x514ec*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE + 0x514ed*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x514ee*4+0x02000000,0x428); +reg_write( DDR_REG_BASE + 0x514ef*4+0x02000000,0x1a03); +reg_write( DDR_REG_BASE + 0x514f0*4+0x02000000,0x33d8); +reg_write( DDR_REG_BASE + 0x514f1*4+0x02000000,0x761c); +reg_write( DDR_REG_BASE + 0x514f2*4+0x02000000,0x1a09); +reg_write( DDR_REG_BASE + 0x514f3*4+0x02000000,0x3398); +reg_write( DDR_REG_BASE + 0x514f4*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x514f5*4+0x02000000,0x7082); +reg_write( DDR_REG_BASE + 0x514f6*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x514f7*4+0x02000000,0xc); +reg_write( DDR_REG_BASE + 0x514f8*4+0x02000000,0x218b); +reg_write( DDR_REG_BASE + 0x514f9*4+0x02000000,0x803e); +reg_write( DDR_REG_BASE + 0x514fa*4+0x02000000,0x221a); +reg_write( DDR_REG_BASE + 0x514fb*4+0x02000000,0xf9b); +reg_write( DDR_REG_BASE + 0x514fc*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x514fd*4+0x02000000,0x86a0); +reg_write( DDR_REG_BASE + 0x514fe*4+0x02000000,0xf20a); +reg_write( DDR_REG_BASE + 0x514ff*4+0x02000000,0x233c); +reg_write( DDR_REG_BASE + 0x51500*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE + 0x51501*4+0x02000000,0x79); +reg_write( DDR_REG_BASE + 0x51502*4+0x02000000,0xae00); +reg_write( DDR_REG_BASE + 0x51503*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x51504*4+0x02000000,0x142); +reg_write( DDR_REG_BASE + 0x51505*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x51506*4+0x02000000,0xee2); +reg_write( DDR_REG_BASE + 0x51507*4+0x02000000,0xfe8f); +reg_write( DDR_REG_BASE + 0x51508*4+0x02000000,0x222f); +reg_write( DDR_REG_BASE + 0x51509*4+0x02000000,0x6c2); +reg_write( DDR_REG_BASE + 0x5150a*4+0x02000000,0x7a5d); +reg_write( DDR_REG_BASE + 0x5150b*4+0x02000000,0x7a5d); +reg_write( DDR_REG_BASE + 0x5150c*4+0x02000000,0x7a5d); +reg_write( DDR_REG_BASE + 0x5150d*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE + 0x5150e*4+0x02000000,0x7a5d); +reg_write( DDR_REG_BASE + 0x5150f*4+0x02000000,0x7a5d); +reg_write( DDR_REG_BASE + 0x51510*4+0x02000000,0x7a5d); +reg_write( DDR_REG_BASE + 0x51511*4+0x02000000,0xe894); +reg_write( DDR_REG_BASE + 0x51512*4+0x02000000,0x2544); +reg_write( DDR_REG_BASE + 0x51513*4+0x02000000,0x1080); +reg_write( DDR_REG_BASE + 0x51514*4+0x02000000,0x6711); +reg_write( DDR_REG_BASE + 0x51515*4+0x02000000,0x6610); +reg_write( DDR_REG_BASE + 0x51516*4+0x02000000,0x4a10); +reg_write( DDR_REG_BASE + 0x51517*4+0x02000000,0x2048); +reg_write( DDR_REG_BASE + 0x51518*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51519*4+0x02000000,0x2805); +reg_write( DDR_REG_BASE + 0x5151a*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x5151b*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x5151c*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x5151d*4+0x02000000,0xfe80); +reg_write( DDR_REG_BASE + 0x5151e*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x5151f*4+0x02000000,0x2089); +reg_write( DDR_REG_BASE + 0x51520*4+0x02000000,0xfc1); +reg_write( DDR_REG_BASE + 0x51521*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE + 0x51522*4+0x02000000,0x19e0); +reg_write( DDR_REG_BASE + 0x51523*4+0x02000000,0x8004); +reg_write( DDR_REG_BASE + 0x51524*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE + 0x51525*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x51526*4+0x02000000,0xf8d); +reg_write( DDR_REG_BASE + 0x51527*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x51528*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51529*4+0x02000000,0x2b05); +reg_write( DDR_REG_BASE + 0x5152a*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE + 0x5152b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5152c*4+0x02000000,0xfa00); +reg_write( DDR_REG_BASE + 0x5152d*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE + 0x5152e*4+0x02000000,0x81f); +reg_write( DDR_REG_BASE + 0x5152f*4+0x02000000,0x1fe); +reg_write( DDR_REG_BASE + 0x51530*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x51531*4+0x02000000,0x2200); +reg_write( DDR_REG_BASE + 0x51532*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x51533*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE + 0x51534*4+0x02000000,0x793c); +reg_write( DDR_REG_BASE + 0x51535*4+0x02000000,0x208c); +reg_write( DDR_REG_BASE + 0x51536*4+0x02000000,0x8d47); +reg_write( DDR_REG_BASE + 0x51537*4+0x02000000,0x706c); +reg_write( DDR_REG_BASE + 0x51538*4+0x02000000,0xf684); +reg_write( DDR_REG_BASE + 0x51539*4+0x02000000,0x2885); +reg_write( DDR_REG_BASE + 0x5153a*4+0x02000000,0xd07); +reg_write( DDR_REG_BASE + 0x5153b*4+0x02000000,0xf003); +reg_write( DDR_REG_BASE + 0x5153c*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x5153d*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x5153e*4+0x02000000,0x2089); +reg_write( DDR_REG_BASE + 0x5153f*4+0x02000000,0xfc1); +reg_write( DDR_REG_BASE + 0x51540*4+0x02000000,0x205a); +reg_write( DDR_REG_BASE + 0x51541*4+0x02000000,0x200); +reg_write( DDR_REG_BASE + 0x51542*4+0x02000000,0xc105); +reg_write( DDR_REG_BASE + 0x51543*4+0x02000000,0x2105); +reg_write( DDR_REG_BASE + 0x51544*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE + 0x51545*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE + 0x51546*4+0x02000000,0xe164); +reg_write( DDR_REG_BASE + 0x51547*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x51548*4+0x02000000,0xc1); +reg_write( DDR_REG_BASE + 0x51549*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x5154a*4+0x02000000,0x7100); +reg_write( DDR_REG_BASE + 0x5154b*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x5154c*4+0x02000000,0x164); +reg_write( DDR_REG_BASE + 0x5154d*4+0x02000000,0xb8c1); +reg_write( DDR_REG_BASE + 0x5154e*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x5154f*4+0x02000000,0xb200); +reg_write( DDR_REG_BASE + 0x51550*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x51551*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x51552*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x51553*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x51554*4+0x02000000,0x86); +reg_write( DDR_REG_BASE + 0x51555*4+0x02000000,0x88a); +reg_write( DDR_REG_BASE + 0x51556*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x51557*4+0x02000000,0x90c0); +reg_write( DDR_REG_BASE + 0x51558*4+0x02000000,0x81a); +reg_write( DDR_REG_BASE + 0x51559*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x5155a*4+0x02000000,0x40a1); +reg_write( DDR_REG_BASE + 0x5155b*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x5155c*4+0x02000000,0xbe80); +reg_write( DDR_REG_BASE + 0x5155d*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x5155e*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x5155f*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x51560*4+0x02000000,0xfe86); +reg_write( DDR_REG_BASE + 0x51561*4+0x02000000,0xaf6); +reg_write( DDR_REG_BASE + 0x51562*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x51563*4+0x02000000,0xb0c0); +reg_write( DDR_REG_BASE + 0x51564*4+0x02000000,0xd42); +reg_write( DDR_REG_BASE + 0x51565*4+0x02000000,0xff8f); +reg_write( DDR_REG_BASE + 0x51566*4+0x02000000,0xca04); +reg_write( DDR_REG_BASE + 0x51567*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x51568*4+0x02000000,0x708d); +reg_write( DDR_REG_BASE + 0x51569*4+0x02000000,0xf034); +reg_write( DDR_REG_BASE + 0x5156a*4+0x02000000,0x245a); +reg_write( DDR_REG_BASE + 0x5156b*4+0x02000000,0x149e); +reg_write( DDR_REG_BASE + 0x5156c*4+0x02000000,0x2600); +reg_write( DDR_REG_BASE + 0x5156d*4+0x02000000,0x3f83); +reg_write( DDR_REG_BASE + 0x5156e*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5156f*4+0x02000000,0x6b4); +reg_write( DDR_REG_BASE + 0x51570*4+0x02000000,0xb341); +reg_write( DDR_REG_BASE + 0x51571*4+0x02000000,0xf029); +reg_write( DDR_REG_BASE + 0x51572*4+0x02000000,0x241a); +reg_write( DDR_REG_BASE + 0x51573*4+0x02000000,0x1f81); +reg_write( DDR_REG_BASE + 0x51574*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51575*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x51576*4+0x02000000,0x79a5); +reg_write( DDR_REG_BASE + 0x51577*4+0x02000000,0x793b); +reg_write( DDR_REG_BASE + 0x51578*4+0x02000000,0x2105); +reg_write( DDR_REG_BASE + 0x51579*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x5157a*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x5157b*4+0x02000000,0x140); +reg_write( DDR_REG_BASE + 0x5157c*4+0x02000000,0x9120); +reg_write( DDR_REG_BASE + 0x5157d*4+0x02000000,0x7e2f); +reg_write( DDR_REG_BASE + 0x5157e*4+0x02000000,0xd11); +reg_write( DDR_REG_BASE + 0x5157f*4+0x02000000,0x13a1); +reg_write( DDR_REG_BASE + 0x51580*4+0x02000000,0xbec4); +reg_write( DDR_REG_BASE + 0x51581*4+0x02000000,0x8b22); +reg_write( DDR_REG_BASE + 0x51582*4+0x02000000,0x210f); +reg_write( DDR_REG_BASE + 0x51583*4+0x02000000,0x341); +reg_write( DDR_REG_BASE + 0x51584*4+0x02000000,0xab22); +reg_write( DDR_REG_BASE + 0x51585*4+0x02000000,0xf014); +reg_write( DDR_REG_BASE + 0x51586*4+0x02000000,0x8b23); +reg_write( DDR_REG_BASE + 0x51587*4+0x02000000,0x7124); +reg_write( DDR_REG_BASE + 0x51588*4+0x02000000,0xab23); +reg_write( DDR_REG_BASE + 0x51589*4+0x02000000,0x792f); +reg_write( DDR_REG_BASE + 0x5158a*4+0x02000000,0x2614); +reg_write( DDR_REG_BASE + 0x5158b*4+0x02000000,0x3041); +reg_write( DDR_REG_BASE + 0x5158c*4+0x02000000,0x2100); +reg_write( DDR_REG_BASE + 0x5158d*4+0x02000000,0xf8f); +reg_write( DDR_REG_BASE + 0x5158e*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5158f*4+0x02000000,0x6b4); +reg_write( DDR_REG_BASE + 0x51590*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51591*4+0x02000000,0xafa3); +reg_write( DDR_REG_BASE + 0x51592*4+0x02000000,0xee05); +reg_write( DDR_REG_BASE + 0x51593*4+0x02000000,0xbe61); +reg_write( DDR_REG_BASE + 0x51594*4+0x02000000,0xeff); +reg_write( DDR_REG_BASE + 0x51595*4+0x02000000,0x9031); +reg_write( DDR_REG_BASE + 0x51596*4+0x02000000,0x793b); +reg_write( DDR_REG_BASE + 0x51597*4+0x02000000,0xaf22); +reg_write( DDR_REG_BASE + 0x51598*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE + 0x51599*4+0x02000000,0xdb5); +reg_write( DDR_REG_BASE + 0x5159a*4+0x02000000,0x9214); +reg_write( DDR_REG_BASE + 0x5159b*4+0x02000000,0x7185); +reg_write( DDR_REG_BASE + 0x5159c*4+0x02000000,0xc9d); +reg_write( DDR_REG_BASE + 0x5159d*4+0x02000000,0x9024); +reg_write( DDR_REG_BASE + 0x5159e*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x5159f*4+0x02000000,0xda2); +reg_write( DDR_REG_BASE + 0x515a0*4+0x02000000,0xff0f); +reg_write( DDR_REG_BASE + 0x515a1*4+0x02000000,0xa9a); +reg_write( DDR_REG_BASE + 0x515a2*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x515a3*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x515a4*4+0x02000000,0xca04); +reg_write( DDR_REG_BASE + 0x515a5*4+0x02000000,0x264a); +reg_write( DDR_REG_BASE + 0x515a6*4+0x02000000,0x3000); +reg_write( DDR_REG_BASE + 0x515a7*4+0x02000000,0x706c); +reg_write( DDR_REG_BASE + 0x515a8*4+0x02000000,0xf019); +reg_write( DDR_REG_BASE + 0x515a9*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x515aa*4+0x02000000,0xf014); +reg_write( DDR_REG_BASE + 0x515ab*4+0x02000000,0x231a); +reg_write( DDR_REG_BASE + 0x515ac*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x515ad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x515ae*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x515af*4+0x02000000,0x2300); +reg_write( DDR_REG_BASE + 0x515b0*4+0x02000000,0x1f8d); +reg_write( DDR_REG_BASE + 0x515b1*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x515b2*4+0x02000000,0x88c); +reg_write( DDR_REG_BASE + 0x515b3*4+0x02000000,0x7165); +reg_write( DDR_REG_BASE + 0x515b4*4+0x02000000,0x7945); +reg_write( DDR_REG_BASE + 0x515b5*4+0x02000000,0x793b); +reg_write( DDR_REG_BASE + 0x515b6*4+0x02000000,0x2105); +reg_write( DDR_REG_BASE + 0x515b7*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x515b8*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x515b9*4+0x02000000,0x140); +reg_write( DDR_REG_BASE + 0x515ba*4+0x02000000,0x9180); +reg_write( DDR_REG_BASE + 0x515bb*4+0x02000000,0xad80); +reg_write( DDR_REG_BASE + 0x515bc*4+0x02000000,0xb140); +reg_write( DDR_REG_BASE + 0x515bd*4+0x02000000,0x7144); +reg_write( DDR_REG_BASE + 0x515be*4+0x02000000,0xadb); +reg_write( DDR_REG_BASE + 0x515bf*4+0x02000000,0x8214); +reg_write( DDR_REG_BASE + 0x515c0*4+0x02000000,0x7164); +reg_write( DDR_REG_BASE + 0x515c1*4+0x02000000,0xbd3); +reg_write( DDR_REG_BASE + 0x515c2*4+0x02000000,0x8024); +reg_write( DDR_REG_BASE + 0x515c3*4+0x02000000,0x2616); +reg_write( DDR_REG_BASE + 0x515c4*4+0x02000000,0x30cb); +reg_write( DDR_REG_BASE + 0x515c5*4+0x02000000,0x88e); +reg_write( DDR_REG_BASE + 0x515c6*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x515c7*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x515c8*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE + 0x515c9*4+0x02000000,0x813); +reg_write( DDR_REG_BASE + 0x515ca*4+0x02000000,0xbe); +reg_write( DDR_REG_BASE + 0x515cb*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x515cc*4+0x02000000,0x9e6); +reg_write( DDR_REG_BASE + 0x515cd*4+0x02000000,0xc0); +reg_write( DDR_REG_BASE + 0x515ce*4+0x02000000,0xa3e); +reg_write( DDR_REG_BASE + 0x515cf*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x515d0*4+0x02000000,0x720c); +reg_write( DDR_REG_BASE + 0x515d1*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE + 0x515d2*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE + 0x515d3*4+0x02000000,0x808e); +reg_write( DDR_REG_BASE + 0x515d4*4+0x02000000,0xf207); +reg_write( DDR_REG_BASE + 0x515d5*4+0x02000000,0x9d6); +reg_write( DDR_REG_BASE + 0x515d6*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x515d7*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x515d8*4+0x02000000,0xa2a); +reg_write( DDR_REG_BASE + 0x515d9*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x515da*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x515db*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x515dc*4+0x02000000,0x7045); +reg_write( DDR_REG_BASE + 0x515dd*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE + 0x515de*4+0x02000000,0xe044); +reg_write( DDR_REG_BASE + 0x515df*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE + 0x515e0*4+0x02000000,0x81b); +reg_write( DDR_REG_BASE + 0x515e1*4+0x02000000,0x21e); +reg_write( DDR_REG_BASE + 0x515e2*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x515e3*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x515e4*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x515e5*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x515e6*4+0x02000000,0xe887); +reg_write( DDR_REG_BASE + 0x515e7*4+0x02000000,0x9b2); +reg_write( DDR_REG_BASE + 0x515e8*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x515e9*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE + 0x515ea*4+0x02000000,0xa06); +reg_write( DDR_REG_BASE + 0x515eb*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x515ec*4+0x02000000,0xd80a); +reg_write( DDR_REG_BASE + 0x515ed*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE + 0x515ee*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE + 0x515ef*4+0x02000000,0x820d); +reg_write( DDR_REG_BASE + 0x515f0*4+0x02000000,0xf207); +reg_write( DDR_REG_BASE + 0x515f1*4+0x02000000,0x99e); +reg_write( DDR_REG_BASE + 0x515f2*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x515f3*4+0x02000000,0x750c); +reg_write( DDR_REG_BASE + 0x515f4*4+0x02000000,0x9f2); +reg_write( DDR_REG_BASE + 0x515f5*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x515f6*4+0x02000000,0xd8fd); +reg_write( DDR_REG_BASE + 0x515f7*4+0x02000000,0xee08); +reg_write( DDR_REG_BASE + 0x515f8*4+0x02000000,0x98e); +reg_write( DDR_REG_BASE + 0x515f9*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x515fa*4+0x02000000,0x720c); +reg_write( DDR_REG_BASE + 0x515fb*4+0x02000000,0x9e6); +reg_write( DDR_REG_BASE + 0x515fc*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x515fd*4+0x02000000,0xd8fe); +reg_write( DDR_REG_BASE + 0x515fe*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE + 0x515ff*4+0x02000000,0x813); +reg_write( DDR_REG_BASE + 0x51600*4+0x02000000,0x13e); +reg_write( DDR_REG_BASE + 0x51601*4+0x02000000,0x760c); +reg_write( DDR_REG_BASE + 0x51602*4+0x02000000,0x97a); +reg_write( DDR_REG_BASE + 0x51603*4+0x02000000,0xc0); +reg_write( DDR_REG_BASE + 0x51604*4+0x02000000,0x9d2); +reg_write( DDR_REG_BASE + 0x51605*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x51606*4+0x02000000,0x740c); +reg_write( DDR_REG_BASE + 0x51607*4+0x02000000,0xed08); +reg_write( DDR_REG_BASE + 0x51608*4+0x02000000,0x96e); +reg_write( DDR_REG_BASE + 0x51609*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x5160a*4+0x02000000,0x740c); +reg_write( DDR_REG_BASE + 0x5160b*4+0x02000000,0x9c6); +reg_write( DDR_REG_BASE + 0x5160c*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x5160d*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE + 0x5160e*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE + 0x5160f*4+0x02000000,0x827); +reg_write( DDR_REG_BASE + 0x51610*4+0x02000000,0x27f); +reg_write( DDR_REG_BASE + 0x51611*4+0x02000000,0x71ad); +reg_write( DDR_REG_BASE + 0x51612*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51613*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x51614*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51615*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x51616*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x51617*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x51618*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x51619*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5161a*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x5161b*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x5161c*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x5161d*4+0x02000000,0xe040); +reg_write( DDR_REG_BASE + 0x5161e*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x5161f*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE + 0x51620*4+0x02000000,0xf03c); +reg_write( DDR_REG_BASE + 0x51621*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51622*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x51623*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51624*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x51625*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE + 0x51626*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51627*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE + 0x51628*4+0x02000000,0xb8e2); +reg_write( DDR_REG_BASE + 0x51629*4+0x02000000,0x25ca); +reg_write( DDR_REG_BASE + 0x5162a*4+0x02000000,0x13e1); +reg_write( DDR_REG_BASE + 0x5162b*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x5162c*4+0x02000000,0xae00); +reg_write( DDR_REG_BASE + 0x5162d*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x5162e*4+0x02000000,0x847); +reg_write( DDR_REG_BASE + 0x5162f*4+0x02000000,0x95); +reg_write( DDR_REG_BASE + 0x51630*4+0x02000000,0xe819); +reg_write( DDR_REG_BASE + 0x51631*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51632*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x51633*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51634*4+0x02000000,0x49); +reg_write( DDR_REG_BASE + 0x51635*4+0x02000000,0x7014); +reg_write( DDR_REG_BASE + 0x51636*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x51637*4+0x02000000,0xf211); +reg_write( DDR_REG_BASE + 0x51638*4+0x02000000,0xbbe); +reg_write( DDR_REG_BASE + 0x51639*4+0x02000000,0xff0f); +reg_write( DDR_REG_BASE + 0x5163a*4+0x02000000,0x8e00); +reg_write( DDR_REG_BASE + 0x5163b*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE + 0x5163c*4+0x02000000,0xfa2); +reg_write( DDR_REG_BASE + 0x5163d*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x5163e*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x5163f*4+0x02000000,0xb02); +reg_write( DDR_REG_BASE + 0x51640*4+0x02000000,0xff0f); +reg_write( DDR_REG_BASE + 0x51641*4+0x02000000,0x40a1); +reg_write( DDR_REG_BASE + 0x51642*4+0x02000000,0xaf6); +reg_write( DDR_REG_BASE + 0x51643*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x51644*4+0x02000000,0x1e01); +reg_write( DDR_REG_BASE + 0x51645*4+0x02000000,0x1003); +reg_write( DDR_REG_BASE + 0x51646*4+0x02000000,0x8e00); +reg_write( DDR_REG_BASE + 0x51647*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE + 0x51648*4+0x02000000,0xf1e4); +reg_write( DDR_REG_BASE + 0x51649*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x5164a*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x5164b*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5164c*4+0x02000000,0x23); +reg_write( DDR_REG_BASE + 0x5164d*4+0x02000000,0x7014); +reg_write( DDR_REG_BASE + 0x5164e*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x5164f*4+0x02000000,0xf5ea); +reg_write( DDR_REG_BASE + 0x51650*4+0x02000000,0xf1f7); +reg_write( DDR_REG_BASE + 0x51651*4+0x02000000,0xf7a); +reg_write( DDR_REG_BASE + 0x51652*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x51653*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE + 0x51654*4+0x02000000,0xca09); +reg_write( DDR_REG_BASE + 0x51655*4+0x02000000,0xe885); +reg_write( DDR_REG_BASE + 0x51656*4+0x02000000,0xe02); +reg_write( DDR_REG_BASE + 0x51657*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x51658*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE + 0x51659*4+0x02000000,0x92a); +reg_write( DDR_REG_BASE + 0x5165a*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x5165b*4+0x02000000,0xd809); +reg_write( DDR_REG_BASE + 0x5165c*4+0x02000000,0xca09); +reg_write( DDR_REG_BASE + 0x5165d*4+0x02000000,0xe837); +reg_write( DDR_REG_BASE + 0x5165e*4+0x02000000,0xd923); +reg_write( DDR_REG_BASE + 0x5165f*4+0x02000000,0xb99f); +reg_write( DDR_REG_BASE + 0x51660*4+0x02000000,0x8900); +reg_write( DDR_REG_BASE + 0x51661*4+0x02000000,0x1126); +reg_write( DDR_REG_BASE + 0x51662*4+0x02000000,0x8f); +reg_write( DDR_REG_BASE + 0x51663*4+0x02000000,0x70cd); +reg_write( DDR_REG_BASE + 0x51664*4+0x02000000,0x7f05); +reg_write( DDR_REG_BASE + 0x51665*4+0x02000000,0xf022); +reg_write( DDR_REG_BASE + 0x51666*4+0x02000000,0x2644); +reg_write( DDR_REG_BASE + 0x51667*4+0x02000000,0x17c1); +reg_write( DDR_REG_BASE + 0x51668*4+0x02000000,0xe905); +reg_write( DDR_REG_BASE + 0x51669*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE + 0x5166a*4+0x02000000,0x9ff); +reg_write( DDR_REG_BASE + 0x5166b*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE + 0x5166c*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x5166d*4+0x02000000,0x78eb); +reg_write( DDR_REG_BASE + 0x5166e*4+0x02000000,0xf217); +reg_write( DDR_REG_BASE + 0x5166f*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE + 0x51670*4+0x02000000,0xb2a); +reg_write( DDR_REG_BASE + 0x51671*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x51672*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51673*4+0x02000000,0xc102); +reg_write( DDR_REG_BASE + 0x51674*4+0x02000000,0x4508); +reg_write( DDR_REG_BASE + 0x51675*4+0x02000000,0x7bcf); +reg_write( DDR_REG_BASE + 0x51676*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x51677*4+0x02000000,0x42a1); +reg_write( DDR_REG_BASE + 0x51678*4+0x02000000,0xdfe); +reg_write( DDR_REG_BASE + 0x51679*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x5167a*4+0x02000000,0x4378); +reg_write( DDR_REG_BASE + 0x5167b*4+0x02000000,0xc102); +reg_write( DDR_REG_BASE + 0x5167c*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x5167d*4+0x02000000,0x42a1); +reg_write( DDR_REG_BASE + 0x5167e*4+0x02000000,0xdf2); +reg_write( DDR_REG_BASE + 0x5167f*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x51680*4+0x02000000,0x4363); +reg_write( DDR_REG_BASE + 0x51681*4+0x02000000,0x4163); +reg_write( DDR_REG_BASE + 0x51682*4+0x02000000,0xe9e); +reg_write( DDR_REG_BASE + 0x51683*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x51684*4+0x02000000,0x40a1); +reg_write( DDR_REG_BASE + 0x51685*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE + 0x51686*4+0x02000000,0xec1); +reg_write( DDR_REG_BASE + 0x51687*4+0x02000000,0x90b4); +reg_write( DDR_REG_BASE + 0x51688*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x51689*4+0x02000000,0xd9e); +reg_write( DDR_REG_BASE + 0x5168a*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x5168b*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE + 0x5168c*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x5168d*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x5168e*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5168f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51690*4+0x02000000,0xb8e5); +reg_write( DDR_REG_BASE + 0x51691*4+0x02000000,0xebc); +reg_write( DDR_REG_BASE + 0x51692*4+0x02000000,0xff02); +reg_write( DDR_REG_BASE + 0x51693*4+0x02000000,0xd22); +reg_write( DDR_REG_BASE + 0x51694*4+0x02000000,0xff8f); +reg_write( DDR_REG_BASE + 0x51695*4+0x02000000,0x706f); +reg_write( DDR_REG_BASE + 0x51696*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x51697*4+0x02000000,0x76c4); +reg_write( DDR_REG_BASE + 0x51698*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE + 0x51699*4+0x02000000,0xe044); +reg_write( DDR_REG_BASE + 0x5169a*4+0x02000000,0xca04); +reg_write( DDR_REG_BASE + 0x5169b*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x5169c*4+0x02000000,0xf017); +reg_write( DDR_REG_BASE + 0x5169d*4+0x02000000,0x706c); +reg_write( DDR_REG_BASE + 0x5169e*4+0x02000000,0xf012); +reg_write( DDR_REG_BASE + 0x5169f*4+0x02000000,0x221a); +reg_write( DDR_REG_BASE + 0x516a0*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x516a1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x516a2*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x516a3*4+0x02000000,0x7965); +reg_write( DDR_REG_BASE + 0x516a4*4+0x02000000,0x793b); +reg_write( DDR_REG_BASE + 0x516a5*4+0x02000000,0x2105); +reg_write( DDR_REG_BASE + 0x516a6*4+0x02000000,0xf8c); +reg_write( DDR_REG_BASE + 0x516a7*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x516a8*4+0x02000000,0x140); +reg_write( DDR_REG_BASE + 0x516a9*4+0x02000000,0x2332); +reg_write( DDR_REG_BASE + 0x516aa*4+0x02000000,0x1f81); +reg_write( DDR_REG_BASE + 0x516ab*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x516ac*4+0x02000000,0x88c); +reg_write( DDR_REG_BASE + 0x516ad*4+0x02000000,0x7164); +reg_write( DDR_REG_BASE + 0x516ae*4+0x02000000,0x7165); +reg_write( DDR_REG_BASE + 0x516af*4+0x02000000,0xb420); +reg_write( DDR_REG_BASE + 0x516b0*4+0x02000000,0xbdf); +reg_write( DDR_REG_BASE + 0x516b1*4+0x02000000,0x8214); +reg_write( DDR_REG_BASE + 0x516b2*4+0x02000000,0x7144); +reg_write( DDR_REG_BASE + 0x516b3*4+0x02000000,0xad7); +reg_write( DDR_REG_BASE + 0x516b4*4+0x02000000,0x8024); +reg_write( DDR_REG_BASE + 0x516b5*4+0x02000000,0x2316); +reg_write( DDR_REG_BASE + 0x516b6*4+0x02000000,0x308b); +reg_write( DDR_REG_BASE + 0x516b7*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x516b8*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x516b9*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x516ba*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE + 0x516bb*4+0x02000000,0xe032); +reg_write( DDR_REG_BASE + 0x516bc*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE + 0x516bd*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE + 0x516be*4+0x02000000,0xe9a); +reg_write( DDR_REG_BASE + 0x516bf*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x516c0*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x516c1*4+0x02000000,0xcde); +reg_write( DDR_REG_BASE + 0x516c2*4+0x02000000,0x80); +reg_write( DDR_REG_BASE + 0x516c3*4+0x02000000,0xcfe); +reg_write( DDR_REG_BASE + 0x516c4*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x516c5*4+0x02000000,0xd807); +reg_write( DDR_REG_BASE + 0x516c6*4+0x02000000,0x23ab); +reg_write( DDR_REG_BASE + 0x516c7*4+0x02000000,0x30c4); +reg_write( DDR_REG_BASE + 0x516c8*4+0x02000000,0x7fff); +reg_write( DDR_REG_BASE + 0x516c9*4+0x02000000,0xf000); +reg_write( DDR_REG_BASE + 0x516ca*4+0x02000000,0xc2e2); +reg_write( DDR_REG_BASE + 0x516cb*4+0x02000000,0x45cb); +reg_write( DDR_REG_BASE + 0x516cc*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x516cd*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x516ce*4+0x02000000,0x9500); +reg_write( DDR_REG_BASE + 0x516cf*4+0x02000000,0xb8a1); +reg_write( DDR_REG_BASE + 0x516d0*4+0x02000000,0xb500); +reg_write( DDR_REG_BASE + 0x516d1*4+0x02000000,0x8c2); +reg_write( DDR_REG_BASE + 0x516d2*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x516d3*4+0x02000000,0x740c); +reg_write( DDR_REG_BASE + 0x516d4*4+0x02000000,0xd81f); +reg_write( DDR_REG_BASE + 0x516d5*4+0x02000000,0x8ba); +reg_write( DDR_REG_BASE + 0x516d6*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x516d7*4+0x02000000,0x1df6); +reg_write( DDR_REG_BASE + 0x516d8*4+0x02000000,0x105d); +reg_write( DDR_REG_BASE + 0x516d9*4+0x02000000,0xc6c2); +reg_write( DDR_REG_BASE + 0x516da*4+0x02000000,0xc2e2); +reg_write( DDR_REG_BASE + 0x516db*4+0x02000000,0x8ae); +reg_write( DDR_REG_BASE + 0x516dc*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x516dd*4+0x02000000,0xd81f); +reg_write( DDR_REG_BASE + 0x516de*4+0x02000000,0x45cb); +reg_write( DDR_REG_BASE + 0x516df*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x516e0*4+0x02000000,0x1f0); +reg_write( DDR_REG_BASE + 0x516e1*4+0x02000000,0x740c); +reg_write( DDR_REG_BASE + 0x516e2*4+0x02000000,0x89e); +reg_write( DDR_REG_BASE + 0x516e3*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x516e4*4+0x02000000,0x1d00); +reg_write( DDR_REG_BASE + 0x516e5*4+0x02000000,0x1005); +reg_write( DDR_REG_BASE + 0x516e6*4+0x02000000,0x150a); +reg_write( DDR_REG_BASE + 0x516e7*4+0x02000000,0x9700); +reg_write( DDR_REG_BASE + 0x516e8*4+0x02000000,0xb881); +reg_write( DDR_REG_BASE + 0x516e9*4+0x02000000,0x1d0a); +reg_write( DDR_REG_BASE + 0x516ea*4+0x02000000,0x901c); +reg_write( DDR_REG_BASE + 0x516eb*4+0x02000000,0xc6c2); +reg_write( DDR_REG_BASE + 0x516ec*4+0x02000000,0xc0f1); +reg_write( DDR_REG_BASE + 0x516ed*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x516ee*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE + 0x516ef*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x516f0*4+0x02000000,0x12); +reg_write( DDR_REG_BASE + 0x516f1*4+0x02000000,0x218c); +reg_write( DDR_REG_BASE + 0x516f2*4+0x02000000,0x8203); +reg_write( DDR_REG_BASE + 0x516f3*4+0x02000000,0xc9c); +reg_write( DDR_REG_BASE + 0x516f4*4+0x02000000,0xce); +reg_write( DDR_REG_BASE + 0x516f5*4+0x02000000,0x80e); +reg_write( DDR_REG_BASE + 0x516f6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x516f7*4+0x02000000,0xc0d1); +reg_write( DDR_REG_BASE + 0x516f8*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x516f9*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x516fa*4+0x02000000,0xc2e2); +reg_write( DDR_REG_BASE + 0x516fb*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x516fc*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x516fd*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x516fe*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x516ff*4+0x02000000,0x81b); +reg_write( DDR_REG_BASE + 0x51700*4+0x02000000,0x3e); +reg_write( DDR_REG_BASE + 0x51701*4+0x02000000,0xd80a); +reg_write( DDR_REG_BASE + 0x51702*4+0x02000000,0x45cb); +reg_write( DDR_REG_BASE + 0x51703*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE + 0x51704*4+0x02000000,0xe036); +reg_write( DDR_REG_BASE + 0x51705*4+0x02000000,0x85a); +reg_write( DDR_REG_BASE + 0x51706*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x51707*4+0x02000000,0x1d00); +reg_write( DDR_REG_BASE + 0x51708*4+0x02000000,0x1045); +reg_write( DDR_REG_BASE + 0x51709*4+0x02000000,0x1d00); +reg_write( DDR_REG_BASE + 0x5170a*4+0x02000000,0x1005); +reg_write( DDR_REG_BASE + 0x5170b*4+0x02000000,0xc6c2); +reg_write( DDR_REG_BASE + 0x5170c*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x5170d*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x5170e*4+0x02000000,0xf2); +reg_write( DDR_REG_BASE + 0x5170f*4+0x02000000,0x1800); +reg_write( DDR_REG_BASE + 0x51710*4+0x02000000,0x45); +reg_write( DDR_REG_BASE + 0x51711*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x51712*4+0x02000000,0x1800); +reg_write( DDR_REG_BASE + 0x51713*4+0x02000000,0x5); +reg_write( DDR_REG_BASE + 0x51714*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x51715*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x51716*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x51717*4+0x02000000,0xc1bd); +reg_write( DDR_REG_BASE + 0x51718*4+0x02000000,0xc350); +reg_write( DDR_REG_BASE + 0x51719*4+0x02000000,0x4648); +reg_write( DDR_REG_BASE + 0x5171a*4+0x02000000,0x4728); +reg_write( DDR_REG_BASE + 0x5171b*4+0x02000000,0x84e); +reg_write( DDR_REG_BASE + 0x5171c*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE + 0x5171d*4+0x02000000,0x4508); +reg_write( DDR_REG_BASE + 0x5171e*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x5171f*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x51720*4+0x02000000,0xe0c4); +reg_write( DDR_REG_BASE + 0x51721*4+0x02000000,0x1800); +reg_write( DDR_REG_BASE + 0x51722*4+0x02000000,0x3c5); +reg_write( DDR_REG_BASE + 0x51723*4+0x02000000,0xb88b); +reg_write( DDR_REG_BASE + 0x51724*4+0x02000000,0xd9f0); +reg_write( DDR_REG_BASE + 0x51725*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE + 0x51726*4+0x02000000,0xc093); +reg_write( DDR_REG_BASE + 0x51727*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x51728*4+0x02000000,0xda28); +reg_write( DDR_REG_BASE + 0x51729*4+0x02000000,0xa42); +reg_write( DDR_REG_BASE + 0x5172a*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x5172b*4+0x02000000,0xc393); +reg_write( DDR_REG_BASE + 0x5172c*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x5172d*4+0x02000000,0xc04c); +reg_write( DDR_REG_BASE + 0x5172e*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x5172f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51730*4+0x02000000,0xf00); +reg_write( DDR_REG_BASE + 0x51731*4+0x02000000,0xc04b); +reg_write( DDR_REG_BASE + 0x51732*4+0x02000000,0xd820); +reg_write( DDR_REG_BASE + 0x51733*4+0x02000000,0xc04a); +reg_write( DDR_REG_BASE + 0x51734*4+0x02000000,0x1490); +reg_write( DDR_REG_BASE + 0x51735*4+0x02000000,0x3000); +reg_write( DDR_REG_BASE + 0x51736*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x51737*4+0x02000000,0xbdc4); +reg_write( DDR_REG_BASE + 0x51738*4+0x02000000,0xc04e); +reg_write( DDR_REG_BASE + 0x51739*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE + 0x5173a*4+0x02000000,0x148c); +reg_write( DDR_REG_BASE + 0x5173b*4+0x02000000,0x3000); +reg_write( DDR_REG_BASE + 0x5173c*4+0x02000000,0x41c1); +reg_write( DDR_REG_BASE + 0x5173d*4+0x02000000,0x1c24); +reg_write( DDR_REG_BASE + 0x5173e*4+0x02000000,0x3003); +reg_write( DDR_REG_BASE + 0x5173f*4+0x02000000,0xc04f); +reg_write( DDR_REG_BASE + 0x51740*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE + 0x51741*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x51742*4+0x02000000,0xed05); +reg_write( DDR_REG_BASE + 0x51743*4+0x02000000,0xbd61); +reg_write( DDR_REG_BASE + 0x51744*4+0x02000000,0xdff); +reg_write( DDR_REG_BASE + 0x51745*4+0x02000000,0x9031); +reg_write( DDR_REG_BASE + 0x51746*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x51747*4+0x02000000,0xc748); +reg_write( DDR_REG_BASE + 0x51748*4+0x02000000,0x7d0f); +reg_write( DDR_REG_BASE + 0x51749*4+0x02000000,0x40a1); +reg_write( DDR_REG_BASE + 0x5174a*4+0x02000000,0x1c1c); +reg_write( DDR_REG_BASE + 0x5174b*4+0x02000000,0x3103); +reg_write( DDR_REG_BASE + 0x5174c*4+0x02000000,0xc346); +reg_write( DDR_REG_BASE + 0x5174d*4+0x02000000,0x1c25); +reg_write( DDR_REG_BASE + 0x5174e*4+0x02000000,0x3382); +reg_write( DDR_REG_BASE + 0x5174f*4+0x02000000,0x1c34); +reg_write( DDR_REG_BASE + 0x51750*4+0x02000000,0x3043); +reg_write( DDR_REG_BASE + 0x51751*4+0x02000000,0x942); +reg_write( DDR_REG_BASE + 0x51752*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x51753*4+0x02000000,0x43b9); +reg_write( DDR_REG_BASE + 0x51754*4+0x02000000,0xd5e); +reg_write( DDR_REG_BASE + 0x51755*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x51756*4+0x02000000,0xc083); +reg_write( DDR_REG_BASE + 0x51757*4+0x02000000,0x47cb); +reg_write( DDR_REG_BASE + 0x51758*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51759*4+0x02000000,0x7b2); +reg_write( DDR_REG_BASE + 0x5175a*4+0x02000000,0x8f21); +reg_write( DDR_REG_BASE + 0x5175b*4+0x02000000,0x8f40); +reg_write( DDR_REG_BASE + 0x5175c*4+0x02000000,0x1488); +reg_write( DDR_REG_BASE + 0x5175d*4+0x02000000,0x3000); +reg_write( DDR_REG_BASE + 0x5175e*4+0x02000000,0xc051); +reg_write( DDR_REG_BASE + 0x5175f*4+0x02000000,0xf00f); +reg_write( DDR_REG_BASE + 0x51760*4+0x02000000,0xc30f); +reg_write( DDR_REG_BASE + 0x51761*4+0x02000000,0x7b54); +reg_write( DDR_REG_BASE + 0x51762*4+0x02000000,0x9300); +reg_write( DDR_REG_BASE + 0x51763*4+0x02000000,0xe88a); +reg_write( DDR_REG_BASE + 0x51764*4+0x02000000,0xc093); +reg_write( DDR_REG_BASE + 0x51765*4+0x02000000,0x20f5); +reg_write( DDR_REG_BASE + 0x51766*4+0x02000000,0x80); +reg_write( DDR_REG_BASE + 0x51767*4+0x02000000,0x80d); +reg_write( DDR_REG_BASE + 0x51768*4+0x02000000,0x833); +reg_write( DDR_REG_BASE + 0x51769*4+0x02000000,0x2042); +reg_write( DDR_REG_BASE + 0x5176a*4+0x02000000,0x800); +reg_write( DDR_REG_BASE + 0x5176b*4+0x02000000,0xb300); +reg_write( DDR_REG_BASE + 0x5176c*4+0x02000000,0x7144); +reg_write( DDR_REG_BASE + 0x5176d*4+0x02000000,0x9e9); +reg_write( DDR_REG_BASE + 0x5176e*4+0x02000000,0x80a5); +reg_write( DDR_REG_BASE + 0x5176f*4+0x02000000,0x6e09); +reg_write( DDR_REG_BASE + 0x51770*4+0x02000000,0x835); +reg_write( DDR_REG_BASE + 0x51771*4+0x02000000,0xb5); +reg_write( DDR_REG_BASE + 0x51772*4+0x02000000,0x72d5); +reg_write( DDR_REG_BASE + 0x51773*4+0x02000000,0x45cb); +reg_write( DDR_REG_BASE + 0x51774*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51775*4+0x02000000,0xf0f0); +reg_write( DDR_REG_BASE + 0x51776*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE + 0x51777*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51778*4+0x02000000,0xff00); +reg_write( DDR_REG_BASE + 0x51779*4+0x02000000,0x23ca); +reg_write( DDR_REG_BASE + 0x5177a*4+0x02000000,0x341); +reg_write( DDR_REG_BASE + 0x5177b*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x5177c*4+0x02000000,0x41a1); +reg_write( DDR_REG_BASE + 0x5177d*4+0x02000000,0x42a1); +reg_write( DDR_REG_BASE + 0x5177e*4+0x02000000,0xc46); +reg_write( DDR_REG_BASE + 0x5177f*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x51780*4+0x02000000,0xc340); +reg_write( DDR_REG_BASE + 0x51781*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE + 0x51782*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51783*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE + 0x51784*4+0x02000000,0xd808); +reg_write( DDR_REG_BASE + 0x51785*4+0x02000000,0x41a1); +reg_write( DDR_REG_BASE + 0x51786*4+0x02000000,0x42a1); +reg_write( DDR_REG_BASE + 0x51787*4+0x02000000,0xc36); +reg_write( DDR_REG_BASE + 0x51788*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x51789*4+0x02000000,0xc340); +reg_write( DDR_REG_BASE + 0x5178a*4+0x02000000,0xc083); +reg_write( DDR_REG_BASE + 0x5178b*4+0x02000000,0xf0e); +reg_write( DDR_REG_BASE + 0x5178c*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x5178d*4+0x02000000,0x6eab); +reg_write( DDR_REG_BASE + 0x5178e*4+0x02000000,0x8f41); +reg_write( DDR_REG_BASE + 0x5178f*4+0x02000000,0x8f20); +reg_write( DDR_REG_BASE + 0x51790*4+0x02000000,0xf00e); +reg_write( DDR_REG_BASE + 0x51791*4+0x02000000,0xc30e); +reg_write( DDR_REG_BASE + 0x51792*4+0x02000000,0x7b34); +reg_write( DDR_REG_BASE + 0x51793*4+0x02000000,0x9300); +reg_write( DDR_REG_BASE + 0x51794*4+0x02000000,0x813); +reg_write( DDR_REG_BASE + 0x51795*4+0x02000000,0x7f1); +reg_write( DDR_REG_BASE + 0x51796*4+0x02000000,0xc093); +reg_write( DDR_REG_BASE + 0x51797*4+0x02000000,0x20f5); +reg_write( DDR_REG_BASE + 0x51798*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x51799*4+0x02000000,0x80b); +reg_write( DDR_REG_BASE + 0x5179a*4+0x02000000,0x833); +reg_write( DDR_REG_BASE + 0x5179b*4+0x02000000,0xe020); +reg_write( DDR_REG_BASE + 0x5179c*4+0x02000000,0xb300); +reg_write( DDR_REG_BASE + 0x5179d*4+0x02000000,0x7124); +reg_write( DDR_REG_BASE + 0x5179e*4+0x02000000,0xae7); +reg_write( DDR_REG_BASE + 0x5179f*4+0x02000000,0x8065); +reg_write( DDR_REG_BASE + 0x517a0*4+0x02000000,0x73b5); +reg_write( DDR_REG_BASE + 0x517a1*4+0x02000000,0xe88); +reg_write( DDR_REG_BASE + 0x517a2*4+0x02000000,0xffad); +reg_write( DDR_REG_BASE + 0x517a3*4+0x02000000,0x4063); +reg_write( DDR_REG_BASE + 0x517a4*4+0x02000000,0xc010); +reg_write( DDR_REG_BASE + 0x517a5*4+0x02000000,0xe808); +reg_write( DDR_REG_BASE + 0x517a6*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x517a7*4+0x02000000,0x36); +reg_write( DDR_REG_BASE + 0x517a8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x517a9*4+0x02000000,0x912); +reg_write( DDR_REG_BASE + 0x517aa*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x517ab*4+0x02000000,0x740c); +reg_write( DDR_REG_BASE + 0x517ac*4+0x02000000,0x8fc0); +reg_write( DDR_REG_BASE + 0x517ad*4+0x02000000,0xf036); +reg_write( DDR_REG_BASE + 0x517ae*4+0x02000000,0xc00f); +reg_write( DDR_REG_BASE + 0x517af*4+0x02000000,0x7ddd); +reg_write( DDR_REG_BASE + 0x517b0*4+0x02000000,0x20f5); +reg_write( DDR_REG_BASE + 0x517b1*4+0x02000000,0x382); +reg_write( DDR_REG_BASE + 0x517b2*4+0x02000000,0xc00e); +reg_write( DDR_REG_BASE + 0x517b3*4+0x02000000,0x20f5); +reg_write( DDR_REG_BASE + 0x517b4*4+0x02000000,0x383); +reg_write( DDR_REG_BASE + 0x517b5*4+0x02000000,0x6358); +reg_write( DDR_REG_BASE + 0x517b6*4+0x02000000,0x781c); +reg_write( DDR_REG_BASE + 0x517b7*4+0x02000000,0x2048); +reg_write( DDR_REG_BASE + 0x517b8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x517b9*4+0x02000000,0x2049); +reg_write( DDR_REG_BASE + 0x517ba*4+0x02000000,0x7c1); +reg_write( DDR_REG_BASE + 0x517bb*4+0x02000000,0xc011); +reg_write( DDR_REG_BASE + 0x517bc*4+0x02000000,0x78d4); +reg_write( DDR_REG_BASE + 0x517bd*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE + 0x517be*4+0x02000000,0x4b50); +reg_write( DDR_REG_BASE + 0x517bf*4+0x02000000,0x2048); +reg_write( DDR_REG_BASE + 0x517c0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x517c1*4+0x02000000,0xc052); +reg_write( DDR_REG_BASE + 0x517c2*4+0x02000000,0xc010); +reg_write( DDR_REG_BASE + 0x517c3*4+0x02000000,0xe813); +reg_write( DDR_REG_BASE + 0x517c4*4+0x02000000,0xc00f); +reg_write( DDR_REG_BASE + 0x517c5*4+0x02000000,0x4363); +reg_write( DDR_REG_BASE + 0x517c6*4+0x02000000,0x20f5); +reg_write( DDR_REG_BASE + 0x517c7*4+0x02000000,0x382); +reg_write( DDR_REG_BASE + 0x517c8*4+0x02000000,0xc00e); +reg_write( DDR_REG_BASE + 0x517c9*4+0x02000000,0x20f5); +reg_write( DDR_REG_BASE + 0x517ca*4+0x02000000,0x380); +reg_write( DDR_REG_BASE + 0x517cb*4+0x02000000,0xc142); +reg_write( DDR_REG_BASE + 0x517cc*4+0x02000000,0xc240); +reg_write( DDR_REG_BASE + 0x517cd*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x517ce*4+0x02000000,0x740c); +reg_write( DDR_REG_BASE + 0x517cf*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x517d0*4+0x02000000,0x38); +reg_write( DDR_REG_BASE + 0x517d1*4+0x02000000,0x5); +reg_write( DDR_REG_BASE + 0x517d2*4+0x02000000,0x8be); +reg_write( DDR_REG_BASE + 0x517d3*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x517d4*4+0x02000000,0x42a1); +reg_write( DDR_REG_BASE + 0x517d5*4+0x02000000,0xc012); +reg_write( DDR_REG_BASE + 0x517d6*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x517d7*4+0x02000000,0x39); +reg_write( DDR_REG_BASE + 0x517d8*4+0x02000000,0x3); +reg_write( DDR_REG_BASE + 0x517d9*4+0x02000000,0x42a1); +reg_write( DDR_REG_BASE + 0x517da*4+0x02000000,0x780e); +reg_write( DDR_REG_BASE + 0x517db*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x517dc*4+0x02000000,0x207f); +reg_write( DDR_REG_BASE + 0x517dd*4+0x02000000,0x140); +reg_write( DDR_REG_BASE + 0x517de*4+0x02000000,0x932); +reg_write( DDR_REG_BASE + 0x517df*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x517e0*4+0x02000000,0x4363); +reg_write( DDR_REG_BASE + 0x517e1*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE + 0x517e2*4+0x02000000,0x8f01); +reg_write( DDR_REG_BASE + 0x517e3*4+0x02000000,0x899); +reg_write( DDR_REG_BASE + 0x517e4*4+0x02000000,0x83a5); +reg_write( DDR_REG_BASE + 0x517e5*4+0x02000000,0x2644); +reg_write( DDR_REG_BASE + 0x517e6*4+0x02000000,0x105b); +reg_write( DDR_REG_BASE + 0x517e7*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x517e8*4+0x02000000,0x7005); +reg_write( DDR_REG_BASE + 0x517e9*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x517ea*4+0x02000000,0xe004); +reg_write( DDR_REG_BASE + 0x517eb*4+0x02000000,0xc0bd); +reg_write( DDR_REG_BASE + 0x517ec*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x517ed*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x517ee*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x517ef*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x517f0*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x517f1*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x517f2*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x517f3*4+0x02000000,0xc1ab); +reg_write( DDR_REG_BASE + 0x517f4*4+0x02000000,0xc047); +reg_write( DDR_REG_BASE + 0x517f5*4+0x02000000,0x690b); +reg_write( DDR_REG_BASE + 0x517f6*4+0x02000000,0x4338); +reg_write( DDR_REG_BASE + 0x517f7*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE + 0x517f8*4+0x02000000,0x9b2); +reg_write( DDR_REG_BASE + 0x517f9*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x517fa*4+0x02000000,0x7e0f); +reg_write( DDR_REG_BASE + 0x517fb*4+0x02000000,0xc048); +reg_write( DDR_REG_BASE + 0x517fc*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x517fd*4+0x02000000,0x83f); +reg_write( DDR_REG_BASE + 0x517fe*4+0x02000000,0x134); +reg_write( DDR_REG_BASE + 0x517ff*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x51800*4+0x02000000,0xc12); +reg_write( DDR_REG_BASE + 0x51801*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51802*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x51803*4+0x02000000,0x1200); +reg_write( DDR_REG_BASE + 0x51804*4+0x02000000,0x3083); +reg_write( DDR_REG_BASE + 0x51805*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51806*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x51807*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x51808*4+0x02000000,0xb98e); +reg_write( DDR_REG_BASE + 0x51809*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x5180a*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x5180b*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x5180c*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x5180d*4+0x02000000,0xcd2); +reg_write( DDR_REG_BASE + 0x5180e*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x5180f*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x51810*4+0x02000000,0xf8f6); +reg_write( DDR_REG_BASE + 0x51811*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x51812*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x51813*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x51814*4+0x02000000,0xcc2); +reg_write( DDR_REG_BASE + 0x51815*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51816*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x51817*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x51818*4+0x02000000,0xc7a); +reg_write( DDR_REG_BASE + 0x51819*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x5181a*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x5181b*4+0x02000000,0x2342); +reg_write( DDR_REG_BASE + 0x5181c*4+0x02000000,0x3040); +reg_write( DDR_REG_BASE + 0x5181d*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE + 0x5181e*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x5181f*4+0x02000000,0x267c); +reg_write( DDR_REG_BASE + 0x51820*4+0x02000000,0x1101); +reg_write( DDR_REG_BASE + 0x51821*4+0x02000000,0x207c); +reg_write( DDR_REG_BASE + 0x51822*4+0x02000000,0x80); +reg_write( DDR_REG_BASE + 0x51823*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x51824*4+0x02000000,0x804d); +reg_write( DDR_REG_BASE + 0x51825*4+0x02000000,0xdf08); +reg_write( DDR_REG_BASE + 0x51826*4+0x02000000,0x9ce); +reg_write( DDR_REG_BASE + 0x51827*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x51828*4+0x02000000,0x27ca); +reg_write( DDR_REG_BASE + 0x51829*4+0x02000000,0x1062); +reg_write( DDR_REG_BASE + 0x5182a*4+0x02000000,0xa26); +reg_write( DDR_REG_BASE + 0x5182b*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x5182c*4+0x02000000,0x4608); +reg_write( DDR_REG_BASE + 0x5182d*4+0x02000000,0x70b5); +reg_write( DDR_REG_BASE + 0x5182e*4+0x02000000,0x218a); +reg_write( DDR_REG_BASE + 0x5182f*4+0x02000000,0xfc7); +reg_write( DDR_REG_BASE + 0x51830*4+0x02000000,0x42c3); +reg_write( DDR_REG_BASE + 0x51831*4+0x02000000,0x900f); +reg_write( DDR_REG_BASE + 0x51832*4+0x02000000,0xe0c0); +reg_write( DDR_REG_BASE + 0x51833*4+0x02000000,0x21ca); +reg_write( DDR_REG_BASE + 0x51834*4+0x02000000,0x21); +reg_write( DDR_REG_BASE + 0x51835*4+0x02000000,0xb2e0); +reg_write( DDR_REG_BASE + 0x51836*4+0x02000000,0xb225); +reg_write( DDR_REG_BASE + 0x51837*4+0x02000000,0xc108); +reg_write( DDR_REG_BASE + 0x51838*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE + 0x51839*4+0x02000000,0x4d); +reg_write( DDR_REG_BASE + 0x5183a*4+0x02000000,0x651d); +reg_write( DDR_REG_BASE + 0x5183b*4+0x02000000,0x2614); +reg_write( DDR_REG_BASE + 0x5183c*4+0x02000000,0x1042); +reg_write( DDR_REG_BASE + 0x5183d*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x5183e*4+0x02000000,0x4ad8); +reg_write( DDR_REG_BASE + 0x5183f*4+0x02000000,0x2144); +reg_write( DDR_REG_BASE + 0x51840*4+0x02000000,0x4e); +reg_write( DDR_REG_BASE + 0x51841*4+0x02000000,0x82f); +reg_write( DDR_REG_BASE + 0x51842*4+0x02000000,0xb5); +reg_write( DDR_REG_BASE + 0x51843*4+0x02000000,0x665e); +reg_write( DDR_REG_BASE + 0x51844*4+0x02000000,0x47cb); +reg_write( DDR_REG_BASE + 0x51845*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51846*4+0x02000000,0xf0f0); +reg_write( DDR_REG_BASE + 0x51847*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x51848*4+0x02000000,0x41e1); +reg_write( DDR_REG_BASE + 0x51849*4+0x02000000,0x42e1); +reg_write( DDR_REG_BASE + 0x5184a*4+0x02000000,0x43e1); +reg_write( DDR_REG_BASE + 0x5184b*4+0x02000000,0xaae); +reg_write( DDR_REG_BASE + 0x5184c*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x5184d*4+0x02000000,0xc740); +reg_write( DDR_REG_BASE + 0x5184e*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE + 0x5184f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51850*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE + 0x51851*4+0x02000000,0xd808); +reg_write( DDR_REG_BASE + 0x51852*4+0x02000000,0x41e1); +reg_write( DDR_REG_BASE + 0x51853*4+0x02000000,0x42e1); +reg_write( DDR_REG_BASE + 0x51854*4+0x02000000,0xa9a); +reg_write( DDR_REG_BASE + 0x51855*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x51856*4+0x02000000,0xc340); +reg_write( DDR_REG_BASE + 0x51857*4+0x02000000,0x4e58); +reg_write( DDR_REG_BASE + 0x51858*4+0x02000000,0xc049); +reg_write( DDR_REG_BASE + 0x51859*4+0x02000000,0x234f); +reg_write( DDR_REG_BASE + 0x5185a*4+0x02000000,0x3040); +reg_write( DDR_REG_BASE + 0x5185b*4+0x02000000,0xe510); +reg_write( DDR_REG_BASE + 0x5185c*4+0x02000000,0x7214); +reg_write( DDR_REG_BASE + 0x5185d*4+0x02000000,0x70cd); +reg_write( DDR_REG_BASE + 0x5185e*4+0x02000000,0xc54a); +reg_write( DDR_REG_BASE + 0x5185f*4+0x02000000,0xf479); +reg_write( DDR_REG_BASE + 0x51860*4+0x02000000,0xc008); +reg_write( DDR_REG_BASE + 0x51861*4+0x02000000,0x790f); +reg_write( DDR_REG_BASE + 0x51862*4+0x02000000,0xb4e); +reg_write( DDR_REG_BASE + 0x51863*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51864*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x51865*4+0x02000000,0x1200); +reg_write( DDR_REG_BASE + 0x51866*4+0x02000000,0x3083); +reg_write( DDR_REG_BASE + 0x51867*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x51868*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x51869*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x5186a*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE + 0x5186b*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x5186c*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x5186d*4+0x02000000,0xc12); +reg_write( DDR_REG_BASE + 0x5186e*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x5186f*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x51870*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE + 0x51871*4+0x02000000,0xf8b8); +reg_write( DDR_REG_BASE + 0x51872*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE + 0x51873*4+0x02000000,0x3041); +reg_write( DDR_REG_BASE + 0x51874*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x51875*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x51876*4+0x02000000,0xbfe); +reg_write( DDR_REG_BASE + 0x51877*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51878*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x51879*4+0x02000000,0xdb6); +reg_write( DDR_REG_BASE + 0x5187a*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x5187b*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x5187c*4+0x02000000,0xbfaa); +reg_write( DDR_REG_BASE + 0x5187d*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x5187e*4+0x02000000,0x41e1); +reg_write( DDR_REG_BASE + 0x5187f*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x51880*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE + 0x51881*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE + 0x51882*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x51883*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x51884*4+0x02000000,0xbe2); +reg_write( DDR_REG_BASE + 0x51885*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51886*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x51887*4+0x02000000,0xca08); +reg_write( DDR_REG_BASE + 0x51888*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x51889*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5188a*4+0x02000000,0x7500); +reg_write( DDR_REG_BASE + 0x5188b*4+0x02000000,0x724c); +reg_write( DDR_REG_BASE + 0x5188c*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE + 0x5188d*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x5188e*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x5188f*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x51890*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x51891*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x51892*4+0x02000000,0xbc6); +reg_write( DDR_REG_BASE + 0x51893*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51894*4+0x02000000,0x4338); +reg_write( DDR_REG_BASE + 0x51895*4+0x02000000,0xc86); +reg_write( DDR_REG_BASE + 0x51896*4+0x02000000,0xff0f); +reg_write( DDR_REG_BASE + 0x51897*4+0x02000000,0xc00a); +reg_write( DDR_REG_BASE + 0x51898*4+0x02000000,0x41e1); +reg_write( DDR_REG_BASE + 0x51899*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x5189a*4+0x02000000,0x7b0f); +reg_write( DDR_REG_BASE + 0x5189b*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x5189c*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE + 0x5189d*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x5189e*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x5189f*4+0x02000000,0xbae); +reg_write( DDR_REG_BASE + 0x518a0*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x518a1*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x518a2*4+0x02000000,0xca08); +reg_write( DDR_REG_BASE + 0x518a3*4+0x02000000,0x2350); +reg_write( DDR_REG_BASE + 0x518a4*4+0x02000000,0x3301); +reg_write( DDR_REG_BASE + 0x518a5*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE + 0x518a6*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE + 0x518a7*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x518a8*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x518a9*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x518aa*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x518ab*4+0x02000000,0xb96); +reg_write( DDR_REG_BASE + 0x518ac*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x518ad*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x518ae*4+0x02000000,0xc009); +reg_write( DDR_REG_BASE + 0x518af*4+0x02000000,0xf8a4); +reg_write( DDR_REG_BASE + 0x518b0*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE + 0x518b1*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x518b2*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x518b3*4+0x02000000,0xb86); +reg_write( DDR_REG_BASE + 0x518b4*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x518b5*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x518b6*4+0x02000000,0xf89d); +reg_write( DDR_REG_BASE + 0x518b7*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE + 0x518b8*4+0x02000000,0x30c1); +reg_write( DDR_REG_BASE + 0x518b9*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x518ba*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x518bb*4+0x02000000,0xb76); +reg_write( DDR_REG_BASE + 0x518bc*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x518bd*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x518be*4+0x02000000,0xf896); +reg_write( DDR_REG_BASE + 0x518bf*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE + 0x518c0*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x518c1*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x518c2*4+0x02000000,0xb66); +reg_write( DDR_REG_BASE + 0x518c3*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x518c4*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x518c5*4+0x02000000,0xd02); +reg_write( DDR_REG_BASE + 0x518c6*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x518c7*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x518c8*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE + 0x518c9*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x518ca*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x518cb*4+0x02000000,0x1c00); +reg_write( DDR_REG_BASE + 0x518cc*4+0x02000000,0x3041); +reg_write( DDR_REG_BASE + 0x518cd*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x518ce*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE + 0x518cf*4+0x02000000,0x764c); +reg_write( DDR_REG_BASE + 0x518d0*4+0x02000000,0xdb20); +reg_write( DDR_REG_BASE + 0x518d1*4+0x02000000,0xb4a); +reg_write( DDR_REG_BASE + 0x518d2*4+0x02000000,0xfecf); +reg_write( DDR_REG_BASE + 0x518d3*4+0x02000000,0xc0ab); +reg_write( DDR_REG_BASE + 0x518d4*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x518d5*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x518d6*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x518d7*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x518d8*4+0x02000000,0x811); +reg_write( DDR_REG_BASE + 0x518d9*4+0x02000000,0x135); +reg_write( DDR_REG_BASE + 0x518da*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x518db*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x518dc*4+0x02000000,0xf36); +reg_write( DDR_REG_BASE + 0x518dd*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE + 0x518de*4+0x02000000,0xb992); +reg_write( DDR_REG_BASE + 0x518df*4+0x02000000,0xf1f5); +reg_write( DDR_REG_BASE + 0x518e0*4+0x02000000,0xbe7); +reg_write( DDR_REG_BASE + 0x518e1*4+0x02000000,0xb071); +reg_write( DDR_REG_BASE + 0x518e2*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x518e3*4+0x02000000,0x736f); +reg_write( DDR_REG_BASE + 0x518e4*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE + 0x518e5*4+0x02000000,0xf092); +reg_write( DDR_REG_BASE + 0x518e6*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x518e7*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x518e8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x518e9*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE + 0x518ea*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE + 0x518eb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x518ec*4+0x02000000,0xff00); +reg_write( DDR_REG_BASE + 0x518ed*4+0x02000000,0x7014); +reg_write( DDR_REG_BASE + 0x518ee*4+0x02000000,0x21ca); +reg_write( DDR_REG_BASE + 0x518ef*4+0x02000000,0x21); +reg_write( DDR_REG_BASE + 0x518f0*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x518f1*4+0x02000000,0x4220); +reg_write( DDR_REG_BASE + 0x518f2*4+0x02000000,0x95e); +reg_write( DDR_REG_BASE + 0x518f3*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x518f4*4+0x02000000,0xc340); +reg_write( DDR_REG_BASE + 0x518f5*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x518f6*4+0x02000000,0xa26); +reg_write( DDR_REG_BASE + 0x518f7*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x518f8*4+0x02000000,0x41a1); +reg_write( DDR_REG_BASE + 0x518f9*4+0x02000000,0x1200); +reg_write( DDR_REG_BASE + 0x518fa*4+0x02000000,0x3083); +reg_write( DDR_REG_BASE + 0x518fb*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x518fc*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x518fd*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x518fe*4+0x02000000,0x4528); +reg_write( DDR_REG_BASE + 0x518ff*4+0x02000000,0xc143); +reg_write( DDR_REG_BASE + 0x51900*4+0x02000000,0xc142); +reg_write( DDR_REG_BASE + 0x51901*4+0x02000000,0xc141); +reg_write( DDR_REG_BASE + 0x51902*4+0x02000000,0xae6); +reg_write( DDR_REG_BASE + 0x51903*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51904*4+0x02000000,0xc140); +reg_write( DDR_REG_BASE + 0x51905*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE + 0x51906*4+0x02000000,0x47cb); +reg_write( DDR_REG_BASE + 0x51907*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51908*4+0x02000000,0x4400); +reg_write( DDR_REG_BASE + 0x51909*4+0x02000000,0x41e1); +reg_write( DDR_REG_BASE + 0x5190a*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x5190b*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE + 0x5190c*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x5190d*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x5190e*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x5190f*4+0x02000000,0xdb7c); +reg_write( DDR_REG_BASE + 0x51910*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE + 0x51911*4+0x02000000,0x3041); +reg_write( DDR_REG_BASE + 0x51912*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x51913*4+0x02000000,0xac6); +reg_write( DDR_REG_BASE + 0x51914*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51915*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x51916*4+0x02000000,0xbfaa); +reg_write( DDR_REG_BASE + 0x51917*4+0x02000000,0xc746); +reg_write( DDR_REG_BASE + 0x51918*4+0x02000000,0xc106); +reg_write( DDR_REG_BASE + 0x51919*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x5191a*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x5191b*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE + 0x5191c*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x5191d*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x5191e*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x5191f*4+0x02000000,0xaae); +reg_write( DDR_REG_BASE + 0x51920*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51921*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x51922*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x51923*4+0x02000000,0xc106); +reg_write( DDR_REG_BASE + 0x51924*4+0x02000000,0x724c); +reg_write( DDR_REG_BASE + 0x51925*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x51926*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x51927*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x51928*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE + 0x51929*4+0x02000000,0x36c0); +reg_write( DDR_REG_BASE + 0x5192a*4+0x02000000,0x2079); +reg_write( DDR_REG_BASE + 0x5192b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5192c*4+0x02000000,0x205f); +reg_write( DDR_REG_BASE + 0x5192d*4+0x02000000,0x20f); +reg_write( DDR_REG_BASE + 0x5192e*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x5192f*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x51930*4+0x02000000,0xa8a); +reg_write( DDR_REG_BASE + 0x51931*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51932*4+0x02000000,0xc740); +reg_write( DDR_REG_BASE + 0x51933*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x51934*4+0x02000000,0xc106); +reg_write( DDR_REG_BASE + 0x51935*4+0x02000000,0x724c); +reg_write( DDR_REG_BASE + 0x51936*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x51937*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x51938*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x51939*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE + 0x5193a*4+0x02000000,0x36c0); +reg_write( DDR_REG_BASE + 0x5193b*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x5193c*4+0x02000000,0xa72); +reg_write( DDR_REG_BASE + 0x5193d*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x5193e*4+0x02000000,0xc740); +reg_write( DDR_REG_BASE + 0x5193f*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x51940*4+0x02000000,0xc106); +reg_write( DDR_REG_BASE + 0x51941*4+0x02000000,0x724c); +reg_write( DDR_REG_BASE + 0x51942*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x51943*4+0x02000000,0xb990); +reg_write( DDR_REG_BASE + 0x51944*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x51945*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x51946*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE + 0x51947*4+0x02000000,0x36c0); +reg_write( DDR_REG_BASE + 0x51948*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x51949*4+0x02000000,0xa5a); +reg_write( DDR_REG_BASE + 0x5194a*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x5194b*4+0x02000000,0xc740); +reg_write( DDR_REG_BASE + 0x5194c*4+0x02000000,0xb16); +reg_write( DDR_REG_BASE + 0x5194d*4+0x02000000,0xff0f); +reg_write( DDR_REG_BASE + 0x5194e*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x5194f*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x51950*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x51951*4+0x02000000,0xdb20); +reg_write( DDR_REG_BASE + 0x51952*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x51953*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x51954*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x51955*4+0x02000000,0xa42); +reg_write( DDR_REG_BASE + 0x51956*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51957*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x51958*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x51959*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x5195a*4+0x02000000,0x764c); +reg_write( DDR_REG_BASE + 0x5195b*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x5195c*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x5195d*4+0x02000000,0xdb26); +reg_write( DDR_REG_BASE + 0x5195e*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x5195f*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x51960*4+0x02000000,0xa2a); +reg_write( DDR_REG_BASE + 0x51961*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51962*4+0x02000000,0x1c00); +reg_write( DDR_REG_BASE + 0x51963*4+0x02000000,0x3041); +reg_write( DDR_REG_BASE + 0x51964*4+0x02000000,0xc00a); +reg_write( DDR_REG_BASE + 0x51965*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE + 0x51966*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x51967*4+0x02000000,0x7b0f); +reg_write( DDR_REG_BASE + 0x51968*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x51969*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x5196a*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x5196b*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x5196c*4+0x02000000,0xa12); +reg_write( DDR_REG_BASE + 0x5196d*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x5196e*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x5196f*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x51970*4+0x02000000,0x9ca); +reg_write( DDR_REG_BASE + 0x51971*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51972*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51973*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x51974*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE + 0x51975*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE + 0x51976*4+0x02000000,0xc008); +reg_write( DDR_REG_BASE + 0x51977*4+0x02000000,0x7d0f); +reg_write( DDR_REG_BASE + 0x51978*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x51979*4+0x02000000,0x7214); +reg_write( DDR_REG_BASE + 0x5197a*4+0x02000000,0x6d8); +reg_write( DDR_REG_BASE + 0x5197b*4+0x02000000,0xffc5); +reg_write( DDR_REG_BASE + 0x5197c*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x5197d*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x5197e*4+0x02000000,0x7105); +reg_write( DDR_REG_BASE + 0x5197f*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE + 0x51980*4+0x02000000,0xe1f2); +reg_write( DDR_REG_BASE + 0x51981*4+0x02000000,0x912); +reg_write( DDR_REG_BASE + 0x51982*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51983*4+0x02000000,0x41a1); +reg_write( DDR_REG_BASE + 0x51984*4+0x02000000,0x1200); +reg_write( DDR_REG_BASE + 0x51985*4+0x02000000,0x3083); +reg_write( DDR_REG_BASE + 0x51986*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x51987*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x51988*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x51989*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE + 0x5198a*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x5198b*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x5198c*4+0x02000000,0x9d2); +reg_write( DDR_REG_BASE + 0x5198d*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x5198e*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x5198f*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE + 0x51990*4+0x02000000,0xf828); +reg_write( DDR_REG_BASE + 0x51991*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE + 0x51992*4+0x02000000,0x3041); +reg_write( DDR_REG_BASE + 0x51993*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x51994*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x51995*4+0x02000000,0x9c2); +reg_write( DDR_REG_BASE + 0x51996*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51997*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x51998*4+0x02000000,0xb76); +reg_write( DDR_REG_BASE + 0x51999*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x5199a*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x5199b*4+0x02000000,0xbfaa); +reg_write( DDR_REG_BASE + 0x5199c*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x5199d*4+0x02000000,0x41e1); +reg_write( DDR_REG_BASE + 0x5199e*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x5199f*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE + 0x519a0*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE + 0x519a1*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x519a2*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x519a3*4+0x02000000,0x9a6); +reg_write( DDR_REG_BASE + 0x519a4*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x519a5*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x519a6*4+0x02000000,0xca08); +reg_write( DDR_REG_BASE + 0x519a7*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x519a8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x519a9*4+0x02000000,0x6100); +reg_write( DDR_REG_BASE + 0x519aa*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE + 0x519ab*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE + 0x519ac*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x519ad*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x519ae*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x519af*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x519b0*4+0x02000000,0x98a); +reg_write( DDR_REG_BASE + 0x519b1*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x519b2*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x519b3*4+0x02000000,0xc009); +reg_write( DDR_REG_BASE + 0x519b4*4+0x02000000,0xf821); +reg_write( DDR_REG_BASE + 0x519b5*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE + 0x519b6*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x519b7*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x519b8*4+0x02000000,0x97a); +reg_write( DDR_REG_BASE + 0x519b9*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x519ba*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x519bb*4+0x02000000,0xf81b); +reg_write( DDR_REG_BASE + 0x519bc*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE + 0x519bd*4+0x02000000,0x30c1); +reg_write( DDR_REG_BASE + 0x519be*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x519bf*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x519c0*4+0x02000000,0x96a); +reg_write( DDR_REG_BASE + 0x519c1*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x519c2*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x519c3*4+0x02000000,0xf814); +reg_write( DDR_REG_BASE + 0x519c4*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE + 0x519c5*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x519c6*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x519c7*4+0x02000000,0x95e); +reg_write( DDR_REG_BASE + 0x519c8*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x519c9*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x519ca*4+0x02000000,0xaf6); +reg_write( DDR_REG_BASE + 0x519cb*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x519cc*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x519cd*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x519ce*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x519cf*4+0x02000000,0x764c); +reg_write( DDR_REG_BASE + 0x519d0*4+0x02000000,0xdb26); +reg_write( DDR_REG_BASE + 0x519d1*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE + 0x519d2*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x519d3*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x519d4*4+0x02000000,0x942); +reg_write( DDR_REG_BASE + 0x519d5*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x519d6*4+0x02000000,0x1c00); +reg_write( DDR_REG_BASE + 0x519d7*4+0x02000000,0x3041); +reg_write( DDR_REG_BASE + 0x519d8*4+0x02000000,0xf812); +reg_write( DDR_REG_BASE + 0x519d9*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE + 0x519da*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x519db*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x519dc*4+0x02000000,0x5eb); +reg_write( DDR_REG_BASE + 0x519dd*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x519de*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x519df*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x519e0*4+0x02000000,0x47cb); +reg_write( DDR_REG_BASE + 0x519e1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x519e2*4+0x02000000,0x4400); +reg_write( DDR_REG_BASE + 0x519e3*4+0x02000000,0x41e1); +reg_write( DDR_REG_BASE + 0x519e4*4+0x02000000,0x7d0f); +reg_write( DDR_REG_BASE + 0x519e5*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x519e6*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x519e7*4+0x02000000,0xdb7c); +reg_write( DDR_REG_BASE + 0x519e8*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x519e9*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x519ea*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x519eb*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x519ec*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x519ed*4+0x02000000,0xdb10); +reg_write( DDR_REG_BASE + 0x519ee*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x519ef*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x519f0*4+0x02000000,0x79fb); +reg_write( DDR_REG_BASE + 0x519f1*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x519f2*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x519f3*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE + 0x519f4*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x519f5*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x519f6*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x519f7*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x519f8*4+0x02000000,0x7b0f); +reg_write( DDR_REG_BASE + 0x519f9*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x519fa*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x519fb*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x519fc*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x519fd*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE + 0x519fe*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x519ff*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x51a00*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x51a01*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x51a02*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x51a03*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x51a04*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x51a05*4+0x02000000,0xc1a6); +reg_write( DDR_REG_BASE + 0x51a06*4+0x02000000,0x4608); +reg_write( DDR_REG_BASE + 0x51a07*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51a08*4+0x02000000,0x7100); +reg_write( DDR_REG_BASE + 0x51a09*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE + 0x51a0a*4+0x02000000,0x1e0); +reg_write( DDR_REG_BASE + 0x51a0b*4+0x02000000,0x218a); +reg_write( DDR_REG_BASE + 0x51a0c*4+0x02000000,0xffd); +reg_write( DDR_REG_BASE + 0x51a0d*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE + 0x51a0e*4+0x02000000,0x7824); +reg_write( DDR_REG_BASE + 0x51a0f*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x51a10*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51a11*4+0x02000000,0x7100); +reg_write( DDR_REG_BASE + 0x51a12*4+0x02000000,0x900e); +reg_write( DDR_REG_BASE + 0x51a13*4+0x02000000,0x4c); +reg_write( DDR_REG_BASE + 0x51a14*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x51a15*4+0x02000000,0x8e19); +reg_write( DDR_REG_BASE + 0x51a16*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE + 0x51a17*4+0x02000000,0x8e10); +reg_write( DDR_REG_BASE + 0x51a18*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE + 0x51a19*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x51a1a*4+0x02000000,0x900e); +reg_write( DDR_REG_BASE + 0x51a1b*4+0x02000000,0x4c); +reg_write( DDR_REG_BASE + 0x51a1c*4+0x02000000,0x9001); +reg_write( DDR_REG_BASE + 0x51a1d*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x51a1e*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x51a1f*4+0x02000000,0xe88a); +reg_write( DDR_REG_BASE + 0x51a20*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x51a21*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51a22*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE + 0x51a23*4+0x02000000,0x4100); +reg_write( DDR_REG_BASE + 0x51a24*4+0x02000000,0x4200); +reg_write( DDR_REG_BASE + 0x51a25*4+0x02000000,0xf3e); +reg_write( DDR_REG_BASE + 0x51a26*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x51a27*4+0x02000000,0x4300); +reg_write( DDR_REG_BASE + 0x51a28*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x51a29*4+0x02000000,0xb6e); +reg_write( DDR_REG_BASE + 0x51a2a*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51a2b*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x51a2c*4+0x02000000,0x8608); +reg_write( DDR_REG_BASE + 0x51a2d*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x51a2e*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x51a2f*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x51a30*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x51a31*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x51a32*4+0x02000000,0xe064); +reg_write( DDR_REG_BASE + 0x51a33*4+0x02000000,0x9b6); +reg_write( DDR_REG_BASE + 0x51a34*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x51a35*4+0x02000000,0xb0a0); +reg_write( DDR_REG_BASE + 0x51a36*4+0x02000000,0xa9e); +reg_write( DDR_REG_BASE + 0x51a37*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51a38*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE + 0x51a39*4+0x02000000,0x8629); +reg_write( DDR_REG_BASE + 0x51a3a*4+0x02000000,0xf26); +reg_write( DDR_REG_BASE + 0x51a3b*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x51a3c*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x51a3d*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE + 0x51a3e*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51a3f*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x51a40*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x51a41*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE + 0x51a42*4+0x02000000,0xe1e0); +reg_write( DDR_REG_BASE + 0x51a43*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x51a44*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x51a45*4+0x02000000,0xe064); +reg_write( DDR_REG_BASE + 0x51a46*4+0x02000000,0x2042); +reg_write( DDR_REG_BASE + 0x51a47*4+0x02000000,0x98f); +reg_write( DDR_REG_BASE + 0x51a48*4+0x02000000,0xb7a0); +reg_write( DDR_REG_BASE + 0x51a49*4+0x02000000,0xb7a0); +reg_write( DDR_REG_BASE + 0x51a4a*4+0x02000000,0x1f9c); +reg_write( DDR_REG_BASE + 0x51a4b*4+0x02000000,0x135c); +reg_write( DDR_REG_BASE + 0x51a4c*4+0x02000000,0x1f9b); +reg_write( DDR_REG_BASE + 0x51a4d*4+0x02000000,0x135c); +reg_write( DDR_REG_BASE + 0x51a4e*4+0x02000000,0x1fe6); +reg_write( DDR_REG_BASE + 0x51a4f*4+0x02000000,0x9f84); +reg_write( DDR_REG_BASE + 0x51a50*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51a51*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE + 0x51a52*4+0x02000000,0x1ff2); +reg_write( DDR_REG_BASE + 0x51a53*4+0x02000000,0x9044); +reg_write( DDR_REG_BASE + 0x51a54*4+0x02000000,0x1fe4); +reg_write( DDR_REG_BASE + 0x51a55*4+0x02000000,0x9044); +reg_write( DDR_REG_BASE + 0x51a56*4+0x02000000,0xffe); +reg_write( DDR_REG_BASE + 0x51a57*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x51a58*4+0x02000000,0x960e); +reg_write( DDR_REG_BASE + 0x51a59*4+0x02000000,0xc100); +reg_write( DDR_REG_BASE + 0x51a5a*4+0x02000000,0xc201); +reg_write( DDR_REG_BASE + 0x51a5b*4+0x02000000,0xade); +reg_write( DDR_REG_BASE + 0x51a5c*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x51a5d*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE + 0x51a5e*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x51a5f*4+0x02000000,0xb02); +reg_write( DDR_REG_BASE + 0x51a60*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51a61*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x51a62*4+0x02000000,0x8629); +reg_write( DDR_REG_BASE + 0x51a63*4+0x02000000,0xed6); +reg_write( DDR_REG_BASE + 0x51a64*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x51a65*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x51a66*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x51a67*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51a68*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x51a69*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x51a6a*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE + 0x51a6b*4+0x02000000,0xe1e0); +reg_write( DDR_REG_BASE + 0x51a6c*4+0x02000000,0xb7a0); +reg_write( DDR_REG_BASE + 0x51a6d*4+0x02000000,0x1fe6); +reg_write( DDR_REG_BASE + 0x51a6e*4+0x02000000,0x9f84); +reg_write( DDR_REG_BASE + 0x51a6f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51a70*4+0x02000000,0xff00); +reg_write( DDR_REG_BASE + 0x51a71*4+0x02000000,0x1ff2); +reg_write( DDR_REG_BASE + 0x51a72*4+0x02000000,0x9044); +reg_write( DDR_REG_BASE + 0x51a73*4+0x02000000,0x1fe4); +reg_write( DDR_REG_BASE + 0x51a74*4+0x02000000,0x9044); +reg_write( DDR_REG_BASE + 0x51a75*4+0x02000000,0xfc2); +reg_write( DDR_REG_BASE + 0x51a76*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x51a77*4+0x02000000,0x960a); +reg_write( DDR_REG_BASE + 0x51a78*4+0x02000000,0x8e58); +reg_write( DDR_REG_BASE + 0x51a79*4+0x02000000,0x8601); +reg_write( DDR_REG_BASE + 0x51a7a*4+0x02000000,0xa0e); +reg_write( DDR_REG_BASE + 0x51a7b*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x51a7c*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51a7d*4+0x02000000,0xc100); +reg_write( DDR_REG_BASE + 0x51a7e*4+0x02000000,0xc201); +reg_write( DDR_REG_BASE + 0x51a7f*4+0x02000000,0xa96); +reg_write( DDR_REG_BASE + 0x51a80*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x51a81*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE + 0x51a82*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x51a83*4+0x02000000,0xaba); +reg_write( DDR_REG_BASE + 0x51a84*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51a85*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x51a86*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x51a87*4+0x02000000,0xe808); +reg_write( DDR_REG_BASE + 0x51a88*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE + 0x51a89*4+0x02000000,0x9b2); +reg_write( DDR_REG_BASE + 0x51a8a*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51a8b*4+0x02000000,0x2078); +reg_write( DDR_REG_BASE + 0x51a8c*4+0x02000000,0x100); +reg_write( DDR_REG_BASE + 0x51a8d*4+0x02000000,0xf012); +reg_write( DDR_REG_BASE + 0x51a8e*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE + 0x51a8f*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x51a90*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51a91*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE + 0x51a92*4+0x02000000,0x4220); +reg_write( DDR_REG_BASE + 0x51a93*4+0x02000000,0x7414); +reg_write( DDR_REG_BASE + 0x51a94*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x51a95*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51a96*4+0x02000000,0xfffe); +reg_write( DDR_REG_BASE + 0x51a97*4+0x02000000,0x22ca); +reg_write( DDR_REG_BASE + 0x51a98*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x51a99*4+0x02000000,0x20ca); +reg_write( DDR_REG_BASE + 0x51a9a*4+0x02000000,0x41); +reg_write( DDR_REG_BASE + 0x51a9b*4+0x02000000,0xe52); +reg_write( DDR_REG_BASE + 0x51a9c*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x51a9d*4+0x02000000,0x4320); +reg_write( DDR_REG_BASE + 0x51a9e*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51a9f*4+0x02000000,0x7100); +reg_write( DDR_REG_BASE + 0x51aa0*4+0x02000000,0x900e); +reg_write( DDR_REG_BASE + 0x51aa1*4+0x02000000,0x4c); +reg_write( DDR_REG_BASE + 0x51aa2*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x51aa3*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x51aa4*4+0x02000000,0x900e); +reg_write( DDR_REG_BASE + 0x51aa5*4+0x02000000,0x4c); +reg_write( DDR_REG_BASE + 0x51aa6*4+0x02000000,0x9001); +reg_write( DDR_REG_BASE + 0x51aa7*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x51aa8*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE + 0x51aa9*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x51aaa*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x51aab*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE + 0x51aac*4+0x02000000,0xe1e0); +reg_write( DDR_REG_BASE + 0x51aad*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE + 0x51aae*4+0x02000000,0x8629); +reg_write( DDR_REG_BASE + 0x51aaf*4+0x02000000,0x2078); +reg_write( DDR_REG_BASE + 0x51ab0*4+0x02000000,0x100); +reg_write( DDR_REG_BASE + 0x51ab1*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x51ab2*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x51ab3*4+0x02000000,0x7504); +reg_write( DDR_REG_BASE + 0x51ab4*4+0x02000000,0xe32); +reg_write( DDR_REG_BASE + 0x51ab5*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x51ab6*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x51ab7*4+0x02000000,0x8608); +reg_write( DDR_REG_BASE + 0x51ab8*4+0x02000000,0x706f); +reg_write( DDR_REG_BASE + 0x51ab9*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x51aba*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x51abb*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x51abc*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x51abd*4+0x02000000,0xe064); +reg_write( DDR_REG_BASE + 0x51abe*4+0x02000000,0x89e); +reg_write( DDR_REG_BASE + 0x51abf*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x51ac0*4+0x02000000,0x1800); +reg_write( DDR_REG_BASE + 0x51ac1*4+0x02000000,0x6c4); +reg_write( DDR_REG_BASE + 0x51ac2*4+0x02000000,0x986); +reg_write( DDR_REG_BASE + 0x51ac3*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51ac4*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE + 0x51ac5*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51ac6*4+0x02000000,0x1f00); +reg_write( DDR_REG_BASE + 0x51ac7*4+0x02000000,0x16c4); +reg_write( DDR_REG_BASE + 0x51ac8*4+0x02000000,0x1f9c); +reg_write( DDR_REG_BASE + 0x51ac9*4+0x02000000,0x16dc); +reg_write( DDR_REG_BASE + 0x51aca*4+0x02000000,0x1f9b); +reg_write( DDR_REG_BASE + 0x51acb*4+0x02000000,0x16dc); +reg_write( DDR_REG_BASE + 0x51acc*4+0x02000000,0x1fe6); +reg_write( DDR_REG_BASE + 0x51acd*4+0x02000000,0x9f84); +reg_write( DDR_REG_BASE + 0x51ace*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51acf*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE + 0x51ad0*4+0x02000000,0x1ff2); +reg_write( DDR_REG_BASE + 0x51ad1*4+0x02000000,0x9044); +reg_write( DDR_REG_BASE + 0x51ad2*4+0x02000000,0x1fe4); +reg_write( DDR_REG_BASE + 0x51ad3*4+0x02000000,0x9044); +reg_write( DDR_REG_BASE + 0x51ad4*4+0x02000000,0x960e); +reg_write( DDR_REG_BASE + 0x51ad5*4+0x02000000,0xf02); +reg_write( DDR_REG_BASE + 0x51ad6*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x51ad7*4+0x02000000,0x4528); +reg_write( DDR_REG_BASE + 0x51ad8*4+0x02000000,0xc100); +reg_write( DDR_REG_BASE + 0x51ad9*4+0x02000000,0xc201); +reg_write( DDR_REG_BASE + 0x51ada*4+0x02000000,0x9de); +reg_write( DDR_REG_BASE + 0x51adb*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x51adc*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE + 0x51add*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x51ade*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x51adf*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x51ae0*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x51ae1*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE + 0x51ae2*4+0x02000000,0xe1e0); +reg_write( DDR_REG_BASE + 0x51ae3*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x51ae4*4+0x02000000,0x9f6); +reg_write( DDR_REG_BASE + 0x51ae5*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51ae6*4+0x02000000,0x1f00); +reg_write( DDR_REG_BASE + 0x51ae7*4+0x02000000,0x16c4); +reg_write( DDR_REG_BASE + 0x51ae8*4+0x02000000,0x8629); +reg_write( DDR_REG_BASE + 0x51ae9*4+0x02000000,0xdca); +reg_write( DDR_REG_BASE + 0x51aea*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x51aeb*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE + 0x51aec*4+0x02000000,0x1fe6); +reg_write( DDR_REG_BASE + 0x51aed*4+0x02000000,0x9f84); +reg_write( DDR_REG_BASE + 0x51aee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51aef*4+0x02000000,0xff00); +reg_write( DDR_REG_BASE + 0x51af0*4+0x02000000,0x1ff2); +reg_write( DDR_REG_BASE + 0x51af1*4+0x02000000,0x9344); +reg_write( DDR_REG_BASE + 0x51af2*4+0x02000000,0x1fe4); +reg_write( DDR_REG_BASE + 0x51af3*4+0x02000000,0x9344); +reg_write( DDR_REG_BASE + 0x51af4*4+0x02000000,0x8605); +reg_write( DDR_REG_BASE + 0x51af5*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51af6*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE + 0x51af7*4+0x02000000,0xebe); +reg_write( DDR_REG_BASE + 0x51af8*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x51af9*4+0x02000000,0x7810); +reg_write( DDR_REG_BASE + 0x51afa*4+0x02000000,0xc100); +reg_write( DDR_REG_BASE + 0x51afb*4+0x02000000,0xc201); +reg_write( DDR_REG_BASE + 0x51afc*4+0x02000000,0x99a); +reg_write( DDR_REG_BASE + 0x51afd*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x51afe*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE + 0x51aff*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x51b00*4+0x02000000,0xe806); +reg_write( DDR_REG_BASE + 0x51b01*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE + 0x51b02*4+0x02000000,0x8be); +reg_write( DDR_REG_BASE + 0x51b03*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51b04*4+0x02000000,0x2079); +reg_write( DDR_REG_BASE + 0x51b05*4+0x02000000,0x100); +reg_write( DDR_REG_BASE + 0x51b06*4+0x02000000,0x8e58); +reg_write( DDR_REG_BASE + 0x51b07*4+0x02000000,0x8603); +reg_write( DDR_REG_BASE + 0x51b08*4+0x02000000,0x8f2); +reg_write( DDR_REG_BASE + 0x51b09*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x51b0a*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51b0b*4+0x02000000,0xc0a6); +reg_write( DDR_REG_BASE + 0x51b0c*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x51b0d*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x51b0e*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x51b0f*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x51b10*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x51b11*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x51b12*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x51b13*4+0x02000000,0xc1a8); +reg_write( DDR_REG_BASE + 0x51b14*4+0x02000000,0x4608); +reg_write( DDR_REG_BASE + 0x51b15*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51b16*4+0x02000000,0x7100); +reg_write( DDR_REG_BASE + 0x51b17*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE + 0x51b18*4+0x02000000,0x1e0); +reg_write( DDR_REG_BASE + 0x51b19*4+0x02000000,0x218a); +reg_write( DDR_REG_BASE + 0x51b1a*4+0x02000000,0xffd); +reg_write( DDR_REG_BASE + 0x51b1b*4+0x02000000,0xc047); +reg_write( DDR_REG_BASE + 0x51b1c*4+0x02000000,0x7824); +reg_write( DDR_REG_BASE + 0x51b1d*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE + 0x51b1e*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51b1f*4+0x02000000,0x7100); +reg_write( DDR_REG_BASE + 0x51b20*4+0x02000000,0x900e); +reg_write( DDR_REG_BASE + 0x51b21*4+0x02000000,0x4c); +reg_write( DDR_REG_BASE + 0x51b22*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x51b23*4+0x02000000,0x8e19); +reg_write( DDR_REG_BASE + 0x51b24*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE + 0x51b25*4+0x02000000,0x8e10); +reg_write( DDR_REG_BASE + 0x51b26*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x51b27*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x51b28*4+0x02000000,0x900e); +reg_write( DDR_REG_BASE + 0x51b29*4+0x02000000,0x4c); +reg_write( DDR_REG_BASE + 0x51b2a*4+0x02000000,0x9001); +reg_write( DDR_REG_BASE + 0x51b2b*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x51b2c*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE + 0x51b2d*4+0x02000000,0xe88a); +reg_write( DDR_REG_BASE + 0x51b2e*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x51b2f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51b30*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE + 0x51b31*4+0x02000000,0x4100); +reg_write( DDR_REG_BASE + 0x51b32*4+0x02000000,0x4200); +reg_write( DDR_REG_BASE + 0x51b33*4+0x02000000,0xd22); +reg_write( DDR_REG_BASE + 0x51b34*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x51b35*4+0x02000000,0x4300); +reg_write( DDR_REG_BASE + 0x51b36*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x51b37*4+0x02000000,0x952); +reg_write( DDR_REG_BASE + 0x51b38*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51b39*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x51b3a*4+0x02000000,0xc102); +reg_write( DDR_REG_BASE + 0x51b3b*4+0x02000000,0x8608); +reg_write( DDR_REG_BASE + 0x51b3c*4+0x02000000,0x2179); +reg_write( DDR_REG_BASE + 0x51b3d*4+0x02000000,0x101); +reg_write( DDR_REG_BASE + 0x51b3e*4+0x02000000,0xe46); +reg_write( DDR_REG_BASE + 0x51b3f*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x51b40*4+0x02000000,0xc144); +reg_write( DDR_REG_BASE + 0x51b41*4+0x02000000,0x88a); +reg_write( DDR_REG_BASE + 0x51b42*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51b43*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE + 0x51b44*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x51b45*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x51b46*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x51b47*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE + 0x51b48*4+0x02000000,0xe1e0); +reg_write( DDR_REG_BASE + 0x51b49*4+0x02000000,0x8629); +reg_write( DDR_REG_BASE + 0x51b4a*4+0x02000000,0xd06); +reg_write( DDR_REG_BASE + 0x51b4b*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x51b4c*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE + 0x51b4d*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x51b4e*4+0x02000000,0x47cb); +reg_write( DDR_REG_BASE + 0x51b4f*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x51b50*4+0x02000000,0xe03e); +reg_write( DDR_REG_BASE + 0x51b51*4+0x02000000,0xb7a0); +reg_write( DDR_REG_BASE + 0x51b52*4+0x02000000,0x1f9b); +reg_write( DDR_REG_BASE + 0x51b53*4+0x02000000,0x135c); +reg_write( DDR_REG_BASE + 0x51b54*4+0x02000000,0x1f9c); +reg_write( DDR_REG_BASE + 0x51b55*4+0x02000000,0x135c); +reg_write( DDR_REG_BASE + 0x51b56*4+0x02000000,0x1fe6); +reg_write( DDR_REG_BASE + 0x51b57*4+0x02000000,0x9f84); +reg_write( DDR_REG_BASE + 0x51b58*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51b59*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE + 0x51b5a*4+0x02000000,0x1ff2); +reg_write( DDR_REG_BASE + 0x51b5b*4+0x02000000,0x9045); +reg_write( DDR_REG_BASE + 0x51b5c*4+0x02000000,0x1fe4); +reg_write( DDR_REG_BASE + 0x51b5d*4+0x02000000,0x9045); +reg_write( DDR_REG_BASE + 0x51b5e*4+0x02000000,0x960e); +reg_write( DDR_REG_BASE + 0x51b5f*4+0x02000000,0xdee); +reg_write( DDR_REG_BASE + 0x51b60*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x51b61*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51b62*4+0x02000000,0xc100); +reg_write( DDR_REG_BASE + 0x51b63*4+0x02000000,0xc201); +reg_write( DDR_REG_BASE + 0x51b64*4+0x02000000,0x8ca); +reg_write( DDR_REG_BASE + 0x51b65*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x51b66*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE + 0x51b67*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x51b68*4+0x02000000,0x8ee); +reg_write( DDR_REG_BASE + 0x51b69*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51b6a*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x51b6b*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE + 0x51b6c*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51b6d*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x51b6e*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x51b6f*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE + 0x51b70*4+0x02000000,0xe1e0); +reg_write( DDR_REG_BASE + 0x51b71*4+0x02000000,0xb7a0); +reg_write( DDR_REG_BASE + 0x51b72*4+0x02000000,0xdc6); +reg_write( DDR_REG_BASE + 0x51b73*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x51b74*4+0x02000000,0x960a); +reg_write( DDR_REG_BASE + 0x51b75*4+0x02000000,0x8e58); +reg_write( DDR_REG_BASE + 0x51b76*4+0x02000000,0x8602); +reg_write( DDR_REG_BASE + 0x51b77*4+0x02000000,0x816); +reg_write( DDR_REG_BASE + 0x51b78*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x51b79*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51b7a*4+0x02000000,0xc100); +reg_write( DDR_REG_BASE + 0x51b7b*4+0x02000000,0xc201); +reg_write( DDR_REG_BASE + 0x51b7c*4+0x02000000,0x89a); +reg_write( DDR_REG_BASE + 0x51b7d*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x51b7e*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE + 0x51b7f*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x51b80*4+0x02000000,0x8be); +reg_write( DDR_REG_BASE + 0x51b81*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51b82*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x51b83*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE + 0x51b84*4+0x02000000,0xe805); +reg_write( DDR_REG_BASE + 0x51b85*4+0x02000000,0xfba); +reg_write( DDR_REG_BASE + 0x51b86*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x51b87*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x51b88*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE + 0x51b89*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE + 0x51b8a*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x51b8b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51b8c*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE + 0x51b8d*4+0x02000000,0x42c3); +reg_write( DDR_REG_BASE + 0x51b8e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51b8f*4+0x02000000,0xfffe); +reg_write( DDR_REG_BASE + 0x51b90*4+0x02000000,0x7414); +reg_write( DDR_REG_BASE + 0x51b91*4+0x02000000,0x4020); +reg_write( DDR_REG_BASE + 0x51b92*4+0x02000000,0x20ca); +reg_write( DDR_REG_BASE + 0x51b93*4+0x02000000,0x81); +reg_write( DDR_REG_BASE + 0x51b94*4+0x02000000,0x22ca); +reg_write( DDR_REG_BASE + 0x51b95*4+0x02000000,0x41); +reg_write( DDR_REG_BASE + 0x51b96*4+0x02000000,0xc5a); +reg_write( DDR_REG_BASE + 0x51b97*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x51b98*4+0x02000000,0x4320); +reg_write( DDR_REG_BASE + 0x51b99*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51b9a*4+0x02000000,0x7100); +reg_write( DDR_REG_BASE + 0x51b9b*4+0x02000000,0x900e); +reg_write( DDR_REG_BASE + 0x51b9c*4+0x02000000,0x4c); +reg_write( DDR_REG_BASE + 0x51b9d*4+0x02000000,0xc046); +reg_write( DDR_REG_BASE + 0x51b9e*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x51b9f*4+0x02000000,0x900e); +reg_write( DDR_REG_BASE + 0x51ba0*4+0x02000000,0x4c); +reg_write( DDR_REG_BASE + 0x51ba1*4+0x02000000,0x9001); +reg_write( DDR_REG_BASE + 0x51ba2*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x51ba3*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x51ba4*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x51ba5*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x51ba6*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE + 0x51ba7*4+0x02000000,0xe1e0); +reg_write( DDR_REG_BASE + 0x51ba8*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x51ba9*4+0x02000000,0x8629); +reg_write( DDR_REG_BASE + 0x51baa*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x51bab*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x51bac*4+0x02000000,0xe007); +reg_write( DDR_REG_BASE + 0x51bad*4+0x02000000,0xc42); +reg_write( DDR_REG_BASE + 0x51bae*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x51baf*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x51bb0*4+0x02000000,0x8608); +reg_write( DDR_REG_BASE + 0x51bb1*4+0x02000000,0xd62); +reg_write( DDR_REG_BASE + 0x51bb2*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x51bb3*4+0x02000000,0xc104); +reg_write( DDR_REG_BASE + 0x51bb4*4+0x02000000,0xfa2); +reg_write( DDR_REG_BASE + 0x51bb5*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x51bb6*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE + 0x51bb7*4+0x02000000,0x706f); +reg_write( DDR_REG_BASE + 0x51bb8*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51bb9*4+0x02000000,0x1f00); +reg_write( DDR_REG_BASE + 0x51bba*4+0x02000000,0x16c4); +reg_write( DDR_REG_BASE + 0x51bbb*4+0x02000000,0x1f9b); +reg_write( DDR_REG_BASE + 0x51bbc*4+0x02000000,0x16dc); +reg_write( DDR_REG_BASE + 0x51bbd*4+0x02000000,0x1f9c); +reg_write( DDR_REG_BASE + 0x51bbe*4+0x02000000,0x16dc); +reg_write( DDR_REG_BASE + 0x51bbf*4+0x02000000,0x1fe6); +reg_write( DDR_REG_BASE + 0x51bc0*4+0x02000000,0x9f84); +reg_write( DDR_REG_BASE + 0x51bc1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51bc2*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE + 0x51bc3*4+0x02000000,0x1ff2); +reg_write( DDR_REG_BASE + 0x51bc4*4+0x02000000,0x9044); +reg_write( DDR_REG_BASE + 0x51bc5*4+0x02000000,0x1fe4); +reg_write( DDR_REG_BASE + 0x51bc6*4+0x02000000,0x9044); +reg_write( DDR_REG_BASE + 0x51bc7*4+0x02000000,0x960e); +reg_write( DDR_REG_BASE + 0x51bc8*4+0x02000000,0xd1a); +reg_write( DDR_REG_BASE + 0x51bc9*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x51bca*4+0x02000000,0x4528); +reg_write( DDR_REG_BASE + 0x51bcb*4+0x02000000,0xc106); +reg_write( DDR_REG_BASE + 0x51bcc*4+0x02000000,0xc200); +reg_write( DDR_REG_BASE + 0x51bcd*4+0x02000000,0xffa); +reg_write( DDR_REG_BASE + 0x51bce*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x51bcf*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE + 0x51bd0*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE + 0x51bd1*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x51bd2*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x51bd3*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x51bd4*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE + 0x51bd5*4+0x02000000,0xe1e0); +reg_write( DDR_REG_BASE + 0x51bd6*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x51bd7*4+0x02000000,0x812); +reg_write( DDR_REG_BASE + 0x51bd8*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x51bd9*4+0x02000000,0x1f00); +reg_write( DDR_REG_BASE + 0x51bda*4+0x02000000,0x16c4); +reg_write( DDR_REG_BASE + 0x51bdb*4+0x02000000,0x8629); +reg_write( DDR_REG_BASE + 0x51bdc*4+0x02000000,0xbe2); +reg_write( DDR_REG_BASE + 0x51bdd*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x51bde*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x51bdf*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x51be0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51be1*4+0x02000000,0xff00); +reg_write( DDR_REG_BASE + 0x51be2*4+0x02000000,0x1fe6); +reg_write( DDR_REG_BASE + 0x51be3*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x51be4*4+0x02000000,0x1ff2); +reg_write( DDR_REG_BASE + 0x51be5*4+0x02000000,0x9344); +reg_write( DDR_REG_BASE + 0x51be6*4+0x02000000,0x1fe4); +reg_write( DDR_REG_BASE + 0x51be7*4+0x02000000,0x9344); +reg_write( DDR_REG_BASE + 0x51be8*4+0x02000000,0x8605); +reg_write( DDR_REG_BASE + 0x51be9*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51bea*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE + 0x51beb*4+0x02000000,0xcd6); +reg_write( DDR_REG_BASE + 0x51bec*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x51bed*4+0x02000000,0x7810); +reg_write( DDR_REG_BASE + 0x51bee*4+0x02000000,0xc106); +reg_write( DDR_REG_BASE + 0x51bef*4+0x02000000,0xc200); +reg_write( DDR_REG_BASE + 0x51bf0*4+0x02000000,0xfb2); +reg_write( DDR_REG_BASE + 0x51bf1*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x51bf2*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE + 0x51bf3*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE + 0x51bf4*4+0x02000000,0xe806); +reg_write( DDR_REG_BASE + 0x51bf5*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE + 0x51bf6*4+0x02000000,0xed6); +reg_write( DDR_REG_BASE + 0x51bf7*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x51bf8*4+0x02000000,0x2078); +reg_write( DDR_REG_BASE + 0x51bf9*4+0x02000000,0x100); +reg_write( DDR_REG_BASE + 0x51bfa*4+0x02000000,0x8e58); +reg_write( DDR_REG_BASE + 0x51bfb*4+0x02000000,0x8603); +reg_write( DDR_REG_BASE + 0x51bfc*4+0x02000000,0xf0a); +reg_write( DDR_REG_BASE + 0x51bfd*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x51bfe*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51bff*4+0x02000000,0xc0a8); +reg_write( DDR_REG_BASE + 0x51c00*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x51c01*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x51c02*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x51c03*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x51c04*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x51c05*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x51c06*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x51c07*4+0x02000000,0x2482); +reg_write( DDR_REG_BASE + 0x51c08*4+0x02000000,0x3403); +reg_write( DDR_REG_BASE + 0x51c09*4+0x02000000,0xffa); +reg_write( DDR_REG_BASE + 0x51c0a*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x51c0b*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51c0c*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51c0d*4+0x02000000,0x7083); +reg_write( DDR_REG_BASE + 0x51c0e*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51c0f*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x51c10*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE + 0x51c11*4+0x02000000,0xc087); +reg_write( DDR_REG_BASE + 0x51c12*4+0x02000000,0xd9ff); +reg_write( DDR_REG_BASE + 0x51c13*4+0x02000000,0x86e); +reg_write( DDR_REG_BASE + 0x51c14*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE + 0x51c15*4+0x02000000,0xdab4); +reg_write( DDR_REG_BASE + 0x51c16*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x51c17*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51c18*4+0x02000000,0x2100); +reg_write( DDR_REG_BASE + 0x51c19*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x51c1a*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x51c1b*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x51c1c*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x51c1d*4+0x02000000,0xe004); +reg_write( DDR_REG_BASE + 0x51c1e*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x51c1f*4+0x02000000,0x7084); +reg_write( DDR_REG_BASE + 0x51c20*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x51c21*4+0x02000000,0xfec4); +reg_write( DDR_REG_BASE + 0x51c22*4+0x02000000,0xca08); +reg_write( DDR_REG_BASE + 0x51c23*4+0x02000000,0xf014); +reg_write( DDR_REG_BASE + 0x51c24*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51c25*4+0x02000000,0x4528); +reg_write( DDR_REG_BASE + 0x51c26*4+0x02000000,0x2244); +reg_write( DDR_REG_BASE + 0x51c27*4+0x02000000,0x7c1); +reg_write( DDR_REG_BASE + 0x51c28*4+0x02000000,0x6a81); +reg_write( DDR_REG_BASE + 0x51c29*4+0x02000000,0x229a); +reg_write( DDR_REG_BASE + 0x51c2a*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x51c2b*4+0x02000000,0xe906); +reg_write( DDR_REG_BASE + 0x51c2c*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE + 0x51c2d*4+0x02000000,0x901); +reg_write( DDR_REG_BASE + 0x51c2e*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x51c2f*4+0x02000000,0x7dbb); +reg_write( DDR_REG_BASE + 0x51c30*4+0x02000000,0x2205); +reg_write( DDR_REG_BASE + 0x51c31*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x51c32*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x51c33*4+0x02000000,0xe0c4); +reg_write( DDR_REG_BASE + 0x51c34*4+0x02000000,0xb1a0); +reg_write( DDR_REG_BASE + 0x51c35*4+0x02000000,0x4281); +reg_write( DDR_REG_BASE + 0x51c36*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51c37*4+0x02000000,0xadd); +reg_write( DDR_REG_BASE + 0x51c38*4+0x02000000,0x8234); +reg_write( DDR_REG_BASE + 0x51c39*4+0x02000000,0xc140); +reg_write( DDR_REG_BASE + 0x51c3a*4+0x02000000,0x231a); +reg_write( DDR_REG_BASE + 0x51c3b*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x51c3c*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x51c3d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51c3e*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51c3f*4+0x02000000,0x709b); +reg_write( DDR_REG_BASE + 0x51c40*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51c41*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE + 0x51c42*4+0x02000000,0xc145); +reg_write( DDR_REG_BASE + 0x51c43*4+0x02000000,0xd907); +reg_write( DDR_REG_BASE + 0x51c44*4+0x02000000,0x7916); +reg_write( DDR_REG_BASE + 0x51c45*4+0x02000000,0xc143); +reg_write( DDR_REG_BASE + 0x51c46*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE + 0x51c47*4+0x02000000,0xe098); +reg_write( DDR_REG_BASE + 0x51c48*4+0x02000000,0x1b4); +reg_write( DDR_REG_BASE + 0x51c49*4+0x02000000,0xd); +reg_write( DDR_REG_BASE + 0x51c4a*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x51c4b*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51c4c*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE + 0x51c4d*4+0x02000000,0x8821); +reg_write( DDR_REG_BASE + 0x51c4e*4+0x02000000,0xf016); +reg_write( DDR_REG_BASE + 0x51c4f*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x51c50*4+0x02000000,0x2055); +reg_write( DDR_REG_BASE + 0x51c51*4+0x02000000,0x8c2); +reg_write( DDR_REG_BASE + 0x51c52*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x51c53*4+0x02000000,0x7a05); +reg_write( DDR_REG_BASE + 0x51c54*4+0x02000000,0xd8ef); +reg_write( DDR_REG_BASE + 0x51c55*4+0x02000000,0x2004); +reg_write( DDR_REG_BASE + 0x51c56*4+0x02000000,0x6c0); +reg_write( DDR_REG_BASE + 0x51c57*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x51c58*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x51c59*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51c5a*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x51c5b*4+0x02000000,0x7167); +reg_write( DDR_REG_BASE + 0x51c5c*4+0x02000000,0x7845); +reg_write( DDR_REG_BASE + 0x51c5d*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x51c5e*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x51c5f*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE + 0x51c60*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x51c61*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x51c62*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE + 0x51c63*4+0x02000000,0xb200); +reg_write( DDR_REG_BASE + 0x51c64*4+0x02000000,0x202f); +reg_write( DDR_REG_BASE + 0x51c65*4+0x02000000,0x6c7); +reg_write( DDR_REG_BASE + 0x51c66*4+0x02000000,0x9d3); +reg_write( DDR_REG_BASE + 0x51c67*4+0x02000000,0x8005); +reg_write( DDR_REG_BASE + 0x51c68*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x51c69*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51c6a*4+0x02000000,0x2100); +reg_write( DDR_REG_BASE + 0x51c6b*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x51c6c*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x51c6d*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x51c6e*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x51c6f*4+0x02000000,0xe004); +reg_write( DDR_REG_BASE + 0x51c70*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x51c71*4+0x02000000,0x7344); +reg_write( DDR_REG_BASE + 0x51c72*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x51c73*4+0x02000000,0xfe64); +reg_write( DDR_REG_BASE + 0x51c74*4+0x02000000,0xd32); +reg_write( DDR_REG_BASE + 0x51c75*4+0x02000000,0xff8f); +reg_write( DDR_REG_BASE + 0x51c76*4+0x02000000,0xd2e); +reg_write( DDR_REG_BASE + 0x51c77*4+0x02000000,0xff8f); +reg_write( DDR_REG_BASE + 0x51c78*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x51c79*4+0x02000000,0xece); +reg_write( DDR_REG_BASE + 0x51c7a*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x51c7b*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x51c7c*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE + 0x51c7d*4+0x02000000,0xaa2); +reg_write( DDR_REG_BASE + 0x51c7e*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x51c7f*4+0x02000000,0x218a); +reg_write( DDR_REG_BASE + 0x51c80*4+0x02000000,0xfc7); +reg_write( DDR_REG_BASE + 0x51c81*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE + 0x51c82*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE + 0x51c83*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x51c84*4+0x02000000,0xe024); +reg_write( DDR_REG_BASE + 0x51c85*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51c86*4+0x02000000,0xb600); +reg_write( DDR_REG_BASE + 0x51c87*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x51c88*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x51c89*4+0x02000000,0xb606); +reg_write( DDR_REG_BASE + 0x51c8a*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE + 0x51c8b*4+0x02000000,0x3c4); +reg_write( DDR_REG_BASE + 0x51c8c*4+0x02000000,0x1efe); +reg_write( DDR_REG_BASE + 0x51c8d*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x51c8e*4+0x02000000,0xb8e); +reg_write( DDR_REG_BASE + 0x51c8f*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x51c90*4+0x02000000,0xd818); +reg_write( DDR_REG_BASE + 0x51c91*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE + 0x51c92*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x51c93*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x51c94*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x51c95*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x51c96*4+0x02000000,0xe004); +reg_write( DDR_REG_BASE + 0x51c97*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x51c98*4+0x02000000,0xe8e); +reg_write( DDR_REG_BASE + 0x51c99*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x51c9a*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x51c9b*4+0x02000000,0xd807); +reg_write( DDR_REG_BASE + 0x51c9c*4+0x02000000,0xb72); +reg_write( DDR_REG_BASE + 0x51c9d*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x51c9e*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51c9f*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE + 0x51ca0*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x51ca1*4+0x02000000,0xb600); +reg_write( DDR_REG_BASE + 0x51ca2*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x51ca3*4+0x02000000,0xb606); +reg_write( DDR_REG_BASE + 0x51ca4*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x51ca5*4+0x02000000,0xe76); +reg_write( DDR_REG_BASE + 0x51ca6*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x51ca7*4+0x02000000,0x1efe); +reg_write( DDR_REG_BASE + 0x51ca8*4+0x02000000,0x93c5); +reg_write( DDR_REG_BASE + 0x51ca9*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE + 0x51caa*4+0x02000000,0xb56); +reg_write( DDR_REG_BASE + 0x51cab*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x51cac*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51cad*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x51cae*4+0x02000000,0xe62); +reg_write( DDR_REG_BASE + 0x51caf*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x51cb0*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x51cb1*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x51cb2*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51cb3*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x51cb4*4+0x02000000,0x1fc5); +reg_write( DDR_REG_BASE + 0x51cb5*4+0x02000000,0x1e0c); +reg_write( DDR_REG_BASE + 0x51cb6*4+0x02000000,0x1fc5); +reg_write( DDR_REG_BASE + 0x51cb7*4+0x02000000,0xb3e); +reg_write( DDR_REG_BASE + 0x51cb8*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x51cb9*4+0x02000000,0x1efe); +reg_write( DDR_REG_BASE + 0x51cba*4+0x02000000,0x9344); +reg_write( DDR_REG_BASE + 0x51cbb*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x51cbc*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51cbd*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE + 0x51cbe*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51cbf*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE + 0x51cc0*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51cc1*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE + 0x51cc2*4+0x02000000,0x8801); +reg_write( DDR_REG_BASE + 0x51cc3*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE + 0x51cc4*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x51cc5*4+0x02000000,0x64); +reg_write( DDR_REG_BASE + 0x51cc6*4+0x02000000,0x4338); +reg_write( DDR_REG_BASE + 0x51cc7*4+0x02000000,0xc046); +reg_write( DDR_REG_BASE + 0x51cc8*4+0x02000000,0xf04f); +reg_write( DDR_REG_BASE + 0x51cc9*4+0x02000000,0x221a); +reg_write( DDR_REG_BASE + 0x51cca*4+0x02000000,0xf9e); +reg_write( DDR_REG_BASE + 0x51ccb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51ccc*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x51ccd*4+0x02000000,0x708d); +reg_write( DDR_REG_BASE + 0x51cce*4+0x02000000,0x716d); +reg_write( DDR_REG_BASE + 0x51ccf*4+0x02000000,0xf046); +reg_write( DDR_REG_BASE + 0x51cd0*4+0x02000000,0x225f); +reg_write( DDR_REG_BASE + 0x51cd1*4+0x02000000,0x480); +reg_write( DDR_REG_BASE + 0x51cd2*4+0x02000000,0x74b5); +reg_write( DDR_REG_BASE + 0x51cd3*4+0x02000000,0x24c0); +reg_write( DDR_REG_BASE + 0x51cd4*4+0x02000000,0x1061); +reg_write( DDR_REG_BASE + 0x51cd5*4+0x02000000,0x23ca); +reg_write( DDR_REG_BASE + 0x51cd6*4+0x02000000,0x1061); +reg_write( DDR_REG_BASE + 0x51cd7*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x51cd8*4+0x02000000,0xc301); +reg_write( DDR_REG_BASE + 0x51cd9*4+0x02000000,0xc087); +reg_write( DDR_REG_BASE + 0x51cda*4+0x02000000,0x631b); +reg_write( DDR_REG_BASE + 0x51cdb*4+0x02000000,0x7bb4); +reg_write( DDR_REG_BASE + 0x51cdc*4+0x02000000,0x9300); +reg_write( DDR_REG_BASE + 0x51cdd*4+0x02000000,0xe0c0); +reg_write( DDR_REG_BASE + 0x51cde*4+0x02000000,0x6a); +reg_write( DDR_REG_BASE + 0x51cdf*4+0x02000000,0x25); +reg_write( DDR_REG_BASE + 0x51ce0*4+0x02000000,0x40a1); +reg_write( DDR_REG_BASE + 0x51ce1*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x51ce2*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x51ce3*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x51ce4*4+0x02000000,0x780); +reg_write( DDR_REG_BASE + 0x51ce5*4+0x02000000,0x7f1b); +reg_write( DDR_REG_BASE + 0x51ce6*4+0x02000000,0x7fc5); +reg_write( DDR_REG_BASE + 0x51ce7*4+0x02000000,0x9700); +reg_write( DDR_REG_BASE + 0x51ce8*4+0x02000000,0x7014); +reg_write( DDR_REG_BASE + 0x51ce9*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE + 0x51cea*4+0x02000000,0x23ca); +reg_write( DDR_REG_BASE + 0x51ceb*4+0x02000000,0x1021); +reg_write( DDR_REG_BASE + 0x51cec*4+0x02000000,0x20ca); +reg_write( DDR_REG_BASE + 0x51ced*4+0x02000000,0x21); +reg_write( DDR_REG_BASE + 0x51cee*4+0x02000000,0xb43); +reg_write( DDR_REG_BASE + 0x51cef*4+0x02000000,0x1030); +reg_write( DDR_REG_BASE + 0x51cf0*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x51cf1*4+0x02000000,0x78af); +reg_write( DDR_REG_BASE + 0x51cf2*4+0x02000000,0x80d); +reg_write( DDR_REG_BASE + 0x51cf3*4+0x02000000,0xd0); +reg_write( DDR_REG_BASE + 0x51cf4*4+0x02000000,0x83b); +reg_write( DDR_REG_BASE + 0x51cf5*4+0x02000000,0x210); +reg_write( DDR_REG_BASE + 0x51cf6*4+0x02000000,0x83b); +reg_write( DDR_REG_BASE + 0x51cf7*4+0x02000000,0x1d1); +reg_write( DDR_REG_BASE + 0x51cf8*4+0x02000000,0x788f); +reg_write( DDR_REG_BASE + 0x51cf9*4+0x02000000,0x2079); +reg_write( DDR_REG_BASE + 0x51cfa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51cfb*4+0x02000000,0x205f); +reg_write( DDR_REG_BASE + 0x51cfc*4+0x02000000,0x100); +reg_write( DDR_REG_BASE + 0x51cfd*4+0x02000000,0xf00f); +reg_write( DDR_REG_BASE + 0x51cfe*4+0x02000000,0xc301); +reg_write( DDR_REG_BASE + 0x51cff*4+0x02000000,0x677f); +reg_write( DDR_REG_BASE + 0x51d00*4+0x02000000,0x7f14); +reg_write( DDR_REG_BASE + 0x51d01*4+0x02000000,0x6861); +reg_write( DDR_REG_BASE + 0x51d02*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x51d03*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x51d04*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x51d05*4+0x02000000,0x780); +reg_write( DDR_REG_BASE + 0x51d06*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x51d07*4+0x02000000,0x78c5); +reg_write( DDR_REG_BASE + 0x51d08*4+0x02000000,0x9000); +reg_write( DDR_REG_BASE + 0x51d09*4+0x02000000,0xb700); +reg_write( DDR_REG_BASE + 0x51d0a*4+0x02000000,0x4060); +reg_write( DDR_REG_BASE + 0x51d0b*4+0x02000000,0xde9); +reg_write( DDR_REG_BASE + 0x51d0c*4+0x02000000,0x9025); +reg_write( DDR_REG_BASE + 0x51d0d*4+0x02000000,0xc787); +reg_write( DDR_REG_BASE + 0x51d0e*4+0x02000000,0xf005); +reg_write( DDR_REG_BASE + 0x51d0f*4+0x02000000,0x706d); +reg_write( DDR_REG_BASE + 0x51d10*4+0x02000000,0xf003); +reg_write( DDR_REG_BASE + 0x51d11*4+0x02000000,0x9700); +reg_write( DDR_REG_BASE + 0x51d12*4+0x02000000,0xb300); +reg_write( DDR_REG_BASE + 0x51d13*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE + 0x51d14*4+0x02000000,0xd79); +reg_write( DDR_REG_BASE + 0x51d15*4+0x02000000,0x9214); +reg_write( DDR_REG_BASE + 0x51d16*4+0x02000000,0x7124); +reg_write( DDR_REG_BASE + 0x51d17*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE + 0x51d18*4+0x02000000,0x7a2f); +reg_write( DDR_REG_BASE + 0x51d19*4+0x02000000,0x863); +reg_write( DDR_REG_BASE + 0x51d1a*4+0x02000000,0x80a5); +reg_write( DDR_REG_BASE + 0x51d1b*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x51d1c*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE + 0x51d1d*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE + 0x51d1e*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x51d1f*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE + 0x51d20*4+0x02000000,0x7014); +reg_write( DDR_REG_BASE + 0x51d21*4+0x02000000,0xf326); +reg_write( DDR_REG_BASE + 0x51d22*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51d23*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x51d24*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51d25*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51d26*4+0x02000000,0xb8c3); +reg_write( DDR_REG_BASE + 0x51d27*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x51d28*4+0x02000000,0xf02c); +reg_write( DDR_REG_BASE + 0x51d29*4+0x02000000,0x275f); +reg_write( DDR_REG_BASE + 0x51d2a*4+0x02000000,0x1480); +reg_write( DDR_REG_BASE + 0x51d2b*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x51d2c*4+0x02000000,0x47); +reg_write( DDR_REG_BASE + 0x51d2d*4+0x02000000,0x2); +reg_write( DDR_REG_BASE + 0x51d2e*4+0x02000000,0x42e1); +reg_write( DDR_REG_BASE + 0x51d2f*4+0x02000000,0x661e); +reg_write( DDR_REG_BASE + 0x51d30*4+0x02000000,0x26f4); +reg_write( DDR_REG_BASE + 0x51d31*4+0x02000000,0x1340); +reg_write( DDR_REG_BASE + 0x51d32*4+0x02000000,0x43a1); +reg_write( DDR_REG_BASE + 0x51d33*4+0x02000000,0xe8a); +reg_write( DDR_REG_BASE + 0x51d34*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE + 0x51d35*4+0x02000000,0x20bc); +reg_write( DDR_REG_BASE + 0x51d36*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x51d37*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x51d38*4+0x02000000,0x271a); +reg_write( DDR_REG_BASE + 0x51d39*4+0x02000000,0x1f81); +reg_write( DDR_REG_BASE + 0x51d3a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51d3b*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x51d3c*4+0x02000000,0x26f4); +reg_write( DDR_REG_BASE + 0x51d3d*4+0x02000000,0x1342); +reg_write( DDR_REG_BASE + 0x51d3e*4+0x02000000,0x2054); +reg_write( DDR_REG_BASE + 0x51d3f*4+0x02000000,0xd00); +reg_write( DDR_REG_BASE + 0x51d40*4+0x02000000,0x7905); +reg_write( DDR_REG_BASE + 0x51d41*4+0x02000000,0x40a1); +reg_write( DDR_REG_BASE + 0x51d42*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x51d43*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x51d44*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE + 0x51d45*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x51d46*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x51d47*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x51d48*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x51d49*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x51d4a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51d4b*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x51d4c*4+0x02000000,0x6058); +reg_write( DDR_REG_BASE + 0x51d4d*4+0x02000000,0x2049); +reg_write( DDR_REG_BASE + 0x51d4e*4+0x02000000,0xfc0); +reg_write( DDR_REG_BASE + 0x51d4f*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE + 0x51d50*4+0x02000000,0xdb3); +reg_write( DDR_REG_BASE + 0x51d51*4+0x02000000,0x9234); +reg_write( DDR_REG_BASE + 0x51d52*4+0x02000000,0xc687); +reg_write( DDR_REG_BASE + 0x51d53*4+0x02000000,0x7167); +reg_write( DDR_REG_BASE + 0x51d54*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x51d55*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51d56*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE + 0x51d57*4+0x02000000,0x8801); +reg_write( DDR_REG_BASE + 0x51d58*4+0x02000000,0x272f); +reg_write( DDR_REG_BASE + 0x51d59*4+0x02000000,0x16c7); +reg_write( DDR_REG_BASE + 0x51d5a*4+0x02000000,0x8ed); +reg_write( DDR_REG_BASE + 0x51d5b*4+0x02000000,0x83e5); +reg_write( DDR_REG_BASE + 0x51d5c*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x51d5d*4+0x02000000,0x2480); +reg_write( DDR_REG_BASE + 0x51d5e*4+0x02000000,0x3403); +reg_write( DDR_REG_BASE + 0x51d5f*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x51d60*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x51d61*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x51d62*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x51d63*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x51d64*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x51d65*4+0x02000000,0x2482); +reg_write( DDR_REG_BASE + 0x51d66*4+0x02000000,0x390a); +reg_write( DDR_REG_BASE + 0x51d67*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x51d68*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51d69*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x51d6a*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51d6b*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x51d6c*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x51d6d*4+0x02000000,0x4a); +reg_write( DDR_REG_BASE + 0x51d6e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51d6f*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x51d70*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x51d71*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x51d72*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51d73*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x51d74*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x51d75*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x51d76*4+0x02000000,0x86); +reg_write( DDR_REG_BASE + 0x51d77*4+0x02000000,0x9000); +reg_write( DDR_REG_BASE + 0x51d78*4+0x02000000,0x2084); +reg_write( DDR_REG_BASE + 0x51d79*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x51d7a*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x51d7b*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x51d7c*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x51d7d*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x51d7e*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x51d7f*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x51d80*4+0x02000000,0xdee); +reg_write( DDR_REG_BASE + 0x51d81*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE + 0x51d82*4+0x02000000,0x2052); +reg_write( DDR_REG_BASE + 0x51d83*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51d84*4+0x02000000,0xb7a); +reg_write( DDR_REG_BASE + 0x51d85*4+0x02000000,0xff0f); +reg_write( DDR_REG_BASE + 0x51d86*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x51d87*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x51d88*4+0x02000000,0x7005); +reg_write( DDR_REG_BASE + 0x51d89*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x51d8a*4+0x02000000,0xe004); +reg_write( DDR_REG_BASE + 0x51d8b*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x51d8c*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x51d8d*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x51d8e*4+0x02000000,0xff68); +reg_write( DDR_REG_BASE + 0x51d8f*4+0x02000000,0xca0a); +reg_write( DDR_REG_BASE + 0x51d90*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE + 0x51d91*4+0x02000000,0x208c); +reg_write( DDR_REG_BASE + 0x51d92*4+0x02000000,0x8fc3); +reg_write( DDR_REG_BASE + 0x51d93*4+0x02000000,0xf40f); +reg_write( DDR_REG_BASE + 0x51d94*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51d95*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x51d96*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51d97*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51d98*4+0x02000000,0xb8e5); +reg_write( DDR_REG_BASE + 0x51d99*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x51d9a*4+0x02000000,0xf207); +reg_write( DDR_REG_BASE + 0x51d9b*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51d9c*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x51d9d*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51d9e*4+0x02000000,0x7b1); +reg_write( DDR_REG_BASE + 0x51d9f*4+0x02000000,0x1a0a); +reg_write( DDR_REG_BASE + 0x51da0*4+0x02000000,0x3002); +reg_write( DDR_REG_BASE + 0x51da1*4+0x02000000,0xc102); +reg_write( DDR_REG_BASE + 0x51da2*4+0x02000000,0x2144); +reg_write( DDR_REG_BASE + 0x51da3*4+0x02000000,0x7c3); +reg_write( DDR_REG_BASE + 0x51da4*4+0x02000000,0x4140); +reg_write( DDR_REG_BASE + 0x51da5*4+0x02000000,0xeb06); +reg_write( DDR_REG_BASE + 0x51da6*4+0x02000000,0xbb61); +reg_write( DDR_REG_BASE + 0x51da7*4+0x02000000,0xb01); +reg_write( DDR_REG_BASE + 0x51da8*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x51da9*4+0x02000000,0x793b); +reg_write( DDR_REG_BASE + 0x51daa*4+0x02000000,0xc145); +reg_write( DDR_REG_BASE + 0x51dab*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51dac*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE + 0x51dad*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51dae*4+0x02000000,0x7b1); +reg_write( DDR_REG_BASE + 0x51daf*4+0x02000000,0x33b); +reg_write( DDR_REG_BASE + 0x51db0*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x51db1*4+0x02000000,0x2139); +reg_write( DDR_REG_BASE + 0x51db2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51db3*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x51db4*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x51db5*4+0x02000000,0xc7a); +reg_write( DDR_REG_BASE + 0x51db6*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE + 0x51db7*4+0x02000000,0xc046); +reg_write( DDR_REG_BASE + 0x51db8*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE + 0x51db9*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x51dba*4+0x02000000,0xed06); +reg_write( DDR_REG_BASE + 0x51dbb*4+0x02000000,0xc96); +reg_write( DDR_REG_BASE + 0x51dbc*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x51dbd*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x51dbe*4+0x02000000,0x311); +reg_write( DDR_REG_BASE + 0x51dbf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51dc0*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51dc1*4+0x02000000,0xc8a); +reg_write( DDR_REG_BASE + 0x51dc2*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x51dc3*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x51dc4*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51dc5*4+0x02000000,0x709b); +reg_write( DDR_REG_BASE + 0x51dc6*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51dc7*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x51dc8*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE + 0x51dc9*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x51dca*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE + 0x51dcb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51dcc*4+0x02000000,0x248); +reg_write( DDR_REG_BASE + 0x51dcd*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x51dce*4+0x02000000,0xcf6); +reg_write( DDR_REG_BASE + 0x51dcf*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x51dd0*4+0x02000000,0xda5a); +reg_write( DDR_REG_BASE + 0x51dd1*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x51dd2*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE + 0x51dd3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51dd4*4+0x02000000,0x194); +reg_write( DDR_REG_BASE + 0x51dd5*4+0x02000000,0xcea); +reg_write( DDR_REG_BASE + 0x51dd6*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x51dd7*4+0x02000000,0xdab4); +reg_write( DDR_REG_BASE + 0x51dd8*4+0x02000000,0xdee); +reg_write( DDR_REG_BASE + 0x51dd9*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x51dda*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE + 0x51ddb*4+0x02000000,0xb04); +reg_write( DDR_REG_BASE + 0x51ddc*4+0x02000000,0xd86); +reg_write( DDR_REG_BASE + 0x51ddd*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x51dde*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE + 0x51ddf*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x51de0*4+0x02000000,0x7344); +reg_write( DDR_REG_BASE + 0x51de1*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x51de2*4+0x02000000,0xfec4); +reg_write( DDR_REG_BASE + 0x51de3*4+0x02000000,0xca08); +reg_write( DDR_REG_BASE + 0x51de4*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x51de5*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE + 0x51de6*4+0x02000000,0x4200); +reg_write( DDR_REG_BASE + 0x51de7*4+0x02000000,0x2544); +reg_write( DDR_REG_BASE + 0x51de8*4+0x02000000,0x17c0); +reg_write( DDR_REG_BASE + 0x51de9*4+0x02000000,0x6d21); +reg_write( DDR_REG_BASE + 0x51dea*4+0x02000000,0x259a); +reg_write( DDR_REG_BASE + 0x51deb*4+0x02000000,0x1008); +reg_write( DDR_REG_BASE + 0x51dec*4+0x02000000,0xe805); +reg_write( DDR_REG_BASE + 0x51ded*4+0x02000000,0xb861); +reg_write( DDR_REG_BASE + 0x51dee*4+0x02000000,0x8ff); +reg_write( DDR_REG_BASE + 0x51def*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE + 0x51df0*4+0x02000000,0x7a5b); +reg_write( DDR_REG_BASE + 0x51df1*4+0x02000000,0x2505); +reg_write( DDR_REG_BASE + 0x51df2*4+0x02000000,0x1f80); +reg_write( DDR_REG_BASE + 0x51df3*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x51df4*4+0x02000000,0xe0c4); +reg_write( DDR_REG_BASE + 0x51df5*4+0x02000000,0xb040); +reg_write( DDR_REG_BASE + 0x51df6*4+0x02000000,0x4528); +reg_write( DDR_REG_BASE + 0x51df7*4+0x02000000,0xde1); +reg_write( DDR_REG_BASE + 0x51df8*4+0x02000000,0x9234); +reg_write( DDR_REG_BASE + 0x51df9*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x51dfa*4+0x02000000,0xd880); +reg_write( DDR_REG_BASE + 0x51dfb*4+0x02000000,0xb88e); +reg_write( DDR_REG_BASE + 0x51dfc*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x51dfd*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x51dfe*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x51dff*4+0x02000000,0xe004); +reg_write( DDR_REG_BASE + 0x51e00*4+0x02000000,0x231a); +reg_write( DDR_REG_BASE + 0x51e01*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE + 0x51e02*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x51e03*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51e04*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE + 0x51e05*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE + 0x51e06*4+0x02000000,0xe1c6); +reg_write( DDR_REG_BASE + 0x51e07*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x51e08*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x51e09*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x51e0a*4+0x02000000,0xfe86); +reg_write( DDR_REG_BASE + 0x51e0b*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x51e0c*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x51e0d*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x51e0e*4+0x02000000,0x86); +reg_write( DDR_REG_BASE + 0x51e0f*4+0x02000000,0x9000); +reg_write( DDR_REG_BASE + 0x51e10*4+0x02000000,0xb8a0); +reg_write( DDR_REG_BASE + 0x51e11*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE + 0x51e12*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51e13*4+0x02000000,0x710d); +reg_write( DDR_REG_BASE + 0x51e14*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x51e15*4+0x02000000,0x1c6); +reg_write( DDR_REG_BASE + 0x51e16*4+0x02000000,0xd80a); +reg_write( DDR_REG_BASE + 0x51e17*4+0x02000000,0xbdc9); +reg_write( DDR_REG_BASE + 0x51e18*4+0x02000000,0x254f); +reg_write( DDR_REG_BASE + 0x51e19*4+0x02000000,0x12cf); +reg_write( DDR_REG_BASE + 0x51e1a*4+0x02000000,0xa2e); +reg_write( DDR_REG_BASE + 0x51e1b*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x51e1c*4+0x02000000,0xb6e0); +reg_write( DDR_REG_BASE + 0x51e1d*4+0x02000000,0x2505); +reg_write( DDR_REG_BASE + 0x51e1e*4+0x02000000,0x1f80); +reg_write( DDR_REG_BASE + 0x51e1f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51e20*4+0x02000000,0xc00); +reg_write( DDR_REG_BASE + 0x51e21*4+0x02000000,0xb600); +reg_write( DDR_REG_BASE + 0x51e22*4+0x02000000,0xa1e); +reg_write( DDR_REG_BASE + 0x51e23*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x51e24*4+0x02000000,0xd80a); +reg_write( DDR_REG_BASE + 0x51e25*4+0x02000000,0xd80a); +reg_write( DDR_REG_BASE + 0x51e26*4+0x02000000,0xa16); +reg_write( DDR_REG_BASE + 0x51e27*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x51e28*4+0x02000000,0xb6e0); +reg_write( DDR_REG_BASE + 0x51e29*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x51e2a*4+0x02000000,0x7101); +reg_write( DDR_REG_BASE + 0x51e2b*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x51e2c*4+0x02000000,0x1c8); +reg_write( DDR_REG_BASE + 0x51e2d*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE + 0x51e2e*4+0x02000000,0xf0f); +reg_write( DDR_REG_BASE + 0x51e2f*4+0x02000000,0xda3f); +reg_write( DDR_REG_BASE + 0x51e30*4+0x02000000,0x7824); +reg_write( DDR_REG_BASE + 0x51e31*4+0x02000000,0x208c); +reg_write( DDR_REG_BASE + 0x51e32*4+0x02000000,0x8f03); +reg_write( DDR_REG_BASE + 0x51e33*4+0x02000000,0xb6a0); +reg_write( DDR_REG_BASE + 0x51e34*4+0x02000000,0xf745); +reg_write( DDR_REG_BASE + 0x51e35*4+0x02000000,0x2184); +reg_write( DDR_REG_BASE + 0x51e36*4+0x02000000,0xf03); +reg_write( DDR_REG_BASE + 0x51e37*4+0x02000000,0x7a3d); +reg_write( DDR_REG_BASE + 0x51e38*4+0x02000000,0x7a5d); +reg_write( DDR_REG_BASE + 0x51e39*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE + 0x51e3a*4+0x02000000,0xdb07); +reg_write( DDR_REG_BASE + 0x51e3b*4+0x02000000,0x231a); +reg_write( DDR_REG_BASE + 0x51e3c*4+0x02000000,0x3f9b); +reg_write( DDR_REG_BASE + 0x51e3d*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x51e3e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51e3f*4+0x02000000,0x7b16); +reg_write( DDR_REG_BASE + 0x51e40*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x51e41*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51e42*4+0x02000000,0x7b1); +reg_write( DDR_REG_BASE + 0x51e43*4+0x02000000,0x8824); +reg_write( DDR_REG_BASE + 0x51e44*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x51e45*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51e46*4+0x02000000,0x7b1); +reg_write( DDR_REG_BASE + 0x51e47*4+0x02000000,0x88c3); +reg_write( DDR_REG_BASE + 0x51e48*4+0x02000000,0x1c1c); +reg_write( DDR_REG_BASE + 0x51e49*4+0x02000000,0x36c0); +reg_write( DDR_REG_BASE + 0x51e4a*4+0x02000000,0x44c9); +reg_write( DDR_REG_BASE + 0x51e4b*4+0x02000000,0xf012); +reg_write( DDR_REG_BASE + 0x51e4c*4+0x02000000,0x7884); +reg_write( DDR_REG_BASE + 0x51e4d*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x51e4e*4+0x02000000,0xf8d); +reg_write( DDR_REG_BASE + 0x51e4f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51e50*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x51e51*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x51e52*4+0x02000000,0x7185); +reg_write( DDR_REG_BASE + 0x51e53*4+0x02000000,0x2054); +reg_write( DDR_REG_BASE + 0x51e54*4+0x02000000,0xd00); +reg_write( DDR_REG_BASE + 0x51e55*4+0x02000000,0x78a5); +reg_write( DDR_REG_BASE + 0x51e56*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x51e57*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x51e58*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x51e59*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x51e5a*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x51e5b*4+0x02000000,0xb040); +reg_write( DDR_REG_BASE + 0x51e5c*4+0x02000000,0x788f); +reg_write( DDR_REG_BASE + 0x51e5d*4+0x02000000,0x9e1); +reg_write( DDR_REG_BASE + 0x51e5e*4+0x02000000,0x8025); +reg_write( DDR_REG_BASE + 0x51e5f*4+0x02000000,0xd8ef); +reg_write( DDR_REG_BASE + 0x51e60*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x51e61*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x51e62*4+0x02000000,0xe024); +reg_write( DDR_REG_BASE + 0x51e63*4+0x02000000,0x228a); +reg_write( DDR_REG_BASE + 0x51e64*4+0x02000000,0x3c4); +reg_write( DDR_REG_BASE + 0x51e65*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x51e66*4+0x02000000,0xb060); +reg_write( DDR_REG_BASE + 0x51e67*4+0x02000000,0x180c); +reg_write( DDR_REG_BASE + 0x51e68*4+0x02000000,0x45); +reg_write( DDR_REG_BASE + 0x51e69*4+0x02000000,0x18fe); +reg_write( DDR_REG_BASE + 0x51e6a*4+0x02000000,0x8084); +reg_write( DDR_REG_BASE + 0x51e6b*4+0x02000000,0xf0a0); +reg_write( DDR_REG_BASE + 0x51e6c*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x51e6d*4+0x02000000,0x2055); +reg_write( DDR_REG_BASE + 0x51e6e*4+0x02000000,0x8c2); +reg_write( DDR_REG_BASE + 0x51e6f*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE + 0x51e70*4+0x02000000,0x7a05); +reg_write( DDR_REG_BASE + 0x51e71*4+0x02000000,0xd8ef); +reg_write( DDR_REG_BASE + 0x51e72*4+0x02000000,0x78c4); +reg_write( DDR_REG_BASE + 0x51e73*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x51e74*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x51e75*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51e76*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x51e77*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE + 0x51e78*4+0x02000000,0x7845); +reg_write( DDR_REG_BASE + 0x51e79*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x51e7a*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x51e7b*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x51e7c*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x51e7d*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x51e7e*4+0x02000000,0xb0a0); +reg_write( DDR_REG_BASE + 0x51e7f*4+0x02000000,0x78cf); +reg_write( DDR_REG_BASE + 0x51e80*4+0x02000000,0x9d9); +reg_write( DDR_REG_BASE + 0x51e81*4+0x02000000,0x8005); +reg_write( DDR_REG_BASE + 0x51e82*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x51e83*4+0x02000000,0xaba); +reg_write( DDR_REG_BASE + 0x51e84*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x51e85*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x51e86*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE + 0x51e87*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x51e88*4+0x02000000,0xfe64); +reg_write( DDR_REG_BASE + 0x51e89*4+0x02000000,0x90a); +reg_write( DDR_REG_BASE + 0x51e8a*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE + 0x51e8b*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x51e8c*4+0x02000000,0x1005); +reg_write( DDR_REG_BASE + 0x51e8d*4+0x02000000,0x902); +reg_write( DDR_REG_BASE + 0x51e8e*4+0x02000000,0xff8f); +reg_write( DDR_REG_BASE + 0x51e8f*4+0x02000000,0x946); +reg_write( DDR_REG_BASE + 0x51e90*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x51e91*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE + 0x51e92*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x51e93*4+0x02000000,0xe76); +reg_write( DDR_REG_BASE + 0x51e94*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x51e95*4+0x02000000,0x218a); +reg_write( DDR_REG_BASE + 0x51e96*4+0x02000000,0xfc7); +reg_write( DDR_REG_BASE + 0x51e97*4+0x02000000,0xd820); +reg_write( DDR_REG_BASE + 0x51e98*4+0x02000000,0xf7a); +reg_write( DDR_REG_BASE + 0x51e99*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE + 0x51e9a*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51e9b*4+0x02000000,0xc08b); +reg_write( DDR_REG_BASE + 0x51e9c*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x51e9d*4+0x02000000,0x9ca); +reg_write( DDR_REG_BASE + 0x51e9e*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x51e9f*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE + 0x51ea0*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x51ea1*4+0x02000000,0xa7e); +reg_write( DDR_REG_BASE + 0x51ea2*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x51ea3*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x51ea4*4+0x02000000,0xd87f); +reg_write( DDR_REG_BASE + 0x51ea5*4+0x02000000,0x8d2); +reg_write( DDR_REG_BASE + 0x51ea6*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE + 0x51ea7*4+0x02000000,0xb600); +reg_write( DDR_REG_BASE + 0x51ea8*4+0x02000000,0x8ca); +reg_write( DDR_REG_BASE + 0x51ea9*4+0x02000000,0xff8f); +reg_write( DDR_REG_BASE + 0x51eaa*4+0x02000000,0x90e); +reg_write( DDR_REG_BASE + 0x51eab*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x51eac*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE + 0x51ead*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE + 0x51eae*4+0x02000000,0xe3e); +reg_write( DDR_REG_BASE + 0x51eaf*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x51eb0*4+0x02000000,0x218a); +reg_write( DDR_REG_BASE + 0x51eb1*4+0x02000000,0xfc7); +reg_write( DDR_REG_BASE + 0x51eb2*4+0x02000000,0xd820); +reg_write( DDR_REG_BASE + 0x51eb3*4+0x02000000,0xf46); +reg_write( DDR_REG_BASE + 0x51eb4*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE + 0x51eb5*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51eb6*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE + 0x51eb7*4+0x02000000,0x3e00); +reg_write( DDR_REG_BASE + 0x51eb8*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x51eb9*4+0x02000000,0x992); +reg_write( DDR_REG_BASE + 0x51eba*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x51ebb*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE + 0x51ebc*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x51ebd*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51ebe*4+0x02000000,0x7b1); +reg_write( DDR_REG_BASE + 0x51ebf*4+0x02000000,0x8863); +reg_write( DDR_REG_BASE + 0x51ec0*4+0x02000000,0x235f); +reg_write( DDR_REG_BASE + 0x51ec1*4+0x02000000,0x240); +reg_write( DDR_REG_BASE + 0x51ec2*4+0x02000000,0xf03a); +reg_write( DDR_REG_BASE + 0x51ec3*4+0x02000000,0xc088); +reg_write( DDR_REG_BASE + 0x51ec4*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x51ec5*4+0x02000000,0xb0a); +reg_write( DDR_REG_BASE + 0x51ec6*4+0x02000000,0xff6f); +reg_write( DDR_REG_BASE + 0x51ec7*4+0x02000000,0xda09); +reg_write( DDR_REG_BASE + 0x51ec8*4+0x02000000,0xc700); +reg_write( DDR_REG_BASE + 0x51ec9*4+0x02000000,0x70cd); +reg_write( DDR_REG_BASE + 0x51eca*4+0x02000000,0xf02d); +reg_write( DDR_REG_BASE + 0x51ecb*4+0x02000000,0x78fb); +reg_write( DDR_REG_BASE + 0x51ecc*4+0x02000000,0x2084); +reg_write( DDR_REG_BASE + 0x51ecd*4+0x02000000,0xf87); +reg_write( DDR_REG_BASE + 0x51ece*4+0x02000000,0xc18b); +reg_write( DDR_REG_BASE + 0x51ecf*4+0x02000000,0x2135); +reg_write( DDR_REG_BASE + 0x51ed0*4+0x02000000,0x1e); +reg_write( DDR_REG_BASE + 0x51ed1*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE + 0x51ed2*4+0x02000000,0x3e01); +reg_write( DDR_REG_BASE + 0x51ed3*4+0x02000000,0x2135); +reg_write( DDR_REG_BASE + 0x51ed4*4+0x02000000,0xb); +reg_write( DDR_REG_BASE + 0x51ed5*4+0x02000000,0x235f); +reg_write( DDR_REG_BASE + 0x51ed6*4+0x02000000,0x3241); +reg_write( DDR_REG_BASE + 0x51ed7*4+0x02000000,0x2302); +reg_write( DDR_REG_BASE + 0x51ed8*4+0x02000000,0x1780); +reg_write( DDR_REG_BASE + 0x51ed9*4+0x02000000,0x2048); +reg_write( DDR_REG_BASE + 0x51eda*4+0x02000000,0x2); +reg_write( DDR_REG_BASE + 0x51edb*4+0x02000000,0xc088); +reg_write( DDR_REG_BASE + 0x51edc*4+0x02000000,0x60d8); +reg_write( DDR_REG_BASE + 0x51edd*4+0x02000000,0xa840); +reg_write( DDR_REG_BASE + 0x51ede*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x51edf*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE + 0x51ee0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51ee1*4+0x02000000,0x248); +reg_write( DDR_REG_BASE + 0x51ee2*4+0x02000000,0x6038); +reg_write( DDR_REG_BASE + 0x51ee3*4+0x02000000,0x60d8); +reg_write( DDR_REG_BASE + 0x51ee4*4+0x02000000,0x8820); +reg_write( DDR_REG_BASE + 0x51ee5*4+0x02000000,0x7c4f); +reg_write( DDR_REG_BASE + 0x51ee6*4+0x02000000,0x91f); +reg_write( DDR_REG_BASE + 0x51ee7*4+0x02000000,0x305); +reg_write( DDR_REG_BASE + 0x51ee8*4+0x02000000,0x235f); +reg_write( DDR_REG_BASE + 0x51ee9*4+0x02000000,0x3481); +reg_write( DDR_REG_BASE + 0x51eea*4+0x02000000,0xa840); +reg_write( DDR_REG_BASE + 0x51eeb*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x51eec*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE + 0x51eed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51eee*4+0x02000000,0x194); +reg_write( DDR_REG_BASE + 0x51eef*4+0x02000000,0x6038); +reg_write( DDR_REG_BASE + 0x51ef0*4+0x02000000,0x2600); +reg_write( DDR_REG_BASE + 0x51ef1*4+0x02000000,0x32c1); +reg_write( DDR_REG_BASE + 0x51ef2*4+0x02000000,0x78d4); +reg_write( DDR_REG_BASE + 0x51ef3*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE + 0x51ef4*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE + 0x51ef5*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE + 0x51ef6*4+0x02000000,0x71e5); +reg_write( DDR_REG_BASE + 0x51ef7*4+0x02000000,0xeab); +reg_write( DDR_REG_BASE + 0x51ef8*4+0x02000000,0x9214); +reg_write( DDR_REG_BASE + 0x51ef9*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE + 0x51efa*4+0x02000000,0x7164); +reg_write( DDR_REG_BASE + 0x51efb*4+0x02000000,0xe009); +reg_write( DDR_REG_BASE + 0x51efc*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x51efd*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x51efe*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51eff*4+0x02000000,0x7b1); +reg_write( DDR_REG_BASE + 0x51f00*4+0x02000000,0x8824); +reg_write( DDR_REG_BASE + 0x51f01*4+0x02000000,0x786f); +reg_write( DDR_REG_BASE + 0x51f02*4+0x02000000,0x983); +reg_write( DDR_REG_BASE + 0x51f03*4+0x02000000,0x8025); +reg_write( DDR_REG_BASE + 0x51f04*4+0x02000000,0x4318); +reg_write( DDR_REG_BASE + 0x51f05*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x51f06*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51f07*4+0x02000000,0x7b1); +reg_write( DDR_REG_BASE + 0x51f08*4+0x02000000,0x88c3); +reg_write( DDR_REG_BASE + 0x51f09*4+0x02000000,0x74a5); +reg_write( DDR_REG_BASE + 0x51f0a*4+0x02000000,0xe59e); +reg_write( DDR_REG_BASE + 0x51f0b*4+0x02000000,0x6ea); +reg_write( DDR_REG_BASE + 0x51f0c*4+0x02000000,0xffce); +reg_write( DDR_REG_BASE + 0x51f0d*4+0x02000000,0xf036); +reg_write( DDR_REG_BASE + 0x51f0e*4+0x02000000,0x255f); +reg_write( DDR_REG_BASE + 0x51f0f*4+0x02000000,0x1241); +reg_write( DDR_REG_BASE + 0x51f10*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x51f11*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE + 0x51f12*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51f13*4+0x02000000,0x248); +reg_write( DDR_REG_BASE + 0x51f14*4+0x02000000,0x43e1); +reg_write( DDR_REG_BASE + 0x51f15*4+0x02000000,0x6038); +reg_write( DDR_REG_BASE + 0x51f16*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x51f17*4+0x02000000,0x3e); +reg_write( DDR_REG_BASE + 0x51f18*4+0x02000000,0x2); +reg_write( DDR_REG_BASE + 0x51f19*4+0x02000000,0xabe); +reg_write( DDR_REG_BASE + 0x51f1a*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE + 0x51f1b*4+0x02000000,0x60e8); +reg_write( DDR_REG_BASE + 0x51f1c*4+0x02000000,0x40e1); +reg_write( DDR_REG_BASE + 0x51f1d*4+0x02000000,0x251a); +reg_write( DDR_REG_BASE + 0x51f1e*4+0x02000000,0x1f82); +reg_write( DDR_REG_BASE + 0x51f1f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51f20*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE + 0x51f21*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x51f22*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x51f23*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x51f24*4+0x02000000,0x3f83); +reg_write( DDR_REG_BASE + 0x51f25*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51f26*4+0x02000000,0x194); +reg_write( DDR_REG_BASE + 0x51f27*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x51f28*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x51f29*4+0x02000000,0x80); +reg_write( DDR_REG_BASE + 0x51f2a*4+0x02000000,0x7a05); +reg_write( DDR_REG_BASE + 0x51f2b*4+0x02000000,0x255f); +reg_write( DDR_REG_BASE + 0x51f2c*4+0x02000000,0x1480); +reg_write( DDR_REG_BASE + 0x51f2d*4+0x02000000,0x2205); +reg_write( DDR_REG_BASE + 0x51f2e*4+0x02000000,0x4c); +reg_write( DDR_REG_BASE + 0x51f2f*4+0x02000000,0x2142); +reg_write( DDR_REG_BASE + 0x51f30*4+0x02000000,0x801); +reg_write( DDR_REG_BASE + 0x51f31*4+0x02000000,0x7945); +reg_write( DDR_REG_BASE + 0x51f32*4+0x02000000,0x631b); +reg_write( DDR_REG_BASE + 0x51f33*4+0x02000000,0x23f4); +reg_write( DDR_REG_BASE + 0x51f34*4+0x02000000,0x3c0); +reg_write( DDR_REG_BASE + 0x51f35*4+0x02000000,0xb400); +reg_write( DDR_REG_BASE + 0x51f36*4+0x02000000,0x23f4); +reg_write( DDR_REG_BASE + 0x51f37*4+0x02000000,0x3c0); +reg_write( DDR_REG_BASE + 0x51f38*4+0x02000000,0x71e5); +reg_write( DDR_REG_BASE + 0x51f39*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE + 0x51f3a*4+0x02000000,0xfa9); +reg_write( DDR_REG_BASE + 0x51f3b*4+0x02000000,0x9234); +reg_write( DDR_REG_BASE + 0x51f3c*4+0x02000000,0x42a1); +reg_write( DDR_REG_BASE + 0x51f3d*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x51f3e*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51f3f*4+0x02000000,0x7b1); +reg_write( DDR_REG_BASE + 0x51f40*4+0x02000000,0x8824); +reg_write( DDR_REG_BASE + 0x51f41*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE + 0x51f42*4+0x02000000,0x7dcf); +reg_write( DDR_REG_BASE + 0x51f43*4+0x02000000,0x9f1); +reg_write( DDR_REG_BASE + 0x51f44*4+0x02000000,0x8365); +reg_write( DDR_REG_BASE + 0x51f45*4+0x02000000,0x70ed); +reg_write( DDR_REG_BASE + 0x51f46*4+0x02000000,0xf3e); +reg_write( DDR_REG_BASE + 0x51f47*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x51f48*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE + 0x51f49*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x51f4a*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE + 0x51f4b*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x51f4c*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x51f4d*4+0x02000000,0x7d0f); +reg_write( DDR_REG_BASE + 0x51f4e*4+0x02000000,0x72b5); +reg_write( DDR_REG_BASE + 0x51f4f*4+0x02000000,0x4ca); +reg_write( DDR_REG_BASE + 0x51f50*4+0x02000000,0xffe5); +reg_write( DDR_REG_BASE + 0x51f51*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x51f52*4+0x02000000,0x2480); +reg_write( DDR_REG_BASE + 0x51f53*4+0x02000000,0x390a); +reg_write( DDR_REG_BASE + 0x51f54*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x51f55*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x51f56*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x51f57*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x51f58*4+0x02000000,0xc0e6); +reg_write( DDR_REG_BASE + 0x51f59*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE + 0x51f5a*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51f5b*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE + 0x51f5c*4+0x02000000,0x8ba0); +reg_write( DDR_REG_BASE + 0x51f5d*4+0x02000000,0x8b81); +reg_write( DDR_REG_BASE + 0x51f5e*4+0x02000000,0x251f); +reg_write( DDR_REG_BASE + 0x51f5f*4+0x02000000,0x108f); +reg_write( DDR_REG_BASE + 0x51f60*4+0x02000000,0xf01b); +reg_write( DDR_REG_BASE + 0x51f61*4+0x02000000,0x251a); +reg_write( DDR_REG_BASE + 0x51f62*4+0x02000000,0x1f9e); +reg_write( DDR_REG_BASE + 0x51f63*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51f64*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x51f65*4+0x02000000,0x239a); +reg_write( DDR_REG_BASE + 0x51f66*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x51f67*4+0x02000000,0x2114); +reg_write( DDR_REG_BASE + 0x51f68*4+0x02000000,0x38e); +reg_write( DDR_REG_BASE + 0x51f69*4+0x02000000,0x2605); +reg_write( DDR_REG_BASE + 0x51f6a*4+0x02000000,0x301e); +reg_write( DDR_REG_BASE + 0x51f6b*4+0x02000000,0x2305); +reg_write( DDR_REG_BASE + 0x51f6c*4+0x02000000,0x783); +reg_write( DDR_REG_BASE + 0x51f6d*4+0x02000000,0x7b7b); +reg_write( DDR_REG_BASE + 0x51f6e*4+0x02000000,0xbb91); +reg_write( DDR_REG_BASE + 0x51f6f*4+0x02000000,0xbb9c); +reg_write( DDR_REG_BASE + 0x51f70*4+0x02000000,0xbb9f); +reg_write( DDR_REG_BASE + 0x51f71*4+0x02000000,0x9360); +reg_write( DDR_REG_BASE + 0x51f72*4+0x02000000,0x71e5); +reg_write( DDR_REG_BASE + 0x51f73*4+0x02000000,0x7165); +reg_write( DDR_REG_BASE + 0x51f74*4+0x02000000,0xb660); +reg_write( DDR_REG_BASE + 0x51f75*4+0x02000000,0x232f); +reg_write( DDR_REG_BASE + 0x51f76*4+0x02000000,0x2c7); +reg_write( DDR_REG_BASE + 0x51f77*4+0x02000000,0xbd7); +reg_write( DDR_REG_BASE + 0x51f78*4+0x02000000,0x80a4); +reg_write( DDR_REG_BASE + 0x51f79*4+0x02000000,0x7ef0); +reg_write( DDR_REG_BASE + 0x51f7a*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE + 0x51f7b*4+0x02000000,0xcf7); +reg_write( DDR_REG_BASE + 0x51f7c*4+0x02000000,0x9365); +reg_write( DDR_REG_BASE + 0x51f7d*4+0x02000000,0x706d); +reg_write( DDR_REG_BASE + 0x51f7e*4+0x02000000,0xc4c6); +reg_write( DDR_REG_BASE + 0x51f7f*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x51f80*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x51f81*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x51f82*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x51f83*4+0x02000000,0x45cb); +reg_write( DDR_REG_BASE + 0x51f84*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x51f85*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE + 0x51f86*4+0x02000000,0x8d80); +reg_write( DDR_REG_BASE + 0x51f87*4+0x02000000,0x4338); +reg_write( DDR_REG_BASE + 0x51f88*4+0x02000000,0x4718); +reg_write( DDR_REG_BASE + 0x51f89*4+0x02000000,0x706d); +reg_write( DDR_REG_BASE + 0x51f8a*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x51f8b*4+0x02000000,0xea0d); +reg_write( DDR_REG_BASE + 0x51f8c*4+0x02000000,0x245f); +reg_write( DDR_REG_BASE + 0x51f8d*4+0x02000000,0x1243); +reg_write( DDR_REG_BASE + 0x51f8e*4+0x02000000,0xa1b); +reg_write( DDR_REG_BASE + 0x51f8f*4+0x02000000,0xb1); +reg_write( DDR_REG_BASE + 0x51f90*4+0x02000000,0xd908); +reg_write( DDR_REG_BASE + 0x51f91*4+0x02000000,0xe308); +reg_write( DDR_REG_BASE + 0x51f92*4+0x02000000,0xd809); +reg_write( DDR_REG_BASE + 0x51f93*4+0x02000000,0x71ed); +reg_write( DDR_REG_BASE + 0x51f94*4+0x02000000,0x234a); +reg_write( DDR_REG_BASE + 0x51f95*4+0x02000000,0x1200); +reg_write( DDR_REG_BASE + 0x51f96*4+0x02000000,0xf006); +reg_write( DDR_REG_BASE + 0x51f97*4+0x02000000,0x7b9b); +reg_write( DDR_REG_BASE + 0x51f98*4+0x02000000,0x74ed); +reg_write( DDR_REG_BASE + 0x51f99*4+0x02000000,0x742c); +reg_write( DDR_REG_BASE + 0x51f9a*4+0x02000000,0xf002); +reg_write( DDR_REG_BASE + 0x51f9b*4+0x02000000,0x71ed); +reg_write( DDR_REG_BASE + 0x51f9c*4+0x02000000,0x1501); +reg_write( DDR_REG_BASE + 0x51f9d*4+0x02000000,0x109e); +reg_write( DDR_REG_BASE + 0x51f9e*4+0x02000000,0xf023); +reg_write( DDR_REG_BASE + 0x51f9f*4+0x02000000,0x45c9); +reg_write( DDR_REG_BASE + 0x51fa0*4+0x02000000,0x259a); +reg_write( DDR_REG_BASE + 0x51fa1*4+0x02000000,0x1008); +reg_write( DDR_REG_BASE + 0x51fa2*4+0x02000000,0x241a); +reg_write( DDR_REG_BASE + 0x51fa3*4+0x02000000,0x1f82); +reg_write( DDR_REG_BASE + 0x51fa4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x51fa5*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE + 0x51fa6*4+0x02000000,0x7aa5); +reg_write( DDR_REG_BASE + 0x51fa7*4+0x02000000,0x2205); +reg_write( DDR_REG_BASE + 0x51fa8*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE + 0x51fa9*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x51faa*4+0x02000000,0x64); +reg_write( DDR_REG_BASE + 0x51fab*4+0x02000000,0xb1f); +reg_write( DDR_REG_BASE + 0x51fac*4+0x02000000,0x3030); +reg_write( DDR_REG_BASE + 0x51fad*4+0x02000000,0x9a40); +reg_write( DDR_REG_BASE + 0x51fae*4+0x02000000,0x258a); +reg_write( DDR_REG_BASE + 0x51faf*4+0x02000000,0x1fcf); +reg_write( DDR_REG_BASE + 0x51fb0*4+0x02000000,0x7d44); +reg_write( DDR_REG_BASE + 0x51fb1*4+0x02000000,0x7a5d); +reg_write( DDR_REG_BASE + 0x51fb2*4+0x02000000,0x7a5d); +reg_write( DDR_REG_BASE + 0x51fb3*4+0x02000000,0x7a5d); +reg_write( DDR_REG_BASE + 0x51fb4*4+0x02000000,0x7a5d); +reg_write( DDR_REG_BASE + 0x51fb5*4+0x02000000,0x7a5d); +reg_write( DDR_REG_BASE + 0x51fb6*4+0x02000000,0x2284); +reg_write( DDR_REG_BASE + 0x51fb7*4+0x02000000,0x81f); +reg_write( DDR_REG_BASE + 0x51fb8*4+0x02000000,0x62ba); +reg_write( DDR_REG_BASE + 0x51fb9*4+0x02000000,0x2714); +reg_write( DDR_REG_BASE + 0x51fba*4+0x02000000,0x30cd); +reg_write( DDR_REG_BASE + 0x51fbb*4+0x02000000,0xb540); +reg_write( DDR_REG_BASE + 0x51fbc*4+0x02000000,0x66fe); +reg_write( DDR_REG_BASE + 0x51fbd*4+0x02000000,0x631b); +reg_write( DDR_REG_BASE + 0x51fbe*4+0x02000000,0x9c3); +reg_write( DDR_REG_BASE + 0x51fbf*4+0x02000000,0x8385); +reg_write( DDR_REG_BASE + 0x51fc0*4+0x02000000,0x7185); +reg_write( DDR_REG_BASE + 0x51fc1*4+0x02000000,0xefd); +reg_write( DDR_REG_BASE + 0x51fc2*4+0x02000000,0xb325); +reg_write( DDR_REG_BASE + 0x51fc3*4+0x02000000,0x4669); +reg_write( DDR_REG_BASE + 0x51fc4*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x51fc5*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x51fc6*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x51fc7*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x51fc8*4+0x02000000,0x8819); +reg_write( DDR_REG_BASE + 0x51fc9*4+0x02000000,0xb863); +reg_write( DDR_REG_BASE + 0x51fca*4+0x02000000,0x7314); +reg_write( DDR_REG_BASE + 0x51fcb*4+0x02000000,0x20e0); +reg_write( DDR_REG_BASE + 0x51fcc*4+0x02000000,0x7cd); +reg_write( DDR_REG_BASE + 0x51fcd*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x51fce*4+0x02000000,0x900e); +reg_write( DDR_REG_BASE + 0x51fcf*4+0x02000000,0x1e4c); +reg_write( DDR_REG_BASE + 0x51fd0*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE + 0x51fd1*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x51fd2*4+0x02000000,0xb041); +reg_write( DDR_REG_BASE + 0x51fd3*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x51fd4*4+0x02000000,0x791b); +reg_write( DDR_REG_BASE + 0x51fd5*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x51fd6*4+0x02000000,0x2184); +reg_write( DDR_REG_BASE + 0x51fd7*4+0x02000000,0xa82); +reg_write( DDR_REG_BASE + 0x51fd8*4+0x02000000,0x2046); +reg_write( DDR_REG_BASE + 0x51fd9*4+0x02000000,0xa80); +reg_write( DDR_REG_BASE + 0x51fda*4+0x02000000,0x7905); +reg_write( DDR_REG_BASE + 0x51fdb*4+0x02000000,0x215a); +reg_write( DDR_REG_BASE + 0x51fdc*4+0x02000000,0x100); +reg_write( DDR_REG_BASE + 0x51fdd*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE + 0x51fde*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE + 0x51fdf*4+0x02000000,0x2144); +reg_write( DDR_REG_BASE + 0x51fe0*4+0x02000000,0xcc1); +reg_write( DDR_REG_BASE + 0x51fe1*4+0x02000000,0x2084); +reg_write( DDR_REG_BASE + 0x51fe2*4+0x02000000,0x303); +reg_write( DDR_REG_BASE + 0x51fe3*4+0x02000000,0x7905); +reg_write( DDR_REG_BASE + 0x51fe4*4+0x02000000,0x215f); +reg_write( DDR_REG_BASE + 0x51fe5*4+0x02000000,0x400); +reg_write( DDR_REG_BASE + 0x51fe6*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE + 0x51fe7*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE + 0x51fe8*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE + 0x51fe9*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE + 0x51fea*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x51feb*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x51fec*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x51fed*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x51fee*4+0x02000000,0xc2e2); +reg_write( DDR_REG_BASE + 0x51fef*4+0x02000000,0x45cb); +reg_write( DDR_REG_BASE + 0x51ff0*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE + 0x51ff1*4+0x02000000,0xe000); +reg_write( DDR_REG_BASE + 0x51ff2*4+0x02000000,0xd820); +reg_write( DDR_REG_BASE + 0x51ff3*4+0x02000000,0xe7e); +reg_write( DDR_REG_BASE + 0x51ff4*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x51ff5*4+0x02000000,0x1d00); +reg_write( DDR_REG_BASE + 0x51ff6*4+0x02000000,0x1045); +reg_write( DDR_REG_BASE + 0x51ff7*4+0x02000000,0x1d00); +reg_write( DDR_REG_BASE + 0x51ff8*4+0x02000000,0x1005); +reg_write( DDR_REG_BASE + 0x51ff9*4+0x02000000,0xc6c2); +reg_write( DDR_REG_BASE + 0x51ffa*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x51ffb*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x51ffc*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x51ffd*4+0x02000000,0x2482); +reg_write( DDR_REG_BASE + 0x51ffe*4+0x02000000,0x3702); +reg_write( DDR_REG_BASE + 0x51fff*4+0x02000000,0xc140); +reg_write( DDR_REG_BASE + 0x52000*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x52001*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x52002*4+0x02000000,0x7100); +reg_write( DDR_REG_BASE + 0x52003*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x52004*4+0x02000000,0xaa); +reg_write( DDR_REG_BASE + 0x52005*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x52006*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52007*4+0x02000000,0x57c); +reg_write( DDR_REG_BASE + 0x52008*4+0x02000000,0xda78); +reg_write( DDR_REG_BASE + 0x52009*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x5200a*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x5200b*4+0x02000000,0x7085); +reg_write( DDR_REG_BASE + 0x5200c*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE + 0x5200d*4+0x02000000,0xe0aa); +reg_write( DDR_REG_BASE + 0x5200e*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x5200f*4+0x02000000,0x709b); +reg_write( DDR_REG_BASE + 0x52010*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52011*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x52012*4+0x02000000,0x85e); +reg_write( DDR_REG_BASE + 0x52013*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE + 0x52014*4+0x02000000,0xc089); +reg_write( DDR_REG_BASE + 0x52015*4+0x02000000,0xc089); +reg_write( DDR_REG_BASE + 0x52016*4+0x02000000,0x95e); +reg_write( DDR_REG_BASE + 0x52017*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x52018*4+0x02000000,0xd978); +reg_write( DDR_REG_BASE + 0x52019*4+0x02000000,0xa4a); +reg_write( DDR_REG_BASE + 0x5201a*4+0x02000000,0xfe8f); +reg_write( DDR_REG_BASE + 0x5201b*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x5201c*4+0x02000000,0xf86); +reg_write( DDR_REG_BASE + 0x5201d*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE + 0x5201e*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x5201f*4+0x02000000,0xdde); +reg_write( DDR_REG_BASE + 0x52020*4+0x02000000,0xff4f); +reg_write( DDR_REG_BASE + 0x52021*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x52022*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x52023*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x52024*4+0x02000000,0xe024); +reg_write( DDR_REG_BASE + 0x52025*4+0x02000000,0x228a); +reg_write( DDR_REG_BASE + 0x52026*4+0x02000000,0x44); +reg_write( DDR_REG_BASE + 0x52027*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE + 0x52028*4+0x02000000,0xb026); +reg_write( DDR_REG_BASE + 0x52029*4+0x02000000,0x18fe); +reg_write( DDR_REG_BASE + 0x5202a*4+0x02000000,0x8084); +reg_write( DDR_REG_BASE + 0x5202b*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x5202c*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE + 0x5202d*4+0x02000000,0x7c2); +reg_write( DDR_REG_BASE + 0x5202e*4+0x02000000,0x4020); +reg_write( DDR_REG_BASE + 0x5202f*4+0x02000000,0xea06); +reg_write( DDR_REG_BASE + 0x52030*4+0x02000000,0xba61); +reg_write( DDR_REG_BASE + 0x52031*4+0x02000000,0xa01); +reg_write( DDR_REG_BASE + 0x52032*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x52033*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x52034*4+0x02000000,0x7d0f); +reg_write( DDR_REG_BASE + 0x52035*4+0x02000000,0x40a1); +reg_write( DDR_REG_BASE + 0x52036*4+0x02000000,0xc62); +reg_write( DDR_REG_BASE + 0x52037*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x52038*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52039*4+0x02000000,0xd830); +reg_write( DDR_REG_BASE + 0x5203a*4+0x02000000,0xc36); +reg_write( DDR_REG_BASE + 0x5203b*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE + 0x5203c*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x5203d*4+0x02000000,0xa76); +reg_write( DDR_REG_BASE + 0x5203e*4+0x02000000,0xfecf); +reg_write( DDR_REG_BASE + 0x5203f*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52040*4+0x02000000,0xf005); +reg_write( DDR_REG_BASE + 0x52041*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x52042*4+0x02000000,0x1900); +reg_write( DDR_REG_BASE + 0x52043*4+0x02000000,0xfc3); +reg_write( DDR_REG_BASE + 0x52044*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE + 0x52045*4+0x02000000,0x8fb); +reg_write( DDR_REG_BASE + 0x52046*4+0x02000000,0x8534); +reg_write( DDR_REG_BASE + 0x52047*4+0x02000000,0xc184); +reg_write( DDR_REG_BASE + 0x52048*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52049*4+0x02000000,0xc1a); +reg_write( DDR_REG_BASE + 0x5204a*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE + 0x5204b*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x5204c*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x5204d*4+0x02000000,0xf26); +reg_write( DDR_REG_BASE + 0x5204e*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE + 0x5204f*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x52050*4+0x02000000,0x40a1); +reg_write( DDR_REG_BASE + 0x52051*4+0x02000000,0xc2e); +reg_write( DDR_REG_BASE + 0x52052*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x52053*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x52054*4+0x02000000,0x231a); +reg_write( DDR_REG_BASE + 0x52055*4+0x02000000,0x3f9b); +reg_write( DDR_REG_BASE + 0x52056*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x52057*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52058*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE + 0x52059*4+0x02000000,0xfc7); +reg_write( DDR_REG_BASE + 0x5205a*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE + 0x5205b*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x5205c*4+0x02000000,0xe174); +reg_write( DDR_REG_BASE + 0x5205d*4+0x02000000,0x70ed); +reg_write( DDR_REG_BASE + 0x5205e*4+0x02000000,0x45cb); +reg_write( DDR_REG_BASE + 0x5205f*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52060*4+0x02000000,0x7b2); +reg_write( DDR_REG_BASE + 0x52061*4+0x02000000,0xb600); +reg_write( DDR_REG_BASE + 0x52062*4+0x02000000,0xb601); +reg_write( DDR_REG_BASE + 0x52063*4+0x02000000,0x1e59); +reg_write( DDR_REG_BASE + 0x52064*4+0x02000000,0x93dc); +reg_write( DDR_REG_BASE + 0x52065*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE + 0x52066*4+0x02000000,0x36c0); +reg_write( DDR_REG_BASE + 0x52067*4+0x02000000,0xf7f); +reg_write( DDR_REG_BASE + 0x52068*4+0x02000000,0x1a35); +reg_write( DDR_REG_BASE + 0x52069*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x5206a*4+0x02000000,0xbd6); +reg_write( DDR_REG_BASE + 0x5206b*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE + 0x5206c*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x5206d*4+0x02000000,0x1501); +reg_write( DDR_REG_BASE + 0x5206e*4+0x02000000,0x108b); +reg_write( DDR_REG_BASE + 0x5206f*4+0x02000000,0x8d80); +reg_write( DDR_REG_BASE + 0x52070*4+0x02000000,0x706f); +reg_write( DDR_REG_BASE + 0x52071*4+0x02000000,0xf02b); +reg_write( DDR_REG_BASE + 0x52072*4+0x02000000,0x241a); +reg_write( DDR_REG_BASE + 0x52073*4+0x02000000,0x1f80); +reg_write( DDR_REG_BASE + 0x52074*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52075*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x52076*4+0x02000000,0x206c); +reg_write( DDR_REG_BASE + 0x52077*4+0x02000000,0x302); +reg_write( DDR_REG_BASE + 0x52078*4+0x02000000,0x2205); +reg_write( DDR_REG_BASE + 0x52079*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x5207a*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x5207b*4+0x02000000,0x166); +reg_write( DDR_REG_BASE + 0x5207c*4+0x02000000,0x9000); +reg_write( DDR_REG_BASE + 0x5207d*4+0x02000000,0x2079); +reg_write( DDR_REG_BASE + 0x5207e*4+0x02000000,0x3); +reg_write( DDR_REG_BASE + 0x5207f*4+0x02000000,0xc084); +reg_write( DDR_REG_BASE + 0x52080*4+0x02000000,0x6098); +reg_write( DDR_REG_BASE + 0x52081*4+0x02000000,0x8820); +reg_write( DDR_REG_BASE + 0x52082*4+0x02000000,0x793b); +reg_write( DDR_REG_BASE + 0x52083*4+0x02000000,0x7965); +reg_write( DDR_REG_BASE + 0x52084*4+0x02000000,0xa820); +reg_write( DDR_REG_BASE + 0x52085*4+0x02000000,0x241a); +reg_write( DDR_REG_BASE + 0x52086*4+0x02000000,0x1f80); +reg_write( DDR_REG_BASE + 0x52087*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52088*4+0x02000000,0x800); +reg_write( DDR_REG_BASE + 0x52089*4+0x02000000,0x2153); +reg_write( DDR_REG_BASE + 0x5208a*4+0x02000000,0x80be); +reg_write( DDR_REG_BASE + 0x5208b*4+0x02000000,0x2004); +reg_write( DDR_REG_BASE + 0x5208c*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x5208d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5208e*4+0x02000000,0x800); +reg_write( DDR_REG_BASE + 0x5208f*4+0x02000000,0x7a05); +reg_write( DDR_REG_BASE + 0x52090*4+0x02000000,0x2205); +reg_write( DDR_REG_BASE + 0x52091*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE + 0x52092*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x52093*4+0x02000000,0x64); +reg_write( DDR_REG_BASE + 0x52094*4+0x02000000,0x9200); +reg_write( DDR_REG_BASE + 0x52095*4+0x02000000,0xf206); +reg_write( DDR_REG_BASE + 0x52096*4+0x02000000,0x2080); +reg_write( DDR_REG_BASE + 0x52097*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x52098*4+0x02000000,0x716f); +reg_write( DDR_REG_BASE + 0x52099*4+0x02000000,0xb200); +reg_write( DDR_REG_BASE + 0x5209a*4+0x02000000,0x7185); +reg_write( DDR_REG_BASE + 0x5209b*4+0x02000000,0xbb1); +reg_write( DDR_REG_BASE + 0x5209c*4+0x02000000,0x9325); +reg_write( DDR_REG_BASE + 0x5209d*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x5209e*4+0x02000000,0xe82); +reg_write( DDR_REG_BASE + 0x5209f*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE + 0x520a0*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x520a1*4+0x02000000,0xb8f); +reg_write( DDR_REG_BASE + 0x520a2*4+0x02000000,0xb031); +reg_write( DDR_REG_BASE + 0x520a3*4+0x02000000,0x71e5); +reg_write( DDR_REG_BASE + 0x520a4*4+0x02000000,0x706f); +reg_write( DDR_REG_BASE + 0x520a5*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x520a6*4+0x02000000,0x6e); +reg_write( DDR_REG_BASE + 0x520a7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x520a8*4+0x02000000,0xf9e); +reg_write( DDR_REG_BASE + 0x520a9*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x520aa*4+0x02000000,0x2378); +reg_write( DDR_REG_BASE + 0x520ab*4+0x02000000,0x3000); +reg_write( DDR_REG_BASE + 0x520ac*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x520ad*4+0x02000000,0xb600); +reg_write( DDR_REG_BASE + 0x520ae*4+0x02000000,0x992); +reg_write( DDR_REG_BASE + 0x520af*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x520b0*4+0x02000000,0xb601); +reg_write( DDR_REG_BASE + 0x520b1*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x520b2*4+0x02000000,0x92e); +reg_write( DDR_REG_BASE + 0x520b3*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x520b4*4+0x02000000,0x732c); +reg_write( DDR_REG_BASE + 0x520b5*4+0x02000000,0xd820); +reg_write( DDR_REG_BASE + 0x520b6*4+0x02000000,0xb3e); +reg_write( DDR_REG_BASE + 0x520b7*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE + 0x520b8*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x520b9*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE + 0x520ba*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x520bb*4+0x02000000,0xd8e); +reg_write( DDR_REG_BASE + 0x520bc*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x520bd*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x520be*4+0x02000000,0x8d61); +reg_write( DDR_REG_BASE + 0x520bf*4+0x02000000,0x8d20); +reg_write( DDR_REG_BASE + 0x520c0*4+0x02000000,0xf00a); +reg_write( DDR_REG_BASE + 0x520c1*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE + 0x520c2*4+0x02000000,0x20f4); +reg_write( DDR_REG_BASE + 0x520c3*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x520c4*4+0x02000000,0x2042); +reg_write( DDR_REG_BASE + 0x520c5*4+0x02000000,0x802); +reg_write( DDR_REG_BASE + 0x520c6*4+0x02000000,0xc000); +reg_write( DDR_REG_BASE + 0x520c7*4+0x02000000,0x7834); +reg_write( DDR_REG_BASE + 0x520c8*4+0x02000000,0xb040); +reg_write( DDR_REG_BASE + 0x520c9*4+0x02000000,0x7124); +reg_write( DDR_REG_BASE + 0x520ca*4+0x02000000,0xbef); +reg_write( DDR_REG_BASE + 0x520cb*4+0x02000000,0x8045); +reg_write( DDR_REG_BASE + 0x520cc*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x520cd*4+0x02000000,0xe72); +reg_write( DDR_REG_BASE + 0x520ce*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE + 0x520cf*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x520d0*4+0x02000000,0xc103); +reg_write( DDR_REG_BASE + 0x520d1*4+0x02000000,0x2055); +reg_write( DDR_REG_BASE + 0x520d2*4+0x02000000,0x800); +reg_write( DDR_REG_BASE + 0x520d3*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE + 0x520d4*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x520d5*4+0x02000000,0xc100); +reg_write( DDR_REG_BASE + 0x520d6*4+0x02000000,0x83a); +reg_write( DDR_REG_BASE + 0x520d7*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x520d8*4+0x02000000,0x716c); +reg_write( DDR_REG_BASE + 0x520d9*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x520da*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x520db*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x520dc*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x520dd*4+0x02000000,0xe004); +reg_write( DDR_REG_BASE + 0x520de*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x520df*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x520e0*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE + 0x520e1*4+0x02000000,0xe076); +reg_write( DDR_REG_BASE + 0x520e2*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE + 0x520e3*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x520e4*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x520e5*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE + 0x520e6*4+0x02000000,0xe0aa); +reg_write( DDR_REG_BASE + 0x520e7*4+0x02000000,0xe12); +reg_write( DDR_REG_BASE + 0x520e8*4+0x02000000,0xffcf); +reg_write( DDR_REG_BASE + 0x520e9*4+0x02000000,0x2480); +reg_write( DDR_REG_BASE + 0x520ea*4+0x02000000,0x3702); +reg_write( DDR_REG_BASE + 0x520eb*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x520ec*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x520ed*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x520ee*4+0x02000000,0xc2e2); +reg_write( DDR_REG_BASE + 0x520ef*4+0x02000000,0xcb2); +reg_write( DDR_REG_BASE + 0x520f0*4+0x02000000,0xfe8f); +reg_write( DDR_REG_BASE + 0x520f1*4+0x02000000,0x256f); +reg_write( DDR_REG_BASE + 0x520f2*4+0x02000000,0x1343); +reg_write( DDR_REG_BASE + 0x520f3*4+0x02000000,0x9560); +reg_write( DDR_REG_BASE + 0x520f4*4+0x02000000,0xda20); +reg_write( DDR_REG_BASE + 0x520f5*4+0x02000000,0xd940); +reg_write( DDR_REG_BASE + 0x520f6*4+0x02000000,0x238c); +reg_write( DDR_REG_BASE + 0x520f7*4+0x02000000,0x85ca); +reg_write( DDR_REG_BASE + 0x520f8*4+0x02000000,0x22ca); +reg_write( DDR_REG_BASE + 0x520f9*4+0x02000000,0xc2d); +reg_write( DDR_REG_BASE + 0x520fa*4+0x02000000,0x238c); +reg_write( DDR_REG_BASE + 0x520fb*4+0x02000000,0x89d0); +reg_write( DDR_REG_BASE + 0x520fc*4+0x02000000,0x22ca); +reg_write( DDR_REG_BASE + 0x520fd*4+0x02000000,0x4d); +reg_write( DDR_REG_BASE + 0x520fe*4+0x02000000,0x238c); +reg_write( DDR_REG_BASE + 0x520ff*4+0x02000000,0x8fd8); +reg_write( DDR_REG_BASE + 0x52100*4+0x02000000,0xd950); +reg_write( DDR_REG_BASE + 0x52101*4+0x02000000,0x22ca); +reg_write( DDR_REG_BASE + 0x52102*4+0x02000000,0x4d); +reg_write( DDR_REG_BASE + 0x52103*4+0x02000000,0x218a); +reg_write( DDR_REG_BASE + 0x52104*4+0x02000000,0x5ca); +reg_write( DDR_REG_BASE + 0x52105*4+0x02000000,0x213c); +reg_write( DDR_REG_BASE + 0x52106*4+0x02000000,0xc1); +reg_write( DDR_REG_BASE + 0x52107*4+0x02000000,0x238c); +reg_write( DDR_REG_BASE + 0x52108*4+0x02000000,0x89d0); +reg_write( DDR_REG_BASE + 0x52109*4+0x02000000,0x21ca); +reg_write( DDR_REG_BASE + 0x5210a*4+0x02000000,0xad); +reg_write( DDR_REG_BASE + 0x5210b*4+0x02000000,0x238c); +reg_write( DDR_REG_BASE + 0x5210c*4+0x02000000,0x8fd8); +reg_write( DDR_REG_BASE + 0x5210d*4+0x02000000,0x21ca); +reg_write( DDR_REG_BASE + 0x5210e*4+0x02000000,0xed); +reg_write( DDR_REG_BASE + 0x5210f*4+0x02000000,0x73d3); +reg_write( DDR_REG_BASE + 0x52110*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52111*4+0x02000000,0x95f); +reg_write( DDR_REG_BASE + 0x52112*4+0x02000000,0x21ca); +reg_write( DDR_REG_BASE + 0x52113*4+0x02000000,0x12d); +reg_write( DDR_REG_BASE + 0x52114*4+0x02000000,0x2105); +reg_write( DDR_REG_BASE + 0x52115*4+0x02000000,0x8c); +reg_write( DDR_REG_BASE + 0x52116*4+0x02000000,0x15fe); +reg_write( DDR_REG_BASE + 0x52117*4+0x02000000,0x9081); +reg_write( DDR_REG_BASE + 0x52118*4+0x02000000,0x205a); +reg_write( DDR_REG_BASE + 0x52119*4+0x02000000,0x400); +reg_write( DDR_REG_BASE + 0x5211a*4+0x02000000,0x211a); +reg_write( DDR_REG_BASE + 0x5211b*4+0x02000000,0xf83); +reg_write( DDR_REG_BASE + 0x5211c*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x5211d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5211e*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x5211f*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x52120*4+0x02000000,0xf8); +reg_write( DDR_REG_BASE + 0x52121*4+0x02000000,0x2004); +reg_write( DDR_REG_BASE + 0x52122*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x52123*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52124*4+0x02000000,0x1ff0); +reg_write( DDR_REG_BASE + 0x52125*4+0x02000000,0xb881); +reg_write( DDR_REG_BASE + 0x52126*4+0x02000000,0x2305); +reg_write( DDR_REG_BASE + 0x52127*4+0x02000000,0x42); +reg_write( DDR_REG_BASE + 0x52128*4+0x02000000,0x7224); +reg_write( DDR_REG_BASE + 0x52129*4+0x02000000,0x7965); +reg_write( DDR_REG_BASE + 0x5212a*4+0x02000000,0xb280); +reg_write( DDR_REG_BASE + 0x5212b*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE + 0x5212c*4+0x02000000,0xc6c2); +reg_write( DDR_REG_BASE + 0x5212d*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x5212e*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x5212f*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x52130*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE + 0x52131*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE + 0x52132*4+0x02000000,0x1ea); +reg_write( DDR_REG_BASE + 0x52133*4+0x02000000,0x9340); +reg_write( DDR_REG_BASE + 0x52134*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x52135*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x52136*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE + 0x52137*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x52138*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52139*4+0x02000000,0xfb00); +reg_write( DDR_REG_BASE + 0x5213a*4+0x02000000,0x2204); +reg_write( DDR_REG_BASE + 0x5213b*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE + 0x5213c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5213d*4+0x02000000,0xc0ff); +reg_write( DDR_REG_BASE + 0x5213e*4+0x02000000,0x7845); +reg_write( DDR_REG_BASE + 0x5213f*4+0x02000000,0x9341); +reg_write( DDR_REG_BASE + 0x52140*4+0x02000000,0xb300); +reg_write( DDR_REG_BASE + 0x52141*4+0x02000000,0xb965); +reg_write( DDR_REG_BASE + 0x52142*4+0x02000000,0x226c); +reg_write( DDR_REG_BASE + 0x52143*4+0x02000000,0x140); +reg_write( DDR_REG_BASE + 0x52144*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x52145*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x52146*4+0x02000000,0xb301); +reg_write( DDR_REG_BASE + 0x52147*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x52148*4+0x02000000,0x7a1b); +reg_write( DDR_REG_BASE + 0x52149*4+0x02000000,0x2205); +reg_write( DDR_REG_BASE + 0x5214a*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE + 0x5214b*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x5214c*4+0x02000000,0xe164); +reg_write( DDR_REG_BASE + 0x5214d*4+0x02000000,0x1a00); +reg_write( DDR_REG_BASE + 0x5214e*4+0x02000000,0x5); +reg_write( DDR_REG_BASE + 0x5214f*4+0x02000000,0x42c3); +reg_write( DDR_REG_BASE + 0x52150*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52151*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE + 0x52152*4+0x02000000,0x8a61); +reg_write( DDR_REG_BASE + 0x52153*4+0x02000000,0x8a80); +reg_write( DDR_REG_BASE + 0x52154*4+0x02000000,0xf00d); +reg_write( DDR_REG_BASE + 0x52155*4+0x02000000,0x241a); +reg_write( DDR_REG_BASE + 0x52156*4+0x02000000,0x1f82); +reg_write( DDR_REG_BASE + 0x52157*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52158*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x52159*4+0x02000000,0x7185); +reg_write( DDR_REG_BASE + 0x5215a*4+0x02000000,0x7a05); +reg_write( DDR_REG_BASE + 0x5215b*4+0x02000000,0x7a5b); +reg_write( DDR_REG_BASE + 0x5215c*4+0x02000000,0x2205); +reg_write( DDR_REG_BASE + 0x5215d*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE + 0x5215e*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x5215f*4+0x02000000,0x164); +reg_write( DDR_REG_BASE + 0x52160*4+0x02000000,0xb220); +reg_write( DDR_REG_BASE + 0x52161*4+0x02000000,0xbeb); +reg_write( DDR_REG_BASE + 0x52162*4+0x02000000,0x8305); +reg_write( DDR_REG_BASE + 0x52163*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x52164*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x52165*4+0x02000000,0x266f); +reg_write( DDR_REG_BASE + 0x52166*4+0x02000000,0x15c3); +reg_write( DDR_REG_BASE + 0x52167*4+0x02000000,0x8e40); +reg_write( DDR_REG_BASE + 0x52168*4+0x02000000,0x4508); +reg_write( DDR_REG_BASE + 0x52169*4+0x02000000,0xea17); +reg_write( DDR_REG_BASE + 0x5216a*4+0x02000000,0xede); +reg_write( DDR_REG_BASE + 0x5216b*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x5216c*4+0x02000000,0x4040); +reg_write( DDR_REG_BASE + 0x5216d*4+0x02000000,0x4708); +reg_write( DDR_REG_BASE + 0x5216e*4+0x02000000,0xe887); +reg_write( DDR_REG_BASE + 0x5216f*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x52170*4+0x02000000,0xd6); +reg_write( DDR_REG_BASE + 0x52171*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x52172*4+0x02000000,0xe0a); +reg_write( DDR_REG_BASE + 0x52173*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x52174*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52175*4+0x02000000,0x40e1); +reg_write( DDR_REG_BASE + 0x52176*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x52177*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x52178*4+0x02000000,0x7f05); +reg_write( DDR_REG_BASE + 0x52179*4+0x02000000,0x78bb); +reg_write( DDR_REG_BASE + 0x5217a*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x5217b*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x5217c*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x5217d*4+0x02000000,0xfe92); +reg_write( DDR_REG_BASE + 0x5217e*4+0x02000000,0xb0e0); +reg_write( DDR_REG_BASE + 0x5217f*4+0x02000000,0x16ff); +reg_write( DDR_REG_BASE + 0x52180*4+0x02000000,0x9082); +reg_write( DDR_REG_BASE + 0x52181*4+0x02000000,0xea16); +reg_write( DDR_REG_BASE + 0x52182*4+0x02000000,0xeae); +reg_write( DDR_REG_BASE + 0x52183*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x52184*4+0x02000000,0x4040); +reg_write( DDR_REG_BASE + 0x52185*4+0x02000000,0x228c); +reg_write( DDR_REG_BASE + 0x52186*4+0x02000000,0x8fc3); +reg_write( DDR_REG_BASE + 0x52187*4+0x02000000,0xf209); +reg_write( DDR_REG_BASE + 0x52188*4+0x02000000,0xe888); +reg_write( DDR_REG_BASE + 0x52189*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x5218a*4+0x02000000,0xd7); +reg_write( DDR_REG_BASE + 0x5218b*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5218c*4+0x02000000,0xdd6); +reg_write( DDR_REG_BASE + 0x5218d*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x5218e*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x5218f*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52190*4+0x02000000,0x79bb); +reg_write( DDR_REG_BASE + 0x52191*4+0x02000000,0x2105); +reg_write( DDR_REG_BASE + 0x52192*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x52193*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x52194*4+0x02000000,0xfe9a); +reg_write( DDR_REG_BASE + 0x52195*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE + 0x52196*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x52197*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x52198*4+0x02000000,0xc0f1); +reg_write( DDR_REG_BASE + 0x52199*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x5219a*4+0x02000000,0x7082); +reg_write( DDR_REG_BASE + 0x5219b*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5219c*4+0x02000000,0x9); +reg_write( DDR_REG_BASE + 0x5219d*4+0x02000000,0xea1a); +reg_write( DDR_REG_BASE + 0x5219e*4+0x02000000,0xa23); +reg_write( DDR_REG_BASE + 0x5219f*4+0x02000000,0xa30); +reg_write( DDR_REG_BASE + 0x521a0*4+0x02000000,0x720c); +reg_write( DDR_REG_BASE + 0x521a1*4+0x02000000,0x228c); +reg_write( DDR_REG_BASE + 0x521a2*4+0x02000000,0x8c03); +reg_write( DDR_REG_BASE + 0x521a3*4+0x02000000,0xf20c); +reg_write( DDR_REG_BASE + 0x521a4*4+0x02000000,0xe2f8); +reg_write( DDR_REG_BASE + 0x521a5*4+0x02000000,0xf404); +reg_write( DDR_REG_BASE + 0x521a6*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x521a7*4+0x02000000,0xf009); +reg_write( DDR_REG_BASE + 0x521a8*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x521a9*4+0x02000000,0xd8); +reg_write( DDR_REG_BASE + 0x521aa*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x521ab*4+0x02000000,0xd9a); +reg_write( DDR_REG_BASE + 0x521ac*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x521ad*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x521ae*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x521af*4+0x02000000,0x205f); +reg_write( DDR_REG_BASE + 0x521b0*4+0x02000000,0x401); +reg_write( DDR_REG_BASE + 0x521b1*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x521b2*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x521b3*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x521b4*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE + 0x521b5*4+0x02000000,0xe0a0); +reg_write( DDR_REG_BASE + 0x521b6*4+0x02000000,0xc0d1); +reg_write( DDR_REG_BASE + 0x521b7*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x521b8*4+0x02000000,0xc0e2); +reg_write( DDR_REG_BASE + 0x521b9*4+0x02000000,0x706d); +reg_write( DDR_REG_BASE + 0x521ba*4+0x02000000,0xf00e); +reg_write( DDR_REG_BASE + 0x521bb*4+0x02000000,0x239a); +reg_write( DDR_REG_BASE + 0x521bc*4+0x02000000,0x901); +reg_write( DDR_REG_BASE + 0x521bd*4+0x02000000,0x607d); +reg_write( DDR_REG_BASE + 0x521be*4+0x02000000,0x245a); +reg_write( DDR_REG_BASE + 0x521bf*4+0x02000000,0x1c83); +reg_write( DDR_REG_BASE + 0x521c0*4+0x02000000,0x7185); +reg_write( DDR_REG_BASE + 0x521c1*4+0x02000000,0x63bb); +reg_write( DDR_REG_BASE + 0x521c2*4+0x02000000,0x633b); +reg_write( DDR_REG_BASE + 0x521c3*4+0x02000000,0xab40); +reg_write( DDR_REG_BASE + 0x521c4*4+0x02000000,0xcef); +reg_write( DDR_REG_BASE + 0x521c5*4+0x02000000,0x90b4); +reg_write( DDR_REG_BASE + 0x521c6*4+0x02000000,0x4361); +reg_write( DDR_REG_BASE + 0x521c7*4+0x02000000,0x7165); +reg_write( DDR_REG_BASE + 0x521c8*4+0x02000000,0xbf9); +reg_write( DDR_REG_BASE + 0x521c9*4+0x02000000,0x90b4); +reg_write( DDR_REG_BASE + 0x521ca*4+0x02000000,0x708d); +reg_write( DDR_REG_BASE + 0x521cb*4+0x02000000,0xc4c2); +reg_write( DDR_REG_BASE + 0x521cc*4+0x02000000,0xc0e6); +reg_write( DDR_REG_BASE + 0x521cd*4+0x02000000,0x4328); +reg_write( DDR_REG_BASE + 0x521ce*4+0x02000000,0x70ed); +reg_write( DDR_REG_BASE + 0x521cf*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x521d0*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x521d1*4+0x02000000,0xff64); +reg_write( DDR_REG_BASE + 0x521d2*4+0x02000000,0xb1e0); +reg_write( DDR_REG_BASE + 0x521d3*4+0x02000000,0x1904); +reg_write( DDR_REG_BASE + 0x521d4*4+0x02000000,0x45); +reg_write( DDR_REG_BASE + 0x521d5*4+0x02000000,0x42c3); +reg_write( DDR_REG_BASE + 0x521d6*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x521d7*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE + 0x521d8*4+0x02000000,0x8a21); +reg_write( DDR_REG_BASE + 0x521d9*4+0x02000000,0x8ac0); +reg_write( DDR_REG_BASE + 0x521da*4+0x02000000,0xf03b); +reg_write( DDR_REG_BASE + 0x521db*4+0x02000000,0x228c); +reg_write( DDR_REG_BASE + 0x521dc*4+0x02000000,0x8fc3); +reg_write( DDR_REG_BASE + 0x521dd*4+0x02000000,0xf41a); +reg_write( DDR_REG_BASE + 0x521de*4+0x02000000,0x261a); +reg_write( DDR_REG_BASE + 0x521df*4+0x02000000,0x1f83); +reg_write( DDR_REG_BASE + 0x521e0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x521e1*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE + 0x521e2*4+0x02000000,0x42c3); +reg_write( DDR_REG_BASE + 0x521e3*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x521e4*4+0x02000000,0x1f64); +reg_write( DDR_REG_BASE + 0x521e5*4+0x02000000,0x2305); +reg_write( DDR_REG_BASE + 0x521e6*4+0x02000000,0x8c); +reg_write( DDR_REG_BASE + 0x521e7*4+0x02000000,0x7444); +reg_write( DDR_REG_BASE + 0x521e8*4+0x02000000,0x7a65); +reg_write( DDR_REG_BASE + 0x521e9*4+0x02000000,0xb400); +reg_write( DDR_REG_BASE + 0x521ea*4+0x02000000,0xb2e0); +reg_write( DDR_REG_BASE + 0x521eb*4+0x02000000,0x42c3); +reg_write( DDR_REG_BASE + 0x521ec*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x521ed*4+0x02000000,0x1164); +reg_write( DDR_REG_BASE + 0x521ee*4+0x02000000,0x2305); +reg_write( DDR_REG_BASE + 0x521ef*4+0x02000000,0x8c); +reg_write( DDR_REG_BASE + 0x521f0*4+0x02000000,0x7444); +reg_write( DDR_REG_BASE + 0x521f1*4+0x02000000,0x7a65); +reg_write( DDR_REG_BASE + 0x521f2*4+0x02000000,0xb4e0); +reg_write( DDR_REG_BASE + 0x521f3*4+0x02000000,0x1a00); +reg_write( DDR_REG_BASE + 0x521f4*4+0x02000000,0x45); +reg_write( DDR_REG_BASE + 0x521f5*4+0x02000000,0xf020); +reg_write( DDR_REG_BASE + 0x521f6*4+0x02000000,0x260a); +reg_write( DDR_REG_BASE + 0x521f7*4+0x02000000,0x32c0); +reg_write( DDR_REG_BASE + 0x521f8*4+0x02000000,0x708d); +reg_write( DDR_REG_BASE + 0x521f9*4+0x02000000,0xf016); +reg_write( DDR_REG_BASE + 0x521fa*4+0x02000000,0xf753); +reg_write( DDR_REG_BASE + 0x521fb*4+0x02000000,0x4381); +reg_write( DDR_REG_BASE + 0x521fc*4+0x02000000,0x261a); +reg_write( DDR_REG_BASE + 0x521fd*4+0x02000000,0x1f82); +reg_write( DDR_REG_BASE + 0x521fe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x521ff*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE + 0x52200*4+0x02000000,0x239a); +reg_write( DDR_REG_BASE + 0x52201*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x52202*4+0x02000000,0x7b45); +reg_write( DDR_REG_BASE + 0x52203*4+0x02000000,0x42c3); +reg_write( DDR_REG_BASE + 0x52204*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x52205*4+0x02000000,0x164); +reg_write( DDR_REG_BASE + 0x52206*4+0x02000000,0x2305); +reg_write( DDR_REG_BASE + 0x52207*4+0x02000000,0x8d); +reg_write( DDR_REG_BASE + 0x52208*4+0x02000000,0x7444); +reg_write( DDR_REG_BASE + 0x52209*4+0x02000000,0x7b45); +reg_write( DDR_REG_BASE + 0x5220a*4+0x02000000,0xb500); +reg_write( DDR_REG_BASE + 0x5220b*4+0x02000000,0x1b00); +reg_write( DDR_REG_BASE + 0x5220c*4+0x02000000,0x5); +reg_write( DDR_REG_BASE + 0x5220d*4+0x02000000,0x7185); +reg_write( DDR_REG_BASE + 0x5220e*4+0x02000000,0xe0d); +reg_write( DDR_REG_BASE + 0x5220f*4+0x02000000,0x3010); +reg_write( DDR_REG_BASE + 0x52210*4+0x02000000,0xcd5); +reg_write( DDR_REG_BASE + 0x52211*4+0x02000000,0x9274); +reg_write( DDR_REG_BASE + 0x52212*4+0x02000000,0x262f); +reg_write( DDR_REG_BASE + 0x52213*4+0x02000000,0xb782); +reg_write( DDR_REG_BASE + 0x52214*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE + 0x52215*4+0x02000000,0x98f); +reg_write( DDR_REG_BASE + 0x52216*4+0x02000000,0x83a5); +reg_write( DDR_REG_BASE + 0x52217*4+0x02000000,0x222f); +reg_write( DDR_REG_BASE + 0x52218*4+0x02000000,0x2c7); +reg_write( DDR_REG_BASE + 0x52219*4+0x02000000,0xc4c6); +reg_write( DDR_REG_BASE + 0x5221a*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x5221b*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x5221c*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x5221d*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x5221e*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x5221f*4+0x02000000,0x30); +reg_write( DDR_REG_BASE + 0x52220*4+0x02000000,0x10b4); +reg_write( DDR_REG_BASE + 0x52221*4+0x02000000,0x501); +reg_write( DDR_REG_BASE + 0x52222*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x52223*4+0x02000000,0x708d); +reg_write( DDR_REG_BASE + 0x52224*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52225*4+0x02000000,0x23); +reg_write( DDR_REG_BASE + 0x52226*4+0x02000000,0x90b); +reg_write( DDR_REG_BASE + 0x52227*4+0x02000000,0x171); +reg_write( DDR_REG_BASE + 0x52228*4+0x02000000,0xb0a0); +reg_write( DDR_REG_BASE + 0x52229*4+0x02000000,0xb0a1); +reg_write( DDR_REG_BASE + 0x5222a*4+0x02000000,0xf006); +reg_write( DDR_REG_BASE + 0x5222b*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x5222c*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE + 0x5222d*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5222e*4+0x02000000,0x49); +reg_write( DDR_REG_BASE + 0x5222f*4+0x02000000,0xb021); +reg_write( DDR_REG_BASE + 0x52230*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE + 0x52231*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52232*4+0x02000000,0x7b6); +reg_write( DDR_REG_BASE + 0x52233*4+0x02000000,0xed21); +reg_write( DDR_REG_BASE + 0x52234*4+0x02000000,0x8ee0); +reg_write( DDR_REG_BASE + 0x52235*4+0x02000000,0x2544); +reg_write( DDR_REG_BASE + 0x52236*4+0x02000000,0x108b); +reg_write( DDR_REG_BASE + 0x52237*4+0x02000000,0x2544); +reg_write( DDR_REG_BASE + 0x52238*4+0x02000000,0x105b); +reg_write( DDR_REG_BASE + 0x52239*4+0x02000000,0xf017); +reg_write( DDR_REG_BASE + 0x5223a*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x5223b*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x5223c*4+0x02000000,0x2553); +reg_write( DDR_REG_BASE + 0x5223d*4+0x02000000,0x1041); +reg_write( DDR_REG_BASE + 0x5223e*4+0x02000000,0x7905); +reg_write( DDR_REG_BASE + 0x5223f*4+0x02000000,0x4061); +reg_write( DDR_REG_BASE + 0x52240*4+0x02000000,0xf82d); +reg_write( DDR_REG_BASE + 0x52241*4+0x02000000,0xb11); +reg_write( DDR_REG_BASE + 0x52242*4+0x02000000,0x3030); +reg_write( DDR_REG_BASE + 0x52243*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE + 0x52244*4+0x02000000,0x79ef); +reg_write( DDR_REG_BASE + 0x52245*4+0x02000000,0x95e); +reg_write( DDR_REG_BASE + 0x52246*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x52247*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52248*4+0x02000000,0xb0d); +reg_write( DDR_REG_BASE + 0x52249*4+0x02000000,0x1030); +reg_write( DDR_REG_BASE + 0x5224a*4+0x02000000,0x79ef); +reg_write( DDR_REG_BASE + 0x5224b*4+0x02000000,0x952); +reg_write( DDR_REG_BASE + 0x5224c*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x5224d*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x5224e*4+0x02000000,0x71e5); +reg_write( DDR_REG_BASE + 0x5224f*4+0x02000000,0x8e01); +reg_write( DDR_REG_BASE + 0x52250*4+0x02000000,0x8d5); +reg_write( DDR_REG_BASE + 0x52251*4+0x02000000,0x83e5); +reg_write( DDR_REG_BASE + 0x52252*4+0x02000000,0x4063); +reg_write( DDR_REG_BASE + 0x52253*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x52254*4+0x02000000,0x708b); +reg_write( DDR_REG_BASE + 0x52255*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52256*4+0x02000000,0x49); +reg_write( DDR_REG_BASE + 0x52257*4+0x02000000,0xb43); +reg_write( DDR_REG_BASE + 0x52258*4+0x02000000,0x1030); +reg_write( DDR_REG_BASE + 0x52259*4+0x02000000,0x2344); +reg_write( DDR_REG_BASE + 0x5225a*4+0x02000000,0x109b); +reg_write( DDR_REG_BASE + 0x5225b*4+0x02000000,0x8ee2); +reg_write( DDR_REG_BASE + 0x5225c*4+0x02000000,0x2344); +reg_write( DDR_REG_BASE + 0x5225d*4+0x02000000,0x104d); +reg_write( DDR_REG_BASE + 0x5225e*4+0x02000000,0xf015); +reg_write( DDR_REG_BASE + 0x5225f*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x52260*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x52261*4+0x02000000,0x2353); +reg_write( DDR_REG_BASE + 0x52262*4+0x02000000,0x1041); +reg_write( DDR_REG_BASE + 0x52263*4+0x02000000,0x7905); +reg_write( DDR_REG_BASE + 0x52264*4+0x02000000,0x4063); +reg_write( DDR_REG_BASE + 0x52265*4+0x02000000,0xf81b); +reg_write( DDR_REG_BASE + 0x52266*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE + 0x52267*4+0x02000000,0xed06); +reg_write( DDR_REG_BASE + 0x52268*4+0x02000000,0x79ef); +reg_write( DDR_REG_BASE + 0x52269*4+0x02000000,0x916); +reg_write( DDR_REG_BASE + 0x5226a*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x5226b*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x5226c*4+0x02000000,0xb0d); +reg_write( DDR_REG_BASE + 0x5226d*4+0x02000000,0x3030); +reg_write( DDR_REG_BASE + 0x5226e*4+0x02000000,0x79ef); +reg_write( DDR_REG_BASE + 0x5226f*4+0x02000000,0x90a); +reg_write( DDR_REG_BASE + 0x52270*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x52271*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x52272*4+0x02000000,0x71e5); +reg_write( DDR_REG_BASE + 0x52273*4+0x02000000,0x8e03); +reg_write( DDR_REG_BASE + 0x52274*4+0x02000000,0x8d7); +reg_write( DDR_REG_BASE + 0x52275*4+0x02000000,0x83e5); +reg_write( DDR_REG_BASE + 0x52276*4+0x02000000,0x40a1); +reg_write( DDR_REG_BASE + 0x52277*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE + 0x52278*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE + 0x52279*4+0x02000000,0x1ea); +reg_write( DDR_REG_BASE + 0x5227a*4+0x02000000,0x9300); +reg_write( DDR_REG_BASE + 0x5227b*4+0x02000000,0x42c3); +reg_write( DDR_REG_BASE + 0x5227c*4+0x02000000,0x9012); +reg_write( DDR_REG_BASE + 0x5227d*4+0x02000000,0x402); +reg_write( DDR_REG_BASE + 0x5227e*4+0x02000000,0x2004); +reg_write( DDR_REG_BASE + 0x5227f*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x52280*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52281*4+0x02000000,0x3f00); +reg_write( DDR_REG_BASE + 0x52282*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x52283*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x52284*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52285*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x52286*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x52287*4+0x02000000,0xf8c); +reg_write( DDR_REG_BASE + 0x52288*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x52289*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5228a*4+0x02000000,0x2405); +reg_write( DDR_REG_BASE + 0x5228b*4+0x02000000,0x1080); +reg_write( DDR_REG_BASE + 0x5228c*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE + 0x5228d*4+0x02000000,0x6a04); +reg_write( DDR_REG_BASE + 0x5228e*4+0x02000000,0x2196); +reg_write( DDR_REG_BASE + 0x5228f*4+0x02000000,0x6); +reg_write( DDR_REG_BASE + 0x52290*4+0x02000000,0x7885); +reg_write( DDR_REG_BASE + 0x52291*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE + 0x52292*4+0x02000000,0x9321); +reg_write( DDR_REG_BASE + 0x52293*4+0x02000000,0x6a02); +reg_write( DDR_REG_BASE + 0x52294*4+0x02000000,0x7885); +reg_write( DDR_REG_BASE + 0x52295*4+0x02000000,0xb9c5); +reg_write( DDR_REG_BASE + 0x52296*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE + 0x52297*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x52298*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x52299*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x5229a*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x5229b*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x5229c*4+0x02000000,0x2105); +reg_write( DDR_REG_BASE + 0x5229d*4+0x02000000,0x2); +reg_write( DDR_REG_BASE + 0x5229e*4+0x02000000,0x271a); +reg_write( DDR_REG_BASE + 0x5229f*4+0x02000000,0x1f80); +reg_write( DDR_REG_BASE + 0x522a0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x522a1*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE + 0x522a2*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x522a3*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x522a4*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x522a5*4+0x02000000,0x154); +reg_write( DDR_REG_BASE + 0x522a6*4+0x02000000,0x9100); +reg_write( DDR_REG_BASE + 0x522a7*4+0x02000000,0x7845); +reg_write( DDR_REG_BASE + 0x522a8*4+0x02000000,0xb88a); +reg_write( DDR_REG_BASE + 0x522a9*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x522aa*4+0x02000000,0x42c3); +reg_write( DDR_REG_BASE + 0x522ab*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x522ac*4+0x02000000,0x110); +reg_write( DDR_REG_BASE + 0x522ad*4+0x02000000,0x9200); +reg_write( DDR_REG_BASE + 0x522ae*4+0x02000000,0x204f); +reg_write( DDR_REG_BASE + 0x522af*4+0x02000000,0x101); +reg_write( DDR_REG_BASE + 0x522b0*4+0x02000000,0xb8a4); +reg_write( DDR_REG_BASE + 0x522b1*4+0x02000000,0xb220); +reg_write( DDR_REG_BASE + 0x522b2*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x522b3*4+0x02000000,0xb200); +reg_write( DDR_REG_BASE + 0x522b4*4+0x02000000,0x2032); +reg_write( DDR_REG_BASE + 0x522b5*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x522b6*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x522b7*4+0x02000000,0x18); +reg_write( DDR_REG_BASE + 0x522b8*4+0x02000000,0xb9e7); +reg_write( DDR_REG_BASE + 0x522b9*4+0x02000000,0x7ce0); +reg_write( DDR_REG_BASE + 0x522ba*4+0x02000000,0xb9c6); +reg_write( DDR_REG_BASE + 0x522bb*4+0x02000000,0x7fe0); +reg_write( DDR_REG_BASE + 0x522bc*4+0x02000000,0x4020); +reg_write( DDR_REG_BASE + 0x522bd*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x522be*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x522bf*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x522c0*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x522c1*4+0x02000000,0x2482); +reg_write( DDR_REG_BASE + 0x522c2*4+0x02000000,0x3409); +reg_write( DDR_REG_BASE + 0x522c3*4+0x02000000,0x216f); +reg_write( DDR_REG_BASE + 0x522c4*4+0x02000000,0x243); +reg_write( DDR_REG_BASE + 0x522c5*4+0x02000000,0x4508); +reg_write( DDR_REG_BASE + 0x522c6*4+0x02000000,0x8900); +reg_write( DDR_REG_BASE + 0x522c7*4+0x02000000,0x11fd); +reg_write( DDR_REG_BASE + 0x522c8*4+0x02000000,0x808f); +reg_write( DDR_REG_BASE + 0x522c9*4+0x02000000,0x1145); +reg_write( DDR_REG_BASE + 0x522ca*4+0x02000000,0x83); +reg_write( DDR_REG_BASE + 0x522cb*4+0x02000000,0x89df); +reg_write( DDR_REG_BASE + 0x522cc*4+0x02000000,0x1209); +reg_write( DDR_REG_BASE + 0x522cd*4+0x02000000,0x309e); +reg_write( DDR_REG_BASE + 0x522ce*4+0x02000000,0xc046); +reg_write( DDR_REG_BASE + 0x522cf*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE + 0x522d0*4+0x02000000,0x3e80); +reg_write( DDR_REG_BASE + 0x522d1*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x522d2*4+0x02000000,0xaee); +reg_write( DDR_REG_BASE + 0x522d3*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x522d4*4+0x02000000,0xdab4); +reg_write( DDR_REG_BASE + 0x522d5*4+0x02000000,0xc08d); +reg_write( DDR_REG_BASE + 0x522d6*4+0x02000000,0xae6); +reg_write( DDR_REG_BASE + 0x522d7*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x522d8*4+0x02000000,0xdab4); +reg_write( DDR_REG_BASE + 0x522d9*4+0x02000000,0x2578); +reg_write( DDR_REG_BASE + 0x522da*4+0x02000000,0x1140); +reg_write( DDR_REG_BASE + 0x522db*4+0x02000000,0xc048); +reg_write( DDR_REG_BASE + 0x522dc*4+0x02000000,0x254f); +reg_write( DDR_REG_BASE + 0x522dd*4+0x02000000,0x1080); +reg_write( DDR_REG_BASE + 0x522de*4+0x02000000,0x2078); +reg_write( DDR_REG_BASE + 0x522df*4+0x02000000,0x101); +reg_write( DDR_REG_BASE + 0x522e0*4+0x02000000,0xc008); +reg_write( DDR_REG_BASE + 0x522e1*4+0x02000000,0xbfe2); +reg_write( DDR_REG_BASE + 0x522e2*4+0x02000000,0x7bc5); +reg_write( DDR_REG_BASE + 0x522e3*4+0x02000000,0x7905); +reg_write( DDR_REG_BASE + 0x522e4*4+0x02000000,0x2578); +reg_write( DDR_REG_BASE + 0x522e5*4+0x02000000,0x10c0); +reg_write( DDR_REG_BASE + 0x522e6*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x522e7*4+0x02000000,0xc047); +reg_write( DDR_REG_BASE + 0x522e8*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x522e9*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE + 0x522ea*4+0x02000000,0x20ca); +reg_write( DDR_REG_BASE + 0x522eb*4+0x02000000,0x3e1); +reg_write( DDR_REG_BASE + 0x522ec*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE + 0x522ed*4+0x02000000,0x2579); +reg_write( DDR_REG_BASE + 0x522ee*4+0x02000000,0x1180); +reg_write( DDR_REG_BASE + 0x522ef*4+0x02000000,0xc04b); +reg_write( DDR_REG_BASE + 0x522f0*4+0x02000000,0x2542); +reg_write( DDR_REG_BASE + 0x522f1*4+0x02000000,0x1240); +reg_write( DDR_REG_BASE + 0x522f2*4+0x02000000,0xc049); +reg_write( DDR_REG_BASE + 0x522f3*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE + 0x522f4*4+0x02000000,0x2678); +reg_write( DDR_REG_BASE + 0x522f5*4+0x02000000,0x301b); +reg_write( DDR_REG_BASE + 0x522f6*4+0x02000000,0x70ed); +reg_write( DDR_REG_BASE + 0x522f7*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x522f8*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x522f9*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x522fa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x522fb*4+0x02000000,0x70cd); +reg_write( DDR_REG_BASE + 0x522fc*4+0x02000000,0xc34a); +reg_write( DDR_REG_BASE + 0x522fd*4+0x02000000,0xc04c); +reg_write( DDR_REG_BASE + 0x522fe*4+0x02000000,0xf0a5); +reg_write( DDR_REG_BASE + 0x522ff*4+0x02000000,0x4300); +reg_write( DDR_REG_BASE + 0x52300*4+0x02000000,0x2744); +reg_write( DDR_REG_BASE + 0x52301*4+0x02000000,0x17c0); +reg_write( DDR_REG_BASE + 0x52302*4+0x02000000,0xc107); +reg_write( DDR_REG_BASE + 0x52303*4+0x02000000,0xe806); +reg_write( DDR_REG_BASE + 0x52304*4+0x02000000,0xb861); +reg_write( DDR_REG_BASE + 0x52305*4+0x02000000,0x801); +reg_write( DDR_REG_BASE + 0x52306*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x52307*4+0x02000000,0x7b7b); +reg_write( DDR_REG_BASE + 0x52308*4+0x02000000,0x9fa); +reg_write( DDR_REG_BASE + 0x52309*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE + 0x5230a*4+0x02000000,0x40e1); +reg_write( DDR_REG_BASE + 0x5230b*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE + 0x5230c*4+0x02000000,0xc00a); +reg_write( DDR_REG_BASE + 0x5230d*4+0x02000000,0x7b0b); +reg_write( DDR_REG_BASE + 0x5230e*4+0x02000000,0xf294); +reg_write( DDR_REG_BASE + 0x5230f*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52310*4+0x02000000,0xf073); +reg_write( DDR_REG_BASE + 0x52311*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52312*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x52313*4+0x02000000,0xaba); +reg_write( DDR_REG_BASE + 0x52314*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x52315*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE + 0x52316*4+0x02000000,0x8d1); +reg_write( DDR_REG_BASE + 0x52317*4+0x02000000,0x30); +reg_write( DDR_REG_BASE + 0x52318*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52319*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x5231a*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5231b*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE + 0x5231c*4+0x02000000,0xa8e1); +reg_write( DDR_REG_BASE + 0x5231d*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x5231e*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE + 0x5231f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52320*4+0x02000000,0x19c); +reg_write( DDR_REG_BASE + 0x52321*4+0x02000000,0xa52); +reg_write( DDR_REG_BASE + 0x52322*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x52323*4+0x02000000,0xdab4); +reg_write( DDR_REG_BASE + 0x52324*4+0x02000000,0xd3f); +reg_write( DDR_REG_BASE + 0x52325*4+0x02000000,0x11f5); +reg_write( DDR_REG_BASE + 0x52326*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52327*4+0x02000000,0x2025); +reg_write( DDR_REG_BASE + 0x52328*4+0x02000000,0x340); +reg_write( DDR_REG_BASE + 0x52329*4+0x02000000,0xf020); +reg_write( DDR_REG_BASE + 0x5232a*4+0x02000000,0xf026); +reg_write( DDR_REG_BASE + 0x5232b*4+0x02000000,0xf02e); +reg_write( DDR_REG_BASE + 0x5232c*4+0x02000000,0xf030); +reg_write( DDR_REG_BASE + 0x5232d*4+0x02000000,0xf004); +reg_write( DDR_REG_BASE + 0x5232e*4+0x02000000,0xf002); +reg_write( DDR_REG_BASE + 0x5232f*4+0x02000000,0xf033); +reg_write( DDR_REG_BASE + 0x52330*4+0x02000000,0xc08d); +reg_write( DDR_REG_BASE + 0x52331*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x52332*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE + 0x52333*4+0x02000000,0x3e80); +reg_write( DDR_REG_BASE + 0x52334*4+0x02000000,0xc103); +reg_write( DDR_REG_BASE + 0x52335*4+0x02000000,0xc208); +reg_write( DDR_REG_BASE + 0x52336*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x52337*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x52338*4+0x02000000,0x3f80); +reg_write( DDR_REG_BASE + 0x52339*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5233a*4+0x02000000,0x19c); +reg_write( DDR_REG_BASE + 0x5233b*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x5233c*4+0x02000000,0x40e1); +reg_write( DDR_REG_BASE + 0x5233d*4+0x02000000,0xfb2); +reg_write( DDR_REG_BASE + 0x5233e*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x5233f*4+0x02000000,0x4363); +reg_write( DDR_REG_BASE + 0x52340*4+0x02000000,0x716d); +reg_write( DDR_REG_BASE + 0x52341*4+0x02000000,0xd88c); +reg_write( DDR_REG_BASE + 0x52342*4+0x02000000,0xf02f); +reg_write( DDR_REG_BASE + 0x52343*4+0x02000000,0x70d5); +reg_write( DDR_REG_BASE + 0x52344*4+0x02000000,0x43c9); +reg_write( DDR_REG_BASE + 0x52345*4+0x02000000,0x70cd); +reg_write( DDR_REG_BASE + 0x52346*4+0x02000000,0xf42b); +reg_write( DDR_REG_BASE + 0x52347*4+0x02000000,0xf038); +reg_write( DDR_REG_BASE + 0x52348*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x52349*4+0x02000000,0x3f81); +reg_write( DDR_REG_BASE + 0x5234a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5234b*4+0x02000000,0x19c); +reg_write( DDR_REG_BASE + 0x5234c*4+0x02000000,0x95e); +reg_write( DDR_REG_BASE + 0x5234d*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x5234e*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x5234f*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE + 0x52350*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x52351*4+0x02000000,0x3f81); +reg_write( DDR_REG_BASE + 0x52352*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52353*4+0x02000000,0x19c); +reg_write( DDR_REG_BASE + 0x52354*4+0x02000000,0xf56); +reg_write( DDR_REG_BASE + 0x52355*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x52356*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x52357*4+0x02000000,0xf009); +reg_write( DDR_REG_BASE + 0x52358*4+0x02000000,0xbe2); +reg_write( DDR_REG_BASE + 0x52359*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x5235a*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x5235b*4+0x02000000,0xf005); +reg_write( DDR_REG_BASE + 0x5235c*4+0x02000000,0xc0e); +reg_write( DDR_REG_BASE + 0x5235d*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE + 0x5235e*4+0x02000000,0x40e1); +reg_write( DDR_REG_BASE + 0x5235f*4+0x02000000,0x70cd); +reg_write( DDR_REG_BASE + 0x52360*4+0x02000000,0xf01e); +reg_write( DDR_REG_BASE + 0x52361*4+0x02000000,0xc08d); +reg_write( DDR_REG_BASE + 0x52362*4+0x02000000,0xc103); +reg_write( DDR_REG_BASE + 0x52363*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x52364*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE + 0x52365*4+0x02000000,0x3e80); +reg_write( DDR_REG_BASE + 0x52366*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x52367*4+0x02000000,0x40e1); +reg_write( DDR_REG_BASE + 0x52368*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x52369*4+0x02000000,0x3f83); +reg_write( DDR_REG_BASE + 0x5236a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5236b*4+0x02000000,0x19c); +reg_write( DDR_REG_BASE + 0x5236c*4+0x02000000,0xf4e); +reg_write( DDR_REG_BASE + 0x5236d*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x5236e*4+0x02000000,0x4263); +reg_write( DDR_REG_BASE + 0x5236f*4+0x02000000,0x716d); +reg_write( DDR_REG_BASE + 0x52370*4+0x02000000,0xd8c0); +reg_write( DDR_REG_BASE + 0x52371*4+0x02000000,0xc104); +reg_write( DDR_REG_BASE + 0x52372*4+0x02000000,0xc20b); +reg_write( DDR_REG_BASE + 0x52373*4+0x02000000,0x6038); +reg_write( DDR_REG_BASE + 0x52374*4+0x02000000,0xc10c); +reg_write( DDR_REG_BASE + 0x52375*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x52376*4+0x02000000,0x2400); +reg_write( DDR_REG_BASE + 0x52377*4+0x02000000,0x3f81); +reg_write( DDR_REG_BASE + 0x52378*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52379*4+0x02000000,0x19c); +reg_write( DDR_REG_BASE + 0x5237a*4+0x02000000,0xaf2); +reg_write( DDR_REG_BASE + 0x5237b*4+0x02000000,0xa0); +reg_write( DDR_REG_BASE + 0x5237c*4+0x02000000,0x716c); +reg_write( DDR_REG_BASE + 0x5237d*4+0x02000000,0x4669); +reg_write( DDR_REG_BASE + 0x5237e*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x5237f*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x52380*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52381*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE + 0x52382*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE + 0x52383*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x52384*4+0x02000000,0x7002); +reg_write( DDR_REG_BASE + 0x52385*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52386*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE + 0x52387*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x52388*4+0x02000000,0x813); +reg_write( DDR_REG_BASE + 0x52389*4+0x02000000,0x80b4); +reg_write( DDR_REG_BASE + 0x5238a*4+0x02000000,0x78ef); +reg_write( DDR_REG_BASE + 0x5238b*4+0x02000000,0xd06); +reg_write( DDR_REG_BASE + 0x5238c*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE + 0x5238d*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE + 0x5238e*4+0x02000000,0xca09); +reg_write( DDR_REG_BASE + 0x5238f*4+0x02000000,0xe894); +reg_write( DDR_REG_BASE + 0x52390*4+0x02000000,0xd0f); +reg_write( DDR_REG_BASE + 0x52391*4+0x02000000,0x10f1); +reg_write( DDR_REG_BASE + 0x52392*4+0x02000000,0x79ef); +reg_write( DDR_REG_BASE + 0x52393*4+0x02000000,0xc7e); +reg_write( DDR_REG_BASE + 0x52394*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE + 0x52395*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x52396*4+0x02000000,0xf00c); +reg_write( DDR_REG_BASE + 0x52397*4+0x02000000,0xc009); +reg_write( DDR_REG_BASE + 0x52398*4+0x02000000,0x815); +reg_write( DDR_REG_BASE + 0x52399*4+0x02000000,0x134); +reg_write( DDR_REG_BASE + 0x5239a*4+0x02000000,0x7bef); +reg_write( DDR_REG_BASE + 0x5239b*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE + 0x5239c*4+0x02000000,0xc106); +reg_write( DDR_REG_BASE + 0x5239d*4+0x02000000,0xc204); +reg_write( DDR_REG_BASE + 0x5239e*4+0x02000000,0xbb2); +reg_write( DDR_REG_BASE + 0x5239f*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE + 0x523a0*4+0x02000000,0x2052); +reg_write( DDR_REG_BASE + 0x523a1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x523a2*4+0x02000000,0x71e5); +reg_write( DDR_REG_BASE + 0x523a3*4+0x02000000,0x72f5); +reg_write( DDR_REG_BASE + 0x523a4*4+0x02000000,0x6b6); +reg_write( DDR_REG_BASE + 0x523a5*4+0x02000000,0xffe5); +reg_write( DDR_REG_BASE + 0x523a6*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x523a7*4+0x02000000,0xd19); +reg_write( DDR_REG_BASE + 0x523a8*4+0x02000000,0x10d1); +reg_write( DDR_REG_BASE + 0x523a9*4+0x02000000,0xca09); +reg_write( DDR_REG_BASE + 0x523aa*4+0x02000000,0xe888); +reg_write( DDR_REG_BASE + 0x523ab*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x523ac*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x523ad*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x523ae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x523af*4+0x02000000,0xb8e5); +reg_write( DDR_REG_BASE + 0x523b0*4+0x02000000,0xc7c); +reg_write( DDR_REG_BASE + 0x523b1*4+0x02000000,0xfe42); +reg_write( DDR_REG_BASE + 0x523b2*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x523b3*4+0x02000000,0x7003); +reg_write( DDR_REG_BASE + 0x523b4*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x523b5*4+0x02000000,0xf); +reg_write( DDR_REG_BASE + 0x523b6*4+0x02000000,0x2480); +reg_write( DDR_REG_BASE + 0x523b7*4+0x02000000,0x3409); +reg_write( DDR_REG_BASE + 0x523b8*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x523b9*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x523ba*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x523bb*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x523bc*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x523bd*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x523be*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x523bf*4+0x02000000,0xc1b0); +reg_write( DDR_REG_BASE + 0x523c0*4+0x02000000,0xc04f); +reg_write( DDR_REG_BASE + 0x523c1*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x523c2*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x523c3*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x523c4*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x523c5*4+0x02000000,0xefa); +reg_write( DDR_REG_BASE + 0x523c6*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x523c7*4+0x02000000,0xc046); +reg_write( DDR_REG_BASE + 0x523c8*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x523c9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x523ca*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE + 0x523cb*4+0x02000000,0x4100); +reg_write( DDR_REG_BASE + 0x523cc*4+0x02000000,0x4200); +reg_write( DDR_REG_BASE + 0x523cd*4+0x02000000,0xbee); +reg_write( DDR_REG_BASE + 0x523ce*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x523cf*4+0x02000000,0x4300); +reg_write( DDR_REG_BASE + 0x523d0*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x523d1*4+0x02000000,0x81e); +reg_write( DDR_REG_BASE + 0x523d2*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE + 0x523d3*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x523d4*4+0x02000000,0x47cb); +reg_write( DDR_REG_BASE + 0x523d5*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x523d6*4+0x02000000,0xe004); +reg_write( DDR_REG_BASE + 0x523d7*4+0x02000000,0x1f22); +reg_write( DDR_REG_BASE + 0x523d8*4+0x02000000,0x1015); +reg_write( DDR_REG_BASE + 0x523d9*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE + 0x523da*4+0x02000000,0xfc7); +reg_write( DDR_REG_BASE + 0x523db*4+0x02000000,0x1fa7); +reg_write( DDR_REG_BASE + 0x523dc*4+0x02000000,0x101c); +reg_write( DDR_REG_BASE + 0x523dd*4+0x02000000,0x1fa8); +reg_write( DDR_REG_BASE + 0x523de*4+0x02000000,0x101c); +reg_write( DDR_REG_BASE + 0x523df*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x523e0*4+0x02000000,0xd9ff); +reg_write( DDR_REG_BASE + 0x523e1*4+0x02000000,0xb700); +reg_write( DDR_REG_BASE + 0x523e2*4+0x02000000,0x1ffe); +reg_write( DDR_REG_BASE + 0x523e3*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x523e4*4+0x02000000,0xb705); +reg_write( DDR_REG_BASE + 0x523e5*4+0x02000000,0xbd2); +reg_write( DDR_REG_BASE + 0x523e6*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x523e7*4+0x02000000,0x1ffc); +reg_write( DDR_REG_BASE + 0x523e8*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x523e9*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE + 0x523ea*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x523eb*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE + 0x523ec*4+0x02000000,0x8e04); +reg_write( DDR_REG_BASE + 0x523ed*4+0x02000000,0xc048); +reg_write( DDR_REG_BASE + 0x523ee*4+0x02000000,0x206f); +reg_write( DDR_REG_BASE + 0x523ef*4+0x02000000,0x243); +reg_write( DDR_REG_BASE + 0x523f0*4+0x02000000,0x10fd); +reg_write( DDR_REG_BASE + 0x523f1*4+0x02000000,0x809e); +reg_write( DDR_REG_BASE + 0x523f2*4+0x02000000,0x1420); +reg_write( DDR_REG_BASE + 0x523f3*4+0x02000000,0x301b); +reg_write( DDR_REG_BASE + 0x523f4*4+0x02000000,0x265f); +reg_write( DDR_REG_BASE + 0x523f5*4+0x02000000,0x3100); +reg_write( DDR_REG_BASE + 0x523f6*4+0x02000000,0x780d); +reg_write( DDR_REG_BASE + 0x523f7*4+0x02000000,0x791c); +reg_write( DDR_REG_BASE + 0x523f8*4+0x02000000,0x793c); +reg_write( DDR_REG_BASE + 0x523f9*4+0x02000000,0x793c); +reg_write( DDR_REG_BASE + 0x523fa*4+0x02000000,0x793c); +reg_write( DDR_REG_BASE + 0x523fb*4+0x02000000,0x793c); +reg_write( DDR_REG_BASE + 0x523fc*4+0x02000000,0x8e05); +reg_write( DDR_REG_BASE + 0x523fd*4+0x02000000,0x793c); +reg_write( DDR_REG_BASE + 0x523fe*4+0x02000000,0x793c); +reg_write( DDR_REG_BASE + 0x523ff*4+0x02000000,0xc04d); +reg_write( DDR_REG_BASE + 0x52400*4+0x02000000,0x7824); +reg_write( DDR_REG_BASE + 0x52401*4+0x02000000,0xc04e); +reg_write( DDR_REG_BASE + 0x52402*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE + 0x52403*4+0x02000000,0x2304); +reg_write( DDR_REG_BASE + 0x52404*4+0x02000000,0x305b); +reg_write( DDR_REG_BASE + 0x52405*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x52406*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x52407*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x52408*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52409*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE + 0x5240a*4+0x02000000,0x8e03); +reg_write( DDR_REG_BASE + 0x5240b*4+0x02000000,0xc04c); +reg_write( DDR_REG_BASE + 0x5240c*4+0x02000000,0x8e02); +reg_write( DDR_REG_BASE + 0x5240d*4+0x02000000,0x235); +reg_write( DDR_REG_BASE + 0x5240e*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x5240f*4+0x02000000,0xc04b); +reg_write( DDR_REG_BASE + 0x52410*4+0x02000000,0xe17); +reg_write( DDR_REG_BASE + 0x52411*4+0x02000000,0x317e); +reg_write( DDR_REG_BASE + 0x52412*4+0x02000000,0x202f); +reg_write( DDR_REG_BASE + 0x52413*4+0x02000000,0x6c0); +reg_write( DDR_REG_BASE + 0x52414*4+0x02000000,0x1e05); +reg_write( DDR_REG_BASE + 0x52415*4+0x02000000,0x16c2); +reg_write( DDR_REG_BASE + 0x52416*4+0x02000000,0x1e04); +reg_write( DDR_REG_BASE + 0x52417*4+0x02000000,0x16c2); +reg_write( DDR_REG_BASE + 0x52418*4+0x02000000,0xae02); +reg_write( DDR_REG_BASE + 0x52419*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE + 0x5241a*4+0x02000000,0xae03); +reg_write( DDR_REG_BASE + 0x5241b*4+0x02000000,0x770c); +reg_write( DDR_REG_BASE + 0x5241c*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x5241d*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x5241e*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x5241f*4+0x02000000,0xf0bb); +reg_write( DDR_REG_BASE + 0x52420*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x52421*4+0x02000000,0xc101); +reg_write( DDR_REG_BASE + 0x52422*4+0x02000000,0xae01); +reg_write( DDR_REG_BASE + 0x52423*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x52424*4+0x02000000,0x4200); +reg_write( DDR_REG_BASE + 0x52425*4+0x02000000,0x8e00); +reg_write( DDR_REG_BASE + 0x52426*4+0x02000000,0xb9c4); +reg_write( DDR_REG_BASE + 0x52427*4+0x02000000,0xe906); +reg_write( DDR_REG_BASE + 0x52428*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE + 0x52429*4+0x02000000,0x901); +reg_write( DDR_REG_BASE + 0x5242a*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x5242b*4+0x02000000,0x7a5b); +reg_write( DDR_REG_BASE + 0x5242c*4+0x02000000,0xe806); +reg_write( DDR_REG_BASE + 0x5242d*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x5242e*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE + 0x5242f*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52430*4+0x02000000,0x49); +reg_write( DDR_REG_BASE + 0x52431*4+0x02000000,0xf006); +reg_write( DDR_REG_BASE + 0x52432*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x52433*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE + 0x52434*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52435*4+0x02000000,0x23); +reg_write( DDR_REG_BASE + 0x52436*4+0x02000000,0x784f); +reg_write( DDR_REG_BASE + 0x52437*4+0x02000000,0x790b); +reg_write( DDR_REG_BASE + 0x52438*4+0x02000000,0xc04a); +reg_write( DDR_REG_BASE + 0x52439*4+0x02000000,0xf29f); +reg_write( DDR_REG_BASE + 0x5243a*4+0x02000000,0xc00a); +reg_write( DDR_REG_BASE + 0x5243b*4+0x02000000,0xf6e); +reg_write( DDR_REG_BASE + 0x5243c*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x5243d*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x5243e*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x5243f*4+0x02000000,0xc2e); +reg_write( DDR_REG_BASE + 0x52440*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE + 0x52441*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x52442*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52443*4+0x02000000,0xc049); +reg_write( DDR_REG_BASE + 0x52444*4+0x02000000,0xf002); +reg_write( DDR_REG_BASE + 0x52445*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE + 0x52446*4+0x02000000,0xe59f); +reg_write( DDR_REG_BASE + 0x52447*4+0x02000000,0x10c); +reg_write( DDR_REG_BASE + 0x52448*4+0x02000000,0x9); +reg_write( DDR_REG_BASE + 0x52449*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE + 0x5244a*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x5244b*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x5244c*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x5244d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5244e*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x5244f*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x52450*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE + 0x52451*4+0x02000000,0xe040); +reg_write( DDR_REG_BASE + 0x52452*4+0x02000000,0xb0a0); +reg_write( DDR_REG_BASE + 0x52453*4+0x02000000,0x206f); +reg_write( DDR_REG_BASE + 0x52454*4+0x02000000,0x243); +reg_write( DDR_REG_BASE + 0x52455*4+0x02000000,0x10fd); +reg_write( DDR_REG_BASE + 0x52456*4+0x02000000,0x8080); +reg_write( DDR_REG_BASE + 0x52457*4+0x02000000,0x82d); +reg_write( DDR_REG_BASE + 0x52458*4+0x02000000,0x15f); +reg_write( DDR_REG_BASE + 0x52459*4+0x02000000,0x8e25); +reg_write( DDR_REG_BASE + 0x5245a*4+0x02000000,0x8e44); +reg_write( DDR_REG_BASE + 0x5245b*4+0x02000000,0xf00f); +reg_write( DDR_REG_BASE + 0x5245c*4+0x02000000,0x221a); +reg_write( DDR_REG_BASE + 0x5245d*4+0x02000000,0xf83); +reg_write( DDR_REG_BASE + 0x5245e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5245f*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x52460*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x52461*4+0x02000000,0x7144); +reg_write( DDR_REG_BASE + 0x52462*4+0x02000000,0x7865); +reg_write( DDR_REG_BASE + 0x52463*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x52464*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x52465*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x52466*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x52467*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x52468*4+0x02000000,0xb0a0); +reg_write( DDR_REG_BASE + 0x52469*4+0x02000000,0x9e9); +reg_write( DDR_REG_BASE + 0x5246a*4+0x02000000,0x8085); +reg_write( DDR_REG_BASE + 0x5246b*4+0x02000000,0xf00e); +reg_write( DDR_REG_BASE + 0x5246c*4+0x02000000,0x231a); +reg_write( DDR_REG_BASE + 0x5246d*4+0x02000000,0x3f81); +reg_write( DDR_REG_BASE + 0x5246e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5246f*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x52470*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x52471*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x52472*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x52473*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x52474*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x52475*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x52476*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x52477*4+0x02000000,0xb0a0); +reg_write( DDR_REG_BASE + 0x52478*4+0x02000000,0xd72); +reg_write( DDR_REG_BASE + 0x52479*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x5247a*4+0x02000000,0xd814); +reg_write( DDR_REG_BASE + 0x5247b*4+0x02000000,0xeea); +reg_write( DDR_REG_BASE + 0x5247c*4+0x02000000,0xff8f); +reg_write( DDR_REG_BASE + 0x5247d*4+0x02000000,0xc00f); +reg_write( DDR_REG_BASE + 0x5247e*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x5247f*4+0x02000000,0xbae); +reg_write( DDR_REG_BASE + 0x52480*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE + 0x52481*4+0x02000000,0x7810); +reg_write( DDR_REG_BASE + 0x52482*4+0x02000000,0x8e04); +reg_write( DDR_REG_BASE + 0x52483*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE + 0x52484*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52485*4+0x02000000,0xc047); +reg_write( DDR_REG_BASE + 0x52486*4+0x02000000,0xf034); +reg_write( DDR_REG_BASE + 0x52487*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE + 0x52488*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x52489*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x5248a*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x5248b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5248c*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE + 0x5248d*4+0x02000000,0x2105); +reg_write( DDR_REG_BASE + 0x5248e*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x5248f*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x52490*4+0x02000000,0x170); +reg_write( DDR_REG_BASE + 0x52491*4+0x02000000,0x9000); +reg_write( DDR_REG_BASE + 0x52492*4+0x02000000,0xc245); +reg_write( DDR_REG_BASE + 0x52493*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE + 0x52494*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x52495*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x52496*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x52497*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x52498*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x52499*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x5249a*4+0x02000000,0x166); +reg_write( DDR_REG_BASE + 0x5249b*4+0x02000000,0x9000); +reg_write( DDR_REG_BASE + 0x5249c*4+0x02000000,0xe806); +reg_write( DDR_REG_BASE + 0x5249d*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x5249e*4+0x02000000,0x7810); +reg_write( DDR_REG_BASE + 0x5249f*4+0x02000000,0x200f); +reg_write( DDR_REG_BASE + 0x524a0*4+0x02000000,0x80); +reg_write( DDR_REG_BASE + 0x524a1*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE + 0x524a2*4+0x02000000,0x7144); +reg_write( DDR_REG_BASE + 0x524a3*4+0x02000000,0xae5); +reg_write( DDR_REG_BASE + 0x524a4*4+0x02000000,0x8234); +reg_write( DDR_REG_BASE + 0x524a5*4+0x02000000,0x4040); +reg_write( DDR_REG_BASE + 0x524a6*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x524a7*4+0x02000000,0x262f); +reg_write( DDR_REG_BASE + 0x524a8*4+0x02000000,0xf008); +reg_write( DDR_REG_BASE + 0x524a9*4+0x02000000,0xf40b); +reg_write( DDR_REG_BASE + 0x524aa*4+0x02000000,0xc201); +reg_write( DDR_REG_BASE + 0x524ab*4+0x02000000,0xc303); +reg_write( DDR_REG_BASE + 0x524ac*4+0x02000000,0x740c); +reg_write( DDR_REG_BASE + 0x524ad*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x524ae*4+0x02000000,0xe); +reg_write( DDR_REG_BASE + 0x524af*4+0x02000000,0x3); +reg_write( DDR_REG_BASE + 0x524b0*4+0x02000000,0xf02); +reg_write( DDR_REG_BASE + 0x524b1*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE + 0x524b2*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x524b3*4+0x02000000,0xc105); +reg_write( DDR_REG_BASE + 0x524b4*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE + 0x524b5*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x524b6*4+0x02000000,0xc047); +reg_write( DDR_REG_BASE + 0x524b7*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE + 0x524b8*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE + 0x524b9*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE + 0x524ba*4+0x02000000,0x8e25); +reg_write( DDR_REG_BASE + 0x524bb*4+0x02000000,0xc003); +reg_write( DDR_REG_BASE + 0x524bc*4+0x02000000,0x997); +reg_write( DDR_REG_BASE + 0x524bd*4+0x02000000,0x8025); +reg_write( DDR_REG_BASE + 0x524be*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x524bf*4+0x02000000,0xe42); +reg_write( DDR_REG_BASE + 0x524c0*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE + 0x524c1*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x524c2*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE + 0x524c3*4+0x02000000,0x262f); +reg_write( DDR_REG_BASE + 0x524c4*4+0x02000000,0xf008); +reg_write( DDR_REG_BASE + 0x524c5*4+0x02000000,0xf581); +reg_write( DDR_REG_BASE + 0x524c6*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE + 0x524c7*4+0x02000000,0x2008); +reg_write( DDR_REG_BASE + 0x524c8*4+0x02000000,0x340); +reg_write( DDR_REG_BASE + 0x524c9*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x524ca*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x524cb*4+0x02000000,0xc049); +reg_write( DDR_REG_BASE + 0x524cc*4+0x02000000,0xc009); +reg_write( DDR_REG_BASE + 0x524cd*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x524ce*4+0x02000000,0x11); +reg_write( DDR_REG_BASE + 0x524cf*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x524d0*4+0x02000000,0xf4e); +reg_write( DDR_REG_BASE + 0x524d1*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x524d2*4+0x02000000,0xc201); +reg_write( DDR_REG_BASE + 0x524d3*4+0x02000000,0xc26); +reg_write( DDR_REG_BASE + 0x524d4*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x524d5*4+0x02000000,0xc00a); +reg_write( DDR_REG_BASE + 0x524d6*4+0x02000000,0xc502); +reg_write( DDR_REG_BASE + 0x524d7*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x524d8*4+0x02000000,0x7704); +reg_write( DDR_REG_BASE + 0x524d9*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x524da*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x524db*4+0x02000000,0x7014); +reg_write( DDR_REG_BASE + 0x524dc*4+0x02000000,0x688); +reg_write( DDR_REG_BASE + 0x524dd*4+0x02000000,0xffca); +reg_write( DDR_REG_BASE + 0x524de*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE + 0x524df*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x524e0*4+0x02000000,0x13); +reg_write( DDR_REG_BASE + 0x524e1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x524e2*4+0x02000000,0x7812); +reg_write( DDR_REG_BASE + 0x524e3*4+0x02000000,0x202f); +reg_write( DDR_REG_BASE + 0x524e4*4+0x02000000,0xd); +reg_write( DDR_REG_BASE + 0x524e5*4+0x02000000,0xf26); +reg_write( DDR_REG_BASE + 0x524e6*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x524e7*4+0x02000000,0xb8c0); +reg_write( DDR_REG_BASE + 0x524e8*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE + 0x524e9*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x524ea*4+0x02000000,0x7081); +reg_write( DDR_REG_BASE + 0x524eb*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x524ec*4+0x02000000,0x14); +reg_write( DDR_REG_BASE + 0x524ed*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x524ee*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x524ef*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x524f0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x524f1*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x524f2*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE + 0x524f3*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE + 0x524f4*4+0x02000000,0xe040); +reg_write( DDR_REG_BASE + 0x524f5*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE + 0x524f6*4+0x02000000,0x6038); +reg_write( DDR_REG_BASE + 0x524f7*4+0x02000000,0x2049); +reg_write( DDR_REG_BASE + 0x524f8*4+0x02000000,0x7c1); +reg_write( DDR_REG_BASE + 0x524f9*4+0x02000000,0xb220); +reg_write( DDR_REG_BASE + 0x524fa*4+0x02000000,0x206f); +reg_write( DDR_REG_BASE + 0x524fb*4+0x02000000,0x243); +reg_write( DDR_REG_BASE + 0x524fc*4+0x02000000,0x10fd); +reg_write( DDR_REG_BASE + 0x524fd*4+0x02000000,0x809e); +reg_write( DDR_REG_BASE + 0x524fe*4+0x02000000,0xe37); +reg_write( DDR_REG_BASE + 0x524ff*4+0x02000000,0x315f); +reg_write( DDR_REG_BASE + 0x52500*4+0x02000000,0x8e45); +reg_write( DDR_REG_BASE + 0x52501*4+0x02000000,0x8e64); +reg_write( DDR_REG_BASE + 0x52502*4+0x02000000,0xf00e); +reg_write( DDR_REG_BASE + 0x52503*4+0x02000000,0x231a); +reg_write( DDR_REG_BASE + 0x52504*4+0x02000000,0xf8c); +reg_write( DDR_REG_BASE + 0x52505*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52506*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x52507*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x52508*4+0x02000000,0x7164); +reg_write( DDR_REG_BASE + 0x52509*4+0x02000000,0x7885); +reg_write( DDR_REG_BASE + 0x5250a*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x5250b*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x5250c*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x5250d*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x5250e*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x5250f*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE + 0x52510*4+0x02000000,0xae7); +reg_write( DDR_REG_BASE + 0x52511*4+0x02000000,0x80c5); +reg_write( DDR_REG_BASE + 0x52512*4+0x02000000,0xdba); +reg_write( DDR_REG_BASE + 0x52513*4+0x02000000,0xff8f); +reg_write( DDR_REG_BASE + 0x52514*4+0x02000000,0x206f); +reg_write( DDR_REG_BASE + 0x52515*4+0x02000000,0x243); +reg_write( DDR_REG_BASE + 0x52516*4+0x02000000,0x10fd); +reg_write( DDR_REG_BASE + 0x52517*4+0x02000000,0x809e); +reg_write( DDR_REG_BASE + 0x52518*4+0x02000000,0xf00d); +reg_write( DDR_REG_BASE + 0x52519*4+0x02000000,0x231a); +reg_write( DDR_REG_BASE + 0x5251a*4+0x02000000,0x3f82); +reg_write( DDR_REG_BASE + 0x5251b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5251c*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x5251d*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x5251e*4+0x02000000,0x7845); +reg_write( DDR_REG_BASE + 0x5251f*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x52520*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x52521*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x52522*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x52523*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x52524*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE + 0x52525*4+0x02000000,0x7167); +reg_write( DDR_REG_BASE + 0x52526*4+0x02000000,0xc00e); +reg_write( DDR_REG_BASE + 0x52527*4+0x02000000,0x230c); +reg_write( DDR_REG_BASE + 0x52528*4+0x02000000,0xb000); +reg_write( DDR_REG_BASE + 0x52529*4+0x02000000,0x5d0); +reg_write( DDR_REG_BASE + 0x5252a*4+0x02000000,0xffce); +reg_write( DDR_REG_BASE + 0x5252b*4+0x02000000,0xe17); +reg_write( DDR_REG_BASE + 0x5252c*4+0x02000000,0x315e); +reg_write( DDR_REG_BASE + 0x5252d*4+0x02000000,0xc00d); +reg_write( DDR_REG_BASE + 0x5252e*4+0x02000000,0xae05); +reg_write( DDR_REG_BASE + 0x5252f*4+0x02000000,0xc008); +reg_write( DDR_REG_BASE + 0x52530*4+0x02000000,0xae04); +reg_write( DDR_REG_BASE + 0x52531*4+0x02000000,0xc00c); +reg_write( DDR_REG_BASE + 0x52532*4+0x02000000,0xae03); +reg_write( DDR_REG_BASE + 0x52533*4+0x02000000,0xc00b); +reg_write( DDR_REG_BASE + 0x52534*4+0x02000000,0xae02); +reg_write( DDR_REG_BASE + 0x52535*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52536*4+0x02000000,0x1fa7); +reg_write( DDR_REG_BASE + 0x52537*4+0x02000000,0x101c); +reg_write( DDR_REG_BASE + 0x52538*4+0x02000000,0x1fa8); +reg_write( DDR_REG_BASE + 0x52539*4+0x02000000,0x101c); +reg_write( DDR_REG_BASE + 0x5253a*4+0x02000000,0xb700); +reg_write( DDR_REG_BASE + 0x5253b*4+0x02000000,0xc0b0); +reg_write( DDR_REG_BASE + 0x5253c*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x5253d*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x5253e*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x5253f*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x52540*4+0x02000000,0x208c); +reg_write( DDR_REG_BASE + 0x52541*4+0x02000000,0x8fc3); +reg_write( DDR_REG_BASE + 0x52542*4+0x02000000,0xf209); +reg_write( DDR_REG_BASE + 0x52543*4+0x02000000,0x821); +reg_write( DDR_REG_BASE + 0x52544*4+0x02000000,0x1d1); +reg_write( DDR_REG_BASE + 0x52545*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x52546*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x52547*4+0x02000000,0x238); +reg_write( DDR_REG_BASE + 0x52548*4+0x02000000,0x1900); +reg_write( DDR_REG_BASE + 0x52549*4+0x02000000,0x45); +reg_write( DDR_REG_BASE + 0x5254a*4+0x02000000,0xf006); +reg_write( DDR_REG_BASE + 0x5254b*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x5254c*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x5254d*4+0x02000000,0x238); +reg_write( DDR_REG_BASE + 0x5254e*4+0x02000000,0x1900); +reg_write( DDR_REG_BASE + 0x5254f*4+0x02000000,0x105); +reg_write( DDR_REG_BASE + 0x52550*4+0x02000000,0x1900); +reg_write( DDR_REG_BASE + 0x52551*4+0x02000000,0x5); +reg_write( DDR_REG_BASE + 0x52552*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x52553*4+0x02000000,0x9018); +reg_write( DDR_REG_BASE + 0x52554*4+0x02000000,0x64); +reg_write( DDR_REG_BASE + 0x52555*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE + 0x52556*4+0x02000000,0x25); +reg_write( DDR_REG_BASE + 0x52557*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x52558*4+0x02000000,0x1902); +reg_write( DDR_REG_BASE + 0x52559*4+0x02000000,0x5); +reg_write( DDR_REG_BASE + 0x5255a*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x5255b*4+0x02000000,0x9018); +reg_write( DDR_REG_BASE + 0x5255c*4+0x02000000,0x64); +reg_write( DDR_REG_BASE + 0x5255d*4+0x02000000,0xda10); +reg_write( DDR_REG_BASE + 0x5255e*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE + 0x5255f*4+0x02000000,0xba61); +reg_write( DDR_REG_BASE + 0x52560*4+0x02000000,0xaff); +reg_write( DDR_REG_BASE + 0x52561*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE + 0x52562*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x52563*4+0x02000000,0xb102); +reg_write( DDR_REG_BASE + 0x52564*4+0x02000000,0x9); +reg_write( DDR_REG_BASE + 0x52565*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x52566*4+0x02000000,0x1902); +reg_write( DDR_REG_BASE + 0x52567*4+0x02000000,0x5); +reg_write( DDR_REG_BASE + 0x52568*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x52569*4+0x02000000,0x9018); +reg_write( DDR_REG_BASE + 0x5256a*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x5256b*4+0x02000000,0x9100); +reg_write( DDR_REG_BASE + 0x5256c*4+0x02000000,0x8ff); +reg_write( DDR_REG_BASE + 0x5256d*4+0x02000000,0x801f); +reg_write( DDR_REG_BASE + 0x5256e*4+0x02000000,0x195e); +reg_write( DDR_REG_BASE + 0x5256f*4+0x02000000,0x45); +reg_write( DDR_REG_BASE + 0x52570*4+0x02000000,0x9100); +reg_write( DDR_REG_BASE + 0x52571*4+0x02000000,0x801); +reg_write( DDR_REG_BASE + 0x52572*4+0x02000000,0x1e); +reg_write( DDR_REG_BASE + 0x52573*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x52574*4+0x02000000,0xc2e2); +reg_write( DDR_REG_BASE + 0x52575*4+0x02000000,0x4200); +reg_write( DDR_REG_BASE + 0x52576*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x52577*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x52578*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52579*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5257a*4+0x02000000,0x827); +reg_write( DDR_REG_BASE + 0x5257b*4+0x02000000,0x13f); +reg_write( DDR_REG_BASE + 0x5257c*4+0x02000000,0x4328); +reg_write( DDR_REG_BASE + 0x5257d*4+0x02000000,0xd808); +reg_write( DDR_REG_BASE + 0x5257e*4+0x02000000,0xf86); +reg_write( DDR_REG_BASE + 0x5257f*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x52580*4+0x02000000,0x7d50); +reg_write( DDR_REG_BASE + 0x52581*4+0x02000000,0xfb6); +reg_write( DDR_REG_BASE + 0x52582*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x52583*4+0x02000000,0x4040); +reg_write( DDR_REG_BASE + 0x52584*4+0x02000000,0x706c); +reg_write( DDR_REG_BASE + 0x52585*4+0x02000000,0xf007); +reg_write( DDR_REG_BASE + 0x52586*4+0x02000000,0xfaa); +reg_write( DDR_REG_BASE + 0x52587*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x52588*4+0x02000000,0x1304); +reg_write( DDR_REG_BASE + 0x52589*4+0x02000000,0x1400); +reg_write( DDR_REG_BASE + 0x5258a*4+0x02000000,0x7164); +reg_write( DDR_REG_BASE + 0x5258b*4+0x02000000,0xbf9); +reg_write( DDR_REG_BASE + 0x5258c*4+0x02000000,0x8344); +reg_write( DDR_REG_BASE + 0x5258d*4+0x02000000,0xc6c2); +reg_write( DDR_REG_BASE + 0x5258e*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x5258f*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x52590*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x52591*4+0x02000000,0x2482); +reg_write( DDR_REG_BASE + 0x52592*4+0x02000000,0x3a03); +reg_write( DDR_REG_BASE + 0x52593*4+0x02000000,0xc255); +reg_write( DDR_REG_BASE + 0x52594*4+0x02000000,0xc152); +reg_write( DDR_REG_BASE + 0x52595*4+0x02000000,0xc050); +reg_write( DDR_REG_BASE + 0x52596*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE + 0x52597*4+0x02000000,0x3800); +reg_write( DDR_REG_BASE + 0x52598*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x52599*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5259a*4+0x02000000,0x4a4); +reg_write( DDR_REG_BASE + 0x5259b*4+0x02000000,0xda66); +reg_write( DDR_REG_BASE + 0x5259c*4+0x02000000,0xd4a); +reg_write( DDR_REG_BASE + 0x5259d*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x5259e*4+0x02000000,0xc353); +reg_write( DDR_REG_BASE + 0x5259f*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE + 0x525a0*4+0x02000000,0x3800); +reg_write( DDR_REG_BASE + 0x525a1*4+0x02000000,0xe4a); +reg_write( DDR_REG_BASE + 0x525a2*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x525a3*4+0x02000000,0xd966); +reg_write( DDR_REG_BASE + 0x525a4*4+0x02000000,0x47cb); +reg_write( DDR_REG_BASE + 0x525a5*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x525a6*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE + 0x525a7*4+0x02000000,0x8f40); +reg_write( DDR_REG_BASE + 0x525a8*4+0x02000000,0x8f21); +reg_write( DDR_REG_BASE + 0x525a9*4+0x02000000,0x14fc); +reg_write( DDR_REG_BASE + 0x525aa*4+0x02000000,0x3000); +reg_write( DDR_REG_BASE + 0x525ab*4+0x02000000,0x225f); +reg_write( DDR_REG_BASE + 0x525ac*4+0x02000000,0x243); +reg_write( DDR_REG_BASE + 0x525ad*4+0x02000000,0xc054); +reg_write( DDR_REG_BASE + 0x525ae*4+0x02000000,0xf03a); +reg_write( DDR_REG_BASE + 0x525af*4+0x02000000,0x44cb); +reg_write( DDR_REG_BASE + 0x525b0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x525b1*4+0x02000000,0x7fff); +reg_write( DDR_REG_BASE + 0x525b2*4+0x02000000,0x6c01); +reg_write( DDR_REG_BASE + 0x525b3*4+0x02000000,0x4368); +reg_write( DDR_REG_BASE + 0x525b4*4+0x02000000,0xf00a); +reg_write( DDR_REG_BASE + 0x525b5*4+0x02000000,0xc015); +reg_write( DDR_REG_BASE + 0x525b6*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE + 0x525b7*4+0x02000000,0x20f5); +reg_write( DDR_REG_BASE + 0x525b8*4+0x02000000,0x2c0); +reg_write( DDR_REG_BASE + 0x525b9*4+0x02000000,0x7165); +reg_write( DDR_REG_BASE + 0x525ba*4+0x02000000,0x2009); +reg_write( DDR_REG_BASE + 0x525bb*4+0x02000000,0x30c); +reg_write( DDR_REG_BASE + 0x525bc*4+0x02000000,0x2008); +reg_write( DDR_REG_BASE + 0x525bd*4+0x02000000,0x340); +reg_write( DDR_REG_BASE + 0x525be*4+0x02000000,0xeef); +reg_write( DDR_REG_BASE + 0x525bf*4+0x02000000,0x9234); +reg_write( DDR_REG_BASE + 0x525c0*4+0x02000000,0x7d0e); +reg_write( DDR_REG_BASE + 0x525c1*4+0x02000000,0x64b8); +reg_write( DDR_REG_BASE + 0x525c2*4+0x02000000,0x2844); +reg_write( DDR_REG_BASE + 0x525c3*4+0x02000000,0x8d); +reg_write( DDR_REG_BASE + 0x525c4*4+0x02000000,0xe309); +reg_write( DDR_REG_BASE + 0x525c5*4+0x02000000,0x7eae); +reg_write( DDR_REG_BASE + 0x525c6*4+0x02000000,0x78dc); +reg_write( DDR_REG_BASE + 0x525c7*4+0x02000000,0x781c); +reg_write( DDR_REG_BASE + 0x525c8*4+0x02000000,0x781c); +reg_write( DDR_REG_BASE + 0x525c9*4+0x02000000,0x781c); +reg_write( DDR_REG_BASE + 0x525ca*4+0x02000000,0x4408); +reg_write( DDR_REG_BASE + 0x525cb*4+0x02000000,0xd81b); +reg_write( DDR_REG_BASE + 0x525cc*4+0x02000000,0xb861); +reg_write( DDR_REG_BASE + 0x525cd*4+0x02000000,0x801); +reg_write( DDR_REG_BASE + 0x525ce*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x525cf*4+0x02000000,0x7c9d); +reg_write( DDR_REG_BASE + 0x525d0*4+0x02000000,0x6698); +reg_write( DDR_REG_BASE + 0x525d1*4+0x02000000,0xb8c4); +reg_write( DDR_REG_BASE + 0x525d2*4+0x02000000,0x4894); +reg_write( DDR_REG_BASE + 0x525d3*4+0x02000000,0x2e44); +reg_write( DDR_REG_BASE + 0x525d4*4+0x02000000,0x1800); +reg_write( DDR_REG_BASE + 0x525d5*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x525d6*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x525d7*4+0x02000000,0x7c05); +reg_write( DDR_REG_BASE + 0x525d8*4+0x02000000,0x221a); +reg_write( DDR_REG_BASE + 0x525d9*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x525da*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x525db*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE + 0x525dc*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x525dd*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x525de*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x525df*4+0x02000000,0x1064); +reg_write( DDR_REG_BASE + 0x525e0*4+0x02000000,0xb080); +reg_write( DDR_REG_BASE + 0x525e1*4+0x02000000,0xc096); +reg_write( DDR_REG_BASE + 0x525e2*4+0x02000000,0x7854); +reg_write( DDR_REG_BASE + 0x525e3*4+0x02000000,0xb0a0); +reg_write( DDR_REG_BASE + 0x525e4*4+0x02000000,0xc09b); +reg_write( DDR_REG_BASE + 0x525e5*4+0x02000000,0x7854); +reg_write( DDR_REG_BASE + 0x525e6*4+0x02000000,0xb080); +reg_write( DDR_REG_BASE + 0x525e7*4+0x02000000,0x7144); +reg_write( DDR_REG_BASE + 0x525e8*4+0x02000000,0x98f); +reg_write( DDR_REG_BASE + 0x525e9*4+0x02000000,0x80a5); +reg_write( DDR_REG_BASE + 0x525ea*4+0x02000000,0x70cd); +reg_write( DDR_REG_BASE + 0x525eb*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x525ec*4+0x02000000,0x83a); +reg_write( DDR_REG_BASE + 0x525ed*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE + 0x525ee*4+0x02000000,0xd9ff); +reg_write( DDR_REG_BASE + 0x525ef*4+0x02000000,0x1200); +reg_write( DDR_REG_BASE + 0x525f0*4+0x02000000,0x3083); +reg_write( DDR_REG_BASE + 0x525f1*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x525f2*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x525f3*4+0x02000000,0xb98e); +reg_write( DDR_REG_BASE + 0x525f4*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x525f5*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE + 0x525f6*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x525f7*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x525f8*4+0x02000000,0x8fa); +reg_write( DDR_REG_BASE + 0x525f9*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE + 0x525fa*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x525fb*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x525fc*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE + 0x525fd*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x525fe*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x525ff*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE + 0x52600*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x52601*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x52602*4+0x02000000,0x8e6); +reg_write( DDR_REG_BASE + 0x52603*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE + 0x52604*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x52605*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52606*4+0x02000000,0x89e); +reg_write( DDR_REG_BASE + 0x52607*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE + 0x52608*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x52609*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x5260a*4+0x02000000,0xf86); +reg_write( DDR_REG_BASE + 0x5260b*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE + 0x5260c*4+0x02000000,0xd9ff); +reg_write( DDR_REG_BASE + 0x5260d*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE + 0x5260e*4+0x02000000,0xfc7); +reg_write( DDR_REG_BASE + 0x5260f*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x52610*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x52611*4+0x02000000,0xe174); +reg_write( DDR_REG_BASE + 0x52612*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x52613*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x52614*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x52615*4+0x02000000,0xe174); +reg_write( DDR_REG_BASE + 0x52616*4+0x02000000,0xb101); +reg_write( DDR_REG_BASE + 0x52617*4+0x02000000,0xc010); +reg_write( DDR_REG_BASE + 0x52618*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x52619*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE + 0x5261a*4+0x02000000,0x7cd); +reg_write( DDR_REG_BASE + 0x5261b*4+0x02000000,0x4020); +reg_write( DDR_REG_BASE + 0x5261c*4+0x02000000,0xed05); +reg_write( DDR_REG_BASE + 0x5261d*4+0x02000000,0xbd61); +reg_write( DDR_REG_BASE + 0x5261e*4+0x02000000,0xdff); +reg_write( DDR_REG_BASE + 0x5261f*4+0x02000000,0x9031); +reg_write( DDR_REG_BASE + 0x52620*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x52621*4+0x02000000,0xc051); +reg_write( DDR_REG_BASE + 0x52622*4+0x02000000,0xef3); +reg_write( DDR_REG_BASE + 0x52623*4+0x02000000,0x1155); +reg_write( DDR_REG_BASE + 0x52624*4+0x02000000,0xc011); +reg_write( DDR_REG_BASE + 0x52625*4+0x02000000,0xd8a); +reg_write( DDR_REG_BASE + 0x52626*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x52627*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x52628*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x52629*4+0x02000000,0xb6e); +reg_write( DDR_REG_BASE + 0x5262a*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE + 0x5262b*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x5262c*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x5262d*4+0x02000000,0x852); +reg_write( DDR_REG_BASE + 0x5262e*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE + 0x5262f*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x52630*4+0x02000000,0x8fa0); +reg_write( DDR_REG_BASE + 0x52631*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52632*4+0x02000000,0xc04f); +reg_write( DDR_REG_BASE + 0x52633*4+0x02000000,0xf061); +reg_write( DDR_REG_BASE + 0x52634*4+0x02000000,0x251a); +reg_write( DDR_REG_BASE + 0x52635*4+0x02000000,0x1f81); +reg_write( DDR_REG_BASE + 0x52636*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52637*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE + 0x52638*4+0x02000000,0x4318); +reg_write( DDR_REG_BASE + 0x52639*4+0x02000000,0xf00d); +reg_write( DDR_REG_BASE + 0x5263a*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x5263b*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x5263c*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x5263d*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x5263e*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x5263f*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x52640*4+0x02000000,0x166); +reg_write( DDR_REG_BASE + 0x52641*4+0x02000000,0x9000); +reg_write( DDR_REG_BASE + 0x52642*4+0x02000000,0x2300); +reg_write( DDR_REG_BASE + 0x52643*4+0x02000000,0x301b); +reg_write( DDR_REG_BASE + 0x52644*4+0x02000000,0x4040); +reg_write( DDR_REG_BASE + 0x52645*4+0x02000000,0x8ed); +reg_write( DDR_REG_BASE + 0x52646*4+0x02000000,0x8234); +reg_write( DDR_REG_BASE + 0x52647*4+0x02000000,0x6841); +reg_write( DDR_REG_BASE + 0x52648*4+0x02000000,0xb8f); +reg_write( DDR_REG_BASE + 0x52649*4+0x02000000,0x3010); +reg_write( DDR_REG_BASE + 0x5264a*4+0x02000000,0xe21); +reg_write( DDR_REG_BASE + 0x5264b*4+0x02000000,0x1070); +reg_write( DDR_REG_BASE + 0x5264c*4+0x02000000,0xc096); +reg_write( DDR_REG_BASE + 0x5264d*4+0x02000000,0xe25); +reg_write( DDR_REG_BASE + 0x5264e*4+0x02000000,0x10f0); +reg_write( DDR_REG_BASE + 0x5264f*4+0x02000000,0xc096); +reg_write( DDR_REG_BASE + 0x52650*4+0x02000000,0xe25); +reg_write( DDR_REG_BASE + 0x52651*4+0x02000000,0x1131); +reg_write( DDR_REG_BASE + 0x52652*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52653*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x52654*4+0x02000000,0x24); +reg_write( DDR_REG_BASE + 0x52655*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x52656*4+0x02000000,0xc42); +reg_write( DDR_REG_BASE + 0x52657*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52658*4+0x02000000,0x42a1); +reg_write( DDR_REG_BASE + 0x52659*4+0x02000000,0xf037); +reg_write( DDR_REG_BASE + 0x5265a*4+0x02000000,0x20f4); +reg_write( DDR_REG_BASE + 0x5265b*4+0x02000000,0x340); +reg_write( DDR_REG_BASE + 0x5265c*4+0x02000000,0x7404); +reg_write( DDR_REG_BASE + 0x5265d*4+0x02000000,0xf014); +reg_write( DDR_REG_BASE + 0x5265e*4+0x02000000,0x20f4); +reg_write( DDR_REG_BASE + 0x5265f*4+0x02000000,0x340); +reg_write( DDR_REG_BASE + 0x52660*4+0x02000000,0xe008); +reg_write( DDR_REG_BASE + 0x52661*4+0x02000000,0xf010); +reg_write( DDR_REG_BASE + 0x52662*4+0x02000000,0xc096); +reg_write( DDR_REG_BASE + 0x52663*4+0x02000000,0x20f4); +reg_write( DDR_REG_BASE + 0x52664*4+0x02000000,0x341); +reg_write( DDR_REG_BASE + 0x52665*4+0x02000000,0xee08); +reg_write( DDR_REG_BASE + 0x52666*4+0x02000000,0x915); +reg_write( DDR_REG_BASE + 0x52667*4+0x02000000,0x274); +reg_write( DDR_REG_BASE + 0x52668*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52669*4+0x02000000,0x2142); +reg_write( DDR_REG_BASE + 0x5266a*4+0x02000000,0x200); +reg_write( DDR_REG_BASE + 0x5266b*4+0x02000000,0xf006); +reg_write( DDR_REG_BASE + 0x5266c*4+0x02000000,0x909); +reg_write( DDR_REG_BASE + 0x5266d*4+0x02000000,0x174); +reg_write( DDR_REG_BASE + 0x5266e*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x5266f*4+0x02000000,0x690c); +reg_write( DDR_REG_BASE + 0x52670*4+0x02000000,0x7a0e); +reg_write( DDR_REG_BASE + 0x52671*4+0x02000000,0x785c); +reg_write( DDR_REG_BASE + 0x52672*4+0x02000000,0x781c); +reg_write( DDR_REG_BASE + 0x52673*4+0x02000000,0x781c); +reg_write( DDR_REG_BASE + 0x52674*4+0x02000000,0x781c); +reg_write( DDR_REG_BASE + 0x52675*4+0x02000000,0x4100); +reg_write( DDR_REG_BASE + 0x52676*4+0x02000000,0xd81b); +reg_write( DDR_REG_BASE + 0x52677*4+0x02000000,0xb861); +reg_write( DDR_REG_BASE + 0x52678*4+0x02000000,0x8ff); +reg_write( DDR_REG_BASE + 0x52679*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE + 0x5267a*4+0x02000000,0x793d); +reg_write( DDR_REG_BASE + 0x5267b*4+0x02000000,0x6238); +reg_write( DDR_REG_BASE + 0x5267c*4+0x02000000,0xb8c4); +reg_write( DDR_REG_BASE + 0x5267d*4+0x02000000,0x4831); +reg_write( DDR_REG_BASE + 0x5267e*4+0x02000000,0x2a44); +reg_write( DDR_REG_BASE + 0x5267f*4+0x02000000,0x800); +reg_write( DDR_REG_BASE + 0x52680*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x52681*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x52682*4+0x02000000,0x7905); +reg_write( DDR_REG_BASE + 0x52683*4+0x02000000,0x251a); +reg_write( DDR_REG_BASE + 0x52684*4+0x02000000,0x1f80); +reg_write( DDR_REG_BASE + 0x52685*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52686*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE + 0x52687*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x52688*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x52689*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x5268a*4+0x02000000,0x1064); +reg_write( DDR_REG_BASE + 0x5268b*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE + 0x5268c*4+0x02000000,0xc09b); +reg_write( DDR_REG_BASE + 0x5268d*4+0x02000000,0x78b4); +reg_write( DDR_REG_BASE + 0x5268e*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE + 0x5268f*4+0x02000000,0xc00f); +reg_write( DDR_REG_BASE + 0x52690*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE + 0x52691*4+0x02000000,0x7063); +reg_write( DDR_REG_BASE + 0x52692*4+0x02000000,0xc04f); +reg_write( DDR_REG_BASE + 0x52693*4+0x02000000,0x8f01); +reg_write( DDR_REG_BASE + 0x52694*4+0x02000000,0x841); +reg_write( DDR_REG_BASE + 0x52695*4+0x02000000,0x8365); +reg_write( DDR_REG_BASE + 0x52696*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52697*4+0x02000000,0xc00f); +reg_write( DDR_REG_BASE + 0x52698*4+0x02000000,0x815); +reg_write( DDR_REG_BASE + 0x52699*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE + 0x5269a*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE + 0x5269b*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x5269c*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x5269d*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x5269e*4+0x02000000,0xe174); +reg_write( DDR_REG_BASE + 0x5269f*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x526a0*4+0x02000000,0x7044); +reg_write( DDR_REG_BASE + 0x526a1*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x526a2*4+0x02000000,0xe174); +reg_write( DDR_REG_BASE + 0x526a3*4+0x02000000,0xb021); +reg_write( DDR_REG_BASE + 0x526a4*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x526a5*4+0x02000000,0xc04d); +reg_write( DDR_REG_BASE + 0x526a6*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x526a7*4+0x02000000,0xb88b); +reg_write( DDR_REG_BASE + 0x526a8*4+0x02000000,0xc04c); +reg_write( DDR_REG_BASE + 0x526a9*4+0x02000000,0xd840); +reg_write( DDR_REG_BASE + 0x526aa*4+0x02000000,0xc04b); +reg_write( DDR_REG_BASE + 0x526ab*4+0x02000000,0xc014); +reg_write( DDR_REG_BASE + 0x526ac*4+0x02000000,0xc16e); +reg_write( DDR_REG_BASE + 0x526ad*4+0x02000000,0xc149); +reg_write( DDR_REG_BASE + 0x526ae*4+0x02000000,0xc046); +reg_write( DDR_REG_BASE + 0x526af*4+0x02000000,0xc013); +reg_write( DDR_REG_BASE + 0x526b0*4+0x02000000,0xc168); +reg_write( DDR_REG_BASE + 0x526b1*4+0x02000000,0xc147); +reg_write( DDR_REG_BASE + 0x526b2*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE + 0x526b3*4+0x02000000,0xc010); +reg_write( DDR_REG_BASE + 0x526b4*4+0x02000000,0xc19b); +reg_write( DDR_REG_BASE + 0x526b5*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE + 0x526b6*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE + 0x526b7*4+0x02000000,0xc084); +reg_write( DDR_REG_BASE + 0x526b8*4+0x02000000,0xe2a); +reg_write( DDR_REG_BASE + 0x526b9*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE + 0x526ba*4+0x02000000,0x1c28); +reg_write( DDR_REG_BASE + 0x526bb*4+0x02000000,0x3085); +reg_write( DDR_REG_BASE + 0x526bc*4+0x02000000,0xc084); +reg_write( DDR_REG_BASE + 0x526bd*4+0x02000000,0xc19b); +reg_write( DDR_REG_BASE + 0x526be*4+0x02000000,0xe1e); +reg_write( DDR_REG_BASE + 0x526bf*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE + 0x526c0*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x526c1*4+0x02000000,0xc011); +reg_write( DDR_REG_BASE + 0x526c2*4+0x02000000,0x8fa0); +reg_write( DDR_REG_BASE + 0x526c3*4+0x02000000,0x8fc1); +reg_write( DDR_REG_BASE + 0x526c4*4+0x02000000,0x842); +reg_write( DDR_REG_BASE + 0x526c5*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x526c6*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x526c7*4+0x02000000,0x265f); +reg_write( DDR_REG_BASE + 0x526c8*4+0x02000000,0x125b); +reg_write( DDR_REG_BASE + 0x526c9*4+0x02000000,0x255f); +reg_write( DDR_REG_BASE + 0x526ca*4+0x02000000,0x124d); +reg_write( DDR_REG_BASE + 0x526cb*4+0x02000000,0xc012); +reg_write( DDR_REG_BASE + 0x526cc*4+0x02000000,0xe807); +reg_write( DDR_REG_BASE + 0x526cd*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x526ce*4+0x02000000,0x25); +reg_write( DDR_REG_BASE + 0x526cf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x526d0*4+0x02000000,0xac2); +reg_write( DDR_REG_BASE + 0x526d1*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE + 0x526d2*4+0x02000000,0x740c); +reg_write( DDR_REG_BASE + 0x526d3*4+0x02000000,0x8fc0); +reg_write( DDR_REG_BASE + 0x526d4*4+0x02000000,0x2340); +reg_write( DDR_REG_BASE + 0x526d5*4+0x02000000,0x321b); +reg_write( DDR_REG_BASE + 0x526d6*4+0x02000000,0xe508); +reg_write( DDR_REG_BASE + 0x526d7*4+0x02000000,0xf02c); +reg_write( DDR_REG_BASE + 0x526d8*4+0x02000000,0xc013); +reg_write( DDR_REG_BASE + 0x526d9*4+0x02000000,0x20f5); +reg_write( DDR_REG_BASE + 0x526da*4+0x02000000,0x341); +reg_write( DDR_REG_BASE + 0x526db*4+0x02000000,0xc014); +reg_write( DDR_REG_BASE + 0x526dc*4+0x02000000,0x20f5); +reg_write( DDR_REG_BASE + 0x526dd*4+0x02000000,0x342); +reg_write( DDR_REG_BASE + 0x526de*4+0x02000000,0x6238); +reg_write( DDR_REG_BASE + 0x526df*4+0x02000000,0x7b1c); +reg_write( DDR_REG_BASE + 0x526e0*4+0x02000000,0xc015); +reg_write( DDR_REG_BASE + 0x526e1*4+0x02000000,0x2348); +reg_write( DDR_REG_BASE + 0x526e2*4+0x02000000,0xc); +reg_write( DDR_REG_BASE + 0x526e3*4+0x02000000,0x78b4); +reg_write( DDR_REG_BASE + 0x526e4*4+0x02000000,0xb080); +reg_write( DDR_REG_BASE + 0x526e5*4+0x02000000,0x4a30); +reg_write( DDR_REG_BASE + 0x526e6*4+0x02000000,0x2048); +reg_write( DDR_REG_BASE + 0x526e7*4+0x02000000,0xf); +reg_write( DDR_REG_BASE + 0x526e8*4+0x02000000,0xc012); +reg_write( DDR_REG_BASE + 0x526e9*4+0x02000000,0xe80d); +reg_write( DDR_REG_BASE + 0x526ea*4+0x02000000,0xc342); +reg_write( DDR_REG_BASE + 0x526eb*4+0x02000000,0xc241); +reg_write( DDR_REG_BASE + 0x526ec*4+0x02000000,0xc140); +reg_write( DDR_REG_BASE + 0x526ed*4+0x02000000,0x740c); +reg_write( DDR_REG_BASE + 0x526ee*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x526ef*4+0x02000000,0x27); +reg_write( DDR_REG_BASE + 0x526f0*4+0x02000000,0x5); +reg_write( DDR_REG_BASE + 0x526f1*4+0x02000000,0x42c1); +reg_write( DDR_REG_BASE + 0x526f2*4+0x02000000,0xa7e); +reg_write( DDR_REG_BASE + 0x526f3*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE + 0x526f4*4+0x02000000,0xdb08); +reg_write( DDR_REG_BASE + 0x526f5*4+0x02000000,0x78ee); +reg_write( DDR_REG_BASE + 0x526f6*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x526f7*4+0x02000000,0x207f); +reg_write( DDR_REG_BASE + 0x526f8*4+0x02000000,0x140); +reg_write( DDR_REG_BASE + 0x526f9*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x526fa*4+0x02000000,0x28); +reg_write( DDR_REG_BASE + 0x526fb*4+0x02000000,0x3); +reg_write( DDR_REG_BASE + 0x526fc*4+0x02000000,0x42c1); +reg_write( DDR_REG_BASE + 0x526fd*4+0x02000000,0xaf6); +reg_write( DDR_REG_BASE + 0x526fe*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x526ff*4+0x02000000,0xdb08); +reg_write( DDR_REG_BASE + 0x52700*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE + 0x52701*4+0x02000000,0xe509); +reg_write( DDR_REG_BASE + 0x52702*4+0x02000000,0xbad); +reg_write( DDR_REG_BASE + 0x52703*4+0x02000000,0xb345); +reg_write( DDR_REG_BASE + 0x52704*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x52705*4+0x02000000,0x7005); +reg_write( DDR_REG_BASE + 0x52706*4+0x02000000,0x900f); +reg_write( DDR_REG_BASE + 0x52707*4+0x02000000,0xe022); +reg_write( DDR_REG_BASE + 0x52708*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x52709*4+0x02000000,0x7005); +reg_write( DDR_REG_BASE + 0x5270a*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x5270b*4+0x02000000,0xe004); +reg_write( DDR_REG_BASE + 0x5270c*4+0x02000000,0x2480); +reg_write( DDR_REG_BASE + 0x5270d*4+0x02000000,0x3a03); +reg_write( DDR_REG_BASE + 0x5270e*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x5270f*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x52710*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x52711*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x52712*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x52713*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x52714*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x52715*4+0x02000000,0x2482); +reg_write( DDR_REG_BASE + 0x52716*4+0x02000000,0x3606); +reg_write( DDR_REG_BASE + 0x52717*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x52718*4+0x02000000,0xc350); +reg_write( DDR_REG_BASE + 0x52719*4+0x02000000,0xc257); +reg_write( DDR_REG_BASE + 0x5271a*4+0x02000000,0xc052); +reg_write( DDR_REG_BASE + 0x5271b*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x5271c*4+0x02000000,0x7344); +reg_write( DDR_REG_BASE + 0x5271d*4+0x02000000,0x900f); +reg_write( DDR_REG_BASE + 0x5271e*4+0x02000000,0xe022); +reg_write( DDR_REG_BASE + 0x5271f*4+0x02000000,0x206f); +reg_write( DDR_REG_BASE + 0x52720*4+0x02000000,0x43); +reg_write( DDR_REG_BASE + 0x52721*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x52722*4+0x02000000,0x9b); +reg_write( DDR_REG_BASE + 0x52723*4+0x02000000,0x8804); +reg_write( DDR_REG_BASE + 0x52724*4+0x02000000,0x4728); +reg_write( DDR_REG_BASE + 0x52725*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52726*4+0x02000000,0xc051); +reg_write( DDR_REG_BASE + 0x52727*4+0x02000000,0x9be); +reg_write( DDR_REG_BASE + 0x52728*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE + 0x52729*4+0x02000000,0xc012); +reg_write( DDR_REG_BASE + 0x5272a*4+0x02000000,0xc05a); +reg_write( DDR_REG_BASE + 0x5272b*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE + 0x5272c*4+0x02000000,0x3e40); +reg_write( DDR_REG_BASE + 0x5272d*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x5272e*4+0x02000000,0xa36); +reg_write( DDR_REG_BASE + 0x5272f*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x52730*4+0x02000000,0xdab4); +reg_write( DDR_REG_BASE + 0x52731*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE + 0x52732*4+0x02000000,0x3840); +reg_write( DDR_REG_BASE + 0x52733*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x52734*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52735*4+0x02000000,0x444); +reg_write( DDR_REG_BASE + 0x52736*4+0x02000000,0xa16); +reg_write( DDR_REG_BASE + 0x52737*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52738*4+0x02000000,0xda60); +reg_write( DDR_REG_BASE + 0x52739*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE + 0x5273a*4+0x02000000,0x3840); +reg_write( DDR_REG_BASE + 0x5273b*4+0x02000000,0xb16); +reg_write( DDR_REG_BASE + 0x5273c*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x5273d*4+0x02000000,0xd960); +reg_write( DDR_REG_BASE + 0x5273e*4+0x02000000,0x146c); +reg_write( DDR_REG_BASE + 0x5273f*4+0x02000000,0x3600); +reg_write( DDR_REG_BASE + 0x52740*4+0x02000000,0x71cd); +reg_write( DDR_REG_BASE + 0x52741*4+0x02000000,0xc04e); +reg_write( DDR_REG_BASE + 0x52742*4+0x02000000,0x146b); +reg_write( DDR_REG_BASE + 0x52743*4+0x02000000,0x3600); +reg_write( DDR_REG_BASE + 0x52744*4+0x02000000,0xc04f); +reg_write( DDR_REG_BASE + 0x52745*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE + 0x52746*4+0x02000000,0x6d21); +reg_write( DDR_REG_BASE + 0x52747*4+0x02000000,0x259a); +reg_write( DDR_REG_BASE + 0x52748*4+0x02000000,0x1008); +reg_write( DDR_REG_BASE + 0x52749*4+0x02000000,0x42c1); +reg_write( DDR_REG_BASE + 0x5274a*4+0x02000000,0xe805); +reg_write( DDR_REG_BASE + 0x5274b*4+0x02000000,0xb861); +reg_write( DDR_REG_BASE + 0x5274c*4+0x02000000,0x8ff); +reg_write( DDR_REG_BASE + 0x5274d*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE + 0x5274e*4+0x02000000,0x7a5b); +reg_write( DDR_REG_BASE + 0x5274f*4+0x02000000,0x2505); +reg_write( DDR_REG_BASE + 0x52750*4+0x02000000,0x1f80); +reg_write( DDR_REG_BASE + 0x52751*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x52752*4+0x02000000,0xe0c4); +reg_write( DDR_REG_BASE + 0x52753*4+0x02000000,0xb040); +reg_write( DDR_REG_BASE + 0x52754*4+0x02000000,0x4528); +reg_write( DDR_REG_BASE + 0x52755*4+0x02000000,0xde5); +reg_write( DDR_REG_BASE + 0x52756*4+0x02000000,0x9234); +reg_write( DDR_REG_BASE + 0x52757*4+0x02000000,0x2544); +reg_write( DDR_REG_BASE + 0x52758*4+0x02000000,0x17c0); +reg_write( DDR_REG_BASE + 0x52759*4+0x02000000,0xc012); +reg_write( DDR_REG_BASE + 0x5275a*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE + 0x5275b*4+0x02000000,0x7c1); +reg_write( DDR_REG_BASE + 0x5275c*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE + 0x5275d*4+0x02000000,0xe906); +reg_write( DDR_REG_BASE + 0x5275e*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE + 0x5275f*4+0x02000000,0x901); +reg_write( DDR_REG_BASE + 0x52760*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x52761*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x52762*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x52763*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52764*4+0x02000000,0x91a); +reg_write( DDR_REG_BASE + 0x52765*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x52766*4+0x02000000,0xc059); +reg_write( DDR_REG_BASE + 0x52767*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52768*4+0x02000000,0xc06d); +reg_write( DDR_REG_BASE + 0x52769*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x5276a*4+0x02000000,0xc04c); +reg_write( DDR_REG_BASE + 0x5276b*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x5276c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5276d*4+0x02000000,0xf00); +reg_write( DDR_REG_BASE + 0x5276e*4+0x02000000,0xc04b); +reg_write( DDR_REG_BASE + 0x5276f*4+0x02000000,0xd840); +reg_write( DDR_REG_BASE + 0x52770*4+0x02000000,0xc04a); +reg_write( DDR_REG_BASE + 0x52771*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE + 0x52772*4+0x02000000,0x3e40); +reg_write( DDR_REG_BASE + 0x52773*4+0x02000000,0xc046); +reg_write( DDR_REG_BASE + 0x52774*4+0x02000000,0xc00e); +reg_write( DDR_REG_BASE + 0x52775*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x52776*4+0x02000000,0x708c); +reg_write( DDR_REG_BASE + 0x52777*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52778*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE + 0x52779*4+0x02000000,0xc748); +reg_write( DDR_REG_BASE + 0x5277a*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE + 0x5277b*4+0x02000000,0xc00f); +reg_write( DDR_REG_BASE + 0x5277c*4+0x02000000,0x1c1c); +reg_write( DDR_REG_BASE + 0x5277d*4+0x02000000,0x3183); +reg_write( DDR_REG_BASE + 0x5277e*4+0x02000000,0x1c24); +reg_write( DDR_REG_BASE + 0x5277f*4+0x02000000,0x3384); +reg_write( DDR_REG_BASE + 0x52780*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE + 0x52781*4+0x02000000,0xc012); +reg_write( DDR_REG_BASE + 0x52782*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE + 0x52783*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x52784*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52785*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE + 0x52786*4+0x02000000,0x8821); +reg_write( DDR_REG_BASE + 0x52787*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52788*4+0x02000000,0xf00a); +reg_write( DDR_REG_BASE + 0x52789*4+0x02000000,0x205a); +reg_write( DDR_REG_BASE + 0x5278a*4+0x02000000,0x402); +reg_write( DDR_REG_BASE + 0x5278b*4+0x02000000,0x7074); +reg_write( DDR_REG_BASE + 0x5278c*4+0x02000000,0xc39d); +reg_write( DDR_REG_BASE + 0x5278d*4+0x02000000,0x22ce); +reg_write( DDR_REG_BASE + 0x5278e*4+0x02000000,0x21); +reg_write( DDR_REG_BASE + 0x5278f*4+0x02000000,0x631b); +reg_write( DDR_REG_BASE + 0x52790*4+0x02000000,0xab40); +reg_write( DDR_REG_BASE + 0x52791*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE + 0x52792*4+0x02000000,0x8ef); +reg_write( DDR_REG_BASE + 0x52793*4+0x02000000,0x8134); +reg_write( DDR_REG_BASE + 0x52794*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE + 0x52795*4+0x02000000,0x43); +reg_write( DDR_REG_BASE + 0x52796*4+0x02000000,0x202f); +reg_write( DDR_REG_BASE + 0x52797*4+0x02000000,0x6c2); +reg_write( DDR_REG_BASE + 0x52798*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x52799*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x5279a*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x5279b*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x5279c*4+0x02000000,0x781d); +reg_write( DDR_REG_BASE + 0x5279d*4+0x02000000,0x716f); +reg_write( DDR_REG_BASE + 0x5279e*4+0x02000000,0x2306); +reg_write( DDR_REG_BASE + 0x5279f*4+0x02000000,0x3000); +reg_write( DDR_REG_BASE + 0x527a0*4+0x02000000,0xc055); +reg_write( DDR_REG_BASE + 0x527a1*4+0x02000000,0xc011); +reg_write( DDR_REG_BASE + 0x527a2*4+0x02000000,0x245f); +reg_write( DDR_REG_BASE + 0x527a3*4+0x02000000,0x124e); +reg_write( DDR_REG_BASE + 0x527a4*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x527a5*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x527a6*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x527a7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x527a8*4+0x02000000,0xc05b); +reg_write( DDR_REG_BASE + 0x527a9*4+0x02000000,0x215f); +reg_write( DDR_REG_BASE + 0x527aa*4+0x02000000,0x240); +reg_write( DDR_REG_BASE + 0x527ab*4+0x02000000,0xe008); +reg_write( DDR_REG_BASE + 0x527ac*4+0x02000000,0xc058); +reg_write( DDR_REG_BASE + 0x527ad*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x527ae*4+0x02000000,0xf0b1); +reg_write( DDR_REG_BASE + 0x527af*4+0x02000000,0xcaa); +reg_write( DDR_REG_BASE + 0x527b0*4+0x02000000,0xff2f); +reg_write( DDR_REG_BASE + 0x527b1*4+0x02000000,0xc083); +reg_write( DDR_REG_BASE + 0x527b2*4+0x02000000,0x41c1); +reg_write( DDR_REG_BASE + 0x527b3*4+0x02000000,0xf012); +reg_write( DDR_REG_BASE + 0x527b4*4+0x02000000,0xc20f); +reg_write( DDR_REG_BASE + 0x527b5*4+0x02000000,0x7a34); +reg_write( DDR_REG_BASE + 0x527b6*4+0x02000000,0x9200); +reg_write( DDR_REG_BASE + 0x527b7*4+0x02000000,0xe88d); +reg_write( DDR_REG_BASE + 0x527b8*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE + 0x527b9*4+0x02000000,0x3e40); +reg_write( DDR_REG_BASE + 0x527ba*4+0x02000000,0x20f4); +reg_write( DDR_REG_BASE + 0x527bb*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x527bc*4+0x02000000,0x2042); +reg_write( DDR_REG_BASE + 0x527bd*4+0x02000000,0x800); +reg_write( DDR_REG_BASE + 0x527be*4+0x02000000,0x262f); +reg_write( DDR_REG_BASE + 0x527bf*4+0x02000000,0xf006); +reg_write( DDR_REG_BASE + 0x527c0*4+0x02000000,0x6); +reg_write( DDR_REG_BASE + 0x527c1*4+0x02000000,0x3); +reg_write( DDR_REG_BASE + 0x527c2*4+0x02000000,0xb200); +reg_write( DDR_REG_BASE + 0x527c3*4+0x02000000,0x7124); +reg_write( DDR_REG_BASE + 0x527c4*4+0x02000000,0xc018); +reg_write( DDR_REG_BASE + 0x527c5*4+0x02000000,0x8e1); +reg_write( DDR_REG_BASE + 0x527c6*4+0x02000000,0x8065); +reg_write( DDR_REG_BASE + 0x527c7*4+0x02000000,0xc083); +reg_write( DDR_REG_BASE + 0x527c8*4+0x02000000,0xe92); +reg_write( DDR_REG_BASE + 0x527c9*4+0x02000000,0xff0f); +reg_write( DDR_REG_BASE + 0x527ca*4+0x02000000,0x41c1); +reg_write( DDR_REG_BASE + 0x527cb*4+0x02000000,0xf010); +reg_write( DDR_REG_BASE + 0x527cc*4+0x02000000,0xc20e); +reg_write( DDR_REG_BASE + 0x527cd*4+0x02000000,0x7a34); +reg_write( DDR_REG_BASE + 0x527ce*4+0x02000000,0x9200); +reg_write( DDR_REG_BASE + 0x527cf*4+0x02000000,0x817); +reg_write( DDR_REG_BASE + 0x527d0*4+0x02000000,0xff1); +reg_write( DDR_REG_BASE + 0x527d1*4+0x02000000,0x2455); +reg_write( DDR_REG_BASE + 0x527d2*4+0x02000000,0x3e40); +reg_write( DDR_REG_BASE + 0x527d3*4+0x02000000,0x20f5); +reg_write( DDR_REG_BASE + 0x527d4*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x527d5*4+0x02000000,0x80b); +reg_write( DDR_REG_BASE + 0x527d6*4+0x02000000,0x832); +reg_write( DDR_REG_BASE + 0x527d7*4+0x02000000,0xe020); +reg_write( DDR_REG_BASE + 0x527d8*4+0x02000000,0xb200); +reg_write( DDR_REG_BASE + 0x527d9*4+0x02000000,0x7124); +reg_write( DDR_REG_BASE + 0x527da*4+0x02000000,0xc018); +reg_write( DDR_REG_BASE + 0x527db*4+0x02000000,0x8e5); +reg_write( DDR_REG_BASE + 0x527dc*4+0x02000000,0x8065); +reg_write( DDR_REG_BASE + 0x527dd*4+0x02000000,0x706f); +reg_write( DDR_REG_BASE + 0x527de*4+0x02000000,0xc013); +reg_write( DDR_REG_BASE + 0x527df*4+0x02000000,0xc651); +reg_write( DDR_REG_BASE + 0x527e0*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x527e1*4+0x02000000,0xc05c); +reg_write( DDR_REG_BASE + 0x527e2*4+0x02000000,0x7314); +reg_write( DDR_REG_BASE + 0x527e3*4+0x02000000,0xc015); +reg_write( DDR_REG_BASE + 0x527e4*4+0x02000000,0x20ca); +reg_write( DDR_REG_BASE + 0x527e5*4+0x02000000,0x61); +reg_write( DDR_REG_BASE + 0x527e6*4+0x02000000,0xc055); +reg_write( DDR_REG_BASE + 0x527e7*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x527e8*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x527e9*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x527ea*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE + 0x527eb*4+0x02000000,0xc054); +reg_write( DDR_REG_BASE + 0x527ec*4+0x02000000,0xf064); +reg_write( DDR_REG_BASE + 0x527ed*4+0x02000000,0x722c); +reg_write( DDR_REG_BASE + 0x527ee*4+0x02000000,0x70ed); +reg_write( DDR_REG_BASE + 0x527ef*4+0x02000000,0xf05d); +reg_write( DDR_REG_BASE + 0x527f0*4+0x02000000,0xc011); +reg_write( DDR_REG_BASE + 0x527f1*4+0x02000000,0xf15); +reg_write( DDR_REG_BASE + 0x527f2*4+0x02000000,0x1231); +reg_write( DDR_REG_BASE + 0x527f3*4+0x02000000,0x7a10); +reg_write( DDR_REG_BASE + 0x527f4*4+0x02000000,0xc010); +reg_write( DDR_REG_BASE + 0x527f5*4+0x02000000,0x7854); +reg_write( DDR_REG_BASE + 0x527f6*4+0x02000000,0x10f0); +reg_write( DDR_REG_BASE + 0x527f7*4+0x02000000,0x8102); +reg_write( DDR_REG_BASE + 0x527f8*4+0x02000000,0xb040); +reg_write( DDR_REG_BASE + 0x527f9*4+0x02000000,0xf04f); +reg_write( DDR_REG_BASE + 0x527fa*4+0x02000000,0xc00f); +reg_write( DDR_REG_BASE + 0x527fb*4+0x02000000,0x20f5); +reg_write( DDR_REG_BASE + 0x527fc*4+0x02000000,0x83); +reg_write( DDR_REG_BASE + 0x527fd*4+0x02000000,0xc00e); +reg_write( DDR_REG_BASE + 0x527fe*4+0x02000000,0x20f5); +reg_write( DDR_REG_BASE + 0x527ff*4+0x02000000,0x8c); +reg_write( DDR_REG_BASE + 0x52800*4+0x02000000,0x4c70); +reg_write( DDR_REG_BASE + 0x52801*4+0x02000000,0x2048); +reg_write( DDR_REG_BASE + 0x52802*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52803*4+0x02000000,0x7d0e); +reg_write( DDR_REG_BASE + 0x52804*4+0x02000000,0xd77); +reg_write( DDR_REG_BASE + 0x52805*4+0x02000000,0x11b3); +reg_write( DDR_REG_BASE + 0x52806*4+0x02000000,0x43a9); +reg_write( DDR_REG_BASE + 0x52807*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE + 0x52808*4+0x02000000,0x203c); +reg_write( DDR_REG_BASE + 0x52809*4+0x02000000,0x3cd); +reg_write( DDR_REG_BASE + 0x5280a*4+0x02000000,0x97b); +reg_write( DDR_REG_BASE + 0x5280b*4+0x02000000,0x360); +reg_write( DDR_REG_BASE + 0x5280c*4+0x02000000,0x43e1); +reg_write( DDR_REG_BASE + 0x5280d*4+0x02000000,0xc015); +reg_write( DDR_REG_BASE + 0x5280e*4+0x02000000,0xc216); +reg_write( DDR_REG_BASE + 0x5280f*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x52810*4+0x02000000,0x1c); +reg_write( DDR_REG_BASE + 0x52811*4+0x02000000,0x3); +reg_write( DDR_REG_BASE + 0x52812*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x52813*4+0x02000000,0x2078); +reg_write( DDR_REG_BASE + 0x52814*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52815*4+0x02000000,0x8c6); +reg_write( DDR_REG_BASE + 0x52816*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52817*4+0x02000000,0x1c00); +reg_write( DDR_REG_BASE + 0x52818*4+0x02000000,0x32c0); +reg_write( DDR_REG_BASE + 0x52819*4+0x02000000,0x40e1); +reg_write( DDR_REG_BASE + 0x5281a*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x5281b*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5281c*4+0x02000000,0x716f); +reg_write( DDR_REG_BASE + 0x5281d*4+0x02000000,0x2004); +reg_write( DDR_REG_BASE + 0x5281e*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x5281f*4+0x02000000,0x37fe); +reg_write( DDR_REG_BASE + 0x52820*4+0x02000000,0xff00); +reg_write( DDR_REG_BASE + 0x52821*4+0x02000000,0xc01a); +reg_write( DDR_REG_BASE + 0x52822*4+0x02000000,0x2055); +reg_write( DDR_REG_BASE + 0x52823*4+0x02000000,0x8c2); +reg_write( DDR_REG_BASE + 0x52824*4+0x02000000,0xc01b); +reg_write( DDR_REG_BASE + 0x52825*4+0x02000000,0x7a05); +reg_write( DDR_REG_BASE + 0x52826*4+0x02000000,0xc016); +reg_write( DDR_REG_BASE + 0x52827*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x52828*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x52829*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5282a*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x5282b*4+0x02000000,0x7845); +reg_write( DDR_REG_BASE + 0x5282c*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x5282d*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x5282e*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x5282f*4+0x02000000,0xf82); +reg_write( DDR_REG_BASE + 0x52830*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x52831*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52832*4+0x02000000,0x9260); +reg_write( DDR_REG_BASE + 0x52833*4+0x02000000,0xc01c); +reg_write( DDR_REG_BASE + 0x52834*4+0x02000000,0xc19d); +reg_write( DDR_REG_BASE + 0x52835*4+0x02000000,0x2133); +reg_write( DDR_REG_BASE + 0x52836*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52837*4+0x02000000,0x41a1); +reg_write( DDR_REG_BASE + 0x52838*4+0x02000000,0x6078); +reg_write( DDR_REG_BASE + 0x52839*4+0x02000000,0x780e); +reg_write( DDR_REG_BASE + 0x5283a*4+0x02000000,0x2048); +reg_write( DDR_REG_BASE + 0x5283b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5283c*4+0x02000000,0x2049); +reg_write( DDR_REG_BASE + 0x5283d*4+0x02000000,0x800); +reg_write( DDR_REG_BASE + 0x5283e*4+0x02000000,0xf008); +reg_write( DDR_REG_BASE + 0x5283f*4+0x02000000,0xc010); +reg_write( DDR_REG_BASE + 0x52840*4+0x02000000,0x2014); +reg_write( DDR_REG_BASE + 0x52841*4+0x02000000,0x82); +reg_write( DDR_REG_BASE + 0x52842*4+0x02000000,0x6478); +reg_write( DDR_REG_BASE + 0x52843*4+0x02000000,0x781c); +reg_write( DDR_REG_BASE + 0x52844*4+0x02000000,0x2048); +reg_write( DDR_REG_BASE + 0x52845*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52846*4+0x02000000,0xb200); +reg_write( DDR_REG_BASE + 0x52847*4+0x02000000,0xc011); +reg_write( DDR_REG_BASE + 0x52848*4+0x02000000,0x71e5); +reg_write( DDR_REG_BASE + 0x52849*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE + 0x5284a*4+0x02000000,0xc051); +reg_write( DDR_REG_BASE + 0x5284b*4+0x02000000,0xf4d); +reg_write( DDR_REG_BASE + 0x5284c*4+0x02000000,0x9254); +reg_write( DDR_REG_BASE + 0x5284d*4+0x02000000,0xc014); +reg_write( DDR_REG_BASE + 0x5284e*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE + 0x5284f*4+0x02000000,0xc054); +reg_write( DDR_REG_BASE + 0x52850*4+0x02000000,0xc014); +reg_write( DDR_REG_BASE + 0x52851*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x52852*4+0x02000000,0xc056); +reg_write( DDR_REG_BASE + 0x52853*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x52854*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52855*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE + 0x52856*4+0x02000000,0x8821); +reg_write( DDR_REG_BASE + 0x52857*4+0x02000000,0xc016); +reg_write( DDR_REG_BASE + 0x52858*4+0x02000000,0x92b); +reg_write( DDR_REG_BASE + 0x52859*4+0x02000000,0x8025); +reg_write( DDR_REG_BASE + 0x5285a*4+0x02000000,0x7077); +reg_write( DDR_REG_BASE + 0x5285b*4+0x02000000,0xd64); +reg_write( DDR_REG_BASE + 0x5285c*4+0x02000000,0xfec2); +reg_write( DDR_REG_BASE + 0x5285d*4+0x02000000,0xc013); +reg_write( DDR_REG_BASE + 0x5285e*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE + 0x5285f*4+0x02000000,0xc053); +reg_write( DDR_REG_BASE + 0x52860*4+0x02000000,0x7077); +reg_write( DDR_REG_BASE + 0x52861*4+0x02000000,0xf54f); +reg_write( DDR_REG_BASE + 0x52862*4+0x02000000,0xc017); +reg_write( DDR_REG_BASE + 0x52863*4+0x02000000,0xe837); +reg_write( DDR_REG_BASE + 0x52864*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x52865*4+0x02000000,0x1d); +reg_write( DDR_REG_BASE + 0x52866*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52867*4+0x02000000,0xf96); +reg_write( DDR_REG_BASE + 0x52868*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x52869*4+0x02000000,0x740c); +reg_write( DDR_REG_BASE + 0x5286a*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x5286b*4+0x02000000,0x709b); +reg_write( DDR_REG_BASE + 0x5286c*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x5286d*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE + 0x5286e*4+0x02000000,0xf022); +reg_write( DDR_REG_BASE + 0x5286f*4+0x02000000,0xd39); +reg_write( DDR_REG_BASE + 0x52870*4+0x02000000,0x1230); +reg_write( DDR_REG_BASE + 0x52871*4+0x02000000,0x78db); +reg_write( DDR_REG_BASE + 0x52872*4+0x02000000,0x2004); +reg_write( DDR_REG_BASE + 0x52873*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x52874*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x52875*4+0x02000000,0xfffe); +reg_write( DDR_REG_BASE + 0x52876*4+0x02000000,0xc00f); +reg_write( DDR_REG_BASE + 0x52877*4+0x02000000,0x2035); +reg_write( DDR_REG_BASE + 0x52878*4+0x02000000,0x42); +reg_write( DDR_REG_BASE + 0x52879*4+0x02000000,0xc00e); +reg_write( DDR_REG_BASE + 0x5287a*4+0x02000000,0x2035); +reg_write( DDR_REG_BASE + 0x5287b*4+0x02000000,0x43); +reg_write( DDR_REG_BASE + 0x5287c*4+0x02000000,0xc010); +reg_write( DDR_REG_BASE + 0x5287d*4+0x02000000,0x2035); +reg_write( DDR_REG_BASE + 0x5287e*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x5287f*4+0x02000000,0xc341); +reg_write( DDR_REG_BASE + 0x52880*4+0x02000000,0xc240); +reg_write( DDR_REG_BASE + 0x52881*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x52882*4+0x02000000,0x740c); +reg_write( DDR_REG_BASE + 0x52883*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x52884*4+0x02000000,0x1f); +reg_write( DDR_REG_BASE + 0x52885*4+0x02000000,0x5); +reg_write( DDR_REG_BASE + 0x52886*4+0x02000000,0x42e1); +reg_write( DDR_REG_BASE + 0x52887*4+0x02000000,0xf56); +reg_write( DDR_REG_BASE + 0x52888*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x52889*4+0x02000000,0x43a1); +reg_write( DDR_REG_BASE + 0x5288a*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE + 0x5288b*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE + 0x5288c*4+0x02000000,0xdc7); +reg_write( DDR_REG_BASE + 0x5288d*4+0x02000000,0x9254); +reg_write( DDR_REG_BASE + 0x5288e*4+0x02000000,0x7167); +reg_write( DDR_REG_BASE + 0x5288f*4+0x02000000,0x7ed0); +reg_write( DDR_REG_BASE + 0x52890*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x52891*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52892*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE + 0x52893*4+0x02000000,0x8801); +reg_write( DDR_REG_BASE + 0x52894*4+0x02000000,0x272f); +reg_write( DDR_REG_BASE + 0x52895*4+0x02000000,0x16c7); +reg_write( DDR_REG_BASE + 0x52896*4+0x02000000,0x8ed); +reg_write( DDR_REG_BASE + 0x52897*4+0x02000000,0x83e5); +reg_write( DDR_REG_BASE + 0x52898*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x52899*4+0x02000000,0xc9a); +reg_write( DDR_REG_BASE + 0x5289a*4+0x02000000,0xfeaf); +reg_write( DDR_REG_BASE + 0x5289b*4+0x02000000,0xc019); +reg_write( DDR_REG_BASE + 0x5289c*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x5289d*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x5289e*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x5289f*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x528a0*4+0x02000000,0xe004); +reg_write( DDR_REG_BASE + 0x528a1*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x528a2*4+0x02000000,0x7082); +reg_write( DDR_REG_BASE + 0x528a3*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x528a4*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE + 0x528a5*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x528a6*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x528a7*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE + 0x528a8*4+0x02000000,0x8821); +reg_write( DDR_REG_BASE + 0x528a9*4+0x02000000,0x225f); +reg_write( DDR_REG_BASE + 0x528aa*4+0x02000000,0x243); +reg_write( DDR_REG_BASE + 0x528ab*4+0x02000000,0xf02e); +reg_write( DDR_REG_BASE + 0x528ac*4+0x02000000,0x260a); +reg_write( DDR_REG_BASE + 0x528ad*4+0x02000000,0x30c0); +reg_write( DDR_REG_BASE + 0x528ae*4+0x02000000,0xf026); +reg_write( DDR_REG_BASE + 0x528af*4+0x02000000,0xc010); +reg_write( DDR_REG_BASE + 0x528b0*4+0x02000000,0x20f5); +reg_write( DDR_REG_BASE + 0x528b1*4+0x02000000,0x78e); +reg_write( DDR_REG_BASE + 0x528b2*4+0x02000000,0x2640); +reg_write( DDR_REG_BASE + 0x528b3*4+0x02000000,0x305e); +reg_write( DDR_REG_BASE + 0x528b4*4+0x02000000,0x78dc); +reg_write( DDR_REG_BASE + 0x528b5*4+0x02000000,0x781c); +reg_write( DDR_REG_BASE + 0x528b6*4+0x02000000,0x781c); +reg_write( DDR_REG_BASE + 0x528b7*4+0x02000000,0x781c); +reg_write( DDR_REG_BASE + 0x528b8*4+0x02000000,0x4508); +reg_write( DDR_REG_BASE + 0x528b9*4+0x02000000,0xd81b); +reg_write( DDR_REG_BASE + 0x528ba*4+0x02000000,0xb861); +reg_write( DDR_REG_BASE + 0x528bb*4+0x02000000,0x801); +reg_write( DDR_REG_BASE + 0x528bc*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x528bd*4+0x02000000,0x7dbd); +reg_write( DDR_REG_BASE + 0x528be*4+0x02000000,0x66b8); +reg_write( DDR_REG_BASE + 0x528bf*4+0x02000000,0xb8c4); +reg_write( DDR_REG_BASE + 0x528c0*4+0x02000000,0x48b5); +reg_write( DDR_REG_BASE + 0x528c1*4+0x02000000,0x2e44); +reg_write( DDR_REG_BASE + 0x528c2*4+0x02000000,0x1800); +reg_write( DDR_REG_BASE + 0x528c3*4+0x02000000,0x6cc1); +reg_write( DDR_REG_BASE + 0x528c4*4+0x02000000,0x249a); +reg_write( DDR_REG_BASE + 0x528c5*4+0x02000000,0x1008); +reg_write( DDR_REG_BASE + 0x528c6*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x528c7*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x528c8*4+0x02000000,0x7d05); +reg_write( DDR_REG_BASE + 0x528c9*4+0x02000000,0x221a); +reg_write( DDR_REG_BASE + 0x528ca*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x528cb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x528cc*4+0x02000000,0x2000); +reg_write( DDR_REG_BASE + 0x528cd*4+0x02000000,0x7885); +reg_write( DDR_REG_BASE + 0x528ce*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x528cf*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x528d0*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x528d1*4+0x02000000,0x64); +reg_write( DDR_REG_BASE + 0x528d2*4+0x02000000,0xb0a0); +reg_write( DDR_REG_BASE + 0x528d3*4+0x02000000,0x44c9); +reg_write( DDR_REG_BASE + 0x528d4*4+0x02000000,0xcb7); +reg_write( DDR_REG_BASE + 0x528d5*4+0x02000000,0x9214); +reg_write( DDR_REG_BASE + 0x528d6*4+0x02000000,0x7144); +reg_write( DDR_REG_BASE + 0x528d7*4+0x02000000,0xe309); +reg_write( DDR_REG_BASE + 0x528d8*4+0x02000000,0x9a9); +reg_write( DDR_REG_BASE + 0x528d9*4+0x02000000,0x80a5); +reg_write( DDR_REG_BASE + 0x528da*4+0x02000000,0x708d); +reg_write( DDR_REG_BASE + 0x528db*4+0x02000000,0xc00e); +reg_write( DDR_REG_BASE + 0x528dc*4+0x02000000,0xc117); +reg_write( DDR_REG_BASE + 0x528dd*4+0x02000000,0xc210); +reg_write( DDR_REG_BASE + 0x528de*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x528df*4+0x02000000,0xc012); +reg_write( DDR_REG_BASE + 0x528e0*4+0x02000000,0x95e); +reg_write( DDR_REG_BASE + 0x528e1*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x528e2*4+0x02000000,0xc30f); +reg_write( DDR_REG_BASE + 0x528e3*4+0x02000000,0x2480); +reg_write( DDR_REG_BASE + 0x528e4*4+0x02000000,0x3606); +reg_write( DDR_REG_BASE + 0x528e5*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x528e6*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x528e7*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x528e8*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x528e9*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x528ea*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x528eb*4+0x02000000,0xc1a8); +reg_write( DDR_REG_BASE + 0x528ec*4+0x02000000,0xfca); +reg_write( DDR_REG_BASE + 0x528ed*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE + 0x528ee*4+0x02000000,0x4708); +reg_write( DDR_REG_BASE + 0x528ef*4+0x02000000,0x83e); +reg_write( DDR_REG_BASE + 0x528f0*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE + 0x528f1*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE + 0x528f2*4+0x02000000,0x896); +reg_write( DDR_REG_BASE + 0x528f3*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE + 0x528f4*4+0x02000000,0xc047); +reg_write( DDR_REG_BASE + 0x528f5*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x528f6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x528f7*4+0x02000000,0xcccc); +reg_write( DDR_REG_BASE + 0x528f8*4+0x02000000,0x4608); +reg_write( DDR_REG_BASE + 0x528f9*4+0x02000000,0x706c); +reg_write( DDR_REG_BASE + 0x528fa*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x528fb*4+0x02000000,0x4220); +reg_write( DDR_REG_BASE + 0x528fc*4+0x02000000,0x4568); +reg_write( DDR_REG_BASE + 0x528fd*4+0x02000000,0x94a); +reg_write( DDR_REG_BASE + 0x528fe*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE + 0x528ff*4+0x02000000,0xc340); +reg_write( DDR_REG_BASE + 0x52900*4+0x02000000,0xd808); +reg_write( DDR_REG_BASE + 0x52901*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52902*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x52903*4+0x02000000,0x706c); +reg_write( DDR_REG_BASE + 0x52904*4+0x02000000,0x93a); +reg_write( DDR_REG_BASE + 0x52905*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE + 0x52906*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x52907*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x52908*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x52909*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE + 0x5290a*4+0x02000000,0xc105); +reg_write( DDR_REG_BASE + 0x5290b*4+0x02000000,0x9fe); +reg_write( DDR_REG_BASE + 0x5290c*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x5290d*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x5290e*4+0x02000000,0x1200); +reg_write( DDR_REG_BASE + 0x5290f*4+0x02000000,0x3083); +reg_write( DDR_REG_BASE + 0x52910*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52911*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52912*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x52913*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x52914*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x52915*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x52916*4+0x02000000,0xabe); +reg_write( DDR_REG_BASE + 0x52917*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x52918*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x52919*4+0x02000000,0x7fef); +reg_write( DDR_REG_BASE + 0x5291a*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x5291b*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x5291c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5291d*4+0x02000000,0x4400); +reg_write( DDR_REG_BASE + 0x5291e*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x5291f*4+0x02000000,0xdb7c); +reg_write( DDR_REG_BASE + 0x52920*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE + 0x52921*4+0x02000000,0x3041); +reg_write( DDR_REG_BASE + 0x52922*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE + 0x52923*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x52924*4+0x02000000,0xaa2); +reg_write( DDR_REG_BASE + 0x52925*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x52926*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x52927*4+0x02000000,0xca08); +reg_write( DDR_REG_BASE + 0x52928*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x52929*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5292a*4+0x02000000,0x7500); +reg_write( DDR_REG_BASE + 0x5292b*4+0x02000000,0x724c); +reg_write( DDR_REG_BASE + 0x5292c*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE + 0x5292d*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x5292e*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x5292f*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE + 0x52930*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x52931*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x52932*4+0x02000000,0xa86); +reg_write( DDR_REG_BASE + 0x52933*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x52934*4+0x02000000,0x4338); +reg_write( DDR_REG_BASE + 0x52935*4+0x02000000,0xb46); +reg_write( DDR_REG_BASE + 0x52936*4+0x02000000,0xfe0f); +reg_write( DDR_REG_BASE + 0x52937*4+0x02000000,0x2644); +reg_write( DDR_REG_BASE + 0x52938*4+0x02000000,0x1040); +reg_write( DDR_REG_BASE + 0x52939*4+0x02000000,0x60d8); +reg_write( DDR_REG_BASE + 0x5293a*4+0x02000000,0xe010); +reg_write( DDR_REG_BASE + 0x5293b*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x5293c*4+0x02000000,0xc046); +reg_write( DDR_REG_BASE + 0x5293d*4+0x02000000,0xc306); +reg_write( DDR_REG_BASE + 0x5293e*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x5293f*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE + 0x52940*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x52941*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x52942*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x52943*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x52944*4+0x02000000,0xa62); +reg_write( DDR_REG_BASE + 0x52945*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x52946*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x52947*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52948*4+0x02000000,0xa1a); +reg_write( DDR_REG_BASE + 0x52949*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x5294a*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x5294b*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x5294c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5294d*4+0x02000000,0x3333); +reg_write( DDR_REG_BASE + 0x5294e*4+0x02000000,0x43c3); +reg_write( DDR_REG_BASE + 0x5294f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52950*4+0x02000000,0x9999); +reg_write( DDR_REG_BASE + 0x52951*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x52952*4+0x02000000,0x4220); +reg_write( DDR_REG_BASE + 0x52953*4+0x02000000,0x89e); +reg_write( DDR_REG_BASE + 0x52954*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE + 0x52955*4+0x02000000,0xc340); +reg_write( DDR_REG_BASE + 0x52956*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x52957*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52958*4+0x02000000,0xaaaa); +reg_write( DDR_REG_BASE + 0x52959*4+0x02000000,0xd808); +reg_write( DDR_REG_BASE + 0x5295a*4+0x02000000,0x4220); +reg_write( DDR_REG_BASE + 0x5295b*4+0x02000000,0x706c); +reg_write( DDR_REG_BASE + 0x5295c*4+0x02000000,0x88a); +reg_write( DDR_REG_BASE + 0x5295d*4+0x02000000,0xfe6f); +reg_write( DDR_REG_BASE + 0x5295e*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x5295f*4+0x02000000,0xc105); +reg_write( DDR_REG_BASE + 0x52960*4+0x02000000,0x952); +reg_write( DDR_REG_BASE + 0x52961*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x52962*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52963*4+0x02000000,0x1200); +reg_write( DDR_REG_BASE + 0x52964*4+0x02000000,0x3083); +reg_write( DDR_REG_BASE + 0x52965*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52966*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52967*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x52968*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x52969*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x5296a*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x5296b*4+0x02000000,0xa16); +reg_write( DDR_REG_BASE + 0x5296c*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x5296d*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x5296e*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE + 0x5296f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52970*4+0x02000000,0x4400); +reg_write( DDR_REG_BASE + 0x52971*4+0x02000000,0xbeaa); +reg_write( DDR_REG_BASE + 0x52972*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52973*4+0x02000000,0x41c1); +reg_write( DDR_REG_BASE + 0x52974*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x52975*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE + 0x52976*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x52977*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x52978*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x52979*4+0x02000000,0x9fa); +reg_write( DDR_REG_BASE + 0x5297a*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x5297b*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x5297c*4+0x02000000,0xca08); +reg_write( DDR_REG_BASE + 0x5297d*4+0x02000000,0x4163); +reg_write( DDR_REG_BASE + 0x5297e*4+0x02000000,0x724c); +reg_write( DDR_REG_BASE + 0x5297f*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE + 0x52980*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52981*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x52982*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE + 0x52983*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x52984*4+0x02000000,0x9e2); +reg_write( DDR_REG_BASE + 0x52985*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x52986*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x52987*4+0x02000000,0xaa2); +reg_write( DDR_REG_BASE + 0x52988*4+0x02000000,0xfe0f); +reg_write( DDR_REG_BASE + 0x52989*4+0x02000000,0xc306); +reg_write( DDR_REG_BASE + 0x5298a*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x5298b*4+0x02000000,0x41c1); +reg_write( DDR_REG_BASE + 0x5298c*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x5298d*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x5298e*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE + 0x5298f*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x52990*4+0x02000000,0x9ca); +reg_write( DDR_REG_BASE + 0x52991*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x52992*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x52993*4+0x02000000,0xca08); +reg_write( DDR_REG_BASE + 0x52994*4+0x02000000,0x2350); +reg_write( DDR_REG_BASE + 0x52995*4+0x02000000,0x3301); +reg_write( DDR_REG_BASE + 0x52996*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE + 0x52997*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE + 0x52998*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52999*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x5299a*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE + 0x5299b*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x5299c*4+0x02000000,0x9b2); +reg_write( DDR_REG_BASE + 0x5299d*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x5299e*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x5299f*4+0x02000000,0xc104); +reg_write( DDR_REG_BASE + 0x529a0*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE + 0x529a1*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x529a2*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x529a3*4+0x02000000,0x2014); +reg_write( DDR_REG_BASE + 0x529a4*4+0x02000000,0x41); +reg_write( DDR_REG_BASE + 0x529a5*4+0x02000000,0x4958); +reg_write( DDR_REG_BASE + 0x529a6*4+0x02000000,0xb8c0); +reg_write( DDR_REG_BASE + 0x529a7*4+0x02000000,0x6038); +reg_write( DDR_REG_BASE + 0x529a8*4+0x02000000,0xe028); +reg_write( DDR_REG_BASE + 0x529a9*4+0x02000000,0x7b0f); +reg_write( DDR_REG_BASE + 0x529aa*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x529ab*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x529ac*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x529ad*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x529ae*4+0x02000000,0x98e); +reg_write( DDR_REG_BASE + 0x529af*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x529b0*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x529b1*4+0x02000000,0x79db); +reg_write( DDR_REG_BASE + 0x529b2*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x529b3*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x529b4*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE + 0x529b5*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE + 0x529b6*4+0x02000000,0x30c1); +reg_write( DDR_REG_BASE + 0x529b7*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x529b8*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x529b9*4+0x02000000,0x97a); +reg_write( DDR_REG_BASE + 0x529ba*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x529bb*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x529bc*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x529bd*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x529be*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x529bf*4+0x02000000,0xdb10); +reg_write( DDR_REG_BASE + 0x529c0*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x529c1*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x529c2*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x529c3*4+0x02000000,0x966); +reg_write( DDR_REG_BASE + 0x529c4*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x529c5*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x529c6*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x529c7*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x529c8*4+0x02000000,0x764c); +reg_write( DDR_REG_BASE + 0x529c9*4+0x02000000,0xdb26); +reg_write( DDR_REG_BASE + 0x529ca*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x529cb*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE + 0x529cc*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x529cd*4+0x02000000,0x952); +reg_write( DDR_REG_BASE + 0x529ce*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x529cf*4+0x02000000,0x1c00); +reg_write( DDR_REG_BASE + 0x529d0*4+0x02000000,0x3041); +reg_write( DDR_REG_BASE + 0x529d1*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x529d2*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE + 0x529d3*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x529d4*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x529d5*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x529d6*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x529d7*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x529d8*4+0x02000000,0x93a); +reg_write( DDR_REG_BASE + 0x529d9*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x529da*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x529db*4+0x02000000,0xc0a8); +reg_write( DDR_REG_BASE + 0x529dc*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x529dd*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x529de*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x529df*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x529e0*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x529e1*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x529e2*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x529e3*4+0x02000000,0xc1a6); +reg_write( DDR_REG_BASE + 0x529e4*4+0x02000000,0xc144); +reg_write( DDR_REG_BASE + 0x529e5*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x529e6*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x529e7*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE + 0x529e8*4+0x02000000,0x8920); +reg_write( DDR_REG_BASE + 0x529e9*4+0x02000000,0x4358); +reg_write( DDR_REG_BASE + 0x529ea*4+0x02000000,0x7034); +reg_write( DDR_REG_BASE + 0x529eb*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x529ec*4+0x02000000,0xf206); +reg_write( DDR_REG_BASE + 0x529ed*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x529ee*4+0x02000000,0x708f); +reg_write( DDR_REG_BASE + 0x529ef*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x529f0*4+0x02000000,0x49); +reg_write( DDR_REG_BASE + 0x529f1*4+0x02000000,0xf006); +reg_write( DDR_REG_BASE + 0x529f2*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x529f3*4+0x02000000,0x708f); +reg_write( DDR_REG_BASE + 0x529f4*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x529f5*4+0x02000000,0x23); +reg_write( DDR_REG_BASE + 0x529f6*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE + 0x529f7*4+0x02000000,0x7c2); +reg_write( DDR_REG_BASE + 0x529f8*4+0x02000000,0x4020); +reg_write( DDR_REG_BASE + 0x529f9*4+0x02000000,0xea06); +reg_write( DDR_REG_BASE + 0x529fa*4+0x02000000,0xba61); +reg_write( DDR_REG_BASE + 0x529fb*4+0x02000000,0xa01); +reg_write( DDR_REG_BASE + 0x529fc*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x529fd*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x529fe*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE + 0x529ff*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52a00*4+0x02000000,0x812); +reg_write( DDR_REG_BASE + 0x52a01*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x52a02*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52a03*4+0x02000000,0x70cd); +reg_write( DDR_REG_BASE + 0x52a04*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x52a05*4+0x02000000,0xf02a); +reg_write( DDR_REG_BASE + 0x52a06*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x52a07*4+0x02000000,0x2012); +reg_write( DDR_REG_BASE + 0x52a08*4+0x02000000,0x340); +reg_write( DDR_REG_BASE + 0x52a09*4+0x02000000,0x262f); +reg_write( DDR_REG_BASE + 0x52a0a*4+0x02000000,0xf007); +reg_write( DDR_REG_BASE + 0x52a0b*4+0x02000000,0xf47); +reg_write( DDR_REG_BASE + 0x52a0c*4+0x02000000,0x136e); +reg_write( DDR_REG_BASE + 0x52a0d*4+0x02000000,0x26ca); +reg_write( DDR_REG_BASE + 0x52a0e*4+0x02000000,0x1341); +reg_write( DDR_REG_BASE + 0x52a0f*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x52a10*4+0x02000000,0x4200); +reg_write( DDR_REG_BASE + 0x52a11*4+0x02000000,0x2544); +reg_write( DDR_REG_BASE + 0x52a12*4+0x02000000,0x17c0); +reg_write( DDR_REG_BASE + 0x52a13*4+0x02000000,0xe806); +reg_write( DDR_REG_BASE + 0x52a14*4+0x02000000,0xb861); +reg_write( DDR_REG_BASE + 0x52a15*4+0x02000000,0x801); +reg_write( DDR_REG_BASE + 0x52a16*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x52a17*4+0x02000000,0x7a5b); +reg_write( DDR_REG_BASE + 0x52a18*4+0x02000000,0x255a); +reg_write( DDR_REG_BASE + 0x52a19*4+0x02000000,0x1c81); +reg_write( DDR_REG_BASE + 0x52a1a*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x52a1b*4+0x02000000,0x7077); +reg_write( DDR_REG_BASE + 0x52a1c*4+0x02000000,0xdb18); +reg_write( DDR_REG_BASE + 0x52a1d*4+0x02000000,0x6038); +reg_write( DDR_REG_BASE + 0x52a1e*4+0x02000000,0x880b); +reg_write( DDR_REG_BASE + 0x52a1f*4+0x02000000,0x794f); +reg_write( DDR_REG_BASE + 0x52a20*4+0x02000000,0xc142); +reg_write( DDR_REG_BASE + 0x52a21*4+0x02000000,0x20ec); +reg_write( DDR_REG_BASE + 0x52a22*4+0x02000000,0x62); +reg_write( DDR_REG_BASE + 0x52a23*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x52a24*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52a25*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52a26*4+0x02000000,0x734c); +reg_write( DDR_REG_BASE + 0x52a27*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE + 0x52a28*4+0x02000000,0x3001); +reg_write( DDR_REG_BASE + 0x52a29*4+0x02000000,0xa1a); +reg_write( DDR_REG_BASE + 0x52a2a*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x52a2b*4+0x02000000,0x1c04); +reg_write( DDR_REG_BASE + 0x52a2c*4+0x02000000,0x32c1); +reg_write( DDR_REG_BASE + 0x52a2d*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE + 0x52a2e*4+0x02000000,0xdb1); +reg_write( DDR_REG_BASE + 0x52a2f*4+0x02000000,0x90b4); +reg_write( DDR_REG_BASE + 0x52a30*4+0x02000000,0x7077); +reg_write( DDR_REG_BASE + 0x52a31*4+0x02000000,0x265a); +reg_write( DDR_REG_BASE + 0x52a32*4+0x02000000,0x1c8e); +reg_write( DDR_REG_BASE + 0x52a33*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x52a34*4+0x02000000,0x734c); +reg_write( DDR_REG_BASE + 0x52a35*4+0x02000000,0x60d8); +reg_write( DDR_REG_BASE + 0x52a36*4+0x02000000,0x8822); +reg_write( DDR_REG_BASE + 0x52a37*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52a38*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE + 0x52a39*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x52a3a*4+0x02000000,0x21cf); +reg_write( DDR_REG_BASE + 0x52a3b*4+0x02000000,0x1e2); +reg_write( DDR_REG_BASE + 0x52a3c*4+0x02000000,0xc140); +reg_write( DDR_REG_BASE + 0x52a3d*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x52a3e*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x52a3f*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52a40*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52a41*4+0x02000000,0xdb18); +reg_write( DDR_REG_BASE + 0x52a42*4+0x02000000,0x9e6); +reg_write( DDR_REG_BASE + 0x52a43*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x52a44*4+0x02000000,0x1c04); +reg_write( DDR_REG_BASE + 0x52a45*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x52a46*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52a47*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x52a48*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x52a49*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x52a4a*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52a4b*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52a4c*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x52a4d*4+0x02000000,0xdb31); +reg_write( DDR_REG_BASE + 0x52a4e*4+0x02000000,0x84e); +reg_write( DDR_REG_BASE + 0x52a4f*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x52a50*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE + 0x52a51*4+0x02000000,0x3401); +reg_write( DDR_REG_BASE + 0x52a52*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52a53*4+0x02000000,0xc043); +reg_write( DDR_REG_BASE + 0x52a54*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x52a55*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x52a56*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x52a57*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52a58*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE + 0x52a59*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x52a5a*4+0x02000000,0x836); +reg_write( DDR_REG_BASE + 0x52a5b*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x52a5c*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x52a5d*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52a5e*4+0x02000000,0xfee); +reg_write( DDR_REG_BASE + 0x52a5f*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52a60*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x52a61*4+0x02000000,0xc0a6); +reg_write( DDR_REG_BASE + 0x52a62*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x52a63*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x52a64*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x52a65*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x52a66*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x52a67*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x52a68*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x52a69*4+0x02000000,0xc1a4); +reg_write( DDR_REG_BASE + 0x52a6a*4+0x02000000,0x4528); +reg_write( DDR_REG_BASE + 0x52a6b*4+0x02000000,0xd46); +reg_write( DDR_REG_BASE + 0x52a6c*4+0x02000000,0xfe2f); +reg_write( DDR_REG_BASE + 0x52a6d*4+0x02000000,0x4608); +reg_write( DDR_REG_BASE + 0x52a6e*4+0x02000000,0x4318); +reg_write( DDR_REG_BASE + 0x52a6f*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52a70*4+0x02000000,0xf32); +reg_write( DDR_REG_BASE + 0x52a71*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52a72*4+0x02000000,0xd908); +reg_write( DDR_REG_BASE + 0x52a73*4+0x02000000,0x70ed); +reg_write( DDR_REG_BASE + 0x52a74*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52a75*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52a76*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x52a77*4+0x02000000,0xdb7c); +reg_write( DDR_REG_BASE + 0x52a78*4+0x02000000,0xc743); +reg_write( DDR_REG_BASE + 0x52a79*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x52a7a*4+0x02000000,0xc741); +reg_write( DDR_REG_BASE + 0x52a7b*4+0x02000000,0xff6); +reg_write( DDR_REG_BASE + 0x52a7c*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52a7d*4+0x02000000,0xc740); +reg_write( DDR_REG_BASE + 0x52a7e*4+0x02000000,0x9aa); +reg_write( DDR_REG_BASE + 0x52a7f*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x52a80*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52a81*4+0x02000000,0x2344); +reg_write( DDR_REG_BASE + 0x52a82*4+0x02000000,0x3040); +reg_write( DDR_REG_BASE + 0x52a83*4+0x02000000,0x7063); +reg_write( DDR_REG_BASE + 0x52a84*4+0x02000000,0x2040); +reg_write( DDR_REG_BASE + 0x52a85*4+0x02000000,0xb9b); +reg_write( DDR_REG_BASE + 0x52a86*4+0x02000000,0xed12); +reg_write( DDR_REG_BASE + 0x52a87*4+0x02000000,0xf82c); +reg_write( DDR_REG_BASE + 0x52a88*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE + 0x52a89*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x52a8a*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x52a8b*4+0x02000000,0xc741); +reg_write( DDR_REG_BASE + 0x52a8c*4+0x02000000,0xfd2); +reg_write( DDR_REG_BASE + 0x52a8d*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52a8e*4+0x02000000,0xc740); +reg_write( DDR_REG_BASE + 0x52a8f*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52a90*4+0x02000000,0xd90c); +reg_write( DDR_REG_BASE + 0x52a91*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE + 0x52a92*4+0x02000000,0x756c); +reg_write( DDR_REG_BASE + 0x52a93*4+0x02000000,0xc743); +reg_write( DDR_REG_BASE + 0x52a94*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x52a95*4+0x02000000,0xc741); +reg_write( DDR_REG_BASE + 0x52a96*4+0x02000000,0xc740); +reg_write( DDR_REG_BASE + 0x52a97*4+0x02000000,0xf008); +reg_write( DDR_REG_BASE + 0x52a98*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE + 0x52a99*4+0x02000000,0x3101); +reg_write( DDR_REG_BASE + 0x52a9a*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x52a9b*4+0x02000000,0xc741); +reg_write( DDR_REG_BASE + 0x52a9c*4+0x02000000,0xc740); +reg_write( DDR_REG_BASE + 0x52a9d*4+0x02000000,0xf821); +reg_write( DDR_REG_BASE + 0x52a9e*4+0x02000000,0xfae); +reg_write( DDR_REG_BASE + 0x52a9f*4+0x02000000,0xfd8f); +reg_write( DDR_REG_BASE + 0x52aa0*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52aa1*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52aa2*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE + 0x52aa3*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x52aa4*4+0x02000000,0xc743); +reg_write( DDR_REG_BASE + 0x52aa5*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x52aa6*4+0x02000000,0xc741); +reg_write( DDR_REG_BASE + 0x52aa7*4+0x02000000,0xf9e); +reg_write( DDR_REG_BASE + 0x52aa8*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52aa9*4+0x02000000,0xc740); +reg_write( DDR_REG_BASE + 0x52aaa*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x52aab*4+0x02000000,0x232f); +reg_write( DDR_REG_BASE + 0x52aac*4+0x02000000,0x6c7); +reg_write( DDR_REG_BASE + 0x52aad*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52aae*4+0x02000000,0xd90c); +reg_write( DDR_REG_BASE + 0x52aaf*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE + 0x52ab0*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x52ab1*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x52ab2*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x52ab3*4+0x02000000,0xf86); +reg_write( DDR_REG_BASE + 0x52ab4*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52ab5*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x52ab6*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52ab7*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52ab8*4+0x02000000,0xb98f); +reg_write( DDR_REG_BASE + 0x52ab9*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x52aba*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE + 0x52abb*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE + 0x52abc*4+0x02000000,0x30c1); +reg_write( DDR_REG_BASE + 0x52abd*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x52abe*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x52abf*4+0x02000000,0xf6e); +reg_write( DDR_REG_BASE + 0x52ac0*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52ac1*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x52ac2*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52ac3*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52ac4*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x52ac5*4+0x02000000,0xdb10); +reg_write( DDR_REG_BASE + 0x52ac6*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x52ac7*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x52ac8*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x52ac9*4+0x02000000,0xf5a); +reg_write( DDR_REG_BASE + 0x52aca*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52acb*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x52acc*4+0x02000000,0x8f2); +reg_write( DDR_REG_BASE + 0x52acd*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x52ace*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52acf*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52ad0*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE + 0x52ad1*4+0x02000000,0x764c); +reg_write( DDR_REG_BASE + 0x52ad2*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x52ad3*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x52ad4*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x52ad5*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x52ad6*4+0x02000000,0xf3e); +reg_write( DDR_REG_BASE + 0x52ad7*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52ad8*4+0x02000000,0x1c00); +reg_write( DDR_REG_BASE + 0x52ad9*4+0x02000000,0x3041); +reg_write( DDR_REG_BASE + 0x52ada*4+0x02000000,0xc0a4); +reg_write( DDR_REG_BASE + 0x52adb*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x52adc*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x52add*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x52ade*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52adf*4+0x02000000,0xd90c); +reg_write( DDR_REG_BASE + 0x52ae0*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE + 0x52ae1*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x52ae2*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x52ae3*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x52ae4*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x52ae5*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x52ae6*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x52ae7*4+0x02000000,0xc1aa); +reg_write( DDR_REG_BASE + 0x52ae8*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE + 0x52ae9*4+0x02000000,0xc00f); +reg_write( DDR_REG_BASE + 0x52aea*4+0x02000000,0xc147); +reg_write( DDR_REG_BASE + 0x52aeb*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x52aec*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x52aed*4+0x02000000,0x600); +reg_write( DDR_REG_BASE + 0x52aee*4+0x02000000,0x7906); +reg_write( DDR_REG_BASE + 0x52aef*4+0x02000000,0xc348); +reg_write( DDR_REG_BASE + 0x52af0*4+0x02000000,0xc246); +reg_write( DDR_REG_BASE + 0x52af1*4+0x02000000,0xc049); +reg_write( DDR_REG_BASE + 0x52af2*4+0x02000000,0xe983); +reg_write( DDR_REG_BASE + 0x52af3*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52af4*4+0x02000000,0xf002); +reg_write( DDR_REG_BASE + 0x52af5*4+0x02000000,0xd840); +reg_write( DDR_REG_BASE + 0x52af6*4+0x02000000,0xe26); +reg_write( DDR_REG_BASE + 0x52af7*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52af8*4+0x02000000,0xd9ff); +reg_write( DDR_REG_BASE + 0x52af9*4+0x02000000,0x70ed); +reg_write( DDR_REG_BASE + 0x52afa*4+0x02000000,0x43f9); +reg_write( DDR_REG_BASE + 0x52afb*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x52afc*4+0x02000000,0xf03e); +reg_write( DDR_REG_BASE + 0x52afd*4+0x02000000,0x2332); +reg_write( DDR_REG_BASE + 0x52afe*4+0x02000000,0x3f8e); +reg_write( DDR_REG_BASE + 0x52aff*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52b00*4+0x02000000,0x680); +reg_write( DDR_REG_BASE + 0x52b01*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52b02*4+0x02000000,0xa96); +reg_write( DDR_REG_BASE + 0x52b03*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x52b04*4+0x02000000,0x42c1); +reg_write( DDR_REG_BASE + 0x52b05*4+0x02000000,0xc209); +reg_write( DDR_REG_BASE + 0x52b06*4+0x02000000,0x7944); +reg_write( DDR_REG_BASE + 0x52b07*4+0x02000000,0xc208); +reg_write( DDR_REG_BASE + 0x52b08*4+0x02000000,0x7844); +reg_write( DDR_REG_BASE + 0x52b09*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x52b0a*4+0x02000000,0x807e); +reg_write( DDR_REG_BASE + 0x52b0b*4+0x02000000,0xf42f); +reg_write( DDR_REG_BASE + 0x52b0c*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE + 0x52b0d*4+0x02000000,0x60c8); +reg_write( DDR_REG_BASE + 0x52b0e*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE + 0x52b0f*4+0x02000000,0x2342); +reg_write( DDR_REG_BASE + 0x52b10*4+0x02000000,0x3180); +reg_write( DDR_REG_BASE + 0x52b11*4+0x02000000,0x83b); +reg_write( DDR_REG_BASE + 0x52b12*4+0x02000000,0xf5); +reg_write( DDR_REG_BASE + 0x52b13*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52b14*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x52b15*4+0x02000000,0x734c); +reg_write( DDR_REG_BASE + 0x52b16*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x52b17*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52b18*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE + 0x52b19*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x52b1a*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x52b1b*4+0x02000000,0x836); +reg_write( DDR_REG_BASE + 0x52b1c*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x52b1d*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x52b1e*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x52b1f*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52b20*4+0x02000000,0x734c); +reg_write( DDR_REG_BASE + 0x52b21*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x52b22*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x52b23*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE + 0x52b24*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x52b25*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x52b26*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52b27*4+0x02000000,0x81e); +reg_write( DDR_REG_BASE + 0x52b28*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x52b29*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x52b2a*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x52b2b*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x52b2c*4+0x02000000,0xf004); +reg_write( DDR_REG_BASE + 0x52b2d*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x52b2e*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x52b2f*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x52b30*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x52b31*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52b32*4+0x02000000,0x734c); +reg_write( DDR_REG_BASE + 0x52b33*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x52b34*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52b35*4+0x02000000,0xdb18); +reg_write( DDR_REG_BASE + 0x52b36*4+0x02000000,0xffe); +reg_write( DDR_REG_BASE + 0x52b37*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52b38*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x52b39*4+0x02000000,0x7167); +reg_write( DDR_REG_BASE + 0x52b3a*4+0x02000000,0xb87); +reg_write( DDR_REG_BASE + 0x52b3b*4+0x02000000,0xb274); +reg_write( DDR_REG_BASE + 0x52b3c*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x52b3d*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE + 0x52b3e*4+0x02000000,0xe80e); +reg_write( DDR_REG_BASE + 0x52b3f*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x52b40*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52b41*4+0x02000000,0x734c); +reg_write( DDR_REG_BASE + 0x52b42*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x52b43*4+0x02000000,0xd856); +reg_write( DDR_REG_BASE + 0x52b44*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x52b45*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52b46*4+0x02000000,0xdb18); +reg_write( DDR_REG_BASE + 0x52b47*4+0x02000000,0xc743); +reg_write( DDR_REG_BASE + 0x52b48*4+0x02000000,0xe5a); +reg_write( DDR_REG_BASE + 0x52b49*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52b4a*4+0x02000000,0x1c04); +reg_write( DDR_REG_BASE + 0x52b4b*4+0x02000000,0x3281); +reg_write( DDR_REG_BASE + 0x52b4c*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52b4d*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52b4e*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x52b4f*4+0x02000000,0xdb41); +reg_write( DDR_REG_BASE + 0x52b50*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE + 0x52b51*4+0x02000000,0x3401); +reg_write( DDR_REG_BASE + 0x52b52*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE + 0x52b53*4+0x02000000,0xc741); +reg_write( DDR_REG_BASE + 0x52b54*4+0x02000000,0xe42); +reg_write( DDR_REG_BASE + 0x52b55*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52b56*4+0x02000000,0xc740); +reg_write( DDR_REG_BASE + 0x52b57*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52b58*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE + 0x52b59*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x52b5a*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x52b5b*4+0x02000000,0xc743); +reg_write( DDR_REG_BASE + 0x52b5c*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE + 0x52b5d*4+0x02000000,0xc741); +reg_write( DDR_REG_BASE + 0x52b5e*4+0x02000000,0xe2e); +reg_write( DDR_REG_BASE + 0x52b5f*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52b60*4+0x02000000,0xc740); +reg_write( DDR_REG_BASE + 0x52b61*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52b62*4+0x02000000,0xde6); +reg_write( DDR_REG_BASE + 0x52b63*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52b64*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x52b65*4+0x02000000,0xc0aa); +reg_write( DDR_REG_BASE + 0x52b66*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x52b67*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x52b68*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x52b69*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x52b6a*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x52b6b*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x52b6c*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x52b6d*4+0x02000000,0xc1a5); +reg_write( DDR_REG_BASE + 0x52b6e*4+0x02000000,0x4608); +reg_write( DDR_REG_BASE + 0x52b6f*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52b70*4+0x02000000,0xd32); +reg_write( DDR_REG_BASE + 0x52b71*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52b72*4+0x02000000,0xd9ff); +reg_write( DDR_REG_BASE + 0x52b73*4+0x02000000,0x47cb); +reg_write( DDR_REG_BASE + 0x52b74*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE + 0x52b75*4+0x02000000,0x1e0); +reg_write( DDR_REG_BASE + 0x52b76*4+0x02000000,0x9700); +reg_write( DDR_REG_BASE + 0x52b77*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x52b78*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x52b79*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x52b7a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52b7b*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE + 0x52b7c*4+0x02000000,0xb886); +reg_write( DDR_REG_BASE + 0x52b7d*4+0x02000000,0xb700); +reg_write( DDR_REG_BASE + 0x52b7e*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52b7f*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x52b80*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE + 0x52b81*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x52b82*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x52b83*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x52b84*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x52b85*4+0x02000000,0xde2); +reg_write( DDR_REG_BASE + 0x52b86*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52b87*4+0x02000000,0x4338); +reg_write( DDR_REG_BASE + 0x52b88*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52b89*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52b8a*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x52b8b*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE + 0x52b8c*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x52b8d*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x52b8e*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x52b8f*4+0x02000000,0xdce); +reg_write( DDR_REG_BASE + 0x52b90*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52b91*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x52b92*4+0x02000000,0x2355); +reg_write( DDR_REG_BASE + 0x52b93*4+0x02000000,0x3801); +reg_write( DDR_REG_BASE + 0x52b94*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52b95*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x52b96*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE + 0x52b97*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x52b98*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x52b99*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x52b9a*4+0x02000000,0xdb6); +reg_write( DDR_REG_BASE + 0x52b9b*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52b9c*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x52b9d*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52b9e*4+0x02000000,0xd6e); +reg_write( DDR_REG_BASE + 0x52b9f*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52ba0*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x52ba1*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x52ba2*4+0x02000000,0xb700); +reg_write( DDR_REG_BASE + 0x52ba3*4+0x02000000,0xc0a5); +reg_write( DDR_REG_BASE + 0x52ba4*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x52ba5*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x52ba6*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x52ba7*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x52ba8*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x52ba9*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x52baa*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x52bab*4+0x02000000,0xc1a4); +reg_write( DDR_REG_BASE + 0x52bac*4+0x02000000,0x4608); +reg_write( DDR_REG_BASE + 0x52bad*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52bae*4+0x02000000,0xcb6); +reg_write( DDR_REG_BASE + 0x52baf*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52bb0*4+0x02000000,0xd9ff); +reg_write( DDR_REG_BASE + 0x52bb1*4+0x02000000,0x47cb); +reg_write( DDR_REG_BASE + 0x52bb2*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE + 0x52bb3*4+0x02000000,0x1e0); +reg_write( DDR_REG_BASE + 0x52bb4*4+0x02000000,0x1700); +reg_write( DDR_REG_BASE + 0x52bb5*4+0x02000000,0x111b); +reg_write( DDR_REG_BASE + 0x52bb6*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52bb7*4+0x02000000,0xda0c); +reg_write( DDR_REG_BASE + 0x52bb8*4+0x02000000,0x234f); +reg_write( DDR_REG_BASE + 0x52bb9*4+0x02000000,0x3180); +reg_write( DDR_REG_BASE + 0x52bba*4+0x02000000,0xb700); +reg_write( DDR_REG_BASE + 0x52bbb*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x52bbc*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE + 0x52bbd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52bbe*4+0x02000000,0x3ffc); +reg_write( DDR_REG_BASE + 0x52bbf*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52bc0*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE + 0x52bc1*4+0x02000000,0x4528); +reg_write( DDR_REG_BASE + 0x52bc2*4+0x02000000,0xc143); +reg_write( DDR_REG_BASE + 0x52bc3*4+0x02000000,0xc141); +reg_write( DDR_REG_BASE + 0x52bc4*4+0x02000000,0xd62); +reg_write( DDR_REG_BASE + 0x52bc5*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52bc6*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x52bc7*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52bc8*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE + 0x52bc9*4+0x02000000,0xda0c); +reg_write( DDR_REG_BASE + 0x52bca*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE + 0x52bcb*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x52bcc*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x52bcd*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x52bce*4+0x02000000,0xd4e); +reg_write( DDR_REG_BASE + 0x52bcf*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52bd0*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x52bd1*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52bd2*4+0x02000000,0xd06); +reg_write( DDR_REG_BASE + 0x52bd3*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52bd4*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x52bd5*4+0x02000000,0x1f00); +reg_write( DDR_REG_BASE + 0x52bd6*4+0x02000000,0x16c4); +reg_write( DDR_REG_BASE + 0x52bd7*4+0x02000000,0xc0a4); +reg_write( DDR_REG_BASE + 0x52bd8*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x52bd9*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x52bda*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x52bdb*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x52bdc*4+0x02000000,0xc2e2); +reg_write( DDR_REG_BASE + 0x52bdd*4+0x02000000,0xc1a4); +reg_write( DDR_REG_BASE + 0x52bde*4+0x02000000,0x4508); +reg_write( DDR_REG_BASE + 0x52bdf*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52be0*4+0x02000000,0xc52); +reg_write( DDR_REG_BASE + 0x52be1*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52be2*4+0x02000000,0xd9ff); +reg_write( DDR_REG_BASE + 0x52be3*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x52be4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52be5*4+0x02000000,0xaff); +reg_write( DDR_REG_BASE + 0x52be6*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x52be7*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52be8*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE + 0x52be9*4+0x02000000,0xda0c); +reg_write( DDR_REG_BASE + 0x52bea*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x52beb*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE + 0x52bec*4+0x02000000,0x3001); +reg_write( DDR_REG_BASE + 0x52bed*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x52bee*4+0x02000000,0xd0e); +reg_write( DDR_REG_BASE + 0x52bef*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52bf0*4+0x02000000,0x1c04); +reg_write( DDR_REG_BASE + 0x52bf1*4+0x02000000,0x3001); +reg_write( DDR_REG_BASE + 0x52bf2*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52bf3*4+0x02000000,0xcc6); +reg_write( DDR_REG_BASE + 0x52bf4*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52bf5*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x52bf6*4+0x02000000,0xc0a4); +reg_write( DDR_REG_BASE + 0x52bf7*4+0x02000000,0xc6c2); +reg_write( DDR_REG_BASE + 0x52bf8*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x52bf9*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x52bfa*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x52bfb*4+0x02000000,0xc1a8); +reg_write( DDR_REG_BASE + 0x52bfc*4+0x02000000,0xc144); +reg_write( DDR_REG_BASE + 0x52bfd*4+0x02000000,0xd949); +reg_write( DDR_REG_BASE + 0x52bfe*4+0x02000000,0xb99f); +reg_write( DDR_REG_BASE + 0x52bff*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE + 0x52c00*4+0x02000000,0x8900); +reg_write( DDR_REG_BASE + 0x52c01*4+0x02000000,0x11da); +reg_write( DDR_REG_BASE + 0x52c02*4+0x02000000,0x808f); +reg_write( DDR_REG_BASE + 0x52c03*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x52c04*4+0x02000000,0xc046); +reg_write( DDR_REG_BASE + 0x52c05*4+0x02000000,0xc00d); +reg_write( DDR_REG_BASE + 0x52c06*4+0x02000000,0x71cd); +reg_write( DDR_REG_BASE + 0x52c07*4+0x02000000,0xc342); +reg_write( DDR_REG_BASE + 0x52c08*4+0x02000000,0xc243); +reg_write( DDR_REG_BASE + 0x52c09*4+0x02000000,0xc047); +reg_write( DDR_REG_BASE + 0x52c0a*4+0x02000000,0xf033); +reg_write( DDR_REG_BASE + 0x52c0b*4+0x02000000,0x2544); +reg_write( DDR_REG_BASE + 0x52c0c*4+0x02000000,0x17c1); +reg_write( DDR_REG_BASE + 0x52c0d*4+0x02000000,0x706f); +reg_write( DDR_REG_BASE + 0x52c0e*4+0x02000000,0xe905); +reg_write( DDR_REG_BASE + 0x52c0f*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE + 0x52c10*4+0x02000000,0x9ff); +reg_write( DDR_REG_BASE + 0x52c11*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE + 0x52c12*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x52c13*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x52c14*4+0x02000000,0xf026); +reg_write( DDR_REG_BASE + 0x52c15*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE + 0x52c16*4+0x02000000,0xc201); +reg_write( DDR_REG_BASE + 0x52c17*4+0x02000000,0xc107); +reg_write( DDR_REG_BASE + 0x52c18*4+0x02000000,0x7077); +reg_write( DDR_REG_BASE + 0x52c19*4+0x02000000,0x20ca); +reg_write( DDR_REG_BASE + 0x52c1a*4+0x02000000,0x3c1); +reg_write( DDR_REG_BASE + 0x52c1b*4+0x02000000,0x7944); +reg_write( DDR_REG_BASE + 0x52c1c*4+0x02000000,0x790b); +reg_write( DDR_REG_BASE + 0x52c1d*4+0x02000000,0xf21d); +reg_write( DDR_REG_BASE + 0x52c1e*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE + 0x52c1f*4+0x02000000,0x2344); +reg_write( DDR_REG_BASE + 0x52c20*4+0x02000000,0x37c1); +reg_write( DDR_REG_BASE + 0x52c21*4+0x02000000,0xe906); +reg_write( DDR_REG_BASE + 0x52c22*4+0x02000000,0xb961); +reg_write( DDR_REG_BASE + 0x52c23*4+0x02000000,0x901); +reg_write( DDR_REG_BASE + 0x52c24*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x52c25*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x52c26*4+0x02000000,0xbce); +reg_write( DDR_REG_BASE + 0x52c27*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x52c28*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x52c29*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE + 0x52c2a*4+0x02000000,0xc105); +reg_write( DDR_REG_BASE + 0x52c2b*4+0x02000000,0xc204); +reg_write( DDR_REG_BASE + 0x52c2c*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x52c2d*4+0x02000000,0x4063); +reg_write( DDR_REG_BASE + 0x52c2e*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x52c2f*4+0x02000000,0x901); +reg_write( DDR_REG_BASE + 0x52c30*4+0x02000000,0xc303); +reg_write( DDR_REG_BASE + 0x52c31*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x52c32*4+0x02000000,0x255a); +reg_write( DDR_REG_BASE + 0x52c33*4+0x02000000,0x1c80); +reg_write( DDR_REG_BASE + 0x52c34*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x52c35*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x52c36*4+0x02000000,0xd5e); +reg_write( DDR_REG_BASE + 0x52c37*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x52c38*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x52c39*4+0x02000000,0x7167); +reg_write( DDR_REG_BASE + 0x52c3a*4+0x02000000,0xbb7); +reg_write( DDR_REG_BASE + 0x52c3b*4+0x02000000,0xb094); +reg_write( DDR_REG_BASE + 0x52c3c*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE + 0x52c3d*4+0x02000000,0xd9f); +reg_write( DDR_REG_BASE + 0x52c3e*4+0x02000000,0x90b4); +reg_write( DDR_REG_BASE + 0x52c3f*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE + 0x52c40*4+0x02000000,0xb9a); +reg_write( DDR_REG_BASE + 0x52c41*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x52c42*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE + 0x52c43*4+0x02000000,0xc0a8); +reg_write( DDR_REG_BASE + 0x52c44*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x52c45*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x52c46*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x52c47*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x52c48*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x52c49*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x52c4a*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x52c4b*4+0x02000000,0xc1a4); +reg_write( DDR_REG_BASE + 0x52c4c*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x52c4d*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x52c4e*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52c4f*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE + 0x52c50*4+0x02000000,0x8800); +reg_write( DDR_REG_BASE + 0x52c51*4+0x02000000,0x4378); +reg_write( DDR_REG_BASE + 0x52c52*4+0x02000000,0x4748); +reg_write( DDR_REG_BASE + 0x52c53*4+0x02000000,0xc143); +reg_write( DDR_REG_BASE + 0x52c54*4+0x02000000,0xe806); +reg_write( DDR_REG_BASE + 0x52c55*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x52c56*4+0x02000000,0x708e); +reg_write( DDR_REG_BASE + 0x52c57*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52c58*4+0x02000000,0x49); +reg_write( DDR_REG_BASE + 0x52c59*4+0x02000000,0xf006); +reg_write( DDR_REG_BASE + 0x52c5a*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x52c5b*4+0x02000000,0x708e); +reg_write( DDR_REG_BASE + 0x52c5c*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52c5d*4+0x02000000,0x23); +reg_write( DDR_REG_BASE + 0x52c5e*4+0x02000000,0xc009); +reg_write( DDR_REG_BASE + 0x52c5f*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x52c60*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x52c61*4+0x02000000,0xf01d); +reg_write( DDR_REG_BASE + 0x52c62*4+0x02000000,0xe35); +reg_write( DDR_REG_BASE + 0x52c63*4+0x02000000,0x136e); +reg_write( DDR_REG_BASE + 0x52c64*4+0x02000000,0x710c); +reg_write( DDR_REG_BASE + 0x52c65*4+0x02000000,0x4200); +reg_write( DDR_REG_BASE + 0x52c66*4+0x02000000,0x2544); +reg_write( DDR_REG_BASE + 0x52c67*4+0x02000000,0x17c0); +reg_write( DDR_REG_BASE + 0x52c68*4+0x02000000,0xe805); +reg_write( DDR_REG_BASE + 0x52c69*4+0x02000000,0xb861); +reg_write( DDR_REG_BASE + 0x52c6a*4+0x02000000,0x8ff); +reg_write( DDR_REG_BASE + 0x52c6b*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE + 0x52c6c*4+0x02000000,0x7a5b); +reg_write( DDR_REG_BASE + 0x52c6d*4+0x02000000,0xc103); +reg_write( DDR_REG_BASE + 0x52c6e*4+0x02000000,0xc001); +reg_write( DDR_REG_BASE + 0x52c6f*4+0x02000000,0x4363); +reg_write( DDR_REG_BASE + 0x52c70*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x52c71*4+0x02000000,0xc002); +reg_write( DDR_REG_BASE + 0x52c72*4+0x02000000,0x209f); +reg_write( DDR_REG_BASE + 0x52c73*4+0x02000000,0x901); +reg_write( DDR_REG_BASE + 0x52c74*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x52c75*4+0x02000000,0x255a); +reg_write( DDR_REG_BASE + 0x52c76*4+0x02000000,0x1c80); +reg_write( DDR_REG_BASE + 0x52c77*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x52c78*4+0x02000000,0x784f); +reg_write( DDR_REG_BASE + 0x52c79*4+0x02000000,0xcda); +reg_write( DDR_REG_BASE + 0x52c7a*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x52c7b*4+0x02000000,0x42e1); +reg_write( DDR_REG_BASE + 0x52c7c*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE + 0x52c7d*4+0x02000000,0xdcd); +reg_write( DDR_REG_BASE + 0x52c7e*4+0x02000000,0x9094); +reg_write( DDR_REG_BASE + 0x52c7f*4+0x02000000,0xc0a4); +reg_write( DDR_REG_BASE + 0x52c80*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x52c81*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x52c82*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x52c83*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x52c84*4+0x02000000,0xc2e4); +reg_write( DDR_REG_BASE + 0x52c85*4+0x02000000,0xc1a4); +reg_write( DDR_REG_BASE + 0x52c86*4+0x02000000,0x4508); +reg_write( DDR_REG_BASE + 0x52c87*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x52c88*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x52c89*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52c8a*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x52c8b*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x52c8c*4+0x02000000,0xf83); +reg_write( DDR_REG_BASE + 0x52c8d*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x52c8e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52c8f*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x52c90*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE + 0x52c91*4+0x02000000,0x100); +reg_write( DDR_REG_BASE + 0x52c92*4+0x02000000,0x2305); +reg_write( DDR_REG_BASE + 0x52c93*4+0x02000000,0xc); +reg_write( DDR_REG_BASE + 0x52c94*4+0x02000000,0x7204); +reg_write( DDR_REG_BASE + 0x52c95*4+0x02000000,0x7865); +reg_write( DDR_REG_BASE + 0x52c96*4+0x02000000,0xb420); +reg_write( DDR_REG_BASE + 0x52c97*4+0x02000000,0xb040); +reg_write( DDR_REG_BASE + 0x52c98*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52c99*4+0x02000000,0xae2); +reg_write( DDR_REG_BASE + 0x52c9a*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52c9b*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52c9c*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52c9d*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52c9e*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x52c9f*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE + 0x52ca0*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE + 0x52ca1*4+0x02000000,0x30c1); +reg_write( DDR_REG_BASE + 0x52ca2*4+0x02000000,0x4628); +reg_write( DDR_REG_BASE + 0x52ca3*4+0x02000000,0xc142); +reg_write( DDR_REG_BASE + 0x52ca4*4+0x02000000,0xc141); +reg_write( DDR_REG_BASE + 0x52ca5*4+0x02000000,0xba2); +reg_write( DDR_REG_BASE + 0x52ca6*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52ca7*4+0x02000000,0xc140); +reg_write( DDR_REG_BASE + 0x52ca8*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52ca9*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52caa*4+0x02000000,0xb98d); +reg_write( DDR_REG_BASE + 0x52cab*4+0x02000000,0x734c); +reg_write( DDR_REG_BASE + 0x52cac*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x52cad*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE + 0x52cae*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x52caf*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x52cb0*4+0x02000000,0xb8a); +reg_write( DDR_REG_BASE + 0x52cb1*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52cb2*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x52cb3*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52cb4*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE + 0x52cb5*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x52cb6*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE + 0x52cb7*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE + 0x52cb8*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x52cb9*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x52cba*4+0x02000000,0xb76); +reg_write( DDR_REG_BASE + 0x52cbb*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52cbc*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x52cbd*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52cbe*4+0x02000000,0xb2e); +reg_write( DDR_REG_BASE + 0x52cbf*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52cc0*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x52cc1*4+0x02000000,0xc0a4); +reg_write( DDR_REG_BASE + 0x52cc2*4+0x02000000,0xc6c4); +reg_write( DDR_REG_BASE + 0x52cc3*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x52cc4*4+0x02000000,0xc2e2); +reg_write( DDR_REG_BASE + 0x52cc5*4+0x02000000,0x260a); +reg_write( DDR_REG_BASE + 0x52cc6*4+0x02000000,0x3040); +reg_write( DDR_REG_BASE + 0x52cc7*4+0x02000000,0x4308); +reg_write( DDR_REG_BASE + 0x52cc8*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x52cc9*4+0x02000000,0xf024); +reg_write( DDR_REG_BASE + 0x52cca*4+0x02000000,0x255a); +reg_write( DDR_REG_BASE + 0x52ccb*4+0x02000000,0x1182); +reg_write( DDR_REG_BASE + 0x52ccc*4+0x02000000,0x7261); +reg_write( DDR_REG_BASE + 0x52ccd*4+0x02000000,0x8a01); +reg_write( DDR_REG_BASE + 0x52cce*4+0x02000000,0x8a60); +reg_write( DDR_REG_BASE + 0x52ccf*4+0x02000000,0x8a22); +reg_write( DDR_REG_BASE + 0x52cd0*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x52cd1*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x52cd2*4+0x02000000,0x7b05); +reg_write( DDR_REG_BASE + 0x52cd3*4+0x02000000,0x8a03); +reg_write( DDR_REG_BASE + 0x52cd4*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x52cd5*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x52cd6*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x52cd7*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x52cd8*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x52cd9*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x52cda*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52cdb*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x52cdc*4+0x02000000,0xc1); +reg_write( DDR_REG_BASE + 0x52cdd*4+0x02000000,0x8a05); +reg_write( DDR_REG_BASE + 0x52cde*4+0x02000000,0x8a64); +reg_write( DDR_REG_BASE + 0x52cdf*4+0x02000000,0x7734); +reg_write( DDR_REG_BASE + 0x52ce0*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x52ce1*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x52ce2*4+0x02000000,0x7865); +reg_write( DDR_REG_BASE + 0x52ce3*4+0x02000000,0xf207); +reg_write( DDR_REG_BASE + 0x52ce4*4+0x02000000,0x793b); +reg_write( DDR_REG_BASE + 0x52ce5*4+0x02000000,0xb99c); +reg_write( DDR_REG_BASE + 0x52ce6*4+0x02000000,0xb99f); +reg_write( DDR_REG_BASE + 0x52ce7*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE + 0x52ce8*4+0x02000000,0xf003); +reg_write( DDR_REG_BASE + 0x52ce9*4+0x02000000,0xc92); +reg_write( DDR_REG_BASE + 0x52cea*4+0x02000000,0xfe4f); +reg_write( DDR_REG_BASE + 0x52ceb*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE + 0x52cec*4+0x02000000,0x2e45); +reg_write( DDR_REG_BASE + 0x52ced*4+0x02000000,0x3180); +reg_write( DDR_REG_BASE + 0x52cee*4+0x02000000,0xdb9); +reg_write( DDR_REG_BASE + 0x52cef*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x52cf0*4+0x02000000,0xc6c2); +reg_write( DDR_REG_BASE + 0x52cf1*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x52cf2*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x52cf3*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x52cf4*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x52cf5*4+0x02000000,0xc1a1); +reg_write( DDR_REG_BASE + 0x52cf6*4+0x02000000,0x4718); +reg_write( DDR_REG_BASE + 0x52cf7*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x52cf8*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52cf9*4+0x02000000,0x7b4); +reg_write( DDR_REG_BASE + 0x52cfa*4+0x02000000,0x88c0); +reg_write( DDR_REG_BASE + 0x52cfb*4+0x02000000,0x4338); +reg_write( DDR_REG_BASE + 0x52cfc*4+0x02000000,0xc340); +reg_write( DDR_REG_BASE + 0x52cfd*4+0x02000000,0xea04); +reg_write( DDR_REG_BASE + 0x52cfe*4+0x02000000,0x79db); +reg_write( DDR_REG_BASE + 0x52cff*4+0x02000000,0xf004); +reg_write( DDR_REG_BASE + 0x52d00*4+0x02000000,0x265f); +reg_write( DDR_REG_BASE + 0x52d01*4+0x02000000,0x1241); +reg_write( DDR_REG_BASE + 0x52d02*4+0x02000000,0x1001); +reg_write( DDR_REG_BASE + 0x52d03*4+0x02000000,0x9e); +reg_write( DDR_REG_BASE + 0x52d04*4+0x02000000,0x7054); +reg_write( DDR_REG_BASE + 0x52d05*4+0x02000000,0xdd08); +reg_write( DDR_REG_BASE + 0x52d06*4+0x02000000,0x25ca); +reg_write( DDR_REG_BASE + 0x52d07*4+0x02000000,0x1062); +reg_write( DDR_REG_BASE + 0x52d08*4+0x02000000,0xf039); +reg_write( DDR_REG_BASE + 0x52d09*4+0x02000000,0x40e1); +reg_write( DDR_REG_BASE + 0x52d0a*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x52d0b*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x52d0c*4+0x02000000,0xc300); +reg_write( DDR_REG_BASE + 0x52d0d*4+0x02000000,0x23f5); +reg_write( DDR_REG_BASE + 0x52d0e*4+0x02000000,0x3042); +reg_write( DDR_REG_BASE + 0x52d0f*4+0x02000000,0xeb13); +reg_write( DDR_REG_BASE + 0x52d10*4+0x02000000,0x7c5c); +reg_write( DDR_REG_BASE + 0x52d11*4+0x02000000,0x7c9c); +reg_write( DDR_REG_BASE + 0x52d12*4+0x02000000,0x7c9c); +reg_write( DDR_REG_BASE + 0x52d13*4+0x02000000,0x7c9c); +reg_write( DDR_REG_BASE + 0x52d14*4+0x02000000,0x224a); +reg_write( DDR_REG_BASE + 0x52d15*4+0x02000000,0x16c0); +reg_write( DDR_REG_BASE + 0x52d16*4+0x02000000,0x2a44); +reg_write( DDR_REG_BASE + 0x52d17*4+0x02000000,0x803); +reg_write( DDR_REG_BASE + 0x52d18*4+0x02000000,0x2242); +reg_write( DDR_REG_BASE + 0x52d19*4+0x02000000,0x104a); +reg_write( DDR_REG_BASE + 0x52d1a*4+0x02000000,0xafd); +reg_write( DDR_REG_BASE + 0x52d1b*4+0x02000000,0x9031); +reg_write( DDR_REG_BASE + 0x52d1c*4+0x02000000,0x7c9d); +reg_write( DDR_REG_BASE + 0x52d1d*4+0x02000000,0x629a); +reg_write( DDR_REG_BASE + 0x52d1e*4+0x02000000,0xbac4); +reg_write( DDR_REG_BASE + 0x52d1f*4+0x02000000,0x4a94); +reg_write( DDR_REG_BASE + 0x52d20*4+0x02000000,0xf00d); +reg_write( DDR_REG_BASE + 0x52d21*4+0x02000000,0x248a); +reg_write( DDR_REG_BASE + 0x52d22*4+0x02000000,0x1fcf); +reg_write( DDR_REG_BASE + 0x52d23*4+0x02000000,0x7c44); +reg_write( DDR_REG_BASE + 0x52d24*4+0x02000000,0x2204); +reg_write( DDR_REG_BASE + 0x52d25*4+0x02000000,0xf83); +reg_write( DDR_REG_BASE + 0x52d26*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52d27*4+0x02000000,0xfc00); +reg_write( DDR_REG_BASE + 0x52d28*4+0x02000000,0xda0a); +reg_write( DDR_REG_BASE + 0x52d29*4+0x02000000,0xba61); +reg_write( DDR_REG_BASE + 0x52d2a*4+0x02000000,0xaff); +reg_write( DDR_REG_BASE + 0x52d2b*4+0x02000000,0x8031); +reg_write( DDR_REG_BASE + 0x52d2c*4+0x02000000,0x7b7d); +reg_write( DDR_REG_BASE + 0x52d2d*4+0x02000000,0x261a); +reg_write( DDR_REG_BASE + 0x52d2e*4+0x02000000,0x1f82); +reg_write( DDR_REG_BASE + 0x52d2f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52d30*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x52d31*4+0x02000000,0x239a); +reg_write( DDR_REG_BASE + 0x52d32*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x52d33*4+0x02000000,0x71e5); +reg_write( DDR_REG_BASE + 0x52d34*4+0x02000000,0x7124); +reg_write( DDR_REG_BASE + 0x52d35*4+0x02000000,0x2205); +reg_write( DDR_REG_BASE + 0x52d36*4+0x02000000,0x7c2); +reg_write( DDR_REG_BASE + 0x52d37*4+0x02000000,0x7845); +reg_write( DDR_REG_BASE + 0x52d38*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x52d39*4+0x02000000,0xb891); +reg_write( DDR_REG_BASE + 0x52d3a*4+0x02000000,0xb89c); +reg_write( DDR_REG_BASE + 0x52d3b*4+0x02000000,0x7b85); +reg_write( DDR_REG_BASE + 0x52d3c*4+0x02000000,0xb89f); +reg_write( DDR_REG_BASE + 0x52d3d*4+0x02000000,0xb060); +reg_write( DDR_REG_BASE + 0x52d3e*4+0x02000000,0xd97); +reg_write( DDR_REG_BASE + 0x52d3f*4+0x02000000,0x93c5); +reg_write( DDR_REG_BASE + 0x52d40*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE + 0x52d41*4+0x02000000,0xefd); +reg_write( DDR_REG_BASE + 0x52d42*4+0x02000000,0xb3a5); +reg_write( DDR_REG_BASE + 0x52d43*4+0x02000000,0x70ed); +reg_write( DDR_REG_BASE + 0x52d44*4+0x02000000,0x7487); +reg_write( DDR_REG_BASE + 0x52d45*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x52d46*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x52d47*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x52d48*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x52d49*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x52d4a*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x52d4b*4+0x02000000,0xc1a9); +reg_write( DDR_REG_BASE + 0x52d4c*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52d4d*4+0x02000000,0xd72); +reg_write( DDR_REG_BASE + 0x52d4e*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52d4f*4+0x02000000,0x4318); +reg_write( DDR_REG_BASE + 0x52d50*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE + 0x52d51*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x52d52*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52d53*4+0x02000000,0x7b2); +reg_write( DDR_REG_BASE + 0x52d54*4+0x02000000,0x1003); +reg_write( DDR_REG_BASE + 0x52d55*4+0x02000000,0x8b); +reg_write( DDR_REG_BASE + 0x52d56*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x52d57*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52d58*4+0x02000000,0x7b2); +reg_write( DDR_REG_BASE + 0x52d59*4+0x02000000,0x88c2); +reg_write( DDR_REG_BASE + 0x52d5a*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x52d5b*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x52d5c*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52d5d*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x52d5e*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x52d5f*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x52d60*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x52d61*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52d62*4+0x02000000,0xc046); +reg_write( DDR_REG_BASE + 0x52d63*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52d64*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE + 0x52d65*4+0x02000000,0xf039); +reg_write( DDR_REG_BASE + 0x52d66*4+0x02000000,0x708d); +reg_write( DDR_REG_BASE + 0x52d67*4+0x02000000,0xf034); +reg_write( DDR_REG_BASE + 0x52d68*4+0x02000000,0x271a); +reg_write( DDR_REG_BASE + 0x52d69*4+0x02000000,0x1f8d); +reg_write( DDR_REG_BASE + 0x52d6a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52d6b*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x52d6c*4+0x02000000,0x224f); +reg_write( DDR_REG_BASE + 0x52d6d*4+0x02000000,0x80); +reg_write( DDR_REG_BASE + 0x52d6e*4+0x02000000,0x780f); +reg_write( DDR_REG_BASE + 0x52d6f*4+0x02000000,0x82d); +reg_write( DDR_REG_BASE + 0x52d70*4+0x02000000,0x111); +reg_write( DDR_REG_BASE + 0x52d71*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x52d72*4+0x02000000,0x2055); +reg_write( DDR_REG_BASE + 0x52d73*4+0x02000000,0xd01); +reg_write( DDR_REG_BASE + 0x52d74*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE + 0x52d75*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x52d76*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x52d77*4+0x02000000,0x341); +reg_write( DDR_REG_BASE + 0x52d78*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE + 0x52d79*4+0x02000000,0x203c); +reg_write( DDR_REG_BASE + 0x52d7a*4+0x02000000,0x80); +reg_write( DDR_REG_BASE + 0x52d7b*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x52d7c*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x52d7d*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x52d7e*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x52d7f*4+0x02000000,0xb891); +reg_write( DDR_REG_BASE + 0x52d80*4+0x02000000,0xb89c); +reg_write( DDR_REG_BASE + 0x52d81*4+0x02000000,0xb89f); +reg_write( DDR_REG_BASE + 0x52d82*4+0x02000000,0x9080); +reg_write( DDR_REG_BASE + 0x52d83*4+0x02000000,0xbcc4); +reg_write( DDR_REG_BASE + 0x52d84*4+0x02000000,0x4c38); +reg_write( DDR_REG_BASE + 0x52d85*4+0x02000000,0x791b); +reg_write( DDR_REG_BASE + 0x52d86*4+0x02000000,0x216c); +reg_write( DDR_REG_BASE + 0x52d87*4+0x02000000,0x143); +reg_write( DDR_REG_BASE + 0x52d88*4+0x02000000,0xb8c4); +reg_write( DDR_REG_BASE + 0x52d89*4+0x02000000,0x7b05); +reg_write( DDR_REG_BASE + 0x52d8a*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x52d8b*4+0x02000000,0x2055); +reg_write( DDR_REG_BASE + 0x52d8c*4+0x02000000,0xc01); +reg_write( DDR_REG_BASE + 0x52d8d*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE + 0x52d8e*4+0x02000000,0x7905); +reg_write( DDR_REG_BASE + 0x52d8f*4+0x02000000,0x6a01); +reg_write( DDR_REG_BASE + 0x52d90*4+0x02000000,0x229a); +reg_write( DDR_REG_BASE + 0x52d91*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x52d92*4+0x02000000,0x7a25); +reg_write( DDR_REG_BASE + 0x52d93*4+0x02000000,0x7d45); +reg_write( DDR_REG_BASE + 0x52d94*4+0x02000000,0x79bb); +reg_write( DDR_REG_BASE + 0x52d95*4+0x02000000,0xb991); +reg_write( DDR_REG_BASE + 0x52d96*4+0x02000000,0xb99c); +reg_write( DDR_REG_BASE + 0x52d97*4+0x02000000,0xb99f); +reg_write( DDR_REG_BASE + 0x52d98*4+0x02000000,0xb160); +reg_write( DDR_REG_BASE + 0x52d99*4+0x02000000,0x4200); +reg_write( DDR_REG_BASE + 0x52d9a*4+0x02000000,0xa9d); +reg_write( DDR_REG_BASE + 0x52d9b*4+0x02000000,0x8254); +reg_write( DDR_REG_BASE + 0x52d9c*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE + 0x52d9d*4+0x02000000,0x7fcf); +reg_write( DDR_REG_BASE + 0x52d9e*4+0x02000000,0xb91); +reg_write( DDR_REG_BASE + 0x52d9f*4+0x02000000,0x93e5); +reg_write( DDR_REG_BASE + 0x52da0*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x52da1*4+0x02000000,0xa92); +reg_write( DDR_REG_BASE + 0x52da2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52da3*4+0x02000000,0xf36); +reg_write( DDR_REG_BASE + 0x52da4*4+0x02000000,0xfd8f); +reg_write( DDR_REG_BASE + 0x52da5*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x52da6*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x52da7*4+0x02000000,0xe004); +reg_write( DDR_REG_BASE + 0x52da8*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52da9*4+0x02000000,0x47cb); +reg_write( DDR_REG_BASE + 0x52daa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52dab*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE + 0x52dac*4+0x02000000,0x71cd); +reg_write( DDR_REG_BASE + 0x52dad*4+0x02000000,0xb100); +reg_write( DDR_REG_BASE + 0x52dae*4+0x02000000,0xb1f0); +reg_write( DDR_REG_BASE + 0x52daf*4+0x02000000,0xb1d6); +reg_write( DDR_REG_BASE + 0x52db0*4+0x02000000,0xb1cf); +reg_write( DDR_REG_BASE + 0x52db1*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x52db2*4+0x02000000,0x710d); +reg_write( DDR_REG_BASE + 0x52db3*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x52db4*4+0x02000000,0x4a); +reg_write( DDR_REG_BASE + 0x52db5*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x52db6*4+0x02000000,0x41e1); +reg_write( DDR_REG_BASE + 0x52db7*4+0x02000000,0x42e1); +reg_write( DDR_REG_BASE + 0x52db8*4+0x02000000,0x43e1); +reg_write( DDR_REG_BASE + 0x52db9*4+0x02000000,0xfd2); +reg_write( DDR_REG_BASE + 0x52dba*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x52dbb*4+0x02000000,0xc740); +reg_write( DDR_REG_BASE + 0x52dbc*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52dbd*4+0x02000000,0xd9ff); +reg_write( DDR_REG_BASE + 0x52dbe*4+0x02000000,0x42c3); +reg_write( DDR_REG_BASE + 0x52dbf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52dc0*4+0x02000000,0xf000); +reg_write( DDR_REG_BASE + 0x52dc1*4+0x02000000,0x43e1); +reg_write( DDR_REG_BASE + 0x52dc2*4+0x02000000,0xfbe); +reg_write( DDR_REG_BASE + 0x52dc3*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x52dc4*4+0x02000000,0xc740); +reg_write( DDR_REG_BASE + 0x52dc5*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x52dc6*4+0x02000000,0x2344); +reg_write( DDR_REG_BASE + 0x52dc7*4+0x02000000,0x37ca); +reg_write( DDR_REG_BASE + 0x52dc8*4+0x02000000,0x43d9); +reg_write( DDR_REG_BASE + 0x52dc9*4+0x02000000,0xa13); +reg_write( DDR_REG_BASE + 0x52dca*4+0x02000000,0x1010); +reg_write( DDR_REG_BASE + 0x52dcb*4+0x02000000,0x2242); +reg_write( DDR_REG_BASE + 0x52dcc*4+0x02000000,0x104a); +reg_write( DDR_REG_BASE + 0x52dcd*4+0x02000000,0xaff); +reg_write( DDR_REG_BASE + 0x52dce*4+0x02000000,0x9031); +reg_write( DDR_REG_BASE + 0x52dcf*4+0x02000000,0x232f); +reg_write( DDR_REG_BASE + 0x52dd0*4+0x02000000,0x36c0); +reg_write( DDR_REG_BASE + 0x52dd1*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE + 0x52dd2*4+0x02000000,0x7ca); +reg_write( DDR_REG_BASE + 0x52dd3*4+0x02000000,0x40c1); +reg_write( DDR_REG_BASE + 0x52dd4*4+0x02000000,0xa0f); +reg_write( DDR_REG_BASE + 0x52dd5*4+0x02000000,0x1010); +reg_write( DDR_REG_BASE + 0x52dd6*4+0x02000000,0x2242); +reg_write( DDR_REG_BASE + 0x52dd7*4+0x02000000,0x104a); +reg_write( DDR_REG_BASE + 0x52dd8*4+0x02000000,0xafd); +reg_write( DDR_REG_BASE + 0x52dd9*4+0x02000000,0x9031); +reg_write( DDR_REG_BASE + 0x52dda*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x52ddb*4+0x02000000,0x2004); +reg_write( DDR_REG_BASE + 0x52ddc*4+0x02000000,0x8340); +reg_write( DDR_REG_BASE + 0x52ddd*4+0x02000000,0xc048); +reg_write( DDR_REG_BASE + 0x52dde*4+0x02000000,0xf20a); +reg_write( DDR_REG_BASE + 0x52ddf*4+0x02000000,0x740c); +reg_write( DDR_REG_BASE + 0x52de0*4+0x02000000,0xd9ff); +reg_write( DDR_REG_BASE + 0x52de1*4+0x02000000,0x42c3); +reg_write( DDR_REG_BASE + 0x52de2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52de3*4+0x02000000,0xf000); +reg_write( DDR_REG_BASE + 0x52de4*4+0x02000000,0x43e1); +reg_write( DDR_REG_BASE + 0x52de5*4+0x02000000,0xf7a); +reg_write( DDR_REG_BASE + 0x52de6*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x52de7*4+0x02000000,0xc740); +reg_write( DDR_REG_BASE + 0x52de8*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x52de9*4+0x02000000,0xbee); +reg_write( DDR_REG_BASE + 0x52dea*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52deb*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x52dec*4+0x02000000,0xea2); +reg_write( DDR_REG_BASE + 0x52ded*4+0x02000000,0xfdcf); +reg_write( DDR_REG_BASE + 0x52dee*4+0x02000000,0xc047); +reg_write( DDR_REG_BASE + 0x52def*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52df0*4+0x02000000,0x832); +reg_write( DDR_REG_BASE + 0x52df1*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52df2*4+0x02000000,0xd91f); +reg_write( DDR_REG_BASE + 0x52df3*4+0x02000000,0xca00); +reg_write( DDR_REG_BASE + 0x52df4*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x52df5*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52df6*4+0x02000000,0x7604); +reg_write( DDR_REG_BASE + 0x52df7*4+0x02000000,0xbd8e); +reg_write( DDR_REG_BASE + 0x52df8*4+0x02000000,0xc143); +reg_write( DDR_REG_BASE + 0x52df9*4+0x02000000,0x272f); +reg_write( DDR_REG_BASE + 0x52dfa*4+0x02000000,0x16c7); +reg_write( DDR_REG_BASE + 0x52dfb*4+0x02000000,0xc141); +reg_write( DDR_REG_BASE + 0x52dfc*4+0x02000000,0xc140); +reg_write( DDR_REG_BASE + 0x52dfd*4+0x02000000,0x7b0f); +reg_write( DDR_REG_BASE + 0x52dfe*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52dff*4+0x02000000,0x41a1); +reg_write( DDR_REG_BASE + 0x52e00*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x52e01*4+0x02000000,0x8ea); +reg_write( DDR_REG_BASE + 0x52e02*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52e03*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE + 0x52e04*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52e05*4+0x02000000,0xc041); +reg_write( DDR_REG_BASE + 0x52e06*4+0x02000000,0xc040); +reg_write( DDR_REG_BASE + 0x52e07*4+0x02000000,0x254f); +reg_write( DDR_REG_BASE + 0x52e08*4+0x02000000,0x1281); +reg_write( DDR_REG_BASE + 0x52e09*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52e0a*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x52e0b*4+0x02000000,0xdb7c); +reg_write( DDR_REG_BASE + 0x52e0c*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE + 0x52e0d*4+0x02000000,0x8d2); +reg_write( DDR_REG_BASE + 0x52e0e*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52e0f*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE + 0x52e10*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x52e11*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE + 0x52e12*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52e13*4+0x02000000,0x4400); +reg_write( DDR_REG_BASE + 0x52e14*4+0x02000000,0xf031); +reg_write( DDR_REG_BASE + 0x52e15*4+0x02000000,0x41c1); +reg_write( DDR_REG_BASE + 0x52e16*4+0x02000000,0x724c); +reg_write( DDR_REG_BASE + 0x52e17*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x52e18*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE + 0x52e19*4+0x02000000,0x30c1); +reg_write( DDR_REG_BASE + 0x52e1a*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE + 0x52e1b*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x52e1c*4+0x02000000,0x8b2); +reg_write( DDR_REG_BASE + 0x52e1d*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52e1e*4+0x02000000,0x1c00); +reg_write( DDR_REG_BASE + 0x52e1f*4+0x02000000,0x3201); +reg_write( DDR_REG_BASE + 0x52e20*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52e21*4+0x02000000,0x41c1); +reg_write( DDR_REG_BASE + 0x52e22*4+0x02000000,0x724c); +reg_write( DDR_REG_BASE + 0x52e23*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x52e24*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x52e25*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE + 0x52e26*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x52e27*4+0x02000000,0x89e); +reg_write( DDR_REG_BASE + 0x52e28*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52e29*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x52e2a*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52e2b*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52e2c*4+0x02000000,0xb990); +reg_write( DDR_REG_BASE + 0x52e2d*4+0x02000000,0x724c); +reg_write( DDR_REG_BASE + 0x52e2e*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x52e2f*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE + 0x52e30*4+0x02000000,0x3081); +reg_write( DDR_REG_BASE + 0x52e31*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE + 0x52e32*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x52e33*4+0x02000000,0x886); +reg_write( DDR_REG_BASE + 0x52e34*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52e35*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x52e36*4+0x02000000,0x942); +reg_write( DDR_REG_BASE + 0x52e37*4+0x02000000,0xfdcf); +reg_write( DDR_REG_BASE + 0x52e38*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52e39*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52e3a*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x52e3b*4+0x02000000,0xdb10); +reg_write( DDR_REG_BASE + 0x52e3c*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x52e3d*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x52e3e*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x52e3f*4+0x02000000,0x86e); +reg_write( DDR_REG_BASE + 0x52e40*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52e41*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x52e42*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x52e43*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE + 0x52e44*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE + 0x52e45*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x52e46*4+0x02000000,0x89f); +reg_write( DDR_REG_BASE + 0x52e47*4+0x02000000,0x80b4); +reg_write( DDR_REG_BASE + 0x52e48*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52e49*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE + 0x52e4a*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x52e4b*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x52e4c*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE + 0x52e4d*4+0x02000000,0x41); +reg_write( DDR_REG_BASE + 0x52e4e*4+0x02000000,0x6119); +reg_write( DDR_REG_BASE + 0x52e4f*4+0x02000000,0x496e); +reg_write( DDR_REG_BASE + 0x52e50*4+0x02000000,0x7b0f); +reg_write( DDR_REG_BASE + 0x52e51*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52e52*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52e53*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x52e54*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x52e55*4+0x02000000,0x842); +reg_write( DDR_REG_BASE + 0x52e56*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52e57*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x52e58*4+0x02000000,0x76ad); +reg_write( DDR_REG_BASE + 0x52e59*4+0x02000000,0x70cd); +reg_write( DDR_REG_BASE + 0x52e5a*4+0x02000000,0x43db); +reg_write( DDR_REG_BASE + 0x52e5b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52e5c*4+0x02000000,0x4400); +reg_write( DDR_REG_BASE + 0x52e5d*4+0x02000000,0xf016); +reg_write( DDR_REG_BASE + 0x52e5e*4+0x02000000,0x4163); +reg_write( DDR_REG_BASE + 0x52e5f*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE + 0x52e60*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x52e61*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE + 0x52e62*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE + 0x52e63*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x52e64*4+0x02000000,0x822); +reg_write( DDR_REG_BASE + 0x52e65*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52e66*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x52e67*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52e68*4+0x02000000,0x4163); +reg_write( DDR_REG_BASE + 0x52e69*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE + 0x52e6a*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x52e6b*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE + 0x52e6c*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE + 0x52e6d*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x52e6e*4+0x02000000,0x80e); +reg_write( DDR_REG_BASE + 0x52e6f*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52e70*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x52e71*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE + 0x52e72*4+0x02000000,0xdd9); +reg_write( DDR_REG_BASE + 0x52e73*4+0x02000000,0x9234); +reg_write( DDR_REG_BASE + 0x52e74*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52e75*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52e76*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x52e77*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52e78*4+0x02000000,0x440c); +reg_write( DDR_REG_BASE + 0x52e79*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE + 0x52e7a*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x52e7b*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE + 0x52e7c*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE + 0x52e7d*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x52e7e*4+0x02000000,0xfee); +reg_write( DDR_REG_BASE + 0x52e7f*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x52e80*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x52e81*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52e82*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52e83*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x52e84*4+0x02000000,0xdbb0); +reg_write( DDR_REG_BASE + 0x52e85*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE + 0x52e86*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x52e87*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x52e88*4+0x02000000,0xfda); +reg_write( DDR_REG_BASE + 0x52e89*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x52e8a*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x52e8b*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52e8c*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE + 0x52e8d*4+0x02000000,0x764c); +reg_write( DDR_REG_BASE + 0x52e8e*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x52e8f*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE + 0x52e90*4+0x02000000,0xc742); +reg_write( DDR_REG_BASE + 0x52e91*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x52e92*4+0x02000000,0xfc6); +reg_write( DDR_REG_BASE + 0x52e93*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x52e94*4+0x02000000,0x1c00); +reg_write( DDR_REG_BASE + 0x52e95*4+0x02000000,0x3041); +reg_write( DDR_REG_BASE + 0x52e96*4+0x02000000,0xe8f); +reg_write( DDR_REG_BASE + 0x52e97*4+0x02000000,0x1235); +reg_write( DDR_REG_BASE + 0x52e98*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52e99*4+0x02000000,0xf7a); +reg_write( DDR_REG_BASE + 0x52e9a*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x52e9b*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x52e9c*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x52e9d*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52e9e*4+0x02000000,0x7b2); +reg_write( DDR_REG_BASE + 0x52e9f*4+0x02000000,0x1001); +reg_write( DDR_REG_BASE + 0x52ea0*4+0x02000000,0x8b); +reg_write( DDR_REG_BASE + 0x52ea1*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x52ea2*4+0x02000000,0x708c); +reg_write( DDR_REG_BASE + 0x52ea3*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52ea4*4+0x02000000,0x7b2); +reg_write( DDR_REG_BASE + 0x52ea5*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x52ea6*4+0x02000000,0xf02b); +reg_write( DDR_REG_BASE + 0x52ea7*4+0x02000000,0x241a); +reg_write( DDR_REG_BASE + 0x52ea8*4+0x02000000,0x1f80); +reg_write( DDR_REG_BASE + 0x52ea9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52eaa*4+0x02000000,0x800); +reg_write( DDR_REG_BASE + 0x52eab*4+0x02000000,0x2444); +reg_write( DDR_REG_BASE + 0x52eac*4+0x02000000,0x1042); +reg_write( DDR_REG_BASE + 0x52ead*4+0x02000000,0xc108); +reg_write( DDR_REG_BASE + 0x52eae*4+0x02000000,0x206c); +reg_write( DDR_REG_BASE + 0x52eaf*4+0x02000000,0x2c3); +reg_write( DDR_REG_BASE + 0x52eb0*4+0x02000000,0x4040); +reg_write( DDR_REG_BASE + 0x52eb1*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x52eb2*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x52eb3*4+0x02000000,0x7034); +reg_write( DDR_REG_BASE + 0x52eb4*4+0x02000000,0x20ca); +reg_write( DDR_REG_BASE + 0x52eb5*4+0x02000000,0x21); +reg_write( DDR_REG_BASE + 0x52eb6*4+0x02000000,0x7865); +reg_write( DDR_REG_BASE + 0x52eb7*4+0x02000000,0x781b); +reg_write( DDR_REG_BASE + 0x52eb8*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x52eb9*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x52eba*4+0x02000000,0x9002); +reg_write( DDR_REG_BASE + 0x52ebb*4+0x02000000,0x166); +reg_write( DDR_REG_BASE + 0x52ebc*4+0x02000000,0x90e0); +reg_write( DDR_REG_BASE + 0x52ebd*4+0x02000000,0xef13); +reg_write( DDR_REG_BASE + 0x52ebe*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x52ebf*4+0x02000000,0x229a); +reg_write( DDR_REG_BASE + 0x52ec0*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x52ec1*4+0x02000000,0x2055); +reg_write( DDR_REG_BASE + 0x52ec2*4+0x02000000,0xd01); +reg_write( DDR_REG_BASE + 0x52ec3*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE + 0x52ec4*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x52ec5*4+0x02000000,0x7b05); +reg_write( DDR_REG_BASE + 0x52ec6*4+0x02000000,0x7a65); +reg_write( DDR_REG_BASE + 0x52ec7*4+0x02000000,0x785b); +reg_write( DDR_REG_BASE + 0x52ec8*4+0x02000000,0xb891); +reg_write( DDR_REG_BASE + 0x52ec9*4+0x02000000,0xb89c); +reg_write( DDR_REG_BASE + 0x52eca*4+0x02000000,0xb89f); +reg_write( DDR_REG_BASE + 0x52ecb*4+0x02000000,0x9020); +reg_write( DDR_REG_BASE + 0x52ecc*4+0x02000000,0x2155); +reg_write( DDR_REG_BASE + 0x52ecd*4+0x02000000,0x801); +reg_write( DDR_REG_BASE + 0x52ece*4+0x02000000,0xb020); +reg_write( DDR_REG_BASE + 0x52ecf*4+0x02000000,0x65fd); +reg_write( DDR_REG_BASE + 0x52ed0*4+0x02000000,0x7185); +reg_write( DDR_REG_BASE + 0x52ed1*4+0x02000000,0xbaf); +reg_write( DDR_REG_BASE + 0x52ed2*4+0x02000000,0x9325); +reg_write( DDR_REG_BASE + 0x52ed3*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x52ed4*4+0x02000000,0xa16); +reg_write( DDR_REG_BASE + 0x52ed5*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52ed6*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x52ed7*4+0x02000000,0x86e); +reg_write( DDR_REG_BASE + 0x52ed8*4+0x02000000,0xfe8f); +reg_write( DDR_REG_BASE + 0x52ed9*4+0x02000000,0xd7d); +reg_write( DDR_REG_BASE + 0x52eda*4+0x02000000,0x9031); +reg_write( DDR_REG_BASE + 0x52edb*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE + 0x52edc*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x52edd*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x52ede*4+0x02000000,0x16b); +reg_write( DDR_REG_BASE + 0x52edf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52ee0*4+0x02000000,0xb2e); +reg_write( DDR_REG_BASE + 0x52ee1*4+0x02000000,0xfd2f); +reg_write( DDR_REG_BASE + 0x52ee2*4+0x02000000,0x2578); +reg_write( DDR_REG_BASE + 0x52ee3*4+0x02000000,0x1000); +reg_write( DDR_REG_BASE + 0x52ee4*4+0x02000000,0xc0a9); +reg_write( DDR_REG_BASE + 0x52ee5*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x52ee6*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x52ee7*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x52ee8*4+0x02000000,0xc0f1); +reg_write( DDR_REG_BASE + 0x52ee9*4+0x02000000,0x2482); +reg_write( DDR_REG_BASE + 0x52eea*4+0x02000000,0x3302); +reg_write( DDR_REG_BASE + 0x52eeb*4+0x02000000,0xc080); +reg_write( DDR_REG_BASE + 0x52eec*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x52eed*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52eee*4+0x02000000,0x5f4); +reg_write( DDR_REG_BASE + 0x52eef*4+0x02000000,0xaa6); +reg_write( DDR_REG_BASE + 0x52ef0*4+0x02000000,0xfd2f); +reg_write( DDR_REG_BASE + 0x52ef1*4+0x02000000,0xda8a); +reg_write( DDR_REG_BASE + 0x52ef2*4+0x02000000,0xc080); +reg_write( DDR_REG_BASE + 0x52ef3*4+0x02000000,0xba6); +reg_write( DDR_REG_BASE + 0x52ef4*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x52ef5*4+0x02000000,0xd98a); +reg_write( DDR_REG_BASE + 0x52ef6*4+0x02000000,0xd80f); +reg_write( DDR_REG_BASE + 0x52ef7*4+0x02000000,0x9d2); +reg_write( DDR_REG_BASE + 0x52ef8*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52ef9*4+0x02000000,0xd90f); +reg_write( DDR_REG_BASE + 0x52efa*4+0x02000000,0x2480); +reg_write( DDR_REG_BASE + 0x52efb*4+0x02000000,0x3302); +reg_write( DDR_REG_BASE + 0x52efc*4+0x02000000,0xc0d1); +reg_write( DDR_REG_BASE + 0x52efd*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x52efe*4+0x02000000,0xc2e6); +reg_write( DDR_REG_BASE + 0x52eff*4+0x02000000,0x1cfc); +reg_write( DDR_REG_BASE + 0x52f00*4+0x02000000,0xb6c8); +reg_write( DDR_REG_BASE + 0x52f01*4+0x02000000,0x2482); +reg_write( DDR_REG_BASE + 0x52f02*4+0x02000000,0x3502); +reg_write( DDR_REG_BASE + 0x52f03*4+0x02000000,0xc147); +reg_write( DDR_REG_BASE + 0x52f04*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52f05*4+0x02000000,0xa02); +reg_write( DDR_REG_BASE + 0x52f06*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52f07*4+0x02000000,0x4318); +reg_write( DDR_REG_BASE + 0x52f08*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE + 0x52f09*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x52f0a*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x52f0b*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52f0c*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x52f0d*4+0x02000000,0xc62); +reg_write( DDR_REG_BASE + 0x52f0e*4+0x02000000,0xfdef); +reg_write( DDR_REG_BASE + 0x52f0f*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE + 0x52f10*4+0x02000000,0x208c); +reg_write( DDR_REG_BASE + 0x52f11*4+0x02000000,0x8e82); +reg_write( DDR_REG_BASE + 0x52f12*4+0x02000000,0x71ad); +reg_write( DDR_REG_BASE + 0x52f13*4+0x02000000,0xdffe); +reg_write( DDR_REG_BASE + 0x52f14*4+0x02000000,0xf705); +reg_write( DDR_REG_BASE + 0x52f15*4+0x02000000,0xc52); +reg_write( DDR_REG_BASE + 0x52f16*4+0x02000000,0xfdcf); +reg_write( DDR_REG_BASE + 0x52f17*4+0x02000000,0x2054); +reg_write( DDR_REG_BASE + 0x52f18*4+0x02000000,0x88f); +reg_write( DDR_REG_BASE + 0x52f19*4+0x02000000,0x2344); +reg_write( DDR_REG_BASE + 0x52f1a*4+0x02000000,0x37c0); +reg_write( DDR_REG_BASE + 0x52f1b*4+0x02000000,0xe806); +reg_write( DDR_REG_BASE + 0x52f1c*4+0x02000000,0xb861); +reg_write( DDR_REG_BASE + 0x52f1d*4+0x02000000,0x801); +reg_write( DDR_REG_BASE + 0x52f1e*4+0x02000000,0x31); +reg_write( DDR_REG_BASE + 0x52f1f*4+0x02000000,0x7dbb); +reg_write( DDR_REG_BASE + 0x52f20*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x52f21*4+0x02000000,0x201a); +reg_write( DDR_REG_BASE + 0x52f22*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x52f23*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x52f24*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52f25*4+0x02000000,0xc049); +reg_write( DDR_REG_BASE + 0x52f26*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x52f27*4+0x02000000,0x7100); +reg_write( DDR_REG_BASE + 0x52f28*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x52f29*4+0x02000000,0xaa); +reg_write( DDR_REG_BASE + 0x52f2a*4+0x02000000,0xc04a); +reg_write( DDR_REG_BASE + 0x52f2b*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x52f2c*4+0x02000000,0x7045); +reg_write( DDR_REG_BASE + 0x52f2d*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE + 0x52f2e*4+0x02000000,0xe0aa); +reg_write( DDR_REG_BASE + 0x52f2f*4+0x02000000,0xf76); +reg_write( DDR_REG_BASE + 0x52f30*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x52f31*4+0x02000000,0x70cd); +reg_write( DDR_REG_BASE + 0x52f32*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52f33*4+0x02000000,0xb88f); +reg_write( DDR_REG_BASE + 0x52f34*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x52f35*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x52f36*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x52f37*4+0x02000000,0xe002); +reg_write( DDR_REG_BASE + 0x52f38*4+0x02000000,0xd940); +reg_write( DDR_REG_BASE + 0x52f39*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x52f3a*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x52f3b*4+0x02000000,0xe002); +reg_write( DDR_REG_BASE + 0x52f3c*4+0x02000000,0xc02); +reg_write( DDR_REG_BASE + 0x52f3d*4+0x02000000,0xfdaf); +reg_write( DDR_REG_BASE + 0x52f3e*4+0x02000000,0xb032); +reg_write( DDR_REG_BASE + 0x52f3f*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52f40*4+0x02000000,0xf009); +reg_write( DDR_REG_BASE + 0x52f41*4+0x02000000,0x2156); +reg_write( DDR_REG_BASE + 0x52f42*4+0x02000000,0xe01); +reg_write( DDR_REG_BASE + 0x52f43*4+0x02000000,0x2105); +reg_write( DDR_REG_BASE + 0x52f44*4+0x02000000,0xf81); +reg_write( DDR_REG_BASE + 0x52f45*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE + 0x52f46*4+0x02000000,0xe000); +reg_write( DDR_REG_BASE + 0x52f47*4+0x02000000,0xb1c0); +reg_write( DDR_REG_BASE + 0x52f48*4+0x02000000,0x7104); +reg_write( DDR_REG_BASE + 0x52f49*4+0x02000000,0x8f3); +reg_write( DDR_REG_BASE + 0x52f4a*4+0x02000000,0x80f4); +reg_write( DDR_REG_BASE + 0x52f4b*4+0x02000000,0x791b); +reg_write( DDR_REG_BASE + 0x52f4c*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x52f4d*4+0x02000000,0x7101); +reg_write( DDR_REG_BASE + 0x52f4e*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x52f4f*4+0x02000000,0x4a); +reg_write( DDR_REG_BASE + 0x52f50*4+0x02000000,0xc005); +reg_write( DDR_REG_BASE + 0x52f51*4+0x02000000,0x2111); +reg_write( DDR_REG_BASE + 0x52f52*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52f53*4+0x02000000,0xd9aa); +reg_write( DDR_REG_BASE + 0x52f54*4+0x02000000,0xd898); +reg_write( DDR_REG_BASE + 0x52f55*4+0x02000000,0x20ca); +reg_write( DDR_REG_BASE + 0x52f56*4+0x02000000,0x41); +reg_write( DDR_REG_BASE + 0x52f57*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x52f58*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x52f59*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE + 0x52f5a*4+0x02000000,0xe04c); +reg_write( DDR_REG_BASE + 0x52f5b*4+0x02000000,0x202f); +reg_write( DDR_REG_BASE + 0x52f5c*4+0x02000000,0x6c0); +reg_write( DDR_REG_BASE + 0x52f5d*4+0x02000000,0x2056); +reg_write( DDR_REG_BASE + 0x52f5e*4+0x02000000,0xe00); +reg_write( DDR_REG_BASE + 0x52f5f*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x52f60*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE + 0x52f61*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x52f62*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x52f63*4+0x02000000,0x9000); +reg_write( DDR_REG_BASE + 0x52f64*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE + 0x52f65*4+0x02000000,0x11e9); +reg_write( DDR_REG_BASE + 0x52f66*4+0x02000000,0x700); +reg_write( DDR_REG_BASE + 0x52f67*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x52f68*4+0x02000000,0xc046); +reg_write( DDR_REG_BASE + 0x52f69*4+0x02000000,0xd42); +reg_write( DDR_REG_BASE + 0x52f6a*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x52f6b*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE + 0x52f6c*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x52f6d*4+0x02000000,0x1200); +reg_write( DDR_REG_BASE + 0x52f6e*4+0x02000000,0x3083); +reg_write( DDR_REG_BASE + 0x52f6f*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52f70*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52f71*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x52f72*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE + 0x52f73*4+0x02000000,0xc642); +reg_write( DDR_REG_BASE + 0x52f74*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x52f75*4+0x02000000,0xe02); +reg_write( DDR_REG_BASE + 0x52f76*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x52f77*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x52f78*4+0x02000000,0x78af); +reg_write( DDR_REG_BASE + 0x52f79*4+0x02000000,0xc048); +reg_write( DDR_REG_BASE + 0x52f7a*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x52f7b*4+0x02000000,0x2744); +reg_write( DDR_REG_BASE + 0x52f7c*4+0x02000000,0x1040); +reg_write( DDR_REG_BASE + 0x52f7d*4+0x02000000,0x671f); +reg_write( DDR_REG_BASE + 0x52f7e*4+0x02000000,0x78ef); +reg_write( DDR_REG_BASE + 0x52f7f*4+0x02000000,0xc045); +reg_write( DDR_REG_BASE + 0x52f80*4+0x02000000,0xc305); +reg_write( DDR_REG_BASE + 0x52f81*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE + 0x52f82*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52f83*4+0x02000000,0xb990); +reg_write( DDR_REG_BASE + 0x52f84*4+0x02000000,0x724c); +reg_write( DDR_REG_BASE + 0x52f85*4+0x02000000,0xc643); +reg_write( DDR_REG_BASE + 0x52f86*4+0x02000000,0xc641); +reg_write( DDR_REG_BASE + 0x52f87*4+0x02000000,0xdde); +reg_write( DDR_REG_BASE + 0x52f88*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x52f89*4+0x02000000,0xc640); +reg_write( DDR_REG_BASE + 0x52f8a*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52f8b*4+0x02000000,0xd96); +reg_write( DDR_REG_BASE + 0x52f8c*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x52f8d*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x52f8e*4+0x02000000,0x47cb); +reg_write( DDR_REG_BASE + 0x52f8f*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x52f90*4+0x02000000,0x7b0); +reg_write( DDR_REG_BASE + 0x52f91*4+0x02000000,0x8f20); +reg_write( DDR_REG_BASE + 0x52f92*4+0x02000000,0xf00a); +reg_write( DDR_REG_BASE + 0x52f93*4+0x02000000,0x60da); +reg_write( DDR_REG_BASE + 0x52f94*4+0x02000000,0x4020); +reg_write( DDR_REG_BASE + 0x52f95*4+0x02000000,0x209f); +reg_write( DDR_REG_BASE + 0x52f96*4+0x02000000,0x901); +reg_write( DDR_REG_BASE + 0x52f97*4+0x02000000,0x60d8); +reg_write( DDR_REG_BASE + 0x52f98*4+0x02000000,0x60f8); +reg_write( DDR_REG_BASE + 0x52f99*4+0x02000000,0x8814); +reg_write( DDR_REG_BASE + 0x52f9a*4+0x02000000,0x71c5); +reg_write( DDR_REG_BASE + 0x52f9b*4+0x02000000,0xaa00); +reg_write( DDR_REG_BASE + 0x52f9c*4+0x02000000,0xe6e3); +reg_write( DDR_REG_BASE + 0x52f9d*4+0x02000000,0xc08c); +reg_write( DDR_REG_BASE + 0x52f9e*4+0x02000000,0xf7f5); +reg_write( DDR_REG_BASE + 0x52f9f*4+0x02000000,0x4063); +reg_write( DDR_REG_BASE + 0x52fa0*4+0x02000000,0xc18c); +reg_write( DDR_REG_BASE + 0x52fa1*4+0x02000000,0xc82); +reg_write( DDR_REG_BASE + 0x52fa2*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE + 0x52fa3*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE + 0x52fa4*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x52fa5*4+0x02000000,0x7100); +reg_write( DDR_REG_BASE + 0x52fa6*4+0x02000000,0x9008); +reg_write( DDR_REG_BASE + 0x52fa7*4+0x02000000,0x1e0); +reg_write( DDR_REG_BASE + 0x52fa8*4+0x02000000,0x46cb); +reg_write( DDR_REG_BASE + 0x52fa9*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE + 0x52faa*4+0x02000000,0xe1e0); +reg_write( DDR_REG_BASE + 0x52fab*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x52fac*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE + 0x52fad*4+0x02000000,0xf0ff); +reg_write( DDR_REG_BASE + 0x52fae*4+0x02000000,0xc04b); +reg_write( DDR_REG_BASE + 0x52faf*4+0x02000000,0xb888); +reg_write( DDR_REG_BASE + 0x52fb0*4+0x02000000,0xb600); +reg_write( DDR_REG_BASE + 0x52fb1*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x52fb2*4+0x02000000,0xc206); +reg_write( DDR_REG_BASE + 0x52fb3*4+0x02000000,0x209a); +reg_write( DDR_REG_BASE + 0x52fb4*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x52fb5*4+0x02000000,0x7a24); +reg_write( DDR_REG_BASE + 0x52fb6*4+0x02000000,0x7932); +reg_write( DDR_REG_BASE + 0x52fb7*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE + 0x52fb8*4+0x02000000,0x7824); +reg_write( DDR_REG_BASE + 0x52fb9*4+0x02000000,0x7845); +reg_write( DDR_REG_BASE + 0x52fba*4+0x02000000,0xc046); +reg_write( DDR_REG_BASE + 0x52fbb*4+0x02000000,0xb887); +reg_write( DDR_REG_BASE + 0x52fbc*4+0x02000000,0x1ef2); +reg_write( DDR_REG_BASE + 0x52fbd*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x52fbe*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x52fbf*4+0x02000000,0x7045); +reg_write( DDR_REG_BASE + 0x52fc0*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE + 0x52fc1*4+0x02000000,0xe0e8); +reg_write( DDR_REG_BASE + 0x52fc2*4+0x02000000,0xa96); +reg_write( DDR_REG_BASE + 0x52fc3*4+0x02000000,0xfdcf); +reg_write( DDR_REG_BASE + 0x52fc4*4+0x02000000,0xc044); +reg_write( DDR_REG_BASE + 0x52fc5*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE + 0x52fc6*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x52fc7*4+0x02000000,0xc86); +reg_write( DDR_REG_BASE + 0x52fc8*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x52fc9*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x52fca*4+0x02000000,0x1200); +reg_write( DDR_REG_BASE + 0x52fcb*4+0x02000000,0x3083); +reg_write( DDR_REG_BASE + 0x52fcc*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52fcd*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52fce*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x52fcf*4+0x02000000,0x4528); +reg_write( DDR_REG_BASE + 0x52fd0*4+0x02000000,0xc143); +reg_write( DDR_REG_BASE + 0x52fd1*4+0x02000000,0xc142); +reg_write( DDR_REG_BASE + 0x52fd2*4+0x02000000,0xc141); +reg_write( DDR_REG_BASE + 0x52fd3*4+0x02000000,0xd46); +reg_write( DDR_REG_BASE + 0x52fd4*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x52fd5*4+0x02000000,0xc140); +reg_write( DDR_REG_BASE + 0x52fd6*4+0x02000000,0xefa); +reg_write( DDR_REG_BASE + 0x52fd7*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x52fd8*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52fd9*4+0x02000000,0xc008); +reg_write( DDR_REG_BASE + 0x52fda*4+0x02000000,0xc305); +reg_write( DDR_REG_BASE + 0x52fdb*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x52fdc*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x52fdd*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52fde*4+0x02000000,0xb990); +reg_write( DDR_REG_BASE + 0x52fdf*4+0x02000000,0x724c); +reg_write( DDR_REG_BASE + 0x52fe0*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x52fe1*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x52fe2*4+0x02000000,0xd26); +reg_write( DDR_REG_BASE + 0x52fe3*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x52fe4*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x52fe5*4+0x02000000,0xc004); +reg_write( DDR_REG_BASE + 0x52fe6*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE + 0x52fe7*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x52fe8*4+0x02000000,0x2044); +reg_write( DDR_REG_BASE + 0x52fe9*4+0x02000000,0x41); +reg_write( DDR_REG_BASE + 0x52fea*4+0x02000000,0x6038); +reg_write( DDR_REG_BASE + 0x52feb*4+0x02000000,0xe01e); +reg_write( DDR_REG_BASE + 0x52fec*4+0x02000000,0x7b0f); +reg_write( DDR_REG_BASE + 0x52fed*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52fee*4+0x02000000,0x742c); +reg_write( DDR_REG_BASE + 0x52fef*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x52ff0*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x52ff1*4+0x02000000,0xd0a); +reg_write( DDR_REG_BASE + 0x52ff2*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x52ff3*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x52ff4*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x52ff5*4+0x02000000,0xb890); +reg_write( DDR_REG_BASE + 0x52ff6*4+0x02000000,0x791d); +reg_write( DDR_REG_BASE + 0x52ff7*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x52ff8*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x52ff9*4+0x02000000,0x726c); +reg_write( DDR_REG_BASE + 0x52ffa*4+0x02000000,0x1c0c); +reg_write( DDR_REG_BASE + 0x52ffb*4+0x02000000,0x30c1); +reg_write( DDR_REG_BASE + 0x52ffc*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x52ffd*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x52ffe*4+0x02000000,0xcee); +reg_write( DDR_REG_BASE + 0x52fff*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x53000*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x53001*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x53002*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x53003*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x53004*4+0x02000000,0xdb10); +reg_write( DDR_REG_BASE + 0x53005*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x53006*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x53007*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x53008*4+0x02000000,0xcda); +reg_write( DDR_REG_BASE + 0x53009*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x5300a*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x5300b*4+0x02000000,0xe76); +reg_write( DDR_REG_BASE + 0x5300c*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x5300d*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x5300e*4+0x02000000,0xf852); +reg_write( DDR_REG_BASE + 0x5300f*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x53010*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x53011*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x53012*4+0x02000000,0xcc6); +reg_write( DDR_REG_BASE + 0x53013*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x53014*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x53015*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x53016*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53017*4+0x02000000,0x6210); +reg_write( DDR_REG_BASE + 0x53018*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x53019*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x5301a*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x5301b*4+0x02000000,0xe004); +reg_write( DDR_REG_BASE + 0x5301c*4+0x02000000,0x730c); +reg_write( DDR_REG_BASE + 0x5301d*4+0x02000000,0xc72); +reg_write( DDR_REG_BASE + 0x5301e*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x5301f*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x53020*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE + 0x53021*4+0x02000000,0x408); +reg_write( DDR_REG_BASE + 0x53022*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x53023*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x53024*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x53025*4+0x02000000,0xe004); +reg_write( DDR_REG_BASE + 0x53026*4+0x02000000,0x1600); +reg_write( DDR_REG_BASE + 0x53027*4+0x02000000,0x7080); +reg_write( DDR_REG_BASE + 0x53028*4+0x02000000,0x8000); +reg_write( DDR_REG_BASE + 0x53029*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5302a*4+0x02000000,0x80b); +reg_write( DDR_REG_BASE + 0x5302b*4+0x02000000,0xbf); +reg_write( DDR_REG_BASE + 0x5302c*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE + 0x5302d*4+0x02000000,0x606); +reg_write( DDR_REG_BASE + 0x5302e*4+0x02000000,0xf002); +reg_write( DDR_REG_BASE + 0x5302f*4+0x02000000,0xd833); +reg_write( DDR_REG_BASE + 0x53030*4+0x02000000,0xc4a); +reg_write( DDR_REG_BASE + 0x53031*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x53032*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x53033*4+0x02000000,0xc006); +reg_write( DDR_REG_BASE + 0x53034*4+0x02000000,0xc18c); +reg_write( DDR_REG_BASE + 0x53035*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x53036*4+0x02000000,0x1ef2); +reg_write( DDR_REG_BASE + 0x53037*4+0x02000000,0x9004); +reg_write( DDR_REG_BASE + 0x53038*4+0x02000000,0xb52); +reg_write( DDR_REG_BASE + 0x53039*4+0x02000000,0xffaf); +reg_write( DDR_REG_BASE + 0x5303a*4+0x02000000,0x4063); +reg_write( DDR_REG_BASE + 0x5303b*4+0x02000000,0x8f00); +reg_write( DDR_REG_BASE + 0x5303c*4+0x02000000,0x41c3); +reg_write( DDR_REG_BASE + 0x5303d*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5303e*4+0x02000000,0x600); +reg_write( DDR_REG_BASE + 0x5303f*4+0x02000000,0xc140); +reg_write( DDR_REG_BASE + 0x53040*4+0x02000000,0x4fac); +reg_write( DDR_REG_BASE + 0x53041*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x53042*4+0x02000000,0x80e); +reg_write( DDR_REG_BASE + 0x53043*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x53044*4+0x02000000,0x706c); +reg_write( DDR_REG_BASE + 0x53045*4+0x02000000,0xc00a); +reg_write( DDR_REG_BASE + 0x53046*4+0x02000000,0x70ad); +reg_write( DDR_REG_BASE + 0x53047*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x53048*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x53049*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x5304a*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE + 0x5304b*4+0x02000000,0xe0aa); +reg_write( DDR_REG_BASE + 0x5304c*4+0x02000000,0x40c3); +reg_write( DDR_REG_BASE + 0x5304d*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x5304e*4+0x02000000,0xe002); +reg_write( DDR_REG_BASE + 0x5304f*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x53050*4+0x02000000,0x7344); +reg_write( DDR_REG_BASE + 0x53051*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x53052*4+0x02000000,0xe002); +reg_write( DDR_REG_BASE + 0x53053*4+0x02000000,0xb0b2); +reg_write( DDR_REG_BASE + 0x53054*4+0x02000000,0xb6a); +reg_write( DDR_REG_BASE + 0x53055*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x53056*4+0x02000000,0x208a); +reg_write( DDR_REG_BASE + 0x53057*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x53058*4+0x02000000,0x1200); +reg_write( DDR_REG_BASE + 0x53059*4+0x02000000,0x3083); +reg_write( DDR_REG_BASE + 0x5305a*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x5305b*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x5305c*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x5305d*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x5305e*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x5305f*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x53060*4+0x02000000,0xc2a); +reg_write( DDR_REG_BASE + 0x53061*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x53062*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x53063*4+0x02000000,0xc008); +reg_write( DDR_REG_BASE + 0x53064*4+0x02000000,0xc305); +reg_write( DDR_REG_BASE + 0x53065*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x53066*4+0x02000000,0xc042); +reg_write( DDR_REG_BASE + 0x53067*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x53068*4+0x02000000,0xb990); +reg_write( DDR_REG_BASE + 0x53069*4+0x02000000,0x724c); +reg_write( DDR_REG_BASE + 0x5306a*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x5306b*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x5306c*4+0x02000000,0xc12); +reg_write( DDR_REG_BASE + 0x5306d*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x5306e*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x5306f*4+0x02000000,0xf822); +reg_write( DDR_REG_BASE + 0x53070*4+0x02000000,0xc543); +reg_write( DDR_REG_BASE + 0x53071*4+0x02000000,0xc542); +reg_write( DDR_REG_BASE + 0x53072*4+0x02000000,0xc541); +reg_write( DDR_REG_BASE + 0x53073*4+0x02000000,0xc06); +reg_write( DDR_REG_BASE + 0x53074*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x53075*4+0x02000000,0xc540); +reg_write( DDR_REG_BASE + 0x53076*4+0x02000000,0x700c); +reg_write( DDR_REG_BASE + 0x53077*4+0x02000000,0xbbe); +reg_write( DDR_REG_BASE + 0x53078*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x53079*4+0x02000000,0x712c); +reg_write( DDR_REG_BASE + 0x5307a*4+0x02000000,0xc00b); +reg_write( DDR_REG_BASE + 0x5307b*4+0x02000000,0xb600); +reg_write( DDR_REG_BASE + 0x5307c*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x5307d*4+0x02000000,0x7344); +reg_write( DDR_REG_BASE + 0x5307e*4+0x02000000,0x9005); +reg_write( DDR_REG_BASE + 0x5307f*4+0x02000000,0xe0e8); +reg_write( DDR_REG_BASE + 0x53080*4+0x02000000,0xf00a); +reg_write( DDR_REG_BASE + 0x53081*4+0x02000000,0x2056); +reg_write( DDR_REG_BASE + 0x53082*4+0x02000000,0xe00); +reg_write( DDR_REG_BASE + 0x53083*4+0x02000000,0x2005); +reg_write( DDR_REG_BASE + 0x53084*4+0x02000000,0xf80); +reg_write( DDR_REG_BASE + 0x53085*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE + 0x53086*4+0x02000000,0xe000); +reg_write( DDR_REG_BASE + 0x53087*4+0x02000000,0x1800); +reg_write( DDR_REG_BASE + 0x53088*4+0x02000000,0x3c5); +reg_write( DDR_REG_BASE + 0x53089*4+0x02000000,0x71a5); +reg_write( DDR_REG_BASE + 0x5308a*4+0x02000000,0xdef); +reg_write( DDR_REG_BASE + 0x5308b*4+0x02000000,0x90b4); +reg_write( DDR_REG_BASE + 0x5308c*4+0x02000000,0x78bb); +reg_write( DDR_REG_BASE + 0x5308d*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x5308e*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x5308f*4+0x02000000,0x7004); +reg_write( DDR_REG_BASE + 0x53090*4+0x02000000,0x9009); +reg_write( DDR_REG_BASE + 0x53091*4+0x02000000,0xe1c4); +reg_write( DDR_REG_BASE + 0x53092*4+0x02000000,0x1e00); +reg_write( DDR_REG_BASE + 0x53093*4+0x02000000,0x7005); +reg_write( DDR_REG_BASE + 0x53094*4+0x02000000,0x9003); +reg_write( DDR_REG_BASE + 0x53095*4+0x02000000,0xe004); +reg_write( DDR_REG_BASE + 0x53096*4+0x02000000,0xc007); +reg_write( DDR_REG_BASE + 0x53097*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x53098*4+0x02000000,0xdd2); +reg_write( DDR_REG_BASE + 0x53099*4+0x02000000,0xfeef); +reg_write( DDR_REG_BASE + 0x5309a*4+0x02000000,0x704c); +reg_write( DDR_REG_BASE + 0x5309b*4+0x02000000,0x4063); +reg_write( DDR_REG_BASE + 0x5309c*4+0x02000000,0xed2); +reg_write( DDR_REG_BASE + 0x5309d*4+0x02000000,0xfd6f); +reg_write( DDR_REG_BASE + 0x5309e*4+0x02000000,0x702c); +reg_write( DDR_REG_BASE + 0x5309f*4+0x02000000,0xc109); +reg_write( DDR_REG_BASE + 0x530a0*4+0x02000000,0x2055); +reg_write( DDR_REG_BASE + 0x530a1*4+0x02000000,0xd00); +reg_write( DDR_REG_BASE + 0x530a2*4+0x02000000,0x714c); +reg_write( DDR_REG_BASE + 0x530a3*4+0x02000000,0x7825); +reg_write( DDR_REG_BASE + 0x530a4*4+0x02000000,0xc107); +reg_write( DDR_REG_BASE + 0x530a5*4+0x02000000,0x89e); +reg_write( DDR_REG_BASE + 0x530a6*4+0x02000000,0xffef); +reg_write( DDR_REG_BASE + 0x530a7*4+0x02000000,0x706c); +reg_write( DDR_REG_BASE + 0x530a8*4+0x02000000,0xcca); +reg_write( DDR_REG_BASE + 0x530a9*4+0x02000000,0xfe4f); +reg_write( DDR_REG_BASE + 0x530aa*4+0x02000000,0xe8a); +reg_write( DDR_REG_BASE + 0x530ab*4+0x02000000,0xfecf); +reg_write( DDR_REG_BASE + 0x530ac*4+0x02000000,0x2480); +reg_write( DDR_REG_BASE + 0x530ad*4+0x02000000,0x3502); +reg_write( DDR_REG_BASE + 0x530ae*4+0x02000000,0x1404); +reg_write( DDR_REG_BASE + 0x530af*4+0x02000000,0x341b); +reg_write( DDR_REG_BASE + 0x530b0*4+0x02000000,0xc6c6); +reg_write( DDR_REG_BASE + 0x530b1*4+0x02000000,0x78e0); +reg_write( DDR_REG_BASE + 0x530b2*4+0x02000000,0xd8ff); +reg_write( DDR_REG_BASE + 0x530b3*4+0x02000000,0xd980); +reg_write( DDR_REG_BASE + 0x530b4*4+0x02000000,0x754c); +reg_write( DDR_REG_BASE + 0x530b5*4+0x02000000,0x746c); +reg_write( DDR_REG_BASE + 0x530b6*4+0x02000000,0x7ee0); +reg_write( DDR_REG_BASE + 0x530b7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530b8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530b9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530ba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530bb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530bc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530bd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530be*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530bf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530c0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530c1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530c2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530c3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530c4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530c5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530c6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530c7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530c8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530c9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530ca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530cb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530cc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530cd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530ce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530cf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530d0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530d1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530d2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530d3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530d4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530d5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530d6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530d7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530d8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530d9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530da*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530db*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530dc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530dd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530de*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530df*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530e0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530e1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530e2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530e3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530e4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530e5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530e6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530e7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530e8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530e9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530ea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530eb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530ec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530ed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530ee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530ef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530f0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530f1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530f2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530f3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530f4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530f5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530f6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530f7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530f8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530f9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530fa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530fb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530fc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530fd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530fe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x530ff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53100*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53101*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53102*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53103*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53104*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53105*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53106*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53107*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53108*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53109*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5310a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5310b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5310c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5310d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5310e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5310f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53110*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53111*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53112*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53113*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53114*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53115*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53116*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53117*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53118*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53119*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5311a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5311b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5311c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5311d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5311e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5311f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53120*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53121*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53122*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53123*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53124*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53125*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53126*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53127*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53128*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53129*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5312a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5312b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5312c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5312d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5312e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5312f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53130*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53131*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53132*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53133*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53134*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53135*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53136*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53137*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53138*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53139*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5313a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5313b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5313c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5313d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5313e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5313f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53140*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53141*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53142*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53143*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53144*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53145*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53146*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53147*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53148*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53149*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5314a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5314b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5314c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5314d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5314e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5314f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53150*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53151*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53152*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53153*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53154*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53155*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53156*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53157*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53158*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53159*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5315a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5315b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5315c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5315d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5315e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5315f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53160*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53161*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53162*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53163*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53164*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53165*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53166*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53167*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53168*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53169*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5316a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5316b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5316c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5316d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5316e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5316f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53170*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53171*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53172*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53173*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53174*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53175*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53176*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53177*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53178*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53179*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5317a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5317b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5317c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5317d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5317e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5317f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53180*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53181*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53182*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53183*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53184*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53185*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53186*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53187*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53188*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53189*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5318a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5318b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5318c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5318d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5318e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5318f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53190*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53191*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53192*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53193*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53194*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53195*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53196*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53197*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53198*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53199*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5319a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5319b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5319c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5319d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5319e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5319f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531a0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531a1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531a2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531a3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531a4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531a5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531a6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531a7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531a8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531a9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531aa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531ab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531ac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531ad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531ae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531af*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531b0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531b1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531b2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531b3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531b4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531b5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531b6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531b7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531b8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531b9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531ba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531bb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531bc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531bd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531be*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531bf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531c0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531c1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531c2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531c3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531c4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531c5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531c6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531c7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531c8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531c9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531ca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531cb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531cc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531cd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531ce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531cf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531d0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531d1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531d2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531d3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531d4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531d5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531d6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531d7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531d8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531d9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531da*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531db*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531dc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531dd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531de*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531df*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531e0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531e1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531e2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531e3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531e4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531e5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531e6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531e7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531e8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531e9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531ea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531eb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531ec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531ed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531ee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531ef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531f0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531f1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531f2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531f3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531f4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531f5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531f6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531f7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531f8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531f9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531fa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531fb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531fc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531fd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531fe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x531ff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53200*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53201*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53202*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53203*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53204*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53205*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53206*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53207*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53208*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53209*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5320a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5320b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5320c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5320d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5320e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5320f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53210*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53211*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53212*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53213*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53214*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53215*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53216*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53217*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53218*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53219*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5321a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5321b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5321c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5321d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5321e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5321f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53220*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53221*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53222*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53223*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53224*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53225*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53226*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53227*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53228*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53229*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5322a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5322b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5322c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5322d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5322e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5322f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53230*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53231*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53232*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53233*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53234*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53235*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53236*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53237*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53238*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53239*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5323a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5323b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5323c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5323d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5323e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5323f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53240*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53241*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53242*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53243*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53244*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53245*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53246*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53247*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53248*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53249*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5324a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5324b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5324c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5324d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5324e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5324f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53250*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53251*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53252*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53253*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53254*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53255*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53256*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53257*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53258*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53259*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5325a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5325b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5325c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5325d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5325e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5325f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53260*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53261*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53262*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53263*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53264*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53265*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53266*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53267*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53268*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53269*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5326a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5326b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5326c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5326d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5326e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5326f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53270*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53271*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53272*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53273*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53274*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53275*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53276*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53277*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53278*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53279*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5327a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5327b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5327c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5327d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5327e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5327f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53280*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53281*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53282*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53283*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53284*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53285*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53286*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53287*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53288*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53289*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5328a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5328b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5328c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5328d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5328e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5328f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53290*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53291*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53292*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53293*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53294*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53295*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53296*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53297*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53298*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53299*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5329a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5329b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5329c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5329d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5329e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5329f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532a0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532a1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532a2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532a3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532a4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532a5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532a6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532a7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532a8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532a9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532aa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532ab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532ac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532ad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532ae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532af*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532b0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532b1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532b2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532b3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532b4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532b5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532b6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532b7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532b8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532b9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532ba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532bb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532bc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532bd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532be*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532bf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532c0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532c1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532c2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532c3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532c4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532c5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532c6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532c7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532c8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532c9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532ca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532cb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532cc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532cd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532ce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532cf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532d0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532d1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532d2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532d3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532d4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532d5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532d6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532d7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532d8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532d9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532da*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532db*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532dc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532dd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532de*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532df*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532e0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532e1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532e2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532e3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532e4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532e5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532e6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532e7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532e8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532e9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532ea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532eb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532ec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532ed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532ee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532ef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532f0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532f1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532f2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532f3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532f4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532f5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532f6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532f7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532f8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532f9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532fa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532fb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532fc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532fd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532fe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x532ff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53300*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53301*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53302*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53303*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53304*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53305*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53306*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53307*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53308*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53309*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5330a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5330b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5330c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5330d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5330e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5330f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53310*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53311*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53312*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53313*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53314*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53315*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53316*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53317*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53318*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53319*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5331a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5331b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5331c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5331d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5331e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5331f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53320*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53321*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53322*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53323*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53324*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53325*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53326*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53327*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53328*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53329*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5332a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5332b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5332c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5332d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5332e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5332f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53330*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53331*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53332*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53333*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53334*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53335*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53336*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53337*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53338*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53339*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5333a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5333b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5333c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5333d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5333e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5333f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53340*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53341*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53342*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53343*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53344*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53345*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53346*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53347*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53348*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53349*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5334a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5334b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5334c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5334d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5334e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5334f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53350*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53351*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53352*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53353*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53354*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53355*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53356*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53357*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53358*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53359*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5335a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5335b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5335c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5335d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5335e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5335f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53360*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53361*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53362*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53363*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53364*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53365*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53366*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53367*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53368*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53369*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5336a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5336b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5336c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5336d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5336e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5336f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53370*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53371*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53372*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53373*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53374*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53375*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53376*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53377*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53378*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53379*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5337a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5337b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5337c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5337d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5337e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5337f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53380*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53381*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53382*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53383*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53384*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53385*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53386*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53387*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53388*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53389*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5338a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5338b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5338c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5338d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5338e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5338f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53390*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53391*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53392*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53393*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53394*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53395*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53396*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53397*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53398*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53399*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5339a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5339b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5339c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5339d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5339e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5339f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533a0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533a1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533a2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533a3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533a4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533a5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533a6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533a7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533a8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533a9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533aa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533ab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533ac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533ad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533ae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533af*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533b0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533b1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533b2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533b3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533b4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533b5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533b6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533b7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533b8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533b9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533ba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533bb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533bc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533bd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533be*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533bf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533c0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533c1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533c2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533c3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533c4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533c5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533c6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533c7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533c8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533c9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533ca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533cb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533cc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533cd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533ce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533cf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533d0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533d1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533d2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533d3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533d4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533d5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533d6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533d7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533d8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533d9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533da*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533db*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533dc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533dd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533de*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533df*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533e0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533e1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533e2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533e3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533e4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533e5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533e6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533e7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533e8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533e9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533ea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533eb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533ec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533ed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533ee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533ef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533f0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533f1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533f2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533f3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533f4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533f5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533f6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533f7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533f8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533f9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533fa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533fb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533fc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533fd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533fe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x533ff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53400*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53401*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53402*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53403*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53404*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53405*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53406*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53407*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53408*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53409*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5340a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5340b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5340c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5340d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5340e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5340f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53410*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53411*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53412*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53413*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53414*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53415*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53416*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53417*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53418*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53419*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5341a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5341b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5341c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5341d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5341e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5341f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53420*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53421*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53422*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53423*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53424*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53425*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53426*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53427*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53428*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53429*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5342a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5342b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5342c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5342d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5342e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5342f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53430*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53431*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53432*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53433*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53434*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53435*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53436*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53437*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53438*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53439*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5343a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5343b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5343c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5343d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5343e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5343f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53440*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53441*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53442*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53443*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53444*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53445*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53446*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53447*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53448*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53449*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5344a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5344b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5344c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5344d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5344e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5344f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53450*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53451*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53452*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53453*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53454*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53455*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53456*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53457*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53458*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53459*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5345a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5345b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5345c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5345d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5345e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5345f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53460*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53461*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53462*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53463*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53464*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53465*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53466*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53467*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53468*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53469*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5346a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5346b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5346c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5346d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5346e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5346f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53470*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53471*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53472*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53473*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53474*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53475*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53476*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53477*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53478*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53479*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5347a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5347b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5347c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5347d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5347e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5347f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53480*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53481*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53482*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53483*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53484*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53485*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53486*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53487*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53488*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53489*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5348a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5348b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5348c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5348d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5348e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5348f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53490*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53491*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53492*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53493*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53494*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53495*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53496*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53497*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53498*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53499*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5349a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5349b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5349c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5349d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5349e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5349f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534a0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534a1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534a2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534a3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534a4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534a5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534a6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534a7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534a8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534a9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534aa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534ab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534ac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534ad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534ae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534af*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534b0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534b1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534b2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534b3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534b4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534b5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534b6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534b7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534b8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534b9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534ba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534bb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534bc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534bd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534be*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534bf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534c0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534c1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534c2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534c3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534c4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534c5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534c6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534c7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534c8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534c9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534ca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534cb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534cc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534cd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534ce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534cf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534d0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534d1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534d2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534d3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534d4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534d5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534d6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534d7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534d8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534d9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534da*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534db*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534dc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534dd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534de*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534df*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534e0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534e1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534e2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534e3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534e4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534e5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534e6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534e7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534e8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534e9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534ea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534eb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534ec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534ed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534ee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534ef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534f0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534f1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534f2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534f3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534f4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534f5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534f6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534f7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534f8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534f9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534fa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534fb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534fc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534fd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534fe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x534ff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53500*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53501*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53502*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53503*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53504*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53505*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53506*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53507*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53508*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53509*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5350a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5350b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5350c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5350d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5350e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5350f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53510*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53511*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53512*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53513*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53514*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53515*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53516*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53517*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53518*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53519*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5351a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5351b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5351c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5351d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5351e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5351f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53520*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53521*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53522*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53523*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53524*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53525*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53526*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53527*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53528*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53529*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5352a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5352b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5352c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5352d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5352e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5352f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53530*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53531*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53532*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53533*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53534*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53535*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53536*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53537*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53538*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53539*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5353a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5353b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5353c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5353d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5353e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5353f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53540*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53541*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53542*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53543*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53544*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53545*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53546*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53547*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53548*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53549*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5354a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5354b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5354c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5354d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5354e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5354f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53550*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53551*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53552*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53553*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53554*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53555*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53556*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53557*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53558*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53559*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5355a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5355b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5355c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5355d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5355e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5355f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53560*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53561*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53562*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53563*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53564*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53565*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53566*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53567*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53568*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53569*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5356a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5356b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5356c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5356d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5356e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5356f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53570*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53571*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53572*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53573*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53574*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53575*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53576*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53577*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53578*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53579*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5357a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5357b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5357c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5357d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5357e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5357f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53580*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53581*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53582*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53583*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53584*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53585*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53586*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53587*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53588*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53589*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5358a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5358b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5358c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5358d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5358e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5358f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53590*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53591*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53592*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53593*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53594*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53595*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53596*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53597*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53598*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53599*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5359a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5359b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5359c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5359d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5359e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5359f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535a0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535a1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535a2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535a3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535a4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535a5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535a6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535a7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535a8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535a9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535aa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535ab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535ac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535ad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535ae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535af*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535b0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535b1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535b2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535b3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535b4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535b5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535b6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535b7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535b8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535b9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535ba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535bb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535bc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535bd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535be*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535bf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535c0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535c1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535c2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535c3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535c4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535c5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535c6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535c7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535c8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535c9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535ca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535cb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535cc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535cd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535ce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535cf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535d0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535d1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535d2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535d3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535d4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535d5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535d6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535d7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535d8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535d9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535da*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535db*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535dc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535dd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535de*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535df*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535e0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535e1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535e2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535e3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535e4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535e5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535e6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535e7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535e8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535e9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535ea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535eb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535ec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535ed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535ee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535ef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535f0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535f1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535f2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535f3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535f4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535f5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535f6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535f7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535f8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535f9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535fa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535fb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535fc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535fd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535fe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x535ff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53600*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53601*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53602*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53603*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53604*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53605*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53606*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53607*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53608*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53609*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5360a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5360b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5360c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5360d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5360e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5360f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53610*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53611*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53612*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53613*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53614*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53615*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53616*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53617*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53618*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53619*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5361a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5361b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5361c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5361d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5361e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5361f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53620*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53621*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53622*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53623*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53624*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53625*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53626*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53627*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53628*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53629*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5362a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5362b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5362c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5362d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5362e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5362f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53630*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53631*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53632*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53633*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53634*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53635*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53636*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53637*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53638*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53639*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5363a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5363b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5363c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5363d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5363e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5363f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53640*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53641*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53642*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53643*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53644*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53645*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53646*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53647*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53648*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53649*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5364a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5364b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5364c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5364d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5364e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5364f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53650*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53651*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53652*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53653*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53654*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53655*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53656*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53657*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53658*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53659*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5365a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5365b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5365c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5365d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5365e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5365f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53660*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53661*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53662*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53663*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53664*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53665*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53666*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53667*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53668*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53669*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5366a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5366b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5366c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5366d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5366e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5366f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53670*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53671*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53672*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53673*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53674*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53675*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53676*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53677*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53678*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53679*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5367a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5367b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5367c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5367d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5367e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5367f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53680*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53681*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53682*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53683*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53684*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53685*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53686*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53687*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53688*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53689*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5368a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5368b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5368c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5368d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5368e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5368f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53690*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53691*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53692*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53693*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53694*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53695*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53696*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53697*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53698*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53699*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5369a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5369b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5369c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5369d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5369e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5369f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536a0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536a1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536a2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536a3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536a4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536a5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536a6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536a7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536a8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536a9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536aa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536ab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536ac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536ad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536ae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536af*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536b0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536b1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536b2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536b3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536b4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536b5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536b6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536b7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536b8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536b9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536ba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536bb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536bc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536bd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536be*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536bf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536c0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536c1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536c2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536c3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536c4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536c5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536c6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536c7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536c8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536c9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536ca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536cb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536cc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536cd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536ce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536cf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536d0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536d1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536d2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536d3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536d4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536d5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536d6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536d7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536d8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536d9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536da*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536db*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536dc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536dd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536de*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536df*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536e0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536e1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536e2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536e3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536e4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536e5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536e6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536e7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536e8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536e9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536ea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536eb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536ec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536ed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536ee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536ef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536f0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536f1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536f2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536f3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536f4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536f5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536f6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536f7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536f8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536f9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536fa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536fb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536fc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536fd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536fe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x536ff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53700*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53701*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53702*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53703*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53704*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53705*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53706*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53707*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53708*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53709*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5370a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5370b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5370c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5370d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5370e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5370f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53710*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53711*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53712*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53713*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53714*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53715*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53716*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53717*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53718*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53719*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5371a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5371b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5371c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5371d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5371e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5371f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53720*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53721*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53722*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53723*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53724*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53725*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53726*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53727*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53728*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53729*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5372a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5372b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5372c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5372d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5372e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5372f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53730*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53731*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53732*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53733*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53734*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53735*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53736*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53737*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53738*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53739*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5373a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5373b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5373c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5373d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5373e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5373f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53740*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53741*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53742*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53743*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53744*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53745*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53746*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53747*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53748*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53749*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5374a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5374b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5374c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5374d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5374e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5374f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53750*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53751*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53752*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53753*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53754*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53755*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53756*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53757*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53758*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53759*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5375a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5375b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5375c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5375d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5375e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5375f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53760*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53761*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53762*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53763*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53764*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53765*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53766*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53767*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53768*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53769*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5376a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5376b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5376c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5376d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5376e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5376f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53770*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53771*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53772*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53773*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53774*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53775*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53776*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53777*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53778*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53779*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5377a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5377b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5377c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5377d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5377e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5377f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53780*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53781*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53782*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53783*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53784*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53785*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53786*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53787*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53788*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53789*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5378a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5378b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5378c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5378d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5378e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5378f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53790*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53791*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53792*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53793*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53794*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53795*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53796*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53797*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53798*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53799*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5379a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5379b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5379c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5379d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5379e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5379f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537a0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537a1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537a2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537a3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537a4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537a5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537a6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537a7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537a8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537a9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537aa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537ab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537ac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537ad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537ae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537af*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537b0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537b1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537b2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537b3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537b4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537b5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537b6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537b7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537b8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537b9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537ba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537bb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537bc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537bd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537be*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537bf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537c0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537c1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537c2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537c3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537c4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537c5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537c6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537c7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537c8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537c9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537ca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537cb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537cc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537cd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537ce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537cf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537d0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537d1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537d2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537d3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537d4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537d5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537d6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537d7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537d8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537d9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537da*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537db*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537dc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537dd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537de*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537df*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537e0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537e1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537e2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537e3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537e4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537e5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537e6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537e7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537e8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537e9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537ea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537eb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537ec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537ed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537ee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537ef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537f0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537f1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537f2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537f3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537f4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537f5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537f6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537f7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537f8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537f9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537fa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537fb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537fc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537fd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537fe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x537ff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53800*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53801*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53802*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53803*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53804*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53805*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53806*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53807*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53808*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53809*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5380a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5380b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5380c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5380d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5380e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5380f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53810*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53811*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53812*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53813*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53814*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53815*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53816*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53817*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53818*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53819*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5381a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5381b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5381c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5381d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5381e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5381f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53820*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53821*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53822*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53823*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53824*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53825*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53826*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53827*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53828*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53829*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5382a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5382b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5382c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5382d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5382e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5382f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53830*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53831*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53832*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53833*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53834*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53835*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53836*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53837*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53838*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53839*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5383a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5383b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5383c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5383d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5383e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5383f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53840*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53841*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53842*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53843*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53844*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53845*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53846*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53847*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53848*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53849*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5384a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5384b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5384c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5384d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5384e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5384f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53850*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53851*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53852*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53853*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53854*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53855*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53856*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53857*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53858*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53859*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5385a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5385b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5385c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5385d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5385e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5385f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53860*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53861*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53862*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53863*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53864*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53865*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53866*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53867*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53868*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53869*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5386a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5386b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5386c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5386d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5386e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5386f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53870*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53871*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53872*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53873*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53874*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53875*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53876*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53877*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53878*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53879*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5387a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5387b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5387c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5387d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5387e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5387f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53880*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53881*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53882*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53883*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53884*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53885*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53886*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53887*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53888*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53889*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5388a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5388b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5388c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5388d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5388e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5388f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53890*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53891*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53892*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53893*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53894*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53895*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53896*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53897*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53898*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53899*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5389a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5389b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5389c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5389d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5389e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5389f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538a0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538a1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538a2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538a3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538a4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538a5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538a6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538a7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538a8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538a9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538aa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538ab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538ac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538ad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538ae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538af*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538b0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538b1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538b2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538b3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538b4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538b5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538b6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538b7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538b8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538b9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538ba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538bb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538bc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538bd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538be*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538bf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538c0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538c1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538c2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538c3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538c4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538c5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538c6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538c7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538c8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538c9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538ca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538cb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538cc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538cd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538ce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538cf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538d0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538d1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538d2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538d3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538d4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538d5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538d6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538d7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538d8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538d9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538da*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538db*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538dc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538dd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538de*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538df*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538e0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538e1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538e2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538e3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538e4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538e5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538e6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538e7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538e8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538e9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538ea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538eb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538ec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538ed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538ee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538ef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538f0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538f1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538f2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538f3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538f4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538f5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538f6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538f7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538f8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538f9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538fa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538fb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538fc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538fd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538fe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x538ff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53900*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53901*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53902*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53903*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53904*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53905*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53906*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53907*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53908*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53909*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5390a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5390b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5390c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5390d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5390e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5390f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53910*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53911*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53912*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53913*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53914*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53915*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53916*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53917*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53918*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53919*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5391a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5391b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5391c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5391d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5391e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5391f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53920*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53921*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53922*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53923*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53924*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53925*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53926*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53927*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53928*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53929*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5392a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5392b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5392c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5392d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5392e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5392f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53930*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53931*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53932*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53933*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53934*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53935*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53936*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53937*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53938*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53939*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5393a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5393b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5393c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5393d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5393e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5393f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53940*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53941*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53942*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53943*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53944*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53945*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53946*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53947*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53948*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53949*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5394a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5394b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5394c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5394d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5394e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5394f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53950*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53951*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53952*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53953*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53954*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53955*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53956*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53957*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53958*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53959*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5395a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5395b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5395c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5395d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5395e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5395f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53960*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53961*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53962*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53963*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53964*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53965*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53966*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53967*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53968*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53969*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5396a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5396b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5396c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5396d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5396e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5396f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53970*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53971*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53972*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53973*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53974*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53975*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53976*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53977*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53978*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53979*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5397a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5397b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5397c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5397d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5397e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5397f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53980*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53981*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53982*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53983*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53984*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53985*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53986*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53987*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53988*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53989*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5398a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5398b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5398c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5398d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5398e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5398f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53990*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53991*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53992*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53993*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53994*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53995*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53996*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53997*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53998*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53999*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5399a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5399b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5399c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5399d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5399e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5399f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539a0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539a1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539a2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539a3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539a4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539a5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539a6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539a7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539a8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539a9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539aa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539ab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539ac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539ad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539ae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539af*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539b0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539b1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539b2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539b3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539b4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539b5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539b6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539b7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539b8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539b9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539ba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539bb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539bc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539bd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539be*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539bf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539c0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539c1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539c2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539c3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539c4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539c5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539c6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539c7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539c8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539c9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539ca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539cb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539cc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539cd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539ce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539cf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539d0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539d1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539d2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539d3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539d4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539d5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539d6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539d7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539d8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539d9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539da*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539db*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539dc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539dd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539de*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539df*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539e0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539e1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539e2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539e3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539e4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539e5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539e6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539e7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539e8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539e9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539ea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539eb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539ec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539ed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539ee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539ef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539f0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539f1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539f2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539f3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539f4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539f5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539f6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539f7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539f8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539f9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539fa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539fb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539fc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539fd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539fe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x539ff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a00*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a01*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a02*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a03*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a04*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a05*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a06*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a07*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a08*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a09*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a0a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a0b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a0c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a0d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a0e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a0f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a10*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a11*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a12*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a13*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a14*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a15*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a16*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a17*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a18*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a19*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a1a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a1b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a1c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a1d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a1e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a1f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a20*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a21*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a22*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a23*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a24*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a25*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a26*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a27*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a28*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a29*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a2a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a2b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a2c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a2d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a2e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a2f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a30*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a31*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a32*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a33*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a34*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a35*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a36*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a37*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a38*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a39*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a3a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a3b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a3c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a3d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a3e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a3f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a40*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a41*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a42*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a43*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a44*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a45*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a46*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a47*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a48*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a49*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a4a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a4b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a4c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a4d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a4e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a4f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a50*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a51*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a52*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a53*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a54*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a55*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a56*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a57*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a58*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a59*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a5a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a5b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a5c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a5d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a5e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a5f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a60*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a61*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a62*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a63*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a64*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a65*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a66*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a67*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a68*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a69*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a6a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a6b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a6c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a6d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a6e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a6f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a70*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a71*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a72*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a73*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a74*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a75*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a76*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a77*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a78*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a79*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a7a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a7b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a7c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a7d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a7e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a7f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a80*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a81*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a82*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a83*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a84*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a85*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a86*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a87*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a88*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a89*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a8a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a8b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a8c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a8d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a8e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a8f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a90*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a91*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a92*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a93*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a94*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a95*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a96*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a97*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a98*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a99*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a9a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a9b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a9c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a9d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a9e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53a9f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53aa0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53aa1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53aa2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53aa3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53aa4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53aa5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53aa6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53aa7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53aa8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53aa9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53aaa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53aab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53aac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53aad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53aae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53aaf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ab0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ab1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ab2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ab3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ab4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ab5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ab6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ab7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ab8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ab9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53aba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53abb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53abc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53abd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53abe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53abf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ac0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ac1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ac2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ac3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ac4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ac5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ac6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ac7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ac8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ac9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53aca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53acb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53acc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53acd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ace*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53acf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ad0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ad1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ad2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ad3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ad4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ad5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ad6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ad7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ad8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ad9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ada*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53adb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53adc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53add*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ade*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53adf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ae0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ae1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ae2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ae3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ae4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ae5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ae6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ae7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ae8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ae9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53aea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53aeb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53aec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53aed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53aee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53aef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53af0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53af1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53af2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53af3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53af4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53af5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53af6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53af7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53af8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53af9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53afa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53afb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53afc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53afd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53afe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53aff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b00*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b01*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b02*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b03*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b04*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b05*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b06*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b07*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b08*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b09*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b0a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b0b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b0c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b0d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b0e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b0f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b10*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b11*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b12*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b13*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b14*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b15*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b16*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b17*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b18*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b19*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b1a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b1b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b1c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b1d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b1e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b1f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b20*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b21*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b22*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b23*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b24*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b25*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b26*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b27*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b28*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b29*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b2a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b2b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b2c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b2d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b2e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b2f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b30*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b31*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b32*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b33*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b34*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b35*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b36*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b37*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b38*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b39*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b3a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b3b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b3c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b3d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b3e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b3f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b40*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b41*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b42*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b43*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b44*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b45*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b46*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b47*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b48*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b49*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b4a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b4b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b4c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b4d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b4e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b4f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b50*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b51*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b52*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b53*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b54*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b55*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b56*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b57*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b58*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b59*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b5a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b5b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b5c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b5d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b5e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b5f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b60*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b61*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b62*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b63*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b64*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b65*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b66*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b67*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b68*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b69*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b6a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b6b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b6c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b6d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b6e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b6f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b70*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b71*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b72*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b73*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b74*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b75*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b76*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b77*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b78*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b79*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b7a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b7b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b7c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b7d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b7e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b7f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b80*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b81*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b82*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b83*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b84*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b85*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b86*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b87*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b88*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b89*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b8a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b8b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b8c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b8d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b8e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b8f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b90*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b91*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b92*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b93*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b94*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b95*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b96*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b97*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b98*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b99*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b9a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b9b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b9c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b9d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b9e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53b9f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ba0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ba1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ba2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ba3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ba4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ba5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ba6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ba7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ba8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ba9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53baa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53baf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bb0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bb1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bb2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bb3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bb4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bb5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bb6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bb7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bb8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bb9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bbb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bbc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bbd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bbe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bbf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bc0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bc1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bc2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bc3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bc4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bc5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bc6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bc7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bc8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bc9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bcb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bcc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bcd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bcf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bd0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bd1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bd2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bd3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bd4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bd5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bd6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bd7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bd8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bd9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bda*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bdb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bdc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bdd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bde*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bdf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53be0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53be1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53be2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53be3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53be4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53be5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53be6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53be7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53be8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53be9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53beb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bf0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bf1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bf2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bf3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bf4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bf5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bf6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bf7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bf8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bf9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bfa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bfb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bfc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bfd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bfe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53bff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c00*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c01*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c02*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c03*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c04*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c05*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c06*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c07*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c08*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c09*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c0a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c0b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c0c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c0d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c0e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c0f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c10*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c11*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c12*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c13*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c14*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c15*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c16*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c17*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c18*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c19*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c1a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c1b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c1c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c1d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c1e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c1f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c20*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c21*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c22*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c23*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c24*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c25*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c26*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c27*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c28*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c29*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c2a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c2b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c2c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c2d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c2e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c2f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c30*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c31*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c32*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c33*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c34*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c35*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c36*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c37*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c38*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c39*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c3a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c3b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c3c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c3d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c3e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c3f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c40*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c41*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c42*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c43*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c44*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c45*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c46*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c47*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c48*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c49*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c4a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c4b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c4c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c4d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c4e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c4f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c50*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c51*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c52*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c53*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c54*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c55*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c56*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c57*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c58*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c59*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c5a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c5b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c5c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c5d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c5e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c5f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c60*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c61*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c62*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c63*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c64*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c65*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c66*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c67*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c68*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c69*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c6a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c6b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c6c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c6d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c6e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c6f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c70*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c71*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c72*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c73*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c74*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c75*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c76*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c77*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c78*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c79*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c7a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c7b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c7c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c7d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c7e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c7f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c80*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c81*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c82*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c83*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c84*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c85*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c86*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c87*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c88*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c89*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c8a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c8b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c8c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c8d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c8e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c8f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c90*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c91*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c92*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c93*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c94*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c95*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c96*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c97*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c98*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c99*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c9a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c9b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c9c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c9d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c9e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53c9f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ca0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ca1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ca2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ca3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ca4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ca5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ca6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ca7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ca8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ca9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53caa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53caf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cb0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cb1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cb2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cb3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cb4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cb5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cb6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cb7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cb8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cb9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cbb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cbc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cbd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cbe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cbf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cc0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cc1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cc2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cc3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cc4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cc5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cc6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cc7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cc8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cc9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ccb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ccc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ccd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ccf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cd0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cd1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cd2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cd3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cd4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cd5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cd6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cd7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cd8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cd9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cda*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cdb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cdc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cdd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cde*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cdf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ce0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ce1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ce2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ce3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ce4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ce5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ce6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ce7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ce8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ce9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ceb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ced*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cf0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cf1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cf2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cf3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cf4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cf5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cf6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cf7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cf8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cf9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cfa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cfb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cfc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cfd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cfe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53cff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d00*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d01*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d02*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d03*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d04*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d05*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d06*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d07*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d08*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d09*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d0a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d0b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d0c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d0d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d0e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d0f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d10*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d11*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d12*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d13*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d14*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d15*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d16*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d17*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d18*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d19*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d1a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d1b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d1c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d1d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d1e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d1f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d20*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d21*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d22*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d23*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d24*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d25*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d26*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d27*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d28*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d29*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d2a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d2b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d2c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d2d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d2e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d2f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d30*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d31*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d32*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d33*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d34*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d35*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d36*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d37*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d38*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d39*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d3a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d3b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d3c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d3d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d3e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d3f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d40*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d41*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d42*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d43*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d44*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d45*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d46*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d47*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d48*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d49*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d4a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d4b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d4c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d4d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d4e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d4f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d50*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d51*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d52*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d53*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d54*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d55*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d56*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d57*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d58*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d59*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d5a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d5b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d5c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d5d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d5e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d5f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d60*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d61*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d62*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d63*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d64*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d65*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d66*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d67*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d68*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d69*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d6a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d6b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d6c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d6d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d6e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d6f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d70*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d71*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d72*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d73*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d74*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d75*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d76*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d77*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d78*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d79*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d7a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d7b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d7c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d7d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d7e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d7f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d80*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d81*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d82*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d83*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d84*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d85*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d86*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d87*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d88*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d89*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d8a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d8b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d8c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d8d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d8e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d8f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d90*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d91*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d92*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d93*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d94*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d95*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d96*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d97*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d98*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d99*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d9a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d9b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d9c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d9d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d9e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53d9f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53da0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53da1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53da2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53da3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53da4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53da5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53da6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53da7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53da8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53da9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53daa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53daf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53db0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53db1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53db2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53db3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53db4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53db5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53db6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53db7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53db8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53db9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dbb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dbc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dbd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dbe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dbf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dc0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dc1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dc2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dc3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dc4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dc5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dc6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dc7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dc8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dc9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dcb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dcc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dcd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dcf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dd0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dd1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dd2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dd3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dd4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dd5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dd6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dd7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dd8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dd9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dda*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ddb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ddc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ddd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dde*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ddf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53de0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53de1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53de2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53de3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53de4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53de5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53de6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53de7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53de8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53de9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53deb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ded*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53def*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53df0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53df1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53df2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53df3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53df4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53df5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53df6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53df7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53df8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53df9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dfa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dfb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dfc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dfd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dfe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53dff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e00*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e01*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e02*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e03*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e04*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e05*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e06*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e07*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e08*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e09*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e0a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e0b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e0c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e0d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e0e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e0f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e10*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e11*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e12*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e13*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e14*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e15*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e16*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e17*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e18*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e19*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e1a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e1b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e1c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e1d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e1e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e1f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e20*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e21*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e22*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e23*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e24*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e25*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e26*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e27*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e28*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e29*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e2a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e2b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e2c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e2d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e2e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e2f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e30*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e31*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e32*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e33*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e34*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e35*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e36*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e37*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e38*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e39*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e3a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e3b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e3c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e3d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e3e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e3f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e40*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e41*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e42*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e43*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e44*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e45*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e46*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e47*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e48*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e49*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e4a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e4b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e4c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e4d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e4e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e4f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e50*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e51*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e52*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e53*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e54*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e55*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e56*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e57*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e58*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e59*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e5a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e5b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e5c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e5d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e5e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e5f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e60*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e61*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e62*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e63*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e64*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e65*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e66*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e67*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e68*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e69*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e6a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e6b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e6c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e6d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e6e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e6f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e70*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e71*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e72*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e73*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e74*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e75*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e76*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e77*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e78*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e79*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e7a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e7b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e7c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e7d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e7e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e7f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e80*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e81*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e82*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e83*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e84*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e85*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e86*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e87*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e88*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e89*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e8a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e8b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e8c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e8d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e8e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e8f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e90*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e91*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e92*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e93*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e94*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e95*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e96*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e97*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e98*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e99*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e9a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e9b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e9c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e9d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e9e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53e9f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ea0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ea1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ea2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ea3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ea4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ea5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ea6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ea7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ea8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ea9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53eaa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53eab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53eac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ead*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53eae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53eaf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53eb0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53eb1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53eb2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53eb3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53eb4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53eb5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53eb6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53eb7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53eb8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53eb9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53eba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ebb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ebc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ebd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ebe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ebf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ec0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ec1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ec2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ec3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ec4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ec5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ec6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ec7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ec8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ec9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53eca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ecb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ecc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ecd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ece*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ecf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ed0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ed1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ed2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ed3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ed4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ed5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ed6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ed7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ed8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ed9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53eda*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53edb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53edc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53edd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ede*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53edf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ee0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ee1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ee2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ee3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ee4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ee5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ee6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ee7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ee8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ee9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53eea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53eeb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53eec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53eed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53eee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53eef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ef0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ef1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ef2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ef3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ef4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ef5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ef6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ef7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ef8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ef9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53efa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53efb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53efc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53efd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53efe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53eff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f00*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f01*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f02*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f03*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f04*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f05*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f06*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f07*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f08*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f09*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f0a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f0b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f0c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f0d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f0e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f0f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f10*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f11*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f12*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f13*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f14*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f15*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f16*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f17*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f18*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f19*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f1a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f1b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f1c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f1d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f1e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f1f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f20*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f21*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f22*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f23*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f24*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f25*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f26*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f27*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f28*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f29*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f2a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f2b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f2c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f2d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f2e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f2f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f30*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f31*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f32*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f33*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f34*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f35*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f36*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f37*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f38*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f39*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f3a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f3b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f3c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f3d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f3e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f3f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f40*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f41*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f42*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f43*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f44*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f45*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f46*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f47*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f48*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f49*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f4a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f4b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f4c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f4d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f4e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f4f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f50*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f51*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f52*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f53*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f54*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f55*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f56*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f57*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f58*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f59*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f5a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f5b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f5c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f5d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f5e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f5f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f60*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f61*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f62*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f63*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f64*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f65*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f66*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f67*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f68*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f69*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f6a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f6b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f6c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f6d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f6e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f6f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f70*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f71*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f72*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f73*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f74*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f75*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f76*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f77*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f78*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f79*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f7a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f7b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f7c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f7d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f7e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f7f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f80*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f81*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f82*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f83*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f84*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f85*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f86*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f87*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f88*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f89*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f8a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f8b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f8c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f8d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f8e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f8f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f90*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f91*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f92*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f93*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f94*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f95*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f96*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f97*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f98*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f99*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f9a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f9b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f9c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f9d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f9e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53f9f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fa0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fa1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fa2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fa3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fa4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fa5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fa6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fa7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fa8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fa9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53faa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53faf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fb0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fb1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fb2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fb3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fb4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fb5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fb6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fb7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fb8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fb9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fbb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fbc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fbd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fbe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fbf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fc0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fc1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fc2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fc3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fc4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fc5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fc6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fc7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fc8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fc9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fcb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fcc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fcd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fcf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fd0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fd1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fd2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fd3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fd4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fd5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fd6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fd7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fd8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fd9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fda*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fdb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fdc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fdd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fde*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fdf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fe0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fe1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fe2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fe3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fe4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fe5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fe6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fe7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fe8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fe9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53feb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ff0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ff1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ff2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ff3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ff4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ff5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ff6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ff7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ff8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ff9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ffa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ffb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ffc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ffd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53ffe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x53fff*4+0x02000000,0x0); + +reg_write( DDR_REG_BASE + 0xd0000*4+0x02000000,0x1); + +reg_write( DDR_REG_BASE + 0xd0000*4+0x02000000,0x0); + +reg_write( DDR_REG_BASE + 0x54000*4+0x02000000,0x000); //hyg +reg_write( DDR_REG_BASE + 0x54001*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54002*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54003*4+0x02000000,0x320); +reg_write( DDR_REG_BASE + 0x54004*4+0x02000000,0x2); +reg_write( DDR_REG_BASE + 0x54005*4+0x02000000,0x0); + +//iteration place +//PHY VREF +// 0x40 50% +// 0x60 75% +// 0x56 67% +// 0x20 25% +reg_write( DDR_REG_BASE + 0x54006*4+0x02000000,0x60);//hyg + + +reg_write( DDR_REG_BASE + 0x54007*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54008*4+0x02000000,0x131f); +reg_write( DDR_REG_BASE + 0x54009*4+0x02000000,0xc8); +reg_write( DDR_REG_BASE + 0x5400a*4+0x02000000,0x2); +reg_write( DDR_REG_BASE + 0x5400b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5400d*4+0x02000000,0x8083); +reg_write( DDR_REG_BASE + 0x5400c*4+0x02000000,0x8182); + +//reg_write( DDR_REG_BASE + 0x5400d*4+0x02000000,0x8280); +//reg_write( DDR_REG_BASE + 0x5400c*4+0x02000000,0x8183); +reg_write( DDR_REG_BASE + 0x5400e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5400f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54010*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54011*4+0x02000000,0x120); +reg_write( DDR_REG_BASE + 0x54012*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54013*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54014*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54015*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54016*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54017*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54018*4+0x02000000,0x8300); + +// iteration place +// DRAM DSEL Output Impedance -higher 8 bit +// MR3_A0/A1/B0/B1 + //0x2:(default: output driver impedance 40 pulldown&pullup) + //0x1:(34.3 pulldown&pullup ) + //0x3:(48) + //0x4:(reserve for 60) optional + //0x6:(reserve for 80) optional + //0x9:(34.3 pulldown & 40 pull up + //0xa:(40 pulldown & 48 pull up + //0xb:(34.3 pulldown & 48 pull up +reg_write( DDR_REG_BASE + 0x54019*4+0x02000000,0x0206); +reg_write( DDR_REG_BASE + 0x5401d*4+0x02000000,0x0206); +reg_write( DDR_REG_BASE + 0x5402c*4+0x02000000,0x0206); +reg_write( DDR_REG_BASE + 0x54030*4+0x02000000,0x0206); + +//iteration place +//DRAM DQ ODT -higher 8 bit + //0x0:(default: DQ odt disable) + //0x5:(ODT:60) + //0x6:(ODT:120) + //0x7:(ODT:240) +reg_write( DDR_REG_BASE + 0x5401a*4+0x02000000,0x0600); +reg_write( DDR_REG_BASE + 0x5401e*4+0x02000000,0x0600); +reg_write( DDR_REG_BASE + 0x5402d*4+0x02000000,0x0600); +reg_write( DDR_REG_BASE + 0x54031*4+0x02000000,0x0600); + +reg_write( DDR_REG_BASE + 0x5401b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5401c*4+0x02000000,0x8300); + + +reg_write( DDR_REG_BASE + 0x5401f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54020*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54021*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54022*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54023*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54024*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54025*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54026*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54027*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54028*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54029*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5402a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5402b*4+0x02000000,0x8300); + + +reg_write( DDR_REG_BASE + 0x5402e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5402f*4+0x02000000,0x8300); + + +reg_write( DDR_REG_BASE + 0x54032*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54033*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54034*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54035*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54036*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54037*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54038*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54039*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5403a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5403b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5403c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5403d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5403e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5403f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54040*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54041*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54042*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54043*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54044*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54045*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54046*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54047*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54048*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54049*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5404a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5404b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5404c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5404d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5404e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5404f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54050*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54051*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54052*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54053*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54054*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54055*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54056*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54057*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54058*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54059*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5405a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5405b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5405c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5405d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5405e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5405f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54060*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54061*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54062*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54063*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54064*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54065*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54066*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54067*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54068*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54069*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5406a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5406b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5406c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5406d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5406e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5406f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54070*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54071*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54072*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54073*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54074*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54075*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54076*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54077*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54078*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54079*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5407a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5407b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5407c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5407d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5407e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5407f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54080*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54081*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54082*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54083*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54084*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54085*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54086*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54087*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54088*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54089*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5408a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5408b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5408c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5408d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5408e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5408f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54090*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54091*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54092*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54093*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54094*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54095*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54096*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54097*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54098*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54099*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5409a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5409b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5409c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5409d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5409e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5409f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540a0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540a1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540a2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540a3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540a4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540a5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540a6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540a7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540a8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540a9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540aa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540ab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540ac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540ad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540ae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540af*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540b0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540b1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540b2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540b3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540b4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540b5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540b6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540b7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540b8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540b9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540ba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540bb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540bc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540bd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540be*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540bf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540c0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540c1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540c2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540c3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540c4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540c5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540c6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540c7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540c8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540c9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540ca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540cb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540cc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540cd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540ce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540cf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540d0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540d1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540d2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540d3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540d4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540d5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540d6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540d7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540d8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540d9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540da*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540db*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540dc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540dd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540de*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540df*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540e0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540e1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540e2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540e3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540e4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540e5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540e6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540e7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540e8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540e9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540ea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540eb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540ec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540ed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540ee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540ef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540f0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540f1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540f2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540f3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540f4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540f5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540f6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540f7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540f8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540f9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540fa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540fb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540fc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540fd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540fe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x540ff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54100*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54101*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54102*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54103*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54104*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54105*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54106*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54107*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54108*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54109*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5410a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5410b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5410c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5410d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5410e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5410f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54110*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54111*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54112*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54113*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54114*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54115*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54116*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54117*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54118*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54119*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5411a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5411b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5411c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5411d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5411e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5411f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54120*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54121*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54122*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54123*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54124*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54125*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54126*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54127*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54128*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54129*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5412a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5412b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5412c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5412d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5412e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5412f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54130*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54131*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54132*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54133*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54134*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54135*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54136*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54137*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54138*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54139*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5413a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5413b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5413c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5413d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5413e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5413f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54140*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54141*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54142*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54143*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54144*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54145*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54146*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54147*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54148*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54149*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5414a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5414b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5414c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5414d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5414e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5414f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54150*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54151*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54152*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54153*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54154*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54155*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54156*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54157*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54158*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54159*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5415a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5415b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5415c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5415d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5415e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5415f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54160*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54161*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54162*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54163*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54164*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54165*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54166*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54167*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54168*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54169*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5416a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5416b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5416c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5416d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5416e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5416f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54170*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54171*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54172*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54173*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54174*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54175*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54176*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54177*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54178*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54179*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5417a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5417b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5417c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5417d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5417e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5417f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54180*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54181*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54182*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54183*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54184*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54185*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54186*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54187*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54188*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54189*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5418a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5418b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5418c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5418d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5418e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5418f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54190*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54191*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54192*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54193*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54194*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54195*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54196*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54197*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54198*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54199*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5419a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5419b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5419c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5419d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5419e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5419f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541a0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541a1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541a2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541a3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541a4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541a5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541a6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541a7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541a8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541a9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541aa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541ab*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541ac*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541ad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541ae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541af*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541b0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541b1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541b2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541b3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541b4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541b5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541b6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541b7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541b8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541b9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541ba*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541bb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541bc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541bd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541be*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541bf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541c0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541c1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541c2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541c3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541c4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541c5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541c6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541c7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541c8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541c9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541ca*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541cb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541cc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541cd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541ce*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541cf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541d0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541d1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541d2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541d3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541d4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541d5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541d6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541d7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541d8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541d9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541da*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541db*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541dc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541dd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541de*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541df*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541e0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541e1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541e2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541e3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541e4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541e5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541e6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541e7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541e8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541e9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541ea*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541eb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541ec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541ed*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541ee*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541ef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541f0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541f1*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541f2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541f3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541f4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541f5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541f6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541f7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541f8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541f9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541fa*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541fb*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541fc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541fd*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541fe*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x541ff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54200*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54201*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54202*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54203*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54204*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54205*4+0x02000000,0xff); +reg_write( DDR_REG_BASE + 0x54206*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54207*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54208*4+0x02000000,0x14a); +reg_write( DDR_REG_BASE + 0x54209*4+0x02000000,0x181); +reg_write( DDR_REG_BASE + 0x5420a*4+0x02000000,0x118); +reg_write( DDR_REG_BASE + 0x5420b*4+0x02000000,0x118); +reg_write( DDR_REG_BASE + 0x5420c*4+0x02000000,0x16f); +reg_write( DDR_REG_BASE + 0x5420d*4+0x02000000,0x16f); +reg_write( DDR_REG_BASE + 0x5420e*4+0x02000000,0x159); +reg_write( DDR_REG_BASE + 0x5420f*4+0x02000000,0x181); +reg_write( DDR_REG_BASE + 0x54210*4+0x02000000,0x120); +reg_write( DDR_REG_BASE + 0x54211*4+0x02000000,0x120); +reg_write( DDR_REG_BASE + 0x54212*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54213*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54214*4+0x02000000,0x701c); +reg_write( DDR_REG_BASE + 0x54215*4+0x02000000,0x61a8); +reg_write( DDR_REG_BASE + 0x54216*4+0x02000000,0x35ac); +reg_write( DDR_REG_BASE + 0x54217*4+0x02000000,0x35ac); +reg_write( DDR_REG_BASE + 0x54218*4+0x02000000,0x125c); +reg_write( DDR_REG_BASE + 0x54219*4+0x02000000,0x125c); +reg_write( DDR_REG_BASE + 0x5421a*4+0x02000000,0xc738); +reg_write( DDR_REG_BASE + 0x5421b*4+0x02000000,0xb0f4); +reg_write( DDR_REG_BASE + 0x5421c*4+0x02000000,0x6590); +reg_write( DDR_REG_BASE + 0x5421d*4+0x02000000,0x6590); +reg_write( DDR_REG_BASE + 0x5421e*4+0x02000000,0x9f38); +reg_write( DDR_REG_BASE + 0x5421f*4+0x02000000,0x58); +reg_write( DDR_REG_BASE + 0x54220*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54221*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54222*4+0x02000000,0xf01f); +reg_write( DDR_REG_BASE + 0x54223*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54224*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54225*4+0x02000000,0xffb4); +reg_write( DDR_REG_BASE + 0x54226*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54227*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54228*4+0x02000000,0xf0b4); +reg_write( DDR_REG_BASE + 0x54229*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5422a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5422b*4+0x02000000,0xf4b4); +reg_write( DDR_REG_BASE + 0x5422c*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5422d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5422e*4+0x02000000,0xf0b9); +reg_write( DDR_REG_BASE + 0x5422f*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54230*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54231*4+0x02000000,0xf0ba); +reg_write( DDR_REG_BASE + 0x54232*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54233*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54234*4+0x02000000,0xf0bb); +reg_write( DDR_REG_BASE + 0x54235*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54236*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54237*4+0x02000000,0xf001); +reg_write( DDR_REG_BASE + 0x54238*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54239*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5423a*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE + 0x5423b*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5423c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5423d*4+0x02000000,0xf0f9); +reg_write( DDR_REG_BASE + 0x5423e*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x5423f*4+0x02000000,0x200); +reg_write( DDR_REG_BASE + 0x54240*4+0x02000000,0xf0fa); +reg_write( DDR_REG_BASE + 0x54241*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x54242*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54243*4+0x02000000,0xf0fb); +reg_write( DDR_REG_BASE + 0x54244*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x54245*4+0x02000000,0x400); +reg_write( DDR_REG_BASE + 0x54246*4+0x02000000,0xf060); +reg_write( DDR_REG_BASE + 0x54247*4+0x02000000,0x7); +reg_write( DDR_REG_BASE + 0x54248*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x54249*4+0x02000000,0xf065); +reg_write( DDR_REG_BASE + 0x5424a*4+0x02000000,0x7); +reg_write( DDR_REG_BASE + 0x5424b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5424c*4+0x02000000,0xff62); +reg_write( DDR_REG_BASE + 0x5424d*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5424e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5424f*4+0x02000000,0xf002); +reg_write( DDR_REG_BASE + 0x54250*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54251*4+0x02000000,0x220); +reg_write( DDR_REG_BASE + 0x54252*4+0x02000000,0xf01f); +reg_write( DDR_REG_BASE + 0x54253*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54254*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54255*4+0x02000000,0xffb4); +reg_write( DDR_REG_BASE + 0x54256*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54257*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54258*4+0x02000000,0xf0b4); +reg_write( DDR_REG_BASE + 0x54259*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5425a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5425b*4+0x02000000,0xf4b4); +reg_write( DDR_REG_BASE + 0x5425c*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5425d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5425e*4+0x02000000,0xf0b9); +reg_write( DDR_REG_BASE + 0x5425f*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54260*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54261*4+0x02000000,0xf0ba); +reg_write( DDR_REG_BASE + 0x54262*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54263*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54264*4+0x02000000,0xf0bb); +reg_write( DDR_REG_BASE + 0x54265*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54266*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54267*4+0x02000000,0xf001); +reg_write( DDR_REG_BASE + 0x54268*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54269*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5426a*4+0x02000000,0xf0f9); +reg_write( DDR_REG_BASE + 0x5426b*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x5426c*4+0x02000000,0x200); +reg_write( DDR_REG_BASE + 0x5426d*4+0x02000000,0xf0fa); +reg_write( DDR_REG_BASE + 0x5426e*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x5426f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54270*4+0x02000000,0xf0fb); +reg_write( DDR_REG_BASE + 0x54271*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x54272*4+0x02000000,0x400); +reg_write( DDR_REG_BASE + 0x54273*4+0x02000000,0xf060); +reg_write( DDR_REG_BASE + 0x54274*4+0x02000000,0x7); +reg_write( DDR_REG_BASE + 0x54275*4+0x02000000,0x5); +reg_write( DDR_REG_BASE + 0x54276*4+0x02000000,0xf065); +reg_write( DDR_REG_BASE + 0x54277*4+0x02000000,0x7); +reg_write( DDR_REG_BASE + 0x54278*4+0x02000000,0x1ff); +reg_write( DDR_REG_BASE + 0x54279*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE + 0x5427a*4+0x02000000,0x7); +reg_write( DDR_REG_BASE + 0x5427b*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x5427c*4+0x02000000,0xff62); +reg_write( DDR_REG_BASE + 0x5427d*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5427e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5427f*4+0x02000000,0xf862); +reg_write( DDR_REG_BASE + 0x54280*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54281*4+0x02000000,0xfd); +reg_write( DDR_REG_BASE + 0x54282*4+0x02000000,0xf002); +reg_write( DDR_REG_BASE + 0x54283*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54284*4+0x02000000,0x220); +reg_write( DDR_REG_BASE + 0x54285*4+0x02000000,0xf01f); +reg_write( DDR_REG_BASE + 0x54286*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54287*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54288*4+0x02000000,0xffb4); +reg_write( DDR_REG_BASE + 0x54289*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5428a*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5428b*4+0x02000000,0xf0b4); +reg_write( DDR_REG_BASE + 0x5428c*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5428d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5428e*4+0x02000000,0xf4b4); +reg_write( DDR_REG_BASE + 0x5428f*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54290*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54291*4+0x02000000,0xf0b9); +reg_write( DDR_REG_BASE + 0x54292*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54293*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54294*4+0x02000000,0xf0ba); +reg_write( DDR_REG_BASE + 0x54295*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54296*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54297*4+0x02000000,0xf0bb); +reg_write( DDR_REG_BASE + 0x54298*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54299*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5429a*4+0x02000000,0xf001); +reg_write( DDR_REG_BASE + 0x5429b*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5429c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5429d*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE + 0x5429e*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5429f*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542a0*4+0x02000000,0xf012); +reg_write( DDR_REG_BASE + 0x542a1*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542a2*4+0x02000000,0xf000); +reg_write( DDR_REG_BASE + 0x542a3*4+0x02000000,0xf018); +reg_write( DDR_REG_BASE + 0x542a4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542a5*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542a6*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE + 0x542a7*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542a8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x542a9*4+0x02000000,0xf0f9); +reg_write( DDR_REG_BASE + 0x542aa*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x542ab*4+0x02000000,0x200); +reg_write( DDR_REG_BASE + 0x542ac*4+0x02000000,0xf0fa); +reg_write( DDR_REG_BASE + 0x542ad*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x542ae*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x542af*4+0x02000000,0xf0fb); +reg_write( DDR_REG_BASE + 0x542b0*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x542b1*4+0x02000000,0x400); +reg_write( DDR_REG_BASE + 0x542b2*4+0x02000000,0xff62); +reg_write( DDR_REG_BASE + 0x542b3*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542b4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x542b5*4+0x02000000,0xf062); +reg_write( DDR_REG_BASE + 0x542b6*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542b7*4+0x02000000,0xf); +reg_write( DDR_REG_BASE + 0x542b8*4+0x02000000,0xf462); +reg_write( DDR_REG_BASE + 0x542b9*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542ba*4+0x02000000,0xf0); +reg_write( DDR_REG_BASE + 0x542bb*4+0x02000000,0xf002); +reg_write( DDR_REG_BASE + 0x542bc*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542bd*4+0x02000000,0x204); +reg_write( DDR_REG_BASE + 0x542be*4+0x02000000,0xf01f); +reg_write( DDR_REG_BASE + 0x542bf*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542c0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x542c1*4+0x02000000,0xf03b); +reg_write( DDR_REG_BASE + 0x542c2*4+0x02000000,0x2); +reg_write( DDR_REG_BASE + 0x542c3*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542c4*4+0x02000000,0xffb2); +reg_write( DDR_REG_BASE + 0x542c5*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542c6*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x542c7*4+0x02000000,0xf0b2); +reg_write( DDR_REG_BASE + 0x542c8*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542c9*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542ca*4+0x02000000,0xffb4); +reg_write( DDR_REG_BASE + 0x542cb*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542cc*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542cd*4+0x02000000,0xf0b4); +reg_write( DDR_REG_BASE + 0x542ce*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542cf*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x542d0*4+0x02000000,0xf0b9); +reg_write( DDR_REG_BASE + 0x542d1*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542d2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x542d3*4+0x02000000,0xf0ba); +reg_write( DDR_REG_BASE + 0x542d4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542d5*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x542d6*4+0x02000000,0xf0bb); +reg_write( DDR_REG_BASE + 0x542d7*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542d8*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x542d9*4+0x02000000,0xf001); +reg_write( DDR_REG_BASE + 0x542da*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542db*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x542dc*4+0x02000000,0xf060); +reg_write( DDR_REG_BASE + 0x542dd*4+0x02000000,0x7); +reg_write( DDR_REG_BASE + 0x542de*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542df*4+0x02000000,0xf065); +reg_write( DDR_REG_BASE + 0x542e0*4+0x02000000,0x7); +reg_write( DDR_REG_BASE + 0x542e1*4+0x02000000,0x1ff); +reg_write( DDR_REG_BASE + 0x542e2*4+0x02000000,0xff26); +reg_write( DDR_REG_BASE + 0x542e3*4+0x02000000,0x7); +reg_write( DDR_REG_BASE + 0x542e4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x542e5*4+0x02000000,0xff27); +reg_write( DDR_REG_BASE + 0x542e6*4+0x02000000,0x7); +reg_write( DDR_REG_BASE + 0x542e7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x542e8*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE + 0x542e9*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542ea*4+0x02000000,0x2); +reg_write( DDR_REG_BASE + 0x542eb*4+0x02000000,0xff32); +reg_write( DDR_REG_BASE + 0x542ec*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542ed*4+0x02000000,0x800); +reg_write( DDR_REG_BASE + 0x542ee*4+0x02000000,0xff62); +reg_write( DDR_REG_BASE + 0x542ef*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542f0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x542f1*4+0x02000000,0xf062); +reg_write( DDR_REG_BASE + 0x542f2*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542f3*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542f4*4+0x02000000,0xf462); +reg_write( DDR_REG_BASE + 0x542f5*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542f6*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542f7*4+0x02000000,0xf002); +reg_write( DDR_REG_BASE + 0x542f8*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542f9*4+0x02000000,0x208); +reg_write( DDR_REG_BASE + 0x542fa*4+0x02000000,0xf01f); +reg_write( DDR_REG_BASE + 0x542fb*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542fc*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x542fd*4+0x02000000,0xffb2); +reg_write( DDR_REG_BASE + 0x542fe*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x542ff*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54300*4+0x02000000,0xf0b2); +reg_write( DDR_REG_BASE + 0x54301*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54302*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54303*4+0x02000000,0xf4b2); +reg_write( DDR_REG_BASE + 0x54304*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54305*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54306*4+0x02000000,0xffb4); +reg_write( DDR_REG_BASE + 0x54307*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54308*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54309*4+0x02000000,0xf0b4); +reg_write( DDR_REG_BASE + 0x5430a*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5430b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5430c*4+0x02000000,0xf4b4); +reg_write( DDR_REG_BASE + 0x5430d*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5430e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5430f*4+0x02000000,0xf0b9); +reg_write( DDR_REG_BASE + 0x54310*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54311*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54312*4+0x02000000,0xf0ba); +reg_write( DDR_REG_BASE + 0x54313*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54314*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54315*4+0x02000000,0xf0bb); +reg_write( DDR_REG_BASE + 0x54316*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54317*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54318*4+0x02000000,0xf011); +reg_write( DDR_REG_BASE + 0x54319*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5431a*4+0x02000000,0x101); +reg_write( DDR_REG_BASE + 0x5431b*4+0x02000000,0xf012); +reg_write( DDR_REG_BASE + 0x5431c*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5431d*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5431e*4+0x02000000,0xf013); +reg_write( DDR_REG_BASE + 0x5431f*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54320*4+0x02000000,0x2); +reg_write( DDR_REG_BASE + 0x54321*4+0x02000000,0xf018); +reg_write( DDR_REG_BASE + 0x54322*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54323*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54324*4+0x02000000,0xf060); +reg_write( DDR_REG_BASE + 0x54325*4+0x02000000,0x7); +reg_write( DDR_REG_BASE + 0x54326*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54327*4+0x02000000,0xf065); +reg_write( DDR_REG_BASE + 0x54328*4+0x02000000,0x7); +reg_write( DDR_REG_BASE + 0x54329*4+0x02000000,0x1ff); +reg_write( DDR_REG_BASE + 0x5432a*4+0x02000000,0xff26); +reg_write( DDR_REG_BASE + 0x5432b*4+0x02000000,0x7); +reg_write( DDR_REG_BASE + 0x5432c*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE + 0x5432d*4+0x02000000,0xff27); +reg_write( DDR_REG_BASE + 0x5432e*4+0x02000000,0x7); +reg_write( DDR_REG_BASE + 0x5432f*4+0x02000000,0xffff); +reg_write( DDR_REG_BASE + 0x54330*4+0x02000000,0xff62); +reg_write( DDR_REG_BASE + 0x54331*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54332*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54333*4+0x02000000,0xf062); +reg_write( DDR_REG_BASE + 0x54334*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54335*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54336*4+0x02000000,0xf462); +reg_write( DDR_REG_BASE + 0x54337*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x54338*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x54339*4+0x02000000,0xff32); +reg_write( DDR_REG_BASE + 0x5433a*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5433b*4+0x02000000,0x800); +reg_write( DDR_REG_BASE + 0x5433c*4+0x02000000,0xf002); +reg_write( DDR_REG_BASE + 0x5433d*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x5433e*4+0x02000000,0x210); +reg_write( DDR_REG_BASE + 0x5433f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54340*4+0x02000000,0x201); +reg_write( DDR_REG_BASE + 0x54341*4+0x02000000,0xb03); +reg_write( DDR_REG_BASE + 0x54342*4+0x02000000,0x1110); +reg_write( DDR_REG_BASE + 0x54343*4+0x02000000,0x2a29); +reg_write( DDR_REG_BASE + 0x54344*4+0x02000000,0x6e30); +reg_write( DDR_REG_BASE + 0x54345*4+0x02000000,0x200); +reg_write( DDR_REG_BASE + 0x54346*4+0x02000000,0x100); +reg_write( DDR_REG_BASE + 0x54347*4+0x02000000,0xfd00); +reg_write( DDR_REG_BASE + 0x54348*4+0x02000000,0x400); +reg_write( DDR_REG_BASE + 0x54349*4+0x02000000,0xf00); +reg_write( DDR_REG_BASE + 0x5434a*4+0x02000000,0x6000); +reg_write( DDR_REG_BASE + 0x5434b*4+0x02000000,0x700); +reg_write( DDR_REG_BASE + 0x5434c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x5434d*4+0x02000000,0xe800); +reg_write( DDR_REG_BASE + 0x5434e*4+0x02000000,0x400); +reg_write( DDR_REG_BASE + 0x5434f*4+0x02000000,0xff00); +reg_write( DDR_REG_BASE + 0x54350*4+0x02000000,0xfc00); +reg_write( DDR_REG_BASE + 0x54351*4+0x02000000,0x400); +reg_write( DDR_REG_BASE + 0x54352*4+0x02000000,0x400); +reg_write( DDR_REG_BASE + 0x54353*4+0x02000000,0x3a04); +reg_write( DDR_REG_BASE + 0x54354*4+0x02000000,0x200); +reg_write( DDR_REG_BASE + 0x54355*4+0x02000000,0x200); +reg_write( DDR_REG_BASE + 0x54356*4+0x02000000,0x1100); +reg_write( DDR_REG_BASE + 0x54357*4+0x02000000,0x700); +reg_write( DDR_REG_BASE + 0x54358*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x54359*4+0x02000000,0x0); + +reg_write( DDR_REG_BASE + 0xd0000*4+0x02000000 ,0x1); + + + +reg_write( DDR_REG_BASE + 0x000d0000*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000d0099*4 +0x02000000 , 0x00000009 ); +reg_write( DDR_REG_BASE + 0x000d0099*4 +0x02000000 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000d0099*4 +0x02000000 , 0x00000000 ); + + + +while((train_data&0x7) !=0x07) { + + reg_read ( DDR_REG_BASE + 0x000d0004*4 +0x02000000 , data ); + while((data&0x1) !=0x0) { + reg_read ( DDR_REG_BASE + 0x000d0004*4 +0x02000000 , data ); + } + + + + reg_read ( DDR_REG_BASE + 0x000d0032*4 +0x02000000 , train_data ); + switch(train_data) + { + case 0x00000000: printf("%08X: PMU Major Msg: End of initialization \n",train_data);break; + case 0x00000001: printf("%08X: PMU Major Msg: End of fine write leveling \n",train_data);break; + case 0x00000002: printf("%08X: PMU Major Msg: End of read enable training \n",train_data);break; + case 0x00000003: printf("%08X: PMU Major Msg: End of read delay center optimization \n",train_data);break; + case 0x00000004: printf("%08X: PMU Major Msg: End of write delay center optimization \n",train_data);break; + case 0x00000005: printf("%08X: PMU Major Msg: End of 2D read delay/voltage center optimization \n",train_data);break; + case 0x00000006: printf("%08X: PMU Major Msg: End of 2D write delay /voltage center optimization \n",train_data);break; + case 0x00000007: printf("%08X: PMU Major Msg: Firmware run has completed \n",train_data);break; + case 0x00000008: printf("%08X: PMU Major Msg: Enter streaming message mode \n",train_data);break; + case 0x00000009: printf("%08X: PMU Major Msg: End of max read latency training \n",train_data);break; + case 0x0000000a: printf("%08X: PMU Major Msg: End of read dq deskew training \n",train_data);break; + case 0x0000000b: printf("%08X: PMU Major Msg: End of LCDL offset calibration \n",train_data);break; + case 0x0000000c: printf("%08X: PMU Major Msg: End of LRDIMM Specific training (DWL, MREP, MRD and MWD) \n",train_data);break; + case 0x0000000d: printf("%08X: PMU Major Msg: End of CA training \n",train_data);break; + case 0x000000fd: printf("%08X: PMU Major Msg: End of MPR read delay center optimization \n",train_data);break; + case 0x000000fe: printf("%08X: PMU Major Msg: End of Write leveling coarse delay \n",train_data);break; + case 0x000000ff: printf("%08X: PMU Major Msg: FATAL ERROR. \n",train_data);break; + default: printf("%08X: PMU Major Msg: Un-recognized message... ! \n",train_data);break; + } + + + reg_write( DDR_REG_BASE + 0x000d0031*4 +0x02000000 , 0x00000000 ); + reg_read ( DDR_REG_BASE + 0x000d0004*4 +0x02000000 , data ); + while((data&0x1) ==0x0) { + reg_read ( DDR_REG_BASE + 0x000d0004*4 +0x02000000 , data ); + } + reg_write( DDR_REG_BASE + 0x000d0031*4 +0x02000000 , 0x00000001 ); + +} + +train_data=0; + + + +reg_write( DDR_REG_BASE + 0xd0099*4 +0x02000000,0x1); +reg_write( DDR_REG_BASE + 0xd0000*4 +0x02000000,0x0); +reg_write( DDR_REG_BASE + 0xd0000*4 +0x02000000,0x1); +reg_write( DDR_REG_BASE + 0xd0000*4 +0x02000000,0x0); + + +reg_write( DDR_REG_BASE + 0x90000*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x90001*4+0x02000000,0x400); +reg_write( DDR_REG_BASE + 0x90002*4+0x02000000,0x10e); +reg_write( DDR_REG_BASE + 0x90003*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x90004*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x90005*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x90029*4+0x02000000,0xb); +reg_write( DDR_REG_BASE + 0x9002a*4+0x02000000,0x480); +reg_write( DDR_REG_BASE + 0x9002b*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x9002c*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x9002d*4+0x02000000,0x448); +reg_write( DDR_REG_BASE + 0x9002e*4+0x02000000,0x139); +reg_write( DDR_REG_BASE + 0x9002f*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x90030*4+0x02000000,0x478); +reg_write( DDR_REG_BASE + 0x90031*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x90032*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x90033*4+0x02000000,0xe8); +reg_write( DDR_REG_BASE + 0x90034*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x90035*4+0x02000000,0x2); +reg_write( DDR_REG_BASE + 0x90036*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x90037*4+0x02000000,0x139); +reg_write( DDR_REG_BASE + 0x90038*4+0x02000000,0xb); +reg_write( DDR_REG_BASE + 0x90039*4+0x02000000,0x7c0); +reg_write( DDR_REG_BASE + 0x9003a*4+0x02000000,0x139); +reg_write( DDR_REG_BASE + 0x9003b*4+0x02000000,0x44); +reg_write( DDR_REG_BASE + 0x9003c*4+0x02000000,0x633); +reg_write( DDR_REG_BASE + 0x9003d*4+0x02000000,0x159); +reg_write( DDR_REG_BASE + 0x9003e*4+0x02000000,0x14f); +reg_write( DDR_REG_BASE + 0x9003f*4+0x02000000,0x630); +reg_write( DDR_REG_BASE + 0x90040*4+0x02000000,0x159); +reg_write( DDR_REG_BASE + 0x90041*4+0x02000000,0x47); +reg_write( DDR_REG_BASE + 0x90042*4+0x02000000,0x633); +reg_write( DDR_REG_BASE + 0x90043*4+0x02000000,0x149); +reg_write( DDR_REG_BASE + 0x90044*4+0x02000000,0x4f); +reg_write( DDR_REG_BASE + 0x90045*4+0x02000000,0x633); +reg_write( DDR_REG_BASE + 0x90046*4+0x02000000,0x179); +reg_write( DDR_REG_BASE + 0x90047*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x90048*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x90049*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x9004a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x9004b*4+0x02000000,0x7c8); +reg_write( DDR_REG_BASE + 0x9004c*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x9004d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x9004e*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x9004f*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x90050*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x90051*4+0x02000000,0x45a); +reg_write( DDR_REG_BASE + 0x90052*4+0x02000000,0x9); +reg_write( DDR_REG_BASE + 0x90053*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x90054*4+0x02000000,0x448); +reg_write( DDR_REG_BASE + 0x90055*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x90056*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x90057*4+0x02000000,0x633); +reg_write( DDR_REG_BASE + 0x90058*4+0x02000000,0x179); +reg_write( DDR_REG_BASE + 0x90059*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x9005a*4+0x02000000,0x618); +reg_write( DDR_REG_BASE + 0x9005b*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x9005c*4+0x02000000,0x40c0); +reg_write( DDR_REG_BASE + 0x9005d*4+0x02000000,0x633); +reg_write( DDR_REG_BASE + 0x9005e*4+0x02000000,0x149); +reg_write( DDR_REG_BASE + 0x9005f*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x90060*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x90061*4+0x02000000,0x48); +reg_write( DDR_REG_BASE + 0x90062*4+0x02000000,0x4040); +reg_write( DDR_REG_BASE + 0x90063*4+0x02000000,0x633); +reg_write( DDR_REG_BASE + 0x90064*4+0x02000000,0x149); +reg_write( DDR_REG_BASE + 0x90065*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x90066*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x90067*4+0x02000000,0x48); +reg_write( DDR_REG_BASE + 0x90068*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x90069*4+0x02000000,0x633); +reg_write( DDR_REG_BASE + 0x9006a*4+0x02000000,0x149); +reg_write( DDR_REG_BASE + 0x9006b*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x9006c*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x9006d*4+0x02000000,0x18); +reg_write( DDR_REG_BASE + 0x9006e*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x9006f*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x90070*4+0x02000000,0x78); +reg_write( DDR_REG_BASE + 0x90071*4+0x02000000,0x549); +reg_write( DDR_REG_BASE + 0x90072*4+0x02000000,0x633); +reg_write( DDR_REG_BASE + 0x90073*4+0x02000000,0x159); +reg_write( DDR_REG_BASE + 0x90074*4+0x02000000,0xd49); +reg_write( DDR_REG_BASE + 0x90075*4+0x02000000,0x633); +reg_write( DDR_REG_BASE + 0x90076*4+0x02000000,0x159); +reg_write( DDR_REG_BASE + 0x90077*4+0x02000000,0x94a); +reg_write( DDR_REG_BASE + 0x90078*4+0x02000000,0x633); +reg_write( DDR_REG_BASE + 0x90079*4+0x02000000,0x159); +reg_write( DDR_REG_BASE + 0x9007a*4+0x02000000,0x441); +reg_write( DDR_REG_BASE + 0x9007b*4+0x02000000,0x633); +reg_write( DDR_REG_BASE + 0x9007c*4+0x02000000,0x149); +reg_write( DDR_REG_BASE + 0x9007d*4+0x02000000,0x42); +reg_write( DDR_REG_BASE + 0x9007e*4+0x02000000,0x633); +reg_write( DDR_REG_BASE + 0x9007f*4+0x02000000,0x149); +reg_write( DDR_REG_BASE + 0x90080*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x90081*4+0x02000000,0x633); +reg_write( DDR_REG_BASE + 0x90082*4+0x02000000,0x149); +reg_write( DDR_REG_BASE + 0x90083*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x90084*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x90085*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x90086*4+0x02000000,0xa); +reg_write( DDR_REG_BASE + 0x90087*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x90088*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x90089*4+0x02000000,0x9); +reg_write( DDR_REG_BASE + 0x9008a*4+0x02000000,0x3c0); +reg_write( DDR_REG_BASE + 0x9008b*4+0x02000000,0x149); +reg_write( DDR_REG_BASE + 0x9008c*4+0x02000000,0x9); +reg_write( DDR_REG_BASE + 0x9008d*4+0x02000000,0x3c0); +reg_write( DDR_REG_BASE + 0x9008e*4+0x02000000,0x159); +reg_write( DDR_REG_BASE + 0x9008f*4+0x02000000,0x18); +reg_write( DDR_REG_BASE + 0x90090*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x90091*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x90092*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x90093*4+0x02000000,0x3c0); +reg_write( DDR_REG_BASE + 0x90094*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x90095*4+0x02000000,0x18); +reg_write( DDR_REG_BASE + 0x90096*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x90097*4+0x02000000,0x48); +reg_write( DDR_REG_BASE + 0x90098*4+0x02000000,0x18); +reg_write( DDR_REG_BASE + 0x90099*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x9009a*4+0x02000000,0x58); +reg_write( DDR_REG_BASE + 0x9009b*4+0x02000000,0xb); +reg_write( DDR_REG_BASE + 0x9009c*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x9009d*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x9009e*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x9009f*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x900a0*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x900a1*4+0x02000000,0x5); +reg_write( DDR_REG_BASE + 0x900a2*4+0x02000000,0x7c0); +reg_write( DDR_REG_BASE + 0x900a3*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x40000*4+0x02000000,0x8ec); +reg_write( DDR_REG_BASE + 0x40020*4+0x02000000,0x800); +reg_write( DDR_REG_BASE + 0x40040*4+0x02000000,0x38); +reg_write( DDR_REG_BASE + 0x40060*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x40001*4+0x02000000,0x70a); +reg_write( DDR_REG_BASE + 0x40021*4+0x02000000,0x15); +reg_write( DDR_REG_BASE + 0x40041*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x40061*4+0x02000000,0x2003); +reg_write( DDR_REG_BASE + 0x40002*4+0x02000000,0x764); +reg_write( DDR_REG_BASE + 0x40022*4+0x02000000,0x15); +reg_write( DDR_REG_BASE + 0x40042*4+0x02000000,0xa56); +reg_write( DDR_REG_BASE + 0x40062*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x40003*4+0x02000000,0x70a); +reg_write( DDR_REG_BASE + 0x40023*4+0x02000000,0x1a); +reg_write( DDR_REG_BASE + 0x40043*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x40063*4+0x02000000,0x2003); +reg_write( DDR_REG_BASE + 0x40004*4+0x02000000,0x4764); +reg_write( DDR_REG_BASE + 0x40024*4+0x02000000,0x1a); +reg_write( DDR_REG_BASE + 0x40044*4+0x02000000,0xa56); +reg_write( DDR_REG_BASE + 0x40064*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x40005*4+0x02000000,0xf05); +reg_write( DDR_REG_BASE + 0x40025*4+0x02000000,0xc05); +reg_write( DDR_REG_BASE + 0x40045*4+0x02000000,0x2800); +reg_write( DDR_REG_BASE + 0x40065*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x40006*4+0x02000000,0x728); +reg_write( DDR_REG_BASE + 0x40026*4+0x02000000,0x5); +reg_write( DDR_REG_BASE + 0x40046*4+0x02000000,0x2800); +reg_write( DDR_REG_BASE + 0x40066*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x40007*4+0x02000000,0x4028); +reg_write( DDR_REG_BASE + 0x40027*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x40047*4+0x02000000,0x38); +reg_write( DDR_REG_BASE + 0x40067*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x40008*4+0x02000000,0xf05); +reg_write( DDR_REG_BASE + 0x40028*4+0x02000000,0xc0a); +reg_write( DDR_REG_BASE + 0x40048*4+0x02000000,0x2800); +reg_write( DDR_REG_BASE + 0x40068*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x40009*4+0x02000000,0x728); +reg_write( DDR_REG_BASE + 0x40029*4+0x02000000,0xa); +reg_write( DDR_REG_BASE + 0x40049*4+0x02000000,0x2800); +reg_write( DDR_REG_BASE + 0x40069*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x4000a*4+0x02000000,0x4028); +reg_write( DDR_REG_BASE + 0x4002a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x4004a*4+0x02000000,0x38); +reg_write( DDR_REG_BASE + 0x4006a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x4000b*4+0x02000000,0xee0); +reg_write( DDR_REG_BASE + 0x4002b*4+0x02000000,0xc0f); +reg_write( DDR_REG_BASE + 0x4004b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x4006b*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x4000c*4+0x02000000,0x5620); +reg_write( DDR_REG_BASE + 0x4002c*4+0x02000000,0x3); +reg_write( DDR_REG_BASE + 0x4004c*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x4006c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x900a4*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x900a5*4+0x02000000,0x790); +reg_write( DDR_REG_BASE + 0x900a6*4+0x02000000,0x10a); +reg_write( DDR_REG_BASE + 0x900a7*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x900a8*4+0x02000000,0x7aa); +reg_write( DDR_REG_BASE + 0x900a9*4+0x02000000,0xa); +reg_write( DDR_REG_BASE + 0x900aa*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x900ab*4+0x02000000,0x7b2); +reg_write( DDR_REG_BASE + 0x900ac*4+0x02000000,0xa); +reg_write( DDR_REG_BASE + 0x900ad*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x900ae*4+0x02000000,0x7c8); +reg_write( DDR_REG_BASE + 0x900af*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x900b0*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x900b1*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x900b2*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x900b3*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x900b4*4+0x02000000,0x2a8); +reg_write( DDR_REG_BASE + 0x900b5*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x900b6*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x900b7*4+0x02000000,0x370); +reg_write( DDR_REG_BASE + 0x900b8*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x900b9*4+0x02000000,0xa); +reg_write( DDR_REG_BASE + 0x900ba*4+0x02000000,0x3c8); +reg_write( DDR_REG_BASE + 0x900bb*4+0x02000000,0x1a9); +reg_write( DDR_REG_BASE + 0x900bc*4+0x02000000,0xc); +reg_write( DDR_REG_BASE + 0x900bd*4+0x02000000,0x408); +reg_write( DDR_REG_BASE + 0x900be*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x900bf*4+0x02000000,0x3e); +reg_write( DDR_REG_BASE + 0x900c0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x900c1*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x900c2*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x900c3*4+0x02000000,0x408); +reg_write( DDR_REG_BASE + 0x900c4*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x900c5*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x900c6*4+0x02000000,0x8568); +reg_write( DDR_REG_BASE + 0x900c7*4+0x02000000,0x108); +reg_write( DDR_REG_BASE + 0x900c8*4+0x02000000,0x28); +reg_write( DDR_REG_BASE + 0x900c9*4+0x02000000,0x790); +reg_write( DDR_REG_BASE + 0x900ca*4+0x02000000,0x16a); +reg_write( DDR_REG_BASE + 0x900cb*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x900cc*4+0x02000000,0x1d8); +reg_write( DDR_REG_BASE + 0x900cd*4+0x02000000,0x169); +reg_write( DDR_REG_BASE + 0x900ce*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x900cf*4+0x02000000,0x8558); +reg_write( DDR_REG_BASE + 0x900d0*4+0x02000000,0x168); +reg_write( DDR_REG_BASE + 0x900d1*4+0x02000000,0x70); +reg_write( DDR_REG_BASE + 0x900d2*4+0x02000000,0x788); +reg_write( DDR_REG_BASE + 0x900d3*4+0x02000000,0x16a); +reg_write( DDR_REG_BASE + 0x900d4*4+0x02000000,0x1ff8); +reg_write( DDR_REG_BASE + 0x900d5*4+0x02000000,0x85a8); +reg_write( DDR_REG_BASE + 0x900d6*4+0x02000000,0x1e8); +reg_write( DDR_REG_BASE + 0x900d7*4+0x02000000,0x28); +reg_write( DDR_REG_BASE + 0x900d8*4+0x02000000,0x798); +reg_write( DDR_REG_BASE + 0x900d9*4+0x02000000,0x16a); +reg_write( DDR_REG_BASE + 0x900da*4+0x02000000,0x38); +reg_write( DDR_REG_BASE + 0x900db*4+0x02000000,0x7a0); +reg_write( DDR_REG_BASE + 0x900dc*4+0x02000000,0x16a); +reg_write( DDR_REG_BASE + 0x900dd*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x900de*4+0x02000000,0x8310); +reg_write( DDR_REG_BASE + 0x900df*4+0x02000000,0x168); +reg_write( DDR_REG_BASE + 0x900e0*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x900e1*4+0x02000000,0xa310); +reg_write( DDR_REG_BASE + 0x900e2*4+0x02000000,0x168); +reg_write( DDR_REG_BASE + 0x900e3*4+0x02000000,0xa); +reg_write( DDR_REG_BASE + 0x900e4*4+0x02000000,0x408); +reg_write( DDR_REG_BASE + 0x900e5*4+0x02000000,0x169); +reg_write( DDR_REG_BASE + 0x900e6*4+0x02000000,0x55); +reg_write( DDR_REG_BASE + 0x900e7*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x900e8*4+0x02000000,0x68); +reg_write( DDR_REG_BASE + 0x900e9*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x900ea*4+0x02000000,0x408); +reg_write( DDR_REG_BASE + 0x900eb*4+0x02000000,0x169); +reg_write( DDR_REG_BASE + 0x900ec*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x900ed*4+0x02000000,0x8310); +reg_write( DDR_REG_BASE + 0x900ee*4+0x02000000,0x168); +reg_write( DDR_REG_BASE + 0x900ef*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x900f0*4+0x02000000,0xa310); +reg_write( DDR_REG_BASE + 0x900f1*4+0x02000000,0x168); +reg_write( DDR_REG_BASE + 0x900f2*4+0x02000000,0x1ff8); +reg_write( DDR_REG_BASE + 0x900f3*4+0x02000000,0x85a8); +reg_write( DDR_REG_BASE + 0x900f4*4+0x02000000,0x1e8); +reg_write( DDR_REG_BASE + 0x900f5*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x900f6*4+0x02000000,0x798); +reg_write( DDR_REG_BASE + 0x900f7*4+0x02000000,0x16a); +reg_write( DDR_REG_BASE + 0x900f8*4+0x02000000,0x50); +reg_write( DDR_REG_BASE + 0x900f9*4+0x02000000,0x7a0); +reg_write( DDR_REG_BASE + 0x900fa*4+0x02000000,0x16a); +reg_write( DDR_REG_BASE + 0x900fb*4+0x02000000,0x40); +reg_write( DDR_REG_BASE + 0x900fc*4+0x02000000,0x790); +reg_write( DDR_REG_BASE + 0x900fd*4+0x02000000,0x16a); +reg_write( DDR_REG_BASE + 0x900fe*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x900ff*4+0x02000000,0x8b10); +reg_write( DDR_REG_BASE + 0x90100*4+0x02000000,0x168); +reg_write( DDR_REG_BASE + 0x90101*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x90102*4+0x02000000,0xab10); +reg_write( DDR_REG_BASE + 0x90103*4+0x02000000,0x168); +reg_write( DDR_REG_BASE + 0x90104*4+0x02000000,0xa); +reg_write( DDR_REG_BASE + 0x90105*4+0x02000000,0x408); +reg_write( DDR_REG_BASE + 0x90106*4+0x02000000,0x169); +reg_write( DDR_REG_BASE + 0x90107*4+0x02000000,0x55); +reg_write( DDR_REG_BASE + 0x90108*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x90109*4+0x02000000,0x68); +reg_write( DDR_REG_BASE + 0x9010a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x9010b*4+0x02000000,0x408); +reg_write( DDR_REG_BASE + 0x9010c*4+0x02000000,0x169); +reg_write( DDR_REG_BASE + 0x9010d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x9010e*4+0x02000000,0x8b10); +reg_write( DDR_REG_BASE + 0x9010f*4+0x02000000,0x168); +reg_write( DDR_REG_BASE + 0x90110*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x90111*4+0x02000000,0xab10); +reg_write( DDR_REG_BASE + 0x90112*4+0x02000000,0x168); +reg_write( DDR_REG_BASE + 0x90113*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x90114*4+0x02000000,0x1d8); +reg_write( DDR_REG_BASE + 0x90115*4+0x02000000,0x169); +reg_write( DDR_REG_BASE + 0x90116*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x90117*4+0x02000000,0x8568); +reg_write( DDR_REG_BASE + 0x90118*4+0x02000000,0x108); +reg_write( DDR_REG_BASE + 0x90119*4+0x02000000,0xa); +reg_write( DDR_REG_BASE + 0x9011a*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x9011b*4+0x02000000,0x189); +reg_write( DDR_REG_BASE + 0x9011c*4+0x02000000,0x58); +reg_write( DDR_REG_BASE + 0x9011d*4+0x02000000,0x790); +reg_write( DDR_REG_BASE + 0x9011e*4+0x02000000,0x10a); +reg_write( DDR_REG_BASE + 0x9011f*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x90120*4+0x02000000,0x408); +reg_write( DDR_REG_BASE + 0x90121*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x90122*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x90123*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x90124*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x90125*4+0x02000000,0x2); +reg_write( DDR_REG_BASE + 0x90126*4+0x02000000,0x408); +reg_write( DDR_REG_BASE + 0x90127*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x90128*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x90129*4+0x02000000,0x8558); +reg_write( DDR_REG_BASE + 0x9012a*4+0x02000000,0x168); +reg_write( DDR_REG_BASE + 0x9012b*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x9012c*4+0x02000000,0x3c8); +reg_write( DDR_REG_BASE + 0x9012d*4+0x02000000,0x1a9); +reg_write( DDR_REG_BASE + 0x9012e*4+0x02000000,0x3); +reg_write( DDR_REG_BASE + 0x9012f*4+0x02000000,0x370); +reg_write( DDR_REG_BASE + 0x90130*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x90131*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x90132*4+0x02000000,0x2a8); +reg_write( DDR_REG_BASE + 0x90133*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x90134*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x90135*4+0x02000000,0xe8); +reg_write( DDR_REG_BASE + 0x90136*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x90137*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x90138*4+0x02000000,0x8140); +reg_write( DDR_REG_BASE + 0x90139*4+0x02000000,0x10c); +reg_write( DDR_REG_BASE + 0x9013a*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x9013b*4+0x02000000,0x8138); +reg_write( DDR_REG_BASE + 0x9013c*4+0x02000000,0x104); +reg_write( DDR_REG_BASE + 0x9013d*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x9013e*4+0x02000000,0x448); +reg_write( DDR_REG_BASE + 0x9013f*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x90140*4+0x02000000,0xf); +reg_write( DDR_REG_BASE + 0x90141*4+0x02000000,0x7c0); +reg_write( DDR_REG_BASE + 0x90142*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x90143*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x90144*4+0x02000000,0xe8); +reg_write( DDR_REG_BASE + 0x90145*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x90146*4+0x02000000,0x47); +reg_write( DDR_REG_BASE + 0x90147*4+0x02000000,0x630); +reg_write( DDR_REG_BASE + 0x90148*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x90149*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x9014a*4+0x02000000,0x618); +reg_write( DDR_REG_BASE + 0x9014b*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x9014c*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x9014d*4+0x02000000,0xe0); +reg_write( DDR_REG_BASE + 0x9014e*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x9014f*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x90150*4+0x02000000,0x7c8); +reg_write( DDR_REG_BASE + 0x90151*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x90152*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x90153*4+0x02000000,0x8140); +reg_write( DDR_REG_BASE + 0x90154*4+0x02000000,0x10c); +reg_write( DDR_REG_BASE + 0x90155*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x90156*4+0x02000000,0x478); +reg_write( DDR_REG_BASE + 0x90157*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x90158*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x90159*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x9015a*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x9015b*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x9015c*4+0x02000000,0x4); +reg_write( DDR_REG_BASE + 0x9015d*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x90006*4+0x02000000,0x8); +reg_write( DDR_REG_BASE + 0x90007*4+0x02000000,0x7c8); +reg_write( DDR_REG_BASE + 0x90008*4+0x02000000,0x109); +reg_write( DDR_REG_BASE + 0x90009*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x9000a*4+0x02000000,0x400); +reg_write( DDR_REG_BASE + 0x9000b*4+0x02000000,0x106); +reg_write( DDR_REG_BASE + 0xd00e7*4+0x02000000,0x400); +reg_write( DDR_REG_BASE + 0x90017*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x9001f*4+0x02000000,0x29); +reg_write( DDR_REG_BASE + 0x90026*4+0x02000000,0x5c); +reg_write( DDR_REG_BASE + 0x400d0*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x400d1*4+0x02000000,0x101); +reg_write( DDR_REG_BASE + 0x400d2*4+0x02000000,0x105); +reg_write( DDR_REG_BASE + 0x400d3*4+0x02000000,0x107); +reg_write( DDR_REG_BASE + 0x400d4*4+0x02000000,0x10f); +reg_write( DDR_REG_BASE + 0x400d5*4+0x02000000,0x202); +reg_write( DDR_REG_BASE + 0x400d6*4+0x02000000,0x20a); +reg_write( DDR_REG_BASE + 0x400d7*4+0x02000000,0x20b); +reg_write( DDR_REG_BASE + 0x2000b*4+0x02000000,0x19); +reg_write( DDR_REG_BASE + 0x2000c*4+0x02000000,0x32); +reg_write( DDR_REG_BASE + 0x2000d*4+0x02000000,0x1f4); +reg_write( DDR_REG_BASE + 0x2000e*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x9000c*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x9000d*4+0x02000000,0x173); +reg_write( DDR_REG_BASE + 0x9000e*4+0x02000000,0x60); +reg_write( DDR_REG_BASE + 0x9000f*4+0x02000000,0x6110); +reg_write( DDR_REG_BASE + 0x90010*4+0x02000000,0x2152); +reg_write( DDR_REG_BASE + 0x90011*4+0x02000000,0xdfbd); +reg_write( DDR_REG_BASE + 0x90012*4+0x02000000,0x2060); +reg_write( DDR_REG_BASE + 0x90013*4+0x02000000,0x6152); +reg_write( DDR_REG_BASE + 0x20010*4+0x02000000,0x5a); +reg_write( DDR_REG_BASE + 0x20011*4+0x02000000,0x3); + +reg_write( DDR_REG_BASE + 0x40080*4+0x02000000,0xb0); +//iteration +reg_write( DDR_REG_BASE + 0x40081*4+0x02000000,0x18); +reg_write( DDR_REG_BASE + 0x40082*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x40083*4+0x02000000,0x20c); +reg_write( DDR_REG_BASE + 0x40084*4+0x02000000,0x20); +reg_write( DDR_REG_BASE + 0x40085*4+0x02000000,0x18); +reg_write( DDR_REG_BASE + 0x40086*4+0x02000000,0x30); +//iteration +//reg_write( DDR_REG_BASE + 0x40087*4+0x02000000,0x10); +reg_write( DDR_REG_BASE + 0x40087*4+0x02000000,0x10); + +reg_write( DDR_REG_BASE + 0x400fd*4+0x02000000,0xf); +reg_write( DDR_REG_BASE + 0x10011*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x10012*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x10013*4+0x02000000,0x80); +reg_write( DDR_REG_BASE + 0x10018*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x10002*4+0x02000000,0x6209); +reg_write( DDR_REG_BASE + 0x100b2*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x101b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x102b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x103b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x104b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x105b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x106b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x107b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x108b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x400e0*4+0x02000000,0xf); +reg_write( DDR_REG_BASE + 0x11011*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x11012*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x11013*4+0x02000000,0x80); +reg_write( DDR_REG_BASE + 0x11018*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x11002*4+0x02000000,0x6209); +reg_write( DDR_REG_BASE + 0x110b2*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x111b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x112b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x113b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x114b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x115b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x116b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x117b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x118b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x400e1*4+0x02000000,0xf); +reg_write( DDR_REG_BASE + 0x12011*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x12012*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x12013*4+0x02000000,0x80); +reg_write( DDR_REG_BASE + 0x12018*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x12002*4+0x02000000,0x6209); +reg_write( DDR_REG_BASE + 0x120b2*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x121b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x122b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x123b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x124b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x125b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x126b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x127b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x128b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x400e2*4+0x02000000,0xff); +reg_write( DDR_REG_BASE + 0x13011*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x13012*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x13013*4+0x02000000,0x80); +reg_write( DDR_REG_BASE + 0x13018*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x13002*4+0x02000000,0x6209); +reg_write( DDR_REG_BASE + 0x130b2*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x131b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x132b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x133b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x134b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x135b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x136b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x137b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x138b4*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x400e3*4+0x02000000,0x0); +reg_write( DDR_REG_BASE + 0x20089*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x20088*4+0x02000000,0x19); +reg_write( DDR_REG_BASE + 0xc0080*4+0x02000000,0x2); +reg_write( DDR_REG_BASE + 0xd0000*4+0x02000000,0x1); +reg_write( DDR_REG_BASE + 0x000d0000*4 +0x02000000 , 0x00000000 ); +reg_read ( DDR_REG_BASE + 0x00020010*4 +0x02000000 , data ); +reg_write( DDR_REG_BASE + 0x00020010*4 +0x02000000 , 0x0000006a ); +reg_write( DDR_REG_BASE + 0x00020010*4 +0x02000000 , 0x0000006a ); +reg_read ( DDR_REG_BASE + 0x0002001d*4 +0x02000000 , data ); +reg_write( DDR_REG_BASE + 0x0002001d*4 +0x02000000 , 0x00000001 ); +reg_read ( DDR_REG_BASE + 0x00020097*4 +0x02000000 , data ); + +//////////////////////phy init end//////////////////// + +reg_write( DDR_REG_BASE + 0x000001b0 , 0x00000020 ); + +reg_read (DDR_REG_BASE + 0x000001bc , data ); +while((data&0x1) !=0x1) { + reg_read (DDR_REG_BASE + 0x000001bc , data ); +} + +reg_write( DDR_REG_BASE + 0x000001b0 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000001b0 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x00000030 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00000030 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00000320 , 0x00000001 ); + + + + reg_read (DDR_REG_BASE + 0x00000324 , data ); + while((data&0x1) !=0x1) { + reg_read (DDR_REG_BASE + 0x00000324 , data ); + } + +reg_read (DDR_REG_BASE + 0x00000004 , data ); + while((data&0x1) !=0x1) { + reg_read (DDR_REG_BASE + 0x00000004 , data ); + } + + + + +reg_write( DDR_REG_BASE + 0x000001c4 , 0x85000000 ); +reg_write( DDR_REG_BASE + 0x00000320 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x000000d0 , 0x00020002 ); +reg_write( DDR_REG_BASE + 0x00000320 , 0x00000001 ); + + +reg_read (DDR_REG_BASE + 0x00000324 , data ); + while((data&0x1) !=0x1) { + reg_read (DDR_REG_BASE + 0x00000324 , data ); + } + + + + +reg_write( DDR_REG_BASE + 0x00000304 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00000030 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00000030 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00000490 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x00000540 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000005f0 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x000006a0 , 0x00000001 ); +reg_write( DDR_REG_BASE + 0x00000750 , 0x00000001 ); + +reg_write( DDR_REG_BASE + 0x00000060 , 0x00000000 ); +reg_write( DDR_REG_BASE + 0x00000050 , 0x98210000 ); + +} diff --git a/src/little/uboot/board/canaan/k230_siplp4/Kconfig b/src/little/uboot/board/canaan/k230_siplp4/Kconfig index 393c85e66..94c90bc00 100755 --- a/src/little/uboot/board/canaan/k230_siplp4/Kconfig +++ b/src/little/uboot/board/canaan/k230_siplp4/Kconfig @@ -2,15 +2,15 @@ if TARGET_K230_SIPLP4 config SYS_CPU default "k230" - + config SYS_VENDOR - default "canaan" + default "canaan" config SYS_BOARD - default "k230_siplp4" + default "k230_siplp4" config SYS_CONFIG_NAME - default "k230_evb" + default "k230_evb" config BOARD_SPECIFIC_OPTIONS # dummy @@ -18,6 +18,6 @@ config BOARD_SPECIFIC_OPTIONS # dummy select RISCV_THEAD config SIPLP4_2667 - def_bool y + def_bool y endif diff --git a/src/little/uboot/board/canaan/k230d_canmv/Kconfig b/src/little/uboot/board/canaan/k230d_canmv/Kconfig index 58d236fae..a2001e9ea 100755 --- a/src/little/uboot/board/canaan/k230d_canmv/Kconfig +++ b/src/little/uboot/board/canaan/k230d_canmv/Kconfig @@ -7,10 +7,10 @@ config SYS_VENDOR default "canaan" config SYS_BOARD - default "k230d_canmv" + default "k230d_canmv" config SYS_CONFIG_NAME - default "k230_evb" + default "k230_evb" config BOARD_SPECIFIC_OPTIONS # dummy @@ -18,6 +18,6 @@ config BOARD_SPECIFIC_OPTIONS # dummy select RISCV_THEAD config SIPLP4_2667 - def_bool y + def_bool y endif diff --git a/src/little/uboot/configs/k230_canmv_01studio_burntool_defconfig b/src/little/uboot/configs/k230_canmv_01studio_burntool_defconfig new file mode 100755 index 000000000..b9bb21924 --- /dev/null +++ b/src/little/uboot/configs/k230_canmv_01studio_burntool_defconfig @@ -0,0 +1,108 @@ +CONFIG_RISCV=y +CONFIG_SYS_TEXT_BASE=0x80300000 +CONFIG_SYS_MALLOC_F_LEN=0x40000 +CONFIG_NR_DRAM_BANKS=2 +CONFIG_ENV_SIZE=0x10000 +CONFIG_DEFAULT_DEVICE_TREE="k230_canmv_01studio" +CONFIG_SYS_PROMPT="K230# " +CONFIG_SYS_LOAD_ADDR=0xc000000 +CONFIG_BUILD_TARGET="u-boot.bin" +CONFIG_TARGET_K230_CANMV_01STUDIO=y +CONFIG_ARCH_RV64I=y +CONFIG_SHOW_REGS=y +CONFIG_CC_OPTIMIZE_FOR_DEBUG=y +CONFIG_DISTRO_DEFAULTS=y +CONFIG_FIT=y +CONFIG_TIMESTAMP=y +CONFIG_FIT_SIGNATURE=y +CONFIG_LEGACY_IMAGE_FORMAT=y +CONFIG_BOOTDELAY=1 +CONFIG_AUTOBOOT_KEYED=y +CONFIG_AUTOBOOT_STOP_STR="stop" +CONFIG_LOGLEVEL=7 +CONFIG_SYS_STDIO_DEREGISTER=y +# CONFIG_SYS_DEVICE_NULLDEV is not set +CONFIG_DISPLAY_CPUINFO=y +CONFIG_DISPLAY_BOARDINFO=y +CONFIG_BOARD_EARLY_INIT_F=y +# CONFIG_CMD_BDI is not set +# CONFIG_CMD_CONSOLE is not set +# CONFIG_CMD_CPU is not set +# CONFIG_CMD_BOOTFLOW is not set +# CONFIG_CMD_BOOTI is not set +# CONFIG_BOOTM_LINUX is not set +# CONFIG_BOOTM_NETBSD is not set +# CONFIG_BOOTM_PLAN9 is not set +# CONFIG_BOOTM_RTEMS is not set +# CONFIG_BOOTM_VXWORKS is not set +CONFIG_SYS_BOOTM_LEN=0x8000000 +# CONFIG_CMD_ELF is not set +# CONFIG_CMD_FDT is not set +# CONFIG_CMD_GO is not set +# CONFIG_CMD_IMI is not set +# CONFIG_CMD_XIMG is not set +# CONFIG_CMD_EXPORTENV is not set +# CONFIG_CMD_IMPORTENV is not set +# CONFIG_CMD_EDITENV is not set +# CONFIG_CMD_CRC32 is not set +CONFIG_CMD_DFU=y +# CONFIG_CMD_DM is not set +# CONFIG_CMD_FLASH is not set +# CONFIG_CMD_LOADB is not set +# CONFIG_CMD_LOADS is not set +CONFIG_CMD_MMC=y +CONFIG_CMD_MTD=y +# CONFIG_CMD_PINMUX is not set +# CONFIG_CMD_ECHO is not set +# CONFIG_CMD_ITEST is not set +# CONFIG_CMD_SOURCE is not set +# CONFIG_CMD_SETEXPR is not set +# CONFIG_CMD_BLOCK_CACHE is not set +# CONFIG_CMD_SLEEP is not set +CONFIG_CMD_MTDPARTS=y +# CONFIG_DOS_PARTITION is not set +# CONFIG_ISO_PARTITION is not set +# CONFIG_EFI_PARTITION is not set +CONFIG_OF_EMBED=y +CONFIG_SYS_RELOC_GD_ENV_ADDR=y +# CONFIG_NET is not set +CONFIG_DFU_MMC=y +CONFIG_DFU_MTD=y +CONFIG_DFU_SF=y +CONFIG_DFU_VIRT=y +CONFIG_SYS_DFU_DATA_BUF_SIZE=0x80000 +# CONFIG_GPIO is not set +# CONFIG_I2C is not set +# CONFIG_INPUT is not set +CONFIG_MMC=y +CONFIG_MMC_HS200_SUPPORT=y +CONFIG_MMC_DW=y +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_SDMA=y +CONFIG_MMC_SDHCI_SNPS=y +CONFIG_DM_MTD=y +CONFIG_MTD_SPI_NAND=y +CONFIG_SPI_FLASH_SFDP_SUPPORT=y +CONFIG_SPI_FLASH_SOFT_RESET=y +CONFIG_SPI_FLASH_SOFT_RESET_ON_BOOT=y +CONFIG_SPI_FLASH_GIGADEVICE=y +CONFIG_SPI_FLASH_WINBOND=y +# CONFIG_SPI_FLASH_USE_4K_SECTORS is not set +CONFIG_SPI_FLASH_MTD=y +CONFIG_PINCTRL=y +CONFIG_PINCTRL_SINGLE=y +CONFIG_SYS_NS16550=y +CONFIG_SPI=y +CONFIG_DESIGNWARE_SPI=y +CONFIG_USB=y +CONFIG_DM_USB_GADGET=y +CONFIG_USB_GADGET=y +CONFIG_USB_GADGET_VENDOR_NUM=0x29f1 +CONFIG_USB_GADGET_PRODUCT_NUM=0x0230 +CONFIG_USB_GADGET_DWC2_OTG=y +CONFIG_USB_GADGET_DOWNLOAD=y +CONFIG_REGEX=y +CONFIG_LZ4=y +CONFIG_LZMA=y +CONFIG_SPL_GZIP=y +# CONFIG_EFI_LOADER is not set diff --git a/src/little/uboot/configs/k230_canmv_01studio_defconfig b/src/little/uboot/configs/k230_canmv_01studio_defconfig new file mode 100755 index 000000000..70591cf4c --- /dev/null +++ b/src/little/uboot/configs/k230_canmv_01studio_defconfig @@ -0,0 +1,112 @@ +CONFIG_RISCV=y +CONFIG_SYS_TEXT_BASE=0x8000000 +CONFIG_SYS_MALLOC_F_LEN=0x40000 +CONFIG_NR_DRAM_BANKS=2 +CONFIG_ENV_SIZE=0x10000 +CONFIG_ENV_OFFSET=0x1e0000 +CONFIG_SPL_DM_SPI=y +CONFIG_DEFAULT_DEVICE_TREE="k230_canmv_01studio" +CONFIG_SPL_TEXT_BASE=0x80300000 +CONFIG_SYS_PROMPT="K230# " +CONFIG_SPL_MMC=y +CONFIG_SPL_SYS_MALLOC_F_LEN=0x30000 +CONFIG_SPL_SIZE_LIMIT=0x80000 +CONFIG_SPL=y +CONFIG_SPL_SPI_FLASH_SUPPORT=y +CONFIG_SPL_SPI=y +CONFIG_SYS_LOAD_ADDR=0xc000000 +CONFIG_BUILD_TARGET="u-boot.bin" +CONFIG_TARGET_K230_CANMV_01STUDIO=y +CONFIG_ARCH_RV64I=y +# CONFIG_SPL_SMP is not set +CONFIG_SHOW_REGS=y +CONFIG_SYS_MEMTEST_END=0x100000 +CONFIG_CC_OPTIMIZE_FOR_DEBUG=y +CONFIG_DISTRO_DEFAULTS=y +CONFIG_FIT=y +CONFIG_TIMESTAMP=y +CONFIG_FIT_SIGNATURE=y +CONFIG_SPL_FIT=y +# CONFIG_SPL_LOAD_FIT is not set +CONFIG_LEGACY_IMAGE_FORMAT=y +CONFIG_BOOTDELAY=5 +CONFIG_LOGLEVEL=7 +CONFIG_SYS_STDIO_DEREGISTER=y +# CONFIG_SYS_DEVICE_NULLDEV is not set +CONFIG_DISPLAY_CPUINFO=y +CONFIG_DISPLAY_BOARDINFO=y +CONFIG_BOARD_EARLY_INIT_F=y +CONFIG_BOARD_LATE_INIT=y +CONFIG_SPL_MAX_SIZE=0x80000 +CONFIG_SPL_BSS_START_ADDR=0x80380000 +CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR=y +CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR=0x1000 +CONFIG_SPL_ENV_SUPPORT=y +CONFIG_SPL_MMC_WRITE=y +CONFIG_SPL_MTD_SUPPORT=y +CONFIG_SPL_NAND_SUPPORT=y +CONFIG_SPL_DM_SPI_FLASH=y +# CONFIG_SPL_SPI_FLASH_TINY is not set +CONFIG_SPL_SPI_LOAD=y +CONFIG_SYS_SPI_U_BOOT_OFFS=0x80000 +CONFIG_SPL_YMODEM_SUPPORT=y +# CONFIG_CMD_CPU is not set +CONFIG_CMD_BOOTMETH=y +CONFIG_SYS_BOOTM_LEN=0x8000000 +CONFIG_CMD_ERASEENV=y +CONFIG_CMD_MD5SUM=y +CONFIG_MD5SUM_VERIFY=y +CONFIG_CMD_MEMTEST=y +CONFIG_SYS_ALT_MEMTEST=y +CONFIG_CMD_GPT=y +CONFIG_CMD_MMC=y +CONFIG_CMD_MTD=y +# CONFIG_CMD_PINMUX is not set +CONFIG_CMD_SF_TEST=y +CONFIG_CMD_USB=y +# CONFIG_SPL_DOS_PARTITION is not set +CONFIG_PARTITION_TYPE_GUID=y +CONFIG_OF_EMBED=y +CONFIG_ENV_IS_IN_MMC=y +CONFIG_ENV_IS_IN_SPI_FLASH=y +CONFIG_ENV_SECT_SIZE_AUTO=y +CONFIG_SYS_RELOC_GD_ENV_ADDR=y +CONFIG_PROT_UDP=y +CONFIG_BOOTP_SERVERIP=y +CONFIG_SPL_DM_DEVICE_REMOVE=y +CONFIG_SPL_CLK=y +CONFIG_DM_KEYBOARD=y +CONFIG_MMC=y +CONFIG_MMC_HS200_SUPPORT=y +CONFIG_SPL_MMC_HS200_SUPPORT=y +CONFIG_MMC_DW=y +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_SDMA=y +CONFIG_MMC_SDHCI_SNPS=y +CONFIG_DM_MTD=y +CONFIG_MTD_SPI_NAND=y +CONFIG_SPI_FLASH_SFDP_SUPPORT=y +CONFIG_SPI_FLASH_SOFT_RESET=y +CONFIG_SPI_FLASH_SOFT_RESET_ON_BOOT=y +CONFIG_SPI_FLASH_GIGADEVICE=y +CONFIG_SPI_FLASH_WINBOND=y +# CONFIG_SPI_FLASH_USE_4K_SECTORS is not set +CONFIG_SPI_FLASH_MTD=y +CONFIG_PINCTRL=y +CONFIG_SPL_PINCTRL=y +CONFIG_SPL_PINCONF=y +CONFIG_PINCTRL_SINGLE=y +CONFIG_SYS_NS16550=y +CONFIG_SPI=y +CONFIG_DESIGNWARE_SPI=y +CONFIG_USB=y +CONFIG_USB_DWC2=y +CONFIG_USB_HOST_ETHER=y +CONFIG_USB_ETHER_ASIX=y +CONFIG_USB_ETHER_ASIX88179=y +CONFIG_USB_ETHER_MCS7830=y +CONFIG_USB_ETHER_RTL8152=y +CONFIG_USB_ETHER_SMSC95XX=y +CONFIG_FAT_WRITE=y +CONFIG_SPL_GZIP=y +# CONFIG_EFI_LOADER is not set diff --git a/src/little/uboot/configs/k230_canmv_burntool_defconfig b/src/little/uboot/configs/k230_canmv_burntool_defconfig new file mode 100755 index 000000000..385e9f4fb --- /dev/null +++ b/src/little/uboot/configs/k230_canmv_burntool_defconfig @@ -0,0 +1,108 @@ +CONFIG_RISCV=y +CONFIG_SYS_TEXT_BASE=0x80300000 +CONFIG_SYS_MALLOC_F_LEN=0x40000 +CONFIG_NR_DRAM_BANKS=2 +CONFIG_ENV_SIZE=0x10000 +CONFIG_DEFAULT_DEVICE_TREE="k230_canmv" +CONFIG_SYS_PROMPT="K230# " +CONFIG_SYS_LOAD_ADDR=0xc000000 +CONFIG_BUILD_TARGET="u-boot.bin" +CONFIG_TARGET_K230_CANMV=y +CONFIG_ARCH_RV64I=y +CONFIG_SHOW_REGS=y +CONFIG_CC_OPTIMIZE_FOR_DEBUG=y +CONFIG_DISTRO_DEFAULTS=y +CONFIG_FIT=y +CONFIG_TIMESTAMP=y +CONFIG_FIT_SIGNATURE=y +CONFIG_LEGACY_IMAGE_FORMAT=y +CONFIG_BOOTDELAY=1 +CONFIG_AUTOBOOT_KEYED=y +CONFIG_AUTOBOOT_STOP_STR="stop" +CONFIG_LOGLEVEL=7 +CONFIG_SYS_STDIO_DEREGISTER=y +# CONFIG_SYS_DEVICE_NULLDEV is not set +CONFIG_DISPLAY_CPUINFO=y +CONFIG_DISPLAY_BOARDINFO=y +CONFIG_BOARD_EARLY_INIT_F=y +# CONFIG_CMD_BDI is not set +# CONFIG_CMD_CONSOLE is not set +# CONFIG_CMD_CPU is not set +# CONFIG_CMD_BOOTFLOW is not set +# CONFIG_CMD_BOOTI is not set +# CONFIG_BOOTM_LINUX is not set +# CONFIG_BOOTM_NETBSD is not set +# CONFIG_BOOTM_PLAN9 is not set +# CONFIG_BOOTM_RTEMS is not set +# CONFIG_BOOTM_VXWORKS is not set +CONFIG_SYS_BOOTM_LEN=0x8000000 +# CONFIG_CMD_ELF is not set +# CONFIG_CMD_FDT is not set +# CONFIG_CMD_GO is not set +# CONFIG_CMD_IMI is not set +# CONFIG_CMD_XIMG is not set +# CONFIG_CMD_EXPORTENV is not set +# CONFIG_CMD_IMPORTENV is not set +# CONFIG_CMD_EDITENV is not set +# CONFIG_CMD_CRC32 is not set +CONFIG_CMD_DFU=y +# CONFIG_CMD_DM is not set +# CONFIG_CMD_FLASH is not set +# CONFIG_CMD_LOADB is not set +# CONFIG_CMD_LOADS is not set +CONFIG_CMD_MMC=y +CONFIG_CMD_MTD=y +# CONFIG_CMD_PINMUX is not set +# CONFIG_CMD_ECHO is not set +# CONFIG_CMD_ITEST is not set +# CONFIG_CMD_SOURCE is not set +# CONFIG_CMD_SETEXPR is not set +# CONFIG_CMD_BLOCK_CACHE is not set +# CONFIG_CMD_SLEEP is not set +CONFIG_CMD_MTDPARTS=y +# CONFIG_DOS_PARTITION is not set +# CONFIG_ISO_PARTITION is not set +# CONFIG_EFI_PARTITION is not set +CONFIG_OF_EMBED=y +CONFIG_SYS_RELOC_GD_ENV_ADDR=y +# CONFIG_NET is not set +CONFIG_DFU_MMC=y +CONFIG_DFU_MTD=y +CONFIG_DFU_SF=y +CONFIG_DFU_VIRT=y +CONFIG_SYS_DFU_DATA_BUF_SIZE=0x80000 +# CONFIG_GPIO is not set +# CONFIG_I2C is not set +# CONFIG_INPUT is not set +CONFIG_MMC=y +CONFIG_MMC_HS200_SUPPORT=y +CONFIG_MMC_DW=y +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_SDMA=y +CONFIG_MMC_SDHCI_SNPS=y +CONFIG_DM_MTD=y +CONFIG_MTD_SPI_NAND=y +CONFIG_SPI_FLASH_SFDP_SUPPORT=y +CONFIG_SPI_FLASH_SOFT_RESET=y +CONFIG_SPI_FLASH_SOFT_RESET_ON_BOOT=y +CONFIG_SPI_FLASH_GIGADEVICE=y +CONFIG_SPI_FLASH_WINBOND=y +# CONFIG_SPI_FLASH_USE_4K_SECTORS is not set +CONFIG_SPI_FLASH_MTD=y +CONFIG_PINCTRL=y +CONFIG_PINCTRL_SINGLE=y +CONFIG_SYS_NS16550=y +CONFIG_SPI=y +CONFIG_DESIGNWARE_SPI=y +CONFIG_USB=y +CONFIG_DM_USB_GADGET=y +CONFIG_USB_GADGET=y +CONFIG_USB_GADGET_VENDOR_NUM=0x29f1 +CONFIG_USB_GADGET_PRODUCT_NUM=0x0230 +CONFIG_USB_GADGET_DWC2_OTG=y +CONFIG_USB_GADGET_DOWNLOAD=y +CONFIG_REGEX=y +CONFIG_LZ4=y +CONFIG_LZMA=y +CONFIG_SPL_GZIP=y +# CONFIG_EFI_LOADER is not set diff --git a/src/little/uboot/configs/k230_canmv_defconfig b/src/little/uboot/configs/k230_canmv_defconfig index 1a00d1dd2..3aa782521 100755 --- a/src/little/uboot/configs/k230_canmv_defconfig +++ b/src/little/uboot/configs/k230_canmv_defconfig @@ -1,7 +1,7 @@ CONFIG_RISCV=y CONFIG_SYS_TEXT_BASE=0x8000000 CONFIG_SYS_MALLOC_F_LEN=0x40000 -CONFIG_NR_DRAM_BANKS=2 +CONFIG_NR_DRAM_BANKS=3 CONFIG_ENV_SIZE=0x10000 CONFIG_ENV_OFFSET=0x1e0000 CONFIG_SPL_DM_SPI=y @@ -73,7 +73,6 @@ CONFIG_ENV_SECT_SIZE_AUTO=y CONFIG_SYS_RELOC_GD_ENV_ADDR=y CONFIG_PROT_UDP=y CONFIG_BOOTP_SERVERIP=y -CONFIG_NET_RANDOM_ETHADDR=y CONFIG_SPL_DM_DEVICE_REMOVE=y CONFIG_SPL_CLK=y CONFIG_DM_KEYBOARD=y diff --git a/src/little/uboot/configs/k230_canmv_v2_defconfig b/src/little/uboot/configs/k230_canmv_v2_defconfig new file mode 100755 index 000000000..ddf543283 --- /dev/null +++ b/src/little/uboot/configs/k230_canmv_v2_defconfig @@ -0,0 +1,113 @@ +CONFIG_RISCV=y +CONFIG_SYS_TEXT_BASE=0x8000000 +CONFIG_SYS_MALLOC_F_LEN=0x40000 +CONFIG_NR_DRAM_BANKS=2 +CONFIG_ENV_SIZE=0x10000 +CONFIG_ENV_OFFSET=0x1e0000 +CONFIG_SPL_DM_SPI=y +CONFIG_DEFAULT_DEVICE_TREE="k230_canmv_v2" +CONFIG_SPL_TEXT_BASE=0x80300000 +CONFIG_SYS_PROMPT="K230# " +CONFIG_SPL_MMC=y +CONFIG_SPL_SYS_MALLOC_F_LEN=0x30000 +CONFIG_SPL_SIZE_LIMIT=0x80000 +CONFIG_SPL=y +CONFIG_SPL_SPI_FLASH_SUPPORT=y +CONFIG_SPL_SPI=y +CONFIG_SYS_LOAD_ADDR=0xc000000 +CONFIG_BUILD_TARGET="u-boot.bin" +CONFIG_TARGET_K230_CANMV=y +CONFIG_ARCH_RV64I=y +# CONFIG_SPL_SMP is not set +CONFIG_SHOW_REGS=y +CONFIG_SYS_MEMTEST_END=0x100000 +CONFIG_CC_OPTIMIZE_FOR_DEBUG=y +CONFIG_DISTRO_DEFAULTS=y +CONFIG_FIT=y +CONFIG_TIMESTAMP=y +CONFIG_FIT_SIGNATURE=y +CONFIG_SPL_FIT=y +# CONFIG_SPL_LOAD_FIT is not set +CONFIG_LEGACY_IMAGE_FORMAT=y +CONFIG_BOOTDELAY=5 +CONFIG_LOGLEVEL=7 +CONFIG_SYS_STDIO_DEREGISTER=y +# CONFIG_SYS_DEVICE_NULLDEV is not set +CONFIG_DISPLAY_CPUINFO=y +CONFIG_DISPLAY_BOARDINFO=y +CONFIG_BOARD_EARLY_INIT_F=y +CONFIG_BOARD_LATE_INIT=y +CONFIG_SPL_MAX_SIZE=0x80000 +CONFIG_SPL_BSS_START_ADDR=0x80380000 +CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_USE_SECTOR=y +CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR=0x1000 +CONFIG_SPL_ENV_SUPPORT=y +CONFIG_SPL_MMC_WRITE=y +CONFIG_SPL_MTD_SUPPORT=y +CONFIG_SPL_NAND_SUPPORT=y +CONFIG_SPL_DM_SPI_FLASH=y +# CONFIG_SPL_SPI_FLASH_TINY is not set +CONFIG_SPL_SPI_LOAD=y +CONFIG_SYS_SPI_U_BOOT_OFFS=0x80000 +CONFIG_SPL_YMODEM_SUPPORT=y +# CONFIG_CMD_CPU is not set +CONFIG_CMD_BOOTMETH=y +CONFIG_SYS_BOOTM_LEN=0x8000000 +CONFIG_CMD_ERASEENV=y +CONFIG_CMD_MD5SUM=y +CONFIG_MD5SUM_VERIFY=y +CONFIG_CMD_MEMTEST=y +CONFIG_SYS_ALT_MEMTEST=y +CONFIG_CMD_GPT=y +CONFIG_CMD_MMC=y +CONFIG_CMD_MTD=y +# CONFIG_CMD_PINMUX is not set +CONFIG_CMD_SF_TEST=y +CONFIG_CMD_USB=y +# CONFIG_SPL_DOS_PARTITION is not set +CONFIG_PARTITION_TYPE_GUID=y +CONFIG_OF_EMBED=y +CONFIG_ENV_IS_IN_MMC=y +CONFIG_ENV_IS_IN_SPI_FLASH=y +CONFIG_ENV_SECT_SIZE_AUTO=y +CONFIG_SYS_RELOC_GD_ENV_ADDR=y +CONFIG_PROT_UDP=y +CONFIG_BOOTP_SERVERIP=y +CONFIG_NET_RANDOM_ETHADDR=y +CONFIG_SPL_DM_DEVICE_REMOVE=y +CONFIG_SPL_CLK=y +CONFIG_DM_KEYBOARD=y +CONFIG_MMC=y +CONFIG_MMC_HS200_SUPPORT=y +CONFIG_SPL_MMC_HS200_SUPPORT=y +CONFIG_MMC_DW=y +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_SDMA=y +CONFIG_MMC_SDHCI_SNPS=y +CONFIG_DM_MTD=y +CONFIG_MTD_SPI_NAND=y +CONFIG_SPI_FLASH_SFDP_SUPPORT=y +CONFIG_SPI_FLASH_SOFT_RESET=y +CONFIG_SPI_FLASH_SOFT_RESET_ON_BOOT=y +CONFIG_SPI_FLASH_GIGADEVICE=y +CONFIG_SPI_FLASH_WINBOND=y +# CONFIG_SPI_FLASH_USE_4K_SECTORS is not set +CONFIG_SPI_FLASH_MTD=y +CONFIG_PINCTRL=y +CONFIG_SPL_PINCTRL=y +CONFIG_SPL_PINCONF=y +CONFIG_PINCTRL_SINGLE=y +CONFIG_SYS_NS16550=y +CONFIG_SPI=y +CONFIG_DESIGNWARE_SPI=y +CONFIG_USB=y +CONFIG_USB_DWC2=y +CONFIG_USB_HOST_ETHER=y +CONFIG_USB_ETHER_ASIX=y +CONFIG_USB_ETHER_ASIX88179=y +CONFIG_USB_ETHER_MCS7830=y +CONFIG_USB_ETHER_RTL8152=y +CONFIG_USB_ETHER_SMSC95XX=y +CONFIG_FAT_WRITE=y +CONFIG_SPL_GZIP=y +# CONFIG_EFI_LOADER is not set diff --git a/src/little/uboot/configs/k230_evb_burntool_defconfig b/src/little/uboot/configs/k230_evb_burntool_defconfig new file mode 100755 index 000000000..6ce263cf2 --- /dev/null +++ b/src/little/uboot/configs/k230_evb_burntool_defconfig @@ -0,0 +1,108 @@ +CONFIG_RISCV=y +CONFIG_SYS_TEXT_BASE=0x80300000 +CONFIG_SYS_MALLOC_F_LEN=0x40000 +CONFIG_NR_DRAM_BANKS=2 +CONFIG_ENV_SIZE=0x10000 +CONFIG_DEFAULT_DEVICE_TREE="k230_evb" +CONFIG_SYS_PROMPT="K230# " +CONFIG_SYS_LOAD_ADDR=0xc000000 +CONFIG_BUILD_TARGET="u-boot.bin" +CONFIG_TARGET_K230_EVB=y +CONFIG_ARCH_RV64I=y +CONFIG_SHOW_REGS=y +CONFIG_CC_OPTIMIZE_FOR_DEBUG=y +CONFIG_DISTRO_DEFAULTS=y +CONFIG_FIT=y +CONFIG_TIMESTAMP=y +CONFIG_FIT_SIGNATURE=y +CONFIG_LEGACY_IMAGE_FORMAT=y +CONFIG_BOOTDELAY=1 +CONFIG_AUTOBOOT_KEYED=y +CONFIG_AUTOBOOT_STOP_STR="stop" +CONFIG_LOGLEVEL=7 +CONFIG_SYS_STDIO_DEREGISTER=y +# CONFIG_SYS_DEVICE_NULLDEV is not set +CONFIG_DISPLAY_CPUINFO=y +CONFIG_DISPLAY_BOARDINFO=y +CONFIG_BOARD_EARLY_INIT_F=y +# CONFIG_CMD_BDI is not set +# CONFIG_CMD_CONSOLE is not set +# CONFIG_CMD_CPU is not set +# CONFIG_CMD_BOOTFLOW is not set +# CONFIG_CMD_BOOTI is not set +# CONFIG_BOOTM_LINUX is not set +# CONFIG_BOOTM_NETBSD is not set +# CONFIG_BOOTM_PLAN9 is not set +# CONFIG_BOOTM_RTEMS is not set +# CONFIG_BOOTM_VXWORKS is not set +CONFIG_SYS_BOOTM_LEN=0x8000000 +# CONFIG_CMD_ELF is not set +# CONFIG_CMD_FDT is not set +# CONFIG_CMD_GO is not set +# CONFIG_CMD_IMI is not set +# CONFIG_CMD_XIMG is not set +# CONFIG_CMD_EXPORTENV is not set +# CONFIG_CMD_IMPORTENV is not set +# CONFIG_CMD_EDITENV is not set +# CONFIG_CMD_CRC32 is not set +CONFIG_CMD_DFU=y +# CONFIG_CMD_DM is not set +# CONFIG_CMD_FLASH is not set +# CONFIG_CMD_LOADB is not set +# CONFIG_CMD_LOADS is not set +CONFIG_CMD_MMC=y +CONFIG_CMD_MTD=y +# CONFIG_CMD_PINMUX is not set +# CONFIG_CMD_ECHO is not set +# CONFIG_CMD_ITEST is not set +# CONFIG_CMD_SOURCE is not set +# CONFIG_CMD_SETEXPR is not set +# CONFIG_CMD_BLOCK_CACHE is not set +# CONFIG_CMD_SLEEP is not set +CONFIG_CMD_MTDPARTS=y +# CONFIG_DOS_PARTITION is not set +# CONFIG_ISO_PARTITION is not set +# CONFIG_EFI_PARTITION is not set +CONFIG_OF_EMBED=y +CONFIG_SYS_RELOC_GD_ENV_ADDR=y +# CONFIG_NET is not set +CONFIG_DFU_MMC=y +CONFIG_DFU_MTD=y +CONFIG_DFU_SF=y +CONFIG_DFU_VIRT=y +CONFIG_SYS_DFU_DATA_BUF_SIZE=0x80000 +# CONFIG_GPIO is not set +# CONFIG_I2C is not set +# CONFIG_INPUT is not set +CONFIG_MMC=y +CONFIG_MMC_HS200_SUPPORT=y +CONFIG_MMC_DW=y +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_SDMA=y +CONFIG_MMC_SDHCI_SNPS=y +CONFIG_DM_MTD=y +CONFIG_MTD_SPI_NAND=y +CONFIG_SPI_FLASH_SFDP_SUPPORT=y +CONFIG_SPI_FLASH_SOFT_RESET=y +CONFIG_SPI_FLASH_SOFT_RESET_ON_BOOT=y +CONFIG_SPI_FLASH_GIGADEVICE=y +CONFIG_SPI_FLASH_WINBOND=y +# CONFIG_SPI_FLASH_USE_4K_SECTORS is not set +CONFIG_SPI_FLASH_MTD=y +CONFIG_PINCTRL=y +CONFIG_PINCTRL_SINGLE=y +CONFIG_SYS_NS16550=y +CONFIG_SPI=y +CONFIG_DESIGNWARE_SPI=y +CONFIG_USB=y +CONFIG_DM_USB_GADGET=y +CONFIG_USB_GADGET=y +CONFIG_USB_GADGET_VENDOR_NUM=0x29f1 +CONFIG_USB_GADGET_PRODUCT_NUM=0x0230 +CONFIG_USB_GADGET_DWC2_OTG=y +CONFIG_USB_GADGET_DOWNLOAD=y +CONFIG_REGEX=y +CONFIG_LZ4=y +CONFIG_LZMA=y +CONFIG_SPL_GZIP=y +# CONFIG_EFI_LOADER is not set diff --git a/src/little/uboot/configs/k230d_canmv_burntool_defconfig b/src/little/uboot/configs/k230d_canmv_burntool_defconfig new file mode 100755 index 000000000..03ee29e3a --- /dev/null +++ b/src/little/uboot/configs/k230d_canmv_burntool_defconfig @@ -0,0 +1,108 @@ +CONFIG_RISCV=y +CONFIG_SYS_TEXT_BASE=0x80300000 +CONFIG_SYS_MALLOC_F_LEN=0x40000 +CONFIG_NR_DRAM_BANKS=2 +CONFIG_ENV_SIZE=0x10000 +CONFIG_DEFAULT_DEVICE_TREE="k230d_canmv" +CONFIG_SYS_PROMPT="K230# " +CONFIG_SYS_LOAD_ADDR=0xc000000 +CONFIG_BUILD_TARGET="u-boot.bin" +CONFIG_TARGET_K230D_CANMV=y +CONFIG_ARCH_RV64I=y +CONFIG_SHOW_REGS=y +CONFIG_CC_OPTIMIZE_FOR_DEBUG=y +CONFIG_DISTRO_DEFAULTS=y +CONFIG_FIT=y +CONFIG_TIMESTAMP=y +CONFIG_FIT_SIGNATURE=y +CONFIG_LEGACY_IMAGE_FORMAT=y +CONFIG_BOOTDELAY=1 +CONFIG_AUTOBOOT_KEYED=y +CONFIG_AUTOBOOT_STOP_STR="stop" +CONFIG_LOGLEVEL=7 +CONFIG_SYS_STDIO_DEREGISTER=y +# CONFIG_SYS_DEVICE_NULLDEV is not set +CONFIG_DISPLAY_CPUINFO=y +CONFIG_DISPLAY_BOARDINFO=y +CONFIG_BOARD_EARLY_INIT_F=y +# CONFIG_CMD_BDI is not set +# CONFIG_CMD_CONSOLE is not set +# CONFIG_CMD_CPU is not set +# CONFIG_CMD_BOOTFLOW is not set +# CONFIG_CMD_BOOTI is not set +# CONFIG_BOOTM_LINUX is not set +# CONFIG_BOOTM_NETBSD is not set +# CONFIG_BOOTM_PLAN9 is not set +# CONFIG_BOOTM_RTEMS is not set +# CONFIG_BOOTM_VXWORKS is not set +CONFIG_SYS_BOOTM_LEN=0x8000000 +# CONFIG_CMD_ELF is not set +# CONFIG_CMD_FDT is not set +# CONFIG_CMD_GO is not set +# CONFIG_CMD_IMI is not set +# CONFIG_CMD_XIMG is not set +# CONFIG_CMD_EXPORTENV is not set +# CONFIG_CMD_IMPORTENV is not set +# CONFIG_CMD_EDITENV is not set +# CONFIG_CMD_CRC32 is not set +CONFIG_CMD_DFU=y +# CONFIG_CMD_DM is not set +# CONFIG_CMD_FLASH is not set +# CONFIG_CMD_LOADB is not set +# CONFIG_CMD_LOADS is not set +CONFIG_CMD_MMC=y +CONFIG_CMD_MTD=y +# CONFIG_CMD_PINMUX is not set +# CONFIG_CMD_ECHO is not set +# CONFIG_CMD_ITEST is not set +# CONFIG_CMD_SOURCE is not set +# CONFIG_CMD_SETEXPR is not set +# CONFIG_CMD_BLOCK_CACHE is not set +# CONFIG_CMD_SLEEP is not set +CONFIG_CMD_MTDPARTS=y +# CONFIG_DOS_PARTITION is not set +# CONFIG_ISO_PARTITION is not set +# CONFIG_EFI_PARTITION is not set +CONFIG_OF_EMBED=y +CONFIG_SYS_RELOC_GD_ENV_ADDR=y +# CONFIG_NET is not set +CONFIG_DFU_MMC=y +CONFIG_DFU_MTD=y +CONFIG_DFU_SF=y +CONFIG_DFU_VIRT=y +CONFIG_SYS_DFU_DATA_BUF_SIZE=0x80000 +# CONFIG_GPIO is not set +# CONFIG_I2C is not set +# CONFIG_INPUT is not set +CONFIG_MMC=y +CONFIG_MMC_HS200_SUPPORT=y +CONFIG_MMC_DW=y +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_SDMA=y +CONFIG_MMC_SDHCI_SNPS=y +CONFIG_DM_MTD=y +CONFIG_MTD_SPI_NAND=y +CONFIG_SPI_FLASH_SFDP_SUPPORT=y +CONFIG_SPI_FLASH_SOFT_RESET=y +CONFIG_SPI_FLASH_SOFT_RESET_ON_BOOT=y +CONFIG_SPI_FLASH_GIGADEVICE=y +CONFIG_SPI_FLASH_WINBOND=y +# CONFIG_SPI_FLASH_USE_4K_SECTORS is not set +CONFIG_SPI_FLASH_MTD=y +CONFIG_PINCTRL=y +CONFIG_PINCTRL_SINGLE=y +CONFIG_SYS_NS16550=y +CONFIG_SPI=y +CONFIG_DESIGNWARE_SPI=y +CONFIG_USB=y +CONFIG_DM_USB_GADGET=y +CONFIG_USB_GADGET=y +CONFIG_USB_GADGET_VENDOR_NUM=0x29f1 +CONFIG_USB_GADGET_PRODUCT_NUM=0x0230 +CONFIG_USB_GADGET_DWC2_OTG=y +CONFIG_USB_GADGET_DOWNLOAD=y +CONFIG_REGEX=y +CONFIG_LZ4=y +CONFIG_LZMA=y +CONFIG_SPL_GZIP=y +# CONFIG_EFI_LOADER is not set diff --git a/src/little/uboot/configs/k230d_canmv_defconfig b/src/little/uboot/configs/k230d_canmv_defconfig index f03ae68b8..c6ed5361a 100755 --- a/src/little/uboot/configs/k230d_canmv_defconfig +++ b/src/little/uboot/configs/k230d_canmv_defconfig @@ -74,7 +74,6 @@ CONFIG_ENV_SECT_SIZE_AUTO=y CONFIG_SYS_RELOC_GD_ENV_ADDR=y CONFIG_PROT_UDP=y CONFIG_BOOTP_SERVERIP=y -CONFIG_NET_RANDOM_ETHADDR=y CONFIG_SPL_DM_DEVICE_REMOVE=y CONFIG_SPL_CLK=y CONFIG_DM_KEYBOARD=y diff --git a/src/little/uboot/drivers/dfu/dfu_mtd.c b/src/little/uboot/drivers/dfu/dfu_mtd.c index c7075f12e..6aeff9069 100644 --- a/src/little/uboot/drivers/dfu/dfu_mtd.c +++ b/src/little/uboot/drivers/dfu/dfu_mtd.c @@ -91,17 +91,31 @@ static int mtd_block_op(enum dfu_op op, struct dfu_entity *dfu, return -EIO; } + /* Skip the block if it is bad, don't erase it again */ + ret = mtd_block_isbad(mtd, erase_op.addr); + if (ret) { + printf("Skipping %s at 0x%08llx\n", + ret == 1 ? "bad block" : "bbt reserved", + erase_op.addr); + erase_op.addr += mtd->erasesize; + continue; + } + ret = mtd_erase(mtd, &erase_op); if (ret) { - /* Abort if its not a bad block error */ - if (ret != -EIO) { - printf("Failure while erasing at offset 0x%llx\n", - erase_op.fail_addr); - return 0; + /* If this is not -EIO, we have no idea what to do. */ + if (ret == -EIO) { + printf("Marking bad block at 0x%08llx (%d)\n", + erase_op.fail_addr, ret); + ret = mtd_block_markbad(mtd, erase_op.addr); + } + /* Abort if it is not -EIO or can't mark bad */ + if (ret) { + printf("Failure while erasing at offset 0x%llx (%d)\n", + erase_op.fail_addr, ret); + return ret; } - printf("Skipping bad block at 0x%08llx\n", - erase_op.addr); } else { remaining -= mtd->erasesize; } @@ -227,7 +241,7 @@ static int dfu_flush_medium_mtd(struct dfu_entity *dfu) int ret; /* in case of ubi partition, erase rest of the partition */ - if (dfu->data.mtd.ubi) { + if (1) { struct erase_info erase_op = {}; erase_op.mtd = dfu->data.mtd.info; @@ -238,7 +252,7 @@ static int dfu_flush_medium_mtd(struct dfu_entity *dfu) remaining = dfu->data.mtd.start + dfu->data.mtd.size - erase_op.addr; - + printf("offset:0x%x remaining:0x%x \n", erase_op.addr, remaining); while (remaining) { ret = mtd_erase(mtd, &erase_op); diff --git a/src/little/uboot/drivers/pwm/Kconfig b/src/little/uboot/drivers/pwm/Kconfig index 6e79868d0..b285be238 100644 --- a/src/little/uboot/drivers/pwm/Kconfig +++ b/src/little/uboot/drivers/pwm/Kconfig @@ -118,3 +118,9 @@ config PWM_TI_EHRPWM default y help PWM driver support for the EHRPWM controller found on TI SOCs. + +config PWM_KENDRYTE + bool "Enable support for Kendryte PWM" + depends on DM_PWM + help + This PWM is found CANAAN's K230. diff --git a/src/little/uboot/drivers/pwm/Makefile b/src/little/uboot/drivers/pwm/Makefile index e4d10c8dc..19cb0c8d0 100644 --- a/src/little/uboot/drivers/pwm/Makefile +++ b/src/little/uboot/drivers/pwm/Makefile @@ -24,3 +24,4 @@ obj-$(CONFIG_PWM_SIFIVE) += pwm-sifive.o obj-$(CONFIG_PWM_TEGRA) += tegra_pwm.o obj-$(CONFIG_PWM_SUNXI) += sunxi_pwm.o obj-$(CONFIG_PWM_TI_EHRPWM) += pwm-ti-ehrpwm.o +obj-$(CONFIG_PWM_KENDRYTE) += pwm-kendryte.o diff --git a/src/little/uboot/drivers/pwm/pwm-kendryte.c b/src/little/uboot/drivers/pwm/pwm-kendryte.c new file mode 100755 index 000000000..ebcf89fc0 --- /dev/null +++ b/src/little/uboot/drivers/pwm/pwm-kendryte.c @@ -0,0 +1,147 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef NSEC_PER_SEC +#define NSEC_PER_SEC 1000000000L +#endif + +DECLARE_GLOBAL_DATA_PTR; + +struct pwm_kendryte_regs { + volatile uint32_t pwmcfg; + volatile uint32_t reserved0; + volatile uint32_t pwmcount; + volatile uint32_t reserved1; + volatile uint32_t pwms; + volatile uint32_t reserved2; + volatile uint32_t reserved3; + volatile uint32_t reserved4; + volatile uint32_t pwmcmp0; + volatile uint32_t pwmcmp1; + volatile uint32_t pwmcmp2; + volatile uint32_t pwmcmp3; +}; + +struct pwm_kendryte_priv { + void __iomem *base; + ulong freq; +}; + +static int pwm_kendryte_set_config(struct udevice *dev, uint channel, + uint period_ns, uint duty_ns) +{ + struct pwm_kendryte_priv *priv = dev_get_priv(dev); + struct pwm_kendryte_regs *reg = priv->base; + + debug("%s: period_ns=%u, duty_ns=%u\n", __func__, period_ns, duty_ns); + + uint64_t period, pulse, pwmcmpx_max; + uint32_t pwmscale = 0; + uint64_t pwm_clock = priv->freq; + + period = (pwm_clock * period_ns) / NSEC_PER_SEC; + pulse = (pwm_clock * duty_ns) / NSEC_PER_SEC; + + if (pulse > period) + { + return -EINVAL; + } + + if(period > ((1 << (15 + 16)) - 1LL)) + { + return -EINVAL; + } + + pwmcmpx_max = (1 << 16) - 1; + while ((period >> pwmscale) > pwmcmpx_max) + { + pwmscale++; + } + + if(pwmscale > 0xf) + { + return -EINVAL; + } + + reg->pwmcfg |= (1 << 9); //default always mode + reg->pwmcfg |= pwmscale; //scale + reg->pwmcmp0 = (period >> pwmscale); + + + switch(channel) + { + case 0: + reg->pwmcmp1 = (reg->pwmcmp0 - (pulse >> pwmscale)); + break; + case 1: + reg->pwmcmp2 = (reg->pwmcmp0 - (pulse >> pwmscale)); + break; + case 2: + reg->pwmcmp3 = (reg->pwmcmp0 - (pulse >> pwmscale)); + break; + default: + break; + } + debug("%s: channel=%u, reg->pwmcmp3=0x%x 0x%x\n", __func__, channel, reg->pwmcmp3, &(reg->pwmcmp3)); + return 0; +} + +static int pwm_kendryte_set_enable(struct udevice *dev, uint channel, bool enable) +{ + struct pwm_kendryte_priv *priv = dev_get_priv(dev); + struct pwm_kendryte_regs *reg = priv->base; + + debug("%s: Enable '%s'\n", __func__, dev->name); + + if (enable) + reg->pwmcfg |= (1 << 12); + else + reg->pwmcfg &= ~(1 << 12); + + return 0; +} + +static int pwm_kendryte_probe(struct udevice *dev) +{ + struct pwm_kendryte_priv *priv = dev_get_priv(dev); + struct clk clk; + int ret = 0; + + ret = clk_get_by_index(dev, 0, &clk); + if (ret < 0) { + debug("%s get clock fail!\n", __func__); + return -EINVAL; + } + + priv->freq = clk_get_rate(&clk); + priv->base = dev_read_addr_ptr(dev); + + return 0; +} + +static const struct pwm_ops pwm_kendryte_ops = { + .set_config = pwm_kendryte_set_config, + .set_enable = pwm_kendryte_set_enable, +}; + +static const struct udevice_id pwm_kendryte_ids[] = { + { .compatible = "kendryte,pwm"}, + { } +}; + +U_BOOT_DRIVER(pwm_kendryte) = { + .name = "pwm_kendryte", + .id = UCLASS_PWM, + .of_match = pwm_kendryte_ids, + .ops = &pwm_kendryte_ops, + .probe = pwm_kendryte_probe, + .priv_auto = sizeof(struct pwm_kendryte_priv), +}; diff --git a/src/little/uboot/drivers/usb/gadget/dwc2_udc_otg.c b/src/little/uboot/drivers/usb/gadget/dwc2_udc_otg.c index e3e46310b..a4d23a90b 100644 --- a/src/little/uboot/drivers/usb/gadget/dwc2_udc_otg.c +++ b/src/little/uboot/drivers/usb/gadget/dwc2_udc_otg.c @@ -49,16 +49,13 @@ #include "dwc2_udc_otg_priv.h" /***********************************************************/ -#pragma GCC push_options -#pragma GCC optimize ("O0") #define OTG_DMA_MODE 1 -#define DEBUG_SETUP 1 -#define DEBUG_EP0 1 -#define DEBUG_ISR 1 -#define DEBUG_OUT_EP 1 -#define DEBUG_IN_EP 1 -#define DEBUG 1 +#define DEBUG_SETUP 0 +#define DEBUG_EP0 0 +#define DEBUG_ISR 0 +#define DEBUG_OUT_EP 0 +#define DEBUG_IN_EP 0 #include @@ -1214,4 +1211,3 @@ int dwc2_udc_B_session_valid(struct udevice *dev) return readl(&usbotg_reg->gotgctl) & B_SESSION_VALID; } #endif /* CONFIG_IS_ENABLED(DM_USB_GADGET) */ -#pragma GCC pop_options diff --git a/src/little/uboot/drivers/usb/host/usb-uclass.c b/src/little/uboot/drivers/usb/host/usb-uclass.c index f674eaa07..58d15441a 100644 --- a/src/little/uboot/drivers/usb/host/usb-uclass.c +++ b/src/little/uboot/drivers/usb/host/usb-uclass.c @@ -5,8 +5,6 @@ * * usb_match_device() modified from Linux kernel v4.0. */ -#pragma GCC push_options -#pragma GCC optimize ("O0") #define LOG_CATEGORY UCLASS_USB #include @@ -869,4 +867,3 @@ U_BOOT_DRIVER(usb_dev_generic_drv) = { .id = UCLASS_USB_DEV_GENERIC, .name = "usb_dev_generic_drv", }; -#pragma GCC pop_options \ No newline at end of file diff --git a/src/little/uboot/include/configs/k230_evb.h b/src/little/uboot/include/configs/k230_evb.h index 126ac6542..88e590883 100755 --- a/src/little/uboot/include/configs/k230_evb.h +++ b/src/little/uboot/include/configs/k230_evb.h @@ -35,6 +35,12 @@ #define CONFIG_SYS_NS16550_MEM32 #define DWC2_UTMI_WIDTH 16 +#if CONFIG_CMD_DFU +#define DEFAULT_BOOTCMD_ENV "bootcmd=k230_dfu; \0" +#else +#define DEFAULT_BOOTCMD_ENV "bootcmd=k230_boot auto auto_boot; \0" +#endif + #define CONFIG_EXTRA_ENV_SETTINGS \ "dtb_addr=0xa000000 \0" \ "fdt_high=0xa100000\0" \ @@ -48,7 +54,7 @@ "usb_load=usb start; dhcp; tftp $ramdisk_addr jiangxiangbing/rtt_systems.bin; k230_boot mem $ramdisk_addr 0x$filesize; tftp $kernel_addr jiangxiangbing/fw_payload.img;tftp $ramdisk_addr jiangxiangbing/rootfs-final.cpio.gz;tftp $dtb_addr jiangxiangbing/k230.dtb\0" \ "bootcmd_usb=run usb_load; bootm $kernel_addr - $dtb_addr \0" \ "bootcmd_baremetal= mmc dev 1; mmc read 0 0x5000 0xa000; boot_baremetal 1 0 1400000;\0" \ - "bootcmd=k230_boot auto auto_boot; \0" \ + DEFAULT_BOOTCMD_ENV \ "upspiuboot=usb start; dhcp; tftp 0xc100000 10.10.1.94:wjx/u-boot.img && sf probe 0:0;sf erase 0x80000 0x180000; sf update 0x$fileaddr 0x80000 0x$filesize; \0" \ "upspiimg=usb start; dhcp; tftp 0x9000000 10.10.1.94:wjx/sysimage-spinor32m.img;sf probe 0:0;sf erase 0 0x2000000;sf write 0x$fileaddr 0 0x$filesize; \0" \ "upsduboot=usb start; dhcp; tftp 0xc100000 10.10.1.94:wjx/u-boot.img && mmc dev 1; mmc write 0x$fileaddr 0x1000 0xc00; \0" \ diff --git a/src/little/uboot/include/dt-bindings/pinctrl/k230_evb.h b/src/little/uboot/include/dt-bindings/pinctrl/k230_evb.h index a35e36e64..2a6c27398 100755 --- a/src/little/uboot/include/dt-bindings/pinctrl/k230_evb.h +++ b/src/little/uboot/include/dt-bindings/pinctrl/k230_evb.h @@ -112,4 +112,16 @@ #define IO62 (62*4) #define IO63 (63*4) +#define IO64 (0*4) +#define IO65 (1*4) +#define IO66 (2*4) +#define IO67 (3*4) +#define IO68 (4*4) +#define IO69 (5*4) +#define IO70 (6*4) +#define IO71 (7*4) + +#define PMU_IOSEL_INT 0x2 +#define PMU_IOSEL_GPIO 0x1 + #endif /* DT_K230_EVB_H */ diff --git a/src/little/uboot/net/eth-uclass.c b/src/little/uboot/net/eth-uclass.c index 0f6b45b00..615b0b976 100644 --- a/src/little/uboot/net/eth-uclass.c +++ b/src/little/uboot/net/eth-uclass.c @@ -599,9 +599,18 @@ static int eth_post_probe(struct udevice *dev) eth_env_set_enetaddr_by_index("eth", dev_seq(dev), pdata->enetaddr); #else - printf("\nError: %s address not set.\n", - dev->name); - return -EINVAL; + unsigned int *trng_addr = (unsigned int *)0x91213300; + unsigned int trng_data = *trng_addr; + pdata->enetaddr[0] = 0x00; + pdata->enetaddr[1] = 0xe0; + pdata->enetaddr[2] = 0x4c; + pdata->enetaddr[3] = trng_data & 0xff; + pdata->enetaddr[4] = (trng_data>>8) & 0xff; + pdata->enetaddr[5] = (trng_data>>16) & 0xff; + printf("\nWarning: %s (eth%d) using CANAAN MAC address - %pM\n", + dev->name, dev_seq(dev), pdata->enetaddr); + eth_env_set_enetaddr_by_index("eth", dev_seq(dev), + pdata->enetaddr); #endif } diff --git a/src/reference/ai_poc/CMakeLists.txt b/src/reference/ai_poc/CMakeLists.txt index 563b083b7..e55b2351c 100644 --- a/src/reference/ai_poc/CMakeLists.txt +++ b/src/reference/ai_poc/CMakeLists.txt @@ -19,62 +19,22 @@ include_directories(${nncase_sdk_root}/riscv64/nncase/include) include_directories(${nncase_sdk_root}/riscv64/nncase/include/nncase/runtime) link_directories(${nncase_sdk_root}/riscv64/nncase/lib/) -# 使用if语句检查变量的值 -if(ENABLE_SUB) - add_subdirectory(face_detection) - add_subdirectory(face_landmark) - add_subdirectory(face_glasses) - add_subdirectory(face_mask) - add_subdirectory(face_emotion) - add_subdirectory(face_pose) - add_subdirectory(face_gender) - add_subdirectory(face_parse) - add_subdirectory(head_detection) - add_subdirectory(sq_hand_det) - add_subdirectory(sq_handkp_class) - add_subdirectory(sq_handkp_det) - add_subdirectory(sq_handreco) - add_subdirectory(sq_handkp_ocr) - add_subdirectory(licence_det) - add_subdirectory(licence_det_rec) - add_subdirectory(object_detect_yolov8n) - add_subdirectory(person_detect) - add_subdirectory(falldown_detect) - add_subdirectory(pose_detect) - add_subdirectory(person_attr) - add_subdirectory(vehicle_attr) - add_subdirectory(pphumanseg) - add_subdirectory(fitness) - add_subdirectory(bytetrack) - add_subdirectory(segment_yolov8n) - add_subdirectory(finger_guessing) - add_subdirectory(smoke_detect) - add_subdirectory(nanotracker) - add_subdirectory(traffic_light_detect) - add_subdirectory(space_resize) - add_subdirectory(eye_gaze) -else() - add_subdirectory(helmet_detect) - add_subdirectory(puzzle_game) - add_subdirectory(dynamic_gesture) - add_subdirectory(ocr) - add_subdirectory(yolop_lane_seg) - add_subdirectory(anomaly_det) - add_subdirectory(face_alignment) - add_subdirectory(face_mesh) - add_subdirectory(translate_en_ch) - add_subdirectory(self_learning) - add_subdirectory(crosswalk_detect) - add_subdirectory(virtual_keyboard) - add_subdirectory(sq_handkp_flower) - add_subdirectory(face_verification) - add_subdirectory(dms_system) - add_subdirectory(distraction_reminder) - add_subdirectory(kws) - add_subdirectory(tts_zh) - add_subdirectory(person_distance) - add_subdirectory(demo_mix) - add_subdirectory(dec_ai_enc) -endif() - - +# 定义要排除的目录列表 +set(exclude_dirs "cmake" "k230_bin" "shell" "out" "llamac" ".git") +file(GLOB files "${CMAKE_CURRENT_SOURCE_DIR}/*") +foreach(file ${files}) + # 判断当前文件是否是一个目录 + if(IS_DIRECTORY ${file}) + # 获取目录名称 + get_filename_component(dir_name ${file} NAME) + # 检查目录是否在排除列表中 + list(FIND exclude_dirs ${dir_name} is_exclude_dir) + # 如果目录不在排除列表中,则处理该目录 + if(${is_exclude_dir} EQUAL -1) + # 处理该目录,例如添加到项目中 + if(${dir_name}) + add_subdirectory(${dir_name}) + endif() + endif() + endif() +endforeach() \ No newline at end of file diff --git a/src/reference/ai_poc/anomaly_det/vi_vo.h b/src/reference/ai_poc/anomaly_det/vi_vo.h index f0c1bccc5..0a11a4d31 100644 --- a/src/reference/ai_poc/anomaly_det/vi_vo.h +++ b/src/reference/ai_poc/anomaly_det/vi_vo.h @@ -57,7 +57,7 @@ #include "k_autoconf_comm.h" -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) #define SENSOR_CHANNEL (3) // isp通道数 #define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 #define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 @@ -286,7 +286,7 @@ static k_s32 sample_connector_init(void) { k_u32 ret = 0; k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; #else k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; @@ -378,7 +378,8 @@ int vivcap_start() #if defined(CONFIG_BOARD_K230_CANMV) sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; #else sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; #endif @@ -444,7 +445,7 @@ int vivcap_start() memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); dev_attr.acq_win.h_start = 0; dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) dev_attr.acq_win.width = ISP_CHN0_WIDTH; dev_attr.acq_win.height = ISP_CHN0_HEIGHT; #else @@ -476,7 +477,7 @@ int vivcap_start() chn_attr.out_win.height = ISP_CHN0_HEIGHT; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else // chn_attr.crop_win = dev_attr.acq_win; @@ -522,7 +523,7 @@ int vivcap_start() chn_attr.out_win.height = SENSOR_HEIGHT; // chn_attr.crop_win = dev_attr.acq_win; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else chn_attr.crop_win.h_start = 768; diff --git a/src/reference/ai_poc/build_app.sh b/src/reference/ai_poc/build_app.sh index 40b3e6b8b..12b92709d 100755 --- a/src/reference/ai_poc/build_app.sh +++ b/src/reference/ai_poc/build_app.sh @@ -1,5 +1,5 @@ #!/bin/bash -set -x +# set -x # set cross build toolchain export PATH=$PATH:/opt/toolchain/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu/bin/ @@ -7,260 +7,515 @@ export PATH=$PATH:/opt/toolchain/riscv64-linux-musleabi_for_x86_64-pc-linux-gnu/ clear rm -rf out mkdir out -pushd out -cmake -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_INSTALL_PREFIX=`pwd` \ - -DCMAKE_TOOLCHAIN_FILE=cmake/Riscv64.cmake \ - -DENABLE_SUB=ON \ - .. -make -j && make install - -cmake -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_INSTALL_PREFIX=`pwd` \ - -DCMAKE_TOOLCHAIN_FILE=cmake/Riscv64.cmake \ - -DENABLE_SUB=OFF \ - .. - -make -j && make install -popd +subdirs=$(find . -mindepth 1 -maxdepth 1 -type d) k230_bin=`pwd`/k230_bin rm -rf ${k230_bin} mkdir -p ${k230_bin} -cp -a ../../big/kmodel/ai_poc/kmodel/*.kmodel ${k230_bin} -cp -a ../../big/kmodel/ai_poc/images/* ${k230_bin} -mkdir ${k230_bin}/bytetrack_data/output -cp -a ../../big/kmodel/ai_poc/utils/* ${k230_bin} -cp -a shell/* ${k230_bin} - -/opt/toolchain/Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.6.0/bin/riscv64-unknown-linux-gnu-g++ -O3 llamac/llama_run.cc -o out/llama_run -lm - -if [ -f out/bin/face_detection.elf ]; then - cp out/bin/face_detection.elf ${k230_bin} -fi - -if [ -f out/bin/face_landmark.elf ]; then - cp out/bin/face_landmark.elf ${k230_bin} -fi - -if [ -f out/bin/face_glasses.elf ]; then - cp out/bin/face_glasses.elf ${k230_bin} -fi - -if [ -f out/bin/face_mask.elf ]; then - cp out/bin/face_mask.elf ${k230_bin} -fi - -if [ -f out/bin/face_emotion.elf ]; then - cp out/bin/face_emotion.elf ${k230_bin} -fi - -if [ -f out/bin/face_pose.elf ]; then - cp out/bin/face_pose.elf ${k230_bin} -fi - -if [ -f out/bin/face_gender.elf ]; then - cp out/bin/face_gender.elf ${k230_bin} -fi - -if [ -f out/bin/face_parse.elf ]; then - cp out/bin/face_parse.elf ${k230_bin} -fi - -if [ -f out/bin/head_detection.elf ]; then - cp out/bin/head_detection.elf ${k230_bin} -fi - -if [ -f out/bin/sq_hand_det.elf ]; then - cp out/bin/sq_hand_det.elf ${k230_bin} -fi - -if [ -f out/bin/sq_handkp_class.elf ]; then - cp out/bin/sq_handkp_class.elf ${k230_bin} -fi - -if [ -f out/bin/sq_handkp_det.elf ]; then - cp out/bin/sq_handkp_det.elf ${k230_bin} -fi - -if [ -f out/bin/sq_handreco.elf ]; then - cp out/bin/sq_handreco.elf ${k230_bin} -fi - -if [ -f out/bin/sq_handkp_ocr.elf ]; then - cp out/bin/sq_handkp_ocr.elf ${k230_bin} -fi - -if [ -f out/bin/licence_det.elf ]; then - cp out/bin/licence_det.elf ${k230_bin} -fi - -if [ -f out/bin/licence_det_rec.elf ]; then - cp out/bin/licence_det_rec.elf ${k230_bin} -fi - -if [ -f out/bin/ob_det.elf ]; then - cp out/bin/ob_det.elf ${k230_bin} -fi - -if [ -f out/bin/person_detect.elf ]; then - cp out/bin/person_detect.elf ${k230_bin} -fi - -if [ -f out/bin/falldown_detect.elf ]; then - cp out/bin/falldown_detect.elf ${k230_bin} -fi - -if [ -f out/bin/pose_detect.elf ]; then - cp out/bin/pose_detect.elf ${k230_bin} -fi - -if [ -f out/bin/person_attr.elf ]; then - cp out/bin/person_attr.elf ${k230_bin} -fi - -if [ -f out/bin/vehicle_attr.elf ]; then - cp out/bin/vehicle_attr.elf ${k230_bin} -fi - -if [ -f out/bin/pphumanseg.elf ]; then - cp out/bin/pphumanseg.elf ${k230_bin} -fi - -if [ -f out/bin/fitness.elf ]; then - cp out/bin/fitness.elf ${k230_bin} -fi - -if [ -f out/bin/bytetrack.elf ]; then - cp out/bin/bytetrack.elf ${k230_bin} -fi - -if [ -f out/bin/seg.elf ]; then - cp out/bin/seg.elf ${k230_bin} -fi - -if [ -f out/llama_run ]; then - cp out/llama_run ${k230_bin} -fi - -if [ -f out/bin/finger_guessing.elf ]; then - cp out/bin/finger_guessing.elf ${k230_bin} -fi - -if [ -f out/bin/smoke_detect.elf ]; then - cp out/bin/smoke_detect.elf ${k230_bin} -fi - -if [ -f out/bin/nanotracker.elf ]; then - cp out/bin/nanotracker.elf ${k230_bin} -fi - -if [ -f out/bin/traffic_light_detect.elf ]; then - cp out/bin/traffic_light_detect.elf ${k230_bin} -fi - -if [ -f out/bin/space_resize.elf ]; then - cp out/bin/space_resize.elf ${k230_bin} -fi - -if [ -f out/bin/eye_gaze.elf ]; then - cp out/bin/eye_gaze.elf ${k230_bin} -fi - -if [ -f out/bin/helmet_detect.elf ]; then - cp out/bin/helmet_detect.elf ${k230_bin} -fi - -if [ -f out/bin/puzzle_game.elf ]; then - cp out/bin/puzzle_game.elf ${k230_bin} -fi - -if [ -f out/bin/dynamic_gesture.elf ]; then - cp out/bin/dynamic_gesture.elf ${k230_bin} -fi - -if [ -f out/bin/ocr_reco.elf ]; then - cp out/bin/ocr_reco.elf ${k230_bin} -fi - -if [ -f out/bin/yolop.elf ]; then - cp out/bin/yolop.elf ${k230_bin} -fi - -if [ -f out/bin/anomaly_det.elf ]; then - cp out/bin/anomaly_det.elf ${k230_bin} -fi - -if [ -f out/bin/face_mesh.elf ]; then - cp out/bin/face_mesh.elf ${k230_bin} -fi - -if [ -f out/bin/face_alignment.elf ]; then - cp out/bin/face_alignment.elf ${k230_bin} -fi - -if [ -f out/bin/translate_en_ch.elf ]; then - cp out/bin/translate_en_ch.elf ${k230_bin} -fi - -if [ -f out/bin/self_learning.elf ]; then - cp out/bin/self_learning.elf ${k230_bin} -fi - -if [ -f out/bin/crosswalk_detect.elf ]; then - cp out/bin/crosswalk_detect.elf ${k230_bin} -fi - -if [ -f out/bin/virtual_keyboard.elf ]; then - cp out/bin/virtual_keyboard.elf ${k230_bin} -fi - -if [ -f out/bin/sq_handkp_flower.elf ]; then - cp out/bin/sq_handkp_flower.elf ${k230_bin} -fi - -if [ -f out/bin/face_verification.elf ]; then - cp out/bin/face_verification.elf ${k230_bin} -fi - -if [ -f out/bin/dms.elf ]; then - cp out/bin/dms.elf ${k230_bin} -fi - -if [ -f out/bin/distraction_reminder.elf ]; then - cp out/bin/distraction_reminder.elf ${k230_bin} -fi - -if [ -f out/bin/kws.elf ]; then - cp out/bin/kws.elf ${k230_bin} -fi - -if [ -f out/bin/tts_zh.elf ]; then - cp out/bin/tts_zh.elf ${k230_bin} -fi - -if [ -f out/bin/person_distance.elf ]; then - cp out/bin/person_distance.elf ${k230_bin} -fi - -if [ -f out/bin/demo_mix.elf ]; then - cp out/bin/demo_mix.elf ${k230_bin} -fi - -if [ -f out/bin/dec_enc.elf ]; then - cp out/bin/dec_enc.elf ${k230_bin} -fi - -if [ -f out/bin/dec.elf ]; then - cp out/bin/dec.elf ${k230_bin} -fi - -if [ -f out/bin/enc.elf ]; then - cp out/bin/enc.elf ${k230_bin} -fi - - +if [ -z "$1" ]; then + curr_pro="all" +else + curr_pro="$1" +fi + +echo "$curr_pro" + +for subdir in $(ls -d */); do + if [ ! -d "$subdir" ]; then + echo "$subdir 不是一个目录,跳过..." + continue + fi + + subdir_name=$(basename $subdir) + # 检查子目录是否为目录"A",如果是,则跳过 + if [ "$subdir_name" = "cmake" ] || [[ "$subdir_name" == k230_bin* ]] || [ "$subdir_name" = "shell" ] || [ "$subdir_name" = "out" ]; then + continue + fi + + if [ "$subdir_name" = "llamac" ] && { [ "$curr_pro" = "llamac" ] || [ "$curr_pro" = "all" ]; }; then + /opt/toolchain/Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.6.0/bin/riscv64-unknown-linux-gnu-g++ -O3 llamac/llama_run.cc -o out/llama_run -lm + elif { [ "$curr_pro" = "$subdir_name" ] || [ "$curr_pro" = "all" ]; }; then + echo "******************$subdir_name 开始编译******************" + if [ "$subdir_name" = "pose_det_rtsp_plug" ]; then + cd pose_det_rtsp_plug/little/ + ./build.sh + cd ../../ + elif [ "$subdir_name" = "translate_en_ch" ]; then + cp -a ../../big/kmodel/ai_poc/utils/*.a ${k230_bin} + fi + pushd out + cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=`pwd` \ + -DCMAKE_TOOLCHAIN_FILE=cmake/Riscv64.cmake \ + -D$subdir_name=ON \ + .. + make -j && make install + echo "******************$subdir_name 编译完成******************" + popd + else + continue + fi + + mkdir -p ${k230_bin}/$subdir_name + if [ "$subdir_name" = "face_detection" ]; then + cp out/bin/face_detection.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/face_detection_320.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/face_detection_640.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/images/1024x624.jpg ${k230_bin}/$subdir_name + cp -a shell/face_detect_*.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "face_landmark" ]; then + cp out/bin/face_landmark.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/face_detection_320.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/face_landmark.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/images/1024x1331.jpg ${k230_bin}/$subdir_name + cp -a shell/face_landmark_*.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "face_glasses" ]; then + cp out/bin/face_glasses.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/face_detection_320.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/face_glasses.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/images/1024x768.jpg ${k230_bin}/$subdir_name + cp -a shell/face_glasses_*.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "face_mask" ]; then + cp out/bin/face_mask.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/face_detection_320.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/face_mask.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/images/1024x768.jpg ${k230_bin}/$subdir_name + cp -a shell/face_mask_*.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "face_emotion" ]; then + cp out/bin/face_emotion.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/face_detection_320.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/face_emotion.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/images/1024x768.jpg ${k230_bin}/$subdir_name + cp -a shell/face_emotion_*.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "face_pose" ]; then + cp out/bin/face_pose.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/face_detection_320.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/face_pose.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/images/1024x768.jpg ${k230_bin}/$subdir_name + cp -a shell/face_pose_*.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "face_gender" ]; then + cp out/bin/face_gender.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/face_detection_320.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/face_gender.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/images/1024x768.jpg ${k230_bin}/$subdir_name + cp -a shell/face_gender_*.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "face_parse" ]; then + cp out/bin/face_parse.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/face_detection_320.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/face_parse.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/images/1024x768.jpg ${k230_bin}/$subdir_name + cp -a shell/face_parse_*.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "head_detection" ]; then + cp out/bin/head_detection.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/head_detection.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/images/640x340.jpg ${k230_bin}/$subdir_name + cp -a shell/head_detect_*.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "sq_hand_det" ]; then + cp out/bin/sq_hand_det.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/hand_det.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/images/input_hd.jpg ${k230_bin}/$subdir_name + cp -a shell/handdet_cpp_*.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "sq_handkp_class" ]; then + cp out/bin/sq_handkp_class.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/hand_det.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/handkp_det.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/images/input_hd.jpg ${k230_bin}/$subdir_name + cp -a shell/handkpclass_cpp_*.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "sq_handkp_det" ]; then + cp out/bin/sq_handkp_det.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/hand_det.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/handkp_det.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/images/input_hd.jpg ${k230_bin}/$subdir_name + cp -a shell/handkpdet_cpp_*.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "sq_handreco" ]; then + cp out/bin/sq_handreco.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/hand_det.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/hand_reco.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/images/input_hd.jpg ${k230_bin}/$subdir_name + cp -a shell/handreco_cpp_*.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "sq_handkp_ocr" ]; then + cp out/bin/sq_handkp_ocr.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/hand_det.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/handkp_det.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/ocr_det.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/ocr_rec.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/images/input_ocr.jpg ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/utils/HZKf2424.hz ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/utils/Asci0816.zf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/utils/dict_6625.txt ${k230_bin}/$subdir_name + cp -a shell/handkpocr_cpp_*.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "licence_det" ]; then + cp out/bin/licence_det.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/LPD_640.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/images/licence.jpg ${k230_bin}/$subdir_name + cp -a shell/licence_detect_*.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "licence_det_rec" ]; then + cp out/bin/licence_det_rec.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/LPD_640.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/licence_reco.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/images/licence.jpg ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/utils/HZKf2424.hz ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/utils/Asci0816.zf ${k230_bin}/$subdir_name + cp -a shell/licence_detect_*.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "object_detect_yolov8n" ]; then + cp out/bin/ob_det.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/yolov8n_320.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/yolov8n_640.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/images/bus.jpg ${k230_bin}/$subdir_name + cp -a shell/ob_detect_*.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "person_detect" ]; then + cp out/bin/person_detect.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/person_detect_yolov5n.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/images/bus.jpg ${k230_bin}/$subdir_name + cp -a shell/person_detect_*.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "falldown_detect" ]; then + cp out/bin/falldown_detect.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/yolov5n-falldown.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/images/falldown_elder.jpg ${k230_bin}/$subdir_name + cp -a shell/falldown_detect_*.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "pose_detect" ]; then + cp out/bin/pose_detect.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/yolov8n-pose.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/images/bus.jpg ${k230_bin}/$subdir_name + cp -a shell/pose_detect_*.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "person_attr" ]; then + cp out/bin/person_attr.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/person_attr_yolov5n.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/person_pulc.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/images/hrnet_demo.jpg ${k230_bin}/$subdir_name + cp -a shell/person_attr_*.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "vehicle_attr" ]; then + cp out/bin/vehicle_attr.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/vehicle_attr_yolov5n.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/vehicle.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/images/car.jpg ${k230_bin}/$subdir_name + cp -a shell/vehicle_attr_*.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "pphumanseg" ]; then + cp out/bin/pphumanseg.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/human_seg_2023mar.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/images/1000.jpg ${k230_bin}/$subdir_name + cp -a shell/pphumanseg_*.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "fitness" ]; then + cp out/bin/fitness.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/yolov8n-pose.kmodel ${k230_bin}/$subdir_name + cp -a shell/fitness_*.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "bytetrack" ]; then + cp out/bin/bytetrack.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/bytetrack_yolov5n.kmodel ${k230_bin}/$subdir_name + cp -ar ../../big/kmodel/ai_poc/images/bytetrack_data ${k230_bin}/$subdir_name + cp -a shell/bytetrack_*.sh ${k230_bin}/$subdir_name + mkdir -p ${k230_bin}/$subdir_name/bytetrack_data/output + fi + + if [ "$subdir_name" = "segment_yolov8n" ]; then + cp out/bin/seg.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/yolov8n_seg_320.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/yolov8n_seg_640.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/images/bus.jpg ${k230_bin}/$subdir_name + cp -a shell/segment_*.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "llamac" ]; then + cp out/llama_run ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/utils/llama.bin ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/utils/tokenizer.bin ${k230_bin}/$subdir_name + cp -a shell/llama_build.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "finger_guessing" ]; then + cp out/bin/finger_guessing.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/hand_det.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/handkp_det.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/utils/shitou.bin ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/utils/bu.bin ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/utils/jiandao.bin ${k230_bin}/$subdir_name + cp -a shell/finger_guessing_*.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "smoke_detect" ]; then + cp out/bin/smoke_detect.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/yolov5s_smoke_best.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/images/smoke1.jpg ${k230_bin}/$subdir_name + cp -a shell/smoke_detect_*.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "nanotracker" ]; then + cp out/bin/nanotracker.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/cropped_test127.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/nanotrack_backbone_sim.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/nanotracker_head_calib_k230.kmodel ${k230_bin}/$subdir_name + cp -a shell/nanotracker_*.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "traffic_light_detect" ]; then + cp out/bin/traffic_light_detect.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/traffic.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/images/traffic.jpg ${k230_bin}/$subdir_name + cp -a shell/traffic_light_detect_*.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "space_resize" ]; then + cp out/bin/space_resize.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/hand_det.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/handkp_det.kmodel ${k230_bin}/$subdir_name + cp -a shell/space_resize_*.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "eye_gaze" ]; then + cp out/bin/eye_gaze.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/face_detection_320.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/eye_gaze.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/images/1024x1111.jpg ${k230_bin}/$subdir_name + cp -a shell/eye_gaze_*.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "helmet_detect" ]; then + cp out/bin/helmet_detect.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/helmet.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/images/helmet.jpg ${k230_bin}/$subdir_name + cp -a shell/helmet_detect_*.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "puzzle_game" ]; then + cp out/bin/puzzle_game.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/hand_det.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/handkp_det.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/utils/pintu.bin ${k230_bin}/$subdir_name + cp -a shell/puzzle_game_*.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "dynamic_gesture" ]; then + cp out/bin/dynamic_gesture.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/hand_det.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/handkp_det.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/gesture.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/utils/shang.bin ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/utils/xia.bin ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/utils/zuo.bin ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/utils/you.bin ${k230_bin}/$subdir_name + cp -a shell/gesture*.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "ocr" ]; then + cp out/bin/ocr_reco.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/ocr_det_int16.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/ocr_rec_int16.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/images/333.jpg ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/utils/dict_ocr.txt ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/utils/dict_ocr_16.txt ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/utils/HZKf2424.hz ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/utils/Asci0816.zf ${k230_bin}/$subdir_name + cp -a shell/ocr_*.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "yolop" ]; then + cp out/bin/yolop.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/yolop.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/images/333.jpg ${k230_bin}/$subdir_name + cp -a shell/yolop_*.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "anomaly_det" ]; then + cp out/bin/anomaly_det.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/anomaly_det.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/images/000.png ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/utils/memory.bin ${k230_bin}/$subdir_name + cp -a shell/anomaly_det_*.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "face_mesh" ]; then + cp out/bin/face_mesh.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/face_detection_320.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/face_alignment.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/face_alignment_post.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/images/1024x768.jpg ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/utils/bfm_tri.bin ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/utils/ncc_code.bin ${k230_bin}/$subdir_name + cp -a shell/face_mesh_*.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "face_alignment" ]; then + cp out/bin/face_alignment.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/face_detection_320.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/face_alignment.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/face_alignment_post.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/images/1024x768.jpg ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/utils/bfm_tri.bin ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/utils/ncc_code.bin ${k230_bin}/$subdir_name + cp -a shell/face_alignment_*.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "translate_en_ch" ]; then + cp out/bin/translate_en_ch.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/translate_encoder.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/translate_decoder.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/utils/trans_src.model ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/utils/trans_tag.model ${k230_bin}/$subdir_name + cp -a shell/translate_en_ch.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "self_learning" ]; then + cp out/bin/self_learning.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/recognition.kmodel ${k230_bin}/$subdir_name + cp -a shell/self_learning.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "crosswalk_detect" ]; then + cp out/bin/crosswalk_detect.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/crosswalk.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/images/cw.jpg ${k230_bin}/$subdir_name + cp -a shell/crosswalk_detect_*.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "virtual_keyboard" ]; then + cp out/bin/virtual_keyboard.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/hand_det.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/handkp_det.kmodel ${k230_bin}/$subdir_name + cp -a shell/virtual_keyboard.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "sq_handkp_flower" ]; then + cp out/bin/sq_handkp_flower.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/hand_det.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/handkp_det.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/flower_rec.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/images/input_flower.jpg ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/utils/HZKf2424.hz ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/utils/Asci0816.zf ${k230_bin}/$subdir_name + cp -a shell/handkpflower_*.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "face_verification" ]; then + cp out/bin/face_verification.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/face_detection_320.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/face_recognition.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/images/identification_card.png ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/images/person.png ${k230_bin}/$subdir_name + cp -a shell/face_verification_*.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "dms_system" ]; then + cp out/bin/dms.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/face_detection_320.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/hand_det.kmodel ${k230_bin}/$subdir_name + cp -a shell/dms_*.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "distraction_reminder" ]; then + cp out/bin/distraction_reminder.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/face_detection_320.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/face_pose.kmodel ${k230_bin}/$subdir_name + cp -a shell/distraction_reminder_*.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "kws" ]; then + cp out/bin/kws.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/kws.kmodel ${k230_bin}/$subdir_name + cp -ar ../../big/kmodel/ai_poc/utils/reply_wav/ ${k230_bin}/$subdir_name + cp -a shell/kws.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "tts_zh" ]; then + cp out/bin/tts_zh.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/zh_fastspeech_1.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/zh_fastspeech_2.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/hifigan.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/utils/wav_play.elf ${k230_bin}/$subdir_name + cp -ar ../../big/kmodel/ai_poc/utils/file ${k230_bin}/$subdir_name + cp -a shell/tts_zh.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "person_distance" ]; then + cp out/bin/person_distance.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/person_detect_yolov5n.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/images/input_pd.jpg ${k230_bin}/$subdir_name + cp -a shell/person_distance_*.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "demo_mix" ]; then + cp out/bin/demo_mix.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/hand_det.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/handkp_det.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/gesture.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/face_detection_320.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/face_pose.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/nanotrack_backbone_sim.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/nanotracker_head_calib_k230.kmodel ${k230_bin}/$subdir_name + cp -a shell/demo_mix.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "dec_ai_enc" ]; then + cp out/bin/dec_enc.elf ${k230_bin}/$subdir_name + cp out/bin/dec.elf ${k230_bin}/$subdir_name + cp out/bin/enc.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/face_detection_hwc.kmodel ${k230_bin}/$subdir_name + cp -a shell/dec*.sh ${k230_bin}/$subdir_name + cp -a shell/enc*.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "yolop_lane_seg" ]; then + cp out/bin/yolop.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/yolop.kmodel ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/images/road.jpg ${k230_bin}/$subdir_name + cp -a shell/yolop_*.sh ${k230_bin}/$subdir_name + fi + + if [ "$subdir_name" = "pose_det_rtsp_plug" ]; then + cp pose_det_rtsp_plug/little/out/rtspServer ${k230_bin}/$subdir_name + cp out/bin/pose_det_enc.elf ${k230_bin}/$subdir_name + cp -a ../../big/kmodel/ai_poc/kmodel/yolov8n-pose.kmodel ${k230_bin}/$subdir_name + cp -a shell/rtsp_plug_*.sh ${k230_bin}/$subdir_name + fi +done rm -rf out diff --git a/src/reference/ai_poc/bytetrack/vi_vo.h b/src/reference/ai_poc/bytetrack/vi_vo.h index e3d8bdba4..0a11a4d31 100644 --- a/src/reference/ai_poc/bytetrack/vi_vo.h +++ b/src/reference/ai_poc/bytetrack/vi_vo.h @@ -1,627 +1,628 @@ -/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include -#include -#include - -#include "mpi_sys_api.h" - -/* vicap */ -#include -#include -#include -#include -#include - -#include "k_module.h" -#include "k_type.h" -#include "k_vb_comm.h" -#include "k_video_comm.h" -#include "k_sys_comm.h" -#include "mpi_vb_api.h" -#include "mpi_vicap_api.h" -#include "mpi_isp_api.h" -#include "mpi_sys_api.h" -#include "k_vo_comm.h" -#include "mpi_vo_api.h" - -#include "vo_test_case.h" - -#include "k_connector_comm.h" -#include "mpi_connector_api.h" -#include "k_autoconf_comm.h" - - -#if defined(CONFIG_BOARD_K230_CANMV) -#define SENSOR_CHANNEL (3) // isp通道数 -#define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 -#define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 -#define ISP_CHN0_WIDTH (1920)//(1920) -#define ISP_CHN0_HEIGHT (1080)//(1080) -#define vicap_install_osd (1) -#define osd_id K_VO_OSD3 -#define osd_width (1920) -#define osd_height (1080) -#else -#define SENSOR_CHANNEL (3) // isp通道数 -#define SENSOR_HEIGHT (1280) // isp高度,ai输入,竖屏 -#define SENSOR_WIDTH (720) // isp宽度,ai输入,竖屏 -#define ISP_CHN0_WIDTH (1088)//(1920) -#define ISP_CHN0_HEIGHT (1920)//(1080) -#define vicap_install_osd (1) -#define osd_id K_VO_OSD3 -#define osd_width (1080) -#define osd_height (1920) -#endif - - -k_vb_config config; -k_vicap_dev vicap_dev; -k_vicap_chn vicap_chn; -k_vicap_dev_attr dev_attr; -k_vicap_chn_attr chn_attr; -k_vicap_sensor_info sensor_info; -k_vicap_sensor_type sensor_type; -k_mpp_chn vicap_mpp_chn; -k_mpp_chn vo_mpp_chn; - -k_video_frame_info dump_info; - -k_vo_draw_frame vo_frame = (k_vo_draw_frame) { - 1, - 16, - 16, - 128, - 128, - 1 -}; - -static k_vb_blk_handle block; -k_u32 g_pool_id; - -int vo_creat_layer_test(k_vo_layer chn_id, layer_info *info) -{ - k_vo_video_layer_attr attr; - - // check layer - if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) - || ((info->func != 0) && (chn_id == K_VO_LAYER2))) - { - printf("input layer num failed \n"); - return -1 ; - } - - // check scaler - - // set offset - attr.display_rect = info->offset; - // set act - attr.img_size = info->act_size; - // sget size - info->size = info->act_size.height * info->act_size.width * 3 / 2; - //set pixel format - attr.pixel_format = info->format; - if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) - { - printf("input pix format failed \n"); - return -1; - } - // set stride - attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); - // set function - attr.func = info->func; - // set scaler attr - attr.scaler_attr = info->attr; - - // set video layer atrr - kd_mpi_vo_set_video_layer_attr(chn_id, &attr); - - // enable layer - kd_mpi_vo_enable_video_layer(chn_id); - - return 0; -} - -k_vb_blk_handle vo_insert_frame(k_video_frame_info *vf_info, void **pic_vaddr) -{ - k_u64 phys_addr = 0; - k_u32 *virt_addr; - k_vb_blk_handle handle; - k_s32 size; - - if (vf_info == NULL) - return K_FALSE; - - if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_8888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_8888) - size = vf_info->v_frame.height * vf_info->v_frame.width * 4; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_565 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_565) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_4444 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_4444) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_888) - size = vf_info->v_frame.height * vf_info->v_frame.width * 3; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_1555 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_1555) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) - size = vf_info->v_frame.height * vf_info->v_frame.width * 3 / 2; - - size = size + 4096; // 强制4K ,后边得删了 - - printf("vb block size is %x \n", size); - - handle = kd_mpi_vb_get_block(g_pool_id, size, NULL); - if (handle == VB_INVALID_HANDLE) - { - printf("%s get vb block error\n", __func__); - return K_FAILED; - } - - phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); - if (phys_addr == 0) - { - printf("%s get phys addr error\n", __func__); - return K_FAILED; - } - - virt_addr = (k_u32 *)kd_mpi_sys_mmap(phys_addr, size); - // virt_addr = (k_u32 *)kd_mpi_sys_mmap_cached(phys_addr, size); - - if (virt_addr == NULL) - { - printf("%s mmap error\n", __func__); - return K_FAILED; - } - - vf_info->mod_id = K_ID_VO; - vf_info->pool_id = g_pool_id; - vf_info->v_frame.phys_addr[0] = phys_addr; - if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) - vf_info->v_frame.phys_addr[1] = phys_addr + (vf_info->v_frame.height * vf_info->v_frame.stride[0]); - *pic_vaddr = virt_addr; - - printf("phys_addr is %lx g_pool_id is %d \n", phys_addr, g_pool_id); - - return handle; -} - -k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) -{ - k_vo_video_osd_attr attr; - - // set attr - attr.global_alptha = info->global_alptha; - - if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) - { - info->size = info->act_size.width * info->act_size.height * 4; - info->stride = info->act_size.width * 4 / 8; - } - else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) - { - info->size = info->act_size.width * info->act_size.height * 3; - info->stride = info->act_size.width * 3 / 8; - } - else if(info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else if(info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else - { - printf("set osd pixel format failed \n"); - } - - attr.stride = info->stride; - attr.pixel_format = info->format; - attr.display_rect = info->offset; - attr.img_size = info->act_size; - kd_mpi_vo_set_video_osd_attr(osd, &attr); - - kd_mpi_vo_osd_enable(osd); - - return 0; -} - -void sample_vicap_install_osd(void) -{ - osd_info osd; - - osd.act_size.width = osd_width ; - osd.act_size.height = osd_height; - osd.offset.x = 0; - osd.offset.y = 0; - osd.global_alptha = 0xff; - // osd.global_alptha = 0x32; - osd.format = PIXEL_FORMAT_ARGB_8888;//PIXEL_FORMAT_ARGB_4444; //PIXEL_FORMAT_ARGB_1555;//PIXEL_FORMAT_ARGB_8888; - - vo_creat_osd_test(osd_id, &osd); -} - -void vo_osd_release_block(void) -{ - if(vicap_install_osd == 1) - { - kd_mpi_vo_osd_disable(osd_id); - kd_mpi_vb_release_block(block); - } - -} - -static k_s32 sample_connector_init(void) -{ - k_u32 ret = 0; - k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) - k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; -#else - k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; -#endif - k_connector_info connector_info; - - memset(&connector_info, 0, sizeof(k_connector_info)); - - //connector get sensor info - ret = kd_mpi_get_connector_info(connector_type, &connector_info); - if (ret) { - printf("sample_vicap, the sensor type not supported!\n"); - return ret; - } - - connector_fd = kd_mpi_connector_open(connector_info.connector_name); - if (connector_fd < 0) { - printf("%s, connector open failed.\n", __func__); - return K_ERR_VO_NOTREADY; - } - - // set connect power - kd_mpi_connector_power_set(connector_fd, K_TRUE); - // connector init - kd_mpi_connector_init(connector_fd, connector_info); - - return 0; -} - -static k_s32 vo_layer_vdss_bind_vo_config(void) -{ - layer_info info; - - k_vo_layer chn_id = K_VO_LAYER1; - - memset(&info, 0, sizeof(info)); - - sample_connector_init(); - - // config lyaer - info.act_size.width = ISP_CHN0_WIDTH;//ISP_CHN0_HEIGHT;//1080;//640;//1080; - info.act_size.height = ISP_CHN0_HEIGHT;//ISP_CHN0_WIDTH;//1920;//480;//1920; - info.format = PIXEL_FORMAT_YVU_PLANAR_420; - info.func = 0;//K_ROTATION_180;////K_ROTATION_90; - info.global_alptha = 0xff; - info.offset.x = 0;//(1080-w)/2, - info.offset.y = 0;//(1920-h)/2; - vo_creat_layer_test(chn_id, &info); - - if(vicap_install_osd == 1) - sample_vicap_install_osd(); - - //exit ; - return 0; -} - -static void sample_vicap_bind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) -{ - k_s32 ret; - - ret = kd_mpi_sys_bind(&vicap_mpp_chn, &vo_mpp_chn); - if (ret) { - printf("kd_mpi_sys_unbind failed:0x%x\n", ret); - } - - return; -} - -static void sample_vicap_unbind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) -{ - k_s32 ret; - - ret = kd_mpi_sys_unbind(&vicap_mpp_chn, &vo_mpp_chn); - if (ret) { - printf("kd_mpi_sys_unbind failed:0x%x\n", ret); - } - - return; -} - -int vivcap_start() -{ - k_s32 ret = 0; - - k_u32 pool_id; - k_vb_pool_config pool_config; - - printf("sample_vicap ...\n"); - -#if defined(CONFIG_BOARD_K230_CANMV) - sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); -#else - sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; -#endif - vicap_dev = VICAP_DEV_ID_0; - - memset(&config, 0, sizeof(config)); - config.max_pool_cnt = 64; - //VB for YUV420SP output - config.comm_pool[0].blk_cnt = 5; - config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; - config.comm_pool[0].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), VICAP_ALIGN_1K); - - //VB for RGB888 output - config.comm_pool[1].blk_cnt = 5; - config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; - config.comm_pool[1].blk_size = VICAP_ALIGN_UP((SENSOR_HEIGHT * SENSOR_WIDTH * 3 ), VICAP_ALIGN_1K); - - ret = kd_mpi_vb_set_config(&config); - if (ret) { - printf("vb_set_config failed ret:%d\n", ret); - return ret; - } - - k_vb_supplement_config supplement_config; - memset(&supplement_config, 0, sizeof(supplement_config)); - supplement_config.supplement_config |= VB_SUPPLEMENT_JPEG_MASK; - - ret = kd_mpi_vb_set_supplement_config(&supplement_config); - if (ret) { - printf("vb_set_supplement_config failed ret:%d\n", ret); - return ret; - } - - ret = kd_mpi_vb_init(); - if (ret) { - printf("vb_init failed ret:%d\n", ret); - return ret; - } - printf("sample_vicap ...kd_mpi_vicap_get_sensor_info\n"); - - // dwc_dsi_init(); - vo_layer_vdss_bind_vo_config(); - - if(vicap_install_osd == 1) - { - memset(&pool_config, 0, sizeof(pool_config)); - pool_config.blk_size = VICAP_ALIGN_UP((osd_width * osd_height * 4 * 2), VICAP_ALIGN_1K); - pool_config.blk_cnt = 4; - pool_config.mode = VB_REMAP_MODE_NOCACHE; - pool_id = kd_mpi_vb_create_pool(&pool_config); // osd0 - 3 argb 320 x 240 - g_pool_id = pool_id; - - printf("--------aa--------------g_pool_id is %d pool_id is %d \n",g_pool_id, pool_id); - } - - memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); - ret = kd_mpi_vicap_get_sensor_info(sensor_type, &sensor_info); - if (ret) { - printf("sample_vicap, the sensor type not supported!\n"); - return ret; - } - - memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); - dev_attr.acq_win.h_start = 0; - dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) - dev_attr.acq_win.width = ISP_CHN0_WIDTH; - dev_attr.acq_win.height = ISP_CHN0_HEIGHT; -#else - dev_attr.acq_win.width = 2592;//SENSOR_HEIGHT; - dev_attr.acq_win.height = 1944;//SENSOR_WIDTH; -#endif - dev_attr.mode = VICAP_WORK_ONLINE_MODE; - - dev_attr.pipe_ctrl.data = 0xFFFFFFFF; - dev_attr.pipe_ctrl.bits.af_enable = 0; - dev_attr.pipe_ctrl.bits.ahdr_enable = 0; - - - dev_attr.cpature_frame = 0; - memcpy(&dev_attr.sensor_info, &sensor_info, sizeof(k_vicap_sensor_info)); - - ret = kd_mpi_vicap_set_dev_attr(vicap_dev, dev_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_dev_attr failed.\n"); - return ret; - } - - memset(&chn_attr, 0, sizeof(k_vicap_chn_attr)); - - //set chn0 output yuv420sp - chn_attr.out_win.h_start = 0; - chn_attr.out_win.v_start = 0; - chn_attr.out_win.width = ISP_CHN0_WIDTH; - chn_attr.out_win.height = ISP_CHN0_HEIGHT; - - -#if defined(CONFIG_BOARD_K230_CANMV) - chn_attr.crop_win = dev_attr.acq_win; -#else - // chn_attr.crop_win = dev_attr.acq_win; - chn_attr.crop_win.h_start = 768; - chn_attr.crop_win.v_start = 16; - chn_attr.crop_win.width = ISP_CHN0_WIDTH; - chn_attr.crop_win.height = ISP_CHN0_HEIGHT; -#endif - - chn_attr.scale_win = chn_attr.out_win; - chn_attr.crop_enable = K_FALSE; - chn_attr.scale_enable = K_FALSE; - // chn_attr.dw_enable = K_FALSE; - chn_attr.chn_enable = K_TRUE; - chn_attr.pix_format = PIXEL_FORMAT_YVU_PLANAR_420; - chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp - chn_attr.buffer_size = config.comm_pool[0].blk_size; - vicap_chn = VICAP_CHN_ID_0; - - printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); - ret = kd_mpi_vicap_set_chn_attr(vicap_dev, vicap_chn, chn_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); - return ret; - } - - //bind vicap chn 0 to vo - vicap_mpp_chn.mod_id = K_ID_VI; - vicap_mpp_chn.dev_id = vicap_dev; - vicap_mpp_chn.chn_id = vicap_chn; - - vo_mpp_chn.mod_id = K_ID_VO; - vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; - vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; - - sample_vicap_bind_vo(vicap_mpp_chn, vo_mpp_chn); - printf("sample_vicap ...dwc_dsi_init\n"); - - //set chn1 output rgb888p - chn_attr.out_win.h_start = 0; - chn_attr.out_win.v_start = 0; - chn_attr.out_win.width = SENSOR_WIDTH ; - chn_attr.out_win.height = SENSOR_HEIGHT; - // chn_attr.crop_win = dev_attr.acq_win; - -#if defined(CONFIG_BOARD_K230_CANMV) - chn_attr.crop_win = dev_attr.acq_win; -#else - chn_attr.crop_win.h_start = 768; - chn_attr.crop_win.v_start = 16; - chn_attr.crop_win.width = ISP_CHN0_WIDTH; - chn_attr.crop_win.height = ISP_CHN0_HEIGHT; -#endif - - chn_attr.scale_win = chn_attr.out_win; - chn_attr.crop_enable = K_FALSE; - chn_attr.scale_enable = K_FALSE; - // chn_attr.dw_enable = K_FALSE; - chn_attr.chn_enable = K_TRUE; - chn_attr.pix_format = PIXEL_FORMAT_BGR_888_PLANAR; - chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp - chn_attr.buffer_size = config.comm_pool[1].blk_size; - - printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); - ret = kd_mpi_vicap_set_chn_attr(vicap_dev, VICAP_CHN_ID_1, chn_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); - return ret; - } - - printf("sample_vicap ...kd_mpi_vicap_init\n"); - ret = kd_mpi_vicap_init(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - // goto err_exit; - } - - printf("sample_vicap ...kd_mpi_vicap_start_stream\n"); - ret = kd_mpi_vicap_start_stream(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - // goto err_exit; - } - - return ret; -} - -int vivcap_stop() -{ - printf("sample_vicap ...kd_mpi_vicap_stop_stream\n"); - int ret = kd_mpi_vicap_stop_stream(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - return ret; - } - - ret = kd_mpi_vicap_deinit(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_deinit failed.\n"); - return ret; - } - - kd_mpi_vo_disable_video_layer(K_VO_LAYER1); - - vicap_mpp_chn.mod_id = K_ID_VI; - vicap_mpp_chn.dev_id = vicap_dev; - vicap_mpp_chn.chn_id = vicap_chn; - - vo_mpp_chn.mod_id = K_ID_VO; - vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; - vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; - - sample_vicap_unbind_vo(vicap_mpp_chn, vo_mpp_chn); - - /*Allow one frame time for the VO to release the VB block*/ - k_u32 display_ms = 1000 / 33; - usleep(1000 * display_ms); - - ret = kd_mpi_vb_exit(); - if (ret) { - printf("sample_vicap, kd_mpi_vb_exit failed.\n"); - return ret; - } - - return 0; -} - -void yuv_rotate_90(char *des, char *src,int width,int height) -{ - int n = 0; - int hw = width>>1; - int hh = height>>1; - int size = width * height; - int hsize = size>>2; - - int pos = 0; - - for(int i = width-1;i >= 0;i--) - { - pos = 0; - for(int j= 0;j < height;j++) - { - des[n++]= src[pos+i]; - pos += width; - } - } - +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include + +#include "mpi_sys_api.h" + +/* vicap */ +#include +#include +#include +#include +#include + +#include "k_module.h" +#include "k_type.h" +#include "k_vb_comm.h" +#include "k_video_comm.h" +#include "k_sys_comm.h" +#include "mpi_vb_api.h" +#include "mpi_vicap_api.h" +#include "mpi_isp_api.h" +#include "mpi_sys_api.h" +#include "k_vo_comm.h" +#include "mpi_vo_api.h" + +#include "vo_test_case.h" + +#include "k_connector_comm.h" +#include "mpi_connector_api.h" +#include "k_autoconf_comm.h" + + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) +#define SENSOR_CHANNEL (3) // isp通道数 +#define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 +#define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 +#define ISP_CHN0_WIDTH (1920)//(1920) +#define ISP_CHN0_HEIGHT (1080)//(1080) +#define vicap_install_osd (1) +#define osd_id K_VO_OSD3 +#define osd_width (1920) +#define osd_height (1080) +#else +#define SENSOR_CHANNEL (3) // isp通道数 +#define SENSOR_HEIGHT (1280) // isp高度,ai输入,竖屏 +#define SENSOR_WIDTH (720) // isp宽度,ai输入,竖屏 +#define ISP_CHN0_WIDTH (1088)//(1920) +#define ISP_CHN0_HEIGHT (1920)//(1080) +#define vicap_install_osd (1) +#define osd_id K_VO_OSD3 +#define osd_width (1080) +#define osd_height (1920) +#endif + + +k_vb_config config; +k_vicap_dev vicap_dev; +k_vicap_chn vicap_chn; +k_vicap_dev_attr dev_attr; +k_vicap_chn_attr chn_attr; +k_vicap_sensor_info sensor_info; +k_vicap_sensor_type sensor_type; +k_mpp_chn vicap_mpp_chn; +k_mpp_chn vo_mpp_chn; + +k_video_frame_info dump_info; + +k_vo_draw_frame vo_frame = (k_vo_draw_frame) { + 1, + 16, + 16, + 128, + 128, + 1 +}; + +static k_vb_blk_handle block; +k_u32 g_pool_id; + +int vo_creat_layer_test(k_vo_layer chn_id, layer_info *info) +{ + k_vo_video_layer_attr attr; + + // check layer + if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) + || ((info->func != 0) && (chn_id == K_VO_LAYER2))) + { + printf("input layer num failed \n"); + return -1 ; + } + + // check scaler + + // set offset + attr.display_rect = info->offset; + // set act + attr.img_size = info->act_size; + // sget size + info->size = info->act_size.height * info->act_size.width * 3 / 2; + //set pixel format + attr.pixel_format = info->format; + if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) + { + printf("input pix format failed \n"); + return -1; + } + // set stride + attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); + // set function + attr.func = info->func; + // set scaler attr + attr.scaler_attr = info->attr; + + // set video layer atrr + kd_mpi_vo_set_video_layer_attr(chn_id, &attr); + + // enable layer + kd_mpi_vo_enable_video_layer(chn_id); + + return 0; +} + +k_vb_blk_handle vo_insert_frame(k_video_frame_info *vf_info, void **pic_vaddr) +{ + k_u64 phys_addr = 0; + k_u32 *virt_addr; + k_vb_blk_handle handle; + k_s32 size; + + if (vf_info == NULL) + return K_FALSE; + + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_8888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_8888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 4; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_565 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_565) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_4444 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_4444) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_1555 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_1555) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3 / 2; + + size = size + 4096; // 强制4K ,后边得删了 + + printf("vb block size is %x \n", size); + + handle = kd_mpi_vb_get_block(g_pool_id, size, NULL); + if (handle == VB_INVALID_HANDLE) + { + printf("%s get vb block error\n", __func__); + return K_FAILED; + } + + phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); + if (phys_addr == 0) + { + printf("%s get phys addr error\n", __func__); + return K_FAILED; + } + + virt_addr = (k_u32 *)kd_mpi_sys_mmap(phys_addr, size); + // virt_addr = (k_u32 *)kd_mpi_sys_mmap_cached(phys_addr, size); + + if (virt_addr == NULL) + { + printf("%s mmap error\n", __func__); + return K_FAILED; + } + + vf_info->mod_id = K_ID_VO; + vf_info->pool_id = g_pool_id; + vf_info->v_frame.phys_addr[0] = phys_addr; + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + vf_info->v_frame.phys_addr[1] = phys_addr + (vf_info->v_frame.height * vf_info->v_frame.stride[0]); + *pic_vaddr = virt_addr; + + printf("phys_addr is %lx g_pool_id is %d \n", phys_addr, g_pool_id); + + return handle; +} + +k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) +{ + k_vo_video_osd_attr attr; + + // set attr + attr.global_alptha = info->global_alptha; + + if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) + { + info->size = info->act_size.width * info->act_size.height * 4; + info->stride = info->act_size.width * 4 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) + { + info->size = info->act_size.width * info->act_size.height * 3; + info->stride = info->act_size.width * 3 / 8; + } + else if(info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if(info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else + { + printf("set osd pixel format failed \n"); + } + + attr.stride = info->stride; + attr.pixel_format = info->format; + attr.display_rect = info->offset; + attr.img_size = info->act_size; + kd_mpi_vo_set_video_osd_attr(osd, &attr); + + kd_mpi_vo_osd_enable(osd); + + return 0; +} + +void sample_vicap_install_osd(void) +{ + osd_info osd; + + osd.act_size.width = osd_width ; + osd.act_size.height = osd_height; + osd.offset.x = 0; + osd.offset.y = 0; + osd.global_alptha = 0xff; + // osd.global_alptha = 0x32; + osd.format = PIXEL_FORMAT_ARGB_8888;//PIXEL_FORMAT_ARGB_4444; //PIXEL_FORMAT_ARGB_1555;//PIXEL_FORMAT_ARGB_8888; + + vo_creat_osd_test(osd_id, &osd); +} + +void vo_osd_release_block(void) +{ + if(vicap_install_osd == 1) + { + kd_mpi_vo_osd_disable(osd_id); + kd_mpi_vb_release_block(block); + } + +} + +static k_s32 sample_connector_init(void) +{ + k_u32 ret = 0; + k_s32 connector_fd; +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#else + k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#endif + k_connector_info connector_info; + + memset(&connector_info, 0, sizeof(k_connector_info)); + + //connector get sensor info + ret = kd_mpi_get_connector_info(connector_type, &connector_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + + connector_fd = kd_mpi_connector_open(connector_info.connector_name); + if (connector_fd < 0) { + printf("%s, connector open failed.\n", __func__); + return K_ERR_VO_NOTREADY; + } + + // set connect power + kd_mpi_connector_power_set(connector_fd, K_TRUE); + // connector init + kd_mpi_connector_init(connector_fd, connector_info); + + return 0; +} + +static k_s32 vo_layer_vdss_bind_vo_config(void) +{ + layer_info info; + + k_vo_layer chn_id = K_VO_LAYER1; + + memset(&info, 0, sizeof(info)); + + sample_connector_init(); + + // config lyaer + info.act_size.width = ISP_CHN0_WIDTH;//ISP_CHN0_HEIGHT;//1080;//640;//1080; + info.act_size.height = ISP_CHN0_HEIGHT;//ISP_CHN0_WIDTH;//1920;//480;//1920; + info.format = PIXEL_FORMAT_YVU_PLANAR_420; + info.func = 0;//K_ROTATION_180;////K_ROTATION_90; + info.global_alptha = 0xff; + info.offset.x = 0;//(1080-w)/2, + info.offset.y = 0;//(1920-h)/2; + vo_creat_layer_test(chn_id, &info); + + if(vicap_install_osd == 1) + sample_vicap_install_osd(); + + //exit ; + return 0; +} + +static void sample_vicap_bind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) +{ + k_s32 ret; + + ret = kd_mpi_sys_bind(&vicap_mpp_chn, &vo_mpp_chn); + if (ret) { + printf("kd_mpi_sys_unbind failed:0x%x\n", ret); + } + + return; +} + +static void sample_vicap_unbind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) +{ + k_s32 ret; + + ret = kd_mpi_sys_unbind(&vicap_mpp_chn, &vo_mpp_chn); + if (ret) { + printf("kd_mpi_sys_unbind failed:0x%x\n", ret); + } + + return; +} + +int vivcap_start() +{ + k_s32 ret = 0; + + k_u32 pool_id; + k_vb_pool_config pool_config; + + printf("sample_vicap ...\n"); + +#if defined(CONFIG_BOARD_K230_CANMV) + sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; +#else + sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; +#endif + vicap_dev = VICAP_DEV_ID_0; + + memset(&config, 0, sizeof(config)); + config.max_pool_cnt = 64; + //VB for YUV420SP output + config.comm_pool[0].blk_cnt = 5; + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[0].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), VICAP_ALIGN_1K); + + //VB for RGB888 output + config.comm_pool[1].blk_cnt = 5; + config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[1].blk_size = VICAP_ALIGN_UP((SENSOR_HEIGHT * SENSOR_WIDTH * 3 ), VICAP_ALIGN_1K); + + ret = kd_mpi_vb_set_config(&config); + if (ret) { + printf("vb_set_config failed ret:%d\n", ret); + return ret; + } + + k_vb_supplement_config supplement_config; + memset(&supplement_config, 0, sizeof(supplement_config)); + supplement_config.supplement_config |= VB_SUPPLEMENT_JPEG_MASK; + + ret = kd_mpi_vb_set_supplement_config(&supplement_config); + if (ret) { + printf("vb_set_supplement_config failed ret:%d\n", ret); + return ret; + } + + ret = kd_mpi_vb_init(); + if (ret) { + printf("vb_init failed ret:%d\n", ret); + return ret; + } + printf("sample_vicap ...kd_mpi_vicap_get_sensor_info\n"); + + // dwc_dsi_init(); + vo_layer_vdss_bind_vo_config(); + + if(vicap_install_osd == 1) + { + memset(&pool_config, 0, sizeof(pool_config)); + pool_config.blk_size = VICAP_ALIGN_UP((osd_width * osd_height * 4 * 2), VICAP_ALIGN_1K); + pool_config.blk_cnt = 4; + pool_config.mode = VB_REMAP_MODE_NOCACHE; + pool_id = kd_mpi_vb_create_pool(&pool_config); // osd0 - 3 argb 320 x 240 + g_pool_id = pool_id; + + printf("--------aa--------------g_pool_id is %d pool_id is %d \n",g_pool_id, pool_id); + } + + memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); + ret = kd_mpi_vicap_get_sensor_info(sensor_type, &sensor_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + + memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); + dev_attr.acq_win.h_start = 0; + dev_attr.acq_win.v_start = 0; +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + dev_attr.acq_win.width = ISP_CHN0_WIDTH; + dev_attr.acq_win.height = ISP_CHN0_HEIGHT; +#else + dev_attr.acq_win.width = 2592;//SENSOR_HEIGHT; + dev_attr.acq_win.height = 1944;//SENSOR_WIDTH; +#endif + dev_attr.mode = VICAP_WORK_ONLINE_MODE; + + dev_attr.pipe_ctrl.data = 0xFFFFFFFF; + dev_attr.pipe_ctrl.bits.af_enable = 0; + dev_attr.pipe_ctrl.bits.ahdr_enable = 0; + + + dev_attr.cpature_frame = 0; + memcpy(&dev_attr.sensor_info, &sensor_info, sizeof(k_vicap_sensor_info)); + + ret = kd_mpi_vicap_set_dev_attr(vicap_dev, dev_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_dev_attr failed.\n"); + return ret; + } + + memset(&chn_attr, 0, sizeof(k_vicap_chn_attr)); + + //set chn0 output yuv420sp + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = ISP_CHN0_WIDTH; + chn_attr.out_win.height = ISP_CHN0_HEIGHT; + + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + chn_attr.crop_win = dev_attr.acq_win; +#else + // chn_attr.crop_win = dev_attr.acq_win; + chn_attr.crop_win.h_start = 768; + chn_attr.crop_win.v_start = 16; + chn_attr.crop_win.width = ISP_CHN0_WIDTH; + chn_attr.crop_win.height = ISP_CHN0_HEIGHT; +#endif + + chn_attr.scale_win = chn_attr.out_win; + chn_attr.crop_enable = K_FALSE; + chn_attr.scale_enable = K_FALSE; + // chn_attr.dw_enable = K_FALSE; + chn_attr.chn_enable = K_TRUE; + chn_attr.pix_format = PIXEL_FORMAT_YVU_PLANAR_420; + chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp + chn_attr.buffer_size = config.comm_pool[0].blk_size; + vicap_chn = VICAP_CHN_ID_0; + + printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); + ret = kd_mpi_vicap_set_chn_attr(vicap_dev, vicap_chn, chn_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); + return ret; + } + + //bind vicap chn 0 to vo + vicap_mpp_chn.mod_id = K_ID_VI; + vicap_mpp_chn.dev_id = vicap_dev; + vicap_mpp_chn.chn_id = vicap_chn; + + vo_mpp_chn.mod_id = K_ID_VO; + vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; + vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; + + sample_vicap_bind_vo(vicap_mpp_chn, vo_mpp_chn); + printf("sample_vicap ...dwc_dsi_init\n"); + + //set chn1 output rgb888p + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = SENSOR_WIDTH ; + chn_attr.out_win.height = SENSOR_HEIGHT; + // chn_attr.crop_win = dev_attr.acq_win; + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + chn_attr.crop_win = dev_attr.acq_win; +#else + chn_attr.crop_win.h_start = 768; + chn_attr.crop_win.v_start = 16; + chn_attr.crop_win.width = ISP_CHN0_WIDTH; + chn_attr.crop_win.height = ISP_CHN0_HEIGHT; +#endif + + chn_attr.scale_win = chn_attr.out_win; + chn_attr.crop_enable = K_FALSE; + chn_attr.scale_enable = K_FALSE; + // chn_attr.dw_enable = K_FALSE; + chn_attr.chn_enable = K_TRUE; + chn_attr.pix_format = PIXEL_FORMAT_BGR_888_PLANAR; + chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp + chn_attr.buffer_size = config.comm_pool[1].blk_size; + + printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); + ret = kd_mpi_vicap_set_chn_attr(vicap_dev, VICAP_CHN_ID_1, chn_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); + return ret; + } + + printf("sample_vicap ...kd_mpi_vicap_init\n"); + ret = kd_mpi_vicap_init(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + // goto err_exit; + } + + printf("sample_vicap ...kd_mpi_vicap_start_stream\n"); + ret = kd_mpi_vicap_start_stream(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + // goto err_exit; + } + + return ret; +} + +int vivcap_stop() +{ + printf("sample_vicap ...kd_mpi_vicap_stop_stream\n"); + int ret = kd_mpi_vicap_stop_stream(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + return ret; + } + + ret = kd_mpi_vicap_deinit(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_deinit failed.\n"); + return ret; + } + + kd_mpi_vo_disable_video_layer(K_VO_LAYER1); + + vicap_mpp_chn.mod_id = K_ID_VI; + vicap_mpp_chn.dev_id = vicap_dev; + vicap_mpp_chn.chn_id = vicap_chn; + + vo_mpp_chn.mod_id = K_ID_VO; + vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; + vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; + + sample_vicap_unbind_vo(vicap_mpp_chn, vo_mpp_chn); + + /*Allow one frame time for the VO to release the VB block*/ + k_u32 display_ms = 1000 / 33; + usleep(1000 * display_ms); + + ret = kd_mpi_vb_exit(); + if (ret) { + printf("sample_vicap, kd_mpi_vb_exit failed.\n"); + return ret; + } + + return 0; +} + +void yuv_rotate_90(char *des, char *src,int width,int height) +{ + int n = 0; + int hw = width>>1; + int hh = height>>1; + int size = width * height; + int hsize = size>>2; + + int pos = 0; + + for(int i = width-1;i >= 0;i--) + { + pos = 0; + for(int j= 0;j < height;j++) + { + des[n++]= src[pos+i]; + pos += width; + } + } + } \ No newline at end of file diff --git a/src/reference/ai_poc/crosswalk_detect/vi_vo.h b/src/reference/ai_poc/crosswalk_detect/vi_vo.h index 76be47ac2..0a11a4d31 100644 --- a/src/reference/ai_poc/crosswalk_detect/vi_vo.h +++ b/src/reference/ai_poc/crosswalk_detect/vi_vo.h @@ -1,627 +1,628 @@ -/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include -#include -#include - -#include "mpi_sys_api.h" - -/* vicap */ -#include -#include -#include -#include -#include - -#include "k_module.h" -#include "k_type.h" -#include "k_vb_comm.h" -#include "k_video_comm.h" -#include "k_sys_comm.h" -#include "mpi_vb_api.h" -#include "mpi_vicap_api.h" -#include "mpi_isp_api.h" -#include "mpi_sys_api.h" -#include "k_vo_comm.h" -#include "mpi_vo_api.h" - -#include "vo_test_case.h" - -#include "k_connector_comm.h" -#include "mpi_connector_api.h" -#include "k_autoconf_comm.h" - -#if defined(CONFIG_BOARD_K230_CANMV) -#define SENSOR_CHANNEL (3) // isp通道数 -#define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 -#define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 -#define ISP_CHN0_WIDTH (1920)//(1920) -#define ISP_CHN0_HEIGHT (1080)//(1080) -#define vicap_install_osd (1) -#define osd_id K_VO_OSD3 -#define osd_width (1920) -#define osd_height (1080) -#else -#define SENSOR_CHANNEL (3) // isp通道数 -#define SENSOR_HEIGHT (1280) // isp高度,ai输入,竖屏 -#define SENSOR_WIDTH (720) // isp宽度,ai输入,竖屏 -#define ISP_CHN0_WIDTH (1088)//(1920) -#define ISP_CHN0_HEIGHT (1920)//(1080) -#define vicap_install_osd (1) -#define osd_id K_VO_OSD3 -#define osd_width (1080) -#define osd_height (1920) -#endif - - -k_vb_config config; -k_vicap_dev vicap_dev; -k_vicap_chn vicap_chn; -k_vicap_dev_attr dev_attr; -k_vicap_chn_attr chn_attr; -k_vicap_sensor_info sensor_info; -k_vicap_sensor_type sensor_type; -k_mpp_chn vicap_mpp_chn; -k_mpp_chn vo_mpp_chn; - -k_video_frame_info dump_info; - -k_vo_draw_frame vo_frame = (k_vo_draw_frame) { - 1, - 16, - 16, - 128, - 128, - 1 -}; - -static k_vb_blk_handle block; -k_u32 g_pool_id; - -int vo_creat_layer_test(k_vo_layer chn_id, layer_info *info) -{ - k_vo_video_layer_attr attr; - - // check layer - if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) - || ((info->func != 0) && (chn_id == K_VO_LAYER2))) - { - printf("input layer num failed \n"); - return -1 ; - } - - // check scaler - - // set offset - attr.display_rect = info->offset; - // set act - attr.img_size = info->act_size; - // sget size - info->size = info->act_size.height * info->act_size.width * 3 / 2; - //set pixel format - attr.pixel_format = info->format; - if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) - { - printf("input pix format failed \n"); - return -1; - } - // set stride - attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); - // set function - attr.func = info->func; - // set scaler attr - attr.scaler_attr = info->attr; - - // set video layer atrr - kd_mpi_vo_set_video_layer_attr(chn_id, &attr); - - // enable layer - kd_mpi_vo_enable_video_layer(chn_id); - - return 0; -} - -k_vb_blk_handle vo_insert_frame(k_video_frame_info *vf_info, void **pic_vaddr) -{ - k_u64 phys_addr = 0; - k_u32 *virt_addr; - k_vb_blk_handle handle; - k_s32 size; - - if (vf_info == NULL) - return K_FALSE; - - if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_8888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_8888) - size = vf_info->v_frame.height * vf_info->v_frame.width * 4; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_565 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_565) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_4444 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_4444) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_888) - size = vf_info->v_frame.height * vf_info->v_frame.width * 3; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_1555 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_1555) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) - size = vf_info->v_frame.height * vf_info->v_frame.width * 3 / 2; - - size = size + 4096; // 强制4K ,后边得删了 - - printf("vb block size is %x \n", size); - - handle = kd_mpi_vb_get_block(g_pool_id, size, NULL); - if (handle == VB_INVALID_HANDLE) - { - printf("%s get vb block error\n", __func__); - return K_FAILED; - } - - phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); - if (phys_addr == 0) - { - printf("%s get phys addr error\n", __func__); - return K_FAILED; - } - - virt_addr = (k_u32 *)kd_mpi_sys_mmap(phys_addr, size); - // virt_addr = (k_u32 *)kd_mpi_sys_mmap_cached(phys_addr, size); - - if (virt_addr == NULL) - { - printf("%s mmap error\n", __func__); - return K_FAILED; - } - - vf_info->mod_id = K_ID_VO; - vf_info->pool_id = g_pool_id; - vf_info->v_frame.phys_addr[0] = phys_addr; - if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) - vf_info->v_frame.phys_addr[1] = phys_addr + (vf_info->v_frame.height * vf_info->v_frame.stride[0]); - *pic_vaddr = virt_addr; - - printf("phys_addr is %lx g_pool_id is %d \n", phys_addr, g_pool_id); - - return handle; -} - -k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) -{ - k_vo_video_osd_attr attr; - - // set attr - attr.global_alptha = info->global_alptha; - - if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) - { - info->size = info->act_size.width * info->act_size.height * 4; - info->stride = info->act_size.width * 4 / 8; - } - else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) - { - info->size = info->act_size.width * info->act_size.height * 3; - info->stride = info->act_size.width * 3 / 8; - } - else if(info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else if(info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else - { - printf("set osd pixel format failed \n"); - } - - attr.stride = info->stride; - attr.pixel_format = info->format; - attr.display_rect = info->offset; - attr.img_size = info->act_size; - kd_mpi_vo_set_video_osd_attr(osd, &attr); - - kd_mpi_vo_osd_enable(osd); - - return 0; -} - -void sample_vicap_install_osd(void) -{ - osd_info osd; - - osd.act_size.width = osd_width ; - osd.act_size.height = osd_height; - osd.offset.x = 0; - osd.offset.y = 0; - osd.global_alptha = 0xff; - // osd.global_alptha = 0x32; - osd.format = PIXEL_FORMAT_ARGB_8888;//PIXEL_FORMAT_ARGB_4444; //PIXEL_FORMAT_ARGB_1555;//PIXEL_FORMAT_ARGB_8888; - - vo_creat_osd_test(osd_id, &osd); -} - -void vo_osd_release_block(void) -{ - if(vicap_install_osd == 1) - { - kd_mpi_vo_osd_disable(osd_id); - kd_mpi_vb_release_block(block); - } - -} - -static k_s32 sample_connector_init(void) -{ - k_u32 ret = 0; - k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) - k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; -#else - k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; -#endif - k_connector_info connector_info; - - memset(&connector_info, 0, sizeof(k_connector_info)); - - //connector get sensor info - ret = kd_mpi_get_connector_info(connector_type, &connector_info); - if (ret) { - printf("sample_vicap, the sensor type not supported!\n"); - return ret; - } - - connector_fd = kd_mpi_connector_open(connector_info.connector_name); - if (connector_fd < 0) { - printf("%s, connector open failed.\n", __func__); - return K_ERR_VO_NOTREADY; - } - - // set connect power - kd_mpi_connector_power_set(connector_fd, K_TRUE); - // connector init - kd_mpi_connector_init(connector_fd, connector_info); - - return 0; -} - -static k_s32 vo_layer_vdss_bind_vo_config(void) -{ - layer_info info; - - k_vo_layer chn_id = K_VO_LAYER1; - - memset(&info, 0, sizeof(info)); - - sample_connector_init(); - - // config lyaer - info.act_size.width = ISP_CHN0_WIDTH;//ISP_CHN0_HEIGHT;//1080;//640;//1080; - info.act_size.height = ISP_CHN0_HEIGHT;//ISP_CHN0_WIDTH;//1920;//480;//1920; - info.format = PIXEL_FORMAT_YVU_PLANAR_420; - info.func = 0;//K_ROTATION_180;////K_ROTATION_90; - info.global_alptha = 0xff; - info.offset.x = 0;//(1080-w)/2, - info.offset.y = 0;//(1920-h)/2; - vo_creat_layer_test(chn_id, &info); - - if(vicap_install_osd == 1) - sample_vicap_install_osd(); - - //exit ; - return 0; -} - -static void sample_vicap_bind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) -{ - k_s32 ret; - - ret = kd_mpi_sys_bind(&vicap_mpp_chn, &vo_mpp_chn); - if (ret) { - printf("kd_mpi_sys_unbind failed:0x%x\n", ret); - } - - return; -} - -static void sample_vicap_unbind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) -{ - k_s32 ret; - - ret = kd_mpi_sys_unbind(&vicap_mpp_chn, &vo_mpp_chn); - if (ret) { - printf("kd_mpi_sys_unbind failed:0x%x\n", ret); - } - - return; -} - -int vivcap_start() -{ - k_s32 ret = 0; - - k_u32 pool_id; - k_vb_pool_config pool_config; - - printf("sample_vicap ...\n"); - -#if defined(CONFIG_BOARD_K230_CANMV) - sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); -#else - sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; -#endif - vicap_dev = VICAP_DEV_ID_0; - - memset(&config, 0, sizeof(config)); - config.max_pool_cnt = 64; - //VB for YUV420SP output - config.comm_pool[0].blk_cnt = 5; - config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; - config.comm_pool[0].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), VICAP_ALIGN_1K); - - //VB for RGB888 output - config.comm_pool[1].blk_cnt = 5; - config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; - config.comm_pool[1].blk_size = VICAP_ALIGN_UP((SENSOR_HEIGHT * SENSOR_WIDTH * 3 ), VICAP_ALIGN_1K); - - ret = kd_mpi_vb_set_config(&config); - if (ret) { - printf("vb_set_config failed ret:%d\n", ret); - return ret; - } - - k_vb_supplement_config supplement_config; - memset(&supplement_config, 0, sizeof(supplement_config)); - supplement_config.supplement_config |= VB_SUPPLEMENT_JPEG_MASK; - - ret = kd_mpi_vb_set_supplement_config(&supplement_config); - if (ret) { - printf("vb_set_supplement_config failed ret:%d\n", ret); - return ret; - } - - ret = kd_mpi_vb_init(); - if (ret) { - printf("vb_init failed ret:%d\n", ret); - return ret; - } - printf("sample_vicap ...kd_mpi_vicap_get_sensor_info\n"); - - // dwc_dsi_init(); - vo_layer_vdss_bind_vo_config(); - - if(vicap_install_osd == 1) - { - memset(&pool_config, 0, sizeof(pool_config)); - pool_config.blk_size = VICAP_ALIGN_UP((osd_width * osd_height * 4 * 2), VICAP_ALIGN_1K); - pool_config.blk_cnt = 4; - pool_config.mode = VB_REMAP_MODE_NOCACHE; - pool_id = kd_mpi_vb_create_pool(&pool_config); // osd0 - 3 argb 320 x 240 - g_pool_id = pool_id; - - printf("--------aa--------------g_pool_id is %d pool_id is %d \n",g_pool_id, pool_id); - } - - memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); - ret = kd_mpi_vicap_get_sensor_info(sensor_type, &sensor_info); - if (ret) { - printf("sample_vicap, the sensor type not supported!\n"); - return ret; - } - - memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); - dev_attr.acq_win.h_start = 0; - dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) - dev_attr.acq_win.width = ISP_CHN0_WIDTH; - dev_attr.acq_win.height = ISP_CHN0_HEIGHT; -#else - dev_attr.acq_win.width = 2592;//SENSOR_HEIGHT; - dev_attr.acq_win.height = 1944;//SENSOR_WIDTH; -#endif - dev_attr.mode = VICAP_WORK_ONLINE_MODE; - - dev_attr.pipe_ctrl.data = 0xFFFFFFFF; - dev_attr.pipe_ctrl.bits.af_enable = 0; - dev_attr.pipe_ctrl.bits.ahdr_enable = 0; - - - dev_attr.cpature_frame = 0; - memcpy(&dev_attr.sensor_info, &sensor_info, sizeof(k_vicap_sensor_info)); - - ret = kd_mpi_vicap_set_dev_attr(vicap_dev, dev_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_dev_attr failed.\n"); - return ret; - } - - memset(&chn_attr, 0, sizeof(k_vicap_chn_attr)); - - //set chn0 output yuv420sp - chn_attr.out_win.h_start = 0; - chn_attr.out_win.v_start = 0; - chn_attr.out_win.width = ISP_CHN0_WIDTH; - chn_attr.out_win.height = ISP_CHN0_HEIGHT; - - -#if defined(CONFIG_BOARD_K230_CANMV) - chn_attr.crop_win = dev_attr.acq_win; -#else - // chn_attr.crop_win = dev_attr.acq_win; - chn_attr.crop_win.h_start = 768; - chn_attr.crop_win.v_start = 16; - chn_attr.crop_win.width = ISP_CHN0_WIDTH; - chn_attr.crop_win.height = ISP_CHN0_HEIGHT; -#endif - - chn_attr.scale_win = chn_attr.out_win; - chn_attr.crop_enable = K_FALSE; - chn_attr.scale_enable = K_FALSE; - // chn_attr.dw_enable = K_FALSE; - chn_attr.chn_enable = K_TRUE; - chn_attr.pix_format = PIXEL_FORMAT_YVU_PLANAR_420; - chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp - chn_attr.buffer_size = config.comm_pool[0].blk_size; - vicap_chn = VICAP_CHN_ID_0; - - printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); - ret = kd_mpi_vicap_set_chn_attr(vicap_dev, vicap_chn, chn_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); - return ret; - } - - //bind vicap chn 0 to vo - vicap_mpp_chn.mod_id = K_ID_VI; - vicap_mpp_chn.dev_id = vicap_dev; - vicap_mpp_chn.chn_id = vicap_chn; - - vo_mpp_chn.mod_id = K_ID_VO; - vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; - vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; - - sample_vicap_bind_vo(vicap_mpp_chn, vo_mpp_chn); - printf("sample_vicap ...dwc_dsi_init\n"); - - //set chn1 output rgb888p - chn_attr.out_win.h_start = 0; - chn_attr.out_win.v_start = 0; - chn_attr.out_win.width = SENSOR_WIDTH ; - chn_attr.out_win.height = SENSOR_HEIGHT; - // chn_attr.crop_win = dev_attr.acq_win; - -#if defined(CONFIG_BOARD_K230_CANMV) - chn_attr.crop_win = dev_attr.acq_win; -#else - chn_attr.crop_win.h_start = 768; - chn_attr.crop_win.v_start = 16; - chn_attr.crop_win.width = ISP_CHN0_WIDTH; - chn_attr.crop_win.height = ISP_CHN0_HEIGHT; -#endif - - chn_attr.scale_win = chn_attr.out_win; - chn_attr.crop_enable = K_FALSE; - chn_attr.scale_enable = K_FALSE; - // chn_attr.dw_enable = K_FALSE; - chn_attr.chn_enable = K_TRUE; - chn_attr.pix_format = PIXEL_FORMAT_BGR_888_PLANAR; - chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp - chn_attr.buffer_size = config.comm_pool[1].blk_size; - - printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); - ret = kd_mpi_vicap_set_chn_attr(vicap_dev, VICAP_CHN_ID_1, chn_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); - return ret; - } - - printf("sample_vicap ...kd_mpi_vicap_init\n"); - ret = kd_mpi_vicap_init(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - // goto err_exit; - } - - printf("sample_vicap ...kd_mpi_vicap_start_stream\n"); - ret = kd_mpi_vicap_start_stream(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - // goto err_exit; - } - - return ret; -} - -int vivcap_stop() -{ - printf("sample_vicap ...kd_mpi_vicap_stop_stream\n"); - int ret = kd_mpi_vicap_stop_stream(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - return ret; - } - - ret = kd_mpi_vicap_deinit(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_deinit failed.\n"); - return ret; - } - - kd_mpi_vo_disable_video_layer(K_VO_LAYER1); - - vicap_mpp_chn.mod_id = K_ID_VI; - vicap_mpp_chn.dev_id = vicap_dev; - vicap_mpp_chn.chn_id = vicap_chn; - - vo_mpp_chn.mod_id = K_ID_VO; - vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; - vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; - - sample_vicap_unbind_vo(vicap_mpp_chn, vo_mpp_chn); - - /*Allow one frame time for the VO to release the VB block*/ - k_u32 display_ms = 1000 / 33; - usleep(1000 * display_ms); - - ret = kd_mpi_vb_exit(); - if (ret) { - printf("sample_vicap, kd_mpi_vb_exit failed.\n"); - return ret; - } - - return 0; -} - -void yuv_rotate_90(char *des, char *src,int width,int height) -{ - int n = 0; - int hw = width>>1; - int hh = height>>1; - int size = width * height; - int hsize = size>>2; - - int pos = 0; - - for(int i = width-1;i >= 0;i--) - { - pos = 0; - for(int j= 0;j < height;j++) - { - des[n++]= src[pos+i]; - pos += width; - } - } - -} - +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include + +#include "mpi_sys_api.h" + +/* vicap */ +#include +#include +#include +#include +#include + +#include "k_module.h" +#include "k_type.h" +#include "k_vb_comm.h" +#include "k_video_comm.h" +#include "k_sys_comm.h" +#include "mpi_vb_api.h" +#include "mpi_vicap_api.h" +#include "mpi_isp_api.h" +#include "mpi_sys_api.h" +#include "k_vo_comm.h" +#include "mpi_vo_api.h" + +#include "vo_test_case.h" + +#include "k_connector_comm.h" +#include "mpi_connector_api.h" +#include "k_autoconf_comm.h" + + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) +#define SENSOR_CHANNEL (3) // isp通道数 +#define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 +#define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 +#define ISP_CHN0_WIDTH (1920)//(1920) +#define ISP_CHN0_HEIGHT (1080)//(1080) +#define vicap_install_osd (1) +#define osd_id K_VO_OSD3 +#define osd_width (1920) +#define osd_height (1080) +#else +#define SENSOR_CHANNEL (3) // isp通道数 +#define SENSOR_HEIGHT (1280) // isp高度,ai输入,竖屏 +#define SENSOR_WIDTH (720) // isp宽度,ai输入,竖屏 +#define ISP_CHN0_WIDTH (1088)//(1920) +#define ISP_CHN0_HEIGHT (1920)//(1080) +#define vicap_install_osd (1) +#define osd_id K_VO_OSD3 +#define osd_width (1080) +#define osd_height (1920) +#endif + + +k_vb_config config; +k_vicap_dev vicap_dev; +k_vicap_chn vicap_chn; +k_vicap_dev_attr dev_attr; +k_vicap_chn_attr chn_attr; +k_vicap_sensor_info sensor_info; +k_vicap_sensor_type sensor_type; +k_mpp_chn vicap_mpp_chn; +k_mpp_chn vo_mpp_chn; + +k_video_frame_info dump_info; + +k_vo_draw_frame vo_frame = (k_vo_draw_frame) { + 1, + 16, + 16, + 128, + 128, + 1 +}; + +static k_vb_blk_handle block; +k_u32 g_pool_id; + +int vo_creat_layer_test(k_vo_layer chn_id, layer_info *info) +{ + k_vo_video_layer_attr attr; + + // check layer + if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) + || ((info->func != 0) && (chn_id == K_VO_LAYER2))) + { + printf("input layer num failed \n"); + return -1 ; + } + + // check scaler + + // set offset + attr.display_rect = info->offset; + // set act + attr.img_size = info->act_size; + // sget size + info->size = info->act_size.height * info->act_size.width * 3 / 2; + //set pixel format + attr.pixel_format = info->format; + if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) + { + printf("input pix format failed \n"); + return -1; + } + // set stride + attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); + // set function + attr.func = info->func; + // set scaler attr + attr.scaler_attr = info->attr; + + // set video layer atrr + kd_mpi_vo_set_video_layer_attr(chn_id, &attr); + + // enable layer + kd_mpi_vo_enable_video_layer(chn_id); + + return 0; +} + +k_vb_blk_handle vo_insert_frame(k_video_frame_info *vf_info, void **pic_vaddr) +{ + k_u64 phys_addr = 0; + k_u32 *virt_addr; + k_vb_blk_handle handle; + k_s32 size; + + if (vf_info == NULL) + return K_FALSE; + + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_8888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_8888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 4; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_565 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_565) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_4444 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_4444) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_1555 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_1555) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3 / 2; + + size = size + 4096; // 强制4K ,后边得删了 + + printf("vb block size is %x \n", size); + + handle = kd_mpi_vb_get_block(g_pool_id, size, NULL); + if (handle == VB_INVALID_HANDLE) + { + printf("%s get vb block error\n", __func__); + return K_FAILED; + } + + phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); + if (phys_addr == 0) + { + printf("%s get phys addr error\n", __func__); + return K_FAILED; + } + + virt_addr = (k_u32 *)kd_mpi_sys_mmap(phys_addr, size); + // virt_addr = (k_u32 *)kd_mpi_sys_mmap_cached(phys_addr, size); + + if (virt_addr == NULL) + { + printf("%s mmap error\n", __func__); + return K_FAILED; + } + + vf_info->mod_id = K_ID_VO; + vf_info->pool_id = g_pool_id; + vf_info->v_frame.phys_addr[0] = phys_addr; + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + vf_info->v_frame.phys_addr[1] = phys_addr + (vf_info->v_frame.height * vf_info->v_frame.stride[0]); + *pic_vaddr = virt_addr; + + printf("phys_addr is %lx g_pool_id is %d \n", phys_addr, g_pool_id); + + return handle; +} + +k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) +{ + k_vo_video_osd_attr attr; + + // set attr + attr.global_alptha = info->global_alptha; + + if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) + { + info->size = info->act_size.width * info->act_size.height * 4; + info->stride = info->act_size.width * 4 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) + { + info->size = info->act_size.width * info->act_size.height * 3; + info->stride = info->act_size.width * 3 / 8; + } + else if(info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if(info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else + { + printf("set osd pixel format failed \n"); + } + + attr.stride = info->stride; + attr.pixel_format = info->format; + attr.display_rect = info->offset; + attr.img_size = info->act_size; + kd_mpi_vo_set_video_osd_attr(osd, &attr); + + kd_mpi_vo_osd_enable(osd); + + return 0; +} + +void sample_vicap_install_osd(void) +{ + osd_info osd; + + osd.act_size.width = osd_width ; + osd.act_size.height = osd_height; + osd.offset.x = 0; + osd.offset.y = 0; + osd.global_alptha = 0xff; + // osd.global_alptha = 0x32; + osd.format = PIXEL_FORMAT_ARGB_8888;//PIXEL_FORMAT_ARGB_4444; //PIXEL_FORMAT_ARGB_1555;//PIXEL_FORMAT_ARGB_8888; + + vo_creat_osd_test(osd_id, &osd); +} + +void vo_osd_release_block(void) +{ + if(vicap_install_osd == 1) + { + kd_mpi_vo_osd_disable(osd_id); + kd_mpi_vb_release_block(block); + } + +} + +static k_s32 sample_connector_init(void) +{ + k_u32 ret = 0; + k_s32 connector_fd; +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#else + k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#endif + k_connector_info connector_info; + + memset(&connector_info, 0, sizeof(k_connector_info)); + + //connector get sensor info + ret = kd_mpi_get_connector_info(connector_type, &connector_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + + connector_fd = kd_mpi_connector_open(connector_info.connector_name); + if (connector_fd < 0) { + printf("%s, connector open failed.\n", __func__); + return K_ERR_VO_NOTREADY; + } + + // set connect power + kd_mpi_connector_power_set(connector_fd, K_TRUE); + // connector init + kd_mpi_connector_init(connector_fd, connector_info); + + return 0; +} + +static k_s32 vo_layer_vdss_bind_vo_config(void) +{ + layer_info info; + + k_vo_layer chn_id = K_VO_LAYER1; + + memset(&info, 0, sizeof(info)); + + sample_connector_init(); + + // config lyaer + info.act_size.width = ISP_CHN0_WIDTH;//ISP_CHN0_HEIGHT;//1080;//640;//1080; + info.act_size.height = ISP_CHN0_HEIGHT;//ISP_CHN0_WIDTH;//1920;//480;//1920; + info.format = PIXEL_FORMAT_YVU_PLANAR_420; + info.func = 0;//K_ROTATION_180;////K_ROTATION_90; + info.global_alptha = 0xff; + info.offset.x = 0;//(1080-w)/2, + info.offset.y = 0;//(1920-h)/2; + vo_creat_layer_test(chn_id, &info); + + if(vicap_install_osd == 1) + sample_vicap_install_osd(); + + //exit ; + return 0; +} + +static void sample_vicap_bind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) +{ + k_s32 ret; + + ret = kd_mpi_sys_bind(&vicap_mpp_chn, &vo_mpp_chn); + if (ret) { + printf("kd_mpi_sys_unbind failed:0x%x\n", ret); + } + + return; +} + +static void sample_vicap_unbind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) +{ + k_s32 ret; + + ret = kd_mpi_sys_unbind(&vicap_mpp_chn, &vo_mpp_chn); + if (ret) { + printf("kd_mpi_sys_unbind failed:0x%x\n", ret); + } + + return; +} + +int vivcap_start() +{ + k_s32 ret = 0; + + k_u32 pool_id; + k_vb_pool_config pool_config; + + printf("sample_vicap ...\n"); + +#if defined(CONFIG_BOARD_K230_CANMV) + sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; +#else + sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; +#endif + vicap_dev = VICAP_DEV_ID_0; + + memset(&config, 0, sizeof(config)); + config.max_pool_cnt = 64; + //VB for YUV420SP output + config.comm_pool[0].blk_cnt = 5; + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[0].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), VICAP_ALIGN_1K); + + //VB for RGB888 output + config.comm_pool[1].blk_cnt = 5; + config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[1].blk_size = VICAP_ALIGN_UP((SENSOR_HEIGHT * SENSOR_WIDTH * 3 ), VICAP_ALIGN_1K); + + ret = kd_mpi_vb_set_config(&config); + if (ret) { + printf("vb_set_config failed ret:%d\n", ret); + return ret; + } + + k_vb_supplement_config supplement_config; + memset(&supplement_config, 0, sizeof(supplement_config)); + supplement_config.supplement_config |= VB_SUPPLEMENT_JPEG_MASK; + + ret = kd_mpi_vb_set_supplement_config(&supplement_config); + if (ret) { + printf("vb_set_supplement_config failed ret:%d\n", ret); + return ret; + } + + ret = kd_mpi_vb_init(); + if (ret) { + printf("vb_init failed ret:%d\n", ret); + return ret; + } + printf("sample_vicap ...kd_mpi_vicap_get_sensor_info\n"); + + // dwc_dsi_init(); + vo_layer_vdss_bind_vo_config(); + + if(vicap_install_osd == 1) + { + memset(&pool_config, 0, sizeof(pool_config)); + pool_config.blk_size = VICAP_ALIGN_UP((osd_width * osd_height * 4 * 2), VICAP_ALIGN_1K); + pool_config.blk_cnt = 4; + pool_config.mode = VB_REMAP_MODE_NOCACHE; + pool_id = kd_mpi_vb_create_pool(&pool_config); // osd0 - 3 argb 320 x 240 + g_pool_id = pool_id; + + printf("--------aa--------------g_pool_id is %d pool_id is %d \n",g_pool_id, pool_id); + } + + memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); + ret = kd_mpi_vicap_get_sensor_info(sensor_type, &sensor_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + + memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); + dev_attr.acq_win.h_start = 0; + dev_attr.acq_win.v_start = 0; +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + dev_attr.acq_win.width = ISP_CHN0_WIDTH; + dev_attr.acq_win.height = ISP_CHN0_HEIGHT; +#else + dev_attr.acq_win.width = 2592;//SENSOR_HEIGHT; + dev_attr.acq_win.height = 1944;//SENSOR_WIDTH; +#endif + dev_attr.mode = VICAP_WORK_ONLINE_MODE; + + dev_attr.pipe_ctrl.data = 0xFFFFFFFF; + dev_attr.pipe_ctrl.bits.af_enable = 0; + dev_attr.pipe_ctrl.bits.ahdr_enable = 0; + + + dev_attr.cpature_frame = 0; + memcpy(&dev_attr.sensor_info, &sensor_info, sizeof(k_vicap_sensor_info)); + + ret = kd_mpi_vicap_set_dev_attr(vicap_dev, dev_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_dev_attr failed.\n"); + return ret; + } + + memset(&chn_attr, 0, sizeof(k_vicap_chn_attr)); + + //set chn0 output yuv420sp + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = ISP_CHN0_WIDTH; + chn_attr.out_win.height = ISP_CHN0_HEIGHT; + + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + chn_attr.crop_win = dev_attr.acq_win; +#else + // chn_attr.crop_win = dev_attr.acq_win; + chn_attr.crop_win.h_start = 768; + chn_attr.crop_win.v_start = 16; + chn_attr.crop_win.width = ISP_CHN0_WIDTH; + chn_attr.crop_win.height = ISP_CHN0_HEIGHT; +#endif + + chn_attr.scale_win = chn_attr.out_win; + chn_attr.crop_enable = K_FALSE; + chn_attr.scale_enable = K_FALSE; + // chn_attr.dw_enable = K_FALSE; + chn_attr.chn_enable = K_TRUE; + chn_attr.pix_format = PIXEL_FORMAT_YVU_PLANAR_420; + chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp + chn_attr.buffer_size = config.comm_pool[0].blk_size; + vicap_chn = VICAP_CHN_ID_0; + + printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); + ret = kd_mpi_vicap_set_chn_attr(vicap_dev, vicap_chn, chn_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); + return ret; + } + + //bind vicap chn 0 to vo + vicap_mpp_chn.mod_id = K_ID_VI; + vicap_mpp_chn.dev_id = vicap_dev; + vicap_mpp_chn.chn_id = vicap_chn; + + vo_mpp_chn.mod_id = K_ID_VO; + vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; + vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; + + sample_vicap_bind_vo(vicap_mpp_chn, vo_mpp_chn); + printf("sample_vicap ...dwc_dsi_init\n"); + + //set chn1 output rgb888p + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = SENSOR_WIDTH ; + chn_attr.out_win.height = SENSOR_HEIGHT; + // chn_attr.crop_win = dev_attr.acq_win; + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + chn_attr.crop_win = dev_attr.acq_win; +#else + chn_attr.crop_win.h_start = 768; + chn_attr.crop_win.v_start = 16; + chn_attr.crop_win.width = ISP_CHN0_WIDTH; + chn_attr.crop_win.height = ISP_CHN0_HEIGHT; +#endif + + chn_attr.scale_win = chn_attr.out_win; + chn_attr.crop_enable = K_FALSE; + chn_attr.scale_enable = K_FALSE; + // chn_attr.dw_enable = K_FALSE; + chn_attr.chn_enable = K_TRUE; + chn_attr.pix_format = PIXEL_FORMAT_BGR_888_PLANAR; + chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp + chn_attr.buffer_size = config.comm_pool[1].blk_size; + + printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); + ret = kd_mpi_vicap_set_chn_attr(vicap_dev, VICAP_CHN_ID_1, chn_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); + return ret; + } + + printf("sample_vicap ...kd_mpi_vicap_init\n"); + ret = kd_mpi_vicap_init(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + // goto err_exit; + } + + printf("sample_vicap ...kd_mpi_vicap_start_stream\n"); + ret = kd_mpi_vicap_start_stream(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + // goto err_exit; + } + + return ret; +} + +int vivcap_stop() +{ + printf("sample_vicap ...kd_mpi_vicap_stop_stream\n"); + int ret = kd_mpi_vicap_stop_stream(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + return ret; + } + + ret = kd_mpi_vicap_deinit(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_deinit failed.\n"); + return ret; + } + + kd_mpi_vo_disable_video_layer(K_VO_LAYER1); + + vicap_mpp_chn.mod_id = K_ID_VI; + vicap_mpp_chn.dev_id = vicap_dev; + vicap_mpp_chn.chn_id = vicap_chn; + + vo_mpp_chn.mod_id = K_ID_VO; + vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; + vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; + + sample_vicap_unbind_vo(vicap_mpp_chn, vo_mpp_chn); + + /*Allow one frame time for the VO to release the VB block*/ + k_u32 display_ms = 1000 / 33; + usleep(1000 * display_ms); + + ret = kd_mpi_vb_exit(); + if (ret) { + printf("sample_vicap, kd_mpi_vb_exit failed.\n"); + return ret; + } + + return 0; +} + +void yuv_rotate_90(char *des, char *src,int width,int height) +{ + int n = 0; + int hw = width>>1; + int hh = height>>1; + int size = width * height; + int hsize = size>>2; + + int pos = 0; + + for(int i = width-1;i >= 0;i--) + { + pos = 0; + for(int j= 0;j < height;j++) + { + des[n++]= src[pos+i]; + pos += width; + } + } + +} \ No newline at end of file diff --git a/src/reference/ai_poc/dec_ai_enc/dec_enc/dec_enc.cc b/src/reference/ai_poc/dec_ai_enc/dec_enc/dec_enc.cc index 8d7c97647..6b6abc170 100644 --- a/src/reference/ai_poc/dec_ai_enc/dec_enc/dec_enc.cc +++ b/src/reference/ai_poc/dec_ai_enc/dec_enc/dec_enc.cc @@ -614,11 +614,18 @@ cv::Mat nv12ToRGBHWC(const uint8_t* nv12Data, int width, int height, uint8_t* rg * AI计算后得到的RGB图像要转换成ARGB格式发送给编码器 */ cv::Mat convertToARGB(const cv::Mat& src) { - cv::Mat dst(src.rows, src.cols, CV_8UC4, cv::Scalar(0, 0, 0, 0)); - cv::Mat rgbChannels[3]; - cv::split(src, rgbChannels); - cv::Mat argbChannels[4] = {cv::Mat(src.size(), CV_8UC1, cv::Scalar(0)),rgbChannels[0], rgbChannels[1], rgbChannels[2]}; - cv::merge(argbChannels, 4, dst); + CV_Assert(src.channels() == 3); // 输入图像应该是 3 通道的 RGB 图像 + cv::Mat dst(src.rows, src.cols, CV_8UC4); + + for (int y = 0; y < src.rows; ++y) { + const cv::Vec3b* src_row = src.ptr(y); + cv::Vec4b* dst_row = dst.ptr(y); + for (int x = 0; x < src.cols; ++x) { + // RGB 到 ARGB 的通道转换 + dst_row[x] = cv::Vec4b(255,src_row[x][0], src_row[x][1], src_row[x][2]); + } + } + return dst; } diff --git a/src/reference/ai_poc/dec_ai_enc/enc/enc.c b/src/reference/ai_poc/dec_ai_enc/enc/enc.c index c4fd4b58b..267555ef4 100644 --- a/src/reference/ai_poc/dec_ai_enc/enc/enc.c +++ b/src/reference/ai_poc/dec_ai_enc/enc/enc.c @@ -44,6 +44,7 @@ #include "mpi_sys_api.h" #include "k_venc_comm.h" #include "mpi_vvi_api.h" +#include "k_autoconf_comm.h" #define VENC_MAX_IN_FRAMES 30 #define ENABLE_VENC_DEBUG 1 @@ -924,13 +925,16 @@ int main(int argc, char *argv[]) } case_index = atoi(argv[1]); + #if defined(CONFIG_BOARD_K230_CANMV) + sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; + #elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; + #else + sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; + #endif for (int i = 2; i < argc; i++) { - if (strcmp(argv[i], "-sensor") == 0) - { - sensor_type = (k_vicap_sensor_type)atoi(argv[i + 1]); - } - else if (strcmp(argv[i], "-o") == 0) + if (strcmp(argv[i], "-o") == 0) { strcpy(out_filename, argv[i + 1]); if ((output_file = fopen(out_filename, "wb")) == NULL) diff --git a/src/reference/ai_poc/demo_mix/hand_detection.cc b/src/reference/ai_poc/demo_mix/hand_detection.cc index fa92ff263..1b3eaef03 100644 --- a/src/reference/ai_poc/demo_mix/hand_detection.cc +++ b/src/reference/ai_poc/demo_mix/hand_detection.cc @@ -179,7 +179,7 @@ std::vector HandDetection::decode_infer(float *data, int stride, FrameS box.x2 = std::max(0, std::min(int(frame_size.width), int(cx + w / 2.f))); box.y2 = std::max(0, std::min(int(frame_size.height), int(cy + h / 2.f))); - #if defined(CONFIG_BOARD_K230_CANMV) + #if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) if (abs(box.y1-box.y2)< 0.1*frame_size.height) continue; if ((abs(box.x1-box.x2)< 0.25*frame_size.width) && ((box.x1 < 0.03*frame_size.width) || (box.x2 > 0.97*frame_size.width))) diff --git a/src/reference/ai_poc/demo_mix/vi_vo.h b/src/reference/ai_poc/demo_mix/vi_vo.h index f0c1bccc5..0a11a4d31 100644 --- a/src/reference/ai_poc/demo_mix/vi_vo.h +++ b/src/reference/ai_poc/demo_mix/vi_vo.h @@ -57,7 +57,7 @@ #include "k_autoconf_comm.h" -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) #define SENSOR_CHANNEL (3) // isp通道数 #define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 #define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 @@ -286,7 +286,7 @@ static k_s32 sample_connector_init(void) { k_u32 ret = 0; k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; #else k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; @@ -378,7 +378,8 @@ int vivcap_start() #if defined(CONFIG_BOARD_K230_CANMV) sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; #else sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; #endif @@ -444,7 +445,7 @@ int vivcap_start() memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); dev_attr.acq_win.h_start = 0; dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) dev_attr.acq_win.width = ISP_CHN0_WIDTH; dev_attr.acq_win.height = ISP_CHN0_HEIGHT; #else @@ -476,7 +477,7 @@ int vivcap_start() chn_attr.out_win.height = ISP_CHN0_HEIGHT; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else // chn_attr.crop_win = dev_attr.acq_win; @@ -522,7 +523,7 @@ int vivcap_start() chn_attr.out_win.height = SENSOR_HEIGHT; // chn_attr.crop_win = dev_attr.acq_win; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else chn_attr.crop_win.h_start = 768; diff --git a/src/reference/ai_poc/distraction_reminder/vi_vo.h b/src/reference/ai_poc/distraction_reminder/vi_vo.h index f0c1bccc5..0a11a4d31 100644 --- a/src/reference/ai_poc/distraction_reminder/vi_vo.h +++ b/src/reference/ai_poc/distraction_reminder/vi_vo.h @@ -57,7 +57,7 @@ #include "k_autoconf_comm.h" -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) #define SENSOR_CHANNEL (3) // isp通道数 #define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 #define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 @@ -286,7 +286,7 @@ static k_s32 sample_connector_init(void) { k_u32 ret = 0; k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; #else k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; @@ -378,7 +378,8 @@ int vivcap_start() #if defined(CONFIG_BOARD_K230_CANMV) sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; #else sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; #endif @@ -444,7 +445,7 @@ int vivcap_start() memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); dev_attr.acq_win.h_start = 0; dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) dev_attr.acq_win.width = ISP_CHN0_WIDTH; dev_attr.acq_win.height = ISP_CHN0_HEIGHT; #else @@ -476,7 +477,7 @@ int vivcap_start() chn_attr.out_win.height = ISP_CHN0_HEIGHT; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else // chn_attr.crop_win = dev_attr.acq_win; @@ -522,7 +523,7 @@ int vivcap_start() chn_attr.out_win.height = SENSOR_HEIGHT; // chn_attr.crop_win = dev_attr.acq_win; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else chn_attr.crop_win.h_start = 768; diff --git a/src/reference/ai_poc/dms_system/hand_detection.cc b/src/reference/ai_poc/dms_system/hand_detection.cc index 3fff3528a..a8ec63893 100644 --- a/src/reference/ai_poc/dms_system/hand_detection.cc +++ b/src/reference/ai_poc/dms_system/hand_detection.cc @@ -175,7 +175,7 @@ std::vector HandDetection::decode_infer(float *data, int stride, FrameS box.x2 = std::max(0, std::min(int(frame_size.width), int(cx + w / 2.f))); box.y2 = std::max(0, std::min(int(frame_size.height), int(cy + h / 2.f))); - #if defined(CONFIG_BOARD_K230_CANMV) + #if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) if (abs(box.y1-box.y2)< 0.1*frame_size.height) continue; if ((abs(box.x1-box.x2)< 0.25*frame_size.width) && ((box.x1 < 0.03*frame_size.width) || (box.x2 > 0.97*frame_size.width))) diff --git a/src/reference/ai_poc/dms_system/vi_vo.h b/src/reference/ai_poc/dms_system/vi_vo.h index f0c1bccc5..0a11a4d31 100644 --- a/src/reference/ai_poc/dms_system/vi_vo.h +++ b/src/reference/ai_poc/dms_system/vi_vo.h @@ -57,7 +57,7 @@ #include "k_autoconf_comm.h" -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) #define SENSOR_CHANNEL (3) // isp通道数 #define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 #define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 @@ -286,7 +286,7 @@ static k_s32 sample_connector_init(void) { k_u32 ret = 0; k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; #else k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; @@ -378,7 +378,8 @@ int vivcap_start() #if defined(CONFIG_BOARD_K230_CANMV) sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; #else sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; #endif @@ -444,7 +445,7 @@ int vivcap_start() memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); dev_attr.acq_win.h_start = 0; dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) dev_attr.acq_win.width = ISP_CHN0_WIDTH; dev_attr.acq_win.height = ISP_CHN0_HEIGHT; #else @@ -476,7 +477,7 @@ int vivcap_start() chn_attr.out_win.height = ISP_CHN0_HEIGHT; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else // chn_attr.crop_win = dev_attr.acq_win; @@ -522,7 +523,7 @@ int vivcap_start() chn_attr.out_win.height = SENSOR_HEIGHT; // chn_attr.crop_win = dev_attr.acq_win; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else chn_attr.crop_win.h_start = 768; diff --git a/src/reference/ai_poc/dynamic_gesture/hand_detection.cc b/src/reference/ai_poc/dynamic_gesture/hand_detection.cc index adcb56e72..afa95ed81 100755 --- a/src/reference/ai_poc/dynamic_gesture/hand_detection.cc +++ b/src/reference/ai_poc/dynamic_gesture/hand_detection.cc @@ -179,7 +179,7 @@ std::vector HandDetection::decode_infer(float *data, int stride, FrameS box.x2 = std::max(0, std::min(int(frame_size.width), int(cx + w / 2.f))); box.y2 = std::max(0, std::min(int(frame_size.height), int(cy + h / 2.f))); - #if defined(CONFIG_BOARD_K230_CANMV) + #if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) if (abs(box.y1-box.y2)< 0.1*frame_size.height) continue; if ((abs(box.x1-box.x2)< 0.25*frame_size.width) && ((box.x1 < 0.03*frame_size.width) || (box.x2 > 0.97*frame_size.width))) diff --git a/src/reference/ai_poc/dynamic_gesture/vi_vo.h b/src/reference/ai_poc/dynamic_gesture/vi_vo.h old mode 100755 new mode 100644 index e3d8bdba4..0a11a4d31 --- a/src/reference/ai_poc/dynamic_gesture/vi_vo.h +++ b/src/reference/ai_poc/dynamic_gesture/vi_vo.h @@ -1,627 +1,628 @@ -/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include -#include -#include - -#include "mpi_sys_api.h" - -/* vicap */ -#include -#include -#include -#include -#include - -#include "k_module.h" -#include "k_type.h" -#include "k_vb_comm.h" -#include "k_video_comm.h" -#include "k_sys_comm.h" -#include "mpi_vb_api.h" -#include "mpi_vicap_api.h" -#include "mpi_isp_api.h" -#include "mpi_sys_api.h" -#include "k_vo_comm.h" -#include "mpi_vo_api.h" - -#include "vo_test_case.h" - -#include "k_connector_comm.h" -#include "mpi_connector_api.h" -#include "k_autoconf_comm.h" - - -#if defined(CONFIG_BOARD_K230_CANMV) -#define SENSOR_CHANNEL (3) // isp通道数 -#define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 -#define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 -#define ISP_CHN0_WIDTH (1920)//(1920) -#define ISP_CHN0_HEIGHT (1080)//(1080) -#define vicap_install_osd (1) -#define osd_id K_VO_OSD3 -#define osd_width (1920) -#define osd_height (1080) -#else -#define SENSOR_CHANNEL (3) // isp通道数 -#define SENSOR_HEIGHT (1280) // isp高度,ai输入,竖屏 -#define SENSOR_WIDTH (720) // isp宽度,ai输入,竖屏 -#define ISP_CHN0_WIDTH (1088)//(1920) -#define ISP_CHN0_HEIGHT (1920)//(1080) -#define vicap_install_osd (1) -#define osd_id K_VO_OSD3 -#define osd_width (1080) -#define osd_height (1920) -#endif - - -k_vb_config config; -k_vicap_dev vicap_dev; -k_vicap_chn vicap_chn; -k_vicap_dev_attr dev_attr; -k_vicap_chn_attr chn_attr; -k_vicap_sensor_info sensor_info; -k_vicap_sensor_type sensor_type; -k_mpp_chn vicap_mpp_chn; -k_mpp_chn vo_mpp_chn; - -k_video_frame_info dump_info; - -k_vo_draw_frame vo_frame = (k_vo_draw_frame) { - 1, - 16, - 16, - 128, - 128, - 1 -}; - -static k_vb_blk_handle block; -k_u32 g_pool_id; - -int vo_creat_layer_test(k_vo_layer chn_id, layer_info *info) -{ - k_vo_video_layer_attr attr; - - // check layer - if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) - || ((info->func != 0) && (chn_id == K_VO_LAYER2))) - { - printf("input layer num failed \n"); - return -1 ; - } - - // check scaler - - // set offset - attr.display_rect = info->offset; - // set act - attr.img_size = info->act_size; - // sget size - info->size = info->act_size.height * info->act_size.width * 3 / 2; - //set pixel format - attr.pixel_format = info->format; - if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) - { - printf("input pix format failed \n"); - return -1; - } - // set stride - attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); - // set function - attr.func = info->func; - // set scaler attr - attr.scaler_attr = info->attr; - - // set video layer atrr - kd_mpi_vo_set_video_layer_attr(chn_id, &attr); - - // enable layer - kd_mpi_vo_enable_video_layer(chn_id); - - return 0; -} - -k_vb_blk_handle vo_insert_frame(k_video_frame_info *vf_info, void **pic_vaddr) -{ - k_u64 phys_addr = 0; - k_u32 *virt_addr; - k_vb_blk_handle handle; - k_s32 size; - - if (vf_info == NULL) - return K_FALSE; - - if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_8888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_8888) - size = vf_info->v_frame.height * vf_info->v_frame.width * 4; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_565 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_565) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_4444 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_4444) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_888) - size = vf_info->v_frame.height * vf_info->v_frame.width * 3; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_1555 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_1555) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) - size = vf_info->v_frame.height * vf_info->v_frame.width * 3 / 2; - - size = size + 4096; // 强制4K ,后边得删了 - - printf("vb block size is %x \n", size); - - handle = kd_mpi_vb_get_block(g_pool_id, size, NULL); - if (handle == VB_INVALID_HANDLE) - { - printf("%s get vb block error\n", __func__); - return K_FAILED; - } - - phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); - if (phys_addr == 0) - { - printf("%s get phys addr error\n", __func__); - return K_FAILED; - } - - virt_addr = (k_u32 *)kd_mpi_sys_mmap(phys_addr, size); - // virt_addr = (k_u32 *)kd_mpi_sys_mmap_cached(phys_addr, size); - - if (virt_addr == NULL) - { - printf("%s mmap error\n", __func__); - return K_FAILED; - } - - vf_info->mod_id = K_ID_VO; - vf_info->pool_id = g_pool_id; - vf_info->v_frame.phys_addr[0] = phys_addr; - if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) - vf_info->v_frame.phys_addr[1] = phys_addr + (vf_info->v_frame.height * vf_info->v_frame.stride[0]); - *pic_vaddr = virt_addr; - - printf("phys_addr is %lx g_pool_id is %d \n", phys_addr, g_pool_id); - - return handle; -} - -k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) -{ - k_vo_video_osd_attr attr; - - // set attr - attr.global_alptha = info->global_alptha; - - if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) - { - info->size = info->act_size.width * info->act_size.height * 4; - info->stride = info->act_size.width * 4 / 8; - } - else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) - { - info->size = info->act_size.width * info->act_size.height * 3; - info->stride = info->act_size.width * 3 / 8; - } - else if(info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else if(info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else - { - printf("set osd pixel format failed \n"); - } - - attr.stride = info->stride; - attr.pixel_format = info->format; - attr.display_rect = info->offset; - attr.img_size = info->act_size; - kd_mpi_vo_set_video_osd_attr(osd, &attr); - - kd_mpi_vo_osd_enable(osd); - - return 0; -} - -void sample_vicap_install_osd(void) -{ - osd_info osd; - - osd.act_size.width = osd_width ; - osd.act_size.height = osd_height; - osd.offset.x = 0; - osd.offset.y = 0; - osd.global_alptha = 0xff; - // osd.global_alptha = 0x32; - osd.format = PIXEL_FORMAT_ARGB_8888;//PIXEL_FORMAT_ARGB_4444; //PIXEL_FORMAT_ARGB_1555;//PIXEL_FORMAT_ARGB_8888; - - vo_creat_osd_test(osd_id, &osd); -} - -void vo_osd_release_block(void) -{ - if(vicap_install_osd == 1) - { - kd_mpi_vo_osd_disable(osd_id); - kd_mpi_vb_release_block(block); - } - -} - -static k_s32 sample_connector_init(void) -{ - k_u32 ret = 0; - k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) - k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; -#else - k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; -#endif - k_connector_info connector_info; - - memset(&connector_info, 0, sizeof(k_connector_info)); - - //connector get sensor info - ret = kd_mpi_get_connector_info(connector_type, &connector_info); - if (ret) { - printf("sample_vicap, the sensor type not supported!\n"); - return ret; - } - - connector_fd = kd_mpi_connector_open(connector_info.connector_name); - if (connector_fd < 0) { - printf("%s, connector open failed.\n", __func__); - return K_ERR_VO_NOTREADY; - } - - // set connect power - kd_mpi_connector_power_set(connector_fd, K_TRUE); - // connector init - kd_mpi_connector_init(connector_fd, connector_info); - - return 0; -} - -static k_s32 vo_layer_vdss_bind_vo_config(void) -{ - layer_info info; - - k_vo_layer chn_id = K_VO_LAYER1; - - memset(&info, 0, sizeof(info)); - - sample_connector_init(); - - // config lyaer - info.act_size.width = ISP_CHN0_WIDTH;//ISP_CHN0_HEIGHT;//1080;//640;//1080; - info.act_size.height = ISP_CHN0_HEIGHT;//ISP_CHN0_WIDTH;//1920;//480;//1920; - info.format = PIXEL_FORMAT_YVU_PLANAR_420; - info.func = 0;//K_ROTATION_180;////K_ROTATION_90; - info.global_alptha = 0xff; - info.offset.x = 0;//(1080-w)/2, - info.offset.y = 0;//(1920-h)/2; - vo_creat_layer_test(chn_id, &info); - - if(vicap_install_osd == 1) - sample_vicap_install_osd(); - - //exit ; - return 0; -} - -static void sample_vicap_bind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) -{ - k_s32 ret; - - ret = kd_mpi_sys_bind(&vicap_mpp_chn, &vo_mpp_chn); - if (ret) { - printf("kd_mpi_sys_unbind failed:0x%x\n", ret); - } - - return; -} - -static void sample_vicap_unbind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) -{ - k_s32 ret; - - ret = kd_mpi_sys_unbind(&vicap_mpp_chn, &vo_mpp_chn); - if (ret) { - printf("kd_mpi_sys_unbind failed:0x%x\n", ret); - } - - return; -} - -int vivcap_start() -{ - k_s32 ret = 0; - - k_u32 pool_id; - k_vb_pool_config pool_config; - - printf("sample_vicap ...\n"); - -#if defined(CONFIG_BOARD_K230_CANMV) - sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); -#else - sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; -#endif - vicap_dev = VICAP_DEV_ID_0; - - memset(&config, 0, sizeof(config)); - config.max_pool_cnt = 64; - //VB for YUV420SP output - config.comm_pool[0].blk_cnt = 5; - config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; - config.comm_pool[0].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), VICAP_ALIGN_1K); - - //VB for RGB888 output - config.comm_pool[1].blk_cnt = 5; - config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; - config.comm_pool[1].blk_size = VICAP_ALIGN_UP((SENSOR_HEIGHT * SENSOR_WIDTH * 3 ), VICAP_ALIGN_1K); - - ret = kd_mpi_vb_set_config(&config); - if (ret) { - printf("vb_set_config failed ret:%d\n", ret); - return ret; - } - - k_vb_supplement_config supplement_config; - memset(&supplement_config, 0, sizeof(supplement_config)); - supplement_config.supplement_config |= VB_SUPPLEMENT_JPEG_MASK; - - ret = kd_mpi_vb_set_supplement_config(&supplement_config); - if (ret) { - printf("vb_set_supplement_config failed ret:%d\n", ret); - return ret; - } - - ret = kd_mpi_vb_init(); - if (ret) { - printf("vb_init failed ret:%d\n", ret); - return ret; - } - printf("sample_vicap ...kd_mpi_vicap_get_sensor_info\n"); - - // dwc_dsi_init(); - vo_layer_vdss_bind_vo_config(); - - if(vicap_install_osd == 1) - { - memset(&pool_config, 0, sizeof(pool_config)); - pool_config.blk_size = VICAP_ALIGN_UP((osd_width * osd_height * 4 * 2), VICAP_ALIGN_1K); - pool_config.blk_cnt = 4; - pool_config.mode = VB_REMAP_MODE_NOCACHE; - pool_id = kd_mpi_vb_create_pool(&pool_config); // osd0 - 3 argb 320 x 240 - g_pool_id = pool_id; - - printf("--------aa--------------g_pool_id is %d pool_id is %d \n",g_pool_id, pool_id); - } - - memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); - ret = kd_mpi_vicap_get_sensor_info(sensor_type, &sensor_info); - if (ret) { - printf("sample_vicap, the sensor type not supported!\n"); - return ret; - } - - memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); - dev_attr.acq_win.h_start = 0; - dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) - dev_attr.acq_win.width = ISP_CHN0_WIDTH; - dev_attr.acq_win.height = ISP_CHN0_HEIGHT; -#else - dev_attr.acq_win.width = 2592;//SENSOR_HEIGHT; - dev_attr.acq_win.height = 1944;//SENSOR_WIDTH; -#endif - dev_attr.mode = VICAP_WORK_ONLINE_MODE; - - dev_attr.pipe_ctrl.data = 0xFFFFFFFF; - dev_attr.pipe_ctrl.bits.af_enable = 0; - dev_attr.pipe_ctrl.bits.ahdr_enable = 0; - - - dev_attr.cpature_frame = 0; - memcpy(&dev_attr.sensor_info, &sensor_info, sizeof(k_vicap_sensor_info)); - - ret = kd_mpi_vicap_set_dev_attr(vicap_dev, dev_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_dev_attr failed.\n"); - return ret; - } - - memset(&chn_attr, 0, sizeof(k_vicap_chn_attr)); - - //set chn0 output yuv420sp - chn_attr.out_win.h_start = 0; - chn_attr.out_win.v_start = 0; - chn_attr.out_win.width = ISP_CHN0_WIDTH; - chn_attr.out_win.height = ISP_CHN0_HEIGHT; - - -#if defined(CONFIG_BOARD_K230_CANMV) - chn_attr.crop_win = dev_attr.acq_win; -#else - // chn_attr.crop_win = dev_attr.acq_win; - chn_attr.crop_win.h_start = 768; - chn_attr.crop_win.v_start = 16; - chn_attr.crop_win.width = ISP_CHN0_WIDTH; - chn_attr.crop_win.height = ISP_CHN0_HEIGHT; -#endif - - chn_attr.scale_win = chn_attr.out_win; - chn_attr.crop_enable = K_FALSE; - chn_attr.scale_enable = K_FALSE; - // chn_attr.dw_enable = K_FALSE; - chn_attr.chn_enable = K_TRUE; - chn_attr.pix_format = PIXEL_FORMAT_YVU_PLANAR_420; - chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp - chn_attr.buffer_size = config.comm_pool[0].blk_size; - vicap_chn = VICAP_CHN_ID_0; - - printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); - ret = kd_mpi_vicap_set_chn_attr(vicap_dev, vicap_chn, chn_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); - return ret; - } - - //bind vicap chn 0 to vo - vicap_mpp_chn.mod_id = K_ID_VI; - vicap_mpp_chn.dev_id = vicap_dev; - vicap_mpp_chn.chn_id = vicap_chn; - - vo_mpp_chn.mod_id = K_ID_VO; - vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; - vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; - - sample_vicap_bind_vo(vicap_mpp_chn, vo_mpp_chn); - printf("sample_vicap ...dwc_dsi_init\n"); - - //set chn1 output rgb888p - chn_attr.out_win.h_start = 0; - chn_attr.out_win.v_start = 0; - chn_attr.out_win.width = SENSOR_WIDTH ; - chn_attr.out_win.height = SENSOR_HEIGHT; - // chn_attr.crop_win = dev_attr.acq_win; - -#if defined(CONFIG_BOARD_K230_CANMV) - chn_attr.crop_win = dev_attr.acq_win; -#else - chn_attr.crop_win.h_start = 768; - chn_attr.crop_win.v_start = 16; - chn_attr.crop_win.width = ISP_CHN0_WIDTH; - chn_attr.crop_win.height = ISP_CHN0_HEIGHT; -#endif - - chn_attr.scale_win = chn_attr.out_win; - chn_attr.crop_enable = K_FALSE; - chn_attr.scale_enable = K_FALSE; - // chn_attr.dw_enable = K_FALSE; - chn_attr.chn_enable = K_TRUE; - chn_attr.pix_format = PIXEL_FORMAT_BGR_888_PLANAR; - chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp - chn_attr.buffer_size = config.comm_pool[1].blk_size; - - printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); - ret = kd_mpi_vicap_set_chn_attr(vicap_dev, VICAP_CHN_ID_1, chn_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); - return ret; - } - - printf("sample_vicap ...kd_mpi_vicap_init\n"); - ret = kd_mpi_vicap_init(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - // goto err_exit; - } - - printf("sample_vicap ...kd_mpi_vicap_start_stream\n"); - ret = kd_mpi_vicap_start_stream(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - // goto err_exit; - } - - return ret; -} - -int vivcap_stop() -{ - printf("sample_vicap ...kd_mpi_vicap_stop_stream\n"); - int ret = kd_mpi_vicap_stop_stream(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - return ret; - } - - ret = kd_mpi_vicap_deinit(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_deinit failed.\n"); - return ret; - } - - kd_mpi_vo_disable_video_layer(K_VO_LAYER1); - - vicap_mpp_chn.mod_id = K_ID_VI; - vicap_mpp_chn.dev_id = vicap_dev; - vicap_mpp_chn.chn_id = vicap_chn; - - vo_mpp_chn.mod_id = K_ID_VO; - vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; - vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; - - sample_vicap_unbind_vo(vicap_mpp_chn, vo_mpp_chn); - - /*Allow one frame time for the VO to release the VB block*/ - k_u32 display_ms = 1000 / 33; - usleep(1000 * display_ms); - - ret = kd_mpi_vb_exit(); - if (ret) { - printf("sample_vicap, kd_mpi_vb_exit failed.\n"); - return ret; - } - - return 0; -} - -void yuv_rotate_90(char *des, char *src,int width,int height) -{ - int n = 0; - int hw = width>>1; - int hh = height>>1; - int size = width * height; - int hsize = size>>2; - - int pos = 0; - - for(int i = width-1;i >= 0;i--) - { - pos = 0; - for(int j= 0;j < height;j++) - { - des[n++]= src[pos+i]; - pos += width; - } - } - +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include + +#include "mpi_sys_api.h" + +/* vicap */ +#include +#include +#include +#include +#include + +#include "k_module.h" +#include "k_type.h" +#include "k_vb_comm.h" +#include "k_video_comm.h" +#include "k_sys_comm.h" +#include "mpi_vb_api.h" +#include "mpi_vicap_api.h" +#include "mpi_isp_api.h" +#include "mpi_sys_api.h" +#include "k_vo_comm.h" +#include "mpi_vo_api.h" + +#include "vo_test_case.h" + +#include "k_connector_comm.h" +#include "mpi_connector_api.h" +#include "k_autoconf_comm.h" + + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) +#define SENSOR_CHANNEL (3) // isp通道数 +#define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 +#define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 +#define ISP_CHN0_WIDTH (1920)//(1920) +#define ISP_CHN0_HEIGHT (1080)//(1080) +#define vicap_install_osd (1) +#define osd_id K_VO_OSD3 +#define osd_width (1920) +#define osd_height (1080) +#else +#define SENSOR_CHANNEL (3) // isp通道数 +#define SENSOR_HEIGHT (1280) // isp高度,ai输入,竖屏 +#define SENSOR_WIDTH (720) // isp宽度,ai输入,竖屏 +#define ISP_CHN0_WIDTH (1088)//(1920) +#define ISP_CHN0_HEIGHT (1920)//(1080) +#define vicap_install_osd (1) +#define osd_id K_VO_OSD3 +#define osd_width (1080) +#define osd_height (1920) +#endif + + +k_vb_config config; +k_vicap_dev vicap_dev; +k_vicap_chn vicap_chn; +k_vicap_dev_attr dev_attr; +k_vicap_chn_attr chn_attr; +k_vicap_sensor_info sensor_info; +k_vicap_sensor_type sensor_type; +k_mpp_chn vicap_mpp_chn; +k_mpp_chn vo_mpp_chn; + +k_video_frame_info dump_info; + +k_vo_draw_frame vo_frame = (k_vo_draw_frame) { + 1, + 16, + 16, + 128, + 128, + 1 +}; + +static k_vb_blk_handle block; +k_u32 g_pool_id; + +int vo_creat_layer_test(k_vo_layer chn_id, layer_info *info) +{ + k_vo_video_layer_attr attr; + + // check layer + if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) + || ((info->func != 0) && (chn_id == K_VO_LAYER2))) + { + printf("input layer num failed \n"); + return -1 ; + } + + // check scaler + + // set offset + attr.display_rect = info->offset; + // set act + attr.img_size = info->act_size; + // sget size + info->size = info->act_size.height * info->act_size.width * 3 / 2; + //set pixel format + attr.pixel_format = info->format; + if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) + { + printf("input pix format failed \n"); + return -1; + } + // set stride + attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); + // set function + attr.func = info->func; + // set scaler attr + attr.scaler_attr = info->attr; + + // set video layer atrr + kd_mpi_vo_set_video_layer_attr(chn_id, &attr); + + // enable layer + kd_mpi_vo_enable_video_layer(chn_id); + + return 0; +} + +k_vb_blk_handle vo_insert_frame(k_video_frame_info *vf_info, void **pic_vaddr) +{ + k_u64 phys_addr = 0; + k_u32 *virt_addr; + k_vb_blk_handle handle; + k_s32 size; + + if (vf_info == NULL) + return K_FALSE; + + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_8888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_8888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 4; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_565 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_565) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_4444 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_4444) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_1555 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_1555) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3 / 2; + + size = size + 4096; // 强制4K ,后边得删了 + + printf("vb block size is %x \n", size); + + handle = kd_mpi_vb_get_block(g_pool_id, size, NULL); + if (handle == VB_INVALID_HANDLE) + { + printf("%s get vb block error\n", __func__); + return K_FAILED; + } + + phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); + if (phys_addr == 0) + { + printf("%s get phys addr error\n", __func__); + return K_FAILED; + } + + virt_addr = (k_u32 *)kd_mpi_sys_mmap(phys_addr, size); + // virt_addr = (k_u32 *)kd_mpi_sys_mmap_cached(phys_addr, size); + + if (virt_addr == NULL) + { + printf("%s mmap error\n", __func__); + return K_FAILED; + } + + vf_info->mod_id = K_ID_VO; + vf_info->pool_id = g_pool_id; + vf_info->v_frame.phys_addr[0] = phys_addr; + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + vf_info->v_frame.phys_addr[1] = phys_addr + (vf_info->v_frame.height * vf_info->v_frame.stride[0]); + *pic_vaddr = virt_addr; + + printf("phys_addr is %lx g_pool_id is %d \n", phys_addr, g_pool_id); + + return handle; +} + +k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) +{ + k_vo_video_osd_attr attr; + + // set attr + attr.global_alptha = info->global_alptha; + + if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) + { + info->size = info->act_size.width * info->act_size.height * 4; + info->stride = info->act_size.width * 4 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) + { + info->size = info->act_size.width * info->act_size.height * 3; + info->stride = info->act_size.width * 3 / 8; + } + else if(info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if(info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else + { + printf("set osd pixel format failed \n"); + } + + attr.stride = info->stride; + attr.pixel_format = info->format; + attr.display_rect = info->offset; + attr.img_size = info->act_size; + kd_mpi_vo_set_video_osd_attr(osd, &attr); + + kd_mpi_vo_osd_enable(osd); + + return 0; +} + +void sample_vicap_install_osd(void) +{ + osd_info osd; + + osd.act_size.width = osd_width ; + osd.act_size.height = osd_height; + osd.offset.x = 0; + osd.offset.y = 0; + osd.global_alptha = 0xff; + // osd.global_alptha = 0x32; + osd.format = PIXEL_FORMAT_ARGB_8888;//PIXEL_FORMAT_ARGB_4444; //PIXEL_FORMAT_ARGB_1555;//PIXEL_FORMAT_ARGB_8888; + + vo_creat_osd_test(osd_id, &osd); +} + +void vo_osd_release_block(void) +{ + if(vicap_install_osd == 1) + { + kd_mpi_vo_osd_disable(osd_id); + kd_mpi_vb_release_block(block); + } + +} + +static k_s32 sample_connector_init(void) +{ + k_u32 ret = 0; + k_s32 connector_fd; +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#else + k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#endif + k_connector_info connector_info; + + memset(&connector_info, 0, sizeof(k_connector_info)); + + //connector get sensor info + ret = kd_mpi_get_connector_info(connector_type, &connector_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + + connector_fd = kd_mpi_connector_open(connector_info.connector_name); + if (connector_fd < 0) { + printf("%s, connector open failed.\n", __func__); + return K_ERR_VO_NOTREADY; + } + + // set connect power + kd_mpi_connector_power_set(connector_fd, K_TRUE); + // connector init + kd_mpi_connector_init(connector_fd, connector_info); + + return 0; +} + +static k_s32 vo_layer_vdss_bind_vo_config(void) +{ + layer_info info; + + k_vo_layer chn_id = K_VO_LAYER1; + + memset(&info, 0, sizeof(info)); + + sample_connector_init(); + + // config lyaer + info.act_size.width = ISP_CHN0_WIDTH;//ISP_CHN0_HEIGHT;//1080;//640;//1080; + info.act_size.height = ISP_CHN0_HEIGHT;//ISP_CHN0_WIDTH;//1920;//480;//1920; + info.format = PIXEL_FORMAT_YVU_PLANAR_420; + info.func = 0;//K_ROTATION_180;////K_ROTATION_90; + info.global_alptha = 0xff; + info.offset.x = 0;//(1080-w)/2, + info.offset.y = 0;//(1920-h)/2; + vo_creat_layer_test(chn_id, &info); + + if(vicap_install_osd == 1) + sample_vicap_install_osd(); + + //exit ; + return 0; +} + +static void sample_vicap_bind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) +{ + k_s32 ret; + + ret = kd_mpi_sys_bind(&vicap_mpp_chn, &vo_mpp_chn); + if (ret) { + printf("kd_mpi_sys_unbind failed:0x%x\n", ret); + } + + return; +} + +static void sample_vicap_unbind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) +{ + k_s32 ret; + + ret = kd_mpi_sys_unbind(&vicap_mpp_chn, &vo_mpp_chn); + if (ret) { + printf("kd_mpi_sys_unbind failed:0x%x\n", ret); + } + + return; +} + +int vivcap_start() +{ + k_s32 ret = 0; + + k_u32 pool_id; + k_vb_pool_config pool_config; + + printf("sample_vicap ...\n"); + +#if defined(CONFIG_BOARD_K230_CANMV) + sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; +#else + sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; +#endif + vicap_dev = VICAP_DEV_ID_0; + + memset(&config, 0, sizeof(config)); + config.max_pool_cnt = 64; + //VB for YUV420SP output + config.comm_pool[0].blk_cnt = 5; + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[0].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), VICAP_ALIGN_1K); + + //VB for RGB888 output + config.comm_pool[1].blk_cnt = 5; + config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[1].blk_size = VICAP_ALIGN_UP((SENSOR_HEIGHT * SENSOR_WIDTH * 3 ), VICAP_ALIGN_1K); + + ret = kd_mpi_vb_set_config(&config); + if (ret) { + printf("vb_set_config failed ret:%d\n", ret); + return ret; + } + + k_vb_supplement_config supplement_config; + memset(&supplement_config, 0, sizeof(supplement_config)); + supplement_config.supplement_config |= VB_SUPPLEMENT_JPEG_MASK; + + ret = kd_mpi_vb_set_supplement_config(&supplement_config); + if (ret) { + printf("vb_set_supplement_config failed ret:%d\n", ret); + return ret; + } + + ret = kd_mpi_vb_init(); + if (ret) { + printf("vb_init failed ret:%d\n", ret); + return ret; + } + printf("sample_vicap ...kd_mpi_vicap_get_sensor_info\n"); + + // dwc_dsi_init(); + vo_layer_vdss_bind_vo_config(); + + if(vicap_install_osd == 1) + { + memset(&pool_config, 0, sizeof(pool_config)); + pool_config.blk_size = VICAP_ALIGN_UP((osd_width * osd_height * 4 * 2), VICAP_ALIGN_1K); + pool_config.blk_cnt = 4; + pool_config.mode = VB_REMAP_MODE_NOCACHE; + pool_id = kd_mpi_vb_create_pool(&pool_config); // osd0 - 3 argb 320 x 240 + g_pool_id = pool_id; + + printf("--------aa--------------g_pool_id is %d pool_id is %d \n",g_pool_id, pool_id); + } + + memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); + ret = kd_mpi_vicap_get_sensor_info(sensor_type, &sensor_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + + memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); + dev_attr.acq_win.h_start = 0; + dev_attr.acq_win.v_start = 0; +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + dev_attr.acq_win.width = ISP_CHN0_WIDTH; + dev_attr.acq_win.height = ISP_CHN0_HEIGHT; +#else + dev_attr.acq_win.width = 2592;//SENSOR_HEIGHT; + dev_attr.acq_win.height = 1944;//SENSOR_WIDTH; +#endif + dev_attr.mode = VICAP_WORK_ONLINE_MODE; + + dev_attr.pipe_ctrl.data = 0xFFFFFFFF; + dev_attr.pipe_ctrl.bits.af_enable = 0; + dev_attr.pipe_ctrl.bits.ahdr_enable = 0; + + + dev_attr.cpature_frame = 0; + memcpy(&dev_attr.sensor_info, &sensor_info, sizeof(k_vicap_sensor_info)); + + ret = kd_mpi_vicap_set_dev_attr(vicap_dev, dev_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_dev_attr failed.\n"); + return ret; + } + + memset(&chn_attr, 0, sizeof(k_vicap_chn_attr)); + + //set chn0 output yuv420sp + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = ISP_CHN0_WIDTH; + chn_attr.out_win.height = ISP_CHN0_HEIGHT; + + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + chn_attr.crop_win = dev_attr.acq_win; +#else + // chn_attr.crop_win = dev_attr.acq_win; + chn_attr.crop_win.h_start = 768; + chn_attr.crop_win.v_start = 16; + chn_attr.crop_win.width = ISP_CHN0_WIDTH; + chn_attr.crop_win.height = ISP_CHN0_HEIGHT; +#endif + + chn_attr.scale_win = chn_attr.out_win; + chn_attr.crop_enable = K_FALSE; + chn_attr.scale_enable = K_FALSE; + // chn_attr.dw_enable = K_FALSE; + chn_attr.chn_enable = K_TRUE; + chn_attr.pix_format = PIXEL_FORMAT_YVU_PLANAR_420; + chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp + chn_attr.buffer_size = config.comm_pool[0].blk_size; + vicap_chn = VICAP_CHN_ID_0; + + printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); + ret = kd_mpi_vicap_set_chn_attr(vicap_dev, vicap_chn, chn_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); + return ret; + } + + //bind vicap chn 0 to vo + vicap_mpp_chn.mod_id = K_ID_VI; + vicap_mpp_chn.dev_id = vicap_dev; + vicap_mpp_chn.chn_id = vicap_chn; + + vo_mpp_chn.mod_id = K_ID_VO; + vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; + vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; + + sample_vicap_bind_vo(vicap_mpp_chn, vo_mpp_chn); + printf("sample_vicap ...dwc_dsi_init\n"); + + //set chn1 output rgb888p + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = SENSOR_WIDTH ; + chn_attr.out_win.height = SENSOR_HEIGHT; + // chn_attr.crop_win = dev_attr.acq_win; + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + chn_attr.crop_win = dev_attr.acq_win; +#else + chn_attr.crop_win.h_start = 768; + chn_attr.crop_win.v_start = 16; + chn_attr.crop_win.width = ISP_CHN0_WIDTH; + chn_attr.crop_win.height = ISP_CHN0_HEIGHT; +#endif + + chn_attr.scale_win = chn_attr.out_win; + chn_attr.crop_enable = K_FALSE; + chn_attr.scale_enable = K_FALSE; + // chn_attr.dw_enable = K_FALSE; + chn_attr.chn_enable = K_TRUE; + chn_attr.pix_format = PIXEL_FORMAT_BGR_888_PLANAR; + chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp + chn_attr.buffer_size = config.comm_pool[1].blk_size; + + printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); + ret = kd_mpi_vicap_set_chn_attr(vicap_dev, VICAP_CHN_ID_1, chn_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); + return ret; + } + + printf("sample_vicap ...kd_mpi_vicap_init\n"); + ret = kd_mpi_vicap_init(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + // goto err_exit; + } + + printf("sample_vicap ...kd_mpi_vicap_start_stream\n"); + ret = kd_mpi_vicap_start_stream(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + // goto err_exit; + } + + return ret; +} + +int vivcap_stop() +{ + printf("sample_vicap ...kd_mpi_vicap_stop_stream\n"); + int ret = kd_mpi_vicap_stop_stream(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + return ret; + } + + ret = kd_mpi_vicap_deinit(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_deinit failed.\n"); + return ret; + } + + kd_mpi_vo_disable_video_layer(K_VO_LAYER1); + + vicap_mpp_chn.mod_id = K_ID_VI; + vicap_mpp_chn.dev_id = vicap_dev; + vicap_mpp_chn.chn_id = vicap_chn; + + vo_mpp_chn.mod_id = K_ID_VO; + vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; + vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; + + sample_vicap_unbind_vo(vicap_mpp_chn, vo_mpp_chn); + + /*Allow one frame time for the VO to release the VB block*/ + k_u32 display_ms = 1000 / 33; + usleep(1000 * display_ms); + + ret = kd_mpi_vb_exit(); + if (ret) { + printf("sample_vicap, kd_mpi_vb_exit failed.\n"); + return ret; + } + + return 0; +} + +void yuv_rotate_90(char *des, char *src,int width,int height) +{ + int n = 0; + int hw = width>>1; + int hh = height>>1; + int size = width * height; + int hsize = size>>2; + + int pos = 0; + + for(int i = width-1;i >= 0;i--) + { + pos = 0; + for(int j= 0;j < height;j++) + { + des[n++]= src[pos+i]; + pos += width; + } + } + } \ No newline at end of file diff --git a/src/reference/ai_poc/eye_gaze/vi_vo.h b/src/reference/ai_poc/eye_gaze/vi_vo.h index f0c1bccc5..0a11a4d31 100644 --- a/src/reference/ai_poc/eye_gaze/vi_vo.h +++ b/src/reference/ai_poc/eye_gaze/vi_vo.h @@ -57,7 +57,7 @@ #include "k_autoconf_comm.h" -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) #define SENSOR_CHANNEL (3) // isp通道数 #define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 #define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 @@ -286,7 +286,7 @@ static k_s32 sample_connector_init(void) { k_u32 ret = 0; k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; #else k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; @@ -378,7 +378,8 @@ int vivcap_start() #if defined(CONFIG_BOARD_K230_CANMV) sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; #else sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; #endif @@ -444,7 +445,7 @@ int vivcap_start() memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); dev_attr.acq_win.h_start = 0; dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) dev_attr.acq_win.width = ISP_CHN0_WIDTH; dev_attr.acq_win.height = ISP_CHN0_HEIGHT; #else @@ -476,7 +477,7 @@ int vivcap_start() chn_attr.out_win.height = ISP_CHN0_HEIGHT; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else // chn_attr.crop_win = dev_attr.acq_win; @@ -522,7 +523,7 @@ int vivcap_start() chn_attr.out_win.height = SENSOR_HEIGHT; // chn_attr.crop_win = dev_attr.acq_win; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else chn_attr.crop_win.h_start = 768; diff --git a/src/reference/ai_poc/face_alignment/vi_vo.h b/src/reference/ai_poc/face_alignment/vi_vo.h index f0c1bccc5..0a11a4d31 100644 --- a/src/reference/ai_poc/face_alignment/vi_vo.h +++ b/src/reference/ai_poc/face_alignment/vi_vo.h @@ -57,7 +57,7 @@ #include "k_autoconf_comm.h" -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) #define SENSOR_CHANNEL (3) // isp通道数 #define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 #define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 @@ -286,7 +286,7 @@ static k_s32 sample_connector_init(void) { k_u32 ret = 0; k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; #else k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; @@ -378,7 +378,8 @@ int vivcap_start() #if defined(CONFIG_BOARD_K230_CANMV) sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; #else sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; #endif @@ -444,7 +445,7 @@ int vivcap_start() memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); dev_attr.acq_win.h_start = 0; dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) dev_attr.acq_win.width = ISP_CHN0_WIDTH; dev_attr.acq_win.height = ISP_CHN0_HEIGHT; #else @@ -476,7 +477,7 @@ int vivcap_start() chn_attr.out_win.height = ISP_CHN0_HEIGHT; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else // chn_attr.crop_win = dev_attr.acq_win; @@ -522,7 +523,7 @@ int vivcap_start() chn_attr.out_win.height = SENSOR_HEIGHT; // chn_attr.crop_win = dev_attr.acq_win; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else chn_attr.crop_win.h_start = 768; diff --git a/src/reference/ai_poc/face_detection/vi_vo.h b/src/reference/ai_poc/face_detection/vi_vo.h index f0c1bccc5..15f0bc111 100644 --- a/src/reference/ai_poc/face_detection/vi_vo.h +++ b/src/reference/ai_poc/face_detection/vi_vo.h @@ -57,7 +57,7 @@ #include "k_autoconf_comm.h" -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) #define SENSOR_CHANNEL (3) // isp通道数 #define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 #define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 @@ -286,7 +286,7 @@ static k_s32 sample_connector_init(void) { k_u32 ret = 0; k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; #else k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; @@ -378,7 +378,8 @@ int vivcap_start() #if defined(CONFIG_BOARD_K230_CANMV) sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; #else sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; #endif @@ -444,7 +445,7 @@ int vivcap_start() memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); dev_attr.acq_win.h_start = 0; dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) dev_attr.acq_win.width = ISP_CHN0_WIDTH; dev_attr.acq_win.height = ISP_CHN0_HEIGHT; #else @@ -476,7 +477,7 @@ int vivcap_start() chn_attr.out_win.height = ISP_CHN0_HEIGHT; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else // chn_attr.crop_win = dev_attr.acq_win; @@ -522,7 +523,7 @@ int vivcap_start() chn_attr.out_win.height = SENSOR_HEIGHT; // chn_attr.crop_win = dev_attr.acq_win; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) chn_attr.crop_win = dev_attr.acq_win; #else chn_attr.crop_win.h_start = 768; diff --git a/src/reference/ai_poc/face_emotion/vi_vo.h b/src/reference/ai_poc/face_emotion/vi_vo.h index f0c1bccc5..0a11a4d31 100644 --- a/src/reference/ai_poc/face_emotion/vi_vo.h +++ b/src/reference/ai_poc/face_emotion/vi_vo.h @@ -57,7 +57,7 @@ #include "k_autoconf_comm.h" -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) #define SENSOR_CHANNEL (3) // isp通道数 #define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 #define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 @@ -286,7 +286,7 @@ static k_s32 sample_connector_init(void) { k_u32 ret = 0; k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; #else k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; @@ -378,7 +378,8 @@ int vivcap_start() #if defined(CONFIG_BOARD_K230_CANMV) sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; #else sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; #endif @@ -444,7 +445,7 @@ int vivcap_start() memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); dev_attr.acq_win.h_start = 0; dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) dev_attr.acq_win.width = ISP_CHN0_WIDTH; dev_attr.acq_win.height = ISP_CHN0_HEIGHT; #else @@ -476,7 +477,7 @@ int vivcap_start() chn_attr.out_win.height = ISP_CHN0_HEIGHT; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else // chn_attr.crop_win = dev_attr.acq_win; @@ -522,7 +523,7 @@ int vivcap_start() chn_attr.out_win.height = SENSOR_HEIGHT; // chn_attr.crop_win = dev_attr.acq_win; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else chn_attr.crop_win.h_start = 768; diff --git a/src/reference/ai_poc/face_gender/vi_vo.h b/src/reference/ai_poc/face_gender/vi_vo.h index f0c1bccc5..0a11a4d31 100644 --- a/src/reference/ai_poc/face_gender/vi_vo.h +++ b/src/reference/ai_poc/face_gender/vi_vo.h @@ -57,7 +57,7 @@ #include "k_autoconf_comm.h" -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) #define SENSOR_CHANNEL (3) // isp通道数 #define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 #define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 @@ -286,7 +286,7 @@ static k_s32 sample_connector_init(void) { k_u32 ret = 0; k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; #else k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; @@ -378,7 +378,8 @@ int vivcap_start() #if defined(CONFIG_BOARD_K230_CANMV) sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; #else sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; #endif @@ -444,7 +445,7 @@ int vivcap_start() memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); dev_attr.acq_win.h_start = 0; dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) dev_attr.acq_win.width = ISP_CHN0_WIDTH; dev_attr.acq_win.height = ISP_CHN0_HEIGHT; #else @@ -476,7 +477,7 @@ int vivcap_start() chn_attr.out_win.height = ISP_CHN0_HEIGHT; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else // chn_attr.crop_win = dev_attr.acq_win; @@ -522,7 +523,7 @@ int vivcap_start() chn_attr.out_win.height = SENSOR_HEIGHT; // chn_attr.crop_win = dev_attr.acq_win; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else chn_attr.crop_win.h_start = 768; diff --git a/src/reference/ai_poc/face_glasses/vi_vo.h b/src/reference/ai_poc/face_glasses/vi_vo.h index f0c1bccc5..0a11a4d31 100644 --- a/src/reference/ai_poc/face_glasses/vi_vo.h +++ b/src/reference/ai_poc/face_glasses/vi_vo.h @@ -57,7 +57,7 @@ #include "k_autoconf_comm.h" -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) #define SENSOR_CHANNEL (3) // isp通道数 #define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 #define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 @@ -286,7 +286,7 @@ static k_s32 sample_connector_init(void) { k_u32 ret = 0; k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; #else k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; @@ -378,7 +378,8 @@ int vivcap_start() #if defined(CONFIG_BOARD_K230_CANMV) sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; #else sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; #endif @@ -444,7 +445,7 @@ int vivcap_start() memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); dev_attr.acq_win.h_start = 0; dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) dev_attr.acq_win.width = ISP_CHN0_WIDTH; dev_attr.acq_win.height = ISP_CHN0_HEIGHT; #else @@ -476,7 +477,7 @@ int vivcap_start() chn_attr.out_win.height = ISP_CHN0_HEIGHT; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else // chn_attr.crop_win = dev_attr.acq_win; @@ -522,7 +523,7 @@ int vivcap_start() chn_attr.out_win.height = SENSOR_HEIGHT; // chn_attr.crop_win = dev_attr.acq_win; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else chn_attr.crop_win.h_start = 768; diff --git a/src/reference/ai_poc/face_landmark/vi_vo.h b/src/reference/ai_poc/face_landmark/vi_vo.h index f0c1bccc5..0a11a4d31 100644 --- a/src/reference/ai_poc/face_landmark/vi_vo.h +++ b/src/reference/ai_poc/face_landmark/vi_vo.h @@ -57,7 +57,7 @@ #include "k_autoconf_comm.h" -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) #define SENSOR_CHANNEL (3) // isp通道数 #define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 #define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 @@ -286,7 +286,7 @@ static k_s32 sample_connector_init(void) { k_u32 ret = 0; k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; #else k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; @@ -378,7 +378,8 @@ int vivcap_start() #if defined(CONFIG_BOARD_K230_CANMV) sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; #else sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; #endif @@ -444,7 +445,7 @@ int vivcap_start() memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); dev_attr.acq_win.h_start = 0; dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) dev_attr.acq_win.width = ISP_CHN0_WIDTH; dev_attr.acq_win.height = ISP_CHN0_HEIGHT; #else @@ -476,7 +477,7 @@ int vivcap_start() chn_attr.out_win.height = ISP_CHN0_HEIGHT; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else // chn_attr.crop_win = dev_attr.acq_win; @@ -522,7 +523,7 @@ int vivcap_start() chn_attr.out_win.height = SENSOR_HEIGHT; // chn_attr.crop_win = dev_attr.acq_win; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else chn_attr.crop_win.h_start = 768; diff --git a/src/reference/ai_poc/face_mask/vi_vo.h b/src/reference/ai_poc/face_mask/vi_vo.h index f0c1bccc5..0a11a4d31 100644 --- a/src/reference/ai_poc/face_mask/vi_vo.h +++ b/src/reference/ai_poc/face_mask/vi_vo.h @@ -57,7 +57,7 @@ #include "k_autoconf_comm.h" -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) #define SENSOR_CHANNEL (3) // isp通道数 #define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 #define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 @@ -286,7 +286,7 @@ static k_s32 sample_connector_init(void) { k_u32 ret = 0; k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; #else k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; @@ -378,7 +378,8 @@ int vivcap_start() #if defined(CONFIG_BOARD_K230_CANMV) sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; #else sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; #endif @@ -444,7 +445,7 @@ int vivcap_start() memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); dev_attr.acq_win.h_start = 0; dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) dev_attr.acq_win.width = ISP_CHN0_WIDTH; dev_attr.acq_win.height = ISP_CHN0_HEIGHT; #else @@ -476,7 +477,7 @@ int vivcap_start() chn_attr.out_win.height = ISP_CHN0_HEIGHT; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else // chn_attr.crop_win = dev_attr.acq_win; @@ -522,7 +523,7 @@ int vivcap_start() chn_attr.out_win.height = SENSOR_HEIGHT; // chn_attr.crop_win = dev_attr.acq_win; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else chn_attr.crop_win.h_start = 768; diff --git a/src/reference/ai_poc/face_mesh/vi_vo.h b/src/reference/ai_poc/face_mesh/vi_vo.h index f0c1bccc5..0a11a4d31 100644 --- a/src/reference/ai_poc/face_mesh/vi_vo.h +++ b/src/reference/ai_poc/face_mesh/vi_vo.h @@ -57,7 +57,7 @@ #include "k_autoconf_comm.h" -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) #define SENSOR_CHANNEL (3) // isp通道数 #define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 #define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 @@ -286,7 +286,7 @@ static k_s32 sample_connector_init(void) { k_u32 ret = 0; k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; #else k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; @@ -378,7 +378,8 @@ int vivcap_start() #if defined(CONFIG_BOARD_K230_CANMV) sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; #else sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; #endif @@ -444,7 +445,7 @@ int vivcap_start() memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); dev_attr.acq_win.h_start = 0; dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) dev_attr.acq_win.width = ISP_CHN0_WIDTH; dev_attr.acq_win.height = ISP_CHN0_HEIGHT; #else @@ -476,7 +477,7 @@ int vivcap_start() chn_attr.out_win.height = ISP_CHN0_HEIGHT; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else // chn_attr.crop_win = dev_attr.acq_win; @@ -522,7 +523,7 @@ int vivcap_start() chn_attr.out_win.height = SENSOR_HEIGHT; // chn_attr.crop_win = dev_attr.acq_win; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else chn_attr.crop_win.h_start = 768; diff --git a/src/reference/ai_poc/face_parse/vi_vo.h b/src/reference/ai_poc/face_parse/vi_vo.h index f0c1bccc5..0a11a4d31 100644 --- a/src/reference/ai_poc/face_parse/vi_vo.h +++ b/src/reference/ai_poc/face_parse/vi_vo.h @@ -57,7 +57,7 @@ #include "k_autoconf_comm.h" -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) #define SENSOR_CHANNEL (3) // isp通道数 #define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 #define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 @@ -286,7 +286,7 @@ static k_s32 sample_connector_init(void) { k_u32 ret = 0; k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; #else k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; @@ -378,7 +378,8 @@ int vivcap_start() #if defined(CONFIG_BOARD_K230_CANMV) sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; #else sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; #endif @@ -444,7 +445,7 @@ int vivcap_start() memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); dev_attr.acq_win.h_start = 0; dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) dev_attr.acq_win.width = ISP_CHN0_WIDTH; dev_attr.acq_win.height = ISP_CHN0_HEIGHT; #else @@ -476,7 +477,7 @@ int vivcap_start() chn_attr.out_win.height = ISP_CHN0_HEIGHT; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else // chn_attr.crop_win = dev_attr.acq_win; @@ -522,7 +523,7 @@ int vivcap_start() chn_attr.out_win.height = SENSOR_HEIGHT; // chn_attr.crop_win = dev_attr.acq_win; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else chn_attr.crop_win.h_start = 768; diff --git a/src/reference/ai_poc/face_pose/vi_vo.h b/src/reference/ai_poc/face_pose/vi_vo.h old mode 100755 new mode 100644 index f0c1bccc5..0a11a4d31 --- a/src/reference/ai_poc/face_pose/vi_vo.h +++ b/src/reference/ai_poc/face_pose/vi_vo.h @@ -57,7 +57,7 @@ #include "k_autoconf_comm.h" -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) #define SENSOR_CHANNEL (3) // isp通道数 #define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 #define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 @@ -286,7 +286,7 @@ static k_s32 sample_connector_init(void) { k_u32 ret = 0; k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; #else k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; @@ -378,7 +378,8 @@ int vivcap_start() #if defined(CONFIG_BOARD_K230_CANMV) sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; #else sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; #endif @@ -444,7 +445,7 @@ int vivcap_start() memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); dev_attr.acq_win.h_start = 0; dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) dev_attr.acq_win.width = ISP_CHN0_WIDTH; dev_attr.acq_win.height = ISP_CHN0_HEIGHT; #else @@ -476,7 +477,7 @@ int vivcap_start() chn_attr.out_win.height = ISP_CHN0_HEIGHT; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else // chn_attr.crop_win = dev_attr.acq_win; @@ -522,7 +523,7 @@ int vivcap_start() chn_attr.out_win.height = SENSOR_HEIGHT; // chn_attr.crop_win = dev_attr.acq_win; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else chn_attr.crop_win.h_start = 768; diff --git a/src/reference/ai_poc/face_verification/vi_vo.h b/src/reference/ai_poc/face_verification/vi_vo.h old mode 100755 new mode 100644 index f0c1bccc5..0a11a4d31 --- a/src/reference/ai_poc/face_verification/vi_vo.h +++ b/src/reference/ai_poc/face_verification/vi_vo.h @@ -57,7 +57,7 @@ #include "k_autoconf_comm.h" -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) #define SENSOR_CHANNEL (3) // isp通道数 #define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 #define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 @@ -286,7 +286,7 @@ static k_s32 sample_connector_init(void) { k_u32 ret = 0; k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; #else k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; @@ -378,7 +378,8 @@ int vivcap_start() #if defined(CONFIG_BOARD_K230_CANMV) sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; #else sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; #endif @@ -444,7 +445,7 @@ int vivcap_start() memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); dev_attr.acq_win.h_start = 0; dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) dev_attr.acq_win.width = ISP_CHN0_WIDTH; dev_attr.acq_win.height = ISP_CHN0_HEIGHT; #else @@ -476,7 +477,7 @@ int vivcap_start() chn_attr.out_win.height = ISP_CHN0_HEIGHT; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else // chn_attr.crop_win = dev_attr.acq_win; @@ -522,7 +523,7 @@ int vivcap_start() chn_attr.out_win.height = SENSOR_HEIGHT; // chn_attr.crop_win = dev_attr.acq_win; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else chn_attr.crop_win.h_start = 768; diff --git a/src/reference/ai_poc/falldown_detect/vi_vo.h b/src/reference/ai_poc/falldown_detect/vi_vo.h index e3d8bdba4..0a11a4d31 100644 --- a/src/reference/ai_poc/falldown_detect/vi_vo.h +++ b/src/reference/ai_poc/falldown_detect/vi_vo.h @@ -1,627 +1,628 @@ -/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include -#include -#include - -#include "mpi_sys_api.h" - -/* vicap */ -#include -#include -#include -#include -#include - -#include "k_module.h" -#include "k_type.h" -#include "k_vb_comm.h" -#include "k_video_comm.h" -#include "k_sys_comm.h" -#include "mpi_vb_api.h" -#include "mpi_vicap_api.h" -#include "mpi_isp_api.h" -#include "mpi_sys_api.h" -#include "k_vo_comm.h" -#include "mpi_vo_api.h" - -#include "vo_test_case.h" - -#include "k_connector_comm.h" -#include "mpi_connector_api.h" -#include "k_autoconf_comm.h" - - -#if defined(CONFIG_BOARD_K230_CANMV) -#define SENSOR_CHANNEL (3) // isp通道数 -#define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 -#define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 -#define ISP_CHN0_WIDTH (1920)//(1920) -#define ISP_CHN0_HEIGHT (1080)//(1080) -#define vicap_install_osd (1) -#define osd_id K_VO_OSD3 -#define osd_width (1920) -#define osd_height (1080) -#else -#define SENSOR_CHANNEL (3) // isp通道数 -#define SENSOR_HEIGHT (1280) // isp高度,ai输入,竖屏 -#define SENSOR_WIDTH (720) // isp宽度,ai输入,竖屏 -#define ISP_CHN0_WIDTH (1088)//(1920) -#define ISP_CHN0_HEIGHT (1920)//(1080) -#define vicap_install_osd (1) -#define osd_id K_VO_OSD3 -#define osd_width (1080) -#define osd_height (1920) -#endif - - -k_vb_config config; -k_vicap_dev vicap_dev; -k_vicap_chn vicap_chn; -k_vicap_dev_attr dev_attr; -k_vicap_chn_attr chn_attr; -k_vicap_sensor_info sensor_info; -k_vicap_sensor_type sensor_type; -k_mpp_chn vicap_mpp_chn; -k_mpp_chn vo_mpp_chn; - -k_video_frame_info dump_info; - -k_vo_draw_frame vo_frame = (k_vo_draw_frame) { - 1, - 16, - 16, - 128, - 128, - 1 -}; - -static k_vb_blk_handle block; -k_u32 g_pool_id; - -int vo_creat_layer_test(k_vo_layer chn_id, layer_info *info) -{ - k_vo_video_layer_attr attr; - - // check layer - if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) - || ((info->func != 0) && (chn_id == K_VO_LAYER2))) - { - printf("input layer num failed \n"); - return -1 ; - } - - // check scaler - - // set offset - attr.display_rect = info->offset; - // set act - attr.img_size = info->act_size; - // sget size - info->size = info->act_size.height * info->act_size.width * 3 / 2; - //set pixel format - attr.pixel_format = info->format; - if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) - { - printf("input pix format failed \n"); - return -1; - } - // set stride - attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); - // set function - attr.func = info->func; - // set scaler attr - attr.scaler_attr = info->attr; - - // set video layer atrr - kd_mpi_vo_set_video_layer_attr(chn_id, &attr); - - // enable layer - kd_mpi_vo_enable_video_layer(chn_id); - - return 0; -} - -k_vb_blk_handle vo_insert_frame(k_video_frame_info *vf_info, void **pic_vaddr) -{ - k_u64 phys_addr = 0; - k_u32 *virt_addr; - k_vb_blk_handle handle; - k_s32 size; - - if (vf_info == NULL) - return K_FALSE; - - if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_8888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_8888) - size = vf_info->v_frame.height * vf_info->v_frame.width * 4; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_565 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_565) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_4444 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_4444) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_888) - size = vf_info->v_frame.height * vf_info->v_frame.width * 3; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_1555 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_1555) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) - size = vf_info->v_frame.height * vf_info->v_frame.width * 3 / 2; - - size = size + 4096; // 强制4K ,后边得删了 - - printf("vb block size is %x \n", size); - - handle = kd_mpi_vb_get_block(g_pool_id, size, NULL); - if (handle == VB_INVALID_HANDLE) - { - printf("%s get vb block error\n", __func__); - return K_FAILED; - } - - phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); - if (phys_addr == 0) - { - printf("%s get phys addr error\n", __func__); - return K_FAILED; - } - - virt_addr = (k_u32 *)kd_mpi_sys_mmap(phys_addr, size); - // virt_addr = (k_u32 *)kd_mpi_sys_mmap_cached(phys_addr, size); - - if (virt_addr == NULL) - { - printf("%s mmap error\n", __func__); - return K_FAILED; - } - - vf_info->mod_id = K_ID_VO; - vf_info->pool_id = g_pool_id; - vf_info->v_frame.phys_addr[0] = phys_addr; - if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) - vf_info->v_frame.phys_addr[1] = phys_addr + (vf_info->v_frame.height * vf_info->v_frame.stride[0]); - *pic_vaddr = virt_addr; - - printf("phys_addr is %lx g_pool_id is %d \n", phys_addr, g_pool_id); - - return handle; -} - -k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) -{ - k_vo_video_osd_attr attr; - - // set attr - attr.global_alptha = info->global_alptha; - - if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) - { - info->size = info->act_size.width * info->act_size.height * 4; - info->stride = info->act_size.width * 4 / 8; - } - else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) - { - info->size = info->act_size.width * info->act_size.height * 3; - info->stride = info->act_size.width * 3 / 8; - } - else if(info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else if(info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else - { - printf("set osd pixel format failed \n"); - } - - attr.stride = info->stride; - attr.pixel_format = info->format; - attr.display_rect = info->offset; - attr.img_size = info->act_size; - kd_mpi_vo_set_video_osd_attr(osd, &attr); - - kd_mpi_vo_osd_enable(osd); - - return 0; -} - -void sample_vicap_install_osd(void) -{ - osd_info osd; - - osd.act_size.width = osd_width ; - osd.act_size.height = osd_height; - osd.offset.x = 0; - osd.offset.y = 0; - osd.global_alptha = 0xff; - // osd.global_alptha = 0x32; - osd.format = PIXEL_FORMAT_ARGB_8888;//PIXEL_FORMAT_ARGB_4444; //PIXEL_FORMAT_ARGB_1555;//PIXEL_FORMAT_ARGB_8888; - - vo_creat_osd_test(osd_id, &osd); -} - -void vo_osd_release_block(void) -{ - if(vicap_install_osd == 1) - { - kd_mpi_vo_osd_disable(osd_id); - kd_mpi_vb_release_block(block); - } - -} - -static k_s32 sample_connector_init(void) -{ - k_u32 ret = 0; - k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) - k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; -#else - k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; -#endif - k_connector_info connector_info; - - memset(&connector_info, 0, sizeof(k_connector_info)); - - //connector get sensor info - ret = kd_mpi_get_connector_info(connector_type, &connector_info); - if (ret) { - printf("sample_vicap, the sensor type not supported!\n"); - return ret; - } - - connector_fd = kd_mpi_connector_open(connector_info.connector_name); - if (connector_fd < 0) { - printf("%s, connector open failed.\n", __func__); - return K_ERR_VO_NOTREADY; - } - - // set connect power - kd_mpi_connector_power_set(connector_fd, K_TRUE); - // connector init - kd_mpi_connector_init(connector_fd, connector_info); - - return 0; -} - -static k_s32 vo_layer_vdss_bind_vo_config(void) -{ - layer_info info; - - k_vo_layer chn_id = K_VO_LAYER1; - - memset(&info, 0, sizeof(info)); - - sample_connector_init(); - - // config lyaer - info.act_size.width = ISP_CHN0_WIDTH;//ISP_CHN0_HEIGHT;//1080;//640;//1080; - info.act_size.height = ISP_CHN0_HEIGHT;//ISP_CHN0_WIDTH;//1920;//480;//1920; - info.format = PIXEL_FORMAT_YVU_PLANAR_420; - info.func = 0;//K_ROTATION_180;////K_ROTATION_90; - info.global_alptha = 0xff; - info.offset.x = 0;//(1080-w)/2, - info.offset.y = 0;//(1920-h)/2; - vo_creat_layer_test(chn_id, &info); - - if(vicap_install_osd == 1) - sample_vicap_install_osd(); - - //exit ; - return 0; -} - -static void sample_vicap_bind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) -{ - k_s32 ret; - - ret = kd_mpi_sys_bind(&vicap_mpp_chn, &vo_mpp_chn); - if (ret) { - printf("kd_mpi_sys_unbind failed:0x%x\n", ret); - } - - return; -} - -static void sample_vicap_unbind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) -{ - k_s32 ret; - - ret = kd_mpi_sys_unbind(&vicap_mpp_chn, &vo_mpp_chn); - if (ret) { - printf("kd_mpi_sys_unbind failed:0x%x\n", ret); - } - - return; -} - -int vivcap_start() -{ - k_s32 ret = 0; - - k_u32 pool_id; - k_vb_pool_config pool_config; - - printf("sample_vicap ...\n"); - -#if defined(CONFIG_BOARD_K230_CANMV) - sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); -#else - sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; -#endif - vicap_dev = VICAP_DEV_ID_0; - - memset(&config, 0, sizeof(config)); - config.max_pool_cnt = 64; - //VB for YUV420SP output - config.comm_pool[0].blk_cnt = 5; - config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; - config.comm_pool[0].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), VICAP_ALIGN_1K); - - //VB for RGB888 output - config.comm_pool[1].blk_cnt = 5; - config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; - config.comm_pool[1].blk_size = VICAP_ALIGN_UP((SENSOR_HEIGHT * SENSOR_WIDTH * 3 ), VICAP_ALIGN_1K); - - ret = kd_mpi_vb_set_config(&config); - if (ret) { - printf("vb_set_config failed ret:%d\n", ret); - return ret; - } - - k_vb_supplement_config supplement_config; - memset(&supplement_config, 0, sizeof(supplement_config)); - supplement_config.supplement_config |= VB_SUPPLEMENT_JPEG_MASK; - - ret = kd_mpi_vb_set_supplement_config(&supplement_config); - if (ret) { - printf("vb_set_supplement_config failed ret:%d\n", ret); - return ret; - } - - ret = kd_mpi_vb_init(); - if (ret) { - printf("vb_init failed ret:%d\n", ret); - return ret; - } - printf("sample_vicap ...kd_mpi_vicap_get_sensor_info\n"); - - // dwc_dsi_init(); - vo_layer_vdss_bind_vo_config(); - - if(vicap_install_osd == 1) - { - memset(&pool_config, 0, sizeof(pool_config)); - pool_config.blk_size = VICAP_ALIGN_UP((osd_width * osd_height * 4 * 2), VICAP_ALIGN_1K); - pool_config.blk_cnt = 4; - pool_config.mode = VB_REMAP_MODE_NOCACHE; - pool_id = kd_mpi_vb_create_pool(&pool_config); // osd0 - 3 argb 320 x 240 - g_pool_id = pool_id; - - printf("--------aa--------------g_pool_id is %d pool_id is %d \n",g_pool_id, pool_id); - } - - memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); - ret = kd_mpi_vicap_get_sensor_info(sensor_type, &sensor_info); - if (ret) { - printf("sample_vicap, the sensor type not supported!\n"); - return ret; - } - - memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); - dev_attr.acq_win.h_start = 0; - dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) - dev_attr.acq_win.width = ISP_CHN0_WIDTH; - dev_attr.acq_win.height = ISP_CHN0_HEIGHT; -#else - dev_attr.acq_win.width = 2592;//SENSOR_HEIGHT; - dev_attr.acq_win.height = 1944;//SENSOR_WIDTH; -#endif - dev_attr.mode = VICAP_WORK_ONLINE_MODE; - - dev_attr.pipe_ctrl.data = 0xFFFFFFFF; - dev_attr.pipe_ctrl.bits.af_enable = 0; - dev_attr.pipe_ctrl.bits.ahdr_enable = 0; - - - dev_attr.cpature_frame = 0; - memcpy(&dev_attr.sensor_info, &sensor_info, sizeof(k_vicap_sensor_info)); - - ret = kd_mpi_vicap_set_dev_attr(vicap_dev, dev_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_dev_attr failed.\n"); - return ret; - } - - memset(&chn_attr, 0, sizeof(k_vicap_chn_attr)); - - //set chn0 output yuv420sp - chn_attr.out_win.h_start = 0; - chn_attr.out_win.v_start = 0; - chn_attr.out_win.width = ISP_CHN0_WIDTH; - chn_attr.out_win.height = ISP_CHN0_HEIGHT; - - -#if defined(CONFIG_BOARD_K230_CANMV) - chn_attr.crop_win = dev_attr.acq_win; -#else - // chn_attr.crop_win = dev_attr.acq_win; - chn_attr.crop_win.h_start = 768; - chn_attr.crop_win.v_start = 16; - chn_attr.crop_win.width = ISP_CHN0_WIDTH; - chn_attr.crop_win.height = ISP_CHN0_HEIGHT; -#endif - - chn_attr.scale_win = chn_attr.out_win; - chn_attr.crop_enable = K_FALSE; - chn_attr.scale_enable = K_FALSE; - // chn_attr.dw_enable = K_FALSE; - chn_attr.chn_enable = K_TRUE; - chn_attr.pix_format = PIXEL_FORMAT_YVU_PLANAR_420; - chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp - chn_attr.buffer_size = config.comm_pool[0].blk_size; - vicap_chn = VICAP_CHN_ID_0; - - printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); - ret = kd_mpi_vicap_set_chn_attr(vicap_dev, vicap_chn, chn_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); - return ret; - } - - //bind vicap chn 0 to vo - vicap_mpp_chn.mod_id = K_ID_VI; - vicap_mpp_chn.dev_id = vicap_dev; - vicap_mpp_chn.chn_id = vicap_chn; - - vo_mpp_chn.mod_id = K_ID_VO; - vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; - vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; - - sample_vicap_bind_vo(vicap_mpp_chn, vo_mpp_chn); - printf("sample_vicap ...dwc_dsi_init\n"); - - //set chn1 output rgb888p - chn_attr.out_win.h_start = 0; - chn_attr.out_win.v_start = 0; - chn_attr.out_win.width = SENSOR_WIDTH ; - chn_attr.out_win.height = SENSOR_HEIGHT; - // chn_attr.crop_win = dev_attr.acq_win; - -#if defined(CONFIG_BOARD_K230_CANMV) - chn_attr.crop_win = dev_attr.acq_win; -#else - chn_attr.crop_win.h_start = 768; - chn_attr.crop_win.v_start = 16; - chn_attr.crop_win.width = ISP_CHN0_WIDTH; - chn_attr.crop_win.height = ISP_CHN0_HEIGHT; -#endif - - chn_attr.scale_win = chn_attr.out_win; - chn_attr.crop_enable = K_FALSE; - chn_attr.scale_enable = K_FALSE; - // chn_attr.dw_enable = K_FALSE; - chn_attr.chn_enable = K_TRUE; - chn_attr.pix_format = PIXEL_FORMAT_BGR_888_PLANAR; - chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp - chn_attr.buffer_size = config.comm_pool[1].blk_size; - - printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); - ret = kd_mpi_vicap_set_chn_attr(vicap_dev, VICAP_CHN_ID_1, chn_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); - return ret; - } - - printf("sample_vicap ...kd_mpi_vicap_init\n"); - ret = kd_mpi_vicap_init(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - // goto err_exit; - } - - printf("sample_vicap ...kd_mpi_vicap_start_stream\n"); - ret = kd_mpi_vicap_start_stream(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - // goto err_exit; - } - - return ret; -} - -int vivcap_stop() -{ - printf("sample_vicap ...kd_mpi_vicap_stop_stream\n"); - int ret = kd_mpi_vicap_stop_stream(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - return ret; - } - - ret = kd_mpi_vicap_deinit(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_deinit failed.\n"); - return ret; - } - - kd_mpi_vo_disable_video_layer(K_VO_LAYER1); - - vicap_mpp_chn.mod_id = K_ID_VI; - vicap_mpp_chn.dev_id = vicap_dev; - vicap_mpp_chn.chn_id = vicap_chn; - - vo_mpp_chn.mod_id = K_ID_VO; - vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; - vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; - - sample_vicap_unbind_vo(vicap_mpp_chn, vo_mpp_chn); - - /*Allow one frame time for the VO to release the VB block*/ - k_u32 display_ms = 1000 / 33; - usleep(1000 * display_ms); - - ret = kd_mpi_vb_exit(); - if (ret) { - printf("sample_vicap, kd_mpi_vb_exit failed.\n"); - return ret; - } - - return 0; -} - -void yuv_rotate_90(char *des, char *src,int width,int height) -{ - int n = 0; - int hw = width>>1; - int hh = height>>1; - int size = width * height; - int hsize = size>>2; - - int pos = 0; - - for(int i = width-1;i >= 0;i--) - { - pos = 0; - for(int j= 0;j < height;j++) - { - des[n++]= src[pos+i]; - pos += width; - } - } - +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include + +#include "mpi_sys_api.h" + +/* vicap */ +#include +#include +#include +#include +#include + +#include "k_module.h" +#include "k_type.h" +#include "k_vb_comm.h" +#include "k_video_comm.h" +#include "k_sys_comm.h" +#include "mpi_vb_api.h" +#include "mpi_vicap_api.h" +#include "mpi_isp_api.h" +#include "mpi_sys_api.h" +#include "k_vo_comm.h" +#include "mpi_vo_api.h" + +#include "vo_test_case.h" + +#include "k_connector_comm.h" +#include "mpi_connector_api.h" +#include "k_autoconf_comm.h" + + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) +#define SENSOR_CHANNEL (3) // isp通道数 +#define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 +#define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 +#define ISP_CHN0_WIDTH (1920)//(1920) +#define ISP_CHN0_HEIGHT (1080)//(1080) +#define vicap_install_osd (1) +#define osd_id K_VO_OSD3 +#define osd_width (1920) +#define osd_height (1080) +#else +#define SENSOR_CHANNEL (3) // isp通道数 +#define SENSOR_HEIGHT (1280) // isp高度,ai输入,竖屏 +#define SENSOR_WIDTH (720) // isp宽度,ai输入,竖屏 +#define ISP_CHN0_WIDTH (1088)//(1920) +#define ISP_CHN0_HEIGHT (1920)//(1080) +#define vicap_install_osd (1) +#define osd_id K_VO_OSD3 +#define osd_width (1080) +#define osd_height (1920) +#endif + + +k_vb_config config; +k_vicap_dev vicap_dev; +k_vicap_chn vicap_chn; +k_vicap_dev_attr dev_attr; +k_vicap_chn_attr chn_attr; +k_vicap_sensor_info sensor_info; +k_vicap_sensor_type sensor_type; +k_mpp_chn vicap_mpp_chn; +k_mpp_chn vo_mpp_chn; + +k_video_frame_info dump_info; + +k_vo_draw_frame vo_frame = (k_vo_draw_frame) { + 1, + 16, + 16, + 128, + 128, + 1 +}; + +static k_vb_blk_handle block; +k_u32 g_pool_id; + +int vo_creat_layer_test(k_vo_layer chn_id, layer_info *info) +{ + k_vo_video_layer_attr attr; + + // check layer + if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) + || ((info->func != 0) && (chn_id == K_VO_LAYER2))) + { + printf("input layer num failed \n"); + return -1 ; + } + + // check scaler + + // set offset + attr.display_rect = info->offset; + // set act + attr.img_size = info->act_size; + // sget size + info->size = info->act_size.height * info->act_size.width * 3 / 2; + //set pixel format + attr.pixel_format = info->format; + if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) + { + printf("input pix format failed \n"); + return -1; + } + // set stride + attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); + // set function + attr.func = info->func; + // set scaler attr + attr.scaler_attr = info->attr; + + // set video layer atrr + kd_mpi_vo_set_video_layer_attr(chn_id, &attr); + + // enable layer + kd_mpi_vo_enable_video_layer(chn_id); + + return 0; +} + +k_vb_blk_handle vo_insert_frame(k_video_frame_info *vf_info, void **pic_vaddr) +{ + k_u64 phys_addr = 0; + k_u32 *virt_addr; + k_vb_blk_handle handle; + k_s32 size; + + if (vf_info == NULL) + return K_FALSE; + + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_8888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_8888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 4; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_565 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_565) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_4444 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_4444) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_1555 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_1555) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3 / 2; + + size = size + 4096; // 强制4K ,后边得删了 + + printf("vb block size is %x \n", size); + + handle = kd_mpi_vb_get_block(g_pool_id, size, NULL); + if (handle == VB_INVALID_HANDLE) + { + printf("%s get vb block error\n", __func__); + return K_FAILED; + } + + phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); + if (phys_addr == 0) + { + printf("%s get phys addr error\n", __func__); + return K_FAILED; + } + + virt_addr = (k_u32 *)kd_mpi_sys_mmap(phys_addr, size); + // virt_addr = (k_u32 *)kd_mpi_sys_mmap_cached(phys_addr, size); + + if (virt_addr == NULL) + { + printf("%s mmap error\n", __func__); + return K_FAILED; + } + + vf_info->mod_id = K_ID_VO; + vf_info->pool_id = g_pool_id; + vf_info->v_frame.phys_addr[0] = phys_addr; + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + vf_info->v_frame.phys_addr[1] = phys_addr + (vf_info->v_frame.height * vf_info->v_frame.stride[0]); + *pic_vaddr = virt_addr; + + printf("phys_addr is %lx g_pool_id is %d \n", phys_addr, g_pool_id); + + return handle; +} + +k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) +{ + k_vo_video_osd_attr attr; + + // set attr + attr.global_alptha = info->global_alptha; + + if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) + { + info->size = info->act_size.width * info->act_size.height * 4; + info->stride = info->act_size.width * 4 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) + { + info->size = info->act_size.width * info->act_size.height * 3; + info->stride = info->act_size.width * 3 / 8; + } + else if(info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if(info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else + { + printf("set osd pixel format failed \n"); + } + + attr.stride = info->stride; + attr.pixel_format = info->format; + attr.display_rect = info->offset; + attr.img_size = info->act_size; + kd_mpi_vo_set_video_osd_attr(osd, &attr); + + kd_mpi_vo_osd_enable(osd); + + return 0; +} + +void sample_vicap_install_osd(void) +{ + osd_info osd; + + osd.act_size.width = osd_width ; + osd.act_size.height = osd_height; + osd.offset.x = 0; + osd.offset.y = 0; + osd.global_alptha = 0xff; + // osd.global_alptha = 0x32; + osd.format = PIXEL_FORMAT_ARGB_8888;//PIXEL_FORMAT_ARGB_4444; //PIXEL_FORMAT_ARGB_1555;//PIXEL_FORMAT_ARGB_8888; + + vo_creat_osd_test(osd_id, &osd); +} + +void vo_osd_release_block(void) +{ + if(vicap_install_osd == 1) + { + kd_mpi_vo_osd_disable(osd_id); + kd_mpi_vb_release_block(block); + } + +} + +static k_s32 sample_connector_init(void) +{ + k_u32 ret = 0; + k_s32 connector_fd; +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#else + k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#endif + k_connector_info connector_info; + + memset(&connector_info, 0, sizeof(k_connector_info)); + + //connector get sensor info + ret = kd_mpi_get_connector_info(connector_type, &connector_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + + connector_fd = kd_mpi_connector_open(connector_info.connector_name); + if (connector_fd < 0) { + printf("%s, connector open failed.\n", __func__); + return K_ERR_VO_NOTREADY; + } + + // set connect power + kd_mpi_connector_power_set(connector_fd, K_TRUE); + // connector init + kd_mpi_connector_init(connector_fd, connector_info); + + return 0; +} + +static k_s32 vo_layer_vdss_bind_vo_config(void) +{ + layer_info info; + + k_vo_layer chn_id = K_VO_LAYER1; + + memset(&info, 0, sizeof(info)); + + sample_connector_init(); + + // config lyaer + info.act_size.width = ISP_CHN0_WIDTH;//ISP_CHN0_HEIGHT;//1080;//640;//1080; + info.act_size.height = ISP_CHN0_HEIGHT;//ISP_CHN0_WIDTH;//1920;//480;//1920; + info.format = PIXEL_FORMAT_YVU_PLANAR_420; + info.func = 0;//K_ROTATION_180;////K_ROTATION_90; + info.global_alptha = 0xff; + info.offset.x = 0;//(1080-w)/2, + info.offset.y = 0;//(1920-h)/2; + vo_creat_layer_test(chn_id, &info); + + if(vicap_install_osd == 1) + sample_vicap_install_osd(); + + //exit ; + return 0; +} + +static void sample_vicap_bind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) +{ + k_s32 ret; + + ret = kd_mpi_sys_bind(&vicap_mpp_chn, &vo_mpp_chn); + if (ret) { + printf("kd_mpi_sys_unbind failed:0x%x\n", ret); + } + + return; +} + +static void sample_vicap_unbind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) +{ + k_s32 ret; + + ret = kd_mpi_sys_unbind(&vicap_mpp_chn, &vo_mpp_chn); + if (ret) { + printf("kd_mpi_sys_unbind failed:0x%x\n", ret); + } + + return; +} + +int vivcap_start() +{ + k_s32 ret = 0; + + k_u32 pool_id; + k_vb_pool_config pool_config; + + printf("sample_vicap ...\n"); + +#if defined(CONFIG_BOARD_K230_CANMV) + sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; +#else + sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; +#endif + vicap_dev = VICAP_DEV_ID_0; + + memset(&config, 0, sizeof(config)); + config.max_pool_cnt = 64; + //VB for YUV420SP output + config.comm_pool[0].blk_cnt = 5; + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[0].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), VICAP_ALIGN_1K); + + //VB for RGB888 output + config.comm_pool[1].blk_cnt = 5; + config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[1].blk_size = VICAP_ALIGN_UP((SENSOR_HEIGHT * SENSOR_WIDTH * 3 ), VICAP_ALIGN_1K); + + ret = kd_mpi_vb_set_config(&config); + if (ret) { + printf("vb_set_config failed ret:%d\n", ret); + return ret; + } + + k_vb_supplement_config supplement_config; + memset(&supplement_config, 0, sizeof(supplement_config)); + supplement_config.supplement_config |= VB_SUPPLEMENT_JPEG_MASK; + + ret = kd_mpi_vb_set_supplement_config(&supplement_config); + if (ret) { + printf("vb_set_supplement_config failed ret:%d\n", ret); + return ret; + } + + ret = kd_mpi_vb_init(); + if (ret) { + printf("vb_init failed ret:%d\n", ret); + return ret; + } + printf("sample_vicap ...kd_mpi_vicap_get_sensor_info\n"); + + // dwc_dsi_init(); + vo_layer_vdss_bind_vo_config(); + + if(vicap_install_osd == 1) + { + memset(&pool_config, 0, sizeof(pool_config)); + pool_config.blk_size = VICAP_ALIGN_UP((osd_width * osd_height * 4 * 2), VICAP_ALIGN_1K); + pool_config.blk_cnt = 4; + pool_config.mode = VB_REMAP_MODE_NOCACHE; + pool_id = kd_mpi_vb_create_pool(&pool_config); // osd0 - 3 argb 320 x 240 + g_pool_id = pool_id; + + printf("--------aa--------------g_pool_id is %d pool_id is %d \n",g_pool_id, pool_id); + } + + memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); + ret = kd_mpi_vicap_get_sensor_info(sensor_type, &sensor_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + + memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); + dev_attr.acq_win.h_start = 0; + dev_attr.acq_win.v_start = 0; +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + dev_attr.acq_win.width = ISP_CHN0_WIDTH; + dev_attr.acq_win.height = ISP_CHN0_HEIGHT; +#else + dev_attr.acq_win.width = 2592;//SENSOR_HEIGHT; + dev_attr.acq_win.height = 1944;//SENSOR_WIDTH; +#endif + dev_attr.mode = VICAP_WORK_ONLINE_MODE; + + dev_attr.pipe_ctrl.data = 0xFFFFFFFF; + dev_attr.pipe_ctrl.bits.af_enable = 0; + dev_attr.pipe_ctrl.bits.ahdr_enable = 0; + + + dev_attr.cpature_frame = 0; + memcpy(&dev_attr.sensor_info, &sensor_info, sizeof(k_vicap_sensor_info)); + + ret = kd_mpi_vicap_set_dev_attr(vicap_dev, dev_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_dev_attr failed.\n"); + return ret; + } + + memset(&chn_attr, 0, sizeof(k_vicap_chn_attr)); + + //set chn0 output yuv420sp + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = ISP_CHN0_WIDTH; + chn_attr.out_win.height = ISP_CHN0_HEIGHT; + + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + chn_attr.crop_win = dev_attr.acq_win; +#else + // chn_attr.crop_win = dev_attr.acq_win; + chn_attr.crop_win.h_start = 768; + chn_attr.crop_win.v_start = 16; + chn_attr.crop_win.width = ISP_CHN0_WIDTH; + chn_attr.crop_win.height = ISP_CHN0_HEIGHT; +#endif + + chn_attr.scale_win = chn_attr.out_win; + chn_attr.crop_enable = K_FALSE; + chn_attr.scale_enable = K_FALSE; + // chn_attr.dw_enable = K_FALSE; + chn_attr.chn_enable = K_TRUE; + chn_attr.pix_format = PIXEL_FORMAT_YVU_PLANAR_420; + chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp + chn_attr.buffer_size = config.comm_pool[0].blk_size; + vicap_chn = VICAP_CHN_ID_0; + + printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); + ret = kd_mpi_vicap_set_chn_attr(vicap_dev, vicap_chn, chn_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); + return ret; + } + + //bind vicap chn 0 to vo + vicap_mpp_chn.mod_id = K_ID_VI; + vicap_mpp_chn.dev_id = vicap_dev; + vicap_mpp_chn.chn_id = vicap_chn; + + vo_mpp_chn.mod_id = K_ID_VO; + vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; + vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; + + sample_vicap_bind_vo(vicap_mpp_chn, vo_mpp_chn); + printf("sample_vicap ...dwc_dsi_init\n"); + + //set chn1 output rgb888p + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = SENSOR_WIDTH ; + chn_attr.out_win.height = SENSOR_HEIGHT; + // chn_attr.crop_win = dev_attr.acq_win; + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + chn_attr.crop_win = dev_attr.acq_win; +#else + chn_attr.crop_win.h_start = 768; + chn_attr.crop_win.v_start = 16; + chn_attr.crop_win.width = ISP_CHN0_WIDTH; + chn_attr.crop_win.height = ISP_CHN0_HEIGHT; +#endif + + chn_attr.scale_win = chn_attr.out_win; + chn_attr.crop_enable = K_FALSE; + chn_attr.scale_enable = K_FALSE; + // chn_attr.dw_enable = K_FALSE; + chn_attr.chn_enable = K_TRUE; + chn_attr.pix_format = PIXEL_FORMAT_BGR_888_PLANAR; + chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp + chn_attr.buffer_size = config.comm_pool[1].blk_size; + + printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); + ret = kd_mpi_vicap_set_chn_attr(vicap_dev, VICAP_CHN_ID_1, chn_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); + return ret; + } + + printf("sample_vicap ...kd_mpi_vicap_init\n"); + ret = kd_mpi_vicap_init(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + // goto err_exit; + } + + printf("sample_vicap ...kd_mpi_vicap_start_stream\n"); + ret = kd_mpi_vicap_start_stream(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + // goto err_exit; + } + + return ret; +} + +int vivcap_stop() +{ + printf("sample_vicap ...kd_mpi_vicap_stop_stream\n"); + int ret = kd_mpi_vicap_stop_stream(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + return ret; + } + + ret = kd_mpi_vicap_deinit(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_deinit failed.\n"); + return ret; + } + + kd_mpi_vo_disable_video_layer(K_VO_LAYER1); + + vicap_mpp_chn.mod_id = K_ID_VI; + vicap_mpp_chn.dev_id = vicap_dev; + vicap_mpp_chn.chn_id = vicap_chn; + + vo_mpp_chn.mod_id = K_ID_VO; + vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; + vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; + + sample_vicap_unbind_vo(vicap_mpp_chn, vo_mpp_chn); + + /*Allow one frame time for the VO to release the VB block*/ + k_u32 display_ms = 1000 / 33; + usleep(1000 * display_ms); + + ret = kd_mpi_vb_exit(); + if (ret) { + printf("sample_vicap, kd_mpi_vb_exit failed.\n"); + return ret; + } + + return 0; +} + +void yuv_rotate_90(char *des, char *src,int width,int height) +{ + int n = 0; + int hw = width>>1; + int hh = height>>1; + int size = width * height; + int hsize = size>>2; + + int pos = 0; + + for(int i = width-1;i >= 0;i--) + { + pos = 0; + for(int j= 0;j < height;j++) + { + des[n++]= src[pos+i]; + pos += width; + } + } + } \ No newline at end of file diff --git a/src/reference/ai_poc/finger_guessing/vi_vo.h b/src/reference/ai_poc/finger_guessing/vi_vo.h index f0c1bccc5..0a11a4d31 100644 --- a/src/reference/ai_poc/finger_guessing/vi_vo.h +++ b/src/reference/ai_poc/finger_guessing/vi_vo.h @@ -57,7 +57,7 @@ #include "k_autoconf_comm.h" -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) #define SENSOR_CHANNEL (3) // isp通道数 #define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 #define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 @@ -286,7 +286,7 @@ static k_s32 sample_connector_init(void) { k_u32 ret = 0; k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; #else k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; @@ -378,7 +378,8 @@ int vivcap_start() #if defined(CONFIG_BOARD_K230_CANMV) sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; #else sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; #endif @@ -444,7 +445,7 @@ int vivcap_start() memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); dev_attr.acq_win.h_start = 0; dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) dev_attr.acq_win.width = ISP_CHN0_WIDTH; dev_attr.acq_win.height = ISP_CHN0_HEIGHT; #else @@ -476,7 +477,7 @@ int vivcap_start() chn_attr.out_win.height = ISP_CHN0_HEIGHT; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else // chn_attr.crop_win = dev_attr.acq_win; @@ -522,7 +523,7 @@ int vivcap_start() chn_attr.out_win.height = SENSOR_HEIGHT; // chn_attr.crop_win = dev_attr.acq_win; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else chn_attr.crop_win.h_start = 768; diff --git a/src/reference/ai_poc/fitness/vi_vo.h b/src/reference/ai_poc/fitness/vi_vo.h index e3d8bdba4..0a11a4d31 100644 --- a/src/reference/ai_poc/fitness/vi_vo.h +++ b/src/reference/ai_poc/fitness/vi_vo.h @@ -1,627 +1,628 @@ -/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include -#include -#include - -#include "mpi_sys_api.h" - -/* vicap */ -#include -#include -#include -#include -#include - -#include "k_module.h" -#include "k_type.h" -#include "k_vb_comm.h" -#include "k_video_comm.h" -#include "k_sys_comm.h" -#include "mpi_vb_api.h" -#include "mpi_vicap_api.h" -#include "mpi_isp_api.h" -#include "mpi_sys_api.h" -#include "k_vo_comm.h" -#include "mpi_vo_api.h" - -#include "vo_test_case.h" - -#include "k_connector_comm.h" -#include "mpi_connector_api.h" -#include "k_autoconf_comm.h" - - -#if defined(CONFIG_BOARD_K230_CANMV) -#define SENSOR_CHANNEL (3) // isp通道数 -#define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 -#define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 -#define ISP_CHN0_WIDTH (1920)//(1920) -#define ISP_CHN0_HEIGHT (1080)//(1080) -#define vicap_install_osd (1) -#define osd_id K_VO_OSD3 -#define osd_width (1920) -#define osd_height (1080) -#else -#define SENSOR_CHANNEL (3) // isp通道数 -#define SENSOR_HEIGHT (1280) // isp高度,ai输入,竖屏 -#define SENSOR_WIDTH (720) // isp宽度,ai输入,竖屏 -#define ISP_CHN0_WIDTH (1088)//(1920) -#define ISP_CHN0_HEIGHT (1920)//(1080) -#define vicap_install_osd (1) -#define osd_id K_VO_OSD3 -#define osd_width (1080) -#define osd_height (1920) -#endif - - -k_vb_config config; -k_vicap_dev vicap_dev; -k_vicap_chn vicap_chn; -k_vicap_dev_attr dev_attr; -k_vicap_chn_attr chn_attr; -k_vicap_sensor_info sensor_info; -k_vicap_sensor_type sensor_type; -k_mpp_chn vicap_mpp_chn; -k_mpp_chn vo_mpp_chn; - -k_video_frame_info dump_info; - -k_vo_draw_frame vo_frame = (k_vo_draw_frame) { - 1, - 16, - 16, - 128, - 128, - 1 -}; - -static k_vb_blk_handle block; -k_u32 g_pool_id; - -int vo_creat_layer_test(k_vo_layer chn_id, layer_info *info) -{ - k_vo_video_layer_attr attr; - - // check layer - if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) - || ((info->func != 0) && (chn_id == K_VO_LAYER2))) - { - printf("input layer num failed \n"); - return -1 ; - } - - // check scaler - - // set offset - attr.display_rect = info->offset; - // set act - attr.img_size = info->act_size; - // sget size - info->size = info->act_size.height * info->act_size.width * 3 / 2; - //set pixel format - attr.pixel_format = info->format; - if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) - { - printf("input pix format failed \n"); - return -1; - } - // set stride - attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); - // set function - attr.func = info->func; - // set scaler attr - attr.scaler_attr = info->attr; - - // set video layer atrr - kd_mpi_vo_set_video_layer_attr(chn_id, &attr); - - // enable layer - kd_mpi_vo_enable_video_layer(chn_id); - - return 0; -} - -k_vb_blk_handle vo_insert_frame(k_video_frame_info *vf_info, void **pic_vaddr) -{ - k_u64 phys_addr = 0; - k_u32 *virt_addr; - k_vb_blk_handle handle; - k_s32 size; - - if (vf_info == NULL) - return K_FALSE; - - if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_8888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_8888) - size = vf_info->v_frame.height * vf_info->v_frame.width * 4; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_565 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_565) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_4444 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_4444) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_888) - size = vf_info->v_frame.height * vf_info->v_frame.width * 3; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_1555 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_1555) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) - size = vf_info->v_frame.height * vf_info->v_frame.width * 3 / 2; - - size = size + 4096; // 强制4K ,后边得删了 - - printf("vb block size is %x \n", size); - - handle = kd_mpi_vb_get_block(g_pool_id, size, NULL); - if (handle == VB_INVALID_HANDLE) - { - printf("%s get vb block error\n", __func__); - return K_FAILED; - } - - phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); - if (phys_addr == 0) - { - printf("%s get phys addr error\n", __func__); - return K_FAILED; - } - - virt_addr = (k_u32 *)kd_mpi_sys_mmap(phys_addr, size); - // virt_addr = (k_u32 *)kd_mpi_sys_mmap_cached(phys_addr, size); - - if (virt_addr == NULL) - { - printf("%s mmap error\n", __func__); - return K_FAILED; - } - - vf_info->mod_id = K_ID_VO; - vf_info->pool_id = g_pool_id; - vf_info->v_frame.phys_addr[0] = phys_addr; - if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) - vf_info->v_frame.phys_addr[1] = phys_addr + (vf_info->v_frame.height * vf_info->v_frame.stride[0]); - *pic_vaddr = virt_addr; - - printf("phys_addr is %lx g_pool_id is %d \n", phys_addr, g_pool_id); - - return handle; -} - -k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) -{ - k_vo_video_osd_attr attr; - - // set attr - attr.global_alptha = info->global_alptha; - - if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) - { - info->size = info->act_size.width * info->act_size.height * 4; - info->stride = info->act_size.width * 4 / 8; - } - else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) - { - info->size = info->act_size.width * info->act_size.height * 3; - info->stride = info->act_size.width * 3 / 8; - } - else if(info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else if(info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else - { - printf("set osd pixel format failed \n"); - } - - attr.stride = info->stride; - attr.pixel_format = info->format; - attr.display_rect = info->offset; - attr.img_size = info->act_size; - kd_mpi_vo_set_video_osd_attr(osd, &attr); - - kd_mpi_vo_osd_enable(osd); - - return 0; -} - -void sample_vicap_install_osd(void) -{ - osd_info osd; - - osd.act_size.width = osd_width ; - osd.act_size.height = osd_height; - osd.offset.x = 0; - osd.offset.y = 0; - osd.global_alptha = 0xff; - // osd.global_alptha = 0x32; - osd.format = PIXEL_FORMAT_ARGB_8888;//PIXEL_FORMAT_ARGB_4444; //PIXEL_FORMAT_ARGB_1555;//PIXEL_FORMAT_ARGB_8888; - - vo_creat_osd_test(osd_id, &osd); -} - -void vo_osd_release_block(void) -{ - if(vicap_install_osd == 1) - { - kd_mpi_vo_osd_disable(osd_id); - kd_mpi_vb_release_block(block); - } - -} - -static k_s32 sample_connector_init(void) -{ - k_u32 ret = 0; - k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) - k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; -#else - k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; -#endif - k_connector_info connector_info; - - memset(&connector_info, 0, sizeof(k_connector_info)); - - //connector get sensor info - ret = kd_mpi_get_connector_info(connector_type, &connector_info); - if (ret) { - printf("sample_vicap, the sensor type not supported!\n"); - return ret; - } - - connector_fd = kd_mpi_connector_open(connector_info.connector_name); - if (connector_fd < 0) { - printf("%s, connector open failed.\n", __func__); - return K_ERR_VO_NOTREADY; - } - - // set connect power - kd_mpi_connector_power_set(connector_fd, K_TRUE); - // connector init - kd_mpi_connector_init(connector_fd, connector_info); - - return 0; -} - -static k_s32 vo_layer_vdss_bind_vo_config(void) -{ - layer_info info; - - k_vo_layer chn_id = K_VO_LAYER1; - - memset(&info, 0, sizeof(info)); - - sample_connector_init(); - - // config lyaer - info.act_size.width = ISP_CHN0_WIDTH;//ISP_CHN0_HEIGHT;//1080;//640;//1080; - info.act_size.height = ISP_CHN0_HEIGHT;//ISP_CHN0_WIDTH;//1920;//480;//1920; - info.format = PIXEL_FORMAT_YVU_PLANAR_420; - info.func = 0;//K_ROTATION_180;////K_ROTATION_90; - info.global_alptha = 0xff; - info.offset.x = 0;//(1080-w)/2, - info.offset.y = 0;//(1920-h)/2; - vo_creat_layer_test(chn_id, &info); - - if(vicap_install_osd == 1) - sample_vicap_install_osd(); - - //exit ; - return 0; -} - -static void sample_vicap_bind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) -{ - k_s32 ret; - - ret = kd_mpi_sys_bind(&vicap_mpp_chn, &vo_mpp_chn); - if (ret) { - printf("kd_mpi_sys_unbind failed:0x%x\n", ret); - } - - return; -} - -static void sample_vicap_unbind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) -{ - k_s32 ret; - - ret = kd_mpi_sys_unbind(&vicap_mpp_chn, &vo_mpp_chn); - if (ret) { - printf("kd_mpi_sys_unbind failed:0x%x\n", ret); - } - - return; -} - -int vivcap_start() -{ - k_s32 ret = 0; - - k_u32 pool_id; - k_vb_pool_config pool_config; - - printf("sample_vicap ...\n"); - -#if defined(CONFIG_BOARD_K230_CANMV) - sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); -#else - sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; -#endif - vicap_dev = VICAP_DEV_ID_0; - - memset(&config, 0, sizeof(config)); - config.max_pool_cnt = 64; - //VB for YUV420SP output - config.comm_pool[0].blk_cnt = 5; - config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; - config.comm_pool[0].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), VICAP_ALIGN_1K); - - //VB for RGB888 output - config.comm_pool[1].blk_cnt = 5; - config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; - config.comm_pool[1].blk_size = VICAP_ALIGN_UP((SENSOR_HEIGHT * SENSOR_WIDTH * 3 ), VICAP_ALIGN_1K); - - ret = kd_mpi_vb_set_config(&config); - if (ret) { - printf("vb_set_config failed ret:%d\n", ret); - return ret; - } - - k_vb_supplement_config supplement_config; - memset(&supplement_config, 0, sizeof(supplement_config)); - supplement_config.supplement_config |= VB_SUPPLEMENT_JPEG_MASK; - - ret = kd_mpi_vb_set_supplement_config(&supplement_config); - if (ret) { - printf("vb_set_supplement_config failed ret:%d\n", ret); - return ret; - } - - ret = kd_mpi_vb_init(); - if (ret) { - printf("vb_init failed ret:%d\n", ret); - return ret; - } - printf("sample_vicap ...kd_mpi_vicap_get_sensor_info\n"); - - // dwc_dsi_init(); - vo_layer_vdss_bind_vo_config(); - - if(vicap_install_osd == 1) - { - memset(&pool_config, 0, sizeof(pool_config)); - pool_config.blk_size = VICAP_ALIGN_UP((osd_width * osd_height * 4 * 2), VICAP_ALIGN_1K); - pool_config.blk_cnt = 4; - pool_config.mode = VB_REMAP_MODE_NOCACHE; - pool_id = kd_mpi_vb_create_pool(&pool_config); // osd0 - 3 argb 320 x 240 - g_pool_id = pool_id; - - printf("--------aa--------------g_pool_id is %d pool_id is %d \n",g_pool_id, pool_id); - } - - memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); - ret = kd_mpi_vicap_get_sensor_info(sensor_type, &sensor_info); - if (ret) { - printf("sample_vicap, the sensor type not supported!\n"); - return ret; - } - - memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); - dev_attr.acq_win.h_start = 0; - dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) - dev_attr.acq_win.width = ISP_CHN0_WIDTH; - dev_attr.acq_win.height = ISP_CHN0_HEIGHT; -#else - dev_attr.acq_win.width = 2592;//SENSOR_HEIGHT; - dev_attr.acq_win.height = 1944;//SENSOR_WIDTH; -#endif - dev_attr.mode = VICAP_WORK_ONLINE_MODE; - - dev_attr.pipe_ctrl.data = 0xFFFFFFFF; - dev_attr.pipe_ctrl.bits.af_enable = 0; - dev_attr.pipe_ctrl.bits.ahdr_enable = 0; - - - dev_attr.cpature_frame = 0; - memcpy(&dev_attr.sensor_info, &sensor_info, sizeof(k_vicap_sensor_info)); - - ret = kd_mpi_vicap_set_dev_attr(vicap_dev, dev_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_dev_attr failed.\n"); - return ret; - } - - memset(&chn_attr, 0, sizeof(k_vicap_chn_attr)); - - //set chn0 output yuv420sp - chn_attr.out_win.h_start = 0; - chn_attr.out_win.v_start = 0; - chn_attr.out_win.width = ISP_CHN0_WIDTH; - chn_attr.out_win.height = ISP_CHN0_HEIGHT; - - -#if defined(CONFIG_BOARD_K230_CANMV) - chn_attr.crop_win = dev_attr.acq_win; -#else - // chn_attr.crop_win = dev_attr.acq_win; - chn_attr.crop_win.h_start = 768; - chn_attr.crop_win.v_start = 16; - chn_attr.crop_win.width = ISP_CHN0_WIDTH; - chn_attr.crop_win.height = ISP_CHN0_HEIGHT; -#endif - - chn_attr.scale_win = chn_attr.out_win; - chn_attr.crop_enable = K_FALSE; - chn_attr.scale_enable = K_FALSE; - // chn_attr.dw_enable = K_FALSE; - chn_attr.chn_enable = K_TRUE; - chn_attr.pix_format = PIXEL_FORMAT_YVU_PLANAR_420; - chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp - chn_attr.buffer_size = config.comm_pool[0].blk_size; - vicap_chn = VICAP_CHN_ID_0; - - printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); - ret = kd_mpi_vicap_set_chn_attr(vicap_dev, vicap_chn, chn_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); - return ret; - } - - //bind vicap chn 0 to vo - vicap_mpp_chn.mod_id = K_ID_VI; - vicap_mpp_chn.dev_id = vicap_dev; - vicap_mpp_chn.chn_id = vicap_chn; - - vo_mpp_chn.mod_id = K_ID_VO; - vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; - vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; - - sample_vicap_bind_vo(vicap_mpp_chn, vo_mpp_chn); - printf("sample_vicap ...dwc_dsi_init\n"); - - //set chn1 output rgb888p - chn_attr.out_win.h_start = 0; - chn_attr.out_win.v_start = 0; - chn_attr.out_win.width = SENSOR_WIDTH ; - chn_attr.out_win.height = SENSOR_HEIGHT; - // chn_attr.crop_win = dev_attr.acq_win; - -#if defined(CONFIG_BOARD_K230_CANMV) - chn_attr.crop_win = dev_attr.acq_win; -#else - chn_attr.crop_win.h_start = 768; - chn_attr.crop_win.v_start = 16; - chn_attr.crop_win.width = ISP_CHN0_WIDTH; - chn_attr.crop_win.height = ISP_CHN0_HEIGHT; -#endif - - chn_attr.scale_win = chn_attr.out_win; - chn_attr.crop_enable = K_FALSE; - chn_attr.scale_enable = K_FALSE; - // chn_attr.dw_enable = K_FALSE; - chn_attr.chn_enable = K_TRUE; - chn_attr.pix_format = PIXEL_FORMAT_BGR_888_PLANAR; - chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp - chn_attr.buffer_size = config.comm_pool[1].blk_size; - - printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); - ret = kd_mpi_vicap_set_chn_attr(vicap_dev, VICAP_CHN_ID_1, chn_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); - return ret; - } - - printf("sample_vicap ...kd_mpi_vicap_init\n"); - ret = kd_mpi_vicap_init(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - // goto err_exit; - } - - printf("sample_vicap ...kd_mpi_vicap_start_stream\n"); - ret = kd_mpi_vicap_start_stream(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - // goto err_exit; - } - - return ret; -} - -int vivcap_stop() -{ - printf("sample_vicap ...kd_mpi_vicap_stop_stream\n"); - int ret = kd_mpi_vicap_stop_stream(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - return ret; - } - - ret = kd_mpi_vicap_deinit(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_deinit failed.\n"); - return ret; - } - - kd_mpi_vo_disable_video_layer(K_VO_LAYER1); - - vicap_mpp_chn.mod_id = K_ID_VI; - vicap_mpp_chn.dev_id = vicap_dev; - vicap_mpp_chn.chn_id = vicap_chn; - - vo_mpp_chn.mod_id = K_ID_VO; - vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; - vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; - - sample_vicap_unbind_vo(vicap_mpp_chn, vo_mpp_chn); - - /*Allow one frame time for the VO to release the VB block*/ - k_u32 display_ms = 1000 / 33; - usleep(1000 * display_ms); - - ret = kd_mpi_vb_exit(); - if (ret) { - printf("sample_vicap, kd_mpi_vb_exit failed.\n"); - return ret; - } - - return 0; -} - -void yuv_rotate_90(char *des, char *src,int width,int height) -{ - int n = 0; - int hw = width>>1; - int hh = height>>1; - int size = width * height; - int hsize = size>>2; - - int pos = 0; - - for(int i = width-1;i >= 0;i--) - { - pos = 0; - for(int j= 0;j < height;j++) - { - des[n++]= src[pos+i]; - pos += width; - } - } - +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include + +#include "mpi_sys_api.h" + +/* vicap */ +#include +#include +#include +#include +#include + +#include "k_module.h" +#include "k_type.h" +#include "k_vb_comm.h" +#include "k_video_comm.h" +#include "k_sys_comm.h" +#include "mpi_vb_api.h" +#include "mpi_vicap_api.h" +#include "mpi_isp_api.h" +#include "mpi_sys_api.h" +#include "k_vo_comm.h" +#include "mpi_vo_api.h" + +#include "vo_test_case.h" + +#include "k_connector_comm.h" +#include "mpi_connector_api.h" +#include "k_autoconf_comm.h" + + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) +#define SENSOR_CHANNEL (3) // isp通道数 +#define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 +#define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 +#define ISP_CHN0_WIDTH (1920)//(1920) +#define ISP_CHN0_HEIGHT (1080)//(1080) +#define vicap_install_osd (1) +#define osd_id K_VO_OSD3 +#define osd_width (1920) +#define osd_height (1080) +#else +#define SENSOR_CHANNEL (3) // isp通道数 +#define SENSOR_HEIGHT (1280) // isp高度,ai输入,竖屏 +#define SENSOR_WIDTH (720) // isp宽度,ai输入,竖屏 +#define ISP_CHN0_WIDTH (1088)//(1920) +#define ISP_CHN0_HEIGHT (1920)//(1080) +#define vicap_install_osd (1) +#define osd_id K_VO_OSD3 +#define osd_width (1080) +#define osd_height (1920) +#endif + + +k_vb_config config; +k_vicap_dev vicap_dev; +k_vicap_chn vicap_chn; +k_vicap_dev_attr dev_attr; +k_vicap_chn_attr chn_attr; +k_vicap_sensor_info sensor_info; +k_vicap_sensor_type sensor_type; +k_mpp_chn vicap_mpp_chn; +k_mpp_chn vo_mpp_chn; + +k_video_frame_info dump_info; + +k_vo_draw_frame vo_frame = (k_vo_draw_frame) { + 1, + 16, + 16, + 128, + 128, + 1 +}; + +static k_vb_blk_handle block; +k_u32 g_pool_id; + +int vo_creat_layer_test(k_vo_layer chn_id, layer_info *info) +{ + k_vo_video_layer_attr attr; + + // check layer + if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) + || ((info->func != 0) && (chn_id == K_VO_LAYER2))) + { + printf("input layer num failed \n"); + return -1 ; + } + + // check scaler + + // set offset + attr.display_rect = info->offset; + // set act + attr.img_size = info->act_size; + // sget size + info->size = info->act_size.height * info->act_size.width * 3 / 2; + //set pixel format + attr.pixel_format = info->format; + if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) + { + printf("input pix format failed \n"); + return -1; + } + // set stride + attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); + // set function + attr.func = info->func; + // set scaler attr + attr.scaler_attr = info->attr; + + // set video layer atrr + kd_mpi_vo_set_video_layer_attr(chn_id, &attr); + + // enable layer + kd_mpi_vo_enable_video_layer(chn_id); + + return 0; +} + +k_vb_blk_handle vo_insert_frame(k_video_frame_info *vf_info, void **pic_vaddr) +{ + k_u64 phys_addr = 0; + k_u32 *virt_addr; + k_vb_blk_handle handle; + k_s32 size; + + if (vf_info == NULL) + return K_FALSE; + + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_8888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_8888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 4; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_565 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_565) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_4444 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_4444) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_1555 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_1555) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3 / 2; + + size = size + 4096; // 强制4K ,后边得删了 + + printf("vb block size is %x \n", size); + + handle = kd_mpi_vb_get_block(g_pool_id, size, NULL); + if (handle == VB_INVALID_HANDLE) + { + printf("%s get vb block error\n", __func__); + return K_FAILED; + } + + phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); + if (phys_addr == 0) + { + printf("%s get phys addr error\n", __func__); + return K_FAILED; + } + + virt_addr = (k_u32 *)kd_mpi_sys_mmap(phys_addr, size); + // virt_addr = (k_u32 *)kd_mpi_sys_mmap_cached(phys_addr, size); + + if (virt_addr == NULL) + { + printf("%s mmap error\n", __func__); + return K_FAILED; + } + + vf_info->mod_id = K_ID_VO; + vf_info->pool_id = g_pool_id; + vf_info->v_frame.phys_addr[0] = phys_addr; + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + vf_info->v_frame.phys_addr[1] = phys_addr + (vf_info->v_frame.height * vf_info->v_frame.stride[0]); + *pic_vaddr = virt_addr; + + printf("phys_addr is %lx g_pool_id is %d \n", phys_addr, g_pool_id); + + return handle; +} + +k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) +{ + k_vo_video_osd_attr attr; + + // set attr + attr.global_alptha = info->global_alptha; + + if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) + { + info->size = info->act_size.width * info->act_size.height * 4; + info->stride = info->act_size.width * 4 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) + { + info->size = info->act_size.width * info->act_size.height * 3; + info->stride = info->act_size.width * 3 / 8; + } + else if(info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if(info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else + { + printf("set osd pixel format failed \n"); + } + + attr.stride = info->stride; + attr.pixel_format = info->format; + attr.display_rect = info->offset; + attr.img_size = info->act_size; + kd_mpi_vo_set_video_osd_attr(osd, &attr); + + kd_mpi_vo_osd_enable(osd); + + return 0; +} + +void sample_vicap_install_osd(void) +{ + osd_info osd; + + osd.act_size.width = osd_width ; + osd.act_size.height = osd_height; + osd.offset.x = 0; + osd.offset.y = 0; + osd.global_alptha = 0xff; + // osd.global_alptha = 0x32; + osd.format = PIXEL_FORMAT_ARGB_8888;//PIXEL_FORMAT_ARGB_4444; //PIXEL_FORMAT_ARGB_1555;//PIXEL_FORMAT_ARGB_8888; + + vo_creat_osd_test(osd_id, &osd); +} + +void vo_osd_release_block(void) +{ + if(vicap_install_osd == 1) + { + kd_mpi_vo_osd_disable(osd_id); + kd_mpi_vb_release_block(block); + } + +} + +static k_s32 sample_connector_init(void) +{ + k_u32 ret = 0; + k_s32 connector_fd; +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#else + k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#endif + k_connector_info connector_info; + + memset(&connector_info, 0, sizeof(k_connector_info)); + + //connector get sensor info + ret = kd_mpi_get_connector_info(connector_type, &connector_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + + connector_fd = kd_mpi_connector_open(connector_info.connector_name); + if (connector_fd < 0) { + printf("%s, connector open failed.\n", __func__); + return K_ERR_VO_NOTREADY; + } + + // set connect power + kd_mpi_connector_power_set(connector_fd, K_TRUE); + // connector init + kd_mpi_connector_init(connector_fd, connector_info); + + return 0; +} + +static k_s32 vo_layer_vdss_bind_vo_config(void) +{ + layer_info info; + + k_vo_layer chn_id = K_VO_LAYER1; + + memset(&info, 0, sizeof(info)); + + sample_connector_init(); + + // config lyaer + info.act_size.width = ISP_CHN0_WIDTH;//ISP_CHN0_HEIGHT;//1080;//640;//1080; + info.act_size.height = ISP_CHN0_HEIGHT;//ISP_CHN0_WIDTH;//1920;//480;//1920; + info.format = PIXEL_FORMAT_YVU_PLANAR_420; + info.func = 0;//K_ROTATION_180;////K_ROTATION_90; + info.global_alptha = 0xff; + info.offset.x = 0;//(1080-w)/2, + info.offset.y = 0;//(1920-h)/2; + vo_creat_layer_test(chn_id, &info); + + if(vicap_install_osd == 1) + sample_vicap_install_osd(); + + //exit ; + return 0; +} + +static void sample_vicap_bind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) +{ + k_s32 ret; + + ret = kd_mpi_sys_bind(&vicap_mpp_chn, &vo_mpp_chn); + if (ret) { + printf("kd_mpi_sys_unbind failed:0x%x\n", ret); + } + + return; +} + +static void sample_vicap_unbind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) +{ + k_s32 ret; + + ret = kd_mpi_sys_unbind(&vicap_mpp_chn, &vo_mpp_chn); + if (ret) { + printf("kd_mpi_sys_unbind failed:0x%x\n", ret); + } + + return; +} + +int vivcap_start() +{ + k_s32 ret = 0; + + k_u32 pool_id; + k_vb_pool_config pool_config; + + printf("sample_vicap ...\n"); + +#if defined(CONFIG_BOARD_K230_CANMV) + sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; +#else + sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; +#endif + vicap_dev = VICAP_DEV_ID_0; + + memset(&config, 0, sizeof(config)); + config.max_pool_cnt = 64; + //VB for YUV420SP output + config.comm_pool[0].blk_cnt = 5; + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[0].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), VICAP_ALIGN_1K); + + //VB for RGB888 output + config.comm_pool[1].blk_cnt = 5; + config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[1].blk_size = VICAP_ALIGN_UP((SENSOR_HEIGHT * SENSOR_WIDTH * 3 ), VICAP_ALIGN_1K); + + ret = kd_mpi_vb_set_config(&config); + if (ret) { + printf("vb_set_config failed ret:%d\n", ret); + return ret; + } + + k_vb_supplement_config supplement_config; + memset(&supplement_config, 0, sizeof(supplement_config)); + supplement_config.supplement_config |= VB_SUPPLEMENT_JPEG_MASK; + + ret = kd_mpi_vb_set_supplement_config(&supplement_config); + if (ret) { + printf("vb_set_supplement_config failed ret:%d\n", ret); + return ret; + } + + ret = kd_mpi_vb_init(); + if (ret) { + printf("vb_init failed ret:%d\n", ret); + return ret; + } + printf("sample_vicap ...kd_mpi_vicap_get_sensor_info\n"); + + // dwc_dsi_init(); + vo_layer_vdss_bind_vo_config(); + + if(vicap_install_osd == 1) + { + memset(&pool_config, 0, sizeof(pool_config)); + pool_config.blk_size = VICAP_ALIGN_UP((osd_width * osd_height * 4 * 2), VICAP_ALIGN_1K); + pool_config.blk_cnt = 4; + pool_config.mode = VB_REMAP_MODE_NOCACHE; + pool_id = kd_mpi_vb_create_pool(&pool_config); // osd0 - 3 argb 320 x 240 + g_pool_id = pool_id; + + printf("--------aa--------------g_pool_id is %d pool_id is %d \n",g_pool_id, pool_id); + } + + memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); + ret = kd_mpi_vicap_get_sensor_info(sensor_type, &sensor_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + + memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); + dev_attr.acq_win.h_start = 0; + dev_attr.acq_win.v_start = 0; +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + dev_attr.acq_win.width = ISP_CHN0_WIDTH; + dev_attr.acq_win.height = ISP_CHN0_HEIGHT; +#else + dev_attr.acq_win.width = 2592;//SENSOR_HEIGHT; + dev_attr.acq_win.height = 1944;//SENSOR_WIDTH; +#endif + dev_attr.mode = VICAP_WORK_ONLINE_MODE; + + dev_attr.pipe_ctrl.data = 0xFFFFFFFF; + dev_attr.pipe_ctrl.bits.af_enable = 0; + dev_attr.pipe_ctrl.bits.ahdr_enable = 0; + + + dev_attr.cpature_frame = 0; + memcpy(&dev_attr.sensor_info, &sensor_info, sizeof(k_vicap_sensor_info)); + + ret = kd_mpi_vicap_set_dev_attr(vicap_dev, dev_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_dev_attr failed.\n"); + return ret; + } + + memset(&chn_attr, 0, sizeof(k_vicap_chn_attr)); + + //set chn0 output yuv420sp + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = ISP_CHN0_WIDTH; + chn_attr.out_win.height = ISP_CHN0_HEIGHT; + + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + chn_attr.crop_win = dev_attr.acq_win; +#else + // chn_attr.crop_win = dev_attr.acq_win; + chn_attr.crop_win.h_start = 768; + chn_attr.crop_win.v_start = 16; + chn_attr.crop_win.width = ISP_CHN0_WIDTH; + chn_attr.crop_win.height = ISP_CHN0_HEIGHT; +#endif + + chn_attr.scale_win = chn_attr.out_win; + chn_attr.crop_enable = K_FALSE; + chn_attr.scale_enable = K_FALSE; + // chn_attr.dw_enable = K_FALSE; + chn_attr.chn_enable = K_TRUE; + chn_attr.pix_format = PIXEL_FORMAT_YVU_PLANAR_420; + chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp + chn_attr.buffer_size = config.comm_pool[0].blk_size; + vicap_chn = VICAP_CHN_ID_0; + + printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); + ret = kd_mpi_vicap_set_chn_attr(vicap_dev, vicap_chn, chn_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); + return ret; + } + + //bind vicap chn 0 to vo + vicap_mpp_chn.mod_id = K_ID_VI; + vicap_mpp_chn.dev_id = vicap_dev; + vicap_mpp_chn.chn_id = vicap_chn; + + vo_mpp_chn.mod_id = K_ID_VO; + vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; + vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; + + sample_vicap_bind_vo(vicap_mpp_chn, vo_mpp_chn); + printf("sample_vicap ...dwc_dsi_init\n"); + + //set chn1 output rgb888p + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = SENSOR_WIDTH ; + chn_attr.out_win.height = SENSOR_HEIGHT; + // chn_attr.crop_win = dev_attr.acq_win; + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + chn_attr.crop_win = dev_attr.acq_win; +#else + chn_attr.crop_win.h_start = 768; + chn_attr.crop_win.v_start = 16; + chn_attr.crop_win.width = ISP_CHN0_WIDTH; + chn_attr.crop_win.height = ISP_CHN0_HEIGHT; +#endif + + chn_attr.scale_win = chn_attr.out_win; + chn_attr.crop_enable = K_FALSE; + chn_attr.scale_enable = K_FALSE; + // chn_attr.dw_enable = K_FALSE; + chn_attr.chn_enable = K_TRUE; + chn_attr.pix_format = PIXEL_FORMAT_BGR_888_PLANAR; + chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp + chn_attr.buffer_size = config.comm_pool[1].blk_size; + + printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); + ret = kd_mpi_vicap_set_chn_attr(vicap_dev, VICAP_CHN_ID_1, chn_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); + return ret; + } + + printf("sample_vicap ...kd_mpi_vicap_init\n"); + ret = kd_mpi_vicap_init(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + // goto err_exit; + } + + printf("sample_vicap ...kd_mpi_vicap_start_stream\n"); + ret = kd_mpi_vicap_start_stream(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + // goto err_exit; + } + + return ret; +} + +int vivcap_stop() +{ + printf("sample_vicap ...kd_mpi_vicap_stop_stream\n"); + int ret = kd_mpi_vicap_stop_stream(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + return ret; + } + + ret = kd_mpi_vicap_deinit(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_deinit failed.\n"); + return ret; + } + + kd_mpi_vo_disable_video_layer(K_VO_LAYER1); + + vicap_mpp_chn.mod_id = K_ID_VI; + vicap_mpp_chn.dev_id = vicap_dev; + vicap_mpp_chn.chn_id = vicap_chn; + + vo_mpp_chn.mod_id = K_ID_VO; + vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; + vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; + + sample_vicap_unbind_vo(vicap_mpp_chn, vo_mpp_chn); + + /*Allow one frame time for the VO to release the VB block*/ + k_u32 display_ms = 1000 / 33; + usleep(1000 * display_ms); + + ret = kd_mpi_vb_exit(); + if (ret) { + printf("sample_vicap, kd_mpi_vb_exit failed.\n"); + return ret; + } + + return 0; +} + +void yuv_rotate_90(char *des, char *src,int width,int height) +{ + int n = 0; + int hw = width>>1; + int hh = height>>1; + int size = width * height; + int hsize = size>>2; + + int pos = 0; + + for(int i = width-1;i >= 0;i--) + { + pos = 0; + for(int j= 0;j < height;j++) + { + des[n++]= src[pos+i]; + pos += width; + } + } + } \ No newline at end of file diff --git a/src/reference/ai_poc/head_detection/vi_vo.h b/src/reference/ai_poc/head_detection/vi_vo.h index f0c1bccc5..0a11a4d31 100644 --- a/src/reference/ai_poc/head_detection/vi_vo.h +++ b/src/reference/ai_poc/head_detection/vi_vo.h @@ -57,7 +57,7 @@ #include "k_autoconf_comm.h" -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) #define SENSOR_CHANNEL (3) // isp通道数 #define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 #define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 @@ -286,7 +286,7 @@ static k_s32 sample_connector_init(void) { k_u32 ret = 0; k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; #else k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; @@ -378,7 +378,8 @@ int vivcap_start() #if defined(CONFIG_BOARD_K230_CANMV) sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; #else sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; #endif @@ -444,7 +445,7 @@ int vivcap_start() memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); dev_attr.acq_win.h_start = 0; dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) dev_attr.acq_win.width = ISP_CHN0_WIDTH; dev_attr.acq_win.height = ISP_CHN0_HEIGHT; #else @@ -476,7 +477,7 @@ int vivcap_start() chn_attr.out_win.height = ISP_CHN0_HEIGHT; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else // chn_attr.crop_win = dev_attr.acq_win; @@ -522,7 +523,7 @@ int vivcap_start() chn_attr.out_win.height = SENSOR_HEIGHT; // chn_attr.crop_win = dev_attr.acq_win; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else chn_attr.crop_win.h_start = 768; diff --git a/src/reference/ai_poc/helmet_detect/vi_vo.h b/src/reference/ai_poc/helmet_detect/vi_vo.h index e3d8bdba4..0a11a4d31 100644 --- a/src/reference/ai_poc/helmet_detect/vi_vo.h +++ b/src/reference/ai_poc/helmet_detect/vi_vo.h @@ -1,627 +1,628 @@ -/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include -#include -#include - -#include "mpi_sys_api.h" - -/* vicap */ -#include -#include -#include -#include -#include - -#include "k_module.h" -#include "k_type.h" -#include "k_vb_comm.h" -#include "k_video_comm.h" -#include "k_sys_comm.h" -#include "mpi_vb_api.h" -#include "mpi_vicap_api.h" -#include "mpi_isp_api.h" -#include "mpi_sys_api.h" -#include "k_vo_comm.h" -#include "mpi_vo_api.h" - -#include "vo_test_case.h" - -#include "k_connector_comm.h" -#include "mpi_connector_api.h" -#include "k_autoconf_comm.h" - - -#if defined(CONFIG_BOARD_K230_CANMV) -#define SENSOR_CHANNEL (3) // isp通道数 -#define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 -#define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 -#define ISP_CHN0_WIDTH (1920)//(1920) -#define ISP_CHN0_HEIGHT (1080)//(1080) -#define vicap_install_osd (1) -#define osd_id K_VO_OSD3 -#define osd_width (1920) -#define osd_height (1080) -#else -#define SENSOR_CHANNEL (3) // isp通道数 -#define SENSOR_HEIGHT (1280) // isp高度,ai输入,竖屏 -#define SENSOR_WIDTH (720) // isp宽度,ai输入,竖屏 -#define ISP_CHN0_WIDTH (1088)//(1920) -#define ISP_CHN0_HEIGHT (1920)//(1080) -#define vicap_install_osd (1) -#define osd_id K_VO_OSD3 -#define osd_width (1080) -#define osd_height (1920) -#endif - - -k_vb_config config; -k_vicap_dev vicap_dev; -k_vicap_chn vicap_chn; -k_vicap_dev_attr dev_attr; -k_vicap_chn_attr chn_attr; -k_vicap_sensor_info sensor_info; -k_vicap_sensor_type sensor_type; -k_mpp_chn vicap_mpp_chn; -k_mpp_chn vo_mpp_chn; - -k_video_frame_info dump_info; - -k_vo_draw_frame vo_frame = (k_vo_draw_frame) { - 1, - 16, - 16, - 128, - 128, - 1 -}; - -static k_vb_blk_handle block; -k_u32 g_pool_id; - -int vo_creat_layer_test(k_vo_layer chn_id, layer_info *info) -{ - k_vo_video_layer_attr attr; - - // check layer - if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) - || ((info->func != 0) && (chn_id == K_VO_LAYER2))) - { - printf("input layer num failed \n"); - return -1 ; - } - - // check scaler - - // set offset - attr.display_rect = info->offset; - // set act - attr.img_size = info->act_size; - // sget size - info->size = info->act_size.height * info->act_size.width * 3 / 2; - //set pixel format - attr.pixel_format = info->format; - if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) - { - printf("input pix format failed \n"); - return -1; - } - // set stride - attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); - // set function - attr.func = info->func; - // set scaler attr - attr.scaler_attr = info->attr; - - // set video layer atrr - kd_mpi_vo_set_video_layer_attr(chn_id, &attr); - - // enable layer - kd_mpi_vo_enable_video_layer(chn_id); - - return 0; -} - -k_vb_blk_handle vo_insert_frame(k_video_frame_info *vf_info, void **pic_vaddr) -{ - k_u64 phys_addr = 0; - k_u32 *virt_addr; - k_vb_blk_handle handle; - k_s32 size; - - if (vf_info == NULL) - return K_FALSE; - - if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_8888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_8888) - size = vf_info->v_frame.height * vf_info->v_frame.width * 4; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_565 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_565) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_4444 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_4444) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_888) - size = vf_info->v_frame.height * vf_info->v_frame.width * 3; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_1555 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_1555) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) - size = vf_info->v_frame.height * vf_info->v_frame.width * 3 / 2; - - size = size + 4096; // 强制4K ,后边得删了 - - printf("vb block size is %x \n", size); - - handle = kd_mpi_vb_get_block(g_pool_id, size, NULL); - if (handle == VB_INVALID_HANDLE) - { - printf("%s get vb block error\n", __func__); - return K_FAILED; - } - - phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); - if (phys_addr == 0) - { - printf("%s get phys addr error\n", __func__); - return K_FAILED; - } - - virt_addr = (k_u32 *)kd_mpi_sys_mmap(phys_addr, size); - // virt_addr = (k_u32 *)kd_mpi_sys_mmap_cached(phys_addr, size); - - if (virt_addr == NULL) - { - printf("%s mmap error\n", __func__); - return K_FAILED; - } - - vf_info->mod_id = K_ID_VO; - vf_info->pool_id = g_pool_id; - vf_info->v_frame.phys_addr[0] = phys_addr; - if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) - vf_info->v_frame.phys_addr[1] = phys_addr + (vf_info->v_frame.height * vf_info->v_frame.stride[0]); - *pic_vaddr = virt_addr; - - printf("phys_addr is %lx g_pool_id is %d \n", phys_addr, g_pool_id); - - return handle; -} - -k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) -{ - k_vo_video_osd_attr attr; - - // set attr - attr.global_alptha = info->global_alptha; - - if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) - { - info->size = info->act_size.width * info->act_size.height * 4; - info->stride = info->act_size.width * 4 / 8; - } - else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) - { - info->size = info->act_size.width * info->act_size.height * 3; - info->stride = info->act_size.width * 3 / 8; - } - else if(info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else if(info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else - { - printf("set osd pixel format failed \n"); - } - - attr.stride = info->stride; - attr.pixel_format = info->format; - attr.display_rect = info->offset; - attr.img_size = info->act_size; - kd_mpi_vo_set_video_osd_attr(osd, &attr); - - kd_mpi_vo_osd_enable(osd); - - return 0; -} - -void sample_vicap_install_osd(void) -{ - osd_info osd; - - osd.act_size.width = osd_width ; - osd.act_size.height = osd_height; - osd.offset.x = 0; - osd.offset.y = 0; - osd.global_alptha = 0xff; - // osd.global_alptha = 0x32; - osd.format = PIXEL_FORMAT_ARGB_8888;//PIXEL_FORMAT_ARGB_4444; //PIXEL_FORMAT_ARGB_1555;//PIXEL_FORMAT_ARGB_8888; - - vo_creat_osd_test(osd_id, &osd); -} - -void vo_osd_release_block(void) -{ - if(vicap_install_osd == 1) - { - kd_mpi_vo_osd_disable(osd_id); - kd_mpi_vb_release_block(block); - } - -} - -static k_s32 sample_connector_init(void) -{ - k_u32 ret = 0; - k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) - k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; -#else - k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; -#endif - k_connector_info connector_info; - - memset(&connector_info, 0, sizeof(k_connector_info)); - - //connector get sensor info - ret = kd_mpi_get_connector_info(connector_type, &connector_info); - if (ret) { - printf("sample_vicap, the sensor type not supported!\n"); - return ret; - } - - connector_fd = kd_mpi_connector_open(connector_info.connector_name); - if (connector_fd < 0) { - printf("%s, connector open failed.\n", __func__); - return K_ERR_VO_NOTREADY; - } - - // set connect power - kd_mpi_connector_power_set(connector_fd, K_TRUE); - // connector init - kd_mpi_connector_init(connector_fd, connector_info); - - return 0; -} - -static k_s32 vo_layer_vdss_bind_vo_config(void) -{ - layer_info info; - - k_vo_layer chn_id = K_VO_LAYER1; - - memset(&info, 0, sizeof(info)); - - sample_connector_init(); - - // config lyaer - info.act_size.width = ISP_CHN0_WIDTH;//ISP_CHN0_HEIGHT;//1080;//640;//1080; - info.act_size.height = ISP_CHN0_HEIGHT;//ISP_CHN0_WIDTH;//1920;//480;//1920; - info.format = PIXEL_FORMAT_YVU_PLANAR_420; - info.func = 0;//K_ROTATION_180;////K_ROTATION_90; - info.global_alptha = 0xff; - info.offset.x = 0;//(1080-w)/2, - info.offset.y = 0;//(1920-h)/2; - vo_creat_layer_test(chn_id, &info); - - if(vicap_install_osd == 1) - sample_vicap_install_osd(); - - //exit ; - return 0; -} - -static void sample_vicap_bind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) -{ - k_s32 ret; - - ret = kd_mpi_sys_bind(&vicap_mpp_chn, &vo_mpp_chn); - if (ret) { - printf("kd_mpi_sys_unbind failed:0x%x\n", ret); - } - - return; -} - -static void sample_vicap_unbind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) -{ - k_s32 ret; - - ret = kd_mpi_sys_unbind(&vicap_mpp_chn, &vo_mpp_chn); - if (ret) { - printf("kd_mpi_sys_unbind failed:0x%x\n", ret); - } - - return; -} - -int vivcap_start() -{ - k_s32 ret = 0; - - k_u32 pool_id; - k_vb_pool_config pool_config; - - printf("sample_vicap ...\n"); - -#if defined(CONFIG_BOARD_K230_CANMV) - sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); -#else - sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; -#endif - vicap_dev = VICAP_DEV_ID_0; - - memset(&config, 0, sizeof(config)); - config.max_pool_cnt = 64; - //VB for YUV420SP output - config.comm_pool[0].blk_cnt = 5; - config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; - config.comm_pool[0].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), VICAP_ALIGN_1K); - - //VB for RGB888 output - config.comm_pool[1].blk_cnt = 5; - config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; - config.comm_pool[1].blk_size = VICAP_ALIGN_UP((SENSOR_HEIGHT * SENSOR_WIDTH * 3 ), VICAP_ALIGN_1K); - - ret = kd_mpi_vb_set_config(&config); - if (ret) { - printf("vb_set_config failed ret:%d\n", ret); - return ret; - } - - k_vb_supplement_config supplement_config; - memset(&supplement_config, 0, sizeof(supplement_config)); - supplement_config.supplement_config |= VB_SUPPLEMENT_JPEG_MASK; - - ret = kd_mpi_vb_set_supplement_config(&supplement_config); - if (ret) { - printf("vb_set_supplement_config failed ret:%d\n", ret); - return ret; - } - - ret = kd_mpi_vb_init(); - if (ret) { - printf("vb_init failed ret:%d\n", ret); - return ret; - } - printf("sample_vicap ...kd_mpi_vicap_get_sensor_info\n"); - - // dwc_dsi_init(); - vo_layer_vdss_bind_vo_config(); - - if(vicap_install_osd == 1) - { - memset(&pool_config, 0, sizeof(pool_config)); - pool_config.blk_size = VICAP_ALIGN_UP((osd_width * osd_height * 4 * 2), VICAP_ALIGN_1K); - pool_config.blk_cnt = 4; - pool_config.mode = VB_REMAP_MODE_NOCACHE; - pool_id = kd_mpi_vb_create_pool(&pool_config); // osd0 - 3 argb 320 x 240 - g_pool_id = pool_id; - - printf("--------aa--------------g_pool_id is %d pool_id is %d \n",g_pool_id, pool_id); - } - - memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); - ret = kd_mpi_vicap_get_sensor_info(sensor_type, &sensor_info); - if (ret) { - printf("sample_vicap, the sensor type not supported!\n"); - return ret; - } - - memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); - dev_attr.acq_win.h_start = 0; - dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) - dev_attr.acq_win.width = ISP_CHN0_WIDTH; - dev_attr.acq_win.height = ISP_CHN0_HEIGHT; -#else - dev_attr.acq_win.width = 2592;//SENSOR_HEIGHT; - dev_attr.acq_win.height = 1944;//SENSOR_WIDTH; -#endif - dev_attr.mode = VICAP_WORK_ONLINE_MODE; - - dev_attr.pipe_ctrl.data = 0xFFFFFFFF; - dev_attr.pipe_ctrl.bits.af_enable = 0; - dev_attr.pipe_ctrl.bits.ahdr_enable = 0; - - - dev_attr.cpature_frame = 0; - memcpy(&dev_attr.sensor_info, &sensor_info, sizeof(k_vicap_sensor_info)); - - ret = kd_mpi_vicap_set_dev_attr(vicap_dev, dev_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_dev_attr failed.\n"); - return ret; - } - - memset(&chn_attr, 0, sizeof(k_vicap_chn_attr)); - - //set chn0 output yuv420sp - chn_attr.out_win.h_start = 0; - chn_attr.out_win.v_start = 0; - chn_attr.out_win.width = ISP_CHN0_WIDTH; - chn_attr.out_win.height = ISP_CHN0_HEIGHT; - - -#if defined(CONFIG_BOARD_K230_CANMV) - chn_attr.crop_win = dev_attr.acq_win; -#else - // chn_attr.crop_win = dev_attr.acq_win; - chn_attr.crop_win.h_start = 768; - chn_attr.crop_win.v_start = 16; - chn_attr.crop_win.width = ISP_CHN0_WIDTH; - chn_attr.crop_win.height = ISP_CHN0_HEIGHT; -#endif - - chn_attr.scale_win = chn_attr.out_win; - chn_attr.crop_enable = K_FALSE; - chn_attr.scale_enable = K_FALSE; - // chn_attr.dw_enable = K_FALSE; - chn_attr.chn_enable = K_TRUE; - chn_attr.pix_format = PIXEL_FORMAT_YVU_PLANAR_420; - chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp - chn_attr.buffer_size = config.comm_pool[0].blk_size; - vicap_chn = VICAP_CHN_ID_0; - - printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); - ret = kd_mpi_vicap_set_chn_attr(vicap_dev, vicap_chn, chn_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); - return ret; - } - - //bind vicap chn 0 to vo - vicap_mpp_chn.mod_id = K_ID_VI; - vicap_mpp_chn.dev_id = vicap_dev; - vicap_mpp_chn.chn_id = vicap_chn; - - vo_mpp_chn.mod_id = K_ID_VO; - vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; - vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; - - sample_vicap_bind_vo(vicap_mpp_chn, vo_mpp_chn); - printf("sample_vicap ...dwc_dsi_init\n"); - - //set chn1 output rgb888p - chn_attr.out_win.h_start = 0; - chn_attr.out_win.v_start = 0; - chn_attr.out_win.width = SENSOR_WIDTH ; - chn_attr.out_win.height = SENSOR_HEIGHT; - // chn_attr.crop_win = dev_attr.acq_win; - -#if defined(CONFIG_BOARD_K230_CANMV) - chn_attr.crop_win = dev_attr.acq_win; -#else - chn_attr.crop_win.h_start = 768; - chn_attr.crop_win.v_start = 16; - chn_attr.crop_win.width = ISP_CHN0_WIDTH; - chn_attr.crop_win.height = ISP_CHN0_HEIGHT; -#endif - - chn_attr.scale_win = chn_attr.out_win; - chn_attr.crop_enable = K_FALSE; - chn_attr.scale_enable = K_FALSE; - // chn_attr.dw_enable = K_FALSE; - chn_attr.chn_enable = K_TRUE; - chn_attr.pix_format = PIXEL_FORMAT_BGR_888_PLANAR; - chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp - chn_attr.buffer_size = config.comm_pool[1].blk_size; - - printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); - ret = kd_mpi_vicap_set_chn_attr(vicap_dev, VICAP_CHN_ID_1, chn_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); - return ret; - } - - printf("sample_vicap ...kd_mpi_vicap_init\n"); - ret = kd_mpi_vicap_init(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - // goto err_exit; - } - - printf("sample_vicap ...kd_mpi_vicap_start_stream\n"); - ret = kd_mpi_vicap_start_stream(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - // goto err_exit; - } - - return ret; -} - -int vivcap_stop() -{ - printf("sample_vicap ...kd_mpi_vicap_stop_stream\n"); - int ret = kd_mpi_vicap_stop_stream(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - return ret; - } - - ret = kd_mpi_vicap_deinit(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_deinit failed.\n"); - return ret; - } - - kd_mpi_vo_disable_video_layer(K_VO_LAYER1); - - vicap_mpp_chn.mod_id = K_ID_VI; - vicap_mpp_chn.dev_id = vicap_dev; - vicap_mpp_chn.chn_id = vicap_chn; - - vo_mpp_chn.mod_id = K_ID_VO; - vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; - vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; - - sample_vicap_unbind_vo(vicap_mpp_chn, vo_mpp_chn); - - /*Allow one frame time for the VO to release the VB block*/ - k_u32 display_ms = 1000 / 33; - usleep(1000 * display_ms); - - ret = kd_mpi_vb_exit(); - if (ret) { - printf("sample_vicap, kd_mpi_vb_exit failed.\n"); - return ret; - } - - return 0; -} - -void yuv_rotate_90(char *des, char *src,int width,int height) -{ - int n = 0; - int hw = width>>1; - int hh = height>>1; - int size = width * height; - int hsize = size>>2; - - int pos = 0; - - for(int i = width-1;i >= 0;i--) - { - pos = 0; - for(int j= 0;j < height;j++) - { - des[n++]= src[pos+i]; - pos += width; - } - } - +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include + +#include "mpi_sys_api.h" + +/* vicap */ +#include +#include +#include +#include +#include + +#include "k_module.h" +#include "k_type.h" +#include "k_vb_comm.h" +#include "k_video_comm.h" +#include "k_sys_comm.h" +#include "mpi_vb_api.h" +#include "mpi_vicap_api.h" +#include "mpi_isp_api.h" +#include "mpi_sys_api.h" +#include "k_vo_comm.h" +#include "mpi_vo_api.h" + +#include "vo_test_case.h" + +#include "k_connector_comm.h" +#include "mpi_connector_api.h" +#include "k_autoconf_comm.h" + + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) +#define SENSOR_CHANNEL (3) // isp通道数 +#define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 +#define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 +#define ISP_CHN0_WIDTH (1920)//(1920) +#define ISP_CHN0_HEIGHT (1080)//(1080) +#define vicap_install_osd (1) +#define osd_id K_VO_OSD3 +#define osd_width (1920) +#define osd_height (1080) +#else +#define SENSOR_CHANNEL (3) // isp通道数 +#define SENSOR_HEIGHT (1280) // isp高度,ai输入,竖屏 +#define SENSOR_WIDTH (720) // isp宽度,ai输入,竖屏 +#define ISP_CHN0_WIDTH (1088)//(1920) +#define ISP_CHN0_HEIGHT (1920)//(1080) +#define vicap_install_osd (1) +#define osd_id K_VO_OSD3 +#define osd_width (1080) +#define osd_height (1920) +#endif + + +k_vb_config config; +k_vicap_dev vicap_dev; +k_vicap_chn vicap_chn; +k_vicap_dev_attr dev_attr; +k_vicap_chn_attr chn_attr; +k_vicap_sensor_info sensor_info; +k_vicap_sensor_type sensor_type; +k_mpp_chn vicap_mpp_chn; +k_mpp_chn vo_mpp_chn; + +k_video_frame_info dump_info; + +k_vo_draw_frame vo_frame = (k_vo_draw_frame) { + 1, + 16, + 16, + 128, + 128, + 1 +}; + +static k_vb_blk_handle block; +k_u32 g_pool_id; + +int vo_creat_layer_test(k_vo_layer chn_id, layer_info *info) +{ + k_vo_video_layer_attr attr; + + // check layer + if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) + || ((info->func != 0) && (chn_id == K_VO_LAYER2))) + { + printf("input layer num failed \n"); + return -1 ; + } + + // check scaler + + // set offset + attr.display_rect = info->offset; + // set act + attr.img_size = info->act_size; + // sget size + info->size = info->act_size.height * info->act_size.width * 3 / 2; + //set pixel format + attr.pixel_format = info->format; + if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) + { + printf("input pix format failed \n"); + return -1; + } + // set stride + attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); + // set function + attr.func = info->func; + // set scaler attr + attr.scaler_attr = info->attr; + + // set video layer atrr + kd_mpi_vo_set_video_layer_attr(chn_id, &attr); + + // enable layer + kd_mpi_vo_enable_video_layer(chn_id); + + return 0; +} + +k_vb_blk_handle vo_insert_frame(k_video_frame_info *vf_info, void **pic_vaddr) +{ + k_u64 phys_addr = 0; + k_u32 *virt_addr; + k_vb_blk_handle handle; + k_s32 size; + + if (vf_info == NULL) + return K_FALSE; + + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_8888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_8888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 4; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_565 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_565) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_4444 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_4444) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_1555 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_1555) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3 / 2; + + size = size + 4096; // 强制4K ,后边得删了 + + printf("vb block size is %x \n", size); + + handle = kd_mpi_vb_get_block(g_pool_id, size, NULL); + if (handle == VB_INVALID_HANDLE) + { + printf("%s get vb block error\n", __func__); + return K_FAILED; + } + + phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); + if (phys_addr == 0) + { + printf("%s get phys addr error\n", __func__); + return K_FAILED; + } + + virt_addr = (k_u32 *)kd_mpi_sys_mmap(phys_addr, size); + // virt_addr = (k_u32 *)kd_mpi_sys_mmap_cached(phys_addr, size); + + if (virt_addr == NULL) + { + printf("%s mmap error\n", __func__); + return K_FAILED; + } + + vf_info->mod_id = K_ID_VO; + vf_info->pool_id = g_pool_id; + vf_info->v_frame.phys_addr[0] = phys_addr; + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + vf_info->v_frame.phys_addr[1] = phys_addr + (vf_info->v_frame.height * vf_info->v_frame.stride[0]); + *pic_vaddr = virt_addr; + + printf("phys_addr is %lx g_pool_id is %d \n", phys_addr, g_pool_id); + + return handle; +} + +k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) +{ + k_vo_video_osd_attr attr; + + // set attr + attr.global_alptha = info->global_alptha; + + if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) + { + info->size = info->act_size.width * info->act_size.height * 4; + info->stride = info->act_size.width * 4 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) + { + info->size = info->act_size.width * info->act_size.height * 3; + info->stride = info->act_size.width * 3 / 8; + } + else if(info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if(info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else + { + printf("set osd pixel format failed \n"); + } + + attr.stride = info->stride; + attr.pixel_format = info->format; + attr.display_rect = info->offset; + attr.img_size = info->act_size; + kd_mpi_vo_set_video_osd_attr(osd, &attr); + + kd_mpi_vo_osd_enable(osd); + + return 0; +} + +void sample_vicap_install_osd(void) +{ + osd_info osd; + + osd.act_size.width = osd_width ; + osd.act_size.height = osd_height; + osd.offset.x = 0; + osd.offset.y = 0; + osd.global_alptha = 0xff; + // osd.global_alptha = 0x32; + osd.format = PIXEL_FORMAT_ARGB_8888;//PIXEL_FORMAT_ARGB_4444; //PIXEL_FORMAT_ARGB_1555;//PIXEL_FORMAT_ARGB_8888; + + vo_creat_osd_test(osd_id, &osd); +} + +void vo_osd_release_block(void) +{ + if(vicap_install_osd == 1) + { + kd_mpi_vo_osd_disable(osd_id); + kd_mpi_vb_release_block(block); + } + +} + +static k_s32 sample_connector_init(void) +{ + k_u32 ret = 0; + k_s32 connector_fd; +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#else + k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#endif + k_connector_info connector_info; + + memset(&connector_info, 0, sizeof(k_connector_info)); + + //connector get sensor info + ret = kd_mpi_get_connector_info(connector_type, &connector_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + + connector_fd = kd_mpi_connector_open(connector_info.connector_name); + if (connector_fd < 0) { + printf("%s, connector open failed.\n", __func__); + return K_ERR_VO_NOTREADY; + } + + // set connect power + kd_mpi_connector_power_set(connector_fd, K_TRUE); + // connector init + kd_mpi_connector_init(connector_fd, connector_info); + + return 0; +} + +static k_s32 vo_layer_vdss_bind_vo_config(void) +{ + layer_info info; + + k_vo_layer chn_id = K_VO_LAYER1; + + memset(&info, 0, sizeof(info)); + + sample_connector_init(); + + // config lyaer + info.act_size.width = ISP_CHN0_WIDTH;//ISP_CHN0_HEIGHT;//1080;//640;//1080; + info.act_size.height = ISP_CHN0_HEIGHT;//ISP_CHN0_WIDTH;//1920;//480;//1920; + info.format = PIXEL_FORMAT_YVU_PLANAR_420; + info.func = 0;//K_ROTATION_180;////K_ROTATION_90; + info.global_alptha = 0xff; + info.offset.x = 0;//(1080-w)/2, + info.offset.y = 0;//(1920-h)/2; + vo_creat_layer_test(chn_id, &info); + + if(vicap_install_osd == 1) + sample_vicap_install_osd(); + + //exit ; + return 0; +} + +static void sample_vicap_bind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) +{ + k_s32 ret; + + ret = kd_mpi_sys_bind(&vicap_mpp_chn, &vo_mpp_chn); + if (ret) { + printf("kd_mpi_sys_unbind failed:0x%x\n", ret); + } + + return; +} + +static void sample_vicap_unbind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) +{ + k_s32 ret; + + ret = kd_mpi_sys_unbind(&vicap_mpp_chn, &vo_mpp_chn); + if (ret) { + printf("kd_mpi_sys_unbind failed:0x%x\n", ret); + } + + return; +} + +int vivcap_start() +{ + k_s32 ret = 0; + + k_u32 pool_id; + k_vb_pool_config pool_config; + + printf("sample_vicap ...\n"); + +#if defined(CONFIG_BOARD_K230_CANMV) + sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; +#else + sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; +#endif + vicap_dev = VICAP_DEV_ID_0; + + memset(&config, 0, sizeof(config)); + config.max_pool_cnt = 64; + //VB for YUV420SP output + config.comm_pool[0].blk_cnt = 5; + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[0].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), VICAP_ALIGN_1K); + + //VB for RGB888 output + config.comm_pool[1].blk_cnt = 5; + config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[1].blk_size = VICAP_ALIGN_UP((SENSOR_HEIGHT * SENSOR_WIDTH * 3 ), VICAP_ALIGN_1K); + + ret = kd_mpi_vb_set_config(&config); + if (ret) { + printf("vb_set_config failed ret:%d\n", ret); + return ret; + } + + k_vb_supplement_config supplement_config; + memset(&supplement_config, 0, sizeof(supplement_config)); + supplement_config.supplement_config |= VB_SUPPLEMENT_JPEG_MASK; + + ret = kd_mpi_vb_set_supplement_config(&supplement_config); + if (ret) { + printf("vb_set_supplement_config failed ret:%d\n", ret); + return ret; + } + + ret = kd_mpi_vb_init(); + if (ret) { + printf("vb_init failed ret:%d\n", ret); + return ret; + } + printf("sample_vicap ...kd_mpi_vicap_get_sensor_info\n"); + + // dwc_dsi_init(); + vo_layer_vdss_bind_vo_config(); + + if(vicap_install_osd == 1) + { + memset(&pool_config, 0, sizeof(pool_config)); + pool_config.blk_size = VICAP_ALIGN_UP((osd_width * osd_height * 4 * 2), VICAP_ALIGN_1K); + pool_config.blk_cnt = 4; + pool_config.mode = VB_REMAP_MODE_NOCACHE; + pool_id = kd_mpi_vb_create_pool(&pool_config); // osd0 - 3 argb 320 x 240 + g_pool_id = pool_id; + + printf("--------aa--------------g_pool_id is %d pool_id is %d \n",g_pool_id, pool_id); + } + + memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); + ret = kd_mpi_vicap_get_sensor_info(sensor_type, &sensor_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + + memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); + dev_attr.acq_win.h_start = 0; + dev_attr.acq_win.v_start = 0; +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + dev_attr.acq_win.width = ISP_CHN0_WIDTH; + dev_attr.acq_win.height = ISP_CHN0_HEIGHT; +#else + dev_attr.acq_win.width = 2592;//SENSOR_HEIGHT; + dev_attr.acq_win.height = 1944;//SENSOR_WIDTH; +#endif + dev_attr.mode = VICAP_WORK_ONLINE_MODE; + + dev_attr.pipe_ctrl.data = 0xFFFFFFFF; + dev_attr.pipe_ctrl.bits.af_enable = 0; + dev_attr.pipe_ctrl.bits.ahdr_enable = 0; + + + dev_attr.cpature_frame = 0; + memcpy(&dev_attr.sensor_info, &sensor_info, sizeof(k_vicap_sensor_info)); + + ret = kd_mpi_vicap_set_dev_attr(vicap_dev, dev_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_dev_attr failed.\n"); + return ret; + } + + memset(&chn_attr, 0, sizeof(k_vicap_chn_attr)); + + //set chn0 output yuv420sp + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = ISP_CHN0_WIDTH; + chn_attr.out_win.height = ISP_CHN0_HEIGHT; + + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + chn_attr.crop_win = dev_attr.acq_win; +#else + // chn_attr.crop_win = dev_attr.acq_win; + chn_attr.crop_win.h_start = 768; + chn_attr.crop_win.v_start = 16; + chn_attr.crop_win.width = ISP_CHN0_WIDTH; + chn_attr.crop_win.height = ISP_CHN0_HEIGHT; +#endif + + chn_attr.scale_win = chn_attr.out_win; + chn_attr.crop_enable = K_FALSE; + chn_attr.scale_enable = K_FALSE; + // chn_attr.dw_enable = K_FALSE; + chn_attr.chn_enable = K_TRUE; + chn_attr.pix_format = PIXEL_FORMAT_YVU_PLANAR_420; + chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp + chn_attr.buffer_size = config.comm_pool[0].blk_size; + vicap_chn = VICAP_CHN_ID_0; + + printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); + ret = kd_mpi_vicap_set_chn_attr(vicap_dev, vicap_chn, chn_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); + return ret; + } + + //bind vicap chn 0 to vo + vicap_mpp_chn.mod_id = K_ID_VI; + vicap_mpp_chn.dev_id = vicap_dev; + vicap_mpp_chn.chn_id = vicap_chn; + + vo_mpp_chn.mod_id = K_ID_VO; + vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; + vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; + + sample_vicap_bind_vo(vicap_mpp_chn, vo_mpp_chn); + printf("sample_vicap ...dwc_dsi_init\n"); + + //set chn1 output rgb888p + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = SENSOR_WIDTH ; + chn_attr.out_win.height = SENSOR_HEIGHT; + // chn_attr.crop_win = dev_attr.acq_win; + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + chn_attr.crop_win = dev_attr.acq_win; +#else + chn_attr.crop_win.h_start = 768; + chn_attr.crop_win.v_start = 16; + chn_attr.crop_win.width = ISP_CHN0_WIDTH; + chn_attr.crop_win.height = ISP_CHN0_HEIGHT; +#endif + + chn_attr.scale_win = chn_attr.out_win; + chn_attr.crop_enable = K_FALSE; + chn_attr.scale_enable = K_FALSE; + // chn_attr.dw_enable = K_FALSE; + chn_attr.chn_enable = K_TRUE; + chn_attr.pix_format = PIXEL_FORMAT_BGR_888_PLANAR; + chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp + chn_attr.buffer_size = config.comm_pool[1].blk_size; + + printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); + ret = kd_mpi_vicap_set_chn_attr(vicap_dev, VICAP_CHN_ID_1, chn_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); + return ret; + } + + printf("sample_vicap ...kd_mpi_vicap_init\n"); + ret = kd_mpi_vicap_init(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + // goto err_exit; + } + + printf("sample_vicap ...kd_mpi_vicap_start_stream\n"); + ret = kd_mpi_vicap_start_stream(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + // goto err_exit; + } + + return ret; +} + +int vivcap_stop() +{ + printf("sample_vicap ...kd_mpi_vicap_stop_stream\n"); + int ret = kd_mpi_vicap_stop_stream(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + return ret; + } + + ret = kd_mpi_vicap_deinit(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_deinit failed.\n"); + return ret; + } + + kd_mpi_vo_disable_video_layer(K_VO_LAYER1); + + vicap_mpp_chn.mod_id = K_ID_VI; + vicap_mpp_chn.dev_id = vicap_dev; + vicap_mpp_chn.chn_id = vicap_chn; + + vo_mpp_chn.mod_id = K_ID_VO; + vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; + vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; + + sample_vicap_unbind_vo(vicap_mpp_chn, vo_mpp_chn); + + /*Allow one frame time for the VO to release the VB block*/ + k_u32 display_ms = 1000 / 33; + usleep(1000 * display_ms); + + ret = kd_mpi_vb_exit(); + if (ret) { + printf("sample_vicap, kd_mpi_vb_exit failed.\n"); + return ret; + } + + return 0; +} + +void yuv_rotate_90(char *des, char *src,int width,int height) +{ + int n = 0; + int hw = width>>1; + int hh = height>>1; + int size = width * height; + int hsize = size>>2; + + int pos = 0; + + for(int i = width-1;i >= 0;i--) + { + pos = 0; + for(int j= 0;j < height;j++) + { + des[n++]= src[pos+i]; + pos += width; + } + } + } \ No newline at end of file diff --git a/src/reference/ai_poc/licence_det/vi_vo.h b/src/reference/ai_poc/licence_det/vi_vo.h index f0c1bccc5..0a11a4d31 100644 --- a/src/reference/ai_poc/licence_det/vi_vo.h +++ b/src/reference/ai_poc/licence_det/vi_vo.h @@ -57,7 +57,7 @@ #include "k_autoconf_comm.h" -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) #define SENSOR_CHANNEL (3) // isp通道数 #define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 #define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 @@ -286,7 +286,7 @@ static k_s32 sample_connector_init(void) { k_u32 ret = 0; k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; #else k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; @@ -378,7 +378,8 @@ int vivcap_start() #if defined(CONFIG_BOARD_K230_CANMV) sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; #else sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; #endif @@ -444,7 +445,7 @@ int vivcap_start() memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); dev_attr.acq_win.h_start = 0; dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) dev_attr.acq_win.width = ISP_CHN0_WIDTH; dev_attr.acq_win.height = ISP_CHN0_HEIGHT; #else @@ -476,7 +477,7 @@ int vivcap_start() chn_attr.out_win.height = ISP_CHN0_HEIGHT; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else // chn_attr.crop_win = dev_attr.acq_win; @@ -522,7 +523,7 @@ int vivcap_start() chn_attr.out_win.height = SENSOR_HEIGHT; // chn_attr.crop_win = dev_attr.acq_win; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else chn_attr.crop_win.h_start = 768; diff --git a/src/reference/ai_poc/licence_det_rec/vi_vo.h b/src/reference/ai_poc/licence_det_rec/vi_vo.h index f0c1bccc5..0a11a4d31 100644 --- a/src/reference/ai_poc/licence_det_rec/vi_vo.h +++ b/src/reference/ai_poc/licence_det_rec/vi_vo.h @@ -57,7 +57,7 @@ #include "k_autoconf_comm.h" -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) #define SENSOR_CHANNEL (3) // isp通道数 #define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 #define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 @@ -286,7 +286,7 @@ static k_s32 sample_connector_init(void) { k_u32 ret = 0; k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; #else k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; @@ -378,7 +378,8 @@ int vivcap_start() #if defined(CONFIG_BOARD_K230_CANMV) sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; #else sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; #endif @@ -444,7 +445,7 @@ int vivcap_start() memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); dev_attr.acq_win.h_start = 0; dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) dev_attr.acq_win.width = ISP_CHN0_WIDTH; dev_attr.acq_win.height = ISP_CHN0_HEIGHT; #else @@ -476,7 +477,7 @@ int vivcap_start() chn_attr.out_win.height = ISP_CHN0_HEIGHT; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else // chn_attr.crop_win = dev_attr.acq_win; @@ -522,7 +523,7 @@ int vivcap_start() chn_attr.out_win.height = SENSOR_HEIGHT; // chn_attr.crop_win = dev_attr.acq_win; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else chn_attr.crop_win.h_start = 768; diff --git a/src/reference/ai_poc/nanotracker/vi_vo.h b/src/reference/ai_poc/nanotracker/vi_vo.h old mode 100755 new mode 100644 index e3d8bdba4..0a11a4d31 --- a/src/reference/ai_poc/nanotracker/vi_vo.h +++ b/src/reference/ai_poc/nanotracker/vi_vo.h @@ -1,627 +1,628 @@ -/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include -#include -#include - -#include "mpi_sys_api.h" - -/* vicap */ -#include -#include -#include -#include -#include - -#include "k_module.h" -#include "k_type.h" -#include "k_vb_comm.h" -#include "k_video_comm.h" -#include "k_sys_comm.h" -#include "mpi_vb_api.h" -#include "mpi_vicap_api.h" -#include "mpi_isp_api.h" -#include "mpi_sys_api.h" -#include "k_vo_comm.h" -#include "mpi_vo_api.h" - -#include "vo_test_case.h" - -#include "k_connector_comm.h" -#include "mpi_connector_api.h" -#include "k_autoconf_comm.h" - - -#if defined(CONFIG_BOARD_K230_CANMV) -#define SENSOR_CHANNEL (3) // isp通道数 -#define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 -#define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 -#define ISP_CHN0_WIDTH (1920)//(1920) -#define ISP_CHN0_HEIGHT (1080)//(1080) -#define vicap_install_osd (1) -#define osd_id K_VO_OSD3 -#define osd_width (1920) -#define osd_height (1080) -#else -#define SENSOR_CHANNEL (3) // isp通道数 -#define SENSOR_HEIGHT (1280) // isp高度,ai输入,竖屏 -#define SENSOR_WIDTH (720) // isp宽度,ai输入,竖屏 -#define ISP_CHN0_WIDTH (1088)//(1920) -#define ISP_CHN0_HEIGHT (1920)//(1080) -#define vicap_install_osd (1) -#define osd_id K_VO_OSD3 -#define osd_width (1080) -#define osd_height (1920) -#endif - - -k_vb_config config; -k_vicap_dev vicap_dev; -k_vicap_chn vicap_chn; -k_vicap_dev_attr dev_attr; -k_vicap_chn_attr chn_attr; -k_vicap_sensor_info sensor_info; -k_vicap_sensor_type sensor_type; -k_mpp_chn vicap_mpp_chn; -k_mpp_chn vo_mpp_chn; - -k_video_frame_info dump_info; - -k_vo_draw_frame vo_frame = (k_vo_draw_frame) { - 1, - 16, - 16, - 128, - 128, - 1 -}; - -static k_vb_blk_handle block; -k_u32 g_pool_id; - -int vo_creat_layer_test(k_vo_layer chn_id, layer_info *info) -{ - k_vo_video_layer_attr attr; - - // check layer - if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) - || ((info->func != 0) && (chn_id == K_VO_LAYER2))) - { - printf("input layer num failed \n"); - return -1 ; - } - - // check scaler - - // set offset - attr.display_rect = info->offset; - // set act - attr.img_size = info->act_size; - // sget size - info->size = info->act_size.height * info->act_size.width * 3 / 2; - //set pixel format - attr.pixel_format = info->format; - if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) - { - printf("input pix format failed \n"); - return -1; - } - // set stride - attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); - // set function - attr.func = info->func; - // set scaler attr - attr.scaler_attr = info->attr; - - // set video layer atrr - kd_mpi_vo_set_video_layer_attr(chn_id, &attr); - - // enable layer - kd_mpi_vo_enable_video_layer(chn_id); - - return 0; -} - -k_vb_blk_handle vo_insert_frame(k_video_frame_info *vf_info, void **pic_vaddr) -{ - k_u64 phys_addr = 0; - k_u32 *virt_addr; - k_vb_blk_handle handle; - k_s32 size; - - if (vf_info == NULL) - return K_FALSE; - - if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_8888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_8888) - size = vf_info->v_frame.height * vf_info->v_frame.width * 4; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_565 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_565) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_4444 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_4444) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_888) - size = vf_info->v_frame.height * vf_info->v_frame.width * 3; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_1555 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_1555) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) - size = vf_info->v_frame.height * vf_info->v_frame.width * 3 / 2; - - size = size + 4096; // 强制4K ,后边得删了 - - printf("vb block size is %x \n", size); - - handle = kd_mpi_vb_get_block(g_pool_id, size, NULL); - if (handle == VB_INVALID_HANDLE) - { - printf("%s get vb block error\n", __func__); - return K_FAILED; - } - - phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); - if (phys_addr == 0) - { - printf("%s get phys addr error\n", __func__); - return K_FAILED; - } - - virt_addr = (k_u32 *)kd_mpi_sys_mmap(phys_addr, size); - // virt_addr = (k_u32 *)kd_mpi_sys_mmap_cached(phys_addr, size); - - if (virt_addr == NULL) - { - printf("%s mmap error\n", __func__); - return K_FAILED; - } - - vf_info->mod_id = K_ID_VO; - vf_info->pool_id = g_pool_id; - vf_info->v_frame.phys_addr[0] = phys_addr; - if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) - vf_info->v_frame.phys_addr[1] = phys_addr + (vf_info->v_frame.height * vf_info->v_frame.stride[0]); - *pic_vaddr = virt_addr; - - printf("phys_addr is %lx g_pool_id is %d \n", phys_addr, g_pool_id); - - return handle; -} - -k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) -{ - k_vo_video_osd_attr attr; - - // set attr - attr.global_alptha = info->global_alptha; - - if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) - { - info->size = info->act_size.width * info->act_size.height * 4; - info->stride = info->act_size.width * 4 / 8; - } - else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) - { - info->size = info->act_size.width * info->act_size.height * 3; - info->stride = info->act_size.width * 3 / 8; - } - else if(info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else if(info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else - { - printf("set osd pixel format failed \n"); - } - - attr.stride = info->stride; - attr.pixel_format = info->format; - attr.display_rect = info->offset; - attr.img_size = info->act_size; - kd_mpi_vo_set_video_osd_attr(osd, &attr); - - kd_mpi_vo_osd_enable(osd); - - return 0; -} - -void sample_vicap_install_osd(void) -{ - osd_info osd; - - osd.act_size.width = osd_width ; - osd.act_size.height = osd_height; - osd.offset.x = 0; - osd.offset.y = 0; - osd.global_alptha = 0xff; - // osd.global_alptha = 0x32; - osd.format = PIXEL_FORMAT_ARGB_8888;//PIXEL_FORMAT_ARGB_4444; //PIXEL_FORMAT_ARGB_1555;//PIXEL_FORMAT_ARGB_8888; - - vo_creat_osd_test(osd_id, &osd); -} - -void vo_osd_release_block(void) -{ - if(vicap_install_osd == 1) - { - kd_mpi_vo_osd_disable(osd_id); - kd_mpi_vb_release_block(block); - } - -} - -static k_s32 sample_connector_init(void) -{ - k_u32 ret = 0; - k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) - k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; -#else - k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; -#endif - k_connector_info connector_info; - - memset(&connector_info, 0, sizeof(k_connector_info)); - - //connector get sensor info - ret = kd_mpi_get_connector_info(connector_type, &connector_info); - if (ret) { - printf("sample_vicap, the sensor type not supported!\n"); - return ret; - } - - connector_fd = kd_mpi_connector_open(connector_info.connector_name); - if (connector_fd < 0) { - printf("%s, connector open failed.\n", __func__); - return K_ERR_VO_NOTREADY; - } - - // set connect power - kd_mpi_connector_power_set(connector_fd, K_TRUE); - // connector init - kd_mpi_connector_init(connector_fd, connector_info); - - return 0; -} - -static k_s32 vo_layer_vdss_bind_vo_config(void) -{ - layer_info info; - - k_vo_layer chn_id = K_VO_LAYER1; - - memset(&info, 0, sizeof(info)); - - sample_connector_init(); - - // config lyaer - info.act_size.width = ISP_CHN0_WIDTH;//ISP_CHN0_HEIGHT;//1080;//640;//1080; - info.act_size.height = ISP_CHN0_HEIGHT;//ISP_CHN0_WIDTH;//1920;//480;//1920; - info.format = PIXEL_FORMAT_YVU_PLANAR_420; - info.func = 0;//K_ROTATION_180;////K_ROTATION_90; - info.global_alptha = 0xff; - info.offset.x = 0;//(1080-w)/2, - info.offset.y = 0;//(1920-h)/2; - vo_creat_layer_test(chn_id, &info); - - if(vicap_install_osd == 1) - sample_vicap_install_osd(); - - //exit ; - return 0; -} - -static void sample_vicap_bind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) -{ - k_s32 ret; - - ret = kd_mpi_sys_bind(&vicap_mpp_chn, &vo_mpp_chn); - if (ret) { - printf("kd_mpi_sys_unbind failed:0x%x\n", ret); - } - - return; -} - -static void sample_vicap_unbind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) -{ - k_s32 ret; - - ret = kd_mpi_sys_unbind(&vicap_mpp_chn, &vo_mpp_chn); - if (ret) { - printf("kd_mpi_sys_unbind failed:0x%x\n", ret); - } - - return; -} - -int vivcap_start() -{ - k_s32 ret = 0; - - k_u32 pool_id; - k_vb_pool_config pool_config; - - printf("sample_vicap ...\n"); - -#if defined(CONFIG_BOARD_K230_CANMV) - sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); -#else - sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; -#endif - vicap_dev = VICAP_DEV_ID_0; - - memset(&config, 0, sizeof(config)); - config.max_pool_cnt = 64; - //VB for YUV420SP output - config.comm_pool[0].blk_cnt = 5; - config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; - config.comm_pool[0].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), VICAP_ALIGN_1K); - - //VB for RGB888 output - config.comm_pool[1].blk_cnt = 5; - config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; - config.comm_pool[1].blk_size = VICAP_ALIGN_UP((SENSOR_HEIGHT * SENSOR_WIDTH * 3 ), VICAP_ALIGN_1K); - - ret = kd_mpi_vb_set_config(&config); - if (ret) { - printf("vb_set_config failed ret:%d\n", ret); - return ret; - } - - k_vb_supplement_config supplement_config; - memset(&supplement_config, 0, sizeof(supplement_config)); - supplement_config.supplement_config |= VB_SUPPLEMENT_JPEG_MASK; - - ret = kd_mpi_vb_set_supplement_config(&supplement_config); - if (ret) { - printf("vb_set_supplement_config failed ret:%d\n", ret); - return ret; - } - - ret = kd_mpi_vb_init(); - if (ret) { - printf("vb_init failed ret:%d\n", ret); - return ret; - } - printf("sample_vicap ...kd_mpi_vicap_get_sensor_info\n"); - - // dwc_dsi_init(); - vo_layer_vdss_bind_vo_config(); - - if(vicap_install_osd == 1) - { - memset(&pool_config, 0, sizeof(pool_config)); - pool_config.blk_size = VICAP_ALIGN_UP((osd_width * osd_height * 4 * 2), VICAP_ALIGN_1K); - pool_config.blk_cnt = 4; - pool_config.mode = VB_REMAP_MODE_NOCACHE; - pool_id = kd_mpi_vb_create_pool(&pool_config); // osd0 - 3 argb 320 x 240 - g_pool_id = pool_id; - - printf("--------aa--------------g_pool_id is %d pool_id is %d \n",g_pool_id, pool_id); - } - - memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); - ret = kd_mpi_vicap_get_sensor_info(sensor_type, &sensor_info); - if (ret) { - printf("sample_vicap, the sensor type not supported!\n"); - return ret; - } - - memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); - dev_attr.acq_win.h_start = 0; - dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) - dev_attr.acq_win.width = ISP_CHN0_WIDTH; - dev_attr.acq_win.height = ISP_CHN0_HEIGHT; -#else - dev_attr.acq_win.width = 2592;//SENSOR_HEIGHT; - dev_attr.acq_win.height = 1944;//SENSOR_WIDTH; -#endif - dev_attr.mode = VICAP_WORK_ONLINE_MODE; - - dev_attr.pipe_ctrl.data = 0xFFFFFFFF; - dev_attr.pipe_ctrl.bits.af_enable = 0; - dev_attr.pipe_ctrl.bits.ahdr_enable = 0; - - - dev_attr.cpature_frame = 0; - memcpy(&dev_attr.sensor_info, &sensor_info, sizeof(k_vicap_sensor_info)); - - ret = kd_mpi_vicap_set_dev_attr(vicap_dev, dev_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_dev_attr failed.\n"); - return ret; - } - - memset(&chn_attr, 0, sizeof(k_vicap_chn_attr)); - - //set chn0 output yuv420sp - chn_attr.out_win.h_start = 0; - chn_attr.out_win.v_start = 0; - chn_attr.out_win.width = ISP_CHN0_WIDTH; - chn_attr.out_win.height = ISP_CHN0_HEIGHT; - - -#if defined(CONFIG_BOARD_K230_CANMV) - chn_attr.crop_win = dev_attr.acq_win; -#else - // chn_attr.crop_win = dev_attr.acq_win; - chn_attr.crop_win.h_start = 768; - chn_attr.crop_win.v_start = 16; - chn_attr.crop_win.width = ISP_CHN0_WIDTH; - chn_attr.crop_win.height = ISP_CHN0_HEIGHT; -#endif - - chn_attr.scale_win = chn_attr.out_win; - chn_attr.crop_enable = K_FALSE; - chn_attr.scale_enable = K_FALSE; - // chn_attr.dw_enable = K_FALSE; - chn_attr.chn_enable = K_TRUE; - chn_attr.pix_format = PIXEL_FORMAT_YVU_PLANAR_420; - chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp - chn_attr.buffer_size = config.comm_pool[0].blk_size; - vicap_chn = VICAP_CHN_ID_0; - - printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); - ret = kd_mpi_vicap_set_chn_attr(vicap_dev, vicap_chn, chn_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); - return ret; - } - - //bind vicap chn 0 to vo - vicap_mpp_chn.mod_id = K_ID_VI; - vicap_mpp_chn.dev_id = vicap_dev; - vicap_mpp_chn.chn_id = vicap_chn; - - vo_mpp_chn.mod_id = K_ID_VO; - vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; - vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; - - sample_vicap_bind_vo(vicap_mpp_chn, vo_mpp_chn); - printf("sample_vicap ...dwc_dsi_init\n"); - - //set chn1 output rgb888p - chn_attr.out_win.h_start = 0; - chn_attr.out_win.v_start = 0; - chn_attr.out_win.width = SENSOR_WIDTH ; - chn_attr.out_win.height = SENSOR_HEIGHT; - // chn_attr.crop_win = dev_attr.acq_win; - -#if defined(CONFIG_BOARD_K230_CANMV) - chn_attr.crop_win = dev_attr.acq_win; -#else - chn_attr.crop_win.h_start = 768; - chn_attr.crop_win.v_start = 16; - chn_attr.crop_win.width = ISP_CHN0_WIDTH; - chn_attr.crop_win.height = ISP_CHN0_HEIGHT; -#endif - - chn_attr.scale_win = chn_attr.out_win; - chn_attr.crop_enable = K_FALSE; - chn_attr.scale_enable = K_FALSE; - // chn_attr.dw_enable = K_FALSE; - chn_attr.chn_enable = K_TRUE; - chn_attr.pix_format = PIXEL_FORMAT_BGR_888_PLANAR; - chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp - chn_attr.buffer_size = config.comm_pool[1].blk_size; - - printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); - ret = kd_mpi_vicap_set_chn_attr(vicap_dev, VICAP_CHN_ID_1, chn_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); - return ret; - } - - printf("sample_vicap ...kd_mpi_vicap_init\n"); - ret = kd_mpi_vicap_init(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - // goto err_exit; - } - - printf("sample_vicap ...kd_mpi_vicap_start_stream\n"); - ret = kd_mpi_vicap_start_stream(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - // goto err_exit; - } - - return ret; -} - -int vivcap_stop() -{ - printf("sample_vicap ...kd_mpi_vicap_stop_stream\n"); - int ret = kd_mpi_vicap_stop_stream(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - return ret; - } - - ret = kd_mpi_vicap_deinit(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_deinit failed.\n"); - return ret; - } - - kd_mpi_vo_disable_video_layer(K_VO_LAYER1); - - vicap_mpp_chn.mod_id = K_ID_VI; - vicap_mpp_chn.dev_id = vicap_dev; - vicap_mpp_chn.chn_id = vicap_chn; - - vo_mpp_chn.mod_id = K_ID_VO; - vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; - vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; - - sample_vicap_unbind_vo(vicap_mpp_chn, vo_mpp_chn); - - /*Allow one frame time for the VO to release the VB block*/ - k_u32 display_ms = 1000 / 33; - usleep(1000 * display_ms); - - ret = kd_mpi_vb_exit(); - if (ret) { - printf("sample_vicap, kd_mpi_vb_exit failed.\n"); - return ret; - } - - return 0; -} - -void yuv_rotate_90(char *des, char *src,int width,int height) -{ - int n = 0; - int hw = width>>1; - int hh = height>>1; - int size = width * height; - int hsize = size>>2; - - int pos = 0; - - for(int i = width-1;i >= 0;i--) - { - pos = 0; - for(int j= 0;j < height;j++) - { - des[n++]= src[pos+i]; - pos += width; - } - } - +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include + +#include "mpi_sys_api.h" + +/* vicap */ +#include +#include +#include +#include +#include + +#include "k_module.h" +#include "k_type.h" +#include "k_vb_comm.h" +#include "k_video_comm.h" +#include "k_sys_comm.h" +#include "mpi_vb_api.h" +#include "mpi_vicap_api.h" +#include "mpi_isp_api.h" +#include "mpi_sys_api.h" +#include "k_vo_comm.h" +#include "mpi_vo_api.h" + +#include "vo_test_case.h" + +#include "k_connector_comm.h" +#include "mpi_connector_api.h" +#include "k_autoconf_comm.h" + + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) +#define SENSOR_CHANNEL (3) // isp通道数 +#define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 +#define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 +#define ISP_CHN0_WIDTH (1920)//(1920) +#define ISP_CHN0_HEIGHT (1080)//(1080) +#define vicap_install_osd (1) +#define osd_id K_VO_OSD3 +#define osd_width (1920) +#define osd_height (1080) +#else +#define SENSOR_CHANNEL (3) // isp通道数 +#define SENSOR_HEIGHT (1280) // isp高度,ai输入,竖屏 +#define SENSOR_WIDTH (720) // isp宽度,ai输入,竖屏 +#define ISP_CHN0_WIDTH (1088)//(1920) +#define ISP_CHN0_HEIGHT (1920)//(1080) +#define vicap_install_osd (1) +#define osd_id K_VO_OSD3 +#define osd_width (1080) +#define osd_height (1920) +#endif + + +k_vb_config config; +k_vicap_dev vicap_dev; +k_vicap_chn vicap_chn; +k_vicap_dev_attr dev_attr; +k_vicap_chn_attr chn_attr; +k_vicap_sensor_info sensor_info; +k_vicap_sensor_type sensor_type; +k_mpp_chn vicap_mpp_chn; +k_mpp_chn vo_mpp_chn; + +k_video_frame_info dump_info; + +k_vo_draw_frame vo_frame = (k_vo_draw_frame) { + 1, + 16, + 16, + 128, + 128, + 1 +}; + +static k_vb_blk_handle block; +k_u32 g_pool_id; + +int vo_creat_layer_test(k_vo_layer chn_id, layer_info *info) +{ + k_vo_video_layer_attr attr; + + // check layer + if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) + || ((info->func != 0) && (chn_id == K_VO_LAYER2))) + { + printf("input layer num failed \n"); + return -1 ; + } + + // check scaler + + // set offset + attr.display_rect = info->offset; + // set act + attr.img_size = info->act_size; + // sget size + info->size = info->act_size.height * info->act_size.width * 3 / 2; + //set pixel format + attr.pixel_format = info->format; + if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) + { + printf("input pix format failed \n"); + return -1; + } + // set stride + attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); + // set function + attr.func = info->func; + // set scaler attr + attr.scaler_attr = info->attr; + + // set video layer atrr + kd_mpi_vo_set_video_layer_attr(chn_id, &attr); + + // enable layer + kd_mpi_vo_enable_video_layer(chn_id); + + return 0; +} + +k_vb_blk_handle vo_insert_frame(k_video_frame_info *vf_info, void **pic_vaddr) +{ + k_u64 phys_addr = 0; + k_u32 *virt_addr; + k_vb_blk_handle handle; + k_s32 size; + + if (vf_info == NULL) + return K_FALSE; + + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_8888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_8888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 4; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_565 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_565) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_4444 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_4444) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_1555 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_1555) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3 / 2; + + size = size + 4096; // 强制4K ,后边得删了 + + printf("vb block size is %x \n", size); + + handle = kd_mpi_vb_get_block(g_pool_id, size, NULL); + if (handle == VB_INVALID_HANDLE) + { + printf("%s get vb block error\n", __func__); + return K_FAILED; + } + + phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); + if (phys_addr == 0) + { + printf("%s get phys addr error\n", __func__); + return K_FAILED; + } + + virt_addr = (k_u32 *)kd_mpi_sys_mmap(phys_addr, size); + // virt_addr = (k_u32 *)kd_mpi_sys_mmap_cached(phys_addr, size); + + if (virt_addr == NULL) + { + printf("%s mmap error\n", __func__); + return K_FAILED; + } + + vf_info->mod_id = K_ID_VO; + vf_info->pool_id = g_pool_id; + vf_info->v_frame.phys_addr[0] = phys_addr; + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + vf_info->v_frame.phys_addr[1] = phys_addr + (vf_info->v_frame.height * vf_info->v_frame.stride[0]); + *pic_vaddr = virt_addr; + + printf("phys_addr is %lx g_pool_id is %d \n", phys_addr, g_pool_id); + + return handle; +} + +k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) +{ + k_vo_video_osd_attr attr; + + // set attr + attr.global_alptha = info->global_alptha; + + if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) + { + info->size = info->act_size.width * info->act_size.height * 4; + info->stride = info->act_size.width * 4 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) + { + info->size = info->act_size.width * info->act_size.height * 3; + info->stride = info->act_size.width * 3 / 8; + } + else if(info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if(info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else + { + printf("set osd pixel format failed \n"); + } + + attr.stride = info->stride; + attr.pixel_format = info->format; + attr.display_rect = info->offset; + attr.img_size = info->act_size; + kd_mpi_vo_set_video_osd_attr(osd, &attr); + + kd_mpi_vo_osd_enable(osd); + + return 0; +} + +void sample_vicap_install_osd(void) +{ + osd_info osd; + + osd.act_size.width = osd_width ; + osd.act_size.height = osd_height; + osd.offset.x = 0; + osd.offset.y = 0; + osd.global_alptha = 0xff; + // osd.global_alptha = 0x32; + osd.format = PIXEL_FORMAT_ARGB_8888;//PIXEL_FORMAT_ARGB_4444; //PIXEL_FORMAT_ARGB_1555;//PIXEL_FORMAT_ARGB_8888; + + vo_creat_osd_test(osd_id, &osd); +} + +void vo_osd_release_block(void) +{ + if(vicap_install_osd == 1) + { + kd_mpi_vo_osd_disable(osd_id); + kd_mpi_vb_release_block(block); + } + +} + +static k_s32 sample_connector_init(void) +{ + k_u32 ret = 0; + k_s32 connector_fd; +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#else + k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#endif + k_connector_info connector_info; + + memset(&connector_info, 0, sizeof(k_connector_info)); + + //connector get sensor info + ret = kd_mpi_get_connector_info(connector_type, &connector_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + + connector_fd = kd_mpi_connector_open(connector_info.connector_name); + if (connector_fd < 0) { + printf("%s, connector open failed.\n", __func__); + return K_ERR_VO_NOTREADY; + } + + // set connect power + kd_mpi_connector_power_set(connector_fd, K_TRUE); + // connector init + kd_mpi_connector_init(connector_fd, connector_info); + + return 0; +} + +static k_s32 vo_layer_vdss_bind_vo_config(void) +{ + layer_info info; + + k_vo_layer chn_id = K_VO_LAYER1; + + memset(&info, 0, sizeof(info)); + + sample_connector_init(); + + // config lyaer + info.act_size.width = ISP_CHN0_WIDTH;//ISP_CHN0_HEIGHT;//1080;//640;//1080; + info.act_size.height = ISP_CHN0_HEIGHT;//ISP_CHN0_WIDTH;//1920;//480;//1920; + info.format = PIXEL_FORMAT_YVU_PLANAR_420; + info.func = 0;//K_ROTATION_180;////K_ROTATION_90; + info.global_alptha = 0xff; + info.offset.x = 0;//(1080-w)/2, + info.offset.y = 0;//(1920-h)/2; + vo_creat_layer_test(chn_id, &info); + + if(vicap_install_osd == 1) + sample_vicap_install_osd(); + + //exit ; + return 0; +} + +static void sample_vicap_bind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) +{ + k_s32 ret; + + ret = kd_mpi_sys_bind(&vicap_mpp_chn, &vo_mpp_chn); + if (ret) { + printf("kd_mpi_sys_unbind failed:0x%x\n", ret); + } + + return; +} + +static void sample_vicap_unbind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) +{ + k_s32 ret; + + ret = kd_mpi_sys_unbind(&vicap_mpp_chn, &vo_mpp_chn); + if (ret) { + printf("kd_mpi_sys_unbind failed:0x%x\n", ret); + } + + return; +} + +int vivcap_start() +{ + k_s32 ret = 0; + + k_u32 pool_id; + k_vb_pool_config pool_config; + + printf("sample_vicap ...\n"); + +#if defined(CONFIG_BOARD_K230_CANMV) + sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; +#else + sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; +#endif + vicap_dev = VICAP_DEV_ID_0; + + memset(&config, 0, sizeof(config)); + config.max_pool_cnt = 64; + //VB for YUV420SP output + config.comm_pool[0].blk_cnt = 5; + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[0].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), VICAP_ALIGN_1K); + + //VB for RGB888 output + config.comm_pool[1].blk_cnt = 5; + config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[1].blk_size = VICAP_ALIGN_UP((SENSOR_HEIGHT * SENSOR_WIDTH * 3 ), VICAP_ALIGN_1K); + + ret = kd_mpi_vb_set_config(&config); + if (ret) { + printf("vb_set_config failed ret:%d\n", ret); + return ret; + } + + k_vb_supplement_config supplement_config; + memset(&supplement_config, 0, sizeof(supplement_config)); + supplement_config.supplement_config |= VB_SUPPLEMENT_JPEG_MASK; + + ret = kd_mpi_vb_set_supplement_config(&supplement_config); + if (ret) { + printf("vb_set_supplement_config failed ret:%d\n", ret); + return ret; + } + + ret = kd_mpi_vb_init(); + if (ret) { + printf("vb_init failed ret:%d\n", ret); + return ret; + } + printf("sample_vicap ...kd_mpi_vicap_get_sensor_info\n"); + + // dwc_dsi_init(); + vo_layer_vdss_bind_vo_config(); + + if(vicap_install_osd == 1) + { + memset(&pool_config, 0, sizeof(pool_config)); + pool_config.blk_size = VICAP_ALIGN_UP((osd_width * osd_height * 4 * 2), VICAP_ALIGN_1K); + pool_config.blk_cnt = 4; + pool_config.mode = VB_REMAP_MODE_NOCACHE; + pool_id = kd_mpi_vb_create_pool(&pool_config); // osd0 - 3 argb 320 x 240 + g_pool_id = pool_id; + + printf("--------aa--------------g_pool_id is %d pool_id is %d \n",g_pool_id, pool_id); + } + + memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); + ret = kd_mpi_vicap_get_sensor_info(sensor_type, &sensor_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + + memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); + dev_attr.acq_win.h_start = 0; + dev_attr.acq_win.v_start = 0; +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + dev_attr.acq_win.width = ISP_CHN0_WIDTH; + dev_attr.acq_win.height = ISP_CHN0_HEIGHT; +#else + dev_attr.acq_win.width = 2592;//SENSOR_HEIGHT; + dev_attr.acq_win.height = 1944;//SENSOR_WIDTH; +#endif + dev_attr.mode = VICAP_WORK_ONLINE_MODE; + + dev_attr.pipe_ctrl.data = 0xFFFFFFFF; + dev_attr.pipe_ctrl.bits.af_enable = 0; + dev_attr.pipe_ctrl.bits.ahdr_enable = 0; + + + dev_attr.cpature_frame = 0; + memcpy(&dev_attr.sensor_info, &sensor_info, sizeof(k_vicap_sensor_info)); + + ret = kd_mpi_vicap_set_dev_attr(vicap_dev, dev_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_dev_attr failed.\n"); + return ret; + } + + memset(&chn_attr, 0, sizeof(k_vicap_chn_attr)); + + //set chn0 output yuv420sp + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = ISP_CHN0_WIDTH; + chn_attr.out_win.height = ISP_CHN0_HEIGHT; + + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + chn_attr.crop_win = dev_attr.acq_win; +#else + // chn_attr.crop_win = dev_attr.acq_win; + chn_attr.crop_win.h_start = 768; + chn_attr.crop_win.v_start = 16; + chn_attr.crop_win.width = ISP_CHN0_WIDTH; + chn_attr.crop_win.height = ISP_CHN0_HEIGHT; +#endif + + chn_attr.scale_win = chn_attr.out_win; + chn_attr.crop_enable = K_FALSE; + chn_attr.scale_enable = K_FALSE; + // chn_attr.dw_enable = K_FALSE; + chn_attr.chn_enable = K_TRUE; + chn_attr.pix_format = PIXEL_FORMAT_YVU_PLANAR_420; + chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp + chn_attr.buffer_size = config.comm_pool[0].blk_size; + vicap_chn = VICAP_CHN_ID_0; + + printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); + ret = kd_mpi_vicap_set_chn_attr(vicap_dev, vicap_chn, chn_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); + return ret; + } + + //bind vicap chn 0 to vo + vicap_mpp_chn.mod_id = K_ID_VI; + vicap_mpp_chn.dev_id = vicap_dev; + vicap_mpp_chn.chn_id = vicap_chn; + + vo_mpp_chn.mod_id = K_ID_VO; + vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; + vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; + + sample_vicap_bind_vo(vicap_mpp_chn, vo_mpp_chn); + printf("sample_vicap ...dwc_dsi_init\n"); + + //set chn1 output rgb888p + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = SENSOR_WIDTH ; + chn_attr.out_win.height = SENSOR_HEIGHT; + // chn_attr.crop_win = dev_attr.acq_win; + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + chn_attr.crop_win = dev_attr.acq_win; +#else + chn_attr.crop_win.h_start = 768; + chn_attr.crop_win.v_start = 16; + chn_attr.crop_win.width = ISP_CHN0_WIDTH; + chn_attr.crop_win.height = ISP_CHN0_HEIGHT; +#endif + + chn_attr.scale_win = chn_attr.out_win; + chn_attr.crop_enable = K_FALSE; + chn_attr.scale_enable = K_FALSE; + // chn_attr.dw_enable = K_FALSE; + chn_attr.chn_enable = K_TRUE; + chn_attr.pix_format = PIXEL_FORMAT_BGR_888_PLANAR; + chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp + chn_attr.buffer_size = config.comm_pool[1].blk_size; + + printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); + ret = kd_mpi_vicap_set_chn_attr(vicap_dev, VICAP_CHN_ID_1, chn_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); + return ret; + } + + printf("sample_vicap ...kd_mpi_vicap_init\n"); + ret = kd_mpi_vicap_init(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + // goto err_exit; + } + + printf("sample_vicap ...kd_mpi_vicap_start_stream\n"); + ret = kd_mpi_vicap_start_stream(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + // goto err_exit; + } + + return ret; +} + +int vivcap_stop() +{ + printf("sample_vicap ...kd_mpi_vicap_stop_stream\n"); + int ret = kd_mpi_vicap_stop_stream(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + return ret; + } + + ret = kd_mpi_vicap_deinit(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_deinit failed.\n"); + return ret; + } + + kd_mpi_vo_disable_video_layer(K_VO_LAYER1); + + vicap_mpp_chn.mod_id = K_ID_VI; + vicap_mpp_chn.dev_id = vicap_dev; + vicap_mpp_chn.chn_id = vicap_chn; + + vo_mpp_chn.mod_id = K_ID_VO; + vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; + vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; + + sample_vicap_unbind_vo(vicap_mpp_chn, vo_mpp_chn); + + /*Allow one frame time for the VO to release the VB block*/ + k_u32 display_ms = 1000 / 33; + usleep(1000 * display_ms); + + ret = kd_mpi_vb_exit(); + if (ret) { + printf("sample_vicap, kd_mpi_vb_exit failed.\n"); + return ret; + } + + return 0; +} + +void yuv_rotate_90(char *des, char *src,int width,int height) +{ + int n = 0; + int hw = width>>1; + int hh = height>>1; + int size = width * height; + int hsize = size>>2; + + int pos = 0; + + for(int i = width-1;i >= 0;i--) + { + pos = 0; + for(int j= 0;j < height;j++) + { + des[n++]= src[pos+i]; + pos += width; + } + } + } \ No newline at end of file diff --git a/src/reference/ai_poc/object_detect_yolov8n/vi_vo.h b/src/reference/ai_poc/object_detect_yolov8n/vi_vo.h index f0c1bccc5..0a11a4d31 100644 --- a/src/reference/ai_poc/object_detect_yolov8n/vi_vo.h +++ b/src/reference/ai_poc/object_detect_yolov8n/vi_vo.h @@ -57,7 +57,7 @@ #include "k_autoconf_comm.h" -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) #define SENSOR_CHANNEL (3) // isp通道数 #define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 #define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 @@ -286,7 +286,7 @@ static k_s32 sample_connector_init(void) { k_u32 ret = 0; k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; #else k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; @@ -378,7 +378,8 @@ int vivcap_start() #if defined(CONFIG_BOARD_K230_CANMV) sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; #else sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; #endif @@ -444,7 +445,7 @@ int vivcap_start() memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); dev_attr.acq_win.h_start = 0; dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) dev_attr.acq_win.width = ISP_CHN0_WIDTH; dev_attr.acq_win.height = ISP_CHN0_HEIGHT; #else @@ -476,7 +477,7 @@ int vivcap_start() chn_attr.out_win.height = ISP_CHN0_HEIGHT; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else // chn_attr.crop_win = dev_attr.acq_win; @@ -522,7 +523,7 @@ int vivcap_start() chn_attr.out_win.height = SENSOR_HEIGHT; // chn_attr.crop_win = dev_attr.acq_win; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else chn_attr.crop_win.h_start = 768; diff --git a/src/reference/ai_poc/ocr/vi_vo.h b/src/reference/ai_poc/ocr/vi_vo.h index f0c1bccc5..0a11a4d31 100644 --- a/src/reference/ai_poc/ocr/vi_vo.h +++ b/src/reference/ai_poc/ocr/vi_vo.h @@ -57,7 +57,7 @@ #include "k_autoconf_comm.h" -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) #define SENSOR_CHANNEL (3) // isp通道数 #define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 #define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 @@ -286,7 +286,7 @@ static k_s32 sample_connector_init(void) { k_u32 ret = 0; k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; #else k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; @@ -378,7 +378,8 @@ int vivcap_start() #if defined(CONFIG_BOARD_K230_CANMV) sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; #else sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; #endif @@ -444,7 +445,7 @@ int vivcap_start() memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); dev_attr.acq_win.h_start = 0; dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) dev_attr.acq_win.width = ISP_CHN0_WIDTH; dev_attr.acq_win.height = ISP_CHN0_HEIGHT; #else @@ -476,7 +477,7 @@ int vivcap_start() chn_attr.out_win.height = ISP_CHN0_HEIGHT; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else // chn_attr.crop_win = dev_attr.acq_win; @@ -522,7 +523,7 @@ int vivcap_start() chn_attr.out_win.height = SENSOR_HEIGHT; // chn_attr.crop_win = dev_attr.acq_win; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else chn_attr.crop_win.h_start = 768; diff --git a/src/reference/ai_poc/person_attr/vi_vo.h b/src/reference/ai_poc/person_attr/vi_vo.h index e3d8bdba4..0a11a4d31 100644 --- a/src/reference/ai_poc/person_attr/vi_vo.h +++ b/src/reference/ai_poc/person_attr/vi_vo.h @@ -1,627 +1,628 @@ -/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include -#include -#include - -#include "mpi_sys_api.h" - -/* vicap */ -#include -#include -#include -#include -#include - -#include "k_module.h" -#include "k_type.h" -#include "k_vb_comm.h" -#include "k_video_comm.h" -#include "k_sys_comm.h" -#include "mpi_vb_api.h" -#include "mpi_vicap_api.h" -#include "mpi_isp_api.h" -#include "mpi_sys_api.h" -#include "k_vo_comm.h" -#include "mpi_vo_api.h" - -#include "vo_test_case.h" - -#include "k_connector_comm.h" -#include "mpi_connector_api.h" -#include "k_autoconf_comm.h" - - -#if defined(CONFIG_BOARD_K230_CANMV) -#define SENSOR_CHANNEL (3) // isp通道数 -#define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 -#define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 -#define ISP_CHN0_WIDTH (1920)//(1920) -#define ISP_CHN0_HEIGHT (1080)//(1080) -#define vicap_install_osd (1) -#define osd_id K_VO_OSD3 -#define osd_width (1920) -#define osd_height (1080) -#else -#define SENSOR_CHANNEL (3) // isp通道数 -#define SENSOR_HEIGHT (1280) // isp高度,ai输入,竖屏 -#define SENSOR_WIDTH (720) // isp宽度,ai输入,竖屏 -#define ISP_CHN0_WIDTH (1088)//(1920) -#define ISP_CHN0_HEIGHT (1920)//(1080) -#define vicap_install_osd (1) -#define osd_id K_VO_OSD3 -#define osd_width (1080) -#define osd_height (1920) -#endif - - -k_vb_config config; -k_vicap_dev vicap_dev; -k_vicap_chn vicap_chn; -k_vicap_dev_attr dev_attr; -k_vicap_chn_attr chn_attr; -k_vicap_sensor_info sensor_info; -k_vicap_sensor_type sensor_type; -k_mpp_chn vicap_mpp_chn; -k_mpp_chn vo_mpp_chn; - -k_video_frame_info dump_info; - -k_vo_draw_frame vo_frame = (k_vo_draw_frame) { - 1, - 16, - 16, - 128, - 128, - 1 -}; - -static k_vb_blk_handle block; -k_u32 g_pool_id; - -int vo_creat_layer_test(k_vo_layer chn_id, layer_info *info) -{ - k_vo_video_layer_attr attr; - - // check layer - if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) - || ((info->func != 0) && (chn_id == K_VO_LAYER2))) - { - printf("input layer num failed \n"); - return -1 ; - } - - // check scaler - - // set offset - attr.display_rect = info->offset; - // set act - attr.img_size = info->act_size; - // sget size - info->size = info->act_size.height * info->act_size.width * 3 / 2; - //set pixel format - attr.pixel_format = info->format; - if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) - { - printf("input pix format failed \n"); - return -1; - } - // set stride - attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); - // set function - attr.func = info->func; - // set scaler attr - attr.scaler_attr = info->attr; - - // set video layer atrr - kd_mpi_vo_set_video_layer_attr(chn_id, &attr); - - // enable layer - kd_mpi_vo_enable_video_layer(chn_id); - - return 0; -} - -k_vb_blk_handle vo_insert_frame(k_video_frame_info *vf_info, void **pic_vaddr) -{ - k_u64 phys_addr = 0; - k_u32 *virt_addr; - k_vb_blk_handle handle; - k_s32 size; - - if (vf_info == NULL) - return K_FALSE; - - if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_8888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_8888) - size = vf_info->v_frame.height * vf_info->v_frame.width * 4; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_565 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_565) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_4444 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_4444) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_888) - size = vf_info->v_frame.height * vf_info->v_frame.width * 3; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_1555 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_1555) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) - size = vf_info->v_frame.height * vf_info->v_frame.width * 3 / 2; - - size = size + 4096; // 强制4K ,后边得删了 - - printf("vb block size is %x \n", size); - - handle = kd_mpi_vb_get_block(g_pool_id, size, NULL); - if (handle == VB_INVALID_HANDLE) - { - printf("%s get vb block error\n", __func__); - return K_FAILED; - } - - phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); - if (phys_addr == 0) - { - printf("%s get phys addr error\n", __func__); - return K_FAILED; - } - - virt_addr = (k_u32 *)kd_mpi_sys_mmap(phys_addr, size); - // virt_addr = (k_u32 *)kd_mpi_sys_mmap_cached(phys_addr, size); - - if (virt_addr == NULL) - { - printf("%s mmap error\n", __func__); - return K_FAILED; - } - - vf_info->mod_id = K_ID_VO; - vf_info->pool_id = g_pool_id; - vf_info->v_frame.phys_addr[0] = phys_addr; - if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) - vf_info->v_frame.phys_addr[1] = phys_addr + (vf_info->v_frame.height * vf_info->v_frame.stride[0]); - *pic_vaddr = virt_addr; - - printf("phys_addr is %lx g_pool_id is %d \n", phys_addr, g_pool_id); - - return handle; -} - -k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) -{ - k_vo_video_osd_attr attr; - - // set attr - attr.global_alptha = info->global_alptha; - - if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) - { - info->size = info->act_size.width * info->act_size.height * 4; - info->stride = info->act_size.width * 4 / 8; - } - else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) - { - info->size = info->act_size.width * info->act_size.height * 3; - info->stride = info->act_size.width * 3 / 8; - } - else if(info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else if(info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else - { - printf("set osd pixel format failed \n"); - } - - attr.stride = info->stride; - attr.pixel_format = info->format; - attr.display_rect = info->offset; - attr.img_size = info->act_size; - kd_mpi_vo_set_video_osd_attr(osd, &attr); - - kd_mpi_vo_osd_enable(osd); - - return 0; -} - -void sample_vicap_install_osd(void) -{ - osd_info osd; - - osd.act_size.width = osd_width ; - osd.act_size.height = osd_height; - osd.offset.x = 0; - osd.offset.y = 0; - osd.global_alptha = 0xff; - // osd.global_alptha = 0x32; - osd.format = PIXEL_FORMAT_ARGB_8888;//PIXEL_FORMAT_ARGB_4444; //PIXEL_FORMAT_ARGB_1555;//PIXEL_FORMAT_ARGB_8888; - - vo_creat_osd_test(osd_id, &osd); -} - -void vo_osd_release_block(void) -{ - if(vicap_install_osd == 1) - { - kd_mpi_vo_osd_disable(osd_id); - kd_mpi_vb_release_block(block); - } - -} - -static k_s32 sample_connector_init(void) -{ - k_u32 ret = 0; - k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) - k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; -#else - k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; -#endif - k_connector_info connector_info; - - memset(&connector_info, 0, sizeof(k_connector_info)); - - //connector get sensor info - ret = kd_mpi_get_connector_info(connector_type, &connector_info); - if (ret) { - printf("sample_vicap, the sensor type not supported!\n"); - return ret; - } - - connector_fd = kd_mpi_connector_open(connector_info.connector_name); - if (connector_fd < 0) { - printf("%s, connector open failed.\n", __func__); - return K_ERR_VO_NOTREADY; - } - - // set connect power - kd_mpi_connector_power_set(connector_fd, K_TRUE); - // connector init - kd_mpi_connector_init(connector_fd, connector_info); - - return 0; -} - -static k_s32 vo_layer_vdss_bind_vo_config(void) -{ - layer_info info; - - k_vo_layer chn_id = K_VO_LAYER1; - - memset(&info, 0, sizeof(info)); - - sample_connector_init(); - - // config lyaer - info.act_size.width = ISP_CHN0_WIDTH;//ISP_CHN0_HEIGHT;//1080;//640;//1080; - info.act_size.height = ISP_CHN0_HEIGHT;//ISP_CHN0_WIDTH;//1920;//480;//1920; - info.format = PIXEL_FORMAT_YVU_PLANAR_420; - info.func = 0;//K_ROTATION_180;////K_ROTATION_90; - info.global_alptha = 0xff; - info.offset.x = 0;//(1080-w)/2, - info.offset.y = 0;//(1920-h)/2; - vo_creat_layer_test(chn_id, &info); - - if(vicap_install_osd == 1) - sample_vicap_install_osd(); - - //exit ; - return 0; -} - -static void sample_vicap_bind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) -{ - k_s32 ret; - - ret = kd_mpi_sys_bind(&vicap_mpp_chn, &vo_mpp_chn); - if (ret) { - printf("kd_mpi_sys_unbind failed:0x%x\n", ret); - } - - return; -} - -static void sample_vicap_unbind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) -{ - k_s32 ret; - - ret = kd_mpi_sys_unbind(&vicap_mpp_chn, &vo_mpp_chn); - if (ret) { - printf("kd_mpi_sys_unbind failed:0x%x\n", ret); - } - - return; -} - -int vivcap_start() -{ - k_s32 ret = 0; - - k_u32 pool_id; - k_vb_pool_config pool_config; - - printf("sample_vicap ...\n"); - -#if defined(CONFIG_BOARD_K230_CANMV) - sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); -#else - sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; -#endif - vicap_dev = VICAP_DEV_ID_0; - - memset(&config, 0, sizeof(config)); - config.max_pool_cnt = 64; - //VB for YUV420SP output - config.comm_pool[0].blk_cnt = 5; - config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; - config.comm_pool[0].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), VICAP_ALIGN_1K); - - //VB for RGB888 output - config.comm_pool[1].blk_cnt = 5; - config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; - config.comm_pool[1].blk_size = VICAP_ALIGN_UP((SENSOR_HEIGHT * SENSOR_WIDTH * 3 ), VICAP_ALIGN_1K); - - ret = kd_mpi_vb_set_config(&config); - if (ret) { - printf("vb_set_config failed ret:%d\n", ret); - return ret; - } - - k_vb_supplement_config supplement_config; - memset(&supplement_config, 0, sizeof(supplement_config)); - supplement_config.supplement_config |= VB_SUPPLEMENT_JPEG_MASK; - - ret = kd_mpi_vb_set_supplement_config(&supplement_config); - if (ret) { - printf("vb_set_supplement_config failed ret:%d\n", ret); - return ret; - } - - ret = kd_mpi_vb_init(); - if (ret) { - printf("vb_init failed ret:%d\n", ret); - return ret; - } - printf("sample_vicap ...kd_mpi_vicap_get_sensor_info\n"); - - // dwc_dsi_init(); - vo_layer_vdss_bind_vo_config(); - - if(vicap_install_osd == 1) - { - memset(&pool_config, 0, sizeof(pool_config)); - pool_config.blk_size = VICAP_ALIGN_UP((osd_width * osd_height * 4 * 2), VICAP_ALIGN_1K); - pool_config.blk_cnt = 4; - pool_config.mode = VB_REMAP_MODE_NOCACHE; - pool_id = kd_mpi_vb_create_pool(&pool_config); // osd0 - 3 argb 320 x 240 - g_pool_id = pool_id; - - printf("--------aa--------------g_pool_id is %d pool_id is %d \n",g_pool_id, pool_id); - } - - memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); - ret = kd_mpi_vicap_get_sensor_info(sensor_type, &sensor_info); - if (ret) { - printf("sample_vicap, the sensor type not supported!\n"); - return ret; - } - - memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); - dev_attr.acq_win.h_start = 0; - dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) - dev_attr.acq_win.width = ISP_CHN0_WIDTH; - dev_attr.acq_win.height = ISP_CHN0_HEIGHT; -#else - dev_attr.acq_win.width = 2592;//SENSOR_HEIGHT; - dev_attr.acq_win.height = 1944;//SENSOR_WIDTH; -#endif - dev_attr.mode = VICAP_WORK_ONLINE_MODE; - - dev_attr.pipe_ctrl.data = 0xFFFFFFFF; - dev_attr.pipe_ctrl.bits.af_enable = 0; - dev_attr.pipe_ctrl.bits.ahdr_enable = 0; - - - dev_attr.cpature_frame = 0; - memcpy(&dev_attr.sensor_info, &sensor_info, sizeof(k_vicap_sensor_info)); - - ret = kd_mpi_vicap_set_dev_attr(vicap_dev, dev_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_dev_attr failed.\n"); - return ret; - } - - memset(&chn_attr, 0, sizeof(k_vicap_chn_attr)); - - //set chn0 output yuv420sp - chn_attr.out_win.h_start = 0; - chn_attr.out_win.v_start = 0; - chn_attr.out_win.width = ISP_CHN0_WIDTH; - chn_attr.out_win.height = ISP_CHN0_HEIGHT; - - -#if defined(CONFIG_BOARD_K230_CANMV) - chn_attr.crop_win = dev_attr.acq_win; -#else - // chn_attr.crop_win = dev_attr.acq_win; - chn_attr.crop_win.h_start = 768; - chn_attr.crop_win.v_start = 16; - chn_attr.crop_win.width = ISP_CHN0_WIDTH; - chn_attr.crop_win.height = ISP_CHN0_HEIGHT; -#endif - - chn_attr.scale_win = chn_attr.out_win; - chn_attr.crop_enable = K_FALSE; - chn_attr.scale_enable = K_FALSE; - // chn_attr.dw_enable = K_FALSE; - chn_attr.chn_enable = K_TRUE; - chn_attr.pix_format = PIXEL_FORMAT_YVU_PLANAR_420; - chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp - chn_attr.buffer_size = config.comm_pool[0].blk_size; - vicap_chn = VICAP_CHN_ID_0; - - printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); - ret = kd_mpi_vicap_set_chn_attr(vicap_dev, vicap_chn, chn_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); - return ret; - } - - //bind vicap chn 0 to vo - vicap_mpp_chn.mod_id = K_ID_VI; - vicap_mpp_chn.dev_id = vicap_dev; - vicap_mpp_chn.chn_id = vicap_chn; - - vo_mpp_chn.mod_id = K_ID_VO; - vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; - vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; - - sample_vicap_bind_vo(vicap_mpp_chn, vo_mpp_chn); - printf("sample_vicap ...dwc_dsi_init\n"); - - //set chn1 output rgb888p - chn_attr.out_win.h_start = 0; - chn_attr.out_win.v_start = 0; - chn_attr.out_win.width = SENSOR_WIDTH ; - chn_attr.out_win.height = SENSOR_HEIGHT; - // chn_attr.crop_win = dev_attr.acq_win; - -#if defined(CONFIG_BOARD_K230_CANMV) - chn_attr.crop_win = dev_attr.acq_win; -#else - chn_attr.crop_win.h_start = 768; - chn_attr.crop_win.v_start = 16; - chn_attr.crop_win.width = ISP_CHN0_WIDTH; - chn_attr.crop_win.height = ISP_CHN0_HEIGHT; -#endif - - chn_attr.scale_win = chn_attr.out_win; - chn_attr.crop_enable = K_FALSE; - chn_attr.scale_enable = K_FALSE; - // chn_attr.dw_enable = K_FALSE; - chn_attr.chn_enable = K_TRUE; - chn_attr.pix_format = PIXEL_FORMAT_BGR_888_PLANAR; - chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp - chn_attr.buffer_size = config.comm_pool[1].blk_size; - - printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); - ret = kd_mpi_vicap_set_chn_attr(vicap_dev, VICAP_CHN_ID_1, chn_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); - return ret; - } - - printf("sample_vicap ...kd_mpi_vicap_init\n"); - ret = kd_mpi_vicap_init(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - // goto err_exit; - } - - printf("sample_vicap ...kd_mpi_vicap_start_stream\n"); - ret = kd_mpi_vicap_start_stream(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - // goto err_exit; - } - - return ret; -} - -int vivcap_stop() -{ - printf("sample_vicap ...kd_mpi_vicap_stop_stream\n"); - int ret = kd_mpi_vicap_stop_stream(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - return ret; - } - - ret = kd_mpi_vicap_deinit(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_deinit failed.\n"); - return ret; - } - - kd_mpi_vo_disable_video_layer(K_VO_LAYER1); - - vicap_mpp_chn.mod_id = K_ID_VI; - vicap_mpp_chn.dev_id = vicap_dev; - vicap_mpp_chn.chn_id = vicap_chn; - - vo_mpp_chn.mod_id = K_ID_VO; - vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; - vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; - - sample_vicap_unbind_vo(vicap_mpp_chn, vo_mpp_chn); - - /*Allow one frame time for the VO to release the VB block*/ - k_u32 display_ms = 1000 / 33; - usleep(1000 * display_ms); - - ret = kd_mpi_vb_exit(); - if (ret) { - printf("sample_vicap, kd_mpi_vb_exit failed.\n"); - return ret; - } - - return 0; -} - -void yuv_rotate_90(char *des, char *src,int width,int height) -{ - int n = 0; - int hw = width>>1; - int hh = height>>1; - int size = width * height; - int hsize = size>>2; - - int pos = 0; - - for(int i = width-1;i >= 0;i--) - { - pos = 0; - for(int j= 0;j < height;j++) - { - des[n++]= src[pos+i]; - pos += width; - } - } - +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include + +#include "mpi_sys_api.h" + +/* vicap */ +#include +#include +#include +#include +#include + +#include "k_module.h" +#include "k_type.h" +#include "k_vb_comm.h" +#include "k_video_comm.h" +#include "k_sys_comm.h" +#include "mpi_vb_api.h" +#include "mpi_vicap_api.h" +#include "mpi_isp_api.h" +#include "mpi_sys_api.h" +#include "k_vo_comm.h" +#include "mpi_vo_api.h" + +#include "vo_test_case.h" + +#include "k_connector_comm.h" +#include "mpi_connector_api.h" +#include "k_autoconf_comm.h" + + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) +#define SENSOR_CHANNEL (3) // isp通道数 +#define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 +#define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 +#define ISP_CHN0_WIDTH (1920)//(1920) +#define ISP_CHN0_HEIGHT (1080)//(1080) +#define vicap_install_osd (1) +#define osd_id K_VO_OSD3 +#define osd_width (1920) +#define osd_height (1080) +#else +#define SENSOR_CHANNEL (3) // isp通道数 +#define SENSOR_HEIGHT (1280) // isp高度,ai输入,竖屏 +#define SENSOR_WIDTH (720) // isp宽度,ai输入,竖屏 +#define ISP_CHN0_WIDTH (1088)//(1920) +#define ISP_CHN0_HEIGHT (1920)//(1080) +#define vicap_install_osd (1) +#define osd_id K_VO_OSD3 +#define osd_width (1080) +#define osd_height (1920) +#endif + + +k_vb_config config; +k_vicap_dev vicap_dev; +k_vicap_chn vicap_chn; +k_vicap_dev_attr dev_attr; +k_vicap_chn_attr chn_attr; +k_vicap_sensor_info sensor_info; +k_vicap_sensor_type sensor_type; +k_mpp_chn vicap_mpp_chn; +k_mpp_chn vo_mpp_chn; + +k_video_frame_info dump_info; + +k_vo_draw_frame vo_frame = (k_vo_draw_frame) { + 1, + 16, + 16, + 128, + 128, + 1 +}; + +static k_vb_blk_handle block; +k_u32 g_pool_id; + +int vo_creat_layer_test(k_vo_layer chn_id, layer_info *info) +{ + k_vo_video_layer_attr attr; + + // check layer + if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) + || ((info->func != 0) && (chn_id == K_VO_LAYER2))) + { + printf("input layer num failed \n"); + return -1 ; + } + + // check scaler + + // set offset + attr.display_rect = info->offset; + // set act + attr.img_size = info->act_size; + // sget size + info->size = info->act_size.height * info->act_size.width * 3 / 2; + //set pixel format + attr.pixel_format = info->format; + if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) + { + printf("input pix format failed \n"); + return -1; + } + // set stride + attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); + // set function + attr.func = info->func; + // set scaler attr + attr.scaler_attr = info->attr; + + // set video layer atrr + kd_mpi_vo_set_video_layer_attr(chn_id, &attr); + + // enable layer + kd_mpi_vo_enable_video_layer(chn_id); + + return 0; +} + +k_vb_blk_handle vo_insert_frame(k_video_frame_info *vf_info, void **pic_vaddr) +{ + k_u64 phys_addr = 0; + k_u32 *virt_addr; + k_vb_blk_handle handle; + k_s32 size; + + if (vf_info == NULL) + return K_FALSE; + + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_8888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_8888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 4; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_565 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_565) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_4444 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_4444) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_1555 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_1555) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3 / 2; + + size = size + 4096; // 强制4K ,后边得删了 + + printf("vb block size is %x \n", size); + + handle = kd_mpi_vb_get_block(g_pool_id, size, NULL); + if (handle == VB_INVALID_HANDLE) + { + printf("%s get vb block error\n", __func__); + return K_FAILED; + } + + phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); + if (phys_addr == 0) + { + printf("%s get phys addr error\n", __func__); + return K_FAILED; + } + + virt_addr = (k_u32 *)kd_mpi_sys_mmap(phys_addr, size); + // virt_addr = (k_u32 *)kd_mpi_sys_mmap_cached(phys_addr, size); + + if (virt_addr == NULL) + { + printf("%s mmap error\n", __func__); + return K_FAILED; + } + + vf_info->mod_id = K_ID_VO; + vf_info->pool_id = g_pool_id; + vf_info->v_frame.phys_addr[0] = phys_addr; + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + vf_info->v_frame.phys_addr[1] = phys_addr + (vf_info->v_frame.height * vf_info->v_frame.stride[0]); + *pic_vaddr = virt_addr; + + printf("phys_addr is %lx g_pool_id is %d \n", phys_addr, g_pool_id); + + return handle; +} + +k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) +{ + k_vo_video_osd_attr attr; + + // set attr + attr.global_alptha = info->global_alptha; + + if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) + { + info->size = info->act_size.width * info->act_size.height * 4; + info->stride = info->act_size.width * 4 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) + { + info->size = info->act_size.width * info->act_size.height * 3; + info->stride = info->act_size.width * 3 / 8; + } + else if(info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if(info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else + { + printf("set osd pixel format failed \n"); + } + + attr.stride = info->stride; + attr.pixel_format = info->format; + attr.display_rect = info->offset; + attr.img_size = info->act_size; + kd_mpi_vo_set_video_osd_attr(osd, &attr); + + kd_mpi_vo_osd_enable(osd); + + return 0; +} + +void sample_vicap_install_osd(void) +{ + osd_info osd; + + osd.act_size.width = osd_width ; + osd.act_size.height = osd_height; + osd.offset.x = 0; + osd.offset.y = 0; + osd.global_alptha = 0xff; + // osd.global_alptha = 0x32; + osd.format = PIXEL_FORMAT_ARGB_8888;//PIXEL_FORMAT_ARGB_4444; //PIXEL_FORMAT_ARGB_1555;//PIXEL_FORMAT_ARGB_8888; + + vo_creat_osd_test(osd_id, &osd); +} + +void vo_osd_release_block(void) +{ + if(vicap_install_osd == 1) + { + kd_mpi_vo_osd_disable(osd_id); + kd_mpi_vb_release_block(block); + } + +} + +static k_s32 sample_connector_init(void) +{ + k_u32 ret = 0; + k_s32 connector_fd; +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#else + k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#endif + k_connector_info connector_info; + + memset(&connector_info, 0, sizeof(k_connector_info)); + + //connector get sensor info + ret = kd_mpi_get_connector_info(connector_type, &connector_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + + connector_fd = kd_mpi_connector_open(connector_info.connector_name); + if (connector_fd < 0) { + printf("%s, connector open failed.\n", __func__); + return K_ERR_VO_NOTREADY; + } + + // set connect power + kd_mpi_connector_power_set(connector_fd, K_TRUE); + // connector init + kd_mpi_connector_init(connector_fd, connector_info); + + return 0; +} + +static k_s32 vo_layer_vdss_bind_vo_config(void) +{ + layer_info info; + + k_vo_layer chn_id = K_VO_LAYER1; + + memset(&info, 0, sizeof(info)); + + sample_connector_init(); + + // config lyaer + info.act_size.width = ISP_CHN0_WIDTH;//ISP_CHN0_HEIGHT;//1080;//640;//1080; + info.act_size.height = ISP_CHN0_HEIGHT;//ISP_CHN0_WIDTH;//1920;//480;//1920; + info.format = PIXEL_FORMAT_YVU_PLANAR_420; + info.func = 0;//K_ROTATION_180;////K_ROTATION_90; + info.global_alptha = 0xff; + info.offset.x = 0;//(1080-w)/2, + info.offset.y = 0;//(1920-h)/2; + vo_creat_layer_test(chn_id, &info); + + if(vicap_install_osd == 1) + sample_vicap_install_osd(); + + //exit ; + return 0; +} + +static void sample_vicap_bind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) +{ + k_s32 ret; + + ret = kd_mpi_sys_bind(&vicap_mpp_chn, &vo_mpp_chn); + if (ret) { + printf("kd_mpi_sys_unbind failed:0x%x\n", ret); + } + + return; +} + +static void sample_vicap_unbind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) +{ + k_s32 ret; + + ret = kd_mpi_sys_unbind(&vicap_mpp_chn, &vo_mpp_chn); + if (ret) { + printf("kd_mpi_sys_unbind failed:0x%x\n", ret); + } + + return; +} + +int vivcap_start() +{ + k_s32 ret = 0; + + k_u32 pool_id; + k_vb_pool_config pool_config; + + printf("sample_vicap ...\n"); + +#if defined(CONFIG_BOARD_K230_CANMV) + sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; +#else + sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; +#endif + vicap_dev = VICAP_DEV_ID_0; + + memset(&config, 0, sizeof(config)); + config.max_pool_cnt = 64; + //VB for YUV420SP output + config.comm_pool[0].blk_cnt = 5; + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[0].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), VICAP_ALIGN_1K); + + //VB for RGB888 output + config.comm_pool[1].blk_cnt = 5; + config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[1].blk_size = VICAP_ALIGN_UP((SENSOR_HEIGHT * SENSOR_WIDTH * 3 ), VICAP_ALIGN_1K); + + ret = kd_mpi_vb_set_config(&config); + if (ret) { + printf("vb_set_config failed ret:%d\n", ret); + return ret; + } + + k_vb_supplement_config supplement_config; + memset(&supplement_config, 0, sizeof(supplement_config)); + supplement_config.supplement_config |= VB_SUPPLEMENT_JPEG_MASK; + + ret = kd_mpi_vb_set_supplement_config(&supplement_config); + if (ret) { + printf("vb_set_supplement_config failed ret:%d\n", ret); + return ret; + } + + ret = kd_mpi_vb_init(); + if (ret) { + printf("vb_init failed ret:%d\n", ret); + return ret; + } + printf("sample_vicap ...kd_mpi_vicap_get_sensor_info\n"); + + // dwc_dsi_init(); + vo_layer_vdss_bind_vo_config(); + + if(vicap_install_osd == 1) + { + memset(&pool_config, 0, sizeof(pool_config)); + pool_config.blk_size = VICAP_ALIGN_UP((osd_width * osd_height * 4 * 2), VICAP_ALIGN_1K); + pool_config.blk_cnt = 4; + pool_config.mode = VB_REMAP_MODE_NOCACHE; + pool_id = kd_mpi_vb_create_pool(&pool_config); // osd0 - 3 argb 320 x 240 + g_pool_id = pool_id; + + printf("--------aa--------------g_pool_id is %d pool_id is %d \n",g_pool_id, pool_id); + } + + memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); + ret = kd_mpi_vicap_get_sensor_info(sensor_type, &sensor_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + + memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); + dev_attr.acq_win.h_start = 0; + dev_attr.acq_win.v_start = 0; +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + dev_attr.acq_win.width = ISP_CHN0_WIDTH; + dev_attr.acq_win.height = ISP_CHN0_HEIGHT; +#else + dev_attr.acq_win.width = 2592;//SENSOR_HEIGHT; + dev_attr.acq_win.height = 1944;//SENSOR_WIDTH; +#endif + dev_attr.mode = VICAP_WORK_ONLINE_MODE; + + dev_attr.pipe_ctrl.data = 0xFFFFFFFF; + dev_attr.pipe_ctrl.bits.af_enable = 0; + dev_attr.pipe_ctrl.bits.ahdr_enable = 0; + + + dev_attr.cpature_frame = 0; + memcpy(&dev_attr.sensor_info, &sensor_info, sizeof(k_vicap_sensor_info)); + + ret = kd_mpi_vicap_set_dev_attr(vicap_dev, dev_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_dev_attr failed.\n"); + return ret; + } + + memset(&chn_attr, 0, sizeof(k_vicap_chn_attr)); + + //set chn0 output yuv420sp + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = ISP_CHN0_WIDTH; + chn_attr.out_win.height = ISP_CHN0_HEIGHT; + + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + chn_attr.crop_win = dev_attr.acq_win; +#else + // chn_attr.crop_win = dev_attr.acq_win; + chn_attr.crop_win.h_start = 768; + chn_attr.crop_win.v_start = 16; + chn_attr.crop_win.width = ISP_CHN0_WIDTH; + chn_attr.crop_win.height = ISP_CHN0_HEIGHT; +#endif + + chn_attr.scale_win = chn_attr.out_win; + chn_attr.crop_enable = K_FALSE; + chn_attr.scale_enable = K_FALSE; + // chn_attr.dw_enable = K_FALSE; + chn_attr.chn_enable = K_TRUE; + chn_attr.pix_format = PIXEL_FORMAT_YVU_PLANAR_420; + chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp + chn_attr.buffer_size = config.comm_pool[0].blk_size; + vicap_chn = VICAP_CHN_ID_0; + + printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); + ret = kd_mpi_vicap_set_chn_attr(vicap_dev, vicap_chn, chn_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); + return ret; + } + + //bind vicap chn 0 to vo + vicap_mpp_chn.mod_id = K_ID_VI; + vicap_mpp_chn.dev_id = vicap_dev; + vicap_mpp_chn.chn_id = vicap_chn; + + vo_mpp_chn.mod_id = K_ID_VO; + vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; + vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; + + sample_vicap_bind_vo(vicap_mpp_chn, vo_mpp_chn); + printf("sample_vicap ...dwc_dsi_init\n"); + + //set chn1 output rgb888p + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = SENSOR_WIDTH ; + chn_attr.out_win.height = SENSOR_HEIGHT; + // chn_attr.crop_win = dev_attr.acq_win; + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + chn_attr.crop_win = dev_attr.acq_win; +#else + chn_attr.crop_win.h_start = 768; + chn_attr.crop_win.v_start = 16; + chn_attr.crop_win.width = ISP_CHN0_WIDTH; + chn_attr.crop_win.height = ISP_CHN0_HEIGHT; +#endif + + chn_attr.scale_win = chn_attr.out_win; + chn_attr.crop_enable = K_FALSE; + chn_attr.scale_enable = K_FALSE; + // chn_attr.dw_enable = K_FALSE; + chn_attr.chn_enable = K_TRUE; + chn_attr.pix_format = PIXEL_FORMAT_BGR_888_PLANAR; + chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp + chn_attr.buffer_size = config.comm_pool[1].blk_size; + + printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); + ret = kd_mpi_vicap_set_chn_attr(vicap_dev, VICAP_CHN_ID_1, chn_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); + return ret; + } + + printf("sample_vicap ...kd_mpi_vicap_init\n"); + ret = kd_mpi_vicap_init(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + // goto err_exit; + } + + printf("sample_vicap ...kd_mpi_vicap_start_stream\n"); + ret = kd_mpi_vicap_start_stream(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + // goto err_exit; + } + + return ret; +} + +int vivcap_stop() +{ + printf("sample_vicap ...kd_mpi_vicap_stop_stream\n"); + int ret = kd_mpi_vicap_stop_stream(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + return ret; + } + + ret = kd_mpi_vicap_deinit(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_deinit failed.\n"); + return ret; + } + + kd_mpi_vo_disable_video_layer(K_VO_LAYER1); + + vicap_mpp_chn.mod_id = K_ID_VI; + vicap_mpp_chn.dev_id = vicap_dev; + vicap_mpp_chn.chn_id = vicap_chn; + + vo_mpp_chn.mod_id = K_ID_VO; + vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; + vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; + + sample_vicap_unbind_vo(vicap_mpp_chn, vo_mpp_chn); + + /*Allow one frame time for the VO to release the VB block*/ + k_u32 display_ms = 1000 / 33; + usleep(1000 * display_ms); + + ret = kd_mpi_vb_exit(); + if (ret) { + printf("sample_vicap, kd_mpi_vb_exit failed.\n"); + return ret; + } + + return 0; +} + +void yuv_rotate_90(char *des, char *src,int width,int height) +{ + int n = 0; + int hw = width>>1; + int hh = height>>1; + int size = width * height; + int hsize = size>>2; + + int pos = 0; + + for(int i = width-1;i >= 0;i--) + { + pos = 0; + for(int j= 0;j < height;j++) + { + des[n++]= src[pos+i]; + pos += width; + } + } + } \ No newline at end of file diff --git a/src/reference/ai_poc/person_detect/vi_vo.h b/src/reference/ai_poc/person_detect/vi_vo.h index e3d8bdba4..0a11a4d31 100644 --- a/src/reference/ai_poc/person_detect/vi_vo.h +++ b/src/reference/ai_poc/person_detect/vi_vo.h @@ -1,627 +1,628 @@ -/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include -#include -#include - -#include "mpi_sys_api.h" - -/* vicap */ -#include -#include -#include -#include -#include - -#include "k_module.h" -#include "k_type.h" -#include "k_vb_comm.h" -#include "k_video_comm.h" -#include "k_sys_comm.h" -#include "mpi_vb_api.h" -#include "mpi_vicap_api.h" -#include "mpi_isp_api.h" -#include "mpi_sys_api.h" -#include "k_vo_comm.h" -#include "mpi_vo_api.h" - -#include "vo_test_case.h" - -#include "k_connector_comm.h" -#include "mpi_connector_api.h" -#include "k_autoconf_comm.h" - - -#if defined(CONFIG_BOARD_K230_CANMV) -#define SENSOR_CHANNEL (3) // isp通道数 -#define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 -#define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 -#define ISP_CHN0_WIDTH (1920)//(1920) -#define ISP_CHN0_HEIGHT (1080)//(1080) -#define vicap_install_osd (1) -#define osd_id K_VO_OSD3 -#define osd_width (1920) -#define osd_height (1080) -#else -#define SENSOR_CHANNEL (3) // isp通道数 -#define SENSOR_HEIGHT (1280) // isp高度,ai输入,竖屏 -#define SENSOR_WIDTH (720) // isp宽度,ai输入,竖屏 -#define ISP_CHN0_WIDTH (1088)//(1920) -#define ISP_CHN0_HEIGHT (1920)//(1080) -#define vicap_install_osd (1) -#define osd_id K_VO_OSD3 -#define osd_width (1080) -#define osd_height (1920) -#endif - - -k_vb_config config; -k_vicap_dev vicap_dev; -k_vicap_chn vicap_chn; -k_vicap_dev_attr dev_attr; -k_vicap_chn_attr chn_attr; -k_vicap_sensor_info sensor_info; -k_vicap_sensor_type sensor_type; -k_mpp_chn vicap_mpp_chn; -k_mpp_chn vo_mpp_chn; - -k_video_frame_info dump_info; - -k_vo_draw_frame vo_frame = (k_vo_draw_frame) { - 1, - 16, - 16, - 128, - 128, - 1 -}; - -static k_vb_blk_handle block; -k_u32 g_pool_id; - -int vo_creat_layer_test(k_vo_layer chn_id, layer_info *info) -{ - k_vo_video_layer_attr attr; - - // check layer - if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) - || ((info->func != 0) && (chn_id == K_VO_LAYER2))) - { - printf("input layer num failed \n"); - return -1 ; - } - - // check scaler - - // set offset - attr.display_rect = info->offset; - // set act - attr.img_size = info->act_size; - // sget size - info->size = info->act_size.height * info->act_size.width * 3 / 2; - //set pixel format - attr.pixel_format = info->format; - if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) - { - printf("input pix format failed \n"); - return -1; - } - // set stride - attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); - // set function - attr.func = info->func; - // set scaler attr - attr.scaler_attr = info->attr; - - // set video layer atrr - kd_mpi_vo_set_video_layer_attr(chn_id, &attr); - - // enable layer - kd_mpi_vo_enable_video_layer(chn_id); - - return 0; -} - -k_vb_blk_handle vo_insert_frame(k_video_frame_info *vf_info, void **pic_vaddr) -{ - k_u64 phys_addr = 0; - k_u32 *virt_addr; - k_vb_blk_handle handle; - k_s32 size; - - if (vf_info == NULL) - return K_FALSE; - - if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_8888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_8888) - size = vf_info->v_frame.height * vf_info->v_frame.width * 4; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_565 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_565) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_4444 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_4444) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_888) - size = vf_info->v_frame.height * vf_info->v_frame.width * 3; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_1555 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_1555) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) - size = vf_info->v_frame.height * vf_info->v_frame.width * 3 / 2; - - size = size + 4096; // 强制4K ,后边得删了 - - printf("vb block size is %x \n", size); - - handle = kd_mpi_vb_get_block(g_pool_id, size, NULL); - if (handle == VB_INVALID_HANDLE) - { - printf("%s get vb block error\n", __func__); - return K_FAILED; - } - - phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); - if (phys_addr == 0) - { - printf("%s get phys addr error\n", __func__); - return K_FAILED; - } - - virt_addr = (k_u32 *)kd_mpi_sys_mmap(phys_addr, size); - // virt_addr = (k_u32 *)kd_mpi_sys_mmap_cached(phys_addr, size); - - if (virt_addr == NULL) - { - printf("%s mmap error\n", __func__); - return K_FAILED; - } - - vf_info->mod_id = K_ID_VO; - vf_info->pool_id = g_pool_id; - vf_info->v_frame.phys_addr[0] = phys_addr; - if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) - vf_info->v_frame.phys_addr[1] = phys_addr + (vf_info->v_frame.height * vf_info->v_frame.stride[0]); - *pic_vaddr = virt_addr; - - printf("phys_addr is %lx g_pool_id is %d \n", phys_addr, g_pool_id); - - return handle; -} - -k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) -{ - k_vo_video_osd_attr attr; - - // set attr - attr.global_alptha = info->global_alptha; - - if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) - { - info->size = info->act_size.width * info->act_size.height * 4; - info->stride = info->act_size.width * 4 / 8; - } - else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) - { - info->size = info->act_size.width * info->act_size.height * 3; - info->stride = info->act_size.width * 3 / 8; - } - else if(info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else if(info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else - { - printf("set osd pixel format failed \n"); - } - - attr.stride = info->stride; - attr.pixel_format = info->format; - attr.display_rect = info->offset; - attr.img_size = info->act_size; - kd_mpi_vo_set_video_osd_attr(osd, &attr); - - kd_mpi_vo_osd_enable(osd); - - return 0; -} - -void sample_vicap_install_osd(void) -{ - osd_info osd; - - osd.act_size.width = osd_width ; - osd.act_size.height = osd_height; - osd.offset.x = 0; - osd.offset.y = 0; - osd.global_alptha = 0xff; - // osd.global_alptha = 0x32; - osd.format = PIXEL_FORMAT_ARGB_8888;//PIXEL_FORMAT_ARGB_4444; //PIXEL_FORMAT_ARGB_1555;//PIXEL_FORMAT_ARGB_8888; - - vo_creat_osd_test(osd_id, &osd); -} - -void vo_osd_release_block(void) -{ - if(vicap_install_osd == 1) - { - kd_mpi_vo_osd_disable(osd_id); - kd_mpi_vb_release_block(block); - } - -} - -static k_s32 sample_connector_init(void) -{ - k_u32 ret = 0; - k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) - k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; -#else - k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; -#endif - k_connector_info connector_info; - - memset(&connector_info, 0, sizeof(k_connector_info)); - - //connector get sensor info - ret = kd_mpi_get_connector_info(connector_type, &connector_info); - if (ret) { - printf("sample_vicap, the sensor type not supported!\n"); - return ret; - } - - connector_fd = kd_mpi_connector_open(connector_info.connector_name); - if (connector_fd < 0) { - printf("%s, connector open failed.\n", __func__); - return K_ERR_VO_NOTREADY; - } - - // set connect power - kd_mpi_connector_power_set(connector_fd, K_TRUE); - // connector init - kd_mpi_connector_init(connector_fd, connector_info); - - return 0; -} - -static k_s32 vo_layer_vdss_bind_vo_config(void) -{ - layer_info info; - - k_vo_layer chn_id = K_VO_LAYER1; - - memset(&info, 0, sizeof(info)); - - sample_connector_init(); - - // config lyaer - info.act_size.width = ISP_CHN0_WIDTH;//ISP_CHN0_HEIGHT;//1080;//640;//1080; - info.act_size.height = ISP_CHN0_HEIGHT;//ISP_CHN0_WIDTH;//1920;//480;//1920; - info.format = PIXEL_FORMAT_YVU_PLANAR_420; - info.func = 0;//K_ROTATION_180;////K_ROTATION_90; - info.global_alptha = 0xff; - info.offset.x = 0;//(1080-w)/2, - info.offset.y = 0;//(1920-h)/2; - vo_creat_layer_test(chn_id, &info); - - if(vicap_install_osd == 1) - sample_vicap_install_osd(); - - //exit ; - return 0; -} - -static void sample_vicap_bind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) -{ - k_s32 ret; - - ret = kd_mpi_sys_bind(&vicap_mpp_chn, &vo_mpp_chn); - if (ret) { - printf("kd_mpi_sys_unbind failed:0x%x\n", ret); - } - - return; -} - -static void sample_vicap_unbind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) -{ - k_s32 ret; - - ret = kd_mpi_sys_unbind(&vicap_mpp_chn, &vo_mpp_chn); - if (ret) { - printf("kd_mpi_sys_unbind failed:0x%x\n", ret); - } - - return; -} - -int vivcap_start() -{ - k_s32 ret = 0; - - k_u32 pool_id; - k_vb_pool_config pool_config; - - printf("sample_vicap ...\n"); - -#if defined(CONFIG_BOARD_K230_CANMV) - sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); -#else - sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; -#endif - vicap_dev = VICAP_DEV_ID_0; - - memset(&config, 0, sizeof(config)); - config.max_pool_cnt = 64; - //VB for YUV420SP output - config.comm_pool[0].blk_cnt = 5; - config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; - config.comm_pool[0].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), VICAP_ALIGN_1K); - - //VB for RGB888 output - config.comm_pool[1].blk_cnt = 5; - config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; - config.comm_pool[1].blk_size = VICAP_ALIGN_UP((SENSOR_HEIGHT * SENSOR_WIDTH * 3 ), VICAP_ALIGN_1K); - - ret = kd_mpi_vb_set_config(&config); - if (ret) { - printf("vb_set_config failed ret:%d\n", ret); - return ret; - } - - k_vb_supplement_config supplement_config; - memset(&supplement_config, 0, sizeof(supplement_config)); - supplement_config.supplement_config |= VB_SUPPLEMENT_JPEG_MASK; - - ret = kd_mpi_vb_set_supplement_config(&supplement_config); - if (ret) { - printf("vb_set_supplement_config failed ret:%d\n", ret); - return ret; - } - - ret = kd_mpi_vb_init(); - if (ret) { - printf("vb_init failed ret:%d\n", ret); - return ret; - } - printf("sample_vicap ...kd_mpi_vicap_get_sensor_info\n"); - - // dwc_dsi_init(); - vo_layer_vdss_bind_vo_config(); - - if(vicap_install_osd == 1) - { - memset(&pool_config, 0, sizeof(pool_config)); - pool_config.blk_size = VICAP_ALIGN_UP((osd_width * osd_height * 4 * 2), VICAP_ALIGN_1K); - pool_config.blk_cnt = 4; - pool_config.mode = VB_REMAP_MODE_NOCACHE; - pool_id = kd_mpi_vb_create_pool(&pool_config); // osd0 - 3 argb 320 x 240 - g_pool_id = pool_id; - - printf("--------aa--------------g_pool_id is %d pool_id is %d \n",g_pool_id, pool_id); - } - - memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); - ret = kd_mpi_vicap_get_sensor_info(sensor_type, &sensor_info); - if (ret) { - printf("sample_vicap, the sensor type not supported!\n"); - return ret; - } - - memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); - dev_attr.acq_win.h_start = 0; - dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) - dev_attr.acq_win.width = ISP_CHN0_WIDTH; - dev_attr.acq_win.height = ISP_CHN0_HEIGHT; -#else - dev_attr.acq_win.width = 2592;//SENSOR_HEIGHT; - dev_attr.acq_win.height = 1944;//SENSOR_WIDTH; -#endif - dev_attr.mode = VICAP_WORK_ONLINE_MODE; - - dev_attr.pipe_ctrl.data = 0xFFFFFFFF; - dev_attr.pipe_ctrl.bits.af_enable = 0; - dev_attr.pipe_ctrl.bits.ahdr_enable = 0; - - - dev_attr.cpature_frame = 0; - memcpy(&dev_attr.sensor_info, &sensor_info, sizeof(k_vicap_sensor_info)); - - ret = kd_mpi_vicap_set_dev_attr(vicap_dev, dev_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_dev_attr failed.\n"); - return ret; - } - - memset(&chn_attr, 0, sizeof(k_vicap_chn_attr)); - - //set chn0 output yuv420sp - chn_attr.out_win.h_start = 0; - chn_attr.out_win.v_start = 0; - chn_attr.out_win.width = ISP_CHN0_WIDTH; - chn_attr.out_win.height = ISP_CHN0_HEIGHT; - - -#if defined(CONFIG_BOARD_K230_CANMV) - chn_attr.crop_win = dev_attr.acq_win; -#else - // chn_attr.crop_win = dev_attr.acq_win; - chn_attr.crop_win.h_start = 768; - chn_attr.crop_win.v_start = 16; - chn_attr.crop_win.width = ISP_CHN0_WIDTH; - chn_attr.crop_win.height = ISP_CHN0_HEIGHT; -#endif - - chn_attr.scale_win = chn_attr.out_win; - chn_attr.crop_enable = K_FALSE; - chn_attr.scale_enable = K_FALSE; - // chn_attr.dw_enable = K_FALSE; - chn_attr.chn_enable = K_TRUE; - chn_attr.pix_format = PIXEL_FORMAT_YVU_PLANAR_420; - chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp - chn_attr.buffer_size = config.comm_pool[0].blk_size; - vicap_chn = VICAP_CHN_ID_0; - - printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); - ret = kd_mpi_vicap_set_chn_attr(vicap_dev, vicap_chn, chn_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); - return ret; - } - - //bind vicap chn 0 to vo - vicap_mpp_chn.mod_id = K_ID_VI; - vicap_mpp_chn.dev_id = vicap_dev; - vicap_mpp_chn.chn_id = vicap_chn; - - vo_mpp_chn.mod_id = K_ID_VO; - vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; - vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; - - sample_vicap_bind_vo(vicap_mpp_chn, vo_mpp_chn); - printf("sample_vicap ...dwc_dsi_init\n"); - - //set chn1 output rgb888p - chn_attr.out_win.h_start = 0; - chn_attr.out_win.v_start = 0; - chn_attr.out_win.width = SENSOR_WIDTH ; - chn_attr.out_win.height = SENSOR_HEIGHT; - // chn_attr.crop_win = dev_attr.acq_win; - -#if defined(CONFIG_BOARD_K230_CANMV) - chn_attr.crop_win = dev_attr.acq_win; -#else - chn_attr.crop_win.h_start = 768; - chn_attr.crop_win.v_start = 16; - chn_attr.crop_win.width = ISP_CHN0_WIDTH; - chn_attr.crop_win.height = ISP_CHN0_HEIGHT; -#endif - - chn_attr.scale_win = chn_attr.out_win; - chn_attr.crop_enable = K_FALSE; - chn_attr.scale_enable = K_FALSE; - // chn_attr.dw_enable = K_FALSE; - chn_attr.chn_enable = K_TRUE; - chn_attr.pix_format = PIXEL_FORMAT_BGR_888_PLANAR; - chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp - chn_attr.buffer_size = config.comm_pool[1].blk_size; - - printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); - ret = kd_mpi_vicap_set_chn_attr(vicap_dev, VICAP_CHN_ID_1, chn_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); - return ret; - } - - printf("sample_vicap ...kd_mpi_vicap_init\n"); - ret = kd_mpi_vicap_init(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - // goto err_exit; - } - - printf("sample_vicap ...kd_mpi_vicap_start_stream\n"); - ret = kd_mpi_vicap_start_stream(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - // goto err_exit; - } - - return ret; -} - -int vivcap_stop() -{ - printf("sample_vicap ...kd_mpi_vicap_stop_stream\n"); - int ret = kd_mpi_vicap_stop_stream(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - return ret; - } - - ret = kd_mpi_vicap_deinit(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_deinit failed.\n"); - return ret; - } - - kd_mpi_vo_disable_video_layer(K_VO_LAYER1); - - vicap_mpp_chn.mod_id = K_ID_VI; - vicap_mpp_chn.dev_id = vicap_dev; - vicap_mpp_chn.chn_id = vicap_chn; - - vo_mpp_chn.mod_id = K_ID_VO; - vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; - vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; - - sample_vicap_unbind_vo(vicap_mpp_chn, vo_mpp_chn); - - /*Allow one frame time for the VO to release the VB block*/ - k_u32 display_ms = 1000 / 33; - usleep(1000 * display_ms); - - ret = kd_mpi_vb_exit(); - if (ret) { - printf("sample_vicap, kd_mpi_vb_exit failed.\n"); - return ret; - } - - return 0; -} - -void yuv_rotate_90(char *des, char *src,int width,int height) -{ - int n = 0; - int hw = width>>1; - int hh = height>>1; - int size = width * height; - int hsize = size>>2; - - int pos = 0; - - for(int i = width-1;i >= 0;i--) - { - pos = 0; - for(int j= 0;j < height;j++) - { - des[n++]= src[pos+i]; - pos += width; - } - } - +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include + +#include "mpi_sys_api.h" + +/* vicap */ +#include +#include +#include +#include +#include + +#include "k_module.h" +#include "k_type.h" +#include "k_vb_comm.h" +#include "k_video_comm.h" +#include "k_sys_comm.h" +#include "mpi_vb_api.h" +#include "mpi_vicap_api.h" +#include "mpi_isp_api.h" +#include "mpi_sys_api.h" +#include "k_vo_comm.h" +#include "mpi_vo_api.h" + +#include "vo_test_case.h" + +#include "k_connector_comm.h" +#include "mpi_connector_api.h" +#include "k_autoconf_comm.h" + + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) +#define SENSOR_CHANNEL (3) // isp通道数 +#define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 +#define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 +#define ISP_CHN0_WIDTH (1920)//(1920) +#define ISP_CHN0_HEIGHT (1080)//(1080) +#define vicap_install_osd (1) +#define osd_id K_VO_OSD3 +#define osd_width (1920) +#define osd_height (1080) +#else +#define SENSOR_CHANNEL (3) // isp通道数 +#define SENSOR_HEIGHT (1280) // isp高度,ai输入,竖屏 +#define SENSOR_WIDTH (720) // isp宽度,ai输入,竖屏 +#define ISP_CHN0_WIDTH (1088)//(1920) +#define ISP_CHN0_HEIGHT (1920)//(1080) +#define vicap_install_osd (1) +#define osd_id K_VO_OSD3 +#define osd_width (1080) +#define osd_height (1920) +#endif + + +k_vb_config config; +k_vicap_dev vicap_dev; +k_vicap_chn vicap_chn; +k_vicap_dev_attr dev_attr; +k_vicap_chn_attr chn_attr; +k_vicap_sensor_info sensor_info; +k_vicap_sensor_type sensor_type; +k_mpp_chn vicap_mpp_chn; +k_mpp_chn vo_mpp_chn; + +k_video_frame_info dump_info; + +k_vo_draw_frame vo_frame = (k_vo_draw_frame) { + 1, + 16, + 16, + 128, + 128, + 1 +}; + +static k_vb_blk_handle block; +k_u32 g_pool_id; + +int vo_creat_layer_test(k_vo_layer chn_id, layer_info *info) +{ + k_vo_video_layer_attr attr; + + // check layer + if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) + || ((info->func != 0) && (chn_id == K_VO_LAYER2))) + { + printf("input layer num failed \n"); + return -1 ; + } + + // check scaler + + // set offset + attr.display_rect = info->offset; + // set act + attr.img_size = info->act_size; + // sget size + info->size = info->act_size.height * info->act_size.width * 3 / 2; + //set pixel format + attr.pixel_format = info->format; + if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) + { + printf("input pix format failed \n"); + return -1; + } + // set stride + attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); + // set function + attr.func = info->func; + // set scaler attr + attr.scaler_attr = info->attr; + + // set video layer atrr + kd_mpi_vo_set_video_layer_attr(chn_id, &attr); + + // enable layer + kd_mpi_vo_enable_video_layer(chn_id); + + return 0; +} + +k_vb_blk_handle vo_insert_frame(k_video_frame_info *vf_info, void **pic_vaddr) +{ + k_u64 phys_addr = 0; + k_u32 *virt_addr; + k_vb_blk_handle handle; + k_s32 size; + + if (vf_info == NULL) + return K_FALSE; + + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_8888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_8888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 4; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_565 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_565) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_4444 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_4444) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_1555 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_1555) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3 / 2; + + size = size + 4096; // 强制4K ,后边得删了 + + printf("vb block size is %x \n", size); + + handle = kd_mpi_vb_get_block(g_pool_id, size, NULL); + if (handle == VB_INVALID_HANDLE) + { + printf("%s get vb block error\n", __func__); + return K_FAILED; + } + + phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); + if (phys_addr == 0) + { + printf("%s get phys addr error\n", __func__); + return K_FAILED; + } + + virt_addr = (k_u32 *)kd_mpi_sys_mmap(phys_addr, size); + // virt_addr = (k_u32 *)kd_mpi_sys_mmap_cached(phys_addr, size); + + if (virt_addr == NULL) + { + printf("%s mmap error\n", __func__); + return K_FAILED; + } + + vf_info->mod_id = K_ID_VO; + vf_info->pool_id = g_pool_id; + vf_info->v_frame.phys_addr[0] = phys_addr; + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + vf_info->v_frame.phys_addr[1] = phys_addr + (vf_info->v_frame.height * vf_info->v_frame.stride[0]); + *pic_vaddr = virt_addr; + + printf("phys_addr is %lx g_pool_id is %d \n", phys_addr, g_pool_id); + + return handle; +} + +k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) +{ + k_vo_video_osd_attr attr; + + // set attr + attr.global_alptha = info->global_alptha; + + if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) + { + info->size = info->act_size.width * info->act_size.height * 4; + info->stride = info->act_size.width * 4 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) + { + info->size = info->act_size.width * info->act_size.height * 3; + info->stride = info->act_size.width * 3 / 8; + } + else if(info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if(info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else + { + printf("set osd pixel format failed \n"); + } + + attr.stride = info->stride; + attr.pixel_format = info->format; + attr.display_rect = info->offset; + attr.img_size = info->act_size; + kd_mpi_vo_set_video_osd_attr(osd, &attr); + + kd_mpi_vo_osd_enable(osd); + + return 0; +} + +void sample_vicap_install_osd(void) +{ + osd_info osd; + + osd.act_size.width = osd_width ; + osd.act_size.height = osd_height; + osd.offset.x = 0; + osd.offset.y = 0; + osd.global_alptha = 0xff; + // osd.global_alptha = 0x32; + osd.format = PIXEL_FORMAT_ARGB_8888;//PIXEL_FORMAT_ARGB_4444; //PIXEL_FORMAT_ARGB_1555;//PIXEL_FORMAT_ARGB_8888; + + vo_creat_osd_test(osd_id, &osd); +} + +void vo_osd_release_block(void) +{ + if(vicap_install_osd == 1) + { + kd_mpi_vo_osd_disable(osd_id); + kd_mpi_vb_release_block(block); + } + +} + +static k_s32 sample_connector_init(void) +{ + k_u32 ret = 0; + k_s32 connector_fd; +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#else + k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#endif + k_connector_info connector_info; + + memset(&connector_info, 0, sizeof(k_connector_info)); + + //connector get sensor info + ret = kd_mpi_get_connector_info(connector_type, &connector_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + + connector_fd = kd_mpi_connector_open(connector_info.connector_name); + if (connector_fd < 0) { + printf("%s, connector open failed.\n", __func__); + return K_ERR_VO_NOTREADY; + } + + // set connect power + kd_mpi_connector_power_set(connector_fd, K_TRUE); + // connector init + kd_mpi_connector_init(connector_fd, connector_info); + + return 0; +} + +static k_s32 vo_layer_vdss_bind_vo_config(void) +{ + layer_info info; + + k_vo_layer chn_id = K_VO_LAYER1; + + memset(&info, 0, sizeof(info)); + + sample_connector_init(); + + // config lyaer + info.act_size.width = ISP_CHN0_WIDTH;//ISP_CHN0_HEIGHT;//1080;//640;//1080; + info.act_size.height = ISP_CHN0_HEIGHT;//ISP_CHN0_WIDTH;//1920;//480;//1920; + info.format = PIXEL_FORMAT_YVU_PLANAR_420; + info.func = 0;//K_ROTATION_180;////K_ROTATION_90; + info.global_alptha = 0xff; + info.offset.x = 0;//(1080-w)/2, + info.offset.y = 0;//(1920-h)/2; + vo_creat_layer_test(chn_id, &info); + + if(vicap_install_osd == 1) + sample_vicap_install_osd(); + + //exit ; + return 0; +} + +static void sample_vicap_bind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) +{ + k_s32 ret; + + ret = kd_mpi_sys_bind(&vicap_mpp_chn, &vo_mpp_chn); + if (ret) { + printf("kd_mpi_sys_unbind failed:0x%x\n", ret); + } + + return; +} + +static void sample_vicap_unbind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) +{ + k_s32 ret; + + ret = kd_mpi_sys_unbind(&vicap_mpp_chn, &vo_mpp_chn); + if (ret) { + printf("kd_mpi_sys_unbind failed:0x%x\n", ret); + } + + return; +} + +int vivcap_start() +{ + k_s32 ret = 0; + + k_u32 pool_id; + k_vb_pool_config pool_config; + + printf("sample_vicap ...\n"); + +#if defined(CONFIG_BOARD_K230_CANMV) + sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; +#else + sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; +#endif + vicap_dev = VICAP_DEV_ID_0; + + memset(&config, 0, sizeof(config)); + config.max_pool_cnt = 64; + //VB for YUV420SP output + config.comm_pool[0].blk_cnt = 5; + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[0].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), VICAP_ALIGN_1K); + + //VB for RGB888 output + config.comm_pool[1].blk_cnt = 5; + config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[1].blk_size = VICAP_ALIGN_UP((SENSOR_HEIGHT * SENSOR_WIDTH * 3 ), VICAP_ALIGN_1K); + + ret = kd_mpi_vb_set_config(&config); + if (ret) { + printf("vb_set_config failed ret:%d\n", ret); + return ret; + } + + k_vb_supplement_config supplement_config; + memset(&supplement_config, 0, sizeof(supplement_config)); + supplement_config.supplement_config |= VB_SUPPLEMENT_JPEG_MASK; + + ret = kd_mpi_vb_set_supplement_config(&supplement_config); + if (ret) { + printf("vb_set_supplement_config failed ret:%d\n", ret); + return ret; + } + + ret = kd_mpi_vb_init(); + if (ret) { + printf("vb_init failed ret:%d\n", ret); + return ret; + } + printf("sample_vicap ...kd_mpi_vicap_get_sensor_info\n"); + + // dwc_dsi_init(); + vo_layer_vdss_bind_vo_config(); + + if(vicap_install_osd == 1) + { + memset(&pool_config, 0, sizeof(pool_config)); + pool_config.blk_size = VICAP_ALIGN_UP((osd_width * osd_height * 4 * 2), VICAP_ALIGN_1K); + pool_config.blk_cnt = 4; + pool_config.mode = VB_REMAP_MODE_NOCACHE; + pool_id = kd_mpi_vb_create_pool(&pool_config); // osd0 - 3 argb 320 x 240 + g_pool_id = pool_id; + + printf("--------aa--------------g_pool_id is %d pool_id is %d \n",g_pool_id, pool_id); + } + + memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); + ret = kd_mpi_vicap_get_sensor_info(sensor_type, &sensor_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + + memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); + dev_attr.acq_win.h_start = 0; + dev_attr.acq_win.v_start = 0; +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + dev_attr.acq_win.width = ISP_CHN0_WIDTH; + dev_attr.acq_win.height = ISP_CHN0_HEIGHT; +#else + dev_attr.acq_win.width = 2592;//SENSOR_HEIGHT; + dev_attr.acq_win.height = 1944;//SENSOR_WIDTH; +#endif + dev_attr.mode = VICAP_WORK_ONLINE_MODE; + + dev_attr.pipe_ctrl.data = 0xFFFFFFFF; + dev_attr.pipe_ctrl.bits.af_enable = 0; + dev_attr.pipe_ctrl.bits.ahdr_enable = 0; + + + dev_attr.cpature_frame = 0; + memcpy(&dev_attr.sensor_info, &sensor_info, sizeof(k_vicap_sensor_info)); + + ret = kd_mpi_vicap_set_dev_attr(vicap_dev, dev_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_dev_attr failed.\n"); + return ret; + } + + memset(&chn_attr, 0, sizeof(k_vicap_chn_attr)); + + //set chn0 output yuv420sp + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = ISP_CHN0_WIDTH; + chn_attr.out_win.height = ISP_CHN0_HEIGHT; + + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + chn_attr.crop_win = dev_attr.acq_win; +#else + // chn_attr.crop_win = dev_attr.acq_win; + chn_attr.crop_win.h_start = 768; + chn_attr.crop_win.v_start = 16; + chn_attr.crop_win.width = ISP_CHN0_WIDTH; + chn_attr.crop_win.height = ISP_CHN0_HEIGHT; +#endif + + chn_attr.scale_win = chn_attr.out_win; + chn_attr.crop_enable = K_FALSE; + chn_attr.scale_enable = K_FALSE; + // chn_attr.dw_enable = K_FALSE; + chn_attr.chn_enable = K_TRUE; + chn_attr.pix_format = PIXEL_FORMAT_YVU_PLANAR_420; + chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp + chn_attr.buffer_size = config.comm_pool[0].blk_size; + vicap_chn = VICAP_CHN_ID_0; + + printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); + ret = kd_mpi_vicap_set_chn_attr(vicap_dev, vicap_chn, chn_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); + return ret; + } + + //bind vicap chn 0 to vo + vicap_mpp_chn.mod_id = K_ID_VI; + vicap_mpp_chn.dev_id = vicap_dev; + vicap_mpp_chn.chn_id = vicap_chn; + + vo_mpp_chn.mod_id = K_ID_VO; + vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; + vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; + + sample_vicap_bind_vo(vicap_mpp_chn, vo_mpp_chn); + printf("sample_vicap ...dwc_dsi_init\n"); + + //set chn1 output rgb888p + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = SENSOR_WIDTH ; + chn_attr.out_win.height = SENSOR_HEIGHT; + // chn_attr.crop_win = dev_attr.acq_win; + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + chn_attr.crop_win = dev_attr.acq_win; +#else + chn_attr.crop_win.h_start = 768; + chn_attr.crop_win.v_start = 16; + chn_attr.crop_win.width = ISP_CHN0_WIDTH; + chn_attr.crop_win.height = ISP_CHN0_HEIGHT; +#endif + + chn_attr.scale_win = chn_attr.out_win; + chn_attr.crop_enable = K_FALSE; + chn_attr.scale_enable = K_FALSE; + // chn_attr.dw_enable = K_FALSE; + chn_attr.chn_enable = K_TRUE; + chn_attr.pix_format = PIXEL_FORMAT_BGR_888_PLANAR; + chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp + chn_attr.buffer_size = config.comm_pool[1].blk_size; + + printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); + ret = kd_mpi_vicap_set_chn_attr(vicap_dev, VICAP_CHN_ID_1, chn_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); + return ret; + } + + printf("sample_vicap ...kd_mpi_vicap_init\n"); + ret = kd_mpi_vicap_init(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + // goto err_exit; + } + + printf("sample_vicap ...kd_mpi_vicap_start_stream\n"); + ret = kd_mpi_vicap_start_stream(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + // goto err_exit; + } + + return ret; +} + +int vivcap_stop() +{ + printf("sample_vicap ...kd_mpi_vicap_stop_stream\n"); + int ret = kd_mpi_vicap_stop_stream(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + return ret; + } + + ret = kd_mpi_vicap_deinit(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_deinit failed.\n"); + return ret; + } + + kd_mpi_vo_disable_video_layer(K_VO_LAYER1); + + vicap_mpp_chn.mod_id = K_ID_VI; + vicap_mpp_chn.dev_id = vicap_dev; + vicap_mpp_chn.chn_id = vicap_chn; + + vo_mpp_chn.mod_id = K_ID_VO; + vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; + vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; + + sample_vicap_unbind_vo(vicap_mpp_chn, vo_mpp_chn); + + /*Allow one frame time for the VO to release the VB block*/ + k_u32 display_ms = 1000 / 33; + usleep(1000 * display_ms); + + ret = kd_mpi_vb_exit(); + if (ret) { + printf("sample_vicap, kd_mpi_vb_exit failed.\n"); + return ret; + } + + return 0; +} + +void yuv_rotate_90(char *des, char *src,int width,int height) +{ + int n = 0; + int hw = width>>1; + int hh = height>>1; + int size = width * height; + int hsize = size>>2; + + int pos = 0; + + for(int i = width-1;i >= 0;i--) + { + pos = 0; + for(int j= 0;j < height;j++) + { + des[n++]= src[pos+i]; + pos += width; + } + } + } \ No newline at end of file diff --git a/src/reference/ai_poc/person_distance/vi_vo.h b/src/reference/ai_poc/person_distance/vi_vo.h index e3d8bdba4..0a11a4d31 100644 --- a/src/reference/ai_poc/person_distance/vi_vo.h +++ b/src/reference/ai_poc/person_distance/vi_vo.h @@ -1,627 +1,628 @@ -/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include -#include -#include - -#include "mpi_sys_api.h" - -/* vicap */ -#include -#include -#include -#include -#include - -#include "k_module.h" -#include "k_type.h" -#include "k_vb_comm.h" -#include "k_video_comm.h" -#include "k_sys_comm.h" -#include "mpi_vb_api.h" -#include "mpi_vicap_api.h" -#include "mpi_isp_api.h" -#include "mpi_sys_api.h" -#include "k_vo_comm.h" -#include "mpi_vo_api.h" - -#include "vo_test_case.h" - -#include "k_connector_comm.h" -#include "mpi_connector_api.h" -#include "k_autoconf_comm.h" - - -#if defined(CONFIG_BOARD_K230_CANMV) -#define SENSOR_CHANNEL (3) // isp通道数 -#define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 -#define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 -#define ISP_CHN0_WIDTH (1920)//(1920) -#define ISP_CHN0_HEIGHT (1080)//(1080) -#define vicap_install_osd (1) -#define osd_id K_VO_OSD3 -#define osd_width (1920) -#define osd_height (1080) -#else -#define SENSOR_CHANNEL (3) // isp通道数 -#define SENSOR_HEIGHT (1280) // isp高度,ai输入,竖屏 -#define SENSOR_WIDTH (720) // isp宽度,ai输入,竖屏 -#define ISP_CHN0_WIDTH (1088)//(1920) -#define ISP_CHN0_HEIGHT (1920)//(1080) -#define vicap_install_osd (1) -#define osd_id K_VO_OSD3 -#define osd_width (1080) -#define osd_height (1920) -#endif - - -k_vb_config config; -k_vicap_dev vicap_dev; -k_vicap_chn vicap_chn; -k_vicap_dev_attr dev_attr; -k_vicap_chn_attr chn_attr; -k_vicap_sensor_info sensor_info; -k_vicap_sensor_type sensor_type; -k_mpp_chn vicap_mpp_chn; -k_mpp_chn vo_mpp_chn; - -k_video_frame_info dump_info; - -k_vo_draw_frame vo_frame = (k_vo_draw_frame) { - 1, - 16, - 16, - 128, - 128, - 1 -}; - -static k_vb_blk_handle block; -k_u32 g_pool_id; - -int vo_creat_layer_test(k_vo_layer chn_id, layer_info *info) -{ - k_vo_video_layer_attr attr; - - // check layer - if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) - || ((info->func != 0) && (chn_id == K_VO_LAYER2))) - { - printf("input layer num failed \n"); - return -1 ; - } - - // check scaler - - // set offset - attr.display_rect = info->offset; - // set act - attr.img_size = info->act_size; - // sget size - info->size = info->act_size.height * info->act_size.width * 3 / 2; - //set pixel format - attr.pixel_format = info->format; - if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) - { - printf("input pix format failed \n"); - return -1; - } - // set stride - attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); - // set function - attr.func = info->func; - // set scaler attr - attr.scaler_attr = info->attr; - - // set video layer atrr - kd_mpi_vo_set_video_layer_attr(chn_id, &attr); - - // enable layer - kd_mpi_vo_enable_video_layer(chn_id); - - return 0; -} - -k_vb_blk_handle vo_insert_frame(k_video_frame_info *vf_info, void **pic_vaddr) -{ - k_u64 phys_addr = 0; - k_u32 *virt_addr; - k_vb_blk_handle handle; - k_s32 size; - - if (vf_info == NULL) - return K_FALSE; - - if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_8888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_8888) - size = vf_info->v_frame.height * vf_info->v_frame.width * 4; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_565 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_565) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_4444 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_4444) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_888) - size = vf_info->v_frame.height * vf_info->v_frame.width * 3; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_1555 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_1555) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) - size = vf_info->v_frame.height * vf_info->v_frame.width * 3 / 2; - - size = size + 4096; // 强制4K ,后边得删了 - - printf("vb block size is %x \n", size); - - handle = kd_mpi_vb_get_block(g_pool_id, size, NULL); - if (handle == VB_INVALID_HANDLE) - { - printf("%s get vb block error\n", __func__); - return K_FAILED; - } - - phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); - if (phys_addr == 0) - { - printf("%s get phys addr error\n", __func__); - return K_FAILED; - } - - virt_addr = (k_u32 *)kd_mpi_sys_mmap(phys_addr, size); - // virt_addr = (k_u32 *)kd_mpi_sys_mmap_cached(phys_addr, size); - - if (virt_addr == NULL) - { - printf("%s mmap error\n", __func__); - return K_FAILED; - } - - vf_info->mod_id = K_ID_VO; - vf_info->pool_id = g_pool_id; - vf_info->v_frame.phys_addr[0] = phys_addr; - if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) - vf_info->v_frame.phys_addr[1] = phys_addr + (vf_info->v_frame.height * vf_info->v_frame.stride[0]); - *pic_vaddr = virt_addr; - - printf("phys_addr is %lx g_pool_id is %d \n", phys_addr, g_pool_id); - - return handle; -} - -k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) -{ - k_vo_video_osd_attr attr; - - // set attr - attr.global_alptha = info->global_alptha; - - if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) - { - info->size = info->act_size.width * info->act_size.height * 4; - info->stride = info->act_size.width * 4 / 8; - } - else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) - { - info->size = info->act_size.width * info->act_size.height * 3; - info->stride = info->act_size.width * 3 / 8; - } - else if(info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else if(info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else - { - printf("set osd pixel format failed \n"); - } - - attr.stride = info->stride; - attr.pixel_format = info->format; - attr.display_rect = info->offset; - attr.img_size = info->act_size; - kd_mpi_vo_set_video_osd_attr(osd, &attr); - - kd_mpi_vo_osd_enable(osd); - - return 0; -} - -void sample_vicap_install_osd(void) -{ - osd_info osd; - - osd.act_size.width = osd_width ; - osd.act_size.height = osd_height; - osd.offset.x = 0; - osd.offset.y = 0; - osd.global_alptha = 0xff; - // osd.global_alptha = 0x32; - osd.format = PIXEL_FORMAT_ARGB_8888;//PIXEL_FORMAT_ARGB_4444; //PIXEL_FORMAT_ARGB_1555;//PIXEL_FORMAT_ARGB_8888; - - vo_creat_osd_test(osd_id, &osd); -} - -void vo_osd_release_block(void) -{ - if(vicap_install_osd == 1) - { - kd_mpi_vo_osd_disable(osd_id); - kd_mpi_vb_release_block(block); - } - -} - -static k_s32 sample_connector_init(void) -{ - k_u32 ret = 0; - k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) - k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; -#else - k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; -#endif - k_connector_info connector_info; - - memset(&connector_info, 0, sizeof(k_connector_info)); - - //connector get sensor info - ret = kd_mpi_get_connector_info(connector_type, &connector_info); - if (ret) { - printf("sample_vicap, the sensor type not supported!\n"); - return ret; - } - - connector_fd = kd_mpi_connector_open(connector_info.connector_name); - if (connector_fd < 0) { - printf("%s, connector open failed.\n", __func__); - return K_ERR_VO_NOTREADY; - } - - // set connect power - kd_mpi_connector_power_set(connector_fd, K_TRUE); - // connector init - kd_mpi_connector_init(connector_fd, connector_info); - - return 0; -} - -static k_s32 vo_layer_vdss_bind_vo_config(void) -{ - layer_info info; - - k_vo_layer chn_id = K_VO_LAYER1; - - memset(&info, 0, sizeof(info)); - - sample_connector_init(); - - // config lyaer - info.act_size.width = ISP_CHN0_WIDTH;//ISP_CHN0_HEIGHT;//1080;//640;//1080; - info.act_size.height = ISP_CHN0_HEIGHT;//ISP_CHN0_WIDTH;//1920;//480;//1920; - info.format = PIXEL_FORMAT_YVU_PLANAR_420; - info.func = 0;//K_ROTATION_180;////K_ROTATION_90; - info.global_alptha = 0xff; - info.offset.x = 0;//(1080-w)/2, - info.offset.y = 0;//(1920-h)/2; - vo_creat_layer_test(chn_id, &info); - - if(vicap_install_osd == 1) - sample_vicap_install_osd(); - - //exit ; - return 0; -} - -static void sample_vicap_bind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) -{ - k_s32 ret; - - ret = kd_mpi_sys_bind(&vicap_mpp_chn, &vo_mpp_chn); - if (ret) { - printf("kd_mpi_sys_unbind failed:0x%x\n", ret); - } - - return; -} - -static void sample_vicap_unbind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) -{ - k_s32 ret; - - ret = kd_mpi_sys_unbind(&vicap_mpp_chn, &vo_mpp_chn); - if (ret) { - printf("kd_mpi_sys_unbind failed:0x%x\n", ret); - } - - return; -} - -int vivcap_start() -{ - k_s32 ret = 0; - - k_u32 pool_id; - k_vb_pool_config pool_config; - - printf("sample_vicap ...\n"); - -#if defined(CONFIG_BOARD_K230_CANMV) - sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); -#else - sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; -#endif - vicap_dev = VICAP_DEV_ID_0; - - memset(&config, 0, sizeof(config)); - config.max_pool_cnt = 64; - //VB for YUV420SP output - config.comm_pool[0].blk_cnt = 5; - config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; - config.comm_pool[0].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), VICAP_ALIGN_1K); - - //VB for RGB888 output - config.comm_pool[1].blk_cnt = 5; - config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; - config.comm_pool[1].blk_size = VICAP_ALIGN_UP((SENSOR_HEIGHT * SENSOR_WIDTH * 3 ), VICAP_ALIGN_1K); - - ret = kd_mpi_vb_set_config(&config); - if (ret) { - printf("vb_set_config failed ret:%d\n", ret); - return ret; - } - - k_vb_supplement_config supplement_config; - memset(&supplement_config, 0, sizeof(supplement_config)); - supplement_config.supplement_config |= VB_SUPPLEMENT_JPEG_MASK; - - ret = kd_mpi_vb_set_supplement_config(&supplement_config); - if (ret) { - printf("vb_set_supplement_config failed ret:%d\n", ret); - return ret; - } - - ret = kd_mpi_vb_init(); - if (ret) { - printf("vb_init failed ret:%d\n", ret); - return ret; - } - printf("sample_vicap ...kd_mpi_vicap_get_sensor_info\n"); - - // dwc_dsi_init(); - vo_layer_vdss_bind_vo_config(); - - if(vicap_install_osd == 1) - { - memset(&pool_config, 0, sizeof(pool_config)); - pool_config.blk_size = VICAP_ALIGN_UP((osd_width * osd_height * 4 * 2), VICAP_ALIGN_1K); - pool_config.blk_cnt = 4; - pool_config.mode = VB_REMAP_MODE_NOCACHE; - pool_id = kd_mpi_vb_create_pool(&pool_config); // osd0 - 3 argb 320 x 240 - g_pool_id = pool_id; - - printf("--------aa--------------g_pool_id is %d pool_id is %d \n",g_pool_id, pool_id); - } - - memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); - ret = kd_mpi_vicap_get_sensor_info(sensor_type, &sensor_info); - if (ret) { - printf("sample_vicap, the sensor type not supported!\n"); - return ret; - } - - memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); - dev_attr.acq_win.h_start = 0; - dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) - dev_attr.acq_win.width = ISP_CHN0_WIDTH; - dev_attr.acq_win.height = ISP_CHN0_HEIGHT; -#else - dev_attr.acq_win.width = 2592;//SENSOR_HEIGHT; - dev_attr.acq_win.height = 1944;//SENSOR_WIDTH; -#endif - dev_attr.mode = VICAP_WORK_ONLINE_MODE; - - dev_attr.pipe_ctrl.data = 0xFFFFFFFF; - dev_attr.pipe_ctrl.bits.af_enable = 0; - dev_attr.pipe_ctrl.bits.ahdr_enable = 0; - - - dev_attr.cpature_frame = 0; - memcpy(&dev_attr.sensor_info, &sensor_info, sizeof(k_vicap_sensor_info)); - - ret = kd_mpi_vicap_set_dev_attr(vicap_dev, dev_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_dev_attr failed.\n"); - return ret; - } - - memset(&chn_attr, 0, sizeof(k_vicap_chn_attr)); - - //set chn0 output yuv420sp - chn_attr.out_win.h_start = 0; - chn_attr.out_win.v_start = 0; - chn_attr.out_win.width = ISP_CHN0_WIDTH; - chn_attr.out_win.height = ISP_CHN0_HEIGHT; - - -#if defined(CONFIG_BOARD_K230_CANMV) - chn_attr.crop_win = dev_attr.acq_win; -#else - // chn_attr.crop_win = dev_attr.acq_win; - chn_attr.crop_win.h_start = 768; - chn_attr.crop_win.v_start = 16; - chn_attr.crop_win.width = ISP_CHN0_WIDTH; - chn_attr.crop_win.height = ISP_CHN0_HEIGHT; -#endif - - chn_attr.scale_win = chn_attr.out_win; - chn_attr.crop_enable = K_FALSE; - chn_attr.scale_enable = K_FALSE; - // chn_attr.dw_enable = K_FALSE; - chn_attr.chn_enable = K_TRUE; - chn_attr.pix_format = PIXEL_FORMAT_YVU_PLANAR_420; - chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp - chn_attr.buffer_size = config.comm_pool[0].blk_size; - vicap_chn = VICAP_CHN_ID_0; - - printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); - ret = kd_mpi_vicap_set_chn_attr(vicap_dev, vicap_chn, chn_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); - return ret; - } - - //bind vicap chn 0 to vo - vicap_mpp_chn.mod_id = K_ID_VI; - vicap_mpp_chn.dev_id = vicap_dev; - vicap_mpp_chn.chn_id = vicap_chn; - - vo_mpp_chn.mod_id = K_ID_VO; - vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; - vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; - - sample_vicap_bind_vo(vicap_mpp_chn, vo_mpp_chn); - printf("sample_vicap ...dwc_dsi_init\n"); - - //set chn1 output rgb888p - chn_attr.out_win.h_start = 0; - chn_attr.out_win.v_start = 0; - chn_attr.out_win.width = SENSOR_WIDTH ; - chn_attr.out_win.height = SENSOR_HEIGHT; - // chn_attr.crop_win = dev_attr.acq_win; - -#if defined(CONFIG_BOARD_K230_CANMV) - chn_attr.crop_win = dev_attr.acq_win; -#else - chn_attr.crop_win.h_start = 768; - chn_attr.crop_win.v_start = 16; - chn_attr.crop_win.width = ISP_CHN0_WIDTH; - chn_attr.crop_win.height = ISP_CHN0_HEIGHT; -#endif - - chn_attr.scale_win = chn_attr.out_win; - chn_attr.crop_enable = K_FALSE; - chn_attr.scale_enable = K_FALSE; - // chn_attr.dw_enable = K_FALSE; - chn_attr.chn_enable = K_TRUE; - chn_attr.pix_format = PIXEL_FORMAT_BGR_888_PLANAR; - chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp - chn_attr.buffer_size = config.comm_pool[1].blk_size; - - printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); - ret = kd_mpi_vicap_set_chn_attr(vicap_dev, VICAP_CHN_ID_1, chn_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); - return ret; - } - - printf("sample_vicap ...kd_mpi_vicap_init\n"); - ret = kd_mpi_vicap_init(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - // goto err_exit; - } - - printf("sample_vicap ...kd_mpi_vicap_start_stream\n"); - ret = kd_mpi_vicap_start_stream(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - // goto err_exit; - } - - return ret; -} - -int vivcap_stop() -{ - printf("sample_vicap ...kd_mpi_vicap_stop_stream\n"); - int ret = kd_mpi_vicap_stop_stream(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - return ret; - } - - ret = kd_mpi_vicap_deinit(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_deinit failed.\n"); - return ret; - } - - kd_mpi_vo_disable_video_layer(K_VO_LAYER1); - - vicap_mpp_chn.mod_id = K_ID_VI; - vicap_mpp_chn.dev_id = vicap_dev; - vicap_mpp_chn.chn_id = vicap_chn; - - vo_mpp_chn.mod_id = K_ID_VO; - vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; - vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; - - sample_vicap_unbind_vo(vicap_mpp_chn, vo_mpp_chn); - - /*Allow one frame time for the VO to release the VB block*/ - k_u32 display_ms = 1000 / 33; - usleep(1000 * display_ms); - - ret = kd_mpi_vb_exit(); - if (ret) { - printf("sample_vicap, kd_mpi_vb_exit failed.\n"); - return ret; - } - - return 0; -} - -void yuv_rotate_90(char *des, char *src,int width,int height) -{ - int n = 0; - int hw = width>>1; - int hh = height>>1; - int size = width * height; - int hsize = size>>2; - - int pos = 0; - - for(int i = width-1;i >= 0;i--) - { - pos = 0; - for(int j= 0;j < height;j++) - { - des[n++]= src[pos+i]; - pos += width; - } - } - +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include + +#include "mpi_sys_api.h" + +/* vicap */ +#include +#include +#include +#include +#include + +#include "k_module.h" +#include "k_type.h" +#include "k_vb_comm.h" +#include "k_video_comm.h" +#include "k_sys_comm.h" +#include "mpi_vb_api.h" +#include "mpi_vicap_api.h" +#include "mpi_isp_api.h" +#include "mpi_sys_api.h" +#include "k_vo_comm.h" +#include "mpi_vo_api.h" + +#include "vo_test_case.h" + +#include "k_connector_comm.h" +#include "mpi_connector_api.h" +#include "k_autoconf_comm.h" + + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) +#define SENSOR_CHANNEL (3) // isp通道数 +#define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 +#define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 +#define ISP_CHN0_WIDTH (1920)//(1920) +#define ISP_CHN0_HEIGHT (1080)//(1080) +#define vicap_install_osd (1) +#define osd_id K_VO_OSD3 +#define osd_width (1920) +#define osd_height (1080) +#else +#define SENSOR_CHANNEL (3) // isp通道数 +#define SENSOR_HEIGHT (1280) // isp高度,ai输入,竖屏 +#define SENSOR_WIDTH (720) // isp宽度,ai输入,竖屏 +#define ISP_CHN0_WIDTH (1088)//(1920) +#define ISP_CHN0_HEIGHT (1920)//(1080) +#define vicap_install_osd (1) +#define osd_id K_VO_OSD3 +#define osd_width (1080) +#define osd_height (1920) +#endif + + +k_vb_config config; +k_vicap_dev vicap_dev; +k_vicap_chn vicap_chn; +k_vicap_dev_attr dev_attr; +k_vicap_chn_attr chn_attr; +k_vicap_sensor_info sensor_info; +k_vicap_sensor_type sensor_type; +k_mpp_chn vicap_mpp_chn; +k_mpp_chn vo_mpp_chn; + +k_video_frame_info dump_info; + +k_vo_draw_frame vo_frame = (k_vo_draw_frame) { + 1, + 16, + 16, + 128, + 128, + 1 +}; + +static k_vb_blk_handle block; +k_u32 g_pool_id; + +int vo_creat_layer_test(k_vo_layer chn_id, layer_info *info) +{ + k_vo_video_layer_attr attr; + + // check layer + if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) + || ((info->func != 0) && (chn_id == K_VO_LAYER2))) + { + printf("input layer num failed \n"); + return -1 ; + } + + // check scaler + + // set offset + attr.display_rect = info->offset; + // set act + attr.img_size = info->act_size; + // sget size + info->size = info->act_size.height * info->act_size.width * 3 / 2; + //set pixel format + attr.pixel_format = info->format; + if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) + { + printf("input pix format failed \n"); + return -1; + } + // set stride + attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); + // set function + attr.func = info->func; + // set scaler attr + attr.scaler_attr = info->attr; + + // set video layer atrr + kd_mpi_vo_set_video_layer_attr(chn_id, &attr); + + // enable layer + kd_mpi_vo_enable_video_layer(chn_id); + + return 0; +} + +k_vb_blk_handle vo_insert_frame(k_video_frame_info *vf_info, void **pic_vaddr) +{ + k_u64 phys_addr = 0; + k_u32 *virt_addr; + k_vb_blk_handle handle; + k_s32 size; + + if (vf_info == NULL) + return K_FALSE; + + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_8888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_8888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 4; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_565 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_565) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_4444 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_4444) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_1555 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_1555) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3 / 2; + + size = size + 4096; // 强制4K ,后边得删了 + + printf("vb block size is %x \n", size); + + handle = kd_mpi_vb_get_block(g_pool_id, size, NULL); + if (handle == VB_INVALID_HANDLE) + { + printf("%s get vb block error\n", __func__); + return K_FAILED; + } + + phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); + if (phys_addr == 0) + { + printf("%s get phys addr error\n", __func__); + return K_FAILED; + } + + virt_addr = (k_u32 *)kd_mpi_sys_mmap(phys_addr, size); + // virt_addr = (k_u32 *)kd_mpi_sys_mmap_cached(phys_addr, size); + + if (virt_addr == NULL) + { + printf("%s mmap error\n", __func__); + return K_FAILED; + } + + vf_info->mod_id = K_ID_VO; + vf_info->pool_id = g_pool_id; + vf_info->v_frame.phys_addr[0] = phys_addr; + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + vf_info->v_frame.phys_addr[1] = phys_addr + (vf_info->v_frame.height * vf_info->v_frame.stride[0]); + *pic_vaddr = virt_addr; + + printf("phys_addr is %lx g_pool_id is %d \n", phys_addr, g_pool_id); + + return handle; +} + +k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) +{ + k_vo_video_osd_attr attr; + + // set attr + attr.global_alptha = info->global_alptha; + + if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) + { + info->size = info->act_size.width * info->act_size.height * 4; + info->stride = info->act_size.width * 4 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) + { + info->size = info->act_size.width * info->act_size.height * 3; + info->stride = info->act_size.width * 3 / 8; + } + else if(info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if(info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else + { + printf("set osd pixel format failed \n"); + } + + attr.stride = info->stride; + attr.pixel_format = info->format; + attr.display_rect = info->offset; + attr.img_size = info->act_size; + kd_mpi_vo_set_video_osd_attr(osd, &attr); + + kd_mpi_vo_osd_enable(osd); + + return 0; +} + +void sample_vicap_install_osd(void) +{ + osd_info osd; + + osd.act_size.width = osd_width ; + osd.act_size.height = osd_height; + osd.offset.x = 0; + osd.offset.y = 0; + osd.global_alptha = 0xff; + // osd.global_alptha = 0x32; + osd.format = PIXEL_FORMAT_ARGB_8888;//PIXEL_FORMAT_ARGB_4444; //PIXEL_FORMAT_ARGB_1555;//PIXEL_FORMAT_ARGB_8888; + + vo_creat_osd_test(osd_id, &osd); +} + +void vo_osd_release_block(void) +{ + if(vicap_install_osd == 1) + { + kd_mpi_vo_osd_disable(osd_id); + kd_mpi_vb_release_block(block); + } + +} + +static k_s32 sample_connector_init(void) +{ + k_u32 ret = 0; + k_s32 connector_fd; +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#else + k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#endif + k_connector_info connector_info; + + memset(&connector_info, 0, sizeof(k_connector_info)); + + //connector get sensor info + ret = kd_mpi_get_connector_info(connector_type, &connector_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + + connector_fd = kd_mpi_connector_open(connector_info.connector_name); + if (connector_fd < 0) { + printf("%s, connector open failed.\n", __func__); + return K_ERR_VO_NOTREADY; + } + + // set connect power + kd_mpi_connector_power_set(connector_fd, K_TRUE); + // connector init + kd_mpi_connector_init(connector_fd, connector_info); + + return 0; +} + +static k_s32 vo_layer_vdss_bind_vo_config(void) +{ + layer_info info; + + k_vo_layer chn_id = K_VO_LAYER1; + + memset(&info, 0, sizeof(info)); + + sample_connector_init(); + + // config lyaer + info.act_size.width = ISP_CHN0_WIDTH;//ISP_CHN0_HEIGHT;//1080;//640;//1080; + info.act_size.height = ISP_CHN0_HEIGHT;//ISP_CHN0_WIDTH;//1920;//480;//1920; + info.format = PIXEL_FORMAT_YVU_PLANAR_420; + info.func = 0;//K_ROTATION_180;////K_ROTATION_90; + info.global_alptha = 0xff; + info.offset.x = 0;//(1080-w)/2, + info.offset.y = 0;//(1920-h)/2; + vo_creat_layer_test(chn_id, &info); + + if(vicap_install_osd == 1) + sample_vicap_install_osd(); + + //exit ; + return 0; +} + +static void sample_vicap_bind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) +{ + k_s32 ret; + + ret = kd_mpi_sys_bind(&vicap_mpp_chn, &vo_mpp_chn); + if (ret) { + printf("kd_mpi_sys_unbind failed:0x%x\n", ret); + } + + return; +} + +static void sample_vicap_unbind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) +{ + k_s32 ret; + + ret = kd_mpi_sys_unbind(&vicap_mpp_chn, &vo_mpp_chn); + if (ret) { + printf("kd_mpi_sys_unbind failed:0x%x\n", ret); + } + + return; +} + +int vivcap_start() +{ + k_s32 ret = 0; + + k_u32 pool_id; + k_vb_pool_config pool_config; + + printf("sample_vicap ...\n"); + +#if defined(CONFIG_BOARD_K230_CANMV) + sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; +#else + sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; +#endif + vicap_dev = VICAP_DEV_ID_0; + + memset(&config, 0, sizeof(config)); + config.max_pool_cnt = 64; + //VB for YUV420SP output + config.comm_pool[0].blk_cnt = 5; + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[0].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), VICAP_ALIGN_1K); + + //VB for RGB888 output + config.comm_pool[1].blk_cnt = 5; + config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[1].blk_size = VICAP_ALIGN_UP((SENSOR_HEIGHT * SENSOR_WIDTH * 3 ), VICAP_ALIGN_1K); + + ret = kd_mpi_vb_set_config(&config); + if (ret) { + printf("vb_set_config failed ret:%d\n", ret); + return ret; + } + + k_vb_supplement_config supplement_config; + memset(&supplement_config, 0, sizeof(supplement_config)); + supplement_config.supplement_config |= VB_SUPPLEMENT_JPEG_MASK; + + ret = kd_mpi_vb_set_supplement_config(&supplement_config); + if (ret) { + printf("vb_set_supplement_config failed ret:%d\n", ret); + return ret; + } + + ret = kd_mpi_vb_init(); + if (ret) { + printf("vb_init failed ret:%d\n", ret); + return ret; + } + printf("sample_vicap ...kd_mpi_vicap_get_sensor_info\n"); + + // dwc_dsi_init(); + vo_layer_vdss_bind_vo_config(); + + if(vicap_install_osd == 1) + { + memset(&pool_config, 0, sizeof(pool_config)); + pool_config.blk_size = VICAP_ALIGN_UP((osd_width * osd_height * 4 * 2), VICAP_ALIGN_1K); + pool_config.blk_cnt = 4; + pool_config.mode = VB_REMAP_MODE_NOCACHE; + pool_id = kd_mpi_vb_create_pool(&pool_config); // osd0 - 3 argb 320 x 240 + g_pool_id = pool_id; + + printf("--------aa--------------g_pool_id is %d pool_id is %d \n",g_pool_id, pool_id); + } + + memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); + ret = kd_mpi_vicap_get_sensor_info(sensor_type, &sensor_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + + memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); + dev_attr.acq_win.h_start = 0; + dev_attr.acq_win.v_start = 0; +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + dev_attr.acq_win.width = ISP_CHN0_WIDTH; + dev_attr.acq_win.height = ISP_CHN0_HEIGHT; +#else + dev_attr.acq_win.width = 2592;//SENSOR_HEIGHT; + dev_attr.acq_win.height = 1944;//SENSOR_WIDTH; +#endif + dev_attr.mode = VICAP_WORK_ONLINE_MODE; + + dev_attr.pipe_ctrl.data = 0xFFFFFFFF; + dev_attr.pipe_ctrl.bits.af_enable = 0; + dev_attr.pipe_ctrl.bits.ahdr_enable = 0; + + + dev_attr.cpature_frame = 0; + memcpy(&dev_attr.sensor_info, &sensor_info, sizeof(k_vicap_sensor_info)); + + ret = kd_mpi_vicap_set_dev_attr(vicap_dev, dev_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_dev_attr failed.\n"); + return ret; + } + + memset(&chn_attr, 0, sizeof(k_vicap_chn_attr)); + + //set chn0 output yuv420sp + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = ISP_CHN0_WIDTH; + chn_attr.out_win.height = ISP_CHN0_HEIGHT; + + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + chn_attr.crop_win = dev_attr.acq_win; +#else + // chn_attr.crop_win = dev_attr.acq_win; + chn_attr.crop_win.h_start = 768; + chn_attr.crop_win.v_start = 16; + chn_attr.crop_win.width = ISP_CHN0_WIDTH; + chn_attr.crop_win.height = ISP_CHN0_HEIGHT; +#endif + + chn_attr.scale_win = chn_attr.out_win; + chn_attr.crop_enable = K_FALSE; + chn_attr.scale_enable = K_FALSE; + // chn_attr.dw_enable = K_FALSE; + chn_attr.chn_enable = K_TRUE; + chn_attr.pix_format = PIXEL_FORMAT_YVU_PLANAR_420; + chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp + chn_attr.buffer_size = config.comm_pool[0].blk_size; + vicap_chn = VICAP_CHN_ID_0; + + printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); + ret = kd_mpi_vicap_set_chn_attr(vicap_dev, vicap_chn, chn_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); + return ret; + } + + //bind vicap chn 0 to vo + vicap_mpp_chn.mod_id = K_ID_VI; + vicap_mpp_chn.dev_id = vicap_dev; + vicap_mpp_chn.chn_id = vicap_chn; + + vo_mpp_chn.mod_id = K_ID_VO; + vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; + vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; + + sample_vicap_bind_vo(vicap_mpp_chn, vo_mpp_chn); + printf("sample_vicap ...dwc_dsi_init\n"); + + //set chn1 output rgb888p + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = SENSOR_WIDTH ; + chn_attr.out_win.height = SENSOR_HEIGHT; + // chn_attr.crop_win = dev_attr.acq_win; + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + chn_attr.crop_win = dev_attr.acq_win; +#else + chn_attr.crop_win.h_start = 768; + chn_attr.crop_win.v_start = 16; + chn_attr.crop_win.width = ISP_CHN0_WIDTH; + chn_attr.crop_win.height = ISP_CHN0_HEIGHT; +#endif + + chn_attr.scale_win = chn_attr.out_win; + chn_attr.crop_enable = K_FALSE; + chn_attr.scale_enable = K_FALSE; + // chn_attr.dw_enable = K_FALSE; + chn_attr.chn_enable = K_TRUE; + chn_attr.pix_format = PIXEL_FORMAT_BGR_888_PLANAR; + chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp + chn_attr.buffer_size = config.comm_pool[1].blk_size; + + printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); + ret = kd_mpi_vicap_set_chn_attr(vicap_dev, VICAP_CHN_ID_1, chn_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); + return ret; + } + + printf("sample_vicap ...kd_mpi_vicap_init\n"); + ret = kd_mpi_vicap_init(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + // goto err_exit; + } + + printf("sample_vicap ...kd_mpi_vicap_start_stream\n"); + ret = kd_mpi_vicap_start_stream(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + // goto err_exit; + } + + return ret; +} + +int vivcap_stop() +{ + printf("sample_vicap ...kd_mpi_vicap_stop_stream\n"); + int ret = kd_mpi_vicap_stop_stream(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + return ret; + } + + ret = kd_mpi_vicap_deinit(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_deinit failed.\n"); + return ret; + } + + kd_mpi_vo_disable_video_layer(K_VO_LAYER1); + + vicap_mpp_chn.mod_id = K_ID_VI; + vicap_mpp_chn.dev_id = vicap_dev; + vicap_mpp_chn.chn_id = vicap_chn; + + vo_mpp_chn.mod_id = K_ID_VO; + vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; + vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; + + sample_vicap_unbind_vo(vicap_mpp_chn, vo_mpp_chn); + + /*Allow one frame time for the VO to release the VB block*/ + k_u32 display_ms = 1000 / 33; + usleep(1000 * display_ms); + + ret = kd_mpi_vb_exit(); + if (ret) { + printf("sample_vicap, kd_mpi_vb_exit failed.\n"); + return ret; + } + + return 0; +} + +void yuv_rotate_90(char *des, char *src,int width,int height) +{ + int n = 0; + int hw = width>>1; + int hh = height>>1; + int size = width * height; + int hsize = size>>2; + + int pos = 0; + + for(int i = width-1;i >= 0;i--) + { + pos = 0; + for(int j= 0;j < height;j++) + { + des[n++]= src[pos+i]; + pos += width; + } + } + } \ No newline at end of file diff --git a/src/reference/ai_poc/pose_det_rtsp_plug/CMakeLists.txt b/src/reference/ai_poc/pose_det_rtsp_plug/CMakeLists.txt new file mode 100644 index 000000000..15f39b421 --- /dev/null +++ b/src/reference/ai_poc/pose_det_rtsp_plug/CMakeLists.txt @@ -0,0 +1 @@ +add_subdirectory(big) \ No newline at end of file diff --git a/src/reference/ai_poc/pose_det_rtsp_plug/README.md b/src/reference/ai_poc/pose_det_rtsp_plug/README.md new file mode 100644 index 000000000..c0cc3fa11 --- /dev/null +++ b/src/reference/ai_poc/pose_det_rtsp_plug/README.md @@ -0,0 +1,61 @@ +# 1.简介 + +RTSP是实时流协议(Real-Time Streaming Protocol)的缩写。它是一种用于在计算机网络上控制实时数据流传输的网络协议。RTSP通常用于控制流媒体服务器上的音频或视频数据流的传输。 + +人体关键点检测是一项涉及识别图像或视频中人体对象特定点(通常称为关键点)位置的任务。关键点可以表示人体对象的各个部分,例如关节或其他独特特征。关键点的位置通常表示为一组 2D [x, y] 或 3D [x, y,visible] 坐标。人体关键点检测模型的输出是一组代表图像或视频中人体对象上的关键点,以及每个点的置信度得分。 + +本demo可以实现将k230开发板sensor读取的图像进行处理,绘制检测结果到图像上,将此图像通过rtsp推送到外部。 + +# 2.应用使用说明 + +## 2.1 使用帮助 + +注:编译可以执行文件前,需在src的上一级目录下执行 make cdk-user + +大核命令提示: + +``` +Usage: ./pose_detect.elf +For example: + [for isp] ./pose_detect.elf yolov8n-pose.kmodel 0.3 0.45 0 +Options: + 1> kmodel pose检测kmodel文件路径 + 2> obj_thresh pose检测阈值 + 3> nms_thresh NMS阈值 + 4> debug_mode 是否需要调试,0、1、2分别表示不调试、简单调试、详细调试 +``` + +小核命令提示: + +``` +Usage: ./rtspServer [-p phyAddr] [-t ] +-p: phyAddr 大核指定的datafifo物理地址 +-t: 视频编码类型: h264/h265, 默认h265 +``` + +pc端安装VLC工具:https://www.videolan.org/vlc/index.zh_CN.html + +##### 执行步骤: + +1. 在大核执行rtsp_plug_big.sh + + ``` + ./pose_det_enc.elf yolov8n-pose.kmodel 0.3 0.45 0 + ``` + +2. 在小核执行rtsp_plug_little.sh(释放执行权限 chmod 777 rtsp_plug_little.sh) + + ``` + ./rtspServer -p 1628c000 -t h265 + ``` + +3. pc端打开VLC工具,拷贝小核输出ip到VLC,点击播放执行拉流操作(**确保开发板连接网线**) + +流程0 + +流程1 + + +## 2.2 效果展示 + +rtsp推流效果 \ No newline at end of file diff --git a/src/reference/ai_poc/pose_det_rtsp_plug/big/CMakeLists.txt b/src/reference/ai_poc/pose_det_rtsp_plug/big/CMakeLists.txt new file mode 100644 index 000000000..74b93d81c --- /dev/null +++ b/src/reference/ai_poc/pose_det_rtsp_plug/big/CMakeLists.txt @@ -0,0 +1,25 @@ +set(src main.cc utils.cc ai_base.cc scoped_timing.hpp pose_detect.cc) +set(bin pose_det_enc.elf) + +include_directories(${PROJECT_SOURCE_DIR}) +include_directories(.) + +include_directories(${k230_sdk}/src/common/cdk/user/component/datafifo/include) +include_directories(${PROJECT_SOURCE_DIR}/rtsp_enc) +include_directories(${nncase_sdk_root}/riscv64/rvvlib/include) +include_directories(${k230_sdk}/src/big/mpp/userapps/api/) +include_directories(${k230_sdk}/src/big/mpp/include) +include_directories(${k230_sdk}/src/big/mpp/include/comm) +include_directories(${k230_sdk}/src/big/mpp/userapps/sample/sample_vo) + +link_directories(${k230_sdk}/src/common/cdk/user/component/datafifo/host/lib) +link_directories(${nncase_sdk_root}/riscv64/rvvlib/) + +add_executable(${bin} ${src}) +target_link_libraries(${bin} -Wl,--start-group rvv Nncase.Runtime.Native nncase.rt_modules.k230 functional_k230 sys vicap vb cam_device cam_engine + hal oslayer ebase fpga isp_drv binder auto_ctrol common cam_caldb isi 3a buffer_management cameric_drv video_in virtual_hal start_engine cmd_buffer + switch cameric_reg_drv t_database_c t_mxml_c t_json_c t_common_c vo connector sensor atomic dma vdec vicap venc datafifo -Wl,--end-group) + +target_link_libraries(${bin} opencv_imgproc opencv_imgcodecs opencv_core zlib libjpeg-turbo libopenjp2 libpng libtiff libwebp csi_cv) +install(TARGETS ${bin} DESTINATION bin) + diff --git a/src/reference/ai_poc/pose_det_rtsp_plug/big/ai_base.cc b/src/reference/ai_poc/pose_det_rtsp_plug/big/ai_base.cc new file mode 100644 index 000000000..bad79eed6 --- /dev/null +++ b/src/reference/ai_poc/pose_det_rtsp_plug/big/ai_base.cc @@ -0,0 +1,184 @@ +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "ai_base.h" + +#include +#include +#include +#include + +#include +#include "utils.h" + +using std::cout; +using std::endl; +using namespace nncase; +using namespace nncase::runtime::detail; + +AIBase::AIBase(const char *kmodel_file,const string model_name, const int debug_mode) : debug_mode_(debug_mode),model_name_(model_name) +{ + if (debug_mode > 1) + cout << "kmodel_file:" << kmodel_file << endl; + std::ifstream ifs(kmodel_file, std::ios::binary); + kmodel_interp_.load_model(ifs).expect("Invalid kmodel"); + set_input_init(); + set_output_init(); +} + +AIBase::~AIBase() +{ +} + +void AIBase::set_input_init() +{ + ScopedTiming st(model_name_ + " set_input init", debug_mode_); + int input_total_size = 0; + each_input_size_by_byte_.push_back(0); // 先补0,为之后做准备 + for (int i = 0; i < kmodel_interp_.inputs_size(); ++i) + { + auto desc = kmodel_interp_.input_desc(i); + auto shape = kmodel_interp_.input_shape(i); + auto tensor = host_runtime_tensor::create(desc.datatype, shape, hrt::pool_shared).expect("cannot create input tensor"); + kmodel_interp_.input_tensor(i, tensor).expect("cannot set input tensor"); + vector in_shape; + if (debug_mode_ > 1) + cout<<"input "<< std::to_string(i) <<" : "< 1) + cout << shape[j] << ","; + } + if (debug_mode_ > 1) + cout << endl; + input_shapes_.push_back(in_shape); + // DEFINE_TYPECODE(uint8, u8, 0x06) + // DEFINE_TYPECODE(float32, f32, 0x0B) + if (desc.datatype == dt_int8 || desc.datatype == dt_uint8) + { + input_total_size += dsize; + } + else if (desc.datatype == dt_int16 || desc.datatype == dt_uint16 || desc.datatype == dt_float16 || desc.datatype == dt_bfloat16) + { + input_total_size += (dsize * 2); + } + else if (desc.datatype == dt_int32 || desc.datatype == dt_uint32 || desc.datatype == dt_float32) + { + input_total_size += (dsize * 4); + } + else if(desc.datatype == dt_int64 || desc.datatype == dt_uint64 || desc.datatype == dt_float64) + { + input_total_size += (dsize * 8); + } + else + { + printf("input data type:%d",desc.datatype); + assert(("unsupported kmodel output data type", 0)); + } + each_input_size_by_byte_.push_back(input_total_size); + + } + each_input_size_by_byte_.push_back(input_total_size); // 最后一个保存总大小 +} + +runtime_tensor AIBase::get_input_tensor(size_t idx) +{ + return kmodel_interp_.input_tensor(idx).expect("cannot get input tensor"); +} + +void AIBase::set_output_init() +{ + ScopedTiming st(model_name_ + " set_output_init", debug_mode_); + each_output_size_by_byte_.clear(); + int output_total_size = 0; + each_output_size_by_byte_.push_back(0); + for (size_t i = 0; i < kmodel_interp_.outputs_size(); i++) + { + auto desc = kmodel_interp_.output_desc(i); + auto shape = kmodel_interp_.output_shape(i); + vector out_shape; + if (debug_mode_ > 1) + cout<<"output "< 1) + cout << shape[j] << ","; + } + if (debug_mode_ > 1) + cout << endl; + output_shapes_.push_back(out_shape); + if (desc.datatype == dt_int8 || desc.datatype == dt_uint8) + { + output_total_size += dsize; + } + else if (desc.datatype == dt_int16 || desc.datatype == dt_uint16 || desc.datatype == dt_float16 || desc.datatype == dt_bfloat16) + { + output_total_size += (dsize * 2); + } + else if (desc.datatype == dt_int32 || desc.datatype == dt_uint32 || desc.datatype == dt_float32) + { + output_total_size += (dsize * 4); + } + else if(desc.datatype == dt_int64 || desc.datatype == dt_uint64 || desc.datatype == dt_float64) + { + output_total_size += (dsize * 8); + } + else + { + printf("output data type:%d",desc.datatype); + assert(("unsupported kmodel output data type", 0)); + } + + each_output_size_by_byte_.push_back(output_total_size); + auto tensor = host_runtime_tensor::create(desc.datatype, shape, hrt::pool_shared).expect("cannot create output tensor"); + kmodel_interp_.output_tensor(i, tensor).expect("cannot set output tensor"); + } +} + +void AIBase::run() +{ + ScopedTiming st(model_name_ + " run", debug_mode_); + kmodel_interp_.run().expect("error occurred in running model"); +} + +void AIBase::get_output() +{ + ScopedTiming st(model_name_ + " get_output", debug_mode_); + p_outputs_.clear(); + for (int i = 0; i < kmodel_interp_.outputs_size(); i++) + { + auto out = kmodel_interp_.output_tensor(i).expect("cannot get output tensor"); + // auto mapped_buf = std::move(hrt::map(out, map_access_::map_read).unwrap()); + // float *p_out = reinterpret_cast(mapped_buf.buffer().data()); + auto buf = out.impl()->to_host().unwrap()->buffer().as_host().unwrap().map(map_access_::map_read).unwrap().buffer(); + float *p_out = reinterpret_cast(buf.data()); + p_outputs_.push_back(p_out); + } +} \ No newline at end of file diff --git a/src/reference/ai_poc/pose_det_rtsp_plug/big/ai_base.h b/src/reference/ai_poc/pose_det_rtsp_plug/big/ai_base.h new file mode 100644 index 000000000..7486c9d35 --- /dev/null +++ b/src/reference/ai_poc/pose_det_rtsp_plug/big/ai_base.h @@ -0,0 +1,104 @@ +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +// ai_base.h +#ifndef AI_BASE_H +#define AI_BASE_H + +#include +#include +#include + +#include +#include "scoped_timing.hpp" + +using std::string; +using std::vector; +using namespace nncase::runtime; + +/** + * @brief AI基类,封装nncase相关操作 + * 主要封装了nncase的加载、设置输入、运行、获取输出操作,后续开发demo只需要关注模型的前处理、后处理即可 + */ +class AIBase +{ +public: + /** + * @brief AI基类构造函数,加载kmodel,并初始化kmodel输入、输出 + * @param kmodel_file kmodel文件路径 + * @param debug_mode 0(不调试)、 1(只显示时间)、2(显示所有打印信息) + * @return None + */ + AIBase(const char *kmodel_file,const string model_name, const int debug_mode = 1); + + /** + * @brief AI基类析构函数 + * @return None + */ + ~AIBase(); + + /** + * @brief 根据索引获取kmodel输入tensor + * @param idx 输入数据指针 + * @return None + */ + runtime_tensor get_input_tensor(size_t idx); + + /** + * @brief 推理kmodel + * @return None + */ + void run(); + + /** + * @brief 获取kmodel输出,结果保存在对应的类属性中 + * @return None + */ + void get_output(); + +protected: + string model_name_; // 模型名字 + int debug_mode_; // 调试模型,0(不打印),1(打印时间),2(打印所有) + vector p_outputs_; // kmodel输出对应的指针列表 + vector> input_shapes_; //{{N,C,H,W},{N,C,H,W}...} + vector> output_shapes_; //{{N,C,H,W},{N,C,H,W}...}} 或 {{N,C},{N,C}...}}等 + vector each_input_size_by_byte_; //{0,layer1_length,layer1_length+layer2_length,...} + vector each_output_size_by_byte_; //{0,layer1_length,layer1_length+layer2_length,...} +private: + /** + * @brief 首次初始化kmodel输入,并获取输入shape + * @return None + */ + void set_input_init(); + + /** + * @brief 首次初始化kmodel输出,并获取输出shape + * @return None + */ + void set_output_init(); + + interpreter kmodel_interp_; // kmodel解释器,从kmodel文件构建,负责模型的加载、输入输出设置和推理 + vector kmodel_vec_; // 通过读取kmodel文件得到整个kmodel数据,用于传给kmodel解释器加载kmodel +}; +#endif \ No newline at end of file diff --git a/src/reference/ai_poc/pose_det_rtsp_plug/big/main.cc b/src/reference/ai_poc/pose_det_rtsp_plug/big/main.cc new file mode 100644 index 000000000..5da5acb5c --- /dev/null +++ b/src/reference/ai_poc/pose_det_rtsp_plug/big/main.cc @@ -0,0 +1,746 @@ +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "utils.h" +#include +#include + +#include "k_module.h" +#include "k_type.h" +#include "k_vb_comm.h" +#include "k_video_comm.h" +#include "k_sys_comm.h" +#include "mpi_vb_api.h" +#include "mpi_vo_api.h" +#include "mpi_sys_api.h" +#include "k_vvo_comm.h" +#include "mpi_venc_api.h" +#include "k_venc_comm.h" +#include "mpi_vvi_api.h" +#include "vo_test_case.h" +#include "pose_detect.h" + +#include "vi_vo.h" +#include "k_datafifo.h" + +#define ENABLE_VDEC_DEBUG 1 +#define BIND_VO_LAYER 1 + +#ifdef ENABLE_VDEC_DEBUG + #define vdec_debug printf +#else + #define vdec_debug(ARGS...) +#endif + +#define MAX_WIDTH 1088 +#define MAX_HEIGHT 1920 +#define STREAM_BUF_SIZE MAX_WIDTH*MAX_HEIGHT +#define FRAME_BUF_SIZE MAX_WIDTH*MAX_HEIGHT*2 +#define INPUT_BUF_CNT 4 +#define OUTPUT_BUF_CNT 6 + +#define VENC_MAX_IN_FRAMES 30 +#define ENABLE_VENC_DEBUG 1 + +#ifdef ENABLE_VDSS + #include "k_vdss_comm.h" + #include "mpi_vdss_api.h" +#else + #include "mpi_vicap_api.h" +#endif + +#ifdef ENABLE_VENC_DEBUG + #define venc_debug printf +#else + #define venc_debug(ARGS...) +#endif + +#define VE_MAX_WIDTH 1920 +#define VE_MAX_HEIGHT 1080 +#define VE_STREAM_BUF_SIZE ((VE_MAX_WIDTH*VE_MAX_HEIGHT/2 + 0xfff) & ~0xfff) +#define VE_FRAME_BUF_SIZE ((VE_MAX_WIDTH*VE_MAX_HEIGHT*2 + 0xfff) & ~0xfff) +#define OSD_MAX_WIDTH 1920 +#define OSD_MAX_HEIGHT 1088 +#define OSD_BUF_SIZE OSD_MAX_WIDTH*OSD_MAX_HEIGHT*4 +#define VE_INPUT_BUF_CNT 6 +#define VE_OUTPUT_BUF_CNT 15 +#define OSD_BUF_CNT 20 + +// datafifo +#define READER_INDEX 0 +#define WRITER_INDEX 1 +static k_s32 g_s32Index = 0; +static k_datafifo_handle hDataFifo[2] = {(k_datafifo_handle)K_DATAFIFO_INVALID_HANDLE, (k_datafifo_handle)K_DATAFIFO_INVALID_HANDLE}; +static const k_s32 BLOCK_LEN = 1024000; +k_char *buf = (k_char*)malloc(BLOCK_LEN); + +//*******************************encoder************* +typedef enum +{ + VENC_SAMPLE_STATUS_IDLE = 0, + VENC_SAMPLE_STATUS_INIT, + VENC_SAMPLE_STATUS_START, + VENC_SAMPLE_STATUS_BINDED, + VENC_SAMPLE_STATUS_UNBINDED, + VENC_SAMPLE_STATUE_RUNING, + VENC_SAMPLE_STATUS_STOPED, + VENC_SAMPLE_STATUS_BUTT +} VENC_SAMPLE_STATUS; + +typedef struct +{ + k_u32 osd_width_; + k_u32 osd_height_; + k_u32 osd_phys_addr[VENC_MAX_IN_FRAMES][3]; + void *osd_virt_addr[VENC_MAX_IN_FRAMES][3]; + k_u32 osd_startx; + k_u32 osd_starty; + k_venc_2d_src_dst_fmt video_fmt; + k_venc_2d_osd_fmt osd_fmt; + k_u16 bg_alpha; + k_u16 osd_alpha; + k_u16 video_alpha; + k_venc_2d_add_order add_order; + k_u32 bg_color; + k_u16 osd_coef[K_VENC_2D_COEF_NUM]; + k_u8 osd_region_num; + k_bool osd_matrix_en; +} osd_conf_t; + +typedef struct +{ + k_u16 width; + k_u16 height; + k_u16 line_width; + k_u16 startx; + k_u16 starty; +} border_conf_t; + +typedef struct +{ + k_u32 ch_id; + k_u32 output_frames; +} output_info; + +typedef struct +{ + k_u32 chnum; + pthread_t output_tid; + k_bool osd_enable; + osd_conf_t *osd_conf; + k_vb_blk_handle osd_blk_handle; + k_bool ch_done; +} venc_conf_t; + +char filename[50]; +FILE *output_file = NULL; +std::atomic isp_stop(false); + +VENC_SAMPLE_STATUS g_venc_sample_status = VENC_SAMPLE_STATUS_IDLE; +venc_conf_t g_venc_conf; + +//****************function*********************************** + +static inline void CHECK_RET(k_s32 ret, const char *func, const int line) +{ + if (ret) + printf("error ret %d, func %s line %d\n", ret, func, line); +} + +/** +*vb初始化 +*/ +static k_s32 sample_vb_init(k_u32 ch_cnt, k_bool osd_enable) +{ + k_s32 ret; + k_vb_config config; + + memset(&config, 0, sizeof(config)); + + config.max_pool_cnt = 64; + config.comm_pool[0].blk_cnt = VE_INPUT_BUF_CNT * ch_cnt; + config.comm_pool[0].blk_size = VE_FRAME_BUF_SIZE; + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[1].blk_cnt = VE_OUTPUT_BUF_CNT * ch_cnt; + config.comm_pool[1].blk_size =VE_STREAM_BUF_SIZE; + config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[2].blk_cnt = 4; + config.comm_pool[2].blk_size =OSD_BUF_SIZE; + config.comm_pool[2].mode = VB_REMAP_MODE_NOCACHE; + + //VB for YUV420SP output + config.comm_pool[3].blk_cnt = 5; + config.comm_pool[3].mode = VB_REMAP_MODE_NOCACHE; + // !!!!!!!!=============== 这里是编码的时候为了 4k对齐设置的 12; 0x1000);=============== !!!!!!!!! + config.comm_pool[3].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), 0x1000); + + //VB for RGB888 output + config.comm_pool[4].blk_cnt = 5; + config.comm_pool[4].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[4].blk_size = VICAP_ALIGN_UP((SENSOR_HEIGHT * SENSOR_WIDTH * 3 ), VICAP_ALIGN_1K); + + ret = kd_mpi_vb_set_config(&config); + + k_vb_supplement_config supplement_config; + memset(&supplement_config, 0, sizeof(supplement_config)); + supplement_config.supplement_config |= VB_SUPPLEMENT_JPEG_MASK; + + ret = kd_mpi_vb_set_supplement_config(&supplement_config); + if (ret) { + printf("vb_set_supplement_config failed ret:%d\n", ret); + return ret; + } + + venc_debug("-----------venc sample test------------------------\n"); + + if (ret) + venc_debug("vb_set_config failed ret:%d\n", ret); + + ret = kd_mpi_vb_init(); + if (ret) + venc_debug("vb_init failed ret:%d\n", ret); + + return ret; +} + +/** +*vb退出 +*/ +static k_s32 sample_vb_exit(void) +{ + k_s32 ret; + ret = kd_mpi_vb_exit(); + if (ret) + vdec_debug("vb_exit failed ret:%d\n", ret); + return ret; +} + + +// datafifo + +static void release(void* pStream) +{ + printf("release %p\n", pStream); +} + +static int datafifo_init(void) +{ + k_s32 s32Ret = K_SUCCESS; + + k_datafifo_params_s writer_params = {10, BLOCK_LEN, K_TRUE, DATAFIFO_WRITER}; + + s32Ret = kd_datafifo_open(&hDataFifo[WRITER_INDEX], &writer_params); + + if (K_SUCCESS != s32Ret) + { + printf("open datafifo error:%x\n", s32Ret); + return -1; + } + + k_u64 phyAddr = 0; + s32Ret = kd_datafifo_cmd(hDataFifo[WRITER_INDEX], DATAFIFO_CMD_GET_PHY_ADDR, &phyAddr); + + if (K_SUCCESS != s32Ret) + { + printf("get datafifo phy addr error:%x\n", s32Ret); + return -1; + } + + printf("PhyAddr: %lx\n", phyAddr); + + s32Ret = kd_datafifo_cmd(hDataFifo[WRITER_INDEX], DATAFIFO_CMD_SET_DATA_RELEASE_CALLBACK, (void *)release); + // s32Ret = kd_datafifo_cmd(hDataFifo[WRITER_INDEX], DATAFIFO_CMD_SET_DATA_RELEASE_CALLBACK, &phyAddr); + + if (K_SUCCESS != s32Ret) + { + printf("set release func callback error:%x\n", s32Ret); + return -1; + } + + printf("datafifo_init finish\n"); + + return 0; +} + +void datafifo_deinit(void) +{ + k_s32 s32Ret = K_SUCCESS; + // call write NULL to flush and release stream buffer. + s32Ret = kd_datafifo_write(hDataFifo[WRITER_INDEX], NULL); + if (K_SUCCESS != s32Ret) + { + printf("write error:%x\n", s32Ret); + } + printf(" kd_datafifo_close %lx\n", hDataFifo[WRITER_INDEX]); + // printf(" kd_datafifo_close %lx\n", hDataFifo[READER_INDEX]); + kd_datafifo_close(hDataFifo[WRITER_INDEX]); + // kd_datafifo_close(hDataFifo[READER_INDEX]); + printf(" finish\n"); +} + + +/** +*编码器输出线程逻辑 +*/ +static void *venc_output_thread(void *arg) +{ + // datafifo + k_s32 s32Ret = K_SUCCESS; + s32Ret = datafifo_init(); + if (0 != s32Ret) + { + std::cout << "====== datafifo init failed ======"; + } + + memset(buf, 0, BLOCK_LEN); + k_venc_stream output; + int out_cnt, out_frames; + k_s32 ret; + int i; + k_u32 total_len = 0; + output_info *info = (output_info *)arg; + out_cnt = 0; + out_frames = 0; + + // int index = 0; + while (1) + { + // datafifo + k_u32 availWriteLen = 0; + // call write NULL to flush + s32Ret = kd_datafifo_write(hDataFifo[WRITER_INDEX], NULL); + if (K_SUCCESS != s32Ret) + { + printf("write error:%x\n", s32Ret); + } + s32Ret = kd_datafifo_cmd(hDataFifo[WRITER_INDEX], DATAFIFO_CMD_GET_AVAIL_WRITE_LEN, &availWriteLen); + if (K_SUCCESS != s32Ret) + { + printf("get available write len error:%x\n", s32Ret); + break; + } + + + k_venc_chn_status status; + ret = kd_mpi_venc_query_status(info->ch_id, &status); + CHECK_RET(ret, __func__, __LINE__); + + if (status.cur_packs > 0) + output.pack_cnt = status.cur_packs; + else + output.pack_cnt = 1; + output.pack = static_cast(malloc(sizeof(k_venc_pack) * output.pack_cnt)); + + // // 设置关键帧频率 + // if (index % 4 == 0) + // { + // index = 0; + // ret = kd_mpi_venc_request_idr(0); + // } + // index ++; + + //获取编码码流 + ret = kd_mpi_venc_get_stream(info->ch_id, &output, -1); + CHECK_RET(ret, __func__, __LINE__); + //将码流写入h265文件 + out_cnt += output.pack_cnt; + for (i = 0; i < output.pack_cnt; i++) + { + if (output.pack[i].type != K_VENC_HEADER) + { + out_frames++; + } + + k_u8 *pData; + pData = (k_u8 *)kd_mpi_sys_mmap(output.pack[i].phys_addr, output.pack[i].len); + + if (availWriteLen >= BLOCK_LEN) + { + memcpy(buf, (void *)&(output.pack[i].pts), sizeof(k_u64)); + memcpy(buf + sizeof(k_u64), (void *)&(output.pack[i].len), sizeof(k_u32)); + memcpy(buf + sizeof(k_u64) + sizeof(k_u32), (void *)pData, output.pack[i].len); + + s32Ret = kd_datafifo_write(hDataFifo[WRITER_INDEX], buf); + if (K_SUCCESS != s32Ret) + { + printf("write error:%x\n", s32Ret); + break; + } + s32Ret = kd_datafifo_cmd(hDataFifo[WRITER_INDEX], DATAFIFO_CMD_WRITE_DONE, NULL); + if (K_SUCCESS != s32Ret) + { + printf("write done error:%x\n", s32Ret); + break; + } + + g_s32Index++; + + } + + kd_mpi_sys_munmap(pData, output.pack[i].len); + total_len += output.pack[i].len; + } + + ret = kd_mpi_venc_release_stream(info->ch_id, &output); + CHECK_RET(ret, __func__, __LINE__); + + free(output.pack); + } + + //关闭文件 + if (output_file) + fclose(output_file); + venc_debug("%s>done, ch %d: out_frames %d, size %d bits\n", __func__, info->ch_id, out_frames, total_len * 8); + return arg; +} + +/** +*初始化AI计算后发给编码器的帧 +*/ +k_vb_blk_handle init_venc_frame(k_video_frame_info *vf_info, void **pic_vaddr,k_u32 g_pool_id) +{ + k_u64 phys_addr = 0; + k_u32 *virt_addr; + k_vb_blk_handle handle; + k_s32 size; + + if (vf_info == NULL) + return K_FALSE; + + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_8888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_8888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 4; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_565 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_565) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_4444 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_4444) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_1555 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_1555) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3 / 2; + + printf("vb block size is %x \n", size); + + handle = kd_mpi_vb_get_block(g_pool_id, size, NULL); + if (handle == VB_INVALID_HANDLE) + { + printf("%s get vb block error\n", __func__); + return K_FAILED; + } + + phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); + if (phys_addr == 0) + { + printf("%s get phys addr error\n", __func__); + return K_FAILED; + } + + virt_addr = (k_u32 *)kd_mpi_sys_mmap(phys_addr, size); + + if (virt_addr == NULL) + { + printf("%s mmap error\n", __func__); + return K_FAILED; + } + + vf_info->mod_id = K_ID_VO; + vf_info->pool_id = g_pool_id; + vf_info->v_frame.phys_addr[0] = phys_addr; + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + vf_info->v_frame.phys_addr[1] = phys_addr + (vf_info->v_frame.height * vf_info->v_frame.stride[0]); + *pic_vaddr = virt_addr; + + printf("phys_addr is %lx g_pool_id is %d \n", phys_addr, g_pool_id); + + return handle; +} + +/** +* 停止并销毁编码器 +*/ +k_s32 sample_exit(venc_conf_t *venc_conf) +{ + int ch = 0; + int ret = 0; + + printf("%s>g_venc_sample_status = %d\n", __FUNCTION__, g_venc_sample_status); + switch (g_venc_sample_status) + { + case VENC_SAMPLE_STATUE_RUNING: + case VENC_SAMPLE_STATUS_START: + kd_mpi_venc_stop_chn(ch); + case VENC_SAMPLE_STATUS_INIT: + kd_mpi_venc_destroy_chn(ch); + break; + default: + break; + } + + pthread_cancel(venc_conf->output_tid); + pthread_join(venc_conf->output_tid, NULL); + + venc_debug("kill ch %d thread done! ch_done %d, chnum %d\n", ch, g_venc_conf.ch_done, g_venc_conf.chnum); + + ret = kd_mpi_venc_close_fd(); + CHECK_RET(ret, __func__, __LINE__); + + if (output_file) + fclose(output_file); + + g_venc_conf.ch_done = K_TRUE; + free(buf); + + return K_SUCCESS; +} + +/** +*解码器输出线程逻辑 +*/ +void output_thread(char *argv[]) +{ + vivcap_start(); + + // alloc memory,get isp memory + size_t paddr = 0; + void *vaddr = nullptr; + size_t size = SENSOR_CHANNEL * SENSOR_HEIGHT * SENSOR_WIDTH; + + int ret = kd_mpi_sys_mmz_alloc_cached(&paddr, &vaddr, "allocate", "anonymous", size); + if (ret) + { + std::cerr << "physical_memory_block::allocate failed: ret = " << ret << ", errno = " << strerror(errno) << std::endl; + std::abort(); + } + + int debug_mode=atoi(argv[4]); + std::string fd_kmodel_path=argv[1]; + float facedet_obj_thresh=atof(argv[2]); + float facedet_nms_thresh=atof(argv[3]); + poseDetect pd(fd_kmodel_path.c_str(), facedet_obj_thresh,facedet_nms_thresh, {SENSOR_CHANNEL, SENSOR_HEIGHT, SENSOR_WIDTH}, reinterpret_cast(vaddr), reinterpret_cast(paddr), debug_mode); + + cv::Vec4d params = pd.params; + + std::vector results; + + //*******************ai计算后要将得到的结果组装成k_video_frame_info帧对象的格式******************* + //这里做了一些初始化设置,选择使用1080P、ARGB8888格式数据 + //这里使用缓冲池2作为ai结果的发送缓存 + k_u32 g_pool_id=2; + k_video_frame_info vf_info; + void *pic_vaddr = NULL; + memset(&vf_info, 0, sizeof(vf_info)); + vf_info.v_frame.width = osd_width; + vf_info.v_frame.height = osd_height; + vf_info.v_frame.stride[0] = osd_width; + vf_info.v_frame.pixel_format = PIXEL_FORMAT_ARGB_8888; + k_vb_blk_handle block_enc = init_venc_frame(&vf_info, &pic_vaddr,g_pool_id); + //********************************************************************************************** + + cv::Mat osd_frame0(osd_height, osd_width, CV_8UC1, cv::Scalar(255)); + cv::Mat osd_frame1(osd_height, osd_width, CV_8UC1, cv::Scalar(0)); + cv::Mat osd_frame2(osd_height, osd_width, CV_8UC1, cv::Scalar(0)); + cv::Mat osd_frame3(osd_height, osd_width, CV_8UC1, cv::Scalar(0)); + std::vector channels_argb; + cv::Mat osd_frame; + while (!isp_stop) + { + ScopedTiming st("total time", 1); + { + ScopedTiming st("read capture", debug_mode); + // 从vivcap中读取一帧图像到dump_info + memset(&dump_info, 0, sizeof(k_video_frame_info)); + ret = kd_mpi_vicap_dump_frame(vicap_dev, VICAP_CHN_ID_1, VICAP_DUMP_YUV, &dump_info, 1000); + if (ret) + { + printf("sample_vicap...kd_mpi_vicap_dump_frame failed.\n"); + continue; + } + } + + { + ScopedTiming st("isp copy", debug_mode); + auto vbvaddr = kd_mpi_sys_mmap_cached(dump_info.v_frame.phys_addr[0], size); + memcpy(vaddr, (void *)vbvaddr, SENSOR_HEIGHT * SENSOR_WIDTH * 3); // 这里以后可以去掉,不用copy + kd_mpi_sys_munmap(vbvaddr, size); + } + + channels_argb.clear(); + results.clear(); + pd.pre_process(); + pd.inference(); + bool find_ = pd.post_process(results,params); + + { + ScopedTiming st("memcpy", debug_mode); + memcpy(osd_frame1.data, (void *)vaddr, SENSOR_HEIGHT * SENSOR_WIDTH); + memcpy(osd_frame2.data, (void *)vaddr + SENSOR_HEIGHT * SENSOR_WIDTH, SENSOR_HEIGHT * SENSOR_WIDTH); + memcpy(osd_frame3.data, (void *)vaddr + SENSOR_HEIGHT * SENSOR_WIDTH * 2, SENSOR_HEIGHT * SENSOR_WIDTH); + channels_argb.push_back(osd_frame0); + channels_argb.push_back(osd_frame1); + channels_argb.push_back(osd_frame2); + channels_argb.push_back(osd_frame3); + cv::merge(channels_argb, osd_frame); + } + + { + ScopedTiming st("osd draw", debug_mode); + Utils::DrawPred_video(osd_frame,{SENSOR_WIDTH,SENSOR_HEIGHT}, results, SKELETON, KPS_COLORS, LIMB_COLORS); + } + + { + ScopedTiming st("venc_send_frame", debug_mode); + //将RGB图像转换成ARGB图像,发送给编码器 + memcpy(pic_vaddr, osd_frame.data, osd_width * osd_height * 4); + //1通道是解码器,0通道是编码器,发送给0通道,vf_info是帧数据指针,-1表示为阻塞方式 + ret=kd_mpi_venc_send_frame(0, &vf_info, -1); + CHECK_RET(ret, __func__, __LINE__); + + ret = kd_mpi_vicap_dump_release(vicap_dev, VICAP_CHN_ID_1, &dump_info); + if (ret) + { + printf("sample_vicap...kd_mpi_vicap_dump_release failed.\n"); + } + } + } + + vivcap_stop(); + + //解码结束后,编码随之结束,一定要释放对应的k_vb_blk_handle + ret = kd_mpi_vb_release_block(block_enc); + CHECK_RET(ret, __func__, __LINE__); + + // free memory + ret = kd_mpi_sys_mmz_free(paddr, vaddr); + if (ret) + { + std::cerr << "free failed: ret = " << ret << ", errno = " << strerror(errno) << std::endl; + std::abort(); + } +} + +void print_usage(const char *name) +{ + cout << "Usage: " << name << " " << endl + << "For example: " << endl + << " [for isp] ./pose_detect.elf yolov8n-pose.kmodel 0.5 0.45 0" << endl + << "Options:" << endl + << " 1> kmodel pose检测kmodel文件路径 \n" + << " 2> obj_thresh pose检测阈值\n" + << " 3> nms_thresh NMS阈值\n" + << " 4> debug_mode 是否需要调试,0、1、2分别表示不调试、简单调试、详细调试\n" + << "\n" + << endl; +} + +int main(int argc, char *argv[]) +{ + std::cout << "case " << argv[0] << " built at " << __DATE__ << " " << __TIME__ << std::endl; + if (argc != 5) + { + print_usage(argv[0]); + return -1; + } + + k_s32 ret; + //**********************encoder**************************************** + //编码器配置,编码通道编号为0 + int chnum = 1; + int ve_ch = 0; + k_u32 output_frames = 10; + k_u32 bitrate = 4000; //kbps + int width = 1280; + int height = 720; + k_venc_rc_mode rc_mode = K_VENC_RC_MODE_CBR; + k_payload_type ve_type = K_PT_H265; + k_venc_profile profile = VENC_PROFILE_H265_MAIN; + memset(&g_venc_conf, 0, sizeof(venc_conf_t)); + + //vb初始化,(venc 以及 vicap) + sample_vb_init(chnum, K_FALSE); + //配置编码通道属性 + k_venc_chn_attr ve_attr; + memset(&ve_attr, 0, sizeof(ve_attr)); + ve_attr.venc_attr.pic_width = width; + ve_attr.venc_attr.pic_height = height; + ve_attr.venc_attr.stream_buf_size = VE_STREAM_BUF_SIZE; + ve_attr.venc_attr.stream_buf_cnt = VE_OUTPUT_BUF_CNT; + ve_attr.rc_attr.rc_mode = rc_mode; + ve_attr.rc_attr.cbr.src_frame_rate = 30; + ve_attr.rc_attr.cbr.dst_frame_rate = 30; + ve_attr.rc_attr.cbr.bit_rate = bitrate; + ve_attr.venc_attr.type = ve_type; + ve_attr.venc_attr.profile = profile; + venc_debug("payload type is H265\n"); + //创建编码通道 + ret = kd_mpi_venc_create_chn(ve_ch, &ve_attr); + CHECK_RET(ret, __func__, __LINE__); + g_venc_sample_status = VENC_SAMPLE_STATUS_INIT; + // 关键帧 + kd_mpi_venc_enable_idr(ve_ch, K_TRUE); + //启动编码通道 + ret = kd_mpi_venc_start_chn(ve_ch); + CHECK_RET(ret, __func__, __LINE__); + g_venc_sample_status = VENC_SAMPLE_STATUS_START; + //编码输出码流设置 + output_info info; + memset(&info, 0, sizeof(info)); + info.ch_id = ve_ch; + info.output_frames = output_frames; + //启动线程将输出的码流写入h265文件 + pthread_create(&g_venc_conf.output_tid, NULL, venc_output_thread, &info); + g_venc_sample_status = VENC_SAMPLE_STATUE_RUNING; + + // 启动 视频流 ai 线程 + std::thread face_det_enc(output_thread, argv); + while (getchar() != 'q') + { + usleep(10000); + } + + isp_stop = true; + face_det_enc.join(); + usleep(10000); + sample_exit(&g_venc_conf); + + // datafifo 退出 + datafifo_deinit(); + //vb退出 + sample_vb_exit(); + + vdec_debug("sample decode done!\n"); + + return 0; +} diff --git a/src/reference/ai_poc/pose_det_rtsp_plug/big/pose_detect.cc b/src/reference/ai_poc/pose_det_rtsp_plug/big/pose_detect.cc new file mode 100644 index 000000000..91d5198f8 --- /dev/null +++ b/src/reference/ai_poc/pose_det_rtsp_plug/big/pose_detect.cc @@ -0,0 +1,220 @@ +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.f + */ + +#include "pose_detect.h" +#include "utils.h" + + +// for image +poseDetect::poseDetect(const char *kmodel_file, float obj_thresh,float nms_thresh, const int debug_mode): obj_thresh_(obj_thresh),nms_thresh_(nms_thresh), AIBase(kmodel_file,"poseDetect", debug_mode) +{ + model_name_ = "poseDetect"; + + ai2d_out_tensor_ = get_input_tensor(0); +} + +// for video +poseDetect::poseDetect(const char *kmodel_file, float obj_thresh,float nms_thresh, FrameCHWSize isp_shape, uintptr_t vaddr, uintptr_t paddr, const int debug_mode): obj_thresh_(obj_thresh),nms_thresh_(nms_thresh), AIBase(kmodel_file,"poseDetect", debug_mode) +{ + model_name_ = "poseDetect"; + + vaddr_ = vaddr; + + isp_shape_ = isp_shape; + dims_t in_shape{1, isp_shape_.channel, isp_shape_.height, isp_shape_.width}; + int isp_size = isp_shape_.channel * isp_shape_.height * isp_shape_.width; + #if 0 + ai2d_in_tensor_ = host_runtime_tensor::create(typecode_t::dt_uint8, in_shape, { (gsl::byte *)vaddr, isp_size }, + true, hrt::pool_shared).expect("cannot create input tensor"); + #else + ai2d_in_tensor_ = hrt::create(typecode_t::dt_uint8, in_shape, hrt::pool_shared).expect("create ai2d input tensor failed"); + #endif + + // ai2d_out_tensor + ai2d_out_tensor_ = get_input_tensor(0); + // fixed padding resize param + Utils::padding_resize_params(params,isp_shape_, {input_shapes_[0][3], input_shapes_[0][2]}, ai2d_builder_, ai2d_in_tensor_, ai2d_out_tensor_, cv::Scalar(114, 114, 114)); +} + +poseDetect::~poseDetect() +{ + +} + +// ai2d for image +void poseDetect::pre_process(cv::Mat ori_img) +{ + ScopedTiming st(model_name_ + " pre_process image", debug_mode_); + std::vector chw_vec; + Utils::hwc_to_chw(ori_img, chw_vec); + Utils::padding_resize_params(params,{ori_img.channels(), ori_img.rows, ori_img.cols}, chw_vec, {input_shapes_[0][3], input_shapes_[0][2]}, ai2d_out_tensor_, cv::Scalar(114, 114, 114)); + +} + +// ai2d for video +void poseDetect::pre_process() +{ + ScopedTiming st(model_name_ + " pre_process video", debug_mode_); + #if 0 + ai2d_builder_->invoke().expect("error occurred in ai2d running"); + #else + size_t isp_size = isp_shape_.channel * isp_shape_.height * isp_shape_.width; + auto buf = ai2d_in_tensor_.impl()->to_host().unwrap()->buffer().as_host().unwrap().map(map_access_::map_write).unwrap().buffer(); + memcpy(reinterpret_cast(buf.data()), (void *)vaddr_, isp_size); + hrt::sync(ai2d_in_tensor_, sync_op_t::sync_write_back, true).expect("sync write_back failed"); + ai2d_builder_->invoke(ai2d_in_tensor_,ai2d_out_tensor_).expect("error occurred in ai2d running"); + // run ai2d + #endif +} + +void poseDetect::inference() +{ + this->run(); + this->get_output(); +} + +bool poseDetect::BatchDetect( float* all_data, std::vector>& output,cv::Vec4d params) +{ + + _outputTensorShape = { output_shapes_[0][0], output_shapes_[0][1], output_shapes_[0][2] }; + _anchorLength = output_shapes_[0][1]; + + // [1, 56 ,8400] -> [1, 8400, 56] + cv::Mat output0 = cv::Mat(cv::Size((int)_outputTensorShape[2], (int)_outputTensorShape[1]), CV_32F, all_data).t(); + + float* pdata = (float*)output0.data; // [classid,x,y,w,h,x,y,...21个点] + int rows = output0.rows; // 预测框的数量 8400 + // 一张图片的预测框 + + vector confidences; + vector boxes; + vector labels; + vector> kpss; + + for (int r=0; r obj_thresh_){ + float x = (pdata[0] - params[2]) / params[0]; //x + float y = (pdata[1] - params[3]) / params[1]; //y + float w = pdata[2] / params[0]; //w + float h = pdata[3] / params[1]; //h + + // int left = MAX(int(x - 0.5 *w +0.5), 0); + // int top = MAX(int(y - 0.5*h + 0.5), 0); + float left = MAX(int(x - 0.5 *w +0.5), 0); + float top = MAX(int(y - 0.5*h + 0.5), 0); + + std::vector kps; + for (int k=0; k< 17; k++){ + + float kps_x = (*(kps_ptr + 3 * k) - params[2]) / params[0]; + float kps_y = (*(kps_ptr + 3 * k + 1) - params[3]) / params[1]; + float kps_s = *(kps_ptr + 3 * k + 2); + + kps.push_back(kps_x); + kps.push_back(kps_y); + kps.push_back(kps_s); + } + + confidences.push_back(score); + labels.push_back(0); + kpss.push_back(kps); + // boxes.push_back(Rect(left, top, int(w + 0.5), int(h + 0.5))); + boxes.push_back(Rect(left, top, float(w + 0.5), float(h + 0.5))); + } + pdata += _anchorLength; //下一个预测框 + } + + // 对一张图的预测框执行NMS处理 + vector nms_result; + + std::vector boxinfo_results; + BoxInfo res; + float x1,y1,x2,y2,score_; + int label,idx; + for(int i=0;i temp_output; + for (size_t i=0; i &output,cv::Vec4d params){ + vector> temp_output; + + bool flag = BatchDetect(all_data, temp_output,params); + output = temp_output[0]; + return true; +} + + +bool poseDetect::post_process( std::vector &output,cv::Vec4d params) +{ + + ScopedTiming st(model_name_ + " post_process video", debug_mode_); + foutput_0 = p_outputs_[0]; + bool find_ = Detect(foutput_0,output,params); + + return find_; + +} + diff --git a/src/reference/ai_poc/pose_det_rtsp_plug/big/pose_detect.h b/src/reference/ai_poc/pose_det_rtsp_plug/big/pose_detect.h new file mode 100644 index 000000000..d0277bf06 --- /dev/null +++ b/src/reference/ai_poc/pose_det_rtsp_plug/big/pose_detect.h @@ -0,0 +1,139 @@ +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _POSE_DETECT +#define _POSE_DETECT + +#include +#include +#include "utils.h" +#include "ai_base.h" + + +/** + * @brief 人体关键点检测任务 + * 主要封装了对于每一帧图片,从预处理、运行到后处理给出结果的过程 + */ +class poseDetect: public AIBase +{ + public: + + /** + * for image + * @brief poseDetect 构造函数,加载kmodel,并初始化kmodel输入、输出、类阈值和NMS阈值 + * @param kmodel_file kmodel文件路径 + * @param obj_thresh 检测框阈值 + * @param nms_thresh NMS阈值 + * @param debug_mode 0(不调试)、 1(只显示时间)、2(显示所有打印信息) + * @return None + */ + poseDetect(const char *kmodel_file, float obj_thresh,float nms_thresh, const int debug_mode); + /** + * for video + * @brief poseDetect 构造函数,加载kmodel,并初始化kmodel输入、输出、类阈值和NMS阈值 + * @param kmodel_file kmodel文件路径 + * @param obj_thresh 检测框阈值 + * @param nms_thresh NMS阈值 + * @param isp_shape isp输入大小(chw) + * @param vaddr isp对应虚拟地址 + * @param paddr isp对应物理地址 + * @param debug_mode 0(不调试)、 1(只显示时间)、2(显示所有打印信息) + * @return None + */ + poseDetect(const char *kmodel_file, float obj_thresh,float nms_thresh, FrameCHWSize isp_shape, uintptr_t vaddr, uintptr_t paddr, const int debug_mode); + /** + * @brief poseDetect 析构函数 + * @return None + */ + ~poseDetect(); + + /** + * @brief 图片预处理(ai2d for image) + * @param ori_img 原始图片 + * @return None + */ + void pre_process(cv::Mat ori_img); + + /** + * @brief 视频流预处理(ai2d for video) + * @return None + */ + void pre_process(); + + /** + * @brief kmodel推理 + * @return None + */ + void inference(); + + + /** + * @brief Detect函数 + * @param all_data 模型输出 + * @param output 检测输出结果 + * @param params 长宽伸缩比以及x、y方向padding长度 + * @return true/false 是否检测得到 + */ + bool Detect(float* all_data, std::vector &output,cv::Vec4d params); + + /** + * @brief BatchDetect函数 + * @param all_data 模型输出 + * @param output 检测输出结果 + * @param params 长宽伸缩比以及x、y方向padding长度 + * @return true/false 是否检测得到 + */ + bool BatchDetect(float* all_data, std::vector>& output,cv::Vec4d params); + + /** + * @brief postprocess 函数,对输出解码后的结果,进行NMS处理 + * @param output 检测输出结果 + * @param params 长宽伸缩比以及x、y方向padding长度 + * @return None + */ + bool post_process( std::vector &output,cv::Vec4d params); + + std::vector labels { "person" }; // 类别标签 + + cv::Vec4d params; // 长宽伸缩比以及x、y方向padding长度 + + private: + float obj_thresh_; // 检测框阈值 + float nms_thresh_; // NMS阈值 + + int _anchorLength;// pose一个框的信息56个数 + + std::vector _outputTensorShape; // 输出Tensor Shape + + float *foutput_0; // 输出 + + std::unique_ptr ai2d_builder_; // ai2d构建器 + runtime_tensor ai2d_in_tensor_; // ai2d输入tensor + runtime_tensor ai2d_out_tensor_; // ai2d输出tensor + uintptr_t vaddr_; // isp的虚拟地址 + FrameCHWSize isp_shape_; // isp对应的地址大小 + +}; +#endif diff --git a/src/reference/fancy_poc/meta_hand/src/http/scoped_timing.hpp b/src/reference/ai_poc/pose_det_rtsp_plug/big/scoped_timing.hpp similarity index 100% rename from src/reference/fancy_poc/meta_hand/src/http/scoped_timing.hpp rename to src/reference/ai_poc/pose_det_rtsp_plug/big/scoped_timing.hpp diff --git a/src/reference/ai_poc/pose_det_rtsp_plug/big/utils.cc b/src/reference/ai_poc/pose_det_rtsp_plug/big/utils.cc new file mode 100644 index 000000000..3bba7b416 --- /dev/null +++ b/src/reference/ai_poc/pose_det_rtsp_plug/big/utils.cc @@ -0,0 +1,834 @@ +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include +#include "utils.h" + + +using std::ofstream; +using std::vector; +auto cache = cv::Mat::zeros(1,1,CV_32FC1); + +void Utils::dump_binary_file(const char *file_name, char *data, const size_t size) +{ + // eg:Utils::dump_binary_file(out_name.c_str(),reinterpret_cast(p_outputs_[i]),each_output_size_by_byte_[i+1]-each_output_size_by_byte_[i]); + std::ofstream outf; + outf.open(file_name, std::ofstream::binary); + outf.write(data, size); + outf.close(); +} + +void Utils::dump_gray_image(const char *file_name, const FrameSize &frame_size, unsigned char *data) +{ + cv::Mat gray_image = cv::Mat(frame_size.height, frame_size.width, CV_8UC1, data); + cv::imwrite(file_name, gray_image); +} + +void Utils::dump_color_image(const char *file_name, const FrameSize &frame_size, unsigned char *data) +{ + cv::Mat image_r = cv::Mat(frame_size.height, frame_size.width, CV_8UC1, data); + cv::Mat image_g = cv::Mat(frame_size.height, frame_size.width, CV_8UC1, data+frame_size.height*frame_size.width); + cv::Mat image_b = cv::Mat(frame_size.height, frame_size.width, CV_8UC1, data+2*frame_size.height*frame_size.width); + + std::vector color_vec(3); + color_vec.clear(); + color_vec.push_back(image_b); + color_vec.push_back(image_g); + color_vec.push_back(image_r); + + cv::Mat color_img; + cv::merge(color_vec, color_img); + cv::imwrite(file_name, color_img); +} + +cv::Mat Utils::padding_resize(const cv::Mat img, const FrameSize &frame_size, const cv::Scalar &padding) +{ + // width:dst_width + int ori_w = img.cols; + int ori_h = img.rows; + float ratiow = (float)frame_size.width / ori_w; + float ratioh = (float)frame_size.height / ori_h; + float ratio = ratiow < ratioh ? ratiow : ratioh; + int new_w = (int)(ratio * ori_w); + int new_h = (int)(ratio * ori_h); + float dw = (float)(frame_size.width - new_w) / 2; + float dh = (float)(frame_size.height - new_h) / 2; + int top = (int)(roundf(0 - 0.1)); + int bottom = (int)(roundf(dh * 2 + 0.1)); + int left = (int)(roundf(0 - 0.1)); + int right = (int)(roundf(dw * 2 - 0.1)); + cv::Mat cropped_img; + { + if ((new_w != frame_size.width) || (new_h != frame_size.height)) + { + cv::resize(img, cropped_img, cv::Size(new_w, new_h), cv::INTER_AREA); + } + } + { + cv::copyMakeBorder(cropped_img, cropped_img, top, bottom, left, right, cv::BORDER_CONSTANT, padding); + } + return cropped_img; +} + +cv::Mat Utils::resize(const cv::Mat img, const FrameSize &frame_size) +{ + cv::Mat cropped_img; + cv::resize(img, cropped_img, cv::Size(frame_size.width, frame_size.height), cv::INTER_LINEAR); + return cropped_img; +} + +cv::Mat Utils::bgr_to_rgb(cv::Mat ori_img) +{ + cv::Mat rgb_img; + cv::cvtColor(ori_img, rgb_img, cv::COLOR_BGR2RGB); + return rgb_img; +} + +void Utils::hwc_to_chw(cv::Mat &ori_img, std::vector &chw_vec) +{ + // for rgb format + std::vector rgbChannels(3); + cv::split(ori_img, rgbChannels); + for (auto i = 0; i < rgbChannels.size(); i++) + { + std::vector data = std::vector(rgbChannels[i].reshape(1, 1)); + chw_vec.insert(chw_vec.end(), data.begin(), data.end()); + } +} + +void Utils::bgr2rgb_and_hwc2chw(cv::Mat &ori_img, std::vector &chw_vec) +{ + // for bgr format + std::vector bgrChannels(3); + cv::split(ori_img, bgrChannels); + for (auto i = 2; i > -1; i--) + { + std::vector data = std::vector(bgrChannels[i].reshape(1, 1)); + chw_vec.insert(chw_vec.end(), data.begin(), data.end()); + } +} + +void Utils::resize(FrameCHWSize ori_shape, std::vector &chw_vec, runtime_tensor &ai2d_out_tensor) +{ + // build ai2d_in_tensor + dims_t in_shape{1, ori_shape.channel, ori_shape.height, ori_shape.width}; + runtime_tensor ai2d_in_tensor = host_runtime_tensor::create(typecode_t::dt_uint8, in_shape, hrt::pool_shared).expect("cannot create input tensor"); + + auto input_buf = ai2d_in_tensor.impl()->to_host().unwrap()->buffer().as_host().unwrap().map(map_access_::map_write).unwrap().buffer(); + memcpy(reinterpret_cast(input_buf.data()), chw_vec.data(), chw_vec.size()); + hrt::sync(ai2d_in_tensor, sync_op_t::sync_write_back, true).expect("write back input failed"); + + // run ai2d + // ai2d_datatype_t ai2d_dtype{ai2d_format::NCHW_FMT, ai2d_format::NCHW_FMT, typecode_t::dt_uint8, typecode_t::dt_uint8}; + ai2d_datatype_t ai2d_dtype{ai2d_format::NCHW_FMT, ai2d_format::NCHW_FMT, ai2d_in_tensor.datatype(), ai2d_out_tensor.datatype()}; + ai2d_crop_param_t crop_param { false, 30, 20, 400, 600 }; + ai2d_shift_param_t shift_param{false, 0}; + ai2d_pad_param_t pad_param{false, {{0, 0}, {0, 0}, {0, 0}, {0, 0}}, ai2d_pad_mode::constant, {114, 114, 114}}; + ai2d_resize_param_t resize_param{true, ai2d_interp_method::tf_bilinear, ai2d_interp_mode::half_pixel}; + ai2d_affine_param_t affine_param{false, ai2d_interp_method::cv2_bilinear, 0, 0, 127, 1, {0.5, 0.1, 0.0, 0.1, 0.5, 0.0}}; + + dims_t out_shape = ai2d_out_tensor.shape(); + ai2d_builder builder { in_shape, out_shape, ai2d_dtype, crop_param, shift_param, pad_param, resize_param, affine_param }; + builder.build_schedule(); + builder.invoke(ai2d_in_tensor,ai2d_out_tensor).expect("error occurred in ai2d running"); +} + +void Utils::resize(std::unique_ptr &builder, runtime_tensor &ai2d_in_tensor, runtime_tensor &ai2d_out_tensor) +{ + // run ai2d + ai2d_datatype_t ai2d_dtype{ai2d_format::NCHW_FMT, ai2d_format::NCHW_FMT, ai2d_in_tensor.datatype(), ai2d_out_tensor.datatype()}; + ai2d_crop_param_t crop_param { false, 30, 20, 400, 600 }; + ai2d_shift_param_t shift_param{false, 0}; + ai2d_pad_param_t pad_param{false, {{0, 0}, {0, 0}, {0, 0}, {0, 0}}, ai2d_pad_mode::constant, {114, 114, 114}}; + ai2d_resize_param_t resize_param{true, ai2d_interp_method::tf_bilinear, ai2d_interp_mode::half_pixel}; + ai2d_affine_param_t affine_param{false, ai2d_interp_method::cv2_bilinear, 0, 0, 127, 1, {0.5, 0.1, 0.0, 0.1, 0.5, 0.0}}; + + dims_t in_shape = ai2d_in_tensor.shape(); + dims_t out_shape = ai2d_out_tensor.shape(); + builder.reset(new ai2d_builder(in_shape, out_shape, ai2d_dtype, crop_param, shift_param, pad_param, resize_param, affine_param)); + builder->build_schedule(); + builder->invoke(ai2d_in_tensor,ai2d_out_tensor).expect("error occurred in ai2d running"); +} + +void Utils::crop_resize(FrameCHWSize ori_shape, std::vector &chw_vec, Bbox &crop_info, runtime_tensor &ai2d_out_tensor) +{ + // build ai2d_in_tensor + dims_t in_shape{1, ori_shape.channel, ori_shape.height, ori_shape.width}; + runtime_tensor ai2d_in_tensor = host_runtime_tensor::create(typecode_t::dt_uint8, in_shape, hrt::pool_shared).expect("cannot create input tensor"); + + auto input_buf = ai2d_in_tensor.impl()->to_host().unwrap()->buffer().as_host().unwrap().map(map_access_::map_write).unwrap().buffer(); + memcpy(reinterpret_cast(input_buf.data()), chw_vec.data(), chw_vec.size()); + hrt::sync(ai2d_in_tensor, sync_op_t::sync_write_back, true).expect("write back input failed"); + + // run ai2d + ai2d_datatype_t ai2d_dtype{ai2d_format::NCHW_FMT, ai2d_format::NCHW_FMT, ai2d_in_tensor.datatype(), ai2d_out_tensor.datatype()}; + ai2d_crop_param_t crop_param{true, crop_info.x, crop_info.y, crop_info.w, crop_info.h}; + ai2d_shift_param_t shift_param{false, 0}; + ai2d_pad_param_t pad_param{false, {{0, 0}, {0, 0}, {0, 0}, {0, 0}}, ai2d_pad_mode::constant, {114, 114, 114}}; + ai2d_resize_param_t resize_param{true, ai2d_interp_method::tf_bilinear, ai2d_interp_mode::half_pixel}; + ai2d_affine_param_t affine_param{false, ai2d_interp_method::cv2_bilinear, 0, 0, 127, 1, {0.5, 0.1, 0.0, 0.1, 0.5, 0.0}}; + + dims_t out_shape = ai2d_out_tensor.shape(); + ai2d_builder builder { in_shape, out_shape, ai2d_dtype, crop_param, shift_param, pad_param, resize_param, affine_param }; + builder.build_schedule(); + builder.invoke(ai2d_in_tensor,ai2d_out_tensor).expect("error occurred in ai2d running"); +} + +void Utils::crop_resize(Bbox &crop_info, std::unique_ptr &builder, runtime_tensor &ai2d_in_tensor, runtime_tensor &ai2d_out_tensor) +{ + // run ai2d + ai2d_datatype_t ai2d_dtype{ai2d_format::NCHW_FMT, ai2d_format::NCHW_FMT, ai2d_in_tensor.datatype(), ai2d_out_tensor.datatype()}; + ai2d_crop_param_t crop_param{true, crop_info.x, crop_info.y, crop_info.w, crop_info.h}; + ai2d_shift_param_t shift_param{false, 0}; + ai2d_pad_param_t pad_param{false, {{0, 0}, {0, 0}, {0, 0}, {0, 0}}, ai2d_pad_mode::constant, {114, 114, 114}}; + ai2d_resize_param_t resize_param{true, ai2d_interp_method::tf_bilinear, ai2d_interp_mode::half_pixel}; + ai2d_affine_param_t affine_param{false, ai2d_interp_method::cv2_bilinear, 0, 0, 127, 1, {0.5, 0.1, 0.0, 0.1, 0.5, 0.0}}; + + dims_t in_shape = ai2d_in_tensor.shape(); + dims_t out_shape = ai2d_out_tensor.shape(); + builder.reset(new ai2d_builder(in_shape, out_shape, ai2d_dtype, crop_param, shift_param, pad_param, resize_param, affine_param)); + builder->build_schedule(); + builder->invoke(ai2d_in_tensor,ai2d_out_tensor).expect("error occurred in ai2d running"); +} + +void Utils::padding_resize(FrameCHWSize ori_shape, std::vector &chw_vec, FrameSize resize_shape, runtime_tensor &ai2d_out_tensor, cv::Scalar padding) +{ + int ori_w = ori_shape.width; + int ori_h = ori_shape.height; + int width = resize_shape.width; + int height = resize_shape.height; + float ratiow = (float)width / ori_w; + float ratioh = (float)height / ori_h; + float ratio = ratiow < ratioh ? ratiow : ratioh; + int new_w = (int)(ratio * ori_w); + int new_h = (int)(ratio * ori_h); + float dw = (float)(width - new_w) / 2; + float dh = (float)(height - new_h) / 2; + int top = (int)(roundf(dh - 0.1)); + int bottom = (int)(roundf(dh + 0.1)); + int left = (int)(roundf(dw - 0.1)); + int right = (int)(roundf(dw - 0.1)); + + // create input + dims_t in_shape{1, ori_shape.channel, ori_h, ori_w}; + auto ai2d_in_tensor = host_runtime_tensor::create(typecode_t::dt_uint8, in_shape, hrt::pool_shared).expect("cannot create input tensor"); + auto input_buf = ai2d_in_tensor.impl()->to_host().unwrap()->buffer().as_host().unwrap().map(map_access_::map_write).unwrap().buffer(); + memcpy(reinterpret_cast(input_buf.data()), chw_vec.data(), chw_vec.size()); + hrt::sync(ai2d_in_tensor, sync_op_t::sync_write_back, true).expect("write back input failed"); + + // run ai2d + ai2d_datatype_t ai2d_dtype{ai2d_format::NCHW_FMT, ai2d_format::NCHW_FMT, ai2d_in_tensor.datatype(), ai2d_out_tensor.datatype()}; + ai2d_crop_param_t crop_param{false, 0, 0, 0, 0}; + ai2d_shift_param_t shift_param{false, 0}; + ai2d_pad_param_t pad_param{true, {{0, 0}, {0, 0}, {top, bottom}, {left, right}}, ai2d_pad_mode::constant, {padding[0], padding[1], padding[2]}}; + ai2d_resize_param_t resize_param{true, ai2d_interp_method::tf_bilinear, ai2d_interp_mode::half_pixel}; + ai2d_affine_param_t affine_param{false, ai2d_interp_method::cv2_bilinear, 0, 0, 127, 1, {0.5, 0.1, 0.0, 0.1, 0.5, 0.0}}; + + dims_t out_shape = ai2d_out_tensor.shape(); + ai2d_builder builder { in_shape, out_shape, ai2d_dtype, crop_param, shift_param, pad_param, resize_param, affine_param }; + builder.build_schedule(); + builder.invoke(ai2d_in_tensor,ai2d_out_tensor).expect("error occurred in ai2d running"); +} + +void Utils::padding_resize_params(cv::Vec4d& params,FrameCHWSize ori_shape, std::vector &chw_vec, FrameSize resize_shape, runtime_tensor &ai2d_out_tensor, cv::Scalar padding) +{ + int ori_w = ori_shape.width; + int ori_h = ori_shape.height; + int width = resize_shape.width; + int height = resize_shape.height; + float ratiow = (float)width / ori_w; + float ratioh = (float)height / ori_h; + float ratio = ratiow < ratioh ? ratiow : ratioh; + int new_w = (int)(ratio * ori_w); + int new_h = (int)(ratio * ori_h); + float dw = (float)(width - new_w) / 2; + float dh = (float)(height - new_h) / 2; + int top = (int)(roundf(dh - 0.1)); + int bottom = (int)(roundf(dh + 0.1)); + int left = (int)(roundf(dw - 0.1)); + int right = (int)(roundf(dw - 0.1)); + + params[0] = ratio; + params[1] = ratio; + + params[2] = left; + params[3] = top; + + // create input + dims_t in_shape{1, ori_shape.channel, ori_h, ori_w}; + auto ai2d_in_tensor = host_runtime_tensor::create(typecode_t::dt_uint8, in_shape, hrt::pool_shared).expect("cannot create input tensor"); + auto input_buf = ai2d_in_tensor.impl()->to_host().unwrap()->buffer().as_host().unwrap().map(map_access_::map_write).unwrap().buffer(); + memcpy(reinterpret_cast(input_buf.data()), chw_vec.data(), chw_vec.size()); + hrt::sync(ai2d_in_tensor, sync_op_t::sync_write_back, true).expect("write back input failed"); + + // run ai2d + ai2d_datatype_t ai2d_dtype{ai2d_format::NCHW_FMT, ai2d_format::NCHW_FMT, ai2d_in_tensor.datatype(), ai2d_out_tensor.datatype()}; + ai2d_crop_param_t crop_param{false, 0, 0, 0, 0}; + ai2d_shift_param_t shift_param{false, 0}; + ai2d_pad_param_t pad_param{true, {{0, 0}, {0, 0}, {top, bottom}, {left, right}}, ai2d_pad_mode::constant, {padding[0], padding[1], padding[2]}}; + ai2d_resize_param_t resize_param{true, ai2d_interp_method::tf_bilinear, ai2d_interp_mode::half_pixel}; + ai2d_affine_param_t affine_param{false, ai2d_interp_method::cv2_bilinear, 0, 0, 127, 1, {0.5, 0.1, 0.0, 0.1, 0.5, 0.0}}; + + dims_t out_shape = ai2d_out_tensor.shape(); + ai2d_builder builder { in_shape, out_shape, ai2d_dtype, crop_param, shift_param, pad_param, resize_param, affine_param }; + builder.build_schedule(); + builder.invoke(ai2d_in_tensor,ai2d_out_tensor).expect("error occurred in ai2d running"); +} + +void Utils::padding_resize_one_side(FrameCHWSize ori_shape, std::vector &chw_vec, FrameSize resize_shape, runtime_tensor &ai2d_out_tensor, cv::Scalar padding) +{ + int ori_w = ori_shape.width; + int ori_h = ori_shape.height; + int width = resize_shape.width; + int height = resize_shape.height; + float ratiow = (float)width / ori_w; + float ratioh = (float)height / ori_h; + float ratio = ratiow < ratioh ? ratiow : ratioh; + int new_w = (int)(ratio * ori_w); + int new_h = (int)(ratio * ori_h); + float dw = (float)(width - new_w) / 2; + float dh = (float)(height - new_h) / 2; + int top = (int)(roundf(0)); + int bottom = (int)(roundf(dh * 2 + 0.1)); + int left = (int)(roundf(0)); + int right = (int)(roundf(dw * 2 - 0.1)); + + // create input + dims_t in_shape{1, ori_shape.channel, ori_h, ori_w}; + auto ai2d_in_tensor = host_runtime_tensor::create(typecode_t::dt_uint8, in_shape, hrt::pool_shared).expect("cannot create input tensor"); + auto input_buf = ai2d_in_tensor.impl()->to_host().unwrap()->buffer().as_host().unwrap().map(map_access_::map_write).unwrap().buffer(); + memcpy(reinterpret_cast(input_buf.data()), chw_vec.data(), chw_vec.size()); + hrt::sync(ai2d_in_tensor, sync_op_t::sync_write_back, true).expect("write back input failed"); + + // run ai2d + ai2d_datatype_t ai2d_dtype{ai2d_format::NCHW_FMT, ai2d_format::NCHW_FMT, ai2d_in_tensor.datatype(), ai2d_out_tensor.datatype()}; + ai2d_crop_param_t crop_param{false, 0, 0, 0, 0}; + ai2d_shift_param_t shift_param{false, 0}; + ai2d_pad_param_t pad_param{true, {{0, 0}, {0, 0}, {top, bottom}, {left, right}}, ai2d_pad_mode::constant, {padding[0], padding[1], padding[2]}}; + ai2d_resize_param_t resize_param{true, ai2d_interp_method::tf_bilinear, ai2d_interp_mode::half_pixel}; + ai2d_affine_param_t affine_param{false, ai2d_interp_method::cv2_bilinear, 0, 0, 127, 1, {0.5, 0.1, 0.0, 0.1, 0.5, 0.0}}; + + dims_t out_shape = ai2d_out_tensor.shape(); + ai2d_builder builder { in_shape, out_shape, ai2d_dtype, crop_param, shift_param, pad_param, resize_param, affine_param }; + builder.build_schedule(); + builder.invoke(ai2d_in_tensor,ai2d_out_tensor).expect("error occurred in ai2d running"); +} + +void Utils::padding_resize(FrameCHWSize ori_shape, FrameSize resize_shape, std::unique_ptr &builder, runtime_tensor &ai2d_in_tensor, runtime_tensor &ai2d_out_tensor, const cv::Scalar padding) +{ + int ori_w = ori_shape.width; + int ori_h = ori_shape.height; + int width = resize_shape.width; + int height = resize_shape.height; + float ratiow = (float)width / ori_w; + float ratioh = (float)height / ori_h; + float ratio = ratiow < ratioh ? ratiow : ratioh; + int new_w = (int)(ratio * ori_w); + int new_h = (int)(ratio * ori_h); + float dw = (float)(width - new_w) / 2; + float dh = (float)(height - new_h) / 2; + int top = (int)(roundf(dh - 0.1)); + int bottom = (int)(roundf(dh + 0.1)); + int left = (int)(roundf(dw - 0.1)); + int right = (int)(roundf(dw - 0.1)); + + // run ai2d + ai2d_datatype_t ai2d_dtype{ai2d_format::NCHW_FMT, ai2d_format::NCHW_FMT, ai2d_in_tensor.datatype(), ai2d_out_tensor.datatype()}; + ai2d_crop_param_t crop_param{false, 0, 0, 0, 0}; + ai2d_shift_param_t shift_param{false, 0}; + ai2d_pad_param_t pad_param{true, {{0, 0}, {0, 0}, {top, bottom}, {left, right}}, ai2d_pad_mode::constant, {padding[0], padding[1], padding[2]}}; + ai2d_resize_param_t resize_param{true, ai2d_interp_method::tf_bilinear, ai2d_interp_mode::half_pixel}; + ai2d_affine_param_t affine_param{false, ai2d_interp_method::cv2_bilinear, 0, 0, 127, 1, {0.5, 0.1, 0.0, 0.1, 0.5, 0.0}}; + + dims_t in_shape = ai2d_in_tensor.shape(); + dims_t out_shape = ai2d_out_tensor.shape(); + builder.reset(new ai2d_builder(in_shape, out_shape, ai2d_dtype, crop_param, shift_param, pad_param, resize_param, affine_param)); + builder->build_schedule(); + builder->invoke(ai2d_in_tensor,ai2d_out_tensor).expect("error occurred in ai2d running"); +} + + +void Utils::padding_resize_params(cv::Vec4d& params,FrameCHWSize ori_shape, FrameSize resize_shape, std::unique_ptr &builder, runtime_tensor &ai2d_in_tensor, runtime_tensor &ai2d_out_tensor, const cv::Scalar padding) +{ + int ori_w = ori_shape.width; + int ori_h = ori_shape.height; + int width = resize_shape.width; + int height = resize_shape.height; + float ratiow = (float)width / ori_w; + float ratioh = (float)height / ori_h; + float ratio = ratiow < ratioh ? ratiow : ratioh; + int new_w = (int)(ratio * ori_w); + int new_h = (int)(ratio * ori_h); + float dw = (float)(width - new_w) / 2; + float dh = (float)(height - new_h) / 2; + // int top = (int)(roundf(dh - 0.1)); + // int bottom = (int)(roundf(dh + 0.1)); + // int left = (int)(roundf(dw - 0.1)); + // int right = (int)(roundf(dw - 0.1)); + + int top = (int)(roundf(dh )); + int bottom = (int)(roundf(dh )); + int left = (int)(roundf(dw )); + // int right = (int)(roundf(dw - 0.1)); + int right = (int)(roundf(dw )); + + params[0] = ratio; + params[1] = ratio; + + params[2] = left; + params[3] = top; + + // run ai2d + ai2d_datatype_t ai2d_dtype{ai2d_format::NCHW_FMT, ai2d_format::NCHW_FMT, ai2d_in_tensor.datatype(), ai2d_out_tensor.datatype()}; + ai2d_crop_param_t crop_param{false, 0, 0, 0, 0}; + ai2d_shift_param_t shift_param{false, 0}; + ai2d_pad_param_t pad_param{true, {{0, 0}, {0, 0}, {top, bottom}, {left, right}}, ai2d_pad_mode::constant, {padding[0], padding[1], padding[2]}}; + ai2d_resize_param_t resize_param{true, ai2d_interp_method::tf_bilinear, ai2d_interp_mode::half_pixel}; + ai2d_affine_param_t affine_param{false, ai2d_interp_method::cv2_bilinear, 0, 0, 127, 1, {0.5, 0.1, 0.0, 0.1, 0.5, 0.0}}; + + dims_t in_shape = ai2d_in_tensor.shape(); + dims_t out_shape = ai2d_out_tensor.shape(); + builder.reset(new ai2d_builder(in_shape, out_shape, ai2d_dtype, crop_param, shift_param, pad_param, resize_param, affine_param)); + builder->build_schedule(); + builder->invoke(ai2d_in_tensor,ai2d_out_tensor).expect("error occurred in ai2d running"); +} + +void Utils::padding_resize_one_side(FrameCHWSize ori_shape, FrameSize resize_shape, std::unique_ptr &builder, runtime_tensor &ai2d_in_tensor, runtime_tensor &ai2d_out_tensor, const cv::Scalar padding) +{ + int ori_w = ori_shape.width; + int ori_h = ori_shape.height; + int width = resize_shape.width; + int height = resize_shape.height; + float ratiow = (float)width / ori_w; + float ratioh = (float)height / ori_h; + float ratio = ratiow < ratioh ? ratiow : ratioh; + int new_w = (int)(ratio * ori_w); + int new_h = (int)(ratio * ori_h); + float dw = (float)(width - new_w) / 2; + float dh = (float)(height - new_h) / 2; + int top = (int)(roundf(0)); + int bottom = (int)(roundf(dh * 2 + 0.1)); + int left = (int)(roundf(0)); + int right = (int)(roundf(dw * 2 - 0.1)); + + // run ai2d + ai2d_datatype_t ai2d_dtype{ai2d_format::NCHW_FMT, ai2d_format::NCHW_FMT, ai2d_in_tensor.datatype(), ai2d_out_tensor.datatype()}; + ai2d_crop_param_t crop_param{false, 0, 0, 0, 0}; + ai2d_shift_param_t shift_param{false, 0}; + ai2d_pad_param_t pad_param{true, {{0, 0}, {0, 0}, {top, bottom}, {left, right}}, ai2d_pad_mode::constant, {padding[0], padding[1], padding[2]}}; + ai2d_resize_param_t resize_param{true, ai2d_interp_method::tf_bilinear, ai2d_interp_mode::half_pixel}; + ai2d_affine_param_t affine_param{false, ai2d_interp_method::cv2_bilinear, 0, 0, 127, 1, {0.5, 0.1, 0.0, 0.1, 0.5, 0.0}}; + + dims_t in_shape = ai2d_in_tensor.shape(); + dims_t out_shape = ai2d_out_tensor.shape(); + builder.reset(new ai2d_builder(in_shape, out_shape, ai2d_dtype, crop_param, shift_param, pad_param, resize_param, affine_param)); + builder->build_schedule(); + builder->invoke(ai2d_in_tensor,ai2d_out_tensor).expect("error occurred in ai2d running"); +} + +void Utils::affine(FrameCHWSize ori_shape, std::vector &ori_data, float *affine_matrix, runtime_tensor &ai2d_out_tensor) +{ + runtime_tensor ai2d_in_tensor; + // init ai2d in/out + dims_t in_shape{1, ori_shape.channel, ori_shape.height, ori_shape.width}; + ai2d_in_tensor = host_runtime_tensor::create(typecode_t::dt_uint8, in_shape, hrt::pool_shared).expect("cannot create input tensor"); + + // ai2d input + auto input_buf = ai2d_in_tensor.impl()->to_host().unwrap()->buffer().as_host().unwrap().map(map_access_::map_write).unwrap().buffer(); + memcpy(reinterpret_cast(input_buf.data()), ori_data.data(), ori_data.size()); + hrt::sync(ai2d_in_tensor, sync_op_t::sync_write_back, true).expect("write back input failed"); + + // run ai2d + + ai2d_datatype_t ai2d_dtype{ai2d_format::NCHW_FMT, ai2d_format::NCHW_FMT, ai2d_in_tensor.datatype(), ai2d_out_tensor.datatype()}; + ai2d_crop_param_t crop_param{false, 0, 0, 0, 0}; + ai2d_shift_param_t shift_param{false, 0}; + ai2d_pad_param_t pad_param{false, {{0, 0}, {0, 0}, {0, 0}, {10, 0}}, ai2d_pad_mode::constant, {255, 10, 5}}; + ai2d_resize_param_t resize_param{false, ai2d_interp_method::tf_bilinear, ai2d_interp_mode::half_pixel}; + ai2d_affine_param_t affine_param{true, ai2d_interp_method::cv2_bilinear, 0, 0, 127, 1, {affine_matrix[0], affine_matrix[1], affine_matrix[2], affine_matrix[3], affine_matrix[4], affine_matrix[5]}}; + + dims_t out_shape = ai2d_out_tensor.shape(); + ai2d_builder builder { in_shape, out_shape, ai2d_dtype, crop_param, shift_param, pad_param, resize_param, affine_param }; + builder.build_schedule(); + builder.invoke(ai2d_in_tensor,ai2d_out_tensor).expect("error occurred in ai2d running"); +} + + +// for video(只算一次即可) +void Utils::affine(float *affine_matrix, std::unique_ptr &builder, runtime_tensor &ai2d_in_tensor, runtime_tensor &ai2d_out_tensor) +{ + // run ai2d + ai2d_datatype_t ai2d_dtype{ai2d_format::NCHW_FMT, ai2d_format::NCHW_FMT, ai2d_in_tensor.datatype(), ai2d_out_tensor.datatype()}; + ai2d_crop_param_t crop_param{false, 0, 0, 0, 0}; + ai2d_shift_param_t shift_param{false, 0}; + ai2d_pad_param_t pad_param{false, {{0, 0}, {0, 0}, {0, 0}, {10, 0}}, ai2d_pad_mode::constant, {255, 10, 5}}; + ai2d_resize_param_t resize_param{false, ai2d_interp_method::tf_bilinear, ai2d_interp_mode::half_pixel}; + ai2d_affine_param_t affine_param{true, ai2d_interp_method::cv2_bilinear, 0, 0, 127, 1, {affine_matrix[0], affine_matrix[1], affine_matrix[2], affine_matrix[3], affine_matrix[4], affine_matrix[5]}}; + + dims_t in_shape = ai2d_in_tensor.shape(); + dims_t out_shape = ai2d_out_tensor.shape(); + builder.reset(new ai2d_builder(in_shape, out_shape, ai2d_dtype, crop_param, shift_param, pad_param, resize_param, affine_param)); + builder->build_schedule(); + builder->invoke(ai2d_in_tensor,ai2d_out_tensor).expect("error occurred in ai2d running"); +} + +static float sigmoid(float x) +{ + return 1.0f / (1.0f + expf(-x)); +} + +void Utils::nms(std::vector &input_boxes, float NMS_THRESH) +{ + std::sort(input_boxes.begin(), input_boxes.end(), [](BoxInfo a, BoxInfo b) { return a.score > b.score; }); + std::vector vArea(input_boxes.size()); + for (int i = 0; i < int(input_boxes.size()); ++i) + { + vArea[i] = (input_boxes.at(i).x2 - input_boxes.at(i).x1 + 1) + * (input_boxes.at(i).y2 - input_boxes.at(i).y1 + 1); + } + for (int i = 0; i < int(input_boxes.size()); ++i) + { + for (int j = i + 1; j < int(input_boxes.size());) + { + float xx1 = std::max(input_boxes[i].x1, input_boxes[j].x1); + float yy1 = std::max(input_boxes[i].y1, input_boxes[j].y1); + float xx2 = std::min(input_boxes[i].x2, input_boxes[j].x2); + float yy2 = std::min(input_boxes[i].y2, input_boxes[j].y2); + float w = std::max(float(0), xx2 - xx1 + 1); + float h = std::max(float(0), yy2 - yy1 + 1); + float inter = w * h; + float ovr = inter / (vArea[i] + vArea[j] - inter); + if (ovr >= NMS_THRESH) + { + input_boxes.erase(input_boxes.begin() + j); + vArea.erase(vArea.begin() + j); + } + else + { + j++; + } + } + } +} + +// for NHWC +std::vector Utils::decode_infer(float *data, int net_size, int stride, int num_classes, FrameSize frame_size, float anchors[][2], float threshold) +{ + float ratiow = (float)net_size / frame_size.width; + float ratioh = (float)net_size / frame_size.height; + float gain = ratiow < ratioh ? ratiow : ratioh; + std::vector result; + int grid_size = net_size / stride; + int one_rsize = num_classes + 5; + float cx, cy, w, h; + for (int shift_y = 0; shift_y < grid_size; shift_y++) + { + for (int shift_x = 0; shift_x < grid_size; shift_x++) + { + int loc = shift_x + shift_y * grid_size; + for (int i = 0; i < 3; i++) + { + float *record = data + (loc * 3 + i) * one_rsize; + float *cls_ptr = record + 5; + for (int cls = 0; cls < num_classes; cls++) + { + // float score = sigmoid(cls_ptr[cls]) * sigmoid(record[4]); + float score = cls_ptr[cls] * record[4]; + if (score > threshold) + { + // cx = (sigmoid(record[0]) * 2.f - 0.5f + (float)shift_x) * (float)stride; + // cy = (sigmoid(record[1]) * 2.f - 0.5f + (float)shift_y) * (float)stride; + // w = pow(sigmoid(record[2]) * 2.f, 2) * anchors[i][0]; + // h = pow(sigmoid(record[3]) * 2.f, 2) * anchors[i][1]; + + cx = (record[0] * 2.f - 0.5f + (float)shift_x) * (float)stride; + cy = (record[1] * 2.f - 0.5f + (float)shift_y) * (float)stride; + w = pow(record[2] * 2.f, 2) * anchors[i][0]; + h = pow(record[3] * 2.f, 2) * anchors[i][1]; + + cx -= ((net_size - frame_size.width * gain) / 2); + cy -= ((net_size - frame_size.height * gain) / 2); + cx /= gain; + cy /= gain; + w /= gain; + h /= gain; + BoxInfo box; + box.x1 = std::max(0, std::min(frame_size.width, int(cx - w / 2.f))); + box.y1 = std::max(0, std::min(frame_size.height, int(cy - h / 2.f))); + box.x2 = std::max(0, std::min(frame_size.width, int(cx + w / 2.f))); + box.y2 = std::max(0, std::min(frame_size.height, int(cy + h / 2.f))); + box.score = score; + box.label = cls; + result.push_back(box); + } + } + } + } + } + return result; +} + +void Utils::nms_pose(std::vector &input_boxes, float NMS_THRESH,vector &nms_result) +{ + std::sort(input_boxes.begin(), input_boxes.end(), [](BoxInfo a, BoxInfo b) { return a.score > b.score; }); + std::vector vArea(input_boxes.size()); + for (int i = 0; i < int(input_boxes.size()); ++i) + { + vArea[i] = (input_boxes.at(i).x2 - input_boxes.at(i).x1 + 1) + * (input_boxes.at(i).y2 - input_boxes.at(i).y1 + 1); + } + for (int i = 0; i < int(input_boxes.size()); ++i) + { + for (int j = i + 1; j < int(input_boxes.size());) + { + float xx1 = std::max(input_boxes[i].x1, input_boxes[j].x1); + float yy1 = std::max(input_boxes[i].y1, input_boxes[j].y1); + float xx2 = std::min(input_boxes[i].x2, input_boxes[j].x2); + float yy2 = std::min(input_boxes[i].y2, input_boxes[j].y2); + float w = std::max(float(0), xx2 - xx1 + 1); + float h = std::max(float(0), yy2 - yy1 + 1); + float inter = w * h; + float ovr = inter / (vArea[i] + vArea[j] - inter); + if (ovr >= NMS_THRESH) + { + input_boxes.erase(input_boxes.begin() + j); + vArea.erase(vArea.begin() + j); + } + else + { + j++; + } + } + } +} + +void Utils::DrawPred(cv::Mat& img, std::vector& results, + const std::vector> &SKELLTON, + const std::vector> &KPS_COLORS, + const std::vector> &LIMB_COLORS) +{ + const int num_point =17; + for (auto &result:results){ + int left,top,width, height; + left = result.box.x; + top = result.box.y; + width = result.box.width; + height = result.box.height; + + std::string label = "person: " + std::to_string(result.confidence).substr(0, 4); + int baseLine; + cv::Size labelSize = cv::getTextSize(label, cv::FONT_HERSHEY_SIMPLEX, 0.5, 1, &baseLine); + top = std::max(top, labelSize.height) -10 ; + putText(img, label, cv::Point(left, top - 30), cv::FONT_HERSHEY_SIMPLEX, 3, cv::Scalar(0,0,255), 5); + cv::rectangle(img, cv::Point(left, top), cv::Point(left+width, top+height), cv::Scalar(0, 0, 255), 10); + + // 连线 + auto &kps = result.kps; + for (int k=0; k0.5f ,>0.0f显示效果比较好 + // 关键点绘制 + if (k 0.0f){ + cv::Scalar kps_color = cv::Scalar(KPS_COLORS[k][0],KPS_COLORS[k][1],KPS_COLORS[k][2]); + cv::circle(img, {kps_x, kps_y}, 5, kps_color, 15); + } + } + + auto &ske = SKELLTON[k]; + int pos1_x = std::round(kps[(ske[0] -1) * 3]); + int pos1_y = std::round(kps[(ske[0] -1) * 3 + 1]); + + int pos2_x = std::round(kps[(ske[1] -1) * 3]); + int pos2_y = std::round(kps[(ske[1] -1) * 3 + 1]); + + float pos1_s = kps[(ske[0] -1) * 3 + 2]; + float pos2_s = kps[(ske[1] -1) * 3 + 2]; + + if (pos1_s > 0.0f && pos2_s >0.0f){// 不要设置为>0.5f ,>0.0f显示效果比较好 + cv::Scalar limb_color = cv::Scalar(LIMB_COLORS[k][0], LIMB_COLORS[k][1], LIMB_COLORS[k][3]); + cv::line(img, {pos1_x, pos1_y}, {pos2_x, pos2_y}, limb_color, 10); + } + + // 跌倒检测 + // float pt5_x = kps[5*3]; + // float pt5_y = kps[5*3 + 1]; + // float pt6_x = kps[6*3]; + // float pt6_y = kps[6*3+1]; + // float center_up_x = (pt5_x + pt6_x) /2.0f ; + // float center_up_y = (pt5_y + pt6_y) / 2.0f; + // cv::Point center_up = cv::Point((int)center_up_x, (int)center_up_y); + + // float pt11_x = kps[11*3]; + // float pt11_y = kps[11*3 + 1]; + // float pt12_x = kps[12*3]; + // float pt12_y = kps[12*3 + 1]; + // float center_down_x = (pt11_x + pt12_x) / 2.0f; + // float center_down_y = (pt11_y + pt12_y) / 2.0f; + // cv::Point center_down = cv::Point((int)center_down_x, (int)center_down_y); + + + // float right_angle_point_x = center_down_x; + // float righ_angle_point_y = center_up_y; + // cv::Point right_angl_point = cv::Point((int)right_angle_point_x, (int)righ_angle_point_y); + + + // float a = abs(right_angle_point_x - center_up_x); + // float b = abs(center_down_y - righ_angle_point_y); + + // float tan_value = a / b; + // float Pi = acos(-1); + // float angle = atan(tan_value) * 180.0f/ Pi; + // //string angel_label = "angle: " + to_string(angle); + // std::string angel_label = ""; + // putText(img, angel_label, cv::Point(left, top-40), cv::FONT_HERSHEY_SIMPLEX, 0.5, cv::Scalar(0,0,255), 2); + + // if (angle > 60.0f || center_down_y <= center_up_y || (double)width/ height > 5.0f/3.0f) // 宽高比小于0.6为站立,大于5/3为跌倒 + // { + // std::string fall_down_label = "person fall down!!!!"; + // putText(img, fall_down_label , cv::Point(left, top-20), cv::FONT_HERSHEY_SIMPLEX, 0.5, cv::Scalar(0,0,255), 2); + + // printf("angel:%f width/height:%f\n",angle, (double)width/ height ); + // } + + + } + } +} + +void Utils::DrawPred_video(cv::Mat& img,FrameSize frame_size, std::vector& results, + const std::vector> &SKELLTON, + const std::vector> &KPS_COLORS, + const std::vector> &LIMB_COLORS) +{ + int osd_width= img.cols; + int osd_height = img.rows; + + int SENSOR_HEIGHT = frame_size.height; + int SENSOR_WIDTH = frame_size.width; + + const int num_point =17; + for (auto &result:results){ + int left,top,width, height; + left = result.box.x; + top = result.box.y; + width = result.box.width; + height = result.box.height; + + std::string label = "person: " + std::to_string(result.confidence).substr(0, 4); + int baseLine; + cv::Size labelSize = cv::getTextSize(label, cv::FONT_HERSHEY_SIMPLEX, 0.5, 1, &baseLine); + top = std::max(top, labelSize.height) -10 ; + + // 连线 + auto &kps = result.kps; + for (int k=0; k0.5f ,>0.0f显示效果比较好 + // 关键点绘制 + if (k 0.0f){ + cv::Scalar kps_color = cv::Scalar(255,KPS_COLORS[k][0],KPS_COLORS[k][1],KPS_COLORS[k][2]); + cv::circle(img, {kps_x1, kps_y1}, 5, kps_color, -3); + } + } + + auto &ske = SKELLTON[k]; + int pos1_x = std::round(kps[(ske[0] -1) * 3]); + int pos1_y = std::round(kps[(ske[0] -1) * 3 + 1]); + + int pos1_x_ = (float)pos1_x / SENSOR_WIDTH * osd_width; + int pos1_y_ = (float)pos1_y / SENSOR_HEIGHT * osd_height; + + int pos2_x = std::round(kps[(ske[1] -1) * 3]); + int pos2_y = std::round(kps[(ske[1] -1) * 3 + 1]); + + int pos2_x_ = (float)pos2_x / SENSOR_WIDTH * osd_width; + int pos2_y_ = (float)pos2_y / SENSOR_HEIGHT * osd_height; + + float pos1_s = kps[(ske[0] -1) * 3 + 2]; + float pos2_s = kps[(ske[1] -1) * 3 + 2]; + + if (pos1_s > 0.0f && pos2_s >0.0f){// 不要设置为>0.5f ,>0.0f显示效果比较好 + cv::Scalar limb_color = cv::Scalar(255,LIMB_COLORS[k][0], LIMB_COLORS[k][1], LIMB_COLORS[k][3]); + cv::line(img, {pos1_x_, pos1_y_}, {pos2_x_, pos2_y_}, limb_color,3); + } + + // // 跌倒检测 + // float pt5_x = kps[5*3]; + // float pt5_y = kps[5*3 + 1]; + // float pt6_x = kps[6*3]; + // float pt6_y = kps[6*3+1]; + // float center_up_x = (pt5_x + pt6_x) /2.0f ; + // float center_up_y = (pt5_y + pt6_y) / 2.0f; + // cv::Point center_up = cv::Point((int)center_up_x, (int)center_up_y); + + // float pt11_x = kps[11*3]; + // float pt11_y = kps[11*3 + 1]; + // float pt12_x = kps[12*3]; + // float pt12_y = kps[12*3 + 1]; + // float center_down_x = (pt11_x + pt12_x) / 2.0f; + // float center_down_y = (pt11_y + pt12_y) / 2.0f; + // cv::Point center_down = cv::Point((int)center_down_x, (int)center_down_y); + + + // float right_angle_point_x = center_down_x; + // float righ_angle_point_y = center_up_y; + // cv::Point right_angl_point = cv::Point((int)right_angle_point_x, (int)righ_angle_point_y); + + + // float a = abs(right_angle_point_x - center_up_x); + // float b = abs(center_down_y - righ_angle_point_y); + + // float tan_value = a / b; + // float Pi = acos(-1); + // float angle = atan(tan_value) * 180.0f/ Pi; + // std::string angel_label = ""; + + // if (angle > 60.0f || center_down_y <= center_up_y || (double)width/ height > 5.0f/3.0f) // 宽高比小于0.6为站立,大于5/3为跌倒 + // { + // std::string fall_down_label = "person fall down!!!!"; + // } + + + } + + int plot_x1 = int(left * 1.0 / SENSOR_WIDTH * osd_width); + int plot_y1 = int((top - 30) * 1.0 / SENSOR_HEIGHT * osd_height); + int plot_x2 = int((left+width) * 1.0 / SENSOR_WIDTH * osd_width); + int plot_y2 = (top + height) > kps[kps.size() - 2] ? int((top+height) * 1.0 / SENSOR_HEIGHT * osd_height) : int(kps[kps.size() - 2] * 1.0 / SENSOR_HEIGHT * osd_height); + + // std::cout << top + height << " " << kps[kps.size() - 2] << std::endl; + // putText(img, label, cv::Point(plot_x1, plot_y1), cv::FONT_HERSHEY_SIMPLEX, 2, cv::Scalar(255,255,0,0), 4); + cv::rectangle(img, cv::Point(plot_x1, plot_y1), cv::Point(plot_x2, plot_y2+20), cv::Scalar(255, 255, 0, 0), 4); + } +} + diff --git a/src/reference/ai_poc/pose_det_rtsp_plug/big/utils.h b/src/reference/ai_poc/pose_det_rtsp_plug/big/utils.h new file mode 100644 index 000000000..7a2cd2458 --- /dev/null +++ b/src/reference/ai_poc/pose_det_rtsp_plug/big/utils.h @@ -0,0 +1,494 @@ +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +// utils.h +#ifndef UTILS_H +#define UTILS_H + +#include +#include +#include +#include +#include +#include +#include + + +using namespace nncase; +using namespace nncase::runtime; +using namespace nncase::runtime::k230; +using namespace nncase::F::k230; + +using namespace cv; + +using cv::Mat; +using std::cout; +using std::endl; +using std::ifstream; +using std::vector; + +/** + * @brief 行人检测框信息 + */ +typedef struct BoxInfo +{ + float x1; // 行人检测框左上顶点x坐标 + float y1; // 行人检测框左上顶点y坐标 + float x2; // 行人检测框右下顶点x坐标 + float y2; // 行人检测框右下顶点y坐标 + float score; // 行人检测框的得分 + int label; // 行人检测框的标签 + + int idx; // 行人检测框的序号 + +} BoxInfo; + +/** + * @brief 人脸检测框 + */ +typedef struct Bbox +{ + float x; // 人脸检测框的左顶点x坐标 + float y; // 人脸检测框的左顶点x坐标 + float w; + float h; +} Bbox; + +/** + * @brief 人脸五官点 + */ +typedef struct SparseLandmarks +{ + float points[10]; // 人脸五官点,依次是图片的左眼(x,y)、右眼(x,y),鼻子(x,y),左嘴角(x,y),右嘴角 +} SparseLandmarks; + +/** + * @brief 单张/帧图片大小 + */ +typedef struct FrameSize +{ + size_t width; // 宽 + size_t height; // 高 +} FrameSize; + +/** + * @brief 单张/帧图片大小 + */ +typedef struct FrameCHWSize +{ + size_t channel; // 通道 + size_t height; // 高 + size_t width; // 宽 +} FrameCHWSize; + +/** + * @brief 单张/帧图片大小 + */ +typedef struct Framesize +{ + int width; // 帧宽 + int height; // 帧高 +} Framesize; + + +/** + * @brief Pose输出结果信息 + */ +struct OutputPose { + cv::Rect_ box; // 行人检测框 box + int label =0; // 检测框标签,默认为行人(0) + float confidence =0.0; // 置信度 + std::vector kps; // 关键点向量 +}; + +/** + * @brief AI Demo工具类 + * 封装了AI Demo常用的函数,包括二进制文件读取、文件保存、图片预处理等操作 + */ +class Utils +{ +public: + /** + * @brief 读取2进制文件 + * @param file_name 文件路径 + * @return 文件对应类型的数据 + */ + template + static vector read_binary_file(const char *file_name) + { + ifstream ifs(file_name, std::ios::binary); + ifs.seekg(0, ifs.end); + size_t len = ifs.tellg(); + vector vec(len / sizeof(T), 0); + ifs.seekg(0, ifs.beg); + ifs.read(reinterpret_cast(vec.data()), len); + ifs.close(); + return vec; + } + + /** + * @brief 打印数据 + * @param data 需打印数据对应指针 + * @param size 需打印数据大小 + * @return None + */ + template + static void dump(const T *data, size_t size) + { + for (size_t i = 0; i < size; i++) + { + cout << data[i] << " "; + } + cout << endl; + } + + // 静态成员函数不依赖于类的实例,可以直接通过类名调用 + /** + * @brief 将数据以2进制方式保存为文件 + * @param file_name 保存文件路径+文件名 + * @param data 需要保存的数据 + * @param size 需要保存的长度 + * @return None + */ + static void dump_binary_file(const char *file_name, char *data, const size_t size); + + /** + * @brief 将数据保存为灰度图片 + * @param file_name 保存图片路径+文件名 + * @param frame_size 保存图片的宽、高 + * @param data 需要保存的数据 + * @return None + */ + static void dump_gray_image(const char *file_name, const FrameSize &frame_size, unsigned char *data); + + /** + * @brief 将数据保存为彩色图片 + * @param file_name 保存图片路径+文件名 + * @param frame_size 保存图片的宽、高 + * @param data 需要保存的数据 + * @return None + */ + static void dump_color_image(const char *file_name, const FrameSize &frame_size, unsigned char *data); + + + /*************************for img process********************/ + /** + * @brief 对图片进行先padding后resize的处理 + * @param ori_img 原始图片 + * @param frame_size 需要resize图像的宽高 + * @param padding 需要padding的像素,默认是cv::Scalar(114, 114, 114),BGR + * @return 处理后图像 + */ + static cv::Mat padding_resize(const cv::Mat img, const FrameSize &frame_size, const cv::Scalar &padding = cv::Scalar(114, 114, 114)); + + /** + * @brief 对图片resize + * @param ori_img 原始图片 + * @param frame_size 需要resize图像的宽高 + * @param padding 需要padding的像素,默认是cv::Scalar(114, 114, 114),BGR + * @return 处理后图像 + */ + static cv::Mat resize(const cv::Mat ori_img, const FrameSize &frame_size); + + /** + * @brief 将图片从bgr转为rgb + * @param ori_img 原始图片 + * @return 处理后图像 + */ + static cv::Mat bgr_to_rgb(cv::Mat ori_img); + + /** + * @brief 将RGB或RGB图片从hwc转为chw + * @param ori_img 原始图片 + * @param chw_vec 转为chw后的数据 + * @return None + */ + static void hwc_to_chw(cv::Mat &ori_img, std::vector &chw_vec); // for rgb data + + /** + * @brief 将BGR图片从hwc转为chw + * @param ori_img 原始图片 + * @param chw_vec 转为chw后的数据 + * @return None + */ + static void bgr2rgb_and_hwc2chw(cv::Mat &ori_img, std::vector &chw_vec); + + /*************************for ai2d ori_img process********************/ + // resize + /** + * @brief resize函数,对chw数据进行resize + * @param ori_shape 原始数据chw + * @param chw_vec 原始数据 + * @param ai2d_out_tensor ai2d输出 + * @return None + */ + void resize(FrameCHWSize ori_shape, std::vector &chw_vec, runtime_tensor &ai2d_out_tensor); + + /** + * @brief resize函数 + * @param builder ai2d构建器,用于运行ai2d + * @param ai2d_in_tensor ai2d输入 + * @param ai2d_out_tensor ai2d输出 + * @return None + */ + void resize(std::unique_ptr &builder, runtime_tensor &ai2d_in_tensor, runtime_tensor &ai2d_out_tensor); + + // crop resize + /** + * @brief resize函数,对chw数据进行crop & resize + * @param builder ai2d构建器,用于运行ai2d + * @param ai2d_in_tensor ai2d输入 + * @param ai2d_out_tensor ai2d输出 + * @return None + */ + void crop_resize(FrameCHWSize ori_shape, std::vector &chw_vec, Bbox &crop_info, runtime_tensor &ai2d_out_tensor); + + /** + * @brief crop_resize函数,对chw数据进行crop & resize + * @param crop_info 需要crop的位置,x,y,w,h + * @param builder ai2d构建器,用于运行ai2d + * @param ai2d_in_tensor ai2d输入 + * @param ai2d_out_tensor ai2d输出 + * @return None + */ + void crop_resize(Bbox &crop_info, std::unique_ptr &builder, runtime_tensor &ai2d_in_tensor, runtime_tensor &ai2d_out_tensor); + + // padding resize + /** + * @brief padding_resize函数(上下左右padding),对chw数据进行padding & resize + * @param ori_shape 原始数据chw + * @param chw_vec 原始数据 + * @param builder ai2d构建器,用于运行ai2d + * @param ai2d_in_tensor ai2d输入 + * @param ai2d_out_tensor ai2d输出 + * @return None + */ + static void padding_resize(FrameCHWSize ori_shape, std::vector &chw_vec, FrameSize resize_shape, runtime_tensor &ai2d_out_tensor, cv::Scalar padding); + + // padding resize + /** + * @brief padding_resize_params函数(上下左右padding),对chw数据进行padding & resize + * @param params 长宽缩放比例以及左右(上下)位移 + * @param ori_shape 原始数据chw + * @param chw_vec 原始数据 + * @param builder ai2d构建器,用于运行ai2d + * @param ai2d_in_tensor ai2d输入 + * @param ai2d_out_tensor ai2d输出 + * @return None + */ + static void padding_resize_params(cv::Vec4d& params,FrameCHWSize ori_shape, std::vector &chw_vec, FrameSize resize_shape, runtime_tensor &ai2d_out_tensor, cv::Scalar padding); + + /** + * @brief padding_resize函数(右或下padding),对chw数据进行padding & resize + * @param ori_shape 原始数据chw + * @param chw_vec 原始数据 + * @param resize_shape resize之后的大小 + * @param ai2d_out_tensor ai2d输出 + * @param padding 填充值,用于resize时的等比例变换 + * @return None + */ + static void padding_resize_one_side(FrameCHWSize ori_shape, std::vector &chw_vec, FrameSize resize_shape, runtime_tensor &ai2d_out_tensor, cv::Scalar padding); + + /** + * @brief padding_resize函数(上下左右padding),对chw数据进行padding & resize + * @param ori_shape 原始数据chw + * @param resize_shape resize之后的大小 + * @param builder ai2d构建器,用于运行ai2d + * @param ai2d_in_tensor ai2d输入 + * @param ai2d_out_tensor ai2d输出 + * @param padding 填充值,用于resize时的等比例变换 + * @return None + */ + static void padding_resize(FrameCHWSize ori_shape, FrameSize resize_shape, std::unique_ptr &builder, runtime_tensor &ai2d_in_tensor, runtime_tensor &ai2d_out_tensor, cv::Scalar padding); + + + /** + * @brief padding_resize_params函数(上下左右padding),对chw数据进行padding & resize + * @param params 长宽缩放比例以及左右(上下)位移 + * @param ori_shape 原始数据chw + * @param resize_shape resize之后的大小 + * @param builder ai2d构建器,用于运行ai2d + * @param ai2d_in_tensor ai2d输入 + * @param ai2d_out_tensor ai2d输出 + * @param padding 填充值,用于resize时的等比例变换 + * @return None + */ + static void padding_resize_params(cv::Vec4d& params,FrameCHWSize ori_shape, FrameSize resize_shape, std::unique_ptr &builder, runtime_tensor &ai2d_in_tensor, runtime_tensor &ai2d_out_tensor, cv::Scalar padding); + + /** + * @brief padding_resize函数(右或下padding),对chw数据进行padding & resize + * @param ori_shape 原始数据chw + * @param resize_shape resize之后的大小 + * @param builder ai2d构建器,用于运行ai2d + * @param ai2d_in_tensor ai2d输入 + * @param ai2d_out_tensor ai2d输出 + * @param padding 填充值,用于resize时的等比例变换 + * @return None + */ + static void padding_resize_one_side(FrameCHWSize ori_shape, FrameSize resize_shape, std::unique_ptr &builder, runtime_tensor &ai2d_in_tensor, runtime_tensor &ai2d_out_tensor, const cv::Scalar padding); + + // affine + /** + * @brief 仿射变换函数,对chw数据进行仿射变换(for imgae) + * @param ori_shape 原始数据chw大小 + * @param ori_data 原始数据 + * @param affine_matrix 仿射变换矩阵 + * @param ai2d_out_tensor 仿射变换后的数据 + * @return None + */ + static void affine(FrameCHWSize ori_shape, std::vector &ori_data, float *affine_matrix, runtime_tensor &ai2d_out_tensor); + + /** + * @brief 仿射变换函数,对chw数据进行仿射变换(for video) + * @param affine_matrix 仿射变换矩阵 + * @param builder ai2d构建器,用于运行ai2d + * @param ai2d_in_tensor ai2d输入 + * @param ai2d_out_tensor ai2d输出 + * @return None + */ + static void affine(float *affine_matrix, std::unique_ptr &builder, runtime_tensor &ai2d_in_tensor, runtime_tensor &ai2d_out_tensor); + + /** + * @brief 非极大值抑制 + * @param input_boxes 所有候选框 + * @param NMS_THRESH NMS阈值 + * @return None + **/ + static void nms(std::vector &input_boxes, float NMS_THRESH); + + /** + * @brief 解码 + * @param data kmodel 推理结果 + * @param net_size kmodel 输入尺寸大小 + * @param stride 步长 + * @param num_classes 类别数 + * @param frame_size 分辨率 + * @param anchors 锚框 + * @param threshold 检测框阈值 + **/ + static std::vector decode_infer(float *data, int net_size, int stride, int num_classes, FrameSize frame_size, float anchors[][2], float threshold); + + /** + * @brief 对所有Pose结果(含boxes)进行NMS处理 + * @param input_boxes 所有boxes + * @param NMS_THRESH NMS阈值 + * @param nms_result NMS处理之后的结果 + * @return None + */ + static void nms_pose(std::vector &input_boxes, float NMS_THRESH,std::vector &nms_result); + + /** + * @brief 绘制关键点 + * @param img 原图 + * @param results 关键点结果 + * @param SKELETON 骨骼信息,常量 + * @param KPS_COLORS 关键点颜色信息,常量 + * @param LIMB_COLORS 肢体颜色信息,常量 + * @return None + */ + static void DrawPred(cv::Mat& img, std::vector& results, + const std::vector> &SKELLTON, + const std::vector> &KPS_COLORS, + const std::vector> &LIMB_COLORS); + + /** + * @brief 绘制关键点 + * @param img 原图 + * @param frame_size 分辨率 + * @param results 关键点结果 + * @param SKELETON 骨骼信息,常量 + * @param KPS_COLORS 关键点颜色信息,常量 + * @param LIMB_COLORS 肢体颜色信息,常量 + * @return None + */ + static void DrawPred_video(cv::Mat& img,FrameSize frame_size, std::vector& results, + const std::vector> &SKELLTON, + const std::vector> &KPS_COLORS, + const std::vector> &LIMB_COLORS); + + +}; + +const std::vector> KPS_COLORS = // 关键点颜色 + {{0, 255, 0}, + {0, 255, 0}, + {0, 255, 0}, + {0, 255, 0}, + {0, 255, 0}, + {255, 128, 0}, + {255, 128, 0}, + {255, 128, 0}, + {255, 128, 0}, + {255, 128, 0}, + {255, 128, 0}, + {51, 153, 255}, + {51, 153, 255}, + {51, 153, 255}, + {51, 153, 255}, + {51, 153, 255}, + {51, 153, 255}}; + +const std::vector> SKELETON = {{16, 14}, // 骨骼信息 + {14, 12}, + {17, 15}, + {15, 13}, + {12, 13}, + {6, 12}, + {7, 13}, + {6, 7}, + {6, 8}, + {7, 9}, + {8, 10}, + {9, 11}, + {2, 3}, + {1, 2}, + {1, 3}, + {2, 4}, + {3, 5}, + {4, 6}, + {5, 7}}; + +const std::vector> LIMB_COLORS = {{51, 153, 255}, // 肢体信息 + {51, 153, 255}, + {51, 153, 255}, + {51, 153, 255}, + {255, 51, 255}, + {255, 51, 255}, + {255, 51, 255}, + {255, 128, 0}, + {255, 128, 0}, + {255, 128, 0}, + {255, 128, 0}, + {255, 128, 0}, + {0, 255, 0}, + {0, 255, 0}, + {0, 255, 0}, + {0, 255, 0}, + {0, 255, 0}, + {0, 255, 0}, + {0, 255, 0}}; + + + +#endif diff --git a/src/reference/ai_poc/pose_det_rtsp_plug/big/vi_vo.h b/src/reference/ai_poc/pose_det_rtsp_plug/big/vi_vo.h new file mode 100644 index 000000000..f84e75475 --- /dev/null +++ b/src/reference/ai_poc/pose_det_rtsp_plug/big/vi_vo.h @@ -0,0 +1,602 @@ +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include + +#include "mpi_sys_api.h" + +/* vicap */ +#include +#include +#include +#include +#include + +#include "k_module.h" +#include "k_type.h" +#include "k_vb_comm.h" +#include "k_video_comm.h" +#include "k_sys_comm.h" +#include "mpi_vb_api.h" +#include "mpi_vicap_api.h" +#include "mpi_isp_api.h" +#include "mpi_sys_api.h" +#include "k_vo_comm.h" +#include "mpi_vo_api.h" + +#include "vo_test_case.h" + +#include "k_connector_comm.h" +#include "mpi_connector_api.h" +#include "k_autoconf_comm.h" + + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) +#define SENSOR_CHANNEL (3) // isp通道数 +#define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 +#define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 +#define ISP_CHN0_WIDTH (1920)//(1920) +#define ISP_CHN0_HEIGHT (1080)//(1080) +#define vicap_install_osd (0) +#define osd_id K_VO_OSD3 +#define osd_width (1280) +#define osd_height (720) +#else +#define SENSOR_CHANNEL (3) // isp通道数 +#define SENSOR_HEIGHT (1280) // isp高度,ai输入,竖屏 +#define SENSOR_WIDTH (720) // isp宽度,ai输入,竖屏 +#define ISP_CHN0_WIDTH (1088)//(1920) +#define ISP_CHN0_HEIGHT (1920)//(1080) +#define vicap_install_osd (1) +#define osd_id K_VO_OSD3 +#define osd_width (1080) +#define osd_height (1920) +#endif + + +k_vb_config config; +k_vicap_dev vicap_dev; +k_vicap_chn vicap_chn; +k_vicap_dev_attr dev_attr; +k_vicap_chn_attr chn_attr; +k_vicap_sensor_info sensor_info; +k_vicap_sensor_type sensor_type; +k_mpp_chn vicap_mpp_chn; +k_mpp_chn vo_mpp_chn; + +k_video_frame_info dump_info; + +k_vo_draw_frame vo_frame = (k_vo_draw_frame) { + 1, + 16, + 16, + 128, + 128, + 1 +}; + +static k_vb_blk_handle block; +k_u32 g_pool_id; + +int vo_creat_layer_test(k_vo_layer chn_id, layer_info *info) +{ + k_vo_video_layer_attr attr; + + // check layer + if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) + || ((info->func != 0) && (chn_id == K_VO_LAYER2))) + { + printf("input layer num failed \n"); + return -1 ; + } + + // check scaler + + // set offset + attr.display_rect = info->offset; + // set act + attr.img_size = info->act_size; + // sget size + info->size = info->act_size.height * info->act_size.width * 3 / 2; + //set pixel format + attr.pixel_format = info->format; + if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) + { + printf("input pix format failed \n"); + return -1; + } + // set stride + attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); + // set function + attr.func = info->func; + // set scaler attr + attr.scaler_attr = info->attr; + + // set video layer atrr + kd_mpi_vo_set_video_layer_attr(chn_id, &attr); + + // enable layer + kd_mpi_vo_enable_video_layer(chn_id); + + return 0; +} + +k_vb_blk_handle vo_insert_frame(k_video_frame_info *vf_info, void **pic_vaddr) +{ + k_u64 phys_addr = 0; + k_u32 *virt_addr; + k_vb_blk_handle handle; + k_s32 size; + + if (vf_info == NULL) + return K_FALSE; + + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_8888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_8888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 4; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_565 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_565) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_4444 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_4444) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_1555 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_1555) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3 / 2; + + size = size + 4096; // 强制4K ,后边得删了 + + printf("vb block size is %x \n", size); + + handle = kd_mpi_vb_get_block(g_pool_id, size, NULL); + if (handle == VB_INVALID_HANDLE) + { + printf("%s get vb block error\n", __func__); + return K_FAILED; + } + + phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); + if (phys_addr == 0) + { + printf("%s get phys addr error\n", __func__); + return K_FAILED; + } + + virt_addr = (k_u32 *)kd_mpi_sys_mmap(phys_addr, size); + // virt_addr = (k_u32 *)kd_mpi_sys_mmap_cached(phys_addr, size); + + if (virt_addr == NULL) + { + printf("%s mmap error\n", __func__); + return K_FAILED; + } + + vf_info->mod_id = K_ID_VO; + vf_info->pool_id = g_pool_id; + vf_info->v_frame.phys_addr[0] = phys_addr; + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + vf_info->v_frame.phys_addr[1] = phys_addr + (vf_info->v_frame.height * vf_info->v_frame.stride[0]); + *pic_vaddr = virt_addr; + + printf("phys_addr is %lx g_pool_id is %d \n", phys_addr, g_pool_id); + + return handle; +} + +k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) +{ + k_vo_video_osd_attr attr; + + // set attr + attr.global_alptha = info->global_alptha; + + if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) + { + info->size = info->act_size.width * info->act_size.height * 4; + info->stride = info->act_size.width * 4 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) + { + info->size = info->act_size.width * info->act_size.height * 3; + info->stride = info->act_size.width * 3 / 8; + } + else if(info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if(info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else + { + printf("set osd pixel format failed \n"); + } + + attr.stride = info->stride; + attr.pixel_format = info->format; + attr.display_rect = info->offset; + attr.img_size = info->act_size; + kd_mpi_vo_set_video_osd_attr(osd, &attr); + + kd_mpi_vo_osd_enable(osd); + + return 0; +} + +void sample_vicap_install_osd(void) +{ + osd_info osd; + + osd.act_size.width = osd_width ; + osd.act_size.height = osd_height; + osd.offset.x = 0; + osd.offset.y = 0; + osd.global_alptha = 0xff; + // osd.global_alptha = 0x32; + osd.format = PIXEL_FORMAT_ARGB_8888;//PIXEL_FORMAT_ARGB_4444; //PIXEL_FORMAT_ARGB_1555;//PIXEL_FORMAT_ARGB_8888; + + vo_creat_osd_test(osd_id, &osd); +} + +void vo_osd_release_block(void) +{ + if(vicap_install_osd == 1) + { + kd_mpi_vo_osd_disable(osd_id); + kd_mpi_vb_release_block(block); + } + +} + +static k_s32 sample_connector_init(void) +{ + k_u32 ret = 0; + k_s32 connector_fd; +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#else + k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#endif + k_connector_info connector_info; + + memset(&connector_info, 0, sizeof(k_connector_info)); + + //connector get sensor info + ret = kd_mpi_get_connector_info(connector_type, &connector_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + + connector_fd = kd_mpi_connector_open(connector_info.connector_name); + if (connector_fd < 0) { + printf("%s, connector open failed.\n", __func__); + return K_ERR_VO_NOTREADY; + } + + // set connect power + kd_mpi_connector_power_set(connector_fd, K_TRUE); + // connector init + kd_mpi_connector_init(connector_fd, connector_info); + + return 0; +} + +static k_s32 vo_layer_vdss_bind_vo_config(void) +{ + layer_info info; + + k_vo_layer chn_id = K_VO_LAYER1; + + memset(&info, 0, sizeof(info)); + + sample_connector_init(); + + // config lyaer + info.act_size.width = ISP_CHN0_WIDTH;//ISP_CHN0_HEIGHT;//1080;//640;//1080; + info.act_size.height = ISP_CHN0_HEIGHT;//ISP_CHN0_WIDTH;//1920;//480;//1920; + info.format = PIXEL_FORMAT_YVU_PLANAR_420; + info.func = 0;//K_ROTATION_180;////K_ROTATION_90; + info.global_alptha = 0xff; + info.offset.x = 0;//(1080-w)/2, + info.offset.y = 0;//(1920-h)/2; + vo_creat_layer_test(chn_id, &info); + + if(vicap_install_osd == 1) + sample_vicap_install_osd(); + + //exit ; + return 0; +} + +static void sample_vicap_bind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) +{ + k_s32 ret; + + ret = kd_mpi_sys_bind(&vicap_mpp_chn, &vo_mpp_chn); + if (ret) { + printf("kd_mpi_sys_bind failed:0x%x\n", ret); + } + + return; +} + +static void sample_vicap_unbind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) +{ + k_s32 ret; + + ret = kd_mpi_sys_unbind(&vicap_mpp_chn, &vo_mpp_chn); + if (ret) { + printf("kd_mpi_sys_unbind failed:0x%x\n", ret); + } + + return; +} + +int vivcap_start() +{ + k_s32 ret = 0; + + k_u32 pool_id; + k_vb_pool_config pool_config; + + printf("sample_vicap ...\n"); + +#if defined(CONFIG_BOARD_K230_CANMV) + sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; + kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; + kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); +#else + sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; +#endif + vicap_dev = VICAP_DEV_ID_0; + + // vb 初始化放到了rtsp_enc.cc文件中 这里不需要进行vb初始化和 反初始化 + + vo_layer_vdss_bind_vo_config(); + + if(vicap_install_osd == 1) + { + memset(&pool_config, 0, sizeof(pool_config)); + pool_config.blk_size = VICAP_ALIGN_UP((osd_width * osd_height * 4 * 2), VICAP_ALIGN_1K); + pool_config.blk_cnt = 4; + pool_config.mode = VB_REMAP_MODE_NOCACHE; + pool_id = kd_mpi_vb_create_pool(&pool_config); // osd0 - 3 argb 320 x 240 + g_pool_id = pool_id; + + printf("--------aa--------------g_pool_id is %d pool_id is %d \n",g_pool_id, pool_id); + } + + memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); + ret = kd_mpi_vicap_get_sensor_info(sensor_type, &sensor_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + + memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); + dev_attr.acq_win.h_start = 0; + dev_attr.acq_win.v_start = 0; +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + dev_attr.acq_win.width = ISP_CHN0_WIDTH; + dev_attr.acq_win.height = ISP_CHN0_HEIGHT; +#else + dev_attr.acq_win.width = 2592;//SENSOR_HEIGHT; + dev_attr.acq_win.height = 1944;//SENSOR_WIDTH; +#endif + dev_attr.mode = VICAP_WORK_ONLINE_MODE; + + dev_attr.pipe_ctrl.data = 0xFFFFFFFF; + dev_attr.pipe_ctrl.bits.af_enable = 0; + dev_attr.pipe_ctrl.bits.ahdr_enable = 0; + + + dev_attr.cpature_frame = 0; + memcpy(&dev_attr.sensor_info, &sensor_info, sizeof(k_vicap_sensor_info)); + + ret = kd_mpi_vicap_set_dev_attr(vicap_dev, dev_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_dev_attr failed.\n"); + return ret; + } + + memset(&chn_attr, 0, sizeof(k_vicap_chn_attr)); + + //set chn0 output yuv420sp + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = ISP_CHN0_WIDTH; + chn_attr.out_win.height = ISP_CHN0_HEIGHT; + + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + chn_attr.crop_win = dev_attr.acq_win; +#else + // chn_attr.crop_win = dev_attr.acq_win; + chn_attr.crop_win.h_start = 768; + chn_attr.crop_win.v_start = 16; + chn_attr.crop_win.width = ISP_CHN0_WIDTH; + chn_attr.crop_win.height = ISP_CHN0_HEIGHT; +#endif + + chn_attr.scale_win = chn_attr.out_win; + chn_attr.crop_enable = K_FALSE; + chn_attr.scale_enable = K_FALSE; + // chn_attr.dw_enable = K_FALSE; + chn_attr.chn_enable = K_TRUE; + chn_attr.pix_format = PIXEL_FORMAT_YVU_PLANAR_420; + chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp + // chn_attr.buffer_size = config.comm_pool[0].blk_size; + chn_attr.buffer_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), 0x1000); + // !!!!!!!!=============== 这里是编码的时候为了 4k对齐设置的 12; 0x1000);=============== !!!!!!!!! + chn_attr.alignment = 12; + vicap_chn = VICAP_CHN_ID_0; + + printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); + ret = kd_mpi_vicap_set_chn_attr(vicap_dev, vicap_chn, chn_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); + return ret; + } + + //bind vicap chn 0 to vo + vicap_mpp_chn.mod_id = K_ID_VI; + vicap_mpp_chn.dev_id = vicap_dev; + vicap_mpp_chn.chn_id = vicap_chn; + + vo_mpp_chn.mod_id = K_ID_VO; + vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; + vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; + + sample_vicap_bind_vo(vicap_mpp_chn, vo_mpp_chn); + printf("sample_vicap ...dwc_dsi_init\n"); + + //set chn1 output rgb888p + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = SENSOR_WIDTH ; + chn_attr.out_win.height = SENSOR_HEIGHT; + // chn_attr.crop_win = dev_attr.acq_win; + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + chn_attr.crop_win = dev_attr.acq_win; +#else + chn_attr.crop_win.h_start = 768; + chn_attr.crop_win.v_start = 16; + chn_attr.crop_win.width = ISP_CHN0_WIDTH; + chn_attr.crop_win.height = ISP_CHN0_HEIGHT; +#endif + + chn_attr.scale_win = chn_attr.out_win; + chn_attr.crop_enable = K_FALSE; + chn_attr.scale_enable = K_FALSE; + // chn_attr.dw_enable = K_FALSE; + chn_attr.chn_enable = K_TRUE; + chn_attr.pix_format = PIXEL_FORMAT_BGR_888_PLANAR; + chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp + // chn_attr.buffer_size = config.comm_pool[1].blk_size; + chn_attr.buffer_size = VICAP_ALIGN_UP((SENSOR_HEIGHT * SENSOR_WIDTH * 3 ), VICAP_ALIGN_1K); + + printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); + ret = kd_mpi_vicap_set_chn_attr(vicap_dev, VICAP_CHN_ID_1, chn_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); + return ret; + } + + printf("sample_vicap ...kd_mpi_vicap_init\n"); + ret = kd_mpi_vicap_init(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + // goto err_exit; + } + + printf("sample_vicap ...kd_mpi_vicap_start_stream\n"); + ret = kd_mpi_vicap_start_stream(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + // goto err_exit; + } + + return ret; +} + +int vivcap_stop() +{ + printf("sample_vicap ...kd_mpi_vicap_stop_stream\n"); + int ret = kd_mpi_vicap_stop_stream(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + return ret; + } + + ret = kd_mpi_vicap_deinit(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_deinit failed.\n"); + return ret; + } + + kd_mpi_vo_disable_video_layer(K_VO_LAYER1); + + vicap_mpp_chn.mod_id = K_ID_VI; + vicap_mpp_chn.dev_id = vicap_dev; + vicap_mpp_chn.chn_id = vicap_chn; + + vo_mpp_chn.mod_id = K_ID_VO; + vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; + vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; + + sample_vicap_unbind_vo(vicap_mpp_chn, vo_mpp_chn); + + /*Allow one frame time for the VO to release the VB block*/ + k_u32 display_ms = 1000 / 33; + usleep(1000 * display_ms); + + + // vb 初始化放到了rtsp_enc.cc文件中 这里不需要进行vb初始化和 反初始化 + // ret = kd_mpi_vb_exit(); + // if (ret) { + // printf("sample_vicap, kd_mpi_vb_exit failed.\n"); + // return ret; + // } + + return 0; +} + +void yuv_rotate_90(char *des, char *src,int width,int height) +{ + int n = 0; + int hw = width>>1; + int hh = height>>1; + int size = width * height; + int hsize = size>>2; + + int pos = 0; + + for(int i = width-1;i >= 0;i--) + { + pos = 0; + for(int j= 0;j < height;j++) + { + des[n++]= src[pos+i]; + pos += width; + } + } + +} \ No newline at end of file diff --git a/src/reference/ai_poc/pose_det_rtsp_plug/little/CMakeLists.txt b/src/reference/ai_poc/pose_det_rtsp_plug/little/CMakeLists.txt new file mode 100644 index 000000000..ddc50666e --- /dev/null +++ b/src/reference/ai_poc/pose_det_rtsp_plug/little/CMakeLists.txt @@ -0,0 +1,52 @@ +cmake_minimum_required(VERSION 3.2) +include(./cmake/Riscv64.cmake) + +project(rtspServer C CXX) + +set(nncase_sdk_root "${PROJECT_SOURCE_DIR}/../../../../big/nncase") +set(k230_sdk ${nncase_sdk_root}/../../../) +set(CDK_SRC_DIR ${k230_sdk}/src/common/cdk) +set(RTSMART_SRC_DIR ${k230_sdk}/src/big/rt-smart) +set(IPCMSG_ROOT ${CDK_SRC_DIR}/user/component/ipcmsg) +set(MAPI_ROOT ${CDK_SRC_DIR}/user/mapi) +set(MPI_ROOT ${RTSMART_SRC_DIR}/userapps/mpp) +set(LIVE_ROOT ${CDK_SRC_DIR}/user/thirdparty/live) +set(MW_ROOT ${CDK_SRC_DIR}/user/middleware) + +set(rtsp_server_root "${PROJECT_SOURCE_DIR}/src") + +set(CMAKE_INSTALL_PREFIX "../") +file(GLOB APP_SOURCES ${rtsp_server_root}/*.cpp) + +set(BIN rtspServer) + +include_directories(${PROJECT_SOURCE_DIR}) +include_directories(${k230_sdk}/src/big/mpp/userapps/api/) +include_directories(${k230_sdk}/src/big/mpp/include) +include_directories(${k230_sdk}/src/big/mpp/include/comm) +include_directories(${k230_sdk}/src/common/cdk/user/component/datafifo/include) + +include_directories(${IPCMSG_ROOT}/include) +include_directories(${MAPI_ROOT}/include) +include_directories(${MAPI_ROOT}/include/api) +include_directories(${MAPI_ROOT}/include/comm) +include_directories(/usr/local/include) +include_directories(${MW_ROOT}/rtsp_server/include) + +link_directories(${k230_sdk}/src/common/cdk/user/component/datafifo/slave/lib) +link_directories(${k230_sdk}/src/big/mpp/userapps/lib) + +link_directories(${IPCMSG_ROOT}/host/lib) +link_directories(${MAPI_ROOT}/mediaclient/lib) +link_directories(${MW_ROOT}/rtsp_server/lib) +link_directories(${LIVE_ROOT}/BasicUsageEnvironment) +link_directories(${LIVE_ROOT}/groupsock) +link_directories(${LIVE_ROOT}/liveMedia) +link_directories(${LIVE_ROOT}/UsageEnvironment) +link_directories(/usr/local/lib) + + +add_executable(${BIN} ${APP_SOURCES}) +target_link_libraries(${BIN} -Wl,--start-group datafifo pthread sys ipcmsg mapi rtsp_server liveMedia UsageEnvironment BasicUsageEnvironment groupsock -Wl,--end-group) + +install(TARGETS ${BIN} DESTINATION out) \ No newline at end of file diff --git a/src/reference/ai_poc/pose_det_rtsp_plug/little/build.sh b/src/reference/ai_poc/pose_det_rtsp_plug/little/build.sh new file mode 100755 index 000000000..e36d254aa --- /dev/null +++ b/src/reference/ai_poc/pose_det_rtsp_plug/little/build.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -x + +# set cross build toolchain +export PATH=$PATH:/opt/toolchain/Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.6.0/bin + +rm -rf out +mkdir out +pushd out +cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=`pwd` \ + -DCMAKE_TOOLCHAIN_FILE=cmake/Riscv64.cmake \ + .. + +make -j && make install +popd \ No newline at end of file diff --git a/src/reference/ai_poc/pose_det_rtsp_plug/little/cmake/Riscv64.cmake b/src/reference/ai_poc/pose_det_rtsp_plug/little/cmake/Riscv64.cmake new file mode 100644 index 000000000..f94b10adc --- /dev/null +++ b/src/reference/ai_poc/pose_det_rtsp_plug/little/cmake/Riscv64.cmake @@ -0,0 +1,18 @@ +include(CMakeForceCompiler) + +# target system +set(CMAKE_SYSTEM_NAME Generic) +set(CMAKE_SYSTEM_PROCESSOR riscv64) + +# cross compiler +set(CMAKE_C_COMPILER riscv64-unknown-linux-gnu-gcc) +set(CMAKE_CXX_COMPILER riscv64-unknown-linux-gnu-g++) + +set(CMAKE_C_FLAGS_DEBUG "-O0 -g3") +set(CMAKE_C_FLAGS_RELEASE "-O0 -s") +set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g3") +set(CMAKE_CXX_FLAGS_RELEASE "-O0 -s") +#SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp") + +# set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=rv64imafdcv -mabi=lp64d -mcmodel=medany") +# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=rv64imafdcv -mabi=lp64d -mcmodel=medany") diff --git a/src/reference/ai_poc/pose_det_rtsp_plug/little/src/main.cpp b/src/reference/ai_poc/pose_det_rtsp_plug/little/src/main.cpp new file mode 100644 index 000000000..1f842de39 --- /dev/null +++ b/src/reference/ai_poc/pose_det_rtsp_plug/little/src/main.cpp @@ -0,0 +1,270 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "k_datafifo.h" +#include "rtsp_server.h" +#include "media.h" + +// datafifo +#define READER_INDEX 0 +std::atomic send_stop(false); +static k_s32 g_s32Index = 0; +static const k_s32 BLOCK_LEN = 1024000; +static k_datafifo_handle hDataFifo[2] = {(k_datafifo_handle)K_DATAFIFO_INVALID_HANDLE, (k_datafifo_handle)K_DATAFIFO_INVALID_HANDLE}; + +using namespace std::chrono_literals; + +static void release(void* pStream) +{ + printf("release %p\n", pStream); +} + +int datafifo_init(k_u64 reader_phyAddr) +{ + k_s32 s32Ret = K_SUCCESS; + k_datafifo_params_s params_reader = {10, BLOCK_LEN, K_TRUE, DATAFIFO_READER}; + + s32Ret = kd_datafifo_open_by_addr(&hDataFifo[READER_INDEX], ¶ms_reader, reader_phyAddr); + if (K_SUCCESS != s32Ret) + { + printf("open datafifo error:%x\n", s32Ret); + return -1; + } + + printf("datafifo_init finish\n"); + + return 0; +} + +void datafifo_deinit() +{ + k_s32 s32Ret = K_SUCCESS; + if (K_SUCCESS != s32Ret) + { + printf("write error:%x\n", s32Ret); + } + + kd_datafifo_close(hDataFifo[READER_INDEX]); + printf("datafifo_deinit finish\n"); +} + +static void Usage() { + std::cout << "Usage: ./rtspServer [-p phyAddr] [-t ]" << std::endl; + std::cout << "-p: phyAddr" << std::endl; + std::cout << "-t: the video encoder type: h264/h265, default h265" << std::endl; + exit(-1); +} + +int parse_config(int argc, char *argv[], KdMediaInputConfig &config) { + int result; + opterr = 0; + while ((result = getopt(argc, argv, "H:t:p:")) != -1) { + switch(result) { + case 'H' : { + Usage(); break; + } + case 't': { + std::string s = optarg; + if (s == "h264") config.video_type = KdMediaVideoType::kVideoTypeH264; + else if (s == "h265") config.video_type = KdMediaVideoType::kVideoTypeH265; + else Usage(); + config.video_valid = true; + break; + } + case 'p': { + break; + } + default: Usage(); break; + } + } + if (config.video_valid) { + // validate the parameters... TODO + std::cout << "Validate the input config, not implemented yet, TODO." << std::endl; + } + return 0; +} + +class MyRtspServer : public IOnBackChannel, public IOnAEncData, public IOnVEncData { + public: + MyRtspServer() {} + + // IOnBackChannel + virtual void OnBackChannelData(std::string &session_name, const uint8_t *data, size_t size, uint64_t timestamp) override { + if (started_) { + // TODO, need to queue data to handle jitter and control accumulation + // gather data to get complete frame(40ms). + if (backchannel_data_size == 0) { + timestamp_backchanel = timestamp; + } + for (size_t i = 0; i < size ;i++) { + g711_buffer_backchannel[backchannel_data_size++] = data[i]; + if (backchannel_data_size == 320) { + media_.SendData(g711_buffer_backchannel, backchannel_data_size, timestamp_backchanel); + backchannel_data_size = 0; + timestamp_backchanel = timestamp; + } + } + } + } + + // IOnAEncData + virtual void OnAEncData(k_u32 chn_id, k_audio_stream* stream_data) override { + if (started_) { + rtsp_server_.SendAudioData(stream_url_, (const uint8_t*)stream_data->stream, stream_data->len, stream_data->time_stamp); + } + } + + // IOnVEncData + virtual void OnVEncData(k_u32 chn_id, void *data, size_t size, uint64_t timestamp) override { + if (started_) { + rtsp_server_.SendVideoData(stream_url_, (const uint8_t*)data, size, timestamp); + } + } + + int Init(const KdMediaInputConfig &config, const std::string &stream_url = "BackChannelTest", int port = 8554) { + if (rtsp_server_.Init(port, this) < 0) { + return -1; + } + // enable audio-track and backchannel-track + SessionAttr session_attr; + session_attr.with_audio = false; + session_attr.with_audio_backchannel = false; + session_attr.with_video = config.video_valid; + if (config.video_valid) { + if (config.video_type == KdMediaVideoType::kVideoTypeH264) session_attr.video_type = VideoType::kVideoTypeH264; + else if (config.video_type == KdMediaVideoType::kVideoTypeH265) session_attr.video_type = VideoType::kVideoTypeH265; + else { + std::cout << "video codec type not supported yet" << std::endl; + return -1; + } + } + if (rtsp_server_.CreateSession(stream_url, session_attr) < 0) return -1; + stream_url_ = stream_url; + + return 0; + } + int DeInit() { + Stop(); + rtsp_server_.DeInit(); + return 0; + } + + int Start() { + if(started_) return 0; + rtsp_server_.Start(); + started_ = true; + return 0; + } + int Stop() { + if (!started_) return 0; + rtsp_server_.Stop(); + started_ = false; + return 0; + } + + private: + KdRtspServer rtsp_server_; + KdMedia media_; + std::string stream_url_; + std::atomic started_{false}; + uint8_t g711_buffer_backchannel[320]; + size_t backchannel_data_size = 0; + uint64_t timestamp_backchanel; +}; + + + +void* read_send(void* arg) +{ + MyRtspServer *server = (MyRtspServer *)arg; + k_u32 readLen = 0; + k_char* pBuf; + k_s32 s32Ret = K_SUCCESS; + + while (!send_stop) + { + readLen = 0; + s32Ret = kd_datafifo_cmd(hDataFifo[READER_INDEX], DATAFIFO_CMD_GET_AVAIL_READ_LEN, &readLen); + if (K_SUCCESS != s32Ret) + { + printf("get available read len error:%x\n", s32Ret); + break; + } + + if (readLen > 0) + { + s32Ret = kd_datafifo_read(hDataFifo[READER_INDEX], (void**)&pBuf); + if (K_SUCCESS != s32Ret) + { + printf("read error:%x\n", s32Ret); + break; + } + s32Ret = kd_datafifo_cmd(hDataFifo[READER_INDEX], DATAFIFO_CMD_READ_DONE, pBuf); + if (K_SUCCESS != s32Ret) + { + printf("read done error:%x\n", s32Ret); + break; + } + + unsigned long pts = ((unsigned long *)pBuf)[0]; + unsigned int len = ((unsigned int *)pBuf)[2]; + k_char *data = pBuf + sizeof(unsigned long) + sizeof(unsigned int); + + server->OnVEncData(0, (void *)data, (size_t)len, pts); + } + } +} + +int main(int argc, char *argv[]) { + std::cout << "./rtspServer -H to show usage" << std::endl; + std::cout << "./rtspServer -p 1628c000 -t h265" << std::endl; + + KdMediaInputConfig config; + int ret = parse_config(argc, argv, config); + + // 初始化 datafifo + k_s32 s32Ret = K_SUCCESS; + k_u64 phyAddr[2]; + sscanf(argv[2], "%lx", &phyAddr[READER_INDEX]); + s32Ret = datafifo_init(phyAddr[READER_INDEX]); + + // 创建 rtsp 服务 + MyRtspServer *server = new MyRtspServer(); + if (!server || server->Init(config) < 0) { + std::cout << "KdRtspServer Init failed." << std::endl; + return -1; + } + server->Start(); + + // 启动 数据发送 线程 + std::thread readThread(read_send, server); + + printf("Input q to exit: \n"); + while (getchar() != 'q') + { + usleep(10000); + } + + send_stop = true; + readThread.join(); + + // 关闭rtsp服务 + server->Stop(); + server->DeInit(); + delete server; + // datafifo反初始化 + datafifo_deinit(); + return 0; +} diff --git a/src/reference/ai_poc/pose_det_rtsp_plug/little/src/media.cpp b/src/reference/ai_poc/pose_det_rtsp_plug/little/src/media.cpp new file mode 100644 index 000000000..0e9be1ab0 --- /dev/null +++ b/src/reference/ai_poc/pose_det_rtsp_plug/little/src/media.cpp @@ -0,0 +1,478 @@ +#include "media.h" +#include +#include +#include + +#define AUDIO_PERSEC_DIV_NUM 25 +#define VI_ALIGN_UP(addr, size) (((addr)+((size)-1U))&(~((size)-1U))) + +static k_s32 g_mmap_fd_tmp = 0; +static std::mutex mmap_mutex_; +static void *_sys_mmap(k_u64 phys_addr, k_u32 size) +{ + void *virt_addr = NULL; + void *mmap_addr = NULL; + k_u32 page_size = sysconf(_SC_PAGESIZE); + k_u64 page_mask = (page_size - 1); + k_u32 mmap_size = ((size) + (phys_addr & page_mask) + page_mask) & ~(page_mask); + + std::unique_lock lck(mmap_mutex_); + if (g_mmap_fd_tmp == 0) { + g_mmap_fd_tmp = open("/dev/mem", O_RDWR | O_SYNC); + } + + mmap_addr = mmap(NULL, mmap_size, PROT_READ | PROT_WRITE, MAP_SHARED, g_mmap_fd_tmp, phys_addr & ~page_mask); + if (mmap_addr != (void*)(-1)) + virt_addr = (void*)((char*)mmap_addr + (phys_addr & page_mask)); + else + printf("**** sys_mmap failed\n"); + + return virt_addr; +} + +static k_s32 _sys_munmap(k_u64 phys_addr, void *virt_addr, k_u32 size) +{ + std::unique_lock lck(mmap_mutex_); + if (g_mmap_fd_tmp == 0) { + return -1; + } + k_u32 page_size = sysconf(_SC_PAGESIZE); + k_u64 page_mask = page_size - 1; + k_u32 mmap_size = ((size) + (phys_addr & page_mask) + page_mask) & ~(page_mask); + void* mmap_addr = (void*)((char*)virt_addr - (phys_addr & page_mask)); + if( munmap(mmap_addr, mmap_size) < 0) { + printf("**** munmap failed\n"); + } + return 0; +} + +int KdMedia::Init(const KdMediaInputConfig &config) { + int ret = kd_mapi_sys_init(); + if (ret != K_SUCCESS) { + std::cout << "kd_mapi_sys_init error." << std::endl; + return ret; + } + + k_mapi_media_attr_t media_attr; + memset(&media_attr, 0, sizeof(media_attr)); + media_attr.media_config.vb_config.max_pool_cnt = config.video_valid? 5 : 2; + media_attr.media_config.vb_config.comm_pool[0].blk_cnt = 150; + media_attr.media_config.vb_config.comm_pool[0].blk_size = audio_sample_rate_ * 2 * 4 / AUDIO_PERSEC_DIV_NUM; + media_attr.media_config.vb_config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; + media_attr.media_config.vb_config.comm_pool[1].blk_cnt = 2; + media_attr.media_config.vb_config.comm_pool[1].blk_size = audio_sample_rate_ * 2 * 4 / AUDIO_PERSEC_DIV_NUM * 2; + media_attr.media_config.vb_config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; + + if (config.video_valid) { + k_u64 pic_size = config.venc_width * config.venc_height * 2; + k_u64 stream_size = config.venc_width * config.venc_height / 2; + media_attr.media_config.vb_config.comm_pool[2].blk_cnt = 6; + media_attr.media_config.vb_config.comm_pool[2].blk_size = ((pic_size + 0xfff) & ~0xfff); + media_attr.media_config.vb_config.comm_pool[2].mode = VB_REMAP_MODE_NOCACHE; + media_attr.media_config.vb_config.comm_pool[3].blk_cnt = 30; + media_attr.media_config.vb_config.comm_pool[3].blk_size = ((stream_size + 0xfff) & ~0xfff); + media_attr.media_config.vb_config.comm_pool[3].mode = VB_REMAP_MODE_NOCACHE; + + memset(&vcap_dev_info_, 0, sizeof(vcap_dev_info_)); + if (config.sensor_type <= OV_OV9286_MIPI_1280X720_60FPS_10BIT_LINEAR_IR_SPECKLE || config.sensor_type >= SC_SC035HGS_MIPI_1LANE_RAW10_640X480_120FPS_LINEAR) + vcap_dev_info_.dw_en = K_FALSE; + else + vcap_dev_info_.dw_en = K_TRUE; + + if (vcap_dev_info_.dw_en) { + k_vicap_sensor_info sensor_info; + memset(&sensor_info, 0, sizeof(sensor_info)); + sensor_info.sensor_type = config.sensor_type; + int ret = kd_mapi_vicap_get_sensor_info(&sensor_info); + if (ret != K_SUCCESS) { + std::cout << "KdMedia::Init() kd_mapi_vicap_get_sensor_info failed, ret = " << ret << std::endl; + kd_mapi_sys_deinit(); + return ret; + } + media_attr.media_config.vb_config.comm_pool[4].blk_cnt = 6; + media_attr.media_config.vb_config.comm_pool[4].blk_size = VI_ALIGN_UP(sensor_info.width * sensor_info.height * 3 / 2, 0x1000); + media_attr.media_config.vb_config.comm_pool[4].mode = VB_REMAP_MODE_NOCACHE; + } + // memset(&media_attr_.media_config.vb_supp.supplement_config, 0, sizeof(media_attr_.media_config.vb_supp.supplement_config)); + // media_attr_.media_config.vb_supp.supplement_config |= VB_SUPPLEMENT_JPEG_MASK; + } + + ret = kd_mapi_media_init(&media_attr); + if (ret != K_SUCCESS) { + std::cout << "kd_mapi_media_init error." << std::endl; + kd_mapi_sys_deinit(); + return ret; + } + + if (config.video_valid) { + vcap_dev_info_.pipe_ctrl.data = 0xFFFFFFFF; + vcap_dev_info_.sensor_type = config.sensor_type; + vcap_dev_info_.vicap_dev = VICAP_DEV_ID_0; + ret = kd_mapi_vicap_set_dev_attr(vcap_dev_info_); + if (ret != K_SUCCESS) { + std::cout << "KdMedia::Init() kd_mapi_vicap_set_dev_attr failed, ret = " << ret << std::endl; + kd_mapi_media_deinit(); + kd_mapi_sys_deinit(); + return ret; + } + } + config_ = config; + return ret; +} + +int KdMedia::Deinit() { + kd_mapi_media_deinit(); + kd_mapi_sys_deinit(); + return 0; +} + +int KdMedia::CreateAiAEnc(IOnAEncData *on_aenc_data) { + std::unique_lock lck(ai_aenc_mutex_); + if (ai_initialized) return 0; + k_aio_dev_attr aio_dev_attr; + memset(&aio_dev_attr, 0, sizeof(aio_dev_attr)); + aio_dev_attr.audio_type = KD_AUDIO_INPUT_TYPE_I2S; + aio_dev_attr.kd_audio_attr.i2s_attr.sample_rate = audio_sample_rate_; + aio_dev_attr.kd_audio_attr.i2s_attr.bit_width = KD_AUDIO_BIT_WIDTH_16; + aio_dev_attr.kd_audio_attr.i2s_attr.chn_cnt = 2; + aio_dev_attr.kd_audio_attr.i2s_attr.i2s_mode = K_STANDARD_MODE; + aio_dev_attr.kd_audio_attr.i2s_attr.snd_mode = KD_AUDIO_SOUND_MODE_MONO; + aio_dev_attr.kd_audio_attr.i2s_attr.frame_num = AUDIO_PERSEC_DIV_NUM; + aio_dev_attr.kd_audio_attr.i2s_attr.point_num_per_frame = audio_sample_rate_ / aio_dev_attr.kd_audio_attr.i2s_attr.frame_num; + aio_dev_attr.kd_audio_attr.i2s_attr.i2s_type = K_AIO_I2STYPE_INNERCODEC; + if (K_SUCCESS != kd_mapi_ai_init(0, 0, &aio_dev_attr, &ai_handle_)) { + std::cout << "kd_mapi_ai_init failed." << std::endl; + return -1; + } + + // for debug pitch-shift + k_ai_chn_pitch_shift_param ps_param; + memset(&ps_param, 0, sizeof(ps_param)); + ps_param.semitones = config_.pitch_shift_semitones; + if (K_SUCCESS != kd_mapi_ai_set_pitch_shift_attr(ai_handle_, &ps_param)) { + kd_mapi_ai_deinit(ai_handle_); + std::cout << "kd_mapi_ai_init kd_mapi_ai_set_pitch_shift_attr." << std::endl; + return -1; + } + + k_aenc_chn_attr aenc_chn_attr; + memset(&aenc_chn_attr, 0, sizeof(aenc_chn_attr)); + aenc_chn_attr.buf_size = AUDIO_PERSEC_DIV_NUM; + aenc_chn_attr.point_num_per_frame = audio_sample_rate_ / aenc_chn_attr.buf_size; + aenc_chn_attr.type = K_PT_G711U; + if (K_SUCCESS != kd_mapi_aenc_init(0, &aenc_chn_attr)) { + std::cout << "kd_mapi_aenc_init failed." << std::endl; + kd_mapi_ai_deinit(ai_handle_); + return -1; + } + + this->on_aenc_data_ = on_aenc_data; + k_aenc_callback_s aenc_cb; + memset(&aenc_cb, 0, sizeof(aenc_cb)); + aenc_cb.p_private_data = this; + aenc_cb.pfn_data_cb = KdMedia::AudioEncCallback; + kd_mapi_aenc_registercallback(0, &aenc_cb); + + ai_initialized = true; + ai_started_ = false; + return 0; +} + +int KdMedia::DestroyAiAEnc() { + std::unique_lock lck(ai_aenc_mutex_); + if (ai_started_) { + std::cout << "KdMedia::DestroyAiAEnc called, FAILED, stop first!!!" << std::endl; + return -1; + } + if (ai_initialized) { + on_aenc_data_ = nullptr; + kd_mapi_ai_deinit(ai_handle_); + kd_mapi_aenc_deinit(0); + ai_initialized = false; + } + return 0; +} + +int KdMedia::StartAiAEnc() { + std::unique_lock lck(ai_aenc_mutex_); + if(ai_started_) return 0; + kd_mapi_ai_start(ai_handle_); + kd_mapi_aenc_start(0); + kd_mapi_aenc_bind_ai(ai_handle_, 0); + ai_started_ = true; + return 0; +} + +int KdMedia::StopAiAEnc() { + std::unique_lock lck(ai_aenc_mutex_); + if (ai_started_) { + kd_mapi_aenc_unbind_ai(ai_handle_, 0); + kd_mapi_ai_stop(ai_handle_); + kd_mapi_aenc_stop(0); + ai_started_ = false; + } + return 0; +} + +k_s32 KdMedia::AudioEncCallback(k_u32 chn_num, k_audio_stream* stream_data, void* p_private_data) { + KdMedia *thiz = (KdMedia*)p_private_data; + if(!thiz) return -1; + if (thiz->on_aenc_data_) { + thiz->on_aenc_data_->OnAEncData(chn_num, stream_data); + } + return 0; +} + +int KdMedia::CreateADecAo() { + k_s32 ret; + + std::unique_lock lck(adec_ao_mutex_); + k_aio_dev_attr aio_dev_attr; + memset(&aio_dev_attr, 0, sizeof(aio_dev_attr)); + aio_dev_attr.audio_type = KD_AUDIO_OUTPUT_TYPE_I2S; + aio_dev_attr.kd_audio_attr.i2s_attr.sample_rate = audio_sample_rate_; + aio_dev_attr.kd_audio_attr.i2s_attr.bit_width = KD_AUDIO_BIT_WIDTH_16; + aio_dev_attr.kd_audio_attr.i2s_attr.chn_cnt = 2; + aio_dev_attr.kd_audio_attr.i2s_attr.i2s_mode = K_STANDARD_MODE; + aio_dev_attr.kd_audio_attr.i2s_attr.snd_mode = KD_AUDIO_SOUND_MODE_MONO; + aio_dev_attr.kd_audio_attr.i2s_attr.frame_num = AUDIO_PERSEC_DIV_NUM; + aio_dev_attr.kd_audio_attr.i2s_attr.point_num_per_frame = audio_sample_rate_ / aio_dev_attr.kd_audio_attr.i2s_attr.frame_num; + aio_dev_attr.kd_audio_attr.i2s_attr.i2s_type = K_AIO_I2STYPE_INNERCODEC; + ret = kd_mapi_ao_init(0, 0, &aio_dev_attr, &ao_handle_); + if(ret != K_SUCCESS) { + printf("_init_ao error: %x\n", ret); + return -1; + } + + k_adec_chn_attr adec_chn_attr; + memset(&adec_chn_attr, 0, sizeof(adec_chn_attr)); + adec_chn_attr.type = K_PT_G711U; + adec_chn_attr.buf_size = AUDIO_PERSEC_DIV_NUM; + adec_chn_attr.point_num_per_frame = audio_sample_rate_ / adec_chn_attr.buf_size; + adec_chn_attr.mode = K_ADEC_MODE_PACK; + ret = kd_mapi_adec_init(adec_handle_, &adec_chn_attr); + if(ret != K_SUCCESS) { + printf("_init_adec error: %x\n", ret); + return -1; + } + + memset(&audio_stream_, 0, sizeof(audio_stream_)); + return 0; +} + +int KdMedia::DestroyADecAo() { + k_s32 ret; + std::unique_lock lck(adec_ao_mutex_); + ret = kd_mapi_adec_deinit(adec_handle_); + if(ret != K_SUCCESS) { + printf("_deinit_adec error: %x\n", ret); + return -1; + } + + ret = kd_mapi_ao_deinit(ao_handle_); + if(ret != K_SUCCESS) { + printf("_deinit_ao error: %x\n", ret); + return -1; + } + + if (audio_stream_.len) { + kd_mapi_sys_release_vb_block(audio_stream_.phys_addr, audio_stream_.len); + _sys_munmap(audio_stream_.phys_addr, audio_stream_.stream, audio_stream_.len); + memset(&audio_stream_, 0, sizeof(audio_stream_)); + } + return 0; +} + +int KdMedia::StartADecAo() { + std::unique_lock lck(adec_ao_mutex_); + k_s32 ret; + ret = kd_mapi_ao_start(ao_handle_); + if (ret != K_SUCCESS) { + printf("kd_mapi_ao_start failed\n"); + return -1; + } + kd_mapi_adec_start(adec_handle_); + + ret = kd_mapi_adec_bind_ao(ao_handle_, adec_handle_); + if (ret != K_SUCCESS) { + printf("kd_mapi_adec_bind_ao error: %x\n", ret); + return -1; + } + return 0; +} + +int KdMedia::StopADecAo() { + std::unique_lock lck(adec_ao_mutex_); + k_s32 ret = kd_mapi_adec_unbind_ao(ao_handle_, adec_handle_); + if(ret != K_SUCCESS) { + printf("kd_mapi_adec_unbind_ao error: %x\n", ret); + return -1; + } + kd_mapi_adec_stop(adec_handle_); + kd_mapi_ao_stop(ao_handle_); + return 0; +} + +int KdMedia::SendData(const uint8_t *data, size_t size, uint64_t timestamp_ms) { + k_s32 ret; + std::unique_lock lck(adec_ao_mutex_); + if (audio_stream_.len != size) { + if (audio_stream_.len) { + kd_mapi_sys_release_vb_block(audio_stream_.phys_addr, audio_stream_.len); + _sys_munmap(audio_stream_.phys_addr, audio_stream_.stream, audio_stream_.len); + memset(&audio_stream_, 0, sizeof(audio_stream_)); + } + k_u32 pool_id; + ret = kd_mapi_sys_get_vb_block(&pool_id, &audio_stream_.phys_addr, size, NULL); + // check result, TODO + audio_stream_.stream = _sys_mmap(audio_stream_.phys_addr,size); + audio_stream_.len = size; + } + + memcpy(audio_stream_.stream, data, size); + audio_stream_.time_stamp = timestamp_ms; + audio_stream_.seq ++; + + kd_mapi_adec_send_stream(adec_handle_,&audio_stream_); + return 0; +} + +k_s32 KdMedia::VideoEncCallback(k_u32 chn_num, kd_venc_data_s* stream_data, k_u8* p_private_data) { + KdMedia *thiz = (KdMedia*)p_private_data; + if (thiz && thiz->on_venc_data_) { + int cut = stream_data->status.cur_packs; + for (int i = 0; i < cut; i++) { + thiz->on_venc_data_->OnVEncData(chn_num, stream_data->astPack[i].vir_addr, stream_data->astPack[i].len, stream_data->astPack[i].pts); + } + } + return 0; +} + +int KdMedia::CreateVcapVEnc(IOnVEncData *on_venc_data) { + if (!config_.video_valid) { + return 0; + } + on_venc_data_ = on_venc_data; + + k_venc_chn_attr chn_attr; + memset(&chn_attr, 0, sizeof(chn_attr)); + k_u64 stream_size = config_.venc_width * config_.venc_height / 2; + chn_attr.venc_attr.pic_width = config_.venc_width; + chn_attr.venc_attr.pic_height = config_.venc_height; + chn_attr.venc_attr.stream_buf_size = ((stream_size + 0xfff) & ~0xfff); + chn_attr.venc_attr.stream_buf_cnt = 30; + chn_attr.rc_attr.rc_mode = K_VENC_RC_MODE_CBR; + chn_attr.rc_attr.cbr.src_frame_rate = 30; + chn_attr.rc_attr.cbr.dst_frame_rate = 30; + if (config_.sensor_type == OV_OV9286_MIPI_1280X720_30FPS_10BIT_LINEAR_IR || + config_.sensor_type == OV_OV9286_MIPI_1280X720_30FPS_10BIT_LINEAR_SPECKLE) { + chn_attr.rc_attr.cbr.src_frame_rate = 15; + chn_attr.rc_attr.cbr.dst_frame_rate = 15; + } else if (config_.sensor_type == OV_OV9286_MIPI_1280X720_60FPS_10BIT_LINEAR_IR_SPECKLE) { + chn_attr.rc_attr.cbr.src_frame_rate = 60; + chn_attr.rc_attr.cbr.dst_frame_rate = 60; + } + chn_attr.rc_attr.cbr.bit_rate = config_.bitrate_kbps; + if (config_.video_type == KdMediaVideoType::kVideoTypeH264) { + chn_attr.venc_attr.type = K_PT_H264; + chn_attr.venc_attr.profile = VENC_PROFILE_H264_HIGH; + } else if (config_.video_type == KdMediaVideoType::kVideoTypeH265) { + chn_attr.venc_attr.type = K_PT_H265; + chn_attr.venc_attr.profile = VENC_PROFILE_H265_MAIN; + } else if (config_.video_type == KdMediaVideoType::kVideoTypeMjpeg) { + chn_attr.venc_attr.type = K_PT_JPEG; + chn_attr.rc_attr.rc_mode = K_VENC_RC_MODE_MJPEG_FIXQP; + chn_attr.rc_attr.mjpeg_fixqp.src_frame_rate = 30; + chn_attr.rc_attr.mjpeg_fixqp.dst_frame_rate = 30; + chn_attr.rc_attr.mjpeg_fixqp.q_factor = 45; + } + + uint32_t venc_chn_id = 0; + int ret = kd_mapi_venc_init(venc_chn_id, &chn_attr); + if (ret != K_SUCCESS) { + std::cout << "kd_mapi_venc_init error." << std::endl; + return -1; + } + + if (config_.video_type != KdMediaVideoType::kVideoTypeMjpeg) { + ret = kd_mapi_venc_enable_idr(venc_chn_id, K_TRUE); + if (ret != K_SUCCESS) { + std::cout << "kd_mapi_venc_enable_idr error." << std::endl; + return -1; + } + } + + kd_venc_callback_s venc_callback; + memset(&venc_callback, 0, sizeof(venc_callback)); + venc_callback.p_private_data = (k_u8*)this; + venc_callback.pfn_data_cb = KdMedia::VideoEncCallback; + kd_mapi_venc_registercallback(venc_chn_id, &venc_callback); + + k_vicap_sensor_info sensor_info; + memset(&sensor_info, 0, sizeof(sensor_info)); + sensor_info.sensor_type = config_.sensor_type; + ret = kd_mapi_vicap_get_sensor_info(&sensor_info); + if (ret != K_SUCCESS) { + printf("kd_mapi_vicap_get_sensor_info failed, %x.\n", ret); + return -1; + } + + k_vicap_chn_set_info vi_chn_attr_info; + memset(&vi_chn_attr_info, 0, sizeof(vi_chn_attr_info)); + + vi_chn_attr_info.crop_en = K_FALSE; + vi_chn_attr_info.scale_en = K_FALSE; + vi_chn_attr_info.chn_en = K_TRUE; + vi_chn_attr_info.crop_h_start = 0; + vi_chn_attr_info.crop_v_start = 0; + vi_chn_attr_info.out_width = config_.venc_width; + vi_chn_attr_info.out_height = config_.venc_height; + vi_chn_attr_info.pixel_format = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + vi_chn_attr_info.vicap_dev = VICAP_DEV_ID_0; + vi_chn_attr_info.vicap_chn = (k_vicap_chn)venc_chn_id; + if (!vcap_dev_info_.dw_en) + vi_chn_attr_info.buf_size = VI_ALIGN_UP(config_.venc_width * config_.venc_height * 3 / 2, 0x400); + else + vi_chn_attr_info.buf_size = VI_ALIGN_UP(config_.venc_width * config_.venc_height * 3 / 2, 0x400); + ret = kd_mapi_vicap_set_chn_attr(vi_chn_attr_info); + if (ret != K_SUCCESS) { + printf("vicap chn %d set attr failed, %x.\n", venc_chn_id, ret); + return -1; + } + + return 0; +} + +int KdMedia::DestroyVcapVEnc() { + if (!config_.video_valid) { + return 0; + } + uint32_t chn_id = 0; + kd_mapi_venc_deinit(chn_id); + return 0; +} + +int KdMedia::StartVcapVEnc() { + if (!config_.video_valid) { + return 0; + } + uint32_t chn_id = 0; + kd_mapi_venc_start(chn_id, -1); + kd_mapi_venc_bind_vi(0, chn_id, chn_id); + kd_mapi_vicap_start(VICAP_DEV_ID_0); + return 0; +} + +int KdMedia::StopVcapVEnc() { + if (!config_.video_valid) { + return 0; + } + uint32_t chn_id = 0; + // unbind all + kd_mapi_venc_unbind_vi(VICAP_DEV_ID_0, chn_id, chn_id); + // stop vcap + kd_mapi_vicap_stop(VICAP_DEV_ID_0); + // stop all encoders + kd_mapi_venc_stop(chn_id); + return 0; +} diff --git a/src/reference/ai_poc/pose_det_rtsp_plug/little/src/media.h b/src/reference/ai_poc/pose_det_rtsp_plug/little/src/media.h new file mode 100644 index 000000000..d2e309e58 --- /dev/null +++ b/src/reference/ai_poc/pose_det_rtsp_plug/little/src/media.h @@ -0,0 +1,99 @@ +#ifndef _KD_MEDIA_H +#define _KD_MEDIA_H + +#include +#include +#include +#include +#include "mapi_sys_api.h" +#include "mapi_ai_api.h" +#include "mapi_aenc_api.h" +#include "mapi_ao_api.h" +#include "mapi_adec_api.h" +#include "mapi_vvi_api.h" +#include "mapi_venc_api.h" +#include "mapi_vicap_api.h" +#include "k_vicap_comm.h" + +enum class KdMediaVideoType { + kVideoTypeH264, + kVideoTypeH265, + kVideoTypeMjpeg, + kVideoTypeButt +}; + +struct KdMediaInputConfig { + bool video_valid = false; + k_vicap_sensor_type sensor_type = IMX335_MIPI_2LANE_RAW12_1920X1080_30FPS_LINEAR; + int sensor_num = 1; + KdMediaVideoType video_type = KdMediaVideoType::kVideoTypeH265; + int venc_width = 1280; + int venc_height = 720; + int bitrate_kbps = 2000; + int pitch_shift_semitones = 0; // [-12, 12] +}; + +class IOnAEncData { + public: + virtual ~IOnAEncData() {} + virtual void OnAEncData(k_u32 chn_id, k_audio_stream* stream_data) = 0; +}; + +class IOnVEncData { + public: + virtual ~IOnVEncData() {} + virtual void OnVEncData(k_u32 chn_id, void *data, size_t size, uint64_t timestamp) = 0; +}; + + +// TODO, +// At the moment, KdMedia is for bidirection-speech only. +// +class KdMedia { + public: + KdMedia() {} + int Init(const KdMediaInputConfig &config); + int Deinit(); + + int CreateAiAEnc(IOnAEncData *on_aenc_data); + int DestroyAiAEnc(); + int StartAiAEnc(); + int StopAiAEnc(); + static k_s32 AudioEncCallback(k_u32 chn_num, k_audio_stream* stream_data, void* p_private_data); + + int CreateADecAo(); + int DestroyADecAo(); + int StartADecAo(); + int StopADecAo(); + int SendData(const uint8_t *data, size_t size, uint64_t timestamp_ms); + + int CreateVcapVEnc(IOnVEncData *on_venc_data); + int DestroyVcapVEnc(); + int StartVcapVEnc(); + int StopVcapVEnc(); + static k_s32 VideoEncCallback(k_u32 chn_num, kd_venc_data_s* stream_data, k_u8* p_private_data); + + private: // emphasize the following members are private + KdMedia( const KdMedia& ); + const KdMedia& operator=( const KdMedia& ); + + private: + k_u32 audio_sample_rate_{8000}; // for G711 + k_handle ai_handle_{0}; + bool ai_initialized {false}; + bool ai_started_ {false}; + k_handle aenc_handle_{0}; + k_handle ao_handle_{0}; + bool ao_initialized {false}; + k_handle adec_handle_{0}; + IOnAEncData *on_aenc_data_ {nullptr}; + k_audio_stream audio_stream_; + std::mutex ai_aenc_mutex_; + std::mutex adec_ao_mutex_; + // + KdMediaInputConfig config_; + k_vicap_dev_set_info vcap_dev_info_; + IOnVEncData *on_venc_data_ {nullptr}; +}; + +#endif // _KD_MEDIA_H diff --git a/src/reference/ai_poc/pose_detect/vi_vo.h b/src/reference/ai_poc/pose_detect/vi_vo.h index e3d8bdba4..0a11a4d31 100644 --- a/src/reference/ai_poc/pose_detect/vi_vo.h +++ b/src/reference/ai_poc/pose_detect/vi_vo.h @@ -1,627 +1,628 @@ -/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include -#include -#include - -#include "mpi_sys_api.h" - -/* vicap */ -#include -#include -#include -#include -#include - -#include "k_module.h" -#include "k_type.h" -#include "k_vb_comm.h" -#include "k_video_comm.h" -#include "k_sys_comm.h" -#include "mpi_vb_api.h" -#include "mpi_vicap_api.h" -#include "mpi_isp_api.h" -#include "mpi_sys_api.h" -#include "k_vo_comm.h" -#include "mpi_vo_api.h" - -#include "vo_test_case.h" - -#include "k_connector_comm.h" -#include "mpi_connector_api.h" -#include "k_autoconf_comm.h" - - -#if defined(CONFIG_BOARD_K230_CANMV) -#define SENSOR_CHANNEL (3) // isp通道数 -#define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 -#define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 -#define ISP_CHN0_WIDTH (1920)//(1920) -#define ISP_CHN0_HEIGHT (1080)//(1080) -#define vicap_install_osd (1) -#define osd_id K_VO_OSD3 -#define osd_width (1920) -#define osd_height (1080) -#else -#define SENSOR_CHANNEL (3) // isp通道数 -#define SENSOR_HEIGHT (1280) // isp高度,ai输入,竖屏 -#define SENSOR_WIDTH (720) // isp宽度,ai输入,竖屏 -#define ISP_CHN0_WIDTH (1088)//(1920) -#define ISP_CHN0_HEIGHT (1920)//(1080) -#define vicap_install_osd (1) -#define osd_id K_VO_OSD3 -#define osd_width (1080) -#define osd_height (1920) -#endif - - -k_vb_config config; -k_vicap_dev vicap_dev; -k_vicap_chn vicap_chn; -k_vicap_dev_attr dev_attr; -k_vicap_chn_attr chn_attr; -k_vicap_sensor_info sensor_info; -k_vicap_sensor_type sensor_type; -k_mpp_chn vicap_mpp_chn; -k_mpp_chn vo_mpp_chn; - -k_video_frame_info dump_info; - -k_vo_draw_frame vo_frame = (k_vo_draw_frame) { - 1, - 16, - 16, - 128, - 128, - 1 -}; - -static k_vb_blk_handle block; -k_u32 g_pool_id; - -int vo_creat_layer_test(k_vo_layer chn_id, layer_info *info) -{ - k_vo_video_layer_attr attr; - - // check layer - if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) - || ((info->func != 0) && (chn_id == K_VO_LAYER2))) - { - printf("input layer num failed \n"); - return -1 ; - } - - // check scaler - - // set offset - attr.display_rect = info->offset; - // set act - attr.img_size = info->act_size; - // sget size - info->size = info->act_size.height * info->act_size.width * 3 / 2; - //set pixel format - attr.pixel_format = info->format; - if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) - { - printf("input pix format failed \n"); - return -1; - } - // set stride - attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); - // set function - attr.func = info->func; - // set scaler attr - attr.scaler_attr = info->attr; - - // set video layer atrr - kd_mpi_vo_set_video_layer_attr(chn_id, &attr); - - // enable layer - kd_mpi_vo_enable_video_layer(chn_id); - - return 0; -} - -k_vb_blk_handle vo_insert_frame(k_video_frame_info *vf_info, void **pic_vaddr) -{ - k_u64 phys_addr = 0; - k_u32 *virt_addr; - k_vb_blk_handle handle; - k_s32 size; - - if (vf_info == NULL) - return K_FALSE; - - if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_8888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_8888) - size = vf_info->v_frame.height * vf_info->v_frame.width * 4; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_565 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_565) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_4444 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_4444) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_888) - size = vf_info->v_frame.height * vf_info->v_frame.width * 3; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_1555 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_1555) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) - size = vf_info->v_frame.height * vf_info->v_frame.width * 3 / 2; - - size = size + 4096; // 强制4K ,后边得删了 - - printf("vb block size is %x \n", size); - - handle = kd_mpi_vb_get_block(g_pool_id, size, NULL); - if (handle == VB_INVALID_HANDLE) - { - printf("%s get vb block error\n", __func__); - return K_FAILED; - } - - phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); - if (phys_addr == 0) - { - printf("%s get phys addr error\n", __func__); - return K_FAILED; - } - - virt_addr = (k_u32 *)kd_mpi_sys_mmap(phys_addr, size); - // virt_addr = (k_u32 *)kd_mpi_sys_mmap_cached(phys_addr, size); - - if (virt_addr == NULL) - { - printf("%s mmap error\n", __func__); - return K_FAILED; - } - - vf_info->mod_id = K_ID_VO; - vf_info->pool_id = g_pool_id; - vf_info->v_frame.phys_addr[0] = phys_addr; - if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) - vf_info->v_frame.phys_addr[1] = phys_addr + (vf_info->v_frame.height * vf_info->v_frame.stride[0]); - *pic_vaddr = virt_addr; - - printf("phys_addr is %lx g_pool_id is %d \n", phys_addr, g_pool_id); - - return handle; -} - -k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) -{ - k_vo_video_osd_attr attr; - - // set attr - attr.global_alptha = info->global_alptha; - - if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) - { - info->size = info->act_size.width * info->act_size.height * 4; - info->stride = info->act_size.width * 4 / 8; - } - else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) - { - info->size = info->act_size.width * info->act_size.height * 3; - info->stride = info->act_size.width * 3 / 8; - } - else if(info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else if(info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else - { - printf("set osd pixel format failed \n"); - } - - attr.stride = info->stride; - attr.pixel_format = info->format; - attr.display_rect = info->offset; - attr.img_size = info->act_size; - kd_mpi_vo_set_video_osd_attr(osd, &attr); - - kd_mpi_vo_osd_enable(osd); - - return 0; -} - -void sample_vicap_install_osd(void) -{ - osd_info osd; - - osd.act_size.width = osd_width ; - osd.act_size.height = osd_height; - osd.offset.x = 0; - osd.offset.y = 0; - osd.global_alptha = 0xff; - // osd.global_alptha = 0x32; - osd.format = PIXEL_FORMAT_ARGB_8888;//PIXEL_FORMAT_ARGB_4444; //PIXEL_FORMAT_ARGB_1555;//PIXEL_FORMAT_ARGB_8888; - - vo_creat_osd_test(osd_id, &osd); -} - -void vo_osd_release_block(void) -{ - if(vicap_install_osd == 1) - { - kd_mpi_vo_osd_disable(osd_id); - kd_mpi_vb_release_block(block); - } - -} - -static k_s32 sample_connector_init(void) -{ - k_u32 ret = 0; - k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) - k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; -#else - k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; -#endif - k_connector_info connector_info; - - memset(&connector_info, 0, sizeof(k_connector_info)); - - //connector get sensor info - ret = kd_mpi_get_connector_info(connector_type, &connector_info); - if (ret) { - printf("sample_vicap, the sensor type not supported!\n"); - return ret; - } - - connector_fd = kd_mpi_connector_open(connector_info.connector_name); - if (connector_fd < 0) { - printf("%s, connector open failed.\n", __func__); - return K_ERR_VO_NOTREADY; - } - - // set connect power - kd_mpi_connector_power_set(connector_fd, K_TRUE); - // connector init - kd_mpi_connector_init(connector_fd, connector_info); - - return 0; -} - -static k_s32 vo_layer_vdss_bind_vo_config(void) -{ - layer_info info; - - k_vo_layer chn_id = K_VO_LAYER1; - - memset(&info, 0, sizeof(info)); - - sample_connector_init(); - - // config lyaer - info.act_size.width = ISP_CHN0_WIDTH;//ISP_CHN0_HEIGHT;//1080;//640;//1080; - info.act_size.height = ISP_CHN0_HEIGHT;//ISP_CHN0_WIDTH;//1920;//480;//1920; - info.format = PIXEL_FORMAT_YVU_PLANAR_420; - info.func = 0;//K_ROTATION_180;////K_ROTATION_90; - info.global_alptha = 0xff; - info.offset.x = 0;//(1080-w)/2, - info.offset.y = 0;//(1920-h)/2; - vo_creat_layer_test(chn_id, &info); - - if(vicap_install_osd == 1) - sample_vicap_install_osd(); - - //exit ; - return 0; -} - -static void sample_vicap_bind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) -{ - k_s32 ret; - - ret = kd_mpi_sys_bind(&vicap_mpp_chn, &vo_mpp_chn); - if (ret) { - printf("kd_mpi_sys_unbind failed:0x%x\n", ret); - } - - return; -} - -static void sample_vicap_unbind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) -{ - k_s32 ret; - - ret = kd_mpi_sys_unbind(&vicap_mpp_chn, &vo_mpp_chn); - if (ret) { - printf("kd_mpi_sys_unbind failed:0x%x\n", ret); - } - - return; -} - -int vivcap_start() -{ - k_s32 ret = 0; - - k_u32 pool_id; - k_vb_pool_config pool_config; - - printf("sample_vicap ...\n"); - -#if defined(CONFIG_BOARD_K230_CANMV) - sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); -#else - sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; -#endif - vicap_dev = VICAP_DEV_ID_0; - - memset(&config, 0, sizeof(config)); - config.max_pool_cnt = 64; - //VB for YUV420SP output - config.comm_pool[0].blk_cnt = 5; - config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; - config.comm_pool[0].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), VICAP_ALIGN_1K); - - //VB for RGB888 output - config.comm_pool[1].blk_cnt = 5; - config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; - config.comm_pool[1].blk_size = VICAP_ALIGN_UP((SENSOR_HEIGHT * SENSOR_WIDTH * 3 ), VICAP_ALIGN_1K); - - ret = kd_mpi_vb_set_config(&config); - if (ret) { - printf("vb_set_config failed ret:%d\n", ret); - return ret; - } - - k_vb_supplement_config supplement_config; - memset(&supplement_config, 0, sizeof(supplement_config)); - supplement_config.supplement_config |= VB_SUPPLEMENT_JPEG_MASK; - - ret = kd_mpi_vb_set_supplement_config(&supplement_config); - if (ret) { - printf("vb_set_supplement_config failed ret:%d\n", ret); - return ret; - } - - ret = kd_mpi_vb_init(); - if (ret) { - printf("vb_init failed ret:%d\n", ret); - return ret; - } - printf("sample_vicap ...kd_mpi_vicap_get_sensor_info\n"); - - // dwc_dsi_init(); - vo_layer_vdss_bind_vo_config(); - - if(vicap_install_osd == 1) - { - memset(&pool_config, 0, sizeof(pool_config)); - pool_config.blk_size = VICAP_ALIGN_UP((osd_width * osd_height * 4 * 2), VICAP_ALIGN_1K); - pool_config.blk_cnt = 4; - pool_config.mode = VB_REMAP_MODE_NOCACHE; - pool_id = kd_mpi_vb_create_pool(&pool_config); // osd0 - 3 argb 320 x 240 - g_pool_id = pool_id; - - printf("--------aa--------------g_pool_id is %d pool_id is %d \n",g_pool_id, pool_id); - } - - memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); - ret = kd_mpi_vicap_get_sensor_info(sensor_type, &sensor_info); - if (ret) { - printf("sample_vicap, the sensor type not supported!\n"); - return ret; - } - - memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); - dev_attr.acq_win.h_start = 0; - dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) - dev_attr.acq_win.width = ISP_CHN0_WIDTH; - dev_attr.acq_win.height = ISP_CHN0_HEIGHT; -#else - dev_attr.acq_win.width = 2592;//SENSOR_HEIGHT; - dev_attr.acq_win.height = 1944;//SENSOR_WIDTH; -#endif - dev_attr.mode = VICAP_WORK_ONLINE_MODE; - - dev_attr.pipe_ctrl.data = 0xFFFFFFFF; - dev_attr.pipe_ctrl.bits.af_enable = 0; - dev_attr.pipe_ctrl.bits.ahdr_enable = 0; - - - dev_attr.cpature_frame = 0; - memcpy(&dev_attr.sensor_info, &sensor_info, sizeof(k_vicap_sensor_info)); - - ret = kd_mpi_vicap_set_dev_attr(vicap_dev, dev_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_dev_attr failed.\n"); - return ret; - } - - memset(&chn_attr, 0, sizeof(k_vicap_chn_attr)); - - //set chn0 output yuv420sp - chn_attr.out_win.h_start = 0; - chn_attr.out_win.v_start = 0; - chn_attr.out_win.width = ISP_CHN0_WIDTH; - chn_attr.out_win.height = ISP_CHN0_HEIGHT; - - -#if defined(CONFIG_BOARD_K230_CANMV) - chn_attr.crop_win = dev_attr.acq_win; -#else - // chn_attr.crop_win = dev_attr.acq_win; - chn_attr.crop_win.h_start = 768; - chn_attr.crop_win.v_start = 16; - chn_attr.crop_win.width = ISP_CHN0_WIDTH; - chn_attr.crop_win.height = ISP_CHN0_HEIGHT; -#endif - - chn_attr.scale_win = chn_attr.out_win; - chn_attr.crop_enable = K_FALSE; - chn_attr.scale_enable = K_FALSE; - // chn_attr.dw_enable = K_FALSE; - chn_attr.chn_enable = K_TRUE; - chn_attr.pix_format = PIXEL_FORMAT_YVU_PLANAR_420; - chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp - chn_attr.buffer_size = config.comm_pool[0].blk_size; - vicap_chn = VICAP_CHN_ID_0; - - printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); - ret = kd_mpi_vicap_set_chn_attr(vicap_dev, vicap_chn, chn_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); - return ret; - } - - //bind vicap chn 0 to vo - vicap_mpp_chn.mod_id = K_ID_VI; - vicap_mpp_chn.dev_id = vicap_dev; - vicap_mpp_chn.chn_id = vicap_chn; - - vo_mpp_chn.mod_id = K_ID_VO; - vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; - vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; - - sample_vicap_bind_vo(vicap_mpp_chn, vo_mpp_chn); - printf("sample_vicap ...dwc_dsi_init\n"); - - //set chn1 output rgb888p - chn_attr.out_win.h_start = 0; - chn_attr.out_win.v_start = 0; - chn_attr.out_win.width = SENSOR_WIDTH ; - chn_attr.out_win.height = SENSOR_HEIGHT; - // chn_attr.crop_win = dev_attr.acq_win; - -#if defined(CONFIG_BOARD_K230_CANMV) - chn_attr.crop_win = dev_attr.acq_win; -#else - chn_attr.crop_win.h_start = 768; - chn_attr.crop_win.v_start = 16; - chn_attr.crop_win.width = ISP_CHN0_WIDTH; - chn_attr.crop_win.height = ISP_CHN0_HEIGHT; -#endif - - chn_attr.scale_win = chn_attr.out_win; - chn_attr.crop_enable = K_FALSE; - chn_attr.scale_enable = K_FALSE; - // chn_attr.dw_enable = K_FALSE; - chn_attr.chn_enable = K_TRUE; - chn_attr.pix_format = PIXEL_FORMAT_BGR_888_PLANAR; - chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp - chn_attr.buffer_size = config.comm_pool[1].blk_size; - - printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); - ret = kd_mpi_vicap_set_chn_attr(vicap_dev, VICAP_CHN_ID_1, chn_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); - return ret; - } - - printf("sample_vicap ...kd_mpi_vicap_init\n"); - ret = kd_mpi_vicap_init(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - // goto err_exit; - } - - printf("sample_vicap ...kd_mpi_vicap_start_stream\n"); - ret = kd_mpi_vicap_start_stream(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - // goto err_exit; - } - - return ret; -} - -int vivcap_stop() -{ - printf("sample_vicap ...kd_mpi_vicap_stop_stream\n"); - int ret = kd_mpi_vicap_stop_stream(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - return ret; - } - - ret = kd_mpi_vicap_deinit(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_deinit failed.\n"); - return ret; - } - - kd_mpi_vo_disable_video_layer(K_VO_LAYER1); - - vicap_mpp_chn.mod_id = K_ID_VI; - vicap_mpp_chn.dev_id = vicap_dev; - vicap_mpp_chn.chn_id = vicap_chn; - - vo_mpp_chn.mod_id = K_ID_VO; - vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; - vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; - - sample_vicap_unbind_vo(vicap_mpp_chn, vo_mpp_chn); - - /*Allow one frame time for the VO to release the VB block*/ - k_u32 display_ms = 1000 / 33; - usleep(1000 * display_ms); - - ret = kd_mpi_vb_exit(); - if (ret) { - printf("sample_vicap, kd_mpi_vb_exit failed.\n"); - return ret; - } - - return 0; -} - -void yuv_rotate_90(char *des, char *src,int width,int height) -{ - int n = 0; - int hw = width>>1; - int hh = height>>1; - int size = width * height; - int hsize = size>>2; - - int pos = 0; - - for(int i = width-1;i >= 0;i--) - { - pos = 0; - for(int j= 0;j < height;j++) - { - des[n++]= src[pos+i]; - pos += width; - } - } - +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include + +#include "mpi_sys_api.h" + +/* vicap */ +#include +#include +#include +#include +#include + +#include "k_module.h" +#include "k_type.h" +#include "k_vb_comm.h" +#include "k_video_comm.h" +#include "k_sys_comm.h" +#include "mpi_vb_api.h" +#include "mpi_vicap_api.h" +#include "mpi_isp_api.h" +#include "mpi_sys_api.h" +#include "k_vo_comm.h" +#include "mpi_vo_api.h" + +#include "vo_test_case.h" + +#include "k_connector_comm.h" +#include "mpi_connector_api.h" +#include "k_autoconf_comm.h" + + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) +#define SENSOR_CHANNEL (3) // isp通道数 +#define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 +#define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 +#define ISP_CHN0_WIDTH (1920)//(1920) +#define ISP_CHN0_HEIGHT (1080)//(1080) +#define vicap_install_osd (1) +#define osd_id K_VO_OSD3 +#define osd_width (1920) +#define osd_height (1080) +#else +#define SENSOR_CHANNEL (3) // isp通道数 +#define SENSOR_HEIGHT (1280) // isp高度,ai输入,竖屏 +#define SENSOR_WIDTH (720) // isp宽度,ai输入,竖屏 +#define ISP_CHN0_WIDTH (1088)//(1920) +#define ISP_CHN0_HEIGHT (1920)//(1080) +#define vicap_install_osd (1) +#define osd_id K_VO_OSD3 +#define osd_width (1080) +#define osd_height (1920) +#endif + + +k_vb_config config; +k_vicap_dev vicap_dev; +k_vicap_chn vicap_chn; +k_vicap_dev_attr dev_attr; +k_vicap_chn_attr chn_attr; +k_vicap_sensor_info sensor_info; +k_vicap_sensor_type sensor_type; +k_mpp_chn vicap_mpp_chn; +k_mpp_chn vo_mpp_chn; + +k_video_frame_info dump_info; + +k_vo_draw_frame vo_frame = (k_vo_draw_frame) { + 1, + 16, + 16, + 128, + 128, + 1 +}; + +static k_vb_blk_handle block; +k_u32 g_pool_id; + +int vo_creat_layer_test(k_vo_layer chn_id, layer_info *info) +{ + k_vo_video_layer_attr attr; + + // check layer + if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) + || ((info->func != 0) && (chn_id == K_VO_LAYER2))) + { + printf("input layer num failed \n"); + return -1 ; + } + + // check scaler + + // set offset + attr.display_rect = info->offset; + // set act + attr.img_size = info->act_size; + // sget size + info->size = info->act_size.height * info->act_size.width * 3 / 2; + //set pixel format + attr.pixel_format = info->format; + if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) + { + printf("input pix format failed \n"); + return -1; + } + // set stride + attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); + // set function + attr.func = info->func; + // set scaler attr + attr.scaler_attr = info->attr; + + // set video layer atrr + kd_mpi_vo_set_video_layer_attr(chn_id, &attr); + + // enable layer + kd_mpi_vo_enable_video_layer(chn_id); + + return 0; +} + +k_vb_blk_handle vo_insert_frame(k_video_frame_info *vf_info, void **pic_vaddr) +{ + k_u64 phys_addr = 0; + k_u32 *virt_addr; + k_vb_blk_handle handle; + k_s32 size; + + if (vf_info == NULL) + return K_FALSE; + + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_8888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_8888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 4; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_565 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_565) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_4444 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_4444) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_1555 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_1555) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3 / 2; + + size = size + 4096; // 强制4K ,后边得删了 + + printf("vb block size is %x \n", size); + + handle = kd_mpi_vb_get_block(g_pool_id, size, NULL); + if (handle == VB_INVALID_HANDLE) + { + printf("%s get vb block error\n", __func__); + return K_FAILED; + } + + phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); + if (phys_addr == 0) + { + printf("%s get phys addr error\n", __func__); + return K_FAILED; + } + + virt_addr = (k_u32 *)kd_mpi_sys_mmap(phys_addr, size); + // virt_addr = (k_u32 *)kd_mpi_sys_mmap_cached(phys_addr, size); + + if (virt_addr == NULL) + { + printf("%s mmap error\n", __func__); + return K_FAILED; + } + + vf_info->mod_id = K_ID_VO; + vf_info->pool_id = g_pool_id; + vf_info->v_frame.phys_addr[0] = phys_addr; + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + vf_info->v_frame.phys_addr[1] = phys_addr + (vf_info->v_frame.height * vf_info->v_frame.stride[0]); + *pic_vaddr = virt_addr; + + printf("phys_addr is %lx g_pool_id is %d \n", phys_addr, g_pool_id); + + return handle; +} + +k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) +{ + k_vo_video_osd_attr attr; + + // set attr + attr.global_alptha = info->global_alptha; + + if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) + { + info->size = info->act_size.width * info->act_size.height * 4; + info->stride = info->act_size.width * 4 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) + { + info->size = info->act_size.width * info->act_size.height * 3; + info->stride = info->act_size.width * 3 / 8; + } + else if(info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if(info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else + { + printf("set osd pixel format failed \n"); + } + + attr.stride = info->stride; + attr.pixel_format = info->format; + attr.display_rect = info->offset; + attr.img_size = info->act_size; + kd_mpi_vo_set_video_osd_attr(osd, &attr); + + kd_mpi_vo_osd_enable(osd); + + return 0; +} + +void sample_vicap_install_osd(void) +{ + osd_info osd; + + osd.act_size.width = osd_width ; + osd.act_size.height = osd_height; + osd.offset.x = 0; + osd.offset.y = 0; + osd.global_alptha = 0xff; + // osd.global_alptha = 0x32; + osd.format = PIXEL_FORMAT_ARGB_8888;//PIXEL_FORMAT_ARGB_4444; //PIXEL_FORMAT_ARGB_1555;//PIXEL_FORMAT_ARGB_8888; + + vo_creat_osd_test(osd_id, &osd); +} + +void vo_osd_release_block(void) +{ + if(vicap_install_osd == 1) + { + kd_mpi_vo_osd_disable(osd_id); + kd_mpi_vb_release_block(block); + } + +} + +static k_s32 sample_connector_init(void) +{ + k_u32 ret = 0; + k_s32 connector_fd; +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#else + k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#endif + k_connector_info connector_info; + + memset(&connector_info, 0, sizeof(k_connector_info)); + + //connector get sensor info + ret = kd_mpi_get_connector_info(connector_type, &connector_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + + connector_fd = kd_mpi_connector_open(connector_info.connector_name); + if (connector_fd < 0) { + printf("%s, connector open failed.\n", __func__); + return K_ERR_VO_NOTREADY; + } + + // set connect power + kd_mpi_connector_power_set(connector_fd, K_TRUE); + // connector init + kd_mpi_connector_init(connector_fd, connector_info); + + return 0; +} + +static k_s32 vo_layer_vdss_bind_vo_config(void) +{ + layer_info info; + + k_vo_layer chn_id = K_VO_LAYER1; + + memset(&info, 0, sizeof(info)); + + sample_connector_init(); + + // config lyaer + info.act_size.width = ISP_CHN0_WIDTH;//ISP_CHN0_HEIGHT;//1080;//640;//1080; + info.act_size.height = ISP_CHN0_HEIGHT;//ISP_CHN0_WIDTH;//1920;//480;//1920; + info.format = PIXEL_FORMAT_YVU_PLANAR_420; + info.func = 0;//K_ROTATION_180;////K_ROTATION_90; + info.global_alptha = 0xff; + info.offset.x = 0;//(1080-w)/2, + info.offset.y = 0;//(1920-h)/2; + vo_creat_layer_test(chn_id, &info); + + if(vicap_install_osd == 1) + sample_vicap_install_osd(); + + //exit ; + return 0; +} + +static void sample_vicap_bind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) +{ + k_s32 ret; + + ret = kd_mpi_sys_bind(&vicap_mpp_chn, &vo_mpp_chn); + if (ret) { + printf("kd_mpi_sys_unbind failed:0x%x\n", ret); + } + + return; +} + +static void sample_vicap_unbind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) +{ + k_s32 ret; + + ret = kd_mpi_sys_unbind(&vicap_mpp_chn, &vo_mpp_chn); + if (ret) { + printf("kd_mpi_sys_unbind failed:0x%x\n", ret); + } + + return; +} + +int vivcap_start() +{ + k_s32 ret = 0; + + k_u32 pool_id; + k_vb_pool_config pool_config; + + printf("sample_vicap ...\n"); + +#if defined(CONFIG_BOARD_K230_CANMV) + sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; +#else + sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; +#endif + vicap_dev = VICAP_DEV_ID_0; + + memset(&config, 0, sizeof(config)); + config.max_pool_cnt = 64; + //VB for YUV420SP output + config.comm_pool[0].blk_cnt = 5; + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[0].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), VICAP_ALIGN_1K); + + //VB for RGB888 output + config.comm_pool[1].blk_cnt = 5; + config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[1].blk_size = VICAP_ALIGN_UP((SENSOR_HEIGHT * SENSOR_WIDTH * 3 ), VICAP_ALIGN_1K); + + ret = kd_mpi_vb_set_config(&config); + if (ret) { + printf("vb_set_config failed ret:%d\n", ret); + return ret; + } + + k_vb_supplement_config supplement_config; + memset(&supplement_config, 0, sizeof(supplement_config)); + supplement_config.supplement_config |= VB_SUPPLEMENT_JPEG_MASK; + + ret = kd_mpi_vb_set_supplement_config(&supplement_config); + if (ret) { + printf("vb_set_supplement_config failed ret:%d\n", ret); + return ret; + } + + ret = kd_mpi_vb_init(); + if (ret) { + printf("vb_init failed ret:%d\n", ret); + return ret; + } + printf("sample_vicap ...kd_mpi_vicap_get_sensor_info\n"); + + // dwc_dsi_init(); + vo_layer_vdss_bind_vo_config(); + + if(vicap_install_osd == 1) + { + memset(&pool_config, 0, sizeof(pool_config)); + pool_config.blk_size = VICAP_ALIGN_UP((osd_width * osd_height * 4 * 2), VICAP_ALIGN_1K); + pool_config.blk_cnt = 4; + pool_config.mode = VB_REMAP_MODE_NOCACHE; + pool_id = kd_mpi_vb_create_pool(&pool_config); // osd0 - 3 argb 320 x 240 + g_pool_id = pool_id; + + printf("--------aa--------------g_pool_id is %d pool_id is %d \n",g_pool_id, pool_id); + } + + memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); + ret = kd_mpi_vicap_get_sensor_info(sensor_type, &sensor_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + + memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); + dev_attr.acq_win.h_start = 0; + dev_attr.acq_win.v_start = 0; +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + dev_attr.acq_win.width = ISP_CHN0_WIDTH; + dev_attr.acq_win.height = ISP_CHN0_HEIGHT; +#else + dev_attr.acq_win.width = 2592;//SENSOR_HEIGHT; + dev_attr.acq_win.height = 1944;//SENSOR_WIDTH; +#endif + dev_attr.mode = VICAP_WORK_ONLINE_MODE; + + dev_attr.pipe_ctrl.data = 0xFFFFFFFF; + dev_attr.pipe_ctrl.bits.af_enable = 0; + dev_attr.pipe_ctrl.bits.ahdr_enable = 0; + + + dev_attr.cpature_frame = 0; + memcpy(&dev_attr.sensor_info, &sensor_info, sizeof(k_vicap_sensor_info)); + + ret = kd_mpi_vicap_set_dev_attr(vicap_dev, dev_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_dev_attr failed.\n"); + return ret; + } + + memset(&chn_attr, 0, sizeof(k_vicap_chn_attr)); + + //set chn0 output yuv420sp + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = ISP_CHN0_WIDTH; + chn_attr.out_win.height = ISP_CHN0_HEIGHT; + + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + chn_attr.crop_win = dev_attr.acq_win; +#else + // chn_attr.crop_win = dev_attr.acq_win; + chn_attr.crop_win.h_start = 768; + chn_attr.crop_win.v_start = 16; + chn_attr.crop_win.width = ISP_CHN0_WIDTH; + chn_attr.crop_win.height = ISP_CHN0_HEIGHT; +#endif + + chn_attr.scale_win = chn_attr.out_win; + chn_attr.crop_enable = K_FALSE; + chn_attr.scale_enable = K_FALSE; + // chn_attr.dw_enable = K_FALSE; + chn_attr.chn_enable = K_TRUE; + chn_attr.pix_format = PIXEL_FORMAT_YVU_PLANAR_420; + chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp + chn_attr.buffer_size = config.comm_pool[0].blk_size; + vicap_chn = VICAP_CHN_ID_0; + + printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); + ret = kd_mpi_vicap_set_chn_attr(vicap_dev, vicap_chn, chn_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); + return ret; + } + + //bind vicap chn 0 to vo + vicap_mpp_chn.mod_id = K_ID_VI; + vicap_mpp_chn.dev_id = vicap_dev; + vicap_mpp_chn.chn_id = vicap_chn; + + vo_mpp_chn.mod_id = K_ID_VO; + vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; + vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; + + sample_vicap_bind_vo(vicap_mpp_chn, vo_mpp_chn); + printf("sample_vicap ...dwc_dsi_init\n"); + + //set chn1 output rgb888p + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = SENSOR_WIDTH ; + chn_attr.out_win.height = SENSOR_HEIGHT; + // chn_attr.crop_win = dev_attr.acq_win; + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + chn_attr.crop_win = dev_attr.acq_win; +#else + chn_attr.crop_win.h_start = 768; + chn_attr.crop_win.v_start = 16; + chn_attr.crop_win.width = ISP_CHN0_WIDTH; + chn_attr.crop_win.height = ISP_CHN0_HEIGHT; +#endif + + chn_attr.scale_win = chn_attr.out_win; + chn_attr.crop_enable = K_FALSE; + chn_attr.scale_enable = K_FALSE; + // chn_attr.dw_enable = K_FALSE; + chn_attr.chn_enable = K_TRUE; + chn_attr.pix_format = PIXEL_FORMAT_BGR_888_PLANAR; + chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp + chn_attr.buffer_size = config.comm_pool[1].blk_size; + + printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); + ret = kd_mpi_vicap_set_chn_attr(vicap_dev, VICAP_CHN_ID_1, chn_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); + return ret; + } + + printf("sample_vicap ...kd_mpi_vicap_init\n"); + ret = kd_mpi_vicap_init(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + // goto err_exit; + } + + printf("sample_vicap ...kd_mpi_vicap_start_stream\n"); + ret = kd_mpi_vicap_start_stream(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + // goto err_exit; + } + + return ret; +} + +int vivcap_stop() +{ + printf("sample_vicap ...kd_mpi_vicap_stop_stream\n"); + int ret = kd_mpi_vicap_stop_stream(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + return ret; + } + + ret = kd_mpi_vicap_deinit(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_deinit failed.\n"); + return ret; + } + + kd_mpi_vo_disable_video_layer(K_VO_LAYER1); + + vicap_mpp_chn.mod_id = K_ID_VI; + vicap_mpp_chn.dev_id = vicap_dev; + vicap_mpp_chn.chn_id = vicap_chn; + + vo_mpp_chn.mod_id = K_ID_VO; + vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; + vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; + + sample_vicap_unbind_vo(vicap_mpp_chn, vo_mpp_chn); + + /*Allow one frame time for the VO to release the VB block*/ + k_u32 display_ms = 1000 / 33; + usleep(1000 * display_ms); + + ret = kd_mpi_vb_exit(); + if (ret) { + printf("sample_vicap, kd_mpi_vb_exit failed.\n"); + return ret; + } + + return 0; +} + +void yuv_rotate_90(char *des, char *src,int width,int height) +{ + int n = 0; + int hw = width>>1; + int hh = height>>1; + int size = width * height; + int hsize = size>>2; + + int pos = 0; + + for(int i = width-1;i >= 0;i--) + { + pos = 0; + for(int j= 0;j < height;j++) + { + des[n++]= src[pos+i]; + pos += width; + } + } + } \ No newline at end of file diff --git a/src/reference/ai_poc/pphumanseg/vi_vo.h b/src/reference/ai_poc/pphumanseg/vi_vo.h old mode 100755 new mode 100644 index e3d8bdba4..0a11a4d31 --- a/src/reference/ai_poc/pphumanseg/vi_vo.h +++ b/src/reference/ai_poc/pphumanseg/vi_vo.h @@ -1,627 +1,628 @@ -/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include -#include -#include - -#include "mpi_sys_api.h" - -/* vicap */ -#include -#include -#include -#include -#include - -#include "k_module.h" -#include "k_type.h" -#include "k_vb_comm.h" -#include "k_video_comm.h" -#include "k_sys_comm.h" -#include "mpi_vb_api.h" -#include "mpi_vicap_api.h" -#include "mpi_isp_api.h" -#include "mpi_sys_api.h" -#include "k_vo_comm.h" -#include "mpi_vo_api.h" - -#include "vo_test_case.h" - -#include "k_connector_comm.h" -#include "mpi_connector_api.h" -#include "k_autoconf_comm.h" - - -#if defined(CONFIG_BOARD_K230_CANMV) -#define SENSOR_CHANNEL (3) // isp通道数 -#define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 -#define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 -#define ISP_CHN0_WIDTH (1920)//(1920) -#define ISP_CHN0_HEIGHT (1080)//(1080) -#define vicap_install_osd (1) -#define osd_id K_VO_OSD3 -#define osd_width (1920) -#define osd_height (1080) -#else -#define SENSOR_CHANNEL (3) // isp通道数 -#define SENSOR_HEIGHT (1280) // isp高度,ai输入,竖屏 -#define SENSOR_WIDTH (720) // isp宽度,ai输入,竖屏 -#define ISP_CHN0_WIDTH (1088)//(1920) -#define ISP_CHN0_HEIGHT (1920)//(1080) -#define vicap_install_osd (1) -#define osd_id K_VO_OSD3 -#define osd_width (1080) -#define osd_height (1920) -#endif - - -k_vb_config config; -k_vicap_dev vicap_dev; -k_vicap_chn vicap_chn; -k_vicap_dev_attr dev_attr; -k_vicap_chn_attr chn_attr; -k_vicap_sensor_info sensor_info; -k_vicap_sensor_type sensor_type; -k_mpp_chn vicap_mpp_chn; -k_mpp_chn vo_mpp_chn; - -k_video_frame_info dump_info; - -k_vo_draw_frame vo_frame = (k_vo_draw_frame) { - 1, - 16, - 16, - 128, - 128, - 1 -}; - -static k_vb_blk_handle block; -k_u32 g_pool_id; - -int vo_creat_layer_test(k_vo_layer chn_id, layer_info *info) -{ - k_vo_video_layer_attr attr; - - // check layer - if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) - || ((info->func != 0) && (chn_id == K_VO_LAYER2))) - { - printf("input layer num failed \n"); - return -1 ; - } - - // check scaler - - // set offset - attr.display_rect = info->offset; - // set act - attr.img_size = info->act_size; - // sget size - info->size = info->act_size.height * info->act_size.width * 3 / 2; - //set pixel format - attr.pixel_format = info->format; - if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) - { - printf("input pix format failed \n"); - return -1; - } - // set stride - attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); - // set function - attr.func = info->func; - // set scaler attr - attr.scaler_attr = info->attr; - - // set video layer atrr - kd_mpi_vo_set_video_layer_attr(chn_id, &attr); - - // enable layer - kd_mpi_vo_enable_video_layer(chn_id); - - return 0; -} - -k_vb_blk_handle vo_insert_frame(k_video_frame_info *vf_info, void **pic_vaddr) -{ - k_u64 phys_addr = 0; - k_u32 *virt_addr; - k_vb_blk_handle handle; - k_s32 size; - - if (vf_info == NULL) - return K_FALSE; - - if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_8888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_8888) - size = vf_info->v_frame.height * vf_info->v_frame.width * 4; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_565 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_565) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_4444 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_4444) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_888) - size = vf_info->v_frame.height * vf_info->v_frame.width * 3; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_1555 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_1555) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) - size = vf_info->v_frame.height * vf_info->v_frame.width * 3 / 2; - - size = size + 4096; // 强制4K ,后边得删了 - - printf("vb block size is %x \n", size); - - handle = kd_mpi_vb_get_block(g_pool_id, size, NULL); - if (handle == VB_INVALID_HANDLE) - { - printf("%s get vb block error\n", __func__); - return K_FAILED; - } - - phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); - if (phys_addr == 0) - { - printf("%s get phys addr error\n", __func__); - return K_FAILED; - } - - virt_addr = (k_u32 *)kd_mpi_sys_mmap(phys_addr, size); - // virt_addr = (k_u32 *)kd_mpi_sys_mmap_cached(phys_addr, size); - - if (virt_addr == NULL) - { - printf("%s mmap error\n", __func__); - return K_FAILED; - } - - vf_info->mod_id = K_ID_VO; - vf_info->pool_id = g_pool_id; - vf_info->v_frame.phys_addr[0] = phys_addr; - if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) - vf_info->v_frame.phys_addr[1] = phys_addr + (vf_info->v_frame.height * vf_info->v_frame.stride[0]); - *pic_vaddr = virt_addr; - - printf("phys_addr is %lx g_pool_id is %d \n", phys_addr, g_pool_id); - - return handle; -} - -k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) -{ - k_vo_video_osd_attr attr; - - // set attr - attr.global_alptha = info->global_alptha; - - if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) - { - info->size = info->act_size.width * info->act_size.height * 4; - info->stride = info->act_size.width * 4 / 8; - } - else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) - { - info->size = info->act_size.width * info->act_size.height * 3; - info->stride = info->act_size.width * 3 / 8; - } - else if(info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else if(info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else - { - printf("set osd pixel format failed \n"); - } - - attr.stride = info->stride; - attr.pixel_format = info->format; - attr.display_rect = info->offset; - attr.img_size = info->act_size; - kd_mpi_vo_set_video_osd_attr(osd, &attr); - - kd_mpi_vo_osd_enable(osd); - - return 0; -} - -void sample_vicap_install_osd(void) -{ - osd_info osd; - - osd.act_size.width = osd_width ; - osd.act_size.height = osd_height; - osd.offset.x = 0; - osd.offset.y = 0; - osd.global_alptha = 0xff; - // osd.global_alptha = 0x32; - osd.format = PIXEL_FORMAT_ARGB_8888;//PIXEL_FORMAT_ARGB_4444; //PIXEL_FORMAT_ARGB_1555;//PIXEL_FORMAT_ARGB_8888; - - vo_creat_osd_test(osd_id, &osd); -} - -void vo_osd_release_block(void) -{ - if(vicap_install_osd == 1) - { - kd_mpi_vo_osd_disable(osd_id); - kd_mpi_vb_release_block(block); - } - -} - -static k_s32 sample_connector_init(void) -{ - k_u32 ret = 0; - k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) - k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; -#else - k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; -#endif - k_connector_info connector_info; - - memset(&connector_info, 0, sizeof(k_connector_info)); - - //connector get sensor info - ret = kd_mpi_get_connector_info(connector_type, &connector_info); - if (ret) { - printf("sample_vicap, the sensor type not supported!\n"); - return ret; - } - - connector_fd = kd_mpi_connector_open(connector_info.connector_name); - if (connector_fd < 0) { - printf("%s, connector open failed.\n", __func__); - return K_ERR_VO_NOTREADY; - } - - // set connect power - kd_mpi_connector_power_set(connector_fd, K_TRUE); - // connector init - kd_mpi_connector_init(connector_fd, connector_info); - - return 0; -} - -static k_s32 vo_layer_vdss_bind_vo_config(void) -{ - layer_info info; - - k_vo_layer chn_id = K_VO_LAYER1; - - memset(&info, 0, sizeof(info)); - - sample_connector_init(); - - // config lyaer - info.act_size.width = ISP_CHN0_WIDTH;//ISP_CHN0_HEIGHT;//1080;//640;//1080; - info.act_size.height = ISP_CHN0_HEIGHT;//ISP_CHN0_WIDTH;//1920;//480;//1920; - info.format = PIXEL_FORMAT_YVU_PLANAR_420; - info.func = 0;//K_ROTATION_180;////K_ROTATION_90; - info.global_alptha = 0xff; - info.offset.x = 0;//(1080-w)/2, - info.offset.y = 0;//(1920-h)/2; - vo_creat_layer_test(chn_id, &info); - - if(vicap_install_osd == 1) - sample_vicap_install_osd(); - - //exit ; - return 0; -} - -static void sample_vicap_bind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) -{ - k_s32 ret; - - ret = kd_mpi_sys_bind(&vicap_mpp_chn, &vo_mpp_chn); - if (ret) { - printf("kd_mpi_sys_unbind failed:0x%x\n", ret); - } - - return; -} - -static void sample_vicap_unbind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) -{ - k_s32 ret; - - ret = kd_mpi_sys_unbind(&vicap_mpp_chn, &vo_mpp_chn); - if (ret) { - printf("kd_mpi_sys_unbind failed:0x%x\n", ret); - } - - return; -} - -int vivcap_start() -{ - k_s32 ret = 0; - - k_u32 pool_id; - k_vb_pool_config pool_config; - - printf("sample_vicap ...\n"); - -#if defined(CONFIG_BOARD_K230_CANMV) - sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); -#else - sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; -#endif - vicap_dev = VICAP_DEV_ID_0; - - memset(&config, 0, sizeof(config)); - config.max_pool_cnt = 64; - //VB for YUV420SP output - config.comm_pool[0].blk_cnt = 5; - config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; - config.comm_pool[0].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), VICAP_ALIGN_1K); - - //VB for RGB888 output - config.comm_pool[1].blk_cnt = 5; - config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; - config.comm_pool[1].blk_size = VICAP_ALIGN_UP((SENSOR_HEIGHT * SENSOR_WIDTH * 3 ), VICAP_ALIGN_1K); - - ret = kd_mpi_vb_set_config(&config); - if (ret) { - printf("vb_set_config failed ret:%d\n", ret); - return ret; - } - - k_vb_supplement_config supplement_config; - memset(&supplement_config, 0, sizeof(supplement_config)); - supplement_config.supplement_config |= VB_SUPPLEMENT_JPEG_MASK; - - ret = kd_mpi_vb_set_supplement_config(&supplement_config); - if (ret) { - printf("vb_set_supplement_config failed ret:%d\n", ret); - return ret; - } - - ret = kd_mpi_vb_init(); - if (ret) { - printf("vb_init failed ret:%d\n", ret); - return ret; - } - printf("sample_vicap ...kd_mpi_vicap_get_sensor_info\n"); - - // dwc_dsi_init(); - vo_layer_vdss_bind_vo_config(); - - if(vicap_install_osd == 1) - { - memset(&pool_config, 0, sizeof(pool_config)); - pool_config.blk_size = VICAP_ALIGN_UP((osd_width * osd_height * 4 * 2), VICAP_ALIGN_1K); - pool_config.blk_cnt = 4; - pool_config.mode = VB_REMAP_MODE_NOCACHE; - pool_id = kd_mpi_vb_create_pool(&pool_config); // osd0 - 3 argb 320 x 240 - g_pool_id = pool_id; - - printf("--------aa--------------g_pool_id is %d pool_id is %d \n",g_pool_id, pool_id); - } - - memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); - ret = kd_mpi_vicap_get_sensor_info(sensor_type, &sensor_info); - if (ret) { - printf("sample_vicap, the sensor type not supported!\n"); - return ret; - } - - memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); - dev_attr.acq_win.h_start = 0; - dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) - dev_attr.acq_win.width = ISP_CHN0_WIDTH; - dev_attr.acq_win.height = ISP_CHN0_HEIGHT; -#else - dev_attr.acq_win.width = 2592;//SENSOR_HEIGHT; - dev_attr.acq_win.height = 1944;//SENSOR_WIDTH; -#endif - dev_attr.mode = VICAP_WORK_ONLINE_MODE; - - dev_attr.pipe_ctrl.data = 0xFFFFFFFF; - dev_attr.pipe_ctrl.bits.af_enable = 0; - dev_attr.pipe_ctrl.bits.ahdr_enable = 0; - - - dev_attr.cpature_frame = 0; - memcpy(&dev_attr.sensor_info, &sensor_info, sizeof(k_vicap_sensor_info)); - - ret = kd_mpi_vicap_set_dev_attr(vicap_dev, dev_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_dev_attr failed.\n"); - return ret; - } - - memset(&chn_attr, 0, sizeof(k_vicap_chn_attr)); - - //set chn0 output yuv420sp - chn_attr.out_win.h_start = 0; - chn_attr.out_win.v_start = 0; - chn_attr.out_win.width = ISP_CHN0_WIDTH; - chn_attr.out_win.height = ISP_CHN0_HEIGHT; - - -#if defined(CONFIG_BOARD_K230_CANMV) - chn_attr.crop_win = dev_attr.acq_win; -#else - // chn_attr.crop_win = dev_attr.acq_win; - chn_attr.crop_win.h_start = 768; - chn_attr.crop_win.v_start = 16; - chn_attr.crop_win.width = ISP_CHN0_WIDTH; - chn_attr.crop_win.height = ISP_CHN0_HEIGHT; -#endif - - chn_attr.scale_win = chn_attr.out_win; - chn_attr.crop_enable = K_FALSE; - chn_attr.scale_enable = K_FALSE; - // chn_attr.dw_enable = K_FALSE; - chn_attr.chn_enable = K_TRUE; - chn_attr.pix_format = PIXEL_FORMAT_YVU_PLANAR_420; - chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp - chn_attr.buffer_size = config.comm_pool[0].blk_size; - vicap_chn = VICAP_CHN_ID_0; - - printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); - ret = kd_mpi_vicap_set_chn_attr(vicap_dev, vicap_chn, chn_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); - return ret; - } - - //bind vicap chn 0 to vo - vicap_mpp_chn.mod_id = K_ID_VI; - vicap_mpp_chn.dev_id = vicap_dev; - vicap_mpp_chn.chn_id = vicap_chn; - - vo_mpp_chn.mod_id = K_ID_VO; - vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; - vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; - - sample_vicap_bind_vo(vicap_mpp_chn, vo_mpp_chn); - printf("sample_vicap ...dwc_dsi_init\n"); - - //set chn1 output rgb888p - chn_attr.out_win.h_start = 0; - chn_attr.out_win.v_start = 0; - chn_attr.out_win.width = SENSOR_WIDTH ; - chn_attr.out_win.height = SENSOR_HEIGHT; - // chn_attr.crop_win = dev_attr.acq_win; - -#if defined(CONFIG_BOARD_K230_CANMV) - chn_attr.crop_win = dev_attr.acq_win; -#else - chn_attr.crop_win.h_start = 768; - chn_attr.crop_win.v_start = 16; - chn_attr.crop_win.width = ISP_CHN0_WIDTH; - chn_attr.crop_win.height = ISP_CHN0_HEIGHT; -#endif - - chn_attr.scale_win = chn_attr.out_win; - chn_attr.crop_enable = K_FALSE; - chn_attr.scale_enable = K_FALSE; - // chn_attr.dw_enable = K_FALSE; - chn_attr.chn_enable = K_TRUE; - chn_attr.pix_format = PIXEL_FORMAT_BGR_888_PLANAR; - chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp - chn_attr.buffer_size = config.comm_pool[1].blk_size; - - printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); - ret = kd_mpi_vicap_set_chn_attr(vicap_dev, VICAP_CHN_ID_1, chn_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); - return ret; - } - - printf("sample_vicap ...kd_mpi_vicap_init\n"); - ret = kd_mpi_vicap_init(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - // goto err_exit; - } - - printf("sample_vicap ...kd_mpi_vicap_start_stream\n"); - ret = kd_mpi_vicap_start_stream(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - // goto err_exit; - } - - return ret; -} - -int vivcap_stop() -{ - printf("sample_vicap ...kd_mpi_vicap_stop_stream\n"); - int ret = kd_mpi_vicap_stop_stream(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - return ret; - } - - ret = kd_mpi_vicap_deinit(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_deinit failed.\n"); - return ret; - } - - kd_mpi_vo_disable_video_layer(K_VO_LAYER1); - - vicap_mpp_chn.mod_id = K_ID_VI; - vicap_mpp_chn.dev_id = vicap_dev; - vicap_mpp_chn.chn_id = vicap_chn; - - vo_mpp_chn.mod_id = K_ID_VO; - vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; - vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; - - sample_vicap_unbind_vo(vicap_mpp_chn, vo_mpp_chn); - - /*Allow one frame time for the VO to release the VB block*/ - k_u32 display_ms = 1000 / 33; - usleep(1000 * display_ms); - - ret = kd_mpi_vb_exit(); - if (ret) { - printf("sample_vicap, kd_mpi_vb_exit failed.\n"); - return ret; - } - - return 0; -} - -void yuv_rotate_90(char *des, char *src,int width,int height) -{ - int n = 0; - int hw = width>>1; - int hh = height>>1; - int size = width * height; - int hsize = size>>2; - - int pos = 0; - - for(int i = width-1;i >= 0;i--) - { - pos = 0; - for(int j= 0;j < height;j++) - { - des[n++]= src[pos+i]; - pos += width; - } - } - +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include + +#include "mpi_sys_api.h" + +/* vicap */ +#include +#include +#include +#include +#include + +#include "k_module.h" +#include "k_type.h" +#include "k_vb_comm.h" +#include "k_video_comm.h" +#include "k_sys_comm.h" +#include "mpi_vb_api.h" +#include "mpi_vicap_api.h" +#include "mpi_isp_api.h" +#include "mpi_sys_api.h" +#include "k_vo_comm.h" +#include "mpi_vo_api.h" + +#include "vo_test_case.h" + +#include "k_connector_comm.h" +#include "mpi_connector_api.h" +#include "k_autoconf_comm.h" + + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) +#define SENSOR_CHANNEL (3) // isp通道数 +#define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 +#define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 +#define ISP_CHN0_WIDTH (1920)//(1920) +#define ISP_CHN0_HEIGHT (1080)//(1080) +#define vicap_install_osd (1) +#define osd_id K_VO_OSD3 +#define osd_width (1920) +#define osd_height (1080) +#else +#define SENSOR_CHANNEL (3) // isp通道数 +#define SENSOR_HEIGHT (1280) // isp高度,ai输入,竖屏 +#define SENSOR_WIDTH (720) // isp宽度,ai输入,竖屏 +#define ISP_CHN0_WIDTH (1088)//(1920) +#define ISP_CHN0_HEIGHT (1920)//(1080) +#define vicap_install_osd (1) +#define osd_id K_VO_OSD3 +#define osd_width (1080) +#define osd_height (1920) +#endif + + +k_vb_config config; +k_vicap_dev vicap_dev; +k_vicap_chn vicap_chn; +k_vicap_dev_attr dev_attr; +k_vicap_chn_attr chn_attr; +k_vicap_sensor_info sensor_info; +k_vicap_sensor_type sensor_type; +k_mpp_chn vicap_mpp_chn; +k_mpp_chn vo_mpp_chn; + +k_video_frame_info dump_info; + +k_vo_draw_frame vo_frame = (k_vo_draw_frame) { + 1, + 16, + 16, + 128, + 128, + 1 +}; + +static k_vb_blk_handle block; +k_u32 g_pool_id; + +int vo_creat_layer_test(k_vo_layer chn_id, layer_info *info) +{ + k_vo_video_layer_attr attr; + + // check layer + if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) + || ((info->func != 0) && (chn_id == K_VO_LAYER2))) + { + printf("input layer num failed \n"); + return -1 ; + } + + // check scaler + + // set offset + attr.display_rect = info->offset; + // set act + attr.img_size = info->act_size; + // sget size + info->size = info->act_size.height * info->act_size.width * 3 / 2; + //set pixel format + attr.pixel_format = info->format; + if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) + { + printf("input pix format failed \n"); + return -1; + } + // set stride + attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); + // set function + attr.func = info->func; + // set scaler attr + attr.scaler_attr = info->attr; + + // set video layer atrr + kd_mpi_vo_set_video_layer_attr(chn_id, &attr); + + // enable layer + kd_mpi_vo_enable_video_layer(chn_id); + + return 0; +} + +k_vb_blk_handle vo_insert_frame(k_video_frame_info *vf_info, void **pic_vaddr) +{ + k_u64 phys_addr = 0; + k_u32 *virt_addr; + k_vb_blk_handle handle; + k_s32 size; + + if (vf_info == NULL) + return K_FALSE; + + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_8888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_8888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 4; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_565 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_565) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_4444 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_4444) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_1555 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_1555) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3 / 2; + + size = size + 4096; // 强制4K ,后边得删了 + + printf("vb block size is %x \n", size); + + handle = kd_mpi_vb_get_block(g_pool_id, size, NULL); + if (handle == VB_INVALID_HANDLE) + { + printf("%s get vb block error\n", __func__); + return K_FAILED; + } + + phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); + if (phys_addr == 0) + { + printf("%s get phys addr error\n", __func__); + return K_FAILED; + } + + virt_addr = (k_u32 *)kd_mpi_sys_mmap(phys_addr, size); + // virt_addr = (k_u32 *)kd_mpi_sys_mmap_cached(phys_addr, size); + + if (virt_addr == NULL) + { + printf("%s mmap error\n", __func__); + return K_FAILED; + } + + vf_info->mod_id = K_ID_VO; + vf_info->pool_id = g_pool_id; + vf_info->v_frame.phys_addr[0] = phys_addr; + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + vf_info->v_frame.phys_addr[1] = phys_addr + (vf_info->v_frame.height * vf_info->v_frame.stride[0]); + *pic_vaddr = virt_addr; + + printf("phys_addr is %lx g_pool_id is %d \n", phys_addr, g_pool_id); + + return handle; +} + +k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) +{ + k_vo_video_osd_attr attr; + + // set attr + attr.global_alptha = info->global_alptha; + + if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) + { + info->size = info->act_size.width * info->act_size.height * 4; + info->stride = info->act_size.width * 4 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) + { + info->size = info->act_size.width * info->act_size.height * 3; + info->stride = info->act_size.width * 3 / 8; + } + else if(info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if(info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else + { + printf("set osd pixel format failed \n"); + } + + attr.stride = info->stride; + attr.pixel_format = info->format; + attr.display_rect = info->offset; + attr.img_size = info->act_size; + kd_mpi_vo_set_video_osd_attr(osd, &attr); + + kd_mpi_vo_osd_enable(osd); + + return 0; +} + +void sample_vicap_install_osd(void) +{ + osd_info osd; + + osd.act_size.width = osd_width ; + osd.act_size.height = osd_height; + osd.offset.x = 0; + osd.offset.y = 0; + osd.global_alptha = 0xff; + // osd.global_alptha = 0x32; + osd.format = PIXEL_FORMAT_ARGB_8888;//PIXEL_FORMAT_ARGB_4444; //PIXEL_FORMAT_ARGB_1555;//PIXEL_FORMAT_ARGB_8888; + + vo_creat_osd_test(osd_id, &osd); +} + +void vo_osd_release_block(void) +{ + if(vicap_install_osd == 1) + { + kd_mpi_vo_osd_disable(osd_id); + kd_mpi_vb_release_block(block); + } + +} + +static k_s32 sample_connector_init(void) +{ + k_u32 ret = 0; + k_s32 connector_fd; +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#else + k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#endif + k_connector_info connector_info; + + memset(&connector_info, 0, sizeof(k_connector_info)); + + //connector get sensor info + ret = kd_mpi_get_connector_info(connector_type, &connector_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + + connector_fd = kd_mpi_connector_open(connector_info.connector_name); + if (connector_fd < 0) { + printf("%s, connector open failed.\n", __func__); + return K_ERR_VO_NOTREADY; + } + + // set connect power + kd_mpi_connector_power_set(connector_fd, K_TRUE); + // connector init + kd_mpi_connector_init(connector_fd, connector_info); + + return 0; +} + +static k_s32 vo_layer_vdss_bind_vo_config(void) +{ + layer_info info; + + k_vo_layer chn_id = K_VO_LAYER1; + + memset(&info, 0, sizeof(info)); + + sample_connector_init(); + + // config lyaer + info.act_size.width = ISP_CHN0_WIDTH;//ISP_CHN0_HEIGHT;//1080;//640;//1080; + info.act_size.height = ISP_CHN0_HEIGHT;//ISP_CHN0_WIDTH;//1920;//480;//1920; + info.format = PIXEL_FORMAT_YVU_PLANAR_420; + info.func = 0;//K_ROTATION_180;////K_ROTATION_90; + info.global_alptha = 0xff; + info.offset.x = 0;//(1080-w)/2, + info.offset.y = 0;//(1920-h)/2; + vo_creat_layer_test(chn_id, &info); + + if(vicap_install_osd == 1) + sample_vicap_install_osd(); + + //exit ; + return 0; +} + +static void sample_vicap_bind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) +{ + k_s32 ret; + + ret = kd_mpi_sys_bind(&vicap_mpp_chn, &vo_mpp_chn); + if (ret) { + printf("kd_mpi_sys_unbind failed:0x%x\n", ret); + } + + return; +} + +static void sample_vicap_unbind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) +{ + k_s32 ret; + + ret = kd_mpi_sys_unbind(&vicap_mpp_chn, &vo_mpp_chn); + if (ret) { + printf("kd_mpi_sys_unbind failed:0x%x\n", ret); + } + + return; +} + +int vivcap_start() +{ + k_s32 ret = 0; + + k_u32 pool_id; + k_vb_pool_config pool_config; + + printf("sample_vicap ...\n"); + +#if defined(CONFIG_BOARD_K230_CANMV) + sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; +#else + sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; +#endif + vicap_dev = VICAP_DEV_ID_0; + + memset(&config, 0, sizeof(config)); + config.max_pool_cnt = 64; + //VB for YUV420SP output + config.comm_pool[0].blk_cnt = 5; + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[0].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), VICAP_ALIGN_1K); + + //VB for RGB888 output + config.comm_pool[1].blk_cnt = 5; + config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[1].blk_size = VICAP_ALIGN_UP((SENSOR_HEIGHT * SENSOR_WIDTH * 3 ), VICAP_ALIGN_1K); + + ret = kd_mpi_vb_set_config(&config); + if (ret) { + printf("vb_set_config failed ret:%d\n", ret); + return ret; + } + + k_vb_supplement_config supplement_config; + memset(&supplement_config, 0, sizeof(supplement_config)); + supplement_config.supplement_config |= VB_SUPPLEMENT_JPEG_MASK; + + ret = kd_mpi_vb_set_supplement_config(&supplement_config); + if (ret) { + printf("vb_set_supplement_config failed ret:%d\n", ret); + return ret; + } + + ret = kd_mpi_vb_init(); + if (ret) { + printf("vb_init failed ret:%d\n", ret); + return ret; + } + printf("sample_vicap ...kd_mpi_vicap_get_sensor_info\n"); + + // dwc_dsi_init(); + vo_layer_vdss_bind_vo_config(); + + if(vicap_install_osd == 1) + { + memset(&pool_config, 0, sizeof(pool_config)); + pool_config.blk_size = VICAP_ALIGN_UP((osd_width * osd_height * 4 * 2), VICAP_ALIGN_1K); + pool_config.blk_cnt = 4; + pool_config.mode = VB_REMAP_MODE_NOCACHE; + pool_id = kd_mpi_vb_create_pool(&pool_config); // osd0 - 3 argb 320 x 240 + g_pool_id = pool_id; + + printf("--------aa--------------g_pool_id is %d pool_id is %d \n",g_pool_id, pool_id); + } + + memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); + ret = kd_mpi_vicap_get_sensor_info(sensor_type, &sensor_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + + memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); + dev_attr.acq_win.h_start = 0; + dev_attr.acq_win.v_start = 0; +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + dev_attr.acq_win.width = ISP_CHN0_WIDTH; + dev_attr.acq_win.height = ISP_CHN0_HEIGHT; +#else + dev_attr.acq_win.width = 2592;//SENSOR_HEIGHT; + dev_attr.acq_win.height = 1944;//SENSOR_WIDTH; +#endif + dev_attr.mode = VICAP_WORK_ONLINE_MODE; + + dev_attr.pipe_ctrl.data = 0xFFFFFFFF; + dev_attr.pipe_ctrl.bits.af_enable = 0; + dev_attr.pipe_ctrl.bits.ahdr_enable = 0; + + + dev_attr.cpature_frame = 0; + memcpy(&dev_attr.sensor_info, &sensor_info, sizeof(k_vicap_sensor_info)); + + ret = kd_mpi_vicap_set_dev_attr(vicap_dev, dev_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_dev_attr failed.\n"); + return ret; + } + + memset(&chn_attr, 0, sizeof(k_vicap_chn_attr)); + + //set chn0 output yuv420sp + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = ISP_CHN0_WIDTH; + chn_attr.out_win.height = ISP_CHN0_HEIGHT; + + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + chn_attr.crop_win = dev_attr.acq_win; +#else + // chn_attr.crop_win = dev_attr.acq_win; + chn_attr.crop_win.h_start = 768; + chn_attr.crop_win.v_start = 16; + chn_attr.crop_win.width = ISP_CHN0_WIDTH; + chn_attr.crop_win.height = ISP_CHN0_HEIGHT; +#endif + + chn_attr.scale_win = chn_attr.out_win; + chn_attr.crop_enable = K_FALSE; + chn_attr.scale_enable = K_FALSE; + // chn_attr.dw_enable = K_FALSE; + chn_attr.chn_enable = K_TRUE; + chn_attr.pix_format = PIXEL_FORMAT_YVU_PLANAR_420; + chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp + chn_attr.buffer_size = config.comm_pool[0].blk_size; + vicap_chn = VICAP_CHN_ID_0; + + printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); + ret = kd_mpi_vicap_set_chn_attr(vicap_dev, vicap_chn, chn_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); + return ret; + } + + //bind vicap chn 0 to vo + vicap_mpp_chn.mod_id = K_ID_VI; + vicap_mpp_chn.dev_id = vicap_dev; + vicap_mpp_chn.chn_id = vicap_chn; + + vo_mpp_chn.mod_id = K_ID_VO; + vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; + vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; + + sample_vicap_bind_vo(vicap_mpp_chn, vo_mpp_chn); + printf("sample_vicap ...dwc_dsi_init\n"); + + //set chn1 output rgb888p + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = SENSOR_WIDTH ; + chn_attr.out_win.height = SENSOR_HEIGHT; + // chn_attr.crop_win = dev_attr.acq_win; + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + chn_attr.crop_win = dev_attr.acq_win; +#else + chn_attr.crop_win.h_start = 768; + chn_attr.crop_win.v_start = 16; + chn_attr.crop_win.width = ISP_CHN0_WIDTH; + chn_attr.crop_win.height = ISP_CHN0_HEIGHT; +#endif + + chn_attr.scale_win = chn_attr.out_win; + chn_attr.crop_enable = K_FALSE; + chn_attr.scale_enable = K_FALSE; + // chn_attr.dw_enable = K_FALSE; + chn_attr.chn_enable = K_TRUE; + chn_attr.pix_format = PIXEL_FORMAT_BGR_888_PLANAR; + chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp + chn_attr.buffer_size = config.comm_pool[1].blk_size; + + printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); + ret = kd_mpi_vicap_set_chn_attr(vicap_dev, VICAP_CHN_ID_1, chn_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); + return ret; + } + + printf("sample_vicap ...kd_mpi_vicap_init\n"); + ret = kd_mpi_vicap_init(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + // goto err_exit; + } + + printf("sample_vicap ...kd_mpi_vicap_start_stream\n"); + ret = kd_mpi_vicap_start_stream(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + // goto err_exit; + } + + return ret; +} + +int vivcap_stop() +{ + printf("sample_vicap ...kd_mpi_vicap_stop_stream\n"); + int ret = kd_mpi_vicap_stop_stream(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + return ret; + } + + ret = kd_mpi_vicap_deinit(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_deinit failed.\n"); + return ret; + } + + kd_mpi_vo_disable_video_layer(K_VO_LAYER1); + + vicap_mpp_chn.mod_id = K_ID_VI; + vicap_mpp_chn.dev_id = vicap_dev; + vicap_mpp_chn.chn_id = vicap_chn; + + vo_mpp_chn.mod_id = K_ID_VO; + vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; + vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; + + sample_vicap_unbind_vo(vicap_mpp_chn, vo_mpp_chn); + + /*Allow one frame time for the VO to release the VB block*/ + k_u32 display_ms = 1000 / 33; + usleep(1000 * display_ms); + + ret = kd_mpi_vb_exit(); + if (ret) { + printf("sample_vicap, kd_mpi_vb_exit failed.\n"); + return ret; + } + + return 0; +} + +void yuv_rotate_90(char *des, char *src,int width,int height) +{ + int n = 0; + int hw = width>>1; + int hh = height>>1; + int size = width * height; + int hsize = size>>2; + + int pos = 0; + + for(int i = width-1;i >= 0;i--) + { + pos = 0; + for(int j= 0;j < height;j++) + { + des[n++]= src[pos+i]; + pos += width; + } + } + } \ No newline at end of file diff --git a/src/reference/ai_poc/puzzle_game/main.cc b/src/reference/ai_poc/puzzle_game/main.cc index a03bea89a..a9055b3d6 100644 --- a/src/reference/ai_poc/puzzle_game/main.cc +++ b/src/reference/ai_poc/puzzle_game/main.cc @@ -78,7 +78,7 @@ void video_proc(char *argv[]) int puzzle_height; int puzzle_ori_width; int puzzle_ori_height; - #if defined(CONFIG_BOARD_K230_CANMV) + #if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) puzzle_width = osd_height; puzzle_height = osd_height; puzzle_ori_width = osd_width-puzzle_height-5; @@ -140,7 +140,7 @@ void video_proc(char *argv[]) cv::Mat copy_ori_image_0 = osd_frame_tmp(cv::Rect(0,0,puzzle_width,puzzle_height)); image_puzzle_argb.copyTo(copy_ori_image_0); cv::Mat copy_ori_image_1; - #if defined(CONFIG_BOARD_K230_CANMV) + #if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) copy_ori_image_1 = osd_frame_tmp(cv::Rect(puzzle_width+2,(1080-puzzle_ori_height)/2,puzzle_ori_width,puzzle_ori_height)); image_puzzle_ori.copyTo(copy_ori_image_1); #else diff --git a/src/reference/ai_poc/puzzle_game/vi_vo.h b/src/reference/ai_poc/puzzle_game/vi_vo.h index f0c1bccc5..0a11a4d31 100644 --- a/src/reference/ai_poc/puzzle_game/vi_vo.h +++ b/src/reference/ai_poc/puzzle_game/vi_vo.h @@ -57,7 +57,7 @@ #include "k_autoconf_comm.h" -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) #define SENSOR_CHANNEL (3) // isp通道数 #define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 #define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 @@ -286,7 +286,7 @@ static k_s32 sample_connector_init(void) { k_u32 ret = 0; k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; #else k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; @@ -378,7 +378,8 @@ int vivcap_start() #if defined(CONFIG_BOARD_K230_CANMV) sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; #else sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; #endif @@ -444,7 +445,7 @@ int vivcap_start() memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); dev_attr.acq_win.h_start = 0; dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) dev_attr.acq_win.width = ISP_CHN0_WIDTH; dev_attr.acq_win.height = ISP_CHN0_HEIGHT; #else @@ -476,7 +477,7 @@ int vivcap_start() chn_attr.out_win.height = ISP_CHN0_HEIGHT; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else // chn_attr.crop_win = dev_attr.acq_win; @@ -522,7 +523,7 @@ int vivcap_start() chn_attr.out_win.height = SENSOR_HEIGHT; // chn_attr.crop_win = dev_attr.acq_win; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else chn_attr.crop_win.h_start = 768; diff --git a/src/reference/ai_poc/segment_yolov8n/vi_vo.h b/src/reference/ai_poc/segment_yolov8n/vi_vo.h index f0c1bccc5..0a11a4d31 100644 --- a/src/reference/ai_poc/segment_yolov8n/vi_vo.h +++ b/src/reference/ai_poc/segment_yolov8n/vi_vo.h @@ -57,7 +57,7 @@ #include "k_autoconf_comm.h" -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) #define SENSOR_CHANNEL (3) // isp通道数 #define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 #define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 @@ -286,7 +286,7 @@ static k_s32 sample_connector_init(void) { k_u32 ret = 0; k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; #else k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; @@ -378,7 +378,8 @@ int vivcap_start() #if defined(CONFIG_BOARD_K230_CANMV) sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; #else sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; #endif @@ -444,7 +445,7 @@ int vivcap_start() memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); dev_attr.acq_win.h_start = 0; dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) dev_attr.acq_win.width = ISP_CHN0_WIDTH; dev_attr.acq_win.height = ISP_CHN0_HEIGHT; #else @@ -476,7 +477,7 @@ int vivcap_start() chn_attr.out_win.height = ISP_CHN0_HEIGHT; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else // chn_attr.crop_win = dev_attr.acq_win; @@ -522,7 +523,7 @@ int vivcap_start() chn_attr.out_win.height = SENSOR_HEIGHT; // chn_attr.crop_win = dev_attr.acq_win; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else chn_attr.crop_win.h_start = 768; diff --git a/src/reference/ai_poc/self_learning/vi_vo.h b/src/reference/ai_poc/self_learning/vi_vo.h old mode 100755 new mode 100644 index e3d8bdba4..0a11a4d31 --- a/src/reference/ai_poc/self_learning/vi_vo.h +++ b/src/reference/ai_poc/self_learning/vi_vo.h @@ -1,627 +1,628 @@ -/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include -#include -#include - -#include "mpi_sys_api.h" - -/* vicap */ -#include -#include -#include -#include -#include - -#include "k_module.h" -#include "k_type.h" -#include "k_vb_comm.h" -#include "k_video_comm.h" -#include "k_sys_comm.h" -#include "mpi_vb_api.h" -#include "mpi_vicap_api.h" -#include "mpi_isp_api.h" -#include "mpi_sys_api.h" -#include "k_vo_comm.h" -#include "mpi_vo_api.h" - -#include "vo_test_case.h" - -#include "k_connector_comm.h" -#include "mpi_connector_api.h" -#include "k_autoconf_comm.h" - - -#if defined(CONFIG_BOARD_K230_CANMV) -#define SENSOR_CHANNEL (3) // isp通道数 -#define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 -#define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 -#define ISP_CHN0_WIDTH (1920)//(1920) -#define ISP_CHN0_HEIGHT (1080)//(1080) -#define vicap_install_osd (1) -#define osd_id K_VO_OSD3 -#define osd_width (1920) -#define osd_height (1080) -#else -#define SENSOR_CHANNEL (3) // isp通道数 -#define SENSOR_HEIGHT (1280) // isp高度,ai输入,竖屏 -#define SENSOR_WIDTH (720) // isp宽度,ai输入,竖屏 -#define ISP_CHN0_WIDTH (1088)//(1920) -#define ISP_CHN0_HEIGHT (1920)//(1080) -#define vicap_install_osd (1) -#define osd_id K_VO_OSD3 -#define osd_width (1080) -#define osd_height (1920) -#endif - - -k_vb_config config; -k_vicap_dev vicap_dev; -k_vicap_chn vicap_chn; -k_vicap_dev_attr dev_attr; -k_vicap_chn_attr chn_attr; -k_vicap_sensor_info sensor_info; -k_vicap_sensor_type sensor_type; -k_mpp_chn vicap_mpp_chn; -k_mpp_chn vo_mpp_chn; - -k_video_frame_info dump_info; - -k_vo_draw_frame vo_frame = (k_vo_draw_frame) { - 1, - 16, - 16, - 128, - 128, - 1 -}; - -static k_vb_blk_handle block; -k_u32 g_pool_id; - -int vo_creat_layer_test(k_vo_layer chn_id, layer_info *info) -{ - k_vo_video_layer_attr attr; - - // check layer - if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) - || ((info->func != 0) && (chn_id == K_VO_LAYER2))) - { - printf("input layer num failed \n"); - return -1 ; - } - - // check scaler - - // set offset - attr.display_rect = info->offset; - // set act - attr.img_size = info->act_size; - // sget size - info->size = info->act_size.height * info->act_size.width * 3 / 2; - //set pixel format - attr.pixel_format = info->format; - if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) - { - printf("input pix format failed \n"); - return -1; - } - // set stride - attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); - // set function - attr.func = info->func; - // set scaler attr - attr.scaler_attr = info->attr; - - // set video layer atrr - kd_mpi_vo_set_video_layer_attr(chn_id, &attr); - - // enable layer - kd_mpi_vo_enable_video_layer(chn_id); - - return 0; -} - -k_vb_blk_handle vo_insert_frame(k_video_frame_info *vf_info, void **pic_vaddr) -{ - k_u64 phys_addr = 0; - k_u32 *virt_addr; - k_vb_blk_handle handle; - k_s32 size; - - if (vf_info == NULL) - return K_FALSE; - - if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_8888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_8888) - size = vf_info->v_frame.height * vf_info->v_frame.width * 4; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_565 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_565) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_4444 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_4444) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_888) - size = vf_info->v_frame.height * vf_info->v_frame.width * 3; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_1555 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_1555) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) - size = vf_info->v_frame.height * vf_info->v_frame.width * 3 / 2; - - size = size + 4096; // 强制4K ,后边得删了 - - printf("vb block size is %x \n", size); - - handle = kd_mpi_vb_get_block(g_pool_id, size, NULL); - if (handle == VB_INVALID_HANDLE) - { - printf("%s get vb block error\n", __func__); - return K_FAILED; - } - - phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); - if (phys_addr == 0) - { - printf("%s get phys addr error\n", __func__); - return K_FAILED; - } - - virt_addr = (k_u32 *)kd_mpi_sys_mmap(phys_addr, size); - // virt_addr = (k_u32 *)kd_mpi_sys_mmap_cached(phys_addr, size); - - if (virt_addr == NULL) - { - printf("%s mmap error\n", __func__); - return K_FAILED; - } - - vf_info->mod_id = K_ID_VO; - vf_info->pool_id = g_pool_id; - vf_info->v_frame.phys_addr[0] = phys_addr; - if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) - vf_info->v_frame.phys_addr[1] = phys_addr + (vf_info->v_frame.height * vf_info->v_frame.stride[0]); - *pic_vaddr = virt_addr; - - printf("phys_addr is %lx g_pool_id is %d \n", phys_addr, g_pool_id); - - return handle; -} - -k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) -{ - k_vo_video_osd_attr attr; - - // set attr - attr.global_alptha = info->global_alptha; - - if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) - { - info->size = info->act_size.width * info->act_size.height * 4; - info->stride = info->act_size.width * 4 / 8; - } - else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) - { - info->size = info->act_size.width * info->act_size.height * 3; - info->stride = info->act_size.width * 3 / 8; - } - else if(info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else if(info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else - { - printf("set osd pixel format failed \n"); - } - - attr.stride = info->stride; - attr.pixel_format = info->format; - attr.display_rect = info->offset; - attr.img_size = info->act_size; - kd_mpi_vo_set_video_osd_attr(osd, &attr); - - kd_mpi_vo_osd_enable(osd); - - return 0; -} - -void sample_vicap_install_osd(void) -{ - osd_info osd; - - osd.act_size.width = osd_width ; - osd.act_size.height = osd_height; - osd.offset.x = 0; - osd.offset.y = 0; - osd.global_alptha = 0xff; - // osd.global_alptha = 0x32; - osd.format = PIXEL_FORMAT_ARGB_8888;//PIXEL_FORMAT_ARGB_4444; //PIXEL_FORMAT_ARGB_1555;//PIXEL_FORMAT_ARGB_8888; - - vo_creat_osd_test(osd_id, &osd); -} - -void vo_osd_release_block(void) -{ - if(vicap_install_osd == 1) - { - kd_mpi_vo_osd_disable(osd_id); - kd_mpi_vb_release_block(block); - } - -} - -static k_s32 sample_connector_init(void) -{ - k_u32 ret = 0; - k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) - k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; -#else - k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; -#endif - k_connector_info connector_info; - - memset(&connector_info, 0, sizeof(k_connector_info)); - - //connector get sensor info - ret = kd_mpi_get_connector_info(connector_type, &connector_info); - if (ret) { - printf("sample_vicap, the sensor type not supported!\n"); - return ret; - } - - connector_fd = kd_mpi_connector_open(connector_info.connector_name); - if (connector_fd < 0) { - printf("%s, connector open failed.\n", __func__); - return K_ERR_VO_NOTREADY; - } - - // set connect power - kd_mpi_connector_power_set(connector_fd, K_TRUE); - // connector init - kd_mpi_connector_init(connector_fd, connector_info); - - return 0; -} - -static k_s32 vo_layer_vdss_bind_vo_config(void) -{ - layer_info info; - - k_vo_layer chn_id = K_VO_LAYER1; - - memset(&info, 0, sizeof(info)); - - sample_connector_init(); - - // config lyaer - info.act_size.width = ISP_CHN0_WIDTH;//ISP_CHN0_HEIGHT;//1080;//640;//1080; - info.act_size.height = ISP_CHN0_HEIGHT;//ISP_CHN0_WIDTH;//1920;//480;//1920; - info.format = PIXEL_FORMAT_YVU_PLANAR_420; - info.func = 0;//K_ROTATION_180;////K_ROTATION_90; - info.global_alptha = 0xff; - info.offset.x = 0;//(1080-w)/2, - info.offset.y = 0;//(1920-h)/2; - vo_creat_layer_test(chn_id, &info); - - if(vicap_install_osd == 1) - sample_vicap_install_osd(); - - //exit ; - return 0; -} - -static void sample_vicap_bind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) -{ - k_s32 ret; - - ret = kd_mpi_sys_bind(&vicap_mpp_chn, &vo_mpp_chn); - if (ret) { - printf("kd_mpi_sys_unbind failed:0x%x\n", ret); - } - - return; -} - -static void sample_vicap_unbind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) -{ - k_s32 ret; - - ret = kd_mpi_sys_unbind(&vicap_mpp_chn, &vo_mpp_chn); - if (ret) { - printf("kd_mpi_sys_unbind failed:0x%x\n", ret); - } - - return; -} - -int vivcap_start() -{ - k_s32 ret = 0; - - k_u32 pool_id; - k_vb_pool_config pool_config; - - printf("sample_vicap ...\n"); - -#if defined(CONFIG_BOARD_K230_CANMV) - sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); -#else - sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; -#endif - vicap_dev = VICAP_DEV_ID_0; - - memset(&config, 0, sizeof(config)); - config.max_pool_cnt = 64; - //VB for YUV420SP output - config.comm_pool[0].blk_cnt = 5; - config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; - config.comm_pool[0].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), VICAP_ALIGN_1K); - - //VB for RGB888 output - config.comm_pool[1].blk_cnt = 5; - config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; - config.comm_pool[1].blk_size = VICAP_ALIGN_UP((SENSOR_HEIGHT * SENSOR_WIDTH * 3 ), VICAP_ALIGN_1K); - - ret = kd_mpi_vb_set_config(&config); - if (ret) { - printf("vb_set_config failed ret:%d\n", ret); - return ret; - } - - k_vb_supplement_config supplement_config; - memset(&supplement_config, 0, sizeof(supplement_config)); - supplement_config.supplement_config |= VB_SUPPLEMENT_JPEG_MASK; - - ret = kd_mpi_vb_set_supplement_config(&supplement_config); - if (ret) { - printf("vb_set_supplement_config failed ret:%d\n", ret); - return ret; - } - - ret = kd_mpi_vb_init(); - if (ret) { - printf("vb_init failed ret:%d\n", ret); - return ret; - } - printf("sample_vicap ...kd_mpi_vicap_get_sensor_info\n"); - - // dwc_dsi_init(); - vo_layer_vdss_bind_vo_config(); - - if(vicap_install_osd == 1) - { - memset(&pool_config, 0, sizeof(pool_config)); - pool_config.blk_size = VICAP_ALIGN_UP((osd_width * osd_height * 4 * 2), VICAP_ALIGN_1K); - pool_config.blk_cnt = 4; - pool_config.mode = VB_REMAP_MODE_NOCACHE; - pool_id = kd_mpi_vb_create_pool(&pool_config); // osd0 - 3 argb 320 x 240 - g_pool_id = pool_id; - - printf("--------aa--------------g_pool_id is %d pool_id is %d \n",g_pool_id, pool_id); - } - - memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); - ret = kd_mpi_vicap_get_sensor_info(sensor_type, &sensor_info); - if (ret) { - printf("sample_vicap, the sensor type not supported!\n"); - return ret; - } - - memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); - dev_attr.acq_win.h_start = 0; - dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) - dev_attr.acq_win.width = ISP_CHN0_WIDTH; - dev_attr.acq_win.height = ISP_CHN0_HEIGHT; -#else - dev_attr.acq_win.width = 2592;//SENSOR_HEIGHT; - dev_attr.acq_win.height = 1944;//SENSOR_WIDTH; -#endif - dev_attr.mode = VICAP_WORK_ONLINE_MODE; - - dev_attr.pipe_ctrl.data = 0xFFFFFFFF; - dev_attr.pipe_ctrl.bits.af_enable = 0; - dev_attr.pipe_ctrl.bits.ahdr_enable = 0; - - - dev_attr.cpature_frame = 0; - memcpy(&dev_attr.sensor_info, &sensor_info, sizeof(k_vicap_sensor_info)); - - ret = kd_mpi_vicap_set_dev_attr(vicap_dev, dev_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_dev_attr failed.\n"); - return ret; - } - - memset(&chn_attr, 0, sizeof(k_vicap_chn_attr)); - - //set chn0 output yuv420sp - chn_attr.out_win.h_start = 0; - chn_attr.out_win.v_start = 0; - chn_attr.out_win.width = ISP_CHN0_WIDTH; - chn_attr.out_win.height = ISP_CHN0_HEIGHT; - - -#if defined(CONFIG_BOARD_K230_CANMV) - chn_attr.crop_win = dev_attr.acq_win; -#else - // chn_attr.crop_win = dev_attr.acq_win; - chn_attr.crop_win.h_start = 768; - chn_attr.crop_win.v_start = 16; - chn_attr.crop_win.width = ISP_CHN0_WIDTH; - chn_attr.crop_win.height = ISP_CHN0_HEIGHT; -#endif - - chn_attr.scale_win = chn_attr.out_win; - chn_attr.crop_enable = K_FALSE; - chn_attr.scale_enable = K_FALSE; - // chn_attr.dw_enable = K_FALSE; - chn_attr.chn_enable = K_TRUE; - chn_attr.pix_format = PIXEL_FORMAT_YVU_PLANAR_420; - chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp - chn_attr.buffer_size = config.comm_pool[0].blk_size; - vicap_chn = VICAP_CHN_ID_0; - - printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); - ret = kd_mpi_vicap_set_chn_attr(vicap_dev, vicap_chn, chn_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); - return ret; - } - - //bind vicap chn 0 to vo - vicap_mpp_chn.mod_id = K_ID_VI; - vicap_mpp_chn.dev_id = vicap_dev; - vicap_mpp_chn.chn_id = vicap_chn; - - vo_mpp_chn.mod_id = K_ID_VO; - vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; - vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; - - sample_vicap_bind_vo(vicap_mpp_chn, vo_mpp_chn); - printf("sample_vicap ...dwc_dsi_init\n"); - - //set chn1 output rgb888p - chn_attr.out_win.h_start = 0; - chn_attr.out_win.v_start = 0; - chn_attr.out_win.width = SENSOR_WIDTH ; - chn_attr.out_win.height = SENSOR_HEIGHT; - // chn_attr.crop_win = dev_attr.acq_win; - -#if defined(CONFIG_BOARD_K230_CANMV) - chn_attr.crop_win = dev_attr.acq_win; -#else - chn_attr.crop_win.h_start = 768; - chn_attr.crop_win.v_start = 16; - chn_attr.crop_win.width = ISP_CHN0_WIDTH; - chn_attr.crop_win.height = ISP_CHN0_HEIGHT; -#endif - - chn_attr.scale_win = chn_attr.out_win; - chn_attr.crop_enable = K_FALSE; - chn_attr.scale_enable = K_FALSE; - // chn_attr.dw_enable = K_FALSE; - chn_attr.chn_enable = K_TRUE; - chn_attr.pix_format = PIXEL_FORMAT_BGR_888_PLANAR; - chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp - chn_attr.buffer_size = config.comm_pool[1].blk_size; - - printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); - ret = kd_mpi_vicap_set_chn_attr(vicap_dev, VICAP_CHN_ID_1, chn_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); - return ret; - } - - printf("sample_vicap ...kd_mpi_vicap_init\n"); - ret = kd_mpi_vicap_init(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - // goto err_exit; - } - - printf("sample_vicap ...kd_mpi_vicap_start_stream\n"); - ret = kd_mpi_vicap_start_stream(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - // goto err_exit; - } - - return ret; -} - -int vivcap_stop() -{ - printf("sample_vicap ...kd_mpi_vicap_stop_stream\n"); - int ret = kd_mpi_vicap_stop_stream(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - return ret; - } - - ret = kd_mpi_vicap_deinit(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_deinit failed.\n"); - return ret; - } - - kd_mpi_vo_disable_video_layer(K_VO_LAYER1); - - vicap_mpp_chn.mod_id = K_ID_VI; - vicap_mpp_chn.dev_id = vicap_dev; - vicap_mpp_chn.chn_id = vicap_chn; - - vo_mpp_chn.mod_id = K_ID_VO; - vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; - vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; - - sample_vicap_unbind_vo(vicap_mpp_chn, vo_mpp_chn); - - /*Allow one frame time for the VO to release the VB block*/ - k_u32 display_ms = 1000 / 33; - usleep(1000 * display_ms); - - ret = kd_mpi_vb_exit(); - if (ret) { - printf("sample_vicap, kd_mpi_vb_exit failed.\n"); - return ret; - } - - return 0; -} - -void yuv_rotate_90(char *des, char *src,int width,int height) -{ - int n = 0; - int hw = width>>1; - int hh = height>>1; - int size = width * height; - int hsize = size>>2; - - int pos = 0; - - for(int i = width-1;i >= 0;i--) - { - pos = 0; - for(int j= 0;j < height;j++) - { - des[n++]= src[pos+i]; - pos += width; - } - } - +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include + +#include "mpi_sys_api.h" + +/* vicap */ +#include +#include +#include +#include +#include + +#include "k_module.h" +#include "k_type.h" +#include "k_vb_comm.h" +#include "k_video_comm.h" +#include "k_sys_comm.h" +#include "mpi_vb_api.h" +#include "mpi_vicap_api.h" +#include "mpi_isp_api.h" +#include "mpi_sys_api.h" +#include "k_vo_comm.h" +#include "mpi_vo_api.h" + +#include "vo_test_case.h" + +#include "k_connector_comm.h" +#include "mpi_connector_api.h" +#include "k_autoconf_comm.h" + + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) +#define SENSOR_CHANNEL (3) // isp通道数 +#define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 +#define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 +#define ISP_CHN0_WIDTH (1920)//(1920) +#define ISP_CHN0_HEIGHT (1080)//(1080) +#define vicap_install_osd (1) +#define osd_id K_VO_OSD3 +#define osd_width (1920) +#define osd_height (1080) +#else +#define SENSOR_CHANNEL (3) // isp通道数 +#define SENSOR_HEIGHT (1280) // isp高度,ai输入,竖屏 +#define SENSOR_WIDTH (720) // isp宽度,ai输入,竖屏 +#define ISP_CHN0_WIDTH (1088)//(1920) +#define ISP_CHN0_HEIGHT (1920)//(1080) +#define vicap_install_osd (1) +#define osd_id K_VO_OSD3 +#define osd_width (1080) +#define osd_height (1920) +#endif + + +k_vb_config config; +k_vicap_dev vicap_dev; +k_vicap_chn vicap_chn; +k_vicap_dev_attr dev_attr; +k_vicap_chn_attr chn_attr; +k_vicap_sensor_info sensor_info; +k_vicap_sensor_type sensor_type; +k_mpp_chn vicap_mpp_chn; +k_mpp_chn vo_mpp_chn; + +k_video_frame_info dump_info; + +k_vo_draw_frame vo_frame = (k_vo_draw_frame) { + 1, + 16, + 16, + 128, + 128, + 1 +}; + +static k_vb_blk_handle block; +k_u32 g_pool_id; + +int vo_creat_layer_test(k_vo_layer chn_id, layer_info *info) +{ + k_vo_video_layer_attr attr; + + // check layer + if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) + || ((info->func != 0) && (chn_id == K_VO_LAYER2))) + { + printf("input layer num failed \n"); + return -1 ; + } + + // check scaler + + // set offset + attr.display_rect = info->offset; + // set act + attr.img_size = info->act_size; + // sget size + info->size = info->act_size.height * info->act_size.width * 3 / 2; + //set pixel format + attr.pixel_format = info->format; + if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) + { + printf("input pix format failed \n"); + return -1; + } + // set stride + attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); + // set function + attr.func = info->func; + // set scaler attr + attr.scaler_attr = info->attr; + + // set video layer atrr + kd_mpi_vo_set_video_layer_attr(chn_id, &attr); + + // enable layer + kd_mpi_vo_enable_video_layer(chn_id); + + return 0; +} + +k_vb_blk_handle vo_insert_frame(k_video_frame_info *vf_info, void **pic_vaddr) +{ + k_u64 phys_addr = 0; + k_u32 *virt_addr; + k_vb_blk_handle handle; + k_s32 size; + + if (vf_info == NULL) + return K_FALSE; + + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_8888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_8888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 4; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_565 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_565) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_4444 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_4444) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_1555 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_1555) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3 / 2; + + size = size + 4096; // 强制4K ,后边得删了 + + printf("vb block size is %x \n", size); + + handle = kd_mpi_vb_get_block(g_pool_id, size, NULL); + if (handle == VB_INVALID_HANDLE) + { + printf("%s get vb block error\n", __func__); + return K_FAILED; + } + + phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); + if (phys_addr == 0) + { + printf("%s get phys addr error\n", __func__); + return K_FAILED; + } + + virt_addr = (k_u32 *)kd_mpi_sys_mmap(phys_addr, size); + // virt_addr = (k_u32 *)kd_mpi_sys_mmap_cached(phys_addr, size); + + if (virt_addr == NULL) + { + printf("%s mmap error\n", __func__); + return K_FAILED; + } + + vf_info->mod_id = K_ID_VO; + vf_info->pool_id = g_pool_id; + vf_info->v_frame.phys_addr[0] = phys_addr; + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + vf_info->v_frame.phys_addr[1] = phys_addr + (vf_info->v_frame.height * vf_info->v_frame.stride[0]); + *pic_vaddr = virt_addr; + + printf("phys_addr is %lx g_pool_id is %d \n", phys_addr, g_pool_id); + + return handle; +} + +k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) +{ + k_vo_video_osd_attr attr; + + // set attr + attr.global_alptha = info->global_alptha; + + if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) + { + info->size = info->act_size.width * info->act_size.height * 4; + info->stride = info->act_size.width * 4 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) + { + info->size = info->act_size.width * info->act_size.height * 3; + info->stride = info->act_size.width * 3 / 8; + } + else if(info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if(info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else + { + printf("set osd pixel format failed \n"); + } + + attr.stride = info->stride; + attr.pixel_format = info->format; + attr.display_rect = info->offset; + attr.img_size = info->act_size; + kd_mpi_vo_set_video_osd_attr(osd, &attr); + + kd_mpi_vo_osd_enable(osd); + + return 0; +} + +void sample_vicap_install_osd(void) +{ + osd_info osd; + + osd.act_size.width = osd_width ; + osd.act_size.height = osd_height; + osd.offset.x = 0; + osd.offset.y = 0; + osd.global_alptha = 0xff; + // osd.global_alptha = 0x32; + osd.format = PIXEL_FORMAT_ARGB_8888;//PIXEL_FORMAT_ARGB_4444; //PIXEL_FORMAT_ARGB_1555;//PIXEL_FORMAT_ARGB_8888; + + vo_creat_osd_test(osd_id, &osd); +} + +void vo_osd_release_block(void) +{ + if(vicap_install_osd == 1) + { + kd_mpi_vo_osd_disable(osd_id); + kd_mpi_vb_release_block(block); + } + +} + +static k_s32 sample_connector_init(void) +{ + k_u32 ret = 0; + k_s32 connector_fd; +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#else + k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#endif + k_connector_info connector_info; + + memset(&connector_info, 0, sizeof(k_connector_info)); + + //connector get sensor info + ret = kd_mpi_get_connector_info(connector_type, &connector_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + + connector_fd = kd_mpi_connector_open(connector_info.connector_name); + if (connector_fd < 0) { + printf("%s, connector open failed.\n", __func__); + return K_ERR_VO_NOTREADY; + } + + // set connect power + kd_mpi_connector_power_set(connector_fd, K_TRUE); + // connector init + kd_mpi_connector_init(connector_fd, connector_info); + + return 0; +} + +static k_s32 vo_layer_vdss_bind_vo_config(void) +{ + layer_info info; + + k_vo_layer chn_id = K_VO_LAYER1; + + memset(&info, 0, sizeof(info)); + + sample_connector_init(); + + // config lyaer + info.act_size.width = ISP_CHN0_WIDTH;//ISP_CHN0_HEIGHT;//1080;//640;//1080; + info.act_size.height = ISP_CHN0_HEIGHT;//ISP_CHN0_WIDTH;//1920;//480;//1920; + info.format = PIXEL_FORMAT_YVU_PLANAR_420; + info.func = 0;//K_ROTATION_180;////K_ROTATION_90; + info.global_alptha = 0xff; + info.offset.x = 0;//(1080-w)/2, + info.offset.y = 0;//(1920-h)/2; + vo_creat_layer_test(chn_id, &info); + + if(vicap_install_osd == 1) + sample_vicap_install_osd(); + + //exit ; + return 0; +} + +static void sample_vicap_bind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) +{ + k_s32 ret; + + ret = kd_mpi_sys_bind(&vicap_mpp_chn, &vo_mpp_chn); + if (ret) { + printf("kd_mpi_sys_unbind failed:0x%x\n", ret); + } + + return; +} + +static void sample_vicap_unbind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) +{ + k_s32 ret; + + ret = kd_mpi_sys_unbind(&vicap_mpp_chn, &vo_mpp_chn); + if (ret) { + printf("kd_mpi_sys_unbind failed:0x%x\n", ret); + } + + return; +} + +int vivcap_start() +{ + k_s32 ret = 0; + + k_u32 pool_id; + k_vb_pool_config pool_config; + + printf("sample_vicap ...\n"); + +#if defined(CONFIG_BOARD_K230_CANMV) + sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; +#else + sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; +#endif + vicap_dev = VICAP_DEV_ID_0; + + memset(&config, 0, sizeof(config)); + config.max_pool_cnt = 64; + //VB for YUV420SP output + config.comm_pool[0].blk_cnt = 5; + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[0].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), VICAP_ALIGN_1K); + + //VB for RGB888 output + config.comm_pool[1].blk_cnt = 5; + config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[1].blk_size = VICAP_ALIGN_UP((SENSOR_HEIGHT * SENSOR_WIDTH * 3 ), VICAP_ALIGN_1K); + + ret = kd_mpi_vb_set_config(&config); + if (ret) { + printf("vb_set_config failed ret:%d\n", ret); + return ret; + } + + k_vb_supplement_config supplement_config; + memset(&supplement_config, 0, sizeof(supplement_config)); + supplement_config.supplement_config |= VB_SUPPLEMENT_JPEG_MASK; + + ret = kd_mpi_vb_set_supplement_config(&supplement_config); + if (ret) { + printf("vb_set_supplement_config failed ret:%d\n", ret); + return ret; + } + + ret = kd_mpi_vb_init(); + if (ret) { + printf("vb_init failed ret:%d\n", ret); + return ret; + } + printf("sample_vicap ...kd_mpi_vicap_get_sensor_info\n"); + + // dwc_dsi_init(); + vo_layer_vdss_bind_vo_config(); + + if(vicap_install_osd == 1) + { + memset(&pool_config, 0, sizeof(pool_config)); + pool_config.blk_size = VICAP_ALIGN_UP((osd_width * osd_height * 4 * 2), VICAP_ALIGN_1K); + pool_config.blk_cnt = 4; + pool_config.mode = VB_REMAP_MODE_NOCACHE; + pool_id = kd_mpi_vb_create_pool(&pool_config); // osd0 - 3 argb 320 x 240 + g_pool_id = pool_id; + + printf("--------aa--------------g_pool_id is %d pool_id is %d \n",g_pool_id, pool_id); + } + + memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); + ret = kd_mpi_vicap_get_sensor_info(sensor_type, &sensor_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + + memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); + dev_attr.acq_win.h_start = 0; + dev_attr.acq_win.v_start = 0; +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + dev_attr.acq_win.width = ISP_CHN0_WIDTH; + dev_attr.acq_win.height = ISP_CHN0_HEIGHT; +#else + dev_attr.acq_win.width = 2592;//SENSOR_HEIGHT; + dev_attr.acq_win.height = 1944;//SENSOR_WIDTH; +#endif + dev_attr.mode = VICAP_WORK_ONLINE_MODE; + + dev_attr.pipe_ctrl.data = 0xFFFFFFFF; + dev_attr.pipe_ctrl.bits.af_enable = 0; + dev_attr.pipe_ctrl.bits.ahdr_enable = 0; + + + dev_attr.cpature_frame = 0; + memcpy(&dev_attr.sensor_info, &sensor_info, sizeof(k_vicap_sensor_info)); + + ret = kd_mpi_vicap_set_dev_attr(vicap_dev, dev_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_dev_attr failed.\n"); + return ret; + } + + memset(&chn_attr, 0, sizeof(k_vicap_chn_attr)); + + //set chn0 output yuv420sp + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = ISP_CHN0_WIDTH; + chn_attr.out_win.height = ISP_CHN0_HEIGHT; + + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + chn_attr.crop_win = dev_attr.acq_win; +#else + // chn_attr.crop_win = dev_attr.acq_win; + chn_attr.crop_win.h_start = 768; + chn_attr.crop_win.v_start = 16; + chn_attr.crop_win.width = ISP_CHN0_WIDTH; + chn_attr.crop_win.height = ISP_CHN0_HEIGHT; +#endif + + chn_attr.scale_win = chn_attr.out_win; + chn_attr.crop_enable = K_FALSE; + chn_attr.scale_enable = K_FALSE; + // chn_attr.dw_enable = K_FALSE; + chn_attr.chn_enable = K_TRUE; + chn_attr.pix_format = PIXEL_FORMAT_YVU_PLANAR_420; + chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp + chn_attr.buffer_size = config.comm_pool[0].blk_size; + vicap_chn = VICAP_CHN_ID_0; + + printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); + ret = kd_mpi_vicap_set_chn_attr(vicap_dev, vicap_chn, chn_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); + return ret; + } + + //bind vicap chn 0 to vo + vicap_mpp_chn.mod_id = K_ID_VI; + vicap_mpp_chn.dev_id = vicap_dev; + vicap_mpp_chn.chn_id = vicap_chn; + + vo_mpp_chn.mod_id = K_ID_VO; + vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; + vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; + + sample_vicap_bind_vo(vicap_mpp_chn, vo_mpp_chn); + printf("sample_vicap ...dwc_dsi_init\n"); + + //set chn1 output rgb888p + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = SENSOR_WIDTH ; + chn_attr.out_win.height = SENSOR_HEIGHT; + // chn_attr.crop_win = dev_attr.acq_win; + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + chn_attr.crop_win = dev_attr.acq_win; +#else + chn_attr.crop_win.h_start = 768; + chn_attr.crop_win.v_start = 16; + chn_attr.crop_win.width = ISP_CHN0_WIDTH; + chn_attr.crop_win.height = ISP_CHN0_HEIGHT; +#endif + + chn_attr.scale_win = chn_attr.out_win; + chn_attr.crop_enable = K_FALSE; + chn_attr.scale_enable = K_FALSE; + // chn_attr.dw_enable = K_FALSE; + chn_attr.chn_enable = K_TRUE; + chn_attr.pix_format = PIXEL_FORMAT_BGR_888_PLANAR; + chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp + chn_attr.buffer_size = config.comm_pool[1].blk_size; + + printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); + ret = kd_mpi_vicap_set_chn_attr(vicap_dev, VICAP_CHN_ID_1, chn_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); + return ret; + } + + printf("sample_vicap ...kd_mpi_vicap_init\n"); + ret = kd_mpi_vicap_init(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + // goto err_exit; + } + + printf("sample_vicap ...kd_mpi_vicap_start_stream\n"); + ret = kd_mpi_vicap_start_stream(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + // goto err_exit; + } + + return ret; +} + +int vivcap_stop() +{ + printf("sample_vicap ...kd_mpi_vicap_stop_stream\n"); + int ret = kd_mpi_vicap_stop_stream(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + return ret; + } + + ret = kd_mpi_vicap_deinit(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_deinit failed.\n"); + return ret; + } + + kd_mpi_vo_disable_video_layer(K_VO_LAYER1); + + vicap_mpp_chn.mod_id = K_ID_VI; + vicap_mpp_chn.dev_id = vicap_dev; + vicap_mpp_chn.chn_id = vicap_chn; + + vo_mpp_chn.mod_id = K_ID_VO; + vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; + vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; + + sample_vicap_unbind_vo(vicap_mpp_chn, vo_mpp_chn); + + /*Allow one frame time for the VO to release the VB block*/ + k_u32 display_ms = 1000 / 33; + usleep(1000 * display_ms); + + ret = kd_mpi_vb_exit(); + if (ret) { + printf("sample_vicap, kd_mpi_vb_exit failed.\n"); + return ret; + } + + return 0; +} + +void yuv_rotate_90(char *des, char *src,int width,int height) +{ + int n = 0; + int hw = width>>1; + int hh = height>>1; + int size = width * height; + int hsize = size>>2; + + int pos = 0; + + for(int i = width-1;i >= 0;i--) + { + pos = 0; + for(int j= 0;j < height;j++) + { + des[n++]= src[pos+i]; + pos += width; + } + } + } \ No newline at end of file diff --git a/src/reference/ai_poc/shell/enc.sh b/src/reference/ai_poc/shell/enc.sh index 92b72fec8..40bb4683c 100644 --- a/src/reference/ai_poc/shell/enc.sh +++ b/src/reference/ai_poc/shell/enc.sh @@ -1 +1 @@ -./enc.elf 0 -sensor 24 -o test.h265 \ No newline at end of file +./enc.elf 0 -o test.h265 \ No newline at end of file diff --git a/src/reference/ai_poc/shell/rtsp_plug_big.sh b/src/reference/ai_poc/shell/rtsp_plug_big.sh new file mode 100644 index 000000000..03d5e84dc --- /dev/null +++ b/src/reference/ai_poc/shell/rtsp_plug_big.sh @@ -0,0 +1 @@ +./pose_det_enc.elf yolov8n-pose.kmodel 0.3 0.45 0 \ No newline at end of file diff --git a/src/reference/ai_poc/shell/rtsp_plug_little.sh b/src/reference/ai_poc/shell/rtsp_plug_little.sh new file mode 100644 index 000000000..bfdb0a355 --- /dev/null +++ b/src/reference/ai_poc/shell/rtsp_plug_little.sh @@ -0,0 +1 @@ +./rtspServer -p 1628c000 -t h265 \ No newline at end of file diff --git a/src/reference/ai_poc/smoke_detect/vi_vo.h b/src/reference/ai_poc/smoke_detect/vi_vo.h index e3d8bdba4..0a11a4d31 100644 --- a/src/reference/ai_poc/smoke_detect/vi_vo.h +++ b/src/reference/ai_poc/smoke_detect/vi_vo.h @@ -1,627 +1,628 @@ -/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include -#include -#include - -#include "mpi_sys_api.h" - -/* vicap */ -#include -#include -#include -#include -#include - -#include "k_module.h" -#include "k_type.h" -#include "k_vb_comm.h" -#include "k_video_comm.h" -#include "k_sys_comm.h" -#include "mpi_vb_api.h" -#include "mpi_vicap_api.h" -#include "mpi_isp_api.h" -#include "mpi_sys_api.h" -#include "k_vo_comm.h" -#include "mpi_vo_api.h" - -#include "vo_test_case.h" - -#include "k_connector_comm.h" -#include "mpi_connector_api.h" -#include "k_autoconf_comm.h" - - -#if defined(CONFIG_BOARD_K230_CANMV) -#define SENSOR_CHANNEL (3) // isp通道数 -#define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 -#define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 -#define ISP_CHN0_WIDTH (1920)//(1920) -#define ISP_CHN0_HEIGHT (1080)//(1080) -#define vicap_install_osd (1) -#define osd_id K_VO_OSD3 -#define osd_width (1920) -#define osd_height (1080) -#else -#define SENSOR_CHANNEL (3) // isp通道数 -#define SENSOR_HEIGHT (1280) // isp高度,ai输入,竖屏 -#define SENSOR_WIDTH (720) // isp宽度,ai输入,竖屏 -#define ISP_CHN0_WIDTH (1088)//(1920) -#define ISP_CHN0_HEIGHT (1920)//(1080) -#define vicap_install_osd (1) -#define osd_id K_VO_OSD3 -#define osd_width (1080) -#define osd_height (1920) -#endif - - -k_vb_config config; -k_vicap_dev vicap_dev; -k_vicap_chn vicap_chn; -k_vicap_dev_attr dev_attr; -k_vicap_chn_attr chn_attr; -k_vicap_sensor_info sensor_info; -k_vicap_sensor_type sensor_type; -k_mpp_chn vicap_mpp_chn; -k_mpp_chn vo_mpp_chn; - -k_video_frame_info dump_info; - -k_vo_draw_frame vo_frame = (k_vo_draw_frame) { - 1, - 16, - 16, - 128, - 128, - 1 -}; - -static k_vb_blk_handle block; -k_u32 g_pool_id; - -int vo_creat_layer_test(k_vo_layer chn_id, layer_info *info) -{ - k_vo_video_layer_attr attr; - - // check layer - if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) - || ((info->func != 0) && (chn_id == K_VO_LAYER2))) - { - printf("input layer num failed \n"); - return -1 ; - } - - // check scaler - - // set offset - attr.display_rect = info->offset; - // set act - attr.img_size = info->act_size; - // sget size - info->size = info->act_size.height * info->act_size.width * 3 / 2; - //set pixel format - attr.pixel_format = info->format; - if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) - { - printf("input pix format failed \n"); - return -1; - } - // set stride - attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); - // set function - attr.func = info->func; - // set scaler attr - attr.scaler_attr = info->attr; - - // set video layer atrr - kd_mpi_vo_set_video_layer_attr(chn_id, &attr); - - // enable layer - kd_mpi_vo_enable_video_layer(chn_id); - - return 0; -} - -k_vb_blk_handle vo_insert_frame(k_video_frame_info *vf_info, void **pic_vaddr) -{ - k_u64 phys_addr = 0; - k_u32 *virt_addr; - k_vb_blk_handle handle; - k_s32 size; - - if (vf_info == NULL) - return K_FALSE; - - if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_8888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_8888) - size = vf_info->v_frame.height * vf_info->v_frame.width * 4; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_565 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_565) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_4444 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_4444) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_888) - size = vf_info->v_frame.height * vf_info->v_frame.width * 3; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_1555 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_1555) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) - size = vf_info->v_frame.height * vf_info->v_frame.width * 3 / 2; - - size = size + 4096; // 强制4K ,后边得删了 - - printf("vb block size is %x \n", size); - - handle = kd_mpi_vb_get_block(g_pool_id, size, NULL); - if (handle == VB_INVALID_HANDLE) - { - printf("%s get vb block error\n", __func__); - return K_FAILED; - } - - phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); - if (phys_addr == 0) - { - printf("%s get phys addr error\n", __func__); - return K_FAILED; - } - - virt_addr = (k_u32 *)kd_mpi_sys_mmap(phys_addr, size); - // virt_addr = (k_u32 *)kd_mpi_sys_mmap_cached(phys_addr, size); - - if (virt_addr == NULL) - { - printf("%s mmap error\n", __func__); - return K_FAILED; - } - - vf_info->mod_id = K_ID_VO; - vf_info->pool_id = g_pool_id; - vf_info->v_frame.phys_addr[0] = phys_addr; - if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) - vf_info->v_frame.phys_addr[1] = phys_addr + (vf_info->v_frame.height * vf_info->v_frame.stride[0]); - *pic_vaddr = virt_addr; - - printf("phys_addr is %lx g_pool_id is %d \n", phys_addr, g_pool_id); - - return handle; -} - -k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) -{ - k_vo_video_osd_attr attr; - - // set attr - attr.global_alptha = info->global_alptha; - - if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) - { - info->size = info->act_size.width * info->act_size.height * 4; - info->stride = info->act_size.width * 4 / 8; - } - else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) - { - info->size = info->act_size.width * info->act_size.height * 3; - info->stride = info->act_size.width * 3 / 8; - } - else if(info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else if(info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else - { - printf("set osd pixel format failed \n"); - } - - attr.stride = info->stride; - attr.pixel_format = info->format; - attr.display_rect = info->offset; - attr.img_size = info->act_size; - kd_mpi_vo_set_video_osd_attr(osd, &attr); - - kd_mpi_vo_osd_enable(osd); - - return 0; -} - -void sample_vicap_install_osd(void) -{ - osd_info osd; - - osd.act_size.width = osd_width ; - osd.act_size.height = osd_height; - osd.offset.x = 0; - osd.offset.y = 0; - osd.global_alptha = 0xff; - // osd.global_alptha = 0x32; - osd.format = PIXEL_FORMAT_ARGB_8888;//PIXEL_FORMAT_ARGB_4444; //PIXEL_FORMAT_ARGB_1555;//PIXEL_FORMAT_ARGB_8888; - - vo_creat_osd_test(osd_id, &osd); -} - -void vo_osd_release_block(void) -{ - if(vicap_install_osd == 1) - { - kd_mpi_vo_osd_disable(osd_id); - kd_mpi_vb_release_block(block); - } - -} - -static k_s32 sample_connector_init(void) -{ - k_u32 ret = 0; - k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) - k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; -#else - k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; -#endif - k_connector_info connector_info; - - memset(&connector_info, 0, sizeof(k_connector_info)); - - //connector get sensor info - ret = kd_mpi_get_connector_info(connector_type, &connector_info); - if (ret) { - printf("sample_vicap, the sensor type not supported!\n"); - return ret; - } - - connector_fd = kd_mpi_connector_open(connector_info.connector_name); - if (connector_fd < 0) { - printf("%s, connector open failed.\n", __func__); - return K_ERR_VO_NOTREADY; - } - - // set connect power - kd_mpi_connector_power_set(connector_fd, K_TRUE); - // connector init - kd_mpi_connector_init(connector_fd, connector_info); - - return 0; -} - -static k_s32 vo_layer_vdss_bind_vo_config(void) -{ - layer_info info; - - k_vo_layer chn_id = K_VO_LAYER1; - - memset(&info, 0, sizeof(info)); - - sample_connector_init(); - - // config lyaer - info.act_size.width = ISP_CHN0_WIDTH;//ISP_CHN0_HEIGHT;//1080;//640;//1080; - info.act_size.height = ISP_CHN0_HEIGHT;//ISP_CHN0_WIDTH;//1920;//480;//1920; - info.format = PIXEL_FORMAT_YVU_PLANAR_420; - info.func = 0;//K_ROTATION_180;////K_ROTATION_90; - info.global_alptha = 0xff; - info.offset.x = 0;//(1080-w)/2, - info.offset.y = 0;//(1920-h)/2; - vo_creat_layer_test(chn_id, &info); - - if(vicap_install_osd == 1) - sample_vicap_install_osd(); - - //exit ; - return 0; -} - -static void sample_vicap_bind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) -{ - k_s32 ret; - - ret = kd_mpi_sys_bind(&vicap_mpp_chn, &vo_mpp_chn); - if (ret) { - printf("kd_mpi_sys_unbind failed:0x%x\n", ret); - } - - return; -} - -static void sample_vicap_unbind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) -{ - k_s32 ret; - - ret = kd_mpi_sys_unbind(&vicap_mpp_chn, &vo_mpp_chn); - if (ret) { - printf("kd_mpi_sys_unbind failed:0x%x\n", ret); - } - - return; -} - -int vivcap_start() -{ - k_s32 ret = 0; - - k_u32 pool_id; - k_vb_pool_config pool_config; - - printf("sample_vicap ...\n"); - -#if defined(CONFIG_BOARD_K230_CANMV) - sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); -#else - sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; -#endif - vicap_dev = VICAP_DEV_ID_0; - - memset(&config, 0, sizeof(config)); - config.max_pool_cnt = 64; - //VB for YUV420SP output - config.comm_pool[0].blk_cnt = 5; - config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; - config.comm_pool[0].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), VICAP_ALIGN_1K); - - //VB for RGB888 output - config.comm_pool[1].blk_cnt = 5; - config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; - config.comm_pool[1].blk_size = VICAP_ALIGN_UP((SENSOR_HEIGHT * SENSOR_WIDTH * 3 ), VICAP_ALIGN_1K); - - ret = kd_mpi_vb_set_config(&config); - if (ret) { - printf("vb_set_config failed ret:%d\n", ret); - return ret; - } - - k_vb_supplement_config supplement_config; - memset(&supplement_config, 0, sizeof(supplement_config)); - supplement_config.supplement_config |= VB_SUPPLEMENT_JPEG_MASK; - - ret = kd_mpi_vb_set_supplement_config(&supplement_config); - if (ret) { - printf("vb_set_supplement_config failed ret:%d\n", ret); - return ret; - } - - ret = kd_mpi_vb_init(); - if (ret) { - printf("vb_init failed ret:%d\n", ret); - return ret; - } - printf("sample_vicap ...kd_mpi_vicap_get_sensor_info\n"); - - // dwc_dsi_init(); - vo_layer_vdss_bind_vo_config(); - - if(vicap_install_osd == 1) - { - memset(&pool_config, 0, sizeof(pool_config)); - pool_config.blk_size = VICAP_ALIGN_UP((osd_width * osd_height * 4 * 2), VICAP_ALIGN_1K); - pool_config.blk_cnt = 4; - pool_config.mode = VB_REMAP_MODE_NOCACHE; - pool_id = kd_mpi_vb_create_pool(&pool_config); // osd0 - 3 argb 320 x 240 - g_pool_id = pool_id; - - printf("--------aa--------------g_pool_id is %d pool_id is %d \n",g_pool_id, pool_id); - } - - memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); - ret = kd_mpi_vicap_get_sensor_info(sensor_type, &sensor_info); - if (ret) { - printf("sample_vicap, the sensor type not supported!\n"); - return ret; - } - - memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); - dev_attr.acq_win.h_start = 0; - dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) - dev_attr.acq_win.width = ISP_CHN0_WIDTH; - dev_attr.acq_win.height = ISP_CHN0_HEIGHT; -#else - dev_attr.acq_win.width = 2592;//SENSOR_HEIGHT; - dev_attr.acq_win.height = 1944;//SENSOR_WIDTH; -#endif - dev_attr.mode = VICAP_WORK_ONLINE_MODE; - - dev_attr.pipe_ctrl.data = 0xFFFFFFFF; - dev_attr.pipe_ctrl.bits.af_enable = 0; - dev_attr.pipe_ctrl.bits.ahdr_enable = 0; - - - dev_attr.cpature_frame = 0; - memcpy(&dev_attr.sensor_info, &sensor_info, sizeof(k_vicap_sensor_info)); - - ret = kd_mpi_vicap_set_dev_attr(vicap_dev, dev_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_dev_attr failed.\n"); - return ret; - } - - memset(&chn_attr, 0, sizeof(k_vicap_chn_attr)); - - //set chn0 output yuv420sp - chn_attr.out_win.h_start = 0; - chn_attr.out_win.v_start = 0; - chn_attr.out_win.width = ISP_CHN0_WIDTH; - chn_attr.out_win.height = ISP_CHN0_HEIGHT; - - -#if defined(CONFIG_BOARD_K230_CANMV) - chn_attr.crop_win = dev_attr.acq_win; -#else - // chn_attr.crop_win = dev_attr.acq_win; - chn_attr.crop_win.h_start = 768; - chn_attr.crop_win.v_start = 16; - chn_attr.crop_win.width = ISP_CHN0_WIDTH; - chn_attr.crop_win.height = ISP_CHN0_HEIGHT; -#endif - - chn_attr.scale_win = chn_attr.out_win; - chn_attr.crop_enable = K_FALSE; - chn_attr.scale_enable = K_FALSE; - // chn_attr.dw_enable = K_FALSE; - chn_attr.chn_enable = K_TRUE; - chn_attr.pix_format = PIXEL_FORMAT_YVU_PLANAR_420; - chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp - chn_attr.buffer_size = config.comm_pool[0].blk_size; - vicap_chn = VICAP_CHN_ID_0; - - printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); - ret = kd_mpi_vicap_set_chn_attr(vicap_dev, vicap_chn, chn_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); - return ret; - } - - //bind vicap chn 0 to vo - vicap_mpp_chn.mod_id = K_ID_VI; - vicap_mpp_chn.dev_id = vicap_dev; - vicap_mpp_chn.chn_id = vicap_chn; - - vo_mpp_chn.mod_id = K_ID_VO; - vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; - vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; - - sample_vicap_bind_vo(vicap_mpp_chn, vo_mpp_chn); - printf("sample_vicap ...dwc_dsi_init\n"); - - //set chn1 output rgb888p - chn_attr.out_win.h_start = 0; - chn_attr.out_win.v_start = 0; - chn_attr.out_win.width = SENSOR_WIDTH ; - chn_attr.out_win.height = SENSOR_HEIGHT; - // chn_attr.crop_win = dev_attr.acq_win; - -#if defined(CONFIG_BOARD_K230_CANMV) - chn_attr.crop_win = dev_attr.acq_win; -#else - chn_attr.crop_win.h_start = 768; - chn_attr.crop_win.v_start = 16; - chn_attr.crop_win.width = ISP_CHN0_WIDTH; - chn_attr.crop_win.height = ISP_CHN0_HEIGHT; -#endif - - chn_attr.scale_win = chn_attr.out_win; - chn_attr.crop_enable = K_FALSE; - chn_attr.scale_enable = K_FALSE; - // chn_attr.dw_enable = K_FALSE; - chn_attr.chn_enable = K_TRUE; - chn_attr.pix_format = PIXEL_FORMAT_BGR_888_PLANAR; - chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp - chn_attr.buffer_size = config.comm_pool[1].blk_size; - - printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); - ret = kd_mpi_vicap_set_chn_attr(vicap_dev, VICAP_CHN_ID_1, chn_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); - return ret; - } - - printf("sample_vicap ...kd_mpi_vicap_init\n"); - ret = kd_mpi_vicap_init(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - // goto err_exit; - } - - printf("sample_vicap ...kd_mpi_vicap_start_stream\n"); - ret = kd_mpi_vicap_start_stream(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - // goto err_exit; - } - - return ret; -} - -int vivcap_stop() -{ - printf("sample_vicap ...kd_mpi_vicap_stop_stream\n"); - int ret = kd_mpi_vicap_stop_stream(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - return ret; - } - - ret = kd_mpi_vicap_deinit(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_deinit failed.\n"); - return ret; - } - - kd_mpi_vo_disable_video_layer(K_VO_LAYER1); - - vicap_mpp_chn.mod_id = K_ID_VI; - vicap_mpp_chn.dev_id = vicap_dev; - vicap_mpp_chn.chn_id = vicap_chn; - - vo_mpp_chn.mod_id = K_ID_VO; - vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; - vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; - - sample_vicap_unbind_vo(vicap_mpp_chn, vo_mpp_chn); - - /*Allow one frame time for the VO to release the VB block*/ - k_u32 display_ms = 1000 / 33; - usleep(1000 * display_ms); - - ret = kd_mpi_vb_exit(); - if (ret) { - printf("sample_vicap, kd_mpi_vb_exit failed.\n"); - return ret; - } - - return 0; -} - -void yuv_rotate_90(char *des, char *src,int width,int height) -{ - int n = 0; - int hw = width>>1; - int hh = height>>1; - int size = width * height; - int hsize = size>>2; - - int pos = 0; - - for(int i = width-1;i >= 0;i--) - { - pos = 0; - for(int j= 0;j < height;j++) - { - des[n++]= src[pos+i]; - pos += width; - } - } - +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include + +#include "mpi_sys_api.h" + +/* vicap */ +#include +#include +#include +#include +#include + +#include "k_module.h" +#include "k_type.h" +#include "k_vb_comm.h" +#include "k_video_comm.h" +#include "k_sys_comm.h" +#include "mpi_vb_api.h" +#include "mpi_vicap_api.h" +#include "mpi_isp_api.h" +#include "mpi_sys_api.h" +#include "k_vo_comm.h" +#include "mpi_vo_api.h" + +#include "vo_test_case.h" + +#include "k_connector_comm.h" +#include "mpi_connector_api.h" +#include "k_autoconf_comm.h" + + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) +#define SENSOR_CHANNEL (3) // isp通道数 +#define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 +#define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 +#define ISP_CHN0_WIDTH (1920)//(1920) +#define ISP_CHN0_HEIGHT (1080)//(1080) +#define vicap_install_osd (1) +#define osd_id K_VO_OSD3 +#define osd_width (1920) +#define osd_height (1080) +#else +#define SENSOR_CHANNEL (3) // isp通道数 +#define SENSOR_HEIGHT (1280) // isp高度,ai输入,竖屏 +#define SENSOR_WIDTH (720) // isp宽度,ai输入,竖屏 +#define ISP_CHN0_WIDTH (1088)//(1920) +#define ISP_CHN0_HEIGHT (1920)//(1080) +#define vicap_install_osd (1) +#define osd_id K_VO_OSD3 +#define osd_width (1080) +#define osd_height (1920) +#endif + + +k_vb_config config; +k_vicap_dev vicap_dev; +k_vicap_chn vicap_chn; +k_vicap_dev_attr dev_attr; +k_vicap_chn_attr chn_attr; +k_vicap_sensor_info sensor_info; +k_vicap_sensor_type sensor_type; +k_mpp_chn vicap_mpp_chn; +k_mpp_chn vo_mpp_chn; + +k_video_frame_info dump_info; + +k_vo_draw_frame vo_frame = (k_vo_draw_frame) { + 1, + 16, + 16, + 128, + 128, + 1 +}; + +static k_vb_blk_handle block; +k_u32 g_pool_id; + +int vo_creat_layer_test(k_vo_layer chn_id, layer_info *info) +{ + k_vo_video_layer_attr attr; + + // check layer + if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) + || ((info->func != 0) && (chn_id == K_VO_LAYER2))) + { + printf("input layer num failed \n"); + return -1 ; + } + + // check scaler + + // set offset + attr.display_rect = info->offset; + // set act + attr.img_size = info->act_size; + // sget size + info->size = info->act_size.height * info->act_size.width * 3 / 2; + //set pixel format + attr.pixel_format = info->format; + if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) + { + printf("input pix format failed \n"); + return -1; + } + // set stride + attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); + // set function + attr.func = info->func; + // set scaler attr + attr.scaler_attr = info->attr; + + // set video layer atrr + kd_mpi_vo_set_video_layer_attr(chn_id, &attr); + + // enable layer + kd_mpi_vo_enable_video_layer(chn_id); + + return 0; +} + +k_vb_blk_handle vo_insert_frame(k_video_frame_info *vf_info, void **pic_vaddr) +{ + k_u64 phys_addr = 0; + k_u32 *virt_addr; + k_vb_blk_handle handle; + k_s32 size; + + if (vf_info == NULL) + return K_FALSE; + + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_8888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_8888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 4; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_565 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_565) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_4444 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_4444) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_1555 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_1555) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3 / 2; + + size = size + 4096; // 强制4K ,后边得删了 + + printf("vb block size is %x \n", size); + + handle = kd_mpi_vb_get_block(g_pool_id, size, NULL); + if (handle == VB_INVALID_HANDLE) + { + printf("%s get vb block error\n", __func__); + return K_FAILED; + } + + phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); + if (phys_addr == 0) + { + printf("%s get phys addr error\n", __func__); + return K_FAILED; + } + + virt_addr = (k_u32 *)kd_mpi_sys_mmap(phys_addr, size); + // virt_addr = (k_u32 *)kd_mpi_sys_mmap_cached(phys_addr, size); + + if (virt_addr == NULL) + { + printf("%s mmap error\n", __func__); + return K_FAILED; + } + + vf_info->mod_id = K_ID_VO; + vf_info->pool_id = g_pool_id; + vf_info->v_frame.phys_addr[0] = phys_addr; + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + vf_info->v_frame.phys_addr[1] = phys_addr + (vf_info->v_frame.height * vf_info->v_frame.stride[0]); + *pic_vaddr = virt_addr; + + printf("phys_addr is %lx g_pool_id is %d \n", phys_addr, g_pool_id); + + return handle; +} + +k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) +{ + k_vo_video_osd_attr attr; + + // set attr + attr.global_alptha = info->global_alptha; + + if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) + { + info->size = info->act_size.width * info->act_size.height * 4; + info->stride = info->act_size.width * 4 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) + { + info->size = info->act_size.width * info->act_size.height * 3; + info->stride = info->act_size.width * 3 / 8; + } + else if(info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if(info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else + { + printf("set osd pixel format failed \n"); + } + + attr.stride = info->stride; + attr.pixel_format = info->format; + attr.display_rect = info->offset; + attr.img_size = info->act_size; + kd_mpi_vo_set_video_osd_attr(osd, &attr); + + kd_mpi_vo_osd_enable(osd); + + return 0; +} + +void sample_vicap_install_osd(void) +{ + osd_info osd; + + osd.act_size.width = osd_width ; + osd.act_size.height = osd_height; + osd.offset.x = 0; + osd.offset.y = 0; + osd.global_alptha = 0xff; + // osd.global_alptha = 0x32; + osd.format = PIXEL_FORMAT_ARGB_8888;//PIXEL_FORMAT_ARGB_4444; //PIXEL_FORMAT_ARGB_1555;//PIXEL_FORMAT_ARGB_8888; + + vo_creat_osd_test(osd_id, &osd); +} + +void vo_osd_release_block(void) +{ + if(vicap_install_osd == 1) + { + kd_mpi_vo_osd_disable(osd_id); + kd_mpi_vb_release_block(block); + } + +} + +static k_s32 sample_connector_init(void) +{ + k_u32 ret = 0; + k_s32 connector_fd; +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#else + k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#endif + k_connector_info connector_info; + + memset(&connector_info, 0, sizeof(k_connector_info)); + + //connector get sensor info + ret = kd_mpi_get_connector_info(connector_type, &connector_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + + connector_fd = kd_mpi_connector_open(connector_info.connector_name); + if (connector_fd < 0) { + printf("%s, connector open failed.\n", __func__); + return K_ERR_VO_NOTREADY; + } + + // set connect power + kd_mpi_connector_power_set(connector_fd, K_TRUE); + // connector init + kd_mpi_connector_init(connector_fd, connector_info); + + return 0; +} + +static k_s32 vo_layer_vdss_bind_vo_config(void) +{ + layer_info info; + + k_vo_layer chn_id = K_VO_LAYER1; + + memset(&info, 0, sizeof(info)); + + sample_connector_init(); + + // config lyaer + info.act_size.width = ISP_CHN0_WIDTH;//ISP_CHN0_HEIGHT;//1080;//640;//1080; + info.act_size.height = ISP_CHN0_HEIGHT;//ISP_CHN0_WIDTH;//1920;//480;//1920; + info.format = PIXEL_FORMAT_YVU_PLANAR_420; + info.func = 0;//K_ROTATION_180;////K_ROTATION_90; + info.global_alptha = 0xff; + info.offset.x = 0;//(1080-w)/2, + info.offset.y = 0;//(1920-h)/2; + vo_creat_layer_test(chn_id, &info); + + if(vicap_install_osd == 1) + sample_vicap_install_osd(); + + //exit ; + return 0; +} + +static void sample_vicap_bind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) +{ + k_s32 ret; + + ret = kd_mpi_sys_bind(&vicap_mpp_chn, &vo_mpp_chn); + if (ret) { + printf("kd_mpi_sys_unbind failed:0x%x\n", ret); + } + + return; +} + +static void sample_vicap_unbind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) +{ + k_s32 ret; + + ret = kd_mpi_sys_unbind(&vicap_mpp_chn, &vo_mpp_chn); + if (ret) { + printf("kd_mpi_sys_unbind failed:0x%x\n", ret); + } + + return; +} + +int vivcap_start() +{ + k_s32 ret = 0; + + k_u32 pool_id; + k_vb_pool_config pool_config; + + printf("sample_vicap ...\n"); + +#if defined(CONFIG_BOARD_K230_CANMV) + sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; +#else + sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; +#endif + vicap_dev = VICAP_DEV_ID_0; + + memset(&config, 0, sizeof(config)); + config.max_pool_cnt = 64; + //VB for YUV420SP output + config.comm_pool[0].blk_cnt = 5; + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[0].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), VICAP_ALIGN_1K); + + //VB for RGB888 output + config.comm_pool[1].blk_cnt = 5; + config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[1].blk_size = VICAP_ALIGN_UP((SENSOR_HEIGHT * SENSOR_WIDTH * 3 ), VICAP_ALIGN_1K); + + ret = kd_mpi_vb_set_config(&config); + if (ret) { + printf("vb_set_config failed ret:%d\n", ret); + return ret; + } + + k_vb_supplement_config supplement_config; + memset(&supplement_config, 0, sizeof(supplement_config)); + supplement_config.supplement_config |= VB_SUPPLEMENT_JPEG_MASK; + + ret = kd_mpi_vb_set_supplement_config(&supplement_config); + if (ret) { + printf("vb_set_supplement_config failed ret:%d\n", ret); + return ret; + } + + ret = kd_mpi_vb_init(); + if (ret) { + printf("vb_init failed ret:%d\n", ret); + return ret; + } + printf("sample_vicap ...kd_mpi_vicap_get_sensor_info\n"); + + // dwc_dsi_init(); + vo_layer_vdss_bind_vo_config(); + + if(vicap_install_osd == 1) + { + memset(&pool_config, 0, sizeof(pool_config)); + pool_config.blk_size = VICAP_ALIGN_UP((osd_width * osd_height * 4 * 2), VICAP_ALIGN_1K); + pool_config.blk_cnt = 4; + pool_config.mode = VB_REMAP_MODE_NOCACHE; + pool_id = kd_mpi_vb_create_pool(&pool_config); // osd0 - 3 argb 320 x 240 + g_pool_id = pool_id; + + printf("--------aa--------------g_pool_id is %d pool_id is %d \n",g_pool_id, pool_id); + } + + memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); + ret = kd_mpi_vicap_get_sensor_info(sensor_type, &sensor_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + + memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); + dev_attr.acq_win.h_start = 0; + dev_attr.acq_win.v_start = 0; +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + dev_attr.acq_win.width = ISP_CHN0_WIDTH; + dev_attr.acq_win.height = ISP_CHN0_HEIGHT; +#else + dev_attr.acq_win.width = 2592;//SENSOR_HEIGHT; + dev_attr.acq_win.height = 1944;//SENSOR_WIDTH; +#endif + dev_attr.mode = VICAP_WORK_ONLINE_MODE; + + dev_attr.pipe_ctrl.data = 0xFFFFFFFF; + dev_attr.pipe_ctrl.bits.af_enable = 0; + dev_attr.pipe_ctrl.bits.ahdr_enable = 0; + + + dev_attr.cpature_frame = 0; + memcpy(&dev_attr.sensor_info, &sensor_info, sizeof(k_vicap_sensor_info)); + + ret = kd_mpi_vicap_set_dev_attr(vicap_dev, dev_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_dev_attr failed.\n"); + return ret; + } + + memset(&chn_attr, 0, sizeof(k_vicap_chn_attr)); + + //set chn0 output yuv420sp + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = ISP_CHN0_WIDTH; + chn_attr.out_win.height = ISP_CHN0_HEIGHT; + + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + chn_attr.crop_win = dev_attr.acq_win; +#else + // chn_attr.crop_win = dev_attr.acq_win; + chn_attr.crop_win.h_start = 768; + chn_attr.crop_win.v_start = 16; + chn_attr.crop_win.width = ISP_CHN0_WIDTH; + chn_attr.crop_win.height = ISP_CHN0_HEIGHT; +#endif + + chn_attr.scale_win = chn_attr.out_win; + chn_attr.crop_enable = K_FALSE; + chn_attr.scale_enable = K_FALSE; + // chn_attr.dw_enable = K_FALSE; + chn_attr.chn_enable = K_TRUE; + chn_attr.pix_format = PIXEL_FORMAT_YVU_PLANAR_420; + chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp + chn_attr.buffer_size = config.comm_pool[0].blk_size; + vicap_chn = VICAP_CHN_ID_0; + + printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); + ret = kd_mpi_vicap_set_chn_attr(vicap_dev, vicap_chn, chn_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); + return ret; + } + + //bind vicap chn 0 to vo + vicap_mpp_chn.mod_id = K_ID_VI; + vicap_mpp_chn.dev_id = vicap_dev; + vicap_mpp_chn.chn_id = vicap_chn; + + vo_mpp_chn.mod_id = K_ID_VO; + vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; + vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; + + sample_vicap_bind_vo(vicap_mpp_chn, vo_mpp_chn); + printf("sample_vicap ...dwc_dsi_init\n"); + + //set chn1 output rgb888p + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = SENSOR_WIDTH ; + chn_attr.out_win.height = SENSOR_HEIGHT; + // chn_attr.crop_win = dev_attr.acq_win; + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + chn_attr.crop_win = dev_attr.acq_win; +#else + chn_attr.crop_win.h_start = 768; + chn_attr.crop_win.v_start = 16; + chn_attr.crop_win.width = ISP_CHN0_WIDTH; + chn_attr.crop_win.height = ISP_CHN0_HEIGHT; +#endif + + chn_attr.scale_win = chn_attr.out_win; + chn_attr.crop_enable = K_FALSE; + chn_attr.scale_enable = K_FALSE; + // chn_attr.dw_enable = K_FALSE; + chn_attr.chn_enable = K_TRUE; + chn_attr.pix_format = PIXEL_FORMAT_BGR_888_PLANAR; + chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp + chn_attr.buffer_size = config.comm_pool[1].blk_size; + + printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); + ret = kd_mpi_vicap_set_chn_attr(vicap_dev, VICAP_CHN_ID_1, chn_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); + return ret; + } + + printf("sample_vicap ...kd_mpi_vicap_init\n"); + ret = kd_mpi_vicap_init(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + // goto err_exit; + } + + printf("sample_vicap ...kd_mpi_vicap_start_stream\n"); + ret = kd_mpi_vicap_start_stream(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + // goto err_exit; + } + + return ret; +} + +int vivcap_stop() +{ + printf("sample_vicap ...kd_mpi_vicap_stop_stream\n"); + int ret = kd_mpi_vicap_stop_stream(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + return ret; + } + + ret = kd_mpi_vicap_deinit(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_deinit failed.\n"); + return ret; + } + + kd_mpi_vo_disable_video_layer(K_VO_LAYER1); + + vicap_mpp_chn.mod_id = K_ID_VI; + vicap_mpp_chn.dev_id = vicap_dev; + vicap_mpp_chn.chn_id = vicap_chn; + + vo_mpp_chn.mod_id = K_ID_VO; + vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; + vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; + + sample_vicap_unbind_vo(vicap_mpp_chn, vo_mpp_chn); + + /*Allow one frame time for the VO to release the VB block*/ + k_u32 display_ms = 1000 / 33; + usleep(1000 * display_ms); + + ret = kd_mpi_vb_exit(); + if (ret) { + printf("sample_vicap, kd_mpi_vb_exit failed.\n"); + return ret; + } + + return 0; +} + +void yuv_rotate_90(char *des, char *src,int width,int height) +{ + int n = 0; + int hw = width>>1; + int hh = height>>1; + int size = width * height; + int hsize = size>>2; + + int pos = 0; + + for(int i = width-1;i >= 0;i--) + { + pos = 0; + for(int j= 0;j < height;j++) + { + des[n++]= src[pos+i]; + pos += width; + } + } + } \ No newline at end of file diff --git a/src/reference/ai_poc/space_resize/vi_vo.h b/src/reference/ai_poc/space_resize/vi_vo.h index f0c1bccc5..0a11a4d31 100644 --- a/src/reference/ai_poc/space_resize/vi_vo.h +++ b/src/reference/ai_poc/space_resize/vi_vo.h @@ -57,7 +57,7 @@ #include "k_autoconf_comm.h" -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) #define SENSOR_CHANNEL (3) // isp通道数 #define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 #define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 @@ -286,7 +286,7 @@ static k_s32 sample_connector_init(void) { k_u32 ret = 0; k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; #else k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; @@ -378,7 +378,8 @@ int vivcap_start() #if defined(CONFIG_BOARD_K230_CANMV) sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; #else sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; #endif @@ -444,7 +445,7 @@ int vivcap_start() memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); dev_attr.acq_win.h_start = 0; dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) dev_attr.acq_win.width = ISP_CHN0_WIDTH; dev_attr.acq_win.height = ISP_CHN0_HEIGHT; #else @@ -476,7 +477,7 @@ int vivcap_start() chn_attr.out_win.height = ISP_CHN0_HEIGHT; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else // chn_attr.crop_win = dev_attr.acq_win; @@ -522,7 +523,7 @@ int vivcap_start() chn_attr.out_win.height = SENSOR_HEIGHT; // chn_attr.crop_win = dev_attr.acq_win; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else chn_attr.crop_win.h_start = 768; diff --git a/src/reference/ai_poc/sq_hand_det/hand_detection.cc b/src/reference/ai_poc/sq_hand_det/hand_detection.cc index 3fff3528a..a8ec63893 100644 --- a/src/reference/ai_poc/sq_hand_det/hand_detection.cc +++ b/src/reference/ai_poc/sq_hand_det/hand_detection.cc @@ -175,7 +175,7 @@ std::vector HandDetection::decode_infer(float *data, int stride, FrameS box.x2 = std::max(0, std::min(int(frame_size.width), int(cx + w / 2.f))); box.y2 = std::max(0, std::min(int(frame_size.height), int(cy + h / 2.f))); - #if defined(CONFIG_BOARD_K230_CANMV) + #if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) if (abs(box.y1-box.y2)< 0.1*frame_size.height) continue; if ((abs(box.x1-box.x2)< 0.25*frame_size.width) && ((box.x1 < 0.03*frame_size.width) || (box.x2 > 0.97*frame_size.width))) diff --git a/src/reference/ai_poc/sq_hand_det/vi_vo.h b/src/reference/ai_poc/sq_hand_det/vi_vo.h index e3d8bdba4..0a11a4d31 100644 --- a/src/reference/ai_poc/sq_hand_det/vi_vo.h +++ b/src/reference/ai_poc/sq_hand_det/vi_vo.h @@ -1,627 +1,628 @@ -/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include -#include -#include - -#include "mpi_sys_api.h" - -/* vicap */ -#include -#include -#include -#include -#include - -#include "k_module.h" -#include "k_type.h" -#include "k_vb_comm.h" -#include "k_video_comm.h" -#include "k_sys_comm.h" -#include "mpi_vb_api.h" -#include "mpi_vicap_api.h" -#include "mpi_isp_api.h" -#include "mpi_sys_api.h" -#include "k_vo_comm.h" -#include "mpi_vo_api.h" - -#include "vo_test_case.h" - -#include "k_connector_comm.h" -#include "mpi_connector_api.h" -#include "k_autoconf_comm.h" - - -#if defined(CONFIG_BOARD_K230_CANMV) -#define SENSOR_CHANNEL (3) // isp通道数 -#define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 -#define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 -#define ISP_CHN0_WIDTH (1920)//(1920) -#define ISP_CHN0_HEIGHT (1080)//(1080) -#define vicap_install_osd (1) -#define osd_id K_VO_OSD3 -#define osd_width (1920) -#define osd_height (1080) -#else -#define SENSOR_CHANNEL (3) // isp通道数 -#define SENSOR_HEIGHT (1280) // isp高度,ai输入,竖屏 -#define SENSOR_WIDTH (720) // isp宽度,ai输入,竖屏 -#define ISP_CHN0_WIDTH (1088)//(1920) -#define ISP_CHN0_HEIGHT (1920)//(1080) -#define vicap_install_osd (1) -#define osd_id K_VO_OSD3 -#define osd_width (1080) -#define osd_height (1920) -#endif - - -k_vb_config config; -k_vicap_dev vicap_dev; -k_vicap_chn vicap_chn; -k_vicap_dev_attr dev_attr; -k_vicap_chn_attr chn_attr; -k_vicap_sensor_info sensor_info; -k_vicap_sensor_type sensor_type; -k_mpp_chn vicap_mpp_chn; -k_mpp_chn vo_mpp_chn; - -k_video_frame_info dump_info; - -k_vo_draw_frame vo_frame = (k_vo_draw_frame) { - 1, - 16, - 16, - 128, - 128, - 1 -}; - -static k_vb_blk_handle block; -k_u32 g_pool_id; - -int vo_creat_layer_test(k_vo_layer chn_id, layer_info *info) -{ - k_vo_video_layer_attr attr; - - // check layer - if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) - || ((info->func != 0) && (chn_id == K_VO_LAYER2))) - { - printf("input layer num failed \n"); - return -1 ; - } - - // check scaler - - // set offset - attr.display_rect = info->offset; - // set act - attr.img_size = info->act_size; - // sget size - info->size = info->act_size.height * info->act_size.width * 3 / 2; - //set pixel format - attr.pixel_format = info->format; - if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) - { - printf("input pix format failed \n"); - return -1; - } - // set stride - attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); - // set function - attr.func = info->func; - // set scaler attr - attr.scaler_attr = info->attr; - - // set video layer atrr - kd_mpi_vo_set_video_layer_attr(chn_id, &attr); - - // enable layer - kd_mpi_vo_enable_video_layer(chn_id); - - return 0; -} - -k_vb_blk_handle vo_insert_frame(k_video_frame_info *vf_info, void **pic_vaddr) -{ - k_u64 phys_addr = 0; - k_u32 *virt_addr; - k_vb_blk_handle handle; - k_s32 size; - - if (vf_info == NULL) - return K_FALSE; - - if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_8888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_8888) - size = vf_info->v_frame.height * vf_info->v_frame.width * 4; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_565 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_565) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_4444 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_4444) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_888) - size = vf_info->v_frame.height * vf_info->v_frame.width * 3; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_1555 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_1555) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) - size = vf_info->v_frame.height * vf_info->v_frame.width * 3 / 2; - - size = size + 4096; // 强制4K ,后边得删了 - - printf("vb block size is %x \n", size); - - handle = kd_mpi_vb_get_block(g_pool_id, size, NULL); - if (handle == VB_INVALID_HANDLE) - { - printf("%s get vb block error\n", __func__); - return K_FAILED; - } - - phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); - if (phys_addr == 0) - { - printf("%s get phys addr error\n", __func__); - return K_FAILED; - } - - virt_addr = (k_u32 *)kd_mpi_sys_mmap(phys_addr, size); - // virt_addr = (k_u32 *)kd_mpi_sys_mmap_cached(phys_addr, size); - - if (virt_addr == NULL) - { - printf("%s mmap error\n", __func__); - return K_FAILED; - } - - vf_info->mod_id = K_ID_VO; - vf_info->pool_id = g_pool_id; - vf_info->v_frame.phys_addr[0] = phys_addr; - if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) - vf_info->v_frame.phys_addr[1] = phys_addr + (vf_info->v_frame.height * vf_info->v_frame.stride[0]); - *pic_vaddr = virt_addr; - - printf("phys_addr is %lx g_pool_id is %d \n", phys_addr, g_pool_id); - - return handle; -} - -k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) -{ - k_vo_video_osd_attr attr; - - // set attr - attr.global_alptha = info->global_alptha; - - if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) - { - info->size = info->act_size.width * info->act_size.height * 4; - info->stride = info->act_size.width * 4 / 8; - } - else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) - { - info->size = info->act_size.width * info->act_size.height * 3; - info->stride = info->act_size.width * 3 / 8; - } - else if(info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else if(info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else - { - printf("set osd pixel format failed \n"); - } - - attr.stride = info->stride; - attr.pixel_format = info->format; - attr.display_rect = info->offset; - attr.img_size = info->act_size; - kd_mpi_vo_set_video_osd_attr(osd, &attr); - - kd_mpi_vo_osd_enable(osd); - - return 0; -} - -void sample_vicap_install_osd(void) -{ - osd_info osd; - - osd.act_size.width = osd_width ; - osd.act_size.height = osd_height; - osd.offset.x = 0; - osd.offset.y = 0; - osd.global_alptha = 0xff; - // osd.global_alptha = 0x32; - osd.format = PIXEL_FORMAT_ARGB_8888;//PIXEL_FORMAT_ARGB_4444; //PIXEL_FORMAT_ARGB_1555;//PIXEL_FORMAT_ARGB_8888; - - vo_creat_osd_test(osd_id, &osd); -} - -void vo_osd_release_block(void) -{ - if(vicap_install_osd == 1) - { - kd_mpi_vo_osd_disable(osd_id); - kd_mpi_vb_release_block(block); - } - -} - -static k_s32 sample_connector_init(void) -{ - k_u32 ret = 0; - k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) - k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; -#else - k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; -#endif - k_connector_info connector_info; - - memset(&connector_info, 0, sizeof(k_connector_info)); - - //connector get sensor info - ret = kd_mpi_get_connector_info(connector_type, &connector_info); - if (ret) { - printf("sample_vicap, the sensor type not supported!\n"); - return ret; - } - - connector_fd = kd_mpi_connector_open(connector_info.connector_name); - if (connector_fd < 0) { - printf("%s, connector open failed.\n", __func__); - return K_ERR_VO_NOTREADY; - } - - // set connect power - kd_mpi_connector_power_set(connector_fd, K_TRUE); - // connector init - kd_mpi_connector_init(connector_fd, connector_info); - - return 0; -} - -static k_s32 vo_layer_vdss_bind_vo_config(void) -{ - layer_info info; - - k_vo_layer chn_id = K_VO_LAYER1; - - memset(&info, 0, sizeof(info)); - - sample_connector_init(); - - // config lyaer - info.act_size.width = ISP_CHN0_WIDTH;//ISP_CHN0_HEIGHT;//1080;//640;//1080; - info.act_size.height = ISP_CHN0_HEIGHT;//ISP_CHN0_WIDTH;//1920;//480;//1920; - info.format = PIXEL_FORMAT_YVU_PLANAR_420; - info.func = 0;//K_ROTATION_180;////K_ROTATION_90; - info.global_alptha = 0xff; - info.offset.x = 0;//(1080-w)/2, - info.offset.y = 0;//(1920-h)/2; - vo_creat_layer_test(chn_id, &info); - - if(vicap_install_osd == 1) - sample_vicap_install_osd(); - - //exit ; - return 0; -} - -static void sample_vicap_bind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) -{ - k_s32 ret; - - ret = kd_mpi_sys_bind(&vicap_mpp_chn, &vo_mpp_chn); - if (ret) { - printf("kd_mpi_sys_unbind failed:0x%x\n", ret); - } - - return; -} - -static void sample_vicap_unbind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) -{ - k_s32 ret; - - ret = kd_mpi_sys_unbind(&vicap_mpp_chn, &vo_mpp_chn); - if (ret) { - printf("kd_mpi_sys_unbind failed:0x%x\n", ret); - } - - return; -} - -int vivcap_start() -{ - k_s32 ret = 0; - - k_u32 pool_id; - k_vb_pool_config pool_config; - - printf("sample_vicap ...\n"); - -#if defined(CONFIG_BOARD_K230_CANMV) - sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); -#else - sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; -#endif - vicap_dev = VICAP_DEV_ID_0; - - memset(&config, 0, sizeof(config)); - config.max_pool_cnt = 64; - //VB for YUV420SP output - config.comm_pool[0].blk_cnt = 5; - config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; - config.comm_pool[0].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), VICAP_ALIGN_1K); - - //VB for RGB888 output - config.comm_pool[1].blk_cnt = 5; - config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; - config.comm_pool[1].blk_size = VICAP_ALIGN_UP((SENSOR_HEIGHT * SENSOR_WIDTH * 3 ), VICAP_ALIGN_1K); - - ret = kd_mpi_vb_set_config(&config); - if (ret) { - printf("vb_set_config failed ret:%d\n", ret); - return ret; - } - - k_vb_supplement_config supplement_config; - memset(&supplement_config, 0, sizeof(supplement_config)); - supplement_config.supplement_config |= VB_SUPPLEMENT_JPEG_MASK; - - ret = kd_mpi_vb_set_supplement_config(&supplement_config); - if (ret) { - printf("vb_set_supplement_config failed ret:%d\n", ret); - return ret; - } - - ret = kd_mpi_vb_init(); - if (ret) { - printf("vb_init failed ret:%d\n", ret); - return ret; - } - printf("sample_vicap ...kd_mpi_vicap_get_sensor_info\n"); - - // dwc_dsi_init(); - vo_layer_vdss_bind_vo_config(); - - if(vicap_install_osd == 1) - { - memset(&pool_config, 0, sizeof(pool_config)); - pool_config.blk_size = VICAP_ALIGN_UP((osd_width * osd_height * 4 * 2), VICAP_ALIGN_1K); - pool_config.blk_cnt = 4; - pool_config.mode = VB_REMAP_MODE_NOCACHE; - pool_id = kd_mpi_vb_create_pool(&pool_config); // osd0 - 3 argb 320 x 240 - g_pool_id = pool_id; - - printf("--------aa--------------g_pool_id is %d pool_id is %d \n",g_pool_id, pool_id); - } - - memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); - ret = kd_mpi_vicap_get_sensor_info(sensor_type, &sensor_info); - if (ret) { - printf("sample_vicap, the sensor type not supported!\n"); - return ret; - } - - memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); - dev_attr.acq_win.h_start = 0; - dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) - dev_attr.acq_win.width = ISP_CHN0_WIDTH; - dev_attr.acq_win.height = ISP_CHN0_HEIGHT; -#else - dev_attr.acq_win.width = 2592;//SENSOR_HEIGHT; - dev_attr.acq_win.height = 1944;//SENSOR_WIDTH; -#endif - dev_attr.mode = VICAP_WORK_ONLINE_MODE; - - dev_attr.pipe_ctrl.data = 0xFFFFFFFF; - dev_attr.pipe_ctrl.bits.af_enable = 0; - dev_attr.pipe_ctrl.bits.ahdr_enable = 0; - - - dev_attr.cpature_frame = 0; - memcpy(&dev_attr.sensor_info, &sensor_info, sizeof(k_vicap_sensor_info)); - - ret = kd_mpi_vicap_set_dev_attr(vicap_dev, dev_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_dev_attr failed.\n"); - return ret; - } - - memset(&chn_attr, 0, sizeof(k_vicap_chn_attr)); - - //set chn0 output yuv420sp - chn_attr.out_win.h_start = 0; - chn_attr.out_win.v_start = 0; - chn_attr.out_win.width = ISP_CHN0_WIDTH; - chn_attr.out_win.height = ISP_CHN0_HEIGHT; - - -#if defined(CONFIG_BOARD_K230_CANMV) - chn_attr.crop_win = dev_attr.acq_win; -#else - // chn_attr.crop_win = dev_attr.acq_win; - chn_attr.crop_win.h_start = 768; - chn_attr.crop_win.v_start = 16; - chn_attr.crop_win.width = ISP_CHN0_WIDTH; - chn_attr.crop_win.height = ISP_CHN0_HEIGHT; -#endif - - chn_attr.scale_win = chn_attr.out_win; - chn_attr.crop_enable = K_FALSE; - chn_attr.scale_enable = K_FALSE; - // chn_attr.dw_enable = K_FALSE; - chn_attr.chn_enable = K_TRUE; - chn_attr.pix_format = PIXEL_FORMAT_YVU_PLANAR_420; - chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp - chn_attr.buffer_size = config.comm_pool[0].blk_size; - vicap_chn = VICAP_CHN_ID_0; - - printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); - ret = kd_mpi_vicap_set_chn_attr(vicap_dev, vicap_chn, chn_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); - return ret; - } - - //bind vicap chn 0 to vo - vicap_mpp_chn.mod_id = K_ID_VI; - vicap_mpp_chn.dev_id = vicap_dev; - vicap_mpp_chn.chn_id = vicap_chn; - - vo_mpp_chn.mod_id = K_ID_VO; - vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; - vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; - - sample_vicap_bind_vo(vicap_mpp_chn, vo_mpp_chn); - printf("sample_vicap ...dwc_dsi_init\n"); - - //set chn1 output rgb888p - chn_attr.out_win.h_start = 0; - chn_attr.out_win.v_start = 0; - chn_attr.out_win.width = SENSOR_WIDTH ; - chn_attr.out_win.height = SENSOR_HEIGHT; - // chn_attr.crop_win = dev_attr.acq_win; - -#if defined(CONFIG_BOARD_K230_CANMV) - chn_attr.crop_win = dev_attr.acq_win; -#else - chn_attr.crop_win.h_start = 768; - chn_attr.crop_win.v_start = 16; - chn_attr.crop_win.width = ISP_CHN0_WIDTH; - chn_attr.crop_win.height = ISP_CHN0_HEIGHT; -#endif - - chn_attr.scale_win = chn_attr.out_win; - chn_attr.crop_enable = K_FALSE; - chn_attr.scale_enable = K_FALSE; - // chn_attr.dw_enable = K_FALSE; - chn_attr.chn_enable = K_TRUE; - chn_attr.pix_format = PIXEL_FORMAT_BGR_888_PLANAR; - chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp - chn_attr.buffer_size = config.comm_pool[1].blk_size; - - printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); - ret = kd_mpi_vicap_set_chn_attr(vicap_dev, VICAP_CHN_ID_1, chn_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); - return ret; - } - - printf("sample_vicap ...kd_mpi_vicap_init\n"); - ret = kd_mpi_vicap_init(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - // goto err_exit; - } - - printf("sample_vicap ...kd_mpi_vicap_start_stream\n"); - ret = kd_mpi_vicap_start_stream(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - // goto err_exit; - } - - return ret; -} - -int vivcap_stop() -{ - printf("sample_vicap ...kd_mpi_vicap_stop_stream\n"); - int ret = kd_mpi_vicap_stop_stream(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - return ret; - } - - ret = kd_mpi_vicap_deinit(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_deinit failed.\n"); - return ret; - } - - kd_mpi_vo_disable_video_layer(K_VO_LAYER1); - - vicap_mpp_chn.mod_id = K_ID_VI; - vicap_mpp_chn.dev_id = vicap_dev; - vicap_mpp_chn.chn_id = vicap_chn; - - vo_mpp_chn.mod_id = K_ID_VO; - vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; - vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; - - sample_vicap_unbind_vo(vicap_mpp_chn, vo_mpp_chn); - - /*Allow one frame time for the VO to release the VB block*/ - k_u32 display_ms = 1000 / 33; - usleep(1000 * display_ms); - - ret = kd_mpi_vb_exit(); - if (ret) { - printf("sample_vicap, kd_mpi_vb_exit failed.\n"); - return ret; - } - - return 0; -} - -void yuv_rotate_90(char *des, char *src,int width,int height) -{ - int n = 0; - int hw = width>>1; - int hh = height>>1; - int size = width * height; - int hsize = size>>2; - - int pos = 0; - - for(int i = width-1;i >= 0;i--) - { - pos = 0; - for(int j= 0;j < height;j++) - { - des[n++]= src[pos+i]; - pos += width; - } - } - +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include + +#include "mpi_sys_api.h" + +/* vicap */ +#include +#include +#include +#include +#include + +#include "k_module.h" +#include "k_type.h" +#include "k_vb_comm.h" +#include "k_video_comm.h" +#include "k_sys_comm.h" +#include "mpi_vb_api.h" +#include "mpi_vicap_api.h" +#include "mpi_isp_api.h" +#include "mpi_sys_api.h" +#include "k_vo_comm.h" +#include "mpi_vo_api.h" + +#include "vo_test_case.h" + +#include "k_connector_comm.h" +#include "mpi_connector_api.h" +#include "k_autoconf_comm.h" + + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) +#define SENSOR_CHANNEL (3) // isp通道数 +#define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 +#define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 +#define ISP_CHN0_WIDTH (1920)//(1920) +#define ISP_CHN0_HEIGHT (1080)//(1080) +#define vicap_install_osd (1) +#define osd_id K_VO_OSD3 +#define osd_width (1920) +#define osd_height (1080) +#else +#define SENSOR_CHANNEL (3) // isp通道数 +#define SENSOR_HEIGHT (1280) // isp高度,ai输入,竖屏 +#define SENSOR_WIDTH (720) // isp宽度,ai输入,竖屏 +#define ISP_CHN0_WIDTH (1088)//(1920) +#define ISP_CHN0_HEIGHT (1920)//(1080) +#define vicap_install_osd (1) +#define osd_id K_VO_OSD3 +#define osd_width (1080) +#define osd_height (1920) +#endif + + +k_vb_config config; +k_vicap_dev vicap_dev; +k_vicap_chn vicap_chn; +k_vicap_dev_attr dev_attr; +k_vicap_chn_attr chn_attr; +k_vicap_sensor_info sensor_info; +k_vicap_sensor_type sensor_type; +k_mpp_chn vicap_mpp_chn; +k_mpp_chn vo_mpp_chn; + +k_video_frame_info dump_info; + +k_vo_draw_frame vo_frame = (k_vo_draw_frame) { + 1, + 16, + 16, + 128, + 128, + 1 +}; + +static k_vb_blk_handle block; +k_u32 g_pool_id; + +int vo_creat_layer_test(k_vo_layer chn_id, layer_info *info) +{ + k_vo_video_layer_attr attr; + + // check layer + if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) + || ((info->func != 0) && (chn_id == K_VO_LAYER2))) + { + printf("input layer num failed \n"); + return -1 ; + } + + // check scaler + + // set offset + attr.display_rect = info->offset; + // set act + attr.img_size = info->act_size; + // sget size + info->size = info->act_size.height * info->act_size.width * 3 / 2; + //set pixel format + attr.pixel_format = info->format; + if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) + { + printf("input pix format failed \n"); + return -1; + } + // set stride + attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); + // set function + attr.func = info->func; + // set scaler attr + attr.scaler_attr = info->attr; + + // set video layer atrr + kd_mpi_vo_set_video_layer_attr(chn_id, &attr); + + // enable layer + kd_mpi_vo_enable_video_layer(chn_id); + + return 0; +} + +k_vb_blk_handle vo_insert_frame(k_video_frame_info *vf_info, void **pic_vaddr) +{ + k_u64 phys_addr = 0; + k_u32 *virt_addr; + k_vb_blk_handle handle; + k_s32 size; + + if (vf_info == NULL) + return K_FALSE; + + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_8888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_8888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 4; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_565 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_565) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_4444 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_4444) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_1555 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_1555) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3 / 2; + + size = size + 4096; // 强制4K ,后边得删了 + + printf("vb block size is %x \n", size); + + handle = kd_mpi_vb_get_block(g_pool_id, size, NULL); + if (handle == VB_INVALID_HANDLE) + { + printf("%s get vb block error\n", __func__); + return K_FAILED; + } + + phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); + if (phys_addr == 0) + { + printf("%s get phys addr error\n", __func__); + return K_FAILED; + } + + virt_addr = (k_u32 *)kd_mpi_sys_mmap(phys_addr, size); + // virt_addr = (k_u32 *)kd_mpi_sys_mmap_cached(phys_addr, size); + + if (virt_addr == NULL) + { + printf("%s mmap error\n", __func__); + return K_FAILED; + } + + vf_info->mod_id = K_ID_VO; + vf_info->pool_id = g_pool_id; + vf_info->v_frame.phys_addr[0] = phys_addr; + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + vf_info->v_frame.phys_addr[1] = phys_addr + (vf_info->v_frame.height * vf_info->v_frame.stride[0]); + *pic_vaddr = virt_addr; + + printf("phys_addr is %lx g_pool_id is %d \n", phys_addr, g_pool_id); + + return handle; +} + +k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) +{ + k_vo_video_osd_attr attr; + + // set attr + attr.global_alptha = info->global_alptha; + + if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) + { + info->size = info->act_size.width * info->act_size.height * 4; + info->stride = info->act_size.width * 4 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) + { + info->size = info->act_size.width * info->act_size.height * 3; + info->stride = info->act_size.width * 3 / 8; + } + else if(info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if(info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else + { + printf("set osd pixel format failed \n"); + } + + attr.stride = info->stride; + attr.pixel_format = info->format; + attr.display_rect = info->offset; + attr.img_size = info->act_size; + kd_mpi_vo_set_video_osd_attr(osd, &attr); + + kd_mpi_vo_osd_enable(osd); + + return 0; +} + +void sample_vicap_install_osd(void) +{ + osd_info osd; + + osd.act_size.width = osd_width ; + osd.act_size.height = osd_height; + osd.offset.x = 0; + osd.offset.y = 0; + osd.global_alptha = 0xff; + // osd.global_alptha = 0x32; + osd.format = PIXEL_FORMAT_ARGB_8888;//PIXEL_FORMAT_ARGB_4444; //PIXEL_FORMAT_ARGB_1555;//PIXEL_FORMAT_ARGB_8888; + + vo_creat_osd_test(osd_id, &osd); +} + +void vo_osd_release_block(void) +{ + if(vicap_install_osd == 1) + { + kd_mpi_vo_osd_disable(osd_id); + kd_mpi_vb_release_block(block); + } + +} + +static k_s32 sample_connector_init(void) +{ + k_u32 ret = 0; + k_s32 connector_fd; +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#else + k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#endif + k_connector_info connector_info; + + memset(&connector_info, 0, sizeof(k_connector_info)); + + //connector get sensor info + ret = kd_mpi_get_connector_info(connector_type, &connector_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + + connector_fd = kd_mpi_connector_open(connector_info.connector_name); + if (connector_fd < 0) { + printf("%s, connector open failed.\n", __func__); + return K_ERR_VO_NOTREADY; + } + + // set connect power + kd_mpi_connector_power_set(connector_fd, K_TRUE); + // connector init + kd_mpi_connector_init(connector_fd, connector_info); + + return 0; +} + +static k_s32 vo_layer_vdss_bind_vo_config(void) +{ + layer_info info; + + k_vo_layer chn_id = K_VO_LAYER1; + + memset(&info, 0, sizeof(info)); + + sample_connector_init(); + + // config lyaer + info.act_size.width = ISP_CHN0_WIDTH;//ISP_CHN0_HEIGHT;//1080;//640;//1080; + info.act_size.height = ISP_CHN0_HEIGHT;//ISP_CHN0_WIDTH;//1920;//480;//1920; + info.format = PIXEL_FORMAT_YVU_PLANAR_420; + info.func = 0;//K_ROTATION_180;////K_ROTATION_90; + info.global_alptha = 0xff; + info.offset.x = 0;//(1080-w)/2, + info.offset.y = 0;//(1920-h)/2; + vo_creat_layer_test(chn_id, &info); + + if(vicap_install_osd == 1) + sample_vicap_install_osd(); + + //exit ; + return 0; +} + +static void sample_vicap_bind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) +{ + k_s32 ret; + + ret = kd_mpi_sys_bind(&vicap_mpp_chn, &vo_mpp_chn); + if (ret) { + printf("kd_mpi_sys_unbind failed:0x%x\n", ret); + } + + return; +} + +static void sample_vicap_unbind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) +{ + k_s32 ret; + + ret = kd_mpi_sys_unbind(&vicap_mpp_chn, &vo_mpp_chn); + if (ret) { + printf("kd_mpi_sys_unbind failed:0x%x\n", ret); + } + + return; +} + +int vivcap_start() +{ + k_s32 ret = 0; + + k_u32 pool_id; + k_vb_pool_config pool_config; + + printf("sample_vicap ...\n"); + +#if defined(CONFIG_BOARD_K230_CANMV) + sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; +#else + sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; +#endif + vicap_dev = VICAP_DEV_ID_0; + + memset(&config, 0, sizeof(config)); + config.max_pool_cnt = 64; + //VB for YUV420SP output + config.comm_pool[0].blk_cnt = 5; + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[0].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), VICAP_ALIGN_1K); + + //VB for RGB888 output + config.comm_pool[1].blk_cnt = 5; + config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[1].blk_size = VICAP_ALIGN_UP((SENSOR_HEIGHT * SENSOR_WIDTH * 3 ), VICAP_ALIGN_1K); + + ret = kd_mpi_vb_set_config(&config); + if (ret) { + printf("vb_set_config failed ret:%d\n", ret); + return ret; + } + + k_vb_supplement_config supplement_config; + memset(&supplement_config, 0, sizeof(supplement_config)); + supplement_config.supplement_config |= VB_SUPPLEMENT_JPEG_MASK; + + ret = kd_mpi_vb_set_supplement_config(&supplement_config); + if (ret) { + printf("vb_set_supplement_config failed ret:%d\n", ret); + return ret; + } + + ret = kd_mpi_vb_init(); + if (ret) { + printf("vb_init failed ret:%d\n", ret); + return ret; + } + printf("sample_vicap ...kd_mpi_vicap_get_sensor_info\n"); + + // dwc_dsi_init(); + vo_layer_vdss_bind_vo_config(); + + if(vicap_install_osd == 1) + { + memset(&pool_config, 0, sizeof(pool_config)); + pool_config.blk_size = VICAP_ALIGN_UP((osd_width * osd_height * 4 * 2), VICAP_ALIGN_1K); + pool_config.blk_cnt = 4; + pool_config.mode = VB_REMAP_MODE_NOCACHE; + pool_id = kd_mpi_vb_create_pool(&pool_config); // osd0 - 3 argb 320 x 240 + g_pool_id = pool_id; + + printf("--------aa--------------g_pool_id is %d pool_id is %d \n",g_pool_id, pool_id); + } + + memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); + ret = kd_mpi_vicap_get_sensor_info(sensor_type, &sensor_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + + memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); + dev_attr.acq_win.h_start = 0; + dev_attr.acq_win.v_start = 0; +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + dev_attr.acq_win.width = ISP_CHN0_WIDTH; + dev_attr.acq_win.height = ISP_CHN0_HEIGHT; +#else + dev_attr.acq_win.width = 2592;//SENSOR_HEIGHT; + dev_attr.acq_win.height = 1944;//SENSOR_WIDTH; +#endif + dev_attr.mode = VICAP_WORK_ONLINE_MODE; + + dev_attr.pipe_ctrl.data = 0xFFFFFFFF; + dev_attr.pipe_ctrl.bits.af_enable = 0; + dev_attr.pipe_ctrl.bits.ahdr_enable = 0; + + + dev_attr.cpature_frame = 0; + memcpy(&dev_attr.sensor_info, &sensor_info, sizeof(k_vicap_sensor_info)); + + ret = kd_mpi_vicap_set_dev_attr(vicap_dev, dev_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_dev_attr failed.\n"); + return ret; + } + + memset(&chn_attr, 0, sizeof(k_vicap_chn_attr)); + + //set chn0 output yuv420sp + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = ISP_CHN0_WIDTH; + chn_attr.out_win.height = ISP_CHN0_HEIGHT; + + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + chn_attr.crop_win = dev_attr.acq_win; +#else + // chn_attr.crop_win = dev_attr.acq_win; + chn_attr.crop_win.h_start = 768; + chn_attr.crop_win.v_start = 16; + chn_attr.crop_win.width = ISP_CHN0_WIDTH; + chn_attr.crop_win.height = ISP_CHN0_HEIGHT; +#endif + + chn_attr.scale_win = chn_attr.out_win; + chn_attr.crop_enable = K_FALSE; + chn_attr.scale_enable = K_FALSE; + // chn_attr.dw_enable = K_FALSE; + chn_attr.chn_enable = K_TRUE; + chn_attr.pix_format = PIXEL_FORMAT_YVU_PLANAR_420; + chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp + chn_attr.buffer_size = config.comm_pool[0].blk_size; + vicap_chn = VICAP_CHN_ID_0; + + printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); + ret = kd_mpi_vicap_set_chn_attr(vicap_dev, vicap_chn, chn_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); + return ret; + } + + //bind vicap chn 0 to vo + vicap_mpp_chn.mod_id = K_ID_VI; + vicap_mpp_chn.dev_id = vicap_dev; + vicap_mpp_chn.chn_id = vicap_chn; + + vo_mpp_chn.mod_id = K_ID_VO; + vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; + vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; + + sample_vicap_bind_vo(vicap_mpp_chn, vo_mpp_chn); + printf("sample_vicap ...dwc_dsi_init\n"); + + //set chn1 output rgb888p + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = SENSOR_WIDTH ; + chn_attr.out_win.height = SENSOR_HEIGHT; + // chn_attr.crop_win = dev_attr.acq_win; + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + chn_attr.crop_win = dev_attr.acq_win; +#else + chn_attr.crop_win.h_start = 768; + chn_attr.crop_win.v_start = 16; + chn_attr.crop_win.width = ISP_CHN0_WIDTH; + chn_attr.crop_win.height = ISP_CHN0_HEIGHT; +#endif + + chn_attr.scale_win = chn_attr.out_win; + chn_attr.crop_enable = K_FALSE; + chn_attr.scale_enable = K_FALSE; + // chn_attr.dw_enable = K_FALSE; + chn_attr.chn_enable = K_TRUE; + chn_attr.pix_format = PIXEL_FORMAT_BGR_888_PLANAR; + chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp + chn_attr.buffer_size = config.comm_pool[1].blk_size; + + printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); + ret = kd_mpi_vicap_set_chn_attr(vicap_dev, VICAP_CHN_ID_1, chn_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); + return ret; + } + + printf("sample_vicap ...kd_mpi_vicap_init\n"); + ret = kd_mpi_vicap_init(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + // goto err_exit; + } + + printf("sample_vicap ...kd_mpi_vicap_start_stream\n"); + ret = kd_mpi_vicap_start_stream(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + // goto err_exit; + } + + return ret; +} + +int vivcap_stop() +{ + printf("sample_vicap ...kd_mpi_vicap_stop_stream\n"); + int ret = kd_mpi_vicap_stop_stream(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + return ret; + } + + ret = kd_mpi_vicap_deinit(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_deinit failed.\n"); + return ret; + } + + kd_mpi_vo_disable_video_layer(K_VO_LAYER1); + + vicap_mpp_chn.mod_id = K_ID_VI; + vicap_mpp_chn.dev_id = vicap_dev; + vicap_mpp_chn.chn_id = vicap_chn; + + vo_mpp_chn.mod_id = K_ID_VO; + vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; + vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; + + sample_vicap_unbind_vo(vicap_mpp_chn, vo_mpp_chn); + + /*Allow one frame time for the VO to release the VB block*/ + k_u32 display_ms = 1000 / 33; + usleep(1000 * display_ms); + + ret = kd_mpi_vb_exit(); + if (ret) { + printf("sample_vicap, kd_mpi_vb_exit failed.\n"); + return ret; + } + + return 0; +} + +void yuv_rotate_90(char *des, char *src,int width,int height) +{ + int n = 0; + int hw = width>>1; + int hh = height>>1; + int size = width * height; + int hsize = size>>2; + + int pos = 0; + + for(int i = width-1;i >= 0;i--) + { + pos = 0; + for(int j= 0;j < height;j++) + { + des[n++]= src[pos+i]; + pos += width; + } + } + } \ No newline at end of file diff --git a/src/reference/ai_poc/sq_handkp_class/hand_detection.cc b/src/reference/ai_poc/sq_handkp_class/hand_detection.cc index f14ddced8..f9ed806b6 100644 --- a/src/reference/ai_poc/sq_handkp_class/hand_detection.cc +++ b/src/reference/ai_poc/sq_handkp_class/hand_detection.cc @@ -177,7 +177,7 @@ std::vector HandDetection::decode_infer(float *data, int stride, FrameS box.x2 = std::max(0, std::min(int(frame_size.width), int(cx + w / 2.f))); box.y2 = std::max(0, std::min(int(frame_size.height), int(cy + h / 2.f))); - #if defined(CONFIG_BOARD_K230_CANMV) + #if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) if (abs(box.y1-box.y2)< 0.1*frame_size.height) continue; if ((abs(box.x1-box.x2)< 0.25*frame_size.width) && ((box.x1 < 0.03*frame_size.width) || (box.x2 > 0.97*frame_size.width))) diff --git a/src/reference/ai_poc/sq_handkp_class/vi_vo.h b/src/reference/ai_poc/sq_handkp_class/vi_vo.h index e3d8bdba4..0a11a4d31 100644 --- a/src/reference/ai_poc/sq_handkp_class/vi_vo.h +++ b/src/reference/ai_poc/sq_handkp_class/vi_vo.h @@ -1,627 +1,628 @@ -/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include -#include -#include - -#include "mpi_sys_api.h" - -/* vicap */ -#include -#include -#include -#include -#include - -#include "k_module.h" -#include "k_type.h" -#include "k_vb_comm.h" -#include "k_video_comm.h" -#include "k_sys_comm.h" -#include "mpi_vb_api.h" -#include "mpi_vicap_api.h" -#include "mpi_isp_api.h" -#include "mpi_sys_api.h" -#include "k_vo_comm.h" -#include "mpi_vo_api.h" - -#include "vo_test_case.h" - -#include "k_connector_comm.h" -#include "mpi_connector_api.h" -#include "k_autoconf_comm.h" - - -#if defined(CONFIG_BOARD_K230_CANMV) -#define SENSOR_CHANNEL (3) // isp通道数 -#define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 -#define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 -#define ISP_CHN0_WIDTH (1920)//(1920) -#define ISP_CHN0_HEIGHT (1080)//(1080) -#define vicap_install_osd (1) -#define osd_id K_VO_OSD3 -#define osd_width (1920) -#define osd_height (1080) -#else -#define SENSOR_CHANNEL (3) // isp通道数 -#define SENSOR_HEIGHT (1280) // isp高度,ai输入,竖屏 -#define SENSOR_WIDTH (720) // isp宽度,ai输入,竖屏 -#define ISP_CHN0_WIDTH (1088)//(1920) -#define ISP_CHN0_HEIGHT (1920)//(1080) -#define vicap_install_osd (1) -#define osd_id K_VO_OSD3 -#define osd_width (1080) -#define osd_height (1920) -#endif - - -k_vb_config config; -k_vicap_dev vicap_dev; -k_vicap_chn vicap_chn; -k_vicap_dev_attr dev_attr; -k_vicap_chn_attr chn_attr; -k_vicap_sensor_info sensor_info; -k_vicap_sensor_type sensor_type; -k_mpp_chn vicap_mpp_chn; -k_mpp_chn vo_mpp_chn; - -k_video_frame_info dump_info; - -k_vo_draw_frame vo_frame = (k_vo_draw_frame) { - 1, - 16, - 16, - 128, - 128, - 1 -}; - -static k_vb_blk_handle block; -k_u32 g_pool_id; - -int vo_creat_layer_test(k_vo_layer chn_id, layer_info *info) -{ - k_vo_video_layer_attr attr; - - // check layer - if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) - || ((info->func != 0) && (chn_id == K_VO_LAYER2))) - { - printf("input layer num failed \n"); - return -1 ; - } - - // check scaler - - // set offset - attr.display_rect = info->offset; - // set act - attr.img_size = info->act_size; - // sget size - info->size = info->act_size.height * info->act_size.width * 3 / 2; - //set pixel format - attr.pixel_format = info->format; - if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) - { - printf("input pix format failed \n"); - return -1; - } - // set stride - attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); - // set function - attr.func = info->func; - // set scaler attr - attr.scaler_attr = info->attr; - - // set video layer atrr - kd_mpi_vo_set_video_layer_attr(chn_id, &attr); - - // enable layer - kd_mpi_vo_enable_video_layer(chn_id); - - return 0; -} - -k_vb_blk_handle vo_insert_frame(k_video_frame_info *vf_info, void **pic_vaddr) -{ - k_u64 phys_addr = 0; - k_u32 *virt_addr; - k_vb_blk_handle handle; - k_s32 size; - - if (vf_info == NULL) - return K_FALSE; - - if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_8888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_8888) - size = vf_info->v_frame.height * vf_info->v_frame.width * 4; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_565 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_565) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_4444 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_4444) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_888) - size = vf_info->v_frame.height * vf_info->v_frame.width * 3; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_1555 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_1555) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) - size = vf_info->v_frame.height * vf_info->v_frame.width * 3 / 2; - - size = size + 4096; // 强制4K ,后边得删了 - - printf("vb block size is %x \n", size); - - handle = kd_mpi_vb_get_block(g_pool_id, size, NULL); - if (handle == VB_INVALID_HANDLE) - { - printf("%s get vb block error\n", __func__); - return K_FAILED; - } - - phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); - if (phys_addr == 0) - { - printf("%s get phys addr error\n", __func__); - return K_FAILED; - } - - virt_addr = (k_u32 *)kd_mpi_sys_mmap(phys_addr, size); - // virt_addr = (k_u32 *)kd_mpi_sys_mmap_cached(phys_addr, size); - - if (virt_addr == NULL) - { - printf("%s mmap error\n", __func__); - return K_FAILED; - } - - vf_info->mod_id = K_ID_VO; - vf_info->pool_id = g_pool_id; - vf_info->v_frame.phys_addr[0] = phys_addr; - if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) - vf_info->v_frame.phys_addr[1] = phys_addr + (vf_info->v_frame.height * vf_info->v_frame.stride[0]); - *pic_vaddr = virt_addr; - - printf("phys_addr is %lx g_pool_id is %d \n", phys_addr, g_pool_id); - - return handle; -} - -k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) -{ - k_vo_video_osd_attr attr; - - // set attr - attr.global_alptha = info->global_alptha; - - if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) - { - info->size = info->act_size.width * info->act_size.height * 4; - info->stride = info->act_size.width * 4 / 8; - } - else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) - { - info->size = info->act_size.width * info->act_size.height * 3; - info->stride = info->act_size.width * 3 / 8; - } - else if(info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else if(info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else - { - printf("set osd pixel format failed \n"); - } - - attr.stride = info->stride; - attr.pixel_format = info->format; - attr.display_rect = info->offset; - attr.img_size = info->act_size; - kd_mpi_vo_set_video_osd_attr(osd, &attr); - - kd_mpi_vo_osd_enable(osd); - - return 0; -} - -void sample_vicap_install_osd(void) -{ - osd_info osd; - - osd.act_size.width = osd_width ; - osd.act_size.height = osd_height; - osd.offset.x = 0; - osd.offset.y = 0; - osd.global_alptha = 0xff; - // osd.global_alptha = 0x32; - osd.format = PIXEL_FORMAT_ARGB_8888;//PIXEL_FORMAT_ARGB_4444; //PIXEL_FORMAT_ARGB_1555;//PIXEL_FORMAT_ARGB_8888; - - vo_creat_osd_test(osd_id, &osd); -} - -void vo_osd_release_block(void) -{ - if(vicap_install_osd == 1) - { - kd_mpi_vo_osd_disable(osd_id); - kd_mpi_vb_release_block(block); - } - -} - -static k_s32 sample_connector_init(void) -{ - k_u32 ret = 0; - k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) - k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; -#else - k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; -#endif - k_connector_info connector_info; - - memset(&connector_info, 0, sizeof(k_connector_info)); - - //connector get sensor info - ret = kd_mpi_get_connector_info(connector_type, &connector_info); - if (ret) { - printf("sample_vicap, the sensor type not supported!\n"); - return ret; - } - - connector_fd = kd_mpi_connector_open(connector_info.connector_name); - if (connector_fd < 0) { - printf("%s, connector open failed.\n", __func__); - return K_ERR_VO_NOTREADY; - } - - // set connect power - kd_mpi_connector_power_set(connector_fd, K_TRUE); - // connector init - kd_mpi_connector_init(connector_fd, connector_info); - - return 0; -} - -static k_s32 vo_layer_vdss_bind_vo_config(void) -{ - layer_info info; - - k_vo_layer chn_id = K_VO_LAYER1; - - memset(&info, 0, sizeof(info)); - - sample_connector_init(); - - // config lyaer - info.act_size.width = ISP_CHN0_WIDTH;//ISP_CHN0_HEIGHT;//1080;//640;//1080; - info.act_size.height = ISP_CHN0_HEIGHT;//ISP_CHN0_WIDTH;//1920;//480;//1920; - info.format = PIXEL_FORMAT_YVU_PLANAR_420; - info.func = 0;//K_ROTATION_180;////K_ROTATION_90; - info.global_alptha = 0xff; - info.offset.x = 0;//(1080-w)/2, - info.offset.y = 0;//(1920-h)/2; - vo_creat_layer_test(chn_id, &info); - - if(vicap_install_osd == 1) - sample_vicap_install_osd(); - - //exit ; - return 0; -} - -static void sample_vicap_bind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) -{ - k_s32 ret; - - ret = kd_mpi_sys_bind(&vicap_mpp_chn, &vo_mpp_chn); - if (ret) { - printf("kd_mpi_sys_unbind failed:0x%x\n", ret); - } - - return; -} - -static void sample_vicap_unbind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) -{ - k_s32 ret; - - ret = kd_mpi_sys_unbind(&vicap_mpp_chn, &vo_mpp_chn); - if (ret) { - printf("kd_mpi_sys_unbind failed:0x%x\n", ret); - } - - return; -} - -int vivcap_start() -{ - k_s32 ret = 0; - - k_u32 pool_id; - k_vb_pool_config pool_config; - - printf("sample_vicap ...\n"); - -#if defined(CONFIG_BOARD_K230_CANMV) - sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); -#else - sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; -#endif - vicap_dev = VICAP_DEV_ID_0; - - memset(&config, 0, sizeof(config)); - config.max_pool_cnt = 64; - //VB for YUV420SP output - config.comm_pool[0].blk_cnt = 5; - config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; - config.comm_pool[0].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), VICAP_ALIGN_1K); - - //VB for RGB888 output - config.comm_pool[1].blk_cnt = 5; - config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; - config.comm_pool[1].blk_size = VICAP_ALIGN_UP((SENSOR_HEIGHT * SENSOR_WIDTH * 3 ), VICAP_ALIGN_1K); - - ret = kd_mpi_vb_set_config(&config); - if (ret) { - printf("vb_set_config failed ret:%d\n", ret); - return ret; - } - - k_vb_supplement_config supplement_config; - memset(&supplement_config, 0, sizeof(supplement_config)); - supplement_config.supplement_config |= VB_SUPPLEMENT_JPEG_MASK; - - ret = kd_mpi_vb_set_supplement_config(&supplement_config); - if (ret) { - printf("vb_set_supplement_config failed ret:%d\n", ret); - return ret; - } - - ret = kd_mpi_vb_init(); - if (ret) { - printf("vb_init failed ret:%d\n", ret); - return ret; - } - printf("sample_vicap ...kd_mpi_vicap_get_sensor_info\n"); - - // dwc_dsi_init(); - vo_layer_vdss_bind_vo_config(); - - if(vicap_install_osd == 1) - { - memset(&pool_config, 0, sizeof(pool_config)); - pool_config.blk_size = VICAP_ALIGN_UP((osd_width * osd_height * 4 * 2), VICAP_ALIGN_1K); - pool_config.blk_cnt = 4; - pool_config.mode = VB_REMAP_MODE_NOCACHE; - pool_id = kd_mpi_vb_create_pool(&pool_config); // osd0 - 3 argb 320 x 240 - g_pool_id = pool_id; - - printf("--------aa--------------g_pool_id is %d pool_id is %d \n",g_pool_id, pool_id); - } - - memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); - ret = kd_mpi_vicap_get_sensor_info(sensor_type, &sensor_info); - if (ret) { - printf("sample_vicap, the sensor type not supported!\n"); - return ret; - } - - memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); - dev_attr.acq_win.h_start = 0; - dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) - dev_attr.acq_win.width = ISP_CHN0_WIDTH; - dev_attr.acq_win.height = ISP_CHN0_HEIGHT; -#else - dev_attr.acq_win.width = 2592;//SENSOR_HEIGHT; - dev_attr.acq_win.height = 1944;//SENSOR_WIDTH; -#endif - dev_attr.mode = VICAP_WORK_ONLINE_MODE; - - dev_attr.pipe_ctrl.data = 0xFFFFFFFF; - dev_attr.pipe_ctrl.bits.af_enable = 0; - dev_attr.pipe_ctrl.bits.ahdr_enable = 0; - - - dev_attr.cpature_frame = 0; - memcpy(&dev_attr.sensor_info, &sensor_info, sizeof(k_vicap_sensor_info)); - - ret = kd_mpi_vicap_set_dev_attr(vicap_dev, dev_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_dev_attr failed.\n"); - return ret; - } - - memset(&chn_attr, 0, sizeof(k_vicap_chn_attr)); - - //set chn0 output yuv420sp - chn_attr.out_win.h_start = 0; - chn_attr.out_win.v_start = 0; - chn_attr.out_win.width = ISP_CHN0_WIDTH; - chn_attr.out_win.height = ISP_CHN0_HEIGHT; - - -#if defined(CONFIG_BOARD_K230_CANMV) - chn_attr.crop_win = dev_attr.acq_win; -#else - // chn_attr.crop_win = dev_attr.acq_win; - chn_attr.crop_win.h_start = 768; - chn_attr.crop_win.v_start = 16; - chn_attr.crop_win.width = ISP_CHN0_WIDTH; - chn_attr.crop_win.height = ISP_CHN0_HEIGHT; -#endif - - chn_attr.scale_win = chn_attr.out_win; - chn_attr.crop_enable = K_FALSE; - chn_attr.scale_enable = K_FALSE; - // chn_attr.dw_enable = K_FALSE; - chn_attr.chn_enable = K_TRUE; - chn_attr.pix_format = PIXEL_FORMAT_YVU_PLANAR_420; - chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp - chn_attr.buffer_size = config.comm_pool[0].blk_size; - vicap_chn = VICAP_CHN_ID_0; - - printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); - ret = kd_mpi_vicap_set_chn_attr(vicap_dev, vicap_chn, chn_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); - return ret; - } - - //bind vicap chn 0 to vo - vicap_mpp_chn.mod_id = K_ID_VI; - vicap_mpp_chn.dev_id = vicap_dev; - vicap_mpp_chn.chn_id = vicap_chn; - - vo_mpp_chn.mod_id = K_ID_VO; - vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; - vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; - - sample_vicap_bind_vo(vicap_mpp_chn, vo_mpp_chn); - printf("sample_vicap ...dwc_dsi_init\n"); - - //set chn1 output rgb888p - chn_attr.out_win.h_start = 0; - chn_attr.out_win.v_start = 0; - chn_attr.out_win.width = SENSOR_WIDTH ; - chn_attr.out_win.height = SENSOR_HEIGHT; - // chn_attr.crop_win = dev_attr.acq_win; - -#if defined(CONFIG_BOARD_K230_CANMV) - chn_attr.crop_win = dev_attr.acq_win; -#else - chn_attr.crop_win.h_start = 768; - chn_attr.crop_win.v_start = 16; - chn_attr.crop_win.width = ISP_CHN0_WIDTH; - chn_attr.crop_win.height = ISP_CHN0_HEIGHT; -#endif - - chn_attr.scale_win = chn_attr.out_win; - chn_attr.crop_enable = K_FALSE; - chn_attr.scale_enable = K_FALSE; - // chn_attr.dw_enable = K_FALSE; - chn_attr.chn_enable = K_TRUE; - chn_attr.pix_format = PIXEL_FORMAT_BGR_888_PLANAR; - chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp - chn_attr.buffer_size = config.comm_pool[1].blk_size; - - printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); - ret = kd_mpi_vicap_set_chn_attr(vicap_dev, VICAP_CHN_ID_1, chn_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); - return ret; - } - - printf("sample_vicap ...kd_mpi_vicap_init\n"); - ret = kd_mpi_vicap_init(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - // goto err_exit; - } - - printf("sample_vicap ...kd_mpi_vicap_start_stream\n"); - ret = kd_mpi_vicap_start_stream(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - // goto err_exit; - } - - return ret; -} - -int vivcap_stop() -{ - printf("sample_vicap ...kd_mpi_vicap_stop_stream\n"); - int ret = kd_mpi_vicap_stop_stream(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - return ret; - } - - ret = kd_mpi_vicap_deinit(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_deinit failed.\n"); - return ret; - } - - kd_mpi_vo_disable_video_layer(K_VO_LAYER1); - - vicap_mpp_chn.mod_id = K_ID_VI; - vicap_mpp_chn.dev_id = vicap_dev; - vicap_mpp_chn.chn_id = vicap_chn; - - vo_mpp_chn.mod_id = K_ID_VO; - vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; - vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; - - sample_vicap_unbind_vo(vicap_mpp_chn, vo_mpp_chn); - - /*Allow one frame time for the VO to release the VB block*/ - k_u32 display_ms = 1000 / 33; - usleep(1000 * display_ms); - - ret = kd_mpi_vb_exit(); - if (ret) { - printf("sample_vicap, kd_mpi_vb_exit failed.\n"); - return ret; - } - - return 0; -} - -void yuv_rotate_90(char *des, char *src,int width,int height) -{ - int n = 0; - int hw = width>>1; - int hh = height>>1; - int size = width * height; - int hsize = size>>2; - - int pos = 0; - - for(int i = width-1;i >= 0;i--) - { - pos = 0; - for(int j= 0;j < height;j++) - { - des[n++]= src[pos+i]; - pos += width; - } - } - +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include + +#include "mpi_sys_api.h" + +/* vicap */ +#include +#include +#include +#include +#include + +#include "k_module.h" +#include "k_type.h" +#include "k_vb_comm.h" +#include "k_video_comm.h" +#include "k_sys_comm.h" +#include "mpi_vb_api.h" +#include "mpi_vicap_api.h" +#include "mpi_isp_api.h" +#include "mpi_sys_api.h" +#include "k_vo_comm.h" +#include "mpi_vo_api.h" + +#include "vo_test_case.h" + +#include "k_connector_comm.h" +#include "mpi_connector_api.h" +#include "k_autoconf_comm.h" + + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) +#define SENSOR_CHANNEL (3) // isp通道数 +#define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 +#define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 +#define ISP_CHN0_WIDTH (1920)//(1920) +#define ISP_CHN0_HEIGHT (1080)//(1080) +#define vicap_install_osd (1) +#define osd_id K_VO_OSD3 +#define osd_width (1920) +#define osd_height (1080) +#else +#define SENSOR_CHANNEL (3) // isp通道数 +#define SENSOR_HEIGHT (1280) // isp高度,ai输入,竖屏 +#define SENSOR_WIDTH (720) // isp宽度,ai输入,竖屏 +#define ISP_CHN0_WIDTH (1088)//(1920) +#define ISP_CHN0_HEIGHT (1920)//(1080) +#define vicap_install_osd (1) +#define osd_id K_VO_OSD3 +#define osd_width (1080) +#define osd_height (1920) +#endif + + +k_vb_config config; +k_vicap_dev vicap_dev; +k_vicap_chn vicap_chn; +k_vicap_dev_attr dev_attr; +k_vicap_chn_attr chn_attr; +k_vicap_sensor_info sensor_info; +k_vicap_sensor_type sensor_type; +k_mpp_chn vicap_mpp_chn; +k_mpp_chn vo_mpp_chn; + +k_video_frame_info dump_info; + +k_vo_draw_frame vo_frame = (k_vo_draw_frame) { + 1, + 16, + 16, + 128, + 128, + 1 +}; + +static k_vb_blk_handle block; +k_u32 g_pool_id; + +int vo_creat_layer_test(k_vo_layer chn_id, layer_info *info) +{ + k_vo_video_layer_attr attr; + + // check layer + if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) + || ((info->func != 0) && (chn_id == K_VO_LAYER2))) + { + printf("input layer num failed \n"); + return -1 ; + } + + // check scaler + + // set offset + attr.display_rect = info->offset; + // set act + attr.img_size = info->act_size; + // sget size + info->size = info->act_size.height * info->act_size.width * 3 / 2; + //set pixel format + attr.pixel_format = info->format; + if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) + { + printf("input pix format failed \n"); + return -1; + } + // set stride + attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); + // set function + attr.func = info->func; + // set scaler attr + attr.scaler_attr = info->attr; + + // set video layer atrr + kd_mpi_vo_set_video_layer_attr(chn_id, &attr); + + // enable layer + kd_mpi_vo_enable_video_layer(chn_id); + + return 0; +} + +k_vb_blk_handle vo_insert_frame(k_video_frame_info *vf_info, void **pic_vaddr) +{ + k_u64 phys_addr = 0; + k_u32 *virt_addr; + k_vb_blk_handle handle; + k_s32 size; + + if (vf_info == NULL) + return K_FALSE; + + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_8888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_8888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 4; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_565 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_565) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_4444 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_4444) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_1555 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_1555) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3 / 2; + + size = size + 4096; // 强制4K ,后边得删了 + + printf("vb block size is %x \n", size); + + handle = kd_mpi_vb_get_block(g_pool_id, size, NULL); + if (handle == VB_INVALID_HANDLE) + { + printf("%s get vb block error\n", __func__); + return K_FAILED; + } + + phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); + if (phys_addr == 0) + { + printf("%s get phys addr error\n", __func__); + return K_FAILED; + } + + virt_addr = (k_u32 *)kd_mpi_sys_mmap(phys_addr, size); + // virt_addr = (k_u32 *)kd_mpi_sys_mmap_cached(phys_addr, size); + + if (virt_addr == NULL) + { + printf("%s mmap error\n", __func__); + return K_FAILED; + } + + vf_info->mod_id = K_ID_VO; + vf_info->pool_id = g_pool_id; + vf_info->v_frame.phys_addr[0] = phys_addr; + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + vf_info->v_frame.phys_addr[1] = phys_addr + (vf_info->v_frame.height * vf_info->v_frame.stride[0]); + *pic_vaddr = virt_addr; + + printf("phys_addr is %lx g_pool_id is %d \n", phys_addr, g_pool_id); + + return handle; +} + +k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) +{ + k_vo_video_osd_attr attr; + + // set attr + attr.global_alptha = info->global_alptha; + + if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) + { + info->size = info->act_size.width * info->act_size.height * 4; + info->stride = info->act_size.width * 4 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) + { + info->size = info->act_size.width * info->act_size.height * 3; + info->stride = info->act_size.width * 3 / 8; + } + else if(info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if(info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else + { + printf("set osd pixel format failed \n"); + } + + attr.stride = info->stride; + attr.pixel_format = info->format; + attr.display_rect = info->offset; + attr.img_size = info->act_size; + kd_mpi_vo_set_video_osd_attr(osd, &attr); + + kd_mpi_vo_osd_enable(osd); + + return 0; +} + +void sample_vicap_install_osd(void) +{ + osd_info osd; + + osd.act_size.width = osd_width ; + osd.act_size.height = osd_height; + osd.offset.x = 0; + osd.offset.y = 0; + osd.global_alptha = 0xff; + // osd.global_alptha = 0x32; + osd.format = PIXEL_FORMAT_ARGB_8888;//PIXEL_FORMAT_ARGB_4444; //PIXEL_FORMAT_ARGB_1555;//PIXEL_FORMAT_ARGB_8888; + + vo_creat_osd_test(osd_id, &osd); +} + +void vo_osd_release_block(void) +{ + if(vicap_install_osd == 1) + { + kd_mpi_vo_osd_disable(osd_id); + kd_mpi_vb_release_block(block); + } + +} + +static k_s32 sample_connector_init(void) +{ + k_u32 ret = 0; + k_s32 connector_fd; +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#else + k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#endif + k_connector_info connector_info; + + memset(&connector_info, 0, sizeof(k_connector_info)); + + //connector get sensor info + ret = kd_mpi_get_connector_info(connector_type, &connector_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + + connector_fd = kd_mpi_connector_open(connector_info.connector_name); + if (connector_fd < 0) { + printf("%s, connector open failed.\n", __func__); + return K_ERR_VO_NOTREADY; + } + + // set connect power + kd_mpi_connector_power_set(connector_fd, K_TRUE); + // connector init + kd_mpi_connector_init(connector_fd, connector_info); + + return 0; +} + +static k_s32 vo_layer_vdss_bind_vo_config(void) +{ + layer_info info; + + k_vo_layer chn_id = K_VO_LAYER1; + + memset(&info, 0, sizeof(info)); + + sample_connector_init(); + + // config lyaer + info.act_size.width = ISP_CHN0_WIDTH;//ISP_CHN0_HEIGHT;//1080;//640;//1080; + info.act_size.height = ISP_CHN0_HEIGHT;//ISP_CHN0_WIDTH;//1920;//480;//1920; + info.format = PIXEL_FORMAT_YVU_PLANAR_420; + info.func = 0;//K_ROTATION_180;////K_ROTATION_90; + info.global_alptha = 0xff; + info.offset.x = 0;//(1080-w)/2, + info.offset.y = 0;//(1920-h)/2; + vo_creat_layer_test(chn_id, &info); + + if(vicap_install_osd == 1) + sample_vicap_install_osd(); + + //exit ; + return 0; +} + +static void sample_vicap_bind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) +{ + k_s32 ret; + + ret = kd_mpi_sys_bind(&vicap_mpp_chn, &vo_mpp_chn); + if (ret) { + printf("kd_mpi_sys_unbind failed:0x%x\n", ret); + } + + return; +} + +static void sample_vicap_unbind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) +{ + k_s32 ret; + + ret = kd_mpi_sys_unbind(&vicap_mpp_chn, &vo_mpp_chn); + if (ret) { + printf("kd_mpi_sys_unbind failed:0x%x\n", ret); + } + + return; +} + +int vivcap_start() +{ + k_s32 ret = 0; + + k_u32 pool_id; + k_vb_pool_config pool_config; + + printf("sample_vicap ...\n"); + +#if defined(CONFIG_BOARD_K230_CANMV) + sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; +#else + sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; +#endif + vicap_dev = VICAP_DEV_ID_0; + + memset(&config, 0, sizeof(config)); + config.max_pool_cnt = 64; + //VB for YUV420SP output + config.comm_pool[0].blk_cnt = 5; + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[0].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), VICAP_ALIGN_1K); + + //VB for RGB888 output + config.comm_pool[1].blk_cnt = 5; + config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[1].blk_size = VICAP_ALIGN_UP((SENSOR_HEIGHT * SENSOR_WIDTH * 3 ), VICAP_ALIGN_1K); + + ret = kd_mpi_vb_set_config(&config); + if (ret) { + printf("vb_set_config failed ret:%d\n", ret); + return ret; + } + + k_vb_supplement_config supplement_config; + memset(&supplement_config, 0, sizeof(supplement_config)); + supplement_config.supplement_config |= VB_SUPPLEMENT_JPEG_MASK; + + ret = kd_mpi_vb_set_supplement_config(&supplement_config); + if (ret) { + printf("vb_set_supplement_config failed ret:%d\n", ret); + return ret; + } + + ret = kd_mpi_vb_init(); + if (ret) { + printf("vb_init failed ret:%d\n", ret); + return ret; + } + printf("sample_vicap ...kd_mpi_vicap_get_sensor_info\n"); + + // dwc_dsi_init(); + vo_layer_vdss_bind_vo_config(); + + if(vicap_install_osd == 1) + { + memset(&pool_config, 0, sizeof(pool_config)); + pool_config.blk_size = VICAP_ALIGN_UP((osd_width * osd_height * 4 * 2), VICAP_ALIGN_1K); + pool_config.blk_cnt = 4; + pool_config.mode = VB_REMAP_MODE_NOCACHE; + pool_id = kd_mpi_vb_create_pool(&pool_config); // osd0 - 3 argb 320 x 240 + g_pool_id = pool_id; + + printf("--------aa--------------g_pool_id is %d pool_id is %d \n",g_pool_id, pool_id); + } + + memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); + ret = kd_mpi_vicap_get_sensor_info(sensor_type, &sensor_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + + memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); + dev_attr.acq_win.h_start = 0; + dev_attr.acq_win.v_start = 0; +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + dev_attr.acq_win.width = ISP_CHN0_WIDTH; + dev_attr.acq_win.height = ISP_CHN0_HEIGHT; +#else + dev_attr.acq_win.width = 2592;//SENSOR_HEIGHT; + dev_attr.acq_win.height = 1944;//SENSOR_WIDTH; +#endif + dev_attr.mode = VICAP_WORK_ONLINE_MODE; + + dev_attr.pipe_ctrl.data = 0xFFFFFFFF; + dev_attr.pipe_ctrl.bits.af_enable = 0; + dev_attr.pipe_ctrl.bits.ahdr_enable = 0; + + + dev_attr.cpature_frame = 0; + memcpy(&dev_attr.sensor_info, &sensor_info, sizeof(k_vicap_sensor_info)); + + ret = kd_mpi_vicap_set_dev_attr(vicap_dev, dev_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_dev_attr failed.\n"); + return ret; + } + + memset(&chn_attr, 0, sizeof(k_vicap_chn_attr)); + + //set chn0 output yuv420sp + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = ISP_CHN0_WIDTH; + chn_attr.out_win.height = ISP_CHN0_HEIGHT; + + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + chn_attr.crop_win = dev_attr.acq_win; +#else + // chn_attr.crop_win = dev_attr.acq_win; + chn_attr.crop_win.h_start = 768; + chn_attr.crop_win.v_start = 16; + chn_attr.crop_win.width = ISP_CHN0_WIDTH; + chn_attr.crop_win.height = ISP_CHN0_HEIGHT; +#endif + + chn_attr.scale_win = chn_attr.out_win; + chn_attr.crop_enable = K_FALSE; + chn_attr.scale_enable = K_FALSE; + // chn_attr.dw_enable = K_FALSE; + chn_attr.chn_enable = K_TRUE; + chn_attr.pix_format = PIXEL_FORMAT_YVU_PLANAR_420; + chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp + chn_attr.buffer_size = config.comm_pool[0].blk_size; + vicap_chn = VICAP_CHN_ID_0; + + printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); + ret = kd_mpi_vicap_set_chn_attr(vicap_dev, vicap_chn, chn_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); + return ret; + } + + //bind vicap chn 0 to vo + vicap_mpp_chn.mod_id = K_ID_VI; + vicap_mpp_chn.dev_id = vicap_dev; + vicap_mpp_chn.chn_id = vicap_chn; + + vo_mpp_chn.mod_id = K_ID_VO; + vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; + vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; + + sample_vicap_bind_vo(vicap_mpp_chn, vo_mpp_chn); + printf("sample_vicap ...dwc_dsi_init\n"); + + //set chn1 output rgb888p + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = SENSOR_WIDTH ; + chn_attr.out_win.height = SENSOR_HEIGHT; + // chn_attr.crop_win = dev_attr.acq_win; + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + chn_attr.crop_win = dev_attr.acq_win; +#else + chn_attr.crop_win.h_start = 768; + chn_attr.crop_win.v_start = 16; + chn_attr.crop_win.width = ISP_CHN0_WIDTH; + chn_attr.crop_win.height = ISP_CHN0_HEIGHT; +#endif + + chn_attr.scale_win = chn_attr.out_win; + chn_attr.crop_enable = K_FALSE; + chn_attr.scale_enable = K_FALSE; + // chn_attr.dw_enable = K_FALSE; + chn_attr.chn_enable = K_TRUE; + chn_attr.pix_format = PIXEL_FORMAT_BGR_888_PLANAR; + chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp + chn_attr.buffer_size = config.comm_pool[1].blk_size; + + printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); + ret = kd_mpi_vicap_set_chn_attr(vicap_dev, VICAP_CHN_ID_1, chn_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); + return ret; + } + + printf("sample_vicap ...kd_mpi_vicap_init\n"); + ret = kd_mpi_vicap_init(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + // goto err_exit; + } + + printf("sample_vicap ...kd_mpi_vicap_start_stream\n"); + ret = kd_mpi_vicap_start_stream(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + // goto err_exit; + } + + return ret; +} + +int vivcap_stop() +{ + printf("sample_vicap ...kd_mpi_vicap_stop_stream\n"); + int ret = kd_mpi_vicap_stop_stream(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + return ret; + } + + ret = kd_mpi_vicap_deinit(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_deinit failed.\n"); + return ret; + } + + kd_mpi_vo_disable_video_layer(K_VO_LAYER1); + + vicap_mpp_chn.mod_id = K_ID_VI; + vicap_mpp_chn.dev_id = vicap_dev; + vicap_mpp_chn.chn_id = vicap_chn; + + vo_mpp_chn.mod_id = K_ID_VO; + vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; + vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; + + sample_vicap_unbind_vo(vicap_mpp_chn, vo_mpp_chn); + + /*Allow one frame time for the VO to release the VB block*/ + k_u32 display_ms = 1000 / 33; + usleep(1000 * display_ms); + + ret = kd_mpi_vb_exit(); + if (ret) { + printf("sample_vicap, kd_mpi_vb_exit failed.\n"); + return ret; + } + + return 0; +} + +void yuv_rotate_90(char *des, char *src,int width,int height) +{ + int n = 0; + int hw = width>>1; + int hh = height>>1; + int size = width * height; + int hsize = size>>2; + + int pos = 0; + + for(int i = width-1;i >= 0;i--) + { + pos = 0; + for(int j= 0;j < height;j++) + { + des[n++]= src[pos+i]; + pos += width; + } + } + } \ No newline at end of file diff --git a/src/reference/ai_poc/sq_handkp_det/hand_detection.cc b/src/reference/ai_poc/sq_handkp_det/hand_detection.cc index d61795244..7b861b2ee 100644 --- a/src/reference/ai_poc/sq_handkp_det/hand_detection.cc +++ b/src/reference/ai_poc/sq_handkp_det/hand_detection.cc @@ -178,7 +178,7 @@ std::vector HandDetection::decode_infer(float *data, int stride, FrameS box.y1 = std::max(0, std::min(int(frame_size.height), int(cy - h / 2.f))); box.x2 = std::max(0, std::min(int(frame_size.width), int(cx + w / 2.f))); box.y2 = std::max(0, std::min(int(frame_size.height), int(cy + h / 2.f))); - #if defined(CONFIG_BOARD_K230_CANMV) + #if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) if (abs(box.y1-box.y2)< 0.1*frame_size.height) continue; if ((abs(box.x1-box.x2)< 0.25*frame_size.width) && ((box.x1 < 0.03*frame_size.width) || (box.x2 > 0.97*frame_size.width))) diff --git a/src/reference/ai_poc/sq_handkp_det/vi_vo.h b/src/reference/ai_poc/sq_handkp_det/vi_vo.h index e3d8bdba4..0a11a4d31 100644 --- a/src/reference/ai_poc/sq_handkp_det/vi_vo.h +++ b/src/reference/ai_poc/sq_handkp_det/vi_vo.h @@ -1,627 +1,628 @@ -/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include -#include -#include - -#include "mpi_sys_api.h" - -/* vicap */ -#include -#include -#include -#include -#include - -#include "k_module.h" -#include "k_type.h" -#include "k_vb_comm.h" -#include "k_video_comm.h" -#include "k_sys_comm.h" -#include "mpi_vb_api.h" -#include "mpi_vicap_api.h" -#include "mpi_isp_api.h" -#include "mpi_sys_api.h" -#include "k_vo_comm.h" -#include "mpi_vo_api.h" - -#include "vo_test_case.h" - -#include "k_connector_comm.h" -#include "mpi_connector_api.h" -#include "k_autoconf_comm.h" - - -#if defined(CONFIG_BOARD_K230_CANMV) -#define SENSOR_CHANNEL (3) // isp通道数 -#define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 -#define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 -#define ISP_CHN0_WIDTH (1920)//(1920) -#define ISP_CHN0_HEIGHT (1080)//(1080) -#define vicap_install_osd (1) -#define osd_id K_VO_OSD3 -#define osd_width (1920) -#define osd_height (1080) -#else -#define SENSOR_CHANNEL (3) // isp通道数 -#define SENSOR_HEIGHT (1280) // isp高度,ai输入,竖屏 -#define SENSOR_WIDTH (720) // isp宽度,ai输入,竖屏 -#define ISP_CHN0_WIDTH (1088)//(1920) -#define ISP_CHN0_HEIGHT (1920)//(1080) -#define vicap_install_osd (1) -#define osd_id K_VO_OSD3 -#define osd_width (1080) -#define osd_height (1920) -#endif - - -k_vb_config config; -k_vicap_dev vicap_dev; -k_vicap_chn vicap_chn; -k_vicap_dev_attr dev_attr; -k_vicap_chn_attr chn_attr; -k_vicap_sensor_info sensor_info; -k_vicap_sensor_type sensor_type; -k_mpp_chn vicap_mpp_chn; -k_mpp_chn vo_mpp_chn; - -k_video_frame_info dump_info; - -k_vo_draw_frame vo_frame = (k_vo_draw_frame) { - 1, - 16, - 16, - 128, - 128, - 1 -}; - -static k_vb_blk_handle block; -k_u32 g_pool_id; - -int vo_creat_layer_test(k_vo_layer chn_id, layer_info *info) -{ - k_vo_video_layer_attr attr; - - // check layer - if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) - || ((info->func != 0) && (chn_id == K_VO_LAYER2))) - { - printf("input layer num failed \n"); - return -1 ; - } - - // check scaler - - // set offset - attr.display_rect = info->offset; - // set act - attr.img_size = info->act_size; - // sget size - info->size = info->act_size.height * info->act_size.width * 3 / 2; - //set pixel format - attr.pixel_format = info->format; - if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) - { - printf("input pix format failed \n"); - return -1; - } - // set stride - attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); - // set function - attr.func = info->func; - // set scaler attr - attr.scaler_attr = info->attr; - - // set video layer atrr - kd_mpi_vo_set_video_layer_attr(chn_id, &attr); - - // enable layer - kd_mpi_vo_enable_video_layer(chn_id); - - return 0; -} - -k_vb_blk_handle vo_insert_frame(k_video_frame_info *vf_info, void **pic_vaddr) -{ - k_u64 phys_addr = 0; - k_u32 *virt_addr; - k_vb_blk_handle handle; - k_s32 size; - - if (vf_info == NULL) - return K_FALSE; - - if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_8888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_8888) - size = vf_info->v_frame.height * vf_info->v_frame.width * 4; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_565 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_565) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_4444 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_4444) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_888) - size = vf_info->v_frame.height * vf_info->v_frame.width * 3; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_1555 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_1555) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) - size = vf_info->v_frame.height * vf_info->v_frame.width * 3 / 2; - - size = size + 4096; // 强制4K ,后边得删了 - - printf("vb block size is %x \n", size); - - handle = kd_mpi_vb_get_block(g_pool_id, size, NULL); - if (handle == VB_INVALID_HANDLE) - { - printf("%s get vb block error\n", __func__); - return K_FAILED; - } - - phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); - if (phys_addr == 0) - { - printf("%s get phys addr error\n", __func__); - return K_FAILED; - } - - virt_addr = (k_u32 *)kd_mpi_sys_mmap(phys_addr, size); - // virt_addr = (k_u32 *)kd_mpi_sys_mmap_cached(phys_addr, size); - - if (virt_addr == NULL) - { - printf("%s mmap error\n", __func__); - return K_FAILED; - } - - vf_info->mod_id = K_ID_VO; - vf_info->pool_id = g_pool_id; - vf_info->v_frame.phys_addr[0] = phys_addr; - if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) - vf_info->v_frame.phys_addr[1] = phys_addr + (vf_info->v_frame.height * vf_info->v_frame.stride[0]); - *pic_vaddr = virt_addr; - - printf("phys_addr is %lx g_pool_id is %d \n", phys_addr, g_pool_id); - - return handle; -} - -k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) -{ - k_vo_video_osd_attr attr; - - // set attr - attr.global_alptha = info->global_alptha; - - if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) - { - info->size = info->act_size.width * info->act_size.height * 4; - info->stride = info->act_size.width * 4 / 8; - } - else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) - { - info->size = info->act_size.width * info->act_size.height * 3; - info->stride = info->act_size.width * 3 / 8; - } - else if(info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else if(info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else - { - printf("set osd pixel format failed \n"); - } - - attr.stride = info->stride; - attr.pixel_format = info->format; - attr.display_rect = info->offset; - attr.img_size = info->act_size; - kd_mpi_vo_set_video_osd_attr(osd, &attr); - - kd_mpi_vo_osd_enable(osd); - - return 0; -} - -void sample_vicap_install_osd(void) -{ - osd_info osd; - - osd.act_size.width = osd_width ; - osd.act_size.height = osd_height; - osd.offset.x = 0; - osd.offset.y = 0; - osd.global_alptha = 0xff; - // osd.global_alptha = 0x32; - osd.format = PIXEL_FORMAT_ARGB_8888;//PIXEL_FORMAT_ARGB_4444; //PIXEL_FORMAT_ARGB_1555;//PIXEL_FORMAT_ARGB_8888; - - vo_creat_osd_test(osd_id, &osd); -} - -void vo_osd_release_block(void) -{ - if(vicap_install_osd == 1) - { - kd_mpi_vo_osd_disable(osd_id); - kd_mpi_vb_release_block(block); - } - -} - -static k_s32 sample_connector_init(void) -{ - k_u32 ret = 0; - k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) - k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; -#else - k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; -#endif - k_connector_info connector_info; - - memset(&connector_info, 0, sizeof(k_connector_info)); - - //connector get sensor info - ret = kd_mpi_get_connector_info(connector_type, &connector_info); - if (ret) { - printf("sample_vicap, the sensor type not supported!\n"); - return ret; - } - - connector_fd = kd_mpi_connector_open(connector_info.connector_name); - if (connector_fd < 0) { - printf("%s, connector open failed.\n", __func__); - return K_ERR_VO_NOTREADY; - } - - // set connect power - kd_mpi_connector_power_set(connector_fd, K_TRUE); - // connector init - kd_mpi_connector_init(connector_fd, connector_info); - - return 0; -} - -static k_s32 vo_layer_vdss_bind_vo_config(void) -{ - layer_info info; - - k_vo_layer chn_id = K_VO_LAYER1; - - memset(&info, 0, sizeof(info)); - - sample_connector_init(); - - // config lyaer - info.act_size.width = ISP_CHN0_WIDTH;//ISP_CHN0_HEIGHT;//1080;//640;//1080; - info.act_size.height = ISP_CHN0_HEIGHT;//ISP_CHN0_WIDTH;//1920;//480;//1920; - info.format = PIXEL_FORMAT_YVU_PLANAR_420; - info.func = 0;//K_ROTATION_180;////K_ROTATION_90; - info.global_alptha = 0xff; - info.offset.x = 0;//(1080-w)/2, - info.offset.y = 0;//(1920-h)/2; - vo_creat_layer_test(chn_id, &info); - - if(vicap_install_osd == 1) - sample_vicap_install_osd(); - - //exit ; - return 0; -} - -static void sample_vicap_bind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) -{ - k_s32 ret; - - ret = kd_mpi_sys_bind(&vicap_mpp_chn, &vo_mpp_chn); - if (ret) { - printf("kd_mpi_sys_unbind failed:0x%x\n", ret); - } - - return; -} - -static void sample_vicap_unbind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) -{ - k_s32 ret; - - ret = kd_mpi_sys_unbind(&vicap_mpp_chn, &vo_mpp_chn); - if (ret) { - printf("kd_mpi_sys_unbind failed:0x%x\n", ret); - } - - return; -} - -int vivcap_start() -{ - k_s32 ret = 0; - - k_u32 pool_id; - k_vb_pool_config pool_config; - - printf("sample_vicap ...\n"); - -#if defined(CONFIG_BOARD_K230_CANMV) - sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); -#else - sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; -#endif - vicap_dev = VICAP_DEV_ID_0; - - memset(&config, 0, sizeof(config)); - config.max_pool_cnt = 64; - //VB for YUV420SP output - config.comm_pool[0].blk_cnt = 5; - config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; - config.comm_pool[0].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), VICAP_ALIGN_1K); - - //VB for RGB888 output - config.comm_pool[1].blk_cnt = 5; - config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; - config.comm_pool[1].blk_size = VICAP_ALIGN_UP((SENSOR_HEIGHT * SENSOR_WIDTH * 3 ), VICAP_ALIGN_1K); - - ret = kd_mpi_vb_set_config(&config); - if (ret) { - printf("vb_set_config failed ret:%d\n", ret); - return ret; - } - - k_vb_supplement_config supplement_config; - memset(&supplement_config, 0, sizeof(supplement_config)); - supplement_config.supplement_config |= VB_SUPPLEMENT_JPEG_MASK; - - ret = kd_mpi_vb_set_supplement_config(&supplement_config); - if (ret) { - printf("vb_set_supplement_config failed ret:%d\n", ret); - return ret; - } - - ret = kd_mpi_vb_init(); - if (ret) { - printf("vb_init failed ret:%d\n", ret); - return ret; - } - printf("sample_vicap ...kd_mpi_vicap_get_sensor_info\n"); - - // dwc_dsi_init(); - vo_layer_vdss_bind_vo_config(); - - if(vicap_install_osd == 1) - { - memset(&pool_config, 0, sizeof(pool_config)); - pool_config.blk_size = VICAP_ALIGN_UP((osd_width * osd_height * 4 * 2), VICAP_ALIGN_1K); - pool_config.blk_cnt = 4; - pool_config.mode = VB_REMAP_MODE_NOCACHE; - pool_id = kd_mpi_vb_create_pool(&pool_config); // osd0 - 3 argb 320 x 240 - g_pool_id = pool_id; - - printf("--------aa--------------g_pool_id is %d pool_id is %d \n",g_pool_id, pool_id); - } - - memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); - ret = kd_mpi_vicap_get_sensor_info(sensor_type, &sensor_info); - if (ret) { - printf("sample_vicap, the sensor type not supported!\n"); - return ret; - } - - memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); - dev_attr.acq_win.h_start = 0; - dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) - dev_attr.acq_win.width = ISP_CHN0_WIDTH; - dev_attr.acq_win.height = ISP_CHN0_HEIGHT; -#else - dev_attr.acq_win.width = 2592;//SENSOR_HEIGHT; - dev_attr.acq_win.height = 1944;//SENSOR_WIDTH; -#endif - dev_attr.mode = VICAP_WORK_ONLINE_MODE; - - dev_attr.pipe_ctrl.data = 0xFFFFFFFF; - dev_attr.pipe_ctrl.bits.af_enable = 0; - dev_attr.pipe_ctrl.bits.ahdr_enable = 0; - - - dev_attr.cpature_frame = 0; - memcpy(&dev_attr.sensor_info, &sensor_info, sizeof(k_vicap_sensor_info)); - - ret = kd_mpi_vicap_set_dev_attr(vicap_dev, dev_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_dev_attr failed.\n"); - return ret; - } - - memset(&chn_attr, 0, sizeof(k_vicap_chn_attr)); - - //set chn0 output yuv420sp - chn_attr.out_win.h_start = 0; - chn_attr.out_win.v_start = 0; - chn_attr.out_win.width = ISP_CHN0_WIDTH; - chn_attr.out_win.height = ISP_CHN0_HEIGHT; - - -#if defined(CONFIG_BOARD_K230_CANMV) - chn_attr.crop_win = dev_attr.acq_win; -#else - // chn_attr.crop_win = dev_attr.acq_win; - chn_attr.crop_win.h_start = 768; - chn_attr.crop_win.v_start = 16; - chn_attr.crop_win.width = ISP_CHN0_WIDTH; - chn_attr.crop_win.height = ISP_CHN0_HEIGHT; -#endif - - chn_attr.scale_win = chn_attr.out_win; - chn_attr.crop_enable = K_FALSE; - chn_attr.scale_enable = K_FALSE; - // chn_attr.dw_enable = K_FALSE; - chn_attr.chn_enable = K_TRUE; - chn_attr.pix_format = PIXEL_FORMAT_YVU_PLANAR_420; - chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp - chn_attr.buffer_size = config.comm_pool[0].blk_size; - vicap_chn = VICAP_CHN_ID_0; - - printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); - ret = kd_mpi_vicap_set_chn_attr(vicap_dev, vicap_chn, chn_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); - return ret; - } - - //bind vicap chn 0 to vo - vicap_mpp_chn.mod_id = K_ID_VI; - vicap_mpp_chn.dev_id = vicap_dev; - vicap_mpp_chn.chn_id = vicap_chn; - - vo_mpp_chn.mod_id = K_ID_VO; - vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; - vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; - - sample_vicap_bind_vo(vicap_mpp_chn, vo_mpp_chn); - printf("sample_vicap ...dwc_dsi_init\n"); - - //set chn1 output rgb888p - chn_attr.out_win.h_start = 0; - chn_attr.out_win.v_start = 0; - chn_attr.out_win.width = SENSOR_WIDTH ; - chn_attr.out_win.height = SENSOR_HEIGHT; - // chn_attr.crop_win = dev_attr.acq_win; - -#if defined(CONFIG_BOARD_K230_CANMV) - chn_attr.crop_win = dev_attr.acq_win; -#else - chn_attr.crop_win.h_start = 768; - chn_attr.crop_win.v_start = 16; - chn_attr.crop_win.width = ISP_CHN0_WIDTH; - chn_attr.crop_win.height = ISP_CHN0_HEIGHT; -#endif - - chn_attr.scale_win = chn_attr.out_win; - chn_attr.crop_enable = K_FALSE; - chn_attr.scale_enable = K_FALSE; - // chn_attr.dw_enable = K_FALSE; - chn_attr.chn_enable = K_TRUE; - chn_attr.pix_format = PIXEL_FORMAT_BGR_888_PLANAR; - chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp - chn_attr.buffer_size = config.comm_pool[1].blk_size; - - printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); - ret = kd_mpi_vicap_set_chn_attr(vicap_dev, VICAP_CHN_ID_1, chn_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); - return ret; - } - - printf("sample_vicap ...kd_mpi_vicap_init\n"); - ret = kd_mpi_vicap_init(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - // goto err_exit; - } - - printf("sample_vicap ...kd_mpi_vicap_start_stream\n"); - ret = kd_mpi_vicap_start_stream(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - // goto err_exit; - } - - return ret; -} - -int vivcap_stop() -{ - printf("sample_vicap ...kd_mpi_vicap_stop_stream\n"); - int ret = kd_mpi_vicap_stop_stream(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - return ret; - } - - ret = kd_mpi_vicap_deinit(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_deinit failed.\n"); - return ret; - } - - kd_mpi_vo_disable_video_layer(K_VO_LAYER1); - - vicap_mpp_chn.mod_id = K_ID_VI; - vicap_mpp_chn.dev_id = vicap_dev; - vicap_mpp_chn.chn_id = vicap_chn; - - vo_mpp_chn.mod_id = K_ID_VO; - vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; - vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; - - sample_vicap_unbind_vo(vicap_mpp_chn, vo_mpp_chn); - - /*Allow one frame time for the VO to release the VB block*/ - k_u32 display_ms = 1000 / 33; - usleep(1000 * display_ms); - - ret = kd_mpi_vb_exit(); - if (ret) { - printf("sample_vicap, kd_mpi_vb_exit failed.\n"); - return ret; - } - - return 0; -} - -void yuv_rotate_90(char *des, char *src,int width,int height) -{ - int n = 0; - int hw = width>>1; - int hh = height>>1; - int size = width * height; - int hsize = size>>2; - - int pos = 0; - - for(int i = width-1;i >= 0;i--) - { - pos = 0; - for(int j= 0;j < height;j++) - { - des[n++]= src[pos+i]; - pos += width; - } - } - +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include + +#include "mpi_sys_api.h" + +/* vicap */ +#include +#include +#include +#include +#include + +#include "k_module.h" +#include "k_type.h" +#include "k_vb_comm.h" +#include "k_video_comm.h" +#include "k_sys_comm.h" +#include "mpi_vb_api.h" +#include "mpi_vicap_api.h" +#include "mpi_isp_api.h" +#include "mpi_sys_api.h" +#include "k_vo_comm.h" +#include "mpi_vo_api.h" + +#include "vo_test_case.h" + +#include "k_connector_comm.h" +#include "mpi_connector_api.h" +#include "k_autoconf_comm.h" + + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) +#define SENSOR_CHANNEL (3) // isp通道数 +#define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 +#define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 +#define ISP_CHN0_WIDTH (1920)//(1920) +#define ISP_CHN0_HEIGHT (1080)//(1080) +#define vicap_install_osd (1) +#define osd_id K_VO_OSD3 +#define osd_width (1920) +#define osd_height (1080) +#else +#define SENSOR_CHANNEL (3) // isp通道数 +#define SENSOR_HEIGHT (1280) // isp高度,ai输入,竖屏 +#define SENSOR_WIDTH (720) // isp宽度,ai输入,竖屏 +#define ISP_CHN0_WIDTH (1088)//(1920) +#define ISP_CHN0_HEIGHT (1920)//(1080) +#define vicap_install_osd (1) +#define osd_id K_VO_OSD3 +#define osd_width (1080) +#define osd_height (1920) +#endif + + +k_vb_config config; +k_vicap_dev vicap_dev; +k_vicap_chn vicap_chn; +k_vicap_dev_attr dev_attr; +k_vicap_chn_attr chn_attr; +k_vicap_sensor_info sensor_info; +k_vicap_sensor_type sensor_type; +k_mpp_chn vicap_mpp_chn; +k_mpp_chn vo_mpp_chn; + +k_video_frame_info dump_info; + +k_vo_draw_frame vo_frame = (k_vo_draw_frame) { + 1, + 16, + 16, + 128, + 128, + 1 +}; + +static k_vb_blk_handle block; +k_u32 g_pool_id; + +int vo_creat_layer_test(k_vo_layer chn_id, layer_info *info) +{ + k_vo_video_layer_attr attr; + + // check layer + if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) + || ((info->func != 0) && (chn_id == K_VO_LAYER2))) + { + printf("input layer num failed \n"); + return -1 ; + } + + // check scaler + + // set offset + attr.display_rect = info->offset; + // set act + attr.img_size = info->act_size; + // sget size + info->size = info->act_size.height * info->act_size.width * 3 / 2; + //set pixel format + attr.pixel_format = info->format; + if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) + { + printf("input pix format failed \n"); + return -1; + } + // set stride + attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); + // set function + attr.func = info->func; + // set scaler attr + attr.scaler_attr = info->attr; + + // set video layer atrr + kd_mpi_vo_set_video_layer_attr(chn_id, &attr); + + // enable layer + kd_mpi_vo_enable_video_layer(chn_id); + + return 0; +} + +k_vb_blk_handle vo_insert_frame(k_video_frame_info *vf_info, void **pic_vaddr) +{ + k_u64 phys_addr = 0; + k_u32 *virt_addr; + k_vb_blk_handle handle; + k_s32 size; + + if (vf_info == NULL) + return K_FALSE; + + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_8888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_8888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 4; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_565 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_565) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_4444 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_4444) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_1555 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_1555) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3 / 2; + + size = size + 4096; // 强制4K ,后边得删了 + + printf("vb block size is %x \n", size); + + handle = kd_mpi_vb_get_block(g_pool_id, size, NULL); + if (handle == VB_INVALID_HANDLE) + { + printf("%s get vb block error\n", __func__); + return K_FAILED; + } + + phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); + if (phys_addr == 0) + { + printf("%s get phys addr error\n", __func__); + return K_FAILED; + } + + virt_addr = (k_u32 *)kd_mpi_sys_mmap(phys_addr, size); + // virt_addr = (k_u32 *)kd_mpi_sys_mmap_cached(phys_addr, size); + + if (virt_addr == NULL) + { + printf("%s mmap error\n", __func__); + return K_FAILED; + } + + vf_info->mod_id = K_ID_VO; + vf_info->pool_id = g_pool_id; + vf_info->v_frame.phys_addr[0] = phys_addr; + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + vf_info->v_frame.phys_addr[1] = phys_addr + (vf_info->v_frame.height * vf_info->v_frame.stride[0]); + *pic_vaddr = virt_addr; + + printf("phys_addr is %lx g_pool_id is %d \n", phys_addr, g_pool_id); + + return handle; +} + +k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) +{ + k_vo_video_osd_attr attr; + + // set attr + attr.global_alptha = info->global_alptha; + + if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) + { + info->size = info->act_size.width * info->act_size.height * 4; + info->stride = info->act_size.width * 4 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) + { + info->size = info->act_size.width * info->act_size.height * 3; + info->stride = info->act_size.width * 3 / 8; + } + else if(info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if(info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else + { + printf("set osd pixel format failed \n"); + } + + attr.stride = info->stride; + attr.pixel_format = info->format; + attr.display_rect = info->offset; + attr.img_size = info->act_size; + kd_mpi_vo_set_video_osd_attr(osd, &attr); + + kd_mpi_vo_osd_enable(osd); + + return 0; +} + +void sample_vicap_install_osd(void) +{ + osd_info osd; + + osd.act_size.width = osd_width ; + osd.act_size.height = osd_height; + osd.offset.x = 0; + osd.offset.y = 0; + osd.global_alptha = 0xff; + // osd.global_alptha = 0x32; + osd.format = PIXEL_FORMAT_ARGB_8888;//PIXEL_FORMAT_ARGB_4444; //PIXEL_FORMAT_ARGB_1555;//PIXEL_FORMAT_ARGB_8888; + + vo_creat_osd_test(osd_id, &osd); +} + +void vo_osd_release_block(void) +{ + if(vicap_install_osd == 1) + { + kd_mpi_vo_osd_disable(osd_id); + kd_mpi_vb_release_block(block); + } + +} + +static k_s32 sample_connector_init(void) +{ + k_u32 ret = 0; + k_s32 connector_fd; +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#else + k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#endif + k_connector_info connector_info; + + memset(&connector_info, 0, sizeof(k_connector_info)); + + //connector get sensor info + ret = kd_mpi_get_connector_info(connector_type, &connector_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + + connector_fd = kd_mpi_connector_open(connector_info.connector_name); + if (connector_fd < 0) { + printf("%s, connector open failed.\n", __func__); + return K_ERR_VO_NOTREADY; + } + + // set connect power + kd_mpi_connector_power_set(connector_fd, K_TRUE); + // connector init + kd_mpi_connector_init(connector_fd, connector_info); + + return 0; +} + +static k_s32 vo_layer_vdss_bind_vo_config(void) +{ + layer_info info; + + k_vo_layer chn_id = K_VO_LAYER1; + + memset(&info, 0, sizeof(info)); + + sample_connector_init(); + + // config lyaer + info.act_size.width = ISP_CHN0_WIDTH;//ISP_CHN0_HEIGHT;//1080;//640;//1080; + info.act_size.height = ISP_CHN0_HEIGHT;//ISP_CHN0_WIDTH;//1920;//480;//1920; + info.format = PIXEL_FORMAT_YVU_PLANAR_420; + info.func = 0;//K_ROTATION_180;////K_ROTATION_90; + info.global_alptha = 0xff; + info.offset.x = 0;//(1080-w)/2, + info.offset.y = 0;//(1920-h)/2; + vo_creat_layer_test(chn_id, &info); + + if(vicap_install_osd == 1) + sample_vicap_install_osd(); + + //exit ; + return 0; +} + +static void sample_vicap_bind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) +{ + k_s32 ret; + + ret = kd_mpi_sys_bind(&vicap_mpp_chn, &vo_mpp_chn); + if (ret) { + printf("kd_mpi_sys_unbind failed:0x%x\n", ret); + } + + return; +} + +static void sample_vicap_unbind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) +{ + k_s32 ret; + + ret = kd_mpi_sys_unbind(&vicap_mpp_chn, &vo_mpp_chn); + if (ret) { + printf("kd_mpi_sys_unbind failed:0x%x\n", ret); + } + + return; +} + +int vivcap_start() +{ + k_s32 ret = 0; + + k_u32 pool_id; + k_vb_pool_config pool_config; + + printf("sample_vicap ...\n"); + +#if defined(CONFIG_BOARD_K230_CANMV) + sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; +#else + sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; +#endif + vicap_dev = VICAP_DEV_ID_0; + + memset(&config, 0, sizeof(config)); + config.max_pool_cnt = 64; + //VB for YUV420SP output + config.comm_pool[0].blk_cnt = 5; + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[0].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), VICAP_ALIGN_1K); + + //VB for RGB888 output + config.comm_pool[1].blk_cnt = 5; + config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[1].blk_size = VICAP_ALIGN_UP((SENSOR_HEIGHT * SENSOR_WIDTH * 3 ), VICAP_ALIGN_1K); + + ret = kd_mpi_vb_set_config(&config); + if (ret) { + printf("vb_set_config failed ret:%d\n", ret); + return ret; + } + + k_vb_supplement_config supplement_config; + memset(&supplement_config, 0, sizeof(supplement_config)); + supplement_config.supplement_config |= VB_SUPPLEMENT_JPEG_MASK; + + ret = kd_mpi_vb_set_supplement_config(&supplement_config); + if (ret) { + printf("vb_set_supplement_config failed ret:%d\n", ret); + return ret; + } + + ret = kd_mpi_vb_init(); + if (ret) { + printf("vb_init failed ret:%d\n", ret); + return ret; + } + printf("sample_vicap ...kd_mpi_vicap_get_sensor_info\n"); + + // dwc_dsi_init(); + vo_layer_vdss_bind_vo_config(); + + if(vicap_install_osd == 1) + { + memset(&pool_config, 0, sizeof(pool_config)); + pool_config.blk_size = VICAP_ALIGN_UP((osd_width * osd_height * 4 * 2), VICAP_ALIGN_1K); + pool_config.blk_cnt = 4; + pool_config.mode = VB_REMAP_MODE_NOCACHE; + pool_id = kd_mpi_vb_create_pool(&pool_config); // osd0 - 3 argb 320 x 240 + g_pool_id = pool_id; + + printf("--------aa--------------g_pool_id is %d pool_id is %d \n",g_pool_id, pool_id); + } + + memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); + ret = kd_mpi_vicap_get_sensor_info(sensor_type, &sensor_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + + memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); + dev_attr.acq_win.h_start = 0; + dev_attr.acq_win.v_start = 0; +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + dev_attr.acq_win.width = ISP_CHN0_WIDTH; + dev_attr.acq_win.height = ISP_CHN0_HEIGHT; +#else + dev_attr.acq_win.width = 2592;//SENSOR_HEIGHT; + dev_attr.acq_win.height = 1944;//SENSOR_WIDTH; +#endif + dev_attr.mode = VICAP_WORK_ONLINE_MODE; + + dev_attr.pipe_ctrl.data = 0xFFFFFFFF; + dev_attr.pipe_ctrl.bits.af_enable = 0; + dev_attr.pipe_ctrl.bits.ahdr_enable = 0; + + + dev_attr.cpature_frame = 0; + memcpy(&dev_attr.sensor_info, &sensor_info, sizeof(k_vicap_sensor_info)); + + ret = kd_mpi_vicap_set_dev_attr(vicap_dev, dev_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_dev_attr failed.\n"); + return ret; + } + + memset(&chn_attr, 0, sizeof(k_vicap_chn_attr)); + + //set chn0 output yuv420sp + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = ISP_CHN0_WIDTH; + chn_attr.out_win.height = ISP_CHN0_HEIGHT; + + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + chn_attr.crop_win = dev_attr.acq_win; +#else + // chn_attr.crop_win = dev_attr.acq_win; + chn_attr.crop_win.h_start = 768; + chn_attr.crop_win.v_start = 16; + chn_attr.crop_win.width = ISP_CHN0_WIDTH; + chn_attr.crop_win.height = ISP_CHN0_HEIGHT; +#endif + + chn_attr.scale_win = chn_attr.out_win; + chn_attr.crop_enable = K_FALSE; + chn_attr.scale_enable = K_FALSE; + // chn_attr.dw_enable = K_FALSE; + chn_attr.chn_enable = K_TRUE; + chn_attr.pix_format = PIXEL_FORMAT_YVU_PLANAR_420; + chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp + chn_attr.buffer_size = config.comm_pool[0].blk_size; + vicap_chn = VICAP_CHN_ID_0; + + printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); + ret = kd_mpi_vicap_set_chn_attr(vicap_dev, vicap_chn, chn_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); + return ret; + } + + //bind vicap chn 0 to vo + vicap_mpp_chn.mod_id = K_ID_VI; + vicap_mpp_chn.dev_id = vicap_dev; + vicap_mpp_chn.chn_id = vicap_chn; + + vo_mpp_chn.mod_id = K_ID_VO; + vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; + vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; + + sample_vicap_bind_vo(vicap_mpp_chn, vo_mpp_chn); + printf("sample_vicap ...dwc_dsi_init\n"); + + //set chn1 output rgb888p + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = SENSOR_WIDTH ; + chn_attr.out_win.height = SENSOR_HEIGHT; + // chn_attr.crop_win = dev_attr.acq_win; + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + chn_attr.crop_win = dev_attr.acq_win; +#else + chn_attr.crop_win.h_start = 768; + chn_attr.crop_win.v_start = 16; + chn_attr.crop_win.width = ISP_CHN0_WIDTH; + chn_attr.crop_win.height = ISP_CHN0_HEIGHT; +#endif + + chn_attr.scale_win = chn_attr.out_win; + chn_attr.crop_enable = K_FALSE; + chn_attr.scale_enable = K_FALSE; + // chn_attr.dw_enable = K_FALSE; + chn_attr.chn_enable = K_TRUE; + chn_attr.pix_format = PIXEL_FORMAT_BGR_888_PLANAR; + chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp + chn_attr.buffer_size = config.comm_pool[1].blk_size; + + printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); + ret = kd_mpi_vicap_set_chn_attr(vicap_dev, VICAP_CHN_ID_1, chn_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); + return ret; + } + + printf("sample_vicap ...kd_mpi_vicap_init\n"); + ret = kd_mpi_vicap_init(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + // goto err_exit; + } + + printf("sample_vicap ...kd_mpi_vicap_start_stream\n"); + ret = kd_mpi_vicap_start_stream(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + // goto err_exit; + } + + return ret; +} + +int vivcap_stop() +{ + printf("sample_vicap ...kd_mpi_vicap_stop_stream\n"); + int ret = kd_mpi_vicap_stop_stream(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + return ret; + } + + ret = kd_mpi_vicap_deinit(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_deinit failed.\n"); + return ret; + } + + kd_mpi_vo_disable_video_layer(K_VO_LAYER1); + + vicap_mpp_chn.mod_id = K_ID_VI; + vicap_mpp_chn.dev_id = vicap_dev; + vicap_mpp_chn.chn_id = vicap_chn; + + vo_mpp_chn.mod_id = K_ID_VO; + vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; + vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; + + sample_vicap_unbind_vo(vicap_mpp_chn, vo_mpp_chn); + + /*Allow one frame time for the VO to release the VB block*/ + k_u32 display_ms = 1000 / 33; + usleep(1000 * display_ms); + + ret = kd_mpi_vb_exit(); + if (ret) { + printf("sample_vicap, kd_mpi_vb_exit failed.\n"); + return ret; + } + + return 0; +} + +void yuv_rotate_90(char *des, char *src,int width,int height) +{ + int n = 0; + int hw = width>>1; + int hh = height>>1; + int size = width * height; + int hsize = size>>2; + + int pos = 0; + + for(int i = width-1;i >= 0;i--) + { + pos = 0; + for(int j= 0;j < height;j++) + { + des[n++]= src[pos+i]; + pos += width; + } + } + } \ No newline at end of file diff --git a/src/reference/ai_poc/sq_handkp_flower/hand_detection.cc b/src/reference/ai_poc/sq_handkp_flower/hand_detection.cc index a7e78fabe..5c72d06e8 100644 --- a/src/reference/ai_poc/sq_handkp_flower/hand_detection.cc +++ b/src/reference/ai_poc/sq_handkp_flower/hand_detection.cc @@ -176,7 +176,7 @@ std::vector HandDetection::decode_infer(float *data, int stride, FrameS box.x2 = std::max(0, std::min(int(frame_size.width), int(cx + w / 2.f))); box.y2 = std::max(0, std::min(int(frame_size.height), int(cy + h / 2.f))); - #if defined(CONFIG_BOARD_K230_CANMV) + #if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) if (abs(box.y1-box.y2)< 0.1*frame_size.height) continue; if ((abs(box.x1-box.x2)< 0.25*frame_size.width) && ((box.x1 < 0.03*frame_size.width) || (box.x2 > 0.97*frame_size.width))) diff --git a/src/reference/ai_poc/sq_handkp_flower/vi_vo.h b/src/reference/ai_poc/sq_handkp_flower/vi_vo.h index e3d8bdba4..0a11a4d31 100644 --- a/src/reference/ai_poc/sq_handkp_flower/vi_vo.h +++ b/src/reference/ai_poc/sq_handkp_flower/vi_vo.h @@ -1,627 +1,628 @@ -/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include -#include -#include - -#include "mpi_sys_api.h" - -/* vicap */ -#include -#include -#include -#include -#include - -#include "k_module.h" -#include "k_type.h" -#include "k_vb_comm.h" -#include "k_video_comm.h" -#include "k_sys_comm.h" -#include "mpi_vb_api.h" -#include "mpi_vicap_api.h" -#include "mpi_isp_api.h" -#include "mpi_sys_api.h" -#include "k_vo_comm.h" -#include "mpi_vo_api.h" - -#include "vo_test_case.h" - -#include "k_connector_comm.h" -#include "mpi_connector_api.h" -#include "k_autoconf_comm.h" - - -#if defined(CONFIG_BOARD_K230_CANMV) -#define SENSOR_CHANNEL (3) // isp通道数 -#define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 -#define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 -#define ISP_CHN0_WIDTH (1920)//(1920) -#define ISP_CHN0_HEIGHT (1080)//(1080) -#define vicap_install_osd (1) -#define osd_id K_VO_OSD3 -#define osd_width (1920) -#define osd_height (1080) -#else -#define SENSOR_CHANNEL (3) // isp通道数 -#define SENSOR_HEIGHT (1280) // isp高度,ai输入,竖屏 -#define SENSOR_WIDTH (720) // isp宽度,ai输入,竖屏 -#define ISP_CHN0_WIDTH (1088)//(1920) -#define ISP_CHN0_HEIGHT (1920)//(1080) -#define vicap_install_osd (1) -#define osd_id K_VO_OSD3 -#define osd_width (1080) -#define osd_height (1920) -#endif - - -k_vb_config config; -k_vicap_dev vicap_dev; -k_vicap_chn vicap_chn; -k_vicap_dev_attr dev_attr; -k_vicap_chn_attr chn_attr; -k_vicap_sensor_info sensor_info; -k_vicap_sensor_type sensor_type; -k_mpp_chn vicap_mpp_chn; -k_mpp_chn vo_mpp_chn; - -k_video_frame_info dump_info; - -k_vo_draw_frame vo_frame = (k_vo_draw_frame) { - 1, - 16, - 16, - 128, - 128, - 1 -}; - -static k_vb_blk_handle block; -k_u32 g_pool_id; - -int vo_creat_layer_test(k_vo_layer chn_id, layer_info *info) -{ - k_vo_video_layer_attr attr; - - // check layer - if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) - || ((info->func != 0) && (chn_id == K_VO_LAYER2))) - { - printf("input layer num failed \n"); - return -1 ; - } - - // check scaler - - // set offset - attr.display_rect = info->offset; - // set act - attr.img_size = info->act_size; - // sget size - info->size = info->act_size.height * info->act_size.width * 3 / 2; - //set pixel format - attr.pixel_format = info->format; - if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) - { - printf("input pix format failed \n"); - return -1; - } - // set stride - attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); - // set function - attr.func = info->func; - // set scaler attr - attr.scaler_attr = info->attr; - - // set video layer atrr - kd_mpi_vo_set_video_layer_attr(chn_id, &attr); - - // enable layer - kd_mpi_vo_enable_video_layer(chn_id); - - return 0; -} - -k_vb_blk_handle vo_insert_frame(k_video_frame_info *vf_info, void **pic_vaddr) -{ - k_u64 phys_addr = 0; - k_u32 *virt_addr; - k_vb_blk_handle handle; - k_s32 size; - - if (vf_info == NULL) - return K_FALSE; - - if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_8888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_8888) - size = vf_info->v_frame.height * vf_info->v_frame.width * 4; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_565 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_565) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_4444 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_4444) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_888) - size = vf_info->v_frame.height * vf_info->v_frame.width * 3; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_1555 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_1555) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) - size = vf_info->v_frame.height * vf_info->v_frame.width * 3 / 2; - - size = size + 4096; // 强制4K ,后边得删了 - - printf("vb block size is %x \n", size); - - handle = kd_mpi_vb_get_block(g_pool_id, size, NULL); - if (handle == VB_INVALID_HANDLE) - { - printf("%s get vb block error\n", __func__); - return K_FAILED; - } - - phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); - if (phys_addr == 0) - { - printf("%s get phys addr error\n", __func__); - return K_FAILED; - } - - virt_addr = (k_u32 *)kd_mpi_sys_mmap(phys_addr, size); - // virt_addr = (k_u32 *)kd_mpi_sys_mmap_cached(phys_addr, size); - - if (virt_addr == NULL) - { - printf("%s mmap error\n", __func__); - return K_FAILED; - } - - vf_info->mod_id = K_ID_VO; - vf_info->pool_id = g_pool_id; - vf_info->v_frame.phys_addr[0] = phys_addr; - if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) - vf_info->v_frame.phys_addr[1] = phys_addr + (vf_info->v_frame.height * vf_info->v_frame.stride[0]); - *pic_vaddr = virt_addr; - - printf("phys_addr is %lx g_pool_id is %d \n", phys_addr, g_pool_id); - - return handle; -} - -k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) -{ - k_vo_video_osd_attr attr; - - // set attr - attr.global_alptha = info->global_alptha; - - if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) - { - info->size = info->act_size.width * info->act_size.height * 4; - info->stride = info->act_size.width * 4 / 8; - } - else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) - { - info->size = info->act_size.width * info->act_size.height * 3; - info->stride = info->act_size.width * 3 / 8; - } - else if(info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else if(info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else - { - printf("set osd pixel format failed \n"); - } - - attr.stride = info->stride; - attr.pixel_format = info->format; - attr.display_rect = info->offset; - attr.img_size = info->act_size; - kd_mpi_vo_set_video_osd_attr(osd, &attr); - - kd_mpi_vo_osd_enable(osd); - - return 0; -} - -void sample_vicap_install_osd(void) -{ - osd_info osd; - - osd.act_size.width = osd_width ; - osd.act_size.height = osd_height; - osd.offset.x = 0; - osd.offset.y = 0; - osd.global_alptha = 0xff; - // osd.global_alptha = 0x32; - osd.format = PIXEL_FORMAT_ARGB_8888;//PIXEL_FORMAT_ARGB_4444; //PIXEL_FORMAT_ARGB_1555;//PIXEL_FORMAT_ARGB_8888; - - vo_creat_osd_test(osd_id, &osd); -} - -void vo_osd_release_block(void) -{ - if(vicap_install_osd == 1) - { - kd_mpi_vo_osd_disable(osd_id); - kd_mpi_vb_release_block(block); - } - -} - -static k_s32 sample_connector_init(void) -{ - k_u32 ret = 0; - k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) - k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; -#else - k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; -#endif - k_connector_info connector_info; - - memset(&connector_info, 0, sizeof(k_connector_info)); - - //connector get sensor info - ret = kd_mpi_get_connector_info(connector_type, &connector_info); - if (ret) { - printf("sample_vicap, the sensor type not supported!\n"); - return ret; - } - - connector_fd = kd_mpi_connector_open(connector_info.connector_name); - if (connector_fd < 0) { - printf("%s, connector open failed.\n", __func__); - return K_ERR_VO_NOTREADY; - } - - // set connect power - kd_mpi_connector_power_set(connector_fd, K_TRUE); - // connector init - kd_mpi_connector_init(connector_fd, connector_info); - - return 0; -} - -static k_s32 vo_layer_vdss_bind_vo_config(void) -{ - layer_info info; - - k_vo_layer chn_id = K_VO_LAYER1; - - memset(&info, 0, sizeof(info)); - - sample_connector_init(); - - // config lyaer - info.act_size.width = ISP_CHN0_WIDTH;//ISP_CHN0_HEIGHT;//1080;//640;//1080; - info.act_size.height = ISP_CHN0_HEIGHT;//ISP_CHN0_WIDTH;//1920;//480;//1920; - info.format = PIXEL_FORMAT_YVU_PLANAR_420; - info.func = 0;//K_ROTATION_180;////K_ROTATION_90; - info.global_alptha = 0xff; - info.offset.x = 0;//(1080-w)/2, - info.offset.y = 0;//(1920-h)/2; - vo_creat_layer_test(chn_id, &info); - - if(vicap_install_osd == 1) - sample_vicap_install_osd(); - - //exit ; - return 0; -} - -static void sample_vicap_bind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) -{ - k_s32 ret; - - ret = kd_mpi_sys_bind(&vicap_mpp_chn, &vo_mpp_chn); - if (ret) { - printf("kd_mpi_sys_unbind failed:0x%x\n", ret); - } - - return; -} - -static void sample_vicap_unbind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) -{ - k_s32 ret; - - ret = kd_mpi_sys_unbind(&vicap_mpp_chn, &vo_mpp_chn); - if (ret) { - printf("kd_mpi_sys_unbind failed:0x%x\n", ret); - } - - return; -} - -int vivcap_start() -{ - k_s32 ret = 0; - - k_u32 pool_id; - k_vb_pool_config pool_config; - - printf("sample_vicap ...\n"); - -#if defined(CONFIG_BOARD_K230_CANMV) - sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); -#else - sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; -#endif - vicap_dev = VICAP_DEV_ID_0; - - memset(&config, 0, sizeof(config)); - config.max_pool_cnt = 64; - //VB for YUV420SP output - config.comm_pool[0].blk_cnt = 5; - config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; - config.comm_pool[0].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), VICAP_ALIGN_1K); - - //VB for RGB888 output - config.comm_pool[1].blk_cnt = 5; - config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; - config.comm_pool[1].blk_size = VICAP_ALIGN_UP((SENSOR_HEIGHT * SENSOR_WIDTH * 3 ), VICAP_ALIGN_1K); - - ret = kd_mpi_vb_set_config(&config); - if (ret) { - printf("vb_set_config failed ret:%d\n", ret); - return ret; - } - - k_vb_supplement_config supplement_config; - memset(&supplement_config, 0, sizeof(supplement_config)); - supplement_config.supplement_config |= VB_SUPPLEMENT_JPEG_MASK; - - ret = kd_mpi_vb_set_supplement_config(&supplement_config); - if (ret) { - printf("vb_set_supplement_config failed ret:%d\n", ret); - return ret; - } - - ret = kd_mpi_vb_init(); - if (ret) { - printf("vb_init failed ret:%d\n", ret); - return ret; - } - printf("sample_vicap ...kd_mpi_vicap_get_sensor_info\n"); - - // dwc_dsi_init(); - vo_layer_vdss_bind_vo_config(); - - if(vicap_install_osd == 1) - { - memset(&pool_config, 0, sizeof(pool_config)); - pool_config.blk_size = VICAP_ALIGN_UP((osd_width * osd_height * 4 * 2), VICAP_ALIGN_1K); - pool_config.blk_cnt = 4; - pool_config.mode = VB_REMAP_MODE_NOCACHE; - pool_id = kd_mpi_vb_create_pool(&pool_config); // osd0 - 3 argb 320 x 240 - g_pool_id = pool_id; - - printf("--------aa--------------g_pool_id is %d pool_id is %d \n",g_pool_id, pool_id); - } - - memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); - ret = kd_mpi_vicap_get_sensor_info(sensor_type, &sensor_info); - if (ret) { - printf("sample_vicap, the sensor type not supported!\n"); - return ret; - } - - memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); - dev_attr.acq_win.h_start = 0; - dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) - dev_attr.acq_win.width = ISP_CHN0_WIDTH; - dev_attr.acq_win.height = ISP_CHN0_HEIGHT; -#else - dev_attr.acq_win.width = 2592;//SENSOR_HEIGHT; - dev_attr.acq_win.height = 1944;//SENSOR_WIDTH; -#endif - dev_attr.mode = VICAP_WORK_ONLINE_MODE; - - dev_attr.pipe_ctrl.data = 0xFFFFFFFF; - dev_attr.pipe_ctrl.bits.af_enable = 0; - dev_attr.pipe_ctrl.bits.ahdr_enable = 0; - - - dev_attr.cpature_frame = 0; - memcpy(&dev_attr.sensor_info, &sensor_info, sizeof(k_vicap_sensor_info)); - - ret = kd_mpi_vicap_set_dev_attr(vicap_dev, dev_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_dev_attr failed.\n"); - return ret; - } - - memset(&chn_attr, 0, sizeof(k_vicap_chn_attr)); - - //set chn0 output yuv420sp - chn_attr.out_win.h_start = 0; - chn_attr.out_win.v_start = 0; - chn_attr.out_win.width = ISP_CHN0_WIDTH; - chn_attr.out_win.height = ISP_CHN0_HEIGHT; - - -#if defined(CONFIG_BOARD_K230_CANMV) - chn_attr.crop_win = dev_attr.acq_win; -#else - // chn_attr.crop_win = dev_attr.acq_win; - chn_attr.crop_win.h_start = 768; - chn_attr.crop_win.v_start = 16; - chn_attr.crop_win.width = ISP_CHN0_WIDTH; - chn_attr.crop_win.height = ISP_CHN0_HEIGHT; -#endif - - chn_attr.scale_win = chn_attr.out_win; - chn_attr.crop_enable = K_FALSE; - chn_attr.scale_enable = K_FALSE; - // chn_attr.dw_enable = K_FALSE; - chn_attr.chn_enable = K_TRUE; - chn_attr.pix_format = PIXEL_FORMAT_YVU_PLANAR_420; - chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp - chn_attr.buffer_size = config.comm_pool[0].blk_size; - vicap_chn = VICAP_CHN_ID_0; - - printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); - ret = kd_mpi_vicap_set_chn_attr(vicap_dev, vicap_chn, chn_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); - return ret; - } - - //bind vicap chn 0 to vo - vicap_mpp_chn.mod_id = K_ID_VI; - vicap_mpp_chn.dev_id = vicap_dev; - vicap_mpp_chn.chn_id = vicap_chn; - - vo_mpp_chn.mod_id = K_ID_VO; - vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; - vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; - - sample_vicap_bind_vo(vicap_mpp_chn, vo_mpp_chn); - printf("sample_vicap ...dwc_dsi_init\n"); - - //set chn1 output rgb888p - chn_attr.out_win.h_start = 0; - chn_attr.out_win.v_start = 0; - chn_attr.out_win.width = SENSOR_WIDTH ; - chn_attr.out_win.height = SENSOR_HEIGHT; - // chn_attr.crop_win = dev_attr.acq_win; - -#if defined(CONFIG_BOARD_K230_CANMV) - chn_attr.crop_win = dev_attr.acq_win; -#else - chn_attr.crop_win.h_start = 768; - chn_attr.crop_win.v_start = 16; - chn_attr.crop_win.width = ISP_CHN0_WIDTH; - chn_attr.crop_win.height = ISP_CHN0_HEIGHT; -#endif - - chn_attr.scale_win = chn_attr.out_win; - chn_attr.crop_enable = K_FALSE; - chn_attr.scale_enable = K_FALSE; - // chn_attr.dw_enable = K_FALSE; - chn_attr.chn_enable = K_TRUE; - chn_attr.pix_format = PIXEL_FORMAT_BGR_888_PLANAR; - chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp - chn_attr.buffer_size = config.comm_pool[1].blk_size; - - printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); - ret = kd_mpi_vicap_set_chn_attr(vicap_dev, VICAP_CHN_ID_1, chn_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); - return ret; - } - - printf("sample_vicap ...kd_mpi_vicap_init\n"); - ret = kd_mpi_vicap_init(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - // goto err_exit; - } - - printf("sample_vicap ...kd_mpi_vicap_start_stream\n"); - ret = kd_mpi_vicap_start_stream(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - // goto err_exit; - } - - return ret; -} - -int vivcap_stop() -{ - printf("sample_vicap ...kd_mpi_vicap_stop_stream\n"); - int ret = kd_mpi_vicap_stop_stream(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - return ret; - } - - ret = kd_mpi_vicap_deinit(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_deinit failed.\n"); - return ret; - } - - kd_mpi_vo_disable_video_layer(K_VO_LAYER1); - - vicap_mpp_chn.mod_id = K_ID_VI; - vicap_mpp_chn.dev_id = vicap_dev; - vicap_mpp_chn.chn_id = vicap_chn; - - vo_mpp_chn.mod_id = K_ID_VO; - vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; - vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; - - sample_vicap_unbind_vo(vicap_mpp_chn, vo_mpp_chn); - - /*Allow one frame time for the VO to release the VB block*/ - k_u32 display_ms = 1000 / 33; - usleep(1000 * display_ms); - - ret = kd_mpi_vb_exit(); - if (ret) { - printf("sample_vicap, kd_mpi_vb_exit failed.\n"); - return ret; - } - - return 0; -} - -void yuv_rotate_90(char *des, char *src,int width,int height) -{ - int n = 0; - int hw = width>>1; - int hh = height>>1; - int size = width * height; - int hsize = size>>2; - - int pos = 0; - - for(int i = width-1;i >= 0;i--) - { - pos = 0; - for(int j= 0;j < height;j++) - { - des[n++]= src[pos+i]; - pos += width; - } - } - +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include + +#include "mpi_sys_api.h" + +/* vicap */ +#include +#include +#include +#include +#include + +#include "k_module.h" +#include "k_type.h" +#include "k_vb_comm.h" +#include "k_video_comm.h" +#include "k_sys_comm.h" +#include "mpi_vb_api.h" +#include "mpi_vicap_api.h" +#include "mpi_isp_api.h" +#include "mpi_sys_api.h" +#include "k_vo_comm.h" +#include "mpi_vo_api.h" + +#include "vo_test_case.h" + +#include "k_connector_comm.h" +#include "mpi_connector_api.h" +#include "k_autoconf_comm.h" + + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) +#define SENSOR_CHANNEL (3) // isp通道数 +#define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 +#define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 +#define ISP_CHN0_WIDTH (1920)//(1920) +#define ISP_CHN0_HEIGHT (1080)//(1080) +#define vicap_install_osd (1) +#define osd_id K_VO_OSD3 +#define osd_width (1920) +#define osd_height (1080) +#else +#define SENSOR_CHANNEL (3) // isp通道数 +#define SENSOR_HEIGHT (1280) // isp高度,ai输入,竖屏 +#define SENSOR_WIDTH (720) // isp宽度,ai输入,竖屏 +#define ISP_CHN0_WIDTH (1088)//(1920) +#define ISP_CHN0_HEIGHT (1920)//(1080) +#define vicap_install_osd (1) +#define osd_id K_VO_OSD3 +#define osd_width (1080) +#define osd_height (1920) +#endif + + +k_vb_config config; +k_vicap_dev vicap_dev; +k_vicap_chn vicap_chn; +k_vicap_dev_attr dev_attr; +k_vicap_chn_attr chn_attr; +k_vicap_sensor_info sensor_info; +k_vicap_sensor_type sensor_type; +k_mpp_chn vicap_mpp_chn; +k_mpp_chn vo_mpp_chn; + +k_video_frame_info dump_info; + +k_vo_draw_frame vo_frame = (k_vo_draw_frame) { + 1, + 16, + 16, + 128, + 128, + 1 +}; + +static k_vb_blk_handle block; +k_u32 g_pool_id; + +int vo_creat_layer_test(k_vo_layer chn_id, layer_info *info) +{ + k_vo_video_layer_attr attr; + + // check layer + if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) + || ((info->func != 0) && (chn_id == K_VO_LAYER2))) + { + printf("input layer num failed \n"); + return -1 ; + } + + // check scaler + + // set offset + attr.display_rect = info->offset; + // set act + attr.img_size = info->act_size; + // sget size + info->size = info->act_size.height * info->act_size.width * 3 / 2; + //set pixel format + attr.pixel_format = info->format; + if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) + { + printf("input pix format failed \n"); + return -1; + } + // set stride + attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); + // set function + attr.func = info->func; + // set scaler attr + attr.scaler_attr = info->attr; + + // set video layer atrr + kd_mpi_vo_set_video_layer_attr(chn_id, &attr); + + // enable layer + kd_mpi_vo_enable_video_layer(chn_id); + + return 0; +} + +k_vb_blk_handle vo_insert_frame(k_video_frame_info *vf_info, void **pic_vaddr) +{ + k_u64 phys_addr = 0; + k_u32 *virt_addr; + k_vb_blk_handle handle; + k_s32 size; + + if (vf_info == NULL) + return K_FALSE; + + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_8888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_8888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 4; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_565 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_565) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_4444 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_4444) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_1555 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_1555) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3 / 2; + + size = size + 4096; // 强制4K ,后边得删了 + + printf("vb block size is %x \n", size); + + handle = kd_mpi_vb_get_block(g_pool_id, size, NULL); + if (handle == VB_INVALID_HANDLE) + { + printf("%s get vb block error\n", __func__); + return K_FAILED; + } + + phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); + if (phys_addr == 0) + { + printf("%s get phys addr error\n", __func__); + return K_FAILED; + } + + virt_addr = (k_u32 *)kd_mpi_sys_mmap(phys_addr, size); + // virt_addr = (k_u32 *)kd_mpi_sys_mmap_cached(phys_addr, size); + + if (virt_addr == NULL) + { + printf("%s mmap error\n", __func__); + return K_FAILED; + } + + vf_info->mod_id = K_ID_VO; + vf_info->pool_id = g_pool_id; + vf_info->v_frame.phys_addr[0] = phys_addr; + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + vf_info->v_frame.phys_addr[1] = phys_addr + (vf_info->v_frame.height * vf_info->v_frame.stride[0]); + *pic_vaddr = virt_addr; + + printf("phys_addr is %lx g_pool_id is %d \n", phys_addr, g_pool_id); + + return handle; +} + +k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) +{ + k_vo_video_osd_attr attr; + + // set attr + attr.global_alptha = info->global_alptha; + + if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) + { + info->size = info->act_size.width * info->act_size.height * 4; + info->stride = info->act_size.width * 4 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) + { + info->size = info->act_size.width * info->act_size.height * 3; + info->stride = info->act_size.width * 3 / 8; + } + else if(info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if(info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else + { + printf("set osd pixel format failed \n"); + } + + attr.stride = info->stride; + attr.pixel_format = info->format; + attr.display_rect = info->offset; + attr.img_size = info->act_size; + kd_mpi_vo_set_video_osd_attr(osd, &attr); + + kd_mpi_vo_osd_enable(osd); + + return 0; +} + +void sample_vicap_install_osd(void) +{ + osd_info osd; + + osd.act_size.width = osd_width ; + osd.act_size.height = osd_height; + osd.offset.x = 0; + osd.offset.y = 0; + osd.global_alptha = 0xff; + // osd.global_alptha = 0x32; + osd.format = PIXEL_FORMAT_ARGB_8888;//PIXEL_FORMAT_ARGB_4444; //PIXEL_FORMAT_ARGB_1555;//PIXEL_FORMAT_ARGB_8888; + + vo_creat_osd_test(osd_id, &osd); +} + +void vo_osd_release_block(void) +{ + if(vicap_install_osd == 1) + { + kd_mpi_vo_osd_disable(osd_id); + kd_mpi_vb_release_block(block); + } + +} + +static k_s32 sample_connector_init(void) +{ + k_u32 ret = 0; + k_s32 connector_fd; +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#else + k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#endif + k_connector_info connector_info; + + memset(&connector_info, 0, sizeof(k_connector_info)); + + //connector get sensor info + ret = kd_mpi_get_connector_info(connector_type, &connector_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + + connector_fd = kd_mpi_connector_open(connector_info.connector_name); + if (connector_fd < 0) { + printf("%s, connector open failed.\n", __func__); + return K_ERR_VO_NOTREADY; + } + + // set connect power + kd_mpi_connector_power_set(connector_fd, K_TRUE); + // connector init + kd_mpi_connector_init(connector_fd, connector_info); + + return 0; +} + +static k_s32 vo_layer_vdss_bind_vo_config(void) +{ + layer_info info; + + k_vo_layer chn_id = K_VO_LAYER1; + + memset(&info, 0, sizeof(info)); + + sample_connector_init(); + + // config lyaer + info.act_size.width = ISP_CHN0_WIDTH;//ISP_CHN0_HEIGHT;//1080;//640;//1080; + info.act_size.height = ISP_CHN0_HEIGHT;//ISP_CHN0_WIDTH;//1920;//480;//1920; + info.format = PIXEL_FORMAT_YVU_PLANAR_420; + info.func = 0;//K_ROTATION_180;////K_ROTATION_90; + info.global_alptha = 0xff; + info.offset.x = 0;//(1080-w)/2, + info.offset.y = 0;//(1920-h)/2; + vo_creat_layer_test(chn_id, &info); + + if(vicap_install_osd == 1) + sample_vicap_install_osd(); + + //exit ; + return 0; +} + +static void sample_vicap_bind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) +{ + k_s32 ret; + + ret = kd_mpi_sys_bind(&vicap_mpp_chn, &vo_mpp_chn); + if (ret) { + printf("kd_mpi_sys_unbind failed:0x%x\n", ret); + } + + return; +} + +static void sample_vicap_unbind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) +{ + k_s32 ret; + + ret = kd_mpi_sys_unbind(&vicap_mpp_chn, &vo_mpp_chn); + if (ret) { + printf("kd_mpi_sys_unbind failed:0x%x\n", ret); + } + + return; +} + +int vivcap_start() +{ + k_s32 ret = 0; + + k_u32 pool_id; + k_vb_pool_config pool_config; + + printf("sample_vicap ...\n"); + +#if defined(CONFIG_BOARD_K230_CANMV) + sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; +#else + sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; +#endif + vicap_dev = VICAP_DEV_ID_0; + + memset(&config, 0, sizeof(config)); + config.max_pool_cnt = 64; + //VB for YUV420SP output + config.comm_pool[0].blk_cnt = 5; + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[0].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), VICAP_ALIGN_1K); + + //VB for RGB888 output + config.comm_pool[1].blk_cnt = 5; + config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[1].blk_size = VICAP_ALIGN_UP((SENSOR_HEIGHT * SENSOR_WIDTH * 3 ), VICAP_ALIGN_1K); + + ret = kd_mpi_vb_set_config(&config); + if (ret) { + printf("vb_set_config failed ret:%d\n", ret); + return ret; + } + + k_vb_supplement_config supplement_config; + memset(&supplement_config, 0, sizeof(supplement_config)); + supplement_config.supplement_config |= VB_SUPPLEMENT_JPEG_MASK; + + ret = kd_mpi_vb_set_supplement_config(&supplement_config); + if (ret) { + printf("vb_set_supplement_config failed ret:%d\n", ret); + return ret; + } + + ret = kd_mpi_vb_init(); + if (ret) { + printf("vb_init failed ret:%d\n", ret); + return ret; + } + printf("sample_vicap ...kd_mpi_vicap_get_sensor_info\n"); + + // dwc_dsi_init(); + vo_layer_vdss_bind_vo_config(); + + if(vicap_install_osd == 1) + { + memset(&pool_config, 0, sizeof(pool_config)); + pool_config.blk_size = VICAP_ALIGN_UP((osd_width * osd_height * 4 * 2), VICAP_ALIGN_1K); + pool_config.blk_cnt = 4; + pool_config.mode = VB_REMAP_MODE_NOCACHE; + pool_id = kd_mpi_vb_create_pool(&pool_config); // osd0 - 3 argb 320 x 240 + g_pool_id = pool_id; + + printf("--------aa--------------g_pool_id is %d pool_id is %d \n",g_pool_id, pool_id); + } + + memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); + ret = kd_mpi_vicap_get_sensor_info(sensor_type, &sensor_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + + memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); + dev_attr.acq_win.h_start = 0; + dev_attr.acq_win.v_start = 0; +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + dev_attr.acq_win.width = ISP_CHN0_WIDTH; + dev_attr.acq_win.height = ISP_CHN0_HEIGHT; +#else + dev_attr.acq_win.width = 2592;//SENSOR_HEIGHT; + dev_attr.acq_win.height = 1944;//SENSOR_WIDTH; +#endif + dev_attr.mode = VICAP_WORK_ONLINE_MODE; + + dev_attr.pipe_ctrl.data = 0xFFFFFFFF; + dev_attr.pipe_ctrl.bits.af_enable = 0; + dev_attr.pipe_ctrl.bits.ahdr_enable = 0; + + + dev_attr.cpature_frame = 0; + memcpy(&dev_attr.sensor_info, &sensor_info, sizeof(k_vicap_sensor_info)); + + ret = kd_mpi_vicap_set_dev_attr(vicap_dev, dev_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_dev_attr failed.\n"); + return ret; + } + + memset(&chn_attr, 0, sizeof(k_vicap_chn_attr)); + + //set chn0 output yuv420sp + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = ISP_CHN0_WIDTH; + chn_attr.out_win.height = ISP_CHN0_HEIGHT; + + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + chn_attr.crop_win = dev_attr.acq_win; +#else + // chn_attr.crop_win = dev_attr.acq_win; + chn_attr.crop_win.h_start = 768; + chn_attr.crop_win.v_start = 16; + chn_attr.crop_win.width = ISP_CHN0_WIDTH; + chn_attr.crop_win.height = ISP_CHN0_HEIGHT; +#endif + + chn_attr.scale_win = chn_attr.out_win; + chn_attr.crop_enable = K_FALSE; + chn_attr.scale_enable = K_FALSE; + // chn_attr.dw_enable = K_FALSE; + chn_attr.chn_enable = K_TRUE; + chn_attr.pix_format = PIXEL_FORMAT_YVU_PLANAR_420; + chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp + chn_attr.buffer_size = config.comm_pool[0].blk_size; + vicap_chn = VICAP_CHN_ID_0; + + printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); + ret = kd_mpi_vicap_set_chn_attr(vicap_dev, vicap_chn, chn_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); + return ret; + } + + //bind vicap chn 0 to vo + vicap_mpp_chn.mod_id = K_ID_VI; + vicap_mpp_chn.dev_id = vicap_dev; + vicap_mpp_chn.chn_id = vicap_chn; + + vo_mpp_chn.mod_id = K_ID_VO; + vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; + vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; + + sample_vicap_bind_vo(vicap_mpp_chn, vo_mpp_chn); + printf("sample_vicap ...dwc_dsi_init\n"); + + //set chn1 output rgb888p + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = SENSOR_WIDTH ; + chn_attr.out_win.height = SENSOR_HEIGHT; + // chn_attr.crop_win = dev_attr.acq_win; + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + chn_attr.crop_win = dev_attr.acq_win; +#else + chn_attr.crop_win.h_start = 768; + chn_attr.crop_win.v_start = 16; + chn_attr.crop_win.width = ISP_CHN0_WIDTH; + chn_attr.crop_win.height = ISP_CHN0_HEIGHT; +#endif + + chn_attr.scale_win = chn_attr.out_win; + chn_attr.crop_enable = K_FALSE; + chn_attr.scale_enable = K_FALSE; + // chn_attr.dw_enable = K_FALSE; + chn_attr.chn_enable = K_TRUE; + chn_attr.pix_format = PIXEL_FORMAT_BGR_888_PLANAR; + chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp + chn_attr.buffer_size = config.comm_pool[1].blk_size; + + printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); + ret = kd_mpi_vicap_set_chn_attr(vicap_dev, VICAP_CHN_ID_1, chn_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); + return ret; + } + + printf("sample_vicap ...kd_mpi_vicap_init\n"); + ret = kd_mpi_vicap_init(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + // goto err_exit; + } + + printf("sample_vicap ...kd_mpi_vicap_start_stream\n"); + ret = kd_mpi_vicap_start_stream(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + // goto err_exit; + } + + return ret; +} + +int vivcap_stop() +{ + printf("sample_vicap ...kd_mpi_vicap_stop_stream\n"); + int ret = kd_mpi_vicap_stop_stream(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + return ret; + } + + ret = kd_mpi_vicap_deinit(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_deinit failed.\n"); + return ret; + } + + kd_mpi_vo_disable_video_layer(K_VO_LAYER1); + + vicap_mpp_chn.mod_id = K_ID_VI; + vicap_mpp_chn.dev_id = vicap_dev; + vicap_mpp_chn.chn_id = vicap_chn; + + vo_mpp_chn.mod_id = K_ID_VO; + vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; + vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; + + sample_vicap_unbind_vo(vicap_mpp_chn, vo_mpp_chn); + + /*Allow one frame time for the VO to release the VB block*/ + k_u32 display_ms = 1000 / 33; + usleep(1000 * display_ms); + + ret = kd_mpi_vb_exit(); + if (ret) { + printf("sample_vicap, kd_mpi_vb_exit failed.\n"); + return ret; + } + + return 0; +} + +void yuv_rotate_90(char *des, char *src,int width,int height) +{ + int n = 0; + int hw = width>>1; + int hh = height>>1; + int size = width * height; + int hsize = size>>2; + + int pos = 0; + + for(int i = width-1;i >= 0;i--) + { + pos = 0; + for(int j= 0;j < height;j++) + { + des[n++]= src[pos+i]; + pos += width; + } + } + } \ No newline at end of file diff --git a/src/reference/ai_poc/sq_handkp_ocr/hand_detection.cc b/src/reference/ai_poc/sq_handkp_ocr/hand_detection.cc index 245e38fc5..7a24ecde3 100755 --- a/src/reference/ai_poc/sq_handkp_ocr/hand_detection.cc +++ b/src/reference/ai_poc/sq_handkp_ocr/hand_detection.cc @@ -177,7 +177,7 @@ std::vector HandDetection::decode_infer(float *data, int stride, FrameS box.x2 = std::max(0, std::min(int(frame_size.width), int(cx + w / 2.f))); box.y2 = std::max(0, std::min(int(frame_size.height), int(cy + h / 2.f))); - #if defined(CONFIG_BOARD_K230_CANMV) + #if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) if (abs(box.y1-box.y2)< 0.1*frame_size.height) continue; if ((abs(box.x1-box.x2)< 0.25*frame_size.width) && ((box.x1 < 0.03*frame_size.width) || (box.x2 > 0.97*frame_size.width))) diff --git a/src/reference/ai_poc/sq_handkp_ocr/vi_vo.h b/src/reference/ai_poc/sq_handkp_ocr/vi_vo.h old mode 100755 new mode 100644 index e3d8bdba4..0a11a4d31 --- a/src/reference/ai_poc/sq_handkp_ocr/vi_vo.h +++ b/src/reference/ai_poc/sq_handkp_ocr/vi_vo.h @@ -1,627 +1,628 @@ -/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include -#include -#include - -#include "mpi_sys_api.h" - -/* vicap */ -#include -#include -#include -#include -#include - -#include "k_module.h" -#include "k_type.h" -#include "k_vb_comm.h" -#include "k_video_comm.h" -#include "k_sys_comm.h" -#include "mpi_vb_api.h" -#include "mpi_vicap_api.h" -#include "mpi_isp_api.h" -#include "mpi_sys_api.h" -#include "k_vo_comm.h" -#include "mpi_vo_api.h" - -#include "vo_test_case.h" - -#include "k_connector_comm.h" -#include "mpi_connector_api.h" -#include "k_autoconf_comm.h" - - -#if defined(CONFIG_BOARD_K230_CANMV) -#define SENSOR_CHANNEL (3) // isp通道数 -#define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 -#define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 -#define ISP_CHN0_WIDTH (1920)//(1920) -#define ISP_CHN0_HEIGHT (1080)//(1080) -#define vicap_install_osd (1) -#define osd_id K_VO_OSD3 -#define osd_width (1920) -#define osd_height (1080) -#else -#define SENSOR_CHANNEL (3) // isp通道数 -#define SENSOR_HEIGHT (1280) // isp高度,ai输入,竖屏 -#define SENSOR_WIDTH (720) // isp宽度,ai输入,竖屏 -#define ISP_CHN0_WIDTH (1088)//(1920) -#define ISP_CHN0_HEIGHT (1920)//(1080) -#define vicap_install_osd (1) -#define osd_id K_VO_OSD3 -#define osd_width (1080) -#define osd_height (1920) -#endif - - -k_vb_config config; -k_vicap_dev vicap_dev; -k_vicap_chn vicap_chn; -k_vicap_dev_attr dev_attr; -k_vicap_chn_attr chn_attr; -k_vicap_sensor_info sensor_info; -k_vicap_sensor_type sensor_type; -k_mpp_chn vicap_mpp_chn; -k_mpp_chn vo_mpp_chn; - -k_video_frame_info dump_info; - -k_vo_draw_frame vo_frame = (k_vo_draw_frame) { - 1, - 16, - 16, - 128, - 128, - 1 -}; - -static k_vb_blk_handle block; -k_u32 g_pool_id; - -int vo_creat_layer_test(k_vo_layer chn_id, layer_info *info) -{ - k_vo_video_layer_attr attr; - - // check layer - if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) - || ((info->func != 0) && (chn_id == K_VO_LAYER2))) - { - printf("input layer num failed \n"); - return -1 ; - } - - // check scaler - - // set offset - attr.display_rect = info->offset; - // set act - attr.img_size = info->act_size; - // sget size - info->size = info->act_size.height * info->act_size.width * 3 / 2; - //set pixel format - attr.pixel_format = info->format; - if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) - { - printf("input pix format failed \n"); - return -1; - } - // set stride - attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); - // set function - attr.func = info->func; - // set scaler attr - attr.scaler_attr = info->attr; - - // set video layer atrr - kd_mpi_vo_set_video_layer_attr(chn_id, &attr); - - // enable layer - kd_mpi_vo_enable_video_layer(chn_id); - - return 0; -} - -k_vb_blk_handle vo_insert_frame(k_video_frame_info *vf_info, void **pic_vaddr) -{ - k_u64 phys_addr = 0; - k_u32 *virt_addr; - k_vb_blk_handle handle; - k_s32 size; - - if (vf_info == NULL) - return K_FALSE; - - if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_8888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_8888) - size = vf_info->v_frame.height * vf_info->v_frame.width * 4; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_565 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_565) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_4444 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_4444) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_888) - size = vf_info->v_frame.height * vf_info->v_frame.width * 3; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_1555 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_1555) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) - size = vf_info->v_frame.height * vf_info->v_frame.width * 3 / 2; - - size = size + 4096; // 强制4K ,后边得删了 - - printf("vb block size is %x \n", size); - - handle = kd_mpi_vb_get_block(g_pool_id, size, NULL); - if (handle == VB_INVALID_HANDLE) - { - printf("%s get vb block error\n", __func__); - return K_FAILED; - } - - phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); - if (phys_addr == 0) - { - printf("%s get phys addr error\n", __func__); - return K_FAILED; - } - - virt_addr = (k_u32 *)kd_mpi_sys_mmap(phys_addr, size); - // virt_addr = (k_u32 *)kd_mpi_sys_mmap_cached(phys_addr, size); - - if (virt_addr == NULL) - { - printf("%s mmap error\n", __func__); - return K_FAILED; - } - - vf_info->mod_id = K_ID_VO; - vf_info->pool_id = g_pool_id; - vf_info->v_frame.phys_addr[0] = phys_addr; - if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) - vf_info->v_frame.phys_addr[1] = phys_addr + (vf_info->v_frame.height * vf_info->v_frame.stride[0]); - *pic_vaddr = virt_addr; - - printf("phys_addr is %lx g_pool_id is %d \n", phys_addr, g_pool_id); - - return handle; -} - -k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) -{ - k_vo_video_osd_attr attr; - - // set attr - attr.global_alptha = info->global_alptha; - - if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) - { - info->size = info->act_size.width * info->act_size.height * 4; - info->stride = info->act_size.width * 4 / 8; - } - else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) - { - info->size = info->act_size.width * info->act_size.height * 3; - info->stride = info->act_size.width * 3 / 8; - } - else if(info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else if(info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else - { - printf("set osd pixel format failed \n"); - } - - attr.stride = info->stride; - attr.pixel_format = info->format; - attr.display_rect = info->offset; - attr.img_size = info->act_size; - kd_mpi_vo_set_video_osd_attr(osd, &attr); - - kd_mpi_vo_osd_enable(osd); - - return 0; -} - -void sample_vicap_install_osd(void) -{ - osd_info osd; - - osd.act_size.width = osd_width ; - osd.act_size.height = osd_height; - osd.offset.x = 0; - osd.offset.y = 0; - osd.global_alptha = 0xff; - // osd.global_alptha = 0x32; - osd.format = PIXEL_FORMAT_ARGB_8888;//PIXEL_FORMAT_ARGB_4444; //PIXEL_FORMAT_ARGB_1555;//PIXEL_FORMAT_ARGB_8888; - - vo_creat_osd_test(osd_id, &osd); -} - -void vo_osd_release_block(void) -{ - if(vicap_install_osd == 1) - { - kd_mpi_vo_osd_disable(osd_id); - kd_mpi_vb_release_block(block); - } - -} - -static k_s32 sample_connector_init(void) -{ - k_u32 ret = 0; - k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) - k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; -#else - k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; -#endif - k_connector_info connector_info; - - memset(&connector_info, 0, sizeof(k_connector_info)); - - //connector get sensor info - ret = kd_mpi_get_connector_info(connector_type, &connector_info); - if (ret) { - printf("sample_vicap, the sensor type not supported!\n"); - return ret; - } - - connector_fd = kd_mpi_connector_open(connector_info.connector_name); - if (connector_fd < 0) { - printf("%s, connector open failed.\n", __func__); - return K_ERR_VO_NOTREADY; - } - - // set connect power - kd_mpi_connector_power_set(connector_fd, K_TRUE); - // connector init - kd_mpi_connector_init(connector_fd, connector_info); - - return 0; -} - -static k_s32 vo_layer_vdss_bind_vo_config(void) -{ - layer_info info; - - k_vo_layer chn_id = K_VO_LAYER1; - - memset(&info, 0, sizeof(info)); - - sample_connector_init(); - - // config lyaer - info.act_size.width = ISP_CHN0_WIDTH;//ISP_CHN0_HEIGHT;//1080;//640;//1080; - info.act_size.height = ISP_CHN0_HEIGHT;//ISP_CHN0_WIDTH;//1920;//480;//1920; - info.format = PIXEL_FORMAT_YVU_PLANAR_420; - info.func = 0;//K_ROTATION_180;////K_ROTATION_90; - info.global_alptha = 0xff; - info.offset.x = 0;//(1080-w)/2, - info.offset.y = 0;//(1920-h)/2; - vo_creat_layer_test(chn_id, &info); - - if(vicap_install_osd == 1) - sample_vicap_install_osd(); - - //exit ; - return 0; -} - -static void sample_vicap_bind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) -{ - k_s32 ret; - - ret = kd_mpi_sys_bind(&vicap_mpp_chn, &vo_mpp_chn); - if (ret) { - printf("kd_mpi_sys_unbind failed:0x%x\n", ret); - } - - return; -} - -static void sample_vicap_unbind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) -{ - k_s32 ret; - - ret = kd_mpi_sys_unbind(&vicap_mpp_chn, &vo_mpp_chn); - if (ret) { - printf("kd_mpi_sys_unbind failed:0x%x\n", ret); - } - - return; -} - -int vivcap_start() -{ - k_s32 ret = 0; - - k_u32 pool_id; - k_vb_pool_config pool_config; - - printf("sample_vicap ...\n"); - -#if defined(CONFIG_BOARD_K230_CANMV) - sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); -#else - sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; -#endif - vicap_dev = VICAP_DEV_ID_0; - - memset(&config, 0, sizeof(config)); - config.max_pool_cnt = 64; - //VB for YUV420SP output - config.comm_pool[0].blk_cnt = 5; - config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; - config.comm_pool[0].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), VICAP_ALIGN_1K); - - //VB for RGB888 output - config.comm_pool[1].blk_cnt = 5; - config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; - config.comm_pool[1].blk_size = VICAP_ALIGN_UP((SENSOR_HEIGHT * SENSOR_WIDTH * 3 ), VICAP_ALIGN_1K); - - ret = kd_mpi_vb_set_config(&config); - if (ret) { - printf("vb_set_config failed ret:%d\n", ret); - return ret; - } - - k_vb_supplement_config supplement_config; - memset(&supplement_config, 0, sizeof(supplement_config)); - supplement_config.supplement_config |= VB_SUPPLEMENT_JPEG_MASK; - - ret = kd_mpi_vb_set_supplement_config(&supplement_config); - if (ret) { - printf("vb_set_supplement_config failed ret:%d\n", ret); - return ret; - } - - ret = kd_mpi_vb_init(); - if (ret) { - printf("vb_init failed ret:%d\n", ret); - return ret; - } - printf("sample_vicap ...kd_mpi_vicap_get_sensor_info\n"); - - // dwc_dsi_init(); - vo_layer_vdss_bind_vo_config(); - - if(vicap_install_osd == 1) - { - memset(&pool_config, 0, sizeof(pool_config)); - pool_config.blk_size = VICAP_ALIGN_UP((osd_width * osd_height * 4 * 2), VICAP_ALIGN_1K); - pool_config.blk_cnt = 4; - pool_config.mode = VB_REMAP_MODE_NOCACHE; - pool_id = kd_mpi_vb_create_pool(&pool_config); // osd0 - 3 argb 320 x 240 - g_pool_id = pool_id; - - printf("--------aa--------------g_pool_id is %d pool_id is %d \n",g_pool_id, pool_id); - } - - memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); - ret = kd_mpi_vicap_get_sensor_info(sensor_type, &sensor_info); - if (ret) { - printf("sample_vicap, the sensor type not supported!\n"); - return ret; - } - - memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); - dev_attr.acq_win.h_start = 0; - dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) - dev_attr.acq_win.width = ISP_CHN0_WIDTH; - dev_attr.acq_win.height = ISP_CHN0_HEIGHT; -#else - dev_attr.acq_win.width = 2592;//SENSOR_HEIGHT; - dev_attr.acq_win.height = 1944;//SENSOR_WIDTH; -#endif - dev_attr.mode = VICAP_WORK_ONLINE_MODE; - - dev_attr.pipe_ctrl.data = 0xFFFFFFFF; - dev_attr.pipe_ctrl.bits.af_enable = 0; - dev_attr.pipe_ctrl.bits.ahdr_enable = 0; - - - dev_attr.cpature_frame = 0; - memcpy(&dev_attr.sensor_info, &sensor_info, sizeof(k_vicap_sensor_info)); - - ret = kd_mpi_vicap_set_dev_attr(vicap_dev, dev_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_dev_attr failed.\n"); - return ret; - } - - memset(&chn_attr, 0, sizeof(k_vicap_chn_attr)); - - //set chn0 output yuv420sp - chn_attr.out_win.h_start = 0; - chn_attr.out_win.v_start = 0; - chn_attr.out_win.width = ISP_CHN0_WIDTH; - chn_attr.out_win.height = ISP_CHN0_HEIGHT; - - -#if defined(CONFIG_BOARD_K230_CANMV) - chn_attr.crop_win = dev_attr.acq_win; -#else - // chn_attr.crop_win = dev_attr.acq_win; - chn_attr.crop_win.h_start = 768; - chn_attr.crop_win.v_start = 16; - chn_attr.crop_win.width = ISP_CHN0_WIDTH; - chn_attr.crop_win.height = ISP_CHN0_HEIGHT; -#endif - - chn_attr.scale_win = chn_attr.out_win; - chn_attr.crop_enable = K_FALSE; - chn_attr.scale_enable = K_FALSE; - // chn_attr.dw_enable = K_FALSE; - chn_attr.chn_enable = K_TRUE; - chn_attr.pix_format = PIXEL_FORMAT_YVU_PLANAR_420; - chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp - chn_attr.buffer_size = config.comm_pool[0].blk_size; - vicap_chn = VICAP_CHN_ID_0; - - printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); - ret = kd_mpi_vicap_set_chn_attr(vicap_dev, vicap_chn, chn_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); - return ret; - } - - //bind vicap chn 0 to vo - vicap_mpp_chn.mod_id = K_ID_VI; - vicap_mpp_chn.dev_id = vicap_dev; - vicap_mpp_chn.chn_id = vicap_chn; - - vo_mpp_chn.mod_id = K_ID_VO; - vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; - vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; - - sample_vicap_bind_vo(vicap_mpp_chn, vo_mpp_chn); - printf("sample_vicap ...dwc_dsi_init\n"); - - //set chn1 output rgb888p - chn_attr.out_win.h_start = 0; - chn_attr.out_win.v_start = 0; - chn_attr.out_win.width = SENSOR_WIDTH ; - chn_attr.out_win.height = SENSOR_HEIGHT; - // chn_attr.crop_win = dev_attr.acq_win; - -#if defined(CONFIG_BOARD_K230_CANMV) - chn_attr.crop_win = dev_attr.acq_win; -#else - chn_attr.crop_win.h_start = 768; - chn_attr.crop_win.v_start = 16; - chn_attr.crop_win.width = ISP_CHN0_WIDTH; - chn_attr.crop_win.height = ISP_CHN0_HEIGHT; -#endif - - chn_attr.scale_win = chn_attr.out_win; - chn_attr.crop_enable = K_FALSE; - chn_attr.scale_enable = K_FALSE; - // chn_attr.dw_enable = K_FALSE; - chn_attr.chn_enable = K_TRUE; - chn_attr.pix_format = PIXEL_FORMAT_BGR_888_PLANAR; - chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp - chn_attr.buffer_size = config.comm_pool[1].blk_size; - - printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); - ret = kd_mpi_vicap_set_chn_attr(vicap_dev, VICAP_CHN_ID_1, chn_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); - return ret; - } - - printf("sample_vicap ...kd_mpi_vicap_init\n"); - ret = kd_mpi_vicap_init(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - // goto err_exit; - } - - printf("sample_vicap ...kd_mpi_vicap_start_stream\n"); - ret = kd_mpi_vicap_start_stream(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - // goto err_exit; - } - - return ret; -} - -int vivcap_stop() -{ - printf("sample_vicap ...kd_mpi_vicap_stop_stream\n"); - int ret = kd_mpi_vicap_stop_stream(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - return ret; - } - - ret = kd_mpi_vicap_deinit(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_deinit failed.\n"); - return ret; - } - - kd_mpi_vo_disable_video_layer(K_VO_LAYER1); - - vicap_mpp_chn.mod_id = K_ID_VI; - vicap_mpp_chn.dev_id = vicap_dev; - vicap_mpp_chn.chn_id = vicap_chn; - - vo_mpp_chn.mod_id = K_ID_VO; - vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; - vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; - - sample_vicap_unbind_vo(vicap_mpp_chn, vo_mpp_chn); - - /*Allow one frame time for the VO to release the VB block*/ - k_u32 display_ms = 1000 / 33; - usleep(1000 * display_ms); - - ret = kd_mpi_vb_exit(); - if (ret) { - printf("sample_vicap, kd_mpi_vb_exit failed.\n"); - return ret; - } - - return 0; -} - -void yuv_rotate_90(char *des, char *src,int width,int height) -{ - int n = 0; - int hw = width>>1; - int hh = height>>1; - int size = width * height; - int hsize = size>>2; - - int pos = 0; - - for(int i = width-1;i >= 0;i--) - { - pos = 0; - for(int j= 0;j < height;j++) - { - des[n++]= src[pos+i]; - pos += width; - } - } - +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include + +#include "mpi_sys_api.h" + +/* vicap */ +#include +#include +#include +#include +#include + +#include "k_module.h" +#include "k_type.h" +#include "k_vb_comm.h" +#include "k_video_comm.h" +#include "k_sys_comm.h" +#include "mpi_vb_api.h" +#include "mpi_vicap_api.h" +#include "mpi_isp_api.h" +#include "mpi_sys_api.h" +#include "k_vo_comm.h" +#include "mpi_vo_api.h" + +#include "vo_test_case.h" + +#include "k_connector_comm.h" +#include "mpi_connector_api.h" +#include "k_autoconf_comm.h" + + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) +#define SENSOR_CHANNEL (3) // isp通道数 +#define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 +#define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 +#define ISP_CHN0_WIDTH (1920)//(1920) +#define ISP_CHN0_HEIGHT (1080)//(1080) +#define vicap_install_osd (1) +#define osd_id K_VO_OSD3 +#define osd_width (1920) +#define osd_height (1080) +#else +#define SENSOR_CHANNEL (3) // isp通道数 +#define SENSOR_HEIGHT (1280) // isp高度,ai输入,竖屏 +#define SENSOR_WIDTH (720) // isp宽度,ai输入,竖屏 +#define ISP_CHN0_WIDTH (1088)//(1920) +#define ISP_CHN0_HEIGHT (1920)//(1080) +#define vicap_install_osd (1) +#define osd_id K_VO_OSD3 +#define osd_width (1080) +#define osd_height (1920) +#endif + + +k_vb_config config; +k_vicap_dev vicap_dev; +k_vicap_chn vicap_chn; +k_vicap_dev_attr dev_attr; +k_vicap_chn_attr chn_attr; +k_vicap_sensor_info sensor_info; +k_vicap_sensor_type sensor_type; +k_mpp_chn vicap_mpp_chn; +k_mpp_chn vo_mpp_chn; + +k_video_frame_info dump_info; + +k_vo_draw_frame vo_frame = (k_vo_draw_frame) { + 1, + 16, + 16, + 128, + 128, + 1 +}; + +static k_vb_blk_handle block; +k_u32 g_pool_id; + +int vo_creat_layer_test(k_vo_layer chn_id, layer_info *info) +{ + k_vo_video_layer_attr attr; + + // check layer + if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) + || ((info->func != 0) && (chn_id == K_VO_LAYER2))) + { + printf("input layer num failed \n"); + return -1 ; + } + + // check scaler + + // set offset + attr.display_rect = info->offset; + // set act + attr.img_size = info->act_size; + // sget size + info->size = info->act_size.height * info->act_size.width * 3 / 2; + //set pixel format + attr.pixel_format = info->format; + if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) + { + printf("input pix format failed \n"); + return -1; + } + // set stride + attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); + // set function + attr.func = info->func; + // set scaler attr + attr.scaler_attr = info->attr; + + // set video layer atrr + kd_mpi_vo_set_video_layer_attr(chn_id, &attr); + + // enable layer + kd_mpi_vo_enable_video_layer(chn_id); + + return 0; +} + +k_vb_blk_handle vo_insert_frame(k_video_frame_info *vf_info, void **pic_vaddr) +{ + k_u64 phys_addr = 0; + k_u32 *virt_addr; + k_vb_blk_handle handle; + k_s32 size; + + if (vf_info == NULL) + return K_FALSE; + + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_8888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_8888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 4; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_565 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_565) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_4444 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_4444) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_1555 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_1555) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3 / 2; + + size = size + 4096; // 强制4K ,后边得删了 + + printf("vb block size is %x \n", size); + + handle = kd_mpi_vb_get_block(g_pool_id, size, NULL); + if (handle == VB_INVALID_HANDLE) + { + printf("%s get vb block error\n", __func__); + return K_FAILED; + } + + phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); + if (phys_addr == 0) + { + printf("%s get phys addr error\n", __func__); + return K_FAILED; + } + + virt_addr = (k_u32 *)kd_mpi_sys_mmap(phys_addr, size); + // virt_addr = (k_u32 *)kd_mpi_sys_mmap_cached(phys_addr, size); + + if (virt_addr == NULL) + { + printf("%s mmap error\n", __func__); + return K_FAILED; + } + + vf_info->mod_id = K_ID_VO; + vf_info->pool_id = g_pool_id; + vf_info->v_frame.phys_addr[0] = phys_addr; + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + vf_info->v_frame.phys_addr[1] = phys_addr + (vf_info->v_frame.height * vf_info->v_frame.stride[0]); + *pic_vaddr = virt_addr; + + printf("phys_addr is %lx g_pool_id is %d \n", phys_addr, g_pool_id); + + return handle; +} + +k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) +{ + k_vo_video_osd_attr attr; + + // set attr + attr.global_alptha = info->global_alptha; + + if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) + { + info->size = info->act_size.width * info->act_size.height * 4; + info->stride = info->act_size.width * 4 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) + { + info->size = info->act_size.width * info->act_size.height * 3; + info->stride = info->act_size.width * 3 / 8; + } + else if(info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if(info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else + { + printf("set osd pixel format failed \n"); + } + + attr.stride = info->stride; + attr.pixel_format = info->format; + attr.display_rect = info->offset; + attr.img_size = info->act_size; + kd_mpi_vo_set_video_osd_attr(osd, &attr); + + kd_mpi_vo_osd_enable(osd); + + return 0; +} + +void sample_vicap_install_osd(void) +{ + osd_info osd; + + osd.act_size.width = osd_width ; + osd.act_size.height = osd_height; + osd.offset.x = 0; + osd.offset.y = 0; + osd.global_alptha = 0xff; + // osd.global_alptha = 0x32; + osd.format = PIXEL_FORMAT_ARGB_8888;//PIXEL_FORMAT_ARGB_4444; //PIXEL_FORMAT_ARGB_1555;//PIXEL_FORMAT_ARGB_8888; + + vo_creat_osd_test(osd_id, &osd); +} + +void vo_osd_release_block(void) +{ + if(vicap_install_osd == 1) + { + kd_mpi_vo_osd_disable(osd_id); + kd_mpi_vb_release_block(block); + } + +} + +static k_s32 sample_connector_init(void) +{ + k_u32 ret = 0; + k_s32 connector_fd; +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#else + k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#endif + k_connector_info connector_info; + + memset(&connector_info, 0, sizeof(k_connector_info)); + + //connector get sensor info + ret = kd_mpi_get_connector_info(connector_type, &connector_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + + connector_fd = kd_mpi_connector_open(connector_info.connector_name); + if (connector_fd < 0) { + printf("%s, connector open failed.\n", __func__); + return K_ERR_VO_NOTREADY; + } + + // set connect power + kd_mpi_connector_power_set(connector_fd, K_TRUE); + // connector init + kd_mpi_connector_init(connector_fd, connector_info); + + return 0; +} + +static k_s32 vo_layer_vdss_bind_vo_config(void) +{ + layer_info info; + + k_vo_layer chn_id = K_VO_LAYER1; + + memset(&info, 0, sizeof(info)); + + sample_connector_init(); + + // config lyaer + info.act_size.width = ISP_CHN0_WIDTH;//ISP_CHN0_HEIGHT;//1080;//640;//1080; + info.act_size.height = ISP_CHN0_HEIGHT;//ISP_CHN0_WIDTH;//1920;//480;//1920; + info.format = PIXEL_FORMAT_YVU_PLANAR_420; + info.func = 0;//K_ROTATION_180;////K_ROTATION_90; + info.global_alptha = 0xff; + info.offset.x = 0;//(1080-w)/2, + info.offset.y = 0;//(1920-h)/2; + vo_creat_layer_test(chn_id, &info); + + if(vicap_install_osd == 1) + sample_vicap_install_osd(); + + //exit ; + return 0; +} + +static void sample_vicap_bind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) +{ + k_s32 ret; + + ret = kd_mpi_sys_bind(&vicap_mpp_chn, &vo_mpp_chn); + if (ret) { + printf("kd_mpi_sys_unbind failed:0x%x\n", ret); + } + + return; +} + +static void sample_vicap_unbind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) +{ + k_s32 ret; + + ret = kd_mpi_sys_unbind(&vicap_mpp_chn, &vo_mpp_chn); + if (ret) { + printf("kd_mpi_sys_unbind failed:0x%x\n", ret); + } + + return; +} + +int vivcap_start() +{ + k_s32 ret = 0; + + k_u32 pool_id; + k_vb_pool_config pool_config; + + printf("sample_vicap ...\n"); + +#if defined(CONFIG_BOARD_K230_CANMV) + sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; +#else + sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; +#endif + vicap_dev = VICAP_DEV_ID_0; + + memset(&config, 0, sizeof(config)); + config.max_pool_cnt = 64; + //VB for YUV420SP output + config.comm_pool[0].blk_cnt = 5; + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[0].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), VICAP_ALIGN_1K); + + //VB for RGB888 output + config.comm_pool[1].blk_cnt = 5; + config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[1].blk_size = VICAP_ALIGN_UP((SENSOR_HEIGHT * SENSOR_WIDTH * 3 ), VICAP_ALIGN_1K); + + ret = kd_mpi_vb_set_config(&config); + if (ret) { + printf("vb_set_config failed ret:%d\n", ret); + return ret; + } + + k_vb_supplement_config supplement_config; + memset(&supplement_config, 0, sizeof(supplement_config)); + supplement_config.supplement_config |= VB_SUPPLEMENT_JPEG_MASK; + + ret = kd_mpi_vb_set_supplement_config(&supplement_config); + if (ret) { + printf("vb_set_supplement_config failed ret:%d\n", ret); + return ret; + } + + ret = kd_mpi_vb_init(); + if (ret) { + printf("vb_init failed ret:%d\n", ret); + return ret; + } + printf("sample_vicap ...kd_mpi_vicap_get_sensor_info\n"); + + // dwc_dsi_init(); + vo_layer_vdss_bind_vo_config(); + + if(vicap_install_osd == 1) + { + memset(&pool_config, 0, sizeof(pool_config)); + pool_config.blk_size = VICAP_ALIGN_UP((osd_width * osd_height * 4 * 2), VICAP_ALIGN_1K); + pool_config.blk_cnt = 4; + pool_config.mode = VB_REMAP_MODE_NOCACHE; + pool_id = kd_mpi_vb_create_pool(&pool_config); // osd0 - 3 argb 320 x 240 + g_pool_id = pool_id; + + printf("--------aa--------------g_pool_id is %d pool_id is %d \n",g_pool_id, pool_id); + } + + memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); + ret = kd_mpi_vicap_get_sensor_info(sensor_type, &sensor_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + + memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); + dev_attr.acq_win.h_start = 0; + dev_attr.acq_win.v_start = 0; +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + dev_attr.acq_win.width = ISP_CHN0_WIDTH; + dev_attr.acq_win.height = ISP_CHN0_HEIGHT; +#else + dev_attr.acq_win.width = 2592;//SENSOR_HEIGHT; + dev_attr.acq_win.height = 1944;//SENSOR_WIDTH; +#endif + dev_attr.mode = VICAP_WORK_ONLINE_MODE; + + dev_attr.pipe_ctrl.data = 0xFFFFFFFF; + dev_attr.pipe_ctrl.bits.af_enable = 0; + dev_attr.pipe_ctrl.bits.ahdr_enable = 0; + + + dev_attr.cpature_frame = 0; + memcpy(&dev_attr.sensor_info, &sensor_info, sizeof(k_vicap_sensor_info)); + + ret = kd_mpi_vicap_set_dev_attr(vicap_dev, dev_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_dev_attr failed.\n"); + return ret; + } + + memset(&chn_attr, 0, sizeof(k_vicap_chn_attr)); + + //set chn0 output yuv420sp + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = ISP_CHN0_WIDTH; + chn_attr.out_win.height = ISP_CHN0_HEIGHT; + + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + chn_attr.crop_win = dev_attr.acq_win; +#else + // chn_attr.crop_win = dev_attr.acq_win; + chn_attr.crop_win.h_start = 768; + chn_attr.crop_win.v_start = 16; + chn_attr.crop_win.width = ISP_CHN0_WIDTH; + chn_attr.crop_win.height = ISP_CHN0_HEIGHT; +#endif + + chn_attr.scale_win = chn_attr.out_win; + chn_attr.crop_enable = K_FALSE; + chn_attr.scale_enable = K_FALSE; + // chn_attr.dw_enable = K_FALSE; + chn_attr.chn_enable = K_TRUE; + chn_attr.pix_format = PIXEL_FORMAT_YVU_PLANAR_420; + chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp + chn_attr.buffer_size = config.comm_pool[0].blk_size; + vicap_chn = VICAP_CHN_ID_0; + + printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); + ret = kd_mpi_vicap_set_chn_attr(vicap_dev, vicap_chn, chn_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); + return ret; + } + + //bind vicap chn 0 to vo + vicap_mpp_chn.mod_id = K_ID_VI; + vicap_mpp_chn.dev_id = vicap_dev; + vicap_mpp_chn.chn_id = vicap_chn; + + vo_mpp_chn.mod_id = K_ID_VO; + vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; + vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; + + sample_vicap_bind_vo(vicap_mpp_chn, vo_mpp_chn); + printf("sample_vicap ...dwc_dsi_init\n"); + + //set chn1 output rgb888p + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = SENSOR_WIDTH ; + chn_attr.out_win.height = SENSOR_HEIGHT; + // chn_attr.crop_win = dev_attr.acq_win; + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + chn_attr.crop_win = dev_attr.acq_win; +#else + chn_attr.crop_win.h_start = 768; + chn_attr.crop_win.v_start = 16; + chn_attr.crop_win.width = ISP_CHN0_WIDTH; + chn_attr.crop_win.height = ISP_CHN0_HEIGHT; +#endif + + chn_attr.scale_win = chn_attr.out_win; + chn_attr.crop_enable = K_FALSE; + chn_attr.scale_enable = K_FALSE; + // chn_attr.dw_enable = K_FALSE; + chn_attr.chn_enable = K_TRUE; + chn_attr.pix_format = PIXEL_FORMAT_BGR_888_PLANAR; + chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp + chn_attr.buffer_size = config.comm_pool[1].blk_size; + + printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); + ret = kd_mpi_vicap_set_chn_attr(vicap_dev, VICAP_CHN_ID_1, chn_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); + return ret; + } + + printf("sample_vicap ...kd_mpi_vicap_init\n"); + ret = kd_mpi_vicap_init(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + // goto err_exit; + } + + printf("sample_vicap ...kd_mpi_vicap_start_stream\n"); + ret = kd_mpi_vicap_start_stream(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + // goto err_exit; + } + + return ret; +} + +int vivcap_stop() +{ + printf("sample_vicap ...kd_mpi_vicap_stop_stream\n"); + int ret = kd_mpi_vicap_stop_stream(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + return ret; + } + + ret = kd_mpi_vicap_deinit(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_deinit failed.\n"); + return ret; + } + + kd_mpi_vo_disable_video_layer(K_VO_LAYER1); + + vicap_mpp_chn.mod_id = K_ID_VI; + vicap_mpp_chn.dev_id = vicap_dev; + vicap_mpp_chn.chn_id = vicap_chn; + + vo_mpp_chn.mod_id = K_ID_VO; + vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; + vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; + + sample_vicap_unbind_vo(vicap_mpp_chn, vo_mpp_chn); + + /*Allow one frame time for the VO to release the VB block*/ + k_u32 display_ms = 1000 / 33; + usleep(1000 * display_ms); + + ret = kd_mpi_vb_exit(); + if (ret) { + printf("sample_vicap, kd_mpi_vb_exit failed.\n"); + return ret; + } + + return 0; +} + +void yuv_rotate_90(char *des, char *src,int width,int height) +{ + int n = 0; + int hw = width>>1; + int hh = height>>1; + int size = width * height; + int hsize = size>>2; + + int pos = 0; + + for(int i = width-1;i >= 0;i--) + { + pos = 0; + for(int j= 0;j < height;j++) + { + des[n++]= src[pos+i]; + pos += width; + } + } + } \ No newline at end of file diff --git a/src/reference/ai_poc/sq_handreco/hand_detection.cc b/src/reference/ai_poc/sq_handreco/hand_detection.cc index 3173c51bb..e0440af6c 100644 --- a/src/reference/ai_poc/sq_handreco/hand_detection.cc +++ b/src/reference/ai_poc/sq_handreco/hand_detection.cc @@ -177,7 +177,7 @@ std::vector HandDetection::decode_infer(float *data, int stride, FrameS box.x2 = std::max(0, std::min(int(frame_size.width), int(cx + w / 2.f))); box.y2 = std::max(0, std::min(int(frame_size.height), int(cy + h / 2.f))); - #if defined(CONFIG_BOARD_K230_CANMV) + #if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) if (abs(box.y1-box.y2)< 0.1*frame_size.height) continue; if ((abs(box.x1-box.x2)< 0.25*frame_size.width) && ((box.x1 < 0.03*frame_size.width) || (box.x2 > 0.97*frame_size.width))) diff --git a/src/reference/ai_poc/sq_handreco/vi_vo.h b/src/reference/ai_poc/sq_handreco/vi_vo.h index e3d8bdba4..0a11a4d31 100644 --- a/src/reference/ai_poc/sq_handreco/vi_vo.h +++ b/src/reference/ai_poc/sq_handreco/vi_vo.h @@ -1,627 +1,628 @@ -/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include -#include -#include - -#include "mpi_sys_api.h" - -/* vicap */ -#include -#include -#include -#include -#include - -#include "k_module.h" -#include "k_type.h" -#include "k_vb_comm.h" -#include "k_video_comm.h" -#include "k_sys_comm.h" -#include "mpi_vb_api.h" -#include "mpi_vicap_api.h" -#include "mpi_isp_api.h" -#include "mpi_sys_api.h" -#include "k_vo_comm.h" -#include "mpi_vo_api.h" - -#include "vo_test_case.h" - -#include "k_connector_comm.h" -#include "mpi_connector_api.h" -#include "k_autoconf_comm.h" - - -#if defined(CONFIG_BOARD_K230_CANMV) -#define SENSOR_CHANNEL (3) // isp通道数 -#define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 -#define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 -#define ISP_CHN0_WIDTH (1920)//(1920) -#define ISP_CHN0_HEIGHT (1080)//(1080) -#define vicap_install_osd (1) -#define osd_id K_VO_OSD3 -#define osd_width (1920) -#define osd_height (1080) -#else -#define SENSOR_CHANNEL (3) // isp通道数 -#define SENSOR_HEIGHT (1280) // isp高度,ai输入,竖屏 -#define SENSOR_WIDTH (720) // isp宽度,ai输入,竖屏 -#define ISP_CHN0_WIDTH (1088)//(1920) -#define ISP_CHN0_HEIGHT (1920)//(1080) -#define vicap_install_osd (1) -#define osd_id K_VO_OSD3 -#define osd_width (1080) -#define osd_height (1920) -#endif - - -k_vb_config config; -k_vicap_dev vicap_dev; -k_vicap_chn vicap_chn; -k_vicap_dev_attr dev_attr; -k_vicap_chn_attr chn_attr; -k_vicap_sensor_info sensor_info; -k_vicap_sensor_type sensor_type; -k_mpp_chn vicap_mpp_chn; -k_mpp_chn vo_mpp_chn; - -k_video_frame_info dump_info; - -k_vo_draw_frame vo_frame = (k_vo_draw_frame) { - 1, - 16, - 16, - 128, - 128, - 1 -}; - -static k_vb_blk_handle block; -k_u32 g_pool_id; - -int vo_creat_layer_test(k_vo_layer chn_id, layer_info *info) -{ - k_vo_video_layer_attr attr; - - // check layer - if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) - || ((info->func != 0) && (chn_id == K_VO_LAYER2))) - { - printf("input layer num failed \n"); - return -1 ; - } - - // check scaler - - // set offset - attr.display_rect = info->offset; - // set act - attr.img_size = info->act_size; - // sget size - info->size = info->act_size.height * info->act_size.width * 3 / 2; - //set pixel format - attr.pixel_format = info->format; - if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) - { - printf("input pix format failed \n"); - return -1; - } - // set stride - attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); - // set function - attr.func = info->func; - // set scaler attr - attr.scaler_attr = info->attr; - - // set video layer atrr - kd_mpi_vo_set_video_layer_attr(chn_id, &attr); - - // enable layer - kd_mpi_vo_enable_video_layer(chn_id); - - return 0; -} - -k_vb_blk_handle vo_insert_frame(k_video_frame_info *vf_info, void **pic_vaddr) -{ - k_u64 phys_addr = 0; - k_u32 *virt_addr; - k_vb_blk_handle handle; - k_s32 size; - - if (vf_info == NULL) - return K_FALSE; - - if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_8888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_8888) - size = vf_info->v_frame.height * vf_info->v_frame.width * 4; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_565 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_565) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_4444 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_4444) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_888) - size = vf_info->v_frame.height * vf_info->v_frame.width * 3; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_1555 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_1555) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) - size = vf_info->v_frame.height * vf_info->v_frame.width * 3 / 2; - - size = size + 4096; // 强制4K ,后边得删了 - - printf("vb block size is %x \n", size); - - handle = kd_mpi_vb_get_block(g_pool_id, size, NULL); - if (handle == VB_INVALID_HANDLE) - { - printf("%s get vb block error\n", __func__); - return K_FAILED; - } - - phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); - if (phys_addr == 0) - { - printf("%s get phys addr error\n", __func__); - return K_FAILED; - } - - virt_addr = (k_u32 *)kd_mpi_sys_mmap(phys_addr, size); - // virt_addr = (k_u32 *)kd_mpi_sys_mmap_cached(phys_addr, size); - - if (virt_addr == NULL) - { - printf("%s mmap error\n", __func__); - return K_FAILED; - } - - vf_info->mod_id = K_ID_VO; - vf_info->pool_id = g_pool_id; - vf_info->v_frame.phys_addr[0] = phys_addr; - if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) - vf_info->v_frame.phys_addr[1] = phys_addr + (vf_info->v_frame.height * vf_info->v_frame.stride[0]); - *pic_vaddr = virt_addr; - - printf("phys_addr is %lx g_pool_id is %d \n", phys_addr, g_pool_id); - - return handle; -} - -k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) -{ - k_vo_video_osd_attr attr; - - // set attr - attr.global_alptha = info->global_alptha; - - if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) - { - info->size = info->act_size.width * info->act_size.height * 4; - info->stride = info->act_size.width * 4 / 8; - } - else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) - { - info->size = info->act_size.width * info->act_size.height * 3; - info->stride = info->act_size.width * 3 / 8; - } - else if(info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else if(info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else - { - printf("set osd pixel format failed \n"); - } - - attr.stride = info->stride; - attr.pixel_format = info->format; - attr.display_rect = info->offset; - attr.img_size = info->act_size; - kd_mpi_vo_set_video_osd_attr(osd, &attr); - - kd_mpi_vo_osd_enable(osd); - - return 0; -} - -void sample_vicap_install_osd(void) -{ - osd_info osd; - - osd.act_size.width = osd_width ; - osd.act_size.height = osd_height; - osd.offset.x = 0; - osd.offset.y = 0; - osd.global_alptha = 0xff; - // osd.global_alptha = 0x32; - osd.format = PIXEL_FORMAT_ARGB_8888;//PIXEL_FORMAT_ARGB_4444; //PIXEL_FORMAT_ARGB_1555;//PIXEL_FORMAT_ARGB_8888; - - vo_creat_osd_test(osd_id, &osd); -} - -void vo_osd_release_block(void) -{ - if(vicap_install_osd == 1) - { - kd_mpi_vo_osd_disable(osd_id); - kd_mpi_vb_release_block(block); - } - -} - -static k_s32 sample_connector_init(void) -{ - k_u32 ret = 0; - k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) - k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; -#else - k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; -#endif - k_connector_info connector_info; - - memset(&connector_info, 0, sizeof(k_connector_info)); - - //connector get sensor info - ret = kd_mpi_get_connector_info(connector_type, &connector_info); - if (ret) { - printf("sample_vicap, the sensor type not supported!\n"); - return ret; - } - - connector_fd = kd_mpi_connector_open(connector_info.connector_name); - if (connector_fd < 0) { - printf("%s, connector open failed.\n", __func__); - return K_ERR_VO_NOTREADY; - } - - // set connect power - kd_mpi_connector_power_set(connector_fd, K_TRUE); - // connector init - kd_mpi_connector_init(connector_fd, connector_info); - - return 0; -} - -static k_s32 vo_layer_vdss_bind_vo_config(void) -{ - layer_info info; - - k_vo_layer chn_id = K_VO_LAYER1; - - memset(&info, 0, sizeof(info)); - - sample_connector_init(); - - // config lyaer - info.act_size.width = ISP_CHN0_WIDTH;//ISP_CHN0_HEIGHT;//1080;//640;//1080; - info.act_size.height = ISP_CHN0_HEIGHT;//ISP_CHN0_WIDTH;//1920;//480;//1920; - info.format = PIXEL_FORMAT_YVU_PLANAR_420; - info.func = 0;//K_ROTATION_180;////K_ROTATION_90; - info.global_alptha = 0xff; - info.offset.x = 0;//(1080-w)/2, - info.offset.y = 0;//(1920-h)/2; - vo_creat_layer_test(chn_id, &info); - - if(vicap_install_osd == 1) - sample_vicap_install_osd(); - - //exit ; - return 0; -} - -static void sample_vicap_bind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) -{ - k_s32 ret; - - ret = kd_mpi_sys_bind(&vicap_mpp_chn, &vo_mpp_chn); - if (ret) { - printf("kd_mpi_sys_unbind failed:0x%x\n", ret); - } - - return; -} - -static void sample_vicap_unbind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) -{ - k_s32 ret; - - ret = kd_mpi_sys_unbind(&vicap_mpp_chn, &vo_mpp_chn); - if (ret) { - printf("kd_mpi_sys_unbind failed:0x%x\n", ret); - } - - return; -} - -int vivcap_start() -{ - k_s32 ret = 0; - - k_u32 pool_id; - k_vb_pool_config pool_config; - - printf("sample_vicap ...\n"); - -#if defined(CONFIG_BOARD_K230_CANMV) - sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); -#else - sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; -#endif - vicap_dev = VICAP_DEV_ID_0; - - memset(&config, 0, sizeof(config)); - config.max_pool_cnt = 64; - //VB for YUV420SP output - config.comm_pool[0].blk_cnt = 5; - config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; - config.comm_pool[0].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), VICAP_ALIGN_1K); - - //VB for RGB888 output - config.comm_pool[1].blk_cnt = 5; - config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; - config.comm_pool[1].blk_size = VICAP_ALIGN_UP((SENSOR_HEIGHT * SENSOR_WIDTH * 3 ), VICAP_ALIGN_1K); - - ret = kd_mpi_vb_set_config(&config); - if (ret) { - printf("vb_set_config failed ret:%d\n", ret); - return ret; - } - - k_vb_supplement_config supplement_config; - memset(&supplement_config, 0, sizeof(supplement_config)); - supplement_config.supplement_config |= VB_SUPPLEMENT_JPEG_MASK; - - ret = kd_mpi_vb_set_supplement_config(&supplement_config); - if (ret) { - printf("vb_set_supplement_config failed ret:%d\n", ret); - return ret; - } - - ret = kd_mpi_vb_init(); - if (ret) { - printf("vb_init failed ret:%d\n", ret); - return ret; - } - printf("sample_vicap ...kd_mpi_vicap_get_sensor_info\n"); - - // dwc_dsi_init(); - vo_layer_vdss_bind_vo_config(); - - if(vicap_install_osd == 1) - { - memset(&pool_config, 0, sizeof(pool_config)); - pool_config.blk_size = VICAP_ALIGN_UP((osd_width * osd_height * 4 * 2), VICAP_ALIGN_1K); - pool_config.blk_cnt = 4; - pool_config.mode = VB_REMAP_MODE_NOCACHE; - pool_id = kd_mpi_vb_create_pool(&pool_config); // osd0 - 3 argb 320 x 240 - g_pool_id = pool_id; - - printf("--------aa--------------g_pool_id is %d pool_id is %d \n",g_pool_id, pool_id); - } - - memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); - ret = kd_mpi_vicap_get_sensor_info(sensor_type, &sensor_info); - if (ret) { - printf("sample_vicap, the sensor type not supported!\n"); - return ret; - } - - memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); - dev_attr.acq_win.h_start = 0; - dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) - dev_attr.acq_win.width = ISP_CHN0_WIDTH; - dev_attr.acq_win.height = ISP_CHN0_HEIGHT; -#else - dev_attr.acq_win.width = 2592;//SENSOR_HEIGHT; - dev_attr.acq_win.height = 1944;//SENSOR_WIDTH; -#endif - dev_attr.mode = VICAP_WORK_ONLINE_MODE; - - dev_attr.pipe_ctrl.data = 0xFFFFFFFF; - dev_attr.pipe_ctrl.bits.af_enable = 0; - dev_attr.pipe_ctrl.bits.ahdr_enable = 0; - - - dev_attr.cpature_frame = 0; - memcpy(&dev_attr.sensor_info, &sensor_info, sizeof(k_vicap_sensor_info)); - - ret = kd_mpi_vicap_set_dev_attr(vicap_dev, dev_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_dev_attr failed.\n"); - return ret; - } - - memset(&chn_attr, 0, sizeof(k_vicap_chn_attr)); - - //set chn0 output yuv420sp - chn_attr.out_win.h_start = 0; - chn_attr.out_win.v_start = 0; - chn_attr.out_win.width = ISP_CHN0_WIDTH; - chn_attr.out_win.height = ISP_CHN0_HEIGHT; - - -#if defined(CONFIG_BOARD_K230_CANMV) - chn_attr.crop_win = dev_attr.acq_win; -#else - // chn_attr.crop_win = dev_attr.acq_win; - chn_attr.crop_win.h_start = 768; - chn_attr.crop_win.v_start = 16; - chn_attr.crop_win.width = ISP_CHN0_WIDTH; - chn_attr.crop_win.height = ISP_CHN0_HEIGHT; -#endif - - chn_attr.scale_win = chn_attr.out_win; - chn_attr.crop_enable = K_FALSE; - chn_attr.scale_enable = K_FALSE; - // chn_attr.dw_enable = K_FALSE; - chn_attr.chn_enable = K_TRUE; - chn_attr.pix_format = PIXEL_FORMAT_YVU_PLANAR_420; - chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp - chn_attr.buffer_size = config.comm_pool[0].blk_size; - vicap_chn = VICAP_CHN_ID_0; - - printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); - ret = kd_mpi_vicap_set_chn_attr(vicap_dev, vicap_chn, chn_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); - return ret; - } - - //bind vicap chn 0 to vo - vicap_mpp_chn.mod_id = K_ID_VI; - vicap_mpp_chn.dev_id = vicap_dev; - vicap_mpp_chn.chn_id = vicap_chn; - - vo_mpp_chn.mod_id = K_ID_VO; - vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; - vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; - - sample_vicap_bind_vo(vicap_mpp_chn, vo_mpp_chn); - printf("sample_vicap ...dwc_dsi_init\n"); - - //set chn1 output rgb888p - chn_attr.out_win.h_start = 0; - chn_attr.out_win.v_start = 0; - chn_attr.out_win.width = SENSOR_WIDTH ; - chn_attr.out_win.height = SENSOR_HEIGHT; - // chn_attr.crop_win = dev_attr.acq_win; - -#if defined(CONFIG_BOARD_K230_CANMV) - chn_attr.crop_win = dev_attr.acq_win; -#else - chn_attr.crop_win.h_start = 768; - chn_attr.crop_win.v_start = 16; - chn_attr.crop_win.width = ISP_CHN0_WIDTH; - chn_attr.crop_win.height = ISP_CHN0_HEIGHT; -#endif - - chn_attr.scale_win = chn_attr.out_win; - chn_attr.crop_enable = K_FALSE; - chn_attr.scale_enable = K_FALSE; - // chn_attr.dw_enable = K_FALSE; - chn_attr.chn_enable = K_TRUE; - chn_attr.pix_format = PIXEL_FORMAT_BGR_888_PLANAR; - chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp - chn_attr.buffer_size = config.comm_pool[1].blk_size; - - printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); - ret = kd_mpi_vicap_set_chn_attr(vicap_dev, VICAP_CHN_ID_1, chn_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); - return ret; - } - - printf("sample_vicap ...kd_mpi_vicap_init\n"); - ret = kd_mpi_vicap_init(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - // goto err_exit; - } - - printf("sample_vicap ...kd_mpi_vicap_start_stream\n"); - ret = kd_mpi_vicap_start_stream(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - // goto err_exit; - } - - return ret; -} - -int vivcap_stop() -{ - printf("sample_vicap ...kd_mpi_vicap_stop_stream\n"); - int ret = kd_mpi_vicap_stop_stream(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - return ret; - } - - ret = kd_mpi_vicap_deinit(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_deinit failed.\n"); - return ret; - } - - kd_mpi_vo_disable_video_layer(K_VO_LAYER1); - - vicap_mpp_chn.mod_id = K_ID_VI; - vicap_mpp_chn.dev_id = vicap_dev; - vicap_mpp_chn.chn_id = vicap_chn; - - vo_mpp_chn.mod_id = K_ID_VO; - vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; - vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; - - sample_vicap_unbind_vo(vicap_mpp_chn, vo_mpp_chn); - - /*Allow one frame time for the VO to release the VB block*/ - k_u32 display_ms = 1000 / 33; - usleep(1000 * display_ms); - - ret = kd_mpi_vb_exit(); - if (ret) { - printf("sample_vicap, kd_mpi_vb_exit failed.\n"); - return ret; - } - - return 0; -} - -void yuv_rotate_90(char *des, char *src,int width,int height) -{ - int n = 0; - int hw = width>>1; - int hh = height>>1; - int size = width * height; - int hsize = size>>2; - - int pos = 0; - - for(int i = width-1;i >= 0;i--) - { - pos = 0; - for(int j= 0;j < height;j++) - { - des[n++]= src[pos+i]; - pos += width; - } - } - +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include + +#include "mpi_sys_api.h" + +/* vicap */ +#include +#include +#include +#include +#include + +#include "k_module.h" +#include "k_type.h" +#include "k_vb_comm.h" +#include "k_video_comm.h" +#include "k_sys_comm.h" +#include "mpi_vb_api.h" +#include "mpi_vicap_api.h" +#include "mpi_isp_api.h" +#include "mpi_sys_api.h" +#include "k_vo_comm.h" +#include "mpi_vo_api.h" + +#include "vo_test_case.h" + +#include "k_connector_comm.h" +#include "mpi_connector_api.h" +#include "k_autoconf_comm.h" + + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) +#define SENSOR_CHANNEL (3) // isp通道数 +#define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 +#define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 +#define ISP_CHN0_WIDTH (1920)//(1920) +#define ISP_CHN0_HEIGHT (1080)//(1080) +#define vicap_install_osd (1) +#define osd_id K_VO_OSD3 +#define osd_width (1920) +#define osd_height (1080) +#else +#define SENSOR_CHANNEL (3) // isp通道数 +#define SENSOR_HEIGHT (1280) // isp高度,ai输入,竖屏 +#define SENSOR_WIDTH (720) // isp宽度,ai输入,竖屏 +#define ISP_CHN0_WIDTH (1088)//(1920) +#define ISP_CHN0_HEIGHT (1920)//(1080) +#define vicap_install_osd (1) +#define osd_id K_VO_OSD3 +#define osd_width (1080) +#define osd_height (1920) +#endif + + +k_vb_config config; +k_vicap_dev vicap_dev; +k_vicap_chn vicap_chn; +k_vicap_dev_attr dev_attr; +k_vicap_chn_attr chn_attr; +k_vicap_sensor_info sensor_info; +k_vicap_sensor_type sensor_type; +k_mpp_chn vicap_mpp_chn; +k_mpp_chn vo_mpp_chn; + +k_video_frame_info dump_info; + +k_vo_draw_frame vo_frame = (k_vo_draw_frame) { + 1, + 16, + 16, + 128, + 128, + 1 +}; + +static k_vb_blk_handle block; +k_u32 g_pool_id; + +int vo_creat_layer_test(k_vo_layer chn_id, layer_info *info) +{ + k_vo_video_layer_attr attr; + + // check layer + if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) + || ((info->func != 0) && (chn_id == K_VO_LAYER2))) + { + printf("input layer num failed \n"); + return -1 ; + } + + // check scaler + + // set offset + attr.display_rect = info->offset; + // set act + attr.img_size = info->act_size; + // sget size + info->size = info->act_size.height * info->act_size.width * 3 / 2; + //set pixel format + attr.pixel_format = info->format; + if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) + { + printf("input pix format failed \n"); + return -1; + } + // set stride + attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); + // set function + attr.func = info->func; + // set scaler attr + attr.scaler_attr = info->attr; + + // set video layer atrr + kd_mpi_vo_set_video_layer_attr(chn_id, &attr); + + // enable layer + kd_mpi_vo_enable_video_layer(chn_id); + + return 0; +} + +k_vb_blk_handle vo_insert_frame(k_video_frame_info *vf_info, void **pic_vaddr) +{ + k_u64 phys_addr = 0; + k_u32 *virt_addr; + k_vb_blk_handle handle; + k_s32 size; + + if (vf_info == NULL) + return K_FALSE; + + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_8888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_8888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 4; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_565 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_565) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_4444 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_4444) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_1555 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_1555) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3 / 2; + + size = size + 4096; // 强制4K ,后边得删了 + + printf("vb block size is %x \n", size); + + handle = kd_mpi_vb_get_block(g_pool_id, size, NULL); + if (handle == VB_INVALID_HANDLE) + { + printf("%s get vb block error\n", __func__); + return K_FAILED; + } + + phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); + if (phys_addr == 0) + { + printf("%s get phys addr error\n", __func__); + return K_FAILED; + } + + virt_addr = (k_u32 *)kd_mpi_sys_mmap(phys_addr, size); + // virt_addr = (k_u32 *)kd_mpi_sys_mmap_cached(phys_addr, size); + + if (virt_addr == NULL) + { + printf("%s mmap error\n", __func__); + return K_FAILED; + } + + vf_info->mod_id = K_ID_VO; + vf_info->pool_id = g_pool_id; + vf_info->v_frame.phys_addr[0] = phys_addr; + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + vf_info->v_frame.phys_addr[1] = phys_addr + (vf_info->v_frame.height * vf_info->v_frame.stride[0]); + *pic_vaddr = virt_addr; + + printf("phys_addr is %lx g_pool_id is %d \n", phys_addr, g_pool_id); + + return handle; +} + +k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) +{ + k_vo_video_osd_attr attr; + + // set attr + attr.global_alptha = info->global_alptha; + + if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) + { + info->size = info->act_size.width * info->act_size.height * 4; + info->stride = info->act_size.width * 4 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) + { + info->size = info->act_size.width * info->act_size.height * 3; + info->stride = info->act_size.width * 3 / 8; + } + else if(info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if(info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else + { + printf("set osd pixel format failed \n"); + } + + attr.stride = info->stride; + attr.pixel_format = info->format; + attr.display_rect = info->offset; + attr.img_size = info->act_size; + kd_mpi_vo_set_video_osd_attr(osd, &attr); + + kd_mpi_vo_osd_enable(osd); + + return 0; +} + +void sample_vicap_install_osd(void) +{ + osd_info osd; + + osd.act_size.width = osd_width ; + osd.act_size.height = osd_height; + osd.offset.x = 0; + osd.offset.y = 0; + osd.global_alptha = 0xff; + // osd.global_alptha = 0x32; + osd.format = PIXEL_FORMAT_ARGB_8888;//PIXEL_FORMAT_ARGB_4444; //PIXEL_FORMAT_ARGB_1555;//PIXEL_FORMAT_ARGB_8888; + + vo_creat_osd_test(osd_id, &osd); +} + +void vo_osd_release_block(void) +{ + if(vicap_install_osd == 1) + { + kd_mpi_vo_osd_disable(osd_id); + kd_mpi_vb_release_block(block); + } + +} + +static k_s32 sample_connector_init(void) +{ + k_u32 ret = 0; + k_s32 connector_fd; +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#else + k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#endif + k_connector_info connector_info; + + memset(&connector_info, 0, sizeof(k_connector_info)); + + //connector get sensor info + ret = kd_mpi_get_connector_info(connector_type, &connector_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + + connector_fd = kd_mpi_connector_open(connector_info.connector_name); + if (connector_fd < 0) { + printf("%s, connector open failed.\n", __func__); + return K_ERR_VO_NOTREADY; + } + + // set connect power + kd_mpi_connector_power_set(connector_fd, K_TRUE); + // connector init + kd_mpi_connector_init(connector_fd, connector_info); + + return 0; +} + +static k_s32 vo_layer_vdss_bind_vo_config(void) +{ + layer_info info; + + k_vo_layer chn_id = K_VO_LAYER1; + + memset(&info, 0, sizeof(info)); + + sample_connector_init(); + + // config lyaer + info.act_size.width = ISP_CHN0_WIDTH;//ISP_CHN0_HEIGHT;//1080;//640;//1080; + info.act_size.height = ISP_CHN0_HEIGHT;//ISP_CHN0_WIDTH;//1920;//480;//1920; + info.format = PIXEL_FORMAT_YVU_PLANAR_420; + info.func = 0;//K_ROTATION_180;////K_ROTATION_90; + info.global_alptha = 0xff; + info.offset.x = 0;//(1080-w)/2, + info.offset.y = 0;//(1920-h)/2; + vo_creat_layer_test(chn_id, &info); + + if(vicap_install_osd == 1) + sample_vicap_install_osd(); + + //exit ; + return 0; +} + +static void sample_vicap_bind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) +{ + k_s32 ret; + + ret = kd_mpi_sys_bind(&vicap_mpp_chn, &vo_mpp_chn); + if (ret) { + printf("kd_mpi_sys_unbind failed:0x%x\n", ret); + } + + return; +} + +static void sample_vicap_unbind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) +{ + k_s32 ret; + + ret = kd_mpi_sys_unbind(&vicap_mpp_chn, &vo_mpp_chn); + if (ret) { + printf("kd_mpi_sys_unbind failed:0x%x\n", ret); + } + + return; +} + +int vivcap_start() +{ + k_s32 ret = 0; + + k_u32 pool_id; + k_vb_pool_config pool_config; + + printf("sample_vicap ...\n"); + +#if defined(CONFIG_BOARD_K230_CANMV) + sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; +#else + sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; +#endif + vicap_dev = VICAP_DEV_ID_0; + + memset(&config, 0, sizeof(config)); + config.max_pool_cnt = 64; + //VB for YUV420SP output + config.comm_pool[0].blk_cnt = 5; + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[0].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), VICAP_ALIGN_1K); + + //VB for RGB888 output + config.comm_pool[1].blk_cnt = 5; + config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[1].blk_size = VICAP_ALIGN_UP((SENSOR_HEIGHT * SENSOR_WIDTH * 3 ), VICAP_ALIGN_1K); + + ret = kd_mpi_vb_set_config(&config); + if (ret) { + printf("vb_set_config failed ret:%d\n", ret); + return ret; + } + + k_vb_supplement_config supplement_config; + memset(&supplement_config, 0, sizeof(supplement_config)); + supplement_config.supplement_config |= VB_SUPPLEMENT_JPEG_MASK; + + ret = kd_mpi_vb_set_supplement_config(&supplement_config); + if (ret) { + printf("vb_set_supplement_config failed ret:%d\n", ret); + return ret; + } + + ret = kd_mpi_vb_init(); + if (ret) { + printf("vb_init failed ret:%d\n", ret); + return ret; + } + printf("sample_vicap ...kd_mpi_vicap_get_sensor_info\n"); + + // dwc_dsi_init(); + vo_layer_vdss_bind_vo_config(); + + if(vicap_install_osd == 1) + { + memset(&pool_config, 0, sizeof(pool_config)); + pool_config.blk_size = VICAP_ALIGN_UP((osd_width * osd_height * 4 * 2), VICAP_ALIGN_1K); + pool_config.blk_cnt = 4; + pool_config.mode = VB_REMAP_MODE_NOCACHE; + pool_id = kd_mpi_vb_create_pool(&pool_config); // osd0 - 3 argb 320 x 240 + g_pool_id = pool_id; + + printf("--------aa--------------g_pool_id is %d pool_id is %d \n",g_pool_id, pool_id); + } + + memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); + ret = kd_mpi_vicap_get_sensor_info(sensor_type, &sensor_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + + memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); + dev_attr.acq_win.h_start = 0; + dev_attr.acq_win.v_start = 0; +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + dev_attr.acq_win.width = ISP_CHN0_WIDTH; + dev_attr.acq_win.height = ISP_CHN0_HEIGHT; +#else + dev_attr.acq_win.width = 2592;//SENSOR_HEIGHT; + dev_attr.acq_win.height = 1944;//SENSOR_WIDTH; +#endif + dev_attr.mode = VICAP_WORK_ONLINE_MODE; + + dev_attr.pipe_ctrl.data = 0xFFFFFFFF; + dev_attr.pipe_ctrl.bits.af_enable = 0; + dev_attr.pipe_ctrl.bits.ahdr_enable = 0; + + + dev_attr.cpature_frame = 0; + memcpy(&dev_attr.sensor_info, &sensor_info, sizeof(k_vicap_sensor_info)); + + ret = kd_mpi_vicap_set_dev_attr(vicap_dev, dev_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_dev_attr failed.\n"); + return ret; + } + + memset(&chn_attr, 0, sizeof(k_vicap_chn_attr)); + + //set chn0 output yuv420sp + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = ISP_CHN0_WIDTH; + chn_attr.out_win.height = ISP_CHN0_HEIGHT; + + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + chn_attr.crop_win = dev_attr.acq_win; +#else + // chn_attr.crop_win = dev_attr.acq_win; + chn_attr.crop_win.h_start = 768; + chn_attr.crop_win.v_start = 16; + chn_attr.crop_win.width = ISP_CHN0_WIDTH; + chn_attr.crop_win.height = ISP_CHN0_HEIGHT; +#endif + + chn_attr.scale_win = chn_attr.out_win; + chn_attr.crop_enable = K_FALSE; + chn_attr.scale_enable = K_FALSE; + // chn_attr.dw_enable = K_FALSE; + chn_attr.chn_enable = K_TRUE; + chn_attr.pix_format = PIXEL_FORMAT_YVU_PLANAR_420; + chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp + chn_attr.buffer_size = config.comm_pool[0].blk_size; + vicap_chn = VICAP_CHN_ID_0; + + printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); + ret = kd_mpi_vicap_set_chn_attr(vicap_dev, vicap_chn, chn_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); + return ret; + } + + //bind vicap chn 0 to vo + vicap_mpp_chn.mod_id = K_ID_VI; + vicap_mpp_chn.dev_id = vicap_dev; + vicap_mpp_chn.chn_id = vicap_chn; + + vo_mpp_chn.mod_id = K_ID_VO; + vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; + vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; + + sample_vicap_bind_vo(vicap_mpp_chn, vo_mpp_chn); + printf("sample_vicap ...dwc_dsi_init\n"); + + //set chn1 output rgb888p + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = SENSOR_WIDTH ; + chn_attr.out_win.height = SENSOR_HEIGHT; + // chn_attr.crop_win = dev_attr.acq_win; + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + chn_attr.crop_win = dev_attr.acq_win; +#else + chn_attr.crop_win.h_start = 768; + chn_attr.crop_win.v_start = 16; + chn_attr.crop_win.width = ISP_CHN0_WIDTH; + chn_attr.crop_win.height = ISP_CHN0_HEIGHT; +#endif + + chn_attr.scale_win = chn_attr.out_win; + chn_attr.crop_enable = K_FALSE; + chn_attr.scale_enable = K_FALSE; + // chn_attr.dw_enable = K_FALSE; + chn_attr.chn_enable = K_TRUE; + chn_attr.pix_format = PIXEL_FORMAT_BGR_888_PLANAR; + chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp + chn_attr.buffer_size = config.comm_pool[1].blk_size; + + printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); + ret = kd_mpi_vicap_set_chn_attr(vicap_dev, VICAP_CHN_ID_1, chn_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); + return ret; + } + + printf("sample_vicap ...kd_mpi_vicap_init\n"); + ret = kd_mpi_vicap_init(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + // goto err_exit; + } + + printf("sample_vicap ...kd_mpi_vicap_start_stream\n"); + ret = kd_mpi_vicap_start_stream(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + // goto err_exit; + } + + return ret; +} + +int vivcap_stop() +{ + printf("sample_vicap ...kd_mpi_vicap_stop_stream\n"); + int ret = kd_mpi_vicap_stop_stream(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + return ret; + } + + ret = kd_mpi_vicap_deinit(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_deinit failed.\n"); + return ret; + } + + kd_mpi_vo_disable_video_layer(K_VO_LAYER1); + + vicap_mpp_chn.mod_id = K_ID_VI; + vicap_mpp_chn.dev_id = vicap_dev; + vicap_mpp_chn.chn_id = vicap_chn; + + vo_mpp_chn.mod_id = K_ID_VO; + vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; + vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; + + sample_vicap_unbind_vo(vicap_mpp_chn, vo_mpp_chn); + + /*Allow one frame time for the VO to release the VB block*/ + k_u32 display_ms = 1000 / 33; + usleep(1000 * display_ms); + + ret = kd_mpi_vb_exit(); + if (ret) { + printf("sample_vicap, kd_mpi_vb_exit failed.\n"); + return ret; + } + + return 0; +} + +void yuv_rotate_90(char *des, char *src,int width,int height) +{ + int n = 0; + int hw = width>>1; + int hh = height>>1; + int size = width * height; + int hsize = size>>2; + + int pos = 0; + + for(int i = width-1;i >= 0;i--) + { + pos = 0; + for(int j= 0;j < height;j++) + { + des[n++]= src[pos+i]; + pos += width; + } + } + } \ No newline at end of file diff --git a/src/reference/ai_poc/traffic_light_detect/vi_vo.h b/src/reference/ai_poc/traffic_light_detect/vi_vo.h index e3d8bdba4..0a11a4d31 100644 --- a/src/reference/ai_poc/traffic_light_detect/vi_vo.h +++ b/src/reference/ai_poc/traffic_light_detect/vi_vo.h @@ -1,627 +1,628 @@ -/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include -#include -#include - -#include "mpi_sys_api.h" - -/* vicap */ -#include -#include -#include -#include -#include - -#include "k_module.h" -#include "k_type.h" -#include "k_vb_comm.h" -#include "k_video_comm.h" -#include "k_sys_comm.h" -#include "mpi_vb_api.h" -#include "mpi_vicap_api.h" -#include "mpi_isp_api.h" -#include "mpi_sys_api.h" -#include "k_vo_comm.h" -#include "mpi_vo_api.h" - -#include "vo_test_case.h" - -#include "k_connector_comm.h" -#include "mpi_connector_api.h" -#include "k_autoconf_comm.h" - - -#if defined(CONFIG_BOARD_K230_CANMV) -#define SENSOR_CHANNEL (3) // isp通道数 -#define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 -#define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 -#define ISP_CHN0_WIDTH (1920)//(1920) -#define ISP_CHN0_HEIGHT (1080)//(1080) -#define vicap_install_osd (1) -#define osd_id K_VO_OSD3 -#define osd_width (1920) -#define osd_height (1080) -#else -#define SENSOR_CHANNEL (3) // isp通道数 -#define SENSOR_HEIGHT (1280) // isp高度,ai输入,竖屏 -#define SENSOR_WIDTH (720) // isp宽度,ai输入,竖屏 -#define ISP_CHN0_WIDTH (1088)//(1920) -#define ISP_CHN0_HEIGHT (1920)//(1080) -#define vicap_install_osd (1) -#define osd_id K_VO_OSD3 -#define osd_width (1080) -#define osd_height (1920) -#endif - - -k_vb_config config; -k_vicap_dev vicap_dev; -k_vicap_chn vicap_chn; -k_vicap_dev_attr dev_attr; -k_vicap_chn_attr chn_attr; -k_vicap_sensor_info sensor_info; -k_vicap_sensor_type sensor_type; -k_mpp_chn vicap_mpp_chn; -k_mpp_chn vo_mpp_chn; - -k_video_frame_info dump_info; - -k_vo_draw_frame vo_frame = (k_vo_draw_frame) { - 1, - 16, - 16, - 128, - 128, - 1 -}; - -static k_vb_blk_handle block; -k_u32 g_pool_id; - -int vo_creat_layer_test(k_vo_layer chn_id, layer_info *info) -{ - k_vo_video_layer_attr attr; - - // check layer - if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) - || ((info->func != 0) && (chn_id == K_VO_LAYER2))) - { - printf("input layer num failed \n"); - return -1 ; - } - - // check scaler - - // set offset - attr.display_rect = info->offset; - // set act - attr.img_size = info->act_size; - // sget size - info->size = info->act_size.height * info->act_size.width * 3 / 2; - //set pixel format - attr.pixel_format = info->format; - if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) - { - printf("input pix format failed \n"); - return -1; - } - // set stride - attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); - // set function - attr.func = info->func; - // set scaler attr - attr.scaler_attr = info->attr; - - // set video layer atrr - kd_mpi_vo_set_video_layer_attr(chn_id, &attr); - - // enable layer - kd_mpi_vo_enable_video_layer(chn_id); - - return 0; -} - -k_vb_blk_handle vo_insert_frame(k_video_frame_info *vf_info, void **pic_vaddr) -{ - k_u64 phys_addr = 0; - k_u32 *virt_addr; - k_vb_blk_handle handle; - k_s32 size; - - if (vf_info == NULL) - return K_FALSE; - - if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_8888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_8888) - size = vf_info->v_frame.height * vf_info->v_frame.width * 4; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_565 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_565) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_4444 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_4444) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_888) - size = vf_info->v_frame.height * vf_info->v_frame.width * 3; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_1555 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_1555) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) - size = vf_info->v_frame.height * vf_info->v_frame.width * 3 / 2; - - size = size + 4096; // 强制4K ,后边得删了 - - printf("vb block size is %x \n", size); - - handle = kd_mpi_vb_get_block(g_pool_id, size, NULL); - if (handle == VB_INVALID_HANDLE) - { - printf("%s get vb block error\n", __func__); - return K_FAILED; - } - - phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); - if (phys_addr == 0) - { - printf("%s get phys addr error\n", __func__); - return K_FAILED; - } - - virt_addr = (k_u32 *)kd_mpi_sys_mmap(phys_addr, size); - // virt_addr = (k_u32 *)kd_mpi_sys_mmap_cached(phys_addr, size); - - if (virt_addr == NULL) - { - printf("%s mmap error\n", __func__); - return K_FAILED; - } - - vf_info->mod_id = K_ID_VO; - vf_info->pool_id = g_pool_id; - vf_info->v_frame.phys_addr[0] = phys_addr; - if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) - vf_info->v_frame.phys_addr[1] = phys_addr + (vf_info->v_frame.height * vf_info->v_frame.stride[0]); - *pic_vaddr = virt_addr; - - printf("phys_addr is %lx g_pool_id is %d \n", phys_addr, g_pool_id); - - return handle; -} - -k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) -{ - k_vo_video_osd_attr attr; - - // set attr - attr.global_alptha = info->global_alptha; - - if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) - { - info->size = info->act_size.width * info->act_size.height * 4; - info->stride = info->act_size.width * 4 / 8; - } - else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) - { - info->size = info->act_size.width * info->act_size.height * 3; - info->stride = info->act_size.width * 3 / 8; - } - else if(info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else if(info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else - { - printf("set osd pixel format failed \n"); - } - - attr.stride = info->stride; - attr.pixel_format = info->format; - attr.display_rect = info->offset; - attr.img_size = info->act_size; - kd_mpi_vo_set_video_osd_attr(osd, &attr); - - kd_mpi_vo_osd_enable(osd); - - return 0; -} - -void sample_vicap_install_osd(void) -{ - osd_info osd; - - osd.act_size.width = osd_width ; - osd.act_size.height = osd_height; - osd.offset.x = 0; - osd.offset.y = 0; - osd.global_alptha = 0xff; - // osd.global_alptha = 0x32; - osd.format = PIXEL_FORMAT_ARGB_8888;//PIXEL_FORMAT_ARGB_4444; //PIXEL_FORMAT_ARGB_1555;//PIXEL_FORMAT_ARGB_8888; - - vo_creat_osd_test(osd_id, &osd); -} - -void vo_osd_release_block(void) -{ - if(vicap_install_osd == 1) - { - kd_mpi_vo_osd_disable(osd_id); - kd_mpi_vb_release_block(block); - } - -} - -static k_s32 sample_connector_init(void) -{ - k_u32 ret = 0; - k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) - k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; -#else - k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; -#endif - k_connector_info connector_info; - - memset(&connector_info, 0, sizeof(k_connector_info)); - - //connector get sensor info - ret = kd_mpi_get_connector_info(connector_type, &connector_info); - if (ret) { - printf("sample_vicap, the sensor type not supported!\n"); - return ret; - } - - connector_fd = kd_mpi_connector_open(connector_info.connector_name); - if (connector_fd < 0) { - printf("%s, connector open failed.\n", __func__); - return K_ERR_VO_NOTREADY; - } - - // set connect power - kd_mpi_connector_power_set(connector_fd, K_TRUE); - // connector init - kd_mpi_connector_init(connector_fd, connector_info); - - return 0; -} - -static k_s32 vo_layer_vdss_bind_vo_config(void) -{ - layer_info info; - - k_vo_layer chn_id = K_VO_LAYER1; - - memset(&info, 0, sizeof(info)); - - sample_connector_init(); - - // config lyaer - info.act_size.width = ISP_CHN0_WIDTH;//ISP_CHN0_HEIGHT;//1080;//640;//1080; - info.act_size.height = ISP_CHN0_HEIGHT;//ISP_CHN0_WIDTH;//1920;//480;//1920; - info.format = PIXEL_FORMAT_YVU_PLANAR_420; - info.func = 0;//K_ROTATION_180;////K_ROTATION_90; - info.global_alptha = 0xff; - info.offset.x = 0;//(1080-w)/2, - info.offset.y = 0;//(1920-h)/2; - vo_creat_layer_test(chn_id, &info); - - if(vicap_install_osd == 1) - sample_vicap_install_osd(); - - //exit ; - return 0; -} - -static void sample_vicap_bind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) -{ - k_s32 ret; - - ret = kd_mpi_sys_bind(&vicap_mpp_chn, &vo_mpp_chn); - if (ret) { - printf("kd_mpi_sys_unbind failed:0x%x\n", ret); - } - - return; -} - -static void sample_vicap_unbind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) -{ - k_s32 ret; - - ret = kd_mpi_sys_unbind(&vicap_mpp_chn, &vo_mpp_chn); - if (ret) { - printf("kd_mpi_sys_unbind failed:0x%x\n", ret); - } - - return; -} - -int vivcap_start() -{ - k_s32 ret = 0; - - k_u32 pool_id; - k_vb_pool_config pool_config; - - printf("sample_vicap ...\n"); - -#if defined(CONFIG_BOARD_K230_CANMV) - sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); -#else - sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; -#endif - vicap_dev = VICAP_DEV_ID_0; - - memset(&config, 0, sizeof(config)); - config.max_pool_cnt = 64; - //VB for YUV420SP output - config.comm_pool[0].blk_cnt = 5; - config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; - config.comm_pool[0].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), VICAP_ALIGN_1K); - - //VB for RGB888 output - config.comm_pool[1].blk_cnt = 5; - config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; - config.comm_pool[1].blk_size = VICAP_ALIGN_UP((SENSOR_HEIGHT * SENSOR_WIDTH * 3 ), VICAP_ALIGN_1K); - - ret = kd_mpi_vb_set_config(&config); - if (ret) { - printf("vb_set_config failed ret:%d\n", ret); - return ret; - } - - k_vb_supplement_config supplement_config; - memset(&supplement_config, 0, sizeof(supplement_config)); - supplement_config.supplement_config |= VB_SUPPLEMENT_JPEG_MASK; - - ret = kd_mpi_vb_set_supplement_config(&supplement_config); - if (ret) { - printf("vb_set_supplement_config failed ret:%d\n", ret); - return ret; - } - - ret = kd_mpi_vb_init(); - if (ret) { - printf("vb_init failed ret:%d\n", ret); - return ret; - } - printf("sample_vicap ...kd_mpi_vicap_get_sensor_info\n"); - - // dwc_dsi_init(); - vo_layer_vdss_bind_vo_config(); - - if(vicap_install_osd == 1) - { - memset(&pool_config, 0, sizeof(pool_config)); - pool_config.blk_size = VICAP_ALIGN_UP((osd_width * osd_height * 4 * 2), VICAP_ALIGN_1K); - pool_config.blk_cnt = 4; - pool_config.mode = VB_REMAP_MODE_NOCACHE; - pool_id = kd_mpi_vb_create_pool(&pool_config); // osd0 - 3 argb 320 x 240 - g_pool_id = pool_id; - - printf("--------aa--------------g_pool_id is %d pool_id is %d \n",g_pool_id, pool_id); - } - - memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); - ret = kd_mpi_vicap_get_sensor_info(sensor_type, &sensor_info); - if (ret) { - printf("sample_vicap, the sensor type not supported!\n"); - return ret; - } - - memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); - dev_attr.acq_win.h_start = 0; - dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) - dev_attr.acq_win.width = ISP_CHN0_WIDTH; - dev_attr.acq_win.height = ISP_CHN0_HEIGHT; -#else - dev_attr.acq_win.width = 2592;//SENSOR_HEIGHT; - dev_attr.acq_win.height = 1944;//SENSOR_WIDTH; -#endif - dev_attr.mode = VICAP_WORK_ONLINE_MODE; - - dev_attr.pipe_ctrl.data = 0xFFFFFFFF; - dev_attr.pipe_ctrl.bits.af_enable = 0; - dev_attr.pipe_ctrl.bits.ahdr_enable = 0; - - - dev_attr.cpature_frame = 0; - memcpy(&dev_attr.sensor_info, &sensor_info, sizeof(k_vicap_sensor_info)); - - ret = kd_mpi_vicap_set_dev_attr(vicap_dev, dev_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_dev_attr failed.\n"); - return ret; - } - - memset(&chn_attr, 0, sizeof(k_vicap_chn_attr)); - - //set chn0 output yuv420sp - chn_attr.out_win.h_start = 0; - chn_attr.out_win.v_start = 0; - chn_attr.out_win.width = ISP_CHN0_WIDTH; - chn_attr.out_win.height = ISP_CHN0_HEIGHT; - - -#if defined(CONFIG_BOARD_K230_CANMV) - chn_attr.crop_win = dev_attr.acq_win; -#else - // chn_attr.crop_win = dev_attr.acq_win; - chn_attr.crop_win.h_start = 768; - chn_attr.crop_win.v_start = 16; - chn_attr.crop_win.width = ISP_CHN0_WIDTH; - chn_attr.crop_win.height = ISP_CHN0_HEIGHT; -#endif - - chn_attr.scale_win = chn_attr.out_win; - chn_attr.crop_enable = K_FALSE; - chn_attr.scale_enable = K_FALSE; - // chn_attr.dw_enable = K_FALSE; - chn_attr.chn_enable = K_TRUE; - chn_attr.pix_format = PIXEL_FORMAT_YVU_PLANAR_420; - chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp - chn_attr.buffer_size = config.comm_pool[0].blk_size; - vicap_chn = VICAP_CHN_ID_0; - - printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); - ret = kd_mpi_vicap_set_chn_attr(vicap_dev, vicap_chn, chn_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); - return ret; - } - - //bind vicap chn 0 to vo - vicap_mpp_chn.mod_id = K_ID_VI; - vicap_mpp_chn.dev_id = vicap_dev; - vicap_mpp_chn.chn_id = vicap_chn; - - vo_mpp_chn.mod_id = K_ID_VO; - vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; - vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; - - sample_vicap_bind_vo(vicap_mpp_chn, vo_mpp_chn); - printf("sample_vicap ...dwc_dsi_init\n"); - - //set chn1 output rgb888p - chn_attr.out_win.h_start = 0; - chn_attr.out_win.v_start = 0; - chn_attr.out_win.width = SENSOR_WIDTH ; - chn_attr.out_win.height = SENSOR_HEIGHT; - // chn_attr.crop_win = dev_attr.acq_win; - -#if defined(CONFIG_BOARD_K230_CANMV) - chn_attr.crop_win = dev_attr.acq_win; -#else - chn_attr.crop_win.h_start = 768; - chn_attr.crop_win.v_start = 16; - chn_attr.crop_win.width = ISP_CHN0_WIDTH; - chn_attr.crop_win.height = ISP_CHN0_HEIGHT; -#endif - - chn_attr.scale_win = chn_attr.out_win; - chn_attr.crop_enable = K_FALSE; - chn_attr.scale_enable = K_FALSE; - // chn_attr.dw_enable = K_FALSE; - chn_attr.chn_enable = K_TRUE; - chn_attr.pix_format = PIXEL_FORMAT_BGR_888_PLANAR; - chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp - chn_attr.buffer_size = config.comm_pool[1].blk_size; - - printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); - ret = kd_mpi_vicap_set_chn_attr(vicap_dev, VICAP_CHN_ID_1, chn_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); - return ret; - } - - printf("sample_vicap ...kd_mpi_vicap_init\n"); - ret = kd_mpi_vicap_init(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - // goto err_exit; - } - - printf("sample_vicap ...kd_mpi_vicap_start_stream\n"); - ret = kd_mpi_vicap_start_stream(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - // goto err_exit; - } - - return ret; -} - -int vivcap_stop() -{ - printf("sample_vicap ...kd_mpi_vicap_stop_stream\n"); - int ret = kd_mpi_vicap_stop_stream(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - return ret; - } - - ret = kd_mpi_vicap_deinit(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_deinit failed.\n"); - return ret; - } - - kd_mpi_vo_disable_video_layer(K_VO_LAYER1); - - vicap_mpp_chn.mod_id = K_ID_VI; - vicap_mpp_chn.dev_id = vicap_dev; - vicap_mpp_chn.chn_id = vicap_chn; - - vo_mpp_chn.mod_id = K_ID_VO; - vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; - vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; - - sample_vicap_unbind_vo(vicap_mpp_chn, vo_mpp_chn); - - /*Allow one frame time for the VO to release the VB block*/ - k_u32 display_ms = 1000 / 33; - usleep(1000 * display_ms); - - ret = kd_mpi_vb_exit(); - if (ret) { - printf("sample_vicap, kd_mpi_vb_exit failed.\n"); - return ret; - } - - return 0; -} - -void yuv_rotate_90(char *des, char *src,int width,int height) -{ - int n = 0; - int hw = width>>1; - int hh = height>>1; - int size = width * height; - int hsize = size>>2; - - int pos = 0; - - for(int i = width-1;i >= 0;i--) - { - pos = 0; - for(int j= 0;j < height;j++) - { - des[n++]= src[pos+i]; - pos += width; - } - } - +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include + +#include "mpi_sys_api.h" + +/* vicap */ +#include +#include +#include +#include +#include + +#include "k_module.h" +#include "k_type.h" +#include "k_vb_comm.h" +#include "k_video_comm.h" +#include "k_sys_comm.h" +#include "mpi_vb_api.h" +#include "mpi_vicap_api.h" +#include "mpi_isp_api.h" +#include "mpi_sys_api.h" +#include "k_vo_comm.h" +#include "mpi_vo_api.h" + +#include "vo_test_case.h" + +#include "k_connector_comm.h" +#include "mpi_connector_api.h" +#include "k_autoconf_comm.h" + + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) +#define SENSOR_CHANNEL (3) // isp通道数 +#define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 +#define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 +#define ISP_CHN0_WIDTH (1920)//(1920) +#define ISP_CHN0_HEIGHT (1080)//(1080) +#define vicap_install_osd (1) +#define osd_id K_VO_OSD3 +#define osd_width (1920) +#define osd_height (1080) +#else +#define SENSOR_CHANNEL (3) // isp通道数 +#define SENSOR_HEIGHT (1280) // isp高度,ai输入,竖屏 +#define SENSOR_WIDTH (720) // isp宽度,ai输入,竖屏 +#define ISP_CHN0_WIDTH (1088)//(1920) +#define ISP_CHN0_HEIGHT (1920)//(1080) +#define vicap_install_osd (1) +#define osd_id K_VO_OSD3 +#define osd_width (1080) +#define osd_height (1920) +#endif + + +k_vb_config config; +k_vicap_dev vicap_dev; +k_vicap_chn vicap_chn; +k_vicap_dev_attr dev_attr; +k_vicap_chn_attr chn_attr; +k_vicap_sensor_info sensor_info; +k_vicap_sensor_type sensor_type; +k_mpp_chn vicap_mpp_chn; +k_mpp_chn vo_mpp_chn; + +k_video_frame_info dump_info; + +k_vo_draw_frame vo_frame = (k_vo_draw_frame) { + 1, + 16, + 16, + 128, + 128, + 1 +}; + +static k_vb_blk_handle block; +k_u32 g_pool_id; + +int vo_creat_layer_test(k_vo_layer chn_id, layer_info *info) +{ + k_vo_video_layer_attr attr; + + // check layer + if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) + || ((info->func != 0) && (chn_id == K_VO_LAYER2))) + { + printf("input layer num failed \n"); + return -1 ; + } + + // check scaler + + // set offset + attr.display_rect = info->offset; + // set act + attr.img_size = info->act_size; + // sget size + info->size = info->act_size.height * info->act_size.width * 3 / 2; + //set pixel format + attr.pixel_format = info->format; + if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) + { + printf("input pix format failed \n"); + return -1; + } + // set stride + attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); + // set function + attr.func = info->func; + // set scaler attr + attr.scaler_attr = info->attr; + + // set video layer atrr + kd_mpi_vo_set_video_layer_attr(chn_id, &attr); + + // enable layer + kd_mpi_vo_enable_video_layer(chn_id); + + return 0; +} + +k_vb_blk_handle vo_insert_frame(k_video_frame_info *vf_info, void **pic_vaddr) +{ + k_u64 phys_addr = 0; + k_u32 *virt_addr; + k_vb_blk_handle handle; + k_s32 size; + + if (vf_info == NULL) + return K_FALSE; + + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_8888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_8888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 4; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_565 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_565) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_4444 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_4444) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_1555 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_1555) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3 / 2; + + size = size + 4096; // 强制4K ,后边得删了 + + printf("vb block size is %x \n", size); + + handle = kd_mpi_vb_get_block(g_pool_id, size, NULL); + if (handle == VB_INVALID_HANDLE) + { + printf("%s get vb block error\n", __func__); + return K_FAILED; + } + + phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); + if (phys_addr == 0) + { + printf("%s get phys addr error\n", __func__); + return K_FAILED; + } + + virt_addr = (k_u32 *)kd_mpi_sys_mmap(phys_addr, size); + // virt_addr = (k_u32 *)kd_mpi_sys_mmap_cached(phys_addr, size); + + if (virt_addr == NULL) + { + printf("%s mmap error\n", __func__); + return K_FAILED; + } + + vf_info->mod_id = K_ID_VO; + vf_info->pool_id = g_pool_id; + vf_info->v_frame.phys_addr[0] = phys_addr; + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + vf_info->v_frame.phys_addr[1] = phys_addr + (vf_info->v_frame.height * vf_info->v_frame.stride[0]); + *pic_vaddr = virt_addr; + + printf("phys_addr is %lx g_pool_id is %d \n", phys_addr, g_pool_id); + + return handle; +} + +k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) +{ + k_vo_video_osd_attr attr; + + // set attr + attr.global_alptha = info->global_alptha; + + if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) + { + info->size = info->act_size.width * info->act_size.height * 4; + info->stride = info->act_size.width * 4 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) + { + info->size = info->act_size.width * info->act_size.height * 3; + info->stride = info->act_size.width * 3 / 8; + } + else if(info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if(info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else + { + printf("set osd pixel format failed \n"); + } + + attr.stride = info->stride; + attr.pixel_format = info->format; + attr.display_rect = info->offset; + attr.img_size = info->act_size; + kd_mpi_vo_set_video_osd_attr(osd, &attr); + + kd_mpi_vo_osd_enable(osd); + + return 0; +} + +void sample_vicap_install_osd(void) +{ + osd_info osd; + + osd.act_size.width = osd_width ; + osd.act_size.height = osd_height; + osd.offset.x = 0; + osd.offset.y = 0; + osd.global_alptha = 0xff; + // osd.global_alptha = 0x32; + osd.format = PIXEL_FORMAT_ARGB_8888;//PIXEL_FORMAT_ARGB_4444; //PIXEL_FORMAT_ARGB_1555;//PIXEL_FORMAT_ARGB_8888; + + vo_creat_osd_test(osd_id, &osd); +} + +void vo_osd_release_block(void) +{ + if(vicap_install_osd == 1) + { + kd_mpi_vo_osd_disable(osd_id); + kd_mpi_vb_release_block(block); + } + +} + +static k_s32 sample_connector_init(void) +{ + k_u32 ret = 0; + k_s32 connector_fd; +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#else + k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#endif + k_connector_info connector_info; + + memset(&connector_info, 0, sizeof(k_connector_info)); + + //connector get sensor info + ret = kd_mpi_get_connector_info(connector_type, &connector_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + + connector_fd = kd_mpi_connector_open(connector_info.connector_name); + if (connector_fd < 0) { + printf("%s, connector open failed.\n", __func__); + return K_ERR_VO_NOTREADY; + } + + // set connect power + kd_mpi_connector_power_set(connector_fd, K_TRUE); + // connector init + kd_mpi_connector_init(connector_fd, connector_info); + + return 0; +} + +static k_s32 vo_layer_vdss_bind_vo_config(void) +{ + layer_info info; + + k_vo_layer chn_id = K_VO_LAYER1; + + memset(&info, 0, sizeof(info)); + + sample_connector_init(); + + // config lyaer + info.act_size.width = ISP_CHN0_WIDTH;//ISP_CHN0_HEIGHT;//1080;//640;//1080; + info.act_size.height = ISP_CHN0_HEIGHT;//ISP_CHN0_WIDTH;//1920;//480;//1920; + info.format = PIXEL_FORMAT_YVU_PLANAR_420; + info.func = 0;//K_ROTATION_180;////K_ROTATION_90; + info.global_alptha = 0xff; + info.offset.x = 0;//(1080-w)/2, + info.offset.y = 0;//(1920-h)/2; + vo_creat_layer_test(chn_id, &info); + + if(vicap_install_osd == 1) + sample_vicap_install_osd(); + + //exit ; + return 0; +} + +static void sample_vicap_bind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) +{ + k_s32 ret; + + ret = kd_mpi_sys_bind(&vicap_mpp_chn, &vo_mpp_chn); + if (ret) { + printf("kd_mpi_sys_unbind failed:0x%x\n", ret); + } + + return; +} + +static void sample_vicap_unbind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) +{ + k_s32 ret; + + ret = kd_mpi_sys_unbind(&vicap_mpp_chn, &vo_mpp_chn); + if (ret) { + printf("kd_mpi_sys_unbind failed:0x%x\n", ret); + } + + return; +} + +int vivcap_start() +{ + k_s32 ret = 0; + + k_u32 pool_id; + k_vb_pool_config pool_config; + + printf("sample_vicap ...\n"); + +#if defined(CONFIG_BOARD_K230_CANMV) + sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; +#else + sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; +#endif + vicap_dev = VICAP_DEV_ID_0; + + memset(&config, 0, sizeof(config)); + config.max_pool_cnt = 64; + //VB for YUV420SP output + config.comm_pool[0].blk_cnt = 5; + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[0].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), VICAP_ALIGN_1K); + + //VB for RGB888 output + config.comm_pool[1].blk_cnt = 5; + config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[1].blk_size = VICAP_ALIGN_UP((SENSOR_HEIGHT * SENSOR_WIDTH * 3 ), VICAP_ALIGN_1K); + + ret = kd_mpi_vb_set_config(&config); + if (ret) { + printf("vb_set_config failed ret:%d\n", ret); + return ret; + } + + k_vb_supplement_config supplement_config; + memset(&supplement_config, 0, sizeof(supplement_config)); + supplement_config.supplement_config |= VB_SUPPLEMENT_JPEG_MASK; + + ret = kd_mpi_vb_set_supplement_config(&supplement_config); + if (ret) { + printf("vb_set_supplement_config failed ret:%d\n", ret); + return ret; + } + + ret = kd_mpi_vb_init(); + if (ret) { + printf("vb_init failed ret:%d\n", ret); + return ret; + } + printf("sample_vicap ...kd_mpi_vicap_get_sensor_info\n"); + + // dwc_dsi_init(); + vo_layer_vdss_bind_vo_config(); + + if(vicap_install_osd == 1) + { + memset(&pool_config, 0, sizeof(pool_config)); + pool_config.blk_size = VICAP_ALIGN_UP((osd_width * osd_height * 4 * 2), VICAP_ALIGN_1K); + pool_config.blk_cnt = 4; + pool_config.mode = VB_REMAP_MODE_NOCACHE; + pool_id = kd_mpi_vb_create_pool(&pool_config); // osd0 - 3 argb 320 x 240 + g_pool_id = pool_id; + + printf("--------aa--------------g_pool_id is %d pool_id is %d \n",g_pool_id, pool_id); + } + + memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); + ret = kd_mpi_vicap_get_sensor_info(sensor_type, &sensor_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + + memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); + dev_attr.acq_win.h_start = 0; + dev_attr.acq_win.v_start = 0; +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + dev_attr.acq_win.width = ISP_CHN0_WIDTH; + dev_attr.acq_win.height = ISP_CHN0_HEIGHT; +#else + dev_attr.acq_win.width = 2592;//SENSOR_HEIGHT; + dev_attr.acq_win.height = 1944;//SENSOR_WIDTH; +#endif + dev_attr.mode = VICAP_WORK_ONLINE_MODE; + + dev_attr.pipe_ctrl.data = 0xFFFFFFFF; + dev_attr.pipe_ctrl.bits.af_enable = 0; + dev_attr.pipe_ctrl.bits.ahdr_enable = 0; + + + dev_attr.cpature_frame = 0; + memcpy(&dev_attr.sensor_info, &sensor_info, sizeof(k_vicap_sensor_info)); + + ret = kd_mpi_vicap_set_dev_attr(vicap_dev, dev_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_dev_attr failed.\n"); + return ret; + } + + memset(&chn_attr, 0, sizeof(k_vicap_chn_attr)); + + //set chn0 output yuv420sp + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = ISP_CHN0_WIDTH; + chn_attr.out_win.height = ISP_CHN0_HEIGHT; + + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + chn_attr.crop_win = dev_attr.acq_win; +#else + // chn_attr.crop_win = dev_attr.acq_win; + chn_attr.crop_win.h_start = 768; + chn_attr.crop_win.v_start = 16; + chn_attr.crop_win.width = ISP_CHN0_WIDTH; + chn_attr.crop_win.height = ISP_CHN0_HEIGHT; +#endif + + chn_attr.scale_win = chn_attr.out_win; + chn_attr.crop_enable = K_FALSE; + chn_attr.scale_enable = K_FALSE; + // chn_attr.dw_enable = K_FALSE; + chn_attr.chn_enable = K_TRUE; + chn_attr.pix_format = PIXEL_FORMAT_YVU_PLANAR_420; + chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp + chn_attr.buffer_size = config.comm_pool[0].blk_size; + vicap_chn = VICAP_CHN_ID_0; + + printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); + ret = kd_mpi_vicap_set_chn_attr(vicap_dev, vicap_chn, chn_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); + return ret; + } + + //bind vicap chn 0 to vo + vicap_mpp_chn.mod_id = K_ID_VI; + vicap_mpp_chn.dev_id = vicap_dev; + vicap_mpp_chn.chn_id = vicap_chn; + + vo_mpp_chn.mod_id = K_ID_VO; + vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; + vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; + + sample_vicap_bind_vo(vicap_mpp_chn, vo_mpp_chn); + printf("sample_vicap ...dwc_dsi_init\n"); + + //set chn1 output rgb888p + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = SENSOR_WIDTH ; + chn_attr.out_win.height = SENSOR_HEIGHT; + // chn_attr.crop_win = dev_attr.acq_win; + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + chn_attr.crop_win = dev_attr.acq_win; +#else + chn_attr.crop_win.h_start = 768; + chn_attr.crop_win.v_start = 16; + chn_attr.crop_win.width = ISP_CHN0_WIDTH; + chn_attr.crop_win.height = ISP_CHN0_HEIGHT; +#endif + + chn_attr.scale_win = chn_attr.out_win; + chn_attr.crop_enable = K_FALSE; + chn_attr.scale_enable = K_FALSE; + // chn_attr.dw_enable = K_FALSE; + chn_attr.chn_enable = K_TRUE; + chn_attr.pix_format = PIXEL_FORMAT_BGR_888_PLANAR; + chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp + chn_attr.buffer_size = config.comm_pool[1].blk_size; + + printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); + ret = kd_mpi_vicap_set_chn_attr(vicap_dev, VICAP_CHN_ID_1, chn_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); + return ret; + } + + printf("sample_vicap ...kd_mpi_vicap_init\n"); + ret = kd_mpi_vicap_init(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + // goto err_exit; + } + + printf("sample_vicap ...kd_mpi_vicap_start_stream\n"); + ret = kd_mpi_vicap_start_stream(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + // goto err_exit; + } + + return ret; +} + +int vivcap_stop() +{ + printf("sample_vicap ...kd_mpi_vicap_stop_stream\n"); + int ret = kd_mpi_vicap_stop_stream(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + return ret; + } + + ret = kd_mpi_vicap_deinit(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_deinit failed.\n"); + return ret; + } + + kd_mpi_vo_disable_video_layer(K_VO_LAYER1); + + vicap_mpp_chn.mod_id = K_ID_VI; + vicap_mpp_chn.dev_id = vicap_dev; + vicap_mpp_chn.chn_id = vicap_chn; + + vo_mpp_chn.mod_id = K_ID_VO; + vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; + vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; + + sample_vicap_unbind_vo(vicap_mpp_chn, vo_mpp_chn); + + /*Allow one frame time for the VO to release the VB block*/ + k_u32 display_ms = 1000 / 33; + usleep(1000 * display_ms); + + ret = kd_mpi_vb_exit(); + if (ret) { + printf("sample_vicap, kd_mpi_vb_exit failed.\n"); + return ret; + } + + return 0; +} + +void yuv_rotate_90(char *des, char *src,int width,int height) +{ + int n = 0; + int hw = width>>1; + int hh = height>>1; + int size = width * height; + int hsize = size>>2; + + int pos = 0; + + for(int i = width-1;i >= 0;i--) + { + pos = 0; + for(int j= 0;j < height;j++) + { + des[n++]= src[pos+i]; + pos += width; + } + } + } \ No newline at end of file diff --git a/src/reference/ai_poc/vehicle_attr/vi_vo.h b/src/reference/ai_poc/vehicle_attr/vi_vo.h index e3d8bdba4..0a11a4d31 100644 --- a/src/reference/ai_poc/vehicle_attr/vi_vo.h +++ b/src/reference/ai_poc/vehicle_attr/vi_vo.h @@ -1,627 +1,628 @@ -/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include -#include -#include - -#include "mpi_sys_api.h" - -/* vicap */ -#include -#include -#include -#include -#include - -#include "k_module.h" -#include "k_type.h" -#include "k_vb_comm.h" -#include "k_video_comm.h" -#include "k_sys_comm.h" -#include "mpi_vb_api.h" -#include "mpi_vicap_api.h" -#include "mpi_isp_api.h" -#include "mpi_sys_api.h" -#include "k_vo_comm.h" -#include "mpi_vo_api.h" - -#include "vo_test_case.h" - -#include "k_connector_comm.h" -#include "mpi_connector_api.h" -#include "k_autoconf_comm.h" - - -#if defined(CONFIG_BOARD_K230_CANMV) -#define SENSOR_CHANNEL (3) // isp通道数 -#define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 -#define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 -#define ISP_CHN0_WIDTH (1920)//(1920) -#define ISP_CHN0_HEIGHT (1080)//(1080) -#define vicap_install_osd (1) -#define osd_id K_VO_OSD3 -#define osd_width (1920) -#define osd_height (1080) -#else -#define SENSOR_CHANNEL (3) // isp通道数 -#define SENSOR_HEIGHT (1280) // isp高度,ai输入,竖屏 -#define SENSOR_WIDTH (720) // isp宽度,ai输入,竖屏 -#define ISP_CHN0_WIDTH (1088)//(1920) -#define ISP_CHN0_HEIGHT (1920)//(1080) -#define vicap_install_osd (1) -#define osd_id K_VO_OSD3 -#define osd_width (1080) -#define osd_height (1920) -#endif - - -k_vb_config config; -k_vicap_dev vicap_dev; -k_vicap_chn vicap_chn; -k_vicap_dev_attr dev_attr; -k_vicap_chn_attr chn_attr; -k_vicap_sensor_info sensor_info; -k_vicap_sensor_type sensor_type; -k_mpp_chn vicap_mpp_chn; -k_mpp_chn vo_mpp_chn; - -k_video_frame_info dump_info; - -k_vo_draw_frame vo_frame = (k_vo_draw_frame) { - 1, - 16, - 16, - 128, - 128, - 1 -}; - -static k_vb_blk_handle block; -k_u32 g_pool_id; - -int vo_creat_layer_test(k_vo_layer chn_id, layer_info *info) -{ - k_vo_video_layer_attr attr; - - // check layer - if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) - || ((info->func != 0) && (chn_id == K_VO_LAYER2))) - { - printf("input layer num failed \n"); - return -1 ; - } - - // check scaler - - // set offset - attr.display_rect = info->offset; - // set act - attr.img_size = info->act_size; - // sget size - info->size = info->act_size.height * info->act_size.width * 3 / 2; - //set pixel format - attr.pixel_format = info->format; - if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) - { - printf("input pix format failed \n"); - return -1; - } - // set stride - attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); - // set function - attr.func = info->func; - // set scaler attr - attr.scaler_attr = info->attr; - - // set video layer atrr - kd_mpi_vo_set_video_layer_attr(chn_id, &attr); - - // enable layer - kd_mpi_vo_enable_video_layer(chn_id); - - return 0; -} - -k_vb_blk_handle vo_insert_frame(k_video_frame_info *vf_info, void **pic_vaddr) -{ - k_u64 phys_addr = 0; - k_u32 *virt_addr; - k_vb_blk_handle handle; - k_s32 size; - - if (vf_info == NULL) - return K_FALSE; - - if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_8888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_8888) - size = vf_info->v_frame.height * vf_info->v_frame.width * 4; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_565 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_565) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_4444 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_4444) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_888) - size = vf_info->v_frame.height * vf_info->v_frame.width * 3; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_1555 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_1555) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) - size = vf_info->v_frame.height * vf_info->v_frame.width * 3 / 2; - - size = size + 4096; // 强制4K ,后边得删了 - - printf("vb block size is %x \n", size); - - handle = kd_mpi_vb_get_block(g_pool_id, size, NULL); - if (handle == VB_INVALID_HANDLE) - { - printf("%s get vb block error\n", __func__); - return K_FAILED; - } - - phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); - if (phys_addr == 0) - { - printf("%s get phys addr error\n", __func__); - return K_FAILED; - } - - virt_addr = (k_u32 *)kd_mpi_sys_mmap(phys_addr, size); - // virt_addr = (k_u32 *)kd_mpi_sys_mmap_cached(phys_addr, size); - - if (virt_addr == NULL) - { - printf("%s mmap error\n", __func__); - return K_FAILED; - } - - vf_info->mod_id = K_ID_VO; - vf_info->pool_id = g_pool_id; - vf_info->v_frame.phys_addr[0] = phys_addr; - if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) - vf_info->v_frame.phys_addr[1] = phys_addr + (vf_info->v_frame.height * vf_info->v_frame.stride[0]); - *pic_vaddr = virt_addr; - - printf("phys_addr is %lx g_pool_id is %d \n", phys_addr, g_pool_id); - - return handle; -} - -k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) -{ - k_vo_video_osd_attr attr; - - // set attr - attr.global_alptha = info->global_alptha; - - if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) - { - info->size = info->act_size.width * info->act_size.height * 4; - info->stride = info->act_size.width * 4 / 8; - } - else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) - { - info->size = info->act_size.width * info->act_size.height * 3; - info->stride = info->act_size.width * 3 / 8; - } - else if(info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else if(info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else - { - printf("set osd pixel format failed \n"); - } - - attr.stride = info->stride; - attr.pixel_format = info->format; - attr.display_rect = info->offset; - attr.img_size = info->act_size; - kd_mpi_vo_set_video_osd_attr(osd, &attr); - - kd_mpi_vo_osd_enable(osd); - - return 0; -} - -void sample_vicap_install_osd(void) -{ - osd_info osd; - - osd.act_size.width = osd_width ; - osd.act_size.height = osd_height; - osd.offset.x = 0; - osd.offset.y = 0; - osd.global_alptha = 0xff; - // osd.global_alptha = 0x32; - osd.format = PIXEL_FORMAT_ARGB_8888;//PIXEL_FORMAT_ARGB_4444; //PIXEL_FORMAT_ARGB_1555;//PIXEL_FORMAT_ARGB_8888; - - vo_creat_osd_test(osd_id, &osd); -} - -void vo_osd_release_block(void) -{ - if(vicap_install_osd == 1) - { - kd_mpi_vo_osd_disable(osd_id); - kd_mpi_vb_release_block(block); - } - -} - -static k_s32 sample_connector_init(void) -{ - k_u32 ret = 0; - k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) - k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; -#else - k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; -#endif - k_connector_info connector_info; - - memset(&connector_info, 0, sizeof(k_connector_info)); - - //connector get sensor info - ret = kd_mpi_get_connector_info(connector_type, &connector_info); - if (ret) { - printf("sample_vicap, the sensor type not supported!\n"); - return ret; - } - - connector_fd = kd_mpi_connector_open(connector_info.connector_name); - if (connector_fd < 0) { - printf("%s, connector open failed.\n", __func__); - return K_ERR_VO_NOTREADY; - } - - // set connect power - kd_mpi_connector_power_set(connector_fd, K_TRUE); - // connector init - kd_mpi_connector_init(connector_fd, connector_info); - - return 0; -} - -static k_s32 vo_layer_vdss_bind_vo_config(void) -{ - layer_info info; - - k_vo_layer chn_id = K_VO_LAYER1; - - memset(&info, 0, sizeof(info)); - - sample_connector_init(); - - // config lyaer - info.act_size.width = ISP_CHN0_WIDTH;//ISP_CHN0_HEIGHT;//1080;//640;//1080; - info.act_size.height = ISP_CHN0_HEIGHT;//ISP_CHN0_WIDTH;//1920;//480;//1920; - info.format = PIXEL_FORMAT_YVU_PLANAR_420; - info.func = 0;//K_ROTATION_180;////K_ROTATION_90; - info.global_alptha = 0xff; - info.offset.x = 0;//(1080-w)/2, - info.offset.y = 0;//(1920-h)/2; - vo_creat_layer_test(chn_id, &info); - - if(vicap_install_osd == 1) - sample_vicap_install_osd(); - - //exit ; - return 0; -} - -static void sample_vicap_bind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) -{ - k_s32 ret; - - ret = kd_mpi_sys_bind(&vicap_mpp_chn, &vo_mpp_chn); - if (ret) { - printf("kd_mpi_sys_unbind failed:0x%x\n", ret); - } - - return; -} - -static void sample_vicap_unbind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) -{ - k_s32 ret; - - ret = kd_mpi_sys_unbind(&vicap_mpp_chn, &vo_mpp_chn); - if (ret) { - printf("kd_mpi_sys_unbind failed:0x%x\n", ret); - } - - return; -} - -int vivcap_start() -{ - k_s32 ret = 0; - - k_u32 pool_id; - k_vb_pool_config pool_config; - - printf("sample_vicap ...\n"); - -#if defined(CONFIG_BOARD_K230_CANMV) - sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); -#else - sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; -#endif - vicap_dev = VICAP_DEV_ID_0; - - memset(&config, 0, sizeof(config)); - config.max_pool_cnt = 64; - //VB for YUV420SP output - config.comm_pool[0].blk_cnt = 5; - config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; - config.comm_pool[0].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), VICAP_ALIGN_1K); - - //VB for RGB888 output - config.comm_pool[1].blk_cnt = 5; - config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; - config.comm_pool[1].blk_size = VICAP_ALIGN_UP((SENSOR_HEIGHT * SENSOR_WIDTH * 3 ), VICAP_ALIGN_1K); - - ret = kd_mpi_vb_set_config(&config); - if (ret) { - printf("vb_set_config failed ret:%d\n", ret); - return ret; - } - - k_vb_supplement_config supplement_config; - memset(&supplement_config, 0, sizeof(supplement_config)); - supplement_config.supplement_config |= VB_SUPPLEMENT_JPEG_MASK; - - ret = kd_mpi_vb_set_supplement_config(&supplement_config); - if (ret) { - printf("vb_set_supplement_config failed ret:%d\n", ret); - return ret; - } - - ret = kd_mpi_vb_init(); - if (ret) { - printf("vb_init failed ret:%d\n", ret); - return ret; - } - printf("sample_vicap ...kd_mpi_vicap_get_sensor_info\n"); - - // dwc_dsi_init(); - vo_layer_vdss_bind_vo_config(); - - if(vicap_install_osd == 1) - { - memset(&pool_config, 0, sizeof(pool_config)); - pool_config.blk_size = VICAP_ALIGN_UP((osd_width * osd_height * 4 * 2), VICAP_ALIGN_1K); - pool_config.blk_cnt = 4; - pool_config.mode = VB_REMAP_MODE_NOCACHE; - pool_id = kd_mpi_vb_create_pool(&pool_config); // osd0 - 3 argb 320 x 240 - g_pool_id = pool_id; - - printf("--------aa--------------g_pool_id is %d pool_id is %d \n",g_pool_id, pool_id); - } - - memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); - ret = kd_mpi_vicap_get_sensor_info(sensor_type, &sensor_info); - if (ret) { - printf("sample_vicap, the sensor type not supported!\n"); - return ret; - } - - memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); - dev_attr.acq_win.h_start = 0; - dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) - dev_attr.acq_win.width = ISP_CHN0_WIDTH; - dev_attr.acq_win.height = ISP_CHN0_HEIGHT; -#else - dev_attr.acq_win.width = 2592;//SENSOR_HEIGHT; - dev_attr.acq_win.height = 1944;//SENSOR_WIDTH; -#endif - dev_attr.mode = VICAP_WORK_ONLINE_MODE; - - dev_attr.pipe_ctrl.data = 0xFFFFFFFF; - dev_attr.pipe_ctrl.bits.af_enable = 0; - dev_attr.pipe_ctrl.bits.ahdr_enable = 0; - - - dev_attr.cpature_frame = 0; - memcpy(&dev_attr.sensor_info, &sensor_info, sizeof(k_vicap_sensor_info)); - - ret = kd_mpi_vicap_set_dev_attr(vicap_dev, dev_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_dev_attr failed.\n"); - return ret; - } - - memset(&chn_attr, 0, sizeof(k_vicap_chn_attr)); - - //set chn0 output yuv420sp - chn_attr.out_win.h_start = 0; - chn_attr.out_win.v_start = 0; - chn_attr.out_win.width = ISP_CHN0_WIDTH; - chn_attr.out_win.height = ISP_CHN0_HEIGHT; - - -#if defined(CONFIG_BOARD_K230_CANMV) - chn_attr.crop_win = dev_attr.acq_win; -#else - // chn_attr.crop_win = dev_attr.acq_win; - chn_attr.crop_win.h_start = 768; - chn_attr.crop_win.v_start = 16; - chn_attr.crop_win.width = ISP_CHN0_WIDTH; - chn_attr.crop_win.height = ISP_CHN0_HEIGHT; -#endif - - chn_attr.scale_win = chn_attr.out_win; - chn_attr.crop_enable = K_FALSE; - chn_attr.scale_enable = K_FALSE; - // chn_attr.dw_enable = K_FALSE; - chn_attr.chn_enable = K_TRUE; - chn_attr.pix_format = PIXEL_FORMAT_YVU_PLANAR_420; - chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp - chn_attr.buffer_size = config.comm_pool[0].blk_size; - vicap_chn = VICAP_CHN_ID_0; - - printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); - ret = kd_mpi_vicap_set_chn_attr(vicap_dev, vicap_chn, chn_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); - return ret; - } - - //bind vicap chn 0 to vo - vicap_mpp_chn.mod_id = K_ID_VI; - vicap_mpp_chn.dev_id = vicap_dev; - vicap_mpp_chn.chn_id = vicap_chn; - - vo_mpp_chn.mod_id = K_ID_VO; - vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; - vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; - - sample_vicap_bind_vo(vicap_mpp_chn, vo_mpp_chn); - printf("sample_vicap ...dwc_dsi_init\n"); - - //set chn1 output rgb888p - chn_attr.out_win.h_start = 0; - chn_attr.out_win.v_start = 0; - chn_attr.out_win.width = SENSOR_WIDTH ; - chn_attr.out_win.height = SENSOR_HEIGHT; - // chn_attr.crop_win = dev_attr.acq_win; - -#if defined(CONFIG_BOARD_K230_CANMV) - chn_attr.crop_win = dev_attr.acq_win; -#else - chn_attr.crop_win.h_start = 768; - chn_attr.crop_win.v_start = 16; - chn_attr.crop_win.width = ISP_CHN0_WIDTH; - chn_attr.crop_win.height = ISP_CHN0_HEIGHT; -#endif - - chn_attr.scale_win = chn_attr.out_win; - chn_attr.crop_enable = K_FALSE; - chn_attr.scale_enable = K_FALSE; - // chn_attr.dw_enable = K_FALSE; - chn_attr.chn_enable = K_TRUE; - chn_attr.pix_format = PIXEL_FORMAT_BGR_888_PLANAR; - chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp - chn_attr.buffer_size = config.comm_pool[1].blk_size; - - printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); - ret = kd_mpi_vicap_set_chn_attr(vicap_dev, VICAP_CHN_ID_1, chn_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); - return ret; - } - - printf("sample_vicap ...kd_mpi_vicap_init\n"); - ret = kd_mpi_vicap_init(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - // goto err_exit; - } - - printf("sample_vicap ...kd_mpi_vicap_start_stream\n"); - ret = kd_mpi_vicap_start_stream(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - // goto err_exit; - } - - return ret; -} - -int vivcap_stop() -{ - printf("sample_vicap ...kd_mpi_vicap_stop_stream\n"); - int ret = kd_mpi_vicap_stop_stream(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - return ret; - } - - ret = kd_mpi_vicap_deinit(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_deinit failed.\n"); - return ret; - } - - kd_mpi_vo_disable_video_layer(K_VO_LAYER1); - - vicap_mpp_chn.mod_id = K_ID_VI; - vicap_mpp_chn.dev_id = vicap_dev; - vicap_mpp_chn.chn_id = vicap_chn; - - vo_mpp_chn.mod_id = K_ID_VO; - vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; - vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; - - sample_vicap_unbind_vo(vicap_mpp_chn, vo_mpp_chn); - - /*Allow one frame time for the VO to release the VB block*/ - k_u32 display_ms = 1000 / 33; - usleep(1000 * display_ms); - - ret = kd_mpi_vb_exit(); - if (ret) { - printf("sample_vicap, kd_mpi_vb_exit failed.\n"); - return ret; - } - - return 0; -} - -void yuv_rotate_90(char *des, char *src,int width,int height) -{ - int n = 0; - int hw = width>>1; - int hh = height>>1; - int size = width * height; - int hsize = size>>2; - - int pos = 0; - - for(int i = width-1;i >= 0;i--) - { - pos = 0; - for(int j= 0;j < height;j++) - { - des[n++]= src[pos+i]; - pos += width; - } - } - +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include + +#include "mpi_sys_api.h" + +/* vicap */ +#include +#include +#include +#include +#include + +#include "k_module.h" +#include "k_type.h" +#include "k_vb_comm.h" +#include "k_video_comm.h" +#include "k_sys_comm.h" +#include "mpi_vb_api.h" +#include "mpi_vicap_api.h" +#include "mpi_isp_api.h" +#include "mpi_sys_api.h" +#include "k_vo_comm.h" +#include "mpi_vo_api.h" + +#include "vo_test_case.h" + +#include "k_connector_comm.h" +#include "mpi_connector_api.h" +#include "k_autoconf_comm.h" + + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) +#define SENSOR_CHANNEL (3) // isp通道数 +#define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 +#define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 +#define ISP_CHN0_WIDTH (1920)//(1920) +#define ISP_CHN0_HEIGHT (1080)//(1080) +#define vicap_install_osd (1) +#define osd_id K_VO_OSD3 +#define osd_width (1920) +#define osd_height (1080) +#else +#define SENSOR_CHANNEL (3) // isp通道数 +#define SENSOR_HEIGHT (1280) // isp高度,ai输入,竖屏 +#define SENSOR_WIDTH (720) // isp宽度,ai输入,竖屏 +#define ISP_CHN0_WIDTH (1088)//(1920) +#define ISP_CHN0_HEIGHT (1920)//(1080) +#define vicap_install_osd (1) +#define osd_id K_VO_OSD3 +#define osd_width (1080) +#define osd_height (1920) +#endif + + +k_vb_config config; +k_vicap_dev vicap_dev; +k_vicap_chn vicap_chn; +k_vicap_dev_attr dev_attr; +k_vicap_chn_attr chn_attr; +k_vicap_sensor_info sensor_info; +k_vicap_sensor_type sensor_type; +k_mpp_chn vicap_mpp_chn; +k_mpp_chn vo_mpp_chn; + +k_video_frame_info dump_info; + +k_vo_draw_frame vo_frame = (k_vo_draw_frame) { + 1, + 16, + 16, + 128, + 128, + 1 +}; + +static k_vb_blk_handle block; +k_u32 g_pool_id; + +int vo_creat_layer_test(k_vo_layer chn_id, layer_info *info) +{ + k_vo_video_layer_attr attr; + + // check layer + if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) + || ((info->func != 0) && (chn_id == K_VO_LAYER2))) + { + printf("input layer num failed \n"); + return -1 ; + } + + // check scaler + + // set offset + attr.display_rect = info->offset; + // set act + attr.img_size = info->act_size; + // sget size + info->size = info->act_size.height * info->act_size.width * 3 / 2; + //set pixel format + attr.pixel_format = info->format; + if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) + { + printf("input pix format failed \n"); + return -1; + } + // set stride + attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); + // set function + attr.func = info->func; + // set scaler attr + attr.scaler_attr = info->attr; + + // set video layer atrr + kd_mpi_vo_set_video_layer_attr(chn_id, &attr); + + // enable layer + kd_mpi_vo_enable_video_layer(chn_id); + + return 0; +} + +k_vb_blk_handle vo_insert_frame(k_video_frame_info *vf_info, void **pic_vaddr) +{ + k_u64 phys_addr = 0; + k_u32 *virt_addr; + k_vb_blk_handle handle; + k_s32 size; + + if (vf_info == NULL) + return K_FALSE; + + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_8888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_8888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 4; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_565 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_565) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_4444 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_4444) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_1555 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_1555) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3 / 2; + + size = size + 4096; // 强制4K ,后边得删了 + + printf("vb block size is %x \n", size); + + handle = kd_mpi_vb_get_block(g_pool_id, size, NULL); + if (handle == VB_INVALID_HANDLE) + { + printf("%s get vb block error\n", __func__); + return K_FAILED; + } + + phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); + if (phys_addr == 0) + { + printf("%s get phys addr error\n", __func__); + return K_FAILED; + } + + virt_addr = (k_u32 *)kd_mpi_sys_mmap(phys_addr, size); + // virt_addr = (k_u32 *)kd_mpi_sys_mmap_cached(phys_addr, size); + + if (virt_addr == NULL) + { + printf("%s mmap error\n", __func__); + return K_FAILED; + } + + vf_info->mod_id = K_ID_VO; + vf_info->pool_id = g_pool_id; + vf_info->v_frame.phys_addr[0] = phys_addr; + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + vf_info->v_frame.phys_addr[1] = phys_addr + (vf_info->v_frame.height * vf_info->v_frame.stride[0]); + *pic_vaddr = virt_addr; + + printf("phys_addr is %lx g_pool_id is %d \n", phys_addr, g_pool_id); + + return handle; +} + +k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) +{ + k_vo_video_osd_attr attr; + + // set attr + attr.global_alptha = info->global_alptha; + + if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) + { + info->size = info->act_size.width * info->act_size.height * 4; + info->stride = info->act_size.width * 4 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) + { + info->size = info->act_size.width * info->act_size.height * 3; + info->stride = info->act_size.width * 3 / 8; + } + else if(info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if(info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else + { + printf("set osd pixel format failed \n"); + } + + attr.stride = info->stride; + attr.pixel_format = info->format; + attr.display_rect = info->offset; + attr.img_size = info->act_size; + kd_mpi_vo_set_video_osd_attr(osd, &attr); + + kd_mpi_vo_osd_enable(osd); + + return 0; +} + +void sample_vicap_install_osd(void) +{ + osd_info osd; + + osd.act_size.width = osd_width ; + osd.act_size.height = osd_height; + osd.offset.x = 0; + osd.offset.y = 0; + osd.global_alptha = 0xff; + // osd.global_alptha = 0x32; + osd.format = PIXEL_FORMAT_ARGB_8888;//PIXEL_FORMAT_ARGB_4444; //PIXEL_FORMAT_ARGB_1555;//PIXEL_FORMAT_ARGB_8888; + + vo_creat_osd_test(osd_id, &osd); +} + +void vo_osd_release_block(void) +{ + if(vicap_install_osd == 1) + { + kd_mpi_vo_osd_disable(osd_id); + kd_mpi_vb_release_block(block); + } + +} + +static k_s32 sample_connector_init(void) +{ + k_u32 ret = 0; + k_s32 connector_fd; +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#else + k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#endif + k_connector_info connector_info; + + memset(&connector_info, 0, sizeof(k_connector_info)); + + //connector get sensor info + ret = kd_mpi_get_connector_info(connector_type, &connector_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + + connector_fd = kd_mpi_connector_open(connector_info.connector_name); + if (connector_fd < 0) { + printf("%s, connector open failed.\n", __func__); + return K_ERR_VO_NOTREADY; + } + + // set connect power + kd_mpi_connector_power_set(connector_fd, K_TRUE); + // connector init + kd_mpi_connector_init(connector_fd, connector_info); + + return 0; +} + +static k_s32 vo_layer_vdss_bind_vo_config(void) +{ + layer_info info; + + k_vo_layer chn_id = K_VO_LAYER1; + + memset(&info, 0, sizeof(info)); + + sample_connector_init(); + + // config lyaer + info.act_size.width = ISP_CHN0_WIDTH;//ISP_CHN0_HEIGHT;//1080;//640;//1080; + info.act_size.height = ISP_CHN0_HEIGHT;//ISP_CHN0_WIDTH;//1920;//480;//1920; + info.format = PIXEL_FORMAT_YVU_PLANAR_420; + info.func = 0;//K_ROTATION_180;////K_ROTATION_90; + info.global_alptha = 0xff; + info.offset.x = 0;//(1080-w)/2, + info.offset.y = 0;//(1920-h)/2; + vo_creat_layer_test(chn_id, &info); + + if(vicap_install_osd == 1) + sample_vicap_install_osd(); + + //exit ; + return 0; +} + +static void sample_vicap_bind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) +{ + k_s32 ret; + + ret = kd_mpi_sys_bind(&vicap_mpp_chn, &vo_mpp_chn); + if (ret) { + printf("kd_mpi_sys_unbind failed:0x%x\n", ret); + } + + return; +} + +static void sample_vicap_unbind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) +{ + k_s32 ret; + + ret = kd_mpi_sys_unbind(&vicap_mpp_chn, &vo_mpp_chn); + if (ret) { + printf("kd_mpi_sys_unbind failed:0x%x\n", ret); + } + + return; +} + +int vivcap_start() +{ + k_s32 ret = 0; + + k_u32 pool_id; + k_vb_pool_config pool_config; + + printf("sample_vicap ...\n"); + +#if defined(CONFIG_BOARD_K230_CANMV) + sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; +#else + sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; +#endif + vicap_dev = VICAP_DEV_ID_0; + + memset(&config, 0, sizeof(config)); + config.max_pool_cnt = 64; + //VB for YUV420SP output + config.comm_pool[0].blk_cnt = 5; + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[0].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), VICAP_ALIGN_1K); + + //VB for RGB888 output + config.comm_pool[1].blk_cnt = 5; + config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[1].blk_size = VICAP_ALIGN_UP((SENSOR_HEIGHT * SENSOR_WIDTH * 3 ), VICAP_ALIGN_1K); + + ret = kd_mpi_vb_set_config(&config); + if (ret) { + printf("vb_set_config failed ret:%d\n", ret); + return ret; + } + + k_vb_supplement_config supplement_config; + memset(&supplement_config, 0, sizeof(supplement_config)); + supplement_config.supplement_config |= VB_SUPPLEMENT_JPEG_MASK; + + ret = kd_mpi_vb_set_supplement_config(&supplement_config); + if (ret) { + printf("vb_set_supplement_config failed ret:%d\n", ret); + return ret; + } + + ret = kd_mpi_vb_init(); + if (ret) { + printf("vb_init failed ret:%d\n", ret); + return ret; + } + printf("sample_vicap ...kd_mpi_vicap_get_sensor_info\n"); + + // dwc_dsi_init(); + vo_layer_vdss_bind_vo_config(); + + if(vicap_install_osd == 1) + { + memset(&pool_config, 0, sizeof(pool_config)); + pool_config.blk_size = VICAP_ALIGN_UP((osd_width * osd_height * 4 * 2), VICAP_ALIGN_1K); + pool_config.blk_cnt = 4; + pool_config.mode = VB_REMAP_MODE_NOCACHE; + pool_id = kd_mpi_vb_create_pool(&pool_config); // osd0 - 3 argb 320 x 240 + g_pool_id = pool_id; + + printf("--------aa--------------g_pool_id is %d pool_id is %d \n",g_pool_id, pool_id); + } + + memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); + ret = kd_mpi_vicap_get_sensor_info(sensor_type, &sensor_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + + memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); + dev_attr.acq_win.h_start = 0; + dev_attr.acq_win.v_start = 0; +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + dev_attr.acq_win.width = ISP_CHN0_WIDTH; + dev_attr.acq_win.height = ISP_CHN0_HEIGHT; +#else + dev_attr.acq_win.width = 2592;//SENSOR_HEIGHT; + dev_attr.acq_win.height = 1944;//SENSOR_WIDTH; +#endif + dev_attr.mode = VICAP_WORK_ONLINE_MODE; + + dev_attr.pipe_ctrl.data = 0xFFFFFFFF; + dev_attr.pipe_ctrl.bits.af_enable = 0; + dev_attr.pipe_ctrl.bits.ahdr_enable = 0; + + + dev_attr.cpature_frame = 0; + memcpy(&dev_attr.sensor_info, &sensor_info, sizeof(k_vicap_sensor_info)); + + ret = kd_mpi_vicap_set_dev_attr(vicap_dev, dev_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_dev_attr failed.\n"); + return ret; + } + + memset(&chn_attr, 0, sizeof(k_vicap_chn_attr)); + + //set chn0 output yuv420sp + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = ISP_CHN0_WIDTH; + chn_attr.out_win.height = ISP_CHN0_HEIGHT; + + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + chn_attr.crop_win = dev_attr.acq_win; +#else + // chn_attr.crop_win = dev_attr.acq_win; + chn_attr.crop_win.h_start = 768; + chn_attr.crop_win.v_start = 16; + chn_attr.crop_win.width = ISP_CHN0_WIDTH; + chn_attr.crop_win.height = ISP_CHN0_HEIGHT; +#endif + + chn_attr.scale_win = chn_attr.out_win; + chn_attr.crop_enable = K_FALSE; + chn_attr.scale_enable = K_FALSE; + // chn_attr.dw_enable = K_FALSE; + chn_attr.chn_enable = K_TRUE; + chn_attr.pix_format = PIXEL_FORMAT_YVU_PLANAR_420; + chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp + chn_attr.buffer_size = config.comm_pool[0].blk_size; + vicap_chn = VICAP_CHN_ID_0; + + printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); + ret = kd_mpi_vicap_set_chn_attr(vicap_dev, vicap_chn, chn_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); + return ret; + } + + //bind vicap chn 0 to vo + vicap_mpp_chn.mod_id = K_ID_VI; + vicap_mpp_chn.dev_id = vicap_dev; + vicap_mpp_chn.chn_id = vicap_chn; + + vo_mpp_chn.mod_id = K_ID_VO; + vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; + vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; + + sample_vicap_bind_vo(vicap_mpp_chn, vo_mpp_chn); + printf("sample_vicap ...dwc_dsi_init\n"); + + //set chn1 output rgb888p + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = SENSOR_WIDTH ; + chn_attr.out_win.height = SENSOR_HEIGHT; + // chn_attr.crop_win = dev_attr.acq_win; + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + chn_attr.crop_win = dev_attr.acq_win; +#else + chn_attr.crop_win.h_start = 768; + chn_attr.crop_win.v_start = 16; + chn_attr.crop_win.width = ISP_CHN0_WIDTH; + chn_attr.crop_win.height = ISP_CHN0_HEIGHT; +#endif + + chn_attr.scale_win = chn_attr.out_win; + chn_attr.crop_enable = K_FALSE; + chn_attr.scale_enable = K_FALSE; + // chn_attr.dw_enable = K_FALSE; + chn_attr.chn_enable = K_TRUE; + chn_attr.pix_format = PIXEL_FORMAT_BGR_888_PLANAR; + chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp + chn_attr.buffer_size = config.comm_pool[1].blk_size; + + printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); + ret = kd_mpi_vicap_set_chn_attr(vicap_dev, VICAP_CHN_ID_1, chn_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); + return ret; + } + + printf("sample_vicap ...kd_mpi_vicap_init\n"); + ret = kd_mpi_vicap_init(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + // goto err_exit; + } + + printf("sample_vicap ...kd_mpi_vicap_start_stream\n"); + ret = kd_mpi_vicap_start_stream(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + // goto err_exit; + } + + return ret; +} + +int vivcap_stop() +{ + printf("sample_vicap ...kd_mpi_vicap_stop_stream\n"); + int ret = kd_mpi_vicap_stop_stream(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + return ret; + } + + ret = kd_mpi_vicap_deinit(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_deinit failed.\n"); + return ret; + } + + kd_mpi_vo_disable_video_layer(K_VO_LAYER1); + + vicap_mpp_chn.mod_id = K_ID_VI; + vicap_mpp_chn.dev_id = vicap_dev; + vicap_mpp_chn.chn_id = vicap_chn; + + vo_mpp_chn.mod_id = K_ID_VO; + vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; + vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; + + sample_vicap_unbind_vo(vicap_mpp_chn, vo_mpp_chn); + + /*Allow one frame time for the VO to release the VB block*/ + k_u32 display_ms = 1000 / 33; + usleep(1000 * display_ms); + + ret = kd_mpi_vb_exit(); + if (ret) { + printf("sample_vicap, kd_mpi_vb_exit failed.\n"); + return ret; + } + + return 0; +} + +void yuv_rotate_90(char *des, char *src,int width,int height) +{ + int n = 0; + int hw = width>>1; + int hh = height>>1; + int size = width * height; + int hsize = size>>2; + + int pos = 0; + + for(int i = width-1;i >= 0;i--) + { + pos = 0; + for(int j= 0;j < height;j++) + { + des[n++]= src[pos+i]; + pos += width; + } + } + } \ No newline at end of file diff --git a/src/reference/ai_poc/version b/src/reference/ai_poc/version index b1f742158..1ce69a78a 100644 --- a/src/reference/ai_poc/version +++ b/src/reference/ai_poc/version @@ -1 +1 @@ -v1.4 +v1.5 diff --git a/src/reference/ai_poc/virtual_keyboard/main.cc b/src/reference/ai_poc/virtual_keyboard/main.cc index 9d6072ee1..32c214909 100644 --- a/src/reference/ai_poc/virtual_keyboard/main.cc +++ b/src/reference/ai_poc/virtual_keyboard/main.cc @@ -86,7 +86,7 @@ void video_proc(char *argv[]) std::vector keys; std::string letters = "QWERTYUIOPASDFGHJKLZXCVBNM"; - #if defined(CONFIG_BOARD_K230_CANMV) + #if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) int character_len = 39; int box_w = 140; int box_h = 100; diff --git a/src/reference/ai_poc/virtual_keyboard/vi_vo.h b/src/reference/ai_poc/virtual_keyboard/vi_vo.h index e3d8bdba4..0a11a4d31 100644 --- a/src/reference/ai_poc/virtual_keyboard/vi_vo.h +++ b/src/reference/ai_poc/virtual_keyboard/vi_vo.h @@ -1,627 +1,628 @@ -/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include -#include -#include - -#include "mpi_sys_api.h" - -/* vicap */ -#include -#include -#include -#include -#include - -#include "k_module.h" -#include "k_type.h" -#include "k_vb_comm.h" -#include "k_video_comm.h" -#include "k_sys_comm.h" -#include "mpi_vb_api.h" -#include "mpi_vicap_api.h" -#include "mpi_isp_api.h" -#include "mpi_sys_api.h" -#include "k_vo_comm.h" -#include "mpi_vo_api.h" - -#include "vo_test_case.h" - -#include "k_connector_comm.h" -#include "mpi_connector_api.h" -#include "k_autoconf_comm.h" - - -#if defined(CONFIG_BOARD_K230_CANMV) -#define SENSOR_CHANNEL (3) // isp通道数 -#define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 -#define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 -#define ISP_CHN0_WIDTH (1920)//(1920) -#define ISP_CHN0_HEIGHT (1080)//(1080) -#define vicap_install_osd (1) -#define osd_id K_VO_OSD3 -#define osd_width (1920) -#define osd_height (1080) -#else -#define SENSOR_CHANNEL (3) // isp通道数 -#define SENSOR_HEIGHT (1280) // isp高度,ai输入,竖屏 -#define SENSOR_WIDTH (720) // isp宽度,ai输入,竖屏 -#define ISP_CHN0_WIDTH (1088)//(1920) -#define ISP_CHN0_HEIGHT (1920)//(1080) -#define vicap_install_osd (1) -#define osd_id K_VO_OSD3 -#define osd_width (1080) -#define osd_height (1920) -#endif - - -k_vb_config config; -k_vicap_dev vicap_dev; -k_vicap_chn vicap_chn; -k_vicap_dev_attr dev_attr; -k_vicap_chn_attr chn_attr; -k_vicap_sensor_info sensor_info; -k_vicap_sensor_type sensor_type; -k_mpp_chn vicap_mpp_chn; -k_mpp_chn vo_mpp_chn; - -k_video_frame_info dump_info; - -k_vo_draw_frame vo_frame = (k_vo_draw_frame) { - 1, - 16, - 16, - 128, - 128, - 1 -}; - -static k_vb_blk_handle block; -k_u32 g_pool_id; - -int vo_creat_layer_test(k_vo_layer chn_id, layer_info *info) -{ - k_vo_video_layer_attr attr; - - // check layer - if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) - || ((info->func != 0) && (chn_id == K_VO_LAYER2))) - { - printf("input layer num failed \n"); - return -1 ; - } - - // check scaler - - // set offset - attr.display_rect = info->offset; - // set act - attr.img_size = info->act_size; - // sget size - info->size = info->act_size.height * info->act_size.width * 3 / 2; - //set pixel format - attr.pixel_format = info->format; - if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) - { - printf("input pix format failed \n"); - return -1; - } - // set stride - attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); - // set function - attr.func = info->func; - // set scaler attr - attr.scaler_attr = info->attr; - - // set video layer atrr - kd_mpi_vo_set_video_layer_attr(chn_id, &attr); - - // enable layer - kd_mpi_vo_enable_video_layer(chn_id); - - return 0; -} - -k_vb_blk_handle vo_insert_frame(k_video_frame_info *vf_info, void **pic_vaddr) -{ - k_u64 phys_addr = 0; - k_u32 *virt_addr; - k_vb_blk_handle handle; - k_s32 size; - - if (vf_info == NULL) - return K_FALSE; - - if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_8888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_8888) - size = vf_info->v_frame.height * vf_info->v_frame.width * 4; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_565 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_565) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_4444 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_4444) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_888) - size = vf_info->v_frame.height * vf_info->v_frame.width * 3; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_1555 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_1555) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) - size = vf_info->v_frame.height * vf_info->v_frame.width * 3 / 2; - - size = size + 4096; // 强制4K ,后边得删了 - - printf("vb block size is %x \n", size); - - handle = kd_mpi_vb_get_block(g_pool_id, size, NULL); - if (handle == VB_INVALID_HANDLE) - { - printf("%s get vb block error\n", __func__); - return K_FAILED; - } - - phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); - if (phys_addr == 0) - { - printf("%s get phys addr error\n", __func__); - return K_FAILED; - } - - virt_addr = (k_u32 *)kd_mpi_sys_mmap(phys_addr, size); - // virt_addr = (k_u32 *)kd_mpi_sys_mmap_cached(phys_addr, size); - - if (virt_addr == NULL) - { - printf("%s mmap error\n", __func__); - return K_FAILED; - } - - vf_info->mod_id = K_ID_VO; - vf_info->pool_id = g_pool_id; - vf_info->v_frame.phys_addr[0] = phys_addr; - if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) - vf_info->v_frame.phys_addr[1] = phys_addr + (vf_info->v_frame.height * vf_info->v_frame.stride[0]); - *pic_vaddr = virt_addr; - - printf("phys_addr is %lx g_pool_id is %d \n", phys_addr, g_pool_id); - - return handle; -} - -k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) -{ - k_vo_video_osd_attr attr; - - // set attr - attr.global_alptha = info->global_alptha; - - if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) - { - info->size = info->act_size.width * info->act_size.height * 4; - info->stride = info->act_size.width * 4 / 8; - } - else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) - { - info->size = info->act_size.width * info->act_size.height * 3; - info->stride = info->act_size.width * 3 / 8; - } - else if(info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else if(info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else - { - printf("set osd pixel format failed \n"); - } - - attr.stride = info->stride; - attr.pixel_format = info->format; - attr.display_rect = info->offset; - attr.img_size = info->act_size; - kd_mpi_vo_set_video_osd_attr(osd, &attr); - - kd_mpi_vo_osd_enable(osd); - - return 0; -} - -void sample_vicap_install_osd(void) -{ - osd_info osd; - - osd.act_size.width = osd_width ; - osd.act_size.height = osd_height; - osd.offset.x = 0; - osd.offset.y = 0; - osd.global_alptha = 0xff; - // osd.global_alptha = 0x32; - osd.format = PIXEL_FORMAT_ARGB_8888;//PIXEL_FORMAT_ARGB_4444; //PIXEL_FORMAT_ARGB_1555;//PIXEL_FORMAT_ARGB_8888; - - vo_creat_osd_test(osd_id, &osd); -} - -void vo_osd_release_block(void) -{ - if(vicap_install_osd == 1) - { - kd_mpi_vo_osd_disable(osd_id); - kd_mpi_vb_release_block(block); - } - -} - -static k_s32 sample_connector_init(void) -{ - k_u32 ret = 0; - k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) - k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; -#else - k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; -#endif - k_connector_info connector_info; - - memset(&connector_info, 0, sizeof(k_connector_info)); - - //connector get sensor info - ret = kd_mpi_get_connector_info(connector_type, &connector_info); - if (ret) { - printf("sample_vicap, the sensor type not supported!\n"); - return ret; - } - - connector_fd = kd_mpi_connector_open(connector_info.connector_name); - if (connector_fd < 0) { - printf("%s, connector open failed.\n", __func__); - return K_ERR_VO_NOTREADY; - } - - // set connect power - kd_mpi_connector_power_set(connector_fd, K_TRUE); - // connector init - kd_mpi_connector_init(connector_fd, connector_info); - - return 0; -} - -static k_s32 vo_layer_vdss_bind_vo_config(void) -{ - layer_info info; - - k_vo_layer chn_id = K_VO_LAYER1; - - memset(&info, 0, sizeof(info)); - - sample_connector_init(); - - // config lyaer - info.act_size.width = ISP_CHN0_WIDTH;//ISP_CHN0_HEIGHT;//1080;//640;//1080; - info.act_size.height = ISP_CHN0_HEIGHT;//ISP_CHN0_WIDTH;//1920;//480;//1920; - info.format = PIXEL_FORMAT_YVU_PLANAR_420; - info.func = 0;//K_ROTATION_180;////K_ROTATION_90; - info.global_alptha = 0xff; - info.offset.x = 0;//(1080-w)/2, - info.offset.y = 0;//(1920-h)/2; - vo_creat_layer_test(chn_id, &info); - - if(vicap_install_osd == 1) - sample_vicap_install_osd(); - - //exit ; - return 0; -} - -static void sample_vicap_bind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) -{ - k_s32 ret; - - ret = kd_mpi_sys_bind(&vicap_mpp_chn, &vo_mpp_chn); - if (ret) { - printf("kd_mpi_sys_unbind failed:0x%x\n", ret); - } - - return; -} - -static void sample_vicap_unbind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) -{ - k_s32 ret; - - ret = kd_mpi_sys_unbind(&vicap_mpp_chn, &vo_mpp_chn); - if (ret) { - printf("kd_mpi_sys_unbind failed:0x%x\n", ret); - } - - return; -} - -int vivcap_start() -{ - k_s32 ret = 0; - - k_u32 pool_id; - k_vb_pool_config pool_config; - - printf("sample_vicap ...\n"); - -#if defined(CONFIG_BOARD_K230_CANMV) - sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); -#else - sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; -#endif - vicap_dev = VICAP_DEV_ID_0; - - memset(&config, 0, sizeof(config)); - config.max_pool_cnt = 64; - //VB for YUV420SP output - config.comm_pool[0].blk_cnt = 5; - config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; - config.comm_pool[0].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), VICAP_ALIGN_1K); - - //VB for RGB888 output - config.comm_pool[1].blk_cnt = 5; - config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; - config.comm_pool[1].blk_size = VICAP_ALIGN_UP((SENSOR_HEIGHT * SENSOR_WIDTH * 3 ), VICAP_ALIGN_1K); - - ret = kd_mpi_vb_set_config(&config); - if (ret) { - printf("vb_set_config failed ret:%d\n", ret); - return ret; - } - - k_vb_supplement_config supplement_config; - memset(&supplement_config, 0, sizeof(supplement_config)); - supplement_config.supplement_config |= VB_SUPPLEMENT_JPEG_MASK; - - ret = kd_mpi_vb_set_supplement_config(&supplement_config); - if (ret) { - printf("vb_set_supplement_config failed ret:%d\n", ret); - return ret; - } - - ret = kd_mpi_vb_init(); - if (ret) { - printf("vb_init failed ret:%d\n", ret); - return ret; - } - printf("sample_vicap ...kd_mpi_vicap_get_sensor_info\n"); - - // dwc_dsi_init(); - vo_layer_vdss_bind_vo_config(); - - if(vicap_install_osd == 1) - { - memset(&pool_config, 0, sizeof(pool_config)); - pool_config.blk_size = VICAP_ALIGN_UP((osd_width * osd_height * 4 * 2), VICAP_ALIGN_1K); - pool_config.blk_cnt = 4; - pool_config.mode = VB_REMAP_MODE_NOCACHE; - pool_id = kd_mpi_vb_create_pool(&pool_config); // osd0 - 3 argb 320 x 240 - g_pool_id = pool_id; - - printf("--------aa--------------g_pool_id is %d pool_id is %d \n",g_pool_id, pool_id); - } - - memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); - ret = kd_mpi_vicap_get_sensor_info(sensor_type, &sensor_info); - if (ret) { - printf("sample_vicap, the sensor type not supported!\n"); - return ret; - } - - memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); - dev_attr.acq_win.h_start = 0; - dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) - dev_attr.acq_win.width = ISP_CHN0_WIDTH; - dev_attr.acq_win.height = ISP_CHN0_HEIGHT; -#else - dev_attr.acq_win.width = 2592;//SENSOR_HEIGHT; - dev_attr.acq_win.height = 1944;//SENSOR_WIDTH; -#endif - dev_attr.mode = VICAP_WORK_ONLINE_MODE; - - dev_attr.pipe_ctrl.data = 0xFFFFFFFF; - dev_attr.pipe_ctrl.bits.af_enable = 0; - dev_attr.pipe_ctrl.bits.ahdr_enable = 0; - - - dev_attr.cpature_frame = 0; - memcpy(&dev_attr.sensor_info, &sensor_info, sizeof(k_vicap_sensor_info)); - - ret = kd_mpi_vicap_set_dev_attr(vicap_dev, dev_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_dev_attr failed.\n"); - return ret; - } - - memset(&chn_attr, 0, sizeof(k_vicap_chn_attr)); - - //set chn0 output yuv420sp - chn_attr.out_win.h_start = 0; - chn_attr.out_win.v_start = 0; - chn_attr.out_win.width = ISP_CHN0_WIDTH; - chn_attr.out_win.height = ISP_CHN0_HEIGHT; - - -#if defined(CONFIG_BOARD_K230_CANMV) - chn_attr.crop_win = dev_attr.acq_win; -#else - // chn_attr.crop_win = dev_attr.acq_win; - chn_attr.crop_win.h_start = 768; - chn_attr.crop_win.v_start = 16; - chn_attr.crop_win.width = ISP_CHN0_WIDTH; - chn_attr.crop_win.height = ISP_CHN0_HEIGHT; -#endif - - chn_attr.scale_win = chn_attr.out_win; - chn_attr.crop_enable = K_FALSE; - chn_attr.scale_enable = K_FALSE; - // chn_attr.dw_enable = K_FALSE; - chn_attr.chn_enable = K_TRUE; - chn_attr.pix_format = PIXEL_FORMAT_YVU_PLANAR_420; - chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp - chn_attr.buffer_size = config.comm_pool[0].blk_size; - vicap_chn = VICAP_CHN_ID_0; - - printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); - ret = kd_mpi_vicap_set_chn_attr(vicap_dev, vicap_chn, chn_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); - return ret; - } - - //bind vicap chn 0 to vo - vicap_mpp_chn.mod_id = K_ID_VI; - vicap_mpp_chn.dev_id = vicap_dev; - vicap_mpp_chn.chn_id = vicap_chn; - - vo_mpp_chn.mod_id = K_ID_VO; - vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; - vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; - - sample_vicap_bind_vo(vicap_mpp_chn, vo_mpp_chn); - printf("sample_vicap ...dwc_dsi_init\n"); - - //set chn1 output rgb888p - chn_attr.out_win.h_start = 0; - chn_attr.out_win.v_start = 0; - chn_attr.out_win.width = SENSOR_WIDTH ; - chn_attr.out_win.height = SENSOR_HEIGHT; - // chn_attr.crop_win = dev_attr.acq_win; - -#if defined(CONFIG_BOARD_K230_CANMV) - chn_attr.crop_win = dev_attr.acq_win; -#else - chn_attr.crop_win.h_start = 768; - chn_attr.crop_win.v_start = 16; - chn_attr.crop_win.width = ISP_CHN0_WIDTH; - chn_attr.crop_win.height = ISP_CHN0_HEIGHT; -#endif - - chn_attr.scale_win = chn_attr.out_win; - chn_attr.crop_enable = K_FALSE; - chn_attr.scale_enable = K_FALSE; - // chn_attr.dw_enable = K_FALSE; - chn_attr.chn_enable = K_TRUE; - chn_attr.pix_format = PIXEL_FORMAT_BGR_888_PLANAR; - chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp - chn_attr.buffer_size = config.comm_pool[1].blk_size; - - printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); - ret = kd_mpi_vicap_set_chn_attr(vicap_dev, VICAP_CHN_ID_1, chn_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); - return ret; - } - - printf("sample_vicap ...kd_mpi_vicap_init\n"); - ret = kd_mpi_vicap_init(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - // goto err_exit; - } - - printf("sample_vicap ...kd_mpi_vicap_start_stream\n"); - ret = kd_mpi_vicap_start_stream(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - // goto err_exit; - } - - return ret; -} - -int vivcap_stop() -{ - printf("sample_vicap ...kd_mpi_vicap_stop_stream\n"); - int ret = kd_mpi_vicap_stop_stream(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - return ret; - } - - ret = kd_mpi_vicap_deinit(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_deinit failed.\n"); - return ret; - } - - kd_mpi_vo_disable_video_layer(K_VO_LAYER1); - - vicap_mpp_chn.mod_id = K_ID_VI; - vicap_mpp_chn.dev_id = vicap_dev; - vicap_mpp_chn.chn_id = vicap_chn; - - vo_mpp_chn.mod_id = K_ID_VO; - vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; - vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; - - sample_vicap_unbind_vo(vicap_mpp_chn, vo_mpp_chn); - - /*Allow one frame time for the VO to release the VB block*/ - k_u32 display_ms = 1000 / 33; - usleep(1000 * display_ms); - - ret = kd_mpi_vb_exit(); - if (ret) { - printf("sample_vicap, kd_mpi_vb_exit failed.\n"); - return ret; - } - - return 0; -} - -void yuv_rotate_90(char *des, char *src,int width,int height) -{ - int n = 0; - int hw = width>>1; - int hh = height>>1; - int size = width * height; - int hsize = size>>2; - - int pos = 0; - - for(int i = width-1;i >= 0;i--) - { - pos = 0; - for(int j= 0;j < height;j++) - { - des[n++]= src[pos+i]; - pos += width; - } - } - +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include + +#include "mpi_sys_api.h" + +/* vicap */ +#include +#include +#include +#include +#include + +#include "k_module.h" +#include "k_type.h" +#include "k_vb_comm.h" +#include "k_video_comm.h" +#include "k_sys_comm.h" +#include "mpi_vb_api.h" +#include "mpi_vicap_api.h" +#include "mpi_isp_api.h" +#include "mpi_sys_api.h" +#include "k_vo_comm.h" +#include "mpi_vo_api.h" + +#include "vo_test_case.h" + +#include "k_connector_comm.h" +#include "mpi_connector_api.h" +#include "k_autoconf_comm.h" + + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) +#define SENSOR_CHANNEL (3) // isp通道数 +#define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 +#define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 +#define ISP_CHN0_WIDTH (1920)//(1920) +#define ISP_CHN0_HEIGHT (1080)//(1080) +#define vicap_install_osd (1) +#define osd_id K_VO_OSD3 +#define osd_width (1920) +#define osd_height (1080) +#else +#define SENSOR_CHANNEL (3) // isp通道数 +#define SENSOR_HEIGHT (1280) // isp高度,ai输入,竖屏 +#define SENSOR_WIDTH (720) // isp宽度,ai输入,竖屏 +#define ISP_CHN0_WIDTH (1088)//(1920) +#define ISP_CHN0_HEIGHT (1920)//(1080) +#define vicap_install_osd (1) +#define osd_id K_VO_OSD3 +#define osd_width (1080) +#define osd_height (1920) +#endif + + +k_vb_config config; +k_vicap_dev vicap_dev; +k_vicap_chn vicap_chn; +k_vicap_dev_attr dev_attr; +k_vicap_chn_attr chn_attr; +k_vicap_sensor_info sensor_info; +k_vicap_sensor_type sensor_type; +k_mpp_chn vicap_mpp_chn; +k_mpp_chn vo_mpp_chn; + +k_video_frame_info dump_info; + +k_vo_draw_frame vo_frame = (k_vo_draw_frame) { + 1, + 16, + 16, + 128, + 128, + 1 +}; + +static k_vb_blk_handle block; +k_u32 g_pool_id; + +int vo_creat_layer_test(k_vo_layer chn_id, layer_info *info) +{ + k_vo_video_layer_attr attr; + + // check layer + if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) + || ((info->func != 0) && (chn_id == K_VO_LAYER2))) + { + printf("input layer num failed \n"); + return -1 ; + } + + // check scaler + + // set offset + attr.display_rect = info->offset; + // set act + attr.img_size = info->act_size; + // sget size + info->size = info->act_size.height * info->act_size.width * 3 / 2; + //set pixel format + attr.pixel_format = info->format; + if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) + { + printf("input pix format failed \n"); + return -1; + } + // set stride + attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); + // set function + attr.func = info->func; + // set scaler attr + attr.scaler_attr = info->attr; + + // set video layer atrr + kd_mpi_vo_set_video_layer_attr(chn_id, &attr); + + // enable layer + kd_mpi_vo_enable_video_layer(chn_id); + + return 0; +} + +k_vb_blk_handle vo_insert_frame(k_video_frame_info *vf_info, void **pic_vaddr) +{ + k_u64 phys_addr = 0; + k_u32 *virt_addr; + k_vb_blk_handle handle; + k_s32 size; + + if (vf_info == NULL) + return K_FALSE; + + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_8888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_8888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 4; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_565 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_565) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_4444 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_4444) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_1555 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_1555) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3 / 2; + + size = size + 4096; // 强制4K ,后边得删了 + + printf("vb block size is %x \n", size); + + handle = kd_mpi_vb_get_block(g_pool_id, size, NULL); + if (handle == VB_INVALID_HANDLE) + { + printf("%s get vb block error\n", __func__); + return K_FAILED; + } + + phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); + if (phys_addr == 0) + { + printf("%s get phys addr error\n", __func__); + return K_FAILED; + } + + virt_addr = (k_u32 *)kd_mpi_sys_mmap(phys_addr, size); + // virt_addr = (k_u32 *)kd_mpi_sys_mmap_cached(phys_addr, size); + + if (virt_addr == NULL) + { + printf("%s mmap error\n", __func__); + return K_FAILED; + } + + vf_info->mod_id = K_ID_VO; + vf_info->pool_id = g_pool_id; + vf_info->v_frame.phys_addr[0] = phys_addr; + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + vf_info->v_frame.phys_addr[1] = phys_addr + (vf_info->v_frame.height * vf_info->v_frame.stride[0]); + *pic_vaddr = virt_addr; + + printf("phys_addr is %lx g_pool_id is %d \n", phys_addr, g_pool_id); + + return handle; +} + +k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) +{ + k_vo_video_osd_attr attr; + + // set attr + attr.global_alptha = info->global_alptha; + + if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) + { + info->size = info->act_size.width * info->act_size.height * 4; + info->stride = info->act_size.width * 4 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) + { + info->size = info->act_size.width * info->act_size.height * 3; + info->stride = info->act_size.width * 3 / 8; + } + else if(info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if(info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else + { + printf("set osd pixel format failed \n"); + } + + attr.stride = info->stride; + attr.pixel_format = info->format; + attr.display_rect = info->offset; + attr.img_size = info->act_size; + kd_mpi_vo_set_video_osd_attr(osd, &attr); + + kd_mpi_vo_osd_enable(osd); + + return 0; +} + +void sample_vicap_install_osd(void) +{ + osd_info osd; + + osd.act_size.width = osd_width ; + osd.act_size.height = osd_height; + osd.offset.x = 0; + osd.offset.y = 0; + osd.global_alptha = 0xff; + // osd.global_alptha = 0x32; + osd.format = PIXEL_FORMAT_ARGB_8888;//PIXEL_FORMAT_ARGB_4444; //PIXEL_FORMAT_ARGB_1555;//PIXEL_FORMAT_ARGB_8888; + + vo_creat_osd_test(osd_id, &osd); +} + +void vo_osd_release_block(void) +{ + if(vicap_install_osd == 1) + { + kd_mpi_vo_osd_disable(osd_id); + kd_mpi_vb_release_block(block); + } + +} + +static k_s32 sample_connector_init(void) +{ + k_u32 ret = 0; + k_s32 connector_fd; +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#else + k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#endif + k_connector_info connector_info; + + memset(&connector_info, 0, sizeof(k_connector_info)); + + //connector get sensor info + ret = kd_mpi_get_connector_info(connector_type, &connector_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + + connector_fd = kd_mpi_connector_open(connector_info.connector_name); + if (connector_fd < 0) { + printf("%s, connector open failed.\n", __func__); + return K_ERR_VO_NOTREADY; + } + + // set connect power + kd_mpi_connector_power_set(connector_fd, K_TRUE); + // connector init + kd_mpi_connector_init(connector_fd, connector_info); + + return 0; +} + +static k_s32 vo_layer_vdss_bind_vo_config(void) +{ + layer_info info; + + k_vo_layer chn_id = K_VO_LAYER1; + + memset(&info, 0, sizeof(info)); + + sample_connector_init(); + + // config lyaer + info.act_size.width = ISP_CHN0_WIDTH;//ISP_CHN0_HEIGHT;//1080;//640;//1080; + info.act_size.height = ISP_CHN0_HEIGHT;//ISP_CHN0_WIDTH;//1920;//480;//1920; + info.format = PIXEL_FORMAT_YVU_PLANAR_420; + info.func = 0;//K_ROTATION_180;////K_ROTATION_90; + info.global_alptha = 0xff; + info.offset.x = 0;//(1080-w)/2, + info.offset.y = 0;//(1920-h)/2; + vo_creat_layer_test(chn_id, &info); + + if(vicap_install_osd == 1) + sample_vicap_install_osd(); + + //exit ; + return 0; +} + +static void sample_vicap_bind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) +{ + k_s32 ret; + + ret = kd_mpi_sys_bind(&vicap_mpp_chn, &vo_mpp_chn); + if (ret) { + printf("kd_mpi_sys_unbind failed:0x%x\n", ret); + } + + return; +} + +static void sample_vicap_unbind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) +{ + k_s32 ret; + + ret = kd_mpi_sys_unbind(&vicap_mpp_chn, &vo_mpp_chn); + if (ret) { + printf("kd_mpi_sys_unbind failed:0x%x\n", ret); + } + + return; +} + +int vivcap_start() +{ + k_s32 ret = 0; + + k_u32 pool_id; + k_vb_pool_config pool_config; + + printf("sample_vicap ...\n"); + +#if defined(CONFIG_BOARD_K230_CANMV) + sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; +#else + sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; +#endif + vicap_dev = VICAP_DEV_ID_0; + + memset(&config, 0, sizeof(config)); + config.max_pool_cnt = 64; + //VB for YUV420SP output + config.comm_pool[0].blk_cnt = 5; + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[0].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), VICAP_ALIGN_1K); + + //VB for RGB888 output + config.comm_pool[1].blk_cnt = 5; + config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[1].blk_size = VICAP_ALIGN_UP((SENSOR_HEIGHT * SENSOR_WIDTH * 3 ), VICAP_ALIGN_1K); + + ret = kd_mpi_vb_set_config(&config); + if (ret) { + printf("vb_set_config failed ret:%d\n", ret); + return ret; + } + + k_vb_supplement_config supplement_config; + memset(&supplement_config, 0, sizeof(supplement_config)); + supplement_config.supplement_config |= VB_SUPPLEMENT_JPEG_MASK; + + ret = kd_mpi_vb_set_supplement_config(&supplement_config); + if (ret) { + printf("vb_set_supplement_config failed ret:%d\n", ret); + return ret; + } + + ret = kd_mpi_vb_init(); + if (ret) { + printf("vb_init failed ret:%d\n", ret); + return ret; + } + printf("sample_vicap ...kd_mpi_vicap_get_sensor_info\n"); + + // dwc_dsi_init(); + vo_layer_vdss_bind_vo_config(); + + if(vicap_install_osd == 1) + { + memset(&pool_config, 0, sizeof(pool_config)); + pool_config.blk_size = VICAP_ALIGN_UP((osd_width * osd_height * 4 * 2), VICAP_ALIGN_1K); + pool_config.blk_cnt = 4; + pool_config.mode = VB_REMAP_MODE_NOCACHE; + pool_id = kd_mpi_vb_create_pool(&pool_config); // osd0 - 3 argb 320 x 240 + g_pool_id = pool_id; + + printf("--------aa--------------g_pool_id is %d pool_id is %d \n",g_pool_id, pool_id); + } + + memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); + ret = kd_mpi_vicap_get_sensor_info(sensor_type, &sensor_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + + memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); + dev_attr.acq_win.h_start = 0; + dev_attr.acq_win.v_start = 0; +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + dev_attr.acq_win.width = ISP_CHN0_WIDTH; + dev_attr.acq_win.height = ISP_CHN0_HEIGHT; +#else + dev_attr.acq_win.width = 2592;//SENSOR_HEIGHT; + dev_attr.acq_win.height = 1944;//SENSOR_WIDTH; +#endif + dev_attr.mode = VICAP_WORK_ONLINE_MODE; + + dev_attr.pipe_ctrl.data = 0xFFFFFFFF; + dev_attr.pipe_ctrl.bits.af_enable = 0; + dev_attr.pipe_ctrl.bits.ahdr_enable = 0; + + + dev_attr.cpature_frame = 0; + memcpy(&dev_attr.sensor_info, &sensor_info, sizeof(k_vicap_sensor_info)); + + ret = kd_mpi_vicap_set_dev_attr(vicap_dev, dev_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_dev_attr failed.\n"); + return ret; + } + + memset(&chn_attr, 0, sizeof(k_vicap_chn_attr)); + + //set chn0 output yuv420sp + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = ISP_CHN0_WIDTH; + chn_attr.out_win.height = ISP_CHN0_HEIGHT; + + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + chn_attr.crop_win = dev_attr.acq_win; +#else + // chn_attr.crop_win = dev_attr.acq_win; + chn_attr.crop_win.h_start = 768; + chn_attr.crop_win.v_start = 16; + chn_attr.crop_win.width = ISP_CHN0_WIDTH; + chn_attr.crop_win.height = ISP_CHN0_HEIGHT; +#endif + + chn_attr.scale_win = chn_attr.out_win; + chn_attr.crop_enable = K_FALSE; + chn_attr.scale_enable = K_FALSE; + // chn_attr.dw_enable = K_FALSE; + chn_attr.chn_enable = K_TRUE; + chn_attr.pix_format = PIXEL_FORMAT_YVU_PLANAR_420; + chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp + chn_attr.buffer_size = config.comm_pool[0].blk_size; + vicap_chn = VICAP_CHN_ID_0; + + printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); + ret = kd_mpi_vicap_set_chn_attr(vicap_dev, vicap_chn, chn_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); + return ret; + } + + //bind vicap chn 0 to vo + vicap_mpp_chn.mod_id = K_ID_VI; + vicap_mpp_chn.dev_id = vicap_dev; + vicap_mpp_chn.chn_id = vicap_chn; + + vo_mpp_chn.mod_id = K_ID_VO; + vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; + vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; + + sample_vicap_bind_vo(vicap_mpp_chn, vo_mpp_chn); + printf("sample_vicap ...dwc_dsi_init\n"); + + //set chn1 output rgb888p + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = SENSOR_WIDTH ; + chn_attr.out_win.height = SENSOR_HEIGHT; + // chn_attr.crop_win = dev_attr.acq_win; + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + chn_attr.crop_win = dev_attr.acq_win; +#else + chn_attr.crop_win.h_start = 768; + chn_attr.crop_win.v_start = 16; + chn_attr.crop_win.width = ISP_CHN0_WIDTH; + chn_attr.crop_win.height = ISP_CHN0_HEIGHT; +#endif + + chn_attr.scale_win = chn_attr.out_win; + chn_attr.crop_enable = K_FALSE; + chn_attr.scale_enable = K_FALSE; + // chn_attr.dw_enable = K_FALSE; + chn_attr.chn_enable = K_TRUE; + chn_attr.pix_format = PIXEL_FORMAT_BGR_888_PLANAR; + chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp + chn_attr.buffer_size = config.comm_pool[1].blk_size; + + printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); + ret = kd_mpi_vicap_set_chn_attr(vicap_dev, VICAP_CHN_ID_1, chn_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); + return ret; + } + + printf("sample_vicap ...kd_mpi_vicap_init\n"); + ret = kd_mpi_vicap_init(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + // goto err_exit; + } + + printf("sample_vicap ...kd_mpi_vicap_start_stream\n"); + ret = kd_mpi_vicap_start_stream(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + // goto err_exit; + } + + return ret; +} + +int vivcap_stop() +{ + printf("sample_vicap ...kd_mpi_vicap_stop_stream\n"); + int ret = kd_mpi_vicap_stop_stream(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + return ret; + } + + ret = kd_mpi_vicap_deinit(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_deinit failed.\n"); + return ret; + } + + kd_mpi_vo_disable_video_layer(K_VO_LAYER1); + + vicap_mpp_chn.mod_id = K_ID_VI; + vicap_mpp_chn.dev_id = vicap_dev; + vicap_mpp_chn.chn_id = vicap_chn; + + vo_mpp_chn.mod_id = K_ID_VO; + vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; + vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; + + sample_vicap_unbind_vo(vicap_mpp_chn, vo_mpp_chn); + + /*Allow one frame time for the VO to release the VB block*/ + k_u32 display_ms = 1000 / 33; + usleep(1000 * display_ms); + + ret = kd_mpi_vb_exit(); + if (ret) { + printf("sample_vicap, kd_mpi_vb_exit failed.\n"); + return ret; + } + + return 0; +} + +void yuv_rotate_90(char *des, char *src,int width,int height) +{ + int n = 0; + int hw = width>>1; + int hh = height>>1; + int size = width * height; + int hsize = size>>2; + + int pos = 0; + + for(int i = width-1;i >= 0;i--) + { + pos = 0; + for(int j= 0;j < height;j++) + { + des[n++]= src[pos+i]; + pos += width; + } + } + } \ No newline at end of file diff --git a/src/reference/ai_poc/yolop_lane_seg/vi_vo.h b/src/reference/ai_poc/yolop_lane_seg/vi_vo.h old mode 100755 new mode 100644 index e3d8bdba4..0a11a4d31 --- a/src/reference/ai_poc/yolop_lane_seg/vi_vo.h +++ b/src/reference/ai_poc/yolop_lane_seg/vi_vo.h @@ -1,627 +1,628 @@ -/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include -#include -#include - -#include "mpi_sys_api.h" - -/* vicap */ -#include -#include -#include -#include -#include - -#include "k_module.h" -#include "k_type.h" -#include "k_vb_comm.h" -#include "k_video_comm.h" -#include "k_sys_comm.h" -#include "mpi_vb_api.h" -#include "mpi_vicap_api.h" -#include "mpi_isp_api.h" -#include "mpi_sys_api.h" -#include "k_vo_comm.h" -#include "mpi_vo_api.h" - -#include "vo_test_case.h" - -#include "k_connector_comm.h" -#include "mpi_connector_api.h" -#include "k_autoconf_comm.h" - - -#if defined(CONFIG_BOARD_K230_CANMV) -#define SENSOR_CHANNEL (3) // isp通道数 -#define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 -#define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 -#define ISP_CHN0_WIDTH (1920)//(1920) -#define ISP_CHN0_HEIGHT (1080)//(1080) -#define vicap_install_osd (1) -#define osd_id K_VO_OSD3 -#define osd_width (1920) -#define osd_height (1080) -#else -#define SENSOR_CHANNEL (3) // isp通道数 -#define SENSOR_HEIGHT (1280) // isp高度,ai输入,竖屏 -#define SENSOR_WIDTH (720) // isp宽度,ai输入,竖屏 -#define ISP_CHN0_WIDTH (1088)//(1920) -#define ISP_CHN0_HEIGHT (1920)//(1080) -#define vicap_install_osd (1) -#define osd_id K_VO_OSD3 -#define osd_width (1080) -#define osd_height (1920) -#endif - - -k_vb_config config; -k_vicap_dev vicap_dev; -k_vicap_chn vicap_chn; -k_vicap_dev_attr dev_attr; -k_vicap_chn_attr chn_attr; -k_vicap_sensor_info sensor_info; -k_vicap_sensor_type sensor_type; -k_mpp_chn vicap_mpp_chn; -k_mpp_chn vo_mpp_chn; - -k_video_frame_info dump_info; - -k_vo_draw_frame vo_frame = (k_vo_draw_frame) { - 1, - 16, - 16, - 128, - 128, - 1 -}; - -static k_vb_blk_handle block; -k_u32 g_pool_id; - -int vo_creat_layer_test(k_vo_layer chn_id, layer_info *info) -{ - k_vo_video_layer_attr attr; - - // check layer - if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) - || ((info->func != 0) && (chn_id == K_VO_LAYER2))) - { - printf("input layer num failed \n"); - return -1 ; - } - - // check scaler - - // set offset - attr.display_rect = info->offset; - // set act - attr.img_size = info->act_size; - // sget size - info->size = info->act_size.height * info->act_size.width * 3 / 2; - //set pixel format - attr.pixel_format = info->format; - if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) - { - printf("input pix format failed \n"); - return -1; - } - // set stride - attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); - // set function - attr.func = info->func; - // set scaler attr - attr.scaler_attr = info->attr; - - // set video layer atrr - kd_mpi_vo_set_video_layer_attr(chn_id, &attr); - - // enable layer - kd_mpi_vo_enable_video_layer(chn_id); - - return 0; -} - -k_vb_blk_handle vo_insert_frame(k_video_frame_info *vf_info, void **pic_vaddr) -{ - k_u64 phys_addr = 0; - k_u32 *virt_addr; - k_vb_blk_handle handle; - k_s32 size; - - if (vf_info == NULL) - return K_FALSE; - - if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_8888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_8888) - size = vf_info->v_frame.height * vf_info->v_frame.width * 4; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_565 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_565) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_4444 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_4444) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_888) - size = vf_info->v_frame.height * vf_info->v_frame.width * 3; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_1555 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_1555) - size = vf_info->v_frame.height * vf_info->v_frame.width * 2; - else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) - size = vf_info->v_frame.height * vf_info->v_frame.width * 3 / 2; - - size = size + 4096; // 强制4K ,后边得删了 - - printf("vb block size is %x \n", size); - - handle = kd_mpi_vb_get_block(g_pool_id, size, NULL); - if (handle == VB_INVALID_HANDLE) - { - printf("%s get vb block error\n", __func__); - return K_FAILED; - } - - phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); - if (phys_addr == 0) - { - printf("%s get phys addr error\n", __func__); - return K_FAILED; - } - - virt_addr = (k_u32 *)kd_mpi_sys_mmap(phys_addr, size); - // virt_addr = (k_u32 *)kd_mpi_sys_mmap_cached(phys_addr, size); - - if (virt_addr == NULL) - { - printf("%s mmap error\n", __func__); - return K_FAILED; - } - - vf_info->mod_id = K_ID_VO; - vf_info->pool_id = g_pool_id; - vf_info->v_frame.phys_addr[0] = phys_addr; - if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) - vf_info->v_frame.phys_addr[1] = phys_addr + (vf_info->v_frame.height * vf_info->v_frame.stride[0]); - *pic_vaddr = virt_addr; - - printf("phys_addr is %lx g_pool_id is %d \n", phys_addr, g_pool_id); - - return handle; -} - -k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) -{ - k_vo_video_osd_attr attr; - - // set attr - attr.global_alptha = info->global_alptha; - - if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) - { - info->size = info->act_size.width * info->act_size.height * 4; - info->stride = info->act_size.width * 4 / 8; - } - else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) - { - info->size = info->act_size.width * info->act_size.height * 3; - info->stride = info->act_size.width * 3 / 8; - } - else if(info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else if(info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) - { - info->size = info->act_size.width * info->act_size.height * 2; - info->stride = info->act_size.width * 2 / 8; - } - else - { - printf("set osd pixel format failed \n"); - } - - attr.stride = info->stride; - attr.pixel_format = info->format; - attr.display_rect = info->offset; - attr.img_size = info->act_size; - kd_mpi_vo_set_video_osd_attr(osd, &attr); - - kd_mpi_vo_osd_enable(osd); - - return 0; -} - -void sample_vicap_install_osd(void) -{ - osd_info osd; - - osd.act_size.width = osd_width ; - osd.act_size.height = osd_height; - osd.offset.x = 0; - osd.offset.y = 0; - osd.global_alptha = 0xff; - // osd.global_alptha = 0x32; - osd.format = PIXEL_FORMAT_ARGB_8888;//PIXEL_FORMAT_ARGB_4444; //PIXEL_FORMAT_ARGB_1555;//PIXEL_FORMAT_ARGB_8888; - - vo_creat_osd_test(osd_id, &osd); -} - -void vo_osd_release_block(void) -{ - if(vicap_install_osd == 1) - { - kd_mpi_vo_osd_disable(osd_id); - kd_mpi_vb_release_block(block); - } - -} - -static k_s32 sample_connector_init(void) -{ - k_u32 ret = 0; - k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) - k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; -#else - k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; -#endif - k_connector_info connector_info; - - memset(&connector_info, 0, sizeof(k_connector_info)); - - //connector get sensor info - ret = kd_mpi_get_connector_info(connector_type, &connector_info); - if (ret) { - printf("sample_vicap, the sensor type not supported!\n"); - return ret; - } - - connector_fd = kd_mpi_connector_open(connector_info.connector_name); - if (connector_fd < 0) { - printf("%s, connector open failed.\n", __func__); - return K_ERR_VO_NOTREADY; - } - - // set connect power - kd_mpi_connector_power_set(connector_fd, K_TRUE); - // connector init - kd_mpi_connector_init(connector_fd, connector_info); - - return 0; -} - -static k_s32 vo_layer_vdss_bind_vo_config(void) -{ - layer_info info; - - k_vo_layer chn_id = K_VO_LAYER1; - - memset(&info, 0, sizeof(info)); - - sample_connector_init(); - - // config lyaer - info.act_size.width = ISP_CHN0_WIDTH;//ISP_CHN0_HEIGHT;//1080;//640;//1080; - info.act_size.height = ISP_CHN0_HEIGHT;//ISP_CHN0_WIDTH;//1920;//480;//1920; - info.format = PIXEL_FORMAT_YVU_PLANAR_420; - info.func = 0;//K_ROTATION_180;////K_ROTATION_90; - info.global_alptha = 0xff; - info.offset.x = 0;//(1080-w)/2, - info.offset.y = 0;//(1920-h)/2; - vo_creat_layer_test(chn_id, &info); - - if(vicap_install_osd == 1) - sample_vicap_install_osd(); - - //exit ; - return 0; -} - -static void sample_vicap_bind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) -{ - k_s32 ret; - - ret = kd_mpi_sys_bind(&vicap_mpp_chn, &vo_mpp_chn); - if (ret) { - printf("kd_mpi_sys_unbind failed:0x%x\n", ret); - } - - return; -} - -static void sample_vicap_unbind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) -{ - k_s32 ret; - - ret = kd_mpi_sys_unbind(&vicap_mpp_chn, &vo_mpp_chn); - if (ret) { - printf("kd_mpi_sys_unbind failed:0x%x\n", ret); - } - - return; -} - -int vivcap_start() -{ - k_s32 ret = 0; - - k_u32 pool_id; - k_vb_pool_config pool_config; - - printf("sample_vicap ...\n"); - -#if defined(CONFIG_BOARD_K230_CANMV) - sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); -#else - sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; -#endif - vicap_dev = VICAP_DEV_ID_0; - - memset(&config, 0, sizeof(config)); - config.max_pool_cnt = 64; - //VB for YUV420SP output - config.comm_pool[0].blk_cnt = 5; - config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; - config.comm_pool[0].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), VICAP_ALIGN_1K); - - //VB for RGB888 output - config.comm_pool[1].blk_cnt = 5; - config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; - config.comm_pool[1].blk_size = VICAP_ALIGN_UP((SENSOR_HEIGHT * SENSOR_WIDTH * 3 ), VICAP_ALIGN_1K); - - ret = kd_mpi_vb_set_config(&config); - if (ret) { - printf("vb_set_config failed ret:%d\n", ret); - return ret; - } - - k_vb_supplement_config supplement_config; - memset(&supplement_config, 0, sizeof(supplement_config)); - supplement_config.supplement_config |= VB_SUPPLEMENT_JPEG_MASK; - - ret = kd_mpi_vb_set_supplement_config(&supplement_config); - if (ret) { - printf("vb_set_supplement_config failed ret:%d\n", ret); - return ret; - } - - ret = kd_mpi_vb_init(); - if (ret) { - printf("vb_init failed ret:%d\n", ret); - return ret; - } - printf("sample_vicap ...kd_mpi_vicap_get_sensor_info\n"); - - // dwc_dsi_init(); - vo_layer_vdss_bind_vo_config(); - - if(vicap_install_osd == 1) - { - memset(&pool_config, 0, sizeof(pool_config)); - pool_config.blk_size = VICAP_ALIGN_UP((osd_width * osd_height * 4 * 2), VICAP_ALIGN_1K); - pool_config.blk_cnt = 4; - pool_config.mode = VB_REMAP_MODE_NOCACHE; - pool_id = kd_mpi_vb_create_pool(&pool_config); // osd0 - 3 argb 320 x 240 - g_pool_id = pool_id; - - printf("--------aa--------------g_pool_id is %d pool_id is %d \n",g_pool_id, pool_id); - } - - memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); - ret = kd_mpi_vicap_get_sensor_info(sensor_type, &sensor_info); - if (ret) { - printf("sample_vicap, the sensor type not supported!\n"); - return ret; - } - - memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); - dev_attr.acq_win.h_start = 0; - dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) - dev_attr.acq_win.width = ISP_CHN0_WIDTH; - dev_attr.acq_win.height = ISP_CHN0_HEIGHT; -#else - dev_attr.acq_win.width = 2592;//SENSOR_HEIGHT; - dev_attr.acq_win.height = 1944;//SENSOR_WIDTH; -#endif - dev_attr.mode = VICAP_WORK_ONLINE_MODE; - - dev_attr.pipe_ctrl.data = 0xFFFFFFFF; - dev_attr.pipe_ctrl.bits.af_enable = 0; - dev_attr.pipe_ctrl.bits.ahdr_enable = 0; - - - dev_attr.cpature_frame = 0; - memcpy(&dev_attr.sensor_info, &sensor_info, sizeof(k_vicap_sensor_info)); - - ret = kd_mpi_vicap_set_dev_attr(vicap_dev, dev_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_dev_attr failed.\n"); - return ret; - } - - memset(&chn_attr, 0, sizeof(k_vicap_chn_attr)); - - //set chn0 output yuv420sp - chn_attr.out_win.h_start = 0; - chn_attr.out_win.v_start = 0; - chn_attr.out_win.width = ISP_CHN0_WIDTH; - chn_attr.out_win.height = ISP_CHN0_HEIGHT; - - -#if defined(CONFIG_BOARD_K230_CANMV) - chn_attr.crop_win = dev_attr.acq_win; -#else - // chn_attr.crop_win = dev_attr.acq_win; - chn_attr.crop_win.h_start = 768; - chn_attr.crop_win.v_start = 16; - chn_attr.crop_win.width = ISP_CHN0_WIDTH; - chn_attr.crop_win.height = ISP_CHN0_HEIGHT; -#endif - - chn_attr.scale_win = chn_attr.out_win; - chn_attr.crop_enable = K_FALSE; - chn_attr.scale_enable = K_FALSE; - // chn_attr.dw_enable = K_FALSE; - chn_attr.chn_enable = K_TRUE; - chn_attr.pix_format = PIXEL_FORMAT_YVU_PLANAR_420; - chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp - chn_attr.buffer_size = config.comm_pool[0].blk_size; - vicap_chn = VICAP_CHN_ID_0; - - printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); - ret = kd_mpi_vicap_set_chn_attr(vicap_dev, vicap_chn, chn_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); - return ret; - } - - //bind vicap chn 0 to vo - vicap_mpp_chn.mod_id = K_ID_VI; - vicap_mpp_chn.dev_id = vicap_dev; - vicap_mpp_chn.chn_id = vicap_chn; - - vo_mpp_chn.mod_id = K_ID_VO; - vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; - vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; - - sample_vicap_bind_vo(vicap_mpp_chn, vo_mpp_chn); - printf("sample_vicap ...dwc_dsi_init\n"); - - //set chn1 output rgb888p - chn_attr.out_win.h_start = 0; - chn_attr.out_win.v_start = 0; - chn_attr.out_win.width = SENSOR_WIDTH ; - chn_attr.out_win.height = SENSOR_HEIGHT; - // chn_attr.crop_win = dev_attr.acq_win; - -#if defined(CONFIG_BOARD_K230_CANMV) - chn_attr.crop_win = dev_attr.acq_win; -#else - chn_attr.crop_win.h_start = 768; - chn_attr.crop_win.v_start = 16; - chn_attr.crop_win.width = ISP_CHN0_WIDTH; - chn_attr.crop_win.height = ISP_CHN0_HEIGHT; -#endif - - chn_attr.scale_win = chn_attr.out_win; - chn_attr.crop_enable = K_FALSE; - chn_attr.scale_enable = K_FALSE; - // chn_attr.dw_enable = K_FALSE; - chn_attr.chn_enable = K_TRUE; - chn_attr.pix_format = PIXEL_FORMAT_BGR_888_PLANAR; - chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp - chn_attr.buffer_size = config.comm_pool[1].blk_size; - - printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); - ret = kd_mpi_vicap_set_chn_attr(vicap_dev, VICAP_CHN_ID_1, chn_attr); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); - return ret; - } - - printf("sample_vicap ...kd_mpi_vicap_init\n"); - ret = kd_mpi_vicap_init(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - // goto err_exit; - } - - printf("sample_vicap ...kd_mpi_vicap_start_stream\n"); - ret = kd_mpi_vicap_start_stream(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - // goto err_exit; - } - - return ret; -} - -int vivcap_stop() -{ - printf("sample_vicap ...kd_mpi_vicap_stop_stream\n"); - int ret = kd_mpi_vicap_stop_stream(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_init failed.\n"); - return ret; - } - - ret = kd_mpi_vicap_deinit(vicap_dev); - if (ret) { - printf("sample_vicap, kd_mpi_vicap_deinit failed.\n"); - return ret; - } - - kd_mpi_vo_disable_video_layer(K_VO_LAYER1); - - vicap_mpp_chn.mod_id = K_ID_VI; - vicap_mpp_chn.dev_id = vicap_dev; - vicap_mpp_chn.chn_id = vicap_chn; - - vo_mpp_chn.mod_id = K_ID_VO; - vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; - vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; - - sample_vicap_unbind_vo(vicap_mpp_chn, vo_mpp_chn); - - /*Allow one frame time for the VO to release the VB block*/ - k_u32 display_ms = 1000 / 33; - usleep(1000 * display_ms); - - ret = kd_mpi_vb_exit(); - if (ret) { - printf("sample_vicap, kd_mpi_vb_exit failed.\n"); - return ret; - } - - return 0; -} - -void yuv_rotate_90(char *des, char *src,int width,int height) -{ - int n = 0; - int hw = width>>1; - int hh = height>>1; - int size = width * height; - int hsize = size>>2; - - int pos = 0; - - for(int i = width-1;i >= 0;i--) - { - pos = 0; - for(int j= 0;j < height;j++) - { - des[n++]= src[pos+i]; - pos += width; - } - } - +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include + +#include "mpi_sys_api.h" + +/* vicap */ +#include +#include +#include +#include +#include + +#include "k_module.h" +#include "k_type.h" +#include "k_vb_comm.h" +#include "k_video_comm.h" +#include "k_sys_comm.h" +#include "mpi_vb_api.h" +#include "mpi_vicap_api.h" +#include "mpi_isp_api.h" +#include "mpi_sys_api.h" +#include "k_vo_comm.h" +#include "mpi_vo_api.h" + +#include "vo_test_case.h" + +#include "k_connector_comm.h" +#include "mpi_connector_api.h" +#include "k_autoconf_comm.h" + + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) +#define SENSOR_CHANNEL (3) // isp通道数 +#define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 +#define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 +#define ISP_CHN0_WIDTH (1920)//(1920) +#define ISP_CHN0_HEIGHT (1080)//(1080) +#define vicap_install_osd (1) +#define osd_id K_VO_OSD3 +#define osd_width (1920) +#define osd_height (1080) +#else +#define SENSOR_CHANNEL (3) // isp通道数 +#define SENSOR_HEIGHT (1280) // isp高度,ai输入,竖屏 +#define SENSOR_WIDTH (720) // isp宽度,ai输入,竖屏 +#define ISP_CHN0_WIDTH (1088)//(1920) +#define ISP_CHN0_HEIGHT (1920)//(1080) +#define vicap_install_osd (1) +#define osd_id K_VO_OSD3 +#define osd_width (1080) +#define osd_height (1920) +#endif + + +k_vb_config config; +k_vicap_dev vicap_dev; +k_vicap_chn vicap_chn; +k_vicap_dev_attr dev_attr; +k_vicap_chn_attr chn_attr; +k_vicap_sensor_info sensor_info; +k_vicap_sensor_type sensor_type; +k_mpp_chn vicap_mpp_chn; +k_mpp_chn vo_mpp_chn; + +k_video_frame_info dump_info; + +k_vo_draw_frame vo_frame = (k_vo_draw_frame) { + 1, + 16, + 16, + 128, + 128, + 1 +}; + +static k_vb_blk_handle block; +k_u32 g_pool_id; + +int vo_creat_layer_test(k_vo_layer chn_id, layer_info *info) +{ + k_vo_video_layer_attr attr; + + // check layer + if ((chn_id >= K_MAX_VO_LAYER_NUM) || ((info->func & K_VO_SCALER_ENABLE) && (chn_id != K_VO_LAYER0)) + || ((info->func != 0) && (chn_id == K_VO_LAYER2))) + { + printf("input layer num failed \n"); + return -1 ; + } + + // check scaler + + // set offset + attr.display_rect = info->offset; + // set act + attr.img_size = info->act_size; + // sget size + info->size = info->act_size.height * info->act_size.width * 3 / 2; + //set pixel format + attr.pixel_format = info->format; + if (info->format != PIXEL_FORMAT_YVU_PLANAR_420) + { + printf("input pix format failed \n"); + return -1; + } + // set stride + attr.stride = (info->act_size.width / 8 - 1) + ((info->act_size.height - 1) << 16); + // set function + attr.func = info->func; + // set scaler attr + attr.scaler_attr = info->attr; + + // set video layer atrr + kd_mpi_vo_set_video_layer_attr(chn_id, &attr); + + // enable layer + kd_mpi_vo_enable_video_layer(chn_id); + + return 0; +} + +k_vb_blk_handle vo_insert_frame(k_video_frame_info *vf_info, void **pic_vaddr) +{ + k_u64 phys_addr = 0; + k_u32 *virt_addr; + k_vb_blk_handle handle; + k_s32 size; + + if (vf_info == NULL) + return K_FALSE; + + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_8888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_8888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 4; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_565 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_565) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_4444 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_4444) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_RGB_888 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_BGR_888) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_ARGB_1555 || vf_info->v_frame.pixel_format == PIXEL_FORMAT_ABGR_1555) + size = vf_info->v_frame.height * vf_info->v_frame.width * 2; + else if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + size = vf_info->v_frame.height * vf_info->v_frame.width * 3 / 2; + + size = size + 4096; // 强制4K ,后边得删了 + + printf("vb block size is %x \n", size); + + handle = kd_mpi_vb_get_block(g_pool_id, size, NULL); + if (handle == VB_INVALID_HANDLE) + { + printf("%s get vb block error\n", __func__); + return K_FAILED; + } + + phys_addr = kd_mpi_vb_handle_to_phyaddr(handle); + if (phys_addr == 0) + { + printf("%s get phys addr error\n", __func__); + return K_FAILED; + } + + virt_addr = (k_u32 *)kd_mpi_sys_mmap(phys_addr, size); + // virt_addr = (k_u32 *)kd_mpi_sys_mmap_cached(phys_addr, size); + + if (virt_addr == NULL) + { + printf("%s mmap error\n", __func__); + return K_FAILED; + } + + vf_info->mod_id = K_ID_VO; + vf_info->pool_id = g_pool_id; + vf_info->v_frame.phys_addr[0] = phys_addr; + if (vf_info->v_frame.pixel_format == PIXEL_FORMAT_YVU_PLANAR_420) + vf_info->v_frame.phys_addr[1] = phys_addr + (vf_info->v_frame.height * vf_info->v_frame.stride[0]); + *pic_vaddr = virt_addr; + + printf("phys_addr is %lx g_pool_id is %d \n", phys_addr, g_pool_id); + + return handle; +} + +k_u32 vo_creat_osd_test(k_vo_osd osd, osd_info *info) +{ + k_vo_video_osd_attr attr; + + // set attr + attr.global_alptha = info->global_alptha; + + if (info->format == PIXEL_FORMAT_ABGR_8888 || info->format == PIXEL_FORMAT_ARGB_8888) + { + info->size = info->act_size.width * info->act_size.height * 4; + info->stride = info->act_size.width * 4 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_565 || info->format == PIXEL_FORMAT_BGR_565) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if (info->format == PIXEL_FORMAT_RGB_888 || info->format == PIXEL_FORMAT_BGR_888) + { + info->size = info->act_size.width * info->act_size.height * 3; + info->stride = info->act_size.width * 3 / 8; + } + else if(info->format == PIXEL_FORMAT_ARGB_4444 || info->format == PIXEL_FORMAT_ABGR_4444) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else if(info->format == PIXEL_FORMAT_ARGB_1555 || info->format == PIXEL_FORMAT_ABGR_1555) + { + info->size = info->act_size.width * info->act_size.height * 2; + info->stride = info->act_size.width * 2 / 8; + } + else + { + printf("set osd pixel format failed \n"); + } + + attr.stride = info->stride; + attr.pixel_format = info->format; + attr.display_rect = info->offset; + attr.img_size = info->act_size; + kd_mpi_vo_set_video_osd_attr(osd, &attr); + + kd_mpi_vo_osd_enable(osd); + + return 0; +} + +void sample_vicap_install_osd(void) +{ + osd_info osd; + + osd.act_size.width = osd_width ; + osd.act_size.height = osd_height; + osd.offset.x = 0; + osd.offset.y = 0; + osd.global_alptha = 0xff; + // osd.global_alptha = 0x32; + osd.format = PIXEL_FORMAT_ARGB_8888;//PIXEL_FORMAT_ARGB_4444; //PIXEL_FORMAT_ARGB_1555;//PIXEL_FORMAT_ARGB_8888; + + vo_creat_osd_test(osd_id, &osd); +} + +void vo_osd_release_block(void) +{ + if(vicap_install_osd == 1) + { + kd_mpi_vo_osd_disable(osd_id); + kd_mpi_vb_release_block(block); + } + +} + +static k_s32 sample_connector_init(void) +{ + k_u32 ret = 0; + k_s32 connector_fd; +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#else + k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; +#endif + k_connector_info connector_info; + + memset(&connector_info, 0, sizeof(k_connector_info)); + + //connector get sensor info + ret = kd_mpi_get_connector_info(connector_type, &connector_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + + connector_fd = kd_mpi_connector_open(connector_info.connector_name); + if (connector_fd < 0) { + printf("%s, connector open failed.\n", __func__); + return K_ERR_VO_NOTREADY; + } + + // set connect power + kd_mpi_connector_power_set(connector_fd, K_TRUE); + // connector init + kd_mpi_connector_init(connector_fd, connector_info); + + return 0; +} + +static k_s32 vo_layer_vdss_bind_vo_config(void) +{ + layer_info info; + + k_vo_layer chn_id = K_VO_LAYER1; + + memset(&info, 0, sizeof(info)); + + sample_connector_init(); + + // config lyaer + info.act_size.width = ISP_CHN0_WIDTH;//ISP_CHN0_HEIGHT;//1080;//640;//1080; + info.act_size.height = ISP_CHN0_HEIGHT;//ISP_CHN0_WIDTH;//1920;//480;//1920; + info.format = PIXEL_FORMAT_YVU_PLANAR_420; + info.func = 0;//K_ROTATION_180;////K_ROTATION_90; + info.global_alptha = 0xff; + info.offset.x = 0;//(1080-w)/2, + info.offset.y = 0;//(1920-h)/2; + vo_creat_layer_test(chn_id, &info); + + if(vicap_install_osd == 1) + sample_vicap_install_osd(); + + //exit ; + return 0; +} + +static void sample_vicap_bind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) +{ + k_s32 ret; + + ret = kd_mpi_sys_bind(&vicap_mpp_chn, &vo_mpp_chn); + if (ret) { + printf("kd_mpi_sys_unbind failed:0x%x\n", ret); + } + + return; +} + +static void sample_vicap_unbind_vo(k_mpp_chn vicap_mpp_chn, k_mpp_chn vo_mpp_chn) +{ + k_s32 ret; + + ret = kd_mpi_sys_unbind(&vicap_mpp_chn, &vo_mpp_chn); + if (ret) { + printf("kd_mpi_sys_unbind failed:0x%x\n", ret); + } + + return; +} + +int vivcap_start() +{ + k_s32 ret = 0; + + k_u32 pool_id; + k_vb_pool_config pool_config; + + printf("sample_vicap ...\n"); + +#if defined(CONFIG_BOARD_K230_CANMV) + sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; +#else + sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; +#endif + vicap_dev = VICAP_DEV_ID_0; + + memset(&config, 0, sizeof(config)); + config.max_pool_cnt = 64; + //VB for YUV420SP output + config.comm_pool[0].blk_cnt = 5; + config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[0].blk_size = VICAP_ALIGN_UP((ISP_CHN0_WIDTH * ISP_CHN0_HEIGHT * 3 / 2), VICAP_ALIGN_1K); + + //VB for RGB888 output + config.comm_pool[1].blk_cnt = 5; + config.comm_pool[1].mode = VB_REMAP_MODE_NOCACHE; + config.comm_pool[1].blk_size = VICAP_ALIGN_UP((SENSOR_HEIGHT * SENSOR_WIDTH * 3 ), VICAP_ALIGN_1K); + + ret = kd_mpi_vb_set_config(&config); + if (ret) { + printf("vb_set_config failed ret:%d\n", ret); + return ret; + } + + k_vb_supplement_config supplement_config; + memset(&supplement_config, 0, sizeof(supplement_config)); + supplement_config.supplement_config |= VB_SUPPLEMENT_JPEG_MASK; + + ret = kd_mpi_vb_set_supplement_config(&supplement_config); + if (ret) { + printf("vb_set_supplement_config failed ret:%d\n", ret); + return ret; + } + + ret = kd_mpi_vb_init(); + if (ret) { + printf("vb_init failed ret:%d\n", ret); + return ret; + } + printf("sample_vicap ...kd_mpi_vicap_get_sensor_info\n"); + + // dwc_dsi_init(); + vo_layer_vdss_bind_vo_config(); + + if(vicap_install_osd == 1) + { + memset(&pool_config, 0, sizeof(pool_config)); + pool_config.blk_size = VICAP_ALIGN_UP((osd_width * osd_height * 4 * 2), VICAP_ALIGN_1K); + pool_config.blk_cnt = 4; + pool_config.mode = VB_REMAP_MODE_NOCACHE; + pool_id = kd_mpi_vb_create_pool(&pool_config); // osd0 - 3 argb 320 x 240 + g_pool_id = pool_id; + + printf("--------aa--------------g_pool_id is %d pool_id is %d \n",g_pool_id, pool_id); + } + + memset(&sensor_info, 0, sizeof(k_vicap_sensor_info)); + ret = kd_mpi_vicap_get_sensor_info(sensor_type, &sensor_info); + if (ret) { + printf("sample_vicap, the sensor type not supported!\n"); + return ret; + } + + memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); + dev_attr.acq_win.h_start = 0; + dev_attr.acq_win.v_start = 0; +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + dev_attr.acq_win.width = ISP_CHN0_WIDTH; + dev_attr.acq_win.height = ISP_CHN0_HEIGHT; +#else + dev_attr.acq_win.width = 2592;//SENSOR_HEIGHT; + dev_attr.acq_win.height = 1944;//SENSOR_WIDTH; +#endif + dev_attr.mode = VICAP_WORK_ONLINE_MODE; + + dev_attr.pipe_ctrl.data = 0xFFFFFFFF; + dev_attr.pipe_ctrl.bits.af_enable = 0; + dev_attr.pipe_ctrl.bits.ahdr_enable = 0; + + + dev_attr.cpature_frame = 0; + memcpy(&dev_attr.sensor_info, &sensor_info, sizeof(k_vicap_sensor_info)); + + ret = kd_mpi_vicap_set_dev_attr(vicap_dev, dev_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_dev_attr failed.\n"); + return ret; + } + + memset(&chn_attr, 0, sizeof(k_vicap_chn_attr)); + + //set chn0 output yuv420sp + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = ISP_CHN0_WIDTH; + chn_attr.out_win.height = ISP_CHN0_HEIGHT; + + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + chn_attr.crop_win = dev_attr.acq_win; +#else + // chn_attr.crop_win = dev_attr.acq_win; + chn_attr.crop_win.h_start = 768; + chn_attr.crop_win.v_start = 16; + chn_attr.crop_win.width = ISP_CHN0_WIDTH; + chn_attr.crop_win.height = ISP_CHN0_HEIGHT; +#endif + + chn_attr.scale_win = chn_attr.out_win; + chn_attr.crop_enable = K_FALSE; + chn_attr.scale_enable = K_FALSE; + // chn_attr.dw_enable = K_FALSE; + chn_attr.chn_enable = K_TRUE; + chn_attr.pix_format = PIXEL_FORMAT_YVU_PLANAR_420; + chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp + chn_attr.buffer_size = config.comm_pool[0].blk_size; + vicap_chn = VICAP_CHN_ID_0; + + printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); + ret = kd_mpi_vicap_set_chn_attr(vicap_dev, vicap_chn, chn_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); + return ret; + } + + //bind vicap chn 0 to vo + vicap_mpp_chn.mod_id = K_ID_VI; + vicap_mpp_chn.dev_id = vicap_dev; + vicap_mpp_chn.chn_id = vicap_chn; + + vo_mpp_chn.mod_id = K_ID_VO; + vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; + vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; + + sample_vicap_bind_vo(vicap_mpp_chn, vo_mpp_chn); + printf("sample_vicap ...dwc_dsi_init\n"); + + //set chn1 output rgb888p + chn_attr.out_win.h_start = 0; + chn_attr.out_win.v_start = 0; + chn_attr.out_win.width = SENSOR_WIDTH ; + chn_attr.out_win.height = SENSOR_HEIGHT; + // chn_attr.crop_win = dev_attr.acq_win; + +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) + chn_attr.crop_win = dev_attr.acq_win; +#else + chn_attr.crop_win.h_start = 768; + chn_attr.crop_win.v_start = 16; + chn_attr.crop_win.width = ISP_CHN0_WIDTH; + chn_attr.crop_win.height = ISP_CHN0_HEIGHT; +#endif + + chn_attr.scale_win = chn_attr.out_win; + chn_attr.crop_enable = K_FALSE; + chn_attr.scale_enable = K_FALSE; + // chn_attr.dw_enable = K_FALSE; + chn_attr.chn_enable = K_TRUE; + chn_attr.pix_format = PIXEL_FORMAT_BGR_888_PLANAR; + chn_attr.buffer_num = VICAP_MAX_FRAME_COUNT;//at least 3 buffers for isp + chn_attr.buffer_size = config.comm_pool[1].blk_size; + + printf("sample_vicap ...kd_mpi_vicap_set_chn_attr, buffer_size[%d]\n", chn_attr.buffer_size); + ret = kd_mpi_vicap_set_chn_attr(vicap_dev, VICAP_CHN_ID_1, chn_attr); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_set_chn_attr failed.\n"); + return ret; + } + + printf("sample_vicap ...kd_mpi_vicap_init\n"); + ret = kd_mpi_vicap_init(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + // goto err_exit; + } + + printf("sample_vicap ...kd_mpi_vicap_start_stream\n"); + ret = kd_mpi_vicap_start_stream(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + // goto err_exit; + } + + return ret; +} + +int vivcap_stop() +{ + printf("sample_vicap ...kd_mpi_vicap_stop_stream\n"); + int ret = kd_mpi_vicap_stop_stream(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_init failed.\n"); + return ret; + } + + ret = kd_mpi_vicap_deinit(vicap_dev); + if (ret) { + printf("sample_vicap, kd_mpi_vicap_deinit failed.\n"); + return ret; + } + + kd_mpi_vo_disable_video_layer(K_VO_LAYER1); + + vicap_mpp_chn.mod_id = K_ID_VI; + vicap_mpp_chn.dev_id = vicap_dev; + vicap_mpp_chn.chn_id = vicap_chn; + + vo_mpp_chn.mod_id = K_ID_VO; + vo_mpp_chn.dev_id = K_VO_DISPLAY_DEV_ID; + vo_mpp_chn.chn_id = K_VO_DISPLAY_CHN_ID1; + + sample_vicap_unbind_vo(vicap_mpp_chn, vo_mpp_chn); + + /*Allow one frame time for the VO to release the VB block*/ + k_u32 display_ms = 1000 / 33; + usleep(1000 * display_ms); + + ret = kd_mpi_vb_exit(); + if (ret) { + printf("sample_vicap, kd_mpi_vb_exit failed.\n"); + return ret; + } + + return 0; +} + +void yuv_rotate_90(char *des, char *src,int width,int height) +{ + int n = 0; + int hw = width>>1; + int hh = height>>1; + int size = width * height; + int hsize = size>>2; + + int pos = 0; + + for(int i = width-1;i >= 0;i--) + { + pos = 0; + for(int j= 0;j < height;j++) + { + des[n++]= src[pos+i]; + pos += width; + } + } + } \ No newline at end of file diff --git a/src/reference/fancy_poc/CMakeLists.txt b/src/reference/fancy_poc/CMakeLists.txt old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/ai_scale/README.md b/src/reference/fancy_poc/ai_scale/README.md old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/ai_scale/resource/frame.jpg b/src/reference/fancy_poc/ai_scale/resource/frame.jpg old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/ai_scale/resource/image.png b/src/reference/fancy_poc/ai_scale/resource/image.png old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/ai_scale/resource/net_config_0.png b/src/reference/fancy_poc/ai_scale/resource/net_config_0.png old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/ai_scale/resource/server.jpg b/src/reference/fancy_poc/ai_scale/resource/server.jpg old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/ai_scale/resource/show.gif b/src/reference/fancy_poc/ai_scale/resource/show.gif old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/ai_scale/resource/state.jpg b/src/reference/fancy_poc/ai_scale/resource/state.jpg old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/ai_scale/src/ai_scale_ai_code/CMakeLists.txt b/src/reference/fancy_poc/ai_scale/src/ai_scale_ai_code/CMakeLists.txt old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/ai_scale/src/ai_scale_ai_code/ai_base.cc b/src/reference/fancy_poc/ai_scale/src/ai_scale_ai_code/ai_base.cc old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/ai_scale/src/ai_scale_ai_code/ai_base.h b/src/reference/fancy_poc/ai_scale/src/ai_scale_ai_code/ai_base.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/ai_scale/src/ai_scale_ai_code/gen_embedding.cc b/src/reference/fancy_poc/ai_scale/src/ai_scale_ai_code/gen_embedding.cc old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/ai_scale/src/ai_scale_ai_code/gen_embedding.h b/src/reference/fancy_poc/ai_scale/src/ai_scale_ai_code/gen_embedding.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/ai_scale/src/ai_scale_ai_code/main.cc b/src/reference/fancy_poc/ai_scale/src/ai_scale_ai_code/main.cc old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/ai_scale/src/ai_scale_ai_code/scoped_timing.hpp b/src/reference/fancy_poc/ai_scale/src/ai_scale_ai_code/scoped_timing.hpp old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/ai_scale/src/ai_scale_ai_code/utils.cc b/src/reference/fancy_poc/ai_scale/src/ai_scale_ai_code/utils.cc old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/ai_scale/src/ai_scale_ai_code/utils.h b/src/reference/fancy_poc/ai_scale/src/ai_scale_ai_code/utils.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/ai_scale/src/ai_scale_ai_code/vi_vo.h b/src/reference/fancy_poc/ai_scale/src/ai_scale_ai_code/vi_vo.h old mode 100644 new mode 100755 index a3b1d8588..15f0bc111 --- a/src/reference/fancy_poc/ai_scale/src/ai_scale_ai_code/vi_vo.h +++ b/src/reference/fancy_poc/ai_scale/src/ai_scale_ai_code/vi_vo.h @@ -57,7 +57,7 @@ #include "k_autoconf_comm.h" -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) #define SENSOR_CHANNEL (3) // isp通道数 #define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 #define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 @@ -286,7 +286,7 @@ static k_s32 sample_connector_init(void) { k_u32 ret = 0; k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; #else k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; @@ -378,7 +378,8 @@ int vivcap_start() #if defined(CONFIG_BOARD_K230_CANMV) sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; #else sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; #endif @@ -444,7 +445,7 @@ int vivcap_start() memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); dev_attr.acq_win.h_start = 0; dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) dev_attr.acq_win.width = ISP_CHN0_WIDTH; dev_attr.acq_win.height = ISP_CHN0_HEIGHT; #else @@ -476,7 +477,7 @@ int vivcap_start() chn_attr.out_win.height = ISP_CHN0_HEIGHT; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else // chn_attr.crop_win = dev_attr.acq_win; @@ -522,7 +523,7 @@ int vivcap_start() chn_attr.out_win.height = SENSOR_HEIGHT; // chn_attr.crop_win = dev_attr.acq_win; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) chn_attr.crop_win = dev_attr.acq_win; #else chn_attr.crop_win.h_start = 768; @@ -624,5 +625,4 @@ void yuv_rotate_90(char *des, char *src,int width,int height) } } -} - +} \ No newline at end of file diff --git a/src/reference/fancy_poc/ai_scale/src/ai_scale_client/client.cc b/src/reference/fancy_poc/ai_scale/src/ai_scale_client/client.cc old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/ai_scale/src/download.sh b/src/reference/fancy_poc/ai_scale/src/download.sh old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/ai_scale/src/utils/ai_scale_isp.sh b/src/reference/fancy_poc/ai_scale/src/utils/ai_scale_isp.sh old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/ai_scale/src/utils/connect.sh b/src/reference/fancy_poc/ai_scale/src/utils/connect.sh old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/build_app.sh b/src/reference/fancy_poc/build_app.sh index 03020bde6..eb38c3d19 100755 --- a/src/reference/fancy_poc/build_app.sh +++ b/src/reference/fancy_poc/build_app.sh @@ -26,6 +26,12 @@ if [ -f out/bin/AIOT_GPT.elf ]; then fi if [ -f out/bin/meta_human.elf ]; then cp out/bin/meta_human.elf ${k230_bin} + + cd ./meta_human/src/http + ./build_app.sh + cd ../../../ + cp meta_human/src/http/out/http ${k230_bin} + rm -rf meta_human/src/http/out fi if [ -f out/bin/ocr_poc.elf ]; then cp out/bin/ocr_poc.elf ${k230_bin} @@ -35,6 +41,12 @@ if [ -f out/bin/housekeeper.elf ]; then fi if [ -f out/bin/meta_hand.elf ]; then cp out/bin/meta_hand.elf ${k230_bin} + + cd ./meta_hand/src/http + ./build_app.sh + cd ../../../ + cp meta_hand/src/http/out/connect ${k230_bin} + rm -rf meta_hand/src/http/out fi if [ -f out/bin/face_registration.elf ]; then cp out/bin/face_registration.elf ${k230_bin} @@ -49,8 +61,6 @@ if [ -f out/bin/face_recognition.elf ]; then fi /opt/toolchain/Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.6.0/bin/riscv64-unknown-linux-gnu-g++ ./multimodal_chat_robot/src/multimodal_chat_robot_client/socket_gpt/main.cc -o ${k230_bin}/socket_gpt_image_audio -/opt/toolchain/Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.6.0/bin/riscv64-unknown-linux-gnu-g++ ./meta_human/src/http/main.cc -o ${k230_bin}/http -/opt/toolchain/Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.6.0/bin/riscv64-unknown-linux-gnu-g++ ./meta_hand/src/http/main.cc -o ${k230_bin}/connect /opt/toolchain/Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.6.0/bin/riscv64-unknown-linux-gnu-g++ ./finger_reader/src/finger_reader_client/finger_reader_comm/main.cc -o ${k230_bin}/Finger_Read_Poc /opt/toolchain/Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.6.0/bin/riscv64-unknown-linux-gnu-g++ ./housekeeper/src/housekeeper_client/housekeeper_comm/main.cc -o ${k230_bin}/Housekeeper /opt/toolchain/Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.6.0/bin/riscv64-unknown-linux-gnu-g++ ./ai_scale/src/ai_scale_client/client.cc -o ${k230_bin}/client diff --git a/src/reference/fancy_poc/cmake/Riscv64.cmake b/src/reference/fancy_poc/cmake/Riscv64.cmake old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/cmake/link.lds b/src/reference/fancy_poc/cmake/link.lds old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/face_recognition/README.md b/src/reference/fancy_poc/face_recognition/README.md old mode 100644 new mode 100755 index 180ebdb58..55aa641c4 --- a/src/reference/fancy_poc/face_recognition/README.md +++ b/src/reference/fancy_poc/face_recognition/README.md @@ -21,7 +21,7 @@ Document version: V1.0 Release date: 2023-12-22 wget https://ai.b-bug.org/k230/downloads/fancy_poc/face_recognition/$file || wget https://kendryte-download.canaan-creative.com/k230/downloads/fancy_poc/face_recognition/$file; done - for file in onboard_v2.8.zip + for file in onboard_v2.8.1.zip do wget https://ai.b-bug.org/k230/downloads/fancy_poc/face_recognition/k230_board/$file || wget https://kendryte-download.canaan-creative.com/k230/downloads/fancy_poc/face_recognition/k230_board/$file; done diff --git a/src/reference/fancy_poc/face_recognition/resource/20240131-101746.jpg b/src/reference/fancy_poc/face_recognition/resource/20240131-101746.jpg old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/face_recognition/resource/image-20231222164651224.png b/src/reference/fancy_poc/face_recognition/resource/image-20231222164651224.png old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/face_recognition/resource/image-20231222164741310.png b/src/reference/fancy_poc/face_recognition/resource/image-20231222164741310.png old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/face_recognition/resource/image.png b/src/reference/fancy_poc/face_recognition/resource/image.png old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/face_recognition/resource/registered_face.jpg b/src/reference/fancy_poc/face_recognition/resource/registered_face.jpg old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/face_recognition/src/download.sh b/src/reference/fancy_poc/face_recognition/src/download.sh index 9287a7808..971d2927f 100755 --- a/src/reference/fancy_poc/face_recognition/src/download.sh +++ b/src/reference/fancy_poc/face_recognition/src/download.sh @@ -3,7 +3,7 @@ do wget https://ai.b-bug.org/k230/downloads/fancy_poc/face_recognition/$file || wget https://kendryte-download.canaan-creative.com/k230/downloads/fancy_poc/face_recognition/$file; done -for file in onboard_v2.8.zip +for file in onboard_v2.8.1.zip do wget https://ai.b-bug.org/k230/downloads/fancy_poc/face_recognition/k230_board/$file || wget https://kendryte-download.canaan-creative.com/k230/downloads/fancy_poc/face_recognition/k230_board/$file; done \ No newline at end of file diff --git a/src/reference/fancy_poc/face_recognition/src/face_recognition/CMakeLists.txt b/src/reference/fancy_poc/face_recognition/src/face_recognition/CMakeLists.txt old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/face_recognition/src/face_recognition/ai_base.cc b/src/reference/fancy_poc/face_recognition/src/face_recognition/ai_base.cc old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/face_recognition/src/face_recognition/ai_base.h b/src/reference/fancy_poc/face_recognition/src/face_recognition/ai_base.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/face_recognition/src/face_recognition/anchors_320.cc b/src/reference/fancy_poc/face_recognition/src/face_recognition/anchors_320.cc old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/face_recognition/src/face_recognition/anchors_640.cc b/src/reference/fancy_poc/face_recognition/src/face_recognition/anchors_640.cc old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/face_recognition/src/face_recognition/face_detection.cc b/src/reference/fancy_poc/face_recognition/src/face_recognition/face_detection.cc old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/face_recognition/src/face_recognition/face_detection.h b/src/reference/fancy_poc/face_recognition/src/face_recognition/face_detection.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/face_recognition/src/face_recognition/face_recognition.cc b/src/reference/fancy_poc/face_recognition/src/face_recognition/face_recognition.cc old mode 100644 new mode 100755 index d2d71dfe9..d905a5fa8 --- a/src/reference/fancy_poc/face_recognition/src/face_recognition/face_recognition.cc +++ b/src/reference/fancy_poc/face_recognition/src/face_recognition/face_recognition.cc @@ -217,7 +217,7 @@ void FaceRecognition::draw_result(cv::Mat &src_img, Bbox &bbox, FaceRecognitionI int w = bbox.w / isp_shape_.width * src_w; int h = bbox.h / isp_shape_.height * src_h; cv::rectangle(src_img, cv::Rect(x, y , w, h), cv::Scalar(255,255, 255, 255), 6, 2, 0); - #if defined(CONFIG_BOARD_K230_CANMV) + #if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) cv::putText(src_img, text, {x, std::max(int(y - 10), 0)}, cv::FONT_HERSHEY_COMPLEX, 1.0, cv::Scalar(255, 255, 0, 255), 1, 8, 0); #else cv::putText(src_img, text, {x, std::max(int(y - 10), 0)}, cv::FONT_HERSHEY_COMPLEX, 2.0, cv::Scalar(255, 255, 0, 255), 2, 8, 0); diff --git a/src/reference/fancy_poc/face_recognition/src/face_recognition/face_recognition.h b/src/reference/fancy_poc/face_recognition/src/face_recognition/face_recognition.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/face_recognition/src/face_recognition/main.cc b/src/reference/fancy_poc/face_recognition/src/face_recognition/main.cc old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/face_recognition/src/face_recognition/scoped_timing.hpp b/src/reference/fancy_poc/face_recognition/src/face_recognition/scoped_timing.hpp old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/face_recognition/src/face_recognition/utils.cc b/src/reference/fancy_poc/face_recognition/src/face_recognition/utils.cc old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/face_recognition/src/face_recognition/utils.h b/src/reference/fancy_poc/face_recognition/src/face_recognition/utils.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/face_recognition/src/face_recognition/vi_vo.h b/src/reference/fancy_poc/face_recognition/src/face_recognition/vi_vo.h old mode 100644 new mode 100755 index f0c1bccc5..15f0bc111 --- a/src/reference/fancy_poc/face_recognition/src/face_recognition/vi_vo.h +++ b/src/reference/fancy_poc/face_recognition/src/face_recognition/vi_vo.h @@ -57,7 +57,7 @@ #include "k_autoconf_comm.h" -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) #define SENSOR_CHANNEL (3) // isp通道数 #define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 #define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 @@ -286,7 +286,7 @@ static k_s32 sample_connector_init(void) { k_u32 ret = 0; k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; #else k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; @@ -378,7 +378,8 @@ int vivcap_start() #if defined(CONFIG_BOARD_K230_CANMV) sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; #else sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; #endif @@ -444,7 +445,7 @@ int vivcap_start() memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); dev_attr.acq_win.h_start = 0; dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) dev_attr.acq_win.width = ISP_CHN0_WIDTH; dev_attr.acq_win.height = ISP_CHN0_HEIGHT; #else @@ -476,7 +477,7 @@ int vivcap_start() chn_attr.out_win.height = ISP_CHN0_HEIGHT; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else // chn_attr.crop_win = dev_attr.acq_win; @@ -522,7 +523,7 @@ int vivcap_start() chn_attr.out_win.height = SENSOR_HEIGHT; // chn_attr.crop_win = dev_attr.acq_win; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) chn_attr.crop_win = dev_attr.acq_win; #else chn_attr.crop_win.h_start = 768; diff --git a/src/reference/fancy_poc/finger_reader/readme.md b/src/reference/fancy_poc/finger_reader/readme.md old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/resource/example_images/1.jpg b/src/reference/fancy_poc/finger_reader/resource/example_images/1.jpg old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/resource/example_images/2.jpg b/src/reference/fancy_poc/finger_reader/resource/example_images/2.jpg old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/resource/example_images/3.png b/src/reference/fancy_poc/finger_reader/resource/example_images/3.png old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/resource/example_images/4.png b/src/reference/fancy_poc/finger_reader/resource/example_images/4.png old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/resource/example_images/canaan-cover.png b/src/reference/fancy_poc/finger_reader/resource/example_images/canaan-cover.png old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/resource/example_images/excute.gif b/src/reference/fancy_poc/finger_reader/resource/example_images/excute.gif old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/resource/example_images/excute_demo.gif b/src/reference/fancy_poc/finger_reader/resource/example_images/excute_demo.gif old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/resource/example_images/finger_reader_resources.jpg b/src/reference/fancy_poc/finger_reader/resource/example_images/finger_reader_resources.jpg old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/download.sh b/src/reference/fancy_poc/finger_reader/src/download.sh old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/CMakeLists.txt b/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/CMakeLists.txt old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/Finger_Read.cc b/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/Finger_Read.cc old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/ai_base.cc b/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/ai_base.cc old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/ai_base.h b/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/ai_base.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/audio_sample.c b/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/audio_sample.c old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/audio_sample.h b/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/audio_sample.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/audio_save_file.c b/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/audio_save_file.c old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/audio_save_file.h b/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/audio_save_file.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/clipper.cpp b/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/clipper.cpp old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/clipper.hpp b/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/clipper.hpp old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/hand_detection.cc b/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/hand_detection.cc old mode 100644 new mode 100755 index c6c30ace7..7d9f7cf86 --- a/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/hand_detection.cc +++ b/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/hand_detection.cc @@ -181,7 +181,7 @@ std::vector HandDetection::decode_infer(float *data, int stride, FrameS box.x2 = std::max(0, std::min(int(frame_size.width), int(cx + w / 2.f))); box.y2 = std::max(0, std::min(int(frame_size.height), int(cy + h / 2.f))); - #if defined(CONFIG_BOARD_K230_CANMV) + #if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) if (abs(box.y1-box.y2)< 0.1*frame_size.height) continue; if ((abs(box.x1-box.x2)< 0.25*frame_size.width) && ((box.x1 < 0.03*frame_size.width) || (box.x2 > 0.97*frame_size.width))) diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/hand_detection.h b/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/hand_detection.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/hand_keypoint.cc b/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/hand_keypoint.cc old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/hand_keypoint.h b/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/hand_keypoint.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/hungarian.cpp b/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/hungarian.cpp old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/hungarian.h b/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/hungarian.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/my_tracker.cpp b/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/my_tracker.cpp old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/my_tracker.h b/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/my_tracker.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/ocr_box.cc b/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/ocr_box.cc old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/ocr_box.h b/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/ocr_box.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/ocr_reco.cc b/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/ocr_reco.cc old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/ocr_reco.h b/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/ocr_reco.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/pcm_data.c b/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/pcm_data.c old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/pcm_data.h b/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/pcm_data.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/scoped_timing.hpp b/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/scoped_timing.hpp old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/sort.cpp b/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/sort.cpp old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/sort.h b/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/sort.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/utils.cc b/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/utils.cc old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/utils.h b/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/utils.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/vi_vo.h b/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/vi_vo.h old mode 100644 new mode 100755 index e3d8bdba4..94a349c3e --- a/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/vi_vo.h +++ b/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/vi_vo.h @@ -57,7 +57,7 @@ #include "k_autoconf_comm.h" -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) #define SENSOR_CHANNEL (3) // isp通道数 #define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 #define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 @@ -286,7 +286,7 @@ static k_s32 sample_connector_init(void) { k_u32 ret = 0; k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; #else k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; @@ -378,7 +378,8 @@ int vivcap_start() #if defined(CONFIG_BOARD_K230_CANMV) sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; #else sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; #endif @@ -444,7 +445,7 @@ int vivcap_start() memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); dev_attr.acq_win.h_start = 0; dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) dev_attr.acq_win.width = ISP_CHN0_WIDTH; dev_attr.acq_win.height = ISP_CHN0_HEIGHT; #else @@ -476,7 +477,7 @@ int vivcap_start() chn_attr.out_win.height = ISP_CHN0_HEIGHT; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else // chn_attr.crop_win = dev_attr.acq_win; @@ -522,7 +523,7 @@ int vivcap_start() chn_attr.out_win.height = SENSOR_HEIGHT; // chn_attr.crop_win = dev_attr.acq_win; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) chn_attr.crop_win = dev_attr.acq_win; #else chn_attr.crop_win.h_start = 768; diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/wav_ctrl.c b/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/wav_ctrl.c old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/wav_ctrl.h b/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_ai/wav_ctrl.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_comm/main.cc b/src/reference/fancy_poc/finger_reader/src/finger_reader_client/finger_reader_comm/main.cc old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/.gitignore b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/.gitignore old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/app.py b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/app.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/bot/bot.py b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/bot/bot.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/bot/bot_factory.py b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/bot/bot_factory.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/bot/chatgpt/chat_gpt_bot_stream.py b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/bot/chatgpt/chat_gpt_bot_stream.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/bridge/bridge.py b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/bridge/bridge.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/channel/Client_Server/Client_Server_POC.py b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/channel/Client_Server/Client_Server_POC.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/channel/__init__.py b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/channel/__init__.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/channel/channel.py b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/channel/channel.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/channel/channel_factory.py b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/channel/channel_factory.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/codec.py b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/codec.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/common/const.py b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/common/const.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/common/expired_dict.py b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/common/expired_dict.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/common/log.py b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/common/log.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/common/trans_channels.py b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/common/trans_channels.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/config.json b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/config.json old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/config.py b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/config.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/demo_parse_task.json b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/demo_parse_task.json old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/ocr.txt b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/ocr.txt old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/prompt.txt b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/prompt.txt old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/requirements.txt b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/requirements.txt old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/Baidu_Text_transAPI.py b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/Baidu_Text_transAPI.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/ONNXVITS_infer.py b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/ONNXVITS_infer.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/ONNXVITS_utils.py b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/ONNXVITS_utils.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/__init__.py b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/__init__.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/attentions.py b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/attentions.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/commons.py b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/commons.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/configs/japanese/uma87.json b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/configs/japanese/uma87.json old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/detect_lang.py b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/detect_lang.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/models.py b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/models.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/models_infer.py b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/models_infer.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/modules.py b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/modules.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/monotonic_align/__init__.py b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/monotonic_align/__init__.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/monotonic_align/core.py b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/monotonic_align/core.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/output_wav/en_mono.wav b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/output_wav/en_mono.wav old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/output_wav/en_stereo.wav b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/output_wav/en_stereo.wav old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/output_wav/jp_mono.wav b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/output_wav/jp_mono.wav old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/output_wav/jp_stereo.wav b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/output_wav/jp_stereo.wav old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/output_wav/zh.wav b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/output_wav/zh.wav old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/output_wav/zh_mono.wav b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/output_wav/zh_mono.wav old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/output_wav/zh_stereo.wav b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/output_wav/zh_stereo.wav old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/requirements.txt b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/requirements.txt old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/text/LICENSE b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/text/LICENSE old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/text/__init__.py b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/text/__init__.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/text/cantonese.py b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/text/cantonese.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/text/cleaners.py b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/text/cleaners.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/text/english.py b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/text/english.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/text/japanese.py b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/text/japanese.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/text/korean.py b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/text/korean.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/text/mandarin.py b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/text/mandarin.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/text/ngu_dialect.py b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/text/ngu_dialect.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/text/sanskrit.py b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/text/sanskrit.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/text/shanghainese.py b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/text/shanghainese.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/text/symbols.py b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/text/symbols.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/text/thai.py b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/text/thai.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/transforms.py b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/transforms.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/tts.py b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/tts.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/tts_chinese_and_english.py b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/tts_chinese_and_english.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/tts_japanese.py b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/tts_japanese.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/utils.py b/src/reference/fancy_poc/finger_reader/src/finger_reader_server/text_to_speech/utils.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/finger_reader/src/utils/run.sh b/src/reference/fancy_poc/finger_reader/src/utils/run.sh old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/readme.md b/src/reference/fancy_poc/housekeeper/readme.md old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/resource/img.png b/src/reference/fancy_poc/housekeeper/resource/img.png old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/resource/img2.png b/src/reference/fancy_poc/housekeeper/resource/img2.png old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/download.sh b/src/reference/fancy_poc/housekeeper/src/download.sh old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/face_registration/CMakeLists.txt b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/face_registration/CMakeLists.txt old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/face_registration/main.cc b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/face_registration/main.cc old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/BYTETracker.cc b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/BYTETracker.cc old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/BYTETracker.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/BYTETracker.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/CMakeLists.txt b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/CMakeLists.txt old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/CMakeLists_raw.txt b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/CMakeLists_raw.txt old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/STrack.cc b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/STrack.cc old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/STrack.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/STrack.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/ai_base.cc b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/ai_base.cc old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/ai_base.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/ai_base.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/anchors_320.cc b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/anchors_320.cc old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/anchors_640.cc b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/anchors_640.cc old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/dataType.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/dataType.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/Cholesky b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/Cholesky old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/CholmodSupport b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/CholmodSupport old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/Core b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/Core old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/Dense b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/Dense old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/Eigen b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/Eigen old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/Eigenvalues b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/Eigenvalues old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/Geometry b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/Geometry old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/Householder b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/Householder old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/IterativeLinearSolvers b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/IterativeLinearSolvers old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/Jacobi b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/Jacobi old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/LU b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/LU old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/MetisSupport b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/MetisSupport old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/OrderingMethods b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/OrderingMethods old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/PaStiXSupport b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/PaStiXSupport old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/PardisoSupport b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/PardisoSupport old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/QR b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/QR old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/QtAlignedMalloc b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/QtAlignedMalloc old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/SPQRSupport b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/SPQRSupport old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/SVD b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/SVD old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/Sparse b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/Sparse old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/SparseCholesky b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/SparseCholesky old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/SparseCore b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/SparseCore old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/SparseLU b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/SparseLU old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/SparseQR b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/SparseQR old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/StdDeque b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/StdDeque old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/StdList b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/StdList old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/StdVector b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/StdVector old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/SuperLUSupport b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/SuperLUSupport old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/UmfPackSupport b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/UmfPackSupport old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Cholesky/LDLT.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Cholesky/LDLT.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Cholesky/LLT.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Cholesky/LLT.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Cholesky/LLT_LAPACKE.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Cholesky/LLT_LAPACKE.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/CholmodSupport/CholmodSupport.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/CholmodSupport/CholmodSupport.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/Array.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/Array.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/ArrayBase.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/ArrayBase.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/ArrayWrapper.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/ArrayWrapper.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/Assign.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/Assign.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/AssignEvaluator.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/AssignEvaluator.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/Assign_MKL.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/Assign_MKL.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/BandMatrix.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/BandMatrix.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/Block.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/Block.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/BooleanRedux.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/BooleanRedux.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/CommaInitializer.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/CommaInitializer.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/ConditionEstimator.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/ConditionEstimator.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/CoreEvaluators.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/CoreEvaluators.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/CoreIterators.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/CoreIterators.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/CwiseBinaryOp.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/CwiseBinaryOp.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/CwiseNullaryOp.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/CwiseNullaryOp.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/CwiseTernaryOp.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/CwiseTernaryOp.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/CwiseUnaryOp.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/CwiseUnaryOp.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/CwiseUnaryView.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/CwiseUnaryView.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/DenseBase.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/DenseBase.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/DenseCoeffsBase.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/DenseCoeffsBase.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/DenseStorage.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/DenseStorage.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/Diagonal.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/Diagonal.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/DiagonalMatrix.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/DiagonalMatrix.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/DiagonalProduct.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/DiagonalProduct.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/Dot.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/Dot.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/EigenBase.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/EigenBase.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/ForceAlignedAccess.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/ForceAlignedAccess.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/Fuzzy.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/Fuzzy.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/GeneralProduct.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/GeneralProduct.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/GenericPacketMath.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/GenericPacketMath.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/GlobalFunctions.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/GlobalFunctions.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/IO.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/IO.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/Inverse.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/Inverse.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/Map.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/Map.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/MapBase.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/MapBase.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/MathFunctions.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/MathFunctions.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/MathFunctionsImpl.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/MathFunctionsImpl.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/Matrix.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/Matrix.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/MatrixBase.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/MatrixBase.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/NestByValue.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/NestByValue.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/NoAlias.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/NoAlias.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/NumTraits.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/NumTraits.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/PermutationMatrix.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/PermutationMatrix.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/PlainObjectBase.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/PlainObjectBase.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/Product.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/Product.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/ProductEvaluators.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/ProductEvaluators.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/Random.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/Random.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/Redux.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/Redux.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/Ref.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/Ref.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/Replicate.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/Replicate.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/ReturnByValue.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/ReturnByValue.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/Reverse.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/Reverse.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/Select.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/Select.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/SelfAdjointView.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/SelfAdjointView.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/SelfCwiseBinaryOp.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/SelfCwiseBinaryOp.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/Solve.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/Solve.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/SolveTriangular.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/SolveTriangular.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/SolverBase.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/SolverBase.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/StableNorm.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/StableNorm.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/Stride.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/Stride.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/Swap.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/Swap.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/Transpose.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/Transpose.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/Transpositions.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/Transpositions.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/TriangularMatrix.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/TriangularMatrix.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/VectorBlock.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/VectorBlock.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/VectorwiseOp.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/VectorwiseOp.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/Visitor.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/Visitor.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/AVX/Complex.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/AVX/Complex.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/AVX/MathFunctions.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/AVX/MathFunctions.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/AVX/PacketMath.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/AVX/PacketMath.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/AVX/TypeCasting.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/AVX/TypeCasting.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/AVX512/MathFunctions.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/AVX512/MathFunctions.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/AVX512/PacketMath.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/AVX512/PacketMath.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/AltiVec/Complex.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/AltiVec/Complex.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/AltiVec/MathFunctions.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/AltiVec/MathFunctions.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/AltiVec/PacketMath.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/AltiVec/PacketMath.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/CUDA/Complex.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/CUDA/Complex.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/CUDA/Half.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/CUDA/Half.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/CUDA/MathFunctions.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/CUDA/MathFunctions.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/CUDA/PacketMath.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/CUDA/PacketMath.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/CUDA/PacketMathHalf.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/CUDA/PacketMathHalf.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/CUDA/TypeCasting.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/CUDA/TypeCasting.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/Default/ConjHelper.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/Default/ConjHelper.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/Default/Settings.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/Default/Settings.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/NEON/Complex.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/NEON/Complex.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/NEON/MathFunctions.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/NEON/MathFunctions.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/NEON/PacketMath.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/NEON/PacketMath.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/SSE/Complex.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/SSE/Complex.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/SSE/MathFunctions.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/SSE/MathFunctions.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/SSE/PacketMath.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/SSE/PacketMath.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/SSE/TypeCasting.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/SSE/TypeCasting.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/ZVector/Complex.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/ZVector/Complex.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/ZVector/MathFunctions.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/ZVector/MathFunctions.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/ZVector/PacketMath.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/arch/ZVector/PacketMath.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/functors/AssignmentFunctors.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/functors/AssignmentFunctors.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/functors/BinaryFunctors.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/functors/BinaryFunctors.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/functors/NullaryFunctors.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/functors/NullaryFunctors.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/functors/StlFunctors.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/functors/StlFunctors.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/functors/TernaryFunctors.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/functors/TernaryFunctors.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/functors/UnaryFunctors.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/functors/UnaryFunctors.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/products/GeneralBlockPanelKernel.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/products/GeneralBlockPanelKernel.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/products/GeneralMatrixMatrix.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/products/GeneralMatrixMatrix.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_BLAS.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_BLAS.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/products/GeneralMatrixMatrix_BLAS.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/products/GeneralMatrixMatrix_BLAS.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/products/GeneralMatrixVector.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/products/GeneralMatrixVector.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/products/GeneralMatrixVector_BLAS.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/products/GeneralMatrixVector_BLAS.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/products/Parallelizer.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/products/Parallelizer.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/products/SelfadjointMatrixMatrix.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/products/SelfadjointMatrixMatrix.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/products/SelfadjointMatrixMatrix_BLAS.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/products/SelfadjointMatrixMatrix_BLAS.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/products/SelfadjointMatrixVector.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/products/SelfadjointMatrixVector.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/products/SelfadjointMatrixVector_BLAS.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/products/SelfadjointMatrixVector_BLAS.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/products/SelfadjointProduct.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/products/SelfadjointProduct.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/products/SelfadjointRank2Update.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/products/SelfadjointRank2Update.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/products/TriangularMatrixMatrix.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/products/TriangularMatrixMatrix.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/products/TriangularMatrixMatrix_BLAS.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/products/TriangularMatrixMatrix_BLAS.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/products/TriangularMatrixVector.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/products/TriangularMatrixVector.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/products/TriangularMatrixVector_BLAS.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/products/TriangularMatrixVector_BLAS.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/products/TriangularSolverMatrix.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/products/TriangularSolverMatrix.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/products/TriangularSolverMatrix_BLAS.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/products/TriangularSolverMatrix_BLAS.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/products/TriangularSolverVector.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/products/TriangularSolverVector.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/util/BlasUtil.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/util/BlasUtil.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/util/Constants.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/util/Constants.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/util/DisableStupidWarnings.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/util/DisableStupidWarnings.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/util/ForwardDeclarations.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/util/ForwardDeclarations.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/util/MKL_support.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/util/MKL_support.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/util/Macros.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/util/Macros.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/util/Memory.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/util/Memory.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/util/Meta.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/util/Meta.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/util/NonMPL2.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/util/NonMPL2.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/util/ReenableStupidWarnings.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/util/ReenableStupidWarnings.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/util/StaticAssert.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/util/StaticAssert.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/util/XprHelper.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Core/util/XprHelper.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Eigenvalues/ComplexEigenSolver.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Eigenvalues/ComplexEigenSolver.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Eigenvalues/ComplexSchur.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Eigenvalues/ComplexSchur.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Eigenvalues/ComplexSchur_LAPACKE.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Eigenvalues/ComplexSchur_LAPACKE.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Eigenvalues/EigenSolver.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Eigenvalues/EigenSolver.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Eigenvalues/GeneralizedEigenSolver.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Eigenvalues/GeneralizedEigenSolver.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Eigenvalues/HessenbergDecomposition.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Eigenvalues/HessenbergDecomposition.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Eigenvalues/RealQZ.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Eigenvalues/RealQZ.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Eigenvalues/RealSchur.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Eigenvalues/RealSchur.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Eigenvalues/RealSchur_LAPACKE.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Eigenvalues/RealSchur_LAPACKE.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Eigenvalues/SelfAdjointEigenSolver_LAPACKE.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Eigenvalues/SelfAdjointEigenSolver_LAPACKE.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Eigenvalues/Tridiagonalization.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Eigenvalues/Tridiagonalization.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Geometry/AlignedBox.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Geometry/AlignedBox.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Geometry/AngleAxis.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Geometry/AngleAxis.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Geometry/EulerAngles.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Geometry/EulerAngles.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Geometry/Homogeneous.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Geometry/Homogeneous.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Geometry/Hyperplane.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Geometry/Hyperplane.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Geometry/OrthoMethods.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Geometry/OrthoMethods.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Geometry/ParametrizedLine.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Geometry/ParametrizedLine.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Geometry/Quaternion.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Geometry/Quaternion.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Geometry/Rotation2D.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Geometry/Rotation2D.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Geometry/RotationBase.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Geometry/RotationBase.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Geometry/Scaling.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Geometry/Scaling.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Geometry/Transform.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Geometry/Transform.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Geometry/Translation.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Geometry/Translation.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Geometry/Umeyama.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Geometry/Umeyama.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Geometry/arch/Geometry_SSE.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Geometry/arch/Geometry_SSE.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Householder/BlockHouseholder.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Householder/BlockHouseholder.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Householder/Householder.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Householder/Householder.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Householder/HouseholderSequence.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Householder/HouseholderSequence.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/IterativeLinearSolvers/LeastSquareConjugateGradient.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/IterativeLinearSolvers/LeastSquareConjugateGradient.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Jacobi/Jacobi.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/Jacobi/Jacobi.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/LU/Determinant.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/LU/Determinant.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/LU/FullPivLU.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/LU/FullPivLU.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/LU/InverseImpl.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/LU/InverseImpl.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/LU/PartialPivLU.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/LU/PartialPivLU.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/LU/PartialPivLU_LAPACKE.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/LU/PartialPivLU_LAPACKE.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/LU/arch/Inverse_SSE.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/LU/arch/Inverse_SSE.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/MetisSupport/MetisSupport.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/MetisSupport/MetisSupport.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/OrderingMethods/Amd.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/OrderingMethods/Amd.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/OrderingMethods/Eigen_Colamd.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/OrderingMethods/Eigen_Colamd.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/OrderingMethods/Ordering.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/OrderingMethods/Ordering.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/PaStiXSupport/PaStiXSupport.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/PaStiXSupport/PaStiXSupport.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/PardisoSupport/PardisoSupport.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/PardisoSupport/PardisoSupport.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/QR/ColPivHouseholderQR.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/QR/ColPivHouseholderQR.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/QR/ColPivHouseholderQR_LAPACKE.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/QR/ColPivHouseholderQR_LAPACKE.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/QR/CompleteOrthogonalDecomposition.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/QR/CompleteOrthogonalDecomposition.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/QR/FullPivHouseholderQR.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/QR/FullPivHouseholderQR.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/QR/HouseholderQR.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/QR/HouseholderQR.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/QR/HouseholderQR_LAPACKE.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/QR/HouseholderQR_LAPACKE.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SVD/BDCSVD.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SVD/BDCSVD.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SVD/JacobiSVD.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SVD/JacobiSVD.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SVD/JacobiSVD_LAPACKE.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SVD/JacobiSVD_LAPACKE.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SVD/SVDBase.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SVD/SVDBase.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SVD/UpperBidiagonalization.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SVD/UpperBidiagonalization.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCholesky/SimplicialCholesky.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCholesky/SimplicialCholesky.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/AmbiVector.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/AmbiVector.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/CompressedStorage.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/CompressedStorage.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/MappedSparseMatrix.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/MappedSparseMatrix.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/SparseAssign.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/SparseAssign.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/SparseBlock.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/SparseBlock.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/SparseColEtree.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/SparseColEtree.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/SparseCompressedBase.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/SparseCompressedBase.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/SparseCwiseBinaryOp.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/SparseCwiseBinaryOp.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/SparseCwiseUnaryOp.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/SparseCwiseUnaryOp.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/SparseDenseProduct.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/SparseDenseProduct.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/SparseDiagonalProduct.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/SparseDiagonalProduct.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/SparseDot.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/SparseDot.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/SparseFuzzy.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/SparseFuzzy.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/SparseMap.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/SparseMap.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/SparseMatrix.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/SparseMatrix.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/SparseMatrixBase.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/SparseMatrixBase.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/SparsePermutation.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/SparsePermutation.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/SparseProduct.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/SparseProduct.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/SparseRedux.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/SparseRedux.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/SparseRef.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/SparseRef.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/SparseSelfAdjointView.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/SparseSelfAdjointView.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/SparseSolverBase.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/SparseSolverBase.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/SparseSparseProductWithPruning.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/SparseSparseProductWithPruning.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/SparseTranspose.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/SparseTranspose.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/SparseTriangularView.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/SparseTriangularView.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/SparseUtil.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/SparseUtil.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/SparseVector.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/SparseVector.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/SparseView.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/SparseView.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/TriangularSolver.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseCore/TriangularSolver.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseLU/SparseLU.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseLU/SparseLU.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseLU/SparseLUImpl.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseLU/SparseLUImpl.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseLU/SparseLU_Memory.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseLU/SparseLU_Memory.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseLU/SparseLU_Structs.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseLU/SparseLU_Structs.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseLU/SparseLU_Utils.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseLU/SparseLU_Utils.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseLU/SparseLU_column_bmod.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseLU/SparseLU_column_bmod.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseLU/SparseLU_column_dfs.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseLU/SparseLU_column_dfs.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseLU/SparseLU_copy_to_ucol.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseLU/SparseLU_copy_to_ucol.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseLU/SparseLU_gemm_kernel.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseLU/SparseLU_gemm_kernel.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseLU/SparseLU_heap_relax_snode.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseLU/SparseLU_heap_relax_snode.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseLU/SparseLU_kernel_bmod.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseLU/SparseLU_kernel_bmod.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseLU/SparseLU_panel_bmod.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseLU/SparseLU_panel_bmod.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseLU/SparseLU_panel_dfs.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseLU/SparseLU_panel_dfs.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseLU/SparseLU_pivotL.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseLU/SparseLU_pivotL.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseLU/SparseLU_pruneL.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseLU/SparseLU_pruneL.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseLU/SparseLU_relax_snode.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseLU/SparseLU_relax_snode.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseQR/SparseQR.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SparseQR/SparseQR.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/StlSupport/StdDeque.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/StlSupport/StdDeque.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/StlSupport/StdList.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/StlSupport/StdList.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/StlSupport/StdVector.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/StlSupport/StdVector.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/StlSupport/details.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/StlSupport/details.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SuperLUSupport/SuperLUSupport.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/SuperLUSupport/SuperLUSupport.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/UmfPackSupport/UmfPackSupport.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/UmfPackSupport/UmfPackSupport.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/misc/Image.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/misc/Image.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/misc/Kernel.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/misc/Kernel.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/misc/RealSvd2x2.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/misc/RealSvd2x2.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/misc/blas.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/misc/blas.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/misc/lapack.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/misc/lapack.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/misc/lapacke.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/misc/lapacke.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/misc/lapacke_mangling.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/misc/lapacke_mangling.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/plugins/ArrayCwiseBinaryOps.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/plugins/ArrayCwiseBinaryOps.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/plugins/ArrayCwiseUnaryOps.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/plugins/ArrayCwiseUnaryOps.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/plugins/BlockMethods.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/plugins/BlockMethods.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/plugins/CommonCwiseBinaryOps.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/plugins/CommonCwiseBinaryOps.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/plugins/CommonCwiseUnaryOps.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/plugins/CommonCwiseUnaryOps.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/plugins/MatrixCwiseBinaryOps.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/plugins/MatrixCwiseBinaryOps.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/plugins/MatrixCwiseUnaryOps.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/Eigen/src/plugins/MatrixCwiseUnaryOps.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/signature_of_eigen3_matrix_library b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/signature_of_eigen3_matrix_library old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/AdolcForward b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/AdolcForward old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/AlignedVector3 b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/AlignedVector3 old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/ArpackSupport b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/ArpackSupport old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/AutoDiff b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/AutoDiff old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/BVH b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/BVH old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/Tensor b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/Tensor old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/TensorSymmetry b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/TensorSymmetry old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/ThreadPool b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/ThreadPool old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/Tensor.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/Tensor.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorArgMax.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorArgMax.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorAssign.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorAssign.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorBase.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorBase.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorBroadcasting.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorBroadcasting.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorChipping.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorChipping.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorConcatenation.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorConcatenation.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorContraction.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorContraction.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorContractionBlocking.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorContractionBlocking.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorContractionCuda.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorContractionCuda.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorContractionMapper.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorContractionMapper.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorContractionThreadPool.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorContractionThreadPool.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorConversion.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorConversion.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorConvolution.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorConvolution.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorCostModel.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorCostModel.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorCustomOp.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorCustomOp.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorDevice.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorDevice.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorDeviceCuda.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorDeviceCuda.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorDeviceDefault.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorDeviceDefault.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorDeviceSycl.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorDeviceSycl.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorDeviceThreadPool.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorDeviceThreadPool.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorDimensionList.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorDimensionList.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorDimensions.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorDimensions.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorEvalTo.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorEvalTo.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorEvaluator.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorEvaluator.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorExecutor.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorExecutor.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorExpr.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorExpr.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorFFT.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorFFT.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorFixedSize.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorFixedSize.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorForcedEval.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorForcedEval.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorForwardDeclarations.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorForwardDeclarations.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorFunctors.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorFunctors.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorGenerator.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorGenerator.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorGlobalFunctions.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorGlobalFunctions.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorIO.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorIO.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorImagePatch.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorImagePatch.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorIndexList.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorIndexList.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorInflation.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorInflation.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorInitializer.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorInitializer.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorIntDiv.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorIntDiv.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorLayoutSwap.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorLayoutSwap.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorMacros.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorMacros.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorMap.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorMap.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorMeta.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorMeta.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorMorphing.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorMorphing.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorPadding.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorPadding.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorPatch.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorPatch.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorRandom.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorRandom.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorReduction.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorReduction.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorReductionCuda.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorReductionCuda.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorReductionSycl.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorReductionSycl.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorRef.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorRef.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorReverse.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorReverse.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorScan.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorScan.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorShuffling.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorShuffling.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorStorage.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorStorage.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorStriding.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorStriding.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorSycl.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorSycl.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorSyclConvertToDeviceExpression.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorSyclConvertToDeviceExpression.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorSyclExprConstructor.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorSyclExprConstructor.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorSyclExtractAccessor.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorSyclExtractAccessor.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorSyclExtractFunctors.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorSyclExtractFunctors.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorSyclLeafCount.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorSyclLeafCount.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorSyclPlaceHolderExpr.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorSyclPlaceHolderExpr.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorSyclRun.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorSyclRun.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorSyclTuple.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorSyclTuple.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorTraits.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorTraits.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorUInt128.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorUInt128.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorVolumePatch.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/Tensor/TensorVolumePatch.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/TensorSymmetry/DynamicSymmetry.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/TensorSymmetry/DynamicSymmetry.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/TensorSymmetry/StaticSymmetry.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/TensorSymmetry/StaticSymmetry.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/TensorSymmetry/Symmetry.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/TensorSymmetry/Symmetry.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/TensorSymmetry/util/TemplateGroupTheory.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/TensorSymmetry/util/TemplateGroupTheory.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/ThreadPool/EventCount.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/ThreadPool/EventCount.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/ThreadPool/NonBlockingThreadPool.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/ThreadPool/NonBlockingThreadPool.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/ThreadPool/RunQueue.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/ThreadPool/RunQueue.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/ThreadPool/SimpleThreadPool.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/ThreadPool/SimpleThreadPool.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/ThreadPool/ThreadEnvironment.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/ThreadPool/ThreadEnvironment.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/ThreadPool/ThreadLocal.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/ThreadPool/ThreadLocal.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/ThreadPool/ThreadPoolInterface.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/ThreadPool/ThreadPoolInterface.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/ThreadPool/ThreadYield.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/ThreadPool/ThreadYield.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/util/CXX11Meta.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/util/CXX11Meta.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/util/CXX11Workarounds.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/util/CXX11Workarounds.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/util/EmulateArray.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/util/EmulateArray.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/util/EmulateCXX11Meta.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/util/EmulateCXX11Meta.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/util/MaxSizeVector.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/CXX11/src/util/MaxSizeVector.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/EulerAngles b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/EulerAngles old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/FFT b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/FFT old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/IterativeSolvers b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/IterativeSolvers old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/KroneckerProduct b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/KroneckerProduct old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/LevenbergMarquardt b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/LevenbergMarquardt old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/MPRealSupport b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/MPRealSupport old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/MatrixFunctions b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/MatrixFunctions old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/MoreVectorization b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/MoreVectorization old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/NonLinearOptimization b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/NonLinearOptimization old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/NumericalDiff b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/NumericalDiff old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/OpenGLSupport b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/OpenGLSupport old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/Polynomials b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/Polynomials old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/Skyline b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/Skyline old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/SparseExtra b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/SparseExtra old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/SpecialFunctions b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/SpecialFunctions old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/Splines b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/Splines old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/AutoDiff/AutoDiffJacobian.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/AutoDiff/AutoDiffJacobian.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/AutoDiff/AutoDiffScalar.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/AutoDiff/AutoDiffScalar.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/AutoDiff/AutoDiffVector.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/AutoDiff/AutoDiffVector.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/BVH/BVAlgorithms.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/BVH/BVAlgorithms.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/BVH/KdBVH.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/BVH/KdBVH.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/Eigenvalues/ArpackSelfAdjointEigenSolver.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/Eigenvalues/ArpackSelfAdjointEigenSolver.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/EulerAngles/EulerAngles.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/EulerAngles/EulerAngles.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/EulerAngles/EulerSystem.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/EulerAngles/EulerSystem.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/FFT/ei_fftw_impl.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/FFT/ei_fftw_impl.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/FFT/ei_kissfft_impl.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/FFT/ei_kissfft_impl.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/IterativeSolvers/ConstrainedConjGrad.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/IterativeSolvers/ConstrainedConjGrad.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/IterativeSolvers/DGMRES.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/IterativeSolvers/DGMRES.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/IterativeSolvers/GMRES.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/IterativeSolvers/GMRES.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/IterativeSolvers/IncompleteLU.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/IterativeSolvers/IncompleteLU.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/IterativeSolvers/IterationController.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/IterativeSolvers/IterationController.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/IterativeSolvers/MINRES.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/IterativeSolvers/MINRES.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/IterativeSolvers/Scaling.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/IterativeSolvers/Scaling.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/KroneckerProduct/KroneckerTensorProduct.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/KroneckerProduct/KroneckerTensorProduct.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/LevenbergMarquardt/LMcovar.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/LevenbergMarquardt/LMcovar.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/LevenbergMarquardt/LMonestep.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/LevenbergMarquardt/LMonestep.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/LevenbergMarquardt/LMpar.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/LevenbergMarquardt/LMpar.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/LevenbergMarquardt/LMqrsolv.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/LevenbergMarquardt/LMqrsolv.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/LevenbergMarquardt/LevenbergMarquardt.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/LevenbergMarquardt/LevenbergMarquardt.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/MatrixFunctions/MatrixExponential.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/MatrixFunctions/MatrixExponential.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/MatrixFunctions/MatrixFunction.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/MatrixFunctions/MatrixFunction.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/MatrixFunctions/MatrixLogarithm.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/MatrixFunctions/MatrixLogarithm.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/MatrixFunctions/MatrixPower.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/MatrixFunctions/MatrixPower.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/MatrixFunctions/MatrixSquareRoot.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/MatrixFunctions/MatrixSquareRoot.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/MatrixFunctions/StemFunction.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/MatrixFunctions/StemFunction.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/MoreVectorization/MathFunctions.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/MoreVectorization/MathFunctions.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/NonLinearOptimization/HybridNonLinearSolver.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/NonLinearOptimization/HybridNonLinearSolver.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/NonLinearOptimization/LevenbergMarquardt.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/NonLinearOptimization/LevenbergMarquardt.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/NonLinearOptimization/chkder.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/NonLinearOptimization/chkder.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/NonLinearOptimization/covar.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/NonLinearOptimization/covar.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/NonLinearOptimization/dogleg.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/NonLinearOptimization/dogleg.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/NonLinearOptimization/fdjac1.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/NonLinearOptimization/fdjac1.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/NonLinearOptimization/lmpar.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/NonLinearOptimization/lmpar.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/NonLinearOptimization/qrsolv.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/NonLinearOptimization/qrsolv.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/NonLinearOptimization/r1mpyq.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/NonLinearOptimization/r1mpyq.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/NonLinearOptimization/r1updt.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/NonLinearOptimization/r1updt.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/NonLinearOptimization/rwupdt.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/NonLinearOptimization/rwupdt.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/NumericalDiff/NumericalDiff.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/NumericalDiff/NumericalDiff.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/Polynomials/Companion.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/Polynomials/Companion.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/Polynomials/PolynomialSolver.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/Polynomials/PolynomialSolver.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/Polynomials/PolynomialUtils.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/Polynomials/PolynomialUtils.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/Skyline/SkylineInplaceLU.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/Skyline/SkylineInplaceLU.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/Skyline/SkylineMatrix.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/Skyline/SkylineMatrix.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/Skyline/SkylineMatrixBase.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/Skyline/SkylineMatrixBase.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/Skyline/SkylineProduct.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/Skyline/SkylineProduct.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/Skyline/SkylineStorage.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/Skyline/SkylineStorage.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/Skyline/SkylineUtil.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/Skyline/SkylineUtil.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/SparseExtra/BlockOfDynamicSparseMatrix.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/SparseExtra/BlockOfDynamicSparseMatrix.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/SparseExtra/BlockSparseMatrix.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/SparseExtra/BlockSparseMatrix.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/SparseExtra/DynamicSparseMatrix.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/SparseExtra/DynamicSparseMatrix.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/SparseExtra/MarketIO.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/SparseExtra/MarketIO.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/SparseExtra/MatrixMarketIterator.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/SparseExtra/MatrixMarketIterator.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/SparseExtra/RandomSetter.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/SparseExtra/RandomSetter.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/SpecialFunctions/SpecialFunctionsArrayAPI.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/SpecialFunctions/SpecialFunctionsArrayAPI.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/SpecialFunctions/SpecialFunctionsFunctors.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/SpecialFunctions/SpecialFunctionsFunctors.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/SpecialFunctions/SpecialFunctionsHalf.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/SpecialFunctions/SpecialFunctionsHalf.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/SpecialFunctions/SpecialFunctionsImpl.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/SpecialFunctions/SpecialFunctionsImpl.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/SpecialFunctions/SpecialFunctionsPacketMath.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/SpecialFunctions/SpecialFunctionsPacketMath.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/SpecialFunctions/arch/CUDA/CudaSpecialFunctions.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/SpecialFunctions/arch/CUDA/CudaSpecialFunctions.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/Splines/Spline.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/Splines/Spline.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/Splines/SplineFitting.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/Splines/SplineFitting.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/Splines/SplineFwd.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/eigen3/unsupported/Eigen/src/Splines/SplineFwd.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/extract.cc b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/extract.cc old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/face_detection.cc b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/face_detection.cc old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/face_detection.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/face_detection.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/face_pose.cc b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/face_pose.cc old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/face_pose.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/face_pose.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/face_recognition.cc b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/face_recognition.cc old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/face_recognition.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/face_recognition.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/falldown_detect.cc b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/falldown_detect.cc old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/falldown_detect.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/falldown_detect.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/json/json-forwards.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/json/json-forwards.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/json/json.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/json/json.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/jsoncpp.cc b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/jsoncpp.cc old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/kalmanFilter.cc b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/kalmanFilter.cc old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/kalmanFilter.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/kalmanFilter.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/lapjv.cc b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/lapjv.cc old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/lapjv.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/lapjv.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/main.cc b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/main.cc old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/person_detect.cc b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/person_detect.cc old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/person_detect.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/person_detect.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/allocators.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/allocators.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/cursorstreamwrapper.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/cursorstreamwrapper.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/document.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/document.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/encodedstream.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/encodedstream.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/encodings.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/encodings.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/error/en.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/error/en.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/error/error.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/error/error.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/filereadstream.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/filereadstream.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/filewritestream.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/filewritestream.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/fwd.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/fwd.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/internal/biginteger.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/internal/biginteger.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/internal/clzll.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/internal/clzll.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/internal/diyfp.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/internal/diyfp.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/internal/dtoa.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/internal/dtoa.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/internal/ieee754.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/internal/ieee754.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/internal/itoa.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/internal/itoa.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/internal/meta.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/internal/meta.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/internal/pow10.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/internal/pow10.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/internal/regex.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/internal/regex.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/internal/stack.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/internal/stack.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/internal/strfunc.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/internal/strfunc.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/internal/strtod.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/internal/strtod.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/internal/swap.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/internal/swap.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/istreamwrapper.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/istreamwrapper.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/memorybuffer.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/memorybuffer.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/memorystream.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/memorystream.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/msinttypes/inttypes.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/msinttypes/inttypes.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/msinttypes/stdint.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/msinttypes/stdint.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/ostreamwrapper.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/ostreamwrapper.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/pointer.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/pointer.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/prettywriter.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/prettywriter.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/rapidjson.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/rapidjson.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/reader.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/reader.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/schema.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/schema.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/stream.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/stream.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/stringbuffer.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/stringbuffer.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/uri.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/uri.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/writer.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/rapidjson/writer.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/scoped_timing.hpp b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/scoped_timing.hpp old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/utils.cc b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/utils.cc old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/utils.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/utils.h old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/vi_vo.h b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/vi_vo.h old mode 100644 new mode 100755 index a3b1d8588..15f0bc111 --- a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/vi_vo.h +++ b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_ai/housekeeper/vi_vo.h @@ -57,7 +57,7 @@ #include "k_autoconf_comm.h" -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) #define SENSOR_CHANNEL (3) // isp通道数 #define SENSOR_HEIGHT (720) // isp高度,ai输入,竖屏 #define SENSOR_WIDTH (1280) // isp宽度,ai输入,竖屏 @@ -286,7 +286,7 @@ static k_s32 sample_connector_init(void) { k_u32 ret = 0; k_s32 connector_fd; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) k_connector_type connector_type = LT9611_MIPI_4LAN_1920X1080_30FPS;// HX8377_V2_MIPI_4LAN_1080X1920_30FPS; #else k_connector_type connector_type = HX8377_V2_MIPI_4LAN_1080X1920_30FPS; @@ -378,7 +378,8 @@ int vivcap_start() #if defined(CONFIG_BOARD_K230_CANMV) sensor_type = OV_OV5647_MIPI_CSI0_1920X1080_30FPS_10BIT_LINEAR; - kd_mpi_vicap_set_mclk(VICAP_MCLK0, VICAP_PLL0_CLK_DIV4, 16, 1); +#elif defined(CONFIG_BOARD_K230_CANMV_V2) + sensor_type = OV_OV5647_MIPI_CSI2_1920X1080_30FPS_10BIT_LINEAR_V2; #else sensor_type = IMX335_MIPI_2LANE_RAW12_2592X1944_30FPS_LINEAR; #endif @@ -444,7 +445,7 @@ int vivcap_start() memset(&dev_attr, 0, sizeof(k_vicap_dev_attr)); dev_attr.acq_win.h_start = 0; dev_attr.acq_win.v_start = 0; -#if defined (CONFIG_BOARD_K230_CANMV) +#if defined (CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) dev_attr.acq_win.width = ISP_CHN0_WIDTH; dev_attr.acq_win.height = ISP_CHN0_HEIGHT; #else @@ -476,7 +477,7 @@ int vivcap_start() chn_attr.out_win.height = ISP_CHN0_HEIGHT; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) || defined(CONFIG_BOARD_K230_CANMV_V2) chn_attr.crop_win = dev_attr.acq_win; #else // chn_attr.crop_win = dev_attr.acq_win; @@ -522,7 +523,7 @@ int vivcap_start() chn_attr.out_win.height = SENSOR_HEIGHT; // chn_attr.crop_win = dev_attr.acq_win; -#if defined(CONFIG_BOARD_K230_CANMV) +#if defined(CONFIG_BOARD_K230_CANMV) chn_attr.crop_win = dev_attr.acq_win; #else chn_attr.crop_win.h_start = 768; @@ -624,5 +625,4 @@ void yuv_rotate_90(char *des, char *src,int width,int height) } } -} - +} \ No newline at end of file diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_comm/main.cc b/src/reference/fancy_poc/housekeeper/src/housekeeper_client/housekeeper_comm/main.cc old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_server/.idea/.gitignore b/src/reference/fancy_poc/housekeeper/src/housekeeper_server/.idea/.gitignore old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_server/.idea/deployment.xml b/src/reference/fancy_poc/housekeeper/src/housekeeper_server/.idea/deployment.xml old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_server/.idea/housekeeper_server.iml b/src/reference/fancy_poc/housekeeper/src/housekeeper_server/.idea/housekeeper_server.iml old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_server/.idea/inspectionProfiles/Project_Default.xml b/src/reference/fancy_poc/housekeeper/src/housekeeper_server/.idea/inspectionProfiles/Project_Default.xml old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_server/.idea/inspectionProfiles/profiles_settings.xml b/src/reference/fancy_poc/housekeeper/src/housekeeper_server/.idea/inspectionProfiles/profiles_settings.xml old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_server/.idea/misc.xml b/src/reference/fancy_poc/housekeeper/src/housekeeper_server/.idea/misc.xml old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_server/.idea/modules.xml b/src/reference/fancy_poc/housekeeper/src/housekeeper_server/.idea/modules.xml old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_server/.idea/vcs.xml b/src/reference/fancy_poc/housekeeper/src/housekeeper_server/.idea/vcs.xml old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_server/app.py b/src/reference/fancy_poc/housekeeper/src/housekeeper_server/app.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_server/audio_file/reminder1_nihao.mp3 b/src/reference/fancy_poc/housekeeper/src/housekeeper_server/audio_file/reminder1_nihao.mp3 old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_server/audio_file/reminder2.mp3 b/src/reference/fancy_poc/housekeeper/src/housekeeper_server/audio_file/reminder2.mp3 old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_server/audio_file/reminder3.mp3 b/src/reference/fancy_poc/housekeeper/src/housekeeper_server/audio_file/reminder3.mp3 old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_server/bot/bot.py b/src/reference/fancy_poc/housekeeper/src/housekeeper_server/bot/bot.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_server/bot/bot_factory.py b/src/reference/fancy_poc/housekeeper/src/housekeeper_server/bot/bot_factory.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_server/bot/llm_stream.py b/src/reference/fancy_poc/housekeeper/src/housekeeper_server/bot/llm_stream.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_server/bridge/bridge.py b/src/reference/fancy_poc/housekeeper/src/housekeeper_server/bridge/bridge.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_server/channel/Client_Server/Client_Server_K230.py b/src/reference/fancy_poc/housekeeper/src/housekeeper_server/channel/Client_Server/Client_Server_K230.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_server/channel/__init__.py b/src/reference/fancy_poc/housekeeper/src/housekeeper_server/channel/__init__.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_server/channel/channel.py b/src/reference/fancy_poc/housekeeper/src/housekeeper_server/channel/channel.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_server/channel/channel_factory.py b/src/reference/fancy_poc/housekeeper/src/housekeeper_server/channel/channel_factory.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_server/common/expired_dict.py b/src/reference/fancy_poc/housekeeper/src/housekeeper_server/common/expired_dict.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_server/common/log.py b/src/reference/fancy_poc/housekeeper/src/housekeeper_server/common/log.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_server/config.json b/src/reference/fancy_poc/housekeeper/src/housekeeper_server/config.json old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_server/requirements.txt b/src/reference/fancy_poc/housekeeper/src/housekeeper_server/requirements.txt old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_server/structured_json/history.json b/src/reference/fancy_poc/housekeeper/src/housekeeper_server/structured_json/history.json old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_server/structured_json/j_action command.json b/src/reference/fancy_poc/housekeeper/src/housekeeper_server/structured_json/j_action command.json old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_server/structured_json/j_static_environment.json b/src/reference/fancy_poc/housekeeper/src/housekeeper_server/structured_json/j_static_environment.json old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_server/tasks/__init__.py b/src/reference/fancy_poc/housekeeper/src/housekeeper_server/tasks/__init__.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_server/tasks/voice_reminder_client.py b/src/reference/fancy_poc/housekeeper/src/housekeeper_server/tasks/voice_reminder_client.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_server/utils/__init__.py b/src/reference/fancy_poc/housekeeper/src/housekeeper_server/utils/__init__.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_server/utils/config.py b/src/reference/fancy_poc/housekeeper/src/housekeeper_server/utils/config.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/housekeeper_server/utils/integrate_json.py b/src/reference/fancy_poc/housekeeper/src/housekeeper_server/utils/integrate_json.py old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/utils/config.json b/src/reference/fancy_poc/housekeeper/src/utils/config.json old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/utils/connect.sh b/src/reference/fancy_poc/housekeeper/src/utils/connect.sh old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/utils/face_registration.sh b/src/reference/fancy_poc/housekeeper/src/utils/face_registration.sh old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/housekeeper/src/utils/housekeeper.sh b/src/reference/fancy_poc/housekeeper/src/utils/housekeeper.sh old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/meta_hand/README.md b/src/reference/fancy_poc/meta_hand/README.md old mode 100644 new mode 100755 index 2c76b194c..6a9bfcd73 --- a/src/reference/fancy_poc/meta_hand/README.md +++ b/src/reference/fancy_poc/meta_hand/README.md @@ -62,12 +62,13 @@ Document version: V1.4 Release date: 2024-1-31 ### 2. K230客户端 cd /sharefs/meta_hand - #小核下执行(./connect.sh) - ./connect 192.168.1.2 8080 10000 #大核下执行(./meta_hand_isp.sh) - ./meta_hand.elf hand_det.kmodel None 0.15 0.4 handkp_det.kmodel e3d.kmodel 10000 0 + ./meta_hand.elf hand_det.kmodel 0.15 0.4 handkp_det.kmodel e3d.kmodel 0 + #小核下执行(./connect.sh) + ./connect 192.168.1.2 8080 10000000 -**注意:** 使用./connect.sh命令时需要在connect.sh中配置相应的通讯端口及ip、buffer_size。buffer_size表示k230大核运行最多保存的bin文件个数。 +**注意:** 先启动大核命令,在大核命令启动后会打印大小核通信的地址。如下图。使用./connect.sh命令时需要在connect.sh中配置相应的通讯端口及ip,以及大小核通信地址。退出时,k230大核按'q'->'enter'退出,k230小核按'q'->'enter'退出,pc服务端直接关掉即可。 +![meta_hand](./resource/address.jpg) ## 结果展示 ### 服务器端渲染效果 diff --git a/src/reference/fancy_poc/meta_hand/resource/address.jpg b/src/reference/fancy_poc/meta_hand/resource/address.jpg new file mode 100644 index 000000000..29226cdcb Binary files /dev/null and b/src/reference/fancy_poc/meta_hand/resource/address.jpg differ diff --git a/src/reference/fancy_poc/meta_hand/resource/image.png b/src/reference/fancy_poc/meta_hand/resource/image.png old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/meta_hand/resource/meta_hand.gif b/src/reference/fancy_poc/meta_hand/resource/meta_hand.gif old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/meta_hand/resource/meta_hand.jpg b/src/reference/fancy_poc/meta_hand/resource/meta_hand.jpg old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/meta_hand/src/download.sh b/src/reference/fancy_poc/meta_hand/src/download.sh old mode 100644 new mode 100755 diff --git a/src/reference/fancy_poc/meta_hand/src/http/CMakeLists.txt b/src/reference/fancy_poc/meta_hand/src/http/CMakeLists.txt new file mode 100755 index 000000000..1c323af95 --- /dev/null +++ b/src/reference/fancy_poc/meta_hand/src/http/CMakeLists.txt @@ -0,0 +1,27 @@ +cmake_minimum_required(VERSION 3.2) +include(./cmake/Riscv64.cmake) + +project(http C CXX) + +set(nncase_sdk_root "${PROJECT_SOURCE_DIR}/../../../../../big/nncase") +set(k230_sdk ${nncase_sdk_root}/../../../) +set(http_root "${PROJECT_SOURCE_DIR}/http") +set(CMAKE_INSTALL_PREFIX "${PROJECT_SOURCE_DIR}/../../../" CACHE STRING "The path to use for make install" FORCE) +set(CMAKE_INSTALL_PREFIX "../../../") +file(GLOB APP_SOURCES ${http_root}/*.c) + +set(BIN connect) + +include_directories(${k230_sdk}/src/big/mpp/userapps/api/) +include_directories(${k230_sdk}/src/big/mpp/include) +include_directories(${k230_sdk}/src/big/mpp/include/comm) +include_directories(${PROJECT_SOURCE_DIR}/include) +include_directories(${PROJECT_SOURCE_DIR}/http) + +link_directories(${PROJECT_SOURCE_DIR}/slave/lib) +link_directories(${k230_sdk}/src/big/mpp/userapps/lib) + +add_executable(${BIN} ${APP_SOURCES}) +target_link_libraries(${BIN} -Wl,--start-group datafifo pthread sys -Wl,--end-group) + +install(TARGETS ${BIN} DESTINATION ${PROJECT_SOURCE_DIR}/out) \ No newline at end of file diff --git a/src/reference/fancy_poc/meta_hand/src/http/build_app.sh b/src/reference/fancy_poc/meta_hand/src/http/build_app.sh new file mode 100755 index 000000000..52eab831f --- /dev/null +++ b/src/reference/fancy_poc/meta_hand/src/http/build_app.sh @@ -0,0 +1,17 @@ +#!/bin/bash +set -x + +# set cross build toolchain +export PATH=$PATH:/opt/toolchain/Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.6.0/bin + +clear +rm -rf out +mkdir out +pushd out +cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=`pwd` \ + -DCMAKE_TOOLCHAIN_FILE=cmake/Riscv64.cmake \ + .. + +make -j && make install +popd \ No newline at end of file diff --git a/src/reference/fancy_poc/meta_hand/src/http/cmake/Riscv64.cmake b/src/reference/fancy_poc/meta_hand/src/http/cmake/Riscv64.cmake new file mode 100755 index 000000000..8f254b538 --- /dev/null +++ b/src/reference/fancy_poc/meta_hand/src/http/cmake/Riscv64.cmake @@ -0,0 +1,18 @@ +include(CMakeForceCompiler) + +# target system +set(CMAKE_SYSTEM_NAME Generic) +set(CMAKE_SYSTEM_PROCESSOR riscv64) + +# cross compiler +set(CMAKE_C_COMPILER riscv64-unknown-linux-gnu-gcc) +set(CMAKE_CXX_COMPILER riscv64-unknown-linux-gnu-g++) + +set(CMAKE_C_FLAGS_DEBUG "-O0 -g3") +set(CMAKE_C_FLAGS_RELEASE "-O2 -s") +set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g3") +set(CMAKE_CXX_FLAGS_RELEASE "-O2 -s") +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp") + +# set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=rv64imafdcv -mabi=lp64d -mcmodel=medany") +# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=rv64imafdcv -mabi=lp64d -mcmodel=medany") diff --git a/src/reference/fancy_poc/meta_hand/src/http/http/main.c b/src/reference/fancy_poc/meta_hand/src/http/http/main.c new file mode 100755 index 000000000..ab7578c3d --- /dev/null +++ b/src/reference/fancy_poc/meta_hand/src/http/http/main.c @@ -0,0 +1,241 @@ +/* Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include "k_datafifo.h" + +#define READER_INDEX 0 +#define WRITER_INDEX 1 + +static k_s32 g_s32Index = 0; +static const k_s32 BLOCK_LEN = 252; +static k_datafifo_handle hDataFifo[2] = {K_DATAFIFO_INVALID_HANDLE, K_DATAFIFO_INVALID_HANDLE}; + +static void release(void* pStream) +{ + printf("release %p\n", pStream); +} + +int datafifo_init(k_u64 reader_phyAddr, k_u64 writer_phyAddr) +{ + k_s32 s32Ret = K_SUCCESS; + k_datafifo_params_s params_reader = {10, BLOCK_LEN, K_TRUE, DATAFIFO_READER}; + + s32Ret = kd_datafifo_open_by_addr(&hDataFifo[READER_INDEX], ¶ms_reader, reader_phyAddr); + if (K_SUCCESS != s32Ret) + { + printf("open datafifo error:%x\n", s32Ret); + return -1; + } + + printf("datafifo_init finish\n"); + + return 0; +} + +static k_bool s_bStop = K_FALSE; + + +struct ThreadArgs { + const char *server_ip; + int server_port; +}; + +void* read_more(void* args) +{ + // 将参数结构体转换回原始类型 + struct ThreadArgs *threadArgs = (struct ThreadArgs *)args; + + // 使用传递过来的参数 + const char *server_ip = threadArgs->server_ip; + int server_port = threadArgs->server_port; + + int sock = socket(AF_INET, SOCK_STREAM, 0); + if (sock == -1) { + return 1; + } + struct sockaddr_in server_addr; + server_addr.sin_family = AF_INET; + server_addr.sin_addr.s_addr = inet_addr(server_ip); + server_addr.sin_port = htons(server_port); + + int isConnect = -1; + while(K_FALSE == s_bStop & isConnect < 0) + { + isConnect = connect(sock, (struct sockaddr *)&server_addr, sizeof(server_addr)); + } + + if(isConnect >= 0) + { + printf("connect success\n"); + } + + clock_t start, finish; + double Total_time; + + k_u32 readLen = 0; + k_char* pBuf; + k_s32 s32Ret = K_SUCCESS; + + int data_size = 252; + int block_size = 256; + while (K_FALSE == s_bStop) + { + readLen = 0; + s32Ret = kd_datafifo_cmd(hDataFifo[READER_INDEX], DATAFIFO_CMD_GET_AVAIL_READ_LEN, &readLen); + if (K_SUCCESS != s32Ret) + { + printf("get available read len error:%x\n", s32Ret); + break; + } + + if (readLen > 0) + { + s32Ret = kd_datafifo_read(hDataFifo[READER_INDEX], (void**)&pBuf); + if (K_SUCCESS != s32Ret) + { + printf("read error:%x\n", s32Ret); + break; + } + s32Ret = kd_datafifo_cmd(hDataFifo[READER_INDEX], DATAFIFO_CMD_READ_DONE, pBuf); + if (K_SUCCESS != s32Ret) + { + printf("read done error:%x\n", s32Ret); + break; + } + + const char *data = (const char*)pBuf; + int sent_bytes = 0; + + start = clock(); + while ((K_FALSE == s_bStop) && (sent_bytes < data_size)) + { + usleep(500); + int bytes_to_send; + if(block_size < data_size - sent_bytes) + { + bytes_to_send = block_size; + } + else + { + bytes_to_send = data_size - sent_bytes; + } + int bytes_sent = send(sock, data + sent_bytes, bytes_to_send, 0); + if (bytes_sent < 0) { + return 1; + } + sent_bytes += bytes_sent; + } + finish = clock(); + Total_time = (double)(finish - start) / CLOCKS_PER_SEC * 1000; //单位换算成毫秒 + printf("%f ms\n", Total_time); + } + } + close(sock); + + free(threadArgs); + + return NULL; +} + +void datafifo_deinit() +{ + k_s32 s32Ret = K_SUCCESS; + if (K_SUCCESS != s32Ret) + { + printf("write error:%x\n", s32Ret); + } + + kd_datafifo_close(hDataFifo[READER_INDEX]); + + printf("datafifo_deinit finish\n"); +} + +int main(int argc, char** argv) +{ + if (argc != 4) { + printf(stderr, "Usage: %s \n", argv[0]); + return 1; + } + + const char *server_ip = argv[1]; + int server_port = atoi(argv[2]); + + // 创建结构体来存储参数 + struct ThreadArgs *args = (struct ThreadArgs *)malloc(sizeof(struct ThreadArgs)); + if (args == NULL) { + fprintf(stderr, "Failed to allocate memory\n"); + return 1; + } + + // 将参数填充到结构体中 + args->server_ip = server_ip; + args->server_port = server_port; + + k_s32 s32Ret = K_SUCCESS; + k_char cmd[64]; + pthread_t readThread = -1; + + k_u64 phyAddr[2]; + sscanf(argv[3], "%lx", &phyAddr[READER_INDEX]); + sscanf(argv[3], "%lx", &phyAddr[WRITER_INDEX]); + s32Ret = datafifo_init(phyAddr[READER_INDEX], phyAddr[WRITER_INDEX]); + + if (s32Ret != 0) + { + return s32Ret; + } + + s_bStop = K_FALSE; + pthread_create(&readThread, NULL, read_more, (void *)args); + + do + { + printf("Input q to exit!\n"); + } + while ( 0 != strncmp(fgets(cmd, 64, stdin), "q", 1) ); + + s_bStop = K_TRUE; + + if (-1 != readThread) + { + pthread_join(readThread, NULL); + } + + datafifo_deinit(); + + return 0; +} + + diff --git a/src/reference/fancy_poc/meta_hand/src/http/include/k_datafifo.h b/src/reference/fancy_poc/meta_hand/src/http/include/k_datafifo.h new file mode 100755 index 000000000..79f2aeddb --- /dev/null +++ b/src/reference/fancy_poc/meta_hand/src/http/include/k_datafifo.h @@ -0,0 +1,167 @@ +/** + * @file k_datafifo.h + * @author () + * @brief + * @version 1.0 + * @date 2023-06-12 + * + * @copyright + * Copyright (c) 2023, Canaan Bright Sight Co., Ltd + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef __K_DATAFIFO_H__ +#define __K_DATAFIFO_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "k_type.h" + +/** \addtogroup DATAFIFO*/ +/** @{ */ /**